Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorNick Samarin <nicks1987@bigmir.net>2011-02-16 20:07:18 +0300
committerNick Samarin <nicks1987@bigmir.net>2011-02-16 20:07:18 +0300
commitc5f6a01dd5998976addd2085470bb73a150579e5 (patch)
tree42b3345fb3ea2e7607a6d1eec379b8ce23b5ffbc /source
parent4cf62f1e7e2bb28b47f79e4bd7c1482ab742ebbd (diff)
parent9e9e028f059f29d493dc020dda965a9bea8ffd6b (diff)
synched with trunk at revision 34793
Diffstat (limited to 'source')
-rw-r--r--source/CMakeLists.txt18
-rw-r--r--source/Makefile631
-rw-r--r--source/SConscript7
-rw-r--r--source/blender/CMakeLists.txt70
-rw-r--r--source/blender/Makefile56
-rw-r--r--source/blender/avi/AVI_avi.h4
-rw-r--r--source/blender/avi/CMakeLists.txt25
-rw-r--r--source/blender/avi/Makefile34
-rw-r--r--source/blender/avi/intern/Makefile51
-rw-r--r--source/blender/avi/intern/avi.c42
-rw-r--r--source/blender/avi/intern/avirgb.c4
-rw-r--r--source/blender/avi/intern/endian.c2
-rw-r--r--source/blender/avi/intern/mjpeg.c11
-rw-r--r--source/blender/avi/intern/options.c2
-rw-r--r--source/blender/avi/intern/rgb32.c4
-rw-r--r--source/blender/blenfont/BLF_api.h52
-rw-r--r--source/blender/blenfont/BLF_types.h0
-rw-r--r--source/blender/blenfont/CMakeLists.txt33
-rw-r--r--source/blender/blenfont/Makefile34
-rw-r--r--source/blender/blenfont/intern/Makefile74
-rw-r--r--source/blender/blenfont/intern/blf.c173
-rw-r--r--source/blender/blenfont/intern/blf_dir.c4
-rw-r--r--source/blender/blenfont/intern/blf_font.c119
-rw-r--r--source/blender/blenfont/intern/blf_glyph.c50
-rw-r--r--source/blender/blenfont/intern/blf_internal.h20
-rw-r--r--source/blender/blenfont/intern/blf_internal_types.h11
-rw-r--r--source/blender/blenfont/intern/blf_lang.c6
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h14
-rw-r--r--source/blender/blenkernel/BKE_action.h2
-rw-r--r--source/blender/blenkernel/BKE_animsys.h17
-rw-r--r--source/blender/blenkernel/BKE_armature.h10
-rw-r--r--source/blender/blenkernel/BKE_array_mallocn.h82
-rw-r--r--source/blender/blenkernel/BKE_blender.h16
-rw-r--r--source/blender/blenkernel/BKE_bmesh.h1
-rw-r--r--source/blender/blenkernel/BKE_brush.h5
-rw-r--r--source/blender/blenkernel/BKE_bvhutils.h1
-rw-r--r--source/blender/blenkernel/BKE_cloth.h6
-rw-r--r--source/blender/blenkernel/BKE_collision.h2
-rw-r--r--source/blender/blenkernel/BKE_context.h19
-rw-r--r--source/blender/blenkernel/BKE_curve.h7
-rw-r--r--source/blender/blenkernel/BKE_customdata.h17
-rw-r--r--source/blender/blenkernel/BKE_deform.h6
-rw-r--r--source/blender/blenkernel/BKE_depsgraph.h27
-rw-r--r--source/blender/blenkernel/BKE_exotic.h9
-rw-r--r--source/blender/blenkernel/BKE_fcurve.h22
-rw-r--r--source/blender/blenkernel/BKE_font.h2
-rw-r--r--source/blender/blenkernel/BKE_global.h21
-rw-r--r--source/blender/blenkernel/BKE_gpencil.h2
-rw-r--r--source/blender/blenkernel/BKE_group.h2
-rw-r--r--source/blender/blenkernel/BKE_icons.h4
-rw-r--r--source/blender/blenkernel/BKE_idprop.h8
-rw-r--r--source/blender/blenkernel/BKE_image.h13
-rw-r--r--source/blender/blenkernel/BKE_ipo.h4
-rw-r--r--source/blender/blenkernel/BKE_key.h4
-rw-r--r--source/blender/blenkernel/BKE_lattice.h2
-rw-r--r--source/blender/blenkernel/BKE_library.h28
-rw-r--r--source/blender/blenkernel/BKE_main.h11
-rw-r--r--source/blender/blenkernel/BKE_material.h4
-rw-r--r--source/blender/blenkernel/BKE_mball.h7
-rw-r--r--source/blender/blenkernel/BKE_mesh.h20
-rw-r--r--source/blender/blenkernel/BKE_modifier.h25
-rw-r--r--source/blender/blenkernel/BKE_multires.h24
-rw-r--r--source/blender/blenkernel/BKE_node.h27
-rw-r--r--source/blender/blenkernel/BKE_object.h15
-rw-r--r--source/blender/blenkernel/BKE_packedFile.h8
-rw-r--r--source/blender/blenkernel/BKE_paint.h9
-rw-r--r--source/blender/blenkernel/BKE_particle.h11
-rw-r--r--source/blender/blenkernel/BKE_pointcache.h66
-rw-r--r--source/blender/blenkernel/BKE_property.h2
-rw-r--r--source/blender/blenkernel/BKE_report.h6
-rw-r--r--source/blender/blenkernel/BKE_sca.h6
-rw-r--r--source/blender/blenkernel/BKE_scene.h19
-rw-r--r--source/blender/blenkernel/BKE_sequencer.h113
-rw-r--r--source/blender/blenkernel/BKE_shrinkwrap.h4
-rw-r--r--source/blender/blenkernel/BKE_sketch.h4
-rw-r--r--source/blender/blenkernel/BKE_smoke.h2
-rw-r--r--source/blender/blenkernel/BKE_sound.h8
-rw-r--r--source/blender/blenkernel/BKE_subsurf.h1
-rw-r--r--source/blender/blenkernel/BKE_suggestions.h18
-rw-r--r--source/blender/blenkernel/BKE_text.h8
-rw-r--r--source/blender/blenkernel/BKE_texture.h8
-rw-r--r--source/blender/blenkernel/BKE_unit.h11
-rw-r--r--source/blender/blenkernel/BKE_utildefines.h200
-rw-r--r--source/blender/blenkernel/BKE_world.h2
-rw-r--r--source/blender/blenkernel/CMakeLists.txt299
-rw-r--r--source/blender/blenkernel/Makefile34
-rw-r--r--source/blender/blenkernel/SConscript15
-rw-r--r--source/blender/blenkernel/depsgraph_private.h8
-rw-r--r--source/blender/blenkernel/intern/BME_Customdata.c2
-rw-r--r--source/blender/blenkernel/intern/BME_conversions.c4
-rw-r--r--source/blender/blenkernel/intern/BME_eulers.c2
-rw-r--r--source/blender/blenkernel/intern/BME_structure.c3
-rw-r--r--source/blender/blenkernel/intern/BME_tools.c22
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf.c23
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c242
-rw-r--r--source/blender/blenkernel/intern/Makefile156
-rw-r--r--source/blender/blenkernel/intern/action.c59
-rw-r--r--source/blender/blenkernel/intern/anim.c65
-rw-r--r--source/blender/blenkernel/intern/anim_sys.c471
-rw-r--r--source/blender/blenkernel/intern/armature.c316
-rw-r--r--source/blender/blenkernel/intern/blender.c129
-rw-r--r--source/blender/blenkernel/intern/boids.c37
-rw-r--r--source/blender/blenkernel/intern/brush.c25
-rw-r--r--source/blender/blenkernel/intern/bvhutils.c47
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c165
-rw-r--r--source/blender/blenkernel/intern/cloth.c88
-rw-r--r--source/blender/blenkernel/intern/collision.c37
-rw-r--r--source/blender/blenkernel/intern/colortools.c42
-rw-r--r--source/blender/blenkernel/intern/constraint.c271
-rw-r--r--source/blender/blenkernel/intern/context.c30
-rw-r--r--source/blender/blenkernel/intern/curve.c181
-rw-r--r--source/blender/blenkernel/intern/customdata.c373
-rw-r--r--source/blender/blenkernel/intern/customdata_file.c5
-rw-r--r--source/blender/blenkernel/intern/deform.c67
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c334
-rw-r--r--source/blender/blenkernel/intern/displist.c87
-rw-r--r--source/blender/blenkernel/intern/effect.c20
-rw-r--r--source/blender/blenkernel/intern/exotic.c101
-rw-r--r--source/blender/blenkernel/intern/fcurve.c180
-rw-r--r--source/blender/blenkernel/intern/fluidsim.c3
-rw-r--r--source/blender/blenkernel/intern/fmodifier.c81
-rw-r--r--source/blender/blenkernel/intern/font.c98
-rw-r--r--source/blender/blenkernel/intern/gpencil.c6
-rw-r--r--source/blender/blenkernel/intern/group.c6
-rw-r--r--source/blender/blenkernel/intern/icons.c3
-rw-r--r--source/blender/blenkernel/intern/idcode.c2
-rw-r--r--source/blender/blenkernel/intern/idprop.c20
-rw-r--r--source/blender/blenkernel/intern/image.c223
-rw-r--r--source/blender/blenkernel/intern/image_gen.c8
-rw-r--r--source/blender/blenkernel/intern/implicit.c42
-rw-r--r--source/blender/blenkernel/intern/ipo.c145
-rw-r--r--source/blender/blenkernel/intern/key.c239
-rw-r--r--source/blender/blenkernel/intern/lattice.c81
-rw-r--r--source/blender/blenkernel/intern/library.c132
-rw-r--r--source/blender/blenkernel/intern/material.c168
-rw-r--r--source/blender/blenkernel/intern/mball.c56
-rw-r--r--source/blender/blenkernel/intern/mesh.c132
-rw-r--r--source/blender/blenkernel/intern/mesh_validate.c379
-rw-r--r--source/blender/blenkernel/intern/modifier.c21
-rw-r--r--source/blender/blenkernel/intern/multires.c981
-rw-r--r--source/blender/blenkernel/intern/nla.c57
-rw-r--r--source/blender/blenkernel/intern/node.c852
-rw-r--r--source/blender/blenkernel/intern/object.c304
-rw-r--r--source/blender/blenkernel/intern/packedFile.c36
-rw-r--r--source/blender/blenkernel/intern/paint.c5
-rw-r--r--source/blender/blenkernel/intern/particle.c1038
-rw-r--r--source/blender/blenkernel/intern/particle_system.c1036
-rw-r--r--source/blender/blenkernel/intern/pointcache.c2326
-rw-r--r--source/blender/blenkernel/intern/property.c2
-rw-r--r--source/blender/blenkernel/intern/report.c28
-rw-r--r--source/blender/blenkernel/intern/sca.c6
-rw-r--r--source/blender/blenkernel/intern/scene.c160
-rw-r--r--source/blender/blenkernel/intern/script.c2
-rw-r--r--source/blender/blenkernel/intern/seqcache.c47
-rw-r--r--source/blender/blenkernel/intern/seqeffects.c372
-rw-r--r--source/blender/blenkernel/intern/sequencer.c1010
-rw-r--r--source/blender/blenkernel/intern/shrinkwrap.c59
-rw-r--r--source/blender/blenkernel/intern/sketch.c3
-rw-r--r--source/blender/blenkernel/intern/smoke.c425
-rw-r--r--source/blender/blenkernel/intern/softbody.c46
-rw-r--r--source/blender/blenkernel/intern/sound.c23
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c164
-rw-r--r--source/blender/blenkernel/intern/suggestions.c4
-rw-r--r--source/blender/blenkernel/intern/text.c55
-rw-r--r--source/blender/blenkernel/intern/texture.c19
-rw-r--r--source/blender/blenkernel/intern/unit.c43
-rw-r--r--source/blender/blenkernel/intern/world.c2
-rw-r--r--source/blender/blenkernel/intern/writeavi.c10
-rw-r--r--source/blender/blenkernel/intern/writeffmpeg.c122
-rw-r--r--source/blender/blenkernel/intern/writeframeserver.c25
-rw-r--r--source/blender/blenlib/BLI_args.h6
-rw-r--r--source/blender/blenlib/BLI_bfile.h143
-rw-r--r--source/blender/blenlib/BLI_blenlib.h2
-rw-r--r--source/blender/blenlib/BLI_boxpack2d.h22
-rw-r--r--source/blender/blenlib/BLI_bpath.h45
-rw-r--r--source/blender/blenlib/BLI_dynstr.h6
-rw-r--r--source/blender/blenlib/BLI_editVert.h2
-rw-r--r--source/blender/blenlib/BLI_fileops.h30
-rw-r--r--source/blender/blenlib/BLI_ghash.h22
-rw-r--r--source/blender/blenlib/BLI_kdopbvh.h2
-rw-r--r--source/blender/blenlib/BLI_listbase.h17
-rw-r--r--source/blender/blenlib/BLI_math.h6
-rw-r--r--source/blender/blenlib/BLI_math_base.h14
-rw-r--r--source/blender/blenlib/BLI_math_color.h13
-rw-r--r--source/blender/blenlib/BLI_math_geom.h23
-rw-r--r--source/blender/blenlib/BLI_math_inline.h4
-rw-r--r--source/blender/blenlib/BLI_math_matrix.h34
-rw-r--r--source/blender/blenlib/BLI_math_rotation.h79
-rw-r--r--source/blender/blenlib/BLI_math_vector.h70
-rw-r--r--source/blender/blenlib/BLI_path_util.h22
-rw-r--r--source/blender/blenlib/BLI_pbvh.h2
-rw-r--r--source/blender/blenlib/BLI_scanfill.h2
-rw-r--r--source/blender/blenlib/BLI_storage.h25
-rw-r--r--source/blender/blenlib/BLI_storage_types.h18
-rw-r--r--source/blender/blenlib/BLI_string.h28
-rw-r--r--source/blender/blenlib/BLI_threads.h2
-rw-r--r--source/blender/blenlib/BLI_utildefines.h218
-rw-r--r--source/blender/blenlib/BLI_winstuff.h21
-rw-r--r--source/blender/blenlib/CMakeLists.txt122
-rw-r--r--source/blender/blenlib/Makefile34
-rw-r--r--source/blender/blenlib/PIL_dynlib.h2
-rw-r--r--source/blender/blenlib/intern/BLI_args.c37
-rw-r--r--source/blender/blenlib/intern/BLI_bfile.c372
-rw-r--r--source/blender/blenlib/intern/BLI_callbacks.h2
-rw-r--r--source/blender/blenlib/intern/BLI_dynstr.c36
-rw-r--r--source/blender/blenlib/intern/BLI_ghash.c15
-rw-r--r--source/blender/blenlib/intern/BLI_kdopbvh.c9
-rw-r--r--source/blender/blenlib/intern/BLI_kdtree.c1
-rw-r--r--source/blender/blenlib/intern/BLI_mempool.c27
-rw-r--r--source/blender/blenlib/intern/Makefile62
-rw-r--r--source/blender/blenlib/intern/boxpack2d.c41
-rw-r--r--source/blender/blenlib/intern/bpath.c552
-rw-r--r--source/blender/blenlib/intern/dynlib.c5
-rw-r--r--source/blender/blenlib/intern/fileops.c94
-rw-r--r--source/blender/blenlib/intern/freetypefont.c20
-rw-r--r--source/blender/blenlib/intern/graph.c9
-rw-r--r--source/blender/blenlib/intern/listbase.c56
-rw-r--r--source/blender/blenlib/intern/math_base.c3
-rw-r--r--source/blender/blenlib/intern/math_base_inline.c6
-rw-r--r--source/blender/blenlib/intern/math_color.c52
-rw-r--r--source/blender/blenlib/intern/math_geom.c263
-rw-r--r--source/blender/blenlib/intern/math_geom_inline.c6
-rw-r--r--source/blender/blenlib/intern/math_matrix.c171
-rw-r--r--source/blender/blenlib/intern/math_rotation.c324
-rw-r--r--source/blender/blenlib/intern/math_vector.c152
-rw-r--r--source/blender/blenlib/intern/math_vector_inline.c81
-rw-r--r--source/blender/blenlib/intern/noise.c12
-rw-r--r--source/blender/blenlib/intern/path_util.c379
-rw-r--r--source/blender/blenlib/intern/pbvh.c23
-rw-r--r--source/blender/blenlib/intern/scanfill.c23
-rw-r--r--source/blender/blenlib/intern/storage.c19
-rw-r--r--source/blender/blenlib/intern/string.c9
-rw-r--r--source/blender/blenlib/intern/threads.c2
-rw-r--r--source/blender/blenlib/intern/uvproject.c4
-rw-r--r--source/blender/blenlib/intern/voxel.c3
-rw-r--r--source/blender/blenlib/intern/winstuff.c5
-rw-r--r--source/blender/blenloader/BLO_readfile.h4
-rw-r--r--source/blender/blenloader/BLO_writefile.h3
-rw-r--r--source/blender/blenloader/CMakeLists.txt27
-rw-r--r--source/blender/blenloader/Makefile34
-rw-r--r--source/blender/blenloader/SConscript5
-rw-r--r--source/blender/blenloader/intern/Makefile69
-rw-r--r--source/blender/blenloader/intern/readblenentry.c14
-rw-r--r--source/blender/blenloader/intern/readfile.c716
-rw-r--r--source/blender/blenloader/intern/readfile.h4
-rw-r--r--source/blender/blenloader/intern/writefile.c522
-rw-r--r--source/blender/blenpluginapi/CMakeLists.txt27
-rw-r--r--source/blender/blenpluginapi/Makefile34
-rw-r--r--source/blender/blenpluginapi/iff.h2
-rw-r--r--source/blender/blenpluginapi/intern/pluginapi.c5
-rw-r--r--source/blender/collada/AnimationImporter.cpp1152
-rw-r--r--source/blender/collada/AnimationImporter.h132
-rw-r--r--source/blender/collada/ArmatureExporter.cpp469
-rw-r--r--source/blender/collada/ArmatureExporter.h137
-rw-r--r--source/blender/collada/ArmatureImporter.cpp587
-rw-r--r--source/blender/collada/ArmatureImporter.h159
-rw-r--r--source/blender/collada/CMakeLists.txt107
-rw-r--r--source/blender/collada/CameraExporter.cpp86
-rw-r--r--source/blender/collada/CameraExporter.h (renamed from source/blender/verify/BLO_signer_info.h)36
-rw-r--r--source/blender/collada/DocumentExporter.cpp1880
-rw-r--r--source/blender/collada/DocumentExporter.h6
-rw-r--r--source/blender/collada/DocumentImporter.cpp3515
-rw-r--r--source/blender/collada/DocumentImporter.h123
-rw-r--r--source/blender/collada/EffectExporter.cpp306
-rw-r--r--source/blender/collada/EffectExporter.h62
-rw-r--r--source/blender/collada/GeometryExporter.cpp477
-rw-r--r--source/blender/collada/GeometryExporter.h117
-rw-r--r--source/blender/collada/ImageExporter.cpp94
-rw-r--r--source/blender/collada/ImageExporter.h (renamed from source/gameengine/GamePlayer/common/unix/GPU_Canvas.h)48
-rw-r--r--source/blender/collada/InstanceWriter.cpp64
-rw-r--r--source/blender/collada/InstanceWriter.h (renamed from source/gameengine/GamePlayer/common/unix/GPU_System.h)31
-rw-r--r--source/blender/collada/LightExporter.cpp139
-rw-r--r--source/blender/collada/LightExporter.h (renamed from source/gameengine/GamePlayer/common/windows/GPW_Engine.h)32
-rw-r--r--source/blender/collada/Makefile42
-rw-r--r--source/blender/collada/MaterialExporter.cpp (renamed from source/gameengine/GamePlayer/common/unix/GPU_Canvas.cpp)57
-rw-r--r--source/blender/collada/MaterialExporter.h94
-rw-r--r--source/blender/collada/MeshImporter.cpp915
-rw-r--r--source/blender/collada/MeshImporter.h152
-rw-r--r--source/blender/collada/SkinInfo.cpp331
-rw-r--r--source/blender/collada/SkinInfo.h133
-rw-r--r--source/blender/collada/TransformReader.cpp127
-rw-r--r--source/blender/collada/TransformReader.h70
-rw-r--r--source/blender/collada/TransformWriter.cpp100
-rw-r--r--source/blender/collada/TransformWriter.h (renamed from source/gameengine/GamePlayer/common/windows/GPW_System.h)42
-rw-r--r--source/blender/collada/collada.cpp13
-rw-r--r--source/blender/collada/collada_internal.cpp267
-rw-r--r--source/blender/collada/collada_internal.h87
-rw-r--r--source/blender/collada/collada_utils.cpp109
-rw-r--r--source/blender/collada/collada_utils.h50
-rw-r--r--source/blender/editors/CMakeLists.txt72
-rw-r--r--source/blender/editors/Makefile71
-rw-r--r--source/blender/editors/animation/CMakeLists.txt26
-rw-r--r--source/blender/editors/animation/Makefile54
-rw-r--r--source/blender/editors/animation/anim_channels_defines.c521
-rw-r--r--source/blender/editors/animation/anim_channels_edit.c853
-rw-r--r--source/blender/editors/animation/anim_deps.c11
-rw-r--r--source/blender/editors/animation/anim_draw.c7
-rw-r--r--source/blender/editors/animation/anim_filter.c276
-rw-r--r--source/blender/editors/animation/anim_ipo_utils.c10
-rw-r--r--source/blender/editors/animation/anim_markers.c455
-rw-r--r--source/blender/editors/animation/anim_ops.c15
-rw-r--r--source/blender/editors/animation/drivers.c193
-rw-r--r--source/blender/editors/animation/fmodifier_ui.c99
-rw-r--r--source/blender/editors/animation/keyframes_draw.c133
-rw-r--r--source/blender/editors/animation/keyframes_edit.c60
-rw-r--r--source/blender/editors/animation/keyframes_general.c353
-rw-r--r--source/blender/editors/animation/keyframing.c172
-rw-r--r--source/blender/editors/animation/keyingsets.c120
-rw-r--r--source/blender/editors/armature/BIF_retarget.h2
-rw-r--r--source/blender/editors/armature/CMakeLists.txt28
-rw-r--r--source/blender/editors/armature/Makefile57
-rw-r--r--source/blender/editors/armature/armature_intern.h7
-rw-r--r--source/blender/editors/armature/armature_ops.c12
-rw-r--r--source/blender/editors/armature/editarmature.c1361
-rw-r--r--source/blender/editors/armature/editarmature_generate.c21
-rw-r--r--source/blender/editors/armature/editarmature_retarget.c45
-rw-r--r--source/blender/editors/armature/editarmature_sketch.c54
-rw-r--r--source/blender/editors/armature/meshlaplacian.c41
-rw-r--r--source/blender/editors/armature/meshlaplacian.h6
-rw-r--r--source/blender/editors/armature/poseSlide.c49
-rw-r--r--source/blender/editors/armature/poseUtils.c3
-rw-r--r--source/blender/editors/armature/poselib.c248
-rw-r--r--source/blender/editors/armature/poseobject.c319
-rw-r--r--source/blender/editors/armature/reeb.c29
-rw-r--r--source/blender/editors/armature/reeb.h4
-rw-r--r--source/blender/editors/curve/CMakeLists.txt15
-rw-r--r--source/blender/editors/curve/Makefile56
-rw-r--r--source/blender/editors/curve/curve_intern.h3
-rw-r--r--source/blender/editors/curve/curve_ops.c22
-rw-r--r--source/blender/editors/curve/editcurve.c1293
-rw-r--r--source/blender/editors/curve/editfont.c151
-rw-r--r--source/blender/editors/curve/lorem.c1121
-rw-r--r--source/blender/editors/datafiles/Bfont.c101
-rw-r--r--source/blender/editors/datafiles/CMakeLists.txt43
-rw-r--r--source/blender/editors/datafiles/Makefile49
-rw-r--r--source/blender/editors/datafiles/SConscript2
-rw-r--r--source/blender/editors/datafiles/blenderbuttons.c13129
-rw-r--r--source/blender/editors/datafiles/prvicons.c861
-rw-r--r--source/blender/editors/datafiles/splash.png.c12282
-rw-r--r--source/blender/editors/datafiles/startup.blend.c16625
-rw-r--r--source/blender/editors/gpencil/CMakeLists.txt17
-rw-r--r--source/blender/editors/gpencil/Makefile56
-rw-r--r--source/blender/editors/gpencil/drawgpencil.c14
-rw-r--r--source/blender/editors/gpencil/editaction_gpencil.c66
-rw-r--r--source/blender/editors/gpencil/gpencil_buttons.c39
-rw-r--r--source/blender/editors/gpencil/gpencil_edit.c5
-rw-r--r--source/blender/editors/gpencil/gpencil_paint.c398
-rw-r--r--source/blender/editors/include/BIF_glutil.h2
-rw-r--r--source/blender/editors/include/ED_anim_api.h25
-rw-r--r--source/blender/editors/include/ED_armature.h29
-rw-r--r--source/blender/editors/include/ED_curve.h10
-rw-r--r--source/blender/editors/include/ED_fileselect.h2
-rw-r--r--source/blender/editors/include/ED_gpencil.h27
-rw-r--r--source/blender/editors/include/ED_image.h7
-rw-r--r--source/blender/editors/include/ED_info.h2
-rw-r--r--source/blender/editors/include/ED_keyframes_draw.h4
-rw-r--r--source/blender/editors/include/ED_keyframes_edit.h37
-rw-r--r--source/blender/editors/include/ED_keyframing.h49
-rw-r--r--source/blender/editors/include/ED_markers.h6
-rw-r--r--source/blender/editors/include/ED_mball.h2
-rw-r--r--source/blender/editors/include/ED_mesh.h39
-rw-r--r--source/blender/editors/include/ED_node.h2
-rw-r--r--source/blender/editors/include/ED_object.h19
-rw-r--r--source/blender/editors/include/ED_particle.h6
-rw-r--r--source/blender/editors/include/ED_render.h2
-rw-r--r--source/blender/editors/include/ED_retopo.h111
-rw-r--r--source/blender/editors/include/ED_screen.h22
-rw-r--r--source/blender/editors/include/ED_screen_types.h3
-rw-r--r--source/blender/editors/include/ED_sculpt.h2
-rw-r--r--source/blender/editors/include/ED_transform.h3
-rw-r--r--source/blender/editors/include/ED_types.h5
-rw-r--r--source/blender/editors/include/ED_util.h17
-rw-r--r--source/blender/editors/include/ED_uvedit.h14
-rw-r--r--source/blender/editors/include/ED_view3d.h21
-rw-r--r--source/blender/editors/include/UI_icons.h1736
-rw-r--r--source/blender/editors/include/UI_interface.h271
-rw-r--r--source/blender/editors/include/UI_interface_icons.h4
-rw-r--r--source/blender/editors/include/UI_resources.h23
-rw-r--r--source/blender/editors/include/UI_view2d.h20
-rw-r--r--source/blender/editors/interface/CMakeLists.txt39
-rw-r--r--source/blender/editors/interface/Makefile61
-rw-r--r--source/blender/editors/interface/SConscript4
-rw-r--r--source/blender/editors/interface/interface.c407
-rw-r--r--source/blender/editors/interface/interface_anim.c5
-rw-r--r--source/blender/editors/interface/interface_draw.c66
-rw-r--r--source/blender/editors/interface/interface_handlers.c555
-rw-r--r--source/blender/editors/interface/interface_icons.c206
-rw-r--r--source/blender/editors/interface/interface_intern.h61
-rw-r--r--source/blender/editors/interface/interface_layout.c287
-rw-r--r--source/blender/editors/interface/interface_ops.c59
-rw-r--r--source/blender/editors/interface/interface_panel.c34
-rw-r--r--source/blender/editors/interface/interface_regions.c234
-rw-r--r--source/blender/editors/interface/interface_style.c44
-rw-r--r--source/blender/editors/interface/interface_templates.c331
-rw-r--r--source/blender/editors/interface/interface_utils.c77
-rw-r--r--source/blender/editors/interface/interface_widgets.c265
-rw-r--r--source/blender/editors/interface/resources.c97
-rw-r--r--source/blender/editors/interface/view2d.c143
-rw-r--r--source/blender/editors/interface/view2d_ops.c266
-rw-r--r--source/blender/editors/mesh/CMakeLists.txt24
-rw-r--r--source/blender/editors/mesh/Makefile56
-rw-r--r--source/blender/editors/mesh/editface.c115
-rw-r--r--source/blender/editors/mesh/editmesh.c80
-rw-r--r--source/blender/editors/mesh/editmesh_add.c166
-rw-r--r--source/blender/editors/mesh/editmesh_lib.c237
-rw-r--r--source/blender/editors/mesh/editmesh_loop.c16
-rw-r--r--source/blender/editors/mesh/editmesh_mods.c201
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c225
-rw-r--r--source/blender/editors/mesh/loopcut.c72
-rw-r--r--source/blender/editors/mesh/mesh_data.c117
-rw-r--r--source/blender/editors/mesh/mesh_intern.h11
-rw-r--r--source/blender/editors/mesh/mesh_ops.c15
-rw-r--r--source/blender/editors/mesh/meshtools.c105
-rw-r--r--source/blender/editors/metaball/CMakeLists.txt13
-rw-r--r--source/blender/editors/metaball/Makefile56
-rw-r--r--source/blender/editors/metaball/mball_edit.c27
-rw-r--r--source/blender/editors/object/CMakeLists.txt34
-rw-r--r--source/blender/editors/object/Makefile56
-rw-r--r--source/blender/editors/object/SConscript4
-rw-r--r--source/blender/editors/object/object_add.c266
-rw-r--r--source/blender/editors/object/object_bake.c13
-rw-r--r--source/blender/editors/object/object_constraint.c173
-rw-r--r--source/blender/editors/object/object_edit.c174
-rw-r--r--source/blender/editors/object/object_group.c16
-rw-r--r--source/blender/editors/object/object_hook.c15
-rw-r--r--source/blender/editors/object/object_intern.h2
-rw-r--r--source/blender/editors/object/object_lattice.c15
-rw-r--r--source/blender/editors/object/object_modifier.c190
-rw-r--r--source/blender/editors/object/object_navmesh.cpp19
-rw-r--r--source/blender/editors/object/object_ops.c6
-rw-r--r--source/blender/editors/object/object_relations.c237
-rw-r--r--source/blender/editors/object/object_select.c55
-rw-r--r--source/blender/editors/object/object_shapekey.c44
-rw-r--r--source/blender/editors/object/object_transform.c470
-rw-r--r--source/blender/editors/object/object_vgroup.c270
-rw-r--r--source/blender/editors/physics/CMakeLists.txt31
-rw-r--r--source/blender/editors/physics/Makefile62
-rw-r--r--source/blender/editors/physics/particle_boids.c30
-rw-r--r--source/blender/editors/physics/particle_edit.c357
-rw-r--r--source/blender/editors/physics/particle_object.c43
-rw-r--r--source/blender/editors/physics/physics_fluid.c35
-rw-r--r--source/blender/editors/physics/physics_pointcache.c36
-rw-r--r--source/blender/editors/render/CMakeLists.txt32
-rw-r--r--source/blender/editors/render/Makefile62
-rw-r--r--source/blender/editors/render/render_internal.c137
-rw-r--r--source/blender/editors/render/render_opengl.c135
-rw-r--r--source/blender/editors/render/render_preview.c154
-rw-r--r--source/blender/editors/render/render_shading.c145
-rw-r--r--source/blender/editors/screen/CMakeLists.txt19
-rw-r--r--source/blender/editors/screen/Makefile67
-rw-r--r--source/blender/editors/screen/area.c81
-rw-r--r--source/blender/editors/screen/glutil.c17
-rw-r--r--source/blender/editors/screen/screen_context.c55
-rw-r--r--source/blender/editors/screen/screen_edit.c152
-rw-r--r--source/blender/editors/screen/screen_intern.h6
-rw-r--r--source/blender/editors/screen/screen_ops.c358
-rw-r--r--source/blender/editors/screen/screendump.c63
-rw-r--r--source/blender/editors/sculpt_paint/CMakeLists.txt22
-rw-r--r--source/blender/editors/sculpt_paint/Makefile56
-rw-r--r--source/blender/editors/sculpt_paint/paint_image.c220
-rw-r--r--source/blender/editors/sculpt_paint/paint_intern.h29
-rw-r--r--source/blender/editors/sculpt_paint/paint_ops.c188
-rw-r--r--source/blender/editors/sculpt_paint/paint_stroke.c681
-rw-r--r--source/blender/editors/sculpt_paint/paint_undo.c29
-rw-r--r--source/blender/editors/sculpt_paint/paint_utils.c70
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c51
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c558
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_intern.h13
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_undo.c47
-rw-r--r--source/blender/editors/sound/CMakeLists.txt12
-rw-r--r--source/blender/editors/sound/Makefile53
-rw-r--r--source/blender/editors/sound/sound_ops.c95
-rw-r--r--source/blender/editors/space_action/CMakeLists.txt16
-rw-r--r--source/blender/editors/space_action/Makefile54
-rw-r--r--source/blender/editors/space_action/SConscript2
-rw-r--r--source/blender/editors/space_action/action_draw.c18
-rw-r--r--source/blender/editors/space_action/action_edit.c121
-rw-r--r--source/blender/editors/space_action/action_intern.h2
-rw-r--r--source/blender/editors/space_action/action_ops.c2
-rw-r--r--source/blender/editors/space_action/action_select.c157
-rw-r--r--source/blender/editors/space_action/space_action.c43
-rw-r--r--source/blender/editors/space_api/CMakeLists.txt11
-rw-r--r--source/blender/editors/space_api/Makefile50
-rw-r--r--source/blender/editors/space_api/spacetypes.c13
-rw-r--r--source/blender/editors/space_buttons/CMakeLists.txt15
-rw-r--r--source/blender/editors/space_buttons/Makefile55
-rw-r--r--source/blender/editors/space_buttons/buttons_context.c30
-rw-r--r--source/blender/editors/space_buttons/buttons_header.c33
-rw-r--r--source/blender/editors/space_buttons/buttons_ops.c26
-rw-r--r--source/blender/editors/space_buttons/space_buttons.c25
-rw-r--r--source/blender/editors/space_console/CMakeLists.txt20
-rw-r--r--source/blender/editors/space_console/Makefile53
-rw-r--r--source/blender/editors/space_console/SConscript4
-rw-r--r--source/blender/editors/space_console/console_draw.c462
-rw-r--r--source/blender/editors/space_console/console_intern.h32
-rw-r--r--source/blender/editors/space_console/console_ops.c237
-rw-r--r--source/blender/editors/space_console/space_console.c88
-rw-r--r--source/blender/editors/space_file/CMakeLists.txt58
-rw-r--r--source/blender/editors/space_file/Makefile76
-rw-r--r--source/blender/editors/space_file/file_draw.c179
-rw-r--r--source/blender/editors/space_file/file_intern.h5
-rw-r--r--source/blender/editors/space_file/file_ops.c129
-rw-r--r--source/blender/editors/space_file/file_panels.c63
-rw-r--r--source/blender/editors/space_file/filelist.c193
-rw-r--r--source/blender/editors/space_file/filelist.h7
-rw-r--r--source/blender/editors/space_file/filesel.c102
-rw-r--r--source/blender/editors/space_file/fsmenu.c2
-rw-r--r--source/blender/editors/space_file/fsmenu.h2
-rw-r--r--source/blender/editors/space_file/space_file.c21
-rw-r--r--source/blender/editors/space_file/writeimage.c233
-rw-r--r--source/blender/editors/space_graph/CMakeLists.txt18
-rw-r--r--source/blender/editors/space_graph/Makefile58
-rw-r--r--source/blender/editors/space_graph/graph_buttons.c124
-rw-r--r--source/blender/editors/space_graph/graph_draw.c79
-rw-r--r--source/blender/editors/space_graph/graph_edit.c139
-rw-r--r--source/blender/editors/space_graph/graph_intern.h4
-rw-r--r--source/blender/editors/space_graph/graph_ops.c21
-rw-r--r--source/blender/editors/space_graph/graph_select.c40
-rw-r--r--source/blender/editors/space_graph/graph_utils.c74
-rw-r--r--source/blender/editors/space_graph/space_graph.c58
-rw-r--r--source/blender/editors/space_image/CMakeLists.txt48
-rw-r--r--source/blender/editors/space_image/Makefile76
-rw-r--r--source/blender/editors/space_image/SConscript8
-rw-r--r--source/blender/editors/space_image/image_buttons.c96
-rw-r--r--source/blender/editors/space_image/image_draw.c54
-rw-r--r--source/blender/editors/space_image/image_header.c18
-rw-r--r--source/blender/editors/space_image/image_ops.c336
-rw-r--r--source/blender/editors/space_image/image_render.c4
-rw-r--r--source/blender/editors/space_image/space_image.c55
-rw-r--r--source/blender/editors/space_info/CMakeLists.txt19
-rw-r--r--source/blender/editors/space_info/Makefile55
-rw-r--r--source/blender/editors/space_info/info_draw.c292
-rw-r--r--source/blender/editors/space_info/info_intern.h18
-rw-r--r--source/blender/editors/space_info/info_ops.c66
-rw-r--r--source/blender/editors/space_info/info_report.c (renamed from source/blender/editors/space_console/console_report.c)123
-rw-r--r--source/blender/editors/space_info/info_stats.c14
-rw-r--r--source/blender/editors/space_info/space_info.c112
-rw-r--r--source/blender/editors/space_info/textview.c298
-rw-r--r--source/blender/editors/space_info/textview.h57
-rw-r--r--source/blender/editors/space_logic/CMakeLists.txt21
-rw-r--r--source/blender/editors/space_logic/Makefile55
-rw-r--r--source/blender/editors/space_logic/SConscript2
-rw-r--r--source/blender/editors/space_logic/logic_buttons.c10
-rw-r--r--source/blender/editors/space_logic/logic_ops.c13
-rw-r--r--source/blender/editors/space_logic/logic_window.c695
-rw-r--r--source/blender/editors/space_logic/space_logic.c17
-rw-r--r--source/blender/editors/space_nla/CMakeLists.txt18
-rw-r--r--source/blender/editors/space_nla/Makefile54
-rw-r--r--source/blender/editors/space_nla/nla_buttons.c74
-rw-r--r--source/blender/editors/space_nla/nla_channels.c16
-rw-r--r--source/blender/editors/space_nla/nla_draw.c41
-rw-r--r--source/blender/editors/space_nla/nla_edit.c203
-rw-r--r--source/blender/editors/space_nla/nla_intern.h7
-rw-r--r--source/blender/editors/space_nla/nla_ops.c32
-rw-r--r--source/blender/editors/space_nla/nla_select.c5
-rw-r--r--source/blender/editors/space_nla/space_nla.c35
-rw-r--r--source/blender/editors/space_node/CMakeLists.txt23
-rw-r--r--source/blender/editors/space_node/Makefile56
-rw-r--r--source/blender/editors/space_node/SConscript2
-rw-r--r--source/blender/editors/space_node/drawnode.c670
-rw-r--r--source/blender/editors/space_node/node_buttons.c12
-rw-r--r--source/blender/editors/space_node/node_draw.c152
-rw-r--r--source/blender/editors/space_node/node_edit.c389
-rw-r--r--source/blender/editors/space_node/node_header.c40
-rw-r--r--source/blender/editors/space_node/node_intern.h12
-rw-r--r--source/blender/editors/space_node/node_ops.c10
-rw-r--r--source/blender/editors/space_node/node_select.c22
-rw-r--r--source/blender/editors/space_node/node_state.c14
-rw-r--r--source/blender/editors/space_node/space_node.c75
-rw-r--r--source/blender/editors/space_outliner/CMakeLists.txt14
-rw-r--r--source/blender/editors/space_outliner/Makefile54
-rw-r--r--source/blender/editors/space_outliner/outliner.c724
-rw-r--r--source/blender/editors/space_outliner/outliner_intern.h4
-rw-r--r--source/blender/editors/space_outliner/outliner_ops.c6
-rw-r--r--source/blender/editors/space_outliner/space_outliner.c41
-rw-r--r--source/blender/editors/space_script/CMakeLists.txt24
-rw-r--r--source/blender/editors/space_script/Makefile54
-rw-r--r--source/blender/editors/space_script/SConscript4
-rw-r--r--source/blender/editors/space_script/script_edit.c22
-rw-r--r--source/blender/editors/space_script/script_header.c13
-rw-r--r--source/blender/editors/space_script/space_script.c25
-rw-r--r--source/blender/editors/space_sequencer/CMakeLists.txt19
-rw-r--r--source/blender/editors/space_sequencer/Makefile58
-rw-r--r--source/blender/editors/space_sequencer/sequencer_add.c81
-rw-r--r--source/blender/editors/space_sequencer/sequencer_buttons.c11
-rw-r--r--source/blender/editors/space_sequencer/sequencer_draw.c90
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c205
-rw-r--r--source/blender/editors/space_sequencer/sequencer_intern.h7
-rw-r--r--source/blender/editors/space_sequencer/sequencer_ops.c2
-rw-r--r--source/blender/editors/space_sequencer/sequencer_scopes.c22
-rw-r--r--source/blender/editors/space_sequencer/sequencer_select.c26
-rw-r--r--source/blender/editors/space_sequencer/space_sequencer.c17
-rw-r--r--source/blender/editors/space_sound/CMakeLists.txt13
-rw-r--r--source/blender/editors/space_sound/Makefile56
-rw-r--r--source/blender/editors/space_sound/sound_header.c9
-rw-r--r--source/blender/editors/space_sound/space_sound.c17
-rw-r--r--source/blender/editors/space_text/CMakeLists.txt25
-rw-r--r--source/blender/editors/space_text/Makefile55
-rw-r--r--source/blender/editors/space_text/SConscript4
-rw-r--r--source/blender/editors/space_text/space_text.c45
-rw-r--r--source/blender/editors/space_text/text_draw.c685
-rw-r--r--source/blender/editors/space_text/text_header.c57
-rw-r--r--source/blender/editors/space_text/text_intern.h22
-rw-r--r--source/blender/editors/space_text/text_ops.c803
-rw-r--r--source/blender/editors/space_text/text_python.c20
-rw-r--r--source/blender/editors/space_time/CMakeLists.txt13
-rw-r--r--source/blender/editors/space_time/Makefile54
-rw-r--r--source/blender/editors/space_time/space_time.c242
-rw-r--r--source/blender/editors/space_time/time_ops.c11
-rw-r--r--source/blender/editors/space_userpref/CMakeLists.txt13
-rw-r--r--source/blender/editors/space_userpref/Makefile55
-rw-r--r--source/blender/editors/space_userpref/space_userpref.c19
-rw-r--r--source/blender/editors/space_view3d/CMakeLists.txt39
-rw-r--r--source/blender/editors/space_view3d/Makefile61
-rw-r--r--source/blender/editors/space_view3d/SConscript2
-rw-r--r--source/blender/editors/space_view3d/drawanimviz.c33
-rw-r--r--source/blender/editors/space_view3d/drawarmature.c180
-rw-r--r--source/blender/editors/space_view3d/drawmesh.c78
-rw-r--r--source/blender/editors/space_view3d/drawobject.c661
-rw-r--r--source/blender/editors/space_view3d/drawvolume.c11
-rw-r--r--source/blender/editors/space_view3d/space_view3d.c171
-rw-r--r--source/blender/editors/space_view3d/view3d_buttons.c326
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c499
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c494
-rw-r--r--source/blender/editors/space_view3d/view3d_fly.c942
-rw-r--r--source/blender/editors/space_view3d/view3d_header.c45
-rw-r--r--source/blender/editors/space_view3d/view3d_intern.h37
-rw-r--r--source/blender/editors/space_view3d/view3d_ops.c29
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c864
-rw-r--r--source/blender/editors/space_view3d/view3d_snap.c83
-rw-r--r--source/blender/editors/space_view3d/view3d_toolbar.c53
-rw-r--r--source/blender/editors/space_view3d/view3d_view.c1065
-rw-r--r--source/blender/editors/transform/CMakeLists.txt21
-rw-r--r--source/blender/editors/transform/Makefile53
-rw-r--r--source/blender/editors/transform/transform.c405
-rw-r--r--source/blender/editors/transform/transform.h24
-rw-r--r--source/blender/editors/transform/transform_constraints.c36
-rw-r--r--source/blender/editors/transform/transform_conversions.c549
-rw-r--r--source/blender/editors/transform/transform_generics.c158
-rw-r--r--source/blender/editors/transform/transform_input.c13
-rw-r--r--source/blender/editors/transform/transform_manipulator.c215
-rw-r--r--source/blender/editors/transform/transform_ndofinput.c7
-rw-r--r--source/blender/editors/transform/transform_ops.c89
-rw-r--r--source/blender/editors/transform/transform_orientations.c98
-rw-r--r--source/blender/editors/transform/transform_snap.c90
-rw-r--r--source/blender/editors/util/CMakeLists.txt60
-rw-r--r--source/blender/editors/util/Makefile54
-rw-r--r--source/blender/editors/util/SConscript2
-rw-r--r--source/blender/editors/util/ed_util.c100
-rw-r--r--source/blender/editors/util/editmode_undo.c35
-rw-r--r--source/blender/editors/util/numinput.c1
-rw-r--r--source/blender/editors/util/undo.c115
-rw-r--r--source/blender/editors/util/util_intern.h1
-rw-r--r--source/blender/editors/uvedit/CMakeLists.txt16
-rw-r--r--source/blender/editors/uvedit/Makefile55
-rw-r--r--source/blender/editors/uvedit/uvedit_draw.c22
-rw-r--r--source/blender/editors/uvedit/uvedit_intern.h18
-rw-r--r--source/blender/editors/uvedit/uvedit_ops.c153
-rw-r--r--source/blender/editors/uvedit/uvedit_parametrizer.c8
-rw-r--r--source/blender/editors/uvedit/uvedit_parametrizer.h2
-rw-r--r--source/blender/editors/uvedit/uvedit_unwrap_ops.c48
-rw-r--r--source/blender/gpu/CMakeLists.txt27
-rw-r--r--source/blender/gpu/GPU_buffers.h4
-rw-r--r--source/blender/gpu/GPU_draw.h2
-rw-r--r--source/blender/gpu/GPU_extensions.h15
-rw-r--r--source/blender/gpu/GPU_material.h10
-rw-r--r--source/blender/gpu/Makefile37
-rw-r--r--source/blender/gpu/intern/Makefile54
-rw-r--r--source/blender/gpu/intern/gpu_buffers.c48
-rw-r--r--source/blender/gpu/intern/gpu_codegen.c42
-rw-r--r--source/blender/gpu/intern/gpu_codegen.h4
-rw-r--r--source/blender/gpu/intern/gpu_draw.c126
-rw-r--r--source/blender/gpu/intern/gpu_extensions.c64
-rw-r--r--source/blender/gpu/intern/gpu_material.c159
-rw-r--r--source/blender/gpu/intern/gpu_shader_material.glsl157
-rw-r--r--source/blender/gpu/intern/gpu_shader_material.glsl.c1524
-rw-r--r--source/blender/ikplugin/CMakeLists.txt35
-rw-r--r--source/blender/ikplugin/Makefile31
-rw-r--r--source/blender/ikplugin/intern/Makefile54
-rw-r--r--source/blender/ikplugin/intern/ikplugin_api.c2
-rw-r--r--source/blender/ikplugin/intern/iksolver_plugin.c7
-rw-r--r--source/blender/ikplugin/intern/itasc_plugin.cpp1
-rw-r--r--source/blender/imbuf/CMakeLists.txt138
-rw-r--r--source/blender/imbuf/IMB_imbuf.h21
-rw-r--r--source/blender/imbuf/IMB_imbuf_types.h16
-rw-r--r--source/blender/imbuf/IMB_thumbs.h5
-rw-r--r--source/blender/imbuf/Makefile34
-rw-r--r--source/blender/imbuf/intern/IMB_allocimbuf.h4
-rw-r--r--source/blender/imbuf/intern/IMB_anim.h15
-rw-r--r--source/blender/imbuf/intern/IMB_filetype.h24
-rw-r--r--source/blender/imbuf/intern/IMB_filter.h2
-rw-r--r--source/blender/imbuf/intern/Makefile100
-rw-r--r--source/blender/imbuf/intern/allocimbuf.c17
-rw-r--r--source/blender/imbuf/intern/anim_movie.c (renamed from source/blender/imbuf/intern/anim.c)55
-rw-r--r--source/blender/imbuf/intern/bmp.c10
-rw-r--r--source/blender/imbuf/intern/cache.c49
-rw-r--r--source/blender/imbuf/intern/cineon/CMakeLists.txt18
-rw-r--r--source/blender/imbuf/intern/cineon/Makefile57
-rw-r--r--source/blender/imbuf/intern/cineon/SConscript2
-rw-r--r--source/blender/imbuf/intern/cineon/cineon_dpx.c49
-rw-r--r--source/blender/imbuf/intern/cineon/cineonlib.c4
-rw-r--r--source/blender/imbuf/intern/cineon/dpxlib.c9
-rw-r--r--source/blender/imbuf/intern/cineon/logImageCore.c2
-rw-r--r--source/blender/imbuf/intern/cineon/logImageCore.h2
-rw-r--r--source/blender/imbuf/intern/dds/CMakeLists.txt21
-rw-r--r--source/blender/imbuf/intern/dds/Makefile60
-rw-r--r--source/blender/imbuf/intern/dds/SConscript2
-rw-r--r--source/blender/imbuf/intern/dds/dds_api.cpp4
-rw-r--r--source/blender/imbuf/intern/dds/dds_api.h2
-rw-r--r--source/blender/imbuf/intern/divers.c157
-rw-r--r--source/blender/imbuf/intern/filetype.c2
-rw-r--r--source/blender/imbuf/intern/filter.c44
-rw-r--r--source/blender/imbuf/intern/imbuf_cocoa.m2
-rw-r--r--source/blender/imbuf/intern/iris.c23
-rw-r--r--source/blender/imbuf/intern/jp2.c18
-rw-r--r--source/blender/imbuf/intern/jpeg.c32
-rw-r--r--source/blender/imbuf/intern/openexr/CMakeLists.txt20
-rw-r--r--source/blender/imbuf/intern/openexr/Makefile48
-rw-r--r--source/blender/imbuf/intern/openexr/SConscript2
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.cpp47
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.h5
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_multi.h33
-rw-r--r--source/blender/imbuf/intern/png.c36
-rw-r--r--source/blender/imbuf/intern/radiance_hdr.c8
-rw-r--r--source/blender/imbuf/intern/readimage.c2
-rw-r--r--source/blender/imbuf/intern/rectop.c3
-rw-r--r--source/blender/imbuf/intern/rotate.c4
-rw-r--r--source/blender/imbuf/intern/scaling.c45
-rw-r--r--source/blender/imbuf/intern/targa.c17
-rw-r--r--source/blender/imbuf/intern/thumbs.c2
-rw-r--r--source/blender/imbuf/intern/thumbs_blend.c6
-rw-r--r--source/blender/imbuf/intern/tiff.c30
-rw-r--r--source/blender/imbuf/intern/util.c21
-rw-r--r--source/blender/imbuf/intern/writeimage.c4
-rw-r--r--source/blender/makesdna/CMakeLists.txt65
-rw-r--r--source/blender/makesdna/DNA_ID.h10
-rw-r--r--source/blender/makesdna/DNA_action_types.h77
-rw-r--r--source/blender/makesdna/DNA_actuator_types.h6
-rw-r--r--source/blender/makesdna/DNA_anim_types.h64
-rw-r--r--source/blender/makesdna/DNA_armature_types.h20
-rw-r--r--source/blender/makesdna/DNA_boid_types.h2
-rw-r--r--source/blender/makesdna/DNA_brush_types.h4
-rw-r--r--source/blender/makesdna/DNA_camera_types.h2
-rw-r--r--source/blender/makesdna/DNA_constraint_types.h57
-rw-r--r--source/blender/makesdna/DNA_curve_types.h15
-rw-r--r--source/blender/makesdna/DNA_customdata_types.h8
-rw-r--r--source/blender/makesdna/DNA_fileglobal_types.h3
-rw-r--r--source/blender/makesdna/DNA_genfile.h2
-rw-r--r--source/blender/makesdna/DNA_group_types.h4
-rw-r--r--source/blender/makesdna/DNA_image_types.h14
-rw-r--r--source/blender/makesdna/DNA_ipo_types.h4
-rw-r--r--source/blender/makesdna/DNA_lamp_types.h2
-rw-r--r--source/blender/makesdna/DNA_lattice_types.h8
-rw-r--r--source/blender/makesdna/DNA_material_types.h1
-rw-r--r--source/blender/makesdna/DNA_mesh_types.h6
-rw-r--r--source/blender/makesdna/DNA_meshdata_types.h3
-rw-r--r--source/blender/makesdna/DNA_meta_types.h2
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h64
-rw-r--r--source/blender/makesdna/DNA_node_types.h11
-rw-r--r--source/blender/makesdna/DNA_object_force.h40
-rw-r--r--source/blender/makesdna/DNA_object_types.h27
-rw-r--r--source/blender/makesdna/DNA_particle_types.h51
-rw-r--r--source/blender/makesdna/DNA_scene_types.h77
-rw-r--r--source/blender/makesdna/DNA_screen_types.h27
-rw-r--r--source/blender/makesdna/DNA_sdna_types.h2
-rw-r--r--source/blender/makesdna/DNA_sensor_types.h8
-rw-r--r--source/blender/makesdna/DNA_sequence_types.h4
-rw-r--r--source/blender/makesdna/DNA_smoke_types.h3
-rw-r--r--source/blender/makesdna/DNA_space_types.h173
-rw-r--r--source/blender/makesdna/DNA_text_types.h2
-rw-r--r--source/blender/makesdna/DNA_texture_types.h18
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h57
-rw-r--r--source/blender/makesdna/DNA_vec_types.h4
-rw-r--r--source/blender/makesdna/DNA_vfont_types.h1
-rw-r--r--source/blender/makesdna/DNA_view3d_types.h44
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h25
-rw-r--r--source/blender/makesdna/DNA_world_types.h2
-rw-r--r--source/blender/makesdna/Makefile39
-rw-r--r--source/blender/makesdna/intern/CMakeLists.txt34
-rw-r--r--source/blender/makesdna/intern/Makefile87
-rw-r--r--source/blender/makesdna/intern/dna_genfile.c39
-rw-r--r--source/blender/makesdna/intern/makesdna.c11
-rw-r--r--source/blender/makesrna/CMakeLists.txt2
-rw-r--r--source/blender/makesrna/Makefile31
-rw-r--r--source/blender/makesrna/RNA_access.h48
-rw-r--r--source/blender/makesrna/RNA_define.h10
-rw-r--r--source/blender/makesrna/RNA_enum_types.h22
-rw-r--r--source/blender/makesrna/RNA_types.h32
-rw-r--r--source/blender/makesrna/SConscript8
-rw-r--r--source/blender/makesrna/intern/CMakeLists.txt193
-rw-r--r--source/blender/makesrna/intern/Makefile158
-rw-r--r--source/blender/makesrna/intern/SConscript10
-rw-r--r--source/blender/makesrna/intern/makesrna.c239
-rw-r--r--source/blender/makesrna/intern/rna_ID.c65
-rw-r--r--source/blender/makesrna/intern/rna_access.c483
-rw-r--r--source/blender/makesrna/intern/rna_action.c16
-rw-r--r--source/blender/makesrna/intern/rna_actuator.c196
-rw-r--r--source/blender/makesrna/intern/rna_animation.c120
-rw-r--r--source/blender/makesrna/intern/rna_armature.c75
-rw-r--r--source/blender/makesrna/intern/rna_armature_api.c11
-rw-r--r--source/blender/makesrna/intern/rna_boid.c29
-rw-r--r--source/blender/makesrna/intern/rna_brush.c9
-rw-r--r--source/blender/makesrna/intern/rna_camera.c7
-rw-r--r--source/blender/makesrna/intern/rna_cloth.c20
-rw-r--r--source/blender/makesrna/intern/rna_color.c6
-rw-r--r--source/blender/makesrna/intern/rna_constraint.c128
-rw-r--r--source/blender/makesrna/intern/rna_controller.c1
-rw-r--r--source/blender/makesrna/intern/rna_curve.c213
-rw-r--r--source/blender/makesrna/intern/rna_define.c166
-rw-r--r--source/blender/makesrna/intern/rna_fcurve.c107
-rw-r--r--source/blender/makesrna/intern/rna_fluidsim.c39
-rw-r--r--source/blender/makesrna/intern/rna_gpencil.c1
-rw-r--r--source/blender/makesrna/intern/rna_image.c22
-rw-r--r--source/blender/makesrna/intern/rna_image_api.c30
-rw-r--r--source/blender/makesrna/intern/rna_internal.h19
-rw-r--r--source/blender/makesrna/intern/rna_internal_types.h18
-rw-r--r--source/blender/makesrna/intern/rna_key.c158
-rw-r--r--source/blender/makesrna/intern/rna_lamp.c24
-rw-r--r--source/blender/makesrna/intern/rna_lattice.c32
-rw-r--r--source/blender/makesrna/intern/rna_main.c18
-rw-r--r--source/blender/makesrna/intern/rna_main_api.c289
-rw-r--r--source/blender/makesrna/intern/rna_material.c83
-rw-r--r--source/blender/makesrna/intern/rna_mesh.c85
-rw-r--r--source/blender/makesrna/intern/rna_mesh_api.c7
-rw-r--r--source/blender/makesrna/intern/rna_meta.c30
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c71
-rw-r--r--source/blender/makesrna/intern/rna_nla.c122
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c674
-rw-r--r--source/blender/makesrna/intern/rna_nodetree_types.h6
-rw-r--r--source/blender/makesrna/intern/rna_object.c251
-rw-r--r--source/blender/makesrna/intern/rna_object_api.c67
-rw-r--r--source/blender/makesrna/intern/rna_object_force.c79
-rw-r--r--source/blender/makesrna/intern/rna_particle.c277
-rw-r--r--source/blender/makesrna/intern/rna_pose.c69
-rw-r--r--source/blender/makesrna/intern/rna_property.c4
-rw-r--r--source/blender/makesrna/intern/rna_render.c20
-rw-r--r--source/blender/makesrna/intern/rna_rna.c78
-rw-r--r--source/blender/makesrna/intern/rna_scene.c130
-rw-r--r--source/blender/makesrna/intern/rna_scene_api.c15
-rw-r--r--source/blender/makesrna/intern/rna_screen.c67
-rw-r--r--source/blender/makesrna/intern/rna_sculpt_paint.c40
-rw-r--r--source/blender/makesrna/intern/rna_sensor.c49
-rw-r--r--source/blender/makesrna/intern/rna_sequencer.c69
-rw-r--r--source/blender/makesrna/intern/rna_sequencer_api.c2
-rw-r--r--source/blender/makesrna/intern/rna_smoke.c34
-rw-r--r--source/blender/makesrna/intern/rna_space.c347
-rw-r--r--source/blender/makesrna/intern/rna_text.c3
-rw-r--r--source/blender/makesrna/intern/rna_texture.c59
-rw-r--r--source/blender/makesrna/intern/rna_ui.c60
-rw-r--r--source/blender/makesrna/intern/rna_ui_api.c30
-rw-r--r--source/blender/makesrna/intern/rna_userdef.c413
-rw-r--r--source/blender/makesrna/intern/rna_wm.c176
-rw-r--r--source/blender/makesrna/intern/rna_wm_api.c40
-rw-r--r--source/blender/makesrna/intern/rna_world.c46
-rw-r--r--source/blender/makesrna/rna_cleanup/rna_properties.txt4606
-rw-r--r--source/blender/modifiers/CMakeLists.txt76
-rw-r--r--source/blender/modifiers/MOD_modifiertypes.h2
-rw-r--r--source/blender/modifiers/Makefile34
-rw-r--r--source/blender/modifiers/SConscript6
-rw-r--r--source/blender/modifiers/intern/MOD_armature.c42
-rw-r--r--source/blender/modifiers/intern/MOD_array.c78
-rw-r--r--source/blender/modifiers/intern/MOD_bevel.c21
-rw-r--r--source/blender/modifiers/intern/MOD_boolean.c38
-rw-r--r--source/blender/modifiers/intern/MOD_boolean_util.c3
-rw-r--r--source/blender/modifiers/intern/MOD_build.c10
-rw-r--r--source/blender/modifiers/intern/MOD_cast.c32
-rw-r--r--source/blender/modifiers/intern/MOD_cloth.c23
-rw-r--r--source/blender/modifiers/intern/MOD_collision.c15
-rw-r--r--source/blender/modifiers/intern/MOD_curve.c27
-rw-r--r--source/blender/modifiers/intern/MOD_decimate.c25
-rw-r--r--source/blender/modifiers/intern/MOD_displace.c44
-rw-r--r--source/blender/modifiers/intern/MOD_edgesplit.c40
-rw-r--r--source/blender/modifiers/intern/MOD_explode.c45
-rw-r--r--source/blender/modifiers/intern/MOD_fluidsim.c25
-rw-r--r--source/blender/modifiers/intern/MOD_fluidsim_util.c130
-rw-r--r--source/blender/modifiers/intern/MOD_hook.c202
-rw-r--r--source/blender/modifiers/intern/MOD_lattice.c26
-rw-r--r--source/blender/modifiers/intern/MOD_mask.c21
-rw-r--r--source/blender/modifiers/intern/MOD_meshdeform.c40
-rw-r--r--source/blender/modifiers/intern/MOD_mirror.c36
-rw-r--r--source/blender/modifiers/intern/MOD_multires.c5
-rw-r--r--source/blender/modifiers/intern/MOD_navmesh.cpp3
-rw-r--r--source/blender/modifiers/intern/MOD_none.c8
-rw-r--r--source/blender/modifiers/intern/MOD_particleinstance.c24
-rw-r--r--source/blender/modifiers/intern/MOD_particlesystem.c35
-rw-r--r--source/blender/modifiers/intern/MOD_screw.c40
-rw-r--r--source/blender/modifiers/intern/MOD_shapekey.c56
-rw-r--r--source/blender/modifiers/intern/MOD_shrinkwrap.c33
-rw-r--r--source/blender/modifiers/intern/MOD_simpledeform.c31
-rw-r--r--source/blender/modifiers/intern/MOD_smoke.c49
-rw-r--r--source/blender/modifiers/intern/MOD_smooth.c16
-rw-r--r--source/blender/modifiers/intern/MOD_softbody.c16
-rw-r--r--source/blender/modifiers/intern/MOD_solidify.c40
-rw-r--r--source/blender/modifiers/intern/MOD_subsurf.c18
-rw-r--r--source/blender/modifiers/intern/MOD_surface.c17
-rw-r--r--source/blender/modifiers/intern/MOD_util.c19
-rw-r--r--source/blender/modifiers/intern/MOD_util.h6
-rw-r--r--source/blender/modifiers/intern/MOD_uvproject.c27
-rw-r--r--source/blender/modifiers/intern/MOD_wave.c37
-rw-r--r--source/blender/modifiers/intern/Makefile55
-rw-r--r--source/blender/nodes/CMP_node.h134
-rw-r--r--source/blender/nodes/CMakeLists.txt128
-rw-r--r--source/blender/nodes/Makefile34
-rw-r--r--source/blender/nodes/SConscript3
-rw-r--r--source/blender/nodes/SHD_node.h46
-rw-r--r--source/blender/nodes/TEX_node.h66
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c37
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c33
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_blur.c231
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_brightness.c44
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c34
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c34
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c30
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c31
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_composite.c30
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_crop.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_curves.c97
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_defocus.c38
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c30
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_dilate.c29
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_displace.c34
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c30
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_filter.c30
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_flip.c30
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_gamma.c33
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_glare.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c33
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_idMask.c28
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_image.c95
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_invert.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_levels.c31
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c30
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c33
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_math.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c30
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_normal.c31
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_normalize.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c37
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c30
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_rgb.c31
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_rotate.c35
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_scale.c30
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c65
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c64
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c203
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c64
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c31
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c34
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_texture.c44
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_translate.c30
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c64
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_value.c30
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_viewer.c33
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c113
-rw-r--r--source/blender/nodes/intern/CMP_nodes/Makefile47
-rw-r--r--source/blender/nodes/intern/CMP_util.c60
-rw-r--r--source/blender/nodes/intern/CMP_util.h18
-rw-r--r--source/blender/nodes/intern/Makefile51
-rw-r--r--source/blender/nodes/intern/SHD_nodes/Makefile50
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_camera.c35
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_curves.c68
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c71
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_geom.c35
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c37
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_invert.c34
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_mapping.c33
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_material.c72
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_math.c37
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c37
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_normal.c31
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_output.c35
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_rgb.c33
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c70
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c35
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_texture.c32
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c68
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_value.c33
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c36
-rw-r--r--source/blender/nodes/intern/SHD_util.h4
-rw-r--r--source/blender/nodes/intern/TEX_nodes/Makefile49
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_at.c28
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_bricks.c27
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_checker.c28
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_compose.c28
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_coord.c31
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_curves.c60
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_decompose.c34
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_distance.c32
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c30
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_image.c40
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_invert.c29
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_math.c29
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c28
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_output.c36
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_proc.c38
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_rotate.c30
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_scale.c30
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_texture.c27
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_translate.c30
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c30
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c58
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_viewer.c28
-rw-r--r--source/blender/nodes/intern/TEX_util.c12
-rw-r--r--source/blender/nodes/intern/TEX_util.h4
-rw-r--r--source/blender/nodes/intern/node_util.c30
-rw-r--r--source/blender/nodes/intern/node_util.h5
-rw-r--r--source/blender/python/BPY_extern.h96
-rw-r--r--source/blender/python/CMakeLists.txt32
-rw-r--r--source/blender/python/Makefile34
-rw-r--r--source/blender/python/doc/epy/BGL.py1807
-rw-r--r--source/blender/python/doc/epy/Geometry.py189
-rw-r--r--source/blender/python/doc/epy/IDProp.py132
-rw-r--r--source/blender/python/doc/epy/Mathutils.py156
-rw-r--r--source/blender/python/doc/epy/testbgl.py45
-rw-r--r--source/blender/python/doc/examples/bpy.data.py29
-rw-r--r--source/blender/python/doc/examples/mathutils.Euler.py3
-rw-r--r--source/blender/python/doc/examples/mathutils.Matrix.py3
-rw-r--r--source/blender/python/doc/examples/mathutils.Quaternion.py3
-rw-r--r--source/blender/python/doc/examples/mathutils.Vector.py55
-rw-r--r--source/blender/python/doc/examples/mathutils.py18
-rw-r--r--source/blender/python/doc/sphinx_doc_gen.py862
-rwxr-xr-xsource/blender/python/doc/sphinx_doc_gen.sh29
-rw-r--r--source/blender/python/generic/CMakeLists.txt38
-rw-r--r--source/blender/python/generic/IDProp.c86
-rw-r--r--source/blender/python/generic/IDProp.h2
-rw-r--r--source/blender/python/generic/Makefile66
-rw-r--r--source/blender/python/generic/bgl.c84
-rw-r--r--source/blender/python/generic/bgl.h14
-rw-r--r--source/blender/python/generic/blf_py_api.c (renamed from source/blender/python/generic/blf_api.c)48
-rw-r--r--source/blender/python/generic/blf_py_api.h (renamed from source/blender/python/generic/blf_api.h)5
-rw-r--r--source/blender/python/generic/bpy_internal_import.c55
-rw-r--r--source/blender/python/generic/bpy_internal_import.h22
-rw-r--r--source/blender/python/generic/geometry.c841
-rw-r--r--source/blender/python/generic/mathutils.c142
-rw-r--r--source/blender/python/generic/mathutils.h14
-rw-r--r--source/blender/python/generic/mathutils_color.c150
-rw-r--r--source/blender/python/generic/mathutils_color.h6
-rw-r--r--source/blender/python/generic/mathutils_euler.c378
-rw-r--r--source/blender/python/generic/mathutils_euler.h6
-rw-r--r--source/blender/python/generic/mathutils_geometry.c880
-rw-r--r--source/blender/python/generic/mathutils_geometry.h (renamed from source/blender/python/generic/geometry.h)10
-rw-r--r--source/blender/python/generic/mathutils_matrix.c1626
-rw-r--r--source/blender/python/generic/mathutils_matrix.h17
-rw-r--r--source/blender/python/generic/mathutils_quat.c638
-rw-r--r--source/blender/python/generic/mathutils_quat.h6
-rw-r--r--source/blender/python/generic/mathutils_vector.c1830
-rw-r--r--source/blender/python/generic/mathutils_vector.h8
-rw-r--r--source/blender/python/generic/noise.c117
-rw-r--r--source/blender/python/generic/py_capi_utils.c37
-rw-r--r--source/blender/python/generic/py_capi_utils.h9
-rw-r--r--source/blender/python/intern/CMakeLists.txt (renamed from source/blender/blenpluginapi/intern/Makefile)65
-rw-r--r--source/blender/python/intern/Makefile67
-rw-r--r--source/blender/python/intern/bpy.c106
-rw-r--r--source/blender/python/intern/bpy_app.c132
-rw-r--r--source/blender/python/intern/bpy_app.h4
-rw-r--r--source/blender/python/intern/bpy_driver.c56
-rw-r--r--source/blender/python/intern/bpy_interface.c300
-rw-r--r--source/blender/python/intern/bpy_operator.c94
-rw-r--r--source/blender/python/intern/bpy_operator_wrap.c4
-rw-r--r--source/blender/python/intern/bpy_props.c326
-rw-r--r--source/blender/python/intern/bpy_rna.c1286
-rw-r--r--source/blender/python/intern/bpy_rna.h10
-rw-r--r--source/blender/python/intern/bpy_rna_array.c (renamed from source/blender/python/intern/bpy_array.c)92
-rw-r--r--source/blender/python/intern/bpy_rna_callback.c7
-rw-r--r--source/blender/python/intern/bpy_util.c36
-rw-r--r--source/blender/python/intern/bpy_util.h4
-rw-r--r--source/blender/python/intern/stubs.c15
-rw-r--r--source/blender/python/rna_dump.py59
-rw-r--r--source/blender/quicktime/CMakeLists.txt28
-rw-r--r--source/blender/quicktime/Makefile37
-rw-r--r--source/blender/quicktime/apple/Makefile63
-rw-r--r--source/blender/quicktime/apple/qtkit_export.m20
-rw-r--r--source/blender/quicktime/apple/qtkit_import.m8
-rw-r--r--source/blender/quicktime/apple/quicktime_export.c14
-rw-r--r--source/blender/quicktime/apple/quicktime_import.c20
-rw-r--r--source/blender/quicktime/quicktime_export.h4
-rw-r--r--source/blender/quicktime/quicktime_import.h2
-rw-r--r--source/blender/readblenfile/BLO_readblenfile.h2
-rw-r--r--source/blender/readblenfile/CMakeLists.txt18
-rw-r--r--source/blender/readblenfile/Makefile34
-rw-r--r--source/blender/readblenfile/SConscript2
-rw-r--r--source/blender/readblenfile/intern/BLO_readblenfile.c2
-rw-r--r--source/blender/readblenfile/intern/Makefile47
-rw-r--r--source/blender/readblenfile/stub/BLO_readblenfileSTUB.c10
-rw-r--r--source/blender/readblenfile/stub/Makefile44
-rw-r--r--source/blender/readblenfile/test/Makefile46
-rw-r--r--source/blender/render/CMakeLists.txt109
-rw-r--r--source/blender/render/Makefile34
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h23
-rw-r--r--source/blender/render/extern/include/RE_raytrace.h214
-rw-r--r--source/blender/render/extern/include/RE_shader_ext.h7
-rw-r--r--source/blender/render/intern/Makefile34
-rw-r--r--source/blender/render/intern/include/raycounter.h30
-rw-r--r--source/blender/render/intern/include/rayintersection.h124
-rw-r--r--source/blender/render/intern/include/rayobject.h195
-rw-r--r--source/blender/render/intern/include/render_types.h10
-rw-r--r--source/blender/render/intern/include/rendercore.h3
-rw-r--r--source/blender/render/intern/include/renderdatabase.h2
-rw-r--r--source/blender/render/intern/include/strand.h2
-rw-r--r--source/blender/render/intern/include/texture.h1
-rw-r--r--source/blender/render/intern/include/volumetric.h4
-rw-r--r--source/blender/render/intern/raytrace/Makefile69
-rw-r--r--source/blender/render/intern/raytrace/bvh.h62
-rw-r--r--source/blender/render/intern/raytrace/rayobject.cpp644
-rw-r--r--source/blender/render/intern/raytrace/rayobject_blibvh.cpp (renamed from source/blender/render/intern/source/rayobject_blibvh.c)27
-rw-r--r--source/blender/render/intern/raytrace/rayobject_empty.cpp75
-rw-r--r--source/blender/render/intern/raytrace/rayobject_hint.h2
-rw-r--r--source/blender/render/intern/raytrace/rayobject_instance.cpp (renamed from source/blender/render/intern/source/rayobject_instance.c)73
-rw-r--r--source/blender/render/intern/raytrace/rayobject_internal.h128
-rw-r--r--source/blender/render/intern/raytrace/rayobject_octree.cpp (renamed from source/blender/render/intern/source/rayobject_octree.c)48
-rw-r--r--source/blender/render/intern/raytrace/rayobject_qbvh.cpp38
-rw-r--r--source/blender/render/intern/raytrace/rayobject_raycounter.cpp (renamed from source/blender/render/intern/source/rayobject_raycounter.c)3
-rw-r--r--source/blender/render/intern/raytrace/rayobject_rtbuild.cpp32
-rw-r--r--source/blender/render/intern/raytrace/rayobject_svbvh.cpp24
-rw-r--r--source/blender/render/intern/raytrace/rayobject_vbvh.cpp26
-rw-r--r--source/blender/render/intern/raytrace/reorganize.h10
-rw-r--r--source/blender/render/intern/raytrace/svbvh.h141
-rw-r--r--source/blender/render/intern/raytrace/vbvh.h12
-rw-r--r--source/blender/render/intern/source/Makefile65
-rw-r--r--source/blender/render/intern/source/convertblender.c271
-rw-r--r--source/blender/render/intern/source/envmap.c7
-rw-r--r--source/blender/render/intern/source/imagetexture.c85
-rw-r--r--source/blender/render/intern/source/initrender.c5
-rw-r--r--source/blender/render/intern/source/occlusion.c27
-rw-r--r--source/blender/render/intern/source/pipeline.c357
-rw-r--r--source/blender/render/intern/source/pixelshading.c6
-rw-r--r--source/blender/render/intern/source/pointdensity.c12
-rw-r--r--source/blender/render/intern/source/rayshade.c320
-rw-r--r--source/blender/render/intern/source/render_texture.c (renamed from source/blender/render/intern/source/texture.c)700
-rw-r--r--source/blender/render/intern/source/rendercore.c52
-rw-r--r--source/blender/render/intern/source/renderdatabase.c45
-rw-r--r--source/blender/render/intern/source/shadbuf.c19
-rw-r--r--source/blender/render/intern/source/shadeinput.c36
-rw-r--r--source/blender/render/intern/source/shadeoutput.c70
-rw-r--r--source/blender/render/intern/source/sss.c18
-rw-r--r--source/blender/render/intern/source/strand.c51
-rw-r--r--source/blender/render/intern/source/volume_precache.c31
-rw-r--r--source/blender/render/intern/source/volumetric.c81
-rw-r--r--source/blender/render/intern/source/voxeldata.c47
-rw-r--r--source/blender/render/intern/source/zbuf.c27
-rw-r--r--source/blender/verify/BLO_sign_verify_Header.h80
-rw-r--r--source/blender/verify/BLO_verify.h76
-rw-r--r--source/blender/verify/Makefile34
-rw-r--r--source/blender/verify/intern/BLO_verify.c420
-rw-r--r--source/blender/verify/intern/Makefile50
-rw-r--r--source/blender/windowmanager/CMakeLists.txt92
-rw-r--r--source/blender/windowmanager/Makefile34
-rw-r--r--source/blender/windowmanager/SConscript4
-rw-r--r--source/blender/windowmanager/WM_api.h69
-rw-r--r--source/blender/windowmanager/WM_types.h102
-rw-r--r--source/blender/windowmanager/intern/Makefile98
-rw-r--r--source/blender/windowmanager/intern/wm.c21
-rw-r--r--source/blender/windowmanager/intern/wm_cursors.c31
-rw-r--r--source/blender/windowmanager/intern/wm_dragdrop.c14
-rw-r--r--source/blender/windowmanager/intern/wm_draw.c23
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c236
-rw-r--r--source/blender/windowmanager/intern/wm_files.c170
-rw-r--r--source/blender/windowmanager/intern/wm_gesture.c42
-rw-r--r--source/blender/windowmanager/intern/wm_init_exit.c62
-rw-r--r--source/blender/windowmanager/intern/wm_jobs.c55
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c71
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c460
-rw-r--r--source/blender/windowmanager/intern/wm_subwindow.c4
-rw-r--r--source/blender/windowmanager/intern/wm_window.c192
-rw-r--r--source/blender/windowmanager/wm.h2
-rw-r--r--source/blender/windowmanager/wm_cursors.h2
-rw-r--r--source/blender/windowmanager/wm_event_system.h1
-rw-r--r--source/blender/windowmanager/wm_event_types.h60
-rw-r--r--source/blender/windowmanager/wm_window.h7
-rw-r--r--source/blenderplayer/CMakeLists.txt172
-rw-r--r--source/blenderplayer/bad_level_call_stubs/CMakeLists.txt36
-rw-r--r--source/blenderplayer/bad_level_call_stubs/Makefile45
-rw-r--r--source/blenderplayer/bad_level_call_stubs/SConscript2
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c35
-rw-r--r--source/creator/CMakeLists.txt539
-rw-r--r--source/creator/Makefile84
-rw-r--r--source/creator/SConscript3
-rw-r--r--source/creator/buildinfo.c21
-rw-r--r--source/creator/creator.c244
-rw-r--r--source/darwin/Makefile61
-rw-r--r--source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp78
-rw-r--r--source/gameengine/BlenderRoutines/CMakeLists.txt42
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp8
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderGL.cpp111
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderGL.h3
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp11
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h10
-rw-r--r--source/gameengine/BlenderRoutines/Makefile78
-rw-r--r--source/gameengine/BlenderRoutines/SConscript8
-rw-r--r--source/gameengine/CMakeLists.txt50
-rw-r--r--source/gameengine/Converter/BL_ActionActuator.cpp11
-rw-r--r--source/gameengine/Converter/BL_ActionActuator.h4
-rw-r--r--source/gameengine/Converter/BL_ArmatureActuator.cpp4
-rw-r--r--source/gameengine/Converter/BL_ArmatureActuator.h4
-rw-r--r--source/gameengine/Converter/BL_ArmatureChannel.cpp10
-rw-r--r--source/gameengine/Converter/BL_ArmatureChannel.h6
-rw-r--r--source/gameengine/Converter/BL_ArmatureConstraint.cpp8
-rw-r--r--source/gameengine/Converter/BL_ArmatureConstraint.h4
-rw-r--r--source/gameengine/Converter/BL_ArmatureObject.cpp9
-rw-r--r--source/gameengine/Converter/BL_ArmatureObject.h4
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp47
-rw-r--r--source/gameengine/Converter/BL_DeformableGameObject.h16
-rw-r--r--source/gameengine/Converter/BL_ModifierDeformer.cpp36
-rw-r--r--source/gameengine/Converter/BL_ModifierDeformer.h3
-rw-r--r--source/gameengine/Converter/BL_ShapeActionActuator.cpp6
-rw-r--r--source/gameengine/Converter/BL_ShapeActionActuator.h4
-rw-r--r--source/gameengine/Converter/BL_ShapeDeformer.cpp4
-rw-r--r--source/gameengine/Converter/BL_SkinDeformer.cpp3
-rw-r--r--source/gameengine/Converter/BlenderWorldInfo.cpp6
-rw-r--r--source/gameengine/Converter/BlenderWorldInfo.h6
-rw-r--r--source/gameengine/Converter/CMakeLists.txt62
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.cpp53
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.h2
-rw-r--r--source/gameengine/Converter/KX_ConvertActuators.cpp15
-rw-r--r--source/gameengine/Converter/KX_ConvertControllers.cpp10
-rw-r--r--source/gameengine/Converter/KX_ConvertProperties.cpp4
-rw-r--r--source/gameengine/Converter/Makefile67
-rw-r--r--source/gameengine/Converter/SConscript11
-rw-r--r--source/gameengine/Expressions/BoolValue.cpp4
-rw-r--r--source/gameengine/Expressions/BoolValue.h2
-rw-r--r--source/gameengine/Expressions/CMakeLists.txt54
-rw-r--r--source/gameengine/Expressions/FloatValue.cpp4
-rw-r--r--source/gameengine/Expressions/FloatValue.h2
-rw-r--r--source/gameengine/Expressions/IntValue.cpp4
-rw-r--r--source/gameengine/Expressions/IntValue.h2
-rw-r--r--source/gameengine/Expressions/KX_Python.h12
-rw-r--r--source/gameengine/Expressions/ListValue.cpp4
-rw-r--r--source/gameengine/Expressions/ListValue.h2
-rw-r--r--source/gameengine/Expressions/Makefile46
-rw-r--r--source/gameengine/Expressions/PyObjectPlus.cpp12
-rw-r--r--source/gameengine/Expressions/PyObjectPlus.h19
-rw-r--r--source/gameengine/Expressions/SConscript8
-rw-r--r--source/gameengine/Expressions/StringValue.h4
-rw-r--r--source/gameengine/Expressions/Value.cpp8
-rw-r--r--source/gameengine/Expressions/Value.h8
-rw-r--r--source/gameengine/GameLogic/CMakeLists.txt109
-rw-r--r--source/gameengine/GameLogic/Joystick/Makefile44
-rw-r--r--source/gameengine/GameLogic/Makefile50
-rw-r--r--source/gameengine/GameLogic/SCA_2DFilterActuator.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_ANDController.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_ActuatorSensor.cpp6
-rw-r--r--source/gameengine/GameLogic/SCA_ActuatorSensor.h4
-rw-r--r--source/gameengine/GameLogic/SCA_AlwaysSensor.cpp2
-rw-r--r--source/gameengine/GameLogic/SCA_DelaySensor.cpp6
-rw-r--r--source/gameengine/GameLogic/SCA_IController.cpp6
-rw-r--r--source/gameengine/GameLogic/SCA_IController.h4
-rw-r--r--source/gameengine/GameLogic/SCA_IInputDevice.h1
-rw-r--r--source/gameengine/GameLogic/SCA_ILogicBrick.cpp6
-rw-r--r--source/gameengine/GameLogic/SCA_ILogicBrick.h4
-rw-r--r--source/gameengine/GameLogic/SCA_IObject.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_IObject.h2
-rw-r--r--source/gameengine/GameLogic/SCA_ISensor.cpp6
-rw-r--r--source/gameengine/GameLogic/SCA_ISensor.h4
-rw-r--r--source/gameengine/GameLogic/SCA_JoystickSensor.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_JoystickSensor.h4
-rw-r--r--source/gameengine/GameLogic/SCA_KeyboardSensor.cpp16
-rw-r--r--source/gameengine/GameLogic/SCA_KeyboardSensor.h2
-rw-r--r--source/gameengine/GameLogic/SCA_LogicManager.cpp2
-rw-r--r--source/gameengine/GameLogic/SCA_LogicManager.h1
-rw-r--r--source/gameengine/GameLogic/SCA_MouseSensor.cpp6
-rw-r--r--source/gameengine/GameLogic/SCA_MouseSensor.h2
-rw-r--r--source/gameengine/GameLogic/SCA_NANDController.cpp2
-rw-r--r--source/gameengine/GameLogic/SCA_NORController.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_ORController.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_PropertyActuator.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_PropertySensor.cpp6
-rw-r--r--source/gameengine/GameLogic/SCA_PropertySensor.h2
-rw-r--r--source/gameengine/GameLogic/SCA_PythonController.cpp32
-rw-r--r--source/gameengine/GameLogic/SCA_PythonController.h8
-rw-r--r--source/gameengine/GameLogic/SCA_PythonKeyboard.cpp6
-rw-r--r--source/gameengine/GameLogic/SCA_PythonKeyboard.h4
-rw-r--r--source/gameengine/GameLogic/SCA_PythonMouse.cpp6
-rw-r--r--source/gameengine/GameLogic/SCA_PythonMouse.h4
-rw-r--r--source/gameengine/GameLogic/SCA_RandomActuator.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_RandomActuator.h4
-rw-r--r--source/gameengine/GameLogic/SCA_RandomSensor.cpp6
-rw-r--r--source/gameengine/GameLogic/SCA_RandomSensor.h2
-rw-r--r--source/gameengine/GameLogic/SCA_XNORController.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_XORController.cpp4
-rw-r--r--source/gameengine/GameLogic/SConscript9
-rw-r--r--source/gameengine/GamePlayer/CMakeLists.txt10
-rw-r--r--source/gameengine/GamePlayer/Makefile57
-rw-r--r--source/gameengine/GamePlayer/common/CMakeLists.txt51
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RenderTools.cpp42
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RenderTools.h7
-rw-r--r--source/gameengine/GamePlayer/common/Makefile84
-rw-r--r--source/gameengine/GamePlayer/common/SConscript20
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp299
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_Engine.h61
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.cpp133
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.h61
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_PolygonMaterial.h53
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_System.cpp51
-rw-r--r--source/gameengine/GamePlayer/common/unix/Makefile70
-rw-r--r--source/gameengine/GamePlayer/common/windows/GPW_Canvas.cpp171
-rw-r--r--source/gameengine/GamePlayer/common/windows/GPW_Canvas.h115
-rw-r--r--source/gameengine/GamePlayer/common/windows/GPW_Engine.cpp112
-rw-r--r--source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.cpp283
-rw-r--r--source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.h66
-rw-r--r--source/gameengine/GamePlayer/common/windows/GPW_System.cpp88
-rw-r--r--source/gameengine/GamePlayer/common/windows/Makefile62
-rw-r--r--source/gameengine/GamePlayer/ghost/CMakeLists.txt38
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Application.cpp21
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_ghost.cpp41
-rw-r--r--source/gameengine/GamePlayer/ghost/Makefile86
-rw-r--r--source/gameengine/GamePlayer/ghost/SConscript6
-rw-r--r--source/gameengine/Ketsji/BL_Shader.cpp4
-rw-r--r--source/gameengine/Ketsji/BL_Shader.h2
-rw-r--r--source/gameengine/Ketsji/BL_Texture.cpp2
-rw-r--r--source/gameengine/Ketsji/CMakeLists.txt194
-rw-r--r--source/gameengine/Ketsji/KXNetwork/CMakeLists.txt24
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp6
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp6
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h4
-rw-r--r--source/gameengine/Ketsji/KXNetwork/Makefile48
-rw-r--r--source/gameengine/Ketsji/KXNetwork/SConscript3
-rw-r--r--source/gameengine/Ketsji/KX_ArmatureSensor.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_ArmatureSensor.h4
-rw-r--r--source/gameengine/Ketsji/KX_BlenderMaterial.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_BlenderMaterial.h4
-rw-r--r--source/gameengine/Ketsji/KX_BulletPhysicsController.cpp2
-rw-r--r--source/gameengine/Ketsji/KX_BulletPhysicsController.h5
-rw-r--r--source/gameengine/Ketsji/KX_Camera.cpp3
-rw-r--r--source/gameengine/Ketsji/KX_Camera.h4
-rw-r--r--source/gameengine/Ketsji/KX_CameraActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_CameraActuator.h4
-rw-r--r--source/gameengine/Ketsji/KX_ConstraintActuator.cpp2
-rw-r--r--source/gameengine/Ketsji/KX_ConstraintWrapper.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_ConstraintWrapper.h2
-rw-r--r--source/gameengine/Ketsji/KX_ConvertPhysicsObject.h13
-rw-r--r--source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_Dome.cpp182
-rw-r--r--source/gameengine/Ketsji/KX_FontObject.cpp157
-rw-r--r--source/gameengine/Ketsji/KX_FontObject.h80
-rw-r--r--source/gameengine/Ketsji/KX_GameActuator.cpp14
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.cpp56
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.h16
-rw-r--r--source/gameengine/Ketsji/KX_IpoActuator.cpp61
-rw-r--r--source/gameengine/Ketsji/KX_IpoActuator.h9
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.cpp41
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.h5
-rw-r--r--source/gameengine/Ketsji/KX_Light.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_Light.h2
-rw-r--r--source/gameengine/Ketsji/KX_MeshProxy.cpp6
-rw-r--r--source/gameengine/Ketsji/KX_MeshProxy.h4
-rw-r--r--source/gameengine/Ketsji/KX_MouseFocusSensor.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_MouseFocusSensor.h4
-rw-r--r--source/gameengine/Ketsji/KX_NavMeshObject.h6
-rw-r--r--source/gameengine/Ketsji/KX_NearSensor.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_NearSensor.h4
-rw-r--r--source/gameengine/Ketsji/KX_ObjectActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_ObjectActuator.h4
-rw-r--r--source/gameengine/Ketsji/KX_ParentActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_ParentActuator.h4
-rw-r--r--source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp2
-rw-r--r--source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h4
-rw-r--r--source/gameengine/Ketsji/KX_PolyProxy.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_PolyProxy.h4
-rw-r--r--source/gameengine/Ketsji/KX_PolygonMaterial.cpp48
-rw-r--r--source/gameengine/Ketsji/KX_PolygonMaterial.h7
-rw-r--r--source/gameengine/Ketsji/KX_PyConstraintBinding.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_PyConstraintBinding.h4
-rw-r--r--source/gameengine/Ketsji/KX_PyMath.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_PyMath.h16
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.cpp80
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.h5
-rw-r--r--source/gameengine/Ketsji/KX_PythonInitTypes.cpp6
-rw-r--r--source/gameengine/Ketsji/KX_PythonInitTypes.h2
-rw-r--r--source/gameengine/Ketsji/KX_PythonSeq.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_PythonSeq.h4
-rw-r--r--source/gameengine/Ketsji/KX_RadarSensor.cpp17
-rw-r--r--source/gameengine/Ketsji/KX_RaySensor.cpp17
-rw-r--r--source/gameengine/Ketsji/KX_RaySensor.h4
-rw-r--r--source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h4
-rw-r--r--source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp6
-rw-r--r--source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h4
-rw-r--r--source/gameengine/Ketsji/KX_Scene.cpp81
-rw-r--r--source/gameengine/Ketsji/KX_Scene.h34
-rw-r--r--source/gameengine/Ketsji/KX_SceneActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_SceneActuator.h4
-rw-r--r--source/gameengine/Ketsji/KX_SoundActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_SoundActuator.h4
-rw-r--r--source/gameengine/Ketsji/KX_StateActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_TouchEventManager.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_TouchSensor.cpp2
-rw-r--r--source/gameengine/Ketsji/KX_TouchSensor.h2
-rw-r--r--source/gameengine/Ketsji/KX_TrackToActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_TrackToActuator.h4
-rw-r--r--source/gameengine/Ketsji/KX_VehicleWrapper.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_VehicleWrapper.h4
-rw-r--r--source/gameengine/Ketsji/KX_VertexProxy.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_VertexProxy.h4
-rw-r--r--source/gameengine/Ketsji/KX_VisibilityActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_WorldInfo.h1
-rw-r--r--source/gameengine/Ketsji/Makefile78
-rw-r--r--source/gameengine/Ketsji/SConscript16
-rw-r--r--source/gameengine/Makefile44
-rw-r--r--source/gameengine/Network/CMakeLists.txt17
-rw-r--r--source/gameengine/Network/LoopBackNetwork/CMakeLists.txt12
-rw-r--r--source/gameengine/Network/LoopBackNetwork/Makefile41
-rw-r--r--source/gameengine/Network/LoopBackNetwork/SConscript2
-rw-r--r--source/gameengine/Network/Makefile48
-rw-r--r--source/gameengine/Network/SConscript8
-rw-r--r--source/gameengine/Network/TerraplayNetwork/Makefile42
-rw-r--r--source/gameengine/Physics/Bullet/CMakeLists.txt23
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.cpp18
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp5
-rw-r--r--source/gameengine/Physics/Bullet/Makefile55
-rw-r--r--source/gameengine/Physics/Bullet/SConscript11
-rw-r--r--source/gameengine/Physics/Dummy/CMakeLists.txt12
-rw-r--r--source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp3
-rw-r--r--source/gameengine/Physics/Dummy/Makefile45
-rw-r--r--source/gameengine/Physics/Dummy/SConscript8
-rw-r--r--source/gameengine/Physics/Makefile37
-rw-r--r--source/gameengine/Physics/common/CMakeLists.txt25
-rw-r--r--source/gameengine/Physics/common/Makefile57
-rw-r--r--source/gameengine/Physics/common/SConscript8
-rw-r--r--source/gameengine/PyDoc/bge.events.rst229
-rw-r--r--source/gameengine/PyDoc/bge.logic.rst932
-rw-r--r--source/gameengine/PyDoc/bge.render.rst242
-rw-r--r--source/gameengine/PyDoc/bge.types.rst5202
-rw-r--r--source/gameengine/Rasterizer/CMakeLists.txt51
-rw-r--r--source/gameengine/Rasterizer/Makefile57
-rw-r--r--source/gameengine/Rasterizer/RAS_2DFilterManager.cpp16
-rw-r--r--source/gameengine/Rasterizer/RAS_Deformer.h4
-rw-r--r--source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp5
-rw-r--r--source/gameengine/Rasterizer/RAS_IPolygonMaterial.h2
-rw-r--r--source/gameengine/Rasterizer/RAS_IRasterizer.h2
-rw-r--r--source/gameengine/Rasterizer/RAS_IRenderTools.h22
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt20
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile53
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp2
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp77
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h25
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript9
-rw-r--r--source/gameengine/Rasterizer/SConscript8
-rw-r--r--source/gameengine/SConscript4
-rw-r--r--source/gameengine/SceneGraph/CMakeLists.txt25
-rw-r--r--source/gameengine/SceneGraph/Makefile38
-rw-r--r--source/gameengine/SceneGraph/SConscript12
-rw-r--r--source/gameengine/VideoTexture/CMakeLists.txt58
-rw-r--r--source/gameengine/VideoTexture/FilterBlueScreen.cpp4
-rw-r--r--source/gameengine/VideoTexture/FilterBlueScreen.h2
-rw-r--r--source/gameengine/VideoTexture/FilterColor.cpp8
-rw-r--r--source/gameengine/VideoTexture/ImageBase.cpp6
-rw-r--r--source/gameengine/VideoTexture/ImageBuff.cpp8
-rw-r--r--source/gameengine/VideoTexture/ImageRender.cpp9
-rw-r--r--source/gameengine/VideoTexture/ImageRender.h2
-rw-r--r--source/gameengine/VideoTexture/ImageViewport.cpp4
-rw-r--r--source/gameengine/VideoTexture/Makefile68
-rw-r--r--source/gameengine/VideoTexture/PyTypeList.cpp8
-rw-r--r--source/gameengine/VideoTexture/PyTypeList.h3
-rw-r--r--source/gameengine/VideoTexture/SConscript5
-rw-r--r--source/gameengine/VideoTexture/VideoBase.cpp4
-rw-r--r--source/icons/Makefile36
-rw-r--r--source/kernel/CMakeLists.txt13
-rw-r--r--source/kernel/Makefile37
-rw-r--r--source/kernel/SConscript4
-rw-r--r--source/kernel/gen_messaging/Makefile34
-rw-r--r--source/kernel/gen_messaging/intern/Makefile40
-rw-r--r--source/kernel/gen_system/GEN_DataCache.h76
-rw-r--r--source/kernel/gen_system/GEN_Matrix4x4.cpp202
-rw-r--r--source/kernel/gen_system/GEN_Matrix4x4.h76
-rw-r--r--source/kernel/gen_system/GEN_SmartPtr.h233
-rw-r--r--source/kernel/gen_system/Makefile41
-rw-r--r--source/kernel/gen_system/SYS_SingletonSystem.cpp2
-rw-r--r--source/kernel/gen_system/SYS_SingletonSystem.h1
1477 files changed, 87700 insertions, 91045 deletions
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
index 1f1b1d883bc..1929f19f38f 100644
--- a/source/CMakeLists.txt
+++ b/source/CMakeLists.txt
@@ -24,13 +24,15 @@
#
# ***** END GPL LICENSE BLOCK *****
-ADD_SUBDIRECTORY(blender)
-ADD_SUBDIRECTORY(kernel)
+add_subdirectory(blender)
-IF(WITH_GAMEENGINE)
- ADD_SUBDIRECTORY(gameengine)
-ENDIF(WITH_GAMEENGINE)
+if(WITH_GAMEENGINE)
+ add_subdirectory(kernel)
+ add_subdirectory(gameengine)
+endif()
-IF(WINDOWS)
- ADD_SUBDIRECTORY(icons)
-ENDIF(WINDOWS)
+if(WINDOWS)
+ add_subdirectory(icons)
+endif()
+
+add_subdirectory(tests)
diff --git a/source/Makefile b/source/Makefile
deleted file mode 100644
index 1055c2a94e9..00000000000
--- a/source/Makefile
+++ /dev/null
@@ -1,631 +0,0 @@
-# -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*-
-# vim: tabstop=8
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): GSR
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Top level makefile. Start looping through subdirs and link....
-#
-
-ifndef NANENV
- export NANENV := $(shell env | grep NAN_)
-endif
-
-include nan_definitions.mk
-
-DIRS = creator blender kernel
-
-ifneq ($(NAN_NO_KETSJI),true)
- DIRS += gameengine
-endif
-
-ifeq ($(OS),windows)
- DIRS += icons
-endif
-
-########## buildinfo kludge ###################
-CPPFLAGS += -I../Physics/common
-CPPFLAGS += -I../Physics/Dummy
-ifdef NAN_BUILDINFO
- BUILDINFO_O = $(DIR)/$(DEBUG_DIR)buildinfo.o
- BUILDINFO_C = $(SRCHOME)/creator/buildinfo.c
- BUILD_DATE := $(shell date "+%Y-%m-%d")
- BUILD_TIME := $(shell date "+%H:%M:%S")
- BUILD_REV := $(shell svnversion)
-endif
-
-############# set pyplayerlib ##################
-
-
-############# libraries ##################
-# COMLIB COMmon LIBraries for all targets
-# BPLIB Browser Plugin LIBraries
-# SPLIB1 Standalone Player LIBraries (pre COMLIB)
-# SPLIB Standalone Player LIBraries (post COMLIB)
-# PULIB PUblisher LIBraries
-# GRPLIB Gui and Render LIBraries for Publisher
-# LLIBS dynamic system libraries
-# SADD Static OpenGL libraries
-# DADD Dynamic OpenGL libraries
-# NSPLUGLIB PLUGin LIBraries for ns-style api
-# PLUGAPPLIB libs that form the application to be plugged in
-# Note: the order is important here
-
-
-GRPLIB = $(OCGDIR)/creator/$(DEBUG_DIR)libcreator.a
-GRPLIB += $(OCGDIR)/blender/windowmanager/$(DEBUG_DIR)libwindowmanager.a
-GRPLIB += $(NAN_GHOST)/lib/$(DEBUG_DIR)libghost.a
-GRPLIB += $(NAN_STRING)/lib/$(DEBUG_DIR)libstring.a
-GRPLIB += $(OCGDIR)/blender/render/$(DEBUG_DIR)librender.a
-GRPLIB += $(OCGDIR)/blender/render/$(DEBUG_DIR)librender_raytrace.a
-
-# nlin: the reason that some libraries appear more than once below is
-# to handle circular dependencies in linking among libraries... some
-# linkers (e.g. under Linux) need libs to be specified multiple times
-# to properly resolve circular dependencies. ugly, but it works...
-# the repeat entries could probably be trimmed down.
-COMLIB = $(OCGDIR)/blender/blenkernel/$(DEBUG_DIR)libblenkernel.a
-COMLIB += $(OCGDIR)/blender/blenloader/$(DEBUG_DIR)libblenloader.a
-COMLIB += $(OCGDIR)/blender/blenpluginapi/$(DEBUG_DIR)libblenpluginapi.a
-COMLIB += $(OCGDIR)/blender/nodes_shd/$(DEBUG_DIR)libnodes_shd.a
-COMLIB += $(OCGDIR)/blender/nodes_cmp/$(DEBUG_DIR)libnodes_cmp.a
-COMLIB += $(OCGDIR)/blender/nodes_tex/$(DEBUG_DIR)libnodes_tex.a
-COMLIB += $(OCGDIR)/blender/nodes/$(DEBUG_DIR)libnodes.a
-COMLIB += $(OCGDIR)/blender/imbuf/$(DEBUG_DIR)libimbuf.a
-COMLIB += $(OCGDIR)/blender/ikplugin/$(DEBUG_DIR)libikplugin.a
-COMLIB += $(OCGDIR)/blender/modifiers/$(DEBUG_DIR)libmodifiers.a
-COMLIB += $(NAN_IKSOLVER)/lib/$(DEBUG_DIR)libiksolver.a
-COMLIB += $(NAN_ITASC)/lib/$(DEBUG_DIR)libitasc.a
-COMLIB += $(NAN_ITASC)/lib/$(DEBUG_DIR)libitasc_kdl.a
-COMLIB += $(NAN_ITASC)/lib/$(DEBUG_DIR)libitasc_kdl_util.a
-COMLIB += $(NAN_MOTO)/lib/$(DEBUG_DIR)libmoto.a
-COMLIB += $(NAN_SUPERLU)/lib/$(DEBUG_DIR)libsuperlu.a
-COMLIB += $(OCGDIR)/blender/avi/$(DEBUG_DIR)libavi.a
-COMLIB += $(NAN_JPEG)/lib/libjpeg.a
-COMLIB += $(OCGDIR)/blender/gpu/$(DEBUG_DIR)libgpu.a
-COMLIB += $(NAN_GLEW)/lib/$(DEBUG_DIR)libglew.a
-COMLIB += $(OCGDIR)/blender/blenfont/$(DEBUG_DIR)libblenfont.a
-COMLIB += $(OCGDIR)/blender/python/$(DEBUG_DIR)libpython.a
-COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaudaspace.a
-COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_python.a
-COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaudaspace.a
-COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_src.a
-COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_fx.a
-COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_sdl.a
-ifeq ($(WITH_FFMPEG),true)
- COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_ffmpeg.a
-endif
-ifeq ($(WITH_OPENAL),true)
- COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_openal.a
-endif
-ifeq ($(WITH_JACK),true)
- COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_jack.a
-endif
-ifeq ($(WITH_SNDFILE),true)
- COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_sndfile.a
-endif
-ifeq ($(WITH_FFTW3),true)
- COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_fftw.a
-endif
-COMLIB += $(NAN_SAMPLERATE)/lib/$(DEBUG_DIR)libsamplerate.a
-COMLIB += $(NAN_LZO)/lib/$(DEBUG_DIR)libminilzo.a
-COMLIB += $(NAN_LZMA)/lib/$(DEBUG_DIR)liblzma.a
-COMLIB += $(NAN_BSP)/lib/$(DEBUG_DIR)libbsp.a
-COMLIB += $(NAN_BOOLOP)/lib/$(DEBUG_DIR)libboolop.a
-COMLIB += $(NAN_MOTO)/lib/$(DEBUG_DIR)libmoto.a
-COMLIB += $(NAN_DECIMATION)/lib/$(DEBUG_DIR)libdecimation.a
-COMLIB += $(NAN_GHOST)/lib/$(DEBUG_DIR)libghost.a
-
-
-ifneq ($(NAN_NO_KETSJI),true)
- COMLIB += $(OCGDIR)/gameengine/bloutines/$(DEBUG_DIR)libbloutines.a
- COMLIB += $(OCGDIR)/gameengine/blconverter/$(DEBUG_DIR)libblconverter.a
- COMLIB += $(OCGDIR)/gameengine/blphys/common/$(DEBUG_DIR)libcommon.a
- COMLIB += $(OCGDIR)/gameengine/ketsji/$(DEBUG_DIR)libketsji.a
- COMLIB += $(OCGDIR)/gameengine/blconverter/$(DEBUG_DIR)libblconverter.a
- COMLIB += $(OCGDIR)/gameengine/blconverter/$(DEBUG_DIR)libblconverter.a
- COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a
- COMLIB += $(OCGDIR)/gameengine/blphys/common/$(DEBUG_DIR)libcommon.a
- COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a
- COMLIB += $(OCGDIR)/gameengine/ketsji/$(DEBUG_DIR)libketsji.a
- COMLIB += $(OCGDIR)/gameengine/blphys/common/$(DEBUG_DIR)libcommon.a
- COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a
- COMLIB += $(OCGDIR)/gameengine/blphys/blbullet/$(DEBUG_DIR)libblbullet.a
- COMLIB += $(OCGDIR)/gameengine/blphys/common/$(DEBUG_DIR)libcommon.a
- COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a
- COMLIB += $(OCGDIR)/gameengine/ketsji/$(DEBUG_DIR)libketsji.a
- COMLIB += $(OCGDIR)/gameengine/logic/$(DEBUG_DIR)liblogic.a
- COMLIB += $(OCGDIR)/gameengine/logic/Joystick/$(DEBUG_DIR)libJoystick.a
- COMLIB += $(OCGDIR)/gameengine/rasterizer/$(DEBUG_DIR)librasterizer.a
- COMLIB += $(OCGDIR)/gameengine/OpenGLrasterizer/$(DEBUG_DIR)libOpenGLrasterizer.a
- COMLIB += $(OCGDIR)/gameengine/expression/$(DEBUG_DIR)libexpression.a
- COMLIB += $(OCGDIR)/gameengine/scenegraph/$(DEBUG_DIR)libscenegraph.a
- COMLIB += $(OCGDIR)/gameengine/videotex/$(DEBUG_DIR)libvideotex.a
- COMLIB += $(NAN_MOTO)/lib/libmoto.a
- COMLIB += $(NAN_SND_LIBS)
- COMLIB += $(OCGDIR)/kernel/gen_system/$(DEBUG_DIR)libgen_system.a
- COMLIB += $(OCGDIR)/kernel/gen_messaging/$(DEBUG_DIR)libgen_messaging.a
- COMLIB += $(OCGDIR)/gameengine/ketsji/KXNetwork/$(DEBUG_DIR)libKXNetwork.a
- COMLIB += $(OCGDIR)/gameengine/Network/$(DEBUG_DIR)libNetwork.a
- COMLIB += $(OCGDIR)/gameengine/Network/LoopBackNetwork/$(DEBUG_DIR)libLoopBackNetwork.a
- COMLIB += $(NAN_BULLET2)/lib/libbullet2.a
-endif
-
-# Cloth requires bullet2, gameegine does not matter anymore
-#COMLIB += $(NAN_BULLET2)/lib/libbullet2.a
-
-COMLIB += $(OCGDIR)/blender/makesdna/$(DEBUG_DIR)libdna.a
-COMLIB += $(NAN_GUARDEDALLOC)/lib/libguardedalloc.a
-COMLIB += $(NAN_MEMUTIL)/lib/libmemutil.a
-COMLIB += $(NAN_PNG)/lib/libpng.a
-COMLIB += $(OCGDIR)/blender/python/$(DEBUG_DIR)libpython.a # This was a PULIB up to circa r25248
-COMLIB += $(OCGDIR)/blender/gen_python/$(DEBUG_DIR)libgen_python.a
-COMLIB += $(OCGDIR)/blender/blenlib/$(DEBUG_DIR)libblenlib.a
-
-
-ifeq ($(WITH_QUICKTIME), true)
- COMLIB += $(OCGDIR)/blender/blenderqt/$(DEBUG_DIR)libblenderqt.a
-endif
-
-ifeq ($(WITH_OPENEXR), true)
- COMLIB += $(OCGDIR)/blender/imbuf/openexr/$(DEBUG_DIR)libopenexr.a
-endif
-
-ifeq ($(WITH_OPENJPEG), true)
- ifndef BF_OPENJPEG_LIBS
- COMLIB += $(OCGDIR)/extern/openjpeg/$(DEBUG_DIR)libopenjpeg.a
- else
- COMLIB += $(BF_OPENJPEG_LIBS)
- endif
-endif
-
-ifeq ($(WITH_CINEON), true)
- COMLIB += $(OCGDIR)/blender/imbuf/cineon/$(DEBUG_DIR)libcineon.a
-endif
-
-ifeq ($(WITH_DDS), true)
- COMLIB += $(OCGDIR)/blender/imbuf/dds/$(DEBUG_DIR)libdds.a
-endif
-
-ifeq ($(WITH_BINRELOC), true)
- COMLIB += $(OCGDIR)/extern/binreloc/$(DEBUG_DIR)libbinreloc.a
-endif
-
-ifeq ($(WITH_OPENCOLLADA), true)
- COMLIB += $(OCGDIR)/blender/bf_collada/$(DEBUG_DIR)/libbf_collada.a
- COMLIB += $(BF_PCRE_LIBS)
-endif
-
-ifeq ($(OS), windows)
- ifeq ($(FREE_WINDOWS), true)
- COMLIB += $(NAN_FREETYPE)/lib/libfreetype.a
- else
- COMLIB += $(NAN_FREETYPE)/lib/freetype2ST.lib
- endif
-else
- ifeq ($(OS), irix)
- COMLIB += $(NAN_FREETYPE)/lib/libfreetype.a
- else
- COMLIB += $(NAN_FREETYPE)/lib/libfreetype.a
- endif
-endif
-
-ifeq ($(OS), irix)
- COMLIB += $(NAN_SDL)/lib/libSDL.a
-endif
-
-ifeq ($(OS), windows)
- ifeq ($(FREE_WINDOWS), true)
- COMLIB += $(NAN_SDL)/lib/libSDL.a
- COMLIB += $(NAN_PTHREADS)/lib/libpthreadGC2.a
- else
- COMLIB += $(NAN_SDL)/lib/SDL.lib
- endif
-endif
-
-ifeq ($(WITH_OPENEXR), true)
- COMLIB += $(NAN_OPENEXR_LIBS)
-endif
-
-# note: space_api.a in begin of editors, screen.a in end
-PULIB = $(NAN_MOTO)/lib/libmoto.a
-PULIB += $(OCGDIR)/blender/readblenfile/$(DEBUG_DIR)libreadblenfile.a
-PULIB += $(OCGDIR)/blender/ed_space/$(DEBUG_DIR)libed_space.a
-PULIB += $(OCGDIR)/blender/ed_sound/$(DEBUG_DIR)libed_sound.a
-PULIB += $(OCGDIR)/blender/ed_action/$(DEBUG_DIR)libed_action.a
-PULIB += $(OCGDIR)/blender/ed_nla/$(DEBUG_DIR)libed_nla.a
-PULIB += $(OCGDIR)/blender/ed_script/$(DEBUG_DIR)libed_script.a
-PULIB += $(OCGDIR)/blender/ed_text/$(DEBUG_DIR)libed_text.a
-PULIB += $(OCGDIR)/blender/ed_logic/$(DEBUG_DIR)libed_logic.a
-PULIB += $(OCGDIR)/blender/ed_sequencer/$(DEBUG_DIR)libed_sequencer.a
-PULIB += $(OCGDIR)/blender/ed_file/$(DEBUG_DIR)libed_file.a
-PULIB += $(OCGDIR)/blender/ed_info/$(DEBUG_DIR)libed_info.a
-PULIB += $(OCGDIR)/blender/ed_buttons/$(DEBUG_DIR)libed_buttons.a
-PULIB += $(OCGDIR)/blender/ed_graph/$(DEBUG_DIR)libed_graph.a
-PULIB += $(OCGDIR)/blender/ed_node/$(DEBUG_DIR)libed_node.a
-PULIB += $(OCGDIR)/blender/ed_outliner/$(DEBUG_DIR)libed_outliner.a
-PULIB += $(OCGDIR)/blender/ed_time/$(DEBUG_DIR)libed_time.a
-PULIB += $(OCGDIR)/blender/ed_render/$(DEBUG_DIR)libed_render.a
-PULIB += $(OCGDIR)/blender/ed_view3d/$(DEBUG_DIR)libed_view3d.a
-PULIB += $(OCGDIR)/blender/ed_interface/$(DEBUG_DIR)libed_interface.a
-PULIB += $(OCGDIR)/blender/ed_object/$(DEBUG_DIR)libed_object.a
-PULIB += $(OCGDIR)/blender/ed_curve/$(DEBUG_DIR)libed_curve.a
-PULIB += $(OCGDIR)/blender/ed_metaball/$(DEBUG_DIR)libed_metaball.a
-PULIB += $(OCGDIR)/blender/ed_armature/$(DEBUG_DIR)libed_armature.a
-PULIB += $(OCGDIR)/blender/ed_mesh/$(DEBUG_DIR)libed_mesh.a
-PULIB += $(OCGDIR)/blender/ed_sculpt_paint/$(DEBUG_DIR)libed_sculpt_paint.a
-PULIB += $(OCGDIR)/blender/ed_physics/$(DEBUG_DIR)libed_physics.a
-PULIB += $(OCGDIR)/blender/ed_animation/$(DEBUG_DIR)libed_animation.a
-PULIB += $(OCGDIR)/blender/ed_transform/$(DEBUG_DIR)libed_transform.a
-PULIB += $(OCGDIR)/blender/ed_util/$(DEBUG_DIR)libed_util.a
-PULIB += $(OCGDIR)/blender/ed_datafiles/$(DEBUG_DIR)libed_datafiles.a
-PULIB += $(OCGDIR)/blender/ed_image/$(DEBUG_DIR)libed_image.a
-PULIB += $(OCGDIR)/blender/ed_uvedit/$(DEBUG_DIR)libed_uvedit.a
-PULIB += $(OCGDIR)/blender/ed_screen/$(DEBUG_DIR)libed_screen.a
-PULIB += $(OCGDIR)/blender/ed_console/$(DEBUG_DIR)libed_console.a
-PULIB += $(OCGDIR)/blender/ed_userpref/$(DEBUG_DIR)libed_userpref.a
-PULIB += $(OCGDIR)/blender/ed_gpencil/$(DEBUG_DIR)libed_gpencil.a
-PULIB += $(OCGDIR)/blender/ed_opsound/$(DEBUG_DIR)libed_opsound.a
-PULIB += $(OCGDIR)/blender/windowmanager/$(DEBUG_DIR)libwindowmanager.a
-PULIB += $(OCGDIR)/blender/makesrna/$(DEBUG_DIR)librna.a
-# note, no idea but it suddenly doesn't compile :(
-PULIB += $(OCGDIR)/blender/blenlib/$(DEBUG_DIR)libblenlib.a
-PULIB += $(NAN_OPENNL)/lib/$(DEBUG_DIR)libopennl.a
-PULIB += $(NAN_ELBEEM)/lib/$(DEBUG_DIR)libelbeem.a
-PULIB += $(NAN_SMOKE)/lib/$(DEBUG_DIR)libsmoke.a
-
-ifeq ($(NAN_NO_KETSJI),true)
- PULIB += $(NAN_MOTO)/lib/$(DEBUG_DIR)libmoto.a
- PULIB += $(OCGDIR)/kernel/gen_system/$(DEBUG_DIR)libgen_system.a
- PULIB += $(OCGDIR)/kernel/gen_messaging/$(DEBUG_DIR)libgen_messaging.a
- COMLIB += $(NAN_SND_LIBS)
-endif
-
-SPLIB1 = $(OCGDIR)/gameengine/GamePlayer/ghost/$(DEBUG_DIR)libghost.a
-SPLIB1 += $(OCGDIR)/gameengine/GamePlayer/common/$(DEBUG_DIR)libcommon.a
-SPLIB1 += $(OCGDIR)/gameengine/blconverter/$(DEBUG_DIR)libblconverter.a
-SPLIB1 += $(NAN_STRING)/lib/$(DEBUG_DIR)libstring.a
-SPLIB1 += $(NAN_GHOST)/lib/$(DEBUG_DIR)libghost.a
-
-SPLIB = $(OCGDIR)/blender/readblenfile/$(DEBUG_DIR)libreadblenfile.a
-# this is used for the plugin. It uses some things from libz.a,
-# but somehow it consistently fails to resolve these symbols... or
-# can I just not check them? nm claims they aren't...
-SPLIB += $(OCGDIR)/blender/blenkernel/blenkernel_blc/$(DEBUG_DIR)libblenkernel_blc.a
-SPLIB += $(OCGDIR)/blender/makesrna/$(DEBUG_DIR)librna.a
-SPLIB += $(OCGDIR)/blender/blenlib/$(DEBUG_DIR)libblenlib.a
-
-# These three need to be explicitly mentioned on the cl, because
-# if they are offered as a lib, they are optimized away. (nzc)
-NSPLUGLIB = $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)UnixShell.o
-NSPLUGLIB += $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)stubs.o
-NSPLUGLIB += $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)winstubs.o
-NSPLUGLIB += $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)Blender3DPlugin_native_implementation.o
-
-# Here you can configure what sort of test to make for the plugin.
-# PLUGTESTLIB = $(OCGDIR)/gameengine/GamePlayer/netscape/test/$(DEBUG_DIR)libns_api_test_stub.a
-# PLUGTESTLIB = $(OCGDIR)/gameengine/GamePlayer/netscape/test/$(DEBUG_DIR)libns_api_test_colorcycle.a
-# PLUGTESTLIB = $(OCGDIR)/gameengine/GamePlayer/netscape/test/$(DEBUG_DIR)libns_api_test_gears.a
-PLUGTESTLIB = $(OCGDIR)/gameengine/GamePlayer/netscape/test/$(DEBUG_DIR)libns_api_test_threaded_gears.a
-
-# XPCOM is done only for Linux for now
-ifeq ($(OS),$(findstring $(OS), "linux"))
- ifeq ($(CPU),i386)
- NSPLUGLIB += $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)XPH_xpcom_hooks.o
- endif
-endif
-
-PLUGAPPLIB = $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)libplugin_ketsji_hooks.a
-
-ifeq ($(OS),$(findstring $(OS), "freebsd linux irix solaris"))
- NSPLUGLIB += $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)PLG_X11_windowing.o
- PLUGAPPLIB += $(OCGDIR)/gameengine/GamePlayer/common/unix/$(DEBUG_DIR)libunix.a
-endif
-ifeq ($(OS),$(findstring $(OS), "windows"))
- NSPLUGLIB += $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)PLG_MSWindows_windowing.o
- NSPLUGLIB += $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)npB3DPlg.res
- PLUGAPPLIB += $(OCGDIR)/gameengine/GamePlayer/common/windows/$(DEBUG_DIR)libwindows.a
-endif
-
-PLUGAPPLIB += $(OCGDIR)/gameengine/GamePlayer/common/$(DEBUG_DIR)libcommon.a
-
-ifeq ($(OS),$(findstring $(OS), "linux"))
- ifeq ($(CPU),i386)
- PLUGAPPLIB_XPLINK = $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)_Blender3DPlugin_implementation_.o
- endif
-endif
-
-# A bit silly... but needed to resolve symbols.
-PLUGREMLIB = $(NAN_STRING)/lib/$(DEBUG_DIR)libstring.a
-
-######################## OS dependencies (alphabetic!) ################
-
-include nan_link.mk
-
-ifeq ($(NAN_JUST_BLENDERDYNAMIC),true)
- BINTARGETS = blenderdynamic
-endif
-
-ifeq ($(WITH_BF_DYNAMICOPENGL), true)
- BINTARGETS += blenderdynamic
-endif
-
-ifeq ($(WITH_BF_STATICOPENGL), true)
- BINTARGETS += blenderstatic
-endif
-
-ifeq ($(WITH_BF_BLENDERPLAYER), true)
- export WITH_BF_GAMEENGINE=true
- BINTARGETS += blenderplayer
-endif
-
-ifeq ($(WITH_BF_WEBPLUGIN), true)
- BINTARGETS += plugin
- ifeq ($(OS),linux)
- ifeq ($(CPU),i386)
- BINTARGETS += xplink
- endif
- endif
-endif
-
-ifeq ($(WITH_OPENAL),true)
- ifeq ($(OS),$(findstring $(OS), "freebsd linux windows"))
- ifeq ($(CPU),$(findstring $(CPU), "i386 powerpc x86_64 parisc64"))
- NAN_SND_LIBS += $(NAN_OPENAL)/lib/libopenal.a
- else
- ifeq ($(OS),windows)
- NAN_SND_LIBS += $(NAN_OPENAL)/lib/openal_static.lib
- endif
- endif
- else
- ifeq ($(OS),darwin)
- NAN_SND_LIBS += $(NAN_OPENAL)/lib/libopenal.a
- else
- ifeq ($(OS), solaris)
- NAN_SND_LIBS += $(NAN_OPENAL)/lib/libopenal.a
- endif
- endif
- endif
-endif
-
-ifeq ($(WITH_JACK),true)
- ifeq ($(OS),$(findstring $(OS), "linux"))
- NAN_SND_LIBS += $(NAN_JACKLIBS)
- endif
-endif
-
-ifeq ($(WITH_SNDFILE),true)
- ifeq ($(OS),$(findstring $(OS), "linux darwin"))
- NAN_SND_LIBS += $(NAN_SNDFILELIBS)
- endif
-endif
-
-ifeq ($(OS),windows)
-
- # Might need to change this to $(NAN_MOZILLA_LIB)/nspr4.lib
- NSPLUGLIB += $(NAN_NSPR)/lib/nspr4.lib
-
- BINTARGETS = blenderdynamic
- ifeq ($(FREE_WINDOWS),true)
- ifneq ($(NAN_NO_KETSJI),true)
- BINTARGETS += blenderplayer
- endif
- else
- BINTARGETS += blenderplayer
- BINTARGETS += blenderdynplayer
- BINTARGETS += plugin
- endif
-
- PULIB += $(OCGDIR)/blender/icons/$(DEBUG_DIR)winblender.res
- PULIB += $(NAN_ZLIB)/lib/libz.a
- SPLIB += $(OCGDIR)/blender/icons/$(DEBUG_DIR)winblender.res
- SPLIB += $(NAN_ZLIB)/lib/libz.a
-endif
-
-
-# prepare for NAN_BUILDINFO compile at the *sigh* link rules below
-
-ifdef NAN_BUILDINFO
- CSRCS =
- ALLTARGETS =
- include nan_compile.mk
-endif
-
-################## target rules ########################
-
-all debug ::
- @echo "****> Make $@ by $(ID)@$(HOST) at $(MAKE_START) on $(CONFIG_GUESS)"
-ifdef NANENV
- @for n in $(NANENV); do \
- echo " $$n"; \
- done
-endif
-
-DIR = $(OCGDIR)
-SOURCEDIR = source
-
-include nan_subdirs.mk
-
-################## target rules ########################
-
-all:: link
-
-debug debuglink::
- @$(MAKE) link DEBUG_DIR="debug/" NANENV=$(NANENV)
-
-clean:: linkclean debuglinkclean
-
-link: $(BINTARGETS)
- @echo "****> Build SVN rev $(BUILD_REV), $(MAKE_START) - `date '+%H:%M:%S %d-%b-%Y'`"
-ifdef NANENV
- @for n in $(NANENV); do \
- echo " $$n"; \
- done
-endif
-
-linkclean:
- @$(RM) -r $(DIR)/blenderstatic* \
- $(DIR)/blenderplayer* \
- $(DIR)/bin/*
-
-debuglinkclean:
- @$(RM) -r $(DIR)/debug/blenderstatic* \
- $(DIR)/debug/blenderplayer* \
- $(DIR)/debug/bin/*
-
-# Shortcut for Tinderbox release builds. Mortals don't use this.
-release:
- @$(MAKE) -C ../release/ all || exit 1;
-
-############### Linker rules ###############
-
-blenderstatic: $(DIR)/$(DEBUG_DIR)bin/blenderstatic
-blenderdynamic: $(DIR)/$(DEBUG_DIR)bin/blender$(EXT)
-blenderplayer: $(DIR)/$(DEBUG_DIR)bin/blenderplayer$(EXT)
-blenderdynplayer: $(DIR)/$(DEBUG_DIR)bin/blenderdynplayer$(EXT)
-
-# XPCOM connector only for linux so far...
-ifeq ($(OS),linux)
- xplink: $(DIR)/$(DEBUG_DIR)bin/Blender3DPlugin$(SOEXT)
-endif
-
-# Moz/NS plugin:
-ifeq ($(OS),$(findstring $(OS), "freebsd linux irix solaris"))
- plugin: $(DIR)/$(DEBUG_DIR)bin/npBlender3DPlugin$(SOEXT)
- ptest: $(DIR)/$(DEBUG_DIR)bin/npTestPlugin$(SOEXT)
-endif
-# Windows needs a 8.3 name... Why? Dunno...
-ifeq ($(OS),windows)
- ifneq ($(FREE_WINDOWS),true)
- plugin: $(DIR)/$(DEBUG_DIR)npB3DPlg$(SOEXT)
- endif
-endif
-
-$(DIR)/$(DEBUG_DIR)bin/blenderstatic: $(OBJS) $(GRPLIB) $(PULIB) $(COMLIB)
- @echo "****> Link $@"
-ifdef NAN_BUILDINFO
- $(CCC) $(CCFLAGS) $(REL_CCFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"static"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
-endif
- mkdir -p $(DIR)/$(DEBUG_DIR)bin
- $(CCC) $(CCFLAGS) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)bin/blenderstatic $(BUILDINFO_O) $(OBJS) $(GRPLIB) $(PULIB) $(COMLIB) $(LLIBS) $(SADD) $(LOPTS)
-ifdef NAN_BUILDINFO
- /bin/rm $(BUILDINFO_O)
-endif
-ifeq ($(OS), darwin)
- @$(MAKE) -C darwin/ APPLICATION=blenderstatic
-endif
-
-$(DIR)/$(DEBUG_DIR)bin/blender$(EXT): $(OBJS) $(GRPLIB) $(PULIB) $(COMLIB)
- @echo "****> Link $@"
-ifdef NAN_BUILDINFO
- $(CCC) $(CCFLAGS) $(REL_CCFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
-endif
- mkdir -p $(DIR)/$(DEBUG_DIR)bin
- $(CCC) $(CCFLAGS) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)bin/blender$(EXT) $(BUILDINFO_O) $(OBJS) $(GRPLIB) $(PULIB) $(COMLIB) $(LLIBS) $(DADD) $(LOPTS)
-ifdef NAN_BUILDINFO
- /bin/rm $(BUILDINFO_O)
-endif
-ifeq ($(OS), darwin)
- @$(MAKE) -C darwin/ APPLICATION=blender
-endif
-
-$(DIR)/$(DEBUG_DIR)bin/blenderplayer$(EXT): $(OBJS) $(SPLIB1) $(COMLIB) $(SPLIB)
- @echo "****> Link $@"
-ifdef NAN_BUILDINFO
- $(CCC) $(CCFLAGS) $(REL_CCFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
-endif
- mkdir -p $(DIR)/$(DEBUG_DIR)bin
- $(CCC) $(CCFLAGS) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)bin/blenderplayer$(EXT) $(BUILDINFO_O) $(OBJS) $(SPLIB1) $(COMLIB) $(SPLIB) $(LLIBS) $(DADD) $(LOPTS)
-ifdef NAN_BUILDINFO
- /bin/rm $(BUILDINFO_O)
-endif
-ifeq ($(OS), darwin)
- @$(MAKE) -C darwin/ APPLICATION=blenderplayer
-endif
-
-$(DIR)/$(DEBUG_DIR)bin/blenderdynplayer$(EXT): $(OBJS) $(COMLIB) $(SPLIB)
- @echo "****> Link $@"
-ifdef NAN_BUILDINFO
- $(CCC) $(CCFLAGS) $(REL_CCFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
-endif
- mkdir -p $(DIR)/$(DEBUG_DIR)bin
- $(CCC) $(CCFLAGS) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)bin/blenderdynplayer$(EXT) $(BUILDINFO_O) $(OBJS) $(SPLIB1) $(COMLIB) $(SPLIB) $(LLIBS) $(DADD) $(LOPTS)
-ifdef NAN_BUILDINFO
- /bin/rm $(BUILDINFO_O)
-endif
-ifeq ($(OS), darwin)
- @$(MAKE) -C darwin/ APPLICATION=blenderplayer
-endif
-
-$(DIR)/$(DEBUG_DIR)bin/Blender3DPlugin$(SOEXT): $(PLUGAPPLIB_XPLINK)
- @echo "****> Link $@"
-ifdef NAN_BUILDINFO
- $(CCC) $(CCFLAGS) $(REL_CCFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
-endif
- mkdir -p $(DIR)/$(DEBUG_DIR)bin
- $(CCC) $(CCFLAGS) $(DYNLDFLAGS) -o $@ $(PLUGAPPLIB_XPLINK) $(LOPTS)
-ifdef NAN_BUILDINFO
- /bin/rm $(BUILDINFO_O)
-endif
-
-# Windows build needs a def file? Why? For exposing functions from the
-# dll to the outside world. However, this is alsi done internally..
-DEFFILE = ./gameengine/GamePlayer/netscape/src/npB3DPlg.def
-
-# Windows needs a specific name format for dll.s so we give it one.
-$(DIR)/$(DEBUG_DIR)npB3DPlg$(SOEXT): $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB)
- @echo "****> Link $@"
-ifdef NAN_BUILDINFO
- $(CCC) $(CCFLAGS) $(REL_CCFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
-endif
-# $(CCC) $(DYNLDFLAGS) -o $@ $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB) $(PLUGREMLIB) $(LLIBS) $(DADD) $(LOPTS)
- $(CCC) $(DYNLDFLAGS) -o $@ $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB) $(PLUGREMLIB) $(LLIBS) $(DADD) $(LOPTS) /def:$(DEFFILE)
-ifdef NAN_BUILDINFO
- /bin/rm $(BUILDINFO_O)
-endif
-
-$(DIR)/$(DEBUG_DIR)bin/npBlender3DPlugin$(SOEXT): $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB)
- @echo "****> Link $@"
-ifdef NAN_BUILDINFO
- $(CCC) $(CCFLAGS) $(REL_CCFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
-endif
- mkdir -p $(DIR)/$(DEBUG_DIR)bin
- $(CCC) $(DYNLDFLAGS) -o $@ $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB) $(PLUGREMLIB) $(LLIBS) $(DADD) $(LOPTS)
-ifdef NAN_BUILDINFO
- /bin/rm $(BUILDINFO_O)
-endif
-
-$(DIR)/$(DEBUG_DIR)bin/npTestPlugin$(SOEXT): $(NSPLUGLIB)
- @echo "****> Link $@"
-ifdef NAN_BUILDINFO
- $(CCC) $(CCFLAGS) $(REL_CCFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
-endif
- mkdir -p $(DIR)/$(DEBUG_DIR)bin
- $(CCC) $(DYNLDFLAGS) -o $@ $(NSPLUGLIB) $(PLUGTESTLIB) $(LLIBS) $(DADD) $(LOPTS)
-ifdef NAN_BUILDINFO
- /bin/rm $(BUILDINFO_O)
-endif
diff --git a/source/SConscript b/source/SConscript
index c452f21b8e2..8d08d9cca08 100644
--- a/source/SConscript
+++ b/source/SConscript
@@ -1,11 +1,10 @@
#!/usr/bin/python
Import ('env')
-SConscript(['blender/SConscript',
- 'kernel/SConscript',
- 'creator/SConscript'])
+SConscript(['blender/SConscript', 'creator/SConscript'])
+
if env['WITH_BF_GAMEENGINE']:
- SConscript (['gameengine/SConscript'])
+ SConscript (['kernel/SConscript', 'gameengine/SConscript'])
if env['WITH_BF_PLAYER']:
SConscript (['blenderplayer/bad_level_call_stubs/SConscript'])
diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt
index 96d1ce3e8b2..c1696b14232 100644
--- a/source/blender/CMakeLists.txt
+++ b/source/blender/CMakeLists.txt
@@ -24,45 +24,45 @@
#
# ***** END GPL LICENSE BLOCK *****
-ADD_SUBDIRECTORY(windowmanager)
-ADD_SUBDIRECTORY(editors)
-ADD_SUBDIRECTORY(avi)
-ADD_SUBDIRECTORY(nodes)
-ADD_SUBDIRECTORY(blenkernel)
-ADD_SUBDIRECTORY(modifiers)
-ADD_SUBDIRECTORY(blenlib)
-ADD_SUBDIRECTORY(blenloader)
-ADD_SUBDIRECTORY(blenpluginapi)
-ADD_SUBDIRECTORY(imbuf)
-ADD_SUBDIRECTORY(gpu)
-ADD_SUBDIRECTORY(makesdna)
-ADD_SUBDIRECTORY(makesrna)
-ADD_SUBDIRECTORY(readblenfile)
-ADD_SUBDIRECTORY(render)
-ADD_SUBDIRECTORY(blenfont)
-ADD_SUBDIRECTORY(ikplugin)
+add_subdirectory(editors)
+add_subdirectory(windowmanager)
+add_subdirectory(blenkernel)
+add_subdirectory(blenlib)
+add_subdirectory(render)
+add_subdirectory(blenfont)
+add_subdirectory(blenloader)
+add_subdirectory(readblenfile)
+add_subdirectory(blenpluginapi)
+add_subdirectory(ikplugin)
+add_subdirectory(gpu)
+add_subdirectory(imbuf)
+add_subdirectory(avi)
+add_subdirectory(nodes)
+add_subdirectory(modifiers)
+add_subdirectory(makesdna)
+add_subdirectory(makesrna)
-IF(WITH_IMAGE_OPENEXR)
- ADD_SUBDIRECTORY(imbuf/intern/openexr)
-ENDIF(WITH_IMAGE_OPENEXR)
+if(WITH_IMAGE_OPENEXR)
+ add_subdirectory(imbuf/intern/openexr)
+endif()
-IF(WITH_IMAGE_DDS)
- ADD_SUBDIRECTORY(imbuf/intern/dds)
-ENDIF(WITH_IMAGE_DDS)
+if(WITH_IMAGE_DDS)
+ add_subdirectory(imbuf/intern/dds)
+endif()
-IF(WITH_IMAGE_CINEON)
- ADD_SUBDIRECTORY(imbuf/intern/cineon)
-ENDIF(WITH_IMAGE_CINEON)
+if(WITH_IMAGE_CINEON)
+ add_subdirectory(imbuf/intern/cineon)
+endif()
-IF(WITH_QUICKTIME)
- ADD_SUBDIRECTORY(quicktime)
-ENDIF(WITH_QUICKTIME)
+if(WITH_CODEC_QUICKTIME)
+ add_subdirectory(quicktime)
+endif()
-IF(WITH_PYTHON)
- ADD_SUBDIRECTORY(python)
-ENDIF(WITH_PYTHON)
+if(WITH_PYTHON)
+ add_subdirectory(python)
+endif()
-IF(WITH_OPENCOLLADA)
- ADD_SUBDIRECTORY(collada)
-ENDIF(WITH_OPENCOLLADA)
+if(WITH_OPENCOLLADA)
+ add_subdirectory(collada)
+endif()
diff --git a/source/blender/Makefile b/source/blender/Makefile
deleted file mode 100644
index 8052c175f8e..00000000000
--- a/source/blender/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-include nan_definitions.mk
-
-DIRS = windowmanager editors blenloader readblenfile
-DIRS += avi imbuf render blenlib blenkernel blenpluginapi
-DIRS += makesdna makesrna
-DIRS += python nodes modifiers gpu
-DIRS += blenfont ikplugin
-
-ifeq ($(WITH_QUICKTIME), true)
- DIRS += quicktime
-endif
-
-ifeq ($(WITH_OPENJPEG), true)
- CFLAGS += -DWITH_OPENJPEG -I../../../../extern/libopenjpeg
-endif
-
-ifeq ($(WITH_OPENCOLLADA), true)
- DIRS += collada
-endif
-
-
-DIR = $(OCGDIR)/blender
-SOURCEDIR = source/blender
-TESTDIRS = deflate streamglue
-
-include nan_subdirs.mk
diff --git a/source/blender/avi/AVI_avi.h b/source/blender/avi/AVI_avi.h
index 2e71bd98309..90fa7705598 100644
--- a/source/blender/avi/AVI_avi.h
+++ b/source/blender/avi/AVI_avi.h
@@ -232,7 +232,7 @@ typedef enum {
/**
* Test whether this is an avi-format.
*/
-int AVI_is_avi (char *name);
+int AVI_is_avi (const char *name);
/**
@@ -277,7 +277,7 @@ int AVI_get_stream (AviMovie *movie, int avist_type, int stream_num);
/**
* Open a movie stream from file.
*/
-AviError AVI_open_movie (char *name, AviMovie *movie);
+AviError AVI_open_movie (const char *name, AviMovie *movie);
/**
* Read a frame from a movie stream.
diff --git a/source/blender/avi/CMakeLists.txt b/source/blender/avi/CMakeLists.txt
index b1ddb8c7895..77a43e5560e 100644
--- a/source/blender/avi/CMakeLists.txt
+++ b/source/blender/avi/CMakeLists.txt
@@ -24,12 +24,27 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-SET(INC
+set(INC
.
../../../intern/guardedalloc
- ${JPEG_INC}
+ ${JPEG_INCLUDE_DIR}
+)
+
+set(SRC
+ intern/avi.c
+ intern/avirgb.c
+ intern/codecs.c
+ intern/endian.c
+ intern/mjpeg.c
+ intern/options.c
+ intern/rgb32.c
+
+ AVI_avi.h
+ intern/avi_intern.h
+ intern/avirgb.h
+ intern/endian.h
+ intern/mjpeg.h
+ intern/rgb32.h
)
-BLENDERLIB(bf_avi "${SRC}" "${INC}")
+blender_add_lib(bf_avi "${SRC}" "${INC}")
diff --git a/source/blender/avi/Makefile b/source/blender/avi/Makefile
deleted file mode 100644
index 96a6573cc67..00000000000
--- a/source/blender/avi/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/avi
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/avi/intern/Makefile b/source/blender/avi/intern/Makefile
deleted file mode 100644
index 8d1af9adb28..00000000000
--- a/source/blender/avi/intern/Makefile
+++ /dev/null
@@ -1,51 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = avi
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL1_C_WARNINGS)
-
-ifeq ($(CPU),$(findstring $(CPU), "powerpc mips sparc"))
- CPPFLAGS += -DWORDS_BIGENDIAN
-else
- # alpha i386
- CPPFLAGS += -DWORDS_LITTLEENDIAN
-endif
-
-# the JPEG library
-CPPFLAGS += -I$(NAN_JPEG)/include
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-# our own include
-CPPFLAGS += -I..
-
diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c
index 5f0d36e17e2..a30f51da499 100644
--- a/source/blender/avi/intern/avi.c
+++ b/source/blender/avi/intern/avi.c
@@ -48,7 +48,7 @@
static int AVI_DEBUG=0;
static char DEBUG_FCC[4];
-#define DEBUG(x) if(AVI_DEBUG) printf("AVI DEBUG: " x);
+#define DEBUG_PRINT(x) if(AVI_DEBUG) printf("AVI DEBUG: " x);
/* local functions */
char *fcc_to_char (unsigned int fcc);
@@ -211,16 +211,14 @@ int AVI_is_avi (char *name) {
}
*/
-int AVI_is_avi (char *name) {
+int AVI_is_avi (const char *name) {
int temp, fcca, j;
- AviMovie movie;
+ AviMovie movie= {0};
AviMainHeader header;
AviBitmapInfoHeader bheader;
int movie_tracks = 0;
- DEBUG("opening movie\n");
-
- memset(&movie, 0, sizeof(AviMovie));
+ DEBUG_PRINT("opening movie\n");
movie.type = AVI_MOVIE_READ;
movie.fp = fopen (name, "rb");
@@ -243,7 +241,7 @@ int AVI_is_avi (char *name) {
GET_FCC (movie.fp) != FCC("hdrl") ||
(movie.header->fcc = GET_FCC (movie.fp)) != FCC("avih") ||
!(movie.header->size = GET_FCC (movie.fp))) {
- DEBUG("bad initial header info\n");
+ DEBUG_PRINT("bad initial header info\n");
fclose(movie.fp);
return 0;
}
@@ -266,7 +264,7 @@ int AVI_is_avi (char *name) {
fseek (movie.fp, movie.header->size-14*4, SEEK_CUR);
if (movie.header->Streams < 1) {
- DEBUG("streams less than 1\n");
+ DEBUG_PRINT("streams less than 1\n");
fclose(movie.fp);
return 0;
}
@@ -280,7 +278,7 @@ int AVI_is_avi (char *name) {
GET_FCC (movie.fp) != FCC ("strl") ||
(movie.streams[temp].sh.fcc = GET_FCC (movie.fp)) != FCC ("strh") ||
!(movie.streams[temp].sh.size = GET_FCC (movie.fp))) {
- DEBUG("bad stream header information\n");
+ DEBUG_PRINT("bad stream header information\n");
MEM_freeN(movie.streams);
fclose(movie.fp);
@@ -328,7 +326,7 @@ int AVI_is_avi (char *name) {
fseek (movie.fp, movie.streams[temp].sh.size-14*4, SEEK_CUR);
if (GET_FCC (movie.fp) != FCC("strf")) {
- DEBUG("no stream format information\n");
+ DEBUG_PRINT("no stream format information\n");
MEM_freeN(movie.streams);
fclose(movie.fp);
return 0;
@@ -384,7 +382,7 @@ int AVI_is_avi (char *name) {
while (GET_FCC (movie.fp) != FCC("LIST")) {
temp= GET_FCC (movie.fp);
if (temp<0 || ftell(movie.fp) > movie.size) {
- DEBUG("incorrect size in header or error in AVI\n");
+ DEBUG_PRINT("incorrect size in header or error in AVI\n");
MEM_freeN(movie.streams);
fclose(movie.fp);
@@ -404,10 +402,10 @@ int AVI_is_avi (char *name) {
}
-AviError AVI_open_movie (char *name, AviMovie *movie) {
+AviError AVI_open_movie (const char *name, AviMovie *movie) {
int temp, fcca, size, j;
- DEBUG("opening movie\n");
+ DEBUG_PRINT("opening movie\n");
memset(movie, 0, sizeof(AviMovie));
@@ -430,7 +428,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
GET_FCC (movie->fp) != FCC("hdrl") ||
(movie->header->fcc = GET_FCC (movie->fp)) != FCC("avih") ||
!(movie->header->size = GET_FCC (movie->fp))) {
- DEBUG("bad initial header info\n");
+ DEBUG_PRINT("bad initial header info\n");
return AVI_ERROR_FORMAT;
}
@@ -452,7 +450,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
fseek (movie->fp, movie->header->size-14*4, SEEK_CUR);
if (movie->header->Streams < 1) {
- DEBUG("streams less than 1\n");
+ DEBUG_PRINT("streams less than 1\n");
return AVI_ERROR_FORMAT;
}
@@ -465,7 +463,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
GET_FCC (movie->fp) != FCC ("strl") ||
(movie->streams[temp].sh.fcc = GET_FCC (movie->fp)) != FCC ("strh") ||
!(movie->streams[temp].sh.size = GET_FCC (movie->fp))) {
- DEBUG("bad stream header information\n");
+ DEBUG_PRINT("bad stream header information\n");
return AVI_ERROR_FORMAT;
}
@@ -507,7 +505,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
fseek (movie->fp, movie->streams[temp].sh.size-14*4, SEEK_CUR);
if (GET_FCC (movie->fp) != FCC("strf")) {
- DEBUG("no stream format information\n");
+ DEBUG_PRINT("no stream format information\n");
return AVI_ERROR_FORMAT;
}
@@ -560,7 +558,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
while (GET_FCC (movie->fp) != FCC("LIST")) {
temp= GET_FCC (movie->fp);
if (temp<0 || ftell(movie->fp) > movie->size) {
- DEBUG("incorrect size in header or error in AVI\n");
+ DEBUG_PRINT("incorrect size in header or error in AVI\n");
return AVI_ERROR_FORMAT;
}
fseek(movie->fp, temp, SEEK_CUR);
@@ -585,7 +583,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
fseek (movie->fp, size, SEEK_CUR);
}
if (ftell(movie->fp) > movie->size) {
- DEBUG("incorrect size in header or error in AVI\n");
+ DEBUG_PRINT("incorrect size in header or error in AVI\n");
return AVI_ERROR_FORMAT;
}
}
@@ -599,13 +597,13 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
fseek(movie->fp, size-4, SEEK_CUR);
if (GET_FCC(movie->fp) != FCC("idx1")) {
- DEBUG("bad index informatio\n");
+ DEBUG_PRINT("bad index informatio\n");
return AVI_ERROR_FORMAT;
}
movie->index_entries = GET_FCC (movie->fp)/sizeof(AviIndexEntry);
if (movie->index_entries == 0) {
- DEBUG("no index entries\n");
+ DEBUG_PRINT("no index entries\n");
return AVI_ERROR_FORMAT;
}
@@ -631,7 +629,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
movie->read_offset= 4;
}
- DEBUG("movie succesfully opened\n");
+ DEBUG_PRINT("movie succesfully opened\n");
return AVI_ERROR_NONE;
}
diff --git a/source/blender/avi/intern/avirgb.c b/source/blender/avi/intern/avirgb.c
index f7acbf238b5..c7d411b2fc6 100644
--- a/source/blender/avi/intern/avirgb.c
+++ b/source/blender/avi/intern/avirgb.c
@@ -51,6 +51,8 @@ void *avi_converter_from_avi_rgb (AviMovie *movie, int stream, unsigned char *bu
unsigned char *buf;
AviBitmapInfoHeader *bi;
short bits= 32;
+
+ (void)size; /* unused */
bi= (AviBitmapInfoHeader *) movie->streams[stream].sf;
if (bi) bits= bi->BitCount;
@@ -120,6 +122,8 @@ void *avi_converter_to_avi_rgb (AviMovie *movie, int stream, unsigned char *buff
int y, x, i, rowstride;
unsigned char *buf;
+ (void)stream; /* unused */
+
*size= movie->header->Height * movie->header->Width * 3;
if (movie->header->Width%2) *size+= movie->header->Height;
diff --git a/source/blender/avi/intern/endian.c b/source/blender/avi/intern/endian.c
index 282e26b3ee8..137c664568c 100644
--- a/source/blender/avi/intern/endian.c
+++ b/source/blender/avi/intern/endian.c
@@ -206,6 +206,8 @@ void awrite (AviMovie *movie, void *datain, int block, int size, FILE *fp, int t
MEM_freeN (data);
#else /* WORDS_BIGENDIAN */
+ (void)movie; /* unused */
+ (void)type; /* unused */
fwrite (datain, block, size, fp);
#endif /* WORDS_BIGENDIAN */
}
diff --git a/source/blender/avi/intern/mjpeg.c b/source/blender/avi/intern/mjpeg.c
index fd7e8aaef83..e8c96476fd1 100644
--- a/source/blender/avi/intern/mjpeg.c
+++ b/source/blender/avi/intern/mjpeg.c
@@ -144,6 +144,8 @@ static int Decode_JPEG(unsigned char *inBuffer, unsigned char *outBuffer, unsign
unsigned int y;
struct jpeg_decompress_struct dinfo;
struct jpeg_error_mgr jerr;
+
+ (void)width; /* unused */
numbytes= 0;
@@ -324,7 +326,9 @@ static void check_and_compress_jpeg(int quality, unsigned char *outbuf, unsigned
void *avi_converter_from_mjpeg (AviMovie *movie, int stream, unsigned char *buffer, int *size) {
int deint;
unsigned char *buf;
-
+
+ (void)stream; /* unused */
+
buf= MEM_mallocN (movie->header->Height * movie->header->Width * 3, "avi.avi_converter_from_mjpeg 1");
deint= check_and_decode_jpeg(buffer, buf, movie->header->Width, movie->header->Height, *size);
@@ -374,10 +378,11 @@ void *avi_converter_to_mjpeg (AviMovie *movie, int stream, unsigned char *buffer
/* Compression from memory */
static void jpegmemdestmgr_init_destination(j_compress_ptr cinfo) {
- ;
+ (void)cinfo; /* unused */
}
static boolean jpegmemdestmgr_empty_output_buffer(j_compress_ptr cinfo) {
+ (void)cinfo; /* unused */
return TRUE;
}
@@ -403,7 +408,7 @@ static void jpegmemdestmgr_build(j_compress_ptr cinfo, unsigned char *buffer, in
/* Decompression from memory */
static void jpegmemsrcmgr_init_source(j_decompress_ptr dinfo) {
- ;
+ (void)dinfo;
}
static boolean jpegmemsrcmgr_fill_input_buffer(j_decompress_ptr dinfo) {
diff --git a/source/blender/avi/intern/options.c b/source/blender/avi/intern/options.c
index 15ec40ade8c..bec7060e118 100644
--- a/source/blender/avi/intern/options.c
+++ b/source/blender/avi/intern/options.c
@@ -41,6 +41,8 @@
AviError AVI_set_compress_option (AviMovie *movie, int option_type, int stream, AviOption option, void *opt_data) {
int i;
+ (void)stream; /* unused */
+
if (movie->header->TotalFrames != 0) /* Can't change params after we have already started writing frames */
return AVI_ERROR_OPTION;
diff --git a/source/blender/avi/intern/rgb32.c b/source/blender/avi/intern/rgb32.c
index 68e3ce4d1d2..f66f57924df 100644
--- a/source/blender/avi/intern/rgb32.c
+++ b/source/blender/avi/intern/rgb32.c
@@ -41,6 +41,8 @@ void *avi_converter_from_rgb32 (AviMovie *movie, int stream, unsigned char *buff
int y, x, rowstridea, rowstrideb;
unsigned char *buf;
+ (void)stream; /* unused */
+
buf = MEM_mallocN (movie->header->Height * movie->header->Width * 3, "fromrgb32buf");
*size = movie->header->Height * movie->header->Width * 3;
@@ -65,6 +67,8 @@ void *avi_converter_to_rgb32 (AviMovie *movie, int stream, unsigned char *buffer
unsigned char *buf;
unsigned char *to, *from;
+ (void)stream; /* unused */
+
buf= MEM_mallocN (movie->header->Height * movie->header->Width * 4, "torgb32buf");
*size= movie->header->Height * movie->header->Width * 4;
diff --git a/source/blender/blenfont/BLF_api.h b/source/blender/blenfont/BLF_api.h
index 933d287bcff..b696c64023d 100644
--- a/source/blender/blenfont/BLF_api.h
+++ b/source/blender/blenfont/BLF_api.h
@@ -34,44 +34,62 @@ struct rctf;
int BLF_init(int points, int dpi);
void BLF_exit(void);
-int BLF_load(char *name);
-int BLF_load_mem(char *name, unsigned char *mem, int mem_size);
+void BLF_cache_clear(void);
-int BLF_load_unique(char *name);
-int BLF_load_mem_unique(char *name, unsigned char *mem, int mem_size);
+int BLF_load(const char *name);
+int BLF_load_mem(const char *name, unsigned char *mem, int mem_size);
+
+int BLF_load_unique(const char *name);
+int BLF_load_mem_unique(const char *name, unsigned char *mem, int mem_size);
/* Attach a file with metrics information from memory. */
void BLF_metrics_attach(int fontid, unsigned char *mem, int mem_size);
-void BLF_aspect(int fontid, float aspect);
+void BLF_aspect(int fontid, float x, float y, float z);
void BLF_position(int fontid, float x, float y, float z);
void BLF_size(int fontid, int size, int dpi);
+/* Set a 4x4 matrix to be multiplied before draw the text.
+ * Remember that you need call BLF_enable(BLF_MATRIX)
+ * to enable this.
+ *
+ * The order of the matrix is like GL:
+
+ | m[0] m[4] m[8] m[12] |
+ | m[1] m[5] m[9] m[13] |
+ | m[2] m[6] m[10] m[14] |
+ | m[3] m[7] m[11] m[15] |
+
+ */
+void BLF_matrix(int fontid, double *m);
+
/* Draw the string using the default font, size and dpi. */
-void BLF_draw_default(float x, float y, float z, char *str);
+void BLF_draw_default(float x, float y, float z, const char *str, size_t len);
+void BLF_draw_default_ascii(float x, float y, float z, const char *str, size_t len);
/* Draw the string using the current font. */
-void BLF_draw(int fontid, char *str);
+void BLF_draw(int fontid, const char *str, size_t len);
+void BLF_draw_ascii(int fontid, const char *str, size_t len);
/*
* This function return the bounding box of the string
* and are not multiplied by the aspect.
*/
-void BLF_boundbox(int fontid, char *str, struct rctf *box);
+void BLF_boundbox(int fontid, const char *str, struct rctf *box);
/*
* The next both function return the width and height
* of the string, using the current font and both value
* are multiplied by the aspect of the font.
*/
-float BLF_width(int fontid, char *str);
-float BLF_height(int fontid, char *str);
+float BLF_width(int fontid, const char *str);
+float BLF_height(int fontid, const char *str);
/*
* The following function return the width and height of the string, but
* just in one call, so avoid extra freetype2 stuff.
*/
-void BLF_width_and_height(int fontid, char *str, float *width, float *height);
+void BLF_width_and_height(int fontid, const char *str, float *width, float *height);
/*
* For fixed width fonts only, returns the width of a
@@ -84,8 +102,8 @@ float BLF_fixed_width(int fontid);
* of the string, using the default font and both value
* are multiplied by the aspect of the font.
*/
-float BLF_width_default(char *str);
-float BLF_height_default(char *str);
+float BLF_width_default(const char *str);
+float BLF_height_default(const char *str);
/*
* Set rotation for default font.
@@ -145,7 +163,7 @@ void BLF_buffer_col(int fontid, float r, float g, float b, float a);
* Draw the string into the buffer, this function draw in both buffer, float and unsigned char _BUT_
* it's not necessary set both buffer, NULL is valid here.
*/
-void BLF_draw_buffer(int fontid, char *str);
+void BLF_draw_buffer(int fontid, const char *str);
/*
* Search the path directory to the locale files, this try all
@@ -176,5 +194,11 @@ void BLF_dir_free(char **dirs, int count);
#define BLF_CLIPPING (1<<1)
#define BLF_SHADOW (1<<2)
#define BLF_KERNING_DEFAULT (1<<3)
+#define BLF_MATRIX (1<<4)
+#define BLF_ASPECT (1<<5)
+
+// XXX, bad design
+extern int blf_mono_font;
+extern int blf_mono_font_render; // dont mess drawing with render threads.
#endif /* BLF_API_H */
diff --git a/source/blender/blenfont/BLF_types.h b/source/blender/blenfont/BLF_types.h
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/source/blender/blenfont/BLF_types.h
+++ /dev/null
diff --git a/source/blender/blenfont/CMakeLists.txt b/source/blender/blenfont/CMakeLists.txt
index abaf769bd3c..4f211bdda17 100644
--- a/source/blender/blenfont/CMakeLists.txt
+++ b/source/blender/blenfont/CMakeLists.txt
@@ -22,9 +22,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-SET(INC
+set(INC
.
../blenlib
../makesdna
@@ -35,14 +33,27 @@ SET(INC
${FREETYPE_INCLUDE_DIRS}
)
-IF(WITH_INTERNATIONAL)
- LIST(APPEND INC ${GETTEXT_INC})
- ADD_DEFINITIONS(-DINTERNATIONAL)
-ENDIF(WITH_INTERNATIONAL)
+set(SRC
+ intern/blf.c
+ intern/blf_dir.c
+ intern/blf_font.c
+ intern/blf_glyph.c
+ intern/blf_lang.c
+ intern/blf_util.c
+
+ BLF_api.h
+ intern/blf_internal.h
+ intern/blf_internal_types.h
+)
+
+if(WITH_INTERNATIONAL)
+ list(APPEND INC ${GETTEXT_INC})
+ add_definitions(-DINTERNATIONAL)
+endif()
-IF(WIN32)
- ADD_DEFINITIONS(-D_WIN32 -DUSE_GETTEXT_DLL)
-ENDIF(WIN32)
+if(WIN32 AND NOT UNIX)
+ add_definitions(-DUSE_GETTEXT_DLL)
+endif()
-BLENDERLIB(bf_blenfont "${SRC}" "${INC}")
+blender_add_lib(bf_blenfont "${SRC}" "${INC}")
diff --git a/source/blender/blenfont/Makefile b/source/blender/blenfont/Makefile
deleted file mode 100644
index df1bbb72110..00000000000
--- a/source/blender/blenfont/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2009 Blender Foundation
-# All rights reserved.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-
-SOURCEDIR = source/blender/blenfont
-DIRS = intern
-
-include nan_subdirs.mk
-
-ifeq ($(INTERNATIONAL), true)
- CPPFLAGS += -DINTERNATIONAL
-endif
diff --git a/source/blender/blenfont/intern/Makefile b/source/blender/blenfont/intern/Makefile
deleted file mode 100644
index d3a6e656028..00000000000
--- a/source/blender/blenfont/intern/Makefile
+++ /dev/null
@@ -1,74 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2008 Blender Foundation.
-# All rights reserved.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blenfont
-DIR = $(OCGDIR)/blender/blenfont
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-#CFLAGS += -O2 -Wall -Wno-char-subscripts
-
-# OpenGL and Freetype2
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += $(OGL_CPPFLAGS)
-CPPFLAGS += -I$(NAN_FREETYPE)/include
-
-ifeq ($(OS), windows)
- CPPFLAGS += -I$(NAN_ICONV)/include
- ifeq ($(FREE_WINDOWS), true)
- CPPFLAGS += -I$(NAN_FREETYPE)/include/freetype2
- CPPFLAGS += -DUSE_GETTEXT_DLL
- endif
-else
- CPPFLAGS += -I$(NAN_FREETYPE)/include/freetype2
-endif
-
-ifeq ($(OS),linux)
- ifeq ($(CPU),alpha)
- CPPFLAGS += -I$(NAN_MESA)/include
- endif
- ifeq ($(CPU),i386)
- CPPFLAGS += -I$(NAN_MESA)/include
- endif
- ifeq ($(CPU),powerpc)
- CPPFLAGS += -I/usr/src/MesaCVS/include
- endif
-endif
-
-# Modules
-CPPFLAGS += -I../../editors/include
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenkernel
-
-# Memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# Our own headers
-CPPFLAGS += -I..
diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c
index f6b7c5f71e6..462ecebc10a 100644
--- a/source/blender/blenfont/intern/blf.c
+++ b/source/blender/blenfont/intern/blf.c
@@ -66,6 +66,10 @@ int global_font_default= -1;
int global_font_points= 11;
int global_font_dpi= 72;
+// XXX, should these be made into global_font_'s too?
+int blf_mono_font= -1;
+int blf_mono_font_render= -1;
+
static FontBLF *BLF_get(int fontid)
{
if (fontid >= 0 && fontid < BLF_MAX_FONT)
@@ -99,7 +103,19 @@ void BLF_exit(void)
blf_font_exit();
}
-static int blf_search(char *name)
+void BLF_cache_clear(void)
+{
+ FontBLF *font;
+ int i;
+
+ for (i= 0; i < global_font_num; i++) {
+ font= global_font[i];
+ if (font)
+ blf_glyph_cache_clear(font);
+ }
+}
+
+static int blf_search(const char *name)
{
FontBLF *font;
int i;
@@ -112,7 +128,7 @@ static int blf_search(char *name)
return(-1);
}
-int BLF_load(char *name)
+int BLF_load(const char *name)
{
FontBLF *font;
char *filename;
@@ -124,7 +140,7 @@ int BLF_load(char *name)
/* check if we already load this font. */
i= blf_search(name);
if (i >= 0) {
- font= global_font[i];
+ /*font= global_font[i];*/ /*UNUSED*/
return(i);
}
@@ -153,7 +169,7 @@ int BLF_load(char *name)
return(i);
}
-int BLF_load_unique(char *name)
+int BLF_load_unique(const char *name)
{
FontBLF *font;
char *filename;
@@ -199,7 +215,7 @@ void BLF_metrics_attach(int fontid, unsigned char *mem, int mem_size)
blf_font_attach_from_mem(font, mem, mem_size);
}
-int BLF_load_mem(char *name, unsigned char *mem, int mem_size)
+int BLF_load_mem(const char *name, unsigned char *mem, int mem_size)
{
FontBLF *font;
int i;
@@ -209,7 +225,7 @@ int BLF_load_mem(char *name, unsigned char *mem, int mem_size)
i= blf_search(name);
if (i >= 0) {
- font= global_font[i];
+ /*font= global_font[i];*/ /*UNUSED*/
return(i);
}
@@ -235,7 +251,7 @@ int BLF_load_mem(char *name, unsigned char *mem, int mem_size)
return(i);
}
-int BLF_load_mem_unique(char *name, unsigned char *mem, int mem_size)
+int BLF_load_mem_unique(const char *name, unsigned char *mem, int mem_size)
{
FontBLF *font;
int i;
@@ -305,36 +321,71 @@ void BLF_disable_default(int option)
font->flags &= ~option;
}
-void BLF_aspect(int fontid, float aspect)
+void BLF_aspect(int fontid, float x, float y, float z)
{
FontBLF *font;
font= BLF_get(fontid);
- if (font)
- font->aspect= aspect;
+ if (font) {
+ font->aspect[0]= x;
+ font->aspect[1]= y;
+ font->aspect[2]= z;
+ }
+}
+
+void BLF_matrix(int fontid, double *m)
+{
+ FontBLF *font;
+ int i;
+
+ font= BLF_get(fontid);
+ if (font) {
+ for (i= 0; i < 16; i++)
+ font->m[i]= m[i];
+ }
}
void BLF_position(int fontid, float x, float y, float z)
{
FontBLF *font;
float remainder;
+ float xa, ya, za;
font= BLF_get(fontid);
if (font) {
+ if (font->flags & BLF_ASPECT) {
+ xa= font->aspect[0];
+ ya= font->aspect[1];
+ za= font->aspect[2];
+ }
+ else {
+ xa= 1.0f;
+ ya= 1.0f;
+ za= 1.0f;
+ }
+
remainder= x - floor(x);
if (remainder > 0.4 && remainder < 0.6) {
if (remainder < 0.5)
- x -= 0.1 * font->aspect;
+ x -= 0.1 * xa;
else
- x += 0.1 * font->aspect;
+ x += 0.1 * xa;
}
remainder= y - floor(y);
if (remainder > 0.4 && remainder < 0.6) {
if (remainder < 0.5)
- y -= 0.1 * font->aspect;
+ y -= 0.1 * ya;
+ else
+ y += 0.1 * ya;
+ }
+
+ remainder= z - floor(z);
+ if (remainder > 0.4 && remainder < 0.6) {
+ if (remainder < 0.5)
+ z -= 0.1 * za;
else
- y += 0.1 * font->aspect;
+ z += 0.1 * za;
}
font->pos[0]= x;
@@ -361,7 +412,7 @@ void BLF_blur(int fontid, int size)
font->blur= size;
}
-void BLF_draw_default(float x, float y, float z, char *str)
+void BLF_draw_default(float x, float y, float z, const char *str, size_t len)
{
if (!str)
return;
@@ -376,7 +427,26 @@ void BLF_draw_default(float x, float y, float z, char *str)
BLF_size(global_font_default, global_font_points, global_font_dpi);
BLF_position(global_font_default, x, y, z);
- BLF_draw(global_font_default, str);
+ BLF_draw(global_font_default, str, len);
+}
+
+/* same as above but call 'BLF_draw_ascii' */
+void BLF_draw_default_ascii(float x, float y, float z, const char *str, size_t len)
+{
+ if (!str)
+ return;
+
+ if (global_font_default == -1)
+ global_font_default= blf_search("default");
+
+ if (global_font_default == -1) {
+ printf("Warning: Can't found default font!!\n");
+ return;
+ }
+
+ BLF_size(global_font_default, global_font_points, global_font_dpi);
+ BLF_position(global_font_default, x, y, z);
+ BLF_draw_ascii(global_font_default, str, len); /* XXX, use real length */
}
void BLF_rotation_default(float angle)
@@ -388,36 +458,59 @@ void BLF_rotation_default(float angle)
font->angle= angle;
}
-void BLF_draw(int fontid, char *str)
+static void blf_draw__start(FontBLF *font)
{
- FontBLF *font;
-
/*
* The pixmap alignment hack is handle
* in BLF_position (old ui_rasterpos_safe).
*/
- font= BLF_get(fontid);
- if (font) {
- glEnable(GL_BLEND);
- glEnable(GL_TEXTURE_2D);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glPushMatrix();
- glTranslatef(font->pos[0], font->pos[1], font->pos[2]);
- glScalef(font->aspect, font->aspect, 1.0);
+ glEnable(GL_BLEND);
+ glEnable(GL_TEXTURE_2D);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glPushMatrix();
+
+ if (font->flags & BLF_MATRIX)
+ glMultMatrixd((GLdouble *)&font->m);
+
+ glTranslatef(font->pos[0], font->pos[1], font->pos[2]);
+
+ if (font->flags & BLF_ASPECT)
+ glScalef(font->aspect[0], font->aspect[1], font->aspect[2]);
+
+ if (font->flags & BLF_ROTATION)
+ glRotatef(font->angle, 0.0f, 0.0f, 1.0f);
+}
- if (font->flags & BLF_ROTATION)
- glRotatef(font->angle, 0.0f, 0.0f, 1.0f);
+static void blf_draw__end(void)
+{
+ glPopMatrix();
+ glDisable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
+}
- blf_font_draw(font, str);
+void BLF_draw(int fontid, const char *str, size_t len)
+{
+ FontBLF *font= BLF_get(fontid);
+ if (font) {
+ blf_draw__start(font);
+ blf_font_draw(font, str, len);
+ blf_draw__end();
+ }
+}
- glPopMatrix();
- glDisable(GL_BLEND);
- glDisable(GL_TEXTURE_2D);
+void BLF_draw_ascii(int fontid, const char *str, size_t len)
+{
+ FontBLF *font= BLF_get(fontid);
+ if (font) {
+ blf_draw__start(font);
+ blf_font_draw_ascii(font, str, len);
+ blf_draw__end();
}
}
-void BLF_boundbox(int fontid, char *str, rctf *box)
+void BLF_boundbox(int fontid, const char *str, rctf *box)
{
FontBLF *font;
@@ -426,7 +519,7 @@ void BLF_boundbox(int fontid, char *str, rctf *box)
blf_font_boundbox(font, str, box);
}
-void BLF_width_and_height(int fontid, char *str, float *width, float *height)
+void BLF_width_and_height(int fontid, const char *str, float *width, float *height)
{
FontBLF *font;
@@ -435,7 +528,7 @@ void BLF_width_and_height(int fontid, char *str, float *width, float *height)
blf_font_width_and_height(font, str, width, height);
}
-float BLF_width(int fontid, char *str)
+float BLF_width(int fontid, const char *str)
{
FontBLF *font;
@@ -455,7 +548,7 @@ float BLF_fixed_width(int fontid)
return(0.0f);
}
-float BLF_width_default(char *str)
+float BLF_width_default(const char *str)
{
float width;
@@ -472,7 +565,7 @@ float BLF_width_default(char *str)
return(width);
}
-float BLF_height(int fontid, char *str)
+float BLF_height(int fontid, const char *str)
{
FontBLF *font;
@@ -482,7 +575,7 @@ float BLF_height(int fontid, char *str)
return(0.0f);
}
-float BLF_height_default(char *str)
+float BLF_height_default(const char *str)
{
float height;
@@ -586,7 +679,7 @@ void BLF_buffer_col(int fontid, float r, float g, float b, float a)
}
}
-void BLF_draw_buffer(int fontid, char *str)
+void BLF_draw_buffer(int fontid, const char *str)
{
FontBLF *font;
diff --git a/source/blender/blenfont/intern/blf_dir.c b/source/blender/blenfont/intern/blf_dir.c
index e650586aa9c..1eb7597fa54 100644
--- a/source/blender/blenfont/intern/blf_dir.c
+++ b/source/blender/blenfont/intern/blf_dir.c
@@ -121,7 +121,7 @@ void BLF_dir_free(char **dirs, int count)
MEM_freeN(dirs);
}
-char *blf_dir_search(char *file)
+char *blf_dir_search(const char *file)
{
DirBLF *dir;
char full_path[FILE_MAXDIR+FILE_MAXFILE];
@@ -175,7 +175,7 @@ int blf_dir_split(const char *str, char *file, int *size)
/* Some font have additional file with metrics information,
* in general, the extension of the file is: .afm or .pfm
*/
-char *blf_dir_metrics_search(char *filename)
+char *blf_dir_metrics_search(const char *filename)
{
char *mfile;
char *s;
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c
index 04f40ac825b..ce68df5c8b6 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -92,7 +92,7 @@ void blf_font_size(FontBLF *font, int size, int dpi)
}
}
-void blf_font_draw(FontBLF *font, char *str)
+void blf_font_draw(FontBLF *font, const char *str, unsigned int len)
{
unsigned int c;
GlyphBLF *g, *g_prev;
@@ -110,7 +110,7 @@ void blf_font_draw(FontBLF *font, char *str)
has_kerning= FT_HAS_KERNING(font->face);
g_prev= NULL;
- while (str[i]) {
+ while (str[i] && i < len) {
c= blf_utf8_next((unsigned char *)str, &i);
if (c == 0)
break;
@@ -146,7 +146,65 @@ void blf_font_draw(FontBLF *font, char *str)
}
}
-void blf_font_buffer(FontBLF *font, char *str)
+/* faster version of blf_font_draw, ascii only for view dimensions */
+void blf_font_draw_ascii(FontBLF *font, const char *str, unsigned int len)
+{
+ char c;
+ GlyphBLF *g, *g_prev;
+ FT_Vector delta;
+ FT_UInt glyph_index;
+ int pen_x, pen_y;
+ int i, has_kerning, st;
+
+ if (!font->glyph_cache)
+ return;
+
+ pen_x= 0;
+ pen_y= 0;
+ has_kerning= FT_HAS_KERNING(font->face);
+ g_prev= NULL;
+
+ /* build ascii on demand */
+ if(font->glyph_ascii_table['0']==NULL) {
+ for(i=0; i<256; i++) {
+ g= blf_glyph_search(font->glyph_cache, i);
+ if (!g) {
+ glyph_index= FT_Get_Char_Index(font->face, i);
+ g= blf_glyph_add(font, glyph_index, i);
+ }
+ font->glyph_ascii_table[i]= g;
+ }
+ }
+
+ while ((c= *(str++)) && len--) {
+ g= font->glyph_ascii_table[c];
+
+ /* if we don't found a glyph, skip it. */
+ if (!g)
+ continue;
+
+ if (has_kerning && g_prev) {
+ delta.x= 0;
+ delta.y= 0;
+
+ if (font->flags & BLF_KERNING_DEFAULT)
+ st= FT_Get_Kerning(font->face, g_prev->idx, g->idx, ft_kerning_default, &delta);
+ else
+ st= FT_Get_Kerning(font->face, g_prev->idx, g->idx, FT_KERNING_UNFITTED, &delta);
+
+ if (st == 0)
+ pen_x += delta.x >> 6;
+ }
+
+ /* do not return this loop if clipped, we want every character tested */
+ blf_glyph_render(font, g, (float)pen_x, (float)pen_y);
+
+ pen_x += g->advance;
+ g_prev= g;
+ }
+}
+
+void blf_font_buffer(FontBLF *font, const char *str)
{
unsigned char *cbuf;
unsigned int c;
@@ -280,7 +338,7 @@ void blf_font_buffer(FontBLF *font, char *str)
}
}
-void blf_font_boundbox(FontBLF *font, char *str, rctf *box)
+void blf_font_boundbox(FontBLF *font, const char *str, rctf *box)
{
unsigned int c;
GlyphBLF *g, *g_prev;
@@ -359,37 +417,59 @@ void blf_font_boundbox(FontBLF *font, char *str, rctf *box)
}
}
-void blf_font_width_and_height(FontBLF *font, char *str, float *width, float *height)
+void blf_font_width_and_height(FontBLF *font, const char *str, float *width, float *height)
{
+ float xa, ya;
rctf box;
if (font->glyph_cache) {
+ if (font->flags & BLF_ASPECT) {
+ xa= font->aspect[0];
+ ya= font->aspect[1];
+ }
+ else {
+ xa= 1.0f;
+ ya= 1.0f;
+ }
+
blf_font_boundbox(font, str, &box);
- *width= ((box.xmax - box.xmin) * font->aspect);
- *height= ((box.ymax - box.ymin) * font->aspect);
+ *width= ((box.xmax - box.xmin) * xa);
+ *height= ((box.ymax - box.ymin) * ya);
}
}
-float blf_font_width(FontBLF *font, char *str)
+float blf_font_width(FontBLF *font, const char *str)
{
+ float xa;
rctf box;
if (!font->glyph_cache)
return(0.0f);
+ if (font->flags & BLF_ASPECT)
+ xa= font->aspect[0];
+ else
+ xa= 1.0f;
+
blf_font_boundbox(font, str, &box);
- return((box.xmax - box.xmin) * font->aspect);
+ return((box.xmax - box.xmin) * xa);
}
-float blf_font_height(FontBLF *font, char *str)
+float blf_font_height(FontBLF *font, const char *str)
{
+ float ya;
rctf box;
if (!font->glyph_cache)
return(0.0f);
+ if (font->flags & BLF_ASPECT)
+ ya= font->aspect[1];
+ else
+ ya= 1.0f;
+
blf_font_boundbox(font, str, &box);
- return((box.ymax - box.ymin) * font->aspect);
+ return((box.ymax - box.ymin) * ya);
}
float blf_font_fixed_width(FontBLF *font)
@@ -434,11 +514,18 @@ void blf_font_free(FontBLF *font)
static void blf_font_fill(FontBLF *font)
{
- font->aspect= 1.0f;
+ int i;
+
+ font->aspect[0]= 1.0f;
+ font->aspect[1]= 1.0f;
+ font->aspect[2]= 1.0f;
font->pos[0]= 0.0f;
font->pos[1]= 0.0f;
font->angle= 0.0f;
- unit_m4(font->mat);
+
+ for (i= 0; i < 16; i++)
+ font->m[i]= 0;
+
font->clip_rec.xmin= 0.0f;
font->clip_rec.xmax= 0.0f;
font->clip_rec.ymin= 0.0f;
@@ -460,9 +547,11 @@ static void blf_font_fill(FontBLF *font)
font->b_col[1]= 0;
font->b_col[2]= 0;
font->b_col[3]= 0;
+
+ memset(font->glyph_ascii_table, 0, sizeof(font->glyph_ascii_table));
}
-FontBLF *blf_font_new(char *name, char *filename)
+FontBLF *blf_font_new(const char *name, const char *filename)
{
FontBLF *font;
FT_Error err;
@@ -505,7 +594,7 @@ void blf_font_attach_from_mem(FontBLF *font, const unsigned char *mem, int mem_s
FT_Attach_Stream(font->face, &open);
}
-FontBLF *blf_font_new_from_mem(char *name, unsigned char *mem, int mem_size)
+FontBLF *blf_font_new_from_mem(const char *name, unsigned char *mem, int mem_size)
{
FontBLF *font;
FT_Error err;
diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c
index 0d694c28b2b..c36496fb542 100644
--- a/source/blender/blenfont/intern/blf_glyph.c
+++ b/source/blender/blenfont/intern/blf_glyph.c
@@ -36,10 +36,12 @@
#include FT_FREETYPE_H
#include FT_GLYPH_H
#include FT_OUTLINE_H
+#include FT_BITMAP_H
#include "MEM_guardedalloc.h"
#include "DNA_vec_types.h"
+#include "DNA_userdef_types.h"
#include "BLI_blenlib.h"
@@ -49,6 +51,7 @@
#include "blf_internal_types.h"
#include "blf_internal.h"
+FT_Library global_ft_lib;
GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, int size, int dpi)
{
@@ -113,6 +116,23 @@ GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font)
return(gc);
}
+void blf_glyph_cache_clear(FontBLF *font)
+{
+ GlyphCacheBLF *gc;
+ GlyphBLF *g;
+ int i;
+
+ for(gc=font->cache.first; gc; gc=gc->next) {
+ for (i= 0; i < 257; i++) {
+ while (gc->bucket[i].first) {
+ g= gc->bucket[i].first;
+ BLI_remlink(&(gc->bucket[i]), g);
+ blf_glyph_free(g);
+ }
+ }
+ }
+}
+
void blf_glyph_cache_free(GlyphCacheBLF *gc)
{
GlyphBLF *g;
@@ -190,7 +210,8 @@ GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c)
FT_GlyphSlot slot;
GlyphBLF *g;
FT_Error err;
- FT_Bitmap bitmap;
+ FT_Bitmap bitmap, tempbitmap;
+ int sharp = (U.text_render & USER_TEXT_DISABLE_AA);
FT_BBox bbox;
unsigned int key;
@@ -198,14 +219,29 @@ GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c)
if (g)
return(g);
- err= FT_Load_Glyph(font->face, index, FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP);
+ if (sharp)
+ err = FT_Load_Glyph(font->face, index, FT_LOAD_TARGET_MONO);
+ else
+ err = FT_Load_Glyph(font->face, index, FT_LOAD_TARGET_NORMAL | FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP); /* Sure about NO_* flags? */
if (err)
return(NULL);
/* get the glyph. */
slot= font->face->glyph;
- err= FT_Render_Glyph(slot, FT_RENDER_MODE_NORMAL);
+ if (sharp) {
+ err = FT_Render_Glyph(slot, FT_RENDER_MODE_MONO);
+
+ /* Convert result from 1 bit per pixel to 8 bit per pixel */
+ /* Accum errors for later, fine if not interested beyond "ok vs any error" */
+ FT_Bitmap_New(&tempbitmap);
+ err += FT_Bitmap_Convert(global_ft_lib, &slot->bitmap, &tempbitmap, 1); /* Does Blender use Pitch 1 always? It works so far */
+ err += FT_Bitmap_Copy(global_ft_lib, &tempbitmap, &slot->bitmap);
+ err += FT_Bitmap_Done(global_ft_lib, &tempbitmap);
+ } else {
+ err = FT_Render_Glyph(slot, FT_RENDER_MODE_NORMAL);
+ }
+
if (err || slot->format != FT_GLYPH_FORMAT_BITMAP)
return(NULL);
@@ -228,6 +264,14 @@ GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c)
g->height= bitmap.rows;
if (g->width && g->height) {
+ if (sharp) {
+ /* Font buffer uses only 0 or 1 values, Blender expects full 0..255 range */
+ int i;
+ for (i=0; i < (g->width * g->height); i++) {
+ bitmap.buffer[i] = 255 * bitmap.buffer[i];
+ }
+ }
+
g->bitmap= (unsigned char *)MEM_mallocN(g->width * g->height, "glyph bitmap");
memcpy((void *)g->bitmap, (void *)bitmap.buffer, g->width * g->height);
}
diff --git a/source/blender/blenfont/intern/blf_internal.h b/source/blender/blenfont/intern/blf_internal.h
index 844a7a3c3de..afe40973269 100644
--- a/source/blender/blenfont/intern/blf_internal.h
+++ b/source/blender/blenfont/intern/blf_internal.h
@@ -33,28 +33,30 @@ unsigned int blf_hash(unsigned int val);
int blf_utf8_next(unsigned char *buf, int *iindex);
char *blf_dir_search(const char *file);
-char *blf_dir_metrics_search(char *filename);
+char *blf_dir_metrics_search(const char *filename);
int blf_dir_split(const char *str, char *file, int *size);
int blf_font_init(void);
void blf_font_exit(void);
-FontBLF *blf_font_new(char *name, char *filename);
-FontBLF *blf_font_new_from_mem(char *name, unsigned char *mem, int mem_size);
+FontBLF *blf_font_new(const char *name, const char *filename);
+FontBLF *blf_font_new_from_mem(const char *name, unsigned char *mem, int mem_size);
void blf_font_attach_from_mem(FontBLF *font, const unsigned char *mem, int mem_size);
void blf_font_size(FontBLF *font, int size, int dpi);
-void blf_font_draw(FontBLF *font, char *str);
-void blf_font_buffer(FontBLF *font, char *str);
-void blf_font_boundbox(FontBLF *font, char *str, rctf *box);
-void blf_font_width_and_height(FontBLF *font, char *str, float *width, float *height);
-float blf_font_width(FontBLF *font, char *str);
-float blf_font_height(FontBLF *font, char *str);
+void blf_font_draw(FontBLF *font, const char *str, unsigned int len);
+void blf_font_draw_ascii(FontBLF *font, const char *str, unsigned int len);
+void blf_font_buffer(FontBLF *font, const char *str);
+void blf_font_boundbox(FontBLF *font, const char *str, rctf *box);
+void blf_font_width_and_height(FontBLF *font, const char *str, float *width, float *height);
+float blf_font_width(FontBLF *font, const char *str);
+float blf_font_height(FontBLF *font, const char *str);
float blf_font_fixed_width(FontBLF *font);
void blf_font_free(FontBLF *font);
GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, int size, int dpi);
GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font);
+void blf_glyph_cache_clear(FontBLF *font);
void blf_glyph_cache_free(GlyphCacheBLF *gc);
GlyphBLF *blf_glyph_search(GlyphCacheBLF *gc, unsigned int c);
diff --git a/source/blender/blenfont/intern/blf_internal_types.h b/source/blender/blenfont/intern/blf_internal_types.h
index 368eb8751de..d7c023fc415 100644
--- a/source/blender/blenfont/intern/blf_internal_types.h
+++ b/source/blender/blenfont/intern/blf_internal_types.h
@@ -133,7 +133,7 @@ typedef struct FontBLF {
char *filename;
/* aspect ratio or scale. */
- float aspect;
+ float aspect[3];
/* initial position for draw the text. */
float pos[3];
@@ -154,8 +154,10 @@ typedef struct FontBLF {
/* shadow color. */
float shadow_col[4];
- /* this is the matrix that we load before rotate/scale/translate. */
- float mat[4][4];
+ /* Multiplied this matrix with the current one before
+ * draw the text! see blf_draw__start.
+ */
+ double m[16];
/* clipping rectangle. */
rctf clip_rec;
@@ -177,6 +179,9 @@ typedef struct FontBLF {
/* current glyph cache, size and dpi. */
GlyphCacheBLF *glyph_cache;
+
+ /* fast ascii lookip */
+ GlyphBLF *glyph_ascii_table[256];
/* freetype2 face. */
FT_Face face;
diff --git a/source/blender/blenfont/intern/blf_lang.c b/source/blender/blenfont/intern/blf_lang.c
index 7054d955faf..8a929e1ebf7 100644
--- a/source/blender/blenfont/intern/blf_lang.c
+++ b/source/blender/blenfont/intern/blf_lang.c
@@ -38,7 +38,7 @@
#include "DNA_listBase.h"
#include "DNA_vec_types.h"
-#include "BKE_utildefines.h"
+
#include "BLI_blenlib.h"
#include "BLI_linklist.h" /* linknode */
@@ -46,7 +46,7 @@
#ifdef __APPLE__
-#include "BKE_utildefines.h"
+
#endif
#define DOMAIN_NAME "blender"
@@ -118,11 +118,13 @@ void BLF_lang_init(void)
void BLF_lang_encoding(char *str)
{
+ (void)str;
return;
}
void BLF_lang_set(char *str)
{
+ (void)str;
return;
}
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 00820823270..e7ce3f27431 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -227,7 +227,6 @@ struct DerivedMesh {
*
* Also called for *final* editmode DerivedMeshes
*/
-
void (*drawEdges)(DerivedMesh *dm, int drawLooseEdges, int drawAllEdges);
/* Draw all loose edges (edges w/ no adjoining faces) */
@@ -281,7 +280,8 @@ struct DerivedMesh {
void (*drawMappedFaces)(DerivedMesh *dm,
int (*setDrawOptions)(void *userData, int index,
int *drawSmooth_r),
- void *userData, int useColors);
+ void *userData, int useColors,
+ int (*setMaterial)(int, void *attribs));
/* Draw mapped faces using MTFace
* o Drawing options too complicated to enumerate, look at code.
@@ -481,6 +481,7 @@ DerivedMesh *mesh_create_derived_render(struct Scene *scene, struct Object *ob,
DerivedMesh *mesh_create_derived_index_render(struct Scene *scene, struct Object *ob, CustomDataMask dataMask, int index);
/* same as above but wont use render settings */
+DerivedMesh *mesh_create_derived(struct Mesh *me, struct Object *ob, float (*vertCos)[3]);
DerivedMesh *mesh_create_derived_view(struct Scene *scene, struct Object *ob,
CustomDataMask dataMask);
DerivedMesh *mesh_create_derived_no_deform(struct Scene *scene, struct Object *ob,
@@ -492,13 +493,18 @@ DerivedMesh *mesh_create_derived_no_deform_render(struct Scene *scene, struct Ob
/* for gameengine */
DerivedMesh *mesh_create_derived_no_virtual(struct Scene *scene, struct Object *ob, float (*vertCos)[3],
CustomDataMask dataMask);
+DerivedMesh *mesh_create_derived_physics(struct Scene *scene, struct Object *ob, float (*vertCos)[3],
+ CustomDataMask dataMask);
+DerivedMesh *editmesh_get_derived(struct EditMesh *em, float (*vertexCos)[3]);
DerivedMesh *editmesh_get_derived_base(struct Object *, struct EditMesh *em);
DerivedMesh *editmesh_get_derived_cage(struct Scene *scene, struct Object *,
struct EditMesh *em, CustomDataMask dataMask);
DerivedMesh *editmesh_get_derived_cage_and_final(struct Scene *scene, struct Object *,
struct EditMesh *em, DerivedMesh **final_r,
CustomDataMask dataMask);
+float (*editmesh_get_vertex_cos(struct EditMesh *em, int *numVerts_r))[3];
+int editmesh_modifier_is_enabled(struct Scene *scene, struct ModifierData *md, DerivedMesh *dm);
void makeDerivedMesh(struct Scene *scene, struct Object *ob, struct EditMesh *em, CustomDataMask dataMask);
/* returns an array of deform matrices for crazyspace correction, and the
@@ -506,6 +512,10 @@ void makeDerivedMesh(struct Scene *scene, struct Object *ob, struct EditMesh *em
int editmesh_get_first_deform_matrices(struct Scene *, struct Object *, struct EditMesh *em,
float (**deformmats)[3][3], float (**deformcos)[3]);
+/* returns an array of deform matrices for crazyspace correction when sculpting */
+void sculpt_get_deform_matrices(struct Scene *scene, struct Object *ob,
+ float (**deformmats)[3][3], float (**deformcos)[3]);
+
void weight_to_rgb(float input, float *fr, float *fg, float *fb);
/* convert layers requested by a GLSL material to actually available layers in
diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h
index 4d3f000c863..1c75387ba5d 100644
--- a/source/blender/blenkernel/BKE_action.h
+++ b/source/blender/blenkernel/BKE_action.h
@@ -117,6 +117,8 @@ void action_groups_remove_channel(struct bAction *act, struct FCurve *fcu);
/* Find a group with the given name */
struct bActionGroup *action_groups_find_named(struct bAction *act, const char name[]);
+/* Clear all 'temp' flags on all groups */
+void action_groups_clear_tempflags(struct bAction *act);
/* Pose API ----------------- */
diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h
index af5e31b1efa..500210d2fcd 100644
--- a/source/blender/blenkernel/BKE_animsys.h
+++ b/source/blender/blenkernel/BKE_animsys.h
@@ -56,10 +56,13 @@ struct AnimData *BKE_id_add_animdata(struct ID *id);
void BKE_free_animdata(struct ID *id);
/* Copy AnimData */
-struct AnimData *BKE_copy_animdata(struct AnimData *adt);
+struct AnimData *BKE_copy_animdata(struct AnimData *adt, const short do_action);
/* Copy AnimData */
-int BKE_copy_animdata_id(struct ID *id_to, struct ID *id_from);
+int BKE_copy_animdata_id(struct ID *id_to, struct ID *id_from, const short do_action);
+
+/* Copy AnimData Actions */
+void BKE_copy_animdata_id_action(struct ID *id);
/* Make Local */
void BKE_animdata_make_local(struct AnimData *adt);
@@ -92,11 +95,19 @@ void BKE_keyingsets_free(struct ListBase *list);
/* Path Fixing API */
/* Fix all the paths for the given ID+AnimData */
-void BKE_animdata_fix_paths_rename(struct ID *owner_id, struct AnimData *adt, char *prefix, char *oldName, char *newName, int oldSubscript, int newSubscript, int verify_paths);
+void BKE_animdata_fix_paths_rename(struct ID *owner_id, struct AnimData *adt, const char *prefix, char *oldName, char *newName, int oldSubscript, int newSubscript, int verify_paths);
/* Fix all the paths for the entire database... */
void BKE_all_animdata_fix_paths_rename(char *prefix, char *oldName, char *newName);
+/* -------------------------------------- */
+
+/* Move animation data from src to destination if it's paths are based on basepaths */
+void BKE_animdata_separate_by_basepath(struct ID *srcID, struct ID *dstID, struct ListBase *basepaths);
+
+/* Move F-Curves from src to destination if it's path is based on basepath */
+void action_move_fcurves_by_basepath(struct bAction *srcAct, struct bAction *dstAct, const char basepath[]);
+
/* ************************************* */
/* Batch AnimData API */
diff --git a/source/blender/blenkernel/BKE_armature.h b/source/blender/blenkernel/BKE_armature.h
index 242de4d788b..f074f7e7e74 100644
--- a/source/blender/blenkernel/BKE_armature.h
+++ b/source/blender/blenkernel/BKE_armature.h
@@ -73,7 +73,7 @@ typedef struct PoseTree
extern "C" {
#endif
-struct bArmature *add_armature(char *name);
+struct bArmature *add_armature(const char *name);
struct bArmature *get_armature(struct Object *ob);
void free_bonelist (struct ListBase *lb);
void free_armature(struct bArmature *arm);
@@ -91,6 +91,7 @@ void where_is_armature_bone(struct Bone *bone, struct Bone *prevbone);
void armature_rebuild_pose(struct Object *ob, struct bArmature *arm);
void where_is_pose (struct Scene *scene, struct Object *ob);
void where_is_pose_bone(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime, int do_extra);
+void where_is_pose_bone_tail(struct bPoseChannel *pchan);
/* get_objectspace_bone_matrix has to be removed still */
void get_objectspace_bone_matrix (struct Bone* bone, float M_accumulatedMatrix[][4], int root, int posed);
@@ -104,7 +105,8 @@ void armature_mat_pose_to_bone(struct bPoseChannel *pchan, float inmat[][4], flo
void armature_loc_pose_to_bone(struct bPoseChannel *pchan, float *inloc, float *outloc);
void armature_mat_pose_to_delta(float delta_mat[][4], float pose_mat[][4], float arm_mat[][4]);
-void pchan_apply_mat4(struct bPoseChannel *pchan, float mat[][4]);
+void pchan_mat3_to_rot(struct bPoseChannel *pchan, float mat[][3], short use_compat);
+void pchan_apply_mat4(struct bPoseChannel *pchan, float mat[][4], short use_comat);
void pchan_to_mat4(struct bPoseChannel *pchan, float chan_mat[4][4]);
/* Rotation Mode Conversions - Used for PoseChannels + Objects... */
@@ -117,6 +119,10 @@ typedef struct Mat4 {
Mat4 *b_bone_spline_setup(struct bPoseChannel *pchan, int rest);
+/* like EBONE_VISIBLE */
+#define PBONE_VISIBLE(arm, bone) (((bone)->layer & (arm)->layer) && !((bone)->flag & BONE_HIDDEN_P))
+#define _BONE_VISIBLE(arm, bone) (((bone)->layer & (arm)->layer) && !((bone)->flag & BONE_HIDDEN_P))
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/BKE_array_mallocn.h b/source/blender/blenkernel/BKE_array_mallocn.h
new file mode 100644
index 00000000000..3bfcd48b03c
--- /dev/null
+++ b/source/blender/blenkernel/BKE_array_mallocn.h
@@ -0,0 +1,82 @@
+/*
+ * $Id: BKE_array_mallocn.h 34235 2011-01-10 21:30:14Z gsrb3d $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+*/
+
+#ifndef BKE_ARRAY_MALLOCN_H
+#define BKE_ARRAY_MALLOCN_H
+
+/*little array macro library. example of usage:
+
+int *arr = NULL;
+V_DECLARE(arr);
+int i;
+
+for (i=0; i<10; i++) {
+ V_GROW(arr);
+ arr[i] = something;
+}
+V_FREE(arr);
+
+arrays are buffered, using double-buffering (so on each reallocation,
+the array size is doubled). supposedly this should give good Big Oh
+behaviour, though it may not be the best in practice.
+*/
+
+#define V_DECLARE(vec) int _##vec##_count=0; void *_##vec##_tmp
+
+/*in the future, I plan on having V_DECLARE allocate stack memory it'll
+ use at first, and switch over to heap when it needs more. that'll mess
+ up cases where you'd want to use this API to build a dynamic list for
+ non-local use, so all such cases should use this macro.*/
+#define V_DYNDECLARE(vec) V_DECLARE(vec)
+
+/*this returns the entire size of the array, including any buffering.*/
+#define V_SIZE(vec) ((signed int)((vec)==NULL ? 0 : MEM_allocN_len(vec) / sizeof(*vec)))
+
+/*this returns the logical size of the array, not including buffering.*/
+#define V_COUNT(vec) _##vec##_count
+
+/*grow the array by one. zeroes the new elements.*/
+#define V_GROW(vec) \
+ V_SIZE(vec) > _##vec##_count ? _##vec##_count++ : \
+ ((_##vec##_tmp = MEM_callocN(sizeof(*vec)*(_##vec##_count*2+2), #vec " " __FILE__ " ")),\
+ (void)(vec && memcpy(_##vec##_tmp, vec, sizeof(*vec) * _##vec##_count)),\
+ (void)(vec && (MEM_freeN(vec),1)),\
+ (vec = _##vec##_tmp),\
+ _##vec##_count++)
+
+#define V_FREE(vec) if (vec) MEM_freeN(vec);
+
+/*resets the logical size of an array to zero, but doesn't
+ free the memory.*/
+#define V_RESET(vec) _##vec##_count=0
+
+/*set the count of the array*/
+#define V_SETCOUNT(vec, count) _##vec##_count = (count)
+
+#endif // BKE_ARRAY_MALLOCN_H
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index cd9f3971540..65e7f848ea0 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -44,14 +44,19 @@ struct ReportList;
struct Scene;
struct Main;
-#define BLENDER_VERSION 254
-#define BLENDER_SUBVERSION 0
+#define BLENDER_VERSION 256
+#define BLENDER_SUBVERSION 1
#define BLENDER_MINVERSION 250
#define BLENDER_MINSUBVERSION 0
-int BKE_read_file(struct bContext *C, char *dir, void *type_r, struct ReportList *reports);
-int BKE_read_file_from_memory(struct bContext *C, char* filebuf, int filelength, void *type_r, struct ReportList *reports);
+int BKE_read_file(struct bContext *C, const char *filepath, struct ReportList *reports);
+
+#define BKE_READ_FILE_FAIL 0 /* no load */
+#define BKE_READ_FILE_OK 1 /* OK */
+#define BKE_READ_FILE_OK_USERPREFS 2 /* OK, and with new user settings */
+
+int BKE_read_file_from_memory(struct bContext *C, char* filebuf, int filelength, struct ReportList *reports);
int BKE_read_file_from_memfile(struct bContext *C, struct MemFile *memfile, struct ReportList *reports);
void free_blender(void);
@@ -65,9 +70,10 @@ void set_blender_test_break_cb(void (*func)(void) );
int blender_test_break(void);
/* global undo */
-extern void BKE_write_undo(struct bContext *C, char *name);
+extern void BKE_write_undo(struct bContext *C, const char *name);
extern void BKE_undo_step(struct bContext *C, int step);
extern void BKE_undo_name(struct bContext *C, const char *name);
+extern int BKE_undo_valid(const char *name);
extern void BKE_reset_undo(void);
extern char *BKE_undo_menu_string(void);
extern void BKE_undo_number(struct bContext *C, int nr);
diff --git a/source/blender/blenkernel/BKE_bmesh.h b/source/blender/blenkernel/BKE_bmesh.h
index 18db68a93af..44ca3842fd9 100644
--- a/source/blender/blenkernel/BKE_bmesh.h
+++ b/source/blender/blenkernel/BKE_bmesh.h
@@ -38,6 +38,7 @@
#define BKE_BMESH_H
#include "DNA_listBase.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_mempool.h"
#include "BLI_memarena.h"
diff --git a/source/blender/blenkernel/BKE_brush.h b/source/blender/blenkernel/BKE_brush.h
index 25d0eb5bc36..deb10ef6d35 100644
--- a/source/blender/blenkernel/BKE_brush.h
+++ b/source/blender/blenkernel/BKE_brush.h
@@ -36,7 +36,7 @@ struct Brush;
struct ImBuf;
struct Scene;
struct wmOperator;
-enum CurveMappingPreset;
+// enum CurveMappingPreset;
/* datablock functions */
struct Brush *add_brush(const char *name);
@@ -56,6 +56,9 @@ int brush_texture_delete(struct Brush *brush);
int brush_clone_image_set_nr(struct Brush *brush, int nr);
int brush_clone_image_delete(struct Brush *brush);
+/* jitter */
+void brush_jitter_pos(struct Brush *brush, float *pos, float *jitterpos);
+
/* brush curve */
void brush_curve_preset(struct Brush *b, /*enum CurveMappingPreset*/int preset);
float brush_curve_strength_clamp(struct Brush *br, float p, const float len);
diff --git a/source/blender/blenkernel/BKE_bvhutils.h b/source/blender/blenkernel/BKE_bvhutils.h
index 5a1db432589..975e64929c2 100644
--- a/source/blender/blenkernel/BKE_bvhutils.h
+++ b/source/blender/blenkernel/BKE_bvhutils.h
@@ -65,6 +65,7 @@ typedef struct BVHTreeFromMesh
/* Private data */
int cached;
+ void *em_evil; /* var only for snapping */
} BVHTreeFromMesh;
diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h
index 034bedbb07d..83af573bd42 100644
--- a/source/blender/blenkernel/BKE_cloth.h
+++ b/source/blender/blenkernel/BKE_cloth.h
@@ -220,9 +220,9 @@ void clmdSetInterruptCallBack ( int ( *f ) ( void ) );
// needed for modifier.c
void cloth_free_modifier_extern ( struct ClothModifierData *clmd );
-void cloth_free_modifier ( struct Object *ob, struct ClothModifierData *clmd );
+void cloth_free_modifier ( struct ClothModifierData *clmd );
void cloth_init ( struct ClothModifierData *clmd );
-struct DerivedMesh *clothModifier_do ( struct ClothModifierData *clmd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, int useRenderParams, int isFinalCalc );
+struct DerivedMesh *clothModifier_do ( struct ClothModifierData *clmd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm);
void cloth_update_normals ( ClothVertex *verts, int nVerts, struct MFace *face, int totface );
int cloth_uses_vgroup(struct ClothModifierData *clmd);
@@ -252,7 +252,7 @@ typedef enum
*/
typedef struct
{
- char *name;
+ const char *name;
CM_SOLVER_ID id;
int ( *init ) ( struct Object *ob, struct ClothModifierData *clmd );
int ( *solver ) ( struct Object *ob, float framenr, struct ClothModifierData *clmd, struct ListBase *effectors );
diff --git a/source/blender/blenkernel/BKE_collision.h b/source/blender/blenkernel/BKE_collision.h
index d7ae7df9342..03d4800076c 100644
--- a/source/blender/blenkernel/BKE_collision.h
+++ b/source/blender/blenkernel/BKE_collision.h
@@ -136,7 +136,7 @@ void interpolateOnTriangle ( float to[3], float v1[3], float v2[3], float v3[3],
/////////////////////////////////////////////////
// used in effect.c
/////////////////////////////////////////////////
-struct Object **get_collisionobjects(struct Scene *scene, struct Object *self, struct Group *group, int *numcollobj);
+struct Object **get_collisionobjects(struct Scene *scene, struct Object *self, struct Group *group, unsigned int *numcollobj);
typedef struct ColliderCache {
struct ColliderCache *next, *prev;
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h
index c00ce3525d4..3acc08a76b6 100644
--- a/source/blender/blenkernel/BKE_context.h
+++ b/source/blender/blenkernel/BKE_context.h
@@ -28,13 +28,13 @@
#ifndef BKE_CONTEXT_H
#define BKE_CONTEXT_H
+#include "DNA_listBase.h"
+#include "RNA_types.h"
+
#ifdef __cplusplus
extern "C" {
#endif
-#include "DNA_listBase.h"
-#include "RNA_types.h"
-
struct ARegion;
struct bScreen;
struct EditMesh;
@@ -114,7 +114,7 @@ bContext *CTX_copy(const bContext *C);
/* Stored Context */
-bContextStore *CTX_store_add(ListBase *contexts, char *name, PointerRNA *ptr);
+bContextStore *CTX_store_add(ListBase *contexts, const char *name, PointerRNA *ptr);
void CTX_store_set(bContext *C, bContextStore *store);
bContextStore *CTX_store_copy(bContextStore *store);
void CTX_store_free(bContextStore *store);
@@ -124,7 +124,7 @@ void CTX_store_free_list(ListBase *contexts);
int CTX_py_init_get(bContext *C);
void CTX_py_init_set(bContext *C, int value);
-void *CTX_py_dict_get(bContext *C);
+void *CTX_py_dict_get(const bContext *C);
void CTX_py_dict_set(bContext *C, void *value);
/* Window Manager Context */
@@ -163,6 +163,8 @@ void CTX_wm_screen_set(bContext *C, struct bScreen *screen); /* to be removed */
void CTX_wm_area_set(bContext *C, struct ScrArea *sa);
void CTX_wm_region_set(bContext *C, struct ARegion *region);
void CTX_wm_menu_set(bContext *C, struct ARegion *menu);
+const char *CTX_wm_operator_poll_msg_get(struct bContext *C);
+void CTX_wm_operator_poll_msg_set(struct bContext *C, const char *msg);
/* Data Context
@@ -204,9 +206,8 @@ void CTX_data_list_add(bContextDataResult *result, void *data);*/
ListBase ctx_data_list; \
CollectionPointerLink *ctx_link; \
CTX_data_##member(C, &ctx_data_list); \
- for(ctx_link= (CollectionPointerLink*)ctx_data_list.first; ctx_link; \
- ctx_link=(CollectionPointerLink*)ctx_link->next) { \
- Type instance= (Type) ctx_link->ptr.data;
+ for(ctx_link=ctx_data_list.first; ctx_link; ctx_link=ctx_link->next) { \
+ Type instance= ctx_link->ptr.data;
#define CTX_DATA_END \
} \
@@ -224,7 +225,7 @@ struct Main *CTX_data_main(const bContext *C);
struct Scene *CTX_data_scene(const bContext *C);
struct ToolSettings *CTX_data_tool_settings(const bContext *C);
-char *CTX_data_mode_string(const bContext *C);
+const char *CTX_data_mode_string(const bContext *C);
int CTX_data_mode_enum(const bContext *C);
void CTX_data_main_set(bContext *C, struct Main *bmain);
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index db6d995aa74..8c652a11794 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -54,7 +54,7 @@ struct BevList;
void unlink_curve( struct Curve *cu);
void free_curve( struct Curve *cu);
void BKE_free_editfont(struct Curve *cu);
-struct Curve *add_curve(char *name, int type);
+struct Curve *add_curve(const char *name, int type);
struct Curve *copy_curve( struct Curve *cu);
void make_local_curve( struct Curve *cu);
short curve_type( struct Curve *cu);
@@ -69,9 +69,10 @@ void duplicateNurblist( struct ListBase *lb1, struct ListBase *lb2);
void test2DNurb( struct Nurb *nu);
void minmaxNurb( struct Nurb *nu, float *min, float *max);
-void makeknots( struct Nurb *nu, short uv);
+void nurbs_knot_calc_u(struct Nurb *nu);
+void nurbs_knot_calc_v(struct Nurb *nu);
-void makeNurbfaces(struct Nurb *nu, float *coord_array, int rowstride);
+void makeNurbfaces(struct Nurb *nu, float *coord_array, int rowstride, int resolu, int resolv);
void makeNurbcurve(struct Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, float *weight_array, int resolu, int stride);
void forward_diff_bezier(float q0, float q1, float q2, float q3, float *p, int it, int stride);
float *make_orco_curve(struct Scene *scene, struct Object *ob);
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index 84eb8ef5300..e9118323682 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -32,6 +32,10 @@
#ifndef BKE_CUSTOMDATA_H
#define BKE_CUSTOMDATA_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct ID;
struct CustomData;
struct CustomDataLayer;
@@ -117,7 +121,7 @@ int CustomData_number_of_layers(const struct CustomData *data, int type);
* returns the layer data */
void *CustomData_duplicate_referenced_layer(struct CustomData *data, int type);
void *CustomData_duplicate_referenced_layer_named(struct CustomData *data,
- int type, char *name);
+ int type, const char *name);
/* set the CD_FLAG_NOCOPY flag in custom data layers where the mask is
* zero for the layer type, so only layer types specified by the mask
@@ -140,6 +144,7 @@ void CustomData_em_copy_data(const struct CustomData *source,
void CustomData_bmesh_copy_data(const struct CustomData *source,
struct CustomData *dest,void *src_block,
void **dest_block);
+void CustomData_em_validate_data(struct CustomData *data, void *block, int sub_elements);
/* frees data in a CustomData object
* return 1 on success, 0 on failure
@@ -191,10 +196,10 @@ void *CustomData_bmesh_get_n(const struct CustomData *data, void *block, int typ
void *CustomData_get_layer(const struct CustomData *data, int type);
void *CustomData_get_layer_n(const struct CustomData *data, int type, int n);
void *CustomData_get_layer_named(const struct CustomData *data, int type,
- char *name);
+ const char *name);
int CustomData_get_layer_index(const struct CustomData *data, int type);
-int CustomData_get_named_layer_index(const struct CustomData *data, int type, char *name);
+int CustomData_get_named_layer_index(const struct CustomData *data, int type, const char *name);
int CustomData_get_active_layer_index(const struct CustomData *data, int type);
int CustomData_get_render_layer_index(const struct CustomData *data, int type);
int CustomData_get_clone_layer_index(const struct CustomData *data, int type);
@@ -262,7 +267,7 @@ void CustomData_from_bmesh_block(const struct CustomData *source,
/* query info over types */
-void CustomData_file_write_info(int type, char **structname, int *structnum);
+void CustomData_file_write_info(int type, const char **structname, int *structnum);
int CustomData_sizeof(int type);
/* get the name of a layer type */
@@ -295,5 +300,9 @@ void CustomData_external_read(struct CustomData *data,
void CustomData_external_reload(struct CustomData *data,
struct ID *id, CustomDataMask mask, int totelem);
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/blenkernel/BKE_deform.h b/source/blender/blenkernel/BKE_deform.h
index 53f474aa972..52051712ff0 100644
--- a/source/blender/blenkernel/BKE_deform.h
+++ b/source/blender/blenkernel/BKE_deform.h
@@ -49,10 +49,10 @@ int defgroup_flip_index(struct Object *ob, int index, int use_default);
int defgroup_name_index(struct Object *ob, const char *name);
void defgroup_unique_name(struct bDeformGroup *dg, struct Object *ob);
-struct MDeformWeight *defvert_find_index(const struct MDeformVert *dv, int defgroup);
-struct MDeformWeight *defvert_verify_index(struct MDeformVert *dv, int defgroup);
+struct MDeformWeight *defvert_find_index(const struct MDeformVert *dv, const int defgroup);
+struct MDeformWeight *defvert_verify_index(struct MDeformVert *dv, const int defgroup);
-float defvert_find_weight(const struct MDeformVert *dvert, int group_num);
+float defvert_find_weight(const struct MDeformVert *dvert, const int group_num);
float defvert_array_find_weight_safe(const struct MDeformVert *dvert, int index, int group_num);
void defvert_copy(struct MDeformVert *dvert_r, const struct MDeformVert *dvert);
diff --git a/source/blender/blenkernel/BKE_depsgraph.h b/source/blender/blenkernel/BKE_depsgraph.h
index 0b78a1206fe..91954131b71 100644
--- a/source/blender/blenkernel/BKE_depsgraph.h
+++ b/source/blender/blenkernel/BKE_depsgraph.h
@@ -28,6 +28,10 @@
#ifndef DEPSGRAPH_API
#define DEPSGRAPH_API
+#ifdef __cplusplus
+extern "C" {
+#endif
+
/*
#define DEPS_DEBUG
*/
@@ -100,25 +104,28 @@ void draw_all_deps(void);
void DAG_scene_sort(struct Main *bmain, struct Scene *sce);
/* flag all objects that need recalc because they're animated */
-void DAG_scene_update_flags(struct Main *bmain, struct Scene *sce, unsigned int lay);
+void DAG_scene_update_flags(struct Main *bmain, struct Scene *sce, unsigned int lay, const short do_time);
/* flushes all recalc flags in objects down the dependency tree */
-void DAG_scene_flush_update(struct Main *bmain, struct Scene *sce, unsigned int lay, int time);
+void DAG_scene_flush_update(struct Main *bmain, struct Scene *sce, unsigned int lay, const short do_time);
/* tag objects for update on file load */
-void DAG_on_load_update(struct Main *bmain);
-
- /* flag all IDs that need recalc because they're animated, influencing
- this ID only. only for objects currently */
-void DAG_id_update_flags(struct ID *id);
- /* flushes all recalc flags for this object down the dependency tree,
- but note the DAG only supports objects and object data currently */
-void DAG_id_flush_update(struct ID *id, short flag);
+void DAG_on_load_update(struct Main *bmain, const short do_time);
+
/* when setting manual RECALC flags, call this afterwards */
void DAG_ids_flush_update(struct Main *bmain, int time);
+ /* tag datablock to get updated for the next redraw */
+void DAG_id_tag_update(struct ID *id, short flag);
+ /* flush all tagged updates */
+void DAG_ids_flush_tagged(struct Main *bmain);
+
/* (re)-create dependency graph for armature pose */
void DAG_pose_sort(struct Object *ob);
/* callback for editors module to do updates */
void DAG_editors_update_cb(void (*func)(struct Main *bmain, struct ID *id));
+
+#ifdef __cplusplus
+}
+#endif
#endif
diff --git a/source/blender/blenkernel/BKE_exotic.h b/source/blender/blenkernel/BKE_exotic.h
index 740a94b6169..ad59cd9c0a8 100644
--- a/source/blender/blenkernel/BKE_exotic.h
+++ b/source/blender/blenkernel/BKE_exotic.h
@@ -40,7 +40,14 @@ struct Scene;
* @retval 1 The file was read succesfully.
* @attention Used in filesel.c
*/
-int BKE_read_exotic(struct Scene *scene, char *name);
+int BKE_read_exotic(struct Scene *scene, const char *name);
+
+/* return codes */
+#define BKE_READ_EXOTIC_FAIL_PATH -3 /* file format is not supported */
+#define BKE_READ_EXOTIC_FAIL_FORMAT -2 /* file format is not supported */
+#define BKE_READ_EXOTIC_FAIL_OPEN -1 /* Can't open the file */
+#define BKE_READ_EXOTIC_OK_BLEND 0 /* .blend file */
+#define BKE_READ_EXOTIC_OK_OTHER 1 /* other supported formats */
void write_dxf(struct Scene *scene, char *str);
void write_stl(struct Scene *scene, char *str);
diff --git a/source/blender/blenkernel/BKE_fcurve.h b/source/blender/blenkernel/BKE_fcurve.h
index 95e0cfc3a91..5fbb7f37d15 100644
--- a/source/blender/blenkernel/BKE_fcurve.h
+++ b/source/blender/blenkernel/BKE_fcurve.h
@@ -28,6 +28,10 @@
#ifndef BKE_FCURVE_H
#define BKE_FCURVE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct FCurve;
struct FModifier;
struct ChannelDriver;
@@ -136,7 +140,7 @@ typedef enum eFMI_Action_Types {
/* modifier only modifies the values of points (but times stay the same) */
FMI_TYPE_REPLACE_VALUES,
/* modifier generates a curve regardless of what came before */
- FMI_TYPE_GENERATE_CURVE,
+ FMI_TYPE_GENERATE_CURVE
} eFMI_Action_Types;
/* Flags for the requirements of a FModifier Type */
@@ -148,7 +152,7 @@ typedef enum eFMI_Requirement_Flags {
*/
FMI_REQUIRES_NOTHING = (1<<1),
/* refer to modifier instance */
- FMI_REQUIRES_RUNTIME_CHECK = (1<<2),
+ FMI_REQUIRES_RUNTIME_CHECK = (1<<2)
} eFMI_Requirement_Flags;
/* Function Prototypes for FModifierTypeInfo's */
@@ -189,7 +193,7 @@ struct FCurve *list_find_fcurve(ListBase *list, const char rna_path[], const int
struct FCurve *iter_step_fcurve (struct FCurve *fcu_iter, const char rna_path[]);
/* high level function to get an fcurve from C without having the rna */
-struct FCurve *id_data_find_fcurve(ID *id, void *data, struct StructRNA *type, char *prop_name, int index);
+struct FCurve *id_data_find_fcurve(ID *id, void *data, struct StructRNA *type, const char *prop_name, int index);
/* Get list of LinkData's containing pointers to the F-Curves which control the types of data indicated
* e.g. numMatches = list_find_data_fcurves(matches, &act->curves, "pose.bones[", "MyFancyBone");
@@ -210,6 +214,14 @@ void calc_fcurve_range(struct FCurve *fcu, float *min, float *max);
/* get the bounding-box extents for F-Curve */
void calc_fcurve_bounds(struct FCurve *fcu, float *xmin, float *xmax, float *ymin, float *ymax);
+/* .............. */
+
+/* Are keyframes on F-Curve of any use (to final result, and to show in editors)? */
+short fcurve_are_keyframes_usable(struct FCurve *fcu);
+
+/* Can keyframes be added to F-Curve? */
+short fcurve_is_keyframable(struct FCurve *fcu);
+
/* -------- Curve Sanity -------- */
void calchandles_fcurve(struct FCurve *fcu);
@@ -248,4 +260,8 @@ float fcurve_samplingcb_evalcurve(struct FCurve *fcu, void *data, float evaltime
*/
void fcurve_store_samples(struct FCurve *fcu, void *data, int start, int end, FcuSampleFunc sample_cb);
+#ifdef __cplusplus
+}
+#endif
+
#endif /* BKE_FCURVE_H*/
diff --git a/source/blender/blenkernel/BKE_font.h b/source/blender/blenkernel/BKE_font.h
index 10811c0776d..c47a0b21855 100644
--- a/source/blender/blenkernel/BKE_font.h
+++ b/source/blender/blenkernel/BKE_font.h
@@ -75,7 +75,7 @@ void BKE_font_register_builtin(void *mem, int size);
void free_vfont(struct VFont *sc);
void free_ttfont(void);
struct VFont *get_builtin_font(void);
-struct VFont *load_vfont(char *name);
+struct VFont *load_vfont(const char *name);
struct TmpFont *vfont_find_tmpfont(struct VFont *vfont);
struct chartrans *BKE_text_to_curve(struct Scene *scene, struct Object *ob, int mode);
diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h
index 6a602339e11..d222fe8d296 100644
--- a/source/blender/blenkernel/BKE_global.h
+++ b/source/blender/blenkernel/BKE_global.h
@@ -52,16 +52,17 @@ typedef struct Global {
struct Main *main;
/* strings: lastsaved */
- char ima[256], sce[256], lib[256];
+ char ima[256], lib[256];
- /* flag: if != 0 G.sce contains valid relative base path */
+ /* flag: if != 0 G.main->name contains valid relative base path */
int relbase_valid;
/* strings of recent opend files */
struct ListBase recent_files;
short afbreek, moving, file_loaded;
- short background;
+ char background;
+ char factory_startup;
short winpos, displaymode; /* used to be in Render */
short rendering; /* to indicate render is busy, prevent renderwindow events etc */
@@ -91,10 +92,6 @@ typedef struct Global {
/* ndof device found ? */
int ndofdevice;
-
- /* confusing... G.f and G.flags */
- int flags;
-
} Global;
/* **************** GLOBAL ********************* */
@@ -125,17 +122,17 @@ typedef struct Global {
#define G_FILE_ENABLE_ALL_FRAMES (1 << 3) /* deprecated */
#define G_FILE_SHOW_DEBUG_PROPS (1 << 4) /* deprecated */
#define G_FILE_SHOW_FRAMERATE (1 << 5) /* deprecated */
-#define G_FILE_SHOW_PROFILE (1 << 6) /* deprecated */
+/* #define G_FILE_SHOW_PROFILE (1 << 6) */ /* deprecated */
#define G_FILE_LOCK (1 << 7)
#define G_FILE_SIGN (1 << 8)
-#define G_FIle_PUBLISH (1 << 9)
+/* #define G_FILE_PUBLISH (1 << 9) */ /* deprecated */
#define G_FILE_NO_UI (1 << 10)
-#define G_FILE_GAME_TO_IPO (1 << 11) /* deprecated */
+/* #define G_FILE_GAME_TO_IPO (1 << 11) */ /* deprecated */
#define G_FILE_GAME_MAT (1 << 12) /* deprecated */
-#define G_FILE_DISPLAY_LISTS (1 << 13) /* deprecated */
+/* #define G_FILE_DISPLAY_LISTS (1 << 13) */ /* deprecated */
#define G_FILE_SHOW_PHYSICS (1 << 14) /* deprecated */
#define G_FILE_GAME_MAT_GLSL (1 << 15) /* deprecated */
-#define G_FILE_GLSL_NO_LIGHTS (1 << 16) /* deprecated */
+/* #define G_FILE_GLSL_NO_LIGHTS (1 << 16) */ /* deprecated */
#define G_FILE_GLSL_NO_SHADERS (1 << 17) /* deprecated */
#define G_FILE_GLSL_NO_SHADOWS (1 << 18) /* deprecated */
#define G_FILE_GLSL_NO_RAMPS (1 << 19) /* deprecated */
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 65bcb54408b..898538c6820 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -42,7 +42,7 @@ void free_gpencil_data(struct bGPdata *gpd);
struct bGPDframe *gpencil_frame_addnew(struct bGPDlayer *gpl, int cframe);
struct bGPDlayer *gpencil_layer_addnew(struct bGPdata *gpd);
-struct bGPdata *gpencil_data_addnew(char name[]);
+struct bGPdata *gpencil_data_addnew(const char name[]);
struct bGPDframe *gpencil_frame_duplicate(struct bGPDframe *src);
struct bGPDlayer *gpencil_layer_duplicate(struct bGPDlayer *src);
diff --git a/source/blender/blenkernel/BKE_group.h b/source/blender/blenkernel/BKE_group.h
index e63e3c93f1e..767e3c97fef 100644
--- a/source/blender/blenkernel/BKE_group.h
+++ b/source/blender/blenkernel/BKE_group.h
@@ -40,7 +40,7 @@ struct Scene;
void free_group_objects(struct Group *group);
void unlink_group(struct Group *group);
-struct Group *add_group(char *name);
+struct Group *add_group(const char *name);
struct Group *copy_group(struct Group *group);
int add_to_group(struct Group *group, struct Object *ob, struct Scene *scene, struct Base *base);
int rem_from_group(struct Group *group, struct Object *ob, struct Scene *scene, struct Base *base);
diff --git a/source/blender/blenkernel/BKE_icons.h b/source/blender/blenkernel/BKE_icons.h
index 252191803f2..42cbd22d9f1 100644
--- a/source/blender/blenkernel/BKE_icons.h
+++ b/source/blender/blenkernel/BKE_icons.h
@@ -68,7 +68,7 @@ void BKE_icon_delete(struct ID* id);
void BKE_icon_changed(int icon_id);
/* free all icons */
-void BKE_icons_free();
+void BKE_icons_free(void);
/* free the preview image */
void BKE_previewimg_free(struct PreviewImage **prv);
@@ -77,7 +77,7 @@ void BKE_previewimg_free(struct PreviewImage **prv);
void BKE_previewimg_free_id(ID *id);
/* create a new preview image */
-struct PreviewImage* BKE_previewimg_create() ;
+struct PreviewImage* BKE_previewimg_create(void) ;
/* create a copy of the preview image */
struct PreviewImage* BKE_previewimg_copy(struct PreviewImage *prv);
diff --git a/source/blender/blenkernel/BKE_idprop.h b/source/blender/blenkernel/BKE_idprop.h
index 0e0d76f4284..0ca5690e635 100644
--- a/source/blender/blenkernel/BKE_idprop.h
+++ b/source/blender/blenkernel/BKE_idprop.h
@@ -33,7 +33,7 @@
struct IDProperty;
struct ID;
-typedef union {
+typedef union IDPropertyTemplate {
int i;
float f;
double d;
@@ -72,8 +72,8 @@ void IDP_UnlinkArray(struct IDProperty *prop);
/* ---------- String Type ------------ */
IDProperty *IDP_NewString(const char *st, const char *name, int maxlen);/* maxlen excludes '\0' */
-void IDP_AssignString(struct IDProperty *prop, char *st, int maxlen); /* maxlen excludes '\0' */
-void IDP_ConcatStringC(struct IDProperty *prop, char *st);
+void IDP_AssignString(struct IDProperty *prop, const char *st, int maxlen); /* maxlen excludes '\0' */
+void IDP_ConcatStringC(struct IDProperty *prop, const char *st);
void IDP_ConcatString(struct IDProperty *str1, struct IDProperty *append);
void IDP_FreeString(struct IDProperty *prop);
@@ -127,6 +127,8 @@ int IDP_InsertToGroup(struct IDProperty *group, struct IDProperty *previous,
void IDP_RemFromGroup(struct IDProperty *group, struct IDProperty *prop);
IDProperty *IDP_GetPropertyFromGroup(struct IDProperty *prop, const char *name);
+/* same as above but ensure type match */
+IDProperty *IDP_GetPropertyTypeFromGroup(struct IDProperty *prop, const char *name, const char type);
/*Get an iterator to iterate over the members of an id property group.
Note that this will automatically free the iterator once iteration is complete;
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index e246b51af09..283badc6faa 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -46,8 +46,9 @@ void free_image(struct Image *me);
void BKE_stamp_info(struct Scene *scene, struct ImBuf *ibuf);
void BKE_stamp_buf(struct Scene *scene, unsigned char *rect, float *rectf, int width, int height, int channels);
-int BKE_write_ibuf(struct Scene *scene, struct ImBuf *ibuf, char *name, int imtype, int subimtype, int quality);
-void BKE_makepicstring(char *string, char *base, int frame, int imtype, int use_ext);
+int BKE_alphatest_ibuf(struct ImBuf *ibuf);
+int BKE_write_ibuf(struct Scene *scene, struct ImBuf *ibuf, const char *name, int imtype, int subimtype, int quality);
+void BKE_makepicstring(char *string, const char *base, int frame, int imtype, const short use_ext, const short use_frames);
int BKE_add_image_extension(char *string, int imtype);
int BKE_ftype_to_imtype(int ftype);
int BKE_imtype_to_ftype(int imtype);
@@ -93,10 +94,6 @@ struct RenderResult;
/* reload only frees, doesn't read until image_get_ibuf() called */
#define IMA_SIGNAL_RELOAD 0
#define IMA_SIGNAL_FREE 1
- /* pack signals are executed */
-#define IMA_SIGNAL_PACK 2
-#define IMA_SIGNAL_REPACK 3
-#define IMA_SIGNAL_UNPACK 4
/* source changes, from image to sequence or movie, etc */
#define IMA_SIGNAL_SRC_CHANGE 5
/* image-user gets a new image, check settings */
@@ -112,10 +109,10 @@ struct ImBuf *BKE_image_acquire_ibuf(struct Image *ima, struct ImageUser *iuser,
void BKE_image_release_ibuf(struct Image *ima, void *lock);
/* returns existing Image when filename/type is same (frame optional) */
-struct Image *BKE_add_image_file(const char *name, int frame);
+struct Image *BKE_add_image_file(const char *name);
/* adds image, adds ibuf, generates color or pattern */
-struct Image *BKE_add_image_size(int width, int height, char *name, int depth, int floatbuf, short uvtestgrid, float color[4]);
+struct Image *BKE_add_image_size(unsigned int width, unsigned int height, const char *name, int depth, int floatbuf, short uvtestgrid, float color[4]);
/* adds image from imbuf, owns imbuf */
struct Image *BKE_add_image_imbuf(struct ImBuf *ibuf);
diff --git a/source/blender/blenkernel/BKE_ipo.h b/source/blender/blenkernel/BKE_ipo.h
index 3bc707a674a..e700f263011 100644
--- a/source/blender/blenkernel/BKE_ipo.h
+++ b/source/blender/blenkernel/BKE_ipo.h
@@ -44,10 +44,6 @@ void do_versions_ipos_to_animato(struct Main *main);
void free_ipo(struct Ipo *ipo);
-// xxx perhaps this should be in curve api not in anim api
-void correct_bezpart(float *v1, float *v2, float *v3, float *v4);
-
-
#ifdef __cplusplus
};
#endif
diff --git a/source/blender/blenkernel/BKE_key.h b/source/blender/blenkernel/BKE_key.h
index 31e920406c0..416b89ef36e 100644
--- a/source/blender/blenkernel/BKE_key.h
+++ b/source/blender/blenkernel/BKE_key.h
@@ -59,14 +59,14 @@ void key_curve_normal_weights(float t, float *data, int type);
float *do_ob_key(struct Scene *scene, struct Object *ob);
struct Key *ob_get_key(struct Object *ob);
-struct KeyBlock *add_keyblock(struct Key *key, char *name);
+struct KeyBlock *add_keyblock(struct Key *key, const char *name);
struct KeyBlock *ob_get_keyblock(struct Object *ob);
struct KeyBlock *ob_get_reference_keyblock(struct Object *ob);
struct KeyBlock *key_get_keyblock(struct Key *key, int index);
struct KeyBlock *key_get_named_keyblock(struct Key *key, const char name[]);
char *key_get_curValue_rnaPath(struct Key *key, struct KeyBlock *kb);
// needed for the GE
-void do_rel_key(int start, int end, int tot, char *basispoin, struct Key *key, struct KeyBlock *actkb, int mode);
+void do_rel_key(const int start, int end, const int tot, char *basispoin, struct Key *key, struct KeyBlock *actkb, const int mode);
/* conversion functions */
void key_to_mesh(struct KeyBlock *kb, struct Mesh *me);
diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h
index 880f3f7e724..4f405e71662 100644
--- a/source/blender/blenkernel/BKE_lattice.h
+++ b/source/blender/blenkernel/BKE_lattice.h
@@ -39,7 +39,7 @@ struct BPoint;
struct MDeformVert;
void resizelattice(struct Lattice *lt, int u, int v, int w, struct Object *ltOb);
-struct Lattice *add_lattice(char *name);
+struct Lattice *add_lattice(const char *name);
struct Lattice *copy_lattice(struct Lattice *lt);
void free_lattice(struct Lattice *lt);
void make_local_lattice(struct Lattice *lt);
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index e25c379ded1..f956749dc9d 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -33,6 +33,10 @@
#ifndef BKE_LIBRARY_TYPES_H
#define BKE_LIBRARY_TYPES_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct ListBase;
struct ID;
struct Main;
@@ -42,7 +46,7 @@ struct bContext;
void *alloc_libblock(struct ListBase *lb, short type, const char *name);
void *copy_libblock(void *rt);
-void copy_libblock_data(struct ID *id, const struct ID *id_from);
+void copy_libblock_data(struct ID *id, const struct ID *id_from, const short do_action);
void id_lib_extern(struct ID *id);
void id_us_plus(struct ID *id);
@@ -61,20 +65,22 @@ int set_listbasepointers(struct Main *main, struct ListBase **lb);
void free_libblock(struct ListBase *lb, void *idv);
void free_libblock_us(struct ListBase *lb, void *idv);
void free_main(struct Main *mainvar);
-void tag_main(struct Main *mainvar, int tag);
-int splitIDname(char *name, char *left, int *nr);
-void rename_id(struct ID *id, char *name);
+void tag_main_idcode(struct Main *mainvar, const short type, const short tag);
+void tag_main_lb(struct ListBase *lb, const short tag);
+void tag_main(struct Main *mainvar, const short tag);
+
+void rename_id(struct ID *id, const char *name);
void name_uiprefix_id(char *name, struct ID *id);
void test_idbutton(char *name);
void text_idbutton(struct ID *id, char *text);
void all_local(struct Library *lib, int untagged_only);
-struct ID *find_id(char *type, char *name);
+struct ID *find_id(const char *type, const char *name);
void clear_id_newpoins(void);
-void IDnames_to_pupstring(char **str, char *title, char *extraops, struct ListBase *lb,struct ID* link, short *nr);
-void IMAnames_to_pupstring(char **str, char *title, char *extraops, struct ListBase *lb, struct ID *link, short *nr);
-void IPOnames_to_pupstring(char **str, char *title, char *extraops, struct ListBase *lb, struct ID* link, short *nr, int blocktype);
+void IDnames_to_pupstring(const char **str, const char *title, const char *extraops, struct ListBase *lb,struct ID* link, short *nr);
+void IMAnames_to_pupstring(const char **str, const char *title, const char *extraops, struct ListBase *lb, struct ID *link, short *nr);
+void IPOnames_to_pupstring(const char **str, const char *title, const char *extraops, struct ListBase *lb, struct ID* link, short *nr, int blocktype);
void flag_listbase_ids(ListBase *lb, short flag, short value);
void flag_all_listbases_ids(short flag, short value);
@@ -85,4 +91,10 @@ void set_free_windowmanager_cb(void (*func)(struct bContext *, struct wmWindowMa
/* use when "" is given to new_id() */
#define ID_FALLBACK_NAME "Untitled"
+#define IS_TAGGED(_id) ((_id) && (((ID *)_id)->flag & LIB_DOIT))
+
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/blenkernel/BKE_main.h b/source/blender/blenkernel/BKE_main.h
index 60c2d51571f..74d4cf88eda 100644
--- a/source/blender/blenkernel/BKE_main.h
+++ b/source/blender/blenkernel/BKE_main.h
@@ -40,6 +40,10 @@
#include "DNA_listBase.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct Library;
typedef struct Main {
@@ -47,6 +51,7 @@ typedef struct Main {
char name[240];
short versionfile, subversionfile;
short minversionfile, minsubversionfile;
+ int revision; /* svn revision of binary that saved file */
struct Library *curlib;
ListBase scene;
@@ -77,8 +82,14 @@ typedef struct Main {
ListBase particle;
ListBase wm;
ListBase gpencil;
+
+ char id_tag_update[256];
} Main;
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h
index 40d98394a8e..16c99cd850f 100644
--- a/source/blender/blenkernel/BKE_material.h
+++ b/source/blender/blenkernel/BKE_material.h
@@ -45,9 +45,11 @@ struct Object;
void init_def_material(void);
void free_material(struct Material *sc);
void test_object_materials(struct ID *id);
+void resize_object_material(struct Object *ob, const short totcol);
void init_material(struct Material *ma);
-struct Material *add_material(char *name);
+struct Material *add_material(const char *name);
struct Material *copy_material(struct Material *ma);
+struct Material *localize_material(struct Material *ma);
struct Material *give_node_material(struct Material *ma); /* returns node material or self */
void make_local_material(struct Material *ma);
diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h
index 7fa4fc1a05e..6f36c26dd3f 100644
--- a/source/blender/blenkernel/BKE_mball.h
+++ b/source/blender/blenkernel/BKE_mball.h
@@ -127,12 +127,7 @@ struct pgn_elements {
char *data;
};
-void calc_mballco(struct MetaElem *ml, float *vec);
-float densfunc(struct MetaElem *ball, float x, float y, float z);
octal_node* find_metaball_octal_node(octal_node *node, float x, float y, float z, short depth);
-float metaball(float x, float y, float z);
-void accum_mballfaces(int i1, int i2, int i3, int i4);
-void *new_pgn_element(int size);
void freepolygonize(PROCESS *p);
void docube(CUBE *cube, PROCESS *p, struct MetaBall *mb);
@@ -159,7 +154,7 @@ float init_meta(struct Scene *scene, struct Object *ob);
void unlink_mball(struct MetaBall *mb);
void free_mball(struct MetaBall *mb);
-struct MetaBall *add_mball(char *name);
+struct MetaBall *add_mball(const char *name);
struct MetaBall *copy_mball(struct MetaBall *mb);
void make_local_mball(struct MetaBall *mb);
struct MetaElem *add_metaball_element(struct MetaBall *mb, const int type);
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index e80c266ff70..02d52e10fa5 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -47,6 +47,8 @@ struct Object;
struct MTFace;
struct VecNor;
struct CustomData;
+struct DerivedMesh;
+struct Scene;
#ifdef __cplusplus
extern "C" {
@@ -57,7 +59,7 @@ void BKE_mesh_end_editmesh(struct Mesh *me, struct EditMesh *em);
void unlink_mesh(struct Mesh *me);
void free_mesh(struct Mesh *me);
-struct Mesh *add_mesh(char *name);
+struct Mesh *add_mesh(const char *name);
struct Mesh *copy_mesh(struct Mesh *me);
void mesh_update_customdata_pointers(struct Mesh *me);
void make_local_tface(struct Mesh *me);
@@ -87,7 +89,9 @@ void mesh_get_texspace(struct Mesh *me, float *loc_r, float *rot_r, float *size_
/* if old, it converts mface->edcode to edge drawflags */
void make_edges(struct Mesh *me, int old);
+
void mesh_strip_loose_faces(struct Mesh *me);
+void mesh_strip_loose_edges(struct Mesh *me);
/* Calculate vertex and face normals, face normals are returned in *faceNors_r if non-NULL
* and vertex normals are stored in actual mverts.
@@ -132,8 +136,8 @@ void create_vert_edge_map(ListBase **map, IndexNode **mem, const struct MEdge *m
/* Partial Mesh Visibility */
struct PartialVisibility *mesh_pmv_copy(struct PartialVisibility *);
void mesh_pmv_free(struct PartialVisibility *);
-void mesh_pmv_revert(struct Object *ob, struct Mesh *me);
-void mesh_pmv_off(struct Object *ob, struct Mesh *me);
+void mesh_pmv_revert(struct Mesh *me);
+void mesh_pmv_off(struct Mesh *me);
/* functions for making menu's from customdata layers */
int mesh_layers_menu_charlen(struct CustomData *data, int type); /* use this to work out how many chars to allocate */
@@ -147,9 +151,15 @@ int mesh_center_median(struct Mesh *me, float cent[3]);
int mesh_center_bounds(struct Mesh *me, float cent[3]);
void mesh_translate(struct Mesh *me, float offset[3], int do_keys);
+/* mesh_validate.c */
+int BKE_mesh_validate_arrays(struct Mesh *me, struct MVert *mverts, int totvert, struct MEdge *medges, int totedge, struct MFace *mfaces, int totface, const short do_verbose, const short do_fixes);
+int BKE_mesh_validate(struct Mesh *me, int do_verbose);
+int BKE_mesh_validate_dm(struct DerivedMesh *dm);
+
+void BKE_mesh_calc_edges(struct Mesh *mesh, int update);
+
#ifdef __cplusplus
}
#endif
-#endif
-
+#endif /* BKE_MESH_H */
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index 95a9394427f..5bef7527c87 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -134,6 +134,12 @@ typedef struct ModifierTypeInfo {
float (*vertexCos)[3], int numVerts,
int useRenderParams, int isFinalCalc);
+ /* Like deformMatricesEM but called from object mode (for supporting modifiers in sculpt mode) */
+ void (*deformMatrices)(
+ struct ModifierData *md, struct Object *ob,
+ struct DerivedMesh *derivedData,
+ float (*vertexCos)[3], float (*defMats)[3][3], int numVerts);
+
/* Like deformVerts but called during editmode (for supporting modifiers)
*/
void (*deformVertsEM)(
@@ -245,6 +251,17 @@ typedef struct ModifierTypeInfo {
*/
int (*dependsOnTime)(struct ModifierData *md);
+
+ /* True when a deform modifier uses normals, the requiredDataMask
+ * cant be used here because that refers to a normal layer where as
+ * in this case we need to know if the deform modifier uses normals.
+ *
+ * this is needed because applying 2 deform modifiers will give the
+ * second modifier bogus normals.
+ * */
+ int (*dependsOnNormals)(struct ModifierData *md);
+
+
/* Should call the given walk function on with a pointer to each Object
* pointer that the modifier data stores. This is used for linking on file
* load and for unlinking objects or forwarding object references.
@@ -283,7 +300,11 @@ int modifier_couldBeCage(struct Scene *scene, struct ModifierData *md)
int modifier_isCorrectableDeformed(struct ModifierData *md);
int modifier_sameTopology(ModifierData *md);
int modifier_isEnabled(struct Scene *scene, struct ModifierData *md, int required_mode);
-void modifier_setError(struct ModifierData *md, char *format, ...);
+void modifier_setError(struct ModifierData *md, const char *format, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 2, 3)));
+#endif
+;
void modifiers_foreachObjectLink(struct Object *ob,
ObjectWalkFunc walk,
@@ -304,7 +325,7 @@ int modifiers_isParticleEnabled(struct Object *ob);
struct Object *modifiers_isDeformedByArmature(struct Object *ob);
struct Object *modifiers_isDeformedByLattice(struct Object *ob);
int modifiers_usesArmature(struct Object *ob, struct bArmature *arm);
-int modifiers_isCorrectableDeformed(struct Scene *scene, struct Object *ob);
+int modifiers_isCorrectableDeformed(struct Object *ob);
void modifier_freeTemporaryData(struct ModifierData *md);
int modifiers_indexInObject(struct Object *ob, struct ModifierData *md);
diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h
index fc0ab2eea1e..de895ebce51 100644
--- a/source/blender/blenkernel/BKE_multires.h
+++ b/source/blender/blenkernel/BKE_multires.h
@@ -37,6 +37,8 @@ struct Multires;
struct MultiresModifierData;
struct ModifierData;
struct Object;
+struct Scene;
+struct MDisps;
void multires_mark_as_modified(struct Object *ob);
@@ -51,10 +53,11 @@ struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*
struct MultiresModifierData *find_multires_modifier_before(struct Scene *scene,
struct ModifierData *lastmd);
+struct MultiresModifierData *get_multires_modifier(struct Scene *scene, struct Object *ob, int use_first);
struct DerivedMesh *get_multires_dm(struct Scene *scene, struct MultiresModifierData *mmd,
struct Object *ob);
-void multiresModifier_join(struct Object *);
void multiresModifier_del_levels(struct MultiresModifierData *, struct Object *, int direction);
+void multiresModifier_base_apply(struct MultiresModifierData *mmd, struct Object *ob);
void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob,
int updateblock, int simple);
int multiresModifier_reshape(struct Scene *scene, struct MultiresModifierData *mmd,
@@ -71,5 +74,22 @@ void multires_free(struct Multires *mr);
void multires_load_old(struct Object *ob, struct Mesh *me);
void multires_load_old_250(struct Mesh *);
-#endif
+void multiresModifier_scale_disp(struct Scene *scene, struct Object *ob);
+void multiresModifier_prepare_join(struct Scene *scene, struct Object *ob, struct Object *to_ob);
+
+int multires_mdisp_corners(struct MDisps *s);
+void multires_mdisp_smooth_bounds(struct MDisps *disps);
+
+/* update multires data after topology changing */
+void multires_topology_changed(struct Scene *scene, struct Object *ob);
+
+/**** interpolation stuff ****/
+void old_mdisps_bilinear(float out[3], float (*disps)[3], const int st, float u, float v);
+void mdisp_rot_crn_to_face(const int S, const int corners, const int face_side, const float x, const float y, float *u, float *v);
+int mdisp_rot_face_to_crn(const int corners, const int face_side, const float u, const float v, float *x, float *y);
+void mdisp_apply_weight(const int S, const int corners, int x, int y, const int face_side, float crn_weight[4][2], float *u_r, float *v_r);
+void mdisp_flip_disp(const int S, const int corners, const float axis_x[2], const float axis_y[2], float disp[3]);
+void mdisp_join_tris(struct MDisps *dst, struct MDisps *tri1, struct MDisps *tri2);
+
+#endif // BKE_MULTIRES_H
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 7b4925b7a46..57d18f58e2d 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -61,7 +61,7 @@ struct uiLayout;
typedef struct bNodeSocketType {
int type, limit;
- char *name;
+ const char *name;
float val1, val2, val3, val4; /* default alloc value for inputs */
float min, max; /* default range for inputs */
@@ -75,7 +75,7 @@ typedef struct bNodeSocketType {
typedef struct bNodeType {
void *next,*prev;
int type;
- char *name;
+ const char *name; /* can be allocated too */
float width, minwidth, maxwidth;
short nclass, flag;
@@ -87,6 +87,7 @@ typedef struct bNodeType {
/* this line is set on startup of blender */
void (*uifunc)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
+ const char *(*labelfunc)(struct bNode *);
void (*initfunc)(struct bNode *);
void (*freestoragefunc)(struct bNode *);
@@ -129,13 +130,13 @@ typedef struct bNodeType {
void ntreeVerifyTypes(struct bNodeTree *ntree);
-struct bNodeTree *ntreeAddTree(int type);
+struct bNodeTree *ntreeAddTree(const char *name, int type, const short is_group);
void ntreeInitTypes(struct bNodeTree *ntree);
void ntreeMakeOwnType(struct bNodeTree *ntree);
void ntreeUpdateType(struct bNodeTree *ntree, struct bNodeType *ntype);
void ntreeFreeTree(struct bNodeTree *ntree);
-struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree, int internal_select);
+struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree);
void ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to);
void ntreeMakeLocal(struct bNodeTree *ntree);
@@ -193,6 +194,7 @@ void nodeClearActiveID(struct bNodeTree *ntree, short idtype);
void NodeTagChanged(struct bNodeTree *ntree, struct bNode *node);
int NodeTagIDChanged(struct bNodeTree *ntree, struct ID *id);
+void ntreeClearTags(struct bNodeTree *ntree);
/* ************** Groups ****************** */
@@ -206,12 +208,24 @@ void nodeCopyGroup(struct bNode *gnode);
/* ************** COMMON NODES *************** */
+/* Init a new node type struct with default values and callbacks */
+void node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass, short flag,
+ struct bNodeSocketType *inputs, struct bNodeSocketType *outputs);
+void node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth);
+void node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNode *));
+void node_type_storage(struct bNodeType *ntype,
+ const char *storagename,
+ void (*freestoragefunc)(struct bNode *),
+ void (*copystoragefunc)(struct bNode *, struct bNode *));
+void node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **));
+void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out));
+void node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *));
+
#define NODE_GROUP 2
#define NODE_GROUP_MENU 1000
#define NODE_DYNAMIC_MENU 4000
-extern bNodeType node_group_typeinfo;
-
+void register_node_type_group(ListBase *lb);
/* ************** SHADER NODES *************** */
@@ -399,7 +413,6 @@ int ntreeCompositTagAnimated(struct bNodeTree *ntree);
void ntreeCompositTagGenerators(struct bNodeTree *ntree);
void ntreeCompositForceHidden(struct bNodeTree *ntree, struct Scene *scene);
-void free_compbuf(struct CompBuf *cbuf); /* internal...*/
/* ************** TEXTURE NODES *************** */
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 2a7ba4f98c9..100b5111717 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -71,25 +71,26 @@ void object_free_modifiers(struct Object *ob);
void object_make_proxy(struct Object *ob, struct Object *target, struct Object *gob);
void object_copy_proxy_drivers(struct Object *ob, struct Object *target);
-void unlink_object(struct Scene *scene, struct Object *ob);
+void unlink_object(struct Object *ob);
int exist_object(struct Object *obtest);
-void *add_camera(char *name);
+void *add_camera(const char *name);
struct Camera *copy_camera(struct Camera *cam);
void make_local_camera(struct Camera *cam);
float dof_camera(struct Object *ob);
-void *add_lamp(char *name);
+void *add_lamp(const char *name);
struct Lamp *copy_lamp(struct Lamp *la);
void make_local_lamp(struct Lamp *la);
void free_camera(struct Camera *ca);
void free_lamp(struct Lamp *la);
-struct Object *add_only_object(int type, char *name);
+struct Object *add_only_object(int type, const char *name);
struct Object *add_object(struct Scene *scene, int type);
struct Object *copy_object(struct Object *ob);
void expand_local_object(struct Object *ob);
void make_local_object(struct Object *ob);
+int object_is_libdata(struct Object *ob);
int object_data_is_libdata(struct Object *ob);
void set_mblur_offs(float blur);
void set_field_offs(float field);
@@ -98,10 +99,10 @@ void disable_speed_curve(int val);
float bsystem_time(struct Scene *scene, struct Object *ob, float cfra, float ofs);
void object_scale_to_mat3(struct Object *ob, float mat[][3]);
void object_rot_to_mat3(struct Object *ob, float mat[][3]);
-void object_mat3_to_rot(struct Object *ob, float mat[][3], int use_compat);
+void object_mat3_to_rot(struct Object *ob, float mat[][3], short use_compat);
void object_to_mat3(struct Object *ob, float mat[][3]);
void object_to_mat4(struct Object *ob, float mat[][4]);
-void object_apply_mat4(struct Object *ob, float mat[][4]);
+void object_apply_mat4(struct Object *ob, float mat[][4], const short use_compat, const short use_parent);
void set_no_parent_ipo(int val);
@@ -130,7 +131,7 @@ int give_obdata_texspace(struct Object *ob, short **texflag, float **loc, float
int object_insert_ptcache(struct Object *ob);
// void object_delete_ptcache(struct Object *ob, int index);
-struct KeyBlock *object_insert_shape_key(struct Scene *scene, struct Object *ob, char *name, int from_mix);
+struct KeyBlock *object_insert_shape_key(struct Scene *scene, struct Object *ob, const char *name, int from_mix);
void object_camera_matrix(
struct RenderData *rd, struct Object *camera, int winx, int winy, short field_second,
diff --git a/source/blender/blenkernel/BKE_packedFile.h b/source/blender/blenkernel/BKE_packedFile.h
index 58cf144483f..c3ab392fd85 100644
--- a/source/blender/blenkernel/BKE_packedFile.h
+++ b/source/blender/blenkernel/BKE_packedFile.h
@@ -42,7 +42,7 @@ struct ReportList;
struct VFont;
/* pack */
-struct PackedFile *newPackedFile(struct ReportList *reports, char *filename);
+struct PackedFile *newPackedFile(struct ReportList *reports, const char *filename);
struct PackedFile *newPackedFileMemory(void *mem, int memlen);
void packAll(struct Main *bmain, struct ReportList *reports);
@@ -50,18 +50,18 @@ void packAll(struct Main *bmain, struct ReportList *reports);
/* unpack */
char *unpackFile(struct ReportList *reports, char *abs_name, char *local_name, struct PackedFile *pf, int how);
int unpackVFont(struct ReportList *reports, struct VFont *vfont, int how);
-int unpackSound(struct ReportList *reports, struct bSound *sound, int how);
+int unpackSound(struct Main *bmain, struct ReportList *reports, struct bSound *sound, int how);
int unpackImage(struct ReportList *reports, struct Image *ima, int how);
void unpackAll(struct Main *bmain, struct ReportList *reports, int how);
-int writePackedFile(struct ReportList *reports, char *filename, struct PackedFile *pf, int guimode);
+int writePackedFile(struct ReportList *reports, const char *filename, struct PackedFile *pf, int guimode);
/* free */
void freePackedFile(struct PackedFile *pf);
/* info */
int countPackedFiles(struct Main *bmain);
-int checkPackedFile(char *filename, struct PackedFile *pf);
+int checkPackedFile(const char *filename, struct PackedFile *pf);
/* read */
int seekPackedFile(struct PackedFile *pf, int offset, int whence);
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index 20742033a2e..2203277b301 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -78,8 +78,11 @@ typedef struct SculptSession {
/* PBVH acceleration structure */
struct PBVH *pbvh;
- /* Used temporarily per-stroke */
- float *vertexcosnos;
+ /* Paiting on deformed mesh */
+ int modifiers_active; /* object is deformed with some modifiers */
+ float (*orig_cos)[3]; /* coords of undeformed mesh */
+ float (*deform_cos)[3]; /* coords of deformed mesh but without stroke displacement */
+ float (*deform_imats)[3][3]; /* crazyspace deformation matricies */
/* Partial redraw */
int partial_redraw;
@@ -95,8 +98,6 @@ typedef struct SculptSession {
struct GPUDrawObject *drawobject;
- int modifiers_active;
-
rcti previous_r;
} SculptSession;
diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
index 1416e1280cf..3f7523d5264 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -63,6 +63,7 @@ struct BVHTreeRayHit;
#define LOOP_PARTICLES for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++)
#define LOOP_EXISTING_PARTICLES for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++) if(!(pa->flag & PARS_UNEXIST))
#define LOOP_SHOWN_PARTICLES for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++) if(!(pa->flag & (PARS_UNEXIST|PARS_NO_DISP)))
+#define LOOP_DYNAMIC_PARTICLES for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++) if(pa->state.time > 0.f)
#define PSYS_FRAND_COUNT 1024
#define PSYS_FRAND(seed) psys->frand[(seed) % PSYS_FRAND_COUNT]
@@ -171,7 +172,9 @@ typedef struct ParticleCollision
float co1[3], co2[3]; // ray start and end points
float ve1[3], ve2[3]; // particle velocities
float ray_len; // original length of co2-co1, needed for collision time evaluation
- float t; // time of previous collision, needed for substracting face velocity
+ float f; // time factor of previous collision, needed for substracting face velocity
+ float cfra; // start of the timestep (during frame change, since previous integer frame)
+ float dfra; // duration of timestep in frames
} ParticleCollision;
typedef struct ParticleDrawData {
@@ -224,9 +227,9 @@ void copy_particle_key(struct ParticleKey *to, struct ParticleKey *from, int tim
void psys_particle_on_emitter(struct ParticleSystemModifierData *psmd, int distr, int index, int index_dmcache, float *fuv, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor);
struct ParticleSystemModifierData *psys_get_modifier(struct Object *ob, struct ParticleSystem *psys);
-struct ModifierData *object_add_particle_system(struct Scene *scene, struct Object *ob, char *name);
+struct ModifierData *object_add_particle_system(struct Scene *scene, struct Object *ob, const char *name);
void object_remove_particle_system(struct Scene *scene, struct Object *ob);
-struct ParticleSettings *psys_new_settings(char *name, struct Main *main);
+struct ParticleSettings *psys_new_settings(const char *name, struct Main *main);
struct ParticleSettings *psys_copy_settings(struct ParticleSettings *part);
void make_local_particlesettings(struct ParticleSettings *part);
@@ -309,7 +312,7 @@ void reset_particle(struct ParticleSimulationData *sim, struct ParticleData *pa,
/* psys_reset */
#define PSYS_RESET_ALL 1
#define PSYS_RESET_DEPSGRAPH 2
-#define PSYS_RESET_CHILDREN 3
+/* #define PSYS_RESET_CHILDREN 3 */ /*UNUSED*/
#define PSYS_RESET_CACHE_MISS 4
/* index_dmcache */
diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h
index 52536e10e56..e4623a31807 100644
--- a/source/blender/blenkernel/BKE_pointcache.h
+++ b/source/blender/blenkernel/BKE_pointcache.h
@@ -32,6 +32,7 @@
#include "DNA_ID.h"
#include "DNA_object_force.h"
#include "DNA_boid_types.h"
+#include <stdio.h> /* for FILE */
/* Point cache clearing option, for BKE_ptcache_id_clear, before
* and after are non inclusive (they wont remove the cfra) */
@@ -44,7 +45,7 @@
#define PTCACHE_RESET_DEPSGRAPH 0
#define PTCACHE_RESET_BAKED 1
#define PTCACHE_RESET_OUTDATED 2
-#define PTCACHE_RESET_FREE 3
+/* #define PTCACHE_RESET_FREE 3 */ /*UNUSED*/
/* Add the blendfile name after blendcache_ */
#define PTCACHE_EXT ".bphys"
@@ -62,6 +63,13 @@
#define PTCACHE_TYPE_SMOKE_DOMAIN 3
#define PTCACHE_TYPE_SMOKE_HIGHRES 4
+/* high bits reserved for flags that need to be stored in file */
+#define PTCACHE_TYPEFLAG_COMPRESS (1<<16)
+#define PTCACHE_TYPEFLAG_EXTRADATA (1<<17)
+
+#define PTCACHE_TYPEFLAG_TYPEMASK 0x0000FFFF
+#define PTCACHE_TYPEFLAG_FLAGMASK 0xFFFF0000
+
/* PTCache read return code */
#define PTCACHE_READ_EXACT 1
#define PTCACHE_READ_INTERPOLATED 2
@@ -81,7 +89,7 @@ struct SoftBody;
/* temp structure for read/write */
typedef struct PTCacheData {
- int index;
+ unsigned int index;
float loc[3];
float vel[3];
float rot[4];
@@ -94,8 +102,9 @@ typedef struct PTCacheData {
typedef struct PTCacheFile {
FILE *fp;
- int totpoint, type;
- unsigned int data_types;
+ int frame, old_format;
+ unsigned int totpoint, type;
+ unsigned int data_types, flag;
struct PTCacheData data;
void *cur[BPHYS_TOT_DATA];
@@ -109,23 +118,31 @@ typedef struct PTCacheID {
struct Scene *scene;
struct Object *ob;
void *calldata;
- int type;
- int stack_index;
- int flag;
+ unsigned int type;
+ unsigned int stack_index;
+ unsigned int flag;
/* flags defined in DNA_object_force.h */
unsigned int data_types, info_types;
/* copies point data to cache data */
- int (*write_elem)(int index, void *calldata, void **data, int cfra);
+ int (*write_point)(int index, void *calldata, void **data, int cfra);
+ /* copies cache cata to point data */
+ void (*read_point)(int index, void *calldata, void **data, float cfra, float *old_data);
+ /* interpolated between previously read point data and cache data */
+ void (*interpolate_point)(int index, void *calldata, void **data, float cfra, float cfra1, float cfra2, float *old_data);
+
/* copies point data to cache data */
int (*write_stream)(PTCacheFile *pf, void *calldata);
/* copies cache cata to point data */
- void (*read_elem)(int index, void *calldata, void **data, float frs_sec, float cfra, float *old_data);
- /* copies cache cata to point data */
void (*read_stream)(PTCacheFile *pf, void *calldata);
- /* interpolated between previously read point data and cache data */
- void (*interpolate_elem)(int index, void *calldata, void **data, float frs_sec, float cfra, float cfra1, float cfra2, float *old_data);
+
+ /* copies custom extradata to cache data */
+ void (*write_extra_data)(void *calldata, struct PTCacheMem *pm, int cfra);
+ /* copies custom extradata to cache data */
+ void (*read_extra_data)(void *calldata, struct PTCacheMem *pm, float cfra);
+ /* copies custom extradata to cache data */
+ void (*interpolate_extra_data)(void *calldata, struct PTCacheMem *pm, float cfra, float cfra1, float cfra2);
/* total number of simulated points (the cfra parameter is just for using same function pointer with totwrite) */
int (*totpoint)(void *calldata, int cfra);
@@ -222,8 +239,8 @@ typedef struct PTCacheEdit {
int totpoint, totframes, totcached, edited;
- char sel_col[3];
- char nosel_col[3];
+ unsigned char sel_col[3];
+ unsigned char nosel_col[3];
} PTCacheEdit;
/* Particle functions */
@@ -234,7 +251,6 @@ void BKE_ptcache_id_from_softbody(PTCacheID *pid, struct Object *ob, struct Soft
void BKE_ptcache_id_from_particles(PTCacheID *pid, struct Object *ob, struct ParticleSystem *psys);
void BKE_ptcache_id_from_cloth(PTCacheID *pid, struct Object *ob, struct ClothModifierData *clmd);
void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd);
-void BKE_ptcache_id_from_smoke_turbulence(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd);
void BKE_ptcache_ids_from_object(struct ListBase *lb, struct Object *ob, struct Scene *scene, int duplis);
@@ -242,7 +258,7 @@ void BKE_ptcache_ids_from_object(struct ListBase *lb, struct Object *ob, struct
void BKE_ptcache_remove(void);
/************ ID specific functions ************************/
-void BKE_ptcache_id_clear(PTCacheID *id, int mode, int cfra);
+void BKE_ptcache_id_clear(PTCacheID *id, int mode, unsigned int cfra);
int BKE_ptcache_id_exist(PTCacheID *id, int cfra);
int BKE_ptcache_id_reset(struct Scene *scene, PTCacheID *id, int mode);
void BKE_ptcache_id_time(PTCacheID *pid, struct Scene *scene, float cfra, int *startframe, int *endframe, float *timescale);
@@ -255,10 +271,13 @@ void BKE_ptcache_update_info(PTCacheID *pid);
/* Size of cache data type. */
int BKE_ptcache_data_size(int data_type);
+/* Is point with indes in memory cache */
+int BKE_ptcache_mem_index_find(struct PTCacheMem *pm, unsigned int index);
+
/* Memory cache read/write helpers. */
-void BKE_ptcache_mem_init_pointers(struct PTCacheMem *pm);
-void BKE_ptcache_mem_incr_pointers(struct PTCacheMem *pm);
-int BKE_ptcache_mem_seek_pointers(int point_index, struct PTCacheMem *pm);
+void BKE_ptcache_mem_pointers_init(struct PTCacheMem *pm);
+void BKE_ptcache_mem_pointers_incr(struct PTCacheMem *pm);
+int BKE_ptcache_mem_pointers_seek(int point_index, struct PTCacheMem *pm);
/* Copy a specific data type from cache data to point data. */
void BKE_ptcache_data_get(void **data, int type, int index, void *to);
@@ -267,10 +286,10 @@ void BKE_ptcache_data_get(void **data, int type, int index, void *to);
void BKE_ptcache_data_set(void **data, int type, void *from);
/* Main cache reading call. */
-int BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec);
+int BKE_ptcache_read(PTCacheID *pid, float cfra);
/* Main cache writing call. */
-int BKE_ptcache_write_cache(PTCacheID *pid, int cfra);
+int BKE_ptcache_write(PTCacheID *pid, unsigned int cfra);
/****************** Continue physics ***************/
void BKE_ptcache_set_continue_physics(struct Main *bmain, struct Scene *scene, int enable);
@@ -289,7 +308,7 @@ struct PointCache *BKE_ptcache_copy_list(struct ListBase *ptcaches_new, struct L
void BKE_ptcache_quick_cache_all(struct Main *bmain, struct Scene *scene);
/* Bake cache or simulate to current frame with settings defined in the baker. */
-void BKE_ptcache_make_cache(struct PTCacheBaker* baker);
+void BKE_ptcache_bake(struct PTCacheBaker* baker);
/* Convert disk cache to memory cache. */
void BKE_ptcache_disk_to_mem(struct PTCacheID *pid);
@@ -300,6 +319,9 @@ void BKE_ptcache_mem_to_disk(struct PTCacheID *pid);
/* Convert disk cache to memory cache and vice versa. Clears the cache that was converted. */
void BKE_ptcache_toggle_disk_cache(struct PTCacheID *pid);
+/* Rename all disk cache files with a new name. Doesn't touch the actual content of the files. */
+void BKE_ptcache_disk_cache_rename(struct PTCacheID *pid, char *from, char *to);
+
/* Loads simulation from external (disk) cache files. */
void BKE_ptcache_load_external(struct PTCacheID *pid);
diff --git a/source/blender/blenkernel/BKE_property.h b/source/blender/blenkernel/BKE_property.h
index b9cca612846..5fab97b35e5 100644
--- a/source/blender/blenkernel/BKE_property.h
+++ b/source/blender/blenkernel/BKE_property.h
@@ -42,7 +42,7 @@ void copy_properties(struct ListBase *lbn, struct ListBase *lbo);
void init_property(struct bProperty *prop);
struct bProperty *new_property(int type);
void unique_property(struct bProperty *first, struct bProperty *prop, int force);
-struct bProperty *get_ob_property(struct Object *ob, char *name);
+struct bProperty *get_ob_property(struct Object *ob, const char *name);
void set_ob_property(struct Object *ob, struct bProperty *propc);
int compare_property(struct bProperty *prop, char *str);
void set_property(struct bProperty *prop, char *str);
diff --git a/source/blender/blenkernel/BKE_report.h b/source/blender/blenkernel/BKE_report.h
index d7b7801d697..b84808a7ddd 100644
--- a/source/blender/blenkernel/BKE_report.h
+++ b/source/blender/blenkernel/BKE_report.h
@@ -45,7 +45,11 @@ void BKE_reports_init(ReportList *reports, int flag);
void BKE_reports_clear(ReportList *reports);
void BKE_report(ReportList *reports, ReportType type, const char *message);
-void BKE_reportf(ReportList *reports, ReportType type, const char *format, ...);
+void BKE_reportf(ReportList *reports, ReportType type, const char *format, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 3, 4)));
+#endif
+;
void BKE_reports_prepend(ReportList *reports, const char *prepend);
void BKE_reports_prependf(ReportList *reports, const char *prepend, ...);
diff --git a/source/blender/blenkernel/BKE_sca.h b/source/blender/blenkernel/BKE_sca.h
index 6cafb7ef104..a9238dadb27 100644
--- a/source/blender/blenkernel/BKE_sca.h
+++ b/source/blender/blenkernel/BKE_sca.h
@@ -1,7 +1,5 @@
/**
- * blenlib/BKE_sca.h (mar-2001 nzc)
- *
- * $Id$
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -68,7 +66,7 @@ void clear_sca_new_poins_ob(struct Object *ob);
void clear_sca_new_poins(void);
void set_sca_new_poins_ob(struct Object *ob);
void set_sca_new_poins(void);
-void sca_remove_ob_poin(struct Object *obt, struct Object *ob);
+void sca_remove_ob_poin(struct Object *obt, struct Object *ob);
void sca_move_sensor(struct bSensor *sens_to_move, struct Object *ob, int move_up);
void sca_move_controller(struct bController *cont_to_move, struct Object *ob, int move_up);
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 96ef8d44cf4..2337b95dcbc 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -31,6 +31,10 @@
#ifndef BKE_SCENE_H
#define BKE_SCENE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct AviCodecData;
struct Base;
struct bglMats;
@@ -47,20 +51,20 @@ struct Text;
#define SCE_COPY_LINK_DATA 2
#define SCE_COPY_FULL 3
-#define SETLOOPER(s, b) sce= s, b= _setlooper_base_step(&sce, NULL); b; b= _setlooper_base_step(&sce, b)
-struct Base *_setlooper_base_step(struct Scene **sce, struct Base *base);
+#define SETLOOPER(_sce_basis, _sce_iter, _base) _sce_iter= _sce_basis, _base= _setlooper_base_step(&_sce_iter, NULL); _base; _base= _setlooper_base_step(&_sce_iter, _base)
+struct Base *_setlooper_base_step(struct Scene **sce_iter, struct Base *base);
void free_avicodecdata(struct AviCodecData *acd);
void free_qtcodecdata(struct QuicktimeCodecData *acd);
void free_scene(struct Scene *sce);
-struct Scene *add_scene(char *name);
+struct Scene *add_scene(const char *name);
struct Base *object_in_scene(struct Object *ob, struct Scene *sce);
void set_scene_bg(struct Main *bmain, struct Scene *sce);
-struct Scene *set_scene_name(struct Main *bmain, char *name);
+struct Scene *set_scene_name(struct Main *bmain, const char *name);
-struct Scene *copy_scene(struct Main *bmain, struct Scene *sce, int type);
+struct Scene *copy_scene(struct Scene *sce, int type);
void unlink_scene(struct Main *bmain, struct Scene *sce, struct Scene *newsce);
int next_object(struct Scene **scene, int val, struct Base **base, struct Object **ob);
@@ -72,6 +76,7 @@ char *scene_find_marker_name(struct Scene *scene, int frame);
char *scene_find_last_marker_name(struct Scene *scene, int frame);
int scene_marker_tfm_translate(struct Scene *scene, int delta, int flag);
int scene_marker_tfm_extend(struct Scene *scene, int delta, int flag, int frame, char side);
+int scene_marker_tfm_scale(struct Scene *scene, float value, int flag);
struct Base *scene_add_base(struct Scene *sce, struct Object *ob);
void scene_deselect_all(struct Scene *sce);
@@ -93,5 +98,9 @@ int get_render_child_particle_number(struct RenderData *r, int num);
int get_render_shadow_samples(struct RenderData *r, int samples);
float get_render_aosss_error(struct RenderData *r, float error);
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h
index 0766012b4a5..eb19fce94e5 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -46,6 +46,11 @@ struct StripElem;
#define BUILD_SEQAR_COUNT_CURRENT 1
#define BUILD_SEQAR_COUNT_CHILDREN 2
+#define EARLY_NO_INPUT -1
+#define EARLY_DO_EFFECT 0
+#define EARLY_USE_INPUT_1 1
+#define EARLY_USE_INPUT_2 2
+
/* sequence iterator */
typedef struct SeqIterator {
@@ -78,6 +83,22 @@ void seq_array(struct Editing *ed, struct Sequence ***seqarray, int *tot, int us
seq_end(&iter); \
}
+typedef struct SeqRenderData {
+ struct Main *bmain;
+ struct Scene *scene;
+ int rectx;
+ int recty;
+ int preview_render_size;
+ int motion_blur_samples;
+ float motion_blur_shutter;
+} SeqRenderData;
+
+SeqRenderData seq_new_render_data(
+ struct Main * bmain, struct Scene * scene,
+ int rectx, int recty, int preview_render_size);
+
+int seq_cmp_render_data(const SeqRenderData * a, const SeqRenderData * b);
+unsigned int seq_hash_render_data(const SeqRenderData * a);
/* Wipe effect */
enum {DO_SINGLE_WIPE, DO_DOUBLE_WIPE, DO_BOX_WIPE, DO_CROSS_WIPE,
@@ -92,7 +113,7 @@ struct SeqEffectHandle {
/* number of input strips needed
(called directly after construction) */
- int (*num_inputs)();
+ int (*num_inputs)(void);
/* load is called first time after readblenfile in
get_sequence_effect automatically */
@@ -124,53 +145,61 @@ struct SeqEffectHandle {
(mixed cases are handled one layer up...) */
struct ImBuf* (*execute)(
- struct Main *bmain,
- struct Scene *scene, struct Sequence *seq, float cfra,
+ SeqRenderData context,
+ struct Sequence *seq, float cfra,
float facf0, float facf1,
- int x, int y, int preview_render_size,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3);
};
/* ********************* prototypes *************** */
-/* sequence.c */
-void printf_strip(struct Sequence *seq);
+/* **********************************************************************
+ * sequence.c
+
+ * sequencer render functions
+ ********************************************************************** */
+
+struct ImBuf *give_ibuf_seq(SeqRenderData context, float cfra, int chanshown);
+struct ImBuf *give_ibuf_seq_threaded(SeqRenderData context, float cfra, int chanshown);
+struct ImBuf *give_ibuf_seq_direct(SeqRenderData context, float cfra, struct Sequence *seq);
+struct ImBuf *give_ibuf_seqbase(SeqRenderData context, float cfra, int chan_shown, struct ListBase *seqbasep);
+void give_ibuf_prefetch_request(SeqRenderData context, float cfra, int chan_shown);
/* apply functions recursively */
int seqbase_recursive_apply(struct ListBase *seqbase, int (*apply_func)(struct Sequence *seq, void *), void *arg);
int seq_recursive_apply(struct Sequence *seq, int (*apply_func)(struct Sequence *, void *), void *arg);
-// extern
+/* maintainance functions, mostly for RNA */
+// extern
void seq_free_sequence(struct Scene *scene, struct Sequence *seq);
void seq_free_strip(struct Strip *strip);
void seq_free_editing(struct Scene *scene);
void seq_free_clipboard(void);
struct Editing *seq_give_editing(struct Scene *scene, int alloc);
-char *give_seqname(struct Sequence *seq);
-struct ImBuf *give_ibuf_seq(struct Main *bmain, struct Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size);
-struct ImBuf *give_ibuf_seq_threaded(struct Main *bmain, struct Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size);
-struct ImBuf *give_ibuf_seq_direct(struct Main *bmain, struct Scene *scene, int rectx, int recty, int cfra, int render_size, struct Sequence *seq);
-struct ImBuf *give_ibuf_seqbase(struct Main *bmain, struct Scene *scene, int rectx, int recty, int cfra, int chan_shown, int render_size, struct ListBase *seqbasep);
-void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown, int render_size);
+const char *give_seqname(struct Sequence *seq);
void calc_sequence(struct Scene *scene, struct Sequence *seq);
void calc_sequence_disp(struct Scene *scene, struct Sequence *seq);
void new_tstripdata(struct Sequence *seq);
-void reload_sequence_new_file(struct Main *bmain, struct Scene *scene, struct Sequence * seq, int lock_range);
+void reload_sequence_new_file(struct Scene *scene, struct Sequence * seq, int lock_range);
void sort_seq(struct Scene *scene);
void build_seqar_cb(struct ListBase *seqbase, struct Sequence ***seqar, int *totseq,
int (*test_func)(struct Sequence * seq));
int evaluate_seq_frame(struct Scene *scene, int cfra);
struct StripElem *give_stripelem(struct Sequence *seq, int cfra);
-// intern?
+// intern
+void printf_strip(struct Sequence *seq); // debugging function (unused)
void update_changed_seq_and_deps(struct Scene *scene, struct Sequence *changed_seq, int len_change, int ibuf_change);
int input_have_to_preprocess(
- struct Scene *scene, struct Sequence * seq,
- float cfra, int seqrectx, int seqrecty);
+ SeqRenderData context, struct Sequence * seq, float cfra);
+
+/* **********************************************************************
+ seqcache.c
-/* seqcache.c */
+ Sequencer memory cache management functions
+ ********************************************************************** */
typedef enum {
SEQ_STRIPELEM_IBUF,
@@ -179,28 +208,39 @@ typedef enum {
SEQ_STRIPELEM_IBUF_ENDSTILL
} seq_stripelem_ibuf_t;
-void seq_stripelem_cache_init();
-void seq_stripelem_cache_destruct();
+void seq_stripelem_cache_init(void);
+void seq_stripelem_cache_destruct(void);
-void seq_stripelem_cache_cleanup();
+void seq_stripelem_cache_cleanup(void);
struct ImBuf * seq_stripelem_cache_get(
- struct Sequence * seq, int rectx, int recty,
+ SeqRenderData context, struct Sequence * seq,
float cfra, seq_stripelem_ibuf_t type);
void seq_stripelem_cache_put(
- struct Sequence * seq, int rectx, int recty,
+ SeqRenderData context, struct Sequence * seq,
float cfra, seq_stripelem_ibuf_t type, struct ImBuf * nval);
+/* **********************************************************************
+ seqeffects.c
-/* seqeffects.c */
-// intern?
+ Sequencer effect strip managment functions
+ **********************************************************************
+*/
+
+/* intern */
struct SeqEffectHandle get_sequence_blend(struct Sequence *seq);
void sequence_effect_speed_rebuild_map(struct Scene *scene, struct Sequence *seq, int force);
-// extern
+/* extern */
struct SeqEffectHandle get_sequence_effect(struct Sequence *seq);
int get_sequence_effect_num_inputs(int seq_type);
+
+/* **********************************************************************
+ Sequencer editing functions
+ **********************************************************************
+*/
+
/* for transform but also could use elsewhere */
int seq_tx_get_start(struct Sequence *seq);
int seq_tx_get_end(struct Sequence *seq);
@@ -213,6 +253,7 @@ int seq_tx_test(struct Sequence * seq);
int seq_single_check(struct Sequence *seq);
void seq_single_fix(struct Sequence *seq);
int seq_test_overlap(struct ListBase * seqbasep, struct Sequence *test);
+void seq_translate(struct Scene *scene, struct Sequence *seq, int delta);
struct ListBase *seq_seqbase(struct ListBase *seqbase, struct Sequence *seq);
void seq_offset_animdata(struct Scene *scene, struct Sequence *seq, int ofs);
void seq_dupe_animdata(struct Scene *scene, char *name_from, char *name_to);
@@ -220,14 +261,14 @@ int shuffle_seq(struct ListBase * seqbasep, struct Sequence *test, struct Scene
int shuffle_seq_time(ListBase * seqbasep, struct Scene *evil_scene);
int seqbase_isolated_sel_check(struct ListBase *seqbase);
void free_imbuf_seq(struct Scene *scene, struct ListBase * seqbasep, int check_mem_usage, int keep_file_handles);
-struct Sequence *seq_dupli_recursive(struct Scene *scene, struct Sequence * seq, int dupe_flag);
+struct Sequence *seq_dupli_recursive(struct Scene *scene, struct Scene *scene_to, struct Sequence * seq, int dupe_flag);
int seq_swap(struct Sequence *seq_a, struct Sequence *seq_b);
void seq_update_sound(struct Scene* scene, struct Sequence *seq);
void seq_update_muting(struct Scene* scene, struct Editing *ed);
void seqbase_sound_reload(struct Scene *scene, ListBase *seqbase);
void seqbase_unique_name_recursive(ListBase *seqbasep, struct Sequence *seq);
-void seqbase_dupli_recursive(struct Scene *scene, ListBase *nseqbase, ListBase *seqbase, int dupe_flag);
+void seqbase_dupli_recursive(struct Scene *scene, struct Scene *scene_to, ListBase *nseqbase, ListBase *seqbase, int dupe_flag);
void clear_scene_in_allseqs(struct Main *bmain, struct Scene *sce);
@@ -252,17 +293,17 @@ typedef struct SeqLoadInfo {
} SeqLoadInfo;
/* SeqLoadInfo.flag */
-#define SEQ_LOAD_REPLACE_SEL 1<<0
-#define SEQ_LOAD_FRAME_ADVANCE 1<<1
-#define SEQ_LOAD_MOVIE_SOUND 1<<2
-#define SEQ_LOAD_SOUND_CACHE 1<<3
+#define SEQ_LOAD_REPLACE_SEL (1<<0)
+#define SEQ_LOAD_FRAME_ADVANCE (1<<1)
+#define SEQ_LOAD_MOVIE_SOUND (1<<2)
+#define SEQ_LOAD_SOUND_CACHE (1<<3)
/* seq_dupli' flags */
-#define SEQ_DUPE_UNIQUE_NAME 1<<0
-#define SEQ_DUPE_CONTEXT 1<<1
-#define SEQ_DUPE_ANIM 1<<2
-#define SEQ_DUPE_ALL 1<<3 /* otherwise only selected are copied */
+#define SEQ_DUPE_UNIQUE_NAME (1<<0)
+#define SEQ_DUPE_CONTEXT (1<<1)
+#define SEQ_DUPE_ANIM (1<<2)
+#define SEQ_DUPE_ALL (1<<3) /* otherwise only selected are copied */
/* use as an api function */
typedef struct Sequence *(*SeqLoadFunc)(struct bContext *, ListBase *, struct SeqLoadInfo *);
diff --git a/source/blender/blenkernel/BKE_shrinkwrap.h b/source/blender/blenkernel/BKE_shrinkwrap.h
index 47fb5049278..6b8e7860db8 100644
--- a/source/blender/blenkernel/BKE_shrinkwrap.h
+++ b/source/blender/blenkernel/BKE_shrinkwrap.h
@@ -35,7 +35,7 @@
#include "BKE_customdata.h"
struct DerivedMesh;
struct Object;
-struct DerivedMesh *object_get_derived_final(struct Scene *scene, struct Object *ob, CustomDataMask dataMask);
+struct DerivedMesh *object_get_derived_final(struct Object *ob);
/* SpaceTransform stuff */
@@ -121,7 +121,7 @@ typedef struct ShrinkwrapCalcData
} ShrinkwrapCalcData;
-void shrinkwrapModifier_deform(struct ShrinkwrapModifierData *smd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts);
+void shrinkwrapModifier_deform(struct ShrinkwrapModifierData *smd, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts);
/*
* This function casts a ray in the given BVHTree.. but it takes into consideration the space_transform, that is:
diff --git a/source/blender/blenkernel/BKE_sketch.h b/source/blender/blenkernel/BKE_sketch.h
index c46604f09f0..a59464bb7ba 100644
--- a/source/blender/blenkernel/BKE_sketch.h
+++ b/source/blender/blenkernel/BKE_sketch.h
@@ -113,12 +113,12 @@ typedef struct SK_Gesture {
/************************************************/
void freeSketch(SK_Sketch *sketch);
-SK_Sketch* createSketch();
+SK_Sketch* createSketch(void);
void sk_removeStroke(SK_Sketch *sketch, SK_Stroke *stk);
void sk_freeStroke(SK_Stroke *stk);
-SK_Stroke* sk_createStroke();
+SK_Stroke* sk_createStroke(void);
SK_Point *sk_lastStrokePoint(SK_Stroke *stk);
diff --git a/source/blender/blenkernel/BKE_smoke.h b/source/blender/blenkernel/BKE_smoke.h
index 088d61061b2..396db60714a 100644
--- a/source/blender/blenkernel/BKE_smoke.h
+++ b/source/blender/blenkernel/BKE_smoke.h
@@ -34,7 +34,7 @@
typedef float (*bresenham_callback) (float *result, float *input, int res[3], int *pixel, float *tRay, float correct);
-void smokeModifier_do(struct SmokeModifierData *smd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, int useRenderParams, int isFinalCalc);
+void smokeModifier_do(struct SmokeModifierData *smd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm);
void smokeModifier_free (struct SmokeModifierData *smd);
void smokeModifier_reset(struct SmokeModifierData *smd);
diff --git a/source/blender/blenkernel/BKE_sound.h b/source/blender/blenkernel/BKE_sound.h
index 190b0400aff..cf77049b599 100644
--- a/source/blender/blenkernel/BKE_sound.h
+++ b/source/blender/blenkernel/BKE_sound.h
@@ -38,16 +38,16 @@ struct ListBase;
struct Main;
struct Sequence;
-void sound_init_once();
+void sound_init_once(void);
void sound_init(struct Main *main);
-void sound_exit();
+void sound_exit(void);
void sound_force_device(int device);
int sound_define_from_str(char *str);
-struct bSound* sound_new_file(struct Main *main, char* filename);
+struct bSound* sound_new_file(struct Main *main, const char *filename);
// XXX unused currently
#if 0
@@ -96,4 +96,6 @@ int sound_scene_playing(struct Scene *scene);
int sound_read_sound_buffer(struct bSound* sound, float* buffer, int length, float start, float end);
+int sound_get_channels(struct bSound* sound);
+
#endif
diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h
index 940a0027d0b..ef3ad3ad2e9 100644
--- a/source/blender/blenkernel/BKE_subsurf.h
+++ b/source/blender/blenkernel/BKE_subsurf.h
@@ -72,7 +72,6 @@ typedef struct CCGDerivedMesh {
char *faceFlags;
struct PBVH *pbvh;
- int pbvh_draw;
struct ListBase *fmap;
struct IndexNode *fmap_mem;
diff --git a/source/blender/blenkernel/BKE_suggestions.h b/source/blender/blenkernel/BKE_suggestions.h
index 59369d6ac14..9eb8897e0e0 100644
--- a/source/blender/blenkernel/BKE_suggestions.h
+++ b/source/blender/blenkernel/BKE_suggestions.h
@@ -64,27 +64,27 @@ typedef struct SuggList {
} SuggList;
/* Free all text tool memory */
-void free_texttools();
+void free_texttools(void);
/* Used to identify which Text object the current tools should appear against */
void texttool_text_set_active(Text *text);
-void texttool_text_clear();
+void texttool_text_clear(void);
short texttool_text_is_active(Text *text);
/* Suggestions */
void texttool_suggest_add(const char *name, char type);
void texttool_suggest_prefix(const char *prefix);
-void texttool_suggest_clear();
-SuggItem *texttool_suggest_first();
-SuggItem *texttool_suggest_last();
+void texttool_suggest_clear(void);
+SuggItem *texttool_suggest_first(void);
+SuggItem *texttool_suggest_last(void);
void texttool_suggest_select(SuggItem *sel);
-SuggItem *texttool_suggest_selected();
-int *texttool_suggest_top();
+SuggItem *texttool_suggest_selected(void);
+int *texttool_suggest_top(void);
/* Documentation */
void texttool_docs_show(const char *docs);
-char *texttool_docs_get();
-void texttool_docs_clear();
+char *texttool_docs_get(void);
+void texttool_docs_clear(void);
#ifdef __cplusplus
}
diff --git a/source/blender/blenkernel/BKE_text.h b/source/blender/blenkernel/BKE_text.h
index bcda86fdae4..5f55f8b351e 100644
--- a/source/blender/blenkernel/BKE_text.h
+++ b/source/blender/blenkernel/BKE_text.h
@@ -43,13 +43,13 @@ struct SpaceText;
void free_text (struct Text *text);
void txt_set_undostate (int u);
int txt_get_undostate (void);
-struct Text* add_empty_text (char *name);
+struct Text* add_empty_text (const char *name);
int reopen_text (struct Text *text);
-struct Text* add_text (char *file, const char *relpath);
+struct Text* add_text (const char *file, const char *relpath);
struct Text* copy_text (struct Text *ta);
void unlink_text (struct Main *bmain, struct Text *text);
void clear_text(struct Text *text);
-void write_text(struct Text *text, char *str);
+void write_text(struct Text *text, const char *str);
char* txt_to_buf (struct Text *text);
void txt_clean_text (struct Text *text);
@@ -94,7 +94,7 @@ void indent (struct Text *text);
void uncomment (struct Text *text);
int setcurr_tab_spaces (struct Text *text, int space);
-void txt_add_marker (struct Text *text, struct TextLine *line, int start, int end, char color[4], int group, int flags);
+void txt_add_marker (struct Text *text, struct TextLine *line, int start, int end, const unsigned char color[4], int group, int flags);
short txt_clear_marker_region (struct Text *text, struct TextLine *line, int start, int end, int group, int flags);
short txt_clear_markers (struct Text *text, int group, int flags);
struct TextMarker *txt_find_marker (struct Text *text, struct TextLine *line, int curs, int group, int flags);
diff --git a/source/blender/blenkernel/BKE_texture.h b/source/blender/blenkernel/BKE_texture.h
index 99bb8db44ed..cbae90f4c38 100644
--- a/source/blender/blenkernel/BKE_texture.h
+++ b/source/blender/blenkernel/BKE_texture.h
@@ -31,6 +31,10 @@
#ifndef BKE_TEXTURE_H
#define BKE_TEXTURE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct bNode;
struct Brush;
struct ColorBand;
@@ -112,5 +116,9 @@ struct VoxelData *BKE_copy_voxeldata(struct VoxelData *vd);
int BKE_texture_dependsOnTime(const struct Tex *texture);
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/blenkernel/BKE_unit.h b/source/blender/blenkernel/BKE_unit.h
index 7461d43e721..5708766432f 100644
--- a/source/blender/blenkernel/BKE_unit.h
+++ b/source/blender/blenkernel/BKE_unit.h
@@ -51,10 +51,11 @@ int bUnit_IsValid(int system, int type);
/* loop over scales, coudl add names later */
//double bUnit_Iter(void **unit, char **name, int system, int type);
-void bUnit_GetSystem(void **usys_pt, int *len, int system, int type);
-char* bUnit_GetName(void *usys_pt, int index);
-char* bUnit_GetNameDisplay(void *usys_pt, int index);
-double bUnit_GetScaler(void *usys_pt, int index);
+void bUnit_GetSystem(void **usys_pt, int *len, int system, int type);
+int bUnit_GetBaseUnit(void *usys_pt);
+const char* bUnit_GetName(void *usys_pt, int index);
+const char* bUnit_GetNameDisplay(void *usys_pt, int index);
+double bUnit_GetScaler(void *usys_pt, int index);
/* aligned with PropertyUnit */
#define B_UNIT_NONE 0
@@ -66,7 +67,7 @@ double bUnit_GetScaler(void *usys_pt, int index);
#define B_UNIT_TIME 6
#define B_UNIT_VELOCITY 7
#define B_UNIT_ACCELERATION 8
-#define B_UNIT_MAXDEF 9
+#define B_UNIT_TYPE_TOT 9
#ifdef __cplusplus
}
diff --git a/source/blender/blenkernel/BKE_utildefines.h b/source/blender/blenkernel/BKE_utildefines.h
index 925b1d7171a..fca6a8cbef8 100644
--- a/source/blender/blenkernel/BKE_utildefines.h
+++ b/source/blender/blenkernel/BKE_utildefines.h
@@ -27,20 +27,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/* This file shold contain blender format spesific macros
+ * generic defines should go in BLI_utildefines.h */
+
#ifndef BKE_UTILDEFINES_H
#define BKE_UTILDEFINES_H
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-
-/* Macro to convert a value to string in the preprocessor */
-#define QUOTE(x) #x
-
/* these values need to be hardcoded in structs, dna does not recognize defines */
/* also defined in DNA_space_types.h */
#ifndef FILE_MAXDIR
@@ -49,94 +41,6 @@
#define FILE_MAX 240
#endif
-#define ELEM(a, b, c) ( (a)==(b) || (a)==(c) )
-#define ELEM3(a, b, c, d) ( ELEM(a, b, c) || (a)==(d) )
-#define ELEM4(a, b, c, d, e) ( ELEM(a, b, c) || ELEM(a, d, e) )
-#define ELEM5(a, b, c, d, e, f) ( ELEM(a, b, c) || ELEM3(a, d, e, f) )
-#define ELEM6(a, b, c, d, e, f, g) ( ELEM(a, b, c) || ELEM4(a, d, e, f, g) )
-#define ELEM7(a, b, c, d, e, f, g, h) ( ELEM3(a, b, c, d) || ELEM4(a, e, f, g, h) )
-#define ELEM8(a, b, c, d, e, f, g, h, i) ( ELEM4(a, b, c, d, e) || ELEM4(a, f, g, h, i) )
-#define ELEM9(a, b, c, d, e, f, g, h, i, j) ( ELEM4(a, b, c, d, e) || ELEM5(a, f, g, h, i, j) )
-#define ELEM10(a, b, c, d, e, f, g, h, i, j, k) ( ELEM4(a, b, c, d, e) || ELEM6(a, f, g, h, i, j, k) )
-#define ELEM11(a, b, c, d, e, f, g, h, i, j, k, l) ( ELEM4(a, b, c, d, e) || ELEM7(a, f, g, h, i, j, k, l) )
-
-/* shift around elements */
-#define SHIFT3(type, a, b, c) { type tmp; tmp = a; a = c; c = b; b = tmp; }
-#define SHIFT4(type, a, b, c, d) { type tmp; tmp = a; a = d; d = c; c = b; b = tmp; }
-
-/* min/max */
-#define MIN2(x,y) ( (x)<(y) ? (x) : (y) )
-#define MIN3(x,y,z) MIN2( MIN2((x),(y)) , (z) )
-#define MIN4(x,y,z,a) MIN2( MIN2((x),(y)) , MIN2((z),(a)) )
-
-#define MAX2(x,y) ( (x)>(y) ? (x) : (y) )
-#define MAX3(x,y,z) MAX2( MAX2((x),(y)) , (z) )
-#define MAX4(x,y,z,a) MAX2( MAX2((x),(y)) , MAX2((z),(a)) )
-
-#define INIT_MINMAX(min, max) { (min)[0]= (min)[1]= (min)[2]= 1.0e30f; (max)[0]= (max)[1]= (max)[2]= -1.0e30f; }
-
-#define INIT_MINMAX2(min, max) { (min)[0]= (min)[1]= 1.0e30f; (max)[0]= (max)[1]= -1.0e30f; }
-
-#define DO_MIN(vec, min) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
- if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
- if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; } \
-
-#define DO_MAX(vec, max) { if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
- if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; \
- if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
-
-#define DO_MINMAX(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
- if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
- if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; \
- if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
- if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; \
- if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
-
-#define DO_MINMAX2(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
- if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
- if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
- if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; }
-
-/* some math and copy defines */
-
-#ifndef SWAP
-#define SWAP(type, a, b) { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
-#endif
-
-#define ABS(a) ( (a)<0 ? (-(a)) : (a) )
-
-#define AVG2(x, y) ( 0.5 * ((x) + (y)) )
-
-#define FTOCHAR(val) ((val)<=0.0f)? 0 : (((val)>(1.0f-0.5f/255.0f))? 255 : (char)((255.0f*(val))+0.5f))
-#define FTOUSHORT(val) ((val >= 1.0f-0.5f/65535)? 65535: (val <= 0.0f)? 0: (unsigned short)(val*65535.0f + 0.5f))
-
-#define VECCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
-#define VECCOPY2D(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1);}
-#define QUATCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2); *(v1+3)= *(v2+3);}
-#define LONGCOPY(a, b, c) {int lcpc=c, *lcpa=(int *)a, *lcpb=(int *)b; while(lcpc-->0) *(lcpa++)= *(lcpb++);}
-
-
-#define VECADD(v1,v2,v3) {*(v1)= *(v2) + *(v3); *(v1+1)= *(v2+1) + *(v3+1); *(v1+2)= *(v2+2) + *(v3+2);}
-#define VECSUB(v1,v2,v3) {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1); *(v1+2)= *(v2+2) - *(v3+2);}
-#define VECSUB2D(v1,v2,v3) {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1);}
-#define VECADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac);}
-#define VECSUBFAC(v1,v2,v3,fac) {*(v1)= *(v2) - *(v3)*(fac); *(v1+1)= *(v2+1) - *(v3+1)*(fac); *(v1+2)= *(v2+2) - *(v3+2)*(fac);}
-#define QUATADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac); *(v1+3)= *(v2+3) + *(v3+3)*(fac);}
-
-#define INPR(v1, v2) ( (v1)[0]*(v2)[0] + (v1)[1]*(v2)[1] + (v1)[2]*(v2)[2] )
-
-
-/* some misc stuff.... */
-#define CLAMP(a, b, c) if((a)<(b)) (a)=(b); else if((a)>(c)) (a)=(c)
-#define CLAMPIS(a, b, c) ((a)<(b) ? (b) : (a)>(c) ? (c) : (a))
-#define CLAMPTEST(a, b, c) if((b)<(c)) {CLAMP(a, b, c);} else {CLAMP(a, c, b);}
-
-#define IS_EQ(a,b) ((fabs((double)(a)-(b)) >= (double) FLT_EPSILON) ? 0 : 1)
-
-#define IS_EQT(a, b, c) ((a > b)? (((a-b) <= c)? 1:0) : ((((b-a) <= c)? 1:0)))
-#define IN_RANGE(a, b, c) ((b < c)? ((b<a && a<c)? 1:0) : ((c<a && a<b)? 1:0))
-#define IN_RANGE_INCL(a, b, c) ((b < c)? ((b<=a && a<=c)? 1:0) : ((c<=a && a<=b)? 1:0))
-
/* this weirdo pops up in two places ... */
#if !defined(WIN32)
#ifndef O_BINARY
@@ -155,15 +59,8 @@
#define ID_NEW(a) if( (a) && (a)->id.newid ) (a)= (void *)(a)->id.newid
-#define FORM MAKE_ID('F','O','R','M')
-
-#define BLEN MAKE_ID('B','L','E','N')
-#define DER_ MAKE_ID('D','E','R','_')
-#define V100 MAKE_ID('V','1','0','0')
-
#define DATA MAKE_ID('D','A','T','A')
#define GLOB MAKE_ID('G','L','O','B')
-#define IMAG MAKE_ID('I','M','A','G')
#define DNA1 MAKE_ID('D','N','A','1')
#define TEST MAKE_ID('T','E','S','T') /* used as preview between 'REND' and 'GLOB' */
@@ -172,28 +69,6 @@
#define ENDB MAKE_ID('E','N','D','B')
-
-/* This one rotates the bytes in an int64, int (32) and short (16) */
-#define SWITCH_INT64(a) { \
- char s_i, *p_i; \
- p_i= (char *)&(a); \
- s_i=p_i[0]; p_i[0]=p_i[7]; p_i[7]=s_i; \
- s_i=p_i[1]; p_i[1]=p_i[6]; p_i[6]=s_i; \
- s_i=p_i[2]; p_i[2]=p_i[5]; p_i[5]=s_i; \
- s_i=p_i[3]; p_i[3]=p_i[4]; p_i[4]=s_i; }
-
-#define SWITCH_INT(a) { \
- char s_i, *p_i; \
- p_i= (char *)&(a); \
- s_i=p_i[0]; p_i[0]=p_i[3]; p_i[3]=s_i; \
- s_i=p_i[1]; p_i[1]=p_i[2]; p_i[2]=s_i; }
-
-#define SWITCH_SHORT(a) { \
- char s_i, *p_i; \
- p_i= (char *)&(a); \
- s_i=p_i[0]; p_i[0]=p_i[1]; p_i[1]=s_i; }
-
-
/* Bit operations */
#define BTST(a,b) ( ( (a) & 1<<(b) )!=0 )
#define BNTST(a,b) ( ( (a) & 1<<(b) )==0 )
@@ -203,73 +78,6 @@
/* bit-row */
#define BROW(min, max) (((max)>=31? 0xFFFFFFFF: (1<<(max+1))-1) - ((min)? ((1<<(min))-1):0) )
-
-#ifdef GS
-#undef GS
-#endif
-#define GS(a) (*((short *)(a)))
-
-/* Warning-free macros for storing ints in pointers. Use these _only_
- * for storing an int in a pointer, not a pointer in an int (64bit)! */
-#define SET_INT_IN_POINTER(i) ((void*)(intptr_t)(i))
-#define GET_INT_FROM_POINTER(i) ((int)(intptr_t)(i))
-
-/*little array macro library. example of usage:
-
-int *arr = NULL;
-V_DECLARE(arr);
-int i;
-
-for (i=0; i<10; i++) {
- V_GROW(arr);
- arr[i] = something;
-}
-V_FREE(arr);
-
-arrays are buffered, using double-buffering (so on each reallocation,
-the array size is doubled). supposedly this should give good Big Oh
-behaviour, though it may not be the best in practice.
-*/
-
-#define V_DECLARE(vec) int _##vec##_count=0; void *_##vec##_tmp
-
-/*in the future, I plan on having V_DECLARE allocate stack memory it'll
- use at first, and switch over to heap when it needs more. that'll mess
- up cases where you'd want to use this API to build a dynamic list for
- non-local use, so all such cases should use this macro.*/
-#define V_DYNDECLARE(vec) V_DECLARE(vec)
-
-/*this returns the entire size of the array, including any buffering.*/
-#define V_SIZE(vec) ((signed int)((vec)==NULL ? 0 : MEM_allocN_len(vec) / sizeof(*vec)))
-
-/*this returns the logical size of the array, not including buffering.*/
-#define V_COUNT(vec) _##vec##_count
-
-/*grow the array by one. zeroes the new elements.*/
-#define V_GROW(vec) \
- V_SIZE(vec) > _##vec##_count ? _##vec##_count++ : \
- ((_##vec##_tmp = MEM_callocN(sizeof(*vec)*(_##vec##_count*2+2), #vec " " __FILE__ " ")),\
- (vec && memcpy(_##vec##_tmp, vec, sizeof(*vec) * _##vec##_count)),\
- (vec && (MEM_freeN(vec),1)),\
- (vec = _##vec##_tmp),\
- _##vec##_count++)
-
-#define V_FREE(vec) if (vec) MEM_freeN(vec);
-
-/*resets the logical size of an array to zero, but doesn't
- free the memory.*/
-#define V_RESET(vec) _##vec##_count=0
-
-/*set the count of the array*/
-#define V_SETCOUNT(vec, count) _##vec##_count = (count)
-
-/*little macro so inline keyword works*/
-#if defined(_MSC_VER)
-#define BM_INLINE static __forceinline
-#else
-#define BM_INLINE static inline __attribute((always_inline))
-#endif
-
#define BMEMSET(mem, val, size) {unsigned int _i; char *_c = (char*) mem; for (_i=0; _i<size; _i++) *_c++ = val;}
-#endif
+#endif // BKE_UTILDEFINES_H
diff --git a/source/blender/blenkernel/BKE_world.h b/source/blender/blenkernel/BKE_world.h
index 9d763e8f003..8c6da40fcea 100644
--- a/source/blender/blenkernel/BKE_world.h
+++ b/source/blender/blenkernel/BKE_world.h
@@ -34,7 +34,7 @@
struct World;
void free_world(struct World *sc);
-struct World *add_world(char *name);
+struct World *add_world(const char *name);
struct World *copy_world(struct World *wrld);
void make_local_world(struct World *wrld);
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index ccead684a88..5f5b413ecd8 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-SET(INC
+set(INC
.
../avi
../blenlib
@@ -51,82 +49,259 @@ SET(INC
../../../intern/opennl/extern
../../../intern/smoke/extern
../../../source/blender/windowmanager # XXX - BAD LEVEL CALL WM_api.h
- ${ZLIB_INC}
+ ${ZLIB_INCLUDE_DIRS}
+)
+
+set(SRC
+ intern/BME_Customdata.c
+ intern/BME_conversions.c
+ intern/BME_eulers.c
+ intern/BME_mesh.c
+ intern/BME_structure.c
+ intern/BME_tools.c
+ intern/CCGSubSurf.c
+ intern/DerivedMesh.c
+ intern/action.c
+ intern/anim.c
+ intern/anim_sys.c
+ intern/armature.c
+ intern/blender.c
+ intern/bmfont.c
+ intern/boids.c
+ intern/booleanops_mesh.c
+ intern/brush.c
+ intern/bullet.c
+ intern/bvhutils.c
+ intern/cdderivedmesh.c
+ intern/cloth.c
+ intern/collision.c
+ intern/colortools.c
+ intern/constraint.c
+ intern/context.c
+ intern/curve.c
+ intern/customdata.c
+ intern/customdata_file.c
+ intern/deform.c
+ intern/depsgraph.c
+ intern/displist.c
+ intern/effect.c
+ intern/exotic.c
+ intern/fcurve.c
+ intern/fluidsim.c
+ intern/fmodifier.c
+ intern/font.c
+ intern/gpencil.c
+ intern/group.c
+ intern/icons.c
+ intern/idcode.c
+ intern/idprop.c
+ intern/image.c
+ intern/image_gen.c
+ intern/implicit.c
+ intern/ipo.c
+ intern/key.c
+ intern/lattice.c
+ intern/library.c
+ intern/material.c
+ intern/mball.c
+ intern/mesh.c
+ intern/mesh_validate.c
+ intern/modifier.c
+ intern/multires.c
+ intern/nla.c
+ intern/node.c
+ intern/object.c
+ intern/packedFile.c
+ intern/paint.c
+ intern/particle.c
+ intern/particle_system.c
+ intern/pointcache.c
+ intern/property.c
+ intern/report.c
+ intern/sca.c
+ intern/scene.c
+ intern/screen.c
+ intern/script.c
+ intern/seqcache.c
+ intern/seqeffects.c
+ intern/sequencer.c
+ intern/shrinkwrap.c
+ intern/sketch.c
+ intern/smoke.c
+ intern/softbody.c
+ intern/sound.c
+ intern/subsurf_ccg.c
+ intern/suggestions.c
+ intern/text.c
+ intern/texture.c
+ intern/unit.c
+ intern/world.c
+ intern/writeavi.c
+ intern/writeffmpeg.c
+ intern/writeframeserver.c
+
+ BKE_DerivedMesh.h
+ BKE_action.h
+ BKE_anim.h
+ BKE_animsys.h
+ BKE_armature.h
+ BKE_array_mallocn.h
+ BKE_blender.h
+ BKE_bmesh.h
+ BKE_bmeshCustomData.h
+ BKE_bmfont.h
+ BKE_bmfont_types.h
+ BKE_boids.h
+ BKE_booleanops_mesh.h
+ BKE_brush.h
+ BKE_bullet.h
+ BKE_bvhutils.h
+ BKE_cdderivedmesh.h
+ BKE_cloth.h
+ BKE_collision.h
+ BKE_colortools.h
+ BKE_constraint.h
+ BKE_context.h
+ BKE_curve.h
+ BKE_customdata.h
+ BKE_customdata_file.h
+ BKE_deform.h
+ BKE_depsgraph.h
+ BKE_displist.h
+ BKE_effect.h
+ BKE_endian.h
+ BKE_exotic.h
+ BKE_fcurve.h
+ BKE_fluidsim.h
+ BKE_font.h
+ BKE_global.h
+ BKE_gpencil.h
+ BKE_group.h
+ BKE_icons.h
+ BKE_idcode.h
+ BKE_idprop.h
+ BKE_image.h
+ BKE_ipo.h
+ BKE_key.h
+ BKE_lattice.h
+ BKE_library.h
+ BKE_main.h
+ BKE_material.h
+ BKE_mball.h
+ BKE_mesh.h
+ BKE_modifier.h
+ BKE_multires.h
+ BKE_nla.h
+ BKE_node.h
+ BKE_object.h
+ BKE_packedFile.h
+ BKE_paint.h
+ BKE_particle.h
+ BKE_plugin_types.h
+ BKE_pointcache.h
+ BKE_property.h
+ BKE_report.h
+ BKE_sca.h
+ BKE_scene.h
+ BKE_screen.h
+ BKE_script.h
+ BKE_sequencer.h
+ BKE_shrinkwrap.h
+ BKE_sketch.h
+ BKE_smoke.h
+ BKE_softbody.h
+ BKE_sound.h
+ BKE_subsurf.h
+ BKE_suggestions.h
+ BKE_text.h
+ BKE_texture.h
+ BKE_unit.h
+ BKE_utildefines.h
+ BKE_world.h
+ BKE_writeavi.h
+ BKE_writeffmpeg.h
+ BKE_writeframeserver.h
+ depsgraph_private.h
+ intern/CCGSubSurf.h
+ intern/bmesh_private.h
+ nla_private.h
)
+add_definitions(-DGLEW_STATIC)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+if(WITH_BULLET)
+ list(APPEND INC ../../../extern/bullet2/src)
+ add_definitions(-DUSE_BULLET)
+endif()
-IF(WITH_BULLET)
- LIST(APPEND INC ../../../extern/bullet2/src)
- ADD_DEFINITIONS(-DUSE_BULLET)
-ENDIF(WITH_BULLET)
+if(WITH_IMAGE_OPENEXR)
+ add_definitions(-DWITH_OPENEXR)
+endif()
-IF(WITH_IMAGE_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_IMAGE_OPENEXR)
+if(WITH_IMAGE_TIFF)
+ add_definitions(-DWITH_TIFF)
+endif()
-IF(WITH_IMAGE_TIFF)
- ADD_DEFINITIONS(-DWITH_TIFF)
-ENDIF(WITH_IMAGE_TIFF)
+if(WITH_IMAGE_OPENJPEG)
+ add_definitions(-DWITH_OPENJPEG)
+endif()
-IF(WITH_IMAGE_OPENJPEG)
- ADD_DEFINITIONS(-DWITH_OPENJPEG)
-ENDIF(WITH_IMAGE_OPENJPEG)
+if(WITH_IMAGE_DDS)
+ add_definitions(-DWITH_DDS)
+endif()
-IF(WITH_IMAGE_DDS)
- ADD_DEFINITIONS(-DWITH_DDS)
-ENDIF(WITH_IMAGE_DDS)
+if(WITH_IMAGE_CINEON)
+ add_definitions(-DWITH_CINEON)
+endif()
-IF(WITH_IMAGE_CINEON)
- ADD_DEFINITIONS(-DWITH_CINEON)
-ENDIF(WITH_IMAGE_CINEON)
+if(WITH_IMAGE_HDR)
+ add_definitions(-DWITH_HDR)
+endif()
-IF(WITH_IMAGE_HDR)
- ADD_DEFINITIONS(-DWITH_HDR)
-ENDIF(WITH_IMAGE_HDR)
+if(WITH_CODEC_QUICKTIME)
+ list(APPEND INC ../quicktime ${QUICKTIME_INC})
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-IF(WITH_QUICKTIME)
- LIST(APPEND INC ../quicktime ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+if(WITH_CODEC_FFMPEG)
+ list(APPEND INC ${FFMPEG_INC})
+ add_definitions(-DWITH_FFMPEG)
+endif()
-IF(WITH_FFMPEG)
- LIST(APPEND INC ${FFMPEG_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
-ENDIF(WITH_FFMPEG)
+if(WITH_LCMS)
+ list(APPEND INC ${LCMS_INCLUDE_DIR})
+ add_definitions(-DWITH_LCMS)
+endif()
-IF(WITH_LCMS)
- LIST(APPEND INC ${LCMS_INCLUDE_DIR})
- ADD_DEFINITIONS(-DWITH_LCMS)
-ENDIF(WITH_LCMS)
+if(WITH_PYTHON)
+ list(APPEND INC ../python ${PYTHON_INCLUDE_DIRS})
+ add_definitions(-DWITH_PYTHON)
+endif()
-IF(WITH_PYTHON)
- LIST(APPEND INC ../python ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_OPENMP)
+ add_definitions(-DPARALLEL=1)
+endif()
-IF(WITH_OPENMP)
- ADD_DEFINITIONS(-DPARALLEL=1)
-ENDIF(WITH_OPENMP)
+if(NOT WITH_MOD_FLUID)
+ add_definitions(-DDISABLE_ELBEEM)
+endif()
-IF(NOT WITH_FLUID)
- ADD_DEFINITIONS(-DDISABLE_ELBEEM)
-ENDIF(NOT WITH_FLUID)
+if(WITH_JACK)
+ add_definitions(-DWITH_JACK)
+endif()
-IF(WITH_LZO)
- LIST(APPEND INC ../../../extern/lzo/minilzo)
- ADD_DEFINITIONS(-DWITH_LZO)
-ENDIF(WITH_LZO)
+if(WITH_LZO)
+ list(APPEND INC ../../../extern/lzo/minilzo)
+ add_definitions(-DWITH_LZO)
+endif()
-IF(WITH_LZMA)
- LIST(APPEND INC ../../../extern/lzma)
- ADD_DEFINITIONS(-DWITH_LZMA)
-ENDIF(WITH_LZMA)
+if(WITH_LZMA)
+ list(APPEND INC ../../../extern/lzma)
+ add_definitions(-DWITH_LZMA)
+endif()
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+if(MSVC)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX")
+endif()
-BLENDERLIB(bf_blenkernel "${SRC}" "${INC}")
+blender_add_lib(bf_blenkernel "${SRC}" "${INC}")
diff --git a/source/blender/blenkernel/Makefile b/source/blender/blenkernel/Makefile
deleted file mode 100644
index dc5f0a91da6..00000000000
--- a/source/blender/blenkernel/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/blenkernel
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript
index 1e48f94f14d..21afb882d92 100644
--- a/source/blender/blenkernel/SConscript
+++ b/source/blender/blenkernel/SConscript
@@ -19,13 +19,12 @@ incs += ' ' + env['BF_ZLIB_INC']
defs = [ 'GLEW_STATIC' ]
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
-else:
+if env['WITH_BF_PYTHON']:
incs += ' ../python'
incs += ' ' + env['BF_PYTHON_INC']
+ defs.append('WITH_PYTHON')
if env['BF_DEBUG']:
- defs.append('_DEBUG')
+ defs.append('DEBUG')
if env['WITH_BF_QUICKTIME']:
incs += ' ../quicktime'
@@ -53,6 +52,9 @@ if env['WITH_BF_CINEON']:
if env['WITH_BF_HDR']:
defs.append('WITH_HDR')
+if env['WITH_BF_JACK']:
+ defs.append('WITH_JACK')
+
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
incs += ' ' + env['BF_FFMPEG_INC']
@@ -86,4 +88,7 @@ if env['WITH_BF_LZMA']:
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
incs += ' ' + env['BF_PTHREADS_INC']
-env.BlenderLib ( libname = 'bf_blenkernel', sources = sources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [166,25] )
+if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
+ env.BlenderLib ( libname = 'bf_blenkernel', sources = sources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [166,25]) #, cc_compileflags = env['CCFLAGS'].append('/WX') )
+else:
+ env.BlenderLib ( libname = 'bf_blenkernel', sources = sources, includes = Split(incs), defines = defs, libtype=['core','player', 'player2'], priority = [166,25,0] )
diff --git a/source/blender/blenkernel/depsgraph_private.h b/source/blender/blenkernel/depsgraph_private.h
index 503ee973be0..808ce661628 100644
--- a/source/blender/blenkernel/depsgraph_private.h
+++ b/source/blender/blenkernel/depsgraph_private.h
@@ -51,7 +51,7 @@ typedef struct DagAdjList
short type;
int count; // number of identical arcs
unsigned int lay; // for flushing redraw/rebuild events
- char *name;
+ const char *name;
struct DagAdjList *next;
} DagAdjList;
@@ -64,8 +64,8 @@ typedef struct DagNode
void * ob;
void * first_ancestor;
int ancestor_count;
- int lay; // accumulated layers of its relations + itself
- int scelay; // layers due to being in scene
+ unsigned int lay; // accumulated layers of its relations + itself
+ unsigned int scelay; // layers due to being in scene
int lasttime; // if lasttime != DagForest->time, this node was not evaluated yet for flushing
int BFS_dist; // BFS distance
int DFS_dist; // DFS distance
@@ -117,7 +117,7 @@ DagNode * dag_find_node (DagForest *forest,void * fob);
DagNode * dag_add_node (DagForest *forest,void * fob);
DagNode * dag_get_node (DagForest *forest,void * fob);
DagNode * dag_get_sub_node (DagForest *forest,void * fob);
-void dag_add_relation(DagForest *forest, DagNode *fob1, DagNode *fob2, short rel, char *name);
+void dag_add_relation(DagForest *forest, DagNode *fob1, DagNode *fob2, short rel, const char *name);
void graph_bfs(void);
diff --git a/source/blender/blenkernel/intern/BME_Customdata.c b/source/blender/blenkernel/intern/BME_Customdata.c
index 1087b3a873c..b64efa811de 100644
--- a/source/blender/blenkernel/intern/BME_Customdata.c
+++ b/source/blender/blenkernel/intern/BME_Customdata.c
@@ -43,7 +43,7 @@
/********************* Layer type information **********************/
typedef struct BME_LayerTypeInfo {
int size;
- char *defaultname;
+ const char *defaultname;
void (*copy)(const void *source, void *dest, int count);
void (*free)(void *data, int count, int size);
void (*interp)(void **sources, float *weights, float *sub_weights, int count, void *dest);
diff --git a/source/blender/blenkernel/intern/BME_conversions.c b/source/blender/blenkernel/intern/BME_conversions.c
index 341eb38b388..e80d4827155 100644
--- a/source/blender/blenkernel/intern/BME_conversions.c
+++ b/source/blender/blenkernel/intern/BME_conversions.c
@@ -38,10 +38,12 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
+
#include "BKE_mesh.h"
#include "BKE_cdderivedmesh.h"
-#include "BLI_edgehash.h"
//XXX #include "BIF_editmesh.h"
//XXX #include "editmesh.h"
#include "bmesh_private.h"
diff --git a/source/blender/blenkernel/intern/BME_eulers.c b/source/blender/blenkernel/intern/BME_eulers.c
index 036cd4a23e2..cd9429982dc 100644
--- a/source/blender/blenkernel/intern/BME_eulers.c
+++ b/source/blender/blenkernel/intern/BME_eulers.c
@@ -33,7 +33,7 @@
*/
#include "MEM_guardedalloc.h"
-
+#include "BLI_utildefines.h"
#include "bmesh_private.h"
diff --git a/source/blender/blenkernel/intern/BME_structure.c b/source/blender/blenkernel/intern/BME_structure.c
index de3eb94beac..9463d22e3be 100644
--- a/source/blender/blenkernel/intern/BME_structure.c
+++ b/source/blender/blenkernel/intern/BME_structure.c
@@ -33,8 +33,9 @@
*/
#include <limits.h>
-#include "MEM_guardedalloc.h"
+#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BKE_bmesh.h"
/**
* MISC utility functions.
diff --git a/source/blender/blenkernel/intern/BME_tools.c b/source/blender/blenkernel/intern/BME_tools.c
index 7d9c9a431f8..0c8352ad8b0 100644
--- a/source/blender/blenkernel/intern/BME_tools.c
+++ b/source/blender/blenkernel/intern/BME_tools.c
@@ -38,8 +38,10 @@
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
-#include "BKE_bmesh.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_bmesh.h"
/*split this all into a seperate bevel.c file in src*/
@@ -107,7 +109,7 @@ float *BME_new_transdata_float(BME_TransData_Head *td) {
return BLI_memarena_alloc(td->ma, sizeof(float));
}
-static int BME_is_nonmanifold_vert(BME_Mesh *bm, BME_Vert *v) {
+static int BME_is_nonmanifold_vert(BME_Mesh *UNUSED(bm), BME_Vert *v) {
BME_Edge *e, *oe;
BME_Loop *l;
int len, count, flag;
@@ -217,7 +219,7 @@ static void BME_data_interp_from_verts(BME_Mesh *bm, BME_Vert *v1, BME_Vert *v2,
#endif
-static void BME_data_facevert_edgesplit(BME_Mesh *bm, BME_Vert *v1, BME_Vert *v2, BME_Vert *v, BME_Edge *e1, float fac){
+static void BME_data_facevert_edgesplit(BME_Mesh *bm, BME_Vert *v1, BME_Vert *UNUSED(v2), BME_Vert *v, BME_Edge *e1, float fac){
void *src[2];
float w[2];
BME_Loop *l=NULL, *v1loop = NULL, *vloop = NULL, *v2loop = NULL;
@@ -356,7 +358,7 @@ static int BME_bevel_get_vec(float *vec, BME_Vert *v1, BME_Vert *v2, BME_TransDa
* vec2 is the direction of projection (pointing away from vec1)
* up_vec is used for orientation (expected to be normalized)
* returns the length of the projected vector that lies along vec1 */
-static float BME_bevel_project_vec(float *vec1, float *vec2, float *up_vec, int is_forward, BME_TransData_Head *td) {
+static float BME_bevel_project_vec(float *vec1, float *vec2, float *up_vec, int is_forward, BME_TransData_Head *UNUSED(td)) {
float factor, vec3[3], tmp[3],c1,c2;
cross_v3_v3v3(tmp,vec1,vec2);
@@ -582,7 +584,7 @@ static float BME_bevel_set_max(BME_Vert *v1, BME_Vert *v2, float value, BME_Tran
return max;
}
-static BME_Vert *BME_bevel_wire(BME_Mesh *bm, BME_Vert *v, float value, int res, int options, BME_TransData_Head *td) {
+static BME_Vert *BME_bevel_wire(BME_Mesh *bm, BME_Vert *v, float value, int res, int UNUSED(options), BME_TransData_Head *td) {
BME_Vert *ov1, *ov2, *v1, *v2;
ov1 = BME_edge_getothervert(v->edge, v);
@@ -607,7 +609,7 @@ static BME_Vert *BME_bevel_wire(BME_Mesh *bm, BME_Vert *v, float value, int res,
return v1;
}
-static BME_Loop *BME_bevel_edge(BME_Mesh *bm, BME_Loop *l, float value, int options, float *up_vec, BME_TransData_Head *td) {
+static BME_Loop *BME_bevel_edge(BME_Mesh *bm, BME_Loop *l, float value, int UNUSED(options), float *up_vec, BME_TransData_Head *td) {
BME_Vert *v1, *v2, *kv;
BME_Loop *kl=NULL, *nl;
BME_Edge *e;
@@ -708,7 +710,7 @@ static BME_Loop *BME_bevel_edge(BME_Mesh *bm, BME_Loop *l, float value, int opti
return l;
}
-static BME_Loop *BME_bevel_vert(BME_Mesh *bm, BME_Loop *l, float value, int options, float *up_vec, BME_TransData_Head *td) {
+static BME_Loop *BME_bevel_vert(BME_Mesh *bm, BME_Loop *l, float value, int UNUSED(options), float *up_vec, BME_TransData_Head *td) {
BME_Vert *v1, *v2;
BME_Poly *f;
@@ -859,7 +861,7 @@ static void BME_bevel_add_vweight(BME_TransData_Head *td, BME_Mesh *bm, BME_Vert
}
}
-static float BME_bevel_get_angle(BME_Mesh *bm, BME_Edge *e, BME_Vert *v) {
+static float BME_bevel_get_angle(BME_Mesh *UNUSED(bm), BME_Edge *e, BME_Vert *v) {
BME_Vert *v1, *v2;
BME_Loop *l1, *l2;
float vec1[3], vec2[3], vec3[3], vec4[3];
@@ -918,7 +920,7 @@ static int BME_face_sharededges(BME_Poly *f1, BME_Poly *f2){
* Returns -
* A BME_Mesh pointer to the BMesh passed as a parameter.
*/
-static BME_Mesh *BME_bevel_initialize(BME_Mesh *bm, int options, int defgrp_index, float angle, BME_TransData_Head *td) {
+static BME_Mesh *BME_bevel_initialize(BME_Mesh *bm, int options, int UNUSED(defgrp_index), float angle, BME_TransData_Head *td) {
BME_Vert *v;
BME_Edge *e;
BME_Poly *f;
@@ -1162,7 +1164,7 @@ static void bmesh_dissolve_disk(BME_Mesh *bm, BME_Vert *v){
//BME_JEKV(bm,v->edge,v);
}
}
-static BME_Mesh *BME_bevel_mesh(BME_Mesh *bm, float value, int res, int options, int defgrp_index, BME_TransData_Head *td) {
+static BME_Mesh *BME_bevel_mesh(BME_Mesh *bm, float value, int res, int options, int UNUSED(defgrp_index), BME_TransData_Head *td) {
BME_Vert *v, *nv;
BME_Edge *e, *oe;
BME_Loop *l, *l2;
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index bbd68fb797b..35ba8caedb0 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -15,6 +15,13 @@
#define CCG_INLINE inline
#endif
+/* copied from BKE_utildefines.h ugh */
+#ifdef __GNUC__
+# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
+#else
+# define UNUSED(x) x
+#endif
+
/* used for normalize_v3 in BLI_math_vector
* float.h's FLT_EPSILON causes trouble with subsurf normals - campbell */
#define EPSILON (1.0e-35f)
@@ -185,13 +192,13 @@ static int _ehashIterator_isStopped(EHashIterator *ehi) {
/***/
-static void *_stdAllocator_alloc(CCGAllocatorHDL a, int numBytes) {
+static void *_stdAllocator_alloc(CCGAllocatorHDL UNUSED(a), int numBytes) {
return malloc(numBytes);
}
-static void *_stdAllocator_realloc(CCGAllocatorHDL a, void *ptr, int newSize, int oldSize) {
+static void *_stdAllocator_realloc(CCGAllocatorHDL UNUSED(a), void *ptr, int newSize, int UNUSED(oldSize)) {
return realloc(ptr, newSize);
}
-static void _stdAllocator_free(CCGAllocatorHDL a, void *ptr) {
+static void _stdAllocator_free(CCGAllocatorHDL UNUSED(a), void *ptr) {
free(ptr);
}
@@ -1514,7 +1521,7 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss,
}
}
- if (seam && seamEdges < 2)
+ if (seamEdges < 2 || seamEdges != v->numEdges)
seam = 0;
if (!v->numEdges) {
@@ -1942,7 +1949,7 @@ static void ccgSubSurf__sync(CCGSubSurf *ss) {
}
}
- if (seam && seamEdges < 2)
+ if (seamEdges < 2 || seamEdges != v->numEdges)
seam = 0;
if (!v->numEdges) {
@@ -2601,7 +2608,7 @@ float ccgSubSurf_getEdgeCrease(CCGEdge *e) {
/* Face accessors */
-CCGFaceHDL ccgSubSurf_getFaceFaceHandle(CCGSubSurf *ss, CCGFace *f) {
+CCGFaceHDL ccgSubSurf_getFaceFaceHandle(CCGSubSurf *UNUSED(ss), CCGFace *f) {
return f->fHDL;
}
int ccgSubSurf_getFaceAge(CCGSubSurf *ss, CCGFace *f) {
@@ -2619,14 +2626,14 @@ void *ccgSubSurf_getFaceUserData(CCGSubSurf *ss, CCGFace *f) {
int ccgSubSurf_getFaceNumVerts(CCGFace *f) {
return f->numVerts;
}
-CCGVert *ccgSubSurf_getFaceVert(CCGSubSurf *ss, CCGFace *f, int index) {
+CCGVert *ccgSubSurf_getFaceVert(CCGSubSurf *UNUSED(ss), CCGFace *f, int index) {
if (index<0 || index>=f->numVerts) {
return NULL;
} else {
return FACE_getVerts(f)[index];
}
}
-CCGEdge *ccgSubSurf_getFaceEdge(CCGSubSurf *ss, CCGFace *f, int index) {
+CCGEdge *ccgSubSurf_getFaceEdge(CCGSubSurf *UNUSED(ss), CCGFace *f, int index) {
if (index<0 || index>=f->numVerts) {
return NULL;
} else {
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index de7b962e38a..be9cda6c58f 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -43,6 +43,7 @@
#include "BLI_math.h"
#include "BLI_memarena.h"
#include "BLI_pbvh.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_displist.h"
@@ -52,7 +53,8 @@
#include "BKE_object.h"
#include "BKE_paint.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+#include "BKE_multires.h"
+
#include "BLO_sys_types.h" // for intptr_t support
@@ -64,6 +66,8 @@
#include "GPU_extensions.h"
#include "GPU_material.h"
+#include "ED_sculpt.h" /* for ED_sculpt_modifiers_changed */
+
///////////////////////////////////
///////////////////////////////////
@@ -239,6 +243,15 @@ void DM_to_mesh(DerivedMesh *dm, Mesh *me)
if(!CustomData_has_layer(&tmp.fdata, CD_MFACE))
CustomData_add_layer(&tmp.fdata, CD_MFACE, CD_ASSIGN, dm->dupFaceArray(dm), totface);
+ /* object had got displacement layer, should copy this layer to save sculpted data */
+ /* NOTE: maybe some other layers should be copied? nazgul */
+ if(CustomData_has_layer(&me->fdata, CD_MDISPS)) {
+ if (totface == me->totface) {
+ MDisps *mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
+ CustomData_add_layer(&tmp.fdata, CD_MDISPS, CD_DUPLICATE, mdisps, totface);
+ }
+ }
+
mesh_update_customdata_pointers(&tmp);
CustomData_free(&me->vdata, me->totvert);
@@ -419,7 +432,7 @@ void DM_swap_face_data(DerivedMesh *dm, int index, const int *corner_indices)
///
-static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, float (*vertCos)[3])
+DerivedMesh *mesh_create_derived(Mesh *me, Object *ob, float (*vertCos)[3])
{
DerivedMesh *dm = CDDM_from_mesh(me, ob);
@@ -508,7 +521,7 @@ static void emDM_drawMappedEdges(DerivedMesh *dm, int (*setDrawOptions)(void *us
glEnd();
}
}
-static void emDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int drawAllEdges)
+static void emDM_drawEdges(DerivedMesh *dm, int UNUSED(drawLooseEdges), int UNUSED(drawAllEdges))
{
emDM_drawMappedEdges(dm, NULL, NULL);
}
@@ -617,11 +630,15 @@ static void emDM_foreachMappedFaceCenter(DerivedMesh *dm, void (*func)(void *use
func(userData, i, cent, emdm->vertexCos?emdm->faceNos[i]:efa->n);
}
}
-static void emDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors)
+
+/* note, material function is ignored for now. */
+static void emDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int UNUSED(useColors), int (*setMaterial)(int, void *attribs))
{
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
EditFace *efa;
int i, draw;
+
+ (void)setMaterial; /* unused */
if (emdm->vertexCos) {
EditVert *eve;
@@ -1105,8 +1122,7 @@ static void emDM_getVert(DerivedMesh *dm, int index, MVert *vert_r)
vert_r->no[1] = ev->no[1] * 32767.0;
vert_r->no[2] = ev->no[2] * 32767.0;
- /* TODO what to do with vert_r->flag and vert_r->mat_nr? */
- vert_r->mat_nr = 0;
+ /* TODO what to do with vert_r->flag? */
vert_r->bweight = (unsigned char) (ev->bweight*255.0f);
}
@@ -1203,8 +1219,7 @@ static void emDM_copyVertArray(DerivedMesh *dm, MVert *vert_r)
vert_r->no[1] = ev->no[1] * 32767.0;
vert_r->no[2] = ev->no[2] * 32767.0;
- /* TODO what to do with vert_r->flag and vert_r->mat_nr? */
- vert_r->mat_nr = 0;
+ /* TODO what to do with vert_r->flag? */
vert_r->flag = 0;
vert_r->bweight = (unsigned char) (ev->bweight*255.0f);
}
@@ -1270,7 +1285,7 @@ static void *emDM_getFaceDataArray(DerivedMesh *dm, int type)
EditFace *efa;
char *data, *emdata;
void *datalayer;
- int index, offset, size;
+ int index, size;
datalayer = DM_get_face_data_layer(dm, type);
if(datalayer)
@@ -1282,7 +1297,7 @@ static void *emDM_getFaceDataArray(DerivedMesh *dm, int type)
index = CustomData_get_layer_index(&em->fdata, type);
if(index != -1) {
- offset = em->fdata.layers[index].offset;
+ /* int offset = em->fdata.layers[index].offset; */ /* UNUSED */
size = CustomData_sizeof(type);
DM_add_face_layer(dm, type, CD_CALLOC, NULL);
@@ -1315,8 +1330,7 @@ static void emDM_release(DerivedMesh *dm)
}
}
-static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, Object *ob,
- float (*vertexCos)[3])
+DerivedMesh *editmesh_get_derived(EditMesh *em, float (*vertexCos)[3])
{
EditMeshDerivedMesh *emdm = MEM_callocN(sizeof(*emdm), "emdm");
@@ -1433,11 +1447,11 @@ DerivedMesh *mesh_create_derived_for_modifier(Scene *scene, Object *ob, Modifier
float (*deformedVerts)[3] = mesh_getVertexCos(me, &numVerts);
mti->deformVerts(md, ob, NULL, deformedVerts, numVerts, 0, 0);
- dm = getMeshDerivedMesh(me, ob, deformedVerts);
+ dm = mesh_create_derived(me, ob, deformedVerts);
MEM_freeN(deformedVerts);
} else {
- DerivedMesh *tdm = getMeshDerivedMesh(me, ob, NULL);
+ DerivedMesh *tdm = mesh_create_derived(me, ob, NULL);
dm = mti->applyModifier(md, ob, tdm, 0, 0);
if(tdm != dm) tdm->release(tdm);
@@ -1661,17 +1675,32 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
DerivedMesh *dm, *orcodm, *clothorcodm, *finaldm;
int numVerts = me->totvert;
int required_mode;
+ int isPrevDeform= FALSE;
+ int skipVirtualArmature = (useDeform < 0);
+ MultiresModifierData *mmd= get_multires_modifier(scene, ob, 0);
+ int has_multires = mmd != NULL, multires_applied = 0;
+ int sculpt_mode = ob->mode & OB_MODE_SCULPT && ob->sculpt;
+
+ if(mmd && !mmd->sculptlvl)
+ has_multires = 0;
+
+ if(!skipVirtualArmature) {
+ firstmd = modifiers_getVirtualModifierList(ob);
+ }
+ else {
+ /* game engine exception */
+ firstmd = ob->modifiers.first;
+ if(firstmd && firstmd->type == eModifierType_Armature)
+ firstmd = firstmd->next;
+ }
- md = firstmd = (useDeform<0) ? ob->modifiers.first : modifiers_getVirtualModifierList(ob);
+ md = firstmd;
modifiers_clearErrors(ob);
if(useRenderParams) required_mode = eModifierMode_Render;
else required_mode = eModifierMode_Realtime;
- /* we always want to keep original indices */
- dataMask |= CD_MASK_ORIGINDEX;
-
datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode);
curr = datamasks;
@@ -1692,6 +1721,12 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
if(useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) continue;
if(mti->type == eModifierTypeType_OnlyDeform) {
+ if(sculpt_mode && !has_multires)
+ if(!ELEM(md->type, eModifierType_Armature, eModifierType_ShapeKey)) {
+ modifier_setError(md, "Not supported in sculpt mode.");
+ continue;
+ }
+
if(!deformedVerts)
deformedVerts = mesh_getVertexCos(me, &numVerts);
@@ -1737,13 +1772,18 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
md->scene= scene;
-
+
if(!modifier_isEnabled(scene, md, required_mode)) continue;
if(mti->type == eModifierTypeType_OnlyDeform && !useDeform) continue;
if((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) {
modifier_setError(md, "Modifier requires original data, bad stack position.");
continue;
}
+ if(sculpt_mode && (!has_multires || multires_applied))
+ if(md->type != eModifierType_Armature || multires_applied) {
+ modifier_setError(md, "Not supported in sculpt mode.");
+ continue;
+ }
if(needMapping && !modifier_supportsMapping(md)) continue;
if(useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) continue;
@@ -1778,10 +1818,26 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
}
}
+ /* if this is not the last modifier in the stack then recalculate the normals
+ * to avoid giving bogus normals to the next modifier see: [#23673] */
+ if(isPrevDeform && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
+ /* XXX, this covers bug #23673, but we may need normal calc for other types */
+ if(dm->type == DM_TYPE_CDDM) {
+ CDDM_apply_vert_coords(dm, deformedVerts);
+ CDDM_calc_normals(dm);
+ }
+ }
+
mti->deformVerts(md, ob, dm, deformedVerts, numVerts, useRenderParams, useDeform);
} else {
DerivedMesh *ndm;
+ /* determine which data layers are needed by following modifiers */
+ if(curr->next)
+ nextmask= (CustomDataMask)GET_INT_FROM_POINTER(curr->next->link);
+ else
+ nextmask= dataMask;
+
/* apply vertex coordinates or build a DerivedMesh as necessary */
if(dm) {
if(deformedVerts) {
@@ -1803,28 +1859,25 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT))
add_weight_mcol_dm(ob, dm);
- /* constructive modifiers need to have an origindex
- * otherwise they wont have anywhere to copy the data from */
- if(needMapping) {
- int *index, i;
+ /* Constructive modifiers need to have an origindex
+ * otherwise they wont have anywhere to copy the data from.
+ *
+ * Also create ORIGINDEX data if any of the following modifiers
+ * requests it, this way Mirror, Solidify etc will keep ORIGINDEX
+ * data by using generic DM_copy_vert_data() functions.
+ */
+ if(needMapping || (nextmask & CD_MASK_ORIGINDEX)) {
+ /* calc */
DM_add_vert_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
DM_add_edge_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
DM_add_face_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
- index = DM_get_vert_data_layer(dm, CD_ORIGINDEX);
- for(i=0; i<dm->numVertData; i++) *index++= i;
- index = DM_get_edge_data_layer(dm, CD_ORIGINDEX);
- for(i=0; i<dm->numEdgeData; i++) *index++= i;
- index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
- for(i=0; i<dm->numFaceData; i++) *index++= i;
+ range_vni(DM_get_vert_data_layer(dm, CD_ORIGINDEX), dm->numVertData, 0);
+ range_vni(DM_get_edge_data_layer(dm, CD_ORIGINDEX), dm->numEdgeData, 0);
+ range_vni(DM_get_face_data_layer(dm, CD_ORIGINDEX), dm->numFaceData, 0);
}
}
- /* determine which data layers are needed by following modifiers */
- if(curr->next)
- nextmask= (CustomDataMask)GET_INT_FROM_POINTER(curr->next->link);
- else
- nextmask= dataMask;
/* set the DerivedMesh to only copy needed data */
mask= (CustomDataMask)GET_INT_FROM_POINTER(curr->link);
@@ -1861,7 +1914,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
orcodm= create_orco_dm(ob, me, NULL, CD_ORCO);
nextmask &= ~CD_MASK_ORCO;
- DM_set_only_copy(orcodm, nextmask);
+ DM_set_only_copy(orcodm, nextmask | CD_MASK_ORIGINDEX);
ndm = mti->applyModifier(md, ob, orcodm, useRenderParams, 0);
if(ndm) {
@@ -1877,7 +1930,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
clothorcodm= create_orco_dm(ob, me, NULL, CD_CLOTH_ORCO);
nextmask &= ~CD_MASK_CLOTH_ORCO;
- DM_set_only_copy(clothorcodm, nextmask);
+ DM_set_only_copy(clothorcodm, nextmask | CD_MASK_ORIGINDEX);
ndm = mti->applyModifier(md, ob, clothorcodm, useRenderParams, 0);
if(ndm) {
@@ -1888,9 +1941,14 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
}
}
+ isPrevDeform= (mti->type == eModifierTypeType_OnlyDeform);
+
/* grab modifiers until index i */
if((index >= 0) && (modifiers_indexInObject(ob, md) >= index))
break;
+
+ if(sculpt_mode && md->type == eModifierType_Multires)
+ multires_applied = 1;
}
for(md=firstmd; md; md=md->next)
@@ -1945,7 +2003,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
BLI_linklist_free(datamasks, NULL);
}
-static float (*editmesh_getVertexCos(EditMesh *em, int *numVerts_r))[3]
+float (*editmesh_get_vertex_cos(EditMesh *em, int *numVerts_r))[3]
{
int i, numVerts = *numVerts_r = BLI_countlist(&em->verts);
float (*cos)[3];
@@ -1959,7 +2017,7 @@ static float (*editmesh_getVertexCos(EditMesh *em, int *numVerts_r))[3]
return cos;
}
-static int editmesh_modifier_is_enabled(Scene *scene, ModifierData *md, DerivedMesh *dm)
+int editmesh_modifier_is_enabled(Scene *scene, ModifierData *md, DerivedMesh *dm)
{
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
@@ -1988,14 +2046,11 @@ static void editmesh_calc_modifiers(Scene *scene, Object *ob, EditMesh *em, Deri
modifiers_clearErrors(ob);
if(cage_r && cageIndex == -1) {
- *cage_r = getEditMeshDerivedMesh(em, ob, NULL);
+ *cage_r = editmesh_get_derived(em, NULL);
}
dm = NULL;
md = modifiers_getVirtualModifierList(ob);
-
- /* we always want to keep original indices */
- dataMask |= CD_MASK_ORIGINDEX;
datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode);
@@ -2033,7 +2088,7 @@ static void editmesh_calc_modifiers(Scene *scene, Object *ob, EditMesh *em, Deri
MEM_mallocN(sizeof(*deformedVerts) * numVerts, "dfmv");
dm->getVertCos(dm, deformedVerts);
} else {
- deformedVerts = editmesh_getVertexCos(em, &numVerts);
+ deformedVerts = editmesh_get_vertex_cos(em, &numVerts);
}
}
@@ -2074,7 +2129,7 @@ static void editmesh_calc_modifiers(Scene *scene, Object *ob, EditMesh *em, Deri
orcodm= create_orco_dm(ob, ob->data, em, CD_ORCO);
mask &= ~CD_MASK_ORCO;
- DM_set_only_copy(orcodm, mask);
+ DM_set_only_copy(orcodm, mask | CD_MASK_ORIGINDEX);
if (mti->applyModifierEM)
ndm = mti->applyModifierEM(md, ob, em, orcodm);
@@ -2089,9 +2144,11 @@ static void editmesh_calc_modifiers(Scene *scene, Object *ob, EditMesh *em, Deri
}
/* set the DerivedMesh to only copy needed data */
- DM_set_only_copy(dm, (CustomDataMask)GET_INT_FROM_POINTER(curr->link));
+ mask= (CustomDataMask)GET_INT_FROM_POINTER(curr->link); /* CD_MASK_ORCO may have been cleared above */
- if(((CustomDataMask)GET_INT_FROM_POINTER(curr->link)) & CD_MASK_ORIGSPACE)
+ DM_set_only_copy(dm, mask | CD_MASK_ORIGINDEX);
+
+ if(mask & CD_MASK_ORIGSPACE)
if(!CustomData_has_layer(&dm->faceData, CD_ORIGSPACE))
DM_add_face_layer(dm, CD_ORIGSPACE, CD_DEFAULT, NULL);
@@ -2121,7 +2178,7 @@ static void editmesh_calc_modifiers(Scene *scene, Object *ob, EditMesh *em, Deri
*cage_r = dm;
} else {
*cage_r =
- getEditMeshDerivedMesh(em, ob,
+ editmesh_get_derived(em,
deformedVerts ? MEM_dupallocN(deformedVerts) : NULL);
}
}
@@ -2145,7 +2202,7 @@ static void editmesh_calc_modifiers(Scene *scene, Object *ob, EditMesh *em, Deri
} else if (!deformedVerts && cage_r && *cage_r) {
*final_r = *cage_r;
} else {
- *final_r = getEditMeshDerivedMesh(em, ob, deformedVerts);
+ *final_r = editmesh_get_derived(em, deformedVerts);
deformedVerts = NULL;
}
@@ -2186,14 +2243,9 @@ static void clear_mesh_caches(Object *ob)
ob->derivedDeform->release(ob->derivedDeform);
ob->derivedDeform= NULL;
}
- /* we free pbvh on changes, except during sculpt since it can't deal with
- changing PVBH node organization, we hope topology does not change in
- the meantime .. weak */
- if(ob->sculpt && ob->sculpt->pbvh) {
- if(!ob->sculpt->cache) {
- BLI_pbvh_free(ob->sculpt->pbvh);
- ob->sculpt->pbvh= NULL;
- }
+
+ if(ob->sculpt) {
+ ED_sculpt_modifiers_changed(ob);
}
}
@@ -2201,8 +2253,8 @@ static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask)
{
Object *obact = scene->basact?scene->basact->object:NULL;
int editing = paint_facesel_test(ob);
- /* weight paint and face select need original indicies because of selection buffer drawing */
- int needMapping = (ob==obact) && (editing || (ob->mode & (OB_MODE_WEIGHT_PAINT|OB_MODE_VERTEX_PAINT)) || editing);
+ /* weight paint and face select need original indices because of selection buffer drawing */
+ int needMapping = (ob==obact) && (editing || (ob->mode & (OB_MODE_WEIGHT_PAINT|OB_MODE_VERTEX_PAINT)));
clear_mesh_caches(ob);
@@ -2322,6 +2374,16 @@ DerivedMesh *mesh_create_derived_no_virtual(Scene *scene, Object *ob, float (*ve
return final;
}
+DerivedMesh *mesh_create_derived_physics(Scene *scene, Object *ob, float (*vertCos)[3],
+ CustomDataMask dataMask)
+{
+ DerivedMesh *final;
+
+ mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, -1, 1, dataMask, -1, 0);
+
+ return final;
+}
+
DerivedMesh *mesh_create_derived_no_deform_render(Scene *scene, Object *ob,
float (*vertCos)[3],
CustomDataMask dataMask)
@@ -2361,9 +2423,9 @@ DerivedMesh *editmesh_get_derived_cage(Scene *scene, Object *obedit, EditMesh *e
return em->derivedCage;
}
-DerivedMesh *editmesh_get_derived_base(Object *obedit, EditMesh *em)
+DerivedMesh *editmesh_get_derived_base(Object *UNUSED(obedit), EditMesh *em)
{
- return getEditMeshDerivedMesh(em, obedit, NULL);
+ return editmesh_get_derived(em, NULL);
}
@@ -2449,8 +2511,8 @@ int editmesh_get_first_deform_matrices(Scene *scene, Object *ob, EditMesh *em, f
if(mti->type==eModifierTypeType_OnlyDeform && mti->deformMatricesEM) {
if(!defmats) {
- dm= getEditMeshDerivedMesh(em, ob, NULL);
- deformedVerts= editmesh_getVertexCos(em, &numVerts);
+ dm= editmesh_get_derived(em, NULL);
+ deformedVerts= editmesh_get_vertex_cos(em, &numVerts);
defmats= MEM_callocN(sizeof(*defmats)*numVerts, "defmats");
for(a=0; a<numVerts; a++)
@@ -2477,6 +2539,51 @@ int editmesh_get_first_deform_matrices(Scene *scene, Object *ob, EditMesh *em, f
return numleft;
}
+void sculpt_get_deform_matrices(Scene *scene, Object *ob, float (**deformmats)[3][3], float (**deformcos)[3])
+{
+ ModifierData *md;
+ DerivedMesh *dm;
+ int a, numVerts= 0;
+ float (*defmats)[3][3]= NULL, (*deformedVerts)[3]= NULL;
+ MultiresModifierData *mmd= get_multires_modifier(scene, ob, 0);
+ int has_multires = mmd != NULL && mmd->sculptlvl > 0;
+
+ if(has_multires) {
+ *deformmats= NULL;
+ *deformcos= NULL;
+ return;
+ }
+
+ dm= NULL;
+ md= modifiers_getVirtualModifierList(ob);
+
+ for(; md; md= md->next) {
+ ModifierTypeInfo *mti= modifierType_getInfo(md->type);
+
+ if(!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue;
+
+ if(mti->type==eModifierTypeType_OnlyDeform && mti->deformMatrices) {
+ if(!defmats) {
+ Mesh *me= (Mesh*)ob->data;
+ dm= mesh_create_derived(me, ob, NULL);
+ deformedVerts= mesh_getVertexCos(me, &numVerts);
+ defmats= MEM_callocN(sizeof(*defmats)*numVerts, "defmats");
+
+ for(a=0; a<numVerts; a++)
+ unit_m3(defmats[a]);
+ }
+
+ mti->deformMatrices(md, ob, dm, deformedVerts, defmats, numVerts);
+ }
+ }
+
+ if(dm)
+ dm->release(dm);
+
+ *deformmats= defmats;
+ *deformcos= deformedVerts;
+}
+
/* ******************* GLSL ******************** */
void DM_add_tangent_layer(DerivedMesh *dm)
@@ -2566,15 +2673,8 @@ void DM_add_tangent_layer(DerivedMesh *dm)
/* write tangent to layer */
for(i=0, tf=mtface, mf=mface; i < totface; mf++, tf++, i++, tangent+=4) {
len= (mf->v4)? 4 : 3;
-
- if(mtface) {
- uv1= tf->uv[0];
- uv2= tf->uv[1];
- uv3= tf->uv[2];
- uv4= tf->uv[3];
- }
- else {
- uv1= uv[0]; uv2= uv[1]; uv3= uv[2]; uv4= uv[3];
+
+ if(mtface == NULL) {
map_to_sphere( &uv[0][0], &uv[0][1],orco[mf->v1][0], orco[mf->v1][1], orco[mf->v1][2]);
map_to_sphere( &uv[1][0], &uv[1][1],orco[mf->v2][0], orco[mf->v2][1], orco[mf->v2][2]);
map_to_sphere( &uv[2][0], &uv[2][1],orco[mf->v3][0], orco[mf->v3][1], orco[mf->v3][2]);
diff --git a/source/blender/blenkernel/intern/Makefile b/source/blender/blenkernel/intern/Makefile
deleted file mode 100644
index 53a9999758c..00000000000
--- a/source/blender/blenkernel/intern/Makefile
+++ /dev/null
@@ -1,156 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blenkernel
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# OpenGL and Python
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../../../intern/memutil
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-# Reference to the types in makesdna and imbuf
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../ikplugin
-# This mod uses the BLI and BLO module
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../blenfont
-# This is bad level, remove eventually
-CPPFLAGS += -I../../windowmanager
-# also avi is used
-CPPFLAGS += -I../../avi
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# we still refer to /include a bit...
-CPPFLAGS += -I../../editors/include
-
-# to include the render stuff:
-CPPFLAGS += -I../../render/extern/include
-
-# for sound
-#CPPFLAGS += -I../../../kernel/gen_system
-CPPFLAGS += $(NAN_SDLCFLAGS)
-
-CPPFLAGS += -I$(NAN_IKSOLVER)/include
-CPPFLAGS += -I$(NAN_DECIMATION)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-CPPFLAGS += -I$(NAN_OPENNL)/include
-CPPFLAGS += -I$(NAN_BSP)/include
-CPPFLAGS += -I$(NAN_SMOKE)/include
-
-# path to zlib
-CPPFLAGS += -I$(NAN_ZLIB)/include
-
-#path to nodes
-CPPFLAGS += -I../../nodes
-
-#path to gpu
-CPPFLAGS += -I../../gpu
-
-#modifiers got moved
-CPPFLAGS += -I../../modifiers
-
-# path to our own external headerfiles
-CPPFLAGS += -I..
-
-CPPFLAGS += -I$(NAN_FREETYPE)/include
-CPPFLAGS += -I$(NAN_FREETYPE)/include/freetype2
-
-# path to bullet2, for cloth
-ifeq ($(NAN_USE_BULLET), true)
- CPPFLAGS += -I$(NAN_BULLET2)/include
-endif
-
-# lzo and lzma, for pointcache
-ifeq ($(WITH_LZO),true)
- CPPFLAGS += -I$(NAN_LZO)/minilzo
- CPPFLAGS += -DWITH_LZO
-endif
-
-ifeq ($(WITH_LZO),true)
- CPPFLAGS += -I$(NAN_LZMA)
- CPPFLAGS += -DWITH_LZMA
-endif
-
-ifeq ($(WITH_FFMPEG),true)
- CPPFLAGS += -DWITH_FFMPEG
- CPPFLAGS += $(NAN_FFMPEGCFLAGS)
-endif
-
-ifeq ($(WITH_OPENEXR), true)
- CPPFLAGS += -DWITH_OPENEXR
-endif
-
-ifeq ($(WITH_DDS), true)
- CPPFLAGS += -DWITH_DDS
-endif
-
-ifeq ($(WITH_OPENJPEG), true)
- CPPFLAGS += -DWITH_OPENJPEG
-endif
-
-ifeq ($(WITH_QUICKTIME), true)
- CPPFLAGS += -I../../quicktime
- CPPFLAGS += -DWITH_QUICKTIME
-endif
-
-ifeq ($(WITH_TIFF), true)
- CPPFLAGS += -DWITH_TIFF
-endif
-
-ifeq ($(WITH_CINEON), true)
- CPPFLAGS += -DWITH_CINEON
-endif
-
-ifeq ($(WITH_HDR), true)
- CPPFLAGS += -DWITH_HDR
-endif
-
-ifeq ($(OS), darwin)
- ifeq ($(WITH_BF_OPENMP), true)
- CPPFLAGS += -DPARALLEL=1
- endif
-endif
-
-ifeq ($(WITH_LCMS), true)
- CPPFLAGS += -DWITH_LCMS
- CPPFLAGS += -I$(BF_LCMS_INC)
-endif
diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c
index 90a3a6ce664..3bfdbdc4fc9 100644
--- a/source/blender/blenkernel/intern/action.c
+++ b/source/blender/blenkernel/intern/action.c
@@ -39,6 +39,11 @@
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
+#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
+
#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_anim.h"
@@ -48,15 +53,11 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_object.h"
-#include "BKE_utildefines.h"
+
#include "BKE_idprop.h"
#include "BIK_api.h"
-#include "BLI_blenlib.h"
-#include "BLI_ghash.h"
-#include "BLI_math.h"
-
#include "RNA_access.h"
/* *********************** NOTE ON POSE AND ACTION **********************
@@ -96,7 +97,6 @@ void make_local_action(bAction *act)
if (act->id.us==1) {
act->id.lib= 0;
act->id.flag= LIB_LOCAL;
- //make_local_action_channels(act);
new_id(0, (ID *)act, 0);
return;
}
@@ -376,6 +376,20 @@ bActionGroup *action_groups_find_named (bAction *act, const char name[])
return BLI_findstring(&act->groups, name, offsetof(bActionGroup, name));
}
+/* Clear all 'temp' flags on all groups */
+void action_groups_clear_tempflags (bAction *act)
+{
+ bActionGroup *agrp;
+
+ /* sanity checks */
+ if (ELEM(NULL, act, act->groups.first))
+ return;
+
+ /* flag clearing loop */
+ for (agrp = act->groups.first; agrp; agrp = agrp->next)
+ agrp->flag &= ~AGRP_TEMP;
+}
+
/* *************** Pose channels *************** */
/* usually used within a loop, so we got a N^2 slowdown */
@@ -408,9 +422,10 @@ bPoseChannel *verify_pose_channel(bPose *pose, const char *name)
/* If not, create it and add it */
chan = MEM_callocN(sizeof(bPoseChannel), "verifyPoseChannel");
- strncpy(chan->name, name, 31);
+ BLI_strncpy(chan->name, name, sizeof(chan->name));
/* init vars to prevent math errors */
- chan->quat[0] = chan->rotAxis[1]= 1.0f;
+ unit_qt(chan->quat);
+ unit_axis_angle(chan->rotAxis, &chan->rotAngle);
chan->size[0] = chan->size[1] = chan->size[2] = 1.0f;
chan->limitmin[0]= chan->limitmin[1]= chan->limitmin[2]= -180.0f;
@@ -774,7 +789,7 @@ void pose_add_group (Object *ob)
return;
grp= MEM_callocN(sizeof(bActionGroup), "PoseGroup");
- strcpy(grp->name, "Group");
+ BLI_strncpy(grp->name, "Group", sizeof(grp->name));
BLI_addtail(&pose->agroups, grp);
BLI_uniquename(&pose->agroups, grp, "Group", '.', offsetof(bActionGroup, name), sizeof(grp->name));
@@ -1027,7 +1042,6 @@ void extract_pose_from_pose(bPose *pose, const bPose *src)
void rest_pose(bPose *pose)
{
bPoseChannel *pchan;
- int i;
if (!pose)
return;
@@ -1036,16 +1050,12 @@ void rest_pose(bPose *pose)
memset(pose->cyclic_offset, 0, sizeof(pose->cyclic_offset));
for (pchan=pose->chanbase.first; pchan; pchan= pchan->next) {
- for (i=0; i<3; i++) {
- pchan->loc[i]= 0.0f;
- pchan->quat[i+1]= 0.0f;
- pchan->eul[i]= 0.0f;
- pchan->size[i]= 1.0f;
- pchan->rotAxis[i]= 0.0f;
- }
- pchan->quat[0]= pchan->rotAxis[1]= 1.0f;
- pchan->rotAngle= 0.0f;
-
+ zero_v3(pchan->loc);
+ zero_v3(pchan->eul);
+ unit_qt(pchan->quat);
+ unit_axis_angle(pchan->rotAxis, &pchan->rotAngle);
+ pchan->size[0]= pchan->size[1]= pchan->size[2]= 1.0f;
+
pchan->flag &= ~(POSE_LOC|POSE_ROT|POSE_SIZE);
}
}
@@ -1091,7 +1101,7 @@ void copy_pose_result(bPose *to, bPose *from)
/* For the calculation of the effects of an Action at the given frame on an object
* This is currently only used for the Action Constraint
*/
-void what_does_obaction (Scene *scene, Object *ob, Object *workob, bPose *pose, bAction *act, char groupname[], float cframe)
+void what_does_obaction (Scene *UNUSED(scene), Object *ob, Object *workob, bPose *pose, bAction *act, char groupname[], float cframe)
{
bActionGroup *agrp= action_groups_find_named(act, groupname);
@@ -1119,8 +1129,8 @@ void what_does_obaction (Scene *scene, Object *ob, Object *workob, bPose *pose,
workob->pose= pose; /* need to set pose too, since this is used for both types of Action Constraint */
- strcpy(workob->parsubstr, ob->parsubstr);
- strcpy(workob->id.name, "OB<ConstrWorkOb>"); /* we don't use real object name, otherwise RNA screws with the real thing */
+ BLI_strncpy(workob->parsubstr, ob->parsubstr, sizeof(workob->parsubstr));
+ BLI_strncpy(workob->id.name, "OB<ConstrWorkOb>", sizeof(workob->id.name)); /* we don't use real object name, otherwise RNA screws with the real thing */
/* if we're given a group to use, it's likely to be more efficient (though a bit more dangerous) */
if (agrp) {
@@ -1134,10 +1144,9 @@ void what_does_obaction (Scene *scene, Object *ob, Object *workob, bPose *pose,
animsys_evaluate_action_group(&id_ptr, act, agrp, NULL, cframe);
}
else {
- AnimData adt;
+ AnimData adt= {0};
/* init animdata, and attach to workob */
- memset(&adt, 0, sizeof(AnimData));
workob->adt= &adt;
adt.recalc= ADT_RECALC_ANIM;
diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c
index 6da9f2bbabc..ab1da04e683 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -39,6 +39,7 @@
#include "BLI_editVert.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -296,7 +297,7 @@ static void motionpaths_calc_update_scene(Scene *scene)
Base *base, *last=NULL;
/* only stuff that moves or needs display still */
- DAG_scene_update_flags(G.main, scene, scene->lay);
+ DAG_scene_update_flags(G.main, scene, scene->lay, TRUE);
/* find the last object with the tag
* - all those afterwards are assumed to not be relevant for our calculations
@@ -436,6 +437,7 @@ void animviz_calc_motionpaths(Scene *scene, ListBase *targets)
/* free curve path data
* NOTE: frees the path itself!
+ * NOTE: this is increasingly innacurate with non-uniform BevPoint subdivisions [#24633]
*/
void free_path(Path *path)
{
@@ -444,7 +446,7 @@ void free_path(Path *path)
}
/* calculate a curve-deform path for a curve
- * - only called from displist.c -> makeDispListCurveTypes
+ * - only called from displist.c -> do_makeDispListCurveTypes
*/
void calc_curvepath(Object *ob)
{
@@ -507,7 +509,7 @@ void calc_curvepath(Object *ob)
/* the path verts in path->data */
/* now also with TILT value */
- pp= path->data = (PathPoint *)MEM_callocN(sizeof(PathPoint)*4*path->len, "pathdata"); // XXX - why *4? - in 2.4x each element was 4 and the size was 16, so better leave for now - Campbell
+ pp= path->data = (PathPoint *)MEM_callocN(sizeof(PathPoint)*path->len, "pathdata");
bevp= bevpfirst;
bevpn= bevp+1;
@@ -637,7 +639,6 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir, float *quat,
vec[1]= data[0]*p0->vec[1] + data[1]*p1->vec[1] + data[2]*p2->vec[1] + data[3]*p3->vec[1] ; /* Y */
vec[2]= data[0]*p0->vec[2] + data[1]*p1->vec[2] + data[2]*p2->vec[2] + data[3]*p3->vec[2] ; /* Z */
vec[3]= data[0]*p0->vec[3] + data[1]*p1->vec[3] + data[2]*p2->vec[3] + data[3]*p3->vec[3] ; /* Tilt, should not be needed since we have quat still used */
- /* Need to verify the quat interpolation is correct - XXX */
if (quat) {
float totfac, q1[4], q2[4];
@@ -648,7 +649,7 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir, float *quat,
totfac= data[1]+data[2];
if(totfac>FLT_EPSILON) interp_qt_qtqt(q2, p1->quat, p2->quat, data[2] / totfac);
- else QUATCOPY(q1, p3->quat);
+ else QUATCOPY(q2, p3->quat);
totfac = data[0]+data[1]+data[2]+data[3];
if(totfac>FLT_EPSILON) interp_qt_qtqt(quat, q1, q2, (data[1]+data[2]) / totfac);
@@ -796,6 +797,7 @@ static void vertex_dupli__mapFunc(void *userData, int index, float *co, float *n
DupliObject *dob;
vertexDupliData *vdd= userData;
float vec[3], q2[4], mat[3][3], tmat[4][4], obmat[4][4];
+ int origlay;
mul_v3_m4v3(vec, vdd->pmat, co);
sub_v3_v3(vec, vdd->pmat[3]);
@@ -818,7 +820,14 @@ static void vertex_dupli__mapFunc(void *userData, int index, float *co, float *n
copy_m4_m4(tmat, obmat);
mul_m4_m4m3(obmat, tmat, mat);
}
+
+ origlay = vdd->ob->lay;
+
dob= new_dupli_object(vdd->lb, vdd->ob, obmat, vdd->par->lay, index, OB_DUPLIVERTS, vdd->animated);
+
+ /* restore the original layer so that each dupli will have proper dob->origlay */
+ vdd->ob->lay = origlay;
+
if(vdd->orco)
VECCOPY(dob->orco, vdd->orco[index]);
@@ -843,7 +852,8 @@ static void vertex_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, fl
GroupObject * go = NULL;
EditMesh *em;
float vec[3], no[3], pmat[4][4];
- int lay, totvert, a, oblay;
+ int totvert, a, oblay;
+ unsigned int lay;
copy_m4_m4(pmat, par->obmat);
@@ -927,6 +937,14 @@ static void vertex_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, fl
vertex_dupli__mapFunc(&vdd, a, vec, no, NULL);
}
}
+ if(sce) {
+ /* Set proper layer in case of scene looping,
+ * in case of groups the object layer will be
+ * changed when it's duplicated due to the
+ * group duplication.
+ */
+ ob->lay = vdd.par->lay;
+ }
break;
}
@@ -1144,7 +1162,6 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
Object *ob=0, **oblist=0, obcopy, *obcopylist=0;
DupliObject *dob;
ParticleDupliWeight *dw;
- ParticleSimulationData sim = {scene, par, psys, psys_get_modifier(par, psys)};
ParticleSettings *part;
ParticleData *pa;
ChildParticle *cpa=0;
@@ -1153,7 +1170,7 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
float ctime, pa_time, scale = 1.0f;
float tmat[4][4], mat[4][4], pamat[4][4], vec[3], size=0.0;
float (*obmat)[4], (*oldobmat)[4];
- int lay, a, b, counter, hair = 0;
+ int a, b, counter, hair = 0;
int totpart, totchild, totgroup=0, pa_num;
if(psys==0) return;
@@ -1175,9 +1192,13 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
totchild = psys->totchild;
BLI_srandom(31415926 + psys->seed);
-
- lay= scene->lay;
+
if((psys->renderdata || part->draw_as==PART_DRAW_REND) && ELEM(part->ren_as, PART_DRAW_OB, PART_DRAW_GR)) {
+ ParticleSimulationData sim= {0};
+ sim.scene= scene;
+ sim.ob= par;
+ sim.psys= psys;
+ sim.psmd= psys_get_modifier(par, psys);
/* first check for loops (particle system object used as dupli object) */
if(part->ren_as == PART_DRAW_OB) {
@@ -1317,12 +1338,16 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
else {
/* first key */
state.time = ctime;
- if(psys_get_particle_state(&sim, a, &state, 0) == 0)
+ if(psys_get_particle_state(&sim, a, &state, 0) == 0) {
continue;
-
- quat_to_mat4( pamat,state.rot);
- VECCOPY(pamat[3], state.co);
- pamat[3][3]= 1.0f;
+ }
+ else {
+ float tquat[4];
+ normalize_qt_qt(tquat, state.rot);
+ quat_to_mat4(pamat, tquat);
+ copy_v3_v3(pamat[3], state.co);
+ pamat[3][3]= 1.0f;
+ }
}
if(part->ren_as==PART_DRAW_GR && psys->part->draw & PART_DRAW_WHOLE_GR) {
@@ -1350,7 +1375,7 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
/* Normal particles and cached hair live in global space so we need to
* remove the real emitter's transformation before 2nd order duplication.
*/
- if(par_space_mat)
+ if(par_space_mat && GS(id->name) != ID_GR)
mul_m4_m4m4(mat, pamat, psys->imat);
else
copy_m4_m4(mat, pamat);
@@ -1366,7 +1391,7 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
if(part->draw & PART_DRAW_GLOBAL_OB)
VECADD(mat[3], mat[3], vec);
- dob= new_dupli_object(lb, ob, mat, ob->lay, counter, OB_DUPLIPARTS, animated);
+ dob= new_dupli_object(lb, ob, mat, ob->lay, counter, GS(id->name) == ID_GR ? OB_DUPLIGROUP : OB_DUPLIPARTS, animated);
copy_m4_m4(dob->omat, oldobmat);
if(G.rendering)
psys_get_dupli_texture(par, part, sim.psmd, pa, cpa, dob->uv, dob->orco);
@@ -1419,7 +1444,7 @@ static Object *find_family_object(Object **obar, char *family, char ch)
static void font_duplilist(ListBase *lb, Scene *scene, Object *par, int level, int animated)
{
- Object *ob, *obar[256];
+ Object *ob, *obar[256]= {0};
Curve *cu;
struct chartrans *ct, *chartransdata;
float vec[3], obmat[4][4], pmat[4][4], fsize, xof, yof;
@@ -1434,9 +1459,7 @@ static void font_duplilist(ListBase *lb, Scene *scene, Object *par, int level, i
chartransdata= BKE_text_to_curve(scene, par, FO_DUPLI);
if(chartransdata==0) return;
-
- memset(obar, 0, 256*sizeof(void *));
-
+
cu= par->data;
slen= strlen(cu->str);
fsize= cu->fsize;
diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c
index 10c2c1801cb..e46c1179111 100644
--- a/source/blender/blenkernel/intern/anim_sys.c
+++ b/source/blender/blenkernel/intern/anim_sys.c
@@ -37,9 +37,12 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
+#include "DNA_material_types.h"
#include "DNA_scene_types.h"
+#include "DNA_texture_types.h"
#include "BKE_animsys.h"
#include "BKE_action.h"
@@ -47,6 +50,7 @@
#include "BKE_nla.h"
#include "BKE_global.h"
#include "BKE_main.h"
+#include "BKE_library.h"
#include "BKE_utildefines.h"
#include "RNA_access.h"
@@ -70,7 +74,7 @@ short id_type_can_have_animdata (ID *id)
switch (GS(id->name)) {
/* has AnimData */
case ID_OB:
- case ID_ME: case ID_MB: case ID_CU: case ID_AR:
+ case ID_ME: case ID_MB: case ID_CU: case ID_AR: case ID_LT:
case ID_KE:
case ID_PA:
case ID_MA: case ID_TE: case ID_NT:
@@ -175,7 +179,7 @@ void BKE_free_animdata (ID *id)
/* Freeing -------------------------------------------- */
/* Make a copy of the given AnimData - to be used when copying datablocks */
-AnimData *BKE_copy_animdata (AnimData *adt)
+AnimData *BKE_copy_animdata (AnimData *adt, const short do_action)
{
AnimData *dadt;
@@ -185,9 +189,15 @@ AnimData *BKE_copy_animdata (AnimData *adt)
dadt= MEM_dupallocN(adt);
/* make a copy of action - at worst, user has to delete copies... */
- dadt->action= copy_action(adt->action);
- dadt->tmpact= copy_action(adt->tmpact);
-
+ if(do_action) {
+ dadt->action= copy_action(adt->action);
+ dadt->tmpact= copy_action(adt->tmpact);
+ }
+ else {
+ id_us_plus((ID *)dadt->action);
+ id_us_plus((ID *)dadt->tmpact);
+ }
+
/* duplicate NLA data */
copy_nladata(&dadt->nla_tracks, &adt->nla_tracks);
@@ -201,7 +211,7 @@ AnimData *BKE_copy_animdata (AnimData *adt)
return dadt;
}
-int BKE_copy_animdata_id(struct ID *id_to, struct ID *id_from)
+int BKE_copy_animdata_id(struct ID *id_to, struct ID *id_from, const short do_action)
{
AnimData *adt;
@@ -213,13 +223,26 @@ int BKE_copy_animdata_id(struct ID *id_to, struct ID *id_from)
adt = BKE_animdata_from_id(id_from);
if (adt) {
IdAdtTemplate *iat = (IdAdtTemplate *)id_to;
- iat->adt= BKE_copy_animdata(adt);
+ iat->adt= BKE_copy_animdata(adt, do_action);
}
return 1;
}
-
+void BKE_copy_animdata_id_action(struct ID *id)
+{
+ AnimData *adt= BKE_animdata_from_id(id);
+ if(adt) {
+ if(adt->action) {
+ ((ID *)adt->action)->us--;
+ adt->action= copy_action(adt->action);
+ }
+ if(adt->tmpact) {
+ ((ID *)adt->tmpact)->us--;
+ adt->tmpact= copy_action(adt->tmpact);
+ }
+ }
+}
/* Make Local -------------------------------------------- */
@@ -254,6 +277,176 @@ void BKE_animdata_make_local(AnimData *adt)
make_local_strips(&nlt->strips);
}
+/* Sub-ID Regrouping ------------------------------------------- */
+
+/* helper heuristic for determining if a path is compatible with the basepath
+ * < path: (str) full RNA-path from some data (usually an F-Curve) to compare
+ * < basepath: (str) shorter path fragment to look for
+ * > returns (bool) whether there is a match
+ */
+static short animpath_matches_basepath (const char path[], const char basepath[])
+{
+ /* we need start of path to be basepath */
+ return (path && basepath) && (strstr(path, basepath) == path);
+}
+
+/* Move F-Curves in src action to dst action, setting up all the necessary groups
+ * for this to happen, but only if the F-Curves being moved have the appropriate
+ * "base path".
+ * - This is used when data moves from one datablock to another, causing the
+ * F-Curves to need to be moved over too
+ */
+void action_move_fcurves_by_basepath (bAction *srcAct, bAction *dstAct, const char basepath[])
+{
+ FCurve *fcu, *fcn=NULL;
+
+ /* sanity checks */
+ if ELEM3(NULL, srcAct, dstAct, basepath) {
+ if (G.f & G_DEBUG) {
+ printf("ERROR: action_partition_fcurves_by_basepath(%p, %p, %p) has insufficient info to work with\n",
+ srcAct, dstAct, basepath);
+ }
+ return;
+ }
+
+ /* clear 'temp' flags on all groups in src, as we'll be needing them later
+ * to identify groups that we've managed to empty out here
+ */
+ action_groups_clear_tempflags(srcAct);
+
+ /* iterate over all src F-Curves, moving over the ones that need to be moved */
+ for (fcu = srcAct->curves.first; fcu; fcu = fcn) {
+ /* store next pointer in case we move stuff */
+ fcn = fcu->next;
+
+ /* should F-Curve be moved over?
+ * - we only need the start of the path to match basepath
+ */
+ if (animpath_matches_basepath(fcu->rna_path, basepath)) {
+ bActionGroup *agrp = NULL;
+
+ /* if grouped... */
+ if (fcu->grp) {
+ /* make sure there will be a matching group on the other side for the migrants */
+ agrp = action_groups_find_named(dstAct, fcu->grp->name);
+
+ if (agrp == NULL) {
+ /* add a new one with a similar name (usually will be the same though) */
+ agrp = action_groups_add_new(dstAct, fcu->grp->name);
+ }
+
+ /* old groups should be tagged with 'temp' flags so they can be removed later
+ * if we remove everything from them
+ */
+ fcu->grp->flag |= AGRP_TEMP;
+ }
+
+ /* perform the migration now */
+ action_groups_remove_channel(srcAct, fcu);
+
+ if (agrp)
+ action_groups_add_channel(dstAct, agrp, fcu);
+ else
+ BLI_addtail(&dstAct->curves, fcu);
+ }
+ }
+
+ /* cleanup groups (if present) */
+ if (srcAct->groups.first) {
+ bActionGroup *agrp, *grp=NULL;
+
+ for (agrp = srcAct->groups.first; agrp; agrp = grp) {
+ grp = agrp->next;
+
+ /* only tagged groups need to be considered - clearing these tags or removing them */
+ if (agrp->flag & AGRP_TEMP) {
+ /* if group is empty and tagged, then we can remove as this operation
+ * moved out all the channels that were formerly here
+ */
+ if (agrp->channels.first == NULL)
+ BLI_freelinkN(&srcAct->groups, agrp);
+ else
+ agrp->flag &= ~AGRP_TEMP;
+ }
+ }
+ }
+}
+
+/* Transfer the animation data from srcID to dstID where the srcID
+ * animation data is based off "basepath", creating new AnimData and
+ * associated data as necessary
+ */
+void BKE_animdata_separate_by_basepath (ID *srcID, ID *dstID, ListBase *basepaths)
+{
+ AnimData *srcAdt=NULL, *dstAdt=NULL;
+ LinkData *ld;
+
+ /* sanity checks */
+ if ELEM(NULL, srcID, dstID) {
+ if (G.f & G_DEBUG)
+ printf("ERROR: no source or destination ID to separate AnimData with\n");
+ return;
+ }
+
+ /* get animdata from src, and create for destination (if needed) */
+ srcAdt = BKE_animdata_from_id(srcID);
+ dstAdt = BKE_id_add_animdata(dstID);
+
+ if ELEM(NULL, srcAdt, dstAdt) {
+ if (G.f & G_DEBUG)
+ printf("ERROR: no AnimData for this pair of ID's\n");
+ return;
+ }
+
+ /* active action */
+ if (srcAdt->action) {
+ /* set up an action if necessary, and name it in a similar way so that it can be easily found again */
+ if (dstAdt->action == NULL) {
+ dstAdt->action = add_empty_action(srcAdt->action->id.name+2);
+ }
+ else if (dstAdt->action == srcAdt->action) {
+ printf("Argh! Source and Destination share animation! ('%s' and '%s' both use '%s') Making new empty action\n",
+ srcID->name, dstID->name, srcAdt->action->id.name);
+
+ // TODO: review this...
+ id_us_min(&dstAdt->action->id);
+ dstAdt->action = add_empty_action(dstAdt->action->id.name+2);
+ }
+
+ /* loop over base paths, trying to fix for each one... */
+ for (ld = basepaths->first; ld; ld = ld->next) {
+ const char *basepath = (const char *)ld->data;
+ action_move_fcurves_by_basepath(srcAdt->action, dstAdt->action, basepath);
+ }
+ }
+
+ /* drivers */
+ if (srcAdt->drivers.first) {
+ FCurve *fcu, *fcn=NULL;
+
+ /* check each driver against all the base paths to see if any should go */
+ for (fcu = srcAdt->drivers.first; fcu; fcu = fcn) {
+ fcn = fcu->next;
+
+ /* try each basepath in turn, but stop on the first one which works */
+ for (ld = basepaths->first; ld; ld = ld->next) {
+ const char *basepath = (const char *)ld->data;
+
+ if (animpath_matches_basepath(fcu->rna_path, basepath)) {
+ /* just need to change lists */
+ BLI_remlink(&srcAdt->drivers, fcu);
+ BLI_addtail(&dstAdt->drivers, fcu);
+
+ // TODO: add depsgraph flushing calls?
+
+ /* can stop now, as moved already */
+ break;
+ }
+ }
+ }
+ }
+}
+
/* Path Validation -------------------------------------------- */
/* Check if a given RNA Path is valid, by tracing it from the given ID, and seeing if we can resolve it */
@@ -272,7 +465,7 @@ static short check_rna_path_is_valid (ID *owner_id, char *path)
/* Check if some given RNA Path needs fixing - free the given path and set a new one as appropriate
* NOTE: we assume that oldName and newName have [" "] padding around them
*/
-static char *rna_path_rename_fix (ID *owner_id, char *prefix, char *oldName, char *newName, char *oldpath, int verify_paths)
+static char *rna_path_rename_fix (ID *owner_id, const char *prefix, char *oldName, char *newName, char *oldpath, int verify_paths)
{
char *prefixPtr= strstr(oldpath, prefix);
char *oldNamePtr= strstr(oldpath, oldName);
@@ -330,7 +523,7 @@ static char *rna_path_rename_fix (ID *owner_id, char *prefix, char *oldName, cha
}
/* Check RNA-Paths for a list of F-Curves */
-static void fcurves_path_rename_fix (ID *owner_id, char *prefix, char *oldName, char *newName, ListBase *curves, int verify_paths)
+static void fcurves_path_rename_fix (ID *owner_id, const char *prefix, char *oldName, char *newName, ListBase *curves, int verify_paths)
{
FCurve *fcu;
@@ -343,7 +536,7 @@ static void fcurves_path_rename_fix (ID *owner_id, char *prefix, char *oldName,
}
/* Check RNA-Paths for a list of Drivers */
-static void drivers_path_rename_fix (ID *owner_id, char *prefix, char *oldName, char *newName, char *oldKey, char *newKey, ListBase *curves, int verify_paths)
+static void drivers_path_rename_fix (ID *owner_id, const char *prefix, char *oldName, char *newName, char *oldKey, char *newKey, ListBase *curves, int verify_paths)
{
FCurve *fcu;
@@ -383,7 +576,7 @@ static void drivers_path_rename_fix (ID *owner_id, char *prefix, char *oldName,
}
/* Fix all RNA-Paths for Actions linked to NLA Strips */
-static void nlastrips_path_rename_fix (ID *owner_id, char *prefix, char *oldName, char *newName, ListBase *strips, int verify_paths)
+static void nlastrips_path_rename_fix (ID *owner_id, const char *prefix, char *oldName, char *newName, ListBase *strips, int verify_paths)
{
NlaStrip *strip;
@@ -403,7 +596,7 @@ static void nlastrips_path_rename_fix (ID *owner_id, char *prefix, char *oldName
* NOTE: it is assumed that the structure we're replacing is <prefix><["><name><"]>
* i.e. pose.bones["Bone"]
*/
-void BKE_animdata_fix_paths_rename (ID *owner_id, AnimData *adt, char *prefix, char *oldName, char *newName, int oldSubscript, int newSubscript, int verify_paths)
+void BKE_animdata_fix_paths_rename (ID *owner_id, AnimData *adt, const char *prefix, char *oldName, char *newName, int oldSubscript, int newSubscript, int verify_paths)
{
NlaTrack *nlt;
char *oldN, *newN;
@@ -443,44 +636,73 @@ void BKE_animdata_fix_paths_rename (ID *owner_id, AnimData *adt, char *prefix, c
/* Whole Database Ops -------------------------------------------- */
/* apply the given callback function on all data in main database */
-void BKE_animdata_main_cb (Main *main, ID_AnimData_Edit_Callback func, void *user_data)
+void BKE_animdata_main_cb (Main *mainptr, ID_AnimData_Edit_Callback func, void *user_data)
{
ID *id;
+ /* standard data version */
#define ANIMDATA_IDS_CB(first) \
for (id= first; id; id= id->next) { \
AnimData *adt= BKE_animdata_from_id(id); \
if (adt) func(id, adt, user_data); \
}
-
- ANIMDATA_IDS_CB(main->nodetree.first); /* nodes */
- ANIMDATA_IDS_CB(main->tex.first); /* textures */
- ANIMDATA_IDS_CB(main->lamp.first); /* lamps */
- ANIMDATA_IDS_CB(main->mat.first); /* materials */
- ANIMDATA_IDS_CB(main->camera.first); /* cameras */
- ANIMDATA_IDS_CB(main->key.first); /* shapekeys */
- ANIMDATA_IDS_CB(main->mball.first); /* metaballs */
- ANIMDATA_IDS_CB(main->curve.first); /* curves */
- ANIMDATA_IDS_CB(main->armature.first); /* armatures */
- ANIMDATA_IDS_CB(main->mesh.first); /* meshes */
- ANIMDATA_IDS_CB(main->particle.first); /* particles */
- ANIMDATA_IDS_CB(main->object.first); /* objects */
- ANIMDATA_IDS_CB(main->world.first); /* worlds */
-
- /* scenes */
- for (id= main->scene.first; id; id= id->next) {
- AnimData *adt= BKE_animdata_from_id(id);
- Scene *scene= (Scene *)id;
-
- /* do compositing nodes first (since these aren't included in main tree) */
- if (scene->nodetree) {
- AnimData *adt2= BKE_animdata_from_id((ID *)scene->nodetree);
- if (adt2) func(id, adt2, user_data);
- }
-
- /* now fix scene animation data as per normal */
- if (adt) func((ID *)id, adt, user_data);
+
+ /* "embedded" nodetree cases (i.e. scene/material/texture->nodetree) */
+#define ANIMDATA_NODETREE_IDS_CB(first, NtId_Type) \
+ for (id= first; id; id= id->next) { \
+ AnimData *adt= BKE_animdata_from_id(id); \
+ NtId_Type *ntp= (NtId_Type *)id; \
+ if (ntp->nodetree) { \
+ AnimData *adt2= BKE_animdata_from_id((ID *)ntp); \
+ if (adt2) func(id, adt2, user_data); \
+ } \
+ if (adt) func(id, adt, user_data); \
}
+
+ /* nodes */
+ ANIMDATA_IDS_CB(mainptr->nodetree.first);
+
+ /* textures */
+ ANIMDATA_NODETREE_IDS_CB(mainptr->tex.first, Tex);
+
+ /* lamps */
+ ANIMDATA_IDS_CB(mainptr->lamp.first);
+
+ /* materials */
+ ANIMDATA_NODETREE_IDS_CB(mainptr->mat.first, Material);
+
+ /* cameras */
+ ANIMDATA_IDS_CB(mainptr->camera.first);
+
+ /* shapekeys */
+ ANIMDATA_IDS_CB(mainptr->key.first);
+
+ /* metaballs */
+ ANIMDATA_IDS_CB(mainptr->mball.first);
+
+ /* curves */
+ ANIMDATA_IDS_CB(mainptr->curve.first);
+
+ /* armatures */
+ ANIMDATA_IDS_CB(mainptr->armature.first);
+
+ /* lattices */
+ ANIMDATA_IDS_CB(mainptr->latt.first);
+
+ /* meshes */
+ ANIMDATA_IDS_CB(mainptr->mesh.first);
+
+ /* particles */
+ ANIMDATA_IDS_CB(mainptr->particle.first);
+
+ /* objects */
+ ANIMDATA_IDS_CB(mainptr->object.first);
+
+ /* worlds */
+ ANIMDATA_IDS_CB(mainptr->world.first);
+
+ /* scenes */
+ ANIMDATA_NODETREE_IDS_CB(mainptr->scene.first, Scene);
}
/* Fix all RNA-Paths throughout the database (directly access the Global.main version)
@@ -503,17 +725,29 @@ void BKE_all_animdata_fix_paths_rename (char *prefix, char *oldName, char *newNa
BKE_animdata_fix_paths_rename(id, adt, prefix, oldName, newName, 0, 0, 1);\
}
+ /* another version of this macro for nodetrees */
+#define RENAMEFIX_ANIM_NODETREE_IDS(first, NtId_Type) \
+ for (id= first; id; id= id->next) { \
+ AnimData *adt= BKE_animdata_from_id(id); \
+ NtId_Type *ntp= (NtId_Type *)id; \
+ if (ntp->nodetree) { \
+ AnimData *adt2= BKE_animdata_from_id((ID *)ntp); \
+ BKE_animdata_fix_paths_rename((ID *)ntp, adt2, prefix, oldName, newName, 0, 0, 1);\
+ } \
+ BKE_animdata_fix_paths_rename(id, adt, prefix, oldName, newName, 0, 0, 1);\
+ }
+
/* nodes */
RENAMEFIX_ANIM_IDS(mainptr->nodetree.first);
/* textures */
- RENAMEFIX_ANIM_IDS(mainptr->tex.first);
+ RENAMEFIX_ANIM_NODETREE_IDS(mainptr->tex.first, Tex);
/* lamps */
RENAMEFIX_ANIM_IDS(mainptr->lamp.first);
/* materials */
- RENAMEFIX_ANIM_IDS(mainptr->mat.first);
+ RENAMEFIX_ANIM_NODETREE_IDS(mainptr->mat.first, Material);
/* cameras */
RENAMEFIX_ANIM_IDS(mainptr->camera.first);
@@ -530,8 +764,11 @@ void BKE_all_animdata_fix_paths_rename (char *prefix, char *oldName, char *newNa
/* armatures */
RENAMEFIX_ANIM_IDS(mainptr->armature.first);
+ /* lattices */
+ RENAMEFIX_ANIM_IDS(mainptr->latt.first);
+
/* meshes */
- // TODO...
+ RENAMEFIX_ANIM_IDS(mainptr->mesh.first);
/* particles */
RENAMEFIX_ANIM_IDS(mainptr->particle.first);
@@ -543,19 +780,7 @@ void BKE_all_animdata_fix_paths_rename (char *prefix, char *oldName, char *newNa
RENAMEFIX_ANIM_IDS(mainptr->world.first);
/* scenes */
- for (id= mainptr->scene.first; id; id= id->next) {
- AnimData *adt= BKE_animdata_from_id(id);
- Scene *scene= (Scene *)id;
-
- /* do compositing nodes first (since these aren't included in main tree) */
- if (scene->nodetree) {
- AnimData *adt2= BKE_animdata_from_id((ID *)scene->nodetree);
- BKE_animdata_fix_paths_rename((ID *)scene->nodetree, adt2, prefix, oldName, newName, 0, 0, 1);
- }
-
- /* now fix scene animation data as per normal */
- BKE_animdata_fix_paths_rename((ID *)id, adt, prefix, oldName, newName, 0, 0, 1);
- }
+ RENAMEFIX_ANIM_NODETREE_IDS(mainptr->scene.first, Scene);
}
/* *********************************** */
@@ -565,7 +790,7 @@ void BKE_all_animdata_fix_paths_rename (char *prefix, char *oldName, char *newNa
/* Find the first path that matches the given criteria */
// TODO: do we want some method to perform partial matches too?
-KS_Path *BKE_keyingset_find_path (KeyingSet *ks, ID *id, const char group_name[], const char rna_path[], int array_index, int group_mode)
+KS_Path *BKE_keyingset_find_path (KeyingSet *ks, ID *id, const char group_name[], const char rna_path[], int array_index, int UNUSED(group_mode))
{
KS_Path *ksp;
@@ -614,12 +839,9 @@ KeyingSet *BKE_keyingset_add (ListBase *list, const char name[], short flag, sho
/* allocate new KeyingSet */
ks= MEM_callocN(sizeof(KeyingSet), "KeyingSet");
-
- if (name)
- strncpy(ks->name, name, sizeof(ks->name));
- else
- strcpy(ks->name, "KeyingSet");
-
+
+ BLI_strncpy(ks->name, name ? name : "KeyingSet", sizeof(ks->name));
+
ks->flag= flag;
ks->keyingflag= keyingflag;
@@ -665,9 +887,9 @@ KS_Path *BKE_keyingset_add_path (KeyingSet *ks, ID *id, const char group_name[],
/* just store absolute info */
ksp->id= id;
if (group_name)
- BLI_snprintf(ksp->group, 64, group_name);
+ BLI_strncpy(ksp->group, group_name, sizeof(ksp->group));
else
- strcpy(ksp->group, "");
+ ksp->group[0]= '\0';
/* store additional info for relative paths (just in case user makes the set relative) */
if (id)
@@ -695,10 +917,11 @@ void BKE_keyingset_free_path (KeyingSet *ks, KS_Path *ksp)
/* sanity check */
if ELEM(NULL, ks, ksp)
return;
-
+
/* free RNA-path info */
- MEM_freeN(ksp->rna_path);
-
+ if(ksp->rna_path)
+ MEM_freeN(ksp->rna_path);
+
/* free path itself */
BLI_freelinkN(&ks->paths, ksp);
}
@@ -767,7 +990,7 @@ void BKE_keyingsets_free (ListBase *list)
* - path: original path string (as stored in F-Curve data)
* - dst: destination string to write data to
*/
-static short animsys_remap_path (AnimMapper *remap, char *path, char **dst)
+static short animsys_remap_path (AnimMapper *UNUSED(remap), char *path, char **dst)
{
/* is there a valid remapping table to use? */
//if (remap) {
@@ -1591,9 +1814,6 @@ void nladata_flush_channels (ListBase *channels)
*/
static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime)
{
- ListBase dummy_trackslist = {NULL, NULL};
- NlaStrip dummy_strip;
-
NlaTrack *nlt;
short track_index=0;
short has_strips = 0;
@@ -1607,7 +1827,7 @@ static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime)
/* 1. get the stack of strips to evaluate at current time (influence calculated here) */
for (nlt=adt->nla_tracks.first; nlt; nlt=nlt->next, track_index++) {
- /* if tweaking is on and this strip is the tweaking track, stop on this one */
+ /* stop here if tweaking is on and this strip is the tweaking track (it will be the first one that's 'disabled')... */
if ((adt->flag & ADT_NLA_EDIT_ON) && (nlt->flag & NLATRACK_DISABLED))
break;
@@ -1634,22 +1854,32 @@ static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime)
*/
if ((adt->action) && !(adt->flag & ADT_NLA_SOLO_TRACK)) {
/* if there are strips, evaluate action as per NLA rules */
- if (has_strips) {
+ if ((has_strips) || (adt->actstrip)) {
/* make dummy NLA strip, and add that to the stack */
- memset(&dummy_strip, 0, sizeof(NlaStrip));
- dummy_trackslist.first= dummy_trackslist.last= &dummy_strip;
-
- dummy_strip.act= adt->action;
- dummy_strip.remap= adt->remap;
+ NlaStrip dummy_strip= {0};
+ ListBase dummy_trackslist;
- /* action range is calculated taking F-Modifiers into account (which making new strips doesn't do due to the troublesome nature of that) */
- calc_action_range(dummy_strip.act, &dummy_strip.actstart, &dummy_strip.actend, 1);
- dummy_strip.start = dummy_strip.actstart;
- dummy_strip.end = (IS_EQ(dummy_strip.actstart, dummy_strip.actend)) ? (dummy_strip.actstart + 1.0f): (dummy_strip.actend);
+ dummy_trackslist.first= dummy_trackslist.last= &dummy_strip;
- dummy_strip.blendmode= adt->act_blendmode;
- dummy_strip.extendmode= adt->act_extendmode;
- dummy_strip.influence= adt->act_influence;
+ if ((nlt) && !(adt->flag & ADT_NLA_EDIT_NOMAP)) {
+ /* edit active action in-place according to its active strip, so copy the data */
+ memcpy(&dummy_strip, adt->actstrip, sizeof(NlaStrip));
+ dummy_strip.next = dummy_strip.prev = NULL;
+ }
+ else {
+ /* set settings of dummy NLA strip from AnimData settings */
+ dummy_strip.act= adt->action;
+ dummy_strip.remap= adt->remap;
+
+ /* action range is calculated taking F-Modifiers into account (which making new strips doesn't do due to the troublesome nature of that) */
+ calc_action_range(dummy_strip.act, &dummy_strip.actstart, &dummy_strip.actend, 1);
+ dummy_strip.start = dummy_strip.actstart;
+ dummy_strip.end = (IS_EQ(dummy_strip.actstart, dummy_strip.actend)) ? (dummy_strip.actstart + 1.0f): (dummy_strip.actend);
+
+ dummy_strip.blendmode= adt->act_blendmode;
+ dummy_strip.extendmode= adt->act_extendmode;
+ dummy_strip.influence= adt->act_influence;
+ }
/* add this to our list of evaluation strips */
nlastrips_ctime_get_strip(&estrips, &dummy_trackslist, -1, ctime);
@@ -1685,7 +1915,7 @@ static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime)
/* Clear all overides */
/* Add or get existing Override for given setting */
-AnimOverride *BKE_animsys_validate_override (PointerRNA *ptr, char *path, int array_index)
+AnimOverride *BKE_animsys_validate_override (PointerRNA *UNUSED(ptr), char *UNUSED(path), int UNUSED(array_index))
{
// FIXME: need to define how to get overrides
return NULL;
@@ -1694,7 +1924,7 @@ AnimOverride *BKE_animsys_validate_override (PointerRNA *ptr, char *path, int ar
/* -------------------- */
/* Evaluate Overrides */
-static void animsys_evaluate_overrides (PointerRNA *ptr, AnimData *adt, float ctime)
+static void animsys_evaluate_overrides (PointerRNA *ptr, AnimData *adt)
{
AnimOverride *aor;
@@ -1793,7 +2023,7 @@ void BKE_animsys_evaluate_animdata (ID *id, AnimData *adt, float ctime, short re
* - Overrides are cleared upon frame change and/or keyframing
* - It is best that we execute this everytime, so that no errors are likely to occur.
*/
- animsys_evaluate_overrides(&id_ptr, adt, ctime);
+ animsys_evaluate_overrides(&id_ptr, adt);
/* clear recalc flag now */
adt->recalc= 0;
@@ -1813,7 +2043,7 @@ void BKE_animsys_evaluate_all_animation (Main *main, float ctime)
if (G.f & G_DEBUG)
printf("Evaluate all animation - %f \n", ctime);
- /* macro for less typing
+ /* macros for less typing
* - only evaluate animation data for id if it has users (and not just fake ones)
* - whether animdata exists is checked for by the evaluation function, though taking
* this outside of the function may make things slightly faster?
@@ -1825,6 +2055,24 @@ void BKE_animsys_evaluate_all_animation (Main *main, float ctime)
BKE_animsys_evaluate_animdata(id, adt, ctime, aflag); \
} \
}
+ /* another macro for the "embedded" nodetree cases
+ * - this is like EVAL_ANIM_IDS, but this handles the case "embedded nodetrees"
+ * (i.e. scene/material/texture->nodetree) which we need a special exception
+ * for, otherwise they'd get skipped
+ * - ntp = "node tree parent" = datablock where node tree stuff resides
+ */
+#define EVAL_ANIM_NODETREE_IDS(first, NtId_Type, aflag) \
+ for (id= first; id; id= id->next) { \
+ if (ID_REAL_USERS(id) > 0) { \
+ AnimData *adt= BKE_animdata_from_id(id); \
+ NtId_Type *ntp= (NtId_Type *)id; \
+ if (ntp->nodetree) { \
+ AnimData *adt2= BKE_animdata_from_id((ID *)ntp->nodetree); \
+ BKE_animsys_evaluate_animdata((ID *)ntp->nodetree, adt2, ctime, ADT_RECALC_ANIM); \
+ } \
+ BKE_animsys_evaluate_animdata(id, adt, ctime, aflag); \
+ } \
+ }
/* optimisation:
* when there are no actions, don't go over database and loop over heaps of datablocks,
@@ -1845,45 +2093,32 @@ void BKE_animsys_evaluate_all_animation (Main *main, float ctime)
EVAL_ANIM_IDS(main->nodetree.first, ADT_RECALC_ANIM);
/* textures */
- EVAL_ANIM_IDS(main->tex.first, ADT_RECALC_ANIM);
+ EVAL_ANIM_NODETREE_IDS(main->tex.first, Tex, ADT_RECALC_ANIM);
/* lamps */
EVAL_ANIM_IDS(main->lamp.first, ADT_RECALC_ANIM);
/* materials */
- EVAL_ANIM_IDS(main->mat.first, ADT_RECALC_ANIM);
+ EVAL_ANIM_NODETREE_IDS(main->mat.first, Material, ADT_RECALC_ANIM);
/* cameras */
EVAL_ANIM_IDS(main->camera.first, ADT_RECALC_ANIM);
/* shapekeys */
- // TODO: we probably need the same hack as for curves (ctime-hack)
EVAL_ANIM_IDS(main->key.first, ADT_RECALC_ANIM);
/* metaballs */
EVAL_ANIM_IDS(main->mball.first, ADT_RECALC_ANIM);
/* curves */
- /* we need to perform a special hack here to ensure that the ctime
- * value of the curve gets set in case there's no animation for that
- * - it needs to be set before animation is evaluated just so that
- * animation can successfully override...
- * - it shouldn't get set when calculating drivers...
- */
- for (id= main->curve.first; id; id= id->next) {
- AnimData *adt= BKE_animdata_from_id(id);
- Curve *cu= (Curve *)id;
-
- /* set ctime variable for curve */
- cu->ctime= ctime;
-
- /* now execute animation data on top of this as per normal */
- BKE_animsys_evaluate_animdata(id, adt, ctime, ADT_RECALC_ANIM);
- }
+ EVAL_ANIM_IDS(main->curve.first, ADT_RECALC_ANIM);
/* armatures */
EVAL_ANIM_IDS(main->armature.first, ADT_RECALC_ANIM);
+ /* lattices */
+ EVAL_ANIM_IDS(main->latt.first, ADT_RECALC_ANIM);
+
/* meshes */
EVAL_ANIM_IDS(main->mesh.first, ADT_RECALC_ANIM);
@@ -1901,19 +2136,7 @@ void BKE_animsys_evaluate_all_animation (Main *main, float ctime)
EVAL_ANIM_IDS(main->world.first, ADT_RECALC_ANIM);
/* scenes */
- for (id= main->scene.first; id; id= id->next) {
- AnimData *adt= BKE_animdata_from_id(id);
- Scene *scene= (Scene *)id;
-
- /* do compositing nodes first (since these aren't included in main tree) */
- if (scene->nodetree) {
- AnimData *adt2= BKE_animdata_from_id((ID *)scene->nodetree);
- BKE_animsys_evaluate_animdata((ID *)scene->nodetree, adt2, ctime, ADT_RECALC_ANIM);
- }
-
- /* now execute scene animation data as per normal */
- BKE_animsys_evaluate_animdata(id, adt, ctime, ADT_RECALC_ANIM);
- }
+ EVAL_ANIM_NODETREE_IDS(main->scene.first, Scene, ADT_RECALC_ANIM);
}
/* ***************************************** */
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 2e760f53155..14c4b6f97ab 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -36,6 +36,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -63,13 +64,13 @@
#include "BKE_lattice.h"
#include "BKE_main.h"
#include "BKE_object.h"
-#include "BKE_utildefines.h"
+
#include "BIK_api.h"
#include "BKE_sketch.h"
/* **************** Generic Functions, data level *************** */
-bArmature *add_armature(char *name)
+bArmature *add_armature(const char *name)
{
bArmature *arm;
@@ -252,7 +253,7 @@ Bone *get_named_bone (bArmature *arm, const char *name)
* axis: the axis to name on
* head/tail: the head/tail co-ordinate of the bone on the specified axis
*/
-int bone_autoside_name (char *name, int strip_number, short axis, float head, float tail)
+int bone_autoside_name (char *name, int UNUSED(strip_number), short axis, float head, float tail)
{
unsigned int len;
char basename[32]={""};
@@ -260,7 +261,7 @@ int bone_autoside_name (char *name, int strip_number, short axis, float head, fl
len= strlen(name);
if (len == 0) return 0;
- strcpy(basename, name);
+ BLI_strncpy(basename, name, sizeof(basename));
/* Figure out extension to append:
* - The extension to append is based upon the axis that we are working on.
@@ -577,23 +578,29 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan, int rest)
/* ************ Armature Deform ******************* */
-static void pchan_b_bone_defmats(bPoseChannel *pchan, int use_quaternion)
+typedef struct bPoseChanDeform {
+ Mat4 *b_bone_mats;
+ DualQuat *dual_quat;
+ DualQuat *b_bone_dual_quats;
+} bPoseChanDeform;
+
+static void pchan_b_bone_defmats(bPoseChannel *pchan, bPoseChanDeform *pdef_info, int use_quaternion)
{
Bone *bone= pchan->bone;
Mat4 *b_bone= b_bone_spline_setup(pchan, 0);
Mat4 *b_bone_rest= b_bone_spline_setup(pchan, 1);
Mat4 *b_bone_mats;
DualQuat *b_bone_dual_quats= NULL;
- float tmat[4][4];
+ float tmat[4][4]= MAT4_UNITY;
int a;
/* allocate b_bone matrices and dual quats */
b_bone_mats= MEM_mallocN((1+bone->segments)*sizeof(Mat4), "BBone defmats");
- pchan->b_bone_mats= b_bone_mats;
+ pdef_info->b_bone_mats= b_bone_mats;
if(use_quaternion) {
b_bone_dual_quats= MEM_mallocN((bone->segments)*sizeof(DualQuat), "BBone dqs");
- pchan->b_bone_dual_quats= b_bone_dual_quats;
+ pdef_info->b_bone_dual_quats= b_bone_dual_quats;
}
/* first matrix is the inverse arm_mat, to bring points in local bone space
@@ -605,7 +612,6 @@ static void pchan_b_bone_defmats(bPoseChannel *pchan, int use_quaternion)
- translate over the curve to the bbone mat space
- transform with b_bone matrix
- transform back into global space */
- unit_m4(tmat);
for(a=0; a<bone->segments; a++) {
invert_m4_m4(tmat, b_bone_rest[a].mat);
@@ -618,9 +624,9 @@ static void pchan_b_bone_defmats(bPoseChannel *pchan, int use_quaternion)
}
}
-static void b_bone_deform(bPoseChannel *pchan, Bone *bone, float *co, DualQuat *dq, float defmat[][3])
+static void b_bone_deform(bPoseChanDeform *pdef_info, Bone *bone, float *co, DualQuat *dq, float defmat[][3])
{
- Mat4 *b_bone= pchan->b_bone_mats;
+ Mat4 *b_bone= pdef_info->b_bone_mats;
float (*mat)[4]= b_bone[0].mat;
float segment, y;
int a;
@@ -637,7 +643,7 @@ static void b_bone_deform(bPoseChannel *pchan, Bone *bone, float *co, DualQuat *
CLAMP(a, 0, bone->segments-1);
if(dq) {
- copy_dq_dq(dq, &((DualQuat*)pchan->b_bone_dual_quats)[a]);
+ copy_dq_dq(dq, &(pdef_info->b_bone_dual_quats)[a]);
}
else {
mul_m4_v3(b_bone[a+1].mat, co);
@@ -711,7 +717,7 @@ static void pchan_deform_mat_add(bPoseChannel *pchan, float weight, float bbonem
add_m3_m3m3(mat, mat, wmat);
}
-static float dist_bone_deform(bPoseChannel *pchan, float *vec, DualQuat *dq, float mat[][3], float *co)
+static float dist_bone_deform(bPoseChannel *pchan, bPoseChanDeform *pdef_info, float *vec, DualQuat *dq, float mat[][3], float *co)
{
Bone *bone= pchan->bone;
float fac, contrib=0.0;
@@ -732,7 +738,7 @@ static float dist_bone_deform(bPoseChannel *pchan, float *vec, DualQuat *dq, flo
if(vec) {
if(bone->segments>1)
// applies on cop and bbonemat
- b_bone_deform(pchan, bone, cop, NULL, (mat)?bbonemat:NULL);
+ b_bone_deform(pdef_info, bone, cop, NULL, (mat)?bbonemat:NULL);
else
mul_m4_v3(pchan->chan_mat, cop);
@@ -745,11 +751,11 @@ static float dist_bone_deform(bPoseChannel *pchan, float *vec, DualQuat *dq, flo
}
else {
if(bone->segments>1) {
- b_bone_deform(pchan, bone, cop, &bbonedq, NULL);
+ b_bone_deform(pdef_info, bone, cop, &bbonedq, NULL);
add_weighted_dq_dq(dq, &bbonedq, fac);
}
else
- add_weighted_dq_dq(dq, pchan->dual_quat, fac);
+ add_weighted_dq_dq(dq, pdef_info->dual_quat, fac);
}
}
}
@@ -757,7 +763,7 @@ static float dist_bone_deform(bPoseChannel *pchan, float *vec, DualQuat *dq, flo
return contrib;
}
-static void pchan_bone_deform(bPoseChannel *pchan, float weight, float *vec, DualQuat *dq, float mat[][3], float *co, float *contrib)
+static void pchan_bone_deform(bPoseChannel *pchan, bPoseChanDeform *pdef_info, float weight, float *vec, DualQuat *dq, float mat[][3], float *co, float *contrib)
{
float cop[3], bbonemat[3][3];
DualQuat bbonedq;
@@ -770,7 +776,7 @@ static void pchan_bone_deform(bPoseChannel *pchan, float weight, float *vec, Dua
if(vec) {
if(pchan->bone->segments>1)
// applies on cop and bbonemat
- b_bone_deform(pchan, pchan->bone, cop, NULL, (mat)?bbonemat:NULL);
+ b_bone_deform(pdef_info, pchan->bone, cop, NULL, (mat)?bbonemat:NULL);
else
mul_m4_v3(pchan->chan_mat, cop);
@@ -783,11 +789,11 @@ static void pchan_bone_deform(bPoseChannel *pchan, float weight, float *vec, Dua
}
else {
if(pchan->bone->segments>1) {
- b_bone_deform(pchan, pchan->bone, cop, &bbonedq, NULL);
+ b_bone_deform(pdef_info, pchan->bone, cop, &bbonedq, NULL);
add_weighted_dq_dq(dq, &bbonedq, weight);
}
else
- add_weighted_dq_dq(dq, pchan->dual_quat, weight);
+ add_weighted_dq_dq(dq, pdef_info->dual_quat, weight);
}
(*contrib)+=weight;
@@ -798,15 +804,18 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
int numVerts, int deformflag,
float (*prevCos)[3], const char *defgrp_name)
{
+ bPoseChanDeform *pdef_info_array;
+ bPoseChanDeform *pdef_info= NULL;
bArmature *arm= armOb->data;
bPoseChannel *pchan, **defnrToPC = NULL;
+ int *defnrToPCIndex= NULL;
MDeformVert *dverts = NULL;
bDeformGroup *dg;
DualQuat *dualquats= NULL;
float obinv[4][4], premat[4][4], postmat[4][4];
- int use_envelope = deformflag & ARM_DEF_ENVELOPE;
- int use_quaternion = deformflag & ARM_DEF_QUATERNION;
- int invert_vgroup= deformflag & ARM_DEF_INVERT_VGROUP;
+ const short use_envelope = deformflag & ARM_DEF_ENVELOPE;
+ const short use_quaternion = deformflag & ARM_DEF_QUATERNION;
+ const short invert_vgroup= deformflag & ARM_DEF_INVERT_VGROUP;
int numGroups = 0; /* safety for vertexgroup index overflow */
int i, target_totvert = 0; /* safety for vertexgroup overflow */
int use_dverts = 0;
@@ -823,20 +832,24 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
/* bone defmats are already in the channels, chan_mat */
/* initialize B_bone matrices and dual quaternions */
+ totchan= BLI_countlist(&armOb->pose->chanbase);
+
if(use_quaternion) {
- totchan= BLI_countlist(&armOb->pose->chanbase);
dualquats= MEM_callocN(sizeof(DualQuat)*totchan, "dualquats");
}
+
+ pdef_info_array= MEM_callocN(sizeof(bPoseChanDeform)*totchan, "bPoseChanDeform");
totchan= 0;
- for(pchan = armOb->pose->chanbase.first; pchan; pchan = pchan->next) {
+ pdef_info= pdef_info_array;
+ for(pchan= armOb->pose->chanbase.first; pchan; pchan= pchan->next, pdef_info++) {
if(!(pchan->bone->flag & BONE_NO_DEFORM)) {
if(pchan->bone->segments > 1)
- pchan_b_bone_defmats(pchan, use_quaternion);
+ pchan_b_bone_defmats(pchan, pdef_info, use_quaternion);
if(use_quaternion) {
- pchan->dual_quat= &dualquats[totchan++];
- mat4_to_dquat( pchan->dual_quat,pchan->bone->arm_mat, pchan->chan_mat);
+ pdef_info->dual_quat= &dualquats[totchan++];
+ mat4_to_dquat( pdef_info->dual_quat,pchan->bone->arm_mat, pchan->chan_mat);
}
}
}
@@ -872,15 +885,19 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
else if(dverts) use_dverts = 1;
if(use_dverts) {
- defnrToPC = MEM_callocN(sizeof(*defnrToPC) * numGroups,
- "defnrToBone");
+ defnrToPC = MEM_callocN(sizeof(*defnrToPC) * numGroups, "defnrToBone");
+ defnrToPCIndex = MEM_callocN(sizeof(*defnrToPCIndex) * numGroups, "defnrToIndex");
for(i = 0, dg = target->defbase.first; dg;
i++, dg = dg->next) {
defnrToPC[i] = get_pose_channel(armOb->pose, dg->name);
/* exclude non-deforming bones */
if(defnrToPC[i]) {
- if(defnrToPC[i]->bone->flag & BONE_NO_DEFORM)
+ if(defnrToPC[i]->bone->flag & BONE_NO_DEFORM) {
defnrToPC[i]= NULL;
+ }
+ else {
+ defnrToPCIndex[i]= BLI_findindex(&armOb->pose->chanbase, defnrToPC[i]);
+ }
}
}
}
@@ -920,19 +937,15 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
dvert = NULL;
if(armature_def_nr >= 0 && dvert) {
- armature_weight = 0.0f; /* a def group was given, so default to 0 */
- for(j = 0; j < dvert->totweight; j++) {
- if(dvert->dw[j].def_nr == armature_def_nr) {
- armature_weight = dvert->dw[j].weight;
- break;
- }
+ armature_weight= defvert_find_weight(dvert, armature_def_nr);
+
+ if(invert_vgroup) {
+ armature_weight= 1.0f-armature_weight;
}
+
/* hackish: the blending factor can be used for blending with prevCos too */
if(prevCos) {
- if(invert_vgroup)
- prevco_weight= 1.0f-armature_weight;
- else
- prevco_weight= armature_weight;
+ prevco_weight= armature_weight;
armature_weight= 1.0f;
}
}
@@ -951,10 +964,10 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
for(j = 0; j < dvert->totweight; j++){
int index = dvert->dw[j].def_nr;
- pchan = index < numGroups?defnrToPC[index]:NULL;
- if(pchan) {
+ if(index < numGroups && (pchan= defnrToPC[index])) {
float weight = dvert->dw[j].weight;
- Bone *bone = pchan->bone;
+ Bone *bone= pchan->bone;
+ pdef_info= pdef_info_array + defnrToPCIndex[index];
deformed = 1;
@@ -965,25 +978,27 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
bone->rad_tail,
bone->dist);
}
- pchan_bone_deform(pchan, weight, vec, dq, smat, co, &contrib);
+ pchan_bone_deform(pchan, pdef_info, weight, vec, dq, smat, co, &contrib);
}
}
/* if there are vertexgroups but not groups with bones
* (like for softbody groups)
*/
if(deformed == 0 && use_envelope) {
- for(pchan = armOb->pose->chanbase.first; pchan;
- pchan = pchan->next) {
+ pdef_info= pdef_info_array;
+ for(pchan= armOb->pose->chanbase.first; pchan;
+ pchan= pchan->next, pdef_info++) {
if(!(pchan->bone->flag & BONE_NO_DEFORM))
- contrib += dist_bone_deform(pchan, vec, dq, smat, co);
+ contrib += dist_bone_deform(pchan, pdef_info, vec, dq, smat, co);
}
}
}
else if(use_envelope) {
+ pdef_info= pdef_info_array;
for(pchan = armOb->pose->chanbase.first; pchan;
- pchan = pchan->next) {
+ pchan = pchan->next, pdef_info++) {
if(!(pchan->bone->flag & BONE_NO_DEFORM))
- contrib += dist_bone_deform(pchan, vec, dq, smat, co);
+ contrib += dist_bone_deform(pchan, pdef_info, vec, dq, smat, co);
}
}
@@ -1039,25 +1054,25 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
if(dualquats) MEM_freeN(dualquats);
if(defnrToPC) MEM_freeN(defnrToPC);
-
+ if(defnrToPCIndex) MEM_freeN(defnrToPCIndex);
+
/* free B_bone matrices */
- for(pchan = armOb->pose->chanbase.first; pchan; pchan = pchan->next) {
- if(pchan->b_bone_mats) {
- MEM_freeN(pchan->b_bone_mats);
- pchan->b_bone_mats = NULL;
+ pdef_info= pdef_info_array;
+ for(pchan = armOb->pose->chanbase.first; pchan; pchan = pchan->next, pdef_info++) {
+ if(pdef_info->b_bone_mats) {
+ MEM_freeN(pdef_info->b_bone_mats);
}
- if(pchan->b_bone_dual_quats) {
- MEM_freeN(pchan->b_bone_dual_quats);
- pchan->b_bone_dual_quats = NULL;
+ if(pdef_info->b_bone_dual_quats) {
+ MEM_freeN(pdef_info->b_bone_dual_quats);
}
-
- pchan->dual_quat = NULL;
}
+
+ MEM_freeN(pdef_info_array);
}
/* ************ END Armature Deform ******************* */
-void get_objectspace_bone_matrix (struct Bone* bone, float M_accumulatedMatrix[][4], int root, int posed)
+void get_objectspace_bone_matrix (struct Bone* bone, float M_accumulatedMatrix[][4], int UNUSED(root), int UNUSED(posed))
{
copy_m4_m4(M_accumulatedMatrix, bone->arm_mat);
}
@@ -1085,11 +1100,10 @@ void armature_mat_world_to_pose(Object *ob, float inmat[][4], float outmat[][4])
*/
void armature_loc_world_to_pose(Object *ob, float *inloc, float *outloc)
{
- float xLocMat[4][4];
+ float xLocMat[4][4]= MAT4_UNITY;
float nLocMat[4][4];
/* build matrix for location */
- unit_m4(xLocMat);
VECCOPY(xLocMat[3], inloc);
/* get bone-space cursor matrix and extract location */
@@ -1105,22 +1119,50 @@ void armature_mat_pose_to_bone(bPoseChannel *pchan, float inmat[][4], float outm
{
float pc_trans[4][4], inv_trans[4][4];
float pc_posemat[4][4], inv_posemat[4][4];
-
+ float pose_mat[4][4];
+
/* paranoia: prevent crashes with no pose-channel supplied */
if (pchan==NULL) return;
-
- /* get the inverse matrix of the pchan's transforms */
- if (pchan->rotmode)
- loc_eul_size_to_mat4(pc_trans, pchan->loc, pchan->eul, pchan->size);
- else
- loc_quat_size_to_mat4(pc_trans, pchan->loc, pchan->quat, pchan->size);
+
+ /* default flag */
+ if((pchan->bone->flag & BONE_NO_LOCAL_LOCATION)==0) {
+ /* get the inverse matrix of the pchan's transforms */
+ switch(pchan->rotmode) {
+ case ROT_MODE_QUAT:
+ loc_quat_size_to_mat4(pc_trans, pchan->loc, pchan->quat, pchan->size);
+ break;
+ case ROT_MODE_AXISANGLE:
+ loc_axisangle_size_to_mat4(pc_trans, pchan->loc, pchan->rotAxis, pchan->rotAngle, pchan->size);
+ break;
+ default: /* euler */
+ loc_eul_size_to_mat4(pc_trans, pchan->loc, pchan->eul, pchan->size);
+ }
+
+ copy_m4_m4(pose_mat, pchan->pose_mat);
+ }
+ else {
+ /* local location, this is not default, different calculation
+ * note: only tested for location with pose bone snapping.
+ * If this is not useful in other cases the BONE_NO_LOCAL_LOCATION
+ * case may have to be split into its own function. */
+ unit_m4(pc_trans);
+ copy_v3_v3(pc_trans[3], pchan->loc);
+
+ /* use parents rotation/scale space + own absolute position */
+ if(pchan->parent) copy_m4_m4(pose_mat, pchan->parent->pose_mat);
+ else unit_m4(pose_mat);
+
+ copy_v3_v3(pose_mat[3], pchan->pose_mat[3]);
+ }
+
+
invert_m4_m4(inv_trans, pc_trans);
/* Remove the pchan's transforms from it's pose_mat.
* This should leave behind the effects of restpose +
* parenting + constraints
*/
- mul_m4_m4m4(pc_posemat, inv_trans, pchan->pose_mat);
+ mul_m4_m4m4(pc_posemat, inv_trans, pose_mat);
/* get the inverse of the leftovers so that we can remove
* that component from the supplied matrix
@@ -1137,11 +1179,10 @@ void armature_mat_pose_to_bone(bPoseChannel *pchan, float inmat[][4], float outm
*/
void armature_loc_pose_to_bone(bPoseChannel *pchan, float *inloc, float *outloc)
{
- float xLocMat[4][4];
+ float xLocMat[4][4]= MAT4_UNITY;
float nLocMat[4][4];
/* build matrix for location */
- unit_m4(xLocMat);
VECCOPY(xLocMat[3], inloc);
/* get bone-space cursor matrix and extract location */
@@ -1149,32 +1190,30 @@ void armature_loc_pose_to_bone(bPoseChannel *pchan, float *inloc, float *outloc)
VECCOPY(outloc, nLocMat[3]);
}
+/* same as object_mat3_to_rot() */
+void pchan_mat3_to_rot(bPoseChannel *pchan, float mat[][3], short use_compat)
+{
+ switch(pchan->rotmode) {
+ case ROT_MODE_QUAT:
+ mat3_to_quat(pchan->quat, mat);
+ break;
+ case ROT_MODE_AXISANGLE:
+ mat3_to_axis_angle(pchan->rotAxis, &pchan->rotAngle, mat);
+ break;
+ default: /* euler */
+ if(use_compat) mat3_to_compatible_eulO(pchan->eul, pchan->eul, pchan->rotmode, mat);
+ else mat3_to_eulO(pchan->eul, pchan->rotmode, mat);
+ }
+}
/* Apply a 4x4 matrix to the pose bone,
* similar to object_apply_mat4()
*/
-void pchan_apply_mat4(bPoseChannel *pchan, float mat[][4])
+void pchan_apply_mat4(bPoseChannel *pchan, float mat[][4], short use_compat)
{
- /* location */
- copy_v3_v3(pchan->loc, mat[3]);
-
- /* scale */
- mat4_to_size(pchan->size, mat);
-
- /* rotation */
- if (pchan->rotmode == ROT_MODE_AXISANGLE) {
- float tmp_quat[4];
-
- /* need to convert to quat first (in temp var)... */
- mat4_to_quat(tmp_quat, mat);
- quat_to_axis_angle(pchan->rotAxis, &pchan->rotAngle, tmp_quat);
- }
- else if (pchan->rotmode == ROT_MODE_QUAT) {
- mat4_to_quat(pchan->quat, mat);
- }
- else {
- mat4_to_eulO(pchan->eul, pchan->rotmode, mat);
- }
+ float rot[3][3];
+ mat4_to_loc_rot_size(pchan->loc, rot, pchan->size, mat);
+ pchan_mat3_to_rot(pchan, rot, use_compat);
}
/* Remove rest-position effects from pose-transform for obtaining
@@ -1206,6 +1245,7 @@ void BKE_rotMode_change_values (float quat[4], float eul[3], float axis[3], floa
}
else if (oldMode == ROT_MODE_QUAT) {
/* quat to euler */
+ normalize_qt(quat);
quat_to_eulO( eul, newMode,quat);
}
/* else { no conversion needed } */
@@ -1228,6 +1268,7 @@ void BKE_rotMode_change_values (float quat[4], float eul[3], float axis[3], floa
}
else if (oldMode == ROT_MODE_QUAT) {
/* quat to axis angle */
+ normalize_qt(quat);
quat_to_axis_angle( axis, angle,quat);
}
@@ -1360,13 +1401,6 @@ void where_is_armature_bone(Bone *bone, Bone *prevbone)
VECCOPY(bone->arm_mat[3], bone->head);
}
- /* head */
- VECCOPY(bone->arm_head, bone->arm_mat[3]);
- /* tail is in current local coord system */
- VECCOPY(vec, bone->arm_mat[1]);
- mul_v3_fl(vec, bone->length);
- add_v3_v3v3(bone->arm_tail, bone->arm_head, vec);
-
/* and the kiddies */
prevbone= bone;
for(bone= bone->childbase.first; bone; bone= bone->next) {
@@ -1411,10 +1445,6 @@ static void pose_proxy_synchronize(Object *ob, Object *from, int layer_protected
if(error)
return;
- /* exception, armature local layer should be proxied too */
- if (pose->proxy_layer)
- ((bArmature *)ob->data)->layer= pose->proxy_layer;
-
/* clear all transformation values from library */
rest_pose(frompose);
@@ -1460,7 +1490,7 @@ static void pose_proxy_synchronize(Object *ob, Object *from, int layer_protected
*/
extract_proxylocal_constraints(&proxylocal_constraints, &pchan->constraints);
copy_constraints(&pchanw.constraints, &pchanp->constraints, FALSE);
- addlisttolist(&pchanw.constraints, &proxylocal_constraints);
+ BLI_movelisttolist(&pchanw.constraints, &proxylocal_constraints);
/* constraints - set target ob pointer to own object */
for (con= pchanw.constraints.first; con; con= con->next) {
@@ -1616,7 +1646,7 @@ typedef struct tSplineIK_Tree {
/* ----------- */
/* Tag the bones in the chain formed by the given bone for IK */
-static void splineik_init_tree_from_pchan(Scene *scene, Object *ob, bPoseChannel *pchan_tip)
+static void splineik_init_tree_from_pchan(Scene *scene, Object *UNUSED(ob), bPoseChannel *pchan_tip)
{
bPoseChannel *pchan, *pchanRoot=NULL;
bPoseChannel *pchanChain[255];
@@ -1689,28 +1719,25 @@ static void splineik_init_tree_from_pchan(Scene *scene, Object *ob, bPoseChannel
ikData->numpoints= ikData->chainlen+1;
ikData->points= MEM_callocN(sizeof(float)*ikData->numpoints, "Spline IK Binding");
+ /* bind 'tip' of chain (i.e. first joint = tip of bone with the Spline IK Constraint) */
+ ikData->points[0] = 1.0f;
+
/* perform binding of the joints to parametric positions along the curve based
* proportion of the total length that each bone occupies
*/
for (i = 0; i < segcount; i++) {
- if (i != 0) {
- /* 'head' joints
- * - 2 methods; the one chosen depends on whether we've got usable lengths
- */
- if ((ikData->flag & CONSTRAINT_SPLINEIK_EVENSPLITS) || (totLength == 0.0f)) {
- /* 1) equi-spaced joints */
- ikData->points[i]= ikData->points[i-1] - segmentLen;
- }
- else {
- /* 2) to find this point on the curve, we take a step from the previous joint
- * a distance given by the proportion that this bone takes
- */
- ikData->points[i]= ikData->points[i-1] - (boneLengths[i] / totLength);
- }
+ /* 'head' joints, travelling towards the root of the chain
+ * - 2 methods; the one chosen depends on whether we've got usable lengths
+ */
+ if ((ikData->flag & CONSTRAINT_SPLINEIK_EVENSPLITS) || (totLength == 0.0f)) {
+ /* 1) equi-spaced joints */
+ ikData->points[i+1]= ikData->points[i] - segmentLen;
}
else {
- /* 'tip' of chain, special exception for the first joint */
- ikData->points[0]= 1.0f;
+ /* 2) to find this point on the curve, we take a step from the previous joint
+ * a distance given by the proportion that this bone takes
+ */
+ ikData->points[i+1]= ikData->points[i] - (boneLengths[i] / totLength);
}
}
@@ -1785,7 +1812,7 @@ static void splineik_init_tree_from_pchan(Scene *scene, Object *ob, bPoseChannel
}
/* Tag which bones are members of Spline IK chains */
-static void splineik_init_tree(Scene *scene, Object *ob, float ctime)
+static void splineik_init_tree(Scene *scene, Object *ob, float UNUSED(ctime))
{
bPoseChannel *pchan;
@@ -1990,7 +2017,9 @@ static void splineik_evaluate_bone(tSplineIK_Tree *tree, Scene *scene, Object *o
/* finally, store the new transform */
copy_m4_m4(pchan->pose_mat, poseMat);
VECCOPY(pchan->pose_head, poseHead);
- VECCOPY(pchan->pose_tail, poseTail);
+
+ /* recalculate tail, as it's now outdated after the head gets adjusted above! */
+ where_is_pose_bone_tail(pchan);
/* done! */
pchan->flag |= POSE_DONE;
@@ -2055,8 +2084,7 @@ void pchan_to_mat4(bPoseChannel *pchan, float chan_mat[4][4])
* but if this proves to be too problematic, switch back to the old system of operating directly on
* the stored copy
*/
- QUATCOPY(quat, pchan->quat);
- normalize_qt(quat);
+ normalize_qt_qt(quat, pchan->quat);
quat_to_mat3(rmat, quat);
}
@@ -2203,6 +2231,15 @@ static void do_strip_modifiers(Scene *scene, Object *armob, Bone *bone, bPoseCha
}
}
+/* calculate tail of posechannel */
+void where_is_pose_bone_tail(bPoseChannel *pchan)
+{
+ float vec[3];
+
+ VECCOPY(vec, pchan->pose_mat[1]);
+ mul_v3_fl(vec, pchan->bone->length);
+ add_v3_v3v3(pchan->pose_tail, pchan->pose_head, vec);
+}
/* The main armature solver, does all constraints excluding IK */
/* pchan is validated, as having bone and parent pointer
@@ -2239,13 +2276,28 @@ void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, float cti
offs_bone[3][1]+= parbone->length;
/* Compose the matrix for this bone */
- if(bone->flag & BONE_HINGE) { // uses restposition rotation, but actual position
+ if((bone->flag & BONE_HINGE) && (bone->flag & BONE_NO_SCALE)) { // uses restposition rotation, but actual position
float tmat[4][4];
-
/* the rotation of the parent restposition */
copy_m4_m4(tmat, parbone->arm_mat);
mul_serie_m4(pchan->pose_mat, tmat, offs_bone, pchan->chan_mat, NULL, NULL, NULL, NULL, NULL);
}
+ else if(bone->flag & BONE_HINGE) { // same as above but apply parent scale
+ float tmat[4][4];
+
+ /* apply the parent matrix scale */
+ float tsmat[4][4], tscale[3];
+
+ /* the rotation of the parent restposition */
+ copy_m4_m4(tmat, parbone->arm_mat);
+
+ /* extract the scale of the parent matrix */
+ mat4_to_size(tscale, parchan->pose_mat);
+ size_to_mat4(tsmat, tscale);
+ mul_m4_m4m4(tmat, tmat, tsmat);
+
+ mul_serie_m4(pchan->pose_mat, tmat, offs_bone, pchan->chan_mat, NULL, NULL, NULL, NULL, NULL);
+ }
else if(bone->flag & BONE_NO_SCALE) {
float orthmat[4][4];
@@ -2321,9 +2373,7 @@ void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, float cti
/* calculate head */
VECCOPY(pchan->pose_head, pchan->pose_mat[3]);
/* calculate tail */
- VECCOPY(vec, pchan->pose_mat[1]);
- mul_v3_fl(vec, bone->length);
- add_v3_v3v3(pchan->pose_tail, pchan->pose_head, vec);
+ where_is_pose_bone_tail(pchan);
}
/* This only reads anim data from channels, and writes to channels */
@@ -2341,7 +2391,7 @@ void where_is_pose (Scene *scene, Object *ob)
if(ELEM(NULL, arm, scene)) return;
if((ob->pose==NULL) || (ob->pose->flag & POSE_RECALC))
- armature_rebuild_pose(ob, arm);
+ armature_rebuild_pose(ob, arm);
ctime= bsystem_time(scene, ob, (float)scene->r.cfra, 0.0); /* not accurate... */
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index d120b42a286..6e08df0f465 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -32,7 +32,6 @@
#ifndef _WIN32
#include <unistd.h> // for read close
- #include <sys/param.h> // for MAXPATHLEN
#else
#include <io.h> // for open close read
#define open _open
@@ -56,8 +55,10 @@
#include "DNA_sound_types.h"
#include "BLI_blenlib.h"
+#include "BLI_bpath.h"
#include "BLI_dynstr.h"
#include "BLI_path_util.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf.h"
@@ -81,7 +82,7 @@
#include "BLO_readfile.h"
#include "BLO_writefile.h"
-#include "BKE_utildefines.h" // O_BINARY FALSE
+#include "BKE_utildefines.h"
#include "WM_api.h" // XXXXX BAD, very BAD dependency (bad level call) - remove asap, elubie
@@ -155,50 +156,33 @@ static void clear_global(void)
/* make sure path names are correct for OS */
static void clean_paths(Main *main)
{
- Image *image= main->image.first;
- bSound *sound= main->sound.first;
- Scene *scene= main->scene.first;
- Editing *ed;
- Sequence *seq;
- Strip *strip;
-
- while(image) {
- BLI_clean(image->name);
- image= image->id.next;
- }
-
- while(sound) {
- BLI_clean(sound->name);
- sound= sound->id.next;
- }
-
- while(scene) {
- ed= seq_give_editing(scene, 0);
- if(ed) {
- seq= ed->seqbasep->first;
- while(seq) {
- if(seq->plugin) {
- BLI_clean(seq->plugin->name);
- }
- strip= seq->strip;
- while(strip) {
- BLI_clean(strip->dir);
- strip= strip->next;
- }
- seq= seq->next;
- }
- }
+ struct BPathIterator *bpi;
+ char filepath_expanded[1024];
+ Scene *scene;
+
+ for(BLI_bpathIterator_init(&bpi, main, main->name, BPATH_USE_PACKED); !BLI_bpathIterator_isDone(bpi); BLI_bpathIterator_step(bpi)) {
+ BLI_bpathIterator_getPath(bpi, filepath_expanded);
+
+ BLI_clean(filepath_expanded);
+
+ BLI_bpathIterator_setPath(bpi, filepath_expanded);
+ }
+
+ BLI_bpathIterator_free(bpi);
+
+ for(scene= main->scene.first; scene; scene= scene->id.next) {
BLI_clean(scene->r.backbuf);
BLI_clean(scene->r.pic);
-
- scene= scene->id.next;
}
}
/* context matching */
/* handle no-ui case */
-static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename)
+/* note, this is called on Undo so any slow conversion functions here
+ * should be avoided or check (mode!='u') */
+
+static void setup_app_data(bContext *C, BlendFileData *bfd, const char *filename)
{
bScreen *curscreen= NULL;
Scene *curscene= NULL;
@@ -211,9 +195,12 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename)
else mode= 0;
recover= (G.fileflags & G_FILE_RECOVER);
-
- clean_paths(bfd->main);
-
+
+ /* Only make filepaths compatible when loading for real (not undo) */
+ if(mode != 'u') {
+ clean_paths(bfd->main);
+ }
+
/* XXX here the complex windowmanager matching */
/* no load screens? */
@@ -238,6 +225,7 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename)
}
/* free G.main Main database */
+// CTX_wm_manager_set(C, NULL);
clear_global();
G.main= bfd->main;
@@ -262,7 +250,7 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename)
G.winpos= bfd->winpos;
G.displaymode= bfd->displaymode;
G.fileflags= bfd->fileflags;
-
+ CTX_wm_manager_set(C, bfd->main->wm.first);
CTX_wm_screen_set(C, bfd->curscreen);
CTX_data_scene_set(C, bfd->curscreen->scene);
CTX_wm_area_set(C, NULL);
@@ -309,10 +297,8 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename)
#endif
/* these are the same at times, should never copy to the same location */
- if(G.sce != filename)
- BLI_strncpy(G.sce, filename, FILE_MAX);
-
- BLI_strncpy(G.main->name, filename, FILE_MAX); /* is guaranteed current file */
+ if(G.main->name != filename)
+ BLI_strncpy(G.main->name, filename, FILE_MAX);
/* baseflags, groups, make depsgraph, etc */
set_scene_bg(G.main, CTX_data_scene(C));
@@ -359,13 +345,7 @@ void BKE_userdef_free(void)
BLI_freelistN(&U.addons);
}
-/* returns:
- 0: no load file
- 1: OK
- 2: OK, and with new user settings
-*/
-
-int BKE_read_file(bContext *C, char *dir, void *unused, ReportList *reports)
+int BKE_read_file(bContext *C, const char *dir, ReportList *reports)
{
BlendFileData *bfd;
int retval= 1;
@@ -392,7 +372,7 @@ int BKE_read_file(bContext *C, char *dir, void *unused, ReportList *reports)
return (bfd?retval:0);
}
-int BKE_read_file_from_memory(bContext *C, char* filebuf, int filelength, void *unused, ReportList *reports)
+int BKE_read_file_from_memory(bContext *C, char* filebuf, int filelength, ReportList *reports)
{
BlendFileData *bfd;
@@ -410,7 +390,7 @@ int BKE_read_file_from_memfile(bContext *C, MemFile *memfile, ReportList *report
{
BlendFileData *bfd;
- bfd= BLO_read_from_memfile(CTX_data_main(C), G.sce, memfile, reports);
+ bfd= BLO_read_from_memfile(CTX_data_main(C), G.main->name, memfile, reports);
if (bfd)
setup_app_data(C, bfd, "<memory1>");
else
@@ -460,37 +440,36 @@ static UndoElem *curundo= NULL;
static int read_undosave(bContext *C, UndoElem *uel)
{
- char scestr[FILE_MAXDIR+FILE_MAXFILE]; /* we should eventually just use G.main->name */
- char mainstr[FILE_MAXDIR+FILE_MAXFILE];
+ char mainstr[sizeof(G.main->name)];
int success=0, fileflags;
/* This is needed so undoing/redoing doesnt crash with threaded previews going */
WM_jobs_stop_all(CTX_wm_manager(C));
-
- strcpy(scestr, G.sce); /* temporal store */
- strcpy(mainstr, G.main->name); /* temporal store */
+
+ BLI_strncpy(mainstr, G.main->name, sizeof(mainstr)); /* temporal store */
fileflags= G.fileflags;
G.fileflags |= G_FILE_NO_UI;
if(UNDO_DISK)
- success= BKE_read_file(C, uel->str, NULL, NULL);
+ success= (BKE_read_file(C, uel->str, NULL) != BKE_READ_FILE_FAIL);
else
success= BKE_read_file_from_memfile(C, &uel->memfile, NULL);
/* restore */
- strcpy(G.sce, scestr); /* restore */
strcpy(G.main->name, mainstr); /* restore */
G.fileflags= fileflags;
- if(success)
- DAG_on_load_update(G.main);
+ if(success) {
+ /* important not to update time here, else non keyed tranforms are lost */
+ DAG_on_load_update(G.main, FALSE);
+ }
return success;
}
/* name can be a dynamic string */
-void BKE_write_undo(bContext *C, char *name)
+void BKE_write_undo(bContext *C, const char *name)
{
uintptr_t maxmem, totmem, memused;
int nr, success;
@@ -554,7 +533,7 @@ void BKE_write_undo(bContext *C, char *name)
if(curundo->prev) prevfile= &(curundo->prev->memfile);
memused= MEM_get_memory_in_use();
- success= BLO_write_file_mem(CTX_data_main(C), prevfile, &curundo->memfile, G.fileflags, NULL);
+ success= BLO_write_file_mem(CTX_data_main(C), prevfile, &curundo->memfile, G.fileflags);
curundo->undosize= MEM_get_memory_in_use() - memused;
}
@@ -657,6 +636,22 @@ void BKE_undo_name(bContext *C, const char *name)
}
}
+/* name optional */
+int BKE_undo_valid(const char *name)
+{
+ if(name) {
+ UndoElem *uel;
+
+ for(uel= undobase.last; uel; uel= uel->prev)
+ if(strcmp(name, uel->name)==0)
+ break;
+
+ return uel && uel->prev;
+ }
+
+ return undobase.last != undobase.first;
+}
+
char *BKE_undo_menu_string(void)
{
@@ -720,7 +715,7 @@ void BKE_undo_save_quit(void)
Main *BKE_undo_get_main(Scene **scene)
{
Main *mainp= NULL;
- BlendFileData *bfd= BLO_read_from_memfile(G.main, G.sce, &curundo->memfile, NULL);
+ BlendFileData *bfd= BLO_read_from_memfile(G.main, G.main->name, &curundo->memfile, NULL);
if(bfd) {
mainp= bfd->main;
diff --git a/source/blender/blenkernel/intern/boids.c b/source/blender/blenkernel/intern/boids.c
index 69a42e52247..228827bab68 100644
--- a/source/blender/blenkernel/intern/boids.c
+++ b/source/blender/blenkernel/intern/boids.c
@@ -41,11 +41,13 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_kdtree.h"
+#include "BLI_utildefines.h"
+
#include "BKE_collision.h"
#include "BKE_effect.h"
#include "BKE_boids.h"
#include "BKE_particle.h"
-#include "BKE_utildefines.h"
+
#include "BKE_modifier.h"
#include "RNA_enum_types.h"
@@ -58,7 +60,7 @@ typedef struct BoidValues {
static int apply_boid_rule(BoidBrainData *bbd, BoidRule *rule, BoidValues *val, ParticleData *pa, float fuzziness);
-static int rule_none(BoidRule *rule, BoidBrainData *data, BoidValues *val, ParticleData *pa)
+static int rule_none(BoidRule *UNUSED(rule), BoidBrainData *UNUSED(data), BoidValues *UNUSED(val), ParticleData *UNUSED(pa))
{
return 0;
}
@@ -205,7 +207,9 @@ static int rule_avoid_collision(BoidRule *rule, BoidBrainData *bbd, BoidValues *
add_v3_v3v3(col.co2, pa->prev_state.co, pa->prev_state.vel);
sub_v3_v3v3(ray_dir, col.co2, col.co1);
mul_v3_fl(ray_dir, acbr->look_ahead);
- col.t = 0.0f;
+ col.f = 0.0f;
+ col.cfra = fmod(bbd->cfra-bbd->dfra, 1.0f);
+ col.dfra = bbd->dfra;
hit.index = -1;
hit.dist = col.ray_len = len_v3(ray_dir);
@@ -344,7 +348,7 @@ static int rule_avoid_collision(BoidRule *rule, BoidBrainData *bbd, BoidValues *
return ret;
}
-static int rule_separate(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, ParticleData *pa)
+static int rule_separate(BoidRule *UNUSED(rule), BoidBrainData *bbd, BoidValues *val, ParticleData *pa)
{
KDTreeNearest *ptn = NULL;
ParticleTarget *pt;
@@ -384,7 +388,7 @@ static int rule_separate(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, Pa
}
return ret;
}
-static int rule_flock(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, ParticleData *pa)
+static int rule_flock(BoidRule *UNUSED(rule), BoidBrainData *bbd, BoidValues *UNUSED(val), ParticleData *pa)
{
KDTreeNearest ptn[11];
float vec[3] = {0.0f, 0.0f, 0.0f}, loc[3] = {0.0f, 0.0f, 0.0f};
@@ -772,7 +776,9 @@ static Object *boid_find_ground(BoidBrainData *bbd, ParticleData *pa, float *gro
sub_v3_v3v3(col.co2, pa->state.co, zvec);
sub_v3_v3(col.co2, zvec);
sub_v3_v3v3(ray_dir, col.co2, col.co1);
- col.t = 0.0f;
+ col.f = 0.0f;
+ col.cfra = fmod(bbd->cfra-bbd->dfra, 1.0f);
+ col.dfra = bbd->dfra;
hit.index = -1;
hit.dist = col.ray_len = len_v3(ray_dir);
@@ -796,7 +802,9 @@ static Object *boid_find_ground(BoidBrainData *bbd, ParticleData *pa, float *gro
sub_v3_v3v3(col.co2, pa->state.co, zvec);
sub_v3_v3(col.co2, zvec);
sub_v3_v3v3(ray_dir, col.co2, col.co1);
- col.t = 0.0f;
+ col.f = 0.0f;
+ col.cfra = fmod(bbd->cfra-bbd->dfra, 1.0f);
+ col.dfra = bbd->dfra;
hit.index = -1;
hit.dist = col.ray_len = len_v3(ray_dir);
@@ -823,7 +831,7 @@ static Object *boid_find_ground(BoidBrainData *bbd, ParticleData *pa, float *gro
return NULL;
}
}
-static int boid_rule_applies(ParticleData *pa, BoidSettings *boids, BoidRule *rule)
+static int boid_rule_applies(ParticleData *pa, BoidSettings *UNUSED(boids), BoidRule *rule)
{
BoidParticle *bpa = pa->boid;
@@ -1257,7 +1265,11 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa)
switch(bpa->data.mode) {
case eBoidMode_InAir:
{
- float grav[3] = {0.0f, 0.0f, bbd->sim->scene->physics_settings.gravity[2] < 0.0f ? -1.0f : 0.0f};
+ float grav[3];
+
+ grav[0]= 0.0f;
+ grav[1]= 0.0f;
+ grav[2]= bbd->sim->scene->physics_settings.gravity[2] < 0.0f ? -1.0f : 0.0f;
/* don't take forward acceleration into account (better banking) */
if(dot_v3v3(bpa->data.acc, pa->state.vel) > 0.0f) {
@@ -1296,7 +1308,12 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa)
}
case eBoidMode_Falling:
{
- float grav[3] = {0.0f, 0.0f, bbd->sim->scene->physics_settings.gravity[2] < 0.0f ? -1.0f : 0.0f};
+ float grav[3];
+
+ grav[0]= 0.0f;
+ grav[1]= 0.0f;
+ grav[2]= bbd->sim->scene->physics_settings.gravity[2] < 0.0f ? -1.0f : 0.0f;
+
/* gather apparent gravity */
VECADDFAC(bpa->gravity, bpa->gravity, grav, dtime);
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index c67db9382f3..b1931ebe0a7 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -45,6 +45,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_brush.h"
#include "BKE_colortools.h"
@@ -67,7 +68,7 @@ static void brush_set_defaults(Brush *brush)
brush->blend = 0;
brush->flag = 0;
- brush->ob_mode = (OB_MODE_SCULPT|OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT);
+ brush->ob_mode = OB_MODE_ALL_PAINT;
/* BRUSH SCULPT TOOL SETTINGS */
brush->size= 35; /* radius of the brush in pixels */
@@ -228,10 +229,8 @@ void make_local_brush(Brush *brush)
void brush_debug_print_state(Brush *br)
{
- Brush def;
-
/* create a fake brush and set it to the defaults */
- memset(&def, 0, sizeof(Brush));
+ Brush def= {{0}};
brush_set_defaults(&def);
#define BR_TEST(field, t) \
@@ -530,7 +529,7 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int bufsize, ImBuf
if (*outbuf)
ibuf= *outbuf;
else
- ibuf= IMB_allocImBuf(bufsize, bufsize, 32, imbflag, 0);
+ ibuf= IMB_allocImBuf(bufsize, bufsize, 32, imbflag);
if (flt) {
for (y=0; y < ibuf->y; y++) {
@@ -796,11 +795,11 @@ static void brush_painter_fixed_tex_partial_update(BrushPainter *painter, float
imbflag= (cache->flt)? IB_rectfloat: IB_rect;
if (!cache->ibuf)
- cache->ibuf= IMB_allocImBuf(diameter, diameter, 32, imbflag, 0);
+ cache->ibuf= IMB_allocImBuf(diameter, diameter, 32, imbflag);
ibuf= cache->ibuf;
oldtexibuf= cache->texibuf;
- cache->texibuf= IMB_allocImBuf(diameter, diameter, 32, imbflag, 0);
+ cache->texibuf= IMB_allocImBuf(diameter, diameter, 32, imbflag);
if (oldtexibuf) {
srcx= srcy= 0;
@@ -908,7 +907,13 @@ static void brush_apply_pressure(BrushPainter *painter, Brush *brush, float pres
void brush_jitter_pos(Brush *brush, float *pos, float *jitterpos)
{
- if(brush->jitter){
+ int use_jitter= brush->jitter != 0;
+
+ /* jitter-ed brush gives wierd and unpredictable result for this
+ kinds of stroke, so manyally disable jitter usage (sergey) */
+ use_jitter&= (brush->flag & (BRUSH_RESTORE_MESH|BRUSH_ANCHORED)) == 0;
+
+ if(use_jitter){
float rand_pos[2];
const int radius= brush_size(brush);
const int diameter= 2*radius;
@@ -1098,11 +1103,9 @@ unsigned int *brush_gen_texture_cache(Brush *br, int half_side)
{
unsigned int *texcache = NULL;
MTex *mtex = &br->mtex;
- TexResult texres;
+ TexResult texres= {0};
int hasrgb, ix, iy;
int side = half_side * 2;
-
- memset(&texres, 0, sizeof(TexResult));
if(mtex->tex) {
float x, y, step = 2.0 / side, co[3];
diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c
index 1b7257519b1..db7b9b276a2 100644
--- a/source/blender/blenkernel/intern/bvhutils.c
+++ b/source/blender/blenkernel/intern/bvhutils.c
@@ -23,7 +23,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): André Pinto.
+ * Contributor(s): Andr Pinto.
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -34,15 +34,18 @@
#include "DNA_meshdata_types.h"
+#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
+
#include "BKE_DerivedMesh.h"
-#include "BKE_utildefines.h"
+
#include "BLI_math.h"
#include "MEM_guardedalloc.h"
/* Math stuff for ray casting on mesh faces and for nearest surface */
-static float ray_tri_intersection(const BVHTreeRay *ray, const float m_dist, const float *v0, const float *v1, const float *v2)
+static float ray_tri_intersection(const BVHTreeRay *ray, const float UNUSED(m_dist), const float *v0, const float *v1, const float *v2)
{
float dist;
@@ -577,16 +580,34 @@ BVHTree* bvhtree_from_mesh_faces(BVHTreeFromMesh *data, DerivedMesh *mesh, float
tree = BLI_bvhtree_new(numFaces, epsilon, tree_type, axis);
if(tree != NULL)
{
- for(i = 0; i < numFaces; i++)
- {
- float co[4][3];
- VECCOPY(co[0], vert[ face[i].v1 ].co);
- VECCOPY(co[1], vert[ face[i].v2 ].co);
- VECCOPY(co[2], vert[ face[i].v3 ].co);
- if(face[i].v4)
- VECCOPY(co[3], vert[ face[i].v4 ].co);
-
- BLI_bvhtree_insert(tree, i, co[0], face[i].v4 ? 4 : 3);
+ /* XXX, for snap only, em & dm are assumed to be aligned, since dm is the em's cage */
+ EditMesh *em= data->em_evil;
+ if(em) {
+ EditFace *efa= em->faces.first;
+ for(i = 0; i < numFaces; i++, efa= efa->next) {
+ if(!(efa->f & 1) && efa->h==0 && !((efa->v1->f&1)+(efa->v2->f&1)+(efa->v3->f&1)+(efa->v4?efa->v4->f&1:0))) {
+ float co[4][3];
+ VECCOPY(co[0], vert[ face[i].v1 ].co);
+ VECCOPY(co[1], vert[ face[i].v2 ].co);
+ VECCOPY(co[2], vert[ face[i].v3 ].co);
+ if(face[i].v4)
+ VECCOPY(co[3], vert[ face[i].v4 ].co);
+
+ BLI_bvhtree_insert(tree, i, co[0], face[i].v4 ? 4 : 3);
+ }
+ }
+ }
+ else {
+ for(i = 0; i < numFaces; i++) {
+ float co[4][3];
+ VECCOPY(co[0], vert[ face[i].v1 ].co);
+ VECCOPY(co[1], vert[ face[i].v2 ].co);
+ VECCOPY(co[2], vert[ face[i].v3 ].co);
+ if(face[i].v4)
+ VECCOPY(co[3], vert[ face[i].v4 ].co);
+
+ BLI_bvhtree_insert(tree, i, co[0], face[i].v4 ? 4 : 3);
+ }
}
BLI_bvhtree_balance(tree);
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index ca81e216006..0006e5bfa38 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -36,17 +36,18 @@
#include <string.h>
#include "BIF_gl.h"
-#include "BKE_cdderivedmesh.h"
-#include "BKE_global.h"
-#include "BKE_mesh.h"
-#include "BKE_paint.h"
-#include "BKE_utildefines.h"
-
#include "BLI_blenlib.h"
#include "BLI_edgehash.h"
#include "BLI_editVert.h"
#include "BLI_math.h"
#include "BLI_pbvh.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_global.h"
+#include "BKE_mesh.h"
+#include "BKE_paint.h"
+
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
@@ -75,6 +76,7 @@ typedef struct {
/* Cached */
struct PBVH *pbvh;
int pbvh_draw;
+
/* Mesh connectivity */
struct ListBase *fmap;
struct IndexNode *fmap_mem;
@@ -189,7 +191,7 @@ static ListBase *cdDM_getFaceMap(Object *ob, DerivedMesh *dm)
static int can_pbvh_draw(Object *ob, DerivedMesh *dm)
{
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
- Mesh *me= (ob)? ob->data: NULL;
+ Mesh *me= ob->data;
if(ob->sculpt->modifiers_active) return 0;
@@ -199,7 +201,6 @@ static int can_pbvh_draw(Object *ob, DerivedMesh *dm)
static struct PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
{
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
- Mesh *me= (ob)? ob->data: NULL;
if(!ob) {
cddm->pbvh= NULL;
@@ -217,15 +218,42 @@ static struct PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
this derivedmesh is just original mesh. it's the multires subsurf dm
that this is actually for, to support a pbvh on a modified mesh */
if(!cddm->pbvh && ob->type == OB_MESH) {
+ Mesh *me= ob->data;
cddm->pbvh = BLI_pbvh_new();
cddm->pbvh_draw = can_pbvh_draw(ob, dm);
BLI_pbvh_build_mesh(cddm->pbvh, me->mface, me->mvert,
me->totface, me->totvert);
+
+ if(ob->sculpt->modifiers_active) {
+ float (*vertCos)[3];
+ int totvert;
+
+ totvert= dm->getNumVerts(dm);
+ vertCos= MEM_callocN(3*totvert*sizeof(float), "cdDM_getPBVH vertCos");
+ dm->getVertCos(dm, vertCos);
+ BLI_pbvh_apply_vertCos(cddm->pbvh, vertCos);
+ MEM_freeN(vertCos);
+ }
}
return cddm->pbvh;
}
+/* update vertex normals so that drawing smooth faces works during sculpt
+ TODO: proper fix is to support the pbvh in all drawing modes */
+static void cdDM_update_normals_from_pbvh(DerivedMesh *dm)
+{
+ CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
+ float (*face_nors)[3];
+
+ if(!cddm->pbvh || !cddm->pbvh_draw || !dm->numFaceData)
+ return;
+
+ face_nors = CustomData_get_layer(&dm->faceData, CD_NORMAL);
+
+ BLI_pbvh_update(cddm->pbvh, PBVH_UpdateNormals, face_nors);
+}
+
static void cdDM_drawVerts(DerivedMesh *dm)
{
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
@@ -289,7 +317,7 @@ static void cdDM_drawUVEdges(DerivedMesh *dm)
GPU_uvedge_setup(dm);
if( !GPU_buffer_legacy(dm) ) {
for(i = 0; i < dm->numFaceData; i++, mf++) {
- if(mf->flag&ME_LOOSEEDGE) {
+ if(!(mf->flag&ME_HIDE)) {
draw = 1;
}
else {
@@ -418,7 +446,7 @@ static void cdDM_drawLooseEdges(DerivedMesh *dm)
static void cdDM_drawFacesSolid(DerivedMesh *dm,
float (*partial_redraw_planes)[4],
- int fast, int (*setMaterial)(int, void *attribs))
+ int UNUSED(fast), int (*setMaterial)(int, void *attribs))
{
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
MVert *mvert = cddm->mvert;
@@ -538,6 +566,8 @@ static void cdDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned cha
if(col1 && col2)
glEnable(GL_CULL_FACE);
+ cdDM_update_normals_from_pbvh(dm);
+
if( GPU_buffer_legacy(dm) ) {
DEBUG_VBO( "Using legacy code. cdDM_drawFacesColored\n" );
glShadeModel(GL_SMOOTH);
@@ -617,6 +647,8 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
if(!mcol)
mcol = dm->getFaceDataArray(dm, CD_MCOL);
+ cdDM_update_normals_from_pbvh(dm);
+
if( GPU_buffer_legacy(dm) ) {
DEBUG_VBO( "Using legacy code. cdDM_drawFacesTex_common\n" );
for(i = 0; i < dm->numFaceData; i++, mf++) {
@@ -725,6 +757,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
if( !GPU_buffer_legacy(dm) ) {
glShadeModel( GL_SMOOTH );
+ lastFlag = 0;
for(i = 0; i < dm->drawObject->nelements/3; i++) {
int actualFace = dm->drawObject->faceRemap[i];
int flag = 1;
@@ -735,6 +768,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
else {
if(index) {
orig = index[actualFace];
+ if(orig == ORIGINDEX_NONE) continue;
if(drawParamsMapped)
flag = drawParamsMapped(userData, orig);
}
@@ -777,7 +811,7 @@ static void cdDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tfa
cdDM_drawFacesTex_common(dm, setDrawOptions, NULL, NULL);
}
-static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors)
+static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors, int (*setMaterial)(int, void *attribs))
{
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
MVert *mv = cddm->mvert;
@@ -792,22 +826,24 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us
if(!mc)
mc = DM_get_face_data_layer(dm, CD_MCOL);
+ cdDM_update_normals_from_pbvh(dm);
+
/* back-buffer always uses legacy since VBO's would need the
* color array temporarily overwritten for drawing, then reset. */
if( GPU_buffer_legacy(dm) || G.f & G_BACKBUFSEL) {
DEBUG_VBO( "Using legacy code. cdDM_drawMappedFaces\n" );
for(i = 0; i < dm->numFaceData; i++, mf++) {
int drawSmooth = (mf->flag & ME_SMOOTH);
+ int draw= 1;
- if(index) {
- orig = *index++;
- if(setDrawOptions && orig == ORIGINDEX_NONE)
- { if(nors) nors += 3; continue; }
- }
- else
- orig = i;
+ orig= (index==NULL) ? i : *index++;
+
+ if(orig == ORIGINDEX_NONE)
+ draw= setMaterial(mf->mat_nr + 1, NULL);
+ else if (setDrawOptions != NULL)
+ draw= setDrawOptions(userData, orig, &drawSmooth);
- if(!setDrawOptions || setDrawOptions(userData, orig, &drawSmooth)) {
+ if(draw) {
unsigned char *cp = NULL;
if(useColors && mc)
@@ -872,34 +908,48 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us
if( !GPU_buffer_legacy(dm) ) {
int tottri = dm->drawObject->nelements/3;
glShadeModel(GL_SMOOTH);
-
- for( i = 0; i < tottri; i++ ) {
- int actualFace = dm->drawObject->faceRemap[i];
- int drawSmooth = (mf[actualFace].flag & ME_SMOOTH);
- int draw = 1;
-
- if(index) {
- orig = index[actualFace];
- if(setDrawOptions && orig == ORIGINDEX_NONE)
- draw = 0;
- }
- else
- orig = actualFace;
-
- if(draw && setDrawOptions && !setDrawOptions(userData, orig, &drawSmooth))
- draw = 0;
-
- /* Goal is to draw as long of a contiguous triangle
- array as possible, so draw when we hit either an
- invisible triangle or at the end of the array */
- if(!draw || i == tottri - 1) {
- if(prevstart != i)
- /* Add one to the length (via `draw')
- if we're drawing at the end of the array */
- glDrawArrays(GL_TRIANGLES,prevstart*3, (i-prevstart+draw)*3);
- prevstart = i + 1;
+
+ if(tottri == 0) {
+ /* avoid buffer problems in following code */
+ }
+ if(setDrawOptions == NULL) {
+ /* just draw the entire face array */
+ glDrawArrays(GL_TRIANGLES, 0, (tottri-1) * 3);
+ }
+ else {
+ /* we need to check if the next material changes */
+ int next_actualFace= dm->drawObject->faceRemap[0];
+
+ for( i = 0; i < tottri; i++ ) {
+ //int actualFace = dm->drawObject->faceRemap[i];
+ int actualFace = next_actualFace;
+ MFace *mface= mf + actualFace;
+ int drawSmooth= (mface->flag & ME_SMOOTH);
+ int draw = 1;
+
+ if(i != tottri-1)
+ next_actualFace= dm->drawObject->faceRemap[i+1];
+
+ orig= (index==NULL) ? actualFace : index[actualFace];
+
+ if(orig == ORIGINDEX_NONE)
+ draw= setMaterial(mface->mat_nr + 1, NULL);
+ else if (setDrawOptions != NULL)
+ draw= setDrawOptions(userData, orig, &drawSmooth);
+
+ /* Goal is to draw as long of a contiguous triangle
+ array as possible, so draw when we hit either an
+ invisible triangle or at the end of the array */
+ if(!draw || i == tottri - 1 || mf[actualFace].mat_nr != mf[next_actualFace].mat_nr) {
+ if(prevstart != i)
+ /* Add one to the length (via `draw')
+ if we're drawing at the end of the array */
+ glDrawArrays(GL_TRIANGLES,prevstart*3, (i-prevstart+draw)*3);
+ prevstart = i + 1;
+ }
}
}
+
glShadeModel(GL_FLAT);
}
GPU_buffer_unbind();
@@ -920,12 +970,13 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
MFace *mface = cddm->mface;
MTFace *tf = dm->getFaceDataArray(dm, CD_MTFACE);
float (*nors)[3] = dm->getFaceDataArray(dm, CD_NORMAL);
- int a, b, dodraw, smoothnormal, matnr, new_matnr;
+ int a, b, dodraw, matnr, new_matnr;
int transp, new_transp, orig_transp;
int orig, *index = dm->getFaceDataArray(dm, CD_ORIGINDEX);
+ cdDM_update_normals_from_pbvh(dm);
+
matnr = -1;
- smoothnormal = 0;
dodraw = 0;
transp = GPU_get_material_blend_mode();
orig_transp = transp;
@@ -939,6 +990,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
glBegin(GL_QUADS);
for(a = 0; a < dm->numFaceData; a++, mface++) {
+ const int smoothnormal = (mface->flag & ME_SMOOTH);
new_matnr = mface->mat_nr + 1;
if(new_matnr != matnr) {
@@ -957,8 +1009,12 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
else if(setDrawOptions) {
orig = (index)? index[a]: a;
- if(orig == ORIGINDEX_NONE)
- continue;
+ if(orig == ORIGINDEX_NONE) {
+ /* since the material is set by setMaterial(), faces with no
+ * origin can be assumed to be generated by a modifier */
+
+ /* continue */
+ }
else if(!setDrawOptions(userData, orig))
continue;
}
@@ -979,8 +1035,6 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
}
}
- smoothnormal = (mface->flag & ME_SMOOTH);
-
if(!smoothnormal) {
if(nors) {
glNormal3fv(nors[a]);
@@ -1471,7 +1525,7 @@ DerivedMesh *CDDM_new(int numVerts, int numEdges, int numFaces)
return dm;
}
-DerivedMesh *CDDM_from_mesh(Mesh *mesh, Object *ob)
+DerivedMesh *CDDM_from_mesh(Mesh *mesh, Object *UNUSED(ob))
{
CDDerivedMesh *cddm = cdDM_create("CDDM_from_mesh dm");
DerivedMesh *dm = &cddm->dm;
@@ -1500,7 +1554,7 @@ DerivedMesh *CDDM_from_mesh(Mesh *mesh, Object *ob)
return dm;
}
-DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me)
+DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *UNUSED(me))
{
DerivedMesh *dm = CDDM_new(BLI_countlist(&em->verts),
BLI_countlist(&em->edges),
@@ -1550,7 +1604,6 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me)
mv->no[2] = eve->no[2] * 32767.0;
mv->bweight = (unsigned char) (eve->bweight * 255.0f);
- mv->mat_nr = 0;
mv->flag = 0;
*index = i;
@@ -1601,7 +1654,7 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me)
DerivedMesh *CDDM_from_curve(Object *ob)
{
- return CDDM_from_curve_customDB(ob, &((Curve *)ob->data)->disp);
+ return CDDM_from_curve_customDB(ob, &ob->disp);
}
DerivedMesh *CDDM_from_curve_customDB(Object *ob, ListBase *dispbase)
@@ -1668,6 +1721,8 @@ DerivedMesh *CDDM_copy(DerivedMesh *source)
return dm;
}
+/* note, the CD_ORIGINDEX layers are all 0, so if there is a direct
+ * relationship betwen mesh data this needs to be set by the caller. */
DerivedMesh *CDDM_from_template(DerivedMesh *source,
int numVerts, int numEdges, int numFaces)
{
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index be1552a882d..39cb1346eb7 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -34,6 +34,7 @@
#include "BLI_math.h"
#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_cloth.h"
@@ -41,7 +42,7 @@
#include "BKE_global.h"
#include "BKE_modifier.h"
#include "BKE_pointcache.h"
-#include "BKE_utildefines.h"
+
#ifdef _WIN32
void tstart ( void )
@@ -49,7 +50,7 @@ void tstart ( void )
void tend ( void )
{
}
-double tval()
+double tval( void )
{
return 0;
}
@@ -65,7 +66,7 @@ void tend ( void )
{
gettimeofday ( &_tend,&tz );
}
-double tval()
+double tval(void)
{
double t1, t2;
t1 = ( double ) _tstart.tv_sec + ( double ) _tstart.tv_usec/ ( 1000*1000 );
@@ -87,7 +88,7 @@ static CM_SOLVER_DEF solvers [] =
/* Prototypes for internal functions.
*/
static void cloth_to_object (Object *ob, ClothModifierData *clmd, DerivedMesh *dm);
-static void cloth_from_mesh ( Object *ob, ClothModifierData *clmd, DerivedMesh *dm );
+static void cloth_from_mesh ( ClothModifierData *clmd, DerivedMesh *dm );
static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *dm, float framenr, int first);
static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm );
static void cloth_apply_vgroup ( ClothModifierData *clmd, DerivedMesh *dm );
@@ -163,7 +164,6 @@ static BVHTree *bvhselftree_build_from_cloth (ClothModifierData *clmd, float eps
BVHTree *bvhtree;
Cloth *cloth;
ClothVertex *verts;
- MFace *mfaces;
float co[12];
if(!clmd)
@@ -175,7 +175,6 @@ static BVHTree *bvhselftree_build_from_cloth (ClothModifierData *clmd, float eps
return NULL;
verts = cloth->verts;
- mfaces = cloth->mfaces;
// in the moment, return zero if no faces there
if(!cloth->numverts)
@@ -385,7 +384,8 @@ static int do_step_cloth(Object *ob, ClothModifierData *clmd, DerivedMesh *resul
Cloth *cloth;
ListBase *effectors = NULL;
MVert *mvert;
- int i, ret = 0;
+ unsigned int i = 0;
+ int ret = 0;
/* simulate 1 frame forward */
cloth = clmd->clothObject;
@@ -423,13 +423,13 @@ static int do_step_cloth(Object *ob, ClothModifierData *clmd, DerivedMesh *resul
/************************************************
* clothModifier_do - main simulation function
************************************************/
-DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc)
+DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, DerivedMesh *dm)
{
DerivedMesh *result;
PointCache *cache;
PTCacheID pid;
float timescale;
- int framedelta, framenr, startframe, endframe;
+ int framenr, startframe, endframe;
int cache_result;
clmd->scene= scene; /* nice to pass on later :) */
@@ -446,7 +446,9 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
return dm;
}
- if(clmd->sim_parms->reset || (framenr == (startframe - clmd->sim_parms->preroll) && clmd->sim_parms->preroll != 0))
+ if(clmd->sim_parms->reset
+ || (framenr == (startframe - clmd->sim_parms->preroll) && clmd->sim_parms->preroll != 0)
+ || (clmd->clothObject && result->getNumVerts(result) != clmd->clothObject->numverts))
{
clmd->sim_parms->reset = 0;
cache->flag |= PTCACHE_OUTDATED;
@@ -457,17 +459,6 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
return result;
}
- /* verify we still have the same number of vertices, if not do nothing.
- * note that this should only happen if the number of vertices changes
- * during an animation due to a preceding modifier, this should not
- * happen because of object changes! */
- if(clmd->clothObject) {
- if(result->getNumVerts(result) != clmd->clothObject->numverts) {
- BKE_ptcache_invalidate(cache);
- return result;
- }
- }
-
// unused in the moment, calculated separately in implicit.c
clmd->sim_parms->dt = clmd->sim_parms->timescale / clmd->sim_parms->stepsPerFrame;
@@ -476,10 +467,10 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
BKE_ptcache_invalidate(cache);
/* do simulation */
- if(!do_init_cloth(ob, clmd, result, framenr))
+ if(!do_init_cloth(ob, clmd, dm, framenr))
return result;
- do_step_cloth(ob, clmd, result, framenr);
+ do_step_cloth(ob, clmd, dm, framenr);
cloth_to_object(ob, clmd, result);
return result;
@@ -494,25 +485,20 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
framenr= endframe;
}
- if(cache->flag & PTCACHE_SIMULATION_VALID)
- framedelta= framenr - cache->simframe;
- else
- framedelta= -1;
-
/* initialize simulation data if it didn't exist already */
- if(!do_init_cloth(ob, clmd, result, framenr))
+ if(!do_init_cloth(ob, clmd, dm, framenr))
return result;
if((framenr == startframe) && (clmd->sim_parms->preroll == 0)) {
BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
- do_init_cloth(ob, clmd, result, framenr);
+ do_init_cloth(ob, clmd, dm, framenr);
BKE_ptcache_validate(cache, framenr);
cache->flag &= ~PTCACHE_REDO_NEEDED;
return result;
}
/* try to read from cache */
- cache_result = BKE_ptcache_read_cache(&pid, (float)framenr+scene->r.subframe, scene->r.frs_sec);
+ cache_result = BKE_ptcache_read(&pid, (float)framenr+scene->r.subframe);
if(cache_result == PTCACHE_READ_EXACT || cache_result == PTCACHE_READ_INTERPOLATED) {
implicit_set_positions(clmd);
@@ -521,7 +507,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
BKE_ptcache_validate(cache, framenr);
if(cache_result == PTCACHE_READ_INTERPOLATED && cache->flag & PTCACHE_REDO_NEEDED)
- BKE_ptcache_write_cache(&pid, framenr);
+ BKE_ptcache_write(&pid, framenr);
return result;
}
@@ -536,18 +522,18 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
/* if on second frame, write cache for first frame */
if(cache->simframe == startframe && (cache->flag & PTCACHE_OUTDATED || cache->last_exact==0))
- BKE_ptcache_write_cache(&pid, startframe);
+ BKE_ptcache_write(&pid, startframe);
clmd->sim_parms->timescale *= framenr - cache->simframe;
/* do simulation */
BKE_ptcache_validate(cache, framenr);
- if(!do_step_cloth(ob, clmd, result, framenr)) {
+ if(!do_step_cloth(ob, clmd, dm, framenr)) {
BKE_ptcache_invalidate(cache);
}
else
- BKE_ptcache_write_cache(&pid, framenr);
+ BKE_ptcache_write(&pid, framenr);
cloth_to_object (ob, clmd, result);
@@ -555,7 +541,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
}
/* frees all */
-void cloth_free_modifier ( Object *ob, ClothModifierData *clmd )
+void cloth_free_modifier(ClothModifierData *clmd )
{
Cloth *cloth = NULL;
@@ -813,7 +799,7 @@ static void cloth_apply_vgroup ( ClothModifierData *clmd, DerivedMesh *dm )
}
}
-static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *dm, float framenr, int first)
+static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *dm, float UNUSED(framenr), int first)
{
int i = 0;
MVert *mvert = NULL;
@@ -826,7 +812,7 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *d
// If we have a clothObject, free it.
if ( clmd->clothObject != NULL )
{
- cloth_free_modifier ( ob, clmd );
+ cloth_free_modifier ( clmd );
if(G.rt > 0)
printf("cloth_free_modifier cloth_from_object\n");
}
@@ -850,7 +836,7 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *d
if ( !dm )
return 0;
- cloth_from_mesh ( ob, clmd, dm );
+ cloth_from_mesh ( clmd, dm );
// create springs
clmd->clothObject->springs = NULL;
@@ -906,7 +892,7 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *d
if ( !cloth_build_springs ( clmd, dm ) )
{
- cloth_free_modifier ( ob, clmd );
+ cloth_free_modifier ( clmd );
modifier_setError ( & ( clmd->modifier ), "Can't build springs." );
printf("cloth_free_modifier cloth_build_springs\n");
return 0;
@@ -940,11 +926,11 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *d
return 1;
}
-static void cloth_from_mesh ( Object *ob, ClothModifierData *clmd, DerivedMesh *dm )
+static void cloth_from_mesh ( ClothModifierData *clmd, DerivedMesh *dm )
{
unsigned int numverts = dm->getNumVerts ( dm );
unsigned int numfaces = dm->getNumFaces ( dm );
- MFace *mface = CDDM_get_faces(dm);
+ MFace *mface = dm->getFaceArray( dm );
unsigned int i = 0;
/* Allocate our vertices. */
@@ -952,7 +938,7 @@ static void cloth_from_mesh ( Object *ob, ClothModifierData *clmd, DerivedMesh *
clmd->clothObject->verts = MEM_callocN ( sizeof ( ClothVertex ) * clmd->clothObject->numverts, "clothVertex" );
if ( clmd->clothObject->verts == NULL )
{
- cloth_free_modifier ( ob, clmd );
+ cloth_free_modifier ( clmd );
modifier_setError ( & ( clmd->modifier ), "Out of memory on allocating clmd->clothObject->verts." );
printf("cloth_free_modifier clmd->clothObject->verts\n");
return;
@@ -963,7 +949,7 @@ static void cloth_from_mesh ( Object *ob, ClothModifierData *clmd, DerivedMesh *
clmd->clothObject->mfaces = MEM_callocN ( sizeof ( MFace ) * clmd->clothObject->numfaces, "clothMFaces" );
if ( clmd->clothObject->mfaces == NULL )
{
- cloth_free_modifier ( ob, clmd );
+ cloth_free_modifier ( clmd );
modifier_setError ( & ( clmd->modifier ), "Out of memory on allocating clmd->clothObject->mfaces." );
printf("cloth_free_modifier clmd->clothObject->mfaces\n");
return;
@@ -1015,7 +1001,7 @@ int cloth_add_spring ( ClothModifierData *clmd, unsigned int indexA, unsigned in
return 0;
}
-static void cloth_free_errorsprings(Cloth *cloth, EdgeHash *edgehash, LinkNode **edgelist)
+static void cloth_free_errorsprings(Cloth *cloth, EdgeHash *UNUSED(edgehash), LinkNode **edgelist)
{
unsigned int i = 0;
@@ -1053,12 +1039,12 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm )
Cloth *cloth = clmd->clothObject;
ClothSpring *spring = NULL, *tspring = NULL, *tspring2 = NULL;
unsigned int struct_springs = 0, shear_springs=0, bend_springs = 0;
- int i = 0;
- int numverts = dm->getNumVerts ( dm );
- int numedges = dm->getNumEdges ( dm );
- int numfaces = dm->getNumFaces ( dm );
- MEdge *medge = CDDM_get_edges ( dm );
- MFace *mface = CDDM_get_faces ( dm );
+ unsigned int i = 0;
+ unsigned int numverts = (unsigned int)dm->getNumVerts ( dm );
+ unsigned int numedges = (unsigned int)dm->getNumEdges ( dm );
+ unsigned int numfaces = (unsigned int)dm->getNumFaces ( dm );
+ MEdge *medge = dm->getEdgeArray ( dm );
+ MFace *mface = dm->getFaceArray ( dm );
int index2 = 0; // our second vertex index
LinkNode **edgelist = NULL;
EdgeHash *edgehash = NULL;
diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c
index af12d23b2c2..8cdfd60b9a7 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -42,6 +42,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
@@ -49,7 +50,7 @@
#include "BKE_mesh.h"
#include "BKE_object.h"
#include "BKE_modifier.h"
-#include "BKE_utildefines.h"
+
#include "BKE_DerivedMesh.h"
#ifdef USE_BULLET
#include "Bullet-C-Api.h"
@@ -79,11 +80,11 @@ void collision_move_object ( CollisionModifierData *collmd, float step, float pr
bvhtree_update_from_mvert ( collmd->bvhtree, collmd->mfaces, collmd->numfaces, collmd->current_x, collmd->current_xnew, collmd->numverts, 1 );
}
-BVHTree *bvhtree_build_from_mvert ( MFace *mfaces, unsigned int numfaces, MVert *x, unsigned int numverts, float epsilon )
+BVHTree *bvhtree_build_from_mvert ( MFace *mfaces, unsigned int numfaces, MVert *x, unsigned int UNUSED(numverts), float epsilon )
{
BVHTree *tree;
float co[12];
- int i;
+ unsigned int i;
MFace *tface = mfaces;
tree = BLI_bvhtree_new ( numfaces*2, epsilon, 4, 26 );
@@ -106,7 +107,7 @@ BVHTree *bvhtree_build_from_mvert ( MFace *mfaces, unsigned int numfaces, MVert
return tree;
}
-void bvhtree_update_from_mvert ( BVHTree * bvhtree, MFace *faces, int numfaces, MVert *x, MVert *xnew, int numverts, int moving )
+void bvhtree_update_from_mvert ( BVHTree * bvhtree, MFace *faces, int numfaces, MVert *x, MVert *xnew, int UNUSED(numverts), int moving )
{
int i;
MFace *mfaces = faces;
@@ -1307,7 +1308,7 @@ static int cloth_collision_moving ( ClothModifierData *clmd, CollisionModifierDa
}
#endif
-static void add_collision_object(Object ***objs, int *numobj, int *maxobj, Object *ob, Object *self, int level)
+static void add_collision_object(Object ***objs, unsigned int *numobj, unsigned int *maxobj, Object *ob, Object *self, int level)
{
CollisionModifierData *cmd= NULL;
@@ -1342,12 +1343,12 @@ static void add_collision_object(Object ***objs, int *numobj, int *maxobj, Objec
// return all collision objects in scene
// collision object will exclude self
-Object **get_collisionobjects(Scene *scene, Object *self, Group *group, int *numcollobj)
+Object **get_collisionobjects(Scene *scene, Object *self, Group *group, unsigned int *numcollobj)
{
Base *base;
Object **objs;
GroupObject *go;
- int numobj= 0, maxobj= 100;
+ unsigned int numobj= 0, maxobj= 100;
objs= MEM_callocN(sizeof(Object *)*maxobj, "CollisionObjectsArray");
@@ -1358,9 +1359,9 @@ Object **get_collisionobjects(Scene *scene, Object *self, Group *group, int *num
add_collision_object(&objs, &numobj, &maxobj, go->ob, self, 0);
}
else {
- Scene *sce; /* for SETLOOPER macro */
+ Scene *sce_iter;
/* add objects in same layer in scene */
- for(SETLOOPER(scene, base)) {
+ for(SETLOOPER(scene, sce_iter, base)) {
if(base->lay & self->lay)
add_collision_object(&objs, &numobj, &maxobj, base->object, self, 0);
@@ -1417,11 +1418,11 @@ ListBase *get_collider_cache(Scene *scene, Object *self, Group *group)
add_collider_cache_object(&objs, go->ob, self, 0);
}
else {
- Scene *sce; /* for SETLOOPER macro */
+ Scene *sce_iter;
Base *base;
/* add objects in same layer in scene */
- for(SETLOOPER(scene, base)) {
+ for(SETLOOPER(scene, sce_iter, base)) {
if(!self || (base->lay & self->lay))
add_collider_cache_object(&objs, base->object, self, 0);
@@ -1456,13 +1457,13 @@ static void cloth_bvh_objcollisions_nearcheck ( ClothModifierData * clmd, Collis
static int cloth_bvh_objcollisions_resolve ( ClothModifierData * clmd, CollisionModifierData *collmd, CollPair *collisions, CollPair *collisions_index)
{
Cloth *cloth = clmd->clothObject;
- int i=0, j = 0, numfaces = 0, numverts = 0;
+ int i=0, j = 0, /*numfaces = 0,*/ numverts = 0;
ClothVertex *verts = NULL;
int ret = 0;
int result = 0;
float tnull[3] = {0,0,0};
- numfaces = clmd->clothObject->numfaces;
+ /*numfaces = clmd->clothObject->numfaces;*/ /*UNUSED*/
numverts = clmd->clothObject->numverts;
verts = cloth->verts;
@@ -1503,12 +1504,12 @@ int cloth_bvh_objcollision (Object *ob, ClothModifierData * clmd, float step, fl
{
Cloth *cloth= clmd->clothObject;
BVHTree *cloth_bvh= cloth->bvhtree;
- int i=0, numfaces = 0, numverts = 0, k, l, j;
+ unsigned int i=0, numfaces = 0, numverts = 0, k, l, j;
int rounds = 0; // result counts applied collisions; ic is for debug output;
ClothVertex *verts = NULL;
int ret = 0, ret2 = 0;
Object **collobjs = NULL;
- int numcollobj = 0;
+ unsigned int numcollobj = 0;
if ((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_COLLOBJ) || cloth_bvh==NULL)
return 0;
@@ -1545,7 +1546,7 @@ int cloth_bvh_objcollision (Object *ob, ClothModifierData * clmd, float step, fl
Object *collob= collobjs[i];
CollisionModifierData *collmd = (CollisionModifierData*)modifiers_findByType(collob, eModifierType_Collision);
BVHTreeOverlap *overlap = NULL;
- int result = 0;
+ unsigned int result = 0;
if(!collmd->bvhtree)
continue;
@@ -1605,11 +1606,11 @@ int cloth_bvh_objcollision (Object *ob, ClothModifierData * clmd, float step, fl
////////////////////////////////////////////////////////////
if ( clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_SELF )
{
- for(l = 0; l < clmd->coll_parms->self_loop_count; l++)
+ for(l = 0; l < (unsigned int)clmd->coll_parms->self_loop_count; l++)
{
// TODO: add coll quality rounds again
BVHTreeOverlap *overlap = NULL;
- int result = 0;
+ unsigned int result = 0;
// collisions = 1;
verts = cloth->verts; // needed for openMP
diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c
index 90ffa39c88f..7cf6b21e2f1 100644
--- a/source/blender/blenkernel/intern/colortools.c
+++ b/source/blender/blenkernel/intern/colortools.c
@@ -41,19 +41,20 @@
#include "DNA_color_types.h"
#include "DNA_curve_types.h"
+#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_colortools.h"
#include "BKE_curve.h"
-#include "BKE_ipo.h"
-#include "BKE_utildefines.h"
+#include "BKE_fcurve.h"
-#include "BLI_blenlib.h"
-#include "BLI_math.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
-void floatbuf_to_srgb_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int w)
+void floatbuf_to_srgb_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int UNUSED(w))
{
int x, y;
float *rf= rectf;
@@ -74,7 +75,7 @@ void floatbuf_to_srgb_byte(float *rectf, unsigned char *rectc, int x1, int x2, i
}
}
-void floatbuf_to_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int w)
+void floatbuf_to_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int UNUSED(w))
{
int x, y;
float *rf= rectf;
@@ -356,7 +357,7 @@ void curvemap_sethandle(CurveMap *cuma, int type)
/* *********************** Making the tables and display ************** */
/* reduced copy of garbled calchandleNurb() code in curve.c */
-static void calchandle_curvemap(BezTriple *bezt, BezTriple *prev, BezTriple *next, int mode)
+static void calchandle_curvemap(BezTriple *bezt, BezTriple *prev, BezTriple *next, int UNUSED(mode))
{
float *p1,*p2,*p3,pt[3];
float dx1,dy1, dx,dy, vx,vy, len,len1,len2;
@@ -830,6 +831,10 @@ void colorcorrection_do_ibuf(ImBuf *ibuf, const char *profile)
cmsCloseProfile(proofingProfile);
}
}
+#else
+ /* unused */
+ (void)ibuf;
+ (void)profile;
#endif
}
@@ -865,7 +870,7 @@ void curvemapping_do_ibuf(CurveMapping *cumap, ImBuf *ibuf)
if(ibuf->channels)
stride= ibuf->channels;
- for(pixel= ibuf->x*ibuf->y; pixel>0; pixel--, pix_in+=stride, pix_out+=4) {
+ for(pixel= ibuf->x*ibuf->y; pixel>0; pixel--, pix_in+=stride, pix_out+=stride) {
if(stride<3) {
col[0]= curvemap_evaluateF(cumap->cm, *pix_in);
@@ -952,13 +957,11 @@ void curvemapping_table_RGBA(CurveMapping *cumap, float **array, int *size)
DO_INLINE int get_bin_float(float f)
{
- int bin= (int)(f*255);
+ int bin= (int)((f*255) + 0.5); /* 0.5 to prevent quantisation differences */
/* note: clamp integer instead of float to avoid problems with NaN */
CLAMP(bin, 0, 255);
-
- //return (int) (((f + 0.25) / 1.5) * 255);
-
+
return bin;
}
@@ -1000,7 +1003,8 @@ DO_INLINE void save_sample_line(Scopes *scopes, const int idx, const float fx, f
void scopes_update(Scopes *scopes, ImBuf *ibuf, int use_color_management)
{
- int x, y, c, n, nl;
+ int x, y, c;
+ unsigned int n, nl;
double div, divl;
float *rf=NULL;
unsigned char *rc=NULL;
@@ -1008,6 +1012,9 @@ void scopes_update(Scopes *scopes, ImBuf *ibuf, int use_color_management)
int savedlines, saveline;
float rgb[3], ycc[3], luma;
int ycc_mode=-1;
+ const short is_float = (ibuf->rect_float != NULL);
+
+ if (ibuf->rect==NULL && ibuf->rect_float==NULL) return;
if (scopes->ok == 1 ) return;
@@ -1015,6 +1022,7 @@ void scopes_update(Scopes *scopes, ImBuf *ibuf, int use_color_management)
/* hmmmm */
if (!(ELEM(ibuf->channels, 3, 4))) return;
+
scopes->hist.channels = 3;
scopes->hist.x_resolution = 256;
@@ -1069,9 +1077,9 @@ void scopes_update(Scopes *scopes, ImBuf *ibuf, int use_color_management)
scopes->waveform_3= MEM_callocN(scopes->waveform_tot * 2 * sizeof(float), "waveform point channel 3");
scopes->vecscope= MEM_callocN(scopes->waveform_tot * 2 * sizeof(float), "vectorscope point channel");
- if (ibuf->rect_float)
+ if (is_float)
rf = ibuf->rect_float;
- else if (ibuf->rect)
+ else
rc = (unsigned char *)ibuf->rect;
for (y = 0; y < ibuf->y; y++) {
@@ -1080,13 +1088,13 @@ void scopes_update(Scopes *scopes, ImBuf *ibuf, int use_color_management)
} else saveline=0;
for (x = 0; x < ibuf->x; x++) {
- if (ibuf->rect_float) {
+ if (is_float) {
if (use_color_management)
linearrgb_to_srgb_v3_v3(rgb, rf);
else
copy_v3_v3(rgb, rf);
}
- else if (ibuf->rect) {
+ else {
for (c=0; c<3; c++)
rgb[c] = rc[c] * INV_255;
}
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index 59e81293c9f..be9e7609a64 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -39,6 +39,7 @@
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "DNA_armature_types.h"
#include "DNA_constraint_types.h"
@@ -52,7 +53,7 @@
#include "DNA_scene_types.h"
#include "DNA_text_types.h"
-#include "BKE_utildefines.h"
+
#include "BKE_action.h"
#include "BKE_anim.h" /* for the curve calculation part */
#include "BKE_armature.h"
@@ -70,7 +71,7 @@
#include "BKE_shrinkwrap.h"
#include "BKE_mesh.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -371,7 +372,7 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
else {
/* objects */
if (from==CONSTRAINT_SPACE_WORLD && to==CONSTRAINT_SPACE_LOCAL) {
- /* check if object has a parent - otherwise this won't work */
+ /* check if object has a parent */
if (ob->parent) {
/* 'subtract' parent's effects from owner */
mul_m4_m4m4(diff_mat, ob->parentinv, ob->parent->obmat);
@@ -379,6 +380,18 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
copy_m4_m4(tempmat, mat);
mul_m4_m4m4(mat, tempmat, imat);
}
+ else {
+ /* Local space in this case will have to be defined as local to the owner's
+ * transform-property-rotated axes. So subtract this rotation component.
+ */
+ object_to_mat4(ob, diff_mat);
+ normalize_m4(diff_mat);
+ zero_v3(diff_mat[3]);
+
+ invert_m4_m4(imat, diff_mat);
+ copy_m4_m4(tempmat, mat);
+ mul_m4_m4m4(mat, tempmat, imat);
+ }
}
else if (from==CONSTRAINT_SPACE_LOCAL && to==CONSTRAINT_SPACE_WORLD) {
/* check that object has a parent - otherwise this won't work */
@@ -388,6 +401,17 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
mul_m4_m4m4(diff_mat, ob->parentinv, ob->parent->obmat);
mul_m4_m4m4(mat, tempmat, diff_mat);
}
+ else {
+ /* Local space in this case will have to be defined as local to the owner's
+ * transform-property-rotated axes. So add back this rotation component.
+ */
+ object_to_mat4(ob, diff_mat);
+ normalize_m4(diff_mat);
+ zero_v3(diff_mat[3]);
+
+ copy_m4_m4(tempmat, mat);
+ mul_m4_m4m4(mat, tempmat, diff_mat);
+ }
}
}
}
@@ -395,7 +419,7 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
/* ------------ General Target Matrix Tools ---------- */
/* function that sets the given matrix based on given vertex group in mesh */
-static void contarget_get_mesh_mat (Scene *scene, Object *ob, char *substring, float mat[][4])
+static void contarget_get_mesh_mat (Scene *scene, Object *ob, const char *substring, float mat[][4])
{
DerivedMesh *dm = NULL;
Mesh *me= ob->data;
@@ -500,7 +524,7 @@ static void contarget_get_mesh_mat (Scene *scene, Object *ob, char *substring, f
}
/* function that sets the given matrix based on given vertex group in lattice */
-static void contarget_get_lattice_mat (Object *ob, char *substring, float mat[][4])
+static void contarget_get_lattice_mat (Object *ob, const char *substring, float mat[][4])
{
Lattice *lt= (Lattice *)ob->data;
@@ -558,7 +582,7 @@ static void contarget_get_lattice_mat (Object *ob, char *substring, float mat[][
/* generic function to get the appropriate matrix for most target cases */
/* The cases where the target can be object data have not been implemented */
-static void constraint_target_to_mat4 (Scene *scene, Object *ob, char *substring, float mat[][4], short from, short to, float headtail)
+static void constraint_target_to_mat4 (Scene *scene, Object *ob, const char *substring, float mat[][4], short from, short to, float headtail)
{
/* Case OBJECT */
if (!strlen(substring)) {
@@ -655,7 +679,7 @@ static bConstraintTypeInfo CTI_CONSTRNAME = {
/* This function should be used for the get_target_matrix member of all
* constraints that are not picky about what happens to their target matrix.
*/
-static void default_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+static void default_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
if (VALID_CONS_TARGET(ct))
constraint_target_to_mat4(cob->scene, ct->tar, ct->subtarget, ct->matrix, CONSTRAINT_SPACE_WORLD, ct->space, con->headtail);
@@ -674,7 +698,7 @@ static void default_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstrain
ct= MEM_callocN(sizeof(bConstraintTarget), "tempConstraintTarget"); \
\
ct->tar= datatar; \
- strcpy(ct->subtarget, datasubtarget); \
+ BLI_strncpy(ct->subtarget, datasubtarget, sizeof(ct->subtarget)); \
ct->space= con->tarspace; \
ct->flag= CONSTRAINT_TAR_TEMP; \
\
@@ -810,57 +834,75 @@ static void childof_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
/* only evaluate if there is a target */
if (VALID_CONS_TARGET(ct)) {
- float parmat[4][4], invmat[4][4], tempmat[4][4];
- float loc[3], eul[3], size[3];
- float loco[3], eulo[3], sizo[3];
+ float parmat[4][4];
- /* get offset (parent-inverse) matrix */
- copy_m4_m4(invmat, data->invmat);
-
- /* extract components of both matrices */
- copy_v3_v3(loc, ct->matrix[3]);
- mat4_to_eulO(eul, ct->rotOrder, ct->matrix);
- mat4_to_size(size, ct->matrix);
-
- copy_v3_v3(loco, invmat[3]);
- mat4_to_eulO(eulo, cob->rotOrder, invmat);
- mat4_to_size(sizo, invmat);
-
- /* disable channels not enabled */
- if (!(data->flag & CHILDOF_LOCX)) loc[0]= loco[0]= 0.0f;
- if (!(data->flag & CHILDOF_LOCY)) loc[1]= loco[1]= 0.0f;
- if (!(data->flag & CHILDOF_LOCZ)) loc[2]= loco[2]= 0.0f;
- if (!(data->flag & CHILDOF_ROTX)) eul[0]= eulo[0]= 0.0f;
- if (!(data->flag & CHILDOF_ROTY)) eul[1]= eulo[1]= 0.0f;
- if (!(data->flag & CHILDOF_ROTZ)) eul[2]= eulo[2]= 0.0f;
- if (!(data->flag & CHILDOF_SIZEX)) size[0]= sizo[0]= 1.0f;
- if (!(data->flag & CHILDOF_SIZEY)) size[1]= sizo[1]= 1.0f;
- if (!(data->flag & CHILDOF_SIZEZ)) size[2]= sizo[2]= 1.0f;
-
- /* make new target mat and offset mat */
- loc_eulO_size_to_mat4(ct->matrix, loc, eul, size, ct->rotOrder);
- loc_eulO_size_to_mat4(invmat, loco, eulo, sizo, cob->rotOrder);
-
- /* multiply target (parent matrix) by offset (parent inverse) to get
- * the effect of the parent that will be exherted on the owner
- */
- mul_m4_m4m4(parmat, invmat, ct->matrix);
-
- /* now multiply the parent matrix by the owner matrix to get the
- * the effect of this constraint (i.e. owner is 'parented' to parent)
- */
- copy_m4_m4(tempmat, cob->matrix);
- mul_m4_m4m4(cob->matrix, tempmat, parmat);
-
- /* without this, changes to scale and rotation can change location
- * of a parentless bone or a disconnected bone. Even though its set
- * to zero above. */
- if (!(data->flag & CHILDOF_LOCX)) cob->matrix[3][0]= tempmat[3][0];
- if (!(data->flag & CHILDOF_LOCY)) cob->matrix[3][1]= tempmat[3][1];
- if (!(data->flag & CHILDOF_LOCZ)) cob->matrix[3][2]= tempmat[3][2];
+ /* simple matrix parenting */
+ if(data->flag == CHILDOF_ALL) {
+
+ /* multiply target (parent matrix) by offset (parent inverse) to get
+ * the effect of the parent that will be exherted on the owner
+ */
+ mul_m4_m4m4(parmat, data->invmat, ct->matrix);
+
+ /* now multiply the parent matrix by the owner matrix to get the
+ * the effect of this constraint (i.e. owner is 'parented' to parent)
+ */
+ mul_m4_m4m4(cob->matrix, cob->matrix, parmat);
+ }
+ else {
+ float invmat[4][4], tempmat[4][4];
+ float loc[3], eul[3], size[3];
+ float loco[3], eulo[3], sizo[3];
+
+ /* get offset (parent-inverse) matrix */
+ copy_m4_m4(invmat, data->invmat);
+
+ /* extract components of both matrices */
+ copy_v3_v3(loc, ct->matrix[3]);
+ mat4_to_eulO(eul, ct->rotOrder, ct->matrix);
+ mat4_to_size(size, ct->matrix);
+
+ copy_v3_v3(loco, invmat[3]);
+ mat4_to_eulO(eulo, cob->rotOrder, invmat);
+ mat4_to_size(sizo, invmat);
+
+ /* disable channels not enabled */
+ if (!(data->flag & CHILDOF_LOCX)) loc[0]= loco[0]= 0.0f;
+ if (!(data->flag & CHILDOF_LOCY)) loc[1]= loco[1]= 0.0f;
+ if (!(data->flag & CHILDOF_LOCZ)) loc[2]= loco[2]= 0.0f;
+ if (!(data->flag & CHILDOF_ROTX)) eul[0]= eulo[0]= 0.0f;
+ if (!(data->flag & CHILDOF_ROTY)) eul[1]= eulo[1]= 0.0f;
+ if (!(data->flag & CHILDOF_ROTZ)) eul[2]= eulo[2]= 0.0f;
+ if (!(data->flag & CHILDOF_SIZEX)) size[0]= sizo[0]= 1.0f;
+ if (!(data->flag & CHILDOF_SIZEY)) size[1]= sizo[1]= 1.0f;
+ if (!(data->flag & CHILDOF_SIZEZ)) size[2]= sizo[2]= 1.0f;
+
+ /* make new target mat and offset mat */
+ loc_eulO_size_to_mat4(ct->matrix, loc, eul, size, ct->rotOrder);
+ loc_eulO_size_to_mat4(invmat, loco, eulo, sizo, cob->rotOrder);
+
+ /* multiply target (parent matrix) by offset (parent inverse) to get
+ * the effect of the parent that will be exherted on the owner
+ */
+ mul_m4_m4m4(parmat, invmat, ct->matrix);
+
+ /* now multiply the parent matrix by the owner matrix to get the
+ * the effect of this constraint (i.e. owner is 'parented' to parent)
+ */
+ copy_m4_m4(tempmat, cob->matrix);
+ mul_m4_m4m4(cob->matrix, tempmat, parmat);
+
+ /* without this, changes to scale and rotation can change location
+ * of a parentless bone or a disconnected bone. Even though its set
+ * to zero above. */
+ if (!(data->flag & CHILDOF_LOCX)) cob->matrix[3][0]= tempmat[3][0];
+ if (!(data->flag & CHILDOF_LOCY)) cob->matrix[3][1]= tempmat[3][1];
+ if (!(data->flag & CHILDOF_LOCZ)) cob->matrix[3][2]= tempmat[3][2];
+ }
}
}
+/* XXX note, con->flag should be CONSTRAINT_SPACEONCE for bone-childof, patched in readfile.c */
static bConstraintTypeInfo CTI_CHILDOF = {
CONSTRAINT_TYPE_CHILDOF, /* type */
sizeof(bChildOfConstraint), /* size */
@@ -1107,7 +1149,7 @@ static void kinematic_flush_tars (bConstraint *con, ListBase *list, short nocopy
}
}
-static void kinematic_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+static void kinematic_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
bKinematicConstraint *data= con->data;
@@ -1195,19 +1237,18 @@ static void followpath_flush_tars (bConstraint *con, ListBase *list, short nocop
}
}
-static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
bFollowPathConstraint *data= con->data;
if (VALID_CONS_TARGET(ct)) {
Curve *cu= ct->tar->data;
- float q[4], vec[4], dir[3], quat[4], radius, x1;
- float totmat[4][4];
+ float vec[4], dir[3], radius;
+ float totmat[4][4]= MAT4_UNITY;
float curvetime;
-
- unit_m4(totmat);
+
unit_m4(ct->matrix);
-
+
/* note: when creating constraints that follow path, the curve gets the CU_PATH set now,
* currently for paths to work it needs to go through the bevlist/displist system (ton)
*/
@@ -1217,7 +1258,8 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
makeDispListCurveTypes(cob->scene, ct->tar, 0);
if (cu->path && cu->path->data) {
- if ((data->followflag & FOLLOWPATH_STATIC) == 0) {
+ float quat[4];
+ if ((data->followflag & FOLLOWPATH_STATIC) == 0) {
/* animated position along curve depending on time */
if (cob->scene)
curvetime= bsystem_time(cob->scene, ct->tar, cu->ctime, 0.0) - data->offset;
@@ -1238,8 +1280,10 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
curvetime= data->offset_fac;
}
- if ( where_on_path(ct->tar, curvetime, vec, dir, NULL, &radius, NULL) ) {
+ if ( where_on_path(ct->tar, curvetime, vec, dir, (data->followflag & FOLLOWPATH_FOLLOW) ? quat : NULL, &radius, NULL) ) { /* quat_pt is quat or NULL*/
if (data->followflag & FOLLOWPATH_FOLLOW) {
+#if 0
+ float x1, q[4];
vec_to_quat(quat, dir, (short)data->trackflag, (short)data->upflag);
normalize_v3(dir);
@@ -1249,10 +1293,13 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
q[2]= -x1*dir[1];
q[3]= -x1*dir[2];
mul_qt_qtqt(quat, q, quat);
-
+#else
+ quat_apply_track(quat, data->trackflag, data->upflag);
+#endif
+
quat_to_mat4(totmat, quat);
}
-
+
if (data->followflag & FOLLOWPATH_RADIUS) {
float tmat[4][4], rmat[4][4];
scale_m4_fl(tmat, radius);
@@ -1324,7 +1371,7 @@ static bConstraintTypeInfo CTI_FOLLOWPATH = {
/* --------- Limit Location --------- */
-static void loclimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+static void loclimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *UNUSED(targets))
{
bLocLimitConstraint *data = con->data;
@@ -1372,7 +1419,7 @@ static bConstraintTypeInfo CTI_LOCLIMIT = {
/* -------- Limit Rotation --------- */
-static void rotlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+static void rotlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *UNUSED(targets))
{
bRotLimitConstraint *data = con->data;
float loc[3];
@@ -1381,9 +1428,9 @@ static void rotlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *t
copy_v3_v3(loc, cob->matrix[3]);
mat4_to_size(size, cob->matrix);
-
+
mat4_to_eulO(eul, cob->rotOrder, cob->matrix);
-
+
/* constraint data uses radians internally */
/* limiting of euler values... */
@@ -1431,7 +1478,7 @@ static bConstraintTypeInfo CTI_ROTLIMIT = {
/* --------- Limit Scaling --------- */
-static void sizelimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+static void sizelimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *UNUSED(targets))
{
bSizeLimitConstraint *data = con->data;
float obsize[3], size[3];
@@ -1825,7 +1872,7 @@ static void translike_flush_tars (bConstraint *con, ListBase *list, short nocopy
}
}
-static void translike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+static void translike_evaluate (bConstraint *UNUSED(con), bConstraintOb *cob, ListBase *targets)
{
bConstraintTarget *ct= targets->first;
@@ -1861,7 +1908,7 @@ static void samevolume_new_data (void *cdata)
data->volume = 1.0f;
}
-static void samevolume_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+static void samevolume_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *UNUSED(targets))
{
bSameVolumeConstraint *data= con->data;
@@ -1975,9 +2022,9 @@ static void pycon_id_looper (bConstraint *con, ConstraintIDFunc func, void *user
}
/* Whether this approach is maintained remains to be seen (aligorith) */
-static void pycon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+static void pycon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
bPythonConstraint *data= con->data;
#endif
@@ -1997,7 +2044,7 @@ static void pycon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintT
constraint_target_to_mat4(cob->scene, ct->tar, ct->subtarget, ct->matrix, CONSTRAINT_SPACE_WORLD, ct->space, con->headtail);
/* only execute target calculation if allowed */
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if (G.f & G_SCRIPT_AUTOEXEC)
BPY_pyconstraint_target(data, ct);
#endif
@@ -2008,7 +2055,8 @@ static void pycon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintT
static void pycon_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
{
-#ifdef DISABLE_PYTHON
+#ifndef WITH_PYTHON
+ (void)con; (void)cob; (void)targets; /* unused */
return;
#else
bPythonConstraint *data= con->data;
@@ -2026,8 +2074,8 @@ static void pycon_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targ
#endif
/* Now, run the actual 'constraint' function, which should only access the matrices */
- BPY_pyconstraint_eval(data, cob, targets);
-#endif /* DISABLE_PYTHON */
+ BPY_pyconstraint_exec(data, cob, targets);
+#endif /* WITH_PYTHON */
}
static bConstraintTypeInfo CTI_PYTHON = {
@@ -2099,7 +2147,7 @@ static void actcon_flush_tars (bConstraint *con, ListBase *list, short nocopy)
}
}
-static void actcon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+static void actcon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
extern void chan_calc_mat(bPoseChannel *chan);
bActionConstraint *data = con->data;
@@ -2190,7 +2238,7 @@ static void actcon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraint
}
}
-static void actcon_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+static void actcon_evaluate (bConstraint *UNUSED(con), bConstraintOb *cob, ListBase *targets)
{
bConstraintTarget *ct= targets->first;
@@ -2990,6 +3038,7 @@ static void rbj_id_looper (bConstraint *con, ConstraintIDFunc func, void *userda
/* target only */
func(con, (ID**)&data->tar, userdata);
+ func(con, (ID**)&data->child, userdata);
}
static int rbj_get_tars (bConstraint *con, ListBase *list)
@@ -3070,7 +3119,7 @@ static void clampto_flush_tars (bConstraint *con, ListBase *list, short nocopy)
}
}
-static void clampto_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+static void clampto_get_tarmat (bConstraint *UNUSED(con), bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
if (VALID_CONS_TARGET(ct)) {
Curve *cu= ct->tar->data;
@@ -3099,11 +3148,11 @@ static void clampto_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
/* only evaluate if there is a target and it is a curve */
if (VALID_CONS_TARGET(ct) && (ct->tar->type == OB_CURVE)) {
Curve *cu= data->tar->data;
- float obmat[4][4], targetMatrix[4][4], ownLoc[3];
+ float obmat[4][4], ownLoc[3];
float curveMin[3], curveMax[3];
+ float targetMatrix[4][4]= MAT4_UNITY;
copy_m4_m4(obmat, cob->matrix);
- unit_m4(targetMatrix);
copy_v3_v3(ownLoc, obmat[3]);
INIT_MINMAX(curveMin, curveMax)
@@ -3404,7 +3453,7 @@ static void shrinkwrap_flush_tars (bConstraint *con, ListBase *list, short nocop
}
-static void shrinkwrap_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+static void shrinkwrap_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
bShrinkwrapConstraint *scon = (bShrinkwrapConstraint *) con->data;
@@ -3416,12 +3465,11 @@ static void shrinkwrap_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
float dist;
SpaceTransform transform;
- DerivedMesh *target = object_get_derived_final(cob->scene, ct->tar, CD_MASK_BAREMESH);
+ DerivedMesh *target = object_get_derived_final(ct->tar);
BVHTreeRayHit hit;
BVHTreeNearest nearest;
- BVHTreeFromMesh treeData;
- memset(&treeData, 0, sizeof(treeData));
+ BVHTreeFromMesh treeData= {0};
nearest.index = -1;
nearest.dist = FLT_MAX;
@@ -3456,7 +3504,9 @@ static void shrinkwrap_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
BLI_bvhtree_find_nearest(treeData.tree, co, &nearest, treeData.nearest_callback, &treeData);
dist = len_v3v3(co, nearest.co);
- interp_v3_v3v3(co, co, nearest.co, (dist - scon->dist)/dist); /* linear interpolation */
+ if(dist != 0.0f) {
+ interp_v3_v3v3(co, co, nearest.co, (dist - scon->dist)/dist); /* linear interpolation */
+ }
space_transform_invert(&transform, co);
break;
@@ -3507,7 +3557,7 @@ static void shrinkwrap_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
}
}
-static void shrinkwrap_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+static void shrinkwrap_evaluate (bConstraint *UNUSED(con), bConstraintOb *cob, ListBase *targets)
{
bConstraintTarget *ct= targets->first;
@@ -3723,7 +3773,7 @@ static void splineik_flush_tars (bConstraint *con, ListBase *list, short nocopy)
}
}
-static void splineik_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+static void splineik_get_tarmat (bConstraint *UNUSED(con), bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
if (VALID_CONS_TARGET(ct)) {
Curve *cu= ct->tar->data;
@@ -3803,6 +3853,9 @@ static void pivotcon_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *t
float pivot[3], vec[3];
float rotMat[3][3];
+
+ /* pivot correction */
+ float axis[3], angle;
/* firstly, check if pivoting should take place based on the current rotation */
if (data->rotAxis != PIVOTCON_AXIS_NONE) {
@@ -3845,10 +3898,20 @@ static void pivotcon_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *t
// TODO: perhaps we might want to include scaling based on the pivot too?
copy_m3_m4(rotMat, cob->matrix);
normalize_m3(rotMat);
-
+
+
+ /* correct the pivot by the rotation axis otherwise the pivot translates when it shouldnt */
+ mat3_to_axis_angle(axis, &angle, rotMat);
+ if(angle) {
+ float dvec[3];
+ sub_v3_v3v3(vec, pivot, cob->matrix[3]);
+ project_v3_v3v3(dvec, vec, axis);
+ sub_v3_v3(pivot, dvec);
+ }
+
/* perform the pivoting... */
/* 1. take the vector from owner to the pivot */
- sub_v3_v3v3(vec, pivot, cob->matrix[3]);
+ sub_v3_v3v3(vec, cob->matrix[3], pivot);
/* 2. rotate this vector by the rotation of the object... */
mul_m3_v3(rotMat, vec);
/* 3. make the rotation in terms of the pivot now */
@@ -3882,7 +3945,7 @@ static bConstraintTypeInfo *constraintsTypeInfo[NUM_CONSTRAINT_TYPES];
static short CTI_INIT= 1; /* when non-zero, the list needs to be updated */
/* This function only gets called when CTI_INIT is non-zero */
-static void constraints_init_typeinfo () {
+static void constraints_init_typeinfo (void) {
constraintsTypeInfo[0]= NULL; /* 'Null' Constraint */
constraintsTypeInfo[1]= &CTI_CHILDOF; /* ChildOf Constraint */
constraintsTypeInfo[2]= &CTI_TRACKTO; /* TrackTo Constraint */
@@ -4085,6 +4148,21 @@ static bConstraint *add_new_constraint (Object *ob, bPoseChannel *pchan, const c
constraints_set_active(list, con);
}
+ /* set type+owner specific immutable settings */
+ // TODO: does action constraint need anything here - i.e. spaceonce?
+ switch (type) {
+ case CONSTRAINT_TYPE_CHILDOF:
+ {
+ /* if this constraint is being added to a posechannel, make sure
+ * the constraint gets evaluated in pose-space */
+ if (pchan) {
+ con->ownspace = CONSTRAINT_SPACE_POSE;
+ con->flag |= CONSTRAINT_SPACEONCE;
+ }
+ }
+ break;
+ }
+
return con;
}
@@ -4155,7 +4233,7 @@ void id_loop_constraints (ListBase *conlist, ConstraintIDFunc func, void *userda
/* ......... */
/* helper for copy_constraints(), to be used for making sure that ID's are valid */
-static void con_extern_cb(bConstraint *con, ID **idpoin, void *userdata)
+static void con_extern_cb(bConstraint *UNUSED(con), ID **idpoin, void *UNUSED(userData))
{
if (*idpoin && (*idpoin)->lib)
id_lib_extern(*idpoin);
@@ -4358,8 +4436,7 @@ void get_constraint_target_matrix (struct Scene *scene, bConstraint *con, int n,
void solve_constraints (ListBase *conlist, bConstraintOb *cob, float ctime)
{
bConstraint *con;
- float solution[4][4], delta[4][4];
- float oldmat[4][4], imat[4][4];
+ float oldmat[4][4];
float enf;
/* check that there is a valid constraint object to evaluate */
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index 7928424e47c..09321ddea81 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -46,7 +46,7 @@
#include "BKE_main.h"
#include "BKE_screen.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -64,6 +64,7 @@ struct bContext {
struct ARegion *region;
struct ARegion *menu;
struct bContextStore *store;
+ const char *operator_poll_msg; /* reason for poll failing */
} wm;
/* data context */
@@ -107,7 +108,7 @@ void CTX_free(bContext *C)
/* store */
-bContextStore *CTX_store_add(ListBase *contexts, char *name, PointerRNA *ptr)
+bContextStore *CTX_store_add(ListBase *contexts, const char *name, PointerRNA *ptr)
{
bContextStoreEntry *entry;
bContextStore *ctx, *lastctx;
@@ -178,7 +179,7 @@ void CTX_py_init_set(bContext *C, int value)
C->data.py_init= value;
}
-void *CTX_py_dict_get(bContext *C)
+void *CTX_py_dict_get(const bContext *C)
{
return C->data.py_context;
}
@@ -399,6 +400,16 @@ void CTX_wm_menu_set(bContext *C, ARegion *menu)
C->wm.menu= menu;
}
+void CTX_wm_operator_poll_msg_set(bContext *C, const char *msg)
+{
+ C->wm.operator_poll_msg= msg;
+}
+
+const char *CTX_wm_operator_poll_msg_get(bContext *C)
+{
+ return C->wm.operator_poll_msg;
+}
+
/* data context utility functions */
struct bContextDataResult {
@@ -414,10 +425,10 @@ static int ctx_data_get(bContext *C, const char *member, bContextDataResult *res
int ret= 0;
memset(result, 0, sizeof(bContextDataResult));
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if(CTX_py_dict_get(C)) {
- return BPY_context_get(C, member, result);
-// if (BPY_context_get(C, member, result))
+ return BPY_context_member_get(C, member, result);
+// if (BPY_context_member_get(C, member, result))
// return 1;
}
#endif
@@ -543,8 +554,7 @@ ListBase CTX_data_collection_get(const bContext *C, const char *member)
return result.list;
}
else {
- ListBase list;
- memset(&list, 0, sizeof(list));
+ ListBase list= {NULL, NULL};
return list;
}
}
@@ -763,7 +773,7 @@ int CTX_data_mode_enum(const bContext *C)
/* would prefer if we can use the enum version below over this one - Campbell */
/* must be aligned with above enum */
-static char *data_mode_strings[] = {
+static const char *data_mode_strings[] = {
"mesh_edit",
"curve_edit",
"surface_edit",
@@ -780,7 +790,7 @@ static char *data_mode_strings[] = {
"objectmode",
0
};
-char *CTX_data_mode_string(const bContext *C)
+const char *CTX_data_mode_string(const bContext *C)
{
return data_mode_strings[CTX_data_mode_enum(C)];
}
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 358dd1914e7..2678b077b66 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -35,8 +35,10 @@
#include <stdlib.h>
#include "MEM_guardedalloc.h"
+
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_curve_types.h"
#include "DNA_material_types.h"
@@ -57,7 +59,7 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_object.h"
-#include "BKE_utildefines.h" // VECCOPY
+
#include "ED_curve.h"
@@ -74,12 +76,22 @@ void unlink_curve(Curve *cu)
for(a=0; a<cu->totcol; a++) {
if(cu->mat[a]) cu->mat[a]->id.us--;
- cu->mat[a]= 0;
+ cu->mat[a]= NULL;
}
if(cu->vfont) cu->vfont->id.us--;
- cu->vfont= 0;
+ cu->vfont= NULL;
+
+ if(cu->vfontb) cu->vfontb->id.us--;
+ cu->vfontb= NULL;
+
+ if(cu->vfonti) cu->vfonti->id.us--;
+ cu->vfonti= NULL;
+
+ if(cu->vfontbi) cu->vfontbi->id.us--;
+ cu->vfontbi= NULL;
+
if(cu->key) cu->key->id.us--;
- cu->key= 0;
+ cu->key= NULL;
}
/* frees editcurve entirely */
@@ -120,7 +132,7 @@ void free_curve(Curve *cu)
if(cu->tb) MEM_freeN(cu->tb);
}
-Curve *add_curve(char *name, int type)
+Curve *add_curve(const char *name, int type)
{
Curve *cu;
@@ -129,7 +141,7 @@ Curve *add_curve(char *name, int type)
cu->size[0]= cu->size[1]= cu->size[2]= 1.0;
cu->flag= CU_FRONT|CU_BACK|CU_DEFORM_BOUNDS_OFF|CU_PATH_RADIUS;
cu->pathlen= 100;
- cu->resolu= cu->resolv= 12;
+ cu->resolu= cu->resolv= (type == OB_SURF) ? 4 : 12;
cu->width= 1.0;
cu->wordspace = 1.0;
cu->spacing= cu->linedist= 1.0;
@@ -145,7 +157,7 @@ Curve *add_curve(char *name, int type)
cu->vfont= cu->vfontb= cu->vfonti= cu->vfontbi= get_builtin_font();
cu->vfont->id.us+=4;
cu->str= MEM_mallocN(12, "str");
- strcpy(cu->str, "Text");
+ BLI_strncpy(cu->str, "Text", 12);
cu->len= cu->pos= 4;
cu->strinfo= MEM_callocN(12*sizeof(CharInfo), "strinfo new");
cu->totbox= cu->actbox= 1;
@@ -210,9 +222,12 @@ void make_local_curve(Curve *cu)
*/
if(cu->id.lib==0) return;
-
- if(cu->vfont) cu->vfont->id.lib= 0;
-
+
+ if(cu->vfont) cu->vfont->id.lib= NULL;
+ if(cu->vfontb) cu->vfontb->id.lib= NULL;
+ if(cu->vfonti) cu->vfonti->id.lib= NULL;
+ if(cu->vfontbi) cu->vfontbi->id.lib= NULL;
+
if(cu->id.us==1) {
cu->id.lib= 0;
cu->id.flag= LIB_LOCAL;
@@ -623,7 +638,7 @@ static void makecyclicknots(float *knots, short pnts, short order)
-void makeknots(Nurb *nu, short uv)
+static void makeknots(Nurb *nu, short uv)
{
if(nu->type == CU_NURBS) {
if(uv == 1) {
@@ -655,6 +670,16 @@ void makeknots(Nurb *nu, short uv)
}
}
+void nurbs_knot_calc_u(Nurb *nu)
+{
+ makeknots(nu, 1);
+}
+
+void nurbs_knot_calc_v(Nurb *nu)
+{
+ makeknots(nu, 2);
+}
+
static void basisNurb(float t, short order, short pnts, float *knots, float *basis, int *start, int *end)
{
float d, e;
@@ -718,16 +743,16 @@ static void basisNurb(float t, short order, short pnts, float *knots, float *bas
}
-void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride)
+void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride, int resolu, int resolv)
/* coord_array has to be 3*4*resolu*resolv in size, and zero-ed */
{
BPoint *bp;
float *basisu, *basis, *basisv, *sum, *fp, *in;
float u, v, ustart, uend, ustep, vstart, vend, vstep, sumdiv;
- int i, j, iofs, jofs, cycl, len, resolu, resolv;
+ int i, j, iofs, jofs, cycl, len, curu, curv;
int istart, iend, jsta, jen, *jstart, *jend, ratcomp;
- int totu = nu->pntsu*nu->resolu, totv = nu->pntsv*nu->resolv;
+ int totu = nu->pntsu*resolu, totv = nu->pntsv*resolv;
if(nu->knotsu==NULL || nu->knotsv==NULL) return;
if(nu->orderu>nu->pntsu) return;
@@ -784,9 +809,9 @@ void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride)
else cycl= 0;
v= vstart;
basis= basisv;
- resolv= totv;
- while(resolv--) {
- basisNurb(v, nu->orderv, (short)(nu->pntsv+cycl), nu->knotsv, basis, jstart+resolv, jend+resolv);
+ curv= totv;
+ while(curv--) {
+ basisNurb(v, nu->orderv, (short)(nu->pntsv+cycl), nu->knotsv, basis, jstart+curv, jend+curv);
basis+= KNOTSV(nu);
v+= vstep;
}
@@ -795,17 +820,17 @@ void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride)
else cycl= 0;
in= coord_array;
u= ustart;
- resolu= totu;
- while(resolu--) {
+ curu= totu;
+ while(curu--) {
basisNurb(u, nu->orderu, (short)(nu->pntsu+cycl), nu->knotsu, basisu, &istart, &iend);
basis= basisv;
- resolv= totv;
- while(resolv--) {
+ curv= totv;
+ while(curv--) {
- jsta= jstart[resolv];
- jen= jend[resolv];
+ jsta= jstart[curv];
+ jen= jend[curv];
/* calculate sum */
sumdiv= 0.0;
@@ -1033,10 +1058,13 @@ static void forward_diff_bezier_cotangent(float *p0, float *p1, float *p2, float
float *make_orco_surf(Object *ob)
{
+ /* Note: this function is used in convertblender only atm, so
+ * suppose nonzero curve's render resolution should always be used */
Curve *cu= ob->data;
Nurb *nu;
int a, b, tot=0;
int sizeu, sizev;
+ int resolu, resolv;
float *fp, *coord_array;
/* first calculate the size of the datablock */
@@ -1050,9 +1078,12 @@ float *make_orco_surf(Object *ob)
See also convertblender.c: init_render_surf()
*/
+
+ resolu= cu->resolu_ren ? cu->resolu_ren : nu->resolu;
+ resolv= cu->resolv_ren ? cu->resolv_ren : nu->resolv;
- sizeu = nu->pntsu*nu->resolu;
- sizev = nu->pntsv*nu->resolv;
+ sizeu = nu->pntsu*resolu;
+ sizev = nu->pntsv*resolv;
if (nu->flagu & CU_NURB_CYCLIC) sizeu++;
if (nu->flagv & CU_NURB_CYCLIC) sizev++;
if(nu->pntsv>1) tot+= sizeu * sizev;
@@ -1064,9 +1095,12 @@ float *make_orco_surf(Object *ob)
nu= cu->nurb.first;
while(nu) {
+ resolu= cu->resolu_ren ? cu->resolu_ren : nu->resolu;
+ resolv= cu->resolv_ren ? cu->resolv_ren : nu->resolv;
+
if(nu->pntsv>1) {
- sizeu = nu->pntsu*nu->resolu;
- sizev = nu->pntsv*nu->resolv;
+ sizeu = nu->pntsu*resolu;
+ sizev = nu->pntsv*resolv;
if (nu->flagu & CU_NURB_CYCLIC) sizeu++;
if (nu->flagv & CU_NURB_CYCLIC) sizev++;
@@ -1087,10 +1121,10 @@ float *make_orco_surf(Object *ob)
}
}
else {
- float *_tdata= MEM_callocN((nu->pntsu*nu->resolu) * (nu->pntsv*nu->resolv) *3*sizeof(float), "temp data");
+ float *_tdata= MEM_callocN((nu->pntsu*resolu) * (nu->pntsv*resolv) *3*sizeof(float), "temp data");
float *tdata= _tdata;
- makeNurbfaces(nu, tdata, 0);
+ makeNurbfaces(nu, tdata, 0, resolu, resolv);
for(b=0; b<sizeu; b++) {
int use_b= b;
@@ -1102,7 +1136,7 @@ float *make_orco_surf(Object *ob)
if (a==sizev-1 && (nu->flagv & CU_NURB_CYCLIC))
use_a= 0;
- tdata = _tdata + 3 * (use_b * (nu->pntsv*nu->resolv) + use_a);
+ tdata = _tdata + 3 * (use_b * (nu->pntsv*resolv) + use_a);
fp[0]= (tdata[0]-cu->loc[0])/cu->size[0];
fp[1]= (tdata[1]-cu->loc[1])/cu->size[1];
@@ -1180,8 +1214,8 @@ float *make_orco_curve(Scene *scene, Object *ob)
for (u=0; u<sizev; u++) {
for (v=0; v<sizeu; v++,fp+=3) {
if (cu->flag & CU_UV_ORCO) {
- fp[0]= 2.0f*u/(dl->parts-1) - 1.0f;
- fp[1]= 2.0f*v/(dl->nr-1) - 1.0f;
+ fp[0]= 2.0f*u/(sizev - 1) - 1.0f;
+ fp[1]= 2.0f*v/(sizeu - 1) - 1.0f;
fp[2]= 0.0;
} else {
float *vert;
@@ -1234,10 +1268,10 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp, int forRender)
makeDispListCurveTypes_forRender(scene, cu->bevobj, &bevdisp, NULL, 0);
dl= bevdisp.first;
} else {
- dl= bevcu->disp.first;
+ dl= cu->bevobj->disp.first;
if(dl==0) {
makeDispListCurveTypes(scene, cu->bevobj, 0);
- dl= bevcu->disp.first;
+ dl= cu->bevobj->disp.first;
}
}
@@ -1712,7 +1746,7 @@ static void bevel_list_smooth(BevList *bl, int smooth_iter)
if(bl->poly== -1) { /* check its not cyclic */
/* skip the first point */
- bevp0= bevp1;
+ /* bevp0= bevp1; */
bevp1= bevp2;
bevp2++;
nr--;
@@ -1743,7 +1777,7 @@ static void bevel_list_smooth(BevList *bl, int smooth_iter)
normalize_qt(bevp1->quat);
- bevp0= bevp1;
+ /* bevp0= bevp1; */ /* UNUSED */
bevp1= bevp2;
bevp2++;
}
@@ -1922,7 +1956,7 @@ static void make_bevel_list_3D_tangent(BevList *bl)
normalize_v3(cross_tmp);
tri_to_quat( bevp1->quat,zero, cross_tmp, bevp1->tan); /* XXX - could be faster */
- bevp0= bevp1;
+ /* bevp0= bevp1; */ /* UNUSED */
bevp1= bevp2;
bevp2++;
}
@@ -2874,38 +2908,41 @@ void switchdirectionNurb(Nurb *nu)
bp2--;
}
if(nu->type == CU_NURBS) {
- /* inverse knots */
- a= KNOTSU(nu);
- fp1= nu->knotsu;
- fp2= fp1+(a-1);
- a/= 2;
- while(fp1!=fp2 && a>0) {
- SWAP(float, *fp1, *fp2);
- a--;
- fp1++;
- fp2--;
- }
- /* and make in increasing order again */
- a= KNOTSU(nu);
- fp1= nu->knotsu;
- fp2=tempf= MEM_mallocN(sizeof(float)*a, "switchdirect");
- while(a--) {
- fp2[0]= fabs(fp1[1]-fp1[0]);
- fp1++;
- fp2++;
- }
-
- a= KNOTSU(nu)-1;
- fp1= nu->knotsu;
- fp2= tempf;
- fp1[0]= 0.0;
- fp1++;
- while(a--) {
- fp1[0]= fp1[-1]+fp2[0];
+ /* no knots for too short paths */
+ if(nu->knotsu) {
+ /* inverse knots */
+ a= KNOTSU(nu);
+ fp1= nu->knotsu;
+ fp2= fp1+(a-1);
+ a/= 2;
+ while(fp1!=fp2 && a>0) {
+ SWAP(float, *fp1, *fp2);
+ a--;
+ fp1++;
+ fp2--;
+ }
+ /* and make in increasing order again */
+ a= KNOTSU(nu);
+ fp1= nu->knotsu;
+ fp2=tempf= MEM_mallocN(sizeof(float)*a, "switchdirect");
+ while(a--) {
+ fp2[0]= fabs(fp1[1]-fp1[0]);
+ fp1++;
+ fp2++;
+ }
+
+ a= KNOTSU(nu)-1;
+ fp1= nu->knotsu;
+ fp2= tempf;
+ fp1[0]= 0.0;
fp1++;
- fp2++;
+ while(a--) {
+ fp1[0]= fp1[-1]+fp2[0];
+ fp1++;
+ fp2++;
+ }
+ MEM_freeN(tempf);
}
- MEM_freeN(tempf);
}
}
else {
@@ -2928,7 +2965,7 @@ void switchdirectionNurb(Nurb *nu)
}
-float (*curve_getVertexCos(Curve *cu, ListBase *lb, int *numVerts_r))[3]
+float (*curve_getVertexCos(Curve *UNUSED(cu), ListBase *lb, int *numVerts_r))[3]
{
int i, numVerts = *numVerts_r = count_curveverts(lb);
float *co, (*cos)[3] = MEM_mallocN(sizeof(*cos)*numVerts, "cu_vcos");
@@ -2956,7 +2993,7 @@ float (*curve_getVertexCos(Curve *cu, ListBase *lb, int *numVerts_r))[3]
return cos;
}
-void curve_applyVertexCos(Curve *cu, ListBase *lb, float (*vertexCos)[3])
+void curve_applyVertexCos(Curve *UNUSED(cu), ListBase *lb, float (*vertexCos)[3])
{
float *co = vertexCos[0];
Nurb *nu;
@@ -2981,7 +3018,7 @@ void curve_applyVertexCos(Curve *cu, ListBase *lb, float (*vertexCos)[3])
}
}
-float (*curve_getKeyVertexCos(Curve *cu, ListBase *lb, float *key))[3]
+float (*curve_getKeyVertexCos(Curve *UNUSED(cu), ListBase *lb, float *key))[3]
{
int i, numVerts = count_curveverts(lb);
float *co, (*cos)[3] = MEM_mallocN(sizeof(*cos)*numVerts, "cu_vcos");
@@ -3012,7 +3049,7 @@ float (*curve_getKeyVertexCos(Curve *cu, ListBase *lb, float *key))[3]
return cos;
}
-void curve_applyKeyVertexTilts(Curve *cu, ListBase *lb, float *key)
+void curve_applyKeyVertexTilts(Curve *UNUSED(cu), ListBase *lb, float *key)
{
Nurb *nu;
int i;
@@ -3024,7 +3061,7 @@ void curve_applyKeyVertexTilts(Curve *cu, ListBase *lb, float *key)
for(i=0; i<nu->pntsu; i++,bezt++) {
key+=3*3;
bezt->alfa= *key;
- key++;
+ key+=3;
}
}
else {
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 6321df659a0..6ba7268303a 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -34,6 +34,7 @@
#include <math.h>
#include <string.h>
+#include <assert.h>
#include "MEM_guardedalloc.h"
@@ -41,13 +42,18 @@
#include "DNA_ID.h"
#include "BLI_blenlib.h"
+#include "BLI_path_util.h"
#include "BLI_linklist.h"
+#include "BLI_math.h"
#include "BLI_mempool.h"
+#include "BLI_utildefines.h"
#include "BKE_customdata.h"
#include "BKE_customdata_file.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_utildefines.h"
+#include "BKE_multires.h"
/* number of layers to add when growing a CustomData object */
#define CUSTOMDATA_GROW 5
@@ -55,9 +61,9 @@
/********************* Layer type information **********************/
typedef struct LayerTypeInfo {
int size; /* the memory size of one element of this layer's data */
- char *structname; /* name of the struct used, for file writing */
+ const char *structname; /* name of the struct used, for file writing */
int structnum; /* number of structs per element, for file writing */
- char *defaultname; /* default layer name */
+ const char *defaultname; /* default layer name */
/* a function to copy count elements of this layer's data
* (deep copy if appropriate)
@@ -99,6 +105,11 @@ typedef struct LayerTypeInfo {
/* a function to determine file size */
size_t (*filesize)(CDataFile *cdf, void *data, int count);
+
+ /* a function to validate layer contents depending on
+ * sub-elements count
+ */
+ void (*validate)(void *source, int sub_elements);
} LayerTypeInfo;
static void layerCopy_mdeformvert(const void *source, void *dest,
@@ -144,7 +155,7 @@ static void linklist_free_simple(void *link)
}
static void layerInterp_mdeformvert(void **sources, float *weights,
- float *sub_weights, int count, void *dest)
+ float *UNUSED(sub_weights), int count, void *dest)
{
MDeformVert *dvert = dest;
LinkNode *dest_dw = NULL; /* a list of lists of MDeformWeight pointers */
@@ -202,7 +213,7 @@ static void layerInterp_mdeformvert(void **sources, float *weights,
static void layerInterp_msticky(void **sources, float *weights,
- float *sub_weights, int count, void *dest)
+ float *UNUSED(sub_weights), int count, void *dest)
{
float co[2], w;
MSticky *mst;
@@ -391,130 +402,149 @@ static void layerDefault_origspace_face(void *data, int count)
osf[i] = default_osf;
}
-#if 0
-/* Adapted from sculptmode.c */
-static void mdisps_bilinear(float out[3], float (*disps)[3], int st, float u, float v)
-{
- int x, y, x2, y2;
- const int st_max = st - 1;
- float urat, vrat, uopp;
- float d[4][3], d2[2][3];
-
- if(u < 0)
- u = 0;
- else if(u >= st)
- u = st_max;
- if(v < 0)
- v = 0;
- else if(v >= st)
- v = st_max;
-
- x = floor(u);
- y = floor(v);
- x2 = x + 1;
- y2 = y + 1;
-
- if(x2 >= st) x2 = st_max;
- if(y2 >= st) y2 = st_max;
-
- urat = u - x;
- vrat = v - y;
- uopp = 1 - urat;
-
- copy_v3_v3(d[0], disps[y * st + x]);
- copy_v3_v3(d[1], disps[y * st + x2]);
- copy_v3_v3(d[2], disps[y2 * st + x]);
- copy_v3_v3(d[3], disps[y2 * st + x2]);
- mul_v3_fl(d[0], uopp);
- mul_v3_fl(d[1], urat);
- mul_v3_fl(d[2], uopp);
- mul_v3_fl(d[3], urat);
-
- add_v3_v3v3(d2[0], d[0], d[1]);
- add_v3_v3v3(d2[1], d[2], d[3]);
- mul_v3_fl(d2[0], 1 - vrat);
- mul_v3_fl(d2[1], vrat);
-
- add_v3_v3v3(out, d2[0], d2[1]);
-}
-#endif
-
-static int mdisp_corners(MDisps *s)
-{
- /* silly trick because we don't get it from callback */
- return (s->totdisp % (3*3) == 0)? 3: 4;
-}
-
static void layerSwap_mdisps(void *data, const int *ci)
{
MDisps *s = data;
float (*d)[3] = NULL;
int corners, cornersize, S;
- /* this function is untested .. */
- corners = mdisp_corners(s);
- cornersize = s->totdisp/corners;
+ if(s->disps) {
+ int nverts= (ci[1] == 3) ? 4 : 3; /* silly way to know vertex count of face */
+ corners= multires_mdisp_corners(s);
+ cornersize= s->totdisp/corners;
- d = MEM_callocN(sizeof(float) * 3 * s->totdisp, "mdisps swap");
+ if(corners!=nverts) {
+ /* happens when face changed vertex count in edit mode
+ if it happened, just forgot displacement */
- for(S = 0; S < corners; S++)
- memcpy(d + cornersize*S, s->disps + cornersize*ci[S], cornersize*3*sizeof(float));
-
- if(s->disps)
+ MEM_freeN(s->disps);
+ s->totdisp= (s->totdisp/corners)*nverts;
+ s->disps= MEM_callocN(s->totdisp*sizeof(float)*3, "mdisp swap");
+ return;
+ }
+
+ d= MEM_callocN(sizeof(float) * 3 * s->totdisp, "mdisps swap");
+
+ for(S = 0; S < corners; S++)
+ memcpy(d + cornersize*S, s->disps + cornersize*ci[S], cornersize*3*sizeof(float));
+
MEM_freeN(s->disps);
- s->disps = d;
+ s->disps= d;
+ }
}
-static void layerInterp_mdisps(void **sources, float *weights, float *sub_weights,
- int count, void *dest)
+static void layerInterp_mdisps(void **sources, float *UNUSED(weights),
+ float *sub_weights, int count, void *dest)
{
- // XXX
-#if 0
MDisps *d = dest;
MDisps *s = NULL;
int st, stl;
int i, x, y;
- float crn[4][2];
- float (*sw)[4] = NULL;
+ int side, S, dst_corners, src_corners;
+ float crn_weight[4][2];
+ float (*sw)[4] = (void*)sub_weights;
+ float (*disps)[3], (*out)[3];
- /* Initialize the destination */
- for(i = 0; i < d->totdisp; ++i) {
- float z[3] = {0,0,0};
- copy_v3_v3(d->disps[i], z);
+ /* happens when flipping normals of newly created mesh */
+ if(!d->totdisp)
+ return;
+
+ s = sources[0];
+ dst_corners = multires_mdisp_corners(d);
+ src_corners = multires_mdisp_corners(s);
+
+ if(sub_weights && count == 2 && src_corners == 3) {
+ src_corners = multires_mdisp_corners(sources[1]);
+
+ /* special case -- converting two triangles to quad */
+ if(src_corners == 3 && dst_corners == 4) {
+ MDisps tris[2];
+ int vindex[4] = {0};
+
+ S = 0;
+ for(i = 0; i < 2; i++)
+ for(y = 0; y < 4; y++)
+ for(x = 0; x < 4; x++)
+ if(sw[x+i*4][y])
+ vindex[x] = y;
+
+ for(i = 0; i < 2; i++) {
+ float sw[4][4] = {{0}};
+ int a = 7 & ~(1 << vindex[i*2] | 1 << vindex[i*2+1]);
+
+ sw[0][vindex[i*2+1]] = 1;
+ sw[1][vindex[i*2]] = 1;
+
+ for(x = 0; x < 3; x++)
+ if(a & (1 << x))
+ sw[2][x] = 1;
+
+ tris[i] = *((MDisps*)sources[i]);
+ tris[i].disps = MEM_dupallocN(tris[i].disps);
+ layerInterp_mdisps(&sources[i], NULL, (float*)sw, 1, &tris[i]);
+ }
+
+ mdisp_join_tris(d, &tris[0], &tris[1]);
+
+ for(i = 0; i < 2; i++)
+ MEM_freeN(tris[i].disps);
+
+ return;
+ }
}
/* For now, some restrictions on the input */
- if(count != 1 || !sub_weights) return;
+ if(count != 1 || !sub_weights) {
+ for(i = 0; i < d->totdisp; ++i)
+ zero_v3(d->disps[i]);
- st = sqrt(d->totdisp);
+ return;
+ }
+
+ /* Initialize the destination */
+ out = disps = MEM_callocN(3*d->totdisp*sizeof(float), "iterp disps");
+
+ side = sqrt(d->totdisp / dst_corners);
+ st = (side<<1)-1;
stl = st - 1;
- sw = (void*)sub_weights;
+ sw= (void*)sub_weights;
for(i = 0; i < 4; ++i) {
- crn[i][0] = 0 * sw[i][0] + stl * sw[i][1] + stl * sw[i][2] + 0 * sw[i][3];
- crn[i][1] = 0 * sw[i][0] + 0 * sw[i][1] + stl * sw[i][2] + stl * sw[i][3];
+ crn_weight[i][0] = 0 * sw[i][0] + stl * sw[i][1] + stl * sw[i][2] + 0 * sw[i][3];
+ crn_weight[i][1] = 0 * sw[i][0] + 0 * sw[i][1] + stl * sw[i][2] + stl * sw[i][3];
}
- s = sources[0];
- for(y = 0; y < st; ++y) {
- for(x = 0; x < st; ++x) {
- /* One suspects this code could be cleaner. */
- float xl = (float)x / (st - 1);
- float yl = (float)y / (st - 1);
- float mid1[2] = {crn[0][0] * (1 - xl) + crn[1][0] * xl,
- crn[0][1] * (1 - xl) + crn[1][1] * xl};
- float mid2[2] = {crn[3][0] * (1 - xl) + crn[2][0] * xl,
- crn[3][1] * (1 - xl) + crn[2][1] * xl};
- float mid3[2] = {mid1[0] * (1 - yl) + mid2[0] * yl,
- mid1[1] * (1 - yl) + mid2[1] * yl};
-
- float srcdisp[3];
-
- mdisps_bilinear(srcdisp, s->disps, st, mid3[0], mid3[1]);
- copy_v3_v3(d->disps[y * st + x], srcdisp);
+ multires_mdisp_smooth_bounds(s);
+
+ out = disps;
+ for(S = 0; S < dst_corners; S++) {
+ float base[2], axis_x[2], axis_y[2];
+
+ mdisp_apply_weight(S, dst_corners, 0, 0, st, crn_weight, &base[0], &base[1]);
+ mdisp_apply_weight(S, dst_corners, side-1, 0, st, crn_weight, &axis_x[0], &axis_x[1]);
+ mdisp_apply_weight(S, dst_corners, 0, side-1, st, crn_weight, &axis_y[0], &axis_y[1]);
+
+ sub_v2_v2(axis_x, base);
+ sub_v2_v2(axis_y, base);
+ normalize_v2(axis_x);
+ normalize_v2(axis_y);
+
+ for(y = 0; y < side; ++y) {
+ for(x = 0; x < side; ++x, ++out) {
+ int crn;
+ float face_u, face_v, crn_u, crn_v;
+
+ mdisp_apply_weight(S, dst_corners, x, y, st, crn_weight, &face_u, &face_v);
+ crn = mdisp_rot_face_to_crn(src_corners, st, face_u, face_v, &crn_u, &crn_v);
+
+ old_mdisps_bilinear((*out), &s->disps[crn*side*side], side, crn_u, crn_v);
+ mdisp_flip_disp(crn, dst_corners, axis_x, axis_y, *out);
+ }
}
}
-#endif
+
+ MEM_freeN(d->disps);
+ d->disps = disps;
}
static void layerCopy_mdisps(const void *source, void *dest, int count)
@@ -536,7 +566,21 @@ static void layerCopy_mdisps(const void *source, void *dest, int count)
}
}
-static void layerFree_mdisps(void *data, int count, int size)
+static void layerValidate_mdisps(void *data, int sub_elements)
+{
+ MDisps *disps = data;
+ if(disps->disps) {
+ int corners = multires_mdisp_corners(disps);
+
+ if(corners != sub_elements) {
+ MEM_freeN(disps->disps);
+ disps->totdisp = disps->totdisp / corners * sub_elements;
+ disps->disps = MEM_callocN(3*disps->totdisp*sizeof(float), "layerValidate_mdisps");
+ }
+ }
+}
+
+static void layerFree_mdisps(void *data, int count, int UNUSED(size))
{
int i;
MDisps *d = data;
@@ -582,7 +626,7 @@ static int layerWrite_mdisps(CDataFile *cdf, void *data, int count)
return 1;
}
-static size_t layerFilesize_mdisps(CDataFile *cdf, void *data, int count)
+static size_t layerFilesize_mdisps(CDataFile *UNUSED(cdf), void *data, int count)
{
MDisps *d = data;
size_t size = 0;
@@ -787,7 +831,8 @@ const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
{sizeof(MLoopCol), "MLoopCol", 1, "Col", NULL, NULL, layerInterp_mloopcol, NULL, layerDefault_mloopcol},
{sizeof(float)*3*4, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
{sizeof(MDisps), "MDisps", 1, NULL, layerCopy_mdisps,
- layerFree_mdisps, layerInterp_mdisps, layerSwap_mdisps, NULL, layerRead_mdisps, layerWrite_mdisps, layerFilesize_mdisps},
+ layerFree_mdisps, layerInterp_mdisps, layerSwap_mdisps, NULL, layerRead_mdisps, layerWrite_mdisps,
+ layerFilesize_mdisps, layerValidate_mdisps},
{sizeof(MCol)*4, "MCol", 4, "WeightCol", NULL, NULL, layerInterp_mcol,
layerSwap_mcol, layerDefault_mcol},
{sizeof(MCol)*4, "MCol", 4, "IDCol", NULL, NULL, layerInterp_mcol,
@@ -849,13 +894,13 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data,
void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
CustomDataMask mask, int alloctype, int totelem)
{
- const LayerTypeInfo *typeInfo;
+ /*const LayerTypeInfo *typeInfo;*/
CustomDataLayer *layer, *newlayer;
int i, type, number = 0, lasttype = -1, lastactive = 0, lastrender = 0, lastclone = 0, lastmask = 0, lastflag = 0;
for(i = 0; i < source->totlayer; ++i) {
layer = &source->layers[i];
- typeInfo = layerType_getInfo(layer->type);
+ /*typeInfo = layerType_getInfo(layer->type);*/ /*UNUSED*/
type = layer->type;
@@ -967,7 +1012,7 @@ int CustomData_get_layer_index(const CustomData *data, int type)
return -1;
}
-int CustomData_get_named_layer_index(const CustomData *data, int type, char *name)
+int CustomData_get_named_layer_index(const CustomData *data, int type, const char *name)
{
int i;
@@ -1213,9 +1258,8 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data,
data->layers[index].type = type;
data->layers[index].flag = flag;
data->layers[index].data = newlayerdata;
-
if(name || (name=typeInfo->defaultname)) {
- strcpy(data->layers[index].name, name);
+ BLI_strncpy(data->layers[index].name, name, 32);
CustomData_set_layer_unique_name(data, index);
}
else
@@ -1354,7 +1398,7 @@ void *CustomData_duplicate_referenced_layer(struct CustomData *data, int type)
}
void *CustomData_duplicate_referenced_layer_named(struct CustomData *data,
- int type, char *name)
+ int type, const char *name)
{
CustomDataLayer *layer;
int layer_index;
@@ -1586,7 +1630,7 @@ void *CustomData_get_layer_n(const CustomData *data, int type, int n)
}
void *CustomData_get_layer_named(const struct CustomData *data, int type,
- char *name)
+ const char *name)
{
int layer_index = CustomData_get_named_layer_index(data, type, name);
if(layer_index < 0) return NULL;
@@ -1712,6 +1756,18 @@ void CustomData_em_copy_data(const CustomData *source, CustomData *dest,
}
}
+void CustomData_em_validate_data(CustomData *data, void *block, int sub_elements)
+{
+ int i;
+ for(i = 0; i < data->totlayer; i++) {
+ const LayerTypeInfo *typeInfo = layerType_getInfo(data->layers[i].type);
+ char *leayer_data = (char*)block + data->layers[i].offset;
+
+ if(typeInfo->validate)
+ typeInfo->validate(leayer_data, sub_elements);
+ }
+}
+
void *CustomData_em_get(const CustomData *data, void *block, int type)
{
int layer_index;
@@ -2195,7 +2251,7 @@ void CustomData_from_bmesh_block(const CustomData *source, CustomData *dest,
}
-void CustomData_file_write_info(int type, char **structname, int *structnum)
+void CustomData_file_write_info(int type, const char **structname, int *structnum)
{
const LayerTypeInfo *typeInfo = layerType_getInfo(type);
@@ -2222,69 +2278,50 @@ static int CustomData_is_property_layer(int type)
return 0;
}
-void CustomData_set_layer_unique_name(CustomData *data, int index)
+static int cd_layer_find_dupe(CustomData *data, const char *name, int type, int index)
{
- char tempname[64];
- int number, i, type;
- char *dot, *name;
- CustomDataLayer *layer, *nlayer= &data->layers[index];
- const LayerTypeInfo *typeInfo= layerType_getInfo(nlayer->type);
-
- if (!typeInfo->defaultname)
- return;
-
- type = nlayer->type;
- name = nlayer->name;
-
- if (name[0] == '\0')
- BLI_strncpy(nlayer->name, typeInfo->defaultname, sizeof(nlayer->name));
-
+ int i;
/* see if there is a duplicate */
for(i=0; i<data->totlayer; i++) {
- layer = &data->layers[i];
-
- if(CustomData_is_property_layer(type)){
- if(i!=index && CustomData_is_property_layer(layer->type) &&
- strcmp(layer->name, name)==0)
- break;
-
- }
- else{
- if(i!=index && layer->type==type && strcmp(layer->name, name)==0)
- break;
- }
- }
-
- if(i == data->totlayer)
- return;
-
- /* strip off the suffix */
- dot = strchr(nlayer->name, '.');
- if(dot) *dot=0;
-
- for(number=1; number <=999; number++) {
- sprintf(tempname, "%s.%03d", nlayer->name, number);
-
- for(i=0; i<data->totlayer; i++) {
- layer = &data->layers[i];
+ if(i != index) {
+ CustomDataLayer *layer= &data->layers[i];
- if(CustomData_is_property_layer(type)){
- if(i!=index && CustomData_is_property_layer(layer->type) &&
- strcmp(layer->name, tempname)==0)
-
- break;
+ if(CustomData_is_property_layer(type)) {
+ if(CustomData_is_property_layer(layer->type) && strcmp(layer->name, name)==0) {
+ return 1;
+ }
}
else{
- if(i!=index && layer->type==type && strcmp(layer->name, tempname)==0)
- break;
+ if(i!=index && layer->type==type && strcmp(layer->name, name)==0) {
+ return 1;
+ }
}
}
+ }
+
+ return 0;
+}
- if(i == data->totlayer) {
- BLI_strncpy(nlayer->name, tempname, sizeof(nlayer->name));
- return;
- }
- }
+static int customdata_unique_check(void *arg, const char *name)
+{
+ struct {CustomData *data; int type; int index;} *data_arg= arg;
+ return cd_layer_find_dupe(data_arg->data, name, data_arg->type, data_arg->index);
+}
+
+void CustomData_set_layer_unique_name(CustomData *data, int index)
+{
+ CustomDataLayer *nlayer= &data->layers[index];
+ const LayerTypeInfo *typeInfo= layerType_getInfo(nlayer->type);
+
+ struct {CustomData *data; int type; int index;} data_arg;
+ data_arg.data= data;
+ data_arg.type= nlayer->type;
+ data_arg.index= index;
+
+ if (!typeInfo->defaultname)
+ return;
+
+ BLI_uniquename_cb(customdata_unique_check, &data_arg, typeInfo->defaultname, '.', nlayer->name, sizeof(nlayer->name));
}
int CustomData_verify_versions(struct CustomData *data, int index)
@@ -2317,13 +2354,13 @@ int CustomData_verify_versions(struct CustomData *data, int index)
static void customdata_external_filename(char filename[FILE_MAX], ID *id, CustomDataExternal *external)
{
- char *path = (id->lib)? id->lib->filepath: G.sce;
+ char *path = (id->lib)? id->lib->filepath: G.main->name;
BLI_strncpy(filename, external->filename, FILE_MAX);
BLI_path_abs(filename, path);
}
-void CustomData_external_reload(CustomData *data, ID *id, CustomDataMask mask, int totelem)
+void CustomData_external_reload(CustomData *data, ID *UNUSED(id), CustomDataMask mask, int totelem)
{
CustomDataLayer *layer;
const LayerTypeInfo *typeInfo;
@@ -2493,7 +2530,7 @@ void CustomData_external_write(CustomData *data, ID *id, CustomDataMask mask, in
cdf_free(cdf);
}
-void CustomData_external_add(CustomData *data, ID *id, int type, int totelem, const char *filename)
+void CustomData_external_add(CustomData *data, ID *UNUSED(id), int type, int UNUSED(totelem), const char *filename)
{
CustomDataExternal *external= data->external;
CustomDataLayer *layer;
diff --git a/source/blender/blenkernel/intern/customdata_file.c b/source/blender/blenkernel/intern/customdata_file.c
index 65a0d731beb..6fb79a0df28 100644
--- a/source/blender/blenkernel/intern/customdata_file.c
+++ b/source/blender/blenkernel/intern/customdata_file.c
@@ -28,10 +28,11 @@
#include "BLI_fileops.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BKE_customdata_file.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
+
/************************* File Format Definitions ***************************/
@@ -379,7 +380,7 @@ int cdf_write_open(CDataFile *cdf, char *filename)
return 1;
}
-int cdf_write_layer(CDataFile *cdf, CDataFileLayer *blay)
+int cdf_write_layer(CDataFile *UNUSED(cdf), CDataFileLayer *UNUSED(blay))
{
return 1;
}
diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c
index 91584b6236f..937681fcdc3 100644
--- a/source/blender/blenkernel/intern/deform.c
+++ b/source/blender/blenkernel/intern/deform.c
@@ -304,60 +304,35 @@ int defgroup_flip_index(Object *ob, int index, int use_default)
return (flip_index==-1 && use_default) ? index : flip_index;
}
-void defgroup_unique_name (bDeformGroup *dg, Object *ob)
+static int defgroup_find_name_dupe(const char *name, bDeformGroup *dg, Object *ob)
{
bDeformGroup *curdef;
- int number;
- int exists = 0;
- char tempname[64];
- char *dot;
- if (!ob)
- return;
-
- /* See if we are given an empty string */
- if (dg->name[0] == '\0') {
- /* give it default name first */
- strcpy (dg->name, "Group");
- }
-
- /* See if we even need to do this */
for (curdef = ob->defbase.first; curdef; curdef=curdef->next) {
if (dg!=curdef) {
- if (!strcmp(curdef->name, dg->name)) {
- exists = 1;
- break;
+ if (!strcmp(curdef->name, name)) {
+ return 1;
}
}
}
-
- if (!exists)
- return;
- /* Strip off the suffix */
- dot=strchr(dg->name, '.');
- if (dot)
- *dot=0;
-
- for (number = 1; number <=999; number++) {
- sprintf (tempname, "%s.%03d", dg->name, number);
-
- exists = 0;
- for (curdef=ob->defbase.first; curdef; curdef=curdef->next) {
- if (dg!=curdef) {
- if (!strcmp (curdef->name, tempname)) {
- exists = 1;
- break;
- }
- }
- }
- if (!exists) {
- BLI_strncpy (dg->name, tempname, 32);
- return;
- }
- }
+ return 0;
}
+static int defgroup_unique_check(void *arg, const char *name)
+{
+ struct {Object *ob; void *dg;} *data= arg;
+ return defgroup_find_name_dupe(name, data->dg, data->ob);
+}
+
+void defgroup_unique_name (bDeformGroup *dg, Object *ob)
+{
+ struct {Object *ob; void *dg;} data;
+ data.ob= ob;
+ data.dg= dg;
+
+ BLI_uniquename_cb(defgroup_unique_check, &data, "Group", '.', dg->name, sizeof(dg->name));
+}
/* finds the best possible flipped name. For renaming; check for unique names afterwards */
/* if strip_number: removes number extensions */
@@ -473,7 +448,7 @@ void flip_side_name (char *name, const char *from_name, int strip_number)
sprintf (name, "%s%s%s%s", prefix, replace, suffix, number);
}
-float defvert_find_weight(const struct MDeformVert *dvert, int group_num)
+float defvert_find_weight(const struct MDeformVert *dvert, const int group_num)
{
MDeformWeight *dw= defvert_find_index(dvert, group_num);
return dw ? dw->weight : 0.0f;
@@ -488,7 +463,7 @@ float defvert_array_find_weight_safe(const struct MDeformVert *dvert, int index,
}
-MDeformWeight *defvert_find_index(const MDeformVert *dvert, int defgroup)
+MDeformWeight *defvert_find_index(const MDeformVert *dvert, const int defgroup)
{
if(dvert && defgroup >= 0) {
MDeformWeight *dw = dvert->dw;
@@ -504,7 +479,7 @@ MDeformWeight *defvert_find_index(const MDeformVert *dvert, int defgroup)
/* Ensures that mv has a deform weight entry for the specified defweight group */
/* Note this function is mirrored in editmesh_tools.c, for use for editvertices */
-MDeformWeight *defvert_verify_index(MDeformVert *dv, int defgroup)
+MDeformWeight *defvert_verify_index(MDeformVert *dv, const int defgroup)
{
MDeformWeight *newdw;
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index 382c0690ae3..6db4e0ac081 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -29,7 +29,11 @@
#include <string.h>
#include <math.h>
+#include "MEM_guardedalloc.h"
+
#include "BLI_winstuff.h"
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
#include "DNA_anim_types.h"
#include "DNA_camera_types.h"
@@ -37,14 +41,11 @@
#include "DNA_lattice_types.h"
#include "DNA_key_types.h"
#include "DNA_mesh_types.h"
+#include "DNA_node_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_windowmanager_types.h"
-#include "MEM_guardedalloc.h"
-
-#include "BLI_ghash.h"
-
#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_effect.h"
@@ -52,7 +53,9 @@
#include "BKE_global.h"
#include "BKE_group.h"
#include "BKE_key.h"
+#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_node.h"
#include "BKE_mball.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
@@ -60,6 +63,7 @@
#include "BKE_pointcache.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
+#include "BKE_utildefines.h"
#include "depsgraph_private.h"
@@ -846,7 +850,7 @@ DagNode * dag_get_sub_node (DagForest *forest,void * fob)
return node;
}
-static void dag_add_parent_relation(DagForest *forest, DagNode *fob1, DagNode *fob2, short rel, char *name)
+static void dag_add_parent_relation(DagForest *UNUSED(forest), DagNode *fob1, DagNode *fob2, short rel, const char *name)
{
DagAdjList *itA = fob2->parent;
@@ -868,7 +872,7 @@ static void dag_add_parent_relation(DagForest *forest, DagNode *fob1, DagNode *f
fob2->parent = itA;
}
-void dag_add_relation(DagForest *forest, DagNode *fob1, DagNode *fob2, short rel, char *name)
+void dag_add_relation(DagForest *forest, DagNode *fob1, DagNode *fob2, short rel, const char *name)
{
DagAdjList *itA = fob1->child;
@@ -893,7 +897,7 @@ void dag_add_relation(DagForest *forest, DagNode *fob1, DagNode *fob2, short rel
fob1->child = itA;
}
-static char *dag_node_name(DagNode *node)
+static const char *dag_node_name(DagNode *node)
{
if(node->ob == NULL)
return "null";
@@ -938,7 +942,7 @@ static int dag_node_print_dependency_recurs(DagNode *node, DagNode *endnode)
return 0;
}
-static void dag_node_print_dependency_cycle(DagForest *dag, DagNode *startnode, DagNode *endnode, char *name)
+static void dag_node_print_dependency_cycle(DagForest *dag, DagNode *startnode, DagNode *endnode, const char *name)
{
DagNode *node;
@@ -1075,7 +1079,7 @@ void graph_bfs(void)
minheight = pos[node->BFS_dist];
itA = node->child;
while(itA != NULL) {
- if((itA->node->color == DAG_WHITE) ) {
+ if(itA->node->color == DAG_WHITE) {
itA->node->color = DAG_GRAY;
itA->node->BFS_dist = node->BFS_dist + 1;
itA->node->k = (float) minheight;
@@ -1222,7 +1226,7 @@ DagNodeQueue * graph_dfs(void)
itA = node->child;
while(itA != NULL) {
- if((itA->node->color == DAG_WHITE) ) {
+ if(itA->node->color == DAG_WHITE) {
itA->node->DFS_dvtm = time;
itA->node->color = DAG_GRAY;
@@ -1476,7 +1480,7 @@ struct DagNodeQueue *get_all_childs(struct DagForest *dag, void *ob)
itA = node->child;
while(itA != NULL) {
- if((itA->node->color == DAG_WHITE) ) {
+ if(itA->node->color == DAG_WHITE) {
itA->node->DFS_dvtm = time;
itA->node->color = DAG_GRAY;
@@ -1510,7 +1514,7 @@ short are_obs_related(struct DagForest *dag, void *ob1, void *ob2) {
itA = node->child;
while(itA != NULL) {
- if((itA->node->ob == ob2) ) {
+ if(itA->node->ob == ob2) {
return itA->node->type;
}
itA = itA->next;
@@ -1682,7 +1686,7 @@ void DAG_scene_sort(Main *bmain, Scene *sce)
itA = node->child;
while(itA != NULL) {
- if((itA->node->color == DAG_WHITE) ) {
+ if(itA->node->color == DAG_WHITE) {
itA->node->DFS_dvtm = time;
itA->node->color = DAG_GRAY;
@@ -1858,7 +1862,7 @@ static void flush_pointcache_reset(Scene *scene, DagNode *node, int curtime, int
for(itA = node->child; itA; itA= itA->next) {
if(itA->node->type==ID_OB) {
if(itA->node->lasttime!=curtime) {
- ob= (Object*)(node->ob);
+ ob= (Object*)(itA->node->ob);
if(reset || (ob->recalc & OB_RECALC_ALL)) {
if(BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_DEPSGRAPH))
@@ -1921,8 +1925,30 @@ static void dag_scene_flush_layers(Scene *sce, int lay)
flush_layer_node(sce, itA->node, lasttime);
}
+static void dag_tag_renderlayers(Scene *sce, unsigned int lay)
+{
+ if(sce->nodetree) {
+ bNode *node;
+ Base *base;
+ unsigned int lay_changed= 0;
+
+ for(base= sce->base.first; base; base= base->next)
+ if(base->lay & lay)
+ if(base->object->recalc)
+ lay_changed |= base->lay;
+
+ for(node= sce->nodetree->nodes.first; node; node= node->next) {
+ if(node->id==(ID *)sce) {
+ SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1);
+ if(srl && (srl->lay & lay_changed))
+ NodeTagChanged(sce->nodetree, node);
+ }
+ }
+ }
+}
+
/* flushes all recalc flags in objects down the dependency tree */
-void DAG_scene_flush_update(Main *bmain, Scene *sce, unsigned int lay, int time)
+void DAG_scene_flush_update(Main *bmain, Scene *sce, unsigned int lay, const short time)
{
DagNode *firstnode;
DagAdjList *itA;
@@ -1965,6 +1991,8 @@ void DAG_scene_flush_update(Main *bmain, Scene *sce, unsigned int lay, int time)
}
}
}
+
+ dag_tag_renderlayers(sce, lay);
}
static int object_modifiers_use_time(Object *ob)
@@ -2131,50 +2159,57 @@ static void dag_object_time_update_flags(Object *ob)
}
}
/* flag all objects that need recalc, for changes in time for example */
-void DAG_scene_update_flags(Main *bmain, Scene *scene, unsigned int lay)
+/* do_time: make this optional because undo resets objects to their animated locations without this */
+void DAG_scene_update_flags(Main *bmain, Scene *scene, unsigned int lay, const short do_time)
{
Base *base;
Object *ob;
Group *group;
GroupObject *go;
- Scene *sce;
-
+ Scene *sce_iter;
+
/* set ob flags where animated systems are */
- for(SETLOOPER(scene, base)) {
+ for(SETLOOPER(scene, sce_iter, base)) {
ob= base->object;
-
- /* now if DagNode were part of base, the node->lay could be checked... */
- /* we do all now, since the scene_flush checks layers and clears recalc flags even */
- dag_object_time_update_flags(ob);
-
+
+ if(do_time) {
+ /* now if DagNode were part of base, the node->lay could be checked... */
+ /* we do all now, since the scene_flush checks layers and clears recalc flags even */
+ dag_object_time_update_flags(ob);
+ }
+
/* handled in next loop */
- if(ob->dup_group)
+ if(ob->dup_group)
ob->dup_group->id.flag |= LIB_DOIT;
- }
-
- /* we do groups each once */
- for(group= bmain->group.first; group; group= group->id.next) {
- if(group->id.flag & LIB_DOIT) {
- for(go= group->gobject.first; go; go= go->next) {
- dag_object_time_update_flags(go->ob);
+ }
+
+ if(do_time) {
+ /* we do groups each once */
+ for(group= bmain->group.first; group; group= group->id.next) {
+ if(group->id.flag & LIB_DOIT) {
+ for(go= group->gobject.first; go; go= go->next) {
+ dag_object_time_update_flags(go->ob);
+ }
}
}
}
+
+ for(sce_iter= scene; sce_iter; sce_iter= sce_iter->set)
+ DAG_scene_flush_update(bmain, sce_iter, lay, 1);
- for(sce= scene; sce; sce= sce->set)
- DAG_scene_flush_update(bmain, sce, lay, 1);
-
- /* test: set time flag, to disable baked systems to update */
- for(SETLOOPER(scene, base)) {
- ob= base->object;
- if(ob->recalc)
- ob->recalc |= OB_RECALC_TIME;
+ if(do_time) {
+ /* test: set time flag, to disable baked systems to update */
+ for(SETLOOPER(scene, sce_iter, base)) {
+ ob= base->object;
+ if(ob->recalc)
+ ob->recalc |= OB_RECALC_TIME;
+ }
+
+ /* hrmf... an exception to look at once, for invisible camera object we do it over */
+ if(scene->camera)
+ dag_object_time_update_flags(scene->camera);
}
-
- /* hrmf... an exception to look at once, for invisible camera object we do it over */
- if(scene->camera)
- dag_object_time_update_flags(scene->camera);
-
+
/* and store the info in groupobject */
for(group= bmain->group.first; group; group= group->id.next) {
if(group->id.flag & LIB_DOIT) {
@@ -2230,9 +2265,9 @@ void DAG_ids_flush_update(Main *bmain, int time)
DAG_scene_flush_update(bmain, sce, lay, time);
}
-void DAG_on_load_update(Main *bmain)
+void DAG_on_load_update(Main *bmain, const short do_time)
{
- Scene *scene, *sce;
+ Scene *scene;
Base *base;
Object *ob;
Group *group;
@@ -2243,19 +2278,20 @@ void DAG_on_load_update(Main *bmain)
dag_current_scene_layers(bmain, &scene, &lay);
if(scene && scene->theDag) {
+ Scene *sce_iter;
/* derivedmeshes and displists are not saved to file so need to be
remade, tag them so they get remade in the scene update loop,
note armature poses or object matrices are preserved and do not
require updates, so we skip those */
dag_scene_flush_layers(scene, lay);
- for(SETLOOPER(scene, base)) {
+ for(SETLOOPER(scene, sce_iter, base)) {
ob= base->object;
- node= (sce->theDag)? dag_get_node(sce->theDag, ob): NULL;
+ node= (sce_iter->theDag)? dag_get_node(sce_iter->theDag, ob): NULL;
oblay= (node)? node->lay: ob->lay;
if(oblay & lay) {
- if(ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL))
+ if(ELEM6(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL, OB_LATTICE))
ob->recalc |= OB_RECALC_DATA;
if(ob->dup_group)
ob->dup_group->id.flag |= LIB_DOIT;
@@ -2265,7 +2301,7 @@ void DAG_on_load_update(Main *bmain)
for(group= bmain->group.first; group; group= group->id.next) {
if(group->id.flag & LIB_DOIT) {
for(go= group->gobject.first; go; go= go->next) {
- if(ELEM5(go->ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL))
+ if(ELEM6(go->ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL, OB_LATTICE))
go->ob->recalc |= OB_RECALC_DATA;
if(go->ob->proxy_from)
go->ob->recalc |= OB_RECALC_OB;
@@ -2276,11 +2312,11 @@ void DAG_on_load_update(Main *bmain)
}
/* now tag update flags, to ensure deformers get calculated on redraw */
- DAG_scene_update_flags(bmain, scene, lay);
+ DAG_scene_update_flags(bmain, scene, lay, do_time);
}
}
-static void dag_id_flush_update__isDependentTexture(void *userData, Object *ob, ID **idpoin)
+static void dag_id_flush_update__isDependentTexture(void *userData, Object *UNUSED(ob), ID **idpoin)
{
struct { ID *id; int is_dependent; } *data = userData;
@@ -2290,26 +2326,21 @@ static void dag_id_flush_update__isDependentTexture(void *userData, Object *ob,
}
}
-void DAG_id_flush_update(ID *id, short flag)
+static void dag_id_flush_update(Scene *sce, ID *id)
{
Main *bmain= G.main;
- Scene *sce;
Object *obt, *ob= NULL;
short idtype;
- unsigned int lay;
- dag_current_scene_layers(bmain, &sce, &lay);
-
- if(!id || !sce || !sce->theDag)
- return;
+ /* here we flush a few things before actual scene wide flush, mostly
+ due to only objects and not other datablocks being in the depsgraph */
/* set flags & pointcache for object */
if(GS(id->name) == ID_OB) {
ob= (Object*)id;
- ob->recalc |= (flag & OB_RECALC_ALL);
BKE_ptcache_object_reset(sce, ob, PTCACHE_RESET_DEPSGRAPH);
- if(flag & OB_RECALC_DATA) {
+ if(ob->recalc & OB_RECALC_DATA) {
/* all users of this ob->data should be checked */
id= ob->data;
@@ -2326,23 +2357,10 @@ void DAG_id_flush_update(ID *id, short flag)
idtype= GS(id->name);
if(ELEM7(idtype, ID_ME, ID_CU, ID_MB, ID_LA, ID_LT, ID_CA, ID_AR)) {
- int first_ob= 1;
for(obt=bmain->object.first; obt; obt= obt->id.next) {
if(!(ob && obt == ob) && obt->data == id) {
-
- /* try to avoid displist recalculation for linked curves */
- if (!first_ob && ELEM(obt->type, OB_CURVE, OB_SURF)) {
- /* if curve object has got derivedFinal it means this
- object has got constructive modifiers and object
- should be recalculated anyhow */
- if (!obt->derivedFinal)
- continue;
- }
-
obt->recalc |= OB_RECALC_DATA;
BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH);
-
- first_ob= 0;
}
}
}
@@ -2350,8 +2368,10 @@ void DAG_id_flush_update(ID *id, short flag)
/* set flags based on textures - can influence depgraph via modifiers */
if(idtype == ID_TE) {
for(obt=bmain->object.first; obt; obt= obt->id.next) {
- struct { ID *id; int is_dependent; } data = {id, 0};
-
+ struct { ID *id; int is_dependent; } data;
+ data.id= id;
+ data.is_dependent= 0;
+
modifiers_foreachIDLink(obt, dag_id_flush_update__isDependentTexture, &data);
if (data.is_dependent)
obt->recalc |= OB_RECALC_DATA;
@@ -2372,25 +2392,100 @@ void DAG_id_flush_update(ID *id, short flag)
/* set flags based on particle settings */
if(idtype == ID_PA) {
ParticleSystem *psys;
- for(obt=bmain->object.first; obt; obt= obt->id.next) {
- for(psys=obt->particlesystem.first; psys; psys=psys->next) {
- if(&psys->part->id == id) {
+ for(obt=bmain->object.first; obt; obt= obt->id.next)
+ for(psys=obt->particlesystem.first; psys; psys=psys->next)
+ if(&psys->part->id == id)
BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH);
- obt->recalc |= (flag & OB_RECALC_ALL);
- psys->recalc |= (flag & PSYS_RECALC);
- }
- }
- }
}
/* update editors */
dag_editors_update(bmain, id);
}
+}
+
+void DAG_ids_flush_tagged(Main *bmain)
+{
+ ListBase *lbarray[MAX_LIBARRAY];
+ Scene *sce;
+ unsigned int lay;
+ int a, have_tag = 0;
+
+ dag_current_scene_layers(bmain, &sce, &lay);
+
+ if(!sce || !sce->theDag)
+ return;
+
+ /* loop over all ID types */
+ a = set_listbasepointers(bmain, lbarray);
+
+ while(a--) {
+ ListBase *lb = lbarray[a];
+ ID *id = lb->first;
+
+ /* we tag based on first ID type character to avoid
+ looping over all ID's in case there are no tags */
+ if(id && bmain->id_tag_update[id->name[0]]) {
+ for(; id; id=id->next) {
+ if(id->flag & LIB_ID_RECALC) {
+ dag_id_flush_update(sce, id);
+ id->flag &= ~LIB_ID_RECALC;
+ }
+ }
+
+ have_tag = 1;
+ }
+ }
+
+ if(have_tag) {
+ /* clear tags */
+ memset(bmain->id_tag_update, 0, sizeof(bmain->id_tag_update));
+
+ /* flush changes to other objects */
+ DAG_scene_flush_update(bmain, sce, lay, 0);
+ }
+}
+
+void DAG_id_tag_update(ID *id, short flag)
+{
+ Main *bmain= G.main;
+
+ if(id==NULL) return;
+
+ /* tag ID for update */
+ id->flag |= LIB_ID_RECALC;
+ bmain->id_tag_update[id->name[0]] = 1;
- /* flush to other objects that depend on this one */
- DAG_scene_flush_update(bmain, sce, lay, 0);
+ /* flag is for objects and particle systems */
+ if(flag) {
+ Object *ob;
+ ParticleSystem *psys;
+ short idtype = GS(id->name);
+
+ if(idtype == ID_OB) {
+ /* only quick tag */
+ ob = (Object*)id;
+ ob->recalc |= (flag & OB_RECALC_ALL);
+ }
+ else if(idtype == ID_PA) {
+ /* this is weak still, should be done delayed as well */
+ for(ob=bmain->object.first; ob; ob=ob->id.next) {
+ for(psys=ob->particlesystem.first; psys; psys=psys->next) {
+ if(&psys->part->id == id) {
+ ob->recalc |= (flag & OB_RECALC_ALL);
+ psys->recalc |= (flag & PSYS_RECALC);
+ }
+ }
+ }
+ }
+ else {
+ /* disable because this is called on various ID types automatically.
+ * where printing warning is not useful. for now just ignore */
+ /* BLI_assert(!"invalid flag for this 'idtype'"); */
+ }
+ }
}
+#if 0 // UNUSED
/* recursively descends tree, each node only checked once */
/* node is checked to be of type object */
static int parent_check_node(DagNode *node, int curtime)
@@ -2420,68 +2515,7 @@ static int parent_check_node(DagNode *node, int curtime)
return DAG_WHITE;
}
-
-/* all nodes that influence this object get tagged, for calculating the exact
- position of this object at a given timeframe */
-void DAG_id_update_flags(ID *id)
-{
- Main *bmain= G.main;
- Scene *sce;
- DagNode *node;
- DagAdjList *itA;
- Object *ob;
- unsigned int lay;
-
- dag_current_scene_layers(bmain, &sce, &lay);
-
- if(!id || !sce || !sce->theDag)
- return;
-
- /* objects only currently */
- if(GS(id->name) != ID_OB)
- return;
-
- ob= (Object*)id;
-
- /* tag nodes unchecked */
- for(node = sce->theDag->DagNode.first; node; node= node->next)
- node->color = DAG_WHITE;
-
- node= dag_find_node(sce->theDag, ob);
-
- /* object not in scene? then handle group exception. needs to be dagged once too */
- if(node==NULL) {
- Group *group= NULL;
- while( (group = find_group(ob, group)) ) {
- GroupObject *go;
- /* primitive; tag all... this call helps building groups for particles */
- for(go= group->gobject.first; go; go= go->next)
- go->ob->recalc= OB_RECALC_ALL;
- }
- }
- else {
-
- node->color = DAG_GRAY;
-
- sce->theDag->time++;
- node= sce->theDag->DagNode.first;
- for(itA = node->child; itA; itA= itA->next) {
- if(itA->node->type==ID_OB && itA->node->lasttime!=sce->theDag->time)
- itA->node->color= parent_check_node(itA->node, sce->theDag->time);
- }
-
- /* set recalcs and flushes */
- DAG_scene_update_flags(bmain, sce, lay);
-
- /* now we clear recalcs, unless color is set */
- for(node = sce->theDag->DagNode.first; node; node= node->next) {
- if(node->type==ID_OB && node->color==DAG_WHITE) {
- Object *ob= node->ob;
- ob->recalc= 0;
- }
- }
- }
-}
+#endif
/* ******************* DAG FOR ARMATURE POSE ***************** */
@@ -2588,7 +2622,7 @@ void DAG_pose_sort(Object *ob)
itA = node->child;
while(itA != NULL) {
- if((itA->node->color == DAG_WHITE) ) {
+ if(itA->node->color == DAG_WHITE) {
itA->node->color = DAG_GRAY;
push_stack(nqueue,itA->node);
skip = 1;
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index d0336d9f786..3bb62f817cd 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -35,7 +35,6 @@
#include "MEM_guardedalloc.h"
-
#include "DNA_curve_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_scene_types.h"
@@ -45,6 +44,8 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_editVert.h"
+#include "BLI_scanfill.h"
+#include "BLI_utildefines.h"
#include "BKE_global.h"
#include "BKE_displist.h"
@@ -137,7 +138,7 @@ void copy_displist(ListBase *lbn, ListBase *lb)
{
DispList *dln, *dl;
- lbn->first= lbn->last= 0;
+ freedisplist(lbn);
dl= lb->first;
while(dl) {
@@ -149,7 +150,10 @@ void copy_displist(ListBase *lbn, ListBase *lb)
dln->index= MEM_dupallocN(dl->index);
dln->col1= MEM_dupallocN(dl->col1);
dln->col2= MEM_dupallocN(dl->col2);
-
+
+ if(dl->bevelSplitFlag)
+ dln->bevelSplitFlag= MEM_dupallocN(dl->bevelSplitFlag);
+
dl= dl->next;
}
}
@@ -289,7 +293,7 @@ static void init_fastshade_shadeinput(Render *re)
shi.combinedflag= -1;
}
-static Render *fastshade_get_render(Scene *scene)
+static Render *fastshade_get_render(Scene *UNUSED(scene))
{
// XXX 2.5: this crashes combined with previewrender
// due to global R so disabled for now
@@ -621,7 +625,6 @@ void shadeDispList(Scene *scene, Base *base)
Object *ob= base->object;
DispList *dl, *dlob;
Material *ma = NULL;
- Curve *cu;
Render *re;
float imat[3][3], mat[4][4], vec[3];
float *fp, *nor, n1[3];
@@ -655,8 +658,7 @@ void shadeDispList(Scene *scene, Base *base)
if (ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
/* now we need the normals */
- cu= ob->data;
- dl= cu->disp.first;
+ dl= ob->disp.first;
while(dl) {
extern Material defmaterial; /* material.c */
@@ -788,7 +790,7 @@ void reshadeall_displist(Scene *scene)
/* ****************** make displists ********************* */
-static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase)
+static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase, int forRender)
{
Nurb *nu;
DispList *dl;
@@ -801,7 +803,7 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase)
while(nu) {
if(nu->hide==0) {
- if(G.rendering && cu->resolu_ren!=0)
+ if(forRender && cu->resolu_ren!=0)
resolu= cu->resolu_ren;
else
resolu= nu->resolu;
@@ -979,7 +981,7 @@ void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
dl= dl->next;
}
- if(totvert && BLI_edgefill(0, 0)) { // XXX (obedit && obedit->actcol)?(obedit->actcol-1):0)) {
+ if(totvert && BLI_edgefill(0)) { // XXX (obedit && obedit->actcol)?(obedit->actcol-1):0)) {
/* count faces */
tot= 0;
@@ -1117,7 +1119,7 @@ static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase)
}
-static void curve_to_filledpoly(Curve *cu, ListBase *nurb, ListBase *dispbase)
+static void curve_to_filledpoly(Curve *cu, ListBase *UNUSED(nurb), ListBase *dispbase)
{
if(cu->flag & CU_3D) return;
@@ -1136,16 +1138,14 @@ static void curve_to_filledpoly(Curve *cu, ListBase *nurb, ListBase *dispbase)
*/
float calc_taper(Scene *scene, Object *taperobj, int cur, int tot)
{
- Curve *cu;
DispList *dl;
if(taperobj==NULL || taperobj->type!=OB_CURVE) return 1.0;
- cu= taperobj->data;
- dl= cu->disp.first;
+ dl= taperobj->disp.first;
if(dl==NULL) {
makeDispListCurveTypes(scene, taperobj, 0);
- dl= cu->disp.first;
+ dl= taperobj->disp.first;
}
if(dl) {
float fac= ((float)cur)/(float)(tot-1);
@@ -1202,6 +1202,8 @@ void makeDispListMBall(Scene *scene, Object *ob)
void makeDispListMBall_forRender(Scene *scene, Object *ob, ListBase *dispbase)
{
metaball_polygonize(scene, ob, dispbase);
+ tex_space_mball(ob);
+
object_deform_mball(ob, dispbase);
}
@@ -1218,10 +1220,20 @@ static ModifierData *curve_get_tesselate_point(Scene *scene, Object *ob, int for
preTesselatePoint = NULL;
for (; md; md=md->next) {
+ ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+
if (!modifier_isEnabled(scene, md, required_mode)) continue;
+ if (mti->type == eModifierTypeType_Constructive) return preTesselatePoint;
if (ELEM3(md->type, eModifierType_Hook, eModifierType_Softbody, eModifierType_MeshDeform)) {
- preTesselatePoint = md;
+ preTesselatePoint = md;
+
+ /* this modifiers are moving point of tesselation automatically
+ (some of them even can't be applied on tesselated curve), set flag
+ for incformation button in modifier's header */
+ md->mode |= eModifierMode_ApplyOnSpline;
+ } else if(md->mode&eModifierMode_ApplyOnSpline) {
+ preTesselatePoint = md;
}
}
@@ -1613,8 +1625,15 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase,
for (nu=nubase->first; nu; nu=nu->next) {
if(forRender || nu->hide==0) {
+ int resolu= nu->resolu, resolv= nu->resolv;
+
+ if(forRender){
+ if(cu->resolu_ren) resolu= cu->resolu_ren;
+ if(cu->resolv_ren) resolv= cu->resolv_ren;
+ }
+
if(nu->pntsv==1) {
- len= SEGMENTSU(nu)*nu->resolu;
+ len= SEGMENTSU(nu)*resolu;
dl= MEM_callocN(sizeof(DispList), "makeDispListsurf");
dl->verts= MEM_callocN(len*3*sizeof(float), "dlverts");
@@ -1633,10 +1652,10 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase,
if(nu->flagu & CU_NURB_CYCLIC) dl->type= DL_POLY;
else dl->type= DL_SEGM;
- makeNurbcurve(nu, data, NULL, NULL, NULL, nu->resolu, 3*sizeof(float));
+ makeNurbcurve(nu, data, NULL, NULL, NULL, resolu, 3*sizeof(float));
}
else {
- len= (nu->pntsu*nu->resolu) * (nu->pntsv*nu->resolv);
+ len= (nu->pntsu*resolu) * (nu->pntsv*resolv);
dl= MEM_callocN(sizeof(DispList), "makeDispListsurf");
dl->verts= MEM_callocN(len*3*sizeof(float), "dlverts");
@@ -1652,12 +1671,12 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase,
data= dl->verts;
dl->type= DL_SURF;
- dl->parts= (nu->pntsu*nu->resolu); /* in reverse, because makeNurbfaces works that way */
- dl->nr= (nu->pntsv*nu->resolv);
+ dl->parts= (nu->pntsu*resolu); /* in reverse, because makeNurbfaces works that way */
+ dl->nr= (nu->pntsv*resolv);
if(nu->flagv & CU_NURB_CYCLIC) dl->flag|= DL_CYCL_U; /* reverse too! */
if(nu->flagu & CU_NURB_CYCLIC) dl->flag|= DL_CYCL_V;
- makeNurbfaces(nu, data, 0);
+ makeNurbfaces(nu, data, 0, resolu, resolv);
/* gl array drawing: using indices */
displist_surf_indices(dl);
@@ -1665,6 +1684,11 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase,
}
}
+ /* make copy of 'undeformed" displist for texture space calculation
+ actually, it's not totally undeformed -- pre-tesselation modifiers are
+ already applied, thats how it worked for years, so keep for compatibility (sergey) */
+ copy_displist(&cu->disp, dispbase);
+
if (!forRender) {
tex_space_curve(cu);
}
@@ -1710,7 +1734,7 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
/* no bevel or extrude, and no width correction? */
if (!dlbev.first && cu->width==1.0f) {
- curve_to_displist(cu, nubase, dispbase);
+ curve_to_displist(cu, nubase, dispbase, forRender);
} else {
float widfac= cu->width-1.0;
BevList *bl= cu->bev.first;
@@ -1780,8 +1804,7 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
/* CU_2D conflicts with R_NOPUNOFLIP */
dl->rt= nu->flag & ~CU_2D;
- dl->bevelSplitFlag= MEM_callocN(sizeof(*dl->col2)*((bl->nr+0x1F)>>5), "col2");
- bevp= (BevPoint *)(bl+1);
+ dl->bevelSplitFlag= MEM_callocN(sizeof(*dl->col2)*((bl->nr+0x1F)>>5), "bevelSplitFlag");
/* for each point of poly make a bevel piece */
bevp= (BevPoint *)(bl+1);
@@ -1838,6 +1861,11 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
if(cu->flag & CU_PATH) calc_curvepath(ob);
+ /* make copy of 'undeformed" displist for texture space calculation
+ actually, it's not totally undeformed -- pre-tesselation modifiers are
+ already applied, thats how it worked for years, so keep for compatibility (sergey) */
+ copy_displist(&cu->disp, dispbase);
+
if (!forRender) {
tex_space_curve(cu);
}
@@ -1852,13 +1880,16 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco)
{
- Curve *cu = ob->data;
+ Curve *cu= ob->data;
ListBase *dispbase;
freedisplist(&(ob->disp));
- dispbase= &(cu->disp);
+ dispbase= &(ob->disp);
freedisplist(dispbase);
+ /* free displist used for textspace */
+ freedisplist(&cu->disp);
+
do_makeDispListCurveTypes(scene, ob, dispbase, &ob->derivedFinal, 0, forOrco);
if (ob->derivedFinal) {
@@ -1928,7 +1959,7 @@ static void boundbox_displist(Object *ob)
if(cu->bb==0) cu->bb= MEM_callocN(sizeof(BoundBox), "boundbox");
bb= cu->bb;
- dl= cu->disp.first;
+ dl= ob->disp.first;
while (dl) {
if(dl->type==DL_INDEX3) tot= dl->nr;
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 4860e7d8eed..a79a5fddf00 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -59,6 +59,7 @@
#include "BLI_listbase.h"
#include "BLI_noise.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "PIL_time.h"
@@ -86,7 +87,7 @@
#include "BKE_object.h"
#include "BKE_particle.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
+
#include "RE_render_ext.h"
#include "RE_shader_ext.h"
@@ -264,6 +265,9 @@ static void add_object_to_effectors(ListBase **effectors, Scene *scene, Effector
eff = new_effector_cache(scene, ob, NULL, ob->pd);
+ /* make sure imat is up to date */
+ invert_m4_m4(ob->imat, ob->obmat);
+
BLI_addtail(*effectors, eff);
}
static void add_particles_to_effectors(ListBase **effectors, Scene *scene, EffectorWeights *weights, Object *ob, ParticleSystem *psys, ParticleSystem *psys_src)
@@ -410,7 +414,7 @@ void pd_point_from_soft(Scene *scene, float *loc, float *vel, int index, Effecte
/************************************************/
// triangle - ray callback function
-static void eff_tri_ray_hit(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
+static void eff_tri_ray_hit(void *UNUSED(userData), int UNUSED(index), const BVHTreeRay *UNUSED(ray), BVHTreeRayHit *hit)
{
// whenever we hit a bounding box, we don't check further
hit->dist = -1;
@@ -429,7 +433,7 @@ static float eff_calc_visibility(ListBase *colliders, EffectorCache *eff, Effect
return visibility;
if(!colls)
- colls = get_collider_cache(eff->scene, NULL, NULL);
+ colls = get_collider_cache(eff->scene, eff->ob, NULL);
if(!colls)
return visibility;
@@ -515,7 +519,7 @@ static float falloff_func_rad(PartDeflect *pd, float fac)
return falloff_func(fac, pd->flag&PFIELD_USEMINR, pd->minrad, pd->flag&PFIELD_USEMAXR, pd->maxrad, pd->f_power_r);
}
-float effector_falloff(EffectorCache *eff, EffectorData *efd, EffectedPoint *point, EffectorWeights *weights)
+float effector_falloff(EffectorCache *eff, EffectorData *efd, EffectedPoint *UNUSED(point), EffectorWeights *weights)
{
float temp[3];
float falloff = weights ? weights->weight[0] * weights->weight[eff->pd->forcefield] : 1.0f;
@@ -625,7 +629,6 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
}
}
else if(eff->psys) {
- ParticleSimulationData sim = {eff->scene, eff->ob, eff->psys, NULL, NULL};
ParticleData *pa = eff->psys->particles + *efd->index;
ParticleKey state;
@@ -633,6 +636,11 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
if(eff->psys == point->psys && *efd->index == point->index)
;
else {
+ ParticleSimulationData sim= {0};
+ sim.scene= eff->scene;
+ sim.ob= eff->ob;
+ sim.psys= eff->psys;
+
/* TODO: time from actual previous calculated frame (step might not be 1) */
state.time = cfra - 1.0;
ret = psys_get_particle_state(&sim, *efd->index, &state, 0);
@@ -774,7 +782,7 @@ static void do_texture_effector(EffectorCache *eff, EffectorData *efd, EffectedP
}
if(eff->pd->flag & PFIELD_TEX_OBJECT) {
- mul_m4_v3(eff->ob->obmat, tex_co);
+ mul_m4_v3(eff->ob->imat, tex_co);
}
hasrgb = multitex_ext(eff->pd->tex, tex_co, NULL,NULL, 0, result);
diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c
index 9dac409226b..641313b564c 100644
--- a/source/blender/blenkernel/intern/exotic.c
+++ b/source/blender/blenkernel/intern/exotic.c
@@ -61,9 +61,11 @@
#include "DNA_camera_types.h"
#include "DNA_scene_types.h"
-#include "BKE_utildefines.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_storage.h"
+#include "BLI_utildefines.h"
+
#include "BKE_blender.h"
#include "BKE_global.h"
@@ -73,22 +75,22 @@
#include "BKE_object.h"
#include "BKE_material.h"
#include "BKE_report.h"
-
+#include "BKE_exotic.h"
#include "BKE_displist.h"
#include "BKE_DerivedMesh.h"
#include "BKE_curve.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
#include "zlib.h"
-static int is_dxf(char *str);
-static void dxf_read(Scene *scene, char *filename);
-static int is_stl(char *str);
+static int is_dxf(const char *str);
+static void dxf_read(Scene *scene, const char *filename);
+static int is_stl(const char *str);
-static int is_stl_ascii(char *str)
+static int is_stl_ascii(const char *str)
{
FILE *fpSTL;
char buffer[1000];
@@ -113,7 +115,7 @@ static int is_stl_ascii(char *str)
return 1;
}
-static int is_stl(char *str)
+static int is_stl(const char *str)
{
int i;
i = strlen(str) - 3;
@@ -189,7 +191,7 @@ static void mesh_add_normals_flags(Mesh *me)
}
}
-static void read_stl_mesh_binary(Scene *scene, char *str)
+static void read_stl_mesh_binary(Scene *scene, const char *str)
{
FILE *fpSTL;
Object *ob;
@@ -313,7 +315,7 @@ static void read_stl_mesh_binary(Scene *scene, char *str)
STLBAILOUT("Bad vertex!"); \
++totvert; \
}
-static void read_stl_mesh_ascii(Scene *scene, char *str)
+static void read_stl_mesh_ascii(Scene *scene, const char *str)
{
FILE *fpSTL;
char buffer[2048], *cp;
@@ -453,58 +455,53 @@ static void read_stl_mesh_ascii(Scene *scene, char *str)
/* ************************************************************ */
-int BKE_read_exotic(Scene *scene, char *name)
+int BKE_read_exotic(Scene *scene, const char *name)
{
int len;
gzFile gzfile;
- char str[32];
- int *s0 = (int*) str;
- int retval = 0;
+ char header[7];
+ int retval;
// make sure we're not trying to read a directory....
len= strlen(name);
- if (name[len-1] !='/' && name[len-1] != '\\') {
+ if (ELEM(name[len-1], '/', '\\')) {
+ retval= BKE_READ_EXOTIC_FAIL_PATH;
+ }
+ else {
gzfile = gzopen(name,"rb");
- if (NULL == gzfile ) {
- //XXX error("Can't open file: %s", name);
- retval= -1;
- } else {
- gzread(gzfile, str, 31);
+ if (gzfile == NULL) {
+ retval= BKE_READ_EXOTIC_FAIL_OPEN;
+ }
+ else {
+ len= gzread(gzfile, header, sizeof(header));
gzclose(gzfile);
-
- if ((*s0 != FORM) && (strncmp(str, "BLEN", 4) != 0) && !BLI_testextensie(name,".blend.gz")) {
-
+ if (len == sizeof(header) && strncmp(header, "BLENDER", 7) == 0) {
+ retval= BKE_READ_EXOTIC_OK_BLEND;
+ }
+ else {
//XXX waitcursor(1);
if(is_dxf(name)) {
dxf_read(scene, name);
- retval = 1;
+ retval= BKE_READ_EXOTIC_OK_OTHER;
}
else if(is_stl(name)) {
if (is_stl_ascii(name))
read_stl_mesh_ascii(scene, name);
else
read_stl_mesh_binary(scene, name);
- retval = 1;
+ retval= BKE_READ_EXOTIC_OK_OTHER;
}
-#ifndef DISABLE_PYTHON
- // TODO: this should not be in the kernel...
- else { // unknown format, call Python importloader
- if (BPY_call_importloader(name)) {
- retval = 1;
- } else {
- //XXX error("Unknown file type or error, check console");
- }
-
+ else {
+ retval= BKE_READ_EXOTIC_FAIL_FORMAT;
}
-#endif /* DISABLE_PYTHON */
//XXX waitcursor(0);
}
}
}
- return (retval);
+ return retval;
}
@@ -557,7 +554,7 @@ static int write_derivedmesh_stl(FILE *fpSTL, Object *ob, DerivedMesh *dm)
return numfacets;
}
-static int write_object_stl(FILE *fpSTL, Scene *scene, Object *ob, Mesh *me)
+static int write_object_stl(FILE *fpSTL, Scene *scene, Object *ob)
{
int numfacets = 0;
DerivedMesh *dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
@@ -572,7 +569,6 @@ static int write_object_stl(FILE *fpSTL, Scene *scene, Object *ob, Mesh *me)
void write_stl(Scene *scene, char *str)
{
Object *ob;
- Mesh *me;
Base *base;
FILE *fpSTL;
int numfacets = 0;
@@ -605,9 +601,8 @@ void write_stl(Scene *scene, char *str)
if (base->flag & SELECT) {
ob = base->object;
if (ob->type == OB_MESH) {
- me = ob->data;
- if (me)
- numfacets += write_object_stl(fpSTL, scene, ob, me);
+ if(ob->data)
+ numfacets += write_object_stl(fpSTL, scene, ob);
}
}
base= base->next;
@@ -978,7 +973,7 @@ static int all_digits(char *str)
return 1;
}
-static int dxf_get_layer_col(char *layer)
+static int dxf_get_layer_col(char *UNUSED(layer))
{
return 1;
}
@@ -1016,8 +1011,8 @@ static void myfgets(char *str, int len, FILE *fp)
/* three types of enters, \n \r and \r\n */
if(c == '\n') break;
if(c=='\r') {
- c= getc(dxf_fp); // read the linefeed from stream
- if(c != 10) ungetc(c, dxf_fp); // put back, if it's not one...
+ c= getc(fp); // read the linefeed from stream
+ if(c != 10) ungetc(c, fp); // put back, if it's not one...
break;
}
}
@@ -1070,7 +1065,7 @@ static char val[256];
static short error_exit=0;
static short hasbumped=0;
-static int is_dxf(char *str)
+static int is_dxf(const char *str)
{
dxf_line=0;
@@ -1172,10 +1167,10 @@ static void dxf_get_mesh(Scene *scene, Mesh** m, Object** o, int noob)
*o = add_object(scene, OB_MESH);
ob = *o;
- if (strlen(entname)) new_id(&G.main->object, (ID *)ob, entname);
- else if (strlen(layname)) new_id(&G.main->object, (ID *)ob, layname);
+ if (entname[0]) new_id(&G.main->object, (ID *)ob, entname);
+ else if (layname[0]) new_id(&G.main->object, (ID *)ob, layname);
- if (strlen(layname)) ob->lay= dxf_get_layer_num(scene, layname);
+ if (layname[0]) ob->lay= dxf_get_layer_num(scene, layname);
else ob->lay= scene->lay;
// not nice i know... but add_object() sets active base, which needs layer setting too (ton)
scene->basact->lay= ob->lay;
@@ -1194,8 +1189,8 @@ static void dxf_get_mesh(Scene *scene, Mesh** m, Object** o, int noob)
((ID *)me)->us=0;
- if (strlen(entname)) new_id(&G.main->mesh, (ID *)me, entname);
- else if (strlen(layname)) new_id(&G.main->mesh, (ID *)me, layname);
+ if (entname[0]) new_id(&G.main->mesh, (ID *)me, entname);
+ else if (layname[0]) new_id(&G.main->mesh, (ID *)me, layname);
vcenter = zerovec;
}
@@ -2208,7 +2203,7 @@ static void dxf_read_3dface(Scene *scene, int noob)
hasbumped=1;
}
-static void dxf_read(Scene *scene, char *filename)
+static void dxf_read(Scene *scene, const char *filename)
{
Mesh *lastMe = G.main->mesh.last;
@@ -2377,7 +2372,7 @@ static void dxf_read(Scene *scene, char *filename)
ob->dupon= 1; ob->dupoff= 0;
ob->dupsta= 1; ob->dupend= 100;
- ob->recalc= OB_RECALC_ALL; /* needed because of weird way of adding libdata directly */
+ ob->recalc= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME; /* needed because of weird way of adding libdata directly */
ob->data= obdata;
((ID*)ob->data)->us++;
@@ -2396,7 +2391,7 @@ static void dxf_read(Scene *scene, char *filename)
I leave it commented out here as warning (ton) */
//for (i=0; i<ob->totcol; i++) ob->mat[i]= ((Mesh*)ob->data)->mat[i];
- if (strlen(layname)) ob->lay= dxf_get_layer_num(scene, layname);
+ if (layname[0]) ob->lay= dxf_get_layer_num(scene, layname);
else ob->lay= scene->lay;
/* link to scene */
diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c
index 43f01199b69..ef1ac582c1e 100644
--- a/source/blender/blenkernel/intern/fcurve.c
+++ b/source/blender/blenkernel/intern/fcurve.c
@@ -41,6 +41,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_fcurve.h"
#include "BKE_animsys.h"
@@ -53,7 +54,7 @@
#include "RNA_access.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -163,10 +164,10 @@ void copy_fcurves (ListBase *dst, ListBase *src)
}
}
-/* --------------------- Finding -------------------------- */
+/* ----------------- Finding F-Curves -------------------------- */
/* high level function to get an fcurve from C without having the rna */
-FCurve *id_data_find_fcurve(ID *id, void *data, StructRNA *type, char *prop_name, int index)
+FCurve *id_data_find_fcurve(ID *id, void *data, StructRNA *type, const char *prop_name, int index)
{
/* anim vars */
AnimData *adt= BKE_animdata_from_id(id);
@@ -220,7 +221,7 @@ FCurve *list_find_fcurve (ListBase *list, const char rna_path[], const int array
for (fcu= list->first; fcu; fcu= fcu->next) {
/* simple string-compare (this assumes that they have the same root...) */
if (fcu->rna_path && !strcmp(fcu->rna_path, rna_path)) {
- /* now check indicies */
+ /* now check indices */
if (fcu->array_index == array_index)
return fcu;
}
@@ -298,36 +299,36 @@ int list_find_data_fcurves (ListBase *dst, ListBase *src, const char *dataPrefix
return matches;
}
-FCurve *rna_get_fcurve(PointerRNA *ptr, PropertyRNA *prop, int rnaindex, bAction **action, int *driven)
+FCurve *rna_get_fcurve (PointerRNA *ptr, PropertyRNA *prop, int rnaindex, bAction **action, int *driven)
{
FCurve *fcu= NULL;
*driven= 0;
/* there must be some RNA-pointer + property combon */
- if(prop && ptr->id.data && RNA_property_animateable(ptr, prop)) {
+ if (prop && ptr->id.data && RNA_property_animateable(ptr, prop)) {
AnimData *adt= BKE_animdata_from_id(ptr->id.data);
char *path;
- if(adt) {
- if((adt->action && adt->action->curves.first) || (adt->drivers.first)) {
+ if (adt) {
+ if ((adt->action && adt->action->curves.first) || (adt->drivers.first)) {
/* XXX this function call can become a performance bottleneck */
path= RNA_path_from_ID_to_property(ptr, prop);
- if(path) {
+ if (path) {
/* animation takes priority over drivers */
- if(adt->action && adt->action->curves.first)
+ if (adt->action && adt->action->curves.first)
fcu= list_find_fcurve(&adt->action->curves, path, rnaindex);
/* if not animated, check if driven */
- if(!fcu && (adt->drivers.first)) {
+ if (!fcu && (adt->drivers.first)) {
fcu= list_find_fcurve(&adt->drivers, path, rnaindex);
- if(fcu)
+ if (fcu)
*driven= 1;
}
- if(fcu && action)
+ if (fcu && action)
*action= adt->action;
MEM_freeN(path);
@@ -339,6 +340,8 @@ FCurve *rna_get_fcurve(PointerRNA *ptr, PropertyRNA *prop, int rnaindex, bAction
return fcu;
}
+/* ----------------- Finding Keyframes/Extents -------------------------- */
+
/* threshold for binary-searching keyframes - threshold here should be good enough for now, but should become userpref */
#define BEZT_BINARYSEARCH_THRESH 0.01f /* was 0.00001, but giving errors */
@@ -469,11 +472,7 @@ void calc_fcurve_bounds (FCurve *fcu, float *xmin, float *xmax, float *ymin, flo
foundvert=1;
}
- /* minimum sizes are 1.0f */
if (foundvert) {
- if (xminv == xmaxv) xmaxv += 1.0f;
- if (yminv == ymaxv) ymaxv += 1.0f;
-
if (xmin) *xmin= xminv;
if (xmax) *xmax= xmaxv;
@@ -481,10 +480,13 @@ void calc_fcurve_bounds (FCurve *fcu, float *xmin, float *xmax, float *ymin, flo
if (ymax) *ymax= ymaxv;
}
else {
+ if (G.f & G_DEBUG)
+ printf("F-Curve calc bounds didn't find anything, so assuming minimum bounds of 1.0\n");
+
if (xmin) *xmin= 0.0f;
- if (xmax) *xmax= 0.0f;
+ if (xmax) *xmax= 1.0f;
- if (ymin) *ymin= 1.0f;
+ if (ymin) *ymin= 0.0f;
if (ymax) *ymax= 1.0f;
}
}
@@ -520,6 +522,87 @@ void calc_fcurve_range (FCurve *fcu, float *start, float *end)
}
}
+/* ----------------- Status Checks -------------------------- */
+
+/* Are keyframes on F-Curve of any use?
+ * Usability of keyframes refers to whether they should be displayed,
+ * and also whether they will have any influence on the final result.
+ */
+short fcurve_are_keyframes_usable (FCurve *fcu)
+{
+ /* F-Curve must exist */
+ if (fcu == NULL)
+ return 0;
+
+ /* F-Curve must not have samples - samples are mutually exclusive of keyframes */
+ if (fcu->fpt)
+ return 0;
+
+ /* if it has modifiers, none of these should "drastically" alter the curve */
+ if (fcu->modifiers.first) {
+ FModifier *fcm;
+
+ /* check modifiers from last to first, as last will be more influential */
+ // TODO: optionally, only check modifier if it is the active one...
+ for (fcm = fcu->modifiers.last; fcm; fcm = fcm->prev) {
+ /* ignore if muted/disabled */
+ if (fcm->flag & (FMODIFIER_FLAG_DISABLED|FMODIFIER_FLAG_MUTED))
+ continue;
+
+ /* type checks */
+ switch (fcm->type) {
+ /* clearly harmless - do nothing */
+ case FMODIFIER_TYPE_CYCLES:
+ case FMODIFIER_TYPE_STEPPED:
+ case FMODIFIER_TYPE_NOISE:
+ break;
+
+ /* sometimes harmful - depending on whether they're "additive" or not */
+ case FMODIFIER_TYPE_GENERATOR:
+ {
+ FMod_Generator *data = (FMod_Generator *)fcm->data;
+
+ if ((data->flag & FCM_GENERATOR_ADDITIVE) == 0)
+ return 0;
+ }
+ break;
+ case FMODIFIER_TYPE_FN_GENERATOR:
+ {
+ FMod_FunctionGenerator *data = (FMod_FunctionGenerator *)fcm->data;
+
+ if ((data->flag & FCM_GENERATOR_ADDITIVE) == 0)
+ return 0;
+ }
+ break;
+
+ /* always harmful - cannot allow */
+ default:
+ return 0;
+ }
+ }
+ }
+
+ /* keyframes are usable */
+ return 1;
+}
+
+/* Can keyframes be added to F-Curve?
+ * Keyframes can only be added if they are already visible
+ */
+short fcurve_is_keyframable (FCurve *fcu)
+{
+ /* F-Curve's keyframes must be "usable" (i.e. visible + have an effect on final result) */
+ if (fcurve_are_keyframes_usable(fcu) == 0)
+ return 0;
+
+ /* F-Curve must currently be editable too */
+ if ( (fcu->flag & FCURVE_PROTECTED) || ((fcu->grp) && (fcu->grp->flag & AGRP_PROTECTED)) )
+ return 0;
+
+ /* F-Curve is keyframable */
+ return 1;
+}
+
/* ***************************** Keyframe Column Tools ********************************* */
/* add a BezTriple to a column */
@@ -556,7 +639,7 @@ void bezt_add_to_cfra_elem (ListBase *lb, BezTriple *bezt)
/* Basic sampling callback which acts as a wrapper for evaluate_fcurve()
* 'data' arg here is unneeded here...
*/
-float fcurve_samplingcb_evalcurve (FCurve *fcu, void *data, float evaltime)
+float fcurve_samplingcb_evalcurve (FCurve *fcu, void *UNUSED(data), float evaltime)
{
/* assume any interference from drivers on the curve is intended... */
return evaluate_fcurve(fcu, evaltime);
@@ -801,7 +884,7 @@ typedef struct DriverVarTypeInfo {
/* allocation of target slots */
int num_targets; /* number of target slots required */
- char *target_names[MAX_DRIVER_TARGETS]; /* UI names that should be given to the slots */
+ const char *target_names[MAX_DRIVER_TARGETS]; /* UI names that should be given to the slots */
int target_flags[MAX_DRIVER_TARGETS]; /* flags defining the requirements for each slot */
} DriverVarTypeInfo;
@@ -851,31 +934,44 @@ static float dtar_get_prop_val (ChannelDriver *driver, DriverTarget *dtar)
/* get property to read from, and get value as appropriate */
if (RNA_path_resolve_full(&id_ptr, dtar->rna_path, &ptr, &prop, &index)) {
- switch (RNA_property_type(prop)) {
- case PROP_BOOLEAN:
- if (RNA_property_array_length(&ptr, prop))
+ if(RNA_property_array_check(&ptr, prop)) {
+ /* array */
+ if (index < RNA_property_array_length(&ptr, prop)) {
+ switch (RNA_property_type(prop)) {
+ case PROP_BOOLEAN:
value= (float)RNA_property_boolean_get_index(&ptr, prop, index);
- else
- value= (float)RNA_property_boolean_get(&ptr, prop);
+ break;
+ case PROP_INT:
+ value= (float)RNA_property_int_get_index(&ptr, prop, index);
+ break;
+ case PROP_FLOAT:
+ value= RNA_property_float_get_index(&ptr, prop, index);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ else {
+ /* not an array */
+ switch (RNA_property_type(prop)) {
+ case PROP_BOOLEAN:
+ value= (float)RNA_property_boolean_get(&ptr, prop);
break;
case PROP_INT:
- if (RNA_property_array_length(&ptr, prop))
- value= (float)RNA_property_int_get_index(&ptr, prop, index);
- else
- value= (float)RNA_property_int_get(&ptr, prop);
+ value= (float)RNA_property_int_get(&ptr, prop);
break;
case PROP_FLOAT:
- if (RNA_property_array_length(&ptr, prop))
- value= RNA_property_float_get_index(&ptr, prop, index);
- else
- value= RNA_property_float_get(&ptr, prop);
+ value= RNA_property_float_get(&ptr, prop);
break;
case PROP_ENUM:
value= (float)RNA_property_enum_get(&ptr, prop);
break;
default:
break;
+ }
}
+
}
else {
if (G.f & G_DEBUG)
@@ -1174,7 +1270,7 @@ void driver_free_variable (ChannelDriver *driver, DriverVar *dvar)
else
MEM_freeN(dvar);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* since driver variables are cached, the expression needs re-compiling too */
if(driver->type==DRIVER_TYPE_PYTHON)
driver->flag |= DRIVER_FLAG_RENAMEVAR;
@@ -1231,9 +1327,9 @@ DriverVar *driver_add_new_variable (ChannelDriver *driver)
/* set the default type to 'single prop' */
driver_change_variable_type(dvar, DVAR_TYPE_SINGLE_PROP);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* since driver variables are cached, the expression needs re-compiling too */
- if(driver->type==DRIVER_TYPE_PYTHON)
+ if (driver->type==DRIVER_TYPE_PYTHON)
driver->flag |= DRIVER_FLAG_RENAMEVAR;
#endif
@@ -1258,7 +1354,7 @@ void fcurve_free_driver(FCurve *fcu)
driver_free_variable(driver, dvar);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* free compiled driver expression */
if (driver->expr_comp)
BPY_DECREF(driver->expr_comp);
@@ -1331,7 +1427,7 @@ float driver_get_variable_value (ChannelDriver *driver, DriverVar *dvar)
* - "evaltime" is the frame at which F-Curve is being evaluated
* - has to return a float value
*/
-static float evaluate_driver (ChannelDriver *driver, float evaltime)
+static float evaluate_driver (ChannelDriver *driver, float UNUSED(evaltime))
{
DriverVar *dvar;
@@ -1406,7 +1502,7 @@ static float evaluate_driver (ChannelDriver *driver, float evaltime)
case DRIVER_TYPE_PYTHON: /* expression */
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* check for empty or invalid expression */
if ( (driver->expression[0] == '\0') ||
(driver->flag & DRIVER_FLAG_INVALID) )
@@ -1418,9 +1514,9 @@ static float evaluate_driver (ChannelDriver *driver, float evaltime)
/* this evaluates the expression using Python,and returns its result:
* - on errors it reports, then returns 0.0f
*/
- driver->curval= BPY_eval_driver(driver);
+ driver->curval= BPY_driver_exec(driver);
}
-#endif /* DISABLE_PYTHON*/
+#endif /* WITH_PYTHON*/
}
break;
diff --git a/source/blender/blenkernel/intern/fluidsim.c b/source/blender/blenkernel/intern/fluidsim.c
index ef89d39864a..3db9731310c 100644
--- a/source/blender/blenkernel/intern/fluidsim.c
+++ b/source/blender/blenkernel/intern/fluidsim.c
@@ -43,6 +43,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_customdata.h"
@@ -51,7 +52,7 @@
#include "BKE_global.h"
#include "BKE_modifier.h"
#include "BKE_mesh.h"
-#include "BKE_utildefines.h"
+
// headers for fluidsim bobj meshes
#include <stdlib.h>
diff --git a/source/blender/blenkernel/intern/fmodifier.c b/source/blender/blenkernel/intern/fmodifier.c
index f63b58fe489..e4aeb45a209 100644
--- a/source/blender/blenkernel/intern/fmodifier.c
+++ b/source/blender/blenkernel/intern/fmodifier.c
@@ -38,10 +38,11 @@
#include "BLI_blenlib.h"
#include "BLI_math.h" /* windows needs for M_PI */
+#include "BLI_utildefines.h"
#include "BKE_fcurve.h"
#include "BKE_idprop.h"
-#include "BKE_utildefines.h"
+
#define SMALL -1.0e-10
#define SELECT 1
@@ -146,7 +147,7 @@ static void fcm_generator_verify (FModifier *fcm)
nc= MEM_callocN(sizeof(float)*(data->poly_order+1), "FMod_Generator_Coefs");
if (data->coefficients) {
- if (data->arraysize > (data->poly_order+1))
+ if ((int)data->arraysize > (data->poly_order+1))
memcpy(nc, data->coefficients, sizeof(float)*(data->poly_order+1));
else
memcpy(nc, data->coefficients, sizeof(float)*data->arraysize);
@@ -172,7 +173,7 @@ static void fcm_generator_verify (FModifier *fcm)
nc= MEM_callocN(sizeof(float)*(data->poly_order*2), "FMod_Generator_Coefs");
if (data->coefficients) {
- if (data->arraysize > (data->poly_order * 2))
+ if (data->arraysize > (unsigned int)(data->poly_order * 2))
memcpy(nc, data->coefficients, sizeof(float)*(data->poly_order * 2));
else
memcpy(nc, data->coefficients, sizeof(float)*data->arraysize);
@@ -190,7 +191,7 @@ static void fcm_generator_verify (FModifier *fcm)
}
}
-static void fcm_generator_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+static void fcm_generator_evaluate (FCurve *UNUSED(fcu), FModifier *fcm, float *cvalue, float evaltime)
{
FMod_Generator *data= (FMod_Generator *)fcm->data;
@@ -240,7 +241,7 @@ static void fcm_generator_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue,
unsigned int i;
/* for each coefficient pair, solve for that bracket before accumulating in value by multiplying */
- for (cp=data->coefficients, i=0; (cp) && (i < data->poly_order); cp+=2, i++)
+ for (cp=data->coefficients, i=0; (cp) && (i < (unsigned int)data->poly_order); cp+=2, i++)
value *= (cp[0]*evaltime + cp[1]);
/* only if something changed, write *cvalue in one go */
@@ -303,7 +304,7 @@ static double sinc (double x)
return sin(M_PI * x) / (M_PI * x);
}
-static void fcm_fn_generator_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+static void fcm_fn_generator_evaluate (FCurve *UNUSED(fcu), FModifier *fcm, float *cvalue, float evaltime)
{
FMod_FunctionGenerator *data= (FMod_FunctionGenerator *)fcm->data;
double arg= data->phase_multiplier*evaltime + data->phase_offset;
@@ -432,7 +433,7 @@ static void fcm_envelope_verify (FModifier *fcm)
}
}
-static void fcm_envelope_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+static void fcm_envelope_evaluate (FCurve *UNUSED(fcu), FModifier *fcm, float *cvalue, float evaltime)
{
FMod_Envelope *env= (FMod_Envelope *)fcm->data;
FCM_EnvelopeData *fed, *prevfed, *lastfed;
@@ -524,12 +525,12 @@ static void fcm_cycles_new_data (void *mdata)
data->before_mode= data->after_mode= FCM_EXTRAPOLATE_CYCLIC;
}
-static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float cvalue, float evaltime)
+static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float UNUSED(cvalue), float evaltime)
{
FMod_Cycles *data= (FMod_Cycles *)fcm->data;
float prevkey[2], lastkey[2], cycyofs=0.0f;
short side=0, mode=0;
- int cycles=0;
+ int cycles=0, ofs=0;
/* check if modifier is first in stack, otherwise disable ourself... */
// FIXME...
@@ -571,6 +572,7 @@ static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float cvalue, float e
side= -1;
mode= data->before_mode;
cycles= data->before_cycles;
+ ofs= prevkey[0];
}
}
else if (evaltime > lastkey[0]) {
@@ -578,6 +580,7 @@ static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float cvalue, float e
side= 1;
mode= data->after_mode;
cycles= data->after_cycles;
+ ofs= lastkey[0];
}
}
if ELEM(0, side, mode)
@@ -585,11 +588,8 @@ static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float cvalue, float e
/* find relative place within a cycle */
{
- float cycdx=0, cycdy=0, ofs=0;
- float cycle= 0;
-
- /* ofs is start frame of cycle */
- ofs= prevkey[0];
+ float cycdx=0, cycdy=0;
+ float cycle= 0, cyct=0;
/* calculate period and amplitude (total height) of a cycle */
cycdx= lastkey[0] - prevkey[0];
@@ -601,6 +601,9 @@ static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float cvalue, float e
/* calculate the 'number' of the cycle */
cycle= ((float)side * (evaltime - ofs) / cycdx);
+
+ /* calculate the time inside the cycle */
+ cyct= fmod(evaltime - ofs, cycdx);
/* check that cyclic is still enabled for the specified time */
if (cycles == 0) {
@@ -608,7 +611,7 @@ static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float cvalue, float e
* as this indicates infinite cycles...
*/
}
- else if (cycle > (cycles+1)) {
+ else if (cycle > cycles) {
/* we are too far away from range to evaluate
* TODO: but we should still hold last value...
*/
@@ -617,26 +620,36 @@ static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float cvalue, float e
/* check if 'cyclic extrapolation', and thus calculate y-offset for this cycle */
if (mode == FCM_EXTRAPOLATE_CYCLIC_OFFSET) {
- cycyofs = (float)floor((evaltime - ofs) / cycdx);
+ if(side < 0)
+ cycyofs = (float)floor((evaltime - ofs) / cycdx);
+ else
+ cycyofs = (float)ceil((evaltime - ofs) / cycdx);
cycyofs *= cycdy;
}
-
+
+ /* special case for cycle start/end */
+ if(cyct == 0.0f) {
+ evaltime = (side == 1 ? lastkey[0] : prevkey[0]);
+
+ if((mode == FCM_EXTRAPOLATE_MIRROR) && ((int)cycle % 2))
+ evaltime = (side == 1 ? prevkey[0] : lastkey[0]);
+ }
/* calculate where in the cycle we are (overwrite evaltime to reflect this) */
- if ((mode == FCM_EXTRAPOLATE_MIRROR) && ((int)(cycle) % 2)) {
+ else if ((mode == FCM_EXTRAPOLATE_MIRROR) && ((int)(cycle+1) % 2)) {
/* when 'mirror' option is used and cycle number is odd, this cycle is played in reverse
* - for 'before' extrapolation, we need to flip in a different way, otherwise values past
* then end of the curve get referenced (result of fmod will be negative, and with different phase)
*/
if (side < 0)
- evaltime= (float)(prevkey[0] - fmod(evaltime-ofs, cycdx));
+ evaltime= prevkey[0] - cyct;
else
- evaltime= (float)(lastkey[0] - fmod(evaltime-ofs, cycdx));
+ evaltime= lastkey[0] - cyct;
}
else {
/* the cycle is played normally... */
- evaltime= (float)(fmod(evaltime-ofs, cycdx) + ofs);
+ evaltime= prevkey[0] + cyct;
}
- if (evaltime < ofs) evaltime += cycdx;
+ if (evaltime < prevkey[0]) evaltime += cycdx;
}
/* store temp data if needed */
@@ -652,7 +665,7 @@ static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float cvalue, float e
return evaltime;
}
-static void fcm_cycles_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+static void fcm_cycles_evaluate (FCurve *UNUSED(fcu), FModifier *fcm, float *cvalue, float UNUSED(evaltime))
{
tFCMED_Cycles *edata= (tFCMED_Cycles *)fcm->edata;
@@ -696,7 +709,7 @@ static void fcm_noise_new_data (void *mdata)
data->modification = FCM_NOISE_MODIF_REPLACE;
}
-static void fcm_noise_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+static void fcm_noise_evaluate (FCurve *UNUSED(fcu), FModifier *fcm, float *cvalue, float evaltime)
{
FMod_Noise *data= (FMod_Noise *)fcm->data;
float noise;
@@ -788,15 +801,15 @@ static void fcm_python_copy (FModifier *fcm, FModifier *src)
pymod->prop = IDP_CopyProperty(opymod->prop);
}
-static void fcm_python_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+static void fcm_python_evaluate (FCurve *UNUSED(fcu), FModifier *UNUSED(fcm), float *UNUSED(cvalue), float UNUSED(evaltime))
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
//FMod_Python *data= (FMod_Python *)fcm->data;
/* FIXME... need to implement this modifier...
* It will need it execute a script using the custom properties
*/
-#endif /* DISABLE_PYTHON */
+#endif /* WITH_PYTHON */
}
static FModifierTypeInfo FMI_PYTHON = {
@@ -817,7 +830,7 @@ static FModifierTypeInfo FMI_PYTHON = {
/* Limits F-Curve Modifier --------------------------- */
-static float fcm_limits_time (FCurve *fcu, FModifier *fcm, float cvalue, float evaltime)
+static float fcm_limits_time (FCurve *UNUSED(fcu), FModifier *fcm, float UNUSED(cvalue), float evaltime)
{
FMod_Limits *data= (FMod_Limits *)fcm->data;
@@ -831,7 +844,7 @@ static float fcm_limits_time (FCurve *fcu, FModifier *fcm, float cvalue, float e
return evaltime;
}
-static void fcm_limits_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+static void fcm_limits_evaluate (FCurve *UNUSED(fcu), FModifier *fcm, float *cvalue, float UNUSED(evaltime))
{
FMod_Limits *data= (FMod_Limits *)fcm->data;
@@ -868,7 +881,7 @@ static void fcm_stepped_new_data (void *mdata)
data->step_size = 2.0f;
}
-static float fcm_stepped_time (FCurve *fcu, FModifier *fcm, float cvalue, float evaltime)
+static float fcm_stepped_time (FCurve *UNUSED(fcu), FModifier *fcm, float UNUSED(cvalue), float evaltime)
{
FMod_Stepped *data= (FMod_Stepped *)fcm->data;
int snapblock;
@@ -920,7 +933,7 @@ static FModifierTypeInfo *fmodifiersTypeInfo[FMODIFIER_NUM_TYPES];
static short FMI_INIT= 1; /* when non-zero, the list needs to be updated */
/* This function only gets called when FMI_INIT is non-zero */
-static void fmods_init_typeinfo ()
+static void fmods_init_typeinfo (void)
{
fmodifiersTypeInfo[0]= NULL; /* 'Null' F-Curve Modifier */
fmodifiersTypeInfo[1]= &FMI_GENERATOR; /* Generator F-Curve Modifier */
@@ -997,9 +1010,13 @@ FModifier *add_fmodifier (ListBase *modifiers, int type)
fcm->flag = FMODIFIER_FLAG_EXPANDED;
BLI_addtail(modifiers, fcm);
+ /* tag modifier as "active" if no other modifiers exist in the stack yet */
+ if (modifiers->first == modifiers->last)
+ fcm->flag |= FMODIFIER_FLAG_ACTIVE;
+
/* add modifier's data */
fcm->data= MEM_callocN(fmi->size, fmi->structName);
-
+
/* init custom settings if necessary */
if (fmi->new_data)
fmi->new_data(fcm->data);
diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c
index 47627d09b97..1d7ce197cba 100644
--- a/source/blender/blenkernel/intern/font.c
+++ b/source/blender/blenkernel/intern/font.c
@@ -41,6 +41,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_vfontdata.h"
+#include "BLI_utildefines.h"
#include "DNA_packedFile_types.h"
#include "DNA_curve_types.h"
@@ -49,9 +50,7 @@
#include "DNA_object_types.h"
#include "BKE_utildefines.h"
-
#include "BKE_packedFile.h"
-
#include "BKE_library.h"
#include "BKE_font.h"
#include "BKE_global.h"
@@ -124,31 +123,27 @@ wcsleninu8(wchar_t *src)
}
static int
-utf8slen(char *src)
+utf8slen(const char *strc)
{
- int size = 0, index = 0;
- unsigned char c;
-
- c = src[index++];
- while(c)
- {
- if((c & 0x80) == 0)
- {
- index += 0;
- }
- else if((c & 0xe0) == 0xe0)
- {
- index += 2;
- }
- else
- {
- index += 1;
+ int len=0;
+
+ while(*strc) {
+ if ((*strc & 0xe0) == 0xc0) {
+ if((strc[1] & 0x80) && (strc[1] & 0x40) == 0x00)
+ strc++;
+ } else if ((*strc & 0xf0) == 0xe0) {
+ if((strc[1] & strc[2] & 0x80) && ((strc[1] | strc[2]) & 0x40) == 0x00)
+ strc += 2;
+ } else if ((*strc & 0xf8) == 0xf0) {
+ if((strc[1] & strc[2] & strc[3] & 0x80) && ((strc[1] | strc[2] | strc[3]) & 0x40) == 0x00)
+ strc += 3;
}
- size += 1;
- c = src[index++];
+
+ strc++;
+ len++;
}
-
- return size;
+
+ return len;
}
@@ -305,7 +300,7 @@ static VFontData *vfont_get_data(VFont *vfont)
if (!vfont->data) {
PackedFile *pf;
- if (BLI_streq(vfont->name, "<builtin>")) {
+ if (strcmp(vfont->name, FO_BUILTIN_NAME)==0) {
pf= get_builtin_packedfile();
} else {
if (vfont->packedfile) {
@@ -342,7 +337,7 @@ static VFontData *vfont_get_data(VFont *vfont)
if(!pf) {
printf("Font file doesn't exist: %s\n", vfont->name);
- strcpy(vfont->name, "<builtin>");
+ strcpy(vfont->name, FO_BUILTIN_NAME);
pf= get_builtin_packedfile();
}
}
@@ -358,7 +353,7 @@ static VFontData *vfont_get_data(VFont *vfont)
return vfont->data;
}
-VFont *load_vfont(char *name)
+VFont *load_vfont(const char *name)
{
char filename[FILE_MAXFILE];
VFont *vfont= NULL;
@@ -367,7 +362,7 @@ VFont *load_vfont(char *name)
int is_builtin;
struct TmpFont *tmpfnt;
- if (BLI_streq(name, "<builtin>")) {
+ if (strcmp(name, FO_BUILTIN_NAME)==0) {
strcpy(filename, name);
pf= get_builtin_packedfile();
@@ -394,7 +389,7 @@ VFont *load_vfont(char *name)
/* if there's a font name, use it for the ID name */
if (strcmp(vfd->name, "")!=0) {
- BLI_strncpy(vfont->id.name+2, vfd->name, 21);
+ BLI_strncpy(vfont->id.name+2, vfd->name, sizeof(vfont->id.name)-2);
}
BLI_strncpy(vfont->name, name, sizeof(vfont->name));
@@ -403,8 +398,8 @@ VFont *load_vfont(char *name)
vfont->packedfile = pf;
}
- // Do not add <builtin> to temporary listbase
- if(strcmp(filename, "<builtin>"))
+ // Do not add FO_BUILTIN_NAME to temporary listbase
+ if(strcmp(filename, FO_BUILTIN_NAME))
{
tmpfnt= (struct TmpFont *) MEM_callocN(sizeof(struct TmpFont), "temp_font");
tmpfnt->pf= tpf;
@@ -443,10 +438,10 @@ VFont *get_builtin_font(void)
VFont *vf;
for (vf= G.main->vfont.first; vf; vf= vf->id.next)
- if (BLI_streq(vf->name, "<builtin>"))
+ if (strcmp(vf->name, FO_BUILTIN_NAME)==0)
return vf;
- return load_vfont("<builtin>");
+ return load_vfont(FO_BUILTIN_NAME);
}
static VChar *find_vfont_char(VFontData *vfd, intptr_t character)
@@ -514,11 +509,12 @@ static void buildchar(Curve *cu, unsigned long character, CharInfo *info, float
float *fp, fsize, shear, x, si, co;
VFontData *vfd = NULL;
VChar *che = NULL;
- int i, sel=0;
+ int i;
vfd= vfont_get_data(which_vfont(cu, info));
if (!vfd) return;
+ /*
if (cu->selend < cu->selstart) {
if ((charidx >= (cu->selend)) && (charidx <= (cu->selstart-2)))
sel= 1;
@@ -527,6 +523,7 @@ static void buildchar(Curve *cu, unsigned long character, CharInfo *info, float
if ((charidx >= (cu->selstart-1)) && (charidx <= (cu->selend-1)))
sel= 1;
}
+ */
/* make a copy at distance ofsx,ofsy with shear*/
fsize= cu->fsize;
@@ -672,7 +669,7 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
VFont *vfont, *oldvfont;
VFontData *vfd= NULL;
Curve *cu;
- CharInfo *info, *custrinfo;
+ CharInfo *info = NULL, *custrinfo;
TextBox *tb;
VChar *che;
struct chartrans *chartransdata=NULL, *ct;
@@ -699,7 +696,7 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
// Create unicode string
utf8len = utf8slen(cu->str);
- tmp = mem = MEM_callocN(((utf8len + 1) * sizeof(wchar_t)), "convertedmem");
+ mem = MEM_callocN(((utf8len + 1) * sizeof(wchar_t)), "convertedmem");
utf8towchar(mem, cu->str);
@@ -760,7 +757,6 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
for (i = 0 ; i<=slen ; i++) {
makebreak:
// Characters in the list
- che = vfd->characters.first;
info = &(custrinfo[i]);
ascii = mem[i];
if(info->flag & CU_CHINFO_SMALLCAPS) {
@@ -779,10 +775,10 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
/*
* The character wasn't in the current curve base so load it
- * But if the font is <builtin> then do not try loading since
+ * But if the font is FO_BUILTIN_NAME then do not try loading since
* whole font is in the memory already
*/
- if(che == NULL && strcmp(vfont->name, "<builtin>")) {
+ if(che == NULL && strcmp(vfont->name, FO_BUILTIN_NAME)) {
BLI_vfontchar_from_freetypefont(vfont, ascii);
}
@@ -862,12 +858,15 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
yof= cu->yof + tb->y/cu->fsize;
}
+ /* XXX, has been unused for years, need to check if this is useful, r4613 r5282 - campbell */
+#if 0
if(ascii == '\n' || ascii == '\r')
xof = cu->xof;
else
xof= cu->xof + (tb->x/cu->fsize);
-
+#else
xof= cu->xof + (tb->x/cu->fsize);
+#endif
lnr++;
cnr= 0;
wsnr= 0;
@@ -1042,10 +1041,9 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
che= find_vfont_char(vfd, ascii);
twidth = char_width(cu, che, info);
-
- dtime= distfac*0.35f*twidth; /* why not 0.5? */
- dtime= distfac*0.5f*twidth; /* why not 0.5? */
-
+
+ dtime= distfac*0.5f*twidth;
+
ctime= timeofs + distfac*( ct->xof - minx);
CLAMP(ctime, 0.0, 1.0);
@@ -1148,14 +1146,12 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
if(mode == FO_EDIT) {
/* make nurbdata */
- unsigned long cha;
-
freeNurblist(&cu->nurb);
ct= chartransdata;
if (cu->sepchar==0) {
for (i= 0; i<slen; i++) {
- cha = (uintptr_t) mem[i];
+ unsigned long cha = (uintptr_t) mem[i];
info = &(custrinfo[i]);
if (info->mat_nr > (ob->totcol)) {
/* printf("Error: Illegal material index (%d) in text object, setting to 0\n", info->mat_nr); */
@@ -1193,8 +1189,12 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
ascii = mem[i];
info = &(custrinfo[i]);
if (cu->sepchar == (i+1)) {
- float vecyo[3]= {ct->xof, ct->yof, 0.0f};
-
+ float vecyo[3];
+
+ vecyo[0]= ct->xof;
+ vecyo[1]= ct->yof;
+ vecyo[2]= 0.0f;
+
mem[0] = ascii;
mem[1] = 0;
custrinfo[0]= *info;
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index 5612d69ed76..c3e2d7ffcf4 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -33,8 +33,8 @@
#include "MEM_guardedalloc.h"
-
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_gpencil_types.h"
@@ -42,7 +42,7 @@
#include "BKE_gpencil.h"
#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_utildefines.h"
+
/* ************************************************** */
@@ -190,7 +190,7 @@ bGPDlayer *gpencil_layer_addnew (bGPdata *gpd)
}
/* add a new gp-datablock */
-bGPdata *gpencil_data_addnew (char name[])
+bGPdata *gpencil_data_addnew (const char name[])
{
bGPdata *gpd;
diff --git a/source/blender/blenkernel/intern/group.c b/source/blender/blenkernel/intern/group.c
index bdf203119c3..e48ec8ac288 100644
--- a/source/blender/blenkernel/intern/group.c
+++ b/source/blender/blenkernel/intern/group.c
@@ -41,6 +41,8 @@
#include "DNA_particle_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "BKE_global.h"
#include "BKE_group.h"
@@ -127,7 +129,7 @@ void unlink_group(Group *group)
group->id.us= 0;
}
-Group *add_group(char *name)
+Group *add_group(const char *name)
{
Group *group;
@@ -327,7 +329,7 @@ static void group_replaces_nla(Object *parent, Object *target, char mode)
you can draw everything, leaves tags in objects to signal it needs further updating */
/* note: does not work for derivedmesh and render... it recreates all again in convertblender.c */
-void group_handle_recalc_and_update(Scene *scene, Object *parent, Group *group)
+void group_handle_recalc_and_update(Scene *scene, Object *UNUSED(parent), Group *group)
{
GroupObject *go;
diff --git a/source/blender/blenkernel/intern/icons.c b/source/blender/blenkernel/intern/icons.c
index 78306705d6b..1df272fad30 100644
--- a/source/blender/blenkernel/intern/icons.c
+++ b/source/blender/blenkernel/intern/icons.c
@@ -40,6 +40,7 @@
#include "DNA_world_types.h"
#include "DNA_brush_types.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BKE_icons.h"
@@ -76,7 +77,7 @@ static void icon_free(void *val)
/* create an id for a new icon and make sure that ids from deleted icons get reused
after the integer number range is used up */
-static int get_next_free_id()
+static int get_next_free_id(void)
{
int startId = gFirstIconId;
diff --git a/source/blender/blenkernel/intern/idcode.c b/source/blender/blenkernel/intern/idcode.c
index 6411959e655..359603e9a50 100644
--- a/source/blender/blenkernel/intern/idcode.c
+++ b/source/blender/blenkernel/intern/idcode.c
@@ -35,7 +35,7 @@
typedef struct {
unsigned short code;
- char *name, *plural;
+ const char *name, *plural;
int flags;
#define IDTYPE_FLAGS_ISLINKABLE (1<<0)
diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c
index a0df73d6c42..7829d9b5e0d 100644
--- a/source/blender/blenkernel/intern/idprop.c
+++ b/source/blender/blenkernel/intern/idprop.c
@@ -341,7 +341,7 @@ IDProperty *IDP_CopyString(IDProperty *prop)
}
-void IDP_AssignString(IDProperty *prop, char *st, int maxlen)
+void IDP_AssignString(IDProperty *prop, const char *st, int maxlen)
{
int stlen;
@@ -356,7 +356,7 @@ void IDP_AssignString(IDProperty *prop, char *st, int maxlen)
BLI_strncpy(prop->data.pointer, st, stlen);
}
-void IDP_ConcatStringC(IDProperty *prop, char *st)
+void IDP_ConcatStringC(IDProperty *prop, const char *st)
{
int newlen;
@@ -421,9 +421,7 @@ void IDP_SyncGroupValues(IDProperty *dest, IDProperty *src)
IDProperty *loop, *prop;
for (prop=src->data.group.first; prop; prop=prop->next) {
for (loop=dest->data.group.first; loop; loop=loop->next) {
- if (BSTR_EQ(loop->name, prop->name)) {
- int copy_done= 0;
-
+ if (strcmp(loop->name, prop->name)==0) {
if(prop->type==loop->type) {
switch (prop->type) {
@@ -431,11 +429,9 @@ void IDP_SyncGroupValues(IDProperty *dest, IDProperty *src)
case IDP_FLOAT:
case IDP_DOUBLE:
loop->data= prop->data;
- copy_done= 1;
break;
case IDP_GROUP:
IDP_SyncGroupValues(loop, prop);
- copy_done= 1;
break;
default:
{
@@ -444,7 +440,6 @@ void IDP_SyncGroupValues(IDProperty *dest, IDProperty *src)
BLI_insertlinkafter(&dest->data.group, loop, copy);
BLI_remlink(&dest->data.group, tmp);
- loop = copy;
IDP_FreeProperty(tmp);
MEM_freeN(tmp);
@@ -540,6 +535,12 @@ IDProperty *IDP_GetPropertyFromGroup(IDProperty *prop, const char *name)
return (IDProperty *)BLI_findstring(&prop->data.group, name, offsetof(IDProperty, name));
}
+IDProperty *IDP_GetPropertyTypeFromGroup(IDProperty *prop, const char *name, const char type)
+{
+ IDProperty *idprop= IDP_GetPropertyFromGroup(prop, name);
+ return (idprop && idprop->type == type) ? idprop : NULL;
+}
+
typedef struct IDPIter {
void *next;
IDProperty *parent;
@@ -702,7 +703,6 @@ IDProperty *IDP_New(int type, IDPropertyTemplate val, const char *name)
case IDP_STRING:
{
char *st = val.str;
- int stlen;
prop = MEM_callocN(sizeof(IDProperty), "IDProperty string");
if (st == NULL) {
@@ -710,7 +710,7 @@ IDProperty *IDP_New(int type, IDPropertyTemplate val, const char *name)
prop->totallen = DEFAULT_ALLOC_FOR_NULL_STRINGS;
prop->len = 1; /*NULL string, has len of 1 to account for null byte.*/
} else {
- stlen = strlen(st) + 1;
+ int stlen = strlen(st) + 1;
prop->data.pointer = MEM_callocN(stlen, "id property string 2");
prop->len = prop->totallen = stlen;
strcpy(prop->data.pointer, st);
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index a199c1cf738..37d1e65144d 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -54,12 +54,14 @@
#include "DNA_packedFile_types.h"
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "DNA_camera_types.h"
#include "DNA_sequence_types.h"
#include "DNA_userdef_types.h"
#include "BLI_blenlib.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "BKE_bmfont.h"
#include "BKE_global.h"
@@ -70,6 +72,7 @@
#include "BKE_packedFile.h"
#include "BKE_scene.h"
#include "BKE_node.h"
+#include "BKE_utildefines.h"
//XXX #include "BIF_editseq.h"
@@ -103,8 +106,8 @@ static void de_interlace_ng(struct ImBuf *ibuf) /* neogeo fields */
if (ibuf->rect) {
/* make copies */
- tbuf1 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, (int)IB_rect, (unsigned char)0);
- tbuf2 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, (int)IB_rect, (unsigned char)0);
+ tbuf1 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, (int)IB_rect);
+ tbuf2 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, (int)IB_rect);
ibuf->x *= 2;
@@ -131,8 +134,8 @@ static void de_interlace_st(struct ImBuf *ibuf) /* standard fields */
if (ibuf->rect) {
/* make copies */
- tbuf1 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, IB_rect, 0);
- tbuf2 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, IB_rect, 0);
+ tbuf1 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, IB_rect);
+ tbuf2 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, IB_rect);
ibuf->x *= 2;
@@ -330,7 +333,7 @@ void BKE_image_merge(Image *dest, Image *source)
/* otherwise creates new. */
/* does not load ibuf itself */
/* pass on optional frame for #name images */
-Image *BKE_add_image_file(const char *name, int frame)
+Image *BKE_add_image_file(const char *name)
{
Image *ima;
int file, len;
@@ -338,7 +341,7 @@ Image *BKE_add_image_file(const char *name, int frame)
char str[FILE_MAX], strtest[FILE_MAX];
BLI_strncpy(str, name, sizeof(str));
- BLI_path_abs(str, G.sce);
+ BLI_path_abs(str, G.main->name);
/* exists? */
file= open(str, O_BINARY|O_RDONLY);
@@ -349,7 +352,7 @@ Image *BKE_add_image_file(const char *name, int frame)
for(ima= G.main->image.first; ima; ima= ima->id.next) {
if(ima->source!=IMA_SRC_VIEWER && ima->source!=IMA_SRC_GENERATED) {
BLI_strncpy(strtest, ima->name, sizeof(ima->name));
- BLI_path_abs(strtest, G.sce);
+ BLI_path_abs(strtest, G.main->name);
if( strcmp(strtest, str)==0 ) {
if(ima->anim==NULL || ima->id.us==0) {
@@ -382,22 +385,22 @@ Image *BKE_add_image_file(const char *name, int frame)
return ima;
}
-static ImBuf *add_ibuf_size(int width, int height, char *name, int depth, int floatbuf, short uvtestgrid, float color[4])
+static ImBuf *add_ibuf_size(unsigned int width, unsigned int height, const char *name, int depth, int floatbuf, short uvtestgrid, float color[4])
{
ImBuf *ibuf;
unsigned char *rect= NULL;
float *rect_float= NULL;
if (floatbuf) {
- ibuf= IMB_allocImBuf(width, height, depth, IB_rectfloat, 0);
+ ibuf= IMB_allocImBuf(width, height, depth, IB_rectfloat);
rect_float= (float*)ibuf->rect_float;
}
else {
- ibuf= IMB_allocImBuf(width, height, depth, IB_rect, 0);
+ ibuf= IMB_allocImBuf(width, height, depth, IB_rect);
rect= (unsigned char*)ibuf->rect;
}
- strcpy(ibuf->name, "//Untitled");
+ BLI_strncpy(ibuf->name, name, sizeof(ibuf->name));
ibuf->userflags |= IB_BITMAPDIRTY;
switch(uvtestgrid) {
@@ -415,7 +418,7 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, int depth, int fl
}
/* adds new image block, creates ImBuf and initializes color */
-Image *BKE_add_image_size(int width, int height, char *name, int depth, int floatbuf, short uvtestgrid, float color[4])
+Image *BKE_add_image_size(unsigned int width, unsigned int height, const char *name, int depth, int floatbuf, short uvtestgrid, float color[4])
{
/* on save, type is changed to FILE in editsima.c */
Image *ima= image_alloc(name, IMA_SRC_GENERATED, IMA_TYPE_UV_TEST);
@@ -596,7 +599,7 @@ void BKE_image_free_all_textures(void)
{
Tex *tex;
Image *ima;
- unsigned int totsize= 0;
+ /* unsigned int totsize= 0; */
for(ima= G.main->image.first; ima; ima= ima->id.next)
ima->id.flag &= ~LIB_DOIT;
@@ -608,13 +611,20 @@ void BKE_image_free_all_textures(void)
for(ima= G.main->image.first; ima; ima= ima->id.next) {
if(ima->ibufs.first && (ima->id.flag & LIB_DOIT)) {
ImBuf *ibuf;
+
for(ibuf= ima->ibufs.first; ibuf; ibuf= ibuf->next) {
- if(ibuf->mipmap[0])
+ /* escape when image is painted on */
+ if(ibuf->userflags & IB_BITMAPDIRTY)
+ break;
+
+ /* if(ibuf->mipmap[0])
totsize+= 1.33*ibuf->x*ibuf->y*4;
else
- totsize+= ibuf->x*ibuf->y*4;
+ totsize+= ibuf->x*ibuf->y*4;*/
+
}
- image_free_buffers(ima);
+ if(ibuf==NULL)
+ image_free_buffers(ima);
}
}
/* printf("freed total %d MB\n", totsize/(1024*1024)); */
@@ -759,7 +769,7 @@ int BKE_imtype_is_movie(int imtype)
int BKE_add_image_extension(char *string, int imtype)
{
- char *extension= NULL;
+ const char *extension= NULL;
if(imtype== R_IRIS) {
if(!BLI_testextensie(string, ".rgb"))
@@ -831,7 +841,10 @@ int BKE_add_image_extension(char *string, int imtype)
}
if(extension) {
- return BLI_replace_extension(string, FILE_MAX, extension);
+ /* prefer this in many cases to avoid .png.tga, but in certain cases it breaks */
+ /* return BLI_replace_extension(string, FILE_MAX, extension); */
+ strcat(string, extension);
+ return TRUE;
}
else {
return FALSE;
@@ -847,6 +860,7 @@ typedef struct StampData {
char time[512];
char frame[512];
char camera[64];
+ char cameralens[64];
char scene[64];
char strip[64];
char rendertime[64];
@@ -860,8 +874,8 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix)
if (scene->r.stamp & R_STAMP_FILENAME) {
if (G.relbase_valid) {
- if (do_prefix) sprintf(stamp_data->file, "File %s", G.sce);
- else sprintf(stamp_data->file, "%s", G.sce);
+ if (do_prefix) sprintf(stamp_data->file, "File %s", G.main->name);
+ else sprintf(stamp_data->file, "%s", G.main->name);
} else {
if (do_prefix) strcpy(stamp_data->file, "File <untitled>");
else strcpy(stamp_data->file, "<untitled>");
@@ -902,10 +916,10 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix)
}
if (scene->r.stamp & R_STAMP_TIME) {
- int h, m, s, f;
- h= m= s= f= 0;
- f = (int)(scene->r.cfra % scene->r.frs_sec);
- s = (int)(scene->r.cfra / scene->r.frs_sec);
+ int f = (int)(scene->r.cfra % scene->r.frs_sec);
+ int s = (int)(scene->r.cfra / scene->r.frs_sec);
+ int h= 0;
+ int m= 0;
if (s) {
m = (int)(s / 60);
@@ -930,15 +944,20 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix)
if (scene->r.stamp & R_STAMP_FRAME) {
char format[32];
- if (do_prefix) sprintf(format, "Frame %%0%di", 1 + (int) log10(scene->r.efra));
- else sprintf(format, "%%0%di", 1 + (int) log10(scene->r.efra));
+ int digits= 1;
+
+ if(scene->r.efra>9)
+ digits= 1 + (int) log10(scene->r.efra);
+
+ if (do_prefix) sprintf(format, "Frame %%0%di", digits);
+ else sprintf(format, "%%0%di", digits);
sprintf (stamp_data->frame, format, scene->r.cfra);
} else {
stamp_data->frame[0] = '\0';
}
if (scene->r.stamp & R_STAMP_CAMERA) {
- if (scene->camera) strcpy(text, ((Camera *) scene->camera)->id.name+2);
+ if (scene->camera) strcpy(text, scene->camera->id.name+2);
else strcpy(text, "<none>");
if (do_prefix) sprintf(stamp_data->camera, "Camera %s", text);
@@ -947,6 +966,18 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix)
stamp_data->camera[0] = '\0';
}
+ if (scene->r.stamp & R_STAMP_CAMERALENS) {
+ if (scene->camera && scene->camera->type == OB_CAMERA) {
+ sprintf(text, "%.2f", ((Camera *)scene->camera->data)->lens);
+ }
+ else strcpy(text, "<none>");
+
+ if (do_prefix) sprintf(stamp_data->cameralens, "Lens %s", text);
+ else sprintf(stamp_data->cameralens, "%s", text);
+ } else {
+ stamp_data->cameralens[0] = '\0';
+ }
+
if (scene->r.stamp & R_STAMP_SCENE) {
if (do_prefix) sprintf(stamp_data->scene, "Scene %s", scene->id.name+2);
else sprintf(stamp_data->scene, "%s", scene->id.name+2);
@@ -981,29 +1012,13 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix)
}
}
-// XXX - Bad level call.
-extern int datatoc_bmonofont_ttf_size;
-extern char datatoc_bmonofont_ttf[];
-
-// XXX - copied from text_font_begin ! Change all the BLF_* here
-static int mono= -1;
-
-int stamp_font_begin(int size)
-{
- if (mono == -1)
- mono= BLF_load_mem_unique("monospace", (unsigned char *)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size);
-
- BLF_aspect(mono, 1.0);
- BLF_size(mono, size, 72);
- return(mono); // XXX This is for image_gen.c!!
-}
-
void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, int height, int channels)
{
struct StampData stamp_data;
float w, h, pad;
int x, y;
float h_fixed;
+ const int mono= blf_mono_font_render; // XXX
if (!rect && !rectf)
return;
@@ -1014,8 +1029,9 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i
if(scene->r.stamp_font_id < 8)
scene->r.stamp_font_id= 12;
- stamp_font_begin(scene->r.stamp_font_id);
-
+ /* set before return */
+ BLF_size(mono, scene->r.stamp_font_id, 72);
+
BLF_buffer(mono, rectf, rect, width, height, channels);
BLF_buffer_col(mono, scene->r.fg_stamp[0], scene->r.fg_stamp[1], scene->r.fg_stamp[2], 1.0);
pad= BLF_width(mono, "--");
@@ -1143,6 +1159,18 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i
buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+2);
BLF_position(mono, x, y+3, 0.0);
BLF_draw_buffer(mono, stamp_data.camera);
+
+ /* space width. */
+ x += w + pad;
+ }
+
+ if (stamp_data.cameralens[0]) {
+ BLF_width_and_height(mono, stamp_data.cameralens, &w, &h); h= h_fixed;
+
+ /* extra space for background. */
+ buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+2);
+ BLF_position(mono, x, y+3, 0.0);
+ BLF_draw_buffer(mono, stamp_data.cameralens);
}
if (stamp_data.scene[0]) {
@@ -1160,7 +1188,7 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i
}
if (stamp_data.strip[0]) {
- BLF_width_and_height(mono, stamp_data.scene, &w, &h); h= h_fixed;
+ BLF_width_and_height(mono, stamp_data.strip, &w, &h); h= h_fixed;
/* Top right corner, with an extra space because blenfont is too strict! */
x= width - w - pad;
@@ -1193,15 +1221,40 @@ void BKE_stamp_info(Scene *scene, struct ImBuf *ibuf)
if (stamp_data.time[0]) IMB_metadata_change_field (ibuf, "Time", stamp_data.time);
if (stamp_data.frame[0]) IMB_metadata_change_field (ibuf, "Frame", stamp_data.frame);
if (stamp_data.camera[0]) IMB_metadata_change_field (ibuf, "Camera", stamp_data.camera);
+ if (stamp_data.cameralens[0]) IMB_metadata_change_field (ibuf, "Lens", stamp_data.cameralens);
if (stamp_data.scene[0]) IMB_metadata_change_field (ibuf, "Scene", stamp_data.scene);
if (stamp_data.strip[0]) IMB_metadata_change_field (ibuf, "Strip", stamp_data.strip);
if (stamp_data.rendertime[0]) IMB_metadata_change_field (ibuf, "RenderTime", stamp_data.rendertime);
}
-int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimtype, int quality)
+int BKE_alphatest_ibuf(ImBuf *ibuf)
+{
+ int tot;
+ if(ibuf->rect_float) {
+ float *buf= ibuf->rect_float;
+ for(tot= ibuf->x * ibuf->y; tot--; buf+=4) {
+ if(buf[3] < 1.0f) {
+ return TRUE;
+ }
+ }
+ }
+ else if (ibuf->rect) {
+ unsigned char *buf= (unsigned char *)ibuf->rect;
+ for(tot= ibuf->x * ibuf->y; tot--; buf+=4) {
+ if(buf[3] != 255) {
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, const char *name, int imtype, int subimtype, int quality)
{
int ok;
-
+ (void)subimtype; /* quies unused warnings */
+
if(imtype==0) {
/* pass */
}
@@ -1209,7 +1262,7 @@ int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimt
ibuf->ftype= IMAGIC;
}
#ifdef WITH_HDR
- else if ((imtype==R_RADHDR)) {
+ else if (imtype==R_RADHDR) {
ibuf->ftype= RADHDR;
}
#endif
@@ -1221,11 +1274,11 @@ int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimt
}
#ifdef WITH_DDS
- else if ((imtype==R_DDS)) {
+ else if (imtype==R_DDS) {
ibuf->ftype= DDS;
}
#endif
- else if ((imtype==R_BMP)) {
+ else if (imtype==R_BMP) {
ibuf->ftype= BMP;
}
#ifdef WITH_TIFF
@@ -1305,12 +1358,14 @@ int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimt
}
-void BKE_makepicstring(char *string, char *base, int frame, int imtype, int use_ext)
+void BKE_makepicstring(char *string, const char *base, int frame, int imtype, const short use_ext, const short use_frames)
{
if (string==NULL) return;
BLI_strncpy(string, base, FILE_MAX - 10); /* weak assumption */
- BLI_path_abs(string, G.sce);
- BLI_path_frame(string, frame, 4);
+ BLI_path_abs(string, G.main->name);
+
+ if(use_frames)
+ BLI_path_frame(string, frame, 4);
if(use_ext)
BKE_add_image_extension(string, imtype);
@@ -1414,7 +1469,9 @@ void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
}
}
- image_free_buffers(ima);
+ /* force reload on first use, but not for multilayer, that makes nodes and buttons in ui drawing fail */
+ if(ima->type!=IMA_TYPE_MULTILAYER)
+ image_free_buffers(ima);
ima->ok= 1;
if(iuser)
@@ -1566,15 +1623,10 @@ static void image_create_multilayer(Image *ima, ImBuf *ibuf, int framenr)
/* common stuff to do with images after loading */
static void image_initialize_after_load(Image *ima, ImBuf *ibuf)
{
-
-
/* preview is NULL when it has never been used as an icon before */
if(G.background==0 && ima->preview==NULL)
BKE_icon_changed(BKE_icon_getid(&ima->id));
-
- /* stringcodes also in ibuf, ibuf->name is used to retrieve original (buttons) */
- BLI_strncpy(ibuf->name, ima->name, FILE_MAX);
-
+
/* fields */
if (ima->flag & IMA_FIELDS) {
if(ima->flag & IMA_STD_FIELD) de_interlace_st(ibuf);
@@ -1599,15 +1651,14 @@ static ImBuf *image_load_sequence_file(Image *ima, ImageUser *iuser, int frame)
ima->tpageflag |= IMA_TPAGE_REFRESH;
ima->lastframe= frame;
-
- BLI_stringdec(ima->name, head, tail, &numlen);
- BLI_stringenc(ima->name, head, tail, numlen, frame);
BLI_strncpy(name, ima->name, sizeof(name));
-
+ BLI_stringdec(name, head, tail, &numlen);
+ BLI_stringenc(name, head, tail, numlen, frame);
+
if(ima->id.lib)
BLI_path_abs(name, ima->id.lib->filepath);
else
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, G.main->name);
flag= IB_rect|IB_multilayer;
if(ima->flag & IMA_DO_PREMUL)
@@ -1679,11 +1730,12 @@ static ImBuf *image_load_sequence_multilayer(Image *ima, ImageUser *iuser, int f
if(rpass) {
// printf("load from pass %s\n", rpass->name);
/* since we free render results, we copy the rect */
- ibuf= IMB_allocImBuf(ima->rr->rectx, ima->rr->recty, 32, 0, 0);
+ ibuf= IMB_allocImBuf(ima->rr->rectx, ima->rr->recty, 32, 0);
ibuf->rect_float= MEM_dupallocN(rpass->rect);
ibuf->flags |= IB_rectfloat;
ibuf->mall= IB_rectfloat;
ibuf->channels= rpass->channels;
+ ibuf->profile = IB_PROFILE_LINEAR_RGB;
image_initialize_after_load(ima, ibuf);
image_assign_ibuf(ima, ibuf, iuser?iuser->multi_index:0, frame);
@@ -1714,7 +1766,7 @@ static ImBuf *image_load_movie_file(Image *ima, ImageUser *iuser, int frame)
if(ima->id.lib)
BLI_path_abs(str, ima->id.lib->filepath);
else
- BLI_path_abs(str, G.sce);
+ BLI_path_abs(str, G.main->name);
ima->anim = openanim(str, IB_rect);
@@ -1747,8 +1799,7 @@ static ImBuf *image_load_movie_file(Image *ima, ImageUser *iuser, int frame)
return ibuf;
}
-/* cfra used for # code, Image can only have this # for all its users
- * warning, 'iuser' can be NULL */
+/* warning, 'iuser' can be NULL */
static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra)
{
struct ImBuf *ibuf;
@@ -1775,7 +1826,7 @@ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra)
if(ima->id.lib)
BLI_path_abs(str, ima->id.lib->filepath);
else
- BLI_path_abs(str, G.sce);
+ BLI_path_abs(str, G.main->name);
/* read ibuf */
ibuf = IMB_loadiffname(str, flag);
@@ -1828,7 +1879,7 @@ static ImBuf *image_get_ibuf_multilayer(Image *ima, ImageUser *iuser)
RenderPass *rpass= BKE_image_multilayer_index(ima->rr, iuser);
if(rpass) {
- ibuf= IMB_allocImBuf(ima->rr->rectx, ima->rr->recty, 32, 0, 0);
+ ibuf= IMB_allocImBuf(ima->rr->rectx, ima->rr->recty, 32, 0);
image_initialize_after_load(ima, ibuf);
@@ -1935,7 +1986,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
/* make ibuf if needed, and initialize it */
if(ibuf==NULL) {
- ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, 0, 0);
+ ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, 0);
image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
}
@@ -1967,6 +2018,9 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
ibuf->flags &= ~IB_zbuffloat;
}
+ /* since its possible to access the buffer from the image directly, set the profile [#25073] */
+ ibuf->profile= (iuser->scene->r.color_mgt_flag & R_COLOR_MANAGEMENT) ? IB_PROFILE_LINEAR_RGB : IB_PROFILE_NONE;
+
ibuf->dither= dither;
ima->ok= IMA_OK_LOADED;
@@ -1996,11 +2050,6 @@ static ImBuf *image_get_ibuf_threadsafe(Image *ima, ImageUser *iuser, int *frame
/* XXX temp stuff? */
if(ima->lastframe != frame) {
ima->tpageflag |= IMA_TPAGE_REFRESH;
- if(ibuf) {
- /* without this the image name only updates
- * on first load which is quite confusing */
- BLI_strncpy(ima->name, ibuf->name, sizeof(ima->name));
- }
}
ima->lastframe = frame;
}
@@ -2103,9 +2152,6 @@ ImBuf *BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r)
/* only 1 layer/pass stored in imbufs, no exrhandle anim storage, no saving */
ibuf= image_load_sequence_multilayer(ima, iuser, frame);
}
-
- if(ibuf)
- BLI_strncpy(ima->name, ibuf->name, sizeof(ima->name));
}
else if(ima->source==IMA_SRC_FILE) {
@@ -2139,13 +2185,14 @@ ImBuf *BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r)
BLI_lock_thread(LOCK_VIEWER);
*lock_r= ima;
- frame= iuser?iuser->framenr:0;
+ /* XXX anim play for viewer nodes not yet supported */
+ frame= 0; // XXX iuser?iuser->framenr:0;
ibuf= image_get_ibuf(ima, 0, frame);
if(!ibuf) {
/* Composite Viewer, all handled in compositor */
/* fake ibuf, will be filled in compositor */
- ibuf= IMB_allocImBuf(256, 256, 32, IB_rect, 0);
+ ibuf= IMB_allocImBuf(256, 256, 32, IB_rect);
image_assign_ibuf(ima, ibuf, 0, frame);
}
}
@@ -2176,6 +2223,7 @@ void BKE_image_release_ibuf(Image *ima, void *lock)
}
}
+/* warning, this can allocate generated images */
ImBuf *BKE_image_get_ibuf(Image *ima, ImageUser *iuser)
{
return BKE_image_acquire_ibuf(ima, iuser, NULL);
@@ -2183,7 +2231,7 @@ ImBuf *BKE_image_get_ibuf(Image *ima, ImageUser *iuser)
void BKE_image_user_calc_frame(ImageUser *iuser, int cfra, int fieldnr)
{
- int imanr, len;
+ int len;
/* here (+fie_ima/2-1) makes sure that division happens correctly */
len= (iuser->fie_ima*iuser->frames)/2;
@@ -2192,8 +2240,9 @@ void BKE_image_user_calc_frame(ImageUser *iuser, int cfra, int fieldnr)
iuser->framenr= 0;
}
else {
+ int imanr;
cfra= cfra - iuser->sfra+1;
-
+
/* cyclic */
if(iuser->cycl) {
cfra= ( (cfra) % len );
@@ -2201,7 +2250,7 @@ void BKE_image_user_calc_frame(ImageUser *iuser, int cfra, int fieldnr)
if(cfra==0) cfra= len;
}
- if(cfra<1) cfra= 1;
+ if(cfra<0) cfra= 0;
else if(cfra>len) cfra= len;
/* convert current frame to current field */
diff --git a/source/blender/blenkernel/intern/image_gen.c b/source/blender/blenkernel/intern/image_gen.c
index 9248ce69280..a2d41920217 100644
--- a/source/blender/blenkernel/intern/image_gen.c
+++ b/source/blender/blenkernel/intern/image_gen.c
@@ -298,16 +298,16 @@ static void checker_board_grid_fill(unsigned char *rect, float *rect_float, int
}
/* defined in image.c */
-extern int stamp_font_begin(int size);
static void checker_board_text(unsigned char *rect, float *rect_float, int width, int height, int step, int outline)
{
- int x, y, mono;
+ int x, y;
int pen_x, pen_y;
char text[3]= {'A', '1', '\0'};
+ const int mono= blf_mono_font;
+
+ BLF_size(mono, 54, 72); /* hard coded size! */
- /* hard coded size! */
- mono= stamp_font_begin(54);
BLF_buffer(mono, rect_float, rect, width, height, 4);
for(y= 0; y < height; y+=step)
diff --git a/source/blender/blenkernel/intern/implicit.c b/source/blender/blenkernel/intern/implicit.c
index 158f964a846..8004f23c22a 100644
--- a/source/blender/blenkernel/intern/implicit.c
+++ b/source/blender/blenkernel/intern/implicit.c
@@ -37,12 +37,13 @@
#include "BLI_threads.h"
#include "BLI_math.h"
#include "BLI_linklist.h"
+#include "BLI_utildefines.h"
#include "BKE_cloth.h"
#include "BKE_collision.h"
#include "BKE_effect.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
+
#define CLOTH_OPENMP_LIMIT 25
@@ -63,7 +64,7 @@ static void itend(void)
{
QueryPerformanceCounter(&_itend);
}
-double itval()
+double itval(void)
{
return ((double)_itend.QuadPart -
(double)_itstart.QuadPart)/((double)ifreq.QuadPart);
@@ -85,7 +86,7 @@ static void itend(void)
{
gettimeofday(&_itend,&itz);
}
-double itval()
+double itval(void)
{
double t1, t2;
t1 = (double)_itstart.tv_sec + (double)_itstart.tv_usec/(1000*1000);
@@ -726,7 +727,7 @@ typedef struct Implicit_Data
fmatrix3x3 *A, *dFdV, *dFdX, *S, *P, *Pinv, *bigI, *M;
} Implicit_Data;
-int implicit_init (Object *ob, ClothModifierData *clmd)
+int implicit_init (Object *UNUSED(ob), ClothModifierData *clmd)
{
unsigned int i = 0;
unsigned int pinned = 0;
@@ -1218,7 +1219,7 @@ DO_INLINE void dfdx_damp(float to[3][3], float dir[3],float length,const float
}
-DO_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s, lfVector *lF, lfVector *X, lfVector *V, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, float time)
+DO_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s, lfVector *UNUSED(lF), lfVector *X, lfVector *V, fmatrix3x3 *UNUSED(dFdV), fmatrix3x3 *UNUSED(dFdX), float time)
{
Cloth *cloth = clmd->clothObject;
ClothVertex *verts = cloth->verts;
@@ -1228,7 +1229,7 @@ DO_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s,
float vel[3];
float k = 0.0f;
float L = s->restlen;
- float cb = clmd->sim_parms->structural;
+ float cb; /* = clmd->sim_parms->structural; */ /*UNUSED*/
float nullf[3] = {0,0,0};
float stretch_force[3] = {0,0,0};
@@ -1316,8 +1317,9 @@ DO_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s,
VECSUB(extent, X[s->ij], tvect);
- dot = INPR(extent, extent);
- length = sqrt(dot);
+ // SEE MSG BELOW (these are UNUSED)
+ // dot = INPR(extent, extent);
+ // length = sqrt(dot);
k = clmd->sim_parms->goalspring;
@@ -1353,7 +1355,7 @@ DO_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s,
}
}
-DO_INLINE void cloth_apply_spring_force(ClothModifierData *clmd, ClothSpring *s, lfVector *lF, lfVector *X, lfVector *V, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX)
+DO_INLINE void cloth_apply_spring_force(ClothModifierData *UNUSED(clmd), ClothSpring *s, lfVector *lF, lfVector *UNUSED(X), lfVector *UNUSED(V), fmatrix3x3 *dFdV, fmatrix3x3 *dFdX)
{
if(s->flags & CLOTH_SPRING_FLAG_NEEDED)
{
@@ -1425,7 +1427,7 @@ typedef struct HairGridVert {
by Lena Petrovic, Mark Henne and John Anderson
* Pixar Technical Memo #06-08, Pixar Animation Studios
*/
-static void hair_velocity_smoothing(ClothModifierData *clmd, lfVector *lF, lfVector *lX, lfVector *lV, int numverts)
+static void hair_velocity_smoothing(ClothModifierData *clmd, lfVector *lF, lfVector *lX, lfVector *lV, unsigned int numverts)
{
/* TODO: This is an initial implementation and should be made much better in due time.
* What should at least be implemented is a grid size parameter and a smoothing kernel
@@ -1441,10 +1443,10 @@ static void hair_velocity_smoothing(ClothModifierData *clmd, lfVector *lF, lfVec
/* 2.0f is an experimental value that seems to give good results */
float smoothfac = 2.0f * clmd->sim_parms->velocity_smooth;
float collfac = 2.0f * clmd->sim_parms->collider_friction;
- int v = 0;
- int i = 0;
- int j = 0;
- int k = 0;
+ unsigned int v = 0;
+ unsigned int i = 0;
+ int j = 0;
+ int k = 0;
INIT_MINMAX(gmin, gmax);
@@ -1555,20 +1557,22 @@ static void hair_velocity_smoothing(ClothModifierData *clmd, lfVector *lF, lfVec
free_collider_cache(&colliders);
}
-static void cloth_calc_force(ClothModifierData *clmd, float frame, lfVector *lF, lfVector *lX, lfVector *lV, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, ListBase *effectors, float time, fmatrix3x3 *M)
+static void cloth_calc_force(ClothModifierData *clmd, float UNUSED(frame), lfVector *lF, lfVector *lX, lfVector *lV, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, ListBase *effectors, float time, fmatrix3x3 *M)
{
/* Collect forces and derivatives: F,dFdX,dFdV */
Cloth *cloth = clmd->clothObject;
- int i = 0;
+ unsigned int i = 0;
float spring_air = clmd->sim_parms->Cvi * 0.01f; /* viscosity of air scaled in percent */
float gravity[3] = {0.0f, 0.0f, 0.0f};
- float tm2[3][3] = {{-spring_air,0,0}, {0,-spring_air,0},{0,0,-spring_air}};
+ float tm2[3][3] = {{0}};
MFace *mfaces = cloth->mfaces;
unsigned int numverts = cloth->numverts;
- LinkNode *search = cloth->springs;
+ LinkNode *search;
lfVector *winvec;
EffectedPoint epoint;
+ tm2[0][0]= tm2[1][1]= tm2[2][2]= -spring_air;
+
/* global acceleration (gravitation) */
if(clmd->scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY) {
VECCOPY(gravity, clmd->scene->physics_settings.gravity);
@@ -1708,7 +1712,7 @@ static void cloth_calc_force(ClothModifierData *clmd, float frame, lfVector *lF,
// printf("\n");
}
-static void simulate_implicit_euler(lfVector *Vnew, lfVector *lX, lfVector *lV, lfVector *lF, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, float dt, fmatrix3x3 *A, lfVector *B, lfVector *dV, fmatrix3x3 *S, lfVector *z, lfVector *olddV, fmatrix3x3 *P, fmatrix3x3 *Pinv, fmatrix3x3 *M, fmatrix3x3 *bigI)
+static void simulate_implicit_euler(lfVector *Vnew, lfVector *UNUSED(lX), lfVector *lV, lfVector *lF, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, float dt, fmatrix3x3 *A, lfVector *B, lfVector *dV, fmatrix3x3 *S, lfVector *z, lfVector *olddV, fmatrix3x3 *UNUSED(P), fmatrix3x3 *UNUSED(Pinv), fmatrix3x3 *M, fmatrix3x3 *UNUSED(bigI))
{
unsigned int numverts = dFdV[0].vcount;
diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c
index 5c0c0fbf0c1..41639a619b3 100644
--- a/source/blender/blenkernel/intern/ipo.c
+++ b/source/blender/blenkernel/intern/ipo.c
@@ -59,8 +59,9 @@
#include "BLI_math.h" /* windows needs for M_PI */
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
+
-#include "BKE_utildefines.h"
#include "BKE_animsys.h"
#include "BKE_action.h"
@@ -102,7 +103,7 @@ void free_ipo (Ipo *ipo)
/* Mapping Table for bitflag <-> RNA path */
typedef struct AdrBit2Path {
int bit;
- char *path;
+ const char *path;
int array_index;
} AdrBit2Path;
@@ -111,27 +112,26 @@ typedef struct AdrBit2Path {
/* Object layers */
static AdrBit2Path ob_layer_bits[]= {
- {(1<<0), "layer", 0},
- {(1<<1), "layer", 1},
- {(1<<2), "layer", 2},
- {(1<<3), "layer", 3},
- {(1<<4), "layer", 4},
- {(1<<5), "layer", 5},
- {(1<<6), "layer", 6},
- {(1<<7), "layer", 7},
- {(1<<8), "layer", 8},
- {(1<<9), "layer", 9},
- {(1<<10), "layer", 10},
- {(1<<11), "layer", 11},
- {(1<<12), "layer", 12},
- {(1<<13), "layer", 13},
- {(1<<14), "layer", 14},
- {(1<<15), "layer", 15},
- {(1<<16), "layer", 16},
- {(1<<17), "layer", 17},
- {(1<<18), "layer", 18},
- {(1<<19), "layer", 19},
- {(1<<20), "layer", 20}
+ {(1<<0), "layers", 0},
+ {(1<<1), "layers", 1},
+ {(1<<2), "layers", 2},
+ {(1<<3), "layers", 3},
+ {(1<<4), "layers", 4},
+ {(1<<5), "layers", 5},
+ {(1<<6), "layers", 6},
+ {(1<<7), "layers", 7},
+ {(1<<8), "layers", 8},
+ {(1<<9), "layers", 9},
+ {(1<<10), "layers", 10},
+ {(1<<11), "layers", 11},
+ {(1<<12), "layers", 12},
+ {(1<<13), "layers", 13},
+ {(1<<14), "layers", 14},
+ {(1<<15), "layers", 15},
+ {(1<<16), "layers", 16},
+ {(1<<17), "layers", 17},
+ {(1<<18), "layers", 18},
+ {(1<<19), "layers", 19}
};
/* Material mode */
@@ -172,7 +172,7 @@ static AdrBit2Path *adrcode_bitmaps_to_paths (int blocktype, int adrcode, int *t
/* ADRCODE to RNA-Path Conversion Code - Standard */
/* Object types */
-static char *ob_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *ob_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -253,7 +253,7 @@ static char *ob_adrcodes_to_paths (int adrcode, int *array_index)
/* PoseChannel types
* NOTE: pchan name comes from 'actname' added earlier...
*/
-static char *pchan_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *pchan_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -297,7 +297,7 @@ static char *pchan_adrcodes_to_paths (int adrcode, int *array_index)
}
/* Constraint types */
-static char *constraint_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *constraint_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -315,9 +315,9 @@ static char *constraint_adrcodes_to_paths (int adrcode, int *array_index)
/* ShapeKey types
* NOTE: as we don't have access to the keyblock where the data comes from (for now),
- * we'll just use numerical indicies for now...
+ * we'll just use numerical indices for now...
*/
-static char *shapekey_adrcodes_to_paths (int adrcode, int *array_index)
+static char *shapekey_adrcodes_to_paths (int adrcode, int *UNUSED(array_index))
{
static char buf[128];
@@ -331,9 +331,9 @@ static char *shapekey_adrcodes_to_paths (int adrcode, int *array_index)
}
/* MTex (Texture Slot) types */
-static char *mtex_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *mtex_adrcodes_to_paths (int adrcode, int *UNUSED(array_index))
{
- char *base=NULL, *prop=NULL;
+ const char *base=NULL, *prop=NULL;
static char buf[128];
/* base part of path */
@@ -401,7 +401,7 @@ static char *mtex_adrcodes_to_paths (int adrcode, int *array_index)
}
/* Texture types */
-static char *texture_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *texture_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -481,7 +481,7 @@ static char *texture_adrcodes_to_paths (int adrcode, int *array_index)
}
/* Material Types */
-static char *material_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *material_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -565,7 +565,7 @@ static char *material_adrcodes_to_paths (int adrcode, int *array_index)
}
/* Camera Types */
-static char *camera_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *camera_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -605,7 +605,7 @@ static char *camera_adrcodes_to_paths (int adrcode, int *array_index)
}
/* Lamp Types */
-static char *lamp_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *lamp_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -647,7 +647,7 @@ static char *lamp_adrcodes_to_paths (int adrcode, int *array_index)
}
/* Sound Types */
-static char *sound_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *sound_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -670,7 +670,7 @@ static char *sound_adrcodes_to_paths (int adrcode, int *array_index)
}
/* World Types */
-static char *world_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *world_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -709,6 +709,11 @@ static char *world_adrcodes_to_paths (int adrcode, int *array_index)
*array_index= 1; return "stars.color";
case WO_STAR_B:
*array_index= 2; return "stars.color"; */
+ case WO_STAR_R:
+ case WO_STAR_G:
+ case WO_STAR_B:
+ printf("WARNING: WO_STAR_R/G/B deprecated\n");
+ return NULL;
case WO_STARDIST:
return "stars.min_distance";
@@ -723,7 +728,7 @@ static char *world_adrcodes_to_paths (int adrcode, int *array_index)
}
/* Particle Types */
-static char *particle_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *particle_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -798,10 +803,11 @@ static char *particle_adrcodes_to_paths (int adrcode, int *array_index)
* - array_index - index in property's array (if applicable) to use
* - return - the allocated path...
*/
-static char *get_rna_access (int blocktype, int adrcode, char actname[], char constname[], Sequence * seq, int *array_index)
+static char *get_rna_access (int blocktype, int adrcode, char actname[], char constname[], Sequence *seq, int *array_index)
{
DynStr *path= BLI_dynstr_new();
- char *propname=NULL, *rpath=NULL;
+ const char *propname=NULL;
+ char *rpath=NULL;
char buf[512];
int dummy_index= 0;
@@ -913,8 +919,17 @@ static char *get_rna_access (int blocktype, int adrcode, char actname[], char co
sprintf(buf, "pose.bones[\"%s\"].constraints[\"%s\"]", actname, constname);
}
else if (actname && actname[0]) {
- /* Pose-Channel */
- sprintf(buf, "pose.bones[\"%s\"]", actname);
+ if ((blocktype == ID_OB) && strcmp(actname, "Object")==0) {
+ /* Actionified "Object" IPO's... no extra path stuff needed */
+ }
+ else if ((blocktype == ID_KE) && strcmp(actname, "Shape")==0) {
+ /* Actionified "Shape" IPO's - these are forced onto object level via the action container there... */
+ strcpy(buf, "data.shape_keys");
+ }
+ else {
+ /* Pose-Channel */
+ sprintf(buf, "pose.bones[\"%s\"]", actname);
+ }
}
else if (constname && constname[0]) {
/* Constraint in Object */
@@ -922,8 +937,7 @@ static char *get_rna_access (int blocktype, int adrcode, char actname[], char co
}
else if (seq) {
/* Sequence names in Scene */
- sprintf(buf, "sequence_editor.sequences_all[\"%s\"]",
- seq->name+2);
+ sprintf(buf, "sequence_editor.sequences_all[\"%s\"]", seq->name+2);
}
else
strcpy(buf, ""); /* empty string */
@@ -1017,13 +1031,13 @@ static ChannelDriver *idriver_to_cdriver (IpoDriver *idriver)
dtar= &dvar->targets[0];
dtar->id= (ID *)idriver->ob;
if (idriver->name[0])
- BLI_strncpy(dtar->pchan_name, idriver->name, 32);
+ BLI_strncpy(dtar->pchan_name, idriver->name, sizeof(dtar->pchan_name));
/* second bone target (name was stored in same var as the first one) */
dtar= &dvar->targets[1];
dtar->id= (ID *)idriver->ob;
if (idriver->name[0]) // xxx... for safety
- BLI_strncpy(dtar->pchan_name, idriver->name+DRIVER_NAME_OFFS, 32);
+ BLI_strncpy(dtar->pchan_name, idriver->name+DRIVER_NAME_OFFS, sizeof(dtar->pchan_name));
}
else {
/* only a single variable, of type 'transform channel' */
@@ -1034,7 +1048,7 @@ static ChannelDriver *idriver_to_cdriver (IpoDriver *idriver)
dtar= &dvar->targets[0];
dtar->id= (ID *)idriver->ob;
if (idriver->name[0])
- BLI_strncpy(dtar->pchan_name, idriver->name, 32);
+ BLI_strncpy(dtar->pchan_name, idriver->name, sizeof(dtar->pchan_name));
dtar->transChan= adrcode_to_dtar_transchan(idriver->adrcode);
dtar->flag |= DTAR_FLAG_LOCALSPACE; /* old drivers took local space */
}
@@ -1123,7 +1137,7 @@ static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *
{
AdrBit2Path *abp;
FCurve *fcu;
- int i=0, totbits;
+ int totbits;
/* allocate memory for a new F-Curve */
fcu= MEM_callocN(sizeof(FCurve), "FCurve");
@@ -1188,6 +1202,8 @@ static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *
* 3) filter the keyframes for the flag of interest
*/
for (b=0; b < totbits; b++, abp++) {
+ unsigned int i=0;
+
/* make a copy of existing base-data if not the last curve */
if (b < (totbits-1))
fcurve= copy_fcurve(fcu);
@@ -1195,7 +1211,7 @@ static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *
fcurve= fcu;
/* set path */
- fcurve->rna_path= BLI_strdupn(abp->path, strlen(abp->path));
+ fcurve->rna_path= BLI_strdup(abp->path);
fcurve->array_index= abp->array_index;
/* convert keyframes
@@ -1211,7 +1227,7 @@ static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *
fcurve->bezt= MEM_callocN(sizeof(BezTriple)*fcurve->totvert, "BezTriples");
/* loop through copying all BezTriples individually, as we need to modify a few things */
- for (dst=fcurve->bezt, src=icu->bezt; i < fcurve->totvert; i++, dst++, src++) {
+ for (dst=fcurve->bezt, src=icu->bezt, i=0; i < fcurve->totvert; i++, dst++, src++) {
/* firstly, copy BezTriple data */
*dst= *src;
@@ -1239,6 +1255,8 @@ static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *
}
}
else {
+ unsigned int i=0;
+
/* get rna-path
* - we will need to set the 'disabled' flag if no path is able to be made (for now)
*/
@@ -1259,7 +1277,7 @@ static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *
fcu->bezt= MEM_callocN(sizeof(BezTriple)*fcu->totvert, "BezTriples");
/* loop through copying all BezTriples individually, as we need to modify a few things */
- for (dst=fcu->bezt, src=icu->bezt; i < fcu->totvert; i++, dst++, src++) {
+ for (dst=fcu->bezt, src=icu->bezt, i=0; i < fcu->totvert; i++, dst++, src++) {
/* firstly, copy BezTriple data */
*dst= *src;
@@ -1316,20 +1334,17 @@ static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *
}
}
- /* correct values for sequencer curves,
- that were not locked to frame */
-
- if (seq &&
- (seq->flag & SEQ_IPO_FRAME_LOCKED) == 0) {
+ /* correct values for sequencer curves, that were not locked to frame */
+ if (seq && (seq->flag & SEQ_IPO_FRAME_LOCKED) == 0) {
double mul= (seq->enddisp-seq->startdisp)/100.0f;
double offset= seq->startdisp;
dst->vec[0][0] *= mul;
dst->vec[0][0] += offset;
-
+
dst->vec[1][0] *= mul;
dst->vec[1][0] += offset;
-
+
dst->vec[2][0] *= mul;
dst->vec[2][0] += offset;
}
@@ -1476,7 +1491,7 @@ static void action_to_animato (ID *id, bAction *act, ListBase *groups, ListBase
* This assumes that AnimData has been added already. Separation of drivers
* from animation data is accomplished here too...
*/
-static void ipo_to_animdata (ID *id, Ipo *ipo, char actname[], char constname[], Sequence * seq)
+static void ipo_to_animdata (ID *id, Ipo *ipo, char actname[], char constname[], Sequence *seq)
{
AnimData *adt= BKE_animdata_from_id(id);
ListBase anim = {NULL, NULL};
@@ -1507,19 +1522,23 @@ static void ipo_to_animdata (ID *id, Ipo *ipo, char actname[], char constname[],
if (G.f & G_DEBUG) printf("\thas anim \n");
/* try to get action */
if (adt->action == NULL) {
- adt->action= add_empty_action("ConvData_Action"); // XXX we need a better name for this
- if (G.f & G_DEBUG) printf("\t\tadded new action \n");
+ char nameBuf[MAX_ID_NAME];
+
+ BLI_snprintf(nameBuf, sizeof(nameBuf), "CDA:%s", ipo->id.name+2);
+
+ adt->action= add_empty_action(nameBuf);
+ if (G.f & G_DEBUG) printf("\t\tadded new action - '%s' \n", nameBuf);
}
/* add F-Curves to action */
- addlisttolist(&adt->action->curves, &anim);
+ BLI_movelisttolist(&adt->action->curves, &anim);
}
/* deal with drivers */
if (drivers.first) {
if (G.f & G_DEBUG) printf("\thas drivers \n");
/* add drivers to end of driver stack */
- addlisttolist(&adt->drivers, &drivers);
+ BLI_movelisttolist(&adt->drivers, &drivers);
}
}
@@ -1864,7 +1883,7 @@ void do_versions_ipos_to_animato(Main *main)
to different DNA variables later
(semi-hack (tm) )
*/
- switch(seq->type) {
+ switch (seq->type) {
case SEQ_IMAGE:
case SEQ_META:
case SEQ_SCENE:
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index 708403ab1f7..a3c8ea0c194 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -39,6 +39,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_math_vector.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_key_types.h"
@@ -57,13 +58,13 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_object.h"
-#include "BKE_utildefines.h"
-#include "RNA_access.h"
+#include "RNA_access.h"
-#define KEY_BPOINT 1
-#define KEY_BEZTRIPLE 2
+#define KEY_MODE_DUMMY 0 /* use where mode isn't checked for */
+#define KEY_MODE_BPOINT 1
+#define KEY_MODE_BEZTRIPLE 2
// old defines from DNA_ipo_types.h for data-type
#define IPO_FLOAT 4
@@ -153,10 +154,6 @@ Key *copy_key(Key *key)
keyn= copy_libblock(key);
-#if 0 // XXX old animation system
- keyn->ipo= copy_ipo(key->ipo);
-#endif // XXX old animation system
-
BLI_duplicatelist(&keyn->block, &key->block);
kb= key->block.first;
@@ -184,10 +181,6 @@ void make_local_key(Key *key)
key->id.lib= 0;
new_id(0, (ID *)key, 0);
-
-#if 0 // XXX old animation system
- make_local_ipo(key->ipo);
-#endif // XXX old animation system
}
/* Sort shape keys and Ipo curves after a change. This assumes that at most
@@ -523,36 +516,53 @@ static char *key_block_get_data(Key *key, KeyBlock *actkb, KeyBlock *kb, char **
return kb->data;
}
-static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *actkb, KeyBlock *kb, float *weights, int mode)
+
+/* currently only the first value of 'ofs' may be set. */
+static short key_pointer_size(const Key *key, const int mode, int *poinsize, int *ofs)
+{
+ if(key->from==NULL) {
+ return FALSE;
+ }
+
+ switch(GS(key->from->name)) {
+ case ID_ME:
+ *ofs= sizeof(float)*3;
+ *poinsize= *ofs;
+ break;
+ case ID_LT:
+ *ofs= sizeof(float)*3;
+ *poinsize= *ofs;
+ break;
+ case ID_CU:
+ if(mode == KEY_MODE_BPOINT) {
+ *ofs= sizeof(float)*4;
+ *poinsize= *ofs;
+ } else {
+ ofs[0]= sizeof(float)*12;
+ *poinsize= (*ofs) / 3;
+ }
+
+ break;
+ default:
+ BLI_assert(!"invalid 'key->from' ID type");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void cp_key(const int start, int end, const int tot, char *poin, Key *key, KeyBlock *actkb, KeyBlock *kb, float *weights, const int mode)
{
float ktot = 0.0, kd = 0.0;
int elemsize, poinsize = 0, a, *ofsp, ofs[32], flagflo=0;
char *k1, *kref, *freek1, *freekref;
char *cp, elemstr[8];
- if(key->from==NULL) return;
-
- if( GS(key->from->name)==ID_ME ) {
- ofs[0]= sizeof(float)*3;
- ofs[1]= 0;
- poinsize= ofs[0];
- }
- else if( GS(key->from->name)==ID_LT ) {
- ofs[0]= sizeof(float)*3;
- ofs[1]= 0;
- poinsize= ofs[0];
- }
- else if( GS(key->from->name)==ID_CU ) {
- if(mode==KEY_BPOINT) {
- ofs[0]= sizeof(float)*4;
- poinsize= ofs[0];
- }else {
- ofs[0]= sizeof(float)*12;
- poinsize= ofs[0]/3;
- }
+ /* currently always 0, in future key_pointer_size may assign */
+ ofs[1]= 0;
- ofs[1]= 0;
- }
+ if(!key_pointer_size(key, mode, &poinsize, &ofs[0]))
+ return;
if(end>tot) end= tot;
@@ -584,7 +594,7 @@ static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
else k1+= start*key->elemsize;
}
- if(mode==KEY_BEZTRIPLE) {
+ if(mode == KEY_MODE_BEZTRIPLE) {
elemstr[0]= 1;
elemstr[1]= IPO_BEZTRIPLE;
elemstr[2]= 0;
@@ -592,11 +602,11 @@ static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
/* just do it here, not above! */
elemsize= key->elemsize;
- if(mode==KEY_BEZTRIPLE) elemsize*= 3;
+ if(mode == KEY_MODE_BEZTRIPLE) elemsize*= 3;
for(a=start; a<end; a++) {
cp= key->elemstr;
- if(mode==KEY_BEZTRIPLE) cp= elemstr;
+ if(mode == KEY_MODE_BEZTRIPLE) cp= elemstr;
ofsp= ofs;
@@ -619,8 +629,14 @@ static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
case IPO_BEZTRIPLE:
memcpy(poin, k1, sizeof(float)*12);
break;
+ default:
+ /* should never happen */
+ if(freek1) MEM_freeN(freek1);
+ if(freekref) MEM_freeN(freekref);
+ BLI_assert(!"invalid 'cp[1]'");
+ return;
}
-
+
poin+= ofsp[0];
cp+= 2; ofsp++;
}
@@ -639,14 +655,14 @@ static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
kref+= elemsize;
}
- if(mode==KEY_BEZTRIPLE) a+=2;
+ if(mode == KEY_MODE_BEZTRIPLE) a+=2;
}
if(freek1) MEM_freeN(freek1);
if(freekref) MEM_freeN(freekref);
}
-static void cp_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock *kb, int start, int end, char *out, int tot)
+static void cp_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock *kb, const int start, int end, char *out, const int tot)
{
Nurb *nu;
int a, step, a1, a2;
@@ -658,7 +674,7 @@ static void cp_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock *kb, int st
a1= MAX2(a, start);
a2= MIN2(a+step, end);
- if(a1<a2) cp_key(a1, a2, tot, out, key, actkb, kb, NULL, KEY_BPOINT);
+ if(a1<a2) cp_key(a1, a2, tot, out, key, actkb, kb, NULL, KEY_MODE_BPOINT);
}
else if(nu->bezt) {
step= 3*nu->pntsu;
@@ -667,45 +683,26 @@ static void cp_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock *kb, int st
a1= MAX2(a, start);
a2= MIN2(a+step, end);
- if(a1<a2) cp_key(a1, a2, tot, out, key, actkb, kb, NULL, KEY_BEZTRIPLE);
+ if(a1<a2) cp_key(a1, a2, tot, out, key, actkb, kb, NULL, KEY_MODE_BEZTRIPLE);
}
else
step= 0;
}
}
-
-void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, KeyBlock *actkb, int mode)
+void do_rel_key(const int start, int end, const int tot, char *basispoin, Key *key, KeyBlock *actkb, const int mode)
{
KeyBlock *kb;
int *ofsp, ofs[3], elemsize, b;
char *cp, *poin, *reffrom, *from, elemstr[8];
char *freefrom, *freereffrom;
- int poinsize= 0;
-
- if(key->from==NULL) return;
+ int poinsize;
- if( GS(key->from->name)==ID_ME ) {
- ofs[0]= sizeof(float)*3;
- ofs[1]= 0;
- poinsize= ofs[0];
- }
- else if( GS(key->from->name)==ID_LT ) {
- ofs[0]= sizeof(float)*3;
- ofs[1]= 0;
- poinsize= ofs[0];
- }
- else if( GS(key->from->name)==ID_CU ) {
- if(mode==KEY_BPOINT) {
- ofs[0]= sizeof(float)*4;
- poinsize= ofs[0];
- } else {
- ofs[0]= sizeof(float)*12;
- poinsize= ofs[0] / 3;
- }
+ /* currently always 0, in future key_pointer_size may assign */
+ ofs[1]= 0;
- ofs[1]= 0;
- }
+ if(!key_pointer_size(key, mode, &poinsize, &ofs[0]))
+ return;
if(end>tot) end= tot;
@@ -716,7 +713,7 @@ void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, KeyBlock
/* just here, not above! */
elemsize= key->elemsize;
- if(mode==KEY_BEZTRIPLE) elemsize*= 3;
+ if(mode == KEY_MODE_BEZTRIPLE) elemsize*= 3;
/* step 1 init */
cp_key(start, end, tot, basispoin, key, actkb, key->refkey, NULL, mode);
@@ -752,7 +749,7 @@ void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, KeyBlock
weight= icuval;
cp= key->elemstr;
- if(mode==KEY_BEZTRIPLE) cp= elemstr;
+ if(mode == KEY_MODE_BEZTRIPLE) cp= elemstr;
ofsp= ofs;
@@ -768,8 +765,14 @@ void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, KeyBlock
case IPO_BEZTRIPLE:
rel_flerp(12, (float *)poin, (float *)reffrom, (float *)from, weight);
break;
+ default:
+ /* should never happen */
+ if(freefrom) MEM_freeN(freefrom);
+ if(freereffrom) MEM_freeN(freereffrom);
+ BLI_assert(!"invalid 'cp[1]'");
+ return;
}
-
+
poin+= ofsp[0];
cp+= 2;
@@ -779,7 +782,7 @@ void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, KeyBlock
reffrom+= elemsize;
from+= elemsize;
- if(mode==KEY_BEZTRIPLE) b+= 2;
+ if(mode == KEY_MODE_BEZTRIPLE) b+= 2;
if(weights) weights++;
}
@@ -791,7 +794,7 @@ void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, KeyBlock
}
-static void do_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *actkb, KeyBlock **k, float *t, int mode)
+static void do_key(const int start, int end, const int tot, char *poin, Key *key, KeyBlock *actkb, KeyBlock **k, float *t, const int mode)
{
float k1tot = 0.0, k2tot = 0.0, k3tot = 0.0, k4tot = 0.0;
float k1d = 0.0, k2d = 0.0, k3d = 0.0, k4d = 0.0;
@@ -800,29 +803,11 @@ static void do_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
char *k1, *k2, *k3, *k4, *freek1, *freek2, *freek3, *freek4;
char *cp, elemstr[8];;
- if(key->from==0) return;
+ /* currently always 0, in future key_pointer_size may assign */
+ ofs[1]= 0;
- if( GS(key->from->name)==ID_ME ) {
- ofs[0]= sizeof(float)*3;
- ofs[1]= 0;
- poinsize= ofs[0];
- }
- else if( GS(key->from->name)==ID_LT ) {
- ofs[0]= sizeof(float)*3;
- ofs[1]= 0;
- poinsize= ofs[0];
- }
- else if( GS(key->from->name)==ID_CU ) {
- if(mode==KEY_BPOINT) {
- ofs[0]= sizeof(float)*4;
- poinsize= ofs[0];
- } else {
- ofs[0]= sizeof(float)*12;
- poinsize= ofs[0] / 3;
- }
-
- ofs[1]= 0;
- }
+ if(!key_pointer_size(key, mode, &poinsize, &ofs[0]))
+ return;
if(end>tot) end= tot;
@@ -924,12 +909,12 @@ static void do_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
/* only here, not above! */
elemsize= key->elemsize;
- if(mode==KEY_BEZTRIPLE) elemsize*= 3;
+ if(mode == KEY_MODE_BEZTRIPLE) elemsize*= 3;
for(a=start; a<end; a++) {
cp= key->elemstr;
- if(mode==KEY_BEZTRIPLE) cp= elemstr;
+ if(mode == KEY_MODE_BEZTRIPLE) cp= elemstr;
ofsp= ofs;
@@ -945,6 +930,14 @@ static void do_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
case IPO_BEZTRIPLE:
flerp(12, (void *)poin, (void *)k1, (void *)k2, (void *)k3, (void *)k4, t);
break;
+ default:
+ /* should never happen */
+ if(freek1) MEM_freeN(freek1);
+ if(freek2) MEM_freeN(freek2);
+ if(freek3) MEM_freeN(freek3);
+ if(freek4) MEM_freeN(freek4);
+ BLI_assert(!"invalid 'cp[1]'");
+ return;
}
poin+= ofsp[0];
@@ -993,7 +986,7 @@ static void do_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
else k4+= elemsize;
}
- if(mode==KEY_BEZTRIPLE) a+= 2;
+ if(mode == KEY_MODE_BEZTRIPLE) a+= 2;
}
if(freek1) MEM_freeN(freek1);
@@ -1067,7 +1060,7 @@ static float *get_weights_array(Object *ob, char *vgroup)
return NULL;
}
-static void do_mesh_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
+static void do_mesh_key(Scene *scene, Object *ob, Key *key, char *out, const int tot)
{
KeyBlock *k[4], *actkb= ob_get_keyblock(ob);
float cfra, ctime, t[4], delta;
@@ -1102,9 +1095,9 @@ static void do_mesh_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
flag= setkeys(ctime, &key->block, k, t, 0);
if(flag==0)
- do_key(a, a+step, tot, (char *)out, key, actkb, k, t, 0);
+ do_key(a, a+step, tot, (char *)out, key, actkb, k, t, KEY_MODE_DUMMY);
else
- cp_key(a, a+step, tot, (char *)out, key, actkb, k[2], NULL, 0);
+ cp_key(a, a+step, tot, (char *)out, key, actkb, k[2], NULL, KEY_MODE_DUMMY);
}
}
else {
@@ -1114,7 +1107,7 @@ static void do_mesh_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
for(kb= key->block.first; kb; kb= kb->next)
kb->weights= get_weights_array(ob, kb->vgroup);
- do_rel_key(0, tot, tot, (char *)out, key, actkb, 0);
+ do_rel_key(0, tot, tot, (char *)out, key, actkb, KEY_MODE_DUMMY);
for(kb= key->block.first; kb; kb= kb->next) {
if(kb->weights) MEM_freeN(kb->weights);
@@ -1137,14 +1130,14 @@ static void do_mesh_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
flag= setkeys(ctime, &key->block, k, t, 0);
if(flag==0)
- do_key(0, tot, tot, (char *)out, key, actkb, k, t, 0);
+ do_key(0, tot, tot, (char *)out, key, actkb, k, t, KEY_MODE_DUMMY);
else
- cp_key(0, tot, tot, (char *)out, key, actkb, k[2], NULL, 0);
+ cp_key(0, tot, tot, (char *)out, key, actkb, k[2], NULL, KEY_MODE_DUMMY);
}
}
}
-static void do_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock **k, float *t, char *out, int tot)
+static void do_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock **k, float *t, char *out, const int tot)
{
Nurb *nu;
int a, step;
@@ -1152,18 +1145,18 @@ static void do_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock **k, float
for(a=0, nu=cu->nurb.first; nu; nu=nu->next, a+=step) {
if(nu->bp) {
step= nu->pntsu*nu->pntsv;
- do_key(a, a+step, tot, out, key, actkb, k, t, KEY_BPOINT);
+ do_key(a, a+step, tot, out, key, actkb, k, t, KEY_MODE_BPOINT);
}
else if(nu->bezt) {
step= 3*nu->pntsu;
- do_key(a, a+step, tot, out, key, actkb, k, t, KEY_BEZTRIPLE);
+ do_key(a, a+step, tot, out, key, actkb, k, t, KEY_MODE_BEZTRIPLE);
}
else
step= 0;
}
}
-static void do_rel_cu_key(Curve *cu, Key *key, KeyBlock *actkb, float ctime, char *out, int tot)
+static void do_rel_cu_key(Curve *cu, Key *key, KeyBlock *actkb, float UNUSED(ctime), char *out, const int tot)
{
Nurb *nu;
int a, step;
@@ -1171,18 +1164,18 @@ static void do_rel_cu_key(Curve *cu, Key *key, KeyBlock *actkb, float ctime, cha
for(a=0, nu=cu->nurb.first; nu; nu=nu->next, a+=step) {
if(nu->bp) {
step= nu->pntsu*nu->pntsv;
- do_rel_key(a, a+step, tot, out, key, actkb, KEY_BPOINT);
+ do_rel_key(a, a+step, tot, out, key, actkb, KEY_MODE_BPOINT);
}
else if(nu->bezt) {
step= 3*nu->pntsu;
- do_rel_key(a, a+step, tot, out, key, actkb, KEY_BEZTRIPLE);
+ do_rel_key(a, a+step, tot, out, key, actkb, KEY_MODE_BEZTRIPLE);
}
else
step= 0;
}
}
-static void do_curve_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
+static void do_curve_key(Scene *scene, Object *ob, Key *key, char *out, const int tot)
{
Curve *cu= ob->data;
KeyBlock *k[4], *actkb= ob_get_keyblock(ob);
@@ -1191,7 +1184,7 @@ static void do_curve_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
if(key->slurph && key->type!=KEY_RELATIVE) {
Nurb *nu;
- int mode, i= 0, remain= 0, estep, count;
+ int mode=0, i= 0, remain= 0, estep=0, count=0;
delta= (float)key->slurph / tot;
@@ -1206,11 +1199,11 @@ static void do_curve_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
for(nu=cu->nurb.first; nu; nu=nu->next) {
if(nu->bp) {
- mode= KEY_BPOINT;
+ mode= KEY_MODE_BPOINT;
estep= nu->pntsu*nu->pntsv;
}
else if(nu->bezt) {
- mode= KEY_BEZTRIPLE;
+ mode= KEY_MODE_BEZTRIPLE;
estep= 3*nu->pntsu;
}
else
@@ -1230,7 +1223,7 @@ static void do_curve_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
}
count= MIN2(remain, estep);
- if (mode == KEY_BEZTRIPLE) {
+ if (mode == KEY_MODE_BEZTRIPLE) {
count += 3 - count % 3;
}
@@ -1268,7 +1261,7 @@ static void do_curve_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
}
}
-static void do_latt_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
+static void do_latt_key(Scene *scene, Object *ob, Key *key, char *out, const int tot)
{
Lattice *lt= ob->data;
KeyBlock *k[4], *actkb= ob_get_keyblock(ob);
@@ -1294,9 +1287,9 @@ static void do_latt_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
flag= setkeys(ctime, &key->block, k, t, 0);
if(flag==0)
- do_key(a, a+1, tot, (char *)out, key, actkb, k, t, 0);
+ do_key(a, a+1, tot, (char *)out, key, actkb, k, t, KEY_MODE_DUMMY);
else
- cp_key(a, a+1, tot, (char *)out, key, actkb, k[2], NULL, 0);
+ cp_key(a, a+1, tot, (char *)out, key, actkb, k[2], NULL, KEY_MODE_DUMMY);
}
}
else {
@@ -1306,7 +1299,7 @@ static void do_latt_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
for(kb= key->block.first; kb; kb= kb->next)
kb->weights= get_weights_array(ob, kb->vgroup);
- do_rel_key(0, tot, tot, (char *)out, key, actkb, 0);
+ do_rel_key(0, tot, tot, (char *)out, key, actkb, KEY_MODE_DUMMY);
for(kb= key->block.first; kb; kb= kb->next) {
if(kb->weights) MEM_freeN(kb->weights);
@@ -1326,9 +1319,9 @@ static void do_latt_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
flag= setkeys(ctime, &key->block, k, t, 0);
if(flag==0)
- do_key(0, tot, tot, (char *)out, key, actkb, k, t, 0);
+ do_key(0, tot, tot, (char *)out, key, actkb, k, t, KEY_MODE_DUMMY);
else
- cp_key(0, tot, tot, (char *)out, key, actkb, k[2], NULL, 0);
+ cp_key(0, tot, tot, (char *)out, key, actkb, k[2], NULL, KEY_MODE_DUMMY);
}
}
@@ -1441,7 +1434,7 @@ Key *ob_get_key(Object *ob)
return NULL;
}
-KeyBlock *add_keyblock(Key *key, char *name)
+KeyBlock *add_keyblock(Key *key, const char *name)
{
KeyBlock *kb;
float curpos= -0.1;
@@ -1657,7 +1650,7 @@ void curve_to_key(Curve *cu, KeyBlock *kb, ListBase *nurb)
}
}
-void key_to_curve(KeyBlock *kb, Curve *cu, ListBase *nurb)
+void key_to_curve(KeyBlock *kb, Curve *UNUSED(cu), ListBase *nurb)
{
Nurb *nu;
BezTriple *bezt;
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 1390f0dbd56..be3ec62374f 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -40,6 +40,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
@@ -49,6 +50,7 @@
#include "DNA_curve_types.h"
#include "DNA_key_types.h"
+#include "BKE_animsys.h"
#include "BKE_anim.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_displist.h"
@@ -59,7 +61,7 @@
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
-#include "BKE_utildefines.h"
+
#include "BKE_deform.h"
//XXX #include "BIF_editdeform.h"
@@ -181,7 +183,7 @@ void resizelattice(Lattice *lt, int uNew, int vNew, int wNew, Object *ltOb)
MEM_freeN(vertexCos);
}
-Lattice *add_lattice(char *name)
+Lattice *add_lattice(const char *name)
{
Lattice *lt;
@@ -203,10 +205,6 @@ Lattice *copy_lattice(Lattice *lt)
ltn= copy_libblock(lt);
ltn->def= MEM_dupallocN(lt->def);
-
-#if 0 // XXX old animation system
- id_us_plus((ID *)ltn->ipo);
-#endif // XXX old animation system
ltn->key= copy_key(ltn->key);
if(ltn->key) ltn->key->from= (ID *)ltn;
@@ -233,6 +231,12 @@ void free_lattice(Lattice *lt)
MEM_freeN(editlt);
MEM_freeN(lt->editlatt);
}
+
+ /* free animation data */
+ if (lt->adt) {
+ BKE_free_animdata(&lt->id);
+ lt->adt= NULL;
+ }
}
@@ -599,16 +603,6 @@ static int calc_curve_deform(Scene *scene, Object *par, float *co, short axis, C
}
#endif
-
- static float q_x90d[4] = {0.70710676908493, 0.70710676908493, 0.0, 0.0}; // float rot_axis[3]= {1,0,0}; axis_angle_to_quat(q, rot_axis, 90 * (M_PI / 180));
- static float q_y90d[4] = {0.70710676908493, 0.0, 0.70710676908493, 0.0}; // float rot_axis[3]= {0,1,0}; axis_angle_to_quat(q, rot_axis, 90 * (M_PI / 180));
- static float q_z90d[4] = {0.70710676908493, 0.0, 0.0, 0.70710676908493}; // float rot_axis[3]= {0,0,2}; axis_angle_to_quat(q, rot_axis, 90 * (M_PI / 180));
-
- static float q_nx90d[4] = {0.70710676908493, -0.70710676908493, 0.0, 0.0}; // float rot_axis[3]= {1,0,0}; axis_angle_to_quat(q, rot_axis, -90 * (M_PI / 180));
- static float q_ny90d[4] = {0.70710676908493, 0.0, -0.70710676908493, 0.0}; // float rot_axis[3]= {0,1,0}; axis_angle_to_quat(q, rot_axis, -90 * (M_PI / 180));
- static float q_nz90d[4] = {0.70710676908493, 0.0, 0.0, -0.70710676908493}; // float rot_axis[3]= {0,0,2}; axis_angle_to_quat(q, rot_axis, -90 * (M_PI / 180));
-
-
if(cd->no_rot_axis) { /* set by caller */
/* this is not exactly the same as 2.4x, since the axis is having rotation removed rather then
@@ -635,53 +629,18 @@ static int calc_curve_deform(Scene *scene, Object *par, float *co, short axis, C
* Notice X,Y,Z Up all have light colors and each ordered CCW.
*
* Now for Neg Up XYZ, the colors are all dark, and ordered clockwise - Campbell
+ *
+ * note: moved functions into quat_apply_track/vec_apply_track
* */
+ copy_qt_qt(quat, new_quat);
+ copy_v3_v3(cent, co);
+
+ /* zero the axis which is not used,
+ * the big block of text above now applies to these 3 lines */
+ quat_apply_track(quat, axis-1, (axis==1 || axis==3) ? 1:0); /* up flag is a dummy, set so no rotation is done */
+ vec_apply_track(cent, axis-1);
+ cent[axis < 4 ? axis-1 : axis-4]= 0.0f;
- switch(axis) {
- case MOD_CURVE_POSX:
- mul_qt_qtqt(quat, new_quat, q_y90d);
-
- cent[0]= 0.0;
- cent[1]= co[2];
- cent[2]= co[1];
- break;
- case MOD_CURVE_NEGX:
- mul_qt_qtqt(quat, new_quat, q_ny90d);
-
- cent[0]= 0.0;
- cent[1]= -co[1];
- cent[2]= co[2];
-
- break;
- case MOD_CURVE_POSY:
- mul_qt_qtqt(quat, new_quat, q_x90d);
-
- cent[0]= co[2];
- cent[1]= 0.0;
- cent[2]= -co[0];
- break;
- case MOD_CURVE_NEGY:
- mul_qt_qtqt(quat, new_quat, q_nx90d);
-
- cent[0]= -co[0];
- cent[1]= 0.0;
- cent[2]= -co[2];
- break;
- case MOD_CURVE_POSZ:
- mul_qt_qtqt(quat, new_quat, q_z90d);
-
- cent[0]= co[1];
- cent[1]= -co[0];
- cent[2]= 0.0;
- break;
- case MOD_CURVE_NEGZ:
- mul_qt_qtqt(quat, new_quat, q_nz90d);
-
- cent[0]= co[0];
- cent[1]= -co[1];
- cent[2]= 0.0;
- break;
- }
/* scale if enabled */
if(cu->flag & CU_PATH_RADIUS)
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 834e7de5811..6eb5399404a 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -39,6 +39,7 @@
#include <string.h>
#include <stdlib.h>
#include <stddef.h>
+#include <assert.h>
#include "MEM_guardedalloc.h"
@@ -66,9 +67,10 @@
#include "DNA_world_types.h"
#include "DNA_gpencil_types.h"
-
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
+
#include "BKE_animsys.h"
#include "BKE_context.h"
@@ -136,8 +138,14 @@ void id_us_plus(ID *id)
void id_us_min(ID *id)
{
- if(id)
- id->us--;
+ if(id) {
+ if(id->us<2 && (id->flag & LIB_FAKEUSER))
+ id->us= 1;
+ else if(id->us<=0)
+ printf("ID user decrement error: %s \n", id->name);
+ else
+ id->us--;
+ }
}
int id_make_local(ID *id, int test)
@@ -302,7 +310,7 @@ int id_copy(ID *id, ID **newid, int test)
if(!test) *newid= (ID*)copy_action((bAction*)id);
return 1;
case ID_NT:
- if(!test) *newid= (ID*)ntreeCopyTree((bNodeTree*)id, 0);
+ if(!test) *newid= (ID*)ntreeCopyTree((bNodeTree*)id);
return 1;
case ID_BR:
if(!test) *newid= (ID*)copy_brush((Brush*)id);
@@ -335,7 +343,7 @@ int id_unlink(ID *id, int test)
break;
case ID_OB:
if(test) return 1;
- unlink_object(NULL, (Object*)id);
+ unlink_object((Object*)id);
break;
}
@@ -442,7 +450,7 @@ void recalc_all_library_objects(Main *main)
/* flag for full recalc */
for(ob=main->object.first; ob; ob=ob->id.next)
if(ob->id.lib)
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
/* note: MAX_LIBARRAY define should match this code */
@@ -450,11 +458,13 @@ int set_listbasepointers(Main *main, ListBase **lb)
{
int a = 0;
- /* BACKWARDS! also watch order of free-ing! (mesh<->mat) */
-
+ /* BACKWARDS! also watch order of free-ing! (mesh<->mat), first items freed last.
+ * This is important because freeing data decreases usercounts of other datablocks,
+ * if this data is its self freed it can crash. */
lb[a++]= &(main->ipo);
lb[a++]= &(main->action); // xxx moved here to avoid problems when freeing with animato (aligorith)
lb[a++]= &(main->key);
+ lb[a++]= &(main->gpencil); /* referenced by nodes, objects, view, scene etc, before to free after. */
lb[a++]= &(main->nodetree);
lb[a++]= &(main->image);
lb[a++]= &(main->tex);
@@ -481,14 +491,13 @@ int set_listbasepointers(Main *main, ListBase **lb)
lb[a++]= &(main->brush);
lb[a++]= &(main->script);
lb[a++]= &(main->particle);
-
+
lb[a++]= &(main->world);
lb[a++]= &(main->screen);
lb[a++]= &(main->object);
lb[a++]= &(main->scene);
lb[a++]= &(main->library);
lb[a++]= &(main->wm);
- lb[a++]= &(main->gpencil);
lb[a]= NULL;
@@ -617,24 +626,24 @@ void *alloc_libblock(ListBase *lb, short type, const char *name)
/* by spec, animdata is first item after ID */
/* and, trust that BKE_animdata_from_id() will only find AnimData for valid ID-types */
-static void id_copy_animdata(ID *id)
+static void id_copy_animdata(ID *id, const short do_action)
{
AnimData *adt= BKE_animdata_from_id(id);
if (adt) {
IdAdtTemplate *iat = (IdAdtTemplate *)id;
- iat->adt= BKE_copy_animdata(iat->adt);
+ iat->adt= BKE_copy_animdata(iat->adt, do_action); /* could be set to FALSE, need to investigate */
}
}
/* material nodes use this since they are not treated as libdata */
-void copy_libblock_data(ID *id, const ID *id_from)
+void copy_libblock_data(ID *id, const ID *id_from, const short do_action)
{
if (id_from->properties)
id->properties = IDP_CopyProperty(id_from->properties);
/* the duplicate should get a copy of the animdata */
- id_copy_animdata(id);
+ id_copy_animdata(id, do_action);
}
/* used everywhere in blenkernel */
@@ -649,11 +658,9 @@ void *copy_libblock(void *rt)
lb= which_libbase(G.main, GS(id->name));
idn= alloc_libblock(lb, GS(id->name), id->name+2);
-
- if(idn==NULL) {
- printf("ERROR: Illegal ID name for %s (Crashing now)\n", id->name);
- }
-
+
+ assert(idn != NULL);
+
idn_len= MEM_allocN_len(idn);
if(idn_len - sizeof(ID) > 0) {
cp= (char *)id;
@@ -664,12 +671,12 @@ void *copy_libblock(void *rt)
id->newid= idn;
idn->flag |= LIB_NEW;
- copy_libblock_data(idn, id);
+ copy_libblock_data(idn, id, FALSE);
return idn;
}
-static void free_library(Library *lib)
+static void free_library(Library *UNUSED(lib))
{
/* no freeing needed for libraries yet */
}
@@ -681,7 +688,7 @@ void set_free_windowmanager_cb(void (*func)(bContext *C, wmWindowManager *) )
free_windowmanager_cb= func;
}
-void animdata_dtar_clear_cb(ID *id, AnimData *adt, void *userdata)
+void animdata_dtar_clear_cb(ID *UNUSED(id), AnimData *adt, void *userdata)
{
ChannelDriver *driver;
FCurve *fcu;
@@ -822,7 +829,7 @@ void free_libblock_us(ListBase *lb, void *idv) /* test users */
else printf("ERROR block %s users %d\n", id->name, id->us);
}
if(id->us==0) {
- if( GS(id->name)==ID_OB ) unlink_object(NULL, (Object *)id);
+ if( GS(id->name)==ID_OB ) unlink_object((Object *)id);
free_libblock(lb, id);
}
@@ -851,7 +858,7 @@ void free_main(Main *mainvar)
/* ***************** ID ************************ */
-ID *find_id(char *type, char *name) /* type: "OB" or "MA" etc */
+ID *find_id(const char *type, const char *name) /* type: "OB" or "MA" etc */
{
ListBase *lb= which_libbase(G.main, GS(type));
return BLI_findstring(lb, name, offsetof(ID, name) + 2);
@@ -940,7 +947,7 @@ static void IDnames_to_dyn_pupstring(DynStr *pupds, ListBase *lb, ID *link, shor
/* used by headerbuttons.c buttons.c editobject.c editseq.c */
/* if nr==NULL no MAX_IDPUP, this for non-header browsing */
-void IDnames_to_pupstring(char **str, char *title, char *extraops, ListBase *lb, ID *link, short *nr)
+void IDnames_to_pupstring(const char **str, const char *title, const char *extraops, ListBase *lb, ID *link, short *nr)
{
DynStr *pupds= BLI_dynstr_new();
@@ -962,7 +969,7 @@ void IDnames_to_pupstring(char **str, char *title, char *extraops, ListBase *lb,
}
/* skips viewer images */
-void IMAnames_to_pupstring(char **str, char *title, char *extraops, ListBase *lb, ID *link, short *nr)
+void IMAnames_to_pupstring(const char **str, const char *title, const char *extraops, ListBase *lb, ID *link, short *nr)
{
DynStr *pupds= BLI_dynstr_new();
@@ -983,35 +990,6 @@ void IMAnames_to_pupstring(char **str, char *title, char *extraops, ListBase *lb
BLI_dynstr_free(pupds);
}
-
-/* used by buttons.c library.c mball.c */
-int splitIDname(char *name, char *left, int *nr)
-{
- int a;
-
- *nr= 0;
- strncpy(left, name, 21);
-
- a= strlen(name);
- if(a>1 && name[a-1]=='.') return a;
-
- while(a--) {
- if( name[a]=='.' ) {
- left[a]= 0;
- *nr= atol(name+a+1);
- return a;
- }
- if( isdigit(name[a])==0 ) break;
-
- left[a]= 0;
- }
-
- for(a= 0; name[a]; a++)
- left[a]= name[a];
-
- return a;
-}
-
static void sort_alpha_id(ListBase *lb, ID *id)
{
ID *idtest;
@@ -1040,7 +1018,7 @@ static void sort_alpha_id(ListBase *lb, ID *id)
* Check to see if there is an ID with the same name as 'name'.
* Returns the ID if so, if not, returns NULL
*/
-static ID *is_dupid(ListBase *lb, ID *id, char *name)
+static ID *is_dupid(ListBase *lb, ID *id, const char *name)
{
ID *idtest=NULL;
@@ -1091,7 +1069,7 @@ static int check_for_dupid(ListBase *lb, ID *id, char *name)
memset(in_use, 0, sizeof(in_use));
/* get name portion, number portion ("name.number") */
- left_len= splitIDname(name, left, &nr);
+ left_len= BLI_split_name_num(left, &nr, name, '.');
/* if new name will be too long, truncate it */
if(nr > 999 && left_len > 16) {
@@ -1108,7 +1086,7 @@ static int check_for_dupid(ListBase *lb, ID *id, char *name)
(idtest->lib == NULL) &&
(*name == *(idtest->name+2)) &&
(strncmp(name, idtest->name+2, left_len)==0) &&
- (splitIDname(idtest->name+2, leftest, &nrtest) == left_len)
+ (BLI_split_name_num(leftest, &nrtest, idtest->name+2, '.') == left_len)
) {
if(nrtest < sizeof(in_use))
in_use[nrtest]= 1; /* mark as used */
@@ -1234,7 +1212,7 @@ static void image_fix_relative_path(Image *ima)
if(ima->id.lib==NULL) return;
if(strncmp(ima->name, "//", 2)==0) {
BLI_path_abs(ima->name, ima->id.lib->filepath);
- BLI_path_rel(ima->name, G.sce);
+ BLI_path_rel(ima->name, G.main->name);
}
}
@@ -1279,18 +1257,36 @@ static void lib_indirect_test_id(ID *id, Library *lib)
}
}
-void tag_main(struct Main *mainvar, int tag)
+void tag_main_lb(ListBase *lb, const short tag)
{
- ListBase *lbarray[MAX_LIBARRAY];
ID *id;
+ if(tag) {
+ for(id= lb->first; id; id= id->next) {
+ id->flag |= LIB_DOIT;
+ }
+ }
+ else {
+ for(id= lb->first; id; id= id->next) {
+ id->flag &= ~LIB_DOIT;
+ }
+ }
+}
+
+void tag_main_idcode(struct Main *mainvar, const short type, const short tag)
+{
+ ListBase *lb= which_libbase(mainvar, type);
+
+ tag_main_lb(lb, tag);
+}
+
+void tag_main(struct Main *mainvar, const short tag)
+{
+ ListBase *lbarray[MAX_LIBARRAY];
int a;
a= set_listbasepointers(mainvar, lbarray);
while(a--) {
- for(id= lbarray[a]->first; id; id= id->next) {
- if(tag) id->flag |= LIB_DOIT;
- else id->flag &= ~LIB_DOIT;
- }
+ tag_main_lb(lbarray[a], tag);
}
}
@@ -1389,11 +1385,11 @@ void text_idbutton(struct ID *id, char *text)
}
}
-void rename_id(ID *id, char *name)
+void rename_id(ID *id, const char *name)
{
ListBase *lb;
- strncpy(id->name+2, name, 21);
+ BLI_strncpy(id->name+2, name, sizeof(id->name)-2);
lb= which_libbase(G.main, GS(id->name) );
new_id(lb, id, name);
@@ -1402,7 +1398,7 @@ void rename_id(ID *id, char *name)
void name_uiprefix_id(char *name, ID *id)
{
name[0] = id->lib ? 'L':' ';
- name[1] = id->flag & LIB_FAKEUSER ? 'F':' ';
+ name[1] = id->flag & LIB_FAKEUSER ? 'F': (id->us==0)?'0':' ';
name[2] = ' ';
strcpy(name+3, id->name+2);
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 7e52f746ebc..152323dfb4d 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -44,6 +44,8 @@
#include "DNA_scene_types.h"
#include "BLI_math.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
#include "BKE_animsys.h"
#include "BKE_displist.h"
@@ -54,7 +56,7 @@
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_node.h"
-#include "BKE_utildefines.h"
+
#include "GPU_material.h"
@@ -84,7 +86,8 @@ void free_material(Material *ma)
BKE_free_animdata((ID *)ma);
- BKE_previewimg_free(&ma->preview);
+ if(ma->preview)
+ BKE_previewimg_free(&ma->preview);
BKE_icon_delete((struct ID*)ma);
ma->id.icon_id = 0;
@@ -185,7 +188,7 @@ void init_material(Material *ma)
ma->preview = NULL;
}
-Material *add_material(char *name)
+Material *add_material(const char *name)
{
Material *ma;
@@ -196,6 +199,7 @@ Material *add_material(char *name)
return ma;
}
+/* XXX keep synced with next function */
Material *copy_material(Material *ma)
{
Material *man;
@@ -203,9 +207,6 @@ Material *copy_material(Material *ma)
man= copy_libblock(ma);
-#if 0 // XXX old animation system
- id_us_plus((ID *)man->ipo);
-#endif // XXX old animation system
id_lib_extern((ID *)man->group);
for(a=0; a<MAX_MTEX; a++) {
@@ -222,7 +223,7 @@ Material *copy_material(Material *ma)
if (ma->preview) man->preview = BKE_previewimg_copy(ma->preview);
if(ma->nodetree) {
- man->nodetree= ntreeCopyTree(ma->nodetree, 0); /* 0 == full new tree */
+ man->nodetree= ntreeCopyTree(ma->nodetree); /* 0 == full new tree */
}
man->gpumaterial.first= man->gpumaterial.last= NULL;
@@ -230,6 +231,38 @@ Material *copy_material(Material *ma)
return man;
}
+/* XXX (see above) material copy without adding to main dbase */
+Material *localize_material(Material *ma)
+{
+ Material *man;
+ int a;
+
+ man= copy_libblock(ma);
+ BLI_remlink(&G.main->mat, man);
+
+ for(a=0; a<MAX_MTEX; a++) {
+ if(ma->mtex[a]) {
+ man->mtex[a]= MEM_mallocN(sizeof(MTex), "copymaterial");
+ memcpy(man->mtex[a], ma->mtex[a], sizeof(MTex));
+ /* free_material decrements! */
+ id_us_plus((ID *)man->mtex[a]->tex);
+ }
+ }
+
+ if(ma->ramp_col) man->ramp_col= MEM_dupallocN(ma->ramp_col);
+ if(ma->ramp_spec) man->ramp_spec= MEM_dupallocN(ma->ramp_spec);
+
+ man->preview = NULL;
+
+ if(ma->nodetree) {
+ man->nodetree= ntreeLocalize(ma->nodetree);
+ }
+
+ man->gpumaterial.first= man->gpumaterial.last= NULL;
+
+ return man;
+}
+
void make_local_material(Material *ma)
{
Main *bmain= G.main;
@@ -445,7 +478,7 @@ Material ***give_matarar_id(ID *id)
return &(((Curve *)id)->mat);
break;
case ID_MB:
- return &(((Curve *)id)->mat);
+ return &(((MetaBall *)id)->mat);
break;
}
return NULL;
@@ -461,7 +494,7 @@ short *give_totcolp_id(ID *id)
return &(((Curve *)id)->totcol);
break;
case ID_MB:
- return &(((Curve *)id)->totcol);
+ return &(((MetaBall *)id)->totcol);
break;
}
return NULL;
@@ -492,6 +525,7 @@ Material *material_pop_id(ID *id, int index)
short *totcol= give_totcolp_id(id);
if(index >= 0 && index < (*totcol)) {
ret= (*matar)[index];
+ id_us_min((ID *)ret);
if(*totcol <= 1) {
*totcol= 0;
MEM_freeN(*matar);
@@ -529,6 +563,10 @@ Material *give_current_material(Object *ob, int act)
totcolp= give_totcolp(ob);
if(totcolp==NULL || ob->totcol==0) return NULL;
+ if(act<0) {
+ printf("no!\n");
+ }
+
if(act>ob->totcol) act= ob->totcol;
else if(act<=0) act= 1;
@@ -589,67 +627,53 @@ Material *give_node_material(Material *ma)
/* from misc_util: flip the bytes from x */
/* #define GS(x) (((unsigned char *)(x))[0] << 8 | ((unsigned char *)(x))[1]) */
-void test_object_materials(ID *id)
+void resize_object_material(Object *ob, const short totcol)
{
- /* make the ob mat-array same size as 'ob->data' mat-array */
- Object *ob;
- Mesh *me;
- Curve *cu;
- MetaBall *mb;
Material **newmatar;
char *newmatbits;
- int totcol=0;
- if(id==0) return;
-
- if( GS(id->name)==ID_ME ) {
- me= (Mesh *)id;
- totcol= me->totcol;
+ if(totcol==0) {
+ if(ob->totcol) {
+ MEM_freeN(ob->mat);
+ MEM_freeN(ob->matbits);
+ ob->mat= NULL;
+ ob->matbits= NULL;
+ }
}
- else if( GS(id->name)==ID_CU ) {
- cu= (Curve *)id;
- totcol= cu->totcol;
+ else if(ob->totcol<totcol) {
+ newmatar= MEM_callocN(sizeof(void *)*totcol, "newmatar");
+ newmatbits= MEM_callocN(sizeof(char)*totcol, "newmatbits");
+ if(ob->totcol) {
+ memcpy(newmatar, ob->mat, sizeof(void *)*ob->totcol);
+ memcpy(newmatbits, ob->matbits, sizeof(char)*ob->totcol);
+ MEM_freeN(ob->mat);
+ MEM_freeN(ob->matbits);
+ }
+ ob->mat= newmatar;
+ ob->matbits= newmatbits;
}
- else if( GS(id->name)==ID_MB ) {
- mb= (MetaBall *)id;
- totcol= mb->totcol;
+ ob->totcol= totcol;
+ if(ob->totcol && ob->actcol==0) ob->actcol= 1;
+ if(ob->actcol>ob->totcol) ob->actcol= ob->totcol;
+}
+
+void test_object_materials(ID *id)
+{
+ /* make the ob mat-array same size as 'ob->data' mat-array */
+ Object *ob;
+ short *totcol;
+
+ if(id==NULL || (totcol=give_totcolp_id(id))==NULL) {
+ return;
}
- else return;
- ob= G.main->object.first;
- while(ob) {
-
+ for(ob= G.main->object.first; ob; ob= ob->id.next) {
if(ob->data==id) {
-
- if(totcol==0) {
- if(ob->totcol) {
- MEM_freeN(ob->mat);
- MEM_freeN(ob->matbits);
- ob->mat= NULL;
- ob->matbits= NULL;
- }
- }
- else if(ob->totcol<totcol) {
- newmatar= MEM_callocN(sizeof(void *)*totcol, "newmatar");
- newmatbits= MEM_callocN(sizeof(char)*totcol, "newmatbits");
- if(ob->totcol) {
- memcpy(newmatar, ob->mat, sizeof(void *)*ob->totcol);
- memcpy(newmatbits, ob->matbits, sizeof(char)*ob->totcol);
- MEM_freeN(ob->mat);
- MEM_freeN(ob->matbits);
- }
- ob->mat= newmatar;
- ob->matbits= newmatbits;
- }
- ob->totcol= totcol;
- if(ob->totcol && ob->actcol==0) ob->actcol= 1;
- if(ob->actcol>ob->totcol) ob->actcol= ob->totcol;
+ resize_object_material(ob, *totcol);
}
- ob= ob->id.next;
}
}
-
void assign_material(Object *ob, Material *ma, int act)
{
Material *mao, **matar, ***matarar;
@@ -763,6 +787,13 @@ int object_add_material_slot(Object *ob)
ma= give_current_material(ob, ob->actcol);
+ if(ma == NULL)
+ ma= add_material("Material");
+ else
+ ma= copy_material(ma);
+
+ id_us_min(&ma->id);
+
assign_material(ob, ma, ob->totcol+1);
ob->actcol= ob->totcol;
return TRUE;
@@ -786,10 +817,10 @@ static void do_init_render_material(Material *ma, int r_mode, float *amb)
ma->texco |= mtex->texco;
ma->mapto |= mtex->mapto;
- if(r_mode & R_OSA) {
- if ELEM3(mtex->tex->type, TEX_IMAGE, TEX_PLUGIN, TEX_ENVMAP) ma->texco |= TEXCO_OSA;
- else if(mtex->texflag & MTEX_NEW_BUMP) ma->texco |= TEXCO_OSA; // NEWBUMP: need texture derivatives for procedurals as well
- }
+
+ /* always get derivatives for these textures */
+ if ELEM3(mtex->tex->type, TEX_IMAGE, TEX_PLUGIN, TEX_ENVMAP) ma->texco |= TEXCO_OSA;
+ else if(mtex->texflag & (MTEX_COMPAT_BUMP|MTEX_3TAP_BUMP|MTEX_5TAP_BUMP)) ma->texco |= TEXCO_OSA;
if(ma->texco & (TEXCO_ORCO|TEXCO_REFL|TEXCO_NORM|TEXCO_STRAND|TEXCO_STRESS)) needuv= 1;
else if(ma->texco & (TEXCO_GLOB|TEXCO_UV|TEXCO_OBJECT|TEXCO_SPEED)) needuv= 1;
@@ -1318,7 +1349,6 @@ void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col)
/* copy/paste buffer, if we had a propper py api that would be better */
Material matcopybuf;
-// MTex mtexcopybuf;
static short matcopied=0;
void clear_matcopybuf(void)
@@ -1329,7 +1359,6 @@ void clear_matcopybuf(void)
void free_matcopybuf(void)
{
-// extern MTex mtexcopybuf; /* buttons.c */
int a;
for(a=0; a<MAX_MTEX; a++) {
@@ -1350,7 +1379,6 @@ void free_matcopybuf(void)
MEM_freeN(matcopybuf.nodetree);
matcopybuf.nodetree= NULL;
}
-// default_mtex(&mtexcopybuf);
matcopied= 0;
}
@@ -1373,7 +1401,7 @@ void copy_matcopybuf(Material *ma)
matcopybuf.mtex[a]= MEM_dupallocN(mtex);
}
}
- matcopybuf.nodetree= ntreeCopyTree(ma->nodetree, 0);
+ matcopybuf.nodetree= ntreeCopyTree(ma->nodetree);
matcopybuf.preview= NULL;
matcopybuf.gpumaterial.first= matcopybuf.gpumaterial.last= NULL;
matcopied= 1;
@@ -1401,7 +1429,7 @@ void paste_matcopybuf(Material *ma)
MEM_freeN(ma->nodetree);
}
- GPU_materials_free(ma);
+ GPU_material_free(ma);
id= (ma->id);
memcpy(ma, &matcopybuf, sizeof(Material));
@@ -1418,11 +1446,5 @@ void paste_matcopybuf(Material *ma)
}
}
- ma->nodetree= ntreeCopyTree(matcopybuf.nodetree, 0);
-
- /*
- BIF_preview_changed(ID_MA);
- BIF_undo_push("Paste material settings");
- scrarea_queue_winredraw(curarea);
- */
+ ma->nodetree= ntreeCopyTree(matcopybuf.nodetree);
}
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index e6f38e04d76..a22fc165de7 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -48,8 +48,9 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
-#include "BKE_utildefines.h"
#include "BKE_global.h"
#include "BKE_main.h"
@@ -86,14 +87,17 @@ void free_mball(MetaBall *mb)
{
unlink_mball(mb);
- if(mb->adt) BKE_free_animdata((ID *)mb);
+ if(mb->adt) {
+ BKE_free_animdata((ID *)mb);
+ mb->adt = NULL;
+ }
if(mb->mat) MEM_freeN(mb->mat);
if(mb->bb) MEM_freeN(mb->bb);
BLI_freelistN(&mb->elems);
if(mb->disp.first) freedisplist(&mb->disp);
}
-MetaBall *add_mball(char *name)
+MetaBall *add_mball(const char *name)
{
MetaBall *mb;
@@ -309,6 +313,19 @@ float *make_orco_mball(Object *ob, ListBase *dispbase)
return orcodata;
}
+
+/* Note on mball basis stuff 2.5x (this is a can of worms)
+ * This really needs a rewrite/refactorm its totally broken in anything other then basic cases
+ * Multiple Scenes + Set Scenes & mixing mball basis SHOULD work but fails to update the depsgraph on rename
+ * and linking into scenes or removal of basis mball. so take care when changing this code.
+ *
+ * Main idiot thing here is that the system returns find_basis_mball() objects which fail a is_basis_mball() test.
+ *
+ * Not only that but the depsgraph and ther areas depend on this behavior!, so making small fixes here isnt worth it.
+ * - campbell
+ */
+
+
/** \brief Test, if Object *ob is basic MetaBall.
*
* It test last character of Object ID name. If last character
@@ -330,8 +347,8 @@ int is_mball_basis_for(Object *ob1, Object *ob2)
int basis1nr, basis2nr;
char basis1name[32], basis2name[32];
- splitIDname(ob1->id.name+2, basis1name, &basis1nr);
- splitIDname(ob2->id.name+2, basis2name, &basis2nr);
+ BLI_split_name_num(basis1name, &basis1nr, ob1->id.name+2, '.');
+ BLI_split_name_num(basis2name, &basis2nr, ob2->id.name+2, '.');
if(!strcmp(basis1name, basis2name)) return is_basis_mball(ob1);
else return 0;
@@ -352,7 +369,7 @@ void copy_mball_properties(Scene *scene, Object *active_object)
int basisnr, obnr;
char basisname[32], obname[32];
- splitIDname(active_object->id.name+2, basisname, &basisnr);
+ BLI_split_name_num(basisname, &basisnr, active_object->id.name+2, '.');
/* XXX recursion check, see scene.c, just too simple code this next_object() */
if(F_ERROR==next_object(&sce_iter, 0, 0, 0))
@@ -361,7 +378,7 @@ void copy_mball_properties(Scene *scene, Object *active_object)
while(next_object(&sce_iter, 1, &base, &ob)) {
if (ob->type==OB_MBALL) {
if(ob!=active_object){
- splitIDname(ob->id.name+2, obname, &obnr);
+ BLI_split_name_num(obname, &obnr, ob->id.name+2, '.');
/* Object ob has to be in same "group" ... it means, that it has to have
* same base of its name */
@@ -385,6 +402,8 @@ void copy_mball_properties(Scene *scene, Object *active_object)
* its name. All MetaBalls with same base of name can be
* blended. MetaBalls with different basic name can't be
* blended.
+ *
+ * warning!, is_basis_mball() can fail on returned object, see long note above.
*/
Object *find_basis_mball(Scene *scene, Object *basis)
{
@@ -394,8 +413,8 @@ Object *find_basis_mball(Scene *scene, Object *basis)
MetaElem *ml=NULL;
int basisnr, obnr;
char basisname[32], obname[32];
-
- splitIDname(basis->id.name+2, basisname, &basisnr);
+
+ BLI_split_name_num(basisname, &basisnr, basis->id.name+2, '.');
totelem= 0;
/* XXX recursion check, see scene.c, just too simple code this next_object() */
@@ -415,7 +434,7 @@ Object *find_basis_mball(Scene *scene, Object *basis)
else ml= mb->elems.first;
}
else{
- splitIDname(ob->id.name+2, obname, &obnr);
+ BLI_split_name_num(obname, &obnr, ob->id.name+2, '.');
/* object ob has to be in same "group" ... it means, that it has to have
* same base of its name */
@@ -719,7 +738,7 @@ void accum_mballfaces(int i1, int i2, int i3, int i4)
void *new_pgn_element(int size)
{
/* during polygonize 1000s of elements are allocated
- * and never freed inbetween. Freeing only done at the end.
+ * and never freed in between. Freeing only done at the end.
*/
int blocksize= 16384;
static int offs= 0; /* the current free address */
@@ -1403,7 +1422,7 @@ void find_first_points(PROCESS *mbproc, MetaBall *mb, int a)
int i, j, k, c_i, c_j, c_k;
int index[3]={1,0,-1};
float f =0.0f;
- float in_v, out_v;
+ float in_v /*, out_v*/;
MB_POINT workp;
float tmp_v, workp_v, max_len, len, dx, dy, dz, nx, ny, nz, MAXN;
@@ -1464,7 +1483,7 @@ void find_first_points(PROCESS *mbproc, MetaBall *mb, int a)
calc_mballco(ml, (float *)&out);
- out_v = mbproc->function(out.x, out.y, out.z);
+ /*out_v = mbproc->function(out.x, out.y, out.z);*/ /*UNUSED*/
/* find "first points" on Implicit Surface of MetaElemnt ml */
workp.x = in.x;
@@ -1563,8 +1582,8 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */
Object *bob;
MetaBall *mb;
MetaElem *ml;
- float size, totsize, (*mat)[4] = NULL, (*imat)[4] = NULL, obinv[4][4], obmat[4][4], vec[3];
- float temp1[4][4], temp2[4][4], temp3[4][4]; //max=0.0;
+ float size, totsize, obinv[4][4], obmat[4][4], vec[3];
+ //float max=0.0;
int a, obnr, zero_size=0;
char obname[32];
@@ -1572,7 +1591,7 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */
invert_m4_m4(obinv, ob->obmat);
a= 0;
- splitIDname(ob->id.name+2, obname, &obnr);
+ BLI_split_name_num(obname, &obnr, ob->id.name+2, '.');
/* make main array */
next_object(&sce_iter, 0, 0, 0);
@@ -1583,7 +1602,6 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */
ml= NULL;
if(bob==ob && (base->flag & OB_FROMDUPLI)==0) {
- mat= imat= 0;
mb= ob->data;
if(mb->editelems) ml= mb->editelems->first;
@@ -1593,7 +1611,7 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */
char name[32];
int nr;
- splitIDname(bob->id.name+2, name, &nr);
+ BLI_split_name_num(name, &nr, bob->id.name+2, '.');
if( strcmp(obname, name)==0 ) {
mb= bob->data;
@@ -1630,6 +1648,8 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */
while(ml) {
if(!(ml->flag & MB_HIDE)) {
int i;
+ float temp1[4][4], temp2[4][4], temp3[4][4];
+ float (*mat)[4] = NULL, (*imat)[4] = NULL;
float max_x, max_y, max_z, min_x, min_y, min_z;
max_x = max_y = max_z = -3.4e38;
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 6f1cdefbcad..8117a626c03 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -43,6 +43,12 @@
#include "DNA_meshdata_types.h"
#include "DNA_ipo_types.h"
+#include "BLI_blenlib.h"
+#include "BLI_editVert.h"
+#include "BLI_math.h"
+#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
+
#include "BKE_animsys.h"
#include "BKE_main.h"
#include "BKE_DerivedMesh.h"
@@ -58,12 +64,6 @@
#include "BKE_curve.h"
/* -- */
#include "BKE_object.h"
-#include "BKE_utildefines.h"
-
-#include "BLI_blenlib.h"
-#include "BLI_editVert.h"
-#include "BLI_math.h"
-#include "BLI_edgehash.h"
EditMesh *BKE_mesh_get_editmesh(Mesh *me)
@@ -71,7 +71,7 @@ EditMesh *BKE_mesh_get_editmesh(Mesh *me)
return me->edit_mesh;
}
-void BKE_mesh_end_editmesh(Mesh *me, EditMesh *em)
+void BKE_mesh_end_editmesh(Mesh *UNUSED(me), EditMesh *UNUSED(em))
{
}
@@ -184,7 +184,7 @@ void free_dverts(MDeformVert *dvert, int totvert)
MEM_freeN (dvert);
}
-Mesh *add_mesh(char *name)
+Mesh *add_mesh(const char *name)
{
Mesh *me;
@@ -444,7 +444,7 @@ int test_index_face(MFace *mface, CustomData *fdata, int mfindex, int nr)
mface->v4= 0;
nr--;
}
- if(mface->v2 && mface->v2==mface->v3) {
+ if((mface->v2 || mface->v4) && mface->v2==mface->v3) {
mface->v3= mface->v4;
mface->v4= 0;
nr--;
@@ -456,6 +456,32 @@ int test_index_face(MFace *mface, CustomData *fdata, int mfindex, int nr)
nr--;
}
+ /* check corrupt cases, bowtie geometry, cant handle these because edge data wont exist so just return 0 */
+ if(nr==3) {
+ if(
+ /* real edges */
+ mface->v1==mface->v2 ||
+ mface->v2==mface->v3 ||
+ mface->v3==mface->v1
+ ) {
+ return 0;
+ }
+ }
+ else if(nr==4) {
+ if(
+ /* real edges */
+ mface->v1==mface->v2 ||
+ mface->v2==mface->v3 ||
+ mface->v3==mface->v4 ||
+ mface->v4==mface->v1 ||
+ /* across the face */
+ mface->v1==mface->v3 ||
+ mface->v2==mface->v4
+ ) {
+ return 0;
+ }
+ }
+
/* prevent a zero at wrong index location */
if(nr==3) {
if(mface->v3==0) {
@@ -561,7 +587,7 @@ static void mfaces_strip_loose(MFace *mface, int *totface)
}
/* Create edges based on known verts and faces */
-static void make_edges_mdata(MVert *allvert, MFace *allface, int totvert, int totface,
+static void make_edges_mdata(MVert *UNUSED(allvert), MFace *allface, int UNUSED(totvert), int totface,
int old, MEdge **alledge, int *_totedge)
{
MFace *mface;
@@ -678,6 +704,23 @@ void mesh_strip_loose_faces(Mesh *me)
me->totface = b;
}
+void mesh_strip_loose_edges(Mesh *me)
+{
+ int a,b;
+
+ for (a=b=0; a<me->totedge; a++) {
+ if (me->medge[a].v1!=me->medge[a].v2) {
+ if (a!=b) {
+ memcpy(&me->medge[b],&me->medge[a],sizeof(me->medge[b]));
+ CustomData_copy_data(&me->edata, &me->edata, a, b, 1);
+ CustomData_free_elem(&me->edata, a, 1);
+ }
+ b++;
+ }
+ }
+ me->totedge = b;
+}
+
void mball_to_mesh(ListBase *lb, Mesh *me)
{
DispList *dl;
@@ -735,7 +778,7 @@ void mball_to_mesh(ListBase *lb, Mesh *me)
int nurbs_to_mdata(Object *ob, MVert **allvert, int *totvert,
MEdge **alledge, int *totedge, MFace **allface, int *totface)
{
- return nurbs_to_mdata_customdb(ob, &((Curve *)ob->data)->disp,
+ return nurbs_to_mdata_customdb(ob, &ob->disp,
allvert, totvert, alledge, totedge, allface, totface);
}
@@ -751,9 +794,13 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
float *data;
int a, b, ofs, vertcount, startvert, totvert=0, totvlak=0;
int p1, p2, p3, p4, *index;
+ int conv_polys= 0;
cu= ob->data;
+ conv_polys|= cu->flag & CU_3D; /* 2d polys are filled with DL_INDEX3 displists */
+ conv_polys|= ob->type == OB_SURF; /* surf polys are never filled */
+
/* count */
dl= dispbase->first;
while(dl) {
@@ -762,8 +809,10 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
totvlak+= dl->parts*(dl->nr-1);
}
else if(dl->type==DL_POLY) {
- totvert+= dl->parts*dl->nr;
- totvlak+= dl->parts*dl->nr;
+ if(conv_polys) {
+ totvert+= dl->parts*dl->nr;
+ totvlak+= dl->parts*dl->nr;
+ }
}
else if(dl->type==DL_SURF) {
totvert+= dl->parts*dl->nr;
@@ -783,7 +832,7 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
}
*allvert= mvert= MEM_callocN(sizeof (MVert) * totvert, "nurbs_init mvert");
- *allface= mface= MEM_callocN(sizeof (MVert) * totvert, "nurbs_init mface");
+ *allface= mface= MEM_callocN(sizeof (MVert) * totvlak, "nurbs_init mface");
/* verts and faces */
vertcount= 0;
@@ -815,24 +864,26 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
}
else if(dl->type==DL_POLY) {
- startvert= vertcount;
- a= dl->parts*dl->nr;
- data= dl->verts;
- while(a--) {
- VECCOPY(mvert->co, data);
- data+=3;
- vertcount++;
- mvert++;
- }
+ if(conv_polys) {
+ startvert= vertcount;
+ a= dl->parts*dl->nr;
+ data= dl->verts;
+ while(a--) {
+ VECCOPY(mvert->co, data);
+ data+=3;
+ vertcount++;
+ mvert++;
+ }
- for(a=0; a<dl->parts; a++) {
- ofs= a*dl->nr;
- for(b=0; b<dl->nr; b++) {
- mface->v1= startvert+ofs+b;
- if(b==dl->nr-1) mface->v2= startvert+ofs;
- else mface->v2= startvert+ofs+b+1;
- if(smooth) mface->flag |= ME_SMOOTH;
- mface++;
+ for(a=0; a<dl->parts; a++) {
+ ofs= a*dl->nr;
+ for(b=0; b<dl->nr; b++) {
+ mface->v1= startvert+ofs+b;
+ if(b==dl->nr-1) mface->v2= startvert+ofs;
+ else mface->v2= startvert+ofs+b+1;
+ if(smooth) mface->flag |= ME_SMOOTH;
+ mface++;
+ }
}
}
}
@@ -1214,14 +1265,12 @@ void mesh_set_smooth_flag(Object *meshOb, int enableSmooth)
mf->flag &= ~ME_SMOOTH;
}
}
-
-// XXX do this in caller DAG_id_flush_update(&me->id, OB_RECALC_DATA);
}
void mesh_calc_normals(MVert *mverts, int numVerts, MFace *mfaces, int numFaces, float **faceNors_r)
{
float (*tnorms)[3]= MEM_callocN(numVerts*sizeof(*tnorms), "tnorms");
- float *fnors= MEM_mallocN(sizeof(*fnors)*3*numFaces, "meshnormals");
+ float *fnors= MEM_callocN(sizeof(*fnors)*3*numFaces, "meshnormals");
int i;
for (i=0; i<numFaces; i++) {
@@ -1441,7 +1490,7 @@ void mesh_pmv_free(PartialVisibility *pv)
MEM_freeN(pv);
}
-void mesh_pmv_revert(Object *ob, Mesh *me)
+void mesh_pmv_revert(Mesh *me)
{
if(me->pv) {
unsigned i;
@@ -1475,15 +1524,13 @@ void mesh_pmv_revert(Object *ob, Mesh *me)
me->pv->edge_map= NULL;
MEM_freeN(me->pv->vert_map);
me->pv->vert_map= NULL;
-
-// XXX do this in caller DAG_id_flush_update(&me->id, OB_RECALC_DATA);
}
}
-void mesh_pmv_off(Object *ob, Mesh *me)
+void mesh_pmv_off(Mesh *me)
{
- if(ob && me->pv) {
- mesh_pmv_revert(ob, me);
+ if(me->pv) {
+ mesh_pmv_revert(me);
MEM_freeN(me->pv);
me->pv= NULL;
}
@@ -1509,7 +1556,10 @@ int mesh_center_median(Mesh *me, float cent[3])
for(mvert= me->mvert; i--; mvert++) {
add_v3_v3(cent, mvert->co);
}
- mul_v3_fl(cent, 1.0f/(float)me->totvert);
+ /* otherwise we get NAN for 0 verts */
+ if(me->totvert) {
+ mul_v3_fl(cent, 1.0f/(float)me->totvert);
+ }
return (me->totvert != 0);
}
diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c
new file mode 100644
index 00000000000..b0ab00d08e3
--- /dev/null
+++ b/source/blender/blenkernel/intern/mesh_validate.c
@@ -0,0 +1,379 @@
+/**
+ * $Id: mesh_validate.c 34759 2011-02-10 14:13:13Z campbellbarton $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2011 Blender Foundation.
+ * All rights reserved.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "BLO_sys_types.h"
+
+#include "BLI_utildefines.h"
+#include "BLI_edgehash.h"
+
+#include "BKE_DerivedMesh.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BKE_mesh.h"
+
+#define SELECT 1
+
+typedef union {
+ uint32_t verts[2];
+ int64_t edval;
+} EdgeUUID;
+
+typedef struct SortFace {
+// unsigned int v[4];
+ EdgeUUID es[4];
+ unsigned int index;
+} SortFace;
+
+static void edge_store_assign(uint32_t verts[2], const uint32_t v1, const uint32_t v2)
+{
+ if(v1 < v2) {
+ verts[0]= v1;
+ verts[1]= v2;
+ }
+ else {
+ verts[0]= v2;
+ verts[1]= v1;
+ }
+}
+
+static void edge_store_from_mface_quad(EdgeUUID es[4], MFace *mf)
+{
+ edge_store_assign(es[0].verts, mf->v1, mf->v2);
+ edge_store_assign(es[1].verts, mf->v2, mf->v3);
+ edge_store_assign(es[2].verts, mf->v3, mf->v4);
+ edge_store_assign(es[3].verts, mf->v4, mf->v1);
+}
+
+static void edge_store_from_mface_tri(EdgeUUID es[3], MFace *mf)
+{
+ edge_store_assign(es[0].verts, mf->v1, mf->v2);
+ edge_store_assign(es[1].verts, mf->v2, mf->v3);
+ edge_store_assign(es[2].verts, mf->v3, mf->v1);
+ es[3].verts[0] = es[3].verts[1] = UINT_MAX;
+}
+
+static int int64_cmp(const void *v1, const void *v2)
+{
+ const int64_t x1= *(const int64_t *)v1;
+ const int64_t x2= *(const int64_t *)v2;
+
+ if( x1 > x2 ) return 1;
+ else if( x1 < x2 ) return -1;
+ return 0;
+}
+
+static int search_face_cmp(const void *v1, const void *v2)
+{
+ const SortFace *sfa= v1, *sfb= v2;
+
+ if (sfa->es[0].edval > sfb->es[0].edval) return 1;
+ else if (sfa->es[0].edval < sfb->es[0].edval) return -1;
+
+ else if (sfa->es[1].edval > sfb->es[1].edval) return 1;
+ else if (sfa->es[1].edval < sfb->es[1].edval) return -1;
+
+ else if (sfa->es[2].edval > sfb->es[2].edval) return 1;
+ else if (sfa->es[2].edval < sfb->es[2].edval) return -1;
+
+ else if (sfa->es[3].edval > sfb->es[3].edval) return 1;
+ else if (sfa->es[3].edval < sfb->es[3].edval) return -1;
+ else return 0;
+
+}
+
+int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), int totvert, MEdge *medges, int totedge, MFace *mfaces, int totface, const short do_verbose, const short do_fixes)
+{
+# define PRINT if(do_verbose) printf
+# define REMOVE_EDGE_TAG(_med) { _med->v2= _med->v1; do_edge_free= 1; }
+# define REMOVE_FACE_TAG(_mf) { _mf->v3=0; do_face_free= 1; }
+
+// MVert *mv;
+ MEdge *med;
+ MFace *mf;
+ MFace *mf_prev;
+ int i;
+
+ int do_face_free= FALSE;
+ int do_edge_free= FALSE;
+
+ int do_edge_recalc= FALSE;
+
+ EdgeHash *edge_hash = BLI_edgehash_new();
+
+ SortFace *sort_faces= MEM_callocN(sizeof(SortFace) * totface, "search faces");
+ SortFace *sf;
+ SortFace *sf_prev;
+ int totsortface= 0;
+
+ BLI_assert(!(do_fixes && me == NULL));
+
+ PRINT("ED_mesh_validate: verts(%d), edges(%d), faces(%d)\n", totvert, totedge, totface);
+
+ if(totedge == 0 && totface != 0) {
+ PRINT(" locical error, %d faces and 0 edges\n", totface);
+ do_edge_recalc= TRUE;
+ }
+
+ for(i=0, med= medges; i<totedge; i++, med++) {
+ int remove= FALSE;
+ if(med->v1 == med->v2) {
+ PRINT(" edge %d: has matching verts, both %d\n", i, med->v1);
+ remove= do_fixes;
+ }
+ if(med->v1 >= totvert) {
+ PRINT(" edge %d: v1 index out of range, %d\n", i, med->v1);
+ remove= do_fixes;
+ }
+ if(med->v2 >= totvert) {
+ PRINT(" edge %d: v2 index out of range, %d\n", i, med->v2);
+ remove= do_fixes;
+ }
+
+ if(BLI_edgehash_haskey(edge_hash, med->v1, med->v2)) {
+ PRINT(" edge %d: is a duplicate of, %d\n", i, GET_INT_FROM_POINTER(BLI_edgehash_lookup(edge_hash, med->v1, med->v2)));
+ remove= do_fixes;
+ }
+
+ if(remove == FALSE){
+ BLI_edgehash_insert(edge_hash, med->v1, med->v2, SET_INT_IN_POINTER(i));
+ }
+ else {
+ REMOVE_EDGE_TAG(med);
+ }
+ }
+
+ for(i=0, mf=mfaces, sf=sort_faces; i<totface; i++, mf++) {
+ int remove= FALSE;
+ int fidx;
+ unsigned int fv[4];
+
+ fidx = mf->v4 ? 3:2;
+ do {
+ fv[fidx]= *(&(mf->v1) + fidx);
+ if(fv[fidx] >= totvert) {
+ PRINT(" face %d: 'v%d' index out of range, %d\n", i, fidx + 1, fv[fidx]);
+ remove= do_fixes;
+ }
+ } while (fidx--);
+
+ if(remove == FALSE) {
+ if(mf->v4) {
+ if(mf->v1 == mf->v2) { PRINT(" face %d: verts invalid, v1/v2 both %d\n", i, mf->v1); remove= do_fixes; }
+ if(mf->v1 == mf->v3) { PRINT(" face %d: verts invalid, v1/v3 both %d\n", i, mf->v1); remove= do_fixes; }
+ if(mf->v1 == mf->v4) { PRINT(" face %d: verts invalid, v1/v4 both %d\n", i, mf->v1); remove= do_fixes; }
+
+ if(mf->v2 == mf->v3) { PRINT(" face %d: verts invalid, v2/v3 both %d\n", i, mf->v2); remove= do_fixes; }
+ if(mf->v2 == mf->v4) { PRINT(" face %d: verts invalid, v2/v4 both %d\n", i, mf->v2); remove= do_fixes; }
+
+ if(mf->v3 == mf->v4) { PRINT(" face %d: verts invalid, v3/v4 both %d\n", i, mf->v3); remove= do_fixes; }
+ }
+ else {
+ if(mf->v1 == mf->v2) { PRINT(" faceT %d: verts invalid, v1/v2 both %d\n", i, mf->v1); remove= do_fixes; }
+ if(mf->v1 == mf->v3) { PRINT(" faceT %d: verts invalid, v1/v3 both %d\n", i, mf->v1); remove= do_fixes; }
+
+ if(mf->v2 == mf->v3) { PRINT(" faceT %d: verts invalid, v2/v3 both %d\n", i, mf->v2); remove= do_fixes; }
+ }
+
+ if(remove == FALSE) {
+ if(totedge) {
+ if(mf->v4) {
+ if(!BLI_edgehash_haskey(edge_hash, mf->v1, mf->v2)) { PRINT(" face %d: edge v1/v2 (%d,%d) is missing egde data\n", i, mf->v1, mf->v2); do_edge_recalc= TRUE; }
+ if(!BLI_edgehash_haskey(edge_hash, mf->v2, mf->v3)) { PRINT(" face %d: edge v2/v3 (%d,%d) is missing egde data\n", i, mf->v2, mf->v3); do_edge_recalc= TRUE; }
+ if(!BLI_edgehash_haskey(edge_hash, mf->v3, mf->v4)) { PRINT(" face %d: edge v3/v4 (%d,%d) is missing egde data\n", i, mf->v3, mf->v4); do_edge_recalc= TRUE; }
+ if(!BLI_edgehash_haskey(edge_hash, mf->v4, mf->v1)) { PRINT(" face %d: edge v4/v1 (%d,%d) is missing egde data\n", i, mf->v4, mf->v1); do_edge_recalc= TRUE; }
+ }
+ else {
+ if(!BLI_edgehash_haskey(edge_hash, mf->v1, mf->v2)) { PRINT(" face %d: edge v1/v2 (%d,%d) is missing egde data\n", i, mf->v1, mf->v2); do_edge_recalc= TRUE; }
+ if(!BLI_edgehash_haskey(edge_hash, mf->v2, mf->v3)) { PRINT(" face %d: edge v2/v3 (%d,%d) is missing egde data\n", i, mf->v2, mf->v3); do_edge_recalc= TRUE; }
+ if(!BLI_edgehash_haskey(edge_hash, mf->v3, mf->v1)) { PRINT(" face %d: edge v3/v1 (%d,%d) is missing egde data\n", i, mf->v3, mf->v1); do_edge_recalc= TRUE; }
+ }
+ }
+
+ sf->index = i;
+
+ if(mf->v4) {
+ edge_store_from_mface_quad(sf->es, mf);
+
+ qsort(sf->es, 4, sizeof(int64_t), int64_cmp);
+ }
+ else {
+ edge_store_from_mface_tri(sf->es, mf);
+ qsort(sf->es, 3, sizeof(int64_t), int64_cmp);
+ }
+
+ totsortface++;
+ sf++;
+ }
+ }
+ if(remove) {
+ REMOVE_FACE_TAG(mf);
+ }
+ }
+
+ qsort(sort_faces, totsortface, sizeof(SortFace), search_face_cmp);
+
+ sf= sort_faces;
+ sf_prev= sf;
+ sf++;
+
+ for(i=1; i<totsortface; i++, sf++) {
+ int remove= FALSE;
+ /* on a valid mesh, code below will never run */
+ if(memcmp(sf->es, sf_prev->es, sizeof(sf_prev->es)) == 0) {
+ mf= mfaces + sf->index;
+
+ if(do_verbose) {
+ mf_prev= mfaces + sf_prev->index;
+ if(mf->v4) {
+ PRINT(" face %d & %d: are duplicates (%d,%d,%d,%d) (%d,%d,%d,%d)\n", sf->index, sf_prev->index, mf->v1, mf->v2, mf->v3, mf->v4, mf_prev->v1, mf_prev->v2, mf_prev->v3, mf_prev->v4);
+ }
+ else {
+ PRINT(" face %d & %d: are duplicates (%d,%d,%d) (%d,%d,%d)\n", sf->index, sf_prev->index, mf->v1, mf->v2, mf->v3, mf_prev->v1, mf_prev->v2, mf_prev->v3);
+ }
+ }
+
+ remove= do_fixes;
+ }
+ else {
+ sf_prev= sf;
+ }
+
+ if(remove) {
+ REMOVE_FACE_TAG(mf);
+ }
+ }
+
+ BLI_edgehash_free(edge_hash, NULL);
+ MEM_freeN(sort_faces);
+
+ PRINT("BKE_mesh_validate: finished\n\n");
+
+# undef PRINT
+# undef REMOVE_EDGE_TAG
+# undef REMOVE_FACE_TAG
+
+ if(me) {
+ if(do_face_free) {
+ mesh_strip_loose_faces(me);
+ }
+
+ if (do_edge_free) {
+ mesh_strip_loose_edges(me);
+ }
+
+ if(do_fixes && do_edge_recalc) {
+ BKE_mesh_calc_edges(me, TRUE);
+ }
+ }
+
+ return (do_face_free || do_edge_free || do_edge_recalc);
+}
+
+int BKE_mesh_validate(Mesh *me, int do_verbose)
+{
+ printf("MESH: %s\n", me->id.name+2);
+ return BKE_mesh_validate_arrays(me, me->mvert, me->totvert, me->medge, me->totedge, me->mface, me->totface, do_verbose, TRUE);
+}
+
+int BKE_mesh_validate_dm(DerivedMesh *dm)
+{
+ return BKE_mesh_validate_arrays(NULL, dm->getVertArray(dm), dm->getNumVerts(dm), dm->getEdgeArray(dm), dm->getNumEdges(dm), dm->getFaceArray(dm), dm->getNumFaces(dm), TRUE, FALSE);
+}
+
+void BKE_mesh_calc_edges(Mesh *mesh, int update)
+{
+ CustomData edata;
+ EdgeHashIterator *ehi;
+ MFace *mf = mesh->mface;
+ MEdge *med, *med_orig;
+ EdgeHash *eh = BLI_edgehash_new();
+ int i, totedge, totface = mesh->totface;
+
+ if(mesh->totedge==0)
+ update= 0;
+
+ if(update) {
+ /* assume existing edges are valid
+ * useful when adding more faces and generating edges from them */
+ med= mesh->medge;
+ for(i= 0; i<mesh->totedge; i++, med++)
+ BLI_edgehash_insert(eh, med->v1, med->v2, med);
+ }
+
+ for (i = 0; i < totface; i++, mf++) {
+ if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2))
+ BLI_edgehash_insert(eh, mf->v1, mf->v2, NULL);
+ if (!BLI_edgehash_haskey(eh, mf->v2, mf->v3))
+ BLI_edgehash_insert(eh, mf->v2, mf->v3, NULL);
+
+ if (mf->v4) {
+ if (!BLI_edgehash_haskey(eh, mf->v3, mf->v4))
+ BLI_edgehash_insert(eh, mf->v3, mf->v4, NULL);
+ if (!BLI_edgehash_haskey(eh, mf->v4, mf->v1))
+ BLI_edgehash_insert(eh, mf->v4, mf->v1, NULL);
+ } else {
+ if (!BLI_edgehash_haskey(eh, mf->v3, mf->v1))
+ BLI_edgehash_insert(eh, mf->v3, mf->v1, NULL);
+ }
+ }
+
+ totedge = BLI_edgehash_size(eh);
+
+ /* write new edges into a temporary CustomData */
+ memset(&edata, 0, sizeof(edata));
+ CustomData_add_layer(&edata, CD_MEDGE, CD_CALLOC, NULL, totedge);
+
+ ehi = BLI_edgehashIterator_new(eh);
+ med = CustomData_get_layer(&edata, CD_MEDGE);
+ for(i = 0; !BLI_edgehashIterator_isDone(ehi);
+ BLI_edgehashIterator_step(ehi), ++i, ++med) {
+
+ if(update && (med_orig=BLI_edgehashIterator_getValue(ehi))) {
+ *med= *med_orig; /* copy from the original */
+ } else {
+ BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2);
+ med->flag = ME_EDGEDRAW|ME_EDGERENDER|SELECT; /* select for newly created meshes which are selected [#25595] */
+ }
+ }
+ BLI_edgehashIterator_free(ehi);
+
+ /* free old CustomData and assign new one */
+ CustomData_free(&mesh->edata, mesh->totedge);
+ mesh->edata = edata;
+ mesh->totedge = totedge;
+
+ mesh->medge = CustomData_get_layer(&mesh->edata, CD_MEDGE);
+
+ BLI_edgehash_free(eh, NULL);
+}
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 43d26f26d1f..03091b9b0a4 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -40,11 +40,13 @@
#include <math.h>
#include <float.h>
+#include "MEM_guardedalloc.h"
+
#include "DNA_armature_types.h"
#include "DNA_object_types.h"
#include "DNA_meshdata_types.h"
-#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BKE_bmesh.h"
#include "BKE_cloth.h"
@@ -59,12 +61,12 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
static int types_init = 1;
if (types_init) {
- modifier_type_init(types, type); /* MOD_utils.c */
+ modifier_type_init(types); /* MOD_utils.c */
types_init= 0;
}
- if(type >= 0 && type < NUM_MODIFIER_TYPES &&
- types[type]->name[0] != '\0') {
+ /* type unsigned, no need to chech < 0 */
+ if(type < NUM_MODIFIER_TYPES && types[type]->name[0] != '\0') {
return types[type];
}
else {
@@ -147,14 +149,14 @@ ModifierData *modifiers_findByName(Object *ob, const char *name)
void modifiers_clearErrors(Object *ob)
{
ModifierData *md = ob->modifiers.first;
- int qRedraw = 0;
+ /* int qRedraw = 0; */
for (; md; md=md->next) {
if (md->error) {
MEM_freeN(md->error);
md->error = NULL;
- qRedraw = 1;
+ /* qRedraw = 1; */
}
}
}
@@ -216,7 +218,7 @@ int modifier_sameTopology(ModifierData *md)
return ( mti->type == eModifierTypeType_OnlyDeform || mti->type == eModifierTypeType_Nonconstructive);
}
-void modifier_setError(ModifierData *md, char *format, ...)
+void modifier_setError(ModifierData *md, const char *format, ...)
{
char buffer[2048];
va_list ap;
@@ -236,7 +238,8 @@ void modifier_setError(ModifierData *md, char *format, ...)
* there
*
* also used in transform_conversion.c, to detect CrazySpace [tm] (2nd arg
- * then is NULL)
+ * then is NULL)
+ * also used for some mesh tools to give warnings
*/
int modifiers_getCageIndex(struct Scene *scene, Object *ob, int *lastPossibleCageIndex_r, int virtual_)
{
@@ -492,7 +495,7 @@ int modifier_isCorrectableDeformed(ModifierData *md)
return 0;
}
-int modifiers_isCorrectableDeformed(struct Scene *scene, Object *ob)
+int modifiers_isCorrectableDeformed(Object *ob)
{
ModifierData *md = modifiers_getVirtualModifierList(ob);
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index 57f568e6094..2601adbcb5e 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -37,6 +37,8 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_pbvh.h"
+#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_mesh.h"
@@ -45,7 +47,8 @@
#include "BKE_paint.h"
#include "BKE_scene.h"
#include "BKE_subsurf.h"
-#include "BKE_utildefines.h"
+
+#include "BKE_object.h"
#include "CCGSubSurf.h"
@@ -89,6 +92,36 @@ MultiresModifierData *find_multires_modifier_before(Scene *scene, ModifierData *
return NULL;
}
+/* used for applying scale on mdisps layer and syncing subdivide levels when joining objects
+ use_first - return first multires modifier if all multires'es are disabled
+*/
+MultiresModifierData *get_multires_modifier(Scene *scene, Object *ob, int use_first)
+{
+ ModifierData *md;
+ MultiresModifierData *mmd= NULL, *firstmmd= NULL;
+
+ /* find first active multires modifier */
+ for(md = ob->modifiers.first; md; md = md->next) {
+ if(md->type == eModifierType_Multires) {
+ if(!firstmmd)
+ firstmmd= (MultiresModifierData*)md;
+
+ if (modifier_isEnabled(scene, md, eModifierMode_Realtime)) {
+ mmd= (MultiresModifierData*)md;
+ break;
+ }
+ }
+ }
+
+ if(!mmd && use_first) {
+ /* active multires have not been found
+ try to use first one */
+ return firstmmd;
+ }
+
+ return mmd;
+}
+
static int multires_get_level(Object *ob, MultiresModifierData *mmd, int render)
{
if(render)
@@ -151,68 +184,6 @@ void multires_force_render_update(Object *ob)
multires_force_update(ob);
}
-/* XXX */
-#if 0
-void multiresModifier_join(Object *ob)
-{
- Base *base = NULL;
- int highest_lvl = 0;
-
- /* First find the highest level of subdivision */
- base = FIRSTBASE;
- while(base) {
- if(TESTBASELIB_BGMODE(v3d, scene, base) && base->object->type==OB_MESH) {
- ModifierData *md;
- for(md = base->object->modifiers.first; md; md = md->next) {
- if(md->type == eModifierType_Multires) {
- int totlvl = ((MultiresModifierData*)md)->totlvl;
- if(totlvl > highest_lvl)
- highest_lvl = totlvl;
-
- /* Ensure that all updates are processed */
- multires_force_update(base->object);
- }
- }
- }
- base = base->next;
- }
-
- /* No multires meshes selected */
- if(highest_lvl == 0)
- return;
-
- /* Subdivide all the displacements to the highest level */
- base = FIRSTBASE;
- while(base) {
- if(TESTBASELIB_BGMODE(v3d, scene, base) && base->object->type==OB_MESH) {
- ModifierData *md = NULL;
- MultiresModifierData *mmd = NULL;
-
- for(md = base->object->modifiers.first; md; md = md->next) {
- if(md->type == eModifierType_Multires)
- mmd = (MultiresModifierData*)md;
- }
-
- /* If the object didn't have multires enabled, give it a new modifier */
- if(!mmd) {
- md = base->object->modifiers.first;
-
- while(md && modifierType_getInfo(md->type)->type == eModifierTypeType_OnlyDeform)
- md = md->next;
-
- mmd = (MultiresModifierData*)modifier_new(eModifierType_Multires);
- BLI_insertlinkbefore(&base->object->modifiers, md, mmd);
- modifier_unique_name(&base->object->modifiers, mmd);
- }
-
- if(mmd)
- multiresModifier_subdivide(mmd, base->object, highest_lvl - mmd->totlvl, 0, 0);
- }
- base = base->next;
- }
-}
-#endif
-
int multiresModifier_reshapeFromDM(Scene *scene, MultiresModifierData *mmd,
Object *ob, DerivedMesh *srcdm)
{
@@ -229,7 +200,7 @@ int multiresModifier_reshapeFromDM(Scene *scene, MultiresModifierData *mmd,
return 1;
}
- mrdm->release(mrdm);
+ if(mrdm) mrdm->release(mrdm);
return 0;
}
@@ -276,33 +247,48 @@ int multiresModifier_reshapeFromDeformMod(Scene *scene, MultiresModifierData *mm
}
/* reset the multires levels to match the number of mdisps */
-void multiresModifier_set_levels_from_disps(MultiresModifierData *mmd, Object *ob)
+static int get_levels_from_disps(Object *ob)
{
Mesh *me = ob->data;
MDisps *mdisp;
- int i;
+ int i, totlvl= 0;
mdisp = CustomData_get_layer(&me->fdata, CD_MDISPS);
- if(mdisp) {
- for(i = 0; i < me->totface; ++i, ++mdisp) {
- int S = me->mface[i].v4 ? 4 : 3;
-
- if(mdisp->totdisp == 0) continue;
-
- while(1) {
- int side = (1 << (mmd->totlvl-1)) + 1;
- int lvl_totdisp = side*side*S;
- if(mdisp->totdisp == lvl_totdisp)
- break;
- else if(mdisp->totdisp < lvl_totdisp)
- --mmd->totlvl;
- else
- ++mmd->totlvl;
-
- }
+ for(i = 0; i < me->totface; ++i, ++mdisp) {
+ int S = me->mface[i].v4 ? 4 : 3;
+
+ if(mdisp->totdisp == 0) continue;
+
+ while(1) {
+ int side = (1 << (totlvl-1)) + 1;
+ int lvl_totdisp = side*side*S;
+ if(mdisp->totdisp == lvl_totdisp)
+ break;
+ else if(mdisp->totdisp < lvl_totdisp)
+ --totlvl;
+ else
+ ++totlvl;
+
}
+ }
+ return totlvl;
+}
+
+/* reset the multires levels to match the number of mdisps */
+void multiresModifier_set_levels_from_disps(MultiresModifierData *mmd, Object *ob)
+{
+ Mesh *me = ob->data;
+ MDisps *mdisp;
+
+ if(me->edit_mesh)
+ mdisp = CustomData_get_layer(&me->edit_mesh->fdata, CD_MDISPS);
+ else
+ mdisp = CustomData_get_layer(&me->fdata, CD_MDISPS);
+
+ if(mdisp) {
+ mmd->totlvl = get_levels_from_disps(ob);
mmd->lvl = MIN2(mmd->sculptlvl, mmd->totlvl);
mmd->sculptlvl = MIN2(mmd->sculptlvl, mmd->totlvl);
mmd->renderlvl = MIN2(mmd->renderlvl, mmd->totlvl);
@@ -389,11 +375,9 @@ static void multires_copy_dm_grid(DMGridData *gridA, DMGridData *gridB, int size
}
}
-/* direction=1 for delete higher, direction=0 for lower (not implemented yet) */
-void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int direction)
+static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl)
{
- Mesh *me = get_mesh(ob);
- int lvl = multires_get_level(ob, mmd, 0);
+ Mesh *me = (Mesh*)ob->data;
int levels = mmd->totlvl - lvl;
MDisps *mdisps;
@@ -403,7 +387,7 @@ void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int dire
multires_force_update(ob);
- if(mdisps && levels > 0 && direction == 1) {
+ if(mdisps && levels > 0) {
if(lvl > 0) {
int nsize = multires_side_tot[lvl];
int hsize = multires_side_tot[mmd->totlvl];
@@ -442,11 +426,31 @@ void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int dire
multires_set_tot_level(ob, mmd, lvl);
}
+/* direction=1 for delete higher, direction=0 for lower (not implemented yet) */
+void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int direction)
+{
+ Mesh *me = get_mesh(ob);
+ int lvl = multires_get_level(ob, mmd, 0);
+ int levels = mmd->totlvl - lvl;
+ MDisps *mdisps;
+
+ multires_set_tot_mdisps(me, mmd->totlvl);
+ CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface);
+ mdisps= CustomData_get_layer(&me->fdata, CD_MDISPS);
+
+ multires_force_update(ob);
+
+ if(mdisps && levels > 0 && direction == 1) {
+ multires_del_higher(mmd, ob, lvl);
+ }
+
+ multires_set_tot_level(ob, mmd, lvl);
+}
+
static DerivedMesh *multires_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int totlvl, int simple)
{
- MultiresModifierData mmd;
+ MultiresModifierData mmd= {{0}};
- memset(&mmd, 0, sizeof(MultiresModifierData));
mmd.lvl = lvl;
mmd.sculptlvl = lvl;
mmd.renderlvl = lvl;
@@ -456,11 +460,10 @@ static DerivedMesh *multires_dm_create_local(Object *ob, DerivedMesh *dm, int lv
return multires_dm_create_from_derived(&mmd, 1, dm, ob, 0, 0);
}
-static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int simple, int optimal)
+static DerivedMesh *subsurf_dm_create_local(Object *UNUSED(ob), DerivedMesh *dm, int lvl, int simple, int optimal)
{
- SubsurfModifierData smd;
+ SubsurfModifierData smd= {{0}};
- memset(&smd, 0, sizeof(SubsurfModifierData));
smd.levels = smd.renderLevels = lvl;
smd.flags |= eSubsurfModifierFlag_SubsurfUv;
if(simple)
@@ -471,12 +474,133 @@ static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl
return subsurf_make_derived_from_derived(dm, &smd, 0, NULL, 0, 0);
}
-void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int updateblock, int simple)
+
+
+/* assumes no is normalized; return value's sign is negative if v is on
+ the other side of the plane */
+static float v3_dist_from_plane(float v[3], float center[3], float no[3])
+{
+ float s[3];
+ sub_v3_v3v3(s, v, center);
+ return dot_v3v3(s, no);
+}
+
+void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob)
+{
+ DerivedMesh *cddm, *dispdm, *origdm;
+ Mesh *me;
+ ListBase *fmap;
+ float (*origco)[3];
+ int i, j, offset, totlvl;
+
+ multires_force_update(ob);
+
+ me = get_mesh(ob);
+ totlvl = mmd->totlvl;
+
+ /* nothing to do */
+ if(!totlvl)
+ return;
+
+ /* XXX - probably not necessary to regenerate the cddm so much? */
+
+ /* generate highest level with displacements */
+ cddm = CDDM_from_mesh(me, NULL);
+ DM_set_only_copy(cddm, CD_MASK_BAREMESH);
+ dispdm = multires_dm_create_local(ob, cddm, totlvl, totlvl, 0);
+ cddm->release(cddm);
+
+ /* copy the new locations of the base verts into the mesh */
+ offset = dispdm->getNumVerts(dispdm) - me->totvert;
+ for(i = 0; i < me->totvert; ++i) {
+ dispdm->getVertCo(dispdm, offset + i, me->mvert[i].co);
+ }
+
+ /* heuristic to produce a better-fitting base mesh */
+
+ cddm = CDDM_from_mesh(me, NULL);
+ fmap = cddm->getFaceMap(ob, cddm);
+ origco = MEM_callocN(sizeof(float)*3*me->totvert, "multires apply base origco");
+ for(i = 0; i < me->totvert ;++i)
+ copy_v3_v3(origco[i], me->mvert[i].co);
+
+ for(i = 0; i < me->totvert; ++i) {
+ IndexNode *n;
+ float avg_no[3] = {0,0,0}, center[3] = {0,0,0}, push[3];
+ float dist;
+ int tot;
+
+ /* don't adjust verts not used by at least one face */
+ if(!fmap[i].first)
+ continue;
+
+ /* find center */
+ for(n = fmap[i].first, tot = 0; n; n = n->next) {
+ MFace *f = &me->mface[n->index];
+ int S = f->v4 ? 4 : 3;
+
+ /* this double counts, not sure if that's bad or good */
+ for(j = 0; j < S; ++j) {
+ int vndx = (&f->v1)[j];
+ if(vndx != i) {
+ add_v3_v3(center, origco[vndx]);
+ ++tot;
+ }
+ }
+ }
+ mul_v3_fl(center, 1.0f / tot);
+
+ /* find normal */
+ for(n = fmap[i].first; n; n = n->next) {
+ MFace *f = &me->mface[n->index];
+ int S = f->v4 ? 4 : 3;
+ float v[4][3], no[3];
+
+ for(j = 0; j < S; ++j) {
+ int vndx = (&f->v1)[j];
+ if(vndx == i)
+ copy_v3_v3(v[j], center);
+ else
+ copy_v3_v3(v[j], origco[vndx]);
+ }
+
+ if(S == 4)
+ normal_quad_v3(no, v[0], v[1], v[2], v[3]);
+ else
+ normal_tri_v3(no, v[0], v[1], v[2]);
+ add_v3_v3(avg_no, no);
+ }
+ normalize_v3(avg_no);
+
+ /* push vertex away from the plane */
+ dist = v3_dist_from_plane(me->mvert[i].co, center, avg_no);
+ copy_v3_v3(push, avg_no);
+ mul_v3_fl(push, dist);
+ add_v3_v3(me->mvert[i].co, push);
+
+ }
+
+ MEM_freeN(origco);
+ cddm->release(cddm);
+
+ /* subdivide the mesh to highest level without displacements */
+ cddm = CDDM_from_mesh(me, NULL);
+ DM_set_only_copy(cddm, CD_MASK_BAREMESH);
+ origdm = subsurf_dm_create_local(ob, cddm, totlvl, 0, 0);
+ cddm->release(cddm);
+
+ /* calc disps */
+ multiresModifier_disp_run(dispdm, me, 1, 0, origdm->getGridData(origdm), totlvl);
+
+ origdm->release(origdm);
+ dispdm->release(dispdm);
+}
+
+void multires_subdivide(MultiresModifierData *mmd, Object *ob, int totlvl, int updateblock, int simple)
{
Mesh *me = ob->data;
MDisps *mdisps;
int lvl= mmd->totlvl;
- int totlvl= mmd->totlvl+1;
if(totlvl > multires_max_levels)
return;
@@ -549,6 +673,11 @@ void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int updat
multires_set_tot_level(ob, mmd, totlvl);
}
+void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int updateblock, int simple)
+{
+ multires_subdivide(mmd, ob, mmd->totlvl+1, updateblock, simple);
+}
+
static void grid_tangent(int gridSize, int index, int x, int y, int axis, DMGridData **gridData, float t[3])
{
if(axis == 0) {
@@ -580,7 +709,7 @@ static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, int invert, int
MFace *mface = me->mface;
MDisps *mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
int *gridOffset;
- int i, numGrids, gridSize, dGridSize, dSkip;
+ int i, /*numGrids,*/ gridSize, dGridSize, dSkip;
if(!mdisps) {
if(invert)
@@ -589,7 +718,7 @@ static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, int invert, int
return;
}
- numGrids = dm->getNumGrids(dm);
+ /*numGrids = dm->getNumGrids(dm);*/ /*UNUSED*/
gridSize = dm->getGridSize(dm);
gridData = dm->getGridData(dm);
gridOffset = dm->getGridOffset(dm);
@@ -780,7 +909,7 @@ void multires_stitch_grids(Object *ob)
}
DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int local_mmd, DerivedMesh *dm, Object *ob,
- int useRenderParams, int isFinalCalc)
+ int useRenderParams, int UNUSED(isFinalCalc))
{
Mesh *me= ob->data;
DerivedMesh *result;
@@ -833,7 +962,7 @@ DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int loca
***************************/
/* Adapted from sculptmode.c */
-static void old_mdisps_bilinear(float out[3], float (*disps)[3], int st, float u, float v)
+void old_mdisps_bilinear(float out[3], float (*disps)[3], const int st, float u, float v)
{
int x, y, x2, y2;
const int st_max = st - 1;
@@ -874,7 +1003,7 @@ static void old_mdisps_bilinear(float out[3], float (*disps)[3], int st, float u
add_v3_v3v3(out, d2[0], d2[1]);
}
-static void old_mdisps_rotate(int S, int newside, int oldside, int x, int y, float *u, float *v)
+static void old_mdisps_rotate(int S, int UNUSED(newside), int oldside, int x, int y, float *u, float *v)
{
float offset = oldside*0.5f - 0.5f;
@@ -1011,7 +1140,12 @@ static void create_old_vert_edge_map(ListBase **map, IndexNode **mem, const Mult
static MultiresFace *find_old_face(ListBase *map, MultiresFace *faces, int v1, int v2, int v3, int v4)
{
IndexNode *n1;
- int v[4] = {v1, v2, v3, v4}, i, j;
+ int v[4], i, j;
+
+ v[0]= v1;
+ v[1]= v2;
+ v[2]= v3;
+ v[3]= v4;
for(n1 = map[v1].first; n1; n1 = n1->next) {
int fnd[4] = {0, 0, 0, 0};
@@ -1158,18 +1292,18 @@ static void multires_load_old_dm(DerivedMesh *dm, Mesh *me, int totlvl)
MultiresLevel *lvl, *lvl1;
Multires *mr= me->mr;
MVert *vsrc, *vdst;
- int src, dst;
+ unsigned int src, dst;
int st = multires_side_tot[totlvl - 1] - 1;
int extedgelen = multires_side_tot[totlvl] - 2;
int *vvmap; // inorder for dst, map to src
int crossedgelen;
- int i, j, s, x, totvert, tottri, totquad;
+ int s, x, tottri, totquad;
+ unsigned int i, j, totvert;
src = 0;
- dst = 0;
vsrc = mr->verts;
vdst = dm->getVertArray(dm);
- totvert = dm->getNumVerts(dm);
+ totvert = (unsigned int)dm->getNumVerts(dm);
vvmap = MEM_callocN(sizeof(int) * totvert, "multires vvmap");
lvl1 = mr->levels.first;
@@ -1260,7 +1394,7 @@ static void multires_load_old_dm(DerivedMesh *dm, Mesh *me, int totlvl)
fmem = MEM_callocN(sizeof(IndexNode*) * (mr->level_count-1), "multires fmem");
emem = MEM_callocN(sizeof(IndexNode*) * (mr->level_count-1), "multires emem");
lvl = lvl1;
- for(i = 0; i < mr->level_count - 1; ++i) {
+ for(i = 0; i < (unsigned int)mr->level_count - 1; ++i) {
create_old_vert_face_map(fmap + i, fmem + i, lvl->faces, lvl->totvert, lvl->totface);
create_old_vert_edge_map(emap + i, emem + i, lvl->edges, lvl->totvert, lvl->totedge);
lvl = lvl->next;
@@ -1295,9 +1429,9 @@ static void multires_load_old_dm(DerivedMesh *dm, Mesh *me, int totlvl)
dst = ldst;
}
- lvl = lvl->next;
+ /*lvl = lvl->next;*/ /*UNUSED*/
- for(i = 0; i < mr->level_count - 1; ++i) {
+ for(i = 0; i < (unsigned int)(mr->level_count - 1); ++i) {
MEM_freeN(fmap[i]);
MEM_freeN(fmem[i]);
MEM_freeN(emap[i]);
@@ -1319,6 +1453,52 @@ static void multires_load_old_dm(DerivedMesh *dm, Mesh *me, int totlvl)
multires_mvert_to_ss(dm, vdst);
}
+/* Copy the first-level vcol data to the mesh, if it exists */
+/* Warning: higher-level vcol data will be lost */
+static void multires_load_old_vcols(Mesh *me)
+{
+ MultiresLevel *lvl;
+ MultiresColFace *colface;
+ MCol *mcol;
+ int i, j;
+
+ if(!(lvl = me->mr->levels.first))
+ return;
+
+ if(!(colface = lvl->colfaces))
+ return;
+
+ /* older multires format never supported multiple vcol layers,
+ so we can assume the active vcol layer is the correct one */
+ if(!(mcol = CustomData_get_layer(&me->fdata, CD_MCOL)))
+ return;
+
+ for(i = 0; i < me->totface; ++i) {
+ for(j = 0; j < 4; ++j) {
+ mcol[i*4 + j].a = colface[i].col[j].a;
+ mcol[i*4 + j].r = colface[i].col[j].r;
+ mcol[i*4 + j].g = colface[i].col[j].g;
+ mcol[i*4 + j].b = colface[i].col[j].b;
+ }
+ }
+}
+
+/* Copy the first-level face-flag data to the mesh */
+static void multires_load_old_face_flags(Mesh *me)
+{
+ MultiresLevel *lvl;
+ MultiresFace *faces;
+ int i;
+
+ if(!(lvl = me->mr->levels.first))
+ return;
+
+ if(!(faces = lvl->faces))
+ return;
+
+ for(i = 0; i < me->totface; ++i)
+ me->mface[i].flag = faces[i].flag;
+}
void multires_load_old(Object *ob, Mesh *me)
{
@@ -1380,8 +1560,593 @@ void multires_load_old(Object *ob, Mesh *me)
memset(&me->mr->vdata, 0, sizeof(CustomData));
memset(&me->mr->fdata, 0, sizeof(CustomData));
+ multires_load_old_vcols(me);
+ multires_load_old_face_flags(me);
+
/* Remove the old multires */
multires_free(me->mr);
me->mr= NULL;
}
+static void multires_sync_levels(Scene *scene, Object *ob, Object *to_ob)
+{
+ MultiresModifierData *mmd= get_multires_modifier(scene, ob, 1);
+ MultiresModifierData *to_mmd= get_multires_modifier(scene, to_ob, 1);
+
+ if(!mmd) {
+ /* object could have MDISP even when there is no multires modifier
+ this could lead to troubles due to i've got no idea how mdisp could be
+ upsampled correct without modifier data.
+ just remove mdisps if no multires present (nazgul) */
+
+ Mesh *me= (Mesh*)ob->data;
+
+ CustomData_external_remove(&me->fdata, &me->id, CD_MDISPS, me->totface);
+ CustomData_free_layer_active(&me->fdata, CD_MDISPS, me->totface);
+ }
+
+ if(!mmd || !to_mmd) return;
+
+ if(mmd->totlvl>to_mmd->totlvl) multires_del_higher(mmd, ob, to_mmd->totlvl);
+ else multires_subdivide(mmd, ob, to_mmd->totlvl, 0, mmd->simple);
+}
+
+void multires_apply_smat(Scene *scene, Object *ob, float smat[3][3])
+{
+ DerivedMesh *dm= NULL, *cddm= NULL, *subdm= NULL;
+ DMGridData **gridData, **subGridData;
+ Mesh *me= (Mesh*)ob->data;
+ MFace *mface= me->mface;
+ MDisps *mdisps;
+ int *gridOffset;
+ int i, /*numGrids,*/ gridSize, dGridSize, dSkip, totvert;
+ float (*vertCos)[3] = NULL;
+ MultiresModifierData *mmd= get_multires_modifier(scene, ob, 1);
+ MultiresModifierData high_mmd;
+
+ CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface);
+ mdisps= CustomData_get_layer(&me->fdata, CD_MDISPS);
+
+ if(!mdisps || !mmd) return;
+
+ /* we need derived mesh created from highest resolution */
+ high_mmd= *mmd;
+ high_mmd.lvl= high_mmd.totlvl;
+
+ /* unscaled multires with applied displacement */
+ subdm= get_multires_dm(scene, &high_mmd, ob);
+
+ /* prepare scaled CDDM to create ccgDN */
+ cddm= mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
+
+ totvert= cddm->getNumVerts(cddm);
+ vertCos= MEM_mallocN(sizeof(*vertCos) * totvert, "multiresScale vertCos");
+ cddm->getVertCos(cddm, vertCos);
+ for(i=0; i<totvert; i++)
+ mul_m3_v3(smat, vertCos[i]);
+ CDDM_apply_vert_coords(cddm, vertCos);
+ MEM_freeN(vertCos);
+
+ /* scaled ccgDM for tangent space of object with applied scale */
+ dm= subsurf_dm_create_local(ob, cddm, high_mmd.totlvl, high_mmd.simple, 0);
+ cddm->release(cddm);
+
+ /*numGrids= dm->getNumGrids(dm);*/ /*UNUSED*/
+ gridSize= dm->getGridSize(dm);
+ gridData= dm->getGridData(dm);
+ gridOffset= dm->getGridOffset(dm);
+ subGridData= subdm->getGridData(subdm);
+
+ dGridSize= multires_side_tot[high_mmd.totlvl];
+ dSkip= (dGridSize-1)/(gridSize-1);
+
+ #pragma omp parallel for private(i) if(me->totface*gridSize*gridSize*4 >= CCG_OMP_LIMIT)
+ for(i = 0; i < me->totface; ++i) {
+ const int numVerts= mface[i].v4 ? 4 : 3;
+ MDisps *mdisp= &mdisps[i];
+ int S, x, y, gIndex = gridOffset[i];
+
+ for(S = 0; S < numVerts; ++S, ++gIndex) {
+ DMGridData *grid= gridData[gIndex];
+ DMGridData *subgrid= subGridData[gIndex];
+ float (*dispgrid)[3]= &mdisp->disps[S*dGridSize*dGridSize];
+
+ for(y = 0; y < gridSize; y++) {
+ for(x = 0; x < gridSize; x++) {
+ float *co= grid[x + y*gridSize].co;
+ float *sco= subgrid[x + y*gridSize].co;
+ float *no= grid[x + y*gridSize].no;
+ float *data= dispgrid[dGridSize*y*dSkip + x*dSkip];
+ float mat[3][3], tx[3], ty[3], disp[3];
+
+ /* construct tangent space matrix */
+ grid_tangent(gridSize, gIndex, x, y, 0, gridData, tx);
+ normalize_v3(tx);
+
+ grid_tangent(gridSize, gIndex, x, y, 1, gridData, ty);
+ normalize_v3(ty);
+
+ column_vectors_to_mat3(mat, tx, ty, no);
+
+ /* scale subgrid coord and calculate displacement */
+ mul_m3_v3(smat, sco);
+ sub_v3_v3v3(disp, sco, co);
+
+ /* convert difference to tangent space */
+ invert_m3(mat);
+ mul_v3_m3v3(data, mat, disp);
+ }
+ }
+ }
+ }
+
+ dm->release(dm);
+ subdm->release(subdm);
+}
+
+int multires_mdisp_corners(MDisps *s)
+{
+ int lvl= 13;
+
+ while(lvl > 0) {
+ int side = (1 << (lvl-1)) + 1;
+ if ((s->totdisp % (side*side)) == 0) return s->totdisp / (side*side);
+ lvl--;
+ }
+
+ return 0;
+}
+
+void multiresModifier_scale_disp(Scene *scene, Object *ob)
+{
+ float smat[3][3];
+
+ /* object's scale matrix */
+ object_scale_to_mat3(ob, smat);
+
+ multires_apply_smat(scene, ob, smat);
+}
+
+void multiresModifier_prepare_join(Scene *scene, Object *ob, Object *to_ob)
+{
+ float smat[3][3], tmat[3][3], mat[3][3];
+ multires_sync_levels(scene, ob, to_ob);
+
+ /* construct scale matrix for displacement */
+ object_scale_to_mat3(to_ob, tmat);
+ invert_m3(tmat);
+ object_scale_to_mat3(ob, smat);
+ mul_m3_m3m3(mat, smat, tmat);
+
+ multires_apply_smat(scene, ob, mat);
+}
+
+/* update multires data after topology changing */
+void multires_topology_changed(Scene *scene, Object *ob)
+{
+ Mesh *me= (Mesh*)ob->data;
+ MDisps *mdisp= NULL, *cur= NULL;
+ int i, grid= 0, corners;
+ MultiresModifierData *mmd= get_multires_modifier(scene, ob, 1);
+
+ if(mmd)
+ multires_set_tot_mdisps(me, mmd->totlvl);
+
+ CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface);
+ mdisp= CustomData_get_layer(&me->fdata, CD_MDISPS);
+
+ if(!mdisp) return;
+
+ cur= mdisp;
+ for(i = 0; i < me->totface; i++, cur++) {
+ if(mdisp->totdisp) {
+ corners= multires_mdisp_corners(mdisp);
+ grid= mdisp->totdisp / corners;
+
+ break;
+ }
+ }
+
+ for(i = 0; i < me->totface; i++, mdisp++) {
+ int nvert= me->mface[i].v4 ? 4 : 3;
+
+ /* allocate memory for mdisp, the whole disp layer would be erased otherwise */
+ if(!mdisp->totdisp) {
+ if(grid) {
+ mdisp->totdisp= nvert*grid;
+ mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology");
+ }
+
+ continue;
+ }
+
+ corners= multires_mdisp_corners(mdisp);
+
+ if(corners!=nvert) {
+ mdisp->totdisp= (mdisp->totdisp/corners)*nvert;
+
+ if(mdisp->disps)
+ MEM_freeN(mdisp->disps);
+
+ mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology");
+ }
+ }
+}
+
+/* makes displacement along grid boundary symmetrical */
+void multires_mdisp_smooth_bounds(MDisps *disps)
+{
+ int x, y, side, S, corners;
+ float (*out)[3];
+
+ corners = multires_mdisp_corners(disps);
+ side = sqrt(disps->totdisp / corners);
+
+ out = disps->disps;
+ for(S = 0; S < corners; S++) {
+ for(y = 0; y < side; ++y) {
+ for(x = 0; x < side; ++x, ++out) {
+ float (*dispgrid)[3];
+ float *data;
+
+ if(x != 0 && y != 0) continue;
+
+ if(corners == 4) {
+ if(S == 0) {
+ if(y == 0) {
+ dispgrid = &disps->disps[1*side*side];
+ data = dispgrid[side * x + 0];
+
+ (*out)[0] = (*out)[0] + data[1];
+ (*out)[1] = (*out)[1] - data[0];
+ (*out)[2] = (*out)[2] + data[2];
+
+ mul_v3_fl(*out, 0.5);
+
+ data[0] = -(*out)[1];
+ data[1] = (*out)[0];
+ data[2] = (*out)[2];
+ } else if (x == 0) {
+ dispgrid = &disps->disps[3 * side * side];
+ data = dispgrid[side * 0 + y];
+
+ (*out)[0] = (*out)[0] - data[1];
+ (*out)[1] = (*out)[1] + data[0];
+ (*out)[2] = (*out)[2] + data[2];
+
+ mul_v3_fl(*out, 0.5);
+
+ data[0] = (*out)[1];
+ data[1] = -(*out)[0];
+ data[2] = (*out)[2];
+ }
+ } else if (S == 2) {
+ if(y == 0) {
+ dispgrid = &disps->disps[3 * side * side];
+ data = dispgrid[side * x + 0];
+
+ (*out)[0] = (*out)[0] + data[1];
+ (*out)[1] = (*out)[1] - data[0];
+ (*out)[2] = (*out)[2] + data[2];
+
+ mul_v3_fl(*out, 0.5);
+
+ data[0] = -(*out)[1];
+ data[1] = (*out)[0];
+ data[2] = (*out)[2];
+ } else if(x == 0) {
+ dispgrid = &disps->disps[1 * side * side];
+ data = dispgrid[side * 0 + y];
+
+ (*out)[0] = (*out)[0] - data[1];
+ (*out)[1] = (*out)[1] + data[0];
+ (*out)[2] = (*out)[2] + data[2];
+
+ mul_v3_fl(*out, 0.5);
+
+ data[0] = (*out)[1];
+ data[1] = -(*out)[0];
+ data[2] = (*out)[2];
+ }
+ }
+ } else if (corners == 3) {
+ if(S == 0) {
+ if(y == 0) {
+ dispgrid = &disps->disps[1*side*side];
+ data = dispgrid[side * x + 0];
+
+ (*out)[0] = (*out)[0] + data[1];
+ (*out)[1] = (*out)[1] - data[0];
+ (*out)[2] = (*out)[2] + data[2];
+
+ mul_v3_fl(*out, 0.5);
+
+ data[0] = -(*out)[1];
+ data[1] = (*out)[0];
+ data[2] = (*out)[2];
+ } else if (x == 0) {
+ dispgrid = &disps->disps[2 * side * side];
+ data = dispgrid[side * 0 + y];
+
+ (*out)[0] = (*out)[0] - data[1];
+ (*out)[1] = (*out)[1] + data[0];
+ (*out)[2] = (*out)[2] + data[2];
+
+ mul_v3_fl(*out, 0.5);
+
+ data[0] = (*out)[1];
+ data[1] = -(*out)[0];
+ data[2] = (*out)[2];
+ }
+ } else if (S == 2) {
+ if(x == 0) {
+ dispgrid = &disps->disps[1 * side * side];
+ data = dispgrid[side * 0 + y];
+
+ (*out)[0] = (*out)[0] - data[1];
+ (*out)[1] = (*out)[1] + data[0];
+ (*out)[2] = (*out)[2] + data[2];
+
+ mul_v3_fl(*out, 0.5);
+
+ data[0] = (*out)[1];
+ data[1] = -(*out)[0];
+ data[2] = (*out)[2];
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+/***************** Multires interpolation stuff *****************/
+
+static void mdisp_get_crn_rect(int face_side, float crn[3][4][2])
+{
+ float offset = face_side*0.5f - 0.5f;
+ float mid[2];
+
+ mid[0] = offset * 4 / 3;
+ mid[1] = offset * 2 / 3;
+
+ crn[0][0][0] = mid[0]; crn[0][0][1] = mid[1];
+ crn[0][1][0] = offset; crn[0][1][1] = 0;
+ crn[0][2][0] = 0; crn[0][2][1] = 0;
+ crn[0][3][0] = offset; crn[0][3][1] = offset;
+
+ crn[1][0][0] = mid[0]; crn[1][0][1] = mid[1];
+ crn[1][1][0] = offset * 2; crn[1][1][1] = offset;
+ crn[1][2][0] = offset * 2; crn[1][2][1] = 0;
+ crn[1][3][0] = offset; crn[1][3][1] = 0;
+
+ crn[2][0][0] = mid[0]; crn[2][0][1] = mid[1];
+ crn[2][1][0] = offset; crn[2][1][1] = offset;
+ crn[2][2][0] = offset * 2; crn[2][2][1] = offset * 2;
+ crn[2][3][0] = offset * 2; crn[2][3][1] = offset;
+}
+
+static int mdisp_pt_in_crn(float p[2], float crn[4][2])
+{
+ float v[2][2];
+ float a[2][2];
+
+ sub_v2_v2v2(v[0], crn[1], crn[0]);
+ sub_v2_v2v2(v[1], crn[3], crn[0]);
+
+ sub_v2_v2v2(a[0], p, crn[0]);
+ sub_v2_v2v2(a[1], crn[2], crn[0]);
+
+ if(cross_v2v2(a[0], v[0]) * cross_v2v2(a[1], v[0]) < 0)
+ return 0;
+
+ if(cross_v2v2(a[0], v[1]) * cross_v2v2(a[1], v[1]) < 0)
+ return 0;
+
+ return 1;
+}
+
+static void face_to_crn_interp(float u, float v, float v1[2], float v2[2], float v3[2], float v4[2], float *x)
+{
+ float a = (v4[1]-v3[1])*v2[0]+(-v4[1]+v3[1])*v1[0]+(-v2[1]+v1[1])*v4[0]+(v2[1]-v1[1])*v3[0];
+ float b = (v3[1]-v)*v2[0]+(v4[1]-2*v3[1]+v)*v1[0]+(-v4[1]+v3[1]+v2[1]-v1[1])*u+(v4[0]-v3[0])*v-v1[1]*v4[0]+(-v2[1]+2*v1[1])*v3[0];
+ float c = (v3[1]-v)*v1[0]+(-v3[1]+v1[1])*u+v3[0]*v-v1[1]*v3[0];
+ float d = b * b - 4 * a * c;
+ float x1, x2;
+
+ if(a == 0) {
+ *x = -c / b;
+ return;
+ }
+
+ x1 = (-b - sqrtf(d)) / (2 * a);
+ x2 = (-b + sqrtf(d)) / (2 * a);
+
+ *x = maxf(x1, x2);
+}
+
+void mdisp_rot_crn_to_face(const int S, const int corners, const int face_side, const float x, const float y, float *u, float *v)
+{
+ float offset = face_side*0.5f - 0.5f;
+
+ if(corners == 4) {
+ if(S == 1) { *u= offset + x; *v = offset - y; }
+ if(S == 2) { *u= offset + y; *v = offset + x; }
+ if(S == 3) { *u= offset - x; *v = offset + y; }
+ if(S == 0) { *u= offset - y; *v = offset - x; }
+ } else {
+ float crn[3][4][2], vec[4][2];
+ float p[2];
+
+ mdisp_get_crn_rect(face_side, crn);
+
+ interp_v2_v2v2(vec[0], crn[S][0], crn[S][1], x / offset);
+ interp_v2_v2v2(vec[1], crn[S][3], crn[S][2], x / offset);
+ interp_v2_v2v2(vec[2], crn[S][0], crn[S][3], y / offset);
+ interp_v2_v2v2(vec[3], crn[S][1], crn[S][2], y / offset);
+
+ isect_seg_seg_v2_point(vec[0], vec[1], vec[2], vec[3], p);
+
+ (*u) = p[0];
+ (*v) = p[1];
+ }
+}
+
+int mdisp_rot_face_to_crn(const int corners, const int face_side, const float u, const float v, float *x, float *y)
+{
+ const float offset = face_side*0.5f - 0.5f;
+ int S = 0;
+
+ if (corners == 4) {
+ if(u <= offset && v <= offset) S = 0;
+ else if(u > offset && v <= offset) S = 1;
+ else if(u > offset && v > offset) S = 2;
+ else if(u <= offset && v >= offset) S = 3;
+
+ if(S == 0) {
+ *y = offset - u;
+ *x = offset - v;
+ } else if(S == 1) {
+ *x = u - offset;
+ *y = offset - v;
+ } else if(S == 2) {
+ *y = u - offset;
+ *x = v - offset;
+ } else if(S == 3) {
+ *x= offset - u;
+ *y = v - offset;
+ }
+ } else {
+ float crn[3][4][2];
+ float p[2] = {u, v};
+
+ mdisp_get_crn_rect(face_side, crn);
+
+ for (S = 0; S < 3; ++S) {
+ if (mdisp_pt_in_crn(p, crn[S]))
+ break;
+ }
+
+ face_to_crn_interp(u, v, crn[S][0], crn[S][1], crn[S][3], crn[S][2], &p[0]);
+ face_to_crn_interp(u, v, crn[S][0], crn[S][3], crn[S][1], crn[S][2], &p[1]);
+
+ *x = p[0] * offset;
+ *y = p[1] * offset;
+ }
+
+ return S;
+}
+
+void mdisp_apply_weight(const int S, const int corners, int x, int y, const int face_side,
+ float crn_weight[4][2], float *u_r, float *v_r)
+{
+ float u, v, xl, yl;
+ float mid1[2], mid2[2], mid3[2];
+
+ mdisp_rot_crn_to_face(S, corners, face_side, x, y, &u, &v);
+
+ if(corners == 4) {
+ xl = u / (face_side - 1);
+ yl = v / (face_side - 1);
+
+ mid1[0] = crn_weight[0][0] * (1 - xl) + crn_weight[1][0] * xl;
+ mid1[1] = crn_weight[0][1] * (1 - xl) + crn_weight[1][1] * xl;
+ mid2[0] = crn_weight[3][0] * (1 - xl) + crn_weight[2][0] * xl;
+ mid2[1] = crn_weight[3][1] * (1 - xl) + crn_weight[2][1] * xl;
+ mid3[0] = mid1[0] * (1 - yl) + mid2[0] * yl;
+ mid3[1] = mid1[1] * (1 - yl) + mid2[1] * yl;
+ } else {
+ yl = v / (face_side - 1);
+
+ if(v == face_side - 1) xl = 1;
+ else xl = 1 - (face_side - 1 - u) / (face_side - 1 - v);
+
+ mid1[0] = crn_weight[0][0] * (1 - xl) + crn_weight[1][0] * xl;
+ mid1[1] = crn_weight[0][1] * (1 - xl) + crn_weight[1][1] * xl;
+ mid3[0] = mid1[0] * (1 - yl) + crn_weight[2][0] * yl;
+ mid3[1] = mid1[1] * (1 - yl) + crn_weight[2][1] * yl;
+ }
+
+ *u_r = mid3[0];
+ *v_r = mid3[1];
+}
+
+void mdisp_flip_disp(const int S, const int corners, const float axis_x[2], const float axis_y[2], float disp[3])
+{
+ float crn_x[2], crn_y[2];
+ float vx[2], vy[2], coord[2];
+
+ if (corners == 4) {
+ float x[4][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
+ float y[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
+
+ copy_v2_v2(crn_x, x[S]);
+ copy_v2_v2(crn_y, y[S]);
+
+ mul_v2_v2fl(vx, crn_x, disp[0]);
+ mul_v2_v2fl(vy, crn_y, disp[1]);
+ add_v2_v2v2(coord, vx, vy);
+
+ project_v2_v2v2(vx, coord, axis_x);
+ project_v2_v2v2(vy, coord, axis_y);
+
+ disp[0] = len_v2(vx);
+ disp[1] = len_v2(vy);
+
+ if(dot_v2v2(vx, axis_x) < 0)
+ disp[0] = -disp[0];
+
+ if(dot_v2v2(vy, axis_y) < 0)
+ disp[1] = -disp[1];
+ } else {
+ /* XXX: it was very overhead code to support displacement flipping
+ for case of tris without visible profit.
+ Maybe its not really big limitation? for now? (nazgul) */
+ disp[0] = 0;
+ disp[1] = 0;
+ }
+}
+
+/* Join two triangular displacements into one quad
+ Corners mapping:
+ 2 -------- 3
+ | \ tri2 |
+ | \ |
+ | tri1 \ |
+ 0 -------- 1 */
+void mdisp_join_tris(MDisps *dst, MDisps *tri1, MDisps *tri2)
+{
+ int side, st;
+ int S, x, y, crn;
+ float face_u, face_v, crn_u, crn_v;
+ float (*out)[3];
+ MDisps *src;
+
+ if(dst->disps)
+ MEM_freeN(dst->disps);
+
+ side = sqrt(tri1->totdisp / 3);
+ st = (side<<1)-1;
+
+ dst->totdisp = 4 * side * side;
+ out = dst->disps = MEM_callocN(3*dst->totdisp*sizeof(float), "join disps");
+
+ for(S = 0; S < 4; S++)
+ for(y = 0; y < side; ++y)
+ for(x = 0; x < side; ++x, ++out) {
+ mdisp_rot_crn_to_face(S, 4, st, x, y, &face_u, &face_v);
+ face_u = st - 1 - face_u;
+
+ if(face_v > face_u) {
+ src = tri2;
+ face_u = st - 1 - face_u;
+ face_v = st - 1 - face_v;
+ } else src = tri1;
+
+ crn = mdisp_rot_face_to_crn(3, st, face_u, face_v, &crn_u, &crn_v);
+
+ old_mdisps_bilinear((*out), &src->disps[crn*side*side], side, crn_u, crn_v);
+ (*out)[0] = 0;
+ (*out)[1] = 0;
+ }
+}
diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c
index b053d615756..6db03909aa3 100644
--- a/source/blender/blenkernel/intern/nla.c
+++ b/source/blender/blenkernel/intern/nla.c
@@ -36,6 +36,7 @@
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "DNA_anim_types.h"
@@ -46,7 +47,7 @@
#include "BKE_nla.h"
#include "BKE_global.h"
#include "BKE_library.h"
-#include "BKE_utildefines.h"
+
#include "RNA_access.h"
#include "nla_private.h"
@@ -77,7 +78,7 @@ void free_nlastrip (ListBase *strips, NlaStrip *strip)
/* remove reference to action */
if (strip->act)
- strip->act->id.us--;
+ id_us_min(&strip->act->id);
/* free remapping info */
//if (strip->remap)
@@ -159,7 +160,7 @@ NlaStrip *copy_nlastrip (NlaStrip *strip)
/* increase user-count of action */
if (strip_d->act)
- strip_d->act->id.us++;
+ id_us_plus(&strip_d->act->id);
/* copy F-Curves and modifiers */
copy_fcurves(&strip_d->fcurves, &strip->fcurves);
@@ -362,7 +363,7 @@ static float nlastrip_get_frame_actionclip (NlaStrip *strip, float cframe, short
return strip->end - scale*(cframe - strip->actstart);
}
else if (mode == NLATIME_CONVERT_UNMAP) {
- return strip->actend - (strip->end - cframe) / scale;
+ return (strip->end + (strip->actstart * scale - cframe)) / scale;
}
else /* if (mode == NLATIME_CONVERT_EVAL) */{
if (IS_EQ(cframe, strip->end) && IS_EQ(strip->repeat, ((int)strip->repeat))) {
@@ -513,7 +514,7 @@ short BKE_nlastrips_has_space (ListBase *strips, float start, float end)
/* if start frame of strip is past the target end-frame, that means that
* we've gone past the window we need to check for, so things are fine
*/
- if (strip->start > end)
+ if (strip->start >= end)
return 1;
/* if the end of the strip is greater than either of the boundaries, the range
@@ -590,7 +591,7 @@ short BKE_nlastrips_add_strip (ListBase *strips, NlaStrip *strip)
/* find the right place to add the strip to the nominated track */
for (ns= strips->first; ns; ns= ns->next) {
/* if current strip occurs after the new strip, add it before */
- if (ns->start > strip->end) {
+ if (ns->start >= strip->end) {
BLI_insertlinkbefore(strips, ns, strip);
not_added= 0;
break;
@@ -682,7 +683,7 @@ void BKE_nlastrips_clear_metastrip (ListBase *strips, NlaStrip *strip)
}
/* free the meta-strip now */
- BLI_freelinkN(strips, strip);
+ free_nlastrip(strips, strip);
}
/* Remove meta-strips (i.e. flatten the list of strips) from the top-level of the list of strips
@@ -916,9 +917,14 @@ void BKE_nlatrack_set_active (ListBase *tracks, NlaTrack *nlt_a)
/* Check if there is any space in the given track to add a strip of the given length */
short BKE_nlatrack_has_space (NlaTrack *nlt, float start, float end)
{
- /* sanity checks */
- if ((nlt == NULL) || IS_EQ(start, end))
+ /* sanity checks
+ * - track must exist
+ * - track must be editable
+ * - bounds cannot be equal (0-length is nasty)
+ */
+ if ((nlt == NULL) || (nlt->flag & NLATRACK_PROTECTED) || IS_EQ(start, end))
return 0;
+
if (start > end) {
puts("BKE_nlatrack_has_space() error... start and end arguments swapped");
SWAP(float, start, end);
@@ -1206,6 +1212,11 @@ void BKE_nlastrip_validate_fcurves (NlaStrip *strip)
/* Sanity Validation ------------------------------------ */
+static int nla_editbone_name_check(void *arg, const char *name)
+{
+ return BLI_ghash_haskey((GHash *)arg, (void *)name);
+}
+
/* Find (and set) a unique name for a strip from the whole AnimData block
* Uses a similar method to the BLI method, but is implemented differently
* as we need to ensure that the name is unique over several lists of tracks,
@@ -1259,28 +1270,8 @@ void BKE_nlastrip_validate_name (AnimData *adt, NlaStrip *strip)
/* if the hash-table has a match for this name, try other names...
* - in an extreme case, it might not be able to find a name, but then everything else in Blender would fail too :)
*/
- if (BLI_ghash_haskey(gh, strip->name)) {
- char tempname[128];
- int number = 1;
- char *dot;
-
- /* Strip off the suffix */
- dot = strrchr(strip->name, '.');
- if (dot) *dot=0;
-
- /* Try different possibilities */
- for (number = 1; number <= 999; number++) {
- /* assemble alternative name */
- BLI_snprintf(tempname, 128, "%s.%03d", strip->name, number);
-
- /* if hash doesn't have this, set it */
- if (BLI_ghash_haskey(gh, tempname) == 0) {
- BLI_strncpy(strip->name, tempname, sizeof(strip->name));
- break;
- }
- }
- }
-
+ BLI_uniquename_cb(nla_editbone_name_check, (void *)gh, "NlaStrip", '.', strip->name, sizeof(strip->name));
+
/* free the hash... */
BLI_ghash_free(gh, NULL, NULL);
}
@@ -1447,7 +1438,7 @@ void BKE_nla_action_pushdown (AnimData *adt)
/* do other necessary work on strip */
if (strip) {
/* clear reference to action now that we've pushed it onto the stack */
- adt->action->id.us--;
+ id_us_min(&adt->action->id);
adt->action= NULL;
/* if the strip is the first one in the track it lives in, check if there
@@ -1585,7 +1576,7 @@ void BKE_nla_tweakmode_exit (AnimData *adt)
/* Baking Tools ------------------------------------------- */
-void BKE_nla_bake (Scene *scene, ID *id, AnimData *adt, int flag)
+void BKE_nla_bake (Scene *scene, ID *UNUSED(id), AnimData *adt, int UNUSED(flag))
{
/* verify that data is valid
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 135ddbab2b7..218539b311a 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -27,7 +27,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include <Python.h>
#endif
@@ -36,16 +36,18 @@
#include <string.h>
#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
#include "RNA_access.h"
+#include "BKE_animsys.h"
+#include "BKE_action.h"
#include "BKE_fcurve.h"
-#include "BKE_animsys.h" /* BKE_free_animdata only */
-
+#include "BKE_node.h"
+#include "BKE_utildefines.h"
#include "PIL_time.h"
-
#include "CMP_node.h"
#include "intern/CMP_util.h" /* stupid include path... */
@@ -263,22 +265,23 @@ void ntreeVerifyTypes(bNodeTree *ntree)
/* ************** Group stuff ********** */
-bNodeType node_group_typeinfo= {
- /* next,prev */ NULL, NULL,
- /* type code */ NODE_GROUP,
- /* name */ "Group",
- /* width+range */ 120, 60, 200,
- /* class+opts */ NODE_CLASS_GROUP, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ NULL,
- /* storage */ "",
- /* execfunc */ NULL,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+/* XXX group typeinfo struct is used directly in ntreeMakeOwnType, needs cleanup */
+static bNodeType ntype_group;
+
+/* groups display their internal tree name as label */
+static const char *group_label(bNode *node)
+{
+ return node->id->name+2;
+}
+
+void register_node_type_group(ListBase *lb)
+{
+ node_type_base(&ntype_group, NODE_GROUP, "Group", NODE_CLASS_GROUP, NODE_OPTIONS, NULL, NULL);
+ node_type_size(&ntype_group, 120, 60, 200);
+ node_type_label(&ntype_group, group_label);
+
+ nodeRegisterType(lb, &ntype_group);
+}
/* tag internal sockets */
static void group_tag_internal_sockets(bNodeTree *ngroup)
@@ -378,7 +381,7 @@ void ntreeMakeOwnType(bNodeTree *ngroup)
/* make own type struct */
ngroup->owntype= MEM_callocN(sizeof(bNodeType), "group type");
- *ngroup->owntype= node_group_typeinfo; /* copy data, for init */
+ *ngroup->owntype= ntype_group; /* copy data, for init */
/* input type arrays */
if(totin) {
@@ -460,6 +463,7 @@ bNode *nodeMakeGroupFromSelected(bNodeTree *ntree)
bNode *node, *gnode, *nextn;
bNodeSocket *sock;
bNodeTree *ngroup;
+ ListBase anim_basepaths = {NULL, NULL};
float min[2], max[2];
int totnode=0;
@@ -496,19 +500,33 @@ bNode *nodeMakeGroupFromSelected(bNodeTree *ntree)
return NULL;
/* OK! new nodetree */
- ngroup= alloc_libblock(&G.main->nodetree, ID_NT, "NodeGroup");
- ngroup->type= ntree->type;
- ngroup->alltypes= ntree->alltypes;
+ ngroup= ntreeAddTree("NodeGroup", ntree->type, TRUE);
/* move nodes over */
for(node= ntree->nodes.first; node; node= nextn) {
nextn= node->next;
if(node->flag & NODE_SELECT) {
+ /* keep track of this node's RNA "base" path (the part of the pat identifying the node)
+ * if the old nodetree has animation data which potentially covers this node
+ */
+ if (ntree->adt) {
+ PointerRNA ptr;
+ char *path;
+
+ RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr);
+ path = RNA_path_from_ID_to_struct(&ptr);
+
+ if (path)
+ BLI_addtail(&anim_basepaths, BLI_genericNodeN(path));
+ }
+
+ /* change node-collection membership */
BLI_remlink(&ntree->nodes, node);
BLI_addtail(&ngroup->nodes, node);
+
node->locx-= 0.5f*(min[0]+max[0]);
node->locy-= 0.5f*(min[1]+max[1]);
-
+
/* set socket own_index to zero since it can still have a value
* from being in a group before, otherwise it doesn't get a unique
* index in group_verify_own_indices */
@@ -528,6 +546,21 @@ bNode *nodeMakeGroupFromSelected(bNodeTree *ntree)
}
}
+ /* move animation data over */
+ if (ntree->adt) {
+ LinkData *ld, *ldn=NULL;
+
+ BKE_animdata_separate_by_basepath(&ntree->id, &ngroup->id, &anim_basepaths);
+
+ /* paths + their wrappers need to be freed */
+ for (ld = anim_basepaths.first; ld; ld = ldn) {
+ ldn = ld->next;
+
+ MEM_freeN(ld->data);
+ BLI_freelinkN(&anim_basepaths, ld);
+ }
+ }
+
/* now we can make own group typeinfo */
ntreeMakeOwnType(ngroup);
@@ -584,6 +617,12 @@ bNode *nodeMakeGroupFromSelected(bNodeTree *ntree)
/* should become callbackable... */
void nodeVerifyGroup(bNodeTree *ngroup)
{
+ /* XXX nodeVerifyGroup is sometimes called for non-group trees.
+ * This is not the best way to check if a tree is a group,
+ * trees should get their own flag for this!
+ */
+ if (!ngroup->owntype)
+ return;
/* group changed, so we rebuild the type definition */
ntreeMakeOwnType(ngroup);
@@ -773,6 +812,7 @@ int nodeGroupUnGroup(bNodeTree *ntree, bNode *gnode)
bNodeLink *link, *linkn;
bNode *node, *nextn;
bNodeTree *ngroup, *wgroup;
+ ListBase anim_basepaths = {NULL, NULL};
int index;
ngroup= (bNodeTree *)gnode->id;
@@ -781,16 +821,38 @@ int nodeGroupUnGroup(bNodeTree *ntree, bNode *gnode)
/* clear new pointers, set in copytree */
for(node= ntree->nodes.first; node; node= node->next)
node->new_node= NULL;
-
- wgroup= ntreeCopyTree(ngroup, 0);
+
+ /* wgroup is a temporary copy of the NodeTree we're merging in
+ * - all of wgroup's nodes are transferred across to their new home
+ * - ngroup (i.e. the source NodeTree) is left unscathed
+ */
+ wgroup= ntreeCopyTree(ngroup);
/* add the nodes into the ntree */
for(node= wgroup->nodes.first; node; node= nextn) {
nextn= node->next;
+
+ /* keep track of this node's RNA "base" path (the part of the pat identifying the node)
+ * if the old nodetree has animation data which potentially covers this node
+ */
+ if (wgroup->adt) {
+ PointerRNA ptr;
+ char *path;
+
+ RNA_pointer_create(&wgroup->id, &RNA_Node, node, &ptr);
+ path = RNA_path_from_ID_to_struct(&ptr);
+
+ if (path)
+ BLI_addtail(&anim_basepaths, BLI_genericNodeN(path));
+ }
+
+ /* migrate node */
BLI_remlink(&wgroup->nodes, node);
BLI_addtail(&ntree->nodes, node);
+
node->locx+= gnode->locx;
node->locy+= gnode->locy;
+
node->flag |= NODE_SELECT;
}
/* and the internal links */
@@ -799,6 +861,29 @@ int nodeGroupUnGroup(bNodeTree *ntree, bNode *gnode)
BLI_remlink(&wgroup->links, link);
BLI_addtail(&ntree->links, link);
}
+
+ /* and copy across the animation */
+ if (wgroup->adt) {
+ LinkData *ld, *ldn=NULL;
+ bAction *waction;
+
+ /* firstly, wgroup needs to temporary dummy action that can be destroyed, as it shares copies */
+ waction = wgroup->adt->action = copy_action(wgroup->adt->action);
+
+ /* now perform the moving */
+ BKE_animdata_separate_by_basepath(&wgroup->id, &ntree->id, &anim_basepaths);
+
+ /* paths + their wrappers need to be freed */
+ for (ld = anim_basepaths.first; ld; ld = ldn) {
+ ldn = ld->next;
+
+ MEM_freeN(ld->data);
+ BLI_freelinkN(&anim_basepaths, ld);
+ }
+
+ /* free temp action too */
+ free_libblock(&G.main->action, waction);
+ }
/* restore links to and from the gnode */
for(link= ntree->links.first; link; link= link->next) {
@@ -841,7 +926,7 @@ void nodeCopyGroup(bNode *gnode)
bNodeSocket *sock;
gnode->id->us--;
- gnode->id= (ID *)ntreeCopyTree((bNodeTree *)gnode->id, 0);
+ gnode->id= (ID *)ntreeCopyTree((bNodeTree *)gnode->id);
/* new_sock was set in nodeCopyNode */
for(sock=gnode->inputs.first; sock; sock=sock->next)
@@ -884,6 +969,11 @@ bNode *nodeAddNodeType(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id)
bNode *node= NULL;
bNodeType *ntype= NULL;
+ if (ngroup && BLI_findindex(&G.main->nodetree, ngroup)==-1) {
+ printf("nodeAddNodeType() error: '%s' not in main->nodetree\n", ngroup->id.name);
+ return NULL;
+ }
+
if(type>=NODE_DYNAMIC_MENU) {
int a=0, idx= type-NODE_DYNAMIC_MENU;
ntype= ntree->alltypes.first;
@@ -1000,15 +1090,61 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node, int internal)
return nnode;
}
+/* fromsock and tosock can be NULL */
+/* also used via rna api, so we check for proper input output direction */
bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, bNode *tonode, bNodeSocket *tosock)
{
- bNodeLink *link= MEM_callocN(sizeof(bNodeLink), "link");
+ bNodeSocket *sock;
+ bNodeLink *link= NULL;
+ int from= 0, to= 0;
+
+ if(fromsock) {
+ /* test valid input */
+ for(sock= fromnode->outputs.first; sock; sock= sock->next)
+ if(sock==fromsock)
+ break;
+ if(sock)
+ from= 1; /* OK */
+ else {
+ for(sock= fromnode->inputs.first; sock; sock= sock->next)
+ if(sock==fromsock)
+ break;
+ if(sock)
+ from= -1; /* OK but flip */
+ }
+ }
+ if(tosock) {
+ for(sock= tonode->inputs.first; sock; sock= sock->next)
+ if(sock==tosock)
+ break;
+ if(sock)
+ to= 1; /* OK */
+ else {
+ for(sock= tonode->outputs.first; sock; sock= sock->next)
+ if(sock==tosock)
+ break;
+ if(sock)
+ to= -1; /* OK but flip */
+ }
+ }
- BLI_addtail(&ntree->links, link);
- link->fromnode= fromnode;
- link->fromsock= fromsock;
- link->tonode= tonode;
- link->tosock= tosock;
+ /* this allows NULL sockets to work */
+ if(from >= 0 && to >= 0) {
+ link= MEM_callocN(sizeof(bNodeLink), "link");
+ BLI_addtail(&ntree->links, link);
+ link->fromnode= fromnode;
+ link->fromsock= fromsock;
+ link->tonode= tonode;
+ link->tosock= tosock;
+ }
+ else if(from <= 0 && to <= 0) {
+ link= MEM_callocN(sizeof(bNodeLink), "link");
+ BLI_addtail(&ntree->links, link);
+ link->fromnode= tonode;
+ link->fromsock= tosock;
+ link->tonode= fromnode;
+ link->tosock= fromsock;
+ }
return link;
}
@@ -1034,32 +1170,32 @@ void nodeRemSocketLinks(bNodeTree *ntree, bNodeSocket *sock)
}
-bNodeTree *ntreeAddTree(int type)
+bNodeTree *ntreeAddTree(const char *name, int type, const short is_group)
{
- bNodeTree *ntree= MEM_callocN(sizeof(bNodeTree), "new node tree");
+ bNodeTree *ntree;
+
+ if (is_group)
+ ntree= alloc_libblock(&G.main->nodetree, ID_NT, name);
+ else {
+ ntree= MEM_callocN(sizeof(bNodeTree), "new node tree");
+ *( (short *)ntree->id.name )= ID_NT; /* not "type", as that is ntree->type */
+ BLI_strncpy(ntree->id.name+2, name, sizeof(ntree->id.name));
+ }
+
ntree->type= type;
ntree->alltypes.first = NULL;
ntree->alltypes.last = NULL;
- /* this helps RNA identify ID pointers as nodetree */
- if(ntree->type==NTREE_SHADER)
- BLI_strncpy(ntree->id.name, "NTShader Nodetree", sizeof(ntree->id.name));
- else if(ntree->type==NTREE_COMPOSIT)
- BLI_strncpy(ntree->id.name, "NTCompositing Nodetree", sizeof(ntree->id.name));
- else if(ntree->type==NTREE_TEXTURE)
- BLI_strncpy(ntree->id.name, "NTTexture Nodetree", sizeof(ntree->id.name));
-
ntreeInitTypes(ntree);
return ntree;
}
/* Warning: this function gets called during some rather unexpected times
- * - internal_select is only 1 when used for duplicating selected nodes (i.e. Shift-D duplicate operator)
* - this gets called when executing compositing updates (for threaded previews)
* - when the nodetree datablock needs to be copied (i.e. when users get copied)
* - for scene duplication use ntreeSwapID() after so we dont have stale pointers.
*/
-bNodeTree *ntreeCopyTree(bNodeTree *ntree, int internal_select)
+bNodeTree *ntreeCopyTree(bNodeTree *ntree)
{
bNodeTree *newtree;
bNode *node, *nnode, *last;
@@ -1069,34 +1205,26 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree, int internal_select)
if(ntree==NULL) return NULL;
- if(internal_select==0) {
- /* is ntree part of library? */
- for(newtree=G.main->nodetree.first; newtree; newtree= newtree->id.next)
- if(newtree==ntree) break;
- if(newtree) {
- newtree= copy_libblock(ntree);
- } else {
- newtree= MEM_dupallocN(ntree);
- copy_libblock_data(&newtree->id, &ntree->id); /* copy animdata and ID props */
- }
- newtree->nodes.first= newtree->nodes.last= NULL;
- newtree->links.first= newtree->links.last= NULL;
+ /* is ntree part of library? */
+ for(newtree=G.main->nodetree.first; newtree; newtree= newtree->id.next)
+ if(newtree==ntree) break;
+ if(newtree) {
+ newtree= copy_libblock(ntree);
+ } else {
+ newtree= MEM_dupallocN(ntree);
+ copy_libblock_data(&newtree->id, &ntree->id, TRUE); /* copy animdata and ID props */
}
- else
- newtree= ntree;
+ newtree->nodes.first= newtree->nodes.last= NULL;
+ newtree->links.first= newtree->links.last= NULL;
- last= ntree->nodes.last;
+ last = ntree->nodes.last;
for(node= ntree->nodes.first; node; node= node->next) {
-
node->new_node= NULL;
- if(internal_select==0 || (node->flag & NODE_SELECT)) {
- nnode= nodeCopyNode(newtree, node, internal_select); /* sets node->new */
- if(internal_select) {
- node->flag &= ~(NODE_SELECT|NODE_ACTIVE);
- nnode->flag |= NODE_SELECT;
- }
- }
- if(node==last) break;
+ nnode= nodeCopyNode(newtree, node, 0); /* sets node->new */
+
+ /* make sure we don't copy new nodes again! */
+ if (node==last)
+ break;
}
/* check for copying links */
@@ -1120,15 +1248,14 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree, int internal_select)
}
/* own type definition for group usage */
- if(internal_select==0) {
- if(ntree->owntype) {
- newtree->owntype= MEM_dupallocN(ntree->owntype);
- if(ntree->owntype->inputs)
- newtree->owntype->inputs= MEM_dupallocN(ntree->owntype->inputs);
- if(ntree->owntype->outputs)
- newtree->owntype->outputs= MEM_dupallocN(ntree->owntype->outputs);
- }
+ if(ntree->owntype) {
+ newtree->owntype= MEM_dupallocN(ntree->owntype);
+ if(ntree->owntype->inputs)
+ newtree->owntype->inputs= MEM_dupallocN(ntree->owntype->inputs);
+ if(ntree->owntype->outputs)
+ newtree->owntype->outputs= MEM_dupallocN(ntree->owntype->outputs);
}
+
/* weird this is required... there seem to be link pointers wrong still? */
/* anyhoo, doing this solves crashes on copying entire tree (copy scene) and delete nodes */
ntreeSolveOrder(newtree);
@@ -1182,12 +1309,11 @@ static void node_init_preview(bNode *node, int xsize, int ysize)
}
if(node->preview->rect==NULL) {
- node->preview->rect= MEM_callocN(4*xsize + xsize*ysize*sizeof(float)*4, "node preview rect");
+ node->preview->rect= MEM_callocN(4*xsize + xsize*ysize*sizeof(char)*4, "node preview rect");
node->preview->xsize= xsize;
node->preview->ysize= ysize;
}
- else
- memset(node->preview->rect, 0, 4*xsize + xsize*ysize*sizeof(float)*4);
+ /* no clear, makes nicer previews */
}
void ntreeInitPreview(bNodeTree *ntree, int xsize, int ysize)
@@ -1237,12 +1363,18 @@ void nodeAddToPreview(bNode *node, float *col, int x, int y)
if(x>=0 && y>=0) {
if(x<preview->xsize && y<preview->ysize) {
unsigned char *tar= preview->rect+ 4*((preview->xsize*y) + x);
- //if(tar[0]==0.0f) {
- tar[0]= FTOCHAR(col[0]);
- tar[1]= FTOCHAR(col[1]);
- tar[2]= FTOCHAR(col[2]);
+
+ if(TRUE) {
+ tar[0]= FTOCHAR(linearrgb_to_srgb(col[0]));
+ tar[1]= FTOCHAR(linearrgb_to_srgb(col[1]));
+ tar[2]= FTOCHAR(linearrgb_to_srgb(col[2]));
+ }
+ else {
+ tar[0]= FTOCHAR(col[0]);
+ tar[1]= FTOCHAR(col[1]);
+ tar[2]= FTOCHAR(col[2]);
+ }
tar[3]= FTOCHAR(col[3]);
- //}
}
//else printf("prv out bound x y %d %d\n", x, y);
}
@@ -1431,7 +1563,7 @@ void ntreeMakeLocal(bNodeTree *ntree)
}
else if(local && lib) {
/* this is the mixed case, we copy the tree and assign it to local users */
- bNodeTree *newtree= ntreeCopyTree(ntree, 0);
+ bNodeTree *newtree= ntreeCopyTree(ntree);
newtree->id.us= 0;
@@ -1690,6 +1822,59 @@ static int node_recurs_check(bNode *node, bNode ***nsort, int level)
return 0xFFF;
}
+
+static void ntreeSetOutput(bNodeTree *ntree)
+{
+ bNode *node;
+
+ /* find the active outputs, might become tree type dependant handler */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
+ bNode *tnode;
+ int output= 0;
+
+ /* we need a check for which output node should be tagged like this, below an exception */
+ if(node->type==CMP_NODE_OUTPUT_FILE)
+ continue;
+
+ /* there is more types having output class, each one is checked */
+ for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) {
+ if(tnode->typeinfo->nclass==NODE_CLASS_OUTPUT) {
+
+ if(ntree->type==NTREE_COMPOSIT) {
+
+ /* same type, exception for viewer */
+ if(tnode->type==node->type ||
+ (ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) &&
+ ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))) {
+ if(tnode->flag & NODE_DO_OUTPUT) {
+ output++;
+ if(output>1)
+ tnode->flag &= ~NODE_DO_OUTPUT;
+ }
+ }
+ }
+ else {
+ /* same type */
+ if(tnode->type==node->type) {
+ if(tnode->flag & NODE_DO_OUTPUT) {
+ output++;
+ if(output>1)
+ tnode->flag &= ~NODE_DO_OUTPUT;
+ }
+ }
+ }
+ }
+ }
+ if(output==0)
+ node->flag |= NODE_DO_OUTPUT;
+ }
+ }
+
+ /* here we could recursively set which nodes have to be done,
+ might be different for editor or for "real" use... */
+}
+
void ntreeSolveOrder(bNodeTree *ntree)
{
bNode *node, **nodesort, **nsort;
@@ -1738,38 +1923,11 @@ void ntreeSolveOrder(bNodeTree *ntree)
}
MEM_freeN(nodesort);
-
- /* find the active outputs, might become tree type dependant handler */
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
- bNode *tnode;
- int output= 0;
-
- /* we need a check for which output node should be tagged like this, below an exception */
- if(node->type==CMP_NODE_OUTPUT_FILE)
- continue;
-
- /* there is more types having output class, each one is checked */
- for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) {
- if(tnode->typeinfo->nclass==NODE_CLASS_OUTPUT) {
- if(tnode->type==node->type) {
- if(tnode->flag & NODE_DO_OUTPUT) {
- output++;
- if(output>1)
- tnode->flag &= ~NODE_DO_OUTPUT;
- }
- }
- }
- }
- if(output==0)
- node->flag |= NODE_DO_OUTPUT;
- }
- }
-
- /* here we could recursively set which nodes have to be done,
- might be different for editor or for "real" use... */
+
+ ntreeSetOutput(ntree);
}
+
/* Should be callback! */
/* Do not call execs here */
void NodeTagChanged(bNodeTree *ntree, bNode *node)
@@ -1791,7 +1949,7 @@ int NodeTagIDChanged(bNodeTree *ntree, ID *id)
{
int change = FALSE;
- if(id==NULL)
+ if(ELEM(NULL, id, ntree))
return change;
if(ntree->type==NTREE_COMPOSIT) {
@@ -1956,7 +2114,6 @@ static void composit_begin_exec(bNodeTree *ntree, int is_group)
/* copy stack compbufs to sockets */
static void composit_end_exec(bNodeTree *ntree, int is_group)
{
- extern void print_compbuf(char *str, struct CompBuf *cbuf);
bNode *node;
bNodeStack *ns;
int a;
@@ -2439,6 +2596,25 @@ static bNode *getExecutableNode(bNodeTree *ntree)
return NULL;
}
+/* check if texture nodes need exec or end */
+static void ntree_composite_texnode(bNodeTree *ntree, int init)
+{
+ bNode *node;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type==CMP_NODE_TEXTURE && node->id) {
+ Tex *tex= (Tex *)node->id;
+ if(tex->nodetree && tex->use_nodes) {
+ /* has internal flag to detect it only does it once */
+ if(init)
+ ntreeBeginExecTree(tex->nodetree);
+ else
+ ntreeEndExecTree(tex->nodetree);
+ }
+ }
+ }
+
+}
/* optimized tree execute test for compositing */
void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview)
@@ -2454,6 +2630,7 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview)
ntreeInitPreview(ntree, 0, 0);
ntreeBeginExecTree(ntree);
+ ntree_composite_texnode(ntree, 1);
/* prevent unlucky accidents */
if(G.background)
@@ -2466,6 +2643,9 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview)
/* fixed seed, for example noise texture */
BLI_srandom(rd->cfra);
+ /* ensures only a single output node is enabled */
+ ntreeSetOutput(ntree);
+
/* sets need_exec tags in nodes */
curnode = totnode= setExecutableNodes(ntree, &thdata);
@@ -2551,7 +2731,7 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree)
}
/* node copy func */
- ltree= ntreeCopyTree(ntree, 0);
+ ltree= ntreeCopyTree(ntree);
if(adt) {
AnimData *ladt= BKE_animdata_from_id(&ltree->id);
@@ -2564,9 +2744,10 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree)
}
/* end animdata uglyness */
-
- /* move over the compbufs */
- /* right after ntreeCopyTree() oldsock pointers are valid */
+
+ /* ensures only a single output node is enabled */
+ ntreeSetOutput(ntree);
+
for(node= ntree->nodes.first; node; node= node->next) {
/* store new_node pointer to original */
@@ -2574,22 +2755,27 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree)
/* ensure new user input gets handled ok */
node->need_exec= 0;
- if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
- if(node->id) {
- if(node->flag & NODE_DO_OUTPUT)
- node->new_node->id= (ID *)copy_image((Image *)node->id);
- else
- node->new_node->id= NULL;
- }
- }
-
- for(sock= node->outputs.first; sock; sock= sock->next) {
+ if(ntree->type==NTREE_COMPOSIT) {
+ /* move over the compbufs */
+ /* right after ntreeCopyTree() oldsock pointers are valid */
- sock->new_sock->ns.data= sock->ns.data;
- compbuf_set_node(sock->new_sock->ns.data, node->new_node);
+ if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
+ if(node->id) {
+ if(node->flag & NODE_DO_OUTPUT)
+ node->new_node->id= (ID *)copy_image((Image *)node->id);
+ else
+ node->new_node->id= NULL;
+ }
+ }
- sock->ns.data= NULL;
- sock->new_sock->new_sock= sock;
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+
+ sock->new_sock->ns.data= sock->ns.data;
+ compbuf_set_node(sock->new_sock->ns.data, node->new_node);
+
+ sock->ns.data= NULL;
+ sock->new_sock->new_sock= sock;
+ }
}
}
@@ -2617,19 +2803,38 @@ static int outsocket_exists(bNode *node, bNodeSocket *testsock)
/* sync local composite with real tree */
/* local composite is supposed to be running, be careful moving previews! */
+/* is called by jobs manager, outside threads, so it doesnt happen during draw */
void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree)
{
bNode *lnode;
- /* move over the compbufs and previews */
- for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
- if( (lnode->exec & NODE_READY) && !(lnode->exec & NODE_SKIPPED) ) {
+ if(ntree->type==NTREE_COMPOSIT) {
+ /* move over the compbufs and previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+ if( (lnode->exec & NODE_READY) && !(lnode->exec & NODE_SKIPPED) ) {
+ if(node_exists(ntree, lnode->new_node)) {
+
+ if(lnode->preview && lnode->preview->rect) {
+ node_free_preview(lnode->new_node);
+ lnode->new_node->preview= lnode->preview;
+ lnode->preview= NULL;
+ }
+ }
+ }
+ }
+ }
+ else if(ntree->type==NTREE_SHADER) {
+ /* copy over contents of previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
if(node_exists(ntree, lnode->new_node)) {
+ bNode *node= lnode->new_node;
- if(lnode->preview && lnode->preview->rect) {
- node_free_preview(lnode->new_node);
- lnode->new_node->preview= lnode->preview;
- lnode->preview= NULL;
+ if(node->preview && node->preview->rect) {
+ if(lnode->preview && lnode->preview->rect) {
+ int xsize= node->preview->xsize;
+ int ysize= node->preview->ysize;
+ memcpy(node->preview->rect, lnode->preview->rect, 4*xsize + xsize*ysize*sizeof(char)*4);
+ }
}
}
}
@@ -2700,7 +2905,7 @@ static void gpu_from_node_stack(ListBase *sockets, bNodeStack **ns, GPUNodeStack
gs[i].name = "";
gs[i].hasinput= ns[i]->hasinput && ns[i]->data;
- gs[i].hasoutput= ns[i]->hasinput && ns[i]->data;
+ gs[i].hasoutput= ns[i]->hasoutput && ns[i]->data;
gs[i].sockettype= ns[i]->sockettype;
}
@@ -2714,8 +2919,6 @@ static void data_from_gpu_stack(ListBase *sockets, bNodeStack **ns, GPUNodeStack
for (sock=sockets->first, i=0; sock; sock=sock->next, i++) {
ns[i]->data= gs[i].link;
- ns[i]->hasinput= gs[i].hasinput && gs[i].link;
- ns[i]->hasoutput= gs[i].hasoutput;
ns[i]->sockettype= gs[i].sockettype;
}
}
@@ -2891,6 +3094,8 @@ void ntreeCompositTagRender(Scene *curscene)
for(node= sce->nodetree->nodes.first; node; node= node->next) {
if(node->id==(ID *)curscene || node->type==CMP_NODE_COMPOSITE)
NodeTagChanged(sce->nodetree, node);
+ else if(node->type==CMP_NODE_TEXTURE) /* uses scene sizex/sizey */
+ NodeTagChanged(sce->nodetree, node);
}
}
}
@@ -2906,7 +3111,7 @@ static int node_animation_properties(bNodeTree *ntree, bNode *node)
/* check to see if any of the node's properties have fcurves */
RNA_pointer_create((ID *)ntree, &RNA_Node, node, &ptr);
- lb = RNA_struct_defined_properties(ptr.type);
+ lb = RNA_struct_type_properties(ptr.type);
for (link=lb->first; link; link=link->next) {
int driven, len=1, index;
@@ -2968,10 +3173,7 @@ int ntreeCompositTagAnimated(bNodeTree *ntree)
NodeTagChanged(ntree, node);
tagged= 1;
}
- else if(node->type==CMP_NODE_R_LAYERS) {
- NodeTagChanged(ntree, node);
- tagged= 1;
- }
+ /* here was tag render layer, but this is called after a render, so re-composites fail */
else if(node->type==NODE_GROUP) {
if( ntreeCompositTagAnimated((bNodeTree *)node->id) ) {
NodeTagChanged(ntree, node);
@@ -2996,6 +3198,21 @@ void ntreeCompositTagGenerators(bNodeTree *ntree)
}
}
+/* XXX after render animation system gets a refresh, this call allows composite to end clean */
+void ntreeClearTags(bNodeTree *ntree)
+{
+ bNode *node;
+
+ if(ntree==NULL) return;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ node->need_exec= 0;
+ if(node->type==NODE_GROUP)
+ ntreeClearTags((bNodeTree *)node->id);
+ }
+}
+
+
int ntreeTexTagAnimated(bNodeTree *ntree)
{
bNode *node;
@@ -3019,6 +3236,62 @@ int ntreeTexTagAnimated(bNodeTree *ntree)
/* ************* node definition init ********** */
+void node_type_base(bNodeType *ntype, int type, const char *name, short nclass, short flag,
+ struct bNodeSocketType *inputs, struct bNodeSocketType *outputs)
+{
+ memset(ntype, 0, sizeof(bNodeType));
+
+ ntype->type = type;
+ ntype->name = name;
+ ntype->nclass = nclass;
+ ntype->flag = flag;
+
+ ntype->inputs = inputs;
+ ntype->outputs = outputs;
+
+ /* default size values */
+ ntype->width = 140;
+ ntype->minwidth = 100;
+ ntype->maxwidth = 320;
+}
+
+void node_type_init(bNodeType *ntype, void (*initfunc)(struct bNode *))
+{
+ ntype->initfunc = initfunc;
+}
+
+void node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth)
+{
+ ntype->width = width;
+ ntype->minwidth = minwidth;
+ ntype->maxwidth = maxwidth;
+}
+
+void node_type_storage(bNodeType *ntype, const char *storagename, void (*freestoragefunc)(struct bNode *), void (*copystoragefunc)(struct bNode *, struct bNode *))
+{
+ if (storagename)
+ strncpy(ntype->storagename, storagename, sizeof(ntype->storagename));
+ else
+ ntype->storagename[0] = '\0';
+ ntype->copystoragefunc = copystoragefunc;
+ ntype->freestoragefunc = freestoragefunc;
+}
+
+void node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **))
+{
+ ntype->execfunc = execfunc;
+}
+
+void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out))
+{
+ ntype->gpufunc = gpufunc;
+}
+
+void node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *))
+{
+ ntype->labelfunc = labelfunc;
+}
+
static bNodeType *is_nodetype_registered(ListBase *typelist, int type, ID *id)
{
bNodeType *ntype= typelist->first;
@@ -3044,147 +3317,150 @@ void nodeRegisterType(ListBase *typelist, const bNodeType *ntype)
static void registerCompositNodes(ListBase *ntypelist)
{
- nodeRegisterType(ntypelist, &node_group_typeinfo);
- nodeRegisterType(ntypelist, &cmp_node_rlayers);
- nodeRegisterType(ntypelist, &cmp_node_image);
- nodeRegisterType(ntypelist, &cmp_node_texture);
- nodeRegisterType(ntypelist, &cmp_node_value);
- nodeRegisterType(ntypelist, &cmp_node_rgb);
- nodeRegisterType(ntypelist, &cmp_node_curve_time);
-
- nodeRegisterType(ntypelist, &cmp_node_composite);
- nodeRegisterType(ntypelist, &cmp_node_viewer);
- nodeRegisterType(ntypelist, &cmp_node_splitviewer);
- nodeRegisterType(ntypelist, &cmp_node_output_file);
- nodeRegisterType(ntypelist, &cmp_node_view_levels);
-
- nodeRegisterType(ntypelist, &cmp_node_curve_rgb);
- nodeRegisterType(ntypelist, &cmp_node_mix_rgb);
- nodeRegisterType(ntypelist, &cmp_node_hue_sat);
- nodeRegisterType(ntypelist, &cmp_node_brightcontrast);
- nodeRegisterType(ntypelist, &cmp_node_gamma);
- nodeRegisterType(ntypelist, &cmp_node_invert);
- nodeRegisterType(ntypelist, &cmp_node_alphaover);
- nodeRegisterType(ntypelist, &cmp_node_zcombine);
- nodeRegisterType(ntypelist, &cmp_node_colorbalance);
- nodeRegisterType(ntypelist, &cmp_node_huecorrect);
-
- nodeRegisterType(ntypelist, &cmp_node_normal);
- nodeRegisterType(ntypelist, &cmp_node_curve_vec);
- nodeRegisterType(ntypelist, &cmp_node_map_value);
- nodeRegisterType(ntypelist, &cmp_node_normalize);
-
- nodeRegisterType(ntypelist, &cmp_node_filter);
- nodeRegisterType(ntypelist, &cmp_node_blur);
- nodeRegisterType(ntypelist, &cmp_node_dblur);
- nodeRegisterType(ntypelist, &cmp_node_bilateralblur);
- nodeRegisterType(ntypelist, &cmp_node_vecblur);
- nodeRegisterType(ntypelist, &cmp_node_dilateerode);
- nodeRegisterType(ntypelist, &cmp_node_defocus);
-
- nodeRegisterType(ntypelist, &cmp_node_valtorgb);
- nodeRegisterType(ntypelist, &cmp_node_rgbtobw);
- nodeRegisterType(ntypelist, &cmp_node_setalpha);
- nodeRegisterType(ntypelist, &cmp_node_idmask);
- nodeRegisterType(ntypelist, &cmp_node_math);
- nodeRegisterType(ntypelist, &cmp_node_seprgba);
- nodeRegisterType(ntypelist, &cmp_node_combrgba);
- nodeRegisterType(ntypelist, &cmp_node_sephsva);
- nodeRegisterType(ntypelist, &cmp_node_combhsva);
- nodeRegisterType(ntypelist, &cmp_node_sepyuva);
- nodeRegisterType(ntypelist, &cmp_node_combyuva);
- nodeRegisterType(ntypelist, &cmp_node_sepycca);
- nodeRegisterType(ntypelist, &cmp_node_combycca);
- nodeRegisterType(ntypelist, &cmp_node_premulkey);
-
- nodeRegisterType(ntypelist, &cmp_node_diff_matte);
- nodeRegisterType(ntypelist, &cmp_node_distance_matte);
- nodeRegisterType(ntypelist, &cmp_node_chroma_matte);
- nodeRegisterType(ntypelist, &cmp_node_color_matte);
- nodeRegisterType(ntypelist, &cmp_node_channel_matte);
- nodeRegisterType(ntypelist, &cmp_node_color_spill);
- nodeRegisterType(ntypelist, &cmp_node_luma_matte);
-
- nodeRegisterType(ntypelist, &cmp_node_translate);
- nodeRegisterType(ntypelist, &cmp_node_rotate);
- nodeRegisterType(ntypelist, &cmp_node_scale);
- nodeRegisterType(ntypelist, &cmp_node_flip);
- nodeRegisterType(ntypelist, &cmp_node_crop);
- nodeRegisterType(ntypelist, &cmp_node_displace);
- nodeRegisterType(ntypelist, &cmp_node_mapuv);
- nodeRegisterType(ntypelist, &cmp_node_glare);
- nodeRegisterType(ntypelist, &cmp_node_tonemap);
- nodeRegisterType(ntypelist, &cmp_node_lensdist);
+ register_node_type_group(ntypelist);
+
+ register_node_type_cmp_rlayers(ntypelist);
+ register_node_type_cmp_image(ntypelist);
+ register_node_type_cmp_texture(ntypelist);
+ register_node_type_cmp_value(ntypelist);
+ register_node_type_cmp_rgb(ntypelist);
+ register_node_type_cmp_curve_time(ntypelist);
+
+ register_node_type_cmp_composite(ntypelist);
+ register_node_type_cmp_viewer(ntypelist);
+ register_node_type_cmp_splitviewer(ntypelist);
+ register_node_type_cmp_output_file(ntypelist);
+ register_node_type_cmp_view_levels(ntypelist);
+
+ register_node_type_cmp_curve_rgb(ntypelist);
+ register_node_type_cmp_mix_rgb(ntypelist);
+ register_node_type_cmp_hue_sat(ntypelist);
+ register_node_type_cmp_brightcontrast(ntypelist);
+ register_node_type_cmp_gamma(ntypelist);
+ register_node_type_cmp_invert(ntypelist);
+ register_node_type_cmp_alphaover(ntypelist);
+ register_node_type_cmp_zcombine(ntypelist);
+ register_node_type_cmp_colorbalance(ntypelist);
+ register_node_type_cmp_huecorrect(ntypelist);
+
+ register_node_type_cmp_normal(ntypelist);
+ register_node_type_cmp_curve_vec(ntypelist);
+ register_node_type_cmp_map_value(ntypelist);
+ register_node_type_cmp_normalize(ntypelist);
+
+ register_node_type_cmp_filter(ntypelist);
+ register_node_type_cmp_blur(ntypelist);
+ register_node_type_cmp_dblur(ntypelist);
+ register_node_type_cmp_bilateralblur(ntypelist);
+ register_node_type_cmp_vecblur(ntypelist);
+ register_node_type_cmp_dilateerode(ntypelist);
+ register_node_type_cmp_defocus(ntypelist);
+
+ register_node_type_cmp_valtorgb(ntypelist);
+ register_node_type_cmp_rgbtobw(ntypelist);
+ register_node_type_cmp_setalpha(ntypelist);
+ register_node_type_cmp_idmask(ntypelist);
+ register_node_type_cmp_math(ntypelist);
+ register_node_type_cmp_seprgba(ntypelist);
+ register_node_type_cmp_combrgba(ntypelist);
+ register_node_type_cmp_sephsva(ntypelist);
+ register_node_type_cmp_combhsva(ntypelist);
+ register_node_type_cmp_sepyuva(ntypelist);
+ register_node_type_cmp_combyuva(ntypelist);
+ register_node_type_cmp_sepycca(ntypelist);
+ register_node_type_cmp_combycca(ntypelist);
+ register_node_type_cmp_premulkey(ntypelist);
+
+ register_node_type_cmp_diff_matte(ntypelist);
+ register_node_type_cmp_distance_matte(ntypelist);
+ register_node_type_cmp_chroma_matte(ntypelist);
+ register_node_type_cmp_color_matte(ntypelist);
+ register_node_type_cmp_channel_matte(ntypelist);
+ register_node_type_cmp_color_spill(ntypelist);
+ register_node_type_cmp_luma_matte(ntypelist);
+
+ register_node_type_cmp_translate(ntypelist);
+ register_node_type_cmp_rotate(ntypelist);
+ register_node_type_cmp_scale(ntypelist);
+ register_node_type_cmp_flip(ntypelist);
+ register_node_type_cmp_crop(ntypelist);
+ register_node_type_cmp_displace(ntypelist);
+ register_node_type_cmp_mapuv(ntypelist);
+ register_node_type_cmp_glare(ntypelist);
+ register_node_type_cmp_tonemap(ntypelist);
+ register_node_type_cmp_lensdist(ntypelist);
}
static void registerShaderNodes(ListBase *ntypelist)
{
- nodeRegisterType(ntypelist, &node_group_typeinfo);
- nodeRegisterType(ntypelist, &sh_node_output);
- nodeRegisterType(ntypelist, &sh_node_mix_rgb);
- nodeRegisterType(ntypelist, &sh_node_valtorgb);
- nodeRegisterType(ntypelist, &sh_node_rgbtobw);
- nodeRegisterType(ntypelist, &sh_node_normal);
- nodeRegisterType(ntypelist, &sh_node_geom);
- nodeRegisterType(ntypelist, &sh_node_mapping);
- nodeRegisterType(ntypelist, &sh_node_curve_vec);
- nodeRegisterType(ntypelist, &sh_node_curve_rgb);
- nodeRegisterType(ntypelist, &sh_node_math);
- nodeRegisterType(ntypelist, &sh_node_vect_math);
- nodeRegisterType(ntypelist, &sh_node_squeeze);
- nodeRegisterType(ntypelist, &sh_node_camera);
- nodeRegisterType(ntypelist, &sh_node_material);
- nodeRegisterType(ntypelist, &sh_node_material_ext);
- nodeRegisterType(ntypelist, &sh_node_value);
- nodeRegisterType(ntypelist, &sh_node_rgb);
- nodeRegisterType(ntypelist, &sh_node_texture);
- nodeRegisterType(ntypelist, &node_dynamic_typeinfo);
- nodeRegisterType(ntypelist, &sh_node_invert);
- nodeRegisterType(ntypelist, &sh_node_seprgb);
- nodeRegisterType(ntypelist, &sh_node_combrgb);
- nodeRegisterType(ntypelist, &sh_node_hue_sat);
+ register_node_type_group(ntypelist);
+
+ register_node_type_sh_output(ntypelist);
+ register_node_type_sh_mix_rgb(ntypelist);
+ register_node_type_sh_valtorgb(ntypelist);
+ register_node_type_sh_rgbtobw(ntypelist);
+ register_node_type_sh_normal(ntypelist);
+ register_node_type_sh_geom(ntypelist);
+ register_node_type_sh_mapping(ntypelist);
+ register_node_type_sh_curve_vec(ntypelist);
+ register_node_type_sh_curve_rgb(ntypelist);
+ register_node_type_sh_math(ntypelist);
+ register_node_type_sh_vect_math(ntypelist);
+ register_node_type_sh_squeeze(ntypelist);
+ register_node_type_sh_camera(ntypelist);
+ register_node_type_sh_material(ntypelist);
+ register_node_type_sh_material_ext(ntypelist);
+ register_node_type_sh_value(ntypelist);
+ register_node_type_sh_rgb(ntypelist);
+ register_node_type_sh_texture(ntypelist);
+ register_node_type_sh_dynamic(ntypelist);
+ register_node_type_sh_invert(ntypelist);
+ register_node_type_sh_seprgb(ntypelist);
+ register_node_type_sh_combrgb(ntypelist);
+ register_node_type_sh_hue_sat(ntypelist);
}
static void registerTextureNodes(ListBase *ntypelist)
{
- nodeRegisterType(ntypelist, &node_group_typeinfo);
- nodeRegisterType(ntypelist, &tex_node_math);
- nodeRegisterType(ntypelist, &tex_node_mix_rgb);
- nodeRegisterType(ntypelist, &tex_node_valtorgb);
- nodeRegisterType(ntypelist, &tex_node_rgbtobw);
- nodeRegisterType(ntypelist, &tex_node_valtonor);
- nodeRegisterType(ntypelist, &tex_node_curve_rgb);
- nodeRegisterType(ntypelist, &tex_node_curve_time);
- nodeRegisterType(ntypelist, &tex_node_invert);
- nodeRegisterType(ntypelist, &tex_node_hue_sat);
- nodeRegisterType(ntypelist, &tex_node_coord);
- nodeRegisterType(ntypelist, &tex_node_distance);
- nodeRegisterType(ntypelist, &tex_node_compose);
- nodeRegisterType(ntypelist, &tex_node_decompose);
-
- nodeRegisterType(ntypelist, &tex_node_output);
- nodeRegisterType(ntypelist, &tex_node_viewer);
-
- nodeRegisterType(ntypelist, &tex_node_checker);
- nodeRegisterType(ntypelist, &tex_node_texture);
- nodeRegisterType(ntypelist, &tex_node_bricks);
- nodeRegisterType(ntypelist, &tex_node_image);
-
- nodeRegisterType(ntypelist, &tex_node_rotate);
- nodeRegisterType(ntypelist, &tex_node_translate);
- nodeRegisterType(ntypelist, &tex_node_scale);
- nodeRegisterType(ntypelist, &tex_node_at);
-
- nodeRegisterType(ntypelist, &tex_node_proc_voronoi);
- nodeRegisterType(ntypelist, &tex_node_proc_blend);
- nodeRegisterType(ntypelist, &tex_node_proc_magic);
- nodeRegisterType(ntypelist, &tex_node_proc_marble);
- nodeRegisterType(ntypelist, &tex_node_proc_clouds);
- nodeRegisterType(ntypelist, &tex_node_proc_wood);
- nodeRegisterType(ntypelist, &tex_node_proc_musgrave);
- nodeRegisterType(ntypelist, &tex_node_proc_noise);
- nodeRegisterType(ntypelist, &tex_node_proc_stucci);
- nodeRegisterType(ntypelist, &tex_node_proc_distnoise);
+ register_node_type_group(ntypelist);
+
+ register_node_type_tex_math(ntypelist);
+ register_node_type_tex_mix_rgb(ntypelist);
+ register_node_type_tex_valtorgb(ntypelist);
+ register_node_type_tex_rgbtobw(ntypelist);
+ register_node_type_tex_valtonor(ntypelist);
+ register_node_type_tex_curve_rgb(ntypelist);
+ register_node_type_tex_curve_time(ntypelist);
+ register_node_type_tex_invert(ntypelist);
+ register_node_type_tex_hue_sat(ntypelist);
+ register_node_type_tex_coord(ntypelist);
+ register_node_type_tex_distance(ntypelist);
+ register_node_type_tex_compose(ntypelist);
+ register_node_type_tex_decompose(ntypelist);
+
+ register_node_type_tex_output(ntypelist);
+ register_node_type_tex_viewer(ntypelist);
+
+ register_node_type_tex_checker(ntypelist);
+ register_node_type_tex_texture(ntypelist);
+ register_node_type_tex_bricks(ntypelist);
+ register_node_type_tex_image(ntypelist);
+
+ register_node_type_tex_rotate(ntypelist);
+ register_node_type_tex_translate(ntypelist);
+ register_node_type_tex_scale(ntypelist);
+ register_node_type_tex_at(ntypelist);
+
+ register_node_type_tex_proc_voronoi(ntypelist);
+ register_node_type_tex_proc_blend(ntypelist);
+ register_node_type_tex_proc_magic(ntypelist);
+ register_node_type_tex_proc_marble(ntypelist);
+ register_node_type_tex_proc_clouds(ntypelist);
+ register_node_type_tex_proc_wood(ntypelist);
+ register_node_type_tex_proc_musgrave(ntypelist);
+ register_node_type_tex_proc_noise(ntypelist);
+ register_node_type_tex_proc_stucci(ntypelist);
+ register_node_type_tex_proc_distnoise(ntypelist);
}
static void remove_dynamic_typeinfos(ListBase *list)
@@ -3198,7 +3474,7 @@ static void remove_dynamic_typeinfos(ListBase *list)
if(ntype->inputs) {
bNodeSocketType *sock= ntype->inputs;
while(sock->type!=-1) {
- MEM_freeN(sock->name);
+ MEM_freeN((void *)sock->name);
sock++;
}
MEM_freeN(ntype->inputs);
@@ -3206,13 +3482,13 @@ static void remove_dynamic_typeinfos(ListBase *list)
if(ntype->outputs) {
bNodeSocketType *sock= ntype->outputs;
while(sock->type!=-1) {
- MEM_freeN(sock->name);
+ MEM_freeN((void *)sock->name);
sock++;
}
MEM_freeN(ntype->outputs);
}
if(ntype->name) {
- MEM_freeN(ntype->name);
+ MEM_freeN((void *)ntype->name);
}
MEM_freeN(ntype);
}
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index ff22531cd84..1dc99c02f8b 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -57,12 +57,11 @@
#include "BLI_editVert.h"
#include "BLI_math.h"
#include "BLI_pbvh.h"
-
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
#include "BKE_main.h"
#include "BKE_global.h"
-
+#include "BKE_idprop.h"
#include "BKE_armature.h"
#include "BKE_action.h"
#include "BKE_bullet.h"
@@ -96,7 +95,7 @@
#include "LBM_fluidsim.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -245,6 +244,13 @@ void free_sculptsession(Object *ob)
if(ss->layer_co)
MEM_freeN(ss->layer_co);
+ if(ss->orig_cos)
+ MEM_freeN(ss->orig_cos);
+ if(ss->deform_cos)
+ MEM_freeN(ss->deform_cos);
+ if(ss->deform_imats)
+ MEM_freeN(ss->deform_imats);
+
MEM_freeN(ss);
ob->sculpt = NULL;
@@ -316,11 +322,11 @@ static void unlink_object__unlinkModifierLinks(void *userData, Object *ob, Objec
if (*obpoin==unlinkOb) {
*obpoin = NULL;
- ob->recalc |= OB_RECALC_ALL; // XXX: should this just be OB_RECALC_DATA?
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME; // XXX: should this just be OB_RECALC_DATA?
}
}
-void unlink_object(Scene *scene, Object *ob)
+void unlink_object(Object *ob)
{
Main *bmain= G.main;
Object *obt;
@@ -357,7 +363,7 @@ void unlink_object(Scene *scene, Object *ob)
if(obt->parent==ob) {
obt->parent= NULL;
- obt->recalc |= OB_RECALC_ALL;
+ obt->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
modifiers_foreachObjectLink(obt, unlink_object__unlinkModifierLinks, ob);
@@ -367,15 +373,15 @@ void unlink_object(Scene *scene, Object *ob)
if(cu->bevobj==ob) {
cu->bevobj= NULL;
- obt->recalc |= OB_RECALC_ALL;
+ obt->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
if(cu->taperobj==ob) {
cu->taperobj= NULL;
- obt->recalc |= OB_RECALC_ALL;
+ obt->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
if(cu->textoncurve==ob) {
cu->textoncurve= NULL;
- obt->recalc |= OB_RECALC_ALL;
+ obt->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
}
else if(obt->type==OB_ARMATURE && obt->pose) {
@@ -532,12 +538,10 @@ void unlink_object(Scene *scene, Object *ob)
}
/* textures */
- tex= bmain->tex.first;
- while(tex) {
- if(tex->env) {
- if(tex->env->object == ob) tex->env->object= NULL;
- }
- tex= tex->id.next;
+ for(tex= bmain->tex.first; tex; tex= tex->id.next) {
+ if(tex->env && (ob==tex->env->object)) tex->env->object= NULL;
+ if(tex->pd && (ob==tex->pd->object)) tex->pd->object= NULL;
+ if(tex->vd && (ob==tex->vd->object)) tex->vd->object= NULL;
}
/* worlds */
@@ -695,7 +699,7 @@ int exist_object(Object *obtest)
return 0;
}
-void *add_camera(char *name)
+void *add_camera(const char *name)
{
Camera *cam;
@@ -717,7 +721,6 @@ Camera *copy_camera(Camera *cam)
Camera *camn;
camn= copy_libblock(cam);
- camn->adt= BKE_copy_animdata(cam->adt);
return camn;
}
@@ -797,7 +800,7 @@ float dof_camera(Object *ob)
return cam->YF_dofdist;
}
-void *add_lamp(char *name)
+void *add_lamp(const char *name)
{
Lamp *la;
@@ -972,7 +975,7 @@ static void *add_obdata_from_type(int type)
}
}
-static char *get_obdata_defname(int type)
+static const char *get_obdata_defname(int type)
{
switch (type) {
case OB_MESH: return "Mesh";
@@ -992,7 +995,7 @@ static char *get_obdata_defname(int type)
}
/* more general add: creates minimum required data, but without vertices etc. */
-Object *add_only_object(int type, char *name)
+Object *add_only_object(int type, const char *name)
{
Object *ob;
@@ -1010,10 +1013,13 @@ Object *add_only_object(int type, char *name)
* but rotations default to quaternions
*/
ob->rotmode= ROT_MODE_EUL;
- /* axis-angle must not have a 0,0,0 axis, so set y-axis as default... */
- ob->rotAxis[1]= ob->drotAxis[1]= 1.0f;
- /* quaternions should be 1,0,0,0 by default.... */
- ob->quat[0]= ob->dquat[0]= 1.0f;
+
+ unit_axis_angle(ob->rotAxis, &ob->rotAngle);
+ unit_axis_angle(ob->drotAxis, &ob->drotAngle);
+
+ unit_qt(ob->quat);
+ unit_qt(ob->dquat);
+
/* rotation locks should be 4D for 4 component rotations by default... */
ob->protectflag = OB_LOCK_ROT4D;
@@ -1021,7 +1027,7 @@ Object *add_only_object(int type, char *name)
unit_m4(ob->parentinv);
unit_m4(ob->obmat);
ob->dt= OB_TEXTURE;
- ob->empty_drawtype= OB_ARROWS;
+ ob->empty_drawtype= OB_PLAINAXES;
ob->empty_drawsize= 1.0;
if(type==OB_CAMERA || type==OB_LAMP) {
@@ -1082,7 +1088,7 @@ Object *add_object(struct Scene *scene, int type)
base= scene_add_base(scene, ob);
scene_select_base(scene, base);
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
return ob;
}
@@ -1267,6 +1273,17 @@ static void copy_object_pose(Object *obn, Object *ob)
}
}
+static void copy_object_transform(Object *ob_tar, Object *ob_src)
+{
+ copy_v3_v3(ob_tar->loc, ob_src->loc);
+ copy_v3_v3(ob_tar->rot, ob_src->rot);
+ copy_v3_v3(ob_tar->quat, ob_src->quat);
+ copy_v3_v3(ob_tar->rotAxis, ob_src->rotAxis);
+ ob_tar->rotAngle= ob_src->rotAngle;
+ ob_tar->rotmode= ob_src->rotmode;
+ copy_v3_v3(ob_tar->size, ob_src->size);
+}
+
Object *copy_object(Object *ob)
{
Object *obn;
@@ -1315,8 +1332,8 @@ Object *copy_object(Object *ob)
/* increase user numbers */
id_us_plus((ID *)obn->data);
+ id_us_plus((ID *)obn->gpd);
id_lib_extern((ID *)obn->dup_group);
-
for(a=0; a<obn->totcol; a++) id_us_plus((ID *)obn->mat[a]);
@@ -1468,7 +1485,7 @@ static void armature_set_id_extern(Object *ob)
{
bArmature *arm= ob->data;
bPoseChannel *pchan;
- int lay= arm->layer_protected;
+ unsigned int lay= arm->layer_protected;
for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) {
if(!(pchan->bone->layer & lay))
@@ -1531,25 +1548,25 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
ob->proxy_group= gob;
id_lib_extern(&target->id);
- ob->recalc= target->recalc= OB_RECALC_ALL;
+ ob->recalc= target->recalc= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
- /* copy transform */
+ /* copy transform
+ * - gob means this proxy comes from a group, just apply the matrix
+ * so the object wont move from its dupli-transform.
+ *
+ * - no gob means this is being made from a linked object,
+ * this is closer to making a copy of the object - in-place. */
if(gob) {
- VECCOPY(ob->loc, gob->loc);
- VECCOPY(ob->rot, gob->rot);
- VECCOPY(ob->size, gob->size);
-
- group_tag_recalc(gob->dup_group);
+ ob->rotmode= target->rotmode;
+ mul_m4_m4m4(ob->obmat, target->obmat, gob->obmat);
+ object_apply_mat4(ob, ob->obmat, FALSE, TRUE);
}
else {
- VECCOPY(ob->loc, target->loc);
- VECCOPY(ob->rot, target->rot);
- VECCOPY(ob->size, target->size);
+ copy_object_transform(ob, target);
+ ob->parent= target->parent; /* libdata */
+ copy_m4_m4(ob->parentinv, target->parentinv);
}
- ob->parent= target->parent; /* libdata */
- copy_m4_m4(ob->parentinv, target->parentinv);
-
/* copy animdata stuff - drivers only for now... */
object_copy_proxy_drivers(ob, target);
@@ -1590,7 +1607,17 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
armature_set_id_extern(ob);
}
-
+
+ /* copy IDProperties */
+ if(ob->id.properties) {
+ IDP_FreeProperty(ob->id.properties);
+ MEM_freeN(ob->id.properties);
+ ob->id.properties= NULL;
+ }
+ if(target->id.properties) {
+ ob->id.properties= IDP_CopyProperty(target->id.properties);
+ }
+
/* copy drawtype info */
ob->dt= target->dt;
}
@@ -1609,7 +1636,7 @@ void disable_speed_curve(int val)
// XXX THIS CRUFT NEEDS SERIOUS RECODING ASAP!
/* ob can be NULL */
-float bsystem_time(struct Scene *scene, Object *ob, float cfra, float ofs)
+float bsystem_time(struct Scene *scene, Object *UNUSED(ob), float cfra, float ofs)
{
/* returns float ( see BKE_curframe in scene.c) */
cfra += scene->r.subframe;
@@ -1638,7 +1665,7 @@ void object_scale_to_mat3(Object *ob, float mat[][3])
size_to_mat3( mat,vec);
}
-// TODO: this should take rotation orders into account later...
+
void object_rot_to_mat3(Object *ob, float mat[][3])
{
float rmat[3][3], dmat[3][3];
@@ -1661,59 +1688,67 @@ void object_rot_to_mat3(Object *ob, float mat[][3])
}
else {
/* quats are normalised before use to eliminate scaling issues */
- normalize_qt(ob->quat);
- quat_to_mat3( rmat,ob->quat);
- quat_to_mat3( dmat,ob->dquat);
+ float tquat[4];
+
+ normalize_qt_qt(tquat, ob->quat);
+ quat_to_mat3(rmat, tquat);
+
+ normalize_qt_qt(tquat, ob->dquat);
+ quat_to_mat3(dmat, tquat);
}
/* combine these rotations */
- // XXX is this correct? if errors, change the order of multiplication...
mul_m3_m3m3(mat, dmat, rmat);
}
-void object_mat3_to_rot(Object *ob, float mat[][3], int use_compat)
+void object_mat3_to_rot(Object *ob, float mat[][3], short use_compat)
{
- if (ob->rotmode == ROT_MODE_QUAT)
- mat3_to_quat(ob->quat, mat);
- else if (ob->rotmode == ROT_MODE_AXISANGLE)
- mat3_to_axis_angle(ob->rotAxis, &ob->rotAngle, mat);
- else {
- if(use_compat) {
- float eul[3];
- VECCOPY(eul, ob->rot);
- mat3_to_compatible_eulO(ob->rot, eul, ob->rotmode, mat);
+ switch(ob->rotmode) {
+ case ROT_MODE_QUAT:
+ {
+ float dquat[4];
+ mat3_to_quat(ob->quat, mat);
+ normalize_qt_qt(dquat, ob->dquat);
+ invert_qt(dquat);
+ mul_qt_qtqt(ob->quat, dquat, ob->quat);
}
- else
- mat3_to_eulO(ob->rot, ob->rotmode, mat);
+ break;
+ case ROT_MODE_AXISANGLE:
+ mat3_to_axis_angle(ob->rotAxis, &ob->rotAngle, mat);
+ sub_v3_v3(ob->rotAxis, ob->drotAxis);
+ ob->rotAngle -= ob->drotAngle;
+ break;
+ default: /* euler */
+ if(use_compat) mat3_to_compatible_eulO(ob->rot, ob->rot, ob->rotmode, mat);
+ else mat3_to_eulO(ob->rot, ob->rotmode, mat);
+ sub_v3_v3(ob->rot, ob->drot);
}
}
/* see pchan_apply_mat4() for the equivalent 'pchan' function */
-void object_apply_mat4(Object *ob, float mat[][4])
+void object_apply_mat4(Object *ob, float mat[][4], const short use_compat, const short use_parent)
{
- float mat3[3][3], tmat[3][3], imat[3][3];
+ float rot[3][3];
- /* location */
- copy_v3_v3(ob->loc, mat[3]);
-
- /* rotation */
- copy_m3_m4(mat3, mat);
- object_mat3_to_rot(ob, mat3, 0);
+ if(use_parent && ob->parent) {
+ float rmat[4][4], diff_mat[4][4], imat[4][4];
+ mul_m4_m4m4(diff_mat, ob->parentinv, ob->parent->obmat);
+ invert_m4_m4(imat, diff_mat);
+ mul_m4_m4m4(rmat, mat, imat); /* get the parent relative matrix */
+ object_apply_mat4(ob, rmat, use_compat, FALSE);
+
+ /* same as below, use rmat rather then mat */
+ mat4_to_loc_rot_size(ob->loc, rot, ob->size, rmat);
+ object_mat3_to_rot(ob, rot, use_compat);
+ }
+ else {
+ mat4_to_loc_rot_size(ob->loc, rot, ob->size, mat);
+ object_mat3_to_rot(ob, rot, use_compat);
+ }
- /* scale */
-#if 0
- /* works fine except for neg scales */
- mat4_to_size(ob->size, mat);
-#else
- /* this is more complicated but works for negative scales */
- object_rot_to_mat3(ob, tmat);
- invert_m3_m3(imat, tmat);
- mul_m3_m3m3(tmat, imat, mat3);
-
- ob->size[0]= tmat[0][0];
- ob->size[1]= tmat[1][1];
- ob->size[2]= tmat[2][2];
-#endif
+ sub_v3_v3(ob->loc, ob->dloc);
+ sub_v3_v3(ob->size, ob->dsize);
+ /* object_mat3_to_rot handles delta rotations */
}
void object_to_mat3(Object *ob, float mat[][3]) /* no parent */
@@ -1746,7 +1781,7 @@ int enable_cu_speed= 1;
static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
{
Curve *cu;
- float q[4], vec[4], dir[3], quat[4], radius, x1, ctime;
+ float vec[4], dir[3], quat[4], radius, ctime;
float timeoffs = 0.0, sf_orig = 0.0;
unit_m4(mat);
@@ -1794,9 +1829,11 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
/* vec: 4 items! */
- if( where_on_path(par, ctime, vec, dir, NULL, &radius, NULL) ) {
+ if( where_on_path(par, ctime, vec, dir, cu->flag & CU_FOLLOW ? quat:NULL, &radius, NULL) ) {
if(cu->flag & CU_FOLLOW) {
+#if 0
+ float x1, q[4];
vec_to_quat( quat,dir, ob->trackflag, ob->upflag);
/* the tilt */
@@ -1807,8 +1844,11 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
q[2]= -x1*dir[1];
q[3]= -x1*dir[2];
mul_qt_qtqt(quat, q, quat);
-
- quat_to_mat4( mat,quat);
+#else
+ quat_apply_track(quat, ob->trackflag, ob->upflag);
+#endif
+ normalize_qt(quat);
+ quat_to_mat4(mat, quat);
}
if(cu->flag & CU_PATH_RADIUS) {
@@ -2052,7 +2092,7 @@ void where_is_object_time(Scene *scene, Object *ob, float ctime)
}
/* solve constraints */
- if (ob->constraints.first && !(ob->flag & OB_NO_CONSTRAINTS)) {
+ if (ob->constraints.first && !(ob->transflag & OB_NO_CONSTRAINTS)) {
bConstraintOb *cob;
cob= constraints_make_evalob(scene, ob, NULL, CONSTRAINT_OBTYPE_OBJECT);
@@ -2137,7 +2177,7 @@ static void solve_parenting (Scene *scene, Object *ob, Object *par, float obmat[
copy_m3_m4(originmat, tmat);
// origin, voor help line
- if( (ob->partype & 15)==PARSKEL ) {
+ if( (ob->partype & PARTYPE)==PARSKEL ) {
VECCOPY(ob->orig, par->obmat[3]);
}
else {
@@ -2523,48 +2563,64 @@ void object_handle_update(Scene *scene, Object *ob)
if (G.f & G_DEBUG)
printf("recalcdata %s\n", ob->id.name+2);
-
- /* includes all keys and modifiers */
- if(ob->type==OB_MESH) {
- EditMesh *em = (ob == scene->obedit)? BKE_mesh_get_editmesh(ob->data): NULL;
-
- /* evaluate drivers */
- // XXX: should we push this to derivedmesh instead?
- BKE_animsys_evaluate_animdata(data_id, adt, ctime, ADT_RECALC_DRIVERS);
-
- // here was vieweditdatamask? XXX
- if(em) {
- makeDerivedMesh(scene, ob, em, CD_MASK_BAREMESH);
- BKE_mesh_end_editmesh(ob->data, em);
- } else
- makeDerivedMesh(scene, ob, NULL, CD_MASK_BAREMESH);
- }
- else if(ob->type==OB_MBALL) {
- makeDispListMBall(scene, ob);
- }
- else if(ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
- makeDispListCurveTypes(scene, ob, 0);
- }
- else if(ELEM(ob->type, OB_CAMERA, OB_LAMP)) {
+
+ if(adt) {
/* evaluate drivers */
+ // XXX: for mesh types, should we push this to derivedmesh instead?
BKE_animsys_evaluate_animdata(data_id, adt, ctime, ADT_RECALC_DRIVERS);
}
- else if(ob->type==OB_LATTICE) {
- lattice_calc_modifiers(scene, ob);
- }
- else if(ob->type==OB_ARMATURE) {
- /* evaluate drivers */
- BKE_animsys_evaluate_animdata(data_id, adt, ctime, ADT_RECALC_DRIVERS);
-
+
+ /* includes all keys and modifiers */
+ switch(ob->type) {
+ case OB_MESH:
+ {
+#if 0 // XXX, comment for 2.56a release, background wont set 'scene->customdata_mask'
+ EditMesh *em = (ob == scene->obedit)? BKE_mesh_get_editmesh(ob->data): NULL;
+ BLI_assert((scene->customdata_mask & CD_MASK_BAREMESH) == CD_MASK_BAREMESH);
+ if(em) {
+ makeDerivedMesh(scene, ob, em, scene->customdata_mask); /* was CD_MASK_BAREMESH */
+ BKE_mesh_end_editmesh(ob->data, em);
+ } else
+ makeDerivedMesh(scene, ob, NULL, scene->customdata_mask);
+
+#else /* ensure CD_MASK_BAREMESH for now */
+ EditMesh *em = (ob == scene->obedit)? BKE_mesh_get_editmesh(ob->data): NULL;
+ if(em) {
+ makeDerivedMesh(scene, ob, em, scene->customdata_mask | CD_MASK_BAREMESH); /* was CD_MASK_BAREMESH */
+ BKE_mesh_end_editmesh(ob->data, em);
+ } else
+ makeDerivedMesh(scene, ob, NULL, scene->customdata_mask | CD_MASK_BAREMESH);
+#endif
+
+ }
+ break;
+
+ case OB_ARMATURE:
if(ob->id.lib && ob->proxy_from) {
- copy_pose_result(ob->pose, ob->proxy_from->pose);
// printf("pose proxy copy, lib ob %s proxy %s\n", ob->id.name, ob->proxy_from->id.name);
+ copy_pose_result(ob->pose, ob->proxy_from->pose);
}
else {
where_is_pose(scene, ob);
}
+ break;
+
+ case OB_MBALL:
+ makeDispListMBall(scene, ob);
+ break;
+
+ case OB_CURVE:
+ case OB_SURF:
+ case OB_FONT:
+ makeDispListCurveTypes(scene, ob, 0);
+ break;
+
+ case OB_LATTICE:
+ lattice_calc_modifiers(scene, ob);
+ break;
}
+
if(ob->particlesystem.first) {
ParticleSystem *tpsys, *psys;
DerivedMesh *dm;
@@ -2888,7 +2944,7 @@ void object_delete_ptcache(Object *ob, int index)
/* shape key utility function */
/************************* Mesh ************************/
-static KeyBlock *insert_meshkey(Scene *scene, Object *ob, char *name, int from_mix)
+static KeyBlock *insert_meshkey(Scene *scene, Object *ob, const char *name, int from_mix)
{
Mesh *me= ob->data;
Key *key= me->key;
@@ -2919,7 +2975,7 @@ static KeyBlock *insert_meshkey(Scene *scene, Object *ob, char *name, int from_m
return kb;
}
/************************* Lattice ************************/
-static KeyBlock *insert_lattkey(Scene *scene, Object *ob, char *name, int from_mix)
+static KeyBlock *insert_lattkey(Scene *scene, Object *ob, const char *name, int from_mix)
{
Lattice *lt= ob->data;
Key *key= lt->key;
@@ -2951,7 +3007,7 @@ static KeyBlock *insert_lattkey(Scene *scene, Object *ob, char *name, int from_m
return kb;
}
/************************* Curve ************************/
-static KeyBlock *insert_curvekey(Scene *scene, Object *ob, char *name, int from_mix)
+static KeyBlock *insert_curvekey(Scene *scene, Object *ob, const char *name, int from_mix)
{
Curve *cu= ob->data;
Key *key= cu->key;
@@ -2987,7 +3043,7 @@ static KeyBlock *insert_curvekey(Scene *scene, Object *ob, char *name, int from_
return kb;
}
-KeyBlock *object_insert_shape_key(Scene *scene, Object *ob, char *name, int from_mix)
+KeyBlock *object_insert_shape_key(Scene *scene, Object *ob, const char *name, int from_mix)
{
if(ob->type==OB_MESH) return insert_meshkey(scene, ob, name, from_mix);
else if ELEM(ob->type, OB_CURVE, OB_SURF)return insert_curvekey(scene, ob, name, from_mix);
diff --git a/source/blender/blenkernel/intern/packedFile.c b/source/blender/blenkernel/intern/packedFile.c
index 919a724d1ec..12ebaf7578a 100644
--- a/source/blender/blenkernel/intern/packedFile.c
+++ b/source/blender/blenkernel/intern/packedFile.c
@@ -47,6 +47,7 @@
#include "DNA_packedFile_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_utildefines.h"
#include "BKE_global.h"
@@ -162,7 +163,7 @@ PackedFile *newPackedFileMemory(void *mem, int memlen)
return pf;
}
-PackedFile *newPackedFile(ReportList *reports, char *filename)
+PackedFile *newPackedFile(ReportList *reports, const char *filename)
{
PackedFile *pf = NULL;
int file, filelen;
@@ -179,7 +180,7 @@ PackedFile *newPackedFile(ReportList *reports, char *filename)
// convert relative filenames to absolute filenames
strcpy(name, filename);
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, G.main->name);
// open the file
// and create a PackedFile structure
@@ -214,13 +215,20 @@ void packAll(Main *bmain, ReportList *reports)
Image *ima;
VFont *vf;
bSound *sound;
-
- for(ima=bmain->image.first; ima; ima=ima->id.next)
- if(ima->packedfile == NULL && ima->id.lib==NULL && ELEM3(ima->source, IMA_SRC_FILE, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE))
- ima->packedfile = newPackedFile(reports, ima->name);
+
+ for(ima=bmain->image.first; ima; ima=ima->id.next) {
+ if(ima->packedfile == NULL && ima->id.lib==NULL) {
+ if(ima->source==IMA_SRC_FILE) {
+ ima->packedfile = newPackedFile(reports, ima->name);
+ }
+ else if(ELEM(ima->source, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE)) {
+ BKE_reportf(reports, RPT_WARNING, "Image '%s' skipped, movies and image sequences not supported.", ima->id.name+2);
+ }
+ }
+ }
for(vf=bmain->vfont.first; vf; vf=vf->id.next)
- if(vf->packedfile == NULL && vf->id.lib==NULL && strcmp(vf->name, "<builtin>") != 0)
+ if(vf->packedfile == NULL && vf->id.lib==NULL && strcmp(vf->name, FO_BUILTIN_NAME) != 0)
vf->packedfile = newPackedFile(reports, vf->name);
for(sound=bmain->sound.first; sound; sound=sound->id.next)
@@ -256,7 +264,7 @@ static char *find_new_name(char *name)
*/
-int writePackedFile(ReportList *reports, char *filename, PackedFile *pf, int guimode)
+int writePackedFile(ReportList *reports, const char *filename, PackedFile *pf, int guimode)
{
int file, number, remove_tmp = FALSE;
int ret_value = RET_OK;
@@ -267,7 +275,7 @@ int writePackedFile(ReportList *reports, char *filename, PackedFile *pf, int gui
if (guimode) {} //XXX waitcursor(1);
strcpy(name, filename);
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, G.main->name);
if (BLI_exists(name)) {
for (number = 1; number <= 999; number++) {
@@ -324,7 +332,7 @@ PF_NOFILE - the original file doens't exist
*/
-int checkPackedFile(char *filename, PackedFile *pf)
+int checkPackedFile(const char *filename, PackedFile *pf)
{
struct stat st;
int ret_val, i, len, file;
@@ -332,7 +340,7 @@ int checkPackedFile(char *filename, PackedFile *pf)
char name[FILE_MAXDIR + FILE_MAXFILE];
strcpy(name, filename);
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, G.main->name);
if (stat(name, &st)) {
ret_val = PF_NOFILE;
@@ -460,7 +468,7 @@ int unpackVFont(ReportList *reports, VFont *vfont, int how)
return (ret_value);
}
-int unpackSound(ReportList *reports, bSound *sound, int how)
+int unpackSound(Main *bmain, ReportList *reports, bSound *sound, int how)
{
char localname[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX];
char *newname;
@@ -479,7 +487,7 @@ int unpackSound(ReportList *reports, bSound *sound, int how)
freePackedFile(sound->packedfile);
sound->packedfile = 0;
- sound_load(NULL, sound);
+ sound_load(bmain, sound);
ret_value = RET_OK;
}
@@ -529,6 +537,6 @@ void unpackAll(Main *bmain, ReportList *reports, int how)
for(sound=bmain->sound.first; sound; sound=sound->id.next)
if(sound->packedfile)
- unpackSound(reports, sound, how);
+ unpackSound(bmain, reports, sound, how);
}
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index ffb99c10c40..853338d0722 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -31,6 +31,9 @@
#include "DNA_scene_types.h"
#include "DNA_brush_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_brush.h"
#include "BKE_library.h"
#include "BKE_paint.h"
@@ -100,7 +103,7 @@ void paint_init(Paint *p, const char col[3])
p->flags |= PAINT_SHOW_BRUSH;
}
-void free_paint(Paint *paint)
+void free_paint(Paint *UNUSED(paint))
{
/* nothing */
}
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 6b75f5d417c..5f45e06cfc4 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -46,10 +46,11 @@
#include "DNA_scene_types.h"
#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_kdtree.h"
#include "BLI_rand.h"
#include "BLI_threads.h"
-#include "BLI_math.h"
#include "BKE_anim.h"
#include "BKE_animsys.h"
@@ -61,7 +62,7 @@
#include "BKE_group.h"
#include "BKE_main.h"
#include "BKE_lattice.h"
-#include "BKE_utildefines.h"
+
#include "BKE_displist.h"
#include "BKE_particle.h"
#include "BKE_object.h"
@@ -196,7 +197,7 @@ void psys_set_current_num(Object *ob, int index)
}
Object *psys_find_object(Scene *scene, ParticleSystem *psys)
{
- Base *base = scene->base.first;
+ Base *base;
ParticleSystem *tpsys;
for(base = scene->base.first; base; base = base->next) {
@@ -272,7 +273,7 @@ int psys_check_enabled(Object *ob, ParticleSystem *psys)
}
psmd= psys_get_modifier(ob, psys);
- if(psys->renderdata) {
+ if(psys->renderdata || G.rendering) {
if(!(psmd->modifier.mode & eModifierMode_Render))
return 0;
}
@@ -380,7 +381,7 @@ void psys_free_settings(ParticleSettings *part)
fluid_free_settings(part->fluid);
}
-void free_hair(Object *ob, ParticleSystem *psys, int dynamics)
+void free_hair(Object *UNUSED(ob), ParticleSystem *psys, int dynamics)
{
PARTICLE_P;
@@ -402,9 +403,10 @@ void free_hair(Object *ob, ParticleSystem *psys, int dynamics)
modifier_free((ModifierData*)psys->clmd);
psys->clmd = NULL;
+ psys->pointcache = BKE_ptcache_add(&psys->ptcaches);
}
else {
- cloth_free_modifier(ob, psys->clmd);
+ cloth_free_modifier(psys->clmd);
}
}
@@ -559,6 +561,9 @@ void psys_free(Object *ob, ParticleSystem * psys)
BLI_freelistN(&psys->targets);
BLI_kdtree_free(psys->tree);
+
+ if(psys->fluid_springs)
+ MEM_freeN(psys->fluid_springs);
pdEndEffectors(&psys->effectors);
@@ -996,6 +1001,8 @@ static float interpolate_particle_value(float v1, float v2, float v3, float v4,
value= w[0]*v1 + w[1]*v2 + w[2]*v3;
if(four)
value += w[3]*v4;
+
+ CLAMP(value, 0.f, 1.f);
return value;
}
@@ -1051,9 +1058,10 @@ typedef struct ParticleInterpolationData {
} ParticleInterpolationData;
/* Assumes pointcache->mem_cache exists, so for disk cached particles call psys_make_temp_pointcache() before use */
/* It uses ParticleInterpolationData->pm to store the current memory cache frame so it's thread safe. */
-static void get_pointcache_keys_for_time(Object *ob, PointCache *cache, PTCacheMem **cur, int index, float t, ParticleKey *key1, ParticleKey *key2)
+static void get_pointcache_keys_for_time(Object *UNUSED(ob), PointCache *cache, PTCacheMem **cur, int index, float t, ParticleKey *key1, ParticleKey *key2)
{
static PTCacheMem *pm = NULL;
+ int index1, index2;
if(index < 0) { /* initialize */
*cur = cache->mem_cache.first;
@@ -1068,15 +1076,19 @@ static void get_pointcache_keys_for_time(Object *ob, PointCache *cache, PTCacheM
pm = *cur;
- BKE_ptcache_make_particle_key(key2, pm->index_array ? pm->index_array[index] - 1 : index, pm->data, (float)pm->frame);
- if(pm->prev->index_array && pm->prev->index_array[index] == 0)
+ index2 = BKE_ptcache_mem_index_find(pm, index);
+ index1 = BKE_ptcache_mem_index_find(pm->prev, index);
+
+ BKE_ptcache_make_particle_key(key2, index2, pm->data, (float)pm->frame);
+ if(index1 < 0)
copy_particle_key(key1, key2, 1);
else
- BKE_ptcache_make_particle_key(key1, pm->prev->index_array ? pm->prev->index_array[index] - 1 : index, pm->prev->data, (float)pm->prev->frame);
+ BKE_ptcache_make_particle_key(key1, index1, pm->prev->data, (float)pm->prev->frame);
}
else if(cache->mem_cache.first) {
pm = cache->mem_cache.first;
- BKE_ptcache_make_particle_key(key2, pm->index_array ? pm->index_array[index] - 1 : index, pm->data, (float)pm->frame);
+ index2 = BKE_ptcache_mem_index_find(pm, index);
+ BKE_ptcache_make_particle_key(key2, index2, pm->data, (float)pm->frame);
copy_particle_key(key1, key2, 1);
}
}
@@ -1087,14 +1099,7 @@ static int get_pointcache_times_for_particle(PointCache *cache, int index, float
int ret = 0;
for(pm=cache->mem_cache.first; pm; pm=pm->next) {
- if(pm->index_array) {
- if(pm->index_array[index]) {
- *start = pm->frame;
- ret++;
- break;
- }
- }
- else {
+ if(BKE_ptcache_mem_index_find(pm, index) >= 0) {
*start = pm->frame;
ret++;
break;
@@ -1102,14 +1107,7 @@ static int get_pointcache_times_for_particle(PointCache *cache, int index, float
}
for(pm=cache->mem_cache.last; pm; pm=pm->prev) {
- if(pm->index_array) {
- if(pm->index_array[index]) {
- *end = pm->frame;
- ret++;
- break;
- }
- }
- else {
+ if(BKE_ptcache_mem_index_find(pm, index) >= 0) {
*end = pm->frame;
ret++;
break;
@@ -1124,13 +1122,8 @@ float psys_get_dietime_from_cache(PointCache *cache, int index) {
int dietime = 10000000; /* some max value so that we can default to pa->time+lifetime */
for(pm=cache->mem_cache.last; pm; pm=pm->prev) {
- if(pm->index_array) {
- if(pm->index_array[index])
- return (float)pm->frame;
- }
- else {
+ if(BKE_ptcache_mem_index_find(pm, index) >= 0)
return (float)pm->frame;
- }
}
return (float)dietime;
@@ -1157,7 +1150,7 @@ static void init_particle_interpolation(Object *ob, ParticleSystem *psys, Partic
pind->dietime = (key + pa->totkey - 1)->time;
}
else if(pind->cache) {
- float start, end;
+ float start=0.0f, end=0.0f;
get_pointcache_keys_for_time(ob, pind->cache, &pind->pm, -1, 0.0f, NULL, NULL);
pind->birthtime = pa ? pa->time : pind->cache->startframe;
pind->dietime = pa ? pa->dietime : pind->cache->endframe;
@@ -1201,12 +1194,12 @@ static void mvert_to_particle(ParticleKey *key, MVert *mvert, HairKey *hkey)
key->time = hkey->time;
}
-static void do_particle_interpolation(ParticleSystem *psys, int p, ParticleData *pa, float t, float frs_sec, ParticleInterpolationData *pind, ParticleKey *result)
+static void do_particle_interpolation(ParticleSystem *psys, int p, ParticleData *pa, float t, ParticleInterpolationData *pind, ParticleKey *result)
{
PTCacheEditPoint *point = pind->epoint;
ParticleKey keys[4];
int point_vel = (point && point->keys->vel);
- float real_t, dfra, keytime;
+ float real_t, dfra, keytime, invdt;
/* billboards wont fill in all of these, so start cleared */
memset(keys, 0, sizeof(keys));
@@ -1345,11 +1338,12 @@ static void do_particle_interpolation(ParticleSystem *psys, int p, ParticleData
dfra = keys[2].time - keys[1].time;
keytime = (real_t - keys[1].time) / dfra;
+ invdt = dfra * 0.04f * psys->part->timetweak;
/* convert velocity to timestep size */
if(pind->keyed || pind->cache || point_vel){
- mul_v3_fl(keys[1].vel, dfra / frs_sec);
- mul_v3_fl(keys[2].vel, dfra / frs_sec);
+ mul_v3_fl(keys[1].vel, invdt);
+ mul_v3_fl(keys[2].vel, invdt);
interp_qt_qtqt(result->rot,keys[1].rot,keys[2].rot,keytime);
}
@@ -1360,7 +1354,7 @@ static void do_particle_interpolation(ParticleSystem *psys, int p, ParticleData
/* the velocity needs to be converted back from cubic interpolation */
if(pind->keyed || pind->cache || point_vel)
- mul_v3_fl(result->vel, frs_sec / dfra);
+ mul_v3_fl(result->vel, 1.f/invdt);
}
/************************************************/
/* Particles on a dm */
@@ -1476,7 +1470,7 @@ void psys_interpolate_face(MVert *mvert, MFace *mface, MTFace *tface, float (*or
}
else {
VECCOPY(orco, vec);
- if(ornor)
+ if(ornor && nor)
VECCOPY(ornor, nor);
}
}
@@ -1646,7 +1640,7 @@ int psys_particle_dm_face_lookup(Object *ob, DerivedMesh *dm, int index, float *
return DMCACHE_NOTFOUND;
}
-static int psys_map_index_on_dm(DerivedMesh *dm, int from, int index, int index_dmcache, float *fw, float foffset, int *mapindex, float *mapfw)
+static int psys_map_index_on_dm(DerivedMesh *dm, int from, int index, int index_dmcache, float *fw, float UNUSED(foffset), int *mapindex, float *mapfw)
{
if(index < 0)
return 0;
@@ -1802,7 +1796,7 @@ ParticleSystemModifierData *psys_get_modifier(Object *ob, ParticleSystem *psys)
/* Particles on a shape */
/************************************************/
/* ready for future use */
-static void psys_particle_on_shape(int distr, int index, float *fuv, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor)
+static void psys_particle_on_shape(int UNUSED(distr), int UNUSED(index), float *UNUSED(fuv), float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor)
{
/* TODO */
float zerovec[3]={0.0f,0.0f,0.0f};
@@ -1861,144 +1855,186 @@ static float vert_weight(MDeformVert *dvert, int group)
return 0.0;
}
-static void do_prekink(ParticleKey *state, ParticleKey *par, float *par_rot, float time, float freq, float shape, float amplitude, short type, short axis, float obmat[][4])
+static void do_kink(ParticleKey *state, ParticleKey *par, float *par_rot, float time, float freq, float shape, float amplitude, float flat, short type, short axis, float obmat[][4], int smooth_start)
{
- float vec[3]={0.0,0.0,0.0}, q1[4]={1,0,0,0},q2[4];
- float t;
+ float kink[3]={1.f,0.f,0.f}, par_vec[3], q1[4]={1.f,0.f,0.f,0.f};
+ float t, dt=1.f, result[3];
+
+ if(par == NULL || type == PART_KINK_NO)
+ return;
- CLAMP(time,0.0,1.0);
+ CLAMP(time, 0.f, 1.f);
if(shape!=0.0f && type!=PART_KINK_BRAID) {
if(shape<0.0f)
- time= (float)pow(time, 1.0+shape);
+ time= (float)pow(time, 1.f+shape);
else
- time= (float)pow(time, 1.0/(1.0-shape));
+ time= (float)pow(time, 1.f/(1.f-shape));
}
- t=time;
+ t = time * freq *(float)M_PI;
+
+ if(smooth_start) {
+ dt = fabs(t);
+ /* smooth the beginning of kink */
+ CLAMP(dt, 0.f, (float)M_PI);
+ dt = sin(dt/2.f);
+ }
+
+ if(type != PART_KINK_RADIAL) {
+ float temp[3];
- t*=(float)M_PI*freq;
+ kink[axis]=1.f;
- if(par==0) return;
+ if(obmat)
+ mul_mat3_m4_v3(obmat, kink);
+
+ if(par_rot)
+ mul_qt_v3(par_rot, kink);
- switch(type){
- case PART_KINK_CURL:
- vec[axis]=1.0;
- if(par_rot)
- QUATCOPY(q2,par_rot)
- else
- vec_to_quat( q2,par->vel,axis,(axis+1)%3);
- mul_qt_v3(q2,vec);
- mul_v3_fl(vec,amplitude);
- VECADD(state->co,state->co,vec);
+ /* make sure kink is normal to strand */
+ project_v3_v3v3(temp, kink, par->vel);
+ sub_v3_v3(kink, temp);
+ normalize_v3(kink);
+ }
- VECSUB(vec,state->co,par->co);
+ copy_v3_v3(result, state->co);
+ sub_v3_v3v3(par_vec, par->co, state->co);
- if(t!=0.0)
- axis_angle_to_quat(q1,par->vel,t);
-
- mul_qt_v3(q1,vec);
-
- VECADD(state->co,par->co,vec);
- break;
- case PART_KINK_RADIAL:
- VECSUB(vec,state->co,par->co);
+ switch(type) {
+ case PART_KINK_CURL:
+ {
+ mul_v3_fl(par_vec, -1.f);
- normalize_v3(vec);
- mul_v3_fl(vec,amplitude*(float)sin(t));
+ if(flat > 0.f) {
+ float proj[3];
+ project_v3_v3v3(proj, par_vec, par->vel);
+ madd_v3_v3fl(par_vec, proj, -flat);
- VECADD(state->co,state->co,vec);
- break;
- case PART_KINK_WAVE:
- vec[axis]=1.0;
- if(obmat)
- mul_mat3_m4_v3(obmat,vec);
+ project_v3_v3v3(proj, par_vec, kink);
+ madd_v3_v3fl(par_vec, proj, -flat);
+ }
- if(par_rot)
- mul_qt_v3(par_rot,vec);
+ axis_angle_to_quat(q1, kink, (float)M_PI/2.f);
- project_v3_v3v3(q1,vec,par->vel);
-
- VECSUB(vec,vec,q1);
- normalize_v3(vec);
+ mul_qt_v3(q1, par_vec);
- mul_v3_fl(vec,amplitude*(float)sin(t));
+ madd_v3_v3fl(par_vec, kink, amplitude);
- VECADD(state->co,state->co,vec);
- break;
- case PART_KINK_BRAID:
- if(par){
- float y_vec[3]={0.0,1.0,0.0};
- float z_vec[3]={0.0,0.0,1.0};
- float vec_from_par[3], vec_one[3], radius, state_co[3];
- float inp_y,inp_z,length;
-
- if(par_rot)
- QUATCOPY(q2,par_rot)
- else
- vec_to_quat(q2,par->vel,axis,(axis+1)%3);
- mul_qt_v3(q2,y_vec);
- mul_qt_v3(q2,z_vec);
-
- VECSUB(vec_from_par,state->co,par->co);
- radius= normalize_v3_v3(vec_one, vec_from_par);
+ /* rotate kink vector around strand tangent */
+ if(t!=0.f) {
+ axis_angle_to_quat(q1, par->vel, t);
+ mul_qt_v3(q1, par_vec);
+ }
- inp_y=dot_v3v3(y_vec,vec_one);
- inp_z=dot_v3v3(z_vec,vec_one);
+ add_v3_v3v3(result, par->co, par_vec);
+ break;
+ }
+ case PART_KINK_RADIAL:
+ {
+ if(flat > 0.f) {
+ float proj[3];
+ /* flatten along strand */
+ project_v3_v3v3(proj, par_vec, par->vel);
+ madd_v3_v3fl(result, proj, flat);
+ }
- if(inp_y>0.5){
- VECCOPY(state_co,y_vec);
+ madd_v3_v3fl(result, par_vec, -amplitude*(float)sin(t));
+ break;
+ }
+ case PART_KINK_WAVE:
+ {
+ madd_v3_v3fl(result, kink, amplitude*(float)sin(t));
- mul_v3_fl(y_vec,amplitude*(float)cos(t));
- mul_v3_fl(z_vec,amplitude/2.0f*(float)sin(2.0f*t));
- }
- else if(inp_z>0.0){
- VECCOPY(state_co,z_vec);
- mul_v3_fl(state_co,(float)sin(M_PI/3.0f));
- VECADDFAC(state_co,state_co,y_vec,-0.5f);
+ if(flat > 0.f) {
+ float proj[3];
+ /* flatten along wave */
+ project_v3_v3v3(proj, par_vec, kink);
+ madd_v3_v3fl(result, proj, flat);
- mul_v3_fl(y_vec,-amplitude*(float)cos(t + M_PI/3.0f));
- mul_v3_fl(z_vec,amplitude/2.0f*(float)cos(2.0f*t + M_PI/6.0f));
- }
- else{
- VECCOPY(state_co,z_vec);
- mul_v3_fl(state_co,-(float)sin(M_PI/3.0f));
- VECADDFAC(state_co,state_co,y_vec,-0.5f);
+ /* flatten along strand */
+ project_v3_v3v3(proj, par_vec, par->vel);
+ madd_v3_v3fl(result, proj, flat);
+ }
+ break;
+ }
+ case PART_KINK_BRAID:
+ {
+ float y_vec[3]={0.f,1.f,0.f};
+ float z_vec[3]={0.f,0.f,1.f};
+ float vec_one[3], state_co[3];
+ float inp_y, inp_z, length;
+
+ if(par_rot) {
+ mul_qt_v3(par_rot, y_vec);
+ mul_qt_v3(par_rot, z_vec);
+ }
+
+ mul_v3_fl(par_vec, -1.f);
+ normalize_v3_v3(vec_one, par_vec);
- mul_v3_fl(y_vec,amplitude*(float)-sin(t+M_PI/6.0f));
- mul_v3_fl(z_vec,amplitude/2.0f*(float)-sin(2.0f*t+M_PI/3.0f));
- }
+ inp_y=dot_v3v3(y_vec, vec_one);
+ inp_z=dot_v3v3(z_vec, vec_one);
- mul_v3_fl(state_co,amplitude);
- VECADD(state_co,state_co,par->co);
- VECSUB(vec_from_par,state->co,state_co);
+ if(inp_y>0.5){
+ copy_v3_v3(state_co, y_vec);
- length=normalize_v3(vec_from_par);
- mul_v3_fl(vec_from_par,MIN2(length,amplitude/2.0f));
+ mul_v3_fl(y_vec, amplitude*(float)cos(t));
+ mul_v3_fl(z_vec, amplitude/2.f*(float)sin(2.f*t));
+ }
+ else if(inp_z>0.0){
+ mul_v3_v3fl(state_co, z_vec, (float)sin(M_PI/3.f));
+ VECADDFAC(state_co,state_co,y_vec,-0.5f);
- VECADD(state_co,par->co,y_vec);
- VECADD(state_co,state_co,z_vec);
- VECADD(state_co,state_co,vec_from_par);
+ mul_v3_fl(y_vec, -amplitude * (float)cos(t + M_PI/3.f));
+ mul_v3_fl(z_vec, amplitude/2.f * (float)cos(2.f*t + M_PI/6.f));
+ }
+ else{
+ mul_v3_v3fl(state_co, z_vec, -(float)sin(M_PI/3.f));
+ madd_v3_v3fl(state_co, y_vec, -0.5f);
- shape=(2.0f*(float)M_PI)*(1.0f+shape);
+ mul_v3_fl(y_vec, amplitude * (float)-sin(t + M_PI/6.f));
+ mul_v3_fl(z_vec, amplitude/2.f * (float)-sin(2.f*t + M_PI/3.f));
+ }
- if(t<shape){
- shape=t/shape;
- shape=(float)sqrt((double)shape);
- interp_v3_v3v3(state->co,state->co,state_co,shape);
- }
- else{
- VECCOPY(state->co,state_co);
- }
- }
- break;
+ mul_v3_fl(state_co, amplitude);
+ add_v3_v3(state_co, par->co);
+ sub_v3_v3v3(par_vec, state->co, state_co);
+
+ length = normalize_v3(par_vec);
+ mul_v3_fl(par_vec, MIN2(length, amplitude/2.f));
+
+ add_v3_v3v3(state_co, par->co, y_vec);
+ add_v3_v3(state_co, z_vec);
+ add_v3_v3(state_co, par_vec);
+
+ shape = 2.f*(float)M_PI * (1.f+shape);
+
+ if(t<shape){
+ shape = t/shape;
+ shape = (float)sqrt((double)shape);
+ interp_v3_v3v3(result, result, state_co, shape);
+ }
+ else{
+ copy_v3_v3(result, state_co);
+ }
+ break;
}
+ }
+
+ /* blend the start of the kink */
+ if(dt < 1.f)
+ interp_v3_v3v3(state->co, state->co, result, dt);
+ else
+ copy_v3_v3(state->co, result);
}
-static void do_clump(ParticleKey *state, ParticleKey *par, float time, float clumpfac, float clumppow, float pa_clump)
+static float do_clump(ParticleKey *state, ParticleKey *par, float time, float clumpfac, float clumppow, float pa_clump)
{
+ float clump = 0.f;
+
if(par && clumpfac!=0.0){
- float clump, cpow;
+ float cpow;
if(clumppow<0.0)
cpow=1.0f+clumppow;
@@ -2009,8 +2045,11 @@ static void do_clump(ParticleKey *state, ParticleKey *par, float time, float clu
clump = -clumpfac*pa_clump*(float)pow(1.0-(double)time,(double)cpow);
else
clump = clumpfac*pa_clump*(float)pow((double)time,(double)cpow);
+
interp_v3_v3v3(state->co,state->co,par->co,clump);
}
+
+ return clump;
}
void precalc_guides(ParticleSimulationData *sim, ListBase *effectors)
{
@@ -2123,7 +2162,7 @@ int do_guides(ListBase *effectors, ParticleKey *state, int index, float time)
}
par.co[0] = par.co[1] = par.co[2] = 0.0f;
VECCOPY(key.co, vec_to_point);
- do_prekink(&key, &par, 0, guidetime, pd->kink_freq, pd->kink_shape, pd->kink_amp, pd->kink, pd->kink_axis, 0);
+ do_kink(&key, &par, 0, guidetime, pd->kink_freq, pd->kink_shape, pd->kink_amp, 0.f, pd->kink, pd->kink_axis, 0, 0);
do_clump(&key, &par, guidetime, pd->clump_fac, pd->clump_pow, 1.0f);
VECCOPY(vec_to_point, key.co);
@@ -2184,7 +2223,7 @@ static void do_rough_end(float *loc, float mat[4][4], float t, float fac, float
VECADDFAC(state->co,state->co,mat[0],rough[0]);
VECADDFAC(state->co,state->co,mat[1],rough[1]);
}
-static void do_path_effectors(ParticleSimulationData *sim, int i, ParticleCacheKey *ca, int k, int steps, float *rootco, float effector, float dfra, float cfra, float *length, float *vec)
+static void do_path_effectors(ParticleSimulationData *sim, int i, ParticleCacheKey *ca, int k, int steps, float *UNUSED(rootco), float effector, float UNUSED(dfra), float UNUSED(cfra), float *length, float *vec)
{
float force[3] = {0.0f,0.0f,0.0f};
ParticleKey eff_key;
@@ -2207,12 +2246,13 @@ static void do_path_effectors(ParticleSimulationData *sim, int i, ParticleCacheK
normalize_v3(force);
- VECADDFAC(ca->co, (ca-1)->co, force, *length);
-
- if(k < steps) {
+ if(k < steps)
sub_v3_v3v3(vec, (ca+1)->co, ca->co);
+
+ madd_v3_v3v3fl(ca->co, (ca-1)->co, force, *length);
+
+ if(k < steps)
*length = len_v3(vec);
- }
}
static int check_path_length(int k, ParticleCacheKey *keys, ParticleCacheKey *state, float max_length, float *cur_length, float length, float *dvec)
{
@@ -2228,20 +2268,23 @@ static int check_path_length(int k, ParticleCacheKey *keys, ParticleCacheKey *st
return k;
}
}
-static void offset_child(ChildParticle *cpa, ParticleKey *par, ParticleKey *child, float flat, float radius)
+static void offset_child(ChildParticle *cpa, ParticleKey *par, float *par_rot, ParticleKey *child, float flat, float radius)
{
- VECCOPY(child->co,cpa->fuv);
- mul_v3_fl(child->co,radius);
+ copy_v3_v3(child->co, cpa->fuv);
+ mul_v3_fl(child->co, radius);
child->co[0]*=flat;
- VECCOPY(child->vel,par->vel);
-
- mul_qt_v3(par->rot,child->co);
+ copy_v3_v3(child->vel, par->vel);
- QUATCOPY(child->rot,par->rot);
+ if(par_rot) {
+ mul_qt_v3(par_rot, child->co);
+ copy_qt_qt(child->rot, par_rot);
+ }
+ else
+ unit_qt(child->rot);
- VECADD(child->co,child->co,par->co);
+ add_v3_v3(child->co, par->co);
}
float *psys_cache_vgroup(DerivedMesh *dm, ParticleSystem *psys, int vgroup)
{
@@ -2371,12 +2414,9 @@ static int psys_threads_init_path(ParticleThread *threads, Scene *scene, float c
if(totchild==0) return 0;
/* init random number generator */
- if(ctx->sim.psys->part->flag & PART_ANIM_BRANCHING)
- seed= 31415926 + ctx->sim.psys->seed + (int)cfra;
- else
- seed= 31415926 + ctx->sim.psys->seed;
+ seed= 31415926 + ctx->sim.psys->seed;
- if(part->flag & PART_BRANCHING || ctx->editupdate || totchild < 10000)
+ if(ctx->editupdate || totchild < 10000)
totthread= 1;
for(i=0; i<totthread; i++) {
@@ -2419,7 +2459,7 @@ static int psys_threads_init_path(ParticleThread *threads, Scene *scene, float c
}
/* note: this function must be thread safe, except for branching! */
-static void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa, ParticleCacheKey *keys, int i)
+static void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa, ParticleCacheKey *child_keys, int i)
{
ParticleThreadContext *ctx= thread->ctx;
Object *ob= ctx->sim.ob;
@@ -2427,44 +2467,29 @@ static void psys_thread_create_path(ParticleThread *thread, struct ChildParticle
ParticleSettings *part = psys->part;
ParticleCacheKey **cache= psys->childcache;
ParticleCacheKey **pcache= psys_in_edit_mode(ctx->sim.scene, psys) ? psys->edit->pathcache : psys->pathcache;
- ParticleCacheKey *state, *par = NULL, *key[4];
- ParticleData *pa=NULL;
+ ParticleCacheKey *child, *par = NULL, *key[4];
ParticleTexture ptex;
- float *cpa_fuv=0, *par_rot=0;
- float co[3], orco[3], ornor[3], hairmat[4][4], t, cpa_1st[3], dvec[3];
- float branch_begin, branch_end, branch_prob, rough_rand;
+ float *cpa_fuv=0, *par_rot=0, rot[4];
+ float orco[3], ornor[3], hairmat[4][4], t, dvec[3], off1[4][3], off2[4][3];
float length, max_length = 1.0f, cur_length = 0.0f;
- float eff_length, eff_vec[3];
+ float eff_length, eff_vec[3], weight[4];
int k, cpa_num;
short cpa_from;
if(!pcache)
return;
- if(part->flag & PART_BRANCHING) {
- branch_begin=rng_getFloat(thread->rng_path);
- branch_end=branch_begin+(1.0f-branch_begin)*rng_getFloat(thread->rng_path);
- branch_prob=rng_getFloat(thread->rng_path);
- rough_rand=rng_getFloat(thread->rng_path);
- }
- else {
- branch_begin= 0.0f;
- branch_end= 0.0f;
- branch_prob= 0.0f;
- rough_rand= 0.0f;
- }
-
- if(i<psys->totpart){
- branch_begin=0.0f;
- branch_end=1.0f;
- branch_prob=0.0f;
- }
-
if(ctx->between){
+ ParticleData *pa = psys->particles + cpa->pa[0];
int w, needupdate;
- float foffset;
-
- if(ctx->editupdate && !(part->flag & PART_BRANCHING)) {
+ float foffset, wsum=0.f;
+ float co[3];
+ float p_min = part->parting_min;
+ float p_max = part->parting_max;
+ /* Virtual parents don't work nicely with parting. */
+ float p_fac = part->parents > 0.f ? 0.f : part->parting_fac;
+
+ if(ctx->editupdate) {
needupdate= 0;
w= 0;
while(w<4 && cpa->pa[w]>=0) {
@@ -2478,223 +2503,223 @@ static void psys_thread_create_path(ParticleThread *thread, struct ChildParticle
if(!needupdate)
return;
else
- memset(keys, 0, sizeof(*keys)*(ctx->steps+1));
+ memset(child_keys, 0, sizeof(*child_keys)*(ctx->steps+1));
}
/* get parent paths */
- w= 0;
- while(w<4 && cpa->pa[w]>=0){
- key[w] = pcache[cpa->pa[w]];
- w++;
+ for(w=0; w<4; w++) {
+ if(cpa->pa[w] >= 0) {
+ key[w] = pcache[cpa->pa[w]];
+ weight[w] = cpa->w[w];
+ }
+ else {
+ key[w] = pcache[0];
+ weight[w] = 0.f;
+ }
+ }
+
+ /* modify weights to create parting */
+ if(p_fac > 0.f) {
+ for(w=0; w<4; w++) {
+ if(w && weight[w] > 0.f) {
+ float d;
+ if(part->flag & PART_CHILD_LONG_HAIR) {
+ /* For long hair use tip distance/root distance as parting factor instead of root to tip angle. */
+ float d1 = len_v3v3(key[0]->co, key[w]->co);
+ float d2 = len_v3v3((key[0]+key[0]->steps-1)->co, (key[w]+key[w]->steps-1)->co);
+
+ d = d1 > 0.f ? d2/d1 - 1.f : 10000.f;
+ }
+ else {
+ float v1[3], v2[3];
+ sub_v3_v3v3(v1, (key[0]+key[0]->steps-1)->co, key[0]->co);
+ sub_v3_v3v3(v2, (key[w]+key[w]->steps-1)->co, key[w]->co);
+ normalize_v3(v1);
+ normalize_v3(v2);
+
+ d = saacos(dot_v3v3(v1, v2)) * 180.f / M_PI;
+ }
+
+ if(p_max > p_min)
+ d = (d - p_min)/(p_max - p_min);
+ else
+ d = (d - p_min) <= 0.f ? 0.f : 1.f;
+
+ CLAMP(d, 0.f, 1.f);
+
+ if(d > 0.f)
+ weight[w] *= (1.f - d);
+ }
+ wsum += weight[w];
+ }
+ for(w=0; w<4; w++)
+ weight[w] /= wsum;
+
+ interp_v4_v4v4(weight, cpa->w, weight, p_fac);
}
/* get the original coordinates (orco) for texture usage */
cpa_num = cpa->num;
- foffset= cpa->foffset;
+ foffset = cpa->foffset;
cpa_fuv = cpa->fuv;
cpa_from = PART_FROM_FACE;
psys_particle_on_emitter(ctx->sim.psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa->fuv,foffset,co,ornor,0,0,orco,0);
- if(part->path_start==0.0f) {
- /* we need to save the actual root position of the child for positioning it accurately to the surface of the emitter */
- VECCOPY(cpa_1st,co);
- mul_m4_v3(ob->obmat,cpa_1st);
- }
+ mul_m4_v3(ob->obmat, co);
- pa = psys->particles + cpa->pa[0];
+ for(w=0; w<4; w++)
+ sub_v3_v3v3(off1[w], co, key[w]->co);
psys_mat_hair_to_global(ob, ctx->sim.psmd->dm, psys->part->from, pa, hairmat);
-
- pa=0;
}
else{
- if(ctx->editupdate && !(part->flag & PART_BRANCHING)) {
+ ParticleData *pa = psys->particles + cpa->parent;
+ float co[3];
+ if(ctx->editupdate) {
if(!(psys->edit->points[cpa->parent].flag & PEP_EDIT_RECALC))
return;
- memset(keys, 0, sizeof(*keys)*(ctx->steps+1));
+ memset(child_keys, 0, sizeof(*child_keys)*(ctx->steps+1));
}
/* get the parent path */
- key[0]=pcache[cpa->parent];
+ key[0] = pcache[cpa->parent];
/* get the original coordinates (orco) for texture usage */
- pa=psys->particles+cpa->parent;
-
- cpa_from=part->from;
- cpa_num=pa->num;
- cpa_fuv=pa->fuv;
+ cpa_from = part->from;
+ cpa_num = pa->num;
+ cpa_fuv = pa->fuv;
psys_particle_on_emitter(ctx->sim.psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa_fuv,pa->foffset,co,ornor,0,0,orco,0);
psys_mat_hair_to_global(ob, ctx->sim.psmd->dm, psys->part->from, pa, hairmat);
}
- keys->steps = ctx->steps;
-
- /* correct child ipo timing */
-#if 0 // XXX old animation system
- if((part->flag&PART_ABS_TIME)==0 && part->ipo){
- float dsta=part->end-part->sta;
- calc_ipo(part->ipo, 100.0f*(ctx->cfra-(part->sta+dsta*cpa->rand[1]))/(part->lifetime*(1.0f - part->randlife*cpa->rand[0])));
- execute_ipo((ID *)part, part->ipo);
- }
-#endif // XXX old animation system
+ child_keys->steps = ctx->steps;
/* get different child parameters from textures & vgroups */
get_child_modifier_parameters(part, ctx, cpa, cpa_from, cpa_num, cpa_fuv, orco, &ptex);
if(ptex.exist < PSYS_FRAND(i + 24)) {
- keys->steps = -1;
+ child_keys->steps = -1;
return;
}
/* create the child path */
- for(k=0,state=keys; k<=ctx->steps; k++,state++){
+ for(k=0,child=child_keys; k<=ctx->steps; k++,child++){
if(ctx->between){
int w=0;
- state->co[0] = state->co[1] = state->co[2] = 0.0f;
- state->vel[0] = state->vel[1] = state->vel[2] = 0.0f;
- state->rot[0] = state->rot[1] = state->rot[2] = state->rot[3] = 0.0f;
+ zero_v3(child->co);
+ zero_v3(child->vel);
+ unit_qt(child->rot);
- //QUATCOPY(state->rot,key[0]->rot);
+ for(w=0; w<4; w++) {
+ copy_v3_v3(off2[w], off1[w]);
- /* child position is the weighted sum of parent positions */
- while(w<4 && cpa->pa[w]>=0){
- state->co[0] += cpa->w[w] * key[w]->co[0];
- state->co[1] += cpa->w[w] * key[w]->co[1];
- state->co[2] += cpa->w[w] * key[w]->co[2];
-
- state->vel[0] += cpa->w[w] * key[w]->vel[0];
- state->vel[1] += cpa->w[w] * key[w]->vel[1];
- state->vel[2] += cpa->w[w] * key[w]->vel[2];
- key[w]++;
- w++;
- }
- if(part->path_start==0.0f) {
- if(k==0){
- /* calculate the offset between actual child root position and first position interpolated from parents */
- VECSUB(cpa_1st,cpa_1st,state->co);
+ if(part->flag & PART_CHILD_LONG_HAIR) {
+ /* Use parent rotation (in addition to emission location) to determine child offset. */
+ if(k)
+ mul_qt_v3((key[w]+k)->rot, off2[w]);
+
+ /* Fade the effect of rotation for even lengths in the end */
+ project_v3_v3v3(dvec, off2[w], (key[w]+k)->vel);
+ madd_v3_v3fl(off2[w], dvec, -(float)k/(float)ctx->steps);
}
- /* apply offset for correct positioning */
- VECADD(state->co,state->co,cpa_1st);
+
+ add_v3_v3(off2[w], (key[w]+k)->co);
}
+
+ /* child position is the weighted sum of parent positions */
+ interp_v3_v3v3v3v3(child->co, off2[0], off2[1], off2[2], off2[3], weight);
+ interp_v3_v3v3v3v3(child->vel, (key[0]+k)->vel, (key[1]+k)->vel, (key[2]+k)->vel, (key[3]+k)->vel, weight);
+
+ copy_qt_qt(child->rot, (key[0]+k)->rot);
}
else{
+ if(k) {
+ mul_qt_qtqt(rot, (key[0]+k)->rot, key[0]->rot);
+ par_rot = rot;
+ }
+ else {
+ par_rot = key[0]->rot;
+ }
/* offset the child from the parent position */
- offset_child(cpa, (ParticleKey*)key[0], (ParticleKey*)state, part->childflat, part->childrad);
-
- key[0]++;
+ offset_child(cpa, (ParticleKey*)(key[0]+k), par_rot, (ParticleKey*)child, part->childflat, part->childrad);
}
}
/* apply effectors */
if(part->flag & PART_CHILD_EFFECT) {
- for(k=0,state=keys; k<=ctx->steps; k++,state++) {
+ for(k=0,child=child_keys; k<=ctx->steps; k++,child++) {
if(k) {
- do_path_effectors(&ctx->sim, cpa->pa[0], state, k, ctx->steps, keys->co, ptex.effector, 0.0f, ctx->cfra, &eff_length, eff_vec);
+ do_path_effectors(&ctx->sim, cpa->pa[0], child, k, ctx->steps, child_keys->co, ptex.effector, 0.0f, ctx->cfra, &eff_length, eff_vec);
}
else {
- sub_v3_v3v3(eff_vec,(state+1)->co,state->co);
- eff_length= len_v3(eff_vec);
+ sub_v3_v3v3(eff_vec, (child+1)->co, child->co);
+ eff_length = len_v3(eff_vec);
}
}
}
- for(k=0,state=keys; k<=ctx->steps; k++,state++){
- t=(float)k/(float)ctx->steps;
+ for(k=0,child=child_keys; k<=ctx->steps; k++,child++){
+ t = (float)k/(float)ctx->steps;
+
+ if(ctx->totparent)
+ /* this is now threadsafe, virtual parents are calculated before rest of children */
+ par = (i >= ctx->totparent) ? cache[cpa->parent] : NULL;
+ else if(cpa->parent >= 0)
+ par = pcache[cpa->parent];
- if(ctx->totparent){
- if(i>=ctx->totparent) {
- /* this is now threadsafe, virtual parents are calculated before rest of children */
- par = cache[cpa->parent] + k;
+ if(par) {
+ if(k) {
+ mul_qt_qtqt(rot, (par+k)->rot, par->rot);
+ par_rot = rot;
}
- else
- par=0;
- }
- else if(cpa->parent>=0){
- par=pcache[cpa->parent]+k;
- par_rot = par->rot;
+ else {
+ par_rot = par->rot;
+ }
+ par += k;
}
/* apply different deformations to the child path */
- do_child_modifiers(&ctx->sim, &ptex, (ParticleKey *)par, par_rot, cpa, orco, hairmat, (ParticleKey *)state, t);
-
- /* TODO: better branching */
- //if(part->flag & PART_BRANCHING && ctx->between == 0 && part->flag & PART_ANIM_BRANCHING)
- // rough_t = t * rough_rand;
- //else
- // rough_t = t;
-
- /* TODO: better branching */
- //if(part->flag & PART_BRANCHING && ctx->between==0){
- // if(branch_prob > part->branch_thres){
- // branchfac=0.0f;
- // }
- // else{
- // if(part->flag & PART_SYMM_BRANCHING){
- // if(t < branch_begin || t > branch_end)
- // branchfac=0.0f;
- // else{
- // if((t-branch_begin)/(branch_end-branch_begin)<0.5)
- // branchfac=2.0f*(t-branch_begin)/(branch_end-branch_begin);
- // else
- // branchfac=2.0f*(branch_end-t)/(branch_end-branch_begin);
-
- // CLAMP(branchfac,0.0f,1.0f);
- // }
- // }
- // else{
- // if(t < branch_begin){
- // branchfac=0.0f;
- // }
- // else{
- // branchfac=(t-branch_begin)/((1.0f-branch_begin)*0.5f);
- // CLAMP(branchfac,0.0f,1.0f);
- // }
- // }
- // }
-
- // if(i<psys->totpart)
- // interp_v3_v3v3(state->co, (pcache[i] + k)->co, state->co, branchfac);
- // else
- // /* this is not threadsafe, but should only happen for
- // * branching particles particles, which are not threaded */
- // interp_v3_v3v3(state->co, (cache[i - psys->totpart] + k)->co, state->co, branchfac);
- //}
+ do_child_modifiers(&ctx->sim, &ptex, (ParticleKey *)par, par_rot, cpa, orco, hairmat, (ParticleKey *)child, t);
/* we have to correct velocity because of kink & clump */
if(k>1){
- VECSUB((state-1)->vel,state->co,(state-2)->co);
- mul_v3_fl((state-1)->vel,0.5);
+ sub_v3_v3v3((child-1)->vel, child->co, (child-2)->co);
+ mul_v3_fl((child-1)->vel, 0.5);
if(ctx->ma && (part->draw & PART_DRAW_MAT_COL))
- get_strand_normal(ctx->ma, ornor, cur_length, (state-1)->vel);
+ get_strand_normal(ctx->ma, ornor, cur_length, (child-1)->vel);
}
if(k == ctx->steps)
- VECSUB(state->vel,state->co,(state-1)->co);
+ sub_v3_v3v3(child->vel, child->co, (child-1)->co);
/* check if path needs to be cut before actual end of data points */
if(k){
- VECSUB(dvec,state->co,(state-1)->co);
- length=1.0f/(float)ctx->steps;
- k=check_path_length(k,keys,state,max_length,&cur_length,length,dvec);
+ sub_v3_v3v3(dvec, child->co, (child-1)->co);
+ length = 1.0f/(float)ctx->steps;
+ k = check_path_length(k, child_keys, child, max_length, &cur_length, length, dvec);
}
else{
/* initialize length calculation */
- max_length= ptex.length;
- cur_length= 0.0f;
+ max_length = ptex.length;
+ cur_length = 0.0f;
}
if(ctx->ma && (part->draw & PART_DRAW_MAT_COL)) {
- VECCOPY(state->col, &ctx->ma->r)
- get_strand_normal(ctx->ma, ornor, cur_length, state->vel);
+ VECCOPY(child->col, &ctx->ma->r)
+ get_strand_normal(ctx->ma, ornor, cur_length, child->vel);
}
}
+
+ /* Hide virtual parents */
+ if(i < ctx->totparent)
+ child_keys->steps = -1;
}
static void *exec_child_path_cache(void *data)
@@ -2720,10 +2745,8 @@ static void *exec_child_path_cache(void *data)
void psys_cache_child_paths(ParticleSimulationData *sim, float cfra, int editupdate)
{
- ParticleSettings *part = sim->psys->part;
ParticleThread *pthreads;
ParticleThreadContext *ctx;
- ParticleCacheKey **cache;
ListBase threads;
int i, totchild, totparent, totthread;
@@ -2741,8 +2764,8 @@ void psys_cache_child_paths(ParticleSimulationData *sim, float cfra, int editupd
totchild= ctx->totchild;
totparent= ctx->totparent;
- if(editupdate && sim->psys->childcache && !(part->flag & PART_BRANCHING) && totchild == sim->psys->totchildcache) {
- cache = sim->psys->childcache;
+ if(editupdate && sim->psys->childcache && totchild == sim->psys->totchildcache) {
+ ; /* just overwrite the existing cache */
}
else {
/* clear out old and create new empty path cache */
@@ -2782,6 +2805,43 @@ void psys_cache_child_paths(ParticleSimulationData *sim, float cfra, int editupd
psys_threads_free(pthreads);
}
+/* figure out incremental rotations along path starting from unit quat */
+static void cache_key_incremental_rotation(ParticleCacheKey *key0, ParticleCacheKey *key1, ParticleCacheKey *key2, float *prev_tangent, int i)
+{
+ float cosangle, angle, tangent[3], normal[3], q[4];
+
+ switch(i) {
+ case 0:
+ /* start from second key */
+ break;
+ case 1:
+ /* calculate initial tangent for incremental rotations */
+ sub_v3_v3v3(prev_tangent, key0->co, key1->co);
+ normalize_v3(prev_tangent);
+ unit_qt(key1->rot);
+ break;
+ default:
+ sub_v3_v3v3(tangent, key0->co, key1->co);
+ normalize_v3(tangent);
+
+ cosangle= dot_v3v3(tangent, prev_tangent);
+
+ /* note we do the comparison on cosangle instead of
+ * angle, since floating point accuracy makes it give
+ * different results across platforms */
+ if(cosangle > 0.999999f) {
+ QUATCOPY(key1->rot, key2->rot);
+ }
+ else {
+ angle= saacos(cosangle);
+ cross_v3_v3v3(normal, prev_tangent, tangent);
+ axis_angle_to_quat( q,normal, angle);
+ mul_qt_qtqt(key1->rot, q, key2->rot);
+ }
+
+ copy_v3_v3(prev_tangent, tangent);
+ }
+}
/* Calculates paths ready for drawing/rendering. */
/* -Usefull for making use of opengl vertex arrays for super fast strand drawing. */
/* -Makes child strands possible and creates them too into the cache. */
@@ -2792,9 +2852,9 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
ParticleEditSettings *pset = &sim->scene->toolsettings->particle;
ParticleSystem *psys = sim->psys;
ParticleSettings *part = psys->part;
- ParticleCacheKey *ca, **cache= psys->pathcache;
+ ParticleCacheKey *ca, **cache;
- DerivedMesh *hair_dm = psys->hair_out_dm;
+ DerivedMesh *hair_dm = (psys->part->type==PART_HAIR && psys->flag & PSYS_HAIR_DYNAMICS) ? psys->hair_out_dm : NULL;
ParticleKey result;
@@ -2804,9 +2864,9 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
PARTICLE_P;
float birthtime = 0.0, dietime = 0.0;
- float t, time = 0.0, dfra = 1.0, frs_sec = sim->scene->r.frs_sec;
+ float t, time = 0.0, dfra = 1.0 /* , frs_sec = sim->scene->r.frs_sec*/ /*UNUSED*/;
float col[4] = {0.5f, 0.5f, 0.5f, 1.0f};
- float prev_tangent[3], hairmat[4][4];
+ float prev_tangent[3] = {0.0f, 0.0f, 0.0f}, hairmat[4][4];
float rotmat[3][3];
int k;
int steps = (int)pow(2.0, (double)(psys->renderdata ? part->ren_step : part->draw_step));
@@ -2827,7 +2887,7 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
BLI_srandom(psys->seed);
keyed = psys->flag & PSYS_KEYED;
- baked = !hair_dm && psys->pointcache->mem_cache.first;
+ baked = psys->pointcache->mem_cache.first && psys->part->type != PART_HAIR;
/* clear out old and create new empty path cache */
psys_free_path_cache(psys, psys->edit);
@@ -2894,22 +2954,19 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
/*--interpolate actual path from data points--*/
for(k=0, ca=cache[p]; k<=steps; k++, ca++){
time = (float)k / (float)steps;
-
t = birthtime + time * (dietime - birthtime);
-
result.time = -t;
-
- do_particle_interpolation(psys, p, pa, t, frs_sec, &pind, &result);
+ do_particle_interpolation(psys, p, pa, t, &pind, &result);
+ copy_v3_v3(ca->co, result.co);
/* dynamic hair is in object space */
/* keyed and baked are already in global space */
if(hair_dm)
- mul_m4_v3(sim->ob->obmat, result.co);
+ mul_m4_v3(sim->ob->obmat, ca->co);
else if(!keyed && !baked && !(psys->flag & PSYS_GLOBAL_HAIR))
- mul_m4_v3(hairmat, result.co);
+ mul_m4_v3(hairmat, ca->co);
- VECCOPY(ca->co, result.co);
- VECCOPY(ca->col, col);
+ copy_v3_v3(ca->col, col);
}
/*--modify paths and calculate rotation & velocity--*/
@@ -2944,54 +3001,25 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
/* finally do rotation & velocity */
for(k=1, ca=cache[p]+1; k<=steps; k++, ca++) {
- /* figure out rotation */
- float cosangle, angle, tangent[3], normal[3], q[4];
-
- if(k == 1) {
- /* calculate initial tangent for incremental rotations */
- VECSUB(tangent, ca->co, (ca - 1)->co);
- normalize_v3_v3(prev_tangent, tangent);
-
- /* First rotation is based on emitting face orientation. */
- /* This is way better than having flipping rotations resulting */
- /* from using a global axis as a rotation pole (vec_to_quat()). */
- /* It's not an ideal solution though since it disregards the */
- /* initial tangent, but taking that in to account will allow */
- /* the possibility of flipping again. -jahka */
- mat3_to_quat_is_ok( (ca-1)->rot,rotmat);
- }
- else {
- VECSUB(tangent, ca->co, (ca - 1)->co);
- normalize_v3(tangent);
-
- cosangle= dot_v3v3(tangent, prev_tangent);
-
- /* note we do the comparison on cosangle instead of
- * angle, since floating point accuracy makes it give
- * different results across platforms */
- if(cosangle > 0.999999f) {
- QUATCOPY((ca - 1)->rot, (ca - 2)->rot);
- }
- else {
- angle= saacos(cosangle);
- cross_v3_v3v3(normal, prev_tangent, tangent);
- axis_angle_to_quat( q,normal, angle);
- mul_qt_qtqt((ca - 1)->rot, q, (ca - 2)->rot);
- }
-
- VECCOPY(prev_tangent, tangent);
- }
+ cache_key_incremental_rotation(ca, ca - 1, ca - 2, prev_tangent, k);
if(k == steps)
- QUATCOPY(ca->rot, (ca - 1)->rot);
-
+ copy_qt_qt(ca->rot, (ca - 1)->rot);
/* set velocity */
- VECSUB(ca->vel, ca->co, (ca-1)->co);
+ sub_v3_v3v3(ca->vel, ca->co, (ca-1)->co);
if(k==1)
- VECCOPY((ca-1)->vel, ca->vel);
+ copy_v3_v3((ca-1)->vel, ca->vel);
}
+ /* First rotation is based on emitting face orientation.
+ * This is way better than having flipping rotations resulting
+ * from using a global axis as a rotation pole (vec_to_quat()).
+ * It's not an ideal solution though since it disregards the
+ * initial tangent, but taking that in to account will allow
+ * the possibility of flipping again. -jahka
+ */
+ mat3_to_quat_is_ok(cache[p]->rot, rotmat);
}
psys->totcached = totpart;
@@ -3024,7 +3052,7 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf
float birthtime = 0.0, dietime = 0.0;
float t, time = 0.0, keytime = 0.0, frs_sec;
- float hairmat[4][4], rotmat[3][3], prev_tangent[3];
+ float hairmat[4][4], rotmat[3][3], prev_tangent[3] = {0.0f, 0.0f, 0.0f};
int k, i;
int steps = (int)pow(2.0, (double)pset->draw_step);
int totpart = edit->totpoint, recalc_set=0;
@@ -3046,12 +3074,8 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf
frs_sec = (psys || edit->pid.flag & PTCACHE_VEL_PER_SEC) ? 25.0f : 1.0f;
- if(pset->brushtype == PE_BRUSH_WEIGHT){
- /* use weight painting colors now... */
-#if 0
- sel_col[0] = sel_col[1] = sel_col[2] = 1.0f;
- nosel_col[0] = nosel_col[1] = nosel_col[2] = 0.0f;
-#endif
+ if(pset->brushtype == PE_BRUSH_WEIGHT) {
+ ;/* use weight painting colors now... */
}
else{
sel_col[0] = (float)edit->sel_col[0] / 255.0f;
@@ -3079,6 +3103,7 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf
/* should init_particle_interpolation set this ? */
if(pset->brushtype==PE_BRUSH_WEIGHT){
pind.hkey[0] = NULL;
+ /* pa != NULL since the weight brush is only available for hair */
pind.hkey[1] = pa->hair;
}
@@ -3092,9 +3117,9 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf
if(psys) {
psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, hairmat);
- VECCOPY(rotmat[0], hairmat[2]);
- VECCOPY(rotmat[1], hairmat[1]);
- VECCOPY(rotmat[2], hairmat[0]);
+ copy_v3_v3(rotmat[0], hairmat[2]);
+ copy_v3_v3(rotmat[1], hairmat[1]);
+ copy_v3_v3(rotmat[2], hairmat[0]);
}
birthtime = pind.birthtime;
@@ -3108,66 +3133,32 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf
/*--interpolate actual path from data points--*/
for(k=0, ca=cache[i]; k<=steps; k++, ca++){
time = (float)k / (float)steps;
-
t = birthtime + time * (dietime - birthtime);
-
result.time = -t;
-
- do_particle_interpolation(psys, i, pa, t, frs_sec, &pind, &result);
+ do_particle_interpolation(psys, i, pa, t, &pind, &result);
+ copy_v3_v3(ca->co, result.co);
/* non-hair points are already in global space */
if(psys && !(psys->flag & PSYS_GLOBAL_HAIR)) {
- mul_m4_v3(hairmat, result.co);
+ mul_m4_v3(hairmat, ca->co);
- /* create rotations for proper creation of children */
if(k) {
- float cosangle, angle, tangent[3], normal[3], q[4];
-
- if(k == 1) {
- /* calculate initial tangent for incremental rotations */
- VECSUB(tangent, ca->co, (ca - 1)->co);
- normalize_v3_v3(prev_tangent, tangent);
-
- /* First rotation is based on emitting face orientation. */
- /* This is way better than having flipping rotations resulting */
- /* from using a global axis as a rotation pole (vec_to_quat()). */
- /* It's not an ideal solution though since it disregards the */
- /* initial tangent, but taking that in to account will allow */
- /* the possibility of flipping again. -jahka */
- mat3_to_quat_is_ok( (ca-1)->rot,rotmat);
- }
- else {
- VECSUB(tangent, ca->co, (ca - 1)->co);
- normalize_v3(tangent);
-
- cosangle= dot_v3v3(tangent, prev_tangent);
-
- /* note we do the comparison on cosangle instead of
- * angle, since floating point accuracy makes it give
- * different results across platforms */
- if(cosangle > 0.999999f) {
- QUATCOPY((ca - 1)->rot, (ca - 2)->rot);
- }
- else {
- angle= saacos(cosangle);
- cross_v3_v3v3(normal, prev_tangent, tangent);
- axis_angle_to_quat( q,normal, angle);
- mul_qt_qtqt((ca - 1)->rot, q, (ca - 2)->rot);
- }
-
- VECCOPY(prev_tangent, tangent);
- }
+ cache_key_incremental_rotation(ca, ca - 1, ca - 2, prev_tangent, k);
if(k == steps)
- QUATCOPY(ca->rot, (ca - 1)->rot);
- }
-
- }
+ copy_qt_qt(ca->rot, (ca - 1)->rot);
- VECCOPY(ca->co, result.co);
+ /* set velocity */
+ sub_v3_v3v3(ca->vel, ca->co, (ca - 1)->co);
- ca->vel[0] = ca->vel[1] = 0.0f;
- ca->vel[1] = 1.0f;
+ if(k==1)
+ copy_v3_v3((ca - 1)->vel, ca->vel);
+ }
+ }
+ else {
+ ca->vel[0] = ca->vel[1] = 0.0f;
+ ca->vel[1] = 1.0f;
+ }
/* selection coloring in edit mode */
if(pset->brushtype==PE_BRUSH_WEIGHT){
@@ -3215,12 +3206,27 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf
ca->time = t;
}
+ if(psys && !(psys->flag & PSYS_GLOBAL_HAIR)) {
+ /* First rotation is based on emitting face orientation.
+ * This is way better than having flipping rotations resulting
+ * from using a global axis as a rotation pole (vec_to_quat()).
+ * It's not an ideal solution though since it disregards the
+ * initial tangent, but taking that in to account will allow
+ * the possibility of flipping again. -jahka
+ */
+ mat3_to_quat_is_ok(cache[i]->rot, rotmat);
+ }
}
edit->totcached = totpart;
if(psys) {
- ParticleSimulationData sim = {scene, ob, psys, psys_get_modifier(ob, psys), NULL};
+ ParticleSimulationData sim= {0};
+ sim.scene= scene;
+ sim.ob= ob;
+ sim.psys= psys;
+ sim.psmd= psys_get_modifier(ob, psys);
+
psys_cache_child_paths(&sim, cfra, 1);
}
@@ -3338,7 +3344,7 @@ static void psys_face_mat(Object *ob, DerivedMesh *dm, ParticleData *pa, float m
triatomat(v[0], v[1], v[2], (osface)? osface->uv: NULL, mat);
}
-void psys_mat_hair_to_object(Object *ob, DerivedMesh *dm, short from, ParticleData *pa, float hairmat[][4])
+void psys_mat_hair_to_object(Object *UNUSED(ob), DerivedMesh *dm, short from, ParticleData *pa, float hairmat[][4])
{
float vec[3];
@@ -3380,7 +3386,7 @@ void psys_mat_hair_to_global(Object *ob, DerivedMesh *dm, short from, ParticleDa
/************************************************/
/* ParticleSettings handling */
/************************************************/
-ModifierData *object_add_particle_system(Scene *scene, Object *ob, char *name)
+ModifierData *object_add_particle_system(Scene *scene, Object *ob, const char *name)
{
ParticleSystem *psys;
ModifierData *md;
@@ -3419,7 +3425,7 @@ ModifierData *object_add_particle_system(Scene *scene, Object *ob, char *name)
psys->cfra=bsystem_time(scene,ob,scene->r.cfra+1,0.0);
DAG_scene_sort(G.main, scene);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
return md;
}
@@ -3456,7 +3462,7 @@ void object_remove_particle_system(Scene *scene, Object *ob)
ob->mode &= ~OB_MODE_PARTICLE_EDIT;
DAG_scene_sort(G.main, scene);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
static void default_particle_settings(ParticleSettings *part)
{
@@ -3467,7 +3473,7 @@ static void default_particle_settings(ParticleSettings *part)
part->bb_uv_split=1;
part->bb_align=PART_BB_VIEW;
part->bb_split_offset=PART_BB_OFF_LINEAR;
- part->flag=PART_REACT_MULTIPLE|PART_HAIR_GEOMETRY|PART_EDISTR|PART_TRAND;
+ part->flag=PART_EDISTR|PART_TRAND|PART_HIDE_ADVANCED_HAIR;
part->sta= 1.0;
part->end= 200.0;
@@ -3486,6 +3492,7 @@ static void default_particle_settings(ParticleSettings *part)
part->adapt_angle= 5;
part->adapt_pix= 3;
part->kink_axis= 2;
+ part->kink_amp_clump= 1.f;
part->reactevent= PART_EVENT_DEATH;
part->disp=100;
part->from= PART_FROM_FACE;
@@ -3537,7 +3544,7 @@ static void default_particle_settings(ParticleSettings *part)
}
-ParticleSettings *psys_new_settings(char *name, Main *main)
+ParticleSettings *psys_new_settings(const char *name, Main *main)
{
ParticleSettings *part;
@@ -3817,7 +3824,7 @@ float psys_get_child_time(ParticleSystem *psys, ChildParticle *cpa, float cfra,
return (cfra-time)/life;
}
-float psys_get_child_size(ParticleSystem *psys, ChildParticle *cpa, float cfra, float *pa_time)
+float psys_get_child_size(ParticleSystem *psys, ChildParticle *cpa, float UNUSED(cfra), float *UNUSED(pa_time))
{
ParticleSettings *part = psys->part;
float size; // time XXX
@@ -3898,26 +3905,42 @@ static void do_child_modifiers(ParticleSimulationData *sim, ParticleTexture *pte
int i = cpa - sim->psys->child;
int guided = 0;
+ float kink_freq = part->kink_freq;
+ float rough1 = part->rough1;
+ float rough2 = part->rough2;
+ float rough_end = part->rough_end;
+
+ if(ptex) {
+ kink_freq *= ptex->kink;
+ rough1 *= ptex->rough1;
+ rough2 *= ptex->rough2;
+ rough_end *= ptex->roughe;
+ }
+
if(part->flag & PART_CHILD_EFFECT)
/* state is safe to cast, since only co and vel are used */
guided = do_guides(sim->psys->effectors, (ParticleKey*)state, cpa->parent, t);
if(guided==0){
- if(part->kink)
- do_prekink(state, par, par_rot, t, part->kink_freq * ptex->kink, part->kink_shape,
- part->kink_amp, part->kink, part->kink_axis, sim->ob->obmat);
-
- do_clump(state, par, t, part->clumpfac, part->clumppow, ptex->clump);
+ float clump = do_clump(state, par, t, part->clumpfac, part->clumppow, ptex ? ptex->clump : 1.f);
+
+ if(kink_freq != 0.f) {
+ float kink_amp = part->kink_amp * (1.f - part->kink_amp_clump * clump);
+
+ do_kink(state, par, par_rot, t, kink_freq, part->kink_shape,
+ kink_amp, part->kink_flat, part->kink, part->kink_axis,
+ sim->ob->obmat, sim->psys->part->childtype == PART_CHILD_FACES);
+ }
}
- if(part->rough1 != 0.0 && ptex->rough1 != 0.0)
- do_rough(orco, mat, t, ptex->rough1*part->rough1, part->rough1_size, 0.0, state);
+ if(rough1 > 0.f)
+ do_rough(orco, mat, t, rough1, part->rough1_size, 0.0, state);
- if(part->rough2 != 0.0 && ptex->rough2 != 0.0)
- do_rough(sim->psys->frand + ((i + 27) % (PSYS_FRAND_COUNT - 3)), mat, t, ptex->rough2*part->rough2, part->rough2_size, part->rough2_thres, state);
+ if(rough2 > 0.f)
+ do_rough(sim->psys->frand + ((i + 27) % (PSYS_FRAND_COUNT - 3)), mat, t, rough2, part->rough2_size, part->rough2_thres, state);
- if(part->rough_end != 0.0 && ptex->roughe != 0.0)
- do_rough_end(sim->psys->frand + ((i + 27) % (PSYS_FRAND_COUNT - 3)), mat, t, ptex->roughe*part->rough_end, part->rough_end_shape, state);
+ if(rough_end > 0.f)
+ do_rough_end(sim->psys->frand + ((i + 27) % (PSYS_FRAND_COUNT - 3)), mat, t, rough_end, part->rough_end_shape, state);
}
/* get's hair (or keyed) particles state at the "path time" specified in state->time */
void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *state, int vel)
@@ -3933,10 +3956,9 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
ParticleThreadContext ctx; /* fake thread context for child modifiers */
ParticleInterpolationData pind;
- float t, frs_sec = sim->scene->r.frs_sec;
+ float t;
float co[3], orco[3];
float hairmat[4][4];
- int totparent = 0;
int totpart = psys->totpart;
int totchild = psys->totchild;
short between = 0, edit = 0;
@@ -3946,11 +3968,8 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
float *cpa_fuv; int cpa_num; short cpa_from;
- //if(psys_in_edit_mode(scene, psys)){
- // if((psys->edit_path->flag & PSYS_EP_SHOW_CHILD)==0)
- // totchild=0;
- // edit=1;
- //}
+ /* initialize keys to zero */
+ memset(keys, 0, 4*sizeof(ParticleKey));
t=state->time;
CLAMP(t, 0.0, 1.0);
@@ -3965,7 +3984,7 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
* account when subdividing for instance */
pind.dm = psys_in_edit_mode(sim->scene, psys) ? NULL : psys->hair_out_dm;
init_particle_interpolation(sim->ob, psys, pa, &pind);
- do_particle_interpolation(psys, p, pa, t, frs_sec, &pind, state);
+ do_particle_interpolation(psys, p, pa, t, &pind, state);
if(!keyed && !cached) {
if((pa->flag & PARS_REKEY)==0) {
@@ -3992,11 +4011,6 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
t = psys_get_child_time(psys, cpa, -state->time, NULL, NULL);
if(totchild && part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
- totparent=(int)(totchild*part->parents*0.3);
-
- if(G.rendering && part->child_nbr && part->ren_child_nbr)
- totparent*=(float)part->child_nbr/(float)part->ren_child_nbr;
-
/* part->parents could still be 0 so we can't test with totparent */
between=1;
}
@@ -4027,7 +4041,10 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
pa = psys->particles + cpa->parent;
- psys_mat_hair_to_global(sim->ob, sim->psmd->dm, psys->part->from, pa, hairmat);
+ if(part->type == PART_HAIR)
+ psys_mat_hair_to_global(sim->ob, sim->psmd->dm, psys->part->from, pa, hairmat);
+ else
+ unit_m4(hairmat);
pa=0;
}
@@ -4043,9 +4060,16 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
cpa_num=pa->num;
cpa_fuv=pa->fuv;
- psys_particle_on_emitter(psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa_fuv,pa->foffset,co,0,0,0,orco,0);
+
- psys_mat_hair_to_global(sim->ob, sim->psmd->dm, psys->part->from, pa, hairmat);
+ if(part->type == PART_HAIR) {
+ psys_particle_on_emitter(psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa_fuv,pa->foffset,co,0,0,0,orco,0);
+ psys_mat_hair_to_global(sim->ob, sim->psmd->dm, psys->part->from, pa, hairmat);
+ }
+ else {
+ copy_v3_v3(orco, cpa->fuv);
+ unit_m4(hairmat);
+ }
}
/* correct child ipo timing */
@@ -4086,7 +4110,7 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
}
else{
/* offset the child from the parent position */
- offset_child(cpa, keys, state, part->childflat, part->childrad);
+ offset_child(cpa, keys, keys->rot, state, part->childflat, part->childrad);
}
par = keys;
@@ -4165,11 +4189,11 @@ int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *sta
if(pa) {
if(!always)
- if((pa->alive==PARS_UNBORN && (part->flag & PART_UNBORN)==0)
- || (pa->alive==PARS_DEAD && (part->flag & PART_DIED)==0))
+ if((cfra < pa->time && (part->flag & PART_UNBORN)==0)
+ || (cfra > pa->dietime && (part->flag & PART_DIED)==0))
return 0;
- state->time = MIN2(state->time, pa->dietime);
+ cfra = MIN2(cfra, pa->dietime);
}
if(sim->psys->flag & PSYS_KEYED){
@@ -4179,41 +4203,42 @@ int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *sta
}
else{
if(cpa){
+ float mat[4][4];
ParticleKey *key1;
float t = (cfra - pa->time) / pa->lifetime;
key1=&pa->state;
- offset_child(cpa, key1, state, part->childflat, part->childrad);
-
+ offset_child(cpa, key1, key1->rot, state, part->childflat, part->childrad);
+
CLAMP(t,0.0,1.0);
- if(part->kink) /* TODO: part->kink_freq*pa_kink */
- do_prekink(state,key1,key1->rot,t,part->kink_freq,part->kink_shape,part->kink_amp,part->kink,part->kink_axis,sim->ob->obmat);
-
- /* TODO: pa_clump vgroup */
- do_clump(state,key1,t,part->clumpfac,part->clumppow,1.0);
+
+ unit_m4(mat);
+ do_child_modifiers(sim, NULL, key1, key1->rot, cpa, cpa->fuv, mat, state, t);
if(psys->lattice)
calc_latt_deform(sim->psys->lattice, state->co,1.0f);
}
else{
- if(pa->state.time==state->time || ELEM(part->phystype,PART_PHYS_NO,PART_PHYS_KEYED)
- || pa->prev_state.time <= 0.0f)
+ if(pa->state.time==cfra || ELEM(part->phystype,PART_PHYS_NO,PART_PHYS_KEYED))
copy_particle_key(state, &pa->state, 1);
- else if(pa->prev_state.time==state->time)
+ else if(pa->prev_state.time==cfra)
copy_particle_key(state, &pa->prev_state, 1);
else {
+ float dfra, frs_sec = sim->scene->r.frs_sec;
/* let's interpolate to try to be as accurate as possible */
- if(pa->state.time + 2.0f > state->time && pa->prev_state.time - 2.0f < state->time) {
- ParticleKey keys[4];
- float dfra, keytime, frs_sec = sim->scene->r.frs_sec;
+ if(pa->state.time + 2.f >= state->time && pa->prev_state.time - 2.f <= state->time) {
+ if(pa->prev_state.time >= pa->state.time || pa->prev_state.time < 0.f) {
+ /* prev_state is wrong so let's not use it, this can happen at frames 1, 0 or particle birth */
+ dfra = state->time - pa->state.time;
- if(pa->prev_state.time >= pa->state.time) {
- /* prev_state is wrong so let's not use it, this can happen at frame 1 or particle birth */
copy_particle_key(state, &pa->state, 1);
- VECADDFAC(state->co, state->co, state->vel, (state->time-pa->state.time)/frs_sec);
+ madd_v3_v3v3fl(state->co, state->co, state->vel, dfra/frs_sec);
}
else {
+ ParticleKey keys[4];
+ float keytime;
+
copy_particle_key(keys+1, &pa->prev_state, 1);
copy_particle_key(keys+2, &pa->state, 1);
@@ -4228,12 +4253,21 @@ int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *sta
psys_interpolate_particle(-1, keys, keytime, state, 1);
/* convert back to real velocity */
- mul_v3_fl(state->vel, 1.0f / (dfra * timestep));
+ mul_v3_fl(state->vel, 1.f / (dfra * timestep));
interp_v3_v3v3(state->ave, keys[1].ave, keys[2].ave, keytime);
interp_qt_qtqt(state->rot, keys[1].rot, keys[2].rot, keytime);
}
}
+ else if(pa->state.time + 1.f >= state->time && pa->state.time - 1.f <= state->time) {
+ /* linear interpolation using only pa->state */
+
+ dfra = state->time - pa->state.time;
+
+ copy_particle_key(state, &pa->state, 1);
+
+ madd_v3_v3v3fl(state->co, state->co, state->vel, dfra/frs_sec);
+ }
else {
/* extrapolating over big ranges is not accurate so let's just give something close to reasonable back */
copy_particle_key(state, &pa->state, 0);
@@ -4248,7 +4282,7 @@ int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *sta
}
}
-void psys_get_dupli_texture(Object *ob, ParticleSettings *part, ParticleSystemModifierData *psmd, ParticleData *pa, ChildParticle *cpa, float *uv, float *orco)
+void psys_get_dupli_texture(Object *UNUSED(ob), ParticleSettings *part, ParticleSystemModifierData *psmd, ParticleData *pa, ChildParticle *cpa, float *uv, float *orco)
{
MFace *mface;
MTFace *mtface;
@@ -4353,7 +4387,7 @@ void psys_get_dupli_path_transform(ParticleSimulationData *sim, ParticleData *pa
normalize_v3(side);
cross_v3_v3v3(nor, vec, side);
- unit_m4(mat);
+ unit_m4(mat);
VECCOPY(mat[0], vec);
VECCOPY(mat[1], side);
VECCOPY(mat[2], nor);
@@ -4448,7 +4482,11 @@ void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float yvec[3]
void psys_apply_hair_lattice(Scene *scene, Object *ob, ParticleSystem *psys) {
- ParticleSimulationData sim = {scene, ob, psys, psys_get_modifier(ob, psys)};
+ ParticleSimulationData sim= {0};
+ sim.scene= scene;
+ sim.ob= ob;
+ sim.psys= psys;
+ sim.psmd= psys_get_modifier(ob, psys);
psys->lattice = psys_get_lattice(&sim);
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 47a220dcefb..2e2decdf84d 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -54,6 +54,7 @@
#include "DNA_ipo_types.h" // XXX old animation system stuff... to be removed!
#include "DNA_listBase.h"
+#include "BLI_edgehash.h"
#include "BLI_rand.h"
#include "BLI_jitter.h"
#include "BLI_math.h"
@@ -62,7 +63,10 @@
#include "BLI_kdopbvh.h"
#include "BLI_listbase.h"
#include "BLI_threads.h"
+#include "BLI_storage.h" /* For _LARGEFILE64_SOURCE; zlib needs this on some systems */
+#include "BLI_utildefines.h"
+#include "BKE_main.h"
#include "BKE_animsys.h"
#include "BKE_boids.h"
#include "BKE_cdderivedmesh.h"
@@ -71,7 +75,7 @@
#include "BKE_effect.h"
#include "BKE_particle.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
+
#include "BKE_DerivedMesh.h"
#include "BKE_object.h"
#include "BKE_material.h"
@@ -128,15 +132,28 @@ int psys_get_current_display_percentage(ParticleSystem *psys)
return psys->part->disp;
}
+static int tot_particles(ParticleSystem *psys, PTCacheID *pid)
+{
+ if(pid && psys->pointcache->flag & PTCACHE_EXTERNAL)
+ return pid->cache->totpoint;
+ else if(psys->part->distr == PART_DISTR_GRID && psys->part->from != PART_FROM_VERT)
+ return psys->part->grid_res * psys->part->grid_res * psys->part->grid_res - psys->totunexist;
+ else
+ return psys->part->totpart - psys->totunexist;
+}
+
void psys_reset(ParticleSystem *psys, int mode)
{
PARTICLE_P;
if(ELEM(mode, PSYS_RESET_ALL, PSYS_RESET_DEPSGRAPH)) {
if(mode == PSYS_RESET_ALL || !(psys->flag & PSYS_EDITED)) {
- psys_free_particles(psys);
+ /* don't free if not absolutely necessary */
+ if(psys->totpart != tot_particles(psys, NULL)) {
+ psys_free_particles(psys);
+ psys->totpart= 0;
+ }
- psys->totpart= 0;
psys->totkeyed= 0;
psys->flag &= ~(PSYS_HAIR_DONE|PSYS_KEYED);
@@ -166,6 +183,13 @@ void psys_reset(ParticleSystem *psys, int mode)
/* reset point cache */
BKE_ptcache_invalidate(psys->pointcache);
+
+ if(psys->fluid_springs) {
+ MEM_freeN(psys->fluid_springs);
+ psys->fluid_springs = NULL;
+ }
+
+ psys->tot_fluidsprings = psys->alloc_fluidsprings = 0;
}
static void realloc_particles(ParticleSimulationData *sim, int new_totpart)
@@ -197,8 +221,19 @@ static void realloc_particles(ParticleSimulationData *sim, int new_totpart)
if(totpart) {
newpars= MEM_callocN(totpart*sizeof(ParticleData), "particles");
- if(psys->part->phystype == PART_PHYS_BOIDS)
+ if(newpars == NULL)
+ return;
+
+ if(psys->part->phystype == PART_PHYS_BOIDS) {
newboids= MEM_callocN(totpart*sizeof(BoidParticle), "boid particles");
+
+ if(newboids == NULL) {
+ /* allocation error! */
+ if(newpars)
+ MEM_freeN(newpars);
+ return;
+ }
+ }
}
if(psys->particles) {
@@ -335,12 +370,17 @@ void psys_calc_dmcache(Object *ob, DerivedMesh *dm, ParticleSystem *psys)
/* cache the verts/faces! */
LOOP_PARTICLES {
+ if(pa->num < 0) {
+ pa->num_dmcache = -1;
+ continue;
+ }
+
if(psys->part->from == PART_FROM_VERT) {
if(nodearray[pa->num])
pa->num_dmcache= GET_INT_FROM_POINTER(nodearray[pa->num]->link);
}
else { /* FROM_FACE/FROM_VOLUME */
- /* Note that somtimes the pa->num is over the nodearray size, this is bad, maybe there is a better place to fix this,
+ /* Note that sometimes the pa->num is over the nodearray size, this is bad, maybe there is a better place to fix this,
* but for now passing NULL is OK. every face will be searched for the particle so its slower - Campbell */
pa->num_dmcache= psys_particle_dm_face_lookup(ob, dm, pa->num, pa->fuv, pa->num < totelem ? nodearray[pa->num] : NULL);
}
@@ -399,9 +439,14 @@ static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
size[(axis+1)%3] = MIN2(size[(axis+1)%3],res);
size[(axis+2)%3] = MIN2(size[(axis+2)%3],res);
- min[0]+=d/2.0f;
- min[1]+=d/2.0f;
- min[2]+=d/2.0f;
+ size[0] = MAX2(size[0], 1);
+ size[1] = MAX2(size[1], 1);
+ size[2] = MAX2(size[2], 1);
+
+ /* no full offset for flat/thin objects */
+ min[0]+= d < delta[0] ? d/2.f : delta[0]/2.f;
+ min[1]+= d < delta[1] ? d/2.f : delta[1]/2.f;
+ min[2]+= d < delta[2] ? d/2.f : delta[2]/2.f;
for(i=0,p=0,pa=psys->particles; i<res; i++){
for(j=0; j<res; j++){
@@ -438,13 +483,13 @@ static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
else if(ELEM(from,PART_FROM_FACE,PART_FROM_VOLUME)){
float co1[3], co2[3];
- MFace *mface=0;
+ MFace *mface= NULL, *mface_array;
float v1[3], v2[3], v3[3], v4[4], lambda;
int a, a1, a2, a0mul, a1mul, a2mul, totface;
int amax= from==PART_FROM_FACE ? 3 : 1;
totface=dm->getNumFaces(dm);
- mface=dm->getFaceDataArray(dm,CD_MFACE);
+ mface_array= dm->getFaceDataArray(dm,CD_MFACE);
for(a=0; a<amax; a++){
if(a==0){ a0mul=res*res; a1mul=res; a2mul=1; }
@@ -453,11 +498,11 @@ static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
for(a1=0; a1<size[(a+1)%3]; a1++){
for(a2=0; a2<size[(a+2)%3]; a2++){
- mface=dm->getFaceDataArray(dm,CD_MFACE);
+ mface= mface_array;
pa=psys->particles + a1*a1mul + a2*a2mul;
VECCOPY(co1,pa->fuv);
- co1[a]-=d/2.0f;
+ co1[a]-= d < delta[a] ? d/2.f : delta[a]/2.f;
VECCOPY(co2,co1);
co2[a]+=delta[a] + 0.001f*d;
co1[a]-=0.001f*d;
@@ -504,7 +549,7 @@ static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
}
if(psys->part->flag & PART_GRID_INVERT){
- for(i=0,pa=psys->particles; i<size[0]; i++){
+ for(i=0; i<size[0]; i++){
for(j=0; j<size[1]; j++){
pa=psys->particles + res*(i*res + j);
for(k=0; k<size[2]; k++, pa++){
@@ -513,6 +558,18 @@ static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
}
}
}
+
+ if(psys->part->grid_rand > 0.f) {
+ float rfac = d * psys->part->grid_rand;
+ for(p=0,pa=psys->particles; p<psys->totpart; p++,pa++){
+ if(pa->flag & PARS_UNEXIST)
+ continue;
+
+ pa->fuv[0] += rfac * (PSYS_FRAND(p + 31) - 0.5f);
+ pa->fuv[1] += rfac * (PSYS_FRAND(p + 32) - 0.5f);
+ pa->fuv[2] += rfac * (PSYS_FRAND(p + 33) - 0.5f);
+ }
+ }
}
/* modified copy from rayshade.c */
@@ -606,15 +663,21 @@ static void psys_uv_to_w(float u, float v, int quad, float *w)
}
}
+/* Find the index in "sum" array before "value" is crossed. */
static int binary_search_distribution(float *sum, int n, float value)
{
int mid, low=0, high=n;
+ if(value == 0.f)
+ return 0;
+
while(low <= high) {
mid= (low + high)/2;
- if(sum[mid] <= value && value <= sum[mid+1])
+
+ if(sum[mid] < value && value <= sum[mid+1])
return mid;
- else if(sum[mid] > value)
+
+ if(sum[mid] >= value)
high= mid - 1;
else if(sum[mid] < value)
low= mid + 1;
@@ -638,7 +701,7 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData
DerivedMesh *dm= ctx->dm;
ParticleData *tpa;
/* ParticleSettings *part= ctx->sim.psys->part; */
- float *v1, *v2, *v3, *v4, nor[3], orco1[3], co1[3], co2[3], nor1[3], ornor1[3];
+ float *v1, *v2, *v3, *v4, nor[3], orco1[3], co1[3], co2[3], nor1[3];
float cur_d, min_d, randu, randv;
int from= ctx->from;
int cfrom= ctx->cfrom;
@@ -775,20 +838,17 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData
if(ctx->tree){
KDTreeNearest ptn[10];
int w,maxw;//, do_seams;
- float maxd,mind,dd,totw=0.0;
+ float maxd,mind,/*dd,*/totw=0.0;
int parent[10];
float pweight[10];
- /*do_seams= (part->flag&PART_CHILD_SEAMS && ctx->seams);*/
-
- psys_particle_on_dm(dm,cfrom,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co1,nor1,0,0,orco1,ornor1);
+ psys_particle_on_dm(dm,cfrom,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co1,nor1,NULL,NULL,orco1,NULL);
transform_mesh_orco_verts((Mesh*)ob->data, &orco1, 1, 1);
- //maxw = BLI_kdtree_find_n_nearest(ctx->tree,(do_seams)?10:4,orco1,ornor1,ptn);
- maxw = BLI_kdtree_find_n_nearest(ctx->tree,4,orco1,ornor1,ptn);
+ maxw = BLI_kdtree_find_n_nearest(ctx->tree,4,orco1,NULL,ptn);
maxd=ptn[maxw-1].dist;
mind=ptn[0].dist;
- dd=maxd-mind;
+ /*dd=maxd-mind;*/ /*UNUSED*/
/* the weights here could be done better */
for(w=0; w<maxw; w++){
@@ -799,63 +859,6 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData
parent[w]=-1;
pweight[w]=0.0f;
}
- //if(do_seams){
- // ParticleSeam *seam=ctx->seams;
- // float temp[3],temp2[3],tan[3];
- // float inp,cur_len,min_len=10000.0f;
- // int min_seam=0, near_vert=0;
- // /* find closest seam */
- // for(i=0; i<ctx->totseam; i++, seam++){
- // sub_v3_v3v3(temp,co1,seam->v0);
- // inp=dot_v3v3(temp,seam->dir)/seam->length2;
- // if(inp<0.0f){
- // cur_len=len_v3v3(co1,seam->v0);
- // }
- // else if(inp>1.0f){
- // cur_len=len_v3v3(co1,seam->v1);
- // }
- // else{
- // copy_v3_v3(temp2,seam->dir);
- // mul_v3_fl(temp2,inp);
- // cur_len=len_v3v3(temp,temp2);
- // }
- // if(cur_len<min_len){
- // min_len=cur_len;
- // min_seam=i;
- // if(inp<0.0f) near_vert=-1;
- // else if(inp>1.0f) near_vert=1;
- // else near_vert=0;
- // }
- // }
- // seam=ctx->seams+min_seam;
- //
- // copy_v3_v3(temp,seam->v0);
- //
- // if(near_vert){
- // if(near_vert==-1)
- // sub_v3_v3v3(tan,co1,seam->v0);
- // else{
- // sub_v3_v3v3(tan,co1,seam->v1);
- // copy_v3_v3(temp,seam->v1);
- // }
-
- // normalize_v3(tan);
- // }
- // else{
- // copy_v3_v3(tan,seam->tan);
- // sub_v3_v3v3(temp2,co1,temp);
- // if(dot_v3v3(tan,temp2)<0.0f)
- // negate_v3(tan);
- // }
- // for(w=0; w<maxw; w++){
- // sub_v3_v3v3(temp2,ptn[w].co,temp);
- // if(dot_v3v3(tan,temp2)<0.0f){
- // parent[w]=-1;
- // pweight[w]=0.0f;
- // }
- // }
-
- //}
for(w=0,i=0; w<maxw && i<4; w++){
if(parent[w]>=0){
@@ -966,7 +969,7 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
DerivedMesh *dm= NULL;
float *jit= NULL;
int i, seed, p=0, totthread= threads[0].tot;
- int no_distr=0, cfrom=0;
+ int /*no_distr=0,*/ cfrom=0;
int tot=0, totpart, *index=0, children=0, totseam=0;
//int *vertpart=0;
int jitlevel= 1, distr;
@@ -991,6 +994,8 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
if(from==PART_FROM_CHILD){
distr=PART_DISTR_RAND;
+ BLI_srandom(31415926 + psys->seed + psys->child_seed);
+
if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
dm= finaldm;
children=1;
@@ -1007,50 +1012,6 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
totpart=get_psys_tot_child(scene, psys);
cfrom=from=PART_FROM_FACE;
-
- //if(part->flag&PART_CHILD_SEAMS){
- // MEdge *ed, *medge=dm->getEdgeDataArray(dm,CD_MEDGE);
- // MVert *mvert=dm->getVertDataArray(dm,CD_MVERT);
- // int totedge=dm->getNumEdges(dm);
-
- // for(p=0, ed=medge; p<totedge; p++,ed++)
- // if(ed->flag&ME_SEAM)
- // totseam++;
-
- // if(totseam){
- // ParticleSeam *cur_seam=seams=MEM_callocN(totseam*sizeof(ParticleSeam),"Child Distribution Seams");
- // float temp[3],temp2[3];
-
- // for(p=0, ed=medge; p<totedge; p++,ed++){
- // if(ed->flag&ME_SEAM){
- // copy_v3_v3(cur_seam->v0,(mvert+ed->v1)->co);
- // copy_v3_v3(cur_seam->v1,(mvert+ed->v2)->co);
-
- // sub_v3_v3v3(cur_seam->dir,cur_seam->v1,cur_seam->v0);
-
- // cur_seam->length2=len_v3(cur_seam->dir);
- // cur_seam->length2*=cur_seam->length2;
-
- // temp[0]=(float)((mvert+ed->v1)->no[0]);
- // temp[1]=(float)((mvert+ed->v1)->no[1]);
- // temp[2]=(float)((mvert+ed->v1)->no[2]);
- // temp2[0]=(float)((mvert+ed->v2)->no[0]);
- // temp2[1]=(float)((mvert+ed->v2)->no[1]);
- // temp2[2]=(float)((mvert+ed->v2)->no[2]);
-
- // add_v3_v3v3(cur_seam->nor,temp,temp2);
- // normalize_v3(cur_seam->nor);
-
- // cross_v3_v3v3(cur_seam->tan,cur_seam->dir,cur_seam->nor);
-
- // normalize_v3(cur_seam->tan);
-
- // cur_seam++;
- // }
- // }
- // }
- //
- //}
}
else{
/* no need to figure out distribution */
@@ -1095,7 +1056,7 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, get_mesh_orco_verts(ob));
distr=part->distr;
- pa=psys->particles;
+
if(from==PART_FROM_VERT){
MVert *mv= dm->getVertDataArray(dm, CD_MVERT);
float (*orcodata)[3]= dm->getVertDataArray(dm, CD_ORCO);
@@ -1140,7 +1101,7 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
}
if(tot==0){
- no_distr=1;
+ /*no_distr=1;*/ /*UNUSED*/
if(children){
if(G.f & G_DEBUG)
fprintf(stderr,"Particle child distribution error: Nothing to emit from!\n");
@@ -1287,7 +1248,8 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
float pos;
for(p=0; p<totpart; p++) {
- pos= BLI_frand();
+ /* In theory sys[tot] should be 1.0, but due to float errors this is not necessarily always true, so scale pos accordingly. */
+ pos= BLI_frand() * sum[tot];
index[p]= binary_search_distribution(sum, tot, pos);
index[p]= MIN2(tot-1, index[p]);
jitoff[index[p]]= pos;
@@ -1437,7 +1399,7 @@ static void distribute_particles_on_dm(ParticleSimulationData *sim, int from)
}
/* ready for future use, to emit particles without geometry */
-static void distribute_particles_on_shape(ParticleSimulationData *sim, int from)
+static void distribute_particles_on_shape(ParticleSimulationData *sim, int UNUSED(from))
{
ParticleSystem *psys = sim->psys;
PARTICLE_P;
@@ -1609,8 +1571,51 @@ static void initialize_all_particles(ParticleSimulationData *sim)
ParticleSystem *psys = sim->psys;
PARTICLE_P;
- LOOP_PARTICLES
+ psys->totunexist = 0;
+
+ LOOP_PARTICLES {
initialize_particle(sim, pa, p);
+ if(pa->flag & PARS_UNEXIST)
+ psys->totunexist++;
+ }
+
+ /* Free unexisting particles. */
+ if(psys->totpart && psys->totunexist == psys->totpart) {
+ if(psys->particles->boid)
+ MEM_freeN(psys->particles->boid);
+
+ MEM_freeN(psys->particles);
+ psys->particles = NULL;
+ psys->totpart = psys->totunexist = 0;
+ }
+
+ if(psys->totunexist) {
+ int newtotpart = psys->totpart - psys->totunexist;
+ ParticleData *npa, *newpars;
+
+ npa = newpars = MEM_callocN(newtotpart * sizeof(ParticleData), "particles");
+
+ for(p=0, pa=psys->particles; p<newtotpart; p++, pa++, npa++) {
+ while(pa->flag & PARS_UNEXIST)
+ pa++;
+
+ memcpy(npa, pa, sizeof(ParticleData));
+ }
+
+ if(psys->particles->boid)
+ MEM_freeN(psys->particles->boid);
+ MEM_freeN(psys->particles);
+ psys->particles = newpars;
+ psys->totpart -= psys->totunexist;
+
+ if(psys->particles->boid) {
+ BoidParticle *newboids = MEM_callocN(psys->totpart * sizeof(BoidParticle), "boid particles");
+
+ LOOP_PARTICLES
+ pa->boid = newboids++;
+
+ }
+ }
if(psys->part->type != PART_FLUID) {
#if 0 // XXX old animation system
@@ -1703,9 +1708,10 @@ void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime,
r_phase = PSYS_FRAND(p + 20);
if(part->from==PART_FROM_PARTICLE){
- ParticleSimulationData tsim = {sim->scene, psys->target_ob ? psys->target_ob : ob, NULL, NULL};
float speed;
-
+ ParticleSimulationData tsim= {0};
+ tsim.scene= sim->scene;
+ tsim.ob= psys->target_ob ? psys->target_ob : ob;
tsim.psys = BLI_findlink(&tsim.ob->particlesystem, sim->psys->target_psys-1);
state.time = pa->time;
@@ -2055,12 +2061,14 @@ void psys_count_keyed_targets(ParticleSimulationData *sim)
static void set_keyed_keys(ParticleSimulationData *sim)
{
ParticleSystem *psys = sim->psys;
- ParticleSimulationData ksim = {sim->scene, NULL, NULL, NULL};
+ ParticleSimulationData ksim= {0};
ParticleTarget *pt;
PARTICLE_P;
ParticleKey *key;
int totpart = psys->totpart, k, totkeys = psys->totkeyed;
+ ksim.scene= sim->scene;
+
/* no proper targets so let's clear and bail out */
if(psys->totkeyed==0) {
free_keyed_keys(psys);
@@ -2231,7 +2239,9 @@ void psys_make_temp_pointcache(Object *ob, ParticleSystem *psys)
if(cache->flag & PTCACHE_DISK_CACHE && cache->mem_cache.first == NULL) {
PTCacheID pid;
BKE_ptcache_id_from_particles(&pid, ob, psys);
+ cache->flag &= ~PTCACHE_DISK_CACHE;
BKE_ptcache_disk_to_mem(&pid);
+ cache->flag |= PTCACHE_DISK_CACHE;
}
}
static void psys_clear_temp_pointcache(ParticleSystem *psys)
@@ -2283,136 +2293,241 @@ static void psys_update_effectors(ParticleSimulationData *sim)
precalc_guides(sim, sim->psys->effectors);
}
-/*************************************************
+/*********************************************************************************************************
SPH fluid physics
- In theory, there could be unlimited implementation
- of SPH simulators
-**************************************************/
-void particle_fluidsim(ParticleSystem *psys, ParticleData *pa, ParticleSettings *part, ParticleSimulationData *sim, float dfra, float cfra, float mass){
-/****************************************************************************************************************
-* This code uses in some parts adapted algorithms from the pseduo code as outlined in the Research paper
-* Titled: Particle-based Viscoelastic Fluid Simulation.
-* Authors: Simon Clavet, Philippe Beaudoin and Pierre Poulin
-*
-* Website: http://www.iro.umontreal.ca/labs/infographie/papers/Clavet-2005-PVFS/
-* Presented at Siggraph, (2005)
-*
-*****************************************************************************************************************/
- KDTree *tree = psys->tree;
+ In theory, there could be unlimited implementation of SPH simulators
+
+ This code uses in some parts adapted algorithms from the pseudo code as outlined in the Research paper:
+
+ Titled: Particle-based Viscoelastic Fluid Simulation.
+ Authors: Simon Clavet, Philippe Beaudoin and Pierre Poulin
+ Website: http://www.iro.umontreal.ca/labs/infographie/papers/Clavet-2005-PVFS/
+
+ Presented at Siggraph, (2005)
+
+***********************************************************************************************************/
+#define PSYS_FLUID_SPRINGS_INITIAL_SIZE 256
+ParticleSpring *add_fluid_spring(ParticleSystem *psys, ParticleSpring *spring)
+{
+ /* Are more refs required? */
+ if(psys->alloc_fluidsprings == 0 || psys->fluid_springs == NULL) {
+ psys->alloc_fluidsprings = PSYS_FLUID_SPRINGS_INITIAL_SIZE;
+ psys->fluid_springs = (ParticleSpring*)MEM_callocN(psys->alloc_fluidsprings * sizeof(ParticleSpring), "Particle Fluid Springs");
+ }
+ else if(psys->tot_fluidsprings == psys->alloc_fluidsprings) {
+ /* Double the number of refs allocated */
+ psys->alloc_fluidsprings *= 2;
+ psys->fluid_springs = (ParticleSpring*)MEM_reallocN(psys->fluid_springs, psys->alloc_fluidsprings * sizeof(ParticleSpring));
+ }
+
+ memcpy(psys->fluid_springs + psys->tot_fluidsprings, spring, sizeof(ParticleSpring));
+ psys->tot_fluidsprings++;
+
+ return psys->fluid_springs + psys->tot_fluidsprings - 1;
+}
+
+void delete_fluid_spring(ParticleSystem *psys, int j)
+{
+ if (j != psys->tot_fluidsprings - 1)
+ psys->fluid_springs[j] = psys->fluid_springs[psys->tot_fluidsprings - 1];
+
+ psys->tot_fluidsprings--;
+
+ if (psys->tot_fluidsprings < psys->alloc_fluidsprings/2 && psys->alloc_fluidsprings > PSYS_FLUID_SPRINGS_INITIAL_SIZE){
+ psys->alloc_fluidsprings /= 2;
+ psys->fluid_springs = (ParticleSpring*)MEM_reallocN(psys->fluid_springs, psys->alloc_fluidsprings * sizeof(ParticleSpring));
+ }
+}
+
+EdgeHash *build_fluid_springhash(ParticleSystem *psys)
+{
+ EdgeHash *springhash = NULL;
+ ParticleSpring *spring;
+ int i = 0;
+
+ springhash = BLI_edgehash_new();
+
+ for(i=0, spring=psys->fluid_springs; i<psys->tot_fluidsprings; i++, spring++)
+ BLI_edgehash_insert(springhash, spring->particle_index[0], spring->particle_index[1], SET_INT_IN_POINTER(i+1));
+
+ return springhash;
+}
+static void particle_fluidsim(ParticleSystem *psys, int own_psys, ParticleData *pa, float dtime, float mass, float *gravity, EdgeHash *springhash)
+{
+ SPHFluidSettings *fluid = psys->part->fluid;
KDTreeNearest *ptn = NULL;
-
- SPHFluidSettings *fluid = part->fluid;
- ParticleData *second_particle;
+ ParticleData *npa;
+ ParticleSpring *spring = NULL;
- float start[3], end[3], v[3];
float temp[3];
- float q, radius, D;
- float p, pnear, pressure_near, pressure;
- float dtime = dfra * psys_get_timestep(sim);
+ float q, q1, u, I, D, rij, d, Lij;
+ float pressure_near, pressure;
+ float p=0, pnear=0;
+
float omega = fluid->viscosity_omega;
- float beta = fluid->viscosity_omega;
+ float beta = fluid->viscosity_beta;
float massfactor = 1.0f/mass;
- int n, neighbours;
+ float spring_k = fluid->spring_k;
+ float h = fluid->radius;
+ float L = fluid->rest_length * fluid->radius;
-
- radius = fluid->radius;
+ int n, neighbours = BLI_kdtree_range_search(psys->tree, h, pa->prev_state.co, NULL, &ptn);
+ int spring_index = 0, index = own_psys ? pa - psys->particles : -1;
- VECCOPY(start, pa->prev_state.co);
- VECCOPY(end, pa->state.co);
+ /* pressure and near pressure */
+ for(n=own_psys?1:0; n<neighbours; n++) {
+ sub_v3_v3(ptn[n].co, pa->prev_state.co);
+ mul_v3_fl(ptn[n].co, 1.f/ptn[n].dist);
+ q = ptn[n].dist/h;
- VECCOPY(v, pa->state.vel);
+ if(q < 1.f) {
+ q1 = 1.f - q;
- neighbours = BLI_kdtree_range_search(tree, radius, start, NULL, &ptn);
-
- /* use ptn[n].co to store relative direction */
- for(n=1; n<neighbours; n++) {
- sub_v3_v3(ptn[n].co, start);
- normalize_v3(ptn[n].co);
- }
-
- /* Viscosity - Algorithm 5 */
- if (omega > 0.f || beta > 0.f) {
- float u, I;
-
- for(n=1; n<neighbours; n++) {
- second_particle = psys->particles + ptn[n].index;
- q = ptn[n].dist/radius;
-
- sub_v3_v3v3(temp, v, second_particle->prev_state.vel);
-
- u = dot_v3v3(ptn[n].co, temp);
-
- if (u > 0){
- I = dtime * ((1-q) * (omega * u + beta * u*u)) * 0.5f;
- madd_v3_v3fl(v, ptn[n].co, -I * massfactor);
- }
- }
- }
-
- /* Hooke's spring force */
- if (fluid->spring_k > 0.f) {
- float D, L = fluid->rest_length;
- for(n=1; n<neighbours; n++) {
- /* L is a factor of radius */
- D = dtime * 10.f * fluid->spring_k * (1.f - L) * (L - ptn[n].dist/radius);
- madd_v3_v3fl(v, ptn[n].co, -D * massfactor);
+ p += q1*q1;
+ pnear += q1*q1*q1;
}
}
- /* Update particle position */
- VECADDFAC(end, start, v, dtime);
- /* Double Density Relaxation - Algorithm 2 */
- p = 0;
- pnear = 0;
- for(n=1; n<neighbours; n++) {
- q = ptn[n].dist/radius;
- p += ((1-q)*(1-q));
- pnear += ((1-q)*(1-q)*(1-q));
- }
- p *= part->mass;
- pnear *= part->mass;
+ p *= mass;
+ pnear *= mass;
pressure = fluid->stiffness_k * (p - fluid->rest_density);
pressure_near = fluid->stiffness_knear * pnear;
- for(n=1; n<neighbours; n++) {
- q = ptn[n].dist/radius;
+ /* main calculations */
+ for(n=own_psys?1:0; n<neighbours; n++) {
+ npa = psys->particles + ptn[n].index;
+
+ rij = ptn[n].dist;
+ q = rij/h;
+ q1 = 1.f-q;
- D = dtime * dtime * (pressure*(1-q) + pressure_near*(1-q)*(1-q))* 0.5f;
- madd_v3_v3fl(end, ptn[n].co, -D * massfactor);
- }
+ /* Double Density Relaxation - Algorithm 2 (can't be thread safe!)*/
+ D = dtime * dtime * (pressure + pressure_near*q1)*q1 * 0.5f;
+ madd_v3_v3fl(pa->state.co, ptn[n].co, -D * massfactor);
+ if(own_psys)
+ madd_v3_v3fl(npa->state.co, ptn[n].co, D * massfactor);
+
+ if(index < ptn[n].index) {
+ /* Viscosity - Algorithm 5 */
+ if(omega > 0.f || beta > 0.f) {
+ sub_v3_v3v3(temp, pa->state.vel, npa->state.vel);
+ u = dot_v3v3(ptn[n].co, temp);
+
+ if (u > 0){
+ I = dtime * (q1 * (omega * u + beta * u*u)) * 0.5f;
+ madd_v3_v3fl(pa->state.vel, ptn[n].co, -I * massfactor);
+
+ if(own_psys)
+ madd_v3_v3fl(npa->state.vel, ptn[n].co, I * massfactor);
+ }
+ }
+
+ if(spring_k > 0.f) {
+ /* Viscoelastic spring force - Algorithm 4*/
+ if (fluid->flag & SPH_VISCOELASTIC_SPRINGS && springhash){
+ spring_index = GET_INT_FROM_POINTER(BLI_edgehash_lookup(springhash, index, ptn[n].index));
+
+ if(spring_index) {
+ spring = psys->fluid_springs + spring_index - 1;
+ }
+ else {
+ ParticleSpring temp_spring;
+ temp_spring.particle_index[0] = index;
+ temp_spring.particle_index[1] = ptn[n].index;
+ temp_spring.rest_length = (fluid->flag & SPH_CURRENT_REST_LENGTH) ? rij : L;
+ temp_spring.delete_flag = 0;
+
+ spring = add_fluid_spring(psys, &temp_spring);
+ }
+
+ Lij = spring->rest_length;
+ d = fluid->yield_ratio * Lij;
+
+ if (rij > Lij + d) // Stretch, 25 is just a multiplier for plasticity_constant value to counter default dtime of 1/25
+ spring->rest_length += dtime * 25.f * fluid->plasticity_constant * (rij - Lij - d);
+ else if(rij < Lij - d) // Compress
+ spring->rest_length -= dtime * 25.f * fluid->plasticity_constant * (Lij - d - rij);
+ }
+ else { /* PART_SPRING_HOOKES - Hooke's spring force */
+ /* L is a factor of radius */
+ D = 0.5 * dtime * dtime * 10.f * fluid->spring_k * (1.f - L/h) * (L - rij);
+
+ madd_v3_v3fl(pa->state.co, ptn[n].co, -D * massfactor);
+ if(own_psys)
+ madd_v3_v3fl(npa->state.co, ptn[n].co, D * massfactor);
+ }
+ }
+ }
+ }
/* Artificial buoyancy force in negative gravity direction */
- if (fluid->buoyancy >= 0.f && psys_uses_gravity(sim)) {
+ if (fluid->buoyancy >= 0.f && gravity) {
float B = -dtime * dtime * fluid->buoyancy * (p - fluid->rest_density) * 0.5f;
- madd_v3_v3fl(end, sim->scene->physics_settings.gravity, -B * massfactor);
+ madd_v3_v3fl(pa->state.co, gravity, -B * massfactor);
}
- /* apply final result and recalculate velocity */
- VECCOPY(pa->state.co, end);
- sub_v3_v3v3(pa->state.vel, end, start);
- mul_v3_fl(pa->state.vel, 1.f/dtime);
-
- if(ptn){ MEM_freeN(ptn); ptn=NULL;}
+ if(ptn)
+ MEM_freeN(ptn);
}
-static void apply_particle_fluidsim(ParticleSystem *psys, ParticleData *pa, ParticleSettings *part, ParticleSimulationData *sim, float dfra, float cfra){
+static void apply_particle_fluidsim(Object *ob, ParticleSystem *psys, ParticleData *pa, float dtime, float *gravity, EdgeHash *springhash){
ParticleTarget *pt;
-// float dtime = dfra*psys_get_timestep(sim);
- float particle_mass = part->mass;
- particle_fluidsim(psys, pa, part, sim, dfra, cfra, particle_mass);
+ particle_fluidsim(psys, 1, pa, dtime, psys->part->mass, gravity, springhash);
/*----check other SPH systems (Multifluids) , each fluid has its own parameters---*/
- for(pt=sim->psys->targets.first; pt; pt=pt->next) {
- ParticleSystem *epsys = psys_get_target_system(sim->ob, pt);
+ for(pt=psys->targets.first; pt; pt=pt->next) {
+ ParticleSystem *epsys = psys_get_target_system(ob, pt);
if(epsys)
- particle_fluidsim(epsys, pa, epsys->part, sim, dfra, cfra, particle_mass);
+ particle_fluidsim(epsys, 0, pa, dtime, psys->part->mass, gravity, NULL);
}
/*----------------------------------------------------------------*/
}
+static void apply_fluid_springs(ParticleSystem *psys, float timestep){
+ SPHFluidSettings *fluid = psys->part->fluid;
+ ParticleData *pa1, *pa2;
+ ParticleSpring *spring = psys->fluid_springs;
+
+ float h = fluid->radius;
+ float massfactor = 1.0f/psys->part->mass;
+ float D, Rij[3], rij, Lij;
+ int i;
+
+ if((fluid->flag & SPH_VISCOELASTIC_SPRINGS)==0 || fluid->spring_k == 0.f)
+ return;
+
+ /* Loop through the springs */
+ for(i=0; i<psys->tot_fluidsprings; i++, spring++) {
+ Lij = spring->rest_length;
+
+ if (Lij > h) {
+ spring->delete_flag = 1;
+ }
+ else {
+ pa1 = psys->particles + spring->particle_index[0];
+ pa2 = psys->particles + spring->particle_index[1];
+
+ sub_v3_v3v3(Rij, pa2->prev_state.co, pa1->prev_state.co);
+ rij = normalize_v3(Rij);
+
+ /* Calculate displacement and apply value */
+ D = 0.5f * timestep * timestep * 10.f * fluid->spring_k * (1.f - Lij/h) * (Lij - rij);
+
+ madd_v3_v3fl(pa1->state.co, Rij, -D * pa1->state.time * pa1->state.time * massfactor);
+ madd_v3_v3fl(pa2->state.co, Rij, D * pa2->state.time * pa2->state.time * massfactor);
+ }
+ }
+
+ /* Loop through springs backwaqrds - for efficient delete function */
+ for (i=psys->tot_fluidsprings-1; i >= 0; i--) {
+ if(psys->fluid_springs[i].delete_flag)
+ delete_fluid_spring(psys, i);
+ }
+}
+
/************************************************/
/* Newtonian physics */
/************************************************/
@@ -2425,7 +2540,7 @@ static void apply_particle_forces(ParticleSimulationData *sim, int p, float dfra
ParticleKey states[5], tkey;
float timestep = psys_get_timestep(sim);
float force[3],impulse[3],dx[4][3],dv[4][3],oldpos[3];
- float dtime=dfra*timestep, time, pa_mass=part->mass, fac, fra=sim->psys->cfra;
+ float dtime=dfra*timestep, time, pa_mass=part->mass, fac /*, fra=sim->psys->cfra*/;
int i, steps=1;
/* maintain angular velocity */
@@ -2498,7 +2613,7 @@ static void apply_particle_forces(ParticleSimulationData *sim, int p, float dfra
if(i==0){
VECADDFAC(states[1].co,states->co,states->vel,dtime*0.5f);
VECADDFAC(states[1].vel,states->vel,force,dtime*0.5f);
- fra=sim->psys->cfra+0.5f*dfra;
+ /*fra=sim->psys->cfra+0.5f*dfra;*/
}
else{
VECADDFAC(pa->state.co,states->co,states[1].vel,dtime);
@@ -2515,7 +2630,7 @@ static void apply_particle_forces(ParticleSimulationData *sim, int p, float dfra
VECADDFAC(states[1].co,states->co,dx[0],0.5f);
VECADDFAC(states[1].vel,states->vel,dv[0],0.5f);
- fra=sim->psys->cfra+0.5f*dfra;
+ /*fra=sim->psys->cfra+0.5f*dfra;*/
break;
case 1:
VECADDFAC(dx[1],states->vel,dv[0],0.5f);
@@ -2534,7 +2649,7 @@ static void apply_particle_forces(ParticleSimulationData *sim, int p, float dfra
VECADD(states[3].co,states->co,dx[2]);
VECADD(states[3].vel,states->vel,dv[2]);
- fra=cfra;
+ /*fra=cfra;*/
break;
case 3:
VECADD(dx[3],states->vel,dv[2]);
@@ -2775,23 +2890,26 @@ void particle_intersect_face(void *userdata, int index, const BVHTreeRay *ray, B
MVert *x = col->md->x;
MVert *v = col->md->current_v;
float vel[3], co1[3], co2[3], uv[2], ipoint[3], temp[3], t;
+ float x0[3], x1[3], x2[3], x3[3];
+ float *t0=x0, *t1=x1, *t2=x2, *t3=(face->v4 ? x3 : NULL);
- float *t0, *t1, *t2, *t3;
- t0 = x[ face->v1 ].co;
- t1 = x[ face->v2 ].co;
- t2 = x[ face->v3 ].co;
- t3 = face->v4 ? x[ face->v4].co : NULL;
+ /* move collision face to start of timestep */
+ madd_v3_v3v3fl(t0, x[face->v1].co, v[face->v1].co, col->cfra);
+ madd_v3_v3v3fl(t1, x[face->v2].co, v[face->v2].co, col->cfra);
+ madd_v3_v3v3fl(t2, x[face->v3].co, v[face->v3].co, col->cfra);
+ if(t3)
+ madd_v3_v3v3fl(t3, x[face->v4].co, v[face->v4].co, col->cfra);
/* calculate average velocity of face */
- VECCOPY(vel, v[ face->v1 ].co);
- VECADD(vel, vel, v[ face->v2 ].co);
- VECADD(vel, vel, v[ face->v3 ].co);
- mul_v3_fl(vel, 0.33334f);
+ copy_v3_v3(vel, v[ face->v1 ].co);
+ add_v3_v3(vel, v[ face->v2 ].co);
+ add_v3_v3(vel, v[ face->v3 ].co);
+ mul_v3_fl(vel, 0.33334f*col->dfra);
/* substract face velocity, in other words convert to
a coordinate system where only the particle moves */
- VECADDFAC(co1, col->co1, vel, -col->t);
- VECSUB(co2, col->co2, vel);
+ madd_v3_v3v3fl(co1, col->co1, vel, -col->f);
+ sub_v3_v3v3(co2, col->co2, vel);
do
{
@@ -2873,7 +2991,7 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo
copy_v3_v3(col.co2, pa->state.co);
copy_v3_v3(col.ve1, pa->prev_state.vel);
copy_v3_v3(col.ve2, pa->state.vel);
- col.t = 0.0f;
+ col.f = 0.0f;
/* override for boids */
if(part->phystype == PART_PHYS_BOIDS) {
@@ -2891,6 +3009,9 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo
hit.index = -1;
hit.dist = col.ray_len = len_v3(ray_dir);
+ col.cfra = fmod(cfra-dfra, 1.0f);
+ col.dfra = dfra;
+
/* even if particle is stationary we want to check for moving colliders */
/* if hit.dist is zero the bvhtree_ray_cast will just ignore everything */
if(hit.dist == 0.0f)
@@ -2915,11 +3036,11 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo
/* 2. */
if(hit.index>=0) {
PartDeflect *pd = col.hit_ob->pd;
- float co[3]; /* point of collision */
- float x = hit.dist/col.ray_len; /* location of collision between this iteration */
- float df = col.t + x * (1.0f - col.t); /* time of collision between frame change*/
- float dt1 = (df - col.t) * timestep; /* iteration time of collision (in seconds) */
- float dt2 = (1.0f - df) * timestep; /* time left after collision (in seconds) */
+ float co[3]; /* point of collision */
+ float x = hit.dist/col.ray_len; /* location factor of collision between this iteration */
+ float f = col.f + x * (1.0f - col.f); /* time factor of collision between timestep */
+ float dt1 = (f - col.f) * timestep; /* time since previous collision (in seconds) */
+ float dt2 = (1.0f - f) * timestep; /* time left after collision (in seconds) */
int through = (BLI_frand() < pd->pdef_perm) ? 1 : 0; /* did particle pass through the collision surface? */
deflections++;
@@ -2933,12 +3054,12 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo
/* particle dies in collision */
if(through == 0 && (part->flag & PART_DIE_ON_COL || pd->flag & PDEFLE_KILL_PART)) {
pa->alive = PARS_DYING;
- pa->dietime = pa->state.time + (cfra - pa->state.time) * df;
+ pa->dietime = sim->psys->cfra + (cfra - sim->psys->cfra) * f;
copy_v3_v3(pa->state.co, co);
- interp_v3_v3v3(pa->state.vel, pa->prev_state.vel, pa->state.vel, df);
- interp_qt_qtqt(pa->state.rot, pa->prev_state.rot, pa->state.rot, df);
- interp_v3_v3v3(pa->state.ave, pa->prev_state.ave, pa->state.ave, df);
+ interp_v3_v3v3(pa->state.vel, pa->prev_state.vel, pa->state.vel, f);
+ interp_qt_qtqt(pa->state.rot, pa->prev_state.rot, pa->state.rot, f);
+ interp_v3_v3v3(pa->state.ave, pa->prev_state.ave, pa->state.ave, f);
/* particle is dead so we don't need to calculate further */
return;
@@ -3071,11 +3192,11 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo
copy_v3_v3(col.ve1, v0);
copy_v3_v3(col.ve2, pa->state.vel);
- col.t = df;
+ col.f = f;
}
else {
- /* final chance to prevent failure, so don't do anything fancy */
- copy_v3_v3(pa->state.co, co);
+ /* final chance to prevent failure, so stick to the surface and hope for the best */
+ madd_v3_v3v3fl(pa->state.co, co, col.vel, dt2);
copy_v3_v3(pa->state.vel, v0);
}
}
@@ -3259,7 +3380,7 @@ static void do_hair_dynamics(ParticleSimulationData *sim)
psys->clmd->point_cache = psys->pointcache;
psys->clmd->sim_parms->effector_weights = psys->part->effector_weights;
- psys->hair_out_dm = clothModifier_do(psys->clmd, sim->scene, sim->ob, dm, 0, 0);
+ psys->hair_out_dm = clothModifier_do(psys->clmd, sim->scene, sim->ob, dm);
psys->clmd->sim_parms->effector_weights = NULL;
}
@@ -3284,11 +3405,11 @@ static void hair_step(ParticleSimulationData *sim, float cfra)
psys_calc_dmcache(sim->ob, sim->psmd->dm, psys);
if(psys->clmd)
- cloth_free_modifier(sim->ob, psys->clmd);
+ cloth_free_modifier(psys->clmd);
}
- /* dynamics with cloth simulation */
- if(psys->part->type==PART_HAIR && psys->flag & PSYS_HAIR_DYNAMICS)
+ /* dynamics with cloth simulation, psys->particles can be NULL with 0 particles [#25519] */
+ if(psys->part->type==PART_HAIR && psys->flag & PSYS_HAIR_DYNAMICS && psys->particles)
do_hair_dynamics(sim);
/* following lines were removed r29079 but cause bug [#22811], see report for details */
@@ -3298,20 +3419,17 @@ static void hair_step(ParticleSimulationData *sim, float cfra)
psys->flag |= PSYS_HAIR_UPDATED;
}
-static void save_hair(ParticleSimulationData *sim, float cfra){
+static void save_hair(ParticleSimulationData *sim, float UNUSED(cfra)){
Object *ob = sim->ob;
ParticleSystem *psys = sim->psys;
HairKey *key, *root;
PARTICLE_P;
- int totpart;
invert_m4_m4(ob->imat, ob->obmat);
psys->lattice= psys_get_lattice(sim);
if(psys->totpart==0) return;
-
- totpart=psys->totpart;
/* save new keys for elements if needed */
LOOP_PARTICLES {
@@ -3355,20 +3473,15 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
BoidBrainData bbd;
PARTICLE_P;
float timestep;
- /* current time */
- float ctime;
/* frame & time changes */
- float dfra, dtime, pa_dtime, pa_dfra=0.0;
+ float dfra, dtime;
float birthtime, dietime;
-
- int invalidParticles=0;
/* where have we gone in time since last time */
dfra= cfra - psys->cfra;
timestep = psys_get_timestep(sim);
dtime= dfra*timestep;
- ctime= cfra*timestep;
if(dfra<0.0){
LOOP_EXISTING_PARTICLES {
@@ -3386,35 +3499,42 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
psys_update_effectors(sim);
if(part->type != PART_HAIR)
- sim->colliders = get_collider_cache(sim->scene, NULL, NULL);
+ sim->colliders = get_collider_cache(sim->scene, sim->ob, NULL);
- if(part->phystype==PART_PHYS_BOIDS){
- ParticleTarget *pt = psys->targets.first;
- bbd.sim = sim;
- bbd.part = part;
- bbd.cfra = cfra;
- bbd.dfra = dfra;
- bbd.timestep = timestep;
+ /* initialize physics type specific stuff */
+ switch(part->phystype) {
+ case PART_PHYS_BOIDS:
+ {
+ ParticleTarget *pt = psys->targets.first;
+ bbd.sim = sim;
+ bbd.part = part;
+ bbd.cfra = cfra;
+ bbd.dfra = dfra;
+ bbd.timestep = timestep;
- psys_update_particle_tree(psys, cfra);
+ psys_update_particle_tree(psys, cfra);
- boids_precalc_rules(part, cfra);
+ boids_precalc_rules(part, cfra);
- for(; pt; pt=pt->next) {
- if(pt->ob)
- psys_update_particle_tree(BLI_findlink(&pt->ob->particlesystem, pt->psys-1), cfra);
+ for(; pt; pt=pt->next) {
+ if(pt->ob)
+ psys_update_particle_tree(BLI_findlink(&pt->ob->particlesystem, pt->psys-1), cfra);
+ }
+ break;
}
- }
- else if(part->phystype==PART_PHYS_FLUID){
- ParticleTarget *pt = psys->targets.first;
- psys_update_particle_tree(psys, cfra);
-
- for(; pt; pt=pt->next) { /* Updating others systems particle tree for fluid-fluid interaction */
- if(pt->ob) psys_update_particle_tree(BLI_findlink(&pt->ob->particlesystem, pt->psys-1), cfra);
+ case PART_PHYS_FLUID:
+ {
+ ParticleTarget *pt = psys->targets.first;
+ psys_update_particle_tree(psys, cfra);
+
+ for(; pt; pt=pt->next) { /* Updating others systems particle tree for fluid-fluid interaction */
+ if(pt->ob)
+ psys_update_particle_tree(BLI_findlink(&pt->ob->particlesystem, pt->psys-1), cfra);
+ }
+ break;
}
}
-
- /* main loop: calculate physics for all particles */
+ /* initialize all particles for dynamics */
LOOP_SHOWN_PARTICLES {
copy_particle_key(&pa->prev_state,&pa->state,1);
@@ -3422,29 +3542,22 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
if(part->randsize > 0.0)
pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1);
- ///* reactions can change birth time so they need to be checked first */
- //if(psys->reactevents.first && ELEM(pa->alive,PARS_DEAD,PARS_KILLED)==0)
- // react_to_events(psys,p);
-
birthtime = pa->time;
dietime = birthtime + pa->lifetime;
- pa_dfra = dfra;
- pa_dtime = dtime;
-
+ /* store this, so we can do multiple loops over particles */
+ pa->state.time = dfra;
if(dietime <= cfra && psys->cfra < dietime){
/* particle dies some time between this and last step */
- pa_dfra = dietime - ((birthtime > psys->cfra) ? birthtime : psys->cfra);
- pa_dtime = pa_dfra * timestep;
+ pa->state.time = dietime - ((birthtime > psys->cfra) ? birthtime : psys->cfra);
pa->alive = PARS_DYING;
}
else if(birthtime <= cfra && birthtime >= psys->cfra){
/* particle is born some time between this and last step*/
- reset_particle(sim, pa, dtime, cfra);
+ reset_particle(sim, pa, dfra*timestep, cfra);
pa->alive = PARS_ALIVE;
- pa_dfra = cfra - birthtime;
- pa_dtime = pa_dfra*timestep;
+ pa->state.time = cfra - birthtime;
}
else if(dietime < cfra){
/* nothing to be done when particle is dead */
@@ -3457,62 +3570,98 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
else if(part->phystype == PART_PHYS_NO)
reset_particle(sim, pa, dtime, cfra);
- if(pa_dfra>0.0 && ELEM(pa->alive,PARS_ALIVE,PARS_DYING)){
- switch(part->phystype){
- case PART_PHYS_NEWTON:
- /* do global forces & effectors */
- apply_particle_forces(sim, p, pa_dfra, cfra);
-
+ if(ELEM(pa->alive, PARS_ALIVE, PARS_DYING)==0 || (pa->flag & (PARS_UNEXIST|PARS_NO_DISP)))
+ pa->state.time = -1.f;
+ }
+
+ switch(part->phystype) {
+ case PART_PHYS_NEWTON:
+ {
+ LOOP_DYNAMIC_PARTICLES {
+ /* do global forces & effectors */
+ apply_particle_forces(sim, p, pa->state.time, cfra);
+
+ /* deflection */
+ if(sim->colliders)
+ deflect_particle(sim, p, pa->state.time, cfra);
+
+ /* rotations */
+ rotate_particle(part, pa, pa->state.time, timestep);
+ }
+ break;
+ }
+ case PART_PHYS_BOIDS:
+ {
+ LOOP_DYNAMIC_PARTICLES {
+ bbd.goal_ob = NULL;
+
+ boid_brain(&bbd, p, pa);
+
+ if(pa->alive != PARS_DYING) {
+ boid_body(&bbd, pa);
+
/* deflection */
if(sim->colliders)
- deflect_particle(sim, p, pa_dfra, cfra);
-
- /* rotations */
- rotate_particle(part, pa, pa_dfra, timestep);
- break;
- case PART_PHYS_BOIDS:
- {
- bbd.goal_ob = NULL;
- boid_brain(&bbd, p, pa);
- if(pa->alive != PARS_DYING) {
- boid_body(&bbd, pa);
-
- /* deflection */
- if(sim->colliders)
- deflect_particle(sim, p, pa_dfra, cfra);
- }
- break;
+ deflect_particle(sim, p, pa->state.time, cfra);
}
- case PART_PHYS_FLUID:
- {
- /* do global forces & effectors */
- apply_particle_forces(sim, p, pa_dfra, cfra);
+ }
+ break;
+ }
+ case PART_PHYS_FLUID:
+ {
+ EdgeHash *springhash = build_fluid_springhash(psys);
+ float *gravity = NULL;
- /* do fluid sim */
- apply_particle_fluidsim(psys, pa, part, sim, pa_dfra, cfra);
+ if(psys_uses_gravity(sim))
+ gravity = sim->scene->physics_settings.gravity;
- /* deflection */
- if(sim->colliders)
- deflect_particle(sim, p, pa_dfra, cfra);
-
- /* rotations, SPH particles are not physical particles, just interpolation particles, thus rotation has not a direct sense for them */
- rotate_particle(part, pa, pa_dfra, timestep);
- break;
- }
+ /* do global forces & effectors */
+ LOOP_DYNAMIC_PARTICLES {
+ apply_particle_forces(sim, p, pa->state.time, cfra);
+ /* in fluids forces only effect velocity */
+ copy_v3_v3(pa->state.co, pa->prev_state.co);
+ }
+
+ /* actual fluids calculations (not threadsafe!) */
+ LOOP_DYNAMIC_PARTICLES {
+ apply_particle_fluidsim(sim->ob, psys, pa, pa->state.time*timestep, gravity, springhash);
}
- if(pa->alive == PARS_DYING){
- //push_reaction(ob,psys,p,PART_EVENT_DEATH,&pa->state);
+ /* Apply springs to particles */
+ apply_fluid_springs(psys, timestep);
- pa->alive=PARS_DEAD;
- pa->state.time=pa->dietime;
+ /* apply velocity, collisions and rotation */
+ LOOP_DYNAMIC_PARTICLES {
+ /* velocity holds forces and viscosity, so apply them before collisions */
+ madd_v3_v3fl(pa->state.co, pa->state.vel, pa->state.time*timestep);
+
+ /* calculate new velocity based on new-old location */
+ sub_v3_v3v3(pa->state.vel, pa->state.co, pa->prev_state.co);
+ mul_v3_fl(pa->state.vel, 1.f/(pa->state.time*timestep));
+
+ if(sim->colliders)
+ deflect_particle(sim, p, pa->state.time, cfra);
+
+ /* SPH particles are not physical particles, just interpolation particles, thus rotation has not a direct sense for them */
+ rotate_particle(part, pa, pa->state.time, timestep);
}
- else
- pa->state.time=cfra;
- //push_reaction(ob,psys,p,PART_EVENT_NEAR,&pa->state);
+ if(springhash) {
+ BLI_edgehash_free(springhash, NULL);
+ springhash = NULL;
+ }
+ break;
}
- if (isnan(pa->state.co[0]) || isnan(pa->state.co[1]) || isnan(pa->state.co[2])) {invalidParticles++;}
+ }
+
+ /* finalize particle state and time after dynamics */
+ LOOP_DYNAMIC_PARTICLES {
+ if(pa->alive == PARS_DYING){
+ pa->alive=PARS_DEAD;
+ pa->state.time=pa->dietime;
+ }
+ else
+ pa->state.time=cfra;
}
free_collider_cache(&sim->colliders);
@@ -3522,8 +3671,12 @@ static void update_children(ParticleSimulationData *sim)
if((sim->psys->part->type == PART_HAIR) && (sim->psys->flag & PSYS_HAIR_DONE)==0)
/* don't generate children while growing hair - waste of time */
psys_free_children(sim->psys);
- else if(sim->psys->part->childtype && sim->psys->totchild != get_psys_tot_child(sim->scene, sim->psys))
- distribute_particles(sim, PART_FROM_CHILD);
+ else if(sim->psys->part->childtype) {
+ if(sim->psys->totchild != get_psys_tot_child(sim->scene, sim->psys))
+ distribute_particles(sim, PART_FROM_CHILD);
+ else
+ ; /* Children are up to date, nothing to do. */
+ }
else
psys_free_children(sim->psys);
}
@@ -3533,7 +3686,7 @@ static void cached_step(ParticleSimulationData *sim, float cfra)
ParticleSystem *psys = sim->psys;
ParticleSettings *part = psys->part;
PARTICLE_P;
- float disp, birthtime, dietime;
+ float disp, dietime;
BLI_srandom(psys->seed);
@@ -3548,7 +3701,6 @@ static void cached_step(ParticleSimulationData *sim, float cfra)
psys->lattice= psys_get_lattice(sim);
- birthtime = pa->time;
dietime = pa->dietime;
/* update alive status and push events */
@@ -3574,7 +3726,7 @@ static void cached_step(ParticleSimulationData *sim, float cfra)
}
}
-static void particles_fluid_step(ParticleSimulationData *sim, int cfra)
+static void particles_fluid_step(ParticleSimulationData *sim, int UNUSED(cfra))
{
ParticleSystem *psys = sim->psys;
if(psys->particles){
@@ -3591,26 +3743,23 @@ static void particles_fluid_step(ParticleSimulationData *sim, int cfra)
if( fluidmd && fluidmd->fss) {
FluidsimSettings *fss= fluidmd->fss;
ParticleSettings *part = psys->part;
- ParticleData *pa=0;
- char *suffix = "fluidsurface_particles_####";
- char *suffix2 = ".gz";
+ ParticleData *pa=NULL;
char filename[256];
char debugStrBuffer[256];
int curFrame = sim->scene->r.cfra -1; // warning - sync with derived mesh fsmesh loading
- int p, j, numFileParts, totpart;
+ int p, j, totpart;
int readMask, activeParts = 0, fileParts = 0;
gzFile gzf;
// XXX if(ob==G.obedit) // off...
// return;
-
+
// ok, start loading
- strcpy(filename, fss->surfdataPath);
- strcat(filename, suffix);
- BLI_path_abs(filename, G.sce);
+ BLI_snprintf(filename, sizeof(filename), "%sfluidsurface_particles_####.gz", fss->surfdataPath);
+
+ BLI_path_abs(filename, G.main->name);
BLI_path_frame(filename, curFrame, 0); // fixed #frame-no
- strcat(filename, suffix2);
-
+
gzf = gzopen(filename, "rb");
if (!gzf) {
snprintf(debugStrBuffer,256,"readFsPartData::error - Unable to open file for reading '%s' \n", filename);
@@ -3619,16 +3768,14 @@ static void particles_fluid_step(ParticleSimulationData *sim, int cfra)
}
gzread(gzf, &totpart, sizeof(totpart));
- numFileParts = totpart;
totpart = (G.rendering)?totpart:(part->disp*totpart)/100;
part->totpart= totpart;
part->sta=part->end = 1.0f;
part->lifetime = sim->scene->r.efra + 1;
- /* initialize particles */
+ /* allocate particles */
realloc_particles(sim, part->totpart);
- initialize_all_particles(sim);
// set up reading mask
readMask = fss->typeFlags;
@@ -3660,6 +3807,9 @@ static void particles_fluid_step(ParticleSimulationData *sim, int cfra)
pa->state.rot[0] = 1.0;
pa->state.rot[1] = pa->state.rot[2] = pa->state.rot[3] = 0.0;
+ pa->time = 1.f;
+ pa->dietime = sim->scene->r.efra + 1;
+ pa->lifetime = sim->scene->r.efra;
pa->alive = PARS_ALIVE;
//if(a<25) fprintf(stderr,"FSPARTICLE debug set %s , a%d = %f,%f,%f , life=%f \n", filename, a, pa->co[0],pa->co[1],pa->co[2], pa->lifetime );
} else {
@@ -3682,19 +3832,11 @@ static void particles_fluid_step(ParticleSimulationData *sim, int cfra)
#endif // DISABLE_ELBEEM
}
-static int emit_particles(ParticleSimulationData *sim, PTCacheID *pid, float cfra)
+static int emit_particles(ParticleSimulationData *sim, PTCacheID *pid, float UNUSED(cfra))
{
ParticleSystem *psys = sim->psys;
- ParticleSettings *part = psys->part;
int oldtotpart = psys->totpart;
- int totpart = oldtotpart;
-
- if(pid && psys->pointcache->flag & PTCACHE_EXTERNAL)
- totpart = pid->cache->totpoint;
- else if(part->distr == PART_DISTR_GRID && part->from != PART_FROM_VERT)
- totpart = part->grid_res*part->grid_res*part->grid_res;
- else
- totpart = psys->part->totpart;
+ int totpart = tot_particles(psys, pid);
if(totpart != oldtotpart)
realloc_particles(sim, totpart);
@@ -3712,94 +3854,84 @@ static void system_step(ParticleSimulationData *sim, float cfra)
ParticleSystem *psys = sim->psys;
ParticleSettings *part = psys->part;
PointCache *cache = psys->pointcache;
- PTCacheID pid, *use_cache = NULL;
+ PTCacheID ptcacheid, *pid = NULL;
PARTICLE_P;
- int oldtotpart;
- float disp; /*, *vg_vel= 0, *vg_tan= 0, *vg_rot= 0, *vg_size= 0; */
- int init= 0, emit= 0; //, only_children_changed= 0;
- int framenr, framedelta, startframe = 0, endframe = 100;
-
- framenr= (int)sim->scene->r.cfra;
- framedelta= framenr - cache->simframe;
+ float disp, cache_cfra = cfra; /*, *vg_vel= 0, *vg_tan= 0, *vg_rot= 0, *vg_size= 0; */
+ int startframe = 0, endframe = 100, oldtotpart = 0;
/* cache shouldn't be used for hair or "continue physics" */
if(part->type != PART_HAIR && BKE_ptcache_get_continue_physics() == 0) {
- BKE_ptcache_id_from_particles(&pid, sim->ob, psys);
- use_cache = &pid;
- }
-
- if(use_cache) {
- psys_clear_temp_pointcache(sim->psys);
+ psys_clear_temp_pointcache(psys);
/* set suitable cache range automatically */
if((cache->flag & (PTCACHE_BAKING|PTCACHE_BAKED))==0)
- psys_get_pointcache_start_end(sim->scene, sim->psys, &cache->startframe, &cache->endframe);
-
- BKE_ptcache_id_time(&pid, sim->scene, 0.0f, &startframe, &endframe, NULL);
+ psys_get_pointcache_start_end(sim->scene, psys, &cache->startframe, &cache->endframe);
- /* simulation is only active during a specific period */
- if(framenr < startframe) {
- psys_reset(psys, PSYS_RESET_CACHE_MISS);
- return;
- }
- else if(framenr > endframe) {
- framenr= endframe;
- }
+ pid = &ptcacheid;
+ BKE_ptcache_id_from_particles(pid, sim->ob, psys);
- if(framenr == startframe) {
- BKE_ptcache_id_reset(sim->scene, use_cache, PTCACHE_RESET_OUTDATED);
- BKE_ptcache_validate(cache, framenr);
+ BKE_ptcache_id_time(pid, sim->scene, 0.0f, &startframe, &endframe, NULL);
+
+ /* clear everythin on start frame */
+ if((int)cfra == startframe) {
+ BKE_ptcache_id_reset(sim->scene, pid, PTCACHE_RESET_OUTDATED);
+ BKE_ptcache_validate(cache, startframe);
cache->flag &= ~PTCACHE_REDO_NEEDED;
}
+
+ CLAMP(cache_cfra, startframe, endframe);
}
-/* 1. emit particles */
-
- /* verify if we need to reallocate */
+/* 1. emit particles and redo particles if needed */
oldtotpart = psys->totpart;
-
- emit = emit_particles(sim, use_cache, cfra);
- if(use_cache && emit > 0)
- BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_ALL, cfra);
- init = emit*emit + (psys->recalc & PSYS_RECALC_RESET);
-
- if(init) {
+ if(emit_particles(sim, pid, cfra) || psys->recalc & PSYS_RECALC_RESET) {
distribute_particles(sim, part->from);
initialize_all_particles(sim);
+ /* reset only just created particles (on startframe all particles are recreated) */
reset_all_particles(sim, 0.0, cfra, oldtotpart);
+ if (psys->fluid_springs) {
+ MEM_freeN(psys->fluid_springs);
+ psys->fluid_springs = NULL;
+ }
+
+ psys->tot_fluidsprings = psys->alloc_fluidsprings = 0;
+
/* flag for possible explode modifiers after this system */
sim->psmd->flag |= eParticleSystemFlag_Pars;
+
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_AFTER, cfra);
}
/* 2. try to read from the cache */
- if(use_cache) {
- int cache_result = BKE_ptcache_read_cache(use_cache, cfra, sim->scene->r.frs_sec);
+ if(pid) {
+ int cache_result = BKE_ptcache_read(pid, cache_cfra);
if(ELEM(cache_result, PTCACHE_READ_EXACT, PTCACHE_READ_INTERPOLATED)) {
cached_step(sim, cfra);
update_children(sim);
psys_update_path_cache(sim, cfra);
- BKE_ptcache_validate(cache, framenr);
+ BKE_ptcache_validate(cache, (int)cache_cfra);
if(cache_result == PTCACHE_READ_INTERPOLATED && cache->flag & PTCACHE_REDO_NEEDED)
- BKE_ptcache_write_cache(use_cache, framenr);
+ BKE_ptcache_write(pid, (int)cache_cfra);
return;
}
+ /* Cache is supposed to be baked, but no data was found so bail out */
+ else if(cache->flag & PTCACHE_BAKED) {
+ psys_reset(psys, PSYS_RESET_CACHE_MISS);
+ return;
+ }
else if(cache_result == PTCACHE_READ_OLD) {
psys->cfra = (float)cache->simframe;
cached_step(sim, psys->cfra);
}
- else if(cfra != startframe && ( /*sim->ob->id.lib ||*/ (cache->flag & PTCACHE_BAKED))) { /* 2.4x disabled lib, but this can be used in some cases, testing further - campbell */
- psys_reset(psys, PSYS_RESET_CACHE_MISS);
- return;
- }
/* if on second frame, write cache for first frame */
if(psys->cfra == startframe && (cache->flag & PTCACHE_OUTDATED || cache->last_exact==0))
- BKE_ptcache_write_cache(use_cache, startframe);
+ BKE_ptcache_write(pid, startframe);
}
else
BKE_ptcache_invalidate(cache);
@@ -3822,7 +3954,7 @@ static void system_step(ParticleSimulationData *sim, float cfra)
/* handle negative frame start at the first frame by doing
* all the steps before the first frame */
- if(framenr == startframe && part->sta < startframe)
+ if((int)cfra == startframe && part->sta < startframe)
totframesback = (startframe - (int)part->sta);
for(dframe=-totframesback; dframe<=0; dframe++) {
@@ -3837,14 +3969,13 @@ static void system_step(ParticleSimulationData *sim, float cfra)
}
/* 4. only write cache starting from second frame */
- if(use_cache) {
- BKE_ptcache_validate(cache, framenr);
- if(framenr != startframe)
- BKE_ptcache_write_cache(use_cache, framenr);
+ if(pid) {
+ BKE_ptcache_validate(cache, (int)cache_cfra);
+ if((int)cache_cfra != startframe)
+ BKE_ptcache_write(pid, (int)cache_cfra);
}
- if(init)
- update_children(sim);
+ update_children(sim);
/* cleanup */
if(psys->lattice){
@@ -3922,6 +4053,8 @@ static void fluid_default_settings(ParticleSettings *part){
fluid->radius = 0.5f;
fluid->spring_k = 0.f;
+ fluid->plasticity_constant = 0.1f;
+ fluid->yield_ratio = 0.1f;
fluid->rest_length = 0.5f;
fluid->viscosity_omega = 2.f;
fluid->viscosity_beta = 0.f;
@@ -3931,7 +4064,7 @@ static void fluid_default_settings(ParticleSettings *part){
fluid->buoyancy = 0.f;
}
-static void psys_changed_physics(ParticleSimulationData *sim)
+static void psys_prepare_physics(ParticleSimulationData *sim)
{
ParticleSettings *part = sim->psys->part;
@@ -3970,7 +4103,7 @@ static void psys_changed_physics(ParticleSimulationData *sim)
static int hair_needs_recalc(ParticleSystem *psys)
{
if(!(psys->flag & PSYS_EDITED) && (!psys->edit || !psys->edit->edited) &&
- ((psys->flag & PSYS_HAIR_DONE)==0 || psys->recalc & PSYS_RECALC_RESET)) {
+ ((psys->flag & PSYS_HAIR_DONE)==0 || psys->recalc & PSYS_RECALC_RESET || (psys->part->flag & PART_HAIR_REGROW && !psys->edit))) {
return 1;
}
@@ -3981,7 +4114,7 @@ static int hair_needs_recalc(ParticleSystem *psys)
* then advances in to actual particle calculations depending on particle type */
void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
{
- ParticleSimulationData sim = {scene, ob, psys, NULL, NULL};
+ ParticleSimulationData sim= {0};
ParticleSettings *part = psys->part;
float cfra;
@@ -3992,6 +4125,10 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
return;
cfra= BKE_curframe(scene);
+
+ sim.scene= scene;
+ sim.ob= ob;
+ sim.psys= psys;
sim.psmd= psys_get_modifier(ob, psys);
/* system was already updated from modifier stack */
@@ -4010,19 +4147,34 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
if(psys->recalc & PSYS_RECALC_TYPE)
psys_changed_type(&sim);
- else if(psys->recalc & PSYS_RECALC_PHYS)
- psys_changed_physics(&sim);
+
+ if(psys->recalc & PSYS_RECALC_RESET)
+ psys->totunexist = 0;
+
+ /* setup necessary physics type dependent additional data if it doesn't yet exist */
+ psys_prepare_physics(&sim);
switch(part->type) {
case PART_HAIR:
{
+ /* nothing to do so bail out early */
+ if(psys->totpart == 0 && part->totpart == 0) {
+ psys_free_path_cache(psys, NULL);
+ free_hair(ob, psys, 0);
+ }
/* (re-)create hair */
- if(hair_needs_recalc(psys)) {
+ else if(hair_needs_recalc(psys)) {
float hcfra=0.0f;
int i, recalc = psys->recalc;
free_hair(ob, psys, 0);
+ if(psys->edit && psys->free_edit) {
+ psys->free_edit(psys->edit);
+ psys->edit = NULL;
+ psys->free_edit = NULL;
+ }
+
/* first step is negative so particles get killed and reset */
psys->cfra= 1.0f;
@@ -4038,6 +4190,8 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
psys->flag |= PSYS_HAIR_DONE;
psys->recalc = recalc;
}
+ else if(psys->flag & PSYS_EDITED)
+ psys->flag |= PSYS_HAIR_DONE;
if(psys->flag & PSYS_HAIR_DONE)
hair_step(&sim, cfra);
@@ -4055,12 +4209,13 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
case PART_PHYS_KEYED:
{
PARTICLE_P;
+ float disp = (float)psys_get_current_display_percentage(psys)/100.0f;
/* Particles without dynamics haven't been reset yet because they don't use pointcache */
if(psys->recalc & PSYS_RECALC_RESET)
psys_reset(psys, PSYS_RESET_ALL);
- if(emit_particles(&sim, NULL, cfra)) {
+ if(emit_particles(&sim, NULL, cfra) || (psys->recalc & PSYS_RECALC_RESET)) {
free_keyed_keys(psys);
distribute_particles(&sim, part->from);
initialize_all_particles(&sim);
@@ -4072,6 +4227,11 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1);
reset_particle(&sim, pa, 0.0, cfra);
+
+ if(PSYS_FRAND(p) > disp)
+ pa->flag |= PARS_NO_DISP;
+ else
+ pa->flag &= ~PARS_NO_DISP;
}
if(part->phystype == PART_PHYS_KEYED) {
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 741580048cf..84331e1b318 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -44,6 +44,7 @@
#include "BLI_blenlib.h"
#include "BLI_threads.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "PIL_time.h"
@@ -63,6 +64,7 @@
#include "BKE_smoke.h"
#include "BKE_softbody.h"
#include "BKE_utildefines.h"
+
#include "BIK_api.h"
/* both in intern */
@@ -95,44 +97,55 @@
/* could be made into a pointcache option */
#define DURIAN_POINTCACHE_LIB_OK 1
-int ptcache_data_size[] = {
- sizeof(int), // BPHYS_DATA_INDEX
- 3 * sizeof(float), // BPHYS_DATA_LOCATION:
- 3 * sizeof(float), // BPHYS_DATA_VELOCITY:
- 4 * sizeof(float), // BPHYS_DATA_ROTATION:
- 3 * sizeof(float), // BPHYS_DATA_AVELOCITY: /* also BPHYS_DATA_XCONST */
- sizeof(float), // BPHYS_DATA_SIZE:
- 3 * sizeof(float), // BPHYS_DATA_TIMES:
- sizeof(BoidData) // case BPHYS_DATA_BOIDS:
+static int ptcache_data_size[] = {
+ sizeof(unsigned int), // BPHYS_DATA_INDEX
+ 3 * sizeof(float), // BPHYS_DATA_LOCATION
+ 3 * sizeof(float), // BPHYS_DATA_VELOCITY
+ 4 * sizeof(float), // BPHYS_DATA_ROTATION
+ 3 * sizeof(float), // BPHYS_DATA_AVELOCITY / BPHYS_DATA_XCONST
+ sizeof(float), // BPHYS_DATA_SIZE
+ 3 * sizeof(float), // BPHYS_DATA_TIMES
+ sizeof(BoidData) // case BPHYS_DATA_BOIDS
+};
+
+static int ptcache_extra_datasize[] = {
+ 0,
+ sizeof(ParticleSpring)
};
+/* forward declerations */
+static int ptcache_file_compressed_read(PTCacheFile *pf, unsigned char *result, unsigned int len);
+static int ptcache_file_compressed_write(PTCacheFile *pf, unsigned char *in, unsigned int in_len, unsigned char *out, int mode);
+static int ptcache_file_write(PTCacheFile *pf, void *f, unsigned int tot, unsigned int size);
+static int ptcache_file_read(PTCacheFile *pf, void *f, unsigned int tot, unsigned int size);
+
/* Common functions */
-static int ptcache_read_basic_header(PTCacheFile *pf)
+static int ptcache_basic_header_read(PTCacheFile *pf)
{
int error=0;
/* Custom functions should read these basic elements too! */
- if(!error && !fread(&pf->totpoint, sizeof(int), 1, pf->fp))
+ if(!error && !fread(&pf->totpoint, sizeof(unsigned int), 1, pf->fp))
error = 1;
- if(!error && !fread(&pf->data_types, sizeof(int), 1, pf->fp))
+ if(!error && !fread(&pf->data_types, sizeof(unsigned int), 1, pf->fp))
error = 1;
return !error;
}
-static int ptcache_write_basic_header(PTCacheFile *pf)
+static int ptcache_basic_header_write(PTCacheFile *pf)
{
/* Custom functions should write these basic elements too! */
- if(!fwrite(&pf->totpoint, sizeof(int), 1, pf->fp))
+ if(!fwrite(&pf->totpoint, sizeof(unsigned int), 1, pf->fp))
return 0;
- if(!fwrite(&pf->data_types, sizeof(int), 1, pf->fp))
+ if(!fwrite(&pf->data_types, sizeof(unsigned int), 1, pf->fp))
return 0;
return 1;
}
/* Softbody functions */
-static int ptcache_write_softbody(int index, void *soft_v, void **data, int cfra)
+static int ptcache_softbody_write(int index, void *soft_v, void **data, int UNUSED(cfra))
{
SoftBody *soft= soft_v;
BodyPoint *bp = soft->bpoint + index;
@@ -142,7 +155,7 @@ static int ptcache_write_softbody(int index, void *soft_v, void **data, int cfra
return 1;
}
-static void ptcache_read_softbody(int index, void *soft_v, void **data, float frs_sec, float cfra, float *old_data)
+static void ptcache_softbody_read(int index, void *soft_v, void **data, float UNUSED(cfra), float *old_data)
{
SoftBody *soft= soft_v;
BodyPoint *bp = soft->bpoint + index;
@@ -156,7 +169,7 @@ static void ptcache_read_softbody(int index, void *soft_v, void **data, float fr
PTCACHE_DATA_TO(data, BPHYS_DATA_VELOCITY, 0, bp->vec);
}
}
-static void ptcache_interpolate_softbody(int index, void *soft_v, void **data, float frs_sec, float cfra, float cfra1, float cfra2, float *old_data)
+static void ptcache_softbody_interpolate(int index, void *soft_v, void **data, float cfra, float cfra1, float cfra2, float *old_data)
{
SoftBody *soft= soft_v;
BodyPoint *bp = soft->bpoint + index;
@@ -188,24 +201,44 @@ static void ptcache_interpolate_softbody(int index, void *soft_v, void **data, f
VECCOPY(bp->pos, keys->co);
VECCOPY(bp->vec, keys->vel);
}
-static int ptcache_totpoint_softbody(void *soft_v, int cfra)
+static int ptcache_softbody_totpoint(void *soft_v, int UNUSED(cfra))
{
SoftBody *soft= soft_v;
return soft->totpoint;
}
/* Particle functions */
-static int ptcache_write_particle(int index, void *psys_v, void **data, int cfra)
+void BKE_ptcache_make_particle_key(ParticleKey *key, int index, void **data, float time)
+{
+ PTCACHE_DATA_TO(data, BPHYS_DATA_LOCATION, index, key->co);
+ PTCACHE_DATA_TO(data, BPHYS_DATA_VELOCITY, index, key->vel);
+
+ /* no rotation info, so make something nice up */
+ if(data[BPHYS_DATA_ROTATION]==NULL) {
+ vec_to_quat( key->rot, key->vel, OB_NEGX, OB_POSZ);
+ }
+ else {
+ PTCACHE_DATA_TO(data, BPHYS_DATA_ROTATION, index, key->rot);
+ }
+
+ PTCACHE_DATA_TO(data, BPHYS_DATA_AVELOCITY, index, key->ave);
+ key->time = time;
+}
+static int ptcache_particle_write(int index, void *psys_v, void **data, int cfra)
{
ParticleSystem *psys= psys_v;
ParticleData *pa = psys->particles + index;
BoidParticle *boid = (psys->part->phystype == PART_PHYS_BOIDS) ? pa->boid : NULL;
- float times[3] = {pa->time, pa->dietime, pa->lifetime};
+ float times[3];
int step = psys->pointcache->step;
/* No need to store unborn or died particles outside cache step bounds */
if(data[BPHYS_DATA_INDEX] && (cfra < pa->time - step || cfra > pa->dietime + step))
return 0;
-
+
+ times[0]= pa->time;
+ times[1]= pa->dietime;
+ times[2]= pa->lifetime;
+
PTCACHE_DATA_FROM(data, BPHYS_DATA_INDEX, &index);
PTCACHE_DATA_FROM(data, BPHYS_DATA_LOCATION, pa->state.co);
PTCACHE_DATA_FROM(data, BPHYS_DATA_VELOCITY, pa->state.vel);
@@ -220,19 +253,12 @@ static int ptcache_write_particle(int index, void *psys_v, void **data, int cfra
/* return flag 1+1=2 for newly born particles to copy exact birth location to previously cached frame */
return 1 + (pa->state.time >= pa->time && pa->prev_state.time <= pa->time);
}
-void BKE_ptcache_make_particle_key(ParticleKey *key, int index, void **data, float time)
-{
- PTCACHE_DATA_TO(data, BPHYS_DATA_LOCATION, index, key->co);
- PTCACHE_DATA_TO(data, BPHYS_DATA_VELOCITY, index, key->vel);
- PTCACHE_DATA_TO(data, BPHYS_DATA_ROTATION, index, key->rot);
- PTCACHE_DATA_TO(data, BPHYS_DATA_AVELOCITY, index, key->ave);
- key->time = time;
-}
-static void ptcache_read_particle(int index, void *psys_v, void **data, float frs_sec, float cfra, float *old_data)
+static void ptcache_particle_read(int index, void *psys_v, void **data, float cfra, float *old_data)
{
ParticleSystem *psys= psys_v;
ParticleData *pa;
BoidParticle *boid;
+ float timestep = 0.04f*psys->part->timetweak;
if(index >= psys->totpart)
return;
@@ -273,11 +299,11 @@ static void ptcache_read_particle(int index, void *psys_v, void **data, float fr
if(data[BPHYS_DATA_LOCATION] && !data[BPHYS_DATA_VELOCITY]) {
if(cfra > pa->prev_state.time) {
sub_v3_v3v3(pa->state.vel, pa->state.co, pa->prev_state.co);
- mul_v3_fl(pa->state.vel, (cfra - pa->prev_state.time) / frs_sec);
+ mul_v3_fl(pa->state.vel, (cfra - pa->prev_state.time) * timestep);
}
else {
sub_v3_v3v3(pa->state.vel, pa->prev_state.co, pa->state.co);
- mul_v3_fl(pa->state.vel, (pa->prev_state.time - cfra) / frs_sec);
+ mul_v3_fl(pa->state.vel, (pa->prev_state.time - cfra) * timestep);
}
}
@@ -286,12 +312,12 @@ static void ptcache_read_particle(int index, void *psys_v, void **data, float fr
vec_to_quat( pa->state.rot,pa->state.vel, OB_NEGX, OB_POSZ);
}
}
-static void ptcache_interpolate_particle(int index, void *psys_v, void **data, float frs_sec, float cfra, float cfra1, float cfra2, float *old_data)
+static void ptcache_particle_interpolate(int index, void *psys_v, void **data, float cfra, float cfra1, float cfra2, float *old_data)
{
ParticleSystem *psys= psys_v;
ParticleData *pa;
ParticleKey keys[4];
- float dfra;
+ float dfra, timestep = 0.04f*psys->part->timetweak;
if(index >= psys->totpart)
return;
@@ -319,11 +345,11 @@ static void ptcache_interpolate_particle(int index, void *psys_v, void **data, f
if(data[BPHYS_DATA_LOCATION] && !data[BPHYS_DATA_VELOCITY]) {
if(keys[1].time > keys[2].time) {
sub_v3_v3v3(keys[2].vel, keys[1].co, keys[2].co);
- mul_v3_fl(keys[2].vel, (keys[1].time - keys[2].time) / frs_sec);
+ mul_v3_fl(keys[2].vel, (keys[1].time - keys[2].time) * timestep);
}
else {
sub_v3_v3v3(keys[2].vel, keys[2].co, keys[1].co);
- mul_v3_fl(keys[2].vel, (keys[2].time - keys[1].time) / frs_sec);
+ mul_v3_fl(keys[2].vel, (keys[2].time - keys[1].time) * timestep);
}
}
@@ -337,163 +363,81 @@ static void ptcache_interpolate_particle(int index, void *psys_v, void **data, f
dfra = cfra2 - cfra1;
- mul_v3_fl(keys[1].vel, dfra / frs_sec);
- mul_v3_fl(keys[2].vel, dfra / frs_sec);
+ mul_v3_fl(keys[1].vel, dfra * timestep);
+ mul_v3_fl(keys[2].vel, dfra * timestep);
psys_interpolate_particle(-1, keys, (cfra - cfra1) / dfra, &pa->state, 1);
interp_qt_qtqt(pa->state.rot, keys[1].rot, keys[2].rot, (cfra - cfra1) / dfra);
- mul_v3_fl(pa->state.vel, frs_sec / dfra);
+ mul_v3_fl(pa->state.vel, 1.f / (dfra * timestep));
pa->state.time = cfra;
}
-static int ptcache_totpoint_particle(void *psys_v, int cfra)
+static int ptcache_particle_totpoint(void *psys_v, int UNUSED(cfra))
{
ParticleSystem *psys = psys_v;
return psys->totpart;
}
-static int ptcache_totwrite_particle(void *psys_v, int cfra)
+static int ptcache_particle_totwrite(void *psys_v, int cfra)
{
ParticleSystem *psys = psys_v;
ParticleData *pa= psys->particles;
int p, step = psys->pointcache->step;
int totwrite = 0;
+ if(cfra == 0)
+ return psys->totpart;
+
for(p=0; p<psys->totpart; p++,pa++)
totwrite += (cfra >= pa->time - step && cfra <= pa->dietime + step);
return totwrite;
}
-//static int ptcache_write_particle_stream(PTCacheFile *pf, PTCacheMem *pm, void *psys_v)
-//{
-// ParticleSystem *psys= psys_v;
-// ParticleData *pa = psys->particles;
-// BoidParticle *boid = NULL;
-// float times[3];
-// int i = 0;
-//
-// if(!pf && !pm)
-// return 0;
-//
-// for(i=0; i<psys->totpart; i++, pa++) {
-//
-// if(data[BPHYS_DATA_INDEX]) {
-// int step = psys->pointcache->step;
-// /* No need to store unborn or died particles */
-// if(pa->time - step > pa->state.time || pa->dietime + step < pa->state.time)
-// continue;
-// }
-//
-// times[0] = pa->time;
-// times[1] = pa->dietime;
-// times[2] = pa->lifetime;
-//
-// PTCACHE_DATA_FROM(data, BPHYS_DATA_INDEX, &index);
-// PTCACHE_DATA_FROM(data, BPHYS_DATA_LOCATION, pa->state.co);
-// PTCACHE_DATA_FROM(data, BPHYS_DATA_VELOCITY, pa->state.vel);
-// PTCACHE_DATA_FROM(data, BPHYS_DATA_ROTATION, pa->state.rot);
-// PTCACHE_DATA_FROM(data, BPHYS_DATA_AVELOCITY, pa->state.ave);
-// PTCACHE_DATA_FROM(data, BPHYS_DATA_SIZE, &pa->size);
-// PTCACHE_DATA_FROM(data, BPHYS_DATA_TIMES, times);
-//
-// boid = (psys->part->phystype == PART_PHYS_BOIDS) ? pa->boid : NULL;
-// if(boid)
-// PTCACHE_DATA_FROM(data, BPHYS_DATA_BOIDS, &boid->data);
-//
-// if(pf && !ptcache_file_write_data(pf))
-// return 0;
-//
-// if(pm)
-// BKE_ptcache_mem_incr_pointers(pm);
-// }
-//
-// return 1;
-//}
-//static void ptcache_read_particle_stream(PTCacheFile *pf, PTCacheMem *pm, void *psys_v, void **data, float frs_sec, float cfra, float *old_data)
-//{
-// ParticleSystem *psys= psys_v;
-// ParticleData *pa = psys->particles + index;
-// BoidParticle *boid = (psys->part->phystype == PART_PHYS_BOIDS) ? pa->boid : NULL;
-//
-// if(cfra > pa->state.time)
-// memcpy(&pa->prev_state, &pa->state, sizeof(ParticleKey));
-//
-// if(old_data){
-// /* old format cache */
-// memcpy(&pa->state, old_data, sizeof(ParticleKey));
-// return;
-// }
-//
-// BKE_ptcache_make_particle_key(&pa->state, 0, data, cfra);
-//
-// if(data[BPHYS_DATA_SIZE])
-// PTCACHE_DATA_TO(data, BPHYS_DATA_SIZE, 0, &pa->size);
-//
-// if(data[BPHYS_DATA_TIMES]) {
-// float times[3];
-// PTCACHE_DATA_TO(data, BPHYS_DATA_TIMES, 0, &times);
-// pa->time = times[0];
-// pa->dietime = times[1];
-// pa->lifetime = times[2];
-// }
-//
-// if(boid)
-// PTCACHE_DATA_TO(data, BPHYS_DATA_BOIDS, 0, &boid->data);
-//
-// /* determine velocity from previous location */
-// if(data[BPHYS_DATA_LOCATION] && !data[BPHYS_DATA_VELOCITY]) {
-// if(cfra > pa->prev_state.time) {
-// sub_v3_v3v3(pa->state.vel, pa->state.co, pa->prev_state.co);
-// mul_v3_fl(pa->state.vel, (cfra - pa->prev_state.time) / frs_sec);
-// }
-// else {
-// sub_v3_v3v3(pa->state.vel, pa->prev_state.co, pa->state.co);
-// mul_v3_fl(pa->state.vel, (pa->prev_state.time - cfra) / frs_sec);
-// }
-// }
-//
-// /* determine rotation from velocity */
-// if(data[BPHYS_DATA_LOCATION] && !data[BPHYS_DATA_ROTATION]) {
-// vec_to_quat( pa->state.rot,pa->state.vel, OB_POSX, OB_POSZ);
-// }
-//}
-//static void ptcache_interpolate_particle_stream(int index, void *psys_v, void **data, float frs_sec, float cfra, float cfra1, float cfra2, float *old_data)
-//{
-// ParticleSystem *psys= psys_v;
-// ParticleData *pa = psys->particles + index;
-// ParticleKey keys[4];
-// float dfra;
-//
-// cfra = MIN2(cfra, pa->dietime);
-// cfra1 = MIN2(cfra1, pa->dietime);
-// cfra2 = MIN2(cfra2, pa->dietime);
-//
-// if(cfra1 == cfra2)
-// return;
-//
-// memcpy(keys+1, &pa->state, sizeof(ParticleKey));
-// if(old_data)
-// memcpy(keys+2, old_data, sizeof(ParticleKey));
-// else
-// BKE_ptcache_make_particle_key(keys+2, 0, data, cfra2);
-//
-// dfra = cfra2 - cfra1;
-//
-// mul_v3_fl(keys[1].vel, dfra / frs_sec);
-// mul_v3_fl(keys[2].vel, dfra / frs_sec);
-//
-// psys_interpolate_particle(-1, keys, (cfra - cfra1) / dfra, &pa->state, 1);
-// interp_qt_qtqt(pa->state.rot, keys[1].rot,keys[2].rot, (cfra - cfra1) / dfra);
-//
-// mul_v3_fl(pa->state.vel, frs_sec / dfra);
-//
-// pa->state.time = cfra;
-//}
-//
+static void ptcache_particle_extra_write(void *psys_v, PTCacheMem *pm, int UNUSED(cfra))
+{
+ ParticleSystem *psys = psys_v;
+ PTCacheExtra *extra = NULL;
+
+ if(psys->part->phystype == PART_PHYS_FLUID &&
+ psys->part->fluid && psys->part->fluid->flag & SPH_VISCOELASTIC_SPRINGS &&
+ psys->tot_fluidsprings && psys->fluid_springs) {
+
+ extra = MEM_callocN(sizeof(PTCacheExtra), "Point cache: fluid extra data");
+
+ extra->type = BPHYS_EXTRA_FLUID_SPRINGS;
+ extra->totdata = psys->tot_fluidsprings;
+
+ extra->data = MEM_callocN(extra->totdata * ptcache_extra_datasize[extra->type], "Point cache: extra data");
+ memcpy(extra->data, psys->fluid_springs, extra->totdata * ptcache_extra_datasize[extra->type]);
+
+ BLI_addtail(&pm->extradata, extra);
+ }
+}
+
+static void ptcache_particle_extra_read(void *psys_v, PTCacheMem *pm, float UNUSED(cfra))
+{
+ ParticleSystem *psys = psys_v;
+ PTCacheExtra *extra = pm->extradata.first;
+
+ for(; extra; extra=extra->next) {
+ switch(extra->type) {
+ case BPHYS_EXTRA_FLUID_SPRINGS:
+ {
+ if(psys->fluid_springs)
+ MEM_freeN(psys->fluid_springs);
+
+ psys->fluid_springs = MEM_dupallocN(extra->data);
+ psys->tot_fluidsprings = psys->alloc_fluidsprings = extra->totdata;
+ break;
+ }
+ }
+ }
+}
+
/* Cloth functions */
-static int ptcache_write_cloth(int index, void *cloth_v, void **data, int cfra)
+static int ptcache_cloth_write(int index, void *cloth_v, void **data, int UNUSED(cfra))
{
ClothModifierData *clmd= cloth_v;
Cloth *cloth= clmd->clothObject;
@@ -505,7 +449,7 @@ static int ptcache_write_cloth(int index, void *cloth_v, void **data, int cfra)
return 1;
}
-static void ptcache_read_cloth(int index, void *cloth_v, void **data, float frs_sec, float cfra, float *old_data)
+static void ptcache_cloth_read(int index, void *cloth_v, void **data, float UNUSED(cfra), float *old_data)
{
ClothModifierData *clmd= cloth_v;
Cloth *cloth= clmd->clothObject;
@@ -522,7 +466,7 @@ static void ptcache_read_cloth(int index, void *cloth_v, void **data, float frs_
PTCACHE_DATA_TO(data, BPHYS_DATA_XCONST, 0, vert->xconst);
}
}
-static void ptcache_interpolate_cloth(int index, void *cloth_v, void **data, float frs_sec, float cfra, float cfra1, float cfra2, float *old_data)
+static void ptcache_cloth_interpolate(int index, void *cloth_v, void **data, float cfra, float cfra1, float cfra2, float *old_data)
{
ClothModifierData *clmd= cloth_v;
Cloth *cloth= clmd->clothObject;
@@ -558,84 +502,14 @@ static void ptcache_interpolate_cloth(int index, void *cloth_v, void **data, flo
/* should vert->xconst be interpolated somehow too? - jahka */
}
-static int ptcache_totpoint_cloth(void *cloth_v, int cfra)
+static int ptcache_cloth_totpoint(void *cloth_v, int UNUSED(cfra))
{
ClothModifierData *clmd= cloth_v;
return clmd->clothObject ? clmd->clothObject->numverts : 0;
}
-/* Creating ID's */
-void BKE_ptcache_id_from_softbody(PTCacheID *pid, Object *ob, SoftBody *sb)
-{
- memset(pid, 0, sizeof(PTCacheID));
-
- pid->ob= ob;
- pid->calldata= sb;
- pid->type= PTCACHE_TYPE_SOFTBODY;
- pid->cache= sb->pointcache;
- pid->cache_ptr= &sb->pointcache;
- pid->ptcaches= &sb->ptcaches;
- pid->totpoint= pid->totwrite= ptcache_totpoint_softbody;
-
- pid->write_elem= ptcache_write_softbody;
- pid->write_stream = NULL;
- pid->read_stream = NULL;
- pid->read_elem= ptcache_read_softbody;
- pid->interpolate_elem= ptcache_interpolate_softbody;
-
- pid->write_header= ptcache_write_basic_header;
- pid->read_header= ptcache_read_basic_header;
-
- pid->data_types= (1<<BPHYS_DATA_LOCATION) | (1<<BPHYS_DATA_VELOCITY);
- pid->info_types= 0;
-
- pid->stack_index = pid->cache->index;
-}
-
-void BKE_ptcache_id_from_particles(PTCacheID *pid, Object *ob, ParticleSystem *psys)
-{
- memset(pid, 0, sizeof(PTCacheID));
-
- pid->ob= ob;
- pid->calldata= psys;
- pid->type= PTCACHE_TYPE_PARTICLES;
- pid->stack_index= psys->pointcache->index;
- pid->cache= psys->pointcache;
- pid->cache_ptr= &psys->pointcache;
- pid->ptcaches= &psys->ptcaches;
-
- if(psys->part->type != PART_HAIR)
- pid->flag |= PTCACHE_VEL_PER_SEC;
-
- pid->write_elem= ptcache_write_particle;
- pid->write_stream = NULL;
- pid->read_stream = NULL;
- pid->read_elem= ptcache_read_particle;
- pid->interpolate_elem= ptcache_interpolate_particle;
-
- pid->totpoint= ptcache_totpoint_particle;
- pid->totwrite= ptcache_totwrite_particle;
-
- pid->write_header= ptcache_write_basic_header;
- pid->read_header= ptcache_read_basic_header;
-
- pid->data_types= (1<<BPHYS_DATA_LOCATION) | (1<<BPHYS_DATA_VELOCITY) | (1<<BPHYS_DATA_INDEX);
-
- if(psys->part->phystype == PART_PHYS_BOIDS)
- pid->data_types|= (1<<BPHYS_DATA_AVELOCITY) | (1<<BPHYS_DATA_ROTATION) | (1<<BPHYS_DATA_BOIDS);
-
- if(psys->part->rotmode!=PART_ROT_VEL
- || psys->part->avemode!=PART_AVE_SPIN || psys->part->avefac!=0.0f)
- pid->data_types|= (1<<BPHYS_DATA_AVELOCITY) | (1<<BPHYS_DATA_ROTATION);
-
- if(psys->part->flag & PART_ROT_DYN)
- pid->data_types|= (1<<BPHYS_DATA_ROTATION);
-
- pid->info_types= (1<<BPHYS_DATA_TIMES);
-}
-
/* Smoke functions */
-static int ptcache_totpoint_smoke(void *smoke_v, int cfra)
+static int ptcache_smoke_totpoint(void *smoke_v, int UNUSED(cfra))
{
SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
SmokeDomainSettings *sds = smd->domain;
@@ -646,79 +520,11 @@ static int ptcache_totpoint_smoke(void *smoke_v, int cfra)
else
return 0;
}
-
-/* Smoke functions */
-static int ptcache_totpoint_smoke_turbulence(void *smoke_v, int cfra)
-{
- SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
- SmokeDomainSettings *sds = smd->domain;
-
- if(sds->wt) {
- return sds->res_wt[0]*sds->res_wt[1]*sds->res_wt[2];
- }
- else
- return 0;
-}
-
-// forward decleration
-static int ptcache_file_write(PTCacheFile *pf, void *f, size_t tot, int size);
-
-static int ptcache_compress_write(PTCacheFile *pf, unsigned char *in, unsigned int in_len, unsigned char *out, int mode)
-{
- int r = 0;
- unsigned char compressed = 0;
- unsigned int out_len= 0;
- unsigned char *props = MEM_callocN(16*sizeof(char), "tmp");
- size_t sizeOfIt = 5;
-
-#ifdef WITH_LZO
- out_len= LZO_OUT_LEN(in_len);
- if(mode == 1) {
- LZO_HEAP_ALLOC(wrkmem, LZO1X_MEM_COMPRESS);
-
- r = lzo1x_1_compress(in, (lzo_uint)in_len, out, (lzo_uint *)&out_len, wrkmem);
- if (!(r == LZO_E_OK) || (out_len >= in_len))
- compressed = 0;
- else
- compressed = 1;
- }
-#endif
-#ifdef WITH_LZMA
- if(mode == 2) {
-
- r = LzmaCompress(out, (size_t *)&out_len, in, in_len,//assume sizeof(char)==1....
- props, &sizeOfIt, 5, 1 << 24, 3, 0, 2, 32, 2);
-
- if(!(r == SZ_OK) || (out_len >= in_len))
- compressed = 0;
- else
- compressed = 2;
- }
-#endif
-
- ptcache_file_write(pf, &compressed, 1, sizeof(unsigned char));
- if(compressed) {
- ptcache_file_write(pf, &out_len, 1, sizeof(unsigned int));
- ptcache_file_write(pf, out, out_len, sizeof(unsigned char));
- }
- else
- ptcache_file_write(pf, in, in_len, sizeof(unsigned char));
-
- if(compressed == 2)
- {
- ptcache_file_write(pf, &sizeOfIt, 1, sizeof(unsigned int));
- ptcache_file_write(pf, props, sizeOfIt, sizeof(unsigned char));
- }
-
- MEM_freeN(props);
-
- return r;
-}
-
-static int ptcache_write_smoke(PTCacheFile *pf, void *smoke_v)
+static int ptcache_smoke_write(PTCacheFile *pf, void *smoke_v)
{
SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
SmokeDomainSettings *sds = smd->domain;
+ int ret = 0;
if(sds->fluid) {
size_t res = sds->res[0]*sds->res[1]*sds->res[2];
@@ -732,33 +538,26 @@ static int ptcache_write_smoke(PTCacheFile *pf, void *smoke_v)
smoke_export(sds->fluid, &dt, &dx, &dens, &densold, &heat, &heatold, &vx, &vy, &vz, &vxold, &vyold, &vzold, &obstacles);
- ptcache_compress_write(pf, (unsigned char *)sds->shadow, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)dens, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)densold, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)heat, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)heatold, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)vx, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)vy, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)vz, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)vxold, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)vyold, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)vzold, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)obstacles, (unsigned int)res, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)sds->shadow, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)dens, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)densold, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)heat, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)heatold, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)vx, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)vy, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)vz, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)vxold, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)vyold, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)vzold, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)obstacles, (unsigned int)res, out, mode);
ptcache_file_write(pf, &dt, 1, sizeof(float));
ptcache_file_write(pf, &dx, 1, sizeof(float));
MEM_freeN(out);
- return 1;
+ ret = 1;
}
- return 0;
-}
-static int ptcache_write_smoke_turbulence(PTCacheFile *pf, void *smoke_v)
-{
- SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
- SmokeDomainSettings *sds = smd->domain;
-
if(sds->wt) {
int res_big_array[3];
int res_big;
@@ -780,71 +579,22 @@ static int ptcache_write_smoke_turbulence(PTCacheFile *pf, void *smoke_v)
smoke_turbulence_export(sds->wt, &dens, &densold, &tcu, &tcv, &tcw);
out = (unsigned char *)MEM_callocN(LZO_OUT_LEN(in_len_big), "pointcache_lzo_buffer");
- ptcache_compress_write(pf, (unsigned char *)dens, in_len_big, out, mode);
- ptcache_compress_write(pf, (unsigned char *)densold, in_len_big, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)dens, in_len_big, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)densold, in_len_big, out, mode);
MEM_freeN(out);
out = (unsigned char *)MEM_callocN(LZO_OUT_LEN(in_len), "pointcache_lzo_buffer");
- ptcache_compress_write(pf, (unsigned char *)tcu, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)tcv, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)tcw, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)tcu, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)tcv, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)tcw, in_len, out, mode);
MEM_freeN(out);
- return 1;
+ ret = 1;
}
- return 0;
-}
-// forward decleration
-static int ptcache_file_read(PTCacheFile *pf, void *f, size_t tot, int size);
-
-static int ptcache_compress_read(PTCacheFile *pf, unsigned char *result, unsigned int len)
-{
- int r = 0;
- unsigned char compressed = 0;
- unsigned int in_len;
-#ifdef WITH_LZO
- unsigned int out_len = len;
- size_t sizeOfIt = 5;
-#endif
- unsigned char *in;
- unsigned char *props = MEM_callocN(16*sizeof(char), "tmp");
-
- ptcache_file_read(pf, &compressed, 1, sizeof(unsigned char));
- if(compressed) {
- ptcache_file_read(pf, &in_len, 1, sizeof(unsigned int));
- if(in_len==0) {
- /* do nothing */
- }
- else {
- in = (unsigned char *)MEM_callocN(sizeof(unsigned char)*in_len, "pointcache_compressed_buffer");
- ptcache_file_read(pf, in, in_len, sizeof(unsigned char));
-#ifdef WITH_LZO
- if(compressed == 1)
- r = lzo1x_decompress_safe(in, (lzo_uint)in_len, result, (lzo_uint *)&out_len, NULL);
-#endif
-#ifdef WITH_LZMA
- if(compressed == 2)
- {
- size_t leni = in_len, leno = out_len;
- ptcache_file_read(pf, &sizeOfIt, 1, sizeof(unsigned int));
- ptcache_file_read(pf, props, sizeOfIt, sizeof(unsigned char));
- r = LzmaUncompress(result, &leno, in, &leni, props, sizeOfIt);
- }
-#endif
- MEM_freeN(in);
- }
- }
- else {
- ptcache_file_read(pf, result, len, sizeof(unsigned char));
- }
-
- MEM_freeN(props);
-
- return r;
+ return ret;
}
-
-static void ptcache_read_smoke(PTCacheFile *pf, void *smoke_v)
+static void ptcache_smoke_read(PTCacheFile *pf, void *smoke_v)
{
SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
SmokeDomainSettings *sds = smd->domain;
@@ -857,116 +607,126 @@ static void ptcache_read_smoke(PTCacheFile *pf, void *smoke_v)
smoke_export(sds->fluid, &dt, &dx, &dens, &densold, &heat, &heatold, &vx, &vy, &vz, &vxold, &vyold, &vzold, &obstacles);
- ptcache_compress_read(pf, (unsigned char *)sds->shadow, out_len);
- ptcache_compress_read(pf, (unsigned char*)dens, out_len);
- ptcache_compress_read(pf, (unsigned char*)densold, out_len);
- ptcache_compress_read(pf, (unsigned char*)heat, out_len);
- ptcache_compress_read(pf, (unsigned char*)heatold, out_len);
- ptcache_compress_read(pf, (unsigned char*)vx, out_len);
- ptcache_compress_read(pf, (unsigned char*)vy, out_len);
- ptcache_compress_read(pf, (unsigned char*)vz, out_len);
- ptcache_compress_read(pf, (unsigned char*)vxold, out_len);
- ptcache_compress_read(pf, (unsigned char*)vyold, out_len);
- ptcache_compress_read(pf, (unsigned char*)vzold, out_len);
- ptcache_compress_read(pf, (unsigned char*)obstacles, (unsigned int)res);
+ ptcache_file_compressed_read(pf, (unsigned char *)sds->shadow, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)dens, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)densold, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)heat, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)heatold, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)vx, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)vy, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)vz, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)vxold, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)vyold, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)vzold, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)obstacles, (unsigned int)res);
ptcache_file_read(pf, &dt, 1, sizeof(float));
ptcache_file_read(pf, &dx, 1, sizeof(float));
- }
-}
-static void ptcache_read_smoke_turbulence(PTCacheFile *pf, void *smoke_v)
-{
- SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
- SmokeDomainSettings *sds = smd->domain;
-
- if(sds->fluid) {
- int res = sds->res[0]*sds->res[1]*sds->res[2];
- int res_big, res_big_array[3];
- float *dens, *densold, *tcu, *tcv, *tcw;
- unsigned int out_len = sizeof(float)*(unsigned int)res;
- unsigned int out_len_big;
+ if(pf->data_types & (1<<BPHYS_DATA_SMOKE_HIGH) && sds->wt) {
+ int res = sds->res[0]*sds->res[1]*sds->res[2];
+ int res_big, res_big_array[3];
+ float *dens, *densold, *tcu, *tcv, *tcw;
+ unsigned int out_len = sizeof(float)*(unsigned int)res;
+ unsigned int out_len_big;
- smoke_turbulence_get_res(sds->wt, res_big_array);
- res_big = res_big_array[0]*res_big_array[1]*res_big_array[2];
- out_len_big = sizeof(float) * (unsigned int)res_big;
+ smoke_turbulence_get_res(sds->wt, res_big_array);
+ res_big = res_big_array[0]*res_big_array[1]*res_big_array[2];
+ out_len_big = sizeof(float) * (unsigned int)res_big;
- smoke_turbulence_export(sds->wt, &dens, &densold, &tcu, &tcv, &tcw);
+ smoke_turbulence_export(sds->wt, &dens, &densold, &tcu, &tcv, &tcw);
- ptcache_compress_read(pf, (unsigned char*)dens, out_len_big);
- ptcache_compress_read(pf, (unsigned char*)densold, out_len_big);
+ ptcache_file_compressed_read(pf, (unsigned char*)dens, out_len_big);
+ ptcache_file_compressed_read(pf, (unsigned char*)densold, out_len_big);
- ptcache_compress_read(pf, (unsigned char*)tcu, out_len);
- ptcache_compress_read(pf, (unsigned char*)tcv, out_len);
- ptcache_compress_read(pf, (unsigned char*)tcw, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)tcu, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)tcv, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)tcw, out_len);
+ }
}
}
-void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd)
+/* Creating ID's */
+void BKE_ptcache_id_from_softbody(PTCacheID *pid, Object *ob, SoftBody *sb)
{
- SmokeDomainSettings *sds = smd->domain;
-
memset(pid, 0, sizeof(PTCacheID));
pid->ob= ob;
- pid->calldata= smd;
-
- pid->type= PTCACHE_TYPE_SMOKE_DOMAIN;
- pid->stack_index= sds->point_cache[0]->index;
-
- pid->cache= sds->point_cache[0];
- pid->cache_ptr= &(sds->point_cache[0]);
- pid->ptcaches= &(sds->ptcaches[0]);
+ pid->calldata= sb;
+ pid->type= PTCACHE_TYPE_SOFTBODY;
+ pid->cache= sb->pointcache;
+ pid->cache_ptr= &sb->pointcache;
+ pid->ptcaches= &sb->ptcaches;
+ pid->totpoint= pid->totwrite= ptcache_softbody_totpoint;
- pid->totpoint= pid->totwrite= ptcache_totpoint_smoke;
+ pid->write_point = ptcache_softbody_write;
+ pid->read_point = ptcache_softbody_read;
+ pid->interpolate_point = ptcache_softbody_interpolate;
- pid->write_elem= NULL;
- pid->read_elem= NULL;
+ pid->write_stream = NULL;
+ pid->read_stream = NULL;
- pid->read_stream = ptcache_read_smoke;
- pid->write_stream = ptcache_write_smoke;
-
- pid->interpolate_elem= NULL;
+ pid->write_extra_data = NULL;
+ pid->read_extra_data = NULL;
+ pid->interpolate_extra_data = NULL;
- pid->write_header= ptcache_write_basic_header;
- pid->read_header= ptcache_read_basic_header;
+ pid->write_header = ptcache_basic_header_write;
+ pid->read_header = ptcache_basic_header_read;
- pid->data_types= (1<<BPHYS_DATA_LOCATION); // bogus values to make pointcache happy
+ pid->data_types= (1<<BPHYS_DATA_LOCATION) | (1<<BPHYS_DATA_VELOCITY);
pid->info_types= 0;
-}
-void BKE_ptcache_id_from_smoke_turbulence(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd)
+ pid->stack_index = pid->cache->index;
+}
+void BKE_ptcache_id_from_particles(PTCacheID *pid, Object *ob, ParticleSystem *psys)
{
- SmokeDomainSettings *sds = smd->domain;
-
memset(pid, 0, sizeof(PTCacheID));
pid->ob= ob;
- pid->calldata= smd;
-
- pid->type= PTCACHE_TYPE_SMOKE_HIGHRES;
- pid->stack_index= sds->point_cache[1]->index;
+ pid->calldata= psys;
+ pid->type= PTCACHE_TYPE_PARTICLES;
+ pid->stack_index= psys->pointcache->index;
+ pid->cache= psys->pointcache;
+ pid->cache_ptr= &psys->pointcache;
+ pid->ptcaches= &psys->ptcaches;
- pid->cache= sds->point_cache[1];
- pid->cache_ptr= &sds->point_cache[1];
- pid->ptcaches= &sds->ptcaches[1];
+ if(psys->part->type != PART_HAIR)
+ pid->flag |= PTCACHE_VEL_PER_SEC;
- pid->totpoint= pid->totwrite= ptcache_totpoint_smoke_turbulence;
+ pid->totpoint = ptcache_particle_totpoint;
+ pid->totwrite = ptcache_particle_totwrite;
- pid->write_elem= NULL;
- pid->read_elem= NULL;
+ pid->write_point = ptcache_particle_write;
+ pid->read_point = ptcache_particle_read;
+ pid->interpolate_point = ptcache_particle_interpolate;
- pid->read_stream = ptcache_read_smoke_turbulence;
- pid->write_stream = ptcache_write_smoke_turbulence;
-
- pid->interpolate_elem= NULL;
+ pid->write_stream = NULL;
+ pid->read_stream = NULL;
- pid->write_header= ptcache_write_basic_header;
- pid->read_header= ptcache_read_basic_header;
+ pid->write_extra_data = NULL;
+ pid->read_extra_data = NULL;
+ pid->interpolate_extra_data = NULL;
- pid->data_types= (1<<BPHYS_DATA_LOCATION); // bogus values tot make pointcache happy
- pid->info_types= 0;
-}
+ pid->write_header = ptcache_basic_header_write;
+ pid->read_header = ptcache_basic_header_read;
+
+ pid->data_types = (1<<BPHYS_DATA_LOCATION) | (1<<BPHYS_DATA_VELOCITY) | (1<<BPHYS_DATA_INDEX);
+
+ if(psys->part->phystype == PART_PHYS_BOIDS)
+ pid->data_types|= (1<<BPHYS_DATA_AVELOCITY) | (1<<BPHYS_DATA_ROTATION) | (1<<BPHYS_DATA_BOIDS);
+ else if(psys->part->phystype == PART_PHYS_FLUID && psys->part->fluid && psys->part->fluid->flag & SPH_VISCOELASTIC_SPRINGS) {
+ pid->write_extra_data = ptcache_particle_extra_write;
+ pid->read_extra_data = ptcache_particle_extra_read;
+ }
+ if(psys->part->rotmode!=PART_ROT_VEL
+ || psys->part->avemode!=PART_AVE_SPIN || psys->part->avefac!=0.0f)
+ pid->data_types|= (1<<BPHYS_DATA_AVELOCITY) | (1<<BPHYS_DATA_ROTATION);
+
+ if(psys->part->flag & PART_ROT_DYN)
+ pid->data_types|= (1<<BPHYS_DATA_ROTATION);
+
+ pid->info_types= (1<<BPHYS_DATA_TIMES);
+}
void BKE_ptcache_id_from_cloth(PTCacheID *pid, Object *ob, ClothModifierData *clmd)
{
memset(pid, 0, sizeof(PTCacheID));
@@ -978,21 +738,65 @@ void BKE_ptcache_id_from_cloth(PTCacheID *pid, Object *ob, ClothModifierData *cl
pid->cache= clmd->point_cache;
pid->cache_ptr= &clmd->point_cache;
pid->ptcaches= &clmd->ptcaches;
- pid->totpoint= pid->totwrite= ptcache_totpoint_cloth;
+ pid->totpoint= pid->totwrite= ptcache_cloth_totpoint;
+
+ pid->write_point = ptcache_cloth_write;
+ pid->read_point = ptcache_cloth_read;
+ pid->interpolate_point = ptcache_cloth_interpolate;
+
+ pid->write_stream = NULL;
+ pid->read_stream = NULL;
- pid->write_elem= ptcache_write_cloth;
- pid->write_stream = NULL;
- pid->read_stream = NULL;
- pid->read_elem= ptcache_read_cloth;
- pid->interpolate_elem= ptcache_interpolate_cloth;
+ pid->write_extra_data = NULL;
+ pid->read_extra_data = NULL;
+ pid->interpolate_extra_data = NULL;
- pid->write_header= ptcache_write_basic_header;
- pid->read_header= ptcache_read_basic_header;
+ pid->write_header = ptcache_basic_header_write;
+ pid->read_header = ptcache_basic_header_read;
pid->data_types= (1<<BPHYS_DATA_LOCATION) | (1<<BPHYS_DATA_VELOCITY) | (1<<BPHYS_DATA_XCONST);
pid->info_types= 0;
}
+void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd)
+{
+ SmokeDomainSettings *sds = smd->domain;
+
+ memset(pid, 0, sizeof(PTCacheID));
+
+ pid->ob= ob;
+ pid->calldata= smd;
+
+ pid->type= PTCACHE_TYPE_SMOKE_DOMAIN;
+ pid->stack_index= sds->point_cache[0]->index;
+
+ pid->cache= sds->point_cache[0];
+ pid->cache_ptr= &(sds->point_cache[0]);
+ pid->ptcaches= &(sds->ptcaches[0]);
+
+ pid->totpoint= pid->totwrite= ptcache_smoke_totpoint;
+ pid->write_point = NULL;
+ pid->read_point = NULL;
+ pid->interpolate_point = NULL;
+
+ pid->read_stream = ptcache_smoke_read;
+ pid->write_stream = ptcache_smoke_write;
+
+ pid->write_extra_data = NULL;
+ pid->read_extra_data = NULL;
+ pid->interpolate_extra_data = NULL;
+
+ pid->write_header = ptcache_basic_header_write;
+ pid->read_header = ptcache_basic_header_read;
+
+ pid->data_types= 0;
+ pid->info_types= 0;
+
+ if(sds->fluid)
+ pid->data_types |= (1<<BPHYS_DATA_SMOKE_LOW);
+ if(sds->wt)
+ pid->data_types |= (1<<BPHYS_DATA_SMOKE_HIGH);
+}
void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int duplis)
{
PTCacheID *pid;
@@ -1008,11 +812,23 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int dup
}
for(psys=ob->particlesystem.first; psys; psys=psys->next) {
- if(psys->part) {
- pid= MEM_callocN(sizeof(PTCacheID), "PTCacheID");
- BKE_ptcache_id_from_particles(pid, ob, psys);
- BLI_addtail(lb, pid);
- }
+ if(psys->part==NULL)
+ continue;
+
+ /* check to make sure point cache is actually used by the particles */
+ if(ELEM(psys->part->phystype, PART_PHYS_NO, PART_PHYS_KEYED))
+ continue;
+
+ /* hair needs to be included in id-list for cache edit mode to work */
+ /* if(psys->part->type == PART_HAIR && (psys->flag & PSYS_HAIR_DYNAMICS)==0) */
+ /* continue; */
+
+ if(psys->part->type == PART_FLUID)
+ continue;
+
+ pid= MEM_callocN(sizeof(PTCacheID), "PTCacheID");
+ BKE_ptcache_id_from_particles(pid, ob, psys);
+ BLI_addtail(lb, pid);
}
for(md=ob->modifiers.first; md; md=md->next) {
@@ -1028,10 +844,6 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int dup
pid= MEM_callocN(sizeof(PTCacheID), "PTCacheID");
BKE_ptcache_id_from_smoke(pid, ob, (SmokeModifierData*)md);
BLI_addtail(lb, pid);
-
- pid= MEM_callocN(sizeof(PTCacheID), "PTCacheID");
- BKE_ptcache_id_from_smoke_turbulence(pid, ob, (SmokeModifierData*)md);
- BLI_addtail(lb, pid);
}
}
}
@@ -1045,7 +857,7 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int dup
if(dob->ob != ob) { /* avoids recursive loops with dupliframes: bug 22988 */
ListBase lb_dupli_pid;
BKE_ptcache_ids_from_object(&lb_dupli_pid, dob->ob, scene, duplis);
- addlisttolist(lb, &lb_dupli_pid);
+ BLI_movelisttolist(lb, &lb_dupli_pid);
if(lb_dupli_pid.first)
printf("Adding Dupli\n");
}
@@ -1056,7 +868,6 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int dup
}
}
-
/* File handling */
/* Takes an Object ID and returns a unique name
@@ -1070,8 +881,8 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int dup
static int ptcache_path(PTCacheID *pid, char *filename)
{
- Library *lib= (pid)? pid->ob->id.lib: NULL;
- const char *blendfilename= (lib && (pid->cache->flag & PTCACHE_IGNORE_LIBPATH)==0) ? lib->filepath: G.sce;
+ Library *lib= (pid->ob)? pid->ob->id.lib: NULL;
+ const char *blendfilename= (lib && (pid->cache->flag & PTCACHE_IGNORE_LIBPATH)==0) ? lib->filepath: G.main->name;
size_t i;
if(pid->cache->flag & PTCACHE_EXTERNAL) {
@@ -1104,7 +915,7 @@ static int ptcache_path(PTCacheID *pid, char *filename)
return BLI_add_slash(filename); /* new strlen() */
}
-static int BKE_ptcache_id_filename(PTCacheID *pid, char *filename, int cfra, short do_path, short do_ext)
+static int ptcache_filename(PTCacheID *pid, char *filename, int cfra, short do_path, short do_ext)
{
int len=0;
char *idname;
@@ -1169,7 +980,7 @@ static PTCacheFile *ptcache_file_open(PTCacheID *pid, int mode, int cfra)
#endif
if (!G.relbase_valid && (pid->cache->flag & PTCACHE_EXTERNAL)==0) return NULL; /* save blend file before using disk pointcache */
- BKE_ptcache_id_filename(pid, filename, cfra, 1, 1);
+ ptcache_filename(pid, filename, cfra, 1, 1);
if (mode==PTCACHE_FILE_READ) {
if (!BLI_exists(filename)) {
@@ -1189,48 +1000,155 @@ static PTCacheFile *ptcache_file_open(PTCacheID *pid, int mode, int cfra)
pf= MEM_mallocN(sizeof(PTCacheFile), "PTCacheFile");
pf->fp= fp;
+ pf->old_format = 0;
+ pf->frame = cfra;
return pf;
}
-
static void ptcache_file_close(PTCacheFile *pf)
{
- fclose(pf->fp);
- MEM_freeN(pf);
+ if(pf) {
+ fclose(pf->fp);
+ MEM_freeN(pf);
+ }
+}
+
+static int ptcache_file_compressed_read(PTCacheFile *pf, unsigned char *result, unsigned int len)
+{
+ int r = 0;
+ unsigned char compressed = 0;
+ size_t in_len;
+#ifdef WITH_LZO
+ size_t out_len = len;
+ size_t sizeOfIt = 5;
+#endif
+ unsigned char *in;
+ unsigned char *props = MEM_callocN(16*sizeof(char), "tmp");
+
+ ptcache_file_read(pf, &compressed, 1, sizeof(unsigned char));
+ if(compressed) {
+ unsigned int size;
+ ptcache_file_read(pf, &size, 1, sizeof(unsigned int));
+ in_len = (size_t)size;
+ if(in_len==0) {
+ /* do nothing */
+ }
+ else {
+ in = (unsigned char *)MEM_callocN(sizeof(unsigned char)*in_len, "pointcache_compressed_buffer");
+ ptcache_file_read(pf, in, in_len, sizeof(unsigned char));
+#ifdef WITH_LZO
+ if(compressed == 1)
+ r = lzo1x_decompress_safe(in, (lzo_uint)in_len, result, (lzo_uint *)&out_len, NULL);
+#endif
+#ifdef WITH_LZMA
+ if(compressed == 2)
+ {
+ size_t leni = in_len, leno = out_len;
+ ptcache_file_read(pf, &size, 1, sizeof(unsigned int));
+ sizeOfIt = (size_t)size;
+ ptcache_file_read(pf, props, sizeOfIt, sizeof(unsigned char));
+ r = LzmaUncompress(result, &leno, in, &leni, props, sizeOfIt);
+ }
+#endif
+ MEM_freeN(in);
+ }
+ }
+ else {
+ ptcache_file_read(pf, result, len, sizeof(unsigned char));
+ }
+
+ MEM_freeN(props);
+
+ return r;
}
+static int ptcache_file_compressed_write(PTCacheFile *pf, unsigned char *in, unsigned int in_len, unsigned char *out, int mode)
+{
+ int r = 0;
+ unsigned char compressed = 0;
+ size_t out_len= 0;
+ unsigned char *props = MEM_callocN(16*sizeof(char), "tmp");
+ size_t sizeOfIt = 5;
-static int ptcache_file_read(PTCacheFile *pf, void *f, size_t tot, int size)
+ (void)mode; /* unused when building w/o compression */
+
+#ifdef WITH_LZO
+ out_len= LZO_OUT_LEN(in_len);
+ if(mode == 1) {
+ LZO_HEAP_ALLOC(wrkmem, LZO1X_MEM_COMPRESS);
+
+ r = lzo1x_1_compress(in, (lzo_uint)in_len, out, (lzo_uint *)&out_len, wrkmem);
+ if (!(r == LZO_E_OK) || (out_len >= in_len))
+ compressed = 0;
+ else
+ compressed = 1;
+ }
+#endif
+#ifdef WITH_LZMA
+ if(mode == 2) {
+
+ r = LzmaCompress(out, &out_len, in, in_len,//assume sizeof(char)==1....
+ props, &sizeOfIt, 5, 1 << 24, 3, 0, 2, 32, 2);
+
+ if(!(r == SZ_OK) || (out_len >= in_len))
+ compressed = 0;
+ else
+ compressed = 2;
+ }
+#endif
+
+ ptcache_file_write(pf, &compressed, 1, sizeof(unsigned char));
+ if(compressed) {
+ unsigned int size = out_len;
+ ptcache_file_write(pf, &size, 1, sizeof(unsigned int));
+ ptcache_file_write(pf, out, out_len, sizeof(unsigned char));
+ }
+ else
+ ptcache_file_write(pf, in, in_len, sizeof(unsigned char));
+
+ if(compressed == 2)
+ {
+ unsigned int size = sizeOfIt;
+ ptcache_file_write(pf, &sizeOfIt, 1, sizeof(unsigned int));
+ ptcache_file_write(pf, props, size, sizeof(unsigned char));
+ }
+
+ MEM_freeN(props);
+
+ return r;
+}
+static int ptcache_file_read(PTCacheFile *pf, void *f, unsigned int tot, unsigned int size)
{
return (fread(f, size, tot, pf->fp) == tot);
}
-static int ptcache_file_write(PTCacheFile *pf, void *f, size_t tot, int size)
+static int ptcache_file_write(PTCacheFile *pf, void *f, unsigned int tot, unsigned int size)
{
return (fwrite(f, size, tot, pf->fp) == tot);
}
-static int ptcache_file_read_data(PTCacheFile *pf)
+static int ptcache_file_data_read(PTCacheFile *pf)
{
int i;
for(i=0; i<BPHYS_TOT_DATA; i++) {
- if(pf->data_types & (1<<i) && !ptcache_file_read(pf, pf->cur[i], 1, ptcache_data_size[i]))
+ if((pf->data_types & (1<<i)) && !ptcache_file_read(pf, pf->cur[i], 1, ptcache_data_size[i]))
return 0;
}
return 1;
}
-static int ptcache_file_write_data(PTCacheFile *pf)
+static int ptcache_file_data_write(PTCacheFile *pf)
{
int i;
for(i=0; i<BPHYS_TOT_DATA; i++) {
- if(pf->data_types & (1<<i) && !ptcache_file_write(pf, pf->cur[i], 1, ptcache_data_size[i]))
+ if((pf->data_types & (1<<i)) && !ptcache_file_write(pf, pf->cur[i], 1, ptcache_data_size[i]))
return 0;
}
return 1;
}
-static int ptcache_file_read_header_begin(PTCacheFile *pf)
+static int ptcache_file_header_begin_read(PTCacheFile *pf)
{
+ unsigned int typeflag=0;
int error=0;
char bphysics[8];
@@ -1242,8 +1160,11 @@ static int ptcache_file_read_header_begin(PTCacheFile *pf)
if(!error && strncmp(bphysics, "BPHYSICS", 8))
error = 1;
- if(!error && !fread(&pf->type, sizeof(int), 1, pf->fp))
+ if(!error && !fread(&typeflag, sizeof(unsigned int), 1, pf->fp))
error = 1;
+
+ pf->type = (typeflag & PTCACHE_TYPEFLAG_TYPEMASK);
+ pf->flag = (typeflag & PTCACHE_TYPEFLAG_FLAGMASK);
/* if there was an error set file as it was */
if(error)
@@ -1251,84 +1172,82 @@ static int ptcache_file_read_header_begin(PTCacheFile *pf)
return !error;
}
-
-
-static int ptcache_file_write_header_begin(PTCacheFile *pf)
+static int ptcache_file_header_begin_write(PTCacheFile *pf)
{
- char *bphysics = "BPHYSICS";
+ const char *bphysics = "BPHYSICS";
+ unsigned int typeflag = pf->type + pf->flag;
if(fwrite(bphysics, sizeof(char), 8, pf->fp) != 8)
return 0;
- if(!fwrite(&pf->type, sizeof(int), 1, pf->fp))
+ if(!fwrite(&typeflag, sizeof(unsigned int), 1, pf->fp))
return 0;
return 1;
}
-
/* Data pointer handling */
int BKE_ptcache_data_size(int data_type)
{
return ptcache_data_size[data_type];
}
-static void ptcache_file_init_pointers(PTCacheFile *pf)
+static void ptcache_file_pointers_init(PTCacheFile *pf)
{
int data_types = pf->data_types;
- pf->cur[BPHYS_DATA_INDEX] = data_types & (1<<BPHYS_DATA_INDEX) ? &pf->data.index : NULL;
- pf->cur[BPHYS_DATA_LOCATION] = data_types & (1<<BPHYS_DATA_LOCATION) ? &pf->data.loc : NULL;
- pf->cur[BPHYS_DATA_VELOCITY] = data_types & (1<<BPHYS_DATA_VELOCITY) ? &pf->data.vel : NULL;
- pf->cur[BPHYS_DATA_ROTATION] = data_types & (1<<BPHYS_DATA_ROTATION) ? &pf->data.rot : NULL;
- pf->cur[BPHYS_DATA_AVELOCITY] = data_types & (1<<BPHYS_DATA_AVELOCITY) ? &pf->data.ave : NULL;
- pf->cur[BPHYS_DATA_SIZE] = data_types & (1<<BPHYS_DATA_SIZE) ? &pf->data.size : NULL;
- pf->cur[BPHYS_DATA_TIMES] = data_types & (1<<BPHYS_DATA_TIMES) ? &pf->data.times : NULL;
- pf->cur[BPHYS_DATA_BOIDS] = data_types & (1<<BPHYS_DATA_BOIDS) ? &pf->data.boids : NULL;
+ pf->cur[BPHYS_DATA_INDEX] = (data_types & (1<<BPHYS_DATA_INDEX)) ? &pf->data.index : NULL;
+ pf->cur[BPHYS_DATA_LOCATION] = (data_types & (1<<BPHYS_DATA_LOCATION)) ? &pf->data.loc : NULL;
+ pf->cur[BPHYS_DATA_VELOCITY] = (data_types & (1<<BPHYS_DATA_VELOCITY)) ? &pf->data.vel : NULL;
+ pf->cur[BPHYS_DATA_ROTATION] = (data_types & (1<<BPHYS_DATA_ROTATION)) ? &pf->data.rot : NULL;
+ pf->cur[BPHYS_DATA_AVELOCITY] = (data_types & (1<<BPHYS_DATA_AVELOCITY))? &pf->data.ave : NULL;
+ pf->cur[BPHYS_DATA_SIZE] = (data_types & (1<<BPHYS_DATA_SIZE)) ? &pf->data.size : NULL;
+ pf->cur[BPHYS_DATA_TIMES] = (data_types & (1<<BPHYS_DATA_TIMES)) ? &pf->data.times : NULL;
+ pf->cur[BPHYS_DATA_BOIDS] = (data_types & (1<<BPHYS_DATA_BOIDS)) ? &pf->data.boids : NULL;
}
-static void ptcache_file_seek_pointers(int index, PTCacheFile *pf)
+/* Check to see if point number "index" is in pm, uses binary search for index data. */
+int BKE_ptcache_mem_index_find(PTCacheMem *pm, unsigned int index)
{
- int i, size=0;
- int data_types = pf->data_types;
+ if(pm->data[BPHYS_DATA_INDEX]) {
+ unsigned int *data = pm->data[BPHYS_DATA_INDEX];
+ unsigned int mid, low = 0, high = pm->totpoint - 1;
- if(data_types & (1<<BPHYS_DATA_INDEX)) {
- int totpoint;
- /* The simplest solution is to just write to the very end. This may cause
- * some data duplication, but since it's on disk it's not so bad. The correct
- * thing would be to search through the file for the correct index and only
- * write to the end if it's not found, but this could be quite slow.
- */
- fseek(pf->fp, 8 + sizeof(int), SEEK_SET);
- fread(&totpoint, sizeof(int), 1, pf->fp);
-
- totpoint++;
+ if(index < *data || index > *(data+high))
+ return -1;
- fseek(pf->fp, 8 + sizeof(int), SEEK_SET);
- fwrite(&totpoint, sizeof(int), 1, pf->fp);
+ /* check simple case for continuous indexes first */
+ if(index-*data < high && data[index-*data] == index)
+ return index-*data;
+
+ while(low <= high) {
+ mid= (low + high)/2;
+
+ if(data[mid] > index)
+ high = mid - 1;
+ else if(data[mid] < index)
+ low = mid + 1;
+ else
+ return mid;
+ }
- fseek(pf->fp, 0, SEEK_END);
+ return -1;
}
else {
- for(i=0; i<BPHYS_TOT_DATA; i++)
- size += pf->data_types & (1<<i) ? ptcache_data_size[i] : 0;
-
- /* size of default header + data up to index */
- fseek(pf->fp, 8 + 3*sizeof(int) + index * size, SEEK_SET);
+ return (index < pm->totpoint ? index : -1);
}
-
- ptcache_file_init_pointers(pf);
}
-void BKE_ptcache_mem_init_pointers(PTCacheMem *pm)
+
+void BKE_ptcache_mem_pointers_init(PTCacheMem *pm)
{
int data_types = pm->data_types;
int i;
for(i=0; i<BPHYS_TOT_DATA; i++)
- pm->cur[i] = data_types & (1<<i) ? pm->data[i] : NULL;
+ pm->cur[i] = ((data_types & (1<<i)) ? pm->data[i] : NULL);
}
-void BKE_ptcache_mem_incr_pointers(PTCacheMem *pm)
+void BKE_ptcache_mem_pointers_incr(PTCacheMem *pm)
{
int i;
@@ -1337,10 +1256,10 @@ void BKE_ptcache_mem_incr_pointers(PTCacheMem *pm)
pm->cur[i] = (char*)pm->cur[i] + ptcache_data_size[i];
}
}
-int BKE_ptcache_mem_seek_pointers(int point_index, PTCacheMem *pm)
+int BKE_ptcache_mem_pointers_seek(int point_index, PTCacheMem *pm)
{
int data_types = pm->data_types;
- int i, index = pm->index_array ? pm->index_array[point_index] - 1 : point_index;
+ int i, index = BKE_ptcache_mem_index_find(pm, point_index);
if(index < 0) {
/* Can't give proper location without reallocation, so don't give any location.
@@ -1356,7 +1275,7 @@ int BKE_ptcache_mem_seek_pointers(int point_index, PTCacheMem *pm)
return 1;
}
-static void ptcache_alloc_data(PTCacheMem *pm)
+static void ptcache_data_alloc(PTCacheMem *pm)
{
int data_types = pm->data_types;
int totpoint = pm->totpoint;
@@ -1367,7 +1286,7 @@ static void ptcache_alloc_data(PTCacheMem *pm)
pm->data[i] = MEM_callocN(totpoint * ptcache_data_size[i], "PTCache Data");
}
}
-static void ptcache_free_data(PTCacheMem *pm)
+static void ptcache_data_free(PTCacheMem *pm)
{
void **data = pm->data;
int i;
@@ -1376,13 +1295,8 @@ static void ptcache_free_data(PTCacheMem *pm)
if(data[i])
MEM_freeN(data[i]);
}
-
- if(pm->index_array) {
- MEM_freeN(pm->index_array);
- pm->index_array = NULL;
- }
}
-static void ptcache_copy_data(void *from[], void *to[])
+static void ptcache_data_copy(void *from[], void *to[])
{
int i;
for(i=0; i<BPHYS_TOT_DATA; i++) {
@@ -1393,9 +1307,20 @@ static void ptcache_copy_data(void *from[], void *to[])
}
}
+static void ptcache_extra_free(PTCacheMem *pm)
+{
+ PTCacheExtra *extra = pm->extradata.first;
+ if(extra) {
+ for(; extra; extra=extra->next) {
+ if(extra->data)
+ MEM_freeN(extra->data);
+ }
-static int ptcache_pid_old_elemsize(PTCacheID *pid)
+ BLI_freelistN(&pm->extradata);
+ }
+}
+static int ptcache_old_elemsize(PTCacheID *pid)
{
if(pid->type==PTCACHE_TYPE_SOFTBODY)
return 6 * sizeof(float);
@@ -1407,268 +1332,408 @@ static int ptcache_pid_old_elemsize(PTCacheID *pid)
return 0;
}
-/* reads cache from disk or memory */
-/* possible to get old or interpolated result */
-int BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec)
+static void ptcache_find_frames_around(PTCacheID *pid, unsigned int frame, int *fra1, int *fra2)
{
- PTCacheFile *pf=NULL, *pf2=NULL;
- PTCacheMem *pm=NULL, *pm2=NULL;
- float old_data1[14], old_data2[14];
- int cfrai = (int)cfra;
- int old_elemsize = ptcache_pid_old_elemsize(pid);
- int i;
+ if(pid->cache->flag & PTCACHE_DISK_CACHE) {
+ int cfra1=frame-1, cfra2=frame+1;
- int cfra1 = 0, cfra2 = 0;
- int totpoint = 0, totpoint2 = 0;
- int *index = &i, *index2 = &i;
- int use_old = 0, old_frame = 0;
+ while(cfra1 >= pid->cache->startframe && !BKE_ptcache_id_exist(pid, cfra1))
+ cfra1--;
- int ret = 0, error = 0;
+ if(cfra1 < pid->cache->startframe)
+ cfra1 = 0;
- /* nothing to read to */
- if(pid->totpoint(pid->calldata, (int)cfra) == 0)
- return 0;
+ while(cfra2 <= pid->cache->endframe && !BKE_ptcache_id_exist(pid, cfra2))
+ cfra2++;
- if(pid->cache->flag & PTCACHE_READ_INFO) {
- pid->cache->flag &= ~PTCACHE_READ_INFO;
- BKE_ptcache_read_cache(pid, 0, frs_sec);
+ if(cfra2 > pid->cache->endframe)
+ cfra2 = 0;
+
+ if(cfra1 && !cfra2) {
+ *fra1 = 0;
+ *fra2 = cfra1;
+ }
+ else {
+ *fra1 = cfra1;
+ *fra2 = cfra2;
+ }
}
+ else if(pid->cache->mem_cache.first) {
+ PTCacheMem *pm = pid->cache->mem_cache.first;
+ PTCacheMem *pm2 = pid->cache->mem_cache.last;
+ while(pm->next && pm->next->frame < frame)
+ pm= pm->next;
- /* first check if we have the actual frame cached */
- if(cfra == (float)cfrai) {
- if(pid->cache->flag & PTCACHE_DISK_CACHE) {
- pf= ptcache_file_open(pid, PTCACHE_FILE_READ, cfrai);
- }
+ if(pm2 && pm2->frame < frame)
+ pm2 = NULL;
else {
- pm = pid->cache->mem_cache.first;
+ while(pm2->prev && pm2->prev->frame > frame)
+ pm2= pm2->prev;
+ }
- for(; pm; pm=pm->next) {
- if(pm->frame == cfrai)
- break;
- }
+ if(pm && !pm2) {
+ *fra1 = 0;
+ *fra2 = pm->frame;
+ }
+ else {
+ *fra1 = pm->frame;
+ *fra2 = pm2->frame;
}
}
+}
- /* no exact cache frame found so try to find cached frames around cfra */
- if(!pm && !pf) {
- if(pid->cache->flag & PTCACHE_DISK_CACHE) {
- pf=NULL;
- while(cfrai >= pid->cache->startframe && !pf) {
- cfrai--;
- pf= ptcache_file_open(pid, PTCACHE_FILE_READ, cfrai);
- cfra1 = cfrai;
- }
+static PTCacheMem *ptcache_disk_frame_to_mem(PTCacheID *pid, int cfra)
+{
+ PTCacheFile *pf = ptcache_file_open(pid, PTCACHE_FILE_READ, cfra);
+ PTCacheMem *pm = NULL;
+ unsigned int i, error = 0;
+
+ if(pf == NULL)
+ return 0;
- old_frame = cfrai;
+ if(!ptcache_file_header_begin_read(pf))
+ error = 1;
+
+ if(!error && (pf->type != pid->type || !pid->read_header(pf)))
+ error = 1;
+
+ if(!error) {
+ pm = MEM_callocN(sizeof(PTCacheMem), "Pointcache mem");
- cfrai = (int)cfra;
- while(cfrai < pid->cache->endframe && !pf2) {
- cfrai++;
- pf2= ptcache_file_open(pid, PTCACHE_FILE_READ, cfrai);
- cfra2 = cfrai;
+ pm->totpoint = pf->totpoint;
+ pm->data_types = pf->data_types;
+ pm->frame = pf->frame;
+
+ ptcache_data_alloc(pm);
+
+ if(pf->flag & PTCACHE_TYPEFLAG_COMPRESS) {
+ for(i=0; i<BPHYS_TOT_DATA; i++) {
+ unsigned int out_len = pm->totpoint*ptcache_data_size[i];
+ if(pf->data_types & (1<<i))
+ ptcache_file_compressed_read(pf, (unsigned char*)(pm->data[i]), out_len);
}
+ }
+ else {
+ BKE_ptcache_mem_pointers_init(pm);
+ ptcache_file_pointers_init(pf);
- if(pf && !pf2) {
- pf2 = pf;
- pf = NULL;
+ for(i=0; i<pm->totpoint; i++) {
+ if(!ptcache_file_data_read(pf)) {
+ error = 1;
+ break;
+ }
+ ptcache_data_copy(pf->cur, pm->cur);
+ BKE_ptcache_mem_pointers_incr(pm);
}
}
- else if(pid->cache->mem_cache.first){
- pm = pid->cache->mem_cache.first;
+ }
- while(pm->next && pm->next->frame < cfra)
- pm= pm->next;
+ if(!error && pf->flag & PTCACHE_TYPEFLAG_EXTRADATA) {
+ unsigned int extratype = 0;
- if(pm) {
- old_frame = pm->frame;
- cfra1 = pm->frame;
- }
+ while(ptcache_file_read(pf, &extratype, 1, sizeof(unsigned int))) {
+ PTCacheExtra *extra = MEM_callocN(sizeof(PTCacheExtra), "Pointcache extradata");
- pm2 = pid->cache->mem_cache.last;
+ extra->type = extratype;
- if(pm2 && pm2->frame < cfra)
- pm2 = NULL;
- else {
- while(pm2->prev && pm2->prev->frame > cfra)
- pm2= pm2->prev;
+ ptcache_file_read(pf, &extra->totdata, 1, sizeof(unsigned int));
- if(pm2)
- cfra2 = pm2->frame;
- }
+ extra->data = MEM_callocN(extra->totdata * ptcache_extra_datasize[extra->type], "Pointcache extradata->data");
- if(pm && !pm2) {
- pm2 = pm;
- pm = NULL;
- }
+ if(pf->flag & PTCACHE_TYPEFLAG_COMPRESS)
+ ptcache_file_compressed_read(pf, (unsigned char*)(extra->data), extra->totdata*ptcache_extra_datasize[extra->type]);
+ else
+ ptcache_file_read(pf, extra->data, extra->totdata, ptcache_extra_datasize[extra->type]);
+
+ BLI_addtail(&pm->extradata, extra);
}
}
- if(!pm && !pm2 && !pf && !pf2)
- return 0;
-
- if(pm) {
- BKE_ptcache_mem_init_pointers(pm);
- totpoint = pm->totpoint;
- index = pm->data_types & (1<<BPHYS_DATA_INDEX) ? pm->cur[BPHYS_DATA_INDEX] : &i;
+ if(error && pm) {
+ ptcache_data_free(pm);
+ ptcache_extra_free(pm);
+ MEM_freeN(pm);
+ pm = NULL;
}
- if(pm2) {
- BKE_ptcache_mem_init_pointers(pm2);
- totpoint2 = pm2->totpoint;
- index2 = pm2->data_types & (1<<BPHYS_DATA_INDEX) ? pm2->cur[BPHYS_DATA_INDEX] : &i;
+
+ ptcache_file_close(pf);
+
+ if (error && G.f & G_DEBUG)
+ printf("Error reading from disk cache\n");
+
+ return pm;
+}
+static int ptcache_mem_frame_to_disk(PTCacheID *pid, PTCacheMem *pm)
+{
+ PTCacheFile *pf = NULL;
+ unsigned int i, error = 0;
+
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_FRAME, pm->frame);
+
+ pf = ptcache_file_open(pid, PTCACHE_FILE_WRITE, pm->frame);
+
+ if(pf==NULL) {
+ if (G.f & G_DEBUG)
+ printf("Error opening disk cache file for writing\n");
+ return 0;
}
- if(pf) {
- if(ptcache_file_read_header_begin(pf)) {
- if(pf->type != pid->type) {
- /* todo report error */
- ptcache_file_close(pf);
- pf = NULL;
- }
- else if(pid->read_header(pf)) {
- ptcache_file_init_pointers(pf);
- totpoint = pf->totpoint;
- index = pf->data_types & (1<<BPHYS_DATA_INDEX) ? &pf->data.index : &i;
+
+ pf->data_types = pm->data_types;
+ pf->totpoint = pm->totpoint;
+ pf->type = pid->type;
+ pf->flag = 0;
+
+ if(pm->extradata.first)
+ pf->flag |= PTCACHE_TYPEFLAG_EXTRADATA;
+
+ if(pid->cache->compression)
+ pf->flag |= PTCACHE_TYPEFLAG_COMPRESS;
+
+ if(!ptcache_file_header_begin_write(pf) || !pid->write_header(pf))
+ error = 1;
+
+ if(!error) {
+ if(pid->cache->compression) {
+ for(i=0; i<BPHYS_TOT_DATA; i++) {
+ if(pm->data[i]) {
+ unsigned int in_len = pm->totpoint*ptcache_data_size[i];
+ unsigned char *out = (unsigned char *)MEM_callocN(LZO_OUT_LEN(in_len)*4, "pointcache_lzo_buffer");
+ ptcache_file_compressed_write(pf, (unsigned char*)(pm->data[i]), in_len, out, pid->cache->compression);
+ MEM_freeN(out);
+ }
}
}
else {
- /* fall back to old cache file format */
- use_old = 1;
- totpoint = pid->totpoint(pid->calldata, (int) cfra);
+ BKE_ptcache_mem_pointers_init(pm);
+ ptcache_file_pointers_init(pf);
+
+ for(i=0; i<pm->totpoint; i++) {
+ ptcache_data_copy(pm->cur, pf->cur);
+ if(!ptcache_file_data_write(pf)) {
+ error = 1;
+ break;
+ }
+ BKE_ptcache_mem_pointers_incr(pm);
+ }
}
}
- if(pf2) {
- if(ptcache_file_read_header_begin(pf2)) {
- if(pf2->type != pid->type) {
- /* todo report error */
- ptcache_file_close(pf2);
- pf2 = NULL;
+
+ if(!error && pm->extradata.first) {
+ PTCacheExtra *extra = pm->extradata.first;
+
+ for(; extra; extra=extra->next) {
+ if(extra->data == NULL || extra->totdata == 0)
+ continue;
+
+ ptcache_file_write(pf, &extra->type, 1, sizeof(unsigned int));
+ ptcache_file_write(pf, &extra->totdata, 1, sizeof(unsigned int));
+
+ if(pid->cache->compression) {
+ unsigned int in_len = extra->totdata * ptcache_extra_datasize[extra->type];
+ unsigned char *out = (unsigned char *)MEM_callocN(LZO_OUT_LEN(in_len)*4, "pointcache_lzo_buffer");
+ ptcache_file_compressed_write(pf, (unsigned char*)(extra->data), in_len, out, pid->cache->compression);
+ MEM_freeN(out);
}
- else if(pid->read_header(pf2)) {
- ptcache_file_init_pointers(pf2);
- totpoint2 = pf2->totpoint;
- index2 = pf2->data_types & (1<<BPHYS_DATA_INDEX) ? &pf2->data.index : &i;
+ else {
+ ptcache_file_write(pf, extra->data, extra->totdata, ptcache_extra_datasize[extra->type]);
}
}
- else {
- /* fall back to old cache file format */
- use_old = 1;
- totpoint2 = pid->totpoint(pid->calldata, (int) cfra);
- }
}
- /* don't read old cache if already simulated past cached frame */
- if(!pm && !pf && cfra1 && cfra1 <= pid->cache->simframe)
+ ptcache_file_close(pf);
+
+ if (error && G.f & G_DEBUG)
+ printf("Error writing to disk cache\n");
+
+ return error==0;
+}
+
+static int ptcache_read_stream(PTCacheID *pid, int cfra)
+{
+ PTCacheFile *pf = ptcache_file_open(pid, PTCACHE_FILE_READ, cfra);
+ int error = 0;
+
+ if(pid->read_stream == NULL)
+ return 0;
+
+ if(pf == NULL) {
+ if (G.f & G_DEBUG)
+ printf("Error opening disk cache file for reading\n");
+ return 0;
+ }
+
+ if(!ptcache_file_header_begin_read(pf))
error = 1;
- if(cfra1 && cfra1==cfra2)
+
+ if(!error && (pf->type != pid->type || !pid->read_header(pf)))
error = 1;
- if(!error)
- {
- if(pf && pid->read_stream) {
- if(totpoint != pid->totpoint(pid->calldata, (int) cfra))
- error = 1;
- else
- {
- // we have stream writing here
- pid->read_stream(pf, pid->calldata);
- }
- }
+ if(!error && pf->totpoint != pid->totpoint(pid->calldata, cfra))
+ error = 1;
+
+ if(!error) {
+ ptcache_file_pointers_init(pf);
+
+ // we have stream reading here
+ pid->read_stream(pf, pid->calldata);
+ }
+
+ ptcache_file_close(pf);
+
+ return error == 0;
+}
+static int ptcache_read(PTCacheID *pid, int cfra)
+{
+ PTCacheMem *pm = NULL;
+ int i;
+ int *index = &i;
+
+ /* get a memory cache to read from */
+ if(pid->cache->flag & PTCACHE_DISK_CACHE) {
+ pm = ptcache_disk_frame_to_mem(pid, cfra);
+ }
+ else {
+ pm = pid->cache->mem_cache.first;
+
+ while(pm && pm->frame != cfra)
+ pm = pm->next;
}
- if((pid->data_types & (1<<BPHYS_DATA_INDEX)) == 0)
- totpoint = MIN2(totpoint, pid->totpoint(pid->calldata, (int) cfra));
+ /* read the cache */
+ if(pm) {
+ int totpoint = pm->totpoint;
+
+ if((pid->data_types & (1<<BPHYS_DATA_INDEX)) == 0)
+ totpoint = MIN2(totpoint, pid->totpoint(pid->calldata, cfra));
+
+ BKE_ptcache_mem_pointers_init(pm);
- if(!error)
- {
for(i=0; i<totpoint; i++) {
- /* read old cache file format */
- if(use_old) {
- if(pid->read_elem && ptcache_file_read(pf, (void*)old_data1, 1, old_elemsize))
- pid->read_elem(i, pid->calldata, NULL, frs_sec, cfra, old_data1);
- else if(pid->read_elem)
- { error = 1; break; }
- }
- else {
- if(pid->read_elem && (pm || ptcache_file_read_data(pf)))
- pid->read_elem(*index, pid->calldata, pm ? pm->cur : pf->cur, frs_sec, cfra1 ? (float)cfra1 : (float)cfrai, NULL);
- else if(pid->read_elem)
- { error = 1; break; }
- }
+ if(pm->data_types & (1<<BPHYS_DATA_INDEX))
+ index = pm->cur[BPHYS_DATA_INDEX];
- if(pm) {
- BKE_ptcache_mem_incr_pointers(pm);
- index = pm->data_types & (1<<BPHYS_DATA_INDEX) ? pm->cur[BPHYS_DATA_INDEX] : &i;
- }
+ pid->read_point(*index, pid->calldata, pm->cur, (float)pm->frame, NULL);
+
+ BKE_ptcache_mem_pointers_incr(pm);
}
- }
- if(!error)
- {
- if(pf2 && pid->read_stream) {
- if(totpoint2 != pid->totpoint(pid->calldata, (int) cfra))
- error = 1;
- else
- {
- // we have stream writing here
- pid->read_stream(pf2, pid->calldata);
- }
+ if(pid->read_extra_data && pm->extradata.first)
+ pid->read_extra_data(pid->calldata, pm, (float)pm->frame);
+
+ /* clean up temporary memory cache */
+ if(pid->cache->flag & PTCACHE_DISK_CACHE) {
+ ptcache_data_free(pm);
+ ptcache_extra_free(pm);
+ MEM_freeN(pm);
}
}
- if((pid->data_types & (1<<BPHYS_DATA_INDEX)) == 0)
- totpoint2 = MIN2(totpoint2, pid->totpoint(pid->calldata, (int) cfra));
+ return 1;
+}
+static int ptcache_interpolate(PTCacheID *pid, float cfra, int cfra1, int cfra2)
+{
+ PTCacheMem *pm = NULL;
+ int i;
+ int *index = &i;
- if(!error)
- {
- for(i=0; i<totpoint2; i++) {
- /* read old cache file format */
- if(use_old) {
- if(pid->read_elem && ptcache_file_read(pf2, (void*)old_data2, 1, old_elemsize)) {
- if(!pf && pf2)
- pid->read_elem(i, pid->calldata, NULL, frs_sec, (float)cfra2, old_data2);
- else if(pid->interpolate_elem)
- pid->interpolate_elem(i, pid->calldata, NULL, frs_sec, cfra, (float)cfra1, (float)cfra2, old_data2);
- else
- { error = 1; break; }
- }
- else if(pid->read_elem)
- { error = 1; break; }
- }
- else {
- if(pid->read_elem && (pm2 || ptcache_file_read_data(pf2))) {
- if((!pf && pf2) || (!pm && pm2))
- pid->read_elem(*index2, pid->calldata, pm2 ? pm2->cur : pf2->cur, frs_sec, (float)cfra2, NULL);
- else if(pid->interpolate_elem)
- pid->interpolate_elem(*index2, pid->calldata, pm2 ? pm2->cur : pf2->cur, frs_sec, cfra, (float)cfra1, (float)cfra2, NULL);
- else
- { error = 1; break; }
- }
- else if(pid->read_elem)
- { error = 1; break; }
- }
+ /* get a memory cache to read from */
+ if(pid->cache->flag & PTCACHE_DISK_CACHE) {
+ pm = ptcache_disk_frame_to_mem(pid, cfra2);
+ }
+ else {
+ pm = pid->cache->mem_cache.first;
+
+ while(pm && pm->frame != cfra2)
+ pm = pm->next;
+ }
- if(pm2) {
- BKE_ptcache_mem_incr_pointers(pm2);
- index2 = pm2->data_types & (1<<BPHYS_DATA_INDEX) ? pm2->cur[BPHYS_DATA_INDEX] : &i;
- }
+ /* read the cache */
+ if(pm) {
+ int totpoint = pm->totpoint;
+
+ if((pid->data_types & (1<<BPHYS_DATA_INDEX)) == 0)
+ totpoint = MIN2(totpoint, pid->totpoint(pid->calldata, (int)cfra));
+
+ BKE_ptcache_mem_pointers_init(pm);
+
+ for(i=0; i<totpoint; i++) {
+ if(pm->data_types & (1<<BPHYS_DATA_INDEX))
+ index = pm->cur[BPHYS_DATA_INDEX];
+
+ pid->interpolate_point(*index, pid->calldata, pm->cur, cfra, (float)cfra1, (float)cfra2, NULL);
+ BKE_ptcache_mem_pointers_incr(pm);
+ }
+
+ if(pid->interpolate_extra_data && pm->extradata.first)
+ pid->interpolate_extra_data(pid->calldata, pm, cfra, (float)cfra1, (float)cfra2);
+
+ /* clean up temporary memory cache */
+ if(pid->cache->flag & PTCACHE_DISK_CACHE) {
+ ptcache_data_free(pm);
+ ptcache_extra_free(pm);
+ MEM_freeN(pm);
}
}
- if(pm || pf)
- ret = (pm2 || pf2) ? PTCACHE_READ_INTERPOLATED : PTCACHE_READ_EXACT;
- else if(pm2 || pf2) {
- ret = PTCACHE_READ_OLD;
- pid->cache->simframe = old_frame;
+ return 1;
+}
+/* reads cache from disk or memory */
+/* possible to get old or interpolated result */
+int BKE_ptcache_read(PTCacheID *pid, float cfra)
+{
+ int cfrai = (int)cfra, cfra1=0, cfra2=0;
+ int ret = 0;
+
+ /* nothing to read to */
+ if(pid->totpoint(pid->calldata, cfrai) == 0)
+ return 0;
+
+ if(pid->cache->flag & PTCACHE_READ_INFO) {
+ pid->cache->flag &= ~PTCACHE_READ_INFO;
+ ptcache_read(pid, 0);
}
- if(pf) {
- ptcache_file_close(pf);
- pf = NULL;
+ /* first check if we have the actual frame cached */
+ if(cfra == (float)cfrai && BKE_ptcache_id_exist(pid, cfrai))
+ cfra1 = cfrai;
+
+ /* no exact cache frame found so try to find cached frames around cfra */
+ if(cfra1 == 0)
+ ptcache_find_frames_around(pid, cfrai, &cfra1, &cfra2);
+
+ if(cfra1 == 0 && cfra2 == 0)
+ return 0;
+
+ /* don't read old cache if already simulated past cached frame */
+ if(cfra1 == 0 && cfra2 && cfra2 <= pid->cache->simframe)
+ return 0;
+ if(cfra1 && cfra1 == cfra2)
+ return 0;
+
+ if(cfra1) {
+ if(pid->read_stream)
+ ptcache_read_stream(pid, cfra1);
+ else if(pid->read_point)
+ ptcache_read(pid, cfra1);
}
- if(pf2) {
- ptcache_file_close(pf2);
- pf = NULL;
+ if(cfra2) {
+ if(pid->read_stream)
+ ptcache_read_stream(pid, cfra2);
+ else if(pid->read_point) {
+ if(cfra1 && cfra2 && pid->interpolate_point)
+ ptcache_interpolate(pid, cfra, cfra1, cfra2);
+ else
+ ptcache_read(pid, cfra2);
+ }
+ }
+
+ if(cfra1)
+ ret = (cfra2 ? PTCACHE_READ_INTERPOLATED : PTCACHE_READ_EXACT);
+ else if(cfra2) {
+ ret = PTCACHE_READ_OLD;
+ pid->cache->simframe = cfra2;
}
if((pid->cache->flag & PTCACHE_QUICK_CACHE)==0) {
@@ -1681,218 +1746,208 @@ int BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec)
if(cfra <= pid->cache->last_exact)
pid->cache->flag &= ~PTCACHE_FRAMES_SKIPPED;
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_AFTER, MAX2(cfrai,pid->cache->last_exact));
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_AFTER, MAX2(cfrai, pid->cache->last_exact));
}
}
- return (error ? 0 : ret);
+ return ret;
}
-/* TODO for later */
-static void ptcache_make_index_array(PTCacheMem *pm, int totpoint)
+static int ptcache_write_stream(PTCacheID *pid, int cfra, int totpoint)
{
- int i, *index;
+ PTCacheFile *pf = NULL;
+ int error = 0;
+
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_FRAME, cfra);
+
+ pf = ptcache_file_open(pid, PTCACHE_FILE_WRITE, cfra);
- if(pm->index_array) {
- MEM_freeN(pm->index_array);
- pm->index_array = NULL;
+ if(pf==NULL) {
+ if (G.f & G_DEBUG)
+ printf("Error opening disk cache file for writing\n");
+ return 0;
}
- if(!pm->data[BPHYS_DATA_INDEX])
- return;
+ pf->data_types = pid->data_types;
+ pf->totpoint = totpoint;
+ pf->type = pid->type;
+ pf->flag = 0;
+
+ if(!error && (!ptcache_file_header_begin_write(pf) || !pid->write_header(pf)))
+ error = 1;
- pm->index_array = MEM_callocN(totpoint * sizeof(int), "PTCacheMem index_array");
- index = pm->data[BPHYS_DATA_INDEX];
+ if(!error && pid->write_stream)
+ pid->write_stream(pf, pid->calldata);
- for(i=0; i<pm->totpoint; i++, index++)
- pm->index_array[*index] = i + 1;
+ ptcache_file_close(pf);
+
+ if (error && G.f & G_DEBUG)
+ printf("Error writing to disk cache\n");
+
+ return error == 0;
}
-/* writes cache to disk or memory */
-int BKE_ptcache_write_cache(PTCacheID *pid, int cfra)
+static int ptcache_write(PTCacheID *pid, int cfra, int overwrite)
{
PointCache *cache = pid->cache;
- PTCacheFile *pf= NULL, *pf2= NULL;
- int i;
+ PTCacheMem *pm=NULL, *pm2=NULL;
int totpoint = pid->totpoint(pid->calldata, cfra);
- int add = 0, overwrite = 0;
+ int i, error = 0;
- if(totpoint == 0 || (cfra ? pid->data_types == 0 : pid->info_types == 0))
- return 0;
+ pm = MEM_callocN(sizeof(PTCacheMem), "Pointcache mem");
- if(cache->flag & PTCACHE_DISK_CACHE) {
- int ofra=0, efra = cache->endframe;
+ pm->totpoint = pid->totwrite(pid->calldata, cfra);
+ pm->data_types = cfra ? pid->data_types : pid->info_types;
- if(cfra==0 && cache->startframe > 0)
- add = 1;
- /* allways start from scratch on the first frame */
- else if(cfra == cache->startframe) {
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, cfra);
- cache->flag &= ~PTCACHE_REDO_NEEDED;
- add = 1;
+ ptcache_data_alloc(pm);
+ BKE_ptcache_mem_pointers_init(pm);
+
+ if(overwrite) {
+ if(cache->flag & PTCACHE_DISK_CACHE) {
+ int fra = cfra-1;
+
+ while(fra >= cache->startframe && !BKE_ptcache_id_exist(pid, fra))
+ fra--;
+
+ pm2 = ptcache_disk_frame_to_mem(pid, fra);
}
- else {
- /* find last cached frame */
- while(efra > cache->startframe && !BKE_ptcache_id_exist(pid, efra))
- efra--;
-
- /* find second last cached frame */
- ofra = efra-1;
- while(ofra > cache->startframe && !BKE_ptcache_id_exist(pid, ofra))
- ofra--;
-
- if(efra >= cache->startframe && cfra > efra) {
- if(ofra >= cache->startframe && efra - ofra < cache->step)
- overwrite = 1;
- else
- add = 1;
+ else
+ pm2 = cache->mem_cache.last;
+ }
+
+ if(pid->write_point) {
+ for(i=0; i<totpoint; i++) {
+ int write = pid->write_point(i, pid->calldata, pm->cur, cfra);
+ if(write) {
+ BKE_ptcache_mem_pointers_incr(pm);
+
+ /* newly born particles have to be copied to previous cached frame */
+ if(overwrite && write == 2 && pm2 && BKE_ptcache_mem_pointers_seek(i, pm2))
+ pid->write_point(i, pid->calldata, pm2->cur, cfra);
}
}
+ }
- if(add || overwrite) {
- if(overwrite)
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_FRAME, efra);
-
- pf = ptcache_file_open(pid, PTCACHE_FILE_WRITE, cfra);
- if(!pf)
- return 0;
+ if(pid->write_extra_data)
+ pid->write_extra_data(pid->calldata, pm, cfra);
- pf->type = pid->type;
- pf->totpoint = cfra ? pid->totwrite(pid->calldata, cfra) : totpoint;
- pf->data_types = cfra ? pid->data_types : pid->info_types;
+ pm->frame = cfra;
- if(!ptcache_file_write_header_begin(pf) || !pid->write_header(pf)) {
- ptcache_file_close(pf);
- return 0;
- }
+ if(cache->flag & PTCACHE_DISK_CACHE) {
+ error += !ptcache_mem_frame_to_disk(pid, pm);
- ptcache_file_init_pointers(pf);
+ if(pm) {
+ ptcache_data_free(pm);
+ ptcache_extra_free(pm);
+ MEM_freeN(pm);
+ }
- if(pf && pid->write_stream) {
- // we have stream writing here
- pid->write_stream(pf, pid->calldata);
- }
- else
- for(i=0; i<totpoint; i++) {
- if(pid->write_elem) {
- int write = pid->write_elem(i, pid->calldata, pf->cur, cfra);
- if(write) {
- if(!ptcache_file_write_data(pf)) {
- ptcache_file_close(pf);
- if(pf2) ptcache_file_close(pf2);
- return 0;
- }
- /* newly born particles have to be copied to previous cached frame */
- else if(overwrite && write == 2) {
- if(!pf2) {
- pf2 = ptcache_file_open(pid, PTCACHE_FILE_UPDATE, ofra);
- if(!pf2) {
- ptcache_file_close(pf);
- return 0;
- }
- pf2->type = pid->type;
- pf2->totpoint = totpoint;
- pf2->data_types = pid->data_types;
- }
- ptcache_file_seek_pointers(i, pf2);
- pid->write_elem(i, pid->calldata, pf2->cur, cfra);
- if(!ptcache_file_write_data(pf2)) {
- ptcache_file_close(pf);
- ptcache_file_close(pf2);
- return 0;
- }
- }
- }
- }
- }
+ if(pm2) {
+ error += !ptcache_mem_frame_to_disk(pid, pm2);
+ ptcache_data_free(pm2);
+ ptcache_extra_free(pm2);
+ MEM_freeN(pm2);
}
}
else {
- PTCacheMem *pm;
- PTCacheMem *pm2;
+ BLI_addtail(&cache->mem_cache, pm);
+ }
- pm2 = cache->mem_cache.first;
-
- /* don't write info file in memory */
- if(cfra==0)
+ return error;
+}
+static int ptcache_write_needed(PTCacheID *pid, int cfra, int *overwrite)
+{
+ PointCache *cache = pid->cache;
+ int ofra = 0, efra = cache->endframe;
+
+ /* allways start from scratch on the first frame */
+ if(cfra && cfra == cache->startframe) {
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, cfra);
+ cache->flag &= ~PTCACHE_REDO_NEEDED;
+ return 1;
+ }
+
+ if(pid->cache->flag & PTCACHE_DISK_CACHE) {
+ if(cfra==0 && cache->startframe > 0)
return 1;
- /* allways start from scratch on the first frame */
- if(cfra == cache->startframe) {
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, cfra);
- cache->flag &= ~PTCACHE_REDO_NEEDED;
- add = 1;
- }
- else if (cache->mem_cache.last) {
- pm2 = cache->mem_cache.last;
- if(pm2 && cfra > pm2->frame) {
- if(pm2->prev && pm2->frame - pm2->prev->frame < cache->step)
- overwrite = 1;
- else
- add = 1;
- }
- }
- else
- add = 1;
+ /* find last cached frame */
+ while(efra > cache->startframe && !BKE_ptcache_id_exist(pid, efra))
+ efra--;
- if(add || overwrite) {
- if(overwrite)
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_FRAME, pm2->frame);
+ /* find second last cached frame */
+ ofra = efra-1;
+ while(ofra > cache->startframe && !BKE_ptcache_id_exist(pid, ofra))
+ ofra--;
+ }
+ else {
+ PTCacheMem *pm = cache->mem_cache.last;
+ /* don't write info file in memory */
+ if(cfra == 0)
+ return 0;
- pm = MEM_callocN(sizeof(PTCacheMem), "Pointcache mem");
+ if(pm == NULL)
+ return 1;
- pm->totpoint = pid->totwrite(pid->calldata, cfra);
- pm->data_types = cfra ? pid->data_types : pid->info_types;
+ efra = pm->frame;
+ ofra = (pm->prev ? pm->prev->frame : efra - cache->step);
+ }
- ptcache_alloc_data(pm);
- BKE_ptcache_mem_init_pointers(pm);
+ if(efra >= cache->startframe && cfra > efra) {
+ if(ofra >= cache->startframe && efra - ofra < cache->step) {
+ /* overwrite previous frame */
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_FRAME, efra);
+ *overwrite = 1;
+ }
+ return 1;
+ }
- for(i=0; i<totpoint; i++) {
- if(pid->write_elem) {
- int write = pid->write_elem(i, pid->calldata, pm->cur, cfra);
- if(write) {
- BKE_ptcache_mem_incr_pointers(pm);
+ return 0;
+}
+/* writes cache to disk or memory */
+int BKE_ptcache_write(PTCacheID *pid, unsigned int cfra)
+{
+ PointCache *cache = pid->cache;
+ int totpoint = pid->totpoint(pid->calldata, cfra);
+ int overwrite = 0, error = 0;
- /* newly born particles have to be copied to previous cached frame */
- if(overwrite && write == 2) {
- pm2 = cache->mem_cache.last;
- if(BKE_ptcache_mem_seek_pointers(i, pm2))
- pid->write_elem(i, pid->calldata, pm2->cur, cfra);
- }
- }
- }
- }
- ptcache_make_index_array(pm, pid->totpoint(pid->calldata, cfra));
+ if(totpoint == 0 || (cfra ? pid->data_types == 0 : pid->info_types == 0))
+ return 0;
- pm->frame = cfra;
- BLI_addtail(&cache->mem_cache, pm);
- }
+ if(ptcache_write_needed(pid, cfra, &overwrite)==0)
+ return 0;
+
+ if(pid->write_stream) {
+ ptcache_write_stream(pid, cfra, totpoint);
+ }
+ else if(pid->write_point) {
+ error += ptcache_write(pid, cfra, overwrite);
}
- if(add || overwrite) {
- if(cfra - cache->last_exact == 1
- || cfra == cache->startframe) {
- cache->last_exact = cfra;
- cache->flag &= ~PTCACHE_FRAMES_SKIPPED;
- }
- else
- cache->flag |= PTCACHE_FRAMES_SKIPPED;
+ /* Mark frames skipped if more than 1 frame forwards since last non-skipped frame. */
+ if(cfra - cache->last_exact == 1 || cfra == cache->startframe) {
+ cache->last_exact = cfra;
+ cache->flag &= ~PTCACHE_FRAMES_SKIPPED;
}
-
- if(pf) ptcache_file_close(pf);
+ /* Don't mark skipped when writing info file (frame 0) */
+ else if(cfra)
+ cache->flag |= PTCACHE_FRAMES_SKIPPED;
- if(pf2) ptcache_file_close(pf2);
+ /* Update timeline cache display */
+ if(cfra && cache->cached_frames)
+ cache->cached_frames[cfra-cache->startframe] = 1;
BKE_ptcache_update_info(pid);
- return 1;
+ return !error;
}
/* youll need to close yourself after!
* mode - PTCACHE_CLEAR_ALL,
*/
/* Clears & resets */
-void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
+void BKE_ptcache_id_clear(PTCacheID *pid, int mode, unsigned int cfra)
{
- int len; /* store the length of the string */
+ unsigned int len; /* store the length of the string */
+ unsigned int sta, end;
/* mode is same as fopen's modes */
DIR *dir;
@@ -1902,9 +1957,12 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
char path_full[MAX_PTCACHE_FILE];
char ext[MAX_PTCACHE_PATH];
- if(!pid->cache || pid->cache->flag & PTCACHE_BAKED)
+ if(!pid || !pid->cache || pid->cache->flag & PTCACHE_BAKED)
return;
+ sta = pid->cache->startframe;
+ end = pid->cache->endframe;
+
#ifndef DURIAN_POINTCACHE_LIB_OK
/* don't allow clearing for linked objects */
if(pid->ob->id.lib)
@@ -1921,7 +1979,7 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
if(pid->cache->flag & PTCACHE_DISK_CACHE) {
ptcache_path(pid, path);
- len = BKE_ptcache_id_filename(pid, filename, cfra, 0, 0); /* no path */
+ len = ptcache_filename(pid, filename, cfra, 0, 0); /* no path */
dir = opendir(path);
if (dir==NULL)
@@ -1938,7 +1996,7 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
BLI_delete(path_full, 0, 0);
} else {
/* read the number of the file */
- int frame, len2 = (int)strlen(de->d_name);
+ unsigned int frame, len2 = (int)strlen(de->d_name);
char num[7];
if (len2 > 15) { /* could crash if trying to copy a string out of this range*/
@@ -1950,6 +2008,8 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
BLI_join_dirfile(path_full, path, de->d_name);
BLI_delete(path_full, 0, 0);
+ if(pid->cache->cached_frames && frame >=sta && frame <= end)
+ pid->cache->cached_frames[frame-sta] = 0;
}
}
}
@@ -1957,25 +2017,34 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
}
}
closedir(dir);
+
+ if(mode == PTCACHE_CLEAR_ALL && pid->cache->cached_frames)
+ memset(pid->cache->cached_frames, 0, MEM_allocN_len(pid->cache->cached_frames));
}
else {
PTCacheMem *pm= pid->cache->mem_cache.first;
PTCacheMem *link= NULL;
- pm= pid->cache->mem_cache.first;
-
if(mode == PTCACHE_CLEAR_ALL) {
/*we want startframe if the cache starts before zero*/
pid->cache->last_exact = MIN2(pid->cache->startframe, 0);
- for(; pm; pm=pm->next)
- ptcache_free_data(pm);
+ for(; pm; pm=pm->next) {
+ ptcache_data_free(pm);
+ ptcache_extra_free(pm);
+ }
BLI_freelistN(&pid->cache->mem_cache);
+
+ if(pid->cache->cached_frames)
+ memset(pid->cache->cached_frames, 0, MEM_allocN_len(pid->cache->cached_frames));
} else {
while(pm) {
if((mode==PTCACHE_CLEAR_BEFORE && pm->frame < cfra) ||
(mode==PTCACHE_CLEAR_AFTER && pm->frame > cfra) ) {
link = pm;
- ptcache_free_data(pm);
+ if(pid->cache->cached_frames && pm->frame >=sta && pm->frame <= end)
+ pid->cache->cached_frames[pm->frame-sta] = 0;
+ ptcache_data_free(pm);
+ ptcache_extra_free(pm);
pm = pm->next;
BLI_freelinkN(&pid->cache->mem_cache, link);
}
@@ -1989,7 +2058,7 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
case PTCACHE_CLEAR_FRAME:
if(pid->cache->flag & PTCACHE_DISK_CACHE) {
if(BKE_ptcache_id_exist(pid, cfra)) {
- BKE_ptcache_id_filename(pid, filename, cfra, 1, 1); /* no path */
+ ptcache_filename(pid, filename, cfra, 1, 1); /* no path */
BLI_delete(filename, 0, 0);
}
}
@@ -1998,27 +2067,35 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
for(; pm; pm=pm->next) {
if(pm->frame == cfra) {
- ptcache_free_data(pm);
+ ptcache_data_free(pm);
+ ptcache_extra_free(pm);
BLI_freelinkN(&pid->cache->mem_cache, pm);
break;
}
}
}
+ if(pid->cache->cached_frames && cfra>=sta && cfra<=end)
+ pid->cache->cached_frames[cfra-sta] = 0;
break;
}
BKE_ptcache_update_info(pid);
}
-
-int BKE_ptcache_id_exist(PTCacheID *pid, int cfra)
+int BKE_ptcache_id_exist(PTCacheID *pid, int cfra)
{
if(!pid->cache)
return 0;
+
+ if(cfra<pid->cache->startframe || cfra > pid->cache->endframe)
+ return 0;
+
+ if(pid->cache->cached_frames && pid->cache->cached_frames[cfra-pid->cache->startframe]==0)
+ return 0;
if(pid->cache->flag & PTCACHE_DISK_CACHE) {
char filename[MAX_PTCACHE_FILE];
- BKE_ptcache_id_filename(pid, filename, cfra, 1, 1);
+ ptcache_filename(pid, filename, cfra, 1, 1);
return BLI_exists(filename);
}
@@ -2032,7 +2109,6 @@ int BKE_ptcache_id_exist(PTCacheID *pid, int cfra)
return 0;
}
}
-
void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startframe, int *endframe, float *timescale)
{
Object *ob;
@@ -2073,9 +2149,71 @@ void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startfra
*endframe += (int)(offset+0.5f);
}
}
-}
-int BKE_ptcache_id_reset(Scene *scene, PTCacheID *pid, int mode)
+ /* verify cached_frames array is up to date */
+ if(cache->cached_frames) {
+ if(MEM_allocN_len(cache->cached_frames) != sizeof(char) * (cache->endframe-cache->startframe+1)) {
+ MEM_freeN(cache->cached_frames);
+ cache->cached_frames = NULL;
+ }
+ }
+
+ if(cache->cached_frames==NULL && cache->endframe > cache->startframe) {
+ unsigned int sta=cache->startframe;
+ unsigned int end=cache->endframe;
+
+ cache->cached_frames = MEM_callocN(sizeof(char) * (cache->endframe-cache->startframe+1), "cached frames array");
+
+ if(pid->cache->flag & PTCACHE_DISK_CACHE) {
+ /* mode is same as fopen's modes */
+ DIR *dir;
+ struct dirent *de;
+ char path[MAX_PTCACHE_PATH];
+ char filename[MAX_PTCACHE_FILE];
+ char ext[MAX_PTCACHE_PATH];
+ unsigned int len; /* store the length of the string */
+
+ ptcache_path(pid, path);
+
+ len = ptcache_filename(pid, filename, (int)cfra, 0, 0); /* no path */
+
+ dir = opendir(path);
+ if (dir==NULL)
+ return;
+
+ snprintf(ext, sizeof(ext), "_%02d"PTCACHE_EXT, pid->stack_index);
+
+ while ((de = readdir(dir)) != NULL) {
+ if (strstr(de->d_name, ext)) { /* do we have the right extension?*/
+ if (strncmp(filename, de->d_name, len ) == 0) { /* do we have the right prefix */
+ /* read the number of the file */
+ unsigned int frame, len2 = (int)strlen(de->d_name);
+ char num[7];
+
+ if (len2 > 15) { /* could crash if trying to copy a string out of this range*/
+ BLI_strncpy(num, de->d_name + (strlen(de->d_name) - 15), sizeof(num));
+ frame = atoi(num);
+
+ if(frame >= sta && frame <= end)
+ cache->cached_frames[frame-sta] = 1;
+ }
+ }
+ }
+ }
+ closedir(dir);
+ }
+ else {
+ PTCacheMem *pm= pid->cache->mem_cache.first;
+
+ while(pm) {
+ if(pm->frame >= sta && pm->frame <= end)
+ cache->cached_frames[pm->frame-sta] = 1;
+ pm = pm->next;
+ }
+ }
+ }
+}
+int BKE_ptcache_id_reset(Scene *scene, PTCacheID *pid, int mode)
{
PointCache *cache;
int reset, clear, after;
@@ -2120,7 +2258,7 @@ int BKE_ptcache_id_reset(Scene *scene, PTCacheID *pid, int mode)
cache->flag &= ~PTCACHE_REDO_NEEDED;
if(pid->type == PTCACHE_TYPE_CLOTH)
- cloth_free_modifier(pid->ob, pid->calldata);
+ cloth_free_modifier(pid->calldata);
else if(pid->type == PTCACHE_TYPE_SOFTBODY)
sbFreeSimulation(pid->calldata);
else if(pid->type == PTCACHE_TYPE_PARTICLES)
@@ -2137,8 +2275,7 @@ int BKE_ptcache_id_reset(Scene *scene, PTCacheID *pid, int mode)
return (reset || clear || after);
}
-
-int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
+int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
{
PTCacheID pid;
ParticleSystem *psys;
@@ -2154,17 +2291,18 @@ int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
}
for(psys=ob->particlesystem.first; psys; psys=psys->next) {
- /* Baked cloth hair has to be checked first, because we don't want to reset */
+ /* children or just redo can be calculated without reseting anything */
+ if(psys->recalc & PSYS_RECALC_REDO || psys->recalc & PSYS_RECALC_CHILD)
+ skip = 1;
+ /* Baked cloth hair has to be checked too, because we don't want to reset */
/* particles or cloth in that case -jahka */
- if(psys->clmd) {
+ else if(psys->clmd) {
BKE_ptcache_id_from_cloth(&pid, ob, psys->clmd);
if(mode == PSYS_RESET_ALL || !(psys->part->type == PART_HAIR && (pid.cache->flag & PTCACHE_BAKED)))
reset |= BKE_ptcache_id_reset(scene, &pid, mode);
else
skip = 1;
}
- else if(psys->recalc & PSYS_RECALC_REDO || psys->recalc & PSYS_RECALC_CHILD)
- skip = 1;
if(skip == 0 && psys->part) {
BKE_ptcache_id_from_particles(&pid, ob, psys);
@@ -2183,9 +2321,6 @@ int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
{
BKE_ptcache_id_from_smoke(&pid, ob, (SmokeModifierData*)md);
reset |= BKE_ptcache_id_reset(scene, &pid, mode);
-
- BKE_ptcache_id_from_smoke_turbulence(&pid, ob, (SmokeModifierData*)md);
- reset |= BKE_ptcache_id_reset(scene, &pid, mode);
}
}
}
@@ -2250,12 +2385,12 @@ void BKE_ptcache_set_continue_physics(Main *bmain, Scene *scene, int enable)
if(CONTINUE_PHYSICS == 0) {
for(ob=bmain->object.first; ob; ob=ob->id.next)
if(BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_OUTDATED))
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
}
}
-int BKE_ptcache_get_continue_physics()
+int BKE_ptcache_get_continue_physics()
{
return CONTINUE_PHYSICS;
}
@@ -2282,8 +2417,10 @@ void BKE_ptcache_free_mem(ListBase *mem_cache)
PTCacheMem *pm = mem_cache->first;
if(pm) {
- for(; pm; pm=pm->next)
- ptcache_free_data(pm);
+ for(; pm; pm=pm->next) {
+ ptcache_data_free(pm);
+ ptcache_extra_free(pm);
+ }
BLI_freelistN(mem_cache);
}
@@ -2293,6 +2430,8 @@ void BKE_ptcache_free(PointCache *cache)
BKE_ptcache_free_mem(&cache->mem_cache);
if(cache->edit && cache->free_edit)
cache->free_edit(cache->edit);
+ if(cache->cached_frames)
+ MEM_freeN(cache->cached_frames);
MEM_freeN(cache);
}
void BKE_ptcache_free_list(ListBase *ptcaches)
@@ -2315,6 +2454,8 @@ static PointCache *ptcache_copy(PointCache *cache)
/* hmm, should these be copied over instead? */
ncache->mem_cache.first = NULL;
ncache->mem_cache.last = NULL;
+ ncache->cached_frames = NULL;
+ ncache->edit = NULL;
ncache->flag= 0;
ncache->simframe= 0;
@@ -2353,7 +2494,7 @@ void BKE_ptcache_quick_cache_all(Main *bmain, Scene *scene)
baker.scene=scene;
baker.quick_step=scene->physics_settings.quick_cache_step;
- BKE_ptcache_make_cache(&baker);
+ BKE_ptcache_bake(&baker);
}
/* Simulation thread, no need for interlocks as data written in both threads
@@ -2366,10 +2507,10 @@ typedef struct {
int *cfra_ptr;
Main *main;
Scene *scene;
-} ptcache_make_cache_data;
+} ptcache_bake_data;
-static void *ptcache_make_cache_thread(void *ptr) {
- ptcache_make_cache_data *data = (ptcache_make_cache_data*)ptr;
+static void *ptcache_bake_thread(void *ptr) {
+ ptcache_bake_data *data = (ptcache_bake_data*)ptr;
for(; (*data->cfra_ptr <= data->endframe) && !data->break_operation; *data->cfra_ptr+=data->step) {
scene_update_for_newframe(data->main, data->scene, data->scene->lay);
@@ -2383,11 +2524,11 @@ static void *ptcache_make_cache_thread(void *ptr) {
}
/* if bake is not given run simulations to current frame */
-void BKE_ptcache_make_cache(PTCacheBaker* baker)
+void BKE_ptcache_bake(PTCacheBaker* baker)
{
Main *bmain = baker->main;
Scene *scene = baker->scene;
- Scene *sce; /* SETLOOPER macro only */
+ Scene *sce_iter; /* SETLOOPER macro only */
Base *base;
ListBase pidlist;
PTCacheID *pid = baker->pid;
@@ -2398,7 +2539,7 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
int bake = baker->bake;
int render = baker->render;
ListBase threads;
- ptcache_make_cache_data thread_data;
+ ptcache_bake_data thread_data;
int progress, old_progress;
thread_data.endframe = baker->anim_init ? scene->r.sfra : CFRA;
@@ -2458,7 +2599,7 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
cache->flag &= ~PTCACHE_BAKED;
}
}
- else for(SETLOOPER(scene, base)) {
+ else for(SETLOOPER(scene, sce_iter, base)) {
/* cache/bake everything in the scene */
BKE_ptcache_ids_from_object(&pidlist, base->object, scene, MAX_DUPLI_RECUR);
@@ -2499,12 +2640,14 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
thread_data.break_operation = FALSE;
thread_data.thread_ended = FALSE;
old_progress = -1;
+
+ WM_cursor_wait(1);
if(G.background) {
- ptcache_make_cache_thread((void*)&thread_data);
+ ptcache_bake_thread((void*)&thread_data);
}
else {
- BLI_init_threads(&threads, ptcache_make_cache_thread, 1);
+ BLI_init_threads(&threads, ptcache_bake_thread, 1);
BLI_insert_thread(&threads, (void*)&thread_data);
while (thread_data.thread_ended == FALSE) {
@@ -2542,10 +2685,10 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
cache->flag |= PTCACHE_BAKED;
/* write info file */
if(cache->flag & PTCACHE_DISK_CACHE)
- BKE_ptcache_write_cache(pid, 0);
+ BKE_ptcache_write(pid, 0);
}
}
- else for(SETLOOPER(scene, base)) {
+ else for(SETLOOPER(scene, sce_iter, base)) {
BKE_ptcache_ids_from_object(&pidlist, base->object, scene, MAX_DUPLI_RECUR);
for(pid=pidlist.first; pid; pid=pid->next) {
@@ -2565,7 +2708,7 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
if(bake) {
cache->flag |= PTCACHE_BAKED;
if(cache->flag & PTCACHE_DISK_CACHE)
- BKE_ptcache_write_cache(pid, 0);
+ BKE_ptcache_write(pid, 0);
}
}
BLI_freelistN(&pidlist);
@@ -2582,126 +2725,59 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
else if (baker->progressend)
baker->progressend(baker->progresscontext);
+ WM_cursor_wait(0);
+
/* TODO: call redraw all windows somehow */
}
/* Helpers */
void BKE_ptcache_disk_to_mem(PTCacheID *pid)
{
PointCache *cache = pid->cache;
- PTCacheFile *pf;
- PTCacheMem *pm;
-
+ PTCacheMem *pm = NULL;
+ int baked = cache->flag & PTCACHE_BAKED;
int cfra, sfra = cache->startframe, efra = cache->endframe;
- int i;
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
+ /* Remove possible bake flag to allow clear */
+ cache->flag &= ~PTCACHE_BAKED;
- for(cfra=sfra; cfra <= efra; cfra++) {
- pf = ptcache_file_open(pid, PTCACHE_FILE_READ, cfra);
-
- if(pf) {
- if(!ptcache_file_read_header_begin(pf)) {
- printf("Can't yet convert old cache format\n");
- cache->flag |= PTCACHE_DISK_CACHE;
- ptcache_file_close(pf);
- return;
- }
-
- if(pf->type != pid->type || !pid->read_header(pf)) {
- cache->flag |= PTCACHE_DISK_CACHE;
- ptcache_file_close(pf);
- return;
- }
-
- pm = MEM_callocN(sizeof(PTCacheMem), "Pointcache mem");
-
- pm->totpoint = pf->totpoint;
- pm->data_types = pf->data_types;
- pm->frame = cfra;
-
- ptcache_alloc_data(pm);
- BKE_ptcache_mem_init_pointers(pm);
- ptcache_file_init_pointers(pf);
+ /* PTCACHE_DISK_CACHE flag was cleared already */
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
- for(i=0; i<pm->totpoint; i++) {
- if(!ptcache_file_read_data(pf)) {
- printf("Error reading from disk cache\n");
-
- cache->flag |= PTCACHE_DISK_CACHE;
-
- ptcache_free_data(pm);
- MEM_freeN(pm);
- ptcache_file_close(pf);
-
- return;
- }
- ptcache_copy_data(pf->cur, pm->cur);
- BKE_ptcache_mem_incr_pointers(pm);
- }
+ /* restore possible bake flag */
+ cache->flag |= baked;
- ptcache_make_index_array(pm, pid->totpoint(pid->calldata, cfra));
+ for(cfra=sfra; cfra <= efra; cfra++) {
+ pm = ptcache_disk_frame_to_mem(pid, cfra);
+ if(pm)
BLI_addtail(&pid->cache->mem_cache, pm);
-
- ptcache_file_close(pf);
- }
}
-
}
void BKE_ptcache_mem_to_disk(PTCacheID *pid)
{
PointCache *cache = pid->cache;
- PTCacheFile *pf;
- PTCacheMem *pm;
- int i;
+ PTCacheMem *pm = cache->mem_cache.first;
+ int baked = cache->flag & PTCACHE_BAKED;
- pm = cache->mem_cache.first;
+ /* Remove possible bake flag to allow clear */
+ cache->flag &= ~PTCACHE_BAKED;
+ /* PTCACHE_DISK_CACHE flag was set already */
BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
- for(; pm; pm=pm->next) {
- pf = ptcache_file_open(pid, PTCACHE_FILE_WRITE, pm->frame);
-
- if(pf) {
- pf->data_types = pm->data_types;
- pf->totpoint = pm->totpoint;
- pf->type = pid->type;
+ /* restore possible bake flag */
+ cache->flag |= baked;
- BKE_ptcache_mem_init_pointers(pm);
- ptcache_file_init_pointers(pf);
-
- if(!ptcache_file_write_header_begin(pf) || !pid->write_header(pf)) {
- if (G.f & G_DEBUG)
- printf("Error writing to disk cache\n");
- cache->flag &= ~PTCACHE_DISK_CACHE;
-
- ptcache_file_close(pf);
- return;
- }
-
- for(i=0; i<pm->totpoint; i++) {
- ptcache_copy_data(pm->cur, pf->cur);
- if(!ptcache_file_write_data(pf)) {
- if (G.f & G_DEBUG)
- printf("Error writing to disk cache\n");
- cache->flag &= ~PTCACHE_DISK_CACHE;
-
- ptcache_file_close(pf);
- return;
- }
- BKE_ptcache_mem_incr_pointers(pm);
- }
-
- ptcache_file_close(pf);
-
- /* write info file */
- if(cache->flag & PTCACHE_BAKED)
- BKE_ptcache_write_cache(pid, 0);
+ for(; pm; pm=pm->next) {
+ if(ptcache_mem_frame_to_disk(pid, pm)==0) {
+ cache->flag &= ~PTCACHE_DISK_CACHE;
+ break;
}
- else
- if (G.f & G_DEBUG)
- printf("Error creating disk cache file\n");
}
+
+ /* write info file */
+ if(cache->flag & PTCACHE_BAKED)
+ BKE_ptcache_write(pid, 0);
}
void BKE_ptcache_toggle_disk_cache(PTCacheID *pid)
{
@@ -2715,6 +2791,11 @@ void BKE_ptcache_toggle_disk_cache(PTCacheID *pid)
return;
}
+ if(cache->cached_frames) {
+ MEM_freeN(cache->cached_frames);
+ cache->cached_frames=NULL;
+ }
+
if(cache->flag & PTCACHE_DISK_CACHE)
BKE_ptcache_mem_to_disk(pid);
else
@@ -2726,15 +2807,75 @@ void BKE_ptcache_toggle_disk_cache(PTCacheID *pid)
cache->last_exact = last_exact;
+ BKE_ptcache_id_time(pid, NULL, 0.0f, NULL, NULL, NULL);
+
BKE_ptcache_update_info(pid);
}
+void BKE_ptcache_disk_cache_rename(PTCacheID *pid, char *from, char *to)
+{
+ char old_name[80];
+ int len; /* store the length of the string */
+ /* mode is same as fopen's modes */
+ DIR *dir;
+ struct dirent *de;
+ char path[MAX_PTCACHE_PATH];
+ char old_filename[MAX_PTCACHE_FILE];
+ char new_path_full[MAX_PTCACHE_FILE];
+ char old_path_full[MAX_PTCACHE_FILE];
+ char ext[MAX_PTCACHE_PATH];
+
+ /* save old name */
+ strcpy(old_name, pid->cache->name);
+
+ /* get "from" filename */
+ strcpy(pid->cache->name, from);
+
+ len = ptcache_filename(pid, old_filename, 0, 0, 0); /* no path */
+
+ ptcache_path(pid, path);
+ dir = opendir(path);
+ if(dir==NULL) {
+ strcpy(pid->cache->name, old_name);
+ return;
+ }
+
+ snprintf(ext, sizeof(ext), "_%02d"PTCACHE_EXT, pid->stack_index);
+
+ /* put new name into cache */
+ strcpy(pid->cache->name, to);
+
+ while ((de = readdir(dir)) != NULL) {
+ if (strstr(de->d_name, ext)) { /* do we have the right extension?*/
+ if (strncmp(old_filename, de->d_name, len ) == 0) { /* do we have the right prefix */
+ /* read the number of the file */
+ int frame, len2 = (int)strlen(de->d_name);
+ char num[7];
+
+ if (len2 > 15) { /* could crash if trying to copy a string out of this range*/
+ BLI_strncpy(num, de->d_name + (strlen(de->d_name) - 15), sizeof(num));
+ frame = atoi(num);
+
+ BLI_join_dirfile(old_path_full, path, de->d_name);
+ ptcache_filename(pid, new_path_full, frame, 1, 1);
+ BLI_rename(old_path_full, new_path_full);
+ }
+ }
+ }
+ }
+ closedir(dir);
+
+ strcpy(pid->cache->name, old_name);
+}
+
void BKE_ptcache_load_external(PTCacheID *pid)
{
/*todo*/
PointCache *cache = pid->cache;
int len; /* store the length of the string */
int info = 0;
+ int start = MAXFRAME;
+ int end = -1;
/* mode is same as fopen's modes */
DIR *dir;
@@ -2746,13 +2887,9 @@ void BKE_ptcache_load_external(PTCacheID *pid)
if(!cache)
return;
- cache->startframe = MAXFRAME;
- cache->endframe = -1;
- cache->totpoint = 0;
-
ptcache_path(pid, path);
- len = BKE_ptcache_id_filename(pid, filename, 1, 0, 0); /* no path */
+ len = ptcache_filename(pid, filename, 1, 0, 0); /* no path */
dir = opendir(path);
if (dir==NULL)
@@ -2775,8 +2912,8 @@ void BKE_ptcache_load_external(PTCacheID *pid)
frame = atoi(num);
if(frame) {
- cache->startframe = MIN2(cache->startframe, frame);
- cache->endframe = MAX2(cache->endframe, frame);
+ start = MIN2(start, frame);
+ end = MAX2(end, frame);
}
else
info = 1;
@@ -2786,15 +2923,21 @@ void BKE_ptcache_load_external(PTCacheID *pid)
}
closedir(dir);
- if(cache->startframe != MAXFRAME) {
+ if(start != MAXFRAME) {
PTCacheFile *pf;
+ cache->startframe = start;
+ cache->endframe = end;
+ cache->totpoint = 0;
+
+ if(pid->type == PTCACHE_TYPE_SMOKE_DOMAIN)
+ ; /*necessary info in every file*/
/* read totpoint from info file (frame 0) */
- if(info) {
+ else if(info) {
pf= ptcache_file_open(pid, PTCACHE_FILE_READ, 0);
if(pf) {
- if(ptcache_file_read_header_begin(pf)) {
+ if(ptcache_file_header_begin_read(pf)) {
if(pf->type == pid->type && pid->read_header(pf)) {
cache->totpoint = pf->totpoint;
cache->flag |= PTCACHE_READ_INFO;
@@ -2809,7 +2952,7 @@ void BKE_ptcache_load_external(PTCacheID *pid)
/* or from any old format cache file */
else {
float old_data[14];
- int elemsize = ptcache_pid_old_elemsize(pid);
+ int elemsize = ptcache_old_elemsize(pid);
pf= ptcache_file_open(pid, PTCACHE_FILE_READ, cache->startframe);
if(pf) {
@@ -2819,16 +2962,17 @@ void BKE_ptcache_load_external(PTCacheID *pid)
ptcache_file_close(pf);
}
}
+ cache->flag |= (PTCACHE_BAKED|PTCACHE_DISK_CACHE|PTCACHE_SIMULATION_VALID);
+ cache->flag &= ~(PTCACHE_OUTDATED|PTCACHE_FRAMES_SKIPPED);
}
- cache->flag &= ~(PTCACHE_OUTDATED|PTCACHE_FRAMES_SKIPPED);
-
BKE_ptcache_update_info(pid);
}
void BKE_ptcache_update_info(PTCacheID *pid)
{
PointCache *cache = pid->cache;
+ PTCacheExtra *extra = NULL;
int totframes = 0;
char mem_info[64];
@@ -2840,7 +2984,10 @@ void BKE_ptcache_update_info(PTCacheID *pid)
totframes++;
}
- if(totframes && cache->totpoint)
+ /* smoke doesn't use frame 0 as info frame so can't check based on totpoint */
+ if(pid->type == PTCACHE_TYPE_SMOKE_DOMAIN && totframes)
+ sprintf(cache->info, "%i frames found!", totframes);
+ else if(totframes && cache->totpoint)
sprintf(cache->info, "%i points found!", cache->totpoint);
else
sprintf(cache->info, "No valid data to read!");
@@ -2848,14 +2995,25 @@ void BKE_ptcache_update_info(PTCacheID *pid)
}
if(cache->flag & PTCACHE_DISK_CACHE) {
- int cfra = cache->startframe;
+ if(pid->type == PTCACHE_TYPE_SMOKE_DOMAIN)
+ {
+ int totpoint = pid->totpoint(pid->calldata, 0);
- for(; cfra<=cache->endframe; cfra++) {
- if(BKE_ptcache_id_exist(pid, cfra))
- totframes++;
+ if(cache->totpoint > totpoint)
+ sprintf(mem_info, "%i cells + High Resolution cached", totpoint);
+ else
+ sprintf(mem_info, "%i cells cached", totpoint);
}
+ else {
+ int cfra = cache->startframe;
- sprintf(mem_info, "%i frames on disk", totframes);
+ for(; cfra<=cache->endframe; cfra++) {
+ if(BKE_ptcache_id_exist(pid, cfra))
+ totframes++;
+ }
+
+ sprintf(mem_info, "%i frames on disk", totframes);
+ }
}
else {
PTCacheMem *pm = cache->mem_cache.first;
@@ -2864,7 +3022,15 @@ void BKE_ptcache_update_info(PTCacheID *pid)
for(; pm; pm=pm->next) {
for(i=0; i<BPHYS_TOT_DATA; i++)
- bytes += pm->data[i] ? MEM_allocN_len(pm->data[i]) : 0.0f;
+ bytes += MEM_allocN_len(pm->data[i]);
+
+ for(extra=pm->extradata.first; extra; extra=extra->next) {
+ bytes += MEM_allocN_len(extra->data);
+ bytes += sizeof(PTCacheExtra);
+ }
+
+ bytes += sizeof(PTCacheMem);
+
totframes++;
}
@@ -2888,13 +3054,17 @@ void BKE_ptcache_update_info(PTCacheID *pid)
void BKE_ptcache_validate(PointCache *cache, int framenr)
{
- cache->flag |= PTCACHE_SIMULATION_VALID;
- cache->simframe = framenr;
+ if(cache) {
+ cache->flag |= PTCACHE_SIMULATION_VALID;
+ cache->simframe = framenr;
+ }
}
void BKE_ptcache_invalidate(PointCache *cache)
{
- cache->flag &= ~PTCACHE_SIMULATION_VALID;
- cache->simframe = 0;
- cache->last_exact = MIN2(cache->startframe, 0);
+ if(cache) {
+ cache->flag &= ~PTCACHE_SIMULATION_VALID;
+ cache->simframe = 0;
+ cache->last_exact = MIN2(cache->startframe, 0);
+ }
}
diff --git a/source/blender/blenkernel/intern/property.c b/source/blender/blenkernel/intern/property.c
index d8001572b4f..dd57fef50c5 100644
--- a/source/blender/blenkernel/intern/property.c
+++ b/source/blender/blenkernel/intern/property.c
@@ -179,7 +179,7 @@ void unique_property(bProperty *first, bProperty *prop, int force)
}
}
-bProperty *get_ob_property(Object *ob, char *name)
+bProperty *get_ob_property(Object *ob, const char *name)
{
return BLI_findstring(&ob->prop, name, offsetof(bProperty, name));
}
diff --git a/source/blender/blenkernel/intern/report.c b/source/blender/blenkernel/intern/report.c
index 3773757f5d5..044e1350be1 100644
--- a/source/blender/blenkernel/intern/report.c
+++ b/source/blender/blenkernel/intern/report.c
@@ -29,10 +29,11 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "BKE_report.h"
#include "BKE_global.h" /* G.background only */
-#include "BKE_utildefines.h"
+
#include <stdarg.h>
#include <stdio.h>
@@ -44,7 +45,7 @@
#endif
#endif
-static char *report_type_str(int type)
+static const char *report_type_str(int type)
{
switch(type) {
case RPT_DEBUG: return "Debug";
@@ -82,7 +83,7 @@ void BKE_reports_clear(ReportList *reports)
while (report) {
report_next= report->next;
- MEM_freeN(report->message);
+ MEM_freeN((void *)report->message);
MEM_freeN(report);
report= report_next;
}
@@ -95,23 +96,23 @@ void BKE_report(ReportList *reports, ReportType type, const char *message)
Report *report;
int len;
- /* exception, print and return in background, no reason to store a list */
- if(G.background)
- reports= NULL;
-
- if(!reports || ((reports->flag & RPT_PRINT) && (type >= reports->printlevel))) {
+ /* in background mode always print otherwise there are cases the errors wont be displayed,
+ * but still add to the report list since this is used for python exception handling */
+ if(G.background || !reports || ((reports->flag & RPT_PRINT) && (type >= reports->printlevel))) {
printf("%s: %s\n", report_type_str(type), message);
fflush(stdout); /* this ensures the message is printed before a crash */
}
if(reports && (reports->flag & RPT_STORE) && (type >= reports->storelevel)) {
+ char *message_alloc;
report= MEM_callocN(sizeof(Report), "Report");
report->type= type;
report->typestr= report_type_str(type);
len= strlen(message);
- report->message= MEM_callocN(sizeof(char)*(len+1), "ReportMessage");
- memcpy(report->message, message, sizeof(char)*(len+1));
+ message_alloc= MEM_callocN(sizeof(char)*(len+1), "ReportMessage");
+ memcpy(message_alloc, message, sizeof(char)*(len+1));
+ report->message= message_alloc;
report->len= len;
BLI_addtail(&reports->list, report);
}
@@ -123,10 +124,11 @@ void BKE_reportf(ReportList *reports, ReportType type, const char *format, ...)
Report *report;
va_list args;
- if(!reports || ((reports->flag & RPT_PRINT) && (type >= reports->printlevel))) {
+ if(G.background || !reports || ((reports->flag & RPT_PRINT) && (type >= reports->printlevel))) {
va_start(args, format);
vprintf(format, args);
va_end(args);
+ fprintf(stdout, "\n"); /* otherise each report needs to include a \n */
fflush(stdout); /* this ensures the message is printed before a crash */
}
@@ -162,7 +164,7 @@ void BKE_reports_prepend(ReportList *reports, const char *prepend)
BLI_dynstr_append(ds, prepend);
BLI_dynstr_append(ds, report->message);
- MEM_freeN(report->message);
+ MEM_freeN((void *)report->message);
report->message= BLI_dynstr_get_cstring(ds);
report->len= BLI_dynstr_get_len(ds);
@@ -187,7 +189,7 @@ void BKE_reports_prependf(ReportList *reports, const char *prepend, ...)
va_end(args);
BLI_dynstr_append(ds, report->message);
- MEM_freeN(report->message);
+ MEM_freeN((void *)report->message);
report->message= BLI_dynstr_get_cstring(ds);
report->len= BLI_dynstr_get_len(ds);
diff --git a/source/blender/blenkernel/intern/sca.c b/source/blender/blenkernel/intern/sca.c
index 0b80989880a..202a236b431 100644
--- a/source/blender/blenkernel/intern/sca.c
+++ b/source/blender/blenkernel/intern/sca.c
@@ -635,7 +635,6 @@ void sca_remove_ob_poin(Object *obt, Object *ob)
bMessageActuator *ma;
bParentActuator *para;
bArmatureActuator *aa;
- bSteeringActuator *sta;
sens= obt->sensors.first;
while(sens) {
@@ -683,11 +682,6 @@ void sca_remove_ob_poin(Object *obt, Object *ob)
if (aa->target == ob) aa->target = NULL;
if (aa->subtarget == ob) aa->subtarget = NULL;
break;
- case ACT_STEERING:
- sta = act->data;
- if (sta->target==ob) sta->target = NULL;
- if (sta->navmesh==ob) sta->navmesh = NULL;
- break;
}
act= act->next;
}
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 84be9bfcfe2..e6a7d714cd0 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -39,6 +39,8 @@
#include <io.h>
#endif
+#include "MEM_guardedalloc.h"
+
#include "DNA_anim_types.h"
#include "DNA_group_types.h"
#include "DNA_object_types.h"
@@ -46,7 +48,9 @@
#include "DNA_screen_types.h"
#include "DNA_sequence_types.h"
-#include "MEM_guardedalloc.h"
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_anim.h"
#include "BKE_animsys.h"
@@ -63,15 +67,12 @@
#include "BKE_scene.h"
#include "BKE_sequencer.h"
#include "BKE_world.h"
-#include "BKE_utildefines.h"
+
#include "BKE_sound.h"
//XXX #include "BIF_previewrender.h"
//XXX #include "BIF_editseq.h"
-#include "BLI_math.h"
-#include "BLI_blenlib.h"
-
//XXX #include "nla.h"
#ifdef WIN32
@@ -106,7 +107,7 @@ void free_qtcodecdata(QuicktimeCodecData *qcd)
}
}
-Scene *copy_scene(Main *bmain, Scene *sce, int type)
+Scene *copy_scene(Scene *sce, int type)
{
Scene *scen;
ToolSettings *ts;
@@ -128,7 +129,6 @@ Scene *copy_scene(Main *bmain, Scene *sce, int type)
id_us_plus((ID *)scen->world);
id_us_plus((ID *)scen->set);
- id_us_plus((ID *)scen->ima);
id_us_plus((ID *)scen->gm.dome.warptext);
scen->ed= NULL;
@@ -171,7 +171,7 @@ Scene *copy_scene(Main *bmain, Scene *sce, int type)
BKE_keyingsets_copy(&(scen->keyingsets), &(sce->keyingsets));
if(sce->nodetree) {
- scen->nodetree= ntreeCopyTree(sce->nodetree, 0);
+ scen->nodetree= ntreeCopyTree(sce->nodetree); /* copies actions */
ntreeSwitchID(scen->nodetree, &sce->id, &scen->id);
}
@@ -210,23 +210,26 @@ Scene *copy_scene(Main *bmain, Scene *sce, int type)
if(type == SCE_COPY_LINK_DATA || type == SCE_COPY_FULL) {
ID_NEW(scen->camera);
}
+
+ /* before scene copy */
+ sound_create_scene(scen);
/* world */
if(type == SCE_COPY_FULL) {
+ BKE_copy_animdata_id_action((ID *)scen);
if(scen->world) {
id_us_plus((ID *)scen->world);
scen->world= copy_world(scen->world);
+ BKE_copy_animdata_id_action((ID *)scen->world);
}
if(sce->ed) {
scen->ed= MEM_callocN( sizeof(Editing), "addseq");
scen->ed->seqbasep= &scen->ed->seqbase;
- seqbase_dupli_recursive(sce, &scen->ed->seqbase, &sce->ed->seqbase, SEQ_DUPE_ALL);
+ seqbase_dupli_recursive(sce, scen, &scen->ed->seqbase, &sce->ed->seqbase, SEQ_DUPE_ALL);
}
}
- sound_create_scene(scen);
-
return scen;
}
@@ -315,7 +318,7 @@ void free_scene(Scene *sce)
sound_destroy_scene(sce);
}
-Scene *add_scene(char *name)
+Scene *add_scene(const char *name)
{
Main *bmain= G.main;
Scene *sce;
@@ -336,26 +339,42 @@ Scene *add_scene(char *name)
sce->r.yasp= 1;
sce->r.xparts= 8;
sce->r.yparts= 8;
- sce->r.size= 25;
+ sce->r.mblur_samples= 1;
+ sce->r.filtertype= R_FILTER_MITCH;
+ sce->r.size= 50;
sce->r.planes= 24;
+ sce->r.imtype= R_PNG;
sce->r.quality= 90;
+ sce->r.displaymode= R_OUTPUT_AREA;
sce->r.framapto= 100;
sce->r.images= 100;
sce->r.framelen= 1.0;
- sce->r.frs_sec= 25;
+ sce->r.blurfac= 0.5;
+ sce->r.frs_sec= 24;
sce->r.frs_sec_base= 1;
+ sce->r.edgeint= 10;
sce->r.ocres = 128;
sce->r.color_mgt_flag |= R_COLOR_MANAGEMENT;
+ sce->r.gauss= 1.0;
+
+ /* deprecated but keep for upwards compat */
+ sce->r.postgamma= 1.0;
+ sce->r.posthue= 0.0;
+ sce->r.postsat= 1.0;
sce->r.bake_mode= 1; /* prevent to include render stuff here */
- sce->r.bake_filter= 8;
+ sce->r.bake_filter= 2;
sce->r.bake_osa= 5;
sce->r.bake_flag= R_BAKE_CLEAR;
sce->r.bake_normal_space= R_BAKE_SPACE_TANGENT;
-
sce->r.scemode= R_DOCOMP|R_DOSEQ|R_EXTENSION;
- sce->r.stamp= R_STAMP_TIME|R_STAMP_FRAME|R_STAMP_DATE|R_STAMP_SCENE|R_STAMP_CAMERA|R_STAMP_RENDERTIME;
+ sce->r.stamp= R_STAMP_TIME|R_STAMP_FRAME|R_STAMP_DATE|R_STAMP_CAMERA|R_STAMP_SCENE|R_STAMP_FILENAME|R_STAMP_RENDERTIME;
sce->r.stamp_font_id= 12;
+ sce->r.fg_stamp[0]= sce->r.fg_stamp[1]= sce->r.fg_stamp[2]= 0.8f;
+ sce->r.fg_stamp[3]= 1.0f;
+ sce->r.bg_stamp[0]= sce->r.bg_stamp[1]= sce->r.bg_stamp[2]= 0.0f;
+ sce->r.bg_stamp[3]= 0.25f;
+ sce->r.raytrace_options = R_RAYTRACE_USE_INSTANCES;
sce->r.seq_prev_type= OB_SOLID;
sce->r.seq_rend_type= OB_SOLID;
@@ -441,9 +460,11 @@ Scene *add_scene(char *name)
pset->brush[a].count= 10;
}
pset->brush[PE_BRUSH_CUT].strength= 100;
-
- sce->jumpframe = 10;
+
sce->r.ffcodecdata.audio_mixrate = 44100;
+ sce->r.ffcodecdata.audio_volume = 1.0f;
+
+ BLI_strncpy(sce->r.engine, "BLENDER_RENDER", sizeof(sce->r.engine));
sce->audio.distance_model = 2.0;
sce->audio.doppler_factor = 1.0;
@@ -469,8 +490,8 @@ Scene *add_scene(char *name)
sce->gm.dome.resbuf = 1.0f;
sce->gm.dome.tilt = 0;
- sce->gm.xplay= 800;
- sce->gm.yplay= 600;
+ sce->gm.xplay= 640;
+ sce->gm.yplay= 480;
sce->gm.freqplay= 60;
sce->gm.depth= 32;
@@ -577,16 +598,16 @@ void set_scene_bg(Main *bmain, Scene *scene)
}
/* called from creator.c */
-Scene *set_scene_name(Main *bmain, char *name)
+Scene *set_scene_name(Main *bmain, const char *name)
{
Scene *sce= (Scene *)find_id("SC", name);
if(sce) {
set_scene_bg(bmain, sce);
- printf("Scene switch: '%s' in file: '%s'\n", name, G.sce);
+ printf("Scene switch: '%s' in file: '%s'\n", name, G.main->name);
return sce;
}
- printf("Can't find scene: '%s' in file: '%s'\n", name, G.sce);
+ printf("Can't find scene: '%s' in file: '%s'\n", name, G.main->name);
return NULL;
}
@@ -857,6 +878,21 @@ int scene_marker_tfm_extend(Scene *scene, int delta, int flag, int frame, char s
return tot;
}
+int scene_marker_tfm_scale(struct Scene *scene, float value, int flag)
+{
+ TimeMarker *marker;
+ int tot= 0;
+
+ for (marker= scene->markers.first; marker; marker= marker->next) {
+ if ((marker->flag & flag) == flag) {
+ marker->frame= CFRA + (int)floorf(((float)(marker->frame - CFRA) * value) + 0.5f);
+ tot++;
+ }
+ }
+
+ return tot;
+}
+
Base *scene_add_base(Scene *sce, Object *ob)
{
Base *b= MEM_callocN(sizeof(*b), "scene_add_base");
@@ -926,31 +962,75 @@ float BKE_curframe(Scene *scene)
return ctime;
}
+/* drivers support/hacks
+ * - this method is called from scene_update_tagged_recursive(), so gets included in viewport + render
+ * - these are always run since the depsgraph can't handle non-object data
+ * - these happen after objects are all done so that we can read in their final transform values,
+ * though this means that objects can't refer to scene info for guidance...
+ */
+static void scene_update_drivers(Main *UNUSED(bmain), Scene *scene)
+{
+ float ctime = BKE_curframe(scene);
+
+ /* scene itself */
+ if (scene->adt && scene->adt->drivers.first) {
+ BKE_animsys_evaluate_animdata(&scene->id, scene->adt, ctime, ADT_RECALC_DRIVERS);
+ }
+
+ /* world */
+ // TODO: what about world textures? but then those have nodes too...
+ if (scene->world) {
+ ID *wid = (ID *)scene->world;
+ AnimData *adt= BKE_animdata_from_id(wid);
+
+ if (adt && adt->drivers.first)
+ BKE_animsys_evaluate_animdata(wid, adt, ctime, ADT_RECALC_DRIVERS);
+ }
+
+ /* nodes */
+ if (scene->nodetree) {
+ ID *nid = (ID *)scene->nodetree;
+ AnimData *adt= BKE_animdata_from_id(nid);
+
+ if (adt && adt->drivers.first)
+ BKE_animsys_evaluate_animdata(nid, adt, ctime, ADT_RECALC_DRIVERS);
+ }
+}
+
static void scene_update_tagged_recursive(Main *bmain, Scene *scene, Scene *scene_parent)
{
Base *base;
+
+
+ scene->customdata_mask= scene_parent->customdata_mask;
/* sets first, we allow per definition current scene to have
dependencies on sets, but not the other way around. */
- if(scene->set)
+ if (scene->set)
scene_update_tagged_recursive(bmain, scene->set, scene_parent);
-
- for(base= scene->base.first; base; base= base->next) {
+
+ /* scene objects */
+ for (base= scene->base.first; base; base= base->next) {
Object *ob= base->object;
-
+
object_handle_update(scene_parent, ob);
-
+
if(ob->dup_group && (ob->transflag & OB_DUPLIGROUP))
group_handle_recalc_and_update(scene_parent, ob, ob->dup_group);
/* always update layer, so that animating layers works */
base->lay= ob->lay;
}
+
+ /* scene drivers... */
+ scene_update_drivers(bmain, scene);
}
/* this is called in main loop, doing tagged updates before redraw */
void scene_update_tagged(Main *bmain, Scene *scene)
{
+ DAG_ids_flush_tagged(bmain);
+
scene->physics_settings.quick_cache_step= 0;
/* update all objects: drivers, matrices, displists, etc. flags set
@@ -960,14 +1040,14 @@ void scene_update_tagged(Main *bmain, Scene *scene)
/* recalc scene animation data here (for sequencer) */
{
- float ctime = BKE_curframe(scene);
AnimData *adt= BKE_animdata_from_id(&scene->id);
-
- if(adt && (adt->recalc & ADT_RECALC_ANIM))
+ float ctime = BKE_curframe(scene);
+
+ if (adt && (adt->recalc & ADT_RECALC_ANIM))
BKE_animsys_evaluate_animdata(&scene->id, adt, ctime, 0);
}
-
- if(scene->physics_settings.quick_cache_step)
+
+ if (scene->physics_settings.quick_cache_step)
BKE_ptcache_quick_cache_all(bmain, scene);
/* in the future this should handle updates for all datablocks, not
@@ -991,7 +1071,7 @@ void scene_update_for_newframe(Main *bmain, Scene *sce, unsigned int lay)
/* Following 2 functions are recursive
* so dont call within 'scene_update_tagged_recursive' */
- DAG_scene_update_flags(bmain, sce, lay); // only stuff that moves or needs display still
+ DAG_scene_update_flags(bmain, sce, lay, TRUE); // only stuff that moves or needs display still
/* All 'standard' (i.e. without any dependencies) animation is handled here,
* with an 'local' to 'macro' order of evaluation. This should ensure that
@@ -1058,20 +1138,20 @@ float get_render_aosss_error(RenderData *r, float error)
}
/* helper function for the SETLOOPER macro */
-Base *_setlooper_base_step(Scene **sce, Base *base)
+Base *_setlooper_base_step(Scene **sce_iter, Base *base)
{
if(base && base->next) {
/* common case, step to the next */
return base->next;
}
- else if(base==NULL && (*sce)->base.first) {
+ else if(base==NULL && (*sce_iter)->base.first) {
/* first time looping, return the scenes first base */
- return (Base *)(*sce)->base.first;
+ return (Base *)(*sce_iter)->base.first;
}
else {
/* reached the end, get the next base in the set */
- while((*sce= (*sce)->set)) {
- base= (Base *)(*sce)->base.first;
+ while((*sce_iter= (*sce_iter)->set)) {
+ base= (Base *)(*sce_iter)->base.first;
if(base) {
return base;
}
diff --git a/source/blender/blenkernel/intern/script.c b/source/blender/blenkernel/intern/script.c
index c07032f71d7..6ffac09e843 100644
--- a/source/blender/blenkernel/intern/script.c
+++ b/source/blender/blenkernel/intern/script.c
@@ -36,7 +36,7 @@
/*
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h" // Blender Python library
#endif
*/
diff --git a/source/blender/blenkernel/intern/seqcache.c b/source/blender/blenkernel/intern/seqcache.c
index 487ec78b2bd..78cd4bb51fe 100644
--- a/source/blender/blenkernel/intern/seqcache.c
+++ b/source/blender/blenkernel/intern/seqcache.c
@@ -32,6 +32,7 @@
#include "DNA_sequence_types.h"
#include "BKE_sequencer.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_mempool.h"
#include <pthread.h>
@@ -42,8 +43,7 @@
typedef struct seqCacheKey
{
struct Sequence * seq;
- int rectx;
- int recty;
+ SeqRenderData context;
float cfra;
seq_stripelem_ibuf_t type;
} seqCacheKey;
@@ -61,10 +61,10 @@ static struct BLI_mempool * keypool = 0;
static int ibufs_in = 0;
static int ibufs_rem = 0;
-static unsigned int HashHash(void *key_)
+static unsigned int HashHash(const void *key_)
{
- seqCacheKey * key = (seqCacheKey*) key_;
- unsigned int rval = key->rectx + key->recty;
+ const seqCacheKey *key = (seqCacheKey*) key_;
+ unsigned int rval = seq_hash_render_data(&key->context);
rval ^= *(unsigned int*) &key->cfra;
rval += key->type;
@@ -73,10 +73,10 @@ static unsigned int HashHash(void *key_)
return rval;
}
-static int HashCmp(void *a_, void *b_)
+static int HashCmp(const void *a_, const void *b_)
{
- seqCacheKey * a = (seqCacheKey*) a_;
- seqCacheKey * b = (seqCacheKey*) b_;
+ const seqCacheKey * a = (seqCacheKey*) a_;
+ const seqCacheKey * b = (seqCacheKey*) b_;
if (a->seq < b->seq) {
return -1;
@@ -99,21 +99,7 @@ static int HashCmp(void *a_, void *b_)
return 1;
}
- if (a->rectx < b->rectx) {
- return -1;
- }
- if (a->rectx > b->rectx) {
- return 1;
- }
-
- if (a->recty < b->recty) {
- return -1;
- }
- if (a->recty > b->recty) {
- return 1;
- }
-
- return 0;
+ return seq_cmp_render_data(&a->context, &b->context);
}
static void HashKeyFree(void *key)
@@ -192,7 +178,7 @@ void seq_stripelem_cache_cleanup()
}
struct ImBuf * seq_stripelem_cache_get(
- struct Sequence * seq, int rectx, int recty,
+ SeqRenderData context, struct Sequence * seq,
float cfra, seq_stripelem_ibuf_t type)
{
seqCacheKey key;
@@ -207,8 +193,7 @@ struct ImBuf * seq_stripelem_cache_get(
}
key.seq = seq;
- key.rectx = rectx;
- key.recty = recty;
+ key.context = context;
key.cfra = cfra - seq->start;
key.type = type;
@@ -224,7 +209,7 @@ struct ImBuf * seq_stripelem_cache_get(
}
void seq_stripelem_cache_put(
- struct Sequence * seq, int rectx, int recty,
+ SeqRenderData context, struct Sequence * seq,
float cfra, seq_stripelem_ibuf_t type, struct ImBuf * i)
{
seqCacheKey * key;
@@ -243,13 +228,13 @@ void seq_stripelem_cache_put(
key = (seqCacheKey*) BLI_mempool_alloc(keypool);
key->seq = seq;
- key->rectx = rectx;
- key->recty = recty;
+ key->context = context;
key->cfra = cfra - seq->start;
key->type = type;
- /* we want our own version */
- IMB_refImBuf(i);
+ /* Normally we want our own version, but start and end stills are duplicates of the original. */
+ if(ELEM(type, SEQ_STRIPELEM_IBUF_STARTSTILL, SEQ_STRIPELEM_IBUF_ENDSTILL)==0)
+ IMB_refImBuf(i);
e = (seqCacheEntry*) BLI_mempool_alloc(entrypool);
diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c
index 461cb075bb0..11075fe402e 100644
--- a/source/blender/blenkernel/intern/seqeffects.c
+++ b/source/blender/blenkernel/intern/seqeffects.c
@@ -35,6 +35,7 @@
#include "PIL_dynlib.h"
#include "BLI_math.h" /* windows needs for M_PI */
+#include "BLI_utildefines.h"
#include "DNA_scene_types.h"
#include "DNA_sequence_types.h"
@@ -53,7 +54,7 @@
#include "RNA_access.h"
/* **** XXX **** */
-static void error(const char *error, ...) {}
+static void error(const char *UNUSED(error), ...) {}
#define INT 96
#define FLO 128
@@ -69,23 +70,25 @@ enum {
};
static struct ImBuf * prepare_effect_imbufs(
- int x, int y,
+ SeqRenderData context,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
struct ImBuf * out;
+ int x = context.rectx;
+ int y = context.recty;
if (!ibuf1 && !ibuf2 && !ibuf3) {
/* hmmm, global float option ? */
- out = IMB_allocImBuf((short)x, (short)y, 32, IB_rect, 0);
+ out = IMB_allocImBuf((short)x, (short)y, 32, IB_rect);
} else if ((ibuf1 && ibuf1->rect_float) ||
(ibuf2 && ibuf2->rect_float) ||
(ibuf3 && ibuf3->rect_float)) {
/* if any inputs are rectfloat, output is float too */
- out = IMB_allocImBuf((short)x, (short)y, 32, IB_rectfloat, 0);
+ out = IMB_allocImBuf((short)x, (short)y, 32, IB_rectfloat);
} else {
- out = IMB_allocImBuf((short)x, (short)y, 32, IB_rect, 0);
+ out = IMB_allocImBuf((short)x, (short)y, 32, IB_rect);
}
if (ibuf1 && !ibuf1->rect_float && out->rect_float) {
@@ -117,8 +120,8 @@ static struct ImBuf * prepare_effect_imbufs(
static void open_plugin_seq(PluginSeq *pis, const char *seqname)
{
- int (*version)();
- void* (*alloc_private)();
+ int (*version)(void);
+ void* (*alloc_private)(void);
char *cp;
/* to be sure: (is tested for) */
@@ -141,7 +144,7 @@ static void open_plugin_seq(PluginSeq *pis, const char *seqname)
if (pis->handle != 0) {
/* find the address of the version function */
- version= (int (*)())PIL_dynlib_find_symbol(pis->handle, "plugin_seq_getversion");
+ version= (int (*)(void))PIL_dynlib_find_symbol(pis->handle, "plugin_seq_getversion");
if (test_dlerr(pis->name, "plugin_seq_getversion")) return;
if (version != 0) {
@@ -175,7 +178,7 @@ static void open_plugin_seq(PluginSeq *pis, const char *seqname)
return;
}
}
- alloc_private = (void* (*)())PIL_dynlib_find_symbol(
+ alloc_private = (void* (*)(void))PIL_dynlib_find_symbol(
pis->handle, "plugin_seq_alloc_private_data");
if (alloc_private) {
pis->instance_private_data = alloc_private();
@@ -244,7 +247,7 @@ static void init_plugin(Sequence * seq, const char * fname)
/*
* FIXME: should query plugin! Could be generator, that needs zero inputs...
*/
-static int num_inputs_plugin()
+static int num_inputs_plugin(void)
{
return 1;
}
@@ -273,9 +276,8 @@ static ImBuf * IMB_cast_away_list(ImBuf * i)
}
static struct ImBuf * do_plugin_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *seq, float cfra,
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
@@ -285,7 +287,9 @@ static struct ImBuf * do_plugin_effect(
old plugins) do very bad stuff
with imbuf-internals */
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
+ int x = context.rectx;
+ int y = context.recty;
if(seq->plugin && seq->plugin->doit) {
@@ -370,8 +374,8 @@ static struct ImBuf * do_plugin_effect(
return out;
}
-static int do_plugin_early_out(struct Sequence *seq,
- float facf0, float facf1)
+static int do_plugin_early_out(struct Sequence *UNUSED(seq),
+ float UNUSED(facf0), float UNUSED(facf1))
{
return 0;
}
@@ -524,22 +528,21 @@ static void do_alphaover_effect_float(float facf0, float facf1, int x, int y,
}
static struct ImBuf * do_alphaover_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
if (out->rect_float) {
do_alphaover_effect_float(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
ibuf1->rect_float, ibuf2->rect_float,
out->rect_float);
} else {
do_alphaover_effect_byte(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
(char*) ibuf1->rect, (char*) ibuf2->rect,
(char*) out->rect);
}
@@ -696,22 +699,22 @@ static void do_alphaunder_effect_float(float facf0, float facf1, int x, int y,
}
static struct ImBuf* do_alphaunder_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(
+ context, ibuf1, ibuf2, ibuf3);
if (out->rect_float) {
do_alphaunder_effect_float(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
ibuf1->rect_float, ibuf2->rect_float,
out->rect_float);
} else {
do_alphaunder_effect_byte(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
(char*) ibuf1->rect, (char*) ibuf2->rect,
(char*) out->rect);
}
@@ -821,22 +824,22 @@ void do_cross_effect_float(float facf0, float facf1, int x, int y,
/* carefull: also used by speed effect! */
static struct ImBuf* do_cross_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(
+ context, ibuf1, ibuf2, ibuf3);
if (out->rect_float) {
do_cross_effect_float(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
ibuf1->rect_float, ibuf2->rect_float,
out->rect_float);
} else {
do_cross_effect_byte(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
(char*) ibuf1->rect, (char*) ibuf2->rect,
(char*) out->rect);
}
@@ -967,7 +970,7 @@ static void gamtabs(float gamma)
}
-static void build_gammatabs()
+static void build_gammatabs(void)
{
if (gamma_tabs_init == FALSE) {
gamtabs(2.0f);
@@ -976,19 +979,19 @@ static void build_gammatabs()
}
}
-static void init_gammacross(Sequence * seq)
+static void init_gammacross(Sequence * UNUSED(seq))
{
}
-static void load_gammacross(Sequence * seq)
+static void load_gammacross(Sequence * UNUSED(seq))
{
}
-static void free_gammacross(Sequence * seq)
+static void free_gammacross(Sequence * UNUSED(seq))
{
}
-static void do_gammacross_effect_byte(float facf0, float facf1,
+static void do_gammacross_effect_byte(float facf0, float UNUSED(facf1),
int x, int y,
unsigned char *rect1,
unsigned char *rect2,
@@ -1044,7 +1047,7 @@ static void do_gammacross_effect_byte(float facf0, float facf1,
}
-static void do_gammacross_effect_float(float facf0, float facf1,
+static void do_gammacross_effect_float(float facf0, float UNUSED(facf1),
int x, int y,
float *rect1, float *rect2,
float *out)
@@ -1088,24 +1091,24 @@ static void do_gammacross_effect_float(float facf0, float facf1,
}
static struct ImBuf * do_gammacross_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context,
+ Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
build_gammatabs();
if (out->rect_float) {
do_gammacross_effect_float(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
ibuf1->rect_float, ibuf2->rect_float,
out->rect_float);
} else {
do_gammacross_effect_byte(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
(unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
(unsigned char*) out->rect);
}
@@ -1206,22 +1209,22 @@ static void do_add_effect_float(float facf0, float facf1, int x, int y,
}
}
-static struct ImBuf * do_add_effect(Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+static struct ImBuf * do_add_effect(SeqRenderData context,
+ Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
if (out->rect_float) {
do_add_effect_float(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
ibuf1->rect_float, ibuf2->rect_float,
out->rect_float);
} else {
do_add_effect_byte(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
(unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
(unsigned char*) out->rect);
}
@@ -1323,22 +1326,21 @@ static void do_sub_effect_float(float facf0, float facf1, int x, int y,
}
static struct ImBuf * do_sub_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
if (out->rect_float) {
do_sub_effect_float(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
ibuf1->rect_float, ibuf2->rect_float,
out->rect_float);
} else {
do_sub_effect_byte(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
(char*) ibuf1->rect, (char*) ibuf2->rect,
(char*) out->rect);
}
@@ -1537,22 +1539,21 @@ static void do_mul_effect_float(float facf0, float facf1, int x, int y,
}
static struct ImBuf * do_mul_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
if (out->rect_float) {
do_mul_effect_float(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
ibuf1->rect_float, ibuf2->rect_float,
out->rect_float);
} else {
do_mul_effect_byte(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
(unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
(unsigned char*) out->rect);
}
@@ -1591,15 +1592,10 @@ static void precalc_wipe_zone(WipeZone *wipezone, WipeVars *wipe, int xo, int yo
// This function calculates the blur band for the wipe effects
static float in_band(WipeZone *wipezone,float width,float dist,float perc,int side,int dir)
{
- float t1,t2,alpha,percwidth;
+ float t1,t2,alpha;
if(width == 0)
return (float)side;
-
- if(side == 1)
- percwidth = width * perc;
- else
- percwidth = width * (1 - perc);
if(width < dist)
return side;
@@ -1860,7 +1856,7 @@ static void init_wipe_effect(Sequence *seq)
seq->effectdata = MEM_callocN(sizeof(struct WipeVars), "wipevars");
}
-static int num_inputs_wipe()
+static int num_inputs_wipe(void)
{
return 1;
}
@@ -1876,7 +1872,7 @@ static void copy_wipe_effect(Sequence *dst, Sequence *src)
dst->effectdata = MEM_dupallocN(src->effectdata);
}
-static void do_wipe_effect_byte(Sequence *seq, float facf0, float facf1,
+static void do_wipe_effect_byte(Sequence *seq, float facf0, float UNUSED(facf1),
int x, int y,
unsigned char *rect1,
unsigned char *rect2, unsigned char *out)
@@ -1934,7 +1930,7 @@ static void do_wipe_effect_byte(Sequence *seq, float facf0, float facf1,
}
}
-static void do_wipe_effect_float(Sequence *seq, float facf0, float facf1,
+static void do_wipe_effect_float(Sequence *seq, float facf0, float UNUSED(facf1),
int x, int y,
float *rect1,
float *rect2, float *out)
@@ -1993,24 +1989,23 @@ static void do_wipe_effect_float(Sequence *seq, float facf0, float facf1,
}
static struct ImBuf * do_wipe_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *seq, float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
if (out->rect_float) {
do_wipe_effect_float(seq,
- facf0, facf1, x, y,
- ibuf1->rect_float, ibuf2->rect_float,
- out->rect_float);
+ facf0, facf1, context.rectx, context.recty,
+ ibuf1->rect_float, ibuf2->rect_float,
+ out->rect_float);
} else {
do_wipe_effect_byte(seq,
- facf0, facf1, x, y,
- (unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
- (unsigned char*) out->rect);
+ facf0, facf1, context.rectx, context.recty,
+ (unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
+ (unsigned char*) out->rect);
}
return out;
@@ -2045,7 +2040,7 @@ static void init_transform_effect(Sequence *seq)
transform->uniform_scale=0;
}
-static int num_inputs_transform()
+static int num_inputs_transform(void)
{
return 1;
}
@@ -2062,8 +2057,8 @@ static void copy_transform_effect(Sequence *dst, Sequence *src)
}
static void transform_image(int x, int y, struct ImBuf *ibuf1, struct ImBuf *out,
- float scale_x, float scale_y, float translate_x, float translate_y,
- float rotate, int interpolation)
+ float scale_x, float scale_y, float translate_x, float translate_y,
+ float rotate, int interpolation)
{
int xo, yo, xi, yi;
float xt, yt, xr, yr;
@@ -2111,7 +2106,7 @@ static void transform_image(int x, int y, struct ImBuf *ibuf1, struct ImBuf *out
}
}
-static void do_transform(Scene *scene, Sequence *seq, float facf0, int x, int y,
+static void do_transform(Scene *scene, Sequence *seq, float UNUSED(facf0), int x, int y,
struct ImBuf *ibuf1,struct ImBuf *out)
{
TransformVars *transform = (TransformVars *)seq->effectdata;
@@ -2144,15 +2139,15 @@ static void do_transform(Scene *scene, Sequence *seq, float facf0, int x, int y,
static struct ImBuf * do_transform_effect(
- Main *bmain, Scene *scene, Sequence *seq,float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *seq,float UNUSED(cfra),
+ float facf0, float UNUSED(facf1),
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
- do_transform(scene, seq, facf0, x, y, ibuf1, out);
+ do_transform(context.scene, seq, facf0,
+ context.rectx, context.recty, ibuf1, out);
return out;
}
@@ -2614,7 +2609,7 @@ static void init_glow_effect(Sequence *seq)
glow->bNoComp = 0;
}
-static int num_inputs_glow()
+static int num_inputs_glow(void)
{
return 1;
}
@@ -2631,55 +2626,56 @@ static void copy_glow_effect(Sequence *dst, Sequence *src)
}
//void do_glow_effect(Cast *cast, float facf0, float facf1, int xo, int yo, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *outbuf, ImBuf *use)
-static void do_glow_effect_byte(Sequence *seq, float facf0, float facf1,
+static void do_glow_effect_byte(Sequence *seq, int render_size, float facf0, float UNUSED(facf1),
int x, int y, char *rect1,
- char *rect2, char *out)
+ char *UNUSED(rect2), char *out)
{
unsigned char *outbuf=(unsigned char *)out;
unsigned char *inbuf=(unsigned char *)rect1;
GlowVars *glow = (GlowVars *)seq->effectdata;
- int size= 100; // renderdata XXX
RVIsolateHighlights_byte(inbuf, outbuf , x, y, glow->fMini*765, glow->fBoost * facf0, glow->fClamp);
- RVBlurBitmap2_byte (outbuf, x, y, glow->dDist * (size / 100.0f),glow->dQuality);
+ RVBlurBitmap2_byte (outbuf, x, y, glow->dDist * (render_size / 100.0f),glow->dQuality);
if (!glow->bNoComp)
RVAddBitmaps_byte (inbuf , outbuf, outbuf, x, y);
}
-static void do_glow_effect_float(Sequence *seq, float facf0, float facf1,
+static void do_glow_effect_float(Sequence *seq, int render_size, float facf0, float UNUSED(facf1),
int x, int y,
- float *rect1, float *rect2, float *out)
+ float *rect1, float *UNUSED(rect2), float *out)
{
float *outbuf = out;
float *inbuf = rect1;
GlowVars *glow = (GlowVars *)seq->effectdata;
- int size= 100; // renderdata XXX
RVIsolateHighlights_float(inbuf, outbuf , x, y, glow->fMini*3.0f, glow->fBoost * facf0, glow->fClamp);
- RVBlurBitmap2_float (outbuf, x, y, glow->dDist * (size / 100.0f),glow->dQuality);
+ RVBlurBitmap2_float (outbuf, x, y, glow->dDist * (render_size / 100.0f),glow->dQuality);
if (!glow->bNoComp)
RVAddBitmaps_float (inbuf , outbuf, outbuf, x, y);
}
static struct ImBuf * do_glow_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *seq, float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
+
+ int render_size = 100*context.rectx/context.scene->r.xsch;
if (out->rect_float) {
- do_glow_effect_float(seq,
- facf0, facf1, x, y,
- ibuf1->rect_float, ibuf2->rect_float,
- out->rect_float);
+ do_glow_effect_float(seq, render_size,
+ facf0, facf1,
+ context.rectx, context.recty,
+ ibuf1->rect_float, ibuf2->rect_float,
+ out->rect_float);
} else {
- do_glow_effect_byte(seq,
- facf0, facf1, x, y,
- (char*) ibuf1->rect, (char*) ibuf2->rect,
- (char*) out->rect);
+ do_glow_effect_byte(seq, render_size,
+ facf0, facf1,
+ context.rectx, context.recty,
+ (char*) ibuf1->rect, (char*) ibuf2->rect,
+ (char*) out->rect);
}
return out;
@@ -2700,7 +2696,7 @@ static void init_solid_color(Sequence *seq)
cv->col[0] = cv->col[1] = cv->col[2] = 0.5;
}
-static int num_inputs_color()
+static int num_inputs_color(void)
{
return 0;
}
@@ -2716,25 +2712,26 @@ static void copy_solid_color(Sequence *dst, Sequence *src)
dst->effectdata = MEM_dupallocN(src->effectdata);
}
-static int early_out_color(struct Sequence *seq,
- float facf0, float facf1)
+static int early_out_color(struct Sequence *UNUSED(seq),
+ float UNUSED(facf0), float UNUSED(facf1))
{
return -1;
}
static struct ImBuf * do_solid_color(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *seq, float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
SolidColorVars *cv = (SolidColorVars *)seq->effectdata;
unsigned char *rect;
float *rect_float;
+ int x; /*= context.rectx;*/ /*UNUSED*/
+ int y; /*= context.recty;*/ /*UNUSED*/
if (out->rect) {
unsigned char col0[3];
@@ -2808,22 +2805,21 @@ static struct ImBuf * do_solid_color(
********************************************************************** */
/* no effect inputs for multicam, we use give_ibuf_seq */
-static int num_inputs_multicam()
+static int num_inputs_multicam(void)
{
return 0;
}
-static int early_out_multicam(struct Sequence *seq, float facf0, float facf1)
+static int early_out_multicam(struct Sequence *UNUSED(seq), float UNUSED(facf0), float UNUSED(facf1))
{
return -1;
}
static struct ImBuf * do_multicam(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
- struct ImBuf *ibuf1, struct ImBuf *ibuf2,
- struct ImBuf *ibuf3)
+ SeqRenderData context, Sequence *seq, float cfra,
+ float UNUSED(facf0), float UNUSED(facf1),
+ struct ImBuf *UNUSED(ibuf1), struct ImBuf *UNUSED(ibuf2),
+ struct ImBuf *UNUSED(ibuf3))
{
struct ImBuf * i;
struct ImBuf * out;
@@ -2834,7 +2830,7 @@ static struct ImBuf * do_multicam(
return 0;
}
- ed = scene->ed;
+ ed = context.scene->ed;
if (!ed) {
return 0;
}
@@ -2843,13 +2839,12 @@ static struct ImBuf * do_multicam(
return 0;
}
- i = give_ibuf_seqbase(bmain, scene, x, y, cfra, seq->multicam_source,
- preview_render_size, seqbasep);
+ i = give_ibuf_seqbase(context, cfra, seq->multicam_source, seqbasep);
if (!i) {
return 0;
}
- if (input_have_to_preprocess(scene, seq, cfra, x, y)) {
+ if (input_have_to_preprocess(context, seq, cfra)) {
out = IMB_dupImBuf(i);
IMB_freeImBuf(i);
} else {
@@ -2873,7 +2868,7 @@ static void init_speed_effect(Sequence *seq)
v = (SpeedControlVars *)seq->effectdata;
v->globalSpeed = 1.0;
v->frameMap = 0;
- v->flags = 0;
+ v->flags |= SEQ_SPEED_INTEGRATE; /* should be default behavior */
v->length = 0;
}
@@ -2885,7 +2880,7 @@ static void load_speed_effect(Sequence * seq)
v->length = 0;
}
-static int num_inputs_speed()
+static int num_inputs_speed(void)
{
return 1;
}
@@ -2907,14 +2902,14 @@ static void copy_speed_effect(Sequence *dst, Sequence *src)
v->length = 0;
}
-static int early_out_speed(struct Sequence *seq,
- float facf0, float facf1)
+static int early_out_speed(struct Sequence *UNUSED(seq),
+ float UNUSED(facf0), float UNUSED(facf1))
{
return 1;
}
static void store_icu_yrange_speed(struct Sequence * seq,
- short adrcode, float * ymin, float * ymax)
+ short UNUSED(adrcode), float * ymin, float * ymax)
{
SpeedControlVars * v = (SpeedControlVars *)seq->effectdata;
@@ -2936,11 +2931,11 @@ static void store_icu_yrange_speed(struct Sequence * seq,
}
void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force)
{
- float ctime, div;
int cfra;
- float fallback_fac;
+ float fallback_fac = 1.0f;
SpeedControlVars * v = (SpeedControlVars *)seq->effectdata;
FCurve *fcu= NULL;
+ int flags = v->flags;
/* if not already done, load / initialize data */
get_sequence_effect(seq);
@@ -2955,7 +2950,7 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force)
/* XXX - new in 2.5x. should we use the animation system this way?
* The fcurve is needed because many frames need evaluating at once - campbell */
- fcu= id_data_find_fcurve(&scene->id, seq, &RNA_Sequence, "speed_fader", 0);
+ fcu= id_data_find_fcurve(&scene->id, seq, &RNA_Sequence, "speed_factor", 0);
if (!v->frameMap || v->length != seq->len) {
@@ -2968,15 +2963,23 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force)
}
fallback_fac = 1.0;
-
- /* if there is no fcurve, try to make retiming easy by stretching the
- strip */
- if (!fcu && seq->seq1->enddisp != seq->seq1->start && seq->seq1->len != 0) {
- fallback_fac = (float) seq->seq1->len /
- (float) (seq->seq1->enddisp - seq->seq1->start);
+
+ if (seq->flag & SEQ_USE_EFFECT_DEFAULT_FADE) {
+ if (seq->seq1->enddisp != seq->seq1->start
+ && seq->seq1->len != 0) {
+ fallback_fac = (float) seq->seq1->len /
+ (float) (seq->seq1->enddisp - seq->seq1->start);
+ flags = SEQ_SPEED_INTEGRATE;
+ fcu = NULL;
+ }
+ } else {
+ /* if there is no fcurve, use value as simple multiplier */
+ if (!fcu) {
+ fallback_fac = seq->speed_fader; /* same as speed_factor in rna*/
+ }
}
- if ((v->flags & SEQ_SPEED_INTEGRATE) != 0) {
+ if (flags & SEQ_SPEED_INTEGRATE) {
float cursor = 0;
float facf;
@@ -2985,10 +2988,7 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force)
for (cfra = 1; cfra < v->length; cfra++) {
if(fcu) {
- ctime = seq->startdisp + cfra;
- div = 1.0;
-
- facf = evaluate_fcurve(fcu, ctime/div);
+ facf = evaluate_fcurve(fcu, seq->startdisp + cfra);
} else {
facf = fallback_fac;
}
@@ -3010,19 +3010,16 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force)
for (cfra = 0; cfra < v->length; cfra++) {
if(fcu) {
- ctime = seq->startdisp + cfra;
- div = 1.0;
-
- facf = evaluate_fcurve(fcu, ctime / div);
- if (v->flags & SEQ_SPEED_COMPRESS_IPO_Y) {
- facf *= v->length;
- }
+ facf = evaluate_fcurve(fcu, seq->startdisp + cfra);
+ } else {
+ facf = fallback_fac;
}
-
- if (!fcu) {
- facf = (float) cfra * fallback_fac;
+
+ if (flags & SEQ_SPEED_COMPRESS_IPO_Y) {
+ facf *= seq->seq1->len;
}
facf *= v->globalSpeed;
+
if (facf >= seq->seq1->len) {
facf = seq->seq1->len - 1;
} else {
@@ -3033,56 +3030,43 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force)
}
}
-/*
- simply reuse do_cross_effect for blending...
-
-static void do_speed_effect(Sequence * seq,int cfra,
- float facf0, float facf1, int x, int y,
- struct ImBuf *ibuf1, struct ImBuf *ibuf2,
- struct ImBuf *ibuf3, struct ImBuf *out)
-{
-
-}
-*/
-
-
/* **********************************************************************
sequence effect factory
********************************************************************** */
-static void init_noop(struct Sequence *seq)
+static void init_noop(struct Sequence *UNUSED(seq))
{
}
-static void load_noop(struct Sequence *seq)
+static void load_noop(struct Sequence *UNUSED(seq))
{
}
-static void init_plugin_noop(struct Sequence *seq, const char * fname)
+static void init_plugin_noop(struct Sequence *UNUSED(seq), const char *UNUSED(fname))
{
}
-static void free_noop(struct Sequence *seq)
+static void free_noop(struct Sequence *UNUSED(seq))
{
}
-static int num_inputs_default()
+static int num_inputs_default(void)
{
return 2;
}
-static int early_out_noop(struct Sequence *seq,
- float facf0, float facf1)
+static int early_out_noop(struct Sequence *UNUSED(seq),
+ float UNUSED(facf0), float UNUSED(facf1))
{
return 0;
}
-static int early_out_fade(struct Sequence *seq,
+static int early_out_fade(struct Sequence *UNUSED(seq),
float facf0, float facf1)
{
if (facf0 == 0.0 && facf1 == 0.0) {
@@ -3093,7 +3077,7 @@ static int early_out_fade(struct Sequence *seq,
return 0;
}
-static int early_out_mul_input2(struct Sequence *seq,
+static int early_out_mul_input2(struct Sequence *UNUSED(seq),
float facf0, float facf1)
{
if (facf0 == 0.0 && facf1 == 0.0) {
@@ -3102,13 +3086,13 @@ static int early_out_mul_input2(struct Sequence *seq,
return 0;
}
-static void store_icu_yrange_noop(struct Sequence * seq,
- short adrcode, float * ymin, float * ymax)
+static void store_icu_yrange_noop(struct Sequence * UNUSED(seq),
+ short UNUSED(adrcode), float *UNUSED(ymin), float *UNUSED(ymax))
{
/* defaults are fine */
}
-static void get_default_fac_noop(struct Sequence *seq, float cfra,
+static void get_default_fac_noop(struct Sequence *UNUSED(seq), float UNUSED(cfra),
float * facf0, float * facf1)
{
*facf0 = *facf1 = 1.0;
@@ -3123,15 +3107,17 @@ static void get_default_fac_fade(struct Sequence *seq, float cfra,
*facf1 /= seq->len;
}
-static struct ImBuf * do_overdrop_effect(Main *bmain, Scene *scene, Sequence *seq, float cfra,
+static struct ImBuf * do_overdrop_effect(SeqRenderData context,
+ Sequence *UNUSED(seq),
+ float UNUSED(cfra),
float facf0, float facf1,
- int x, int y,
- int preview_render_size,
struct ImBuf * ibuf1,
struct ImBuf * ibuf2,
struct ImBuf * ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
+ int x = context.rectx;
+ int y = context.recty;
if (out->rect_float) {
do_drop_effect_float(
@@ -3274,9 +3260,7 @@ static struct SeqEffectHandle get_sequence_effect_impl(int seq_type)
struct SeqEffectHandle get_sequence_effect(Sequence * seq)
{
- struct SeqEffectHandle rval;
-
- memset(&rval, 0, sizeof(struct SeqEffectHandle));
+ struct SeqEffectHandle rval= {0};
if (seq->type & SEQ_EFFECT) {
rval = get_sequence_effect_impl(seq->type);
@@ -3291,9 +3275,7 @@ struct SeqEffectHandle get_sequence_effect(Sequence * seq)
struct SeqEffectHandle get_sequence_blend(Sequence * seq)
{
- struct SeqEffectHandle rval;
-
- memset(&rval, 0, sizeof(struct SeqEffectHandle));
+ struct SeqEffectHandle rval= {0};
if (seq->blend_mode != 0) {
rval = get_sequence_effect_impl(seq->blend_mode);
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index b6bb5c3a51b..6aca23b8011 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -41,6 +41,14 @@
#include "DNA_object_types.h"
#include "DNA_sound_types.h"
+#include "BLI_math.h"
+#include "BLI_fileops.h"
+#include "BLI_listbase.h"
+#include "BLI_path_util.h"
+#include "BLI_string.h"
+#include "BLI_threads.h"
+#include "BLI_utildefines.h"
+
#include "BKE_animsys.h"
#include "BKE_global.h"
#include "BKE_image.h"
@@ -49,21 +57,15 @@
#include "BKE_fcurve.h"
#include "BKE_scene.h"
#include "RNA_access.h"
+#include "BKE_utildefines.h"
+
#include "RE_pipeline.h"
-#include "BLI_math.h"
-#include "BLI_fileops.h"
-#include "BLI_listbase.h"
-#include "BLI_path_util.h"
-#include "BLI_string.h"
-#include "BLI_threads.h"
#include <pthread.h>
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
-
-
#include "BKE_context.h"
#include "BKE_sound.h"
#include "AUD_C-API.h"
@@ -244,7 +246,95 @@ void seq_free_editing(Scene *scene)
MEM_freeN(ed);
}
-/* ************************* itterator ************************** */
+/* **********************************************************************
+ * sequencer pipeline functions
+ ********************************************************************** */
+
+SeqRenderData seq_new_render_data(
+ struct Main * bmain, struct Scene * scene,
+ int rectx, int recty, int preview_render_size)
+{
+ SeqRenderData rval;
+
+ rval.bmain = bmain;
+ rval.scene = scene;
+ rval.rectx = rectx;
+ rval.recty = recty;
+ rval.preview_render_size = preview_render_size;
+ rval.motion_blur_samples = 0;
+ rval.motion_blur_shutter = 0;
+
+ return rval;
+}
+
+int seq_cmp_render_data(const SeqRenderData * a, const SeqRenderData * b)
+{
+ if (a->preview_render_size < b->preview_render_size) {
+ return -1;
+ }
+ if (a->preview_render_size > b->preview_render_size) {
+ return 1;
+ }
+
+ if (a->rectx < b->rectx) {
+ return -1;
+ }
+ if (a->rectx > b->rectx) {
+ return 1;
+ }
+
+ if (a->recty < b->recty) {
+ return -1;
+ }
+ if (a->recty > b->recty) {
+ return 1;
+ }
+
+ if (a->bmain < b->bmain) {
+ return -1;
+ }
+ if (a->bmain > b->bmain) {
+ return 1;
+ }
+
+ if (a->scene < b->scene) {
+ return -1;
+ }
+ if (a->scene > b->scene) {
+ return 1;
+ }
+
+ if (a->motion_blur_shutter < b->motion_blur_shutter) {
+ return -1;
+ }
+ if (a->motion_blur_shutter > b->motion_blur_shutter) {
+ return 1;
+ }
+
+ if (a->motion_blur_samples < b->motion_blur_samples) {
+ return -1;
+ }
+ if (a->motion_blur_samples > b->motion_blur_samples) {
+ return 1;
+ }
+
+ return 0;
+}
+
+unsigned int seq_hash_render_data(const SeqRenderData * a)
+{
+ unsigned int rval = a->rectx + a->recty;
+
+ rval ^= a->preview_render_size;
+ rval ^= ((intptr_t) a->bmain) << 6;
+ rval ^= ((intptr_t) a->scene) << 6;
+ rval ^= (int) (a->motion_blur_shutter * 100.0) << 10;
+ rval ^= a->motion_blur_samples << 24;
+
+ return rval;
+}
+
+/* ************************* iterator ************************** */
/* *************** (replaces old WHILE_SEQ) ********************* */
/* **************** use now SEQ_BEGIN() SEQ_END ***************** */
@@ -374,7 +464,7 @@ void build_seqar(ListBase *seqbase, Sequence ***seqar, int *totseq)
do_seq_count(seqbase, totseq);
if(*totseq==0) {
- *seqar= 0;
+ *seqar= NULL;
return;
}
*seqar= MEM_mallocN(sizeof(void *)* *totseq, "seqar");
@@ -413,8 +503,7 @@ static void do_build_seqar_cb(ListBase *seqbase, Sequence ***seqar, int depth,
seq->depth= depth;
if(seq->seqbase.first && (test & BUILD_SEQAR_COUNT_CHILDREN)) {
- do_build_seqar_cb(&seq->seqbase, seqar, depth+1,
- test_func);
+ do_build_seqar_cb(&seq->seqbase, seqar, depth+1, test_func);
}
if (test & BUILD_SEQAR_COUNT_CURRENT) {
**seqar= seq;
@@ -433,7 +522,7 @@ void build_seqar_cb(ListBase *seqbase, Sequence ***seqar, int *totseq,
do_seq_count_cb(seqbase, totseq, test_func);
if(*totseq==0) {
- *seqar= 0;
+ *seqar= NULL;
return;
}
*seqar= MEM_mallocN(sizeof(void *)* *totseq, "seqar");
@@ -473,7 +562,7 @@ static void seq_update_sound_bounds_recursive(Scene *scene, Sequence *metaseq)
if(seq->type == SEQ_META) {
seq_update_sound_bounds_recursive(scene, seq);
}
- else if((seq->type == SEQ_SOUND) || (seq->type == SEQ_SCENE)) {
+ else if(ELEM(seq->type, SEQ_SOUND, SEQ_SCENE)) {
if(seq->scene_sound) {
int startofs = seq->startofs;
int endofs = seq->endofs;
@@ -504,8 +593,8 @@ void calc_sequence(Scene *scene, Sequence *seq)
if(seq->type & SEQ_EFFECT) {
/* pointers */
- if(seq->seq2==0) seq->seq2= seq->seq1;
- if(seq->seq3==0) seq->seq3= seq->seq1;
+ if(seq->seq2==NULL) seq->seq2= seq->seq1;
+ if(seq->seq3==NULL) seq->seq3= seq->seq1;
/* effecten go from seq1 -> seq2: test */
@@ -554,15 +643,13 @@ void calc_sequence(Scene *scene, Sequence *seq)
}
/* note: caller should run calc_sequence(scene, seq) after */
-void reload_sequence_new_file(Main *bmain, Scene *scene, Sequence * seq, int lock_range)
+void reload_sequence_new_file(Scene *scene, Sequence * seq, int lock_range)
{
char str[FILE_MAXDIR+FILE_MAXFILE];
- int prev_startdisp, prev_enddisp;
+ int prev_startdisp=0, prev_enddisp=0;
/* note: dont rename the strip, will break animation curves */
- if (!(seq->type == SEQ_MOVIE || seq->type == SEQ_IMAGE ||
- seq->type == SEQ_SOUND ||
- seq->type == SEQ_SCENE || seq->type == SEQ_META)) {
+ if (ELEM5(seq->type, SEQ_MOVIE, SEQ_IMAGE, SEQ_SOUND, SEQ_SCENE, SEQ_META)==0) {
return;
}
@@ -576,13 +663,14 @@ void reload_sequence_new_file(Main *bmain, Scene *scene, Sequence * seq, int loc
new_tstripdata(seq);
- if (seq->type != SEQ_SCENE && seq->type != SEQ_META &&
- seq->type != SEQ_IMAGE) {
+ if (ELEM3(seq->type, SEQ_SCENE, SEQ_META, SEQ_IMAGE)==0) {
BLI_join_dirfile(str, seq->strip->dir, seq->strip->stripdata->name);
- BLI_path_abs(str, G.sce);
+ BLI_path_abs(str, G.main->name);
}
- if (seq->type == SEQ_IMAGE) {
+ switch(seq->type) {
+ case SEQ_IMAGE:
+ {
/* Hack? */
size_t olen = MEM_allocN_len(seq->strip->stripdata)/sizeof(struct StripElem);
@@ -593,7 +681,9 @@ void reload_sequence_new_file(Main *bmain, Scene *scene, Sequence * seq, int loc
seq->len = 0;
}
seq->strip->len = seq->len;
- } else if (seq->type == SEQ_MOVIE) {
+ break;
+ }
+ case SEQ_MOVIE:
if(seq->anim) IMB_free_anim(seq->anim);
seq->anim = openanim(str, IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0));
@@ -611,7 +701,9 @@ void reload_sequence_new_file(Main *bmain, Scene *scene, Sequence * seq, int loc
seq->len = 0;
}
seq->strip->len = seq->len;
- } else if (seq->type == SEQ_SOUND) {
+ case SEQ_SOUND:
+ if(!seq->sound)
+ return;
seq->len = ceil(AUD_getInfo(seq->sound->playback_handle).length * FPS);
seq->len -= seq->anim_startofs;
seq->len -= seq->anim_endofs;
@@ -619,9 +711,11 @@ void reload_sequence_new_file(Main *bmain, Scene *scene, Sequence * seq, int loc
seq->len = 0;
}
seq->strip->len = seq->len;
- } else if (seq->type == SEQ_SCENE) {
+ break;
+ case SEQ_SCENE:
+ {
/* 'seq->scenenr' should be replaced with something more reliable */
- Scene * sce = bmain->scene.first;
+ Scene * sce = G.main->scene.first;
int nr = 1;
while(sce) {
@@ -634,10 +728,8 @@ void reload_sequence_new_file(Main *bmain, Scene *scene, Sequence * seq, int loc
if (sce) {
seq->scene = sce;
- } else {
- sce = seq->scene;
}
-
+
seq->len= seq->scene->r.efra - seq->scene->r.sfra + 1;
seq->len -= seq->anim_startofs;
seq->len -= seq->anim_endofs;
@@ -645,6 +737,8 @@ void reload_sequence_new_file(Main *bmain, Scene *scene, Sequence * seq, int loc
seq->len = 0;
}
seq->strip->len = seq->len;
+ break;
+ }
}
free_proxy_seq(seq);
@@ -698,7 +792,7 @@ void sort_seq(Scene *scene)
}
}
- addlisttolist(&seqbase, &effbase);
+ BLI_movelisttolist(&seqbase, &effbase);
*(ed->seqbasep)= seqbase;
}
@@ -783,7 +877,7 @@ void seqbase_unique_name_recursive(ListBase *seqbasep, struct Sequence *seq)
strcpy(seq->name+2, sui.name_dest);
}
-static char *give_seqname_by_type(int type)
+static const char *give_seqname_by_type(int type)
{
switch(type) {
case SEQ_META: return "Meta";
@@ -806,13 +900,13 @@ static char *give_seqname_by_type(int type)
case SEQ_MULTICAM: return "Multicam";
case SEQ_SPEED: return "Speed";
default:
- return 0;
+ return NULL;
}
}
-char *give_seqname(Sequence *seq)
+const char *give_seqname(Sequence *seq)
{
- char * name = give_seqname_by_type(seq->type);
+ const char *name = give_seqname_by_type(seq->type);
if (!name) {
if(seq->type<SEQ_EFFECT) {
@@ -898,19 +992,24 @@ static void multibuf(ImBuf *ibuf, float fmul)
static float give_stripelem_index(Sequence *seq, float cfra)
{
float nr;
+ int sta = seq->start;
+ int end = seq->start+seq->len-1;
if(seq->len == 0) return -1;
+
if(seq->flag&SEQ_REVERSE_FRAMES) {
/*reverse frame in this sequence */
- if(cfra <= seq->start) nr= seq->len-1;
- else if(cfra >= seq->start+seq->len-1) nr= 0;
- else nr= (seq->start + seq->len - 1) - cfra;
+ if(cfra <= sta) nr= seq->len-1;
+ else if(cfra >= end) nr= 0;
+ else nr= end - cfra;
} else {
- if(cfra <= seq->start) nr= 0;
- else if(cfra >= seq->start+seq->len-1) nr= seq->len-1;
- else nr= cfra-seq->start;
+ if(cfra <= sta) nr= 0;
+ else if(cfra >= end) nr= seq->len-1;
+ else nr= cfra - sta;
}
+
if (seq->strobe < 1.0) seq->strobe = 1.0;
+
if (seq->strobe > 1.0) {
nr -= fmod((double)nr, (double)seq->strobe);
}
@@ -922,14 +1021,10 @@ StripElem *give_stripelem(Sequence *seq, int cfra)
{
StripElem *se= seq->strip->stripdata;
- if(seq->type == SEQ_MOVIE) {
- /* use the first */
- }
- else {
+ if(seq->type != SEQ_MOVIE) { /* movie use the first */
int nr = (int) give_stripelem_index(seq, cfra);
- if (nr == -1) return 0;
- if (se == 0) return 0;
+ if (nr == -1 || se == 0) return 0;
se += nr + seq->anim_startofs;
}
@@ -966,9 +1061,7 @@ int evaluate_seq_frame(Scene *scene, int cfra)
static int video_seq_is_rendered(Sequence * seq)
{
- return (seq
- && !(seq->flag & SEQ_MUTE)
- && seq->type != SEQ_SOUND);
+ return (seq && !(seq->flag & SEQ_MUTE) && seq->type != SEQ_SOUND);
}
static int get_shown_sequences( ListBase * seqbasep, int cfra, int chanshown, Sequence ** seq_arr_out)
@@ -1005,7 +1098,7 @@ static int get_shown_sequences( ListBase * seqbasep, int cfra, int chanshown, Se
}
}
- for (;b <= chanshown; b++) {
+ for (;b <= chanshown && b >= 0; b++) {
if (video_seq_is_rendered(seq_arr[b])) {
seq_arr_out[cnt++] = seq_arr[b];
}
@@ -1021,7 +1114,7 @@ static int get_shown_sequences( ListBase * seqbasep, int cfra, int chanshown, Se
#define PROXY_MAXFILE (2*FILE_MAXDIR+FILE_MAXFILE)
-static int seq_proxy_get_fname(Scene *scene, Sequence * seq, int cfra, char * name, int render_size)
+static int seq_proxy_get_fname(SeqRenderData context, Sequence * seq, int cfra, char * name)
{
int frameno;
char dir[FILE_MAXDIR];
@@ -1030,13 +1123,11 @@ static int seq_proxy_get_fname(Scene *scene, Sequence * seq, int cfra, char * na
return FALSE;
}
- if ((seq->flag & SEQ_USE_PROXY_CUSTOM_DIR)
- || (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE)) {
+ if (seq->flag & (SEQ_USE_PROXY_CUSTOM_DIR|SEQ_USE_PROXY_CUSTOM_FILE)) {
strcpy(dir, seq->strip->proxy->dir);
} else {
- if (seq->type == SEQ_IMAGE || seq->type == SEQ_MOVIE) {
- snprintf(dir, FILE_MAXDIR, "%s/BL_proxy",
- seq->strip->dir);
+ if (ELEM(seq->type, SEQ_IMAGE, SEQ_MOVIE)) {
+ snprintf(dir, FILE_MAXDIR, "%s/BL_proxy", seq->strip->dir);
} else {
return FALSE;
}
@@ -1044,43 +1135,40 @@ static int seq_proxy_get_fname(Scene *scene, Sequence * seq, int cfra, char * na
if (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) {
BLI_join_dirfile(name, dir, seq->strip->proxy->file);
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, G.main->name);
return TRUE;
}
/* generate a separate proxy directory for each preview size */
- if (seq->type == SEQ_IMAGE) {
- StripElem * se = give_stripelem(seq, cfra);
- snprintf(name, PROXY_MAXFILE, "%s/images/%d/%s_proxy",
- dir, render_size, se->name);
+ switch(seq->type) {
+ case SEQ_IMAGE:
+ snprintf(name, PROXY_MAXFILE, "%s/images/%d/%s_proxy", dir,
+ context.preview_render_size,
+ give_stripelem(seq, cfra)->name);
frameno = 1;
- } else if (seq->type == SEQ_MOVIE) {
- frameno = (int) give_stripelem_index(seq, cfra)
- + seq->anim_startofs;
-
+ break;
+ case SEQ_MOVIE:
+ frameno = (int) give_stripelem_index(seq, cfra) + seq->anim_startofs;
snprintf(name, PROXY_MAXFILE, "%s/%s/%d/####", dir,
- seq->strip->stripdata->name,
- render_size);
- } else {
- frameno = (int) give_stripelem_index(seq, cfra)
- + seq->anim_startofs;
-
- snprintf(name, PROXY_MAXFILE, "%s/proxy_misc/%d/####", dir,
- render_size);
+ seq->strip->stripdata->name, context.preview_render_size);
+ break;
+ default:
+ frameno = (int) give_stripelem_index(seq, cfra) + seq->anim_startofs;
+ snprintf(name, PROXY_MAXFILE, "%s/proxy_misc/%d/####", dir,
+ context.preview_render_size);
}
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, G.main->name);
BLI_path_frame(name, frameno, 0);
-
strcat(name, ".jpg");
return TRUE;
}
-static struct ImBuf * seq_proxy_fetch(Scene *scene, Sequence * seq, int cfra, int render_size)
+static struct ImBuf * seq_proxy_fetch(SeqRenderData context, Sequence * seq, int cfra)
{
char name[PROXY_MAXFILE];
@@ -1089,29 +1177,27 @@ static struct ImBuf * seq_proxy_fetch(Scene *scene, Sequence * seq, int cfra, in
}
/* rendering at 100% ? No real sense in proxy-ing, right? */
- if (render_size == 100) {
+ if (context.preview_render_size == 100) {
return 0;
}
if (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) {
- int frameno = (int) give_stripelem_index(seq, cfra)
- + seq->anim_startofs;
- if (!seq->strip->proxy->anim) {
- if (!seq_proxy_get_fname(
- scene, seq, cfra, name, render_size)) {
+ int frameno = (int) give_stripelem_index(seq, cfra) + seq->anim_startofs;
+ if (seq->strip->proxy->anim == NULL) {
+ if (seq_proxy_get_fname(context, seq, cfra, name)==0) {
return 0;
}
seq->strip->proxy->anim = openanim(name, IB_rect);
}
- if (!seq->strip->proxy->anim) {
+ if (seq->strip->proxy->anim==NULL) {
return 0;
}
return IMB_anim_absolute(seq->strip->proxy->anim, frameno);
}
- if (!seq_proxy_get_fname(scene, seq, cfra, name, render_size)) {
+ if (seq_proxy_get_fname(context, seq, cfra, name) == 0) {
return 0;
}
@@ -1124,9 +1210,9 @@ static struct ImBuf * seq_proxy_fetch(Scene *scene, Sequence * seq, int cfra, in
#if 0
static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int cfra,
- int build_proxy_run, int render_size);
+ int build_proxy_run, int preview_render_size);
-static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int render_size, int seqrectx, int seqrecty)
+static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int preview_render_size, int seqrectx, int seqrecty)
{
char name[PROXY_MAXFILE];
int quality;
@@ -1140,7 +1226,7 @@ static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int re
}
/* rendering at 100% ? No real sense in proxy-ing, right? */
- if (render_size == 100) {
+ if (preview_render_size == 100) {
return;
}
@@ -1149,7 +1235,7 @@ static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int re
return;
}
- if (!seq_proxy_get_fname(scene, seq, cfra, name, render_size)) {
+ if (!seq_proxy_get_fname(scene, seq, cfra, name, preview_render_size)) {
return;
}
@@ -1163,15 +1249,15 @@ static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int re
se->ibuf = 0;
}
- do_build_seq_ibuf(scene, seq, se, cfra, TRUE, render_size,
+ do_build_seq_ibuf(scene, seq, se, cfra, TRUE, preview_render_size,
seqrectx, seqrecty);
if (!se->ibuf) {
return;
}
- rectx= (render_size*scene->r.xsch)/100;
- recty= (render_size*scene->r.ysch)/100;
+ rectx= (preview_render_size*scene->r.xsch)/100;
+ recty= (preview_render_size*scene->r.ysch)/100;
ibuf = se->ibuf;
@@ -1380,8 +1466,7 @@ static void color_balance_byte_float(Sequence * seq, ImBuf* ibuf, float mul)
cb = calc_cb(seq->strip->color_balance);
for (c = 0; c < 3; c++) {
- make_cb_table_float(cb.lift[c], cb.gain[c], cb.gamma[c],
- cb_tab[c], mul);
+ make_cb_table_float(cb.lift[c], cb.gain[c], cb.gamma[c], cb_tab[c], mul);
}
for (i = 0; i < 256; i++) {
@@ -1444,17 +1529,12 @@ static void color_balance(Sequence * seq, ImBuf* ibuf, float mul)
*/
int input_have_to_preprocess(
- Scene *scene, Sequence * seq, float cfra, int seqrectx, int seqrecty)
+ SeqRenderData UNUSED(context), Sequence * seq, float UNUSED(cfra))
{
float mul;
- if ((seq->flag & SEQ_FILTERY) ||
- (seq->flag & SEQ_USE_CROP) ||
- (seq->flag & SEQ_USE_TRANSFORM) ||
- (seq->flag & SEQ_FLIPX) ||
- (seq->flag & SEQ_FLIPY) ||
- (seq->flag & SEQ_USE_COLOR_BALANCE) ||
- (seq->flag & SEQ_MAKE_PREMUL)) {
+ if (seq->flag & (SEQ_FILTERY|SEQ_USE_CROP|SEQ_USE_TRANSFORM|SEQ_FLIPX|
+ SEQ_FLIPY|SEQ_USE_COLOR_BALANCE|SEQ_MAKE_PREMUL)) {
return TRUE;
}
@@ -1476,26 +1556,19 @@ int input_have_to_preprocess(
}
static ImBuf * input_preprocess(
- Scene *scene, Sequence *seq, float cfra, int seqrectx, int seqrecty,
- ImBuf * ibuf)
+ SeqRenderData context, Sequence *seq, float UNUSED(cfra), ImBuf * ibuf)
{
float mul;
- seq->strip->orx= ibuf->x;
- seq->strip->ory= ibuf->y;
-
if((seq->flag & SEQ_FILTERY) && seq->type != SEQ_MOVIE) {
IMB_filtery(ibuf);
}
- if(seq->flag & SEQ_USE_CROP || seq->flag & SEQ_USE_TRANSFORM) {
- StripCrop c;
- StripTransform t;
+ if(seq->flag & (SEQ_USE_CROP|SEQ_USE_TRANSFORM)) {
+ StripCrop c= {0};
+ StripTransform t= {0};
int sx,sy,dx,dy;
- memset(&c, 0, sizeof(StripCrop));
- memset(&t, 0, sizeof(StripTransform));
-
if(seq->flag & SEQ_USE_CROP && seq->strip->crop) {
c = *seq->strip->crop;
}
@@ -1509,27 +1582,17 @@ static ImBuf * input_preprocess(
dy = sy;
if (seq->flag & SEQ_USE_TRANSFORM) {
- dx = scene->r.xsch;
- dy = scene->r.ysch;
+ dx = context.scene->r.xsch;
+ dy = context.scene->r.ysch;
}
- if (c.top + c.bottom >= ibuf->y ||
- c.left + c.right >= ibuf->x ||
- t.xofs >= dx || t.yofs >= dy) {
+ if (c.top + c.bottom >= ibuf->y || c.left + c.right >= ibuf->x ||
+ t.xofs >= dx || t.yofs >= dy) {
make_black_ibuf(ibuf);
} else {
- ImBuf * i;
+ ImBuf * i = IMB_allocImBuf(dx, dy,32, ibuf->rect_float ? IB_rectfloat : IB_rect);
- if (ibuf->rect_float) {
- i = IMB_allocImBuf(dx, dy,32, IB_rectfloat, 0);
- } else {
- i = IMB_allocImBuf(dx, dy,32, IB_rect, 0);
- }
-
- IMB_rectcpy(i, ibuf,
- t.xofs, t.yofs,
- c.left, c.bottom,
- sx, sy);
+ IMB_rectcpy(i, ibuf, t.xofs, t.yofs, c.left, c.bottom, sx, sy);
IMB_freeImBuf(ibuf);
@@ -1548,7 +1611,7 @@ static ImBuf * input_preprocess(
if(seq->sat != 1.0f) {
/* inline for now, could become an imbuf function */
int i;
- char *rct= (char *)ibuf->rect;
+ unsigned char *rct= (unsigned char *)ibuf->rect;
float *rctf= ibuf->rect_float;
const float sat= seq->sat;
float hsv[3];
@@ -1602,32 +1665,29 @@ static ImBuf * input_preprocess(
}
- if(ibuf->x != seqrectx || ibuf->y != seqrecty ) {
- if(scene->r.mode & R_OSA) {
- IMB_scaleImBuf(ibuf,
- (short)seqrectx, (short)seqrecty);
+ if(ibuf->x != context.rectx || ibuf->y != context.recty ) {
+ if(context.scene->r.mode & R_OSA) {
+ IMB_scaleImBuf(ibuf, (short)context.rectx, (short)context.recty);
} else {
- IMB_scalefastImBuf(ibuf,
- (short)seqrectx, (short)seqrecty);
+ IMB_scalefastImBuf(ibuf, (short)context.rectx, (short)context.recty);
}
}
return ibuf;
}
-static ImBuf * copy_from_ibuf_still(Sequence * seq, float nr,
- int seqrectx, int seqrecty)
+static ImBuf * copy_from_ibuf_still(SeqRenderData context, Sequence * seq,
+ float nr)
{
ImBuf * rval = 0;
ImBuf * ibuf = 0;
if (nr == 0) {
ibuf = seq_stripelem_cache_get(
- seq, seqrectx, seqrecty, seq->start,
+ context, seq, seq->start,
SEQ_STRIPELEM_IBUF_STARTSTILL);
- }
- if (nr == seq->len - 1) {
+ } else if (nr == seq->len - 1) {
ibuf = seq_stripelem_cache_get(
- seq, seqrectx, seqrecty, seq->start,
+ context, seq, seq->start,
SEQ_STRIPELEM_IBUF_ENDSTILL);
}
@@ -1639,18 +1699,19 @@ static ImBuf * copy_from_ibuf_still(Sequence * seq, float nr,
return rval;
}
-static void copy_to_ibuf_still(Sequence * seq, float nr,
+static void copy_to_ibuf_still(SeqRenderData context, Sequence * seq, float nr,
ImBuf * ibuf)
{
if (nr == 0) {
seq_stripelem_cache_put(
- seq, 0, 0, seq->start,
- SEQ_STRIPELEM_IBUF_STARTSTILL, ibuf);
- }
+ context, seq, seq->start,
+ SEQ_STRIPELEM_IBUF_STARTSTILL, IMB_dupImBuf(ibuf));
+ }
+
if (nr == seq->len - 1) {
seq_stripelem_cache_put(
- seq, 0, 0, seq->start,
- SEQ_STRIPELEM_IBUF_ENDSTILL, ibuf);
+ context, seq, seq->start,
+ SEQ_STRIPELEM_IBUF_ENDSTILL, IMB_dupImBuf(ibuf));
}
}
@@ -1658,45 +1719,46 @@ static void copy_to_ibuf_still(Sequence * seq, float nr,
strip rendering functions
********************************************************************** */
-static ImBuf* seq_render_strip_stack(
- Main *bmain, Scene *scene,
- ListBase *seqbasep, float cfra, int chanshown, int render_size,
- int seqrectx, int seqrecty);
+static ImBuf* seq_render_strip_stack(
+ SeqRenderData context, ListBase *seqbasep, float cfra, int chanshown);
-static ImBuf * seq_render_strip(Main *bmain, Scene *scene, Sequence * seq, float cfra,
- int render_size,
- int seqrectx, int seqrecty);
+static ImBuf * seq_render_strip(
+ SeqRenderData context, Sequence * seq, float cfra);
static ImBuf* seq_render_effect_strip_impl(
- Main *bmain, Scene *scene, float cfra, Sequence *seq, int render_size,
- int seqrectx, int seqrecty)
+ SeqRenderData context, Sequence *seq, float cfra)
{
float fac, facf;
int early_out;
int i;
- int must_preprocess = FALSE;
-
struct SeqEffectHandle sh = get_sequence_effect(seq);
FCurve *fcu= NULL;
ImBuf * ibuf[3];
- ImBuf * out = 0;
+ Sequence *input[3];
+ ImBuf * out = NULL;
+
+ ibuf[0] = ibuf[1] = ibuf[2] = NULL;
- ibuf[0] = ibuf[1] = ibuf[2] = 0;
+ input[0] = seq->seq1; input[1] = seq->seq2; input[2] = seq->seq3;
if (!sh.execute) { /* effect not supported in this version... */
- goto finish;
+ out = IMB_allocImBuf((short)context.rectx,
+ (short)context.recty, 32, IB_rect);
+ return out;
}
- if ((seq->flag & SEQ_USE_EFFECT_DEFAULT_FADE) != 0) {
+ if (seq->flag & SEQ_USE_EFFECT_DEFAULT_FADE) {
sh.get_default_fac(seq, cfra, &fac, &facf);
- if( scene->r.mode & R_FIELDS ); else facf= fac;
- } else {
- fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence,
- "effect_fader", 0);
+
+ if ((context.scene->r.mode & R_FIELDS)==0)
+ facf= fac;
+ }
+ else {
+ fcu = id_data_find_fcurve(&context.scene->id, seq, &RNA_Sequence, "effect_fader", 0);
if (fcu) {
fac = facf = evaluate_fcurve(fcu, cfra);
- if( scene->r.mode & R_FIELDS ) {
+ if( context.scene->r.mode & R_FIELDS ) {
facf = evaluate_fcurve(fcu, cfra + 0.5);
}
} else {
@@ -1706,88 +1768,57 @@ static ImBuf* seq_render_effect_strip_impl(
early_out = sh.early_out(seq, fac, facf);
- if (early_out == -1) { /* no input needed */
- out = sh.execute(bmain, scene, seq, cfra, fac, facf,
- seqrectx, seqrecty, render_size,
- 0, 0, 0);
- goto finish;
- }
-
-
- must_preprocess = input_have_to_preprocess(
- scene, seq, cfra, seqrectx, seqrecty);
-
switch (early_out) {
- case 0:
+ case EARLY_NO_INPUT:
+ out = sh.execute(context, seq, cfra, fac, facf,
+ NULL, NULL, NULL);
break;
- case 1:
- if (seq->seq1) {
- ibuf[0] = seq_render_strip(bmain, scene, seq->seq1, cfra,
- render_size,
- seqrectx, seqrecty);
+ case EARLY_DO_EFFECT:
+ for(i=0; i<3; i++) {
+ if(input[i])
+ ibuf[i] = seq_render_strip(
+ context, input[i], cfra);
+ }
+
+ if (ibuf[0] && ibuf[1]) {
+ out = sh.execute(context, seq, cfra, fac, facf,
+ ibuf[0], ibuf[1], ibuf[2]);
+ }
+ break;
+ case EARLY_USE_INPUT_1:
+ if (input[0]) {
+ ibuf[0] = seq_render_strip(context, input[0], cfra);
}
if (ibuf[0]) {
- if (must_preprocess) {
+ if (input_have_to_preprocess(context, seq, cfra)) {
out = IMB_dupImBuf(ibuf[0]);
} else {
out = ibuf[0];
IMB_refImBuf(out);
}
}
- goto finish;
- case 2:
- if (seq->seq2) {
- ibuf[1] = seq_render_strip(bmain, scene, seq->seq2, cfra,
- render_size,
- seqrectx, seqrecty);
+ break;
+ case EARLY_USE_INPUT_2:
+ if (input[1]) {
+ ibuf[1] = seq_render_strip(context, input[1], cfra);
}
if (ibuf[1]) {
- if (must_preprocess) {
+ if (input_have_to_preprocess(context, seq, cfra)) {
out = IMB_dupImBuf(ibuf[1]);
} else {
out = ibuf[1];
IMB_refImBuf(out);
}
}
- goto finish;
- default:
- goto finish;
- }
-
- if (seq->seq1) {
- ibuf[0] = seq_render_strip(bmain, scene, seq->seq1, cfra,
- render_size,
- seqrectx, seqrecty);
- }
-
- if (seq->seq2) {
- ibuf[1] = seq_render_strip(bmain, scene, seq->seq2, cfra,
- render_size,
- seqrectx, seqrecty);
- }
-
- if (seq->seq3) {
- ibuf[2] = seq_render_strip(bmain, scene, seq->seq3, cfra,
- render_size,
- seqrectx, seqrecty);
- }
-
- if (!ibuf[0] || !ibuf[1]) {
- goto finish;
+ break;
}
- out = sh.execute(bmain, scene, seq, cfra, fac, facf, seqrectx, seqrecty,
- render_size,
- ibuf[0], ibuf[1], ibuf[2]);
-
-finish:
for (i = 0; i < 3; i++) {
IMB_freeImBuf(ibuf[i]);
}
- if (!out) {
- out = IMB_allocImBuf(
- (short)seqrectx, (short)seqrecty, 32, IB_rect, 0);
+ if (out == NULL) {
+ out = IMB_allocImBuf((short)context.rectx, (short)context.recty, 32, IB_rect);
}
return out;
@@ -1795,7 +1826,7 @@ finish:
static ImBuf * seq_render_scene_strip_impl(
- Main *bmain, Scene * scene, Sequence * seq, float nr, int seqrectx, int seqrecty)
+ SeqRenderData context, Sequence * seq, float nr)
{
ImBuf * ibuf = 0;
float frame= seq->sfra + nr + seq->anim_startofs;
@@ -1803,7 +1834,8 @@ static ImBuf * seq_render_scene_strip_impl(
Object *oldcamera;
ListBase oldmarkers;
- /* Hack! This function can be called from do_render_seq(), in that case
+ /* Old info:
+ Hack! This function can be called from do_render_seq(), in that case
the seq->scene can already have a Render initialized with same name,
so we have to use a default name. (compositor uses scene name to
find render).
@@ -1815,9 +1847,27 @@ static ImBuf * seq_render_scene_strip_impl(
and since G.rendering is uhm, gone... (Peter)
*/
+ /* New info:
+ Using the same name for the renders works just fine as the do_render_seq()
+ render is not used while the scene strips are rendered.
+
+ However rendering from UI (through sequencer_preview_area_draw) can crash in
+ very many cases since other renders (material preview, an actual render etc.)
+ can be started while this sequence preview render is running. The only proper
+ solution is to make the sequencer preview render a proper job, which can be
+ stopped when needed. This would also give a nice progress bar for the preview
+ space so that users know there's something happening.
+
+ As a result the active scene now only uses OpenGL rendering for the sequencer
+ preview. This is far from nice, but is the only way to prevent crashes at this
+ time.
+
+ -jahka
+ */
+
int rendering = G.rendering;
int doseq;
- int doseq_gl= G.rendering ? /*(scene->r.seq_flag & R_SEQ_GL_REND)*/ 0 : (scene->r.seq_flag & R_SEQ_GL_PREV);
+ int doseq_gl= G.rendering ? /*(scene->r.seq_flag & R_SEQ_GL_REND)*/ 0 : /*(scene->r.seq_flag & R_SEQ_GL_PREV)*/ 1;
int have_seq= FALSE;
Scene *sce= seq->scene; /* dont refer to seq->scene above this point!, it can be NULL */
int sce_valid= FALSE;
@@ -1834,8 +1884,8 @@ static ImBuf * seq_render_scene_strip_impl(
oldcamera= seq->scene->camera;
/* prevent eternal loop */
- doseq= scene->r.scemode & R_DOSEQ;
- scene->r.scemode &= ~R_DOSEQ;
+ doseq= context.scene->r.scemode & R_DOSEQ;
+ context.scene->r.scemode &= ~R_DOSEQ;
seq->scene->r.cfra= frame;
if(seq->scene_camera)
@@ -1849,27 +1899,34 @@ static ImBuf * seq_render_scene_strip_impl(
seq->scene->markers.first= seq->scene->markers.last= NULL;
#endif
- if(sequencer_view3d_cb && BLI_thread_is_main() && doseq_gl && (seq->scene == scene || have_seq==0) && seq->scene->camera) {
+ if(sequencer_view3d_cb && BLI_thread_is_main() && doseq_gl && (seq->scene == context.scene || have_seq==0) && seq->scene->camera) {
+ /* for old scened this can be uninitialized, should probably be added to do_versions at some point if the functionality stays */
+ if(context.scene->r.seq_prev_type==0)
+ context.scene->r.seq_prev_type = 3 /* ==OB_SOLID */;
+
/* opengl offscreen render */
- scene_update_for_newframe(bmain, seq->scene, seq->scene->lay);
- ibuf= sequencer_view3d_cb(seq->scene, seqrectx, seqrecty, IB_rect,
- scene->r.seq_prev_type);
+ scene_update_for_newframe(context.bmain, seq->scene, seq->scene->lay);
+ ibuf= sequencer_view3d_cb(seq->scene, context.rectx, context.recty, IB_rect, context.scene->r.seq_prev_type);
}
else {
- Render *re;
+ Render *re = RE_GetRender(sce->id.name);
RenderResult rres;
-
- if(rendering)
- re= RE_NewRender(" do_build_seq_ibuf");
- else
- re= RE_NewRender(sce->id.name);
-
- RE_BlenderFrame(re, bmain, sce, NULL, sce->lay, frame);
+
+ /* XXX: this if can be removed when sequence preview rendering uses the job system */
+ if(rendering || context.scene != sce) {
+ if(re==NULL)
+ re= RE_NewRender(sce->id.name);
+
+ RE_BlenderFrame(re, context.bmain, sce, NULL, sce->lay, frame, FALSE);
+
+ /* restore previous state after it was toggled on & off by RE_BlenderFrame */
+ G.rendering = rendering;
+ }
RE_AcquireResultImage(re, &rres);
if(rres.rectf) {
- ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rectfloat, 0);
+ ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rectfloat);
memcpy(ibuf->rect_float, rres.rectf, 4*sizeof(float)*rres.rectx*rres.recty);
if(rres.rectz) {
addzbuffloatImBuf(ibuf);
@@ -1881,7 +1938,7 @@ static ImBuf * seq_render_scene_strip_impl(
IMB_convert_profile(ibuf, IB_PROFILE_SRGB);
}
else if (rres.rect32) {
- ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rect, 0);
+ ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rect);
memcpy(ibuf->rect, rres.rect32, 4*rres.rectx*rres.recty);
}
@@ -1891,10 +1948,12 @@ static ImBuf * seq_render_scene_strip_impl(
}
/* restore */
- scene->r.scemode |= doseq;
+ context.scene->r.scemode |= doseq;
seq->scene->r.cfra = oldcfra;
seq->scene->camera= oldcamera;
+ if(frame != oldcfra)
+ scene_update_for_newframe(context.bmain, seq->scene, seq->scene->lay);
#ifdef DURIAN_CAMERA_SWITCH
/* stooping to new low's in hackyness :( */
@@ -1904,186 +1963,152 @@ static ImBuf * seq_render_scene_strip_impl(
return ibuf;
}
-static ImBuf * seq_render_strip(Main *bmain, Scene *scene, Sequence * seq, float cfra,
- int render_size,
- int seqrectx, int seqrecty)
+static ImBuf * seq_render_strip(SeqRenderData context, Sequence * seq, float cfra)
{
+ ImBuf * ibuf = NULL;
char name[FILE_MAXDIR+FILE_MAXFILE];
- int use_preprocess = input_have_to_preprocess(
- scene, seq, cfra, seqrectx, seqrecty);
- ImBuf * ibuf = seq_stripelem_cache_get(
- seq, seqrectx, seqrecty, cfra, SEQ_STRIPELEM_IBUF);
+ int use_preprocess = input_have_to_preprocess(context, seq, cfra);
float nr = give_stripelem_index(seq, cfra);
+ /* all effects are handled similarly with the exception of speed effect */
+ int type = (seq->type & SEQ_EFFECT && seq->type != SEQ_SPEED) ? SEQ_EFFECT : seq->type;
- /* currently, we cache preprocessed images */
- if (ibuf) {
+ ibuf = seq_stripelem_cache_get(context, seq, cfra, SEQ_STRIPELEM_IBUF);
+
+ /* currently, we cache preprocessed images in SEQ_STRIPELEM_IBUF,
+ but not(!) on SEQ_STRIPELEM_IBUF_ENDSTILL and ..._STARTSTILL */
+ if (ibuf)
use_preprocess = FALSE;
- }
- if(seq->type == SEQ_META) {
- ImBuf * meta_ibuf = 0;
+ if (ibuf == NULL)
+ ibuf = copy_from_ibuf_still(context, seq, nr);
+
+ if (ibuf == NULL)
+ ibuf = seq_proxy_fetch(context, seq, cfra);
- if (ibuf == 0) {
- ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
- }
+ if(ibuf == NULL) switch(type) {
+ case SEQ_META:
+ {
+ ImBuf * meta_ibuf = NULL;
- if(!ibuf && seq->seqbase.first) {
- meta_ibuf = seq_render_strip_stack(
- bmain, scene,
- &seq->seqbase, seq->start + nr, 0,
- render_size, seqrectx, seqrecty);
- }
+ if(seq->seqbase.first)
+ meta_ibuf = seq_render_strip_stack(
+ context, &seq->seqbase,
+ seq->start + nr, 0);
- if(!ibuf && meta_ibuf) {
- ibuf = meta_ibuf;
- if(ibuf && use_preprocess) {
- struct ImBuf * i = IMB_dupImBuf(ibuf);
+ if(meta_ibuf) {
+ ibuf = meta_ibuf;
+ if(ibuf && use_preprocess) {
+ struct ImBuf * i = IMB_dupImBuf(ibuf);
- IMB_freeImBuf(ibuf);
+ IMB_freeImBuf(ibuf);
- ibuf = i;
+ ibuf = i;
+ }
}
+ break;
}
- } else if(seq->type == SEQ_SPEED) {
- ImBuf * child_ibuf = 0;
-
- if (ibuf == 0) {
- ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
- }
+ case SEQ_SPEED:
+ {
+ ImBuf * child_ibuf = NULL;
- if (ibuf == 0) {
float f_cfra;
- SpeedControlVars * s
- = (SpeedControlVars *)seq->effectdata;
+ SpeedControlVars * s = (SpeedControlVars *)seq->effectdata;
- sequence_effect_speed_rebuild_map(scene, seq, 0);
+ sequence_effect_speed_rebuild_map(context.scene,seq, 0);
/* weeek! */
f_cfra = seq->start + s->frameMap[(int) nr];
- child_ibuf = seq_render_strip(bmain, scene, seq->seq1, f_cfra,
- render_size,
- seqrectx, seqrecty);
- }
+ child_ibuf = seq_render_strip(context,seq->seq1,f_cfra);
- if (!ibuf && child_ibuf) {
- ibuf = child_ibuf;
- if(ibuf && use_preprocess) {
- struct ImBuf * i = IMB_dupImBuf(ibuf);
+ if (child_ibuf) {
+ ibuf = child_ibuf;
+ if(ibuf && use_preprocess) {
+ struct ImBuf * i = IMB_dupImBuf(ibuf);
- IMB_freeImBuf(ibuf);
+ IMB_freeImBuf(ibuf);
- ibuf = i;
+ ibuf = i;
+ }
}
+ break;
}
- } else if(seq->type & SEQ_EFFECT) {
- /* should the effect be recalculated? */
-
- if (ibuf == 0) {
- ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
- }
-
- if(ibuf == 0) {
- ibuf = seq_render_effect_strip_impl(
- bmain, scene, cfra, seq, render_size,
- seqrectx, seqrecty);
+ case SEQ_EFFECT:
+ {
+ ibuf = seq_render_effect_strip_impl(context, seq, cfra);
+ break;
}
- } else if(seq->type == SEQ_IMAGE) {
- StripElem * s_elem = give_stripelem(seq, cfra);
+ case SEQ_IMAGE:
+ {
+ StripElem * s_elem = give_stripelem(seq, cfra);
- if(ibuf == 0 && s_elem) {
- BLI_join_dirfile(name, seq->strip->dir, s_elem->name);
- BLI_path_abs(name, G.sce);
-
- ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
- }
+ if (s_elem) {
+ BLI_join_dirfile(name, seq->strip->dir, s_elem->name);
+ BLI_path_abs(name, G.main->name);
+ }
- if (ibuf == 0) {
- ibuf = copy_from_ibuf_still(seq,nr,seqrectx,seqrecty);
- }
+ if (s_elem && (ibuf = IMB_loadiffname(name, IB_rect))) {
+ /* we don't need both (speed reasons)! */
+ if (ibuf->rect_float && ibuf->rect)
+ imb_freerectImBuf(ibuf);
- if (ibuf == 0 && s_elem &&
- (ibuf = IMB_loadiffname(name, IB_rect))) {
- /* we don't need both (speed reasons)! */
- if (ibuf->rect_float && ibuf->rect)
- imb_freerectImBuf(ibuf);
+ /* all sequencer color is done in SRGB space, linear gives odd crossfades */
+ if(ibuf->profile == IB_PROFILE_LINEAR_RGB)
+ IMB_convert_profile(ibuf, IB_PROFILE_NONE);
- /* all sequencer color is done in SRGB space, linear gives odd crossfades */
- if(ibuf->profile == IB_PROFILE_LINEAR_RGB)
- IMB_convert_profile(ibuf, IB_PROFILE_NONE);
+ copy_to_ibuf_still(context, seq, nr, ibuf);
- copy_to_ibuf_still(seq, nr, ibuf);
- }
- } else if(seq->type == SEQ_MOVIE) {
- if(ibuf == 0) {
- ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
-
- }
-
- if (ibuf == 0) {
- ibuf = copy_from_ibuf_still(seq, nr,seqrectx,seqrecty);
+ s_elem->orig_width = ibuf->x;
+ s_elem->orig_height = ibuf->y;
+ }
+ break;
}
-
- if (ibuf == 0) {
+ case SEQ_MOVIE:
+ {
if(seq->anim==0) {
- BLI_join_dirfile(name,
- seq->strip->dir,
- seq->strip->stripdata->name);
- BLI_path_abs(name, G.sce);
+ BLI_join_dirfile(name, seq->strip->dir, seq->strip->stripdata->name);
+ BLI_path_abs(name, G.main->name);
- seq->anim = openanim(
- name, IB_rect |
- ((seq->flag & SEQ_FILTERY)
- ? IB_animdeinterlace : 0));
+ seq->anim = openanim(name, IB_rect |
+ ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0));
}
+
if(seq->anim) {
- IMB_anim_set_preseek(seq->anim,
- seq->anim_preseek);
- ibuf = IMB_anim_absolute(seq->anim,
- nr
- + seq->anim_startofs);
+ IMB_anim_set_preseek(seq->anim, seq->anim_preseek);
+ ibuf = IMB_anim_absolute(seq->anim, nr + seq->anim_startofs);
/* we don't need both (speed reasons)! */
- if (ibuf && ibuf->rect_float
- && ibuf->rect) {
+ if (ibuf && ibuf->rect_float && ibuf->rect)
imb_freerectImBuf(ibuf);
+ if (ibuf) {
+ seq->strip->stripdata->orig_width = ibuf->x;
+ seq->strip->stripdata->orig_height = ibuf->y;
}
-
}
- copy_to_ibuf_still(seq, nr, ibuf);
- }
-
- } else if(seq->type == SEQ_SCENE) { // scene can be NULL after deletions
- if (ibuf == 0) {
- ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
- }
- if (ibuf == 0) {
- ibuf = copy_from_ibuf_still(seq, nr,seqrectx,seqrecty);
+ copy_to_ibuf_still(context, seq, nr, ibuf);
+ break;
}
-
- if (ibuf == 0) {
- ibuf = seq_render_scene_strip_impl(bmain, scene, seq, nr,
- seqrectx, seqrecty);
+ case SEQ_SCENE:
+ { // scene can be NULL after deletions
+ ibuf = seq_render_scene_strip_impl(context, seq, nr);
+
+ /* Scene strips update all animation, so we need to restore original state.*/
+ BKE_animsys_evaluate_all_animation(context.bmain, cfra);
- copy_to_ibuf_still(seq, nr, ibuf);
+ copy_to_ibuf_still(context, seq, nr, ibuf);
+ break;
}
}
- if (!ibuf) {
- ibuf = IMB_allocImBuf(
- (short)seqrectx, (short)seqrecty, 32, IB_rect, 0);
- }
+ if (ibuf == NULL)
+ ibuf = IMB_allocImBuf((short)context.rectx, (short)context.recty, 32, IB_rect);
- if (ibuf->x != seqrectx || ibuf->y != seqrecty) {
+ if (ibuf->x != context.rectx || ibuf->y != context.recty)
use_preprocess = TRUE;
- }
- if (use_preprocess) {
- ibuf = input_preprocess(scene, seq, cfra, seqrectx,
- seqrecty, ibuf);
- }
+ if (use_preprocess)
+ ibuf = input_preprocess(context, seq, cfra, ibuf);
- seq_stripelem_cache_put(
- seq, seqrectx, seqrecty, cfra, SEQ_STRIPELEM_IBUF, ibuf);
+ seq_stripelem_cache_put(context, seq, cfra, SEQ_STRIPELEM_IBUF, ibuf);
return ibuf;
}
@@ -2099,9 +2124,7 @@ static int seq_must_swap_input_in_blend_mode(Sequence * seq)
/* bad hack, to fix crazy input ordering of
those two effects */
- if (seq->blend_mode == SEQ_ALPHAOVER ||
- seq->blend_mode == SEQ_ALPHAUNDER ||
- seq->blend_mode == SEQ_OVERDROP) {
+ if (ELEM3(seq->blend_mode, SEQ_ALPHAOVER, SEQ_ALPHAUNDER, SEQ_OVERDROP)) {
swap_input = TRUE;
}
@@ -2114,34 +2137,32 @@ static int seq_get_early_out_for_blend_mode(Sequence * seq)
float facf = seq->blend_opacity / 100.0;
int early_out = sh.early_out(seq, facf, facf);
- if (early_out < 1) {
+ if (ELEM(early_out, EARLY_DO_EFFECT, EARLY_NO_INPUT)) {
return early_out;
}
if (seq_must_swap_input_in_blend_mode(seq)) {
- if (early_out == 2) {
- return 1;
- } else if (early_out == 1) {
- return 2;
+ if (early_out == EARLY_USE_INPUT_2) {
+ return EARLY_USE_INPUT_1;
+ } else if (early_out == EARLY_USE_INPUT_1) {
+ return EARLY_USE_INPUT_2;
}
}
return early_out;
}
static ImBuf* seq_render_strip_stack(
- Main *bmain, Scene *scene, ListBase *seqbasep, float cfra, int chanshown,
- int render_size, int seqrectx, int seqrecty)
+ SeqRenderData context, ListBase *seqbasep, float cfra, int chanshown)
{
Sequence* seq_arr[MAXSEQ+1];
int count;
int i;
- ImBuf* out = 0;
+ ImBuf* out = NULL;
- count = get_shown_sequences(seqbasep, cfra, chanshown,
- (Sequence **)&seq_arr);
+ count = get_shown_sequences(seqbasep, cfra, chanshown, (Sequence **)&seq_arr);
- if (!count) {
- return 0;
+ if (count == 0) {
+ return NULL;
}
#if 0 /* commentind since this breaks keyframing, since it resets the value on draw */
@@ -2152,22 +2173,17 @@ static ImBuf* seq_render_strip_stack(
}
#endif
- out = seq_stripelem_cache_get(
- seq_arr[count - 1],
- seqrectx, seqrecty, cfra, SEQ_STRIPELEM_IBUF_COMP);
+ out = seq_stripelem_cache_get(context, seq_arr[count - 1],
+ cfra, SEQ_STRIPELEM_IBUF_COMP);
if (out) {
return out;
}
if(count == 1) {
- out = seq_render_strip(bmain, scene, seq_arr[0],
- cfra, render_size,
- seqrectx, seqrecty);
- seq_stripelem_cache_put(
- seq_arr[0],
- seqrectx, seqrecty, cfra,
- SEQ_STRIPELEM_IBUF_COMP, out);
+ out = seq_render_strip(context, seq_arr[0], cfra);
+ seq_stripelem_cache_put(context, seq_arr[0], cfra,
+ SEQ_STRIPELEM_IBUF_COMP, out);
return out;
}
@@ -2175,43 +2191,34 @@ static ImBuf* seq_render_strip_stack(
for (i = count - 1; i >= 0; i--) {
int early_out;
- Sequence * seq = seq_arr[i];
+ Sequence *seq = seq_arr[i];
out = seq_stripelem_cache_get(
- seq,
- seqrectx, seqrecty, cfra, SEQ_STRIPELEM_IBUF_COMP);
+ context, seq, cfra, SEQ_STRIPELEM_IBUF_COMP);
if (out) {
break;
}
if (seq->blend_mode == SEQ_BLEND_REPLACE) {
- out = seq_render_strip(bmain, scene, seq, cfra,
- render_size,
- seqrectx, seqrecty);
+ out = seq_render_strip(context, seq, cfra);
break;
}
early_out = seq_get_early_out_for_blend_mode(seq);
switch (early_out) {
- case -1:
- case 2:
- out = seq_render_strip(bmain, scene, seq, cfra,
- render_size,
- seqrectx, seqrecty);
+ case EARLY_NO_INPUT:
+ case EARLY_USE_INPUT_2:
+ out = seq_render_strip(context, seq, cfra);
break;
- case 1:
+ case EARLY_USE_INPUT_1:
if (i == 0) {
- out = IMB_allocImBuf(
- (short)seqrectx, (short)seqrecty,
- 32, IB_rect, 0);
+ out = IMB_allocImBuf((short)context.rectx, (short)context.recty, 32, IB_rect);
}
break;
- case 0:
+ case EARLY_DO_EFFECT:
if (i == 0) {
- out = seq_render_strip(bmain, scene, seq, cfra,
- render_size,
- seqrectx, seqrecty);
+ out = seq_render_strip(context, seq, cfra);
}
break;
@@ -2221,9 +2228,8 @@ static ImBuf* seq_render_strip_stack(
}
}
- seq_stripelem_cache_put(
- seq_arr[i], seqrectx, seqrecty, cfra,
- SEQ_STRIPELEM_IBUF_COMP, out);
+ seq_stripelem_cache_put(context, seq_arr[i], cfra,
+ SEQ_STRIPELEM_IBUF_COMP, out);
i++;
@@ -2231,27 +2237,21 @@ static ImBuf* seq_render_strip_stack(
for (; i < count; i++) {
Sequence * seq = seq_arr[i];
- if (seq_get_early_out_for_blend_mode(seq) == 0) {
+ if (seq_get_early_out_for_blend_mode(seq) == EARLY_DO_EFFECT) {
struct SeqEffectHandle sh = get_sequence_blend(seq);
ImBuf * ibuf1 = out;
- ImBuf * ibuf2 = seq_render_strip(bmain, scene, seq, cfra,
- render_size,
- seqrectx, seqrecty);
+ ImBuf * ibuf2 = seq_render_strip(context, seq, cfra);
float facf = seq->blend_opacity / 100.0;
- int swap_input
- = seq_must_swap_input_in_blend_mode(seq);
-
- int x= seqrectx;
- int y= seqrecty;
+ int swap_input = seq_must_swap_input_in_blend_mode(seq);
if (swap_input) {
- out = sh.execute(bmain, scene, seq, cfra,
- facf, facf, x, y, render_size,
+ out = sh.execute(context, seq, cfra,
+ facf, facf,
ibuf2, ibuf1, 0);
} else {
- out = sh.execute(bmain, scene, seq, cfra,
- facf, facf, x, y, render_size,
+ out = sh.execute(context, seq, cfra,
+ facf, facf,
ibuf1, ibuf2, 0);
}
@@ -2259,9 +2259,8 @@ static ImBuf* seq_render_strip_stack(
IMB_freeImBuf(ibuf2);
}
- seq_stripelem_cache_put(
- seq_arr[i], seqrectx, seqrecty, cfra,
- SEQ_STRIPELEM_IBUF_COMP, out);
+ seq_stripelem_cache_put(context, seq_arr[i], cfra,
+ SEQ_STRIPELEM_IBUF_COMP, out);
}
return out;
@@ -2272,9 +2271,9 @@ static ImBuf* seq_render_strip_stack(
* you have to free after usage!
*/
-ImBuf *give_ibuf_seq(Main *bmain, Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size)
+ImBuf *give_ibuf_seq(SeqRenderData context, float cfra, int chanshown)
{
- Editing *ed= seq_give_editing(scene, FALSE);
+ Editing *ed= seq_give_editing(context.scene, FALSE);
int count;
ListBase *seqbasep;
@@ -2288,19 +2287,18 @@ ImBuf *give_ibuf_seq(Main *bmain, Scene *scene, int rectx, int recty, int cfra,
seqbasep= ed->seqbasep;
}
- return seq_render_strip_stack(
- bmain, scene, seqbasep, cfra, chanshown, render_size, rectx, recty);
+ return seq_render_strip_stack(context, seqbasep, cfra, chanshown);
}
-ImBuf *give_ibuf_seqbase(Main *bmain, Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size, ListBase *seqbasep)
+ImBuf *give_ibuf_seqbase(SeqRenderData context, float cfra, int chanshown, ListBase *seqbasep)
{
- return seq_render_strip_stack(bmain, scene, seqbasep, cfra, chanshown, render_size, rectx, recty);
+ return seq_render_strip_stack(context, seqbasep, cfra, chanshown);
}
-ImBuf *give_ibuf_seq_direct(Main *bmain, Scene *scene, int rectx, int recty, int cfra, int render_size, Sequence *seq)
+ImBuf *give_ibuf_seq_direct(SeqRenderData context, float cfra, Sequence *seq)
{
- return seq_render_strip(bmain, scene, seq, cfra, render_size, rectx, recty);
+ return seq_render_strip(context, seq, cfra);
}
#if 0
@@ -2350,9 +2348,9 @@ typedef struct PrefetchQueueElem {
int rectx;
int recty;
- int cfra;
+ float cfra;
int chanshown;
- int render_size;
+ int preview_render_size;
int monoton_cfra;
@@ -2400,7 +2398,7 @@ static void *seq_prefetch_thread(void * This_)
if (e->cfra >= s_last) {
e->ibuf = give_ibuf_seq_impl(This->scene,
e->rectx, e->recty, e->cfra, e->chanshown,
- e->render_size);
+ e->preview_render_size);
}
pthread_mutex_lock(&queue_lock);
@@ -2510,8 +2508,7 @@ static void seq_stop_threads()
}
#endif
-void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown,
- int render_size)
+void give_ibuf_prefetch_request(SeqRenderData context, float cfra, int chanshown)
{
PrefetchQueueElem *e;
if (seq_thread_shutdown) {
@@ -2519,11 +2516,11 @@ void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown,
}
e = MEM_callocN(sizeof(PrefetchQueueElem), "prefetch_queue_elem");
- e->rectx = rectx;
- e->recty = recty;
+ e->rectx = context.rectx;
+ e->recty = context.recty;
e->cfra = cfra;
e->chanshown = chanshown;
- e->render_size = render_size;
+ e->preview_render_size = context.preview_render_size;
e->monoton_cfra = monoton_cfra++;
pthread_mutex_lock(&queue_lock);
@@ -2566,13 +2563,13 @@ static void seq_wait_for_prefetch_ready()
}
#endif
-ImBuf *give_ibuf_seq_threaded(Main *bmain, Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size)
+ImBuf *give_ibuf_seq_threaded(SeqRenderData context, float cfra, int chanshown)
{
PrefetchQueueElem *e = NULL;
int found_something = FALSE;
if (seq_thread_shutdown) {
- return give_ibuf_seq(bmain, scene, rectx, recty, cfra, chanshown, render_size);
+ return give_ibuf_seq(context, cfra, chanshown);
}
while (!e) {
@@ -2582,9 +2579,9 @@ ImBuf *give_ibuf_seq_threaded(Main *bmain, Scene *scene, int rectx, int recty, i
for (e = prefetch_done.first; e; e = e->next) {
if (cfra == e->cfra &&
chanshown == e->chanshown &&
- rectx == e->rectx &&
- recty == e->recty &&
- render_size == e->render_size) {
+ context.rectx == e->rectx &&
+ context.recty == e->recty &&
+ context.preview_render_size == e->preview_render_size) {
success = TRUE;
found_something = TRUE;
break;
@@ -2595,9 +2592,9 @@ ImBuf *give_ibuf_seq_threaded(Main *bmain, Scene *scene, int rectx, int recty, i
for (e = prefetch_wait.first; e; e = e->next) {
if (cfra == e->cfra &&
chanshown == e->chanshown &&
- rectx == e->rectx &&
- recty == e->recty &&
- render_size == e->render_size) {
+ context.rectx == e->rectx &&
+ context.recty == e->recty &&
+ context.preview_render_size == e->preview_render_size) {
found_something = TRUE;
break;
}
@@ -2612,9 +2609,9 @@ ImBuf *give_ibuf_seq_threaded(Main *bmain, Scene *scene, int rectx, int recty, i
if (tslot->current &&
cfra == tslot->current->cfra &&
chanshown == tslot->current->chanshown &&
- rectx == tslot->current->rectx &&
- recty == tslot->current->recty &&
- render_size== tslot->current->render_size){
+ context.rectx == tslot->current->rectx &&
+ context.recty == tslot->current->recty &&
+ context.preview_render_size== tslot->current->preview_render_size){
found_something = TRUE;
break;
}
@@ -2697,8 +2694,7 @@ void free_imbuf_seq(Scene *scene, ListBase * seqbase, int check_mem_usage,
}
}
if(seq->type==SEQ_META) {
- free_imbuf_seq(scene, &seq->seqbase, FALSE,
- keep_file_handles);
+ free_imbuf_seq(scene, &seq->seqbase, FALSE, keep_file_handles);
}
if(seq->type==SEQ_SCENE) {
/* FIXME: recurs downwards,
@@ -2822,11 +2818,7 @@ void seq_tx_set_final_right(Sequence *seq, int val)
since they work a bit differently to normal image seq's (during transform) */
int seq_single_check(Sequence *seq)
{
- if ( seq->len==1 && (seq->type == SEQ_IMAGE || seq->type == SEQ_COLOR
- || seq->type == SEQ_MULTICAM))
- return 1;
- else
- return 0;
+ return (seq->len==1 && ELEM3(seq->type, SEQ_IMAGE, SEQ_COLOR, SEQ_MULTICAM));
}
/* check if the selected seq's reference unselected seq's */
@@ -2848,17 +2840,20 @@ int seqbase_isolated_sel_check(ListBase *seqbase)
/* test relationships */
for(seq= seqbase->first; seq; seq= seq->next) {
+ if((seq->type & SEQ_EFFECT)==0)
+ continue;
+
if(seq->flag & SELECT) {
- if(seq->type & SEQ_EFFECT) {
- if(seq->seq1 && (seq->seq1->flag & SELECT)==0) return FALSE;
- if(seq->seq2 && (seq->seq2->flag & SELECT)==0) return FALSE;
- if(seq->seq3 && (seq->seq3->flag & SELECT)==0) return FALSE;
- }
+ if( (seq->seq1 && (seq->seq1->flag & SELECT)==0) ||
+ (seq->seq2 && (seq->seq2->flag & SELECT)==0) ||
+ (seq->seq3 && (seq->seq3->flag & SELECT)==0) )
+ return FALSE;
}
- else if(seq->type & SEQ_EFFECT) {
- if(seq->seq1 && (seq->seq1->flag & SELECT)) return FALSE;
- if(seq->seq2 && (seq->seq2->flag & SELECT)) return FALSE;
- if(seq->seq3 && (seq->seq3->flag & SELECT)) return FALSE;
+ else {
+ if( (seq->seq1 && (seq->seq1->flag & SELECT)) ||
+ (seq->seq2 && (seq->seq2->flag & SELECT)) ||
+ (seq->seq3 && (seq->seq3->flag & SELECT)) )
+ return FALSE;
}
}
@@ -2935,12 +2930,8 @@ int seq_tx_test(Sequence * seq)
static int seq_overlap(Sequence *seq1, Sequence *seq2)
{
- if(seq1 != seq2)
- if(seq1->machine==seq2->machine)
- if(((seq1->enddisp <= seq2->startdisp) || (seq1->startdisp >= seq2->enddisp))==0)
- return 1;
-
- return 0;
+ return (seq1 != seq2 && seq1->machine == seq2->machine &&
+ ((seq1->enddisp <= seq2->startdisp) || (seq1->startdisp >= seq2->enddisp))==0);
}
int seq_test_overlap(ListBase * seqbasep, Sequence *test)
@@ -2958,7 +2949,7 @@ int seq_test_overlap(ListBase * seqbasep, Sequence *test)
}
-static void seq_translate(Scene *evil_scene, Sequence *seq, int delta)
+void seq_translate(Scene *evil_scene, Sequence *seq, int delta)
{
seq_offset_animdata(evil_scene, seq, delta);
seq->start += delta;
@@ -3107,7 +3098,7 @@ static void seq_update_muting_recursive(Scene *scene, ListBase *seqbasep, Sequen
seq_update_muting_recursive(scene, &seq->seqbase, metaseq, seqmute);
}
- else if((seq->type == SEQ_SOUND) || (seq->type == SEQ_SCENE)) {
+ else if(ELEM(seq->type, SEQ_SOUND, SEQ_SCENE)) {
if(seq->scene_sound) {
sound_mute_scene_sound(scene, seq->scene_sound, seqmute);
}
@@ -3210,7 +3201,7 @@ void seq_offset_animdata(Scene *scene, Sequence *seq, int ofs)
for (fcu= scene->adt->action->curves.first; fcu; fcu= fcu->next) {
if(strstr(fcu->rna_path, "sequence_editor.sequences_all[") && strstr(fcu->rna_path, str)) {
- int i;
+ unsigned int i;
for (i = 0; i < fcu->totvert; i++) {
BezTriple *bezt= &fcu->bezt[i];
bezt->vec[0][0] += ofs;
@@ -3247,7 +3238,7 @@ void seq_dupe_animdata(Scene *scene, char *name_from, char *name_to)
BKE_animdata_fix_paths_rename(&scene->id, scene->adt, "sequence_editor.sequences_all", name_from, name_to, 0, 0, 0);
/* add the original fcurves back */
- addlisttolist(&scene->adt->action->curves, &lb);
+ BLI_movelisttolist(&scene->adt->action->curves, &lb);
}
/* XXX - hackish function needed to remove all fcurves belonging to a sequencer strip */
@@ -3395,7 +3386,6 @@ Sequence *sequencer_add_image_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo
Scene *scene= CTX_data_scene(C); /* only for active seq */
Sequence *seq;
Strip *strip;
- StripElem *se;
seq = alloc_sequence(seqbasep, seq_load->start_frame, seq_load->channel);
seq->type= SEQ_IMAGE;
@@ -3406,7 +3396,7 @@ Sequence *sequencer_add_image_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo
strip->len = seq->len = seq_load->len ? seq_load->len : 1;
strip->us= 1;
- strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
+ strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
BLI_strncpy(strip->dir, seq_load->path, sizeof(strip->dir));
seq_load_apply(scene, seq, seq_load);
@@ -3476,14 +3466,14 @@ Sequence *sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo
Scene *scene= CTX_data_scene(C); /* only for sound */
char path[sizeof(seq_load->path)];
- Sequence *seq, *soundseq; /* generic strip vars */
+ Sequence *seq; /* generic strip vars */
Strip *strip;
StripElem *se;
struct anim *an;
BLI_strncpy(path, seq_load->path, sizeof(path));
- BLI_path_abs(path, G.sce);
+ BLI_path_abs(path, G.main->name);
an = openanim(path, IB_rect);
@@ -3515,7 +3505,7 @@ Sequence *sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo
int start_frame_back= seq_load->start_frame;
seq_load->channel++;
- soundseq = sequencer_add_sound_strip(C, seqbasep, seq_load);
+ sequencer_add_sound_strip(C, seqbasep, seq_load);
seq_load->start_frame= start_frame_back;
seq_load->channel--;
@@ -3531,8 +3521,9 @@ Sequence *sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo
}
-static Sequence *seq_dupli(struct Scene *scene, Sequence *seq, int dupe_flag)
+static Sequence *seq_dupli(struct Scene *scene, struct Scene *scene_to, Sequence *seq, int dupe_flag)
{
+ Scene *sce_audio= scene_to ? scene_to : scene;
Sequence *seqn = MEM_dupallocN(seq);
seq->tmp = seqn;
@@ -3550,6 +3541,7 @@ static Sequence *seq_dupli(struct Scene *scene, Sequence *seq, int dupe_flag)
if (seq->strip->proxy) {
seqn->strip->proxy = MEM_dupallocN(seq->strip->proxy);
+ seqn->strip->proxy->anim = 0;
}
if (seq->strip->color_balance) {
@@ -3566,7 +3558,7 @@ static Sequence *seq_dupli(struct Scene *scene, Sequence *seq, int dupe_flag)
} else if(seq->type == SEQ_SCENE) {
seqn->strip->stripdata = 0;
if(seq->scene_sound)
- seqn->scene_sound = sound_scene_add_scene_sound(scene, seqn, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs);
+ seqn->scene_sound = sound_scene_add_scene_sound(sce_audio, seqn, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs);
} else if(seq->type == SEQ_MOVIE) {
seqn->strip->stripdata =
MEM_dupallocN(seq->strip->stripdata);
@@ -3575,7 +3567,7 @@ static Sequence *seq_dupli(struct Scene *scene, Sequence *seq, int dupe_flag)
seqn->strip->stripdata =
MEM_dupallocN(seq->strip->stripdata);
if(seq->scene_sound)
- seqn->scene_sound = sound_add_scene_sound(scene, seqn, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs);
+ seqn->scene_sound = sound_add_scene_sound(sce_audio, seqn, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs);
seqn->sound->id.us++;
} else if(seq->type == SEQ_IMAGE) {
@@ -3610,13 +3602,13 @@ static Sequence *seq_dupli(struct Scene *scene, Sequence *seq, int dupe_flag)
return seqn;
}
-Sequence * seq_dupli_recursive(struct Scene *scene, Sequence * seq, int dupe_flag)
+Sequence * seq_dupli_recursive(struct Scene *scene, struct Scene *scene_to, Sequence * seq, int dupe_flag)
{
- Sequence * seqn = seq_dupli(scene, seq, dupe_flag);
+ Sequence * seqn = seq_dupli(scene, scene_to, seq, dupe_flag);
if (seq->type == SEQ_META) {
Sequence *s;
for(s= seq->seqbase.first; s; s = s->next) {
- Sequence *n = seq_dupli_recursive(scene, s, dupe_flag);
+ Sequence *n = seq_dupli_recursive(scene, scene_to, s, dupe_flag);
if (n) {
BLI_addtail(&seqn->seqbase, n);
}
@@ -3625,7 +3617,7 @@ Sequence * seq_dupli_recursive(struct Scene *scene, Sequence * seq, int dupe_fla
return seqn;
}
-void seqbase_dupli_recursive(Scene *scene, ListBase *nseqbase, ListBase *seqbase, int dupe_flag)
+void seqbase_dupli_recursive(Scene *scene, Scene *scene_to, ListBase *nseqbase, ListBase *seqbase, int dupe_flag)
{
Sequence *seq;
Sequence *seqn = 0;
@@ -3634,7 +3626,7 @@ void seqbase_dupli_recursive(Scene *scene, ListBase *nseqbase, ListBase *seqbase
for(seq= seqbase->first; seq; seq= seq->next) {
seq->tmp= NULL;
if((seq->flag & SELECT) || (dupe_flag & SEQ_DUPE_ALL)) {
- seqn = seq_dupli(scene, seq, dupe_flag);
+ seqn = seq_dupli(scene, scene_to, seq, dupe_flag);
if (seqn) { /*should never fail */
if(dupe_flag & SEQ_DUPE_CONTEXT) {
seq->flag &= ~SEQ_ALLSEL;
@@ -3643,7 +3635,7 @@ void seqbase_dupli_recursive(Scene *scene, ListBase *nseqbase, ListBase *seqbase
BLI_addtail(nseqbase, seqn);
if(seq->type==SEQ_META)
- seqbase_dupli_recursive(scene, &seqn->seqbase, &seq->seqbase, dupe_flag);
+ seqbase_dupli_recursive(scene, scene_to, &seqn->seqbase, &seq->seqbase, dupe_flag);
if(dupe_flag & SEQ_DUPE_CONTEXT) {
if (seq == last_seq) {
diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c
index f64854f90de..48d9a4e0dee 100644
--- a/source/blender/blenkernel/intern/shrinkwrap.c
+++ b/source/blender/blenkernel/intern/shrinkwrap.c
@@ -22,7 +22,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): André Pinto
+ * Contributor(s): Andr Pinto
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -40,23 +40,19 @@
#include "DNA_mesh_types.h"
#include "DNA_scene_types.h"
+#include "BLI_editVert.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_shrinkwrap.h"
#include "BKE_DerivedMesh.h"
#include "BKE_lattice.h"
-#include "BKE_utildefines.h"
+
#include "BKE_deform.h"
#include "BKE_mesh.h"
#include "BKE_subsurf.h"
-#include "BLI_math.h"
-#include "BLI_editVert.h"
-
-
-
/* Util macros */
-#define TO_STR(a) #a
-#define JOIN(a,b) a##b
-
#define OUT_OF_MEMORY() ((void)printf("Shrinkwrap: Out of memory\n"))
/* Benchmark macros */
@@ -87,21 +83,18 @@ typedef void ( *Shrinkwrap_ForeachVertexCallback) (DerivedMesh *target, float *c
/* get derived mesh */
//TODO is anyfunction that does this? returning the derivedFinal witouth we caring if its in edit mode or not?
-DerivedMesh *object_get_derived_final(struct Scene *scene, Object *ob, CustomDataMask dataMask)
+DerivedMesh *object_get_derived_final(Object *ob)
{
Mesh *me= ob->data;
EditMesh *em = BKE_mesh_get_editmesh(me);
- if (em)
- {
- DerivedMesh *final = NULL;
- editmesh_get_derived_cage_and_final(scene, ob, em, &final, dataMask);
-
+ if(em) {
+ DerivedMesh *dm = em->derivedFinal;
BKE_mesh_end_editmesh(me, em);
- return final;
+ return dm;
}
- else
- return mesh_get_derived_final(scene, ob, dataMask);
+
+ return ob->derivedFinal;
}
/* Space transform */
@@ -287,7 +280,7 @@ int normal_projection_project_vertex(char options, const float *vert, const floa
}
-static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, struct Scene *scene)
+static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc)
{
int i;
@@ -332,7 +325,9 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, struct S
if(calc->smd->auxTarget)
{
- auxMesh = object_get_derived_final(scene, calc->smd->auxTarget, CD_MASK_BAREMESH);
+ auxMesh = object_get_derived_final(calc->smd->auxTarget);
+ if(!auxMesh)
+ return;
space_transform_setup( &local2aux, calc->ob, calc->smd->auxTarget);
}
@@ -383,29 +378,24 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, struct S
normal_projection_project_vertex(0, tmp_co, tmp_no, &local2aux, auxData.tree, &hit, auxData.raycast_callback, &auxData);
normal_projection_project_vertex(calc->smd->shrinkOpts, tmp_co, tmp_no, &calc->local2target, treeData.tree, &hit, treeData.raycast_callback, &treeData);
-
- if(hit.index != -1)
- madd_v3_v3v3fl(hit.co, hit.co, tmp_no, -calc->keepDist);
}
//Project over negative direction of axis
- if(use_normal & MOD_SHRINKWRAP_PROJECT_ALLOW_NEG_DIR)
+ if(use_normal & MOD_SHRINKWRAP_PROJECT_ALLOW_NEG_DIR && hit.index == -1)
{
- float inv_no[3] = { -tmp_no[0], -tmp_no[1], -tmp_no[2] };
-
+ float inv_no[3];
+ negate_v3_v3(inv_no, tmp_no);
if(auxData.tree)
normal_projection_project_vertex(0, tmp_co, inv_no, &local2aux, auxData.tree, &hit, auxData.raycast_callback, &auxData);
normal_projection_project_vertex(calc->smd->shrinkOpts, tmp_co, inv_no, &calc->local2target, treeData.tree, &hit, treeData.raycast_callback, &treeData);
-
- if(hit.index != -1)
- madd_v3_v3v3fl(hit.co, hit.co, tmp_no, calc->keepDist);
}
if(hit.index != -1)
{
+ madd_v3_v3v3fl(hit.co, hit.co, tmp_no, calc->keepDist);
interp_v3_v3v3(co, co, hit.co, weight);
}
}
@@ -504,7 +494,7 @@ static void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *calc)
}
/* Main shrinkwrap function */
-void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Scene *scene, Object *ob, DerivedMesh *dm, float (*vertexCos)[3], int numVerts)
+void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Object *ob, DerivedMesh *dm, float (*vertexCos)[3], int numVerts)
{
DerivedMesh *ss_mesh = NULL;
@@ -535,7 +525,7 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Scene *scene, Object
if(smd->target)
{
- calc.target = object_get_derived_final(scene, smd->target, CD_MASK_BAREMESH);
+ calc.target = object_get_derived_final(smd->target);
//TODO there might be several "bugs" on non-uniform scales matrixs
//because it will no longer be nearest surface, not sphere projection
@@ -559,8 +549,7 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Scene *scene, Object
//Using vertexs positions/normals as if a subsurface was applied
if(smd->subsurfLevels)
{
- SubsurfModifierData ssmd;
- memset(&ssmd, 0, sizeof(ssmd));
+ SubsurfModifierData ssmd= {{0}};
ssmd.subdivType = ME_CC_SUBSURF; //catmull clark
ssmd.levels = smd->subsurfLevels; //levels
@@ -593,7 +582,7 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Scene *scene, Object
break;
case MOD_SHRINKWRAP_PROJECT:
- BENCH(shrinkwrap_calc_normal_projection(&calc, scene));
+ BENCH(shrinkwrap_calc_normal_projection(&calc));
break;
case MOD_SHRINKWRAP_NEAREST_VERTEX:
diff --git a/source/blender/blenkernel/intern/sketch.c b/source/blender/blenkernel/intern/sketch.c
index 7e39cdd1196..06c6e0f197a 100644
--- a/source/blender/blenkernel/intern/sketch.c
+++ b/source/blender/blenkernel/intern/sketch.c
@@ -31,9 +31,10 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_sketch.h"
-#include "BKE_utildefines.h"
+
#include "DNA_userdef_types.h"
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index d2d8d5a6e07..8039d729842 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -48,6 +48,7 @@
#include "BLI_edgehash.h"
#include "BLI_kdtree.h"
#include "BLI_kdopbvh.h"
+#include "BLI_utildefines.h"
#include "BKE_bvhutils.h"
#include "BKE_cdderivedmesh.h"
@@ -58,7 +59,7 @@
#include "BKE_particle.h"
#include "BKE_pointcache.h"
#include "BKE_smoke.h"
-#include "BKE_utildefines.h"
+
#include "DNA_customdata_types.h"
#include "DNA_group_types.h"
@@ -94,7 +95,7 @@ static void tend ( void )
{
QueryPerformanceCounter ( &liCurrentTime );
}
-static double tval()
+static double tval( void )
{
return ((double)( (liCurrentTime.QuadPart - liStartTime.QuadPart)* (double)1000.0/(double)liFrequency.QuadPart ));
}
@@ -110,6 +111,8 @@ static void tend ( void )
{
gettimeofday ( &_tend,&tz );
}
+
+#if 0 // unused
static double tval()
{
double t1, t2;
@@ -118,6 +121,7 @@ static double tval()
return t2-t1;
}
#endif
+#endif
struct Object;
struct Scene;
@@ -177,7 +181,7 @@ int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, Derive
if(size[0] > size[1])
{
- if(size[0] > size[1])
+ if(size[0] > size[2])
{
scale = res / size[0];
smd->domain->dx = size[0] / res;
@@ -187,11 +191,11 @@ int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, Derive
}
else
{
- scale = res / size[1];
- smd->domain->dx = size[1] / res;
- smd->domain->res[1] = res;
+ scale = res / size[2];
+ smd->domain->dx = size[2] / res;
+ smd->domain->res[2] = res;
smd->domain->res[0] = (int)(size[0] * scale + 0.5);
- smd->domain->res[2] = (int)(size[2] * scale + 0.5);
+ smd->domain->res[1] = (int)(size[1] * scale + 0.5);
}
}
else
@@ -435,7 +439,7 @@ static void fill_scs_points(Object *ob, DerivedMesh *dm, SmokeCollSettings *scs)
}
/*! init triangle divisions */
-void calcTriangleDivs(Object *ob, MVert *verts, int numverts, MFace *faces, int numfaces, int numtris, int **tridivs, float cell_len)
+void calcTriangleDivs(Object *ob, MVert *verts, int UNUSED(numverts), MFace *faces, int numfaces, int numtris, int **tridivs, float cell_len)
{
// mTriangleDivs1.resize( faces.size() );
// mTriangleDivs2.resize( faces.size() );
@@ -554,8 +558,6 @@ static void smokeModifier_freeDomain(SmokeModifierData *smd)
BKE_ptcache_free_list(&(smd->domain->ptcaches[0]));
smd->domain->point_cache[0] = NULL;
- BKE_ptcache_free_list(&(smd->domain->ptcaches[1]));
- smd->domain->point_cache[1] = NULL;
MEM_freeN(smd->domain);
smd->domain = NULL;
@@ -629,9 +631,6 @@ void smokeModifier_reset(struct SmokeModifierData *smd)
smd->domain->fluid = NULL;
}
- smd->domain->point_cache[0]->flag |= PTCACHE_OUTDATED;
- smd->domain->point_cache[1]->flag |= PTCACHE_OUTDATED;
-
smokeModifier_reset_turbulence(smd);
smd->time = -1;
@@ -698,10 +697,9 @@ void smokeModifier_createType(struct SmokeModifierData *smd)
smd->domain->point_cache[0]->flag |= PTCACHE_DISK_CACHE;
smd->domain->point_cache[0]->step = 1;
- smd->domain->point_cache[1] = BKE_ptcache_add(&(smd->domain->ptcaches[1]));
- smd->domain->point_cache[1]->flag |= PTCACHE_DISK_CACHE;
- smd->domain->point_cache[1]->step = 1;
-
+ /* Deprecated */
+ smd->domain->point_cache[1] = NULL;
+ smd->domain->ptcaches[1].first = smd->domain->ptcaches[1].last = NULL;
/* set some standard values */
smd->domain->fluid = NULL;
smd->domain->wt = NULL;
@@ -779,6 +777,9 @@ void smokeModifier_copy(struct SmokeModifierData *smd, struct SmokeModifierData
tsmd->domain->viewsettings = smd->domain->viewsettings;
tsmd->domain->fluid_group = smd->domain->fluid_group;
tsmd->domain->coll_group = smd->domain->coll_group;
+ tsmd->domain->vorticity = smd->domain->vorticity;
+ tsmd->domain->time_scale = smd->domain->time_scale;
+ tsmd->domain->border_collisions = smd->domain->border_collisions;
MEM_freeN(tsmd->domain->effector_weights);
tsmd->domain->effector_weights = MEM_dupallocN(smd->domain->effector_weights);
@@ -787,6 +788,8 @@ void smokeModifier_copy(struct SmokeModifierData *smd, struct SmokeModifierData
tsmd->flow->temp = smd->flow->temp;
tsmd->flow->psys = smd->flow->psys;
tsmd->flow->type = smd->flow->type;
+ tsmd->flow->flags = smd->flow->flags;
+ tsmd->flow->vel_multi = smd->flow->vel_multi;
} else if (tsmd->coll) {
;
/* leave it as initialised, collision settings is mostly caches */
@@ -800,20 +803,25 @@ static float calc_voxel_transp(float *result, float *input, int res[3], int *pix
static int get_lamp(Scene *scene, float *light)
{
Base *base_tmp = NULL;
- for(base_tmp = scene->base.first; base_tmp; base_tmp= base_tmp->next)
- {
- if(base_tmp->object->type == OB_LAMP)
- {
- Lamp *la = (Lamp *)base_tmp->object->data;
-
- if(la->type == LA_LOCAL)
- {
- VECCOPY(light, base_tmp->object->obmat[3]);
- return 1;
- }
- }
- }
- return 0;
+ int found_lamp = 0;
+
+ // try to find a lamp, preferably local
+ for(base_tmp = scene->base.first; base_tmp; base_tmp= base_tmp->next) {
+ if(base_tmp->object->type == OB_LAMP) {
+ Lamp *la = base_tmp->object->data;
+
+ if(la->type == LA_LOCAL) {
+ copy_v3_v3(light, base_tmp->object->obmat[3]);
+ return 1;
+ }
+ else if(!found_lamp) {
+ copy_v3_v3(light, base_tmp->object->obmat[3]);
+ found_lamp = 1;
+ }
+ }
+ }
+
+ return found_lamp;
}
static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
@@ -822,9 +830,109 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
GroupObject *go = NULL;
Base *base = NULL;
+ // do collisions, needs to be done before emission, so that smoke isn't emitted inside collision cells
+ if(1)
+ {
+ Object *otherobj = NULL;
+ ModifierData *md = NULL;
+
+ if(sds->coll_group) // we use groups since we have 2 domains
+ go = sds->coll_group->gobject.first;
+ else
+ base = scene->base.first;
+
+ while(base || go)
+ {
+ otherobj = NULL;
+ if(sds->coll_group)
+ {
+ if(go->ob)
+ otherobj = go->ob;
+ }
+ else
+ otherobj = base->object;
+ if(!otherobj)
+ {
+ if(sds->coll_group)
+ go = go->next;
+ else
+ base= base->next;
+ continue;
+ }
+ md = modifiers_findByType(otherobj, eModifierType_Smoke);
+
+ // check for active smoke modifier
+ if(md && md->mode & (eModifierMode_Realtime | eModifierMode_Render))
+ {
+ SmokeModifierData *smd2 = (SmokeModifierData *)md;
+
+ if((smd2->type & MOD_SMOKE_TYPE_COLL) && smd2->coll && smd2->coll->points)
+ {
+ // we got nice collision object
+ SmokeCollSettings *scs = smd2->coll;
+ size_t i, j;
+ unsigned char *obstacles = smoke_get_obstacle(smd->domain->fluid);
+
+ for(i = 0; i < scs->numpoints; i++)
+ {
+ int badcell = 0;
+ size_t index = 0;
+ int cell[3];
+
+ // 1. get corresponding cell
+ get_cell(smd->domain->p0, smd->domain->res, smd->domain->dx, &scs->points[3 * i], cell, 0);
+
+ // check if cell is valid (in the domain boundary)
+ for(j = 0; j < 3; j++)
+ if((cell[j] > sds->res[j] - 1) || (cell[j] < 0))
+ {
+ badcell = 1;
+ break;
+ }
+
+ if(badcell)
+ continue;
+ // 2. set cell values (heat, density and velocity)
+ index = smoke_get_index(cell[0], sds->res[0], cell[1], sds->res[1], cell[2]);
+
+ // printf("cell[0]: %d, cell[1]: %d, cell[2]: %d\n", cell[0], cell[1], cell[2]);
+ // printf("res[0]: %d, res[1]: %d, res[2]: %d, index: %d\n\n", sds->res[0], sds->res[1], sds->res[2], index);
+ obstacles[index] = 1;
+ // for moving gobstacles
+ /*
+ const LbmFloat maxVelVal = 0.1666;
+ const LbmFloat maxusqr = maxVelVal*maxVelVal*3. *1.5;
+
+ LbmVec objvel = vec2L((mMOIVertices[n]-mMOIVerticesOld[n]) /dvec);
+ {
+ const LbmFloat usqr = (objvel[0]*objvel[0]+objvel[1]*objvel[1]+objvel[2]*objvel[2])*1.5;
+ USQRMAXCHECK(usqr, objvel[0],objvel[1],objvel[2], mMaxVlen, mMxvx,mMxvy,mMxvz);
+ if(usqr>maxusqr) {
+ // cutoff at maxVelVal
+ for(int jj=0; jj<3; jj++) {
+ if(objvel[jj]>0.) objvel[jj] = maxVelVal;
+ if(objvel[jj]<0.) objvel[jj] = -maxVelVal;
+ }
+ }
+ }
+ const LbmFloat dp=dot(objvel, vec2L((*pNormals)[n]) );
+ const LbmVec oldov=objvel; // debug
+ objvel = vec2L((*pNormals)[n]) *dp;
+ */
+ }
+ }
+ }
+
+ if(sds->coll_group)
+ go = go->next;
+ else
+ base= base->next;
+ }
+ }
+
// do flows and fluids
if(1)
- {
+ {
Object *otherobj = NULL;
ModifierData *md = NULL;
if(sds->fluid_group) // we use groups since we have 2 domains
@@ -866,9 +974,8 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
if(sfs && sfs->psys && sfs->psys->part && sfs->psys->part->type==PART_EMITTER) // is particle system selected
{
+ ParticleSimulationData sim;
ParticleSystem *psys = sfs->psys;
- ParticleSettings *part=psys->part;
- ParticleData *pa = NULL;
int p = 0;
float *density = smoke_get_density(sds->fluid);
float *bigdensity = smoke_turbulence_get_density(sds->wt);
@@ -888,6 +995,10 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
*/
float *temp_emission_map = NULL;
+ sim.scene = scene;
+ sim.ob = otherobj;
+ sim.psys = psys;
+
// initialize temp emission map
if(!(sfs->type & MOD_SMOKE_FLOW_TYPE_OUTFLOW))
{
@@ -900,19 +1011,26 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
}
// mostly copied from particle code
- for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++)
- {
- int cell[3];
- size_t i = 0;
- size_t index = 0;
- int badcell = 0;
- if(pa->alive == PARS_UNBORN && (part->flag & PART_UNBORN)==0) continue;
- else if(pa->alive == PARS_DEAD && (part->flag & PART_DIED)==0) continue;
- else if(pa->flag & (PARS_UNEXIST+PARS_NO_DISP)) continue;
+ for(p=0; p<psys->totpart; p++)
+ {
+ int cell[3];
+ size_t i = 0;
+ size_t index = 0;
+ int badcell = 0;
+ ParticleKey state;
+
+ if(psys->particles[p].flag & (PARS_NO_DISP|PARS_UNEXIST))
+ continue;
+
+ state.time = smd->time;
+
+ if(psys_get_particle_state(&sim, p, &state, 0) == 0)
+ continue;
+
// VECCOPY(pos, pa->state.co);
// mul_m4_v3(ob->imat, pos);
// 1. get corresponding cell
- get_cell(smd->domain->p0, smd->domain->res, smd->domain->dx, pa->state.co, cell, 0);
+ get_cell(smd->domain->p0, smd->domain->res, smd->domain->dx, state.co, cell, 0);
// check if cell is valid (in the domain boundary)
for(i = 0; i < 3; i++)
{
@@ -926,7 +1044,7 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
continue;
// 2. set cell values (heat, density and velocity)
index = smoke_get_index(cell[0], sds->res[0], cell[1], sds->res[1], cell[2]);
- if(!(sfs->type & MOD_SMOKE_FLOW_TYPE_OUTFLOW) && !(obstacle[index] & 2)) // this is inflow
+ if(!(sfs->type & MOD_SMOKE_FLOW_TYPE_OUTFLOW) && !(obstacle[index])) // this is inflow
{
// heat[index] += sfs->temp * 0.1;
// density[index] += sfs->density * 0.1;
@@ -938,9 +1056,9 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
// Uses particle velocity as initial velocity for smoke
if(sfs->flags & MOD_SMOKE_FLOW_INITVELOCITY && (psys->part->phystype != PART_PHYS_NO))
{
- velocity_x[index] = pa->state.vel[0]*sfs->vel_multi;
- velocity_y[index] = pa->state.vel[1]*sfs->vel_multi;
- velocity_z[index] = pa->state.vel[2]*sfs->vel_multi;
+ velocity_x[index] = state.vel[0]*sfs->vel_multi;
+ velocity_y[index] = state.vel[1]*sfs->vel_multi;
+ velocity_z[index] = state.vel[2]*sfs->vel_multi;
}
}
else if(sfs->type & MOD_SMOKE_FLOW_TYPE_OUTFLOW) // outflow
@@ -1165,107 +1283,8 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
pdEndEffectors(&effectors);
}
- // do collisions
- if(1)
- {
- Object *otherobj = NULL;
- ModifierData *md = NULL;
-
- if(sds->coll_group) // we use groups since we have 2 domains
- go = sds->coll_group->gobject.first;
- else
- base = scene->base.first;
-
- while(base || go)
- {
- otherobj = NULL;
- if(sds->coll_group)
- {
- if(go->ob)
- otherobj = go->ob;
- }
- else
- otherobj = base->object;
- if(!otherobj)
- {
- if(sds->coll_group)
- go = go->next;
- else
- base= base->next;
- continue;
- }
- md = modifiers_findByType(otherobj, eModifierType_Smoke);
-
- // check for active smoke modifier
- if(md && md->mode & (eModifierMode_Realtime | eModifierMode_Render))
- {
- SmokeModifierData *smd2 = (SmokeModifierData *)md;
-
- if((smd2->type & MOD_SMOKE_TYPE_COLL) && smd2->coll && smd2->coll->points)
- {
- // we got nice collision object
- SmokeCollSettings *scs = smd2->coll;
- size_t i, j;
- unsigned char *obstacles = smoke_get_obstacle(smd->domain->fluid);
-
- for(i = 0; i < scs->numpoints; i++)
- {
- int badcell = 0;
- size_t index = 0;
- int cell[3];
-
- // 1. get corresponding cell
- get_cell(smd->domain->p0, smd->domain->res, smd->domain->dx, &scs->points[3 * i], cell, 0);
-
- // check if cell is valid (in the domain boundary)
- for(j = 0; j < 3; j++)
- if((cell[j] > sds->res[j] - 1) || (cell[j] < 0))
- {
- badcell = 1;
- break;
- }
-
- if(badcell)
- continue;
- // 2. set cell values (heat, density and velocity)
- index = smoke_get_index(cell[0], sds->res[0], cell[1], sds->res[1], cell[2]);
-
- // printf("cell[0]: %d, cell[1]: %d, cell[2]: %d\n", cell[0], cell[1], cell[2]);
- // printf("res[0]: %d, res[1]: %d, res[2]: %d, index: %d\n\n", sds->res[0], sds->res[1], sds->res[2], index);
- obstacles[index] = 1;
- // for moving gobstacles
- /*
- const LbmFloat maxVelVal = 0.1666;
- const LbmFloat maxusqr = maxVelVal*maxVelVal*3. *1.5;
-
- LbmVec objvel = vec2L((mMOIVertices[n]-mMOIVerticesOld[n]) /dvec);
- {
- const LbmFloat usqr = (objvel[0]*objvel[0]+objvel[1]*objvel[1]+objvel[2]*objvel[2])*1.5;
- USQRMAXCHECK(usqr, objvel[0],objvel[1],objvel[2], mMaxVlen, mMxvx,mMxvy,mMxvz);
- if(usqr>maxusqr) {
- // cutoff at maxVelVal
- for(int jj=0; jj<3; jj++) {
- if(objvel[jj]>0.) objvel[jj] = maxVelVal;
- if(objvel[jj]<0.) objvel[jj] = -maxVelVal;
- }
- }
- }
- const LbmFloat dp=dot(objvel, vec2L((*pNormals)[n]) );
- const LbmVec oldov=objvel; // debug
- objvel = vec2L((*pNormals)[n]) *dp;
- */
- }
- }
- }
-
- if(sds->coll_group)
- go = go->next;
- else
- base= base->next;
- }
- }
}
-void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc)
+void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedMesh *dm)
{
if((smd->type & MOD_SMOKE_TYPE_FLOW))
{
@@ -1320,82 +1339,77 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM
float light[3];
PointCache *cache = NULL;
PTCacheID pid;
- PointCache *cache_wt = NULL;
- PTCacheID pid_wt;
int startframe, endframe, framenr;
float timescale;
- int cache_result = 0, cache_result_wt = 0;
- int did_init = 0;
framenr = scene->r.cfra;
- printf("time: %d\n", scene->r.cfra);
+ //printf("time: %d\n", scene->r.cfra);
cache = sds->point_cache[0];
BKE_ptcache_id_from_smoke(&pid, ob, smd);
BKE_ptcache_id_time(&pid, scene, framenr, &startframe, &endframe, &timescale);
- cache_wt = sds->point_cache[1];
- BKE_ptcache_id_from_smoke_turbulence(&pid_wt, ob, smd);
-
- if(!smd->domain->fluid)
+ if(!smd->domain->fluid || framenr == startframe)
{
BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
- BKE_ptcache_id_reset(scene, &pid_wt, PTCACHE_RESET_OUTDATED);
+ BKE_ptcache_validate(cache, framenr);
+ cache->flag &= ~PTCACHE_REDO_NEEDED;
}
- if(framenr < startframe)
+ if(!smd->domain->fluid && (framenr != startframe) && (smd->domain->flags & MOD_SMOKE_FILE_LOAD)==0 && (cache->flag & PTCACHE_BAKED)==0)
return;
- if(framenr > endframe)
- return;
+ smd->domain->flags &= ~MOD_SMOKE_FILE_LOAD;
- if(!smd->domain->fluid && (framenr != startframe) && (cache->flag & PTCACHE_BAKED)==0)
+ CLAMP(framenr, startframe, endframe);
+
+ /* If already viewing a pre/after frame, no need to reload */
+ if ((smd->time == framenr) && (framenr != scene->r.cfra))
return;
// printf("startframe: %d, framenr: %d\n", startframe, framenr);
- if(!(did_init = smokeModifier_init(smd, ob, scene, dm)))
+ if(smokeModifier_init(smd, ob, scene, dm)==0)
{
printf("bad smokeModifier_init\n");
return;
}
/* try to read from cache */
- cache_result = BKE_ptcache_read_cache(&pid, (float)framenr, scene->r.frs_sec);
- // printf("cache_result: %d\n", cache_result);
-
- if(cache_result == PTCACHE_READ_EXACT)
- {
+ if(BKE_ptcache_read(&pid, (float)framenr) == PTCACHE_READ_EXACT) {
BKE_ptcache_validate(cache, framenr);
-
- if(sds->wt)
- {
- cache_result_wt = BKE_ptcache_read_cache(&pid_wt, (float)framenr, scene->r.frs_sec);
-
- if(cache_result_wt == PTCACHE_READ_EXACT)
- {
- BKE_ptcache_validate(cache_wt, framenr);
-
- return;
- }
- else
- {
- ; /* don't return in the case we only got low res cache but no high res cache */
- /* we still need to calculate the high res cache */
- }
- }
- else
- return;
+ smd->time = framenr;
+ return;
}
+
+ /* only calculate something when we advanced a single frame */
+ if(framenr != (int)smd->time+1)
+ return;
- /* only calculate something when we advanced a frame */
- if(framenr == smd->time)
+ /* don't simulate if viewing start frame, but scene frame is not real start frame */
+ if (framenr != scene->r.cfra)
return;
tstart();
smoke_calc_domain(scene, ob, smd);
+
+ /* if on second frame, write cache for first frame */
+ if((int)smd->time == startframe && (cache->flag & PTCACHE_OUTDATED || cache->last_exact==0)) {
+ // create shadows straight after domain initialization so we get nice shadows for startframe, too
+ if(get_lamp(scene, light))
+ smoke_calc_transparency(sds->shadow, smoke_get_density(sds->fluid), sds->p0, sds->p1, sds->res, sds->dx, light, calc_voxel_transp, -7.0*sds->dx);
+
+ if(sds->wt)
+ {
+ if(sds->flags & MOD_SMOKE_DISSOLVE)
+ smoke_dissolve_wavelet(sds->wt, sds->diss_speed, sds->flags & MOD_SMOKE_DISSOLVE_LOG);
+ smoke_turbulence_step(sds->wt, sds->fluid);
+ }
+
+ BKE_ptcache_write(&pid, startframe);
+ }
// set new time
smd->time = scene->r.cfra;
@@ -1412,39 +1426,24 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM
smoke_dissolve(sds->fluid, sds->diss_speed, sds->flags & MOD_SMOKE_DISSOLVE_LOG);
smoke_step(sds->fluid, smd->time, scene->r.frs_sec / scene->r.frs_sec_base);
}
- else
- {
- /* Smoke did not load cache and was not reset but we're on startframe */
- /* So now reinit the smoke since it was not done yet */
- if(did_init == 2)
- {
- smokeModifier_reset(smd);
- smokeModifier_init(smd, ob, scene, dm);
- }
- }
- // create shadows before writing cache so we get nice shadows for startframe, too
+ // create shadows before writing cache so they get stored
if(get_lamp(scene, light))
smoke_calc_transparency(sds->shadow, smoke_get_density(sds->fluid), sds->p0, sds->p1, sds->res, sds->dx, light, calc_voxel_transp, -7.0*sds->dx);
-
- BKE_ptcache_validate(cache, framenr);
- BKE_ptcache_write_cache(&pid, framenr);
if(sds->wt)
{
- if(framenr!=startframe)
- {
- if(sds->flags & MOD_SMOKE_DISSOLVE)
- smoke_dissolve_wavelet(sds->wt, sds->diss_speed, sds->flags & MOD_SMOKE_DISSOLVE_LOG);
- smoke_turbulence_step(sds->wt, sds->fluid);
- }
-
- BKE_ptcache_validate(cache_wt, framenr);
- BKE_ptcache_write_cache(&pid_wt, framenr);
+ if(sds->flags & MOD_SMOKE_DISSOLVE)
+ smoke_dissolve_wavelet(sds->wt, sds->diss_speed, sds->flags & MOD_SMOKE_DISSOLVE_LOG);
+ smoke_turbulence_step(sds->wt, sds->fluid);
}
+
+ BKE_ptcache_validate(cache, framenr);
+ if(framenr != startframe)
+ BKE_ptcache_write(&pid, framenr);
tend();
- printf ( "Frame: %d, Time: %f\n", (int)smd->time, ( float ) tval() );
+ //printf ( "Frame: %d, Time: %f\n", (int)smd->time, ( float ) tval() );
}
}
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index 98a50eee146..3704792d9d4 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -63,6 +63,7 @@ variables on the UI for now
#include "DNA_meshdata_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_threads.h"
@@ -171,7 +172,7 @@ static void Vec3PlusStVec(float *v, float s, float *v1);
/*physical unit of force is [kg * m / sec^2]*/
-static float sb_grav_force_scale(Object *ob)
+static float sb_grav_force_scale(Object *UNUSED(ob))
/* since unit of g is [m/sec^2] and F = mass * g we rescale unit mass of node to 1 gramm
put it to a function here, so we can add user options later without touching simulation code
*/
@@ -179,7 +180,7 @@ static float sb_grav_force_scale(Object *ob)
return (0.001f);
}
-static float sb_fric_force_scale(Object *ob)
+static float sb_fric_force_scale(Object *UNUSED(ob))
/* rescaling unit of drag [1 / sec] to somehow reasonable
put it to a function here, so we can add user options later without touching simulation code
*/
@@ -678,7 +679,7 @@ static void add_mesh_quad_diag_springs(Object *ob)
}
}
-static void add_2nd_order_roller(Object *ob,float stiffness,int *counter, int addsprings)
+static void add_2nd_order_roller(Object *ob,float UNUSED(stiffness), int *counter, int addsprings)
{
/*assume we have a softbody*/
SoftBody *sb= ob->soft; /* is supposed to be there */
@@ -697,12 +698,12 @@ static void add_2nd_order_roller(Object *ob,float stiffness,int *counter, int ad
bs = sb->bspring + bp->springs[b-1];
/*nasty thing here that springs have two ends
so here we have to make sure we examine the other */
- if (( v0 == bs->v1) ){
+ if (v0 == bs->v1){
bpo =sb->bpoint+bs->v2;
notthis = bs->v2;
}
else {
- if (( v0 == bs->v2) ){
+ if (v0 == bs->v2){
bpo =sb->bpoint+bs->v1;
notthis = bs->v1;
}
@@ -1029,7 +1030,7 @@ static int query_external_colliders(Scene *scene, Object *me)
/* +++ the aabb "force" section*/
-static int sb_detect_aabb_collisionCached( float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
+static int sb_detect_aabb_collisionCached( float UNUSED(force[3]), unsigned int UNUSED(par_layer),struct Object *vertexowner,float UNUSED(time))
{
Object *ob;
SoftBody *sb=vertexowner->soft;
@@ -1094,7 +1095,7 @@ static int sb_detect_aabb_collisionCached( float force[3], unsigned int par_laye
/* +++ the face external section*/
static int sb_detect_face_pointCached(float face_v1[3],float face_v2[3],float face_v3[3],float *damp,
- float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
+ float force[3], unsigned int UNUSED(par_layer),struct Object *vertexowner,float time)
{
Object *ob;
GHash *hash;
@@ -1192,7 +1193,7 @@ static int sb_detect_face_pointCached(float face_v1[3],float face_v2[3],float fa
static int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],float face_v3[3],float *damp,
- float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
+ float force[3], unsigned int UNUSED(par_layer),struct Object *vertexowner,float time)
{
Object *ob;
GHash *hash;
@@ -1418,7 +1419,7 @@ static void scan_for_ext_face_forces(Object *ob,float timenow)
/* +++ the spring external section*/
static int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],float *damp,
- float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
+ float force[3], unsigned int UNUSED(par_layer),struct Object *vertexowner,float time)
{
Object *ob;
GHash *hash;
@@ -1659,7 +1660,7 @@ static void *exec_scan_for_ext_spring_forces(void *data)
return 0;
}
-static void sb_sfesf_threads_run(Scene *scene, struct Object *ob, float timenow,int totsprings,int *ptr_to_break_func())
+static void sb_sfesf_threads_run(Scene *scene, struct Object *ob, float timenow,int totsprings,int *UNUSED(ptr_to_break_func(void)))
{
ListBase *do_effector = NULL;
ListBase threads;
@@ -1749,7 +1750,7 @@ static int choose_winner(float*w, float* pos,float*a,float*b,float*c,float*ca,fl
static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], float *damp,
- float force[3], unsigned int par_layer,struct Object *vertexowner,
+ float force[3], unsigned int UNUSED(par_layer), struct Object *vertexowner,
float time,float vel[3], float *intrusion)
{
Object *ob= NULL;
@@ -2084,7 +2085,7 @@ static void dfdv_goal(int ia, int ic,float factor)
for(i=0;i<3;i++) nlMatrixAdd(ia+i,ic+i,factor);
}
*/
-static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float forcetime,int nl_flags)
+static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float UNUSED(forcetime), int nl_flags)
{
SoftBody *sb= ob->soft; /* is supposed to be there */
BodyPoint *bp1,*bp2;
@@ -2175,7 +2176,7 @@ static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float fo
/* since this is definitely the most CPU consuming task here .. try to spread it */
/* core function _softbody_calc_forces_slice_in_a_thread */
/* result is int to be able to flag user break */
-static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, float forcetime, float timenow,int ifirst,int ilast,int *ptr_to_break_func(),ListBase *do_effector,int do_deflector,float fieldfactor, float windfactor)
+static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, float forcetime, float timenow,int ifirst,int ilast,int *UNUSED(ptr_to_break_func(void)),ListBase *do_effector,int do_deflector,float fieldfactor, float windfactor)
{
float iks;
int bb,do_selfcollision,do_springcollision,do_aero;
@@ -2386,7 +2387,7 @@ static void *exec_softbody_calc_forces(void *data)
return 0;
}
-static void sb_cf_threads_run(Scene *scene, Object *ob, float forcetime, float timenow,int totpoint,int *ptr_to_break_func(),struct ListBase *do_effector,int do_deflector,float fieldfactor, float windfactor)
+static void sb_cf_threads_run(Scene *scene, Object *ob, float forcetime, float timenow,int totpoint,int *UNUSED(ptr_to_break_func(void)),struct ListBase *do_effector,int do_deflector,float fieldfactor, float windfactor)
{
ListBase threads;
SB_thread_context *sb_threads;
@@ -2444,7 +2445,7 @@ static void sb_cf_threads_run(Scene *scene, Object *ob, float forcetime, float t
MEM_freeN(sb_threads);
}
-static void softbody_calc_forcesEx(Scene *scene, Object *ob, float forcetime, float timenow, int nl_flags)
+static void softbody_calc_forcesEx(Scene *scene, Object *ob, float forcetime, float timenow, int UNUSED(nl_flags))
{
/* rule we never alter free variables :bp->vec bp->pos in here !
* this will ruin adaptive stepsize AKA heun! (BM)
@@ -2452,7 +2453,8 @@ static void softbody_calc_forcesEx(Scene *scene, Object *ob, float forcetime, fl
SoftBody *sb= ob->soft; /* is supposed to be there */
BodyPoint *bproot;
ListBase *do_effector = NULL;
- float iks, gravity;
+ float gravity;
+ /* float iks; */
float fieldfactor = -1.0f, windfactor = 0.25;
int do_deflector,do_selfcollision,do_springcollision,do_aero;
@@ -2464,7 +2466,7 @@ static void softbody_calc_forcesEx(Scene *scene, Object *ob, float forcetime, fl
do_springcollision=do_deflector && (ob->softflag & OB_SB_EDGES) &&(ob->softflag & OB_SB_EDGECOLL);
do_aero=((sb->aeroedge)&& (ob->softflag & OB_SB_EDGES));
- iks = 1.0f/(1.0f-sb->inspring)-1.0f ;/* inner spring constants function */
+ /* iks = 1.0f/(1.0f-sb->inspring)-1.0f; */ /* inner spring constants function */ /* UNUSED */
bproot= sb->bpoint; /* need this for proper spring addressing */
if (do_springcollision || do_aero)
@@ -4134,7 +4136,7 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i
}
/* try to read from cache */
- cache_result = BKE_ptcache_read_cache(&pid, framenr, scene->r.frs_sec);
+ cache_result = BKE_ptcache_read(&pid, framenr);
if(cache_result == PTCACHE_READ_EXACT || cache_result == PTCACHE_READ_INTERPOLATED) {
softbody_to_object(ob, vertexCos, numVerts, sb->local);
@@ -4142,14 +4144,14 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i
BKE_ptcache_validate(cache, framenr);
if(cache_result == PTCACHE_READ_INTERPOLATED && cache->flag & PTCACHE_REDO_NEEDED)
- BKE_ptcache_write_cache(&pid, framenr);
+ BKE_ptcache_write(&pid, framenr);
return;
}
else if(cache_result==PTCACHE_READ_OLD) {
; /* do nothing */
}
- else if(ob->id.lib || (cache->flag & PTCACHE_BAKED)) {
+ else if(/*ob->id.lib || */(cache->flag & PTCACHE_BAKED)) { /* "library linking & pointcaches" has to be solved properly at some point */
/* if baked and nothing in cache, do nothing */
BKE_ptcache_invalidate(cache);
return;
@@ -4157,7 +4159,7 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i
/* if on second frame, write cache for first frame */
if(cache->simframe == startframe && (cache->flag & PTCACHE_OUTDATED || cache->last_exact==0))
- BKE_ptcache_write_cache(&pid, startframe);
+ BKE_ptcache_write(&pid, startframe);
softbody_update_positions(ob, sb, vertexCos, numVerts);
@@ -4170,6 +4172,6 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i
softbody_to_object(ob, vertexCos, numVerts, 0);
BKE_ptcache_validate(cache, framenr);
- BKE_ptcache_write_cache(&pid, framenr);
+ BKE_ptcache_write(&pid, framenr);
}
diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c
index 26392132038..3dc2221e0c8 100644
--- a/source/blender/blenkernel/intern/sound.c
+++ b/source/blender/blenkernel/intern/sound.c
@@ -110,6 +110,8 @@ void sound_init(struct Main *bmain)
#ifdef WITH_JACK
AUD_setSyncCallback(sound_sync_callback, bmain);
+#else
+ (void)bmain; /* unused */
#endif
}
@@ -118,7 +120,7 @@ void sound_exit()
AUD_exit();
}
-struct bSound* sound_new_file(struct Main *bmain, char* filename)
+struct bSound* sound_new_file(struct Main *bmain, const char *filename)
{
bSound* sound = NULL;
@@ -129,7 +131,7 @@ struct bSound* sound_new_file(struct Main *bmain, char* filename)
strcpy(str, filename);
- path = /*bmain ? bmain->name :*/ G.sce;
+ path = /*bmain ? bmain->name :*/ G.main->name;
BLI_path_abs(str, path);
@@ -264,7 +266,7 @@ void sound_load(struct Main *bmain, struct bSound* sound)
if(sound->id.lib)
path = sound->id.lib->filepath;
else
- path = /*bmain ? bmain->name :*/ G.sce;
+ path = bmain->name;
BLI_path_abs(fullpath, path);
@@ -274,7 +276,7 @@ void sound_load(struct Main *bmain, struct bSound* sound)
/* or else load it from disk */
else
sound->handle = AUD_load(fullpath);
- } // XXX
+ }
// XXX unused currently
#if 0
break;
@@ -433,9 +435,11 @@ void sound_seek_scene(struct bContext *C)
if(scene->audio.flag & AUDIO_SCRUB && !CTX_wm_screen(C)->animtimer)
{
- // AUD_XXX TODO: fix scrubbing, it currently doesn't stop playing
if(scene->audio.flag & AUDIO_SYNC)
+ {
+ AUD_seek(scene->sound_scene_handle, CFRA / FPS);
AUD_seekSequencer(scene->sound_scene_handle, CFRA / FPS);
+ }
else
AUD_seek(scene->sound_scene_handle, CFRA / FPS);
AUD_resume(scene->sound_scene_handle);
@@ -480,3 +484,12 @@ int sound_read_sound_buffer(struct bSound* sound, float* buffer, int length, flo
return AUD_readSound(limiter, buffer, length);
AUD_unload(limiter);
}
+
+int sound_get_channels(struct bSound* sound)
+{
+ AUD_SoundInfo info;
+
+ info = AUD_getInfo(sound->playback_handle);
+
+ return info.specs.channels;
+}
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index d6486c3ee4d..a2d3016099d 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -41,6 +41,13 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "BLI_blenlib.h"
+#include "BLI_edgehash.h"
+#include "BLI_math.h"
+#include "BLI_memarena.h"
+#include "BLI_pbvh.h"
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_global.h"
#include "BKE_mesh.h"
@@ -48,13 +55,7 @@
#include "BKE_paint.h"
#include "BKE_scene.h"
#include "BKE_subsurf.h"
-#include "BKE_utildefines.h"
-#include "BLI_blenlib.h"
-#include "BLI_edgehash.h"
-#include "BLI_math.h"
-#include "BLI_memarena.h"
-#include "BLI_pbvh.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -69,8 +70,6 @@ static int ccgDM_getVertMapIndex(CCGSubSurf *ss, CCGVert *v);
static int ccgDM_getEdgeMapIndex(CCGSubSurf *ss, CCGEdge *e);
static int ccgDM_getFaceMapIndex(CCGSubSurf *ss, CCGFace *f);
-static int ccgDM_use_grid_pbvh(CCGDerivedMesh *ccgdm);
-
///
static void *arena_alloc(CCGAllocatorHDL a, int numBytes) {
@@ -83,13 +82,13 @@ static void *arena_realloc(CCGAllocatorHDL a, void *ptr, int newSize, int oldSiz
}
return p2;
}
-static void arena_free(CCGAllocatorHDL a, void *ptr) {
+static void arena_free(CCGAllocatorHDL UNUSED(a), void *UNUSED(ptr)) {
}
static void arena_release(CCGAllocatorHDL a) {
BLI_memarena_free(a);
}
-static CCGSubSurf *_getSubSurf(CCGSubSurf *prevSS, int subdivLevels, int useAging, int useArena, int useFlatSubdiv) {
+static CCGSubSurf *_getSubSurf(CCGSubSurf *prevSS, int subdivLevels, int useAging, int useArena, int UNUSED(useFlatSubdiv)) {
CCGMeshIFC ifc;
CCGSubSurf *ccgSS;
@@ -313,7 +312,7 @@ static void set_subsurf_uv(CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *result,
CCGFace **faceMap;
MTFace *tf;
CCGFaceIterator *fi;
- int index, gridSize, gridFaces, edgeSize, totface, x, y, S;
+ int index, gridSize, gridFaces, /*edgeSize,*/ totface, x, y, S;
MTFace *dmtface = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, n);
MTFace *tface = CustomData_get_layer_n(&result->faceData, CD_MTFACE, n);
@@ -330,7 +329,7 @@ static void set_subsurf_uv(CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *result,
/* get some info from CCGSubSurf */
totface = ccgSubSurf_getNumFaces(uvss);
- edgeSize = ccgSubSurf_getEdgeSize(uvss);
+ /* edgeSize = ccgSubSurf_getEdgeSize(uvss); */ /*UNUSED*/
gridSize = ccgSubSurf_getGridSize(uvss);
gridFaces = gridSize - 1;
@@ -688,7 +687,7 @@ static void ccgDM_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med)
/* this edge comes from face data */
int lastface = ccgSubSurf_getNumFaces(ss) - 1;
CCGFace *f;
- int x, y, grid, numVerts;
+ int x, y, grid /*, numVerts*/;
int offset;
int gridSize = ccgSubSurf_getGridSize(ss);
int edgeSize = ccgSubSurf_getEdgeSize(ss);
@@ -700,7 +699,7 @@ static void ccgDM_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med)
++i;
f = ccgdm->faceMap[i].face;
- numVerts = ccgSubSurf_getFaceNumVerts(f);
+ /* numVerts = ccgSubSurf_getFaceNumVerts(f); */ /*UNUSED*/
gridSideEdges = gridSize - 1;
gridInternalEdges = (gridSideEdges - 1) * gridSideEdges * 2;
@@ -765,7 +764,7 @@ static void ccgDM_getFinalFace(DerivedMesh *dm, int faceNum, MFace *mf)
int gridFaces = gridSideEdges * gridSideEdges;
int i;
CCGFace *f;
- int numVerts;
+ /*int numVerts;*/
int offset;
int grid;
int x, y;
@@ -779,7 +778,7 @@ static void ccgDM_getFinalFace(DerivedMesh *dm, int faceNum, MFace *mf)
++i;
f = ccgdm->faceMap[i].face;
- numVerts = ccgSubSurf_getFaceNumVerts(f);
+ /*numVerts = ccgSubSurf_getFaceNumVerts(f);*/ /*UNUSED*/
offset = faceNum - ccgdm->faceMap[i].startFace;
grid = offset / gridFaces;
@@ -1146,7 +1145,23 @@ static void ccgDM_drawVerts(DerivedMesh *dm) {
ccgFaceIterator_free(fi);
glEnd();
}
-static void ccgDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int drawAllEdges) {
+
+static void ccgdm_pbvh_update(CCGDerivedMesh *ccgdm)
+{
+ if(ccgdm->pbvh) {
+ CCGFace **faces;
+ int totface;
+
+ BLI_pbvh_get_grid_updates(ccgdm->pbvh, 1, (void***)&faces, &totface);
+ if(totface) {
+ ccgSubSurf_updateFromFaces(ccgdm->ss, 0, faces, totface);
+ ccgSubSurf_updateNormals(ccgdm->ss, faces, totface);
+ MEM_freeN(faces);
+ }
+ }
+}
+
+static void ccgDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int UNUSED(drawAllEdges)) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss);
@@ -1155,6 +1170,8 @@ static void ccgDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int drawAllEdge
int gridSize = ccgSubSurf_getGridSize(ss);
int useAging;
+ ccgdm_pbvh_update(ccgdm);
+
ccgSubSurf_getUseAgeCounts(ss, &useAging, NULL, NULL, NULL);
for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
@@ -1245,25 +1262,10 @@ static void ccgDM_glNormalFast(float *a, float *b, float *c, float *d)
no[1] = b_dZ*a_cX - b_dX*a_cZ;
no[2] = b_dX*a_cY - b_dY*a_cX;
- /* don't normalize, GL_NORMALIZE is be enabled */
+ /* don't normalize, GL_NORMALIZE is enabled */
glNormal3fv(no);
}
-static void ccgdm_pbvh_update(CCGDerivedMesh *ccgdm)
-{
- if(ccgdm->pbvh && ccgDM_use_grid_pbvh(ccgdm)) {
- CCGFace **faces;
- int totface;
-
- BLI_pbvh_get_grid_updates(ccgdm->pbvh, 1, (void***)&faces, &totface);
- if(totface) {
- ccgSubSurf_updateFromFaces(ccgdm->ss, 0, faces, totface);
- ccgSubSurf_updateNormals(ccgdm->ss, faces, totface);
- MEM_freeN(faces);
- }
- }
-}
-
/* Only used by non-editmesh types */
static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes)[4], int fast, int (*setMaterial)(int, void *attribs)) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
@@ -1357,7 +1359,7 @@ static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, v
CCGSubSurf *ss = ccgdm->ss;
CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
GPUVertexAttribs gattribs;
- DMVertexAttribs attribs;
+ DMVertexAttribs attribs= {{{0}}};
MTFace *tf = dm->getFaceDataArray(dm, CD_MTFACE);
int gridSize = ccgSubSurf_getGridSize(ss);
int gridFaces = gridSize - 1;
@@ -1369,13 +1371,10 @@ static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, v
ccgdm_pbvh_update(ccgdm);
doDraw = 0;
- numVerts = 0;
matnr = -1;
transp = GPU_get_material_blend_mode();
orig_transp = transp;
- memset(&attribs, 0, sizeof(attribs));
-
#define PASSATTRIB(dx, dy, vert) { \
if(attribs.totorco) { \
index = getFaceIndex(ss, f, S, x+dx, y+dy, edgeSize, gridSize); \
@@ -1514,7 +1513,7 @@ static void ccgDM_drawFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, void *a
dm->drawMappedFacesGLSL(dm, setMaterial, NULL, NULL);
}
-static void ccgDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned char *col1, unsigned char *col2) {
+static void ccgDM_drawFacesColored(DerivedMesh *dm, int UNUSED(useTwoSided), unsigned char *col1, unsigned char *col2) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
@@ -1619,9 +1618,12 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
if(drawParams)
flag = drawParams(tf, mcol, mat_nr);
- else
+ else if (index != ORIGINDEX_NONE)
flag= (drawParamsMapped)? drawParamsMapped(userData, index): 1;
-
+ else
+ flag= GPU_enable_material(mat_nr, NULL) ? 1:0;
+
+
if (flag == 0) { /* flag 0 == the face is hidden or invisible */
if(tf) tf += gridFaces*gridFaces*numVerts;
if(mcol) mcol += gridFaces*gridFaces*numVerts*4;
@@ -1761,7 +1763,7 @@ static void ccgDM_drawUVEdges(DerivedMesh *dm)
}
}
-static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors) {
+static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors, int (*setMaterial)(int, void *attribs)) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
MCol *mcol= NULL;
@@ -1793,10 +1795,14 @@ static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *u
mcol += gridFaces*gridFaces*numVerts*4;
}
- if (index!=-1) {
- int draw;
- draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, index, &drawSmooth);
-
+ {
+ int draw= 1;
+
+ if(index == ORIGINDEX_NONE)
+ draw= setMaterial(faceFlags ? faceFlags[origIndex*2 + 1] + 1: 1, NULL); /* XXX, no faceFlags no material */
+ else if (setDrawOptions)
+ draw= setDrawOptions(userData, index, &drawSmooth);
+
if (draw) {
if (draw==2) {
glEnable(GL_POLYGON_STIPPLE);
@@ -2139,14 +2145,14 @@ static void ccgdm_create_grids(DerivedMesh *dm)
DMGridAdjacency *gridAdjacency, *adj;
CCGFace **gridFaces;
int *gridOffset;
- int index, numFaces, numGrids, S, gIndex, gridSize;
+ int index, numFaces, numGrids, S, gIndex /*, gridSize*/;
if(ccgdm->gridData)
return;
numGrids = ccgDM_getNumGrids(dm);
numFaces = ccgSubSurf_getNumFaces(ss);
- gridSize = ccgDM_getGridSize(dm);
+ /*gridSize = ccgDM_getGridSize(dm);*/ /*UNUSED*/
/* compute offset into grid array for each face */
gridOffset = MEM_mallocN(sizeof(int)*numFaces, "ccgdm.gridOffset");
@@ -2232,28 +2238,10 @@ static ListBase *ccgDM_getFaceMap(Object *ob, DerivedMesh *dm)
return ccgdm->fmap;
}
-static int ccgDM_use_grid_pbvh(CCGDerivedMesh *ccgdm)
-{
- ModifierData *md;
- MultiresModifierData *mmd= ccgdm->multires.mmd;
-
- /* in sync with sculpt mode, only use multires grid pbvh if we are
- the last enabled modifier in the stack, otherwise we use the base
- mesh */
- if(!mmd)
- return 0;
-
- for(md=mmd->modifier.next; md; md= md->next)
- if(modifier_isEnabled(mmd->modifier.scene, md, eModifierMode_Realtime))
- return 0;
-
- return 1;
-}
-
static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm)
{
CCGDerivedMesh *ccgdm= (CCGDerivedMesh*)dm;
- int gridSize, numGrids, grid_pbvh;
+ int gridSize, numGrids;
if(!ob) {
ccgdm->pbvh= NULL;
@@ -2263,21 +2251,8 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm)
if(!ob->sculpt)
return NULL;
- grid_pbvh = ccgDM_use_grid_pbvh(ccgdm);
-
- if(ob->sculpt->pbvh) {
- if(grid_pbvh) {
- /* pbvh's grids, gridadj and gridfaces points to data inside ccgdm
- but this can be freed on ccgdm release, this updates the pointers
- when the ccgdm gets remade, the assumption is that the topology
- does not change. */
- ccgdm_create_grids(dm);
- BLI_pbvh_grids_update(ob->sculpt->pbvh, ccgdm->gridData, ccgdm->gridAdjacency, (void**)ccgdm->gridFaces);
- }
-
+ if(ob->sculpt->pbvh)
ccgdm->pbvh = ob->sculpt->pbvh;
- ccgdm->pbvh_draw = grid_pbvh;
- }
if(ccgdm->pbvh)
return ccgdm->pbvh;
@@ -2285,25 +2260,14 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm)
/* no pbvh exists yet, we need to create one. only in case of multires
we build a pbvh over the modified mesh, in other cases the base mesh
is being sculpted, so we build a pbvh from that. */
- if(grid_pbvh) {
- ccgdm_create_grids(dm);
-
- gridSize = ccgDM_getGridSize(dm);
- numGrids = ccgDM_getNumGrids(dm);
+ ccgdm_create_grids(dm);
- ob->sculpt->pbvh= ccgdm->pbvh = BLI_pbvh_new();
- BLI_pbvh_build_grids(ccgdm->pbvh, ccgdm->gridData, ccgdm->gridAdjacency,
- numGrids, gridSize, (void**)ccgdm->gridFaces);
- ccgdm->pbvh_draw = 1;
- }
- else if(ob->type == OB_MESH) {
- Mesh *me= ob->data;
+ gridSize = ccgDM_getGridSize(dm);
+ numGrids = ccgDM_getNumGrids(dm);
- ob->sculpt->pbvh= ccgdm->pbvh = BLI_pbvh_new();
- BLI_pbvh_build_mesh(ccgdm->pbvh, me->mface, me->mvert,
- me->totface, me->totvert);
- ccgdm->pbvh_draw = 0;
- }
+ ob->sculpt->pbvh= ccgdm->pbvh = BLI_pbvh_new();
+ BLI_pbvh_build_grids(ccgdm->pbvh, ccgdm->gridData, ccgdm->gridAdjacency,
+ numGrids, gridSize, (void**)ccgdm->gridFaces);
return ccgdm->pbvh;
}
@@ -2325,7 +2289,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
int edgeSize;
int gridSize;
int gridFaces;
- int gridSideVerts;
+ /*int gridSideVerts;*/
int gridSideEdges;
int gridInternalEdges;
MEdge *medge = NULL;
@@ -2423,8 +2387,8 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
edgeSize = ccgSubSurf_getEdgeSize(ss);
gridSize = ccgSubSurf_getGridSize(ss);
gridFaces = gridSize - 1;
- gridSideVerts = gridSize - 2;
- /*gridInternalVerts = gridSideVerts * gridSideVerts; - as yet, unused */
+ /*gridSideVerts = gridSize - 2;*/ /*UNUSED*/
+ /*gridInternalVerts = gridSideVerts * gridSideVerts; */ /*UNUSED*/
gridSideEdges = gridSize - 1;
gridInternalEdges = (gridSideEdges - 1) * gridSideEdges * 2;
diff --git a/source/blender/blenkernel/intern/suggestions.c b/source/blender/blenkernel/intern/suggestions.c
index 1b720c1adaa..7d39203cefc 100644
--- a/source/blender/blenkernel/intern/suggestions.c
+++ b/source/blender/blenkernel/intern/suggestions.c
@@ -54,7 +54,7 @@ static int txttl_cmp(const char *first, const char *second, int len) {
return cmp;
}
-static void txttl_free_suggest() {
+static void txttl_free_suggest(void) {
SuggItem *item, *prev;
for (item = suggestions.last; item; item=prev) {
prev = item->prev;
@@ -66,7 +66,7 @@ static void txttl_free_suggest() {
suggestions.top = 0;
}
-static void txttl_free_docs() {
+static void txttl_free_docs(void) {
if (documentation) {
MEM_freeN(documentation);
documentation = NULL;
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c
index 19bc853276a..1bd41c7aa86 100644
--- a/source/blender/blenkernel/intern/text.c
+++ b/source/blender/blenkernel/intern/text.c
@@ -36,6 +36,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_constraint_types.h"
#include "DNA_controller_types.h"
@@ -51,9 +52,9 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_text.h"
-#include "BKE_utildefines.h"
-#ifndef DISABLE_PYTHON
+
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -93,7 +94,7 @@ TMARK_EDITALL is set the group ID defines which other markers should be edited.
The mrk->clr field is used to visually group markers where the flags may not
match. A template system, for example, may allow editing of repeating tokens
(in one group) but include other marked positions (in another group) all in the
-same template with the same colour.
+same template with the same color.
Undo
--
@@ -167,12 +168,12 @@ void free_text(Text *text)
if(text->name) MEM_freeN(text->name);
MEM_freeN(text->undo_buf);
-#ifndef DISABLE_PYTHON
- if (text->compiled) BPY_free_compiled_text(text);
+#ifdef WITH_PYTHON
+ if (text->compiled) BPY_text_free_code(text);
#endif
}
-Text *add_empty_text(char *name)
+Text *add_empty_text(const char *name)
{
Main *bmain= G.main;
Text *ta;
@@ -241,7 +242,7 @@ int reopen_text(Text *text)
if (!text || !text->name) return 0;
BLI_strncpy(str, text->name, FILE_MAXDIR+FILE_MAXFILE);
- BLI_path_abs(str, G.sce);
+ BLI_path_abs(str, G.main->name);
fp= fopen(str, "r");
if(fp==NULL) return 0;
@@ -279,7 +280,6 @@ int reopen_text(Text *text)
text->mtime= st.st_mtime;
text->nlines=0;
- i=0;
llen=0;
for(i=0; i<len; i++) {
if (buffer[i]=='\n') {
@@ -325,7 +325,7 @@ int reopen_text(Text *text)
return 1;
}
-Text *add_text(char *file, const char *relpath)
+Text *add_text(const char *file, const char *relpath)
{
Main *bmain= G.main;
FILE *fp;
@@ -521,7 +521,7 @@ void unlink_text(Main *bmain, Text *text)
}
if(update)
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
/* pynodes */
@@ -559,7 +559,7 @@ void clear_text(Text *text) /* called directly from rna */
txt_make_dirty(text);
}
-void write_text(Text *text, char *str) /* called directly from rna */
+void write_text(Text *text, const char *str) /* called directly from rna */
{
int oldstate;
@@ -585,7 +585,7 @@ static void make_new_line (TextLine *line, char *newline)
line->format= NULL;
}
-static TextLine *txt_new_line(char *str)
+static TextLine *txt_new_line(const char *str)
{
TextLine *tmp;
@@ -683,8 +683,8 @@ int txt_get_span (TextLine *from, TextLine *to)
static void txt_make_dirty (Text *text)
{
text->flags |= TXT_ISDIRTY;
-#ifndef DISABLE_PYTHON
- if (text->compiled) BPY_free_compiled_text(text);
+#ifdef WITH_PYTHON
+ if (text->compiled) BPY_text_free_code(text);
#endif
}
@@ -991,8 +991,8 @@ void txt_move_to (Text *text, unsigned int line, unsigned int ch, short sel)
if ((*linep)->next) *linep= (*linep)->next;
else break;
}
- if (ch>(*linep)->len)
- ch= (*linep)->len;
+ if (ch>(unsigned int)((*linep)->len))
+ ch= (unsigned int)((*linep)->len);
*charp= ch;
if(!sel) txt_pop_sel(text);
@@ -1232,7 +1232,7 @@ int txt_find_string(Text *text, char *findstr, int wrap)
{
TextLine *tl, *startl;
char *s= NULL;
- int oldcl, oldsl, oldcc, oldsc;
+ int oldcl, oldsl;
if (!text || !text->curl || !text->sell) return 0;
@@ -1241,8 +1241,6 @@ int txt_find_string(Text *text, char *findstr, int wrap)
oldcl= txt_get_span(text->lines.first, text->curl);
oldsl= txt_get_span(text->lines.first, text->sell);
tl= startl= text->sell;
- oldcc= text->curc;
- oldsc= text->selc;
s= strstr(&tl->line[text->selc], findstr);
while (!s) {
@@ -1431,7 +1429,7 @@ void txt_print_undo(Text *text)
{
int i= 0;
int op;
- char *ops;
+ const char *ops;
int linep, charp;
dump_buffer(text);
@@ -2219,7 +2217,6 @@ static void txt_combine_lines (Text *text, TextLine *linea, TextLine *lineb)
} while (mrk && mrk->lineno==lineno);
}
if (lineno==-1) lineno= txt_get_span(text->lines.first, lineb);
- if (!mrk) mrk= text->markers.first;
tmp= MEM_mallocN(linea->len+lineb->len+1, "textline_string");
@@ -2470,7 +2467,7 @@ void indent(Text *text)
int len, num;
char *tmp;
- char *add = "\t";
+ const char *add = "\t";
int indentlen = 1;
/* hardcoded: TXT_TABSIZE = 4 spaces: */
@@ -2531,7 +2528,7 @@ void indent(Text *text)
void unindent(Text *text)
{
int num = 0;
- char *remove = "\t";
+ const char *remove = "\t";
int indent = 1;
/* hardcoded: TXT_TABSIZE = 4 spaces: */
@@ -2694,7 +2691,7 @@ int setcurr_tab_spaces (Text *text, int space)
const char *word = ":";
const char *comm = "#";
const char indent= (text->flags & TXT_TABSTOSPACES) ? ' ' : '\t';
- static char *back_words[]= {"return", "break", "continue", "pass", "yield", NULL};
+ static const char *back_words[]= {"return", "break", "continue", "pass", "yield", NULL};
if (!text) return 0;
if (!text->curl) return 0;
@@ -2710,9 +2707,13 @@ int setcurr_tab_spaces (Text *text, int space)
}
if(strstr(text->curl->line, word))
{
- //if we find a : then add a tab but not if it is in a comment
+ /* if we find a ':' on this line, then add a tab but not if it is:
+ * 1) in a comment
+ * 2) within an identifier
+ * 3) after the cursor (text->curc), i.e. when creating space before a function def [#25414]
+ */
int a, indent = 0;
- for(a=0; text->curl->line[a] != '\0'; a++)
+ for(a=0; (a < text->curc) && (text->curl->line[a] != '\0'); a++)
{
if (text->curl->line[a]=='#') {
break;
@@ -2746,7 +2747,7 @@ int setcurr_tab_spaces (Text *text, int space)
/*********************************/
/* Creates and adds a marker to the list maintaining sorted order */
-void txt_add_marker(Text *text, TextLine *line, int start, int end, char color[4], int group, int flags) {
+void txt_add_marker(Text *text, TextLine *line, int start, int end, const unsigned char color[4], int group, int flags) {
TextMarker *tmp, *marker;
marker= MEM_mallocN(sizeof(TextMarker), "text_marker");
diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c
index 77416f4dd12..57c629d5544 100644
--- a/source/blender/blenkernel/intern/texture.c
+++ b/source/blender/blenkernel/intern/texture.c
@@ -38,11 +38,10 @@
#include "PIL_dynlib.h"
-
-
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_kdopbvh.h"
+#include "BLI_utildefines.h"
#include "DNA_key_types.h"
#include "DNA_object_types.h"
@@ -573,6 +572,7 @@ void default_tex(Tex *tex)
tex->iuser.fie_ima= 2;
tex->iuser.ok= 1;
tex->iuser.frames= 100;
+ tex->iuser.sfra= 1;
tex->preview = NULL;
}
@@ -630,7 +630,7 @@ void default_mtex(MTex *mtex)
mtex->size[1]= 1.0;
mtex->size[2]= 1.0;
mtex->tex= 0;
- mtex->texflag= MTEX_NEW_BUMP;
+ mtex->texflag= MTEX_3TAP_BUMP | MTEX_BUMP_OBJECTSPACE;
mtex->colormodel= 0;
mtex->r= 1.0;
mtex->g= 0.0;
@@ -760,7 +760,7 @@ Tex *copy_texture(Tex *tex)
if(tex->nodetree) {
ntreeEndExecTree(tex->nodetree);
- texn->nodetree= ntreeCopyTree(tex->nodetree, 0); /* 0 == full new tree */
+ texn->nodetree= ntreeCopyTree(tex->nodetree); /* 0 == full new tree */
}
return texn;
@@ -1285,8 +1285,7 @@ void BKE_free_pointdensity(PointDensity *pd)
void BKE_free_voxeldatadata(struct VoxelData *vd)
{
if (vd->dataset) {
- if(vd->file_format != TEX_VD_SMOKE)
- MEM_freeN(vd->dataset);
+ MEM_freeN(vd->dataset);
vd->dataset = NULL;
}
@@ -1337,13 +1336,11 @@ int BKE_texture_dependsOnTime(const struct Tex *texture)
else if( texture->ima &&
ELEM(texture->ima->source, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE)) {
return 1;
- }
-#if 0 // XXX old animation system
- else if(texture->ipo) {
- // assume any ipo means the texture is animated
+ }
+ else if(texture->adt) {
+ // assume anything in adt means the texture is animated
return 1;
}
-#endif // XXX old animation system
return 0;
}
diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c
index 3d984c7e877..1b04589c1f2 100644
--- a/source/blender/blenkernel/intern/unit.c
+++ b/source/blender/blenkernel/intern/unit.c
@@ -24,13 +24,10 @@
#include <stdio.h>
#include <ctype.h>
#include <string.h>
+#include <assert.h>
#include "BKE_unit.h"
-#ifdef WIN32
-#define _USE_MATH_DEFINES
-#endif
-#include <math.h>
-
+#include "BLI_math.h"
#include "BLI_winstuff.h"
@@ -73,13 +70,13 @@
/* define a single unit */
typedef struct bUnitDef {
- char *name;
- char *name_plural; /* abused a bit for the display name */
- char *name_short; /* this is used for display*/
- char *name_alt; /* keyboard-friendly ASCII-only version of name_short, can be NULL */
+ const char *name;
+ const char *name_plural; /* abused a bit for the display name */
+ const char *name_short; /* this is used for display*/
+ const char *name_alt; /* keyboard-friendly ASCII-only version of name_short, can be NULL */
/* if name_short has non-ASCII chars, name_alt should be present */
- char *name_display; /* can be NULL */
+ const char *name_display; /* can be NULL */
double scalar;
double bias; /* not used yet, needed for converting temperature */
@@ -259,6 +256,8 @@ static struct bUnitCollection buNaturalTimeCollecton = {buNaturalTimeDef, 3, 0,
static struct bUnitDef buNaturalRotDef[] = {
{"degree", "degrees", "°", NULL, "Degrees", M_PI/180.0, 0.0, B_UNIT_DEF_NONE},
+// {"radian", "radians", "r", NULL, "Radians", 1.0, 0.0, B_UNIT_DEF_NONE},
+// {"turn", "turns", "t", NULL, "Turns", 1.0/(M_PI*2.0), 0.0,B_UNIT_DEF_NONE},
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
static struct bUnitCollection buNaturalRotCollection = {buNaturalRotDef, 0, 0, sizeof(buNaturalRotDef)/sizeof(bUnitDef)};
@@ -276,6 +275,7 @@ static struct bUnitCollection *bUnitSystems[][9] = {
/* internal, has some option not exposed */
static bUnitCollection *unit_get_system(int system, int type)
{
+ assert((system > -1) && (system < UNIT_SYSTEM_TOT) && (type > -1) && (type < B_UNIT_TYPE_TOT));
return bUnitSystems[system][type]; /* select system to use, metric/imperial/other? */
}
@@ -338,7 +338,8 @@ static int unit_as_string(char *str, int len_max, double value, int prec, bUnitC
/* Convert to a string */
{
- char conv_str[6] = {'%', '.', '0'+prec, 'l', 'f', '\0'}; /* "%.2lf" when prec is 2, must be under 10 */
+ char conv_str[6] = {'%', '.', '0', 'l', 'f', '\0'}; /* "%.2lf" when prec is 2, must be under 10 */
+ conv_str[2] += prec;
len= snprintf(str, len_max, conv_str, (float)value_conv);
if(len >= len_max)
@@ -398,7 +399,6 @@ void bUnit_AsString(char *str, int len_max, double value, int prec, int system,
/* split output makes sense only for length, mass and time */
if(split && (type==B_UNIT_LENGTH || type==B_UNIT_MASS || type==B_UNIT_TIME)) {
- int i;
bUnitDef *unit_a, *unit_b;
double value_a, value_b;
@@ -406,7 +406,7 @@ void bUnit_AsString(char *str, int len_max, double value, int prec, int system,
/* check the 2 is a smaller unit */
if(unit_b > unit_a) {
- i= unit_as_string(str, len_max, value_a, prec, usys, unit_a, '\0');
+ int i= unit_as_string(str, len_max, value_a, prec, usys, unit_a, '\0');
/* is there enough space for at least 1 char of the next unit? */
if(i+2 < len_max) {
@@ -423,7 +423,7 @@ void bUnit_AsString(char *str, int len_max, double value, int prec, int system,
}
-static char *unit_find_str(char *str, char *substr)
+static char *unit_find_str(char *str, const char *substr)
{
char *str_found;
@@ -478,7 +478,7 @@ static int ch_is_op(char op)
}
}
-static int unit_scale_str(char *str, int len_max, char *str_tmp, double scale_pref, bUnitDef *unit, char *replace_str)
+static int unit_scale_str(char *str, int len_max, char *str_tmp, double scale_pref, bUnitDef *unit, const char *replace_str)
{
char *str_found;
@@ -688,7 +688,7 @@ void bUnit_ToUnitAltName(char *str, int len_max, char *orig_str, int system, int
found= unit_find_str(orig_str, unit->name_short);
if(found) {
- int offset= found - orig_str;
+ int offset= (int)(found - orig_str);
int len_name= 0;
/* copy everything before the unit */
@@ -740,7 +740,7 @@ double bUnit_BaseScalar(int system, int type)
/* external access */
int bUnit_IsValid(int system, int type)
{
- return !(type < 0 || type >= B_UNIT_MAXDEF || system < 0 || system > UNIT_SYSTEM_TOT);
+ return !(system < 0 || system > UNIT_SYSTEM_TOT || type < 0 || type > B_UNIT_TYPE_TOT);
}
@@ -757,11 +757,16 @@ void bUnit_GetSystem(void **usys_pt, int *len, int system, int type)
*len= usys->length;
}
-char *bUnit_GetName(void *usys_pt, int index)
+int bUnit_GetBaseUnit(void *usys_pt)
+{
+ return ((bUnitCollection *)usys_pt)->base_unit;
+}
+
+const char *bUnit_GetName(void *usys_pt, int index)
{
return ((bUnitCollection *)usys_pt)->units[index].name;
}
-char *bUnit_GetNameDisplay(void *usys_pt, int index)
+const char *bUnit_GetNameDisplay(void *usys_pt, int index)
{
return ((bUnitCollection *)usys_pt)->units[index].name_display;
}
diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c
index 42df92443f3..a86b039e918 100644
--- a/source/blender/blenkernel/intern/world.c
+++ b/source/blender/blenkernel/intern/world.c
@@ -63,7 +63,7 @@ void free_world(World *wrld)
}
-World *add_world(char *name)
+World *add_world(const char *name)
{
Main *bmain= G.main;
World *wrld;
diff --git a/source/blender/blenkernel/intern/writeavi.c b/source/blender/blenkernel/intern/writeavi.c
index 00614ef0f4f..014a15de1ef 100644
--- a/source/blender/blenkernel/intern/writeavi.c
+++ b/source/blender/blenkernel/intern/writeavi.c
@@ -38,10 +38,12 @@
#include "DNA_scene_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
+
#include "BKE_writeavi.h"
#include "AVI_avi.h"
@@ -119,7 +121,7 @@ static void filepath_avi (char *string, RenderData *rd)
if (string==NULL) return;
strcpy(string, rd->pic);
- BLI_path_abs(string, G.sce);
+ BLI_path_abs(string, G.main->name);
BLI_make_existing_file(string);
@@ -137,6 +139,8 @@ static int start_avi(Scene *scene, RenderData *rd, int rectx, int recty, ReportL
int quality;
double framerate;
+ (void)scene; /* unused */
+
filepath_avi(name, rd);
sframe = (rd->sfra);
@@ -175,7 +179,7 @@ static int start_avi(Scene *scene, RenderData *rd, int rectx, int recty, ReportL
return 1;
}
-static int append_avi(RenderData *rd, int frame, int *pixels, int rectx, int recty, ReportList *reports)
+static int append_avi(RenderData *UNUSED(rd), int frame, int *pixels, int rectx, int recty, ReportList *UNUSED(reports))
{
unsigned int *rt1, *rt2, *rectot;
int x, y;
diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c
index 6cd207f628c..bb00e6de5ce 100644
--- a/source/blender/blenkernel/intern/writeffmpeg.c
+++ b/source/blender/blenkernel/intern/writeffmpeg.c
@@ -19,7 +19,7 @@
#include <string.h>
#include <stdio.h>
-#if defined(_WIN32) && defined(_DEBUG) && !defined(__MINGW32__) && !defined(__CYGWIN__)
+#if defined(_WIN32) && defined(DEBUG) && !defined(__MINGW32__) && !defined(__CYGWIN__)
/* This does not seem necessary or present on MSVC 8, but may be needed in earlier versions? */
#if _MSC_VER < 1400
#include <stdint.h>
@@ -69,7 +69,7 @@
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
-extern void do_init_ffmpeg();
+extern void do_init_ffmpeg(void);
static int ffmpeg_type = 0;
static int ffmpeg_codec = CODEC_ID_MPEG4;
@@ -160,7 +160,7 @@ static int write_audio_frame(void)
pkt.stream_index = audio_stream->index;
pkt.flags |= PKT_FLAG_KEY;
if (av_interleaved_write_frame(outfile, &pkt) != 0) {
- // XXX error("Error writing audio packet");
+ fprintf(stderr, "Error writing audio packet!\n");
return -1;
}
return 0;
@@ -290,7 +290,9 @@ static int write_video_frame(RenderData *rd, AVFrame* frame, ReportList *reports
packet.data = video_buffer;
packet.size = outsize;
ret = av_interleaved_write_frame(outfile, &packet);
- } else ret = 0;
+ } else {
+ ret = 0;
+ }
if (ret != 0) {
success= 0;
@@ -778,6 +780,69 @@ static int start_ffmpeg_impl(struct RenderData *rd, int rectx, int recty, Report
return 1;
}
+/**
+ * Writes any delayed frames in the encoder. This function is called before
+ * closing the encoder.
+ *
+ * <p>
+ * Since an encoder may use both past and future frames to predict
+ * inter-frames (H.264 B-frames, for example), it can output the frames
+ * in a different order from the one it was given.
+ * For example, when sending frames 1, 2, 3, 4 to the encoder, it may write
+ * them in the order 1, 4, 2, 3 - first the two frames used for predition,
+ * and then the bidirectionally-predicted frames. What this means in practice
+ * is that the encoder may not immediately produce one output frame for each
+ * input frame. These delayed frames must be flushed before we close the
+ * stream. We do this by calling avcodec_encode_video with NULL for the last
+ * parameter.
+ * </p>
+ */
+void flush_ffmpeg(void)
+{
+ int outsize = 0;
+ int ret = 0;
+
+ AVCodecContext* c = get_codec_from_stream(video_stream);
+ /* get the delayed frames */
+ while (1) {
+ AVPacket packet;
+ av_init_packet(&packet);
+
+ outsize = avcodec_encode_video(c, video_buffer, video_buffersize, NULL);
+ if (outsize < 0) {
+ fprintf(stderr, "Error encoding delayed frame %d\n", outsize);
+ break;
+ }
+ if (outsize == 0) {
+ break;
+ }
+ if (c->coded_frame->pts != AV_NOPTS_VALUE) {
+#ifdef FFMPEG_CODEC_TIME_BASE
+ packet.pts = av_rescale_q(c->coded_frame->pts,
+ c->time_base,
+ video_stream->time_base);
+#else
+ packet.pts = c->coded_frame->pts;
+#endif
+ fprintf(stderr, "Video Frame PTS: %d\n", (int)packet.pts);
+ } else {
+ fprintf(stderr, "Video Frame PTS: not set\n");
+ }
+ if (c->coded_frame->key_frame) {
+ packet.flags |= PKT_FLAG_KEY;
+ }
+ packet.stream_index = video_stream->index;
+ packet.data = video_buffer;
+ packet.size = outsize;
+ ret = av_interleaved_write_frame(outfile, &packet);
+ if (ret != 0) {
+ fprintf(stderr, "Error writing delayed frame %d\n", ret);
+ break;
+ }
+ }
+ avcodec_flush_buffers(get_codec_from_stream(video_stream));
+}
+
/* **********************************************************************
* public interface
********************************************************************** */
@@ -792,7 +857,7 @@ void filepath_ffmpeg(char* string, RenderData* rd) {
if (!string || !exts) return;
strcpy(string, rd->pic);
- BLI_path_abs(string, G.sce);
+ BLI_path_abs(string, G.main->name);
BLI_make_existing_file(string);
@@ -888,10 +953,9 @@ int append_ffmpeg(RenderData *rd, int frame, int *pixels, int rectx, int recty,
return success;
}
-
void end_ffmpeg(void)
{
- int i;
+ unsigned int i;
fprintf(stderr, "Closing ffmpeg...\n");
@@ -905,6 +969,11 @@ void end_ffmpeg(void)
audio_mixdown_device = 0;
}
+ if (video_stream && get_codec_from_stream(video_stream)) {
+ fprintf(stderr, "Flushing delayed frames...\n");
+ flush_ffmpeg ();
+ }
+
if (outfile) {
av_write_trailer(outfile);
}
@@ -913,8 +982,8 @@ void end_ffmpeg(void)
if (video_stream && get_codec_from_stream(video_stream)) {
avcodec_close(get_codec_from_stream(video_stream));
- video_stream = 0;
printf("zero video stream %p\n", video_stream);
+ video_stream = 0;
}
@@ -989,6 +1058,8 @@ IDProperty *ffmpeg_property_add(RenderData *rd, char * type, int opt_index, int
IDPropertyTemplate val;
int idp_type;
char name[256];
+
+ val.i = 0;
avcodec_get_context_defaults(&c);
@@ -996,8 +1067,6 @@ IDProperty *ffmpeg_property_add(RenderData *rd, char * type, int opt_index, int
parent = c.av_class->option + parent_index;
if (!rd->ffcodecdata.properties) {
- IDPropertyTemplate val;
-
rd->ffcodecdata.properties
= IDP_New(IDP_GROUP, val, "ffmpeg");
}
@@ -1006,8 +1075,6 @@ IDProperty *ffmpeg_property_add(RenderData *rd, char * type, int opt_index, int
rd->ffcodecdata.properties, (char*) type);
if (!group) {
- IDPropertyTemplate val;
-
group = IDP_New(IDP_GROUP, val, (char*) type);
IDP_AddToGroup(rd->ffcodecdata.properties, group);
}
@@ -1195,20 +1262,47 @@ void ffmpeg_set_preset(RenderData *rd, int preset)
rd->ffcodecdata.mux_packet_size = 2048;
rd->ffcodecdata.mux_rate = 10080000;
+ /*
+ * All options here are for x264, but must be set via ffmpeg.
+ * The names are therefore different - Search for "x264 to FFmpeg option mapping"
+ * to get a list.
+ */
+
+ /*
+ * Use CABAC coder. Using "coder:1", which should be equivalent,
+ * crashes Blender for some reason. Either way - this is no big deal.
+ */
ffmpeg_property_add_string(rd, "video", "coder:vlc");
+
+ /*
+ * The other options were taken from the libx264-default.preset
+ * included in the ffmpeg distribution.
+ */
ffmpeg_property_add_string(rd, "video", "flags:loop");
ffmpeg_property_add_string(rd, "video", "cmp:chroma");
ffmpeg_property_add_string(rd, "video", "partitions:parti4x4");
ffmpeg_property_add_string(rd, "video", "partitions:partp8x8");
ffmpeg_property_add_string(rd, "video", "partitions:partb8x8");
ffmpeg_property_add_string(rd, "video", "me:hex");
- ffmpeg_property_add_string(rd, "video", "subq:5");
+ ffmpeg_property_add_string(rd, "video", "subq:6");
ffmpeg_property_add_string(rd, "video", "me_range:16");
+ ffmpeg_property_add_string(rd, "video", "qdiff:4");
ffmpeg_property_add_string(rd, "video", "keyint_min:25");
ffmpeg_property_add_string(rd, "video", "sc_threshold:40");
ffmpeg_property_add_string(rd, "video", "i_qfactor:0.71");
ffmpeg_property_add_string(rd, "video", "b_strategy:1");
-
+ ffmpeg_property_add_string(rd, "video", "bf:3");
+ ffmpeg_property_add_string(rd, "video", "refs:2");
+ ffmpeg_property_add_string(rd, "video", "qcomp:0.6");
+ ffmpeg_property_add_string(rd, "video", "directpred:3");
+ ffmpeg_property_add_string(rd, "video", "trellis:0");
+ ffmpeg_property_add_string(rd, "video", "flags2:wpred");
+ ffmpeg_property_add_string(rd, "video", "flags2:dct8x8");
+ ffmpeg_property_add_string(rd, "video", "flags2:fastpskip");
+ ffmpeg_property_add_string(rd, "video", "wpredp:2");
+
+ // This makes x264 output lossless. Will be a separate option later.
+ //ffmpeg_property_add_string(rd, "video", "cqp:0");
break;
case FFMPEG_PRESET_THEORA:
diff --git a/source/blender/blenkernel/intern/writeframeserver.c b/source/blender/blenkernel/intern/writeframeserver.c
index b0c05c31fa1..eb1c66604f8 100644
--- a/source/blender/blenkernel/intern/writeframeserver.c
+++ b/source/blender/blenkernel/intern/writeframeserver.c
@@ -47,6 +47,9 @@
#include "DNA_userdef_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_global.h"
#include "BKE_report.h"
@@ -61,31 +64,31 @@ static int render_height;
#if defined(_WIN32)
-static int startup_socket_system()
+static int startup_socket_system(void)
{
WSADATA wsa;
return (WSAStartup(MAKEWORD(2,0),&wsa) == 0);
}
-static void shutdown_socket_system()
+static void shutdown_socket_system(void)
{
WSACleanup();
}
-static int select_was_interrupted_by_signal()
+static int select_was_interrupted_by_signal(void)
{
return (WSAGetLastError() == WSAEINTR);
}
#else
-static int startup_socket_system()
+static int startup_socket_system(void)
{
return 1;
}
-static void shutdown_socket_system()
+static void shutdown_socket_system(void)
{
}
-static int select_was_interrupted_by_signal()
+static int select_was_interrupted_by_signal(void)
{
return (errno == EINTR);
}
@@ -96,10 +99,12 @@ static int closesocket(int fd)
}
#endif
-int start_frameserver(struct Scene *scene, RenderData *rd, int rectx, int recty, ReportList *reports)
+int start_frameserver(struct Scene *scene, RenderData *UNUSED(rd), int rectx, int recty, ReportList *reports)
{
struct sockaddr_in addr;
int arg = 1;
+
+ (void)scene; /* unused */
if (!startup_socket_system()) {
BKE_report(reports, RPT_ERROR, "Can't startup socket system");
@@ -243,7 +248,7 @@ static int handle_request(RenderData *rd, char * req)
return -1;
}
-int frameserver_loop(RenderData *rd, ReportList *reports)
+int frameserver_loop(RenderData *rd, ReportList *UNUSED(reports))
{
fd_set readfds;
struct timeval tv;
@@ -350,7 +355,7 @@ static void serve_ppm(int *pixels, int rectx, int recty)
connsock = -1;
}
-int append_frameserver(RenderData *rd, int frame, int *pixels, int rectx, int recty, ReportList *reports)
+int append_frameserver(RenderData *UNUSED(rd), int frame, int *pixels, int rectx, int recty, ReportList *UNUSED(reports))
{
fprintf(stderr, "Serving frame: %d\n", frame);
if (write_ppm) {
@@ -364,7 +369,7 @@ int append_frameserver(RenderData *rd, int frame, int *pixels, int rectx, int re
return 0;
}
-void end_frameserver()
+void end_frameserver(void)
{
if (connsock != -1) {
closesocket(connsock);
diff --git a/source/blender/blenlib/BLI_args.h b/source/blender/blenlib/BLI_args.h
index cc4d65980c9..2927314e225 100644
--- a/source/blender/blenlib/BLI_args.h
+++ b/source/blender/blenlib/BLI_args.h
@@ -44,13 +44,13 @@ void BLI_argsFree(struct bArgs *ba);
/* pass starts at 1, -1 means valid all the time
* short_arg or long_arg can be null to specify no short or long versions
* */
-void BLI_argsAdd(struct bArgs *ba, int pass, char *short_arg, char *long_arg, char *doc, BA_ArgCallback cb, void *data);
+void BLI_argsAdd(struct bArgs *ba, int pass, const char *short_arg, const char *long_arg, const char *doc, BA_ArgCallback cb, void *data);
/* short_case and long_case specify if those arguments are case specific */
-void BLI_argsAddCase(struct bArgs *ba, int pass, char *short_arg, int short_case, char *long_arg, int long_case, char *doc, BA_ArgCallback cb, void *data);
+void BLI_argsAddCase(struct bArgs *ba, int pass, const char *short_arg, int short_case, const char *long_arg, int long_case, const char *doc, BA_ArgCallback cb, void *data);
void BLI_argsParse(struct bArgs *ba, int pass, BA_ArgCallback default_cb, void *data);
-void BLI_argsPrintArgDoc(struct bArgs *ba, char *arg);
+void BLI_argsPrintArgDoc(struct bArgs *ba, const char *arg);
void BLI_argsPrintOtherDoc(struct bArgs *ba);
void BLI_argsPrint(struct bArgs *ba);
diff --git a/source/blender/blenlib/BLI_bfile.h b/source/blender/blenlib/BLI_bfile.h
deleted file mode 100644
index 71e771fb4fa..00000000000
--- a/source/blender/blenlib/BLI_bfile.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/* -*- indent-tabs-mode:t; tab-width:4; -*-
- *
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2009 by Stichting Blender Foundation.
- * All rights reserved.
- *
- * ***** END GPL LICENSE BLOCK *****
- * BFILE* based abstraction of file access.
- */
-
-#ifndef BLI_BFILE_H
-#define BLI_BFILE_H
-
-/* For fopen's FILE */
-#include <stdio.h>
-
-/**
- Defines for the bflags param.
- */
-/* Special handling, pick one of: */
-/* For "symmetry" of flags */
-#define BFILE_NORMAL (0)
-/* No supervision, just translate // if needed, RISKY */
-#define BFILE_RAW (1<<0)
-/* Path is for current session temp files */
-#define BFILE_TEMP (1<<1)
-/* Path is based in env vars of matching name */
-#define BFILE_CONFIG_BASE (1<<2)
-#define BFILE_CONFIG_DATAFILES (1<<3)
-#define BFILE_CONFIG_PYTHON (1<<4)
-#define BFILE_CONFIG_PLUGINS (1<<5)
-
-/* Config handling, special cases: */
-#define BFILE_USERONLY (1<<6)
-#define BFILE_SYSONLY (1<<7)
-
-/* Compression to apply on close: */
-#define BFILE_GZIP (1<<8)
-#define BFILE_LZMA (1<<9)
-
-/**
- File descriptor for Blender abstracted file access.
- */
-typedef struct {
- FILE *stream;
- int fd;
-
- /* Anything below should not be touched directly */
- int uflags; /* Special options requested by upper level, copy of bflags */
- char *fpath; /* Final/requested path name */
- char *tpath; /* Temp path name if applicable */
- int classf; /* Own flags, common classification of open and fopen */
- int error; /* An op caused an error, unsafe to replace older files */
-} BFILE;
-
-/**
- Open a BFILE* with fopen()-like syntax.
- */
-BFILE *BLI_bfile_fopen(const char *path, const char *mode, int bflags, const char *relpath);
-
-/**
- Open a BFILE* with open()-like syntax.
- */
-BFILE *BLI_bfile_open(const char *pathname, int flags, int bflags, const char *relpath);
-
-/**
- Get the FILE* associated with the BFILE*.
- */
-FILE *BLI_bfile_file_from_bfile(BFILE *bfile);
-
-/**
- Get the fd associated with the BFILE*.
- */
-int BLI_bfile_fd_from_bfile(BFILE *bfile);
-
-/**
- write()-like using BFILE*.
- */
-ssize_t BLI_bfile_write(BFILE *f, const void *buf, size_t count);
-
-/**
- read()-like using BFILE*.
- */
-ssize_t BLI_bfile_read(BFILE *f, void *buf, size_t count);
-
-/**
- fwrite()-like using BFILE*.
- */
-size_t BLI_bfile_fwrite(const void *ptr, size_t size, size_t nmemb, BFILE *f);
-
-/**
- fread()-like using BFILE*.
- */
-size_t BLI_bfile_fread(void *ptr, size_t size, size_t nmemb, BFILE *f);
-
-/**
- Close a BFILE, to match close() and fclose().
- */
-void BLI_bfile_close(BFILE *bfile);
-
-/**
- Clear error status.
- Call it only if the error has been really handled.
- */
-void BLI_bfile_clear_error(BFILE *bfile);
-
-/**
- Set the error status.
- Call it to mark writing by a 3rd party failed (libjpeg reported error, ie).
- */
-void BLI_bfile_set_error(BFILE *bfile, int error);
-
-/*
-TODO
-Maybe also provide more OS/libc things like:
-fflush
-fprintf and related
-fscanf
-fgetc/fputc and related
-fseek and related
-
-Probably good to do:
-readdir (compacted list showing all files for a "directory" (user versions on top of system's))
-*/
-
-#endif /* ifndef BLI_BFILE_H */
diff --git a/source/blender/blenlib/BLI_blenlib.h b/source/blender/blenlib/BLI_blenlib.h
index 3028161734c..8423c07e7c9 100644
--- a/source/blender/blenlib/BLI_blenlib.h
+++ b/source/blender/blenlib/BLI_blenlib.h
@@ -84,8 +84,6 @@ extern "C" {
#include "BLI_rect.h"
-#include "BLI_scanfill.h"
-
#include "BLI_noise.h"
/**
diff --git a/source/blender/blenlib/BLI_boxpack2d.h b/source/blender/blenlib/BLI_boxpack2d.h
index 4beb2988fb6..008af55e1d0 100644
--- a/source/blender/blenlib/BLI_boxpack2d.h
+++ b/source/blender/blenlib/BLI_boxpack2d.h
@@ -29,24 +29,6 @@
/* Box Packer */
-/* verts, internal use only */
-typedef struct boxVert {
- float x;
- float y;
- short free;
-
- struct boxPack *trb; /* top right box */
- struct boxPack *blb; /* bottom left box */
- struct boxPack *brb; /* bottom right box */
- struct boxPack *tlb; /* top left box */
-
- /* Store last intersecting boxes here
- * speedup intersection testing */
- struct boxPack *isect_cache[4];
-
- int index;
-} boxVert;
-
typedef struct boxPack {
float x;
float y;
@@ -56,8 +38,8 @@ typedef struct boxPack {
/* Verts this box uses
* (BL,TR,TL,BR) / 0,1,2,3 */
- boxVert *v[4];
+ struct boxVert *v[4];
} boxPack;
-void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height);
+void boxPack2D(boxPack *boxarray, const int len, float *tot_width, float *tot_height);
diff --git a/source/blender/blenlib/BLI_bpath.h b/source/blender/blenlib/BLI_bpath.h
index 72489a171b9..8c351d6020d 100644
--- a/source/blender/blenlib/BLI_bpath.h
+++ b/source/blender/blenlib/BLI_bpath.h
@@ -32,48 +32,31 @@
#ifndef BLI_BPATH_H
#define BLI_BPATH_H
-struct BPathIteratorSeqData {
- int totseq;
- int seq;
- struct Sequence **seqar; /* Sequence */
- struct Scene *scene; /* Current scene */
-};
+struct BPathIterator;
+struct ReportList;
+struct Main;
-struct BPathIterator {
- char* path;
- char* lib;
- char* name;
- void* data;
- int len;
- int type;
-
- void (*setpath_callback)(struct BPathIterator *, char *);
- void (*getpath_callback)(struct BPathIterator *, char *);
-
- char* base_path; /* base path, the directry the blend file is in - normally G.sce */
-
- /* only for seq data */
- struct BPathIteratorSeqData seqdata;
-};
-
-void BLI_bpathIterator_init (struct BPathIterator *bpi, char *base_path);
+void BLI_bpathIterator_init (struct BPathIterator **bpi, struct Main *bmain, const char *basedir, const int flag);
void BLI_bpathIterator_free (struct BPathIterator *bpi);
-char* BLI_bpathIterator_getLib (struct BPathIterator *bpi);
-char* BLI_bpathIterator_getName (struct BPathIterator *bpi);
+const char* BLI_bpathIterator_getLib (struct BPathIterator *bpi);
+const char* BLI_bpathIterator_getName (struct BPathIterator *bpi);
int BLI_bpathIterator_getType (struct BPathIterator *bpi);
int BLI_bpathIterator_getPathMaxLen (struct BPathIterator *bpi);
+const char* BLI_bpathIterator_getBasePath (struct BPathIterator *bpi);
void BLI_bpathIterator_step (struct BPathIterator *bpi);
int BLI_bpathIterator_isDone (struct BPathIterator *bpi);
void BLI_bpathIterator_getPath (struct BPathIterator *bpi, char *path);
void BLI_bpathIterator_getPathExpanded (struct BPathIterator *bpi, char *path_expanded);
-void BLI_bpathIterator_setPath (struct BPathIterator *bpi, char *path);
+void BLI_bpathIterator_setPath (struct BPathIterator *bpi, const char *path);
/* high level funcs */
/* creates a text file with missing files if there are any */
-void checkMissingFiles(char *basepath, ReportList *reports);
-void makeFilesRelative(char *basepath, ReportList *reports);
-void makeFilesAbsolute(char *basepath, ReportList *reports);
-void findMissingFiles(char *basepath, char *str);
+void checkMissingFiles(struct Main *bmain, struct ReportList *reports);
+void makeFilesRelative(struct Main *bmain, const char *basedir, struct ReportList *reports);
+void makeFilesAbsolute(struct Main *bmain, const char *basedir, struct ReportList *reports);
+void findMissingFiles(struct Main *bmain, const char *str);
+
+#define BPATH_USE_PACKED 1
#endif // BLI_BPATH_H
diff --git a/source/blender/blenlib/BLI_dynstr.h b/source/blender/blenlib/BLI_dynstr.h
index c5158264e72..34e77007d95 100644
--- a/source/blender/blenlib/BLI_dynstr.h
+++ b/source/blender/blenlib/BLI_dynstr.h
@@ -75,7 +75,11 @@ void BLI_dynstr_nappend (DynStr *ds, const char *cstr, int len);
* @param ds The DynStr to append to.
* @param format The printf format string to use.
*/
-void BLI_dynstr_appendf (DynStr *ds, const char *format, ...);
+void BLI_dynstr_appendf (DynStr *ds, const char *format, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 2, 3)));
+#endif
+;
void BLI_dynstr_vappendf (DynStr *ds, const char *format, va_list args);
/**
diff --git a/source/blender/blenlib/BLI_editVert.h b/source/blender/blenlib/BLI_editVert.h
index 2d54e420bb1..051778772e0 100644
--- a/source/blender/blenlib/BLI_editVert.h
+++ b/source/blender/blenlib/BLI_editVert.h
@@ -68,7 +68,7 @@ typedef struct EditVert
unsigned char f, h, f1, f2;
float bweight;
short fast; /* only 0 or 1, for editmesh_fastmalloc, do not store temp data here! */
- int hash;
+ int hash; /* internal editmesh.c use only, don't touch! */
int keyindex; /* original index #, for restoring key information */
void *data; /* custom vertex data */
diff --git a/source/blender/blenlib/BLI_fileops.h b/source/blender/blenlib/BLI_fileops.h
index 6c98d30e4b1..95d890f133f 100644
--- a/source/blender/blenlib/BLI_fileops.h
+++ b/source/blender/blenlib/BLI_fileops.h
@@ -36,29 +36,33 @@
#ifndef BLI_FILEOPS_H
#define BLI_FILEOPS_H
-void BLI_recurdir_fileops(char *dirname);
-int BLI_link(char *file, char *to);
-int BLI_is_writable(char *filename);
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void BLI_recurdir_fileops(const char *dirname);
+int BLI_link(const char *file, const char *to);
+int BLI_is_writable(const char *filename);
/**
* @attention Do not confuse with BLI_exist
*/
-int BLI_exists(char *file);
-int BLI_copy_fileops(char *file, char *to);
-int BLI_rename(char *from, char *to);
-int BLI_gzip(char *from, char *to);
-int BLI_delete(char *file, int dir, int recursive);
-int BLI_move(char *file, char *to);
+int BLI_exists(const char *file);
+int BLI_copy_fileops(const char *file, const char *to);
+int BLI_rename(const char *from, const char *to);
+int BLI_gzip(const char *from, const char *to);
+int BLI_delete(const char *file, int dir, int recursive);
+int BLI_move(const char *file, const char *to);
int BLI_touch(const char *file);
-char *BLI_last_slash(const char *string);
-int BLI_add_slash(char *string);
-void BLI_del_slash(char *string);
-char *first_slash(char *string);
/* only for the sane unix world: direct calls to system functions :( */
#ifndef WIN32
void BLI_setCmdCallBack(int (*f)(char*));
#endif
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/blenlib/BLI_ghash.h b/source/blender/blenlib/BLI_ghash.h
index 0e985184f7a..46c0f767b5f 100644
--- a/source/blender/blenlib/BLI_ghash.h
+++ b/source/blender/blenlib/BLI_ghash.h
@@ -40,13 +40,11 @@ extern "C" {
#include <stdlib.h>
#include <string.h>
-#include "BKE_utildefines.h"
-
#include "BLI_mempool.h"
#include "BLI_blenlib.h"
-typedef unsigned int (*GHashHashFP) (void *key);
-typedef int (*GHashCmpFP) (void *a, void *b);
+typedef unsigned int (*GHashHashFP) (const void *key);
+typedef int (*GHashCmpFP) (const void *a, const void *b);
typedef void (*GHashKeyFreeFP) (void *key);
typedef void (*GHashValFreeFP) (void *val);
@@ -141,14 +139,14 @@ int BLI_ghashIterator_isDone (GHashIterator *ghi);
/* *** */
-unsigned int BLI_ghashutil_ptrhash (void *key);
-int BLI_ghashutil_ptrcmp (void *a, void *b);
+unsigned int BLI_ghashutil_ptrhash (const void *key);
+int BLI_ghashutil_ptrcmp (const void *a, const void *b);
-unsigned int BLI_ghashutil_strhash (void *key);
-int BLI_ghashutil_strcmp (void *a, void *b);
+unsigned int BLI_ghashutil_strhash (const void *key);
+int BLI_ghashutil_strcmp (const void *a, const void *b);
-unsigned int BLI_ghashutil_inthash (void *ptr);
-int BLI_ghashutil_intcmp(void *a, void *b);
+unsigned int BLI_ghashutil_inthash (const void *ptr);
+int BLI_ghashutil_intcmp(const void *a, const void *b);
/*begin of macro-inlined functions*/
extern unsigned int hashsizes[];
@@ -190,7 +188,7 @@ BM_INLINE void BLI_ghash_insert(GHash *gh, void *key, void *val) {
gh->buckets[hash]= e;
if (++gh->nentries>(float)gh->nbuckets/2) {
- Entry *e, **old= gh->buckets;
+ Entry **old= gh->buckets;
int i, nold= gh->nbuckets;
gh->nbuckets= hashsizes[++gh->cursize];
@@ -213,7 +211,7 @@ BM_INLINE void BLI_ghash_insert(GHash *gh, void *key, void *val) {
}
}
-BM_INLINE void* BLI_ghash_lookup(GHash *gh, void *key)
+BM_INLINE void* BLI_ghash_lookup(GHash *gh, const void *key)
{
if(gh) {
unsigned int hash= gh->hashfp(key)%gh->nbuckets;
diff --git a/source/blender/blenlib/BLI_kdopbvh.h b/source/blender/blenlib/BLI_kdopbvh.h
index d9e3d7e42c6..aa55ececc06 100644
--- a/source/blender/blenlib/BLI_kdopbvh.h
+++ b/source/blender/blenlib/BLI_kdopbvh.h
@@ -90,7 +90,7 @@ int BLI_bvhtree_update_node(BVHTree *tree, int index, float *co, float *co_movin
void BLI_bvhtree_update_tree(BVHTree *tree);
/* collision/overlap: check two trees if they overlap, alloc's *overlap with length of the int return value */
-BVHTreeOverlap *BLI_bvhtree_overlap(BVHTree *tree1, BVHTree *tree2, int *result);
+BVHTreeOverlap *BLI_bvhtree_overlap(BVHTree *tree1, BVHTree *tree2, unsigned int *result);
float BLI_bvhtree_getepsilon(BVHTree *tree);
diff --git a/source/blender/blenlib/BLI_listbase.h b/source/blender/blenlib/BLI_listbase.h
index c4dc0894f80..a41b49de242 100644
--- a/source/blender/blenlib/BLI_listbase.h
+++ b/source/blender/blenlib/BLI_listbase.h
@@ -40,13 +40,12 @@
extern "C" {
#endif
-void addlisttolist(struct ListBase *list1, struct ListBase *list2);
void BLI_insertlink(struct ListBase *listbase, void *vprevlink, void *vnewlink);
-void *BLI_findlink(struct ListBase *listbase, int number);
-int BLI_findindex(struct ListBase *listbase, void *vlink);
-void *BLI_findstring(struct ListBase *listbase, const char *id, int offset);
-void *BLI_findstring_ptr(struct ListBase *listbase, const char *id, int offset);
-int BLI_findstringindex(struct ListBase *listbase, const char *id, int offset);
+void *BLI_findlink(const struct ListBase *listbase, int number);
+int BLI_findindex(const struct ListBase *listbase, void *vlink);
+void *BLI_findstring(const struct ListBase *listbase, const char *id, const int offset);
+void *BLI_findstring_ptr(const struct ListBase *listbase, const char *id, const int offset);
+int BLI_findstringindex(const struct ListBase *listbase, const char *id, const int offset);
void BLI_freelistN(struct ListBase *listbase);
void BLI_addtail(struct ListBase *listbase, void *vlink);
void BLI_remlink(struct ListBase *listbase, void *vlink);
@@ -57,9 +56,11 @@ void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnew
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink);
void BLI_sortlist(struct ListBase *listbase, int (*cmp)(void *, void *));
void BLI_freelist(struct ListBase *listbase);
-int BLI_countlist(struct ListBase *listbase);
+int BLI_countlist(const struct ListBase *listbase);
void BLI_freelinkN(struct ListBase *listbase, void *vlink);
-void BLI_duplicatelist(struct ListBase *list1, const struct ListBase *list2);
+
+void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src);
+void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src);
/* create a generic list node containing link to provided data */
struct LinkData *BLI_genericNodeN(void *data);
diff --git a/source/blender/blenlib/BLI_math.h b/source/blender/blenlib/BLI_math.h
index d0fb530e349..29a17f362d4 100644
--- a/source/blender/blenlib/BLI_math.h
+++ b/source/blender/blenlib/BLI_math.h
@@ -25,8 +25,8 @@
* ***** END GPL LICENSE BLOCK *****
* */
-#ifndef BLI_MATH
-#define BLI_MATH
+#ifndef BLI_MATH_H
+#define BLI_MATH_H
/* Abbreviations:
*
@@ -60,5 +60,5 @@
#include "BLI_math_vector.h"
#include "BLI_math_geom.h"
-#endif /* BLI_MATH */
+#endif /* BLI_MATH_H */
diff --git a/source/blender/blenlib/BLI_math_base.h b/source/blender/blenlib/BLI_math_base.h
index 48ad46282c2..9ab9621be01 100644
--- a/source/blender/blenlib/BLI_math_base.h
+++ b/source/blender/blenlib/BLI_math_base.h
@@ -25,8 +25,8 @@
* ***** END GPL LICENSE BLOCK *****
* */
-#ifndef BLI_MATH_BASE
-#define BLI_MATH_BASE
+#ifndef BLI_MATH_BASE_H
+#define BLI_MATH_BASE_H
#ifdef __cplusplus
extern "C" {
@@ -70,6 +70,11 @@ extern "C" {
#define M_LN10 2.30258509299404568402
#endif
+/* non-standard defines, used in some places */
+#ifndef MAXFLOAT
+#define MAXFLOAT ((float)3.40282347e+38)
+#endif
+
#ifndef sqrtf
#define sqrtf(a) ((float)sqrt(a))
#endif
@@ -123,6 +128,7 @@ extern "C" {
#ifndef FREE_WINDOWS
#define isnan(n) _isnan(n)
#define finite _finite
+#define hypot _hypot
#endif
#endif
@@ -134,7 +140,7 @@ extern "C" {
#define CLAMP(a, b, c) if((a)<(b)) (a)=(b); else if((a)>(c)) (a)=(c)
#endif
-#ifdef BLI_MATH_INLINE
+#ifdef BLI_MATH_INLINE_H
#include "intern/math_base_inline.c"
#endif
@@ -167,5 +173,5 @@ double double_round(double x, int ndigits);
}
#endif
-#endif /* BLI_MATH_BASE */
+#endif /* BLI_MATH_BASE_H */
diff --git a/source/blender/blenlib/BLI_math_color.h b/source/blender/blenlib/BLI_math_color.h
index 2f40520e59a..bf466c0f809 100644
--- a/source/blender/blenlib/BLI_math_color.h
+++ b/source/blender/blenlib/BLI_math_color.h
@@ -25,8 +25,8 @@
* ***** END GPL LICENSE BLOCK *****
* */
-#ifndef BLI_MATH_COLOR
-#define BLI_MATH_COLOR
+#ifndef BLI_MATH_COLOR_H
+#define BLI_MATH_COLOR_H
#ifdef __cplusplus
extern "C" {
@@ -61,6 +61,7 @@ void cpack_to_rgb(unsigned int col, float *r, float *g, float *b);
void rgb_to_yuv(float r, float g, float b, float *ly, float *lu, float *lv);
void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr, int colorspace);
void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv);
+void rgb_to_hsv_compat(float r, float g, float b, float *lh, float *ls, float *lv);
unsigned int rgb_to_cpack(float r, float g, float b);
unsigned int hsv_to_cpack(float h, float s, float v);
@@ -88,18 +89,18 @@ int constrain_rgb(float *r, float *g, float *b);
void minmax_rgb(short c[3]);
void rgb_float_set_hue_float_offset(float * rgb, float hue_offset);
-void rgb_byte_set_hue_float_offset(char * rgb, float hue_offset);
+void rgb_byte_set_hue_float_offset(unsigned char * rgb, float hue_offset);
/***************** lift/gamma/gain / ASC-CDL conversion *****************/
void lift_gamma_gain_to_asc_cdl(float *lift, float *gamma, float *gain, float *offset, float *slope, float *power);
-void rgb_byte_to_float(char *in, float *out);
-void rgb_float_to_byte(float *in, char *out);
+void rgb_byte_to_float(const unsigned char *in, float *out);
+void rgb_float_to_byte(const float *in, unsigned char *out);
#ifdef __cplusplus
}
#endif
-#endif /* BLI_MATH_COLOR */
+#endif /* BLI_MATH_COLOR_H */
diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h
index 5d84de7531a..8f939e5dc61 100644
--- a/source/blender/blenlib/BLI_math_geom.h
+++ b/source/blender/blenlib/BLI_math_geom.h
@@ -25,8 +25,8 @@
* ***** END GPL LICENSE BLOCK *****
* */
-#ifndef BLI_MATH_GEOM
-#define BLI_MATH_GEOM
+#ifndef BLI_MATH_GEOM_H
+#define BLI_MATH_GEOM_H
#ifdef __cplusplus
extern "C" {
@@ -34,7 +34,7 @@ extern "C" {
#include "BLI_math_inline.h"
-#ifdef BLI_MATH_INLINE
+#ifdef BLI_MATH_INLINE_H
#include "intern/math_geom_inline.c"
#endif
@@ -58,7 +58,8 @@ float dist_to_line_v2(float p[2], float l1[2], float l2[2]);
float dist_to_line_segment_v2(float p[2], float l1[2], float l2[2]);
float dist_to_line_segment_v3(float p[3], float l1[3], float l2[3]);
-float closest_to_line_v3(float r[3], float p[3], float l1[3], float l2[3]);
+float closest_to_line_v3(float r[3], const float p[3], const float l1[3], const float l2[3]);
+float closest_to_line_v2(float r[2], const float p[2], const float l1[2], const float l2[2]);
void closest_to_line_segment_v3(float r[3], float p[3], float l1[3], float l2[3]);
/******************************* Intersection ********************************/
@@ -71,8 +72,9 @@ void closest_to_line_segment_v3(float r[3], float p[3], float l1[3], float l2[3]
#define ISECT_LINE_LINE_EXACT 1
#define ISECT_LINE_LINE_CROSS 2
-int isect_line_line_v2(float a1[2], float a2[2], float b1[2], float b2[2]);
-int isect_line_line_v2_short(short a1[2], short a2[2], short b1[2], short b2[2]);
+int isect_line_line_v2(const float a1[2], const float a2[2], const float b1[2], const float b2[2]);
+int isect_line_line_v2_short(const short a1[2], const short a2[2], const short b1[2], const short b2[2]);
+int isect_seg_seg_v2_point(const float *v1, const float *v2, const float *v3, const float *v4, float vi[2]);
/* Returns the number of point of interests
* 0 - lines are colinear
@@ -96,7 +98,6 @@ int isect_ray_tri_epsilon_v3(float p1[3], float d[3],
float v0[3], float v1[3], float v2[3], float *lambda, float *uv, float epsilon);
/* point in polygon */
-int isect_point_tri_v2(float p[2], float a[2], float b[2], float c[2]);
int isect_point_quad_v2(float p[2], float a[2], float b[2], float c[2], float d[2]);
int isect_point_tri_v2(float v1[2], float v2[2], float v3[2], float pt[2]);
@@ -119,6 +120,8 @@ int isect_aabb_aabb_v3(float min1[3], float max1[3], float min2[3], float max2[3
int clip_line_plane(float clipco[3], float plane[4], float co[3]);
+void plot_line_v2v2i(int p1[2], int p2[2], int (*callback)(int, int, void *), void *userData);
+
/****************************** Interpolation ********************************/
/* tri or quad, d can be NULL */
@@ -149,6 +152,8 @@ void perspective_m4(float mat[4][4], float left, float right,
float bottom, float top, float nearClip, float farClip);
void orthographic_m4(float mat[4][4], float left, float right,
float bottom, float top, float nearClip, float farClip);
+void window_translate_m4(float winmat[][4], float perspmat[][4],
+ float x, float y);
int box_clip_bounds_m4(float boundbox[2][3],
float bounds[4], float winmat[4][4]);
@@ -163,8 +168,8 @@ void map_to_sphere(float *u, float *v, float x, float y, float z);
/********************************* Tangents **********************************/
typedef struct VertexTangent {
- float tang[3], uv[2];
struct VertexTangent *next;
+ float tang[3], uv[2];
} VertexTangent;
float *find_vertex_tangent(VertexTangent *vtang, float *uv);
@@ -205,5 +210,5 @@ float form_factor_hemi_poly(float p[3], float n[3],
}
#endif
-#endif /* BLI_MATH_GEOM */
+#endif /* BLI_MATH_GEOM_H */
diff --git a/source/blender/blenlib/BLI_math_inline.h b/source/blender/blenlib/BLI_math_inline.h
index d002c0880b2..d07777c90a8 100644
--- a/source/blender/blenlib/BLI_math_inline.h
+++ b/source/blender/blenlib/BLI_math_inline.h
@@ -33,9 +33,9 @@ extern "C" {
#endif
/* add platform/compiler checks here if it is not supported */
-#define BLI_MATH_INLINE
+#define BLI_MATH_INLINE_H
-#ifdef BLI_MATH_INLINE
+#ifdef BLI_MATH_INLINE_H
#ifdef _MSC_VER
#define MINLINE static __forceinline
#define MALWAYS_INLINE MINLINE
diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h
index 77ebcb24975..475bbe8b4b7 100644
--- a/source/blender/blenlib/BLI_math_matrix.h
+++ b/source/blender/blenlib/BLI_math_matrix.h
@@ -25,8 +25,8 @@
* ***** END GPL LICENSE BLOCK *****
* */
-#ifndef BLI_MATH_MATRIX
-#define BLI_MATH_MATRIX
+#ifndef BLI_MATH_MATRIX_H
+#define BLI_MATH_MATRIX_H
#ifdef __cplusplus
extern "C" {
@@ -102,7 +102,9 @@ void transpose_m3(float R[3][3]);
void transpose_m4(float R[4][4]);
void normalize_m3(float R[3][3]);
+void normalize_m3_m3(float R[3][3], float A[3][3]);
void normalize_m4(float R[4][4]);
+void normalize_m4_m4(float R[4][4], float A[4][4]);
void orthogonalize_m3(float R[3][3], int axis);
void orthogonalize_m4(float R[4][4], int axis);
@@ -133,36 +135,42 @@ void scale_m4_fl(float R[4][4], float scale);
float mat3_to_scale(float M[3][3]);
float mat4_to_scale(float M[4][4]);
-void size_to_mat3(float R[3][3], float size[3]);
-void size_to_mat4(float R[4][4], float size[3]);
+void size_to_mat3(float R[3][3], const float size[3]);
+void size_to_mat4(float R[4][4], const float size[3]);
void mat3_to_size(float r[3], float M[3][3]);
void mat4_to_size(float r[3], float M[4][4]);
void translate_m4(float mat[4][4], float tx, float ty, float tz);
-void rotate_m4(float mat[4][4], char axis, float angle);
+void rotate_m4(float mat[4][4], const char axis, const float angle);
+
+
+void mat3_to_rot_size(float rot[3][3], float size[3], float mat3[][3]);
+void mat4_to_loc_rot_size(float loc[3], float rot[3][3], float size[3], float wmat[][4]);
void loc_eul_size_to_mat4(float R[4][4],
- float loc[3], float eul[3], float size[3]);
+ const float loc[3], const float eul[3], const float size[3]);
void loc_eulO_size_to_mat4(float R[4][4],
- float loc[3], float eul[3], float size[3], short order);
+ const float loc[3], const float eul[3], const float size[3], const short order);
void loc_quat_size_to_mat4(float R[4][4],
- float loc[3], float quat[4], float size[3]);
+ const float loc[3], const float quat[4], const float size[3]);
+void loc_axisangle_size_to_mat4(float R[4][4],
+ const float loc[3], const float axis[4], const float angle, const float size[3]);
-void blend_m3_m3m3(float R[3][3], float A[3][3], float B[3][3], float t);
-void blend_m4_m4m4(float R[4][4], float A[4][4], float B[4][4], float t);
+void blend_m3_m3m3(float R[3][3], float A[3][3], float B[3][3], const float t);
+void blend_m4_m4m4(float R[4][4], float A[4][4], float B[4][4], const float t);
int is_negative_m3(float mat[3][3]);
int is_negative_m4(float mat[4][4]);
/*********************************** Other ***********************************/
-void print_m3(char *str, float M[3][3]);
-void print_m4(char *str, float M[3][4]);
+void print_m3(const char *str, float M[3][3]);
+void print_m4(const char *str, float M[3][4]);
#ifdef __cplusplus
}
#endif
-#endif /* BLI_MATH_MATRIX */
+#endif /* BLI_MATH_MATRIX_H */
diff --git a/source/blender/blenlib/BLI_math_rotation.h b/source/blender/blenlib/BLI_math_rotation.h
index 1b3f4dced02..7d0b8dfeaf3 100644
--- a/source/blender/blenlib/BLI_math_rotation.h
+++ b/source/blender/blenlib/BLI_math_rotation.h
@@ -25,8 +25,8 @@
* ***** END GPL LICENSE BLOCK *****
* */
-#ifndef BLI_MATH_ROTATION
-#define BLI_MATH_ROTATION
+#ifndef BLI_MATH_ROTATION_H
+#define BLI_MATH_ROTATION_H
#ifdef __cplusplus
extern "C" {
@@ -39,6 +39,7 @@ extern "C" {
/* stored in (w, x, y, z) order */
/* init */
+void unit_axis_angle(float axis[3], float *angle);
void unit_qt(float q[4]);
void copy_qt_qt(float q[4], const float a[4]);
@@ -48,29 +49,30 @@ void mul_qt_v3(const float q[4], float r[3]);
void mul_qt_fl(float q[4], const float f);
void mul_fac_qt_fl(float q[4], const float f);
-void sub_qt_qtqt(float q[4], float a[4], float b[4]);
+void sub_qt_qtqt(float q[4], const float a[4], const float b[4]);
void invert_qt(float q[4]);
-void invert_qt_qt(float *q1, const float *q2);
+void invert_qt_qt(float q1[4], const float q2[4]);
void conjugate_qt(float q[4]);
-float dot_qtqt(float a[4], float b[4]);
-void normalize_qt(float q[4]);
+float dot_qtqt(const float a[4], const float b[4]);
+float normalize_qt(float q[4]);
+float normalize_qt_qt(float q1[4], const float q2[4]);
/* comparison */
int is_zero_qt(float q[4]);
/* interpolation */
-void interp_qt_qtqt(float q[4], float a[4], float b[4], float t);
-void add_qt_qtqt(float q[4], float a[4], float b[4], float t);
+void interp_qt_qtqt(float q[4], const float a[4], const float b[4], const float t);
+void add_qt_qtqt(float q[4], const float a[4], const float b[4], const float t);
/* conversion */
-void quat_to_mat3(float mat[3][3], float q[4]);
-void quat_to_mat4(float mat[4][4], float q[4]);
+void quat_to_mat3(float mat[3][3], const float q[4]);
+void quat_to_mat4(float mat[4][4], const float q[4]);
void mat3_to_quat(float q[4], float mat[3][3]);
void mat4_to_quat(float q[4], float mat[4][4]);
-void tri_to_quat(float q[4], float a[3], float b[3], float c[3]);
-void vec_to_quat(float q[4], float vec[3], short axis, short upflag);
+void tri_to_quat(float q[4], const float a[3], const float b[3], const float c[3]);
+void vec_to_quat(float q[4], const float vec[3], short axis, const short upflag);
/* note: v1 and v2 must be normalized */
void rotation_between_vecs_to_quat(float q[4], const float v1[3], const float v2[3]);
void rotation_between_quats_to_quat(float q[4], const float q1[4], const float q2[4]);
@@ -84,11 +86,11 @@ void print_qt(char *str, float q[4]);
/******************************** Axis Angle *********************************/
/* conversion */
-void axis_angle_to_quat(float r[4], float axis[3], float angle);
-void axis_angle_to_mat3(float R[3][3], float axis[3], float angle);
-void axis_angle_to_mat4(float R[4][4], float axis[3], float angle);
+void axis_angle_to_quat(float r[4], const float axis[3], float angle);
+void axis_angle_to_mat3(float R[3][3], const float axis[3], const float angle);
+void axis_angle_to_mat4(float R[4][4], const float axis[3], const float angle);
-void quat_to_axis_angle(float axis[3], float *angle, float q[4]);
+void quat_to_axis_angle(float axis[3], float *angle, const float q[4]);
void mat3_to_axis_angle(float axis[3], float *angle, float M[3][3]);
void mat4_to_axis_angle(float axis[3], float *angle, float M[4][4]);
@@ -100,24 +102,24 @@ void mat4_to_axis_angle(float axis[3], float *angle, float M[4][4]);
void mat3_to_vec_rot(float vec[3], float *phi, float mat[3][3]);
void mat4_to_vec_rot(float vec[3], float *phi, float mat[4][4]);
-void vec_rot_to_quat(float quat[4], float vec[3], float phi);
-void vec_rot_to_mat3(float mat[3][3], float vec[3], float phi);
-void vec_rot_to_mat4(float mat[4][4], float vec[3], float phi);
+void vec_rot_to_quat(float quat[4], const float vec[3], const float phi);
+void vec_rot_to_mat3(float mat[3][3], const float vec[3], const float phi);
+void vec_rot_to_mat4(float mat[4][4], const float vec[3], const float phi);
/******************************** XYZ Eulers *********************************/
-void eul_to_quat(float quat[4], float eul[3]);
-void eul_to_mat3(float mat[3][3], float eul[3]);
-void eul_to_mat4(float mat[4][4], float eul[3]);
+void eul_to_quat(float quat[4], const float eul[3]);
+void eul_to_mat3(float mat[3][3], const float eul[3]);
+void eul_to_mat4(float mat[4][4], const float eul[3]);
-void quat_to_eul(float eul[3], float quat[4]);
+void quat_to_eul(float eul[3], const float quat[4]);
void mat3_to_eul(float eul[3], float mat[3][3]);
void mat4_to_eul(float eul[3], float mat[4][4]);
-void compatible_eul(float eul[3], float old[3]);
-void mat3_to_compatible_eul(float eul[3], float old[3], float mat[3][3]);
+void compatible_eul(float eul[3], const float old[3]);
+void mat3_to_compatible_eul(float eul[3], const float old[3], float mat[3][3]);
-void rotate_eul(float eul[3], char axis, float angle);
+void rotate_eul(float eul[3], const char axis, const float angle);
/************************** Arbitrary Order Eulers ***************************/
@@ -131,20 +133,20 @@ typedef enum eEulerRotationOrders {
EULER_ORDER_YXZ,
EULER_ORDER_YZX,
EULER_ORDER_ZXY,
- EULER_ORDER_ZYX,
+ EULER_ORDER_ZYX
/* there are 6 more entries with dulpicate entries included */
} eEulerRotationOrders;
-void eulO_to_quat(float quat[4], float eul[3], short order);
-void eulO_to_mat3(float mat[3][3], float eul[3], short order);
-void eulO_to_mat4(float mat[4][4], float eul[3], short order);
-void eulO_to_axis_angle(float axis[3], float *angle, float eul[3], short order);
-void eulO_to_gimbal_axis(float gmat[3][3], float eul[3], short order);
+void eulO_to_quat(float quat[4], const float eul[3], const short order);
+void eulO_to_mat3(float mat[3][3], const float eul[3], const short order);
+void eulO_to_mat4(float mat[4][4], const float eul[3], const short order);
+void eulO_to_axis_angle(float axis[3], float *angle, const float eul[3], const short order);
+void eulO_to_gimbal_axis(float gmat[3][3], const float eul[3], const short order);
-void quat_to_eulO(float eul[3], short order, float quat[4]);
-void mat3_to_eulO(float eul[3], short order, float mat[3][3]);
-void mat4_to_eulO(float eul[3], short order, float mat[4][4]);
-void axis_angle_to_eulO(float eul[3], short order, float axis[3], float angle);
+void quat_to_eulO(float eul[3], const short order, const float quat[4]);
+void mat3_to_eulO(float eul[3], const short order, float mat[3][3]);
+void mat4_to_eulO(float eul[3], const short order, float mat[4][4]);
+void axis_angle_to_eulO(float eul[3], const short order, const float axis[3], const float angle);
void mat3_to_compatible_eulO(float eul[3], float old[3], short order, float mat[3][3]);
void mat4_to_compatible_eulO(float eul[3], float old[3], short order, float mat[4][4]);
@@ -169,6 +171,9 @@ void mul_v3m3_dq(float r[3], float R[3][3], DualQuat *dq);
void mat4_to_dquat(DualQuat *r, float base[4][4], float M[4][4]);
void dquat_to_mat4(float R[4][4], DualQuat *dq);
+void quat_apply_track(float quat[4], short axis, short upflag);
+void vec_apply_track(float vec[3], short axis);
+
float lens_to_angle(float lens);
float angle_to_lens(float angle);
@@ -176,5 +181,5 @@ float angle_to_lens(float angle);
}
#endif
-#endif /* BLI_MATH_ROTATION */
+#endif /* BLI_MATH_ROTATION_H */
diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h
index 2192c381611..dcb9311baa0 100644
--- a/source/blender/blenlib/BLI_math_vector.h
+++ b/source/blender/blenlib/BLI_math_vector.h
@@ -25,8 +25,8 @@
* ***** END GPL LICENSE BLOCK *****
* */
-#ifndef BLI_MATH_VECTOR
-#define BLI_MATH_VECTOR
+#ifndef BLI_MATH_VECTOR_H
+#define BLI_MATH_VECTOR_H
#ifdef __cplusplus
extern "C" {
@@ -34,7 +34,7 @@ extern "C" {
#include "BLI_math_inline.h"
-#ifdef BLI_MATH_INLINE
+#ifdef BLI_MATH_INLINE_H
#include "intern/math_vector_inline.c"
#endif
@@ -63,6 +63,8 @@ MINLINE void sub_v2_v2(float r[2], const float a[2]);
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2]);
MINLINE void sub_v3_v3(float r[3], const float a[3]);
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3]);
+MINLINE void sub_v4_v4(float r[4], const float a[4]);
+MINLINE void sub_v4_v4v4(float r[4], const float a[4], const float b[4]);
MINLINE void mul_v2_fl(float r[2], float f);
MINLINE void mul_v2_v2fl(float r[2], const float a[2], float f);
@@ -82,6 +84,8 @@ MINLINE void madd_v4_v4fl(float r[4], const float a[4], float f);
MINLINE void negate_v3(float r[3]);
MINLINE void negate_v3_v3(float r[3], const float a[3]);
+MINLINE void negate_v4(float r[4]);
+MINLINE void negate_v4_v4(float r[4], const float a[3]);
MINLINE float dot_v2v2(const float a[2], const float b[2]);
MINLINE float dot_v3v3(const float a[3], const float b[3]);
@@ -95,6 +99,7 @@ MINLINE void star_m3_v3(float R[3][3],float a[3]);
MINLINE float len_v2(const float a[2]);
MINLINE float len_v2v2(const float a[2], const float b[2]);
+MINLINE float len_squared_v2v2(const float a[3], const float b[3]);
MINLINE float len_v3(const float a[3]);
MINLINE float len_v3v3(const float a[3], const float b[3]);
MINLINE float len_squared_v3v3(const float a[3], const float b[3]);
@@ -114,40 +119,47 @@ void interp_v3_v3v3v3v3(float p[3], const float v1[3], const float v2[3], const
void interp_v4_v4v4(float r[4], const float a[4], const float b[4], const float t);
void interp_v4_v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float w[3]);
-void mid_v3_v3v3(float r[3], float a[3], float b[3]);
+void mid_v3_v3v3(float r[3], const float a[3], const float b[3]);
/********************************* Comparison ********************************/
-MINLINE int is_zero_v3(float a[3]);
-MINLINE int is_one_v3(float a[3]);
+MINLINE int is_zero_v3(const float a[3]);
+MINLINE int is_zero_v4(const float a[4]);
+MINLINE int is_one_v3(const float a[3]);
-MINLINE int equals_v3v3(const float a[3],const float b[3]);
-MINLINE int compare_v3v3(float a[3], float b[3], float limit);
-MINLINE int compare_len_v3v3(float a[3], float b[3], float limit);
+MINLINE int equals_v2v2(const float *v1, const float *v2);
+MINLINE int equals_v3v3(const float a[3], const float b[3]);
+MINLINE int compare_v3v3(const float a[3], const float b[3], const float limit);
+MINLINE int compare_len_v3v3(const float a[3], const float b[3], const float limit);
-MINLINE int compare_v4v4(float a[4], float b[4], float limit);
-MINLINE int equals_v4v4(float a[4], float b[4]);
+MINLINE int compare_v4v4(const float a[4], const float b[4], const float limit);
+MINLINE int equals_v4v4(const float a[4], const float b[4]);
+
+MINLINE float line_point_side_v2(const float l1[2], const float l2[2], const float pt[2]);
/********************************** Angles ***********************************/
/* - angle with 2 arguments is angle between vector */
/* - angle with 3 arguments is angle between 3 points at the middle point */
/* - angle_normalized_* is faster equivalent if vectors are normalized */
-float angle_v2v2(float a[2], float b[2]);
-float angle_v2v2v2(float a[2], float b[2], float c[2]);
-float angle_normalized_v2v2(float a[2], float b[2]);
-float angle_v3v3(float a[2], float b[2]);
-float angle_v3v3v3(float a[2], float b[2], float c[2]);
+float angle_v2v2(const float a[2], const float b[2]);
+float angle_v2v2v2(const float a[2], const float b[2], const float c[2]);
+float angle_normalized_v2v2(const float a[2], const float b[2]);
+float angle_v3v3(const float a[3], const float b[3]);
+float angle_v3v3v3(const float a[3], const float b[3], const float c[3]);
float angle_normalized_v3v3(const float v1[3], const float v2[3]);
void angle_tri_v3(float angles[3], const float v1[3], const float v2[3], const float v3[3]);
void angle_quad_v3(float angles[4], const float v1[3], const float v2[3], const float v3[3], const float v4[3]);
/********************************* Geometry **********************************/
-void project_v3_v3v3(float r[3], float p[3], float n[3]);
-void reflect_v3_v3v3(float r[3], float v[3], float n[3]);
-void ortho_basis_v3v3_v3(float r1[3], float r2[3], float a[3]);
-void bisect_v3_v3v3v3(float r[3], float a[3], float b[3], float c[3]);
+void project_v2_v2v2(float c[2], const float v1[2], const float v2[2]);
+void project_v3_v3v3(float r[3], const float p[3], const float n[3]);
+void reflect_v3_v3v3(float r[3], const float v[3], const float n[3]);
+void ortho_basis_v3v3_v3(float r1[3], float r2[3], const float a[3]);
+void bisect_v3_v3v3v3(float r[3], const float a[3], const float b[3], const float c[3]);
+void rotate_v3_v3v3fl(float v[3], const float p[3], const float axis[3], const float angle);
+void rotate_normalized_v3_v3v3fl(float v[3], const float p[3], const float axis[3], const float angle);
/*********************************** Other ***********************************/
@@ -158,11 +170,25 @@ void print_v4(const char *str, const float a[4]);
MINLINE void normal_short_to_float_v3(float r[3], const short n[3]);
MINLINE void normal_float_to_short_v3(short r[3], const float n[3]);
-void minmax_v3_v3v3(float r[3], float min[3], float max[3]);
+void minmax_v3v3_v3(float min[3], float max[3], const float vec[3]);
+
+/***************************** Array Functions *******************************/
+/* attempted to follow fixed length vertex functions. names could be improved*/
+void range_vni(int *array, const int size, const int start);
+void negate_vn(float *array_tar, const int size);
+void negate_vn_vn(float *array_tar, const float *array_src, const int size);
+void mul_vn_fl(float *array, const int size, const float f);
+void mul_vn_vn_fl(float *array_tar, const float *array_src, const int size, const float f);
+void add_vn_vn(float *array_tar, const float *array_src, const int size);
+void add_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size);
+void sub_vn_vn(float *array_tar, const float *array_src, const int size);
+void sub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size);
+void fill_vni(int *array_tar, const int size, const int val);
+void fill_vn(float *array_tar, const int size, const float val);
#ifdef __cplusplus
}
#endif
-#endif /* BLI_MATH_VECTOR */
+#endif /* BLI_MATH_VECTOR_H */
diff --git a/source/blender/blenlib/BLI_path_util.h b/source/blender/blenlib/BLI_path_util.h
index f01e1a25d8a..85286d15acb 100644
--- a/source/blender/blenlib/BLI_path_util.h
+++ b/source/blender/blenlib/BLI_path_util.h
@@ -42,8 +42,9 @@ struct direntry;
char *BLI_getDefaultDocumentFolder(void);
-char *BLI_get_folder(int folder_id, char *subfolder);
-char *BLI_get_folder_create(int folder_id, char *subfolder);
+char *BLI_get_folder(int folder_id, const char *subfolder);
+char *BLI_get_folder_create(int folder_id, const char *subfolder);
+char *BLI_get_user_folder_notest(int folder_id, const char *subfolder);
/* folder_id */
@@ -87,25 +88,40 @@ char *BLI_get_folder_create(int folder_id, char *subfolder);
#define BLENDER_SYSTEM_FORMAT "%s/blender/%s"
#endif
+#ifdef WIN32
+#define SEP '\\'
+#define ALTSEP '/'
+#else
+#define SEP '/'
+#define ALTSEP '\\'
+#endif
+
void BLI_setenv(const char *env, const char *val);
void BLI_setenv_if_new(const char *env, const char* val);
void BLI_make_file_string(const char *relabase, char *string, const char *dir, const char *file);
void BLI_make_exist(char *dir);
-void BLI_make_existing_file(char *name);
+void BLI_make_existing_file(const char *name);
void BLI_split_dirfile(const char *string, char *dir, char *file);
void BLI_join_dirfile(char *string, const char *dir, const char *file);
char *BLI_path_basename(char *path);
int BKE_rebase_path(char *abs, int abs_size, char *rel, int rel_size, const char *base_dir, const char *src_dir, const char *dest_dir);
+char *BLI_last_slash(const char *string);
+int BLI_add_slash(char *string);
+void BLI_del_slash(char *string);
+char *BLI_first_slash(char *string);
+
void BLI_getlastdir(const char* dir, char *last, int maxlen);
int BLI_testextensie(const char *str, const char *ext);
int BLI_testextensie_array(const char *str, const char **ext_array);
int BLI_testextensie_glob(const char *str, const char *ext_fnmatch);
int BLI_replace_extension(char *path, int maxlen, const char *ext);
void BLI_uniquename(struct ListBase *list, void *vlink, const char defname[], char delim, short name_offs, short len);
+int BLI_uniquename_cb(int (*unique_check)(void *, const char *), void *arg, const char defname[], char delim, char *name, short name_len);
void BLI_newname(char * name, int add);
int BLI_stringdec(const char *string, char *head, char *start, unsigned short *numlen);
void BLI_stringenc(char *string, const char *head, const char *tail, unsigned short numlen, int pic);
+int BLI_split_name_num(char *left, int *nr, const char *name, const char delim);
void BLI_splitdirstring(char *di,char *fi);
/* make sure path separators conform to system one */
diff --git a/source/blender/blenlib/BLI_pbvh.h b/source/blender/blenlib/BLI_pbvh.h
index 4797aeb2364..f89068c885e 100644
--- a/source/blender/blenlib/BLI_pbvh.h
+++ b/source/blender/blenlib/BLI_pbvh.h
@@ -118,8 +118,6 @@ float BLI_pbvh_node_get_tmin(PBVHNode* node);
void BLI_pbvh_update(PBVH *bvh, int flags, float (*face_nors)[3]);
void BLI_pbvh_redraw_BB(PBVH *bvh, float bb_min[3], float bb_max[3]);
void BLI_pbvh_get_grid_updates(PBVH *bvh, int clear, void ***gridfaces, int *totface);
-void BLI_pbvh_grids_update(PBVH *bvh, struct DMGridData **grids,
- struct DMGridAdjacency *gridadj, void **gridfaces);
/* vertex deformer */
float (*BLI_pbvh_get_vertCos(struct PBVH *pbvh))[3];
diff --git a/source/blender/blenlib/BLI_scanfill.h b/source/blender/blenlib/BLI_scanfill.h
index 0ae40c0b83d..bae5375f757 100644
--- a/source/blender/blenlib/BLI_scanfill.h
+++ b/source/blender/blenlib/BLI_scanfill.h
@@ -50,7 +50,7 @@ extern "C" {
/* scanfill.c: used in displist only... */
struct EditVert *BLI_addfillvert(float *vec);
struct EditEdge *BLI_addfilledge(struct EditVert *v1, struct EditVert *v2);
-int BLI_edgefill(int mode, int mat_nr);
+int BLI_edgefill(int mat_nr);
void BLI_end_edgefill(void);
/* These callbacks are needed to make the lib finction properly */
diff --git a/source/blender/blenlib/BLI_storage.h b/source/blender/blenlib/BLI_storage.h
index e443a853324..0996b19a854 100644
--- a/source/blender/blenlib/BLI_storage.h
+++ b/source/blender/blenlib/BLI_storage.h
@@ -29,17 +29,6 @@
#ifndef BLI_STORAGE_H
#define BLI_STORAGE_H
-/* NOTE: these have to be defined before including unistd.h! */
-#ifndef __APPLE__
-#ifndef WIN32
-#ifndef _LARGEFILE_SOURCE
-#define _LARGEFILE_SOURCE
-#define _LARGEFILE64_SOURCE
-#define _FILE_OFFSET_BITS 64
-#endif
-#endif
-#endif
-
#ifdef WIN32
/* for size_t, only needed on win32 for some reason */
#include <stddef.h>
@@ -49,19 +38,19 @@ struct direntry;
void BLI_adddirstrings(void);
-void BLI_builddir(char *dirname, char *relname);
+void BLI_builddir(const char *dirname, const char *relname);
int BLI_compare(struct direntry *entry1, struct direntry *entry2);
size_t BLI_filesize(int file);
size_t BLI_filepathsize(const char *path);
-double BLI_diskfree(char *dir);
-char *BLI_getwdN(char *dir);
+double BLI_diskfree(const char *dir);
+char *BLI_getwdN(const char *dir);
-unsigned int BLI_getdir(char *dirname, struct direntry **filelist);
+unsigned int BLI_getdir(const char *dirname, struct direntry **filelist);
/**
* @attention Do not confuse with BLI_exists
*/
-int BLI_exist(char *name);
+int BLI_exist(const char *name);
/**
* Read a file as ASCII lines. An empty list is
* returned if the file cannot be opened or read.
@@ -73,9 +62,9 @@ int BLI_exist(char *name);
* @retval A list of strings representing the file lines.
*/
-int BLI_is_dir(char *file);
+int BLI_is_dir(const char *file);
-struct LinkNode *BLI_read_file_as_lines(char *name);
+struct LinkNode *BLI_read_file_as_lines(const char *name);
/**
* Free the list returned by BLI_read_file_as_lines.
diff --git a/source/blender/blenlib/BLI_storage_types.h b/source/blender/blenlib/BLI_storage_types.h
index bc3584db03e..c041b33c6a4 100644
--- a/source/blender/blenlib/BLI_storage_types.h
+++ b/source/blender/blenlib/BLI_storage_types.h
@@ -35,16 +35,6 @@
#include <sys/stat.h>
-#define HDRSIZE 512
-#define NAMSIZE 200
-
-struct header{
- char name[NAMSIZE];
- unsigned int size;
- unsigned int chksum;
- char fill[HDRSIZE-NAMSIZE-2*sizeof(unsigned int)];
-};
-
#if defined(WIN32) && !defined(FREE_WINDOWS)
typedef unsigned int mode_t;
#endif
@@ -77,14 +67,6 @@ struct direntry{
struct ImBuf *image;
};
-#define SELECT 1
-#define HIDDEN 1
-#define FIRST 1
-#define DESELECT 0
-#define NOT_YET 0
-#define VISIBLE 0
-#define LAST 0
-
struct dirlink
{
struct dirlink *next,*prev;
diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h
index ccb10190816..01ad70c31fb 100644
--- a/source/blender/blenlib/BLI_string.h
+++ b/source/blender/blenlib/BLI_string.h
@@ -57,6 +57,14 @@ char *BLI_strdup(const char *str);
char *BLI_strdupn(const char *str, int len);
/**
+ * Appends the two strings, and returns new mallocN'ed string
+ * @param str1 first string for copy
+ * @param str2 second string for append
+ * @retval Returns dst
+ */
+char *BLI_strdupcat(const char *str1, const char *str2);
+
+ /**
* Like strncpy but ensures dst is always
* '\0' terminated.
*
@@ -66,14 +74,6 @@ char *BLI_strdupn(const char *str, int len);
* the size of dst)
* @retval Returns dst
*/
-char *BLI_strdupcat(const char *str1, const char *str2);
-
- /**
- * Appends the two strings, and returns new mallocN'ed string
- * @param str1 first string for copy
- * @param str2 second string for append
- * @retval Returns dst
- */
char *BLI_strncpy(char *dst, const char *src, int maxncpy);
/* Makes a copy of the text within the "" that appear after some text 'blahblah'
@@ -102,13 +102,21 @@ char *BLI_replacestr(char *str, const char *oldText, const char *newText);
/*
* Replacement for snprintf
*/
-int BLI_snprintf(char *buffer, size_t count, const char *format, ...);
+int BLI_snprintf(char *buffer, size_t count, const char *format, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 3, 4)));
+#endif
+;
/*
* Print formatted string into a newly mallocN'd string
* and return it.
*/
-char *BLI_sprintfN(const char *format, ...);
+char *BLI_sprintfN(const char *format, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 1, 2)));
+#endif
+;
/**
* Compare two strings
diff --git a/source/blender/blenlib/BLI_threads.h b/source/blender/blenlib/BLI_threads.h
index 6a0a711404c..ad968deb0c5 100644
--- a/source/blender/blenlib/BLI_threads.h
+++ b/source/blender/blenlib/BLI_threads.h
@@ -121,7 +121,7 @@ void BLI_insert_work(struct ThreadedWorker *worker, void *param);
typedef struct ThreadQueue ThreadQueue;
-ThreadQueue *BLI_thread_queue_init();
+ThreadQueue *BLI_thread_queue_init(void);
void BLI_thread_queue_free(ThreadQueue *queue);
void BLI_thread_queue_push(ThreadQueue *queue, void *work);
diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h
new file mode 100644
index 00000000000..7749aaf0a67
--- /dev/null
+++ b/source/blender/blenlib/BLI_utildefines.h
@@ -0,0 +1,218 @@
+/*
+ * $Id: BLI_utildefines.h 34198 2011-01-09 15:12:08Z campbellbarton $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+*/
+
+#ifndef BLI_UTILDEFINES_H
+#define BLI_UTILDEFINES_H
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+
+#define ELEM(a, b, c) ( (a)==(b) || (a)==(c) )
+#define ELEM3(a, b, c, d) ( ELEM(a, b, c) || (a)==(d) )
+#define ELEM4(a, b, c, d, e) ( ELEM(a, b, c) || ELEM(a, d, e) )
+#define ELEM5(a, b, c, d, e, f) ( ELEM(a, b, c) || ELEM3(a, d, e, f) )
+#define ELEM6(a, b, c, d, e, f, g) ( ELEM(a, b, c) || ELEM4(a, d, e, f, g) )
+#define ELEM7(a, b, c, d, e, f, g, h) ( ELEM3(a, b, c, d) || ELEM4(a, e, f, g, h) )
+#define ELEM8(a, b, c, d, e, f, g, h, i) ( ELEM4(a, b, c, d, e) || ELEM4(a, f, g, h, i) )
+#define ELEM9(a, b, c, d, e, f, g, h, i, j) ( ELEM4(a, b, c, d, e) || ELEM5(a, f, g, h, i, j) )
+#define ELEM10(a, b, c, d, e, f, g, h, i, j, k) ( ELEM4(a, b, c, d, e) || ELEM6(a, f, g, h, i, j, k) )
+#define ELEM11(a, b, c, d, e, f, g, h, i, j, k, l) ( ELEM4(a, b, c, d, e) || ELEM7(a, f, g, h, i, j, k, l) )
+
+/* shift around elements */
+#define SHIFT3(type, a, b, c) { type tmp; tmp = a; a = c; c = b; b = tmp; }
+#define SHIFT4(type, a, b, c, d) { type tmp; tmp = a; a = d; d = c; c = b; b = tmp; }
+
+/* min/max */
+#define MIN2(x,y) ( (x)<(y) ? (x) : (y) )
+#define MIN3(x,y,z) MIN2( MIN2((x),(y)) , (z) )
+#define MIN4(x,y,z,a) MIN2( MIN2((x),(y)) , MIN2((z),(a)) )
+
+#define MAX2(x,y) ( (x)>(y) ? (x) : (y) )
+#define MAX3(x,y,z) MAX2( MAX2((x),(y)) , (z) )
+#define MAX4(x,y,z,a) MAX2( MAX2((x),(y)) , MAX2((z),(a)) )
+
+#define INIT_MINMAX(min, max) { (min)[0]= (min)[1]= (min)[2]= 1.0e30f; (max)[0]= (max)[1]= (max)[2]= -1.0e30f; }
+
+#define INIT_MINMAX2(min, max) { (min)[0]= (min)[1]= 1.0e30f; (max)[0]= (max)[1]= -1.0e30f; }
+
+#define DO_MIN(vec, min) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
+ if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
+ if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; } \
+
+#define DO_MAX(vec, max) { if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
+ if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; \
+ if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
+
+#define DO_MINMAX(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
+ if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
+ if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; \
+ if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
+ if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; \
+ if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
+
+#define DO_MINMAX2(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
+ if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
+ if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
+ if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; }
+
+/* some math and copy defines */
+
+#ifndef SWAP
+#define SWAP(type, a, b) { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
+#endif
+
+#define ABS(a) ( (a)<0 ? (-(a)) : (a) )
+
+#define AVG2(x, y) ( 0.5 * ((x) + (y)) )
+
+#define FTOCHAR(val) ((val)<=0.0f)? 0 : (((val)>(1.0f-0.5f/255.0f))? 255 : (char)((255.0f*(val))+0.5f))
+#define FTOUSHORT(val) ((val >= 1.0f-0.5f/65535)? 65535: (val <= 0.0f)? 0: (unsigned short)(val*65535.0f + 0.5f))
+
+#define VECCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
+#define VECCOPY2D(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1);}
+#define QUATCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2); *(v1+3)= *(v2+3);}
+#define LONGCOPY(a, b, c) {int lcpc=c, *lcpa=(int *)a, *lcpb=(int *)b; while(lcpc-->0) *(lcpa++)= *(lcpb++);}
+
+
+#define VECADD(v1,v2,v3) {*(v1)= *(v2) + *(v3); *(v1+1)= *(v2+1) + *(v3+1); *(v1+2)= *(v2+2) + *(v3+2);}
+#define VECSUB(v1,v2,v3) {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1); *(v1+2)= *(v2+2) - *(v3+2);}
+#define VECSUB2D(v1,v2,v3) {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1);}
+#define VECADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac);}
+#define VECSUBFAC(v1,v2,v3,fac) {*(v1)= *(v2) - *(v3)*(fac); *(v1+1)= *(v2+1) - *(v3+1)*(fac); *(v1+2)= *(v2+2) - *(v3+2)*(fac);}
+#define QUATADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac); *(v1+3)= *(v2+3) + *(v3+3)*(fac);}
+
+#define INPR(v1, v2) ( (v1)[0]*(v2)[0] + (v1)[1]*(v2)[1] + (v1)[2]*(v2)[2] )
+
+/* some misc stuff.... */
+#define CLAMP(a, b, c) if((a)<(b)) (a)=(b); else if((a)>(c)) (a)=(c)
+#define CLAMPIS(a, b, c) ((a)<(b) ? (b) : (a)>(c) ? (c) : (a))
+#define CLAMPTEST(a, b, c) if((b)<(c)) {CLAMP(a, b, c);} else {CLAMP(a, c, b);}
+
+#define IS_EQ(a,b) ((fabs((double)(a)-(b)) >= (double) FLT_EPSILON) ? 0 : 1)
+
+#define IS_EQT(a, b, c) ((a > b)? (((a-b) <= c)? 1:0) : ((((b-a) <= c)? 1:0)))
+#define IN_RANGE(a, b, c) ((b < c)? ((b<a && a<c)? 1:0) : ((c<a && a<b)? 1:0))
+#define IN_RANGE_INCL(a, b, c) ((b < c)? ((b<=a && a<=c)? 1:0) : ((c<=a && a<=b)? 1:0))
+
+
+/* This one rotates the bytes in an int64, int (32) and short (16) */
+#define SWITCH_INT64(a) { \
+ char s_i, *p_i; \
+ p_i= (char *)&(a); \
+ s_i=p_i[0]; p_i[0]=p_i[7]; p_i[7]=s_i; \
+ s_i=p_i[1]; p_i[1]=p_i[6]; p_i[6]=s_i; \
+ s_i=p_i[2]; p_i[2]=p_i[5]; p_i[5]=s_i; \
+ s_i=p_i[3]; p_i[3]=p_i[4]; p_i[4]=s_i; }
+
+ #define SWITCH_INT(a) { \
+ char s_i, *p_i; \
+ p_i= (char *)&(a); \
+ s_i=p_i[0]; p_i[0]=p_i[3]; p_i[3]=s_i; \
+ s_i=p_i[1]; p_i[1]=p_i[2]; p_i[2]=s_i; }
+
+#define SWITCH_SHORT(a) { \
+ char s_i, *p_i; \
+ p_i= (char *)&(a); \
+ s_i=p_i[0]; p_i[0]=p_i[1]; p_i[1]=s_i; }
+
+
+/* Warning-free macros for storing ints in pointers. Use these _only_
+ * for storing an int in a pointer, not a pointer in an int (64bit)! */
+#define SET_INT_IN_POINTER(i) ((void*)(intptr_t)(i))
+#define GET_INT_FROM_POINTER(i) ((int)(intptr_t)(i))
+
+/* Macro to convert a value to string in the preprocessor
+ * STRINGIFY_ARG: gives the defined name in the string
+ * STRINGIFY: gives the defined value. */
+#define STRINGIFY_ARG(x) #x
+#define STRINGIFY(x) STRINGIFY_ARG(x)
+
+/* useful for debugging */
+#define AT __FILE__ ":" STRINGIFY(__LINE__)
+
+/* UNUSED macro, for function argument */
+#ifdef __GNUC__
+# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
+#else
+# define UNUSED(x) UNUSED_ ## x
+#endif
+
+
+/*little macro so inline keyword works*/
+#if defined(_MSC_VER)
+# define BM_INLINE static __forceinline
+#elif defined(__GNUC__)
+# define BM_INLINE static inline __attribute((always_inline))
+#else
+/* #warning "MSC/GNUC defines not found, inline non-functional" */
+# define BM_INLINE static
+#endif
+
+
+/* BLI_assert(), default only to print
+ * for aborting need to define WITH_ASSERT_ABORT
+ */
+#if !defined NDEBUG
+# ifdef WITH_ASSERT_ABORT
+# define _dummy_abort abort
+# else
+# define _dummy_abort() (void)0
+# endif
+# ifdef __GNUC__ /* just want to check if __func__ is available */
+# define BLI_assert(a) \
+do { \
+ if (0 == (a)) { \
+ fprintf(stderr, \
+ "BLI_assert failed: %s, %s(), %d at \'%s\'\n", \
+ __FILE__, __func__, __LINE__, STRINGIFY(a)); \
+ _dummy_abort(); \
+ } \
+} while (0)
+# else
+# define BLI_assert(a) \
+do { \
+ if (0 == (a)) { \
+ fprintf(stderr, \
+ "BLI_assert failed: %s, %d at \'%s\'\n", \
+ __FILE__, __LINE__, STRINGIFY(a)); \
+ _dummy_abort(); \
+ } \
+} while (0)
+# endif
+#else
+# define BLI_assert(a) (void)0
+#endif
+
+#endif // BLI_UTILDEFINES_H
diff --git a/source/blender/blenlib/BLI_winstuff.h b/source/blender/blenlib/BLI_winstuff.h
index e8689895735..2b0f548f5dd 100644
--- a/source/blender/blenlib/BLI_winstuff.h
+++ b/source/blender/blenlib/BLI_winstuff.h
@@ -36,11 +36,19 @@
#ifndef FREE_WINDOWS
#pragma warning(once: 4761 4305 4244 4018)
+#else
+#ifdef WINVER
+#undef WINVER
+#endif
+
+/* Some stuff requires WINVER 0x500, but mingw's default is 0x400 */
+#define WINVER 0x0501
#endif
#define WIN32_LEAN_AND_MEAN
#ifndef WIN32_SKIP_HKEY_PROTECTION
+#undef HKEY
#define HKEY WIN32_HKEY // prevent competing definitions
#include <windows.h>
#undef HKEY
@@ -81,15 +89,6 @@ extern "C" {
#endif
/* defines for using ISO C++ conformant names */
-#define open _open
-#define close _close
-#define write _write
-#define read _read
-#define getcwd _getcwd
-#define chdir _chdir
-#define strdup _strdup
-#define lseek _lseek
-#define getpid _getpid
#define snprintf _snprintf
#ifndef FREE_WINDOWS
@@ -133,15 +132,13 @@ void get_default_root(char *root);
int check_file_chars(char *filename);
char *dirname(char *path);
-#ifdef WIN32
int BLI_getInstallationDir(char *str);
-#endif
#ifdef __cplusplus
}
#endif
-#endif
+#endif /* _WIN32 */
#endif /* __WINSTUFF_H__ */
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index 320d4ac783f..dc043c3a21e 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -24,34 +24,120 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-SET(INC
+set(INC
.
../makesdna
../blenkernel
- ../include
../gpu
../../../intern/ghost
../../../intern/guardedalloc
- ${ZLIB_INC}
+ ${ZLIB_INCLUDE_DIRS}
${FREETYPE_INCLUDE_DIRS}
)
-# unused
-LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/BLI_bfile.c")
-
+set(SRC
+ intern/BLI_args.c
+ intern/BLI_dynstr.c
+ intern/BLI_ghash.c
+ intern/BLI_heap.c
+ intern/BLI_kdopbvh.c
+ intern/BLI_kdtree.c
+ intern/BLI_linklist.c
+ intern/BLI_memarena.c
+ intern/BLI_mempool.c
+ intern/DLRB_tree.c
+ intern/boxpack2d.c
+ intern/bpath.c
+ intern/cpu.c
+ intern/dynlib.c
+ intern/edgehash.c
+ intern/fileops.c
+ intern/fnmatch.c
+ intern/freetypefont.c
+ intern/graph.c
+ intern/gsqueue.c
+ intern/jitter.c
+ intern/listbase.c
+ intern/math_base.c
+ intern/math_base_inline.c
+ intern/math_color.c
+ intern/math_geom.c
+ intern/math_geom_inline.c
+ intern/math_matrix.c
+ intern/math_rotation.c
+ intern/math_vector.c
+ intern/math_vector_inline.c
+ intern/noise.c
+ intern/path_util.c
+ intern/pbvh.c
+ intern/rand.c
+ intern/rct.c
+ intern/scanfill.c
+ intern/storage.c
+ intern/string.c
+ intern/threads.c
+ intern/time.c
+ intern/uvproject.c
+ intern/voxel.c
+ intern/winstuff.c
-IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
- LIST(APPEND INC "${BINRELOC_INC}")
-ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+ BLI_args.h
+ BLI_blenlib.h
+ BLI_boxpack2d.h
+ BLI_bpath.h
+ BLI_cpu.h
+ BLI_dlrbTree.h
+ BLI_dynstr.h
+ BLI_edgehash.h
+ BLI_editVert.h
+ BLI_fileops.h
+ BLI_fnmatch.h
+ BLI_ghash.h
+ BLI_graph.h
+ BLI_gsqueue.h
+ BLI_heap.h
+ BLI_jitter.h
+ BLI_kdopbvh.h
+ BLI_kdtree.h
+ BLI_linklist.h
+ BLI_listbase.h
+ BLI_math.h
+ BLI_math_base.h
+ BLI_math_color.h
+ BLI_math_geom.h
+ BLI_math_inline.h
+ BLI_math_matrix.h
+ BLI_math_rotation.h
+ BLI_math_vector.h
+ BLI_memarena.h
+ BLI_mempool.h
+ BLI_noise.h
+ BLI_path_util.h
+ BLI_pbvh.h
+ BLI_rand.h
+ BLI_rect.h
+ BLI_scanfill.h
+ BLI_storage.h
+ BLI_storage_types.h
+ BLI_string.h
+ BLI_threads.h
+ BLI_utildefines.h
+ BLI_uvproject.h
+ BLI_vfontdata.h
+ BLI_voxel.h
+ BLI_winstuff.h
+ PIL_dynlib.h
+ PIL_time.h
+ intern/BLI_callbacks.h
+ intern/dynamiclist.h
+)
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+if(CMAKE_SYSTEM_NAME MATCHES "Linux")
+ list(APPEND INC "${BINRELOC_INC}")
+endif()
-IF(WITH_OPENMP)
- ADD_DEFINITIONS(-DPARALLEL=1)
-ENDIF(WITH_OPENMP)
+if(WITH_OPENMP)
+ add_definitions(-DPARALLEL=1)
+endif()
-BLENDERLIB(bf_blenlib "${SRC}" "${INC}")
+blender_add_lib(bf_blenlib "${SRC}" "${INC}")
diff --git a/source/blender/blenlib/Makefile b/source/blender/blenlib/Makefile
deleted file mode 100644
index d4dcfaeeabf..00000000000
--- a/source/blender/blenlib/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/blenlib
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/blenlib/PIL_dynlib.h b/source/blender/blenlib/PIL_dynlib.h
index 1a6e1e20184..c94b6af690b 100644
--- a/source/blender/blenlib/PIL_dynlib.h
+++ b/source/blender/blenlib/PIL_dynlib.h
@@ -38,7 +38,7 @@ PIL_dynlib_open(
void*
PIL_dynlib_find_symbol(
PILdynlib* lib,
- char *symname);
+ const char *symname);
char*
PIL_dynlib_get_error_as_string(
diff --git a/source/blender/blenlib/intern/BLI_args.c b/source/blender/blenlib/intern/BLI_args.c
index 8d72311f80b..ff41f76a1f9 100644
--- a/source/blender/blenlib/intern/BLI_args.c
+++ b/source/blender/blenlib/intern/BLI_args.c
@@ -35,6 +35,7 @@
#include "BLI_listbase.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BLI_args.h"
#include "BLI_ghash.h"
@@ -43,14 +44,14 @@ char NO_DOCS[] = "NO DOCUMENTATION SPECIFIED";
struct bArgDoc;
typedef struct bArgDoc {
struct bArgDoc *next, *prev;
- char *short_arg;
- char *long_arg;
- char *documentation;
+ const char *short_arg;
+ const char *long_arg;
+ const char *documentation;
int done;
} bArgDoc;
typedef struct bAKey {
- char *arg;
+ const char *arg;
uintptr_t pass; /* cast easier */
int case_str; /* case specific or not */
} bAKey;
@@ -70,8 +71,8 @@ struct bArgs {
int *passes;
};
-static unsigned int case_strhash(void *ptr) {
- char *s= ptr;
+static unsigned int case_strhash(const void *ptr) {
+ const char *s= ptr;
unsigned int i= 0;
unsigned char c;
@@ -81,27 +82,27 @@ static unsigned int case_strhash(void *ptr) {
return i;
}
-static unsigned int keyhash(void *ptr)
+static unsigned int keyhash(const void *ptr)
{
- bAKey *k = ptr;
+ const bAKey *k = ptr;
return case_strhash(k->arg); // ^ BLI_ghashutil_inthash((void*)k->pass);
}
-static int keycmp(void *a, void *b)
+static int keycmp(const void *a, const void *b)
{
- bAKey *ka = a;
- bAKey *kb = b;
+ const bAKey *ka = a;
+ const bAKey *kb = b;
if (ka->pass == kb->pass || ka->pass == -1 || kb->pass == -1) { /* -1 is wildcard for pass */
if (ka->case_str == 1 || kb->case_str == 1)
return BLI_strcasecmp(ka->arg, kb->arg);
else
return strcmp(ka->arg, kb->arg);
} else {
- return BLI_ghashutil_intcmp((void*)ka->pass, (void*)kb->pass);
+ return BLI_ghashutil_intcmp((const void*)ka->pass, (const void*)kb->pass);
}
}
-static bArgument *lookUp(struct bArgs *ba, char *arg, int pass, int case_str)
+static bArgument *lookUp(struct bArgs *ba, const char *arg, int pass, int case_str)
{
bAKey key;
@@ -150,7 +151,7 @@ char **BLI_argsArgv(struct bArgs *ba)
return ba->argv;
}
-static bArgDoc *internalDocs(struct bArgs *ba, char *short_arg, char *long_arg, char *doc)
+static bArgDoc *internalDocs(struct bArgs *ba, const char *short_arg, const char *long_arg, const char *doc)
{
bArgDoc *d;
@@ -168,7 +169,7 @@ static bArgDoc *internalDocs(struct bArgs *ba, char *short_arg, char *long_arg,
return d;
}
-static void internalAdd(struct bArgs *ba, char *arg, int pass, int case_str, BA_ArgCallback cb, void *data, bArgDoc *d)
+static void internalAdd(struct bArgs *ba, const char *arg, int pass, int case_str, BA_ArgCallback cb, void *data, bArgDoc *d)
{
bArgument *a;
bAKey *key;
@@ -196,7 +197,7 @@ static void internalAdd(struct bArgs *ba, char *arg, int pass, int case_str, BA_
BLI_ghash_insert(ba->items, key, a);
}
-void BLI_argsAddCase(struct bArgs *ba, int pass, char *short_arg, int short_case, char *long_arg, int long_case, char *doc, BA_ArgCallback cb, void *data)
+void BLI_argsAddCase(struct bArgs *ba, int pass, const char *short_arg, int short_case, const char *long_arg, int long_case, const char *doc, BA_ArgCallback cb, void *data)
{
bArgDoc *d = internalDocs(ba, short_arg, long_arg, doc);
@@ -209,7 +210,7 @@ void BLI_argsAddCase(struct bArgs *ba, int pass, char *short_arg, int short_case
}
-void BLI_argsAdd(struct bArgs *ba, int pass, char *short_arg, char *long_arg, char *doc, BA_ArgCallback cb, void *data)
+void BLI_argsAdd(struct bArgs *ba, int pass, const char *short_arg, const char *long_arg, const char *doc, BA_ArgCallback cb, void *data)
{
BLI_argsAddCase(ba, pass, short_arg, 0, long_arg, 0, doc, cb, data);
}
@@ -226,7 +227,7 @@ static void internalDocPrint(bArgDoc *d)
printf(" %s\n\n", d->documentation);
}
-void BLI_argsPrintArgDoc(struct bArgs *ba, char *arg)
+void BLI_argsPrintArgDoc(struct bArgs *ba, const char *arg)
{
bArgument *a = lookUp(ba, arg, -1, -1);
diff --git a/source/blender/blenlib/intern/BLI_bfile.c b/source/blender/blenlib/intern/BLI_bfile.c
deleted file mode 100644
index b9ac6875b20..00000000000
--- a/source/blender/blenlib/intern/BLI_bfile.c
+++ /dev/null
@@ -1,372 +0,0 @@
-/* -*- indent-tabs-mode:t; tab-width:4; -*-
- *
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2009 by Stichting Blender Foundation.
- * All rights reserved.
- *
- * ***** END GPL LICENSE BLOCK *****
- * BFILE* based abstraction for file access.
- */
-
-#include <string.h>
-#include <stdlib.h>
-#ifndef WIN32
- #include <libgen.h>
- #include <unistd.h>
- #include <sys/param.h>
-#else
- #include <io.h>
- #include "BLI_winstuff.h"
- static char* find_in_pathlist(char* filename, char* pathlist);
-#endif
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include "MEM_guardedalloc.h"
-#include "BKE_utildefines.h"
-#include "BKE_blender.h"
-#include "BLI_path_util.h"
-#include "BLI_fileops.h"
-#include "BLI_storage.h"
-#include "BLI_bfile.h"
-
-/* Internal bfile classification flags */
-#define BCF_OPEN (0)
-#define BCF_FOPEN (1<<0)
-#define BCF_READ (1<<1)
-#define BCF_WRITE (1<<2)
-#define BCF_AT_END (1<<3)
-#define BCF_DISCARD (1<<4)
-
-/* Standard files names */
-#define LAST_SESSION_FILE "last-session"
-#define ENVIRONMENT_FILE "environment"
-
-
-/* Declaration of internal functions */
-static void fill_paths(BFILE *bfile, const char *path, const char *relpath);
-static void free_paths(BFILE* bfile);
-
-
-/*** Exported functions ***/
-
-BFILE *BLI_bfile_fopen(const char *path, const char *mode, int bflags,
- const char *relpath)
-{
- BFILE *bfile;
-
- bfile = MEM_mallocN(sizeof(BFILE), "bfile-fopen");
- bfile->classf = BCF_FOPEN;
- bfile->uflags = bflags;
-
- /* From fopen() doc, we can guess some logic:
- r BCF_READ
- r+ BCF_READ | BCF_WRITE
- w BCF_DISCARD | BCF_WRITE
- w+ BCF_DISCARD | BCF_WRITE | BCF_READ
- a BCF_AT_END | BCF_WRITE
- a+ BCF_AT_END | BCF_WRITE | BCF_READ
- */
- if (strchr(mode, 'r'))
- bfile->classf |= BCF_READ;
- if (strchr(mode, 'w'))
- bfile->classf |= (BCF_DISCARD | BCF_WRITE);
- if (strchr(mode, 'a'))
- bfile->classf |= (BCF_AT_END | BCF_WRITE);
- if (strchr(mode, '+'))
- bfile->classf |= (BCF_READ | BCF_WRITE);
-
- fill_paths(bfile, path, relpath);
-
- bfile->stream = fopen(bfile->tpath, mode);
- if (!(bfile->stream)) {
- free_paths(bfile);
- MEM_freeN(bfile);
- return NULL;
- }
-
- bfile->fd = fileno(bfile->stream);
-
- return bfile;
-}
-
-
-BFILE *BLI_bfile_open(const char *pathname, int flags, int bflags,
- const char *relpath)
-{
- BFILE *bfile;
- char fopen_mode[3];
-
- bfile = MEM_mallocN(sizeof(BFILE), "bfile-open");
- bfile->classf = BCF_OPEN;
- bfile->uflags = bflags;
-
- /* Easy mapping for open() */
- if (flags & O_RDONLY)
- bfile->classf |= BCF_READ;
- if (flags & O_WRONLY)
- bfile->classf |= BCF_WRITE;
- if (flags & O_RDWR)
- bfile->classf |= (BCF_READ | BCF_WRITE);
- if (flags & O_APPEND)
- bfile->classf |= BCF_AT_END;
- if (flags & O_TRUNC)
- bfile->classf |= BCF_DISCARD;
-
- fill_paths(bfile, pathname, relpath);
-
- bfile->fd = open(bfile->tpath, flags);
- if (bfile->fd == -1) {
- free_paths(bfile);
- MEM_freeN(bfile);
- return NULL;
- }
-
- fopen_mode[0] = 'r';
- fopen_mode[1] = '\0';
- fopen_mode[2] = '\0';
- if (bfile->classf & BCF_DISCARD) {
- fopen_mode[0] = 'w';
- if (bfile->classf & BCF_READ) {
- fopen_mode[1] = '+';
- }
- } else if (bfile->classf & BCF_AT_END) {
- fopen_mode[0] = 'a';
- if (bfile->classf & BCF_READ) {
- fopen_mode[1] = '+';
- }
- } else if (bfile->classf & BCF_WRITE) {
- fopen_mode[1] = '+';
- }
-
- bfile->stream = fdopen(bfile->fd, fopen_mode); /* MSWindows _fdopen? */
- if (!(bfile->stream)) {
- free_paths(bfile);
- MEM_freeN(bfile);
- return NULL;
- }
-
- return bfile;
-}
-
-
-FILE *BLI_bfile_file_from_bfile(BFILE *bfile) {
- return bfile->stream;
-}
-
-
-int BLI_bfile_fd_from_bfile(BFILE *bfile) {
- return bfile->fd;
-}
-
-
-ssize_t BLI_bfile_write(BFILE *f, const void *buf, size_t count) {
- ssize_t ret;
-
- ret = write((f->fd), buf, count);
- if (ret == -1) {
- f->error = 1;
- }
-
- return ret;
-}
-
-
-ssize_t BLI_bfile_read(BFILE *f, void *buf, size_t count) {
- ssize_t ret;
-
- ret = read((f->fd), buf, count);
- if (ret == -1) {
- f->error = 1;
- }
-
- return ret;
-}
-
-
-size_t BLI_bfile_fwrite(const void *ptr, size_t size, size_t nmemb,
- BFILE *f)
-{
- size_t ret;
-
- if (f == NULL)
- return 0;
-
- ret = fwrite(ptr, size, nmemb, f->stream);
- if (ret <= 0) {
- f->error = 1;
- }
-
- return ret;
-}
-
-
-size_t BLI_bfile_fread(void *ptr, size_t size, size_t nmemb, BFILE *f) {
- size_t ret;
-
- if (f == NULL)
- return 0;
-
- ret = fread(ptr, size, nmemb, f->stream);
- if ((ret <= 0) && ferror(f->stream)) {
- f->error = 1;
- }
-
- return ret;
-}
-
-
-void BLI_bfile_close(BFILE *bfile) {
- if ((bfile->classf | BCF_WRITE) &&
- !(bfile->uflags | BFILE_RAW)) {
- int error;
- /* Make sure data is on disk */
- error = fsync(bfile->fd);
- /* fsync the directory too? */
- /* Move to final name if no errors */
- if (!(bfile->error) && !error) {
- rename(bfile->tpath, bfile->fpath);
- }
- }
-
- /* Normal close */
-
- /* Cleanup */
- free_paths(bfile);
- MEM_freeN(bfile);
-}
-
-
-void BLI_bfile_clear_error(BFILE *bfile) {
- bfile->error = 0;
-}
-
-
-void BLI_bfile_set_error(BFILE *bfile, int error) {
- /* No cheating, use clear_error() for 0 */
- if (error) {
- bfile->error = error;
- }
-}
-
-
-/*** Internal functions ***/
-
-/**
- Return a full path if the filename exists when combined
- with any item from pathlist. Or NULL otherwise.
- */
-#ifdef WIN32
- #define SEPARATOR ';'
-#else
- #define SEPARATOR ':'
-#endif
-
-#ifdef WIN32
-static char* find_in_pathlist(char* filename, char* pathlist) {
- char first[FILE_MAX + 10];
- char* rest = NULL;
-
- /* Separate first path from rest, use typical separator for current OS */
- rest = strchr(pathlist, SEPARATOR);
- if (rest) {
- strncpy(first, pathlist, rest - pathlist);
- first[rest - pathlist] = '\0';
- /* Skip the separator so it becomes a valid new pathlist */
- rest++;
- } else {
- strcpy(first, pathlist);
- }
-
- /* Check if combination exists */
- BLI_add_slash(first);
- strcat(first, filename);
- if (BLI_exist(first)) {
- return strdup(first);
- }
-
- /* First path failed, try with rest of paths if possible */
- if (rest) {
- return find_in_pathlist(filename, rest);
- } else {
- return NULL;
- }
-}
-#endif
-
-/**
- Setup fpath and tpath based in the needs of the bfile.
- */
-static void fill_paths(BFILE *bfile, const char *path, const char *relpath) {
- char* source_path = NULL;
- char* temp_path = NULL;
- int bflags = bfile->uflags;
-
- if (bflags & BFILE_NORMAL || bflags & BFILE_RAW) {
-// bfile->fpath is path with // replaced
- }
- if (bflags & BFILE_TEMP) {
- temp_path = MEM_mallocN(MAXPATHLEN, "bfile-fpath-1");
- snprintf(temp_path, MAXPATHLEN, "%s/%s", getenv("BLENDER_TEMP"), path);
- bfile->fpath = temp_path;
- }
- if (bflags & (BFILE_CONFIG_BASE | BFILE_CONFIG_DATAFILES |
- BFILE_CONFIG_PYTHON | BFILE_CONFIG_PLUGINS)) {
-// evars
-// bfile->fpath is userdir+version+path
-// source_path is first hit in (if using fallback to older versions)
-// userdir+curversion+path (... userdir+limitversion+path) sysdir+path
-// (limitversion is based in path, using some kind of regex or "tables")
- }
-
- if (bfile->classf & BCF_WRITE && !(bflags & BFILE_RAW)) {
- /* Generate random named path */
- temp_path = MEM_mallocN(MAXPATHLEN, "bfile-fpath-2");
- snprintf(temp_path, MAXPATHLEN, "%s.XXXXXX", path);
- bfile->fd = mkstemp(temp_path);
- bfile->tpath = temp_path;
- /* It will be reopened in upper levels, later */
- close(bfile->fd);
- if (!(bfile->classf & BCF_DISCARD)) {
- /* Copy original data into temp location */
- if (source_path) {
- BLI_copy_fileops(source_path, bfile->tpath);
- } else {
- BLI_copy_fileops(bfile->fpath, bfile->tpath);
- }
- }
- } else {
- bfile->tpath = bfile->fpath;
- }
-}
-
-
-/**
- Free memory used for path strings.
- */
-static void free_paths(BFILE* bfile) {
- if (bfile->fpath) {
- MEM_freeN(bfile->fpath);
- }
- if (bfile->tpath) {
- MEM_freeN(bfile->tpath);
- }
-}
diff --git a/source/blender/blenlib/intern/BLI_callbacks.h b/source/blender/blenlib/intern/BLI_callbacks.h
index 7f85cf16708..56e6cdd428b 100644
--- a/source/blender/blenlib/intern/BLI_callbacks.h
+++ b/source/blender/blenlib/intern/BLI_callbacks.h
@@ -35,7 +35,7 @@
#define BLI_CALLBACKS_H
// This is blenlib internal only
-void callLocalErrorCallBack(char* msg);
+void callLocalErrorCallBack(const char* msg);
#endif
diff --git a/source/blender/blenlib/intern/BLI_dynstr.c b/source/blender/blenlib/intern/BLI_dynstr.c
index 5b61a86305b..1dcc06d6665 100644
--- a/source/blender/blenlib/intern/BLI_dynstr.c
+++ b/source/blender/blenlib/intern/BLI_dynstr.c
@@ -41,6 +41,14 @@
#endif
#endif
+#ifndef va_copy
+# ifdef __va_copy
+# define va_copy(a,b) __va_copy(a,b)
+# else /* !__va_copy */
+# define va_copy(a,b) ((a)=(b))
+# endif /* __va_copy */
+#endif /* va_copy */
+
/***/
typedef struct DynStrElem DynStrElem;
@@ -101,15 +109,21 @@ void BLI_dynstr_nappend(DynStr *ds, const char *cstr, int len) {
void BLI_dynstr_vappendf(DynStr *ds, const char *format, va_list args)
{
char *message, fixedmessage[256];
- int len= 256, maxlen= 65536, retval;
+ int len= sizeof(fixedmessage);
+ const int maxlen= 65536;
+ int retval;
while(1) {
+ va_list args_cpy;
if(len == sizeof(fixedmessage))
message= fixedmessage;
else
- message= MEM_callocN(sizeof(char)*(len+1), "BLI_dynstr_appendf");
+ message= MEM_callocN(sizeof(char) * len, "BLI_dynstr_appendf");
- retval= vsnprintf(message, len, format, args);
+ /* cant reuse the same args, so work on a copy */
+ va_copy(args_cpy, args);
+ retval= vsnprintf(message, len, format, args_cpy);
+ va_end(args_cpy);
if(retval == -1) {
/* -1 means not enough space, but on windows it may also mean
@@ -124,13 +138,14 @@ void BLI_dynstr_vappendf(DynStr *ds, const char *format, va_list args)
break;
}
}
- else if(retval > len) {
+ else if(retval >= len) {
/* in C99 the actual length required is returned */
if(message != fixedmessage)
MEM_freeN(message);
message= NULL;
- len= retval;
+ /* retval doesnt include \0 terminator */
+ len= retval + 1;
}
else
break;
@@ -148,7 +163,9 @@ void BLI_dynstr_appendf(DynStr *ds, const char *format, ...)
{
va_list args;
char *message, fixedmessage[256];
- int len= 256, maxlen= 65536, retval;
+ int len= sizeof(fixedmessage);
+ const int maxlen= 65536;
+ int retval;
/* note that it's tempting to just call BLI_dynstr_vappendf here
* and avoid code duplication, that crashes on some system because
@@ -158,7 +175,7 @@ void BLI_dynstr_appendf(DynStr *ds, const char *format, ...)
if(len == sizeof(fixedmessage))
message= fixedmessage;
else
- message= MEM_callocN(sizeof(char)*(len+1), "BLI_dynstr_appendf");
+ message= MEM_callocN(sizeof(char)*(len), "BLI_dynstr_appendf");
va_start(args, format);
retval= vsnprintf(message, len, format, args);
@@ -177,13 +194,14 @@ void BLI_dynstr_appendf(DynStr *ds, const char *format, ...)
break;
}
}
- else if(retval > len) {
+ else if(retval >= len) {
/* in C99 the actual length required is returned */
if(message != fixedmessage)
MEM_freeN(message);
message= NULL;
- len= retval;
+ /* retval doesnt include \0 terminator */
+ len= retval + 1;
}
else
break;
diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c
index 6daa2928716..a8ca828aa66 100644
--- a/source/blender/blenlib/intern/BLI_ghash.c
+++ b/source/blender/blenlib/intern/BLI_ghash.c
@@ -30,6 +30,7 @@
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLO_sys_types.h" // for intptr_t support
/***/
@@ -149,17 +150,17 @@ int BLI_ghashIterator_isDone(GHashIterator *ghi) {
/***/
-unsigned int BLI_ghashutil_ptrhash(void *key) {
+unsigned int BLI_ghashutil_ptrhash(const void *key) {
return (unsigned int)(intptr_t)key;
}
-int BLI_ghashutil_ptrcmp(void *a, void *b) {
+int BLI_ghashutil_ptrcmp(const void *a, const void *b) {
if (a==b)
return 0;
else
return (a<b)?-1:1;
}
-unsigned int BLI_ghashutil_inthash(void *ptr) {
+unsigned int BLI_ghashutil_inthash(const void *ptr) {
uintptr_t key = (uintptr_t)ptr;
key += ~(key << 16);
@@ -172,15 +173,15 @@ unsigned int BLI_ghashutil_inthash(void *ptr) {
return (unsigned int)(key & 0xffffffff);
}
-int BLI_ghashutil_intcmp(void *a, void *b) {
+int BLI_ghashutil_intcmp(const void *a, const void *b) {
if (a==b)
return 0;
else
return (a<b)?-1:1;
}
-unsigned int BLI_ghashutil_strhash(void *ptr) {
- char *s= ptr;
+unsigned int BLI_ghashutil_strhash(const void *ptr) {
+ const char *s= ptr;
unsigned int i= 0;
unsigned char c;
@@ -189,6 +190,6 @@ unsigned int BLI_ghashutil_strhash(void *ptr) {
return i;
}
-int BLI_ghashutil_strcmp(void *a, void *b) {
+int BLI_ghashutil_strcmp(const void *a, const void *b) {
return strcmp(a, b);
}
diff --git a/source/blender/blenlib/intern/BLI_kdopbvh.c b/source/blender/blenlib/intern/BLI_kdopbvh.c
index 4d64f4a50ff..4673462f58b 100644
--- a/source/blender/blenlib/intern/BLI_kdopbvh.c
+++ b/source/blender/blenlib/intern/BLI_kdopbvh.c
@@ -30,7 +30,9 @@
#include "MEM_guardedalloc.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
+
+
#include "BLI_kdopbvh.h"
#include "BLI_math.h"
@@ -1126,9 +1128,10 @@ static void traverse(BVHOverlapData *data, BVHNode *node1, BVHNode *node2)
return;
}
-BVHTreeOverlap *BLI_bvhtree_overlap(BVHTree *tree1, BVHTree *tree2, int *result)
+BVHTreeOverlap *BLI_bvhtree_overlap(BVHTree *tree1, BVHTree *tree2, unsigned int *result)
{
- int j, total = 0;
+ int j;
+ unsigned int total = 0;
BVHTreeOverlap *overlap = NULL, *to = NULL;
BVHOverlapData **data;
diff --git a/source/blender/blenlib/intern/BLI_kdtree.c b/source/blender/blenlib/intern/BLI_kdtree.c
index cf94a0c9ffe..0d541c1fe37 100644
--- a/source/blender/blenlib/intern/BLI_kdtree.c
+++ b/source/blender/blenlib/intern/BLI_kdtree.c
@@ -132,6 +132,7 @@ void BLI_kdtree_balance(KDTree *tree)
static float squared_distance(float *v2, float *v1, float *n1, float *n2)
{
float d[3], dist;
+ (void)n1; /* unused */
d[0]= v2[0]-v1[0];
d[1]= v2[1]-v1[1];
diff --git a/source/blender/blenlib/intern/BLI_mempool.c b/source/blender/blenlib/intern/BLI_mempool.c
index 26d6f5af147..823841ef152 100644
--- a/source/blender/blenlib/intern/BLI_mempool.c
+++ b/source/blender/blenlib/intern/BLI_mempool.c
@@ -154,9 +154,11 @@ void BLI_mempool_free(BLI_mempool *pool, void *addr){ //doesnt protect against d
first = pool->chunks.first;
BLI_remlink(&pool->chunks, first);
- for(mpchunk = pool->chunks.first; mpchunk; mpchunk = mpchunk->next)
- pool->use_sysmalloc ? free(mpchunk->data) : MEM_freeN(mpchunk->data);
-
+ for(mpchunk = pool->chunks.first; mpchunk; mpchunk = mpchunk->next) {
+ if(pool->use_sysmalloc) free(mpchunk->data);
+ else MEM_freeN(mpchunk->data);
+ }
+
pool->use_sysmalloc ? BLI_freelist(&(pool->chunks)) : BLI_freelistN(&(pool->chunks));
BLI_addtail(&pool->chunks, first);
@@ -175,9 +177,18 @@ void BLI_mempool_free(BLI_mempool *pool, void *addr){ //doesnt protect against d
void BLI_mempool_destroy(BLI_mempool *pool)
{
BLI_mempool_chunk *mpchunk=NULL;
- for(mpchunk = pool->chunks.first; mpchunk; mpchunk = mpchunk->next)
- pool->use_sysmalloc ? free(mpchunk->data) : MEM_freeN(mpchunk->data);
-
- pool->use_sysmalloc ? BLI_freelist(&(pool->chunks)) : BLI_freelistN(&(pool->chunks));
- pool->use_sysmalloc ? free(pool) : MEM_freeN(pool);
+ if(pool->use_sysmalloc) {
+ for(mpchunk = pool->chunks.first; mpchunk; mpchunk = mpchunk->next) {
+ free(mpchunk->data);
+ }
+ BLI_freelist(&(pool->chunks));
+ free(pool);
+ }
+ else {
+ for(mpchunk = pool->chunks.first; mpchunk; mpchunk = mpchunk->next) {
+ MEM_freeN(mpchunk->data);
+ }
+ BLI_freelistN(&(pool->chunks));
+ MEM_freeN(pool);
+ }
}
diff --git a/source/blender/blenlib/intern/Makefile b/source/blender/blenlib/intern/Makefile
deleted file mode 100644
index 018fd3477df..00000000000
--- a/source/blender/blenlib/intern/Makefile
+++ /dev/null
@@ -1,62 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blenlib
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# path to SDNA types
-CPPFLAGS += -I../../makesdna
-# path to our own external headerfiles
-CPPFLAGS += -I..
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-# path to freetype font stuff
-CPPFLAGS += -I$(NAN_FREETYPE)/include
-CPPFLAGS += -I$(NAN_FREETYPE)/include/freetype2
-# path to blenkernel
-CPPFLAGS += -I$(SRCHOME)/blender/blenkernel
-CPPFLAGS += -I../../editors/include/
-# path to zlib
-CPPFLAGS += -I$(NAN_ZLIB)/include
-
-CPPFLAGS += -I../../gpu
-
-CPPFLAGS += -I$(NAN_GHOST)/include
-
-ifdef NAN_PTHREADS
- CPPFLAGS += -I$(NAN_PTHREADS)/include
-endif
-ifeq ($(OS),linux)
- CPPFLAGS += -I$(OCGDIR)/extern/binreloc/include
-endif
diff --git a/source/blender/blenlib/intern/boxpack2d.c b/source/blender/blenlib/intern/boxpack2d.c
index 1c910dbb519..643dcb6efca 100644
--- a/source/blender/blenlib/intern/boxpack2d.c
+++ b/source/blender/blenlib/intern/boxpack2d.c
@@ -30,6 +30,23 @@
*
* The defined Below are for internal use only */
+typedef struct boxVert {
+ float x;
+ float y;
+ short free;
+
+ struct boxPack *trb; /* top right box */
+ struct boxPack *blb; /* bottom left box */
+ struct boxPack *brb; /* bottom right box */
+ struct boxPack *tlb; /* top left box */
+
+ /* Store last intersecting boxes here
+ * speedup intersection testing */
+ struct boxPack *isect_cache[4];
+
+ int index;
+} boxVert;
+
/* free vert flags */
#define eps 0.0000001f
#define BLF 1
@@ -83,12 +100,10 @@
/* qsort function - sort largest to smallest */
static int box_areasort(const void *p1, const void *p2)
{
- const boxPack *b1=p1, *b2=p2;
- float a1, a2;
+ const boxPack *b1= p1, *b2= p2;
+ const float a1= BOXAREA(b1);
+ const float a2= BOXAREA(b2);
- a1 = BOXAREA(b1);
- a2 = BOXAREA(b2);
-
if ( a1 < a2 ) return 1;
else if ( a1 > a2 ) return -1;
return 0;
@@ -132,13 +147,13 @@ static int vertex_sort(const void *p1, const void *p2)
* len - the number of boxes in the array.
* tot_width and tot_height are set so you can normalize the data.
* */
-void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
+void boxPack2D(boxPack *boxarray, const int len, float *tot_width, float *tot_height)
{
boxVert *vert; /* the current vert */
int box_index, verts_pack_len, i, j, k, isect;
int quad_flags[4]= {BLF,TRF,TLF,BRF}; /* use for looping */
boxPack *box, *box_test; /*current box and another for intersection tests*/
- int *vertex_pack_indicies; /*an array of indices used for sorting verts*/
+ int *vertex_pack_indices; /*an array of indices used for sorting verts*/
if (!len) {
*tot_width = 0.0f;
@@ -151,7 +166,7 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
/* add verts to the boxes, these are only used internally */
vert = vertarray = MEM_mallocN( len*4*sizeof(boxVert), "boxPack Verts");
- vertex_pack_indicies = MEM_mallocN( len*3*sizeof(int), "boxPack Indices");
+ vertex_pack_indices = MEM_mallocN( len*3*sizeof(int), "boxPack Indices");
for (box=boxarray, box_index=0, i=0; box_index < len; box_index++, box++) {
@@ -208,7 +223,7 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
box->x = box->y = 0.0f;
for (i=0; i<3; i++)
- vertex_pack_indicies[i] = box->v[i+1]->index;
+ vertex_pack_indices[i] = box->v[i+1]->index;
verts_pack_len = 3;
box++; /* next box, needed for the loop below */
/* ...done packing the first box */
@@ -220,14 +235,14 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
box_width = box->w;
box_height = box->h;
- qsort(vertex_pack_indicies, verts_pack_len, sizeof(int), vertex_sort);
+ qsort(vertex_pack_indices, verts_pack_len, sizeof(int), vertex_sort);
/* Pack the box in with the others */
/* sort the verts */
isect = 1;
for (i=0; i<verts_pack_len && isect; i++) {
- vert = vertarray + vertex_pack_indicies[i];
+ vert = vertarray + vertex_pack_indices[i];
/* printf("\ttesting vert %i %i %i %f %f\n", i,
* vert->free, verts_pack_len, vert->x, vert->y); */
@@ -384,7 +399,7 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
for (k=0; k<4; k++) {
if (box->v[k] != vert) {
- vertex_pack_indicies[verts_pack_len] =
+ vertex_pack_indices[verts_pack_len] =
box->v[k]->index;
verts_pack_len++;
}
@@ -406,7 +421,7 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
box = boxarray+box_index;
box->v[0] = box->v[1] = box->v[2] = box->v[3] = NULL;
}
- MEM_freeN(vertex_pack_indicies);
+ MEM_freeN(vertex_pack_indices);
MEM_freeN(vertarray);
}
diff --git a/source/blender/blenlib/intern/bpath.c b/source/blender/blenlib/intern/bpath.c
index cf7eb873409..b145eabed94 100644
--- a/source/blender/blenlib/intern/bpath.c
+++ b/source/blender/blenlib/intern/bpath.c
@@ -29,6 +29,7 @@
#include <sys/stat.h>
#include <string.h>
+#include <assert.h>
/* path/file handeling stuff */
#ifndef WIN32
@@ -44,6 +45,8 @@
#include "DNA_mesh_types.h"
#include "DNA_scene_types.h" /* to get the current frame */
#include "DNA_image_types.h"
+#include "DNA_texture_types.h"
+#include "DNA_text_types.h"
#include "DNA_sound_types.h"
#include "DNA_sequence_types.h"
#include "DNA_vfont_types.h"
@@ -51,11 +54,12 @@
#include "BLI_blenlib.h"
#include "BLI_bpath.h"
+#include "BLI_utildefines.h"
#include "BKE_global.h"
#include "BKE_image.h" /* so we can check the image's type */
-#include "BKE_main.h" /* so we can access G.main->*.first */
#include "BKE_sequencer.h"
+#include "BKE_main.h"
#include "BKE_utildefines.h"
#include "BKE_report.h"
@@ -65,11 +69,42 @@
//XXX #include "BSE_sequence.h"
//XXX define below from BSE_sequence.h - otherwise potentially odd behaviour
+
+typedef struct BPathIteratorSeqData {
+ int totseq;
+ int seq;
+ struct Sequence **seqar; /* Sequence */
+ struct Scene *scene; /* Current scene */
+} BPathIteratorSeqData;
+
+typedef struct BPathIterator {
+ char* _path; /* never access directly, use BLI_bpathIterator_getPath */
+ const char* _lib;
+ const char* _name;
+ void* data;
+ int len;
+ int type;
+ int flag; /* iterator options */
+
+ void (*setpath_callback)(struct BPathIterator *, const char *);
+ void (*getpath_callback)(struct BPathIterator *, char *);
+
+ const char* base_path; /* base path, the directry the blend file is in - normally bmain->name */
+
+ Main *bmain;
+
+ /* only for seq data */
+ struct BPathIteratorSeqData seqdata;
+} BPathIterator;
+
#define FILE_MAX 240
+
/* TODO - BPATH_PLUGIN, BPATH_SEQ */
enum BPathTypes {
- BPATH_IMAGE = 0,
+ BPATH_IMAGE= 0,
+ BPATH_TEXTURE,
+ BPATH_TEXT,
BPATH_SOUND,
BPATH_FONT,
BPATH_LIB,
@@ -79,52 +114,67 @@ enum BPathTypes {
BPATH_DONE
};
-void BLI_bpathIterator_init( struct BPathIterator *bpi, char *base_path ) {
- bpi->type = BPATH_IMAGE;
- bpi->data = NULL;
+void BLI_bpathIterator_init(struct BPathIterator **bpi_pt, Main *bmain, const char *basedir, const int flag)
+{
+ BPathIterator *bpi;
+
+ bpi= MEM_mallocN(sizeof(BPathIterator), "BLI_bpathIterator_init");
+ *bpi_pt= bpi;
+
+ bpi->type= BPATH_IMAGE;
+ bpi->data= NULL;
- bpi->getpath_callback = NULL;
- bpi->setpath_callback = NULL;
+ bpi->getpath_callback= NULL;
+ bpi->setpath_callback= NULL;
/* Sequencer specific */
- bpi->seqdata.totseq = 0;
- bpi->seqdata.seq = 0;
- bpi->seqdata.seqar = NULL;
- bpi->seqdata.scene = NULL;
-
- bpi->base_path= base_path ? base_path : G.sce;
+ bpi->seqdata.totseq= 0;
+ bpi->seqdata.seq= 0;
+ bpi->seqdata.seqar= NULL;
+ bpi->seqdata.scene= NULL;
+
+ bpi->flag= flag;
+
+ bpi->base_path= basedir; /* normally bmain->name */
+ bpi->bmain= bmain;
BLI_bpathIterator_step(bpi);
}
-void BLI_bpathIterator_free( struct BPathIterator *bpi ) {
+void BLI_bpathIterator_alloc(struct BPathIterator **bpi) {
+ *bpi= MEM_mallocN(sizeof(BPathIterator), "BLI_bpathIterator_alloc");
+}
+
+void BLI_bpathIterator_free(struct BPathIterator *bpi) {
if (bpi->seqdata.seqar)
MEM_freeN((void *)bpi->seqdata.seqar);
- bpi->seqdata.seqar = NULL;
- bpi->seqdata.scene = NULL;
+ bpi->seqdata.seqar= NULL;
+ bpi->seqdata.scene= NULL;
+
+ MEM_freeN(bpi);
}
-void BLI_bpathIterator_getPath( struct BPathIterator *bpi, char *path) {
+void BLI_bpathIterator_getPath(struct BPathIterator *bpi, char *path) {
if (bpi->getpath_callback) {
- bpi->getpath_callback( bpi, path );
+ bpi->getpath_callback(bpi, path);
} else {
- strcpy(path, bpi->path); /* warning, we assume 'path' are long enough */
+ strcpy(path, bpi->_path); /* warning, we assume 'path' are long enough */
}
}
-void BLI_bpathIterator_setPath( struct BPathIterator *bpi, char *path) {
+void BLI_bpathIterator_setPath(struct BPathIterator *bpi, const char *path) {
if (bpi->setpath_callback) {
- bpi->setpath_callback( bpi, path );
+ bpi->setpath_callback(bpi, path);
} else {
- strcpy(bpi->path, path); /* warning, we assume 'path' are long enough */
+ strcpy(bpi->_path, path); /* warning, we assume 'path' are long enough */
}
}
-void BLI_bpathIterator_getPathExpanded( struct BPathIterator *bpi, char *path_expanded) {
- char *libpath;
+void BLI_bpathIterator_getPathExpanded(struct BPathIterator *bpi, char *path_expanded) {
+ const char *libpath;
BLI_bpathIterator_getPath(bpi, path_expanded);
- libpath = BLI_bpathIterator_getLib(bpi);
+ libpath= BLI_bpathIterator_getLib(bpi);
if (libpath) { /* check the files location relative to its library path */
BLI_path_abs(path_expanded, libpath);
@@ -133,68 +183,113 @@ void BLI_bpathIterator_getPathExpanded( struct BPathIterator *bpi, char *path_ex
}
BLI_cleanup_file(NULL, path_expanded);
}
-char* BLI_bpathIterator_getLib( struct BPathIterator *bpi) {
- return bpi->lib;
+const char* BLI_bpathIterator_getLib(struct BPathIterator *bpi) {
+ return bpi->_lib;
}
-char* BLI_bpathIterator_getName( struct BPathIterator *bpi) {
- return bpi->name;
+const char* BLI_bpathIterator_getName(struct BPathIterator *bpi) {
+ return bpi->_name;
}
-int BLI_bpathIterator_getType( struct BPathIterator *bpi) {
+int BLI_bpathIterator_getType(struct BPathIterator *bpi) {
return bpi->type;
}
-int BLI_bpathIterator_getPathMaxLen( struct BPathIterator *bpi) {
+int BLI_bpathIterator_getPathMaxLen(struct BPathIterator *bpi) {
return bpi->len;
}
+const char* BLI_bpathIterator_getBasePath(struct BPathIterator *bpi) {
+ return bpi->base_path;
+}
/* gets the first or the next image that has a path - not a viewer node or generated image */
-static struct Image *ima_stepdata__internal(struct Image *ima, int step_next) {
+static struct Image *ima_stepdata__internal(struct Image *ima, const int step_next, const int flag)
+{
if (ima==NULL)
return NULL;
if (step_next)
- ima = ima->id.next;
+ ima= ima->id.next;
while (ima) {
- if (ima->packedfile==NULL && ELEM3(ima->source, IMA_SRC_FILE, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE))
- break;
+ if (ELEM3(ima->source, IMA_SRC_FILE, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
+ if(ima->packedfile==NULL || (flag & BPATH_USE_PACKED)) {
+ break;
+ }
+ }
/* image is not a image with a path, skip it */
- ima = ima->id.next;
+ ima= ima->id.next;
}
return ima;
}
-static struct VFont *vf_stepdata__internal(struct VFont *vf, int step_next) {
+static struct Tex *tex_stepdata__internal(struct Tex *tex, const int step_next, const int UNUSED(flag))
+{
+ if (tex==NULL)
+ return NULL;
+
+ if (step_next)
+ tex= tex->id.next;
+
+ while (tex) {
+ if (tex->type == TEX_VOXELDATA && TEX_VD_IS_SOURCE_PATH(tex->vd->file_format))
+ break;
+ /* image is not a image with a path, skip it */
+ tex= tex->id.next;
+ }
+ return tex;
+}
+
+static struct Text *text_stepdata__internal(struct Text *text, const int step_next, const int UNUSED(flag))
+{
+ if (text==NULL)
+ return NULL;
+
+ if (step_next)
+ text= text->id.next;
+
+ while (text) {
+ if (text->name)
+ break;
+ /* image is not a image with a path, skip it */
+ text= text->id.next;
+ }
+ return text;
+}
+
+static struct VFont *vf_stepdata__internal(struct VFont *vf, const int step_next, const int flag)
+{
if (vf==NULL)
return NULL;
if (step_next)
- vf = vf->id.next;
+ vf= vf->id.next;
while (vf) {
- if (vf->packedfile==NULL && BLI_streq(vf->name, "<builtin>")==0) {
- break;
+ if (strcmp(vf->name, FO_BUILTIN_NAME)!=0) {
+ if(vf->packedfile==NULL || (flag & BPATH_USE_PACKED)) {
+ break;
+ }
}
/* font with no path, skip it */
- vf = vf->id.next;
+ vf= vf->id.next;
}
return vf;
}
-static struct bSound *snd_stepdata__internal(struct bSound *snd, int step_next) {
+static struct bSound *snd_stepdata__internal(struct bSound *snd, int step_next, const int flag)
+{
if (snd==NULL)
return NULL;
if (step_next)
- snd = snd->id.next;
+ snd= snd->id.next;
while (snd) {
- if (snd->packedfile==NULL) {
+ if(snd->packedfile==NULL || (flag & BPATH_USE_PACKED)) {
break;
}
-
+
/* font with no path, skip it */
- snd = snd->id.next;
+ snd= snd->id.next;
}
return snd;
}
@@ -206,7 +301,7 @@ static struct Sequence *seq_stepdata__internal(struct BPathIterator *bpi, int st
/* Initializing */
if (bpi->seqdata.scene==NULL) {
- bpi->seqdata.scene= G.main->scene.first;
+ bpi->seqdata.scene= bpi->bmain->scene.first;
}
if (step_next) {
@@ -219,20 +314,20 @@ static struct Sequence *seq_stepdata__internal(struct BPathIterator *bpi, int st
if (bpi->seqdata.seqar == NULL) {
/* allocate the sequencer array */
seq_array(ed, &bpi->seqdata.seqar, &bpi->seqdata.totseq, 0);
- bpi->seqdata.seq = 0;
+ bpi->seqdata.seq= 0;
}
if (bpi->seqdata.seq >= bpi->seqdata.totseq) {
- seq = NULL;
+ seq= NULL;
} else {
- seq = bpi->seqdata.seqar[bpi->seqdata.seq];
- while (!SEQ_HAS_PATH(seq)) {
+ seq= bpi->seqdata.seqar[bpi->seqdata.seq];
+ while (!SEQ_HAS_PATH(seq) && seq->plugin==NULL) {
bpi->seqdata.seq++;
if (bpi->seqdata.seq >= bpi->seqdata.totseq) {
- seq = NULL;
+ seq= NULL;
break;
}
- seq = bpi->seqdata.seqar[bpi->seqdata.seq];
+ seq= bpi->seqdata.seqar[bpi->seqdata.seq];
}
}
if (seq) {
@@ -241,13 +336,13 @@ static struct Sequence *seq_stepdata__internal(struct BPathIterator *bpi, int st
/* keep looking through the next scene, reallocate seq array */
if (bpi->seqdata.seqar) {
MEM_freeN((void *)bpi->seqdata.seqar);
- bpi->seqdata.seqar = NULL;
+ bpi->seqdata.seqar= NULL;
}
- bpi->seqdata.scene = bpi->seqdata.scene->id.next;
+ bpi->seqdata.scene= bpi->seqdata.scene->id.next;
}
} else {
/* no seq data in this scene, next */
- bpi->seqdata.scene = bpi->seqdata.scene->id.next;
+ bpi->seqdata.scene= bpi->seqdata.scene->id.next;
}
}
@@ -255,10 +350,10 @@ static struct Sequence *seq_stepdata__internal(struct BPathIterator *bpi, int st
}
static void seq_getpath(struct BPathIterator *bpi, char *path) {
- Sequence *seq = (Sequence *)bpi->data;
+ Sequence *seq= (Sequence *)bpi->data;
- path[0] = '\0'; /* incase we cant get the path */
+ path[0]= '\0'; /* incase we cant get the path */
if (seq==NULL) return;
if (SEQ_HAS_PATH(seq)) {
if (ELEM3(seq->type, SEQ_IMAGE, SEQ_MOVIE, SEQ_SOUND)) {
@@ -268,25 +363,52 @@ static void seq_getpath(struct BPathIterator *bpi, char *path) {
/* Using the first image is weak for image sequences */
strcat(path, seq->strip->stripdata->name);
}
- } else {
+ }
+ else {
/* simple case */
BLI_strncpy(seq->strip->dir, path, sizeof(seq->strip->dir));
}
}
+ else if (seq->plugin) {
+ BLI_strncpy(seq->plugin->name, path, sizeof(seq->plugin->name));
+ }
}
-static void seq_setpath(struct BPathIterator *bpi, char *path) {
- Sequence *seq = (Sequence *)bpi->data;
+static void seq_setpath(struct BPathIterator *bpi, const char *path) {
+ Sequence *seq= (Sequence *)bpi->data;
if (seq==NULL) return;
if (SEQ_HAS_PATH(seq)) {
if (ELEM3(seq->type, SEQ_IMAGE, SEQ_MOVIE, SEQ_SOUND)) {
BLI_split_dirfile(path, seq->strip->dir, seq->strip->stripdata->name);
- } else {
+ }
+ else {
/* simple case */
BLI_strncpy(seq->strip->dir, path, sizeof(seq->strip->dir));
}
}
+ else if (seq->plugin) {
+ BLI_strncpy(seq->plugin->name, path, sizeof(seq->plugin->name));
+ }
+}
+
+static void text_getpath(struct BPathIterator *bpi, char *path) {
+ Text *text= (Text *)bpi->data;
+ path[0]= '\0'; /* incase we cant get the path */
+ if(text->name) {
+ strcpy(path, text->name);
+ }
+}
+
+static void text_setpath(struct BPathIterator *bpi, const char *path) {
+ Text *text= (Text *)bpi->data;
+ if (text==NULL) return;
+
+ if(text->name) {
+ MEM_freeN(text->name);
+ }
+
+ text->name= BLI_strdup(path);
}
static struct Mesh *cdata_stepdata__internal(struct Mesh *me, int step_next) {
@@ -294,72 +416,125 @@ static struct Mesh *cdata_stepdata__internal(struct Mesh *me, int step_next) {
return NULL;
if (step_next)
- me = me->id.next;
+ me= me->id.next;
while (me) {
if (me->fdata.external) {
break;
}
- me = me->id.next;
+ me= me->id.next;
}
return me;
}
-static void bpi_type_step__internal( struct BPathIterator *bpi) {
+static void bpi_type_step__internal(struct BPathIterator *bpi) {
bpi->type++; /* advance to the next type */
- bpi->data = NULL;
+ bpi->data= NULL;
switch (bpi->type) {
case BPATH_SEQ:
- bpi->getpath_callback = seq_getpath;
- bpi->setpath_callback = seq_setpath;
+ bpi->getpath_callback= seq_getpath;
+ bpi->setpath_callback= seq_setpath;
+ break;
+ case BPATH_TEXT: /* path is malloc'd */
+ bpi->getpath_callback= text_getpath;
+ bpi->setpath_callback= text_setpath;
break;
default:
- bpi->getpath_callback = NULL;
- bpi->setpath_callback = NULL;
+ bpi->getpath_callback= NULL;
+ bpi->setpath_callback= NULL;
break;
}
}
-void BLI_bpathIterator_step( struct BPathIterator *bpi) {
+void BLI_bpathIterator_step(struct BPathIterator *bpi) {
while (bpi->type != BPATH_DONE) {
if ((bpi->type) == BPATH_IMAGE) {
- /*if (bpi->data) bpi->data = ((ID *)bpi->data)->next;*/
- if (bpi->data) bpi->data = ima_stepdata__internal( (Image *)bpi->data, 1 ); /* must skip images that have no path */
- else bpi->data = ima_stepdata__internal(G.main->image.first, 0);
+ /*if (bpi->data) bpi->data= ((ID *)bpi->data)->next;*/
+ if (bpi->data) bpi->data= ima_stepdata__internal((Image *)bpi->data, 1, bpi->flag); /* must skip images that have no path */
+ else bpi->data= ima_stepdata__internal(bpi->bmain->image.first, 0, bpi->flag);
if (bpi->data) {
/* get the path info from this datatype */
- Image *ima = (Image *)bpi->data;
+ Image *ima= (Image *)bpi->data;
- bpi->lib = ima->id.lib ? ima->id.lib->filepath : NULL;
- bpi->path = ima->name;
- bpi->name = ima->id.name+2;
- bpi->len = sizeof(ima->name);
+ bpi->_lib= ima->id.lib ? ima->id.lib->filepath : NULL;
+ bpi->_path= ima->name;
+ bpi->_name= ima->id.name+2;
+ bpi->len= sizeof(ima->name);
/* we are done, advancing to the next item, this type worked fine */
break;
-
+
} else {
bpi_type_step__internal(bpi);
}
-
-
- } else if ((bpi->type) == BPATH_SOUND) {
- if (bpi->data) bpi->data = snd_stepdata__internal( (bSound *)bpi->data, 1 ); /* must skip images that have no path */
- else bpi->data = snd_stepdata__internal(G.main->sound.first, 0);
-
+ }
+
+ if ((bpi->type) == BPATH_TEXTURE) {
+ /*if (bpi->data) bpi->data= ((ID *)bpi->data)->next;*/
+ if (bpi->data) bpi->data= tex_stepdata__internal( (Tex *)bpi->data, 1, bpi->flag); /* must skip images that have no path */
+ else bpi->data= tex_stepdata__internal(bpi->bmain->tex.first, 0, bpi->flag);
+
if (bpi->data) {
/* get the path info from this datatype */
- bSound *snd = (bSound *)bpi->data;
-
- bpi->lib = snd->id.lib ? snd->id.lib->filepath : NULL;
- bpi->path = snd->name;
- bpi->name = snd->id.name+2;
- bpi->len = sizeof(snd->name);
-
+ Tex *tex= (Tex *)bpi->data;
+
+ if(tex->type == TEX_VOXELDATA) {
+ bpi->_lib= tex->id.lib ? tex->id.lib->filepath : NULL;
+ bpi->_path= tex->vd->source_path;
+ bpi->_name= tex->id.name+2;
+ bpi->len= sizeof(tex->vd->source_path);
+ }
+ else {
+ assert(!"Texture has no path, incorrect step 'tex_stepdata__internal'");
+ }
+
+ /* we are done, advancing to the next item, this type worked fine */
+ break;
+
+ } else {
+ bpi_type_step__internal(bpi);
+ }
+ }
+
+ if ((bpi->type) == BPATH_TEXT) {
+ /*if (bpi->data) bpi->data= ((ID *)bpi->data)->next;*/
+ if (bpi->data) bpi->data= text_stepdata__internal((Text *)bpi->data, 1, bpi->flag); /* must skip images that have no path */
+ else bpi->data= text_stepdata__internal(bpi->bmain->text.first, 0, bpi->flag);
+
+ if (bpi->data) {
+ /* get the path info from this datatype */
+ Text *text= (Text *)bpi->data;
+
+ bpi->_lib= text->id.lib ? text->id.lib->filepath : NULL;
+ bpi->_path= NULL; /* bpi->path= text->name; */ /* get/set functions override. */
+ bpi->_name= text->id.name+2;
+ bpi->len= FILE_MAX; /* malloc'd but limit anyway since large paths may mess up other areas */
+
+ /* we are done, advancing to the next item, this type worked fine */
+ break;
+
+ } else {
+ bpi_type_step__internal(bpi);
+ }
+ }
+
+ else if ((bpi->type) == BPATH_SOUND) {
+ if (bpi->data) bpi->data= snd_stepdata__internal((bSound *)bpi->data, 1, bpi->flag); /* must skip images that have no path */
+ else bpi->data= snd_stepdata__internal(bpi->bmain->sound.first, 0, bpi->flag);
+
+ if (bpi->data) {
+ /* get the path info from this datatype */
+ bSound *snd= (bSound *)bpi->data;
+
+ bpi->_lib= snd->id.lib ? snd->id.lib->filepath : NULL;
+ bpi->_path= snd->name;
+ bpi->_name= snd->id.name+2;
+ bpi->len= sizeof(snd->name);
+
/* we are done, advancing to the next item, this type worked fine */
break;
} else {
@@ -369,36 +544,36 @@ void BLI_bpathIterator_step( struct BPathIterator *bpi) {
} else if ((bpi->type) == BPATH_FONT) {
- if (bpi->data) bpi->data = vf_stepdata__internal( (VFont *)bpi->data, 1 );
- else bpi->data = vf_stepdata__internal( G.main->vfont.first, 0 );
+ if (bpi->data) bpi->data= vf_stepdata__internal((VFont *)bpi->data, 1, bpi->flag);
+ else bpi->data= vf_stepdata__internal(bpi->bmain->vfont.first, 0, bpi->flag);
if (bpi->data) {
/* get the path info from this datatype */
- VFont *vf = (VFont *)bpi->data;
-
- bpi->lib = vf->id.lib ? vf->id.lib->filepath : NULL;
- bpi->path = vf->name;
- bpi->name = vf->id.name+2;
- bpi->len = sizeof(vf->name);
-
+ VFont *vf= (VFont *)bpi->data;
+
+ bpi->_lib= vf->id.lib ? vf->id.lib->filepath : NULL;
+ bpi->_path= vf->name;
+ bpi->_name= vf->id.name+2;
+ bpi->len= sizeof(vf->name);
+
/* we are done, advancing to the next item, this type worked fine */
break;
} else {
bpi_type_step__internal(bpi);
}
-
+
} else if ((bpi->type) == BPATH_LIB) {
- if (bpi->data) bpi->data = ((ID *)bpi->data)->next;
- else bpi->data = G.main->library.first;
+ if (bpi->data) bpi->data= ((ID *)bpi->data)->next;
+ else bpi->data= bpi->bmain->library.first;
if (bpi->data) {
/* get the path info from this datatype */
- Library *lib = (Library *)bpi->data;
+ Library *lib= (Library *)bpi->data;
- bpi->lib = NULL;
- bpi->path = lib->name;
- bpi->name = NULL;
- bpi->len = sizeof(lib->name);
+ bpi->_lib= NULL;
+ bpi->_path= lib->name;
+ bpi->_name= NULL;
+ bpi->len= sizeof(lib->name);
/* we are done, advancing to the next item, this type worked fine */
break;
@@ -406,27 +581,27 @@ void BLI_bpathIterator_step( struct BPathIterator *bpi) {
bpi_type_step__internal(bpi);
}
} else if ((bpi->type) == BPATH_SEQ) {
- if (bpi->data) bpi->data = seq_stepdata__internal( bpi, 1 );
- else bpi->data = seq_stepdata__internal( bpi, 0 );
+ if (bpi->data) bpi->data= seq_stepdata__internal( bpi, 1 );
+ else bpi->data= seq_stepdata__internal( bpi, 0 );
if (bpi->data) {
- Sequence *seq = (Sequence *)bpi->data;
- bpi->lib = NULL;
- bpi->name = seq->name+2;
- bpi->len = sizeof(seq->strip->stripdata->name);
+ Sequence *seq= (Sequence *)bpi->data;
+ bpi->_lib= NULL;
+ bpi->_name= seq->name+2;
+ bpi->len= seq->plugin ? sizeof(seq->plugin->name) : sizeof(seq->strip->dir) + sizeof(seq->strip->stripdata->name);
break;
} else {
bpi_type_step__internal(bpi);
}
} else if ((bpi->type) == BPATH_CDATA) {
- if (bpi->data) bpi->data = cdata_stepdata__internal( bpi->data, 1 );
- else bpi->data = cdata_stepdata__internal( G.main->mesh.first, 0 );
+ if (bpi->data) bpi->data= cdata_stepdata__internal( bpi->data, 1 );
+ else bpi->data= cdata_stepdata__internal( bpi->bmain->mesh.first, 0 );
if (bpi->data) {
- Mesh *me = (Mesh *)bpi->data;
- bpi->lib = me->id.lib ? me->id.lib->filepath : NULL;
- bpi->path = me->fdata.external->filename;
- bpi->name = me->id.name+2;
- bpi->len = sizeof(me->fdata.external->filename);
+ Mesh *me= (Mesh *)bpi->data;
+ bpi->_lib= me->id.lib ? me->id.lib->filepath : NULL;
+ bpi->_path= me->fdata.external->filename;
+ bpi->_name= me->id.name+2;
+ bpi->len= sizeof(me->fdata.external->filename);
break;
} else {
bpi_type_step__internal(bpi);
@@ -442,8 +617,8 @@ int BLI_bpathIterator_isDone( struct BPathIterator *bpi) {
/* include the path argument */
static void bpath_as_report(struct BPathIterator *bpi, const char *message, ReportList *reports)
{
- char *prefix;
- char *name;
+ const char *prefix;
+ const char *name;
char path_expanded[FILE_MAXDIR*2];
if(reports==NULL)
@@ -453,6 +628,12 @@ static void bpath_as_report(struct BPathIterator *bpi, const char *message, Repo
case BPATH_IMAGE:
prefix= "Image";
break;
+ case BPATH_TEXTURE:
+ prefix= "Texture";
+ break;
+ case BPATH_TEXT:
+ prefix= "Text";
+ break;
case BPATH_SOUND:
prefix= "Sound";
break;
@@ -473,7 +654,7 @@ static void bpath_as_report(struct BPathIterator *bpi, const char *message, Repo
break;
}
- name = BLI_bpathIterator_getName(bpi);
+ name= BLI_bpathIterator_getName(bpi);
BLI_bpathIterator_getPathExpanded(bpi, path_expanded);
if(reports) {
@@ -484,37 +665,38 @@ static void bpath_as_report(struct BPathIterator *bpi, const char *message, Repo
}
/* high level function */
-void checkMissingFiles(char *basepath, ReportList *reports) {
- struct BPathIterator bpi;
+void checkMissingFiles(Main *bmain, ReportList *reports) {
+ struct BPathIterator *bpi;
/* be sure there is low chance of the path being too short */
char filepath_expanded[FILE_MAXDIR*2];
- BLI_bpathIterator_init(&bpi, basepath);
- while (!BLI_bpathIterator_isDone(&bpi)) {
- BLI_bpathIterator_getPathExpanded( &bpi, filepath_expanded );
+ BLI_bpathIterator_init(&bpi, bmain, bmain->name, 0);
+ while (!BLI_bpathIterator_isDone(bpi)) {
+ BLI_bpathIterator_getPathExpanded(bpi, filepath_expanded);
if (!BLI_exists(filepath_expanded))
- bpath_as_report(&bpi, "file not found", reports);
+ bpath_as_report(bpi, "file not found", reports);
- BLI_bpathIterator_step(&bpi);
+ BLI_bpathIterator_step(bpi);
}
- BLI_bpathIterator_free(&bpi);
+ BLI_bpathIterator_free(bpi);
}
/* dont log any errors at the moment, should probably do this */
-void makeFilesRelative(char *basepath, ReportList *reports) {
+void makeFilesRelative(Main *bmain, const char *basedir, ReportList *reports) {
int tot= 0, changed= 0, failed= 0, linked= 0;
- struct BPathIterator bpi;
- char filepath[FILE_MAX], *libpath;
+ struct BPathIterator *bpi;
+ char filepath[FILE_MAX];
+ const char *libpath;
/* be sure there is low chance of the path being too short */
char filepath_relative[(FILE_MAXDIR * 2) + FILE_MAXFILE];
- BLI_bpathIterator_init(&bpi, basepath);
- while (!BLI_bpathIterator_isDone(&bpi)) {
- BLI_bpathIterator_getPath(&bpi, filepath);
- libpath = BLI_bpathIterator_getLib(&bpi);
+ BLI_bpathIterator_init(&bpi, bmain, basedir, 0);
+ while (!BLI_bpathIterator_isDone(bpi)) {
+ BLI_bpathIterator_getPath(bpi, filepath);
+ libpath= BLI_bpathIterator_getLib(bpi);
if(strncmp(filepath, "//", 2)) {
if (libpath) { /* cant make relative if we are library - TODO, LOG THIS */
@@ -523,27 +705,27 @@ void makeFilesRelative(char *basepath, ReportList *reports) {
BLI_strncpy(filepath_relative, filepath, sizeof(filepath_relative));
/* Important BLI_cleanup_dir runs before the path is made relative
* because it wont work for paths that start with "//../" */
- BLI_cleanup_file(bpi.base_path, filepath_relative); /* fix any /foo/../foo/ */
- BLI_path_rel(filepath_relative, bpi.base_path);
+ BLI_cleanup_file(bpi->base_path, filepath_relative); /* fix any /foo/../foo/ */
+ BLI_path_rel(filepath_relative, bpi->base_path);
/* be safe and check the length */
- if (BLI_bpathIterator_getPathMaxLen(&bpi) <= strlen(filepath_relative)) {
- bpath_as_report(&bpi, "couldn't make path relative (too long)", reports);
+ if (BLI_bpathIterator_getPathMaxLen(bpi) <= strlen(filepath_relative)) {
+ bpath_as_report(bpi, "couldn't make path relative (too long)", reports);
failed++;
} else {
if(strncmp(filepath_relative, "//", 2)==0) {
- BLI_bpathIterator_setPath(&bpi, filepath_relative);
+ BLI_bpathIterator_setPath(bpi, filepath_relative);
changed++;
} else {
- bpath_as_report(&bpi, "couldn't make path relative", reports);
+ bpath_as_report(bpi, "couldn't make path relative", reports);
failed++;
}
}
}
}
- BLI_bpathIterator_step(&bpi);
+ BLI_bpathIterator_step(bpi);
tot++;
}
- BLI_bpathIterator_free(&bpi);
+ BLI_bpathIterator_free(bpi);
if(reports)
BKE_reportf(reports, failed ? RPT_ERROR : RPT_INFO, "Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
@@ -551,46 +733,47 @@ void makeFilesRelative(char *basepath, ReportList *reports) {
/* dont log any errors at the moment, should probably do this -
* Verry similar to makeFilesRelative - keep in sync! */
-void makeFilesAbsolute(char *basepath, ReportList *reports)
+void makeFilesAbsolute(Main *bmain, const char *basedir, ReportList *reports)
{
int tot= 0, changed= 0, failed= 0, linked= 0;
- struct BPathIterator bpi;
- char filepath[FILE_MAX], *libpath;
+ struct BPathIterator *bpi;
+ char filepath[FILE_MAX];
+ const char *libpath;
/* be sure there is low chance of the path being too short */
char filepath_absolute[(FILE_MAXDIR * 2) + FILE_MAXFILE];
- BLI_bpathIterator_init(&bpi, basepath);
- while (!BLI_bpathIterator_isDone(&bpi)) {
- BLI_bpathIterator_getPath(&bpi, filepath);
- libpath = BLI_bpathIterator_getLib(&bpi);
+ BLI_bpathIterator_init(&bpi, bmain, basedir, 0);
+ while (!BLI_bpathIterator_isDone(bpi)) {
+ BLI_bpathIterator_getPath(bpi, filepath);
+ libpath= BLI_bpathIterator_getLib(bpi);
if(strncmp(filepath, "//", 2)==0) {
if (libpath) { /* cant make absolute if we are library - TODO, LOG THIS */
linked++;
} else { /* get the expanded path and check it is relative or too long */
- BLI_bpathIterator_getPathExpanded( &bpi, filepath_absolute );
- BLI_cleanup_file(bpi.base_path, filepath_absolute); /* fix any /foo/../foo/ */
+ BLI_bpathIterator_getPathExpanded(bpi, filepath_absolute);
+ BLI_cleanup_file(bpi->base_path, filepath_absolute); /* fix any /foo/../foo/ */
/* to be safe, check the length */
- if (BLI_bpathIterator_getPathMaxLen(&bpi) <= strlen(filepath_absolute)) {
- bpath_as_report(&bpi, "couldn't make absolute (too long)", reports);
+ if (BLI_bpathIterator_getPathMaxLen(bpi) <= strlen(filepath_absolute)) {
+ bpath_as_report(bpi, "couldn't make absolute (too long)", reports);
failed++;
} else {
if(strncmp(filepath_absolute, "//", 2)) {
- BLI_bpathIterator_setPath(&bpi, filepath_absolute);
+ BLI_bpathIterator_setPath(bpi, filepath_absolute);
changed++;
} else {
- bpath_as_report(&bpi, "couldn't make absolute", reports);
+ bpath_as_report(bpi, "couldn't make absolute", reports);
failed++;
}
}
}
}
- BLI_bpathIterator_step(&bpi);
+ BLI_bpathIterator_step(bpi);
tot++;
}
- BLI_bpathIterator_free(&bpi);
+ BLI_bpathIterator_free(bpi);
if(reports)
BKE_reportf(reports, failed ? RPT_ERROR : RPT_INFO, "Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
@@ -612,15 +795,15 @@ static int findFileRecursive(char *filename_new, const char *dirname, const char
char path[FILE_MAX];
int size;
- dir = opendir(dirname);
+ dir= opendir(dirname);
if (dir==0)
return 0;
if (*filesize == -1)
- *filesize = 0; /* dir opened fine */
+ *filesize= 0; /* dir opened fine */
- while ((de = readdir(dir)) != NULL) {
+ while ((de= readdir(dir)) != NULL) {
if (strcmp(".", de->d_name)==0 || strcmp("..", de->d_name)==0)
continue;
@@ -633,9 +816,9 @@ static int findFileRecursive(char *filename_new, const char *dirname, const char
if (S_ISREG(status.st_mode)) { /* is file */
if (strncmp(filename, de->d_name, FILE_MAX)==0) { /* name matches */
/* open the file to read its size */
- size = status.st_size;
+ size= status.st_size;
if ((size > 0) && (size > *filesize)) { /* find the biggest file */
- *filesize = size;
+ *filesize= size;
BLI_strncpy(filename_new, path, FILE_MAX);
}
}
@@ -652,12 +835,13 @@ static int findFileRecursive(char *filename_new, const char *dirname, const char
}
/* high level function - call from fileselector */
-void findMissingFiles(char *basepath, char *str) {
- struct BPathIterator bpi;
+void findMissingFiles(Main *bmain, const char *str) {
+ struct BPathIterator *bpi;
/* be sure there is low chance of the path being too short */
char filepath_expanded[FILE_MAXDIR*2];
- char filepath[FILE_MAX], *libpath;
+ char filepath[FILE_MAX];
+ const char *libpath;
int filesize, recur_depth;
char dirname[FILE_MAX], filename_new[FILE_MAX];
@@ -666,11 +850,11 @@ void findMissingFiles(char *basepath, char *str) {
BLI_split_dirfile(str, dirname, NULL);
- BLI_bpathIterator_init(&bpi, basepath);
+ BLI_bpathIterator_init(&bpi, bmain, bmain->name, 0);
- while (!BLI_bpathIterator_isDone(&bpi)) {
- BLI_bpathIterator_getPath(&bpi, filepath);
- libpath = BLI_bpathIterator_getLib(&bpi);
+ while (!BLI_bpathIterator_isDone(bpi)) {
+ BLI_bpathIterator_getPath(bpi, filepath);
+ libpath= BLI_bpathIterator_getLib(bpi);
/* Check if esc was pressed because searching files can be slow */
/*XXX if (blender_test_break()) {
@@ -679,12 +863,12 @@ void findMissingFiles(char *basepath, char *str) {
if (libpath==NULL) {
- BLI_bpathIterator_getPathExpanded( &bpi, filepath_expanded );
+ BLI_bpathIterator_getPathExpanded(bpi, filepath_expanded);
if (!BLI_exists(filepath_expanded)) {
/* can the dir be opened? */
- filesize = -1;
- recur_depth = 0;
+ filesize= -1;
+ recur_depth= 0;
findFileRecursive(filename_new, dirname, BLI_path_basename(filepath), &filesize, &recur_depth);
if (filesize == -1) { /* could not open dir */
@@ -694,21 +878,21 @@ void findMissingFiles(char *basepath, char *str) {
if (filesize > 0) {
- if (BLI_bpathIterator_getPathMaxLen( &bpi ) < strlen(filename_new)) {
+ if (BLI_bpathIterator_getPathMaxLen(bpi) < strlen(filename_new)) {
printf("cannot set path \"%s\" too long!", filename_new);
} else {
/* copy the found path into the old one */
if (G.relbase_valid)
- BLI_path_rel(filename_new, bpi.base_path);
+ BLI_path_rel(filename_new, bpi->base_path);
- BLI_bpathIterator_setPath( &bpi, filename_new );
+ BLI_bpathIterator_setPath(bpi, filename_new);
}
}
}
}
- BLI_bpathIterator_step(&bpi);
+ BLI_bpathIterator_step(bpi);
}
- BLI_bpathIterator_free(&bpi);
+ BLI_bpathIterator_free(bpi);
//XXX waitcursor( 0 );
}
diff --git a/source/blender/blenlib/intern/dynlib.c b/source/blender/blenlib/intern/dynlib.c
index 55d6ce7a241..76a8a571480 100644
--- a/source/blender/blenlib/intern/dynlib.c
+++ b/source/blender/blenlib/intern/dynlib.c
@@ -63,7 +63,7 @@ PILdynlib *PIL_dynlib_open(char *name) {
}
}
-void *PIL_dynlib_find_symbol(PILdynlib* lib, char *symname) {
+void *PIL_dynlib_find_symbol(PILdynlib* lib, const char *symname) {
return GetProcAddress(lib->handle, symname);
}
@@ -117,11 +117,12 @@ PILdynlib *PIL_dynlib_open(char *name) {
}
}
-void *PIL_dynlib_find_symbol(PILdynlib* lib, char *symname) {
+void *PIL_dynlib_find_symbol(PILdynlib* lib, const char *symname) {
return dlsym(lib->handle, symname);
}
char *PIL_dynlib_get_error_as_string(PILdynlib* lib) {
+ (void)lib; /* unused */
return dlerror();
}
diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c
index 06b427240ba..462e3ed9d01 100644
--- a/source/blender/blenlib/intern/fileops.c
+++ b/source/blender/blenlib/intern/fileops.c
@@ -53,74 +53,12 @@
#include "BLO_sys_types.h" // for intptr_t support
-/* implementations: */
-char *first_slash(char *string) {
- char *ffslash, *fbslash;
-
- ffslash= strchr(string, '/');
- fbslash= strchr(string, '\\');
-
- if (!ffslash) return fbslash;
- else if (!fbslash) return ffslash;
-
- if ((intptr_t)ffslash < (intptr_t)fbslash) return ffslash;
- else return fbslash;
-}
-
-char *BLI_last_slash(const char *string) {
- char *lfslash, *lbslash;
-
- lfslash= strrchr(string, '/');
- lbslash= strrchr(string, '\\');
-
- if (!lfslash) return lbslash;
- else if (!lbslash) return lfslash;
-
- if ((intptr_t)lfslash < (intptr_t)lbslash) return lbslash;
- else return lfslash;
-}
-
-/* adds a slash if there isnt one there already */
-int BLI_add_slash(char *string) {
- int len = strlen(string);
-#ifdef WIN32
- if (len==0 || string[len-1]!='\\') {
- string[len] = '\\';
- string[len+1] = '\0';
- return len+1;
- }
-#else
- if (len==0 || string[len-1]!='/') {
- string[len] = '/';
- string[len+1] = '\0';
- return len+1;
- }
-#endif
- return len;
-}
-
-/* removes a slash if there is one */
-void BLI_del_slash(char *string) {
- int len = strlen(string);
- while (len) {
-#ifdef WIN32
- if (string[len-1]=='\\') {
-#else
- if (string[len-1]=='/') {
-#endif
- string[len-1] = '\0';
- len--;
- } else {
- break;
- }
- }
-}
/* gzip the file in from and write it to "to".
return -1 if zlib fails, -2 if the originating file does not exist
note: will remove the "from" file
*/
-int BLI_gzip(char *from, char *to) {
+int BLI_gzip(const char *from, const char *to) {
char buffer[10240];
int file;
int readsize = 0;
@@ -160,7 +98,7 @@ int BLI_gzip(char *from, char *to) {
}
/* return 1 when file can be written */
-int BLI_is_writable(char *filename)
+int BLI_is_writable(const char *filename)
{
int file;
@@ -205,7 +143,7 @@ int BLI_touch(const char *file)
return 0;
}
-int BLI_exists(char *file) {
+int BLI_exists(const char *file) {
return BLI_exist(file);
}
@@ -213,7 +151,7 @@ int BLI_exists(char *file) {
static char str[MAXPATHLEN+12];
-int BLI_delete(char *file, int dir, int recursive) {
+int BLI_delete(const char *file, int dir, int recursive) {
int err;
if (recursive) {
@@ -230,7 +168,7 @@ int BLI_delete(char *file, int dir, int recursive) {
return err;
}
-int BLI_move(char *file, char *to) {
+int BLI_move(const char *file, const char *to) {
int err;
// windows doesn't support moveing to a directory
@@ -255,7 +193,7 @@ int BLI_move(char *file, char *to) {
}
-int BLI_copy_fileops(char *file, char *to) {
+int BLI_copy_fileops(const char *file, const char *to) {
int err;
// windows doesn't support copying to a directory
@@ -280,13 +218,13 @@ int BLI_copy_fileops(char *file, char *to) {
return err;
}
-int BLI_link(char *file, char *to) {
+int BLI_link(const char *file, const char *to) {
callLocalErrorCallBack("Linking files is unsupported on Windows");
return 1;
}
-void BLI_recurdir_fileops(char *dirname) {
+void BLI_recurdir_fileops(const char *dirname) {
char *lslash;
char tmp[MAXPATHLEN];
@@ -316,7 +254,7 @@ void BLI_recurdir_fileops(char *dirname) {
callLocalErrorCallBack("Unable to create directory\n");
}
-int BLI_rename(char *from, char *to) {
+int BLI_rename(const char *from, const char *to) {
if (!BLI_exists(from)) return 0;
/* make sure the filenames are different (case insensitive) before removing */
@@ -326,7 +264,7 @@ int BLI_rename(char *from, char *to) {
return rename(from, to);
}
-#else /* The weirdo UNIX world */
+#else /* The UNIX world */
/*
* but the UNIX world is tied to the interface, and the system
@@ -335,7 +273,7 @@ int BLI_rename(char *from, char *to) {
* */
static char str[MAXPATHLEN+12];
-int BLI_delete(char *file, int dir, int recursive)
+int BLI_delete(const char *file, int dir, int recursive)
{
if(strchr(file, '"')) {
printf("Error: not deleted file %s because of quote!\n", file);
@@ -356,25 +294,25 @@ int BLI_delete(char *file, int dir, int recursive)
return -1;
}
-int BLI_move(char *file, char *to) {
+int BLI_move(const char *file, const char *to) {
sprintf(str, "/bin/mv -f \"%s\" \"%s\"", file, to);
return system(str);
}
-int BLI_copy_fileops(char *file, char *to) {
+int BLI_copy_fileops(const char *file, const char *to) {
sprintf(str, "/bin/cp -rf \"%s\" \"%s\"", file, to);
return system(str);
}
-int BLI_link(char *file, char *to) {
+int BLI_link(const char *file, const char *to) {
sprintf(str, "/bin/ln -f \"%s\" \"%s\"", file, to);
return system(str);
}
-void BLI_recurdir_fileops(char *dirname) {
+void BLI_recurdir_fileops(const char *dirname) {
char *lslash;
char tmp[MAXPATHLEN];
@@ -392,7 +330,7 @@ void BLI_recurdir_fileops(char *dirname) {
mkdir(dirname, 0777);
}
-int BLI_rename(char *from, char *to) {
+int BLI_rename(const char *from, const char *to) {
if (!BLI_exists(from)) return 0;
if (BLI_exists(to)) if(BLI_delete(to, 0, 0)) return 1;
diff --git a/source/blender/blenlib/intern/freetypefont.c b/source/blender/blenlib/intern/freetypefont.c
index 6d6abc88999..482ca1c01e5 100644
--- a/source/blender/blenlib/intern/freetypefont.c
+++ b/source/blender/blenlib/intern/freetypefont.c
@@ -46,12 +46,13 @@
#include "BLI_vfontdata.h"
#include "BLI_blenlib.h"
-#include "BLI_math.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
//XXX #include "BIF_toolbox.h"
#include "BKE_font.h"
-#include "BKE_utildefines.h"
+
#include "DNA_vfont_types.h"
#include "DNA_packedFile_types.h"
@@ -126,7 +127,6 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
// get number of on-curve points for beziertriples (including conic virtual on-points)
for(j = 0; j < ftoutline.n_contours; j++) {
- l = 0;
for(k = 0; k < npoints[j]; k++) {
if(j > 0) l = k + ftoutline.contours[j - 1] + 1; else l = k;
if(ftoutline.tags[l] == FT_Curve_Tag_On)
@@ -252,15 +252,15 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
}
// get the handles that are aligned, tricky...
- // DistVL2Dfl, check if the three beztriple points are on one line
- // VecLenf, see if there's a distance between the three points
- // VecLenf again, to check the angle between the handles
+ // dist_to_line_v2, check if the three beztriple points are on one line
+ // len_squared_v2v2, see if there's a distance between the three points
+ // len_squared_v2v2 again, to check the angle between the handles
// finally, check if one of them is a vector handle
if((dist_to_line_v2(bezt->vec[0],bezt->vec[1],bezt->vec[2]) < 0.001) &&
- (len_v3v3(bezt->vec[0], bezt->vec[1]) > 0.0001) &&
- (len_v3v3(bezt->vec[1], bezt->vec[2]) > 0.0001) &&
- (len_v3v3(bezt->vec[0], bezt->vec[2]) > 0.0002) &&
- (len_v3v3(bezt->vec[0], bezt->vec[2]) > MAX2(len_v3v3(bezt->vec[0], bezt->vec[1]), len_v3v3(bezt->vec[1], bezt->vec[2]))) &&
+ (len_squared_v2v2(bezt->vec[0], bezt->vec[1]) > 0.0001*0.0001) &&
+ (len_squared_v2v2(bezt->vec[1], bezt->vec[2]) > 0.0001*0.0001) &&
+ (len_squared_v2v2(bezt->vec[0], bezt->vec[2]) > 0.0002*0.0001) &&
+ (len_squared_v2v2(bezt->vec[0], bezt->vec[2]) > MAX2(len_squared_v2v2(bezt->vec[0], bezt->vec[1]), len_squared_v2v2(bezt->vec[1], bezt->vec[2]))) &&
bezt->h1 != HD_VECT && bezt->h2 != HD_VECT)
{
bezt->h1= bezt->h2= HD_ALIGN;
diff --git a/source/blender/blenlib/intern/graph.c b/source/blender/blenlib/intern/graph.c
index b1ea058eda1..e187595aa11 100644
--- a/source/blender/blenlib/intern/graph.c
+++ b/source/blender/blenlib/intern/graph.c
@@ -31,8 +31,9 @@
#include "BLI_graph.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
-#include "BKE_utildefines.h"
static void testRadialSymmetry(BGraph *graph, BNode* root_node, RadialArc* ring, int total, float axis[3], float limit, int group);
@@ -128,7 +129,7 @@ void BLI_buildAdjacencyList(BGraph *graph)
{
if (node->degree != node->flag)
{
- printf("error in node [%p]. Added only %i arcs out of %i\n", node, node->flag, node->degree);
+ printf("error in node [%p]. Added only %i arcs out of %i\n", (void *)node, node->flag, node->degree);
}
}
}
@@ -161,7 +162,7 @@ void BLI_rebuildAdjacencyListForNode(BGraph* graph, BNode *node)
if (node->degree != node->flag)
{
- printf("error in node [%p]. Added only %i arcs out of %i\n", node, node->flag, node->degree);
+ printf("error in node [%p]. Added only %i arcs out of %i\n", (void *)node, node->flag, node->degree);
}
}
@@ -409,7 +410,7 @@ int BLI_isGraphCyclic(BGraph *graph)
BArc * BLI_findConnectedArc(BGraph *graph, BArc *arc, BNode *v)
{
- BArc *nextArc = arc->next;
+ BArc *nextArc;
for(nextArc = graph->arcs.first; nextArc; nextArc = nextArc->next)
{
diff --git a/source/blender/blenlib/intern/listbase.c b/source/blender/blenlib/intern/listbase.c
index 776f2d085df..b8b0b5b6eda 100644
--- a/source/blender/blenlib/intern/listbase.c
+++ b/source/blender/blenlib/intern/listbase.c
@@ -46,20 +46,20 @@
/* implementation */
/* Ripped this from blender.c */
-void addlisttolist(ListBase *list1, ListBase *list2)
+void BLI_movelisttolist(ListBase *dst, ListBase *src)
{
- if (list2->first==0) return;
+ if (src->first==0) return;
- if (list1->first==0) {
- list1->first= list2->first;
- list1->last= list2->last;
+ if (dst->first==0) {
+ dst->first= src->first;
+ dst->last= src->last;
}
else {
- ((Link *)list1->last)->next= list2->first;
- ((Link *)list2->first)->prev= list1->last;
- list1->last= list2->last;
+ ((Link *)dst->last)->next= src->first;
+ ((Link *)src->first)->prev= dst->last;
+ dst->last= src->last;
}
- list2->first= list2->last= 0;
+ src->first= src->last= 0;
}
void BLI_addhead(ListBase *listbase, void *vlink)
@@ -304,7 +304,7 @@ void BLI_freelistN(ListBase *listbase)
}
-int BLI_countlist(ListBase *listbase)
+int BLI_countlist(const ListBase *listbase)
{
Link *link;
int count = 0;
@@ -319,7 +319,7 @@ int BLI_countlist(ListBase *listbase)
return count;
}
-void *BLI_findlink(ListBase *listbase, int number)
+void *BLI_findlink(const ListBase *listbase, int number)
{
Link *link = NULL;
@@ -334,7 +334,7 @@ void *BLI_findlink(ListBase *listbase, int number)
return link;
}
-int BLI_findindex(ListBase *listbase, void *vlink)
+int BLI_findindex(const ListBase *listbase, void *vlink)
{
Link *link= NULL;
int number= 0;
@@ -354,7 +354,7 @@ int BLI_findindex(ListBase *listbase, void *vlink)
return -1;
}
-void *BLI_findstring(ListBase *listbase, const char *id, int offset)
+void *BLI_findstring(const ListBase *listbase, const char *id, const int offset)
{
Link *link= NULL;
const char *id_iter;
@@ -374,7 +374,7 @@ void *BLI_findstring(ListBase *listbase, const char *id, int offset)
return NULL;
}
-void *BLI_findstring_ptr(ListBase *listbase, const char *id, int offset)
+void *BLI_findstring_ptr(const ListBase *listbase, const char *id, const int offset)
{
Link *link= NULL;
const char *id_iter;
@@ -395,7 +395,7 @@ void *BLI_findstring_ptr(ListBase *listbase, const char *id, int offset)
return NULL;
}
-int BLI_findstringindex(ListBase *listbase, const char *id, int offset)
+int BLI_findstringindex(const ListBase *listbase, const char *id, const int offset)
{
Link *link= NULL;
const char *id_iter;
@@ -416,20 +416,20 @@ int BLI_findstringindex(ListBase *listbase, const char *id, int offset)
return -1;
}
-void BLI_duplicatelist(ListBase *list1, const ListBase *list2)
+void BLI_duplicatelist(ListBase *dst, const ListBase *src)
{
- struct Link *link1, *link2;
-
- /* in this order, to ensure it works if list1 == list2 */
- link2= list2->first;
- list1->first= list1->last= 0;
-
- while(link2) {
- link1= MEM_dupallocN(link2);
- BLI_addtail(list1, link1);
-
- link2= link2->next;
- }
+ struct Link *dst_link, *src_link;
+
+ /* in this order, to ensure it works if dst == src */
+ src_link= src->first;
+ dst->first= dst->last= 0;
+
+ while(src_link) {
+ dst_link= MEM_dupallocN(src_link);
+ BLI_addtail(dst, dst_link);
+
+ src_link= src_link->next;
+ }
}
/* create a generic list node containing link to provided data */
diff --git a/source/blender/blenlib/intern/math_base.c b/source/blender/blenlib/intern/math_base.c
index 686b35a878e..df8749c9ddd 100644
--- a/source/blender/blenlib/intern/math_base.c
+++ b/source/blender/blenlib/intern/math_base.c
@@ -52,7 +52,8 @@ double round(double x)
y += 1.0;
return copysign(y, x);
}
-
+#else /* OpenSuse 11.1 seems to need this. */
+double round(double x);
#endif
diff --git a/source/blender/blenlib/intern/math_base_inline.c b/source/blender/blenlib/intern/math_base_inline.c
index fc413457122..e54b84d7aaf 100644
--- a/source/blender/blenlib/intern/math_base_inline.c
+++ b/source/blender/blenlib/intern/math_base_inline.c
@@ -32,8 +32,8 @@
#include "BLI_math.h"
-#ifndef BLI_MATH_BASE_INLINE
-#define BLI_MATH_BASE_INLINE
+#ifndef BLI_MATH_BASE_INLINE_H
+#define BLI_MATH_BASE_INLINE_H
/* A few small defines. Keep'em local! */
#define SMALL_NUMBER 1.e-8
@@ -127,5 +127,5 @@ MINLINE float signf(float f)
return (f < 0.f)? -1.f: 1.f;
}
-#endif /* BLI_MATH_BASE_INLINE */
+#endif /* BLI_MATH_BASE_INLINE_H */
diff --git a/source/blender/blenlib/intern/math_color.c b/source/blender/blenlib/intern/math_color.c
index 2b6a091cc8d..0408d814d81 100644
--- a/source/blender/blenlib/intern/math_color.c
+++ b/source/blender/blenlib/intern/math_color.c
@@ -25,6 +25,7 @@
* ***** END GPL LICENSE BLOCK *****
* */
+#include <assert.h>
#include "BLI_math.h"
@@ -111,7 +112,7 @@ void yuv_to_rgb(float y, float u, float v, float *lr, float *lg, float *lb)
void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr, int colorspace)
{
float sr,sg, sb;
- float y, cr, cb;
+ float y = 128.f, cr = 128.f, cb = 128.f;
sr=255.0f*r;
sg=255.0f*g;
@@ -133,6 +134,8 @@ void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr, in
cb=(-0.16874f*sr)-(0.33126f*sg)+(0.5f*sb)+128.0f;
cr=(0.5f*sr)-(0.41869f*sg)-(0.08131f*sb)+128.0f;
break;
+ default:
+ assert(!"invalid colorspace");
}
*ly=y;
@@ -141,11 +144,12 @@ void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr, in
}
-/* YCC input have a range of 16-235 and 16-240 exepect with JFIF_0_255 where the range is 0-255 */
+/* YCC input have a range of 16-235 and 16-240 except with JFIF_0_255 where the range is 0-255 */
/* RGB outputs are in the range 0 - 1.0f */
+/* FIXME comment above must be wrong because BLI_YCC_ITU_BT601 y 16.0 cr 16.0 -> r -0.7009 */
void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb, int colorspace)
{
- float r,g,b;
+ float r = 128.f, g = 128.f, b = 128.f;
switch (colorspace) {
case BLI_YCC_ITU_BT601 :
@@ -163,6 +167,8 @@ void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb, in
g=y-0.34414f*cb - 0.71414f*cr + 135.45984f;
b=y+1.772f*cb - 226.816f;
break;
+ default:
+ assert(!"invalid colorspace");
}
*lr=r/255.0f;
*lg=g/255.0f;
@@ -172,13 +178,16 @@ void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb, in
void hex_to_rgb(char *hexcol, float *r, float *g, float *b)
{
unsigned int ri, gi, bi;
-
+
if (hexcol[0] == '#') hexcol++;
-
- if (sscanf(hexcol, "%02x%02x%02x", &ri, &gi, &bi)) {
+
+ if (sscanf(hexcol, "%02x%02x%02x", &ri, &gi, &bi)==3) {
*r = ri / 255.0f;
- *g = gi / 255.0f;
+ *g = gi / 255.0f;
*b = bi / 255.0f;
+ CLAMP(*r, 0.0f, 1.0f);
+ CLAMP(*g, 0.0f, 1.0f);
+ CLAMP(*b, 0.0f, 1.0f);
}
}
@@ -200,7 +209,6 @@ void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv)
s = (cmax - cmin)/cmax;
else {
s = 0.0f;
- h = 0.0f;
}
if (s == 0.0f)
h = -1.0f;
@@ -227,6 +235,26 @@ void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv)
*lv = v;
}
+void rgb_to_hsv_compat(float r, float g, float b, float *lh, float *ls, float *lv)
+{
+ float orig_h= *lh;
+ float orig_s= *ls;
+
+ rgb_to_hsv(r, g, b, lh, ls, lv);
+
+ if(*lv <= 0.0f) {
+ *lh= orig_h;
+ *ls= orig_s;
+ }
+ else if (*ls <= 0.0f) {
+ *lh= orig_h;
+ }
+
+ if(*lh==0.0f && orig_h >= 1.0f) {
+ *lh= 1.0f;
+ }
+}
+
/*http://brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html */
void xyz_to_rgb(float xc, float yc, float zc, float *r, float *g, float *b, int colorspace)
@@ -298,14 +326,14 @@ void cpack_to_rgb(unsigned int col, float *r, float *g, float *b)
*b /= 255.0f;
}
-void rgb_byte_to_float(char *in, float *out)
+void rgb_byte_to_float(const unsigned char *in, float *out)
{
out[0]= ((float)in[0]) / 255.0f;
out[1]= ((float)in[1]) / 255.0f;
out[2]= ((float)in[2]) / 255.0f;
}
-void rgb_float_to_byte(float *in, char *out)
+void rgb_float_to_byte(const float *in, unsigned char *out)
{
int r, g, b;
@@ -420,7 +448,7 @@ void minmax_rgb(short c[])
}
/*If the requested RGB shade contains a negative weight for
- one of the primaries, it lies outside the colour gamut
+ one of the primaries, it lies outside the color gamut
accessible from the given triple of primaries. Desaturate
it by adding white, equal quantities of R, G, and B, enough
to make RGB all positive. The function returns 1 if the
@@ -483,7 +511,7 @@ void rgb_float_set_hue_float_offset(float rgb[3], float hue_offset)
}
/* Applies an hue offset to a byte rgb color */
-void rgb_byte_set_hue_float_offset(char rgb[3], float hue_offset)
+void rgb_byte_set_hue_float_offset(unsigned char rgb[3], float hue_offset)
{
float rgb_float[3];
diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c
index 68b1feea632..d7a71f8567c 100644
--- a/source/blender/blenlib/intern/math_geom.c
+++ b/source/blender/blenlib/intern/math_geom.c
@@ -30,8 +30,9 @@
#include "BLI_math.h"
#include "BLI_memarena.h"
+#include "BLI_utildefines.h"
+
-#include "BKE_utildefines.h"
/********************************** Polygons *********************************/
@@ -233,53 +234,114 @@ float dist_to_line_segment_v3(float *v1, float *v2, float *v3)
/******************************* Intersection ********************************/
/* intersect Line-Line, shorts */
-int isect_line_line_v2_short(short *v1, short *v2, short *v3, short *v4)
+int isect_line_line_v2_short(const short *v1, const short *v2, const short *v3, const short *v4)
{
- /* return:
- -1: colliniar
- 0: no intersection of segments
- 1: exact intersection of segments
- 2: cross-intersection of segments
- */
float div, labda, mu;
div= (float)((v2[0]-v1[0])*(v4[1]-v3[1])-(v2[1]-v1[1])*(v4[0]-v3[0]));
- if(div==0.0f) return -1;
+ if(div==0.0f) return ISECT_LINE_LINE_COLINEAR;
labda= ((float)(v1[1]-v3[1])*(v4[0]-v3[0])-(v1[0]-v3[0])*(v4[1]-v3[1]))/div;
mu= ((float)(v1[1]-v3[1])*(v2[0]-v1[0])-(v1[0]-v3[0])*(v2[1]-v1[1]))/div;
if(labda>=0.0f && labda<=1.0f && mu>=0.0f && mu<=1.0f) {
- if(labda==0.0f || labda==1.0f || mu==0.0f || mu==1.0f) return 1;
- return 2;
+ if(labda==0.0f || labda==1.0f || mu==0.0f || mu==1.0f) return ISECT_LINE_LINE_EXACT;
+ return ISECT_LINE_LINE_CROSS;
}
- return 0;
+ return ISECT_LINE_LINE_NONE;
}
/* intersect Line-Line, floats */
-int isect_line_line_v2(float *v1, float *v2, float *v3, float *v4)
+int isect_line_line_v2(const float *v1, const float *v2, const float *v3, const float *v4)
{
- /* return:
- -1: colliniar
-0: no intersection of segments
-1: exact intersection of segments
-2: cross-intersection of segments
- */
float div, labda, mu;
div= (v2[0]-v1[0])*(v4[1]-v3[1])-(v2[1]-v1[1])*(v4[0]-v3[0]);
- if(div==0.0) return -1;
+ if(div==0.0) return ISECT_LINE_LINE_COLINEAR;
labda= ((float)(v1[1]-v3[1])*(v4[0]-v3[0])-(v1[0]-v3[0])*(v4[1]-v3[1]))/div;
mu= ((float)(v1[1]-v3[1])*(v2[0]-v1[0])-(v1[0]-v3[0])*(v2[1]-v1[1]))/div;
if(labda>=0.0 && labda<=1.0 && mu>=0.0 && mu<=1.0) {
- if(labda==0.0 || labda==1.0 || mu==0.0 || mu==1.0) return 1;
- return 2;
+ if(labda==0.0 || labda==1.0 || mu==0.0 || mu==1.0) return ISECT_LINE_LINE_EXACT;
+ return ISECT_LINE_LINE_CROSS;
}
- return 0;
+ return ISECT_LINE_LINE_NONE;
+}
+
+/* get intersection point of two 2D segments and return intersection type:
+ -1: colliniar
+ 1: intersection */
+int isect_seg_seg_v2_point(const float *v1, const float *v2, const float *v3, const float *v4, float vi[2])
+{
+ float a1, a2, b1, b2, c1, c2, d;
+ float u, v;
+ const float eps= 0.000001f;
+
+ a1= v2[0]-v1[0];
+ b1= v4[0]-v3[0];
+ c1= v1[0]-v4[0];
+
+ a2= v2[1]-v1[1];
+ b2= v4[1]-v3[1];
+ c2= v1[1]-v4[1];
+
+ d= a1*b2-a2*b1;
+
+ if(d==0) {
+ if(a1*c2-a2*c1==0.0f && b1*c2-b2*c1==0.0f) { /* equal lines */
+ float a[2], b[2], c[2];
+ float u2;
+
+ if(len_v2v2(v1, v2)==0.0f) {
+ if(len_v2v2(v3, v4)>eps) {
+ /* use non-point segment as basis */
+ SWAP(const float *, v1, v3);
+ SWAP(const float *, v2, v4);
+ } else { /* both of segments are points */
+ if(equals_v2v2(v1, v3)) { /* points are equal */
+ copy_v2_v2(vi, v1);
+ return 1;
+ }
+
+ /* two different points */
+ return -1;
+ }
+ }
+
+ sub_v2_v2v2(a, v3, v1);
+ sub_v2_v2v2(b, v2, v1);
+ sub_v2_v2v2(c, v2, v1);
+ u= dot_v2v2(a, b) / dot_v2v2(c, c);
+
+ sub_v2_v2v2(a, v4, v1);
+ u2= dot_v2v2(a, b) / dot_v2v2(c, c);
+
+ if(u>u2) SWAP(float, u, u2);
+
+ if(u>1.0f+eps || u2<-eps) return -1; /* non-ovlerlapping segments */
+ else if(maxf(0.0f, u) == minf(1.0f, u2)){ /* one common point: can return result */
+ interp_v2_v2v2(vi, v1, v2, maxf(0, u));
+ return 1;
+ }
+ }
+
+ /* lines are colliniar */
+ return -1;
+ }
+
+ u= (c2*b1-b2*c1)/d;
+ v= (c1*a2-a1*c2)/d;
+
+ if(u>=-eps && u<=1.0f+eps && v>=-eps && v<=1.0f+eps) { /* intersection */
+ interp_v2_v2v2(vi, v1, v2, u);
+ return 1;
+ }
+
+ /* out of segment intersection */
+ return -1;
}
/*
@@ -336,20 +398,19 @@ static short IsectLLPt2Df(float x0,float y0,float x1,float y1,
return 1;
} // end Intersect_Lines
-#define SIDE_OF_LINE(pa,pb,pp) ((pa[0]-pp[0])*(pb[1]-pp[1]))-((pb[0]-pp[0])*(pa[1]-pp[1]))
/* point in tri */
-// XXX was called IsectPT2Df
+
int isect_point_tri_v2(float pt[2], float v1[2], float v2[2], float v3[2])
{
- if (SIDE_OF_LINE(v1,v2,pt)>=0.0) {
- if (SIDE_OF_LINE(v2,v3,pt)>=0.0) {
- if (SIDE_OF_LINE(v3,v1,pt)>=0.0) {
+ if (line_point_side_v2(v1,v2,pt)>=0.0) {
+ if (line_point_side_v2(v2,v3,pt)>=0.0) {
+ if (line_point_side_v2(v3,v1,pt)>=0.0) {
return 1;
}
}
} else {
- if (! (SIDE_OF_LINE(v2,v3,pt)>=0.0)) {
- if (! (SIDE_OF_LINE(v3,v1,pt)>=0.0)) {
+ if (! (line_point_side_v2(v2,v3,pt)>=0.0)) {
+ if (! (line_point_side_v2(v3,v1,pt)>=0.0)) {
return -1;
}
}
@@ -360,18 +421,18 @@ int isect_point_tri_v2(float pt[2], float v1[2], float v2[2], float v3[2])
/* point in quad - only convex quads */
int isect_point_quad_v2(float pt[2], float v1[2], float v2[2], float v3[2], float v4[2])
{
- if (SIDE_OF_LINE(v1,v2,pt)>=0.0) {
- if (SIDE_OF_LINE(v2,v3,pt)>=0.0) {
- if (SIDE_OF_LINE(v3,v4,pt)>=0.0) {
- if (SIDE_OF_LINE(v4,v1,pt)>=0.0) {
+ if (line_point_side_v2(v1,v2,pt)>=0.0) {
+ if (line_point_side_v2(v2,v3,pt)>=0.0) {
+ if (line_point_side_v2(v3,v4,pt)>=0.0) {
+ if (line_point_side_v2(v4,v1,pt)>=0.0) {
return 1;
}
}
}
} else {
- if (! (SIDE_OF_LINE(v2,v3,pt)>=0.0)) {
- if (! (SIDE_OF_LINE(v3,v4,pt)>=0.0)) {
- if (! (SIDE_OF_LINE(v4,v1,pt)>=0.0)) {
+ if (! (line_point_side_v2(v2,v3,pt)>=0.0)) {
+ if (! (line_point_side_v2(v3,v4,pt)>=0.0)) {
+ if (! (line_point_side_v2(v4,v1,pt)>=0.0)) {
return -1;
}
}
@@ -557,7 +618,7 @@ static int getLowestRoot(float a, float b, float c, float maxR, float* root)
if (determinant >= 0.0f)
{
// calculate the two roots: (if determinant == 0 then
- // x1==x2 but let’s disregard that slight optimization)
+ // x1==x2 but lets disregard that slight optimization)
float sqrtD = (float)sqrt(determinant);
float r1 = (-b - sqrtD) / (2.0f*a);
float r2 = (-b + sqrtD) / (2.0f*a);
@@ -589,7 +650,7 @@ int isect_sweeping_sphere_tri_v3(float p1[3], float p2[3], float radius, float v
{
float e1[3], e2[3], e3[3], point[3], vel[3], /*dist[3],*/ nor[3], temp[3], bv[3];
float a, b, c, d, e, x, y, z, radius2=radius*radius;
- float elen2,edotv,edotbv,nordotv,vel2;
+ float elen2,edotv,edotbv,nordotv;
float newLambda;
int found_by_sweep=0;
@@ -663,7 +724,7 @@ int isect_sweeping_sphere_tri_v3(float p1[3], float p2[3], float radius, float v
*lambda=1.0f;
/*---test points---*/
- a=vel2=dot_v3v3(vel,vel);
+ a=dot_v3v3(vel,vel);
/*v0*/
sub_v3_v3v3(temp,p1,v0);
@@ -752,10 +813,10 @@ int isect_sweeping_sphere_tri_v3(float p1[3], float p2[3], float radius, float v
}
/*e3*/
- sub_v3_v3v3(bv,v0,p1);
- elen2 = dot_v3v3(e1,e1);
- edotv = dot_v3v3(e1,vel);
- edotbv = dot_v3v3(e1,bv);
+ /* sub_v3_v3v3(bv,v0,p1); */ /* UNUSED */
+ /* elen2 = dot_v3v3(e1,e1); */ /* UNUSED */
+ /* edotv = dot_v3v3(e1,vel); */ /* UNUSED */
+ /* edotbv = dot_v3v3(e1,bv); */ /* UNUSED */
sub_v3_v3v3(bv,v1,p1);
elen2 = dot_v3v3(e3,e3);
@@ -900,7 +961,6 @@ int isect_line_line_strict_v3(float v1[3], float v2[3], float v3[3], float v4[3]
{
float a[3], b[3], c[3], ab[3], cb[3], ca[3], dir1[3], dir2[3];
float d;
- float d1;
sub_v3_v3v3(c, v3, v1);
sub_v3_v3v3(a, v2, v1);
@@ -913,8 +973,6 @@ int isect_line_line_strict_v3(float v1[3], float v2[3], float v3[3], float v4[3]
/* colinear or one vector is zero-length*/
return 0;
}
-
- d1 = d;
cross_v3_v3v3(ab, a, b);
d = dot_v3v3(c, ab);
@@ -961,7 +1019,7 @@ int isect_aabb_aabb_v3(float min1[3], float max1[3], float min2[3], float max2[3
/* find closest point to p on line through l1,l2 and return lambda,
* where (0 <= lambda <= 1) when cp is in the line segement l1,l2
*/
-float closest_to_line_v3(float cp[3],float p[3], float l1[3], float l2[3])
+float closest_to_line_v3(float cp[3], const float p[3], const float l1[3], const float l2[3])
{
float h[3],u[3],lambda;
sub_v3_v3v3(u, l2, l1);
@@ -973,6 +1031,17 @@ float closest_to_line_v3(float cp[3],float p[3], float l1[3], float l2[3])
return lambda;
}
+float closest_to_line_v2(float cp[2],const float p[2], const float l1[2], const float l2[2])
+{
+ float h[2],u[2],lambda;
+ sub_v2_v2v2(u, l2, l1);
+ sub_v2_v2v2(h, p, l1);
+ lambda =dot_v2v2(u,h)/dot_v2v2(u,u);
+ cp[0] = l1[0] + u[0] * lambda;
+ cp[1] = l1[1] + u[1] * lambda;
+ return lambda;
+}
+
#if 0
/* little sister we only need to know lambda */
static float lambda_cp_line(float p[3], float l1[3], float l2[3])
@@ -1289,6 +1358,71 @@ int clip_line_plane(float p1[3], float p2[3], float plane[4])
}
}
+
+void plot_line_v2v2i(int p1[2], int p2[2], int (*callback)(int, int, void *), void *userData)
+{
+ int x1= p1[0];
+ int y1= p1[1];
+ int x2= p2[0];
+ int y2= p2[1];
+
+ signed char ix;
+ signed char iy;
+
+ // if x1 == x2 or y1 == y2, then it does not matter what we set here
+ int delta_x = (x2 > x1?(ix = 1, x2 - x1):(ix = -1, x1 - x2)) << 1;
+ int delta_y = (y2 > y1?(iy = 1, y2 - y1):(iy = -1, y1 - y2)) << 1;
+
+ if(callback(x1, y1, userData) == 0) {
+ return;
+ }
+
+ if (delta_x >= delta_y) {
+ // error may go below zero
+ int error = delta_y - (delta_x >> 1);
+
+ while (x1 != x2) {
+ if (error >= 0) {
+ if (error || (ix > 0)) {
+ y1 += iy;
+ error -= delta_x;
+ }
+ // else do nothing
+ }
+ // else do nothing
+
+ x1 += ix;
+ error += delta_y;
+
+ if(callback(x1, y1, userData) == 0) {
+ return ;
+ }
+ }
+ }
+ else {
+ // error may go below zero
+ int error = delta_x - (delta_y >> 1);
+
+ while (y1 != y2) {
+ if (error >= 0) {
+ if (error || (iy > 0)) {
+ x1 += ix;
+ error -= delta_y;
+ }
+ // else do nothing
+ }
+ // else do nothing
+
+ y1 += iy;
+ error += delta_x;
+
+ if(callback(x1, y1, userData) == 0) {
+ return;
+ }
+ }
+ }
+}
+
/****************************** Interpolation ********************************/
static float tri_signed_area(float *v1, float *v2, float *v3, int i, int j)
@@ -1647,6 +1781,35 @@ void perspective_m4(float mat[][4],float left, float right, float bottom, float
}
+/* translate a matrix created by orthographic_m4 or perspective_m4 in XY coords (used to jitter the view) */
+void window_translate_m4(float winmat[][4], float perspmat[][4], float x, float y)
+{
+ if(winmat[2][3] == -1.0f) {
+ /* in the case of a win-matrix, this means perspective always */
+ float v1[3];
+ float v2[3];
+ float len1, len2;
+
+ v1[0]= perspmat[0][0];
+ v1[1]= perspmat[1][0];
+ v1[2]= perspmat[2][0];
+
+ v2[0]= perspmat[0][1];
+ v2[1]= perspmat[1][1];
+ v2[2]= perspmat[2][1];
+
+ len1= (1.0f / len_v3(v1));
+ len2= (1.0f / len_v3(v2));
+
+ winmat[2][0] += len1 * winmat[0][0] * x;
+ winmat[2][1] += len2 * winmat[1][1] * y;
+ }
+ else {
+ winmat[3][0] += x;
+ winmat[3][1] += y;
+ }
+}
+
static void i_multmatrix(float icand[][4], float Vm[][4])
{
int row, col;
@@ -1676,10 +1839,9 @@ void polarview_m4(float Vm[][4],float dist, float azimuth, float incidence, floa
void lookat_m4(float mat[][4],float vx, float vy, float vz, float px, float py, float pz, float twist)
{
float sine, cosine, hyp, hyp1, dx, dy, dz;
- float mat1[4][4];
+ float mat1[4][4]= MAT4_UNITY;
unit_m4(mat);
- unit_m4(mat1);
rotate_m4(mat, 'Z', -twist);
@@ -2469,4 +2631,3 @@ float form_factor_hemi_poly(float p[3], float n[3], float v1[3], float v2[3], fl
return contrib;
}
-
diff --git a/source/blender/blenlib/intern/math_geom_inline.c b/source/blender/blenlib/intern/math_geom_inline.c
index f2d8e27cbd5..c583990fef7 100644
--- a/source/blender/blenlib/intern/math_geom_inline.c
+++ b/source/blender/blenlib/intern/math_geom_inline.c
@@ -27,8 +27,8 @@
#include "BLI_math.h"
-#ifndef BLI_MATH_GEOM_INLINE
-#define BLI_MATH_GEOM_INLINE
+#ifndef BLI_MATH_GEOM_INLINE_H
+#define BLI_MATH_GEOM_INLINE_H
/****************************** Spherical Harmonics **************************/
@@ -134,5 +134,5 @@ MINLINE void madd_sh_shfl(float r[9], float sh[3], float f)
add_sh_shsh(r, r, tmp);
}
-#endif /* BLI_MATH_GEOM_INLINE */
+#endif /* BLI_MATH_GEOM_INLINE_H */
diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c
index 3b5ffa2d442..75134358c31 100644
--- a/source/blender/blenlib/intern/math_matrix.c
+++ b/source/blender/blenlib/intern/math_matrix.c
@@ -25,7 +25,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-
+#include <assert.h>
#include "BLI_math.h"
/********************************* Init **************************************/
@@ -109,6 +109,20 @@ void copy_m4_m3(float m1[][4], float m2[][3]) /* no clear */
}
+void swap_m3m3(float m1[][3], float m2[][3])
+{
+ float t;
+ int i, j;
+
+ for(i = 0; i < 3; i++) {
+ for (j = 0; j < 3; j++) {
+ t = m1[i][j];
+ m1[i][j] = m2[i][j];
+ m2[i][j] = t;
+ }
+ }
+}
+
void swap_m4m4(float m1[][4], float m2[][4])
{
float t;
@@ -609,7 +623,11 @@ void orthogonalize_m3(float mat[][3], int axis)
normalize_v3(mat[1]);
cross_v3_v3v3(mat[2], mat[0], mat[1]);
} else {
- float vec[3] = {mat[0][1], mat[0][2], mat[0][0]};
+ float vec[3];
+
+ vec[0]= mat[0][1];
+ vec[1]= mat[0][2];
+ vec[2]= mat[0][0];
cross_v3_v3v3(mat[2], mat[0], vec);
normalize_v3(mat[2]);
@@ -625,7 +643,11 @@ void orthogonalize_m3(float mat[][3], int axis)
normalize_v3(mat[0]);
cross_v3_v3v3(mat[2], mat[0], mat[1]);
} else {
- float vec[3] = {mat[1][1], mat[1][2], mat[1][0]};
+ float vec[3];
+
+ vec[0]= mat[1][1];
+ vec[1]= mat[1][2];
+ vec[2]= mat[1][0];
cross_v3_v3v3(mat[0], mat[1], vec);
normalize_v3(mat[0]);
@@ -641,7 +663,11 @@ void orthogonalize_m3(float mat[][3], int axis)
normalize_v3(mat[0]);
cross_v3_v3v3(mat[1], mat[2], mat[0]);
} else {
- float vec[3] = {mat[2][1], mat[2][2], mat[2][0]};
+ float vec[3];
+
+ vec[0]= mat[2][1];
+ vec[1]= mat[2][2];
+ vec[2]= mat[2][0];
cross_v3_v3v3(mat[0], vec, mat[2]);
normalize_v3(mat[0]);
@@ -670,7 +696,11 @@ void orthogonalize_m4(float mat[][4], int axis)
normalize_v3(mat[1]);
cross_v3_v3v3(mat[2], mat[0], mat[1]);
} else {
- float vec[3] = {mat[0][1], mat[0][2], mat[0][0]};
+ float vec[3];
+
+ vec[0]= mat[0][1];
+ vec[1]= mat[0][2];
+ vec[2]= mat[0][0];
cross_v3_v3v3(mat[2], mat[0], vec);
normalize_v3(mat[2]);
@@ -687,7 +717,11 @@ void orthogonalize_m4(float mat[][4], int axis)
normalize_v3(mat[0]);
cross_v3_v3v3(mat[2], mat[0], mat[1]);
} else {
- float vec[3] = {mat[1][1], mat[1][2], mat[1][0]};
+ float vec[3];
+
+ vec[0]= mat[1][1];
+ vec[1]= mat[1][2];
+ vec[2]= mat[1][0];
cross_v3_v3v3(mat[0], mat[1], vec);
normalize_v3(mat[0]);
@@ -703,7 +737,11 @@ void orthogonalize_m4(float mat[][4], int axis)
normalize_v3(mat[0]);
cross_v3_v3v3(mat[1], mat[2], mat[0]);
} else {
- float vec[3] = {mat[2][1], mat[2][2], mat[2][0]};
+ float vec[3];
+
+ vec[0]= mat[2][1];
+ vec[1]= mat[2][2];
+ vec[2]= mat[2][0];
cross_v3_v3v3(mat[0], vec, mat[2]);
normalize_v3(mat[0]);
@@ -750,6 +788,14 @@ void normalize_m3(float mat[][3])
normalize_v3(mat[2]);
}
+void normalize_m3_m3(float rmat[][3], float mat[][3])
+{
+ normalize_v3_v3(rmat[0], mat[0]);
+ normalize_v3_v3(rmat[1], mat[1]);
+ normalize_v3_v3(rmat[2], mat[2]);
+}
+
+
void normalize_m4(float mat[][4])
{
float len;
@@ -762,6 +808,18 @@ void normalize_m4(float mat[][4])
if(len!=0.0) mat[2][3]/= len;
}
+void normalize_m4_m4(float rmat[][4], float mat[][4])
+{
+ float len;
+
+ len= normalize_v3_v3(rmat[0], mat[0]);
+ if(len!=0.0) rmat[0][3]= mat[0][3] / len;
+ len= normalize_v3_v3(rmat[1], mat[1]);
+ if(len!=0.0) rmat[1][3]= mat[1][3] / len;
+ len= normalize_v3_v3(rmat[2], mat[2]);
+ if(len!=0.0) rmat[2][3]= mat[2][3] / len;;
+}
+
void adjoint_m3_m3(float m1[][3], float m[][3])
{
m1[0][0]=m[1][1]*m[2][2]-m[1][2]*m[2][1];
@@ -878,7 +936,7 @@ float determinant_m4(float m[][4])
/****************************** Transformations ******************************/
-void size_to_mat3(float mat[][3], float *size)
+void size_to_mat3(float mat[][3], const float size[3])
{
mat[0][0]= size[0];
mat[0][1]= 0.0f;
@@ -891,7 +949,7 @@ void size_to_mat3(float mat[][3], float *size)
mat[2][0]= 0.0f;
}
-void size_to_mat4(float mat[][4], float *size)
+void size_to_mat4(float mat[][4], const float size[3])
{
float tmat[3][3];
@@ -932,6 +990,49 @@ float mat4_to_scale(float mat[][4])
return mat3_to_scale(tmat);
}
+
+void mat3_to_rot_size(float rot[3][3], float size[3], float mat3[3][3])
+{
+ float mat3_n[3][3]; /* mat3 -> normalized, 3x3 */
+ float imat3_n[3][3]; /* mat3 -> normalized & inverted, 3x3 */
+
+ /* rotation & scale are linked, we need to create the mat's
+ * for these together since they are related. */
+
+ /* so scale doesnt interfear with rotation [#24291] */
+ /* note: this is a workaround for negative matrix not working for rotation conversion, FIXME */
+ normalize_m3_m3(mat3_n, mat3);
+ if(is_negative_m3(mat3)) {
+ negate_v3(mat3_n[0]);
+ negate_v3(mat3_n[1]);
+ negate_v3(mat3_n[2]);
+ }
+
+ /* rotation */
+ /* keep rot as a 3x3 matrix, the caller can convert into a quat or euler */
+ copy_m3_m3(rot, mat3_n);
+
+ /* scale */
+ /* note: mat4_to_size(ob->size, mat) fails for negative scale */
+ invert_m3_m3(imat3_n, mat3_n);
+ mul_m3_m3m3(mat3, imat3_n, mat3);
+
+ size[0]= mat3[0][0];
+ size[1]= mat3[1][1];
+ size[2]= mat3[2][2];
+}
+
+void mat4_to_loc_rot_size(float loc[3], float rot[3][3], float size[3], float wmat[][4])
+{
+ float mat3[3][3]; /* wmat -> 3x3 */
+
+ copy_m3_m4(mat3, wmat);
+ mat3_to_rot_size(rot, size, mat3);
+
+ /* location */
+ copy_v3_v3(loc, wmat[3]);
+}
+
void scale_m3_fl(float m[][3], float scale)
{
m[0][0]= m[1][1]= m[2][2]= scale;
@@ -963,6 +1064,8 @@ void rotate_m4(float mat[][4], const char axis, const float angle)
float temp[4]= {0.0f, 0.0f, 0.0f, 0.0f};
float cosine, sine;
+ assert(axis >= 'X' && axis <= 'Z');
+
cosine = (float)cos(angle);
sine = (float)sin(angle);
switch(axis){
@@ -995,18 +1098,19 @@ void rotate_m4(float mat[][4], const char axis, const float angle)
}
}
-void blend_m3_m3m3(float out[][3], float dst[][3], float src[][3], float srcweight)
+void blend_m3_m3m3(float out[][3], float dst[][3], float src[][3], const float srcweight)
{
+ float srot[3][3], drot[3][3];
float squat[4], dquat[4], fquat[4];
float ssize[3], dsize[3], fsize[3];
float rmat[3][3], smat[3][3];
- mat3_to_quat(dquat,dst);
- mat3_to_size(dsize,dst);
+ mat3_to_rot_size(drot, dsize, dst);
+ mat3_to_rot_size(srot, ssize, src);
+
+ mat3_to_quat(dquat, drot);
+ mat3_to_quat(squat, srot);
- mat3_to_quat(squat,src);
- mat3_to_size(ssize,src);
-
/* do blending */
interp_qt_qtqt(fquat, dquat, squat, srcweight);
interp_v3_v3v3(fsize, dsize, ssize, srcweight);
@@ -1017,20 +1121,19 @@ void blend_m3_m3m3(float out[][3], float dst[][3], float src[][3], float srcweig
mul_m3_m3m3(out, rmat, smat);
}
-void blend_m4_m4m4(float out[][4], float dst[][4], float src[][4], float srcweight)
+void blend_m4_m4m4(float out[][4], float dst[][4], float src[][4], const float srcweight)
{
+ float sloc[3], dloc[3], floc[3];
+ float srot[3][3], drot[3][3];
float squat[4], dquat[4], fquat[4];
float ssize[3], dsize[3], fsize[3];
- float sloc[3], dloc[3], floc[3];
-
- mat4_to_quat(dquat,dst);
- mat4_to_size(dsize,dst);
- copy_v3_v3(dloc, dst[3]);
- mat4_to_quat(squat,src);
- mat4_to_size(ssize,src);
- copy_v3_v3(sloc, src[3]);
-
+ mat4_to_loc_rot_size(dloc, drot, dsize, dst);
+ mat4_to_loc_rot_size(sloc, srot, ssize, src);
+
+ mat3_to_quat(dquat, drot);
+ mat3_to_quat(squat, srot);
+
/* do blending */
interp_v3_v3v3(floc, dloc, sloc, srcweight);
interp_qt_qtqt(fquat, dquat, squat, srcweight);
@@ -1058,7 +1161,7 @@ int is_negative_m4(float mat[][4])
/* make a 4x4 matrix out of 3 transform components */
/* matrices are made in the order: scale * rot * loc */
// TODO: need to have a version that allows for rotation order...
-void loc_eul_size_to_mat4(float mat[4][4], float loc[3], float eul[3], float size[3])
+void loc_eul_size_to_mat4(float mat[4][4], const float loc[3], const float eul[3], const float size[3])
{
float rmat[3][3], smat[3][3], tmat[3][3];
@@ -1081,7 +1184,7 @@ void loc_eul_size_to_mat4(float mat[4][4], float loc[3], float eul[3], float siz
/* make a 4x4 matrix out of 3 transform components */
/* matrices are made in the order: scale * rot * loc */
-void loc_eulO_size_to_mat4(float mat[4][4], float loc[3], float eul[3], float size[3], short rotOrder)
+void loc_eulO_size_to_mat4(float mat[4][4], const float loc[3], const float eul[3], const float size[3], const short rotOrder)
{
float rmat[3][3], smat[3][3], tmat[3][3];
@@ -1105,7 +1208,7 @@ void loc_eulO_size_to_mat4(float mat[4][4], float loc[3], float eul[3], float si
/* make a 4x4 matrix out of 3 transform components */
/* matrices are made in the order: scale * rot * loc */
-void loc_quat_size_to_mat4(float mat[4][4], float loc[3], float quat[4], float size[3])
+void loc_quat_size_to_mat4(float mat[4][4], const float loc[3], const float quat[4], const float size[3])
{
float rmat[3][3], smat[3][3], tmat[3][3];
@@ -1126,9 +1229,16 @@ void loc_quat_size_to_mat4(float mat[4][4], float loc[3], float quat[4], float s
mat[3][2] = loc[2];
}
+void loc_axisangle_size_to_mat4(float mat[4][4], const float loc[3], const float axis[3], const float angle, const float size[3])
+{
+ float q[4];
+ axis_angle_to_quat(q, axis, angle);
+ loc_quat_size_to_mat4(mat, loc, q, size);
+}
+
/*********************************** Other ***********************************/
-void print_m3(char *str, float m[][3])
+void print_m3(const char *str, float m[][3])
{
printf("%s\n", str);
printf("%f %f %f\n",m[0][0],m[1][0],m[2][0]);
@@ -1137,7 +1247,7 @@ void print_m3(char *str, float m[][3])
printf("\n");
}
-void print_m4(char *str, float m[][4])
+void print_m4(const char *str, float m[][4])
{
printf("%s\n", str);
printf("%f %f %f %f\n",m[0][0],m[1][0],m[2][0],m[3][0]);
@@ -1361,7 +1471,6 @@ void svd_m4(float U[4][4], float s[4], float V[4][4], float A_[4][4])
eps = powf(2.0f,-52.0f);
while (p > 0) {
int kase=0;
- k=0;
// Test for maximum iterations to avoid infinite loop
if(maxiter == 0)
diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c
index b8cef511293..2038121e3f2 100644
--- a/source/blender/blenlib/intern/math_rotation.c
+++ b/source/blender/blenlib/intern/math_rotation.c
@@ -26,11 +26,25 @@
* */
+#include <assert.h>
#include "BLI_math.h"
/******************************** Quaternions ********************************/
-void unit_qt(float *q)
+/* used to test is a quat is not normalized */
+#define QUAT_EPSILON 0.0001
+
+/* convenience, avoids setting Y axis everywhere */
+void unit_axis_angle(float axis[3], float *angle)
+{
+ axis[0]= 0.0f;
+ axis[1]= 1.0f;
+ axis[2]= 0.0f;
+ *angle= 0.0f;
+}
+
+
+void unit_qt(float q[4])
{
q[0]= 1.0f;
q[1]= q[2]= q[3]= 0.0f;
@@ -88,7 +102,7 @@ void conjugate_qt(float *q)
q[3] = -q[3];
}
-float dot_qtqt(float *q1, float *q2)
+float dot_qtqt(const float q1[4], const float q2[4])
{
return q1[0]*q2[0] + q1[1]*q2[1] + q1[2]*q2[2] + q1[3]*q2[3];
}
@@ -119,11 +133,16 @@ void mul_qt_fl(float *q, const float f)
q[3] *= f;
}
-void sub_qt_qtqt(float *q, float *q1, float *q2)
+void sub_qt_qtqt(float q[4], const float q1[4], const float q2[4])
{
- q2[0]= -q2[0];
- mul_qt_qtqt(q, q1, q2);
- q2[0]= -q2[0];
+ float nq2[4];
+
+ nq2[0]= -q2[0];
+ nq2[1]= q2[1];
+ nq2[2]= q2[2];
+ nq2[3]= q2[3];
+
+ mul_qt_qtqt(q, q1, nq2);
}
/* angular mult factor */
@@ -138,7 +157,8 @@ void mul_fac_qt_fl(float *q, const float fac)
mul_v3_fl(q+1, si);
}
-void quat_to_mat3(float m[][3], float *q)
+/* skip error check, currently only needed by mat3_to_quat_is_ok */
+static void quat_to_mat3_no_error(float m[][3], const float q[4])
{
double q0, q1, q2, q3, qda,qdb,qdc,qaa,qab,qac,qbb,qbc,qcc;
@@ -170,10 +190,29 @@ void quat_to_mat3(float m[][3], float *q)
m[2][2]= (float)(1.0-qaa-qbb);
}
-void quat_to_mat4(float m[][4], float *q)
+
+void quat_to_mat3(float m[][3], const float q[4])
+{
+#ifdef DEBUG
+ float f;
+ if(!((f=dot_qtqt(q, q))==0.0 || (fabs(f-1.0) < QUAT_EPSILON))) {
+ fprintf(stderr, "Warning! quat_to_mat3() called with non-normalized: size %.8f *** report a bug ***\n", f);
+ }
+#endif
+
+ quat_to_mat3_no_error(m, q);
+}
+
+void quat_to_mat4(float m[][4], const float q[4])
{
double q0, q1, q2, q3, qda,qdb,qdc,qaa,qab,qac,qbb,qbc,qcc;
+#ifdef DEBUG
+ if(!((q0=dot_qtqt(q, q))==0.0 || (fabs(q0-1.0) < QUAT_EPSILON))) {
+ fprintf(stderr, "Warning! quat_to_mat4() called with non-normalized: size %.8f *** report a bug ***\n", (float)q0);
+ }
+#endif
+
q0= M_SQRT2 * q[0];
q1= M_SQRT2 * q[1];
q2= M_SQRT2 * q[2];
@@ -294,7 +333,7 @@ void mat3_to_quat_is_ok(float q[4], float wmat[3][3])
q1[3]= -nor[2]*si;
/* rotate back x-axis from mat, using inverse q1 */
- quat_to_mat3( matr,q1);
+ quat_to_mat3_no_error( matr,q1);
invert_m3_m3(matn, matr);
mul_m3_v3(matn, mat[0]);
@@ -312,7 +351,7 @@ void mat3_to_quat_is_ok(float q[4], float wmat[3][3])
}
-void normalize_qt(float *q)
+float normalize_qt(float *q)
{
float len;
@@ -324,6 +363,14 @@ void normalize_qt(float *q)
q[1]= 1.0f;
q[0]= q[2]= q[3]= 0.0f;
}
+
+ return len;
+}
+
+float normalize_qt_qt(float r[4], const float q[4])
+{
+ copy_qt_qt(r, q);
+ return normalize_qt(r);
}
/* note: expects vectors to be normalized */
@@ -356,10 +403,13 @@ void rotation_between_quats_to_quat(float *q, const float q1[4], const float q2[
}
-void vec_to_quat(float *q,float *vec, short axis, short upflag)
+void vec_to_quat(float q[4], const float vec[3], short axis, const short upflag)
{
float q2[4], nor[3], *fp, mat[3][3], angle, si, co, x2, y2, z2, len1;
+ assert(axis >= 0 && axis <= 5);
+ assert(upflag >= 0 && upflag <= 2);
+
/* first rotate to axis */
if(axis>2) {
x2= vec[0] ; y2= vec[1] ; z2= vec[2];
@@ -491,7 +541,7 @@ void QuatInterpolW(float *result, float *quat1, float *quat2, float t)
}
#endif
-void interp_qt_qtqt(float *result, float *quat1, float *quat2, float t)
+void interp_qt_qtqt(float result[4], const float quat1[4], const float quat2[4], const float t)
{
float quat[4], omega, cosom, sinom, sc1, sc2;
@@ -528,7 +578,7 @@ void interp_qt_qtqt(float *result, float *quat1, float *quat2, float t)
result[3] = sc1 * quat[3] + sc2 * quat2[3];
}
-void add_qt_qtqt(float *result, float *quat1, float *quat2, float t)
+void add_qt_qtqt(float result[4], const float quat1[4], const float quat2[4], const float t)
{
result[0]= quat1[0] + t*quat2[0];
result[1]= quat1[1] + t*quat2[1];
@@ -536,7 +586,7 @@ void add_qt_qtqt(float *result, float *quat1, float *quat2, float t)
result[3]= quat1[3] + t*quat2[3];
}
-void tri_to_quat(float *quat, float *v1, float *v2, float *v3)
+void tri_to_quat(float quat[4], const float v1[3], const float v2[3], const float v3[3])
{
/* imaginary x-axis, y-axis triangle is being rotated */
float vec[3], q1[4], q2[4], n[3], si, co, angle, mat[3][3], imat[3][3];
@@ -588,13 +638,16 @@ void print_qt(char *str, float q[4])
/******************************** Axis Angle *********************************/
/* Axis angle to Quaternions */
-void axis_angle_to_quat(float q[4], float axis[3], float angle)
+void axis_angle_to_quat(float q[4], const float axis[3], float angle)
{
float nor[3];
float si;
- normalize_v3_v3(nor, axis);
-
+ if(normalize_v3_v3(nor, axis) == 0.0f) {
+ unit_qt(q);
+ return;
+ }
+
angle /= 2;
si = (float)sin(angle);
q[0] = (float)cos(angle);
@@ -604,10 +657,16 @@ void axis_angle_to_quat(float q[4], float axis[3], float angle)
}
/* Quaternions to Axis Angle */
-void quat_to_axis_angle(float axis[3], float *angle,float q[4])
+void quat_to_axis_angle(float axis[3], float *angle, const float q[4])
{
float ha, si;
-
+
+#ifdef DEBUG
+ if(!((ha=dot_qtqt(q, q))==0.0 || (fabs(ha-1.0) < QUAT_EPSILON))) {
+ fprintf(stderr, "Warning! quat_to_axis_angle() called with non-normalized: size %.8f *** report a bug ***\n", ha);
+ }
+#endif
+
/* calculate angle/2, and sin(angle/2) */
ha= (float)acos(q[0]);
si= (float)sin(ha);
@@ -625,7 +684,7 @@ void quat_to_axis_angle(float axis[3], float *angle,float q[4])
}
/* Axis Angle to Euler Rotation */
-void axis_angle_to_eulO(float eul[3], short order,float axis[3], float angle)
+void axis_angle_to_eulO(float eul[3], const short order, const float axis[3], const float angle)
{
float q[4];
@@ -635,7 +694,7 @@ void axis_angle_to_eulO(float eul[3], short order,float axis[3], float angle)
}
/* Euler Rotation to Axis Angle */
-void eulO_to_axis_angle(float axis[3], float *angle,float eul[3], short order)
+void eulO_to_axis_angle(float axis[3], float *angle, const float eul[3], const short order)
{
float q[4];
@@ -645,12 +704,15 @@ void eulO_to_axis_angle(float axis[3], float *angle,float eul[3], short order)
}
/* axis angle to 3x3 matrix - safer version (normalisation of axis performed) */
-void axis_angle_to_mat3(float mat[3][3],float axis[3], float angle)
+void axis_angle_to_mat3(float mat[3][3], const float axis[3], const float angle)
{
float nor[3], nsi[3], co, si, ico;
/* normalise the axis first (to remove unwanted scaling) */
- normalize_v3_v3(nor, axis);
+ if(normalize_v3_v3(nor, axis) == 0.0f) {
+ unit_m3(mat);
+ return;
+ }
/* now convert this to a 3x3 matrix */
co= (float)cos(angle);
@@ -673,7 +735,7 @@ void axis_angle_to_mat3(float mat[3][3],float axis[3], float angle)
}
/* axis angle to 4x4 matrix - safer version (normalisation of axis performed) */
-void axis_angle_to_mat4(float mat[4][4],float axis[3], float angle)
+void axis_angle_to_mat4(float mat[4][4], const float axis[3], const float angle)
{
float tmat[3][3];
@@ -730,7 +792,7 @@ void mat4_to_vec_rot(float axis[3], float *angle,float mat[4][4])
}
/* axis angle to 3x3 matrix */
-void vec_rot_to_mat3(float mat[][3],float *vec, float phi)
+void vec_rot_to_mat3(float mat[][3], const float vec[3], const float phi)
{
/* rotation of phi radials around vec */
float vx, vx2, vy, vy2, vz, vz2, co, si;
@@ -756,7 +818,7 @@ void vec_rot_to_mat3(float mat[][3],float *vec, float phi)
}
/* axis angle to 4x4 matrix */
-void vec_rot_to_mat4(float mat[][4],float *vec, float phi)
+void vec_rot_to_mat4(float mat[][4], const float vec[3], const float phi)
{
float tmat[3][3];
@@ -766,7 +828,7 @@ void vec_rot_to_mat4(float mat[][4],float *vec, float phi)
}
/* axis angle to quaternion */
-void vec_rot_to_quat(float *quat,float *vec, float phi)
+void vec_rot_to_quat(float *quat, const float vec[3], const float phi)
{
/* rotation of phi radials around vec */
float si;
@@ -790,7 +852,7 @@ void vec_rot_to_quat(float *quat,float *vec, float phi)
/******************************** XYZ Eulers *********************************/
/* XYZ order */
-void eul_to_mat3(float mat[][3], float *eul)
+void eul_to_mat3(float mat[][3], const float eul[3])
{
double ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
@@ -818,7 +880,7 @@ void eul_to_mat3(float mat[][3], float *eul)
}
/* XYZ order */
-void eul_to_mat4(float mat[][4], float *eul)
+void eul_to_mat4(float mat[][4], const float eul[3])
{
double ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
@@ -850,7 +912,7 @@ void eul_to_mat4(float mat[][4], float *eul)
/* returns two euler calculation methods, so we can pick the best */
/* XYZ order */
-static void mat3_to_eul2(float tmat[][3], float *eul1, float *eul2)
+static void mat3_to_eul2(float tmat[][3], float eul1[3], float eul2[3])
{
float cy, quat[4], mat[3][3];
@@ -907,16 +969,16 @@ void mat4_to_eul(float *eul,float tmat[][4])
}
/* XYZ order */
-void quat_to_eul(float *eul,float *quat)
+void quat_to_eul(float *eul, const float quat[4])
{
float mat[3][3];
-
+
quat_to_mat3(mat,quat);
mat3_to_eul(eul,mat);
}
/* XYZ order */
-void eul_to_quat(float *quat,float *eul)
+void eul_to_quat(float *quat, const float eul[3])
{
float ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
@@ -932,10 +994,12 @@ void eul_to_quat(float *quat,float *eul)
}
/* XYZ order */
-void rotate_eul(float *beul, char axis, float ang)
+void rotate_eul(float *beul, const char axis, const float ang)
{
float eul[3], mat1[3][3], mat2[3][3], totmat[3][3];
-
+
+ assert(axis >= 'X' && axis <= 'Z');
+
eul[0]= eul[1]= eul[2]= 0.0f;
if(axis=='X') eul[0]= ang;
else if(axis=='Y') eul[1]= ang;
@@ -952,7 +1016,7 @@ void rotate_eul(float *beul, char axis, float ang)
/* exported to transform.c */
/* order independent! */
-void compatible_eul(float *eul, float *oldrot)
+void compatible_eul(float eul[3], const float oldrot[3])
{
float dx, dy, dz;
@@ -1016,7 +1080,7 @@ void compatible_eul(float *eul, float *oldrot)
/* uses 2 methods to retrieve eulers, and picks the closest */
/* XYZ order */
-void mat3_to_compatible_eul(float *eul, float *oldrot,float mat[][3])
+void mat3_to_compatible_eul(float eul[3], const float oldrot[3], float mat[][3])
{
float eul1[3], eul2[3];
float d1, d2;
@@ -1073,20 +1137,20 @@ static RotOrderInfo rotOrders[]= {
* NOTE: since we start at 1 for the values, but arrays index from 0,
* there is -1 factor involved in this process...
*/
-#define GET_ROTATIONORDER_INFO(order) (((order)>=1) ? &rotOrders[(order)-1] : &rotOrders[0])
+#define GET_ROTATIONORDER_INFO(order) (assert(order>=0 && order<=6), (order < 1) ? &rotOrders[0] : &rotOrders[(order)-1])
/* Construct quaternion from Euler angles (in radians). */
-void eulO_to_quat(float q[4],float e[3], short order)
+void eulO_to_quat(float q[4], const float e[3], const short order)
{
RotOrderInfo *R= GET_ROTATIONORDER_INFO(order);
short i=R->axis[0], j=R->axis[1], k=R->axis[2];
double ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
double a[3];
- ti = e[i]/2; tj = e[j]/2; th = e[k]/2;
-
- if (R->parity) e[j] = -e[j];
-
+ ti = e[i] * 0.5f;
+ tj = e[j] * (R->parity ? -0.5f : 0.5f);
+ th = e[k] * 0.5f;
+
ci = cos(ti); cj = cos(tj); ch = cos(th);
si = sin(ti); sj = sin(tj); sh = sin(th);
@@ -1102,11 +1166,11 @@ void eulO_to_quat(float q[4],float e[3], short order)
q[2] = a[1];
q[3] = a[2];
- if (R->parity) q[j] = -q[j];
+ if (R->parity) q[j+1] = -q[j+1];
}
/* Convert quaternion to Euler angles (in radians). */
-void quat_to_eulO(float e[3], short order,float q[4])
+void quat_to_eulO(float e[3], short const order, const float q[4])
{
float M[3][3];
@@ -1115,7 +1179,7 @@ void quat_to_eulO(float e[3], short order,float q[4])
}
/* Construct 3x3 matrix from Euler angles (in radians). */
-void eulO_to_mat3(float M[3][3],float e[3], short order)
+void eulO_to_mat3(float M[3][3], const float e[3], const short order)
{
RotOrderInfo *R= GET_ROTATIONORDER_INFO(order);
short i=R->axis[0], j=R->axis[1], k=R->axis[2];
@@ -1139,53 +1203,6 @@ void eulO_to_mat3(float M[3][3],float e[3], short order)
M[i][k] = -sj; M[j][k] = cj*si; M[k][k] = cj*ci;
}
-/* Construct 4x4 matrix from Euler angles (in radians). */
-void eulO_to_mat4(float M[4][4],float e[3], short order)
-{
- float m[3][3];
-
- /* for now, we'll just do this the slow way (i.e. copying matrices) */
- normalize_m3(m);
- eulO_to_mat3(m,e, order);
- copy_m4_m3(M, m);
-}
-
-/* Convert 3x3 matrix to Euler angles (in radians). */
-void mat3_to_eulO(float e[3], short order,float M[3][3])
-{
- RotOrderInfo *R= GET_ROTATIONORDER_INFO(order);
- short i=R->axis[0], j=R->axis[1], k=R->axis[2];
- double cy = sqrt(M[i][i]*M[i][i] + M[i][j]*M[i][j]);
-
- if (cy > 16*FLT_EPSILON) {
- e[i] = atan2(M[j][k], M[k][k]);
- e[j] = atan2(-M[i][k], cy);
- e[k] = atan2(M[i][j], M[i][i]);
- }
- else {
- e[i] = atan2(-M[k][j], M[j][j]);
- e[j] = atan2(-M[i][k], cy);
- e[k] = 0;
- }
-
- if (R->parity) {
- e[0] = -e[0];
- e[1] = -e[1];
- e[2] = -e[2];
- }
-}
-
-/* Convert 4x4 matrix to Euler angles (in radians). */
-void mat4_to_eulO(float e[3], short order,float M[4][4])
-{
- float m[3][3];
-
- /* for now, we'll just do this the slow way (i.e. copying matrices) */
- copy_m3_m4(m, M);
- normalize_m3(m);
- mat3_to_eulO(e, order,m);
-}
-
/* returns two euler calculation methods, so we can pick the best */
static void mat3_to_eulo2(float M[3][3], float *e1, float *e2, short order)
{
@@ -1228,6 +1245,45 @@ static void mat3_to_eulo2(float M[3][3], float *e1, float *e2, short order)
}
}
+/* Construct 4x4 matrix from Euler angles (in radians). */
+void eulO_to_mat4(float M[4][4], const float e[3], const short order)
+{
+ float m[3][3];
+
+ /* for now, we'll just do this the slow way (i.e. copying matrices) */
+ normalize_m3(m);
+ eulO_to_mat3(m,e, order);
+ copy_m4_m3(M, m);
+}
+
+
+/* Convert 3x3 matrix to Euler angles (in radians). */
+void mat3_to_eulO(float eul[3], short order,float M[3][3])
+{
+ float eul1[3], eul2[3];
+
+ mat3_to_eulo2(M, eul1, eul2, order);
+
+ /* return best, which is just the one with lowest values it in */
+ if(fabs(eul1[0])+fabs(eul1[1])+fabs(eul1[2]) > fabs(eul2[0])+fabs(eul2[1])+fabs(eul2[2])) {
+ copy_v3_v3(eul, eul2);
+ }
+ else {
+ copy_v3_v3(eul, eul1);
+ }
+}
+
+/* Convert 4x4 matrix to Euler angles (in radians). */
+void mat4_to_eulO(float e[3], const short order,float M[4][4])
+{
+ float m[3][3];
+
+ /* for now, we'll just do this the slow way (i.e. copying matrices) */
+ copy_m3_m4(m, M);
+ normalize_m3(m);
+ mat3_to_eulO(e, order,m);
+}
+
/* uses 2 methods to retrieve eulers, and picks the closest */
void mat3_to_compatible_eulO(float eul[3], float oldrot[3], short order,float mat[3][3])
{
@@ -1263,7 +1319,9 @@ void mat4_to_compatible_eulO(float eul[3], float oldrot[3], short order,float M[
void rotate_eulO(float beul[3], short order, char axis, float ang)
{
float eul[3], mat1[3][3], mat2[3][3], totmat[3][3];
-
+
+ assert(axis >= 'X' && axis <= 'Z');
+
eul[0]= eul[1]= eul[2]= 0.0f;
if (axis=='X')
eul[0]= ang;
@@ -1281,7 +1339,7 @@ void rotate_eulO(float beul[3], short order, char axis, float ang)
}
/* the matrix is written to as 3 axis vectors */
-void eulO_to_gimbal_axis(float gmat[][3], float *eul, short order)
+void eulO_to_gimbal_axis(float gmat[][3], const float eul[3], const short order)
{
RotOrderInfo *R= GET_ROTATIONORDER_INFO(order);
@@ -1394,7 +1452,7 @@ void mat4_to_dquat(DualQuat *dq,float basemat[][4], float mat[][4])
dq->trans[3]= 0.5f*(t[0]*q[2] - t[1]*q[1] + t[2]*q[0]);
}
-void dquat_to_mat4(float mat[][4],DualQuat *dq)
+void dquat_to_mat4(float mat[][4], DualQuat *dq)
{
float len, *t, q0[4];
@@ -1530,7 +1588,79 @@ void copy_dq_dq(DualQuat *dq1, DualQuat *dq2)
memcpy(dq1, dq2, sizeof(DualQuat));
}
-/* lense/angle conversion (radians) */
+/* axis matches eTrackToAxis_Modes */
+void quat_apply_track(float quat[4], short axis, short upflag)
+{
+ /* rotations are hard coded to match vec_to_quat */
+ const float quat_track[][4]= {{0.70710676908493, 0.0, -0.70710676908493, 0.0}, /* pos-y90 */
+ {0.5, 0.5, 0.5, 0.5}, /* Quaternion((1,0,0), radians(90)) * Quaternion((0,1,0), radians(90)) */
+ {0.70710676908493, 0.0, 0.0, 0.70710676908493}, /* pos-z90 */
+ {0.70710676908493, 0.0, 0.70710676908493, 0.0}, /* neg-y90 */
+ {0.5, -0.5, -0.5, 0.5}, /* Quaternion((1,0,0), radians(-90)) * Quaternion((0,1,0), radians(-90)) */
+ {-3.0908619663705394e-08, 0.70710676908493, 0.70710676908493, 3.0908619663705394e-08}}; /* no rotation */
+
+ assert(axis >= 0 && axis <= 5);
+ assert(upflag >= 0 && upflag <= 2);
+
+ mul_qt_qtqt(quat, quat, quat_track[axis]);
+
+ if(axis>2)
+ axis= axis-3;
+
+ /* there are 2 possible up-axis for each axis used, the 'quat_track' applies so the first
+ * up axis is used X->Y, Y->X, Z->X, if this first up axis isn used then rotate 90d
+ * the strange bit shift below just find the low axis {X:Y, Y:X, Z:X} */
+ if(upflag != (2-axis)>>1) {
+ float q[4]= {0.70710676908493, 0.0, 0.0, 0.0}; /* assign 90d rotation axis */
+ q[axis+1] = ((axis==1)) ? 0.70710676908493 : -0.70710676908493; /* flip non Y axis */
+ mul_qt_qtqt(quat, quat, q);
+ }
+}
+
+
+void vec_apply_track(float vec[3], short axis)
+{
+ float tvec[3];
+
+ assert(axis >= 0 && axis <= 5);
+
+ copy_v3_v3(tvec, vec);
+
+ switch(axis) {
+ case 0: /* pos-x */
+ /* vec[0]= 0.0; */
+ vec[1]= tvec[2];
+ vec[2]= -tvec[1];
+ break;
+ case 1: /* pos-y */
+ /* vec[0]= tvec[0]; */
+ /* vec[1]= 0.0; */
+ /* vec[2]= tvec[2]; */
+ break;
+ case 2: /* pos-z */
+ /* vec[0]= tvec[0]; */
+ /* vec[1]= tvec[1]; */
+ // vec[2]= 0.0; */
+ break;
+ case 3: /* neg-x */
+ /* vec[0]= 0.0; */
+ vec[1]= tvec[2];
+ vec[2]= -tvec[1];
+ break;
+ case 4: /* neg-y */
+ vec[0]= -tvec[2];
+ /* vec[1]= 0.0; */
+ vec[2]= tvec[0];
+ break;
+ case 5: /* neg-z */
+ vec[0]= -tvec[0];
+ vec[1]= -tvec[1];
+ /* vec[2]= 0.0; */
+ break;
+ }
+}
+
+/* lens/angle conversion (radians) */
float lens_to_angle(float lens)
{
return 2.0f * atan(16.0f/lens);
diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c
index 6d908ddb1cd..bcad7894e86 100644
--- a/source/blender/blenlib/intern/math_vector.c
+++ b/source/blender/blenlib/intern/math_vector.c
@@ -30,7 +30,7 @@
//******************************* Interpolation *******************************/
-void interp_v2_v2v2(float *target, const float *a, const float *b, const float t)
+void interp_v2_v2v2(float target[2], const float a[2], const float b[2], const float t)
{
float s = 1.0f-t;
@@ -91,7 +91,7 @@ void interp_v4_v4v4v4(float p[4], const float v1[4], const float v2[4], const fl
p[3] = v1[3]*w[0] + v2[3]*w[1] + v3[3]*w[2];
}
-void mid_v3_v3v3(float *v, float *v1, float *v2)
+void mid_v3_v3v3(float v[3], const float v1[3], const float v2[3])
{
v[0]= 0.5f*(v1[0] + v2[0]);
v[1]= 0.5f*(v1[1] + v2[1]);
@@ -103,7 +103,7 @@ void mid_v3_v3v3(float *v, float *v1, float *v2)
/* Return the angle in radians between vecs 1-2 and 2-3 in radians
If v1 is a shoulder, v2 is the elbow and v3 is the hand,
this would return the angle at the elbow */
-float angle_v3v3v3(float *v1, float *v2, float *v3)
+float angle_v3v3v3(const float v1[3], const float v2[3], const float v3[3])
{
float vec1[3], vec2[3];
@@ -116,7 +116,7 @@ float angle_v3v3v3(float *v1, float *v2, float *v3)
}
/* Return the shortest angle in radians between the 2 vectors */
-float angle_v3v3(float *v1, float *v2)
+float angle_v3v3(const float v1[3], const float v2[3])
{
float vec1[3], vec2[3];
@@ -126,7 +126,7 @@ float angle_v3v3(float *v1, float *v2)
return angle_normalized_v3v3(vec1, vec2);
}
-float angle_v2v2v2(float *v1, float *v2, float *v3)
+float angle_v2v2v2(const float v1[2], const float v2[2], const float v3[2])
{
float vec1[2], vec2[2];
@@ -143,7 +143,7 @@ float angle_v2v2v2(float *v1, float *v2, float *v3)
}
/* Return the shortest angle in radians between the 2 vectors */
-float angle_v2v2(float *v1, float *v2)
+float angle_v2v2(const float v1[2], const float v2[2])
{
float vec1[2], vec2[2];
@@ -175,7 +175,7 @@ float angle_normalized_v3v3(const float v1[3], const float v2[3])
return 2.0f*(float)saasin(len_v3v3(v2, v1)/2.0f);
}
-float angle_normalized_v2v2(float *v1, float *v2)
+float angle_normalized_v2v2(const float v1[2], const float v2[2])
{
/* this is the same as acos(dot_v3v3(v1, v2)), but more accurate */
if (dot_v2v2(v1, v2) < 0.0f) {
@@ -231,7 +231,17 @@ void angle_quad_v3(float angles[4], const float v1[3], const float v2[3], const
/********************************* Geometry **********************************/
/* Project v1 on v2 */
-void project_v3_v3v3(float *c, float *v1, float *v2)
+void project_v2_v2v2(float c[2], const float v1[2], const float v2[2])
+{
+ float mul;
+ mul = dot_v2v2(v1, v2) / dot_v2v2(v2, v2);
+
+ c[0] = mul * v2[0];
+ c[1] = mul * v2[1];
+}
+
+/* Project v1 on v2 */
+void project_v3_v3v3(float c[3], const float v1[3], const float v2[3])
{
float mul;
mul = dot_v3v3(v1, v2) / dot_v3v3(v2, v2);
@@ -242,7 +252,7 @@ void project_v3_v3v3(float *c, float *v1, float *v2)
}
/* Returns a vector bisecting the angle at v2 formed by v1, v2 and v3 */
-void bisect_v3_v3v3v3(float *out, float *v1, float *v2, float *v3)
+void bisect_v3_v3v3v3(float out[3], const float v1[3], const float v2[3], const float v3[3])
{
float d_12[3], d_23[3];
sub_v3_v3v3(d_12, v2, v1);
@@ -256,7 +266,7 @@ void bisect_v3_v3v3v3(float *out, float *v1, float *v2, float *v3)
/* Returns a reflection vector from a vector and a normal vector
reflect = vec - ((2 * DotVecs(vec, mirror)) * mirror)
*/
-void reflect_v3_v3v3(float *out, float *v1, float *v2)
+void reflect_v3_v3v3(float out[3], const float v1[3], const float v2[3])
{
float vec[3], normal[3];
float reflect[3] = {0.0f, 0.0f, 0.0f};
@@ -274,7 +284,7 @@ void reflect_v3_v3v3(float *out, float *v1, float *v2)
copy_v3_v3(out, reflect);
}
-void ortho_basis_v3v3_v3(float *v1, float *v2, float *v)
+void ortho_basis_v3v3_v3(float v1[3], float v2[3], const float v[3])
{
const float f = (float)sqrt(v[0]*v[0] + v[1]*v[1]);
@@ -296,6 +306,36 @@ void ortho_basis_v3v3_v3(float *v1, float *v2, float *v)
}
}
+/* Rotate a point p by angle theta around an arbitrary axis r
+ http://local.wasp.uwa.edu.au/~pbourke/geometry/
+*/
+void rotate_normalized_v3_v3v3fl(float r[3], const float p[3], const float axis[3], const float angle)
+{
+ const float costheta= cos(angle);
+ const float sintheta= sin(angle);
+
+ r[0]= ((costheta + (1 - costheta) * axis[0] * axis[0]) * p[0]) +
+ (((1 - costheta) * axis[0] * axis[1] - axis[2] * sintheta) * p[1]) +
+ (((1 - costheta) * axis[0] * axis[2] + axis[1] * sintheta) * p[2]);
+
+ r[1]= (((1 - costheta) * axis[0] * axis[1] + axis[2] * sintheta) * p[0]) +
+ ((costheta + (1 - costheta) * axis[1] * axis[1]) * p[1]) +
+ (((1 - costheta) * axis[1] * axis[2] - axis[0] * sintheta) * p[2]);
+
+ r[2]= (((1 - costheta) * axis[0] * axis[2] - axis[1] * sintheta) * p[0]) +
+ (((1 - costheta) * axis[1] * axis[2] + axis[0] * sintheta) * p[1]) +
+ ((costheta + (1 - costheta) * axis[2] * axis[2]) * p[2]);
+}
+
+void rotate_v3_v3v3fl(float r[3], const float p[3], const float axis[3], const float angle)
+{
+ float axis_n[3];
+
+ normalize_v3_v3(axis_n, axis);
+
+ rotate_normalized_v3_v3v3fl(r, p, axis_n, angle);
+}
+
/*********************************** Other ***********************************/
void print_v2(const char *str, const float v[2])
@@ -313,7 +353,7 @@ void print_v4(const char *str, const float v[4])
printf("%s: %.3f %.3f %.3f %.3f\n", str, v[0], v[1], v[2], v[3]);
}
-void minmax_v3_v3v3(float *min, float *max, float *vec)
+void minmax_v3v3_v3(float min[3], float max[3], const float vec[3])
{
if(min[0]>vec[0]) min[0]= vec[0];
if(min[1]>vec[1]) min[1]= vec[1];
@@ -324,3 +364,91 @@ void minmax_v3_v3v3(float *min, float *max, float *vec)
if(max[2]<vec[2]) max[2]= vec[2];
}
+
+/***************************** Array Functions *******************************/
+
+void range_vni(int *array_tar, const int size, const int start)
+{
+ int *array_pt= array_tar + (size-1);
+ int j= start + (size-1);
+ int i= size;
+ while(i--) { *(array_pt--) = j--; }
+}
+
+void negate_vn(float *array_tar, const int size)
+{
+ float *array_pt= array_tar + (size-1);
+ int i= size;
+ while(i--) { *(array_pt--) *= -1.0f; }
+}
+
+void negate_vn_vn(float *array_tar, const float *array_src, const int size)
+{
+ float *tar= array_tar + (size-1);
+ const float *src= array_src + (size-1);
+ int i= size;
+ while(i--) { *(tar--) = - *(src--); }
+}
+
+void mul_vn_fl(float *array_tar, const int size, const float f)
+{
+ float *array_pt= array_tar + (size-1);
+ int i= size;
+ while(i--) { *(array_pt--) *= f; }
+}
+
+void mul_vn_vn_fl(float *array_tar, const float *array_src, const int size, const float f)
+{
+ float *tar= array_tar + (size-1);
+ const float *src= array_src + (size-1);
+ int i= size;
+ while(i--) { *(tar--) = *(src--) * f; }
+}
+
+void add_vn_vn(float *array_tar, const float *array_src, const int size)
+{
+ float *tar= array_tar + (size-1);
+ const float *src= array_src + (size-1);
+ int i= size;
+ while(i--) { *(tar--) += *(src--); }
+}
+
+void add_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size)
+{
+ float *tar= array_tar + (size-1);
+ const float *src_a= array_src_a + (size-1);
+ const float *src_b= array_src_b + (size-1);
+ int i= size;
+ while(i--) { *(tar--) = *(src_a--) + *(src_b--); }
+}
+
+void sub_vn_vn(float *array_tar, const float *array_src, const int size)
+{
+ float *tar= array_tar + (size-1);
+ const float *src= array_src + (size-1);
+ int i= size;
+ while(i--) { *(tar--) -= *(src--); }
+}
+
+void sub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size)
+{
+ float *tar= array_tar + (size-1);
+ const float *src_a= array_src_a + (size-1);
+ const float *src_b= array_src_b + (size-1);
+ int i= size;
+ while(i--) { *(tar--) = *(src_a--) - *(src_b--); }
+}
+
+void fill_vni(int *array_tar, const int size, const int val)
+{
+ int *tar= array_tar + (size-1);
+ int i= size;
+ while(i--) { *(tar--) = val; }
+}
+
+void fill_vn(float *array_tar, const int size, const float val)
+{
+ float *tar= array_tar + (size-1);
+ int i= size;
+ while(i--) { *(tar--) = val; }
+}
diff --git a/source/blender/blenlib/intern/math_vector_inline.c b/source/blender/blenlib/intern/math_vector_inline.c
index 8530a6ab129..2f808e5d74e 100644
--- a/source/blender/blenlib/intern/math_vector_inline.c
+++ b/source/blender/blenlib/intern/math_vector_inline.c
@@ -27,8 +27,8 @@
#include "BLI_math.h"
-#ifndef BLI_MATH_VECTOR_INLINE
-#define BLI_MATH_VECTOR_INLINE
+#ifndef BLI_MATH_VECTOR_INLINE_H
+#define BLI_MATH_VECTOR_INLINE_H
/********************************** Init *************************************/
@@ -149,6 +149,23 @@ MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
r[2]= a[2] - b[2];
}
+MINLINE void sub_v4_v4(float r[4], const float a[4])
+{
+ r[0] -= a[0];
+ r[1] -= a[1];
+ r[2] -= a[2];
+ r[3] -= a[3];
+}
+
+MINLINE void sub_v4_v4v4(float r[3], const float a[3], const float b[3])
+{
+ r[0]= a[0] - b[0];
+ r[1]= a[1] - b[1];
+ r[2]= a[2] - b[2];
+ r[3]= a[3] - b[3];
+}
+
+
MINLINE void mul_v2_fl(float *v1, float f)
{
v1[0]*= f;
@@ -265,6 +282,22 @@ MINLINE void negate_v3_v3(float r[3], const float a[3])
r[2]= -a[2];
}
+MINLINE void negate_v4(float r[4])
+{
+ r[0]= -r[0];
+ r[1]= -r[1];
+ r[2]= -r[2];
+ r[3]= -r[3];
+}
+
+MINLINE void negate_v4_v4(float r[4], const float a[4])
+{
+ r[0]= -a[0];
+ r[1]= -a[1];
+ r[2]= -a[2];
+ r[3]= -a[3];
+}
+
MINLINE float dot_v2v2(const float a[2], const float b[2])
{
return a[0]*b[0] + a[1]*b[1];
@@ -302,7 +335,7 @@ MINLINE void star_m3_v3(float mat[][3], float *vec)
MINLINE float len_v2(const float v[2])
{
- return (float)sqrt(v[0]*v[0] + v[1]*v[1]);
+ return (float)sqrtf(v[0]*v[0] + v[1]*v[1]);
}
MINLINE float len_v2v2(const float v1[2], const float v2[2])
@@ -311,7 +344,7 @@ MINLINE float len_v2v2(const float v1[2], const float v2[2])
x = v1[0]-v2[0];
y = v1[1]-v2[1];
- return (float)sqrt(x*x+y*y);
+ return (float)sqrtf(x*x+y*y);
}
MINLINE float len_v3(const float a[3])
@@ -319,6 +352,14 @@ MINLINE float len_v3(const float a[3])
return sqrtf(dot_v3v3(a, a));
}
+MINLINE float len_squared_v2v2(const float a[3], const float b[3])
+{
+ float d[2];
+
+ sub_v2_v2v2(d, b, a);
+ return dot_v2v2(d, d);
+}
+
MINLINE float len_v3v3(const float a[3], const float b[3])
{
float d[3];
@@ -394,27 +435,37 @@ MINLINE void normal_float_to_short_v3(short *out, const float *in)
/********************************* Comparison ********************************/
-MINLINE int is_zero_v3(float *v)
+MINLINE int is_zero_v3(const float v[3])
{
return (v[0] == 0 && v[1] == 0 && v[2] == 0);
}
-MINLINE int is_one_v3(float *v)
+MINLINE int is_zero_v4(const float v[4])
+{
+ return (v[0] == 0 && v[1] == 0 && v[2] == 0 && v[3] == 0);
+}
+
+MINLINE int is_one_v3(const float *v)
{
return (v[0] == 1 && v[1] == 1 && v[2] == 1);
}
-MINLINE int equals_v3v3(const float *v1,const float *v2)
+MINLINE int equals_v2v2(const float *v1, const float *v2)
+{
+ return ((v1[0]==v2[0]) && (v1[1]==v2[1]));
+}
+
+MINLINE int equals_v3v3(const float *v1, const float *v2)
{
return ((v1[0]==v2[0]) && (v1[1]==v2[1]) && (v1[2]==v2[2]));
}
-MINLINE int equals_v4v4(float *v1, float *v2)
+MINLINE int equals_v4v4(const float *v1, const float *v2)
{
return ((v1[0]==v2[0]) && (v1[1]==v2[1]) && (v1[2]==v2[2]) && (v1[3]==v2[3]));
}
-MINLINE int compare_v3v3(float *v1, float *v2, float limit)
+MINLINE int compare_v3v3(const float *v1, const float *v2, const float limit)
{
if(fabs(v1[0]-v2[0])<limit)
if(fabs(v1[1]-v2[1])<limit)
@@ -424,7 +475,7 @@ MINLINE int compare_v3v3(float *v1, float *v2, float limit)
return 0;
}
-MINLINE int compare_len_v3v3(float *v1, float *v2, float limit)
+MINLINE int compare_len_v3v3(const float *v1, const float *v2, const float limit)
{
float x,y,z;
@@ -435,7 +486,7 @@ MINLINE int compare_len_v3v3(float *v1, float *v2, float limit)
return ((x*x + y*y + z*z) < (limit*limit));
}
-MINLINE int compare_v4v4(float *v1, float *v2, float limit)
+MINLINE int compare_v4v4(const float *v1, const float *v2, const float limit)
{
if(fabs(v1[0]-v2[0])<limit)
if(fabs(v1[1]-v2[1])<limit)
@@ -446,5 +497,11 @@ MINLINE int compare_v4v4(float *v1, float *v2, float limit)
return 0;
}
-#endif /* BLI_MATH_VECTOR_INLINE */
+MINLINE float line_point_side_v2(const float *l1, const float *l2, const float *pt)
+{
+ return ((l1[0]-pt[0]) * (l2[1]-pt[1])) -
+ ((l2[0]-pt[0]) * (l1[1]-pt[1]));
+}
+
+#endif /* BLI_MATH_VECTOR_INLINE_H */
diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c
index 141e5438bc9..96dad590fee 100644
--- a/source/blender/blenlib/intern/noise.c
+++ b/source/blender/blenlib/intern/noise.c
@@ -1052,15 +1052,17 @@ float BLI_hnoisep(float noisesize, float x, float y, float z)
/* Camberra omitted, didn't seem useful */
/* distance squared */
-static float dist_Squared(float x, float y, float z, float e) { return (x*x + y*y + z*z); }
+static float dist_Squared(float x, float y, float z, float e) { (void)e; return (x*x + y*y + z*z); }
/* real distance */
-static float dist_Real(float x, float y, float z, float e) { return sqrt(x*x + y*y + z*z); }
+static float dist_Real(float x, float y, float z, float e) { (void)e; return sqrt(x*x + y*y + z*z); }
/* manhattan/taxicab/cityblock distance */
-static float dist_Manhattan(float x, float y, float z, float e) { return (fabs(x) + fabs(y) + fabs(z)); }
+static float dist_Manhattan(float x, float y, float z, float e) { (void)e; return (fabs(x) + fabs(y) + fabs(z)); }
/* Chebychev */
static float dist_Chebychev(float x, float y, float z, float e)
{
float t;
+ (void)e;
+
x = fabs(x);
y = fabs(y);
z = fabs(z);
@@ -1072,12 +1074,14 @@ static float dist_Chebychev(float x, float y, float z, float e)
static float dist_MinkovskyH(float x, float y, float z, float e)
{
float d = sqrt(fabs(x)) + sqrt(fabs(y)) + sqrt(fabs(z));
+ (void)e;
return (d*d);
}
/* minkovsky preset exponent 4 */
static float dist_Minkovsky4(float x, float y, float z, float e)
{
+ (void)e;
x *= x;
y *= y;
z *= z;
@@ -1752,7 +1756,7 @@ float mg_RidgedMultiFractal(float x, float y, float z, float H, float lacunarity
signal = offset - fabs(noisefunc(x, y, z));
signal *= signal;
result = signal;
- weight = 1.f;
+
for( i=1; i<(int)octaves; i++ ) {
x *= lacunarity;
diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c
index 384f3aa541f..5d68fbe6e92 100644
--- a/source/blender/blenlib/intern/path_util.c
+++ b/source/blender/blenlib/intern/path_util.c
@@ -32,6 +32,7 @@
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
+#include <assert.h>
#include "MEM_guardedalloc.h"
@@ -42,6 +43,7 @@
#include "BLI_string.h"
#include "BLI_storage.h"
#include "BLI_storage_types.h"
+#include "BLI_utildefines.h"
#include "BKE_utildefines.h"
#include "BKE_blender.h" // BLENDER_VERSION
@@ -76,6 +78,9 @@
#endif /* WIN32 */
/* local */
+#define UNIQUE_NAME_MAX 128
+
+extern char bprogname[];
static int add_win32_extension(char *name);
static char *blender_version_decimal(void);
@@ -136,10 +141,41 @@ void BLI_stringenc(char *string, const char *head, const char *tail, unsigned sh
sprintf(string, fmtstr, head, pic, tail);
}
+/* Foo.001 -> "Foo", 1
+ * Returns the length of "Foo" */
+int BLI_split_name_num(char *left, int *nr, const char *name, const char delim)
+{
+ int a;
+
+ *nr= 0;
+ a= strlen(name);
+ memcpy(left, name, (a + 1) * sizeof(char));
+
+ if(a>1 && name[a-1]==delim) return a;
+
+ while(a--) {
+ if( name[a]==delim ) {
+ left[a]= 0;
+ *nr= atol(name+a+1);
+ /* casting down to an int, can overflow for large numbers */
+ if(*nr < 0)
+ *nr= 0;
+ return a;
+ }
+ if( isdigit(name[a])==0 ) break;
+
+ left[a]= 0;
+ }
+
+ for(a= 0; name[a]; a++)
+ left[a]= name[a];
+
+ return a;
+}
void BLI_newname(char *name, int add)
{
- char head[128], tail[128];
+ char head[UNIQUE_NAME_MAX], tail[UNIQUE_NAME_MAX];
int pic;
unsigned short digits;
@@ -159,13 +195,43 @@ void BLI_newname(char *name, int add)
BLI_stringenc(name, head, tail, digits, pic);
}
+
+
+int BLI_uniquename_cb(int (*unique_check)(void *, const char *), void *arg, const char defname[], char delim, char *name, short name_len)
+{
+ if(name == '\0') {
+ BLI_strncpy(name, defname, name_len);
+ }
+
+ if(unique_check(arg, name)) {
+ char tempname[UNIQUE_NAME_MAX];
+ char left[UNIQUE_NAME_MAX];
+ int number;
+ int len= BLI_split_name_num(left, &number, name, delim);
+ do {
+ int newlen= BLI_snprintf(tempname, name_len, "%s%c%03d", left, delim, number);
+ if(newlen >= name_len) {
+ len -= ((newlen + 1) - name_len);
+ if(len < 0) len= number= 0;
+ left[len]= '\0';
+ }
+ } while(number++, unique_check(arg, tempname));
+
+ BLI_strncpy(name, tempname, name_len);
+
+ return 1;
+ }
+
+ return 0;
+}
+
/* little helper macro for BLI_uniquename */
#ifndef GIVE_STRADDR
#define GIVE_STRADDR(data, offset) ( ((char *)data) + offset )
#endif
/* Generic function to set a unique name. It is only designed to be used in situations
- * where the name is part of the struct, and also that the name is at most 128 chars long.
+ * where the name is part of the struct, and also that the name is at most UNIQUE_NAME_MAX chars long.
*
* For places where this is used, see constraint.c for example...
*
@@ -174,65 +240,45 @@ void BLI_newname(char *name, int add)
* defname: the name that should be used by default if none is specified already
* delim: the character which acts as a delimeter between parts of the name
*/
-void BLI_uniquename(ListBase *list, void *vlink, const char defname[], char delim, short name_offs, short len)
+static int uniquename_find_dupe(ListBase *list, void *vlink, const char *name, short name_offs)
{
Link *link;
- char tempname[128];
- int number = 1, exists = 0;
- char *dot;
-
- /* Make sure length can be handled */
- if ((len < 0) || (len > 128))
- return;
-
- /* See if we are given an empty string */
- if (ELEM(NULL, vlink, defname))
- return;
-
- if (GIVE_STRADDR(vlink, name_offs) == '\0') {
- /* give it default name first */
- BLI_strncpy(GIVE_STRADDR(vlink, name_offs), defname, len);
- }
-
- /* See if we even need to do this */
- if (list == NULL)
- return;
-
+
for (link = list->first; link; link= link->next) {
if (link != vlink) {
- if (!strcmp(GIVE_STRADDR(link, name_offs), GIVE_STRADDR(vlink, name_offs))) {
- exists = 1;
- break;
+ if (!strcmp(GIVE_STRADDR(link, name_offs), name)) {
+ return 1;
}
}
}
- if (exists == 0)
+
+ return 0;
+}
+
+static int uniquename_unique_check(void *arg, const char *name)
+{
+ struct {ListBase *lb; void *vlink; short name_offs;} *data= arg;
+ return uniquename_find_dupe(data->lb, data->vlink, name, data->name_offs);
+}
+
+void BLI_uniquename(ListBase *list, void *vlink, const char defname[], char delim, short name_offs, short name_len)
+{
+ struct {ListBase *lb; void *vlink; short name_offs;} data;
+ data.lb= list;
+ data.vlink= vlink;
+ data.name_offs= name_offs;
+
+ assert((name_len > 1) && (name_len <= UNIQUE_NAME_MAX));
+
+ /* See if we are given an empty string */
+ if (ELEM(NULL, vlink, defname))
return;
- /* Strip off the suffix */
- dot = strrchr(GIVE_STRADDR(vlink, name_offs), delim);
- if (dot)
- *dot=0;
-
- for (number = 1; number <= 999; number++) {
- BLI_snprintf(tempname, sizeof(tempname), "%s%c%03d", GIVE_STRADDR(vlink, name_offs), delim, number);
-
- exists = 0;
- for (link= list->first; link; link= link->next) {
- if (vlink != link) {
- if (!strcmp(GIVE_STRADDR(link, name_offs), tempname)) {
- exists = 1;
- break;
- }
- }
- }
- if (exists == 0) {
- BLI_strncpy(GIVE_STRADDR(vlink, name_offs), tempname, len);
- return;
- }
- }
+ BLI_uniquename_cb(uniquename_unique_check, &data, defname, delim, GIVE_STRADDR(vlink, name_offs), name_len);
}
+
+
/* ******************** string encoding ***************** */
/* This is quite an ugly function... its purpose is to
@@ -373,8 +419,8 @@ void BLI_path_rel(char *file, const char *relfile)
/* also bail out if relative path is not set */
if (relfile[0] == 0) return;
-#ifdef WIN32
- if (strlen(relfile) > 2 && relfile[1] != ':') {
+#ifdef WIN32
+ if (BLI_strnlen(relfile, 3) > 2 && relfile[1] != ':') {
char* ptemp;
/* fix missing volume name in relative base,
can happen with old recent-files.txt files */
@@ -388,7 +434,7 @@ void BLI_path_rel(char *file, const char *relfile)
BLI_strncpy(temp, relfile, FILE_MAXDIR + FILE_MAXFILE);
}
- if (strlen(file) > 2) {
+ if (BLI_strnlen(file, 3) > 2) {
if ( temp[1] == ':' && file[1] == ':' && temp[0] != file[0] )
return;
}
@@ -413,7 +459,7 @@ void BLI_path_rel(char *file, const char *relfile)
char *p= temp;
char *q= file;
- while ((*p == *q)) {
+ while (*p == *q) {
++p; ++q;
/* dont search beyond the end of the string
* in the rare case they match */
@@ -471,13 +517,9 @@ int BLI_has_parent(char *path)
int BLI_parent_dir(char *path)
{
-#ifdef WIN32
- static char *parent_dir="..\\";
-#else
- static char *parent_dir="../";
-#endif
+ static char parent_dir[]= {'.', '.', SEP, '\0'}; /* "../" or "..\\" */
char tmp[FILE_MAXDIR+FILE_MAXFILE+4];
- BLI_strncpy(tmp, path, sizeof(tmp));
+ BLI_strncpy(tmp, path, sizeof(tmp)-4);
BLI_add_slash(tmp);
strcat(tmp, parent_dir);
BLI_cleanup_dir(NULL, tmp);
@@ -547,9 +589,20 @@ int BLI_path_frame(char *path, int frame, int digits)
ensure_digits(path, digits);
if (stringframe_chars(path, &ch_sta, &ch_end)) { /* warning, ch_end is the last # +1 */
- char tmp[FILE_MAX], format[64];
+ char tmp[FILE_MAX];
+#if 0 // neat but breaks on non ascii strings.
+ char format[64];
sprintf(format, "%%.%ds%%.%dd%%s", ch_sta, ch_end-ch_sta); /* example result: "%.12s%.5d%s" */
sprintf(tmp, format, path, frame, path+ch_end);
+#else
+ char format[8];
+ char *p;
+ sprintf(format, "%%.%dd", ch_end-ch_sta); /* example result: "%.5d" */
+ memcpy(tmp, path, sizeof(char) * ch_sta);
+ p= tmp + ch_sta;
+ p += sprintf(p, format, frame);
+ memcpy(p, path + ch_end, strlen(path + ch_end));
+#endif
strcpy(path, tmp);
return 1;
}
@@ -565,9 +618,18 @@ int BLI_path_frame_range(char *path, int sta, int end, int digits)
if (stringframe_chars(path, &ch_sta, &ch_end)) { /* warning, ch_end is the last # +1 */
char tmp[FILE_MAX], format[64];
+#if 0 // neat but breaks on non ascii strings.
sprintf(format, "%%.%ds%%.%dd_%%.%dd%%s", ch_sta, ch_end-ch_sta, ch_end-ch_sta); /* example result: "%.12s%.5d-%.5d%s" */
sprintf(tmp, format, path, sta, end, path+ch_end);
strcpy(path, tmp);
+#else
+ char *tmp_pt;
+ BLI_snprintf(format, sizeof(format), "%%.%dd-%%.%dd%%s", digits, digits);
+ memcpy(tmp, path, ch_sta * sizeof(char));
+ tmp_pt = &tmp[ch_sta];
+ tmp_pt += BLI_snprintf(tmp_pt, sizeof(tmp)-ch_sta, format, sta, end, &path[ch_end]);
+ memcpy(path, tmp, (int)(tmp_pt - tmp) + 1);
+#endif
return 1;
}
return 0;
@@ -795,7 +857,7 @@ static char *blender_version_decimal(void)
return version_str;
}
-static int test_path(char *targetpath, char *path_base, char *path_sep, char *folder_name)
+static int test_path(char *targetpath, const char *path_base, const char *path_sep, const char *folder_name)
{
char tmppath[FILE_MAX];
@@ -819,7 +881,7 @@ static int test_path(char *targetpath, char *path_base, char *path_sep, char *fo
}
}
-static int test_env_path(char *path, char *envvar)
+static int test_env_path(char *path, const char *envvar)
{
char *env = envvar?getenv(envvar):NULL;
if (!env) return 0;
@@ -833,14 +895,10 @@ static int test_env_path(char *path, char *envvar)
}
}
-static int get_path_local(char *targetpath, char *folder_name, char *subfolder_name)
+static int get_path_local(char *targetpath, const char *folder_name, const char *subfolder_name)
{
- extern char bprogname[]; /* argv[0] from creator.c */
char bprogdir[FILE_MAX];
char relfolder[FILE_MAX];
- char cwd[FILE_MAX];
- char *s;
- int i;
#ifdef PATH_DEBUG2
printf("get_path_local...\n");
@@ -853,34 +911,16 @@ static int get_path_local(char *targetpath, char *folder_name, char *subfolder_n
}
/* use argv[0] (bprogname) to get the path to the executable */
- s = BLI_last_slash(bprogname);
- i = s - bprogname + 1;
- BLI_strncpy(bprogdir, bprogname, i);
-
- /* try EXECUTABLE_DIR/folder_name */
- if(test_path(targetpath, bprogdir, "", relfolder))
- return 1;
-
- /* try CWD/release/folder_name */
- if(test_path(targetpath, BLI_getwdN(cwd), "release", relfolder))
- return 1;
-
- /* try EXECUTABLE_DIR/release/folder_name */
- if(test_path(targetpath, bprogdir, "release", relfolder))
- return 1;
+ BLI_split_dirfile(bprogname, bprogdir, NULL);
- /* try EXECUTABLE_DIR/2.5/folder_name - new default directory for local blender installed files */
+ /* try EXECUTABLE_DIR/2.5x/folder_name - new default directory for local blender installed files */
if(test_path(targetpath, bprogdir, blender_version_decimal(), relfolder))
return 1;
- /* try ./.blender/folder_name -- DEPRECATED, need to update build systems */
- if(test_path(targetpath, bprogdir, ".blender", relfolder))
- return 1;
-
return 0;
}
-static int get_path_user(char *targetpath, char *folder_name, char *subfolder_name, char *envvar)
+static int get_path_user(char *targetpath, const char *folder_name, const char *subfolder_name, const char *envvar)
{
char user_path[FILE_MAX];
const char *user_base_path;
@@ -917,11 +957,38 @@ static int get_path_user(char *targetpath, char *folder_name, char *subfolder_na
}
}
-static int get_path_system(char *targetpath, char *folder_name, char *subfolder_name, char *envvar)
+static int get_path_system(char *targetpath, const char *folder_name, const char *subfolder_name, const char *envvar)
{
char system_path[FILE_MAX];
const char *system_base_path;
+
+ /* first allow developer only overrides to the system path
+ * these are only used when running blender from source */
+ char cwd[FILE_MAX];
+ char relfolder[FILE_MAX];
+ char bprogdir[FILE_MAX];
+
+ /* use argv[0] (bprogname) to get the path to the executable */
+ BLI_split_dirfile(bprogname, bprogdir, NULL);
+
+ if (subfolder_name) {
+ BLI_join_dirfile(relfolder, folder_name, subfolder_name);
+ } else {
+ BLI_strncpy(relfolder, folder_name, FILE_MAX);
+ }
+
+ /* try CWD/release/folder_name */
+ if(test_path(targetpath, BLI_getwdN(cwd), "release", relfolder))
+ return 1;
+
+ /* try EXECUTABLE_DIR/release/folder_name */
+ if(test_path(targetpath, bprogdir, "release", relfolder))
+ return 1;
+ /* end developer overrides */
+
+
+
system_path[0] = '\0';
if (test_env_path(system_path, envvar)) {
@@ -956,7 +1023,7 @@ static int get_path_system(char *targetpath, char *folder_name, char *subfolder_
/* get a folder out of the 'folder_id' presets for paths */
/* returns the path if found, NULL string if not */
-char *BLI_get_folder(int folder_id, char *subfolder)
+char *BLI_get_folder(int folder_id, const char *subfolder)
{
static char path[FILE_MAX] = "";
@@ -1028,7 +1095,7 @@ char *BLI_get_folder(int folder_id, char *subfolder)
return path;
}
-static char *BLI_get_user_folder_notest(int folder_id, char *subfolder)
+char *BLI_get_user_folder_notest(int folder_id, const char *subfolder)
{
static char path[FILE_MAX] = "";
@@ -1042,6 +1109,9 @@ static char *BLI_get_user_folder_notest(int folder_id, char *subfolder)
case BLENDER_USER_AUTOSAVE:
get_path_user(path, "autosave", subfolder, "BLENDER_USER_AUTOSAVE");
break;
+ case BLENDER_USER_SCRIPTS:
+ get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS");
+ break;
}
if ('\0' == path[0]) {
return NULL;
@@ -1049,12 +1119,12 @@ static char *BLI_get_user_folder_notest(int folder_id, char *subfolder)
return path;
}
-char *BLI_get_folder_create(int folder_id, char *subfolder)
+char *BLI_get_folder_create(int folder_id, const char *subfolder)
{
char *path;
/* only for user folders */
- if (!ELEM3(folder_id, BLENDER_USER_DATAFILES, BLENDER_USER_CONFIG, BLENDER_USER_AUTOSAVE))
+ if (!ELEM4(folder_id, BLENDER_USER_DATAFILES, BLENDER_USER_CONFIG, BLENDER_USER_SCRIPTS, BLENDER_USER_AUTOSAVE))
return NULL;
path = BLI_get_folder(folder_id, subfolder);
@@ -1112,8 +1182,9 @@ void BLI_setenv_if_new(const char *env, const char* val)
void BLI_clean(char *path)
{
if(path==0) return;
+
#ifdef WIN32
- if(path && strlen(path)>2) {
+ if(path && BLI_strnlen(path, 3) > 2) {
BLI_char_switch(path+2, '/', '\\');
}
#else
@@ -1133,45 +1204,31 @@ void BLI_char_switch(char *string, char from, char to)
void BLI_make_exist(char *dir) {
int a;
- #ifdef WIN32
- BLI_char_switch(dir, '/', '\\');
- #else
- BLI_char_switch(dir, '\\', '/');
- #endif
-
+ BLI_char_switch(dir, ALTSEP, SEP);
+
a = strlen(dir);
-
-#ifdef WIN32
+
while(BLI_is_dir(dir) == 0){
a --;
- while(dir[a] != '\\'){
+ while(dir[a] != SEP){
a--;
if (a <= 0) break;
}
- if (a >= 0) dir[a+1] = 0;
+ if (a >= 0) {
+ dir[a+1] = '\0';
+ }
else {
- /* defaulting to drive (usually 'C:') of Windows installation */
+#ifdef WIN32
get_default_root(dir);
- break;
- }
- }
#else
- while(BLI_is_dir(dir) == 0){
- a --;
- while(dir[a] != '/'){
- a--;
- if (a <= 0) break;
- }
- if (a >= 0) dir[a+1] = 0;
- else {
strcpy(dir,"/");
+#endif
break;
}
}
-#endif
}
-void BLI_make_existing_file(char *name)
+void BLI_make_existing_file(const char *name)
{
char di[FILE_MAXDIR+FILE_MAXFILE], fi[FILE_MAXFILE];
@@ -1209,15 +1266,14 @@ void BLI_make_file_string(const char *relabase, char *string, const char *dir,
/* Get the file name, chop everything past the last slash (ie. the filename) */
strcpy(string, relabase);
- lslash= (strrchr(string, '/')>strrchr(string, '\\'))?strrchr(string, '/'):strrchr(string, '\\');
-
+ lslash= BLI_last_slash(string);
if(lslash) *(lslash+1)= 0;
dir+=2; /* Skip over the relative reference */
}
#ifdef WIN32
else {
- if (strlen(dir) >= 2 && dir[1] == ':' ) {
+ if (BLI_strnlen(dir, 3) >= 2 && dir[1] == ':' ) {
BLI_strncpy(string, dir, 3);
dir += 2;
}
@@ -1263,10 +1319,10 @@ int BLI_testextensie(const char *str, const char *ext)
{
short a, b;
int retval;
-
+
a= strlen(str);
b= strlen(ext);
-
+
if(a==0 || b==0 || b>=a) {
retval = 0;
} else if (BLI_strcasecmp(ext, str + a - b)) {
@@ -1274,7 +1330,7 @@ int BLI_testextensie(const char *str, const char *ext)
} else {
retval = 1;
}
-
+
return (retval);
}
@@ -1486,6 +1542,67 @@ int BKE_rebase_path(char *abs, int abs_size, char *rel, int rel_size, const char
return 1;
}
+char *BLI_first_slash(char *string) {
+ char *ffslash, *fbslash;
+
+ ffslash= strchr(string, '/');
+ fbslash= strchr(string, '\\');
+
+ if (!ffslash) return fbslash;
+ else if (!fbslash) return ffslash;
+
+ if ((intptr_t)ffslash < (intptr_t)fbslash) return ffslash;
+ else return fbslash;
+}
+
+char *BLI_last_slash(const char *string) {
+ char *lfslash, *lbslash;
+
+ lfslash= strrchr(string, '/');
+ lbslash= strrchr(string, '\\');
+
+ if (!lfslash) return lbslash;
+ else if (!lbslash) return lfslash;
+
+ if ((intptr_t)lfslash < (intptr_t)lbslash) return lbslash;
+ else return lfslash;
+}
+
+/* adds a slash if there isnt one there already */
+int BLI_add_slash(char *string) {
+ int len = strlen(string);
+#ifdef WIN32
+ if (len==0 || string[len-1]!='\\') {
+ string[len] = '\\';
+ string[len+1] = '\0';
+ return len+1;
+ }
+#else
+ if (len==0 || string[len-1]!='/') {
+ string[len] = '/';
+ string[len+1] = '\0';
+ return len+1;
+ }
+#endif
+ return len;
+}
+
+/* removes a slash if there is one */
+void BLI_del_slash(char *string) {
+ int len = strlen(string);
+ while (len) {
+#ifdef WIN32
+ if (string[len-1]=='\\') {
+#else
+ if (string[len-1]=='/') {
+#endif
+ string[len-1] = '\0';
+ len--;
+ } else {
+ break;
+ }
+ }
+}
static int add_win32_extension(char *name)
{
@@ -1534,10 +1651,10 @@ void BLI_where_am_i(char *fullname, const char *name)
char *path = NULL, *temp;
#ifdef _WIN32
- char *separator = ";";
+ const char *separator = ";";
char slash = '\\';
#else
- char *separator = ":";
+ const char *separator = ":";
char slash = '/';
#endif
@@ -1598,7 +1715,7 @@ void BLI_where_am_i(char *fullname, const char *name)
} while (temp);
}
}
-#ifndef NDEBUG
+#if defined(DEBUG)
if (strcmp(name, fullname)) {
printf("guessing '%s' == '%s'\n", name, fullname);
}
@@ -1611,7 +1728,7 @@ void BLI_where_am_i(char *fullname, const char *name)
// with spawnv(P_WAIT, bprogname, argv) instead of system() but
// that's even uglier
GetShortPathName(fullname, fullname, FILE_MAXDIR+FILE_MAXFILE);
-#ifndef NDEBUG
+#if defined(DEBUG)
printf("Shortname = '%s'\n", fullname);
#endif
#endif
@@ -1656,11 +1773,13 @@ void BLI_where_is_temp(char *fullname, int usertemp)
} else {
/* add a trailing slash if needed */
BLI_add_slash(fullname);
+#ifdef WIN32
+ strcpy(U.tempdir, fullname); /* also set user pref to show %TEMP%. /tmp/ is just plain confusing for Windows users. */
+#endif
}
}
char *get_install_dir(void) {
- extern char bprogname[];
char *tmpname = BLI_strdup(bprogname);
char *cut;
diff --git a/source/blender/blenlib/intern/pbvh.c b/source/blender/blenlib/intern/pbvh.c
index bd721871f0a..9be42f9f5fc 100644
--- a/source/blender/blenlib/intern/pbvh.c
+++ b/source/blender/blenlib/intern/pbvh.c
@@ -27,6 +27,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_pbvh.h"
@@ -1399,7 +1400,7 @@ int BLI_pbvh_node_raycast(PBVH *bvh, PBVHNode *node, float (*origco)[3],
//#include <GL/glew.h>
-void BLI_pbvh_node_draw(PBVHNode *node, void *data)
+void BLI_pbvh_node_draw(PBVHNode *node, void *UNUSED(data))
{
#if 0
/* XXX: Just some quick code to show leaf nodes in different colors */
@@ -1474,13 +1475,6 @@ void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3], int smo
}
}
-void BLI_pbvh_grids_update(PBVH *bvh, DMGridData **grids, DMGridAdjacency *gridadj, void **gridfaces)
-{
- bvh->grids= grids;
- bvh->gridadj= gridadj;
- bvh->gridfaces= gridfaces;
-}
-
float (*BLI_pbvh_get_vertCos(PBVH *pbvh))[3]
{
int a;
@@ -1519,13 +1513,22 @@ void BLI_pbvh_apply_vertCos(PBVH *pbvh, float (*vertCos)[3])
}
if (pbvh->verts) {
+ MVert *mvert= pbvh->verts;
/* copy new verts coords */
- for (a= 0; a < pbvh->totvert; ++a) {
- copy_v3_v3(pbvh->verts[a].co, vertCos[a]);
+ for (a= 0; a < pbvh->totvert; ++a, ++mvert) {
+ copy_v3_v3(mvert->co, vertCos[a]);
+ mvert->flag |= ME_VERT_PBVH_UPDATE;
}
/* coordinates are new -- normals should also be updated */
mesh_calc_normals(pbvh->verts, pbvh->totvert, pbvh->faces, pbvh->totprim, NULL);
+
+ for (a= 0; a < pbvh->totnode; ++a)
+ BLI_pbvh_node_mark_update(&pbvh->nodes[a]);
+
+ BLI_pbvh_update(pbvh, PBVH_UpdateBB, NULL);
+ BLI_pbvh_update(pbvh, PBVH_UpdateOriginalBB, NULL);
+
}
}
diff --git a/source/blender/blenlib/intern/scanfill.c b/source/blender/blenlib/intern/scanfill.c
index 7896ebdd263..1978e7ed7d6 100644
--- a/source/blender/blenlib/intern/scanfill.c
+++ b/source/blender/blenlib/intern/scanfill.c
@@ -36,10 +36,10 @@
#include "BLI_math.h"
/* callbacks for errors and interrupts and some goo */
-static void (*BLI_localErrorCallBack)(char*) = NULL;
+static void (*BLI_localErrorCallBack)(const char*) = NULL;
static int (*BLI_localInterruptCallBack)(void) = NULL;
-void BLI_setErrorCallBack(void (*f)(char*))
+void BLI_setErrorCallBack(void (*f)(const char *))
{
BLI_localErrorCallBack = f;
}
@@ -50,7 +50,7 @@ void BLI_setInterruptCallBack(int (*f)(void))
}
/* just flush the error to /dev/null if the error handler is missing */
-void callLocalErrorCallBack(char* msg)
+void callLocalErrorCallBack(const char* msg)
{
if (BLI_localErrorCallBack) {
BLI_localErrorCallBack(msg);
@@ -360,7 +360,7 @@ static ScFillVert *addedgetoscanlist(EditEdge *eed, int len)
sc= (ScFillVert *)bsearch(&scsearch,scdata,len,
sizeof(ScFillVert), vergscdata);
- if(sc==0) printf("Error in search edge: %p\n",eed);
+ if(sc==0) printf("Error in search edge: %p\n", (void *)eed);
else if(addedgetoscanvert(sc,eed)==0) return sc;
return 0;
@@ -465,8 +465,8 @@ static void splitlist(ListBase *tempve, ListBase *temped, short nr)
EditVert *eve,*nextve;
EditEdge *eed,*nexted;
- addlisttolist(tempve,&fillvertbase);
- addlisttolist(temped,&filledgebase);
+ BLI_movelisttolist(tempve,&fillvertbase);
+ BLI_movelisttolist(temped,&filledgebase);
eve= tempve->first;
while(eve) {
@@ -499,9 +499,9 @@ static void scanfill(PolyFill *pf, int mat_nr)
short nr, test, twoconnected=0;
nr= pf->nr;
- verts= pf->verts;
/* PRINTS
+ verts= pf->verts;
eve= fillvertbase.first;
while(eve) {
printf("vert: %x co: %f %f\n",eve,eve->co[cox],eve->co[coy]);
@@ -558,7 +558,6 @@ static void scanfill(PolyFill *pf, int mat_nr)
qsort(scdata, verts, sizeof(ScFillVert), vergscdata);
- sc= scdata;
eed= filledgebase.first;
while(eed) {
nexted= eed->next;
@@ -747,7 +746,7 @@ static void scanfill(PolyFill *pf, int mat_nr)
-int BLI_edgefill(int mode, int mat_nr)
+int BLI_edgefill(int mat_nr)
{
/*
- fill works with its own lists, so create that first (no faces!)
@@ -1005,8 +1004,8 @@ int BLI_edgefill(int mode, int mat_nr)
MEM_freeN(polycache);
}
- pf= pflist;
/* printf("after merge\n");
+ pf= pflist;
for(a=1;a<=poly;a++) {
printf("poly:%d edges:%d verts:%d flag: %d\n",a,pf->edges,pf->verts,pf->f);
pf++;
@@ -1029,8 +1028,8 @@ int BLI_edgefill(int mode, int mat_nr)
}
pf++;
}
- addlisttolist(&fillvertbase,&tempve);
- addlisttolist(&filledgebase,&temped);
+ BLI_movelisttolist(&fillvertbase,&tempve);
+ BLI_movelisttolist(&filledgebase,&temped);
/* FREE */
diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c
index 9c31557619b..e407df7e9a1 100644
--- a/source/blender/blenlib/intern/storage.c
+++ b/source/blender/blenlib/intern/storage.c
@@ -91,6 +91,7 @@
#include "BLI_linklist.h"
#include "BLI_storage_types.h"
#include "BLI_string.h"
+
#include "BKE_utildefines.h"
/* vars: */
@@ -146,7 +147,7 @@ int BLI_compare(struct direntry *entry1, struct direntry *entry2)
}
-double BLI_diskfree(char *dir)
+double BLI_diskfree(const char *dir)
{
#ifdef WIN32
DWORD sectorspc, bytesps, freec, clusters;
@@ -201,11 +202,11 @@ double BLI_diskfree(char *dir)
#endif
}
-void BLI_builddir(char *dirname, char *relname)
+void BLI_builddir(const char *dirname, const char *relname)
{
struct dirent *fname;
struct dirlink *dlink;
- int rellen, newnum = 0, len;
+ int rellen, newnum = 0;
char buf[256];
DIR *dir;
@@ -224,8 +225,6 @@ void BLI_builddir(char *dirname, char *relname)
if ( (dir = (DIR *)opendir(".")) ){
while ((fname = (struct dirent*) readdir(dir)) != NULL) {
- len= strlen(fname->d_name);
-
dlink = (struct dirlink *)malloc(sizeof(struct dirlink));
if (dlink){
strcpy(buf+rellen,fname->d_name);
@@ -289,12 +288,12 @@ void BLI_builddir(char *dirname, char *relname)
}
}
-void BLI_adddirstrings()
+void BLI_adddirstrings(void)
{
char datum[100];
char buf[512];
char size[250];
- static char * types[8] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"};
+ static const char * types[8] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"};
int num, mode;
#ifdef WIN32
__int64 st_size;
@@ -397,7 +396,7 @@ void BLI_adddirstrings()
}
}
-unsigned int BLI_getdir(char *dirname, struct direntry **filelist)
+unsigned int BLI_getdir(const char *dirname, struct direntry **filelist)
{
// reset global variables
// memory stored in files is free()'d in
@@ -443,7 +442,7 @@ size_t BLI_filepathsize(const char *path)
}
-int BLI_exist(char *name)
+int BLI_exist(const char *name)
{
#if defined(WIN32) && !defined(__MINGW32__)
struct _stat64i32 st;
@@ -474,7 +473,7 @@ int BLI_exist(char *name)
}
/* would be better in fileops.c except that it needs stat.h so add here */
-int BLI_is_dir(char *file) {
+int BLI_is_dir(const char *file) {
return S_ISDIR(BLI_exist(file));
}
diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c
index 76193ba9a13..6afc34ba630 100644
--- a/source/blender/blenlib/intern/string.c
+++ b/source/blender/blenlib/intern/string.c
@@ -311,8 +311,13 @@ int BLI_natstrcmp(const char *s1, const char *s2)
c1 = tolower(s1[d1]);
c2 = tolower(s2[d2]);
}
-
- if (c1<c2) {
+
+ /* first check for '.' so "foo.bar" comes before "foo 1.bar" */
+ if(c1=='.' && c2!='.')
+ return -1;
+ if(c1!='.' && c2=='.')
+ return 1;
+ else if (c1<c2) {
return -1;
} else if (c1>c2) {
return 1;
diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c
index 726ed817f8b..eb2057220fe 100644
--- a/source/blender/blenlib/intern/threads.c
+++ b/source/blender/blenlib/intern/threads.c
@@ -442,6 +442,8 @@ ThreadedWorker *BLI_create_worker(void *(*do_thread)(void *), int tot, int sleep
{
ThreadedWorker *worker;
+ (void)sleep_time; /* unused */
+
worker = MEM_callocN(sizeof(ThreadedWorker), "threadedworker");
if (tot > RE_MAX_THREAD)
diff --git a/source/blender/blenlib/intern/uvproject.c b/source/blender/blenlib/intern/uvproject.c
index cc115d52928..b08f05b4fc8 100644
--- a/source/blender/blenlib/intern/uvproject.c
+++ b/source/blender/blenlib/intern/uvproject.c
@@ -60,7 +60,9 @@ void project_from_camera(float target[2], float source[3], UvCameraInfo *uci)
target[1]= pv4[1] / uci->camsize;
}
else {
- float vec2d[2]= {pv4[0], pv4[2]}; /* 2D position from the camera */
+ float vec2d[2]; /* 2D position from the camera */
+ vec2d[0]= pv4[0];
+ vec2d[1]= pv4[2];
target[0]= angle * (M_PI / uci->camangle);
target[1]= pv4[1] / (len_v2(vec2d) * uci->camsize);
}
diff --git a/source/blender/blenlib/intern/voxel.c b/source/blender/blenlib/intern/voxel.c
index 2b04a49e848..72a9c7d98ec 100644
--- a/source/blender/blenlib/intern/voxel.c
+++ b/source/blender/blenlib/intern/voxel.c
@@ -27,8 +27,9 @@
*/
#include "BLI_voxel.h"
+#include "BLI_utildefines.h"
+
-#include "BKE_utildefines.h"
BM_INLINE float D(float *data, int *res, int x, int y, int z)
{
diff --git a/source/blender/blenlib/intern/winstuff.c b/source/blender/blenlib/intern/winstuff.c
index b3438590321..c7ec34d69a3 100644
--- a/source/blender/blenlib/intern/winstuff.c
+++ b/source/blender/blenlib/intern/winstuff.c
@@ -36,10 +36,13 @@
#include "MEM_guardedalloc.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
+
+#include "BKE_utildefines.h"
+
#define WIN32_SKIP_HKEY_PROTECTION // need to use HKEY
#include "BLI_winstuff.h"
-#include "BKE_utildefines.h" /* FILE_MAXDIR + FILE_MAXFILE */
+ /* FILE_MAXDIR + FILE_MAXFILE */
int BLI_getInstallationDir( char * str ) {
char dir[FILE_MAXDIR];
diff --git a/source/blender/blenloader/BLO_readfile.h b/source/blender/blenloader/BLO_readfile.h
index 719a3c065ae..94983791289 100644
--- a/source/blender/blenloader/BLO_readfile.h
+++ b/source/blender/blenloader/BLO_readfile.h
@@ -80,7 +80,7 @@ typedef struct BlendFileData {
* indicating the cause of the failure.
* @return The data of the file.
*/
-BlendFileData* BLO_read_from_file (char *file, struct ReportList *reports);
+BlendFileData* BLO_read_from_file(const char *file, struct ReportList *reports);
/**
* Open a blender file from memory. The function
@@ -200,7 +200,7 @@ int BLO_has_bfile_extension(char *str);
int BLO_is_a_library(const char *path, char *dir, char *group);
struct Main* BLO_library_append_begin(const struct bContext *C, BlendHandle** bh, char *dir);
-void BLO_library_append_named_part(const struct bContext *C, struct Main *mainl, BlendHandle** bh, char *name, int idcode, short flag);
+void BLO_library_append_named_part(const struct bContext *C, struct Main *mainl, BlendHandle** bh, const char *name, int idcode, short flag);
void BLO_library_append_end(const struct bContext *C, struct Main *mainl, BlendHandle** bh, int idcode, short flag);
/* deprecated */
diff --git a/source/blender/blenloader/BLO_writefile.h b/source/blender/blenloader/BLO_writefile.h
index 182c582cc0f..5758eca6076 100644
--- a/source/blender/blenloader/BLO_writefile.h
+++ b/source/blender/blenloader/BLO_writefile.h
@@ -36,8 +36,7 @@ struct Main;
struct ReportList;
extern int BLO_write_file(struct Main *mainvar, char *dir, int write_flags, struct ReportList *reports, int *thumb);
-extern int BLO_write_file_mem(struct Main *mainvar, struct MemFile *compare, struct MemFile *current,
- int write_flags, struct ReportList *reports);
+extern int BLO_write_file_mem(struct Main *mainvar, struct MemFile *compare, struct MemFile *current, int write_flags);
extern int BLO_write_runtime(struct Main *mainvar, char *file, char *exename, struct ReportList *reports);
#define BLEN_THUMB_SIZE 128
diff --git a/source/blender/blenloader/CMakeLists.txt b/source/blender/blenloader/CMakeLists.txt
index cc70d3355f2..4d8ac9bc4b6 100644
--- a/source/blender/blenloader/CMakeLists.txt
+++ b/source/blender/blenloader/CMakeLists.txt
@@ -24,19 +24,34 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-SET(INC
+set(INC
.
../blenlib
../blenkernel
../makesdna
../readblenfile
- ../include
../makesrna
../render/extern/include
../../../intern/guardedalloc
- ${ZLIB_INC}
+ ${ZLIB_INCLUDE_DIRS}
)
-BLENDERLIB(bf_blenloader "${SRC}" "${INC}")
+set(SRC
+ intern/readblenentry.c
+ intern/readfile.c
+ intern/undofile.c
+ intern/writefile.c
+
+ BLO_readfile.h
+ BLO_soundfile.h
+ BLO_sys_types.h
+ BLO_undofile.h
+ BLO_writefile.h
+ intern/readfile.h
+)
+
+if(WITH_BUILDINFO)
+ add_definitions(-DNAN_BUILDINFO)
+endif()
+
+blender_add_lib(bf_blenloader "${SRC}" "${INC}")
diff --git a/source/blender/blenloader/Makefile b/source/blender/blenloader/Makefile
deleted file mode 100644
index 069bad4d371..00000000000
--- a/source/blender/blenloader/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/blenloader
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/blenloader/SConscript b/source/blender/blenloader/SConscript
index 88d345290e5..695d17f0638 100644
--- a/source/blender/blenloader/SConscript
+++ b/source/blender/blenloader/SConscript
@@ -11,4 +11,7 @@ incs += ' ' + env['BF_ZLIB_INC']
defs = []
-env.BlenderLib ( 'bf_blenloader', sources, Split(incs), defs, libtype=['core','player'], priority = [167,30] )
+if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
+ env.BlenderLib ( 'bf_blenloader', sources, Split(incs), defs, libtype=['core','player'], priority = [167,30]) #, cc_compileflags=['/WX'] )
+else:
+ env.BlenderLib ( 'bf_blenloader', sources, Split(incs), defs, libtype=['core','player','player2'], priority = [167,30,5] )
diff --git a/source/blender/blenloader/intern/Makefile b/source/blender/blenloader/intern/Makefile
deleted file mode 100644
index fe178ea2610..00000000000
--- a/source/blender/blenloader/intern/Makefile
+++ /dev/null
@@ -1,69 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blenloader
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-# CFLAGS += $(LEVEL_2_C_WARNINGS)
-
-# OpenGL and Python
-CPPFLAGS += $(OGL_CPPFLAGS)
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-# zlib
-ifeq ($(OS),$(findstring $(OS), "solaris windows"))
- CPPFLAGS += -I$(NAN_ZLIB)/include
-endif
-
-# streaming write function
-CPPFLAGS += -I../../writestreamglue
-CPPFLAGS += -I../../readstreamglue
-
-# initiate a streaming read pipe
-CPPFLAGS += -I../../readblenfile
-
-# This mod uses the GEN, DNA, BLI and BKE modules
-CPPFLAGS += -I../../../kernel/gen_messaging
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../blenlib
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../render/extern/include/
-CPPFLAGS += -I../../python
-
-# we still refer to /include a bit...
-CPPFLAGS += -I../../editors/include
-
-# path to our own external headerfiles
-CPPFLAGS += -I..
diff --git a/source/blender/blenloader/intern/readblenentry.c b/source/blender/blenloader/intern/readblenentry.c
index b637d538b91..bc7f674d6ba 100644
--- a/source/blender/blenloader/intern/readblenentry.c
+++ b/source/blender/blenloader/intern/readblenentry.c
@@ -38,6 +38,7 @@
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_linklist.h"
@@ -49,6 +50,7 @@
#include "BKE_library.h" // for free_main
#include "BKE_idcode.h"
#include "BKE_report.h"
+#include "BKE_utildefines.h"
#include "BLO_readfile.h"
#include "BLO_undofile.h"
@@ -169,11 +171,11 @@ LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype)
memcpy(new_prv, prv, sizeof(PreviewImage));
if (prv->rect[0]) {
unsigned int *rect = NULL;
- int rectlen = 0;
+ // int rectlen = 0;
new_prv->rect[0] = MEM_callocN(new_prv->w[0]*new_prv->h[0]*sizeof(unsigned int), "prvrect");
bhead= blo_nextbhead(fd, bhead);
rect = (unsigned int*)(bhead+1);
- rectlen = new_prv->w[0]*new_prv->h[0]*sizeof(unsigned int);
+ // rectlen = new_prv->w[0]*new_prv->h[0]*sizeof(unsigned int);
memcpy(new_prv->rect[0], rect, bhead->len);
} else {
new_prv->rect[0] = NULL;
@@ -181,11 +183,11 @@ LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype)
if (prv->rect[1]) {
unsigned int *rect = NULL;
- int rectlen = 0;
+ // int rectlen = 0;
new_prv->rect[1] = MEM_callocN(new_prv->w[1]*new_prv->h[1]*sizeof(unsigned int), "prvrect");
bhead= blo_nextbhead(fd, bhead);
rect = (unsigned int*)(bhead+1);
- rectlen = new_prv->w[1]*new_prv->h[1]*sizeof(unsigned int);
+ // rectlen = new_prv->w[1]*new_prv->h[1]*sizeof(unsigned int);
memcpy(new_prv->rect[1], rect, bhead->len);
} else {
new_prv->rect[1] = NULL;
@@ -242,7 +244,7 @@ void BLO_blendhandle_close(BlendHandle *bh) {
/**********/
-BlendFileData *BLO_read_from_file(char *file, ReportList *reports)
+BlendFileData *BLO_read_from_file(const char *file, ReportList *reports)
{
BlendFileData *bfd = NULL;
FileData *fd;
@@ -284,7 +286,7 @@ BlendFileData *BLO_read_from_memfile(Main *oldmain, const char *filename, MemFil
strcpy(fd->relabase, filename);
/* clear ob->proxy_from pointers in old main */
- blo_clear_proxy_pointers_from_lib(fd, oldmain);
+ blo_clear_proxy_pointers_from_lib(oldmain);
/* separate libraries from old main */
blo_split_main(&mainlist, oldmain);
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 4385caa19df..3b62b5a5e47 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -39,7 +39,6 @@
#ifndef WIN32
#include <unistd.h> // for read close
- #include <sys/param.h> // for MAXPATHLEN
#else
#include <io.h> // for open close read
#include "winsock2.h"
@@ -89,6 +88,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_anim.h"
#include "BKE_action.h"
@@ -107,6 +107,7 @@
#include "BKE_lattice.h"
#include "BKE_library.h" // for which_libbase
#include "BKE_idcode.h"
+#include "BKE_material.h"
#include "BKE_main.h" // for Main
#include "BKE_mesh.h" // for ME_ defines (patching)
#include "BKE_modifier.h"
@@ -227,7 +228,7 @@ typedef struct OldNewMap {
/* local prototypes */
-static void *read_struct(FileData *fd, BHead *bh, char *blockname);
+static void *read_struct(FileData *fd, BHead *bh, const char *blockname);
static OldNewMap *oldnewmap_new(void)
@@ -381,10 +382,10 @@ static void add_main_to_main(Main *mainvar, Main *from)
ListBase *lbarray[MAX_LIBARRAY], *fromarray[MAX_LIBARRAY];
int a;
- a= set_listbasepointers(mainvar, lbarray);
+ set_listbasepointers(mainvar, lbarray);
a= set_listbasepointers(from, fromarray);
while(a--) {
- addlisttolist(lbarray[a], fromarray[a]);
+ BLI_movelisttolist(lbarray[a], fromarray[a]);
}
}
@@ -588,20 +589,16 @@ static void bh8_from_bh4(BHead *bhead, BHead4 *bhead4)
static BHeadN *get_bhead(FileData *fd)
{
- BHead8 bhead8;
- BHead4 bhead4;
- BHead bhead;
BHeadN *new_bhead = 0;
int readsize;
if (fd) {
if ( ! fd->eof) {
-
- /* not strictly needed but shuts valgrind up
+ /* initializing to zero isn't strictly needed but shuts valgrind up
* since uninitialized memory gets compared */
- memset(&bhead8, 0, sizeof(BHead8));
- memset(&bhead4, 0, sizeof(BHead4));
- memset(&bhead, 0, sizeof(BHead));
+ BHead8 bhead8= {0};
+ BHead4 bhead4= {0};
+ BHead bhead= {0};
// First read the bhead structure.
// Depending on the platform the file was written on this can
@@ -704,7 +701,7 @@ BHead *blo_firstbhead(FileData *fd)
return(bhead);
}
-BHead *blo_prevbhead(FileData *fd, BHead *thisblock)
+BHead *blo_prevbhead(FileData *UNUSED(fd), BHead *thisblock)
{
BHeadN *bheadn= (BHeadN *) (((char *) thisblock) - GET_INT_FROM_POINTER( &((BHeadN*)0)->bhead) );
BHeadN *prev= bheadn->prev;
@@ -831,8 +828,8 @@ static int fd_read_gzip_from_file(FileData *filedata, void *buffer, unsigned int
static int fd_read_from_memory(FileData *filedata, void *buffer, unsigned int size)
{
- // don't read more bytes then there are available in the buffer
- int readsize = MIN2(size, filedata->buffersize - filedata->seek);
+ // don't read more bytes then there are available in the buffer
+ int readsize = (int)MIN2(size, (unsigned int)(filedata->buffersize - filedata->seek));
memcpy(buffer, filedata->buffer + filedata->seek, readsize);
filedata->seek += readsize;
@@ -925,13 +922,13 @@ static FileData *blo_decode_and_check(FileData *fd, ReportList *reports)
if (fd->flags & FD_FLAGS_FILE_OK) {
if (!read_file_dna(fd)) {
- BKE_report(reports, RPT_ERROR, "File incomplete");
+ BKE_reportf(reports, RPT_ERROR, "Failed to read blend file: \"%s\", incomplete", fd->relabase);
blo_freefiledata(fd);
fd= NULL;
}
}
else {
- BKE_report(reports, RPT_ERROR, "File is not a Blender file");
+ BKE_reportf(reports, RPT_ERROR, "Failed to read blend file: \"%s\", not a blend file", fd->relabase);
blo_freefiledata(fd);
fd= NULL;
}
@@ -941,7 +938,7 @@ static FileData *blo_decode_and_check(FileData *fd, ReportList *reports)
/* cannot be called with relative paths anymore! */
/* on each new library added, it now checks for the current FileData and expands relativeness */
-FileData *blo_openblenderfile(char *name, ReportList *reports)
+FileData *blo_openblenderfile(const char *name, ReportList *reports)
{
gzFile gzfile;
errno= 0;
@@ -1042,7 +1039,7 @@ void blo_freefiledata(FileData *fd)
int BLO_has_bfile_extension(char *str)
{
- return (BLI_testextensie(str, ".ble") || BLI_testextensie(str, ".blend")||BLI_testextensie(str, ".blend.gz"));
+ return (BLI_testextensie(str, ".ble") || BLI_testextensie(str, ".blend") || BLI_testextensie(str, ".blend.gz"));
}
int BLO_is_a_library(const char *path, char *dir, char *group)
@@ -1155,7 +1152,7 @@ static void change_idid_adr(ListBase *mainlist, FileData *basefd, void *old, voi
* to clear that pointer before reading the undo memfile since
* the object might be removed, it is set again in reading
* if the local object still exists */
-void blo_clear_proxy_pointers_from_lib(FileData *fd, Main *oldmain)
+void blo_clear_proxy_pointers_from_lib(Main *oldmain)
{
Object *ob= oldmain->object.first;
@@ -1268,7 +1265,7 @@ static void switch_endian_structs(struct SDNA *filesdna, BHead *bhead)
}
}
-static void *read_struct(FileData *fd, BHead *bh, char *blockname)
+static void *read_struct(FileData *fd, BHead *bh, const char *blockname)
{
void *temp= NULL;
@@ -1384,8 +1381,8 @@ static void test_pointer_array(FileData *fd, void **mat)
/* ************ READ ID Properties *************** */
-void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, FileData *fd);
-void IDP_LibLinkProperty(IDProperty *prop, int switch_endian, FileData *fd);
+static void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, FileData *fd);
+static void IDP_LibLinkProperty(IDProperty *prop, int switch_endian, FileData *fd);
static void IDP_DirectLinkIDPArray(IDProperty *prop, int switch_endian, FileData *fd)
{
@@ -1442,7 +1439,7 @@ static void IDP_DirectLinkArray(IDProperty *prop, int switch_endian, FileData *f
}
}
-static void IDP_DirectLinkString(IDProperty *prop, int switch_endian, FileData *fd)
+static void IDP_DirectLinkString(IDProperty *prop, FileData *fd)
{
/*since we didn't save the extra string buffer, set totallen to len.*/
prop->totallen = prop->len;
@@ -1469,7 +1466,7 @@ void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, FileData *fd)
IDP_DirectLinkGroup(prop, switch_endian, fd);
break;
case IDP_STRING:
- IDP_DirectLinkString(prop, switch_endian, fd);
+ IDP_DirectLinkString(prop, fd);
break;
case IDP_ARRAY:
IDP_DirectLinkArray(prop, switch_endian, fd);
@@ -1499,7 +1496,7 @@ void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, FileData *fd)
}
/*stub function*/
-void IDP_LibLinkProperty(IDProperty *prop, int switch_endian, FileData *fd)
+void IDP_LibLinkProperty(IDProperty *UNUSED(prop), int UNUSED(switch_endian), FileData *UNUSED(fd))
{
}
@@ -1552,7 +1549,7 @@ static void direct_link_brush(FileData *fd, Brush *brush)
brush->icon_imbuf= NULL;
}
-static void direct_link_script(FileData *fd, Script *script)
+static void direct_link_script(FileData *UNUSED(fd), Script *script)
{
script->id.us = 1;
SCRIPT_SET_NULL(script)
@@ -1980,9 +1977,13 @@ static void direct_link_animdata(FileData *fd, AnimData *adt)
link_list(fd, &adt->nla_tracks);
direct_link_nladata(fd, &adt->nla_tracks);
- /* clear temp pointers that may have been set... */
- // TODO: it's probably only a small cost to reload this anyway...
- adt->actstrip= NULL;
+ /* relink active strip - even though strictly speaking this should only be used
+ * if we're in 'tweaking mode', we need to be able to have this loaded back for
+ * undo, but also since users may not exit tweakmode before saving (#24535)
+ */
+ // TODO: it's not really nice that anyone should be able to save the file in this
+ // state, but it's going to be too hard to enforce this single case...
+ adt->actstrip= newdataadr(fd, adt->actstrip);
}
/* ************ READ MOTION PATHS *************** */
@@ -2030,7 +2031,7 @@ static void lib_link_nodetree(FileData *fd, Main *main)
/* verify types for nodes and groups, all data has to be read */
/* open = 0: appending/linking, open = 1: open new file (need to clean out dynamic
* typedefs*/
-static void lib_verify_nodetree(Main *main, int open)
+static void lib_verify_nodetree(Main *main, int UNUSED(open))
{
Scene *sce;
Material *ma;
@@ -2103,8 +2104,11 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
else if(ELEM3(node->type, CMP_NODE_IMAGE, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))
((ImageUser *)node->storage)->ok= 1;
}
- else if( ntree->type==NTREE_TEXTURE && (node->type==TEX_NODE_CURVE_RGB || node->type==TEX_NODE_CURVE_TIME) ) {
- direct_link_curvemapping(fd, node->storage);
+ else if( ntree->type==NTREE_TEXTURE) {
+ if(node->type==TEX_NODE_CURVE_RGB || node->type==TEX_NODE_CURVE_TIME)
+ direct_link_curvemapping(fd, node->storage);
+ else if(node->type==TEX_NODE_IMAGE)
+ ((ImageUser *)node->storage)->ok= 1;
}
}
link_list(fd, &node->inputs);
@@ -2139,7 +2143,7 @@ typedef struct tConstraintLinkData {
ID *id;
} tConstraintLinkData;
/* callback function used to relink constraint ID-links */
-static void lib_link_constraint_cb(bConstraint *con, ID **idpoin, void *userdata)
+static void lib_link_constraint_cb(bConstraint *UNUSED(con), ID **idpoin, void *userdata)
{
tConstraintLinkData *cld= (tConstraintLinkData *)userdata;
*idpoin = newlibadr(cld->fd, cld->id->lib, *idpoin);
@@ -2200,6 +2204,12 @@ static void direct_link_constraints(FileData *fd, ListBase *lb)
con->lin_error = 0.f;
con->rot_error = 0.f;
}
+ case CONSTRAINT_TYPE_CHILDOF:
+ {
+ /* XXX version patch, in older code this flag wasn't always set, and is inherent to type */
+ if(con->ownspace == CONSTRAINT_SPACE_POSE)
+ con->flag |= CONSTRAINT_SPACEONCE;
+ }
break;
}
}
@@ -2214,13 +2224,21 @@ static void lib_link_pose(FileData *fd, Object *ob, bPose *pose)
if (!pose || !arm)
return;
+
/* always rebuild to match proxy or lib changes */
rebuild= ob->proxy || (ob->id.lib==NULL && arm->id.lib);
- if (ob->proxy && pose->proxy_act_bone[0]) {
- Bone *bone = get_named_bone(arm, pose->proxy_act_bone);
- if (bone)
- arm->act_bone = bone;
+ if(ob->proxy) {
+ /* sync proxy layer */
+ if(pose->proxy_layer)
+ arm->layer = pose->proxy_layer;
+
+ /* sync proxy active bone */
+ if(pose->proxy_act_bone[0]) {
+ Bone *bone = get_named_bone(arm, pose->proxy_act_bone);
+ if (bone)
+ arm->act_bone = bone;
+ }
}
for (pchan = pose->chanbase.first; pchan; pchan=pchan->next) {
@@ -2229,7 +2247,7 @@ static void lib_link_pose(FileData *fd, Object *ob, bPose *pose)
/* hurms... loop in a loop, but yah... later... (ton) */
pchan->bone= get_named_bone(arm, pchan->name);
- pchan->custom= newlibadr(fd, arm->id.lib, pchan->custom);
+ pchan->custom= newlibadr_us(fd, arm->id.lib, pchan->custom);
if(pchan->bone==NULL)
rebuild= 1;
else if(ob->id.lib==NULL && arm->id.lib) {
@@ -2240,7 +2258,7 @@ static void lib_link_pose(FileData *fd, Object *ob, bPose *pose)
}
if(rebuild) {
- ob->recalc= OB_RECALC_ALL;
+ ob->recalc= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
pose->flag |= POSE_RECALC;
}
}
@@ -2442,7 +2460,7 @@ static void direct_link_key(FileData *fd, Key *key)
while(kb) {
kb->data= newdataadr(fd, kb->data);
-
+
if(fd->flags & FD_FLAGS_SWITCH_ENDIAN)
switch_endian_keyblock(key, kb);
@@ -2534,7 +2552,7 @@ static void direct_link_world(FileData *fd, World *wrld)
/* ************ READ VFONT ***************** */
-static void lib_link_vfont(FileData *fd, Main *main)
+static void lib_link_vfont(FileData *UNUSED(fd), Main *main)
{
VFont *vf;
@@ -2555,7 +2573,7 @@ static void direct_link_vfont(FileData *fd, VFont *vf)
/* ************ READ TEXT ****************** */
-static void lib_link_text(FileData *fd, Main *main)
+static void lib_link_text(FileData *UNUSED(fd), Main *main)
{
Text *text;
@@ -2735,7 +2753,7 @@ static void direct_link_curve(FileData *fd, Curve *cu)
cu->strinfo= newdataadr(fd, cu->strinfo);
cu->tb= newdataadr(fd, cu->tb);
- if(cu->vfont==0) link_list(fd, &(cu->nurb));
+ if(cu->vfont == NULL) link_list(fd, &(cu->nurb));
else {
cu->nurb.first=cu->nurb.last= 0;
@@ -2766,7 +2784,7 @@ static void direct_link_curve(FileData *fd, Curve *cu)
nu->bp= newdataadr(fd, nu->bp);
nu->knotsu= newdataadr(fd, nu->knotsu);
nu->knotsv= newdataadr(fd, nu->knotsv);
- if (cu->vfont==0) nu->charidx= nu->mat_nr;
+ if (cu->vfont == NULL) nu->charidx= nu->mat_nr;
if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
switch_endian_knots(nu);
@@ -2909,11 +2927,22 @@ static void direct_link_material(FileData *fd, Material *ma)
}
/* ************ READ PARTICLE SETTINGS ***************** */
-
+/* update this also to writefile.c */
+static const char *ptcache_data_struct[] = {
+ "", // BPHYS_DATA_INDEX
+ "", // BPHYS_DATA_LOCATION
+ "", // BPHYS_DATA_VELOCITY
+ "", // BPHYS_DATA_ROTATION
+ "", // BPHYS_DATA_AVELOCITY / BPHYS_DATA_XCONST */
+ "", // BPHYS_DATA_SIZE:
+ "", // BPHYS_DATA_TIMES:
+ "BoidData" // case BPHYS_DATA_BOIDS:
+};
static void direct_link_pointcache(FileData *fd, PointCache *cache)
{
if((cache->flag & PTCACHE_DISK_CACHE)==0) {
PTCacheMem *pm;
+ PTCacheExtra *extra;
int i;
link_list(fd, &cache->mem_cache);
@@ -2921,13 +2950,23 @@ static void direct_link_pointcache(FileData *fd, PointCache *cache)
pm = cache->mem_cache.first;
for(; pm; pm=pm->next) {
- if(pm->index_array)
- pm->index_array = newdataadr(fd, pm->index_array);
-
for(i=0; i<BPHYS_TOT_DATA; i++) {
- if(pm->data[i] && pm->data_types & (1<<i))
- pm->data[i] = newdataadr(fd, pm->data[i]);
+ pm->data[i] = newdataadr(fd, pm->data[i]);
+
+ /* the cache saves non-struct data without DNA */
+ if(pm->data[i] && strcmp(ptcache_data_struct[i], "")==0 && (fd->flags & FD_FLAGS_SWITCH_ENDIAN)) {
+ int j, tot= (BKE_ptcache_data_size (i) * pm->totpoint)/4; /* data_size returns bytes */
+ int *poin= pm->data[i];
+
+ for(j= 0; j<tot; j++)
+ SWITCH_INT(poin[j]);
+ }
}
+
+ link_list(fd, &pm->extradata);
+
+ for(extra=pm->extradata.first; extra; extra=extra->next)
+ extra->data = newdataadr(fd, extra->data);
}
}
else
@@ -2937,16 +2976,21 @@ static void direct_link_pointcache(FileData *fd, PointCache *cache)
cache->simframe= 0;
cache->edit= NULL;
cache->free_edit= NULL;
+ cache->cached_frames= NULL;
}
-static void direct_link_pointcache_list(FileData *fd, ListBase *ptcaches, PointCache **ocache)
+static void direct_link_pointcache_list(FileData *fd, ListBase *ptcaches, PointCache **ocache, int force_disk)
{
- PointCache *cache;
-
if(ptcaches->first) {
+ PointCache *cache= NULL;
link_list(fd, ptcaches);
- for(cache=ptcaches->first; cache; cache=cache->next)
+ for(cache=ptcaches->first; cache; cache=cache->next) {
direct_link_pointcache(fd, cache);
+ if(force_disk) {
+ cache->flag |= PTCACHE_DISK_CACHE;
+ cache->step = 1;
+ }
+ }
*ocache = newdataadr(fd, *ocache);
}
@@ -2954,6 +2998,10 @@ static void direct_link_pointcache_list(FileData *fd, ListBase *ptcaches, PointC
/* old "single" caches need to be linked too */
*ocache = newdataadr(fd, *ocache);
direct_link_pointcache(fd, *ocache);
+ if(force_disk) {
+ (*ocache)->flag |= PTCACHE_DISK_CACHE;
+ (*ocache)->step = 1;
+ }
ptcaches->first = ptcaches->last = *ocache;
}
@@ -3121,11 +3169,12 @@ static void direct_link_particlesystems(FileData *fd, ListBase *particles)
for(a=1,pa++; a<psys->totpart; a++, pa++)
pa->boid = (pa-1)->boid + 1;
}
- else {
+ else if(psys->particles) {
for(a=0,pa=psys->particles; a<psys->totpart; a++, pa++)
pa->boid = NULL;
}
+ psys->fluid_springs = newdataadr(fd, psys->fluid_springs);
psys->child = newdataadr(fd,psys->child);
psys->effectors = NULL;
@@ -3140,8 +3189,9 @@ static void direct_link_particlesystems(FileData *fd, ListBase *particles)
psys->childcachebufs.first = psys->childcachebufs.last = NULL;
psys->frand = NULL;
psys->pdd = NULL;
+ psys->renderdata = NULL;
- direct_link_pointcache_list(fd, &psys->ptcaches, &psys->pointcache);
+ direct_link_pointcache_list(fd, &psys->ptcaches, &psys->pointcache, 0);
if(psys->clmd) {
psys->clmd = newdataadr(fd, psys->clmd);
@@ -3250,10 +3300,21 @@ static void direct_link_mdisps(FileData *fd, int count, MDisps *mdisps, int exte
for(i = 0; i < count; ++i) {
mdisps[i].disps = newdataadr(fd, mdisps[i].disps);
+
+ if( (fd->flags & FD_FLAGS_SWITCH_ENDIAN) && (mdisps[i].disps) ) {
+ /* DNA_struct_switch_endian doesn't do endian swap for (*disps)[] */
+ /* this does swap for data written at write_mdisps() - readfile.c */
+ int x;
+ float *tmpdisps= *mdisps[i].disps;
+ for(x=0;x<mdisps[i].totdisp*3;x++) {
+ SWITCH_INT(*tmpdisps);
+ tmpdisps++;
+ }
+ }
if(!external && !mdisps[i].disps)
mdisps[i].totdisp = 0;
}
- }
+ }
}
static void direct_link_customdata(FileData *fd, CustomData *data, int count)
@@ -3376,6 +3437,7 @@ static void lib_link_latt(FileData *fd, Main *main)
lt= main->latt.first;
while(lt) {
if(lt->id.flag & LIB_NEEDLINK) {
+ if(lt->adt) lib_link_animdata(fd, &lt->id, lt->adt);
lt->ipo= newlibadr_us(fd, lt->id.lib, lt->ipo); // XXX depreceated - old animation system
lt->key= newlibadr_us(fd, lt->id.lib, lt->key);
@@ -3394,6 +3456,9 @@ static void direct_link_latt(FileData *fd, Lattice *lt)
direct_link_dverts(fd, lt->pntsu*lt->pntsv*lt->pntsw, lt->dvert);
lt->editlatt= NULL;
+
+ lt->adt = newdataadr(fd, lt->adt);
+ direct_link_animdata(fd, lt->adt);
}
@@ -3456,14 +3521,14 @@ static void lib_link_object(FileData *fd, Main *main)
/* this triggers object_update to always use a copy */
ob->proxy->proxy_from= ob;
/* force proxy updates after load/undo, a bit weak */
- ob->recalc= ob->proxy->recalc= OB_RECALC_ALL;
+ ob->recalc= ob->proxy->recalc= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
}
ob->proxy_group= newlibadr(fd, ob->id.lib, ob->proxy_group);
poin= ob->data;
ob->data= newlibadr_us(fd, ob->id.lib, ob->data);
-
+
if(ob->data==NULL && poin!=NULL) {
if(ob->id.lib)
printf("Can't find obdata of %s lib %s\n", ob->id.name+2, ob->id.lib->name);
@@ -3481,6 +3546,17 @@ static void lib_link_object(FileData *fd, Main *main)
}
for(a=0; a<ob->totcol; a++) ob->mat[a]= newlibadr_us(fd, ob->id.lib, ob->mat[a]);
+ /* When the object is local and the data is library its possible
+ * the material list size gets out of sync. [#22663] */
+ if(ob->data && ob->id.lib != ((ID *)ob->data)->lib) {
+ short *totcol_data= give_totcolp(ob);
+ /* Only expand so as not to loose any object materials that might be set. */
+ if(totcol_data && *totcol_data > ob->totcol) {
+ /* printf("'%s' %d -> %d\n", ob->id.name, ob->totcol, *totcol_data); */
+ resize_object_material(ob, *totcol_data);
+ }
+ }
+
ob->gpd= newlibadr_us(fd, ob->id.lib, ob->gpd);
ob->duplilist= NULL;
@@ -3637,6 +3713,8 @@ static void lib_link_object(FileData *fd, Main *main)
smd->domain->fluid_group = newlibadr_us(fd, ob->id.lib, smd->domain->fluid_group);
smd->domain->effector_weights->group = newlibadr(fd, ob->id.lib, smd->domain->effector_weights->group);
+
+ smd->domain->flags |= MOD_SMOKE_FILE_LOAD; /* flag for refreshing the simulation after loading */
}
}
@@ -3698,6 +3776,9 @@ static void direct_link_pose(FileData *fd, bPose *pose)
pchan->iktree.first= pchan->iktree.last= NULL;
pchan->path= NULL;
+
+ /* incase this value changes in future, clamp else we get undefined behavior */
+ CLAMP(pchan->rotmode, ROT_MODE_MIN, ROT_MODE_MAX);
}
pose->ikdata = NULL;
if (pose->ikparam != NULL) {
@@ -3737,19 +3818,20 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
clmd->sim_parms= newdataadr(fd, clmd->sim_parms);
clmd->coll_parms= newdataadr(fd, clmd->coll_parms);
- direct_link_pointcache_list(fd, &clmd->ptcaches, &clmd->point_cache);
+ direct_link_pointcache_list(fd, &clmd->ptcaches, &clmd->point_cache, 0);
if(clmd->sim_parms) {
if(clmd->sim_parms->presets > 10)
clmd->sim_parms->presets = 0;
clmd->sim_parms->reset = 0;
- }
- clmd->sim_parms->effector_weights = newdataadr(fd, clmd->sim_parms->effector_weights);
- if(!clmd->sim_parms->effector_weights)
- clmd->sim_parms->effector_weights = BKE_add_effector_weights(NULL);
-
+ clmd->sim_parms->effector_weights = newdataadr(fd, clmd->sim_parms->effector_weights);
+
+ if(!clmd->sim_parms->effector_weights) {
+ clmd->sim_parms->effector_weights = BKE_add_effector_weights(NULL);
+ }
+ }
}
else if (md->type==eModifierType_Fluidsim) {
FluidsimModifierData *fluidmd = (FluidsimModifierData*) md;
@@ -3779,8 +3861,15 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
if(!smd->domain->effector_weights)
smd->domain->effector_weights = BKE_add_effector_weights(NULL);
- direct_link_pointcache_list(fd, &(smd->domain->ptcaches[0]), &(smd->domain->point_cache[0]));
- direct_link_pointcache_list(fd, &(smd->domain->ptcaches[1]), &(smd->domain->point_cache[1]));
+ direct_link_pointcache_list(fd, &(smd->domain->ptcaches[0]), &(smd->domain->point_cache[0]), 1);
+
+ /* Smoke uses only one cache from now on, so store pointer convert */
+ if(smd->domain->ptcaches[1].first || smd->domain->point_cache[1]) {
+ printf("High resolution smoke cache not available due to pointcache update. Please reset the simulation.\n");
+ smd->domain->ptcaches[1].first = NULL;
+ smd->domain->ptcaches[1].last = NULL;
+ smd->domain->point_cache[1] = NULL;
+ }
}
else if(smd->type==MOD_SMOKE_TYPE_FLOW)
{
@@ -3853,9 +3942,10 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
} else if (md->type==eModifierType_ParticleSystem) {
ParticleSystemModifierData *psmd = (ParticleSystemModifierData*) md;
- psmd->dm=0;
- psmd->psys=newdataadr(fd, psmd->psys);
+ psmd->dm= NULL;
+ psmd->psys= newdataadr(fd, psmd->psys);
psmd->flag &= ~eParticleSystemFlag_psys_updated;
+ psmd->flag |= eParticleSystemFlag_file_loaded;
} else if (md->type==eModifierType_Explode) {
ExplodeModifierData *psmd = (ExplodeModifierData*) md;
@@ -4014,7 +4104,7 @@ static void direct_link_object(FileData *fd, Object *ob)
if(!sb->effector_weights)
sb->effector_weights = BKE_add_effector_weights(NULL);
- direct_link_pointcache_list(fd, &sb->ptcaches, &sb->pointcache);
+ direct_link_pointcache_list(fd, &sb->ptcaches, &sb->pointcache, 0);
}
ob->bsoft= newdataadr(fd, ob->bsoft);
ob->fluidsimSettings= newdataadr(fd, ob->fluidsimSettings); /* NT */
@@ -4104,8 +4194,13 @@ static void direct_link_object(FileData *fd, Object *ob)
ob->gpulamp.first= ob->gpulamp.last= NULL;
link_list(fd, &ob->pc_ids);
- if(ob->sculpt)
+ /* incase this value changes in future, clamp else we get undefined behavior */
+ CLAMP(ob->rotmode, ROT_MODE_MIN, ROT_MODE_MAX);
+
+ if(ob->sculpt) {
ob->sculpt= MEM_callocN(sizeof(SculptSession), "reload sculpt session");
+ ob->sculpt->ob= ob;
+ }
}
/* ************ READ SCENE ***************** */
@@ -4149,7 +4244,6 @@ static void lib_link_scene(FileData *fd, Main *main)
sce->camera= newlibadr(fd, sce->id.lib, sce->camera);
sce->world= newlibadr_us(fd, sce->id.lib, sce->world);
sce->set= newlibadr(fd, sce->id.lib, sce->set);
- sce->ima= newlibadr_us(fd, sce->id.lib, sce->ima);
sce->gpd= newlibadr_us(fd, sce->id.lib, sce->gpd);
link_paint(fd, sce, &sce->toolsettings->sculpt->paint);
@@ -4239,9 +4333,8 @@ static void link_recurs_seq(FileData *fd, ListBase *lb)
static void direct_link_paint(FileData *fd, Paint **paint)
{
- Paint *p;
/* TODO. is this needed */
- p= (*paint)= newdataadr(fd, (*paint));
+ (*paint)= newdataadr(fd, (*paint));
}
static void direct_link_scene(FileData *fd, Scene *sce)
@@ -4463,6 +4556,7 @@ static void direct_link_windowmanager(FileData *fd, wmWindowManager *wm)
wm->drags.first= wm->drags.last= NULL;
wm->windrawable= NULL;
+ wm->winactive= NULL;
wm->initialized= 0;
wm->op_undo_depth= 0;
}
@@ -4648,6 +4742,7 @@ static void lib_link_screen(FileData *fd, Main *main)
SpaceText *st= (SpaceText *)sl;
st->text= newlibadr(fd, sc->id.lib, st->text);
+ st->drawcache= NULL;
}
else if(sl->spacetype==SPACE_SCRIPT) {
@@ -4826,10 +4921,6 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
else if(sl->spacetype==SPACE_FILE) {
SpaceFile *sfile= (SpaceFile *)sl;
- sfile->files= NULL;
- sfile->folders_prev= NULL;
- sfile->folders_next= NULL;
- sfile->params= NULL;
sfile->op= NULL;
}
else if(sl->spacetype==SPACE_IMASEL) {
@@ -5192,7 +5283,11 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
for(cl= sconsole->history.first; cl; cl= cl_next) {
cl_next= cl->next;
cl->line= newdataadr(fd, cl->line);
- if (cl->line == NULL) {
+ if (cl->line) {
+ /* the allocted length is not written, so reset here */
+ cl->len_alloc= cl->len + 1;
+ }
+ else {
BLI_remlink(&sconsole->history, cl);
MEM_freeN(cl);
}
@@ -5232,14 +5327,14 @@ static void direct_link_library(FileData *fd, Library *lib, Main *main)
if(newmain->curlib) {
if(strcmp(newmain->curlib->filepath, lib->filepath)==0) {
printf("Fixed error in file; multiple instances of lib:\n %s\n", lib->filepath);
-
+ BKE_reportf(fd->reports, RPT_WARNING, "Library '%s', '%s' had multiple instances, save and reload!", lib->name, lib->filepath);
+
change_idid_adr(&fd->mainlist, fd, lib, newmain->curlib);
// change_idid_adr_fd(fd, lib, newmain->curlib);
BLI_remlink(&main->library, lib);
MEM_freeN(lib);
-
- BKE_report(fd->reports, RPT_WARNING, "Library had multiple instances, save and reload!");
+
return;
}
@@ -5260,7 +5355,7 @@ static void direct_link_library(FileData *fd, Library *lib, Main *main)
lib->parent= NULL;
}
-static void lib_link_library(FileData *fd, Main *main)
+static void lib_link_library(FileData *UNUSED(fd), Main *main)
{
Library *lib;
for(lib= main->library.first; lib; lib= lib->id.next) {
@@ -5356,7 +5451,7 @@ static void lib_link_group(FileData *fd, Main *main)
/* ************** GENERAL & MAIN ******************** */
-static char *dataname(short id_code)
+static const char *dataname(short id_code)
{
switch( id_code ) {
@@ -5391,7 +5486,7 @@ static char *dataname(short id_code)
}
-static BHead *read_data_into_oldnewmap(FileData *fd, BHead *bhead, char *allocname)
+static BHead *read_data_into_oldnewmap(FileData *fd, BHead *bhead, const char *allocname)
{
bhead = blo_nextbhead(fd, bhead);
@@ -5427,7 +5522,7 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, int flag, ID
ID *id;
ListBase *lb;
- char *allocname;
+ const char *allocname;
/* read libblock */
id = read_struct(fd, bhead, "lib block");
@@ -5454,6 +5549,7 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, int flag, ID
if(id->flag & LIB_FAKEUSER) id->us= 1;
else id->us= 0;
id->icon_id = 0;
+ id->flag &= ~LIB_ID_RECALC;
/* this case cannot be direct_linked: it's just the ID part */
if(bhead->code==ID_ID) {
@@ -5578,12 +5674,14 @@ static BHead *read_global(BlendFileData *bfd, FileData *fd, BHead *bhead)
bfd->main->subversionfile= fg->subversion;
bfd->main->minversionfile= fg->minversion;
bfd->main->minsubversionfile= fg->minsubversion;
+ bfd->main->revision= fg->revision;
bfd->winpos= fg->winpos;
bfd->fileflags= fg->fileflags;
bfd->displaymode= fg->displaymode;
bfd->globalf= fg->globalf;
BLI_strncpy(bfd->filename, fg->filename, sizeof(bfd->filename));
+
if(G.fileflags & G_FILE_RECOVER)
BLI_strncpy(fd->relabase, fg->filename, sizeof(fd->relabase));
@@ -5652,6 +5750,23 @@ static int map_223_keybd_code_to_224_keybd_code(int code)
}
}
+static void do_version_bone_head_tail_237(Bone *bone)
+{
+ Bone *child;
+ float vec[3];
+
+ /* head */
+ copy_v3_v3(bone->arm_head, bone->arm_mat[3]);
+
+ /* tail is in current local coord system */
+ copy_v3_v3(vec, bone->arm_mat[1]);
+ mul_v3_fl(vec, bone->length);
+ add_v3_v3v3(bone->arm_tail, bone->arm_head, vec);
+
+ for(child= bone->childbase.first; child; child= child->next)
+ do_version_bone_head_tail_237(child);
+}
+
static void bone_version_238(ListBase *lb)
{
Bone *bone;
@@ -6091,7 +6206,7 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
case SPACE_NODE:
ar= MEM_callocN(sizeof(ARegion), "nodetree area for node");
BLI_addtail(lb, ar);
- ar->regiontype= RGN_TYPE_CHANNELS;
+ ar->regiontype= RGN_TYPE_UI;
ar->alignment= RGN_ALIGN_LEFT;
ar->v2d.scroll = (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM);
ar->v2d.flag = V2D_VIEWSYNC_AREA_VERTICAL;
@@ -6244,6 +6359,8 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
}
case SPACE_ACTION:
{
+ SpaceAction *saction= (SpaceAction *)sl;
+
/* we totally reinit the view for the Action Editor, as some old instances had some weird cruft set */
ar->v2d.tot.xmin= -20.0f;
ar->v2d.tot.ymin= (float)(-sa->winy)/3.0f;
@@ -6253,10 +6370,10 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
ar->v2d.cur= ar->v2d.tot;
ar->v2d.min[0]= 0.0f;
- ar->v2d.min[1]= 0.0f;
+ ar->v2d.min[1]= 0.0f;
ar->v2d.max[0]= MAXFRAMEF;
- ar->v2d.max[1]= FLT_MAX;
+ ar->v2d.max[1]= FLT_MAX;
ar->v2d.minzoom= 0.01f;
ar->v2d.maxzoom= 50;
@@ -6265,6 +6382,13 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
ar->v2d.keepzoom= V2D_LOCKZOOM_Y;
ar->v2d.align= V2D_ALIGN_NO_POS_Y;
ar->v2d.flag = V2D_VIEWSYNC_AREA_VERTICAL;
+
+ /* for old files with ShapeKey editors open + an action set, clear the action as
+ * it doesn't make sense in the new system (i.e. violates concept that ShapeKey edit
+ * only shows ShapeKey-rooted actions only)
+ */
+ if (saction->mode == SACTCONT_SHAPEKEY)
+ saction->action = NULL;
break;
}
case SPACE_SEQ:
@@ -6340,6 +6464,9 @@ static void do_versions_windowmanager_2_50(bScreen *screen)
sl->spacetype= SPACE_INFO; /* spacedata then matches */
}
+ /* it seems to be possible in 2.5 to have this saved, filewindow probably */
+ sa->butspacetype= sa->spacetype;
+
/* pushed back spaces also need regions! */
if(sa->spacedata.first) {
sl= sa->spacedata.first;
@@ -6352,7 +6479,7 @@ static void do_versions_windowmanager_2_50(bScreen *screen)
}
}
-static void versions_gpencil_add_main(ListBase *lb, ID *id, char *name)
+static void versions_gpencil_add_main(ListBase *lb, ID *id, const char *name)
{
BLI_addtail(lb, id);
@@ -6472,7 +6599,7 @@ static void do_version_mtex_factor_2_50(MTex **mtex_array, short idtype)
}
}
-static void do_version_mdef_250(FileData *fd, Library *lib, Main *main)
+static void do_version_mdef_250(Main *main)
{
Object *ob;
ModifierData *md;
@@ -6503,23 +6630,23 @@ static void do_version_constraints_radians_degrees_250(ListBase *lb)
for (con=lb->first; con; con=con->next) {
if(con->type==CONSTRAINT_TYPE_RIGIDBODYJOINT) {
bRigidBodyJointConstraint *data = con->data;
- data->axX *= M_PI/180.0;
- data->axY *= M_PI/180.0;
- data->axZ *= M_PI/180.0;
+ data->axX *= (float)(M_PI/180.0);
+ data->axY *= (float)(M_PI/180.0);
+ data->axZ *= (float)(M_PI/180.0);
}
else if(con->type==CONSTRAINT_TYPE_KINEMATIC) {
bKinematicConstraint *data = con->data;
- data->poleangle *= M_PI/180.0;
+ data->poleangle *= (float)(M_PI/180.0);
}
else if(con->type==CONSTRAINT_TYPE_ROTLIMIT) {
bRotLimitConstraint *data = con->data;
- data->xmin *= M_PI/180.0;
- data->xmax *= M_PI/180.0;
- data->ymin *= M_PI/180.0;
- data->ymax *= M_PI/180.0;
- data->zmin *= M_PI/180.0;
- data->zmax *= M_PI/180.0;
+ data->xmin *= (float)(M_PI/180.0);
+ data->xmax *= (float)(M_PI/180.0);
+ data->ymin *= (float)(M_PI/180.0);
+ data->ymax *= (float)(M_PI/180.0);
+ data->zmin *= (float)(M_PI/180.0);
+ data->zmax *= (float)(M_PI/180.0);
}
}
}
@@ -6558,12 +6685,25 @@ static void do_versions_seq_unique_name_all_strips(
}
}
+
+static void do_version_bone_roll_256(Bone *bone)
+{
+ Bone *child;
+ float submat[3][3];
+
+ copy_m3_m4(submat, bone->arm_mat);
+ mat3_to_vec_roll(submat, 0, &bone->arm_roll);
+
+ for(child = bone->childbase.first; child; child = child->next)
+ do_version_bone_roll_256(child);
+}
+
static void do_versions(FileData *fd, Library *lib, Main *main)
{
/* WATCH IT!!!: pointers from libdata have not been converted */
if(G.f & G_DEBUG)
- printf("read file %s\n Version %d sub %d\n", fd->relabase, main->versionfile, main->subversionfile);
+ printf("read file %s\n Version %d sub %d svn r%d\n", fd->relabase, main->versionfile, main->subversionfile, main->revision);
if(main->versionfile == 100) {
/* tex->extend and tex->imageflag have changed: */
@@ -7256,8 +7396,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
Object *ob;
for (vf= main->vfont.first; vf; vf= vf->id.next) {
- if (BLI_streq(vf->name+strlen(vf->name)-6, ".Bfont")) {
- strcpy(vf->name, "<builtin>");
+ if (strcmp(vf->name+strlen(vf->name)-6, ".Bfont")==0) {
+ strcpy(vf->name, FO_BUILTIN_NAME);
}
}
@@ -7867,10 +8007,14 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
bArmature *arm;
bConstraint *con;
Object *ob;
+ Bone *bone;
// armature recode checks
for(arm= main->armature.first; arm; arm= arm->id.next) {
where_is_armature(arm);
+
+ for(bone= arm->bonebase.first; bone; bone= bone->next)
+ do_version_bone_head_tail_237(bone);
}
for(ob= main->object.first; ob; ob= ob->id.next) {
if(ob->parent) {
@@ -7883,7 +8027,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if(ob->type==OB_ARMATURE) {
if(ob->pose)
ob->pose->flag |= POSE_RECALC;
- ob->recalc |= OB_RECALC_ALL; // cannot call stuff now (pointers!), done in setup_app_data
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME; // cannot call stuff now (pointers!), done in setup_app_data
/* new generic xray option */
arm= newlibadr(fd, lib, ob->data);
@@ -8154,7 +8298,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if(arm->layer==0) arm->layer= 1;
}
for(sce= main->scene.first; sce; sce= sce->id.next) {
- if(sce->jumpframe==0) sce->jumpframe= 10;
if(sce->audio.mixrate==0) sce->audio.mixrate= 44100;
if(sce->r.xparts<2) sce->r.xparts= 4;
@@ -8187,7 +8330,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
if(sce->r.mode & R_PANORAMA) {
- /* all these checks to ensure saved files with cvs version keep working... */
+ /* all these checks to ensure saved files with svn version keep working... */
if(sce->r.xsch < sce->r.ysch) {
Object *obc= newlibadr(fd, lib, sce->camera);
if(obc && obc->type==OB_CAMERA) {
@@ -8775,9 +8918,13 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
ob->soft->pointcache= BKE_ptcache_add(&ob->soft->ptcaches);
for(psys=ob->particlesystem.first; psys; psys=psys->next) {
- //if(psys->soft && !psys->soft->pointcache)
- // psys->soft->pointcache= BKE_ptcache_add(&psys->soft->ptcaches);
- if(!psys->pointcache)
+ if(psys->pointcache) {
+ if(psys->pointcache->flag & PTCACHE_BAKED && (psys->pointcache->flag & PTCACHE_DISK_CACHE)==0) {
+ printf("Old memory cache isn't supported for particles, so re-bake the simulation!\n");
+ psys->pointcache->flag &= ~PTCACHE_BAKED;
+ }
+ }
+ else
psys->pointcache= BKE_ptcache_add(&psys->ptcaches);
}
@@ -9435,7 +9582,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
for(act= ob->actuators.first; act; act= act->next) {
if (act->type == ACT_MESSAGE) {
bMessageActuator *msgAct = (bMessageActuator *) act->data;
- if (strlen(msgAct->toPropName) > 2) {
+ if (BLI_strnlen(msgAct->toPropName, 3) > 2) {
/* strip first 2 chars, would have only worked if these were OB anyway */
memmove( msgAct->toPropName, msgAct->toPropName+2, sizeof(msgAct->toPropName)-2 );
} else {
@@ -9544,7 +9691,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
/* Adjustments needed after Bullets update */
for(ob = main->object.first; ob; ob= ob->id.next) {
ob->damping *= 0.635f;
- ob->rdamping = 0.1 + (0.8f * ob->rdamping);
+ ob->rdamping = 0.1f + (0.8f * ob->rdamping);
}
}
@@ -9624,8 +9771,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
seq->strip->proxy->size
= sce->r.size;
} else {
- seq->strip->proxy->size
- = 25.0;
+ seq->strip->proxy->size = 25;
}
seq->strip->proxy->quality =90;
}
@@ -9706,7 +9852,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
{
char str[FILE_MAX];
BLI_join_dirfile(str, seq->strip->dir, seq->strip->stripdata->name);
- BLI_path_abs(str, G.sce);
+ BLI_path_abs(str, G.main->name);
seq->sound = sound_new_file(main, str);
}
/* don't know, if anybody used that
@@ -9892,12 +10038,15 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
for(a=0; a<MAX_MTEX; a++) {
if(ma->mtex[a]) {
tex= ma->mtex[a]->tex;
- if(!tex)
- ma->mtex[a]->texflag |= MTEX_NEW_BUMP;
- else {
+ if(!tex) {
+ ma->mtex[a]->texflag |= MTEX_3TAP_BUMP;
+ ma->mtex[a]->texflag |= MTEX_BUMP_OBJECTSPACE;
+ } else {
tex= (Tex*)newlibadr(fd, ma->id.lib, tex);
- if(tex && tex->type == 0) /* invalid type */
- ma->mtex[a]->texflag |= MTEX_NEW_BUMP;
+ if(tex && tex->type == 0) { /* invalid type */
+ ma->mtex[a]->texflag |= MTEX_3TAP_BUMP;
+ ma->mtex[a]->texflag |= MTEX_BUMP_OBJECTSPACE;
+ }
}
}
}
@@ -10075,14 +10224,14 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
for(sce= main->scene.first; sce; sce= sce->id.next)
{
- if(sce->audio.main == 0.0)
- sce->audio.main = 1.0;
+ if(sce->audio.main == 0.0f)
+ sce->audio.main = 1.0f;
sce->r.ffcodecdata.audio_mixrate = sce->audio.mixrate;
sce->r.ffcodecdata.audio_volume = sce->audio.main;
- sce->audio.distance_model = 2.0;
- sce->audio.doppler_factor = 1.0;
- sce->audio.speed_of_sound = 343.3;
+ sce->audio.distance_model = 2;
+ sce->audio.doppler_factor = 1.0f;
+ sce->audio.speed_of_sound = 343.3f;
}
/* Add default gravity to scenes */
@@ -10108,11 +10257,11 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
for(md= ob->modifiers.first; md; md= md->next) {
ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
if(clmd)
- clmd->sim_parms->effector_weights->global_gravity = clmd->sim_parms->gravity[2]/-9.81;
+ clmd->sim_parms->effector_weights->global_gravity = clmd->sim_parms->gravity[2]/-9.81f;
}
if(ob->soft)
- ob->soft->effector_weights->global_gravity = ob->soft->grav/9.81;
+ ob->soft->effector_weights->global_gravity = ob->soft->grav/9.81f;
}
/* Normal wind shape is plane */
@@ -10124,6 +10273,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
ob->pd->shape = PFIELD_SHAPE_PLANE;
else if(ob->pd->flag & PFIELD_SURFACE)
ob->pd->shape = PFIELD_SHAPE_SURFACE;
+
+ ob->pd->flag |= PFIELD_DO_LOCATION;
}
}
}
@@ -10335,31 +10486,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
}
- /* clear hanging 'temp' screens from older 2.5 files*/
- if (main->versionfile == 250) {
- bScreen *screen, *nextscreen;
- wmWindowManager *wm;
- wmWindow *win, *nextwin;
-
- for(screen= main->screen.first; screen; screen= nextscreen) {
- nextscreen= screen->id.next;
-
- if (screen->full == SCREENTEMP) {
- /* remove corresponding windows */
- for(wm= main->wm.first; wm; wm=wm->id.next) {
- for(win= wm->windows.first; win; win=nextwin) {
- nextwin= win->next;
-
- if(newlibadr(fd, wm->id.lib, win->screen) == screen)
- BLI_freelinkN(&wm->windows, win);
- }
- }
-
- /* remove screen itself */
- free_libblock(&main->screen, screen);
- }
- }
- }
}
if (main->versionfile < 250 || (main->versionfile == 250 && main->subversionfile < 9))
@@ -10497,7 +10623,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
/* game engine changes */
for(sce = main->scene.first; sce; sce = sce->id.next) {
- sce->gm.eyeseparation = 0.10;
+ sce->gm.eyeseparation = 0.10f;
}
/* anim viz changes */
@@ -10602,12 +10728,12 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if (ob->pose) {
for (pchan=ob->pose->chanbase.first; pchan; pchan=pchan->next) {
- pchan->limitmin[0] *= M_PI/180.0;
- pchan->limitmin[1] *= M_PI/180.0;
- pchan->limitmin[2] *= M_PI/180.0;
- pchan->limitmax[0] *= M_PI/180.0;
- pchan->limitmax[1] *= M_PI/180.0;
- pchan->limitmax[2] *= M_PI/180.0;
+ pchan->limitmin[0] *= (float)(M_PI/180.0);
+ pchan->limitmin[1] *= (float)(M_PI/180.0);
+ pchan->limitmin[2] *= (float)(M_PI/180.0);
+ pchan->limitmax[0] *= (float)(M_PI/180.0);
+ pchan->limitmax[1] *= (float)(M_PI/180.0);
+ pchan->limitmax[2] *= (float)(M_PI/180.0);
do_version_constraints_radians_degrees_250(&pchan->constraints);
}
@@ -10706,7 +10832,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
int a;
for(a=0; a<PE_TOT_BRUSH; a++)
- pset->brush[a].strength /= 100.0;
+ pset->brush[a].strength /= 100.0f;
}
for(ma = main->mat.first; ma; ma=ma->id.next)
@@ -10898,7 +11024,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
- do_version_mdef_250(fd, lib, main);
+ do_version_mdef_250(main);
/* parent type to modifier */
for(ob = main->object.first; ob; ob = ob->id.next) {
@@ -10953,44 +11079,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
tex->saturation= 1.0f;
}
- //set defaults for obstacle avoidance, recast data
- {
- Scene *sce;
- for(sce = main->scene.first; sce; sce = sce->id.next)
- {
-
- if (sce->gm.levelHeight == 0.f)
- sce->gm.levelHeight = 2.f;
-
- if(sce->gm.recastData.cellsize == 0.0f)
- sce->gm.recastData.cellsize = 0.3f;
- if(sce->gm.recastData.cellheight == 0.0f)
- sce->gm.recastData.cellheight = 0.2f;
- if(sce->gm.recastData.agentmaxslope == 0.0f)
- sce->gm.recastData.agentmaxslope = M_PI/4;
- if(sce->gm.recastData.agentmaxclimb == 0.0f)
- sce->gm.recastData.agentmaxclimb = 0.9f;
- if(sce->gm.recastData.agentheight == 0.0f)
- sce->gm.recastData.agentheight = 2.0f;
- if(sce->gm.recastData.agentradius == 0.0f)
- sce->gm.recastData.agentradius = 0.6f;
- if(sce->gm.recastData.edgemaxlen == 0.0f)
- sce->gm.recastData.edgemaxlen = 12.0f;
- if(sce->gm.recastData.edgemaxerror == 0.0f)
- sce->gm.recastData.edgemaxerror = 1.3f;
- if(sce->gm.recastData.regionminsize == 0.0f)
- sce->gm.recastData.regionminsize = 50.f;
- if(sce->gm.recastData.regionmergesize == 0.0f)
- sce->gm.recastData.regionmergesize = 20.f;
- if(sce->gm.recastData.vertsperpoly<3)
- sce->gm.recastData.vertsperpoly = 6;
- if(sce->gm.recastData.detailsampledist == 0.0f)
- sce->gm.recastData.detailsampledist = 6.0f;
- if(sce->gm.recastData.detailsamplemaxerror == 0.0f)
- sce->gm.recastData.detailsamplemaxerror = 1.0f;
- }
- }
-
{
Curve *cu;
for(cu= main->curve.first; cu; cu= cu->id.next) {
@@ -11025,7 +11113,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
// bad radius
if (brush->unprojected_radius == 0)
- brush->unprojected_radius = 0.125;
+ brush->unprojected_radius = 0.125f;
// unusable size
if (brush->size == 0)
@@ -11067,22 +11155,23 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
brush->add_col[1] == 0 &&
brush->add_col[2] == 0)
{
- brush->add_col[0] = 1.00;
- brush->add_col[1] = 0.39;
- brush->add_col[2] = 0.39;
+ brush->add_col[0] = 1.00f;
+ brush->add_col[1] = 0.39f;
+ brush->add_col[2] = 0.39f;
}
if (brush->sub_col[0] == 0 &&
brush->sub_col[1] == 0 &&
brush->sub_col[2] == 0)
{
- brush->sub_col[0] = 0.39;
- brush->sub_col[1] = 0.39;
- brush->sub_col[2] = 1.00;
+ brush->sub_col[0] = 0.39f;
+ brush->sub_col[1] = 0.39f;
+ brush->sub_col[2] = 1.00f;
}
}
}
}
+
/* GSOC Sculpt 2010 - Sanity check on Sculpt/Paint settings */
if (main->versionfile < 253) {
Scene *sce;
@@ -11148,20 +11237,63 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
- /* put compatibility code here until next subversion bump */
- {
+ if (main->versionfile < 255 || (main->versionfile == 255 && main->subversionfile < 1)) {
Brush *br;
+ ParticleSettings *part;
+ bScreen *sc;
+ Object *ob;
+
for(br= main->brush.first; br; br= br->id.next) {
if(br->ob_mode==0)
- br->ob_mode= (OB_MODE_SCULPT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT|OB_MODE_VERTEX_PAINT);
+ br->ob_mode= OB_MODE_ALL_PAINT;
}
-
- }
- {
- ParticleSettings *part;
+
for(part = main->particle.first; part; part = part->id.next) {
if(part->boids)
part->boids->pitch = 1.0f;
+
+ part->flag &= ~PART_HAIR_REGROW; /* this was a deprecated flag before */
+ part->kink_amp_clump = 1.f; /* keep old files looking similar */
+ }
+
+ for (sc= main->screen.first; sc; sc= sc->id.next) {
+ ScrArea *sa;
+ for (sa= sc->areabase.first; sa; sa= sa->next) {
+ SpaceLink *sl;
+ for (sl= sa->spacedata.first; sl; sl= sl->next) {
+ if (sl->spacetype == SPACE_INFO) {
+ SpaceInfo *sinfo= (SpaceInfo *)sl;
+ ARegion *ar;
+
+ sinfo->rpt_mask= INFO_RPT_OP;
+
+ for (ar= sa->regionbase.first; ar; ar= ar->next) {
+ if (ar->regiontype == RGN_TYPE_WINDOW) {
+ ar->v2d.scroll = (V2D_SCROLL_RIGHT);
+ ar->v2d.align = V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_NEG_Y; /* align bottom left */
+ ar->v2d.keepofs = V2D_LOCKOFS_X;
+ ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
+ ar->v2d.keeptot= V2D_KEEPTOT_BOUNDS;
+ ar->v2d.minzoom= ar->v2d.maxzoom= 1.0f;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /* fix rotation actuators for objects so they use real angles (radians)
+ * since before blender went opensource this strange scalar was used: (1 / 0.02) * 2 * math.pi/360 */
+ for(ob= main->object.first; ob; ob= ob->id.next) {
+ bActuator *act= ob->actuators.first;
+ while(act) {
+ if (act->type==ACT_OBJECT) {
+ /* multiply velocity with 50 in old files */
+ bObjectActuator *oa= act->data;
+ mul_v3_fl(oa->drot, 0.8726646259971648f);
+ }
+ act= act->next;
+ }
}
}
@@ -11181,6 +11313,115 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
}
+
+ if (main->versionfile < 256) {
+ bScreen *sc;
+ ScrArea *sa;
+ Key *key;
+
+ /* Fix for sample line scope initializing with no height */
+ for(sc= main->screen.first; sc; sc= sc->id.next) {
+ sa= sc->areabase.first;
+ while(sa) {
+ SpaceLink *sl;
+ for (sl= sa->spacedata.first; sl; sl= sl->next) {
+ if(sl->spacetype==SPACE_IMAGE) {
+ SpaceImage *sima= (SpaceImage *)sl;
+ if (sima->sample_line_hist.height == 0 )
+ sima->sample_line_hist.height = 100;
+ }
+ }
+ sa= sa->next;
+ }
+ }
+
+ /* old files could have been saved with slidermin = slidermax = 0.0, but the UI in
+ * 2.4x would never reveal this to users as a dummy value always ended up getting used
+ * instead
+ */
+ for (key = main->key.first; key; key = key->id.next) {
+ KeyBlock *kb;
+
+ for (kb = key->block.first; kb; kb = kb->next) {
+ if (IS_EQ(kb->slidermin, kb->slidermax) && IS_EQ(kb->slidermax, 0))
+ kb->slidermax = kb->slidermin + 1.0f;
+ }
+ }
+ }
+
+ if (main->versionfile < 256 || (main->versionfile == 256 && main->subversionfile < 1)) {
+ /* fix for bones that didn't have arm_roll before */
+ bArmature* arm;
+ Bone* bone;
+ Object *ob;
+
+ for (arm = main->armature.first; arm; arm = arm->id.next)
+ for (bone = arm->bonebase.first; bone; bone = bone->next)
+ do_version_bone_roll_256(bone);
+
+ /* fix for objects which have zero dquat's
+ * since this is multiplied with the quat rather then added */
+ for(ob= main->object.first; ob; ob= ob->id.next) {
+ if(is_zero_v4(ob->dquat)) {
+ unit_qt(ob->dquat);
+ }
+ if(is_zero_v3(ob->drotAxis) && ob->drotAngle == 0.0f) {
+ unit_axis_angle(ob->drotAxis, &ob->drotAngle);
+ }
+ }
+ }
+
+ /* put compatibility code here until next subversion bump */
+
+ {
+ bScreen *sc;
+
+ /* redraws flag in SpaceTime has been moved to Screen level */
+ for (sc = main->screen.first; sc; sc= sc->id.next) {
+ if (sc->redraws_flag == 0) {
+ /* just initialise to default? */
+ // XXX: we could also have iterated through areas, and taken them from the first timeline available...
+ sc->redraws_flag = TIME_ALL_3D_WIN|TIME_ALL_ANIM_WIN;
+ }
+ }
+ }
+
+ //set defaults for obstacle avoidance, recast data
+ {
+ Scene *sce;
+ for(sce = main->scene.first; sce; sce = sce->id.next)
+ {
+ if (sce->gm.levelHeight == 0.f)
+ sce->gm.levelHeight = 2.f;
+
+ if(sce->gm.recastData.cellsize == 0.0f)
+ sce->gm.recastData.cellsize = 0.3f;
+ if(sce->gm.recastData.cellheight == 0.0f)
+ sce->gm.recastData.cellheight = 0.2f;
+ if(sce->gm.recastData.agentmaxslope == 0.0f)
+ sce->gm.recastData.agentmaxslope = M_PI/4;
+ if(sce->gm.recastData.agentmaxclimb == 0.0f)
+ sce->gm.recastData.agentmaxclimb = 0.9f;
+ if(sce->gm.recastData.agentheight == 0.0f)
+ sce->gm.recastData.agentheight = 2.0f;
+ if(sce->gm.recastData.agentradius == 0.0f)
+ sce->gm.recastData.agentradius = 0.6f;
+ if(sce->gm.recastData.edgemaxlen == 0.0f)
+ sce->gm.recastData.edgemaxlen = 12.0f;
+ if(sce->gm.recastData.edgemaxerror == 0.0f)
+ sce->gm.recastData.edgemaxerror = 1.3f;
+ if(sce->gm.recastData.regionminsize == 0.0f)
+ sce->gm.recastData.regionminsize = 50.f;
+ if(sce->gm.recastData.regionmergesize == 0.0f)
+ sce->gm.recastData.regionmergesize = 20.f;
+ if(sce->gm.recastData.vertsperpoly<3)
+ sce->gm.recastData.vertsperpoly = 6;
+ if(sce->gm.recastData.detailsampledist == 0.0f)
+ sce->gm.recastData.detailsampledist = 6.0f;
+ if(sce->gm.recastData.detailsamplemaxerror == 0.0f)
+ sce->gm.recastData.detailsamplemaxerror = 1.0f;
+ }
+ }
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
/* WATCH IT 2!: Userdef struct init has to be in editors/interface/resources.c! */
@@ -11344,7 +11585,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filename)
lib_link_all(fd, bfd->main);
//do_versions_after_linking(fd, NULL, bfd->main); // XXX: not here (or even in this function at all)! this causes crashes on many files - Aligorith (July 04, 2010)
- lib_verify_nodetree(bfd->main, 1);
+ lib_verify_nodetree(bfd->main, TRUE);
fix_relpaths_library(fd->relabase, bfd->main); /* make all relative paths, relative to the open blend file */
link_global(fd, bfd); /* as last */
@@ -11476,7 +11717,11 @@ static void expand_doit(FileData *fd, Main *mainvar, void *old)
* lib_indirect.blend but lib.blend does too, linking in a Scene or Group from lib.blend can result in an
* empty without the dupli group referenced. Once you save and reload the group would appier. - Campbell */
/* This crashes files, must look further into it */
- /*oldnewmap_insert(fd->libmap, bhead->old, id, 1);*/
+
+ /* Update: the issue is that in file reading, the oldnewmap is OK, but for existing data, it has to be
+ inserted in the map to be found! */
+ if(id->flag & LIB_PRE_EXISTING)
+ oldnewmap_insert(fd->libmap, bhead->old, id, 1);
change_idid_adr_fd(fd, bhead->old, id);
// commented because this can print way too much
@@ -11732,6 +11977,9 @@ static void expand_lattice(FileData *fd, Main *mainvar, Lattice *lt)
{
expand_doit(fd, mainvar, lt->ipo); // XXX depreceated - old animation system
expand_doit(fd, mainvar, lt->key);
+
+ if (lt->adt)
+ expand_animdata(fd, mainvar, lt->adt);
}
@@ -11829,7 +12077,7 @@ typedef struct tConstraintExpandData {
Main *mainvar;
} tConstraintExpandData;
/* callback function used to expand constraint ID-links */
-static void expand_constraint_cb(bConstraint *con, ID **idpoin, void *userdata)
+static void expand_constraint_cb(bConstraint *UNUSED(con), ID **idpoin, void *userdata)
{
tConstraintExpandData *ced= (tConstraintExpandData *)userdata;
expand_doit(ced->fd, ced->mainvar, *idpoin);
@@ -12312,7 +12560,7 @@ static void give_base_to_groups(Main *mainvar, Scene *scene)
base= scene_add_base(scene, ob);
base->flag |= SELECT;
base->object->flag= base->flag;
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
scene->basact= base;
/* assign the group */
@@ -12324,7 +12572,7 @@ static void give_base_to_groups(Main *mainvar, Scene *scene)
}
}
-static void append_named_part(const bContext *C, Main *mainl, FileData *fd, char *name, int idcode, short flag)
+static void append_named_part(const bContext *C, Main *mainl, FileData *fd, const char *name, int idcode, short flag)
{
Scene *scene= CTX_data_scene(C);
Object *ob;
@@ -12390,7 +12638,7 @@ static void append_named_part(const bContext *C, Main *mainl, FileData *fd, char
}
}
-void BLO_library_append_named_part(const bContext *C, Main *mainl, BlendHandle** bh, char *name, int idcode, short flag)
+void BLO_library_append_named_part(const bContext *C, Main *mainl, BlendHandle** bh, const char *name, int idcode, short flag)
{
FileData *fd= (FileData*)(*bh);
append_named_part(C, mainl, fd, name, idcode, flag);
@@ -12427,7 +12675,7 @@ static Main* library_append_begin(const bContext *C, FileData **fd, char *dir)
blo_split_main(&(*fd)->mainlist, mainvar);
/* which one do we need? */
- mainl = blo_find_main(*fd, &(*fd)->mainlist, dir, G.sce);
+ mainl = blo_find_main(*fd, &(*fd)->mainlist, dir, G.main->name);
/* needed for do_version */
mainl->versionfile= (*fd)->fileversion;
@@ -12492,31 +12740,35 @@ static void append_do_cursor(Scene *scene, Library *curlib, short flag)
static void library_append_end(const bContext *C, Main *mainl, FileData **fd, int idcode, short flag)
{
- Main *mainvar= CTX_data_main(C);
+ Main *mainvar;
Scene *scene= CTX_data_scene(C);
+ Library *curlib;
/* make main consistent */
expand_main(*fd, mainl);
/* do this when expand found other libs */
read_libraries(*fd, &(*fd)->mainlist);
+
+ curlib= mainl->curlib;
/* make the lib path relative if required */
if(flag & FILE_RELPATH) {
/* use the full path, this could have been read by other library even */
- BLI_strncpy(mainl->curlib->name, mainl->curlib->filepath, sizeof(mainl->curlib->name));
+ BLI_strncpy(curlib->name, curlib->filepath, sizeof(curlib->name));
/* uses current .blend file as reference */
- BLI_path_rel(mainl->curlib->name, G.sce);
+ BLI_path_rel(curlib->name, G.main->name);
}
blo_join_main(&(*fd)->mainlist);
mainvar= (*fd)->mainlist.first;
+ mainl= NULL; /* blo_join_main free's mainl, cant use anymore */
lib_link_all(*fd, mainvar);
- lib_verify_nodetree(mainvar, 0);
- fix_relpaths_library(G.sce, mainvar); /* make all relative paths, relative to the open blend file */
+ lib_verify_nodetree(mainvar, FALSE);
+ fix_relpaths_library(G.main->name, mainvar); /* make all relative paths, relative to the open blend file */
/* give a base to loose objects. If group append, do it for objects too */
if(scene) {
@@ -12527,7 +12779,7 @@ static void library_append_end(const bContext *C, Main *mainl, FileData **fd, in
if (flag & FILE_LINK) {
give_base_to_objects(mainvar, scene, NULL, 0);
} else {
- give_base_to_objects(mainvar, scene, mainl->curlib, 1);
+ give_base_to_objects(mainvar, scene, curlib, 1);
}
if (flag & FILE_GROUP_INSTANCE) {
@@ -12547,7 +12799,7 @@ static void library_append_end(const bContext *C, Main *mainl, FileData **fd, in
*fd = NULL;
}
- append_do_cursor(scene, mainl->curlib, flag);
+ append_do_cursor(scene, curlib, flag);
}
void BLO_library_append_end(const bContext *C, struct Main *mainl, BlendHandle** bh, int idcode, short flag)
@@ -12564,7 +12816,7 @@ void BLO_library_append_end(const bContext *C, struct Main *mainl, BlendHandle**
/* tentatively removed, Python should be able to use the split functions too: */
/* BLO_library_append_begin, BLO_library_append_end, BLO_library_append_named_part */
#if 0
-void BLO_script_library_append(BlendHandle **bh, char *dir, char *name,
+void BLO_script_library_append(BlendHandle **bh, char *dir, const char *name,
int idcode, short flag, Main *mainvar, Scene *scene, ReportList *reports)
{
FileData *fd= (FileData*)(*bh);
@@ -12591,7 +12843,7 @@ static int mainvar_count_libread_blocks(Main *mainvar)
a= set_listbasepointers(mainvar, lbarray);
while(a--) {
- ID *id= lbarray[a]->first;
+ ID *id;
for (id= lbarray[a]->first; id; id= id->next)
if (id->flag & LIB_READ)
@@ -12632,7 +12884,7 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
while(fd==NULL) {
char newlib_path[240] = { 0 };
printf("Missing library...'\n");
- printf(" current file: %s\n", G.sce);
+ printf(" current file: %s\n", G.main->name);
printf(" absolute lib: %s\n", mainptr->curlib->filepath);
printf(" relative lib: %s\n", mainptr->curlib->name);
printf(" enter a new path:\n");
@@ -12640,7 +12892,7 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
if(scanf("%s", newlib_path) > 0) {
strcpy(mainptr->curlib->name, newlib_path);
strcpy(mainptr->curlib->filepath, newlib_path);
- cleanup_path(G.sce, mainptr->curlib->filepath);
+ cleanup_path(G.main->name, mainptr->curlib->filepath);
fd= blo_openblenderfile(mainptr->curlib->filepath, basefd->reports);
diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h
index 8e391fa438e..c6526f2c7af 100644
--- a/source/blender/blenloader/intern/readfile.h
+++ b/source/blender/blenloader/intern/readfile.h
@@ -110,11 +110,11 @@ void blo_split_main(ListBase *mainlist, struct Main *main);
BlendFileData *blo_read_file_internal(FileData *fd, const char *filename);
-FileData *blo_openblenderfile(char *name, struct ReportList *reports);
+FileData *blo_openblenderfile(const char *name, struct ReportList *reports);
FileData *blo_openblendermemory(void *buffer, int buffersize, struct ReportList *reports);
FileData *blo_openblendermemfile(struct MemFile *memfile, struct ReportList *reports);
-void blo_clear_proxy_pointers_from_lib(FileData *fd, Main *oldmain);
+void blo_clear_proxy_pointers_from_lib(Main *oldmain);
void blo_make_image_pointer_map(FileData *fd, Main *oldmain);
void blo_end_image_pointer_map(FileData *fd, Main *oldmain);
void blo_add_library_pointer_map(ListBase *mainlist, FileData *fd);
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 3a63230018e..bf52866d8c8 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -129,6 +129,7 @@ Any case: direct data is ALWAYS after the lib block
#include "BLI_blenlib.h"
#include "BLI_linklist.h"
#include "BLI_bpath.h"
+#include "BLI_utildefines.h"
#include "BKE_action.h"
#include "BKE_blender.h"
@@ -140,9 +141,10 @@ Any case: direct data is ALWAYS after the lib block
#include "BKE_node.h"
#include "BKE_report.h"
#include "BKE_sequencer.h"
-#include "BKE_utildefines.h" // for defines
+#include "BKE_utildefines.h"
#include "BKE_modifier.h"
#include "BKE_fcurve.h"
+#include "BKE_pointcache.h"
#include "BLO_writefile.h"
#include "BLO_readfile.h"
@@ -310,7 +312,7 @@ static int endwrite(WriteData *wd)
/* ********** WRITE FILE ****************** */
-static void writestruct(WriteData *wd, int filecode, char *structname, int nr, void *adr)
+static void writestruct(WriteData *wd, int filecode, const char *structname, int nr, void *adr)
{
BHead bh;
short *sp;
@@ -362,7 +364,6 @@ static void writedata(WriteData *wd, int filecode, int len, void *adr) /* do not
/*These functions are used by blender's .blend system for file saving/loading.*/
void IDP_WriteProperty_OnlyData(IDProperty *prop, void *wd);
void IDP_WriteProperty(IDProperty *prop, void *wd);
-static void write_animdata(WriteData *wd, AnimData *adt); // XXX code needs reshuffling, but not before NLA SoC is merged back into 2.5
static void IDP_WriteArray(IDProperty *prop, void *wd)
{
@@ -434,6 +435,200 @@ void IDP_WriteProperty(IDProperty *prop, void *wd)
IDP_WriteProperty_OnlyData(prop, wd);
}
+static void write_fmodifiers(WriteData *wd, ListBase *fmodifiers)
+{
+ FModifier *fcm;
+
+ /* Modifiers */
+ for (fcm= fmodifiers->first; fcm; fcm= fcm->next) {
+ FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
+
+ /* Write the specific data */
+ if (fmi && fcm->data) {
+ /* firstly, just write the plain fmi->data struct */
+ writestruct(wd, DATA, fmi->structName, 1, fcm->data);
+
+ /* do any modifier specific stuff */
+ switch (fcm->type) {
+ case FMODIFIER_TYPE_GENERATOR:
+ {
+ FMod_Generator *data= (FMod_Generator *)fcm->data;
+
+ /* write coefficients array */
+ if (data->coefficients)
+ writedata(wd, DATA, sizeof(float)*(data->arraysize), data->coefficients);
+ }
+ break;
+ case FMODIFIER_TYPE_ENVELOPE:
+ {
+ FMod_Envelope *data= (FMod_Envelope *)fcm->data;
+
+ /* write envelope data */
+ if (data->data)
+ writedata(wd, DATA, sizeof(FCM_EnvelopeData)*(data->totvert), data->data);
+ }
+ break;
+ case FMODIFIER_TYPE_PYTHON:
+ {
+ FMod_Python *data = (FMod_Python *)fcm->data;
+
+ /* Write ID Properties -- and copy this comment EXACTLY for easy finding
+ of library blocks that implement this.*/
+ IDP_WriteProperty(data->prop, wd);
+ }
+ break;
+ }
+ }
+
+ /* Write the modifier */
+ writestruct(wd, DATA, "FModifier", 1, fcm);
+ }
+}
+
+static void write_fcurves(WriteData *wd, ListBase *fcurves)
+{
+ FCurve *fcu;
+
+ for (fcu=fcurves->first; fcu; fcu=fcu->next) {
+ /* F-Curve */
+ writestruct(wd, DATA, "FCurve", 1, fcu);
+
+ /* curve data */
+ if (fcu->bezt)
+ writestruct(wd, DATA, "BezTriple", fcu->totvert, fcu->bezt);
+ if (fcu->fpt)
+ writestruct(wd, DATA, "FPoint", fcu->totvert, fcu->fpt);
+
+ if (fcu->rna_path)
+ writedata(wd, DATA, strlen(fcu->rna_path)+1, fcu->rna_path);
+
+ /* driver data */
+ if (fcu->driver) {
+ ChannelDriver *driver= fcu->driver;
+ DriverVar *dvar;
+
+ writestruct(wd, DATA, "ChannelDriver", 1, driver);
+
+ /* variables */
+ for (dvar= driver->variables.first; dvar; dvar= dvar->next) {
+ writestruct(wd, DATA, "DriverVar", 1, dvar);
+
+ DRIVER_TARGETS_USED_LOOPER(dvar)
+ {
+ if (dtar->rna_path)
+ writedata(wd, DATA, strlen(dtar->rna_path)+1, dtar->rna_path);
+ }
+ DRIVER_TARGETS_LOOPER_END
+ }
+ }
+
+ /* write F-Modifiers */
+ write_fmodifiers(wd, &fcu->modifiers);
+ }
+}
+
+static void write_actions(WriteData *wd, ListBase *idbase)
+{
+ bAction *act;
+ bActionGroup *grp;
+ TimeMarker *marker;
+
+ for(act=idbase->first; act; act= act->id.next) {
+ if (act->id.us>0 || wd->current) {
+ writestruct(wd, ID_AC, "bAction", 1, act);
+ if (act->id.properties) IDP_WriteProperty(act->id.properties, wd);
+
+ write_fcurves(wd, &act->curves);
+
+ for (grp=act->groups.first; grp; grp=grp->next) {
+ writestruct(wd, DATA, "bActionGroup", 1, grp);
+ }
+
+ for (marker=act->markers.first; marker; marker=marker->next) {
+ writestruct(wd, DATA, "TimeMarker", 1, marker);
+ }
+ }
+ }
+
+ /* flush helps the compression for undo-save */
+ mywrite(wd, MYWRITE_FLUSH, 0);
+}
+
+static void write_keyingsets(WriteData *wd, ListBase *list)
+{
+ KeyingSet *ks;
+ KS_Path *ksp;
+
+ for (ks= list->first; ks; ks= ks->next) {
+ /* KeyingSet */
+ writestruct(wd, DATA, "KeyingSet", 1, ks);
+
+ /* Paths */
+ for (ksp= ks->paths.first; ksp; ksp= ksp->next) {
+ /* Path */
+ writestruct(wd, DATA, "KS_Path", 1, ksp);
+
+ if (ksp->rna_path)
+ writedata(wd, DATA, strlen(ksp->rna_path)+1, ksp->rna_path);
+ }
+ }
+}
+
+static void write_nlastrips(WriteData *wd, ListBase *strips)
+{
+ NlaStrip *strip;
+
+ for (strip= strips->first; strip; strip= strip->next) {
+ /* write the strip first */
+ writestruct(wd, DATA, "NlaStrip", 1, strip);
+
+ /* write the strip's F-Curves and modifiers */
+ write_fcurves(wd, &strip->fcurves);
+ write_fmodifiers(wd, &strip->modifiers);
+
+ /* write the strip's children */
+ write_nlastrips(wd, &strip->strips);
+ }
+}
+
+static void write_nladata(WriteData *wd, ListBase *nlabase)
+{
+ NlaTrack *nlt;
+
+ /* write all the tracks */
+ for (nlt= nlabase->first; nlt; nlt= nlt->next) {
+ /* write the track first */
+ writestruct(wd, DATA, "NlaTrack", 1, nlt);
+
+ /* write the track's strips */
+ write_nlastrips(wd, &nlt->strips);
+ }
+}
+
+static void write_animdata(WriteData *wd, AnimData *adt)
+{
+ AnimOverride *aor;
+
+ /* firstly, just write the AnimData block */
+ writestruct(wd, DATA, "AnimData", 1, adt);
+
+ /* write drivers */
+ write_fcurves(wd, &adt->drivers);
+
+ /* write overrides */
+ // FIXME: are these needed?
+ for (aor= adt->overrides.first; aor; aor= aor->next) {
+ /* overrides consist of base data + rna_path */
+ writestruct(wd, DATA, "AnimOverride", 1, aor);
+ writedata(wd, DATA, strlen(aor->rna_path)+1, aor->rna_path);
+ }
+
+ // TODO write the remaps (if they are needed)
+
+ /* write NLA data */
+ write_nladata(wd, &adt->nla_tracks);
+}
+
static void write_curvemapping(WriteData *wd, CurveMapping *cumap)
{
int a;
@@ -506,7 +701,7 @@ static void write_renderinfo(WriteData *wd, Main *mainvar) /* for renderdeamon
data[1]= sce->r.efra;
memset(data+2, 0, sizeof(int)*6);
- strncpy((char *)(data+2), sce->id.name+2, 21);
+ BLI_strncpy((char *)(data+2), sce->id.name+2, sizeof(sce->id.name)-2);
writedata(wd, REND, 32, data);
}
@@ -573,9 +768,22 @@ static void write_boid_state(WriteData *wd, BoidState *state)
//for(; cond; cond=cond->next)
// writestruct(wd, DATA, "BoidCondition", 1, cond);
}
-/* TODO: replace *cache with *cachelist once it's coded */
-#define PTCACHE_WRITE_PSYS 0
-#define PTCACHE_WRITE_CLOTH 1
+
+/* update this also to readfile.c */
+static const char *ptcache_data_struct[] = {
+ "", // BPHYS_DATA_INDEX
+ "", // BPHYS_DATA_LOCATION
+ "", // BPHYS_DATA_VELOCITY
+ "", // BPHYS_DATA_ROTATION
+ "", // BPHYS_DATA_AVELOCITY / BPHYS_DATA_XCONST */
+ "", // BPHYS_DATA_SIZE:
+ "", // BPHYS_DATA_TIMES:
+ "BoidData" // case BPHYS_DATA_BOIDS:
+};
+static const char *ptcache_extra_struct[] = {
+ "",
+ "ParticleSpring"
+};
static void write_pointcaches(WriteData *wd, ListBase *ptcaches)
{
PointCache *cache = ptcaches->first;
@@ -588,13 +796,24 @@ static void write_pointcaches(WriteData *wd, ListBase *ptcaches)
PTCacheMem *pm = cache->mem_cache.first;
for(; pm; pm=pm->next) {
+ PTCacheExtra *extra = pm->extradata.first;
+
writestruct(wd, DATA, "PTCacheMem", 1, pm);
- if(pm->index_array)
- writedata(wd, DATA, MEM_allocN_len(pm->index_array), pm->index_array);
for(i=0; i<BPHYS_TOT_DATA; i++) {
- if(pm->data[i] && pm->data_types & (1<<i))
- writedata(wd, DATA, MEM_allocN_len(pm->data[i]), pm->data[i]);
+ if(pm->data[i] && pm->data_types & (1<<i)) {
+ if(strcmp(ptcache_data_struct[i], "")==0)
+ writedata(wd, DATA, MEM_allocN_len(pm->data[i]), pm->data[i]);
+ else
+ writestruct(wd, DATA, ptcache_data_struct[i], pm->totpoint, pm->data[i]);
+ }
+ }
+
+ for(; extra; extra=extra->next) {
+ if(strcmp(ptcache_extra_struct[extra->type], "")==0)
+ continue;
+ writestruct(wd, DATA, "PTCacheExtra", 1, extra);
+ writestruct(wd, DATA, ptcache_extra_struct[extra->type], extra->totdata, extra->data);
}
}
}
@@ -656,6 +875,9 @@ static void write_particlesystems(WriteData *wd, ListBase *particles)
if(psys->particles->boid && psys->part->phystype == PART_PHYS_BOIDS)
writestruct(wd, DATA, "BoidParticle", psys->totpart, psys->particles->boid);
+
+ if(psys->part->fluid && psys->part->phystype == PART_PHYS_FLUID && (psys->part->fluid->flag & SPH_VISCOELASTIC_SPRINGS))
+ writestruct(wd, DATA, "ParticleSpring", psys->tot_fluidsprings, psys->fluid_springs);
}
pt = psys->targets.first;
for(; pt; pt=pt->next)
@@ -849,200 +1071,6 @@ static void write_actuators(WriteData *wd, ListBase *lb)
}
}
-static void write_fmodifiers(WriteData *wd, ListBase *fmodifiers)
-{
- FModifier *fcm;
-
- /* Modifiers */
- for (fcm= fmodifiers->first; fcm; fcm= fcm->next) {
- FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
-
- /* Write the specific data */
- if (fmi && fcm->data) {
- /* firstly, just write the plain fmi->data struct */
- writestruct(wd, DATA, fmi->structName, 1, fcm->data);
-
- /* do any modifier specific stuff */
- switch (fcm->type) {
- case FMODIFIER_TYPE_GENERATOR:
- {
- FMod_Generator *data= (FMod_Generator *)fcm->data;
-
- /* write coefficients array */
- if (data->coefficients)
- writedata(wd, DATA, sizeof(float)*(data->arraysize), data->coefficients);
- }
- break;
- case FMODIFIER_TYPE_ENVELOPE:
- {
- FMod_Envelope *data= (FMod_Envelope *)fcm->data;
-
- /* write envelope data */
- if (data->data)
- writedata(wd, DATA, sizeof(FCM_EnvelopeData)*(data->totvert), data->data);
- }
- break;
- case FMODIFIER_TYPE_PYTHON:
- {
- FMod_Python *data = (FMod_Python *)fcm->data;
-
- /* Write ID Properties -- and copy this comment EXACTLY for easy finding
- of library blocks that implement this.*/
- IDP_WriteProperty(data->prop, wd);
- }
- break;
- }
- }
-
- /* Write the modifier */
- writestruct(wd, DATA, "FModifier", 1, fcm);
- }
-}
-
-static void write_fcurves(WriteData *wd, ListBase *fcurves)
-{
- FCurve *fcu;
-
- for (fcu=fcurves->first; fcu; fcu=fcu->next) {
- /* F-Curve */
- writestruct(wd, DATA, "FCurve", 1, fcu);
-
- /* curve data */
- if (fcu->bezt)
- writestruct(wd, DATA, "BezTriple", fcu->totvert, fcu->bezt);
- if (fcu->fpt)
- writestruct(wd, DATA, "FPoint", fcu->totvert, fcu->fpt);
-
- if (fcu->rna_path)
- writedata(wd, DATA, strlen(fcu->rna_path)+1, fcu->rna_path);
-
- /* driver data */
- if (fcu->driver) {
- ChannelDriver *driver= fcu->driver;
- DriverVar *dvar;
-
- writestruct(wd, DATA, "ChannelDriver", 1, driver);
-
- /* variables */
- for (dvar= driver->variables.first; dvar; dvar= dvar->next) {
- writestruct(wd, DATA, "DriverVar", 1, dvar);
-
- DRIVER_TARGETS_USED_LOOPER(dvar)
- {
- if (dtar->rna_path)
- writedata(wd, DATA, strlen(dtar->rna_path)+1, dtar->rna_path);
- }
- DRIVER_TARGETS_LOOPER_END
- }
- }
-
- /* write F-Modifiers */
- write_fmodifiers(wd, &fcu->modifiers);
- }
-}
-
-static void write_actions(WriteData *wd, ListBase *idbase)
-{
- bAction *act;
- bActionGroup *grp;
- TimeMarker *marker;
-
- for(act=idbase->first; act; act= act->id.next) {
- if (act->id.us>0 || wd->current) {
- writestruct(wd, ID_AC, "bAction", 1, act);
- if (act->id.properties) IDP_WriteProperty(act->id.properties, wd);
-
- write_fcurves(wd, &act->curves);
-
- for (grp=act->groups.first; grp; grp=grp->next) {
- writestruct(wd, DATA, "bActionGroup", 1, grp);
- }
-
- for (marker=act->markers.first; marker; marker=marker->next) {
- writestruct(wd, DATA, "TimeMarker", 1, marker);
- }
- }
- }
-
- /* flush helps the compression for undo-save */
- mywrite(wd, MYWRITE_FLUSH, 0);
-}
-
-static void write_keyingsets(WriteData *wd, ListBase *list)
-{
- KeyingSet *ks;
- KS_Path *ksp;
-
- for (ks= list->first; ks; ks= ks->next) {
- /* KeyingSet */
- writestruct(wd, DATA, "KeyingSet", 1, ks);
-
- /* Paths */
- for (ksp= ks->paths.first; ksp; ksp= ksp->next) {
- /* Path */
- writestruct(wd, DATA, "KS_Path", 1, ksp);
-
- if (ksp->rna_path)
- writedata(wd, DATA, strlen(ksp->rna_path)+1, ksp->rna_path);
- }
- }
-}
-
-static void write_nlastrips(WriteData *wd, ListBase *strips)
-{
- NlaStrip *strip;
-
- for (strip= strips->first; strip; strip= strip->next) {
- /* write the strip first */
- writestruct(wd, DATA, "NlaStrip", 1, strip);
-
- /* write the strip's F-Curves and modifiers */
- write_fcurves(wd, &strip->fcurves);
- write_fmodifiers(wd, &strip->modifiers);
-
- /* write the strip's children */
- write_nlastrips(wd, &strip->strips);
- }
-}
-
-static void write_nladata(WriteData *wd, ListBase *nlabase)
-{
- NlaTrack *nlt;
-
- /* write all the tracks */
- for (nlt= nlabase->first; nlt; nlt= nlt->next) {
- /* write the track first */
- writestruct(wd, DATA, "NlaTrack", 1, nlt);
-
- /* write the track's strips */
- write_nlastrips(wd, &nlt->strips);
- }
-}
-
-static void write_animdata(WriteData *wd, AnimData *adt)
-{
- AnimOverride *aor;
-
- /* firstly, just write the AnimData block */
- writestruct(wd, DATA, "AnimData", 1, adt);
-
- /* write drivers */
- write_fcurves(wd, &adt->drivers);
-
- /* write overrides */
- // FIXME: are these needed?
- for (aor= adt->overrides.first; aor; aor= aor->next) {
- /* overrides consist of base data + rna_path */
- writestruct(wd, DATA, "AnimOverride", 1, aor);
- writedata(wd, DATA, strlen(aor->rna_path)+1, aor->rna_path);
- }
-
- // TODO write the remaps (if they are needed)
-
- /* write NLA data */
- write_nladata(wd, &adt->nla_tracks);
-}
-
static void write_motionpath(WriteData *wd, bMotionPath *mpath)
{
/* sanity checks */
@@ -1180,19 +1208,32 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
if(smd->type & MOD_SMOKE_TYPE_DOMAIN)
{
+ if(smd->domain)
+ {
+ write_pointcaches(wd, &(smd->domain->ptcaches[0]));
+
+ /* create fake pointcache so that old blender versions can read it */
+ smd->domain->point_cache[1] = BKE_ptcache_add(&smd->domain->ptcaches[1]);
+ smd->domain->point_cache[1]->flag |= PTCACHE_DISK_CACHE;
+ smd->domain->point_cache[1]->step = 1;
+
+ write_pointcaches(wd, &(smd->domain->ptcaches[1]));
+ }
+
writestruct(wd, DATA, "SmokeDomainSettings", 1, smd->domain);
- writestruct(wd, DATA, "EffectorWeights", 1, smd->domain->effector_weights);
+
+ if(smd->domain) {
+ /* cleanup the fake pointcache */
+ BKE_ptcache_free_list(&smd->domain->ptcaches[1]);
+ smd->domain->point_cache[1] = NULL;
+
+ writestruct(wd, DATA, "EffectorWeights", 1, smd->domain->effector_weights);
+ }
}
else if(smd->type & MOD_SMOKE_TYPE_FLOW)
writestruct(wd, DATA, "SmokeFlowSettings", 1, smd->flow);
else if(smd->type & MOD_SMOKE_TYPE_COLL)
writestruct(wd, DATA, "SmokeCollSettings", 1, smd->coll);
-
- if((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain)
- {
- write_pointcaches(wd, &(smd->domain->ptcaches[0]));
- write_pointcaches(wd, &(smd->domain->ptcaches[1]));
- }
}
else if(md->type==eModifierType_Fluidsim) {
FluidsimModifierData *fluidmd = (FluidsimModifierData*) md;
@@ -1478,7 +1519,7 @@ static void write_customdata(WriteData *wd, ID *id, int count, CustomData *data,
for (i=0; i<data->totlayer; i++) {
CustomDataLayer *layer= &data->layers[i];
- char *structname;
+ const char *structname;
int structnum, datasize;
if (layer->type == CD_MDEFORMVERT) {
@@ -1560,7 +1601,10 @@ static void write_lattices(WriteData *wd, ListBase *idbase)
/* write LibData */
writestruct(wd, ID_LT, "Lattice", 1, lt);
if (lt->id.properties) IDP_WriteProperty(lt->id.properties, wd);
-
+
+ /* write animdata */
+ if (lt->adt) write_animdata(wd, lt->adt);
+
/* direct data */
writestruct(wd, DATA, "BPoint", lt->pntsu*lt->pntsv*lt->pntsw, lt->def);
@@ -1907,21 +1951,23 @@ static void write_gpencils(WriteData *wd, ListBase *lb)
bGPDstroke *gps;
for (gpd= lb->first; gpd; gpd= gpd->id.next) {
- /* write gpd data block to file */
- writestruct(wd, ID_GD, "bGPdata", 1, gpd);
-
- /* write grease-pencil layers to file */
- for (gpl= gpd->layers.first; gpl; gpl= gpl->next) {
- writestruct(wd, DATA, "bGPDlayer", 1, gpl);
+ if (gpd->id.us>0 || wd->current) {
+ /* write gpd data block to file */
+ writestruct(wd, ID_GD, "bGPdata", 1, gpd);
- /* write this layer's frames to file */
- for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
- writestruct(wd, DATA, "bGPDframe", 1, gpf);
+ /* write grease-pencil layers to file */
+ for (gpl= gpd->layers.first; gpl; gpl= gpl->next) {
+ writestruct(wd, DATA, "bGPDlayer", 1, gpl);
- /* write strokes */
- for (gps= gpf->strokes.first; gps; gps= gps->next) {
- writestruct(wd, DATA, "bGPDstroke", 1, gps);
- writestruct(wd, DATA, "bGPDspoint", gps->totpoints, gps->points);
+ /* write this layer's frames to file */
+ for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
+ writestruct(wd, DATA, "bGPDframe", 1, gpf);
+
+ /* write strokes */
+ for (gps= gpf->strokes.first; gps; gps= gps->next) {
+ writestruct(wd, DATA, "bGPDstroke", 1, gps);
+ writestruct(wd, DATA, "bGPDspoint", gps->totpoints, gps->points);
+ }
}
}
}
@@ -2096,6 +2142,7 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
ConsoleLine *cl;
for (cl=con->history.first; cl; cl=cl->next) {
+ /* 'len_alloc' is invalid on write, set from 'len' on read */
writestruct(wd, DATA, "ConsoleLine", 1, cl);
writedata(wd, DATA, cl->len+1, cl->line);
}
@@ -2345,6 +2392,10 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar)
bScreen *screen;
char subvstr[8];
+ /* prevent mem checkers from complaining */
+ fg.pads= fg.pad= 0;
+ memset(fg.filename, 0, sizeof(fg.filename));
+
current_screen_compat(mainvar, &screen);
/* XXX still remap G */
@@ -2362,7 +2413,14 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar)
fg.subversion= BLENDER_SUBVERSION;
fg.minversion= BLENDER_MINVERSION;
fg.minsubversion= BLENDER_MINSUBVERSION;
- fg.pads= 0; /* prevent mem checkers from complaining */
+#ifdef NAN_BUILDINFO
+ {
+ extern char build_rev[];
+ fg.revision= atoi(build_rev);
+ }
+#else
+ fg.revision= 0;
+#endif
writestruct(wd, GLOB, "FileGlobal", 1, &fg);
}
@@ -2474,14 +2532,14 @@ int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *report
if(strcmp(dir1, dir2)==0)
write_flags &= ~G_FILE_RELATIVE_REMAP;
else
- makeFilesAbsolute(G.sce, NULL);
+ makeFilesAbsolute(mainvar, G.main->name, NULL);
}
- BLI_make_file_string(G.sce, userfilename, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_STARTUP_FILE);
+ BLI_make_file_string(G.main->name, userfilename, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_STARTUP_FILE);
write_user_block= BLI_streq(dir, userfilename);
if(write_flags & G_FILE_RELATIVE_REMAP)
- makeFilesRelative(dir, NULL); /* note, making relative to something OTHER then G.sce */
+ makeFilesRelative(mainvar, dir, NULL); /* note, making relative to something OTHER then G.main->name */
/* actual file writing */
err= write_file_handle(mainvar, file, NULL,NULL, write_user_block, write_flags, thumb);
@@ -2533,7 +2591,7 @@ int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *report
}
/* return: success (1) */
-int BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int write_flags, ReportList *reports)
+int BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int write_flags)
{
int err;
diff --git a/source/blender/blenpluginapi/CMakeLists.txt b/source/blender/blenpluginapi/CMakeLists.txt
index 3abf1e44449..64e4ab04e08 100644
--- a/source/blender/blenpluginapi/CMakeLists.txt
+++ b/source/blender/blenpluginapi/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-SET(INC
+set(INC
.
..
../blenlib
@@ -35,13 +33,20 @@ SET(INC
../../../intern/guardedalloc
)
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ intern/pluginapi.c
+
+ documentation.h
+ externdef.h
+ floatpatch.h
+ iff.h
+ plugin.h
+ util.h
+)
-IF(WITH_QUICKTIME)
- LIST(APPEND INC ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+if(WITH_CODEC_QUICKTIME)
+ list(APPEND INC ${QUICKTIME_INC})
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-BLENDERLIB(bf_blenpluginapi "${SRC}" "${INC}")
+blender_add_lib(bf_blenpluginapi "${SRC}" "${INC}")
diff --git a/source/blender/blenpluginapi/Makefile b/source/blender/blenpluginapi/Makefile
deleted file mode 100644
index c91161d8cfd..00000000000
--- a/source/blender/blenpluginapi/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/blenpluginapi
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/blenpluginapi/iff.h b/source/blender/blenpluginapi/iff.h
index b8628b00575..668d14508ec 100644
--- a/source/blender/blenpluginapi/iff.h
+++ b/source/blender/blenpluginapi/iff.h
@@ -81,7 +81,7 @@ typedef struct ImBuf {
int refcounter; /* reference counter for multiple users */
} ImBuf;
-LIBIMPORT struct ImBuf *allocImBuf(short,short,uchar,uint,uchar);
+LIBIMPORT struct ImBuf *allocImBuf(short,short,uchar,uint);
LIBIMPORT struct ImBuf *dupImBuf(struct ImBuf *);
LIBIMPORT void freeImBuf(struct ImBuf*);
diff --git a/source/blender/blenpluginapi/intern/pluginapi.c b/source/blender/blenpluginapi/intern/pluginapi.c
index 9e739f7927d..a12488ae868 100644
--- a/source/blender/blenpluginapi/intern/pluginapi.c
+++ b/source/blender/blenpluginapi/intern/pluginapi.c
@@ -101,10 +101,9 @@ LIBEXPORT void freeT(void *vmemh)
LIBEXPORT struct ImBuf *allocImBuf(short x,
short y,
uchar d,
- uint flags,
- uchar bitmap)
+ uint flags)
{
- return IMB_allocImBuf(x, y, d, flags, bitmap);
+ return IMB_allocImBuf(x, y, d, flags);
}
diff --git a/source/blender/collada/AnimationImporter.cpp b/source/blender/collada/AnimationImporter.cpp
new file mode 100644
index 00000000000..865e11aedf8
--- /dev/null
+++ b/source/blender/collada/AnimationImporter.cpp
@@ -0,0 +1,1152 @@
+/**
+ * $Id: AnimationImporter.cpp 34787 2011-02-12 06:25:04Z campbellbarton $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* COLLADABU_ASSERT, may be able to remove later */
+#include "COLLADABUPlatform.h"
+
+#include "DNA_armature_types.h"
+
+#include "ED_keyframing.h"
+
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+#include "BLI_path_util.h"
+#include "BLI_string.h"
+
+#include "BKE_action.h"
+#include "BKE_armature.h"
+#include "BKE_fcurve.h"
+#include "BKE_object.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "collada_utils.h"
+#include "AnimationImporter.h"
+#include "ArmatureImporter.h"
+
+#include <algorithm>
+
+// use this for retrieving bone names, since these must be unique
+template<class T>
+static const char *bc_get_joint_name(T *node)
+{
+ const std::string& id = node->getOriginalId();
+ return id.size() ? id.c_str() : node->getName().c_str();
+}
+
+FCurve *AnimationImporter::create_fcurve(int array_index, const char *rna_path)
+{
+ FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve");
+
+ fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
+ fcu->rna_path = BLI_strdupn(rna_path, strlen(rna_path));
+ fcu->array_index = array_index;
+ return fcu;
+}
+
+void AnimationImporter::create_bezt(FCurve *fcu, float frame, float output)
+{
+ BezTriple bez;
+ memset(&bez, 0, sizeof(BezTriple));
+ bez.vec[1][0] = frame;
+ bez.vec[1][1] = output;
+ bez.ipo = U.ipo_new; /* use default interpolation mode here... */
+ bez.f1 = bez.f2 = bez.f3 = SELECT;
+ bez.h1 = bez.h2 = HD_AUTO;
+ insert_bezt_fcurve(fcu, &bez, 0);
+ calchandles_fcurve(fcu);
+}
+
+// create one or several fcurves depending on the number of parameters being animated
+void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
+{
+ COLLADAFW::FloatOrDoubleArray& input = curve->getInputValues();
+ COLLADAFW::FloatOrDoubleArray& output = curve->getOutputValues();
+ // COLLADAFW::FloatOrDoubleArray& intan = curve->getInTangentValues();
+ // COLLADAFW::FloatOrDoubleArray& outtan = curve->getOutTangentValues();
+ float fps = (float)FPS;
+ size_t dim = curve->getOutDimension();
+ unsigned int i;
+
+ std::vector<FCurve*>& fcurves = curve_map[curve->getUniqueId()];
+
+ switch (dim) {
+ case 1: // X, Y, Z or angle
+ case 3: // XYZ
+ case 16: // matrix
+ {
+ for (i = 0; i < dim; i++ ) {
+ FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve");
+
+ fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
+ // fcu->rna_path = BLI_strdupn(path, strlen(path));
+ fcu->array_index = 0;
+ //fcu->totvert = curve->getKeyCount();
+
+ // create beztriple for each key
+ for (unsigned int j = 0; j < curve->getKeyCount(); j++) {
+ BezTriple bez;
+ memset(&bez, 0, sizeof(BezTriple));
+
+ // intangent
+ // bez.vec[0][0] = get_float_value(intan, j * 6 + i + i) * fps;
+ // bez.vec[0][1] = get_float_value(intan, j * 6 + i + i + 1);
+
+ // input, output
+ bez.vec[1][0] = bc_get_float_value(input, j) * fps;
+ bez.vec[1][1] = bc_get_float_value(output, j * dim + i);
+
+ // outtangent
+ // bez.vec[2][0] = get_float_value(outtan, j * 6 + i + i) * fps;
+ // bez.vec[2][1] = get_float_value(outtan, j * 6 + i + i + 1);
+
+ bez.ipo = U.ipo_new; /* use default interpolation mode here... */
+ bez.f1 = bez.f2 = bez.f3 = SELECT;
+ bez.h1 = bez.h2 = HD_AUTO;
+ insert_bezt_fcurve(fcu, &bez, 0);
+ }
+
+ calchandles_fcurve(fcu);
+
+ fcurves.push_back(fcu);
+ }
+ }
+ break;
+ default:
+ fprintf(stderr, "Output dimension of %d is not yet supported (animation id = %s)\n", (int)dim, curve->getOriginalId().c_str());
+ }
+
+ for (std::vector<FCurve*>::iterator it = fcurves.begin(); it != fcurves.end(); it++)
+ unused_curves.push_back(*it);
+}
+
+void AnimationImporter::fcurve_deg_to_rad(FCurve *cu)
+{
+ for (unsigned int i = 0; i < cu->totvert; i++) {
+ // TODO convert handles too
+ cu->bezt[i].vec[1][1] *= M_PI / 180.0f;
+ }
+}
+
+void AnimationImporter::add_fcurves_to_object(Object *ob, std::vector<FCurve*>& curves, char *rna_path, int array_index, Animation *animated)
+{
+ bAction *act;
+
+ if (!ob->adt || !ob->adt->action) act = verify_adt_action((ID*)&ob->id, 1);
+ else act = ob->adt->action;
+
+ std::vector<FCurve*>::iterator it;
+ int i;
+
+#if 0
+ char *p = strstr(rna_path, "rotation_euler");
+ bool is_rotation = p && *(p + strlen("rotation_euler")) == '\0';
+
+ // convert degrees to radians for rotation
+ if (is_rotation)
+ fcurve_deg_to_rad(fcu);
+#endif
+
+ for (it = curves.begin(), i = 0; it != curves.end(); it++, i++) {
+ FCurve *fcu = *it;
+ fcu->rna_path = BLI_strdupn(rna_path, strlen(rna_path));
+
+ if (array_index == -1) fcu->array_index = i;
+ else fcu->array_index = array_index;
+
+ if (ob->type == OB_ARMATURE) {
+ bActionGroup *grp = NULL;
+ const char *bone_name = bc_get_joint_name(animated->node);
+
+ if (bone_name) {
+ /* try to find group */
+ grp = action_groups_find_named(act, bone_name);
+
+ /* no matching groups, so add one */
+ if (grp == NULL) {
+ /* Add a new group, and make it active */
+ grp = (bActionGroup*)MEM_callocN(sizeof(bActionGroup), "bActionGroup");
+
+ grp->flag = AGRP_SELECTED;
+ BLI_strncpy(grp->name, bone_name, sizeof(grp->name));
+
+ BLI_addtail(&act->groups, grp);
+ BLI_uniquename(&act->groups, grp, "Group", '.', offsetof(bActionGroup, name), 64);
+ }
+
+ /* add F-Curve to group */
+ action_groups_add_channel(act, grp, fcu);
+
+ }
+#if 0
+ if (is_rotation) {
+ fcurves_actionGroup_map[grp].push_back(fcu);
+ }
+#endif
+ }
+ else {
+ BLI_addtail(&act->curves, fcu);
+ }
+
+ // curve is used, so remove it from unused_curves
+ unused_curves.erase(std::remove(unused_curves.begin(), unused_curves.end(), fcu), unused_curves.end());
+ }
+}
+
+AnimationImporter::AnimationImporter(UnitConverter *conv, ArmatureImporter *arm, Scene *scene) :
+ TransformReader(conv), armature_importer(arm), scene(scene) { }
+
+AnimationImporter::~AnimationImporter()
+{
+ // free unused FCurves
+ for (std::vector<FCurve*>::iterator it = unused_curves.begin(); it != unused_curves.end(); it++)
+ free_fcurve(*it);
+
+ if (unused_curves.size())
+ fprintf(stderr, "removed %d unused curves\n", (int)unused_curves.size());
+}
+
+bool AnimationImporter::write_animation(const COLLADAFW::Animation* anim)
+{
+ if (anim->getAnimationType() == COLLADAFW::Animation::ANIMATION_CURVE) {
+ COLLADAFW::AnimationCurve *curve = (COLLADAFW::AnimationCurve*)anim;
+
+ // XXX Don't know if it's necessary
+ // Should we check outPhysicalDimension?
+ if (curve->getInPhysicalDimension() != COLLADAFW::PHYSICAL_DIMENSION_TIME) {
+ fprintf(stderr, "Inputs physical dimension is not time. \n");
+ return true;
+ }
+
+ // a curve can have mixed interpolation type,
+ // in this case curve->getInterpolationTypes returns a list of interpolation types per key
+ COLLADAFW::AnimationCurve::InterpolationType interp = curve->getInterpolationType();
+
+ if (interp != COLLADAFW::AnimationCurve::INTERPOLATION_MIXED) {
+ switch (interp) {
+ case COLLADAFW::AnimationCurve::INTERPOLATION_LINEAR:
+ case COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER:
+ animation_to_fcurves(curve);
+ break;
+ default:
+ // TODO there're also CARDINAL, HERMITE, BSPLINE and STEP types
+ fprintf(stderr, "CARDINAL, HERMITE, BSPLINE and STEP anim interpolation types not supported yet.\n");
+ break;
+ }
+ }
+ else {
+ // not supported yet
+ fprintf(stderr, "MIXED anim interpolation type is not supported yet.\n");
+ }
+ }
+ else {
+ fprintf(stderr, "FORMULA animation type is not supported yet.\n");
+ }
+
+ return true;
+}
+
+// called on post-process stage after writeVisualScenes
+bool AnimationImporter::write_animation_list(const COLLADAFW::AnimationList* animlist)
+{
+ const COLLADAFW::UniqueId& animlist_id = animlist->getUniqueId();
+
+ animlist_map[animlist_id] = animlist;
+
+#if 0
+ // should not happen
+ if (uid_animated_map.find(animlist_id) == uid_animated_map.end()) {
+ return true;
+ }
+
+ // for bones rna_path is like: pose.bones["bone-name"].rotation
+
+ // what does this AnimationList animate?
+ Animation& animated = uid_animated_map[animlist_id];
+ Object *ob = animated.ob;
+
+ char rna_path[100];
+ char joint_path[100];
+ bool is_joint = false;
+
+ // if ob is NULL, it should be a JOINT
+ if (!ob) {
+ ob = armature_importer->get_armature_for_joint(animated.node);
+
+ if (!ob) {
+ fprintf(stderr, "Cannot find armature for node %s\n", get_joint_name(animated.node));
+ return true;
+ }
+
+ armature_importer->get_rna_path_for_joint(animated.node, joint_path, sizeof(joint_path));
+
+ is_joint = true;
+ }
+
+ const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
+
+ switch (animated.tm->getTransformationType()) {
+ case COLLADAFW::Transformation::TRANSLATE:
+ case COLLADAFW::Transformation::SCALE:
+ {
+ bool loc = animated.tm->getTransformationType() == COLLADAFW::Transformation::TRANSLATE;
+ if (is_joint)
+ BLI_snprintf(rna_path, sizeof(rna_path), "%s.%s", joint_path, loc ? "location" : "scale");
+ else
+ BLI_strncpy(rna_path, loc ? "location" : "scale", sizeof(rna_path));
+
+ for (int i = 0; i < bindings.getCount(); i++) {
+ const COLLADAFW::AnimationList::AnimationBinding& binding = bindings[i];
+ COLLADAFW::UniqueId anim_uid = binding.animation;
+
+ if (curve_map.find(anim_uid) == curve_map.end()) {
+ fprintf(stderr, "Cannot find FCurve by animation UID.\n");
+ continue;
+ }
+
+ std::vector<FCurve*>& fcurves = curve_map[anim_uid];
+
+ switch (binding.animationClass) {
+ case COLLADAFW::AnimationList::POSITION_X:
+ add_fcurves_to_object(ob, fcurves, rna_path, 0, &animated);
+ break;
+ case COLLADAFW::AnimationList::POSITION_Y:
+ add_fcurves_to_object(ob, fcurves, rna_path, 1, &animated);
+ break;
+ case COLLADAFW::AnimationList::POSITION_Z:
+ add_fcurves_to_object(ob, fcurves, rna_path, 2, &animated);
+ break;
+ case COLLADAFW::AnimationList::POSITION_XYZ:
+ add_fcurves_to_object(ob, fcurves, rna_path, -1, &animated);
+ break;
+ default:
+ fprintf(stderr, "AnimationClass %d is not supported for %s.\n",
+ binding.animationClass, loc ? "TRANSLATE" : "SCALE");
+ }
+ }
+ }
+ break;
+ case COLLADAFW::Transformation::ROTATE:
+ {
+ if (is_joint)
+ BLI_snprintf(rna_path, sizeof(rna_path), "%s.rotation_euler", joint_path);
+ else
+ BLI_strncpy(rna_path, "rotation_euler", sizeof(rna_path));
+
+ COLLADAFW::Rotate* rot = (COLLADAFW::Rotate*)animated.tm;
+ COLLADABU::Math::Vector3& axis = rot->getRotationAxis();
+
+ for (int i = 0; i < bindings.getCount(); i++) {
+ const COLLADAFW::AnimationList::AnimationBinding& binding = bindings[i];
+ COLLADAFW::UniqueId anim_uid = binding.animation;
+
+ if (curve_map.find(anim_uid) == curve_map.end()) {
+ fprintf(stderr, "Cannot find FCurve by animation UID.\n");
+ continue;
+ }
+
+ std::vector<FCurve*>& fcurves = curve_map[anim_uid];
+
+ switch (binding.animationClass) {
+ case COLLADAFW::AnimationList::ANGLE:
+ if (COLLADABU::Math::Vector3::UNIT_X == axis) {
+ add_fcurves_to_object(ob, fcurves, rna_path, 0, &animated);
+ }
+ else if (COLLADABU::Math::Vector3::UNIT_Y == axis) {
+ add_fcurves_to_object(ob, fcurves, rna_path, 1, &animated);
+ }
+ else if (COLLADABU::Math::Vector3::UNIT_Z == axis) {
+ add_fcurves_to_object(ob, fcurves, rna_path, 2, &animated);
+ }
+ break;
+ case COLLADAFW::AnimationList::AXISANGLE:
+ // TODO convert axis-angle to quat? or XYZ?
+ default:
+ fprintf(stderr, "AnimationClass %d is not supported for ROTATE transformation.\n",
+ binding.animationClass);
+ }
+ }
+ }
+ break;
+ case COLLADAFW::Transformation::MATRIX:
+ case COLLADAFW::Transformation::SKEW:
+ case COLLADAFW::Transformation::LOOKAT:
+ fprintf(stderr, "Animation of MATRIX, SKEW and LOOKAT transformations is not supported yet.\n");
+ break;
+ }
+#endif
+
+ return true;
+}
+
+void AnimationImporter::read_node_transform(COLLADAFW::Node *node, Object *ob)
+{
+ float mat[4][4];
+ TransformReader::get_node_mat(mat, node, &uid_animated_map, ob);
+ if (ob) {
+ copy_m4_m4(ob->obmat, mat);
+ object_apply_mat4(ob, ob->obmat, 0, 0);
+ }
+}
+
+#if 0
+virtual void AnimationImporter::change_eul_to_quat(Object *ob, bAction *act)
+{
+ bActionGroup *grp;
+ int i;
+
+ for (grp = (bActionGroup*)act->groups.first; grp; grp = grp->next) {
+
+ FCurve *eulcu[3] = {NULL, NULL, NULL};
+
+ if (fcurves_actionGroup_map.find(grp) == fcurves_actionGroup_map.end())
+ continue;
+
+ std::vector<FCurve*> &rot_fcurves = fcurves_actionGroup_map[grp];
+
+ if (rot_fcurves.size() > 3) continue;
+
+ for (i = 0; i < rot_fcurves.size(); i++)
+ eulcu[rot_fcurves[i]->array_index] = rot_fcurves[i];
+
+ char joint_path[100];
+ char rna_path[100];
+
+ BLI_snprintf(joint_path, sizeof(joint_path), "pose.bones[\"%s\"]", grp->name);
+ BLI_snprintf(rna_path, sizeof(rna_path), "%s.rotation_quaternion", joint_path);
+
+ FCurve *quatcu[4] = {
+ create_fcurve(0, rna_path),
+ create_fcurve(1, rna_path),
+ create_fcurve(2, rna_path),
+ create_fcurve(3, rna_path)
+ };
+
+ bPoseChannel *chan = get_pose_channel(ob->pose, grp->name);
+
+ float m4[4][4], irest[3][3];
+ invert_m4_m4(m4, chan->bone->arm_mat);
+ copy_m3_m4(irest, m4);
+
+ for (i = 0; i < 3; i++) {
+
+ FCurve *cu = eulcu[i];
+
+ if (!cu) continue;
+
+ for (int j = 0; j < cu->totvert; j++) {
+ float frame = cu->bezt[j].vec[1][0];
+
+ float eul[3] = {
+ eulcu[0] ? evaluate_fcurve(eulcu[0], frame) : 0.0f,
+ eulcu[1] ? evaluate_fcurve(eulcu[1], frame) : 0.0f,
+ eulcu[2] ? evaluate_fcurve(eulcu[2], frame) : 0.0f
+ };
+
+ // make eul relative to bone rest pose
+ float rot[3][3], rel[3][3], quat[4];
+
+ /*eul_to_mat3(rot, eul);
+
+ mul_m3_m3m3(rel, irest, rot);
+
+ mat3_to_quat(quat, rel);
+ */
+
+ eul_to_quat(quat, eul);
+
+ for (int k = 0; k < 4; k++)
+ create_bezt(quatcu[k], frame, quat[k]);
+ }
+ }
+
+ // now replace old Euler curves
+
+ for (i = 0; i < 3; i++) {
+ if (!eulcu[i]) continue;
+
+ action_groups_remove_channel(act, eulcu[i]);
+ free_fcurve(eulcu[i]);
+ }
+
+ chan->rotmode = ROT_MODE_QUAT;
+
+ for (i = 0; i < 4; i++)
+ action_groups_add_channel(act, grp, quatcu[i]);
+ }
+
+ bPoseChannel *pchan;
+ for (pchan = (bPoseChannel*)ob->pose->chanbase.first; pchan; pchan = pchan->next) {
+ pchan->rotmode = ROT_MODE_QUAT;
+ }
+}
+#endif
+
+// prerequisites:
+// animlist_map - map animlist id -> animlist
+// curve_map - map anim id -> curve(s)
+Object *AnimationImporter::translate_animation(COLLADAFW::Node *node,
+ std::map<COLLADAFW::UniqueId, Object*>& object_map,
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map,
+ COLLADAFW::Transformation::TransformationType tm_type,
+ Object *par_job)
+{
+ bool is_rotation = tm_type == COLLADAFW::Transformation::ROTATE;
+ bool is_matrix = tm_type == COLLADAFW::Transformation::MATRIX;
+ bool is_joint = node->getType() == COLLADAFW::Node::JOINT;
+
+ COLLADAFW::Node *root = root_map.find(node->getUniqueId()) == root_map.end() ? node : root_map[node->getUniqueId()];
+ Object *ob = is_joint ? armature_importer->get_armature_for_joint(node) : object_map[node->getUniqueId()];
+ const char *bone_name = is_joint ? bc_get_joint_name(node) : NULL;
+
+ if (!ob) {
+ fprintf(stderr, "cannot find Object for Node with id=\"%s\"\n", node->getOriginalId().c_str());
+ return NULL;
+ }
+
+ // frames at which to sample
+ std::vector<float> frames;
+
+ // for each <rotate>, <translate>, etc. there is a separate Transformation
+ const COLLADAFW::TransformationPointerArray& tms = node->getTransformations();
+
+ unsigned int i;
+
+ // find frames at which to sample plus convert all rotation keys to radians
+ for (i = 0; i < tms.getCount(); i++) {
+ COLLADAFW::Transformation *tm = tms[i];
+ COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
+
+ if (type == tm_type) {
+ const COLLADAFW::UniqueId& listid = tm->getAnimationList();
+
+ if (animlist_map.find(listid) != animlist_map.end()) {
+ const COLLADAFW::AnimationList *animlist = animlist_map[listid];
+ const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
+
+ if (bindings.getCount()) {
+ for (unsigned int j = 0; j < bindings.getCount(); j++) {
+ std::vector<FCurve*>& curves = curve_map[bindings[j].animation];
+ bool xyz = ((type == COLLADAFW::Transformation::TRANSLATE || type == COLLADAFW::Transformation::SCALE) && bindings[j].animationClass == COLLADAFW::AnimationList::POSITION_XYZ);
+
+ if ((!xyz && curves.size() == 1) || (xyz && curves.size() == 3) || is_matrix) {
+ std::vector<FCurve*>::iterator iter;
+
+ for (iter = curves.begin(); iter != curves.end(); iter++) {
+ FCurve *fcu = *iter;
+
+ if (is_rotation)
+ fcurve_deg_to_rad(fcu);
+
+ for (unsigned int k = 0; k < fcu->totvert; k++) {
+ float fra = fcu->bezt[k].vec[1][0];
+ if (std::find(frames.begin(), frames.end(), fra) == frames.end())
+ frames.push_back(fra);
+ }
+ }
+ }
+ else {
+ fprintf(stderr, "expected %d curves, got %d\n", xyz ? 3 : 1, (int)curves.size());
+ }
+ }
+ }
+ }
+ }
+ }
+
+ float irest_dae[4][4];
+ float rest[4][4], irest[4][4];
+
+ if (is_joint) {
+ get_joint_rest_mat(irest_dae, root, node);
+ invert_m4(irest_dae);
+
+ Bone *bone = get_named_bone((bArmature*)ob->data, bone_name);
+ if (!bone) {
+ fprintf(stderr, "cannot find bone \"%s\"\n", bone_name);
+ return NULL;
+ }
+
+ unit_m4(rest);
+ copy_m4_m4(rest, bone->arm_mat);
+ invert_m4_m4(irest, rest);
+ }
+
+ Object *job = NULL;
+
+#ifdef ARMATURE_TEST
+ FCurve *job_curves[10];
+ job = get_joint_object(root, node, par_job);
+#endif
+
+ if (frames.size() == 0)
+ return job;
+
+ std::sort(frames.begin(), frames.end());
+
+ const char *tm_str = NULL;
+ switch (tm_type) {
+ case COLLADAFW::Transformation::ROTATE:
+ tm_str = "rotation_quaternion";
+ break;
+ case COLLADAFW::Transformation::SCALE:
+ tm_str = "scale";
+ break;
+ case COLLADAFW::Transformation::TRANSLATE:
+ tm_str = "location";
+ break;
+ case COLLADAFW::Transformation::MATRIX:
+ break;
+ default:
+ return job;
+ }
+
+ char rna_path[200];
+ char joint_path[200];
+
+ if (is_joint)
+ armature_importer->get_rna_path_for_joint(node, joint_path, sizeof(joint_path));
+
+ // new curves
+ FCurve *newcu[10]; // if tm_type is matrix, then create 10 curves: 4 rot, 3 loc, 3 scale
+ unsigned int totcu = is_matrix ? 10 : (is_rotation ? 4 : 3);
+
+ for (i = 0; i < totcu; i++) {
+
+ int axis = i;
+
+ if (is_matrix) {
+ if (i < 4) {
+ tm_str = "rotation_quaternion";
+ axis = i;
+ }
+ else if (i < 7) {
+ tm_str = "location";
+ axis = i - 4;
+ }
+ else {
+ tm_str = "scale";
+ axis = i - 7;
+ }
+ }
+
+ if (is_joint)
+ BLI_snprintf(rna_path, sizeof(rna_path), "%s.%s", joint_path, tm_str);
+ else
+ strcpy(rna_path, tm_str);
+
+ newcu[i] = create_fcurve(axis, rna_path);
+
+#ifdef ARMATURE_TEST
+ if (is_joint)
+ job_curves[i] = create_fcurve(axis, tm_str);
+#endif
+ }
+
+ std::vector<float>::iterator it;
+
+ // sample values at each frame
+ for (it = frames.begin(); it != frames.end(); it++) {
+ float fra = *it;
+
+ float mat[4][4];
+ float matfra[4][4];
+
+ unit_m4(matfra);
+
+ // calc object-space mat
+ evaluate_transform_at_frame(matfra, node, fra);
+
+ // for joints, we need a special matrix
+ if (is_joint) {
+ // special matrix: iR * M * iR_dae * R
+ // where R, iR are bone rest and inverse rest mats in world space (Blender bones),
+ // iR_dae is joint inverse rest matrix (DAE) and M is an evaluated joint world-space matrix (DAE)
+ float temp[4][4], par[4][4];
+
+ // calc M
+ calc_joint_parent_mat_rest(par, NULL, root, node);
+ mul_m4_m4m4(temp, matfra, par);
+
+ // evaluate_joint_world_transform_at_frame(temp, NULL, , node, fra);
+
+ // calc special matrix
+ mul_serie_m4(mat, irest, temp, irest_dae, rest, NULL, NULL, NULL, NULL);
+ }
+ else {
+ copy_m4_m4(mat, matfra);
+ }
+
+ float val[4], rot[4], loc[3], scale[3];
+
+ switch (tm_type) {
+ case COLLADAFW::Transformation::ROTATE:
+ mat4_to_quat(val, mat);
+ break;
+ case COLLADAFW::Transformation::SCALE:
+ mat4_to_size(val, mat);
+ break;
+ case COLLADAFW::Transformation::TRANSLATE:
+ copy_v3_v3(val, mat[3]);
+ break;
+ case COLLADAFW::Transformation::MATRIX:
+ mat4_to_quat(rot, mat);
+ copy_v3_v3(loc, mat[3]);
+ mat4_to_size(scale, mat);
+ break;
+ default:
+ break;
+ }
+
+ // add keys
+ for (i = 0; i < totcu; i++) {
+ if (is_matrix) {
+ if (i < 4)
+ add_bezt(newcu[i], fra, rot[i]);
+ else if (i < 7)
+ add_bezt(newcu[i], fra, loc[i - 4]);
+ else
+ add_bezt(newcu[i], fra, scale[i - 7]);
+ }
+ else {
+ add_bezt(newcu[i], fra, val[i]);
+ }
+ }
+
+#ifdef ARMATURE_TEST
+ if (is_joint) {
+ switch (tm_type) {
+ case COLLADAFW::Transformation::ROTATE:
+ mat4_to_quat(val, matfra);
+ break;
+ case COLLADAFW::Transformation::SCALE:
+ mat4_to_size(val, matfra);
+ break;
+ case COLLADAFW::Transformation::TRANSLATE:
+ copy_v3_v3(val, matfra[3]);
+ break;
+ case MATRIX:
+ mat4_to_quat(rot, matfra);
+ copy_v3_v3(loc, matfra[3]);
+ mat4_to_size(scale, matfra);
+ break;
+ default:
+ break;
+ }
+
+ for (i = 0; i < totcu; i++) {
+ if (is_matrix) {
+ if (i < 4)
+ add_bezt(job_curves[i], fra, rot[i]);
+ else if (i < 7)
+ add_bezt(job_curves[i], fra, loc[i - 4]);
+ else
+ add_bezt(job_curves[i], fra, scale[i - 7]);
+ }
+ else {
+ add_bezt(job_curves[i], fra, val[i]);
+ }
+ }
+ }
+#endif
+ }
+
+ verify_adt_action((ID*)&ob->id, 1);
+
+ ListBase *curves = &ob->adt->action->curves;
+
+ // add curves
+ for (i = 0; i < totcu; i++) {
+ if (is_joint)
+ add_bone_fcurve(ob, node, newcu[i]);
+ else
+ BLI_addtail(curves, newcu[i]);
+
+#ifdef ARMATURE_TEST
+ if (is_joint)
+ BLI_addtail(&job->adt->action->curves, job_curves[i]);
+#endif
+ }
+
+ if (is_rotation || is_matrix) {
+ if (is_joint) {
+ bPoseChannel *chan = get_pose_channel(ob->pose, bone_name);
+ chan->rotmode = ROT_MODE_QUAT;
+ }
+ else {
+ ob->rotmode = ROT_MODE_QUAT;
+ }
+ }
+
+ return job;
+}
+
+// internal, better make it private
+// warning: evaluates only rotation
+// prerequisites: animlist_map, curve_map
+void AnimationImporter::evaluate_transform_at_frame(float mat[4][4], COLLADAFW::Node *node, float fra)
+{
+ const COLLADAFW::TransformationPointerArray& tms = node->getTransformations();
+
+ unit_m4(mat);
+
+ for (unsigned int i = 0; i < tms.getCount(); i++) {
+ COLLADAFW::Transformation *tm = tms[i];
+ COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
+ float m[4][4];
+
+ unit_m4(m);
+
+ if (!evaluate_animation(tm, m, fra, node->getOriginalId().c_str())) {
+ switch (type) {
+ case COLLADAFW::Transformation::ROTATE:
+ dae_rotate_to_mat4(tm, m);
+ break;
+ case COLLADAFW::Transformation::TRANSLATE:
+ dae_translate_to_mat4(tm, m);
+ break;
+ case COLLADAFW::Transformation::SCALE:
+ dae_scale_to_mat4(tm, m);
+ break;
+ case COLLADAFW::Transformation::MATRIX:
+ dae_matrix_to_mat4(tm, m);
+ break;
+ default:
+ fprintf(stderr, "unsupported transformation type %d\n", type);
+ }
+ }
+
+ float temp[4][4];
+ copy_m4_m4(temp, mat);
+
+ mul_m4_m4m4(mat, m, temp);
+ }
+}
+
+// return true to indicate that mat contains a sane value
+bool AnimationImporter::evaluate_animation(COLLADAFW::Transformation *tm, float mat[4][4], float fra, const char *node_id)
+{
+ const COLLADAFW::UniqueId& listid = tm->getAnimationList();
+ COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
+
+ if (type != COLLADAFW::Transformation::ROTATE &&
+ type != COLLADAFW::Transformation::SCALE &&
+ type != COLLADAFW::Transformation::TRANSLATE &&
+ type != COLLADAFW::Transformation::MATRIX) {
+ fprintf(stderr, "animation of transformation %d is not supported yet\n", type);
+ return false;
+ }
+
+ if (animlist_map.find(listid) == animlist_map.end())
+ return false;
+
+ const COLLADAFW::AnimationList *animlist = animlist_map[listid];
+ const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
+
+ if (bindings.getCount()) {
+ float vec[3];
+
+ bool is_scale = (type == COLLADAFW::Transformation::SCALE);
+ bool is_translate = (type == COLLADAFW::Transformation::TRANSLATE);
+
+ if (type == COLLADAFW::Transformation::SCALE)
+ dae_scale_to_v3(tm, vec);
+ else if (type == COLLADAFW::Transformation::TRANSLATE)
+ dae_translate_to_v3(tm, vec);
+
+ for (unsigned int j = 0; j < bindings.getCount(); j++) {
+ const COLLADAFW::AnimationList::AnimationBinding& binding = bindings[j];
+ std::vector<FCurve*>& curves = curve_map[binding.animation];
+ COLLADAFW::AnimationList::AnimationClass animclass = binding.animationClass;
+ char path[100];
+
+ switch (type) {
+ case COLLADAFW::Transformation::ROTATE:
+ BLI_snprintf(path, sizeof(path), "%s.rotate (binding %u)", node_id, j);
+ break;
+ case COLLADAFW::Transformation::SCALE:
+ BLI_snprintf(path, sizeof(path), "%s.scale (binding %u)", node_id, j);
+ break;
+ case COLLADAFW::Transformation::TRANSLATE:
+ BLI_snprintf(path, sizeof(path), "%s.translate (binding %u)", node_id, j);
+ break;
+ case COLLADAFW::Transformation::MATRIX:
+ BLI_snprintf(path, sizeof(path), "%s.matrix (binding %u)", node_id, j);
+ break;
+ default:
+ break;
+ }
+
+ if (animclass == COLLADAFW::AnimationList::UNKNOWN_CLASS) {
+ fprintf(stderr, "%s: UNKNOWN animation class\n", path);
+ continue;
+ }
+
+ if (type == COLLADAFW::Transformation::ROTATE) {
+ if (curves.size() != 1) {
+ fprintf(stderr, "expected 1 curve, got %d\n", (int)curves.size());
+ return false;
+ }
+
+ // TODO support other animclasses
+ if (animclass != COLLADAFW::AnimationList::ANGLE) {
+ fprintf(stderr, "%s: animation class %d is not supported yet\n", path, animclass);
+ return false;
+ }
+
+ COLLADABU::Math::Vector3& axis = ((COLLADAFW::Rotate*)tm)->getRotationAxis();
+ float ax[3] = {axis[0], axis[1], axis[2]};
+ float angle = evaluate_fcurve(curves[0], fra);
+ axis_angle_to_mat4(mat, ax, angle);
+
+ return true;
+ }
+ else if (is_scale || is_translate) {
+ bool is_xyz = animclass == COLLADAFW::AnimationList::POSITION_XYZ;
+
+ if ((!is_xyz && curves.size() != 1) || (is_xyz && curves.size() != 3)) {
+ if (is_xyz)
+ fprintf(stderr, "%s: expected 3 curves, got %d\n", path, (int)curves.size());
+ else
+ fprintf(stderr, "%s: expected 1 curve, got %d\n", path, (int)curves.size());
+ return false;
+ }
+
+ switch (animclass) {
+ case COLLADAFW::AnimationList::POSITION_X:
+ vec[0] = evaluate_fcurve(curves[0], fra);
+ break;
+ case COLLADAFW::AnimationList::POSITION_Y:
+ vec[1] = evaluate_fcurve(curves[0], fra);
+ break;
+ case COLLADAFW::AnimationList::POSITION_Z:
+ vec[2] = evaluate_fcurve(curves[0], fra);
+ break;
+ case COLLADAFW::AnimationList::POSITION_XYZ:
+ vec[0] = evaluate_fcurve(curves[0], fra);
+ vec[1] = evaluate_fcurve(curves[1], fra);
+ vec[2] = evaluate_fcurve(curves[2], fra);
+ break;
+ default:
+ fprintf(stderr, "%s: animation class %d is not supported yet\n", path, animclass);
+ break;
+ }
+ }
+ else if (type == COLLADAFW::Transformation::MATRIX) {
+ // for now, of matrix animation, support only the case when all values are packed into one animation
+ if (curves.size() != 16) {
+ fprintf(stderr, "%s: expected 16 curves, got %d\n", path, (int)curves.size());
+ return false;
+ }
+
+ COLLADABU::Math::Matrix4 matrix;
+ int i = 0, j = 0;
+
+ for (std::vector<FCurve*>::iterator it = curves.begin(); it != curves.end(); it++) {
+ matrix.setElement(i, j, evaluate_fcurve(*it, fra));
+ j++;
+ if (j == 4) {
+ i++;
+ j = 0;
+ }
+ }
+
+ COLLADAFW::Matrix tm(matrix);
+ dae_matrix_to_mat4(&tm, mat);
+
+ return true;
+ }
+ }
+
+ if (is_scale)
+ size_to_mat4(mat, vec);
+ else
+ copy_v3_v3(mat[3], vec);
+
+ return is_scale || is_translate;
+ }
+
+ return false;
+}
+
+// gives a world-space mat of joint at rest position
+void AnimationImporter::get_joint_rest_mat(float mat[4][4], COLLADAFW::Node *root, COLLADAFW::Node *node)
+{
+ // if bind mat is not available,
+ // use "current" node transform, i.e. all those tms listed inside <node>
+ if (!armature_importer->get_joint_bind_mat(mat, node)) {
+ float par[4][4], m[4][4];
+
+ calc_joint_parent_mat_rest(par, NULL, root, node);
+ get_node_mat(m, node, NULL, NULL);
+ mul_m4_m4m4(mat, m, par);
+ }
+}
+
+// gives a world-space mat, end's mat not included
+bool AnimationImporter::calc_joint_parent_mat_rest(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end)
+{
+ float m[4][4];
+
+ if (node == end) {
+ par ? copy_m4_m4(mat, par) : unit_m4(mat);
+ return true;
+ }
+
+ // use bind matrix if available or calc "current" world mat
+ if (!armature_importer->get_joint_bind_mat(m, node)) {
+ if (par) {
+ float temp[4][4];
+ get_node_mat(temp, node, NULL, NULL);
+ mul_m4_m4m4(m, temp, par);
+ }
+ else {
+ get_node_mat(m, node, NULL, NULL);
+ }
+ }
+
+ COLLADAFW::NodePointerArray& children = node->getChildNodes();
+ for (unsigned int i = 0; i < children.getCount(); i++) {
+ if (calc_joint_parent_mat_rest(mat, m, children[i], end))
+ return true;
+ }
+
+ return false;
+}
+
+#ifdef ARMATURE_TEST
+Object *AnimationImporter::get_joint_object(COLLADAFW::Node *root, COLLADAFW::Node *node, Object *par_job)
+{
+ if (joint_objects.find(node->getUniqueId()) == joint_objects.end()) {
+ Object *job = add_object(scene, OB_EMPTY);
+
+ rename_id((ID*)&job->id, (char*)get_joint_name(node));
+
+ job->lay = object_in_scene(job, scene)->lay = 2;
+
+ mul_v3_fl(job->size, 0.5f);
+ job->recalc |= OB_RECALC_OB;
+
+ verify_adt_action((ID*)&job->id, 1);
+
+ job->rotmode = ROT_MODE_QUAT;
+
+ float mat[4][4];
+ get_joint_rest_mat(mat, root, node);
+
+ if (par_job) {
+ float temp[4][4], ipar[4][4];
+ invert_m4_m4(ipar, par_job->obmat);
+ copy_m4_m4(temp, mat);
+ mul_m4_m4m4(mat, temp, ipar);
+ }
+
+ TransformBase::decompose(mat, job->loc, NULL, job->quat, job->size);
+
+ if (par_job) {
+ job->parent = par_job;
+
+ par_job->recalc |= OB_RECALC_OB;
+ job->parsubstr[0] = 0;
+ }
+
+ where_is_object(scene, job);
+
+ // after parenting and layer change
+ DAG_scene_sort(CTX_data_main(C), scene);
+
+ joint_objects[node->getUniqueId()] = job;
+ }
+
+ return joint_objects[node->getUniqueId()];
+}
+#endif
+
+#if 0
+// recursively evaluates joint tree until end is found, mat then is world-space matrix of end
+// mat must be identity on enter, node must be root
+bool AnimationImporter::evaluate_joint_world_transform_at_frame(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end, float fra)
+{
+ float m[4][4];
+ if (par) {
+ float temp[4][4];
+ evaluate_transform_at_frame(temp, node, node == end ? fra : 0.0f);
+ mul_m4_m4m4(m, temp, par);
+ }
+ else {
+ evaluate_transform_at_frame(m, node, node == end ? fra : 0.0f);
+ }
+
+ if (node == end) {
+ copy_m4_m4(mat, m);
+ return true;
+ }
+ else {
+ COLLADAFW::NodePointerArray& children = node->getChildNodes();
+ for (int i = 0; i < children.getCount(); i++) {
+ if (evaluate_joint_world_transform_at_frame(mat, m, children[i], end, fra))
+ return true;
+ }
+ }
+
+ return false;
+}
+#endif
+
+void AnimationImporter::add_bone_fcurve(Object *ob, COLLADAFW::Node *node, FCurve *fcu)
+{
+ const char *bone_name = bc_get_joint_name(node);
+ bAction *act = ob->adt->action;
+
+ /* try to find group */
+ bActionGroup *grp = action_groups_find_named(act, bone_name);
+
+ /* no matching groups, so add one */
+ if (grp == NULL) {
+ /* Add a new group, and make it active */
+ grp = (bActionGroup*)MEM_callocN(sizeof(bActionGroup), "bActionGroup");
+
+ grp->flag = AGRP_SELECTED;
+ BLI_strncpy(grp->name, bone_name, sizeof(grp->name));
+
+ BLI_addtail(&act->groups, grp);
+ BLI_uniquename(&act->groups, grp, "Group", '.', offsetof(bActionGroup, name), 64);
+ }
+
+ /* add F-Curve to group */
+ action_groups_add_channel(act, grp, fcu);
+}
+
+void AnimationImporter::add_bezt(FCurve *fcu, float fra, float value)
+{
+ BezTriple bez;
+ memset(&bez, 0, sizeof(BezTriple));
+ bez.vec[1][0] = fra;
+ bez.vec[1][1] = value;
+ bez.ipo = U.ipo_new; /* use default interpolation mode here... */
+ bez.f1 = bez.f2 = bez.f3 = SELECT;
+ bez.h1 = bez.h2 = HD_AUTO;
+ insert_bezt_fcurve(fcu, &bez, 0);
+ calchandles_fcurve(fcu);
+}
diff --git a/source/blender/collada/AnimationImporter.h b/source/blender/collada/AnimationImporter.h
new file mode 100644
index 00000000000..effb129e3c8
--- /dev/null
+++ b/source/blender/collada/AnimationImporter.h
@@ -0,0 +1,132 @@
+/**
+ * $Id: AnimationImporter.h 32310 2010-10-05 00:49:39Z gsrb3d $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __BC_ANIMATIONIMPORTER_H__
+#define __BC_ANIMATIONIMPORTER_H__
+
+#include <map>
+#include <vector>
+
+#include "COLLADAFWAnimation.h"
+#include "COLLADAFWAnimationCurve.h"
+#include "COLLADAFWAnimationList.h"
+#include "COLLADAFWNode.h"
+#include "COLLADAFWUniqueId.h"
+
+#include "DNA_anim_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+//#include "ArmatureImporter.h"
+#include "TransformReader.h"
+
+#include "collada_internal.h"
+
+class ArmatureImporter;
+
+class AnimationImporterBase
+{
+public:
+ // virtual void change_eul_to_quat(Object *ob, bAction *act) = 0;
+};
+
+class AnimationImporter : private TransformReader, public AnimationImporterBase
+{
+private:
+
+ ArmatureImporter *armature_importer;
+ Scene *scene;
+
+ std::map<COLLADAFW::UniqueId, std::vector<FCurve*> > curve_map;
+ std::map<COLLADAFW::UniqueId, TransformReader::Animation> uid_animated_map;
+ // std::map<bActionGroup*, std::vector<FCurve*> > fcurves_actionGroup_map;
+ std::map<COLLADAFW::UniqueId, const COLLADAFW::AnimationList*> animlist_map;
+ std::vector<FCurve*> unused_curves;
+ std::map<COLLADAFW::UniqueId, Object*> joint_objects;
+
+ FCurve *create_fcurve(int array_index, const char *rna_path);
+
+ void create_bezt(FCurve *fcu, float frame, float output);
+
+ // create one or several fcurves depending on the number of parameters being animated
+ void animation_to_fcurves(COLLADAFW::AnimationCurve *curve);
+
+ void fcurve_deg_to_rad(FCurve *cu);
+
+ void add_fcurves_to_object(Object *ob, std::vector<FCurve*>& curves, char *rna_path, int array_index, Animation *animated);
+public:
+
+ AnimationImporter(UnitConverter *conv, ArmatureImporter *arm, Scene *scene);
+
+ ~AnimationImporter();
+
+ bool write_animation(const COLLADAFW::Animation* anim);
+
+ // called on post-process stage after writeVisualScenes
+ bool write_animation_list(const COLLADAFW::AnimationList* animlist);
+
+ void read_node_transform(COLLADAFW::Node *node, Object *ob);
+#if 0
+ virtual void change_eul_to_quat(Object *ob, bAction *act);
+#endif
+
+ // prerequisites:
+ // animlist_map - map animlist id -> animlist
+ // curve_map - map anim id -> curve(s)
+ Object *translate_animation(COLLADAFW::Node *node,
+ std::map<COLLADAFW::UniqueId, Object*>& object_map,
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map,
+ COLLADAFW::Transformation::TransformationType tm_type,
+ Object *par_job = NULL);
+
+ // internal, better make it private
+ // warning: evaluates only rotation
+ // prerequisites: animlist_map, curve_map
+ void evaluate_transform_at_frame(float mat[4][4], COLLADAFW::Node *node, float fra);
+
+ // return true to indicate that mat contains a sane value
+ bool evaluate_animation(COLLADAFW::Transformation *tm, float mat[4][4], float fra, const char *node_id);
+
+ // gives a world-space mat of joint at rest position
+ void get_joint_rest_mat(float mat[4][4], COLLADAFW::Node *root, COLLADAFW::Node *node);
+
+ // gives a world-space mat, end's mat not included
+ bool calc_joint_parent_mat_rest(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end);
+
+#ifdef ARMATURE_TEST
+ Object *get_joint_object(COLLADAFW::Node *root, COLLADAFW::Node *node, Object *par_job);
+#endif
+
+#if 0
+ // recursively evaluates joint tree until end is found, mat then is world-space matrix of end
+ // mat must be identity on enter, node must be root
+ bool evaluate_joint_world_transform_at_frame(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end, float fra);
+#endif
+
+ void add_bone_fcurve(Object *ob, COLLADAFW::Node *node, FCurve *fcu);
+
+ void add_bezt(FCurve *fcu, float fra, float value);
+};
+
+ #endif
diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp
new file mode 100644
index 00000000000..79eadf42f4a
--- /dev/null
+++ b/source/blender/collada/ArmatureExporter.cpp
@@ -0,0 +1,469 @@
+/**
+ * $Id: ArmatureExporter.cpp 34533 2011-01-27 19:39:06Z jesterking $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "COLLADASWBaseInputElement.h"
+#include "COLLADASWInstanceController.h"
+#include "COLLADASWPrimitves.h"
+#include "COLLADASWSource.h"
+
+#include "DNA_action_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+
+#include "BKE_action.h"
+#include "BKE_armature.h"
+
+#include "BLI_listbase.h"
+
+#include "GeometryExporter.h"
+#include "ArmatureExporter.h"
+
+// XXX exporter writes wrong data for shared armatures. A separate
+// controller should be written for each armature-mesh binding how do
+// we make controller ids then?
+ArmatureExporter::ArmatureExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryControllers(sw) {}
+
+// write bone nodes
+void ArmatureExporter::add_armature_bones(Object *ob_arm, Scene *sce)
+{
+ // write bone nodes
+ bArmature *arm = (bArmature*)ob_arm->data;
+ for (Bone *bone = (Bone*)arm->bonebase.first; bone; bone = bone->next) {
+ // start from root bones
+ if (!bone->parent)
+ add_bone_node(bone, ob_arm);
+ }
+}
+
+bool ArmatureExporter::is_skinned_mesh(Object *ob)
+{
+ return get_assigned_armature(ob) != NULL;
+}
+
+void ArmatureExporter::add_instance_controller(Object *ob)
+{
+ Object *ob_arm = get_assigned_armature(ob);
+ bArmature *arm = (bArmature*)ob_arm->data;
+
+ const std::string& controller_id = get_controller_id(ob_arm, ob);
+
+ COLLADASW::InstanceController ins(mSW);
+ ins.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, controller_id));
+
+ // write root bone URLs
+ Bone *bone;
+ for (bone = (Bone*)arm->bonebase.first; bone; bone = bone->next) {
+ if (!bone->parent)
+ ins.addSkeleton(COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_joint_id(bone, ob_arm)));
+ }
+
+ InstanceWriter::add_material_bindings(ins.getBindMaterial(), ob);
+
+ ins.add();
+}
+
+void ArmatureExporter::export_controllers(Scene *sce)
+{
+ scene = sce;
+
+ openLibrary();
+
+ GeometryFunctor gf;
+ gf.forEachMeshObjectInScene<ArmatureExporter>(sce, *this);
+
+ closeLibrary();
+}
+
+void ArmatureExporter::operator()(Object *ob)
+{
+ Object *ob_arm = get_assigned_armature(ob);
+
+ if (ob_arm /*&& !already_written(ob_arm)*/)
+ export_controller(ob, ob_arm);
+}
+#if 0
+
+bool ArmatureExporter::already_written(Object *ob_arm)
+{
+ return std::find(written_armatures.begin(), written_armatures.end(), ob_arm) != written_armatures.end();
+}
+
+void ArmatureExporter::wrote(Object *ob_arm)
+{
+ written_armatures.push_back(ob_arm);
+}
+
+void ArmatureExporter::find_objects_using_armature(Object *ob_arm, std::vector<Object *>& objects, Scene *sce)
+{
+ objects.clear();
+
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ if (ob->type == OB_MESH && get_assigned_armature(ob) == ob_arm) {
+ objects.push_back(ob);
+ }
+
+ base= base->next;
+ }
+}
+#endif
+
+Object *ArmatureExporter::get_assigned_armature(Object *ob)
+{
+ Object *ob_arm = NULL;
+
+ if (ob->parent && ob->partype == PARSKEL && ob->parent->type == OB_ARMATURE) {
+ ob_arm = ob->parent;
+ }
+ else {
+ ModifierData *mod = (ModifierData*)ob->modifiers.first;
+ while (mod) {
+ if (mod->type == eModifierType_Armature) {
+ ob_arm = ((ArmatureModifierData*)mod)->object;
+ }
+
+ mod = mod->next;
+ }
+ }
+
+ return ob_arm;
+}
+
+std::string ArmatureExporter::get_joint_sid(Bone *bone, Object *ob_arm)
+{
+ return get_joint_id(bone, ob_arm);
+}
+
+// parent_mat is armature-space
+void ArmatureExporter::add_bone_node(Bone *bone, Object *ob_arm)
+{
+ std::string node_id = get_joint_id(bone, ob_arm);
+ std::string node_name = std::string(bone->name);
+ std::string node_sid = get_joint_sid(bone, ob_arm);
+
+ COLLADASW::Node node(mSW);
+
+ node.setType(COLLADASW::Node::JOINT);
+ node.setNodeId(node_id);
+ node.setNodeName(node_name);
+ node.setNodeSid(node_sid);
+
+ node.start();
+
+ add_bone_transform(ob_arm, bone, node);
+
+ for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next) {
+ add_bone_node(child, ob_arm);
+ }
+
+ node.end();
+}
+
+void ArmatureExporter::add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW::Node& node)
+{
+ bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name);
+
+ float mat[4][4];
+
+ if (bone->parent) {
+ // get bone-space matrix from armature-space
+ bPoseChannel *parchan = get_pose_channel(ob_arm->pose, bone->parent->name);
+
+ float invpar[4][4];
+ invert_m4_m4(invpar, parchan->pose_mat);
+ mul_m4_m4m4(mat, pchan->pose_mat, invpar);
+ }
+ else {
+ // get world-space from armature-space
+ mul_m4_m4m4(mat, pchan->pose_mat, ob_arm->obmat);
+ }
+
+ TransformWriter::add_node_transform(node, mat, NULL);
+}
+
+std::string ArmatureExporter::get_controller_id(Object *ob_arm, Object *ob)
+{
+ return translate_id(id_name(ob_arm)) + "_" + translate_id(id_name(ob)) + SKIN_CONTROLLER_ID_SUFFIX;
+}
+
+// ob should be of type OB_MESH
+// both args are required
+void ArmatureExporter::export_controller(Object* ob, Object *ob_arm)
+{
+ // joint names
+ // joint inverse bind matrices
+ // vertex weights
+
+ // input:
+ // joint names: ob -> vertex group names
+ // vertex group weights: me->dvert -> groups -> index, weight
+
+ /*
+ me->dvert:
+
+ typedef struct MDeformVert {
+ struct MDeformWeight *dw;
+ int totweight;
+ int flag; // flag only in use for weightpaint now
+ } MDeformVert;
+
+ typedef struct MDeformWeight {
+ int def_nr;
+ float weight;
+ } MDeformWeight;
+ */
+
+ Mesh *me = (Mesh*)ob->data;
+ if (!me->dvert) return;
+
+ std::string controller_name = id_name(ob_arm);
+ std::string controller_id = get_controller_id(ob_arm, ob);
+
+ openSkin(controller_id, controller_name,
+ COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob)));
+
+ add_bind_shape_mat(ob);
+
+ std::string joints_source_id = add_joints_source(ob_arm, &ob->defbase, controller_id);
+ std::string inv_bind_mat_source_id = add_inv_bind_mats_source(ob_arm, &ob->defbase, controller_id);
+ std::string weights_source_id = add_weights_source(me, controller_id);
+
+ add_joints_element(&ob->defbase, joints_source_id, inv_bind_mat_source_id);
+ add_vertex_weights_element(weights_source_id, joints_source_id, me, ob_arm, &ob->defbase);
+
+ closeSkin();
+ closeController();
+}
+
+void ArmatureExporter::add_joints_element(ListBase *defbase,
+ const std::string& joints_source_id, const std::string& inv_bind_mat_source_id)
+{
+ COLLADASW::JointsElement joints(mSW);
+ COLLADASW::InputList &input = joints.getInputList();
+
+ input.push_back(COLLADASW::Input(COLLADASW::InputSemantic::JOINT, // constant declared in COLLADASWInputList.h
+ COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, joints_source_id)));
+ input.push_back(COLLADASW::Input(COLLADASW::InputSemantic::BINDMATRIX,
+ COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, inv_bind_mat_source_id)));
+ joints.add();
+}
+
+void ArmatureExporter::add_bind_shape_mat(Object *ob)
+{
+ double bind_mat[4][4];
+
+ converter.mat4_to_dae_double(bind_mat, ob->obmat);
+
+ addBindShapeTransform(bind_mat);
+}
+
+std::string ArmatureExporter::add_joints_source(Object *ob_arm, ListBase *defbase, const std::string& controller_id)
+{
+ std::string source_id = controller_id + JOINTS_SOURCE_ID_SUFFIX;
+
+ int totjoint = 0;
+ bDeformGroup *def;
+ for (def = (bDeformGroup*)defbase->first; def; def = def->next) {
+ if (is_bone_defgroup(ob_arm, def))
+ totjoint++;
+ }
+
+ COLLADASW::NameSource source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(totjoint);
+ source.setAccessorStride(1);
+
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("JOINT");
+
+ source.prepareToAppendValues();
+
+ for (def = (bDeformGroup*)defbase->first; def; def = def->next) {
+ Bone *bone = get_bone_from_defgroup(ob_arm, def);
+ if (bone)
+ source.appendValues(get_joint_sid(bone, ob_arm));
+ }
+
+ source.finish();
+
+ return source_id;
+}
+
+std::string ArmatureExporter::add_inv_bind_mats_source(Object *ob_arm, ListBase *defbase, const std::string& controller_id)
+{
+ std::string source_id = controller_id + BIND_POSES_SOURCE_ID_SUFFIX;
+
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(BLI_countlist(defbase));
+ source.setAccessorStride(16);
+
+ source.setParameterTypeName(&COLLADASW::CSWC::CSW_VALUE_TYPE_FLOAT4x4);
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("TRANSFORM");
+
+ source.prepareToAppendValues();
+
+ bPose *pose = ob_arm->pose;
+ bArmature *arm = (bArmature*)ob_arm->data;
+
+ int flag = arm->flag;
+
+ // put armature in rest position
+ if (!(arm->flag & ARM_RESTPOS)) {
+ arm->flag |= ARM_RESTPOS;
+ where_is_pose(scene, ob_arm);
+ }
+
+ for (bDeformGroup *def = (bDeformGroup*)defbase->first; def; def = def->next) {
+ if (is_bone_defgroup(ob_arm, def)) {
+
+ bPoseChannel *pchan = get_pose_channel(pose, def->name);
+
+ float mat[4][4];
+ float world[4][4];
+ float inv_bind_mat[4][4];
+
+ // make world-space matrix, pose_mat is armature-space
+ mul_m4_m4m4(world, pchan->pose_mat, ob_arm->obmat);
+
+ invert_m4_m4(mat, world);
+ converter.mat4_to_dae(inv_bind_mat, mat);
+
+ source.appendValues(inv_bind_mat);
+ }
+ }
+
+ // back from rest positon
+ if (!(flag & ARM_RESTPOS)) {
+ arm->flag = flag;
+ where_is_pose(scene, ob_arm);
+ }
+
+ source.finish();
+
+ return source_id;
+}
+
+Bone *ArmatureExporter::get_bone_from_defgroup(Object *ob_arm, bDeformGroup* def)
+{
+ bPoseChannel *pchan = get_pose_channel(ob_arm->pose, def->name);
+ return pchan ? pchan->bone : NULL;
+}
+
+bool ArmatureExporter::is_bone_defgroup(Object *ob_arm, bDeformGroup* def)
+{
+ return get_bone_from_defgroup(ob_arm, def) != NULL;
+}
+
+std::string ArmatureExporter::add_weights_source(Mesh *me, const std::string& controller_id)
+{
+ std::string source_id = controller_id + WEIGHTS_SOURCE_ID_SUFFIX;
+
+ int i;
+ int totweight = 0;
+
+ for (i = 0; i < me->totvert; i++) {
+ totweight += me->dvert[i].totweight;
+ }
+
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(totweight);
+ source.setAccessorStride(1);
+
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("WEIGHT");
+
+ source.prepareToAppendValues();
+
+ // NOTE: COLLADA spec says weights should be normalized
+
+ for (i = 0; i < me->totvert; i++) {
+ MDeformVert *vert = &me->dvert[i];
+ for (int j = 0; j < vert->totweight; j++) {
+ source.appendValues(vert->dw[j].weight);
+ }
+ }
+
+ source.finish();
+
+ return source_id;
+}
+
+void ArmatureExporter::add_vertex_weights_element(const std::string& weights_source_id, const std::string& joints_source_id, Mesh *me,
+ Object *ob_arm, ListBase *defbase)
+{
+ COLLADASW::VertexWeightsElement weights(mSW);
+ COLLADASW::InputList &input = weights.getInputList();
+
+ int offset = 0;
+ input.push_back(COLLADASW::Input(COLLADASW::InputSemantic::JOINT, // constant declared in COLLADASWInputList.h
+ COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, joints_source_id), offset++));
+ input.push_back(COLLADASW::Input(COLLADASW::InputSemantic::WEIGHT,
+ COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, weights_source_id), offset++));
+
+ weights.setCount(me->totvert);
+
+ // write number of deformers per vertex
+ COLLADASW::PrimitivesBase::VCountList vcount;
+ int i;
+ for (i = 0; i < me->totvert; i++) {
+ vcount.push_back(me->dvert[i].totweight);
+ }
+
+ weights.prepareToAppendVCountValues();
+ weights.appendVertexCount(vcount);
+
+ // def group index -> joint index
+ std::map<int, int> joint_index_by_def_index;
+ bDeformGroup *def;
+ int j;
+ for (def = (bDeformGroup*)defbase->first, i = 0, j = 0; def; def = def->next, i++) {
+ if (is_bone_defgroup(ob_arm, def))
+ joint_index_by_def_index[i] = j++;
+ else
+ joint_index_by_def_index[i] = -1;
+ }
+
+ weights.CloseVCountAndOpenVElement();
+
+ // write deformer index - weight index pairs
+ int weight_index = 0;
+ for (i = 0; i < me->totvert; i++) {
+ MDeformVert *dvert = &me->dvert[i];
+ for (int j = 0; j < dvert->totweight; j++) {
+ weights.appendValues(joint_index_by_def_index[dvert->dw[j].def_nr]);
+ weights.appendValues(weight_index++);
+ }
+ }
+
+ weights.finish();
+}
diff --git a/source/blender/collada/ArmatureExporter.h b/source/blender/collada/ArmatureExporter.h
new file mode 100644
index 00000000000..1d8fa6df96a
--- /dev/null
+++ b/source/blender/collada/ArmatureExporter.h
@@ -0,0 +1,137 @@
+/**
+ * $Id: ArmatureExporter.h 32355 2010-10-06 20:40:16Z gsrb3d $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __ARMATUREEXPORTER_H__
+#define __ARMATUREEXPORTER_H__
+
+#include <string>
+//#include <vector>
+
+#include "COLLADASWStreamWriter.h"
+#include "COLLADASWLibraryControllers.h"
+#include "COLLADASWInputList.h"
+#include "COLLADASWNode.h"
+
+#include "DNA_armature_types.h"
+#include "DNA_listBase.h"
+#include "DNA_mesh_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "TransformWriter.h"
+#include "InstanceWriter.h"
+
+// XXX exporter writes wrong data for shared armatures. A separate
+// controller should be written for each armature-mesh binding how do
+// we make controller ids then?
+class ArmatureExporter: public COLLADASW::LibraryControllers, protected TransformWriter, protected InstanceWriter
+{
+private:
+ Scene *scene;
+
+public:
+ ArmatureExporter(COLLADASW::StreamWriter *sw);
+
+ // write bone nodes
+ void add_armature_bones(Object *ob_arm, Scene *sce);
+
+ bool is_skinned_mesh(Object *ob);
+
+ void add_instance_controller(Object *ob);
+
+ void export_controllers(Scene *sce);
+
+ void operator()(Object *ob);
+
+private:
+
+ UnitConverter converter;
+
+#if 0
+ std::vector<Object*> written_armatures;
+
+ bool already_written(Object *ob_arm);
+
+ void wrote(Object *ob_arm);
+
+ void find_objects_using_armature(Object *ob_arm, std::vector<Object *>& objects, Scene *sce);
+#endif
+
+ Object *get_assigned_armature(Object *ob);
+
+ std::string get_joint_sid(Bone *bone, Object *ob_arm);
+
+ // parent_mat is armature-space
+ void add_bone_node(Bone *bone, Object *ob_arm);
+
+ void add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW::Node& node);
+
+ std::string get_controller_id(Object *ob_arm, Object *ob);
+
+ // ob should be of type OB_MESH
+ // both args are required
+ void export_controller(Object* ob, Object *ob_arm);
+
+ void add_joints_element(ListBase *defbase,
+ const std::string& joints_source_id, const std::string& inv_bind_mat_source_id);
+
+ void add_bind_shape_mat(Object *ob);
+
+ std::string add_joints_source(Object *ob_arm, ListBase *defbase, const std::string& controller_id);
+
+ std::string add_inv_bind_mats_source(Object *ob_arm, ListBase *defbase, const std::string& controller_id);
+
+ Bone *get_bone_from_defgroup(Object *ob_arm, bDeformGroup* def);
+
+ bool is_bone_defgroup(Object *ob_arm, bDeformGroup* def);
+
+ std::string add_weights_source(Mesh *me, const std::string& controller_id);
+
+ void add_vertex_weights_element(const std::string& weights_source_id, const std::string& joints_source_id, Mesh *me,
+ Object *ob_arm, ListBase *defbase);
+};
+
+/*
+struct GeometryFunctor {
+ // f should have
+ // void operator()(Object* ob)
+ template<class Functor>
+ void forEachMeshObjectInScene(Scene *sce, Functor &f)
+ {
+
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ if (ob->type == OB_MESH && ob->data) {
+ f(ob);
+ }
+ base= base->next;
+
+ }
+ }
+};*/
+
+#endif
diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp
new file mode 100644
index 00000000000..072ef306773
--- /dev/null
+++ b/source/blender/collada/ArmatureImporter.cpp
@@ -0,0 +1,587 @@
+/**
+ * $Id: ArmatureImporter.cpp 34787 2011-02-12 06:25:04Z campbellbarton $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* COLLADABU_ASSERT, may be able to remove later */
+#include "COLLADABUPlatform.h"
+
+#include <algorithm>
+
+#include "COLLADAFWUniqueId.h"
+
+#include "BKE_action.h"
+#include "BKE_depsgraph.h"
+#include "BKE_object.h"
+#include "BLI_string.h"
+#include "ED_armature.h"
+
+#include "ArmatureImporter.h"
+
+// use this for retrieving bone names, since these must be unique
+template<class T>
+static const char *bc_get_joint_name(T *node)
+{
+ const std::string& id = node->getOriginalId();
+ return id.size() ? id.c_str() : node->getName().c_str();
+}
+
+ArmatureImporter::ArmatureImporter(UnitConverter *conv, MeshImporterBase *mesh, AnimationImporterBase *anim, Scene *sce) :
+ TransformReader(conv), scene(sce), empty(NULL), mesh_importer(mesh), anim_importer(anim) {}
+
+ArmatureImporter::~ArmatureImporter()
+{
+ // free skin controller data if we forget to do this earlier
+ std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
+ for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
+ it->second.free();
+ }
+}
+
+#if 0
+JointData *ArmatureImporter::get_joint_data(COLLADAFW::Node *node);
+{
+ const COLLADAFW::UniqueId& joint_id = node->getUniqueId();
+
+ if (joint_id_to_joint_index_map.find(joint_id) == joint_id_to_joint_index_map.end()) {
+ fprintf(stderr, "Cannot find a joint index by joint id for %s.\n",
+ node->getOriginalId().c_str());
+ return NULL;
+ }
+
+ int joint_index = joint_id_to_joint_index_map[joint_id];
+
+ return &joint_index_to_joint_info_map[joint_index];
+}
+#endif
+
+void ArmatureImporter::create_bone(SkinInfo& skin, COLLADAFW::Node *node, EditBone *parent, int totchild,
+ float parent_mat[][4], bArmature *arm)
+{
+ float joint_inv_bind_mat[4][4];
+
+ // JointData* jd = get_joint_data(node);
+
+ float mat[4][4];
+
+ if (skin.get_joint_inv_bind_matrix(joint_inv_bind_mat, node)) {
+ // get original world-space matrix
+ invert_m4_m4(mat, joint_inv_bind_mat);
+ }
+ // create a bone even if there's no joint data for it (i.e. it has no influence)
+ else {
+ float obmat[4][4];
+
+ // object-space
+ get_node_mat(obmat, node, NULL, NULL);
+
+ // get world-space
+ if (parent)
+ mul_m4_m4m4(mat, obmat, parent_mat);
+ else
+ copy_m4_m4(mat, obmat);
+ }
+
+ // TODO rename from Node "name" attrs later
+ EditBone *bone = ED_armature_edit_bone_add(arm, (char*)bc_get_joint_name(node));
+ totbone++;
+
+ if (parent) bone->parent = parent;
+
+ // set head
+ copy_v3_v3(bone->head, mat[3]);
+
+ // set tail, don't set it to head because 0-length bones are not allowed
+ float vec[3] = {0.0f, 0.5f, 0.0f};
+ add_v3_v3v3(bone->tail, bone->head, vec);
+
+ // set parent tail
+ if (parent && totchild == 1) {
+ copy_v3_v3(parent->tail, bone->head);
+
+ // not setting BONE_CONNECTED because this would lock child bone location with respect to parent
+ // bone->flag |= BONE_CONNECTED;
+
+ // XXX increase this to prevent "very" small bones?
+ const float epsilon = 0.000001f;
+
+ // derive leaf bone length
+ float length = len_v3v3(parent->head, parent->tail);
+ if ((length < leaf_bone_length || totbone == 0) && length > epsilon) {
+ leaf_bone_length = length;
+ }
+
+ // treat zero-sized bone like a leaf bone
+ if (length <= epsilon) {
+ add_leaf_bone(parent_mat, parent);
+ }
+
+ /*
+#if 0
+ // and which row in mat is bone direction
+ float vec[3];
+ sub_v3_v3v3(vec, parent->tail, parent->head);
+#ifdef COLLADA_DEBUG
+ print_v3("tail - head", vec);
+ print_m4("matrix", parent_mat);
+#endif
+ for (int i = 0; i < 3; i++) {
+#ifdef COLLADA_DEBUG
+ char *axis_names[] = {"X", "Y", "Z"};
+ printf("%s-axis length is %f\n", axis_names[i], len_v3(parent_mat[i]));
+#endif
+ float angle = angle_v2v2(vec, parent_mat[i]);
+ if (angle < min_angle) {
+#ifdef COLLADA_DEBUG
+ print_v3("picking", parent_mat[i]);
+ printf("^ %s axis of %s's matrix\n", axis_names[i], get_dae_name(node));
+#endif
+ bone_direction_row = i;
+ min_angle = angle;
+ }
+ }
+#endif
+ */
+ }
+
+ COLLADAFW::NodePointerArray& children = node->getChildNodes();
+ for (unsigned int i = 0; i < children.getCount(); i++) {
+ create_bone(skin, children[i], bone, children.getCount(), mat, arm);
+ }
+
+ // in second case it's not a leaf bone, but we handle it the same way
+ if (!children.getCount() || children.getCount() > 1) {
+ add_leaf_bone(mat, bone);
+ }
+}
+
+void ArmatureImporter::add_leaf_bone(float mat[][4], EditBone *bone)
+{
+ LeafBone leaf;
+
+ leaf.bone = bone;
+ copy_m4_m4(leaf.mat, mat);
+ BLI_strncpy(leaf.name, bone->name, sizeof(leaf.name));
+
+ leaf_bones.push_back(leaf);
+}
+
+void ArmatureImporter::fix_leaf_bones()
+{
+ // just setting tail for leaf bones here
+
+ std::vector<LeafBone>::iterator it;
+ for (it = leaf_bones.begin(); it != leaf_bones.end(); it++) {
+ LeafBone& leaf = *it;
+
+ // pointing up
+ float vec[3] = {0.0f, 0.0f, 1.0f};
+
+ mul_v3_fl(vec, leaf_bone_length);
+
+ copy_v3_v3(leaf.bone->tail, leaf.bone->head);
+ add_v3_v3v3(leaf.bone->tail, leaf.bone->head, vec);
+ }
+}
+
+#if 0
+void ArmatureImporter::set_leaf_bone_shapes(Object *ob_arm)
+{
+ bPose *pose = ob_arm->pose;
+
+ std::vector<LeafBone>::iterator it;
+ for (it = leaf_bones.begin(); it != leaf_bones.end(); it++) {
+ LeafBone& leaf = *it;
+
+ bPoseChannel *pchan = get_pose_channel(pose, leaf.name);
+ if (pchan) {
+ pchan->custom = get_empty_for_leaves();
+ }
+ else {
+ fprintf(stderr, "Cannot find a pose channel for leaf bone %s\n", leaf.name);
+ }
+ }
+}
+
+void ArmatureImporter::set_euler_rotmode()
+{
+ // just set rotmode = ROT_MODE_EUL on pose channel for each joint
+
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>::iterator it;
+
+ for (it = joint_by_uid.begin(); it != joint_by_uid.end(); it++) {
+
+ COLLADAFW::Node *joint = it->second;
+
+ std::map<COLLADAFW::UniqueId, SkinInfo>::iterator sit;
+
+ for (sit = skin_by_data_uid.begin(); sit != skin_by_data_uid.end(); sit++) {
+ SkinInfo& skin = sit->second;
+
+ if (skin.uses_joint_or_descendant(joint)) {
+ bPoseChannel *pchan = skin.get_pose_channel_from_node(joint);
+
+ if (pchan) {
+ pchan->rotmode = ROT_MODE_EUL;
+ }
+ else {
+ fprintf(stderr, "Cannot find pose channel for %s.\n", get_joint_name(joint));
+ }
+
+ break;
+ }
+ }
+ }
+}
+#endif
+
+Object *ArmatureImporter::get_empty_for_leaves()
+{
+ if (empty) return empty;
+
+ empty = add_object(scene, OB_EMPTY);
+ empty->empty_drawtype = OB_EMPTY_SPHERE;
+
+ return empty;
+}
+
+#if 0
+Object *ArmatureImporter::find_armature(COLLADAFW::Node *node)
+{
+ JointData* jd = get_joint_data(node);
+ if (jd) return jd->ob_arm;
+
+ COLLADAFW::NodePointerArray& children = node->getChildNodes();
+ for (int i = 0; i < children.getCount(); i++) {
+ Object *ob_arm = find_armature(children[i]);
+ if (ob_arm) return ob_arm;
+ }
+
+ return NULL;
+}
+
+ArmatureJoints& ArmatureImporter::get_armature_joints(Object *ob_arm)
+{
+ // try finding it
+ std::vector<ArmatureJoints>::iterator it;
+ for (it = armature_joints.begin(); it != armature_joints.end(); it++) {
+ if ((*it).ob_arm == ob_arm) return *it;
+ }
+
+ // not found, create one
+ ArmatureJoints aj;
+ aj.ob_arm = ob_arm;
+ armature_joints.push_back(aj);
+
+ return armature_joints.back();
+}
+#endif
+
+void ArmatureImporter::create_armature_bones(SkinInfo& skin)
+{
+ // just do like so:
+ // - get armature
+ // - enter editmode
+ // - add edit bones and head/tail properties using matrices and parent-child info
+ // - exit edit mode
+ // - set a sphere shape to leaf bones
+
+ Object *ob_arm = NULL;
+
+ /*
+ * find if there's another skin sharing at least one bone with this skin
+ * if so, use that skin's armature
+ */
+
+ /*
+ Pseudocode:
+
+ find_node_in_tree(node, root_joint)
+
+ skin::find_root_joints(root_joints):
+ std::vector root_joints;
+ for each root in root_joints:
+ for each joint in joints:
+ if find_node_in_tree(joint, root):
+ if (std::find(root_joints.begin(), root_joints.end(), root) == root_joints.end())
+ root_joints.push_back(root);
+
+ for (each skin B with armature) {
+ find all root joints for skin B
+
+ for each joint X in skin A:
+ for each root joint R in skin B:
+ if (find_node_in_tree(X, R)) {
+ shared = 1;
+ goto endloop;
+ }
+ }
+
+ endloop:
+ */
+
+ SkinInfo *a = &skin;
+ Object *shared = NULL;
+ std::vector<COLLADAFW::Node*> skin_root_joints;
+
+ std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
+ for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
+ SkinInfo *b = &it->second;
+ if (b == a || b->get_armature() == NULL)
+ continue;
+
+ skin_root_joints.clear();
+
+ b->find_root_joints(root_joints, joint_by_uid, skin_root_joints);
+
+ std::vector<COLLADAFW::Node*>::iterator ri;
+ for (ri = skin_root_joints.begin(); ri != skin_root_joints.end(); ri++) {
+ if (a->uses_joint_or_descendant(*ri)) {
+ shared = b->get_armature();
+ break;
+ }
+ }
+
+ if (shared != NULL)
+ break;
+ }
+
+ if (shared)
+ ob_arm = skin.set_armature(shared);
+ else
+ ob_arm = skin.create_armature(scene);
+
+ // enter armature edit mode
+ ED_armature_to_edit(ob_arm);
+
+ leaf_bones.clear();
+ totbone = 0;
+ // bone_direction_row = 1; // TODO: don't default to Y but use asset and based on it decide on default row
+ leaf_bone_length = FLT_MAX;
+ // min_angle = 360.0f; // minimum angle between bone head-tail and a row of bone matrix
+
+ // create bones
+ /*
+ TODO:
+ check if bones have already been created for a given joint
+ */
+
+ std::vector<COLLADAFW::Node*>::iterator ri;
+ for (ri = root_joints.begin(); ri != root_joints.end(); ri++) {
+ // for shared armature check if bone tree is already created
+ if (shared && std::find(skin_root_joints.begin(), skin_root_joints.end(), *ri) != skin_root_joints.end())
+ continue;
+
+ // since root_joints may contain joints for multiple controllers, we need to filter
+ if (skin.uses_joint_or_descendant(*ri)) {
+ create_bone(skin, *ri, NULL, (*ri)->getChildNodes().getCount(), NULL, (bArmature*)ob_arm->data);
+
+ if (joint_parent_map.find((*ri)->getUniqueId()) != joint_parent_map.end() && !skin.get_parent())
+ skin.set_parent(joint_parent_map[(*ri)->getUniqueId()]);
+ }
+ }
+
+ fix_leaf_bones();
+
+ // exit armature edit mode
+ ED_armature_from_edit(ob_arm);
+ ED_armature_edit_free(ob_arm);
+ DAG_id_tag_update(&ob_arm->id, OB_RECALC_OB|OB_RECALC_DATA);
+
+ // set_leaf_bone_shapes(ob_arm);
+ // set_euler_rotmode();
+}
+
+
+// root - if this joint is the top joint in hierarchy, if a joint
+// is a child of a node (not joint), root should be true since
+// this is where we build armature bones from
+void ArmatureImporter::add_joint(COLLADAFW::Node *node, bool root, Object *parent)
+{
+ joint_by_uid[node->getUniqueId()] = node;
+ if (root) {
+ root_joints.push_back(node);
+
+ if (parent)
+ joint_parent_map[node->getUniqueId()] = parent;
+ }
+}
+
+#if 0
+void ArmatureImporter::add_root_joint(COLLADAFW::Node *node)
+{
+ // root_joints.push_back(node);
+ Object *ob_arm = find_armature(node);
+ if (ob_arm) {
+ get_armature_joints(ob_arm).root_joints.push_back(node);
+ }
+#ifdef COLLADA_DEBUG
+ else {
+ fprintf(stderr, "%s cannot be added to armature.\n", get_joint_name(node));
+ }
+#endif
+}
+#endif
+
+// here we add bones to armatures, having armatures previously created in write_controller
+void ArmatureImporter::make_armatures(bContext *C)
+{
+ std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
+ for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
+
+ SkinInfo& skin = it->second;
+
+ create_armature_bones(skin);
+
+ // link armature with a mesh object
+ Object *ob = mesh_importer->get_object_by_geom_uid(*get_geometry_uid(skin.get_controller_uid()));
+ if (ob)
+ skin.link_armature(C, ob, joint_by_uid, this);
+ else
+ fprintf(stderr, "Cannot find object to link armature with.\n");
+
+ // set armature parent if any
+ Object *par = skin.get_parent();
+ if (par)
+ bc_set_parent(skin.get_armature(), par, C, false);
+
+ // free memory stolen from SkinControllerData
+ skin.free();
+ }
+}
+
+#if 0
+// link with meshes, create vertex groups, assign weights
+void ArmatureImporter::link_armature(Object *ob_arm, const COLLADAFW::UniqueId& geom_id, const COLLADAFW::UniqueId& controller_data_id)
+{
+ Object *ob = mesh_importer->get_object_by_geom_uid(geom_id);
+
+ if (!ob) {
+ fprintf(stderr, "Cannot find object by geometry UID.\n");
+ return;
+ }
+
+ if (skin_by_data_uid.find(controller_data_id) == skin_by_data_uid.end()) {
+ fprintf(stderr, "Cannot find skin info by controller data UID.\n");
+ return;
+ }
+
+ SkinInfo& skin = skin_by_data_uid[conroller_data_id];
+
+ // create vertex groups
+}
+#endif
+
+bool ArmatureImporter::write_skin_controller_data(const COLLADAFW::SkinControllerData* data)
+{
+ // at this stage we get vertex influence info that should go into me->verts and ob->defbase
+ // there's no info to which object this should be long so we associate it with skin controller data UID
+
+ // don't forget to call defgroup_unique_name before we copy
+
+ // controller data uid -> [armature] -> joint data,
+ // [mesh object]
+ //
+
+ SkinInfo skin(unit_converter);
+ skin.borrow_skin_controller_data(data);
+
+ // store join inv bind matrix to use it later in armature construction
+ const COLLADAFW::Matrix4Array& inv_bind_mats = data->getInverseBindMatrices();
+ for (unsigned int i = 0; i < data->getJointsCount(); i++) {
+ skin.add_joint(inv_bind_mats[i]);
+ }
+
+ skin_by_data_uid[data->getUniqueId()] = skin;
+
+ return true;
+}
+
+bool ArmatureImporter::write_controller(const COLLADAFW::Controller* controller)
+{
+ // - create and store armature object
+
+ const COLLADAFW::UniqueId& skin_id = controller->getUniqueId();
+
+ if (controller->getControllerType() == COLLADAFW::Controller::CONTROLLER_TYPE_SKIN) {
+ COLLADAFW::SkinController *co = (COLLADAFW::SkinController*)controller;
+ // to be able to find geom id by controller id
+ geom_uid_by_controller_uid[skin_id] = co->getSource();
+
+ const COLLADAFW::UniqueId& data_uid = co->getSkinControllerData();
+ if (skin_by_data_uid.find(data_uid) == skin_by_data_uid.end()) {
+ fprintf(stderr, "Cannot find skin by controller data UID.\n");
+ return true;
+ }
+
+ skin_by_data_uid[data_uid].set_controller(co);
+ }
+ // morph controller
+ else {
+ // shape keys? :)
+ fprintf(stderr, "Morph controller is not supported yet.\n");
+ }
+
+ return true;
+}
+
+COLLADAFW::UniqueId *ArmatureImporter::get_geometry_uid(const COLLADAFW::UniqueId& controller_uid)
+{
+ if (geom_uid_by_controller_uid.find(controller_uid) == geom_uid_by_controller_uid.end())
+ return NULL;
+
+ return &geom_uid_by_controller_uid[controller_uid];
+}
+
+Object *ArmatureImporter::get_armature_for_joint(COLLADAFW::Node *node)
+{
+ std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
+ for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
+ SkinInfo& skin = it->second;
+
+ if (skin.uses_joint_or_descendant(node))
+ return skin.get_armature();
+ }
+
+ return NULL;
+}
+
+void ArmatureImporter::get_rna_path_for_joint(COLLADAFW::Node *node, char *joint_path, size_t count)
+{
+ BLI_snprintf(joint_path, count, "pose.bones[\"%s\"]", bc_get_joint_name(node));
+}
+
+// gives a world-space mat
+bool ArmatureImporter::get_joint_bind_mat(float m[][4], COLLADAFW::Node *joint)
+{
+ std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
+ bool found = false;
+ for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
+ SkinInfo& skin = it->second;
+ if ((found = skin.get_joint_inv_bind_matrix(m, joint))) {
+ invert_m4(m);
+ break;
+ }
+ }
+
+ return found;
+}
diff --git a/source/blender/collada/ArmatureImporter.h b/source/blender/collada/ArmatureImporter.h
new file mode 100644
index 00000000000..b682cb1c343
--- /dev/null
+++ b/source/blender/collada/ArmatureImporter.h
@@ -0,0 +1,159 @@
+/**
+ * $Id: ArmatureImporter.h 33832 2010-12-21 10:43:47Z jesterking $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __BC_ARMATUREIMPORTER_H__
+#define __BC_ARMATUREIMPORTER_H__
+
+#include "COLLADAFWNode.h"
+#include "COLLADAFWUniqueId.h"
+
+extern "C" {
+#include "BKE_context.h"
+
+#include "DNA_armature_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "ED_armature.h"
+}
+
+#include "AnimationImporter.h"
+#include "MeshImporter.h"
+#include "SkinInfo.h"
+#include "TransformReader.h"
+
+#include <map>
+#include <vector>
+
+#include "collada_internal.h"
+#include "collada_utils.h"
+
+class ArmatureImporter : private TransformReader
+{
+private:
+ Scene *scene;
+ UnitConverter *unit_converter;
+
+ // std::map<int, JointData> joint_index_to_joint_info_map;
+ // std::map<COLLADAFW::UniqueId, int> joint_id_to_joint_index_map;
+
+ struct LeafBone {
+ // COLLADAFW::Node *node;
+ EditBone *bone;
+ char name[32];
+ float mat[4][4]; // bone matrix, derived from inv_bind_mat
+ };
+ std::vector<LeafBone> leaf_bones;
+ // int bone_direction_row; // XXX not used
+ float leaf_bone_length;
+ int totbone;
+ // XXX not used
+ // float min_angle; // minimum angle between bone head-tail and a row of bone matrix
+
+#if 0
+ struct ArmatureJoints {
+ Object *ob_arm;
+ std::vector<COLLADAFW::Node*> root_joints;
+ };
+ std::vector<ArmatureJoints> armature_joints;
+#endif
+
+ Object *empty; // empty for leaf bones
+
+ std::map<COLLADAFW::UniqueId, COLLADAFW::UniqueId> geom_uid_by_controller_uid;
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> joint_by_uid; // contains all joints
+ std::vector<COLLADAFW::Node*> root_joints;
+ std::map<COLLADAFW::UniqueId, Object*> joint_parent_map;
+
+ MeshImporterBase *mesh_importer;
+ AnimationImporterBase *anim_importer;
+
+ // This is used to store data passed in write_controller_data.
+ // Arrays from COLLADAFW::SkinControllerData lose ownership, so do this class members
+ // so that arrays don't get freed until we free them explicitly.
+
+ std::map<COLLADAFW::UniqueId, SkinInfo> skin_by_data_uid; // data UID = skin controller data UID
+#if 0
+ JointData *get_joint_data(COLLADAFW::Node *node);
+#endif
+
+ void create_bone(SkinInfo& skin, COLLADAFW::Node *node, EditBone *parent, int totchild,
+ float parent_mat[][4], bArmature *arm);
+
+ void add_leaf_bone(float mat[][4], EditBone *bone);
+
+ void fix_leaf_bones();
+
+#if 0
+ void set_leaf_bone_shapes(Object *ob_arm);
+ void set_euler_rotmode();
+#endif
+
+ Object *get_empty_for_leaves();
+
+#if 0
+ Object *find_armature(COLLADAFW::Node *node);
+
+ ArmatureJoints& get_armature_joints(Object *ob_arm);
+#endif
+
+ void create_armature_bones(SkinInfo& skin);
+
+public:
+
+ ArmatureImporter(UnitConverter *conv, MeshImporterBase *mesh, AnimationImporterBase *anim, Scene *sce);
+ ~ArmatureImporter();
+
+ // root - if this joint is the top joint in hierarchy, if a joint
+ // is a child of a node (not joint), root should be true since
+ // this is where we build armature bones from
+ void add_joint(COLLADAFW::Node *node, bool root, Object *parent);
+
+#if 0
+ void add_root_joint(COLLADAFW::Node *node);
+#endif
+
+ // here we add bones to armatures, having armatures previously created in write_controller
+ void make_armatures(bContext *C);
+
+#if 0
+ // link with meshes, create vertex groups, assign weights
+ void link_armature(Object *ob_arm, const COLLADAFW::UniqueId& geom_id, const COLLADAFW::UniqueId& controller_data_id);
+#endif
+
+ bool write_skin_controller_data(const COLLADAFW::SkinControllerData* data);
+
+ bool write_controller(const COLLADAFW::Controller* controller);
+
+ COLLADAFW::UniqueId *get_geometry_uid(const COLLADAFW::UniqueId& controller_uid);
+
+ Object *get_armature_for_joint(COLLADAFW::Node *node);
+
+ void get_rna_path_for_joint(COLLADAFW::Node *node, char *joint_path, size_t count);
+
+ // gives a world-space mat
+ bool get_joint_bind_mat(float m[][4], COLLADAFW::Node *joint);
+};
+
+#endif
diff --git a/source/blender/collada/CMakeLists.txt b/source/blender/collada/CMakeLists.txt
index a72ecc4be6c..ce204013f3d 100644
--- a/source/blender/collada/CMakeLists.txt
+++ b/source/blender/collada/CMakeLists.txt
@@ -24,45 +24,84 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
+remove_strict_flags()
-IF(APPLE)
-SET(INC
- .
- ../blenlib
- ../blenkernel
- ../windowmanager
- ../makesdna
- ../makesrna
- ../editors/include
- ../../../intern/guardedalloc
- ${OPENCOLLADA_INC}/COLLADAStreamWriter
- ${OPENCOLLADA_INC}/COLLADABaseUtils
- ${OPENCOLLADA_INC}/COLLADAFramework
- ${OPENCOLLADA_INC}/COLLADASaxFrameworkLoader
+set(INC
+ .
+ ../blenlib
+ ../blenkernel
+ ../windowmanager
+ ../makesdna
+ ../makesrna
+ ../editors/include
+ ../../../intern/guardedalloc
)
-ELSE(APPLE)
+if(APPLE)
+ list(APPEND INC
+ ${OPENCOLLADA_INC}/COLLADAStreamWriter
+ ${OPENCOLLADA_INC}/COLLADABaseUtils
+ ${OPENCOLLADA_INC}/COLLADAFramework
+ ${OPENCOLLADA_INC}/COLLADASaxFrameworkLoader
+ )
+else()
+ list(APPEND INC
+ ${OPENCOLLADA_INC}/COLLADAStreamWriter/include
+ ${OPENCOLLADA_INC}/COLLADABaseUtils/include
+ ${OPENCOLLADA_INC}/COLLADAFramework/include
+ ${OPENCOLLADA_INC}/COLLADASaxFrameworkLoader/include
+ )
+endif()
-SET(INC
- .
- ../blenlib
- ../blenkernel
- ../windowmanager
- ../makesdna
- ../makesrna
- ../editors/include
- ../../../intern/guardedalloc
- ${OPENCOLLADA_INC}/COLLADAStreamWriter/include
- ${OPENCOLLADA_INC}/COLLADABaseUtils/include
- ${OPENCOLLADA_INC}/COLLADAFramework/include
- ${OPENCOLLADA_INC}/COLLADASaxFrameworkLoader/include
+set(SRC
+ AnimationImporter.cpp
+ ArmatureExporter.cpp
+ ArmatureImporter.cpp
+ CameraExporter.cpp
+ DocumentExporter.cpp
+ DocumentImporter.cpp
+ EffectExporter.cpp
+ GeometryExporter.cpp
+ ImageExporter.cpp
+ InstanceWriter.cpp
+ LightExporter.cpp
+ MaterialExporter.cpp
+ MeshImporter.cpp
+ SkinInfo.cpp
+ TransformReader.cpp
+ TransformWriter.cpp
+ collada.cpp
+ collada_internal.cpp
+ collada_utils.cpp
+
+ AnimationImporter.h
+ ArmatureExporter.h
+ ArmatureImporter.h
+ CameraExporter.h
+ DocumentExporter.h
+ DocumentImporter.h
+ EffectExporter.h
+ GeometryExporter.h
+ ImageExporter.h
+ InstanceWriter.h
+ LightExporter.h
+ MaterialExporter.h
+ MeshImporter.h
+ SkinInfo.h
+ TransformReader.h
+ TransformWriter.h
+ collada.h
+ collada_internal.h
+ collada_utils.h
)
-ENDIF(APPLE)
+if(WITH_BUILDINFO)
+ add_definitions(-DNAN_BUILDINFO)
+endif()
-IF(WITH_BUILDINFO)
- ADD_DEFINITIONS(-DNAN_BUILDINFO)
-ENDIF(WITH_BUILDINFO)
+if(CMAKE_COMPILER_IS_GNUCXX)
+ # COLLADAFWArray.h gives error with gcc 4.5
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive")
+endif()
-BLENDERLIB(bf_collada "${SRC}" "${INC}")
+blender_add_lib(bf_collada "${SRC}" "${INC}")
diff --git a/source/blender/collada/CameraExporter.cpp b/source/blender/collada/CameraExporter.cpp
new file mode 100644
index 00000000000..9c33a4f4a83
--- /dev/null
+++ b/source/blender/collada/CameraExporter.cpp
@@ -0,0 +1,86 @@
+/**
+ * $Id: CameraExporter.cpp 32546 2010-10-18 00:46:41Z jesterking $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string>
+
+#include "COLLADASWCamera.h"
+#include "COLLADASWCameraOptic.h"
+
+#include "DNA_camera_types.h"
+
+#include "CameraExporter.h"
+
+#include "collada_internal.h"
+
+CamerasExporter::CamerasExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryCameras(sw){}
+
+template<class Functor>
+void forEachCameraObjectInScene(Scene *sce, Functor &f)
+{
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ if (ob->type == OB_CAMERA && ob->data) {
+ f(ob, sce);
+ }
+ base= base->next;
+ }
+}
+
+void CamerasExporter::exportCameras(Scene *sce)
+{
+ openLibrary();
+
+ forEachCameraObjectInScene(sce, *this);
+
+ closeLibrary();
+}
+void CamerasExporter::operator()(Object *ob, Scene *sce)
+{
+ // TODO: shiftx, shifty, YF_dofdist
+ Camera *cam = (Camera*)ob->data;
+ std::string cam_id(get_camera_id(ob));
+ std::string cam_name(id_name(cam));
+
+ if (cam->type == CAM_PERSP) {
+ COLLADASW::PerspectiveOptic persp(mSW);
+ persp.setXFov(lens_to_angle(cam->lens)*(180.0f/M_PI));
+ persp.setAspectRatio((float)(sce->r.xsch)/(float)(sce->r.ysch));
+ persp.setZFar(cam->clipend);
+ persp.setZNear(cam->clipsta);
+ COLLADASW::Camera ccam(mSW, &persp, cam_id, cam_name);
+ addCamera(ccam);
+ }
+ else {
+ COLLADASW::OrthographicOptic ortho(mSW);
+ ortho.setXMag(cam->ortho_scale);
+ ortho.setAspectRatio((float)(sce->r.xsch)/(float)(sce->r.ysch));
+ ortho.setZFar(cam->clipend);
+ ortho.setZNear(cam->clipsta);
+ COLLADASW::Camera ccam(mSW, &ortho, cam_id, cam_name);
+ addCamera(ccam);
+ }
+}
diff --git a/source/blender/verify/BLO_signer_info.h b/source/blender/collada/CameraExporter.h
index 39059cf94a7..4ed310ea44f 100644
--- a/source/blender/verify/BLO_signer_info.h
+++ b/source/blender/collada/CameraExporter.h
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id: CameraExporter.h 32355 2010-10-06 20:40:16Z gsrb3d $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -17,29 +17,27 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
*
* ***** END GPL LICENSE BLOCK *****
- *
*/
-#include "BLO_sign_verify_Header.h"
+#ifndef __CAMERAEXPORTER_H__
+#define __CAMERAEXPORTER_H__
-/* external struct for signer info */
+#include "COLLADASWStreamWriter.h"
+#include "COLLADASWLibraryCameras.h"
-struct BLO_SignerInfo {
- char name[MAXSIGNERLEN];
- char email[MAXSIGNERLEN];
- char homeUrl[MAXSIGNERLEN];
- /* more to come... */
-};
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
-struct BLO_SignerInfo *BLO_getSignerInfo(void);
-int BLO_isValidSignerInfo(struct BLO_SignerInfo *info);
-void BLO_clrSignerInfo(struct BLO_SignerInfo *info);
+class CamerasExporter: COLLADASW::LibraryCameras
+{
+public:
+ CamerasExporter(COLLADASW::StreamWriter *sw);
+ void exportCameras(Scene *sce);
+ void operator()(Object *ob, Scene *sce);
+};
+#endif
diff --git a/source/blender/collada/DocumentExporter.cpp b/source/blender/collada/DocumentExporter.cpp
index 9fdc07f391b..ea91a42581a 100644
--- a/source/blender/collada/DocumentExporter.cpp
+++ b/source/blender/collada/DocumentExporter.cpp
@@ -25,6 +25,8 @@
#include <stdio.h>
#include <math.h>
+extern "C"
+{
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
#include "DNA_meshdata_types.h"
@@ -32,16 +34,13 @@
#include "DNA_image_types.h"
#include "DNA_material_types.h"
#include "DNA_texture_types.h"
-#include "DNA_camera_types.h"
-#include "DNA_lamp_types.h"
#include "DNA_anim_types.h"
#include "DNA_action_types.h"
#include "DNA_curve_types.h"
#include "DNA_armature_types.h"
#include "DNA_modifier_types.h"
+#include "DNA_userdef_types.h"
-extern "C"
-{
#include "BKE_DerivedMesh.h"
#include "BKE_fcurve.h"
#include "BKE_animsys.h"
@@ -70,10 +69,11 @@ extern char build_rev[];
#include "BLI_string.h"
#include "BLI_listbase.h"
+#include "RNA_access.h"
+
#include "COLLADASWAsset.h"
#include "COLLADASWLibraryVisualScenes.h"
#include "COLLADASWNode.h"
-#include "COLLADASWLibraryGeometries.h"
#include "COLLADASWSource.h"
#include "COLLADASWInstanceGeometry.h"
#include "COLLADASWInputList.h"
@@ -90,16 +90,12 @@ extern char build_rev[];
#include "COLLADASWSurfaceInitOption.h"
#include "COLLADASWSampler.h"
#include "COLLADASWScene.h"
-//#include "COLLADASWSurface.h"
#include "COLLADASWTechnique.h"
#include "COLLADASWTexture.h"
#include "COLLADASWLibraryMaterials.h"
#include "COLLADASWBindMaterial.h"
-#include "COLLADASWLibraryCameras.h"
-#include "COLLADASWLibraryLights.h"
#include "COLLADASWInstanceCamera.h"
#include "COLLADASWInstanceLight.h"
-#include "COLLADASWCameraOptic.h"
#include "COLLADASWConstants.h"
#include "COLLADASWLibraryControllers.h"
#include "COLLADASWInstanceController.h"
@@ -108,35 +104,22 @@ extern char build_rev[];
#include "collada_internal.h"
#include "DocumentExporter.h"
+// can probably go after refactor is complete
+#include "InstanceWriter.h"
+#include "TransformWriter.h"
+
+#include "ArmatureExporter.h"
+#include "CameraExporter.h"
+#include "EffectExporter.h"
+#include "GeometryExporter.h"
+#include "ImageExporter.h"
+#include "LightExporter.h"
+#include "MaterialExporter.h"
+
#include <vector>
#include <algorithm> // std::find
-// arithb.c now has QuatToAxisAngle too
-#if 0
-// This function assumes that quat is normalized.
-// The following document was used as reference:
-// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
-void quat_to_axis_angle( float *axis, float *angle,float *q)
-{
- // quat to axis angle
- *angle = 2 * acos(q[0]);
- float divisor = sqrt(1 - q[0] * q[0]);
-
- // test to avoid divide by zero, divisor is always positive
- if (divisor < 0.001f ) {
- axis[0] = 1.0f;
- axis[1] = 0.0f;
- axis[2] = 0.0f;
- }
- else {
- axis[0] = q[1] / divisor;
- axis[1] = q[2] / divisor;
- axis[2] = q[3] / divisor;
- }
-}
-#endif
-
-char *CustomData_get_layer_name(const struct CustomData *data, int type, int n)
+char *bc_CustomData_get_layer_name(const struct CustomData *data, int type, int n)
{
int layer_index = CustomData_get_layer_index(data, type);
if(layer_index < 0) return NULL;
@@ -144,7 +127,7 @@ char *CustomData_get_layer_name(const struct CustomData *data, int type, int n)
return data->layers[layer_index+n].name;
}
-char *CustomData_get_active_layer_name(const CustomData *data, int type)
+char *bc_CustomData_get_active_layer_name(const CustomData *data, int type)
{
/* get the layer index of the active layer of type */
int layer_index = CustomData_get_active_layer_index(data, type);
@@ -153,185 +136,12 @@ char *CustomData_get_active_layer_name(const CustomData *data, int type)
return data->layers[layer_index].name;
}
-/**
-Translation map.
-Used to translate every COLLADA id to a valid id, no matter what "wrong" letters may be
-included. Look at the IDREF XSD declaration for more.
-Follows strictly the COLLADA XSD declaration which explicitly allows non-english chars,
-like special chars (e.g. micro sign), umlauts and so on.
-The COLLADA spec also allows additional chars for member access ('.'), these
-must obviously be removed too, otherwise they would be heavily misinterpreted.
-*/
-const unsigned char translate_start_name_map[256] = {
-95, 95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-65, 66, 67, 68, 69, 70, 71, 72,
-73, 74, 75, 76, 77, 78, 79, 80,
-81, 82, 83, 84, 85, 86, 87, 88,
-89, 90, 95, 95, 95, 95, 95, 95,
-97, 98, 99, 100, 101, 102, 103, 104,
-105, 106, 107, 108, 109, 110, 111, 112,
-113, 114, 115, 116, 117, 118, 119, 120,
-121, 122, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 192,
-193, 194, 195, 196, 197, 198, 199, 200,
-201, 202, 203, 204, 205, 206, 207, 208,
-209, 210, 211, 212, 213, 214, 95, 216,
-217, 218, 219, 220, 221, 222, 223, 224,
-225, 226, 227, 228, 229, 230, 231, 232,
-233, 234, 235, 236, 237, 238, 239, 240,
-241, 242, 243, 244, 245, 246, 95, 248,
-249, 250, 251, 252, 253, 254, 255};
-
-const unsigned char translate_name_map[256] = {
-95, 95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 45, 95, 95, 48,
-49, 50, 51, 52, 53, 54, 55, 56,
-57, 95, 95, 95, 95, 95, 95, 95,
-65, 66, 67, 68, 69, 70, 71, 72,
-73, 74, 75, 76, 77, 78, 79, 80,
-81, 82, 83, 84, 85, 86, 87, 88,
-89, 90, 95, 95, 95, 95, 95, 95,
-97, 98, 99, 100, 101, 102, 103, 104,
-105, 106, 107, 108, 109, 110, 111, 112,
-113, 114, 115, 116, 117, 118, 119, 120,
-121, 122, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 95, 95,
-95, 95, 95, 95, 95, 95, 183, 95,
-95, 95, 95, 95, 95, 95, 95, 192,
-193, 194, 195, 196, 197, 198, 199, 200,
-201, 202, 203, 204, 205, 206, 207, 208,
-209, 210, 211, 212, 213, 214, 95, 216,
-217, 218, 219, 220, 221, 222, 223, 224,
-225, 226, 227, 228, 229, 230, 231, 232,
-233, 234, 235, 236, 237, 238, 239, 240,
-241, 242, 243, 244, 245, 246, 95, 248,
-249, 250, 251, 252, 253, 254, 255};
-
-typedef std::map< std::string, std::vector<std::string> > map_string_list;
-map_string_list global_id_map;
-
-/** Look at documentation of translate_map */
-static std::string translate_id(const std::string &id)
-{
- if (id.size() == 0)
- { return id; }
- std::string id_translated = id;
- id_translated[0] = translate_start_name_map[(unsigned int)id_translated[0]];
- for (unsigned int i=1; i < id_translated.size(); i++)
- {
- id_translated[i] = translate_name_map[(unsigned int)id_translated[i]];
- }
- // It's so much workload now, the if() should speed up things.
- if (id_translated != id)
- {
- // Search duplicates
- map_string_list::iterator iter = global_id_map.find(id_translated);
- if (iter != global_id_map.end())
- {
- unsigned int i = 0;
- bool found = false;
- for (i=0; i < iter->second.size(); i++)
- {
- if (id == iter->second[i])
- {
- found = true;
- break;
- }
- }
- bool convert = false;
- if (found)
- {
- if (i > 0)
- { convert = true; }
- }
- else
- {
- convert = true;
- global_id_map[id_translated].push_back(id);
- }
- if (convert)
- {
- std::stringstream out;
- out << ++i;
- id_translated += out.str();
- }
- }
- else { global_id_map[id_translated].push_back(id); }
- }
- return id_translated;
-}
-
-static std::string id_name(void *id)
-{
- return ((ID*)id)->name + 2;
-}
-
-static std::string get_geometry_id(Object *ob)
-{
- return translate_id(id_name(ob)) + "-mesh";
-}
-
-static std::string get_light_id(Object *ob)
-{
- return translate_id(id_name(ob)) + "-light";
-}
-
-static std::string get_camera_id(Object *ob)
-{
- return translate_id(id_name(ob)) + "-camera";
-}
-
-std::string get_joint_id(Bone *bone, Object *ob_arm)
-{
- return translate_id(id_name(ob_arm) + "_" + bone->name);
-}
-
/*
Utilities to avoid code duplication.
Definition can take some time to understand, but they should be useful.
*/
-// f should have
-// void operator()(Object* ob)
-template<class Functor>
-void forEachMeshObjectInScene(Scene *sce, Functor &f)
-{
-
- Base *base= (Base*) sce->base.first;
- while(base) {
- Object *ob = base->object;
-
- if (ob->type == OB_MESH && ob->data) {
- f(ob);
- }
- base= base->next;
-
- }
-}
template<class Functor>
void forEachObjectInScene(Scene *sce, Functor &f)
@@ -346,1078 +156,7 @@ void forEachObjectInScene(Scene *sce, Functor &f)
}
}
-template<class Functor>
-void forEachCameraObjectInScene(Scene *sce, Functor &f)
-{
- Base *base= (Base*) sce->base.first;
- while(base) {
- Object *ob = base->object;
-
- if (ob->type == OB_CAMERA && ob->data) {
- f(ob, sce);
- }
- base= base->next;
- }
-}
-
-template<class Functor>
-void forEachLampObjectInScene(Scene *sce, Functor &f)
-{
- Base *base= (Base*) sce->base.first;
- while(base) {
- Object *ob = base->object;
-
- if (ob->type == OB_LAMP && ob->data) {
- f(ob);
- }
- base= base->next;
- }
-}
-
-// used in forEachMaterialInScene
-template <class MaterialFunctor>
-class ForEachMaterialFunctor
-{
- std::vector<std::string> mMat; // contains list of material names, to avoid duplicate calling of f
- MaterialFunctor *f;
-public:
- ForEachMaterialFunctor(MaterialFunctor *f) : f(f) { }
- void operator ()(Object *ob)
- {
- int a;
- for(a = 0; a < ob->totcol; a++) {
-
- Material *ma = give_current_material(ob, a+1);
-
- if (!ma) continue;
-
- std::string translated_id = translate_id(id_name(ma));
- if (find(mMat.begin(), mMat.end(), translated_id) == mMat.end()) {
- (*this->f)(ma, ob);
-
- mMat.push_back(translated_id);
- }
- }
- }
-};
-
-// calls f for each unique material linked to each object in sce
-// f should have
-// void operator()(Material* ma)
-template<class Functor>
-void forEachMaterialInScene(Scene *sce, Functor &f)
-{
- ForEachMaterialFunctor<Functor> matfunc(&f);
- forEachMeshObjectInScene(sce, matfunc);
-}
-
-// OB_MESH is assumed
-std::string getActiveUVLayerName(Object *ob)
-{
- Mesh *me = (Mesh*)ob->data;
-
- int num_layers = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
- if (num_layers)
- return std::string(CustomData_get_active_layer_name(&me->fdata, CD_MTFACE));
-
- return "";
-}
-
-// TODO: optimize UV sets by making indexed list with duplicates removed
-class GeometryExporter : COLLADASW::LibraryGeometries
-{
- struct Face
- {
- unsigned int v1, v2, v3, v4;
- };
-
- struct Normal
- {
- float x, y, z;
- };
-
- Scene *mScene;
-
-public:
- GeometryExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryGeometries(sw) {}
-
- void exportGeom(Scene *sce)
- {
- openLibrary();
-
- mScene = sce;
- forEachMeshObjectInScene(sce, *this);
-
- closeLibrary();
- }
-
- void operator()(Object *ob)
- {
- // XXX don't use DerivedMesh, Mesh instead?
-
-#if 0
- DerivedMesh *dm = mesh_get_derived_final(mScene, ob, CD_MASK_BAREMESH);
-#endif
- Mesh *me = (Mesh*)ob->data;
- std::string geom_id = get_geometry_id(ob);
- std::vector<Normal> nor;
- std::vector<Face> norind;
-
- bool has_color = (bool)CustomData_has_layer(&me->fdata, CD_MCOL);
-
- create_normals(nor, norind, me);
-
- // openMesh(geoId, geoName, meshId)
- openMesh(geom_id);
-
- // writes <source> for vertex coords
- createVertsSource(geom_id, me);
-
- // writes <source> for normal coords
- createNormalsSource(geom_id, me, nor);
-
- bool has_uvs = (bool)CustomData_has_layer(&me->fdata, CD_MTFACE);
-
- // writes <source> for uv coords if mesh has uv coords
- if (has_uvs)
- createTexcoordsSource(geom_id, me);
-
- if (has_color)
- createVertexColorSource(geom_id, me);
-
- // <vertices>
- COLLADASW::Vertices verts(mSW);
- verts.setId(getIdBySemantics(geom_id, COLLADASW::VERTEX));
- COLLADASW::InputList &input_list = verts.getInputList();
- COLLADASW::Input input(COLLADASW::POSITION, getUrlBySemantics(geom_id, COLLADASW::POSITION));
- input_list.push_back(input);
- verts.add();
-
- // XXX slow
- if (ob->totcol) {
- for(int a = 0; a < ob->totcol; a++) {
- // account for NULL materials, this should not normally happen?
- Material *ma = give_current_material(ob, a + 1);
- createPolylist(ma != NULL, a, has_uvs, has_color, ob, geom_id, norind);
- }
- }
- else {
- createPolylist(false, 0, has_uvs, has_color, ob, geom_id, norind);
- }
-
- closeMesh();
- closeGeometry();
-
-#if 0
- dm->release(dm);
-#endif
- }
-
- // powerful because it handles both cases when there is material and when there's not
- void createPolylist(bool has_material,
- int material_index,
- bool has_uvs,
- bool has_color,
- Object *ob,
- std::string& geom_id,
- std::vector<Face>& norind)
- {
- Mesh *me = (Mesh*)ob->data;
- MFace *mfaces = me->mface;
- int totfaces = me->totface;
-
- // <vcount>
- int i;
- int faces_in_polylist = 0;
- std::vector<unsigned long> vcount_list;
-
- // count faces with this material
- for (i = 0; i < totfaces; i++) {
- MFace *f = &mfaces[i];
-
- if ((has_material && f->mat_nr == material_index) || !has_material) {
- faces_in_polylist++;
- if (f->v4 == 0) {
- vcount_list.push_back(3);
- }
- else {
- vcount_list.push_back(4);
- }
- }
- }
-
- // no faces using this material
- if (faces_in_polylist == 0) {
- return;
- }
-
- Material *ma = has_material ? give_current_material(ob, material_index + 1) : NULL;
- COLLADASW::Polylist polylist(mSW);
-
- // sets count attribute in <polylist>
- polylist.setCount(faces_in_polylist);
-
- // sets material name
- if (has_material) {
- polylist.setMaterial(translate_id(id_name(ma)));
- }
-
- COLLADASW::InputList &til = polylist.getInputList();
-
- // creates <input> in <polylist> for vertices
- COLLADASW::Input input1(COLLADASW::VERTEX, getUrlBySemantics(geom_id, COLLADASW::VERTEX), 0);
-
- // creates <input> in <polylist> for normals
- COLLADASW::Input input2(COLLADASW::NORMAL, getUrlBySemantics(geom_id, COLLADASW::NORMAL), 1);
-
- til.push_back(input1);
- til.push_back(input2);
-
- // if mesh has uv coords writes <input> for TEXCOORD
- int num_layers = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
-
- for (i = 0; i < num_layers; i++) {
- // char *name = CustomData_get_layer_name(&me->fdata, CD_MTFACE, i);
- COLLADASW::Input input3(COLLADASW::TEXCOORD,
- makeUrl(makeTexcoordSourceId(geom_id, i)),
- 2, // offset always 2, this is only until we have optimized UV sets
- i // set number equals UV layer index
- );
- til.push_back(input3);
- }
-
- if (has_color) {
- COLLADASW::Input input4(COLLADASW::COLOR, getUrlBySemantics(geom_id, COLLADASW::COLOR), has_uvs ? 3 : 2);
- til.push_back(input4);
- }
-
- // sets <vcount>
- polylist.setVCountList(vcount_list);
-
- // performs the actual writing
- polylist.prepareToAppendValues();
-
- // <p>
- int texindex = 0;
- for (i = 0; i < totfaces; i++) {
- MFace *f = &mfaces[i];
-
- if ((has_material && f->mat_nr == material_index) || !has_material) {
-
- unsigned int *v = &f->v1;
- unsigned int *n = &norind[i].v1;
- for (int j = 0; j < (f->v4 == 0 ? 3 : 4); j++) {
- polylist.appendValues(v[j]);
- polylist.appendValues(n[j]);
-
- if (has_uvs)
- polylist.appendValues(texindex + j);
-
- if (has_color)
- polylist.appendValues(texindex + j);
- }
- }
-
- texindex += 3;
- if (f->v4 != 0)
- texindex++;
- }
-
- polylist.finish();
- }
-
- // creates <source> for positions
- void createVertsSource(std::string geom_id, Mesh *me)
- {
-#if 0
- int totverts = dm->getNumVerts(dm);
- MVert *verts = dm->getVertArray(dm);
-#endif
- int totverts = me->totvert;
- MVert *verts = me->mvert;
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(getIdBySemantics(geom_id, COLLADASW::POSITION));
- source.setArrayId(getIdBySemantics(geom_id, COLLADASW::POSITION) +
- ARRAY_ID_SUFFIX);
- source.setAccessorCount(totverts);
- source.setAccessorStride(3);
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("X");
- param.push_back("Y");
- param.push_back("Z");
- /*main function, it creates <source id = "">, <float_array id = ""
- count = ""> */
- source.prepareToAppendValues();
- //appends data to <float_array>
- int i = 0;
- for (i = 0; i < totverts; i++) {
- source.appendValues(verts[i].co[0], verts[i].co[1], verts[i].co[2]);
- }
-
- source.finish();
-
- }
-
- void createVertexColorSource(std::string geom_id, Mesh *me)
- {
- if (!CustomData_has_layer(&me->fdata, CD_MCOL))
- return;
-
- MFace *f;
- int totcolor = 0, i, j;
-
- for (i = 0, f = me->mface; i < me->totface; i++, f++)
- totcolor += f->v4 ? 4 : 3;
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(getIdBySemantics(geom_id, COLLADASW::COLOR));
- source.setArrayId(getIdBySemantics(geom_id, COLLADASW::COLOR) + ARRAY_ID_SUFFIX);
- source.setAccessorCount(totcolor);
- source.setAccessorStride(3);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("R");
- param.push_back("G");
- param.push_back("B");
-
- source.prepareToAppendValues();
-
- int index = CustomData_get_active_layer_index(&me->fdata, CD_MCOL);
-
- MCol *mcol = (MCol*)me->fdata.layers[index].data;
- MCol *c = mcol;
-
- for (i = 0, f = me->mface; i < me->totface; i++, c += 4, f++)
- for (j = 0; j < (f->v4 ? 4 : 3); j++)
- source.appendValues(c[j].b / 255.0f, c[j].g / 255.0f, c[j].r / 255.0f);
-
- source.finish();
- }
-
- std::string makeTexcoordSourceId(std::string& geom_id, int layer_index)
- {
- char suffix[20];
- sprintf(suffix, "-%d", layer_index);
- return getIdBySemantics(geom_id, COLLADASW::TEXCOORD) + suffix;
- }
-
- //creates <source> for texcoords
- void createTexcoordsSource(std::string geom_id, Mesh *me)
- {
-#if 0
- int totfaces = dm->getNumFaces(dm);
- MFace *mfaces = dm->getFaceArray(dm);
-#endif
- int totfaces = me->totface;
- MFace *mfaces = me->mface;
-
- int totuv = 0;
- int i;
-
- // count totuv
- for (i = 0; i < totfaces; i++) {
- MFace *f = &mfaces[i];
- if (f->v4 == 0) {
- totuv+=3;
- }
- else {
- totuv+=4;
- }
- }
-
- int num_layers = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
-
- // write <source> for each layer
- // each <source> will get id like meshName + "map-channel-1"
- for (int a = 0; a < num_layers; a++) {
- MTFace *tface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, a);
- // char *name = CustomData_get_layer_name(&me->fdata, CD_MTFACE, a);
-
- COLLADASW::FloatSourceF source(mSW);
- std::string layer_id = makeTexcoordSourceId(geom_id, a);
- source.setId(layer_id);
- source.setArrayId(layer_id + ARRAY_ID_SUFFIX);
-
- source.setAccessorCount(totuv);
- source.setAccessorStride(2);
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("S");
- param.push_back("T");
-
- source.prepareToAppendValues();
-
- for (i = 0; i < totfaces; i++) {
- MFace *f = &mfaces[i];
-
- for (int j = 0; j < (f->v4 == 0 ? 3 : 4); j++) {
- source.appendValues(tface[i].uv[j][0],
- tface[i].uv[j][1]);
- }
- }
-
- source.finish();
- }
- }
-
-
- //creates <source> for normals
- void createNormalsSource(std::string geom_id, Mesh *me, std::vector<Normal>& nor)
- {
-#if 0
- int totverts = dm->getNumVerts(dm);
- MVert *verts = dm->getVertArray(dm);
-#endif
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(getIdBySemantics(geom_id, COLLADASW::NORMAL));
- source.setArrayId(getIdBySemantics(geom_id, COLLADASW::NORMAL) +
- ARRAY_ID_SUFFIX);
- source.setAccessorCount(nor.size());
- source.setAccessorStride(3);
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("X");
- param.push_back("Y");
- param.push_back("Z");
-
- source.prepareToAppendValues();
-
- std::vector<Normal>::iterator it;
- for (it = nor.begin(); it != nor.end(); it++) {
- Normal& n = *it;
- source.appendValues(n.x, n.y, n.z);
- }
-
- source.finish();
- }
-
- void create_normals(std::vector<Normal> &nor, std::vector<Face> &ind, Mesh *me)
- {
- int i, j, v;
- MVert *vert = me->mvert;
- std::map<unsigned int, unsigned int> nshar;
-
- for (i = 0; i < me->totface; i++) {
- MFace *fa = &me->mface[i];
- Face f;
- unsigned int *nn = &f.v1;
- unsigned int *vv = &fa->v1;
-
- memset(&f, 0, sizeof(f));
- v = fa->v4 == 0 ? 3 : 4;
-
- if (!(fa->flag & ME_SMOOTH)) {
- Normal n;
- if (v == 4)
- normal_quad_v3(&n.x, vert[fa->v1].co, vert[fa->v2].co, vert[fa->v3].co, vert[fa->v4].co);
- else
- normal_tri_v3(&n.x, vert[fa->v1].co, vert[fa->v2].co, vert[fa->v3].co);
- nor.push_back(n);
- }
-
- for (j = 0; j < v; j++) {
- if (fa->flag & ME_SMOOTH) {
- if (nshar.find(*vv) != nshar.end())
- *nn = nshar[*vv];
- else {
- Normal n = {
- vert[*vv].no[0]/32767.0,
- vert[*vv].no[1]/32767.0,
- vert[*vv].no[2]/32767.0
- };
- nor.push_back(n);
- *nn = nor.size() - 1;
- nshar[*vv] = *nn;
- }
- vv++;
- }
- else {
- *nn = nor.size() - 1;
- }
- nn++;
- }
-
- ind.push_back(f);
- }
- }
-
- std::string getIdBySemantics(std::string geom_id, COLLADASW::Semantics type, std::string other_suffix = "") {
- return geom_id + getSuffixBySemantic(type) + other_suffix;
- }
-
-
- COLLADASW::URI getUrlBySemantics(std::string geom_id, COLLADASW::Semantics type, std::string other_suffix = "") {
-
- std::string id(getIdBySemantics(geom_id, type, other_suffix));
- return COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, id);
-
- }
-
- COLLADASW::URI makeUrl(std::string id)
- {
- return COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, id);
- }
-
-
- /* int getTriCount(MFace *faces, int totface) {
- int i;
- int tris = 0;
- for (i = 0; i < totface; i++) {
- // if quad
- if (faces[i].v4 != 0)
- tris += 2;
- else
- tris++;
- }
-
- return tris;
- }*/
-};
-
-class TransformWriter : protected TransformBase
-{
-protected:
- void add_node_transform(COLLADASW::Node& node, float mat[][4], float parent_mat[][4])
- {
- float loc[3], rot[3], scale[3];
- float local[4][4];
-
- if (parent_mat) {
- float invpar[4][4];
- invert_m4_m4(invpar, parent_mat);
- mul_m4_m4m4(local, mat, invpar);
- }
- else {
- copy_m4_m4(local, mat);
- }
-
- TransformBase::decompose(local, loc, rot, NULL, scale);
-
- add_transform(node, loc, rot, scale);
- }
-
- void add_node_transform_ob(COLLADASW::Node& node, Object *ob)
- {
- float rot[3], loc[3], scale[3];
-
- if (ob->parent) {
- float C[4][4], tmat[4][4], imat[4][4], mat[4][4];
-
- // factor out scale from obmat
-
- copy_v3_v3(scale, ob->size);
-
- ob->size[0] = ob->size[1] = ob->size[2] = 1.0f;
- object_to_mat4(ob, C);
- copy_v3_v3(ob->size, scale);
-
- mul_serie_m4(tmat, ob->parent->obmat, ob->parentinv, C, NULL, NULL, NULL, NULL, NULL);
-
- // calculate local mat
-
- invert_m4_m4(imat, ob->parent->obmat);
- mul_m4_m4m4(mat, tmat, imat);
-
- // done
-
- mat4_to_eul(rot, mat);
- copy_v3_v3(loc, mat[3]);
- }
- else {
- copy_v3_v3(loc, ob->loc);
- copy_v3_v3(rot, ob->rot);
- copy_v3_v3(scale, ob->size);
- }
-
- add_transform(node, loc, rot, scale);
- }
-
- void add_node_transform_identity(COLLADASW::Node& node)
- {
- float loc[] = {0.0f, 0.0f, 0.0f}, scale[] = {1.0f, 1.0f, 1.0f}, rot[] = {0.0f, 0.0f, 0.0f};
- add_transform(node, loc, rot, scale);
- }
-
-private:
- void add_transform(COLLADASW::Node& node, float loc[3], float rot[3], float scale[3])
- {
- node.addTranslate("location", loc[0], loc[1], loc[2]);
- node.addRotateZ("rotationZ", COLLADABU::Math::Utils::radToDegF(rot[2]));
- node.addRotateY("rotationY", COLLADABU::Math::Utils::radToDegF(rot[1]));
- node.addRotateX("rotationX", COLLADABU::Math::Utils::radToDegF(rot[0]));
- node.addScale("scale", scale[0], scale[1], scale[2]);
- }
-};
-
-class InstanceWriter
-{
-protected:
- void add_material_bindings(COLLADASW::BindMaterial& bind_material, Object *ob)
- {
- for(int a = 0; a < ob->totcol; a++) {
- Material *ma = give_current_material(ob, a+1);
-
- COLLADASW::InstanceMaterialList& iml = bind_material.getInstanceMaterialList();
-
- if (ma) {
- std::string matid(id_name(ma));
- matid = translate_id(matid);
- COLLADASW::InstanceMaterial im(matid, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, matid));
-
- // create <bind_vertex_input> for each uv layer
- Mesh *me = (Mesh*)ob->data;
- int totlayer = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
-
- for (int b = 0; b < totlayer; b++) {
- char *name = CustomData_get_layer_name(&me->fdata, CD_MTFACE, b);
- im.push_back(COLLADASW::BindVertexInput(name, "TEXCOORD", b));
- }
-
- iml.push_back(im);
- }
- }
- }
-};
-
-// XXX exporter writes wrong data for shared armatures. A separate
-// controller should be written for each armature-mesh binding how do
-// we make controller ids then?
-class ArmatureExporter: public COLLADASW::LibraryControllers, protected TransformWriter, protected InstanceWriter
-{
-private:
- Scene *scene;
-
-public:
- ArmatureExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryControllers(sw) {}
-
- // write bone nodes
- void add_armature_bones(Object *ob_arm, Scene *sce)
- {
- // write bone nodes
- bArmature *arm = (bArmature*)ob_arm->data;
- for (Bone *bone = (Bone*)arm->bonebase.first; bone; bone = bone->next) {
- // start from root bones
- if (!bone->parent)
- add_bone_node(bone, ob_arm);
- }
- }
-
- bool is_skinned_mesh(Object *ob)
- {
- return get_assigned_armature(ob) != NULL;
- }
-
- void add_instance_controller(Object *ob)
- {
- Object *ob_arm = get_assigned_armature(ob);
- bArmature *arm = (bArmature*)ob_arm->data;
-
- const std::string& controller_id = get_controller_id(ob_arm, ob);
-
- COLLADASW::InstanceController ins(mSW);
- ins.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, controller_id));
-
- // write root bone URLs
- Bone *bone;
- for (bone = (Bone*)arm->bonebase.first; bone; bone = bone->next) {
- if (!bone->parent)
- ins.addSkeleton(COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_joint_id(bone, ob_arm)));
- }
-
- InstanceWriter::add_material_bindings(ins.getBindMaterial(), ob);
-
- ins.add();
- }
-
- void export_controllers(Scene *sce)
- {
- scene = sce;
-
- openLibrary();
-
- forEachMeshObjectInScene(sce, *this);
- closeLibrary();
- }
-
- void operator()(Object *ob)
- {
- Object *ob_arm = get_assigned_armature(ob);
-
- if (ob_arm /*&& !already_written(ob_arm)*/)
- export_controller(ob, ob_arm);
- }
-
-private:
-
- UnitConverter converter;
-
-#if 0
- std::vector<Object*> written_armatures;
-
- bool already_written(Object *ob_arm)
- {
- return std::find(written_armatures.begin(), written_armatures.end(), ob_arm) != written_armatures.end();
- }
-
- void wrote(Object *ob_arm)
- {
- written_armatures.push_back(ob_arm);
- }
-
- void find_objects_using_armature(Object *ob_arm, std::vector<Object *>& objects, Scene *sce)
- {
- objects.clear();
-
- Base *base= (Base*) sce->base.first;
- while(base) {
- Object *ob = base->object;
-
- if (ob->type == OB_MESH && get_assigned_armature(ob) == ob_arm) {
- objects.push_back(ob);
- }
-
- base= base->next;
- }
- }
-#endif
-
- Object *get_assigned_armature(Object *ob)
- {
- Object *ob_arm = NULL;
-
- if (ob->parent && ob->partype == PARSKEL && ob->parent->type == OB_ARMATURE) {
- ob_arm = ob->parent;
- }
- else {
- ModifierData *mod = (ModifierData*)ob->modifiers.first;
- while (mod) {
- if (mod->type == eModifierType_Armature) {
- ob_arm = ((ArmatureModifierData*)mod)->object;
- }
-
- mod = mod->next;
- }
- }
-
- return ob_arm;
- }
-
- std::string get_joint_sid(Bone *bone, Object *ob_arm)
- {
- return get_joint_id(bone, ob_arm);
- }
-
- // parent_mat is armature-space
- void add_bone_node(Bone *bone, Object *ob_arm)
- {
- std::string node_id = get_joint_id(bone, ob_arm);
- std::string node_name = std::string(bone->name);
- std::string node_sid = get_joint_sid(bone, ob_arm);
-
- COLLADASW::Node node(mSW);
-
- node.setType(COLLADASW::Node::JOINT);
- node.setNodeId(node_id);
- node.setNodeName(node_name);
- node.setNodeSid(node_sid);
-
- node.start();
-
- add_bone_transform(ob_arm, bone, node);
-
- for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next) {
- add_bone_node(child, ob_arm);
- }
-
- node.end();
- }
-
- void add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW::Node& node)
- {
- bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name);
-
- float mat[4][4];
-
- if (bone->parent) {
- // get bone-space matrix from armature-space
- bPoseChannel *parchan = get_pose_channel(ob_arm->pose, bone->parent->name);
-
- float invpar[4][4];
- invert_m4_m4(invpar, parchan->pose_mat);
- mul_m4_m4m4(mat, pchan->pose_mat, invpar);
- }
- else {
- // get world-space from armature-space
- mul_m4_m4m4(mat, pchan->pose_mat, ob_arm->obmat);
- }
-
- TransformWriter::add_node_transform(node, mat, NULL);
- }
-
- std::string get_controller_id(Object *ob_arm, Object *ob)
- {
- return translate_id(id_name(ob_arm)) + "_" + translate_id(id_name(ob)) + SKIN_CONTROLLER_ID_SUFFIX;
- }
-
- // ob should be of type OB_MESH
- // both args are required
- void export_controller(Object* ob, Object *ob_arm)
- {
- // joint names
- // joint inverse bind matrices
- // vertex weights
-
- // input:
- // joint names: ob -> vertex group names
- // vertex group weights: me->dvert -> groups -> index, weight
-
- /*
- me->dvert:
-
- typedef struct MDeformVert {
- struct MDeformWeight *dw;
- int totweight;
- int flag; // flag only in use for weightpaint now
- } MDeformVert;
-
- typedef struct MDeformWeight {
- int def_nr;
- float weight;
- } MDeformWeight;
- */
-
- Mesh *me = (Mesh*)ob->data;
- if (!me->dvert) return;
-
- std::string controller_name = id_name(ob_arm);
- std::string controller_id = get_controller_id(ob_arm, ob);
-
- openSkin(controller_id, controller_name,
- COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob)));
-
- add_bind_shape_mat(ob);
-
- std::string joints_source_id = add_joints_source(ob_arm, &ob->defbase, controller_id);
- std::string inv_bind_mat_source_id = add_inv_bind_mats_source(ob_arm, &ob->defbase, controller_id);
- std::string weights_source_id = add_weights_source(me, controller_id);
-
- add_joints_element(&ob->defbase, joints_source_id, inv_bind_mat_source_id);
- add_vertex_weights_element(weights_source_id, joints_source_id, me, ob_arm, &ob->defbase);
-
- closeSkin();
- closeController();
- }
-
- void add_joints_element(ListBase *defbase,
- const std::string& joints_source_id, const std::string& inv_bind_mat_source_id)
- {
- COLLADASW::JointsElement joints(mSW);
- COLLADASW::InputList &input = joints.getInputList();
-
- input.push_back(COLLADASW::Input(COLLADASW::JOINT, // constant declared in COLLADASWInputList.h
- COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, joints_source_id)));
- input.push_back(COLLADASW::Input(COLLADASW::BINDMATRIX,
- COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, inv_bind_mat_source_id)));
- joints.add();
- }
-
- void add_bind_shape_mat(Object *ob)
- {
- double bind_mat[4][4];
-
- converter.mat4_to_dae_double(bind_mat, ob->obmat);
-
- addBindShapeTransform(bind_mat);
- }
-
- std::string add_joints_source(Object *ob_arm, ListBase *defbase, const std::string& controller_id)
- {
- std::string source_id = controller_id + JOINTS_SOURCE_ID_SUFFIX;
-
- int totjoint = 0;
- bDeformGroup *def;
- for (def = (bDeformGroup*)defbase->first; def; def = def->next) {
- if (is_bone_defgroup(ob_arm, def))
- totjoint++;
- }
-
- COLLADASW::NameSource source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(totjoint);
- source.setAccessorStride(1);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("JOINT");
-
- source.prepareToAppendValues();
-
- for (def = (bDeformGroup*)defbase->first; def; def = def->next) {
- Bone *bone = get_bone_from_defgroup(ob_arm, def);
- if (bone)
- source.appendValues(get_joint_sid(bone, ob_arm));
- }
-
- source.finish();
-
- return source_id;
- }
-
- std::string add_inv_bind_mats_source(Object *ob_arm, ListBase *defbase, const std::string& controller_id)
- {
- std::string source_id = controller_id + BIND_POSES_SOURCE_ID_SUFFIX;
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(BLI_countlist(defbase));
- source.setAccessorStride(16);
-
- source.setParameterTypeName(&COLLADASW::CSWC::CSW_VALUE_TYPE_FLOAT4x4);
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("TRANSFORM");
-
- source.prepareToAppendValues();
-
- bPose *pose = ob_arm->pose;
- bArmature *arm = (bArmature*)ob_arm->data;
-
- int flag = arm->flag;
-
- // put armature in rest position
- if (!(arm->flag & ARM_RESTPOS)) {
- arm->flag |= ARM_RESTPOS;
- where_is_pose(scene, ob_arm);
- }
-
- for (bDeformGroup *def = (bDeformGroup*)defbase->first; def; def = def->next) {
- if (is_bone_defgroup(ob_arm, def)) {
-
- bPoseChannel *pchan = get_pose_channel(pose, def->name);
-
- float mat[4][4];
- float world[4][4];
- float inv_bind_mat[4][4];
-
- // make world-space matrix, pose_mat is armature-space
- mul_m4_m4m4(world, pchan->pose_mat, ob_arm->obmat);
-
- invert_m4_m4(mat, world);
- converter.mat4_to_dae(inv_bind_mat, mat);
-
- source.appendValues(inv_bind_mat);
- }
- }
-
- // back from rest positon
- if (!(flag & ARM_RESTPOS)) {
- arm->flag = flag;
- where_is_pose(scene, ob_arm);
- }
-
- source.finish();
-
- return source_id;
- }
-
- Bone *get_bone_from_defgroup(Object *ob_arm, bDeformGroup* def)
- {
- bPoseChannel *pchan = get_pose_channel(ob_arm->pose, def->name);
- return pchan ? pchan->bone : NULL;
- }
-
- bool is_bone_defgroup(Object *ob_arm, bDeformGroup* def)
- {
- return get_bone_from_defgroup(ob_arm, def) != NULL;
- }
-
- std::string add_weights_source(Mesh *me, const std::string& controller_id)
- {
- std::string source_id = controller_id + WEIGHTS_SOURCE_ID_SUFFIX;
-
- int i;
- int totweight = 0;
-
- for (i = 0; i < me->totvert; i++) {
- totweight += me->dvert[i].totweight;
- }
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(totweight);
- source.setAccessorStride(1);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("WEIGHT");
-
- source.prepareToAppendValues();
-
- // NOTE: COLLADA spec says weights should be normalized
-
- for (i = 0; i < me->totvert; i++) {
- MDeformVert *vert = &me->dvert[i];
- for (int j = 0; j < vert->totweight; j++) {
- source.appendValues(vert->dw[j].weight);
- }
- }
-
- source.finish();
-
- return source_id;
- }
-
- void add_vertex_weights_element(const std::string& weights_source_id, const std::string& joints_source_id, Mesh *me,
- Object *ob_arm, ListBase *defbase)
- {
- COLLADASW::VertexWeightsElement weights(mSW);
- COLLADASW::InputList &input = weights.getInputList();
-
- int offset = 0;
- input.push_back(COLLADASW::Input(COLLADASW::JOINT, // constant declared in COLLADASWInputList.h
- COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, joints_source_id), offset++));
- input.push_back(COLLADASW::Input(COLLADASW::WEIGHT,
- COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, weights_source_id), offset++));
-
- weights.setCount(me->totvert);
-
- // write number of deformers per vertex
- COLLADASW::PrimitivesBase::VCountList vcount;
- int i;
- for (i = 0; i < me->totvert; i++) {
- vcount.push_back(me->dvert[i].totweight);
- }
-
- weights.prepareToAppendVCountValues();
- weights.appendVertexCount(vcount);
-
- // def group index -> joint index
- std::map<int, int> joint_index_by_def_index;
- bDeformGroup *def;
- int j;
- for (def = (bDeformGroup*)defbase->first, i = 0, j = 0; def; def = def->next, i++) {
- if (is_bone_defgroup(ob_arm, def))
- joint_index_by_def_index[i] = j++;
- else
- joint_index_by_def_index[i] = -1;
- }
-
- weights.CloseVCountAndOpenVElement();
-
- // write deformer index - weight index pairs
- int weight_index = 0;
- for (i = 0; i < me->totvert; i++) {
- MDeformVert *dvert = &me->dvert[i];
- for (int j = 0; j < dvert->totweight; j++) {
- weights.appendValues(joint_index_by_def_index[dvert->dw[j].def_nr]);
- weights.appendValues(weight_index++);
- }
- }
-
- weights.finish();
- }
-};
class SceneExporter: COLLADASW::LibraryVisualScenes, protected TransformWriter, protected InstanceWriter
{
@@ -1551,458 +290,17 @@ public:
}
};
-class ImagesExporter: COLLADASW::LibraryImages
-{
- const char *mfilename;
- std::vector<std::string> mImages; // contains list of written images, to avoid duplicates
-public:
- ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename) : COLLADASW::LibraryImages(sw), mfilename(filename)
- {}
-
- void exportImages(Scene *sce)
- {
- openLibrary();
-
- forEachMaterialInScene(sce, *this);
-
- closeLibrary();
- }
-
- void operator()(Material *ma, Object *ob)
- {
- int a;
- for (a = 0; a < MAX_MTEX; a++) {
- MTex *mtex = ma->mtex[a];
- if (mtex && mtex->tex && mtex->tex->ima) {
-
- Image *image = mtex->tex->ima;
- std::string name(id_name(image));
- name = translate_id(name);
- char rel[FILE_MAX];
- char abs[FILE_MAX];
- char src[FILE_MAX];
- char dir[FILE_MAX];
-
- BLI_split_dirfile(mfilename, dir, NULL);
-
- BKE_rebase_path(abs, sizeof(abs), rel, sizeof(rel), G.sce, image->name, dir);
-
- if (abs[0] != '\0') {
-
- // make absolute source path
- BLI_strncpy(src, image->name, sizeof(src));
- BLI_path_abs(src, G.sce);
-
- // make dest directory if it doesn't exist
- BLI_make_existing_file(abs);
-
- if (BLI_copy_fileops(src, abs) != 0) {
- fprintf(stderr, "Cannot copy image to file's directory. \n");
- }
- }
-
- if (find(mImages.begin(), mImages.end(), name) == mImages.end()) {
- COLLADASW::Image img(COLLADABU::URI(COLLADABU::URI::nativePathToUri(rel)), name);
- img.add(mSW);
-
- mImages.push_back(name);
- }
- }
- }
- }
-};
-
-class EffectsExporter: COLLADASW::LibraryEffects
-{
-public:
- EffectsExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryEffects(sw){}
- void exportEffects(Scene *sce)
- {
- openLibrary();
-
- forEachMaterialInScene(sce, *this);
-
- closeLibrary();
- }
-
- void operator()(Material *ma, Object *ob)
- {
- // create a list of indices to textures of type TEX_IMAGE
- std::vector<int> tex_indices;
- createTextureIndices(ma, tex_indices);
-
- openEffect(translate_id(id_name(ma)) + "-effect");
-
- COLLADASW::EffectProfile ep(mSW);
- ep.setProfileType(COLLADASW::EffectProfile::COMMON);
- ep.openProfile();
- // set shader type - one of three blinn, phong or lambert
- if (ma->spec_shader == MA_SPEC_BLINN) {
- ep.setShaderType(COLLADASW::EffectProfile::BLINN);
- // shininess
- ep.setShininess(ma->har);
- }
- else if (ma->spec_shader == MA_SPEC_PHONG) {
- ep.setShaderType(COLLADASW::EffectProfile::PHONG);
- // shininess
- // XXX not sure, stolen this from previous Collada plugin
- ep.setShininess(ma->har);
- }
- else {
- // XXX write warning "Current shader type is not supported"
- ep.setShaderType(COLLADASW::EffectProfile::LAMBERT);
- }
- // index of refraction
- if (ma->mode & MA_RAYTRANSP) {
- ep.setIndexOfRefraction(ma->ang);
- }
- else {
- ep.setIndexOfRefraction(1.0f);
- }
-
- COLLADASW::ColorOrTexture cot;
-
- // transparency
- if (ma->mode & MA_TRANSP) {
- // Tod: because we are in A_ONE mode transparency is calculated like this:
- ep.setTransparency(ma->alpha);
- // cot = getcol(1.0f, 1.0f, 1.0f, 1.0f);
- // ep.setTransparent(cot);
- }
-
- // emission
- cot=getcol(ma->emit, ma->emit, ma->emit, 1.0f);
- ep.setEmission(cot);
-
- // diffuse multiplied by diffuse intensity
- cot = getcol(ma->r * ma->ref, ma->g * ma->ref, ma->b * ma->ref, 1.0f);
- ep.setDiffuse(cot);
-
- // ambient
- cot = getcol(ma->ambr, ma->ambg, ma->ambb, 1.0f);
- ep.setAmbient(cot);
-
- // reflective, reflectivity
- if (ma->mode & MA_RAYMIRROR) {
- cot = getcol(ma->mirr, ma->mirg, ma->mirb, 1.0f);
- ep.setReflective(cot);
- ep.setReflectivity(ma->ray_mirror);
- }
- // else {
- // cot = getcol(ma->specr, ma->specg, ma->specb, 1.0f);
- // ep.setReflective(cot);
- // ep.setReflectivity(ma->spec);
- // }
-
- // specular
- if (ep.getShaderType() != COLLADASW::EffectProfile::LAMBERT) {
- cot = getcol(ma->specr * ma->spec, ma->specg * ma->spec, ma->specb * ma->spec, 1.0f);
- ep.setSpecular(cot);
- }
-
- // XXX make this more readable if possible
-
- // create <sampler> and <surface> for each image
- COLLADASW::Sampler samplers[MAX_MTEX];
- //COLLADASW::Surface surfaces[MAX_MTEX];
- //void *samp_surf[MAX_MTEX][2];
- void *samp_surf[MAX_MTEX][1];
-
- // image to index to samp_surf map
- // samp_surf[index] stores 2 pointers, sampler and surface
- std::map<std::string, int> im_samp_map;
-
- unsigned int a, b;
- for (a = 0, b = 0; a < tex_indices.size(); a++) {
- MTex *t = ma->mtex[tex_indices[a]];
- Image *ima = t->tex->ima;
-
- std::string key(id_name(ima));
- key = translate_id(key);
-
- // create only one <sampler>/<surface> pair for each unique image
- if (im_samp_map.find(key) == im_samp_map.end()) {
- // //<newparam> <surface> <init_from>
- // COLLADASW::Surface surface(COLLADASW::Surface::SURFACE_TYPE_2D,
- // key + COLLADASW::Surface::SURFACE_SID_SUFFIX);
- // COLLADASW::SurfaceInitOption sio(COLLADASW::SurfaceInitOption::INIT_FROM);
- // sio.setImageReference(key);
- // surface.setInitOption(sio);
-
- // COLLADASW::NewParamSurface surface(mSW);
- // surface->setParamType(COLLADASW::CSW_SURFACE_TYPE_2D);
-
- //<newparam> <sampler> <source>
- COLLADASW::Sampler sampler(COLLADASW::Sampler::SAMPLER_TYPE_2D,
- key + COLLADASW::Sampler::SAMPLER_SID_SUFFIX,
- key + COLLADASW::Sampler::SURFACE_SID_SUFFIX);
- sampler.setImageId(key);
- // copy values to arrays since they will live longer
- samplers[a] = sampler;
- //surfaces[a] = surface;
-
- // store pointers so they can be used later when we create <texture>s
- samp_surf[b][0] = &samplers[a];
- //samp_surf[b][1] = &surfaces[a];
-
- im_samp_map[key] = b;
- b++;
- }
- }
-
- // used as fallback when MTex->uvname is "" (this is pretty common)
- // it is indeed the correct value to use in that case
- std::string active_uv(getActiveUVLayerName(ob));
-
- // write textures
- // XXX very slow
- for (a = 0; a < tex_indices.size(); a++) {
- MTex *t = ma->mtex[tex_indices[a]];
- Image *ima = t->tex->ima;
-
- // we assume map input is always TEXCO_UV
-
- std::string key(id_name(ima));
- key = translate_id(key);
- int i = im_samp_map[key];
- COLLADASW::Sampler *sampler = (COLLADASW::Sampler*)samp_surf[i][0];
- //COLLADASW::Surface *surface = (COLLADASW::Surface*)samp_surf[i][1];
-
- std::string uvname = strlen(t->uvname) ? t->uvname : active_uv;
-
- // color
- if (t->mapto & MAP_COL) {
- ep.setDiffuse(createTexture(ima, uvname, sampler));
- }
- // ambient
- if (t->mapto & MAP_AMB) {
- ep.setAmbient(createTexture(ima, uvname, sampler));
- }
- // specular
- if (t->mapto & MAP_SPEC) {
- ep.setSpecular(createTexture(ima, uvname, sampler));
- }
- // emission
- if (t->mapto & MAP_EMIT) {
- ep.setEmission(createTexture(ima, uvname, sampler));
- }
- // reflective
- if (t->mapto & MAP_REF) {
- ep.setReflective(createTexture(ima, uvname, sampler));
- }
- // alpha
- if (t->mapto & MAP_ALPHA) {
- ep.setTransparent(createTexture(ima, uvname, sampler));
- }
- // extension:
- // Normal map --> Must be stored with <extra> tag as different technique,
- // since COLLADA doesn't support normal maps, even in current COLLADA 1.5.
- if (t->mapto & MAP_NORM) {
- COLLADASW::Texture texture(key);
- texture.setTexcoord(uvname);
- texture.setSampler(*sampler);
- // technique FCOLLADA, with the <bump> tag, is most likely the best understood,
- // most widespread de-facto standard.
- texture.setProfileName("FCOLLADA");
- texture.setChildElementName("bump");
- ep.addExtraTechniqueColorOrTexture(COLLADASW::ColorOrTexture(texture));
- }
- }
- // performs the actual writing
- ep.addProfileElements();
- bool twoSided = false;
- if (ob->type == OB_MESH && ob->data) {
- Mesh *me = (Mesh*)ob->data;
- if (me->flag & ME_TWOSIDED)
- twoSided = true;
- }
- if (twoSided)
- ep.addExtraTechniqueParameter("GOOGLEEARTH", "show_double_sided", 1);
- ep.addExtraTechniques(mSW);
-
- ep.closeProfile();
- if (twoSided)
- mSW->appendTextBlock("<extra><technique profile=\"MAX3D\"><double_sided>1</double_sided></technique></extra>");
- closeEffect();
- }
-
- COLLADASW::ColorOrTexture createTexture(Image *ima,
- std::string& uv_layer_name,
- COLLADASW::Sampler *sampler
- /*COLLADASW::Surface *surface*/)
- {
-
- COLLADASW::Texture texture(translate_id(id_name(ima)));
- texture.setTexcoord(uv_layer_name);
- //texture.setSurface(*surface);
- texture.setSampler(*sampler);
-
- COLLADASW::ColorOrTexture cot(texture);
- return cot;
- }
-
- COLLADASW::ColorOrTexture getcol(float r, float g, float b, float a)
- {
- COLLADASW::Color color(r,g,b,a);
- COLLADASW::ColorOrTexture cot(color);
- return cot;
- }
-
- //returns the array of mtex indices which have image
- //need this for exporting textures
- void createTextureIndices(Material *ma, std::vector<int> &indices)
- {
- indices.clear();
-
- for (int a = 0; a < MAX_MTEX; a++) {
- if (ma->mtex[a] &&
- ma->mtex[a]->tex &&
- ma->mtex[a]->tex->type == TEX_IMAGE &&
- ma->mtex[a]->texco == TEXCO_UV){
- indices.push_back(a);
- }
- }
- }
-};
-
-class MaterialsExporter: COLLADASW::LibraryMaterials
-{
-public:
- MaterialsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryMaterials(sw){}
- void exportMaterials(Scene *sce)
- {
- openLibrary();
-
- forEachMaterialInScene(sce, *this);
-
- closeLibrary();
- }
-
- void operator()(Material *ma, Object *ob)
- {
- std::string name(id_name(ma));
-
- openMaterial(translate_id(name), name);
-
- std::string efid = translate_id(name) + "-effect";
- addInstanceEffect(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, efid));
-
- closeMaterial();
- }
-};
-
-class CamerasExporter: COLLADASW::LibraryCameras
-{
-public:
- CamerasExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryCameras(sw){}
- void exportCameras(Scene *sce)
- {
- openLibrary();
-
- forEachCameraObjectInScene(sce, *this);
-
- closeLibrary();
- }
- void operator()(Object *ob, Scene *sce)
- {
- // XXX add other params later
- Camera *cam = (Camera*)ob->data;
- std::string cam_id(get_camera_id(ob));
- std::string cam_name(id_name(cam));
-
- if (cam->type == CAM_PERSP) {
- COLLADASW::PerspectiveOptic persp(mSW);
- persp.setXFov(1.0);
- persp.setAspectRatio(0.1);
- persp.setZFar(cam->clipend);
- persp.setZNear(cam->clipsta);
- COLLADASW::Camera ccam(mSW, &persp, cam_id, cam_name);
- addCamera(ccam);
- }
- else {
- COLLADASW::OrthographicOptic ortho(mSW);
- ortho.setXMag(1.0);
- ortho.setAspectRatio(0.1);
- ortho.setZFar(cam->clipend);
- ortho.setZNear(cam->clipsta);
- COLLADASW::Camera ccam(mSW, &ortho, cam_id, cam_name);
- addCamera(ccam);
- }
- }
-};
-
-class LightsExporter: COLLADASW::LibraryLights
-{
-public:
- LightsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryLights(sw){}
- void exportLights(Scene *sce)
- {
- openLibrary();
-
- forEachLampObjectInScene(sce, *this);
-
- closeLibrary();
- }
- void operator()(Object *ob)
- {
- Lamp *la = (Lamp*)ob->data;
- std::string la_id(get_light_id(ob));
- std::string la_name(id_name(la));
- COLLADASW::Color col(la->r, la->g, la->b);
- float e = la->energy;
-
- // sun
- if (la->type == LA_SUN) {
- COLLADASW::DirectionalLight cla(mSW, la_id, la_name, e);
- cla.setColor(col);
- addLight(cla);
- }
- // hemi
- else if (la->type == LA_HEMI) {
- COLLADASW::AmbientLight cla(mSW, la_id, la_name, e);
- cla.setColor(col);
- addLight(cla);
- }
- // spot
- else if (la->type == LA_SPOT) {
- COLLADASW::SpotLight cla(mSW, la_id, la_name, e);
- cla.setColor(col);
- cla.setFallOffAngle(la->spotsize);
- cla.setFallOffExponent(la->spotblend);
- cla.setLinearAttenuation(la->att1);
- cla.setQuadraticAttenuation(la->att2);
- addLight(cla);
- }
- // lamp
- else if (la->type == LA_LOCAL) {
- COLLADASW::PointLight cla(mSW, la_id, la_name, e);
- cla.setColor(col);
- cla.setLinearAttenuation(la->att1);
- cla.setQuadraticAttenuation(la->att2);
- addLight(cla);
- }
- // area lamp is not supported
- // it will be exported as a local lamp
- else {
- COLLADASW::PointLight cla(mSW, la_id, la_name, e);
- cla.setColor(col);
- cla.setLinearAttenuation(la->att1);
- cla.setQuadraticAttenuation(la->att2);
- addLight(cla);
- }
- }
-};
-
// TODO: it would be better to instantiate animations rather than create a new one per object
// COLLADA allows this through multiple <channel>s in <animation>.
// For this to work, we need to know objects that use a certain action.
class AnimationExporter: COLLADASW::LibraryAnimations
{
Scene *scene;
+ COLLADASW::StreamWriter *sw;
public:
- AnimationExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryAnimations(sw) {}
+ AnimationExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryAnimations(sw) { this->sw = sw; }
void exportAnimations(Scene *sce)
{
@@ -2060,22 +358,22 @@ protected:
openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
// create input source
- std::string input_id = create_source_from_fcurve(Sampler::INPUT, fcu, anim_id, axis_name);
+ std::string input_id = create_source_from_fcurve(COLLADASW::InputSemantic::INPUT, fcu, anim_id, axis_name);
// create output source
- std::string output_id = create_source_from_fcurve(Sampler::OUTPUT, fcu, anim_id, axis_name);
+ std::string output_id = create_source_from_fcurve(COLLADASW::InputSemantic::OUTPUT, fcu, anim_id, axis_name);
// create interpolations source
std::string interpolation_id = create_interpolation_source(fcu->totvert, anim_id, axis_name);
std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX;
- COLLADASW::LibraryAnimations::Sampler sampler(sampler_id);
+ COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id);
std::string empty;
- sampler.addInput(Sampler::INPUT, COLLADABU::URI(empty, input_id));
- sampler.addInput(Sampler::OUTPUT, COLLADABU::URI(empty, output_id));
+ sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id));
+ sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id));
// this input is required
- sampler.addInput(Sampler::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
+ sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
addSampler(sampler);
@@ -2236,28 +534,28 @@ protected:
openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
// create input source
- std::string input_id = create_source_from_vector(Sampler::INPUT, fra, is_rot, anim_id, axis_name);
+ std::string input_id = create_source_from_vector(COLLADASW::InputSemantic::INPUT, fra, is_rot, anim_id, axis_name);
// create output source
std::string output_id;
if (axis == -1)
output_id = create_xyz_source(v, fra.size(), anim_id);
else
- output_id = create_source_from_array(Sampler::OUTPUT, v, fra.size(), is_rot, anim_id, axis_name);
+ output_id = create_source_from_array(COLLADASW::InputSemantic::OUTPUT, v, fra.size(), is_rot, anim_id, axis_name);
// create interpolations source
std::string interpolation_id = create_interpolation_source(fra.size(), anim_id, axis_name);
std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX;
- COLLADASW::LibraryAnimations::Sampler sampler(sampler_id);
+ COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id);
std::string empty;
- sampler.addInput(Sampler::INPUT, COLLADABU::URI(empty, input_id));
- sampler.addInput(Sampler::OUTPUT, COLLADABU::URI(empty, output_id));
+ sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id));
+ sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id));
// TODO create in/out tangents source
// this input is required
- sampler.addInput(Sampler::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
+ sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
addSampler(sampler);
@@ -2277,18 +575,18 @@ protected:
return COLLADABU::Math::Utils::radToDegF(angle);
}
- std::string get_semantic_suffix(Sampler::Semantic semantic)
+ std::string get_semantic_suffix(COLLADASW::InputSemantic::Semantics semantic)
{
switch(semantic) {
- case Sampler::INPUT:
+ case COLLADASW::InputSemantic::INPUT:
return INPUT_SOURCE_ID_SUFFIX;
- case Sampler::OUTPUT:
+ case COLLADASW::InputSemantic::OUTPUT:
return OUTPUT_SOURCE_ID_SUFFIX;
- case Sampler::INTERPOLATION:
+ case COLLADASW::InputSemantic::INTERPOLATION:
return INTERPOLATION_SOURCE_ID_SUFFIX;
- case Sampler::IN_TANGENT:
+ case COLLADASW::InputSemantic::IN_TANGENT:
return INTANGENT_SOURCE_ID_SUFFIX;
- case Sampler::OUT_TANGENT:
+ case COLLADASW::InputSemantic::OUT_TANGENT:
return OUTTANGENT_SOURCE_ID_SUFFIX;
default:
break;
@@ -2297,13 +595,13 @@ protected:
}
void add_source_parameters(COLLADASW::SourceBase::ParameterNameList& param,
- Sampler::Semantic semantic, bool is_rot, const char *axis)
+ COLLADASW::InputSemantic::Semantics semantic, bool is_rot, const char *axis)
{
switch(semantic) {
- case Sampler::INPUT:
+ case COLLADASW::InputSemantic::INPUT:
param.push_back("TIME");
break;
- case Sampler::OUTPUT:
+ case COLLADASW::InputSemantic::OUTPUT:
if (is_rot) {
param.push_back("ANGLE");
}
@@ -2318,8 +616,8 @@ protected:
}
}
break;
- case Sampler::IN_TANGENT:
- case Sampler::OUT_TANGENT:
+ case COLLADASW::InputSemantic::IN_TANGENT:
+ case COLLADASW::InputSemantic::OUT_TANGENT:
param.push_back("X");
param.push_back("Y");
break;
@@ -2328,14 +626,14 @@ protected:
}
}
- void get_source_values(BezTriple *bezt, Sampler::Semantic semantic, bool rotation, float *values, int *length)
+ void get_source_values(BezTriple *bezt, COLLADASW::InputSemantic::Semantics semantic, bool rotation, float *values, int *length)
{
switch (semantic) {
- case Sampler::INPUT:
+ case COLLADASW::InputSemantic::INPUT:
*length = 1;
values[0] = convert_time(bezt->vec[1][0]);
break;
- case Sampler::OUTPUT:
+ case COLLADASW::InputSemantic::OUTPUT:
*length = 1;
if (rotation) {
values[0] = convert_angle(bezt->vec[1][1]);
@@ -2344,8 +642,8 @@ protected:
values[0] = bezt->vec[1][1];
}
break;
- case Sampler::IN_TANGENT:
- case Sampler::OUT_TANGENT:
+ case COLLADASW::InputSemantic::IN_TANGENT:
+ case COLLADASW::InputSemantic::OUT_TANGENT:
// XXX
*length = 2;
break;
@@ -2355,7 +653,7 @@ protected:
}
}
- std::string create_source_from_fcurve(Sampler::Semantic semantic, FCurve *fcu, const std::string& anim_id, const char *axis_name)
+ std::string create_source_from_fcurve(COLLADASW::InputSemantic::Semantics semantic, FCurve *fcu, const std::string& anim_id, const char *axis_name)
{
std::string source_id = anim_id + get_semantic_suffix(semantic);
@@ -2389,7 +687,7 @@ protected:
return source_id;
}
- std::string create_source_from_array(Sampler::Semantic semantic, float *v, int tot, bool is_rot, const std::string& anim_id, const char *axis_name)
+ std::string create_source_from_array(COLLADASW::InputSemantic::Semantics semantic, float *v, int tot, bool is_rot, const std::string& anim_id, const char *axis_name)
{
std::string source_id = anim_id + get_semantic_suffix(semantic);
@@ -2406,7 +704,7 @@ protected:
for (int i = 0; i < tot; i++) {
float val = v[i];
- if (semantic == Sampler::INPUT)
+ if (semantic == COLLADASW::InputSemantic::INPUT)
val = convert_time(val);
else if (is_rot)
val = convert_angle(val);
@@ -2418,7 +716,7 @@ protected:
return source_id;
}
- std::string create_source_from_vector(Sampler::Semantic semantic, std::vector<float> &fra, bool is_rot, const std::string& anim_id, const char *axis_name)
+ std::string create_source_from_vector(COLLADASW::InputSemantic::Semantics semantic, std::vector<float> &fra, bool is_rot, const std::string& anim_id, const char *axis_name)
{
std::string source_id = anim_id + get_semantic_suffix(semantic);
@@ -2436,7 +734,7 @@ protected:
std::vector<float>::iterator it;
for (it = fra.begin(); it != fra.end(); it++) {
float val = *it;
- if (semantic == Sampler::INPUT)
+ if (semantic == COLLADASW::InputSemantic::INPUT)
val = convert_time(val);
else if (is_rot)
val = convert_angle(val);
@@ -2451,7 +749,7 @@ protected:
// only used for sources with OUTPUT semantic
std::string create_xyz_source(float *v, int tot, const std::string& anim_id)
{
- Sampler::Semantic semantic = Sampler::OUTPUT;
+ COLLADASW::InputSemantic::Semantics semantic = COLLADASW::InputSemantic::OUTPUT;
std::string source_id = anim_id + get_semantic_suffix(semantic);
COLLADASW::FloatSourceF source(mSW);
@@ -2477,7 +775,7 @@ protected:
std::string create_interpolation_source(int tot, const std::string& anim_id, const char *axis_name)
{
- std::string source_id = anim_id + get_semantic_suffix(Sampler::INTERPOLATION);
+ std::string source_id = anim_id + get_semantic_suffix(COLLADASW::InputSemantic::INTERPOLATION);
COLLADASW::NameSource source(mSW);
source.setId(source_id);
@@ -2576,8 +874,8 @@ protected:
find_frames(ob, fra, prefix, "rotation_euler");
else if (rotmode == ROT_MODE_QUAT)
find_frames(ob, fra, prefix, "rotation_quaternion");
- else if (rotmode == ROT_MODE_AXISANGLE)
- ;
+ /*else if (rotmode == ROT_MODE_AXISANGLE)
+ ;*/
}
// enable fcurves driving a specific bone, disable all the rest
@@ -2606,22 +904,74 @@ protected:
void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename)
{
- global_id_map.clear();
+ PointerRNA sceneptr, unit_settings;
+ PropertyRNA *system; /* unused , *scale; */
+ clear_global_id_map();
+
COLLADABU::NativeString native_filename =
COLLADABU::NativeString(std::string(filename));
COLLADASW::StreamWriter sw(native_filename);
- // open <Collada>
+ // open <collada>
sw.startDocument();
// <asset>
COLLADASW::Asset asset(&sw);
- // XXX ask blender devs about this?
- asset.setUnit("decimetre", 0.1);
+
+ RNA_id_pointer_create(&(sce->id), &sceneptr);
+ unit_settings = RNA_pointer_get(&sceneptr, "unit_settings");
+ system = RNA_struct_find_property(&unit_settings, "system");
+ //scale = RNA_struct_find_property(&unit_settings, "scale_length");
+
+ std::string unitname = "meter";
+ float linearmeasure = 1.0f;
+
+ linearmeasure = RNA_float_get(&unit_settings, "scale_length");
+
+ switch(RNA_property_enum_get(&unit_settings, system)) {
+ case USER_UNIT_NONE:
+ case USER_UNIT_METRIC:
+ if(linearmeasure == 0.001f) {
+ unitname = "millimeter";
+ }
+ else if(linearmeasure == 0.01f) {
+ unitname = "centimeter";
+ }
+ else if(linearmeasure == 0.1f) {
+ unitname = "decimeter";
+ }
+ else if(linearmeasure == 1.0f) {
+ unitname = "meter";
+ }
+ else if(linearmeasure == 1000.0f) {
+ unitname = "kilometer";
+ }
+ break;
+ case USER_UNIT_IMPERIAL:
+ if(linearmeasure == 0.0254f) {
+ unitname = "inch";
+ }
+ else if(linearmeasure == 0.3048f) {
+ unitname = "foot";
+ }
+ else if(linearmeasure == 0.9144f) {
+ unitname = "yard";
+ }
+ break;
+ default:
+ break;
+ }
+
+ asset.setUnit(unitname, linearmeasure);
asset.setUpAxisType(COLLADASW::Asset::Z_UP);
// TODO: need an Author field in userpref
- asset.getContributor().mAuthor = "Blender User";
+ if(strlen(U.author) > 0) {
+ asset.getContributor().mAuthor = U.author;
+ }
+ else {
+ asset.getContributor().mAuthor = "Blender User";
+ }
#ifdef NAN_BUILDINFO
char version_buf[128];
sprintf(version_buf, "Blender %d.%02d.%d r%s", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION, build_rev);
diff --git a/source/blender/collada/DocumentExporter.h b/source/blender/collada/DocumentExporter.h
index bb6d400fdf1..4aac393b1ab 100644
--- a/source/blender/collada/DocumentExporter.h
+++ b/source/blender/collada/DocumentExporter.h
@@ -21,6 +21,10 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+#ifndef __DOCUMENTEXPORTER_H__
+#define __DOCUMENTEXPORTER_H__
+
struct Scene;
class DocumentExporter
@@ -29,3 +33,5 @@ class DocumentExporter
void exportCurrentScene(Scene *sce, const char* filename);
void exportScenes(const char* filename);
};
+
+#endif
diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp
index 2a3df69f0db..fef1285ae52 100644
--- a/source/blender/collada/DocumentImporter.cpp
+++ b/source/blender/collada/DocumentImporter.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,3212 +25,68 @@
// * name imported objects
// * import object rotation as euler
+#include <string>
+#include <map>
+#include <algorithm> // sort()
+
#include "COLLADAFWRoot.h"
-#include "COLLADAFWIWriter.h"
#include "COLLADAFWStableHeaders.h"
-#include "COLLADAFWAnimationCurve.h"
-#include "COLLADAFWAnimationList.h"
-#include "COLLADAFWCamera.h"
#include "COLLADAFWColorOrTexture.h"
-#include "COLLADAFWEffect.h"
-#include "COLLADAFWFloatOrDoubleArray.h"
-#include "COLLADAFWGeometry.h"
-#include "COLLADAFWImage.h"
#include "COLLADAFWIndexList.h"
-#include "COLLADAFWInstanceGeometry.h"
-#include "COLLADAFWLight.h"
-#include "COLLADAFWMaterial.h"
-#include "COLLADAFWMesh.h"
#include "COLLADAFWMeshPrimitiveWithFaceVertexCount.h"
-#include "COLLADAFWNode.h"
#include "COLLADAFWPolygons.h"
#include "COLLADAFWSampler.h"
-#include "COLLADAFWSkinController.h"
-#include "COLLADAFWSkinControllerData.h"
-#include "COLLADAFWTransformation.h"
-#include "COLLADAFWTranslate.h"
-#include "COLLADAFWRotate.h"
-#include "COLLADAFWScale.h"
-#include "COLLADAFWMatrix.h"
#include "COLLADAFWTypes.h"
#include "COLLADAFWVisualScene.h"
-#include "COLLADAFWFileInfo.h"
#include "COLLADAFWArrayPrimitiveType.h"
#include "COLLADAFWLibraryNodes.h"
+#include "COLLADAFWCamera.h"
+#include "COLLADAFWLight.h"
#include "COLLADASaxFWLLoader.h"
-// TODO move "extern C" into header files
-extern "C"
-{
-#include "ED_keyframing.h"
-#include "ED_armature.h"
-#include "ED_mesh.h" // ED_vgroup_vert_add, ...
-#include "ED_anim_api.h"
-#include "ED_object.h"
-
-#include "WM_types.h"
-#include "WM_api.h"
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BKE_main.h"
-#include "BKE_customdata.h"
#include "BKE_library.h"
#include "BKE_texture.h"
#include "BKE_fcurve.h"
#include "BKE_depsgraph.h"
#include "BLI_path_util.h"
-#include "BKE_displist.h"
-#include "BLI_math.h"
#include "BKE_scene.h"
-}
-#include "BKE_armature.h"
-#include "BKE_mesh.h"
#include "BKE_global.h"
-#include "BKE_context.h"
-#include "BKE_object.h"
-#include "BKE_image.h"
#include "BKE_material.h"
#include "BKE_utildefines.h"
-#include "BKE_action.h"
-
-#include "BLI_math.h"
-#include "BLI_listbase.h"
-#include "BLI_string.h"
+#include "BKE_image.h"
-#include "DNA_lamp_types.h"
-#include "DNA_armature_types.h"
-#include "DNA_anim_types.h"
-#include "DNA_curve_types.h"
-#include "DNA_texture_types.h"
#include "DNA_camera_types.h"
-#include "DNA_object_types.h"
-#include "DNA_meshdata_types.h"
-#include "DNA_mesh_types.h"
-#include "DNA_material_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_modifier_types.h"
+#include "DNA_lamp_types.h"
+
+#include "RNA_access.h"
#include "MEM_guardedalloc.h"
#include "DocumentImporter.h"
#include "collada_internal.h"
-#include <string>
-#include <map>
-#include <algorithm> // sort()
-
-#include <math.h>
-#include <float.h>
-
-// #define COLLADA_DEBUG
-
-// creates empties for each imported bone on layer 2, for debugging
-// #define ARMATURE_TEST
-
-char *CustomData_get_layer_name(const struct CustomData *data, int type, int n);
-
-static const char *primTypeToStr(COLLADAFW::MeshPrimitive::PrimitiveType type)
-{
- using namespace COLLADAFW;
-
- switch (type) {
- case MeshPrimitive::LINES:
- return "LINES";
- case MeshPrimitive::LINE_STRIPS:
- return "LINESTRIPS";
- case MeshPrimitive::POLYGONS:
- return "POLYGONS";
- case MeshPrimitive::POLYLIST:
- return "POLYLIST";
- case MeshPrimitive::TRIANGLES:
- return "TRIANGLES";
- case MeshPrimitive::TRIANGLE_FANS:
- return "TRIANGLE_FANS";
- case MeshPrimitive::TRIANGLE_STRIPS:
- return "TRIANGLE_FANS";
- case MeshPrimitive::POINTS:
- return "POINTS";
- case MeshPrimitive::UNDEFINED_PRIMITIVE_TYPE:
- return "UNDEFINED_PRIMITIVE_TYPE";
- }
- return "UNKNOWN";
-}
-
-static const char *geomTypeToStr(COLLADAFW::Geometry::GeometryType type)
-{
- switch (type) {
- case COLLADAFW::Geometry::GEO_TYPE_MESH:
- return "MESH";
- case COLLADAFW::Geometry::GEO_TYPE_SPLINE:
- return "SPLINE";
- case COLLADAFW::Geometry::GEO_TYPE_CONVEX_MESH:
- return "CONVEX_MESH";
- case COLLADAFW::Geometry::GEO_TYPE_UNKNOWN:
- default:
- return "UNKNOWN";
- }
-}
-
-// works for COLLADAFW::Node, COLLADAFW::Geometry
-template<class T>
-static const char *get_dae_name(T *node)
-{
- const std::string& name = node->getName();
- return name.size() ? name.c_str() : node->getOriginalId().c_str();
-}
-
-// use this for retrieving bone names, since these must be unique
-template<class T>
-static const char *get_joint_name(T *node)
-{
- const std::string& id = node->getOriginalId();
- return id.size() ? id.c_str() : node->getName().c_str();
-}
-
-static float get_float_value(const COLLADAFW::FloatOrDoubleArray& array, unsigned int index)
-{
- if (index >= array.getValuesCount())
- return 0.0f;
-
- if (array.getType() == COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT)
- return array.getFloatValues()->getData()[index];
- else
- return array.getDoubleValues()->getData()[index];
-}
-
-// copied from /editors/object/object_relations.c
-static int test_parent_loop(Object *par, Object *ob)
-{
- /* test if 'ob' is a parent somewhere in par's parents */
-
- if(par == NULL) return 0;
- if(ob == par) return 1;
-
- return test_parent_loop(par->parent, ob);
-}
-
-// a shortened version of parent_set_exec()
-// if is_parent_space is true then ob->obmat will be multiplied by par->obmat before parenting
-static int set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space=true)
-{
- if (!par || test_parent_loop(par, ob))
- return false;
-
- Object workob;
- Main *bmain = CTX_data_main(C);
- Scene *sce = CTX_data_scene(C);
-
- ob->parent = par;
- ob->partype = PAROBJECT;
-
- ob->parsubstr[0] = 0;
-
- if (is_parent_space) {
- // calc par->obmat
- where_is_object(sce, par);
-
- // move child obmat into world space
- float mat[4][4];
- mul_m4_m4m4(mat, ob->obmat, par->obmat);
- copy_m4_m4(ob->obmat, mat);
- }
-
- // apply child obmat (i.e. decompose it into rot/loc/size)
- object_apply_mat4(ob, ob->obmat);
-
- // compute parentinv
- what_does_parent(sce, ob, &workob);
- invert_m4_m4(ob->parentinv, workob.obmat);
-
- ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA;
- par->recalc |= OB_RECALC_OB;
-
- DAG_scene_sort(bmain, sce);
- DAG_ids_flush_update(bmain, 0);
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return true;
-}
-
-typedef std::map<COLLADAFW::TextureMapId, std::vector<MTex*> > TexIndexTextureArrayMap;
-
-class TransformReader : public TransformBase
-{
-protected:
-
- UnitConverter *unit_converter;
-
- struct Animation {
- Object *ob;
- COLLADAFW::Node *node;
- COLLADAFW::Transformation *tm; // which transform is animated by an AnimationList->id
- };
-
-public:
-
- TransformReader(UnitConverter* conv) : unit_converter(conv) {}
-
- void get_node_mat(float mat[][4], COLLADAFW::Node *node, std::map<COLLADAFW::UniqueId, Animation> *animation_map,
- Object *ob)
- {
- float cur[4][4];
- float copy[4][4];
-
- unit_m4(mat);
-
- for (unsigned int i = 0; i < node->getTransformations().getCount(); i++) {
-
- COLLADAFW::Transformation *tm = node->getTransformations()[i];
- COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
-
- switch(type) {
- case COLLADAFW::Transformation::TRANSLATE:
- dae_translate_to_mat4(tm, cur);
- break;
- case COLLADAFW::Transformation::ROTATE:
- dae_rotate_to_mat4(tm, cur);
- break;
- case COLLADAFW::Transformation::SCALE:
- dae_scale_to_mat4(tm, cur);
- break;
- case COLLADAFW::Transformation::MATRIX:
- dae_matrix_to_mat4(tm, cur);
- break;
- case COLLADAFW::Transformation::LOOKAT:
- case COLLADAFW::Transformation::SKEW:
- fprintf(stderr, "LOOKAT and SKEW transformations are not supported yet.\n");
- break;
- }
-
- copy_m4_m4(copy, mat);
- mul_m4_m4m4(mat, cur, copy);
-
- if (animation_map) {
- // AnimationList that drives this Transformation
- const COLLADAFW::UniqueId& anim_list_id = tm->getAnimationList();
-
- // store this so later we can link animation data with ob
- Animation anim = {ob, node, tm};
- (*animation_map)[anim_list_id] = anim;
- }
- }
- }
-
- void dae_rotate_to_mat4(COLLADAFW::Transformation *tm, float m[][4])
- {
- COLLADAFW::Rotate *ro = (COLLADAFW::Rotate*)tm;
- COLLADABU::Math::Vector3& axis = ro->getRotationAxis();
- float angle = (float)(ro->getRotationAngle() * M_PI / 180.0f);
- float ax[] = {axis[0], axis[1], axis[2]};
- // float quat[4];
- // axis_angle_to_quat(quat, axis, angle);
- // quat_to_mat4(m, quat);
- axis_angle_to_mat4(m, ax, angle);
- }
-
- void dae_translate_to_mat4(COLLADAFW::Transformation *tm, float m[][4])
- {
- COLLADAFW::Translate *tra = (COLLADAFW::Translate*)tm;
- COLLADABU::Math::Vector3& t = tra->getTranslation();
-
- unit_m4(m);
-
- m[3][0] = (float)t[0];
- m[3][1] = (float)t[1];
- m[3][2] = (float)t[2];
- }
-
- void dae_scale_to_mat4(COLLADAFW::Transformation *tm, float m[][4])
- {
- COLLADABU::Math::Vector3& s = ((COLLADAFW::Scale*)tm)->getScale();
- float size[3] = {(float)s[0], (float)s[1], (float)s[2]};
- size_to_mat4(m, size);
- }
-
- void dae_matrix_to_mat4(COLLADAFW::Transformation *tm, float m[][4])
- {
- unit_converter->dae_matrix_to_mat4(m, ((COLLADAFW::Matrix*)tm)->getMatrix());
- }
-
- void dae_translate_to_v3(COLLADAFW::Transformation *tm, float v[3])
- {
- dae_vector3_to_v3(((COLLADAFW::Translate*)tm)->getTranslation(), v);
- }
-
- void dae_scale_to_v3(COLLADAFW::Transformation *tm, float v[3])
- {
- dae_vector3_to_v3(((COLLADAFW::Scale*)tm)->getScale(), v);
- }
-
- void dae_vector3_to_v3(const COLLADABU::Math::Vector3 &v3, float v[3])
- {
- v[0] = v3.x;
- v[1] = v3.y;
- v[2] = v3.z;
- }
-};
-
-// only for ArmatureImporter to "see" MeshImporter::get_object_by_geom_uid
-class MeshImporterBase
-{
-public:
- virtual Object *get_object_by_geom_uid(const COLLADAFW::UniqueId& geom_uid) = 0;
-};
-
-// ditto as above
-class AnimationImporterBase
-{
-public:
- // virtual void change_eul_to_quat(Object *ob, bAction *act) = 0;
-};
-
-class ArmatureImporter : private TransformReader
-{
-private:
- Scene *scene;
- UnitConverter *unit_converter;
-
- // std::map<int, JointData> joint_index_to_joint_info_map;
- // std::map<COLLADAFW::UniqueId, int> joint_id_to_joint_index_map;
-
- struct LeafBone {
- // COLLADAFW::Node *node;
- EditBone *bone;
- char name[32];
- float mat[4][4]; // bone matrix, derived from inv_bind_mat
- };
- std::vector<LeafBone> leaf_bones;
- // int bone_direction_row; // XXX not used
- float leaf_bone_length;
- int totbone;
- // XXX not used
- // float min_angle; // minimum angle between bone head-tail and a row of bone matrix
-
-#if 0
- struct ArmatureJoints {
- Object *ob_arm;
- std::vector<COLLADAFW::Node*> root_joints;
- };
- std::vector<ArmatureJoints> armature_joints;
-#endif
-
- Object *empty; // empty for leaf bones
-
- std::map<COLLADAFW::UniqueId, COLLADAFW::UniqueId> geom_uid_by_controller_uid;
- std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> joint_by_uid; // contains all joints
- std::vector<COLLADAFW::Node*> root_joints;
- std::map<COLLADAFW::UniqueId, Object*> joint_parent_map;
-
- MeshImporterBase *mesh_importer;
- AnimationImporterBase *anim_importer;
-
- // This is used to store data passed in write_controller_data.
- // Arrays from COLLADAFW::SkinControllerData lose ownership, so do this class members
- // so that arrays don't get freed until we free them explicitly.
- class SkinInfo
- {
- private:
- // to build armature bones from inverse bind matrices
- struct JointData {
- float inv_bind_mat[4][4]; // joint inverse bind matrix
- COLLADAFW::UniqueId joint_uid; // joint node UID
- // Object *ob_arm; // armature object
- };
-
- float bind_shape_matrix[4][4];
-
- // data from COLLADAFW::SkinControllerData, each array should be freed
- COLLADAFW::UIntValuesArray joints_per_vertex;
- COLLADAFW::UIntValuesArray weight_indices;
- COLLADAFW::IntValuesArray joint_indices;
- // COLLADAFW::FloatOrDoubleArray weights;
- std::vector<float> weights;
-
- std::vector<JointData> joint_data; // index to this vector is joint index
-
- UnitConverter *unit_converter;
-
- Object *ob_arm;
- COLLADAFW::UniqueId controller_uid;
- Object *parent;
-
- public:
-
- SkinInfo() {}
-
- SkinInfo(const SkinInfo& skin) : weights(skin.weights),
- joint_data(skin.joint_data),
- unit_converter(skin.unit_converter),
- ob_arm(skin.ob_arm),
- controller_uid(skin.controller_uid),
- parent(skin.parent)
- {
- copy_m4_m4(bind_shape_matrix, (float (*)[4])skin.bind_shape_matrix);
-
- transfer_uint_array_data_const(skin.joints_per_vertex, joints_per_vertex);
- transfer_uint_array_data_const(skin.weight_indices, weight_indices);
- transfer_int_array_data_const(skin.joint_indices, joint_indices);
- }
-
- SkinInfo(UnitConverter *conv) : unit_converter(conv), ob_arm(NULL), parent(NULL) {}
-
- // nobody owns the data after this, so it should be freed manually with releaseMemory
- template <class T>
- void transfer_array_data(T& src, T& dest)
- {
- dest.setData(src.getData(), src.getCount());
- src.yieldOwnerShip();
- dest.yieldOwnerShip();
- }
-
- // when src is const we cannot src.yieldOwnerShip, this is used by copy constructor
- void transfer_int_array_data_const(const COLLADAFW::IntValuesArray& src, COLLADAFW::IntValuesArray& dest)
- {
- dest.setData((int*)src.getData(), src.getCount());
- dest.yieldOwnerShip();
- }
-
- void transfer_uint_array_data_const(const COLLADAFW::UIntValuesArray& src, COLLADAFW::UIntValuesArray& dest)
- {
- dest.setData((unsigned int*)src.getData(), src.getCount());
- dest.yieldOwnerShip();
- }
-
- void borrow_skin_controller_data(const COLLADAFW::SkinControllerData* skin)
- {
- transfer_array_data((COLLADAFW::UIntValuesArray&)skin->getJointsPerVertex(), joints_per_vertex);
- transfer_array_data((COLLADAFW::UIntValuesArray&)skin->getWeightIndices(), weight_indices);
- transfer_array_data((COLLADAFW::IntValuesArray&)skin->getJointIndices(), joint_indices);
- // transfer_array_data(skin->getWeights(), weights);
-
- // cannot transfer data for FloatOrDoubleArray, copy values manually
- const COLLADAFW::FloatOrDoubleArray& weight = skin->getWeights();
- for (unsigned int i = 0; i < weight.getValuesCount(); i++)
- weights.push_back(get_float_value(weight, i));
-
- unit_converter->dae_matrix_to_mat4(bind_shape_matrix, skin->getBindShapeMatrix());
- }
-
- void free()
- {
- joints_per_vertex.releaseMemory();
- weight_indices.releaseMemory();
- joint_indices.releaseMemory();
- // weights.releaseMemory();
- }
-
- // using inverse bind matrices to construct armature
- // it is safe to invert them to get the original matrices
- // because if they are inverse matrices, they can be inverted
- void add_joint(const COLLADABU::Math::Matrix4& matrix)
- {
- JointData jd;
- unit_converter->dae_matrix_to_mat4(jd.inv_bind_mat, matrix);
- joint_data.push_back(jd);
- }
-
- void set_controller(const COLLADAFW::SkinController* co)
- {
- controller_uid = co->getUniqueId();
-
- // fill in joint UIDs
- const COLLADAFW::UniqueIdArray& joint_uids = co->getJoints();
- for (unsigned int i = 0; i < joint_uids.getCount(); i++) {
- joint_data[i].joint_uid = joint_uids[i];
-
- // // store armature pointer
- // JointData& jd = joint_index_to_joint_info_map[i];
- // jd.ob_arm = ob_arm;
-
- // now we'll be able to get inv bind matrix from joint id
- // joint_id_to_joint_index_map[joint_ids[i]] = i;
- }
- }
-
- // called from write_controller
- Object *create_armature(Scene *scene)
- {
- ob_arm = add_object(scene, OB_ARMATURE);
- return ob_arm;
- }
-
- Object* set_armature(Object *ob_arm)
- {
- if (this->ob_arm)
- return this->ob_arm;
-
- this->ob_arm = ob_arm;
- return ob_arm;
- }
-
- bool get_joint_inv_bind_matrix(float inv_bind_mat[][4], COLLADAFW::Node *node)
- {
- const COLLADAFW::UniqueId& uid = node->getUniqueId();
- std::vector<JointData>::iterator it;
- for (it = joint_data.begin(); it != joint_data.end(); it++) {
- if ((*it).joint_uid == uid) {
- copy_m4_m4(inv_bind_mat, (*it).inv_bind_mat);
- return true;
- }
- }
-
- return false;
- }
-
- Object *get_armature()
- {
- return ob_arm;
- }
-
- const COLLADAFW::UniqueId& get_controller_uid()
- {
- return controller_uid;
- }
-
- // check if this skin controller references a joint or any descendant of it
- //
- // some nodes may not be referenced by SkinController,
- // in this case to determine if the node belongs to this armature,
- // we need to search down the tree
- bool uses_joint_or_descendant(COLLADAFW::Node *node)
- {
- const COLLADAFW::UniqueId& uid = node->getUniqueId();
- std::vector<JointData>::iterator it;
- for (it = joint_data.begin(); it != joint_data.end(); it++) {
- if ((*it).joint_uid == uid)
- return true;
- }
-
- COLLADAFW::NodePointerArray& children = node->getChildNodes();
- for (unsigned int i = 0; i < children.getCount(); i++) {
- if (uses_joint_or_descendant(children[i]))
- return true;
- }
-
- return false;
- }
-
- void link_armature(bContext *C, Object *ob, std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& joint_by_uid,
- TransformReader *tm)
- {
- Main *bmain = CTX_data_main(C);
- Scene *scene = CTX_data_scene(C);
-
- ModifierData *md = ED_object_modifier_add(NULL, bmain, scene, ob, NULL, eModifierType_Armature);
- ((ArmatureModifierData *)md)->object = ob_arm;
-
- copy_m4_m4(ob->obmat, bind_shape_matrix);
- object_apply_mat4(ob, ob->obmat);
-#if 1
- ::set_parent(ob, ob_arm, C);
-#else
- Object workob;
- ob->parent = ob_arm;
- ob->partype = PAROBJECT;
-
- what_does_parent(scene, ob, &workob);
- invert_m4_m4(ob->parentinv, workob.obmat);
-
- ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA;
-
- DAG_scene_sort(bmain, scene);
- DAG_ids_flush_update(bmain, 0);
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-#endif
-
- ((bArmature*)ob_arm->data)->deformflag = ARM_DEF_VGROUP;
-
- // create all vertex groups
- std::vector<JointData>::iterator it;
- int joint_index;
- for (it = joint_data.begin(), joint_index = 0; it != joint_data.end(); it++, joint_index++) {
- const char *name = "Group";
-
- // name group by joint node name
- if (joint_by_uid.find((*it).joint_uid) != joint_by_uid.end()) {
- name = get_joint_name(joint_by_uid[(*it).joint_uid]);
- }
-
- ED_vgroup_add_name(ob, (char*)name);
- }
-
- // <vcount> - number of joints per vertex - joints_per_vertex
- // <v> - [[bone index, weight index] * joints per vertex] * vertices - weight indices
- // ^ bone index can be -1 meaning weight toward bind shape, how to express this in Blender?
-
- // for each vertex in weight indices
- // for each bone index in vertex
- // add vertex to group at group index
- // treat group index -1 specially
-
- // get def group by index with BLI_findlink
-
- for (unsigned int vertex = 0, weight = 0; vertex < joints_per_vertex.getCount(); vertex++) {
-
- unsigned int limit = weight + joints_per_vertex[vertex];
- for ( ; weight < limit; weight++) {
- int joint = joint_indices[weight], joint_weight = weight_indices[weight];
-
- // -1 means "weight towards the bind shape", we just don't assign it to any group
- if (joint != -1) {
- bDeformGroup *def = (bDeformGroup*)BLI_findlink(&ob->defbase, joint);
-
- ED_vgroup_vert_add(ob, def, vertex, weights[joint_weight], WEIGHT_REPLACE);
- }
- }
- }
- }
-
- bPoseChannel *get_pose_channel_from_node(COLLADAFW::Node *node)
- {
- return get_pose_channel(ob_arm->pose, get_joint_name(node));
- }
-
- void set_parent(Object *_parent)
- {
- parent = _parent;
- }
-
- Object* get_parent()
- {
- return parent;
- }
-
- void find_root_joints(const std::vector<COLLADAFW::Node*> &root_joints,
- std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& joint_by_uid,
- std::vector<COLLADAFW::Node*>& result)
- {
- std::vector<COLLADAFW::Node*>::const_iterator it;
- for (it = root_joints.begin(); it != root_joints.end(); it++) {
- COLLADAFW::Node *root = *it;
- std::vector<JointData>::iterator ji;
- for (ji = joint_data.begin(); ji != joint_data.end(); ji++) {
- COLLADAFW::Node *joint = joint_by_uid[(*ji).joint_uid];
- if (find_node_in_tree(joint, root)) {
- if (std::find(result.begin(), result.end(), root) == result.end())
- result.push_back(root);
- }
- }
- }
- }
-
- bool find_node_in_tree(COLLADAFW::Node *node, COLLADAFW::Node *tree_root)
- {
- if (node == tree_root)
- return true;
-
- COLLADAFW::NodePointerArray& children = tree_root->getChildNodes();
- for (unsigned int i = 0; i < children.getCount(); i++) {
- if (find_node_in_tree(node, children[i]))
- return true;
- }
-
- return false;
- }
-
- };
-
- std::map<COLLADAFW::UniqueId, SkinInfo> skin_by_data_uid; // data UID = skin controller data UID
-#if 0
- JointData *get_joint_data(COLLADAFW::Node *node)
- {
- const COLLADAFW::UniqueId& joint_id = node->getUniqueId();
-
- if (joint_id_to_joint_index_map.find(joint_id) == joint_id_to_joint_index_map.end()) {
- fprintf(stderr, "Cannot find a joint index by joint id for %s.\n",
- node->getOriginalId().c_str());
- return NULL;
- }
-
- int joint_index = joint_id_to_joint_index_map[joint_id];
-
- return &joint_index_to_joint_info_map[joint_index];
- }
-#endif
-
- void create_bone(SkinInfo& skin, COLLADAFW::Node *node, EditBone *parent, int totchild,
- float parent_mat[][4], bArmature *arm)
- {
- float joint_inv_bind_mat[4][4];
-
- // JointData* jd = get_joint_data(node);
-
- float mat[4][4];
-
- if (skin.get_joint_inv_bind_matrix(joint_inv_bind_mat, node)) {
- // get original world-space matrix
- invert_m4_m4(mat, joint_inv_bind_mat);
- }
- // create a bone even if there's no joint data for it (i.e. it has no influence)
- else {
- float obmat[4][4];
-
- // object-space
- get_node_mat(obmat, node, NULL, NULL);
-
- // get world-space
- if (parent)
- mul_m4_m4m4(mat, obmat, parent_mat);
- else
- copy_m4_m4(mat, obmat);
- }
-
- // TODO rename from Node "name" attrs later
- EditBone *bone = ED_armature_edit_bone_add(arm, (char*)get_joint_name(node));
- totbone++;
-
- if (parent) bone->parent = parent;
-
- // set head
- copy_v3_v3(bone->head, mat[3]);
-
- // set tail, don't set it to head because 0-length bones are not allowed
- float vec[3] = {0.0f, 0.5f, 0.0f};
- add_v3_v3v3(bone->tail, bone->head, vec);
-
- // set parent tail
- if (parent && totchild == 1) {
- copy_v3_v3(parent->tail, bone->head);
-
- // not setting BONE_CONNECTED because this would lock child bone location with respect to parent
- // bone->flag |= BONE_CONNECTED;
-
- // XXX increase this to prevent "very" small bones?
- const float epsilon = 0.000001f;
-
- // derive leaf bone length
- float length = len_v3v3(parent->head, parent->tail);
- if ((length < leaf_bone_length || totbone == 0) && length > epsilon) {
- leaf_bone_length = length;
- }
-
- // treat zero-sized bone like a leaf bone
- if (length <= epsilon) {
- add_leaf_bone(parent_mat, parent);
- }
-
- /*
-#if 0
- // and which row in mat is bone direction
- float vec[3];
- sub_v3_v3v3(vec, parent->tail, parent->head);
-#ifdef COLLADA_DEBUG
- print_v3("tail - head", vec);
- print_m4("matrix", parent_mat);
-#endif
- for (int i = 0; i < 3; i++) {
-#ifdef COLLADA_DEBUG
- char *axis_names[] = {"X", "Y", "Z"};
- printf("%s-axis length is %f\n", axis_names[i], len_v3(parent_mat[i]));
-#endif
- float angle = angle_v2v2(vec, parent_mat[i]);
- if (angle < min_angle) {
-#ifdef COLLADA_DEBUG
- print_v3("picking", parent_mat[i]);
- printf("^ %s axis of %s's matrix\n", axis_names[i], get_dae_name(node));
-#endif
- bone_direction_row = i;
- min_angle = angle;
- }
- }
-#endif
- */
- }
-
- COLLADAFW::NodePointerArray& children = node->getChildNodes();
- for (unsigned int i = 0; i < children.getCount(); i++) {
- create_bone(skin, children[i], bone, children.getCount(), mat, arm);
- }
-
- // in second case it's not a leaf bone, but we handle it the same way
- if (!children.getCount() || children.getCount() > 1) {
- add_leaf_bone(mat, bone);
- }
- }
-
- void add_leaf_bone(float mat[][4], EditBone *bone)
- {
- LeafBone leaf;
-
- leaf.bone = bone;
- copy_m4_m4(leaf.mat, mat);
- BLI_strncpy(leaf.name, bone->name, sizeof(leaf.name));
-
- leaf_bones.push_back(leaf);
- }
-
- void fix_leaf_bones()
- {
- // just setting tail for leaf bones here
-
- std::vector<LeafBone>::iterator it;
- for (it = leaf_bones.begin(); it != leaf_bones.end(); it++) {
- LeafBone& leaf = *it;
-
- // pointing up
- float vec[3] = {0.0f, 0.0f, 1.0f};
-
- mul_v3_fl(vec, leaf_bone_length);
-
- copy_v3_v3(leaf.bone->tail, leaf.bone->head);
- add_v3_v3v3(leaf.bone->tail, leaf.bone->head, vec);
- }
- }
-
- void set_leaf_bone_shapes(Object *ob_arm)
- {
- bPose *pose = ob_arm->pose;
-
- std::vector<LeafBone>::iterator it;
- for (it = leaf_bones.begin(); it != leaf_bones.end(); it++) {
- LeafBone& leaf = *it;
-
- bPoseChannel *pchan = get_pose_channel(pose, leaf.name);
- if (pchan) {
- pchan->custom = get_empty_for_leaves();
- }
- else {
- fprintf(stderr, "Cannot find a pose channel for leaf bone %s\n", leaf.name);
- }
- }
- }
-
-#if 0
- void set_euler_rotmode()
- {
- // just set rotmode = ROT_MODE_EUL on pose channel for each joint
-
- std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>::iterator it;
-
- for (it = joint_by_uid.begin(); it != joint_by_uid.end(); it++) {
-
- COLLADAFW::Node *joint = it->second;
-
- std::map<COLLADAFW::UniqueId, SkinInfo>::iterator sit;
-
- for (sit = skin_by_data_uid.begin(); sit != skin_by_data_uid.end(); sit++) {
- SkinInfo& skin = sit->second;
-
- if (skin.uses_joint_or_descendant(joint)) {
- bPoseChannel *pchan = skin.get_pose_channel_from_node(joint);
-
- if (pchan) {
- pchan->rotmode = ROT_MODE_EUL;
- }
- else {
- fprintf(stderr, "Cannot find pose channel for %s.\n", get_joint_name(joint));
- }
-
- break;
- }
- }
- }
- }
-#endif
-
- Object *get_empty_for_leaves()
- {
- if (empty) return empty;
-
- empty = add_object(scene, OB_EMPTY);
- empty->empty_drawtype = OB_EMPTY_SPHERE;
-
- return empty;
- }
-
-#if 0
- Object *find_armature(COLLADAFW::Node *node)
- {
- JointData* jd = get_joint_data(node);
- if (jd) return jd->ob_arm;
-
- COLLADAFW::NodePointerArray& children = node->getChildNodes();
- for (int i = 0; i < children.getCount(); i++) {
- Object *ob_arm = find_armature(children[i]);
- if (ob_arm) return ob_arm;
- }
-
- return NULL;
- }
-
- ArmatureJoints& get_armature_joints(Object *ob_arm)
- {
- // try finding it
- std::vector<ArmatureJoints>::iterator it;
- for (it = armature_joints.begin(); it != armature_joints.end(); it++) {
- if ((*it).ob_arm == ob_arm) return *it;
- }
-
- // not found, create one
- ArmatureJoints aj;
- aj.ob_arm = ob_arm;
- armature_joints.push_back(aj);
-
- return armature_joints.back();
- }
-#endif
-
- void create_armature_bones(SkinInfo& skin)
- {
- // just do like so:
- // - get armature
- // - enter editmode
- // - add edit bones and head/tail properties using matrices and parent-child info
- // - exit edit mode
- // - set a sphere shape to leaf bones
-
- Object *ob_arm = NULL;
-
- /*
- * find if there's another skin sharing at least one bone with this skin
- * if so, use that skin's armature
- */
-
- /*
- Pseudocode:
-
- find_node_in_tree(node, root_joint)
-
- skin::find_root_joints(root_joints):
- std::vector root_joints;
- for each root in root_joints:
- for each joint in joints:
- if find_node_in_tree(joint, root):
- if (std::find(root_joints.begin(), root_joints.end(), root) == root_joints.end())
- root_joints.push_back(root);
-
- for (each skin B with armature) {
- find all root joints for skin B
-
- for each joint X in skin A:
- for each root joint R in skin B:
- if (find_node_in_tree(X, R)) {
- shared = 1;
- goto endloop;
- }
- }
-
- endloop:
- */
-
- SkinInfo *a = &skin;
- Object *shared = NULL;
- std::vector<COLLADAFW::Node*> skin_root_joints;
-
- std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
- for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
- SkinInfo *b = &it->second;
- if (b == a || b->get_armature() == NULL)
- continue;
-
- skin_root_joints.clear();
-
- b->find_root_joints(root_joints, joint_by_uid, skin_root_joints);
-
- std::vector<COLLADAFW::Node*>::iterator ri;
- for (ri = skin_root_joints.begin(); ri != skin_root_joints.end(); ri++) {
- if (a->uses_joint_or_descendant(*ri)) {
- shared = b->get_armature();
- break;
- }
- }
-
- if (shared != NULL)
- break;
- }
-
- if (shared)
- ob_arm = skin.set_armature(shared);
- else
- ob_arm = skin.create_armature(scene);
-
- // enter armature edit mode
- ED_armature_to_edit(ob_arm);
-
- leaf_bones.clear();
- totbone = 0;
- // bone_direction_row = 1; // TODO: don't default to Y but use asset and based on it decide on default row
- leaf_bone_length = 0.1f;
- // min_angle = 360.0f; // minimum angle between bone head-tail and a row of bone matrix
-
- // create bones
- /*
- TODO:
- check if bones have already been created for a given joint
- */
-
- std::vector<COLLADAFW::Node*>::iterator ri;
- for (ri = root_joints.begin(); ri != root_joints.end(); ri++) {
- // for shared armature check if bone tree is already created
- if (shared && std::find(skin_root_joints.begin(), skin_root_joints.end(), *ri) != skin_root_joints.end())
- continue;
-
- // since root_joints may contain joints for multiple controllers, we need to filter
- if (skin.uses_joint_or_descendant(*ri)) {
- create_bone(skin, *ri, NULL, (*ri)->getChildNodes().getCount(), NULL, (bArmature*)ob_arm->data);
-
- if (joint_parent_map.find((*ri)->getUniqueId()) != joint_parent_map.end() && !skin.get_parent())
- skin.set_parent(joint_parent_map[(*ri)->getUniqueId()]);
- }
- }
-
- fix_leaf_bones();
-
- // exit armature edit mode
- ED_armature_from_edit(ob_arm);
- ED_armature_edit_free(ob_arm);
- DAG_id_flush_update(&ob_arm->id, OB_RECALC_OB|OB_RECALC_DATA);
-
- set_leaf_bone_shapes(ob_arm);
-
- // set_euler_rotmode();
- }
-
-
-public:
-
- ArmatureImporter(UnitConverter *conv, MeshImporterBase *mesh, AnimationImporterBase *anim, Scene *sce) :
- TransformReader(conv), scene(sce), empty(NULL), mesh_importer(mesh), anim_importer(anim) {}
-
- ~ArmatureImporter()
- {
- // free skin controller data if we forget to do this earlier
- std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
- for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
- it->second.free();
- }
- }
-
- // root - if this joint is the top joint in hierarchy, if a joint
- // is a child of a node (not joint), root should be true since
- // this is where we build armature bones from
- void add_joint(COLLADAFW::Node *node, bool root, Object *parent)
- {
- joint_by_uid[node->getUniqueId()] = node;
- if (root) {
- root_joints.push_back(node);
-
- if (parent)
- joint_parent_map[node->getUniqueId()] = parent;
- }
- }
-
-#if 0
- void add_root_joint(COLLADAFW::Node *node)
- {
- // root_joints.push_back(node);
- Object *ob_arm = find_armature(node);
- if (ob_arm) {
- get_armature_joints(ob_arm).root_joints.push_back(node);
- }
-#ifdef COLLADA_DEBUG
- else {
- fprintf(stderr, "%s cannot be added to armature.\n", get_joint_name(node));
- }
-#endif
- }
-#endif
-
- // here we add bones to armatures, having armatures previously created in write_controller
- void make_armatures(bContext *C)
- {
- std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
- for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
-
- SkinInfo& skin = it->second;
-
- create_armature_bones(skin);
-
- // link armature with a mesh object
- Object *ob = mesh_importer->get_object_by_geom_uid(*get_geometry_uid(skin.get_controller_uid()));
- if (ob)
- skin.link_armature(C, ob, joint_by_uid, this);
- else
- fprintf(stderr, "Cannot find object to link armature with.\n");
-
- // set armature parent if any
- Object *par = skin.get_parent();
- if (par)
- set_parent(skin.get_armature(), par, C, false);
-
- // free memory stolen from SkinControllerData
- skin.free();
- }
- }
-
-#if 0
- // link with meshes, create vertex groups, assign weights
- void link_armature(Object *ob_arm, const COLLADAFW::UniqueId& geom_id, const COLLADAFW::UniqueId& controller_data_id)
- {
- Object *ob = mesh_importer->get_object_by_geom_uid(geom_id);
-
- if (!ob) {
- fprintf(stderr, "Cannot find object by geometry UID.\n");
- return;
- }
-
- if (skin_by_data_uid.find(controller_data_id) == skin_by_data_uid.end()) {
- fprintf(stderr, "Cannot find skin info by controller data UID.\n");
- return;
- }
-
- SkinInfo& skin = skin_by_data_uid[conroller_data_id];
-
- // create vertex groups
- }
-#endif
-
- bool write_skin_controller_data(const COLLADAFW::SkinControllerData* data)
- {
- // at this stage we get vertex influence info that should go into me->verts and ob->defbase
- // there's no info to which object this should be long so we associate it with skin controller data UID
-
- // don't forget to call defgroup_unique_name before we copy
-
- // controller data uid -> [armature] -> joint data,
- // [mesh object]
- //
-
- SkinInfo skin(unit_converter);
- skin.borrow_skin_controller_data(data);
-
- // store join inv bind matrix to use it later in armature construction
- const COLLADAFW::Matrix4Array& inv_bind_mats = data->getInverseBindMatrices();
- for (unsigned int i = 0; i < data->getJointsCount(); i++) {
- skin.add_joint(inv_bind_mats[i]);
- }
-
- skin_by_data_uid[data->getUniqueId()] = skin;
-
- return true;
- }
-
- bool write_controller(const COLLADAFW::Controller* controller)
- {
- // - create and store armature object
-
- const COLLADAFW::UniqueId& skin_id = controller->getUniqueId();
-
- if (controller->getControllerType() == COLLADAFW::Controller::CONTROLLER_TYPE_SKIN) {
- COLLADAFW::SkinController *co = (COLLADAFW::SkinController*)controller;
- // to be able to find geom id by controller id
- geom_uid_by_controller_uid[skin_id] = co->getSource();
-
- const COLLADAFW::UniqueId& data_uid = co->getSkinControllerData();
- if (skin_by_data_uid.find(data_uid) == skin_by_data_uid.end()) {
- fprintf(stderr, "Cannot find skin by controller data UID.\n");
- return true;
- }
-
- skin_by_data_uid[data_uid].set_controller(co);
- }
- // morph controller
- else {
- // shape keys? :)
- fprintf(stderr, "Morph controller is not supported yet.\n");
- }
-
- return true;
- }
-
- COLLADAFW::UniqueId *get_geometry_uid(const COLLADAFW::UniqueId& controller_uid)
- {
- if (geom_uid_by_controller_uid.find(controller_uid) == geom_uid_by_controller_uid.end())
- return NULL;
-
- return &geom_uid_by_controller_uid[controller_uid];
- }
-
- Object *get_armature_for_joint(COLLADAFW::Node *node)
- {
- std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
- for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
- SkinInfo& skin = it->second;
-
- if (skin.uses_joint_or_descendant(node))
- return skin.get_armature();
- }
-
- return NULL;
- }
-
- void get_rna_path_for_joint(COLLADAFW::Node *node, char *joint_path, size_t count)
- {
- BLI_snprintf(joint_path, count, "pose.bones[\"%s\"]", get_joint_name(node));
- }
-
- // gives a world-space mat
- bool get_joint_bind_mat(float m[][4], COLLADAFW::Node *joint)
- {
- std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
- bool found = false;
- for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
- SkinInfo& skin = it->second;
- if ((found = skin.get_joint_inv_bind_matrix(m, joint))) {
- invert_m4(m);
- break;
- }
- }
-
- return found;
- }
-};
-
-class MeshImporter : public MeshImporterBase
-{
-private:
-
- Scene *scene;
- ArmatureImporter *armature_importer;
-
- std::map<COLLADAFW::UniqueId, Mesh*> uid_mesh_map; // geometry unique id-to-mesh map
- std::map<COLLADAFW::UniqueId, Object*> uid_object_map; // geom uid-to-object
- // this structure is used to assign material indices to faces
- // it holds a portion of Mesh faces and corresponds to a DAE primitive list (<triangles>, <polylist>, etc.)
- struct Primitive {
- MFace *mface;
- unsigned int totface;
- };
- typedef std::map<COLLADAFW::MaterialId, std::vector<Primitive> > MaterialIdPrimitiveArrayMap;
- std::map<COLLADAFW::UniqueId, MaterialIdPrimitiveArrayMap> geom_uid_mat_mapping_map; // crazy name!
-
- class UVDataWrapper
- {
- COLLADAFW::MeshVertexData *mVData;
- public:
- UVDataWrapper(COLLADAFW::MeshVertexData& vdata) : mVData(&vdata)
- {}
-
-#ifdef COLLADA_DEBUG
- void print()
- {
- fprintf(stderr, "UVs:\n");
- switch(mVData->getType()) {
- case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
- {
- COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues();
- if (values->getCount()) {
- for (int i = 0; i < values->getCount(); i += 2) {
- fprintf(stderr, "%.1f, %.1f\n", (*values)[i], (*values)[i+1]);
- }
- }
- }
- break;
- case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
- {
- COLLADAFW::ArrayPrimitiveType<double>* values = mVData->getDoubleValues();
- if (values->getCount()) {
- for (int i = 0; i < values->getCount(); i += 2) {
- fprintf(stderr, "%.1f, %.1f\n", (float)(*values)[i], (float)(*values)[i+1]);
- }
- }
- }
- break;
- }
- fprintf(stderr, "\n");
- }
-#endif
-
- void getUV(int uv_index[2], float *uv)
- {
- switch(mVData->getType()) {
- case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
- {
- COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues();
- if (values->empty()) return;
- uv[0] = (*values)[uv_index[0]];
- uv[1] = (*values)[uv_index[1]];
-
- }
- break;
- case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
- {
- COLLADAFW::ArrayPrimitiveType<double>* values = mVData->getDoubleValues();
- if (values->empty()) return;
- uv[0] = (float)(*values)[uv_index[0]];
- uv[1] = (float)(*values)[uv_index[1]];
-
- }
- break;
- case COLLADAFW::MeshVertexData::DATA_TYPE_UNKNOWN:
- default:
- fprintf(stderr, "MeshImporter.getUV(): unknown data type\n");
- }
- }
- };
-
- void set_face_indices(MFace *mface, unsigned int *indices, bool quad)
- {
- mface->v1 = indices[0];
- mface->v2 = indices[1];
- mface->v3 = indices[2];
- if (quad) mface->v4 = indices[3];
- else mface->v4 = 0;
-#ifdef COLLADA_DEBUG
- // fprintf(stderr, "%u, %u, %u \n", indices[0], indices[1], indices[2]);
-#endif
- }
-
- // not used anymore, test_index_face from blenkernel is better
-#if 0
- // change face indices order so that v4 is not 0
- void rotate_face_indices(MFace *mface) {
- mface->v4 = mface->v1;
- mface->v1 = mface->v2;
- mface->v2 = mface->v3;
- mface->v3 = 0;
- }
-#endif
-
- void set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
- COLLADAFW::IndexList& index_list, unsigned int *tris_indices)
- {
- int uv_indices[4][2];
-
- // per face vertex indices, this means for quad we have 4 indices, not 8
- COLLADAFW::UIntValuesArray& indices = index_list.getIndices();
-
- // make indices into FloatOrDoubleArray
- for (int i = 0; i < 3; i++) {
- int uv_index = indices[tris_indices[i]];
- uv_indices[i][0] = uv_index * 2;
- uv_indices[i][1] = uv_index * 2 + 1;
- }
-
- uvs.getUV(uv_indices[0], mtface->uv[0]);
- uvs.getUV(uv_indices[1], mtface->uv[1]);
- uvs.getUV(uv_indices[2], mtface->uv[2]);
- }
-
- void set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
- COLLADAFW::IndexList& index_list, int index, bool quad)
- {
- int uv_indices[4][2];
-
- // per face vertex indices, this means for quad we have 4 indices, not 8
- COLLADAFW::UIntValuesArray& indices = index_list.getIndices();
-
- // make indices into FloatOrDoubleArray
- for (int i = 0; i < (quad ? 4 : 3); i++) {
- int uv_index = indices[index + i];
- uv_indices[i][0] = uv_index * 2;
- uv_indices[i][1] = uv_index * 2 + 1;
- }
-
- uvs.getUV(uv_indices[0], mtface->uv[0]);
- uvs.getUV(uv_indices[1], mtface->uv[1]);
- uvs.getUV(uv_indices[2], mtface->uv[2]);
-
- if (quad) uvs.getUV(uv_indices[3], mtface->uv[3]);
-
-#ifdef COLLADA_DEBUG
- /*if (quad) {
- fprintf(stderr, "face uv:\n"
- "((%d, %d), (%d, %d), (%d, %d), (%d, %d))\n"
- "((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n",
-
- uv_indices[0][0], uv_indices[0][1],
- uv_indices[1][0], uv_indices[1][1],
- uv_indices[2][0], uv_indices[2][1],
- uv_indices[3][0], uv_indices[3][1],
-
- mtface->uv[0][0], mtface->uv[0][1],
- mtface->uv[1][0], mtface->uv[1][1],
- mtface->uv[2][0], mtface->uv[2][1],
- mtface->uv[3][0], mtface->uv[3][1]);
- }
- else {
- fprintf(stderr, "face uv:\n"
- "((%d, %d), (%d, %d), (%d, %d))\n"
- "((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n",
-
- uv_indices[0][0], uv_indices[0][1],
- uv_indices[1][0], uv_indices[1][1],
- uv_indices[2][0], uv_indices[2][1],
-
- mtface->uv[0][0], mtface->uv[0][1],
- mtface->uv[1][0], mtface->uv[1][1],
- mtface->uv[2][0], mtface->uv[2][1]);
- }*/
-#endif
- }
-
-#ifdef COLLADA_DEBUG
- void print_index_list(COLLADAFW::IndexList& index_list)
- {
- fprintf(stderr, "Index list for \"%s\":\n", index_list.getName().c_str());
- for (int i = 0; i < index_list.getIndicesCount(); i += 2) {
- fprintf(stderr, "%u, %u\n", index_list.getIndex(i), index_list.getIndex(i + 1));
- }
- fprintf(stderr, "\n");
- }
-#endif
-
- bool is_nice_mesh(COLLADAFW::Mesh *mesh)
- {
- COLLADAFW::MeshPrimitiveArray& prim_arr = mesh->getMeshPrimitives();
-
- const char *name = get_dae_name(mesh);
-
- for (unsigned i = 0; i < prim_arr.getCount(); i++) {
-
- COLLADAFW::MeshPrimitive *mp = prim_arr[i];
- COLLADAFW::MeshPrimitive::PrimitiveType type = mp->getPrimitiveType();
-
- const char *type_str = primTypeToStr(type);
-
- // OpenCollada passes POLYGONS type for <polylist>
- if (type == COLLADAFW::MeshPrimitive::POLYLIST || type == COLLADAFW::MeshPrimitive::POLYGONS) {
-
- COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons*)mp;
- COLLADAFW::Polygons::VertexCountArray& vca = mpvc->getGroupedVerticesVertexCountArray();
-
- for(unsigned int j = 0; j < vca.getCount(); j++){
- int count = vca[j];
- if (count < 3) {
- fprintf(stderr, "Primitive %s in %s has at least one face with vertex count < 3\n",
- type_str, name);
- return false;
- }
- }
-
- }
- else if(type != COLLADAFW::MeshPrimitive::TRIANGLES) {
- fprintf(stderr, "Primitive type %s is not supported.\n", type_str);
- return false;
- }
- }
-
- if (mesh->getPositions().empty()) {
- fprintf(stderr, "Mesh %s has no vertices.\n", name);
- return false;
- }
-
- return true;
- }
-
- void read_vertices(COLLADAFW::Mesh *mesh, Mesh *me)
- {
- // vertices
- me->totvert = mesh->getPositions().getFloatValues()->getCount() / 3;
- me->mvert = (MVert*)CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, me->totvert);
-
- COLLADAFW::MeshVertexData& pos = mesh->getPositions();
- MVert *mvert;
- int i;
-
- for (i = 0, mvert = me->mvert; i < me->totvert; i++, mvert++)
- get_vector(mvert->co, pos, i);
- }
-
- int triangulate_poly(unsigned int *indices, int totvert, MVert *verts, std::vector<unsigned int>& tri)
- {
- ListBase dispbase;
- DispList *dl;
- float *vert;
- int i = 0;
-
- dispbase.first = dispbase.last = NULL;
-
- dl = (DispList*)MEM_callocN(sizeof(DispList), "poly disp");
- dl->nr = totvert;
- dl->type = DL_POLY;
- dl->parts = 1;
- dl->verts = vert = (float*)MEM_callocN(totvert * 3 * sizeof(float), "poly verts");
- dl->index = (int*)MEM_callocN(sizeof(int) * 3 * totvert, "dl index");
-
- BLI_addtail(&dispbase, dl);
-
- for (i = 0; i < totvert; i++) {
- copy_v3_v3(vert, verts[indices[i]].co);
- vert += 3;
- }
-
- filldisplist(&dispbase, &dispbase, 0);
-
- int tottri = 0;
- dl= (DispList*)dispbase.first;
-
- if (dl->type == DL_INDEX3) {
- tottri = dl->parts;
-
- int *index = dl->index;
- for (i= 0; i < tottri; i++) {
- int t[3]= {*index, *(index + 1), *(index + 2)};
-
- std::sort(t, t + 3);
-
- tri.push_back(t[0]);
- tri.push_back(t[1]);
- tri.push_back(t[2]);
-
- index += 3;
- }
- }
-
- freedisplist(&dispbase);
-
- return tottri;
- }
-
- int count_new_tris(COLLADAFW::Mesh *mesh, Mesh *me)
- {
- COLLADAFW::MeshPrimitiveArray& prim_arr = mesh->getMeshPrimitives();
- unsigned int i;
- int tottri = 0;
-
- for (i = 0; i < prim_arr.getCount(); i++) {
-
- COLLADAFW::MeshPrimitive *mp = prim_arr[i];
- int type = mp->getPrimitiveType();
- size_t prim_totface = mp->getFaceCount();
- unsigned int *indices = mp->getPositionIndices().getData();
-
- if (type == COLLADAFW::MeshPrimitive::POLYLIST ||
- type == COLLADAFW::MeshPrimitive::POLYGONS) {
-
- COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons*)mp;
- COLLADAFW::Polygons::VertexCountArray& vcounta = mpvc->getGroupedVerticesVertexCountArray();
-
- for (unsigned int j = 0; j < prim_totface; j++) {
- int vcount = vcounta[j];
-
- if (vcount > 4) {
- std::vector<unsigned int> tri;
-
- // tottri += triangulate_poly(indices, vcount, me->mvert, tri) - 1; // XXX why - 1?!
- tottri += triangulate_poly(indices, vcount, me->mvert, tri);
- }
-
- indices += vcount;
- }
- }
- }
- return tottri;
- }
-
- // TODO: import uv set names
- void read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris)
- {
- unsigned int i;
-
- // allocate faces
- me->totface = mesh->getFacesCount() + new_tris;
- me->mface = (MFace*)CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, me->totface);
-
- // allocate UV layers
- unsigned int totuvset = mesh->getUVCoords().getInputInfosArray().getCount();
-
- // for (i = 0; i < totuvset; i++) {
- // if (mesh->getUVCoords().getLength(i) == 0) {
- // totuvset = 0;
- // break;
- // }
- // }
-
- for (i = 0; i < totuvset; i++) {
- if (mesh->getUVCoords().getLength(i) == 0) {
- totuvset = 0;
- break;
- }
- }
-
- for (i = 0; i < totuvset; i++) {
- CustomData_add_layer(&me->fdata, CD_MTFACE, CD_CALLOC, NULL, me->totface);
- //this->set_layername_map[i] = CustomData_get_layer_name(&me->fdata, CD_MTFACE, i);
- }
-
- // activate the first uv layer
- if (totuvset) me->mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, 0);
-
- UVDataWrapper uvs(mesh->getUVCoords());
-
-#ifdef COLLADA_DEBUG
- // uvs.print();
-#endif
-
- MFace *mface = me->mface;
-
- MaterialIdPrimitiveArrayMap mat_prim_map;
-
- int face_index = 0;
-
- COLLADAFW::MeshPrimitiveArray& prim_arr = mesh->getMeshPrimitives();
-
- bool has_normals = mesh->hasNormals();
- COLLADAFW::MeshVertexData& nor = mesh->getNormals();
-
- for (i = 0; i < prim_arr.getCount(); i++) {
-
- COLLADAFW::MeshPrimitive *mp = prim_arr[i];
-
- // faces
- size_t prim_totface = mp->getFaceCount();
- unsigned int *indices = mp->getPositionIndices().getData();
- unsigned int *nind = mp->getNormalIndices().getData();
- unsigned int j, k;
- int type = mp->getPrimitiveType();
- int index = 0;
-
- // since we cannot set mface->mat_nr here, we store a portion of me->mface in Primitive
- Primitive prim = {mface, 0};
- COLLADAFW::IndexListArray& index_list_array = mp->getUVCoordIndicesArray();
-
-#ifdef COLLADA_DEBUG
- /*
- fprintf(stderr, "Primitive %d:\n", i);
- for (int j = 0; j < totuvset; j++) {
- print_index_list(*index_list_array[j]);
- }
- */
-#endif
-
- if (type == COLLADAFW::MeshPrimitive::TRIANGLES) {
- for (j = 0; j < prim_totface; j++){
-
- set_face_indices(mface, indices, false);
- indices += 3;
-
-#if 0
- for (k = 0; k < totuvset; k++) {
- if (!index_list_array.empty() && index_list_array[k]) {
- // get mtface by face index and uv set index
- MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k);
- set_face_uv(&mtface[face_index], uvs, k, *index_list_array[k], index, false);
- }
- }
-#else
- for (k = 0; k < index_list_array.getCount(); k++) {
- int uvset_index = index_list_array[k]->getSetIndex();
-
- // get mtface by face index and uv set index
- MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, uvset_index);
- set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, false);
- }
-#endif
-
- test_index_face(mface, &me->fdata, face_index, 3);
-
- if (has_normals) {
- if (!flat_face(nind, nor, 3))
- mface->flag |= ME_SMOOTH;
-
- nind += 3;
- }
-
- index += 3;
- mface++;
- face_index++;
- prim.totface++;
- }
- }
- else if (type == COLLADAFW::MeshPrimitive::POLYLIST || type == COLLADAFW::MeshPrimitive::POLYGONS) {
- COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons*)mp;
- COLLADAFW::Polygons::VertexCountArray& vcounta = mpvc->getGroupedVerticesVertexCountArray();
-
- for (j = 0; j < prim_totface; j++) {
-
- // face
- int vcount = vcounta[j];
- if (vcount == 3 || vcount == 4) {
-
- set_face_indices(mface, indices, vcount == 4);
-
- // set mtface for each uv set
- // it is assumed that all primitives have equal number of UV sets
-
-#if 0
- for (k = 0; k < totuvset; k++) {
- if (!index_list_array.empty() && index_list_array[k]) {
- // get mtface by face index and uv set index
- MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k);
- set_face_uv(&mtface[face_index], uvs, k, *index_list_array[k], index, mface->v4 != 0);
- }
- }
-#else
- for (k = 0; k < index_list_array.getCount(); k++) {
- int uvset_index = index_list_array[k]->getSetIndex();
-
- // get mtface by face index and uv set index
- MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, uvset_index);
- set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, mface->v4 != 0);
- }
-#endif
-
- test_index_face(mface, &me->fdata, face_index, vcount);
-
- if (has_normals) {
- if (!flat_face(nind, nor, vcount))
- mface->flag |= ME_SMOOTH;
-
- nind += vcount;
- }
-
- mface++;
- face_index++;
- prim.totface++;
-
- }
- else {
- std::vector<unsigned int> tri;
-
- triangulate_poly(indices, vcount, me->mvert, tri);
-
- for (k = 0; k < tri.size() / 3; k++) {
- int v = k * 3;
- unsigned int uv_indices[3] = {
- index + tri[v],
- index + tri[v + 1],
- index + tri[v + 2]
- };
- unsigned int tri_indices[3] = {
- indices[tri[v]],
- indices[tri[v + 1]],
- indices[tri[v + 2]]
- };
-
- set_face_indices(mface, tri_indices, false);
-
-#if 0
- for (unsigned int l = 0; l < totuvset; l++) {
- if (!index_list_array.empty() && index_list_array[l]) {
- // get mtface by face index and uv set index
- MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, l);
- set_face_uv(&mtface[face_index], uvs, l, *index_list_array[l], uv_indices);
- }
- }
-#else
- for (unsigned int l = 0; l < index_list_array.getCount(); l++) {
- int uvset_index = index_list_array[l]->getSetIndex();
-
- // get mtface by face index and uv set index
- MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, uvset_index);
- set_face_uv(&mtface[face_index], uvs, *index_list_array[l], uv_indices);
- }
-#endif
-
-
- test_index_face(mface, &me->fdata, face_index, 3);
-
- if (has_normals) {
- unsigned int ntri[3] = {nind[tri[v]], nind[tri[v + 1]], nind[tri[v + 2]]};
-
- if (!flat_face(ntri, nor, 3))
- mface->flag |= ME_SMOOTH;
- }
-
- mface++;
- face_index++;
- prim.totface++;
- }
-
- if (has_normals)
- nind += vcount;
- }
-
- index += vcount;
- indices += vcount;
- }
- }
-
- mat_prim_map[mp->getMaterialId()].push_back(prim);
- }
-
- geom_uid_mat_mapping_map[mesh->getUniqueId()] = mat_prim_map;
- }
-
- void get_vector(float v[3], COLLADAFW::MeshVertexData& arr, int i)
- {
- i *= 3;
-
- switch(arr.getType()) {
- case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
- {
- COLLADAFW::ArrayPrimitiveType<float>* values = arr.getFloatValues();
- if (values->empty()) return;
-
- v[0] = (*values)[i++];
- v[1] = (*values)[i++];
- v[2] = (*values)[i];
- }
- break;
- case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
- {
- COLLADAFW::ArrayPrimitiveType<double>* values = arr.getDoubleValues();
- if (values->empty()) return;
-
- v[0] = (float)(*values)[i++];
- v[1] = (float)(*values)[i++];
- v[2] = (float)(*values)[i];
- }
- break;
- default:
- break;
- }
- }
-
- bool flat_face(unsigned int *nind, COLLADAFW::MeshVertexData& nor, int count)
- {
- float a[3], b[3];
-
- get_vector(a, nor, *nind);
- normalize_v3(a);
-
- nind++;
-
- for (int i = 1; i < count; i++, nind++) {
- get_vector(b, nor, *nind);
- normalize_v3(b);
-
- float dp = dot_v3v3(a, b);
-
- if (dp < 0.99999f || dp > 1.00001f)
- return false;
- }
-
- return true;
- }
-
-public:
-
- MeshImporter(ArmatureImporter *arm, Scene *sce) : scene(sce), armature_importer(arm) {}
-
- virtual Object *get_object_by_geom_uid(const COLLADAFW::UniqueId& geom_uid)
- {
- if (uid_object_map.find(geom_uid) != uid_object_map.end())
- return uid_object_map[geom_uid];
- return NULL;
- }
-
- MTex *assign_textures_to_uvlayer(COLLADAFW::TextureCoordinateBinding &ctexture,
- Mesh *me, TexIndexTextureArrayMap& texindex_texarray_map,
- MTex *color_texture)
- {
- COLLADAFW::TextureMapId texture_index = ctexture.getTextureMapId();
- char *uvname = CustomData_get_layer_name(&me->fdata, CD_MTFACE, ctexture.getSetIndex());
-
- if (texindex_texarray_map.find(texture_index) == texindex_texarray_map.end()) {
-
- fprintf(stderr, "Cannot find texture array by texture index.\n");
- return color_texture;
- }
-
- std::vector<MTex*> textures = texindex_texarray_map[texture_index];
-
- std::vector<MTex*>::iterator it;
-
- for (it = textures.begin(); it != textures.end(); it++) {
-
- MTex *texture = *it;
-
- if (texture) {
- strcpy(texture->uvname, uvname);
- if (texture->mapto == MAP_COL) color_texture = texture;
- }
- }
- return color_texture;
- }
-
- MTFace *assign_material_to_geom(COLLADAFW::MaterialBinding cmaterial,
- std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
- Object *ob, const COLLADAFW::UniqueId *geom_uid,
- MTex **color_texture, char *layername, MTFace *texture_face,
- std::map<Material*, TexIndexTextureArrayMap>& material_texture_mapping_map, int mat_index)
- {
- Mesh *me = (Mesh*)ob->data;
- const COLLADAFW::UniqueId& ma_uid = cmaterial.getReferencedMaterial();
-
- // do we know this material?
- if (uid_material_map.find(ma_uid) == uid_material_map.end()) {
-
- fprintf(stderr, "Cannot find material by UID.\n");
- return NULL;
- }
-
- Material *ma = uid_material_map[ma_uid];
- assign_material(ob, ma, ob->totcol + 1);
-
- COLLADAFW::TextureCoordinateBindingArray& tex_array =
- cmaterial.getTextureCoordinateBindingArray();
- TexIndexTextureArrayMap texindex_texarray_map = material_texture_mapping_map[ma];
- unsigned int i;
- // loop through <bind_vertex_inputs>
- for (i = 0; i < tex_array.getCount(); i++) {
-
- *color_texture = assign_textures_to_uvlayer(tex_array[i], me, texindex_texarray_map,
- *color_texture);
- }
-
- // set texture face
- if (*color_texture &&
- strlen((*color_texture)->uvname) &&
- strcmp(layername, (*color_texture)->uvname) != 0) {
-
- texture_face = (MTFace*)CustomData_get_layer_named(&me->fdata, CD_MTFACE,
- (*color_texture)->uvname);
- strcpy(layername, (*color_texture)->uvname);
- }
-
- MaterialIdPrimitiveArrayMap& mat_prim_map = geom_uid_mat_mapping_map[*geom_uid];
- COLLADAFW::MaterialId mat_id = cmaterial.getMaterialId();
-
- // assign material indices to mesh faces
- if (mat_prim_map.find(mat_id) != mat_prim_map.end()) {
-
- std::vector<Primitive>& prims = mat_prim_map[mat_id];
-
- std::vector<Primitive>::iterator it;
-
- for (it = prims.begin(); it != prims.end(); it++) {
- Primitive& prim = *it;
- i = 0;
- while (i++ < prim.totface) {
- prim.mface->mat_nr = mat_index;
- prim.mface++;
- // bind texture images to faces
- if (texture_face && (*color_texture)) {
- texture_face->mode = TF_TEX;
- texture_face->tpage = (Image*)(*color_texture)->tex->ima;
- texture_face++;
- }
- }
- }
- }
-
- return texture_face;
- }
-
-
- Object *create_mesh_object(COLLADAFW::Node *node, COLLADAFW::InstanceGeometry *geom,
- bool isController,
- std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
- std::map<Material*, TexIndexTextureArrayMap>& material_texture_mapping_map)
- {
- const COLLADAFW::UniqueId *geom_uid = &geom->getInstanciatedObjectId();
-
- // check if node instanciates controller or geometry
- if (isController) {
-
- geom_uid = armature_importer->get_geometry_uid(*geom_uid);
-
- if (!geom_uid) {
- fprintf(stderr, "Couldn't find a mesh UID by controller's UID.\n");
- return NULL;
- }
- }
- else {
-
- if (uid_mesh_map.find(*geom_uid) == uid_mesh_map.end()) {
- // this could happen if a mesh was not created
- // (e.g. if it contains unsupported geometry)
- fprintf(stderr, "Couldn't find a mesh by UID.\n");
- return NULL;
- }
- }
- if (!uid_mesh_map[*geom_uid]) return NULL;
-
- Object *ob = add_object(scene, OB_MESH);
-
- // store object pointer for ArmatureImporter
- uid_object_map[*geom_uid] = ob;
-
- // name Object
- const std::string& id = node->getOriginalId();
- if (id.length())
- rename_id(&ob->id, (char*)id.c_str());
-
- // replace ob->data freeing the old one
- Mesh *old_mesh = (Mesh*)ob->data;
-
- set_mesh(ob, uid_mesh_map[*geom_uid]);
-
- if (old_mesh->id.us == 0) free_libblock(&G.main->mesh, old_mesh);
-
- char layername[100];
- MTFace *texture_face = NULL;
- MTex *color_texture = NULL;
-
- COLLADAFW::MaterialBindingArray& mat_array =
- geom->getMaterialBindings();
-
- // loop through geom's materials
- for (unsigned int i = 0; i < mat_array.getCount(); i++) {
-
- texture_face = assign_material_to_geom(mat_array[i], uid_material_map, ob, geom_uid,
- &color_texture, layername, texture_face,
- material_texture_mapping_map, i);
- }
-
- return ob;
- }
-
- // create a mesh storing a pointer in a map so it can be retrieved later by geometry UID
- bool write_geometry(const COLLADAFW::Geometry* geom)
- {
- // TODO: import also uvs, normals
- // XXX what to do with normal indices?
- // XXX num_normals may be != num verts, then what to do?
-
- // check geometry->getType() first
- if (geom->getType() != COLLADAFW::Geometry::GEO_TYPE_MESH) {
- // TODO: report warning
- fprintf(stderr, "Mesh type %s is not supported\n", geomTypeToStr(geom->getType()));
- return true;
- }
-
- COLLADAFW::Mesh *mesh = (COLLADAFW::Mesh*)geom;
-
- if (!is_nice_mesh(mesh)) {
- fprintf(stderr, "Ignoring mesh %s\n", get_dae_name(mesh));
- return true;
- }
-
- const std::string& str_geom_id = mesh->getOriginalId();
- Mesh *me = add_mesh((char*)str_geom_id.c_str());
-
- // store the Mesh pointer to link it later with an Object
- this->uid_mesh_map[mesh->getUniqueId()] = me;
-
- int new_tris = 0;
-
- read_vertices(mesh, me);
-
- new_tris = count_new_tris(mesh, me);
-
- read_faces(mesh, me, new_tris);
-
- make_edges(me, 0);
-
- mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
-
- return true;
- }
-
-};
-
-class AnimationImporter : private TransformReader, public AnimationImporterBase
-{
-private:
-
- ArmatureImporter *armature_importer;
- Scene *scene;
-
- std::map<COLLADAFW::UniqueId, std::vector<FCurve*> > curve_map;
- std::map<COLLADAFW::UniqueId, TransformReader::Animation> uid_animated_map;
- // std::map<bActionGroup*, std::vector<FCurve*> > fcurves_actionGroup_map;
- std::map<COLLADAFW::UniqueId, const COLLADAFW::AnimationList*> animlist_map;
- std::vector<FCurve*> unused_curves;
- std::map<COLLADAFW::UniqueId, Object*> joint_objects;
-
- FCurve *create_fcurve(int array_index, const char *rna_path)
- {
- FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve");
-
- fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
- fcu->rna_path = BLI_strdupn(rna_path, strlen(rna_path));
- fcu->array_index = array_index;
- return fcu;
- }
-
- void create_bezt(FCurve *fcu, float frame, float output)
- {
- BezTriple bez;
- memset(&bez, 0, sizeof(BezTriple));
- bez.vec[1][0] = frame;
- bez.vec[1][1] = output;
- bez.ipo = U.ipo_new; /* use default interpolation mode here... */
- bez.f1 = bez.f2 = bez.f3 = SELECT;
- bez.h1 = bez.h2 = HD_AUTO;
- insert_bezt_fcurve(fcu, &bez, 0);
- calchandles_fcurve(fcu);
- }
-
- // create one or several fcurves depending on the number of parameters being animated
- void animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
- {
- COLLADAFW::FloatOrDoubleArray& input = curve->getInputValues();
- COLLADAFW::FloatOrDoubleArray& output = curve->getOutputValues();
- // COLLADAFW::FloatOrDoubleArray& intan = curve->getInTangentValues();
- // COLLADAFW::FloatOrDoubleArray& outtan = curve->getOutTangentValues();
- float fps = (float)FPS;
- size_t dim = curve->getOutDimension();
- unsigned int i;
-
- std::vector<FCurve*>& fcurves = curve_map[curve->getUniqueId()];
-
- switch (dim) {
- case 1: // X, Y, Z or angle
- case 3: // XYZ
- case 16: // matrix
- {
- for (i = 0; i < dim; i++ ) {
- FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve");
-
- fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
- // fcu->rna_path = BLI_strdupn(path, strlen(path));
- fcu->array_index = 0;
- //fcu->totvert = curve->getKeyCount();
-
- // create beztriple for each key
- for (unsigned int j = 0; j < curve->getKeyCount(); j++) {
- BezTriple bez;
- memset(&bez, 0, sizeof(BezTriple));
-
- // intangent
- // bez.vec[0][0] = get_float_value(intan, j * 6 + i + i) * fps;
- // bez.vec[0][1] = get_float_value(intan, j * 6 + i + i + 1);
-
- // input, output
- bez.vec[1][0] = get_float_value(input, j) * fps;
- bez.vec[1][1] = get_float_value(output, j * dim + i);
-
- // outtangent
- // bez.vec[2][0] = get_float_value(outtan, j * 6 + i + i) * fps;
- // bez.vec[2][1] = get_float_value(outtan, j * 6 + i + i + 1);
-
- bez.ipo = U.ipo_new; /* use default interpolation mode here... */
- bez.f1 = bez.f2 = bez.f3 = SELECT;
- bez.h1 = bez.h2 = HD_AUTO;
- insert_bezt_fcurve(fcu, &bez, 0);
- }
-
- calchandles_fcurve(fcu);
-
- fcurves.push_back(fcu);
- }
- }
- break;
- default:
- fprintf(stderr, "Output dimension of %d is not yet supported (animation id = %s)\n", dim, curve->getOriginalId().c_str());
- }
-
- for (std::vector<FCurve*>::iterator it = fcurves.begin(); it != fcurves.end(); it++)
- unused_curves.push_back(*it);
- }
-
- void fcurve_deg_to_rad(FCurve *cu)
- {
- for (unsigned int i = 0; i < cu->totvert; i++) {
- // TODO convert handles too
- cu->bezt[i].vec[1][1] *= M_PI / 180.0f;
- }
- }
-
- void add_fcurves_to_object(Object *ob, std::vector<FCurve*>& curves, char *rna_path, int array_index, Animation *animated)
- {
- bAction *act;
-
- if (!ob->adt || !ob->adt->action) act = verify_adt_action((ID*)&ob->id, 1);
- else act = ob->adt->action;
-
- std::vector<FCurve*>::iterator it;
- int i;
-
-#if 0
- char *p = strstr(rna_path, "rotation_euler");
- bool is_rotation = p && *(p + strlen("rotation_euler")) == '\0';
-
- // convert degrees to radians for rotation
- if (is_rotation)
- fcurve_deg_to_rad(fcu);
-#endif
-
- for (it = curves.begin(), i = 0; it != curves.end(); it++, i++) {
- FCurve *fcu = *it;
- fcu->rna_path = BLI_strdupn(rna_path, strlen(rna_path));
-
- if (array_index == -1) fcu->array_index = i;
- else fcu->array_index = array_index;
-
- if (ob->type == OB_ARMATURE) {
- bActionGroup *grp = NULL;
- const char *bone_name = get_joint_name(animated->node);
-
- if (bone_name) {
- /* try to find group */
- grp = action_groups_find_named(act, bone_name);
-
- /* no matching groups, so add one */
- if (grp == NULL) {
- /* Add a new group, and make it active */
- grp = (bActionGroup*)MEM_callocN(sizeof(bActionGroup), "bActionGroup");
-
- grp->flag = AGRP_SELECTED;
- BLI_strncpy(grp->name, bone_name, sizeof(grp->name));
-
- BLI_addtail(&act->groups, grp);
- BLI_uniquename(&act->groups, grp, "Group", '.', offsetof(bActionGroup, name), 64);
- }
-
- /* add F-Curve to group */
- action_groups_add_channel(act, grp, fcu);
-
- }
-#if 0
- if (is_rotation) {
- fcurves_actionGroup_map[grp].push_back(fcu);
- }
-#endif
- }
- else {
- BLI_addtail(&act->curves, fcu);
- }
-
- // curve is used, so remove it from unused_curves
- unused_curves.erase(std::remove(unused_curves.begin(), unused_curves.end(), fcu), unused_curves.end());
- }
- }
-public:
-
- AnimationImporter(UnitConverter *conv, ArmatureImporter *arm, Scene *scene) :
- TransformReader(conv), armature_importer(arm), scene(scene) { }
-
- ~AnimationImporter()
- {
- // free unused FCurves
- for (std::vector<FCurve*>::iterator it = unused_curves.begin(); it != unused_curves.end(); it++)
- free_fcurve(*it);
-
- if (unused_curves.size())
- fprintf(stderr, "removed %u unused curves\n", unused_curves.size());
- }
-
- bool write_animation(const COLLADAFW::Animation* anim)
- {
- if (anim->getAnimationType() == COLLADAFW::Animation::ANIMATION_CURVE) {
- COLLADAFW::AnimationCurve *curve = (COLLADAFW::AnimationCurve*)anim;
-
- // XXX Don't know if it's necessary
- // Should we check outPhysicalDimension?
- if (curve->getInPhysicalDimension() != COLLADAFW::PHYSICAL_DIMENSION_TIME) {
- fprintf(stderr, "Inputs physical dimension is not time. \n");
- return true;
- }
-
- // a curve can have mixed interpolation type,
- // in this case curve->getInterpolationTypes returns a list of interpolation types per key
- COLLADAFW::AnimationCurve::InterpolationType interp = curve->getInterpolationType();
-
- if (interp != COLLADAFW::AnimationCurve::INTERPOLATION_MIXED) {
- switch (interp) {
- case COLLADAFW::AnimationCurve::INTERPOLATION_LINEAR:
- case COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER:
- animation_to_fcurves(curve);
- break;
- default:
- // TODO there're also CARDINAL, HERMITE, BSPLINE and STEP types
- fprintf(stderr, "CARDINAL, HERMITE, BSPLINE and STEP anim interpolation types not supported yet.\n");
- break;
- }
- }
- else {
- // not supported yet
- fprintf(stderr, "MIXED anim interpolation type is not supported yet.\n");
- }
- }
- else {
- fprintf(stderr, "FORMULA animation type is not supported yet.\n");
- }
-
- return true;
- }
-
- // called on post-process stage after writeVisualScenes
- bool write_animation_list(const COLLADAFW::AnimationList* animlist)
- {
- const COLLADAFW::UniqueId& animlist_id = animlist->getUniqueId();
-
- animlist_map[animlist_id] = animlist;
-
-#if 0
- // should not happen
- if (uid_animated_map.find(animlist_id) == uid_animated_map.end()) {
- return true;
- }
-
- // for bones rna_path is like: pose.bones["bone-name"].rotation
-
- // what does this AnimationList animate?
- Animation& animated = uid_animated_map[animlist_id];
- Object *ob = animated.ob;
-
- char rna_path[100];
- char joint_path[100];
- bool is_joint = false;
-
- // if ob is NULL, it should be a JOINT
- if (!ob) {
- ob = armature_importer->get_armature_for_joint(animated.node);
-
- if (!ob) {
- fprintf(stderr, "Cannot find armature for node %s\n", get_joint_name(animated.node));
- return true;
- }
-
- armature_importer->get_rna_path_for_joint(animated.node, joint_path, sizeof(joint_path));
-
- is_joint = true;
- }
-
- const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
-
- switch (animated.tm->getTransformationType()) {
- case COLLADAFW::Transformation::TRANSLATE:
- case COLLADAFW::Transformation::SCALE:
- {
- bool loc = animated.tm->getTransformationType() == COLLADAFW::Transformation::TRANSLATE;
- if (is_joint)
- BLI_snprintf(rna_path, sizeof(rna_path), "%s.%s", joint_path, loc ? "location" : "scale");
- else
- BLI_strncpy(rna_path, loc ? "location" : "scale", sizeof(rna_path));
-
- for (int i = 0; i < bindings.getCount(); i++) {
- const COLLADAFW::AnimationList::AnimationBinding& binding = bindings[i];
- COLLADAFW::UniqueId anim_uid = binding.animation;
-
- if (curve_map.find(anim_uid) == curve_map.end()) {
- fprintf(stderr, "Cannot find FCurve by animation UID.\n");
- continue;
- }
-
- std::vector<FCurve*>& fcurves = curve_map[anim_uid];
-
- switch (binding.animationClass) {
- case COLLADAFW::AnimationList::POSITION_X:
- add_fcurves_to_object(ob, fcurves, rna_path, 0, &animated);
- break;
- case COLLADAFW::AnimationList::POSITION_Y:
- add_fcurves_to_object(ob, fcurves, rna_path, 1, &animated);
- break;
- case COLLADAFW::AnimationList::POSITION_Z:
- add_fcurves_to_object(ob, fcurves, rna_path, 2, &animated);
- break;
- case COLLADAFW::AnimationList::POSITION_XYZ:
- add_fcurves_to_object(ob, fcurves, rna_path, -1, &animated);
- break;
- default:
- fprintf(stderr, "AnimationClass %d is not supported for %s.\n",
- binding.animationClass, loc ? "TRANSLATE" : "SCALE");
- }
- }
- }
- break;
- case COLLADAFW::Transformation::ROTATE:
- {
- if (is_joint)
- BLI_snprintf(rna_path, sizeof(rna_path), "%s.rotation_euler", joint_path);
- else
- BLI_strncpy(rna_path, "rotation_euler", sizeof(rna_path));
-
- COLLADAFW::Rotate* rot = (COLLADAFW::Rotate*)animated.tm;
- COLLADABU::Math::Vector3& axis = rot->getRotationAxis();
-
- for (int i = 0; i < bindings.getCount(); i++) {
- const COLLADAFW::AnimationList::AnimationBinding& binding = bindings[i];
- COLLADAFW::UniqueId anim_uid = binding.animation;
-
- if (curve_map.find(anim_uid) == curve_map.end()) {
- fprintf(stderr, "Cannot find FCurve by animation UID.\n");
- continue;
- }
-
- std::vector<FCurve*>& fcurves = curve_map[anim_uid];
-
- switch (binding.animationClass) {
- case COLLADAFW::AnimationList::ANGLE:
- if (COLLADABU::Math::Vector3::UNIT_X == axis) {
- add_fcurves_to_object(ob, fcurves, rna_path, 0, &animated);
- }
- else if (COLLADABU::Math::Vector3::UNIT_Y == axis) {
- add_fcurves_to_object(ob, fcurves, rna_path, 1, &animated);
- }
- else if (COLLADABU::Math::Vector3::UNIT_Z == axis) {
- add_fcurves_to_object(ob, fcurves, rna_path, 2, &animated);
- }
- break;
- case COLLADAFW::AnimationList::AXISANGLE:
- // TODO convert axis-angle to quat? or XYZ?
- default:
- fprintf(stderr, "AnimationClass %d is not supported for ROTATE transformation.\n",
- binding.animationClass);
- }
- }
- }
- break;
- case COLLADAFW::Transformation::MATRIX:
- case COLLADAFW::Transformation::SKEW:
- case COLLADAFW::Transformation::LOOKAT:
- fprintf(stderr, "Animation of MATRIX, SKEW and LOOKAT transformations is not supported yet.\n");
- break;
- }
-#endif
-
- return true;
- }
-
- void read_node_transform(COLLADAFW::Node *node, Object *ob)
- {
- float mat[4][4];
- TransformReader::get_node_mat(mat, node, &uid_animated_map, ob);
- if (ob) {
- copy_m4_m4(ob->obmat, mat);
- object_apply_mat4(ob, ob->obmat);
- }
- }
-
-#if 0
- virtual void change_eul_to_quat(Object *ob, bAction *act)
- {
- bActionGroup *grp;
- int i;
-
- for (grp = (bActionGroup*)act->groups.first; grp; grp = grp->next) {
-
- FCurve *eulcu[3] = {NULL, NULL, NULL};
-
- if (fcurves_actionGroup_map.find(grp) == fcurves_actionGroup_map.end())
- continue;
-
- std::vector<FCurve*> &rot_fcurves = fcurves_actionGroup_map[grp];
-
- if (rot_fcurves.size() > 3) continue;
-
- for (i = 0; i < rot_fcurves.size(); i++)
- eulcu[rot_fcurves[i]->array_index] = rot_fcurves[i];
-
- char joint_path[100];
- char rna_path[100];
-
- BLI_snprintf(joint_path, sizeof(joint_path), "pose.bones[\"%s\"]", grp->name);
- BLI_snprintf(rna_path, sizeof(rna_path), "%s.rotation_quaternion", joint_path);
-
- FCurve *quatcu[4] = {
- create_fcurve(0, rna_path),
- create_fcurve(1, rna_path),
- create_fcurve(2, rna_path),
- create_fcurve(3, rna_path)
- };
-
- bPoseChannel *chan = get_pose_channel(ob->pose, grp->name);
-
- float m4[4][4], irest[3][3];
- invert_m4_m4(m4, chan->bone->arm_mat);
- copy_m3_m4(irest, m4);
-
- for (i = 0; i < 3; i++) {
-
- FCurve *cu = eulcu[i];
-
- if (!cu) continue;
-
- for (int j = 0; j < cu->totvert; j++) {
- float frame = cu->bezt[j].vec[1][0];
-
- float eul[3] = {
- eulcu[0] ? evaluate_fcurve(eulcu[0], frame) : 0.0f,
- eulcu[1] ? evaluate_fcurve(eulcu[1], frame) : 0.0f,
- eulcu[2] ? evaluate_fcurve(eulcu[2], frame) : 0.0f
- };
-
- // make eul relative to bone rest pose
- float rot[3][3], rel[3][3], quat[4];
-
- /*eul_to_mat3(rot, eul);
-
- mul_m3_m3m3(rel, irest, rot);
-
- mat3_to_quat(quat, rel);
- */
-
- eul_to_quat(quat, eul);
-
- for (int k = 0; k < 4; k++)
- create_bezt(quatcu[k], frame, quat[k]);
- }
- }
-
- // now replace old Euler curves
-
- for (i = 0; i < 3; i++) {
- if (!eulcu[i]) continue;
-
- action_groups_remove_channel(act, eulcu[i]);
- free_fcurve(eulcu[i]);
- }
-
- chan->rotmode = ROT_MODE_QUAT;
-
- for (i = 0; i < 4; i++)
- action_groups_add_channel(act, grp, quatcu[i]);
- }
-
- bPoseChannel *pchan;
- for (pchan = (bPoseChannel*)ob->pose->chanbase.first; pchan; pchan = pchan->next) {
- pchan->rotmode = ROT_MODE_QUAT;
- }
- }
-#endif
-
- // prerequisites:
- // animlist_map - map animlist id -> animlist
- // curve_map - map anim id -> curve(s)
- Object *translate_animation(COLLADAFW::Node *node,
- std::map<COLLADAFW::UniqueId, Object*>& object_map,
- std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map,
- COLLADAFW::Transformation::TransformationType tm_type,
- Object *par_job = NULL)
- {
- bool is_rotation = tm_type == COLLADAFW::Transformation::ROTATE;
- bool is_matrix = tm_type == COLLADAFW::Transformation::MATRIX;
- bool is_joint = node->getType() == COLLADAFW::Node::JOINT;
-
- COLLADAFW::Node *root = root_map.find(node->getUniqueId()) == root_map.end() ? node : root_map[node->getUniqueId()];
- Object *ob = is_joint ? armature_importer->get_armature_for_joint(node) : object_map[node->getUniqueId()];
- const char *bone_name = is_joint ? get_joint_name(node) : NULL;
-
- if (!ob) {
- fprintf(stderr, "cannot find Object for Node with id=\"%s\"\n", node->getOriginalId().c_str());
- return NULL;
- }
-
- // frames at which to sample
- std::vector<float> frames;
-
- // for each <rotate>, <translate>, etc. there is a separate Transformation
- const COLLADAFW::TransformationPointerArray& tms = node->getTransformations();
-
- unsigned int i;
-
- // find frames at which to sample plus convert all rotation keys to radians
- for (i = 0; i < tms.getCount(); i++) {
- COLLADAFW::Transformation *tm = tms[i];
- COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
-
- if (type == tm_type) {
- const COLLADAFW::UniqueId& listid = tm->getAnimationList();
-
- if (animlist_map.find(listid) != animlist_map.end()) {
- const COLLADAFW::AnimationList *animlist = animlist_map[listid];
- const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
-
- if (bindings.getCount()) {
- for (unsigned int j = 0; j < bindings.getCount(); j++) {
- std::vector<FCurve*>& curves = curve_map[bindings[j].animation];
- bool xyz = ((type == COLLADAFW::Transformation::TRANSLATE || type == COLLADAFW::Transformation::SCALE) && bindings[j].animationClass == COLLADAFW::AnimationList::POSITION_XYZ);
-
- if ((!xyz && curves.size() == 1) || (xyz && curves.size() == 3) || is_matrix) {
- std::vector<FCurve*>::iterator iter;
-
- for (iter = curves.begin(); iter != curves.end(); iter++) {
- FCurve *fcu = *iter;
-
- if (is_rotation)
- fcurve_deg_to_rad(fcu);
-
- for (unsigned int k = 0; k < fcu->totvert; k++) {
- float fra = fcu->bezt[k].vec[1][0];
- if (std::find(frames.begin(), frames.end(), fra) == frames.end())
- frames.push_back(fra);
- }
- }
- }
- else {
- fprintf(stderr, "expected %d curves, got %u\n", xyz ? 3 : 1, curves.size());
- }
- }
- }
- }
- }
- }
-
- float irest_dae[4][4];
- float rest[4][4], irest[4][4];
-
- if (is_joint) {
- get_joint_rest_mat(irest_dae, root, node);
- invert_m4(irest_dae);
-
- Bone *bone = get_named_bone((bArmature*)ob->data, bone_name);
- if (!bone) {
- fprintf(stderr, "cannot find bone \"%s\"\n", bone_name);
- return NULL;
- }
-
- unit_m4(rest);
- copy_m4_m4(rest, bone->arm_mat);
- invert_m4_m4(irest, rest);
- }
-
- Object *job = NULL;
-
-#ifdef ARMATURE_TEST
- FCurve *job_curves[10];
- job = get_joint_object(root, node, par_job);
-#endif
-
- if (frames.size() == 0)
- return job;
-
- std::sort(frames.begin(), frames.end());
-
- const char *tm_str = NULL;
- switch (tm_type) {
- case COLLADAFW::Transformation::ROTATE:
- tm_str = "rotation_quaternion";
- break;
- case COLLADAFW::Transformation::SCALE:
- tm_str = "scale";
- break;
- case COLLADAFW::Transformation::TRANSLATE:
- tm_str = "location";
- break;
- case COLLADAFW::Transformation::MATRIX:
- break;
- default:
- return job;
- }
-
- char rna_path[200];
- char joint_path[200];
-
- if (is_joint)
- armature_importer->get_rna_path_for_joint(node, joint_path, sizeof(joint_path));
-
- // new curves
- FCurve *newcu[10]; // if tm_type is matrix, then create 10 curves: 4 rot, 3 loc, 3 scale
- unsigned int totcu = is_matrix ? 10 : (is_rotation ? 4 : 3);
-
- for (i = 0; i < totcu; i++) {
-
- int axis = i;
-
- if (is_matrix) {
- if (i < 4) {
- tm_str = "rotation_quaternion";
- axis = i;
- }
- else if (i < 7) {
- tm_str = "location";
- axis = i - 4;
- }
- else {
- tm_str = "scale";
- axis = i - 7;
- }
- }
-
- if (is_joint)
- BLI_snprintf(rna_path, sizeof(rna_path), "%s.%s", joint_path, tm_str);
- else
- strcpy(rna_path, tm_str);
-
- newcu[i] = create_fcurve(axis, rna_path);
-
-#ifdef ARMATURE_TEST
- if (is_joint)
- job_curves[i] = create_fcurve(axis, tm_str);
-#endif
- }
-
- std::vector<float>::iterator it;
-
- // sample values at each frame
- for (it = frames.begin(); it != frames.end(); it++) {
- float fra = *it;
-
- float mat[4][4];
- float matfra[4][4];
-
- unit_m4(matfra);
-
- // calc object-space mat
- evaluate_transform_at_frame(matfra, node, fra);
-
- // for joints, we need a special matrix
- if (is_joint) {
- // special matrix: iR * M * iR_dae * R
- // where R, iR are bone rest and inverse rest mats in world space (Blender bones),
- // iR_dae is joint inverse rest matrix (DAE) and M is an evaluated joint world-space matrix (DAE)
- float temp[4][4], par[4][4];
-
- // calc M
- calc_joint_parent_mat_rest(par, NULL, root, node);
- mul_m4_m4m4(temp, matfra, par);
-
- // evaluate_joint_world_transform_at_frame(temp, NULL, , node, fra);
-
- // calc special matrix
- mul_serie_m4(mat, irest, temp, irest_dae, rest, NULL, NULL, NULL, NULL);
- }
- else {
- copy_m4_m4(mat, matfra);
- }
-
- float val[4], rot[4], loc[3], scale[3];
-
- switch (tm_type) {
- case COLLADAFW::Transformation::ROTATE:
- mat4_to_quat(val, mat);
- break;
- case COLLADAFW::Transformation::SCALE:
- mat4_to_size(val, mat);
- break;
- case COLLADAFW::Transformation::TRANSLATE:
- copy_v3_v3(val, mat[3]);
- break;
- case COLLADAFW::Transformation::MATRIX:
- mat4_to_quat(rot, mat);
- copy_v3_v3(loc, mat[3]);
- mat4_to_size(scale, mat);
- break;
- default:
- break;
- }
-
- // add keys
- for (i = 0; i < totcu; i++) {
- if (is_matrix) {
- if (i < 4)
- add_bezt(newcu[i], fra, rot[i]);
- else if (i < 7)
- add_bezt(newcu[i], fra, loc[i - 4]);
- else
- add_bezt(newcu[i], fra, scale[i - 7]);
- }
- else {
- add_bezt(newcu[i], fra, val[i]);
- }
- }
-
-#ifdef ARMATURE_TEST
- if (is_joint) {
- switch (tm_type) {
- case COLLADAFW::Transformation::ROTATE:
- mat4_to_quat(val, matfra);
- break;
- case COLLADAFW::Transformation::SCALE:
- mat4_to_size(val, matfra);
- break;
- case COLLADAFW::Transformation::TRANSLATE:
- copy_v3_v3(val, matfra[3]);
- break;
- case MATRIX:
- mat4_to_quat(rot, matfra);
- copy_v3_v3(loc, matfra[3]);
- mat4_to_size(scale, matfra);
- break;
- default:
- break;
- }
-
- for (i = 0; i < totcu; i++) {
- if (is_matrix) {
- if (i < 4)
- add_bezt(job_curves[i], fra, rot[i]);
- else if (i < 7)
- add_bezt(job_curves[i], fra, loc[i - 4]);
- else
- add_bezt(job_curves[i], fra, scale[i - 7]);
- }
- else {
- add_bezt(job_curves[i], fra, val[i]);
- }
- }
- }
-#endif
- }
-
- verify_adt_action((ID*)&ob->id, 1);
-
- ListBase *curves = &ob->adt->action->curves;
-
- // add curves
- for (i = 0; i < totcu; i++) {
- if (is_joint)
- add_bone_fcurve(ob, node, newcu[i]);
- else
- BLI_addtail(curves, newcu[i]);
-
-#ifdef ARMATURE_TEST
- if (is_joint)
- BLI_addtail(&job->adt->action->curves, job_curves[i]);
-#endif
- }
+#include "collada_utils.h"
- if (is_rotation || is_matrix) {
- if (is_joint) {
- bPoseChannel *chan = get_pose_channel(ob->pose, bone_name);
- chan->rotmode = ROT_MODE_QUAT;
- }
- else {
- ob->rotmode = ROT_MODE_QUAT;
- }
- }
-
- return job;
- }
-
- // internal, better make it private
- // warning: evaluates only rotation
- // prerequisites: animlist_map, curve_map
- void evaluate_transform_at_frame(float mat[4][4], COLLADAFW::Node *node, float fra)
- {
- const COLLADAFW::TransformationPointerArray& tms = node->getTransformations();
-
- unit_m4(mat);
-
- for (unsigned int i = 0; i < tms.getCount(); i++) {
- COLLADAFW::Transformation *tm = tms[i];
- COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
- float m[4][4];
-
- unit_m4(m);
-
- if (!evaluate_animation(tm, m, fra, node->getOriginalId().c_str())) {
- switch (type) {
- case COLLADAFW::Transformation::ROTATE:
- dae_rotate_to_mat4(tm, m);
- break;
- case COLLADAFW::Transformation::TRANSLATE:
- dae_translate_to_mat4(tm, m);
- break;
- case COLLADAFW::Transformation::SCALE:
- dae_scale_to_mat4(tm, m);
- break;
- case COLLADAFW::Transformation::MATRIX:
- dae_matrix_to_mat4(tm, m);
- break;
- default:
- fprintf(stderr, "unsupported transformation type %d\n", type);
- }
- }
-
- float temp[4][4];
- copy_m4_m4(temp, mat);
-
- mul_m4_m4m4(mat, m, temp);
- }
- }
-
- // return true to indicate that mat contains a sane value
- bool evaluate_animation(COLLADAFW::Transformation *tm, float mat[4][4], float fra, const char *node_id)
- {
- const COLLADAFW::UniqueId& listid = tm->getAnimationList();
- COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
-
- if (type != COLLADAFW::Transformation::ROTATE &&
- type != COLLADAFW::Transformation::SCALE &&
- type != COLLADAFW::Transformation::TRANSLATE &&
- type != COLLADAFW::Transformation::MATRIX) {
- fprintf(stderr, "animation of transformation %d is not supported yet\n", type);
- return false;
- }
-
- if (animlist_map.find(listid) == animlist_map.end())
- return false;
-
- const COLLADAFW::AnimationList *animlist = animlist_map[listid];
- const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
-
- if (bindings.getCount()) {
- float vec[3];
-
- bool is_scale = (type == COLLADAFW::Transformation::SCALE);
- bool is_translate = (type == COLLADAFW::Transformation::TRANSLATE);
-
- if (type == COLLADAFW::Transformation::SCALE)
- dae_scale_to_v3(tm, vec);
- else if (type == COLLADAFW::Transformation::TRANSLATE)
- dae_translate_to_v3(tm, vec);
-
- for (unsigned int j = 0; j < bindings.getCount(); j++) {
- const COLLADAFW::AnimationList::AnimationBinding& binding = bindings[j];
- std::vector<FCurve*>& curves = curve_map[binding.animation];
- COLLADAFW::AnimationList::AnimationClass animclass = binding.animationClass;
- char path[100];
-
- switch (type) {
- case COLLADAFW::Transformation::ROTATE:
- BLI_snprintf(path, sizeof(path), "%s.rotate (binding %u)", node_id, j);
- break;
- case COLLADAFW::Transformation::SCALE:
- BLI_snprintf(path, sizeof(path), "%s.scale (binding %u)", node_id, j);
- break;
- case COLLADAFW::Transformation::TRANSLATE:
- BLI_snprintf(path, sizeof(path), "%s.translate (binding %u)", node_id, j);
- break;
- case COLLADAFW::Transformation::MATRIX:
- BLI_snprintf(path, sizeof(path), "%s.matrix (binding %u)", node_id, j);
- break;
- default:
- break;
- }
-
- if (animclass == COLLADAFW::AnimationList::UNKNOWN_CLASS) {
- fprintf(stderr, "%s: UNKNOWN animation class\n", path);
- continue;
- }
-
- if (type == COLLADAFW::Transformation::ROTATE) {
- if (curves.size() != 1) {
- fprintf(stderr, "expected 1 curve, got %u\n", curves.size());
- return false;
- }
-
- // TODO support other animclasses
- if (animclass != COLLADAFW::AnimationList::ANGLE) {
- fprintf(stderr, "%s: animation class %d is not supported yet\n", path, animclass);
- return false;
- }
-
- COLLADABU::Math::Vector3& axis = ((COLLADAFW::Rotate*)tm)->getRotationAxis();
- float ax[3] = {axis[0], axis[1], axis[2]};
- float angle = evaluate_fcurve(curves[0], fra);
- axis_angle_to_mat4(mat, ax, angle);
-
- return true;
- }
- else if (is_scale || is_translate) {
- bool is_xyz = animclass == COLLADAFW::AnimationList::POSITION_XYZ;
-
- if ((!is_xyz && curves.size() != 1) || (is_xyz && curves.size() != 3)) {
- if (is_xyz)
- fprintf(stderr, "%s: expected 3 curves, got %u\n", path, curves.size());
- else
- fprintf(stderr, "%s: expected 1 curve, got %u\n", path, curves.size());
- return false;
- }
-
- switch (animclass) {
- case COLLADAFW::AnimationList::POSITION_X:
- vec[0] = evaluate_fcurve(curves[0], fra);
- break;
- case COLLADAFW::AnimationList::POSITION_Y:
- vec[1] = evaluate_fcurve(curves[0], fra);
- break;
- case COLLADAFW::AnimationList::POSITION_Z:
- vec[2] = evaluate_fcurve(curves[0], fra);
- break;
- case COLLADAFW::AnimationList::POSITION_XYZ:
- vec[0] = evaluate_fcurve(curves[0], fra);
- vec[1] = evaluate_fcurve(curves[1], fra);
- vec[2] = evaluate_fcurve(curves[2], fra);
- break;
- default:
- fprintf(stderr, "%s: animation class %d is not supported yet\n", path, animclass);
- break;
- }
- }
- else if (type == COLLADAFW::Transformation::MATRIX) {
- // for now, of matrix animation, support only the case when all values are packed into one animation
- if (curves.size() != 16) {
- fprintf(stderr, "%s: expected 16 curves, got %u\n", path, curves.size());
- return false;
- }
-
- COLLADABU::Math::Matrix4 matrix;
- int i = 0, j = 0;
-
- for (std::vector<FCurve*>::iterator it = curves.begin(); it != curves.end(); it++) {
- matrix.setElement(i, j, evaluate_fcurve(*it, fra));
- j++;
- if (j == 4) {
- i++;
- j = 0;
- }
- }
-
- COLLADAFW::Matrix tm(matrix);
- dae_matrix_to_mat4(&tm, mat);
-
- return true;
- }
- }
-
- if (is_scale)
- size_to_mat4(mat, vec);
- else
- copy_v3_v3(mat[3], vec);
-
- return is_scale || is_translate;
- }
-
- return false;
- }
-
- // gives a world-space mat of joint at rest position
- void get_joint_rest_mat(float mat[4][4], COLLADAFW::Node *root, COLLADAFW::Node *node)
- {
- // if bind mat is not available,
- // use "current" node transform, i.e. all those tms listed inside <node>
- if (!armature_importer->get_joint_bind_mat(mat, node)) {
- float par[4][4], m[4][4];
-
- calc_joint_parent_mat_rest(par, NULL, root, node);
- get_node_mat(m, node, NULL, NULL);
- mul_m4_m4m4(mat, m, par);
- }
- }
-
- // gives a world-space mat, end's mat not included
- bool calc_joint_parent_mat_rest(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end)
- {
- float m[4][4];
-
- if (node == end) {
- par ? copy_m4_m4(mat, par) : unit_m4(mat);
- return true;
- }
-
- // use bind matrix if available or calc "current" world mat
- if (!armature_importer->get_joint_bind_mat(m, node)) {
- if (par) {
- float temp[4][4];
- get_node_mat(temp, node, NULL, NULL);
- mul_m4_m4m4(m, temp, par);
- }
- else {
- get_node_mat(m, node, NULL, NULL);
- }
- }
-
- COLLADAFW::NodePointerArray& children = node->getChildNodes();
- for (unsigned int i = 0; i < children.getCount(); i++) {
- if (calc_joint_parent_mat_rest(mat, m, children[i], end))
- return true;
- }
-
- return false;
- }
-
-#ifdef ARMATURE_TEST
- Object *get_joint_object(COLLADAFW::Node *root, COLLADAFW::Node *node, Object *par_job)
- {
- if (joint_objects.find(node->getUniqueId()) == joint_objects.end()) {
- Object *job = add_object(scene, OB_EMPTY);
-
- rename_id((ID*)&job->id, (char*)get_joint_name(node));
-
- job->lay = object_in_scene(job, scene)->lay = 2;
-
- mul_v3_fl(job->size, 0.5f);
- job->recalc |= OB_RECALC_OB;
-
- verify_adt_action((ID*)&job->id, 1);
-
- job->rotmode = ROT_MODE_QUAT;
-
- float mat[4][4];
- get_joint_rest_mat(mat, root, node);
-
- if (par_job) {
- float temp[4][4], ipar[4][4];
- invert_m4_m4(ipar, par_job->obmat);
- copy_m4_m4(temp, mat);
- mul_m4_m4m4(mat, temp, ipar);
- }
-
- TransformBase::decompose(mat, job->loc, NULL, job->quat, job->size);
-
- if (par_job) {
- job->parent = par_job;
-
- par_job->recalc |= OB_RECALC_OB;
- job->parsubstr[0] = 0;
- }
-
- where_is_object(scene, job);
-
- // after parenting and layer change
- DAG_scene_sort(CTX_data_main(C), scene);
-
- joint_objects[node->getUniqueId()] = job;
- }
-
- return joint_objects[node->getUniqueId()];
- }
-#endif
-
-#if 0
- // recursively evaluates joint tree until end is found, mat then is world-space matrix of end
- // mat must be identity on enter, node must be root
- bool evaluate_joint_world_transform_at_frame(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end, float fra)
- {
- float m[4][4];
- if (par) {
- float temp[4][4];
- evaluate_transform_at_frame(temp, node, node == end ? fra : 0.0f);
- mul_m4_m4m4(m, temp, par);
- }
- else {
- evaluate_transform_at_frame(m, node, node == end ? fra : 0.0f);
- }
-
- if (node == end) {
- copy_m4_m4(mat, m);
- return true;
- }
- else {
- COLLADAFW::NodePointerArray& children = node->getChildNodes();
- for (int i = 0; i < children.getCount(); i++) {
- if (evaluate_joint_world_transform_at_frame(mat, m, children[i], end, fra))
- return true;
- }
- }
-
- return false;
- }
-#endif
-
- void add_bone_fcurve(Object *ob, COLLADAFW::Node *node, FCurve *fcu)
- {
- const char *bone_name = get_joint_name(node);
- bAction *act = ob->adt->action;
-
- /* try to find group */
- bActionGroup *grp = action_groups_find_named(act, bone_name);
-
- /* no matching groups, so add one */
- if (grp == NULL) {
- /* Add a new group, and make it active */
- grp = (bActionGroup*)MEM_callocN(sizeof(bActionGroup), "bActionGroup");
-
- grp->flag = AGRP_SELECTED;
- BLI_strncpy(grp->name, bone_name, sizeof(grp->name));
-
- BLI_addtail(&act->groups, grp);
- BLI_uniquename(&act->groups, grp, "Group", '.', offsetof(bActionGroup, name), 64);
- }
-
- /* add F-Curve to group */
- action_groups_add_channel(act, grp, fcu);
- }
-
- void add_bezt(FCurve *fcu, float fra, float value)
- {
- BezTriple bez;
- memset(&bez, 0, sizeof(BezTriple));
- bez.vec[1][0] = fra;
- bez.vec[1][1] = value;
- bez.ipo = U.ipo_new; /* use default interpolation mode here... */
- bez.f1 = bez.f2 = bez.f3 = SELECT;
- bez.h1 = bez.h2 = HD_AUTO;
- insert_bezt_fcurve(fcu, &bez, 0);
- calchandles_fcurve(fcu);
- }
-};
/*
-
COLLADA Importer limitations:
-
- no multiple scene import, all objects are added to active scene
-
*/
+
+// #define COLLADA_DEBUG
+// creates empties for each imported bone on layer 2, for debugging
+// #define ARMATURE_TEST
+
/** Class that needs to be implemented by a writer.
IMPORTANT: The write functions are called in arbitrary order.*/
-class Writer: public COLLADAFW::IWriter
-{
+/*
private:
std::string mFilename;
@@ -3252,41 +108,54 @@ private:
std::vector<const COLLADAFW::VisualScene*> vscenes;
std::vector<Object*> libnode_ob;
- std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> root_map; // find root joint by child joint uid, for bone tree evaluation during resampling
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> root_map;
+ */
+ // find root joint by child joint uid, for bone tree evaluation during resampling
// animation
// std::map<COLLADAFW::UniqueId, std::vector<FCurve*> > uid_fcurve_map;
// Nodes don't share AnimationLists (Arystan)
// std::map<COLLADAFW::UniqueId, Animation> uid_animated_map; // AnimationList->uniqueId to AnimatedObject map
-public:
+//public:
/** Constructor. */
- Writer(bContext *C, const char *filename) : mFilename(filename), mContext(C),
- armature_importer(&unit_converter, &mesh_importer, &anim_importer, CTX_data_scene(C)),
- mesh_importer(&armature_importer, CTX_data_scene(C)),
- anim_importer(&unit_converter, &armature_importer, CTX_data_scene(C)) {}
+ DocumentImporter::DocumentImporter(bContext *C, const char *filename) :
+ mImportStage(General),
+ mFilename(filename),
+ mContext(C),
+ armature_importer(&unit_converter, &mesh_importer, &anim_importer, CTX_data_scene(C)),
+ mesh_importer(&unit_converter, &armature_importer, CTX_data_scene(C)),
+ anim_importer(&unit_converter, &armature_importer, CTX_data_scene(C))
+ {}
/** Destructor. */
- ~Writer() {}
+ DocumentImporter::~DocumentImporter() {}
- bool write()
+ bool DocumentImporter::import()
{
+ /** TODO Add error handler (implement COLLADASaxFWL::IErrorHandler */
COLLADASaxFWL::Loader loader;
COLLADAFW::Root root(&loader, this);
- // XXX report error
if (!root.loadDocument(mFilename))
return false;
+
+ /** TODO set up scene graph and such here */
+
+ mImportStage = Controller;
+
+ COLLADASaxFWL::Loader loader2;
+ COLLADAFW::Root root2(&loader2, this);
+
+ if (!root2.loadDocument(mFilename))
+ return false;
+
return true;
}
-
- /** This method will be called if an error in the loading process occurred and the loader cannot
- continue to load. The writer should undo all operations that have been performed.
- @param errorMessage A message containing informations about the error that occurred.
- */
- virtual void cancel(const COLLADAFW::String& errorMessage)
+
+ void DocumentImporter::cancel(const COLLADAFW::String& errorMessage)
{
// TODO: if possible show error info
//
@@ -3296,18 +165,41 @@ public:
// The latter sounds better.
}
- /** This is the method called. The writer hast to prepare to receive data.*/
- virtual void start()
- {
- }
+ void DocumentImporter::start(){}
/** This method is called after the last write* method. No other methods will be called after this.*/
- virtual void finish()
+ void DocumentImporter::finish()
{
+ if(mImportStage!=General)
+ return;
+
+ /** TODO Break up and put into 2-pass parsing of DAE */
std::vector<const COLLADAFW::VisualScene*>::iterator it;
for (it = vscenes.begin(); it != vscenes.end(); it++) {
+ PointerRNA sceneptr, unit_settings;
+ PropertyRNA *system, *scale;
// TODO: create a new scene except the selected <visual_scene> - use current blender scene for it
Scene *sce = CTX_data_scene(mContext);
+
+ // for scene unit settings: system, scale_length
+ RNA_id_pointer_create(&sce->id, &sceneptr);
+ unit_settings = RNA_pointer_get(&sceneptr, "unit_settings");
+ system = RNA_struct_find_property(&unit_settings, "system");
+ scale = RNA_struct_find_property(&unit_settings, "scale_length");
+
+ switch(unit_converter.isMetricSystem()) {
+ case UnitConverter::Metric:
+ RNA_property_enum_set(&unit_settings, system, USER_UNIT_METRIC);
+ break;
+ case UnitConverter::Imperial:
+ RNA_property_enum_set(&unit_settings, system, USER_UNIT_IMPERIAL);
+ break;
+ default:
+ RNA_property_enum_set(&unit_settings, system, USER_UNIT_NONE);
+ break;
+ }
+ RNA_property_float_set(&unit_settings, scale, unit_converter.getLinearMeter());
+
const COLLADAFW::NodePointerArray& roots = (*it)->getRootNodes();
for (unsigned int i = 0; i < roots.getCount(); i++) {
@@ -3325,13 +217,13 @@ public:
const COLLADAFW::NodePointerArray& roots = (*it)->getRootNodes();
for (unsigned int i = 0; i < roots.getCount(); i++)
- translate_anim_recursive(roots[i]);
+ translate_anim_recursive(roots[i],NULL,NULL);
}
if (libnode_ob.size()) {
Scene *sce = CTX_data_scene(mContext);
- fprintf(stderr, "got %u library nodes to free\n", libnode_ob.size());
+ fprintf(stderr, "got %d library nodes to free\n", (int)libnode_ob.size());
// free all library_nodes
std::vector<Object*>::iterator it;
for (it = libnode_ob.begin(); it != libnode_ob.end(); it++) {
@@ -3354,7 +246,7 @@ public:
}
- void translate_anim_recursive(COLLADAFW::Node *node, COLLADAFW::Node *par = NULL, Object *parob = NULL)
+ void DocumentImporter::translate_anim_recursive(COLLADAFW::Node *node, COLLADAFW::Node *par = NULL, Object *parob = NULL)
{
if (par && par->getType() == COLLADAFW::Node::JOINT) {
// par is root if there's no corresp. key in root_map
@@ -3385,11 +277,8 @@ public:
/** When this method is called, the writer must write the global document asset.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeGlobalAsset ( const COLLADAFW::FileInfo* asset )
+ bool DocumentImporter::writeGlobalAsset ( const COLLADAFW::FileInfo* asset )
{
- // XXX take up_axis, unit into account
- // COLLADAFW::FileInfo::Unit unit = asset->getUnit();
- // COLLADAFW::FileInfo::UpAxisType upAxis = asset->getUpAxisType();
unit_converter.read_asset(asset);
return true;
@@ -3397,12 +286,12 @@ public:
/** When this method is called, the writer must write the scene.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeScene ( const COLLADAFW::Scene* scene )
+ bool DocumentImporter::writeScene ( const COLLADAFW::Scene* scene )
{
// XXX could store the scene id, but do nothing for now
return true;
}
- Object *create_camera_object(COLLADAFW::InstanceCamera *camera, Scene *sce)
+ Object* DocumentImporter::create_camera_object(COLLADAFW::InstanceCamera *camera, Scene *sce)
{
const COLLADAFW::UniqueId& cam_uid = camera->getInstanciatedObjectId();
if (uid_camera_map.find(cam_uid) == uid_camera_map.end()) {
@@ -3419,7 +308,7 @@ public:
return ob;
}
- Object *create_lamp_object(COLLADAFW::InstanceLight *lamp, Scene *sce)
+ Object* DocumentImporter::create_lamp_object(COLLADAFW::InstanceLight *lamp, Scene *sce)
{
const COLLADAFW::UniqueId& lamp_uid = lamp->getInstanciatedObjectId();
if (uid_lamp_map.find(lamp_uid) == uid_lamp_map.end()) {
@@ -3436,10 +325,10 @@ public:
return ob;
}
- Object *create_instance_node(Object *source_ob, COLLADAFW::Node *source_node, COLLADAFW::Node *instance_node, Scene *sce, bool is_library_node)
+ Object* DocumentImporter::create_instance_node(Object *source_ob, COLLADAFW::Node *source_node, COLLADAFW::Node *instance_node, Scene *sce, bool is_library_node)
{
Object *obn = copy_object(source_ob);
- obn->recalc |= OB_RECALC_ALL;
+ obn->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
scene_add_base(sce, obn);
if (instance_node)
@@ -3466,7 +355,7 @@ public:
else {
new_child = create_instance_node(object_map[child_id], child_node, NULL, sce, is_library_node);
}
- set_parent(new_child, obn, mContext, true);
+ bc_set_parent(new_child, obn, mContext, true);
if (is_library_node)
libnode_ob.push_back(new_child);
@@ -3476,7 +365,7 @@ public:
return obn;
}
- void write_node (COLLADAFW::Node *node, COLLADAFW::Node *parent_node, Scene *sce, Object *par, bool is_library_node)
+ void DocumentImporter::write_node (COLLADAFW::Node *node, COLLADAFW::Node *parent_node, Scene *sce, Object *par, bool is_library_node)
{
Object *ob = NULL;
bool is_joint = node->getType() == COLLADAFW::Node::JOINT;
@@ -3490,27 +379,36 @@ public:
COLLADAFW::InstanceLightPointerArray &lamp = node->getInstanceLights();
COLLADAFW::InstanceControllerPointerArray &controller = node->getInstanceControllers();
COLLADAFW::InstanceNodePointerArray &inst_node = node->getInstanceNodes();
+ int geom_done = 0;
+ int camera_done = 0;
+ int lamp_done = 0;
+ int controller_done = 0;
+ int inst_done = 0;
// XXX linking object with the first <instance_geometry>, though a node may have more of them...
// maybe join multiple <instance_...> meshes into 1, and link object with it? not sure...
// <instance_geometry>
- if (geom.getCount() != 0) {
- ob = mesh_importer.create_mesh_object(node, geom[0], false, uid_material_map,
+ while (geom_done < geom.getCount()) {
+ ob = mesh_importer.create_mesh_object(node, geom[geom_done], false, uid_material_map,
material_texture_mapping_map);
+ ++geom_done;
}
- else if (camera.getCount() != 0) {
- ob = create_camera_object(camera[0], sce);
+ while (camera_done < camera.getCount()) {
+ ob = create_camera_object(camera[camera_done], sce);
+ ++camera_done;
}
- else if (lamp.getCount() != 0) {
- ob = create_lamp_object(lamp[0], sce);
+ while (lamp_done < lamp.getCount()) {
+ ob = create_lamp_object(lamp[lamp_done], sce);
+ ++lamp_done;
}
- else if (controller.getCount() != 0) {
- COLLADAFW::InstanceGeometry *geom = (COLLADAFW::InstanceGeometry*)controller[0];
+ while (controller_done < controller.getCount()) {
+ COLLADAFW::InstanceGeometry *geom = (COLLADAFW::InstanceGeometry*)controller[controller_done];
ob = mesh_importer.create_mesh_object(node, geom, true, uid_material_map, material_texture_mapping_map);
+ ++controller_done;
}
// XXX instance_node is not supported yet
- else if (inst_node.getCount() != 0) {
- const COLLADAFW::UniqueId& node_id = inst_node[0]->getInstanciatedObjectId();
+ while (inst_done < inst_node.getCount()) {
+ const COLLADAFW::UniqueId& node_id = inst_node[inst_done]->getInstanciatedObjectId();
if (object_map.find(node_id) == object_map.end()) {
fprintf(stderr, "Cannot find node to instanciate.\n");
ob = NULL;
@@ -3521,16 +419,18 @@ public:
ob = create_instance_node(source_ob, source_node, node, sce, is_library_node);
}
+ ++inst_done;
}
// if node is empty - create empty object
// XXX empty node may not mean it is empty object, not sure about this
- else {
+ if ( (geom_done + camera_done + lamp_done + controller_done + inst_done) < 1) {
ob = add_object(sce, OB_EMPTY);
- rename_id(&ob->id, (char*)node->getOriginalId().c_str());
}
// check if object is not NULL
if (!ob) return;
+
+ rename_id(&ob->id, (char*)node->getOriginalId().c_str());
object_map[node->getUniqueId()] = ob;
node_map[node->getUniqueId()] = node;
@@ -3544,7 +444,7 @@ public:
if (!is_joint) {
// if par was given make this object child of the previous
if (par && ob)
- set_parent(ob, par, mContext);
+ bc_set_parent(ob, par, mContext);
}
// if node has child nodes write them
@@ -3556,8 +456,11 @@ public:
/** When this method is called, the writer must write the entire visual scene.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeVisualScene ( const COLLADAFW::VisualScene* visualScene )
+ bool DocumentImporter::writeVisualScene ( const COLLADAFW::VisualScene* visualScene )
{
+ if(mImportStage!=General)
+ return true;
+
// this method called on post process after writeGeometry, writeMaterial, etc.
// for each <node> in <visual_scene>:
@@ -3576,8 +479,11 @@ public:
/** When this method is called, the writer must handle all nodes contained in the
library nodes.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeLibraryNodes ( const COLLADAFW::LibraryNodes* libraryNodes )
+ bool DocumentImporter::writeLibraryNodes ( const COLLADAFW::LibraryNodes* libraryNodes )
{
+ if(mImportStage!=General)
+ return true;
+
Scene *sce = CTX_data_scene(mContext);
const COLLADAFW::NodePointerArray& nodes = libraryNodes->getNodes();
@@ -3591,15 +497,21 @@ public:
/** When this method is called, the writer must write the geometry.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeGeometry ( const COLLADAFW::Geometry* geom )
+ bool DocumentImporter::writeGeometry ( const COLLADAFW::Geometry* geom )
{
+ if(mImportStage!=General)
+ return true;
+
return mesh_importer.write_geometry(geom);
}
/** When this method is called, the writer must write the material.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeMaterial( const COLLADAFW::Material* cmat )
+ bool DocumentImporter::writeMaterial( const COLLADAFW::Material* cmat )
{
+ if(mImportStage!=General)
+ return true;
+
const std::string& str_mat_id = cmat->getOriginalId();
Material *ma = add_material((char*)str_mat_id.c_str());
@@ -3610,7 +522,7 @@ public:
}
// create mtex, create texture, set texture image
- MTex *create_texture(COLLADAFW::EffectCommon *ef, COLLADAFW::Texture &ctex, Material *ma,
+ MTex* DocumentImporter::create_texture(COLLADAFW::EffectCommon *ef, COLLADAFW::Texture &ctex, Material *ma,
int i, TexIndexTextureArrayMap &texindex_texarray_map)
{
COLLADAFW::SamplerPointerArray& samp_array = ef->getSamplerPointerArray();
@@ -3635,7 +547,7 @@ public:
return ma->mtex[i];
}
- void write_profile_COMMON(COLLADAFW::EffectCommon *ef, Material *ma)
+ void DocumentImporter::write_profile_COMMON(COLLADAFW::EffectCommon *ef, Material *ma)
{
COLLADAFW::EffectCommon::ShaderType shader = ef->getShaderType();
@@ -3647,8 +559,7 @@ public:
// phong
else if (shader == COLLADAFW::EffectCommon::SHADER_PHONG) {
ma->spec_shader = MA_SPEC_PHONG;
- // XXX setting specular hardness instead of specularity intensity
- ma->har = ef->getShininess().getFloatValue() * 4;
+ ma->har = ef->getShininess().getFloatValue();
}
// lambert
else if (shader == COLLADAFW::EffectCommon::SHADER_LAMBERT) {
@@ -3773,8 +684,10 @@ public:
/** When this method is called, the writer must write the effect.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeEffect( const COLLADAFW::Effect* effect )
+ bool DocumentImporter::writeEffect( const COLLADAFW::Effect* effect )
{
+ if(mImportStage!=General)
+ return true;
const COLLADAFW::UniqueId& uid = effect->getUniqueId();
if (uid_effect_map.find(uid) == uid_effect_map.end()) {
@@ -3800,8 +713,11 @@ public:
/** When this method is called, the writer must write the camera.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeCamera( const COLLADAFW::Camera* camera )
+ bool DocumentImporter::writeCamera( const COLLADAFW::Camera* camera )
{
+ if(mImportStage!=General)
+ return true;
+
Camera *cam = NULL;
std::string cam_id, cam_name;
@@ -3836,6 +752,75 @@ public:
}
break;
}
+
+ switch(camera->getDescriptionType()) {
+ case COLLADAFW::Camera::ASPECTRATIO_AND_Y:
+ {
+ switch(cam->type) {
+ case CAM_ORTHO:
+ {
+ double ymag = camera->getYMag().getValue();
+ double aspect = camera->getAspectRatio().getValue();
+ double xmag = aspect*ymag;
+ cam->ortho_scale = (float)xmag;
+ }
+ break;
+ case CAM_PERSP:
+ default:
+ {
+ double yfov = camera->getYFov().getValue();
+ double aspect = camera->getAspectRatio().getValue();
+ double xfov = aspect*yfov;
+ // xfov is in degrees, cam->lens is in millimiters
+ cam->lens = angle_to_lens((float)xfov*(M_PI/180.0f));
+ }
+ break;
+ }
+ }
+ break;
+ /* XXX correct way to do following four is probably to get also render
+ size and determine proper settings from that somehow */
+ case COLLADAFW::Camera::ASPECTRATIO_AND_X:
+ case COLLADAFW::Camera::SINGLE_X:
+ case COLLADAFW::Camera::X_AND_Y:
+ {
+ switch(cam->type) {
+ case CAM_ORTHO:
+ cam->ortho_scale = (float)camera->getXMag().getValue();
+ break;
+ case CAM_PERSP:
+ default:
+ {
+ double x = camera->getXFov().getValue();
+ // x is in degrees, cam->lens is in millimiters
+ cam->lens = angle_to_lens((float)x*(M_PI/180.0f));
+ }
+ break;
+ }
+ }
+ break;
+ case COLLADAFW::Camera::SINGLE_Y:
+ {
+ switch(cam->type) {
+ case CAM_ORTHO:
+ cam->ortho_scale = (float)camera->getYMag().getValue();
+ break;
+ case CAM_PERSP:
+ default:
+ {
+ double yfov = camera->getYFov().getValue();
+ // yfov is in degrees, cam->lens is in millimiters
+ cam->lens = angle_to_lens((float)yfov*(M_PI/180.0f));
+ }
+ break;
+ }
+ }
+ break;
+ case COLLADAFW::Camera::UNDEFINED:
+ // read nothing, use blender defaults.
+ break;
+ }
+
this->uid_camera_map[camera->getUniqueId()] = cam;
// XXX import camera options
return true;
@@ -3843,8 +828,11 @@ public:
/** When this method is called, the writer must write the image.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeImage( const COLLADAFW::Image* image )
+ bool DocumentImporter::writeImage( const COLLADAFW::Image* image )
{
+ if(mImportStage!=General)
+ return true;
+
// XXX maybe it is necessary to check if the path is absolute or relative
const std::string& filepath = image->getImageURI().toNativePath();
const char *filename = (const char*)mFilename.c_str();
@@ -3853,7 +841,7 @@ public:
BLI_split_dirfile(filename, dir, NULL);
BLI_join_dirfile(full_path, dir, filepath.c_str());
- Image *ima = BKE_add_image_file(full_path, 0);
+ Image *ima = BKE_add_image_file(full_path);
if (!ima) {
fprintf(stderr, "Cannot create image. \n");
return true;
@@ -3865,8 +853,11 @@ public:
/** When this method is called, the writer must write the light.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeLight( const COLLADAFW::Light* light )
+ bool DocumentImporter::writeLight( const COLLADAFW::Light* light )
{
+ if(mImportStage!=General)
+ return true;
+
Lamp *lamp = NULL;
std::string la_id, la_name;
@@ -3885,6 +876,38 @@ public:
lamp->g = col.getGreen();
lamp->b = col.getBlue();
}
+ float constatt = light->getConstantAttenuation().getValue();
+ float linatt = light->getLinearAttenuation().getValue();
+ float quadatt = light->getQuadraticAttenuation().getValue();
+ float d = 25.0f;
+ float att1 = 0.0f;
+ float att2 = 0.0f;
+
+ float e = 1.0f/constatt;
+
+ /* NOTE: We assume for now that inv square is used for quadratic light
+ * and inv linear for linear light. Exported blender lin/quad weighted
+ * most likely will result in wrong import. */
+ /* quadratic light */
+ if(IS_EQ(linatt, 0.0f) && quadatt > 0.0f) {
+ //quadatt = att2/(d*d*(e*2));
+ float invquadatt = 1.0f/quadatt;
+ float d2 = invquadatt / (2 * e);
+ d = sqrtf(d2);
+ }
+ // linear light
+ else if(IS_EQ(quadatt, 0.0f) && linatt > 0.0f) {
+ //linatt = att1/(d*e);
+ float invlinatt = 1.0f/linatt;
+ d = invlinatt / e;
+ } else {
+ printf("no linear nor quad light, using defaults for attenuation, import will be incorrect: Lamp %s\n", lamp->id.name);
+ att2 = 1.0f;
+ }
+
+ lamp->dist = d;
+ lamp->energy = e;
+
COLLADAFW::Light::LightType type = light->getLightType();
switch(type) {
case COLLADAFW::Light::AMBIENT_LIGHT:
@@ -3895,9 +918,9 @@ public:
case COLLADAFW::Light::SPOT_LIGHT:
{
lamp->type = LA_SPOT;
- lamp->falloff_type = LA_FALLOFF_SLIDERS;
- lamp->att1 = light->getLinearAttenuation().getValue();
- lamp->att2 = light->getQuadraticAttenuation().getValue();
+ lamp->falloff_type = LA_FALLOFF_INVSQUARE;
+ lamp->att1 = att1;
+ lamp->att2 = att2;
lamp->spotsize = light->getFallOffAngle().getValue();
lamp->spotblend = light->getFallOffExponent().getValue();
}
@@ -3910,8 +933,9 @@ public:
case COLLADAFW::Light::POINT_LIGHT:
{
lamp->type = LA_LOCAL;
- lamp->att1 = light->getLinearAttenuation().getValue();
- lamp->att2 = light->getQuadraticAttenuation().getValue();
+ lamp->falloff_type = LA_FALLOFF_INVSQUARE;
+ lamp->att1 = att1;
+ lamp->att2 = att2;
}
break;
case COLLADAFW::Light::UNDEFINED:
@@ -3927,45 +951,50 @@ public:
}
// this function is called only for animations that pass COLLADAFW::validate
- virtual bool writeAnimation( const COLLADAFW::Animation* anim )
+ bool DocumentImporter::writeAnimation( const COLLADAFW::Animation* anim )
{
+ if(mImportStage!=General)
+ return true;
+
// return true;
return anim_importer.write_animation(anim);
}
// called on post-process stage after writeVisualScenes
- virtual bool writeAnimationList( const COLLADAFW::AnimationList* animationList )
+ bool DocumentImporter::writeAnimationList( const COLLADAFW::AnimationList* animationList )
{
+ if(mImportStage!=General)
+ return true;
+
// return true;
return anim_importer.write_animation_list(animationList);
}
/** When this method is called, the writer must write the skin controller data.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeSkinControllerData( const COLLADAFW::SkinControllerData* skin )
+ bool DocumentImporter::writeSkinControllerData( const COLLADAFW::SkinControllerData* skin )
{
return armature_importer.write_skin_controller_data(skin);
}
// this is called on postprocess, before writeVisualScenes
- virtual bool writeController( const COLLADAFW::Controller* controller )
+ bool DocumentImporter::writeController( const COLLADAFW::Controller* controller )
{
+ if(mImportStage!=General)
+ return true;
+
return armature_importer.write_controller(controller);
}
- virtual bool writeFormulas( const COLLADAFW::Formulas* formulas )
+ bool DocumentImporter::writeFormulas( const COLLADAFW::Formulas* formulas )
{
return true;
}
- virtual bool writeKinematicsScene( const COLLADAFW::KinematicsScene* kinematicsScene )
+ bool DocumentImporter::writeKinematicsScene( const COLLADAFW::KinematicsScene* kinematicsScene )
{
return true;
}
-};
-void DocumentImporter::import(bContext *C, const char *filename)
-{
- Writer w(C, filename);
- w.write();
-}
+
+
diff --git a/source/blender/collada/DocumentImporter.h b/source/blender/collada/DocumentImporter.h
index babf8f65d7f..029a74f15b5 100644
--- a/source/blender/collada/DocumentImporter.h
+++ b/source/blender/collada/DocumentImporter.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -21,11 +21,128 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+#ifndef __DOCUMENTIMPORTER_H__
+#define __DOCUMENTIMPORTER_H__
+
+#include "COLLADAFWIWriter.h"
+#include "COLLADAFWMaterial.h"
+#include "COLLADAFWEffect.h"
+#include "COLLADAFWColor.h"
+#include "COLLADAFWImage.h"
+#include "COLLADAFWInstanceGeometry.h"
+#include "COLLADAFWController.h"
+#include "COLLADAFWMorphController.h"
+#include "COLLADAFWSkinController.h"
+
+#include "BKE_object.h"
+
+#include "TransformReader.h"
+#include "AnimationImporter.h"
+#include "ArmatureImporter.h"
+#include "MeshImporter.h"
+
+
struct Main;
struct bContext;
-class DocumentImporter
+/** Importer class. */
+class DocumentImporter : COLLADAFW::IWriter
{
public:
- void import(bContext *C, const char *filename);
+ //! Enumeration to denote the stage of import
+ enum ImportStage {
+ General, //!< First pass to collect all data except controller
+ Controller, //!< Second pass to collect controller data
+ };
+ /** Constructor */
+ DocumentImporter(bContext *C, const char *filename);
+
+ /** Destructor */
+ ~DocumentImporter();
+
+ /** Function called by blender UI */
+ bool import();
+
+ /** these should not be here */
+ Object* create_camera_object(COLLADAFW::InstanceCamera*, Scene*);
+ Object* create_lamp_object(COLLADAFW::InstanceLight*, Scene*);
+ Object* create_instance_node(Object*, COLLADAFW::Node*, COLLADAFW::Node*, Scene*, bool);
+ void write_node(COLLADAFW::Node*, COLLADAFW::Node*, Scene*, Object*, bool);
+ MTex* create_texture(COLLADAFW::EffectCommon*, COLLADAFW::Texture&, Material*, int, TexIndexTextureArrayMap&);
+ void write_profile_COMMON(COLLADAFW::EffectCommon*, Material*);
+ void translate_anim_recursive(COLLADAFW::Node*, COLLADAFW::Node*, Object*);
+
+ /** This method will be called if an error in the loading process occurred and the loader cannot
+ continue to load. The writer should undo all operations that have been performed.
+ @param errorMessage A message containing informations about the error that occurred.
+ */
+ void cancel(const COLLADAFW::String& errorMessage);
+
+ /** This is the method called. The writer hast to prepare to receive data.*/
+ void start();
+
+ /** This method is called after the last write* method. No other methods will be called after this.*/
+ void finish();
+
+ bool writeGlobalAsset(const COLLADAFW::FileInfo*);
+
+ bool writeScene(const COLLADAFW::Scene*);
+
+ bool writeVisualScene(const COLLADAFW::VisualScene*);
+
+ bool writeLibraryNodes(const COLLADAFW::LibraryNodes*);
+
+ bool writeAnimation(const COLLADAFW::Animation*);
+
+ bool writeAnimationList(const COLLADAFW::AnimationList*);
+
+ bool writeGeometry(const COLLADAFW::Geometry*);
+
+ bool writeMaterial(const COLLADAFW::Material*);
+
+ bool writeEffect(const COLLADAFW::Effect*);
+
+ bool writeCamera(const COLLADAFW::Camera*);
+
+ bool writeImage(const COLLADAFW::Image*);
+
+ bool writeLight(const COLLADAFW::Light*);
+
+ bool writeSkinControllerData(const COLLADAFW::SkinControllerData*);
+
+ bool writeController(const COLLADAFW::Controller*);
+
+ bool writeFormulas(const COLLADAFW::Formulas*);
+
+ bool writeKinematicsScene(const COLLADAFW::KinematicsScene*);
+
+ private:
+
+ /** Current import stage we're in. */
+ ImportStage mImportStage;
+ std::string mFilename;
+
+ bContext *mContext;
+
+ UnitConverter unit_converter;
+ ArmatureImporter armature_importer;
+ MeshImporter mesh_importer;
+ AnimationImporter anim_importer;
+
+ std::map<COLLADAFW::UniqueId, Image*> uid_image_map;
+ std::map<COLLADAFW::UniqueId, Material*> uid_material_map;
+ std::map<COLLADAFW::UniqueId, Material*> uid_effect_map;
+ std::map<COLLADAFW::UniqueId, Camera*> uid_camera_map;
+ std::map<COLLADAFW::UniqueId, Lamp*> uid_lamp_map;
+ std::map<Material*, TexIndexTextureArrayMap> material_texture_mapping_map;
+ std::map<COLLADAFW::UniqueId, Object*> object_map;
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> node_map;
+ std::vector<const COLLADAFW::VisualScene*> vscenes;
+ std::vector<Object*> libnode_ob;
+
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> root_map; // find root joint by child joint uid, for bone tree evaluation during resampling
+
};
+
+#endif
diff --git a/source/blender/collada/EffectExporter.cpp b/source/blender/collada/EffectExporter.cpp
new file mode 100644
index 00000000000..be8ecc8dedf
--- /dev/null
+++ b/source/blender/collada/EffectExporter.cpp
@@ -0,0 +1,306 @@
+/**
+ * $Id: EffectExporter.cpp 32360 2010-10-07 01:20:59Z gsrb3d $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <map>
+
+#include "COLLADASWEffectProfile.h"
+
+#include "EffectExporter.h"
+#include "MaterialExporter.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_texture_types.h"
+
+#include "BKE_customdata.h"
+
+#include "collada_internal.h"
+#include "collada_utils.h"
+
+// OB_MESH is assumed
+static std::string getActiveUVLayerName(Object *ob)
+{
+ Mesh *me = (Mesh*)ob->data;
+
+ int num_layers = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
+ if (num_layers)
+ return std::string(bc_CustomData_get_active_layer_name(&me->fdata, CD_MTFACE));
+
+ return "";
+}
+
+
+EffectsExporter::EffectsExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryEffects(sw){}
+void EffectsExporter::exportEffects(Scene *sce)
+{
+ openLibrary();
+ MaterialFunctor mf;
+ mf.forEachMaterialInScene<EffectsExporter>(sce, *this);
+
+ closeLibrary();
+}
+
+void EffectsExporter::operator()(Material *ma, Object *ob)
+{
+ // create a list of indices to textures of type TEX_IMAGE
+ std::vector<int> tex_indices;
+ createTextureIndices(ma, tex_indices);
+
+ openEffect(translate_id(id_name(ma)) + "-effect");
+
+ COLLADASW::EffectProfile ep(mSW);
+ ep.setProfileType(COLLADASW::EffectProfile::COMMON);
+ ep.openProfile();
+ // set shader type - one of three blinn, phong or lambert
+ if (ma->spec_shader == MA_SPEC_BLINN) {
+ ep.setShaderType(COLLADASW::EffectProfile::BLINN);
+ // shininess
+ ep.setShininess(ma->har);
+ }
+ else if (ma->spec_shader == MA_SPEC_PHONG) {
+ ep.setShaderType(COLLADASW::EffectProfile::PHONG);
+ // shininess
+ ep.setShininess(ma->har);
+ }
+ else {
+ // XXX write warning "Current shader type is not supported"
+ ep.setShaderType(COLLADASW::EffectProfile::LAMBERT);
+ }
+ // index of refraction
+ if (ma->mode & MA_RAYTRANSP) {
+ ep.setIndexOfRefraction(ma->ang);
+ }
+ else {
+ ep.setIndexOfRefraction(1.0f);
+ }
+
+ COLLADASW::ColorOrTexture cot;
+
+ // transparency
+ if (ma->mode & MA_TRANSP) {
+ // Tod: because we are in A_ONE mode transparency is calculated like this:
+ ep.setTransparency(ma->alpha);
+ // cot = getcol(1.0f, 1.0f, 1.0f, 1.0f);
+ // ep.setTransparent(cot);
+ }
+
+ // emission
+ cot=getcol(ma->emit, ma->emit, ma->emit, 1.0f);
+ ep.setEmission(cot);
+
+ // diffuse multiplied by diffuse intensity
+ cot = getcol(ma->r * ma->ref, ma->g * ma->ref, ma->b * ma->ref, 1.0f);
+ ep.setDiffuse(cot);
+
+ // ambient
+ cot = getcol(ma->ambr, ma->ambg, ma->ambb, 1.0f);
+ ep.setAmbient(cot);
+
+ // reflective, reflectivity
+ if (ma->mode & MA_RAYMIRROR) {
+ cot = getcol(ma->mirr, ma->mirg, ma->mirb, 1.0f);
+ ep.setReflective(cot);
+ ep.setReflectivity(ma->ray_mirror);
+ }
+ // else {
+ // cot = getcol(ma->specr, ma->specg, ma->specb, 1.0f);
+ // ep.setReflective(cot);
+ // ep.setReflectivity(ma->spec);
+ // }
+
+ // specular
+ if (ep.getShaderType() != COLLADASW::EffectProfile::LAMBERT) {
+ cot = getcol(ma->specr * ma->spec, ma->specg * ma->spec, ma->specb * ma->spec, 1.0f);
+ ep.setSpecular(cot);
+ }
+
+ // XXX make this more readable if possible
+
+ // create <sampler> and <surface> for each image
+ COLLADASW::Sampler samplers[MAX_MTEX];
+ //COLLADASW::Surface surfaces[MAX_MTEX];
+ //void *samp_surf[MAX_MTEX][2];
+ void *samp_surf[MAX_MTEX][1];
+
+ // image to index to samp_surf map
+ // samp_surf[index] stores 2 pointers, sampler and surface
+ std::map<std::string, int> im_samp_map;
+
+ unsigned int a, b;
+ for (a = 0, b = 0; a < tex_indices.size(); a++) {
+ MTex *t = ma->mtex[tex_indices[a]];
+ Image *ima = t->tex->ima;
+
+ // Image not set for texture
+ if(!ima) continue;
+
+ std::string key(id_name(ima));
+ key = translate_id(key);
+
+ // create only one <sampler>/<surface> pair for each unique image
+ if (im_samp_map.find(key) == im_samp_map.end()) {
+ // //<newparam> <surface> <init_from>
+ // COLLADASW::Surface surface(COLLADASW::Surface::SURFACE_TYPE_2D,
+ // key + COLLADASW::Surface::SURFACE_SID_SUFFIX);
+ // COLLADASW::SurfaceInitOption sio(COLLADASW::SurfaceInitOption::INIT_FROM);
+ // sio.setImageReference(key);
+ // surface.setInitOption(sio);
+
+ // COLLADASW::NewParamSurface surface(mSW);
+ // surface->setParamType(COLLADASW::CSW_SURFACE_TYPE_2D);
+
+ //<newparam> <sampler> <source>
+ COLLADASW::Sampler sampler(COLLADASW::Sampler::SAMPLER_TYPE_2D,
+ key + COLLADASW::Sampler::SAMPLER_SID_SUFFIX,
+ key + COLLADASW::Sampler::SURFACE_SID_SUFFIX);
+ sampler.setImageId(key);
+ // copy values to arrays since they will live longer
+ samplers[a] = sampler;
+ //surfaces[a] = surface;
+
+ // store pointers so they can be used later when we create <texture>s
+ samp_surf[b][0] = &samplers[a];
+ //samp_surf[b][1] = &surfaces[a];
+
+ im_samp_map[key] = b;
+ b++;
+ }
+ }
+
+ // used as fallback when MTex->uvname is "" (this is pretty common)
+ // it is indeed the correct value to use in that case
+ std::string active_uv(getActiveUVLayerName(ob));
+
+ // write textures
+ // XXX very slow
+ for (a = 0; a < tex_indices.size(); a++) {
+ MTex *t = ma->mtex[tex_indices[a]];
+ Image *ima = t->tex->ima;
+
+ // Image not set for texture
+ if(!ima) continue;
+
+ // we assume map input is always TEXCO_UV
+
+ std::string key(id_name(ima));
+ key = translate_id(key);
+ int i = im_samp_map[key];
+ COLLADASW::Sampler *sampler = (COLLADASW::Sampler*)samp_surf[i][0];
+ //COLLADASW::Surface *surface = (COLLADASW::Surface*)samp_surf[i][1];
+
+ std::string uvname = strlen(t->uvname) ? t->uvname : active_uv;
+
+ // color
+ if (t->mapto & MAP_COL) {
+ ep.setDiffuse(createTexture(ima, uvname, sampler));
+ }
+ // ambient
+ if (t->mapto & MAP_AMB) {
+ ep.setAmbient(createTexture(ima, uvname, sampler));
+ }
+ // specular
+ if (t->mapto & MAP_SPEC) {
+ ep.setSpecular(createTexture(ima, uvname, sampler));
+ }
+ // emission
+ if (t->mapto & MAP_EMIT) {
+ ep.setEmission(createTexture(ima, uvname, sampler));
+ }
+ // reflective
+ if (t->mapto & MAP_REF) {
+ ep.setReflective(createTexture(ima, uvname, sampler));
+ }
+ // alpha
+ if (t->mapto & MAP_ALPHA) {
+ ep.setTransparent(createTexture(ima, uvname, sampler));
+ }
+ // extension:
+ // Normal map --> Must be stored with <extra> tag as different technique,
+ // since COLLADA doesn't support normal maps, even in current COLLADA 1.5.
+ if (t->mapto & MAP_NORM) {
+ COLLADASW::Texture texture(key);
+ texture.setTexcoord(uvname);
+ texture.setSampler(*sampler);
+ // technique FCOLLADA, with the <bump> tag, is most likely the best understood,
+ // most widespread de-facto standard.
+ texture.setProfileName("FCOLLADA");
+ texture.setChildElementName("bump");
+ ep.addExtraTechniqueColorOrTexture(COLLADASW::ColorOrTexture(texture));
+ }
+ }
+ // performs the actual writing
+ ep.addProfileElements();
+ bool twoSided = false;
+ if (ob->type == OB_MESH && ob->data) {
+ Mesh *me = (Mesh*)ob->data;
+ if (me->flag & ME_TWOSIDED)
+ twoSided = true;
+ }
+ if (twoSided)
+ ep.addExtraTechniqueParameter("GOOGLEEARTH", "show_double_sided", 1);
+ ep.addExtraTechniques(mSW);
+
+ ep.closeProfile();
+ if (twoSided)
+ mSW->appendTextBlock("<extra><technique profile=\"MAX3D\"><double_sided>1</double_sided></technique></extra>");
+ closeEffect();
+}
+
+COLLADASW::ColorOrTexture EffectsExporter::createTexture(Image *ima,
+ std::string& uv_layer_name,
+ COLLADASW::Sampler *sampler
+ /*COLLADASW::Surface *surface*/)
+{
+
+ COLLADASW::Texture texture(translate_id(id_name(ima)));
+ texture.setTexcoord(uv_layer_name);
+ //texture.setSurface(*surface);
+ texture.setSampler(*sampler);
+
+ COLLADASW::ColorOrTexture cot(texture);
+ return cot;
+}
+
+COLLADASW::ColorOrTexture EffectsExporter::getcol(float r, float g, float b, float a)
+{
+ COLLADASW::Color color(r,g,b,a);
+ COLLADASW::ColorOrTexture cot(color);
+ return cot;
+}
+
+//returns the array of mtex indices which have image
+//need this for exporting textures
+void EffectsExporter::createTextureIndices(Material *ma, std::vector<int> &indices)
+{
+ indices.clear();
+
+ for (int a = 0; a < MAX_MTEX; a++) {
+ if (ma->mtex[a] &&
+ ma->mtex[a]->tex &&
+ ma->mtex[a]->tex->type == TEX_IMAGE &&
+ ma->mtex[a]->texco == TEXCO_UV){
+ indices.push_back(a);
+ }
+ }
+}
diff --git a/source/blender/collada/EffectExporter.h b/source/blender/collada/EffectExporter.h
new file mode 100644
index 00000000000..9f7f6439c45
--- /dev/null
+++ b/source/blender/collada/EffectExporter.h
@@ -0,0 +1,62 @@
+/**
+ * $Id: EffectExporter.h 32360 2010-10-07 01:20:59Z gsrb3d $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __EFFECTEXPORTER_H__
+#define __EFFECTEXPORTER_H__
+
+#include <string>
+#include <vector>
+
+#include "COLLADASWColorOrTexture.h"
+#include "COLLADASWStreamWriter.h"
+#include "COLLADASWSampler.h"
+#include "COLLADASWLibraryEffects.h"
+
+#include "DNA_image_types.h"
+#include "DNA_material_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+class EffectsExporter: COLLADASW::LibraryEffects
+{
+public:
+ EffectsExporter(COLLADASW::StreamWriter *sw);
+ void exportEffects(Scene *sce);
+
+ void operator()(Material *ma, Object *ob);
+
+ COLLADASW::ColorOrTexture createTexture(Image *ima,
+ std::string& uv_layer_name,
+ COLLADASW::Sampler *sampler
+ /*COLLADASW::Surface *surface*/);
+
+ COLLADASW::ColorOrTexture getcol(float r, float g, float b, float a);
+
+ //returns the array of mtex indices which have image
+ //need this for exporting textures
+ void createTextureIndices(Material *ma, std::vector<int> &indices);
+};
+
+#endif
diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp
new file mode 100644
index 00000000000..12e0ca3f4bd
--- /dev/null
+++ b/source/blender/collada/GeometryExporter.cpp
@@ -0,0 +1,477 @@
+/**
+ * $Id: GeometryExporter.cpp 34533 2011-01-27 19:39:06Z jesterking $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "COLLADASWPrimitves.h"
+#include "COLLADASWSource.h"
+#include "COLLADASWVertices.h"
+#include "COLLADABUUtils.h"
+
+#include "GeometryExporter.h"
+
+#include "DNA_meshdata_types.h"
+#include "BKE_customdata.h"
+#include "BKE_material.h"
+
+#include "collada_internal.h"
+
+// TODO: optimize UV sets by making indexed list with duplicates removed
+GeometryExporter::GeometryExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryGeometries(sw) {}
+
+
+void GeometryExporter::exportGeom(Scene *sce)
+{
+ openLibrary();
+
+ mScene = sce;
+ GeometryFunctor gf;
+ gf.forEachMeshObjectInScene<GeometryExporter>(sce, *this);
+
+ closeLibrary();
+}
+
+void GeometryExporter::operator()(Object *ob)
+{
+ // XXX don't use DerivedMesh, Mesh instead?
+
+#if 0
+ DerivedMesh *dm = mesh_get_derived_final(mScene, ob, CD_MASK_BAREMESH);
+#endif
+ Mesh *me = (Mesh*)ob->data;
+ std::string geom_id = get_geometry_id(ob);
+ std::vector<Normal> nor;
+ std::vector<Face> norind;
+
+ // Skip if linked geometry was already exported from another reference
+ if (exportedGeometry.find(geom_id) != exportedGeometry.end())
+ return;
+ exportedGeometry.insert(geom_id);
+
+ bool has_color = (bool)CustomData_has_layer(&me->fdata, CD_MCOL);
+
+ create_normals(nor, norind, me);
+
+ // openMesh(geoId, geoName, meshId)
+ openMesh(geom_id);
+
+ // writes <source> for vertex coords
+ createVertsSource(geom_id, me);
+
+ // writes <source> for normal coords
+ createNormalsSource(geom_id, me, nor);
+
+ bool has_uvs = (bool)CustomData_has_layer(&me->fdata, CD_MTFACE);
+
+ // writes <source> for uv coords if mesh has uv coords
+ if (has_uvs)
+ createTexcoordsSource(geom_id, me);
+
+ if (has_color)
+ createVertexColorSource(geom_id, me);
+
+ // <vertices>
+ COLLADASW::Vertices verts(mSW);
+ verts.setId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::VERTEX));
+ COLLADASW::InputList &input_list = verts.getInputList();
+ COLLADASW::Input input(COLLADASW::InputSemantic::POSITION, getUrlBySemantics(geom_id, COLLADASW::InputSemantic::POSITION));
+ input_list.push_back(input);
+ verts.add();
+
+ // XXX slow
+ if (ob->totcol) {
+ for(int a = 0; a < ob->totcol; a++) {
+ createPolylist(a, has_uvs, has_color, ob, geom_id, norind);
+ }
+ }
+ else {
+ createPolylist(0, has_uvs, has_color, ob, geom_id, norind);
+ }
+
+ closeMesh();
+ closeGeometry();
+
+#if 0
+ dm->release(dm);
+#endif
+}
+
+// powerful because it handles both cases when there is material and when there's not
+void GeometryExporter::createPolylist(int material_index,
+ bool has_uvs,
+ bool has_color,
+ Object *ob,
+ std::string& geom_id,
+ std::vector<Face>& norind)
+{
+ Mesh *me = (Mesh*)ob->data;
+ MFace *mfaces = me->mface;
+ int totfaces = me->totface;
+
+ // <vcount>
+ int i;
+ int faces_in_polylist = 0;
+ std::vector<unsigned long> vcount_list;
+
+ // count faces with this material
+ for (i = 0; i < totfaces; i++) {
+ MFace *f = &mfaces[i];
+
+ if (f->mat_nr == material_index) {
+ faces_in_polylist++;
+ if (f->v4 == 0) {
+ vcount_list.push_back(3);
+ }
+ else {
+ vcount_list.push_back(4);
+ }
+ }
+ }
+
+ // no faces using this material
+ if (faces_in_polylist == 0) {
+ fprintf(stderr, "%s: no faces use material %d\n", id_name(ob).c_str(), material_index);
+ return;
+ }
+
+ Material *ma = ob->totcol ? give_current_material(ob, material_index + 1) : NULL;
+ COLLADASW::Polylist polylist(mSW);
+
+ // sets count attribute in <polylist>
+ polylist.setCount(faces_in_polylist);
+
+ // sets material name
+ if (ma) {
+ polylist.setMaterial(translate_id(id_name(ma)));
+ }
+
+ COLLADASW::InputList &til = polylist.getInputList();
+
+ // creates <input> in <polylist> for vertices
+ COLLADASW::Input input1(COLLADASW::InputSemantic::VERTEX, getUrlBySemantics(geom_id, COLLADASW::InputSemantic::VERTEX), 0);
+
+ // creates <input> in <polylist> for normals
+ COLLADASW::Input input2(COLLADASW::InputSemantic::NORMAL, getUrlBySemantics(geom_id, COLLADASW::InputSemantic::NORMAL), 1);
+
+ til.push_back(input1);
+ til.push_back(input2);
+
+ // if mesh has uv coords writes <input> for TEXCOORD
+ int num_layers = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
+
+ for (i = 0; i < num_layers; i++) {
+ // char *name = CustomData_get_layer_name(&me->fdata, CD_MTFACE, i);
+ COLLADASW::Input input3(COLLADASW::InputSemantic::TEXCOORD,
+ makeUrl(makeTexcoordSourceId(geom_id, i)),
+ 2, // offset always 2, this is only until we have optimized UV sets
+ i // set number equals UV layer index
+ );
+ til.push_back(input3);
+ }
+
+ if (has_color) {
+ COLLADASW::Input input4(COLLADASW::InputSemantic::COLOR, getUrlBySemantics(geom_id, COLLADASW::InputSemantic::COLOR), has_uvs ? 3 : 2);
+ til.push_back(input4);
+ }
+
+ // sets <vcount>
+ polylist.setVCountList(vcount_list);
+
+ // performs the actual writing
+ polylist.prepareToAppendValues();
+
+ // <p>
+ int texindex = 0;
+ for (i = 0; i < totfaces; i++) {
+ MFace *f = &mfaces[i];
+
+ if (f->mat_nr == material_index) {
+
+ unsigned int *v = &f->v1;
+ unsigned int *n = &norind[i].v1;
+ for (int j = 0; j < (f->v4 == 0 ? 3 : 4); j++) {
+ polylist.appendValues(v[j]);
+ polylist.appendValues(n[j]);
+
+ if (has_uvs)
+ polylist.appendValues(texindex + j);
+
+ if (has_color)
+ polylist.appendValues(texindex + j);
+ }
+ }
+
+ texindex += 3;
+ if (f->v4 != 0)
+ texindex++;
+ }
+
+ polylist.finish();
+}
+
+// creates <source> for positions
+void GeometryExporter::createVertsSource(std::string geom_id, Mesh *me)
+{
+#if 0
+ int totverts = dm->getNumVerts(dm);
+ MVert *verts = dm->getVertArray(dm);
+#endif
+ int totverts = me->totvert;
+ MVert *verts = me->mvert;
+
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::POSITION));
+ source.setArrayId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::POSITION) +
+ ARRAY_ID_SUFFIX);
+ source.setAccessorCount(totverts);
+ source.setAccessorStride(3);
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("X");
+ param.push_back("Y");
+ param.push_back("Z");
+ /*main function, it creates <source id = "">, <float_array id = ""
+ count = ""> */
+ source.prepareToAppendValues();
+ //appends data to <float_array>
+ int i = 0;
+ for (i = 0; i < totverts; i++) {
+ source.appendValues(verts[i].co[0], verts[i].co[1], verts[i].co[2]);
+ }
+
+ source.finish();
+
+}
+
+void GeometryExporter::createVertexColorSource(std::string geom_id, Mesh *me)
+{
+ if (!CustomData_has_layer(&me->fdata, CD_MCOL))
+ return;
+
+ MFace *f;
+ int totcolor = 0, i, j;
+
+ for (i = 0, f = me->mface; i < me->totface; i++, f++)
+ totcolor += f->v4 ? 4 : 3;
+
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::COLOR));
+ source.setArrayId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::COLOR) + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(totcolor);
+ source.setAccessorStride(3);
+
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("R");
+ param.push_back("G");
+ param.push_back("B");
+
+ source.prepareToAppendValues();
+
+ int index = CustomData_get_active_layer_index(&me->fdata, CD_MCOL);
+
+ MCol *mcol = (MCol*)me->fdata.layers[index].data;
+ MCol *c = mcol;
+
+ for (i = 0, f = me->mface; i < me->totface; i++, c += 4, f++)
+ for (j = 0; j < (f->v4 ? 4 : 3); j++)
+ source.appendValues(c[j].b / 255.0f, c[j].g / 255.0f, c[j].r / 255.0f);
+
+ source.finish();
+}
+
+std::string GeometryExporter::makeTexcoordSourceId(std::string& geom_id, int layer_index)
+{
+ char suffix[20];
+ sprintf(suffix, "-%d", layer_index);
+ return getIdBySemantics(geom_id, COLLADASW::InputSemantic::TEXCOORD) + suffix;
+}
+
+//creates <source> for texcoords
+void GeometryExporter::createTexcoordsSource(std::string geom_id, Mesh *me)
+{
+#if 0
+ int totfaces = dm->getNumFaces(dm);
+ MFace *mfaces = dm->getFaceArray(dm);
+#endif
+ int totfaces = me->totface;
+ MFace *mfaces = me->mface;
+
+ int totuv = 0;
+ int i;
+
+ // count totuv
+ for (i = 0; i < totfaces; i++) {
+ MFace *f = &mfaces[i];
+ if (f->v4 == 0) {
+ totuv+=3;
+ }
+ else {
+ totuv+=4;
+ }
+ }
+
+ int num_layers = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
+
+ // write <source> for each layer
+ // each <source> will get id like meshName + "map-channel-1"
+ for (int a = 0; a < num_layers; a++) {
+ MTFace *tface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, a);
+ // char *name = CustomData_get_layer_name(&me->fdata, CD_MTFACE, a);
+
+ COLLADASW::FloatSourceF source(mSW);
+ std::string layer_id = makeTexcoordSourceId(geom_id, a);
+ source.setId(layer_id);
+ source.setArrayId(layer_id + ARRAY_ID_SUFFIX);
+
+ source.setAccessorCount(totuv);
+ source.setAccessorStride(2);
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("S");
+ param.push_back("T");
+
+ source.prepareToAppendValues();
+
+ for (i = 0; i < totfaces; i++) {
+ MFace *f = &mfaces[i];
+
+ for (int j = 0; j < (f->v4 == 0 ? 3 : 4); j++) {
+ source.appendValues(tface[i].uv[j][0],
+ tface[i].uv[j][1]);
+ }
+ }
+
+ source.finish();
+ }
+}
+
+
+//creates <source> for normals
+void GeometryExporter::createNormalsSource(std::string geom_id, Mesh *me, std::vector<Normal>& nor)
+{
+#if 0
+ int totverts = dm->getNumVerts(dm);
+ MVert *verts = dm->getVertArray(dm);
+#endif
+
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::NORMAL));
+ source.setArrayId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::NORMAL) +
+ ARRAY_ID_SUFFIX);
+ source.setAccessorCount((unsigned long)nor.size());
+ source.setAccessorStride(3);
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("X");
+ param.push_back("Y");
+ param.push_back("Z");
+
+ source.prepareToAppendValues();
+
+ std::vector<Normal>::iterator it;
+ for (it = nor.begin(); it != nor.end(); it++) {
+ Normal& n = *it;
+ source.appendValues(n.x, n.y, n.z);
+ }
+
+ source.finish();
+}
+
+void GeometryExporter::create_normals(std::vector<Normal> &nor, std::vector<Face> &ind, Mesh *me)
+{
+ int i, j, v;
+ MVert *vert = me->mvert;
+ std::map<unsigned int, unsigned int> nshar;
+
+ for (i = 0; i < me->totface; i++) {
+ MFace *fa = &me->mface[i];
+ Face f;
+ unsigned int *nn = &f.v1;
+ unsigned int *vv = &fa->v1;
+
+ memset(&f, 0, sizeof(f));
+ v = fa->v4 == 0 ? 3 : 4;
+
+ if (!(fa->flag & ME_SMOOTH)) {
+ Normal n;
+ if (v == 4)
+ normal_quad_v3(&n.x, vert[fa->v1].co, vert[fa->v2].co, vert[fa->v3].co, vert[fa->v4].co);
+ else
+ normal_tri_v3(&n.x, vert[fa->v1].co, vert[fa->v2].co, vert[fa->v3].co);
+ nor.push_back(n);
+ }
+
+ for (j = 0; j < v; j++) {
+ if (fa->flag & ME_SMOOTH) {
+ if (nshar.find(*vv) != nshar.end())
+ *nn = nshar[*vv];
+ else {
+ Normal n = {
+ vert[*vv].no[0]/32767.0,
+ vert[*vv].no[1]/32767.0,
+ vert[*vv].no[2]/32767.0
+ };
+ nor.push_back(n);
+ *nn = (unsigned int)nor.size() - 1;
+ nshar[*vv] = *nn;
+ }
+ vv++;
+ }
+ else {
+ *nn = (unsigned int)nor.size() - 1;
+ }
+ nn++;
+ }
+
+ ind.push_back(f);
+ }
+}
+
+std::string GeometryExporter::getIdBySemantics(std::string geom_id, COLLADASW::InputSemantic::Semantics type, std::string other_suffix) {
+ return geom_id + getSuffixBySemantic(type) + other_suffix;
+}
+
+
+COLLADASW::URI GeometryExporter::getUrlBySemantics(std::string geom_id, COLLADASW::InputSemantic::Semantics type, std::string other_suffix) {
+
+ std::string id(getIdBySemantics(geom_id, type, other_suffix));
+ return COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, id);
+
+}
+
+COLLADASW::URI GeometryExporter::makeUrl(std::string id)
+{
+ return COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, id);
+}
+
+
+/* int GeometryExporter::getTriCount(MFace *faces, int totface) {
+ int i;
+ int tris = 0;
+ for (i = 0; i < totface; i++) {
+ // if quad
+ if (faces[i].v4 != 0)
+ tris += 2;
+ else
+ tris++;
+ }
+
+ return tris;
+ }*/
diff --git a/source/blender/collada/GeometryExporter.h b/source/blender/collada/GeometryExporter.h
new file mode 100644
index 00000000000..1f08f935f8e
--- /dev/null
+++ b/source/blender/collada/GeometryExporter.h
@@ -0,0 +1,117 @@
+/**
+ * $Id: GeometryExporter.h 34533 2011-01-27 19:39:06Z jesterking $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __GEOMETRYEXPORTER_H__
+#define __GEOMETRYEXPORTER_H__
+
+#include <string>
+#include <vector>
+#include <set>
+
+#include "COLLADASWStreamWriter.h"
+#include "COLLADASWLibraryGeometries.h"
+#include "COLLADASWInputList.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+// TODO: optimize UV sets by making indexed list with duplicates removed
+class GeometryExporter : COLLADASW::LibraryGeometries
+{
+ struct Face
+ {
+ unsigned int v1, v2, v3, v4;
+ };
+
+ struct Normal
+ {
+ float x, y, z;
+ };
+
+ Scene *mScene;
+
+public:
+ GeometryExporter(COLLADASW::StreamWriter *sw);
+
+ void exportGeom(Scene *sce);
+
+ void operator()(Object *ob);
+
+ // powerful because it handles both cases when there is material and when there's not
+ void createPolylist(int material_index,
+ bool has_uvs,
+ bool has_color,
+ Object *ob,
+ std::string& geom_id,
+ std::vector<Face>& norind);
+
+ // creates <source> for positions
+ void createVertsSource(std::string geom_id, Mesh *me);
+
+ void createVertexColorSource(std::string geom_id, Mesh *me);
+
+ std::string makeTexcoordSourceId(std::string& geom_id, int layer_index);
+
+ //creates <source> for texcoords
+ void createTexcoordsSource(std::string geom_id, Mesh *me);
+
+ //creates <source> for normals
+ void createNormalsSource(std::string geom_id, Mesh *me, std::vector<Normal>& nor);
+
+ void create_normals(std::vector<Normal> &nor, std::vector<Face> &ind, Mesh *me);
+
+ std::string getIdBySemantics(std::string geom_id, COLLADASW::InputSemantic::Semantics type, std::string other_suffix = "");
+
+ COLLADASW::URI getUrlBySemantics(std::string geom_id, COLLADASW::InputSemantic::Semantics type, std::string other_suffix = "");
+
+ COLLADASW::URI makeUrl(std::string id);
+
+ /* int getTriCount(MFace *faces, int totface);*/
+private:
+ std::set<std::string> exportedGeometry;
+};
+
+struct GeometryFunctor {
+ // f should have
+ // void operator()(Object* ob)
+ template<class Functor>
+ void forEachMeshObjectInScene(Scene *sce, Functor &f)
+ {
+
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ if (ob->type == OB_MESH && ob->data) {
+ f(ob);
+ }
+ base= base->next;
+
+ }
+ }
+};
+
+#endif
diff --git a/source/blender/collada/ImageExporter.cpp b/source/blender/collada/ImageExporter.cpp
new file mode 100644
index 00000000000..f3b00f4b51a
--- /dev/null
+++ b/source/blender/collada/ImageExporter.cpp
@@ -0,0 +1,94 @@
+/**
+ * $Id: ImageExporter.cpp 33274 2010-11-23 23:58:12Z jesterking $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "COLLADABUURI.h"
+#include "COLLADASWImage.h"
+
+#include "ImageExporter.h"
+#include "MaterialExporter.h"
+
+#include "DNA_texture_types.h"
+
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_utildefines.h"
+#include "BLI_fileops.h"
+#include "BLI_path_util.h"
+#include "BLI_string.h"
+
+ImagesExporter::ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename) : COLLADASW::LibraryImages(sw), mfilename(filename)
+{}
+
+void ImagesExporter::exportImages(Scene *sce)
+{
+ openLibrary();
+ MaterialFunctor mf;
+ mf.forEachMaterialInScene<ImagesExporter>(sce, *this);
+
+ closeLibrary();
+}
+
+void ImagesExporter::operator()(Material *ma, Object *ob)
+{
+ int a;
+ for (a = 0; a < MAX_MTEX; a++) {
+ MTex *mtex = ma->mtex[a];
+ if (mtex && mtex->tex && mtex->tex->ima) {
+
+ Image *image = mtex->tex->ima;
+ std::string name(id_name(image));
+ name = translate_id(name);
+ char rel[FILE_MAX];
+ char abs[FILE_MAX];
+ char src[FILE_MAX];
+ char dir[FILE_MAX];
+
+ BLI_split_dirfile(mfilename, dir, NULL);
+
+ BKE_rebase_path(abs, sizeof(abs), rel, sizeof(rel), G.main->name, image->name, dir);
+
+ if (abs[0] != '\0') {
+
+ // make absolute source path
+ BLI_strncpy(src, image->name, sizeof(src));
+ BLI_path_abs(src, G.main->name);
+
+ // make dest directory if it doesn't exist
+ BLI_make_existing_file(abs);
+
+ if (BLI_copy_fileops(src, abs) != 0) {
+ fprintf(stderr, "Cannot copy image to file's directory. \n");
+ }
+ }
+
+ if (find(mImages.begin(), mImages.end(), name) == mImages.end()) {
+ COLLADASW::Image img(COLLADABU::URI(COLLADABU::URI::nativePathToUri(rel)), name, name); /* set name also to mNameNC. This helps other viewers import files exported from Blender better */
+ img.add(mSW);
+
+ mImages.push_back(name);
+ }
+ }
+ }
+}
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_Canvas.h b/source/blender/collada/ImageExporter.h
index 963c8f20435..08574ce30f7 100644
--- a/source/gameengine/GamePlayer/common/unix/GPU_Canvas.h
+++ b/source/blender/collada/ImageExporter.h
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id: ImageExporter.h 32355 2010-10-06 20:40:16Z gsrb3d $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -17,42 +17,34 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef __GPU_CANVAS_H
-#define __GPU_CANVAS_H
+#ifndef __IMAGEEXPORTER_H__
+#define __IMAGEEXPORTER_H__
-#include <iostream>
+#include <vector>
+#include <string>
-#include "KXH_ketsji_hooks.h"
-#include "GPC_Canvas.h"
+#include "COLLADASWStreamWriter.h"
+#include "COLLADASWLibraryImages.h"
-class GPU_Canvas : public GPC_Canvas
+#include "DNA_material_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+class ImagesExporter: COLLADASW::LibraryImages
{
-private:
-
- /** Handle to the drawing resource. */
- KXH_plugin_handle m_plugin;
-
+ const char *mfilename;
+ std::vector<std::string> mImages; // contains list of written images, to avoid duplicates
public:
- GPU_Canvas(KXH_plugin_handle display, int width, int height);
- virtual ~GPU_Canvas();
+ ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename);
- virtual void Init(void);
-
- bool BeginDraw(void);
- void EndDraw(void);
- virtual void SwapBuffers(void);
-
+ void exportImages(Scene *sce);
+ void operator()(Material *ma, Object *ob);
};
-#endif // __GPU_CANVAS_H
-
+#endif
diff --git a/source/blender/collada/InstanceWriter.cpp b/source/blender/collada/InstanceWriter.cpp
new file mode 100644
index 00000000000..c3c62f44662
--- /dev/null
+++ b/source/blender/collada/InstanceWriter.cpp
@@ -0,0 +1,64 @@
+/**
+ * $Id: InstanceWriter.cpp 32355 2010-10-06 20:40:16Z gsrb3d $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string>
+
+#include "COLLADASWInstanceMaterial.h"
+
+#include "BKE_customdata.h"
+#include "BKE_material.h"
+
+#include "DNA_mesh_types.h"
+
+#include "InstanceWriter.h"
+
+#include "collada_internal.h"
+#include "collada_utils.h"
+
+void InstanceWriter::add_material_bindings(COLLADASW::BindMaterial& bind_material, Object *ob)
+{
+ for(int a = 0; a < ob->totcol; a++) {
+ Material *ma = give_current_material(ob, a+1);
+
+ COLLADASW::InstanceMaterialList& iml = bind_material.getInstanceMaterialList();
+
+ if (ma) {
+ std::string matid(id_name(ma));
+ matid = translate_id(matid);
+ COLLADASW::InstanceMaterial im(matid, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, matid));
+
+ // create <bind_vertex_input> for each uv layer
+ Mesh *me = (Mesh*)ob->data;
+ int totlayer = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
+
+ for (int b = 0; b < totlayer; b++) {
+ char *name = bc_CustomData_get_layer_name(&me->fdata, CD_MTFACE, b);
+ im.push_back(COLLADASW::BindVertexInput(name, "TEXCOORD", b));
+ }
+
+ iml.push_back(im);
+ }
+ }
+}
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_System.h b/source/blender/collada/InstanceWriter.h
index bd0658014e8..b613561bd20 100644
--- a/source/gameengine/GamePlayer/common/unix/GPU_System.h
+++ b/source/blender/collada/InstanceWriter.h
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id: InstanceWriter.h 32355 2010-10-06 20:40:16Z gsrb3d $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -17,30 +17,23 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef __GPU_SYSTEM_H
-#define __GPU_SYSTEM_H
+#ifndef __INSTANCEWRITER_H__
+#define __INSTANCEWRITER_H__
-#include "GPC_System.h"
+#include "COLLADASWBindMaterial.h"
-class GPU_System : public GPC_System
-{
-public:
- GPU_System()
- {
- }
+#include "DNA_object_types.h"
- virtual double GetTimeInSeconds();
+class InstanceWriter
+{
+protected:
+ void add_material_bindings(COLLADASW::BindMaterial& bind_material, Object *ob);
};
-#endif // __GPU_SYSTEM_H
-
+#endif
diff --git a/source/blender/collada/LightExporter.cpp b/source/blender/collada/LightExporter.cpp
new file mode 100644
index 00000000000..b9a2780097c
--- /dev/null
+++ b/source/blender/collada/LightExporter.cpp
@@ -0,0 +1,139 @@
+/**
+ * $Id: LightExporter.cpp 32468 2010-10-14 09:40:56Z jesterking $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string>
+
+#include "COLLADASWColor.h"
+#include "COLLADASWLight.h"
+
+#include "DNA_lamp_types.h"
+
+#include "BLI_math.h"
+
+#include "LightExporter.h"
+#include "collada_internal.h"
+
+template<class Functor>
+void forEachLampObjectInScene(Scene *sce, Functor &f)
+{
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ if (ob->type == OB_LAMP && ob->data) {
+ f(ob);
+ }
+ base= base->next;
+ }
+}
+
+LightsExporter::LightsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryLights(sw){}
+
+void LightsExporter::exportLights(Scene *sce)
+{
+ openLibrary();
+
+ forEachLampObjectInScene(sce, *this);
+
+ closeLibrary();
+}
+void LightsExporter::operator()(Object *ob)
+{
+ Lamp *la = (Lamp*)ob->data;
+ std::string la_id(get_light_id(ob));
+ std::string la_name(id_name(la));
+ COLLADASW::Color col(la->r, la->g, la->b);
+ float att1, att2;
+ float e, d, constatt, linatt, quadatt;
+ att1 = att2 = 0.0f;
+
+ if(la->falloff_type==LA_FALLOFF_INVLINEAR) {
+ att1 = 1.0f;
+ att2 = 0.0f;
+ }
+ else if(la->falloff_type==LA_FALLOFF_INVSQUARE) {
+ att1 = 0.0f;
+ att2 = 1.0f;
+ }
+ else if(la->falloff_type==LA_FALLOFF_SLIDERS) {
+ att1 = la->att1;
+ att2 = la->att2;
+ }
+
+ e = la->energy;
+ d = la->dist;
+
+ constatt = linatt = quadatt = MAXFLOAT;
+ if(e > 0.0f) {
+ constatt = 1.0f/e;
+ linatt = att1/(d*e);
+ quadatt = att2/(d*d*(e*2));
+ }
+
+ // sun
+ if (la->type == LA_SUN) {
+ COLLADASW::DirectionalLight cla(mSW, la_id, la_name, e);
+ cla.setColor(col);
+ cla.setConstantAttenuation(constatt);
+ addLight(cla);
+ }
+ // hemi
+ else if (la->type == LA_HEMI) {
+ COLLADASW::AmbientLight cla(mSW, la_id, la_name, e);
+ cla.setColor(col);
+ cla.setConstantAttenuation(constatt);
+ addLight(cla);
+ }
+ // spot
+ else if (la->type == LA_SPOT) {
+ COLLADASW::SpotLight cla(mSW, la_id, la_name, e);
+ cla.setColor(col);
+ cla.setFallOffAngle(la->spotsize);
+ cla.setFallOffExponent(la->spotblend);
+ cla.setConstantAttenuation(constatt);
+ cla.setLinearAttenuation(linatt);
+ cla.setQuadraticAttenuation(quadatt);
+ addLight(cla);
+ }
+ // lamp
+ else if (la->type == LA_LOCAL) {
+ COLLADASW::PointLight cla(mSW, la_id, la_name, e);
+ cla.setColor(col);
+ cla.setConstantAttenuation(constatt);
+ cla.setLinearAttenuation(linatt);
+ cla.setQuadraticAttenuation(quadatt);
+ addLight(cla);
+ }
+ // area lamp is not supported
+ // it will be exported as a local lamp
+ else {
+ COLLADASW::PointLight cla(mSW, la_id, la_name, e);
+ cla.setColor(col);
+ cla.setConstantAttenuation(constatt);
+ cla.setLinearAttenuation(linatt);
+ cla.setQuadraticAttenuation(quadatt);
+ addLight(cla);
+ }
+}
diff --git a/source/gameengine/GamePlayer/common/windows/GPW_Engine.h b/source/blender/collada/LightExporter.h
index 8d237073fb0..4ac828a06cc 100644
--- a/source/gameengine/GamePlayer/common/windows/GPW_Engine.h
+++ b/source/blender/collada/LightExporter.h
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id: LightExporter.h 32355 2010-10-06 20:40:16Z gsrb3d $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -17,29 +17,27 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef __GPW_ENGINE_H
-#define __GPW_ENGINE_H
+#ifndef __LIGHTEXPORTER_H__
+#define __LIGHTEXPORTER_H__
-#include "GPC_Engine.h"
+#include "COLLADASWStreamWriter.h"
+#include "COLLADASWLibraryLights.h"
-class GPW_Engine : public GPC_Engine
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+class LightsExporter: COLLADASW::LibraryLights
{
public:
- GPW_Engine(char *customLoadingAnimation,
- int foregroundColor, int backgroundColor, int frameRate);
- virtual ~GPW_Engine();
- bool Initialize(HDC hdc, int width, int height);
+ LightsExporter(COLLADASW::StreamWriter *sw);
+ void exportLights(Scene *sce);
+ void operator()(Object *ob);
};
-#endif // __GPW_ENGINE_H
-
+#endif
diff --git a/source/blender/collada/Makefile b/source/blender/collada/Makefile
deleted file mode 100644
index d4cc18d22b6..00000000000
--- a/source/blender/collada/Makefile
+++ /dev/null
@@ -1,42 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2008 Blender Foundation.
-# All rights reserved.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = bf_collada
-DIR = $(OCGDIR)/blender/bf_collada
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I../makesdna -I../blenlib -I../blenkernel -I../editors/include
-CPPFLAGS += -I../windowmanager -I../makesrna
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(BF_OPENCOLLADA)/include/COLLADABaseUtils
-CPPFLAGS += -I$(BF_OPENCOLLADA)/include/COLLADAFramework
-CPPFLAGS += -I$(BF_OPENCOLLADA)/include/COLLADAStreamWriter
-CPPFLAGS += -I$(BF_OPENCOLLADA)/include/COLLADASaxFrameworkLoader
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_Canvas.cpp b/source/blender/collada/MaterialExporter.cpp
index bb7b55fbcf1..b2e26e35785 100644
--- a/source/gameengine/GamePlayer/common/unix/GPU_Canvas.cpp
+++ b/source/blender/collada/MaterialExporter.cpp
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id: MaterialExporter.cpp 32679 2010-10-24 07:55:56Z damien78 $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -17,52 +17,37 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
*
* ***** END GPL LICENSE BLOCK *****
*/
-
-//#include <iostream>
-#include "GPU_Canvas.h"
-GPU_Canvas::GPU_Canvas(KXH_plugin_handle p, int width, int height)
- : GPC_Canvas(width, height), m_plugin(p)
-{
- /* intentionally empty */
-}
+#include "MaterialExporter.h"
+#include "COLLADABUUtils.h"
+#include "collada_internal.h"
-GPU_Canvas::~GPU_Canvas(void)
-{
- /* intentionally empty */
-}
+MaterialsExporter::MaterialsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryMaterials(sw){}
-void GPU_Canvas::Init(void)
+void MaterialsExporter::exportMaterials(Scene *sce)
{
- /* intentionally empty */
-}
+ openLibrary();
-void GPU_Canvas::SwapBuffers(void)
-{
- if (m_plugin) KXH_swap_buffers(m_plugin);
-}
+ MaterialFunctor mf;
+ mf.forEachMaterialInScene<MaterialsExporter>(sce, *this);
-bool
-GPU_Canvas::BeginDraw(void)
-{
- if (m_plugin) {
- return KXH_begin_draw(m_plugin);
- } else {
- return false;
- }
+ closeLibrary();
}
-void GPU_Canvas::EndDraw(void)
+void MaterialsExporter::operator()(Material *ma, Object *ob)
{
- if (m_plugin) KXH_end_draw(m_plugin);
+ std::string name(id_name(ma));
+
+ openMaterial(translate_id(name), name);
+
+ std::string efid = translate_id(name) + "-effect";
+ addInstanceEffect(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, efid));
+
+ closeMaterial();
}
diff --git a/source/blender/collada/MaterialExporter.h b/source/blender/collada/MaterialExporter.h
new file mode 100644
index 00000000000..18ba7ebbb37
--- /dev/null
+++ b/source/blender/collada/MaterialExporter.h
@@ -0,0 +1,94 @@
+/**
+ * $Id: MaterialExporter.h 32355 2010-10-06 20:40:16Z gsrb3d $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __MATERIALEXPORTER_H__
+#define __MATERIALEXPORTER_H__
+
+#include <string>
+#include <vector>
+
+#include "COLLADASWLibraryMaterials.h"
+#include "COLLADASWStreamWriter.h"
+
+#include "BKE_material.h"
+
+#include "DNA_material_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "GeometryExporter.h"
+#include "collada_internal.h"
+
+class MaterialsExporter: COLLADASW::LibraryMaterials
+{
+public:
+ MaterialsExporter(COLLADASW::StreamWriter *sw);
+ void exportMaterials(Scene *sce);
+ void operator()(Material *ma, Object *ob);
+};
+
+// used in forEachMaterialInScene
+template <class Functor>
+class ForEachMaterialFunctor
+{
+ std::vector<std::string> mMat; // contains list of material names, to avoid duplicate calling of f
+ Functor *f;
+public:
+ ForEachMaterialFunctor(Functor*f) : f(f) {}
+
+ void operator ()(Object *ob)
+ {
+ int a;
+ for(a = 0; a < ob->totcol; a++) {
+
+ Material *ma = give_current_material(ob, a+1);
+
+ if (!ma) continue;
+
+ std::string translated_id = translate_id(id_name(ma));
+ if (find(mMat.begin(), mMat.end(), translated_id) == mMat.end()) {
+ (*this->f)(ma, ob);
+
+ mMat.push_back(translated_id);
+ }
+ }
+ }
+};
+
+struct MaterialFunctor {
+ // calls f for each unique material linked to each object in sce
+ // f should have
+ // void operator()(Material* ma)
+ template<class Functor>
+ void forEachMaterialInScene(Scene *sce, Functor &f)
+ {
+ ForEachMaterialFunctor<Functor> matfunc(&f);
+ GeometryFunctor gf;
+ gf.forEachMeshObjectInScene<ForEachMaterialFunctor<Functor> >(sce, matfunc);
+ }
+};
+
+
+#endif
diff --git a/source/blender/collada/MeshImporter.cpp b/source/blender/collada/MeshImporter.cpp
new file mode 100644
index 00000000000..d29a5b6cbdf
--- /dev/null
+++ b/source/blender/collada/MeshImporter.cpp
@@ -0,0 +1,915 @@
+/**
+ * $Id: MeshImporter.cpp 34787 2011-02-12 06:25:04Z campbellbarton $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <algorithm>
+
+#if !defined(WIN32) || defined(FREE_WINDOWS)
+#include <iostream>
+#endif
+
+/* COLLADABU_ASSERT, may be able to remove later */
+#include "COLLADABUPlatform.h"
+
+#include "COLLADAFWMeshPrimitive.h"
+#include "COLLADAFWMeshVertexData.h"
+#include "COLLADAFWPolygons.h"
+
+extern "C" {
+#include "BKE_blender.h"
+#include "BKE_customdata.h"
+#include "BKE_displist.h"
+#include "BKE_global.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BKE_material.h"
+#include "BKE_mesh.h"
+#include "BKE_object.h"
+
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+#include "BLI_string.h"
+
+#include "MEM_guardedalloc.h"
+}
+
+#include "ArmatureImporter.h"
+#include "MeshImporter.h"
+#include "collada_utils.h"
+
+// works for COLLADAFW::Node, COLLADAFW::Geometry
+template<class T>
+static const char *bc_get_dae_name(T *node)
+{
+ const std::string& name = node->getName();
+ return name.size() ? name.c_str() : node->getOriginalId().c_str();
+}
+
+static const char *bc_primTypeToStr(COLLADAFW::MeshPrimitive::PrimitiveType type)
+{
+ switch (type) {
+ case COLLADAFW::MeshPrimitive::LINES:
+ return "LINES";
+ case COLLADAFW::MeshPrimitive::LINE_STRIPS:
+ return "LINESTRIPS";
+ case COLLADAFW::MeshPrimitive::POLYGONS:
+ return "POLYGONS";
+ case COLLADAFW::MeshPrimitive::POLYLIST:
+ return "POLYLIST";
+ case COLLADAFW::MeshPrimitive::TRIANGLES:
+ return "TRIANGLES";
+ case COLLADAFW::MeshPrimitive::TRIANGLE_FANS:
+ return "TRIANGLE_FANS";
+ case COLLADAFW::MeshPrimitive::TRIANGLE_STRIPS:
+ return "TRIANGLE_FANS";
+ case COLLADAFW::MeshPrimitive::POINTS:
+ return "POINTS";
+ case COLLADAFW::MeshPrimitive::UNDEFINED_PRIMITIVE_TYPE:
+ return "UNDEFINED_PRIMITIVE_TYPE";
+ }
+ return "UNKNOWN";
+}
+
+static const char *bc_geomTypeToStr(COLLADAFW::Geometry::GeometryType type)
+{
+ switch (type) {
+ case COLLADAFW::Geometry::GEO_TYPE_MESH:
+ return "MESH";
+ case COLLADAFW::Geometry::GEO_TYPE_SPLINE:
+ return "SPLINE";
+ case COLLADAFW::Geometry::GEO_TYPE_CONVEX_MESH:
+ return "CONVEX_MESH";
+ case COLLADAFW::Geometry::GEO_TYPE_UNKNOWN:
+ default:
+ return "UNKNOWN";
+ }
+}
+
+
+UVDataWrapper::UVDataWrapper(COLLADAFW::MeshVertexData& vdata) : mVData(&vdata)
+{}
+
+#ifdef COLLADA_DEBUG
+void WVDataWrapper::print()
+{
+ fprintf(stderr, "UVs:\n");
+ switch(mVData->getType()) {
+ case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
+ {
+ COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues();
+ if (values->getCount()) {
+ for (int i = 0; i < values->getCount(); i += 2) {
+ fprintf(stderr, "%.1f, %.1f\n", (*values)[i], (*values)[i+1]);
+ }
+ }
+ }
+ break;
+ case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
+ {
+ COLLADAFW::ArrayPrimitiveType<double>* values = mVData->getDoubleValues();
+ if (values->getCount()) {
+ for (int i = 0; i < values->getCount(); i += 2) {
+ fprintf(stderr, "%.1f, %.1f\n", (float)(*values)[i], (float)(*values)[i+1]);
+ }
+ }
+ }
+ break;
+ }
+ fprintf(stderr, "\n");
+}
+#endif
+
+void UVDataWrapper::getUV(int uv_index[2], float *uv)
+{
+ switch(mVData->getType()) {
+ case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
+ {
+ COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues();
+ if (values->empty()) return;
+ uv[0] = (*values)[uv_index[0]];
+ uv[1] = (*values)[uv_index[1]];
+
+ }
+ break;
+ case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
+ {
+ COLLADAFW::ArrayPrimitiveType<double>* values = mVData->getDoubleValues();
+ if (values->empty()) return;
+ uv[0] = (float)(*values)[uv_index[0]];
+ uv[1] = (float)(*values)[uv_index[1]];
+
+ }
+ break;
+ case COLLADAFW::MeshVertexData::DATA_TYPE_UNKNOWN:
+ default:
+ fprintf(stderr, "MeshImporter.getUV(): unknown data type\n");
+ }
+}
+
+void MeshImporter::set_face_indices(MFace *mface, unsigned int *indices, bool quad)
+{
+ mface->v1 = indices[0];
+ mface->v2 = indices[1];
+ mface->v3 = indices[2];
+ if (quad) mface->v4 = indices[3];
+ else mface->v4 = 0;
+#ifdef COLLADA_DEBUG
+ // fprintf(stderr, "%u, %u, %u \n", indices[0], indices[1], indices[2]);
+#endif
+}
+
+// not used anymore, test_index_face from blenkernel is better
+#if 0
+// change face indices order so that v4 is not 0
+void MeshImporter::rotate_face_indices(MFace *mface) {
+ mface->v4 = mface->v1;
+ mface->v1 = mface->v2;
+ mface->v2 = mface->v3;
+ mface->v3 = 0;
+}
+#endif
+
+void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
+ COLLADAFW::IndexList& index_list, unsigned int *tris_indices)
+{
+ int uv_indices[4][2];
+
+ // per face vertex indices, this means for quad we have 4 indices, not 8
+ COLLADAFW::UIntValuesArray& indices = index_list.getIndices();
+
+ // make indices into FloatOrDoubleArray
+ for (int i = 0; i < 3; i++) {
+ int uv_index = indices[tris_indices[i]];
+ uv_indices[i][0] = uv_index * 2;
+ uv_indices[i][1] = uv_index * 2 + 1;
+ }
+
+ uvs.getUV(uv_indices[0], mtface->uv[0]);
+ uvs.getUV(uv_indices[1], mtface->uv[1]);
+ uvs.getUV(uv_indices[2], mtface->uv[2]);
+}
+
+void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
+ COLLADAFW::IndexList& index_list, int index, bool quad)
+{
+ int uv_indices[4][2];
+
+ // per face vertex indices, this means for quad we have 4 indices, not 8
+ COLLADAFW::UIntValuesArray& indices = index_list.getIndices();
+
+ // make indices into FloatOrDoubleArray
+ for (int i = 0; i < (quad ? 4 : 3); i++) {
+ int uv_index = indices[index + i];
+ uv_indices[i][0] = uv_index * 2;
+ uv_indices[i][1] = uv_index * 2 + 1;
+ }
+
+ uvs.getUV(uv_indices[0], mtface->uv[0]);
+ uvs.getUV(uv_indices[1], mtface->uv[1]);
+ uvs.getUV(uv_indices[2], mtface->uv[2]);
+
+ if (quad) uvs.getUV(uv_indices[3], mtface->uv[3]);
+
+#ifdef COLLADA_DEBUG
+ /*if (quad) {
+ fprintf(stderr, "face uv:\n"
+ "((%d, %d), (%d, %d), (%d, %d), (%d, %d))\n"
+ "((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n",
+
+ uv_indices[0][0], uv_indices[0][1],
+ uv_indices[1][0], uv_indices[1][1],
+ uv_indices[2][0], uv_indices[2][1],
+ uv_indices[3][0], uv_indices[3][1],
+
+ mtface->uv[0][0], mtface->uv[0][1],
+ mtface->uv[1][0], mtface->uv[1][1],
+ mtface->uv[2][0], mtface->uv[2][1],
+ mtface->uv[3][0], mtface->uv[3][1]);
+ }
+ else {
+ fprintf(stderr, "face uv:\n"
+ "((%d, %d), (%d, %d), (%d, %d))\n"
+ "((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n",
+
+ uv_indices[0][0], uv_indices[0][1],
+ uv_indices[1][0], uv_indices[1][1],
+ uv_indices[2][0], uv_indices[2][1],
+
+ mtface->uv[0][0], mtface->uv[0][1],
+ mtface->uv[1][0], mtface->uv[1][1],
+ mtface->uv[2][0], mtface->uv[2][1]);
+ }*/
+#endif
+}
+
+#ifdef COLLADA_DEBUG
+void MeshImporter::print_index_list(COLLADAFW::IndexList& index_list)
+{
+ fprintf(stderr, "Index list for \"%s\":\n", index_list.getName().c_str());
+ for (int i = 0; i < index_list.getIndicesCount(); i += 2) {
+ fprintf(stderr, "%u, %u\n", index_list.getIndex(i), index_list.getIndex(i + 1));
+ }
+ fprintf(stderr, "\n");
+}
+#endif
+
+bool MeshImporter::is_nice_mesh(COLLADAFW::Mesh *mesh)
+{
+ COLLADAFW::MeshPrimitiveArray& prim_arr = mesh->getMeshPrimitives();
+
+ const char *name = bc_get_dae_name(mesh);
+
+ for (unsigned i = 0; i < prim_arr.getCount(); i++) {
+
+ COLLADAFW::MeshPrimitive *mp = prim_arr[i];
+ COLLADAFW::MeshPrimitive::PrimitiveType type = mp->getPrimitiveType();
+
+ const char *type_str = bc_primTypeToStr(type);
+
+ // OpenCollada passes POLYGONS type for <polylist>
+ if (type == COLLADAFW::MeshPrimitive::POLYLIST || type == COLLADAFW::MeshPrimitive::POLYGONS) {
+
+ COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons*)mp;
+ COLLADAFW::Polygons::VertexCountArray& vca = mpvc->getGroupedVerticesVertexCountArray();
+
+ for(unsigned int j = 0; j < vca.getCount(); j++){
+ int count = vca[j];
+ if (count < 3) {
+ fprintf(stderr, "Primitive %s in %s has at least one face with vertex count < 3\n",
+ type_str, name);
+ return false;
+ }
+ }
+
+ }
+ else if(type != COLLADAFW::MeshPrimitive::TRIANGLES) {
+ fprintf(stderr, "Primitive type %s is not supported.\n", type_str);
+ return false;
+ }
+ }
+
+ if (mesh->getPositions().empty()) {
+ fprintf(stderr, "Mesh %s has no vertices.\n", name);
+ return false;
+ }
+
+ return true;
+}
+
+void MeshImporter::read_vertices(COLLADAFW::Mesh *mesh, Mesh *me)
+{
+ // vertices
+ COLLADAFW::MeshVertexData& pos = mesh->getPositions();
+ int stride = pos.getStride(0);
+ if(stride==0) stride = 3;
+
+ me->totvert = mesh->getPositions().getFloatValues()->getCount() / stride;
+ me->mvert = (MVert*)CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, me->totvert);
+
+ MVert *mvert;
+ int i;
+
+ for (i = 0, mvert = me->mvert; i < me->totvert; i++, mvert++) {
+ get_vector(mvert->co, pos, i, stride);
+ }
+}
+
+int MeshImporter::triangulate_poly(unsigned int *indices, int totvert, MVert *verts, std::vector<unsigned int>& tri)
+{
+ ListBase dispbase;
+ DispList *dl;
+ float *vert;
+ int i = 0;
+
+ dispbase.first = dispbase.last = NULL;
+
+ dl = (DispList*)MEM_callocN(sizeof(DispList), "poly disp");
+ dl->nr = totvert;
+ dl->type = DL_POLY;
+ dl->parts = 1;
+ dl->verts = vert = (float*)MEM_callocN(totvert * 3 * sizeof(float), "poly verts");
+ dl->index = (int*)MEM_callocN(sizeof(int) * 3 * totvert, "dl index");
+
+ BLI_addtail(&dispbase, dl);
+
+ for (i = 0; i < totvert; i++) {
+ copy_v3_v3(vert, verts[indices[i]].co);
+ vert += 3;
+ }
+
+ filldisplist(&dispbase, &dispbase, 0);
+
+ int tottri = 0;
+ dl= (DispList*)dispbase.first;
+
+ if (dl->type == DL_INDEX3) {
+ tottri = dl->parts;
+
+ int *index = dl->index;
+ for (i= 0; i < tottri; i++) {
+ int t[3]= {*index, *(index + 1), *(index + 2)};
+
+ std::sort(t, t + 3);
+
+ tri.push_back(t[0]);
+ tri.push_back(t[1]);
+ tri.push_back(t[2]);
+
+ index += 3;
+ }
+ }
+
+ freedisplist(&dispbase);
+
+ return tottri;
+}
+
+int MeshImporter::count_new_tris(COLLADAFW::Mesh *mesh, Mesh *me)
+{
+ COLLADAFW::MeshPrimitiveArray& prim_arr = mesh->getMeshPrimitives();
+ unsigned int i;
+ int tottri = 0;
+
+ for (i = 0; i < prim_arr.getCount(); i++) {
+
+ COLLADAFW::MeshPrimitive *mp = prim_arr[i];
+ int type = mp->getPrimitiveType();
+ size_t prim_totface = mp->getFaceCount();
+ unsigned int *indices = mp->getPositionIndices().getData();
+
+ if (type == COLLADAFW::MeshPrimitive::POLYLIST ||
+ type == COLLADAFW::MeshPrimitive::POLYGONS) {
+
+ COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons*)mp;
+ COLLADAFW::Polygons::VertexCountArray& vcounta = mpvc->getGroupedVerticesVertexCountArray();
+
+ for (unsigned int j = 0; j < prim_totface; j++) {
+ int vcount = vcounta[j];
+
+ if (vcount > 4) {
+ std::vector<unsigned int> tri;
+
+ // tottri += triangulate_poly(indices, vcount, me->mvert, tri) - 1; // XXX why - 1?!
+ tottri += triangulate_poly(indices, vcount, me->mvert, tri);
+ }
+
+ indices += vcount;
+ }
+ }
+ }
+ return tottri;
+}
+
+// TODO: import uv set names
+void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris)
+{
+ unsigned int i;
+
+ // allocate faces
+ me->totface = mesh->getFacesCount() + new_tris;
+ me->mface = (MFace*)CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, me->totface);
+
+ // allocate UV layers
+ unsigned int totuvset = mesh->getUVCoords().getInputInfosArray().getCount();
+
+ for (i = 0; i < totuvset; i++) {
+ if (mesh->getUVCoords().getLength(i) == 0) {
+ totuvset = 0;
+ break;
+ }
+ }
+
+ for (i = 0; i < totuvset; i++) {
+ COLLADAFW::MeshVertexData::InputInfos *info = mesh->getUVCoords().getInputInfosArray()[i];
+ CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_CALLOC, NULL, me->totface, info->mName.c_str());
+ //this->set_layername_map[i] = CustomData_get_layer_name(&me->fdata, CD_MTFACE, i);
+ }
+
+ // activate the first uv layer
+ if (totuvset) me->mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, 0);
+
+ UVDataWrapper uvs(mesh->getUVCoords());
+
+#ifdef COLLADA_DEBUG
+ // uvs.print();
+#endif
+
+ MFace *mface = me->mface;
+
+ MaterialIdPrimitiveArrayMap mat_prim_map;
+
+ int face_index = 0;
+
+ COLLADAFW::MeshPrimitiveArray& prim_arr = mesh->getMeshPrimitives();
+
+ bool has_normals = mesh->hasNormals();
+ COLLADAFW::MeshVertexData& nor = mesh->getNormals();
+
+ for (i = 0; i < prim_arr.getCount(); i++) {
+
+ COLLADAFW::MeshPrimitive *mp = prim_arr[i];
+
+ // faces
+ size_t prim_totface = mp->getFaceCount();
+ unsigned int *indices = mp->getPositionIndices().getData();
+ unsigned int *nind = mp->getNormalIndices().getData();
+ unsigned int j, k;
+ int type = mp->getPrimitiveType();
+ int index = 0;
+
+ // since we cannot set mface->mat_nr here, we store a portion of me->mface in Primitive
+ Primitive prim = {mface, 0};
+ COLLADAFW::IndexListArray& index_list_array = mp->getUVCoordIndicesArray();
+
+#ifdef COLLADA_DEBUG
+ /*
+ fprintf(stderr, "Primitive %d:\n", i);
+ for (int j = 0; j < totuvset; j++) {
+ print_index_list(*index_list_array[j]);
+ }
+ */
+#endif
+
+ if (type == COLLADAFW::MeshPrimitive::TRIANGLES) {
+ for (j = 0; j < prim_totface; j++){
+
+ set_face_indices(mface, indices, false);
+ indices += 3;
+
+#if 0
+ for (k = 0; k < totuvset; k++) {
+ if (!index_list_array.empty() && index_list_array[k]) {
+ // get mtface by face index and uv set index
+ MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k);
+ set_face_uv(&mtface[face_index], uvs, k, *index_list_array[k], index, false);
+ }
+ }
+#else
+ for (k = 0; k < index_list_array.getCount(); k++) {
+ // get mtface by face index and uv set index
+ MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k);
+ set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, false);
+ }
+#endif
+
+ test_index_face(mface, &me->fdata, face_index, 3);
+
+ if (has_normals) {
+ if (!flat_face(nind, nor, 3))
+ mface->flag |= ME_SMOOTH;
+
+ nind += 3;
+ }
+
+ index += 3;
+ mface++;
+ face_index++;
+ prim.totface++;
+ }
+ }
+ else if (type == COLLADAFW::MeshPrimitive::POLYLIST || type == COLLADAFW::MeshPrimitive::POLYGONS) {
+ COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons*)mp;
+ COLLADAFW::Polygons::VertexCountArray& vcounta = mpvc->getGroupedVerticesVertexCountArray();
+
+ for (j = 0; j < prim_totface; j++) {
+
+ // face
+ int vcount = vcounta[j];
+ if (vcount == 3 || vcount == 4) {
+
+ set_face_indices(mface, indices, vcount == 4);
+
+ // set mtface for each uv set
+ // it is assumed that all primitives have equal number of UV sets
+
+#if 0
+ for (k = 0; k < totuvset; k++) {
+ if (!index_list_array.empty() && index_list_array[k]) {
+ // get mtface by face index and uv set index
+ MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k);
+ set_face_uv(&mtface[face_index], uvs, k, *index_list_array[k], index, mface->v4 != 0);
+ }
+ }
+#else
+ for (k = 0; k < index_list_array.getCount(); k++) {
+ // get mtface by face index and uv set index
+ MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k);
+ set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, mface->v4 != 0);
+ }
+#endif
+
+ test_index_face(mface, &me->fdata, face_index, vcount);
+
+ if (has_normals) {
+ if (!flat_face(nind, nor, vcount))
+ mface->flag |= ME_SMOOTH;
+
+ nind += vcount;
+ }
+
+ mface++;
+ face_index++;
+ prim.totface++;
+
+ }
+ else {
+ std::vector<unsigned int> tri;
+
+ triangulate_poly(indices, vcount, me->mvert, tri);
+
+ for (k = 0; k < tri.size() / 3; k++) {
+ int v = k * 3;
+ unsigned int uv_indices[3] = {
+ index + tri[v],
+ index + tri[v + 1],
+ index + tri[v + 2]
+ };
+ unsigned int tri_indices[3] = {
+ indices[tri[v]],
+ indices[tri[v + 1]],
+ indices[tri[v + 2]]
+ };
+
+ set_face_indices(mface, tri_indices, false);
+
+#if 0
+ for (unsigned int l = 0; l < totuvset; l++) {
+ if (!index_list_array.empty() && index_list_array[l]) {
+ // get mtface by face index and uv set index
+ MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, l);
+ set_face_uv(&mtface[face_index], uvs, l, *index_list_array[l], uv_indices);
+ }
+ }
+#else
+ for (unsigned int l = 0; l < index_list_array.getCount(); l++) {
+ int uvset_index = index_list_array[l]->getSetIndex();
+
+ // get mtface by face index and uv set index
+ MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, uvset_index);
+ set_face_uv(&mtface[face_index], uvs, *index_list_array[l], uv_indices);
+ }
+#endif
+
+
+ test_index_face(mface, &me->fdata, face_index, 3);
+
+ if (has_normals) {
+ unsigned int ntri[3] = {nind[tri[v]], nind[tri[v + 1]], nind[tri[v + 2]]};
+
+ if (!flat_face(ntri, nor, 3))
+ mface->flag |= ME_SMOOTH;
+ }
+
+ mface++;
+ face_index++;
+ prim.totface++;
+ }
+
+ if (has_normals)
+ nind += vcount;
+ }
+
+ index += vcount;
+ indices += vcount;
+ }
+ }
+
+ mat_prim_map[mp->getMaterialId()].push_back(prim);
+ }
+
+ geom_uid_mat_mapping_map[mesh->getUniqueId()] = mat_prim_map;
+}
+
+void MeshImporter::get_vector(float v[3], COLLADAFW::MeshVertexData& arr, int i, int stride)
+{
+ i *= stride;
+
+ switch(arr.getType()) {
+ case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
+ {
+ COLLADAFW::ArrayPrimitiveType<float>* values = arr.getFloatValues();
+ if (values->empty()) return;
+
+ v[0] = (*values)[i++];
+ v[1] = (*values)[i++];
+ v[2] = (*values)[i];
+
+ }
+ break;
+ case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
+ {
+ COLLADAFW::ArrayPrimitiveType<double>* values = arr.getDoubleValues();
+ if (values->empty()) return;
+
+ v[0] = (float)(*values)[i++];
+ v[1] = (float)(*values)[i++];
+ v[2] = (float)(*values)[i];
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+bool MeshImporter::flat_face(unsigned int *nind, COLLADAFW::MeshVertexData& nor, int count)
+{
+ float a[3], b[3];
+
+ get_vector(a, nor, *nind, 3);
+ normalize_v3(a);
+
+ nind++;
+
+ for (int i = 1; i < count; i++, nind++) {
+ get_vector(b, nor, *nind, 3);
+ normalize_v3(b);
+
+ float dp = dot_v3v3(a, b);
+
+ if (dp < 0.99999f || dp > 1.00001f)
+ return false;
+ }
+
+ return true;
+}
+
+MeshImporter::MeshImporter(UnitConverter *unitconv, ArmatureImporter *arm, Scene *sce) : unitconverter(unitconv), scene(sce), armature_importer(arm) {}
+
+Object *MeshImporter::get_object_by_geom_uid(const COLLADAFW::UniqueId& geom_uid)
+{
+ if (uid_object_map.find(geom_uid) != uid_object_map.end())
+ return uid_object_map[geom_uid];
+ return NULL;
+}
+
+MTex *MeshImporter::assign_textures_to_uvlayer(COLLADAFW::TextureCoordinateBinding &ctexture,
+ Mesh *me, TexIndexTextureArrayMap& texindex_texarray_map,
+ MTex *color_texture)
+{
+ const COLLADAFW::TextureMapId texture_index = ctexture.getTextureMapId();
+ const size_t setindex = ctexture.getSetIndex();
+ std::string uvname = ctexture.getSemantic();
+
+ const CustomData *data = &me->fdata;
+ int layer_index = CustomData_get_layer_index(data, CD_MTFACE);
+ CustomDataLayer *cdl = &data->layers[layer_index+setindex];
+
+ /* set uvname to bind_vertex_input semantic */
+ BLI_strncpy(cdl->name, uvname.c_str(), sizeof(cdl->name));
+
+ if (texindex_texarray_map.find(texture_index) == texindex_texarray_map.end()) {
+
+ fprintf(stderr, "Cannot find texture array by texture index.\n");
+ return color_texture;
+ }
+
+ std::vector<MTex*> textures = texindex_texarray_map[texture_index];
+
+ std::vector<MTex*>::iterator it;
+
+ for (it = textures.begin(); it != textures.end(); it++) {
+
+ MTex *texture = *it;
+
+ if (texture) {
+ BLI_strncpy(texture->uvname, uvname.c_str(), sizeof(texture->uvname));
+ if (texture->mapto == MAP_COL) color_texture = texture;
+ }
+ }
+ return color_texture;
+}
+
+MTFace *MeshImporter::assign_material_to_geom(COLLADAFW::MaterialBinding cmaterial,
+ std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
+ Object *ob, const COLLADAFW::UniqueId *geom_uid,
+ MTex **color_texture, char *layername, MTFace *texture_face,
+ std::map<Material*, TexIndexTextureArrayMap>& material_texture_mapping_map, int mat_index)
+{
+ Mesh *me = (Mesh*)ob->data;
+ const COLLADAFW::UniqueId& ma_uid = cmaterial.getReferencedMaterial();
+
+ // do we know this material?
+ if (uid_material_map.find(ma_uid) == uid_material_map.end()) {
+
+ fprintf(stderr, "Cannot find material by UID.\n");
+ return NULL;
+ }
+
+ Material *ma = uid_material_map[ma_uid];
+ assign_material(ob, ma, ob->totcol + 1);
+
+ COLLADAFW::TextureCoordinateBindingArray& tex_array =
+ cmaterial.getTextureCoordinateBindingArray();
+ TexIndexTextureArrayMap texindex_texarray_map = material_texture_mapping_map[ma];
+ unsigned int i;
+ // loop through <bind_vertex_inputs>
+ for (i = 0; i < tex_array.getCount(); i++) {
+
+ *color_texture = assign_textures_to_uvlayer(tex_array[i], me, texindex_texarray_map,
+ *color_texture);
+ }
+
+ // set texture face
+ if (*color_texture &&
+ strlen((*color_texture)->uvname) &&
+ strcmp(layername, (*color_texture)->uvname) != 0) {
+
+ texture_face = (MTFace*)CustomData_get_layer_named(&me->fdata, CD_MTFACE,
+ (*color_texture)->uvname);
+ strcpy(layername, (*color_texture)->uvname);
+ }
+
+ MaterialIdPrimitiveArrayMap& mat_prim_map = geom_uid_mat_mapping_map[*geom_uid];
+ COLLADAFW::MaterialId mat_id = cmaterial.getMaterialId();
+
+ // assign material indices to mesh faces
+ if (mat_prim_map.find(mat_id) != mat_prim_map.end()) {
+
+ std::vector<Primitive>& prims = mat_prim_map[mat_id];
+
+ std::vector<Primitive>::iterator it;
+
+ for (it = prims.begin(); it != prims.end(); it++) {
+ Primitive& prim = *it;
+ i = 0;
+ while (i++ < prim.totface) {
+ prim.mface->mat_nr = mat_index;
+ prim.mface++;
+ // bind texture images to faces
+ if (texture_face && (*color_texture)) {
+ texture_face->mode = TF_TEX;
+ texture_face->tpage = (Image*)(*color_texture)->tex->ima;
+ texture_face++;
+ }
+ }
+ }
+ }
+
+ return texture_face;
+}
+
+
+Object *MeshImporter::create_mesh_object(COLLADAFW::Node *node, COLLADAFW::InstanceGeometry *geom,
+ bool isController,
+ std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
+ std::map<Material*, TexIndexTextureArrayMap>& material_texture_mapping_map)
+{
+ const COLLADAFW::UniqueId *geom_uid = &geom->getInstanciatedObjectId();
+
+ // check if node instanciates controller or geometry
+ if (isController) {
+
+ geom_uid = armature_importer->get_geometry_uid(*geom_uid);
+
+ if (!geom_uid) {
+ fprintf(stderr, "Couldn't find a mesh UID by controller's UID.\n");
+ return NULL;
+ }
+ }
+ else {
+
+ if (uid_mesh_map.find(*geom_uid) == uid_mesh_map.end()) {
+ // this could happen if a mesh was not created
+ // (e.g. if it contains unsupported geometry)
+ fprintf(stderr, "Couldn't find a mesh by UID.\n");
+ return NULL;
+ }
+ }
+ if (!uid_mesh_map[*geom_uid]) return NULL;
+
+ Object *ob = add_object(scene, OB_MESH);
+
+ // store object pointer for ArmatureImporter
+ uid_object_map[*geom_uid] = ob;
+
+ // name Object
+ const std::string& id = node->getOriginalId();
+ if (id.length())
+ rename_id(&ob->id, (char*)id.c_str());
+
+ // replace ob->data freeing the old one
+ Mesh *old_mesh = (Mesh*)ob->data;
+
+ set_mesh(ob, uid_mesh_map[*geom_uid]);
+
+ if (old_mesh->id.us == 0) free_libblock(&G.main->mesh, old_mesh);
+
+ char layername[100];
+ MTFace *texture_face = NULL;
+ MTex *color_texture = NULL;
+
+ COLLADAFW::MaterialBindingArray& mat_array =
+ geom->getMaterialBindings();
+
+ // loop through geom's materials
+ for (unsigned int i = 0; i < mat_array.getCount(); i++) {
+
+ texture_face = assign_material_to_geom(mat_array[i], uid_material_map, ob, geom_uid,
+ &color_texture, layername, texture_face,
+ material_texture_mapping_map, i);
+ }
+
+ return ob;
+}
+
+// create a mesh storing a pointer in a map so it can be retrieved later by geometry UID
+bool MeshImporter::write_geometry(const COLLADAFW::Geometry* geom)
+{
+ // TODO: import also uvs, normals
+ // XXX what to do with normal indices?
+ // XXX num_normals may be != num verts, then what to do?
+
+ // check geometry->getType() first
+ if (geom->getType() != COLLADAFW::Geometry::GEO_TYPE_MESH) {
+ // TODO: report warning
+ fprintf(stderr, "Mesh type %s is not supported\n", bc_geomTypeToStr(geom->getType()));
+ return true;
+ }
+
+ COLLADAFW::Mesh *mesh = (COLLADAFW::Mesh*)geom;
+
+ if (!is_nice_mesh(mesh)) {
+ fprintf(stderr, "Ignoring mesh %s\n", bc_get_dae_name(mesh));
+ return true;
+ }
+
+ const std::string& str_geom_id = mesh->getOriginalId();
+ Mesh *me = add_mesh((char*)str_geom_id.c_str());
+
+ // store the Mesh pointer to link it later with an Object
+ this->uid_mesh_map[mesh->getUniqueId()] = me;
+
+ int new_tris = 0;
+
+ read_vertices(mesh, me);
+
+ new_tris = count_new_tris(mesh, me);
+
+ read_faces(mesh, me, new_tris);
+
+ make_edges(me, 0);
+
+ mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+
+ return true;
+}
diff --git a/source/blender/collada/MeshImporter.h b/source/blender/collada/MeshImporter.h
new file mode 100644
index 00000000000..3d58ce69742
--- /dev/null
+++ b/source/blender/collada/MeshImporter.h
@@ -0,0 +1,152 @@
+/**
+ * $Id: MeshImporter.h 34533 2011-01-27 19:39:06Z jesterking $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __BC__MESHIMPORTER_H__
+#define __BC__MESHIMPORTER_H__
+
+#include <map>
+#include <vector>
+
+#include "COLLADAFWIndexList.h"
+#include "COLLADAFWInstanceGeometry.h"
+#include "COLLADAFWMaterialBinding.h"
+#include "COLLADAFWMesh.h"
+#include "COLLADAFWMeshVertexData.h"
+#include "COLLADAFWNode.h"
+#include "COLLADAFWTextureCoordinateBinding.h"
+#include "COLLADAFWTypes.h"
+#include "COLLADAFWUniqueId.h"
+
+#include "DNA_material_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_texture_types.h"
+
+#include "ArmatureImporter.h"
+#include "collada_utils.h"
+
+// only for ArmatureImporter to "see" MeshImporter::get_object_by_geom_uid
+class MeshImporterBase
+{
+public:
+ virtual Object *get_object_by_geom_uid(const COLLADAFW::UniqueId& geom_uid) = 0;
+};
+
+class UVDataWrapper
+{
+ COLLADAFW::MeshVertexData *mVData;
+public:
+ UVDataWrapper(COLLADAFW::MeshVertexData& vdata);
+
+#ifdef COLLADA_DEBUG
+ void print();
+#endif
+
+ void getUV(int uv_index[2], float *uv);
+};
+
+class MeshImporter : public MeshImporterBase
+{
+private:
+
+ UnitConverter *unitconverter;
+
+ Scene *scene;
+ ArmatureImporter *armature_importer;
+
+ std::map<COLLADAFW::UniqueId, Mesh*> uid_mesh_map; // geometry unique id-to-mesh map
+ std::map<COLLADAFW::UniqueId, Object*> uid_object_map; // geom uid-to-object
+ // this structure is used to assign material indices to faces
+ // it holds a portion of Mesh faces and corresponds to a DAE primitive list (<triangles>, <polylist>, etc.)
+ struct Primitive {
+ MFace *mface;
+ unsigned int totface;
+ };
+ typedef std::map<COLLADAFW::MaterialId, std::vector<Primitive> > MaterialIdPrimitiveArrayMap;
+ std::map<COLLADAFW::UniqueId, MaterialIdPrimitiveArrayMap> geom_uid_mat_mapping_map; // crazy name!
+
+
+ void set_face_indices(MFace *mface, unsigned int *indices, bool quad);
+
+ // not used anymore, test_index_face from blenkernel is better
+#if 0
+ // change face indices order so that v4 is not 0
+ void rotate_face_indices(MFace *mface);
+#endif
+
+ void set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
+ COLLADAFW::IndexList& index_list, unsigned int *tris_indices);
+
+ void set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
+ COLLADAFW::IndexList& index_list, int index, bool quad);
+
+#ifdef COLLADA_DEBUG
+ void print_index_list(COLLADAFW::IndexList& index_list);
+#endif
+
+ bool is_nice_mesh(COLLADAFW::Mesh *mesh);
+
+ void read_vertices(COLLADAFW::Mesh *mesh, Mesh *me);
+
+ int triangulate_poly(unsigned int *indices, int totvert, MVert *verts, std::vector<unsigned int>& tri);
+
+ int count_new_tris(COLLADAFW::Mesh *mesh, Mesh *me);
+
+ // TODO: import uv set names
+ void read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris);
+
+ void get_vector(float v[3], COLLADAFW::MeshVertexData& arr, int i, int stride);
+
+ bool flat_face(unsigned int *nind, COLLADAFW::MeshVertexData& nor, int count);
+
+public:
+
+ MeshImporter(UnitConverter *unitconv, ArmatureImporter *arm, Scene *sce);
+
+ virtual Object *get_object_by_geom_uid(const COLLADAFW::UniqueId& geom_uid);
+
+ MTex *assign_textures_to_uvlayer(COLLADAFW::TextureCoordinateBinding &ctexture,
+ Mesh *me, TexIndexTextureArrayMap& texindex_texarray_map,
+ MTex *color_texture);
+
+ MTFace *assign_material_to_geom(COLLADAFW::MaterialBinding cmaterial,
+ std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
+ Object *ob, const COLLADAFW::UniqueId *geom_uid,
+ MTex **color_texture, char *layername, MTFace *texture_face,
+ std::map<Material*, TexIndexTextureArrayMap>& material_texture_mapping_map, int mat_index);
+
+
+ Object *create_mesh_object(COLLADAFW::Node *node, COLLADAFW::InstanceGeometry *geom,
+ bool isController,
+ std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
+ std::map<Material*, TexIndexTextureArrayMap>& material_texture_mapping_map);
+
+ // create a mesh storing a pointer in a map so it can be retrieved later by geometry UID
+ bool write_geometry(const COLLADAFW::Geometry* geom);
+
+};
+
+#endif
diff --git a/source/blender/collada/SkinInfo.cpp b/source/blender/collada/SkinInfo.cpp
new file mode 100644
index 00000000000..dcd40475b7b
--- /dev/null
+++ b/source/blender/collada/SkinInfo.cpp
@@ -0,0 +1,331 @@
+/**
+ * $Id: SkinInfo.cpp 34787 2011-02-12 06:25:04Z campbellbarton $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <algorithm>
+
+#if !defined(WIN32) || defined(FREE_WINDOWS)
+#include <stdint.h>
+#endif
+
+/* COLLADABU_ASSERT, may be able to remove later */
+#include "COLLADABUPlatform.h"
+
+#include "BKE_object.h"
+#include "DNA_armature_types.h"
+#include "DNA_modifier_types.h"
+#include "ED_mesh.h"
+#include "ED_object.h"
+#include "BKE_action.h"
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+
+#include "SkinInfo.h"
+#include "collada_utils.h"
+
+// use this for retrieving bone names, since these must be unique
+template<class T>
+static const char *bc_get_joint_name(T *node)
+{
+ const std::string& id = node->getOriginalId();
+ return id.size() ? id.c_str() : node->getName().c_str();
+}
+
+// This is used to store data passed in write_controller_data.
+// Arrays from COLLADAFW::SkinControllerData lose ownership, so do this class members
+// so that arrays don't get freed until we free them explicitly.
+SkinInfo::SkinInfo() {}
+
+SkinInfo::SkinInfo(const SkinInfo& skin) : weights(skin.weights),
+ joint_data(skin.joint_data),
+ unit_converter(skin.unit_converter),
+ ob_arm(skin.ob_arm),
+ controller_uid(skin.controller_uid),
+ parent(skin.parent)
+{
+ copy_m4_m4(bind_shape_matrix, (float (*)[4])skin.bind_shape_matrix);
+
+ transfer_uint_array_data_const(skin.joints_per_vertex, joints_per_vertex);
+ transfer_uint_array_data_const(skin.weight_indices, weight_indices);
+ transfer_int_array_data_const(skin.joint_indices, joint_indices);
+}
+
+SkinInfo::SkinInfo(UnitConverter *conv) : unit_converter(conv), ob_arm(NULL), parent(NULL) {}
+
+// nobody owns the data after this, so it should be freed manually with releaseMemory
+template <class T>
+void SkinInfo::transfer_array_data(T& src, T& dest)
+{
+ dest.setData(src.getData(), src.getCount());
+ src.yieldOwnerShip();
+ dest.yieldOwnerShip();
+}
+
+// when src is const we cannot src.yieldOwnerShip, this is used by copy constructor
+void SkinInfo::transfer_int_array_data_const(const COLLADAFW::IntValuesArray& src, COLLADAFW::IntValuesArray& dest)
+{
+ dest.setData((int*)src.getData(), src.getCount());
+ dest.yieldOwnerShip();
+}
+
+void SkinInfo::transfer_uint_array_data_const(const COLLADAFW::UIntValuesArray& src, COLLADAFW::UIntValuesArray& dest)
+{
+ dest.setData((unsigned int*)src.getData(), src.getCount());
+ dest.yieldOwnerShip();
+}
+
+void SkinInfo::borrow_skin_controller_data(const COLLADAFW::SkinControllerData* skin)
+{
+ transfer_array_data((COLLADAFW::UIntValuesArray&)skin->getJointsPerVertex(), joints_per_vertex);
+ transfer_array_data((COLLADAFW::UIntValuesArray&)skin->getWeightIndices(), weight_indices);
+ transfer_array_data((COLLADAFW::IntValuesArray&)skin->getJointIndices(), joint_indices);
+ // transfer_array_data(skin->getWeights(), weights);
+
+ // cannot transfer data for FloatOrDoubleArray, copy values manually
+ const COLLADAFW::FloatOrDoubleArray& weight = skin->getWeights();
+ for (unsigned int i = 0; i < weight.getValuesCount(); i++)
+ weights.push_back(bc_get_float_value(weight, i));
+
+ unit_converter->dae_matrix_to_mat4_(bind_shape_matrix, skin->getBindShapeMatrix());
+}
+
+void SkinInfo::free()
+{
+ joints_per_vertex.releaseMemory();
+ weight_indices.releaseMemory();
+ joint_indices.releaseMemory();
+ // weights.releaseMemory();
+}
+
+// using inverse bind matrices to construct armature
+// it is safe to invert them to get the original matrices
+// because if they are inverse matrices, they can be inverted
+void SkinInfo::add_joint(const COLLADABU::Math::Matrix4& matrix)
+{
+ JointData jd;
+ unit_converter->dae_matrix_to_mat4_(jd.inv_bind_mat, matrix);
+ joint_data.push_back(jd);
+}
+
+void SkinInfo::set_controller(const COLLADAFW::SkinController* co)
+{
+ controller_uid = co->getUniqueId();
+
+ // fill in joint UIDs
+ const COLLADAFW::UniqueIdArray& joint_uids = co->getJoints();
+ for (unsigned int i = 0; i < joint_uids.getCount(); i++) {
+ joint_data[i].joint_uid = joint_uids[i];
+
+ // // store armature pointer
+ // JointData& jd = joint_index_to_joint_info_map[i];
+ // jd.ob_arm = ob_arm;
+
+ // now we'll be able to get inv bind matrix from joint id
+ // joint_id_to_joint_index_map[joint_ids[i]] = i;
+ }
+}
+
+// called from write_controller
+Object *SkinInfo::create_armature(Scene *scene)
+{
+ ob_arm = add_object(scene, OB_ARMATURE);
+ return ob_arm;
+}
+
+Object* SkinInfo::set_armature(Object *ob_arm)
+{
+ if (this->ob_arm)
+ return this->ob_arm;
+
+ this->ob_arm = ob_arm;
+ return ob_arm;
+}
+
+bool SkinInfo::get_joint_inv_bind_matrix(float inv_bind_mat[][4], COLLADAFW::Node *node)
+{
+ const COLLADAFW::UniqueId& uid = node->getUniqueId();
+ std::vector<JointData>::iterator it;
+ for (it = joint_data.begin(); it != joint_data.end(); it++) {
+ if ((*it).joint_uid == uid) {
+ copy_m4_m4(inv_bind_mat, (*it).inv_bind_mat);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+Object *SkinInfo::get_armature()
+{
+ return ob_arm;
+}
+
+const COLLADAFW::UniqueId& SkinInfo::get_controller_uid()
+{
+ return controller_uid;
+}
+
+// check if this skin controller references a joint or any descendant of it
+//
+// some nodes may not be referenced by SkinController,
+// in this case to determine if the node belongs to this armature,
+// we need to search down the tree
+bool SkinInfo::uses_joint_or_descendant(COLLADAFW::Node *node)
+{
+ const COLLADAFW::UniqueId& uid = node->getUniqueId();
+ std::vector<JointData>::iterator it;
+ for (it = joint_data.begin(); it != joint_data.end(); it++) {
+ if ((*it).joint_uid == uid)
+ return true;
+ }
+
+ COLLADAFW::NodePointerArray& children = node->getChildNodes();
+ for (unsigned int i = 0; i < children.getCount(); i++) {
+ if (uses_joint_or_descendant(children[i]))
+ return true;
+ }
+
+ return false;
+}
+
+void SkinInfo::link_armature(bContext *C, Object *ob, std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& joint_by_uid,
+ TransformReader *tm)
+{
+ Main *bmain = CTX_data_main(C);
+ Scene *scene = CTX_data_scene(C);
+
+ ModifierData *md = ED_object_modifier_add(NULL, bmain, scene, ob, NULL, eModifierType_Armature);
+ ((ArmatureModifierData *)md)->object = ob_arm;
+
+ copy_m4_m4(ob->obmat, bind_shape_matrix);
+ object_apply_mat4(ob, ob->obmat, 0, 0);
+#if 1
+ bc_set_parent(ob, ob_arm, C);
+#else
+ Object workob;
+ ob->parent = ob_arm;
+ ob->partype = PAROBJECT;
+
+ what_does_parent(scene, ob, &workob);
+ invert_m4_m4(ob->parentinv, workob.obmat);
+
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA;
+
+ DAG_scene_sort(bmain, scene);
+ DAG_ids_flush_update(bmain, 0);
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+#endif
+
+ ((bArmature*)ob_arm->data)->deformflag = ARM_DEF_VGROUP;
+
+ // create all vertex groups
+ std::vector<JointData>::iterator it;
+ int joint_index;
+ for (it = joint_data.begin(), joint_index = 0; it != joint_data.end(); it++, joint_index++) {
+ const char *name = "Group";
+
+ // skip joints that have invalid UID
+ if ((*it).joint_uid == COLLADAFW::UniqueId::INVALID) continue;
+
+ // name group by joint node name
+
+ if (joint_by_uid.find((*it).joint_uid) != joint_by_uid.end()) {
+ name = bc_get_joint_name(joint_by_uid[(*it).joint_uid]);
+ }
+
+ ED_vgroup_add_name(ob, (char*)name);
+ }
+
+ // <vcount> - number of joints per vertex - joints_per_vertex
+ // <v> - [[bone index, weight index] * joints per vertex] * vertices - weight indices
+ // ^ bone index can be -1 meaning weight toward bind shape, how to express this in Blender?
+
+ // for each vertex in weight indices
+ // for each bone index in vertex
+ // add vertex to group at group index
+ // treat group index -1 specially
+
+ // get def group by index with BLI_findlink
+
+ for (unsigned int vertex = 0, weight = 0; vertex < joints_per_vertex.getCount(); vertex++) {
+
+ unsigned int limit = weight + joints_per_vertex[vertex];
+ for ( ; weight < limit; weight++) {
+ int joint = joint_indices[weight], joint_weight = weight_indices[weight];
+
+ // -1 means "weight towards the bind shape", we just don't assign it to any group
+ if (joint != -1) {
+ bDeformGroup *def = (bDeformGroup*)BLI_findlink(&ob->defbase, joint);
+
+ ED_vgroup_vert_add(ob, def, vertex, weights[joint_weight], WEIGHT_REPLACE);
+ }
+ }
+ }
+}
+
+bPoseChannel *SkinInfo::get_pose_channel_from_node(COLLADAFW::Node *node)
+{
+ return get_pose_channel(ob_arm->pose, bc_get_joint_name(node));
+}
+
+void SkinInfo::set_parent(Object *_parent)
+{
+ parent = _parent;
+}
+
+Object* SkinInfo::get_parent()
+{
+ return parent;
+}
+
+void SkinInfo::find_root_joints(const std::vector<COLLADAFW::Node*> &root_joints,
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& joint_by_uid,
+ std::vector<COLLADAFW::Node*>& result)
+{
+ std::vector<COLLADAFW::Node*>::const_iterator it;
+ for (it = root_joints.begin(); it != root_joints.end(); it++) {
+ COLLADAFW::Node *root = *it;
+ std::vector<JointData>::iterator ji;
+ for (ji = joint_data.begin(); ji != joint_data.end(); ji++) {
+ COLLADAFW::Node *joint = joint_by_uid[(*ji).joint_uid];
+ if (find_node_in_tree(joint, root)) {
+ if (std::find(result.begin(), result.end(), root) == result.end())
+ result.push_back(root);
+ }
+ }
+ }
+}
+
+bool SkinInfo::find_node_in_tree(COLLADAFW::Node *node, COLLADAFW::Node *tree_root)
+{
+ if (node == tree_root)
+ return true;
+
+ COLLADAFW::NodePointerArray& children = tree_root->getChildNodes();
+ for (unsigned int i = 0; i < children.getCount(); i++) {
+ if (find_node_in_tree(node, children[i]))
+ return true;
+ }
+
+ return false;
+}
diff --git a/source/blender/collada/SkinInfo.h b/source/blender/collada/SkinInfo.h
new file mode 100644
index 00000000000..e8fbc86dcdb
--- /dev/null
+++ b/source/blender/collada/SkinInfo.h
@@ -0,0 +1,133 @@
+/**
+ * $Id: SkinInfo.h 32310 2010-10-05 00:49:39Z gsrb3d $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __BC_SKININFO_H__
+#define __BC_SKININFO_H__
+
+#include <map>
+#include <vector>
+
+#include "COLLADAFWUniqueId.h"
+#include "COLLADAFWTypes.h"
+#include "COLLADAFWNode.h"
+#include "COLLADAFWSkinController.h"
+#include "COLLADAFWSkinControllerData.h"
+
+#include "DNA_object_types.h"
+#include "BKE_context.h"
+
+#include "TransformReader.h"
+#include "collada_internal.h"
+
+// This is used to store data passed in write_controller_data.
+// Arrays from COLLADAFW::SkinControllerData lose ownership, so do this class members
+// so that arrays don't get freed until we free them explicitly.
+class SkinInfo
+{
+private:
+ // to build armature bones from inverse bind matrices
+ struct JointData {
+ float inv_bind_mat[4][4]; // joint inverse bind matrix
+ COLLADAFW::UniqueId joint_uid; // joint node UID
+ // Object *ob_arm; // armature object
+ };
+
+ float bind_shape_matrix[4][4];
+
+ // data from COLLADAFW::SkinControllerData, each array should be freed
+ COLLADAFW::UIntValuesArray joints_per_vertex;
+ COLLADAFW::UIntValuesArray weight_indices;
+ COLLADAFW::IntValuesArray joint_indices;
+ // COLLADAFW::FloatOrDoubleArray weights;
+ std::vector<float> weights;
+
+ std::vector<JointData> joint_data; // index to this vector is joint index
+
+ UnitConverter *unit_converter;
+
+ Object *ob_arm;
+ COLLADAFW::UniqueId controller_uid;
+ Object *parent;
+
+public:
+
+ SkinInfo();
+ SkinInfo(const SkinInfo& skin);
+ SkinInfo(UnitConverter *conv);
+
+ // nobody owns the data after this, so it should be freed manually with releaseMemory
+ template <typename T>
+ void transfer_array_data(T& src, T& dest);
+
+ // when src is const we cannot src.yieldOwnerShip, this is used by copy constructor
+ void transfer_int_array_data_const(const COLLADAFW::IntValuesArray& src, COLLADAFW::IntValuesArray& dest);
+
+ void transfer_uint_array_data_const(const COLLADAFW::UIntValuesArray& src, COLLADAFW::UIntValuesArray& dest);
+
+ void borrow_skin_controller_data(const COLLADAFW::SkinControllerData* skin);
+
+ void free();
+
+ // using inverse bind matrices to construct armature
+ // it is safe to invert them to get the original matrices
+ // because if they are inverse matrices, they can be inverted
+ void add_joint(const COLLADABU::Math::Matrix4& matrix);
+
+ void set_controller(const COLLADAFW::SkinController* co);
+
+ // called from write_controller
+ Object *create_armature(Scene *scene);
+
+ Object* set_armature(Object *ob_arm);
+
+ bool get_joint_inv_bind_matrix(float inv_bind_mat[][4], COLLADAFW::Node *node);
+
+ Object *get_armature();
+
+ const COLLADAFW::UniqueId& get_controller_uid();
+
+ // check if this skin controller references a joint or any descendant of it
+ //
+ // some nodes may not be referenced by SkinController,
+ // in this case to determine if the node belongs to this armature,
+ // we need to search down the tree
+ bool uses_joint_or_descendant(COLLADAFW::Node *node);
+
+ void link_armature(bContext *C, Object *ob, std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& joint_by_uid, TransformReader *tm);
+
+ bPoseChannel *get_pose_channel_from_node(COLLADAFW::Node *node);
+
+ void set_parent(Object *_parent);
+
+ Object* get_parent();
+
+ void find_root_joints(const std::vector<COLLADAFW::Node*> &root_joints,
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& joint_by_uid,
+ std::vector<COLLADAFW::Node*>& result);
+
+ bool find_node_in_tree(COLLADAFW::Node *node, COLLADAFW::Node *tree_root);
+
+};
+
+#endif
diff --git a/source/blender/collada/TransformReader.cpp b/source/blender/collada/TransformReader.cpp
new file mode 100644
index 00000000000..38b291f71b5
--- /dev/null
+++ b/source/blender/collada/TransformReader.cpp
@@ -0,0 +1,127 @@
+/**
+ * $Id: TransformReader.cpp 34787 2011-02-12 06:25:04Z campbellbarton $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+/* COLLADABU_ASSERT, may be able to remove later */
+#include "COLLADABUPlatform.h"
+
+#include "TransformReader.h"
+
+TransformReader::TransformReader(UnitConverter* conv) : unit_converter(conv) {}
+
+void TransformReader::get_node_mat(float mat[][4], COLLADAFW::Node *node, std::map<COLLADAFW::UniqueId, Animation> *animation_map, Object *ob)
+{
+ float cur[4][4];
+ float copy[4][4];
+
+ unit_m4(mat);
+
+ for (unsigned int i = 0; i < node->getTransformations().getCount(); i++) {
+
+ COLLADAFW::Transformation *tm = node->getTransformations()[i];
+ COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
+
+ switch(type) {
+ case COLLADAFW::Transformation::TRANSLATE:
+ dae_translate_to_mat4(tm, cur);
+ break;
+ case COLLADAFW::Transformation::ROTATE:
+ dae_rotate_to_mat4(tm, cur);
+ break;
+ case COLLADAFW::Transformation::SCALE:
+ dae_scale_to_mat4(tm, cur);
+ break;
+ case COLLADAFW::Transformation::MATRIX:
+ dae_matrix_to_mat4(tm, cur);
+ break;
+ case COLLADAFW::Transformation::LOOKAT:
+ case COLLADAFW::Transformation::SKEW:
+ fprintf(stderr, "LOOKAT and SKEW transformations are not supported yet.\n");
+ break;
+ }
+
+ copy_m4_m4(copy, mat);
+ mul_m4_m4m4(mat, cur, copy);
+
+ if (animation_map) {
+ // AnimationList that drives this Transformation
+ const COLLADAFW::UniqueId& anim_list_id = tm->getAnimationList();
+
+ // store this so later we can link animation data with ob
+ Animation anim = {ob, node, tm};
+ (*animation_map)[anim_list_id] = anim;
+ }
+ }
+}
+
+void TransformReader::dae_rotate_to_mat4(COLLADAFW::Transformation *tm, float m[][4])
+{
+ COLLADAFW::Rotate *ro = (COLLADAFW::Rotate*)tm;
+ COLLADABU::Math::Vector3& axis = ro->getRotationAxis();
+ float angle = (float)(ro->getRotationAngle() * M_PI / 180.0f);
+ float ax[] = {axis[0], axis[1], axis[2]};
+ // float quat[4];
+ // axis_angle_to_quat(quat, axis, angle);
+ // quat_to_mat4(m, quat);
+ axis_angle_to_mat4(m, ax, angle);
+}
+
+void TransformReader::dae_translate_to_mat4(COLLADAFW::Transformation *tm, float m[][4])
+{
+ COLLADAFW::Translate *tra = (COLLADAFW::Translate*)tm;
+ COLLADABU::Math::Vector3& t = tra->getTranslation();
+
+ unit_m4(m);
+
+ m[3][0] = (float)t[0];
+ m[3][1] = (float)t[1];
+ m[3][2] = (float)t[2];
+}
+
+void TransformReader::dae_scale_to_mat4(COLLADAFW::Transformation *tm, float m[][4])
+{
+ COLLADABU::Math::Vector3& s = ((COLLADAFW::Scale*)tm)->getScale();
+ float size[3] = {(float)s[0], (float)s[1], (float)s[2]};
+ size_to_mat4(m, size);
+}
+
+void TransformReader::dae_matrix_to_mat4(COLLADAFW::Transformation *tm, float m[][4])
+{
+ unit_converter->dae_matrix_to_mat4_(m, ((COLLADAFW::Matrix*)tm)->getMatrix());
+}
+
+void TransformReader::dae_translate_to_v3(COLLADAFW::Transformation *tm, float v[3])
+{
+ dae_vector3_to_v3(((COLLADAFW::Translate*)tm)->getTranslation(), v);
+}
+
+void TransformReader::dae_scale_to_v3(COLLADAFW::Transformation *tm, float v[3])
+{
+ dae_vector3_to_v3(((COLLADAFW::Scale*)tm)->getScale(), v);
+}
+
+void TransformReader::dae_vector3_to_v3(const COLLADABU::Math::Vector3 &v3, float v[3])
+{
+ v[0] = v3.x;
+ v[1] = v3.y;
+ v[2] = v3.z;
+}
diff --git a/source/blender/collada/TransformReader.h b/source/blender/collada/TransformReader.h
new file mode 100644
index 00000000000..2bec6c534ac
--- /dev/null
+++ b/source/blender/collada/TransformReader.h
@@ -0,0 +1,70 @@
+/**
+ * $Id: TransformReader.h 32310 2010-10-05 00:49:39Z gsrb3d $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __BC_TRANSFORMREADER_H__
+#define __BC_TRANSFORMREADER_H__
+
+#include "COLLADAFWNode.h"
+#include "COLLADAFWTransformation.h"
+#include "COLLADAFWTranslate.h"
+#include "COLLADAFWRotate.h"
+#include "COLLADAFWScale.h"
+#include "COLLADAFWMatrix.h"
+#include "COLLADAFWUniqueId.h"
+#include "Math/COLLADABUMathVector3.h"
+
+#include "DNA_object_types.h"
+#include "BLI_math.h"
+
+#include "collada_internal.h"
+
+//struct Object;
+
+class TransformReader : public TransformBase
+{
+protected:
+
+ UnitConverter *unit_converter;
+
+public:
+ struct Animation {
+ Object *ob;
+ COLLADAFW::Node *node;
+ COLLADAFW::Transformation *tm; // which transform is animated by an AnimationList->id
+ };
+
+ TransformReader(UnitConverter* conv);
+
+ void get_node_mat(float mat[][4], COLLADAFW::Node *node, std::map<COLLADAFW::UniqueId, Animation> *animation_map, Object *ob);
+
+ void dae_rotate_to_mat4(COLLADAFW::Transformation *tm, float m[][4]);
+ void dae_translate_to_mat4(COLLADAFW::Transformation *tm, float m[][4]);
+ void dae_scale_to_mat4(COLLADAFW::Transformation *tm, float m[][4]);
+ void dae_matrix_to_mat4(COLLADAFW::Transformation *tm, float m[][4]);
+ void dae_translate_to_v3(COLLADAFW::Transformation *tm, float v[3]);
+ void dae_scale_to_v3(COLLADAFW::Transformation *tm, float v[3]);
+ void dae_vector3_to_v3(const COLLADABU::Math::Vector3 &v3, float v[3]);
+};
+
+#endif
diff --git a/source/blender/collada/TransformWriter.cpp b/source/blender/collada/TransformWriter.cpp
new file mode 100644
index 00000000000..a3ed250964f
--- /dev/null
+++ b/source/blender/collada/TransformWriter.cpp
@@ -0,0 +1,100 @@
+/**
+ * $Id: TransformWriter.cpp 32355 2010-10-06 20:40:16Z gsrb3d $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "BKE_object.h"
+
+#include "TransformWriter.h"
+
+#include "BLI_math.h"
+
+void TransformWriter::add_node_transform(COLLADASW::Node& node, float mat[][4], float parent_mat[][4])
+{
+ float loc[3], rot[3], scale[3];
+ float local[4][4];
+
+ if (parent_mat) {
+ float invpar[4][4];
+ invert_m4_m4(invpar, parent_mat);
+ mul_m4_m4m4(local, mat, invpar);
+ }
+ else {
+ copy_m4_m4(local, mat);
+ }
+
+ TransformBase::decompose(local, loc, rot, NULL, scale);
+
+ add_transform(node, loc, rot, scale);
+}
+
+void TransformWriter::add_node_transform_ob(COLLADASW::Node& node, Object *ob)
+{
+ float rot[3], loc[3], scale[3];
+
+ if (ob->parent) {
+ float C[4][4], tmat[4][4], imat[4][4], mat[4][4];
+
+ // factor out scale from obmat
+
+ copy_v3_v3(scale, ob->size);
+
+ ob->size[0] = ob->size[1] = ob->size[2] = 1.0f;
+ object_to_mat4(ob, C);
+ copy_v3_v3(ob->size, scale);
+
+ mul_serie_m4(tmat, ob->parent->obmat, ob->parentinv, C, NULL, NULL, NULL, NULL, NULL);
+
+ // calculate local mat
+
+ invert_m4_m4(imat, ob->parent->obmat);
+ mul_m4_m4m4(mat, tmat, imat);
+
+ // done
+
+ mat4_to_eul(rot, mat);
+ copy_v3_v3(loc, mat[3]);
+ }
+ else {
+ copy_v3_v3(loc, ob->loc);
+ copy_v3_v3(rot, ob->rot);
+ copy_v3_v3(scale, ob->size);
+ }
+
+ add_transform(node, loc, rot, scale);
+}
+
+void TransformWriter::add_node_transform_identity(COLLADASW::Node& node)
+{
+ float loc[] = {0.0f, 0.0f, 0.0f}, scale[] = {1.0f, 1.0f, 1.0f}, rot[] = {0.0f, 0.0f, 0.0f};
+ add_transform(node, loc, rot, scale);
+}
+
+void TransformWriter::add_transform(COLLADASW::Node& node, float loc[3], float rot[3], float scale[3])
+{
+ node.addTranslate("location", loc[0], loc[1], loc[2]);
+ node.addRotateZ("rotationZ", COLLADABU::Math::Utils::radToDegF(rot[2]));
+ node.addRotateY("rotationY", COLLADABU::Math::Utils::radToDegF(rot[1]));
+ node.addRotateX("rotationX", COLLADABU::Math::Utils::radToDegF(rot[0]));
+ node.addScale("scale", scale[0], scale[1], scale[2]);
+}
diff --git a/source/gameengine/GamePlayer/common/windows/GPW_System.h b/source/blender/collada/TransformWriter.h
index bd9a0cd709f..09dd1f2daad 100644
--- a/source/gameengine/GamePlayer/common/windows/GPW_System.h
+++ b/source/blender/collada/TransformWriter.h
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id: TransformWriter.h 32355 2010-10-06 20:40:16Z gsrb3d $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -17,42 +17,32 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
*
* ***** END GPL LICENSE BLOCK *****
- * Timing routine taken and modified from KX_BlenderSystem.cpp
*/
-#ifndef _GPW_SYSTEM_H_
-#define _GPW_SYSTEM_H_
+#ifndef __TRANSFORMWRITER_H__
+#define __TRANSFORMWRITER_H__
-#pragma warning (disable:4786) // suppress stl-MSVC debug info warning
+#include "COLLADASWNode.h"
-#include "GPC_System.h"
+#include "DNA_object_types.h"
-#if defined(__CYGWIN32__)
-# define __int64 long long
-#endif
+#include "collada_internal.h"
-class GPW_System : public GPC_System
+class TransformWriter : protected TransformBase
{
-public:
- GPW_System();
-
- virtual double GetTimeInSeconds();
protected:
+ void add_node_transform(COLLADASW::Node& node, float mat[][4], float parent_mat[][4]);
- __int64 m_freq;
- __int64 m_lastCount;
- __int64 m_lastRest;
- long m_lastTime;
+ void add_node_transform_ob(COLLADASW::Node& node, Object *ob);
-};
+ void add_node_transform_identity(COLLADASW::Node& node);
-#endif //_GPW_SYSTEM_H_
+private:
+ void add_transform(COLLADASW::Node& node, float loc[3], float rot[3], float scale[3]);
+};
+#endif
diff --git a/source/blender/collada/collada.cpp b/source/blender/collada/collada.cpp
index a519db3332c..241b63eeade 100644
--- a/source/blender/collada/collada.cpp
+++ b/source/blender/collada/collada.cpp
@@ -21,19 +21,22 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#include "BKE_main.h"
-#include "BKE_scene.h"
-#include "BKE_context.h"
+
+/* COLLADABU_ASSERT, may be able to remove later */
+#include "COLLADABUPlatform.h"
#include "DocumentExporter.h"
#include "DocumentImporter.h"
extern "C"
{
+#include "BKE_scene.h"
+#include "BKE_context.h"
+
int collada_import(bContext *C, const char *filepath)
{
- DocumentImporter imp;
- imp.import(C, filepath);
+ DocumentImporter imp (C, filepath);
+ imp.import();
return 1;
}
diff --git a/source/blender/collada/collada_internal.cpp b/source/blender/collada/collada_internal.cpp
new file mode 100644
index 00000000000..63c4f426379
--- /dev/null
+++ b/source/blender/collada/collada_internal.cpp
@@ -0,0 +1,267 @@
+/**
+ * $Id: collada_internal.cpp 34787 2011-02-12 06:25:04Z campbellbarton $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* COLLADABU_ASSERT, may be able to remove later */
+#include "collada_internal.h"
+
+UnitConverter::UnitConverter() : unit(), up_axis(COLLADAFW::FileInfo::Z_UP) {}
+
+void UnitConverter::read_asset(const COLLADAFW::FileInfo* asset)
+{
+ unit = asset->getUnit();
+ up_axis = asset->getUpAxisType();
+}
+
+UnitConverter::UnitSystem UnitConverter::isMetricSystem()
+{
+ switch(unit.getLinearUnitUnit()) {
+ case COLLADAFW::FileInfo::Unit::MILLIMETER:
+ case COLLADAFW::FileInfo::Unit::CENTIMETER:
+ case COLLADAFW::FileInfo::Unit::DECIMETER:
+ case COLLADAFW::FileInfo::Unit::METER:
+ case COLLADAFW::FileInfo::Unit::KILOMETER:
+ return UnitConverter::Metric;
+ case COLLADAFW::FileInfo::Unit::INCH:
+ case COLLADAFW::FileInfo::Unit::FOOT:
+ case COLLADAFW::FileInfo::Unit::YARD:
+ return UnitConverter::Imperial;
+ default:
+ return UnitConverter::None;
+ }
+}
+
+float UnitConverter::getLinearMeter()
+{
+ return (float)unit.getLinearUnitMeter();
+}
+
+void UnitConverter::convertVector3(COLLADABU::Math::Vector3 &vec, float *v)
+{
+ v[0] = vec.x;
+ v[1] = vec.y;
+ v[2] = vec.z;
+}
+
+// TODO need also for angle conversion, time conversion...
+
+void UnitConverter::dae_matrix_to_mat4_(float out[][4], const COLLADABU::Math::Matrix4& in)
+{
+ // in DAE, matrices use columns vectors, (see comments in COLLADABUMathMatrix4.h)
+ // so here, to make a blender matrix, we swap columns and rows
+ for (int i = 0; i < 4; i++) {
+ for (int j = 0; j < 4; j++) {
+ out[i][j] = in[j][i];
+ }
+ }
+}
+
+void UnitConverter::mat4_to_dae(float out[][4], float in[][4])
+{
+ copy_m4_m4(out, in);
+ transpose_m4(out);
+}
+
+void UnitConverter::mat4_to_dae_double(double out[][4], float in[][4])
+{
+ float mat[4][4];
+
+ mat4_to_dae(mat, in);
+
+ for (int i = 0; i < 4; i++)
+ for (int j = 0; j < 4; j++)
+ out[i][j] = mat[i][j];
+}
+
+void TransformBase::decompose(float mat[][4], float *loc, float eul[3], float quat[4], float *size)
+{
+ mat4_to_size(size, mat);
+ if (eul) {
+ mat4_to_eul(eul, mat);
+ }
+ if (quat) {
+ mat4_to_quat(quat, mat);
+ }
+ copy_v3_v3(loc, mat[3]);
+}
+
+/**
+Translation map.
+Used to translate every COLLADA id to a valid id, no matter what "wrong" letters may be
+included. Look at the IDREF XSD declaration for more.
+Follows strictly the COLLADA XSD declaration which explicitly allows non-english chars,
+like special chars (e.g. micro sign), umlauts and so on.
+The COLLADA spec also allows additional chars for member access ('.'), these
+must obviously be removed too, otherwise they would be heavily misinterpreted.
+*/
+const unsigned char translate_start_name_map[256] = {
+95, 95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+65, 66, 67, 68, 69, 70, 71, 72,
+73, 74, 75, 76, 77, 78, 79, 80,
+81, 82, 83, 84, 85, 86, 87, 88,
+89, 90, 95, 95, 95, 95, 95, 95,
+97, 98, 99, 100, 101, 102, 103, 104,
+105, 106, 107, 108, 109, 110, 111, 112,
+113, 114, 115, 116, 117, 118, 119, 120,
+121, 122, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 192,
+193, 194, 195, 196, 197, 198, 199, 200,
+201, 202, 203, 204, 205, 206, 207, 208,
+209, 210, 211, 212, 213, 214, 95, 216,
+217, 218, 219, 220, 221, 222, 223, 224,
+225, 226, 227, 228, 229, 230, 231, 232,
+233, 234, 235, 236, 237, 238, 239, 240,
+241, 242, 243, 244, 245, 246, 95, 248,
+249, 250, 251, 252, 253, 254, 255};
+
+const unsigned char translate_name_map[256] = {
+95, 95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 45, 95, 95, 48,
+49, 50, 51, 52, 53, 54, 55, 56,
+57, 95, 95, 95, 95, 95, 95, 95,
+65, 66, 67, 68, 69, 70, 71, 72,
+73, 74, 75, 76, 77, 78, 79, 80,
+81, 82, 83, 84, 85, 86, 87, 88,
+89, 90, 95, 95, 95, 95, 95, 95,
+97, 98, 99, 100, 101, 102, 103, 104,
+105, 106, 107, 108, 109, 110, 111, 112,
+113, 114, 115, 116, 117, 118, 119, 120,
+121, 122, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 183, 95,
+95, 95, 95, 95, 95, 95, 95, 192,
+193, 194, 195, 196, 197, 198, 199, 200,
+201, 202, 203, 204, 205, 206, 207, 208,
+209, 210, 211, 212, 213, 214, 95, 216,
+217, 218, 219, 220, 221, 222, 223, 224,
+225, 226, 227, 228, 229, 230, 231, 232,
+233, 234, 235, 236, 237, 238, 239, 240,
+241, 242, 243, 244, 245, 246, 95, 248,
+249, 250, 251, 252, 253, 254, 255};
+
+typedef std::map< std::string, std::vector<std::string> > map_string_list;
+map_string_list global_id_map;
+
+void clear_global_id_map()
+{
+ global_id_map.clear();
+}
+
+/** Look at documentation of translate_map */
+std::string translate_id(const std::string &id)
+{
+ if (id.size() == 0)
+ { return id; }
+ std::string id_translated = id;
+ id_translated[0] = translate_start_name_map[(unsigned int)id_translated[0]];
+ for (unsigned int i=1; i < id_translated.size(); i++)
+ {
+ id_translated[i] = translate_name_map[(unsigned int)id_translated[i]];
+ }
+ // It's so much workload now, the if() should speed up things.
+ if (id_translated != id)
+ {
+ // Search duplicates
+ map_string_list::iterator iter = global_id_map.find(id_translated);
+ if (iter != global_id_map.end())
+ {
+ unsigned int i = 0;
+ bool found = false;
+ for (i=0; i < iter->second.size(); i++)
+ {
+ if (id == iter->second[i])
+ {
+ found = true;
+ break;
+ }
+ }
+ bool convert = false;
+ if (found)
+ {
+ if (i > 0)
+ { convert = true; }
+ }
+ else
+ {
+ convert = true;
+ global_id_map[id_translated].push_back(id);
+ }
+ if (convert)
+ {
+ std::stringstream out;
+ out << ++i;
+ id_translated += out.str();
+ }
+ }
+ else { global_id_map[id_translated].push_back(id); }
+ }
+ return id_translated;
+}
+
+std::string id_name(void *id)
+{
+ return ((ID*)id)->name + 2;
+}
+
+std::string get_geometry_id(Object *ob)
+{
+ return translate_id(id_name(ob->data)) + "-mesh";
+}
+
+std::string get_light_id(Object *ob)
+{
+ return translate_id(id_name(ob)) + "-light";
+}
+
+std::string get_joint_id(Bone *bone, Object *ob_arm)
+{
+ return translate_id(id_name(ob_arm) + "_" + bone->name);
+}
+
+std::string get_camera_id(Object *ob)
+{
+ return translate_id(id_name(ob)) + "-camera";
+}
diff --git a/source/blender/collada/collada_internal.h b/source/blender/collada/collada_internal.h
index 242fce749c4..72b03a3d090 100644
--- a/source/blender/collada/collada_internal.h
+++ b/source/blender/collada/collada_internal.h
@@ -24,9 +24,17 @@
#ifndef BLENDER_COLLADA_H
#define BLENDER_COLLADA_H
+#include <string>
+#include <vector>
+#include <map>
+
#include "COLLADAFWFileInfo.h"
#include "Math/COLLADABUMathMatrix4.h"
+#include "DNA_armature_types.h"
+#include "DNA_object_types.h"
+#include "BLI_math.h"
+
class UnitConverter
{
private:
@@ -35,61 +43,50 @@ private:
public:
- UnitConverter() : unit(), up_axis(COLLADAFW::FileInfo::Z_UP) {}
+ enum UnitSystem {
+ None,
+ Metric,
+ Imperial
+ };
+
+ // Initialize with Z_UP, since Blender uses right-handed, z-up
+ UnitConverter();
- void read_asset(const COLLADAFW::FileInfo* asset)
- {
- }
+ void read_asset(const COLLADAFW::FileInfo* asset);
- // TODO
- // convert vector vec from COLLADA format to Blender
- void convertVec3(float *vec)
- {
- }
+ void convertVector3(COLLADABU::Math::Vector3 &vec, float *v);
+
+ UnitConverter::UnitSystem isMetricSystem(void);
+
+ float getLinearMeter(void);
// TODO need also for angle conversion, time conversion...
- void dae_matrix_to_mat4(float out[][4], const COLLADABU::Math::Matrix4& in)
- {
- // in DAE, matrices use columns vectors, (see comments in COLLADABUMathMatrix4.h)
- // so here, to make a blender matrix, we swap columns and rows
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- out[i][j] = in[j][i];
- }
- }
- }
-
- void mat4_to_dae(float out[][4], float in[][4])
- {
- copy_m4_m4(out, in);
- transpose_m4(out);
- }
-
- void mat4_to_dae_double(double out[][4], float in[][4])
- {
- float mat[4][4];
-
- mat4_to_dae(mat, in);
-
- for (int i = 0; i < 4; i++)
- for (int j = 0; j < 4; j++)
- out[i][j] = mat[i][j];
- }
+ void dae_matrix_to_mat4_(float out[][4], const COLLADABU::Math::Matrix4& in);
+
+ void mat4_to_dae(float out[][4], float in[][4]);
+
+ void mat4_to_dae_double(double out[][4], float in[][4]);
};
class TransformBase
{
public:
- void decompose(float mat[][4], float *loc, float eul[3], float quat[4], float *size)
- {
- mat4_to_size(size, mat);
- if (eul)
- mat4_to_eul(eul, mat);
- if (quat)
- mat4_to_quat(quat, mat);
- copy_v3_v3(loc, mat[3]);
- }
+ void decompose(float mat[][4], float *loc, float eul[3], float quat[4], float *size);
};
+extern void clear_global_id_map();
+/** Look at documentation of translate_map */
+extern std::string translate_id(const std::string &id);
+
+extern std::string id_name(void *id);
+
+extern std::string get_geometry_id(Object *ob);
+
+extern std::string get_light_id(Object *ob);
+
+extern std::string get_joint_id(Bone *bone, Object *ob_arm);
+
+extern std::string get_camera_id(Object *ob);
+
#endif
diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp
new file mode 100644
index 00000000000..697f4b4c800
--- /dev/null
+++ b/source/blender/collada/collada_utils.cpp
@@ -0,0 +1,109 @@
+/**
+ * $Id: collada_utils.cpp 34787 2011-02-12 06:25:04Z campbellbarton $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* COLLADABU_ASSERT, may be able to remove later */
+#include "COLLADABUPlatform.h"
+
+#include "COLLADAFWGeometry.h"
+#include "COLLADAFWMeshPrimitive.h"
+#include "COLLADAFWMeshVertexData.h"
+
+#include "DNA_customdata_types.h"
+#include "DNA_object_types.h"
+
+#include "BLI_math.h"
+
+#include "BKE_context.h"
+#include "BKE_customdata.h"
+#include "BKE_depsgraph.h"
+#include "BKE_object.h"
+
+#include "WM_api.h" // XXX hrm, see if we can do without this
+#include "WM_types.h"
+
+float bc_get_float_value(const COLLADAFW::FloatOrDoubleArray& array, unsigned int index)
+{
+ if (index >= array.getValuesCount())
+ return 0.0f;
+
+ if (array.getType() == COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT)
+ return array.getFloatValues()->getData()[index];
+ else
+ return array.getDoubleValues()->getData()[index];
+}
+
+// copied from /editors/object/object_relations.c
+int bc_test_parent_loop(Object *par, Object *ob)
+{
+ /* test if 'ob' is a parent somewhere in par's parents */
+
+ if(par == NULL) return 0;
+ if(ob == par) return 1;
+
+ return bc_test_parent_loop(par->parent, ob);
+}
+
+// a shortened version of parent_set_exec()
+// if is_parent_space is true then ob->obmat will be multiplied by par->obmat before parenting
+int bc_set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space)
+{
+ Object workob;
+ Main *bmain = CTX_data_main(C);
+ Scene *sce = CTX_data_scene(C);
+
+ if (!par || bc_test_parent_loop(par, ob))
+ return false;
+
+ ob->parent = par;
+ ob->partype = PAROBJECT;
+
+ ob->parsubstr[0] = 0;
+
+ if (is_parent_space) {
+ float mat[4][4];
+ // calc par->obmat
+ where_is_object(sce, par);
+
+ // move child obmat into world space
+ mul_m4_m4m4(mat, ob->obmat, par->obmat);
+ copy_m4_m4(ob->obmat, mat);
+ }
+
+ // apply child obmat (i.e. decompose it into rot/loc/size)
+ object_apply_mat4(ob, ob->obmat, 0, 0);
+
+ // compute parentinv
+ what_does_parent(sce, ob, &workob);
+ invert_m4_m4(ob->parentinv, workob.obmat);
+
+ ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA;
+ par->recalc |= OB_RECALC_OB;
+
+ DAG_scene_sort(bmain, sce);
+ DAG_ids_flush_update(bmain, 0);
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+
+ return true;
+}
+
diff --git a/source/blender/collada/collada_utils.h b/source/blender/collada/collada_utils.h
new file mode 100644
index 00000000000..5da0d7dd174
--- /dev/null
+++ b/source/blender/collada/collada_utils.h
@@ -0,0 +1,50 @@
+/**
+ * $Id: collada_utils.h 32310 2010-10-05 00:49:39Z gsrb3d $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __BC_UTILS_H__
+#define __BC_UTILS_H__
+
+#include "COLLADAFWMeshPrimitive.h"
+#include "COLLADAFWGeometry.h"
+#include "COLLADAFWFloatOrDoubleArray.h"
+#include "COLLADAFWTypes.h"
+
+#include <vector>
+#include <map>
+
+#include "DNA_object_types.h"
+#include "DNA_customdata_types.h"
+#include "DNA_texture_types.h"
+#include "BKE_context.h"
+
+typedef std::map<COLLADAFW::TextureMapId, std::vector<MTex*> > TexIndexTextureArrayMap;
+
+extern float bc_get_float_value(const COLLADAFW::FloatOrDoubleArray& array, unsigned int index);
+
+extern int bc_test_parent_loop(Object *par, Object *ob);
+extern int bc_set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space=true);
+extern char *bc_CustomData_get_layer_name(const CustomData *data, int type, int n);
+extern char *bc_CustomData_get_active_layer_name(const CustomData *data, int type);
+
+#endif
diff --git a/source/blender/editors/CMakeLists.txt b/source/blender/editors/CMakeLists.txt
index 5d3cee9a7a5..651cb66833d 100644
--- a/source/blender/editors/CMakeLists.txt
+++ b/source/blender/editors/CMakeLists.txt
@@ -19,39 +19,39 @@
#
# ***** END GPL LICENSE BLOCK *****
-ADD_SUBDIRECTORY(animation)
-ADD_SUBDIRECTORY(armature)
-ADD_SUBDIRECTORY(curve)
-ADD_SUBDIRECTORY(datafiles)
-ADD_SUBDIRECTORY(gpencil)
-ADD_SUBDIRECTORY(interface)
-ADD_SUBDIRECTORY(mesh)
-ADD_SUBDIRECTORY(metaball)
-ADD_SUBDIRECTORY(object)
-ADD_SUBDIRECTORY(physics)
-ADD_SUBDIRECTORY(render)
-ADD_SUBDIRECTORY(screen)
-ADD_SUBDIRECTORY(sculpt_paint)
-ADD_SUBDIRECTORY(sound)
-ADD_SUBDIRECTORY(space_action)
-ADD_SUBDIRECTORY(space_api)
-ADD_SUBDIRECTORY(space_buttons)
-ADD_SUBDIRECTORY(space_console)
-ADD_SUBDIRECTORY(space_file)
-ADD_SUBDIRECTORY(space_graph)
-ADD_SUBDIRECTORY(space_image)
-ADD_SUBDIRECTORY(space_info)
-ADD_SUBDIRECTORY(space_logic)
-ADD_SUBDIRECTORY(space_nla)
-ADD_SUBDIRECTORY(space_node)
-ADD_SUBDIRECTORY(space_outliner)
-ADD_SUBDIRECTORY(space_script)
-ADD_SUBDIRECTORY(space_sequencer)
-ADD_SUBDIRECTORY(space_sound)
-ADD_SUBDIRECTORY(space_text)
-ADD_SUBDIRECTORY(space_time)
-ADD_SUBDIRECTORY(space_userpref)
-ADD_SUBDIRECTORY(space_view3d)
-ADD_SUBDIRECTORY(transform)
-ADD_SUBDIRECTORY(util)
-ADD_SUBDIRECTORY(uvedit)
+add_subdirectory(animation)
+add_subdirectory(armature)
+add_subdirectory(curve)
+add_subdirectory(datafiles)
+add_subdirectory(gpencil)
+add_subdirectory(interface)
+add_subdirectory(mesh)
+add_subdirectory(metaball)
+add_subdirectory(object)
+add_subdirectory(physics)
+add_subdirectory(render)
+add_subdirectory(screen)
+add_subdirectory(sculpt_paint)
+add_subdirectory(sound)
+add_subdirectory(space_action)
+add_subdirectory(space_api)
+add_subdirectory(space_buttons)
+add_subdirectory(space_console)
+add_subdirectory(space_file)
+add_subdirectory(space_graph)
+add_subdirectory(space_image)
+add_subdirectory(space_info)
+add_subdirectory(space_logic)
+add_subdirectory(space_nla)
+add_subdirectory(space_node)
+add_subdirectory(space_outliner)
+add_subdirectory(space_script)
+add_subdirectory(space_sequencer)
+add_subdirectory(space_sound)
+add_subdirectory(space_text)
+add_subdirectory(space_time)
+add_subdirectory(space_userpref)
+add_subdirectory(space_view3d)
+add_subdirectory(transform)
+add_subdirectory(util)
+add_subdirectory(uvedit)
diff --git a/source/blender/editors/Makefile b/source/blender/editors/Makefile
deleted file mode 100644
index 168d919e6de..00000000000
--- a/source/blender/editors/Makefile
+++ /dev/null
@@ -1,71 +0,0 @@
-# -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*-
-# vim: tabstop=8
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) Blender Foundation.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/editors
-DIRS = armature \
- mesh \
- animation \
- object \
- sculpt_paint \
- datafiles \
- transform \
- screen \
- curve \
- metaball \
- gpencil \
- physics \
- render \
- uvedit \
- space_outliner \
- space_time \
- space_view3d \
- interface \
- util \
- space_api \
- space_console \
- space_graph \
- space_image \
- space_node \
- space_buttons \
- space_info \
- space_file \
- space_sound \
- space_action \
- space_nla \
- space_script \
- space_text \
- space_sequencer \
- space_logic \
- space_userpref \
- sound
-
-include nan_subdirs.mk
diff --git a/source/blender/editors/animation/CMakeLists.txt b/source/blender/editors/animation/CMakeLists.txt
index d5eef6bbd34..66ec9cf75d6 100644
--- a/source/blender/editors/animation/CMakeLists.txt
+++ b/source/blender/editors/animation/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -31,4 +29,24 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_animation "${SRC}" "${INC}")
+set(SRC
+ anim_channels_defines.c
+ anim_channels_edit.c
+ anim_deps.c
+ anim_draw.c
+ anim_filter.c
+ anim_ipo_utils.c
+ anim_markers.c
+ anim_ops.c
+ drivers.c
+ fmodifier_ui.c
+ keyframes_draw.c
+ keyframes_edit.c
+ keyframes_general.c
+ keyframing.c
+ keyingsets.c
+
+ anim_intern.h
+)
+
+blender_add_lib(bf_editor_animation "${SRC}" "${INC}")
diff --git a/source/blender/editors/animation/Makefile b/source/blender/editors/animation/Makefile
deleted file mode 100644
index f120091e917..00000000000
--- a/source/blender/editors/animation/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_animation
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c
index 3fb8e441d6f..b2ee2f008f5 100644
--- a/source/blender/editors/animation/anim_channels_defines.c
+++ b/source/blender/editors/animation/anim_channels_defines.c
@@ -25,12 +25,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-
+#include <stdio.h>
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -42,16 +43,20 @@
#include "DNA_space_types.h"
#include "DNA_key_types.h"
#include "DNA_lamp_types.h"
+#include "DNA_lattice_types.h"
#include "DNA_mesh_types.h"
#include "DNA_material_types.h"
#include "DNA_meta_types.h"
#include "DNA_node_types.h"
#include "DNA_world_types.h"
+#include "DNA_gpencil_types.h"
#include "RNA_access.h"
+
#include "BKE_curve.h"
#include "BKE_key.h"
#include "BKE_context.h"
+#include "BKE_utildefines.h" /* FILE_MAX */
#include "UI_interface.h"
#include "UI_interface_icons.h"
@@ -61,6 +66,7 @@
#include "ED_keyframing.h"
#include "BIF_gl.h"
+#include "BIF_glutil.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -74,6 +80,8 @@
/* size of indent steps */
#define INDENT_STEP_SIZE 7
+#define ANIM_CHAN_NAME_SIZE 256
+
/* macros used for type defines */
/* get the pointer used for some flag */
#define GET_ACF_FLAG_PTR(ptr) \
@@ -89,7 +97,7 @@
/* Draw Backdrop ---------------------------------- */
/* get backdrop color for top-level widgets (Scene and Object only) */
-static void acf_generic_root_color(bAnimContext *ac, bAnimListElem *ale, float *color)
+static void acf_generic_root_color(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), float *color)
{
/* darker blue for top-level widgets */
UI_GetThemeColor3fv(TH_DOPESHEET_CHANNELOB, color);
@@ -115,7 +123,7 @@ static void acf_generic_root_backdrop(bAnimContext *ac, bAnimListElem *ale, floa
/* get backdrop color for data expanders under top-level Scene/Object */
-static void acf_generic_dataexpand_color(bAnimContext *ac, bAnimListElem *ale, float *color)
+static void acf_generic_dataexpand_color(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), float *color)
{
/* lighter color than top-level widget */
UI_GetThemeColor3fv(TH_DOPESHEET_CHANNELSUBOB, color);
@@ -161,7 +169,7 @@ static void acf_generic_channel_color(bAnimContext *ac, bAnimListElem *ale, floa
if ( (saction && !(saction->flag & SACTION_NODRAWGCOLORS)) &&
((grp) && (grp->customCol)) )
{
- char cp[3];
+ unsigned char cp[3];
if (indent == 2) {
VECCOPY(cp, grp->cs.solid);
@@ -202,11 +210,11 @@ static void acf_generic_channel_backdrop(bAnimContext *ac, bAnimListElem *ale, f
/* Indention + Offset ------------------------------------------- */
/* indention level is always the value in the name */
-static short acf_generic_indention_0(bAnimContext *ac, bAnimListElem *ale)
+static short acf_generic_indention_0(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale))
{
return 0;
}
-static short acf_generic_indention_1(bAnimContext *ac, bAnimListElem *ale)
+static short acf_generic_indention_1(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale))
{
return 1;
}
@@ -218,7 +226,7 @@ static short acf_generic_indention_2(bAnimContext *ac, bAnimListElem *ale)
#endif
/* indention which varies with the grouping status */
-static short acf_generic_indention_flexible(bAnimContext *ac, bAnimListElem *ale)
+static short acf_generic_indention_flexible(bAnimContext *UNUSED(ac), bAnimListElem *ale)
{
short indent= 0;
@@ -298,7 +306,7 @@ static void acf_generic_idblock_name(bAnimListElem *ale, char *name)
/* just copy the name... */
if (id && name)
- strcpy(name, id->name+2);
+ BLI_strncpy(name, id->name+2, ANIM_CHAN_NAME_SIZE);
}
/* Settings ------------------------------------------- */
@@ -352,7 +360,7 @@ static void *acf_generic_dsexpand_setting_ptr(bAnimListElem *ale, int setting, s
}
/* check if some setting exists for this object-based data-expander (datablock only) */
-static short acf_generic_dataexpand_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+static short acf_generic_dataexpand_setting_valid(bAnimContext *ac, bAnimListElem *UNUSED(ale), int setting)
{
switch (setting) {
/* expand is always supported */
@@ -375,7 +383,7 @@ static short acf_generic_dataexpand_setting_valid(bAnimContext *ac, bAnimListEle
/* Animation Summary ----------------------------------- */
/* get backdrop color for summary widget */
-static void acf_summary_color(bAnimContext *ac, bAnimListElem *ale, float *color)
+static void acf_summary_color(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), float *color)
{
// FIXME: hardcoded color - same as the 'action' line in NLA
// reddish color
@@ -404,27 +412,27 @@ static void acf_summary_backdrop(bAnimContext *ac, bAnimListElem *ale, float ymi
}
/* name for summary entries */
-static void acf_summary_name(bAnimListElem *ale, char *name)
+static void acf_summary_name(bAnimListElem *UNUSED(ale), char *name)
{
if (name)
- strcpy(name, "DopeSheet Summary");
+ BLI_strncpy(name, "DopeSheet Summary", ANIM_CHAN_NAME_SIZE);
}
// TODO: this is really a temp icon I think
-static int acf_summary_icon(bAnimListElem *ale)
+static int acf_summary_icon(bAnimListElem *UNUSED(ale))
{
return ICON_BORDERMOVE;
}
/* check if some setting exists for this channel */
-static short acf_summary_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+static short acf_summary_setting_valid(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), int setting)
{
/* only expanded is supported, as it is used for hiding all stuff which the summary covers */
return (setting == ACHANNEL_SETTING_EXPAND);
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_summary_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_summary_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
if (setting == ACHANNEL_SETTING_EXPAND) {
/* expanded */
@@ -481,13 +489,13 @@ static bAnimChannelType ACF_SUMMARY =
/* Scene ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_scene_icon(bAnimListElem *ale)
+static int acf_scene_icon(bAnimListElem *UNUSED(ale))
{
return ICON_SCENE_DATA;
}
/* check if some setting exists for this channel */
-static short acf_scene_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+static short acf_scene_setting_valid(bAnimContext *ac, bAnimListElem *UNUSED(ale), int setting)
{
switch (setting) {
/* muted only in NLA */
@@ -509,7 +517,7 @@ static short acf_scene_setting_valid(bAnimContext *ac, bAnimListElem *ale, int s
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_scene_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_scene_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -623,7 +631,7 @@ static void acf_object_name(bAnimListElem *ale, char *name)
/* just copy the name... */
if (ob && name)
- strcpy(name, ob->id.name+2);
+ BLI_strncpy(name, ob->id.name+2, ANIM_CHAN_NAME_SIZE);
}
/* check if some setting exists for this channel */
@@ -652,7 +660,7 @@ static short acf_object_setting_valid(bAnimContext *ac, bAnimListElem *ale, int
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_object_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_object_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -726,7 +734,7 @@ static bAnimChannelType ACF_OBJECT =
/* Group ------------------------------------------- */
/* get backdrop color for group widget */
-static void acf_group_color(bAnimContext *ac, bAnimListElem *ale, float *color)
+static void acf_group_color(bAnimContext *UNUSED(ac), bAnimListElem *ale, float *color)
{
/* highlight only for action group channels */
if (ale->flag & AGRP_ACTIVE)
@@ -760,11 +768,11 @@ static void acf_group_name(bAnimListElem *ale, char *name)
/* just copy the name... */
if (agrp && name)
- strcpy(name, agrp->name);
+ BLI_strncpy(name, agrp->name, ANIM_CHAN_NAME_SIZE);
}
/* check if some setting exists for this channel */
-static short acf_group_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+static short acf_group_setting_valid(bAnimContext *ac, bAnimListElem *UNUSED(ale), int setting)
{
/* for now, all settings are supported, though some are only conditionally */
switch (setting) {
@@ -814,7 +822,7 @@ static int acf_group_setting_flag(bAnimContext *ac, int setting, short *neg)
}
/* get pointer to the setting */
-static void *acf_group_setting_ptr(bAnimListElem *ale, int setting, short *type)
+static void *acf_group_setting_ptr(bAnimListElem *ale, int UNUSED(setting), short *type)
{
bActionGroup *agrp= (bActionGroup *)ale->data;
@@ -875,7 +883,7 @@ static short acf_fcurve_setting_valid(bAnimContext *ac, bAnimListElem *ale, int
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_fcurve_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_fcurve_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -900,7 +908,7 @@ static int acf_fcurve_setting_flag(bAnimContext *ac, int setting, short *neg)
}
/* get pointer to the setting */
-static void *acf_fcurve_setting_ptr(bAnimListElem *ale, int setting, short *type)
+static void *acf_fcurve_setting_ptr(bAnimListElem *ale, int UNUSED(setting), short *type)
{
FCurve *fcu= (FCurve *)ale->data;
@@ -929,13 +937,13 @@ static bAnimChannelType ACF_FCURVE =
/* Object Action Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_fillactd_icon(bAnimListElem *ale)
+static int acf_fillactd_icon(bAnimListElem *UNUSED(ale))
{
return ICON_ACTION;
}
/* check if some setting exists for this channel */
-static short acf_fillactd_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+static short acf_fillactd_setting_valid(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), int setting)
{
switch (setting) {
/* only select and expand supported */
@@ -949,7 +957,7 @@ static short acf_fillactd_setting_valid(bAnimContext *ac, bAnimListElem *ale, in
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_fillactd_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_fillactd_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1013,19 +1021,19 @@ static bAnimChannelType ACF_FILLACTD =
/* Drivers Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_filldrivers_icon(bAnimListElem *ale)
+static int acf_filldrivers_icon(bAnimListElem *UNUSED(ale))
{
return ICON_ANIM_DATA;
}
-static void acf_filldrivers_name(bAnimListElem *ale, char *name)
+static void acf_filldrivers_name(bAnimListElem *UNUSED(ale), char *name)
{
- strcpy(name, "Drivers");
+ BLI_strncpy(name, "Drivers", ANIM_CHAN_NAME_SIZE);
}
/* check if some setting exists for this channel */
// TODO: this could be made more generic
-static short acf_filldrivers_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+static short acf_filldrivers_setting_valid(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), int setting)
{
switch (setting) {
/* only expand supported */
@@ -1038,7 +1046,7 @@ static short acf_filldrivers_setting_valid(bAnimContext *ac, bAnimListElem *ale,
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_filldrivers_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_filldrivers_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1091,18 +1099,18 @@ static bAnimChannelType ACF_FILLDRIVERS =
/* Materials Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_fillmatd_icon(bAnimListElem *ale)
+static int acf_fillmatd_icon(bAnimListElem *UNUSED(ale))
{
return ICON_MATERIAL_DATA;
}
-static void acf_fillmatd_name(bAnimListElem *ale, char *name)
+static void acf_fillmatd_name(bAnimListElem *UNUSED(ale), char *name)
{
- strcpy(name, "Materials");
+ BLI_strncpy(name, "Materials", ANIM_CHAN_NAME_SIZE);
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_fillmatd_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_fillmatd_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1137,18 +1145,18 @@ static bAnimChannelType ACF_FILLMATD=
/* Particles Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_fillpartd_icon(bAnimListElem *ale)
+static int acf_fillpartd_icon(bAnimListElem *UNUSED(ale))
{
return ICON_PARTICLE_DATA;
}
-static void acf_fillpartd_name(bAnimListElem *ale, char *name)
+static void acf_fillpartd_name(bAnimListElem *UNUSED(ale), char *name)
{
- strcpy(name, "Particles");
+ BLI_strncpy(name, "Particles", ANIM_CHAN_NAME_SIZE);
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_fillpartd_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_fillpartd_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1205,14 +1213,14 @@ static short acf_filltexd_offset(bAnimContext *ac, bAnimListElem *ale)
}
// TODO: just get this from RNA?
-static int acf_filltexd_icon(bAnimListElem *ale)
+static int acf_filltexd_icon(bAnimListElem *UNUSED(ale))
{
return ICON_TEXTURE_DATA;
}
-static void acf_filltexd_name(bAnimListElem *ale, char *name)
+static void acf_filltexd_name(bAnimListElem *UNUSED(ale), char *name)
{
- strcpy(name, "Textures");
+ BLI_strncpy(name, "Textures", ANIM_CHAN_NAME_SIZE);
}
/* get pointer to the setting (category only) */
@@ -1253,7 +1261,7 @@ static void *acf_filltexd_setting_ptr(bAnimListElem *ale, int setting, short *ty
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_filltexd_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_filltexd_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1289,19 +1297,19 @@ static bAnimChannelType ACF_FILLTEXD=
/* Material Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dsmat_icon(bAnimListElem *ale)
+static int acf_dsmat_icon(bAnimListElem *UNUSED(ale))
{
return ICON_MATERIAL_DATA;
}
/* offset for material expanders */
-static short acf_dsmat_offset(bAnimContext *ac, bAnimListElem *ale)
+static short acf_dsmat_offset(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale))
{
return 21;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dsmat_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dsmat_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1371,13 +1379,13 @@ static bAnimChannelType ACF_DSMAT=
/* Lamp Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dslam_icon(bAnimListElem *ale)
+static int acf_dslam_icon(bAnimListElem *UNUSED(ale))
{
return ICON_LAMP_DATA;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dslam_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dslam_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1447,13 +1455,13 @@ static bAnimChannelType ACF_DSLAM=
/* Texture Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dstex_icon(bAnimListElem *ale)
+static int acf_dstex_icon(bAnimListElem *UNUSED(ale))
{
return ICON_TEXTURE_DATA;
}
/* offset for texture expanders */
-static short acf_dstex_offset(bAnimContext *ac, bAnimListElem *ale)
+static short acf_dstex_offset(bAnimContext *UNUSED(ac), bAnimListElem *ale)
{
short offset = 21;
@@ -1472,7 +1480,7 @@ static short acf_dstex_offset(bAnimContext *ac, bAnimListElem *ale)
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dstex_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dstex_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1542,13 +1550,13 @@ static bAnimChannelType ACF_DSTEX=
/* Camera Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dscam_icon(bAnimListElem *ale)
+static int acf_dscam_icon(bAnimListElem *UNUSED(ale))
{
return ICON_CAMERA_DATA;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dscam_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dscam_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1634,7 +1642,7 @@ static int acf_dscur_icon(bAnimListElem *ale)
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dscur_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dscur_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1704,13 +1712,13 @@ static bAnimChannelType ACF_DSCUR=
/* Shape Key Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dsskey_icon(bAnimListElem *ale)
+static int acf_dsskey_icon(bAnimListElem *UNUSED(ale))
{
return ICON_SHAPEKEY_DATA;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dsskey_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dsskey_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1780,13 +1788,13 @@ static bAnimChannelType ACF_DSSKEY=
/* World Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dswor_icon(bAnimListElem *ale)
+static int acf_dswor_icon(bAnimListElem *UNUSED(ale))
{
return ICON_WORLD_DATA;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dswor_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dswor_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1856,13 +1864,13 @@ static bAnimChannelType ACF_DSWOR=
/* Particle Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dspart_icon(bAnimListElem *ale)
+static int acf_dspart_icon(bAnimListElem *UNUSED(ale))
{
return ICON_PARTICLE_DATA;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dspart_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dspart_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1932,13 +1940,13 @@ static bAnimChannelType ACF_DSPART=
/* MetaBall Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dsmball_icon(bAnimListElem *ale)
+static int acf_dsmball_icon(bAnimListElem *UNUSED(ale))
{
return ICON_META_DATA;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dsmball_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dsmball_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -2008,13 +2016,13 @@ static bAnimChannelType ACF_DSMBALL=
/* Armature Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dsarm_icon(bAnimListElem *ale)
+static int acf_dsarm_icon(bAnimListElem *UNUSED(ale))
{
return ICON_ARMATURE_DATA;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dsarm_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dsarm_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -2084,13 +2092,13 @@ static bAnimChannelType ACF_DSARM=
/* NodeTree Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dsntree_icon(bAnimListElem *ale)
+static int acf_dsntree_icon(bAnimListElem *UNUSED(ale))
{
return ICON_NODETREE;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dsntree_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dsntree_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -2160,13 +2168,13 @@ static bAnimChannelType ACF_DSNTREE=
/* Mesh Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dsmesh_icon(bAnimListElem *ale)
+static int acf_dsmesh_icon(bAnimListElem *UNUSED(ale))
{
return ICON_MESH_DATA;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dsmesh_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dsmesh_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -2233,6 +2241,82 @@ static bAnimChannelType ACF_DSMESH=
acf_dsmesh_setting_ptr /* pointer for setting */
};
+/* Lattice Expander ------------------------------------------- */
+
+// TODO: just get this from RNA?
+static int acf_dslat_icon(bAnimListElem *UNUSED(ale))
+{
+ return ICON_LATTICE_DATA;
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_dslat_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ return LT_DS_EXPAND;
+
+ case ACHANNEL_SETTING_MUTE: /* mute (only in NLA) */
+ return ADT_NLA_EVAL_OFF;
+
+ case ACHANNEL_SETTING_VISIBLE: /* visible (only in Graph Editor) */
+ *neg= 1;
+ return ADT_CURVES_NOT_VISIBLE;
+
+ case ACHANNEL_SETTING_SELECT: /* selected */
+ return ADT_UI_SELECTED;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* get pointer to the setting */
+static void *acf_dslat_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ Lattice *lt= (Lattice *)ale->data;
+
+ /* clear extra return data first */
+ *type= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ GET_ACF_FLAG_PTR(lt->flag);
+
+ case ACHANNEL_SETTING_SELECT: /* selected */
+ case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */
+ case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */
+ if (lt->adt)
+ GET_ACF_FLAG_PTR(lt->adt->flag)
+ else
+ return NULL;
+
+ default: /* unsupported */
+ return NULL;
+ }
+}
+
+/* node tree expander type define */
+static bAnimChannelType ACF_DSLAT=
+{
+ "Lattice Expander", /* type name */
+
+ acf_generic_dataexpand_color, /* backdrop color */
+ acf_generic_dataexpand_backdrop,/* backdrop */
+ acf_generic_indention_1, /* indent level */ // XXX this only works for compositing
+ acf_generic_basic_offset, /* offset */
+
+ acf_generic_idblock_name, /* name */
+ acf_dslat_icon, /* icon */
+
+ acf_generic_dataexpand_setting_valid, /* has setting */
+ acf_dslat_setting_flag, /* flag for setting */
+ acf_dslat_setting_ptr /* pointer for setting */
+};
+
/* ShapeKey Entry ------------------------------------------- */
/* name for ShapeKey */
@@ -2244,14 +2328,14 @@ static void acf_shapekey_name(bAnimListElem *ale, char *name)
if (kb && name) {
/* if the KeyBlock had a name, use it, otherwise use the index */
if (kb->name[0])
- strcpy(name, kb->name);
+ BLI_strncpy(name, kb->name, ANIM_CHAN_NAME_SIZE);
else
- sprintf(name, "Key %d", ale->index);
+ BLI_snprintf(name, ANIM_CHAN_NAME_SIZE, "Key %d", ale->index);
}
}
/* check if some setting exists for this channel */
-static short acf_shapekey_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+static short acf_shapekey_setting_valid(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), int setting)
{
switch (setting) {
case ACHANNEL_SETTING_SELECT: /* selected */
@@ -2266,7 +2350,7 @@ static short acf_shapekey_setting_valid(bAnimContext *ac, bAnimListElem *ale, in
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_shapekey_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_shapekey_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -2323,126 +2407,154 @@ static bAnimChannelType ACF_SHAPEKEY=
acf_shapekey_setting_ptr /* pointer for setting */
};
-/* Grease Pencil entries ------------------------------------------- */
-// XXX ... this is currently not restored yet
+/* GPencil Datablock ------------------------------------------- */
-#if 0
-static void dummy_olddraw_gpencil ()
+/* get backdrop color for gpencil datablock widget */
+static void acf_gpd_color(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), float *color)
{
- /* determine what needs to be drawn */
- switch (ale->type) {
- case ANIMTYPE_GPDATABLOCK: /* gpencil datablock */
- {
- bGPdata *gpd = (bGPdata *)ale->data;
- ScrArea *sa = (ScrArea *)ale->owner; // XXX depreceated...
-
- indent = 0;
- group= 3;
+ /* these are ID-blocks, but not exactly standalone... */
+ UI_GetThemeColorShade3fv(TH_DOPESHEET_CHANNELSUBOB, 20, color);
+}
+
+// TODO: just get this from RNA?
+static int acf_gpd_icon(bAnimListElem *UNUSED(ale))
+{
+ return ICON_GREASEPENCIL;
+}
+
+/* check if some setting exists for this channel */
+static short acf_gpd_setting_valid(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), int setting)
+{
+ switch (setting) {
+ /* only select and expand supported */
+ case ACHANNEL_SETTING_SELECT:
+ case ACHANNEL_SETTING_EXPAND:
+ return 1;
- /* only show expand if there are any channels */
- if (gpd->layers.first) {
- if (gpd->flag & GP_DATA_EXPAND)
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
- }
+ default:
+ return 0;
+ }
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_gpd_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_SELECT: /* selected */
+ return AGRP_SELECTED;
- switch (sa->spacetype) {
- case SPACE_VIEW3D:
- {
- /* this shouldn't cause any overflow... */
- //sprintf(name, "View3D:%s", view3d_get_name(sa->spacedata.first)); // XXX missing func..
- strcpy(name, "View3D");
- special= ICON_VIEW3D;
- }
- break;
- case SPACE_NODE:
- {
- SpaceNode *snode= sa->spacedata.first;
- char treetype[12];
-
- if (snode->treetype == 1)
- strcpy(treetype, "Composite");
- else
- strcpy(treetype, "Material");
- sprintf(name, "Nodes:%s", treetype);
-
- special= ICON_NODETREE;
- }
- break;
- case SPACE_SEQ:
- {
- SpaceSeq *sseq= sa->spacedata.first;
- char imgpreview[10];
-
- switch (sseq->mainb) {
- case 1: sprintf(imgpreview, "Image..."); break;
- case 2: sprintf(imgpreview, "Luma..."); break;
- case 3: sprintf(imgpreview, "Chroma..."); break;
- case 4: sprintf(imgpreview, "Histogram"); break;
-
- default: sprintf(imgpreview, "Sequence"); break;
- }
- sprintf(name, "Sequencer:%s", imgpreview);
-
- special= ICON_SEQUENCE;
- }
- break;
- case SPACE_IMAGE:
- {
- SpaceImage *sima= sa->spacedata.first;
-
- if (sima->image)
- sprintf(name, "Image:%s", sima->image->id.name+2);
- else
- strcpy(name, "Image:<None>");
-
- special= ICON_IMAGE_COL;
- }
- break;
-
- default:
- {
- sprintf(name, "<Unknown GP-Data Source>");
- special= -1;
- }
- break;
- }
- }
- break;
- case ANIMTYPE_GPLAYER: /* gpencil layer */
- {
- bGPDlayer *gpl = (bGPDlayer *)ale->data;
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ return GP_DATA_EXPAND;
+ }
+
+ /* this shouldn't happen */
+ return 0;
+}
+
+/* get pointer to the setting */
+static void *acf_gpd_setting_ptr(bAnimListElem *ale, int UNUSED(setting), short *type)
+{
+ bGPdata *gpd= (bGPdata *)ale->data;
+
+ /* all flags are just in gpd->flag for now... */
+ GET_ACF_FLAG_PTR(gpd->flag);
+}
+
+/* gpencil datablock type define */
+static bAnimChannelType ACF_GPD =
+{
+ "GPencil Datablock", /* type name */
+
+ acf_gpd_color, /* backdrop color */
+ acf_group_backdrop, /* backdrop */
+ acf_generic_indention_0, /* indent level */
+ acf_generic_group_offset, /* offset */
+
+ acf_generic_idblock_name, /* name */
+ acf_gpd_icon, /* icon */
+
+ acf_gpd_setting_valid, /* has setting */
+ acf_gpd_setting_flag, /* flag for setting */
+ acf_gpd_setting_ptr /* pointer for setting */
+};
+
+/* GPencil Layer ------------------------------------------- */
+
+/* name for grase pencil layer entries */
+static void acf_gpl_name(bAnimListElem *ale, char *name)
+{
+ bGPDlayer *gpl = (bGPDlayer *)ale->data;
+
+ if (gpl && name)
+ BLI_strncpy(name, gpl->info, ANIM_CHAN_NAME_SIZE);
+}
+
+/* check if some setting exists for this channel */
+static short acf_gpl_setting_valid(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), int setting)
+{
+ switch (setting) {
+ /* unsupported */
+ case ACHANNEL_SETTING_EXPAND: /* gpencil layers are more like F-Curves than groups */
+ case ACHANNEL_SETTING_VISIBLE: /* graph editor only */
+ return 0;
+
+ /* always available */
+ default:
+ return 1;
+ }
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_gpl_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_SELECT: /* selected */
+ return GP_LAYER_SELECT;
- indent = 0;
- special = -1;
- expand = -1;
- group = 1;
+ case ACHANNEL_SETTING_MUTE: /* muted */
+ return GP_LAYER_HIDE;
- if (EDITABLE_GPL(gpl))
- protect = ICON_UNLOCKED;
- else
- protect = ICON_LOCKED;
-
- if (gpl->flag & GP_LAYER_HIDE)
- mute = ICON_MUTE_IPO_ON;
- else
- mute = ICON_MUTE_IPO_OFF;
+ case ACHANNEL_SETTING_PROTECT: /* protected */
+ //*neg= 1; - if we change this to edtiability
+ return GP_LAYER_LOCKED;
- sel = SEL_GPL(gpl);
- BLI_snprintf(name, 32, gpl->info);
- }
- break;
- }
-
- if (group == 3) {
- /* only for gp-data channels */
- UI_ThemeColorShade(TH_GROUP, 20);
- uiSetRoundBox((expand == ICON_TRIA_DOWN)? (1):(1|8));
- gl_round_box(GL_POLYGON, x+offset, yminc, (float)ACHANNEL_NAMEWIDTH, ymaxc, 8);
+ default: /* unsupported */
+ return 0;
}
}
-#endif
+
+/* get pointer to the setting */
+static void *acf_gpl_setting_ptr(bAnimListElem *ale, int UNUSED(setting), short *type)
+{
+ bGPDlayer *gpl= (bGPDlayer *)ale->data;
+
+ /* all flags are just in agrp->flag for now... */
+ GET_ACF_FLAG_PTR(gpl->flag);
+}
+
+/* grease pencil layer type define */
+static bAnimChannelType ACF_GPL =
+{
+ "GPencil Layer", /* type name */
+
+ acf_generic_channel_color, /* backdrop color */
+ acf_generic_channel_backdrop, /* backdrop */
+ acf_generic_indention_flexible, /* indent level */
+ acf_generic_group_offset, /* offset */
+
+ acf_gpl_name, /* name */
+ NULL, /* icon */
+
+ acf_gpl_setting_valid, /* has setting */
+ acf_gpl_setting_flag, /* flag for setting */
+ acf_gpl_setting_ptr /* pointer for setting */
+};
/* *********************************************** */
/* Type Registration and General Access */
@@ -2489,12 +2601,12 @@ void ANIM_init_channel_typeinfo_data (void)
animchannelTypeInfo[type++]= &ACF_DSARM; /* Armature Channel */
animchannelTypeInfo[type++]= &ACF_DSMESH; /* Mesh Channel */
animchannelTypeInfo[type++]= &ACF_DSTEX; /* Texture Channel */
+ animchannelTypeInfo[type++]= &ACF_DSLAT; /* Lattice Channel */
animchannelTypeInfo[type++]= &ACF_SHAPEKEY; /* ShapeKey */
- // XXX not restored yet
- animchannelTypeInfo[type++]= NULL; /* Grease Pencil Datablock */
- animchannelTypeInfo[type++]= NULL; /* Grease Pencil Layer */
+ animchannelTypeInfo[type++]= &ACF_GPD; /* Grease Pencil Datablock */
+ animchannelTypeInfo[type++]= &ACF_GPL; /* Grease Pencil Layer */
// TODO: these types still need to be implemented!!!
// probably need a few extra flags for these special cases...
@@ -2533,14 +2645,14 @@ void ANIM_channel_debug_print_info (bAnimListElem *ale, short indent_level)
/* print info */
if (acf) {
- char name[256]; /* hopefully this will be enough! */
+ char name[ANIM_CHAN_NAME_SIZE]; /* hopefully this will be enough! */
/* get UI name */
if (acf->name)
acf->name(ale, name);
else
- sprintf(name, "<No name>");
-
+ BLI_strncpy(name, "<No name>", sizeof(name));
+
/* print type name + ui name */
printf("ChanType: <%s> Name: \"%s\"\n", acf->channel_type_name, name);
}
@@ -2772,7 +2884,7 @@ void ANIM_channel_draw (bAnimContext *ac, bAnimListElem *ale, float yminc, float
/* step 5) draw name ............................................... */
if (acf->name) {
- char name[256]; /* hopefully this will be enough! */
+ char name[ANIM_CHAN_NAME_SIZE]; /* hopefully this will be enough! */
/* set text color */
if (selected)
@@ -2785,6 +2897,17 @@ void ANIM_channel_draw (bAnimContext *ac, bAnimListElem *ale, float yminc, float
offset += 3;
UI_DrawString(offset, ytext, name);
+
+ /* draw red underline if channel is disabled */
+ if ((ale->type == ANIMTYPE_FCURVE) && (ale->flag & FCURVE_DISABLED))
+ {
+ // FIXME: replace hardcoded color here, and check on extents!
+ glColor3f(1.0f, 0.0f, 0.0f);
+ glLineWidth(2.0);
+ fdrawline((float)(offset), yminc,
+ (float)(v2d->cur.xmax), yminc);
+ glLineWidth(1.0);
+ }
}
/* step 6) draw backdrops behidn mute+protection toggles + (sliders) ....................... */
@@ -2851,7 +2974,7 @@ void ANIM_channel_draw (bAnimContext *ac, bAnimListElem *ale, float yminc, float
/* ------------------ */
/* callback for (normal) widget settings - send notifiers */
-static void achannel_setting_widget_cb(bContext *C, void *poin, void *poin2)
+static void achannel_setting_widget_cb(bContext *C, void *UNUSED(arg1), void *UNUSED(arg2))
{
WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
}
@@ -2905,6 +3028,7 @@ static void achannel_setting_slider_cb(bContext *C, void *id_poin, void *fcu_poi
ID *id= (ID *)id_poin;
FCurve *fcu= (FCurve *)fcu_poin;
+ ReportList *reports = CTX_wm_reports(C);
Scene *scene= CTX_data_scene(C);
PointerRNA id_ptr, ptr;
PropertyRNA *prop;
@@ -2928,7 +3052,7 @@ static void achannel_setting_slider_cb(bContext *C, void *id_poin, void *fcu_poi
flag |= INSERTKEY_REPLACE;
/* insert a keyframe for this F-Curve */
- done= insert_keyframe_direct(ptr, prop, fcu, cfra, flag);
+ done= insert_keyframe_direct(reports, ptr, prop, fcu, cfra, flag);
if (done)
WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
@@ -2942,6 +3066,7 @@ static void achannel_setting_slider_shapekey_cb(bContext *C, void *key_poin, voi
KeyBlock *kb= (KeyBlock *)kb_poin;
char *rna_path= key_get_curValue_rnaPath(key, kb);
+ ReportList *reports = CTX_wm_reports(C);
Scene *scene= CTX_data_scene(C);
PointerRNA id_ptr, ptr;
PropertyRNA *prop;
@@ -2970,7 +3095,7 @@ static void achannel_setting_slider_shapekey_cb(bContext *C, void *key_poin, voi
flag |= INSERTKEY_REPLACE;
/* insert a keyframe for this F-Curve */
- done= insert_keyframe_direct(ptr, prop, fcu, cfra, flag);
+ done= insert_keyframe_direct(reports, ptr, prop, fcu, cfra, flag);
if (done)
WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
@@ -2987,7 +3112,7 @@ static void draw_setting_widget (bAnimContext *ac, bAnimListElem *ale, bAnimChan
short negflag, ptrsize, enabled, butType;
int flag, icon;
void *ptr;
- char *tooltip;
+ const char *tooltip;
uiBut *but = NULL;
/* get the flag and the pointer to that flag */
@@ -3239,7 +3364,7 @@ void ANIM_channel_draw_widgets (bAnimContext *ac, bAnimListElem *ale, uiBlock *b
uiBut *but;
/* create the slider button, and assign relevant callback to ensure keyframes are inserted... */
- but= uiDefAutoButR(block, &ptr, prop, array_index, "", 0, (int)v2d->cur.xmax-offset, ymid, SLIDER_WIDTH, (int)ymaxc-yminc);
+ but= uiDefAutoButR(block, &ptr, prop, array_index, "", ICON_NULL, (int)v2d->cur.xmax-offset, ymid, SLIDER_WIDTH, (int)ymaxc-yminc);
/* assign keyframing function according to slider type */
if (ale->type == ANIMTYPE_SHAPEKEY)
diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c
index e229de42006..31209459bde 100644
--- a/source/blender/editors/animation/anim_channels_edit.c
+++ b/source/blender/editors/animation/anim_channels_edit.c
@@ -25,9 +25,15 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "DNA_anim_types.h"
#include "DNA_object_types.h"
@@ -110,6 +116,8 @@ void ANIM_set_active_channel (bAnimContext *ac, void *data, short datatype, int
case ANIMTYPE_DSMBALL:
case ANIMTYPE_DSARM:
case ANIMTYPE_DSMESH:
+ case ANIMTYPE_DSTEX:
+ case ANIMTYPE_DSLAT:
{
/* need to verify that this data is valid for now */
if (ale->adt) {
@@ -153,8 +161,10 @@ void ANIM_set_active_channel (bAnimContext *ac, void *data, short datatype, int
case ANIMTYPE_DSMBALL:
case ANIMTYPE_DSARM:
case ANIMTYPE_DSMESH:
+ case ANIMTYPE_DSLAT:
{
/* need to verify that this data is valid for now */
+ // XXX: ale may be null!
if (ale->adt)
ale->adt->flag |= ADT_UI_ACTIVE;
}
@@ -229,11 +239,17 @@ void ANIM_deselect_anim_channels (bAnimContext *ac, void *data, short datatype,
case ANIMTYPE_DSMESH:
case ANIMTYPE_DSNTREE:
case ANIMTYPE_DSTEX:
+ case ANIMTYPE_DSLAT:
{
if ((ale->adt) && (ale->adt->flag & ADT_UI_SELECTED))
sel= ACHANNEL_SETFLAG_CLEAR;
}
break;
+
+ case ANIMTYPE_GPLAYER:
+ if (ale->flag & GP_LAYER_SELECT)
+ sel= ACHANNEL_SETFLAG_CLEAR;
+ break;
}
}
}
@@ -312,6 +328,7 @@ void ANIM_deselect_anim_channels (bAnimContext *ac, void *data, short datatype,
case ANIMTYPE_DSMESH:
case ANIMTYPE_DSNTREE:
case ANIMTYPE_DSTEX:
+ case ANIMTYPE_DSLAT:
{
/* need to verify that this data is valid for now */
if (ale->adt) {
@@ -320,6 +337,14 @@ void ANIM_deselect_anim_channels (bAnimContext *ac, void *data, short datatype,
}
}
break;
+
+ case ANIMTYPE_GPLAYER:
+ {
+ bGPDlayer *gpl = (bGPDlayer *)ale->data;
+
+ ACHANNEL_SET_FLAG(gpl, sel, GP_LAYER_SELECT);
+ }
+ break;
}
}
@@ -462,7 +487,7 @@ void ANIM_flush_setting_anim_channels (bAnimContext *ac, ListBase *anim_data, bA
break;
/* store this level as the 'old' level now */
- prevLevel= level;
+ prevLevel= level; // XXX: prevLevel is unused
}
}
}
@@ -541,132 +566,65 @@ int animedit_poll_channels_nla_tweakmode_off (bContext *C)
}
/* ****************** Rearrange Channels Operator ******************* */
-/* This operator only works for Action Editor mode for now, as having it elsewhere makes things difficult */
-
-#if 0 // XXX old animation system - needs to be updated for new system...
/* constants for channel rearranging */
/* WARNING: don't change exising ones without modifying rearrange func accordingly */
enum {
- REARRANGE_ACTCHAN_TOP= -2,
- REARRANGE_ACTCHAN_UP= -1,
- REARRANGE_ACTCHAN_DOWN= 1,
- REARRANGE_ACTCHAN_BOTTOM= 2
+ REARRANGE_ANIMCHAN_TOP= -2,
+ REARRANGE_ANIMCHAN_UP= -1,
+ REARRANGE_ANIMCHAN_DOWN= 1,
+ REARRANGE_ANIMCHAN_BOTTOM= 2
};
-/* make sure all action-channels belong to a group (and clear action's list) */
-static void split_groups_action_temp (bAction *act, bActionGroup *tgrp)
-{
- bActionChannel *achan;
- bActionGroup *agrp;
-
- /* Separate action-channels into lists per group */
- for (agrp= act->groups.first; agrp; agrp= agrp->next) {
- if (agrp->channels.first) {
- achan= agrp->channels.last;
- act->chanbase.first= achan->next;
-
- achan= agrp->channels.first;
- achan->prev= NULL;
-
- achan= agrp->channels.last;
- achan->next= NULL;
- }
- }
-
- /* Initialise memory for temp-group */
- memset(tgrp, 0, sizeof(bActionGroup));
- tgrp->flag |= (AGRP_EXPANDED|AGRP_TEMP);
- strcpy(tgrp->name, "#TempGroup");
-
- /* Move any action-channels not already moved, to the temp group */
- if (act->chanbase.first) {
- /* start of list */
- achan= act->chanbase.first;
- achan->prev= NULL;
- tgrp->channels.first= achan;
- act->chanbase.first= NULL;
-
- /* end of list */
- achan= act->chanbase.last;
- achan->next= NULL;
- tgrp->channels.last= achan;
- act->chanbase.last= NULL;
- }
-
- /* Add temp-group to list */
- BLI_addtail(&act->groups, tgrp);
-}
+/* defines for rearranging channels */
+EnumPropertyItem prop_animchannel_rearrange_types[] = {
+ {REARRANGE_ANIMCHAN_TOP, "TOP", 0, "To Top", ""},
+ {REARRANGE_ANIMCHAN_UP, "UP", 0, "Up", ""},
+ {REARRANGE_ANIMCHAN_DOWN, "DOWN", 0, "Down", ""},
+ {REARRANGE_ANIMCHAN_BOTTOM, "BOTTOM", 0, "To Bottom", ""},
+ {0, NULL, 0, NULL, NULL}
+};
-/* link lists of channels that groups have */
-static void join_groups_action_temp (bAction *act)
-{
- bActionGroup *agrp;
- bActionChannel *achan;
-
- for (agrp= act->groups.first; agrp; agrp= agrp->next) {
- ListBase tempGroup;
-
- /* add list of channels to action's channels */
- tempGroup= agrp->channels;
- addlisttolist(&act->chanbase, &agrp->channels);
- agrp->channels= tempGroup;
-
- /* clear moved flag */
- agrp->flag &= ~AGRP_MOVED;
-
- /* if temp-group... remove from list (but don't free as it's on the stack!) */
- if (agrp->flag & AGRP_TEMP) {
- BLI_remlink(&act->groups, agrp);
- break;
- }
- }
+/* Reordering "Islands" Defines ----------------------------------- */
+
+/* Island definition - just a listbase container */
+typedef struct tReorderChannelIsland {
+ struct tReorderChannelIsland *next, *prev;
- /* clear "moved" flag from all achans */
- for (achan= act->chanbase.first; achan; achan= achan->next)
- achan->flag &= ~ACHAN_MOVED;
-}
+ ListBase channels; /* channels within this region with the same state */
+ int flag; /* eReorderIslandFlag */
+} tReorderChannelIsland;
+/* flags for channel reordering islands */
+typedef enum eReorderIslandFlag {
+ REORDER_ISLAND_SELECTED = (1<<0), /* island is selected */
+ REORDER_ISLAND_UNTOUCHABLE = (1<<1), /* island should be ignored */
+ REORDER_ISLAND_MOVED = (1<<2) /* island has already been moved */
+} eReorderIslandFlag;
-static short rearrange_actchannel_is_ok (Link *channel, short type)
-{
- if (type == ANIMTYPE_GROUP) {
- bActionGroup *agrp= (bActionGroup *)channel;
-
- if (SEL_AGRP(agrp) && !(agrp->flag & AGRP_MOVED))
- return 1;
- }
- else if (type == ANIMTYPE_ACHAN) {
- bActionChannel *achan= (bActionChannel *)channel;
-
- if (VISIBLE_ACHAN(achan) && SEL_ACHAN(achan) && !(achan->flag & ACHAN_MOVED))
- return 1;
- }
-
- return 0;
-}
-static short rearrange_actchannel_after_ok (Link *channel, short type)
+/* Rearrange Methods --------------------------------------------- */
+
+static short rearrange_island_ok (tReorderChannelIsland *island)
{
- if (type == ANIMTYPE_GROUP) {
- bActionGroup *agrp= (bActionGroup *)channel;
-
- if (agrp->flag & AGRP_TEMP)
- return 0;
- }
+ /* island must not be untouchable */
+ if (island->flag & REORDER_ISLAND_UNTOUCHABLE)
+ return 0;
- return 1;
+ /* island should be selected to be moved */
+ return (island->flag & REORDER_ISLAND_SELECTED) && !(island->flag & REORDER_ISLAND_MOVED);
}
+/* ............................. */
-static short rearrange_actchannel_top (ListBase *list, Link *channel, short type)
+static short rearrange_island_top (ListBase *list, tReorderChannelIsland *island)
{
- if (rearrange_actchannel_is_ok(channel, type)) {
- /* take it out off the chain keep data */
- BLI_remlink(list, channel);
+ if (rearrange_island_ok(island)) {
+ /* remove from current position */
+ BLI_remlink(list, island);
/* make it first element */
- BLI_insertlinkbefore(list, list->first, channel);
+ BLI_insertlinkbefore(list, list->first, island);
return 1;
}
@@ -674,17 +632,18 @@ static short rearrange_actchannel_top (ListBase *list, Link *channel, short type
return 0;
}
-static short rearrange_actchannel_up (ListBase *list, Link *channel, short type)
+static short rearrange_island_up (ListBase *list, tReorderChannelIsland *island)
{
- if (rearrange_actchannel_is_ok(channel, type)) {
- Link *prev= channel->prev;
+ if (rearrange_island_ok(island)) {
+ /* moving up = moving before the previous island, otherwise we're in the same place */
+ tReorderChannelIsland *prev= island->prev;
if (prev) {
- /* take it out off the chain keep data */
- BLI_remlink(list, channel);
+ /* remove from current position */
+ BLI_remlink(list, island);
/* push it up */
- BLI_insertlinkbefore(list, prev, channel);
+ BLI_insertlinkbefore(list, prev, island);
return 1;
}
@@ -693,235 +652,442 @@ static short rearrange_actchannel_up (ListBase *list, Link *channel, short type)
return 0;
}
-static short rearrange_actchannel_down (ListBase *list, Link *channel, short type)
+static short rearrange_island_down (ListBase *list, tReorderChannelIsland *island)
{
- if (rearrange_actchannel_is_ok(channel, type)) {
- Link *next = (channel->next) ? channel->next->next : NULL;
+ if (rearrange_island_ok(island)) {
+ /* moving down = moving after the next island, otherwise we're in the same place */
+ tReorderChannelIsland *next = island->next;
if (next) {
- /* take it out off the chain keep data */
- BLI_remlink(list, channel);
-
- /* move it down */
- BLI_insertlinkbefore(list, next, channel);
-
- return 1;
- }
- else if (rearrange_actchannel_after_ok(list->last, type)) {
- /* take it out off the chain keep data */
- BLI_remlink(list, channel);
-
- /* add at end */
- BLI_addtail(list, channel);
-
- return 1;
- }
- else {
- /* take it out off the chain keep data */
- BLI_remlink(list, channel);
-
- /* add just before end */
- BLI_insertlinkbefore(list, list->last, channel);
-
- return 1;
+ /* can only move past if next is not untouchable (i.e. nothing can go after it) */
+ if ((next->flag & REORDER_ISLAND_UNTOUCHABLE)==0) {
+ /* remove from current position */
+ BLI_remlink(list, island);
+
+ /* push it down */
+ BLI_insertlinkafter(list, next, island);
+
+ return 1;
+ }
}
+ /* else: no next channel, so we're at the bottom already, so can't move */
}
return 0;
}
-static short rearrange_actchannel_bottom (ListBase *list, Link *channel, short type)
+static short rearrange_island_bottom (ListBase *list, tReorderChannelIsland *island)
{
- if (rearrange_actchannel_is_ok(channel, type)) {
- if (rearrange_actchannel_after_ok(list->last, type)) {
- /* take it out off the chain keep data */
- BLI_remlink(list, channel);
-
- /* add at end */
- BLI_addtail(list, channel);
+ if (rearrange_island_ok(island)) {
+ tReorderChannelIsland *last = list->last;
+
+ /* remove island from current position */
+ BLI_remlink(list, island);
+
+ /* add before or after the last channel? */
+ if ((last->flag & REORDER_ISLAND_UNTOUCHABLE)==0) {
+ /* can add after it */
+ BLI_addtail(list, island);
+ }
+ else {
+ /* can at most go just before it, since last cannot be moved */
+ BLI_insertlinkbefore(list, last, island);
- return 1;
}
+
+ return 1;
}
return 0;
}
+/* ............................. */
-/* Change the order of action-channels
- * mode: REARRANGE_ACTCHAN_*
+/* typedef for channel rearranging function
+ * < list: list that channels belong to
+ * < island: island to be moved
+ * > return[0]: whether operation was a success
*/
-static void rearrange_action_channels (bAnimContext *ac, short mode)
+typedef short (*AnimChanRearrangeFp)(ListBase *list, tReorderChannelIsland *island);
+
+/* get rearranging function, given 'rearrange' mode */
+static AnimChanRearrangeFp rearrange_get_mode_func (short mode)
{
- bAction *act;
- bActionChannel *achan, *chan;
- bActionGroup *agrp, *grp;
- bActionGroup tgrp;
-
- short (*rearrange_func)(ListBase *, Link *, short);
- short do_channels = 1;
-
- /* Get the active action, exit if none are selected */
- act= (bAction *)ac->data;
-
- /* exit if invalid mode */
switch (mode) {
- case REARRANGE_ACTCHAN_TOP:
- rearrange_func= rearrange_actchannel_top;
- break;
- case REARRANGE_ACTCHAN_UP:
- rearrange_func= rearrange_actchannel_up;
+ case REARRANGE_ANIMCHAN_TOP:
+ return rearrange_island_top;
+ case REARRANGE_ANIMCHAN_UP:
+ return rearrange_island_up;
+ case REARRANGE_ANIMCHAN_DOWN:
+ return rearrange_island_down;
+ case REARRANGE_ANIMCHAN_BOTTOM:
+ return rearrange_island_bottom;
+ default:
+ return NULL;
+ }
+}
+
+/* Rearrange Islands Generics ------------------------------------- */
+
+/* add channel into list of islands */
+static void rearrange_animchannel_add_to_islands (ListBase *islands, ListBase *srcList, Link *channel, short type)
+{
+ tReorderChannelIsland *island = islands->last; /* always try to add to last island if possible */
+ short is_sel=0, is_untouchable=0;
+
+ /* get flags - selected and untouchable from the channel */
+ switch (type) {
+ case ANIMTYPE_GROUP:
+ {
+ bActionGroup *agrp= (bActionGroup *)channel;
+
+ is_sel= SEL_AGRP(agrp);
+ is_untouchable= (agrp->flag & AGRP_TEMP) != 0;
+ }
break;
- case REARRANGE_ACTCHAN_DOWN:
- rearrange_func= rearrange_actchannel_down;
+ case ANIMTYPE_FCURVE:
+ {
+ FCurve *fcu= (FCurve *)channel;
+
+ is_sel= SEL_FCU(fcu);
+ }
break;
- case REARRANGE_ACTCHAN_BOTTOM:
- rearrange_func= rearrange_actchannel_bottom;
+ case ANIMTYPE_NLATRACK:
+ {
+ NlaTrack *nlt= (NlaTrack *)channel;
+
+ is_sel= SEL_NLT(nlt);
+ }
break;
+
default:
+ printf("rearrange_animchannel_add_to_islands(): don't know how to handle channels of type %d\n", type);
return;
}
- /* make sure we're only operating with groups */
- split_groups_action_temp(act, &tgrp);
+ /* do we need to add to a new island? */
+ if ((island == NULL) || /* 1) no islands yet */
+ ((island->flag & REORDER_ISLAND_SELECTED) == 0) || /* 2) unselected islands have single channels only - to allow up/down movement */
+ (is_sel == 0)) /* 3) if channel is unselected, stop existing island (it was either wrong sel status, or full already) */
+ {
+ /* create a new island now */
+ island = MEM_callocN(sizeof(tReorderChannelIsland), "tReorderChannelIsland");
+ BLI_addtail(islands, island);
+
+ if (is_sel)
+ island->flag |= REORDER_ISLAND_SELECTED;
+ if (is_untouchable)
+ island->flag |= REORDER_ISLAND_UNTOUCHABLE;
+ }
+
+ /* add channel to island - need to remove it from its existing list first though */
+ BLI_remlink(srcList, channel);
+ BLI_addtail(&island->channels, channel);
+}
+
+/* flatten islands out into a single list again */
+static void rearrange_animchannel_flatten_islands (ListBase *islands, ListBase *srcList)
+{
+ tReorderChannelIsland *island, *isn=NULL;
- /* rearrange groups first (and then, only consider channels if the groups weren't moved) */
- #define GET_FIRST(list) ((mode > 0) ? (list.first) : (list.last))
- #define GET_NEXT(item) ((mode > 0) ? (item->next) : (item->prev))
+ /* make sure srcList is empty now */
+ BLI_assert(srcList->first == NULL);
- for (agrp= GET_FIRST(act->groups); agrp; agrp= grp) {
- /* Get next group to consider */
- grp= GET_NEXT(agrp);
+ /* go through merging islands */
+ for (island = islands->first; island; island = isn) {
+ isn = island->next;
- /* try to do group first */
- if (rearrange_func(&act->groups, (Link *)agrp, ANIMTYPE_GROUP)) {
- do_channels= 0;
- agrp->flag |= AGRP_MOVED;
- }
+ /* merge island channels back to main list, then delete the island */
+ BLI_movelisttolist(srcList, &island->channels);
+ BLI_freelinkN(islands, island);
+ }
+}
+
+/* ............................. */
+
+/* performing rearranging of channels using islands */
+static short rearrange_animchannel_islands (ListBase *list, AnimChanRearrangeFp rearrange_func, short mode, short type)
+{
+ ListBase islands = {NULL, NULL};
+ Link *channel, *chanNext=NULL;
+ short done = 0;
+
+ /* don't waste effort on an empty list */
+ if (list->first == NULL)
+ return 0;
+
+ /* group channels into islands */
+ for (channel = list->first; channel; channel = chanNext) {
+ chanNext = channel->next;
+ rearrange_animchannel_add_to_islands(&islands, list, channel, type);
}
- if (do_channels) {
- for (agrp= GET_FIRST(act->groups); agrp; agrp= grp) {
- /* Get next group to consider */
- grp= GET_NEXT(agrp);
+ /* perform moving of selected islands now, but only if there is more than one of 'em so that something will happen
+ * - scanning of the list is performed in the opposite direction to the direction we're moving things, so that we
+ * shouldn't need to encounter items we've moved already
+ */
+ if (islands.first != islands.last) {
+ tReorderChannelIsland *first = (mode > 0) ? islands.last : islands.first;
+ tReorderChannelIsland *island, *isn=NULL;
+
+ for (island = first; island; island = isn) {
+ isn = (mode > 0) ? island->prev : island->next;
- /* only consider action-channels if they're visible (group expanded) */
- if (EXPANDED_AGRP(agrp)) {
- for (achan= GET_FIRST(agrp->channels); achan; achan= chan) {
- /* Get next channel to consider */
- chan= GET_NEXT(achan);
-
- /* Try to do channel */
- if (rearrange_func(&agrp->channels, (Link *)achan, ANIMTYPE_ACHAN))
- achan->flag |= ACHAN_MOVED;
- }
+ /* perform rearranging */
+ if (rearrange_func(&islands, island)) {
+ island->flag |= REORDER_ISLAND_MOVED;
+ done = 1;
}
}
}
- #undef GET_FIRST
- #undef GET_NEXT
- /* assemble lists into one list (and clear moved tags) */
- join_groups_action_temp(act);
+ /* ungroup islands */
+ rearrange_animchannel_flatten_islands(&islands, list);
+
+ /* did we do anything? */
+ return done;
}
-/* ------------------- */
+/* NLA Specific Stuff ----------------------------------------------------- */
-static int animchannels_rearrange_exec(bContext *C, wmOperator *op)
+/* Change the order NLA Tracks within NLA Stack
+ * ! NLA tracks are displayed in opposite order, so directions need care
+ * mode: REARRANGE_ANIMCHAN_*
+ */
+static void rearrange_nla_channels (bAnimContext *UNUSED(ac), AnimData *adt, short mode)
{
- bAnimContext ac;
- short mode;
+ AnimChanRearrangeFp rearrange_func;
- /* get editor data - only for Action Editor (for now) */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
- if (ac.datatype != ANIMCONT_ACTION)
- return OPERATOR_PASS_THROUGH;
-
- /* get mode, then rearrange channels */
- mode= RNA_enum_get(op->ptr, "direction");
- rearrange_action_channels(&ac, mode);
+ /* hack: invert mode so that functions will work in right order */
+ mode *= -1;
- /* send notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
+ /* get rearranging function */
+ rearrange_func = rearrange_get_mode_func(mode);
+ if (rearrange_func == NULL)
+ return;
- return OPERATOR_FINISHED;
+ /* only consider NLA data if it's accessible */
+ //if (EXPANDED_DRVD(adt) == 0)
+ // return;
+
+ /* perform rearranging on tracks list */
+ rearrange_animchannel_islands(&adt->nla_tracks, rearrange_func, mode, ANIMTYPE_NLATRACK);
}
-
-void ANIM_OT_channels_move_up (wmOperatorType *ot)
+/* Drivers Specific Stuff ------------------------------------------------- */
+
+/* Change the order drivers within AnimData block
+ * mode: REARRANGE_ANIMCHAN_*
+ */
+static void rearrange_driver_channels (bAnimContext *UNUSED(ac), AnimData *adt, short mode)
{
- /* identifiers */
- ot->name= "Move Channel(s) Up";
- ot->idname= "ANIM_OT_channels_move_up";
+ /* get rearranging function */
+ AnimChanRearrangeFp rearrange_func = rearrange_get_mode_func(mode);
- /* api callbacks */
- ot->exec= animchannels_rearrange_exec;
- ot->poll= ED_operator_areaactive;
+ if (rearrange_func == NULL)
+ return;
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ /* only consider drivers if they're accessible */
+ if (EXPANDED_DRVD(adt) == 0)
+ return;
- /* props */
- RNA_def_enum(ot->srna, "direction", NULL /* XXX add enum for this */, REARRANGE_ACTCHAN_UP, "Direction", "");
+ /* perform rearranging on drivers list (drivers are really just F-Curves) */
+ rearrange_animchannel_islands(&adt->drivers, rearrange_func, mode, ANIMTYPE_FCURVE);
}
-void ANIM_OT_channels_move_down (wmOperatorType *ot)
+/* Action Specific Stuff ------------------------------------------------- */
+
+/* make sure all action-channels belong to a group (and clear action's list) */
+static void split_groups_action_temp (bAction *act, bActionGroup *tgrp)
{
- /* identifiers */
- ot->name= "Move Channel(s) Down";
- ot->idname= "ANIM_OT_channels_move_down";
+ bActionGroup *agrp;
+ FCurve *fcu;
- /* api callbacks */
- ot->exec= animchannels_rearrange_exec;
- ot->poll= ED_operator_areaactive;
+ if (act == NULL)
+ return;
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ /* Separate F-Curves into lists per group */
+ for (agrp= act->groups.first; agrp; agrp= agrp->next) {
+ if (agrp->channels.first) {
+ fcu= agrp->channels.last;
+ act->curves.first= fcu->next;
+
+ fcu= agrp->channels.first;
+ fcu->prev= NULL;
+
+ fcu= agrp->channels.last;
+ fcu->next= NULL;
+ }
+ }
- /* props */
- RNA_def_enum(ot->srna, "direction", NULL /* XXX add enum for this */, REARRANGE_ACTCHAN_DOWN, "Direction", "");
+ /* Initialise memory for temp-group */
+ memset(tgrp, 0, sizeof(bActionGroup));
+ tgrp->flag |= (AGRP_EXPANDED|AGRP_TEMP);
+ BLI_strncpy(tgrp->name, "#TempGroup", sizeof(tgrp->name));
+
+ /* Move any action-channels not already moved, to the temp group */
+ if (act->curves.first) {
+ /* start of list */
+ fcu= act->curves.first;
+ fcu->prev= NULL;
+ tgrp->channels.first= fcu;
+ act->curves.first= NULL;
+
+ /* end of list */
+ fcu= act->curves.last;
+ fcu->next= NULL;
+ tgrp->channels.last= fcu;
+ act->curves.last= NULL;
+ }
+
+ /* Add temp-group to list */
+ BLI_addtail(&act->groups, tgrp);
}
-void ANIM_OT_channels_move_top (wmOperatorType *ot)
+/* link lists of channels that groups have */
+static void join_groups_action_temp (bAction *act)
{
- /* identifiers */
- ot->name= "Move Channel(s) to Top";
- ot->idname= "ANIM_OT_channels_move_to_top";
+ bActionGroup *agrp;
- /* api callbacks */
- ot->exec= animchannels_rearrange_exec;
- ot->poll= ED_operator_areaactive;
+ for (agrp= act->groups.first; agrp; agrp= agrp->next) {
+ ListBase tempGroup;
+
+ /* add list of channels to action's channels */
+ tempGroup= agrp->channels;
+ BLI_movelisttolist(&act->curves, &agrp->channels);
+ agrp->channels= tempGroup;
+
+ /* clear moved flag */
+ agrp->flag &= ~AGRP_MOVED;
+
+ /* if temp-group... remove from list (but don't free as it's on the stack!) */
+ if (agrp->flag & AGRP_TEMP) {
+ BLI_remlink(&act->groups, agrp);
+ break;
+ }
+ }
+}
+
+/* Change the order of anim-channels within action
+ * mode: REARRANGE_ANIMCHAN_*
+ */
+static void rearrange_action_channels (bAnimContext *ac, bAction *act, short mode)
+{
+ bActionGroup tgrp;
+ short do_channels;
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ /* get rearranging function */
+ AnimChanRearrangeFp rearrange_func = rearrange_get_mode_func(mode);
- /* props */
- RNA_def_enum(ot->srna, "direction", NULL /* XXX add enum for this */, REARRANGE_ACTCHAN_TOP, "Direction", "");
+ if (rearrange_func == NULL)
+ return;
+
+ /* make sure we're only operating with groups (vs a mixture of groups+curves) */
+ split_groups_action_temp(act, &tgrp);
+
+ /* rearrange groups first
+ * - the group's channels will only get considered if nothing happened when rearranging the groups
+ * i.e. the rearrange function returned 0
+ */
+ do_channels = rearrange_animchannel_islands(&act->groups, rearrange_func, mode, ANIMTYPE_GROUP) == 0;
+
+ if (do_channels) {
+ bActionGroup *agrp;
+
+ for (agrp= act->groups.first; agrp; agrp= agrp->next) {
+ /* only consider F-Curves if they're visible (group expanded) */
+ if (EXPANDED_AGRP(agrp)) {
+ rearrange_animchannel_islands(&agrp->channels, rearrange_func, mode, ANIMTYPE_FCURVE);
+ }
+ }
+ }
+
+ /* assemble lists into one list (and clear moved tags) */
+ join_groups_action_temp(act);
+}
+
+/* ------------------- */
+
+static int animchannels_rearrange_exec(bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ short mode;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get mode */
+ mode= RNA_enum_get(op->ptr, "direction");
+
+ /* get animdata blocks */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_ANIMDATA);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ AnimData *adt= ale->data;
+
+ switch (ac.datatype) {
+ case ANIMCONT_NLA: /* NLA-tracks only */
+ rearrange_nla_channels(&ac, adt, mode);
+ break;
+
+ case ANIMCONT_DRIVERS: /* Drivers list only */
+ rearrange_driver_channels(&ac, adt, mode);
+ break;
+
+ case ANIMCONT_GPENCIL: /* Grease Pencil channels */
+ // FIXME: this case probably needs to get moved out of here or treated specially...
+ printf("grease pencil not supported for moving yet\n");
+ break;
+
+ case ANIMCONT_SHAPEKEY: // DOUBLE CHECK ME...
+
+ default: /* some collection of actions */
+ // FIXME: actions should only be considered once!
+ if (adt->action)
+ rearrange_action_channels(&ac, adt->action, mode);
+ else if (G.f & G_DEBUG)
+ printf("animdata has no action\n");
+ break;
+ }
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ /* send notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
+
+ return OPERATOR_FINISHED;
}
-void ANIM_OT_channels_move_bottom (wmOperatorType *ot)
+void ANIM_OT_channels_move (wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Move Channel(s) to Bottom";
- ot->idname= "ANIM_OT_channels_move_to_bottom";
+ ot->name= "Move Channels";
+ ot->idname= "ANIM_OT_channels_move";
+ ot->description = "Rearrange selected animation channels";
/* api callbacks */
ot->exec= animchannels_rearrange_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= animedit_poll_channels_nla_tweakmode_off;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
- RNA_def_enum(ot->srna, "direction", NULL /* XXX add enum for this */, REARRANGE_ACTCHAN_BOTTOM, "Direction", "");
+ ot->prop= RNA_def_enum(ot->srna, "direction", prop_animchannel_rearrange_types, REARRANGE_ANIMCHAN_DOWN, "Direction", "");
}
-#endif // XXX old animation system - needs to be updated for new system...
-
/* ******************** Delete Channel Operator *********************** */
-static int animchannels_delete_exec(bContext *C, wmOperator *op)
+static int animchannels_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
ListBase anim_data = {NULL, NULL};
@@ -1022,7 +1188,7 @@ void ANIM_OT_channels_delete (wmOperatorType *ot)
/* ******************** Set Channel Visibility Operator *********************** */
/* NOTE: this operator is only valid in the Graph Editor channels region */
-static int animchannels_visibility_set_exec(bContext *C, wmOperator *op)
+static int animchannels_visibility_set_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
ListBase anim_data = {NULL, NULL};
@@ -1055,7 +1221,7 @@ static int animchannels_visibility_set_exec(bContext *C, wmOperator *op)
BLI_freelistN(&anim_data);
/* make all the selected channels visible */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_NODUPLIS);
+ filter= (ANIMFILTER_SEL | ANIMFILTER_NODUPLIS);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
for (ale= anim_data.first; ale; ale= ale->next) {
@@ -1090,7 +1256,7 @@ void ANIM_OT_channels_visibility_set (wmOperatorType *ot)
/* api callbacks */
ot->exec= animchannels_visibility_set_exec;
- ot->poll= ED_operator_ipo_active;
+ ot->poll= ED_operator_graphedit_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1100,7 +1266,7 @@ void ANIM_OT_channels_visibility_set (wmOperatorType *ot)
/* ******************** Toggle Channel Visibility Operator *********************** */
/* NOTE: this operator is only valid in the Graph Editor channels region */
-static int animchannels_visibility_toggle_exec(bContext *C, wmOperator *op)
+static int animchannels_visibility_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
ListBase anim_data = {NULL, NULL};
@@ -1163,7 +1329,7 @@ void ANIM_OT_channels_visibility_toggle (wmOperatorType *ot)
/* api callbacks */
ot->exec= animchannels_visibility_toggle_exec;
- ot->poll= ED_operator_ipo_active;
+ ot->poll= ED_operator_graphedit_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1479,9 +1645,73 @@ void ANIM_OT_channels_collapse (wmOperatorType *ot)
ot->prop= RNA_def_boolean(ot->srna, "all", 1, "All", "Collapse all channels (not just selected ones)");
}
+/* ******************* Reenable Disabled Operator ******************* */
+
+static int animchannels_enable_poll (bContext *C)
+{
+ ScrArea *sa= CTX_wm_area(C);
+
+ /* channels region test */
+ // TODO: could enhance with actually testing if channels region?
+ if (ELEM(NULL, sa, CTX_wm_region(C)))
+ return 0;
+
+ /* animation editor test - Action/Dopesheet/etc. and Graph only */
+ if (ELEM(sa->spacetype, SPACE_ACTION, SPACE_IPO) == 0)
+ return 0;
+
+ return 1;
+}
+
+static int animchannels_enable_exec (bContext *C, wmOperator *UNUSED(op))
+{
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* filter data */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* loop through filtered data and clean curves */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ FCurve *fcu = (FCurve *)ale->data;
+ fcu->flag &= ~FCURVE_DISABLED;
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ /* send notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void ANIM_OT_channels_fcurves_enable (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Revive Disabled F-Curves";
+ ot->idname= "ANIM_OT_channels_fcurves_enable";
+ ot->description= "Clears 'disabled' tag from all F-Curves to get broken F-Curves working again";
+
+ /* api callbacks */
+ ot->exec= animchannels_enable_exec;
+ ot->poll= animchannels_enable_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
/* ********************** Select All Operator *********************** */
-static int animchannels_deselectall_exec(bContext *C, wmOperator *op)
+static int animchannels_deselectall_exec (bContext *C, wmOperator *op)
{
bAnimContext ac;
@@ -1529,7 +1759,17 @@ static void borderselect_anim_channels (bAnimContext *ac, rcti *rect, short sele
View2D *v2d= &ac->ar->v2d;
rctf rectf;
- float ymin=0, ymax=(float)(-ACHANNEL_HEIGHT);
+ float ymin, ymax;
+
+ /* set initial y extents */
+ if (ac->datatype == ANIMCONT_NLA) {
+ ymin = (float)(-NLACHANNEL_HEIGHT);
+ ymax = 0.0f;
+ }
+ else {
+ ymin = 0.0f;
+ ymax = (float)(-ACHANNEL_HEIGHT);
+ }
/* convert border-region to view coordinates */
UI_view2d_region_to_view(v2d, rect->xmin, rect->ymin+2, &rectf.xmin, &rectf.ymin);
@@ -1541,7 +1781,10 @@ static void borderselect_anim_channels (bAnimContext *ac, rcti *rect, short sele
/* loop over data, doing border select */
for (ale= anim_data.first; ale; ale= ale->next) {
- ymin= ymax - ACHANNEL_STEP;
+ if (ac->datatype == ANIMCONT_NLA)
+ ymin= ymax - NLACHANNEL_STEP;
+ else
+ ymin= ymax - ACHANNEL_STEP;
/* if channel is within border-select region, alter it */
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))) {
@@ -1558,6 +1801,16 @@ static void borderselect_anim_channels (bAnimContext *ac, rcti *rect, short sele
agrp->flag &= ~AGRP_ACTIVE;
}
break;
+ case ANIMTYPE_NLATRACK:
+ {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+
+ /* for now, it's easier just to do this here manually, as defining a new type
+ * currently adds complications when doing other stuff
+ */
+ ACHANNEL_SET_FLAG(nlt, selectmode, NLATRACK_SELECTED);
+ }
+ break;
}
}
@@ -1627,7 +1880,7 @@ void ANIM_OT_channels_select_border(wmOperatorType *ot)
/* ******************** Mouse-Click Operator *********************** */
/* Handle selection changes due to clicking on channels. Settings will get caught by UI code... */
-static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, short selectmode)
+static int mouse_anim_channels (bAnimContext *ac, float UNUSED(x), int channel_index, short selectmode)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
@@ -1733,6 +1986,7 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh
case ANIMTYPE_DSMESH:
case ANIMTYPE_DSNTREE:
case ANIMTYPE_DSTEX:
+ case ANIMTYPE_DSLAT:
{
/* sanity checking... */
if (ale->adt) {
@@ -1834,7 +2088,9 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh
{
bGPdata *gpd= (bGPdata *)ale->data;
- /* toggle expand */
+ /* toggle expand
+ * - although the triangle widget already allows this, the whole channel can also be used for this purpose
+ */
gpd->flag ^= GP_DATA_EXPAND;
notifierFlags |= (ND_ANIMCHAN|NA_EDITED);
@@ -1842,29 +2098,20 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh
break;
case ANIMTYPE_GPLAYER:
{
-#if 0 // XXX future of this is unclear
- bGPdata *gpd= (bGPdata *)ale->owner; // xxx depreceated
bGPDlayer *gpl= (bGPDlayer *)ale->data;
- if (x >= (ACHANNEL_NAMEWIDTH-16)) {
- /* toggle lock */
- gpl->flag ^= GP_LAYER_LOCKED;
- }
- else if (x >= (ACHANNEL_NAMEWIDTH-32)) {
- /* toggle hide */
- gpl->flag ^= GP_LAYER_HIDE;
+ /* select/deselect */
+ if (selectmode == SELECT_INVERT) {
+ /* invert selection status of this layer only */
+ gpl->flag ^= GP_LAYER_SELECT;
}
- else {
- /* select/deselect */
- //if (G.qual & LR_SHIFTKEY) {
- //select_gplayer_channel(gpd, gpl, SELECT_INVERT);
- //}
- //else {
- //deselect_gpencil_layers(data, 0);
- //select_gplayer_channel(gpd, gpl, SELECT_INVERT);
- //}
+ else {
+ /* select layer by itself */
+ ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+ gpl->flag |= GP_LAYER_SELECT;
}
-#endif // XXX future of this is unclear
+
+ notifierFlags |= (ND_ANIMCHAN|NA_EDITED);
}
break;
default:
@@ -1885,7 +2132,6 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh
static int animchannels_mouseclick_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
bAnimContext ac;
- Scene *scene;
ARegion *ar;
View2D *v2d;
int mval[2], channel_index;
@@ -1899,7 +2145,6 @@ static int animchannels_mouseclick_invoke(bContext *C, wmOperator *op, wmEvent *
return OPERATOR_CANCELLED;
/* get useful pointers from animation context data */
- scene= ac.scene;
ar= ac.ar;
v2d= &ar->v2d;
@@ -1970,17 +2215,15 @@ void ED_operatortypes_animchannels(void)
// XXX does this need to be a separate operator?
WM_operatortype_append(ANIM_OT_channels_editable_toggle);
- // XXX these need to be updated for new system... todo...
- //WM_operatortype_append(ANIM_OT_channels_move_up);
- //WM_operatortype_append(ANIM_OT_channels_move_down);
- //WM_operatortype_append(ANIM_OT_channels_move_top);
- //WM_operatortype_append(ANIM_OT_channels_move_bottom);
+ WM_operatortype_append(ANIM_OT_channels_move);
WM_operatortype_append(ANIM_OT_channels_expand);
WM_operatortype_append(ANIM_OT_channels_collapse);
WM_operatortype_append(ANIM_OT_channels_visibility_toggle);
WM_operatortype_append(ANIM_OT_channels_visibility_set);
+
+ WM_operatortype_append(ANIM_OT_channels_fcurves_enable);
}
// TODO: check on a poll callback for this, to get hotkeys into menus
@@ -2022,11 +2265,11 @@ void ED_keymap_animchannels(wmKeyConfig *keyconf)
RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_expand", PADPLUSKEY, KM_PRESS, KM_CTRL, 0)->ptr, "all", 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_collapse", PADMINUS, KM_PRESS, KM_CTRL, 0)->ptr, "all", 0);
- /* rearranging - actions only */
- //WM_keymap_add_item(keymap, "ANIM_OT_channels_move_up", PAGEUPKEY, KM_PRESS, KM_SHIFT, 0);
- //WM_keymap_add_item(keymap, "ANIM_OT_channels_move_down", PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0);
- //WM_keymap_add_item(keymap, "ANIM_OT_channels_move_to_top", PAGEUPKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
- //WM_keymap_add_item(keymap, "ANIM_OT_channels_move_to_bottom", PAGEDOWNKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
+ /* rearranging */
+ RNA_enum_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_move", PAGEUPKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "direction", REARRANGE_ANIMCHAN_UP);
+ RNA_enum_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_move", PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "direction", REARRANGE_ANIMCHAN_DOWN);
+ RNA_enum_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_move", PAGEUPKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "direction", REARRANGE_ANIMCHAN_TOP);
+ RNA_enum_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_move", PAGEDOWNKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "direction", REARRANGE_ANIMCHAN_BOTTOM);
/* Graph Editor only */
WM_keymap_add_item(keymap, "ANIM_OT_channels_visibility_set", VKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/animation/anim_deps.c b/source/blender/editors/animation/anim_deps.c
index 5312e97c604..340101612b9 100644
--- a/source/blender/editors/animation/anim_deps.c
+++ b/source/blender/editors/animation/anim_deps.c
@@ -38,6 +38,7 @@
#include "DNA_sequence_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_animsys.h"
#include "BKE_action.h"
@@ -90,13 +91,13 @@ void ANIM_list_elem_update(Scene *scene, bAnimListElem *ale)
else {
/* in other case we do standard depsgaph update, ideally
we'd be calling property update functions here too ... */
- DAG_id_flush_update(id, OB_RECALC_ALL); // XXX or do we want something more restrictive?
+ DAG_id_tag_update(id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME); // XXX or do we want something more restrictive?
}
}
/* tags the given ID block for refreshes (if applicable) due to
* Animation Editor editing */
-void ANIM_id_update(Scene *scene, ID *id)
+void ANIM_id_update(Scene *UNUSED(scene), ID *id)
{
if (id) {
AnimData *adt= BKE_animdata_from_id(id);
@@ -106,7 +107,7 @@ void ANIM_id_update(Scene *scene, ID *id)
adt->recalc |= ADT_RECALC_ANIM;
/* set recalc flags */
- DAG_id_flush_update(id, OB_RECALC_ALL); // XXX or do we want something more restrictive?
+ DAG_id_tag_update(id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME); // XXX or do we want something more restrictive?
}
}
@@ -121,7 +122,7 @@ void ANIM_id_update(Scene *scene, ID *id)
*/
/* perform syncing updates for Action Groups */
-static void animchan_sync_group (bAnimContext *ac, bAnimListElem *ale)
+static void animchan_sync_group (bAnimContext *UNUSED(ac), bAnimListElem *ale)
{
bActionGroup *agrp= (bActionGroup *)ale->data;
ID *owner_id= ale->id;
@@ -154,7 +155,7 @@ static void animchan_sync_group (bAnimContext *ac, bAnimListElem *ale)
}
/* perform syncing updates for F-Curves */
-static void animchan_sync_fcurve (bAnimContext *ac, bAnimListElem *ale)
+static void animchan_sync_fcurve (bAnimContext *UNUSED(ac), bAnimListElem *ale)
{
FCurve *fcu= (FCurve *)ale->data;
ID *owner_id= ale->id;
diff --git a/source/blender/editors/animation/anim_draw.c b/source/blender/editors/animation/anim_draw.c
index b564780f6c0..dd27de883b3 100644
--- a/source/blender/editors/animation/anim_draw.c
+++ b/source/blender/editors/animation/anim_draw.c
@@ -256,7 +256,7 @@ void ANIM_draw_cfra (const bContext *C, View2D *v2d, short flag)
/* Draw current frame number in a little box */
if (flag & DRAWCFRA_SHOW_NUMBOX) {
- UI_view2d_view_orthoSpecial(C, v2d, 1);
+ UI_view2d_view_orthoSpecial(CTX_wm_region(C), v2d, 1);
draw_cfra_number(scene, v2d, vec[0], (flag & DRAWCFRA_UNIT_SECONDS));
}
}
@@ -352,14 +352,13 @@ static short bezt_nlamapping_apply(KeyframeEditData *ked, BezTriple *bezt)
*/
void ANIM_nla_mapping_apply_fcurve (AnimData *adt, FCurve *fcu, short restore, short only_keys)
{
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
KeyframeEditFunc map_cb;
/* init edit data
* - AnimData is stored in 'data'
* - only_keys is stored in 'i1'
*/
- memset(&ked, 0, sizeof(KeyframeEditData));
ked.data= (void *)adt;
ked.i1= (int)only_keys;
@@ -393,7 +392,7 @@ float ANIM_unit_mapping_get_factor (Scene *scene, ID *id, FCurve *fcu, short res
if (RNA_SUBTYPE_UNIT(RNA_property_subtype(prop)) == PROP_UNIT_ROTATION)
{
/* if the radians flag is not set, default to using degrees which need conversions */
- if ((scene) && (scene->unit.flag & USER_UNIT_ROT_RADIANS) == 0) {
+ if ((scene) && (scene->unit.system_rotation == USER_UNIT_ROT_RADIANS) == 0) {
if (restore)
return M_PI / 180.0f; /* degrees to radians */
else
diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c
index feb680ff40a..6d36daa854c 100644
--- a/source/blender/editors/animation/anim_filter.c
+++ b/source/blender/editors/animation/anim_filter.c
@@ -69,6 +69,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BKE_animsys.h"
@@ -78,11 +79,14 @@
#include "BKE_global.h"
#include "BKE_group.h"
#include "BKE_key.h"
+#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_node.h"
#include "BKE_sequencer.h"
+#include "BKE_utildefines.h"
#include "ED_anim_api.h"
+#include "ED_markers.h"
/* ************************************************************ */
/* Blender Context <-> Animation Context mapping */
@@ -91,7 +95,7 @@
/* Get shapekey data being edited (for Action Editor -> ShapeKey mode) */
/* Note: there's a similar function in key.c (ob_get_key) */
-Key *actedit_get_shapekeys (bAnimContext *ac, SpaceAction *saction)
+static Key *actedit_get_shapekeys (bAnimContext *ac)
{
Scene *scene= ac->scene;
Object *ob;
@@ -105,23 +109,7 @@ Key *actedit_get_shapekeys (bAnimContext *ac, SpaceAction *saction)
//if (saction->pin) return NULL;
/* shapekey data is stored with geometry data */
- switch (ob->type) {
- case OB_MESH:
- key= ((Mesh *)ob->data)->key;
- break;
-
- case OB_LATTICE:
- key= ((Lattice *)ob->data)->key;
- break;
-
- case OB_CURVE:
- case OB_SURF:
- key= ((Curve *)ob->data)->key;
- break;
-
- default:
- return NULL;
- }
+ key= ob_get_key(ob);
if (key) {
if (key->type == KEY_RELATIVE)
@@ -153,15 +141,17 @@ static short actedit_get_context (bAnimContext *ac, SpaceAction *saction)
case SACTCONT_SHAPEKEY: /* 'ShapeKey Editor' */
ac->datatype= ANIMCONT_SHAPEKEY;
- ac->data= actedit_get_shapekeys(ac, saction);
+ ac->data= actedit_get_shapekeys(ac);
ac->mode= saction->mode;
return 1;
case SACTCONT_GPENCIL: /* Grease Pencil */ // XXX review how this mode is handled...
- ac->datatype=ANIMCONT_GPENCIL;
- //ac->data= CTX_wm_screen(C); // FIXME: add that dopesheet type thing here!
- ac->data= NULL; // !!!
+ /* update scene-pointer (no need to check for pinning yet, as not implemented) */
+ saction->ads.source= (ID *)ac->scene;
+
+ ac->datatype= ANIMCONT_GPENCIL;
+ ac->data= &saction->ads;
ac->mode= saction->mode;
return 1;
@@ -317,7 +307,7 @@ short ANIM_animdata_get_context (const bContext *C, bAnimContext *ac)
/* get useful default context settings from context */
ac->scene= scene;
if (scene) {
- ac->markers= &scene->markers;
+ ac->markers= ED_context_get_markers(C);
ac->obact= (scene->basact)? scene->basact->object : NULL;
}
ac->sa= sa;
@@ -642,6 +632,19 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s
ale->adt= BKE_animdata_from_id(data);
}
break;
+ case ANIMTYPE_DSLAT:
+ {
+ Lattice *lt= (Lattice *)data;
+ AnimData *adt= lt->adt;
+
+ ale->flag= FILTER_LATTICE_OBJD(lt);
+
+ ale->key_data= (adt) ? adt->action : NULL;
+ ale->datatype= ALE_ACT;
+
+ ale->adt= BKE_animdata_from_id(data);
+ }
+ break;
case ANIMTYPE_DSSKEY:
{
Key *key= (Key *)data;
@@ -797,7 +800,7 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s
/* ----------------------------------------- */
/* NOTE: when this function returns true, the F-Curve is to be skipped */
-static int skip_fcurve_selected_data(bDopeSheet *ads, FCurve *fcu, ID *owner_id, int filter_mode)
+static int skip_fcurve_selected_data (bDopeSheet *ads, FCurve *fcu, ID *owner_id, int filter_mode)
{
if (GS(owner_id->name) == ID_OB) {
Object *ob= (Object *)owner_id;
@@ -1065,7 +1068,7 @@ static int animdata_filter_action (bAnimContext *ac, ListBase *anim_data, bDopeS
* - for normal filtering (i.e. for editing), we only need the NLA-tracks but they can be in 'normal' evaluation
* order, i.e. first to last. Otherwise, some tools may get screwed up.
*/
-static int animdata_filter_nla (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, AnimData *adt, int filter_mode, void *owner, short ownertype, ID *owner_id)
+static int animdata_filter_nla (bAnimContext *UNUSED(ac), ListBase *anim_data, bDopeSheet *UNUSED(ads), AnimData *adt, int filter_mode, void *owner, short ownertype, ID *owner_id)
{
bAnimListElem *ale;
NlaTrack *nlt;
@@ -1182,38 +1185,28 @@ static int animdata_filter_shapekey (bAnimContext *ac, ListBase *anim_data, Key
return items;
}
-#if 0
-// FIXME: switch this to use the bDopeSheet...
-static int animdata_filter_gpencil (ListBase *anim_data, bScreen *sc, int filter_mode)
+/* Grab all Grase Pencil datablocks in file */
+// TODO: should this be amalgamated with the dopesheet filtering code?
+static int animdata_filter_gpencil (ListBase *anim_data, void *UNUSED(data), int filter_mode)
{
bAnimListElem *ale;
- ScrArea *sa, *curarea;
bGPdata *gpd;
bGPDlayer *gpl;
int items = 0;
/* check if filtering types are appropriate */
+ if (!(filter_mode & (ANIMFILTER_ACTGROUPED|ANIMFILTER_CURVESONLY)))
{
- /* special hack for fullscreen area (which must be this one then):
- * - we use the curarea->full as screen to get spaces from, since the
- * old (pre-fullscreen) screen was stored there...
- * - this is needed as all data would otherwise disappear
- */
- // XXX need to get new alternative for curarea
- if ((curarea->full) && (curarea->spacetype==SPACE_ACTION))
- sc= curarea->full;
-
- /* loop over spaces in current screen, finding gpd blocks (could be slow!) */
- for (sa= sc->areabase.first; sa; sa= sa->next) {
- /* try to get gp data */
- // XXX need to put back grease pencil api...
- gpd= gpencil_data_get_active(sa);
- if (gpd == NULL) continue;
+ /* for now, grab grease pencil datablocks directly from main*/
+ for (gpd = G.main->gpencil.first; gpd; gpd = gpd->id.next) {
+ /* only show if gpd is used by something... */
+ if (ID_REAL_USERS(gpd) < 1)
+ continue;
/* add gpd as channel too (if for drawing, and it has layers) */
if ((filter_mode & ANIMFILTER_CHANNELS) && (gpd->layers.first)) {
/* add to list */
- ale= make_new_animlistelem(gpd, ANIMTYPE_GPDATABLOCK, sa, ANIMTYPE_SPECIALDATA);
+ ale= make_new_animlistelem(gpd, ANIMTYPE_GPDATABLOCK, NULL, ANIMTYPE_NONE, NULL);
if (ale) {
BLI_addtail(anim_data, ale);
items++;
@@ -1229,7 +1222,7 @@ static int animdata_filter_gpencil (ListBase *anim_data, bScreen *sc, int filter
/* only if editable */
if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_GPL(gpl)) {
/* add to list */
- ale= make_new_animlistelem(gpl, ANIMTYPE_GPLAYER, gpd, ANIMTYPE_GPDATABLOCK);
+ ale= make_new_animlistelem(gpl, ANIMTYPE_GPLAYER, gpd, ANIMTYPE_GPDATABLOCK, (ID*)gpd);
if (ale) {
BLI_addtail(anim_data, ale);
items++;
@@ -1244,7 +1237,6 @@ static int animdata_filter_gpencil (ListBase *anim_data, bScreen *sc, int filter
/* return the number of items added to the list */
return items;
}
-#endif
/* NOTE: owner_id is either material, lamp, or world block, which is the direct owner of the texture stack in question */
static int animdata_filter_dopesheet_texs (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, ID *owner_id, int filter_mode)
@@ -1390,29 +1382,34 @@ static int animdata_filter_dopesheet_mats (bAnimContext *ac, ListBase *anim_data
/* for now, if no material returned, skip (this shouldn't confuse the user I hope) */
if (ma == NULL) continue;
- if (ma->adt == NULL) {
- /* need to check textures */
- if(ma->mtex) {
- MTex **mtex = ma->mtex;
- int a;
- for (a=0; a < MAX_MTEX; a++) {
- if (ELEM3(NULL, mtex[a], mtex[a]->tex, mtex[a]->tex->adt))
- continue;
- else
- ok=1;
- }
- }
- else
- continue;
- }
-
-
+
/* check if ok */
ANIMDATA_FILTER_CASES(ma,
{ /* AnimData blocks - do nothing... */ },
ok=1;,
ok=1;,
ok=1;)
+
+ /* need to check textures */
+ if (ok == 0 && !(ads->filterflag & ADS_FILTER_NOTEX)) {
+ int mtInd;
+
+ for (mtInd=0; mtInd < MAX_MTEX; mtInd++) {
+ MTex *mtex = ma->mtex[mtInd];
+
+ if(mtex && mtex->tex) {
+ ANIMDATA_FILTER_CASES(mtex->tex,
+ { /* AnimData blocks - do nothing... */ },
+ ok=1;,
+ ok=1;,
+ ok=1;)
+ }
+
+ if(ok)
+ break;
+ }
+ }
+
if (ok == 0) continue;
/* make a temp list elem for this */
@@ -1594,6 +1591,14 @@ static int animdata_filter_dopesheet_obdata (bAnimContext *ac, ListBase *anim_da
expanded= FILTER_MESH_OBJD(me);
}
break;
+ case OB_LATTICE: /* ---- Lattice ---- */
+ {
+ Lattice *lt = (Lattice *)ob->data;
+
+ type= ANIMTYPE_DSLAT;
+ expanded= FILTER_LATTICE_OBJD(lt);
+ }
+ break;
}
/* special exception for drivers instead of action */
@@ -1852,6 +1857,19 @@ static int animdata_filter_dopesheet_ob (bAnimContext *ac, ListBase *anim_data,
}
}
break;
+ case OB_LATTICE: /* ------- Lattice ---------- */
+ {
+ Lattice *lt= (Lattice *)ob->data;
+
+ if ((ads->filterflag & ADS_FILTER_NOLAT) == 0) {
+ ANIMDATA_FILTER_CASES(lt,
+ { /* AnimData blocks - do nothing... */ },
+ obdata_ok= 1;,
+ obdata_ok= 1;,
+ obdata_ok= 1;)
+ }
+ }
+ break;
}
if (obdata_ok)
items += animdata_filter_dopesheet_obdata(ac, anim_data, ads, base, filter_mode);
@@ -2043,7 +2061,7 @@ static int animdata_filter_dopesheet (bAnimContext *ac, ListBase *anim_data, bDo
if ((ads->source == NULL) || (GS(ads->source->name)!=ID_SCE)) {
printf("DopeSheet Error: Not scene!\n");
if (G.f & G_DEBUG)
- printf("\tPointer = %p, Name = '%s' \n", ads->source, (ads->source)?ads->source->name:NULL);
+ printf("\tPointer = %p, Name = '%s' \n", (void *)ads->source, (ads->source)?ads->source->name:NULL);
return 0;
}
@@ -2149,7 +2167,7 @@ static int animdata_filter_dopesheet (bAnimContext *ac, ListBase *anim_data, bDo
}
/* additionally, dopesheet filtering also affects what objects to consider */
- if (ads->filterflag) {
+ {
/* check selection and object type filters */
if ( (ads->filterflag & ADS_FILTER_ONLYSEL) && !((base->flag & SELECT) /*|| (base == sce->basact)*/) ) {
/* only selected should be shown */
@@ -2206,7 +2224,7 @@ static int animdata_filter_dopesheet (bAnimContext *ac, ListBase *anim_data, bDo
int a;
/* firstly check that we actuallly have some materials */
- for (a=0; a < ob->totcol; a++) {
+ for (a=1; a <= ob->totcol; a++) {
Material *ma= give_current_material(ob, a);
if (ma) {
@@ -2365,6 +2383,23 @@ static int animdata_filter_dopesheet (bAnimContext *ac, ListBase *anim_data, bDo
dataOk= !(ads->filterflag & ADS_FILTER_NOMESH);)
}
break;
+ case OB_LATTICE: /* ------- Lattice ---------- */
+ {
+ Lattice *lt= (Lattice *)ob->data;
+ dataOk= 0;
+ ANIMDATA_FILTER_CASES(lt,
+ if ((ads->filterflag & ADS_FILTER_NOLAT)==0) {
+ /* for the special AnimData blocks only case, we only need to add
+ * the block if it is valid... then other cases just get skipped (hence ok=0)
+ */
+ ANIMDATA_ADD_ANIMDATA(lt);
+ dataOk=0;
+ },
+ dataOk= !(ads->filterflag & ADS_FILTER_NOLAT);,
+ dataOk= !(ads->filterflag & ADS_FILTER_NOLAT);,
+ dataOk= !(ads->filterflag & ADS_FILTER_NOLAT);)
+ }
+ break;
default: /* --- other --- */
dataOk= 0;
break;
@@ -2399,104 +2434,6 @@ static int animdata_filter_dopesheet (bAnimContext *ac, ListBase *anim_data, bDo
if (!actOk && !keyOk && !dataOk && !matOk && !partOk)
continue;
}
- else {
- /* check data-types */
- actOk= ANIMDATA_HAS_KEYS(ob);
- keyOk= (key != NULL);
-
- /* materials - only for geometric types */
- matOk= 0; /* by default, not ok... */
- if (ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL) && (ob->totcol))
- {
- int a;
-
- /* firstly check that we actuallly have some materials */
- for (a=0; a < ob->totcol; a++) {
- Material *ma= give_current_material(ob, a);
- int mtInd;
-
- if ((ma) && ANIMDATA_HAS_KEYS(ma)) {
- matOk= 1;
- break;
- }
-
- if(ma) {
- for (mtInd= 0; mtInd < MAX_MTEX; mtInd++) {
- MTex *mtex= ma->mtex[mtInd];
-
- if (mtex && mtex->tex && ANIMDATA_HAS_KEYS(mtex->tex)) {
- matOk= 1;
- break;
- }
- }
- }
-
- if(matOk)
- break;
- }
- }
-
- /* data */
- switch (ob->type) {
- case OB_CAMERA: /* ------- Camera ------------ */
- {
- Camera *ca= (Camera *)ob->data;
- dataOk= ANIMDATA_HAS_KEYS(ca);
- }
- break;
- case OB_LAMP: /* ---------- Lamp ----------- */
- {
- Lamp *la= (Lamp *)ob->data;
- dataOk= ANIMDATA_HAS_KEYS(la);
- }
- break;
- case OB_CURVE: /* ------- Curve ---------- */
- case OB_SURF: /* ------- Nurbs Surface ---------- */
- case OB_FONT: /* ------- Text Curve ---------- */
- {
- Curve *cu= (Curve *)ob->data;
- dataOk= ANIMDATA_HAS_KEYS(cu);
- }
- break;
- case OB_MBALL: /* -------- Metas ---------- */
- {
- MetaBall *mb= (MetaBall *)ob->data;
- dataOk= ANIMDATA_HAS_KEYS(mb);
- }
- break;
- case OB_ARMATURE: /* -------- Armature ---------- */
- {
- bArmature *arm= (bArmature *)ob->data;
- dataOk= ANIMDATA_HAS_KEYS(arm);
- }
- break;
- case OB_MESH: /* -------- Mesh ---------- */
- {
- Mesh *me= (Mesh *)ob->data;
- dataOk= ANIMDATA_HAS_KEYS(me);
- }
- break;
- default: /* --- other --- */
- dataOk= 0;
- break;
- }
-
- /* particles */
- partOk = 0;
- if (ob->particlesystem.first) {
- ParticleSystem *psys = ob->particlesystem.first;
- for(; psys; psys=psys->next) {
- if(psys->part && ANIMDATA_HAS_KEYS(psys->part)) {
- partOk = 1;
- break;
- }
- }
- }
-
- /* check if all bad (i.e. nothing to show) */
- if (!actOk && !keyOk && !dataOk && !matOk && !partOk)
- continue;
- }
/* since we're still here, this object should be usable */
items += animdata_filter_dopesheet_ob(ac, anim_data, ads, base, filter_mode);
@@ -2530,7 +2467,7 @@ static short animdata_filter_dopesheet_summary (bAnimContext *ac, ListBase *anim
/* dopesheet summary
* - only for drawing and/or selecting keyframes in channels, but not for real editing
- * - only useful for DopeSheet Editor, where the summary is useful
+ * - only useful for DopeSheet/Action/etc. editors where it is actually useful
*/
// TODO: we should really check if some other prohibited filters are also active, but that can be for later
if ((filter_mode & ANIMFILTER_CHANNELS) && (ads->filterflag & ADS_FILTER_SUMMARY)) {
@@ -2631,9 +2568,12 @@ int ANIM_animdata_filter (bAnimContext *ac, ListBase *anim_data, int filter_mode
switch (datatype) {
case ANIMCONT_ACTION: /* 'Action Editor' */
{
+ SpaceAction *saction = (SpaceAction *)ac->sa->spacedata.first;
+ bDopeSheet *ads = (saction)? &saction->ads : NULL;
+
/* the check for the DopeSheet summary is included here since the summary works here too */
if (animdata_filter_dopesheet_summary(ac, anim_data, filter_mode, &items))
- items += animdata_filter_action(ac, anim_data, NULL, data, filter_mode, NULL, ANIMTYPE_NONE, (ID *)obact);
+ items += animdata_filter_action(ac, anim_data, ads, data, filter_mode, NULL, ANIMTYPE_NONE, (ID *)obact);
}
break;
@@ -2647,7 +2587,7 @@ int ANIM_animdata_filter (bAnimContext *ac, ListBase *anim_data, int filter_mode
case ANIMCONT_GPENCIL:
{
- //items= animdata_filter_gpencil(anim_data, data, filter_mode);
+ items= animdata_filter_gpencil(anim_data, data, filter_mode);
}
break;
diff --git a/source/blender/editors/animation/anim_ipo_utils.c b/source/blender/editors/animation/anim_ipo_utils.c
index 4bc2654e581..3e2212c15bb 100644
--- a/source/blender/editors/animation/anim_ipo_utils.c
+++ b/source/blender/editors/animation/anim_ipo_utils.c
@@ -37,10 +37,11 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
-#include "BKE_utildefines.h"
+
#include "RNA_access.h"
@@ -74,7 +75,8 @@ int getname_anim_fcurve(char *name, ID *id, FCurve *fcu)
/* try to resolve the path */
if (RNA_path_resolve(&id_ptr, fcu->rna_path, &ptr, &prop)) {
- char *structname=NULL, *propname=NULL, *arrayname=NULL, arrayindbuf[16];
+ char *structname=NULL, *propname=NULL, arrayindbuf[16];
+ const char *arrayname=NULL;
short free_structname = 0;
/* For now, name will consist of 3 parts: struct-name, property name, array index
@@ -172,14 +174,14 @@ int getname_anim_fcurve(char *name, ID *id, FCurve *fcu)
/* step between the major distinguishable color bands of the primary colors */
#define HSV_BANDWIDTH 0.3f
-/* used to determine the colour of F-Curves with FCURVE_COLOR_AUTO_RAINBOW set */
+/* used to determine the color of F-Curves with FCURVE_COLOR_AUTO_RAINBOW set */
//void fcurve_rainbow (unsigned int cur, unsigned int tot, float *out)
void getcolor_fcurve_rainbow (int cur, int tot, float *out)
{
float hue, val, sat, fac;
int grouping;
- /* we try to divide the colours into groupings of n colors,
+ /* we try to divide the color into groupings of n colors,
* where n is:
* 3 - for 'odd' numbers of curves - there should be a majority of triplets of curves
* 4 - for 'even' numbers of curves - there should be a majority of quartets of curves
diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c
index 5c4d231fd3a..4a39534d566 100644
--- a/source/blender/editors/animation/anim_markers.c
+++ b/source/blender/editors/animation/anim_markers.c
@@ -38,6 +38,7 @@
#include "RNA_enum_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_fcurve.h"
@@ -56,6 +57,7 @@
#include "UI_view2d.h"
#include "UI_resources.h"
+#include "ED_anim_api.h"
#include "ED_markers.h"
#include "ED_screen.h"
#include "ED_util.h"
@@ -65,23 +67,48 @@
/* ************* Marker API **************** */
-static ListBase *context_get_markers(const bContext *C)
+/* helper function for getting the list of markers to work on */
+static ListBase *context_get_markers(Scene *scene, ScrArea *sa)
{
-
-#if 0
- /* XXX get them from pose */
- if ((slink->spacetype == SPACE_ACTION) && (saction->flag & SACTION_POSEMARKERS_MOVE)) {
- if (saction->action)
- markers= &saction->action->markers;
- else
- markers= NULL;
+ /* local marker sets... */
+ if (sa) {
+ if (sa->spacetype == SPACE_ACTION) {
+ SpaceAction *saction = (SpaceAction *)sa->spacedata.first;
+
+ /* local markers can only be shown when there's only a single active action to grab them from
+ * - flag only takes effect when there's an action, otherwise it can get too confusing?
+ */
+ if (ELEM(saction->mode, SACTCONT_ACTION, SACTCONT_SHAPEKEY) && (saction->action))
+ {
+ if (saction->flag & SACTION_POSEMARKERS_SHOW)
+ return &saction->action->markers;
+ }
+ }
}
- else
-#endif
- return &CTX_data_scene(C)->markers;
+ /* default to using the scene's markers */
+ return &scene->markers;
+}
+
+/* ............. */
+
+/* public API for getting markers from context */
+ListBase *ED_context_get_markers(const bContext *C)
+{
+ return context_get_markers(CTX_data_scene(C), CTX_wm_area(C));
}
+/* public API for getting markers from "animation" context */
+ListBase *ED_animcontext_get_markers(const bAnimContext *ac)
+{
+ if (ac)
+ return context_get_markers(ac->scene, ac->sa);
+ else
+ return NULL;
+}
+
+/* --------------------------------- */
+
/* Get the marker that is closest to this point */
/* XXX for select, the min_dist should be small */
TimeMarker *ED_markers_find_nearest_marker (ListBase *markers, float x)
@@ -175,6 +202,8 @@ void ED_markers_get_minmax (ListBase *markers, short sel, float *first, float *l
*last= max;
}
+/* --------------------------------- */
+
/* Adds a marker to list of cfra elems */
void add_marker_to_cfra_elem(ListBase *lb, TimeMarker *marker, short only_sel)
{
@@ -218,6 +247,46 @@ void ED_markers_make_cfra_list(ListBase *markers, ListBase *lb, short only_sel)
add_marker_to_cfra_elem(lb, marker, only_sel);
}
+/* --------------------------------- */
+
+/* Get the first selected marker */
+TimeMarker *ED_markers_get_first_selected(ListBase *markers)
+{
+ TimeMarker *marker;
+
+ if (markers) {
+ for (marker = markers->first; marker; marker = marker->next) {
+ if (marker->flag & SELECT)
+ return marker;
+ }
+ }
+
+ return NULL;
+}
+
+/* --------------------------------- */
+
+/* Print debugging prints of list of markers
+ * BSI's: do NOT make static or put in if-defs as "unused code". That's too much trouble when we need to use for quick debuggging!
+ */
+void debug_markers_print_list(ListBase *markers)
+{
+ TimeMarker *marker;
+
+ if (markers == NULL) {
+ printf("No markers list to print debug for\n");
+ return;
+ }
+
+ printf("List of markers follows: -----\n");
+
+ for (marker = markers->first; marker; marker = marker->next) {
+ printf("\t'%s' on %d at %p with %d\n", marker->name, marker->frame, marker, marker->flag);
+ }
+
+ printf("End of list ------------------\n");
+}
+
/* ************* Marker Drawing ************ */
/* function to draw markers */
@@ -239,10 +308,11 @@ static void draw_marker(View2D *v2d, TimeMarker *marker, int cfra, int flag)
/* vertical line - dotted */
#ifdef DURIAN_CAMERA_SWITCH
- if ((marker->camera) || (flag & DRAW_MARKERS_LINES)) {
+ if ((marker->camera) || (flag & DRAW_MARKERS_LINES))
#else
- if (flag & DRAW_MARKERS_LINES) {
+ if (flag & DRAW_MARKERS_LINES)
#endif
+ {
setlinestyle(3);
if (marker->flag & SELECT)
@@ -313,7 +383,7 @@ static void draw_marker(View2D *v2d, TimeMarker *marker, int cfra, int flag)
/* Draw Scene-Markers in time window */
void draw_markers_time(const bContext *C, int flag)
{
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
View2D *v2d= UI_view2d_fromcontext(C);
TimeMarker *marker;
@@ -333,12 +403,103 @@ void draw_markers_time(const bContext *C, int flag)
}
}
+/* ************************ Marker Wrappers API ********************* */
+/* These wrappers allow marker operators to function within the confines
+ * of standard animation editors, such that they can coexist with the
+ * primary operations of those editors.
+ */
+
+/* maximum y-axis value (in region screen-space) that marker events should still be accepted for */
+#define ANIMEDIT_MARKER_YAXIS_MAX 40
+
+/* ------------------------ */
+
+/* special poll() which checks if there are selected markers first */
+static int ed_markers_poll_selected_markers(bContext *C)
+{
+ ListBase *markers = ED_context_get_markers(C);
+
+ /* first things first: markers can only exist in timeline views */
+ if (ED_operator_animview_active(C) == 0)
+ return 0;
+
+ /* check if some marker is selected */
+ return ED_markers_get_first_selected(markers) != NULL;
+}
+
+/* special poll() which checks if there are any markers at all first */
+static int ed_markers_poll_markers_exist(bContext *C)
+{
+ ListBase *markers = ED_context_get_markers(C);
+
+ /* first things first: markers can only exist in timeline views */
+ if (ED_operator_animview_active(C) == 0)
+ return 0;
+
+ /* list of markers must exist, as well as some markers in it! */
+ return (markers && markers->first);
+}
+
+/* ------------------------ */
+
+/* Second-tier invoke() callback that performs context validation before running the
+ * "custom"/third-tier invoke() callback supplied as the last arg (which would normally
+ * be the operator's invoke() callback elsewhere)
+ *
+ * < invoke_func: (fn(bContext*, wmOperator*, wmEvent*)=int) "standard" invoke function
+ * that operator would otherwise have used. If NULL, the operator's standard
+ * exec() callback will be called instead in the appropriate places.
+ */
+static int ed_markers_opwrap_invoke_custom(bContext *C, wmOperator *op, wmEvent *evt,
+ int (*invoke_func)(bContext*,wmOperator*,wmEvent*))
+{
+ ScrArea *sa = CTX_wm_area(C);
+ int retval = OPERATOR_PASS_THROUGH;
+
+ /* only timeline view doesn't need calling-location validation as it's the only dedicated view */
+ if (sa->spacetype != SPACE_TIME) {
+ /* restrict y-values to within ANIMEDIT_MARKER_YAXIS_MAX of the view's vertical extents, including scrollbars */
+ if (evt->mval[1] > ANIMEDIT_MARKER_YAXIS_MAX) {
+ /* not ok... "pass-through" to let normal editor's operators have a chance at tackling this event... */
+ //printf("MARKER-WRAPPER-DEBUG: event mval[1] = %d, so over accepted tolerance\n", evt->mval[1]);
+ return OPERATOR_CANCELLED|OPERATOR_PASS_THROUGH;
+ }
+ }
+
+ /* allow operator to run now */
+ if (invoke_func)
+ retval = invoke_func(C, op, evt);
+ else if (op->type->exec)
+ retval = op->type->exec(C, op);
+ else
+ BKE_report(op->reports, RPT_ERROR, "Programming error: operator doesn't actually have code to do anything!");
+
+ /* return status modifications - for now, make this spacetype dependent as above */
+ if (sa->spacetype != SPACE_TIME) {
+ /* unless successful, must add "pass-through" to let normal operator's have a chance at tackling this event */
+ if (retval != OPERATOR_FINISHED)
+ retval |= OPERATOR_PASS_THROUGH;
+ }
+
+ return retval;
+}
+
+/* standard wrapper - first-tier invoke() callback to be directly assigned to operator typedata
+ * for operators which don't need any special invoke calls. Any operators with special invoke calls
+ * though will need to implement their own wrapper which calls the second-tier callback themselves
+ * (passing through the custom invoke function they use)
+ */
+static int ed_markers_opwrap_invoke(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ return ed_markers_opwrap_invoke_custom(C, op, evt, NULL);
+}
+
/* ************************** add markers *************************** */
/* add TimeMarker at curent frame */
-static int ed_marker_add(bContext *C, wmOperator *op)
+static int ed_marker_add(bContext *C, wmOperator *UNUSED(op))
{
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
TimeMarker *marker;
int frame= CTX_data_scene(C)->r.cfra;
@@ -352,7 +513,7 @@ static int ed_marker_add(bContext *C, wmOperator *op)
}
/* deselect all */
- for(marker= markers->first; marker; marker= marker->next)
+ for (marker= markers->first; marker; marker= marker->next)
marker->flag &= ~SELECT;
marker = MEM_callocN(sizeof(TimeMarker), "TimeMarker");
@@ -376,7 +537,8 @@ static void MARKER_OT_add(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_add;
- ot->poll= ED_operator_areaactive;
+ ot->invoke = ed_markers_opwrap_invoke;
+ ot->poll= ED_operator_animview_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -396,7 +558,7 @@ functions:
exit() cleanup, send notifier
- cancel() to escpae from modal
+ cancel() to escape from modal
callbacks:
@@ -420,7 +582,7 @@ typedef struct MarkerMove {
/* return 0 if not OK */
static int ed_marker_move_init(bContext *C, wmOperator *op)
{
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
MarkerMove *mm;
TimeMarker *marker;
int totmark=0;
@@ -488,8 +650,13 @@ static int ed_marker_move_invoke(bContext *C, wmOperator *op, wmEvent *evt)
return OPERATOR_CANCELLED;
}
+static int ed_marker_move_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ return ed_markers_opwrap_invoke_custom(C, op, evt, ed_marker_move_invoke);
+}
+
/* note, init has to be called succesfully */
-static void ed_marker_move_apply(bContext *C, wmOperator *op)
+static void ed_marker_move_apply(wmOperator *op)
{
MarkerMove *mm= op->customdata;
TimeMarker *marker;
@@ -508,7 +675,7 @@ static void ed_marker_move_apply(bContext *C, wmOperator *op)
static void ed_marker_move_cancel(bContext *C, wmOperator *op)
{
RNA_int_set(op->ptr, "frames", 0);
- ed_marker_move_apply(C, op);
+ ed_marker_move_apply(op);
ed_marker_move_exit(C, op);
WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
@@ -536,7 +703,7 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, wmEvent *evt)
case LEFTMOUSE:
case MIDDLEMOUSE:
case RIGHTMOUSE:
- if(WM_modal_tweak_exit(evt, mm->event_type)) {
+ if (WM_modal_tweak_exit(evt, mm->event_type)) {
ed_marker_move_exit(C, op);
WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
@@ -545,9 +712,9 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, wmEvent *evt)
break;
case MOUSEMOVE:
- if(hasNumInput(&mm->num))
+ if (hasNumInput(&mm->num))
break;
-
+
dx= v2d->mask.xmax-v2d->mask.xmin;
dx= (v2d->cur.xmax-v2d->cur.xmin)/dx;
@@ -561,11 +728,11 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, wmEvent *evt)
if (ELEM(mm->slink->spacetype, SPACE_TIME, SPACE_SOUND))
apply_keyb_grid(evt->shift, evt->ctrl, &fac, 0.0, FPS, 0.1*FPS, 0);
else
- apply_keyb_grid(evt->shift, evt->ctrl, &fac, 0.0, 1.0, 0.1, U.flag & USER_AUTOGRABGRID);
+ apply_keyb_grid(evt->shift, evt->ctrl, &fac, 0.0, 1.0, 0.1, 0 /*was: U.flag & USER_AUTOGRABGRID*/);
offs= (int)fac;
RNA_int_set(op->ptr, "frames", offs);
- ed_marker_move_apply(C, op);
+ ed_marker_move_apply(op);
/* cruft below is for header print */
for (a=0, marker= mm->markers->first; marker; marker= marker->next) {
@@ -622,22 +789,22 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, wmEvent *evt)
}
}
- if(evt->val==KM_PRESS) {
+ if (evt->val==KM_PRESS) {
float vec[3];
char str_tx[256];
-
+
if (handleNumInput(&mm->num, evt))
{
applyNumInput(&mm->num, vec);
outputNumInput(&mm->num, str_tx);
-
+
RNA_int_set(op->ptr, "frames", vec[0]);
- ed_marker_move_apply(C, op);
+ ed_marker_move_apply(op);
// ed_marker_header_update(C, op, str, (int)vec[0]);
// strcat(str, str_tx);
sprintf(str, "Marker offset %s", str_tx);
ED_area_headerprint(CTX_wm_area(C), str);
-
+
WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
}
@@ -649,7 +816,7 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, wmEvent *evt)
static int ed_marker_move_exec(bContext *C, wmOperator *op)
{
if(ed_marker_move_init(C, op)) {
- ed_marker_move_apply(C, op);
+ ed_marker_move_apply(op);
ed_marker_move_exit(C, op);
return OPERATOR_FINISHED;
}
@@ -665,9 +832,9 @@ static void MARKER_OT_move(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_move_exec;
- ot->invoke= ed_marker_move_invoke;
+ ot->invoke= ed_marker_move_invoke_wrapper;
ot->modal= ed_marker_move_modal;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ed_markers_poll_selected_markers;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER;
@@ -697,9 +864,9 @@ callbacks:
/* duplicate selected TimeMarkers */
-static void ed_marker_duplicate_apply(bContext *C, wmOperator *op)
+static void ed_marker_duplicate_apply(bContext *C)
{
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
TimeMarker *marker, *newmarker;
if (markers == NULL)
@@ -724,6 +891,7 @@ static void ed_marker_duplicate_apply(bContext *C, wmOperator *op)
#endif
/* new marker is added to the begining of list */
+ // FIXME: bad ordering!
BLI_addhead(markers, newmarker);
}
}
@@ -731,7 +899,7 @@ static void ed_marker_duplicate_apply(bContext *C, wmOperator *op)
static int ed_marker_duplicate_exec(bContext *C, wmOperator *op)
{
- ed_marker_duplicate_apply(C, op);
+ ed_marker_duplicate_apply(C);
ed_marker_move_exec(C, op); /* assumes frs delta set */
return OPERATOR_FINISHED;
@@ -740,10 +908,15 @@ static int ed_marker_duplicate_exec(bContext *C, wmOperator *op)
static int ed_marker_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *evt)
{
- ed_marker_duplicate_apply(C, op);
+ ed_marker_duplicate_apply(C);
return ed_marker_move_invoke(C, op, evt);
}
+static int ed_marker_duplicate_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ return ed_markers_opwrap_invoke_custom(C, op, evt, ed_marker_duplicate_invoke);
+}
+
static void MARKER_OT_duplicate(wmOperatorType *ot)
{
/* identifiers */
@@ -753,9 +926,9 @@ static void MARKER_OT_duplicate(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_duplicate_exec;
- ot->invoke= ed_marker_duplicate_invoke;
+ ot->invoke= ed_marker_duplicate_invoke_wrapper;
ot->modal= ed_marker_move_modal;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ed_markers_poll_selected_markers;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -789,12 +962,12 @@ static void select_timeline_marker_frame(ListBase *markers, int frame, unsigned
static int ed_marker_select(bContext *C, wmEvent *evt, int extend, int camera)
{
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
View2D *v2d= UI_view2d_fromcontext(C);
float viewx;
int x, y, cfra;
- if(markers == NULL)
+ if (markers == NULL)
return OPERATOR_PASS_THROUGH;
x= evt->x - CTX_wm_region(C)->winrct.xmin;
@@ -811,27 +984,27 @@ static int ed_marker_select(bContext *C, wmEvent *evt, int extend, int camera)
#ifdef DURIAN_CAMERA_SWITCH
- if(camera) {
+ if (camera) {
Scene *scene= CTX_data_scene(C);
Base *base;
TimeMarker *marker;
int sel= 0;
-
+
if (!extend)
scene_deselect_all(scene);
-
+
for (marker= markers->first; marker; marker= marker->next) {
if(marker->frame==cfra) {
sel= (marker->flag & SELECT);
break;
}
}
-
+
for (marker= markers->first; marker; marker= marker->next) {
- if(marker->camera) {
- if(marker->frame==cfra) {
+ if (marker->camera) {
+ if (marker->frame==cfra) {
base= object_in_scene(marker->camera, scene);
- if(base) {
+ if (base) {
ED_base_object_select(base, sel);
if(sel)
ED_base_object_activate(C, base);
@@ -839,7 +1012,7 @@ static int ed_marker_select(bContext *C, wmEvent *evt, int extend, int camera)
}
}
}
-
+
WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
}
#endif
@@ -847,8 +1020,8 @@ static int ed_marker_select(bContext *C, wmEvent *evt, int extend, int camera)
WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
- /* allowing tweaks */
- return OPERATOR_PASS_THROUGH;
+ /* allowing tweaks, but needs OPERATOR_FINISHED, otherwise renaming fails... [#25987] */
+ return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH;
}
static int ed_marker_select_invoke(bContext *C, wmOperator *op, wmEvent *evt)
@@ -861,6 +1034,11 @@ static int ed_marker_select_invoke(bContext *C, wmOperator *op, wmEvent *evt)
return ed_marker_select(C, evt, extend, camera);
}
+static int ed_marker_select_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ return ed_markers_opwrap_invoke_custom(C, op, evt, ed_marker_select_invoke);
+}
+
static void MARKER_OT_select(wmOperatorType *ot)
{
/* identifiers */
@@ -869,8 +1047,8 @@ static void MARKER_OT_select(wmOperatorType *ot)
ot->idname= "MARKER_OT_select";
/* api callbacks */
- ot->invoke= ed_marker_select_invoke;
- ot->poll= ED_operator_areaactive;
+ ot->invoke= ed_marker_select_invoke_wrapper;
+ ot->poll= ed_markers_poll_markers_exist;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -905,7 +1083,7 @@ callbacks:
static int ed_marker_border_select_exec(bContext *C, wmOperator *op)
{
View2D *v2d= UI_view2d_fromcontext(C);
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
TimeMarker *marker;
float xminf, xmaxf, yminf, ymaxf;
int gesture_mode= RNA_int_get(op->ptr, "gesture_mode");
@@ -917,24 +1095,18 @@ static int ed_marker_border_select_exec(bContext *C, wmOperator *op)
UI_view2d_region_to_view(v2d, xmin, ymin, &xminf, &yminf);
UI_view2d_region_to_view(v2d, xmax, ymax, &xmaxf, &ymaxf);
- /* XXX disputable */
- if(yminf > 30.0f || ymaxf < 0.0f)
- return 0;
-
- if(markers == NULL)
+ if (markers == NULL)
return 0;
/* XXX marker context */
- for(marker= markers->first; marker; marker= marker->next) {
+ for (marker= markers->first; marker; marker= marker->next) {
if ((marker->frame > xminf) && (marker->frame <= xmaxf)) {
switch (gesture_mode) {
case GESTURE_MODAL_SELECT:
- if ((marker->flag & SELECT) == 0)
- marker->flag |= SELECT;
+ marker->flag |= SELECT;
break;
case GESTURE_MODAL_DESELECT:
- if (marker->flag & SELECT)
- marker->flag &= ~SELECT;
+ marker->flag &= ~SELECT;
break;
}
}
@@ -946,6 +1118,11 @@ static int ed_marker_border_select_exec(bContext *C, wmOperator *op)
return 1;
}
+static int ed_marker_select_border_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ return ed_markers_opwrap_invoke_custom(C, op, evt, WM_border_select_invoke);
+}
+
static void MARKER_OT_select_border(wmOperatorType *ot)
{
/* identifiers */
@@ -955,10 +1132,10 @@ static void MARKER_OT_select_border(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_border_select_exec;
- ot->invoke= WM_border_select_invoke;
+ ot->invoke= ed_marker_select_border_invoke_wrapper;
ot->modal= WM_border_select_modal;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ed_markers_poll_markers_exist;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -971,21 +1148,15 @@ static void MARKER_OT_select_border(wmOperatorType *ot)
static int ed_marker_select_all_exec(bContext *C, wmOperator *op)
{
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
TimeMarker *marker;
int action = RNA_enum_get(op->ptr, "action");
- if(markers == NULL)
+ if (markers == NULL)
return OPERATOR_CANCELLED;
if (action == SEL_TOGGLE) {
- action = SEL_SELECT;
- for(marker= markers->first; marker; marker= marker->next) {
- if(marker->flag & SELECT) {
- action = SEL_DESELECT;
- break;
- }
- }
+ action = (ED_markers_get_first_selected(markers) != NULL) ? SEL_DESELECT : SEL_SELECT;
}
for(marker= markers->first; marker; marker= marker->next) {
@@ -997,11 +1168,7 @@ static int ed_marker_select_all_exec(bContext *C, wmOperator *op)
marker->flag &= ~SELECT;
break;
case SEL_INVERT:
- if (marker->flag & SELECT) {
- marker->flag &= ~SELECT;
- } else {
- marker->flag |= SELECT;
- }
+ marker->flag ^= SELECT;
break;
}
}
@@ -1021,7 +1188,8 @@ static void MARKER_OT_select_all(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_select_all_exec;
- ot->poll= ED_operator_areaactive;
+ ot->invoke = ed_markers_opwrap_invoke;
+ ot->poll= ed_markers_poll_markers_exist;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1030,21 +1198,21 @@ static void MARKER_OT_select_all(wmOperatorType *ot)
WM_operator_properties_select_all(ot);
}
-/* ******************************* remove marker ***************** */
+/* ***************** remove marker *********************** */
/* remove selected TimeMarkers */
-static int ed_marker_delete_exec(bContext *C, wmOperator *op)
+static int ed_marker_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
TimeMarker *marker, *nmarker;
short changed= 0;
- if(markers == NULL)
+ if (markers == NULL)
return OPERATOR_CANCELLED;
- for(marker= markers->first; marker; marker= nmarker) {
+ for (marker= markers->first; marker; marker= nmarker) {
nmarker= marker->next;
- if(marker->flag & SELECT) {
+ if (marker->flag & SELECT) {
BLI_freelinkN(markers, marker);
changed= 1;
}
@@ -1058,6 +1226,11 @@ static int ed_marker_delete_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
+static int ed_marker_delete_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ // XXX: must we keep these confirmations?
+ return ed_markers_opwrap_invoke_custom(C, op, evt, WM_operator_confirm);
+}
static void MARKER_OT_delete(wmOperatorType *ot)
{
@@ -1067,35 +1240,90 @@ static void MARKER_OT_delete(wmOperatorType *ot)
ot->idname= "MARKER_OT_delete";
/* api callbacks */
- ot->invoke= WM_operator_confirm;
+ ot->invoke= ed_marker_delete_invoke_wrapper;
ot->exec= ed_marker_delete_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ed_markers_poll_selected_markers;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+
+/* **************** rename marker ***************** */
+
+/* rename first selected TimeMarker */
+static int ed_marker_rename_exec(bContext *C, wmOperator *op)
+{
+ TimeMarker *marker= ED_markers_get_first_selected(ED_context_get_markers(C));
+
+ if (marker) {
+ RNA_string_get(op->ptr, "name", marker->name);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
+ WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
+
+ return OPERATOR_FINISHED;
+ }
+ else {
+ return OPERATOR_CANCELLED;
+ }
+}
+
+static int ed_marker_rename_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ /* must initialise the marker name first if there is a marker selected */
+ TimeMarker *marker = ED_markers_get_first_selected(ED_context_get_markers(C));
+ if (marker)
+ RNA_string_set(op->ptr, "name", marker->name);
+ /* now see if the operator is usable */
+ return ed_markers_opwrap_invoke_custom(C, op, evt, WM_operator_props_popup);
}
+static void MARKER_OT_rename(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Rename Marker";
+ ot->description= "Rename first selected time marker";
+ ot->idname= "MARKER_OT_rename";
+
+ /* api callbacks */
+ ot->invoke= ed_marker_rename_invoke_wrapper;
+ ot->exec= ed_marker_rename_exec;
+ ot->poll= ed_markers_poll_selected_markers;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ ot->prop = RNA_def_string(ot->srna, "name", "RenamedMarker", sizeof(((TimeMarker *)NULL)->name), "Name", "New name for marker");
+ //RNA_def_boolean(ot->srna, "ensure_unique", 0, "Ensure Unique", "Ensure that new name is unique within collection of markers");
+}
+
+/* **************** make links to scene ***************** */
+
static int ed_marker_make_links_scene_exec(bContext *C, wmOperator *op)
{
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
Scene *scene_to= BLI_findlink(&CTX_data_main(C)->scene, RNA_enum_get(op->ptr, "scene"));
TimeMarker *marker, *marker_new;
- if(scene_to==NULL) {
+ if (scene_to==NULL) {
BKE_report(op->reports, RPT_ERROR, "Scene not found");
return OPERATOR_CANCELLED;
}
- if(scene_to == CTX_data_scene(C)) {
- BKE_report(op->reports, RPT_ERROR, "Can't link objects into the same scene");
+ if (scene_to == CTX_data_scene(C)) {
+ BKE_report(op->reports, RPT_ERROR, "Can't re-link markers into the same scene");
return OPERATOR_CANCELLED;
}
/* copy markers */
for (marker= markers->first; marker; marker= marker->next) {
- if(marker->flag & SELECT) {
+ if (marker->flag & SELECT) {
marker_new= MEM_dupallocN(marker);
+ marker_new->prev= marker_new->next = NULL;
+
BLI_addtail(&scene_to->markers, marker_new);
}
}
@@ -1109,12 +1337,13 @@ static void MARKER_OT_make_links_scene(wmOperatorType *ot)
/* identifiers */
ot->name= "Make Links to Scene";
- ot->description= "Link markers to another scene";
+ ot->description= "Copy selected markers to another scene";
ot->idname= "MARKER_OT_make_links_scene";
/* api callbacks */
ot->exec= ed_marker_make_links_scene_exec;
- ot->poll= ED_operator_areaactive;
+ ot->invoke = ed_markers_opwrap_invoke;
+ ot->poll= ed_markers_poll_selected_markers;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1129,27 +1358,20 @@ static void MARKER_OT_make_links_scene(wmOperatorType *ot)
#ifdef DURIAN_CAMERA_SWITCH
/* ******************************* camera bind marker ***************** */
-/* remove selected TimeMarkers */
-static int ed_marker_camera_bind_exec(bContext *C, wmOperator *op)
+static int ed_marker_camera_bind_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
TimeMarker *marker;
- short changed= 0;
- if(markers == NULL)
+ marker= ED_markers_get_first_selected(markers);
+ if(marker == NULL)
return OPERATOR_CANCELLED;
- for(marker= markers->first; marker; marker= marker->next) {
- if(marker->flag & SELECT) {
- marker->camera= scene->camera;
- }
- }
+ marker->camera= scene->camera;
- if (changed) {
- WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
- WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
- }
+ WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
+ WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
return OPERATOR_FINISHED;
}
@@ -1163,7 +1385,8 @@ static void MARKER_OT_camera_bind(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_camera_bind_exec;
- ot->poll= ED_operator_areaactive;
+ ot->invoke = ed_markers_opwrap_invoke;
+ ot->poll= ed_markers_poll_selected_markers;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1182,6 +1405,7 @@ void ED_operatortypes_marker(void)
WM_operatortype_append(MARKER_OT_select_border);
WM_operatortype_append(MARKER_OT_select_all);
WM_operatortype_append(MARKER_OT_delete);
+ WM_operatortype_append(MARKER_OT_rename);
WM_operatortype_append(MARKER_OT_make_links_scene);
#ifdef DURIAN_CAMERA_SWITCH
WM_operatortype_append(MARKER_OT_camera_bind);
@@ -1213,6 +1437,7 @@ void ED_marker_keymap(wmKeyConfig *keyconf)
WM_keymap_verify_item(keymap, "MARKER_OT_select_all", AKEY, KM_PRESS, 0, 0);
WM_keymap_verify_item(keymap, "MARKER_OT_delete", XKEY, KM_PRESS, 0, 0);
WM_keymap_verify_item(keymap, "MARKER_OT_delete", DELKEY, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "MARKER_OT_rename", MKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MARKER_OT_move", GKEY, KM_PRESS, 0, 0);
#ifdef DURIAN_CAMERA_SWITCH
diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c
index 9b9c9435518..6b0fa30b096 100644
--- a/source/blender/editors/animation/anim_ops.c
+++ b/source/blender/editors/animation/anim_ops.c
@@ -31,6 +31,8 @@
#include "BLO_sys_types.h"
+#include "BLI_utildefines.h"
+
#include "DNA_anim_types.h"
#include "DNA_scene_types.h"
@@ -211,13 +213,14 @@ void ANIM_OT_previewrange_set(wmOperatorType *ot)
/* identifiers */
ot->name= "Set Preview Range";
ot->idname= "ANIM_OT_previewrange_set";
+ ot->description= "Interactively define frame range used for playback";
/* api callbacks */
ot->invoke= WM_border_select_invoke;
ot->exec= previewrange_define_exec;
ot->modal= WM_border_select_modal;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_animview_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -233,7 +236,7 @@ void ANIM_OT_previewrange_set(wmOperatorType *ot)
/* ****************** clear preview range operator ****************************/
-static int previewrange_clear_exec(bContext *C, wmOperator *op)
+static int previewrange_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
ScrArea *curarea= CTX_wm_area(C);
@@ -257,11 +260,12 @@ void ANIM_OT_previewrange_clear(wmOperatorType *ot)
/* identifiers */
ot->name= "Clear Preview Range";
ot->idname= "ANIM_OT_previewrange_clear";
+ ot->description= "Clear Preview Range";
/* api callbacks */
ot->exec= previewrange_clear_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_animview_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -269,7 +273,7 @@ void ANIM_OT_previewrange_clear(wmOperatorType *ot)
/* ****************** time display toggle operator ****************************/
-static int toggle_time_exec(bContext *C, wmOperator *op)
+static int toggle_time_exec(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *curarea= CTX_wm_area(C);
@@ -324,11 +328,12 @@ void ANIM_OT_time_toggle(wmOperatorType *ot)
/* identifiers */
ot->name= "Toggle Frames/Seconds";
ot->idname= "ANIM_OT_time_toggle";
+ ot->description= "Toggle whether timing is displayed in frames or seconds for active timeline view";
/* api callbacks */
ot->exec= toggle_time_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_animview_active;
}
/* ************************** registration **********************************/
diff --git a/source/blender/editors/animation/drivers.c b/source/blender/editors/animation/drivers.c
index 898d7db89fc..8d74e7b1b59 100644
--- a/source/blender/editors/animation/drivers.c
+++ b/source/blender/editors/animation/drivers.c
@@ -27,18 +27,30 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stdio.h>
#include <string.h>
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
+#include "DNA_object_types.h"
+#include "DNA_material_types.h"
+#include "DNA_texture_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
#include "BKE_animsys.h"
#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
#include "BKE_context.h"
+#include "BKE_report.h"
+#include "BKE_material.h"
+#include "BKE_texture.h"
+
+#include "ED_keyframing.h"
#include "UI_interface.h"
@@ -115,7 +127,7 @@ FCurve *verify_driver_fcurve (ID *id, const char rna_path[], const int array_ind
/* Main Driver Management API calls:
* Add a new driver for the specified property on the given ID block
*/
-short ANIM_add_driver (ID *id, const char rna_path[], int array_index, short flag, int type)
+short ANIM_add_driver (ReportList *reports, ID *id, const char rna_path[], int array_index, short flag, int type)
{
PointerRNA id_ptr, ptr;
PropertyRNA *prop;
@@ -126,7 +138,9 @@ short ANIM_add_driver (ID *id, const char rna_path[], int array_index, short fla
/* validate pointer first - exit if failure */
RNA_id_pointer_create(id, &id_ptr);
if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) {
- printf("Add Driver: Could not add Driver, as RNA Path is invalid for the given ID (ID = %s, Path = %s)\n", id->name, rna_path);
+ BKE_reportf(reports, RPT_ERROR,
+ "Could not add Driver, as RNA Path is invalid for the given ID (ID = %s, Path = %s)",
+ id->name, rna_path);
return 0;
}
@@ -153,7 +167,10 @@ short ANIM_add_driver (ID *id, const char rna_path[], int array_index, short fla
/* set the type of the driver */
driver->type= type;
- /* fill in current value for python */
+ /* creating drivers for buttons will create the driver(s) with type
+ * "scripted expression" so that their values won't be lost immediately,
+ * so here we copy those values over to the driver's expression
+ */
if (type == DRIVER_TYPE_PYTHON) {
PropertyType proptype= RNA_property_type(prop);
int array= RNA_property_array_length(&ptr, prop);
@@ -180,6 +197,17 @@ short ANIM_add_driver (ID *id, const char rna_path[], int array_index, short fla
BLI_snprintf(expression, maxlen, "%.3f", fval);
}
}
+
+ /* for easier setup of drivers from UI, a driver variable should be
+ * added if flag is set (UI calls only)
+ */
+ if (flag & CREATEDRIVER_WITH_DEFAULT_DVAR) {
+ /* assume that users will mostly want this to be of type "Transform Channel" too,
+ * since this allows the easiest setting up of common rig components
+ */
+ DriverVar *dvar = driver_add_new_variable(driver);
+ driver_change_variable_type(dvar, DVAR_TYPE_TRANSFORM_CHAN);
+ }
}
/* set the done status */
@@ -193,23 +221,21 @@ short ANIM_add_driver (ID *id, const char rna_path[], int array_index, short fla
/* Main Driver Management API calls:
* Remove the driver for the specified property on the given ID block (if available)
*/
-short ANIM_remove_driver (struct ID *id, const char rna_path[], int array_index, short flag)
+short ANIM_remove_driver (ReportList *UNUSED(reports), ID *id, const char rna_path[], int array_index, short UNUSED(flag))
{
AnimData *adt;
FCurve *fcu;
int success= 0;
- /* get F-Curve
- * Note: here is one of the places where we don't want new F-Curve + Driver added!
- * so 'add' var must be 0
- */
/* we don't check the validity of the path here yet, but it should be ok... */
adt= BKE_animdata_from_id(id);
- if(adt) {
- if(array_index == -1) {
+ if (adt) {
+ if (array_index == -1) {
+ /* step through all drivers, removing all of those with the same base path */
FCurve *fcu_iter= adt->drivers.first;
- while((fcu= iter_step_fcurve(fcu_iter, rna_path))) {
+
+ while ((fcu = iter_step_fcurve(fcu_iter, rna_path)) != NULL) {
/* store the next fcurve for looping */
fcu_iter= fcu->next;
@@ -222,8 +248,12 @@ short ANIM_remove_driver (struct ID *id, const char rna_path[], int array_index,
}
}
else {
+ /* find the matching driver and remove it only
+ * Note: here is one of the places where we don't want new F-Curve + Driver added!
+ * so 'add' var must be 0
+ */
fcu= verify_driver_fcurve(id, rna_path, array_index, 0);
- if(fcu) {
+ if (fcu) {
BLI_remlink(&adt->drivers, fcu);
free_fcurve(fcu);
@@ -262,7 +292,7 @@ short ANIM_driver_can_paste (void)
/* Main Driver Management API calls:
* Make a copy of the driver for the specified property on the given ID block
*/
-short ANIM_copy_driver (ID *id, const char rna_path[], int array_index, short flag)
+short ANIM_copy_driver (ReportList *reports, ID *id, const char rna_path[], int array_index, short UNUSED(flag))
{
PointerRNA id_ptr, ptr;
PropertyRNA *prop;
@@ -271,7 +301,9 @@ short ANIM_copy_driver (ID *id, const char rna_path[], int array_index, short fl
/* validate pointer first - exit if failure */
RNA_id_pointer_create(id, &id_ptr);
if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) {
- printf("Copy Driver: Could not find Driver, as RNA Path is invalid for the given ID (ID = %s, Path = %s)\n", id->name, rna_path);
+ BKE_reportf(reports, RPT_ERROR,
+ "Could not find Driver to copy, as RNA Path is invalid for the given ID (ID = %s, Path = %s)",
+ id->name, rna_path);
return 0;
}
@@ -307,7 +339,7 @@ short ANIM_copy_driver (ID *id, const char rna_path[], int array_index, short fl
* Add a new driver for the specified property on the given ID block or replace an existing one
* with the driver + driver-curve data from the buffer
*/
-short ANIM_paste_driver (ID *id, const char rna_path[], int array_index, short flag)
+short ANIM_paste_driver (ReportList *reports, ID *id, const char rna_path[], int array_index, short UNUSED(flag))
{
PointerRNA id_ptr, ptr;
PropertyRNA *prop;
@@ -316,13 +348,15 @@ short ANIM_paste_driver (ID *id, const char rna_path[], int array_index, short f
/* validate pointer first - exit if failure */
RNA_id_pointer_create(id, &id_ptr);
if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) {
- printf("Paste Driver: Could not add Driver, as RNA Path is invalid for the given ID (ID = %s, Path = %s)\n", id->name, rna_path);
+ BKE_reportf(reports, RPT_ERROR,
+ "Could not paste Driver, as RNA Path is invalid for the given ID (ID = %s, Path = %s)",
+ id->name, rna_path);
return 0;
}
/* if the buffer is empty, cannot paste... */
if (channeldriver_copypaste_buf == NULL) {
- printf("Paste Driver: No Driver to paste. \n");
+ BKE_report(reports, RPT_ERROR, "Paste Driver: No Driver to paste.");
return 0;
}
@@ -360,28 +394,104 @@ short ANIM_paste_driver (ID *id, const char rna_path[], int array_index, short f
/* ************************************************** */
/* UI-Button Interface */
+/* Temporary wrapper for driver operators for buttons to make it easier to create
+ * such drivers by rerouting all paths through the active object instead so that
+ * they will get picked up by the dependency system.
+ *
+ * < C: context pointer - for getting active data
+ * <> ptr: RNA pointer for property's datablock. May be modified as result of path remapping.
+ * < prop: RNA definition of property to add for
+ *
+ * > returns: MEM_alloc'd string representing the path to the property from the given PointerRNA
+ */
+static char *get_driver_path_hack (bContext *C, PointerRNA *ptr, PropertyRNA *prop)
+{
+ ID *id = (ID *)ptr->id.data;
+ ScrArea *sa = CTX_wm_area(C);
+
+ /* get standard path which may be extended */
+ char *basepath = RNA_path_from_ID_to_property(ptr, prop);
+ char *path = basepath; /* in case no remapping is needed */
+
+ /* Remapping will only be performed in the Properties Editor, as only this
+ * restricts the subspace of options to the 'active' data (a manageable state)
+ */
+ // TODO: watch out for pinned context?
+ if ((sa) && (sa->spacetype == SPACE_BUTS)) {
+ Object *ob = CTX_data_active_object(C);
+
+ if (ob && id) {
+ /* only id-types which can be remapped to go through objects should be considered */
+ switch (GS(id->name)) {
+ case ID_MA: /* materials */
+ {
+ Material *ma = give_current_material(ob, ob->actcol);
+
+ /* assumes: material will only be shown if it is active objects's active material it's ok */
+ if ((ID*)ma == id) {
+ /* create new path */
+ // TODO: use RNA path functions to construct instead?
+ path = BLI_sprintfN("material_slots[\"%s\"].material.%s",
+ ma->id.name+2, basepath);
+
+ /* free old one */
+ MEM_freeN(basepath);
+ }
+ }
+ break;
+
+ case ID_TE: /* textures */
+ {
+ Material *ma = give_current_material(ob, ob->actcol);
+ Tex *tex = give_current_material_texture(ma);
+
+ /* assumes: texture will only be shown if it is active material's active texture it's ok */
+ if ((ID*)tex == id) {
+ /* create new path */
+ // TODO: use RNA path functions to construct step by step instead?
+ path = BLI_sprintfN("material_slots[\"%s\"].material.texture_slots[\"%s\"].texture.%s",
+ ma->id.name+2, tex->id.name+2, basepath);
+
+ /* free old one */
+ MEM_freeN(basepath);
+ }
+ }
+ break;
+ }
+
+ /* fix RNA pointer, as we've now changed the ID root by changing the paths */
+ if (basepath != path) {
+ /* rebase provided pointer so that it starts from object... */
+ RNA_pointer_create(&ob->id, ptr->type, ptr->data, ptr);
+ }
+ }
+ }
+
+ /* the path should now have been corrected for use */
+ return path;
+}
+
/* Add Driver Button Operator ------------------------ */
static int add_driver_button_exec (bContext *C, wmOperator *op)
{
- PointerRNA ptr;
+ PointerRNA ptr= {{0}};
PropertyRNA *prop= NULL;
- char *path;
short success= 0;
int index, all= RNA_boolean_get(op->ptr, "all");
/* try to create driver using property retrieved from UI */
- memset(&ptr, 0, sizeof(PointerRNA));
uiContextActiveProperty(C, &ptr, &prop, &index);
-
+
if (all)
index= -1;
-
+
if (ptr.id.data && ptr.data && prop && RNA_property_animateable(&ptr, prop)) {
- path= RNA_path_from_ID_to_property(&ptr, prop);
+ char *path= get_driver_path_hack(C, &ptr, prop);
+ short flags = CREATEDRIVER_WITH_DEFAULT_DVAR;
if (path) {
- success+= ANIM_add_driver(ptr.id.data, path, index, 0, DRIVER_TYPE_PYTHON);
+ success+= ANIM_add_driver(op->reports, ptr.id.data, path, index, flags, DRIVER_TYPE_PYTHON);
MEM_freeN(path);
}
@@ -390,7 +500,7 @@ static int add_driver_button_exec (bContext *C, wmOperator *op)
if (success) {
/* send updates */
uiContextAnimUpdate(C);
-
+
DAG_ids_flush_update(CTX_data_main(C), 0);
WM_event_add_notifier(C, NC_ANIMATION|ND_FCURVES_ORDER, NULL); // XXX
@@ -421,29 +531,28 @@ void ANIM_OT_driver_button_add (wmOperatorType *ot)
static int remove_driver_button_exec (bContext *C, wmOperator *op)
{
- PointerRNA ptr;
+ PointerRNA ptr= {{0}};
PropertyRNA *prop= NULL;
- char *path;
short success= 0;
int index, all= RNA_boolean_get(op->ptr, "all");
/* try to find driver using property retrieved from UI */
- memset(&ptr, 0, sizeof(PointerRNA));
uiContextActiveProperty(C, &ptr, &prop, &index);
if (all)
index= -1;
-
+
if (ptr.id.data && ptr.data && prop) {
- path= RNA_path_from_ID_to_property(&ptr, prop);
- success= ANIM_remove_driver(ptr.id.data, path, index, 0);
+ char *path= get_driver_path_hack(C, &ptr, prop);
+
+ success= ANIM_remove_driver(op->reports, ptr.id.data, path, index, 0);
MEM_freeN(path);
}
if (success) {
/* send updates */
uiContextAnimUpdate(C);
-
+
DAG_ids_flush_update(CTX_data_main(C), 0);
WM_event_add_notifier(C, NC_ANIMATION|ND_FCURVES_ORDER, NULL); // XXX
@@ -474,23 +583,21 @@ void ANIM_OT_driver_button_remove (wmOperatorType *ot)
static int copy_driver_button_exec (bContext *C, wmOperator *op)
{
- PointerRNA ptr;
+ PointerRNA ptr= {{0}};
PropertyRNA *prop= NULL;
- char *path;
short success= 0;
int index;
/* try to create driver using property retrieved from UI */
- memset(&ptr, 0, sizeof(PointerRNA));
uiContextActiveProperty(C, &ptr, &prop, &index);
if (ptr.id.data && ptr.data && prop && RNA_property_animateable(&ptr, prop)) {
- path= RNA_path_from_ID_to_property(&ptr, prop);
+ char *path= get_driver_path_hack(C, &ptr, prop);
if (path) {
/* only copy the driver for the button that this was involved for */
- success= ANIM_copy_driver(ptr.id.data, path, index, 0);
-
+ success= ANIM_copy_driver(op->reports, ptr.id.data, path, index, 0);
+
uiContextAnimUpdate(C);
MEM_freeN(path);
@@ -520,23 +627,21 @@ void ANIM_OT_copy_driver_button (wmOperatorType *ot)
static int paste_driver_button_exec (bContext *C, wmOperator *op)
{
- PointerRNA ptr;
+ PointerRNA ptr= {{0}};
PropertyRNA *prop= NULL;
- char *path;
short success= 0;
int index;
/* try to create driver using property retrieved from UI */
- memset(&ptr, 0, sizeof(PointerRNA));
uiContextActiveProperty(C, &ptr, &prop, &index);
if (ptr.id.data && ptr.data && prop && RNA_property_animateable(&ptr, prop)) {
- path= RNA_path_from_ID_to_property(&ptr, prop);
+ char *path= get_driver_path_hack(C, &ptr, prop);
if (path) {
/* only copy the driver for the button that this was involved for */
- success= ANIM_paste_driver(ptr.id.data, path, index, 0);
-
+ success= ANIM_paste_driver(op->reports, ptr.id.data, path, index, 0);
+
uiContextAnimUpdate(C);
MEM_freeN(path);
diff --git a/source/blender/editors/animation/fmodifier_ui.c b/source/blender/editors/animation/fmodifier_ui.c
index 35e6cb66d45..b47fea58633 100644
--- a/source/blender/editors/animation/fmodifier_ui.c
+++ b/source/blender/editors/animation/fmodifier_ui.c
@@ -43,6 +43,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_fcurve.h"
@@ -74,7 +75,7 @@
}
/* callback to verify modifier data */
-static void validate_fmodifier_cb (bContext *C, void *fcm_v, void *dummy)
+static void validate_fmodifier_cb (bContext *UNUSED(C), void *fcm_v, void *UNUSED(arg))
{
FModifier *fcm= (FModifier *)fcm_v;
FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
@@ -215,7 +216,7 @@ static void draw_modifier__generator(uiLayout *layout, ID *id, FModifier *fcm, s
/* --------------- */
/* draw settings for generator modifier */
-static void draw_modifier__fn_generator(uiLayout *layout, ID *id, FModifier *fcm, short width)
+static void draw_modifier__fn_generator(uiLayout *layout, ID *id, FModifier *fcm, short UNUSED(width))
{
uiLayout *col;
PointerRNA ptr;
@@ -225,20 +226,20 @@ static void draw_modifier__fn_generator(uiLayout *layout, ID *id, FModifier *fcm
/* add the settings */
col= uiLayoutColumn(layout, 1);
- uiItemR(col, &ptr, "function_type", 0, "", 0);
- uiItemR(col, &ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(col, &ptr, "function_type", 0, "", ICON_NULL);
+ uiItemR(col, &ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
col= uiLayoutColumn(layout, 0); // no grouping for now
- uiItemR(col, &ptr, "amplitude", 0, NULL, 0);
- uiItemR(col, &ptr, "phase_multiplier", 0, NULL, 0);
- uiItemR(col, &ptr, "phase_offset", 0, NULL, 0);
- uiItemR(col, &ptr, "value_offset", 0, NULL, 0);
+ uiItemR(col, &ptr, "amplitude", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "phase_multiplier", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "phase_offset", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "value_offset", 0, NULL, ICON_NULL);
}
/* --------------- */
/* draw settings for cycles modifier */
-static void draw_modifier__cycles(uiLayout *layout, ID *id, FModifier *fcm, short width)
+static void draw_modifier__cycles(uiLayout *layout, ID *id, FModifier *fcm, short UNUSED(width))
{
uiLayout *split, *col;
PointerRNA ptr;
@@ -253,21 +254,21 @@ static void draw_modifier__cycles(uiLayout *layout, ID *id, FModifier *fcm, shor
/* before range */
col= uiLayoutColumn(split, 1);
- uiItemL(col, "Before:", 0);
- uiItemR(col, &ptr, "mode_before", 0, "", 0);
- uiItemR(col, &ptr, "cycles_before", 0, NULL, 0);
+ uiItemL(col, "Before:", ICON_NULL);
+ uiItemR(col, &ptr, "mode_before", 0, "", ICON_NULL);
+ uiItemR(col, &ptr, "cycles_before", 0, NULL, ICON_NULL);
/* after range */
col= uiLayoutColumn(split, 1);
- uiItemL(col, "After:", 0);
- uiItemR(col, &ptr, "mode_after", 0, "", 0);
- uiItemR(col, &ptr, "cycles_after", 0, NULL, 0);
+ uiItemL(col, "After:", ICON_NULL);
+ uiItemR(col, &ptr, "mode_after", 0, "", ICON_NULL);
+ uiItemR(col, &ptr, "cycles_after", 0, NULL, ICON_NULL);
}
/* --------------- */
/* draw settings for noise modifier */
-static void draw_modifier__noise(uiLayout *layout, ID *id, FModifier *fcm, short width)
+static void draw_modifier__noise(uiLayout *layout, ID *id, FModifier *fcm, short UNUSED(width))
{
uiLayout *split, *col;
PointerRNA ptr;
@@ -276,20 +277,20 @@ static void draw_modifier__noise(uiLayout *layout, ID *id, FModifier *fcm, short
RNA_pointer_create(id, &RNA_FModifierNoise, fcm, &ptr);
/* blending mode */
- uiItemR(layout, &ptr, "blend_type", 0, NULL, 0);
+ uiItemR(layout, &ptr, "blend_type", 0, NULL, ICON_NULL);
/* split into 2 columns */
split= uiLayoutSplit(layout, 0.5f, 0);
/* col 1 */
col= uiLayoutColumn(split, 0);
- uiItemR(col, &ptr, "scale", 0, NULL, 0);
- uiItemR(col, &ptr, "strength", 0, NULL, 0);
+ uiItemR(col, &ptr, "scale", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "strength", 0, NULL, ICON_NULL);
/* col 2 */
col= uiLayoutColumn(split, 0);
- uiItemR(col, &ptr, "phase", 0, NULL, 0);
- uiItemR(col, &ptr, "depth", 0, NULL, 0);
+ uiItemR(col, &ptr, "phase", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "depth", 0, NULL, ICON_NULL);
}
/* --------------- */
@@ -374,7 +375,7 @@ static int binarysearch_fcm_envelopedata_index (FCM_EnvelopeData array[], float
/* callback to add new envelope data point */
// TODO: should we have a separate file for things like this?
-static void fmod_envelope_addpoint_cb (bContext *C, void *fcm_dv, void *dummy)
+static void fmod_envelope_addpoint_cb (bContext *C, void *fcm_dv, void *UNUSED(arg))
{
Scene *scene= CTX_data_scene(C);
FMod_Envelope *env= (FMod_Envelope *)fcm_dv;
@@ -426,7 +427,7 @@ static void fmod_envelope_addpoint_cb (bContext *C, void *fcm_dv, void *dummy)
/* callback to remove envelope data point */
// TODO: should we have a separate file for things like this?
-static void fmod_envelope_deletepoint_cb (bContext *C, void *fcm_dv, void *ind_v)
+static void fmod_envelope_deletepoint_cb (bContext *UNUSED(C), void *fcm_dv, void *ind_v)
{
FMod_Envelope *env= (FMod_Envelope *)fcm_dv;
FCM_EnvelopeData *fedn;
@@ -454,7 +455,7 @@ static void fmod_envelope_deletepoint_cb (bContext *C, void *fcm_dv, void *ind_v
}
/* draw settings for envelope modifier */
-static void draw_modifier__envelope(uiLayout *layout, ID *id, FModifier *fcm, short width)
+static void draw_modifier__envelope(uiLayout *layout, ID *id, FModifier *fcm, short UNUSED(width))
{
FMod_Envelope *env= (FMod_Envelope *)fcm->data;
FCM_EnvelopeData *fed;
@@ -469,12 +470,12 @@ static void draw_modifier__envelope(uiLayout *layout, ID *id, FModifier *fcm, sh
/* general settings */
col= uiLayoutColumn(layout, 1);
- uiItemL(col, "Envelope:", 0);
- uiItemR(col, &ptr, "reference_value", 0, NULL, 0);
+ uiItemL(col, "Envelope:", ICON_NULL);
+ uiItemR(col, &ptr, "reference_value", 0, NULL, ICON_NULL);
row= uiLayoutRow(col, 1);
- uiItemR(row, &ptr, "default_min", 0, "Min", 0);
- uiItemR(row, &ptr, "default_max", 0, "Max", 0);
+ uiItemR(row, &ptr, "default_min", 0, "Min", ICON_NULL);
+ uiItemR(row, &ptr, "default_max", 0, "Max", ICON_NULL);
/* control points header */
// TODO: move this control-point control stuff to using the new special widgets for lists
@@ -509,7 +510,7 @@ static void draw_modifier__envelope(uiLayout *layout, ID *id, FModifier *fcm, sh
/* --------------- */
/* draw settings for limits modifier */
-static void draw_modifier__limits(uiLayout *layout, ID *id, FModifier *fcm, short width)
+static void draw_modifier__limits(uiLayout *layout, ID *id, FModifier *fcm, short UNUSED(width))
{
uiLayout *split, *col, *row;
PointerRNA ptr;
@@ -526,13 +527,13 @@ static void draw_modifier__limits(uiLayout *layout, ID *id, FModifier *fcm, shor
/* x-minimum */
col= uiLayoutColumn(split, 1);
- uiItemR(col, &ptr, "use_min_x", 0, NULL, 0);
- uiItemR(col, &ptr, "min_x", 0, NULL, 0);
+ uiItemR(col, &ptr, "use_min_x", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "min_x", 0, NULL, ICON_NULL);
/* y-minimum*/
col= uiLayoutColumn(split, 1);
- uiItemR(col, &ptr, "use_min_y", 0, NULL, 0);
- uiItemR(col, &ptr, "min_y", 0, NULL, 0);
+ uiItemR(col, &ptr, "use_min_y", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "min_y", 0, NULL, ICON_NULL);
}
/* row 2: maximum */
@@ -544,20 +545,20 @@ static void draw_modifier__limits(uiLayout *layout, ID *id, FModifier *fcm, shor
/* x-minimum */
col= uiLayoutColumn(split, 1);
- uiItemR(col, &ptr, "use_max_x", 0, NULL, 0);
- uiItemR(col, &ptr, "max_x", 0, NULL, 0);
+ uiItemR(col, &ptr, "use_max_x", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "max_x", 0, NULL, ICON_NULL);
/* y-minimum*/
col= uiLayoutColumn(split, 1);
- uiItemR(col, &ptr, "use_max_y", 0, NULL, 0);
- uiItemR(col, &ptr, "max_y", 0, NULL, 0);
+ uiItemR(col, &ptr, "use_max_y", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "max_y", 0, NULL, ICON_NULL);
}
}
/* --------------- */
/* draw settings for stepped interpolation modifier */
-static void draw_modifier__stepped(uiLayout *layout, ID *id, FModifier *fcm, short width)
+static void draw_modifier__stepped(uiLayout *layout, ID *id, FModifier *fcm, short UNUSED(width))
{
uiLayout *col, *subcol;
PointerRNA ptr;
@@ -567,24 +568,24 @@ static void draw_modifier__stepped(uiLayout *layout, ID *id, FModifier *fcm, sho
/* block 1: "stepping" settings */
col= uiLayoutColumn(layout, 0);
- uiItemR(col, &ptr, "frame_step", 0, NULL, 0);
- uiItemR(col, &ptr, "frame_offset", 0, NULL, 0);
+ uiItemR(col, &ptr, "frame_step", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "frame_offset", 0, NULL, ICON_NULL);
/* block 2: start range settings */
col= uiLayoutColumn(layout, 1);
- uiItemR(col, &ptr, "use_frame_start", 0, NULL, 0);
+ uiItemR(col, &ptr, "use_frame_start", 0, NULL, ICON_NULL);
subcol = uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(&ptr, "use_frame_start"));
- uiItemR(subcol, &ptr, "frame_start", 0, NULL, 0);
+ uiItemR(subcol, &ptr, "frame_start", 0, NULL, ICON_NULL);
/* block 3: end range settings */
col= uiLayoutColumn(layout, 1);
- uiItemR(col, &ptr, "use_frame_end", 0, NULL, 0);
+ uiItemR(col, &ptr, "use_frame_end", 0, NULL, ICON_NULL);
subcol = uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(&ptr, "use_frame_end"));
- uiItemR(subcol, &ptr, "frame_end", 0, NULL, 0);
+ uiItemR(subcol, &ptr, "frame_end", 0, NULL, ICON_NULL);
}
/* --------------- */
@@ -616,16 +617,16 @@ void ANIM_uiTemplate_fmodifier_draw (uiLayout *layout, ID *id, ListBase *modifie
uiBlockSetEmboss(block, UI_EMBOSSN);
/* expand */
- uiItemR(subrow, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(subrow, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
/* checkbox for 'active' status (for now) */
- uiItemR(subrow, &ptr, "active", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(subrow, &ptr, "active", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
/* name */
if (fmi)
- uiItemL(subrow, fmi->name, 0);
+ uiItemL(subrow, fmi->name, ICON_NULL);
else
- uiItemL(subrow, "<Unknown Modifier>", 0);
+ uiItemL(subrow, "<Unknown Modifier>", ICON_NULL);
/* right-align ------------------------------------------- */
subrow= uiLayoutRow(row, 0);
@@ -633,7 +634,7 @@ void ANIM_uiTemplate_fmodifier_draw (uiLayout *layout, ID *id, ListBase *modifie
/* 'mute' button */
- uiItemR(subrow, &ptr, "mute", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(subrow, &ptr, "mute", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
uiBlockSetEmboss(block, UI_EMBOSSN);
diff --git a/source/blender/editors/animation/keyframes_draw.c b/source/blender/editors/animation/keyframes_draw.c
index 02e141a7a69..c1958064431 100644
--- a/source/blender/editors/animation/keyframes_draw.c
+++ b/source/blender/editors/animation/keyframes_draw.c
@@ -39,6 +39,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -47,6 +48,7 @@
#include "DNA_scene_types.h"
#include "DNA_key_types.h"
#include "DNA_lamp_types.h"
+#include "DNA_lattice_types.h"
#include "DNA_mesh_types.h"
#include "DNA_material_types.h"
#include "DNA_meta_types.h"
@@ -58,7 +60,7 @@
#include "BKE_key.h"
#include "BKE_material.h"
#include "BKE_global.h" // XXX remove me!
-#include "BKE_utildefines.h"
+
#include "BIF_gl.h"
@@ -135,6 +137,49 @@ static void nupdate_ak_bezt (void *node, void *data)
ak->key_type= BEZT_KEYTYPE_KEYFRAME;
}
+/* ......... */
+
+/* Comparator callback used for ActKeyColumns and GPencil frame */
+static short compare_ak_gpframe (void *node, void *data)
+{
+ ActKeyColumn *ak= (ActKeyColumn *)node;
+ bGPDframe *gpf= (bGPDframe *)data;
+
+ if (gpf->framenum < ak->cfra)
+ return -1;
+ else if (gpf->framenum > ak->cfra)
+ return 1;
+ else
+ return 0;
+}
+
+/* New node callback used for building ActKeyColumns from GPencil frames */
+static DLRBT_Node *nalloc_ak_gpframe (void *data)
+{
+ ActKeyColumn *ak= MEM_callocN(sizeof(ActKeyColumn), "ActKeyColumnGPF");
+ bGPDframe *gpf= (bGPDframe *)data;
+
+ /* store settings based on state of BezTriple */
+ ak->cfra= gpf->framenum;
+ ak->sel= (gpf->flag & GP_FRAME_SELECT) ? SELECT : 0;
+
+ /* set 'modified', since this is used to identify long keyframes */
+ ak->modified = 1;
+
+ return (DLRBT_Node *)ak;
+}
+
+/* Node updater callback used for building ActKeyColumns from GPencil frames */
+static void nupdate_ak_gpframe (void *node, void *data)
+{
+ ActKeyColumn *ak= (ActKeyColumn *)node;
+ bGPDframe *gpf= (bGPDframe *)data;
+
+ /* set selection status and 'touched' status */
+ if (gpf->flag & GP_FRAME_SELECT) ak->sel = SELECT;
+ ak->modified += 1;
+}
+
/* --------------- */
/* Add the given BezTriple to the given 'list' of Keyframes */
@@ -146,6 +191,15 @@ static void add_bezt_to_keycolumns_list(DLRBT_Tree *keys, BezTriple *bezt)
BLI_dlrbTree_add(keys, compare_ak_bezt, nalloc_ak_bezt, nupdate_ak_bezt, bezt);
}
+/* Add the given GPencil Frame to the given 'list' of Keyframes */
+static void add_gpframe_to_keycolumns_list(DLRBT_Tree *keys, bGPDframe *gpf)
+{
+ if ELEM(NULL, keys, gpf)
+ return;
+ else
+ BLI_dlrbTree_add(keys, compare_ak_gpframe, nalloc_ak_gpframe, nupdate_ak_gpframe, gpf);
+}
+
/* ActBeztColumns (Helpers for Long Keyframes) ------------------------------ */
/* maximum size of default buffer for BezTriple columns */
@@ -392,7 +446,7 @@ static const float _unit_diamond_shape[4][2] = {
};
/* draw a simple diamond shape with OpenGL */
-void draw_keyframe_shape (float x, float y, float xscale, float hsize, short sel, short key_type, short mode)
+void draw_keyframe_shape (float x, float y, float xscale, float hsize, short sel, short key_type, short mode, float alpha)
{
static GLuint displist1=0;
static GLuint displist2=0;
@@ -441,23 +495,30 @@ void draw_keyframe_shape (float x, float y, float xscale, float hsize, short sel
switch (key_type) {
case BEZT_KEYTYPE_BREAKDOWN: /* bluish frames for now */
{
- if (sel) glColor3f(0.33f, 0.75f, 0.93f);
- else glColor3f(0.70f, 0.86f, 0.91f);
+ if (sel) glColor4f(0.33f, 0.75f, 0.93f, alpha);
+ else glColor4f(0.70f, 0.86f, 0.91f, alpha);
}
break;
case BEZT_KEYTYPE_EXTREME: /* redish frames for now */
{
- if (sel) glColor3f(95.0f, 0.5f, 0.5f);
- else glColor3f(0.91f, 0.70f, 0.80f);
+ if (sel) glColor4f(0.95f, 0.5f, 0.5f, alpha);
+ else glColor4f(0.91f, 0.70f, 0.80f, alpha);
+ }
+ break;
+
+ case BEZT_KEYTYPE_JITTER: /* greenish frames for now? */
+ {
+ if (sel) glColor4f(0.38f, 0.75f, 0.26f, alpha);
+ else glColor4f(0.58f, 0.90f, 0.46f, alpha);
}
break;
case BEZT_KEYTYPE_KEYFRAME: /* traditional yellowish frames for now */
default:
{
- if (sel) UI_ThemeColorShade(TH_STRIP_SELECT, 50);
- else glColor3f(0.91f, 0.91f, 0.91f);
+ if (sel) UI_ThemeColorShadeAlpha(TH_STRIP_SELECT, 50, -255*(1.0f-alpha));
+ else glColor4f(0.91f, 0.91f, 0.91f, alpha);
}
break;
}
@@ -467,7 +528,7 @@ void draw_keyframe_shape (float x, float y, float xscale, float hsize, short sel
if ELEM(mode, KEYFRAME_SHAPE_FRAME, KEYFRAME_SHAPE_BOTH) {
/* exterior - black frame */
- glColor3ub(0, 0, 0);
+ glColor4f(0.0f, 0.0f, 0.0f, alpha);
glCallList(displist1);
}
@@ -479,7 +540,7 @@ void draw_keyframe_shape (float x, float y, float xscale, float hsize, short sel
glTranslatef(-x, -y, 0.0f);
}
-static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, float ypos)
+static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, float ypos, short channelLocked)
{
ActKeyColumn *ak;
ActKeyBlock *ab;
@@ -522,6 +583,10 @@ static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, floa
/* draw keys */
if (keys) {
+ /* locked channels are less strongly shown, as feedback for locked channels in DopeSheet */
+ // TODO: allow this opacity factor to be themed?
+ float kalpha = (channelLocked)? 0.35f : 1.0f;
+
for (ak= keys->first; ak; ak= ak->next) {
/* optimisation: if keyframe doesn't appear within 5 units (screenspace) in visible area, don't draw
* - this might give some improvements, since we current have to flip between view/region matrices
@@ -532,7 +597,7 @@ static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, floa
/* draw using OpenGL - uglier but faster */
// NOTE1: a previous version of this didn't work nice for some intel cards
// NOTE2: if we wanted to go back to icons, these are icon = (ak->sel & SELECT) ? ICON_SPACE2 : ICON_SPACE3;
- draw_keyframe_shape(ak->cfra, ypos, xscale, 5.0f, (ak->sel & SELECT), ak->key_type, KEYFRAME_SHAPE_BOTH);
+ draw_keyframe_shape(ak->cfra, ypos, xscale, 5.0f, (ak->sel & SELECT), ak->key_type, KEYFRAME_SHAPE_BOTH, kalpha);
}
}
@@ -553,7 +618,7 @@ void draw_summary_channel(View2D *v2d, bAnimContext *ac, float ypos)
BLI_dlrbTree_linkedlist_sync(&keys);
BLI_dlrbTree_linkedlist_sync(&blocks);
- draw_keylist(v2d, &keys, &blocks, ypos);
+ draw_keylist(v2d, &keys, &blocks, ypos, 0);
BLI_dlrbTree_free(&keys);
BLI_dlrbTree_free(&blocks);
@@ -571,7 +636,7 @@ void draw_scene_channel(View2D *v2d, bDopeSheet *ads, Scene *sce, float ypos)
BLI_dlrbTree_linkedlist_sync(&keys);
BLI_dlrbTree_linkedlist_sync(&blocks);
- draw_keylist(v2d, &keys, &blocks, ypos);
+ draw_keylist(v2d, &keys, &blocks, ypos, 0);
BLI_dlrbTree_free(&keys);
BLI_dlrbTree_free(&blocks);
@@ -589,7 +654,7 @@ void draw_object_channel(View2D *v2d, bDopeSheet *ads, Object *ob, float ypos)
BLI_dlrbTree_linkedlist_sync(&keys);
BLI_dlrbTree_linkedlist_sync(&blocks);
- draw_keylist(v2d, &keys, &blocks, ypos);
+ draw_keylist(v2d, &keys, &blocks, ypos, 0);
BLI_dlrbTree_free(&keys);
BLI_dlrbTree_free(&blocks);
@@ -607,7 +672,7 @@ void draw_fcurve_channel(View2D *v2d, AnimData *adt, FCurve *fcu, float ypos)
BLI_dlrbTree_linkedlist_sync(&keys);
BLI_dlrbTree_linkedlist_sync(&blocks);
- draw_keylist(v2d, &keys, &blocks, ypos);
+ draw_keylist(v2d, &keys, &blocks, ypos, (fcu->flag & FCURVE_PROTECTED));
BLI_dlrbTree_free(&keys);
BLI_dlrbTree_free(&blocks);
@@ -625,7 +690,7 @@ void draw_agroup_channel(View2D *v2d, AnimData *adt, bActionGroup *agrp, float y
BLI_dlrbTree_linkedlist_sync(&keys);
BLI_dlrbTree_linkedlist_sync(&blocks);
- draw_keylist(v2d, &keys, &blocks, ypos);
+ draw_keylist(v2d, &keys, &blocks, ypos, (agrp->flag & AGRP_PROTECTED));
BLI_dlrbTree_free(&keys);
BLI_dlrbTree_free(&blocks);
@@ -643,7 +708,7 @@ void draw_action_channel(View2D *v2d, AnimData *adt, bAction *act, float ypos)
BLI_dlrbTree_linkedlist_sync(&keys);
BLI_dlrbTree_linkedlist_sync(&blocks);
- draw_keylist(v2d, &keys, &blocks, ypos);
+ draw_keylist(v2d, &keys, &blocks, ypos, 0);
BLI_dlrbTree_free(&keys);
BLI_dlrbTree_free(&blocks);
@@ -655,11 +720,11 @@ void draw_gpl_channel(View2D *v2d, bDopeSheet *ads, bGPDlayer *gpl, float ypos)
BLI_dlrbTree_init(&keys);
- gpl_to_keylist(ads, gpl, &keys, NULL);
+ gpl_to_keylist(ads, gpl, &keys);
BLI_dlrbTree_linkedlist_sync(&keys);
- draw_keylist(v2d, &keys, NULL, ypos);
+ draw_keylist(v2d, &keys, NULL, ypos, (gpl->flag & GP_LAYER_LOCKED));
BLI_dlrbTree_free(&keys);
}
@@ -753,6 +818,8 @@ void ob_to_keylist(bDopeSheet *ads, Object *ob, DLRBT_Tree *keys, DLRBT_Tree *bl
/* add material's data */
action_to_keylist(ma->adt, ma->adt->action, keys, blocks);
+
+ // TODO: textures...
}
}
@@ -808,6 +875,14 @@ void ob_to_keylist(bDopeSheet *ads, Object *ob, DLRBT_Tree *keys, DLRBT_Tree *bl
action_to_keylist(me->adt, me->adt->action, keys, blocks);
}
break;
+ case OB_LATTICE: /* ------- Lattice ---------- */
+ {
+ Lattice *lt= (Lattice *)ob->data;
+
+ if ((lt->adt) && !(filterflag & ADS_FILTER_NOLAT))
+ action_to_keylist(lt->adt, lt->adt->action, keys, blocks);
+ }
+ break;
}
/* Add Particle System Keyframes */
@@ -898,26 +973,14 @@ void action_to_keylist(AnimData *adt, bAction *act, DLRBT_Tree *keys, DLRBT_Tree
}
-void gpl_to_keylist(bDopeSheet *ads, bGPDlayer *gpl, DLRBT_Tree *keys, DLRBT_Tree *blocks)
+void gpl_to_keylist(bDopeSheet *UNUSED(ads), bGPDlayer *gpl, DLRBT_Tree *keys)
{
bGPDframe *gpf;
- ActKeyColumn *ak;
if (gpl && keys) {
- /* loop over frames, converting directly to 'keyframes' (should be in order too) */
- for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
- ak= MEM_callocN(sizeof(ActKeyColumn), "ActKeyColumn");
- BLI_addtail((ListBase *)keys, ak);
-
- ak->cfra= (float)gpf->framenum;
- ak->modified = 1;
- ak->key_type= 0;
-
- if (gpf->flag & GP_FRAME_SELECT)
- ak->sel = SELECT;
- else
- ak->sel = 0;
- }
+ /* although the frames should already be in an ordered list, they are not suitable for displaying yet */
+ for (gpf= gpl->frames.first; gpf; gpf= gpf->next)
+ add_gpframe_to_keycolumns_list(keys, gpf);
}
}
diff --git a/source/blender/editors/animation/keyframes_edit.c b/source/blender/editors/animation/keyframes_edit.c
index 17d674784f8..e9a2c1bdc06 100644
--- a/source/blender/editors/animation/keyframes_edit.c
+++ b/source/blender/editors/animation/keyframes_edit.c
@@ -33,12 +33,14 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
#include "DNA_camera_types.h"
#include "DNA_key_types.h"
#include "DNA_lamp_types.h"
+#include "DNA_lattice_types.h"
#include "DNA_mesh_types.h"
#include "DNA_material_types.h"
#include "DNA_object_types.h"
@@ -51,7 +53,7 @@
#include "BKE_fcurve.h"
#include "BKE_key.h"
#include "BKE_material.h"
-#include "BKE_utildefines.h"
+
#include "ED_anim_api.h"
#include "ED_keyframes_edit.h"
@@ -318,6 +320,16 @@ static short ob_keyframes_loop(KeyframeEditData *ked, Object *ob, KeyframeEditFu
}
}
break;
+ case OB_LATTICE: /* ---- Lattice ------ */
+ {
+ Lattice *lt= (Lattice *)ob->data;
+
+ if ((lt->adt) && !(filterflag & ADS_FILTER_NOLAT)) {
+ if (adt_keyframes_loop(ked, lt->adt, key_ok, key_cb, fcu_cb, filterflag))
+ return 1;
+ }
+ }
+ break;
}
/* Add Particle System Keyframes */
@@ -369,7 +381,7 @@ static short scene_keyframes_loop(KeyframeEditData *ked, Scene *sce, KeyframeEdi
}
/* This function is used to loop over the keyframe data in a DopeSheet summary */
-static short summary_keyframes_loop(KeyframeEditData *ked, bAnimContext *ac, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb, int filterflag)
+static short summary_keyframes_loop(KeyframeEditData *ked, bAnimContext *ac, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb, int UNUSED(filterflag))
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
@@ -541,7 +553,7 @@ static short ok_bezier_framerange(KeyframeEditData *ked, BezTriple *bezt)
return ok;
}
-static short ok_bezier_selected(KeyframeEditData *ked, BezTriple *bezt)
+static short ok_bezier_selected(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
/* this macro checks all beztriple handles for selection...
* only one of the verts has to be selected for this to be ok...
@@ -677,7 +689,7 @@ void bezt_remap_times(KeyframeEditData *ked, BezTriple *bezt)
/* Transform */
/* snaps the keyframe to the nearest frame */
-static short snap_bezier_nearest(KeyframeEditData *ked, BezTriple *bezt)
+static short snap_bezier_nearest(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT)
bezt->vec[1][0]= (float)(floor(bezt->vec[1][0]+0.5));
@@ -713,7 +725,7 @@ static short snap_bezier_nearmarker(KeyframeEditData *ked, BezTriple *bezt)
}
/* make the handles have the same value as the key */
-static short snap_bezier_horizontal(KeyframeEditData *ked, BezTriple *bezt)
+static short snap_bezier_horizontal(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT) {
bezt->vec[0][1]= bezt->vec[2][1]= bezt->vec[1][1];
@@ -768,7 +780,7 @@ static short mirror_bezier_cframe(KeyframeEditData *ked, BezTriple *bezt)
return 0;
}
-static short mirror_bezier_yaxis(KeyframeEditData *ked, BezTriple *bezt)
+static short mirror_bezier_yaxis(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
float diff;
@@ -780,7 +792,7 @@ static short mirror_bezier_yaxis(KeyframeEditData *ked, BezTriple *bezt)
return 0;
}
-static short mirror_bezier_xaxis(KeyframeEditData *ked, BezTriple *bezt)
+static short mirror_bezier_xaxis(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
float diff;
@@ -841,7 +853,7 @@ KeyframeEditFunc ANIM_editkeyframes_mirror(short type)
/* Settings */
/* Sets the selected bezier handles to type 'auto' */
-static short set_bezier_auto(KeyframeEditData *ked, BezTriple *bezt)
+static short set_bezier_auto(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if((bezt->f1 & SELECT) || (bezt->f3 & SELECT)) {
if (bezt->f1 & SELECT) bezt->h1= HD_AUTO; /* the secret code for auto */
@@ -859,7 +871,7 @@ static short set_bezier_auto(KeyframeEditData *ked, BezTriple *bezt)
}
/* Sets the selected bezier handles to type 'vector' */
-static short set_bezier_vector(KeyframeEditData *ked, BezTriple *bezt)
+static short set_bezier_vector(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if ((bezt->f1 & SELECT) || (bezt->f3 & SELECT)) {
if (bezt->f1 & SELECT) bezt->h1= HD_VECT;
@@ -879,7 +891,7 @@ static short set_bezier_vector(KeyframeEditData *ked, BezTriple *bezt)
/* Queries if the handle should be set to 'free' or 'align' */
// NOTE: this was used for the 'toggle free/align' option
// currently this isn't used, but may be restored later
-static short bezier_isfree(KeyframeEditData *ked, BezTriple *bezt)
+static short bezier_isfree(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if ((bezt->f1 & SELECT) && (bezt->h1)) return 1;
if ((bezt->f3 & SELECT) && (bezt->h2)) return 1;
@@ -887,7 +899,7 @@ static short bezier_isfree(KeyframeEditData *ked, BezTriple *bezt)
}
/* Sets selected bezier handles to type 'align' */
-static short set_bezier_align(KeyframeEditData *ked, BezTriple *bezt)
+static short set_bezier_align(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f1 & SELECT) bezt->h1= HD_ALIGN;
if (bezt->f3 & SELECT) bezt->h2= HD_ALIGN;
@@ -895,7 +907,7 @@ static short set_bezier_align(KeyframeEditData *ked, BezTriple *bezt)
}
/* Sets selected bezier handles to type 'free' */
-static short set_bezier_free(KeyframeEditData *ked, BezTriple *bezt)
+static short set_bezier_free(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f1 & SELECT) bezt->h1= HD_FREE;
if (bezt->f3 & SELECT) bezt->h2= HD_FREE;
@@ -925,21 +937,21 @@ KeyframeEditFunc ANIM_editkeyframes_handles(short code)
/* ------- */
-static short set_bezt_constant(KeyframeEditData *ked, BezTriple *bezt)
+static short set_bezt_constant(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT)
bezt->ipo= BEZT_IPO_CONST;
return 0;
}
-static short set_bezt_linear(KeyframeEditData *ked, BezTriple *bezt)
+static short set_bezt_linear(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT)
bezt->ipo= BEZT_IPO_LIN;
return 0;
}
-static short set_bezt_bezier(KeyframeEditData *ked, BezTriple *bezt)
+static short set_bezt_bezier(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT)
bezt->ipo= BEZT_IPO_BEZ;
@@ -962,27 +974,34 @@ KeyframeEditFunc ANIM_editkeyframes_ipo(short code)
/* ------- */
-static short set_keytype_keyframe(KeyframeEditData *ked, BezTriple *bezt)
+static short set_keytype_keyframe(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT)
BEZKEYTYPE(bezt)= BEZT_KEYTYPE_KEYFRAME;
return 0;
}
-static short set_keytype_breakdown(KeyframeEditData *ked, BezTriple *bezt)
+static short set_keytype_breakdown(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT)
BEZKEYTYPE(bezt)= BEZT_KEYTYPE_BREAKDOWN;
return 0;
}
-static short set_keytype_extreme(KeyframeEditData *ked, BezTriple *bezt)
+static short set_keytype_extreme(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT)
BEZKEYTYPE(bezt)= BEZT_KEYTYPE_EXTREME;
return 0;
}
+static short set_keytype_jitter(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
+{
+ if (bezt->f2 & SELECT)
+ BEZKEYTYPE(bezt)= BEZT_KEYTYPE_JITTER;
+ return 0;
+}
+
/* Set the interpolation type of the selected BezTriples in each F-Curve to the specified one */
KeyframeEditFunc ANIM_editkeyframes_keytype(short code)
{
@@ -993,6 +1012,9 @@ KeyframeEditFunc ANIM_editkeyframes_keytype(short code)
case BEZT_KEYTYPE_EXTREME: /* extreme keyframe */
return set_keytype_extreme;
+ case BEZT_KEYTYPE_JITTER: /* jitter keyframe */
+ return set_keytype_jitter;
+
case BEZT_KEYTYPE_KEYFRAME: /* proper keyframe */
default:
return set_keytype_keyframe;
@@ -1038,7 +1060,7 @@ static short select_bezier_subtract(KeyframeEditData *ked, BezTriple *bezt)
return 0;
}
-static short select_bezier_invert(KeyframeEditData *ked, BezTriple *bezt)
+static short select_bezier_invert(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
/* Invert the selection for the whole bezier triple */
bezt->f2 ^= SELECT;
diff --git a/source/blender/editors/animation/keyframes_general.c b/source/blender/editors/animation/keyframes_general.c
index befcc0a71cb..92fce2a77e5 100644
--- a/source/blender/editors/animation/keyframes_general.c
+++ b/source/blender/editors/animation/keyframes_general.c
@@ -34,6 +34,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_object_types.h"
@@ -42,6 +43,11 @@
#include "BKE_fcurve.h"
#include "BKE_utildefines.h"
+#include "BKE_report.h"
+#include "BKE_library.h"
+#include "BKE_global.h"
+
+#include "RNA_access.h"
#include "ED_anim_api.h"
#include "ED_keyframing.h"
@@ -112,11 +118,18 @@ void delete_fcurve_keys(FCurve *fcu)
}
/* Free the array of BezTriples if there are not keyframes */
- if (fcu->totvert == 0) {
- if (fcu->bezt)
- MEM_freeN(fcu->bezt);
- fcu->bezt= NULL;
- }
+ if(fcu->totvert == 0)
+ clear_fcurve_keys(fcu);
+}
+
+
+void clear_fcurve_keys(FCurve *fcu)
+{
+ if (fcu->bezt)
+ MEM_freeN(fcu->bezt);
+ fcu->bezt= NULL;
+
+ fcu->totvert= 0;
}
/* ---------------- */
@@ -372,7 +385,7 @@ void sample_fcurve (FCurve *fcu)
int sfra, range;
int i, n, nIndex;
- if(fcu->bezt==NULL) /* ignore baked */
+ if (fcu->bezt==NULL) /* ignore baked */
return;
/* find selected keyframes... once pair has been found, add keyframes */
@@ -441,6 +454,8 @@ void sample_fcurve (FCurve *fcu)
/* globals for copy/paste data (like for other copy/paste buffers) */
ListBase animcopybuf = {NULL, NULL};
static float animcopy_firstframe= 999999999.0f;
+static float animcopy_lastframe= -999999999.0f;
+static float animcopy_cfra= 0.0;
/* datatype for use in copy/paste buffer */
typedef struct tAnimCopybufItem {
@@ -453,6 +468,8 @@ typedef struct tAnimCopybufItem {
int totvert; /* number of keyframes stored for this channel */
BezTriple *bezt; /* keyframes in buffer */
+
+ short id_type; /* Result of GS(id->name)*/
} tAnimCopybufItem;
@@ -481,6 +498,7 @@ void free_anim_copybuf (void)
/* restore initial state */
animcopybuf.first= animcopybuf.last= NULL;
animcopy_firstframe= 999999999.0f;
+ animcopy_lastframe= -999999999.0f;
}
/* ------------------- */
@@ -489,6 +507,7 @@ void free_anim_copybuf (void)
short copy_animedit_keys (bAnimContext *ac, ListBase *anim_data)
{
bAnimListElem *ale;
+ Scene *scene= ac->scene;
/* clear buffer first */
free_anim_copybuf();
@@ -497,7 +516,7 @@ short copy_animedit_keys (bAnimContext *ac, ListBase *anim_data)
for (ale= anim_data->first; ale; ale= ale->next) {
FCurve *fcu= (FCurve *)ale->key_data;
tAnimCopybufItem *aci;
- BezTriple *bezt, *newbuf;
+ BezTriple *bezt, *nbezt, *newbuf;
int i;
/* firstly, check if F-Curve has any selected keyframes
@@ -510,6 +529,7 @@ short copy_animedit_keys (bAnimContext *ac, ListBase *anim_data)
/* init copybuf item info */
aci= MEM_callocN(sizeof(tAnimCopybufItem), "AnimCopybufItem");
aci->id= ale->id;
+ aci->id_type= GS(ale->id->name);
aci->grp= fcu->grp;
aci->rna_path= MEM_dupallocN(fcu->rna_path);
aci->array_index= fcu->array_index;
@@ -527,7 +547,11 @@ short copy_animedit_keys (bAnimContext *ac, ListBase *anim_data)
memcpy(newbuf, aci->bezt, sizeof(BezTriple)*(aci->totvert));
/* copy current beztriple across too */
- *(newbuf + aci->totvert)= *bezt;
+ nbezt= &newbuf[aci->totvert];
+ *nbezt= *bezt;
+
+ /* ensure copy buffer is selected so pasted keys are selected */
+ BEZ_SEL(nbezt);
/* free old array and set the new */
if (aci->bezt) MEM_freeN(aci->bezt);
@@ -537,6 +561,8 @@ short copy_animedit_keys (bAnimContext *ac, ListBase *anim_data)
/* check if this is the earliest frame encountered so far */
if (bezt->vec[1][0] < animcopy_firstframe)
animcopy_firstframe= bezt->vec[1][0];
+ if (bezt->vec[1][0] > animcopy_lastframe)
+ animcopy_lastframe= bezt->vec[1][0];
}
}
@@ -545,76 +571,287 @@ short copy_animedit_keys (bAnimContext *ac, ListBase *anim_data)
/* check if anything ended up in the buffer */
if (ELEM(NULL, animcopybuf.first, animcopybuf.last))
return -1;
-
+
+ /* incase 'relative' paste method is used */
+ animcopy_cfra= CFRA;
+
/* everything went fine */
return 0;
}
+/* ------------------- */
+
+/* most strict method: exact matches only */
+static tAnimCopybufItem *pastebuf_match_path_full(FCurve *fcu, const short from_single, const short to_simple)
+{
+ tAnimCopybufItem *aci;
+
+ for (aci= animcopybuf.first; aci; aci= aci->next) {
+ /* check that paths exist */
+ if (to_simple || (aci->rna_path && fcu->rna_path)) {
+ if (to_simple || (strcmp(aci->rna_path, fcu->rna_path) == 0)) {
+ if ((from_single) || (aci->array_index == fcu->array_index))
+ break;
+ }
+ }
+ }
+
+ return aci;
+}
+
+/* medium match strictness: path match only (i.e. ignore ID) */
+static tAnimCopybufItem *pastebuf_match_path_property(FCurve *fcu, const short from_single, const short UNUSED(to_simple))
+{
+ tAnimCopybufItem *aci;
+
+ for (aci= animcopybuf.first; aci; aci= aci->next) {
+ /* check that paths exist */
+ if (aci->rna_path && fcu->rna_path) {
+ /* find the property of the fcurve and compare against the end of the tAnimCopybufItem
+ * more involved since it needs to to path lookups.
+ * This is not 100% reliable since the user could be editing the curves on a path that wont
+ * resolve, or a bone could be renamed after copying for eg. but in normal copy & paste
+ * this should work out ok.
+ */
+ if (BLI_findindex(which_libbase(G.main, aci->id_type), aci->id) == -1) {
+ /* pedantic but the ID could have been removed, and beats crashing! */
+ printf("paste_animedit_keys: error ID has been removed!\n");
+ }
+ else {
+ PointerRNA id_ptr, rptr;
+ PropertyRNA *prop;
+
+ RNA_id_pointer_create(aci->id, &id_ptr);
+ RNA_path_resolve(&id_ptr, aci->rna_path, &rptr, &prop);
+
+ if (prop) {
+ const char *identifier= RNA_property_identifier(prop);
+ int len_id = strlen(identifier);
+ int len_path = strlen(fcu->rna_path);
+ if (len_id <= len_path) {
+ /* note, paths which end with "] will fail with this test - Animated ID Props */
+ if (strcmp(identifier, fcu->rna_path + (len_path-len_id))==0) {
+ if ((from_single) || (aci->array_index == fcu->array_index))
+ break;
+ }
+ }
+ }
+ else {
+ printf("paste_animedit_keys: failed to resolve path id:%s, '%s'!\n", aci->id->name, aci->rna_path);
+ }
+ }
+ }
+ }
+
+ return aci;
+}
+
+/* least strict matching heuristic: indices only */
+static tAnimCopybufItem *pastebuf_match_index_only(FCurve *fcu, const short from_single, const short UNUSED(to_simple))
+{
+ tAnimCopybufItem *aci;
+
+ for (aci= animcopybuf.first; aci; aci= aci->next) {
+ /* check that paths exist */
+ if ((from_single) || (aci->array_index == fcu->array_index)) {
+ break;
+ }
+ }
+
+ return aci;
+}
+
+/* ................ */
+
+/* helper for paste_animedit_keys() - performs the actual pasting */
+static void paste_animedit_keys_fcurve(FCurve *fcu, tAnimCopybufItem *aci, float offset, const eKeyMergeMode merge_mode)
+{
+ BezTriple *bezt;
+ int i;
+
+ /* First de-select existing FCuvre */
+ for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
+ bezt->f2 &= ~SELECT;
+ }
+
+ /* mix mode with existing data */
+ switch (merge_mode) {
+ case KEYFRAME_PASTE_MERGE_MIX:
+ /* do-nothing */
+ break;
+
+ case KEYFRAME_PASTE_MERGE_OVER:
+ /* remove all keys */
+ clear_fcurve_keys(fcu);
+ break;
+
+ case KEYFRAME_PASTE_MERGE_OVER_RANGE:
+ case KEYFRAME_PASTE_MERGE_OVER_RANGE_ALL:
+ {
+ float f_min;
+ float f_max;
+
+ if (merge_mode==KEYFRAME_PASTE_MERGE_OVER_RANGE) {
+ f_min= aci->bezt[0].vec[1][0] + offset;
+ f_max= aci->bezt[aci->totvert-1].vec[1][0] + offset;
+ }
+ else { /* Entire Range */
+ f_min= animcopy_firstframe + offset;
+ f_max= animcopy_lastframe + offset;
+ }
+
+ /* remove keys in range */
+ if (f_min < f_max) {
+ /* select verts in range for removal */
+ for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
+ if ((f_min < bezt[0].vec[1][0]) && (bezt[0].vec[1][0] < f_max)) {
+ bezt->f2 |= SELECT;
+ }
+ }
+
+ /* remove frames in the range */
+ delete_fcurve_keys(fcu);
+ }
+ break;
+ }
+ }
+
+ /* just start pasting, with the the first keyframe on the current frame, and so on */
+ for (i=0, bezt=aci->bezt; i < aci->totvert; i++, bezt++) {
+ /* temporarily apply offset to src beztriple while copying */
+ bezt->vec[0][0] += offset;
+ bezt->vec[1][0] += offset;
+ bezt->vec[2][0] += offset;
+
+ /* insert the keyframe
+ * NOTE: no special flags here for now
+ */
+ insert_bezt_fcurve(fcu, bezt, 0);
+
+ /* un-apply offset from src beztriple after copying */
+ bezt->vec[0][0] -= offset;
+ bezt->vec[1][0] -= offset;
+ bezt->vec[2][0] -= offset;
+ }
+
+ /* recalculate F-Curve's handles? */
+ calchandles_fcurve(fcu);
+}
+
+/* ------------------- */
+
+EnumPropertyItem keyframe_paste_offset_items[] = {
+ {KEYFRAME_PASTE_OFFSET_CFRA_START, "START", 0, "Frame Start", "Paste keys starting at current frame"},
+ {KEYFRAME_PASTE_OFFSET_CFRA_END, "END", 0, "Frame End", "Paste keys ending at current frame"},
+ {KEYFRAME_PASTE_OFFSET_CFRA_RELATIVE, "RELATIVE", 0, "Frame Relative", "Paste keys relative to the current frame when copying"},
+ {KEYFRAME_PASTE_OFFSET_NONE, "NONE", 0, "No Offset", "Paste keys from original time"},
+ {0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem keyframe_paste_merge_items[] = {
+ {KEYFRAME_PASTE_MERGE_MIX, "MIX", 0, "Mix", "Overlay existing with new keys"},
+ {KEYFRAME_PASTE_MERGE_OVER, "OVER_ALL", 0, "Overwrite All", "Replace all keys"},
+ {KEYFRAME_PASTE_MERGE_OVER_RANGE, "OVER_RANGE", 0, "Overwrite Range", "Overwrite keys in pasted range"},
+ {KEYFRAME_PASTE_MERGE_OVER_RANGE_ALL, "OVER_RANGE_ALL", 0, "Overwrite Entire Range", "Overwrite keys in pasted range, using the range of all copied keys."},
+ {0, NULL, 0, NULL, NULL}};
+
+
/* This function pastes data from the keyframes copy/paste buffer */
-short paste_animedit_keys (bAnimContext *ac, ListBase *anim_data)
+short paste_animedit_keys (bAnimContext *ac, ListBase *anim_data,
+ const eKeyPasteOffset offset_mode, const eKeyMergeMode merge_mode)
{
bAnimListElem *ale;
+
const Scene *scene= (ac->scene);
- const float offset = (float)(CFRA - animcopy_firstframe);
- short no_name= 0;
+ const short from_single= (animcopybuf.first == animcopybuf.last);
+ const short to_simple= (anim_data->first == anim_data->last);
+
+ float offset = 0.0f;
+ int pass;
+
/* check if buffer is empty */
- if (ELEM(NULL, animcopybuf.first, animcopybuf.last)) {
- //error("No data in buffer to paste");
+ if (animcopybuf.first == NULL) {
+ BKE_report(ac->reports, RPT_WARNING, "No data in buffer to paste");
+ return -1;
+ }
+
+ if (anim_data->first == NULL) {
+ BKE_report(ac->reports, RPT_WARNING, "No FCurves to paste into");
return -1;
}
- /* check if single channel in buffer (disregard names if so) */
- if (animcopybuf.first == animcopybuf.last)
- no_name= 1;
- /* from selected channels */
- for (ale= anim_data->first; ale; ale= ale->next) {
- FCurve *fcu = (FCurve *)ale->data; /* destination F-Curve */
- tAnimCopybufItem *aci= NULL;
- BezTriple *bezt;
- int i;
+ /* mathods of offset */
+ switch(offset_mode) {
+ case KEYFRAME_PASTE_OFFSET_CFRA_START:
+ offset= (float)(CFRA - animcopy_firstframe);
+ break;
+ case KEYFRAME_PASTE_OFFSET_CFRA_END:
+ offset= (float)(CFRA - animcopy_lastframe);
+ break;
+ case KEYFRAME_PASTE_OFFSET_CFRA_RELATIVE:
+ offset= (float)(CFRA - animcopy_cfra);
+ break;
+ case KEYFRAME_PASTE_OFFSET_NONE:
+ offset= 0.0f;
+ break;
+ }
+
+ if (from_single && to_simple) {
+ /* 1:1 match, no tricky checking, just paste */
+ FCurve *fcu;
+ tAnimCopybufItem *aci;
- /* find buffer item to paste from
- * - if names don't matter (i.e. only 1 channel in buffer), don't check id/group
- * - if names do matter, only check if id-type is ok for now (group check is not that important)
- * - most importantly, rna-paths should match (array indices are unimportant for now)
+ ale= anim_data->first;
+ fcu= (FCurve *)ale->data; /* destination F-Curve */
+ aci= animcopybuf.first;
+
+ paste_animedit_keys_fcurve(fcu, aci, offset, merge_mode);
+ }
+ else {
+ /* from selected channels
+ * This "passes" system aims to try to find "matching" channels to paste keyframes
+ * into with increasingly loose matching heuristics. The process finishes when at least
+ * one F-Curve has been pasted into.
*/
- // TODO: the matching algorithm here is pathetic!
- for (aci= animcopybuf.first; aci; aci= aci->next) {
- /* check that paths exist */
- if (aci->rna_path && fcu->rna_path) {
- // FIXME: this breaks for bone names!
- if (strcmp(aci->rna_path, fcu->rna_path) == 0) {
- /* should be a match unless there's more than one of these */
- if ((no_name) || (aci->array_index == fcu->array_index))
+ for (pass= 0; pass < 3; pass++) {
+ unsigned int totmatch= 0;
+
+ for (ale= anim_data->first; ale; ale= ale->next) {
+ /* find buffer item to paste from
+ * - if names don't matter (i.e. only 1 channel in buffer), don't check id/group
+ * - if names do matter, only check if id-type is ok for now (group check is not that important)
+ * - most importantly, rna-paths should match (array indices are unimportant for now)
+ */
+ FCurve *fcu = (FCurve *)ale->data; /* destination F-Curve */
+ tAnimCopybufItem *aci= NULL;
+
+ switch (pass) {
+ case 0:
+ /* most strict, must be exact path match data_path & index */
+ aci= pastebuf_match_path_full(fcu, from_single, to_simple);
+ break;
+
+ case 1:
+ /* less strict, just compare property names */
+ aci= pastebuf_match_path_property(fcu, from_single, to_simple);
+ break;
+
+ case 2:
+ /* Comparing properties gave no results, so just do index comparisons */
+ aci= pastebuf_match_index_only(fcu, from_single, to_simple);
break;
}
- }
- }
-
-
- /* copy the relevant data from the matching buffer curve */
- if (aci) {
- /* just start pasting, with the the first keyframe on the current frame, and so on */
- for (i=0, bezt=aci->bezt; i < aci->totvert; i++, bezt++) {
- /* temporarily apply offset to src beztriple while copying */
- bezt->vec[0][0] += offset;
- bezt->vec[1][0] += offset;
- bezt->vec[2][0] += offset;
- /* insert the keyframe
- * NOTE: no special flags here for now
- */
- insert_bezt_fcurve(fcu, bezt, 0);
-
- /* un-apply offset from src beztriple after copying */
- bezt->vec[0][0] -= offset;
- bezt->vec[1][0] -= offset;
- bezt->vec[2][0] -= offset;
+ /* copy the relevant data from the matching buffer curve */
+ if (aci) {
+ totmatch++;
+ paste_animedit_keys_fcurve(fcu, aci, offset, merge_mode);
+ }
}
- /* recalculate F-Curve's handles? */
- calchandles_fcurve(fcu);
+ /* dont continue if some fcurves were pasted */
+ if (totmatch)
+ break;
}
}
diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c
index e92065eea91..39deb417b26 100644
--- a/source/blender/editors/animation/keyframing.c
+++ b/source/blender/editors/animation/keyframing.c
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -49,6 +50,7 @@
#include "BKE_animsys.h"
#include "BKE_action.h"
+#include "BKE_armature.h"
#include "BKE_constraint.h"
#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
@@ -72,6 +74,7 @@
#include "RNA_access.h"
#include "RNA_define.h"
+#include "RNA_enum_types.h"
#include "anim_intern.h"
@@ -86,15 +89,15 @@ short ANIM_get_keyframing_flags (Scene *scene, short incl_mode)
/* standard flags */
{
/* visual keying */
- if (IS_AUTOKEY_FLAG(AUTOMATKEY))
+ if (IS_AUTOKEY_FLAG(scene, AUTOMATKEY))
flag |= INSERTKEY_MATRIX;
/* only needed */
- if (IS_AUTOKEY_FLAG(INSERTNEEDED))
+ if (IS_AUTOKEY_FLAG(scene, INSERTNEEDED))
flag |= INSERTKEY_NEEDED;
- /* default F-Curve color mode - RGB from XYZ indicies */
- if (IS_AUTOKEY_FLAG(XYZ2RGB))
+ /* default F-Curve color mode - RGB from XYZ indices */
+ if (IS_AUTOKEY_FLAG(scene, XYZ2RGB))
flag |= INSERTKEY_XYZ2RGB;
}
@@ -230,6 +233,10 @@ int insert_bezt_fcurve (FCurve *fcu, BezTriple *bezt, short flag)
dst->vec[1][1] += dy;
dst->vec[2][1] += dy;
+ dst->f1= bezt->f1;
+ dst->f2= bezt->f2;
+ dst->f3= bezt->f3;
+
// TODO: perform some other operations?
}
}
@@ -287,13 +294,12 @@ int insert_bezt_fcurve (FCurve *fcu, BezTriple *bezt, short flag)
*/
int insert_vert_fcurve (FCurve *fcu, float x, float y, short flag)
{
- BezTriple beztr;
+ BezTriple beztr= {{{0}}};
int a;
/* set all three points, for nicer start position
* NOTE: +/- 1 on vec.x for left and right handles is so that 'free' handles work ok...
*/
- memset(&beztr, 0, sizeof(BezTriple));
beztr.vec[0][0]= x-1.0f;
beztr.vec[0][1]= y;
beztr.vec[1][0]= x;
@@ -569,6 +575,7 @@ static short visualkey_can_use (PointerRNA *ptr, PropertyRNA *prop)
case CONSTRAINT_TYPE_CHILDOF:
return 1;
case CONSTRAINT_TYPE_TRANSFORM:
+ case CONSTRAINT_TYPE_TRANSLIKE:
return 1;
case CONSTRAINT_TYPE_FOLLOWPATH:
return 1;
@@ -636,51 +643,48 @@ static float visualkey_get_value (PointerRNA *ptr, PropertyRNA *prop, int array_
if (strstr(identifier, "location")) {
return ob->obmat[3][array_index];
}
- else if (strstr(identifier, "rotation")) {
+ else if (strstr(identifier, "rotation_euler")) {
float eul[3];
- mat4_to_eul( eul,ob->obmat);
+ mat4_to_eulO(eul, ob->rotmode, ob->obmat);
return eul[array_index];
}
+ // FIXME: other types of rotation don't work
}
}
else if (ptr->type == &RNA_PoseBone) {
- Object *ob= (Object *)ptr->id.data; /* we assume that this is always set, and is an object */
bPoseChannel *pchan= (bPoseChannel *)ptr->data;
- float tmat[4][4];
+ bPoseChannel tchan;
- /* Although it is not strictly required for this particular space conversion,
- * arg1 must not be null, as there is a null check for the other conversions to
- * be safe. Therefore, the active object is passed here, and in many cases, this
- * will be what owns the pose-channel that is getting this anyway.
+ /* make a copy of pchan so that we can apply and decompose its chan_mat, thus getting the
+ * rest-pose to pose-mode transform that got stored there at the end of posing calculations
+ * for B-Bone deforms to use
+ * - it should be safe to just make a local copy like this, since we're not doing anything with the copied pointers
*/
- copy_m4_m4(tmat, pchan->pose_mat);
- constraint_mat_convertspace(ob, pchan, tmat, CONSTRAINT_SPACE_POSE, CONSTRAINT_SPACE_LOCAL);
+ memcpy(&tchan, pchan, sizeof(bPoseChannel));
+ pchan_apply_mat4(&tchan, pchan->chan_mat, TRUE);
/* Loc, Rot/Quat keyframes are supported... */
if (strstr(identifier, "location")) {
/* only use for non-connected bones */
if ((pchan->bone->parent) && !(pchan->bone->flag & BONE_CONNECTED))
- return tmat[3][array_index];
+ return tchan.loc[array_index];
else if (pchan->bone->parent == NULL)
- return tmat[3][array_index];
+ return tchan.loc[array_index];
}
else if (strstr(identifier, "rotation_euler")) {
- float eul[3];
-
- /* euler-rotation test before standard rotation, as standard rotation does quats */
- mat4_to_eulO( eul, pchan->rotmode,tmat);
- return eul[array_index];
+ return tchan.eul[array_index];
}
else if (strstr(identifier, "rotation_quaternion")) {
- float trimat[3][3], quat[4];
-
- copy_m3_m4(trimat, tmat);
- mat3_to_quat_is_ok( quat,trimat);
-
- return quat[array_index];
+ return tchan.quat[array_index];
+ }
+ else if (strstr(identifier, "rotation_axisangle")) {
+ /* w = 0, x,y,z = 1,2,3 */
+ if (array_index == 0)
+ return tchan.rotAngle;
+ else
+ return tchan.rotAxis[array_index - 1];
}
- // TODO: axis-angle...
}
/* as the function hasn't returned yet, read value from system in the default way */
@@ -697,25 +701,26 @@ static float visualkey_get_value (PointerRNA *ptr, PropertyRNA *prop, int array_
* the keyframe insertion. These include the 'visual' keyframing modes, quick refresh,
* and extra keyframe filtering.
*/
-short insert_keyframe_direct (PointerRNA ptr, PropertyRNA *prop, FCurve *fcu, float cfra, short flag)
+short insert_keyframe_direct (ReportList *reports, PointerRNA ptr, PropertyRNA *prop, FCurve *fcu, float cfra, short flag)
{
float curval= 0.0f;
/* no F-Curve to add keyframe to? */
if (fcu == NULL) {
- printf("ERROR: no F-Curve to add keyframes to \n");
+ BKE_report(reports, RPT_ERROR, "No F-Curve to add keyframes to");
return 0;
}
/* F-Curve not editable? */
- if ( (fcu->flag & FCURVE_PROTECTED) || ((fcu->grp) && (fcu->grp->flag & AGRP_PROTECTED)) ) {
- if (G.f & G_DEBUG)
- printf("WARNING: not inserting keyframe for locked F-Curve \n");
+ if (fcurve_is_keyframable(fcu) == 0) {
+ BKE_reportf(reports, RPT_ERROR,
+ "F-Curve with path = '%s' [%d] cannot be keyframed. Ensure that it is not locked or sampled. Also, try removing F-Modifiers.",
+ fcu->rna_path, fcu->array_index);
return 0;
}
/* if no property given yet, try to validate from F-Curve info */
if ((ptr.id.data == NULL) && (ptr.data==NULL)) {
- printf("ERROR: no RNA-pointer available to retrieve values for keyframing from\n");
+ BKE_report(reports, RPT_ERROR, "No RNA-pointer available to retrieve values for keyframing from");
return 0;
}
if (prop == NULL) {
@@ -724,9 +729,11 @@ short insert_keyframe_direct (PointerRNA ptr, PropertyRNA *prop, FCurve *fcu, fl
/* try to get property we should be affecting */
if ((RNA_path_resolve(&ptr, fcu->rna_path, &tmp_ptr, &prop) == 0) || (prop == NULL)) {
/* property not found... */
- char *idname= (ptr.id.data) ? ((ID *)ptr.id.data)->name : "<No ID-Pointer>";
+ const char *idname= (ptr.id.data) ? ((ID *)ptr.id.data)->name : "<No ID-Pointer>";
- printf("Insert Key: Could not insert keyframe, as RNA Path is invalid for the given ID (ID = %s, Path = %s)\n", idname, fcu->rna_path);
+ BKE_reportf(reports, RPT_ERROR,
+ "Could not insert keyframe, as RNA Path is invalid for the given ID (ID = %s, Path = %s)",
+ idname, fcu->rna_path);
return 0;
}
else {
@@ -815,7 +822,7 @@ short insert_keyframe_direct (PointerRNA ptr, PropertyRNA *prop, FCurve *fcu, fl
*
* index of -1 keys all array indices
*/
-short insert_keyframe (ID *id, bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag)
+short insert_keyframe (ReportList *reports, ID *id, bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag)
{
PointerRNA id_ptr, ptr;
PropertyRNA *prop = NULL;
@@ -825,13 +832,14 @@ short insert_keyframe (ID *id, bAction *act, const char group[], const char rna_
/* validate pointer first - exit if failure */
if (id == NULL) {
- printf("Insert Key: no ID-block to insert keyframe in (Path = %s) \n", rna_path);
+ BKE_reportf(reports, RPT_ERROR, "No ID-block to insert keyframe in (Path = %s)", rna_path);
return 0;
}
RNA_id_pointer_create(id, &id_ptr);
if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) {
- printf("Insert Key: Could not insert keyframe, as RNA Path is invalid for the given ID (ID = %s, Path = %s)\n",
+ BKE_reportf(reports, RPT_ERROR,
+ "Could not insert keyframe, as RNA Path is invalid for the given ID (ID = %s, Path = %s)",
(id)? id->name : "<Missing ID-Block>", rna_path);
return 0;
}
@@ -844,7 +852,9 @@ short insert_keyframe (ID *id, bAction *act, const char group[], const char rna_
act= verify_adt_action(id, 1);
if (act == NULL) {
- printf("Insert Key: Could not insert keyframe, as this type does not support animation data (ID = %s, Path = %s)\n", id->name, rna_path);
+ BKE_reportf(reports, RPT_ERROR,
+ "Could not insert keyframe, as this type does not support animation data (ID = %s, Path = %s)",
+ id->name, rna_path);
return 0;
}
@@ -900,7 +910,7 @@ short insert_keyframe (ID *id, bAction *act, const char group[], const char rna_
}
/* insert keyframe */
- ret += insert_keyframe_direct(ptr, prop, fcu, cfra, flag);
+ ret += insert_keyframe_direct(reports, ptr, prop, fcu, cfra, flag);
}
}
@@ -917,7 +927,7 @@ short insert_keyframe (ID *id, bAction *act, const char group[], const char rna_
* The flag argument is used for special settings that alter the behaviour of
* the keyframe deletion. These include the quick refresh options.
*/
-short delete_keyframe (ID *id, bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag)
+short delete_keyframe (ReportList *reports, ID *id, bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short UNUSED(flag))
{
AnimData *adt= BKE_animdata_from_id(id);
PointerRNA id_ptr, ptr;
@@ -927,14 +937,14 @@ short delete_keyframe (ID *id, bAction *act, const char group[], const char rna_
/* sanity checks */
if ELEM(NULL, id, adt) {
- printf("ERROR: no ID-block and/or AnimData to delete keyframe from \n");
+ BKE_report(reports, RPT_ERROR, "No ID-Block and/Or AnimData to delete keyframe from");
return 0;
}
/* validate pointer first - exit if failure */
RNA_id_pointer_create(id, &id_ptr);
if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) {
- printf("Delete Key: Could not delete keyframe, as RNA Path is invalid for the given ID (ID = %s, Path = %s)\n", id->name, rna_path);
+ BKE_reportf(reports, RPT_ERROR, "Could not delete keyframe, as RNA Path is invalid for the given ID (ID = %s, Path = %s)", id->name, rna_path);
return 0;
}
@@ -953,7 +963,7 @@ short delete_keyframe (ID *id, bAction *act, const char group[], const char rna_
cfra= BKE_nla_tweakedit_remap(adt, cfra, NLATIME_CONVERT_UNMAP);
}
else {
- printf("ERROR: no Action to delete keyframes from for ID = %s \n", id->name);
+ BKE_reportf(reports, RPT_ERROR, "No Action to delete keyframes from for ID = %s \n", id->name);
return 0;
}
}
@@ -997,7 +1007,7 @@ short delete_keyframe (ID *id, bAction *act, const char group[], const char rna_
if ( (fcu->flag & FCURVE_PROTECTED) || ((fcu->grp) && (fcu->grp->flag & AGRP_PROTECTED)) ) {
if (G.f & G_DEBUG)
- printf("WARNING: not inserting keyframe for locked F-Curve \n");
+ printf("WARNING: not deleting keyframe for locked F-Curve \n");
continue;
}
@@ -1064,7 +1074,7 @@ static int insert_key_exec (bContext *C, wmOperator *op)
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
KeyingSet *ks= NULL;
- int type= RNA_int_get(op->ptr, "type");
+ int type= RNA_enum_get(op->ptr, "type");
float cfra= (float)CFRA; // XXX for now, don't bother about all the yucky offset crap
short success;
@@ -1129,11 +1139,12 @@ void ANIM_OT_keyframe_insert (wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- /* keyingset to use
- * - here the type is int not enum, since many of the indicies here are determined dynamically
- */
- prop= RNA_def_int(ot->srna, "type", 0, INT_MIN, INT_MAX, "Keying Set Number", "Index (determined internally) of the Keying Set to use", 0, 1);
+ /* keyingset to use (dynamic enum) */
+ prop= RNA_def_enum(ot->srna, "type", DummyRNA_DEFAULT_items, 0, "Keying Set", "The Keying Set to use");
+ RNA_def_enum_funcs(prop, ANIM_keying_sets_enum_itemf);
RNA_def_property_flag(prop, PROP_HIDDEN);
+ ot->prop= prop;
+
/* confirm whether a keyframe was added by showing a popup
* - by default, this is enabled, since this operator is assumed to be called independently
*/
@@ -1146,7 +1157,7 @@ void ANIM_OT_keyframe_insert (wmOperatorType *ot)
* then calls the menu if necessary before
*/
-static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *event)
+static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Scene *scene= CTX_data_scene(C);
@@ -1158,7 +1169,7 @@ static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *event)
}
else {
/* just call the exec() on the active keyingset */
- RNA_int_set(op->ptr, "type", 0);
+ RNA_enum_set(op->ptr, "type", 0);
RNA_boolean_set(op->ptr, "confirm_success", 1);
return op->type->exec(C, op);
@@ -1172,6 +1183,7 @@ void ANIM_OT_keyframe_insert_menu (wmOperatorType *ot)
/* identifiers */
ot->name= "Insert Keyframe Menu";
ot->idname= "ANIM_OT_keyframe_insert_menu";
+ ot->description= "Insert Keyframes for specified Keying Set, with menu of available Keying Sets if undefined";
/* callbacks */
ot->invoke= insert_key_menu_invoke;
@@ -1181,17 +1193,19 @@ void ANIM_OT_keyframe_insert_menu (wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- /* keyingset to use
- * - here the type is int not enum, since many of the indicies here are determined dynamically
- */
- prop= RNA_def_int(ot->srna, "type", 0, INT_MIN, INT_MAX, "Keying Set Number", "Index (determined internally) of the Keying Set to use", 0, 1);
+ /* keyingset to use (dynamic enum) */
+ prop= RNA_def_enum(ot->srna, "type", DummyRNA_DEFAULT_items, 0, "Keying Set", "The Keying Set to use");
+ RNA_def_enum_funcs(prop, ANIM_keying_sets_enum_itemf);
RNA_def_property_flag(prop, PROP_HIDDEN);
+ ot->prop= prop;
+
/* confirm whether a keyframe was added by showing a popup
* - by default, this is disabled so that if a menu is shown, this doesn't come up too
*/
// XXX should this just be always on?
prop= RNA_def_boolean(ot->srna, "confirm_success", 0, "Confirm Successful Insert", "Show a popup when the keyframes get successfully added");
RNA_def_property_flag(prop, PROP_HIDDEN);
+
/* whether the menu should always be shown
* - by default, the menu should only be shown when there is no active Keying Set (2.5 behaviour),
* although in some cases it might be useful to always shown (pre 2.5 behaviour)
@@ -1207,7 +1221,7 @@ static int delete_key_exec (bContext *C, wmOperator *op)
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
KeyingSet *ks= NULL;
- int type= RNA_int_get(op->ptr, "type");
+ int type= RNA_enum_get(op->ptr, "type");
float cfra= (float)CFRA; // XXX for now, don't bother about all the yucky offset crap
short success;
@@ -1258,6 +1272,8 @@ static int delete_key_exec (bContext *C, wmOperator *op)
void ANIM_OT_keyframe_delete (wmOperatorType *ot)
{
+ PropertyRNA *prop;
+
/* identifiers */
ot->name= "Delete Keyframe";
ot->idname= "ANIM_OT_keyframe_delete";
@@ -1270,10 +1286,12 @@ void ANIM_OT_keyframe_delete (wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- /* keyingset to use
- * - here the type is int not enum, since many of the indicies here are determined dynamically
- */
- RNA_def_int(ot->srna, "type", 0, INT_MIN, INT_MAX, "Keying Set Number", "Index (determined internally) of the Keying Set to use", 0, 1);
+ /* keyingset to use (dynamic enum) */
+ prop= RNA_def_enum(ot->srna, "type", DummyRNA_DEFAULT_items, 0, "Keying Set", "The Keying Set to use");
+ RNA_def_enum_funcs(prop, ANIM_keying_sets_enum_itemf);
+ RNA_def_property_flag(prop, PROP_HIDDEN);
+ ot->prop= prop;
+
/* confirm whether a keyframe was added by showing a popup
* - by default, this is enabled, since this operator is assumed to be called independently
*/
@@ -1308,7 +1326,7 @@ static int delete_key_v3d_exec (bContext *C, wmOperator *op)
for (fcu= act->curves.first; fcu; fcu= fcn) {
fcn= fcu->next;
- success+= delete_keyframe(id, NULL, NULL, fcu->rna_path, fcu->array_index, cfra, 0);
+ success+= delete_keyframe(op->reports, id, NULL, NULL, fcu->rna_path, fcu->array_index, cfra, 0);
}
}
@@ -1349,7 +1367,7 @@ static int insert_key_button_exec (bContext *C, wmOperator *op)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- PointerRNA ptr;
+ PointerRNA ptr= {{0}};
PropertyRNA *prop= NULL;
char *path;
float cfra= (float)CFRA; // XXX for now, don't bother about all the yucky offset crap
@@ -1361,7 +1379,6 @@ static int insert_key_button_exec (bContext *C, wmOperator *op)
flag = ANIM_get_keyframing_flags(scene, 1);
/* try to insert keyframe using property retrieved from UI */
- memset(&ptr, 0, sizeof(PointerRNA));
uiContextActiveProperty(C, &ptr, &prop, &index);
if ((ptr.id.data && ptr.data && prop) && RNA_property_animateable(&ptr, prop)) {
@@ -1378,7 +1395,7 @@ static int insert_key_button_exec (bContext *C, wmOperator *op)
length= 1;
for (a=0; a<length; a++)
- success+= insert_keyframe(ptr.id.data, NULL, NULL, path, index+a, cfra, flag);
+ success+= insert_keyframe(op->reports, ptr.id.data, NULL, NULL, path, index+a, cfra, flag);
MEM_freeN(path);
}
@@ -1387,7 +1404,7 @@ static int insert_key_button_exec (bContext *C, wmOperator *op)
NlaStrip *strip= (NlaStrip *)ptr.data;
FCurve *fcu= list_find_fcurve(&strip->fcurves, RNA_property_identifier(prop), flag);
- success+= insert_keyframe_direct(ptr, prop, fcu, cfra, 0);
+ success+= insert_keyframe_direct(op->reports, ptr, prop, fcu, cfra, 0);
}
else {
if (G.f & G_DEBUG)
@@ -1396,8 +1413,8 @@ static int insert_key_button_exec (bContext *C, wmOperator *op)
}
}
else if (G.f & G_DEBUG) {
- printf("ptr.data = %p, prop = %p,", ptr.data, prop);
- if(prop)
+ printf("ptr.data = %p, prop = %p,", (void *)ptr.data, (void *)prop);
+ if (prop)
printf("animateable = %d \n", RNA_property_animateable(&ptr, prop));
else
printf("animateable = NULL \n");
@@ -1406,7 +1423,7 @@ static int insert_key_button_exec (bContext *C, wmOperator *op)
if (success) {
/* send updates */
uiContextAnimUpdate(C);
-
+
DAG_ids_flush_update(bmain, 0);
/* send notifiers that keyframes have been changed */
@@ -1439,7 +1456,7 @@ static int delete_key_button_exec (bContext *C, wmOperator *op)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- PointerRNA ptr;
+ PointerRNA ptr= {{0}};
PropertyRNA *prop= NULL;
char *path;
float cfra= (float)CFRA; // XXX for now, don't bother about all the yucky offset crap
@@ -1447,7 +1464,6 @@ static int delete_key_button_exec (bContext *C, wmOperator *op)
int a, index, length, all= RNA_boolean_get(op->ptr, "all");
/* try to insert keyframe using property retrieved from UI */
- memset(&ptr, 0, sizeof(PointerRNA));
uiContextActiveProperty(C, &ptr, &prop, &index);
if (ptr.id.data && ptr.data && prop) {
@@ -1457,14 +1473,14 @@ static int delete_key_button_exec (bContext *C, wmOperator *op)
if (all) {
length= RNA_property_array_length(&ptr, prop);
- if(length) index= 0;
+ if (length) index= 0;
else length= 1;
}
else
length= 1;
for (a=0; a<length; a++)
- success+= delete_keyframe(ptr.id.data, NULL, NULL, path, index+a, cfra, 0);
+ success+= delete_keyframe(op->reports, ptr.id.data, NULL, NULL, path, index+a, cfra, 0);
MEM_freeN(path);
}
@@ -1472,14 +1488,14 @@ static int delete_key_button_exec (bContext *C, wmOperator *op)
printf("Button Delete-Key: no path to property \n");
}
else if (G.f & G_DEBUG) {
- printf("ptr.data = %p, prop = %p \n", ptr.data, prop);
+ printf("ptr.data = %p, prop = %p \n", (void *)ptr.data, (void *)prop);
}
if (success) {
/* send updates */
uiContextAnimUpdate(C);
-
+
DAG_ids_flush_update(bmain, 0);
/* send notifiers that keyframes have been changed */
diff --git a/source/blender/editors/animation/keyingsets.c b/source/blender/editors/animation/keyingsets.c
index d80ccf2cd29..2df7d21e907 100644
--- a/source/blender/editors/animation/keyingsets.c
+++ b/source/blender/editors/animation/keyingsets.c
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_scene_types.h"
@@ -59,6 +60,7 @@
#include "RNA_access.h"
#include "RNA_define.h"
+#include "RNA_enum_types.h"
#include "anim_intern.h"
@@ -107,7 +109,7 @@ static int keyingset_poll_activePath_edit (bContext *C)
/* Add a Default (Empty) Keying Set ------------------------- */
-static int add_default_keyingset_exec (bContext *C, wmOperator *op)
+static int add_default_keyingset_exec (bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
short flag=0, keyingflag=0;
@@ -286,7 +288,7 @@ static int add_keyingset_button_exec (bContext *C, wmOperator *op)
Scene *scene= CTX_data_scene(C);
KeyingSet *ks = NULL;
PropertyRNA *prop= NULL;
- PointerRNA ptr;
+ PointerRNA ptr= {{0}};
char *path = NULL;
short success= 0;
int index=0, pflag=0;
@@ -306,7 +308,7 @@ static int add_keyingset_button_exec (bContext *C, wmOperator *op)
keyingflag |= ANIM_get_keyframing_flags(scene, 0);
- if (IS_AUTOKEY_FLAG(XYZ2RGB))
+ if (IS_AUTOKEY_FLAG(scene, XYZ2RGB))
keyingflag |= INSERTKEY_XYZ2RGB;
/* call the API func, and set the active keyingset index */
@@ -322,7 +324,6 @@ static int add_keyingset_button_exec (bContext *C, wmOperator *op)
ks= BLI_findlink(&scene->keyingsets, scene->active_keyingset-1);
/* try to add to keyingset using property retrieved from UI */
- memset(&ptr, 0, sizeof(PointerRNA));
uiContextActiveProperty(C, &ptr, &prop, &index);
/* check if property is able to be added */
@@ -387,7 +388,7 @@ static int remove_keyingset_button_exec (bContext *C, wmOperator *op)
Scene *scene= CTX_data_scene(C);
KeyingSet *ks = NULL;
PropertyRNA *prop= NULL;
- PointerRNA ptr;
+ PointerRNA ptr= {{0}};
char *path = NULL;
short success= 0;
int index=0;
@@ -408,7 +409,6 @@ static int remove_keyingset_button_exec (bContext *C, wmOperator *op)
ks= BLI_findlink(&scene->keyingsets, scene->active_keyingset-1);
/* try to add to keyingset using property retrieved from UI */
- memset(&ptr, 0, sizeof(PointerRNA));
uiContextActiveProperty(C, &ptr, &prop, &index);
if (ptr.id.data && ptr.data && prop) {
@@ -419,12 +419,9 @@ static int remove_keyingset_button_exec (bContext *C, wmOperator *op)
/* try to find a path matching this description */
ksp= BKE_keyingset_find_path(ks, ptr.id.data, ks->name, path, index, KSP_GROUP_KSNAME);
-
+
if (ksp) {
- /* just free it... */
- MEM_freeN(ksp->rna_path);
- BLI_freelinkN(&ks->paths, ksp);
-
+ BKE_keyingset_free_path(ks, ksp);
success= 1;
}
@@ -464,7 +461,7 @@ void ANIM_OT_keyingset_button_remove (wmOperatorType *ot)
/* Change Active KeyingSet Operator ------------------------ */
/* This operator checks if a menu should be shown for choosing the KeyingSet to make the active one */
-static int keyingset_active_menu_invoke (bContext *C, wmOperator *op, wmEvent *event)
+static int keyingset_active_menu_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
/* call the menu, which will call this operator again, hence the cancelled */
ANIM_keying_sets_menu_setup(C, op->type->name, "ANIM_OT_keying_set_active_set");
@@ -503,7 +500,7 @@ void ANIM_OT_keying_set_active_set (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* keyingset to use
- * - here the type is int not enum, since many of the indicies here are determined dynamically
+ * - here the type is int not enum, since many of the indices here are determined dynamically
*/
RNA_def_int(ot->srna, "type", 0, INT_MIN, INT_MAX, "Keying Set Number", "Index (determined internally) of the Keying Set to use", 0, 1);
}
@@ -558,7 +555,7 @@ KeyingSet *ANIM_builtin_keyingset_get_named (KeyingSet *prevKS, const char name[
/* --------------- */
/* Add the given KeyingSetInfo to the list of type infos, and create an appropriate builtin set too */
-void ANIM_keyingset_info_register (const bContext *C, KeyingSetInfo *ksi)
+void ANIM_keyingset_info_register (KeyingSetInfo *ksi)
{
KeyingSet *ks;
@@ -605,7 +602,7 @@ void ANIM_keyingset_info_unregister (const bContext *C, KeyingSetInfo *ksi)
/* --------------- */
-void ANIM_keyingset_infos_exit ()
+void ANIM_keyingset_infos_exit (void)
{
KeyingSetInfo *ksi, *next;
@@ -676,10 +673,86 @@ int ANIM_scene_get_keyingset_index (Scene *scene, KeyingSet *ks)
return 0;
}
+/* Get Keying Set to use for Auto-Keyframing some transforms */
+KeyingSet *ANIM_get_keyingset_for_autokeying(Scene *scene, const char *tranformKSName)
+{
+ /* get KeyingSet to use
+ * - use the active KeyingSet if defined (and user wants to use it for all autokeying),
+ * or otherwise key transforms only
+ */
+ if (IS_AUTOKEY_FLAG(scene, ONLYKEYINGSET) && (scene->active_keyingset))
+ return ANIM_scene_get_active_keyingset(scene);
+ else if (IS_AUTOKEY_FLAG(scene, INSERTAVAIL))
+ return ANIM_builtin_keyingset_get_named(NULL, "Available");
+ else
+ return ANIM_builtin_keyingset_get_named(NULL, tranformKSName);
+}
+
/* Menu of All Keying Sets ----------------------------- */
+/* Dynamically populate an enum of Keying Sets */
+EnumPropertyItem *ANIM_keying_sets_enum_itemf (bContext *C, PointerRNA *UNUSED(ptr), int *free)
+{
+ Scene *scene = CTX_data_scene(C);
+ KeyingSet *ks;
+ EnumPropertyItem *item= NULL, item_tmp= {0};
+ int totitem= 0;
+ int i= 0;
+
+ if (C == NULL) {
+ return DummyRNA_DEFAULT_items;
+ }
+
+ /* active Keying Set
+ * - only include entry if it exists
+ */
+ if (scene->active_keyingset) {
+ /* active Keying Set */
+ item_tmp.identifier= item_tmp.name= "Active Keying Set";
+ item_tmp.value= i++;
+ RNA_enum_item_add(&item, &totitem, &item_tmp);
+
+ /* separator */
+ RNA_enum_item_add_separator(&item, &totitem);
+ }
+ else
+ i++;
+
+ /* user-defined Keying Sets
+ * - these are listed in the order in which they were defined for the active scene
+ */
+ if (scene->keyingsets.first) {
+ for (ks= scene->keyingsets.first; ks; ks= ks->next) {
+ if (ANIM_keyingset_context_ok_poll(C, ks)) {
+ item_tmp.identifier= item_tmp.name= ks->name;
+ item_tmp.value= i++;
+ RNA_enum_item_add(&item, &totitem, &item_tmp);
+ }
+ }
+
+ /* separator */
+ RNA_enum_item_add_separator(&item, &totitem);
+ }
+
+ /* builtin Keying Sets */
+ i= -1;
+ for (ks= builtin_keyingsets.first; ks; ks= ks->next) {
+ /* only show KeyingSet if context is suitable */
+ if (ANIM_keyingset_context_ok_poll(C, ks)) {
+ item_tmp.identifier= item_tmp.name= ks->name;
+ item_tmp.value= i--;
+ RNA_enum_item_add(&item, &totitem, &item_tmp);
+ }
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+ *free= 1;
+
+ return item;
+}
+
/* Create (and show) a menu containing all the Keying Sets which can be used in the current context */
-void ANIM_keying_sets_menu_setup (bContext *C, char title[], char op_name[])
+void ANIM_keying_sets_menu_setup (bContext *C, const char title[], const char op_name[])
{
Scene *scene= CTX_data_scene(C);
KeyingSet *ks;
@@ -687,14 +760,14 @@ void ANIM_keying_sets_menu_setup (bContext *C, char title[], char op_name[])
uiLayout *layout;
int i = 0;
- pup= uiPupMenuBegin(C, title, 0);
+ pup= uiPupMenuBegin(C, title, ICON_NULL);
layout= uiPupMenuLayout(pup);
/* active Keying Set
* - only include entry if it exists
*/
if (scene->active_keyingset) {
- uiItemIntO(layout, "Active Keying Set", 0, op_name, "type", i++);
+ uiItemIntO(layout, "Active Keying Set", ICON_NULL, op_name, "type", i++);
uiItemS(layout);
}
else
@@ -706,7 +779,7 @@ void ANIM_keying_sets_menu_setup (bContext *C, char title[], char op_name[])
if (scene->keyingsets.first) {
for (ks= scene->keyingsets.first; ks; ks= ks->next) {
if (ANIM_keyingset_context_ok_poll(C, ks))
- uiItemIntO(layout, ks->name, 0, op_name, "type", i++);
+ uiItemIntO(layout, ks->name, ICON_NULL, op_name, "type", i++);
}
uiItemS(layout);
}
@@ -716,7 +789,7 @@ void ANIM_keying_sets_menu_setup (bContext *C, char title[], char op_name[])
for (ks= builtin_keyingsets.first; ks; ks= ks->next) {
/* only show KeyingSet if context is suitable */
if (ANIM_keyingset_context_ok_poll(C, ks))
- uiItemIntO(layout, ks->name, 0, op_name, "type", i--);
+ uiItemIntO(layout, ks->name, ICON_NULL, op_name, "type", i--);
}
uiPupMenuEnd(C, pup);
@@ -805,6 +878,7 @@ void ANIM_relative_keyingset_add_source (ListBase *dsources, ID *id, StructRNA *
int ANIM_apply_keyingset (bContext *C, ListBase *dsources, bAction *act, KeyingSet *ks, short mode, float cfra)
{
Scene *scene= CTX_data_scene(C);
+ ReportList *reports = CTX_wm_reports(C);
KS_Path *ksp;
int kflag=0, success= 0;
char *groupname= NULL;
@@ -900,9 +974,9 @@ int ANIM_apply_keyingset (bContext *C, ListBase *dsources, bAction *act, KeyingS
for (; i < arraylen; i++) {
/* action to take depends on mode */
if (mode == MODIFYKEY_MODE_INSERT)
- success += insert_keyframe(ksp->id, act, groupname, ksp->rna_path, i, cfra, kflag2);
+ success += insert_keyframe(reports, ksp->id, act, groupname, ksp->rna_path, i, cfra, kflag2);
else if (mode == MODIFYKEY_MODE_DELETE)
- success += delete_keyframe(ksp->id, act, groupname, ksp->rna_path, i, cfra, kflag2);
+ success += delete_keyframe(reports, ksp->id, act, groupname, ksp->rna_path, i, cfra, kflag2);
}
/* set recalc-flags */
@@ -912,7 +986,7 @@ int ANIM_apply_keyingset (bContext *C, ListBase *dsources, bAction *act, KeyingS
{
Object *ob= (Object *)ksp->id;
- ob->recalc |= OB_RECALC_ALL; // XXX: only object transforms only?
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME; // XXX: only object transforms only?
}
break;
}
diff --git a/source/blender/editors/armature/BIF_retarget.h b/source/blender/editors/armature/BIF_retarget.h
index 7c590a48b35..acdf07b6466 100644
--- a/source/blender/editors/armature/BIF_retarget.h
+++ b/source/blender/editors/armature/BIF_retarget.h
@@ -154,7 +154,7 @@ typedef struct RigControl {
void BIF_retargetArc(struct bContext *C, ReebArc *earc, RigGraph *template_rigg);
RigGraph *RIG_graphFromArmature(const struct bContext *C, struct Object *ob, struct bArmature *arm);
int RIG_nbJoints(RigGraph *rg);
-char *RIG_nameBone(RigGraph *rg, int arc_index, int bone_index);
+const char *RIG_nameBone(RigGraph *rg, int arc_index, int bone_index);
void RIG_freeRigGraph(BGraph *rg);
#endif /* BIF_RETARGET_H */
diff --git a/source/blender/editors/armature/CMakeLists.txt b/source/blender/editors/armature/CMakeLists.txt
index b5634921343..6355cc20617 100644
--- a/source/blender/editors/armature/CMakeLists.txt
+++ b/source/blender/editors/armature/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -32,8 +30,24 @@ SET(INC
../../../../intern/opennl/extern
)
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ armature_ops.c
+ editarmature.c
+ editarmature_generate.c
+ editarmature_retarget.c
+ editarmature_sketch.c
+ meshlaplacian.c
+ poseSlide.c
+ poseUtils.c
+ poselib.c
+ poseobject.c
+ reeb.c
+
+ BIF_generate.h
+ BIF_retarget.h
+ armature_intern.h
+ meshlaplacian.h
+ reeb.h
+)
-BLENDERLIB(bf_editor_armature "${SRC}" "${INC}")
+blender_add_lib(bf_editor_armature "${SRC}" "${INC}")
diff --git a/source/blender/editors/armature/Makefile b/source/blender/editors/armature/Makefile
deleted file mode 100644
index 707ceb55246..00000000000
--- a/source/blender/editors/armature/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_armature
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_OPENNL)/include
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h
index 2d28d3cb9e5..fd54d10fd88 100644
--- a/source/blender/editors/armature/armature_intern.h
+++ b/source/blender/editors/armature/armature_intern.h
@@ -51,9 +51,7 @@ void ARMATURE_OT_align(struct wmOperatorType *ot);
void ARMATURE_OT_calculate_roll(struct wmOperatorType *ot);
void ARMATURE_OT_switch_direction(struct wmOperatorType *ot);
-void ARMATURE_OT_subdivs(struct wmOperatorType *ot);
-void ARMATURE_OT_subdivide_simple(struct wmOperatorType *ot);
-void ARMATURE_OT_subdivide_multi(struct wmOperatorType *ot);
+void ARMATURE_OT_subdivide(struct wmOperatorType *ot);
void ARMATURE_OT_parent_set(struct wmOperatorType *ot);
void ARMATURE_OT_parent_clear(struct wmOperatorType *ot);
@@ -78,6 +76,7 @@ void ARMATURE_OT_flip_names(struct wmOperatorType *ot);
void ARMATURE_OT_flags_set(struct wmOperatorType *ot);
+void ARMATURE_OT_layers_show_all(struct wmOperatorType *ot);
void ARMATURE_OT_armature_layers(struct wmOperatorType *ot);
void ARMATURE_OT_bone_layers(struct wmOperatorType *ot);
@@ -92,6 +91,7 @@ void POSE_OT_visual_transform_apply(struct wmOperatorType *ot);
void POSE_OT_rot_clear(struct wmOperatorType *ot);
void POSE_OT_loc_clear(struct wmOperatorType *ot);
void POSE_OT_scale_clear(struct wmOperatorType *ot);
+void POSE_OT_transforms_clear(struct wmOperatorType *ot);
void POSE_OT_copy(struct wmOperatorType *ot);
void POSE_OT_paste(struct wmOperatorType *ot);
@@ -106,7 +106,6 @@ void POSE_OT_select_grouped(struct wmOperatorType *ot);
void POSE_OT_group_add(struct wmOperatorType *ot);
void POSE_OT_group_remove(struct wmOperatorType *ot);
-void POSE_OT_group_remove(struct wmOperatorType *ot);
void POSE_OT_group_assign(struct wmOperatorType *ot);
void POSE_OT_group_unassign(struct wmOperatorType *ot);
void POSE_OT_group_select(struct wmOperatorType *ot);
diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c
index 535cc62caf6..e28c7e9a6f1 100644
--- a/source/blender/editors/armature/armature_ops.c
+++ b/source/blender/editors/armature/armature_ops.c
@@ -57,9 +57,7 @@ void ED_operatortypes_armature(void)
WM_operatortype_append(ARMATURE_OT_align);
WM_operatortype_append(ARMATURE_OT_calculate_roll);
WM_operatortype_append(ARMATURE_OT_switch_direction);
- WM_operatortype_append(ARMATURE_OT_subdivs);
- WM_operatortype_append(ARMATURE_OT_subdivide_simple);
- WM_operatortype_append(ARMATURE_OT_subdivide_multi);
+ WM_operatortype_append(ARMATURE_OT_subdivide);
WM_operatortype_append(ARMATURE_OT_parent_set);
WM_operatortype_append(ARMATURE_OT_parent_clear);
@@ -84,6 +82,7 @@ void ED_operatortypes_armature(void)
WM_operatortype_append(ARMATURE_OT_flags_set);
+ WM_operatortype_append(ARMATURE_OT_layers_show_all);
WM_operatortype_append(ARMATURE_OT_armature_layers);
WM_operatortype_append(ARMATURE_OT_bone_layers);
@@ -107,6 +106,7 @@ void ED_operatortypes_armature(void)
WM_operatortype_append(POSE_OT_rot_clear);
WM_operatortype_append(POSE_OT_loc_clear);
WM_operatortype_append(POSE_OT_scale_clear);
+ WM_operatortype_append(POSE_OT_transforms_clear);
WM_operatortype_append(POSE_OT_copy);
WM_operatortype_append(POSE_OT_paste);
@@ -254,6 +254,7 @@ void ED_keymap_armature(wmKeyConfig *keyconf)
RNA_enum_set(kmi->ptr, "mode", 0); // clear
/* armature/bone layers */
+ WM_keymap_add_item(keymap, "ARMATURE_OT_layers_show_all", ACCENTGRAVEKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "ARMATURE_OT_armature_layers", MKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "ARMATURE_OT_bone_layers", MKEY, KM_PRESS, 0, 0);
@@ -273,8 +274,10 @@ void ED_keymap_armature(wmKeyConfig *keyconf)
keymap= WM_keymap_find(keyconf, "Pose", 0, 0);
keymap->poll= ED_operator_posemode;
- // XXX: set parent is object-based operator, but it should also be available here...
+ /* set parent and add object are object-based operators, but we make them
+ available here because it's useful to do in pose mode too */
WM_keymap_add_item(keymap, "OBJECT_OT_parent_set", PKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_menu(keymap, "INFO_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "POSE_OT_hide", HKEY, KM_PRESS, 0, 0);
kmi= WM_keymap_add_item(keymap, "POSE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0);
@@ -331,6 +334,7 @@ void ED_keymap_armature(wmKeyConfig *keyconf)
RNA_enum_set(kmi->ptr, "mode", 0); // clear
/* armature/bone layers */
+ WM_keymap_add_item(keymap, "ARMATURE_OT_layers_show_all", ACCENTGRAVEKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "POSE_OT_armature_layers", MKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "POSE_OT_bone_layers", MKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c
index 930f6e684fc..e7bff9ec203 100644
--- a/source/blender/editors/armature/editarmature.c
+++ b/source/blender/editors/armature/editarmature.c
@@ -31,6 +31,7 @@
#include <string.h>
#include <math.h>
#include <float.h>
+#include <assert.h>
#include "DNA_anim_types.h"
@@ -43,6 +44,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_editVert.h"
#include "BLI_ghash.h"
@@ -118,7 +120,7 @@ void ED_armature_validate_active(struct bArmature *arm)
EditBone *ebone= arm->act_edbone;
if(ebone) {
- if(ebone->flag & BONE_HIDDEN_A || (ebone->flag & BONE_SELECTED)==0)
+ if(ebone->flag & BONE_HIDDEN_A)
arm->act_edbone= NULL;
}
}
@@ -151,6 +153,91 @@ void ED_armature_edit_bone_remove(bArmature *arm, EditBone *exBone)
bone_free(arm, exBone);
}
+/* context: editmode armature */
+EditBone *ED_armature_bone_get_mirrored(ListBase *edbo, EditBone *ebo)
+{
+ EditBone *eboflip= NULL;
+ char name[32];
+
+ if (ebo == NULL)
+ return NULL;
+
+ flip_side_name(name, ebo->name, FALSE);
+
+ for (eboflip= edbo->first; eboflip; eboflip=eboflip->next) {
+ if (ebo != eboflip) {
+ if (!strcmp (name, eboflip->name))
+ break;
+ }
+ }
+
+ return eboflip;
+}
+
+/* helper function for tools to work on mirrored parts.
+ it leaves mirrored bones selected then too, which is a good indication of what happened */
+static void armature_select_mirrored(bArmature *arm)
+{
+ /* Select mirrored bones */
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ EditBone *curBone, *ebone_mirr;
+
+ for (curBone=arm->edbo->first; curBone; curBone=curBone->next) {
+ if (arm->layer & curBone->layer) {
+ if (curBone->flag & BONE_SELECTED) {
+ ebone_mirr= ED_armature_bone_get_mirrored(arm->edbo, curBone);
+ if (ebone_mirr)
+ ebone_mirr->flag |= BONE_SELECTED;
+ }
+ }
+ }
+ }
+
+}
+
+static void armature_tag_select_mirrored(bArmature *arm)
+{
+ EditBone *curBone;
+
+ /* always untag */
+ for (curBone=arm->edbo->first; curBone; curBone=curBone->next) {
+ curBone->flag &= ~BONE_DONE;
+ }
+
+ /* Select mirrored bones */
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ for (curBone=arm->edbo->first; curBone; curBone=curBone->next) {
+ if (arm->layer & curBone->layer) {
+ if (curBone->flag & (BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL)) {
+ EditBone *ebone_mirr= ED_armature_bone_get_mirrored(arm->edbo, curBone);
+ if (ebone_mirr && (ebone_mirr->flag & BONE_SELECTED) == 0) {
+ ebone_mirr->flag |= BONE_DONE;
+ }
+ }
+ }
+ }
+
+ for (curBone=arm->edbo->first; curBone; curBone=curBone->next) {
+ if (curBone->flag & BONE_DONE) {
+ EditBone *ebone_mirr= ED_armature_bone_get_mirrored(arm->edbo, curBone);
+ curBone->flag |= ebone_mirr->flag & (BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL);
+ }
+ }
+ }
+}
+
+
+/* only works when tagged */
+static void armature_tag_unselect(bArmature *arm)
+{
+ EditBone *curBone;
+
+ for (curBone=arm->edbo->first; curBone; curBone=curBone->next) {
+ if (curBone->flag & BONE_DONE) {
+ curBone->flag &= ~(BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL|BONE_DONE);
+ }
+ }
+}
/* converts Bones to EditBone list, used for tools as well */
EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, Bone *actBone)
@@ -159,18 +246,13 @@ EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, Bone
EditBone *eBoneAct= NULL;
EditBone *eBoneTest= NULL;
Bone *curBone;
- float delta[3];
- float premat[3][3];
- float postmat[3][3];
- float imat[3][3];
- float difmat[3][3];
for (curBone=bones->first; curBone; curBone=curBone->next) {
eBone= MEM_callocN(sizeof(EditBone), "make_editbone");
/* Copy relevant data from bone to eBone */
eBone->parent= parent;
- BLI_strncpy(eBone->name, curBone->name, 32);
+ BLI_strncpy(eBone->name, curBone->name, sizeof(eBone->name));
eBone->flag = curBone->flag;
/* fix selection flags */
@@ -204,20 +286,8 @@ EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, Bone
}
copy_v3_v3(eBone->head, curBone->arm_head);
- copy_v3_v3(eBone->tail, curBone->arm_tail);
-
- eBone->roll= 0.0f;
-
- /* roll fixing */
- sub_v3_v3v3(delta, eBone->tail, eBone->head);
- vec_roll_to_mat3(delta, 0.0f, postmat);
-
- copy_m3_m4(premat, curBone->arm_mat);
-
- invert_m3_m3(imat, postmat);
- mul_m3_m3m3(difmat, imat, premat);
-
- eBone->roll = (float)atan2(difmat[2][0], difmat[2][2]);
+ copy_v3_v3(eBone->tail, curBone->arm_tail);
+ eBone->roll = curBone->arm_roll;
/* rest of stuff copy */
eBone->length= curBone->length;
@@ -332,9 +402,11 @@ void ED_armature_from_edit(Object *obedit)
newBone= MEM_callocN(sizeof(Bone), "bone");
eBone->temp= newBone; /* Associate the real Bones with the EditBones */
- BLI_strncpy(newBone->name, eBone->name, 32);
- memcpy(newBone->head, eBone->head, sizeof(float)*3);
- memcpy(newBone->tail, eBone->tail, sizeof(float)*3);
+ BLI_strncpy(newBone->name, eBone->name, sizeof(newBone->name));
+ copy_v3_v3(newBone->arm_head, eBone->head);
+ copy_v3_v3(newBone->arm_tail, eBone->tail);
+ newBone->arm_roll = eBone->roll;
+
newBone->flag= eBone->flag;
if (eBone == arm->act_edbone) {
@@ -369,7 +441,6 @@ void ED_armature_from_edit(Object *obedit)
BLI_addtail(&newBone->parent->childbase, newBone);
{
- float M_boneRest[3][3];
float M_parentRest[3][3];
float iM_parentRest[3][3];
float delta[3];
@@ -378,10 +449,6 @@ void ED_armature_from_edit(Object *obedit)
sub_v3_v3v3(delta, eBone->parent->tail, eBone->parent->head);
vec_roll_to_mat3(delta, eBone->parent->roll, M_parentRest);
- /* Get this bone's matrix (rotation only) */
- sub_v3_v3v3(delta, eBone->tail, eBone->head);
- vec_roll_to_mat3(delta, eBone->roll, M_boneRest);
-
/* Invert the parent matrix */
invert_m3_m3(iM_parentRest, M_parentRest);
@@ -394,8 +461,11 @@ void ED_armature_from_edit(Object *obedit)
}
}
/* ...otherwise add this bone to the armature's bonebase */
- else
+ else {
+ copy_v3_v3(newBone->head, eBone->head);
+ copy_v3_v3(newBone->tail, eBone->tail);
BLI_addtail(&arm->bonebase, newBone);
+ }
}
/* Make a pass through the new armature to fix rolling */
@@ -408,7 +478,7 @@ void ED_armature_from_edit(Object *obedit)
armature_rebuild_pose(obt, arm);
}
- DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
}
void ED_armature_apply_transform(Object *ob, float mat[4][4])
@@ -506,32 +576,20 @@ static EditBone *editbone_name_exists (ListBase *edbo, const char *name)
}
/* note: there's a unique_bone_name() too! */
+static int editbone_unique_check(void *arg, const char *name)
+{
+ struct {ListBase *lb;void *bone;} *data= arg;
+ EditBone *dupli= editbone_name_exists(data->lb, name);
+ return dupli && dupli != data->bone;
+}
+
void unique_editbone_name (ListBase *edbo, char *name, EditBone *bone)
{
- EditBone *dupli;
- char tempname[64];
- int number;
- char *dot;
+ struct {ListBase *lb; void *bone;} data;
+ data.lb= edbo;
+ data.bone= bone;
- dupli = editbone_name_exists(edbo, name);
-
- if (dupli && bone != dupli) {
- /* Strip off the suffix, if it's a number */
- number= strlen(name);
- if (number && isdigit(name[number-1])) {
- dot= strrchr(name, '.'); // last occurrence
- if (dot)
- *dot=0;
- }
-
- for (number = 1; number <= 999; number++) {
- sprintf(tempname, "%s.%03d", name, number);
- if (!editbone_name_exists(edbo, tempname)) {
- BLI_strncpy(name, tempname, 32);
- return;
- }
- }
- }
+ BLI_uniquename_cb(editbone_unique_check, &data, "Bone", '.', name, sizeof(bone->name));
}
/* helper for apply_armature_pose2bones - fixes parenting of objects that are bone-parented to armature */
@@ -546,7 +604,7 @@ static void applyarmature_fix_boneparents (Scene *scene, Object *armob)
/* apply current transform from parent (not yet destroyed),
* then calculate new parent inverse matrix
*/
- object_apply_mat4(ob, ob->obmat);
+ object_apply_mat4(ob, ob->obmat, FALSE, FALSE);
what_does_parent(scene, ob, &workob);
invert_m4_m4(ob->parentinv, workob.obmat);
@@ -558,7 +616,7 @@ static void applyarmature_fix_boneparents (Scene *scene, Object *armob)
static int apply_armature_pose2bones_exec (bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C); // must be active object, not edit-object
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C)); // must be active object, not edit-object
bArmature *arm= get_armature(ob);
bPose *pose;
bPoseChannel *pchan;
@@ -613,10 +671,11 @@ static int apply_armature_pose2bones_exec (bContext *C, wmOperator *op)
}
/* clear transform values for pchan */
- pchan->loc[0]= pchan->loc[1]= pchan->loc[2]= 0.0f;
- pchan->eul[0]= pchan->eul[1]= pchan->eul[2]= 0.0f;
- pchan->quat[1]= pchan->quat[2]= pchan->quat[3]= 0.0f;
- pchan->quat[0]= pchan->size[0]= pchan->size[1]= pchan->size[2]= 1.0f;
+ zero_v3(pchan->loc);
+ zero_v3(pchan->eul);
+ unit_qt(pchan->quat);
+ unit_axis_angle(pchan->rotAxis, &pchan->rotAngle);
+ pchan->size[0]= pchan->size[1]= pchan->size[2]= 1.0f;
/* set anim lock */
curbone->flag |= BONE_UNKEYED;
@@ -655,10 +714,9 @@ void POSE_OT_armature_apply (wmOperatorType *ot)
/* set the current pose as the restpose */
-static int pose_visual_transform_apply_exec (bContext *C, wmOperator *op)
+static int pose_visual_transform_apply_exec (bContext *C, wmOperator *UNUSED(op))
{
- Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C); // must be active object, not edit-object
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C)); // must be active object, not edit-object
/* don't check if editmode (should be done by caller) */
if (ob->type!=OB_ARMATURE)
@@ -670,25 +728,19 @@ static int pose_visual_transform_apply_exec (bContext *C, wmOperator *op)
* at once are to be predictable*/
CTX_DATA_BEGIN(C, bPoseChannel *, pchan, selected_pose_bones)
{
- float delta_mat[4][4], imat[4][4], mat[4][4];
-
- where_is_pose_bone(scene, ob, pchan, CFRA, 1);
-
- copy_m4_m4(mat, pchan->pose_mat);
-
- /* calculate pchan->pose_mat without loc/size/rot & constraints applied */
- where_is_pose_bone(scene, ob, pchan, CFRA, 0);
- invert_m4_m4(imat, pchan->pose_mat);
- mul_m4_m4m4(delta_mat, mat, imat);
-
- pchan_apply_mat4(pchan, delta_mat);
-
- where_is_pose_bone(scene, ob, pchan, CFRA, 1);
+ float delta_mat[4][4];
+
+ /* chan_mat already contains the delta transform from rest pose to pose-mode pose
+ * as that is baked into there so that B-Bones will work. Once we've set this as the
+ * new raw-transform components, don't recalc the poses yet, otherwise IK result will
+ * change, thus changing the result we may be trying to record.
+ */
+ copy_m4_m4(delta_mat, pchan->chan_mat);
+ pchan_apply_mat4(pchan, delta_mat, TRUE);
}
CTX_DATA_END;
-
- // ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -763,7 +815,7 @@ static void joined_armature_fix_links(Object *tarArm, Object *srcArm, bPoseChann
for (achan= act->chanbase.first; achan; achan= achan->next) {
if (strcmp(achan->name, pchan->name)==0)
- BLI_strncpy(achan->name, curbone->name, 32);
+ BLI_strncpy(achan->name, curbone->name, sizeof(achan->name));
}
}
}
@@ -807,7 +859,7 @@ static void joined_armature_fix_links(Object *tarArm, Object *srcArm, bPoseChann
if (ob->partype==PARBONE) {
/* bone name in object */
if (!strcmp(ob->parsubstr, pchan->name))
- BLI_strncpy(ob->parsubstr, curbone->name, 32);
+ BLI_strncpy(ob->parsubstr, curbone->name, sizeof(ob->parsubstr));
}
/* make tar armature be new parent */
@@ -817,7 +869,7 @@ static void joined_armature_fix_links(Object *tarArm, Object *srcArm, bPoseChann
}
/* join armature exec is exported for use in object->join objects operator... */
-int join_armature_exec(bContext *C, wmOperator *op)
+int join_armature_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -1075,7 +1127,7 @@ static void separated_armature_fix_links(Object *origArm, Object *newArm)
* sel: remove selected bones from the armature, otherwise the unselected bones are removed
* (ob is not in editmode)
*/
-static void separate_armature_bones (Scene *scene, Object *ob, short sel)
+static void separate_armature_bones(Object *ob, short sel)
{
bArmature *arm= (bArmature *)ob->data;
bPoseChannel *pchan, *pchann;
@@ -1127,19 +1179,17 @@ static void separate_armature_bones (Scene *scene, Object *ob, short sel)
}
/* separate selected bones into their armature */
-static int separate_armature_exec (bContext *C, wmOperator *op)
+static int separate_armature_exec (bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
Object *oldob, *newob;
Base *oldbase, *newbase;
- bArmature *arm;
/* sanity checks */
if (obedit == NULL)
return OPERATOR_CANCELLED;
- arm= obedit->data;
/* set wait cursor in case this takes a while */
WM_cursor_wait(1);
@@ -1176,15 +1226,15 @@ static int separate_armature_exec (bContext *C, wmOperator *op)
/* 3) remove bones that shouldn't still be around on both armatures */
- separate_armature_bones(scene, oldob, 1);
- separate_armature_bones(scene, newob, 0);
+ separate_armature_bones(oldob, 1);
+ separate_armature_bones(newob, 0);
/* 4) fix links before depsgraph flushes */ // err... or after?
separated_armature_fix_links(oldob, newob);
- DAG_id_flush_update(&oldob->id, OB_RECALC_DATA); /* this is the original one */
- DAG_id_flush_update(&newob->id, OB_RECALC_DATA); /* this is the separated one */
+ DAG_id_tag_update(&oldob->id, OB_RECALC_DATA); /* this is the original one */
+ DAG_id_tag_update(&newob->id, OB_RECALC_DATA); /* this is the separated one */
/* 5) restore original conditions */
@@ -1224,15 +1274,11 @@ void ARMATURE_OT_separate (wmOperatorType *ot)
Bone *get_indexed_bone (Object *ob, int index)
{
bPoseChannel *pchan;
- int a= 0;
-
if(ob->pose==NULL) return NULL;
index>>=16; // bone selection codes use left 2 bytes
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next, a++) {
- if(a==index) return pchan->bone;
- }
- return NULL;
+ pchan= BLI_findlink(&ob->pose->chanbase, index);
+ return pchan ? pchan->bone : NULL;
}
/* See if there are any selected bones in this buffer */
@@ -1364,8 +1410,9 @@ static EditBone *editbone_get_child(bArmature *arm, EditBone *pabone, short use_
for (curbone= arm->edbo->first; curbone; curbone= curbone->next) {
if (curbone->parent == pabone) {
if (use_visibility) {
- if ((arm->layer & curbone->layer) && !(pabone->flag & BONE_HIDDEN_A))
+ if ((arm->layer & curbone->layer) && !(pabone->flag & BONE_HIDDEN_A)) {
chbone = curbone;
+ }
}
else
chbone = curbone;
@@ -1389,7 +1436,7 @@ static int pose_setflag_exec (bContext *C, wmOperator *op)
CTX_DATA_END;
/* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT|ND_POSE, CTX_data_active_object(C));
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ED_object_pose_armature(CTX_data_active_object(C)));
return OPERATOR_FINISHED;
}
@@ -1561,6 +1608,7 @@ void POSE_OT_select_linked(wmOperatorType *ot)
/* identifiers */
ot->name= "Select Connected";
ot->idname= "POSE_OT_select_linked";
+ ot->description= "Select bones related to selected ones by parent/child relationships";
/* api callbacks */
ot->exec= NULL;
@@ -1660,6 +1708,7 @@ void ARMATURE_OT_select_linked(wmOperatorType *ot)
/* identifiers */
ot->name= "Select Connected";
ot->idname= "ARMATURE_OT_select_linked";
+ ot->description= "Select bones related to selected ones by parent/child relationships";
/* api callbacks */
ot->exec= NULL;
@@ -1763,34 +1812,12 @@ static EditBone *get_nearest_editbonepoint (ViewContext *vc, short mval[2], List
return NULL;
}
-/* context: editmode armature */
-EditBone *ED_armature_bone_get_mirrored(ListBase *edbo, EditBone *ebo)
-{
- EditBone *eboflip= NULL;
- char name[32];
-
- if (ebo == NULL)
- return NULL;
-
- flip_side_name(name, ebo->name, FALSE);
-
- for (eboflip= edbo->first; eboflip; eboflip=eboflip->next) {
- if (ebo != eboflip) {
- if (!strcmp (name, eboflip->name))
- break;
- }
- }
-
- return eboflip;
-}
-
-
/* previously delete_armature */
/* only editmode! */
-static int armature_delete_selected_exec(bContext *C, wmOperator *op)
+static int armature_delete_selected_exec(bContext *C, wmOperator *UNUSED(op))
{
bArmature *arm;
- EditBone *curBone, *next;
+ EditBone *curBone, *ebone_next;
bConstraint *con;
Object *obedit= CTX_data_edit_object(C); // XXX get from context
arm = obedit->data;
@@ -1799,24 +1826,13 @@ static int armature_delete_selected_exec(bContext *C, wmOperator *op)
if (CTX_DATA_COUNT(C, selected_bones) == 0)
return OPERATOR_CANCELLED;
- /* Select mirrored bones */
- if (arm->flag & ARM_MIRROR_EDIT) {
- for (curBone=arm->edbo->first; curBone; curBone=curBone->next) {
- if (arm->layer & curBone->layer) {
- if (curBone->flag & BONE_SELECTED) {
- next = ED_armature_bone_get_mirrored(arm->edbo, curBone);
- if (next)
- next->flag |= BONE_SELECTED;
- }
- }
- }
- }
+ armature_select_mirrored(arm);
/* First erase any associated pose channel */
if (obedit->pose) {
- bPoseChannel *pchan, *next;
- for (pchan=obedit->pose->chanbase.first; pchan; pchan=next) {
- next= pchan->next;
+ bPoseChannel *pchan, *pchan_next;
+ for (pchan=obedit->pose->chanbase.first; pchan; pchan= pchan_next) {
+ pchan_next= pchan->next;
curBone = editbone_name_exists(arm->edbo, pchan->name);
if (curBone && (curBone->flag & BONE_SELECTED) && (arm->layer & curBone->layer)) {
@@ -1854,8 +1870,8 @@ static int armature_delete_selected_exec(bContext *C, wmOperator *op)
}
- for (curBone=arm->edbo->first;curBone;curBone=next) {
- next=curBone->next;
+ for (curBone=arm->edbo->first; curBone; curBone= ebone_next) {
+ ebone_next= curBone->next;
if (arm->layer & curBone->layer) {
if (curBone->flag & BONE_SELECTED) {
if(curBone==arm->act_edbone) arm->act_edbone= NULL;
@@ -1877,6 +1893,7 @@ void ARMATURE_OT_delete(wmOperatorType *ot)
/* identifiers */
ot->name= "Delete Selected Bone(s)";
ot->idname= "ARMATURE_OT_delete";
+ ot->description= "Remove selected bones from the armature";
/* api callbacks */
ot->invoke = WM_operator_confirm;
@@ -1889,10 +1906,9 @@ void ARMATURE_OT_delete(wmOperatorType *ot)
/* toggle==0: deselect
* toggle==1: swap (based on test)
- * toggle==2: only active tag
- * toggle==3: swap (no test)
+ * toggle==2: swap (no test), CURRENTLY UNUSED
*/
-void ED_armature_deselectall(Object *obedit, int toggle)
+void ED_armature_deselect_all(Object *obedit, int toggle)
{
bArmature *arm= obedit->data;
EditBone *eBone;
@@ -1912,39 +1928,60 @@ void ED_armature_deselectall(Object *obedit, int toggle)
}
else sel= toggle;
- if(sel==2) {
- arm->act_edbone= NULL;
- } else {
- /* Set the flags */
- for (eBone=arm->edbo->first;eBone;eBone=eBone->next) {
- if (sel==3) {
- /* invert selection of bone */
- if ((arm->layer & eBone->layer) && (eBone->flag & BONE_HIDDEN_A)==0) {
- eBone->flag ^= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- if(arm->act_edbone==eBone)
- arm->act_edbone= NULL;
- }
- }
- else if (sel==1) {
- /* select bone */
- if(arm->layer & eBone->layer && (eBone->flag & BONE_HIDDEN_A)==0) {
- eBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- if(eBone->parent)
- eBone->parent->flag |= (BONE_TIPSEL);
- }
- }
- else {
- /* deselect bone */
- eBone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ /* Set the flags */
+ for (eBone=arm->edbo->first;eBone;eBone=eBone->next) {
+ if (sel==2) {
+ /* invert selection of bone */
+ if(EBONE_VISIBLE(arm, eBone)) {
+ eBone->flag ^= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
if(arm->act_edbone==eBone)
arm->act_edbone= NULL;
}
}
+ else if (sel==1) {
+ /* select bone */
+ if(EBONE_VISIBLE(arm, eBone)) {
+ eBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ if(eBone->parent)
+ eBone->parent->flag |= (BONE_TIPSEL);
+ }
+ }
+ else {
+ /* deselect bone */
+ eBone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ if(arm->act_edbone==eBone)
+ arm->act_edbone= NULL;
+ }
}
ED_armature_sync_selection(arm->edbo);
}
+void ED_armature_deselect_all_visible(Object *obedit)
+{
+ bArmature *arm= obedit->data;
+ EditBone *ebone;
+
+ for (ebone= arm->edbo->first; ebone; ebone= ebone->next) {
+ /* first and foremost, bone must be visible and selected */
+ if (EBONE_VISIBLE(arm, ebone) && (ebone->flag & BONE_UNSELECTABLE)==0) {
+ ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ }
+ }
+
+ ED_armature_sync_selection(arm->edbo);
+}
+
+/* accounts for connected parents */
+static int ebone_select_flag(EditBone *ebone)
+{
+ if(ebone->parent && (ebone->flag & BONE_CONNECTED)) {
+ return ((ebone->parent->flag & BONE_TIPSEL) ? BONE_ROOTSEL : 0) | (ebone->flag & (BONE_SELECTED|BONE_TIPSEL));
+ }
+ else {
+ return ebone->flag & (BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL);
+ }
+}
/* context: editmode armature in view3d */
int mouse_armature(bContext *C, short mval[2], int extend)
@@ -1963,7 +2000,7 @@ int mouse_armature(bContext *C, short mval[2], int extend)
if (nearBone) {
if (!extend)
- ED_armature_deselectall(obedit, 0);
+ ED_armature_deselect_all(obedit, 0);
/* by definition the non-root connected bones have no root point drawn,
so a root selection needs to be delivered to the parent tip */
@@ -2014,7 +2051,9 @@ int mouse_armature(bContext *C, short mval[2], int extend)
if(nearBone) {
/* then now check for active status */
- if(nearBone->flag & BONE_SELECTED) arm->act_edbone= nearBone;
+ if(ebone_select_flag(nearBone)) {
+ arm->act_edbone= nearBone;
+ }
}
WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, vc.obedit);
@@ -2063,136 +2102,142 @@ void ED_armature_to_edit(Object *ob)
/* adjust bone roll to align Z axis with vector
* vec is in local space and is normalized
*/
-float ED_rollBoneToVector(EditBone *bone, float new_up_axis[3])
+
+float ED_rollBoneToVector(EditBone *bone, const float align_axis[3], const short axis_only)
{
- float mat[3][3], nor[3], up_axis[3], vec[3];
- float roll;
+ float mat[3][3], nor[3];
sub_v3_v3v3(nor, bone->tail, bone->head);
-
- vec_roll_to_mat3(nor, 0, mat);
- copy_v3_v3(up_axis, mat[2]);
-
- roll = angle_normalized_v3v3(new_up_axis, up_axis);
-
- cross_v3_v3v3(vec, up_axis, new_up_axis);
-
- if (dot_v3v3(vec, nor) < 0)
- {
- roll = -roll;
- }
-
- return roll;
-}
+ vec_roll_to_mat3(nor, 0.0f, mat);
+ /* check the bone isnt aligned with the axis */
+ if(!is_zero_v3(align_axis) && angle_v3v3(align_axis, mat[2]) > FLT_EPSILON) {
+ float vec[3], align_axis_proj[3], roll;
-/* Set roll value for given bone -> Z-Axis Point up (original method) */
-static void auto_align_ebone_zaxisup(Scene *scene, View3D *v3d, EditBone *ebone)
-{
- float delta[3], curmat[3][3];
- float xaxis[3]={1.0f, 0.0f, 0.0f}, yaxis[3], zaxis[3]={0.0f, 0.0f, 1.0f};
- float targetmat[3][3], imat[3][3], diffmat[3][3];
-
- /* Find the current bone matrix */
- sub_v3_v3v3(delta, ebone->tail, ebone->head);
- vec_roll_to_mat3(delta, 0.0f, curmat);
-
- /* Make new matrix based on y axis & z-up */
- copy_v3_v3(yaxis, curmat[1]);
-
- unit_m3(targetmat);
- copy_v3_v3(targetmat[0], xaxis);
- copy_v3_v3(targetmat[1], yaxis);
- copy_v3_v3(targetmat[2], zaxis);
- normalize_m3(targetmat);
-
- /* Find the difference between the two matrices */
- invert_m3_m3(imat, targetmat);
- mul_m3_m3m3(diffmat, imat, curmat);
-
- // old-method... let's see if using mat3_to_vec_roll is more accurate
- //ebone->roll = atan2(diffmat[2][0], diffmat[2][2]);
- mat3_to_vec_roll(diffmat, delta, &ebone->roll);
-}
-
-void auto_align_ebone_topoint(EditBone *ebone, float *cursor)
-{
- float delta[3], curmat[3][3];
- float mat[4][4], tmat[4][4], imat[4][4];
- float rmat[4][4], rot[3];
- float vec[3];
-
- /* find the current bone matrix as a 4x4 matrix (in Armature Space) */
- sub_v3_v3v3(delta, ebone->tail, ebone->head);
- vec_roll_to_mat3(delta, ebone->roll, curmat);
- copy_m4_m3(mat, curmat);
- copy_v3_v3(mat[3], ebone->head);
-
- /* multiply bone-matrix by object matrix (so that bone-matrix is in WorldSpace) */
- invert_m4_m4(imat, mat);
-
- /* find position of cursor relative to bone */
- mul_v3_m4v3(vec, imat, cursor);
-
- /* check that cursor is in usable position */
- if ((IS_EQ(vec[0], 0)==0) && (IS_EQ(vec[2], 0)==0)) {
- /* Compute a rotation matrix around y */
- rot[1] = (float)atan2(vec[0], vec[2]);
- rot[0] = rot[2] = 0.0f;
- eul_to_mat4( rmat,rot);
+ /* project the new_up_axis along the normal */
+ project_v3_v3v3(vec, align_axis, nor);
+ sub_v3_v3v3(align_axis_proj, align_axis, vec);
- /* Multiply the bone matrix by rotation matrix. This should be new bone-matrix */
- mul_m4_m4m4(tmat, rmat, mat);
- copy_m3_m4(curmat, tmat);
+ if(axis_only) {
+ if(angle_v3v3(align_axis_proj, mat[2]) > M_PI/2) {
+ negate_v3(align_axis_proj);
+ }
+ }
- /* Now convert from new bone-matrix, back to a roll value (in radians) */
- mat3_to_vec_roll(curmat, delta, &ebone->roll);
- }
-}
+ roll = angle_v3v3(align_axis_proj, mat[2]);
+
+ cross_v3_v3v3(vec, mat[2], align_axis_proj);
+
+ if (dot_v3v3(vec, nor) < 0) {
+ roll = -roll;
+ }
-static void auto_align_ebone_tocursor(Scene *scene, View3D *v3d, EditBone *ebone)
-{
- float cursor_local[3];
- float *cursor= give_cursor(scene, v3d);
- float imat[3][3];
+ return roll;
+ }
- copy_m3_m4(imat, scene->obedit->obmat);
- invert_m3(imat);
- copy_v3_v3(cursor_local, cursor);
- mul_m3_v3(imat, cursor_local);
- auto_align_ebone_topoint(ebone, cursor_local);
+ return 0.0f;
}
+
static EnumPropertyItem prop_calc_roll_types[] = {
- {0, "GLOBALUP", 0, "Z-Axis Up", ""},
- {1, "CURSOR", 0, "Z-Axis to Cursor", ""},
+ {0, "X", 0, "X Axis", ""},
+ {1, "Y", 0, "Y Axis", ""},
+ {2, "Z", 0, "Z Axis", ""},
+ {5, "ACTIVE", 0, "Active Bone", ""},
+ {6, "VIEW", 0, "View Axis", ""},
+ {7, "CURSOR", 0, "Cursor", ""},
{0, NULL, 0, NULL, NULL}
};
+
static int armature_calc_roll_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
- View3D *v3d= CTX_wm_view3d(C);
Object *ob= CTX_data_edit_object(C);
- void (*roll_func)(Scene *, View3D *, EditBone *) = NULL;
+ const short type= RNA_enum_get(op->ptr, "type");
+ const short axis_only= RNA_boolean_get(op->ptr, "axis_only");
+ const short axis_flip= RNA_boolean_get(op->ptr, "axis_flip");
+
+ float imat[3][3];
+
+ bArmature *arm= ob->data;
+ EditBone *ebone;
+
+ copy_m3_m4(imat, ob->obmat);
+ invert_m3(imat);
+
+ if(type==7) { /* Cursor */
+ Scene *scene= CTX_data_scene(C);
+ View3D *v3d= CTX_wm_view3d(C); /* can be NULL */
+ float cursor_local[3];
+ float *cursor= give_cursor(scene, v3d);
- /* specific method used to calculate roll depends on mode */
- switch (RNA_enum_get(op->ptr, "type")) {
- case 1: /* Z-Axis point towards cursor */
- roll_func= auto_align_ebone_tocursor;
- break;
- default: /* Z-Axis Point Up */
- roll_func= auto_align_ebone_zaxisup;
- break;
+
+ copy_v3_v3(cursor_local, cursor);
+ mul_m3_v3(imat, cursor_local);
+
+ /* cursor */
+ for(ebone= arm->edbo->first; ebone; ebone= ebone->next) {
+ if(EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) {
+ float cursor_rel[3];
+ sub_v3_v3v3(cursor_rel, cursor_local, ebone->head);
+ if(axis_flip) negate_v3(cursor_rel);
+ ebone->roll= ED_rollBoneToVector(ebone, cursor_rel, axis_only);
+ }
+ }
}
-
- /* recalculate roll on selected bones */
- CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) {
- /* roll func is a callback which assumes that all is well */
- roll_func(scene, v3d, ebone);
+ else {
+ float vec[3]= {0.0f, 0.0f, 0.0f};
+ if(type==6) { /* View */
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
+ if(rv3d==NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No region view3d available");
+ return OPERATOR_CANCELLED;
+ }
+
+ copy_v3_v3(vec, rv3d->viewinv[2]);
+ mul_m3_v3(imat, vec);
+ }
+ else if (type==5) {
+ bArmature *arm= ob->data;
+ EditBone *ebone= (EditBone *)arm->act_edbone;
+ float mat[3][3], nor[3];
+
+ if(ebone==NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No active bone set");
+ return OPERATOR_CANCELLED;
+ }
+
+ sub_v3_v3v3(nor, ebone->tail, ebone->head);
+ vec_roll_to_mat3(nor, ebone->roll, mat);
+ copy_v3_v3(vec, mat[2]);
+ }
+ else { /* Axis */
+ assert(type >= 0 && type <= 5);
+ if(type<3) vec[type]= 1.0f;
+ else vec[type-2]= -1.0f;
+ mul_m3_v3(imat, vec);
+ }
+
+ if(axis_flip) negate_v3(vec);
+
+ for(ebone= arm->edbo->first; ebone; ebone= ebone->next) {
+ if(EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) {
+ /* roll func is a callback which assumes that all is well */
+ ebone->roll= ED_rollBoneToVector(ebone, vec, axis_only);
+ }
+ }
+ }
+
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ for(ebone= arm->edbo->first; ebone; ebone= ebone->next) {
+ if((EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) == 0) {
+ EditBone *ebone_mirr= ED_armature_bone_get_mirrored(arm->edbo, ebone);
+ if (ebone_mirr && (EBONE_VISIBLE(arm, ebone_mirr) && EBONE_EDITABLE(ebone_mirr))) {
+ ebone->roll= -ebone_mirr->roll;
+ }
+ }
+ }
}
- CTX_DATA_END;
-
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -2205,6 +2250,7 @@ void ARMATURE_OT_calculate_roll(wmOperatorType *ot)
/* identifiers */
ot->name= "Recalculate Roll";
ot->idname= "ARMATURE_OT_calculate_roll";
+ ot->description= "Automatically fix alignment of select bones' axes";
/* api callbacks */
ot->invoke = WM_menu_invoke;
@@ -2213,9 +2259,11 @@ void ARMATURE_OT_calculate_roll(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
+
/* properties */
ot->prop= RNA_def_enum(ot->srna, "type", prop_calc_roll_types, 0, "Type", "");
+ RNA_def_boolean(ot->srna, "axis_flip", 0, "Flip Axis", "Negate the alignment axis.");
+ RNA_def_boolean(ot->srna, "axis_only", 0, "Shortest Rotation", "Ignore the axis direction, use the shortest rotation to align.");
}
/* **************** undo for armatures ************** */
@@ -2305,7 +2353,7 @@ static void *get_armature_edit(bContext *C)
}
/* and this is all the undo system needs to know */
-void undo_push_armature(bContext *C, char *name)
+void undo_push_armature(bContext *C, const char *name)
{
// XXX solve getdata()
undo_editmode_push(C, name, get_armature_edit, free_undoBones, undoBones_to_editBones, editBones_to_undoBones, NULL);
@@ -2317,11 +2365,11 @@ void undo_push_armature(bContext *C, char *name)
/* *************** Adding stuff in editmode *************** */
/* default bone add, returns it selected, but without tail set */
-EditBone *ED_armature_edit_bone_add(bArmature *arm, char *name)
+EditBone *ED_armature_edit_bone_add(bArmature *arm, const char *name)
{
EditBone *bone= MEM_callocN(sizeof(EditBone), "eBone");
- BLI_strncpy(bone->name, name, 32);
+ BLI_strncpy(bone->name, name, sizeof(bone->name));
unique_editbone_name(arm->edbo, bone->name, NULL);
BLI_addtail(arm->edbo, bone);
@@ -2360,7 +2408,7 @@ void add_primitive_bone(Scene *scene, View3D *v3d, RegionView3D *rv3d)
mul_m3_m3m3(totmat, obmat, viewmat);
invert_m3_m3(imat, totmat);
- ED_armature_deselectall(obedit, 0);
+ ED_armature_deselect_all(obedit, 0);
/* Create a bone */
bone= ED_armature_edit_bone_add(obedit->data, "Bone");
@@ -2377,7 +2425,7 @@ void add_primitive_bone(Scene *scene, View3D *v3d, RegionView3D *rv3d)
/* previously addvert_armature */
/* the ctrl-click method */
-static int armature_click_extrude_exec(bContext *C, wmOperator *op)
+static int armature_click_extrude_exec(bContext *C, wmOperator *UNUSED(op))
{
View3D *v3d;
bArmature *arm;
@@ -2413,7 +2461,7 @@ static int armature_click_extrude_exec(bContext *C, wmOperator *op)
to_root= 1;
}
- ED_armature_deselectall(obedit, 0);
+ ED_armature_deselect_all(obedit, 0);
/* we re-use code for mirror editing... */
flipbone= NULL;
@@ -2529,6 +2577,7 @@ void ARMATURE_OT_click_extrude(wmOperatorType *ot)
/* identifiers */
ot->name= "Click-Extrude";
ot->idname= "ARMATURE_OT_click_extrude";
+ ot->description= "Create a new bone going from the last selected joint to the mouse position";
/* api callbacks */
ot->invoke = armature_click_extrude_invoke;
@@ -2653,7 +2702,7 @@ EditBone *duplicateEditBoneObjects(EditBone *curBone, char *name, ListBase *edit
if (name != NULL)
{
- BLI_strncpy(eBone->name, name, 32);
+ BLI_strncpy(eBone->name, name, sizeof(eBone->name));
}
unique_editbone_name(editbones, eBone->name, NULL);
@@ -2691,7 +2740,7 @@ EditBone *duplicateEditBone(EditBone *curBone, char *name, ListBase *editbones,
}
/* previously adduplicate_armature */
-static int armature_duplicate_selected_exec(bContext *C, wmOperator *op)
+static int armature_duplicate_selected_exec(bContext *C, wmOperator *UNUSED(op))
{
bArmature *arm;
EditBone *eBone = NULL;
@@ -2797,6 +2846,7 @@ void ARMATURE_OT_duplicate(wmOperatorType *ot)
/* identifiers */
ot->name= "Duplicate Selected Bone(s)";
ot->idname= "ARMATURE_OT_duplicate";
+ ot->description= "Make copies of the selected bones within the same armature";
/* api callbacks */
ot->exec = armature_duplicate_selected_exec;
@@ -2927,14 +2977,13 @@ static int armature_fill_bones_exec (bContext *C, wmOperator *op)
bArmature *arm= (obedit) ? obedit->data : NULL;
Scene *scene= CTX_data_scene(C);
View3D *v3d= CTX_wm_view3d(C);
- EditBone *newbone=NULL;
ListBase points = {NULL, NULL};
int count;
-
+
/* sanity checks */
- if ELEM(NULL, obedit, arm)
+ if (ELEM(NULL, obedit, arm))
return OPERATOR_CANCELLED;
-
+
/* loop over all bones, and only consider if visible */
CTX_DATA_BEGIN(C, EditBone *, ebone, visible_bones)
{
@@ -2968,7 +3017,7 @@ static int armature_fill_bones_exec (bContext *C, wmOperator *op)
mul_v3_m4v3(curs, obedit->imat, give_cursor(scene, v3d));
/* Create a bone */
- newbone= add_points_bone(obedit, ebp->vec, curs);
+ /* newbone= */ add_points_bone(obedit, ebp->vec, curs);
}
else if (count == 2) {
EditBonePoint *ebp, *ebp2;
@@ -3029,7 +3078,7 @@ static int armature_fill_bones_exec (bContext *C, wmOperator *op)
/* add new bone and parent it to the appropriate end */
if (headtail) {
- newbone= add_points_bone(obedit, head, tail);
+ EditBone *newbone= add_points_bone(obedit, head, tail);
/* do parenting (will need to set connected flag too) */
if (headtail == 2) {
@@ -3106,13 +3155,13 @@ static void bones_merge(Object *obedit, EditBone *start, EditBone *end, EditBone
* - tail = head/tail of end (default tail)
* - parent = parent of start
*/
- if ((start->flag & BONE_TIPSEL) && ((start->flag & BONE_SELECTED) || start==arm->act_edbone)==0) {
+ if ((start->flag & BONE_TIPSEL) && (start->flag & BONE_SELECTED)==0) {
copy_v3_v3(head, start->tail);
}
else {
copy_v3_v3(head, start->head);
}
- if ((end->flag & BONE_ROOTSEL) && ((end->flag & BONE_SELECTED) || end==arm->act_edbone)==0) {
+ if ((end->flag & BONE_ROOTSEL) && (end->flag & BONE_SELECTED)==0) {
copy_v3_v3(tail, end->head);
}
else {
@@ -3120,6 +3169,9 @@ static void bones_merge(Object *obedit, EditBone *start, EditBone *end, EditBone
}
newbone= add_points_bone(obedit, head, tail);
newbone->parent = start->parent;
+
+ /* TODO, copy more things to the new bone */
+ newbone->flag= start->flag & (BONE_HINGE|BONE_NO_DEFORM|BONE_NO_SCALE|BONE_NO_CYCLICOFFSET|BONE_NO_LOCAL_LOCATION|BONE_DONE);
/* step 2a: parent children of in-between bones to newbone */
for (chain= chains->first; chain; chain= chain->next) {
@@ -3181,7 +3233,9 @@ static int armature_merge_exec (bContext *C, wmOperator *op)
/* get chains (ends on chains) */
chains_find_tips(arm->edbo, &chains);
if (chains.first == NULL) return OPERATOR_CANCELLED;
-
+
+ armature_tag_select_mirrored(arm);
+
/* each 'chain' is the last bone in the chain (with no children) */
for (chain= chains.first; chain; chain= nchain) {
EditBone *bstart= NULL, *bend= NULL;
@@ -3196,7 +3250,7 @@ static int armature_merge_exec (bContext *C, wmOperator *op)
/* check if visible + selected */
if ( EBONE_VISIBLE(arm, ebo) &&
((ebo->flag & BONE_CONNECTED) || (ebo->parent==NULL)) &&
- ((ebo->flag & BONE_SELECTED) || (ebo==arm->act_edbone)) )
+ (ebo->flag & BONE_SELECTED) )
{
/* set either end or start (end gets priority, unless it is already set) */
if (bend == NULL) {
@@ -3225,6 +3279,8 @@ static int armature_merge_exec (bContext *C, wmOperator *op)
BLI_insertlinkbefore(&chains, nchain, chain);
}
+ armature_tag_unselect(arm);
+
BLI_freelistN(&chains);
}
@@ -3262,7 +3318,7 @@ void ARMATURE_OT_merge (wmOperatorType *ot)
/* ************** END Add/Remove stuff in editmode ************ */
/* *************** Tools in editmode *********** */
-static int armature_hide_exec(bContext *C, wmOperator *op)
+static int armature_hide_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
bArmature *arm= obedit->data;
@@ -3283,7 +3339,7 @@ static int armature_hide_exec(bContext *C, wmOperator *op)
ED_armature_validate_active(arm);
ED_armature_sync_selection(arm->edbo);
- WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit);
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, obedit);
return OPERATOR_FINISHED;
}
@@ -3293,6 +3349,7 @@ void ARMATURE_OT_hide(wmOperatorType *ot)
/* identifiers */
ot->name= "Hide Selected Bones";
ot->idname= "ARMATURE_OT_hide";
+ ot->description= "Tag selected bones to not be visible in Edit Mode";
/* api callbacks */
ot->exec= armature_hide_exec;
@@ -3302,7 +3359,7 @@ void ARMATURE_OT_hide(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int armature_reveal_exec(bContext *C, wmOperator *op)
+static int armature_reveal_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
bArmature *arm= obedit->data;
@@ -3319,7 +3376,7 @@ static int armature_reveal_exec(bContext *C, wmOperator *op)
ED_armature_validate_active(arm);
ED_armature_sync_selection(arm->edbo);
- WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit);
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, obedit);
return OPERATOR_FINISHED;
}
@@ -3329,6 +3386,7 @@ void ARMATURE_OT_reveal(wmOperatorType *ot)
/* identifiers */
ot->name= "Reveal Bones";
ot->idname= "ARMATURE_OT_reveal";
+ ot->description= "Unhide all bones that have been tagged to be hidden in Edit Mode";
/* api callbacks */
ot->exec= armature_reveal_exec;
@@ -3497,7 +3555,7 @@ static int armature_extrude_exec(bContext *C, wmOperator *op)
newbone->segments= 1;
newbone->layer= ebone->layer;
- BLI_strncpy (newbone->name, ebone->name, 32);
+ BLI_strncpy (newbone->name, ebone->name, sizeof(newbone->name));
if (flipbone && forked) { // only set if mirror edit
if (strlen(newbone->name)<30) {
@@ -3526,13 +3584,12 @@ static int armature_extrude_exec(bContext *C, wmOperator *op)
if (totbone==1 && first) arm->act_edbone= first;
if (totbone==0) return OPERATOR_CANCELLED;
-
- if(arm->act_edbone && (((EditBone *)arm->act_edbone)->flag & BONE_SELECTED)==0)
- arm->act_edbone= NULL;
/* Transform the endpoints */
ED_armature_sync_selection(arm->edbo);
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, obedit);
+
return OPERATOR_FINISHED;
}
@@ -3541,6 +3598,7 @@ void ARMATURE_OT_extrude(wmOperatorType *ot)
/* identifiers */
ot->name= "Extrude";
ot->idname= "ARMATURE_OT_extrude";
+ ot->description= "Create new bones from the selected joints";
/* api callbacks */
ot->exec= armature_extrude_exec;
@@ -3580,7 +3638,7 @@ static int armature_bone_primitive_add_exec(bContext *C, wmOperator *op)
mul_m3_m3m3(totmat, obmat, viewmat);
invert_m3_m3(imat, totmat);
- ED_armature_deselectall(obedit, 0);
+ ED_armature_deselect_all(obedit, 0);
/* Create a bone */
bone= ED_armature_edit_bone_add(obedit->data, name);
@@ -3593,8 +3651,8 @@ static int armature_bone_primitive_add_exec(bContext *C, wmOperator *op)
add_v3_v3v3(bone->tail, bone->head, imat[2]); // bone with unit length 1, pointing up Z
/* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit);
-
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, obedit);
+
return OPERATOR_FINISHED;
}
@@ -3603,6 +3661,7 @@ void ARMATURE_OT_bone_primitive_add(wmOperatorType *ot)
/* identifiers */
ot->name= "Add Bone";
ot->idname= "ARMATURE_OT_bone_primitive_add";
+ ot->description= "Add a new bone located at the 3D-Cursor";
/* api callbacks */
ot->exec = armature_bone_primitive_add_exec;
@@ -3632,10 +3691,7 @@ static int armature_subdivide_exec(bContext *C, wmOperator *op)
int numcuts, i;
/* there may not be a number_cuts property defined (for 'simple' subdivide) */
- if (RNA_property_is_set(op->ptr, "number_cuts"))
- numcuts= RNA_int_get(op->ptr, "number_cuts");
- else
- numcuts= 1;
+ numcuts= RNA_int_get(op->ptr, "number_cuts");
/* loop over all editable bones */
// XXX the old code did this in reverse order though!
@@ -3690,26 +3746,12 @@ static int armature_subdivide_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-
-void ARMATURE_OT_subdivide_simple(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Subdivide Simple";
- ot->idname= "ARMATURE_OT_subdivide_simple";
-
- /* api callbacks */
- ot->exec = armature_subdivide_exec;
- ot->poll = ED_operator_editarmature;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-void ARMATURE_OT_subdivide_multi(wmOperatorType *ot)
+void ARMATURE_OT_subdivide(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Subdivide Multi";
- ot->idname= "ARMATURE_OT_subdivide_multi";
+ ot->idname= "ARMATURE_OT_subdivide";
+ ot->description= "Break selected bones into chains of smaller bones";
/* api callbacks */
ot->exec = armature_subdivide_exec;
@@ -3719,65 +3761,7 @@ void ARMATURE_OT_subdivide_multi(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* Properties */
- RNA_def_int(ot->srna, "number_cuts", 2, 1, INT_MAX, "Number of Cuts", "", 1, 10);
-}
-
-
-
-static int armature_subdivs_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- uiPopupMenu *pup;
- uiLayout *layout;
-
- pup= uiPupMenuBegin(C, "Subdivision Type", 0);
- layout= uiPupMenuLayout(pup);
- uiItemsEnumO(layout, "ARMATURE_OT_subdivs", "type");
- uiPupMenuEnd(C, pup);
-
- return OPERATOR_CANCELLED;
-}
-
-static int armature_subdivs_exec(bContext *C, wmOperator *op)
-{
- switch (RNA_int_get(op->ptr, "type"))
- {
- case 0: /* simple */
- RNA_int_set(op->ptr, "number_cuts", 1);
- armature_subdivide_exec(C, op);
- break;
- case 1: /* multi */
- armature_subdivide_exec(C, op);
- break;
- }
-
- return OPERATOR_FINISHED;
-}
-
-void ARMATURE_OT_subdivs(wmOperatorType *ot)
-{
- static EnumPropertyItem type_items[]= {
- {0, "SIMPLE", 0, "Simple", ""},
- {1, "MULTI", 0, "Multi", ""},
- {0, NULL, 0, NULL, NULL}};
-
- /* identifiers */
- ot->name= "subdivs";
- ot->idname= "ARMATURE_OT_subdivs";
-
- /* api callbacks */
- ot->invoke= armature_subdivs_invoke;
- ot->exec= armature_subdivs_exec;
-
- ot->poll= ED_operator_editarmature;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- /* props */
- RNA_def_enum(ot->srna, "type", type_items, 0, "Type", "");
-
- /* this is temp, the ops are different, but they are called from subdivs, so all the possible props should be here as well*/
- RNA_def_int(ot->srna, "number_cuts", 2, 1, INT_MAX, "Number of Cuts", "", 1, 10);
+ RNA_def_int(ot->srna, "number_cuts", 1, 1, INT_MAX, "Number of Cuts", "", 1, 10);
}
/* ----------- */
@@ -3788,7 +3772,7 @@ void ARMATURE_OT_subdivs(wmOperatorType *ot)
* this to be done easily.
*/
-static int armature_switch_direction_exec(bContext *C, wmOperator *op)
+static int armature_switch_direction_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_edit_object(C);
bArmature *arm= (bArmature *)ob->data;
@@ -3798,7 +3782,9 @@ static int armature_switch_direction_exec(bContext *C, wmOperator *op)
/* get chains of bones (ends on chains) */
chains_find_tips(arm->edbo, &chains);
if (chains.first == NULL) return OPERATOR_CANCELLED;
-
+
+ armature_tag_select_mirrored(arm);
+
/* loop over chains, only considering selected and visible bones */
for (chain= chains.first; chain; chain= chain->next) {
EditBone *ebo, *child=NULL, *parent=NULL;
@@ -3854,8 +3840,10 @@ static int armature_switch_direction_exec(bContext *C, wmOperator *op)
/* free chains */
BLI_freelistN(&chains);
+ armature_tag_unselect(arm);
+
/* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
return OPERATOR_FINISHED;
}
@@ -3865,6 +3853,7 @@ void ARMATURE_OT_switch_direction(wmOperatorType *ot)
/* identifiers */
ot->name= "Switch Direction";
ot->idname= "ARMATURE_OT_switch_direction";
+ ot->description= "Change the direction that a chain of bones points in (head <-> tail swap)";
/* api callbacks */
ot->exec = armature_switch_direction_exec;
@@ -4004,15 +3993,15 @@ static int armature_parent_set_exec(bContext *C, wmOperator *op)
/* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
return OPERATOR_FINISHED;
}
-static int armature_parent_set_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int armature_parent_set_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
EditBone *actbone = CTX_data_active_bone(C);
- uiPopupMenu *pup= uiPupMenuBegin(C, "Make Parent ", 0);
+ uiPopupMenu *pup= uiPupMenuBegin(C, "Make Parent ", ICON_NULL);
uiLayout *layout= uiPupMenuLayout(pup);
int allchildbones = 0;
@@ -4039,6 +4028,7 @@ void ARMATURE_OT_parent_set(wmOperatorType *ot)
/* identifiers */
ot->name= "Make Parent";
ot->idname= "ARMATURE_OT_parent_set";
+ ot->description= "Set the active bone as the parent of the selected bones";
/* api callbacks */
ot->invoke = armature_parent_set_invoke;
@@ -4082,7 +4072,7 @@ static int armature_parent_clear_exec(bContext *C, wmOperator *op)
ED_armature_sync_selection(arm->edbo);
/* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
return OPERATOR_FINISHED;
}
@@ -4092,6 +4082,7 @@ void ARMATURE_OT_parent_clear(wmOperatorType *ot)
/* identifiers */
ot->name= "Clear Parent";
ot->idname= "ARMATURE_OT_parent_clear";
+ ot->description= "Remove the parent-child relationship between selected bones and their parents";
/* api callbacks */
ot->invoke = WM_menu_invoke;
@@ -4106,7 +4097,7 @@ void ARMATURE_OT_parent_clear(wmOperatorType *ot)
/* **************** Selections ******************/
-static int armature_select_inverse_exec(bContext *C, wmOperator *op)
+static int armature_select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
/* Set the flags */
CTX_DATA_BEGIN(C, EditBone *, ebone, visible_bones) {
@@ -4128,6 +4119,7 @@ void ARMATURE_OT_select_inverse(wmOperatorType *ot)
/* identifiers */
ot->name= "Select Inverse";
ot->idname= "ARMATURE_OT_select_inverse";
+ ot->description= "Flip the selection status of bones (selected -> unselected, unselected -> selected)";
/* api callbacks */
ot->exec= armature_select_inverse_exec;
@@ -4165,7 +4157,8 @@ static int armature_de_select_all_exec(bContext *C, wmOperator *op)
case SEL_INVERT:
if (ebone->flag & BONE_SELECTED) {
ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- } else {
+ }
+ else {
ebone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
if(ebone->parent)
ebone->parent->flag |= (BONE_TIPSEL);
@@ -4183,10 +4176,10 @@ static int armature_de_select_all_exec(bContext *C, wmOperator *op)
void ARMATURE_OT_select_all(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Select or Deselect All";
ot->idname= "ARMATURE_OT_select_all";
+ ot->description= "Toggle selection status of all bones";
/* api callbacks */
ot->exec= armature_de_select_all_exec;
@@ -4267,6 +4260,7 @@ void ARMATURE_OT_select_hierarchy(wmOperatorType *ot)
/* identifiers */
ot->name= "Select Hierarchy";
ot->idname= "ARMATURE_OT_select_hierarchy";
+ ot->description= "Select immediate parent/children of selected bones";
/* api callbacks */
ot->exec= armature_select_hierarchy_exec;
@@ -4496,7 +4490,7 @@ int ED_do_pose_selectbuffer(Scene *scene, Base *base, unsigned int *buffer, shor
if (OBACT && OBACT->mode & OB_MODE_WEIGHT_PAINT) {
if (nearBone == arm->act_bone) {
ED_vgroup_select_by_name(OBACT, nearBone->name);
- DAG_id_flush_update(&OBACT->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&OBACT->id, OB_RECALC_DATA);
}
}
@@ -4522,7 +4516,7 @@ void ED_pose_deselectall (Object *ob, int test)
/* Determine if we're selecting or deselecting */
if (test==1) {
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if ((pchan->bone->layer & arm->layer) && !(pchan->bone->flag & BONE_HIDDEN_P)) {
+ if (PBONE_VISIBLE(arm, pchan->bone)) {
if (pchan->bone->flag & BONE_SELECTED)
break;
}
@@ -4547,12 +4541,9 @@ void ED_pose_deselectall (Object *ob, int test)
}
}
}
-
- if(arm->act_bone && (arm->act_bone->flag & BONE_SELECTED)==0)
- arm->act_bone= NULL;
}
-static int bone_skinnable(Object *ob, Bone *bone, void *datap)
+static int bone_skinnable_cb(Object *ob, Bone *bone, void *datap)
{
/* Bones that are deforming
* are regarded to be "skinnable" and are eligible for
@@ -4601,7 +4592,7 @@ static int bone_skinnable(Object *ob, Bone *bone, void *datap)
return 0;
}
-static int ED_vgroup_add_unique_bone(Object *ob, Bone *bone, void *data)
+static int vgroup_add_unique_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr))
{
/* This group creates a vertex group to ob that has the
* same name as bone (provided the bone is skinnable).
@@ -4616,7 +4607,7 @@ static int ED_vgroup_add_unique_bone(Object *ob, Bone *bone, void *data)
return 0;
}
-static int dgroup_skinnable(Object *ob, Bone *bone, void *datap)
+static int dgroup_skinnable_cb(Object *ob, Bone *bone, void *datap)
{
/* Bones that are deforming
* are regarded to be "skinnable" and are eligible for
@@ -4672,7 +4663,7 @@ static int dgroup_skinnable(Object *ob, Bone *bone, void *datap)
return 0;
}
-static void add_vgroups__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+static void add_vgroups__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
{
/* DerivedMesh mapFunc for getting final coords in weight paint mode */
@@ -4723,7 +4714,7 @@ static void envelope_bone_weighting(Object *ob, Mesh *mesh, float (*verts)[3], i
}
}
-void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int mirror)
+void add_verts_to_dgroups(ReportList *reports, Scene *scene, Object *ob, Object *par, int heat, int mirror)
{
/* This functions implements the automatic computation of vertex group
* weights, either through envelopes or using a heat equilibrium.
@@ -4755,7 +4746,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
looper_data.list= NULL;
/* count the number of skinnable bones */
- numbones = bone_looper(ob, arm->bonebase.first, &looper_data, bone_skinnable);
+ numbones = bone_looper(ob, arm->bonebase.first, &looper_data, bone_skinnable_cb);
if (numbones == 0)
return;
@@ -4764,7 +4755,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
* and fill it with all of the skinnable bones */
bonelist = MEM_callocN(numbones*sizeof(Bone *), "bonelist");
looper_data.list= bonelist;
- bone_looper(ob, arm->bonebase.first, &looper_data, bone_skinnable);
+ bone_looper(ob, arm->bonebase.first, &looper_data, bone_skinnable_cb);
/* create an array of pointers to the deform groups that
* coorespond to the skinnable bones (creating them
@@ -4773,7 +4764,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
dgroupflip = MEM_callocN(numbones*sizeof(bDeformGroup *), "dgroupflip");
looper_data.list= dgrouplist;
- bone_looper(ob, arm->bonebase.first, &looper_data, dgroup_skinnable);
+ bone_looper(ob, arm->bonebase.first, &looper_data, dgroup_skinnable_cb);
/* create an array of root and tip positions transformed into
* global coords */
@@ -4870,14 +4861,22 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
/* compute the weights based on gathered vertices and bones */
if (heat) {
+ const char *error= NULL;
heat_bone_weighting(ob, mesh, verts, numbones, dgrouplist, dgroupflip,
- root, tip, selected);
+ root, tip, selected, &error);
+
+ if(error) {
+ BKE_report(reports, RPT_WARNING, error);
+ }
}
else {
envelope_bone_weighting(ob, mesh, verts, numbones, bonelist, dgrouplist,
dgroupflip, root, tip, selected, mat4_to_scale(par->obmat));
}
-
+
+ /* only generated in some cases but can call anyway */
+ mesh_octree_table(ob, NULL, NULL, 'e');
+
/* free the memory allocated */
MEM_freeN(bonelist);
MEM_freeN(dgrouplist);
@@ -4888,7 +4887,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
MEM_freeN(verts);
}
-void create_vgroups_from_armature(Scene *scene, Object *ob, Object *par, int mode, int mirror)
+void create_vgroups_from_armature(ReportList *reports, Scene *scene, Object *ob, Object *par, int mode, int mirror)
{
/* Lets try to create some vertex groups
* based on the bones of the parent armature.
@@ -4899,7 +4898,7 @@ void create_vgroups_from_armature(Scene *scene, Object *ob, Object *par, int mod
/* Traverse the bone list, trying to create empty vertex
* groups cooresponding to the bone.
*/
- bone_looper(ob, arm->bonebase.first, NULL, ED_vgroup_add_unique_bone);
+ bone_looper(ob, arm->bonebase.first, NULL, vgroup_add_unique_bone_cb);
if (ob->type == OB_MESH)
ED_vgroup_data_create(ob->data);
@@ -4909,26 +4908,162 @@ void create_vgroups_from_armature(Scene *scene, Object *ob, Object *par, int mod
* that are populated with the vertices for which the
* bone is closest.
*/
- add_verts_to_dgroups(scene, ob, par, (mode == ARM_GROUPS_AUTO), mirror);
+ add_verts_to_dgroups(reports, scene, ob, par, (mode == ARM_GROUPS_AUTO), mirror);
}
}
/* ************* Clear Pose *****************************/
-static int pose_clear_scale_exec(bContext *C, wmOperator *op)
+/* clear scale of pose-channel */
+static void pchan_clear_scale(bPoseChannel *pchan)
+{
+ if ((pchan->protectflag & OB_LOCK_SCALEX)==0)
+ pchan->size[0]= 1.0f;
+ if ((pchan->protectflag & OB_LOCK_SCALEY)==0)
+ pchan->size[1]= 1.0f;
+ if ((pchan->protectflag & OB_LOCK_SCALEZ)==0)
+ pchan->size[2]= 1.0f;
+}
+
+/* clear location of pose-channel */
+static void pchan_clear_loc(bPoseChannel *pchan)
+{
+ if ((pchan->protectflag & OB_LOCK_LOCX)==0)
+ pchan->loc[0]= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_LOCY)==0)
+ pchan->loc[1]= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_LOCZ)==0)
+ pchan->loc[2]= 0.0f;
+}
+
+/* clear rotation of pose-channel */
+static void pchan_clear_rot(bPoseChannel *pchan)
+{
+ if (pchan->protectflag & (OB_LOCK_ROTX|OB_LOCK_ROTY|OB_LOCK_ROTZ|OB_LOCK_ROTW)) {
+ /* check if convert to eulers for locking... */
+ if (pchan->protectflag & OB_LOCK_ROT4D) {
+ /* perform clamping on a component by component basis */
+ if (pchan->rotmode == ROT_MODE_AXISANGLE) {
+ if ((pchan->protectflag & OB_LOCK_ROTW) == 0)
+ pchan->rotAngle= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_ROTX) == 0)
+ pchan->rotAxis[0]= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_ROTY) == 0)
+ pchan->rotAxis[1]= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_ROTZ) == 0)
+ pchan->rotAxis[2]= 0.0f;
+
+ /* check validity of axis - axis should never be 0,0,0 (if so, then we make it rotate about y) */
+ if (IS_EQ(pchan->rotAxis[0], pchan->rotAxis[1]) && IS_EQ(pchan->rotAxis[1], pchan->rotAxis[2]))
+ pchan->rotAxis[1] = 1.0f;
+ }
+ else if (pchan->rotmode == ROT_MODE_QUAT) {
+ if ((pchan->protectflag & OB_LOCK_ROTW) == 0)
+ pchan->quat[0]= 1.0f;
+ if ((pchan->protectflag & OB_LOCK_ROTX) == 0)
+ pchan->quat[1]= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_ROTY) == 0)
+ pchan->quat[2]= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_ROTZ) == 0)
+ pchan->quat[3]= 0.0f;
+ }
+ else {
+ /* the flag may have been set for the other modes, so just ignore the extra flag... */
+ if ((pchan->protectflag & OB_LOCK_ROTX) == 0)
+ pchan->eul[0]= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_ROTY) == 0)
+ pchan->eul[1]= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_ROTZ) == 0)
+ pchan->eul[2]= 0.0f;
+ }
+ }
+ else {
+ /* perform clamping using euler form (3-components) */
+ float eul[3], oldeul[3], quat1[4] = {0};
+ float qlen = 0.0f;
+
+ if (pchan->rotmode == ROT_MODE_QUAT) {
+ qlen= normalize_qt_qt(quat1, pchan->quat);
+ quat_to_eul(oldeul, quat1);
+ }
+ else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
+ axis_angle_to_eulO( oldeul, EULER_ORDER_DEFAULT,pchan->rotAxis, pchan->rotAngle);
+ }
+ else {
+ copy_v3_v3(oldeul, pchan->eul);
+ }
+
+ eul[0]= eul[1]= eul[2]= 0.0f;
+
+ if (pchan->protectflag & OB_LOCK_ROTX)
+ eul[0]= oldeul[0];
+ if (pchan->protectflag & OB_LOCK_ROTY)
+ eul[1]= oldeul[1];
+ if (pchan->protectflag & OB_LOCK_ROTZ)
+ eul[2]= oldeul[2];
+
+ if (pchan->rotmode == ROT_MODE_QUAT) {
+ eul_to_quat(pchan->quat, eul);
+
+ /* restore original quat size */
+ mul_qt_fl(pchan->quat, qlen);
+
+ /* quaternions flip w sign to accumulate rotations correctly */
+ if ((quat1[0]<0.0f && pchan->quat[0]>0.0f) || (quat1[0]>0.0f && pchan->quat[0]<0.0f)) {
+ mul_qt_fl(pchan->quat, -1.0f);
+ }
+ }
+ else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
+ eulO_to_axis_angle( pchan->rotAxis, &pchan->rotAngle,eul, EULER_ORDER_DEFAULT);
+ }
+ else {
+ copy_v3_v3(pchan->eul, eul);
+ }
+ }
+ } // Duplicated in source/blender/editors/object/object_transform.c
+ else {
+ if (pchan->rotmode == ROT_MODE_QUAT) {
+ unit_qt(pchan->quat);
+ }
+ else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
+ /* by default, make rotation of 0 radians around y-axis (roll) */
+ unit_axis_angle(pchan->rotAxis, &pchan->rotAngle);
+ }
+ else {
+ zero_v3(pchan->eul);
+ }
+ }
+}
+
+/* clear loc/rot/scale of pose-channel */
+static void pchan_clear_transforms(bPoseChannel *pchan)
+{
+ pchan_clear_loc(pchan);
+ pchan_clear_rot(pchan);
+ pchan_clear_scale(pchan);
+}
+
+/* --------------- */
+
+/* generic exec for clear-pose operators */
+static int pose_clear_transform_generic_exec(bContext *C, wmOperator *op,
+ void (*clear_func)(bPoseChannel*), const char default_ksName[])
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
short autokey = 0;
- /* only clear those channels that are not locked */
- CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) {
- if ((pchan->protectflag & OB_LOCK_SCALEX)==0)
- pchan->size[0]= 1.0f;
- if ((pchan->protectflag & OB_LOCK_SCALEY)==0)
- pchan->size[1]= 1.0f;
- if ((pchan->protectflag & OB_LOCK_SCALEZ)==0)
- pchan->size[2]= 1.0f;
-
+ /* sanity checks */
+ if ELEM(NULL, clear_func, default_ksName) {
+ BKE_report(op->reports, RPT_ERROR, "Programming error: missing clear transform func or Keying Set Name");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* only clear relevant transforms for selected bones */
+ CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones)
+ {
+ /* run provided clearing function */
+ clear_func(pchan);
+
/* do auto-keyframing as appropriate */
if (autokeyframe_cfra_can_key(scene, &ob->id)) {
/* clear any unkeyed tags */
@@ -4948,26 +5083,18 @@ static int pose_clear_scale_exec(bContext *C, wmOperator *op)
/* perform autokeying on the bones if needed */
if (autokey) {
- KeyingSet *ks;
-
- /* get KeyingSet to use
- * - use the active KeyingSet if defined (and user wants to use it for all autokeying),
- * or otherwise key transforms only
- */
- if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (scene->active_keyingset))
- ks = ANIM_scene_get_active_keyingset(scene);
- else
- ks = ANIM_builtin_keyingset_get_named(NULL, "Scaling");
+ /* get KeyingSet to use */
+ KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, default_ksName);
/* insert keyframes */
ANIM_apply_keyingset(C, NULL, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
/* now recalculate paths */
if ((ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS))
- ED_pose_recalculate_paths(C, scene, ob);
+ ED_pose_recalculate_paths(scene, ob);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
@@ -4975,14 +5102,21 @@ static int pose_clear_scale_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
+/* --------------- */
+
+static int pose_clear_scale_exec(bContext *C, wmOperator *op)
+{
+ return pose_clear_transform_generic_exec(C, op, pchan_clear_scale, "Scaling");
+}
+
void POSE_OT_scale_clear(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Clear Pose Scale";
ot->idname= "POSE_OT_scale_clear";
+ ot->description = "Reset scaling of selected bones to their default values";
/* api callbacks */
- ot->invoke = WM_operator_confirm;
ot->exec = pose_clear_scale_exec;
ot->poll = ED_operator_posemode;
@@ -4990,66 +5124,31 @@ void POSE_OT_scale_clear(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int pose_clear_loc_exec(bContext *C, wmOperator *op)
+
+static int pose_clear_rot_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
- short autokey = 0;
-
- /* only clear those channels that are not locked */
- CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) {
- /* clear location */
- if ((pchan->protectflag & OB_LOCK_LOCX)==0)
- pchan->loc[0]= 0.0f;
- if ((pchan->protectflag & OB_LOCK_LOCY)==0)
- pchan->loc[1]= 0.0f;
- if ((pchan->protectflag & OB_LOCK_LOCZ)==0)
- pchan->loc[2]= 0.0f;
-
- /* do auto-keyframing as appropriate */
- if (autokeyframe_cfra_can_key(scene, &ob->id)) {
- /* clear any unkeyed tags */
- if (pchan->bone)
- pchan->bone->flag &= ~BONE_UNKEYED;
-
- /* tag for autokeying later */
- autokey = 1;
- }
- else {
- /* add unkeyed tags */
- if (pchan->bone)
- pchan->bone->flag |= BONE_UNKEYED;
- }
- }
- CTX_DATA_END;
+ return pose_clear_transform_generic_exec(C, op, pchan_clear_rot, "Rotation");
+}
+
+void POSE_OT_rot_clear(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Clear Pose Rotation";
+ ot->idname= "POSE_OT_rot_clear";
+ ot->description = "Reset rotations of selected bones to their default values";
- /* perform autokeying on the bones if needed */
- if (autokey) {
- KeyingSet *ks;
-
- /* get KeyingSet to use
- * - use the active KeyingSet if defined (and user wants to use it for all autokeying),
- * or otherwise key transforms only
- */
- if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (scene->active_keyingset))
- ks = ANIM_scene_get_active_keyingset(scene);
- else
- ks = ANIM_builtin_keyingset_get_named(NULL, "Location");
-
- /* insert keyframes */
- ANIM_apply_keyingset(C, NULL, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
-
- /* now recalculate paths */
- if ((ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS))
- ED_pose_recalculate_paths(C, scene, ob);
- }
+ /* api callbacks */
+ ot->exec = pose_clear_rot_exec;
+ ot->poll = ED_operator_posemode;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
- /* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
-
- return OPERATOR_FINISHED;
+
+static int pose_clear_loc_exec(bContext *C, wmOperator *op)
+{
+ return pose_clear_transform_generic_exec(C, op, pchan_clear_loc, "Location");
}
void POSE_OT_loc_clear(wmOperatorType *ot)
@@ -5057,9 +5156,9 @@ void POSE_OT_loc_clear(wmOperatorType *ot)
/* identifiers */
ot->name= "Clear Pose Location";
ot->idname= "POSE_OT_loc_clear";
+ ot->description = "Reset locations of selected bones to their default values";
/* api callbacks */
- ot->invoke = WM_operator_confirm;
ot->exec = pose_clear_loc_exec;
ot->poll = ED_operator_posemode;
@@ -5067,171 +5166,30 @@ void POSE_OT_loc_clear(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int pose_clear_rot_exec(bContext *C, wmOperator *op)
-{
- Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
- short autokey = 0;
-
- /* only clear those channels that are not locked */
- CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) {
- if (pchan->protectflag & (OB_LOCK_ROTX|OB_LOCK_ROTY|OB_LOCK_ROTZ|OB_LOCK_ROTW)) {
- /* check if convert to eulers for locking... */
- if (pchan->protectflag & OB_LOCK_ROT4D) {
- /* perform clamping on a component by component basis */
- if (pchan->rotmode == ROT_MODE_AXISANGLE) {
- if ((pchan->protectflag & OB_LOCK_ROTW) == 0)
- pchan->rotAngle= 0.0f;
- if ((pchan->protectflag & OB_LOCK_ROTX) == 0)
- pchan->rotAxis[0]= 0.0f;
- if ((pchan->protectflag & OB_LOCK_ROTY) == 0)
- pchan->rotAxis[1]= 0.0f;
- if ((pchan->protectflag & OB_LOCK_ROTZ) == 0)
- pchan->rotAxis[2]= 0.0f;
-
- /* check validity of axis - axis should never be 0,0,0 (if so, then we make it rotate about y) */
- if (IS_EQ(pchan->rotAxis[0], pchan->rotAxis[1]) && IS_EQ(pchan->rotAxis[1], pchan->rotAxis[2]))
- pchan->rotAxis[1] = 1.0f;
- }
- else if (pchan->rotmode == ROT_MODE_QUAT) {
- if ((pchan->protectflag & OB_LOCK_ROTW) == 0)
- pchan->quat[0]= 1.0f;
- if ((pchan->protectflag & OB_LOCK_ROTX) == 0)
- pchan->quat[1]= 0.0f;
- if ((pchan->protectflag & OB_LOCK_ROTY) == 0)
- pchan->quat[2]= 0.0f;
- if ((pchan->protectflag & OB_LOCK_ROTZ) == 0)
- pchan->quat[3]= 0.0f;
- }
- else {
- /* the flag may have been set for the other modes, so just ignore the extra flag... */
- if ((pchan->protectflag & OB_LOCK_ROTX) == 0)
- pchan->eul[0]= 0.0f;
- if ((pchan->protectflag & OB_LOCK_ROTY) == 0)
- pchan->eul[1]= 0.0f;
- if ((pchan->protectflag & OB_LOCK_ROTZ) == 0)
- pchan->eul[2]= 0.0f;
- }
- }
- else {
- /* perform clamping using euler form (3-components) */
- float eul[3], oldeul[3], quat1[4] = {0};
-
- if (pchan->rotmode == ROT_MODE_QUAT) {
- copy_qt_qt(quat1, pchan->quat);
- quat_to_eul( oldeul,pchan->quat);
- }
- else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
- axis_angle_to_eulO( oldeul, EULER_ORDER_DEFAULT,pchan->rotAxis, pchan->rotAngle);
- }
- else {
- copy_v3_v3(oldeul, pchan->eul);
- }
-
- eul[0]= eul[1]= eul[2]= 0.0f;
-
- if (pchan->protectflag & OB_LOCK_ROTX)
- eul[0]= oldeul[0];
- if (pchan->protectflag & OB_LOCK_ROTY)
- eul[1]= oldeul[1];
- if (pchan->protectflag & OB_LOCK_ROTZ)
- eul[2]= oldeul[2];
-
- if (pchan->rotmode == ROT_MODE_QUAT) {
- eul_to_quat( pchan->quat,eul);
- /* quaternions flip w sign to accumulate rotations correctly */
- if ((quat1[0]<0.0f && pchan->quat[0]>0.0f) || (quat1[0]>0.0f && pchan->quat[0]<0.0f)) {
- mul_qt_fl(pchan->quat, -1.0f);
- }
- }
- else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
- eulO_to_axis_angle( pchan->rotAxis, &pchan->rotAngle,eul, EULER_ORDER_DEFAULT);
- }
- else {
- copy_v3_v3(pchan->eul, eul);
- }
- }
- } // Duplicated in source/blender/editors/object/object_transform.c
- else {
- if (pchan->rotmode == ROT_MODE_QUAT) {
- pchan->quat[1]=pchan->quat[2]=pchan->quat[3]= 0.0f;
- pchan->quat[0]= 1.0f;
- }
- else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
- /* by default, make rotation of 0 radians around y-axis (roll) */
- pchan->rotAxis[0]=pchan->rotAxis[2]=pchan->rotAngle= 0.0f;
- pchan->rotAxis[1]= 1.0f;
- }
- else {
- pchan->eul[0]= pchan->eul[1]= pchan->eul[2]= 0.0f;
- }
- }
-
- /* do auto-keyframing as appropriate */
- if (autokeyframe_cfra_can_key(scene, &ob->id)) {
- /* clear any unkeyed tags */
- if (pchan->bone)
- pchan->bone->flag &= ~BONE_UNKEYED;
-
- /* tag for autokeying later */
- autokey = 1;
- }
- else {
- /* add unkeyed tags */
- if (pchan->bone)
- pchan->bone->flag |= BONE_UNKEYED;
- }
- }
- CTX_DATA_END;
-
- /* perform autokeying on the bones if needed */
- if (autokey) {
- KeyingSet *ks;
-
- /* get KeyingSet to use
- * - use the active KeyingSet if defined (and user wants to use it for all autokeying),
- * or otherwise key transforms only
- */
- if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (scene->active_keyingset))
- ks = ANIM_scene_get_active_keyingset(scene);
- else
- ks = ANIM_builtin_keyingset_get_named(NULL, "Rotation");
-
- /* insert keyframes */
- ANIM_apply_keyingset(C, NULL, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
-
- /* now recalculate paths */
- if ((ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS))
- ED_pose_recalculate_paths(C, scene, ob);
- }
-
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
- /* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
-
- return OPERATOR_FINISHED;
+static int pose_clear_transforms_exec(bContext *C, wmOperator *op)
+{
+ return pose_clear_transform_generic_exec(C, op, pchan_clear_transforms, "LocRotScale");
}
-void POSE_OT_rot_clear(wmOperatorType *ot)
+void POSE_OT_transforms_clear(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Clear Pose Rotation";
- ot->idname= "POSE_OT_rot_clear";
+ ot->name= "Clear Pose Transforms";
+ ot->idname= "POSE_OT_transforms_clear";
+ ot->description = "Reset location, rotation, and scaling of selected bones to their default values";
/* api callbacks */
- ot->invoke = WM_operator_confirm;
- ot->exec = pose_clear_rot_exec;
+ ot->exec = pose_clear_transforms_exec;
ot->poll = ED_operator_posemode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
}
/* ***************** selections ********************** */
-static int pose_select_inverse_exec(bContext *C, wmOperator *op)
+static int pose_select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
/* Set the flags */
@@ -5250,10 +5208,10 @@ static int pose_select_inverse_exec(bContext *C, wmOperator *op)
void POSE_OT_select_inverse(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Select Inverse";
ot->idname= "POSE_OT_select_inverse";
+ ot->description= "Flip the selection status of bones (selected -> unselected, unselected -> selected)";
/* api callbacks */
ot->exec= pose_select_inverse_exec;
@@ -5268,20 +5226,7 @@ static int pose_de_select_all_exec(bContext *C, wmOperator *op)
int action = RNA_enum_get(op->ptr, "action");
if (action == SEL_TOGGLE) {
- bPoseChannel *pchan= CTX_data_active_pose_bone(C);
- int num_sel = CTX_DATA_COUNT(C, selected_pose_bones);
-
- /* cases for deselect:
- * 1) there's only one bone selected, and that is the active one
- * 2) there's more than one bone selected
- */
- if ( ((num_sel == 1) && (pchan) && (pchan->bone->flag & BONE_SELECTED)) ||
- (num_sel > 1) )
- {
- action = SEL_DESELECT;
- }
- else
- action = SEL_SELECT;
+ action= CTX_DATA_COUNT(C, selected_pose_bones) ? SEL_DESELECT : SEL_SELECT;
}
/* Set the flags */
@@ -5298,7 +5243,8 @@ static int pose_de_select_all_exec(bContext *C, wmOperator *op)
case SEL_INVERT:
if (pchan->bone->flag & BONE_SELECTED) {
pchan->bone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
- } else if ((pchan->bone->flag & BONE_UNSELECTABLE)==0) {
+ }
+ else if ((pchan->bone->flag & BONE_UNSELECTABLE)==0) {
pchan->bone->flag |= BONE_SELECTED;
}
break;
@@ -5313,10 +5259,10 @@ static int pose_de_select_all_exec(bContext *C, wmOperator *op)
void POSE_OT_select_all(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Select or Deselect All";
ot->idname= "POSE_OT_select_all";
+ ot->description= "Toggle selection status of all bones";
/* api callbacks */
ot->exec= pose_de_select_all_exec;
@@ -5328,9 +5274,9 @@ void POSE_OT_select_all(wmOperatorType *ot)
WM_operator_properties_select_all(ot);
}
-static int pose_select_parent_exec(bContext *C, wmOperator *op)
+static int pose_select_parent_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bPoseChannel *pchan,*parent;
/* Determine if there is an active bone */
@@ -5358,8 +5304,9 @@ static int pose_select_parent_exec(bContext *C, wmOperator *op)
void POSE_OT_select_parent(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "select parent bone";
+ ot->name= "Select Parent Bone";
ot->idname= "POSE_OT_select_parent";
+ ot->description= "Select bones that are parents of the currently selected bones";
/* api callbacks */
ot->exec= pose_select_parent_exec;
@@ -5372,7 +5319,7 @@ void POSE_OT_select_parent(wmOperatorType *ot)
/* ************* hide/unhide pose bones ******************* */
-static int hide_selected_pose_bone(Object *ob, Bone *bone, void *ptr)
+static int hide_selected_pose_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr))
{
bArmature *arm= ob->data;
@@ -5387,7 +5334,7 @@ static int hide_selected_pose_bone(Object *ob, Bone *bone, void *ptr)
return 0;
}
-static int hide_unselected_pose_bone(Object *ob, Bone *bone, void *ptr)
+static int hide_unselected_pose_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr))
{
bArmature *arm= ob->data;
@@ -5405,15 +5352,13 @@ static int hide_unselected_pose_bone(Object *ob, Bone *bone, void *ptr)
/* active object is armature in posemode, poll checked */
static int pose_hide_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm= ob->data;
if(RNA_boolean_get(op->ptr, "unselected"))
- bone_looper(ob, arm->bonebase.first, NULL,
- hide_unselected_pose_bone);
+ bone_looper(ob, arm->bonebase.first, NULL, hide_unselected_pose_bone_cb);
else
- bone_looper(ob, arm->bonebase.first, NULL,
- hide_selected_pose_bone);
+ bone_looper(ob, arm->bonebase.first, NULL, hide_selected_pose_bone_cb);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
@@ -5426,6 +5371,7 @@ void POSE_OT_hide(wmOperatorType *ot)
/* identifiers */
ot->name= "Hide Selected";
ot->idname= "POSE_OT_hide";
+ ot->description= "Tag selected bones to not be visible in Pose Mode";
/* api callbacks */
ot->exec= pose_hide_exec;
@@ -5438,7 +5384,7 @@ void POSE_OT_hide(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "");
}
-static int show_pose_bone(Object *ob, Bone *bone, void *ptr)
+static int show_pose_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr))
{
bArmature *arm= ob->data;
@@ -5453,12 +5399,12 @@ static int show_pose_bone(Object *ob, Bone *bone, void *ptr)
}
/* active object is armature in posemode, poll checked */
-static int pose_reveal_exec(bContext *C, wmOperator *op)
+static int pose_reveal_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm= ob->data;
- bone_looper(ob, arm->bonebase.first, NULL, show_pose_bone);
+ bone_looper(ob, arm->bonebase.first, NULL, show_pose_bone_cb);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
@@ -5471,6 +5417,7 @@ void POSE_OT_reveal(wmOperatorType *ot)
/* identifiers */
ot->name= "Reveal Selected";
ot->idname= "POSE_OT_reveal";
+ ot->description= "Unhide all bones that have been tagged to be hidden in Pose Mode";
/* api callbacks */
ot->exec= pose_reveal_exec;
@@ -5482,33 +5429,17 @@ void POSE_OT_reveal(wmOperatorType *ot)
/* ************* RENAMING DISASTERS ************ */
-/* note: there's a unique_editbone_name() too! */
-void unique_bone_name (bArmature *arm, char *name)
+static int bone_unique_check(void *arg, const char *name)
{
- char tempname[64];
- int number;
- char *dot;
-
- if (get_named_bone(arm, name)) {
-
- /* Strip off the suffix, if it's a number */
- number= strlen(name);
- if(number && isdigit(name[number-1])) {
- dot= strrchr(name, '.'); // last occurrence
- if (dot)
- *dot=0;
- }
-
- for (number = 1; number <=999; number++) {
- sprintf (tempname, "%s.%03d", name, number);
- if (!get_named_bone(arm, tempname)) {
- BLI_strncpy (name, tempname, 32);
- return;
- }
- }
- }
+ return get_named_bone((bArmature *)arg, name) != NULL;
}
+void unique_bone_name(bArmature *arm, char *name)
+{
+ BLI_uniquename_cb(bone_unique_check, (void *)arm, "Bone", '.', name, sizeof(((Bone *)NULL)->name));
+}
+
+
#define MAXBONENAME 32
/* helper call for armature_bone_rename */
static void constraint_bone_name_fix(Object *ob, ListBase *conlist, char *oldname, char *newname)
@@ -5650,7 +5581,7 @@ void ED_armature_bone_rename(bArmature *arm, char *oldnamep, char *newnamep)
}
-static int armature_flip_names_exec (bContext *C, wmOperator *op)
+static int armature_flip_names_exec (bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_edit_object(C);
bArmature *arm;
@@ -5670,7 +5601,7 @@ static int armature_flip_names_exec (bContext *C, wmOperator *op)
CTX_DATA_END;
/* since we renamed stuff... */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -5683,7 +5614,7 @@ void ARMATURE_OT_flip_names (wmOperatorType *ot)
/* identifiers */
ot->name= "Flip Names";
ot->idname= "ARMATURE_OT_flip_names";
- ot->description= "Flips (and corrects) the names of selected bones";
+ ot->description= "Flips (and corrects) the axis suffixes of the names of selected bones";
/* api callbacks */
ot->exec= armature_flip_names_exec;
@@ -5716,7 +5647,7 @@ static int armature_autoside_names_exec (bContext *C, wmOperator *op)
CTX_DATA_END;
/* since we renamed stuff... */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -5893,13 +5824,8 @@ EditBone * test_subdivideByCorrelation(Scene *scene, Object *obedit, ReebArc *ar
if (scene->toolsettings->skgen_options & SKGEN_CUT_CORRELATION)
{
- float invmat[4][4] = { {1, 0, 0, 0},
- {0, 1, 0, 0},
- {0, 0, 1, 0},
- {0, 0, 0, 1}};
- float tmat[3][3] = { {1, 0, 0},
- {0, 1, 0},
- {0, 0, 1}};
+ float invmat[4][4]= MAT4_UNITY;
+ float tmat[3][3]= MAT3_UNITY;
ReebArcIterator arc_iter;
BArcIterator *iter = (BArcIterator*)&arc_iter;
bArmature *arm= obedit->data;
@@ -5945,13 +5871,8 @@ EditBone * test_subdivideByLength(Scene *scene, Object *obedit, ReebArc *arc, Re
if ((scene->toolsettings->skgen_options & SKGEN_CUT_LENGTH) &&
arcLengthRatio(arc) >= G.scene->toolsettings->skgen_length_ratio)
{
- float invmat[4][4] = { {1, 0, 0, 0},
- {0, 1, 0, 0},
- {0, 0, 1, 0},
- {0, 0, 0, 1}};
- float tmat[3][3] = { {1, 0, 0},
- {0, 1, 0},
- {0, 0, 1}};
+ float invmat[4][4]= MAT4_UNITY;
+ float tmat[3][3]= MAT3_UNITY;
ReebArcIterator arc_iter;
BArcIterator *iter = (BArcIterator*)&arc_iter;
bArmature *arm= obedit->data;
diff --git a/source/blender/editors/armature/editarmature_generate.c b/source/blender/editors/armature/editarmature_generate.c
index 1c9024f6f91..527f5ba5e69 100644
--- a/source/blender/editors/armature/editarmature_generate.c
+++ b/source/blender/editors/armature/editarmature_generate.c
@@ -39,29 +39,24 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_graph.h"
+#include "BLI_utildefines.h"
-#include "BKE_utildefines.h"
+
#include "ED_armature.h"
#include "armature_intern.h"
#include "BIF_generate.h"
-void setBoneRollFromNormal(EditBone *bone, float *no, float invmat[][4], float tmat[][3])
+void setBoneRollFromNormal(EditBone *bone, float *no, float UNUSED(invmat[][4]), float tmat[][3])
{
if (no != NULL && !is_zero_v3(no))
{
- float tangent[3], vec[3], normal[3];
+ float normal[3];
- VECCOPY(normal, no);
+ copy_v3_v3(normal, no);
mul_m3_v3(tmat, normal);
-
- sub_v3_v3v3(tangent, bone->tail, bone->head);
- project_v3_v3v3(vec, tangent, normal);
- sub_v3_v3(normal, vec);
-
- normalize_v3(normal);
- bone->roll = ED_rollBoneToVector(bone, normal);
+ bone->roll = ED_rollBoneToVector(bone, normal, FALSE);
}
}
@@ -118,7 +113,7 @@ float calcArcCorrelation(BArcIterator *iter, int start, int end, float v0[3], fl
}
}
-int nextFixedSubdivision(ToolSettings *toolsettings, BArcIterator *iter, int start, int end, float head[3], float p[3])
+int nextFixedSubdivision(ToolSettings *toolsettings, BArcIterator *iter, int start, int end, float UNUSED(head[3]), float p[3])
{
static float stroke_length = 0;
static float current_length;
@@ -277,7 +272,7 @@ int nextLengthSubdivision(ToolSettings *toolsettings, BArcIterator *iter, int st
return -1;
}
-EditBone * subdivideArcBy(ToolSettings *toolsettings, bArmature *arm, ListBase *editbones, BArcIterator *iter, float invmat[][4], float tmat[][3], NextSubdivisionFunc next_subdividion)
+EditBone * subdivideArcBy(ToolSettings *toolsettings, bArmature *arm, ListBase *UNUSED(editbones), BArcIterator *iter, float invmat[][4], float tmat[][3], NextSubdivisionFunc next_subdividion)
{
EditBone *lastBone = NULL;
EditBone *child = NULL;
diff --git a/source/blender/editors/armature/editarmature_retarget.c b/source/blender/editors/armature/editarmature_retarget.c
index 637c6076314..cabf81ea85e 100644
--- a/source/blender/editors/armature/editarmature_retarget.c
+++ b/source/blender/editors/armature/editarmature_retarget.c
@@ -41,6 +41,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_graph.h"
#include "BLI_rand.h"
@@ -185,12 +186,12 @@ float rollBoneByQuatAligned(EditBone *bone, float old_up_axis[3], float qrot[4],
if (angle_normalized_v3v3(x_axis, new_up_axis) < angle_normalized_v3v3(z_axis, new_up_axis))
{
rotation_between_vecs_to_quat(qroll, new_up_axis, x_axis); /* set roll rotation quat */
- return ED_rollBoneToVector(bone, x_axis);
+ return ED_rollBoneToVector(bone, x_axis, FALSE);
}
else
{
rotation_between_vecs_to_quat(qroll, new_up_axis, z_axis); /* set roll rotation quat */
- return ED_rollBoneToVector(bone, z_axis);
+ return ED_rollBoneToVector(bone, z_axis, FALSE);
}
}
@@ -240,7 +241,7 @@ float rollBoneByQuatJoint(RigEdge *edge, RigEdge *previous, float qrot[4], float
/* real qroll between normal and up_axis */
rotation_between_vecs_to_quat(qroll, new_up_axis, normal);
- return ED_rollBoneToVector(edge->bone, normal);
+ return ED_rollBoneToVector(edge->bone, normal, FALSE);
}
}
@@ -251,9 +252,7 @@ float rollBoneByQuat(EditBone *bone, float old_up_axis[3], float qrot[4])
VECCOPY(new_up_axis, old_up_axis);
mul_qt_v3(qrot, new_up_axis);
- normalize_v3(new_up_axis);
-
- return ED_rollBoneToVector(bone, new_up_axis);
+ return ED_rollBoneToVector(bone, new_up_axis, FALSE);
}
/************************************ DESTRUCTORS ******************************************************/
@@ -306,7 +305,7 @@ void RIG_freeRigGraph(BGraph *rg)
/************************************* ALLOCATORS ******************************************************/
-static RigGraph *newRigGraph()
+static RigGraph *newRigGraph(void)
{
RigGraph *rg;
int totthread;
@@ -374,7 +373,7 @@ static RigNode *newRigNodeHead(RigGraph *rg, RigArc *arc, float p[3])
return node;
}
-static void addRigNodeHead(RigGraph *rg, RigArc *arc, RigNode *node)
+static void addRigNodeHead(RigGraph *UNUSED(rg), RigArc *arc, RigNode *node)
{
node->degree++;
@@ -1415,9 +1414,9 @@ static void RIG_findHead(RigGraph *rg)
/*******************************************************************************************************/
-void RIG_printNode(RigNode *node, char name[])
+void RIG_printNode(RigNode *node, const char name[])
{
- printf("%s %p %i <%0.3f, %0.3f, %0.3f>\n", name, node, node->degree, node->p[0], node->p[1], node->p[2]);
+ printf("%s %p %i <%0.3f, %0.3f, %0.3f>\n", name, (void *)node, node->degree, node->p[0], node->p[1], node->p[2]);
if (node->symmetry_flag & SYM_TOPOLOGICAL)
{
@@ -1537,8 +1536,7 @@ RigGraph *RIG_graphFromArmature(const bContext *C, Object *ob, bArmature *arm)
if (obedit == ob)
{
- bArmature *arm = obedit->data;
- rg->editbones = arm->edbo;
+ rg->editbones = ((bArmature *)obedit->data)->edbo;
}
else
{
@@ -1637,7 +1635,7 @@ static EditBone *add_editbonetolist(char *name, ListBase *list)
{
EditBone *bone= MEM_callocN(sizeof(EditBone), "eBone");
- BLI_strncpy(bone->name, name, 32);
+ BLI_strncpy(bone->name, name, sizeof(bone->name));
unique_editbone_name(list, bone->name, NULL);
BLI_addtail(list, bone);
@@ -1693,7 +1691,7 @@ void generateMissingArcsFromNode(RigGraph *rigg, ReebNode *node, int multi_level
void generateMissingArcs(RigGraph *rigg)
{
- ReebGraph *reebg = rigg->link_mesh;
+ ReebGraph *reebg;
int multi_level_limit = 5;
for (reebg = rigg->link_mesh; reebg; reebg = reebg->link_up)
@@ -1784,7 +1782,7 @@ static void repositionTailControl(RigGraph *rigg, RigControl *ctrl)
finalizeControl(rigg, ctrl, 1); /* resize will be recalculated anyway so we don't need it */
}
-static void repositionControl(RigGraph *rigg, RigControl *ctrl, float head[3], float tail[3], float qrot[4], float resize)
+static void repositionControl(RigGraph *rigg, RigControl *ctrl, float head[3], float UNUSED(tail[3]), float qrot[4], float resize)
{
float parent_offset[3], tail_offset[3];
@@ -1925,8 +1923,6 @@ static RetargetMode detectArcRetargetMode(RigArc *iarc)
mode = RETARGET_LENGTH;
}
- mode = RETARGET_AGGRESSIVE;
-
return mode;
}
@@ -2051,7 +2047,7 @@ static float calcCostLengthDistance(BArcIterator *iter, float **vec_cache, RigEd
}
#endif
-static float calcCostAngleLengthDistance(BArcIterator *iter, float **vec_cache, RigEdge *edge, float *vec0, float *vec1, float *vec2, int i1, int i2, float angle_weight, float length_weight, float distance_weight)
+static float calcCostAngleLengthDistance(BArcIterator *iter, float **UNUSED(vec_cache), RigEdge *edge, float *vec0, float *vec1, float *vec2, int i1, int i2, float angle_weight, float length_weight, float distance_weight)
{
float vec_second[3], vec_first[3];
float length2;
@@ -2734,8 +2730,6 @@ static void retargetGraphs(bContext *C, RigGraph *rigg)
BIF_flagMultiArcs(reebg, ARC_FREE);
/* return to first level */
- reebg = rigg->link_mesh;
-
inode = rigg->head;
matchMultiResolutionStartingNode(rigg, reebg, inode);
@@ -2751,7 +2745,7 @@ static void retargetGraphs(bContext *C, RigGraph *rigg)
ED_armature_from_edit(rigg->ob);
}
-char *RIG_nameBone(RigGraph *rg, int arc_index, int bone_index)
+const char *RIG_nameBone(RigGraph *rg, int arc_index, int bone_index)
{
RigArc *arc = BLI_findlink(&rg->arcs, arc_index);
RigEdge *iedge;
@@ -2796,7 +2790,7 @@ int RIG_nbJoints(RigGraph *rg)
return total;
}
-void BIF_freeRetarget()
+void BIF_freeRetarget(void)
{
if (GLOBAL_RIGG)
{
@@ -2891,7 +2885,6 @@ void BIF_retargetArc(bContext *C, ReebArc *earc, RigGraph *template_rigg)
Object *ob;
RigGraph *rigg;
RigArc *iarc;
- bArmature *arm;
char *side_string = scene->toolsettings->skgen_side_string;
char *num_string = scene->toolsettings->skgen_num_string;
int free_template = 0;
@@ -2899,14 +2892,12 @@ void BIF_retargetArc(bContext *C, ReebArc *earc, RigGraph *template_rigg)
if (template_rigg)
{
ob = template_rigg->ob;
- arm = ob->data;
}
else
{
free_template = 1;
- ob = obedit;
- arm = ob->data;
- template_rigg = armatureSelectedToGraph(C, ob, arm);
+ ob = obedit;
+ template_rigg = armatureSelectedToGraph(C, ob, ob->data);
}
if (template_rigg->arcs.first == NULL)
diff --git a/source/blender/editors/armature/editarmature_sketch.c b/source/blender/editors/armature/editarmature_sketch.c
index 241301b8ee1..7a5c14b1dab 100644
--- a/source/blender/editors/armature/editarmature_sketch.c
+++ b/source/blender/editors/armature/editarmature_sketch.c
@@ -35,6 +35,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_graph.h"
#include "BLI_ghash.h"
@@ -105,10 +106,6 @@ typedef struct SK_StrokeIterator {
void initStrokeIterator(BArcIterator *iter, SK_Stroke *stk, int start, int end);
-void sk_deleteSelectedStrokes(SK_Sketch *sketch);
-
-SK_Point *sk_lastStrokePoint(SK_Stroke *stk);
-
int sk_detectCutGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch);
void sk_applyCutGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch);
int sk_detectTrimGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch);
@@ -184,7 +181,7 @@ void BIF_makeListTemplates(const bContext *C)
}
}
-char *BIF_listTemplates(const bContext *C)
+char *BIF_listTemplates(const bContext *UNUSED(C))
{
GHashIterator ghi;
char menu_header[] = "Template%t|None%x0|";
@@ -287,7 +284,7 @@ int BIF_nbJointsTemplate(const bContext *C)
}
}
-char * BIF_nameBoneTemplate(const bContext *C)
+const char * BIF_nameBoneTemplate(const bContext *C)
{
ToolSettings *ts = CTX_data_tool_settings(C);
SK_Sketch *stk = contextSketch(C, 1);
@@ -309,7 +306,7 @@ char * BIF_nameBoneTemplate(const bContext *C)
return RIG_nameBone(rg, 0, index);
}
-void BIF_freeTemplates(bContext *C)
+void BIF_freeTemplates(bContext *UNUSED(C))
{
if (TEMPLATES_MENU != NULL)
{
@@ -1029,7 +1026,7 @@ void sk_projectDrawPoint(bContext *C, float vec[3], SK_Stroke *stk, SK_DrawData
sub_v3_v3v3(vec, fp, dvec);
}
-int sk_getStrokeDrawPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd)
+int sk_getStrokeDrawPoint(bContext *C, SK_Point *pt, SK_Sketch *UNUSED(sketch), SK_Stroke *stk, SK_DrawData *dd)
{
pt->type = dd->type;
pt->mode = PT_PROJECT;
@@ -1773,7 +1770,7 @@ int sk_getSegments(SK_Stroke *segments, SK_Stroke *gesture)
return segments->nb_points - 1;
}
-int sk_detectCutGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+int sk_detectCutGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
if (gest->nb_segments == 1 && gest->nb_intersections == 1)
{
@@ -1783,7 +1780,7 @@ int sk_detectCutGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
return 0;
}
-void sk_applyCutGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+void sk_applyCutGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
SK_Intersection *isect;
@@ -1800,7 +1797,7 @@ void sk_applyCutGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
}
}
-int sk_detectTrimGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+int sk_detectTrimGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
if (gest->nb_segments == 2 && gest->nb_intersections == 1 && gest->nb_self_intersections == 0)
{
@@ -1821,7 +1818,7 @@ int sk_detectTrimGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
return 0;
}
-void sk_applyTrimGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+void sk_applyTrimGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
SK_Intersection *isect;
float trim_dir[3];
@@ -1856,7 +1853,7 @@ void sk_applyTrimGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
}
}
-int sk_detectCommandGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+int sk_detectCommandGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
if (gest->nb_segments > 2 && gest->nb_intersections == 2 && gest->nb_self_intersections == 1)
{
@@ -1883,7 +1880,7 @@ int sk_detectCommandGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
return 0;
}
-void sk_applyCommandGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+void sk_applyCommandGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
SK_Intersection *isect;
int command = 1;
@@ -1918,7 +1915,7 @@ void sk_applyCommandGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
}
}
-int sk_detectDeleteGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+int sk_detectDeleteGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
if (gest->nb_segments == 2 && gest->nb_intersections == 2)
{
@@ -1939,7 +1936,7 @@ int sk_detectDeleteGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
return 0;
}
-void sk_applyDeleteGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+void sk_applyDeleteGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *sketch)
{
SK_Intersection *isect;
@@ -1955,7 +1952,7 @@ void sk_applyDeleteGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
}
}
-int sk_detectMergeGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+int sk_detectMergeGesture(bContext *C, SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
ARegion *ar = CTX_wm_region(C);
if (gest->nb_segments > 2 && gest->nb_intersections == 2)
@@ -2003,7 +2000,7 @@ int sk_detectMergeGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
return 0;
}
-void sk_applyMergeGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+void sk_applyMergeGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
SK_Intersection *isect;
@@ -2034,7 +2031,7 @@ void sk_applyMergeGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
}
}
-int sk_detectReverseGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+int sk_detectReverseGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
if (gest->nb_segments > 2 && gest->nb_intersections == 2 && gest->nb_self_intersections == 0)
{
@@ -2076,7 +2073,7 @@ int sk_detectReverseGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
return 0;
}
-void sk_applyReverseGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+void sk_applyReverseGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
SK_Intersection *isect;
@@ -2093,7 +2090,7 @@ void sk_applyReverseGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
}
}
-int sk_detectConvertGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+int sk_detectConvertGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
if (gest->nb_segments == 3 && gest->nb_self_intersections == 1)
{
@@ -2102,7 +2099,7 @@ int sk_detectConvertGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
return 0;
}
-void sk_applyConvertGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+void sk_applyConvertGesture(bContext *C, SK_Gesture *UNUSED(gest), SK_Sketch *sketch)
{
sk_convert(C, sketch);
}
@@ -2215,7 +2212,7 @@ void sk_queueRedrawSketch(SK_Sketch *sketch)
}
}
-void sk_drawSketch(Scene *scene, View3D *v3d, SK_Sketch *sketch, int with_names)
+void sk_drawSketch(Scene *scene, View3D *UNUSED(v3d), SK_Sketch *sketch, int with_names)
{
ToolSettings *ts= scene->toolsettings;
SK_Stroke *stk;
@@ -2452,7 +2449,7 @@ void BDR_drawSketch(const bContext *C)
}
}
-static int sketch_delete(bContext *C, wmOperator *op, wmEvent *event)
+static int sketch_delete(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
SK_Sketch *sketch = contextSketch(C, 0);
if (sketch)
@@ -2460,6 +2457,7 @@ static int sketch_delete(bContext *C, wmOperator *op, wmEvent *event)
sk_deleteSelectedStrokes(sketch);
// allqueue(REDRAWVIEW3D, 0);
}
+ WM_event_add_notifier(C, NC_SCREEN|ND_SKETCH|NA_REMOVED, NULL);
return OPERATOR_FINISHED;
}
@@ -2558,7 +2556,7 @@ SK_Sketch* viewcontextSketch(ViewContext *vc, int create)
return sketch;
}
-static int sketch_convert(bContext *C, wmOperator *op, wmEvent *event)
+static int sketch_convert(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
SK_Sketch *sketch = contextSketch(C, 0);
if (sketch != NULL)
@@ -2569,7 +2567,7 @@ static int sketch_convert(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_FINISHED;
}
-static int sketch_cancel(bContext *C, wmOperator *op, wmEvent *event)
+static int sketch_cancel(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
SK_Sketch *sketch = contextSketch(C, 0);
if (sketch != NULL)
@@ -2581,7 +2579,7 @@ static int sketch_cancel(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_PASS_THROUGH;
}
-static int sketch_finish(bContext *C, wmOperator *op, wmEvent *event)
+static int sketch_finish(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
SK_Sketch *sketch = contextSketch(C, 0);
if (sketch != NULL)
@@ -2595,7 +2593,7 @@ static int sketch_finish(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_PASS_THROUGH;
}
-static int sketch_select(bContext *C, wmOperator *op, wmEvent *event)
+static int sketch_select(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
SK_Sketch *sketch = contextSketch(C, 0);
if (sketch)
diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c
index 84b02b4796a..c0600ceed1c 100644
--- a/source/blender/editors/armature/meshlaplacian.c
+++ b/source/blender/editors/armature/meshlaplacian.c
@@ -41,10 +41,11 @@
#include "BLI_math.h"
#include "BLI_edgehash.h"
#include "BLI_memarena.h"
+#include "BLI_utildefines.h"
#include "BKE_DerivedMesh.h"
#include "BKE_modifier.h"
-#include "BKE_utildefines.h"
+
#ifdef RIGID_DEFORM
#include "BLI_editVert.h"
@@ -61,11 +62,11 @@
/* ************* XXX *************** */
-static void waitcursor(int val) {}
-static void progress_bar(int dummy_val, const char *dummy) {}
-static void start_progress_bar() {}
-static void end_progress_bar() {}
-static void error(char *str) { printf("error: %s\n", str); }
+static void waitcursor(int UNUSED(val)) {}
+static void progress_bar(int UNUSED(dummy_val), const char *UNUSED(dummy)) {}
+static void start_progress_bar(void) {}
+static void end_progress_bar(void) {}
+static void error(const char *str) { printf("error: %s\n", str); }
/* ************* XXX *************** */
@@ -362,7 +363,7 @@ void laplacian_begin_solve(LaplacianSystem *sys, int index)
}
}
-void laplacian_add_right_hand_side(LaplacianSystem *sys, int v, float value)
+void laplacian_add_right_hand_side(LaplacianSystem *UNUSED(sys), int v, float value)
{
nlRightHandSideAdd(0, v, value);
}
@@ -398,7 +399,7 @@ typedef struct BVHCallbackUserData {
LaplacianSystem *sys;
} BVHCallbackUserData;
-static void bvh_callback(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
+static void bvh_callback(void *userdata, int index, const BVHTreeRay *UNUSED(ray), BVHTreeRayHit *hit)
{
BVHCallbackUserData *data = (struct BVHCallbackUserData*)userdata;
MFace *mf = data->sys->heat.mface + index;
@@ -642,13 +643,15 @@ static float heat_limit_weight(float weight)
return weight;
}
-void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numsource, bDeformGroup **dgrouplist, bDeformGroup **dgroupflip, float (*root)[3], float (*tip)[3], int *selected)
+void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numsource, bDeformGroup **dgrouplist, bDeformGroup **dgroupflip, float (*root)[3], float (*tip)[3], int *selected, const char **err_str)
{
LaplacianSystem *sys;
MFace *mface;
float solution, weight;
int *vertsflipped = NULL, *mask= NULL;
- int a, totface, j, bbone, firstsegment, lastsegment, thrownerror = 0;
+ int a, totface, j, bbone, firstsegment, lastsegment;
+
+ *err_str= NULL;
/* count triangles and create mask */
if(me->editflag & ME_EDIT_PAINT_MASK)
@@ -759,10 +762,8 @@ void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numsource,
}
}
}
- else if(!thrownerror) {
- error("Bone Heat Weighting:"
- " failed to find solution for one or more bones");
- thrownerror= 1;
+ else if(*err_str == NULL) {
+ *err_str= "Bone Heat Weighting: failed to find solution for one or more bones";
break;
}
@@ -1263,11 +1264,9 @@ static int meshdeform_inside_cage(MeshDeformBind *mdb, float *co)
{
MDefBoundIsect *isect;
float outside[3], start[3], dir[3];
- int i, counter;
+ int i;
for(i=1; i<=6; i++) {
- counter = 0;
-
outside[0] = co[0] + (mdb->max[0] - mdb->min[0] + 1.0f)*MESHDEFORM_OFFSET[i][0];
outside[1] = co[1] + (mdb->max[1] - mdb->min[1] + 1.0f)*MESHDEFORM_OFFSET[i][1];
outside[2] = co[2] + (mdb->max[2] - mdb->min[2] + 1.0f)*MESHDEFORM_OFFSET[i][2];
@@ -1400,7 +1399,7 @@ static void meshdeform_bind_floodfill(MeshDeformBind *mdb)
MEM_freeN(stack);
}
-static float meshdeform_boundary_phi(MeshDeformBind *mdb, MDefBoundIsect *isect, int cagevert)
+static float meshdeform_boundary_phi(MeshDeformBind *UNUSED(mdb), MDefBoundIsect *isect, int cagevert)
{
int a;
@@ -1411,7 +1410,7 @@ static float meshdeform_boundary_phi(MeshDeformBind *mdb, MDefBoundIsect *isect,
return 0.0f;
}
-static float meshdeform_interp_w(MeshDeformBind *mdb, float *gridvec, float *vec, int cagevert)
+static float meshdeform_interp_w(MeshDeformBind *mdb, float *gridvec, float *UNUSED(vec), int UNUSED(cagevert))
{
float dvec[3], ivec[3], wx, wy, wz, result=0.0f;
float weight, totweight= 0.0f;
@@ -1562,7 +1561,7 @@ static void meshdeform_matrix_add_semibound_phi(MeshDeformBind *mdb, int x, int
}
}
-static void meshdeform_matrix_add_exterior_phi(MeshDeformBind *mdb, int x, int y, int z, int cagevert)
+static void meshdeform_matrix_add_exterior_phi(MeshDeformBind *mdb, int x, int y, int z, int UNUSED(cagevert))
{
float phi, totweight;
int i, a, acenter;
@@ -1711,7 +1710,7 @@ static void meshdeform_matrix_solve(MeshDeformBind *mdb)
nlDeleteContext(context);
}
-static void harmonic_coordinates_bind(Scene *scene, MeshDeformModifierData *mmd, MeshDeformBind *mdb)
+static void harmonic_coordinates_bind(Scene *UNUSED(scene), MeshDeformModifierData *mmd, MeshDeformBind *mdb)
{
MDefBindInfluence *inf;
MDefInfluence *mdinf;
diff --git a/source/blender/editors/armature/meshlaplacian.h b/source/blender/editors/armature/meshlaplacian.h
index 640eb33c945..26aa0a17d1c 100644
--- a/source/blender/editors/armature/meshlaplacian.h
+++ b/source/blender/editors/armature/meshlaplacian.h
@@ -66,7 +66,7 @@ float laplacian_system_get_solution(int v);
void heat_bone_weighting(struct Object *ob, struct Mesh *me, float (*verts)[3],
int numbones, struct bDeformGroup **dgrouplist,
struct bDeformGroup **dgroupflip, float (*root)[3], float (*tip)[3],
- int *selected);
+ int *selected, const char **error);
#ifdef RIGID_DEFORM
/* As-Rigid-As-Possible Deformation */
@@ -78,9 +78,7 @@ void rigid_deform_end(int cancel);
/* Harmonic Coordinates */
-void mesh_deform_bind(struct Scene *scene,
- struct MeshDeformModifierData *mmd,
- float *vertexcos, int totvert, float cagemat[][4]);
+/* mesh_deform_bind(...) defined in ED_armature.h */
#endif
diff --git a/source/blender/editors/armature/poseSlide.c b/source/blender/editors/armature/poseSlide.c
index 8d8f1bf24ee..47e5f734f86 100644
--- a/source/blender/editors/armature/poseSlide.c
+++ b/source/blender/editors/armature/poseSlide.c
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -119,7 +120,7 @@ static int pose_slide_init (bContext *C, wmOperator *op, short mode)
/* get info from context */
pso->scene= CTX_data_scene(C);
- pso->ob= CTX_data_active_object(C);
+ pso->ob= ED_object_pose_armature(CTX_data_active_object(C));
pso->arm= (pso->ob)? pso->ob->data : NULL;
pso->ar= CTX_wm_region(C); /* only really needed when doing modal() */
@@ -157,7 +158,7 @@ static int pose_slide_init (bContext *C, wmOperator *op, short mode)
}
/* exiting the operator - free data */
-static void pose_slide_exit (bContext *C, wmOperator *op)
+static void pose_slide_exit(wmOperator *op)
{
tPoseSlideOp *pso= op->customdata;
@@ -187,7 +188,7 @@ static void pose_slide_refresh (bContext *C, tPoseSlideOp *pso)
}
/* helper for apply() - perform sliding for some 3-element vector */
-static void pose_slide_apply_vec3 (tPoseSlideOp *pso, tPChanFCurveLink *pfl, float vec[3], char *propName)
+static void pose_slide_apply_vec3 (tPoseSlideOp *pso, tPChanFCurveLink *pfl, float vec[3], const char *propName)
{
LinkData *ld=NULL;
char *path=NULL;
@@ -376,7 +377,7 @@ static void pose_slide_apply_quat (tPoseSlideOp *pso, tPChanFCurveLink *pfl)
}
/* apply() - perform the pose sliding based on weighting various poses */
-static void pose_slide_apply (bContext *C, wmOperator *op, tPoseSlideOp *pso)
+static void pose_slide_apply(bContext *C, tPoseSlideOp *pso)
{
tPChanFCurveLink *pfl;
@@ -434,7 +435,7 @@ static void pose_slide_autoKeyframe (bContext *C, tPoseSlideOp *pso)
}
/* reset changes made to current pose */
-static void pose_slide_reset (bContext *C, tPoseSlideOp *pso)
+static void pose_slide_reset (tPoseSlideOp *pso)
{
/* wrapper around the generic call, so that custom stuff can be added later */
poseAnim_mapping_reset(&pso->pfLinks);
@@ -501,7 +502,7 @@ static int pose_slide_invoke_common (bContext *C, wmOperator *op, tPoseSlideOp *
/* initial apply for operator... */
// TODO: need to calculate percentage for initial round too...
- pose_slide_apply(C, op, pso);
+ pose_slide_apply(C, pso);
/* depsgraph updates + redraws */
pose_slide_refresh(C, pso);
@@ -528,7 +529,7 @@ static int pose_slide_modal (bContext *C, wmOperator *op, wmEvent *evt)
/* insert keyframes as required... */
pose_slide_autoKeyframe(C, pso);
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
/* done! */
return OPERATOR_FINISHED;
@@ -541,13 +542,13 @@ static int pose_slide_modal (bContext *C, wmOperator *op, wmEvent *evt)
WM_cursor_restore(win);
/* reset transforms back to original state */
- pose_slide_reset(C, pso);
+ pose_slide_reset(pso);
/* depsgraph updates + redraws */
pose_slide_refresh(C, pso);
/* clean up temp data */
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
/* cancelled! */
return OPERATOR_CANCELLED;
@@ -562,10 +563,10 @@ static int pose_slide_modal (bContext *C, wmOperator *op, wmEvent *evt)
RNA_float_set(op->ptr, "percentage", pso->percentage);
/* reset transforms (to avoid accumulation errors) */
- pose_slide_reset(C, pso);
+ pose_slide_reset(pso);
/* apply... */
- pose_slide_apply(C, op, pso);
+ pose_slide_apply(C, pso);
}
break;
@@ -579,10 +580,10 @@ static int pose_slide_modal (bContext *C, wmOperator *op, wmEvent *evt)
}
/* common code for cancel() */
-static int pose_slide_cancel (bContext *C, wmOperator *op)
+static int pose_slide_cancel (bContext *UNUSED(C), wmOperator *op)
{
/* cleanup and done */
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
return OPERATOR_CANCELLED;
}
@@ -590,13 +591,13 @@ static int pose_slide_cancel (bContext *C, wmOperator *op)
static int pose_slide_exec_common (bContext *C, wmOperator *op, tPoseSlideOp *pso)
{
/* settings should have been set up ok for applying, so just apply! */
- pose_slide_apply(C, op, pso);
+ pose_slide_apply(C, pso);
/* insert keyframes if needed */
pose_slide_autoKeyframe(C, pso);
/* cleanup and done */
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
return OPERATOR_FINISHED;
}
@@ -612,13 +613,13 @@ static void pose_slide_opdef_properties (wmOperatorType *ot)
/* ------------------------------------ */
/* invoke() - for 'push' mode */
-static int pose_slide_push_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+static int pose_slide_push_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(evt))
{
tPoseSlideOp *pso;
/* initialise data */
if (pose_slide_init(C, op, POSESLIDE_PUSH) == 0) {
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
return OPERATOR_CANCELLED;
}
else
@@ -635,7 +636,7 @@ static int pose_slide_push_exec (bContext *C, wmOperator *op)
/* initialise data (from RNA-props) */
if (pose_slide_init(C, op, POSESLIDE_PUSH) == 0) {
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
return OPERATOR_CANCELLED;
}
else
@@ -669,13 +670,13 @@ void POSE_OT_push (wmOperatorType *ot)
/* ........................ */
/* invoke() - for 'relax' mode */
-static int pose_slide_relax_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+static int pose_slide_relax_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(evt))
{
tPoseSlideOp *pso;
/* initialise data */
if (pose_slide_init(C, op, POSESLIDE_RELAX) == 0) {
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
return OPERATOR_CANCELLED;
}
else
@@ -692,7 +693,7 @@ static int pose_slide_relax_exec (bContext *C, wmOperator *op)
/* initialise data (from RNA-props) */
if (pose_slide_init(C, op, POSESLIDE_RELAX) == 0) {
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
return OPERATOR_CANCELLED;
}
else
@@ -726,13 +727,13 @@ void POSE_OT_relax (wmOperatorType *ot)
/* ........................ */
/* invoke() - for 'breakdown' mode */
-static int pose_slide_breakdown_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+static int pose_slide_breakdown_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(evt))
{
tPoseSlideOp *pso;
/* initialise data */
if (pose_slide_init(C, op, POSESLIDE_BREAKDOWN) == 0) {
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
return OPERATOR_CANCELLED;
}
else
@@ -749,7 +750,7 @@ static int pose_slide_breakdown_exec (bContext *C, wmOperator *op)
/* initialise data (from RNA-props) */
if (pose_slide_init(C, op, POSESLIDE_BREAKDOWN) == 0) {
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
return OPERATOR_CANCELLED;
}
else
diff --git a/source/blender/editors/armature/poseUtils.c b/source/blender/editors/armature/poseUtils.c
index b8b9c354d9a..7b1b3b6c5c8 100644
--- a/source/blender/editors/armature/poseUtils.c
+++ b/source/blender/editors/armature/poseUtils.c
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -161,7 +162,7 @@ void poseAnim_mapping_refresh (bContext *C, Scene *scene, Object *ob)
*/
// FIXME: shouldn't this use the builtin stuff?
if ((arm->flag & ARM_DELAYDEFORM)==0)
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
else
where_is_pose(scene, ob);
diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c
index f490158424c..9c7911715b4 100644
--- a/source/blender/editors/armature/poselib.c
+++ b/source/blender/editors/armature/poselib.c
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -73,7 +74,7 @@
/* ******* XXX ********** */
-static void action_set_activemarker() {}
+static void action_set_activemarker(void *UNUSED(a), void *UNUSED(b), void *UNUSED(c)) {}
/* ************************************************************* */
/* == POSE-LIBRARY TOOL FOR BLENDER ==
@@ -268,9 +269,9 @@ static KeyingSet *poselib_ks_locrotscale = NULL; /* the only keyingset we'll ne
/* ----- */
-static void poselib_add_menu_invoke__replacemenu (bContext *C, uiLayout *layout, void *arg)
+static void poselib_add_menu_invoke__replacemenu (bContext *C, uiLayout *layout, void *UNUSED(arg))
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bAction *act= ob->poselib;
TimeMarker *marker;
@@ -290,10 +291,10 @@ static void poselib_add_menu_invoke__replacemenu (bContext *C, uiLayout *layout,
}
}
-static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(evt))
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm= (ob) ? ob->data : NULL;
bPose *pose= (ob) ? ob->pose : NULL;
uiPopupMenu *pup;
@@ -304,17 +305,17 @@ static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
return OPERATOR_CANCELLED;
/* start building */
- pup= uiPupMenuBegin(C, op->type->name, 0);
+ pup= uiPupMenuBegin(C, op->type->name, ICON_NULL);
layout= uiPupMenuLayout(pup);
uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
/* add new (adds to the first unoccupied frame) */
- uiItemIntO(layout, "Add New", 0, "POSELIB_OT_pose_add", "frame", poselib_get_free_index(ob->poselib));
+ uiItemIntO(layout, "Add New", ICON_NULL, "POSELIB_OT_pose_add", "frame", poselib_get_free_index(ob->poselib));
/* check if we have any choices to add a new pose in any other way */
if ((ob->poselib) && (ob->poselib->markers.first)) {
/* add new (on current frame) */
- uiItemIntO(layout, "Add New (Current Frame)", 0, "POSELIB_OT_pose_add", "frame", CFRA);
+ uiItemIntO(layout, "Add New (Current Frame)", ICON_NULL, "POSELIB_OT_pose_add", "frame", CFRA);
/* replace existing - submenu */
uiItemMenuF(layout, "Replace Existing...", 0, poselib_add_menu_invoke__replacemenu, NULL);
@@ -329,7 +330,7 @@ static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
static int poselib_add_exec (bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bAction *act = poselib_validate(ob);
bArmature *arm= (ob) ? ob->data : NULL;
bPose *pose= (ob) ? ob->pose : NULL;
@@ -402,20 +403,18 @@ void POSELIB_OT_pose_add (wmOperatorType *ot)
/* ----- */
-static EnumPropertyItem *poselib_stored_pose_itemf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *poselib_stored_pose_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bAction *act= (ob) ? ob->poselib : NULL;
TimeMarker *marker;
- EnumPropertyItem *item= NULL, item_tmp;
+ EnumPropertyItem *item= NULL, item_tmp= {0};
int totitem= 0;
int i= 0;
if (C==NULL) {
return DummyRNA_DEFAULT_items;
}
-
- memset(&item_tmp, 0, sizeof(item_tmp));
/* check that the action exists */
if (act) {
@@ -436,7 +435,7 @@ static EnumPropertyItem *poselib_stored_pose_itemf(bContext *C, PointerRNA *ptr,
static int poselib_remove_exec (bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bAction *act= (ob) ? ob->poselib : NULL;
TimeMarker *marker;
FCurve *fcu;
@@ -505,7 +504,7 @@ void POSELIB_OT_pose_remove (wmOperatorType *ot)
static int poselib_rename_invoke (bContext *C, wmOperator *op, wmEvent *evt)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bAction *act= (ob) ? ob->poselib : NULL;
TimeMarker *marker;
@@ -533,7 +532,7 @@ static int poselib_rename_invoke (bContext *C, wmOperator *op, wmEvent *evt)
static int poselib_rename_exec (bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bAction *act= (ob) ? ob->poselib : NULL;
TimeMarker *marker;
char newname[64];
@@ -708,7 +707,7 @@ static void poselib_apply_pose (tPoseLib_PreviewData *pld)
bAction *act= pld->act;
bActionGroup *agrp;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
KeyframeEditFunc group_ok_cb;
int frame= 1;
@@ -721,7 +720,6 @@ static void poselib_apply_pose (tPoseLib_PreviewData *pld)
/* init settings for testing groups for keyframes */
group_ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);
- memset(&ked, 0, sizeof(KeyframeEditData));
ked.f1= ((float)frame) - 0.5f;
ked.f2= ((float)frame) + 0.5f;
@@ -743,7 +741,7 @@ static void poselib_apply_pose (tPoseLib_PreviewData *pld)
}
else if (pchan->bone) {
/* only ok if bone is visible and selected */
- if ( (pchan->bone->flag & BONE_SELECTED || pchan->bone == arm->act_bone) &&
+ if ( (pchan->bone->flag & BONE_SELECTED) &&
(pchan->bone->flag & BONE_HIDDEN_P)==0 &&
(pchan->bone->layer & arm->layer) )
ok = 1;
@@ -773,19 +771,9 @@ static void poselib_keytag_pose (bContext *C, Scene *scene, tPoseLib_PreviewData
if (pchan) {
if (autokeyframe_cfra_can_key(scene, &pld->ob->id)) {
ListBase dsources = {NULL, NULL};
- KeyingSet *ks = NULL;
- /* get KeyingSet to use
- * - use the active KeyingSet if defined (and user wants to use it for all autokeying),
- * or otherwise key transforms only
- */
- if (poselib_ks_locrotscale == NULL)
- poselib_ks_locrotscale= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
-
- if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (scene->active_keyingset))
- ks = ANIM_scene_get_active_keyingset(scene);
- else
- ks = ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
+ /* get KeyingSet to use */
+ KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, "LocRotScale");
/* now insert the keyframe(s) using the Keying Set
* 1) add datasource override for the PoseChannel
@@ -839,7 +827,7 @@ static void poselib_preview_apply (bContext *C, wmOperator *op)
*/
// FIXME: shouldn't this use the builtin stuff?
if ((pld->arm->flag & ARM_DELAYDEFORM)==0)
- DAG_id_flush_update(&pld->ob->id, OB_RECALC_DATA); /* sets recalc flags */
+ DAG_id_tag_update(&pld->ob->id, OB_RECALC_DATA); /* sets recalc flags */
else
where_is_pose(pld->scene, pld->ob);
}
@@ -894,91 +882,90 @@ static void poselib_preview_apply (bContext *C, wmOperator *op)
*/
static void poselib_preview_get_next (tPoseLib_PreviewData *pld, int step)
{
- /* check if we no longer have search-string, but don't have any marker */
- if (pld->marker == NULL) {
- if ((step) && (pld->searchstr[0] == 0))
- pld->marker= pld->act->markers.first;
- }
-
- /* the following operations assume that there is a starting point and direction */
- if ((pld->marker) && (step)) {
- /* search-string dictates a special approach */
- if (pld->searchstr[0]) {
- TimeMarker *marker;
- LinkData *ld, *ldn, *ldc;
+ /* stop if not going anywhere, as we assume that there is a direction to move in */
+ if (step == 0)
+ return;
+
+ /* search-string dictates a special approach */
+ if (pld->searchstr[0]) {
+ TimeMarker *marker;
+ LinkData *ld, *ldn, *ldc;
+
+ /* free and rebuild if needed (i.e. if search-str changed) */
+ if (strcmp(pld->searchstr, pld->searchold)) {
+ /* free list of temporary search matches */
+ BLI_freelistN(&pld->searchp);
- /* free and rebuild if needed (i.e. if search-str changed) */
- if (strcmp(pld->searchstr, pld->searchold)) {
- /* free list of temporary search matches */
- BLI_freelistN(&pld->searchp);
-
- /* generate a new list of search matches */
- for (marker= pld->act->markers.first; marker; marker= marker->next) {
- /* does the name partially match?
- * - don't worry about case, to make it easier for users to quickly input a name (or
- * part of one), which is the whole point of this feature
- */
- if (BLI_strcasestr(marker->name, pld->searchstr)) {
- /* make link-data to store reference to it */
- ld= MEM_callocN(sizeof(LinkData), "PoseMatch");
- ld->data= marker;
- BLI_addtail(&pld->searchp, ld);
- }
+ /* generate a new list of search matches */
+ for (marker= pld->act->markers.first; marker; marker= marker->next) {
+ /* does the name partially match?
+ * - don't worry about case, to make it easier for users to quickly input a name (or
+ * part of one), which is the whole point of this feature
+ */
+ if (BLI_strcasestr(marker->name, pld->searchstr)) {
+ /* make link-data to store reference to it */
+ ld= MEM_callocN(sizeof(LinkData), "PoseMatch");
+ ld->data= marker;
+ BLI_addtail(&pld->searchp, ld);
}
-
- /* set current marker to NULL (so that we start from first) */
- pld->marker= NULL;
- }
-
- /* check if any matches */
- if (pld->searchp.first == NULL) {
- pld->marker= NULL;
- return;
}
- /* find first match */
- for (ldc= pld->searchp.first; ldc; ldc= ldc->next) {
- if (ldc->data == pld->marker)
- break;
- }
- if (ldc == NULL)
- ldc= pld->searchp.first;
-
- /* Loop through the matches in a cyclic fashion, incrementing/decrementing step as appropriate
- * until step == 0. At this point, marker should be the correct marker.
- */
- if (step > 0) {
- for (ld=ldc; ld && step; ld=ldn, step--)
- ldn= (ld->next) ? ld->next : pld->searchp.first;
- }
- else {
- for (ld=ldc; ld && step; ld=ldn, step++)
- ldn= (ld->prev) ? ld->prev : pld->searchp.last;
- }
+ /* set current marker to NULL (so that we start from first) */
+ pld->marker= NULL;
+ }
+
+ /* check if any matches */
+ if (pld->searchp.first == NULL) {
+ pld->marker= NULL;
+ return;
+ }
+
+ /* find first match */
+ for (ldc= pld->searchp.first; ldc; ldc= ldc->next) {
+ if (ldc->data == pld->marker)
+ break;
+ }
+ if (ldc == NULL)
+ ldc= pld->searchp.first;
- /* set marker */
- if (ld)
- pld->marker= ld->data;
+ /* Loop through the matches in a cyclic fashion, incrementing/decrementing step as appropriate
+ * until step == 0. At this point, marker should be the correct marker.
+ */
+ if (step > 0) {
+ for (ld=ldc; ld && step; ld=ldn, step--)
+ ldn= (ld->next) ? ld->next : pld->searchp.first;
}
else {
- TimeMarker *marker, *next;
-
- /* Loop through the markers in a cyclic fashion, incrementing/decrementing step as appropriate
- * until step == 0. At this point, marker should be the correct marker.
- */
- if (step > 0) {
- for (marker=pld->marker; marker && step; marker=next, step--)
- next= (marker->next) ? marker->next : pld->act->markers.first;
- }
- else {
- for (marker=pld->marker; marker && step; marker=next, step++)
- next= (marker->prev) ? marker->prev : pld->act->markers.last;
- }
-
- /* it should be fairly impossible for marker to be NULL */
- if (marker)
- pld->marker= marker;
+ for (ld=ldc; ld && step; ld=ldn, step++)
+ ldn= (ld->prev) ? ld->prev : pld->searchp.last;
+ }
+
+ /* set marker */
+ if (ld)
+ pld->marker= ld->data;
+ }
+ else {
+ TimeMarker *marker, *next;
+
+ /* if no marker, because we just ended searching, then set that to the start of the list */
+ if (pld->marker == NULL)
+ pld->marker= pld->act->markers.first;
+
+ /* Loop through the markers in a cyclic fashion, incrementing/decrementing step as appropriate
+ * until step == 0. At this point, marker should be the correct marker.
+ */
+ if (step > 0) {
+ for (marker=pld->marker; marker && step; marker=next, step--)
+ next= (marker->next) ? marker->next : pld->act->markers.first;
}
+ else {
+ for (marker=pld->marker; marker && step; marker=next, step++)
+ next= (marker->prev) ? marker->prev : pld->act->markers.last;
+ }
+
+ /* it should be fairly impossible for marker to be NULL */
+ if (marker)
+ pld->marker= marker;
}
}
@@ -1044,11 +1031,17 @@ static void poselib_preview_handle_search (tPoseLib_PreviewData *pld, unsigned s
}
/* handle events for poselib_preview_poses */
-static int poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *event)
+static int poselib_preview_handle_event (bContext *UNUSED(C), wmOperator *op, wmEvent *event)
{
tPoseLib_PreviewData *pld= op->customdata;
int ret = OPERATOR_RUNNING_MODAL;
+ /* only accept 'press' event, and ignore 'release', so that we don't get double actions */
+ if (ELEM(event->val, KM_PRESS, KM_NOTHING) == 0) {
+ //printf("PoseLib: skipping event with type '%s' and val %d\n", WM_key_event_string(event->type), event->val);
+ return ret;
+ }
+
/* backup stuff that needs to occur before every operation
* - make a copy of searchstr, so that we know if cache needs to be rebuilt
*/
@@ -1077,18 +1070,16 @@ static int poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *e
*/
case PAD0: case PAD1: case PAD2: case PAD3: case PAD4:
case PAD5: case PAD6: case PAD7: case PAD8: case PAD9:
- case PADPLUSKEY: case PADMINUS: case MIDDLEMOUSE:
+ case PADPLUSKEY: case PADMINUS:
+ case MIDDLEMOUSE: case MOUSEMOVE:
//pld->redraw= PL_PREVIEW_REDRAWHEADER;
- ret |= OPERATOR_PASS_THROUGH;
+ ret = OPERATOR_PASS_THROUGH;
break;
/* quicky compare to original */
case TABKEY:
- /* only respond to one event */
- if (event->val == 0) {
- pld->flag &= ~PL_PREVIEW_SHOWORIGINAL;
- pld->redraw= PL_PREVIEW_REDRAWALL;
- }
+ pld->flag &= ~PL_PREVIEW_SHOWORIGINAL;
+ pld->redraw= PL_PREVIEW_REDRAWALL;
break;
}
@@ -1115,11 +1106,8 @@ static int poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *e
/* toggle between original pose and poselib pose*/
case TABKEY:
- /* only respond to one event */
- if (event->val == 0) {
- pld->flag |= PL_PREVIEW_SHOWORIGINAL;
- pld->redraw= PL_PREVIEW_REDRAWALL;
- }
+ pld->flag |= PL_PREVIEW_SHOWORIGINAL;
+ pld->redraw= PL_PREVIEW_REDRAWALL;
break;
/* change to previous pose (cyclic) */
@@ -1212,9 +1200,9 @@ static int poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *e
/* we add pass through here, so that the operators responsible for these can still run,
* even though we still maintain control (as RUNNING_MODAL flag is still set too)
*/
- case MIDDLEMOUSE:
+ case MIDDLEMOUSE: case MOUSEMOVE:
//pld->redraw= PL_PREVIEW_REDRAWHEADER;
- ret |= OPERATOR_PASS_THROUGH;
+ ret = OPERATOR_PASS_THROUGH;
break;
/* view manipulation, or searching */
@@ -1228,7 +1216,7 @@ static int poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *e
else {
/* view manipulation (see above) */
//pld->redraw= PL_PREVIEW_REDRAWHEADER;
- ret |= OPERATOR_PASS_THROUGH;
+ ret = OPERATOR_PASS_THROUGH;
}
break;
@@ -1247,7 +1235,7 @@ static int poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *e
static void poselib_preview_init_data (bContext *C, wmOperator *op)
{
tPoseLib_PreviewData *pld;
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
int pose_index = RNA_int_get(op->ptr, "pose_index");
/* set up preview state info */
@@ -1343,7 +1331,7 @@ static void poselib_preview_cleanup (bContext *C, wmOperator *op)
* - note: code copied from transform_generics.c -> recalcData()
*/
if ((arm->flag & ARM_DELAYDEFORM)==0)
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
else
where_is_pose(scene, ob);
@@ -1357,7 +1345,7 @@ static void poselib_preview_cleanup (bContext *C, wmOperator *op)
action_set_activemarker(act, marker, 0);
/* Update event for pose and deformation children */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* updates */
if (IS_AUTOKEY_MODE(scene, NORMAL)) {
@@ -1421,7 +1409,7 @@ static int poselib_preview_modal (bContext *C, wmOperator *op, wmEvent *event)
}
/* Modal Operator init */
-static int poselib_preview_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int poselib_preview_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
tPoseLib_PreviewData *pld;
diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c
index b8c945f0d77..6115f322d08 100644
--- a/source/blender/editors/armature/poseobject.c
+++ b/source/blender/editors/armature/poseobject.c
@@ -36,6 +36,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -71,11 +72,43 @@
#include "armature_intern.h"
/* ************* XXX *************** */
-static int pupmenu(const char *dummy) {return 0;}
-static void error(const char *dummy) {};
-static void BIF_undo_push(const char *dummy) {}
+static int pupmenu(const char *UNUSED(dummy)) {return 0;}
+static void error(const char *UNUSED(dummy)) {}
+static void BIF_undo_push(const char *UNUSED(dummy)) {}
/* ************* XXX *************** */
+
+static int object_pose_context(Object *ob)
+{
+ if( (ob) &&
+ (ob->type == OB_ARMATURE) &&
+ (ob->pose) &&
+ (ob->mode & OB_MODE_POSE)
+ ) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+}
+
+Object *ED_object_pose_armature(Object *ob)
+{
+ if(ob==NULL)
+ return NULL;
+
+ if(object_pose_context(ob))
+ return ob;
+
+ ob= modifiers_isDeformedByArmature(ob);
+
+ if(object_pose_context(ob))
+ return ob;
+
+ return NULL;
+}
+
+
/* This function is used to indicate that a bone is selected and needs keyframes inserted */
void set_pose_keys (Object *ob)
{
@@ -96,14 +129,15 @@ void set_pose_keys (Object *ob)
/* This function is used to process the necessary updates for */
void ED_armature_enter_posemode(bContext *C, Base *base)
{
+ ReportList *reports= CTX_wm_reports(C);
Object *ob= base->object;
- if (ob->id.lib){
- error ("Can't pose libdata");
+ if (ob->id.lib) {
+ BKE_report(reports, RPT_WARNING, "Can't pose libdata");
return;
}
- switch (ob->type){
+ switch (ob->type) {
case OB_ARMATURE:
ob->restore_mode = ob->mode;
ob->mode |= OB_MODE_POSE;
@@ -114,7 +148,8 @@ void ED_armature_enter_posemode(bContext *C, Base *base)
default:
return;
}
-
+
+ // XXX: disabled as this would otherwise cause a nasty loop...
//ED_object_toggle_modes(C, ob->mode);
}
@@ -132,7 +167,7 @@ void ED_armature_exit_posemode(bContext *C, Base *base)
/* if a selected or active bone is protected, throw error (oonly if warn==1) and return 1 */
/* only_selected==1 : the active bone is allowed to be protected */
-static short pose_has_protected_selected(Object *ob, short only_selected, short warn)
+static short pose_has_protected_selected(Object *ob, short warn)
{
/* check protection */
if (ob->proxy) {
@@ -142,8 +177,7 @@ static short pose_has_protected_selected(Object *ob, short only_selected, short
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
if (pchan->bone && (pchan->bone->layer & arm->layer)) {
if (pchan->bone->layer & arm->layer_protected) {
- if (only_selected && (pchan->bone == arm->act_bone));
- else if (pchan->bone->flag & BONE_SELECTED || pchan->bone == arm->act_bone)
+ if (pchan->bone->flag & BONE_SELECTED)
break;
}
}
@@ -194,7 +228,7 @@ int ED_pose_channel_in_IK_chain(Object *ob, bPoseChannel *pchan)
*
* To be called from various tools that do incremental updates
*/
-void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob)
+void ED_pose_recalculate_paths(Scene *scene, Object *ob)
{
ListBase targets = {NULL, NULL};
@@ -210,7 +244,7 @@ void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob)
/* For the object with pose/action: create path curves for selected bones
* This recalculates the WHOLE path within the pchan->pathsf and pchan->pathef range
*/
-static int pose_calculate_paths_exec (bContext *C, wmOperator *op)
+static int pose_calculate_paths_exec (bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
Scene *scene= CTX_data_scene(C);
@@ -220,7 +254,7 @@ static int pose_calculate_paths_exec (bContext *C, wmOperator *op)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
if (ELEM(NULL, ob, ob->pose))
return OPERATOR_CANCELLED;
@@ -235,7 +269,7 @@ static int pose_calculate_paths_exec (bContext *C, wmOperator *op)
/* calculate the bones that now have motionpaths... */
// TODO: only make for the selected bones?
- ED_pose_recalculate_paths(C, scene, ob);
+ ED_pose_recalculate_paths(scene, ob);
/* notifiers for updates */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -287,7 +321,7 @@ void ED_pose_clear_paths(Object *ob)
}
/* operator callback for this */
-static int pose_clear_paths_exec (bContext *C, wmOperator *op)
+static int pose_clear_paths_exec (bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
Object *ob;
@@ -296,7 +330,7 @@ static int pose_clear_paths_exec (bContext *C, wmOperator *op)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only continue if there's an object */
if ELEM(NULL, ob, ob->pose)
@@ -328,16 +362,15 @@ void POSE_OT_paths_clear (wmOperatorType *ot)
/* ******************* Select Constraint Target Operator ************* */
-static int pose_select_constraint_target_exec(bContext *C, wmOperator *op)
+static int pose_select_constraint_target_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_active_object(C);
- bArmature *arm= ob->data;
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bConstraint *con;
int found= 0;
CTX_DATA_BEGIN(C, bPoseChannel *, pchan, visible_pose_bones)
{
- if ((pchan->bone->flag & BONE_SELECTED) || (pchan->bone == arm->act_bone)) {
+ if (pchan->bone->flag & BONE_SELECTED) {
for (con= pchan->constraints.first; con; con= con->next) {
bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
ListBase targets = {NULL, NULL};
@@ -377,6 +410,7 @@ void POSE_OT_select_constraint_target(wmOperatorType *ot)
/* identifiers */
ot->name= "Select Constraint Target";
ot->idname= "POSE_OT_select_constraint_target";
+ ot->description= "Select bones used as targets for the currently selected bones";
/* api callbacks */
ot->exec= pose_select_constraint_target_exec;
@@ -390,7 +424,7 @@ void POSE_OT_select_constraint_target(wmOperatorType *ot)
static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm= ob->data;
Bone *curbone, *pabone, *chbone;
int direction = RNA_enum_get(op->ptr, "direction");
@@ -407,7 +441,7 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
if (pchan->parent == NULL) continue;
else pabone= pchan->parent->bone;
- if ((arm->layer & pabone->layer) && !(pabone->flag & BONE_HIDDEN_P)) {
+ if (PBONE_VISIBLE(arm, pabone)) {
if (!add_to_sel) curbone->flag &= ~BONE_SELECTED;
pabone->flag |= BONE_SELECTED;
arm->act_bone= pabone;
@@ -420,7 +454,7 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
if (pchan->child == NULL) continue;
else chbone = pchan->child->bone;
- if ((arm->layer & chbone->layer) && !(chbone->flag & BONE_HIDDEN_P)) {
+ if (PBONE_VISIBLE(arm, chbone)) {
if (!add_to_sel) curbone->flag &= ~BONE_SELECTED;
chbone->flag |= BONE_SELECTED;
arm->act_bone= chbone;
@@ -445,14 +479,15 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
void POSE_OT_select_hierarchy(wmOperatorType *ot)
{
static EnumPropertyItem direction_items[]= {
- {BONE_SELECT_PARENT, "PARENT", 0, "Select Parent", ""},
- {BONE_SELECT_CHILD, "CHILD", 0, "Select Child", ""},
- {0, NULL, 0, NULL, NULL}
+ {BONE_SELECT_PARENT, "PARENT", 0, "Select Parent", ""},
+ {BONE_SELECT_CHILD, "CHILD", 0, "Select Child", ""},
+ {0, NULL, 0, NULL, NULL}
};
/* identifiers */
ot->name= "Select Hierarchy";
ot->idname= "POSE_OT_select_hierarchy";
+ ot->description= "Select immediate parent/children of selected bones";
/* api callbacks */
ot->exec= pose_select_hierarchy_exec;
@@ -495,7 +530,7 @@ static short pose_select_same_group (bContext *C, Object *ob, short extend)
CTX_DATA_BEGIN(C, bPoseChannel *, pchan, visible_pose_bones)
{
/* keep track of group as group to use later? */
- if ((pchan->bone->flag & BONE_SELECTED) || (pchan->bone == arm->act_bone)) {
+ if (pchan->bone->flag & BONE_SELECTED) {
group_flags[pchan->agrp_index] = 1;
tagged= 1;
}
@@ -542,7 +577,7 @@ static short pose_select_same_layer (bContext *C, Object *ob, short extend)
CTX_DATA_BEGIN(C, bPoseChannel *, pchan, visible_pose_bones)
{
/* keep track of layers to use later? */
- if ((pchan->bone->flag & BONE_SELECTED) || (pchan->bone == arm->act_bone))
+ if (pchan->bone->flag & BONE_SELECTED)
layers |= pchan->bone->layer;
/* deselect all bones before selecting new ones? */
@@ -570,7 +605,7 @@ static short pose_select_same_layer (bContext *C, Object *ob, short extend)
static int pose_select_grouped_exec (bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
short extend= RNA_boolean_get(op->ptr, "extend");
short changed = 0;
@@ -610,7 +645,7 @@ void POSE_OT_select_grouped (wmOperatorType *ot)
/* identifiers */
ot->name= "Select Grouped";
- ot->description = "Select all visible bones grouped by various properties";
+ ot->description = "Select all visible bones grouped by similar properties";
ot->idname= "POSE_OT_select_grouped";
/* api callbacks */
@@ -632,7 +667,7 @@ void pose_copy_menu(Scene *scene)
{
Object *obedit= scene->obedit; // XXX context
Object *ob= OBACT;
- bArmature *arm= ob->data;
+ bArmature *arm;
bPoseChannel *pchan, *pchanact;
short nr=0;
int i=0;
@@ -645,11 +680,12 @@ void pose_copy_menu(Scene *scene)
if (pchan==NULL) return;
pchanact= pchan;
-
+ arm= ob->data;
+
/* if proxy-protected bones selected, some things (such as locks + displays) shouldn't be changable,
* but for constraints (just add local constraints)
*/
- if (pose_has_protected_selected(ob, 1, 0)) {
+ if (pose_has_protected_selected(ob, 0)) {
i= BLI_countlist(&(pchanact->constraints)); /* if there are 24 or less, allow for the user to select constraints */
if (i < 25)
nr= pupmenu("Copy Pose Attributes %t|Local Location%x1|Local Rotation%x2|Local Size%x3|%l|Visual Location %x9|Visual Rotation%x10|Visual Size%x11|%l|Constraints (All)%x4|Constraints...%x5");
@@ -699,7 +735,7 @@ void pose_copy_menu(Scene *scene)
for (con= tmp_constraints.first; con; con= con->next)
con->flag |= CONSTRAINT_PROXY_LOCAL;
}
- addlisttolist(&pchan->constraints, &tmp_constraints);
+ BLI_movelisttolist(&pchan->constraints, &tmp_constraints);
/* update flags (need to add here, not just copy) */
pchan->constflag |= pchanact->constflag;
@@ -761,7 +797,7 @@ void pose_copy_menu(Scene *scene)
}
else { /* constraints, optional (note: max we can have is 24 constraints) */
bConstraint *con, *con_back;
- int const_toggle[24];
+ int const_toggle[24]= {0}; /* XXX, initialize as 0 to quiet errors */
ListBase const_copy = {NULL, NULL};
BLI_duplicatelist(&const_copy, &(pchanact->constraints));
@@ -801,14 +837,12 @@ void pose_copy_menu(Scene *scene)
* appending to list of constraints for this channel
*/
copy_constraints(&tmp_constraints, &const_copy, TRUE);
- if ((ob->proxy) && (pchan->bone->layer & arm->layer_protected)) {
- bConstraint *con;
-
+ if ((ob->proxy) && (pchan->bone->layer & arm->layer_protected)) {
/* add proxy-local tags */
for (con= tmp_constraints.first; con; con= con->next)
con->flag |= CONSTRAINT_PROXY_LOCAL;
}
- addlisttolist(&pchan->constraints, &tmp_constraints);
+ BLI_movelisttolist(&pchan->constraints, &tmp_constraints);
/* update flags (need to add here, not just copy) */
pchan->constflag |= pchanact->constflag;
@@ -821,7 +855,7 @@ void pose_copy_menu(Scene *scene)
ob->pose->flag |= POSE_RECALC;
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA); // and all its relations
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA); // and all its relations
BIF_undo_push("Copy Pose Attributes");
@@ -856,7 +890,7 @@ void free_posebuf(void)
static int pose_copy_exec (bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
/* sanity checking */
if ELEM(NULL, ob, ob->pose) {
@@ -895,9 +929,10 @@ void POSE_OT_copy (wmOperatorType *ot)
static int pose_paste_exec (bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bPoseChannel *chan, *pchan;
int flip= RNA_boolean_get(op->ptr, "flipped");
+ int selOnly= RNA_boolean_get(op->ptr, "selected_mask");
/* sanity checks */
if ELEM(NULL, ob, ob->pose)
@@ -911,17 +946,28 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
/* Safely merge all of the channels in the buffer pose into any existing pose */
for (chan= g_posebuf->chanbase.first; chan; chan=chan->next) {
if (chan->flag & POSE_KEY) {
- /* get the name - if flipping, we must flip this first */
char name[32];
+ short paste_ok;
+
+ /* get the name - if flipping, we must flip this first */
if (flip)
flip_side_name(name, chan->name, 0); /* 0 = don't strip off number extensions */
else
BLI_strncpy(name, chan->name, sizeof(name));
-
- /* only copy when channel exists, poses are not meant to add random channels to anymore */
+
+ /* only copy when:
+ * 1) channel exists - poses are not meant to add random channels to anymore
+ * 2) if selection-masking is on, channel is selected - only selected bones get pasted on, allowing making both sides symmetrical
+ */
pchan= get_pose_channel(ob->pose, name);
- if (pchan) {
+ if (selOnly)
+ paste_ok= ((pchan) && (pchan->bone->flag & BONE_SELECTED));
+ else
+ paste_ok= ((pchan != NULL));
+
+ /* continue? */
+ if (paste_ok) {
/* only loc rot size
* - only copies transform info for the pose
*/
@@ -985,6 +1031,7 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
else {
float eul[3];
+ normalize_qt(pchan->quat);
quat_to_eul(eul, pchan->quat);
eul[1]*= -1;
eul[2]*= -1;
@@ -1012,16 +1059,9 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
/* keyframing tagging */
if (autokeyframe_cfra_can_key(scene, &ob->id)) {
ListBase dsources = {NULL, NULL};
- KeyingSet *ks = NULL;
- /* get KeyingSet to use
- * - use the active KeyingSet if defined (and user wants to use it for all autokeying),
- * or otherwise key transforms only
- */
- if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (scene->active_keyingset))
- ks = ANIM_scene_get_active_keyingset(scene);
- else
- ks = ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
+ /* get KeyingSet to use */
+ KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, "LocRotScale");
/* now insert the keyframe(s) using the Keying Set
* 1) add datasource override for the PoseChannel
@@ -1046,7 +1086,7 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
}
/* Update event for pose and deformation children */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* notifiers for updates */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -1069,13 +1109,14 @@ void POSE_OT_paste (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_boolean(ot->srna, "flipped", 0, "Flipped on X-Axis", "");
+ RNA_def_boolean(ot->srna, "flipped", 0, "Flipped on X-Axis", "Paste the stored pose flipped on to current pose");
+ RNA_def_boolean(ot->srna, "selected_mask", 0, "On Selected Only", "Only paste the stored post on to selected bones in the current pose");
}
/* ********************************************** */
-static int pose_group_add_exec (bContext *C, wmOperator *op)
+static int pose_group_add_exec (bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
Object *ob;
@@ -1084,7 +1125,7 @@ static int pose_group_add_exec (bContext *C, wmOperator *op)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only continue if there's an object */
if (ob == NULL)
@@ -1115,7 +1156,7 @@ void POSE_OT_group_add (wmOperatorType *ot)
}
-static int pose_group_remove_exec (bContext *C, wmOperator *op)
+static int pose_group_remove_exec (bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
Object *ob;
@@ -1124,7 +1165,7 @@ static int pose_group_remove_exec (bContext *C, wmOperator *op)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only continue if there's an object */
if (ob == NULL)
@@ -1157,7 +1198,7 @@ void POSE_OT_group_remove (wmOperatorType *ot)
/* ------------ */
/* invoke callback which presents a list of bone-groups for the user to choose from */
-static int pose_groups_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+static int pose_groups_menu_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(evt))
{
ScrArea *sa= CTX_wm_area(C);
Object *ob;
@@ -1172,7 +1213,7 @@ static int pose_groups_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only continue if there's an object, and a pose there too */
if (ELEM(NULL, ob, ob->pose))
@@ -1182,20 +1223,20 @@ static int pose_groups_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
/* if there's no active group (or active is invalid), create a new menu to find it */
if (pose->active_group <= 0) {
/* create a new menu, and start populating it with group names */
- pup= uiPupMenuBegin(C, op->type->name, 0);
+ pup= uiPupMenuBegin(C, op->type->name, ICON_NULL);
layout= uiPupMenuLayout(pup);
/* special entry - allow to create new group, then use that
* (not to be used for removing though)
*/
if (strstr(op->idname, "assign")) {
- uiItemIntO(layout, "New Group", 0, op->idname, "type", 0);
+ uiItemIntO(layout, "New Group", ICON_NULL, op->idname, "type", 0);
uiItemS(layout);
}
/* add entries for each group */
for (grp= pose->agroups.first, i=1; grp; grp=grp->next, i++)
- uiItemIntO(layout, grp->name, 0, op->idname, "type", i);
+ uiItemIntO(layout, grp->name, ICON_NULL, op->idname, "type", i);
/* finish building the menu, and process it (should result in calling self again) */
uiPupMenuEnd(C, pup);
@@ -1214,7 +1255,6 @@ static int pose_group_assign_exec (bContext *C, wmOperator *op)
{
ScrArea *sa= CTX_wm_area(C);
Object *ob;
- bArmature *arm;
bPose *pose;
short done= 0;
@@ -1222,12 +1262,12 @@ static int pose_group_assign_exec (bContext *C, wmOperator *op)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only continue if there's an object, and a pose there too */
if (ELEM(NULL, ob, ob->pose))
return OPERATOR_CANCELLED;
- arm= ob->data;
+
pose= ob->pose;
/* set the active group number to the one from operator props
@@ -1275,25 +1315,21 @@ void POSE_OT_group_assign (wmOperatorType *ot)
}
-static int pose_group_unassign_exec (bContext *C, wmOperator *op)
+static int pose_group_unassign_exec (bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
Object *ob;
- bArmature *arm;
- bPose *pose;
short done= 0;
/* since this call may also be used from the buttons window, we need to check for where to get the object */
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only continue if there's an object, and a pose there too */
if (ELEM(NULL, ob, ob->pose))
return OPERATOR_CANCELLED;
- pose= ob->pose;
- arm= ob->data;
/* find selected bones to remove from all bone groups */
CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones)
@@ -1350,7 +1386,7 @@ static void pose_group_select(bContext *C, Object *ob, int select)
CTX_DATA_END;
}
-static int pose_group_select_exec (bContext *C, wmOperator *op)
+static int pose_group_select_exec (bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
Object *ob;
@@ -1359,7 +1395,7 @@ static int pose_group_select_exec (bContext *C, wmOperator *op)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only continue if there's an object, and a pose there too */
if (ELEM(NULL, ob, ob->pose))
@@ -1388,7 +1424,7 @@ void POSE_OT_group_select (wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int pose_group_deselect_exec (bContext *C, wmOperator *op)
+static int pose_group_deselect_exec (bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
Object *ob;
@@ -1397,7 +1433,7 @@ static int pose_group_deselect_exec (bContext *C, wmOperator *op)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only continue if there's an object, and a pose there too */
if (ELEM(NULL, ob, ob->pose))
@@ -1428,9 +1464,9 @@ void POSE_OT_group_deselect (wmOperatorType *ot)
/* ********************************************** */
-static int pose_flip_names_exec (bContext *C, wmOperator *op)
+static int pose_flip_names_exec (bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm;
/* paranoia checks */
@@ -1448,7 +1484,7 @@ static int pose_flip_names_exec (bContext *C, wmOperator *op)
CTX_DATA_END;
/* since we renamed stuff... */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -1461,7 +1497,7 @@ void POSE_OT_flip_names (wmOperatorType *ot)
/* identifiers */
ot->name= "Flip Names";
ot->idname= "POSE_OT_flip_names";
- ot->description= "Flips (and corrects) the names of selected bones";
+ ot->description= "Flips (and corrects) the axis suffixes of the the names of selected bones";
/* api callbacks */
ot->exec= pose_flip_names_exec;
@@ -1475,7 +1511,7 @@ void POSE_OT_flip_names (wmOperatorType *ot)
static int pose_autoside_names_exec (bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm;
char newname[32];
short axis= RNA_enum_get(op->ptr, "axis");
@@ -1495,7 +1531,7 @@ static int pose_autoside_names_exec (bContext *C, wmOperator *op)
CTX_DATA_END;
/* since we renamed stuff... */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -1534,31 +1570,32 @@ void POSE_OT_autoside_names (wmOperatorType *ot)
void pose_activate_flipped_bone(Scene *scene)
{
Object *ob= OBACT;
- bArmature *arm= ob->data;
-
+
if(ob==NULL) return;
if(ob->mode & OB_MODE_WEIGHT_PAINT) {
ob= modifiers_isDeformedByArmature(ob);
}
+
if(ob && (ob->mode & OB_MODE_POSE)) {
bPoseChannel *pchanf;
-
+ bArmature *arm= ob->data;
+
if(arm->act_bone) {
char name[32];
flip_side_name(name, arm->act_bone->name, TRUE);
-
+
pchanf= get_pose_channel(ob->pose, name);
if(pchanf && pchanf->bone != arm->act_bone) {
arm->act_bone->flag &= ~BONE_SELECTED;
pchanf->bone->flag |= BONE_SELECTED;
-
+
arm->act_bone= pchanf->bone;
-
+
/* in weightpaint we select the associated vertex group too */
if(ob->mode & OB_MODE_WEIGHT_PAINT) {
ED_vgroup_select_by_name(OBACT, name);
- DAG_id_flush_update(&OBACT->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&OBACT->id, OB_RECALC_DATA);
}
// XXX notifiers need to be sent to other editors to update
@@ -1571,10 +1608,68 @@ void pose_activate_flipped_bone(Scene *scene)
/* ********************************************** */
+/* Show all armature layers */
+static int pose_armature_layers_showall_poll (bContext *C)
+{
+ /* this single operator can be used in posemode OR editmode for armatures */
+ return ED_operator_posemode(C) || ED_operator_editarmature(C);
+}
+
+static int pose_armature_layers_showall_exec (bContext *C, wmOperator *op)
+{
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ bArmature *arm = (ob)? ob->data : NULL;
+ PointerRNA ptr;
+ int maxLayers = (RNA_boolean_get(op->ptr, "all"))? 32 : 16;
+ int layers[32] = {0}; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
+ int i;
+
+ /* sanity checking */
+ if (arm == NULL)
+ return OPERATOR_CANCELLED;
+
+ /* use RNA to set the layers
+ * although it would be faster to just set directly using bitflags, we still
+ * need to setup a RNA pointer so that we get the "update" callbacks for free...
+ */
+ RNA_id_pointer_create(&arm->id, &ptr);
+
+ for (i = 0; i < maxLayers; i++)
+ layers[i] = 1;
+
+ RNA_boolean_set_array(&ptr, "layers", layers);
+
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void ARMATURE_OT_layers_show_all (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Show All Layers";
+ ot->idname= "ARMATURE_OT_layers_show_all";
+ ot->description= "Make all armature layers visible";
+
+ /* callbacks */
+ ot->exec= pose_armature_layers_showall_exec;
+ ot->poll= pose_armature_layers_showall_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ ot->prop = RNA_def_boolean(ot->srna, "all", 1, "All Layers", "Enable all layers or just the first 16 (top row)");
+}
+
+/* ------------------- */
+
/* Present a popup to get the layers that should be used */
static int pose_armature_layers_invoke (bContext *C, wmOperator *op, wmEvent *evt)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm= (ob)? ob->data : NULL;
PointerRNA ptr;
int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
@@ -1595,7 +1690,7 @@ static int pose_armature_layers_invoke (bContext *C, wmOperator *op, wmEvent *ev
/* Set the visible layers for the active armature (edit and pose modes) */
static int pose_armature_layers_exec (bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm= (ob)? ob->data : NULL;
PointerRNA ptr;
int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
@@ -1657,11 +1752,9 @@ void ARMATURE_OT_armature_layers (wmOperatorType *ot)
/* Present a popup to get the layers that should be used */
static int pose_bone_layers_invoke (bContext *C, wmOperator *op, wmEvent *evt)
{
- int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
-
- /* get layers that are active already */
- memset(&layers, 0, sizeof(layers)); /* set all layers to be off by default */
+ int layers[32]= {0}; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
+ /* get layers that are active already */
CTX_DATA_BEGIN(C, bPoseChannel *, pchan, selected_pose_bones)
{
short bit;
@@ -1684,7 +1777,7 @@ static int pose_bone_layers_invoke (bContext *C, wmOperator *op, wmEvent *evt)
/* Set the visible layers for the active armature (edit and pose modes) */
static int pose_bone_layers_exec (bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm= (ob)? ob->data : NULL;
PointerRNA ptr;
int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
@@ -1731,11 +1824,9 @@ void POSE_OT_bone_layers (wmOperatorType *ot)
/* Present a popup to get the layers that should be used */
static int armature_bone_layers_invoke (bContext *C, wmOperator *op, wmEvent *evt)
{
- int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
+ int layers[32]= {0}; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
/* get layers that are active already */
- memset(&layers, 0, sizeof(layers)); /* set all layers to be off by default */
-
CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones)
{
short bit;
@@ -1802,10 +1893,10 @@ void ARMATURE_OT_bone_layers (wmOperatorType *ot)
/* ********************************************** */
-static int pose_flip_quats_exec (bContext *C, wmOperator *op)
+static int pose_flip_quats_exec (bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
KeyingSet *ks = ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
/* loop through all selected pchans, flipping and keying (as needed) */
@@ -1814,11 +1905,8 @@ static int pose_flip_quats_exec (bContext *C, wmOperator *op)
/* only if bone is using quaternion rotation */
if (pchan->rotmode == ROT_MODE_QUAT) {
/* quaternions have 720 degree range */
- pchan->quat[0]= -pchan->quat[0];
- pchan->quat[1]= -pchan->quat[1];
- pchan->quat[2]= -pchan->quat[2];
- pchan->quat[3]= -pchan->quat[3];
-
+ negate_v4(pchan->quat);
+
/* tagging */
if (autokeyframe_cfra_can_key(scene, &ob->id)) {
ListBase dsources = {NULL, NULL};
@@ -1846,7 +1934,7 @@ static int pose_flip_quats_exec (bContext *C, wmOperator *op)
CTX_DATA_END;
/* notifiers and updates */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
return OPERATOR_FINISHED;
@@ -1870,9 +1958,9 @@ void POSE_OT_quaternions_flip (wmOperatorType *ot)
/* ********************************************** */
/* context: active channel */
+#if 0
void pose_special_editmenu(Scene *scene)
{
-#if 0
Object *obedit= scene->obedit; // XXX context
Object *ob= OBACT;
short nr;
@@ -1895,7 +1983,7 @@ void pose_special_editmenu(Scene *scene)
pose_clear_paths(ob);
}
else if(nr==5) {
- pose_clear_user_transforms(scene, ob);
+ pose_clear_user_transforms(ob);
}
else if(nr==6) {
pose_relax();
@@ -1903,11 +1991,11 @@ void pose_special_editmenu(Scene *scene)
else if(ELEM3(nr, 7, 8, 9)) {
pose_autoside_names(nr-7);
}
-#endif
}
+
/* Restore selected pose-bones to 'action'-defined pose */
-void pose_clear_user_transforms(Scene *scene, Object *ob)
+static void pose_clear_user_transforms(Object *ob)
{
bArmature *arm= ob->data;
bPoseChannel *pchan;
@@ -1935,7 +2023,8 @@ void pose_clear_user_transforms(Scene *scene, Object *ob)
rest_pose(ob->pose);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
BIF_undo_push("Clear User Transform");
}
+#endif
diff --git a/source/blender/editors/armature/reeb.c b/source/blender/editors/armature/reeb.c
index 9602d80575a..29ba72ce604 100644
--- a/source/blender/editors/armature/reeb.c
+++ b/source/blender/editors/armature/reeb.c
@@ -40,6 +40,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_editVert.h"
#include "BLI_edgehash.h"
#include "BLI_ghash.h"
@@ -442,7 +443,7 @@ void flipArc(ReebArc *arc)
}
#ifdef DEBUG_REEB_NODE
-void NodeDegreeDecrement(ReebGraph *rg, ReebNode *node)
+void NodeDegreeDecrement(ReebGraph *UNUSED(rg), ReebNode *node)
{
node->degree--;
@@ -452,7 +453,7 @@ void NodeDegreeDecrement(ReebGraph *rg, ReebNode *node)
// }
}
-void NodeDegreeIncrement(ReebGraph *rg, ReebNode *node)
+void NodeDegreeIncrement(ReebGraph *UNUSED(rg), ReebNode *node)
{
// if (node->degree == 0)
// {
@@ -523,7 +524,7 @@ void verifyNodeDegree(ReebGraph *rg)
#endif
}
-void verifyBucketsArc(ReebGraph *rg, ReebArc *arc)
+void verifyBucketsArc(ReebGraph *UNUSED(rg), ReebArc *arc)
{
ReebNode *head = (ReebNode*)arc->head;
ReebNode *tail = (ReebNode*)arc->tail;
@@ -603,7 +604,7 @@ void verifyMultiResolutionLinks(ReebGraph *rg, int level)
{
if (BLI_findindex(&lower_rg->arcs, arc->link_up) == -1)
{
- printf("missing arc %p for level %i\n", arc->link_up, level);
+ printf("missing arc %p for level %i\n", (void *)arc->link_up, level);
printf("Source arc was ---\n");
printArc(arc);
@@ -1692,7 +1693,7 @@ int filterInternalExternalReebGraph(ReebGraph *rg, float threshold_internal, flo
return value;
}
-int filterCyclesReebGraph(ReebGraph *rg, float distance_threshold)
+int filterCyclesReebGraph(ReebGraph *rg, float UNUSED(distance_threshold))
{
ReebArc *arc1, *arc2;
ReebArc *next2;
@@ -1723,7 +1724,7 @@ int filterCyclesReebGraph(ReebGraph *rg, float distance_threshold)
return filtered;
}
-int filterSmartReebGraph(ReebGraph *rg, float threshold)
+int filterSmartReebGraph(ReebGraph *UNUSED(rg), float UNUSED(threshold))
{
int value = 0;
#if 0 //XXX
@@ -2018,7 +2019,7 @@ void spreadWeight(EditMesh *em)
/******************************************** EXPORT ***************************************************/
-void exportNode(FILE *f, char *text, ReebNode *node)
+void exportNode(FILE *f, const char *text, ReebNode *node)
{
fprintf(f, "%s i:%i w:%f d:%i %f %f %f\n", text, node->index, node->weight, node->degree, node->p[0], node->p[1], node->p[2]);
}
@@ -2180,7 +2181,7 @@ void addFacetoArc(ReebArc *arc, EditFace *efa)
BLI_ghash_insert(arc->faces, efa, efa);
}
-void mergeArcFaces(ReebGraph *rg, ReebArc *aDst, ReebArc *aSrc)
+void mergeArcFaces(ReebGraph *UNUSED(rg), ReebArc *aDst, ReebArc *aSrc)
{
GHashIterator ghi;
@@ -2204,7 +2205,7 @@ void mergeArcEdges(ReebGraph *rg, ReebArc *aDst, ReebArc *aSrc, MergeDirection d
e->arc = aDst; // Edge is stolen by new arc
}
- addlisttolist(&aDst->edges , &aSrc->edges);
+ BLI_movelisttolist(&aDst->edges , &aSrc->edges);
}
else
{
@@ -2557,10 +2558,10 @@ ReebGraph * generateReebGraph(EditMesh *em, int subdivisions)
EditVert *eve;
EditFace *efa;
int index;
- int totvert;
- int totfaces;
+ /*int totvert;*/
#ifdef DEBUG_REEB
+ int totfaces;
int countfaces = 0;
#endif
@@ -2568,8 +2569,10 @@ ReebGraph * generateReebGraph(EditMesh *em, int subdivisions)
rg->resolution = subdivisions;
- totvert = BLI_countlist(&em->verts);
+ /*totvert = BLI_countlist(&em->verts);*/ /*UNUSED*/
+#ifdef DEBUG_REEB
totfaces = BLI_countlist(&em->faces);
+#endif
renormalizeWeight(em, 1.0f);
@@ -2640,7 +2643,7 @@ void renormalizeWeight(EditMesh *em, float newmax)
eve = em->verts.first;
minimum = weightData(eve);
maximum = minimum;
- for(eve = em->verts.first; eve; eve = eve->next)
+ for(; eve; eve = eve->next)
{
maximum = MAX2(maximum, weightData(eve));
minimum = MIN2(minimum, weightData(eve));
diff --git a/source/blender/editors/armature/reeb.h b/source/blender/editors/armature/reeb.h
index 3bebc423235..39f83407d74 100644
--- a/source/blender/editors/armature/reeb.h
+++ b/source/blender/editors/armature/reeb.h
@@ -149,7 +149,7 @@ void angleToVCol(struct EditMesh *em, int index);
void renormalizeWeight(struct EditMesh *em, float newmax);
ReebGraph * generateReebGraph(struct EditMesh *me, int subdivisions);
-ReebGraph * newReebGraph();
+ReebGraph * newReebGraph(void);
void initArcIterator(BArcIterator *iter, struct ReebArc *arc, struct ReebNode *head);
void initArcIterator2(BArcIterator *iter, struct ReebArc *arc, int start, int end);
@@ -195,7 +195,7 @@ ReebGraph *BIF_graphForMultiNode(ReebGraph *rg, ReebNode *node);
void REEB_freeGraph(ReebGraph *rg);
void REEB_freeArc(BArc *barc);
void REEB_exportGraph(ReebGraph *rg, int count);
-void REEB_draw();
+void REEB_draw(void);
#endif /*REEB_H_*/
diff --git a/source/blender/editors/curve/CMakeLists.txt b/source/blender/editors/curve/CMakeLists.txt
index ab45d73a2de..708908eda2b 100644
--- a/source/blender/editors/curve/CMakeLists.txt
+++ b/source/blender/editors/curve/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -31,4 +29,13 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_curve "${SRC}" "${INC}")
+set(SRC
+ curve_ops.c
+ editcurve.c
+ editfont.c
+ lorem.c
+
+ curve_intern.h
+)
+
+blender_add_lib(bf_editor_curve "${SRC}" "${INC}")
diff --git a/source/blender/editors/curve/Makefile b/source/blender/editors/curve/Makefile
deleted file mode 100644
index d9c51c7420e..00000000000
--- a/source/blender/editors/curve/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_curve
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h
index 2567494ddf3..0867556b7f4 100644
--- a/source/blender/editors/curve/curve_intern.h
+++ b/source/blender/editors/curve/curve_intern.h
@@ -33,7 +33,7 @@
struct wmOperatorType;
/* lorem.c */
-extern char *ED_lorem;
+extern const char ED_lorem[];
/* editfont.c */
enum { DEL_ALL, DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_SELECTION, DEL_NEXT_SEL, DEL_PREV_SEL };
@@ -106,6 +106,7 @@ void CURVE_OT_de_select_last(struct wmOperatorType *ot);
void CURVE_OT_select_all(struct wmOperatorType *ot);
void CURVE_OT_select_inverse(struct wmOperatorType *ot);
void CURVE_OT_select_linked(struct wmOperatorType *ot);
+void CURVE_OT_select_linked_pick(struct wmOperatorType *ot);
void CURVE_OT_select_row(struct wmOperatorType *ot);
void CURVE_OT_select_next(struct wmOperatorType *ot);
void CURVE_OT_select_previous(struct wmOperatorType *ot);
diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c
index 89c19d93b0f..0ee852a6059 100644
--- a/source/blender/editors/curve/curve_ops.c
+++ b/source/blender/editors/curve/curve_ops.c
@@ -117,6 +117,7 @@ void ED_operatortypes_curve(void)
WM_operatortype_append(CURVE_OT_select_all);
WM_operatortype_append(CURVE_OT_select_inverse);
WM_operatortype_append(CURVE_OT_select_linked);
+ WM_operatortype_append(CURVE_OT_select_linked_pick);
WM_operatortype_append(CURVE_OT_select_row);
WM_operatortype_append(CURVE_OT_select_next);
WM_operatortype_append(CURVE_OT_select_previous);
@@ -188,20 +189,26 @@ void ED_keymap_curve(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "FONT_OT_line_break", RETKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "FONT_OT_text_insert", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); // last!
+ RNA_boolean_set(WM_keymap_add_item(keymap, "FONT_OT_text_insert", BACKSPACEKEY, KM_PRESS, KM_ALT, 0)->ptr, "accent", 1); // accented characters
/* only set in editmode curve, by space_view3d listener */
keymap= WM_keymap_find(keyconf, "Curve", 0, 0);
keymap->poll= ED_operator_editsurfcurve;
- WM_keymap_add_menu(keymap, "INFO_MT_curve_add", AKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_menu(keymap, "INFO_MT_edit_curve_add", AKEY, KM_PRESS, KM_SHIFT, 0);
+
+ WM_keymap_add_item(keymap, "CURVE_OT_handle_type_set", VKEY, KM_PRESS, 0, 0);
+
WM_keymap_add_item(keymap, "CURVE_OT_vertex_add", LEFTMOUSE, KM_CLICK, KM_CTRL, 0);
WM_keymap_add_item(keymap, "CURVE_OT_select_all", AKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "CURVE_OT_select_row", RKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "CURVE_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "CURVE_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "CURVE_OT_select_linked", LKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "CURVE_OT_select_linked", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "deselect", 1);
+ WM_keymap_add_item(keymap, "CURVE_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "CURVE_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "CURVE_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "CURVE_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "deselect", 1);
WM_keymap_add_item(keymap, "CURVE_OT_separate", PKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "CURVE_OT_extrude", EKEY, KM_PRESS, 0, 0);
@@ -213,14 +220,13 @@ void ED_keymap_curve(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "CURVE_OT_tilt_clear", TKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "TRANSFORM_OT_tilt", TKEY, KM_PRESS, KM_CTRL, 0);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", TKEY, KM_PRESS, KM_CTRL, 0)->ptr, "mode", TFM_TILT);
+
RNA_enum_set(WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_ALT, 0)->ptr, "mode", TFM_CURVE_SHRINKFATTEN);
- RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_handle_type_set", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", 1);
- RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_handle_type_set", HKEY, KM_PRESS, 0, 0)->ptr, "type", 3);
- RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_handle_type_set", VKEY, KM_PRESS, 0, 0)->ptr, "type", 2);
WM_keymap_add_item(keymap, "CURVE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_ALT|KM_CTRL, 0);
- RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0)->ptr, "unselected", 1);
+ WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, 0, 0);
+ RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1);
WM_keymap_add_item(keymap, "OBJECT_OT_vertex_parent_set", PKEY, KM_PRESS, KM_CTRL, 0);
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 7b9c6c7cc95..0949e3d6214 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -40,6 +40,7 @@
#include "DNA_key_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_anim_types.h"
#include "MEM_guardedalloc.h"
@@ -47,6 +48,7 @@
#include "BLI_math.h"
#include "BLI_dynstr.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BKE_context.h"
@@ -58,6 +60,8 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_report.h"
+#include "BKE_animsys.h"
+#include "BKE_action.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -81,13 +85,16 @@ typedef struct {
ListBase nubase;
void *lastsel;
GHash *undoIndex;
+ ListBase fcurves, drivers;
} UndoCurve;
/* Definitions needed for shape keys */
typedef struct {
- void *origNode;
- int index;
-} NodeKeyIndex;
+ void *orig_cv;
+ int key_index, nu_index, pt_index;
+ int switched;
+ Nurb *orig_nu;
+} CVKeyIndex;
void selectend_nurb(Object *obedit, short selfirst, short doswap, short selstatus);
static void select_adjacent_cp(ListBase *editnurb, short next, short cont, short selstatus);
@@ -271,17 +278,21 @@ void printknots(Object *obedit)
/* ********************* Shape keys *************** */
-static NodeKeyIndex *init_nodeKeyIndex(void *node, int index)
+static CVKeyIndex *init_cvKeyIndex(void *cv, int key_index, int nu_index, int pt_index, Nurb *orig_nu)
{
- NodeKeyIndex *nodeIndex = MEM_callocN(sizeof(NodeKeyIndex), "init_nodeKeyIndex");
+ CVKeyIndex *cvIndex = MEM_callocN(sizeof(CVKeyIndex), "init_cvKeyIndex");
- nodeIndex->origNode= node;
- nodeIndex->index= index;
+ cvIndex->orig_cv= cv;
+ cvIndex->key_index= key_index;
+ cvIndex->nu_index= nu_index;
+ cvIndex->pt_index= pt_index;
+ cvIndex->switched= 0;
+ cvIndex->orig_nu= orig_nu;
- return nodeIndex;
+ return cvIndex;
}
-static void free_nodeKeyIndex(NodeKeyIndex *pointIndex)
+static void free_cvKeyIndex(CVKeyIndex *pointIndex)
{
MEM_freeN(pointIndex);
}
@@ -293,7 +304,10 @@ static void init_editNurb_keyIndex(EditNurb *editnurb, ListBase *origBase)
GHash *gh;
BezTriple *bezt, *origbezt;
BPoint *bp, *origbp;
- int a, keyindex= 0;
+ CVKeyIndex *keyIndex;
+ int a, key_index= 0, nu_index= 0, pt_index= 0;
+
+ if(editnurb->keyindex) return;
gh= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "editNurb keyIndex");
@@ -302,26 +316,33 @@ static void init_editNurb_keyIndex(EditNurb *editnurb, ListBase *origBase)
a= orignu->pntsu;
bezt= nu->bezt;
origbezt= orignu->bezt;
+ pt_index= 0;
while (a--) {
- BLI_ghash_insert(gh, bezt, init_nodeKeyIndex(origbezt, keyindex));
- keyindex+= 12;
+ keyIndex= init_cvKeyIndex(origbezt, key_index, nu_index, pt_index, orignu);
+ BLI_ghash_insert(gh, bezt, keyIndex);
+ key_index+= 12;
bezt++;
origbezt++;
+ pt_index++;
}
} else {
a= orignu->pntsu * orignu->pntsv;
bp= nu->bp;
origbp= orignu->bp;
+ pt_index= 0;
while (a--) {
- BLI_ghash_insert(gh, bp, init_nodeKeyIndex(origbp, keyindex));
- keyindex+= 4;
+ keyIndex= init_cvKeyIndex(origbp, key_index, nu_index, pt_index, orignu);
+ BLI_ghash_insert(gh, bp, keyIndex);
+ key_index+= 4;
bp++;
origbp++;
+ pt_index++;
}
}
nu= nu->next;
orignu= orignu->next;
+ nu_index++;
}
editnurb->keyindex= gh;
@@ -332,64 +353,65 @@ static void free_editNurb_keyIndex(EditNurb *editnurb)
if (!editnurb->keyindex) {
return;
}
- BLI_ghash_free(editnurb->keyindex, NULL, (GHashValFreeFP)free_nodeKeyIndex);
+ BLI_ghash_free(editnurb->keyindex, NULL, (GHashValFreeFP)free_cvKeyIndex);
+ editnurb->keyindex= NULL;
}
-static NodeKeyIndex *getNodeKeyIndex(EditNurb *editnurb, void *node)
+static CVKeyIndex *getCVKeyIndex(EditNurb *editnurb, void *cv)
{
- return BLI_ghash_lookup(editnurb->keyindex, node);
+ return BLI_ghash_lookup(editnurb->keyindex, cv);
}
-static BezTriple *getKeyIndexOrig_bezt(EditNurb *editnurb, void *node)
+static BezTriple *getKeyIndexOrig_bezt(EditNurb *editnurb, BezTriple *bezt)
{
- NodeKeyIndex *index= getNodeKeyIndex(editnurb, node);
+ CVKeyIndex *index= getCVKeyIndex(editnurb, bezt);
if (!index) {
return NULL;
}
- return (BezTriple*)index->origNode;
+ return (BezTriple*)index->orig_cv;
}
-static BPoint *getKeyIndexOrig_bp(EditNurb *editnurb, void *node)
+static BPoint *getKeyIndexOrig_bp(EditNurb *editnurb, BPoint *bp)
{
- NodeKeyIndex *index= getNodeKeyIndex(editnurb, node);
+ CVKeyIndex *index= getCVKeyIndex(editnurb, bp);
if (!index) {
return NULL;
}
- return (BPoint*)index->origNode;
+ return (BPoint*)index->orig_cv;
}
-static int getKeyIndexOrig_index(EditNurb *editnurb, void *node)
+static int getKeyIndexOrig_keyIndex(EditNurb *editnurb, void *cv)
{
- NodeKeyIndex *index= getNodeKeyIndex(editnurb, node);
+ CVKeyIndex *index= getCVKeyIndex(editnurb, cv);
if (!index) {
return -1;
}
- return index->index;
+ return index->key_index;
}
-static void keyIndex_delNode(EditNurb *editnurb, void *node)
+static void keyIndex_delCV(EditNurb *editnurb, void *cv)
{
if (!editnurb->keyindex) {
return;
}
- BLI_ghash_remove(editnurb->keyindex, node, NULL, (GHashValFreeFP)free_nodeKeyIndex);
+ BLI_ghash_remove(editnurb->keyindex, cv, NULL, (GHashValFreeFP)free_cvKeyIndex);
}
static void keyIndex_delBezt(EditNurb *editnurb, BezTriple *bezt)
{
- keyIndex_delNode(editnurb, bezt);
+ keyIndex_delCV(editnurb, bezt);
}
static void keyIndex_delBP(EditNurb *editnurb, BPoint *bp)
{
- keyIndex_delNode(editnurb, bp);
+ keyIndex_delCV(editnurb, bp);
}
static void keyIndex_delNurb(EditNurb *editnurb, Nurb *nu)
@@ -405,7 +427,7 @@ static void keyIndex_delNurb(EditNurb *editnurb, Nurb *nu)
a= nu->pntsu;
while (a--) {
- BLI_ghash_remove(editnurb->keyindex, bezt, NULL, (GHashValFreeFP)free_nodeKeyIndex);
+ BLI_ghash_remove(editnurb->keyindex, bezt, NULL, (GHashValFreeFP)free_cvKeyIndex);
++bezt;
}
} else {
@@ -413,7 +435,7 @@ static void keyIndex_delNurb(EditNurb *editnurb, Nurb *nu)
a= nu->pntsu * nu->pntsv;
while (a--) {
- BLI_ghash_remove(editnurb->keyindex, bp, NULL, (GHashValFreeFP)free_nodeKeyIndex);
+ BLI_ghash_remove(editnurb->keyindex, bp, NULL, (GHashValFreeFP)free_cvKeyIndex);
++bp;
}
}
@@ -430,11 +452,11 @@ static void keyIndex_delNurbList(EditNurb *editnurb, ListBase *nubase)
}
}
-static void keyIndex_updateNode(EditNurb *editnurb, char *node,
- char *newnode, int count, int size, int search)
+static void keyIndex_updateCV(EditNurb *editnurb, char *cv,
+ char *newcv, int count, int size)
{
int i;
- NodeKeyIndex *index;
+ CVKeyIndex *index;
if (editnurb->keyindex == NULL) {
/* No shape keys - updating not needed */
@@ -442,61 +464,56 @@ static void keyIndex_updateNode(EditNurb *editnurb, char *node,
}
for (i = 0; i < count; i++) {
- for (;;) {
- index= getNodeKeyIndex(editnurb, node);
- if (!search || index) {
- break;
- }
- node += size;
- }
+ index= getCVKeyIndex(editnurb, cv);
- BLI_ghash_remove(editnurb->keyindex, node, NULL, NULL);
+ BLI_ghash_remove(editnurb->keyindex, cv, NULL, NULL);
if (index) {
- BLI_ghash_insert(editnurb->keyindex, newnode, index);
+ BLI_ghash_insert(editnurb->keyindex, newcv, index);
}
- newnode += size;
- node += size;
+ newcv += size;
+ cv += size;
}
}
static void keyIndex_updateBezt(EditNurb *editnurb, BezTriple *bezt,
- BezTriple *newbezt, int count, int search)
+ BezTriple *newbezt, int count)
{
- keyIndex_updateNode(editnurb, (char*)bezt, (char*)newbezt, count, sizeof(BezTriple), search);
+ keyIndex_updateCV(editnurb, (char*)bezt, (char*)newbezt, count, sizeof(BezTriple));
}
static void keyIndex_updateBP(EditNurb *editnurb, BPoint *bp,
- BPoint *newbp, int count, int search)
+ BPoint *newbp, int count)
{
- keyIndex_updateNode(editnurb, (char*)bp, (char*)newbp, count, sizeof(BPoint), search);
+ keyIndex_updateCV(editnurb, (char*)bp, (char*)newbp, count, sizeof(BPoint));
}
static void keyIndex_updateNurb(EditNurb *editnurb, Nurb *nu, Nurb *newnu)
{
if (nu->bezt) {
- keyIndex_updateBezt(editnurb, nu->bezt, newnu->bezt, newnu->pntsu, 0);
+ keyIndex_updateBezt(editnurb, nu->bezt, newnu->bezt, newnu->pntsu);
} else {
- keyIndex_updateBP(editnurb, nu->bp, newnu->bp, newnu->pntsu * newnu->pntsv, 0);
+ keyIndex_updateBP(editnurb, nu->bp, newnu->bp, newnu->pntsu * newnu->pntsv);
}
}
static void keyIndex_swap(EditNurb *editnurb, void *a, void *b)
{
- NodeKeyIndex *index1= getNodeKeyIndex(editnurb, a);
- NodeKeyIndex *index2= getNodeKeyIndex(editnurb, b);
+ CVKeyIndex *index1= getCVKeyIndex(editnurb, a);
+ CVKeyIndex *index2= getCVKeyIndex(editnurb, b);
BLI_ghash_remove(editnurb->keyindex, a, NULL, NULL);
BLI_ghash_remove(editnurb->keyindex, b, NULL, NULL);
- BLI_ghash_insert(editnurb->keyindex, a, index2);
- BLI_ghash_insert(editnurb->keyindex, b, index1);
+ if(index2) BLI_ghash_insert(editnurb->keyindex, a, index2);
+ if(index1) BLI_ghash_insert(editnurb->keyindex, b, index1);
}
static void keyIndex_switchDirection(EditNurb *editnurb, Nurb *nu)
{
int a;
+ CVKeyIndex *index1, *index2;
if (nu->bezt) {
BezTriple *bezt1, *bezt2;
@@ -511,8 +528,15 @@ static void keyIndex_switchDirection(EditNurb *editnurb, Nurb *nu)
a/=2;
while (a--) {
+ index1= getCVKeyIndex(editnurb, bezt1);
+ index2= getCVKeyIndex(editnurb, bezt2);
+
+ if(index1) index1->switched= !index1->switched;
+
if (bezt1 != bezt2) {
keyIndex_swap(editnurb, bezt1, bezt2);
+
+ if(index2) index2->switched= !index2->switched;
}
bezt1++;
@@ -527,7 +551,14 @@ static void keyIndex_switchDirection(EditNurb *editnurb, Nurb *nu)
bp2= bp1+(a-1);
a/= 2;
while(bp1!=bp2 && a>0) {
+ index1= getCVKeyIndex(editnurb, bp1);
+ index2= getCVKeyIndex(editnurb, bp2);
+
+ if(index1) index1->switched= !index1->switched;
+
if (bp1 != bp2) {
+ if(index2) index2->switched= !index2->switched;
+
keyIndex_swap(editnurb, bp1, bp2);
}
@@ -546,7 +577,14 @@ static void keyIndex_switchDirection(EditNurb *editnurb, Nurb *nu)
a/= 2;
while(bp1!=bp2 && a>0) {
+ index1= getCVKeyIndex(editnurb, bp1);
+ index2= getCVKeyIndex(editnurb, bp2);
+
+ if(index1) index1->switched= !index1->switched;
+
if (bp1 != bp2) {
+ if(index2) index2->switched= !index2->switched;
+
keyIndex_swap(editnurb, bp1, bp2);
}
@@ -563,7 +601,8 @@ static void keyIndex_switchDirection(EditNurb *editnurb, Nurb *nu)
static void switch_keys_direction(Curve *cu, Nurb *actnu)
{
KeyBlock *currkey;
- ListBase *nubase= &cu->editnurb->nurbs;
+ EditNurb *editnurb= cu->editnurb;
+ ListBase *nubase= &editnurb->nurbs;
Nurb *nu;
float *fp;
int a;
@@ -575,20 +614,28 @@ static void switch_keys_direction(Curve *cu, Nurb *actnu)
nu= nubase->first;
while (nu) {
if (nu->bezt) {
+ BezTriple *bezt= nu->bezt;
a= nu->pntsu;
if (nu == actnu) {
while (a--) {
- swap_v3_v3(fp, fp + 6);
- *(fp+9) = -*(fp+9);
- fp += 12;
+ if(getKeyIndexOrig_bezt(editnurb, bezt)) {
+ swap_v3_v3(fp, fp + 6);
+ *(fp+9) = -*(fp+9);
+ fp += 12;
+ }
+ bezt++;
}
} else fp += a * 12;
} else {
+ BPoint *bp= nu->bp;
a= nu->pntsu * nu->pntsv;
if (nu == actnu) {
while (a--) {
- *(fp+3) = -*(fp+3);
- fp += 4;
+ if(getKeyIndexOrig_bp(editnurb, bp)) {
+ *(fp+3) = -*(fp+3);
+ fp += 4;
+ }
+ bp++;
}
} else fp += a * 4;
}
@@ -610,7 +657,8 @@ static void keyData_switchDirectionNurb(Curve *cu, Nurb *nu)
}
keyIndex_switchDirection(editnurb, nu);
- switch_keys_direction(cu, nu);
+ if(cu->key)
+ switch_keys_direction(cu, nu);
}
static GHash *dupli_keyIndexHash(GHash *keyindex)
@@ -623,13 +671,13 @@ static GHash *dupli_keyIndexHash(GHash *keyindex)
for(hashIter = BLI_ghashIterator_new(keyindex);
!BLI_ghashIterator_isDone(hashIter);
BLI_ghashIterator_step(hashIter)) {
- void *node = BLI_ghashIterator_getKey(hashIter);
- NodeKeyIndex *index = BLI_ghashIterator_getValue(hashIter);
- NodeKeyIndex *newIndex = MEM_callocN(sizeof(NodeKeyIndex), "dupli_keyIndexHash index");
+ void *cv = BLI_ghashIterator_getKey(hashIter);
+ CVKeyIndex *index = BLI_ghashIterator_getValue(hashIter);
+ CVKeyIndex *newIndex = MEM_callocN(sizeof(CVKeyIndex), "dupli_keyIndexHash index");
- memcpy(newIndex, index, sizeof(NodeKeyIndex));
+ memcpy(newIndex, index, sizeof(CVKeyIndex));
- BLI_ghash_insert(gh, node, newIndex);
+ BLI_ghash_insert(gh, cv, newIndex);
}
BLI_ghashIterator_free(hashIter);
@@ -701,7 +749,7 @@ static void calc_keyHandles(ListBase *nurb, float *key)
}
else {
++nextp;
- nextfp += 12;;
+ nextfp += 12;
}
++bezt;
@@ -732,7 +780,7 @@ static void calc_shapeKeys(Object *obedit)
int totvert= count_curveverts(&editnurb->nurbs);
float (*ofs)[3] = NULL;
- float *oldkey, *newkey, *fp, *ofp;
+ float *oldkey, *newkey, *ofp;
/* editing the base key should update others */
if(cu->key->type==KEY_RELATIVE) {
@@ -776,7 +824,6 @@ static void calc_shapeKeys(Object *obedit)
for (j= 0; j < 3; ++j) {
VECSUB(ofs[i], bezt->vec[j], oldbezt->vec[j]);
i++;
- fp+= 3;
}
ofs[i++][0]= bezt->alfa - oldbezt->alfa;
} else {
@@ -796,7 +843,6 @@ static void calc_shapeKeys(Object *obedit)
}
i += 2;
++bp;
- fp += 4;
}
}
@@ -809,7 +855,7 @@ static void calc_shapeKeys(Object *obedit)
while(currkey) {
int apply_offset = (ofs && (currkey != actkey) && (editnurb->shapenr-1 == currkey->relative));
- fp= newkey= MEM_callocN(cu->key->elemsize * totvert, "currkey->data");
+ float *fp= newkey= MEM_callocN(cu->key->elemsize * totvert, "currkey->data");
ofp= oldkey = currkey->data;
nu= editnurb->nurbs.first;
@@ -874,7 +920,7 @@ static void calc_shapeKeys(Object *obedit)
a= nu->pntsu;
while(a--) {
- index= getKeyIndexOrig_index(editnurb, bezt);
+ index= getKeyIndexOrig_keyIndex(editnurb, bezt);
if (index >= 0) {
curofp= ofp + index;
@@ -912,7 +958,7 @@ static void calc_shapeKeys(Object *obedit)
bp= nu->bp;
a= nu->pntsu*nu->pntsv;
while(a--) {
- index= getKeyIndexOrig_index(editnurb, bp);
+ index= getKeyIndexOrig_keyIndex(editnurb, bp);
if (index >= 0) {
curofp= ofp + index;
@@ -955,6 +1001,186 @@ static void calc_shapeKeys(Object *obedit)
}
}
+/* ********************* Amimation data *************** */
+
+static int curve_is_animated(Object *ob)
+{
+ Curve *cu= (Curve*)ob->data;
+ AnimData *ad= BKE_animdata_from_id(&cu->id);
+
+ return ad && (ad->action || ad->drivers.first);
+}
+
+static void fcurve_path_rename(AnimData *ad, char *orig_rna_path, char *rna_path, ListBase *orig_curves, ListBase *curves)
+{
+ FCurve *fcu, *nfcu, *nextfcu;
+ int len= strlen(orig_rna_path);
+
+ fcu= orig_curves->first;
+ while (fcu) {
+ nextfcu= fcu->next;
+ if(!strncmp(fcu->rna_path, orig_rna_path, len)) {
+ char *spath, *suffix= fcu->rna_path + len;
+ nfcu= copy_fcurve(fcu);
+ spath= nfcu->rna_path;
+ nfcu->rna_path= BLI_sprintfN("%s%s", rna_path, suffix);
+ BLI_addtail(curves, nfcu);
+
+ if (fcu->grp) {
+ action_groups_remove_channel(ad->action, fcu);
+ action_groups_add_channel(ad->action, fcu->grp, nfcu);
+ }
+ else if (ad->action && &ad->action->curves == orig_curves)
+ BLI_remlink(&ad->action->curves, fcu);
+ else
+ BLI_remlink(&ad->drivers, fcu);
+
+ free_fcurve(fcu);
+
+ MEM_freeN(spath);
+ }
+ fcu= nextfcu;
+ }
+}
+
+static void fcurve_remove(AnimData *ad, ListBase *orig_curves, FCurve *fcu)
+{
+ if(orig_curves==&ad->drivers) BLI_remlink(&ad->drivers, fcu);
+ else action_groups_remove_channel(ad->action, fcu);
+
+ free_fcurve(fcu);
+}
+
+static void curve_rename_fcurves(Object *obedit, ListBase *orig_curves)
+{
+ int nu_index= 0, a, pt_index;
+ Curve *cu= (Curve*)obedit->data;
+ EditNurb *editnurb= cu->editnurb;
+ Nurb *nu= editnurb->nurbs.first;
+ CVKeyIndex *keyIndex;
+ char rna_path[64], orig_rna_path[64];
+ AnimData *ad= BKE_animdata_from_id(&cu->id);
+ ListBase curves= {0, 0};
+ FCurve *fcu, *next;
+
+ while(nu) {
+ if(nu->bezt) {
+ BezTriple *bezt= nu->bezt;
+ a= nu->pntsu;
+ pt_index= 0;
+
+ while (a--) {
+ keyIndex= getCVKeyIndex(editnurb, bezt);
+ if(keyIndex) {
+ sprintf(rna_path, "splines[%d].bezier_points[%d]", nu_index, pt_index);
+ sprintf(orig_rna_path, "splines[%d].bezier_points[%d]", keyIndex->nu_index, keyIndex->pt_index);
+
+ if(keyIndex->switched) {
+ char handle_path[64], orig_handle_path[64];
+ sprintf(orig_handle_path, "%s.handle_left", orig_rna_path);
+ sprintf(handle_path, "%s.handle_right", rna_path);
+ fcurve_path_rename(ad, orig_handle_path, handle_path, orig_curves, &curves);
+
+ sprintf(orig_handle_path, "%s.handle_right", orig_rna_path);
+ sprintf(handle_path, "%s.handle_left", rna_path);
+ fcurve_path_rename(ad, orig_handle_path, handle_path, orig_curves, &curves);
+ }
+
+ fcurve_path_rename(ad, orig_rna_path, rna_path, orig_curves, &curves);
+
+ keyIndex->nu_index= nu_index;
+ keyIndex->pt_index= pt_index;
+ }
+
+ bezt++;
+ pt_index++;
+ }
+ } else {
+ BPoint *bp= nu->bp;
+ a= nu->pntsu * nu->pntsv;
+ pt_index= 0;
+
+ while (a--) {
+ keyIndex= getCVKeyIndex(editnurb, bp);
+ if(keyIndex) {
+ sprintf(rna_path, "splines[%d].points[%d]", nu_index, pt_index);
+ sprintf(orig_rna_path, "splines[%d].points[%d]", keyIndex->nu_index, keyIndex->pt_index);
+ fcurve_path_rename(ad, orig_rna_path, rna_path, orig_curves, &curves);
+
+ keyIndex->nu_index= nu_index;
+ keyIndex->pt_index= pt_index;
+ }
+
+ bp++;
+ pt_index++;
+ }
+ }
+ nu= nu->next;
+ nu_index++;
+ }
+
+ /* remove pathes for removed control points
+ need this to make further step with copying non-cv related curves copying
+ not touching cv's f-cruves */
+ fcu= orig_curves->first;
+ for(fcu= orig_curves->first; fcu; fcu= next) {
+ next= fcu->next;
+
+ if(!strncmp(fcu->rna_path, "splines", 7)) {
+ char *ch= strchr(fcu->rna_path, '.');
+
+ if (ch && (!strncmp(ch, ".bezier_points", 14) || !strncmp(ch, ".points", 8)))
+ fcurve_remove(ad, orig_curves, fcu);
+ }
+ }
+
+ nu_index= 0;
+ nu= editnurb->nurbs.first;
+ while(nu) {
+ keyIndex= NULL;
+ if(nu->pntsu) {
+ if(nu->bezt) keyIndex= getCVKeyIndex(editnurb, &nu->bezt[0]);
+ else keyIndex= getCVKeyIndex(editnurb, &nu->bp[0]);
+ }
+
+ if(keyIndex) {
+ sprintf(rna_path, "splines[%d]", nu_index);
+ sprintf(orig_rna_path, "splines[%d]", keyIndex->nu_index);
+ fcurve_path_rename(ad, orig_rna_path, rna_path, orig_curves, &curves);
+ }
+
+ nu_index++;
+ nu= nu->next;
+ }
+
+ /* the remainders in orig_curves can be copied back (like follow path) */
+ /* (if it's not path to spline) */
+ for(fcu= orig_curves->first; fcu; fcu= next) {
+ next= fcu->next;
+
+ if(!strncmp(fcu->rna_path, "splines", 7)) fcurve_remove(ad, orig_curves, fcu);
+ else BLI_addtail(&curves, fcu);
+ }
+
+ *orig_curves= curves;
+}
+
+/* return 0 if animation data wasn't changed, 1 otherwise */
+int ED_curve_updateAnimPaths(Object *obedit)
+{
+ Curve *cu= (Curve*)obedit->data;
+ AnimData *ad= BKE_animdata_from_id(&cu->id);
+
+ if(!curve_is_animated(obedit)) return 0;
+
+ if(ad->action)
+ curve_rename_fcurves(obedit, &ad->action->curves);
+
+ curve_rename_fcurves(obedit, &ad->drivers);
+
+ return 1;
+}
+
/* ********************* LOAD and MAKE *************** */
/* load editNurb in object */
@@ -983,6 +1209,7 @@ void load_editNurb(Object *obedit)
cu->nurb= newnurb;
calc_shapeKeys(obedit);
+ ED_curve_updateAnimPaths(obedit);
freeNurblist(&oldnurb);
}
@@ -1003,7 +1230,8 @@ void make_editNurb(Object *obedit)
set_actNurb(obedit, NULL);
if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
- actkey = ob_get_keyblock(obedit);
+ actkey= ob_get_keyblock(obedit);
+
if(actkey) {
// XXX strcpy(G.editModeTitleExtra, "(Key) ");
undo_editmode_clear();
@@ -1035,10 +1263,12 @@ void make_editNurb(Object *obedit)
nu= nu->next;
}
- if(actkey) {
+ if(actkey)
editnurb->shapenr= obedit->shapenr;
- init_editNurb_keyIndex(editnurb, &cu->nurb);
- }
+
+ /* animation could be added in editmode even if teher was no animdata i
+ object mode hence we always need CVs index be created */
+ init_editNurb_keyIndex(editnurb, &cu->nurb);
}
}
@@ -1172,8 +1402,8 @@ static int separate_exec(bContext *C, wmOperator *op)
load_editNurb(newob);
free_editNurb(newob);
- DAG_id_flush_update(&oldob->id, OB_RECALC_DATA); /* this is the original one */
- DAG_id_flush_update(&newob->id, OB_RECALC_DATA); /* this is the separated one */
+ DAG_id_tag_update(&oldob->id, OB_RECALC_DATA); /* this is the original one */
+ DAG_id_tag_update(&newob->id, OB_RECALC_DATA); /* this is the separated one */
WM_event_add_notifier(C, NC_GEOM|ND_DATA, oldob->data);
@@ -1280,13 +1510,9 @@ static void rotateflagNurb(ListBase *editnurb, short flag, float *cent, float ro
while(a--) {
if(bp->f1 & flag) {
- bp->vec[0]-=cent[0];
- bp->vec[1]-=cent[1];
- bp->vec[2]-=cent[2];
+ sub_v3_v3(bp->vec, cent);
mul_m3_v3(rotmat, bp->vec);
- bp->vec[0]+=cent[0];
- bp->vec[1]+=cent[1];
- bp->vec[2]+=cent[2];
+ add_v3_v3(bp->vec, cent);
}
bp++;
}
@@ -1326,7 +1552,7 @@ static void translateflagNurb(ListBase *editnurb, short flag, float *vec)
}
}
-static void weightflagNurb(ListBase *editnurb, short flag, float w, int mode) /* mode==0: replace, mode==1: multiply */
+static void weightflagNurb(ListBase *editnurb, short flag, float w)
{
Nurb *nu;
BPoint *bp;
@@ -1338,8 +1564,8 @@ static void weightflagNurb(ListBase *editnurb, short flag, float w, int mode) /*
bp= nu->bp;
while(a--) {
if(bp->f1 & flag) {
- if(mode==1) bp->vec[3]*= w;
- else bp->vec[3]= w;
+ /* a mode used to exist for replace/multiple but is was unused */
+ bp->vec[3]*= w;
}
bp++;
}
@@ -1347,7 +1573,7 @@ static void weightflagNurb(ListBase *editnurb, short flag, float w, int mode) /*
}
}
-static int deleteflagNurb(bContext *C, wmOperator *op, int flag)
+static int deleteflagNurb(bContext *C, wmOperator *UNUSED(op), int flag)
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
@@ -1404,6 +1630,7 @@ static int deleteflagNurb(bContext *C, wmOperator *op, int flag)
for(b=0; b<nu->pntsv; b++) {
if((bp->f1 & flag)==0) {
memcpy(bpn, bp, nu->pntsu*sizeof(BPoint));
+ keyIndex_updateBP(cu->editnurb, bp, bpn, nu->pntsu);
bpn+= nu->pntsu;
} else {
keyIndex_delBP(cu->editnurb, bp);
@@ -1411,12 +1638,11 @@ static int deleteflagNurb(bContext *C, wmOperator *op, int flag)
bp+= nu->pntsu;
}
nu->pntsv= newv;
- keyIndex_updateBP(cu->editnurb, nu->bp, newbp, newv * nu->pntsu, 1);
MEM_freeN(nu->bp);
nu->bp= newbp;
clamp_nurb_order_v(nu);
- makeknots(nu, 2);
+ nurbs_knot_calc_v(nu);
}
else {
/* is the nurb in V direction selected */
@@ -1444,13 +1670,13 @@ static int deleteflagNurb(bContext *C, wmOperator *op, int flag)
for(a=0; a<nu->pntsu; a++, bp++) {
if((bp->f1 & flag)==0) {
*bpn= *bp;
+ keyIndex_updateBP(cu->editnurb, bp, bpn, 1);
bpn++;
} else {
keyIndex_delBP(cu->editnurb, bp);
}
}
}
- keyIndex_updateBP(cu->editnurb, nu->bp, newbp, newu * nu->pntsv, 1);
MEM_freeN(nu->bp);
nu->bp= newbp;
if(newu==1 && nu->pntsv>1) { /* make a U spline */
@@ -1465,13 +1691,16 @@ static int deleteflagNurb(bContext *C, wmOperator *op, int flag)
nu->pntsu= newu;
clamp_nurb_order_u(nu);
}
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
}
}
}
nu= next;
}
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
+
return OPERATOR_FINISHED;
}
@@ -1513,7 +1742,7 @@ static short extrudeflagNurb(EditNurb *editnurb, int flag)
nu->pntsv= 2;
nu->orderv= 2;
- makeknots(nu, 2);
+ nurbs_knot_calc_v(nu);
}
}
else {
@@ -1556,7 +1785,7 @@ static short extrudeflagNurb(EditNurb *editnurb, int flag)
MEM_freeN(nu->bp);
nu->bp= newbp;
nu->pntsv++;
- makeknots(nu, 2);
+ nurbs_knot_calc_v(nu);
}
else if(v==0 || v== nu->pntsu-1) { /* collumn in v-direction selected */
ok= 1;
@@ -1583,7 +1812,7 @@ static short extrudeflagNurb(EditNurb *editnurb, int flag)
MEM_freeN(nu->bp);
nu->bp= newbp;
nu->pntsu++;
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
}
}
}
@@ -1681,7 +1910,7 @@ static void adduplicateflagNurb(Object *obedit, short flag)
/* knots */
newnu->knotsu= NULL;
- makeknots(newnu, 1);
+ nurbs_knot_calc_u(newnu);
}
bp++;
}
@@ -1746,14 +1975,14 @@ static void adduplicateflagNurb(Object *obedit, short flag)
if(nu->pntsu==newnu->pntsu && nu->knotsu) {
newnu->knotsu= MEM_dupallocN( nu->knotsu );
} else {
- makeknots(newnu, 1);
+ nurbs_knot_calc_u(newnu);
}
}
if (check_valid_nurb_v(newnu)) {
if(nu->pntsv==newnu->pntsv && nu->knotsv) {
newnu->knotsv= MEM_dupallocN( nu->knotsv );
} else {
- makeknots(newnu, 2);
+ nurbs_knot_calc_v(newnu);
}
}
}
@@ -1769,7 +1998,7 @@ static void adduplicateflagNurb(Object *obedit, short flag)
/**************** switch direction operator ***************/
-static int switch_direction_exec(bContext *C, wmOperator *op)
+static int switch_direction_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= (Curve*)obedit->data;
@@ -1782,7 +2011,10 @@ static int switch_direction_exec(bContext *C, wmOperator *op)
keyData_switchDirectionNurb(cu, nu);
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
+
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1792,6 +2024,7 @@ void CURVE_OT_switch_direction(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Switch Direction";
+ ot->description= "Switch direction of selected splines";
ot->idname= "CURVE_OT_switch_direction";
/* api callbacks */
@@ -1829,7 +2062,7 @@ static int set_goal_weight_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1838,7 +2071,8 @@ static int set_goal_weight_exec(bContext *C, wmOperator *op)
void CURVE_OT_spline_weight_set(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Set Curve Weight";
+ ot->name= "Set Goal Weight";
+ ot->description= "Set softbody goal weight for selected points";
ot->idname= "CURVE_OT_spline_weight_set";
/* api callbacks */
@@ -1881,7 +2115,7 @@ static int set_radius_exec(bContext *C, wmOperator *op)
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -1890,6 +2124,7 @@ void CURVE_OT_radius_set(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Curve Radius";
+ ot->description= "Set per-point radius which is used for bevel tapering";
ot->idname= "CURVE_OT_radius_set";
/* api callbacks */
@@ -1906,7 +2141,7 @@ void CURVE_OT_radius_set(wmOperatorType *ot)
/********************* smooth operator ********************/
-static int smooth_exec(bContext *C, wmOperator *op)
+static int smooth_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -1956,7 +2191,7 @@ static int smooth_exec(bContext *C, wmOperator *op)
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -1965,6 +2200,7 @@ void CURVE_OT_smooth(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Smooth";
+ ot->description= "Flatten angles of selected points";
ot->idname= "CURVE_OT_smooth";
/* api callbacks */
@@ -1978,7 +2214,7 @@ void CURVE_OT_smooth(wmOperatorType *ot)
/**************** smooth curve radius operator *************/
/* TODO, make smoothing distance based */
-static int smooth_radius_exec(bContext *C, wmOperator *op)
+static int smooth_radius_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -1989,7 +2225,7 @@ static int smooth_radius_exec(bContext *C, wmOperator *op)
/* use for smoothing */
int last_sel;
- int start_sel, end_sel; /* selection indicies, inclusive */
+ int start_sel, end_sel; /* selection indices, inclusive */
float start_rad, end_rad, fac, range;
for(nu= editnurb->first; nu; nu= nu->next) {
@@ -1999,7 +2235,7 @@ static int smooth_radius_exec(bContext *C, wmOperator *op)
/* loop over selection segments of a curve, smooth each */
/* Start BezTriple code, this is duplicated below for points, make sure these functions stay in sync */
- start_sel = end_sel = -1;
+ start_sel = -1;
for(bezt=nu->bezt+last_sel, a=last_sel; a<nu->pntsu; a++, bezt++) {
if(bezt->f2 & SELECT) {
start_sel = a;
@@ -2061,7 +2297,7 @@ static int smooth_radius_exec(bContext *C, wmOperator *op)
/* loop over selection segments of a curve, smooth each */
/* Start BezTriple code, this is duplicated below for points, make sure these functions stay in sync */
- start_sel = end_sel = -1;
+ start_sel = -1;
for(bp=nu->bp+last_sel, a=last_sel; a<nu->pntsu; a++, bp++) {
if(bp->f1 & SELECT) {
start_sel = a;
@@ -2121,7 +2357,7 @@ static int smooth_radius_exec(bContext *C, wmOperator *op)
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -2130,6 +2366,7 @@ void CURVE_OT_smooth_radius(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Smooth Curve Radius";
+ ot->description= "Flatten radiuses of selected points";
ot->idname= "CURVE_OT_smooth_radius";
/* api clastbacks */
@@ -2269,7 +2506,7 @@ void selectend_nurb(Object *obedit, short selfirst, short doswap, short selstatu
}
}
-static int de_select_first_exec(bContext *C, wmOperator *op)
+static int de_select_first_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
@@ -2293,7 +2530,7 @@ void CURVE_OT_de_select_first(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int de_select_last_exec(bContext *C, wmOperator *op)
+static int de_select_last_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
@@ -2449,7 +2686,7 @@ static int hide_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
@@ -2474,7 +2711,7 @@ void CURVE_OT_hide(wmOperatorType *ot)
/********************** reveal operator *********************/
-static int reveal_exec(bContext *C, wmOperator *op)
+static int reveal_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -2509,7 +2746,7 @@ static int reveal_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
@@ -2531,7 +2768,7 @@ void CURVE_OT_reveal(wmOperatorType *ot)
/********************** select invert operator *********************/
-static int select_inverse_exec(bContext *C, wmOperator *op)
+static int select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
@@ -2601,7 +2838,7 @@ void CURVE_OT_select_inverse(wmOperatorType *ot)
static void subdividenurb(Object *obedit, int number_cuts)
{
Curve *cu= obedit->data;
- ListBase *editnurb= curve_get_editcurve(obedit);
+ EditNurb *editnurb= cu->editnurb;
Nurb *nu;
BezTriple *prevbezt, *bezt, *beztnew, *beztn;
BPoint *bp, *prevbp, *bpnew, *bpn;
@@ -2611,7 +2848,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
// printf("*** subdivideNurb: entering subdivide\n");
- for(nu= editnurb->first; nu; nu= nu->next) {
+ for(nu= editnurb->nurbs.first; nu; nu= nu->next) {
amount= 0;
if(nu->type == CU_BEZIER) {
/*
@@ -2653,6 +2890,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
}
while(a--) {
memcpy(beztn, prevbezt, sizeof(BezTriple));
+ keyIndex_updateBezt(editnurb, prevbezt, beztn, 1);
beztn++;
if( BEZSELECTED_HIDDENHANDLES(cu, prevbezt) && BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
@@ -2695,7 +2933,10 @@ static void subdividenurb(Object *obedit, int number_cuts)
bezt++;
}
/* last point */
- if((nu->flagu & CU_NURB_CYCLIC)==0) memcpy(beztn, prevbezt, sizeof(BezTriple));
+ if((nu->flagu & CU_NURB_CYCLIC)==0) {
+ memcpy(beztn, prevbezt, sizeof(BezTriple));
+ keyIndex_updateBezt(editnurb, prevbezt, beztn, 1);
+ }
MEM_freeN(nu->bezt);
nu->bezt= beztnew;
@@ -2746,6 +2987,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
}
while(a--) {
memcpy(bpn, prevbp, sizeof(BPoint));
+ keyIndex_updateBP(editnurb, prevbp, bpn, 1);
bpn++;
if( (bp->f1 & SELECT) && (prevbp->f1 & SELECT) ) {
@@ -2762,14 +3004,17 @@ static void subdividenurb(Object *obedit, int number_cuts)
prevbp= bp;
bp++;
}
- if((nu->flagu & CU_NURB_CYCLIC)==0) memcpy(bpn, prevbp, sizeof(BPoint)); /* last point */
+ if((nu->flagu & CU_NURB_CYCLIC)==0) { /* last point */
+ memcpy(bpn, prevbp, sizeof(BPoint));
+ keyIndex_updateBP(editnurb, prevbp, bpn, 1);
+ }
MEM_freeN(nu->bp);
nu->bp= bpnew;
nu->pntsu+= amount;
if(nu->type & CU_NURBS) {
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
}
}
} /* End of 'else if(nu->pntsv==1)' */
@@ -2849,6 +3094,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
for(a=0; a<nu->pntsv; a++) {
for(b=0; b<nu->pntsu; b++) {
*bpn= *bp;
+ keyIndex_updateBP(editnurb, bp, bpn, 1);
bpn++;
bp++;
if(b<nu->pntsu-1) {
@@ -2889,8 +3135,8 @@ static void subdividenurb(Object *obedit, int number_cuts)
nu->bp= bpnew;
nu->pntsu= (number_cuts+1)*nu->pntsu-number_cuts;
nu->pntsv= (number_cuts+1)*nu->pntsv-number_cuts;
- makeknots(nu, 1);
- makeknots(nu, 2);
+ nurbs_knot_calc_u(nu);
+ nurbs_knot_calc_v(nu);
} /* End of 'if(sel== nu->pntsu*nu->pntsv)' (subdivide entire NURB) */
else {
/* subdivide in v direction? */
@@ -2905,6 +3151,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
for(a=0; a<nu->pntsv; a++) {
for(b=0; b<nu->pntsu; b++) {
*bpn= *bp;
+ keyIndex_updateBP(editnurb, bp, bpn, 1);
bpn++;
bp++;
}
@@ -2934,7 +3181,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
MEM_freeN(nu->bp);
nu->bp= bpnew;
nu->pntsv+= sel;
- makeknots(nu, 2);
+ nurbs_knot_calc_v(nu);
}
else {
/* or in u direction? */
@@ -2951,6 +3198,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
for(a=0; a<nu->pntsv; a++) {
for(b=0; b<nu->pntsu; b++) {
*bpn= *bp;
+ keyIndex_updateBP(editnurb, bp, bpn, 1);
bpn++;
bp++;
if( (b<nu->pntsu-1) && usel[b]==nu->pntsv && usel[b+1]==nu->pntsv ) {
@@ -2974,7 +3222,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
MEM_freeN(nu->bp);
nu->bp= bpnew;
nu->pntsu+= sel;
- makeknots(nu, 1); /* shift knots
+ nurbs_knot_calc_u(nu); /* shift knots
forward */
}
}
@@ -2993,8 +3241,11 @@ static int subdivide_exec(bContext *C, wmOperator *op)
subdividenurb(obedit, number_cuts);
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
+
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -3003,6 +3254,7 @@ void CURVE_OT_subdivide(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Subdivide";
+ ot->description= "Subdivide selected segments";
ot->idname= "CURVE_OT_subdivide";
/* api callbacks */
@@ -3012,7 +3264,7 @@ void CURVE_OT_subdivide(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- RNA_def_int(ot->srna, "number_cuts", 1, 1, 100, "Number of cuts", "", 1, 100);
+ RNA_def_int(ot->srna, "number_cuts", 1, 1, INT_MAX, "Number of cuts", "", 1, 10);
}
/******************** find nearest ************************/
@@ -3171,7 +3423,7 @@ static int convertspline(short type, Nurb *nu)
nu->orderu= 4;
nu->flagu &= CU_NURB_CYCLIC; /* disable all flags except for cyclic */
nu->flagu |= CU_NURB_BEZIER;
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
a= nu->pntsu*nu->pntsv;
bp= nu->bp;
while(a--) {
@@ -3224,7 +3476,7 @@ static int convertspline(short type, Nurb *nu)
if(type== CU_NURBS) {
nu->flagu &= CU_NURB_CYCLIC; /* disable all flags except for cyclic */
nu->flagu |= CU_NURB_BEZIER;
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
}
}
}
@@ -3295,7 +3547,10 @@ static int set_spline_type_exec(bContext *C, wmOperator *op)
}
if(changed) {
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
+
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -3341,19 +3596,20 @@ static int set_handle_type_exec(bContext *C, wmOperator *op)
sethandlesNurb(editnurb, RNA_enum_get(op->ptr, "type"));
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
void CURVE_OT_handle_type_set(wmOperatorType *ot)
{
- static EnumPropertyItem type_items[]= {
- {1, "AUTOMATIC", 0, "Automatic", ""},
- {2, "VECTOR", 0, "Vector", ""},
+ /* keep in sync with graphkeys_handle_type_items */
+ static EnumPropertyItem editcurve_handle_type_items[]= {
+ {HD_AUTO, "AUTOMATIC", 0, "Automatic", ""},
+ {HD_VECT, "VECTOR", 0, "Vector", ""},
+ {5, "ALIGNED", 0, "Aligned", ""},
+ {6, "FREE_ALIGN", 0, "Free", ""},
{3, "TOGGLE_FREE_ALIGN", 0, "Toggle Free/Align", ""},
- {5, "ALIGN", 0, "Align", ""},
- {6, "FREE_ALIGN", 0, "Free Align", ""},
{0, NULL, 0, NULL, NULL}};
/* identifiers */
@@ -3361,6 +3617,7 @@ void CURVE_OT_handle_type_set(wmOperatorType *ot)
ot->idname= "CURVE_OT_handle_type_set";
/* api callbacks */
+ ot->invoke= WM_menu_invoke;
ot->exec= set_handle_type_exec;
ot->poll= ED_operator_editcurve;
@@ -3368,7 +3625,7 @@ void CURVE_OT_handle_type_set(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_enum(ot->srna, "type", type_items, 1, "Type", "Spline type");
+ ot->prop= RNA_def_enum(ot->srna, "type", editcurve_handle_type_items, 1, "Type", "Spline type");
}
/***************** make segment operator **********************/
@@ -3641,10 +3898,10 @@ static void merge_2_nurb(wmOperator *op, ListBase *editnurb, Nurb *nu1, Nurb *nu
if(nu1->type == CU_NURBS) {
/* merge knots */
- makeknots(nu1, 1);
+ nurbs_knot_calc_u(nu1);
/* make knots, for merged curved for example */
- makeknots(nu1, 2);
+ nurbs_knot_calc_v(nu1);
}
MEM_freeN(temp);
@@ -3701,7 +3958,7 @@ static int merge_nurb(bContext *C, wmOperator *op)
set_actNurb(obedit, NULL);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -3713,10 +3970,9 @@ static int make_segment_exec(bContext *C, wmOperator *op)
Curve *cu= obedit->data;
ListBase *nubase= curve_get_editcurve(obedit);
Nurb *nu, *nu1=0, *nu2=0;
- BezTriple *bezt;
BPoint *bp;
float *fp, offset;
- int a;
+ int a, ok= 0;
/* first decide if this is a surface merge! */
if(obedit->type==OB_SURF) nu= nubase->first;
@@ -3745,12 +4001,10 @@ static int make_segment_exec(bContext *C, wmOperator *op)
for(nu= nubase->first; nu; nu= nu->next) {
if((nu->flagu & CU_NURB_CYCLIC)==0) { /* not cyclic */
if(nu->type == CU_BEZIER) {
- bezt= nu->bezt;
if(nu1==0) {
- if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) nu1= nu;
+ if( BEZSELECTED_HIDDENHANDLES(cu, nu->bezt) ) nu1= nu;
else {
- bezt= bezt+(nu->pntsu-1);
- if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(cu, &(nu->bezt[nu->pntsu-1])) ) {
nu1= nu;
switchdirectionNurb(nu);
keyData_switchDirectionNurb(cu, nu);
@@ -3758,14 +4012,13 @@ static int make_segment_exec(bContext *C, wmOperator *op)
}
}
else if(nu2==0) {
- if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(cu, nu->bezt) ) {
nu2= nu;
switchdirectionNurb(nu);
keyData_switchDirectionNurb(cu, nu);
}
else {
- bezt= bezt+(nu->pntsu-1);
- if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(cu, &(nu->bezt[nu->pntsu-1])) ) {
nu2= nu;
}
}
@@ -3806,7 +4059,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
if((nu1 && nu2) && (nu1!=nu2)) {
if( nu1->type==nu2->type) {
if(nu1->type == CU_BEZIER) {
- bezt =
+ BezTriple *bezt =
(BezTriple*)MEM_mallocN((nu1->pntsu+nu2->pntsu) * sizeof(BezTriple), "addsegmentN");
ED_curve_beztcpy(cu->editnurb, bezt, nu2->bezt, nu2->pntsu);
ED_curve_beztcpy(cu->editnurb, bezt+nu2->pntsu, nu1->bezt, nu1->pntsu);
@@ -3834,7 +4087,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
/* now join the knots */
if(nu1->type == CU_NURBS) {
if(nu1->knotsu==NULL) {
- makeknots(nu1, 1);
+ nurbs_knot_calc_u(nu1);
}
else {
fp= MEM_mallocN(sizeof(float)*KNOTSU(nu1), "addsegment3");
@@ -3858,16 +4111,30 @@ static int make_segment_exec(bContext *C, wmOperator *op)
}
set_actNurb(obedit, NULL); /* for selected */
-
- WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
-
- return OPERATOR_FINISHED;
+ ok= 1;
+ } else if(nu1 && !nu2 && nu1->type == CU_BEZIER) {
+ if(!(nu1->flagu & CU_NURB_CYCLIC)) {
+ if(BEZSELECTED_HIDDENHANDLES(cu, nu1->bezt) &&
+ BEZSELECTED_HIDDENHANDLES(cu, nu1->bezt+(nu1->pntsu-1))) {
+ nu1->flagu|= CU_NURB_CYCLIC;
+ calchandlesNurb(nu1);
+ ok= 1;
+ }
+ }
}
- else {
+
+ if(!ok) {
BKE_report(op->reports, RPT_ERROR, "Can't make segment");
return OPERATOR_CANCELLED;
}
+
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
+
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_tag_update(obedit->data, 0);
+
+ return OPERATOR_FINISHED;
}
void CURVE_OT_make_segment(wmOperatorType *ot)
@@ -3969,11 +4236,9 @@ int mouse_nurb(bContext *C, short mval[2], int extend)
/******************** spin operator ***********************/
-/* from what I can gather, the mode==0 magic number spins and bridges the nurbs based on the
- * orientation of the global 3d view (yuck yuck!) mode==1 does the same, but doesn't bridge up
- * up the new geometry, mode==2 now does the same as 0, but aligned to world axes, not the view.
-*/
-static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, float *cent, short mode)
+/* 'cent' is in object space and 'dvec' in worldspace.
+ */
+static int spin_nurb(float viewmat[][4], Object *obedit, float *axis, float *cent)
{
Curve *cu= (Curve*)obedit->data;
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -3982,16 +4247,15 @@ static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, flo
float bmat[3][3], rotmat[3][3], scalemat1[3][3], scalemat2[3][3];
float persmat[3][3], persinv[3][3];
short a,ok, changed= 0;
-
- unit_m3(persmat);
+
+ copy_m3_m4(persmat, viewmat);
invert_m3_m3(persinv, persmat);
/* imat and center and size */
copy_m3_m4(bmat, obedit->obmat);
invert_m3_m3(imat, bmat);
-
- n[0]=n[1]= 0.0;
- n[2]= 1.0;
+
+ normalize_v3_v3(n, axis);
phi= M_PI/8.0;
q[0]= cos(phi);
@@ -4004,8 +4268,8 @@ static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, flo
mul_m3_m3m3(rotmat, imat, tmat);
unit_m3(scalemat1);
- scalemat1[0][0]= sqrt(2.0);
- scalemat1[1][1]= sqrt(2.0);
+ scalemat1[0][0]= M_SQRT2;
+ scalemat1[1][1]= M_SQRT2;
mul_m3_m3m3(tmat,persmat,bmat);
mul_m3_m3m3(cmat,scalemat1,tmat);
@@ -4013,8 +4277,8 @@ static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, flo
mul_m3_m3m3(scalemat1,imat,tmat);
unit_m3(scalemat2);
- scalemat2[0][0]/= sqrt(2.0);
- scalemat2[1][1]/= sqrt(2.0);
+ scalemat2[0][0]/= M_SQRT2;
+ scalemat2[1][1]/= M_SQRT2;
mul_m3_m3m3(tmat,persmat,bmat);
mul_m3_m3m3(cmat,scalemat2,tmat);
@@ -4024,29 +4288,22 @@ static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, flo
ok= 1;
for(a=0;a<7;a++) {
- if(mode==0 || mode==2) ok= extrudeflagNurb(cu->editnurb, 1);
- else adduplicateflagNurb(obedit, 1);
+ ok= extrudeflagNurb(cu->editnurb, 1);
if(ok==0)
return changed;
changed= 1;
- rotateflagNurb(editnurb, 1,cent,rotmat);
+ rotateflagNurb(editnurb, SELECT, cent, rotmat);
- if(mode==0 || mode==2) {
- if( (a & 1)==0 ) {
- rotateflagNurb(editnurb, 1,cent,scalemat1);
- weightflagNurb(editnurb, 1, 0.25*sqrt(2.0), 1);
- }
- else {
- rotateflagNurb(editnurb, 1,cent,scalemat2);
- weightflagNurb(editnurb, 1, 4.0/sqrt(2.0), 1);
- }
+ if( (a & SELECT)==0 ) {
+ rotateflagNurb(editnurb, SELECT, cent, scalemat1);
+ weightflagNurb(editnurb, SELECT, 0.25*M_SQRT2);
}
- if(dvec) {
- mul_m3_v3(bmat,dvec);
- translateflagNurb(editnurb, 1,dvec);
+ else {
+ rotateflagNurb(editnurb, SELECT, cent, scalemat2);
+ weightflagNurb(editnurb, SELECT, 4.0/M_SQRT2);
}
}
@@ -4055,7 +4312,7 @@ static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, flo
if(isNurbsel(nu)) {
nu->orderv= 4;
nu->flagv |= CU_NURB_CYCLIC;
- makeknots(nu, 2);
+ nurbs_knot_calc_v(nu);
}
}
}
@@ -4065,32 +4322,47 @@ static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, flo
static int spin_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
- float cent[3], axis[3];
+ RegionView3D *rv3d= ED_view3d_context_rv3d(C);
+ float cent[3], axis[3], viewmat[4][4];
RNA_float_get_array(op->ptr, "center", cent);
RNA_float_get_array(op->ptr, "axis", axis);
- if(!spin_nurb(C, scene, obedit, axis, cent, 0)) {
+ invert_m4_m4(obedit->imat, obedit->obmat);
+ mul_m4_v3(obedit->imat, cent);
+
+ if(rv3d)
+ copy_m4_m4(viewmat, rv3d->viewmat);
+ else
+ unit_m4(viewmat);
+
+ if(!spin_nurb(viewmat, obedit, axis, cent)) {
BKE_report(op->reports, RPT_ERROR, "Can't spin");
return OPERATOR_CANCELLED;
}
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
+
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
-static int spin_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int spin_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Scene *scene = CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= ED_view3d_context_rv3d(C);
+ float axis[3]= {0.0f, 0.0f, 1.0f};
+
+ if(rv3d)
+ copy_v3_v3(axis, rv3d->viewinv[2]);
RNA_float_set_array(op->ptr, "center", give_cursor(scene, v3d));
- RNA_float_set_array(op->ptr, "axis", rv3d->viewinv[2]);
+ RNA_float_set_array(op->ptr, "axis", axis);
return spin_exec(C, op);
}
@@ -4120,51 +4392,134 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
Object *obedit= CTX_data_edit_object(C);
Curve *cu= (Curve*)obedit->data;
EditNurb *editnurb= cu->editnurb;
- Nurb *nu;
+ Nurb *nu, *newnu= NULL;
BezTriple *bezt, *newbezt = NULL;
BPoint *bp, *newbp = NULL;
float mat[3][3],imat[3][3], temp[3];
+ int ok= 0;
copy_m3_m4(mat, obedit->obmat);
invert_m3_m3(imat,mat);
findselectedNurbvert(&editnurb->nurbs, &nu, &bezt, &bp);
- if(bezt==0 && bp==0) return OPERATOR_CANCELLED;
- if(nu->type == CU_BEZIER) {
+ if ((nu == NULL) || (nu->type==CU_BEZIER && bezt==NULL) || (nu->type!=CU_BEZIER && bp==NULL)) {
+ if(cu->actnu >= 0 && mode!='e') {
+ nu= BLI_findlink(&editnurb->nurbs, cu->actnu);
+
+ if(nu->type==CU_BEZIER) {
+ newbezt= (BezTriple*)MEM_callocN(sizeof(BezTriple), "addvert_Nurb");
+ newbezt->radius= 1;
+ newbezt->alfa= 0;
+ BEZ_SEL(newbezt);
+ newbezt->h2= newbezt->h1= HD_AUTO;
+
+ newnu= (Nurb*)MEM_mallocN(sizeof(Nurb), "addvert_Nurb newnu");
+ memcpy(newnu, nu, sizeof(Nurb));
+ BLI_addtail(&editnurb->nurbs, newnu);
+ set_actNurb(obedit, newnu);
+ newnu->bezt= newbezt;
+ newnu->pntsu= 1;
+
+ temp[0] = 1;
+ temp[1] = 0;
+ temp[2] = 0;
+ copy_v3_v3(newbezt->vec[1], location);
+ sub_v3_v3(newbezt->vec[1], obedit->obmat[3]);
+ sub_v3_v3v3(newbezt->vec[0], newbezt->vec[1],temp);
+ add_v3_v3v3(newbezt->vec[2], newbezt->vec[1],temp);
+
+ ok= 1;
+ } else if(nu->pntsv == 1) {
+ newbp= (BPoint*)MEM_callocN(sizeof(BPoint), "addvert_Nurb5");
+ newbp->radius= 1;
+ newbp->alfa= 0;
+ newbp->f1|= SELECT;
+ cu->lastsel= newbp;
+
+ newnu= (Nurb*)MEM_mallocN(sizeof(Nurb), "addvert_Nurb newnu");
+ memcpy(newnu, nu, sizeof(Nurb));
+ BLI_addtail(&editnurb->nurbs, newnu);
+ set_actNurb(obedit, newnu);
+ newnu->bp= newbp;
+ newnu->orderu= 2;
+ newnu->pntsu= 1;
+
+ copy_v3_v3(newbp->vec, location);
+ sub_v3_v3(newbp->vec, obedit->obmat[3]);
+ mul_m3_v3(imat,newbp->vec);
+ newbp->vec[3]= 1.0;
+
+ newnu->knotsu= newnu->knotsv= 0;
+ nurbs_knot_calc_u(newnu);
+
+ ok= 1;
+ }
+
+ }
+
+ if(!ok)
+ return OPERATOR_CANCELLED;
+ }
+
+ if(!ok && nu->type == CU_BEZIER) {
/* which bezpoint? */
- if(bezt== nu->bezt) { /* first */
+ if(bezt== (nu->bezt+nu->pntsu-1)) { /* last */
BEZ_DESEL(bezt);
newbezt =
(BezTriple*)MEM_callocN((nu->pntsu+1) * sizeof(BezTriple), "addvert_Nurb");
- ED_curve_beztcpy(editnurb, newbezt+1, bezt, nu->pntsu);
- *newbezt= *bezt;
- BEZ_SEL(newbezt);
- newbezt->h2= newbezt->h1;
+ ED_curve_beztcpy(editnurb, newbezt, nu->bezt, nu->pntsu);
+ *(newbezt+nu->pntsu)= *bezt;
VECCOPY(temp, bezt->vec[1]);
MEM_freeN(nu->bezt);
nu->bezt= newbezt;
- bezt= newbezt+1;
+ newbezt+= nu->pntsu;
+ BEZ_SEL(newbezt);
+ cu->lastsel= newbezt;
+ newbezt->h2= newbezt->h1;
+ bezt= nu->bezt+nu->pntsu-1;
+ ok= 1;
}
- else if(bezt== (nu->bezt+nu->pntsu-1)) { /* last */
+ else if(bezt== nu->bezt) { /* first */
BEZ_DESEL(bezt);
newbezt =
(BezTriple*)MEM_callocN((nu->pntsu+1) * sizeof(BezTriple), "addvert_Nurb");
- ED_curve_beztcpy(editnurb, newbezt, nu->bezt, nu->pntsu);
- *(newbezt+nu->pntsu)= *bezt;
+ ED_curve_beztcpy(editnurb, newbezt+1, bezt, nu->pntsu);
+ *newbezt= *bezt;
+ BEZ_SEL(newbezt);
+ cu->lastsel= newbezt;
+ newbezt->h2= newbezt->h1;
VECCOPY(temp, bezt->vec[1]);
MEM_freeN(nu->bezt);
nu->bezt= newbezt;
- newbezt+= nu->pntsu;
+ bezt= newbezt+1;
+ ok= 1;
+ }
+ else if(mode!='e') {
+ BEZ_DESEL(bezt);
+ newbezt= (BezTriple*)MEM_callocN(sizeof(BezTriple), "addvert_Nurb");
+ *newbezt= *bezt;
BEZ_SEL(newbezt);
newbezt->h2= newbezt->h1;
- bezt= nu->bezt+nu->pntsu-1;
+ VECCOPY(temp, bezt->vec[1]);
+
+ newnu= (Nurb*)MEM_mallocN(sizeof(Nurb), "addvert_Nurb newnu");
+ memcpy(newnu, nu, sizeof(Nurb));
+ BLI_addtail(&editnurb->nurbs, newnu);
+ set_actNurb(obedit, newnu);
+ newnu->bezt= newbezt;
+ newnu->pntsu= 1;
+
+ cu->lastsel= newbezt;
+
+ bezt= newbezt;
+ ok= 1;
}
else bezt= 0;
if(bezt) {
- nu->pntsu++;
-
+ if(!newnu) nu->pntsu++;
+
if(mode=='e') {
copy_v3_v3(newbezt->vec[0], bezt->vec[0]);
copy_v3_v3(newbezt->vec[1], bezt->vec[1]);
@@ -4177,11 +4532,13 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
sub_v3_v3v3(temp, newbezt->vec[1],temp);
add_v3_v3v3(newbezt->vec[0], bezt->vec[0],temp);
add_v3_v3v3(newbezt->vec[2], bezt->vec[2],temp);
- calchandlesNurb(nu);
+
+ if(newnu) calchandlesNurb(newnu);
+ else calchandlesNurb(nu);
}
}
}
- else if(nu->pntsv==1) {
+ else if(!ok && nu->pntsv==1) {
/* which b-point? */
if(bp== nu->bp) { /* first */
bp->f1= 0;
@@ -4189,10 +4546,12 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
(BPoint*)MEM_callocN((nu->pntsu+1) * sizeof(BPoint), "addvert_Nurb3");
ED_curve_bpcpy(editnurb, newbp+1, bp, nu->pntsu);
*newbp= *bp;
- newbp->f1= 1;
+ newbp->f1|= SELECT;
+ cu->lastsel= newbp;
MEM_freeN(nu->bp);
nu->bp= newbp;
bp= newbp + 1;
+ ok= 1;
}
else if(bp== (nu->bp+nu->pntsu-1)) { /* last */
bp->f1= 0;
@@ -4203,16 +4562,33 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
MEM_freeN(nu->bp);
nu->bp= newbp;
newbp+= nu->pntsu;
- newbp->f1= 1;
+ newbp->f1|= SELECT;
+ cu->lastsel= newbp;
bp= newbp - 1;
+ ok= 1;
+ }
+ else if(mode!='e') {
+ bp->f1= 0;
+ newbp= (BPoint*)MEM_callocN(sizeof(BPoint), "addvert_Nurb5");
+ *newbp= *bp;
+ newbp->f1|= SELECT;
+ cu->lastsel= newbp;
+
+ newnu= (Nurb*)MEM_mallocN(sizeof(Nurb), "addvert_Nurb newnu");
+ memcpy(newnu, nu, sizeof(Nurb));
+ BLI_addtail(&editnurb->nurbs, newnu);
+ set_actNurb(obedit, newnu);
+ newnu->bp= newbp;
+ newnu->orderu= 2;
+ newnu->pntsu= 1;
+ newnu->knotsu= newnu->knotsv= NULL;
+
+ bp= newbp;
+ ok= 1;
}
else bp= 0;
if(bp) {
- nu->pntsu++;
-
- makeknots(nu, 1);
-
if(mode=='e') {
copy_v3_v3(newbp->vec, bp->vec);
}
@@ -4221,18 +4597,33 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
sub_v3_v3(newbp->vec, obedit->obmat[3]);
mul_m3_v3(imat,newbp->vec);
newbp->vec[3]= 1.0;
+
+ if(!newnu && nu->orderu<4 && nu->orderu<=nu->pntsu)
+ nu->orderu++;
}
+
+ if(!newnu) {
+ nu->pntsu++;
+ nurbs_knot_calc_u(nu);
+ } else nurbs_knot_calc_u(newnu);
}
}
// XXX retopo_do_all();
- test2DNurb(nu);
+ if(ok) {
+ test2DNurb(nu);
- WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
- return OPERATOR_FINISHED;
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_tag_update(obedit->data, 0);
+
+ return OPERATOR_FINISHED;
+ }
+
+ return OPERATOR_CANCELLED;
}
static int add_vertex_exec(bContext *C, wmOperator *op)
@@ -4283,7 +4674,7 @@ void CURVE_OT_vertex_add(wmOperatorType *ot)
/***************** extrude operator **********************/
-static int extrude_exec(bContext *C, wmOperator *op)
+static int extrude_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
@@ -4300,15 +4691,18 @@ static int extrude_exec(bContext *C, wmOperator *op)
}
else {
if(extrudeflagNurb(editnurb, 1)) { /* '1'= flag */
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
+
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
}
}
return OPERATOR_FINISHED;
}
-static int extrude_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int extrude_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if(extrude_exec(C, op) == OPERATOR_FINISHED) {
RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
@@ -4382,7 +4776,7 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op)
while(a--) {
if( bp->f1 & SELECT ) {
nu->flagu ^= CU_NURB_CYCLIC;
- makeknots(nu, 1); /* 1==u type is ignored for cyclic curves */
+ nurbs_knot_calc_u(nu); /* 1==u type is ignored for cyclic curves */
break;
}
bp++;
@@ -4397,11 +4791,11 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op)
if( bp->f1 & SELECT) {
if(direction==0 && nu->pntsu>1) {
nu->flagu ^= CU_NURB_CYCLIC;
- makeknots(nu, 1); /* 1==u type is ignored for cyclic curves */
+ nurbs_knot_calc_u(nu); /* 1==u type is ignored for cyclic curves */
}
if(direction==1 && nu->pntsv>1) {
nu->flagv ^= CU_NURB_CYCLIC;
- makeknots(nu, 2); /* 2==v type is ignored for cyclic curves */
+ nurbs_knot_calc_v(nu); /* 2==v type is ignored for cyclic curves */
}
break;
}
@@ -4413,12 +4807,12 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op)
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
-static int toggle_cyclic_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int toggle_cyclic_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -4429,7 +4823,7 @@ static int toggle_cyclic_invoke(bContext *C, wmOperator *op, wmEvent *event)
for(nu= editnurb->first; nu; nu= nu->next) {
if(nu->pntsu>1 || nu->pntsv>1) {
if(nu->type==CU_NURBS) {
- pup= uiPupMenuBegin(C, "Direction", 0);
+ pup= uiPupMenuBegin(C, "Direction", ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemsEnumO(layout, op->type->idname, "direction");
uiPupMenuEnd(C, pup);
@@ -4466,24 +4860,99 @@ void CURVE_OT_cyclic_toggle(wmOperatorType *ot)
/***************** select linked operator ******************/
-static int select_linked_exec(bContext *C, wmOperator *op)
+static int select_linked_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
- RegionView3D *rv3d= ED_view3d_context_rv3d(C);
+ Curve *cu= (Curve*)obedit->data;
+ EditNurb *editnurb= cu->editnurb;
+ ListBase *nurbs= &editnurb->nurbs;
+ Nurb *nu;
+ BezTriple *bezt;
+ BPoint *bp;
+ int a;
+
+ for(nu= nurbs->first; nu; nu= nu->next) {
+ if(nu->type == CU_BEZIER) {
+ bezt= nu->bezt;
+ a= nu->pntsu;
+ while(a--) {
+ if( (bezt->f1 & SELECT) || (bezt->f2 & SELECT) || (bezt->f3 & SELECT) ) {
+ a= nu->pntsu;
+ bezt= nu->bezt;
+ while(a--) {
+ select_beztriple(bezt, SELECT, 1, VISIBLE);
+ bezt++;
+ }
+ break;
+ }
+ bezt++;
+ }
+ }
+ else {
+ bp= nu->bp;
+ a= nu->pntsu*nu->pntsv;
+ while(a--) {
+ if( bp->f1 & 1 ) {
+ a= nu->pntsu*nu->pntsv;
+ bp= nu->bp;
+ while(a--) {
+ select_bpoint(bp, SELECT, 1, VISIBLE);
+ bp++;
+ }
+ break;
+ }
+ bp++;
+ }
+ }
+ }
+
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
+
+ return OPERATOR_FINISHED;
+}
+
+static int select_linked_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+{
+ return select_linked_exec(C, op);
+}
+
+void CURVE_OT_select_linked(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select Linked All";
+ ot->idname= "CURVE_OT_select_linked";
+
+ /* api callbacks */
+ ot->exec= select_linked_exec;
+ ot->invoke= select_linked_invoke;
+ ot->poll= ED_operator_editsurfcurve;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+}
+
+
+/***************** select linked pick operator ******************/
+
+static int select_linked_pick_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ ARegion *ar= CTX_wm_region(C);
ViewContext vc;
Nurb *nu;
BezTriple *bezt;
BPoint *bp;
int a, location[2], deselect;
- if(!rv3d)
- return OPERATOR_CANCELLED;
-
deselect= RNA_boolean_get(op->ptr, "deselect");
- RNA_int_get_array(op->ptr, "location", location);
-
+ location[0]= event->x - ar->winrct.xmin;
+ location[1]= event->y - ar->winrct.ymin;
+
view3d_operator_needs_opengl(C);
view3d_set_viewcontext(C, &vc);
+
findnearestNurbvert(&vc, 1, location, &nu, &bezt, &bp);
if(bezt) {
@@ -4506,44 +4975,30 @@ static int select_linked_exec(bContext *C, wmOperator *op)
}
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
-
- return OPERATOR_FINISHED;
-}
-
-static int select_linked_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- ARegion *ar= CTX_wm_region(C);
- int location[2];
- location[0]= event->x - ar->winrct.xmin;
- location[1]= event->y - ar->winrct.ymin;
- RNA_int_set_array(op->ptr, "location", location);
-
- return select_linked_exec(C, op);
+ return OPERATOR_FINISHED;
}
-void CURVE_OT_select_linked(wmOperatorType *ot)
+void CURVE_OT_select_linked_pick(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select Linked";
- ot->idname= "CURVE_OT_select_linked";
-
+ ot->idname= "CURVE_OT_select_linked_pick";
+
/* api callbacks */
- ot->exec= select_linked_exec;
- ot->invoke= select_linked_invoke;
- ot->poll= ED_operator_editsurfcurve;
+ ot->invoke= select_linked_pick_invoke;
+ ot->poll= ED_operator_editsurfcurve_region_view3d;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "Deselect linked control points rather than selecting them.");
- RNA_def_int_vector(ot->srna, "location", 2, NULL, 0, INT_MAX, "Location", "", 0, 16384);
}
/***************** select row operator **********************/
-static int select_row_exec(bContext *C, wmOperator *op)
+static int select_row_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
@@ -4618,7 +5073,7 @@ void CURVE_OT_select_row(wmOperatorType *ot)
/***************** select next operator **********************/
-static int select_next_exec(bContext *C, wmOperator *op)
+static int select_next_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -4645,7 +5100,7 @@ void CURVE_OT_select_next(wmOperatorType *ot)
/***************** select previous operator **********************/
-static int select_previous_exec(bContext *C, wmOperator *op)
+static int select_previous_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -4672,7 +5127,7 @@ void CURVE_OT_select_previous(wmOperatorType *ot)
/***************** select more operator **********************/
-static int select_more_exec(bContext *C, wmOperator *op)
+static int select_more_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -4760,7 +5215,7 @@ void CURVE_OT_select_more(wmOperatorType *ot)
/******************** select less operator *****************/
/* basic method: deselect if control point doesn't have all neighbours selected */
-static int select_less_exec(bContext *C, wmOperator *op)
+static int select_less_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -5111,7 +5566,7 @@ void CURVE_OT_select_nth(wmOperatorType *ot)
/********************** add duplicate operator *********************/
-static int duplicate_exec(bContext *C, wmOperator *op)
+static int duplicate_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
@@ -5121,7 +5576,7 @@ static int duplicate_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
duplicate_exec(C, op);
@@ -5168,10 +5623,13 @@ static int delete_exec(bContext *C, wmOperator *op)
} else {
keyIndex_delNurbList(editnurb, nubase);
freeNurblist(nubase);
+
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -5237,6 +5695,7 @@ static int delete_exec(bContext *C, wmOperator *op)
if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
memmove(bezt, bezt+1, (nu->pntsu-a-1)*sizeof(BezTriple));
keyIndex_delBezt(editnurb, bezt + delta);
+ keyIndex_updateBezt(editnurb, bezt + 1, bezt, nu->pntsu-a-1);
nu->pntsu--;
a--;
type= 1;
@@ -5248,7 +5707,7 @@ static int delete_exec(bContext *C, wmOperator *op)
bezt1 =
(BezTriple*)MEM_mallocN((nu->pntsu) * sizeof(BezTriple), "delNurb");
memcpy(bezt1, nu->bezt, (nu->pntsu)*sizeof(BezTriple) );
- keyIndex_updateBezt(editnurb, nu->bezt, bezt1, nu->pntsu, 1);
+ keyIndex_updateBezt(editnurb, nu->bezt, bezt1, nu->pntsu);
MEM_freeN(nu->bezt);
nu->bezt= bezt1;
calchandlesNurb(nu);
@@ -5262,6 +5721,7 @@ static int delete_exec(bContext *C, wmOperator *op)
if( bp->f1 & SELECT ) {
memmove(bp, bp+1, (nu->pntsu-a-1)*sizeof(BPoint));
keyIndex_delBP(editnurb, bp + delta);
+ keyIndex_updateBP(editnurb, bp+1, bp, nu->pntsu-a-1);
nu->pntsu--;
a--;
type= 1;
@@ -5274,7 +5734,7 @@ static int delete_exec(bContext *C, wmOperator *op)
if(type) {
bp1 = (BPoint*)MEM_mallocN(nu->pntsu * sizeof(BPoint), "delNurb2");
memcpy(bp1, nu->bp, (nu->pntsu)*sizeof(BPoint) );
- keyIndex_updateBP(editnurb, nu->bp, bp1, nu->pntsu, 1);
+ keyIndex_updateBP(editnurb, nu->bp, bp1, nu->pntsu);
MEM_freeN(nu->bp);
nu->bp= bp1;
@@ -5285,18 +5745,17 @@ static int delete_exec(bContext *C, wmOperator *op)
clamp_nurb_order_u(nu);
}*/
}
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
}
nu= next;
}
}
else if(type==1) { /* erase segment */
/* find the 2 selected points */
- bezt1= bezt2= 0;
- bp1= bp2= 0;
- nu= nubase->first;
- nu1= 0;
- while(nu) {
+ bezt1= bezt2= NULL;
+ bp1= bp2= NULL;
+ nu1= NULL;
+ for(nu= nubase->first; nu; nu= nu->next) {
next= nu->next;
if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
@@ -5310,8 +5769,9 @@ static int delete_exec(bContext *C, wmOperator *op)
bezt2= bezt+(nu->pntsu-1);
if( (bezt2->f1 & SELECT) || (bezt2->f2 & SELECT) || (bezt2->f3 & SELECT) ) {
nu->flagu &= ~CU_NURB_CYCLIC;
+ calchandlesNurb(nu);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
}
}
@@ -5337,7 +5797,7 @@ static int delete_exec(bContext *C, wmOperator *op)
if( bp2->f1 & SELECT ) {
nu->flagu &= ~CU_NURB_CYCLIC;
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
}
}
@@ -5351,8 +5811,6 @@ static int delete_exec(bContext *C, wmOperator *op)
}
}
if(nu1) break;
-
- nu= nu->next;
}
if(nu1) {
if(bezt1) {
@@ -5438,27 +5896,30 @@ static int delete_exec(bContext *C, wmOperator *op)
freeNurblist(nubase);
}
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
+
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
-static int delete_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int delete_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Object *obedit= CTX_data_edit_object(C);
uiPopupMenu *pup;
uiLayout *layout;
if(obedit->type==OB_SURF) {
- pup= uiPupMenuBegin(C, "Delete", 0);
+ pup= uiPupMenuBegin(C, "Delete", ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemEnumO(layout, op->type->idname, NULL, 0, "type", 0);
uiItemEnumO(layout, op->type->idname, NULL, 0, "type", 2);
uiPupMenuEnd(C, pup);
}
else {
- pup= uiPupMenuBegin(C, "Delete", 0);
+ pup= uiPupMenuBegin(C, "Delete", ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemsEnumO(layout, op->type->idname, "type");
uiPupMenuEnd(C, pup);
@@ -5511,7 +5972,7 @@ static int shade_smooth_exec(bContext *C, wmOperator *op)
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -5546,7 +6007,7 @@ void CURVE_OT_shade_flat(wmOperatorType *ot)
/************** join operator, to be used externally? ****************/
-int join_curve_exec(bContext *C, wmOperator *op)
+int join_curve_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -5609,7 +6070,7 @@ int join_curve_exec(bContext *C, wmOperator *op)
CTX_DATA_END;
cu= ob->data;
- addlisttolist(&cu->nurb, &tempbase);
+ BLI_movelisttolist(&cu->nurb, &tempbase);
DAG_scene_sort(bmain, scene); // because we removed object(s), call before editmode!
@@ -5622,27 +6083,71 @@ int join_curve_exec(bContext *C, wmOperator *op)
}
/************ add primitive, used by object/ module ****************/
-Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
+
+static const char *get_curve_defname(int type)
+{
+ int stype= type & CU_PRIMITIVE;
+
+ if((type & CU_TYPE)==CU_BEZIER) {
+ switch (stype) {
+ case CU_PRIM_CURVE: return "BezierCurve";
+ case CU_PRIM_CIRCLE: return "BezierCircle";
+ case CU_PRIM_PATH: return "CurvePath";
+ default:
+ return "Curve";
+ }
+ }
+ else {
+ switch (stype) {
+ case CU_PRIM_CURVE: return "NurbsCurve";
+ case CU_PRIM_CIRCLE: return "NurbsCircle";
+ case CU_PRIM_PATH: return "NurbsPath";
+ default:
+ return "Curve";
+ }
+ }
+}
+
+static const char *get_surf_defname(int type)
+{
+ int stype= type & CU_PRIMITIVE;
+
+ switch (stype) {
+ case CU_PRIM_CURVE: return "SurfCurve";
+ case CU_PRIM_CIRCLE: return "SurfCircle";
+ case CU_PRIM_PATCH: return "SurfPatch";
+ case CU_PRIM_SPHERE: return "SurfSphere";
+ case CU_PRIM_DONUT: return "SurfTorus";
+ default:
+ return "Surface";
+ }
+}
+
+
+Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newob)
{
static int xzproj= 0; /* this function calls itself... */
- Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
View3D *v3d= CTX_wm_view3d(C);
+ RegionView3D *rv3d= ED_view3d_context_rv3d(C);
Nurb *nu = NULL;
BezTriple *bezt;
BPoint *bp;
- float vec[3];
- float fac, grid;
- int a, b, cutype, stype;
- int force_3d = ((Curve *)obedit->data)->flag & CU_3D; /* could be adding to an existing 3D curve */
-
- cutype= type & CU_TYPE; // poly, bezier, nurbs, etc
- stype= type & CU_PRIMITIVE;
-
- if (v3d) grid = v3d->grid;
- else grid = 1.0;
-
+ Curve *cu= (Curve*)obedit->data;
+ float vec[3], zvec[3]= {0.0f, 0.0f, 1.0f};
+ float umat[4][4]= MAT4_UNITY, viewmat[4][4]= MAT4_UNITY;
+ float fac;
+ int a, b;
+ const float grid= v3d ? v3d->grid : 1.0f;
+ const int cutype= (type & CU_TYPE); // poly, bezier, nurbs, etc
+ const int stype= (type & CU_PRIMITIVE);
+ const int force_3d = ((Curve *)obedit->data)->flag & CU_3D; /* could be adding to an existing 3D curve */
+
+ if(rv3d) {
+ copy_m4_m4(viewmat, rv3d->viewmat);
+ VECCOPY(zvec, rv3d->viewinv[2]);
+ }
setflagsNurb(editnurb, 0);
@@ -5650,17 +6155,13 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
if (stype!=CU_PRIM_TUBE && stype!=CU_PRIM_DONUT) {
nu = (Nurb*)MEM_callocN(sizeof(Nurb), "addNurbprim");
nu->type= cutype;
- nu->resolu= 4;
- nu->resolv= 4;
+ nu->resolu= cu->resolu;
+ nu->resolv= cu->resolv;
}
switch(stype) {
case CU_PRIM_CURVE: /* curve */
- nu->resolu= 12; /* set as 4 above */
- if(newname) {
- rename_id((ID *)obedit, "Curve");
- rename_id((ID *)obedit->data, "Curve");
- }
+ nu->resolu= cu->resolu;
if(cutype==CU_BEZIER) {
if (!force_3d) nu->flag |= CU_2D;
nu->pntsu= 2;
@@ -5722,8 +6223,8 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
for(a=0;a<4;a++, bp++) mul_m4_v3(mat,bp->vec);
if(cutype==CU_NURBS) {
- nu->knotsu= 0; /* makeknots allocates */
- makeknots(nu, 1);
+ nu->knotsu= NULL; /* nurbs_knot_calc_u allocates */
+ nurbs_knot_calc_u(nu);
}
}
@@ -5733,7 +6234,7 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
nu->pntsv= 1;
nu->orderu= 5;
nu->flagu= CU_NURB_ENDPOINT; /* endpoint */
- nu->resolu= 8;
+ nu->resolu= cu->resolu;
nu->bp= callocstructN(BPoint, 5, "addNurbprim3");
bp= nu->bp;
@@ -5756,17 +6257,14 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
for(a=0;a<5;a++, bp++) mul_m4_v3(mat,bp->vec);
if(cutype==CU_NURBS) {
- nu->knotsu= 0; /* makeknots allocates */
- makeknots(nu, 1);
+ nu->knotsu= NULL; /* nurbs_knot_calc_u allocates */
+ nurbs_knot_calc_u(nu);
}
break;
case CU_PRIM_CIRCLE: /* circle */
- nu->resolu= 12; /* set as 4 above */
- if(newname) {
- rename_id((ID *)obedit, "CurveCircle");
- rename_id((ID *)obedit->data, "CurveCircle");
- }
+ nu->resolu= cu->resolu;
+
if(cutype==CU_BEZIER) {
if (!force_3d) nu->flag |= CU_2D;
nu->pntsu= 4;
@@ -5821,7 +6319,7 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
bp->vec[0]+= 0.25*nurbcircle[a][0]*grid-.75*grid;
bp->vec[2]+= 0.25*nurbcircle[a][1]*grid;
}
- if(a & 1) bp->vec[3]= 0.25*sqrt(2.0);
+ if(a & 1) bp->vec[3]= 0.25*M_SQRT2;
else bp->vec[3]= 1.0;
mul_m4_v3(mat,bp->vec);
bp->radius = bp->weight = 1.0;
@@ -5829,15 +6327,11 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
bp++;
}
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
}
break;
case CU_PRIM_PATCH: /* 4x4 patch */
if( cutype==CU_NURBS ) { /* nurb */
- if(newname) {
- rename_id((ID *)obedit, "Surf");
- rename_id((ID *)obedit->data, "Surf");
- }
nu->pntsu= 4;
nu->pntsv= 4;
@@ -5865,25 +6359,25 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
}
}
- makeknots(nu, 1);
- makeknots(nu, 2);
+ nurbs_knot_calc_u(nu);
+ nurbs_knot_calc_v(nu);
}
break;
case CU_PRIM_TUBE: /* Cylinder */
if( cutype==CU_NURBS ) {
- Curve *cu= (Curve*)obedit->data;
-
- if(newname) {
- rename_id((ID *)obedit, "SurfCylinder");
- rename_id((ID *)obedit->data, "SurfCylinder");
- }
-
nu= add_nurbs_primitive(C, mat, CU_NURBS|CU_PRIM_CIRCLE, 0); /* circle */
- nu->resolu= 4;
+ nu->resolu= cu->resolu;
nu->flag= CU_SMOOTH;
BLI_addtail(editnurb, nu); /* temporal for extrude and translate */
vec[0]=vec[1]= 0.0;
vec[2]= -grid;
+
+ if(newob && (U.flag & USER_ADD_VIEWALIGNED) == 0) {
+ /* pass */
+ }
+ else {
+ mul_mat3_m4_v3(mat, vec);
+ }
translateflagNurb(editnurb, 1, vec);
extrudeflagNurb(cu->editnurb, 1);
@@ -5905,18 +6399,13 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
case CU_PRIM_SPHERE: /* sphere */
if( cutype==CU_NURBS ) {
float tmp_cent[3] = {0.f, 0.f, 0.f};
- float tmp_vec[3] = {0.f, 0.f, 0.f};
+ float tmp_vec[3] = {0.f, 0.f, 1.f};
- if(newname) {
- rename_id((ID *)obedit, "SurfSphere");
- rename_id((ID *)obedit->data, "SurfSphere");
- }
-
nu->pntsu= 5;
nu->pntsv= 1;
nu->orderu= 3;
- nu->resolu= 4;
- nu->resolv= 4;
+ nu->resolu= cu->resolu;
+ nu->resolv= cu->resolv;
nu->flag= CU_SMOOTH;
nu->bp= callocstructN(BPoint, 5, "addNurbprim6");
nu->flagu= 0;
@@ -5926,21 +6415,21 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
bp->f1= SELECT;
bp->vec[0]+= nurbcircle[a][0]*grid;
bp->vec[2]+= nurbcircle[a][1]*grid;
- if(a & 1) bp->vec[3]= 0.5*sqrt(2.0);
+ if(a & 1) bp->vec[3]= 0.5*M_SQRT2;
else bp->vec[3]= 1.0;
mul_m4_v3(mat,bp->vec);
bp++;
}
nu->flagu= CU_NURB_BEZIER;
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
BLI_addtail(editnurb, nu); /* temporal for spin */
- if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0)
- spin_nurb(C, scene, obedit, tmp_vec, tmp_cent, 2);
- else
- spin_nurb(C, scene, obedit, tmp_vec, mat[3], 2);
- makeknots(nu, 2);
+ if(newob && (U.flag & USER_ADD_VIEWALIGNED) == 0) spin_nurb(umat, obedit, tmp_vec, tmp_cent);
+ else if ((U.flag & USER_ADD_VIEWALIGNED)) spin_nurb(viewmat, obedit, zvec, mat[3]);
+ else spin_nurb(umat, obedit, tmp_vec, mat[3]);
+
+ nurbs_knot_calc_v(nu);
a= nu->pntsu*nu->pntsv;
bp= nu->bp;
@@ -5954,24 +6443,21 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
case CU_PRIM_DONUT: /* torus */
if( cutype==CU_NURBS ) {
float tmp_cent[3] = {0.f, 0.f, 0.f};
- float tmp_vec[3] = {0.f, 0.f, 0.f};
+ float tmp_vec[3] = {0.f, 0.f, 1.f};
- if(newname) {
- rename_id((ID *)obedit, "SurfTorus");
- rename_id((ID *)obedit->data, "SurfTorus");
- }
-
xzproj= 1;
nu= add_nurbs_primitive(C, mat, CU_NURBS|CU_PRIM_CIRCLE, 0); /* circle */
xzproj= 0;
- nu->resolu= 4;
- nu->resolv= 4;
+ nu->resolu= cu->resolu;
+ nu->resolv= cu->resolv;
nu->flag= CU_SMOOTH;
- BLI_addtail(editnurb, nu); /* temporal for extrude and translate */
- if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0)
- spin_nurb(C, scene, obedit, tmp_vec, tmp_cent, 2);
- else
- spin_nurb(C, scene, obedit, tmp_vec, mat[3], 2);
+ BLI_addtail(editnurb, nu); /* temporal for spin */
+
+ /* same as above */
+ if(newob && (U.flag & USER_ADD_VIEWALIGNED) == 0) spin_nurb(umat, obedit, tmp_vec, tmp_cent);
+ else if ((U.flag & USER_ADD_VIEWALIGNED)) spin_nurb(viewmat, obedit, zvec, mat[3]);
+ else spin_nurb(umat, obedit, tmp_vec, mat[3]);
+
BLI_remlink(editnurb, nu);
@@ -5984,6 +6470,10 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
}
break;
+
+ default: /* should never happen */
+ BLI_assert(!"invalid nurbs type");
+ return NULL;
}
/* always do: */
@@ -6011,21 +6501,43 @@ static int curvesurf_prim_add(bContext *C, wmOperator *op, int type, int isSurf)
if (!isSurf) { /* adding curve */
if(obedit==NULL || obedit->type!=OB_CURVE) {
Curve *cu;
+
obedit= ED_object_add_type(C, OB_CURVE, loc, rot, TRUE, layer);
newob = 1;
cu= (Curve*)obedit->data;
cu->flag |= CU_DEFORM_FILL;
+
if(type & CU_PRIM_PATH)
cu->flag |= CU_PATH|CU_3D;
- } else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
- } else { /* adding surface */
+ }
+ else DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
+ }
+ else { /* adding surface */
if(obedit==NULL || obedit->type!=OB_SURF) {
obedit= ED_object_add_type(C, OB_SURF, loc, rot, TRUE, layer);
newob = 1;
- } else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ }
+ else DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
}
+ /* rename here, the undo stack checks name for valid undo pushes */
+ if(newob) {
+
+ if(obedit->type==OB_CURVE) {
+ rename_id((ID *)obedit, get_curve_defname(type));
+ rename_id((ID *)obedit->data, get_curve_defname(type));
+ }
+ else {
+ rename_id((ID *)obedit, get_surf_defname(type));
+ rename_id((ID *)obedit->data, get_surf_defname(type));
+ }
+ }
+
+ /* ED_object_add_type doesnt do an undo, is needed for redo operator on primitive */
+ if(newob && enter_editmode)
+ ED_undo_push(C, "Enter Editmode");
+
ED_object_new_primitive_matrix(C, obedit, loc, rot, mat);
nu= add_nurbs_primitive(C, mat, type, newob);
@@ -6308,7 +6820,7 @@ void SURFACE_OT_primitive_nurbs_surface_torus_add(wmOperatorType *ot)
/***************** clear tilt operator ********************/
-static int clear_tilt_exec(bContext *C, wmOperator *op)
+static int clear_tilt_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
@@ -6338,7 +6850,7 @@ static int clear_tilt_exec(bContext *C, wmOperator *op)
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -6376,23 +6888,35 @@ static void *undo_check_lastsel(void *lastsel, Nurb *nu, Nurb *newnu)
return NULL;
}
-static void undoCurve_to_editCurve(void *ucu, void *cue)
+static void undoCurve_to_editCurve(void *ucu, void *obe)
{
- Curve *cu= cue;
+ Object *obedit= obe;
+ Curve *cu= (Curve*)obedit->data;
UndoCurve *undoCurve= ucu;
ListBase *undobase= &undoCurve->nubase;
ListBase *editbase= ED_curve_editnurbs(cu);
Nurb *nu, *newnu;
EditNurb *editnurb= cu->editnurb;
void *lastsel= NULL;
+ AnimData *ad= BKE_animdata_from_id(&cu->id);
freeNurblist(editbase);
if (undoCurve->undoIndex) {
- BLI_ghash_free(editnurb->keyindex, NULL, (GHashValFreeFP)free_nodeKeyIndex);
+ BLI_ghash_free(editnurb->keyindex, NULL, (GHashValFreeFP)free_cvKeyIndex);
editnurb->keyindex= dupli_keyIndexHash(undoCurve->undoIndex);
}
+ if(ad) {
+ if(ad->action) {
+ free_fcurves(&ad->action->curves);
+ copy_fcurves(&ad->action->curves, &undoCurve->fcurves);
+ }
+
+ free_fcurves(&ad->drivers);
+ copy_fcurves(&ad->drivers, &undoCurve->drivers);
+ }
+
/* copy */
for(nu= undobase->first; nu; nu= nu->next) {
newnu= duplicateNurb(nu);
@@ -6409,16 +6933,20 @@ static void undoCurve_to_editCurve(void *ucu, void *cue)
}
cu->lastsel= lastsel;
+
+ ED_curve_updateAnimPaths(obedit);
}
-static void *editCurve_to_undoCurve(void *cue)
+static void *editCurve_to_undoCurve(void *obe)
{
- Curve *cu= cue;
+ Object *obedit= obe;
+ Curve *cu= (Curve*)obedit->data;
ListBase *nubase= ED_curve_editnurbs(cu);
UndoCurve *undoCurve;
EditNurb *editnurb= cu->editnurb, tmpEditnurb;
Nurb *nu, *newnu;
void *lastsel= NULL;
+ AnimData *ad= BKE_animdata_from_id(&cu->id);
undoCurve= MEM_callocN(sizeof(UndoCurve), "undoCurve");
@@ -6427,6 +6955,13 @@ static void *editCurve_to_undoCurve(void *cue)
tmpEditnurb.keyindex= undoCurve->undoIndex;
}
+ if(ad) {
+ if(ad->action)
+ copy_fcurves(&undoCurve->fcurves, &ad->action->curves);
+
+ copy_fcurves(&undoCurve->drivers, &ad->drivers);
+ }
+
/* copy */
for(nu= nubase->first; nu; nu= nu->next) {
newnu= duplicateNurb(nu);
@@ -6453,9 +6988,11 @@ static void free_undoCurve(void *ucv)
freeNurblist(&undoCurve->nubase);
- if (undoCurve->undoIndex) {
- BLI_ghash_free(undoCurve->undoIndex, NULL, (GHashValFreeFP)free_nodeKeyIndex);
- }
+ if(undoCurve->undoIndex)
+ BLI_ghash_free(undoCurve->undoIndex, NULL, (GHashValFreeFP)free_cvKeyIndex);
+
+ free_fcurves(&undoCurve->fcurves);
+ free_fcurves(&undoCurve->drivers);
MEM_freeN(undoCurve);
}
@@ -6463,11 +7000,11 @@ static void free_undoCurve(void *ucv)
static void *get_data(bContext *C)
{
Object *obedit= CTX_data_edit_object(C);
- return obedit->data;
+ return obedit;
}
/* and this is all the undo system needs to know */
-void undo_push_curve(bContext *C, char *name)
+void undo_push_curve(bContext *C, const char *name)
{
undo_editmode_push(C, name, get_data, free_undoCurve, undoCurve_to_editCurve, editCurve_to_undoCurve, NULL);
}
@@ -6484,11 +7021,11 @@ ListBase *ED_curve_editnurbs(Curve *cu)
void ED_curve_beztcpy(EditNurb *editnurb, BezTriple *dst, BezTriple *src, int count)
{
memcpy(dst, src, count*sizeof(BezTriple));
- keyIndex_updateBezt(editnurb, src, dst, count, 0);
+ keyIndex_updateBezt(editnurb, src, dst, count);
}
void ED_curve_bpcpy(EditNurb *editnurb, BPoint *dst, BPoint *src, int count)
{
memcpy(dst, src, count*sizeof(BPoint));
- keyIndex_updateBP(editnurb, src, dst, count, 0);
+ keyIndex_updateBP(editnurb, src, dst, count);
}
diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c
index ae79c0b0053..44fec631441 100644
--- a/source/blender/editors/curve/editfont.c
+++ b/source/blender/editors/curve/editfont.c
@@ -40,6 +40,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_curve_types.h"
#include "DNA_object_types.h"
@@ -265,18 +266,18 @@ static void text_update_edited(bContext *C, Scene *scene, Object *obedit, int re
BKE_text_to_curve(scene, obedit, mode);
if(recalc)
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
}
/********************** insert lorem operator *********************/
-static int insert_lorem_exec(bContext *C, wmOperator *op)
+static int insert_lorem_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
- char *p, *p2;
+ const char *p, *p2;
int i;
- static char *lastlorem;
+ static const char *lastlorem;
if(lastlorem)
p= lastlorem;
@@ -299,7 +300,7 @@ static int insert_lorem_exec(bContext *C, wmOperator *op)
insert_into_textbuf(obedit, '\n');
insert_into_textbuf(obedit, '\n');
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -325,7 +326,7 @@ void FONT_OT_insert_lorem(wmOperatorType *ot)
/* note this handles both ascii and utf8 unicode, previously
* there were 3 functions that did effectively the same thing. */
-static int paste_file(bContext *C, ReportList *reports, char *filename)
+static int paste_file(bContext *C, ReportList *reports, const char *filename)
{
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
@@ -383,7 +384,7 @@ static int paste_file_exec(bContext *C, wmOperator *op)
return retval;
}
-static int paste_file_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int paste_file_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if(RNA_property_is_set(op->ptr, "filepath"))
return paste_file_exec(C, op);
@@ -414,9 +415,9 @@ void FONT_OT_file_paste(wmOperatorType *ot)
/******************* paste buffer operator ********************/
-static int paste_buffer_exec(bContext *C, wmOperator *op)
+static int paste_buffer_exec(bContext *C, wmOperator *UNUSED(op))
{
- char *filename;
+ const char *filename;
#ifdef WIN32
filename= "C:\\windows\\temp\\cutbuf.txt";
@@ -626,7 +627,7 @@ static int set_style(bContext *C, int style, int clear)
ef->textbufinfo[i].flag |= style;
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -714,7 +715,7 @@ static void copy_selection(Object *obedit)
}
}
-static int copy_text_exec(bContext *C, wmOperator *op)
+static int copy_text_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
@@ -737,7 +738,7 @@ void FONT_OT_text_copy(wmOperatorType *ot)
/******************* cut text operator ********************/
-static int cut_text_exec(bContext *C, wmOperator *op)
+static int cut_text_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
@@ -1220,7 +1221,7 @@ static int insert_text_exec(bContext *C, wmOperator *op)
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
char *inserted_utf8;
- wchar_t *inserted_text, first;
+ wchar_t *inserted_text;
int a, len;
if(!RNA_property_is_set(op->ptr, "text"))
@@ -1231,7 +1232,6 @@ static int insert_text_exec(bContext *C, wmOperator *op)
inserted_text= MEM_callocN(sizeof(wchar_t)*(len+1), "FONT_insert_text");
utf8towchar(inserted_text, inserted_utf8);
- first= inserted_text[0];
for(a=0; a<len; a++)
insert_into_textbuf(obedit, inserted_text[a]);
@@ -1259,6 +1259,12 @@ static int insert_text_invoke(bContext *C, wmOperator *op, wmEvent *evt)
if(RNA_property_is_set(op->ptr, "text"))
return insert_text_exec(C, op);
+
+ if(RNA_property_is_set(op->ptr, "accent")) {
+ if(cu->len!=0 && cu->pos>0)
+ accentcode= 1;
+ return OPERATOR_FINISHED;
+ }
/* tab should exit editmode, but we allow it to be typed using modifier keys */
if(event==TABKEY) {
@@ -1333,6 +1339,9 @@ static int insert_text_invoke(bContext *C, wmOperator *op, wmEvent *evt)
RNA_string_set(op->ptr, "text", inserted_utf8);
}
+ /* reset property? */
+ accentcode= 0;
+
return OPERATOR_FINISHED;
}
@@ -1353,6 +1362,7 @@ void FONT_OT_text_insert(wmOperatorType *ot)
/* properties */
RNA_def_string(ot->srna, "text", "", 0, "Text", "Text to insert at the cursor position.");
+ RNA_def_boolean(ot->srna, "accent", 0, "Accent mode", "Next typed character will strike through previous, for special character input.");
}
@@ -1367,7 +1377,7 @@ static int textbox_poll(bContext *C)
return 1;
}
-static int textbox_add_exec(bContext *C, wmOperator *op)
+static int textbox_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_active_object(C);
Curve *cu= obedit->data;
@@ -1585,7 +1595,7 @@ void FONT_OT_case_set(wmOperatorType *ot)
/********************** toggle case operator *********************/
-static int toggle_case_exec(bContext *C, wmOperator *op)
+static int toggle_case_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
@@ -1625,7 +1635,7 @@ void FONT_OT_case_toggle(wmOperatorType *ot)
/* **************** Open Font ************** */
-static void open_init(bContext *C, wmOperator *op)
+static void font_ui_template_init(bContext *C, wmOperator *op)
{
PropertyPointerRNA *pprop;
@@ -1633,7 +1643,7 @@ static void open_init(bContext *C, wmOperator *op)
uiIDContextProperty(C, &pprop->ptr, &pprop->prop);
}
-static int open_cancel(bContext *C, wmOperator *op)
+static int open_cancel(bContext *UNUSED(C), wmOperator *op)
{
MEM_freeN(op->customdata);
op->customdata= NULL;
@@ -1642,67 +1652,66 @@ static int open_cancel(bContext *C, wmOperator *op)
static int open_exec(bContext *C, wmOperator *op)
{
- Object *ob = CTX_data_active_object(C);
- Curve *cu;
VFont *font;
PropertyPointerRNA *pprop;
PointerRNA idptr;
char str[FILE_MAX];
-
RNA_string_get(op->ptr, "filepath", str);
font = load_vfont(str);
-
+
if(!font) {
if(op->customdata) MEM_freeN(op->customdata);
return OPERATOR_CANCELLED;
}
-
+
if(!op->customdata)
- open_init(C, op);
+ font_ui_template_init(C, op);
/* hook into UI */
pprop= op->customdata;
-
+
if(pprop->prop) {
/* when creating new ID blocks, use is already 1, but RNA
* pointer se also increases user, so this compensates it */
font->id.us--;
-
+
RNA_id_pointer_create(&font->id, &idptr);
RNA_property_pointer_set(&pprop->ptr, pprop->prop, idptr);
RNA_property_update(C, &pprop->ptr, pprop->prop);
- } else if(ob && ob->type == OB_FONT) {
- cu = ob->data;
- id_us_min(&cu->vfont->id);
- cu->vfont = font;
}
-
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_GEOM|ND_DATA|NA_EDITED, ob->data);
-
+
MEM_freeN(op->customdata);
-
+
return OPERATOR_FINISHED;
}
-static int open_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int open_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
- Object *ob = CTX_data_active_object(C);
- Curve *cu;
VFont *font=NULL;
char *path;
- if (ob && ob->type == OB_FONT) {
- cu = ob->data;
- font = cu->vfont;
+
+ PointerRNA idptr;
+ PropertyPointerRNA *pprop;
+
+ font_ui_template_init(C, op);
+
+ /* hook into UI */
+ pprop= op->customdata;
+
+ if(pprop->prop) {
+ idptr= RNA_property_pointer_get((PointerRNA *)pprop, pprop->prop);
+ font= idptr.id.data;
}
- path = (font && font->name)? font->name: U.fontdir;
-
+
+ path = (font && strcmp(font->name, FO_BUILTIN_NAME) != 0)? font->name: U.fontdir;
+
+ if(!RNA_property_is_set(op->ptr, "relative_path"))
+ RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
+
if(RNA_property_is_set(op->ptr, "filepath"))
return open_exec(C, op);
-
- open_init(C, op);
-
+
RNA_string_set(op->ptr, "filepath", path);
WM_event_add_fileselect(C, op);
@@ -1724,52 +1733,31 @@ void FONT_OT_open(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- WM_operator_properties_filesel(ot, FOLDERFILE|FTFONTFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH);
+ WM_operator_properties_filesel(ot, FOLDERFILE|FTFONTFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH|WM_FILESEL_RELPATH);
}
/******************* delete operator *********************/
-static int font_unlink_poll(bContext *C)
-{
- Object *ob = CTX_data_active_object(C);
- Curve *cu;
-
- if (!ED_operator_object_active_editable(C) ) return 0;
- if (ob->type != OB_FONT) return 0;
-
- cu = ob->data;
- if (cu && strcmp(cu->vfont->name, "<builtin>")==0) return 0;
- return 1;
-}
static int font_unlink_exec(bContext *C, wmOperator *op)
{
- Object *ob = CTX_data_active_object(C);
- Curve *cu;
- VFont *font, *builtin_font;
-
- cu = ob->data;
- font = cu->vfont;
+ VFont *builtin_font;
+
+ PointerRNA idptr;
+ PropertyPointerRNA pprop;
+
+ uiIDContextProperty(C, &pprop.ptr, &pprop.prop);
- if (!font) {
- BKE_report(op->reports, RPT_ERROR, "No font datablock available to unlink.");
+ if(pprop.prop==NULL) {
+ BKE_report(op->reports, RPT_ERROR, "Incorrect context for running font unlink");
return OPERATOR_CANCELLED;
}
-
- if (strcmp(font->name, "<builtin>")==0) {
- BKE_report(op->reports, RPT_WARNING, "Can't unlink the default builtin font.");
- return OPERATOR_FINISHED;
- }
- /* revert back to builtin font */
builtin_font = get_builtin_font();
- cu->vfont = builtin_font;
- id_us_plus(&cu->vfont->id);
- id_us_min(&font->id);
-
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_GEOM|ND_DATA|NA_EDITED, ob->data);
-
+ RNA_id_pointer_create(&builtin_font->id, &idptr);
+ RNA_property_pointer_set(&pprop.ptr, pprop.prop, idptr);
+ RNA_property_update(C, &pprop.ptr, pprop.prop);
+
return OPERATOR_FINISHED;
}
@@ -1782,7 +1770,6 @@ void FONT_OT_unlink(wmOperatorType *ot)
/* api callbacks */
ot->exec= font_unlink_exec;
- ot->poll= font_unlink_poll;
}
@@ -1839,7 +1826,7 @@ static void *get_undoFont(bContext *C)
}
/* and this is all the undo system needs to know */
-void undo_push_font(bContext *C, char *name)
+void undo_push_font(bContext *C, const char *name)
{
undo_editmode_push(C, name, get_undoFont, free_undoFont, undoFont_to_editFont, editFont_to_undoFont, NULL);
}
diff --git a/source/blender/editors/curve/lorem.c b/source/blender/editors/curve/lorem.c
index 449c620af06..b38b24ac33a 100644
--- a/source/blender/editors/curve/lorem.c
+++ b/source/blender/editors/curve/lorem.c
@@ -21,493 +21,634 @@
*/
#include "curve_intern.h"
-
-char *ED_lorem =
-"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. "
-"Aliquam tristique interdum sem. "
-"Nullam pretium, tortor non euismod varius, nulla odio sodales nulla, at bibendum lorem metus sed nulla. "
-"Vestibulum in lectus at pede blandit viverra. "
-"Fusce scelerisque ipsum nec enim. "
-"Fusce euismod nunc id enim. "
-"In venenatis cursus arcu. "
-"Aenean quis dui. "
-"Maecenas laoreet. "
-"Nulla tempor, arcu pulvinar pretium suscipit, tortor wisi dapibus libero, id ornare felis ipsum suscipit purus. "
-"Maecenas ipsum. "
-"Morbi cursus. "
-"Vestibulum diam purus, commodo et, convallis eu, posuere at, ligula. "
-"Nulla aliquam aliquet lorem. "
-"Nunc et mauris hendrerit est bibendum suscipit. "
-"Donec pellentesque libero eu nisl. "
-"Pellentesque eget libero. "
-"Donec tempus ipsum sed quam. "
-"Sed blandit nunc quis enim. "
-"Quisque lectus diam, adipiscing hendrerit, placerat non, pulvinar id, felis. "
-"In congue magna sit amet urna. "
-"Nunc non augue sed nisl dictum laoreet. "
-"Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. "
-"In venenatis dapibus massa. "
-"Nulla hendrerit sapien et quam. "
-"Nunc ac magna lobortis tellus tincidunt posuere. "
-"Cras augue mauris, mattis lobortis, fermentum at, semper ac, tellus. "
-"Cras vitae ligula sit amet sem posuere iaculis. "
-"Aliquam condimentum eleifend felis. "
-"Ut sit amet sapien. "
-"Suspendisse potenti. "
-"Mauris urna. "
-"Ut eu enim eu ante porta vestibulum. "
-"Aenean scelerisque est ac felis. "
-"Suspendisse auctor. "
-"Nunc pellentesque. "
-"Morbi laoreet ante et nibh. "
-"Donec feugiat arcu eget enim. "
-"Morbi vehicula tortor ac ipsum. "
-"Quisque lacus arcu, elementum ac, faucibus vel, posuere id, est. "
-"Proin commodo gravida sem. "
-"Vivamus tincidunt vehicula libero. "
-"Phasellus wisi. "
-"Maecenas pretium tellus eu sapien. "
-"Nunc sit amet nunc. "
-"In hac habitasse platea dictumst. "
-"Aenean dictum neque sed tortor. "
-"Donec et erat. "
-"Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed justo turpis, scelerisque ut, mattis sit amet, ornare rutrum, massa. "
-"Vestibulum bibendum enim sit amet velit. "
-"Vivamus tellus ipsum, luctus ut, consectetuer vitae, dignissim non, ligula. "
-"Phasellus lacinia wisi at est. "
-"Donec elit wisi, commodo non, placerat in, convallis id, elit. "
-"Nunc dolor dolor, vestibulum id, bibendum vitae, lacinia id, erat. "
-"Cras sit amet eros. "
-"Suspendisse suscipit lobortis lectus. "
-"Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. "
-"Cras orci. "
-"Praesent massa urna, lobortis semper, auctor a, pretium vitae, tellus. "
-"Curabitur at purus. "
-"Morbi tortor quam, imperdiet venenatis, egestas a, cursus eu, est. "
-"Nunc interdum lectus sit amet libero. "
-"Quisque dignissim placerat ligula. "
-"Nunc porttitor posuere arcu. "
-"Mauris faucibus quam at massa. "
-"Vivamus sodales aliquet mauris. "
-"In id ante. "
-"Pellentesque varius ipsum in arcu. "
-"Fusce mauris lacus, tristique ac, lobortis quis, lobortis luctus, pede. "
-"Sed wisi. "
-"Vestibulum mattis. "
-"Maecenas hendrerit sem nec purus. "
-"Proin id quam. "
-"Cras nec mauris. "
-"Integer orci. "
-"Nullam dui sem, molestie sed, egestas quis, cursus in, magna. "
-"Mauris neque lacus, consectetuer nec, sagittis eu, porttitor eget, dui. "
-"Fusce consectetuer. "
-"Donec nec tellus quis leo lobortis ullamcorper. "
-"Etiam metus urna, aliquet pretium, ultrices eu, cursus ut, turpis. "
-"Morbi bibendum vehicula lectus. "
-"Sed non ante vitae arcu pellentesque tempor. "
-"Fusce sed ligula in sem tempor imperdiet. "
-"Aliquam vel est. "
-"Phasellus sollicitudin sollicitudin nibh. "
-"Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. "
-"Sed vel leo nec eros blandit imperdiet. "
-"Nulla facilisi. "
-"Suspendisse lobortis, dui ut fringilla hendrerit, justo purus ullamcorper ligula, ultricies ultrices dolor enim in libero. "
-"Sed elementum, pede eget porta convallis, dui nulla dignissim pede, eget vehicula odio ante at sem. "
-"Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. "
-"Sed ullamcorper tincidunt ipsum. "
-"Fusce risus nibh, accumsan sit amet, tempus eget, tristique ac, neque. "
-"Sed quis lorem ut tortor facilisis fermentum. "
-"Fusce pulvinar quam sit amet ipsum. "
-"Morbi ac elit quis tellus malesuada blandit. "
-"Maecenas suscipit sollicitudin sem. "
-"Nam sed eros vel lacus lobortis congue. "
-"Proin interdum nunc lobortis orci. "
-"Donec egestas enim eu odio. "
-"Vestibulum id metus. "
-"Pellentesque auctor, sem varius luctus tempus, libero magna cursus neque, et porttitor diam diam quis purus. "
-"Vestibulum sit amet dolor. "
-"Nulla in magna. "
-"Cras id diam at lectus faucibus placerat. "
-"Nunc porta posuere sapien. "
-"Etiam scelerisque. "
-"Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. "
-"Aliquam pellentesque mi sed tortor. "
-"Maecenas eleifend diam non urna. "
-"Donec luctus pharetra tellus. "
-"Proin ac ipsum eget libero bibendum volutpat. "
-"Cras id tellus. "
-"Nulla non risus. "
-"In dolor. "
-"Fusce scelerisque quam in massa ultrices porta. "
-"Morbi ut dolor eu massa egestas condimentum. "
-"Mauris vulputate. "
-"In hac habitasse platea dictumst. "
-"Suspendisse potenti. "
-"Mauris vehicula leo in tortor. "
-"Mauris vel erat a urna laoreet semper. "
-"Pellentesque ut metus ac tellus commodo eleifend. "
-"Suspendisse quis urna. "
-"Curabitur lacinia dignissim dui. "
-"Nam nec ante. "
-"In id enim. "
-"Aenean mattis enim. "
-"In ut neque porttitor risus hendrerit tincidunt. "
-"Suspendisse potenti. "
-"Ut vestibulum lectus vitae tortor. "
-"Duis velit. "
-"Nulla facilisi. "
-"Integer sit amet urna. "
-"Cras varius tortor in pede. "
-"Sed facilisis. "
-"Praesent lacinia libero nec nibh. "
-"Donec aliquam risus non nisl. "
-"Nam a nunc et felis tempor feugiat. "
-"Nunc metus. "
-"Vestibulum euismod, metus in semper laoreet, urna ipsum pharetra lorem, sed ultricies magna lorem sit amet wisi. "
-"Sed wisi. "
-"Nullam facilisis elit sed nisl. "
-"Phasellus mattis leo nec massa. "
-"Aenean malesuada. "
-"Cras wisi erat, lobortis nec, cursus eget, lobortis at, libero. "
-"In massa nisl, rutrum non, cursus nec, faucibus sed, lacus. "
-"Pellentesque malesuada. "
-"Cras euismod, neque ac suscipit tempus, velit lorem luctus elit, dapibus rhoncus wisi est ut sem. "
-"Proin vulputate enim in eros elementum accumsan. "
-"Ut lorem nisl, hendrerit et, interdum nec, lacinia in, dolor. "
-"Duis nec quam. "
-"Praesent velit felis, posuere id, luctus quis, laoreet ut, ipsum. "
-"Praesent eget arcu. "
-"Mauris massa felis, ornare non, ultrices id, tristique in, elit. "
-"Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. "
-"Phasellus vulputate, mi ac bibendum facilisis, libero enim suscipit leo, non nonummy pede diam eget nibh. "
-"Sed tempus. "
-"Aenean interdum suscipit dui. "
-"Aliquam erat volutpat. "
-"Ut malesuada. "
-"Nam commodo, nulla ut fringilla rutrum, orci elit viverra diam, vitae mollis odio odio et purus. "
-"Aliquam erat volutpat. "
-"Sed aliquet lobortis ipsum. "
-"In ut est. "
-"Etiam condimentum. "
-"Vestibulum pellentesque tortor pulvinar lacus. "
-"Aenean orci. "
-"Suspendisse lacus nulla, nonummy a, dictum vitae, egestas quis, eros. "
-"Donec auctor gravida nisl. "
-"Cras ac est rutrum augue pulvinar ornare. "
-"Phasellus mauris nibh, vulputate in, rhoncus imperdiet, dapibus eget, lacus. "
-"Nam nunc mauris, suscipit at, ultricies a, facilisis at, tellus. "
-"Nam accumsan mollis libero. "
-"Vivamus condimentum mattis est. "
-"Donec lacus. "
-"Nullam ac sapien id massa lobortis molestie. "
-"Pellentesque elementum. "
-"Proin ut purus. "
-"Integer et sapien quis turpis commodo mollis. "
-"Nulla consequat. "
-"Proin a wisi ut tellus blandit elementum. "
-"Aliquam nulla lorem, bibendum ac, malesuada vel, elementum et, metus. "
-"Phasellus egestas nibh et ligula. "
-"Vivamus diam odio, lacinia quis, malesuada quis, sollicitudin ut, eros. "
-"Phasellus aliquet lorem ac ipsum. "
-"Sed cursus tellus ac orci. "
-"Phasellus at nulla. "
-"Donec porta sodales ante. "
-"Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. "
-"Sed id lectus at massa ullamcorper tristique. "
-"Suspendisse porttitor lacus. "
-"In hac habitasse platea dictumst. "
-"Nunc non turpis. "
-"Sed sagittis. "
-"Morbi laoreet scelerisque dui. "
-"Nam arcu tellus, tempor vitae, vestibulum et, imperdiet ut, velit. "
-"In sit amet augue a arcu volutpat suscipit. "
-"Donec dictum ultrices lectus. "
-"Phasellus a purus et orci dictum lacinia. "
-"Ut leo. "
-"Cras semper, lorem sit amet tincidunt congue, justo eros varius pede, in bibendum turpis lectus non eros. "
-"Phasellus quam. "
-"Suspendisse mattis sollicitudin magna. "
-"Aenean facilisis diam vel nisl nonummy condimentum. "
-"Suspendisse vel dolor. "
-"Vestibulum nonummy. "
-"Mauris imperdiet semper ante. "
-"Maecenas vulputate eros. "
-"Vestibulum ac dolor. "
-"Fusce risus metus, aliquet eget, facilisis et, feugiat vel, orci. "
-"Ut at nunc id ante sodales vulputate. "
-"Duis tristique mattis ante. "
-"Vestibulum neque mauris, laoreet id, congue interdum, aliquet ut, diam. "
-"Nulla volutpat blandit magna. "
-"Donec accumsan congue diam. "
-"Etiam vel dui eget nisl tempor varius. "
-"Cras dictum massa sed enim. "
-"Cras urna tortor, fringilla ac, ullamcorper in, euismod vel, arcu. "
-"Morbi posuere luctus augue. "
-"Aliquam dui dui, adipiscing in, lobortis eu, luctus eu, nulla. "
-"Cras velit pede, ullamcorper sit amet, feugiat in, auctor vitae, ante. "
-"Suspendisse dictum fringilla mauris. "
-"In a nibh. "
-"Donec ac ligula. "
-"In quam. "
-"Praesent vitae urna ultricies sem aliquam placerat. "
-"Aliquam erat volutpat. "
-"Nam est. "
-"Donec faucibus sodales metus. "
-"Ut congue. "
-"Donec arcu tellus, pharetra ac, vulputate ac, mollis sed, lectus. "
-"Nulla facilisi. "
-"Nullam volutpat nunc et felis. "
-"Sed pede odio, tincidunt in, volutpat malesuada, feugiat gravida, nulla. "
-"Nulla aliquam pede vitae arcu. "
-"Proin velit elit, nonummy sit amet, elementum vitae, varius vitae, dolor. "
-"Donec rutrum ipsum eu mi. "
-"Aliquam et sem. "
-"In adipiscing rhoncus velit. "
-"Nam viverra scelerisque arcu. "
-"Aliquam sem. "
-"Sed tincidunt nulla quis massa. "
-"Mauris faucibus tempus nunc. "
-"Phasellus condimentum. "
-"Curabitur aliquet iaculis sapien. "
-"Nunc rhoncus, odio vitae bibendum dignissim, tellus libero commodo ipsum, ut sollicitudin nisl nisl vel justo. "
-"Nulla facilisi. "
-"Praesent blandit enim ut justo. "
-"Proin elementum, elit eget accumsan pulvinar, orci quam auctor neque, sed convallis diam purus vel felis. "
-"Sed orci leo, eleifend vel, blandit non, semper eu, purus. "
-"Proin bibendum, libero ac consectetuer commodo, eros sapien blandit nisl, eu eleifend nibh nibh vel lectus. "
-"Vivamus placerat. "
-"Integer odio dolor, pharetra non, sodales id, viverra eget, diam. "
-"Nunc mauris magna, egestas quis, feugiat id, fermentum viverra, mi. "
-"Aenean suscipit nisl non nunc. "
-"Proin quis lectus ac tellus nonummy commodo. "
-"Nunc eget diam ac elit vestibulum auctor. "
-"Etiam vulputate, odio sed lacinia consequat, justo mi vulputate purus, sit amet euismod libero metus sed tortor. "
-"Maecenas ac elit sed lorem vulputate gravida. "
-"Proin lectus eros, ullamcorper id, volutpat quis, condimentum tincidunt, sapien. "
-"Sed et massa eget lorem aliquet tempus. "
-"Duis porttitor nisl non risus. "
-"Nam id quam. "
-"Nullam est. "
-"Proin orci diam, posuere et, pharetra commodo, dictum vel, enim. "
-"Proin eget erat. "
-"Donec nisl. "
-"Maecenas auctor velit ut pede. "
-"Nunc vitae lectus nec libero tincidunt hendrerit. "
-"Quisque varius, erat ultrices ultrices euismod, purus lacus dictum eros, at condimentum enim dui nec magna. "
-"Morbi diam. "
-"Phasellus sed est. "
-"Phasellus nec libero in arcu fringilla sollicitudin. "
-"In rutrum nisl at arcu. "
-"Nulla facilisi. "
-"Mauris dignissim. "
-"Etiam est mauris, pharetra sed, viverra et, tincidunt sed, neque. "
-"Ut at lectus id nibh luctus ornare. "
-"Mauris varius porttitor risus. "
-"Ut vulputate aliquet risus. "
-"Vestibulum luctus neque sit amet nunc. "
-"Duis fermentum nibh. "
-"Pellentesque dapibus. "
-"Proin eros libero, aliquam non, condimentum a, sodales ut, turpis. "
-"Integer accumsan mi sed lorem. "
-"Vestibulum pellentesque sodales nisl. "
-"Nulla eu justo quis dui pretium rhoncus. "
-"Praesent viverra commodo mi. "
-"Maecenas dolor libero, viverra a, elementum vitae, aliquet vitae, dui. "
-"Mauris convallis lectus et mi. "
-"Mauris sagittis. "
-"Sed arcu. "
-"Pellentesque auctor. "
-"Donec pellentesque purus non tellus. "
-"Ut leo wisi, ultrices sit amet, ultrices eu, gravida ac, libero. "
-"Mauris fermentum dapibus diam. "
-"Integer quis lacus dapibus odio pellentesque varius. "
-"Fusce pede quam, vehicula ut, pulvinar et, tincidunt sed, felis. "
-"Curabitur eros enim, vulputate sed, aliquam ac, euismod ac, erat. "
-"Ut dignissim, lacus a interdum iaculis, enim orci posuere nunc, nec ultricies lectus risus in odio. "
-"Etiam et massa id dui commodo vehicula. "
-"Nunc blandit tortor quis dui. "
-"Quisque nisl. "
-"Sed venenatis blandit ligula. "
-"Fusce viverra imperdiet magna. "
-"Donec eget nunc quis est pharetra lobortis. "
-"Vestibulum quis lectus. "
-"Mauris vel orci lobortis nunc fermentum bibendum. "
-"Pellentesque eget leo. "
-"Morbi vel urna sit amet erat fermentum facilisis. "
-"Sed vulputate, libero et sollicitudin congue, wisi lectus sodales dolor, eget molestie magna orci vel tellus. "
-"Sed tempor ante et enim. "
-"Mauris elit. "
-"Curabitur ullamcorper vehicula massa. "
-"Sed viverra. "
-"Duis nulla. "
-"Nam bibendum. "
-"Nam tortor lorem, ullamcorper vitae, dictum sed, posuere eu, justo. "
-"Aliquam adipiscing arcu vitae turpis. "
-"Donec malesuada posuere libero. "
-"Ut sed tellus. "
-"Fusce sed nunc eget nisl dapibus malesuada. "
-"Suspendisse potenti. "
-"Integer tristique libero et metus. "
-"Vivamus posuere. "
-"Maecenas non sem non quam fermentum blandit. "
-"Duis risus tellus, rutrum vitae, imperdiet nec, malesuada nec, ipsum. "
-"Nunc quam dolor, luctus eget, placerat non, rhoncus at, tellus. "
-"Duis pede lectus, mattis adipiscing, tempor ut, porta at, mi. "
-"Pellentesque risus nulla, sodales sed, interdum id, nonummy vitae, ligula. "
-"Morbi pulvinar pede ut massa. "
-"Nunc risus mauris, tincidunt et, faucibus eu, suscipit vel, orci. "
-"In faucibus felis in arcu. "
-"Nulla sit amet elit. "
-"Nulla erat sapien, sagittis eget, dignissim eget, viverra eu, felis. "
-"Nam ac ipsum. "
-"Suspendisse vulputate turpis vel sem lacinia ullamcorper. "
-"Mauris ornare ipsum sed ligula. "
-"Duis facilisis neque quis orci. "
-"Nullam et erat et orci lacinia pellentesque. "
-"Donec ac ipsum. "
-"Duis molestie ipsum ac arcu. "
-"Aenean congue accumsan ante. "
-"Integer bibendum, leo ut ornare aliquam, nunc erat condimentum arcu, ut pulvinar mi augue et nulla. "
-"Quisque lacinia aliquet wisi. "
-"Vivamus nec dui. "
-"Etiam wisi leo, euismod vitae, vulputate a, dictum vitae, quam. "
-"Quisque quis tortor. "
-"Etiam interdum. "
-"In massa erat, porttitor sed, tincidunt vel, vehicula fringilla, augue. "
-"Nulla vel urna. "
-"In libero mi, pretium sed, mattis tempus, sagittis sed, massa. "
-"Suspendisse quam wisi, fermentum quis, sagittis at, consequat eget, odio. "
-"Nullam imperdiet, purus quis aliquam cursus, turpis odio egestas justo, placerat gravida turpis wisi vel tortor. "
-"Nunc ultricies porta purus. "
-"Proin elementum erat ac orci. "
-"Ut vel magna nec mi feugiat tincidunt. "
-"Ut ligula. "
-"Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec et magna in diam porta nonummy. "
-"Maecenas ut sem in turpis fermentum viverra. "
-"Suspendisse at orci. "
-"Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. "
-"Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque rutrum eleifend justo. "
-"Nullam vitae pede. "
-"Donec condimentum nibh et odio. "
-"Sed et metus. "
-"Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. "
-"Nam tempus. "
-"Sed ac wisi. "
-"In hac habitasse platea dictumst. "
-"Sed sed wisi. "
-"Ut facilisis tellus non ligula. "
-"Integer metus. "
-"In lacinia dui. "
-"Curabitur ornare. "
-"Mauris vel urna. "
-"Nam consectetuer dignissim urna. "
-"Nunc elementum porttitor erat. "
-"Sed blandit, risus non commodo nonummy, ligula erat fermentum nibh, eu facilisis ante neque sed sem. "
-"Etiam scelerisque justo eget wisi. "
-"Nunc dignissim. "
-"Proin pulvinar quam non lectus. "
-"Proin ut turpis quis augue pellentesque dictum. "
-"Fusce et lorem. "
-"Aliquam urna lacus, blandit sed, vestibulum sit amet, placerat et, dolor. "
-"Curabitur auctor erat nec lorem. "
-"Phasellus urna wisi, lacinia ut, molestie tincidunt, condimentum id, odio. "
-"Curabitur convallis ullamcorper justo. "
-"Donec vestibulum est ac quam. "
-"Nullam vitae elit eu massa varius vulputate. "
-"Nulla facilisi. "
-"Suspendisse potenti. "
-"Praesent non libero. "
-"Nullam tristique massa id magna viverra commodo. "
-"Vestibulum libero tortor, luctus ac, viverra congue, consectetuer vel, libero. "
-"Aenean arcu augue, luctus id, laoreet pulvinar, dictum sed, lectus. "
-"Donec vestibulum volutpat dolor. "
-"Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. "
-"Pellentesque augue turpis, laoreet nec, malesuada at, nonummy vitae, nibh. "
-"Etiam orci sapien, congue in, porttitor sit amet, rutrum vel, nibh. "
-"Integer eu lorem. "
-"Mauris pretium leo et elit. "
-"In nonummy ultricies sapien. "
-"Mauris varius. "
-"Mauris sed libero. "
-"Curabitur ullamcorper elit eu purus. "
-"Vestibulum velit pede, semper sit amet, lobortis vitae, tincidunt vel, dui. "
-"Nulla neque ante, sagittis eu, vestibulum et, lacinia a, libero. "
-"Morbi sit amet wisi. "
-"Pellentesque non felis quis arcu bibendum ornare. "
-"Aenean enim metus, commodo eu, hendrerit nonummy, euismod ut, quam. "
-"Nulla eleifend nisl quis dolor. "
-"Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. "
-"Maecenas pellentesque massa in erat molestie molestie. "
-"Mauris dignissim dapibus libero. "
-"Sed sed risus id neque dictum ornare. "
-"Sed eu ligula at felis sodales accumsan. "
-"Sed interdum, urna non pharetra hendrerit, quam mi ornare libero, id fringilla tortor orci non velit. "
-"Aliquam nec risus. "
-"Donec at nunc vitae tellus molestie vestibulum. "
-"Pellentesque vel justo. "
-"Duis ligula libero, vulputate quis, adipiscing bibendum, feugiat vitae, velit. "
-"Vivamus et arcu. "
-"Fusce eget quam. "
-"Ut ante. "
-"Suspendisse feugiat metus non ipsum. "
-"Nulla tempus leo ut mi. "
-"Curabitur vitae nisl. "
-"Vivamus elementum. "
-"Etiam a orci. "
-"Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus urna quam, tincidunt at, ultrices vel, feugiat eget, nulla. "
-"Maecenas lacus magna, nonummy eu, iaculis sed, consectetuer quis, enim. "
-"Praesent a eros. "
-"Aliquam nonummy dignissim neque. "
-"Nulla enim. "
-"Praesent molestie, orci quis tristique volutpat, lacus metus luctus sapien, et facilisis eros neque id sapien. "
-"Nunc condimentum dolor vel orci. "
-"Integer wisi diam, porttitor sit amet, feugiat in, dapibus in, lectus. "
-"Aliquam erat volutpat. "
-"Quisque mollis turpis vitae tortor. "
-"Mauris turpis mi, pretium ut, ultrices sed, porta in, justo. "
-"Suspendisse posuere. "
-"Quisque ultricies lacus vitae enim. "
-"Donec lacus. "
-"Suspendisse potenti. "
-"Donec molestie, magna sed euismod dictum, magna magna interdum diam, vitae sagittis leo lorem ac neque. "
-"Cras metus. "
-"Quisque nunc. "
-"Duis consectetuer. "
-"Vestibulum gravida sollicitudin urna. "
-"Integer volutpat, massa quis ultrices pulvinar, eros purus dignissim nunc, eget rhoncus enim lectus quis tortor. "
-"Integer lacinia quam quis erat convallis mattis. "
-"Suspendisse iaculis posuere velit. "
-"Etiam tellus enim, aliquet nec, laoreet a, molestie non, velit. "
-"Quisque lacus velit, eleifend imperdiet, fringilla id, dapibus scelerisque, lectus. "
-"Nulla quis lorem. "
-"Nulla malesuada neque et dui. "
-"Phasellus malesuada ultricies odio. "
-"Phasellus vitae ligula. "
-"Pellentesque feugiat arcu at erat. "
-"Vivamus ut eros ut lorem pulvinar iaculis. "
-"Proin lobortis ipsum id nunc. "
-"Curabitur vel massa. "
-"Suspendisse nulla ipsum, malesuada vel, posuere eget, mollis at, risus. "
-"Vestibulum sed diam id est dapibus ultrices. "
-"Proin tempus, eros a scelerisque vestibulum, ipsum arcu aliquam mi, ut feugiat libero odio in nisl. "
-"Quisque et massa a mauris luctus congue. "
-"Ut id eros. "
-"Fusce ante eros, pharetra non, molestie tristique, bibendum sit amet, wisi. "
-"Phasellus rutrum, dolor et semper elementum, eros ante malesuada massa, sed sollicitudin lectus velit et massa. "
-"In auctor. "
-"Aliquam erat volutpat. "
-"Etiam risus leo, vulputate suscipit, sollicitudin et, sodales eget, nisl. "
-"Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur lobortis, libero ac laoreet mollis, ligula leo porta wisi, ut euismod felis ligula id elit. "
-"Vivamus malesuada nulla eu enim. "
-"Donec accumsan faucibus orci. "
-"Nulla lacinia ante. "
-"Praesent at nibh. "
-"Mauris porta dignissim wisi. "
-"Ut lacinia tortor nec nunc. "
-"Phasellus et augue. "
-"Integer rhoncus, libero a pellentesque rhoncus, tortor sapien lobortis pede, eget condimentum sapien risus vitae elit. "
-"Suspendisse sed turpis ut dolor placerat dignissim. "
-"Quisque quis leo. "
-"Cras ultrices. "
-"Maecenas hendrerit auctor tortor. "
-"Etiam sit amet arcu. ";
+
+const char ED_lorem[]= {
+76, 111, 114, 101, 109, 32, 105, 112, 115, 117, 109, 32, 100, 111, 108, 111, 114, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32, 99,
+111, 110, 115, 101, 99, 116, 101, 116, 117, 101, 114, 32, 97, 100, 105, 112, 105, 115, 99, 105, 110, 103, 32, 101, 108, 105, 116, 46, 32, 65, 108, 105,
+113, 117, 97, 109, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 105, 110, 116, 101, 114, 100, 117, 109, 32, 115, 101, 109, 46, 32, 78, 117, 108,
+108, 97, 109, 32, 112, 114, 101, 116, 105, 117, 109, 44, 32, 116, 111, 114, 116, 111, 114, 32, 110, 111, 110, 32, 101, 117, 105, 115, 109, 111, 100, 32,
+118, 97, 114, 105, 117, 115, 44, 32, 110, 117, 108, 108, 97, 32, 111, 100, 105, 111, 32, 115, 111, 100, 97, 108, 101, 115, 32, 110, 117, 108, 108, 97,
+44, 32, 97, 116, 32, 98, 105, 98, 101, 110, 100, 117, 109, 32, 108, 111, 114, 101, 109, 32, 109, 101, 116, 117, 115, 32, 115, 101, 100, 32, 110, 117,
+108, 108, 97, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 105, 110, 32, 108, 101, 99, 116, 117, 115, 32, 97, 116, 32, 112, 101, 100,
+101, 32, 98, 108, 97, 110, 100, 105, 116, 32, 118, 105, 118, 101, 114, 114, 97, 46, 32, 70, 117, 115, 99, 101, 32, 115, 99, 101, 108, 101, 114, 105,
+115, 113, 117, 101, 32, 105, 112, 115, 117, 109, 32, 110, 101, 99, 32, 101, 110, 105, 109, 46, 32, 70, 117, 115, 99, 101, 32, 101, 117, 105, 115, 109,
+111, 100, 32, 110, 117, 110, 99, 32, 105, 100, 32, 101, 110, 105, 109, 46, 32, 73, 110, 32, 118, 101, 110, 101, 110, 97, 116, 105, 115, 32, 99, 117,
+114, 115, 117, 115, 32, 97, 114, 99, 117, 46, 32, 65, 101, 110, 101, 97, 110, 32, 113, 117, 105, 115, 32, 100, 117, 105, 46, 32, 77, 97, 101, 99,
+101, 110, 97, 115, 32, 108, 97, 111, 114, 101, 101, 116, 46, 32, 78, 117, 108, 108, 97, 32, 116, 101, 109, 112, 111, 114, 44, 32, 97, 114, 99, 117,
+32, 112, 117, 108, 118, 105, 110, 97, 114, 32, 112, 114, 101, 116, 105, 117, 109, 32, 115, 117, 115, 99, 105, 112, 105, 116, 44, 32, 116, 111, 114, 116,
+111, 114, 32, 119, 105, 115, 105, 32, 100, 97, 112, 105, 98, 117, 115, 32, 108, 105, 98, 101, 114, 111, 44, 32, 105, 100, 32, 111, 114, 110, 97, 114,
+101, 32, 102, 101, 108, 105, 115, 32, 105, 112, 115, 117, 109, 32, 115, 117, 115, 99, 105, 112, 105, 116, 32, 112, 117, 114, 117, 115, 46, 32, 77, 97,
+101, 99, 101, 110, 97, 115, 32, 105, 112, 115, 117, 109, 46, 32, 77, 111, 114, 98, 105, 32, 99, 117, 114, 115, 117, 115, 46, 32, 86, 101, 115, 116,
+105, 98, 117, 108, 117, 109, 32, 100, 105, 97, 109, 32, 112, 117, 114, 117, 115, 44, 32, 99, 111, 109, 109, 111, 100, 111, 32, 101, 116, 44, 32, 99,
+111, 110, 118, 97, 108, 108, 105, 115, 32, 101, 117, 44, 32, 112, 111, 115, 117, 101, 114, 101, 32, 97, 116, 44, 32, 108, 105, 103, 117, 108, 97, 46,
+32, 78, 117, 108, 108, 97, 32, 97, 108, 105, 113, 117, 97, 109, 32, 97, 108, 105, 113, 117, 101, 116, 32, 108, 111, 114, 101, 109, 46, 32, 78, 117,
+110, 99, 32, 101, 116, 32, 109, 97, 117, 114, 105, 115, 32, 104, 101, 110, 100, 114, 101, 114, 105, 116, 32, 101, 115, 116, 32, 98, 105, 98, 101, 110,
+100, 117, 109, 32, 115, 117, 115, 99, 105, 112, 105, 116, 46, 32, 68, 111, 110, 101, 99, 32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101,
+32, 108, 105, 98, 101, 114, 111, 32, 101, 117, 32, 110, 105, 115, 108, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 101, 103,
+101, 116, 32, 108, 105, 98, 101, 114, 111, 46, 32, 68, 111, 110, 101, 99, 32, 116, 101, 109, 112, 117, 115, 32, 105, 112, 115, 117, 109, 32, 115, 101,
+100, 32, 113, 117, 97, 109, 46, 32, 83, 101, 100, 32, 98, 108, 97, 110, 100, 105, 116, 32, 110, 117, 110, 99, 32, 113, 117, 105, 115, 32, 101, 110,
+105, 109, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 108, 101, 99, 116, 117, 115, 32, 100, 105, 97, 109, 44, 32, 97, 100, 105, 112, 105, 115, 99,
+105, 110, 103, 32, 104, 101, 110, 100, 114, 101, 114, 105, 116, 44, 32, 112, 108, 97, 99, 101, 114, 97, 116, 32, 110, 111, 110, 44, 32, 112, 117, 108,
+118, 105, 110, 97, 114, 32, 105, 100, 44, 32, 102, 101, 108, 105, 115, 46, 32, 73, 110, 32, 99, 111, 110, 103, 117, 101, 32, 109, 97, 103, 110, 97,
+32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 117, 114, 110, 97, 46, 32, 78, 117, 110, 99, 32, 110, 111, 110, 32, 97, 117, 103, 117, 101, 32, 115,
+101, 100, 32, 110, 105, 115, 108, 32, 100, 105, 99, 116, 117, 109, 32, 108, 97, 111, 114, 101, 101, 116, 46, 32, 67, 117, 109, 32, 115, 111, 99, 105,
+105, 115, 32, 110, 97, 116, 111, 113, 117, 101, 32, 112, 101, 110, 97, 116, 105, 98, 117, 115, 32, 101, 116, 32, 109, 97, 103, 110, 105, 115, 32, 100,
+105, 115, 32, 112, 97, 114, 116, 117, 114, 105, 101, 110, 116, 32, 109, 111, 110, 116, 101, 115, 44, 32, 110, 97, 115, 99, 101, 116, 117, 114, 32, 114,
+105, 100, 105, 99, 117, 108, 117, 115, 32, 109, 117, 115, 46, 32, 73, 110, 32, 118, 101, 110, 101, 110, 97, 116, 105, 115, 32, 100, 97, 112, 105, 98,
+117, 115, 32, 109, 97, 115, 115, 97, 46, 32, 78, 117, 108, 108, 97, 32, 104, 101, 110, 100, 114, 101, 114, 105, 116, 32, 115, 97, 112, 105, 101, 110,
+32, 101, 116, 32, 113, 117, 97, 109, 46, 32, 78, 117, 110, 99, 32, 97, 99, 32, 109, 97, 103, 110, 97, 32, 108, 111, 98, 111, 114, 116, 105, 115,
+32, 116, 101, 108, 108, 117, 115, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 112, 111, 115, 117, 101, 114, 101, 46, 32, 67, 114, 97, 115, 32,
+97, 117, 103, 117, 101, 32, 109, 97, 117, 114, 105, 115, 44, 32, 109, 97, 116, 116, 105, 115, 32, 108, 111, 98, 111, 114, 116, 105, 115, 44, 32, 102,
+101, 114, 109, 101, 110, 116, 117, 109, 32, 97, 116, 44, 32, 115, 101, 109, 112, 101, 114, 32, 97, 99, 44, 32, 116, 101, 108, 108, 117, 115, 46, 32,
+67, 114, 97, 115, 32, 118, 105, 116, 97, 101, 32, 108, 105, 103, 117, 108, 97, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 115, 101, 109, 32, 112,
+111, 115, 117, 101, 114, 101, 32, 105, 97, 99, 117, 108, 105, 115, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 99, 111, 110, 100, 105, 109, 101, 110,
+116, 117, 109, 32, 101, 108, 101, 105, 102, 101, 110, 100, 32, 102, 101, 108, 105, 115, 46, 32, 85, 116, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32,
+115, 97, 112, 105, 101, 110, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 112, 111, 116, 101, 110, 116, 105, 46, 32, 77, 97, 117,
+114, 105, 115, 32, 117, 114, 110, 97, 46, 32, 85, 116, 32, 101, 117, 32, 101, 110, 105, 109, 32, 101, 117, 32, 97, 110, 116, 101, 32, 112, 111, 114,
+116, 97, 32, 118, 101, 115, 116, 105, 98, 117, 108, 117, 109, 46, 32, 65, 101, 110, 101, 97, 110, 32, 115, 99, 101, 108, 101, 114, 105, 115, 113, 117,
+101, 32, 101, 115, 116, 32, 97, 99, 32, 102, 101, 108, 105, 115, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 97, 117, 99, 116,
+111, 114, 46, 32, 78, 117, 110, 99, 32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 46, 32, 77, 111, 114, 98, 105, 32, 108, 97, 111,
+114, 101, 101, 116, 32, 97, 110, 116, 101, 32, 101, 116, 32, 110, 105, 98, 104, 46, 32, 68, 111, 110, 101, 99, 32, 102, 101, 117, 103, 105, 97, 116,
+32, 97, 114, 99, 117, 32, 101, 103, 101, 116, 32, 101, 110, 105, 109, 46, 32, 77, 111, 114, 98, 105, 32, 118, 101, 104, 105, 99, 117, 108, 97, 32,
+116, 111, 114, 116, 111, 114, 32, 97, 99, 32, 105, 112, 115, 117, 109, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 108, 97, 99, 117, 115, 32, 97,
+114, 99, 117, 44, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 32, 97, 99, 44, 32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 118, 101, 108, 44,
+32, 112, 111, 115, 117, 101, 114, 101, 32, 105, 100, 44, 32, 101, 115, 116, 46, 32, 80, 114, 111, 105, 110, 32, 99, 111, 109, 109, 111, 100, 111, 32,
+103, 114, 97, 118, 105, 100, 97, 32, 115, 101, 109, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 118,
+101, 104, 105, 99, 117, 108, 97, 32, 108, 105, 98, 101, 114, 111, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 119, 105, 115, 105, 46, 32,
+77, 97, 101, 99, 101, 110, 97, 115, 32, 112, 114, 101, 116, 105, 117, 109, 32, 116, 101, 108, 108, 117, 115, 32, 101, 117, 32, 115, 97, 112, 105, 101,
+110, 46, 32, 78, 117, 110, 99, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 110, 117, 110, 99, 46, 32, 73, 110, 32, 104, 97, 99, 32, 104, 97,
+98, 105, 116, 97, 115, 115, 101, 32, 112, 108, 97, 116, 101, 97, 32, 100, 105, 99, 116, 117, 109, 115, 116, 46, 32, 65, 101, 110, 101, 97, 110, 32,
+100, 105, 99, 116, 117, 109, 32, 110, 101, 113, 117, 101, 32, 115, 101, 100, 32, 116, 111, 114, 116, 111, 114, 46, 32, 68, 111, 110, 101, 99, 32, 101,
+116, 32, 101, 114, 97, 116, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 97, 110, 116, 101, 32, 105, 112, 115, 117, 109, 32, 112, 114,
+105, 109, 105, 115, 32, 105, 110, 32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 111, 114, 99, 105, 32, 108, 117, 99, 116, 117, 115, 32, 101, 116, 32,
+117, 108, 116, 114, 105, 99, 101, 115, 32, 112, 111, 115, 117, 101, 114, 101, 32, 99, 117, 98, 105, 108, 105, 97, 32, 67, 117, 114, 97, 101, 59, 32,
+83, 101, 100, 32, 106, 117, 115, 116, 111, 32, 116, 117, 114, 112, 105, 115, 44, 32, 115, 99, 101, 108, 101, 114, 105, 115, 113, 117, 101, 32, 117, 116,
+44, 32, 109, 97, 116, 116, 105, 115, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32, 111, 114, 110, 97, 114, 101, 32, 114, 117, 116, 114, 117, 109,
+44, 32, 109, 97, 115, 115, 97, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 98, 105, 98, 101, 110, 100, 117, 109, 32, 101, 110, 105,
+109, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 118, 101, 108, 105, 116, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 116, 101, 108, 108, 117, 115,
+32, 105, 112, 115, 117, 109, 44, 32, 108, 117, 99, 116, 117, 115, 32, 117, 116, 44, 32, 99, 111, 110, 115, 101, 99, 116, 101, 116, 117, 101, 114, 32,
+118, 105, 116, 97, 101, 44, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 110, 111, 110, 44, 32, 108, 105, 103, 117, 108, 97, 46, 32, 80, 104,
+97, 115, 101, 108, 108, 117, 115, 32, 108, 97, 99, 105, 110, 105, 97, 32, 119, 105, 115, 105, 32, 97, 116, 32, 101, 115, 116, 46, 32, 68, 111, 110,
+101, 99, 32, 101, 108, 105, 116, 32, 119, 105, 115, 105, 44, 32, 99, 111, 109, 109, 111, 100, 111, 32, 110, 111, 110, 44, 32, 112, 108, 97, 99, 101,
+114, 97, 116, 32, 105, 110, 44, 32, 99, 111, 110, 118, 97, 108, 108, 105, 115, 32, 105, 100, 44, 32, 101, 108, 105, 116, 46, 32, 78, 117, 110, 99,
+32, 100, 111, 108, 111, 114, 32, 100, 111, 108, 111, 114, 44, 32, 118, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 105, 100, 44, 32, 98, 105, 98,
+101, 110, 100, 117, 109, 32, 118, 105, 116, 97, 101, 44, 32, 108, 97, 99, 105, 110, 105, 97, 32, 105, 100, 44, 32, 101, 114, 97, 116, 46, 32, 67,
+114, 97, 115, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 101, 114, 111, 115, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 115,
+117, 115, 99, 105, 112, 105, 116, 32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 108, 101, 99, 116, 117, 115, 46, 32, 67, 108, 97, 115, 115, 32, 97,
+112, 116, 101, 110, 116, 32, 116, 97, 99, 105, 116, 105, 32, 115, 111, 99, 105, 111, 115, 113, 117, 32, 97, 100, 32, 108, 105, 116, 111, 114, 97, 32,
+116, 111, 114, 113, 117, 101, 110, 116, 32, 112, 101, 114, 32, 99, 111, 110, 117, 98, 105, 97, 32, 110, 111, 115, 116, 114, 97, 44, 32, 112, 101, 114,
+32, 105, 110, 99, 101, 112, 116, 111, 115, 32, 104, 121, 109, 101, 110, 97, 101, 111, 115, 46, 32, 67, 114, 97, 115, 32, 111, 114, 99, 105, 46, 32,
+80, 114, 97, 101, 115, 101, 110, 116, 32, 109, 97, 115, 115, 97, 32, 117, 114, 110, 97, 44, 32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 115, 101,
+109, 112, 101, 114, 44, 32, 97, 117, 99, 116, 111, 114, 32, 97, 44, 32, 112, 114, 101, 116, 105, 117, 109, 32, 118, 105, 116, 97, 101, 44, 32, 116,
+101, 108, 108, 117, 115, 46, 32, 67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 97, 116, 32, 112, 117, 114, 117, 115, 46, 32, 77, 111, 114, 98, 105,
+32, 116, 111, 114, 116, 111, 114, 32, 113, 117, 97, 109, 44, 32, 105, 109, 112, 101, 114, 100, 105, 101, 116, 32, 118, 101, 110, 101, 110, 97, 116, 105,
+115, 44, 32, 101, 103, 101, 115, 116, 97, 115, 32, 97, 44, 32, 99, 117, 114, 115, 117, 115, 32, 101, 117, 44, 32, 101, 115, 116, 46, 32, 78, 117,
+110, 99, 32, 105, 110, 116, 101, 114, 100, 117, 109, 32, 108, 101, 99, 116, 117, 115, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 108, 105, 98, 101,
+114, 111, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 112, 108, 97, 99, 101, 114, 97, 116, 32, 108,
+105, 103, 117, 108, 97, 46, 32, 78, 117, 110, 99, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32, 112, 111, 115, 117, 101, 114, 101, 32, 97, 114,
+99, 117, 46, 32, 77, 97, 117, 114, 105, 115, 32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 113, 117, 97, 109, 32, 97, 116, 32, 109, 97, 115, 115,
+97, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 115, 111, 100, 97, 108, 101, 115, 32, 97, 108, 105, 113, 117, 101, 116, 32, 109, 97, 117, 114, 105,
+115, 46, 32, 73, 110, 32, 105, 100, 32, 97, 110, 116, 101, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 118, 97, 114, 105,
+117, 115, 32, 105, 112, 115, 117, 109, 32, 105, 110, 32, 97, 114, 99, 117, 46, 32, 70, 117, 115, 99, 101, 32, 109, 97, 117, 114, 105, 115, 32, 108,
+97, 99, 117, 115, 44, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 97, 99, 44, 32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 113, 117, 105,
+115, 44, 32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 108, 117, 99, 116, 117, 115, 44, 32, 112, 101, 100, 101, 46, 32, 83, 101, 100, 32, 119, 105,
+115, 105, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 109, 97, 116, 116, 105, 115, 46, 32, 77, 97, 101, 99, 101, 110, 97, 115, 32,
+104, 101, 110, 100, 114, 101, 114, 105, 116, 32, 115, 101, 109, 32, 110, 101, 99, 32, 112, 117, 114, 117, 115, 46, 32, 80, 114, 111, 105, 110, 32, 105,
+100, 32, 113, 117, 97, 109, 46, 32, 67, 114, 97, 115, 32, 110, 101, 99, 32, 109, 97, 117, 114, 105, 115, 46, 32, 73, 110, 116, 101, 103, 101, 114,
+32, 111, 114, 99, 105, 46, 32, 78, 117, 108, 108, 97, 109, 32, 100, 117, 105, 32, 115, 101, 109, 44, 32, 109, 111, 108, 101, 115, 116, 105, 101, 32,
+115, 101, 100, 44, 32, 101, 103, 101, 115, 116, 97, 115, 32, 113, 117, 105, 115, 44, 32, 99, 117, 114, 115, 117, 115, 32, 105, 110, 44, 32, 109, 97,
+103, 110, 97, 46, 32, 77, 97, 117, 114, 105, 115, 32, 110, 101, 113, 117, 101, 32, 108, 97, 99, 117, 115, 44, 32, 99, 111, 110, 115, 101, 99, 116,
+101, 116, 117, 101, 114, 32, 110, 101, 99, 44, 32, 115, 97, 103, 105, 116, 116, 105, 115, 32, 101, 117, 44, 32, 112, 111, 114, 116, 116, 105, 116, 111,
+114, 32, 101, 103, 101, 116, 44, 32, 100, 117, 105, 46, 32, 70, 117, 115, 99, 101, 32, 99, 111, 110, 115, 101, 99, 116, 101, 116, 117, 101, 114, 46,
+32, 68, 111, 110, 101, 99, 32, 110, 101, 99, 32, 116, 101, 108, 108, 117, 115, 32, 113, 117, 105, 115, 32, 108, 101, 111, 32, 108, 111, 98, 111, 114,
+116, 105, 115, 32, 117, 108, 108, 97, 109, 99, 111, 114, 112, 101, 114, 46, 32, 69, 116, 105, 97, 109, 32, 109, 101, 116, 117, 115, 32, 117, 114, 110,
+97, 44, 32, 97, 108, 105, 113, 117, 101, 116, 32, 112, 114, 101, 116, 105, 117, 109, 44, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 101, 117, 44,
+32, 99, 117, 114, 115, 117, 115, 32, 117, 116, 44, 32, 116, 117, 114, 112, 105, 115, 46, 32, 77, 111, 114, 98, 105, 32, 98, 105, 98, 101, 110, 100,
+117, 109, 32, 118, 101, 104, 105, 99, 117, 108, 97, 32, 108, 101, 99, 116, 117, 115, 46, 32, 83, 101, 100, 32, 110, 111, 110, 32, 97, 110, 116, 101,
+32, 118, 105, 116, 97, 101, 32, 97, 114, 99, 117, 32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 116, 101, 109, 112, 111, 114, 46,
+32, 70, 117, 115, 99, 101, 32, 115, 101, 100, 32, 108, 105, 103, 117, 108, 97, 32, 105, 110, 32, 115, 101, 109, 32, 116, 101, 109, 112, 111, 114, 32,
+105, 109, 112, 101, 114, 100, 105, 101, 116, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 118, 101, 108, 32, 101, 115, 116, 46, 32, 80, 104, 97, 115,
+101, 108, 108, 117, 115, 32, 115, 111, 108, 108, 105, 99, 105, 116, 117, 100, 105, 110, 32, 115, 111, 108, 108, 105, 99, 105, 116, 117, 100, 105, 110, 32,
+110, 105, 98, 104, 46, 32, 67, 108, 97, 115, 115, 32, 97, 112, 116, 101, 110, 116, 32, 116, 97, 99, 105, 116, 105, 32, 115, 111, 99, 105, 111, 115,
+113, 117, 32, 97, 100, 32, 108, 105, 116, 111, 114, 97, 32, 116, 111, 114, 113, 117, 101, 110, 116, 32, 112, 101, 114, 32, 99, 111, 110, 117, 98, 105,
+97, 32, 110, 111, 115, 116, 114, 97, 44, 32, 112, 101, 114, 32, 105, 110, 99, 101, 112, 116, 111, 115, 32, 104, 121, 109, 101, 110, 97, 101, 111, 115,
+46, 32, 83, 101, 100, 32, 118, 101, 108, 32, 108, 101, 111, 32, 110, 101, 99, 32, 101, 114, 111, 115, 32, 98, 108, 97, 110, 100, 105, 116, 32, 105,
+109, 112, 101, 114, 100, 105, 101, 116, 46, 32, 78, 117, 108, 108, 97, 32, 102, 97, 99, 105, 108, 105, 115, 105, 46, 32, 83, 117, 115, 112, 101, 110,
+100, 105, 115, 115, 101, 32, 108, 111, 98, 111, 114, 116, 105, 115, 44, 32, 100, 117, 105, 32, 117, 116, 32, 102, 114, 105, 110, 103, 105, 108, 108, 97,
+32, 104, 101, 110, 100, 114, 101, 114, 105, 116, 44, 32, 106, 117, 115, 116, 111, 32, 112, 117, 114, 117, 115, 32, 117, 108, 108, 97, 109, 99, 111, 114,
+112, 101, 114, 32, 108, 105, 103, 117, 108, 97, 44, 32, 117, 108, 116, 114, 105, 99, 105, 101, 115, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 100,
+111, 108, 111, 114, 32, 101, 110, 105, 109, 32, 105, 110, 32, 108, 105, 98, 101, 114, 111, 46, 32, 83, 101, 100, 32, 101, 108, 101, 109, 101, 110, 116,
+117, 109, 44, 32, 112, 101, 100, 101, 32, 101, 103, 101, 116, 32, 112, 111, 114, 116, 97, 32, 99, 111, 110, 118, 97, 108, 108, 105, 115, 44, 32, 100,
+117, 105, 32, 110, 117, 108, 108, 97, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 112, 101, 100, 101, 44, 32, 101, 103, 101, 116, 32, 118, 101,
+104, 105, 99, 117, 108, 97, 32, 111, 100, 105, 111, 32, 97, 110, 116, 101, 32, 97, 116, 32, 115, 101, 109, 46, 32, 80, 101, 108, 108, 101, 110, 116,
+101, 115, 113, 117, 101, 32, 104, 97, 98, 105, 116, 97, 110, 116, 32, 109, 111, 114, 98, 105, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 115,
+101, 110, 101, 99, 116, 117, 115, 32, 101, 116, 32, 110, 101, 116, 117, 115, 32, 101, 116, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 102, 97,
+109, 101, 115, 32, 97, 99, 32, 116, 117, 114, 112, 105, 115, 32, 101, 103, 101, 115, 116, 97, 115, 46, 32, 83, 101, 100, 32, 117, 108, 108, 97, 109,
+99, 111, 114, 112, 101, 114, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 105, 112, 115, 117, 109, 46, 32, 70, 117, 115, 99, 101, 32, 114, 105,
+115, 117, 115, 32, 110, 105, 98, 104, 44, 32, 97, 99, 99, 117, 109, 115, 97, 110, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32, 116, 101, 109,
+112, 117, 115, 32, 101, 103, 101, 116, 44, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 97, 99, 44, 32, 110, 101, 113, 117, 101, 46, 32, 83,
+101, 100, 32, 113, 117, 105, 115, 32, 108, 111, 114, 101, 109, 32, 117, 116, 32, 116, 111, 114, 116, 111, 114, 32, 102, 97, 99, 105, 108, 105, 115, 105,
+115, 32, 102, 101, 114, 109, 101, 110, 116, 117, 109, 46, 32, 70, 117, 115, 99, 101, 32, 112, 117, 108, 118, 105, 110, 97, 114, 32, 113, 117, 97, 109,
+32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 105, 112, 115, 117, 109, 46, 32, 77, 111, 114, 98, 105, 32, 97, 99, 32, 101, 108, 105, 116, 32, 113,
+117, 105, 115, 32, 116, 101, 108, 108, 117, 115, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 98, 108, 97, 110, 100, 105, 116, 46, 32, 77, 97,
+101, 99, 101, 110, 97, 115, 32, 115, 117, 115, 99, 105, 112, 105, 116, 32, 115, 111, 108, 108, 105, 99, 105, 116, 117, 100, 105, 110, 32, 115, 101, 109,
+46, 32, 78, 97, 109, 32, 115, 101, 100, 32, 101, 114, 111, 115, 32, 118, 101, 108, 32, 108, 97, 99, 117, 115, 32, 108, 111, 98, 111, 114, 116, 105,
+115, 32, 99, 111, 110, 103, 117, 101, 46, 32, 80, 114, 111, 105, 110, 32, 105, 110, 116, 101, 114, 100, 117, 109, 32, 110, 117, 110, 99, 32, 108, 111,
+98, 111, 114, 116, 105, 115, 32, 111, 114, 99, 105, 46, 32, 68, 111, 110, 101, 99, 32, 101, 103, 101, 115, 116, 97, 115, 32, 101, 110, 105, 109, 32,
+101, 117, 32, 111, 100, 105, 111, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 105, 100, 32, 109, 101, 116, 117, 115, 46, 32, 80, 101,
+108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 97, 117, 99, 116, 111, 114, 44, 32, 115, 101, 109, 32, 118, 97, 114, 105, 117, 115, 32, 108, 117,
+99, 116, 117, 115, 32, 116, 101, 109, 112, 117, 115, 44, 32, 108, 105, 98, 101, 114, 111, 32, 109, 97, 103, 110, 97, 32, 99, 117, 114, 115, 117, 115,
+32, 110, 101, 113, 117, 101, 44, 32, 101, 116, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32, 100, 105, 97, 109, 32, 100, 105, 97, 109, 32, 113,
+117, 105, 115, 32, 112, 117, 114, 117, 115, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 100,
+111, 108, 111, 114, 46, 32, 78, 117, 108, 108, 97, 32, 105, 110, 32, 109, 97, 103, 110, 97, 46, 32, 67, 114, 97, 115, 32, 105, 100, 32, 100, 105,
+97, 109, 32, 97, 116, 32, 108, 101, 99, 116, 117, 115, 32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 112, 108, 97, 99, 101, 114, 97, 116, 46, 32,
+78, 117, 110, 99, 32, 112, 111, 114, 116, 97, 32, 112, 111, 115, 117, 101, 114, 101, 32, 115, 97, 112, 105, 101, 110, 46, 32, 69, 116, 105, 97, 109,
+32, 115, 99, 101, 108, 101, 114, 105, 115, 113, 117, 101, 46, 32, 67, 108, 97, 115, 115, 32, 97, 112, 116, 101, 110, 116, 32, 116, 97, 99, 105, 116,
+105, 32, 115, 111, 99, 105, 111, 115, 113, 117, 32, 97, 100, 32, 108, 105, 116, 111, 114, 97, 32, 116, 111, 114, 113, 117, 101, 110, 116, 32, 112, 101,
+114, 32, 99, 111, 110, 117, 98, 105, 97, 32, 110, 111, 115, 116, 114, 97, 44, 32, 112, 101, 114, 32, 105, 110, 99, 101, 112, 116, 111, 115, 32, 104,
+121, 109, 101, 110, 97, 101, 111, 115, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 109,
+105, 32, 115, 101, 100, 32, 116, 111, 114, 116, 111, 114, 46, 32, 77, 97, 101, 99, 101, 110, 97, 115, 32, 101, 108, 101, 105, 102, 101, 110, 100, 32,
+100, 105, 97, 109, 32, 110, 111, 110, 32, 117, 114, 110, 97, 46, 32, 68, 111, 110, 101, 99, 32, 108, 117, 99, 116, 117, 115, 32, 112, 104, 97, 114,
+101, 116, 114, 97, 32, 116, 101, 108, 108, 117, 115, 46, 32, 80, 114, 111, 105, 110, 32, 97, 99, 32, 105, 112, 115, 117, 109, 32, 101, 103, 101, 116,
+32, 108, 105, 98, 101, 114, 111, 32, 98, 105, 98, 101, 110, 100, 117, 109, 32, 118, 111, 108, 117, 116, 112, 97, 116, 46, 32, 67, 114, 97, 115, 32,
+105, 100, 32, 116, 101, 108, 108, 117, 115, 46, 32, 78, 117, 108, 108, 97, 32, 110, 111, 110, 32, 114, 105, 115, 117, 115, 46, 32, 73, 110, 32, 100,
+111, 108, 111, 114, 46, 32, 70, 117, 115, 99, 101, 32, 115, 99, 101, 108, 101, 114, 105, 115, 113, 117, 101, 32, 113, 117, 97, 109, 32, 105, 110, 32,
+109, 97, 115, 115, 97, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 112, 111, 114, 116, 97, 46, 32, 77, 111, 114, 98, 105, 32, 117, 116, 32, 100,
+111, 108, 111, 114, 32, 101, 117, 32, 109, 97, 115, 115, 97, 32, 101, 103, 101, 115, 116, 97, 115, 32, 99, 111, 110, 100, 105, 109, 101, 110, 116, 117,
+109, 46, 32, 77, 97, 117, 114, 105, 115, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 46, 32, 73, 110, 32, 104, 97, 99, 32, 104, 97, 98, 105,
+116, 97, 115, 115, 101, 32, 112, 108, 97, 116, 101, 97, 32, 100, 105, 99, 116, 117, 109, 115, 116, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115,
+115, 101, 32, 112, 111, 116, 101, 110, 116, 105, 46, 32, 77, 97, 117, 114, 105, 115, 32, 118, 101, 104, 105, 99, 117, 108, 97, 32, 108, 101, 111, 32,
+105, 110, 32, 116, 111, 114, 116, 111, 114, 46, 32, 77, 97, 117, 114, 105, 115, 32, 118, 101, 108, 32, 101, 114, 97, 116, 32, 97, 32, 117, 114, 110,
+97, 32, 108, 97, 111, 114, 101, 101, 116, 32, 115, 101, 109, 112, 101, 114, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 117,
+116, 32, 109, 101, 116, 117, 115, 32, 97, 99, 32, 116, 101, 108, 108, 117, 115, 32, 99, 111, 109, 109, 111, 100, 111, 32, 101, 108, 101, 105, 102, 101,
+110, 100, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 113, 117, 105, 115, 32, 117, 114, 110, 97, 46, 32, 67, 117, 114, 97, 98,
+105, 116, 117, 114, 32, 108, 97, 99, 105, 110, 105, 97, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 100, 117, 105, 46, 32, 78, 97, 109, 32,
+110, 101, 99, 32, 97, 110, 116, 101, 46, 32, 73, 110, 32, 105, 100, 32, 101, 110, 105, 109, 46, 32, 65, 101, 110, 101, 97, 110, 32, 109, 97, 116,
+116, 105, 115, 32, 101, 110, 105, 109, 46, 32, 73, 110, 32, 117, 116, 32, 110, 101, 113, 117, 101, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32,
+114, 105, 115, 117, 115, 32, 104, 101, 110, 100, 114, 101, 114, 105, 116, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 46, 32, 83, 117, 115, 112, 101,
+110, 100, 105, 115, 115, 101, 32, 112, 111, 116, 101, 110, 116, 105, 46, 32, 85, 116, 32, 118, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 108, 101,
+99, 116, 117, 115, 32, 118, 105, 116, 97, 101, 32, 116, 111, 114, 116, 111, 114, 46, 32, 68, 117, 105, 115, 32, 118, 101, 108, 105, 116, 46, 32, 78,
+117, 108, 108, 97, 32, 102, 97, 99, 105, 108, 105, 115, 105, 46, 32, 73, 110, 116, 101, 103, 101, 114, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32,
+117, 114, 110, 97, 46, 32, 67, 114, 97, 115, 32, 118, 97, 114, 105, 117, 115, 32, 116, 111, 114, 116, 111, 114, 32, 105, 110, 32, 112, 101, 100, 101,
+46, 32, 83, 101, 100, 32, 102, 97, 99, 105, 108, 105, 115, 105, 115, 46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 108, 97, 99, 105, 110, 105,
+97, 32, 108, 105, 98, 101, 114, 111, 32, 110, 101, 99, 32, 110, 105, 98, 104, 46, 32, 68, 111, 110, 101, 99, 32, 97, 108, 105, 113, 117, 97, 109,
+32, 114, 105, 115, 117, 115, 32, 110, 111, 110, 32, 110, 105, 115, 108, 46, 32, 78, 97, 109, 32, 97, 32, 110, 117, 110, 99, 32, 101, 116, 32, 102,
+101, 108, 105, 115, 32, 116, 101, 109, 112, 111, 114, 32, 102, 101, 117, 103, 105, 97, 116, 46, 32, 78, 117, 110, 99, 32, 109, 101, 116, 117, 115, 46,
+32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 101, 117, 105, 115, 109, 111, 100, 44, 32, 109, 101, 116, 117, 115, 32, 105, 110, 32, 115, 101,
+109, 112, 101, 114, 32, 108, 97, 111, 114, 101, 101, 116, 44, 32, 117, 114, 110, 97, 32, 105, 112, 115, 117, 109, 32, 112, 104, 97, 114, 101, 116, 114,
+97, 32, 108, 111, 114, 101, 109, 44, 32, 115, 101, 100, 32, 117, 108, 116, 114, 105, 99, 105, 101, 115, 32, 109, 97, 103, 110, 97, 32, 108, 111, 114,
+101, 109, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 119, 105, 115, 105, 46, 32, 83, 101, 100, 32, 119, 105, 115, 105, 46, 32, 78, 117, 108, 108,
+97, 109, 32, 102, 97, 99, 105, 108, 105, 115, 105, 115, 32, 101, 108, 105, 116, 32, 115, 101, 100, 32, 110, 105, 115, 108, 46, 32, 80, 104, 97, 115,
+101, 108, 108, 117, 115, 32, 109, 97, 116, 116, 105, 115, 32, 108, 101, 111, 32, 110, 101, 99, 32, 109, 97, 115, 115, 97, 46, 32, 65, 101, 110, 101,
+97, 110, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 46, 32, 67, 114, 97, 115, 32, 119, 105, 115, 105, 32, 101, 114, 97, 116, 44, 32, 108, 111,
+98, 111, 114, 116, 105, 115, 32, 110, 101, 99, 44, 32, 99, 117, 114, 115, 117, 115, 32, 101, 103, 101, 116, 44, 32, 108, 111, 98, 111, 114, 116, 105,
+115, 32, 97, 116, 44, 32, 108, 105, 98, 101, 114, 111, 46, 32, 73, 110, 32, 109, 97, 115, 115, 97, 32, 110, 105, 115, 108, 44, 32, 114, 117, 116,
+114, 117, 109, 32, 110, 111, 110, 44, 32, 99, 117, 114, 115, 117, 115, 32, 110, 101, 99, 44, 32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 115, 101,
+100, 44, 32, 108, 97, 99, 117, 115, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97,
+46, 32, 67, 114, 97, 115, 32, 101, 117, 105, 115, 109, 111, 100, 44, 32, 110, 101, 113, 117, 101, 32, 97, 99, 32, 115, 117, 115, 99, 105, 112, 105,
+116, 32, 116, 101, 109, 112, 117, 115, 44, 32, 118, 101, 108, 105, 116, 32, 108, 111, 114, 101, 109, 32, 108, 117, 99, 116, 117, 115, 32, 101, 108, 105,
+116, 44, 32, 100, 97, 112, 105, 98, 117, 115, 32, 114, 104, 111, 110, 99, 117, 115, 32, 119, 105, 115, 105, 32, 101, 115, 116, 32, 117, 116, 32, 115,
+101, 109, 46, 32, 80, 114, 111, 105, 110, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 101, 110, 105, 109, 32, 105, 110, 32, 101, 114, 111, 115,
+32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 32, 97, 99, 99, 117, 109, 115, 97, 110, 46, 32, 85, 116, 32, 108, 111, 114, 101, 109, 32, 110, 105,
+115, 108, 44, 32, 104, 101, 110, 100, 114, 101, 114, 105, 116, 32, 101, 116, 44, 32, 105, 110, 116, 101, 114, 100, 117, 109, 32, 110, 101, 99, 44, 32,
+108, 97, 99, 105, 110, 105, 97, 32, 105, 110, 44, 32, 100, 111, 108, 111, 114, 46, 32, 68, 117, 105, 115, 32, 110, 101, 99, 32, 113, 117, 97, 109,
+46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 118, 101, 108, 105, 116, 32, 102, 101, 108, 105, 115, 44, 32, 112, 111, 115, 117, 101, 114, 101, 32,
+105, 100, 44, 32, 108, 117, 99, 116, 117, 115, 32, 113, 117, 105, 115, 44, 32, 108, 97, 111, 114, 101, 101, 116, 32, 117, 116, 44, 32, 105, 112, 115,
+117, 109, 46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 101, 103, 101, 116, 32, 97, 114, 99, 117, 46, 32, 77, 97, 117, 114, 105, 115, 32, 109,
+97, 115, 115, 97, 32, 102, 101, 108, 105, 115, 44, 32, 111, 114, 110, 97, 114, 101, 32, 110, 111, 110, 44, 32, 117, 108, 116, 114, 105, 99, 101, 115,
+32, 105, 100, 44, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 105, 110, 44, 32, 101, 108, 105, 116, 46, 32, 80, 101, 108, 108, 101, 110, 116,
+101, 115, 113, 117, 101, 32, 104, 97, 98, 105, 116, 97, 110, 116, 32, 109, 111, 114, 98, 105, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 115,
+101, 110, 101, 99, 116, 117, 115, 32, 101, 116, 32, 110, 101, 116, 117, 115, 32, 101, 116, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 102, 97,
+109, 101, 115, 32, 97, 99, 32, 116, 117, 114, 112, 105, 115, 32, 101, 103, 101, 115, 116, 97, 115, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115,
+32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 44, 32, 109, 105, 32, 97, 99, 32, 98, 105, 98, 101, 110, 100, 117, 109, 32, 102, 97, 99, 105, 108,
+105, 115, 105, 115, 44, 32, 108, 105, 98, 101, 114, 111, 32, 101, 110, 105, 109, 32, 115, 117, 115, 99, 105, 112, 105, 116, 32, 108, 101, 111, 44, 32,
+110, 111, 110, 32, 110, 111, 110, 117, 109, 109, 121, 32, 112, 101, 100, 101, 32, 100, 105, 97, 109, 32, 101, 103, 101, 116, 32, 110, 105, 98, 104, 46,
+32, 83, 101, 100, 32, 116, 101, 109, 112, 117, 115, 46, 32, 65, 101, 110, 101, 97, 110, 32, 105, 110, 116, 101, 114, 100, 117, 109, 32, 115, 117, 115,
+99, 105, 112, 105, 116, 32, 100, 117, 105, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 101, 114, 97, 116, 32, 118, 111, 108, 117, 116, 112, 97, 116,
+46, 32, 85, 116, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 46, 32, 78, 97, 109, 32, 99, 111, 109, 109, 111, 100, 111, 44, 32, 110, 117, 108,
+108, 97, 32, 117, 116, 32, 102, 114, 105, 110, 103, 105, 108, 108, 97, 32, 114, 117, 116, 114, 117, 109, 44, 32, 111, 114, 99, 105, 32, 101, 108, 105,
+116, 32, 118, 105, 118, 101, 114, 114, 97, 32, 100, 105, 97, 109, 44, 32, 118, 105, 116, 97, 101, 32, 109, 111, 108, 108, 105, 115, 32, 111, 100, 105,
+111, 32, 111, 100, 105, 111, 32, 101, 116, 32, 112, 117, 114, 117, 115, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 101, 114, 97, 116, 32, 118, 111,
+108, 117, 116, 112, 97, 116, 46, 32, 83, 101, 100, 32, 97, 108, 105, 113, 117, 101, 116, 32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 105, 112, 115,
+117, 109, 46, 32, 73, 110, 32, 117, 116, 32, 101, 115, 116, 46, 32, 69, 116, 105, 97, 109, 32, 99, 111, 110, 100, 105, 109, 101, 110, 116, 117, 109,
+46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 116, 111, 114, 116, 111, 114,
+32, 112, 117, 108, 118, 105, 110, 97, 114, 32, 108, 97, 99, 117, 115, 46, 32, 65, 101, 110, 101, 97, 110, 32, 111, 114, 99, 105, 46, 32, 83, 117,
+115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 108, 97, 99, 117, 115, 32, 110, 117, 108, 108, 97, 44, 32, 110, 111, 110, 117, 109, 109, 121, 32, 97,
+44, 32, 100, 105, 99, 116, 117, 109, 32, 118, 105, 116, 97, 101, 44, 32, 101, 103, 101, 115, 116, 97, 115, 32, 113, 117, 105, 115, 44, 32, 101, 114,
+111, 115, 46, 32, 68, 111, 110, 101, 99, 32, 97, 117, 99, 116, 111, 114, 32, 103, 114, 97, 118, 105, 100, 97, 32, 110, 105, 115, 108, 46, 32, 67,
+114, 97, 115, 32, 97, 99, 32, 101, 115, 116, 32, 114, 117, 116, 114, 117, 109, 32, 97, 117, 103, 117, 101, 32, 112, 117, 108, 118, 105, 110, 97, 114,
+32, 111, 114, 110, 97, 114, 101, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 109, 97, 117, 114, 105, 115, 32, 110, 105, 98, 104, 44, 32,
+118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 105, 110, 44, 32, 114, 104, 111, 110, 99, 117, 115, 32, 105, 109, 112, 101, 114, 100, 105, 101, 116, 44,
+32, 100, 97, 112, 105, 98, 117, 115, 32, 101, 103, 101, 116, 44, 32, 108, 97, 99, 117, 115, 46, 32, 78, 97, 109, 32, 110, 117, 110, 99, 32, 109,
+97, 117, 114, 105, 115, 44, 32, 115, 117, 115, 99, 105, 112, 105, 116, 32, 97, 116, 44, 32, 117, 108, 116, 114, 105, 99, 105, 101, 115, 32, 97, 44,
+32, 102, 97, 99, 105, 108, 105, 115, 105, 115, 32, 97, 116, 44, 32, 116, 101, 108, 108, 117, 115, 46, 32, 78, 97, 109, 32, 97, 99, 99, 117, 109,
+115, 97, 110, 32, 109, 111, 108, 108, 105, 115, 32, 108, 105, 98, 101, 114, 111, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 99, 111, 110, 100, 105,
+109, 101, 110, 116, 117, 109, 32, 109, 97, 116, 116, 105, 115, 32, 101, 115, 116, 46, 32, 68, 111, 110, 101, 99, 32, 108, 97, 99, 117, 115, 46, 32,
+78, 117, 108, 108, 97, 109, 32, 97, 99, 32, 115, 97, 112, 105, 101, 110, 32, 105, 100, 32, 109, 97, 115, 115, 97, 32, 108, 111, 98, 111, 114, 116,
+105, 115, 32, 109, 111, 108, 101, 115, 116, 105, 101, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 101, 108, 101, 109, 101, 110,
+116, 117, 109, 46, 32, 80, 114, 111, 105, 110, 32, 117, 116, 32, 112, 117, 114, 117, 115, 46, 32, 73, 110, 116, 101, 103, 101, 114, 32, 101, 116, 32,
+115, 97, 112, 105, 101, 110, 32, 113, 117, 105, 115, 32, 116, 117, 114, 112, 105, 115, 32, 99, 111, 109, 109, 111, 100, 111, 32, 109, 111, 108, 108, 105,
+115, 46, 32, 78, 117, 108, 108, 97, 32, 99, 111, 110, 115, 101, 113, 117, 97, 116, 46, 32, 80, 114, 111, 105, 110, 32, 97, 32, 119, 105, 115, 105,
+32, 117, 116, 32, 116, 101, 108, 108, 117, 115, 32, 98, 108, 97, 110, 100, 105, 116, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 46, 32, 65, 108,
+105, 113, 117, 97, 109, 32, 110, 117, 108, 108, 97, 32, 108, 111, 114, 101, 109, 44, 32, 98, 105, 98, 101, 110, 100, 117, 109, 32, 97, 99, 44, 32,
+109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 118, 101, 108, 44, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 32, 101, 116, 44, 32, 109, 101, 116,
+117, 115, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 101, 103, 101, 115, 116, 97, 115, 32, 110, 105, 98, 104, 32, 101, 116, 32, 108, 105,
+103, 117, 108, 97, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 100, 105, 97, 109, 32, 111, 100, 105, 111, 44, 32, 108, 97, 99, 105, 110, 105, 97,
+32, 113, 117, 105, 115, 44, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 113, 117, 105, 115, 44, 32, 115, 111, 108, 108, 105, 99, 105, 116, 117,
+100, 105, 110, 32, 117, 116, 44, 32, 101, 114, 111, 115, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 97, 108, 105, 113, 117, 101, 116, 32,
+108, 111, 114, 101, 109, 32, 97, 99, 32, 105, 112, 115, 117, 109, 46, 32, 83, 101, 100, 32, 99, 117, 114, 115, 117, 115, 32, 116, 101, 108, 108, 117,
+115, 32, 97, 99, 32, 111, 114, 99, 105, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 97, 116, 32, 110, 117, 108, 108, 97, 46, 32, 68,
+111, 110, 101, 99, 32, 112, 111, 114, 116, 97, 32, 115, 111, 100, 97, 108, 101, 115, 32, 97, 110, 116, 101, 46, 32, 80, 101, 108, 108, 101, 110, 116,
+101, 115, 113, 117, 101, 32, 104, 97, 98, 105, 116, 97, 110, 116, 32, 109, 111, 114, 98, 105, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 115,
+101, 110, 101, 99, 116, 117, 115, 32, 101, 116, 32, 110, 101, 116, 117, 115, 32, 101, 116, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 102, 97,
+109, 101, 115, 32, 97, 99, 32, 116, 117, 114, 112, 105, 115, 32, 101, 103, 101, 115, 116, 97, 115, 46, 32, 83, 101, 100, 32, 105, 100, 32, 108, 101,
+99, 116, 117, 115, 32, 97, 116, 32, 109, 97, 115, 115, 97, 32, 117, 108, 108, 97, 109, 99, 111, 114, 112, 101, 114, 32, 116, 114, 105, 115, 116, 105,
+113, 117, 101, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32, 108, 97, 99, 117, 115,
+46, 32, 73, 110, 32, 104, 97, 99, 32, 104, 97, 98, 105, 116, 97, 115, 115, 101, 32, 112, 108, 97, 116, 101, 97, 32, 100, 105, 99, 116, 117, 109,
+115, 116, 46, 32, 78, 117, 110, 99, 32, 110, 111, 110, 32, 116, 117, 114, 112, 105, 115, 46, 32, 83, 101, 100, 32, 115, 97, 103, 105, 116, 116, 105,
+115, 46, 32, 77, 111, 114, 98, 105, 32, 108, 97, 111, 114, 101, 101, 116, 32, 115, 99, 101, 108, 101, 114, 105, 115, 113, 117, 101, 32, 100, 117, 105,
+46, 32, 78, 97, 109, 32, 97, 114, 99, 117, 32, 116, 101, 108, 108, 117, 115, 44, 32, 116, 101, 109, 112, 111, 114, 32, 118, 105, 116, 97, 101, 44,
+32, 118, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 101, 116, 44, 32, 105, 109, 112, 101, 114, 100, 105, 101, 116, 32, 117, 116, 44, 32, 118, 101,
+108, 105, 116, 46, 32, 73, 110, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 97, 117, 103, 117, 101, 32, 97, 32, 97, 114, 99, 117, 32, 118, 111,
+108, 117, 116, 112, 97, 116, 32, 115, 117, 115, 99, 105, 112, 105, 116, 46, 32, 68, 111, 110, 101, 99, 32, 100, 105, 99, 116, 117, 109, 32, 117, 108,
+116, 114, 105, 99, 101, 115, 32, 108, 101, 99, 116, 117, 115, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 97, 32, 112, 117, 114, 117, 115,
+32, 101, 116, 32, 111, 114, 99, 105, 32, 100, 105, 99, 116, 117, 109, 32, 108, 97, 99, 105, 110, 105, 97, 46, 32, 85, 116, 32, 108, 101, 111, 46,
+32, 67, 114, 97, 115, 32, 115, 101, 109, 112, 101, 114, 44, 32, 108, 111, 114, 101, 109, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 116, 105, 110,
+99, 105, 100, 117, 110, 116, 32, 99, 111, 110, 103, 117, 101, 44, 32, 106, 117, 115, 116, 111, 32, 101, 114, 111, 115, 32, 118, 97, 114, 105, 117, 115,
+32, 112, 101, 100, 101, 44, 32, 105, 110, 32, 98, 105, 98, 101, 110, 100, 117, 109, 32, 116, 117, 114, 112, 105, 115, 32, 108, 101, 99, 116, 117, 115,
+32, 110, 111, 110, 32, 101, 114, 111, 115, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 113, 117, 97, 109, 46, 32, 83, 117, 115, 112, 101,
+110, 100, 105, 115, 115, 101, 32, 109, 97, 116, 116, 105, 115, 32, 115, 111, 108, 108, 105, 99, 105, 116, 117, 100, 105, 110, 32, 109, 97, 103, 110, 97,
+46, 32, 65, 101, 110, 101, 97, 110, 32, 102, 97, 99, 105, 108, 105, 115, 105, 115, 32, 100, 105, 97, 109, 32, 118, 101, 108, 32, 110, 105, 115, 108,
+32, 110, 111, 110, 117, 109, 109, 121, 32, 99, 111, 110, 100, 105, 109, 101, 110, 116, 117, 109, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115,
+101, 32, 118, 101, 108, 32, 100, 111, 108, 111, 114, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 110, 111, 110, 117, 109, 109, 121, 46,
+32, 77, 97, 117, 114, 105, 115, 32, 105, 109, 112, 101, 114, 100, 105, 101, 116, 32, 115, 101, 109, 112, 101, 114, 32, 97, 110, 116, 101, 46, 32, 77,
+97, 101, 99, 101, 110, 97, 115, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 101, 114, 111, 115, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108,
+117, 109, 32, 97, 99, 32, 100, 111, 108, 111, 114, 46, 32, 70, 117, 115, 99, 101, 32, 114, 105, 115, 117, 115, 32, 109, 101, 116, 117, 115, 44, 32,
+97, 108, 105, 113, 117, 101, 116, 32, 101, 103, 101, 116, 44, 32, 102, 97, 99, 105, 108, 105, 115, 105, 115, 32, 101, 116, 44, 32, 102, 101, 117, 103,
+105, 97, 116, 32, 118, 101, 108, 44, 32, 111, 114, 99, 105, 46, 32, 85, 116, 32, 97, 116, 32, 110, 117, 110, 99, 32, 105, 100, 32, 97, 110, 116,
+101, 32, 115, 111, 100, 97, 108, 101, 115, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 46, 32, 68, 117, 105, 115, 32, 116, 114, 105, 115, 116, 105,
+113, 117, 101, 32, 109, 97, 116, 116, 105, 115, 32, 97, 110, 116, 101, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 110, 101, 113, 117,
+101, 32, 109, 97, 117, 114, 105, 115, 44, 32, 108, 97, 111, 114, 101, 101, 116, 32, 105, 100, 44, 32, 99, 111, 110, 103, 117, 101, 32, 105, 110, 116,
+101, 114, 100, 117, 109, 44, 32, 97, 108, 105, 113, 117, 101, 116, 32, 117, 116, 44, 32, 100, 105, 97, 109, 46, 32, 78, 117, 108, 108, 97, 32, 118,
+111, 108, 117, 116, 112, 97, 116, 32, 98, 108, 97, 110, 100, 105, 116, 32, 109, 97, 103, 110, 97, 46, 32, 68, 111, 110, 101, 99, 32, 97, 99, 99,
+117, 109, 115, 97, 110, 32, 99, 111, 110, 103, 117, 101, 32, 100, 105, 97, 109, 46, 32, 69, 116, 105, 97, 109, 32, 118, 101, 108, 32, 100, 117, 105,
+32, 101, 103, 101, 116, 32, 110, 105, 115, 108, 32, 116, 101, 109, 112, 111, 114, 32, 118, 97, 114, 105, 117, 115, 46, 32, 67, 114, 97, 115, 32, 100,
+105, 99, 116, 117, 109, 32, 109, 97, 115, 115, 97, 32, 115, 101, 100, 32, 101, 110, 105, 109, 46, 32, 67, 114, 97, 115, 32, 117, 114, 110, 97, 32,
+116, 111, 114, 116, 111, 114, 44, 32, 102, 114, 105, 110, 103, 105, 108, 108, 97, 32, 97, 99, 44, 32, 117, 108, 108, 97, 109, 99, 111, 114, 112, 101,
+114, 32, 105, 110, 44, 32, 101, 117, 105, 115, 109, 111, 100, 32, 118, 101, 108, 44, 32, 97, 114, 99, 117, 46, 32, 77, 111, 114, 98, 105, 32, 112,
+111, 115, 117, 101, 114, 101, 32, 108, 117, 99, 116, 117, 115, 32, 97, 117, 103, 117, 101, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 100, 117, 105,
+32, 100, 117, 105, 44, 32, 97, 100, 105, 112, 105, 115, 99, 105, 110, 103, 32, 105, 110, 44, 32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 101, 117,
+44, 32, 108, 117, 99, 116, 117, 115, 32, 101, 117, 44, 32, 110, 117, 108, 108, 97, 46, 32, 67, 114, 97, 115, 32, 118, 101, 108, 105, 116, 32, 112,
+101, 100, 101, 44, 32, 117, 108, 108, 97, 109, 99, 111, 114, 112, 101, 114, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32, 102, 101, 117, 103, 105,
+97, 116, 32, 105, 110, 44, 32, 97, 117, 99, 116, 111, 114, 32, 118, 105, 116, 97, 101, 44, 32, 97, 110, 116, 101, 46, 32, 83, 117, 115, 112, 101,
+110, 100, 105, 115, 115, 101, 32, 100, 105, 99, 116, 117, 109, 32, 102, 114, 105, 110, 103, 105, 108, 108, 97, 32, 109, 97, 117, 114, 105, 115, 46, 32,
+73, 110, 32, 97, 32, 110, 105, 98, 104, 46, 32, 68, 111, 110, 101, 99, 32, 97, 99, 32, 108, 105, 103, 117, 108, 97, 46, 32, 73, 110, 32, 113,
+117, 97, 109, 46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 118, 105, 116, 97, 101, 32, 117, 114, 110, 97, 32, 117, 108, 116, 114, 105, 99, 105,
+101, 115, 32, 115, 101, 109, 32, 97, 108, 105, 113, 117, 97, 109, 32, 112, 108, 97, 99, 101, 114, 97, 116, 46, 32, 65, 108, 105, 113, 117, 97, 109,
+32, 101, 114, 97, 116, 32, 118, 111, 108, 117, 116, 112, 97, 116, 46, 32, 78, 97, 109, 32, 101, 115, 116, 46, 32, 68, 111, 110, 101, 99, 32, 102,
+97, 117, 99, 105, 98, 117, 115, 32, 115, 111, 100, 97, 108, 101, 115, 32, 109, 101, 116, 117, 115, 46, 32, 85, 116, 32, 99, 111, 110, 103, 117, 101,
+46, 32, 68, 111, 110, 101, 99, 32, 97, 114, 99, 117, 32, 116, 101, 108, 108, 117, 115, 44, 32, 112, 104, 97, 114, 101, 116, 114, 97, 32, 97, 99,
+44, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 97, 99, 44, 32, 109, 111, 108, 108, 105, 115, 32, 115, 101, 100, 44, 32, 108, 101, 99, 116,
+117, 115, 46, 32, 78, 117, 108, 108, 97, 32, 102, 97, 99, 105, 108, 105, 115, 105, 46, 32, 78, 117, 108, 108, 97, 109, 32, 118, 111, 108, 117, 116,
+112, 97, 116, 32, 110, 117, 110, 99, 32, 101, 116, 32, 102, 101, 108, 105, 115, 46, 32, 83, 101, 100, 32, 112, 101, 100, 101, 32, 111, 100, 105, 111,
+44, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 105, 110, 44, 32, 118, 111, 108, 117, 116, 112, 97, 116, 32, 109, 97, 108, 101, 115, 117, 97,
+100, 97, 44, 32, 102, 101, 117, 103, 105, 97, 116, 32, 103, 114, 97, 118, 105, 100, 97, 44, 32, 110, 117, 108, 108, 97, 46, 32, 78, 117, 108, 108,
+97, 32, 97, 108, 105, 113, 117, 97, 109, 32, 112, 101, 100, 101, 32, 118, 105, 116, 97, 101, 32, 97, 114, 99, 117, 46, 32, 80, 114, 111, 105, 110,
+32, 118, 101, 108, 105, 116, 32, 101, 108, 105, 116, 44, 32, 110, 111, 110, 117, 109, 109, 121, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32, 101,
+108, 101, 109, 101, 110, 116, 117, 109, 32, 118, 105, 116, 97, 101, 44, 32, 118, 97, 114, 105, 117, 115, 32, 118, 105, 116, 97, 101, 44, 32, 100, 111,
+108, 111, 114, 46, 32, 68, 111, 110, 101, 99, 32, 114, 117, 116, 114, 117, 109, 32, 105, 112, 115, 117, 109, 32, 101, 117, 32, 109, 105, 46, 32, 65,
+108, 105, 113, 117, 97, 109, 32, 101, 116, 32, 115, 101, 109, 46, 32, 73, 110, 32, 97, 100, 105, 112, 105, 115, 99, 105, 110, 103, 32, 114, 104, 111,
+110, 99, 117, 115, 32, 118, 101, 108, 105, 116, 46, 32, 78, 97, 109, 32, 118, 105, 118, 101, 114, 114, 97, 32, 115, 99, 101, 108, 101, 114, 105, 115,
+113, 117, 101, 32, 97, 114, 99, 117, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 115, 101, 109, 46, 32, 83, 101, 100, 32, 116, 105, 110, 99, 105,
+100, 117, 110, 116, 32, 110, 117, 108, 108, 97, 32, 113, 117, 105, 115, 32, 109, 97, 115, 115, 97, 46, 32, 77, 97, 117, 114, 105, 115, 32, 102, 97,
+117, 99, 105, 98, 117, 115, 32, 116, 101, 109, 112, 117, 115, 32, 110, 117, 110, 99, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 99, 111,
+110, 100, 105, 109, 101, 110, 116, 117, 109, 46, 32, 67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 97, 108, 105, 113, 117, 101, 116, 32, 105, 97, 99,
+117, 108, 105, 115, 32, 115, 97, 112, 105, 101, 110, 46, 32, 78, 117, 110, 99, 32, 114, 104, 111, 110, 99, 117, 115, 44, 32, 111, 100, 105, 111, 32,
+118, 105, 116, 97, 101, 32, 98, 105, 98, 101, 110, 100, 117, 109, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 44, 32, 116, 101, 108, 108, 117, 115,
+32, 108, 105, 98, 101, 114, 111, 32, 99, 111, 109, 109, 111, 100, 111, 32, 105, 112, 115, 117, 109, 44, 32, 117, 116, 32, 115, 111, 108, 108, 105, 99,
+105, 116, 117, 100, 105, 110, 32, 110, 105, 115, 108, 32, 110, 105, 115, 108, 32, 118, 101, 108, 32, 106, 117, 115, 116, 111, 46, 32, 78, 117, 108, 108,
+97, 32, 102, 97, 99, 105, 108, 105, 115, 105, 46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 98, 108, 97, 110, 100, 105, 116, 32, 101, 110, 105,
+109, 32, 117, 116, 32, 106, 117, 115, 116, 111, 46, 32, 80, 114, 111, 105, 110, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 44, 32, 101, 108, 105,
+116, 32, 101, 103, 101, 116, 32, 97, 99, 99, 117, 109, 115, 97, 110, 32, 112, 117, 108, 118, 105, 110, 97, 114, 44, 32, 111, 114, 99, 105, 32, 113,
+117, 97, 109, 32, 97, 117, 99, 116, 111, 114, 32, 110, 101, 113, 117, 101, 44, 32, 115, 101, 100, 32, 99, 111, 110, 118, 97, 108, 108, 105, 115, 32,
+100, 105, 97, 109, 32, 112, 117, 114, 117, 115, 32, 118, 101, 108, 32, 102, 101, 108, 105, 115, 46, 32, 83, 101, 100, 32, 111, 114, 99, 105, 32, 108,
+101, 111, 44, 32, 101, 108, 101, 105, 102, 101, 110, 100, 32, 118, 101, 108, 44, 32, 98, 108, 97, 110, 100, 105, 116, 32, 110, 111, 110, 44, 32, 115,
+101, 109, 112, 101, 114, 32, 101, 117, 44, 32, 112, 117, 114, 117, 115, 46, 32, 80, 114, 111, 105, 110, 32, 98, 105, 98, 101, 110, 100, 117, 109, 44,
+32, 108, 105, 98, 101, 114, 111, 32, 97, 99, 32, 99, 111, 110, 115, 101, 99, 116, 101, 116, 117, 101, 114, 32, 99, 111, 109, 109, 111, 100, 111, 44,
+32, 101, 114, 111, 115, 32, 115, 97, 112, 105, 101, 110, 32, 98, 108, 97, 110, 100, 105, 116, 32, 110, 105, 115, 108, 44, 32, 101, 117, 32, 101, 108,
+101, 105, 102, 101, 110, 100, 32, 110, 105, 98, 104, 32, 110, 105, 98, 104, 32, 118, 101, 108, 32, 108, 101, 99, 116, 117, 115, 46, 32, 86, 105, 118,
+97, 109, 117, 115, 32, 112, 108, 97, 99, 101, 114, 97, 116, 46, 32, 73, 110, 116, 101, 103, 101, 114, 32, 111, 100, 105, 111, 32, 100, 111, 108, 111,
+114, 44, 32, 112, 104, 97, 114, 101, 116, 114, 97, 32, 110, 111, 110, 44, 32, 115, 111, 100, 97, 108, 101, 115, 32, 105, 100, 44, 32, 118, 105, 118,
+101, 114, 114, 97, 32, 101, 103, 101, 116, 44, 32, 100, 105, 97, 109, 46, 32, 78, 117, 110, 99, 32, 109, 97, 117, 114, 105, 115, 32, 109, 97, 103,
+110, 97, 44, 32, 101, 103, 101, 115, 116, 97, 115, 32, 113, 117, 105, 115, 44, 32, 102, 101, 117, 103, 105, 97, 116, 32, 105, 100, 44, 32, 102, 101,
+114, 109, 101, 110, 116, 117, 109, 32, 118, 105, 118, 101, 114, 114, 97, 44, 32, 109, 105, 46, 32, 65, 101, 110, 101, 97, 110, 32, 115, 117, 115, 99,
+105, 112, 105, 116, 32, 110, 105, 115, 108, 32, 110, 111, 110, 32, 110, 117, 110, 99, 46, 32, 80, 114, 111, 105, 110, 32, 113, 117, 105, 115, 32, 108,
+101, 99, 116, 117, 115, 32, 97, 99, 32, 116, 101, 108, 108, 117, 115, 32, 110, 111, 110, 117, 109, 109, 121, 32, 99, 111, 109, 109, 111, 100, 111, 46,
+32, 78, 117, 110, 99, 32, 101, 103, 101, 116, 32, 100, 105, 97, 109, 32, 97, 99, 32, 101, 108, 105, 116, 32, 118, 101, 115, 116, 105, 98, 117, 108,
+117, 109, 32, 97, 117, 99, 116, 111, 114, 46, 32, 69, 116, 105, 97, 109, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 44, 32, 111, 100, 105, 111,
+32, 115, 101, 100, 32, 108, 97, 99, 105, 110, 105, 97, 32, 99, 111, 110, 115, 101, 113, 117, 97, 116, 44, 32, 106, 117, 115, 116, 111, 32, 109, 105,
+32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 112, 117, 114, 117, 115, 44, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 101, 117, 105, 115, 109,
+111, 100, 32, 108, 105, 98, 101, 114, 111, 32, 109, 101, 116, 117, 115, 32, 115, 101, 100, 32, 116, 111, 114, 116, 111, 114, 46, 32, 77, 97, 101, 99,
+101, 110, 97, 115, 32, 97, 99, 32, 101, 108, 105, 116, 32, 115, 101, 100, 32, 108, 111, 114, 101, 109, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101,
+32, 103, 114, 97, 118, 105, 100, 97, 46, 32, 80, 114, 111, 105, 110, 32, 108, 101, 99, 116, 117, 115, 32, 101, 114, 111, 115, 44, 32, 117, 108, 108,
+97, 109, 99, 111, 114, 112, 101, 114, 32, 105, 100, 44, 32, 118, 111, 108, 117, 116, 112, 97, 116, 32, 113, 117, 105, 115, 44, 32, 99, 111, 110, 100,
+105, 109, 101, 110, 116, 117, 109, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 44, 32, 115, 97, 112, 105, 101, 110, 46, 32, 83, 101, 100, 32, 101,
+116, 32, 109, 97, 115, 115, 97, 32, 101, 103, 101, 116, 32, 108, 111, 114, 101, 109, 32, 97, 108, 105, 113, 117, 101, 116, 32, 116, 101, 109, 112, 117,
+115, 46, 32, 68, 117, 105, 115, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32, 110, 105, 115, 108, 32, 110, 111, 110, 32, 114, 105, 115, 117, 115,
+46, 32, 78, 97, 109, 32, 105, 100, 32, 113, 117, 97, 109, 46, 32, 78, 117, 108, 108, 97, 109, 32, 101, 115, 116, 46, 32, 80, 114, 111, 105, 110,
+32, 111, 114, 99, 105, 32, 100, 105, 97, 109, 44, 32, 112, 111, 115, 117, 101, 114, 101, 32, 101, 116, 44, 32, 112, 104, 97, 114, 101, 116, 114, 97,
+32, 99, 111, 109, 109, 111, 100, 111, 44, 32, 100, 105, 99, 116, 117, 109, 32, 118, 101, 108, 44, 32, 101, 110, 105, 109, 46, 32, 80, 114, 111, 105,
+110, 32, 101, 103, 101, 116, 32, 101, 114, 97, 116, 46, 32, 68, 111, 110, 101, 99, 32, 110, 105, 115, 108, 46, 32, 77, 97, 101, 99, 101, 110, 97,
+115, 32, 97, 117, 99, 116, 111, 114, 32, 118, 101, 108, 105, 116, 32, 117, 116, 32, 112, 101, 100, 101, 46, 32, 78, 117, 110, 99, 32, 118, 105, 116,
+97, 101, 32, 108, 101, 99, 116, 117, 115, 32, 110, 101, 99, 32, 108, 105, 98, 101, 114, 111, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 104,
+101, 110, 100, 114, 101, 114, 105, 116, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 118, 97, 114, 105, 117, 115, 44, 32, 101, 114, 97, 116, 32, 117,
+108, 116, 114, 105, 99, 101, 115, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 101, 117, 105, 115, 109, 111, 100, 44, 32, 112, 117, 114, 117, 115, 32,
+108, 97, 99, 117, 115, 32, 100, 105, 99, 116, 117, 109, 32, 101, 114, 111, 115, 44, 32, 97, 116, 32, 99, 111, 110, 100, 105, 109, 101, 110, 116, 117,
+109, 32, 101, 110, 105, 109, 32, 100, 117, 105, 32, 110, 101, 99, 32, 109, 97, 103, 110, 97, 46, 32, 77, 111, 114, 98, 105, 32, 100, 105, 97, 109,
+46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 115, 101, 100, 32, 101, 115, 116, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 110,
+101, 99, 32, 108, 105, 98, 101, 114, 111, 32, 105, 110, 32, 97, 114, 99, 117, 32, 102, 114, 105, 110, 103, 105, 108, 108, 97, 32, 115, 111, 108, 108,
+105, 99, 105, 116, 117, 100, 105, 110, 46, 32, 73, 110, 32, 114, 117, 116, 114, 117, 109, 32, 110, 105, 115, 108, 32, 97, 116, 32, 97, 114, 99, 117,
+46, 32, 78, 117, 108, 108, 97, 32, 102, 97, 99, 105, 108, 105, 115, 105, 46, 32, 77, 97, 117, 114, 105, 115, 32, 100, 105, 103, 110, 105, 115, 115,
+105, 109, 46, 32, 69, 116, 105, 97, 109, 32, 101, 115, 116, 32, 109, 97, 117, 114, 105, 115, 44, 32, 112, 104, 97, 114, 101, 116, 114, 97, 32, 115,
+101, 100, 44, 32, 118, 105, 118, 101, 114, 114, 97, 32, 101, 116, 44, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 115, 101, 100, 44, 32, 110,
+101, 113, 117, 101, 46, 32, 85, 116, 32, 97, 116, 32, 108, 101, 99, 116, 117, 115, 32, 105, 100, 32, 110, 105, 98, 104, 32, 108, 117, 99, 116, 117,
+115, 32, 111, 114, 110, 97, 114, 101, 46, 32, 77, 97, 117, 114, 105, 115, 32, 118, 97, 114, 105, 117, 115, 32, 112, 111, 114, 116, 116, 105, 116, 111,
+114, 32, 114, 105, 115, 117, 115, 46, 32, 85, 116, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 97, 108, 105, 113, 117, 101, 116, 32, 114, 105,
+115, 117, 115, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 108, 117, 99, 116, 117, 115, 32, 110, 101, 113, 117, 101, 32, 115, 105, 116,
+32, 97, 109, 101, 116, 32, 110, 117, 110, 99, 46, 32, 68, 117, 105, 115, 32, 102, 101, 114, 109, 101, 110, 116, 117, 109, 32, 110, 105, 98, 104, 46,
+32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 100, 97, 112, 105, 98, 117, 115, 46, 32, 80, 114, 111, 105, 110, 32, 101, 114, 111,
+115, 32, 108, 105, 98, 101, 114, 111, 44, 32, 97, 108, 105, 113, 117, 97, 109, 32, 110, 111, 110, 44, 32, 99, 111, 110, 100, 105, 109, 101, 110, 116,
+117, 109, 32, 97, 44, 32, 115, 111, 100, 97, 108, 101, 115, 32, 117, 116, 44, 32, 116, 117, 114, 112, 105, 115, 46, 32, 73, 110, 116, 101, 103, 101,
+114, 32, 97, 99, 99, 117, 109, 115, 97, 110, 32, 109, 105, 32, 115, 101, 100, 32, 108, 111, 114, 101, 109, 46, 32, 86, 101, 115, 116, 105, 98, 117,
+108, 117, 109, 32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 115, 111, 100, 97, 108, 101, 115, 32, 110, 105, 115, 108, 46, 32, 78,
+117, 108, 108, 97, 32, 101, 117, 32, 106, 117, 115, 116, 111, 32, 113, 117, 105, 115, 32, 100, 117, 105, 32, 112, 114, 101, 116, 105, 117, 109, 32, 114,
+104, 111, 110, 99, 117, 115, 46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 118, 105, 118, 101, 114, 114, 97, 32, 99, 111, 109, 109, 111, 100, 111,
+32, 109, 105, 46, 32, 77, 97, 101, 99, 101, 110, 97, 115, 32, 100, 111, 108, 111, 114, 32, 108, 105, 98, 101, 114, 111, 44, 32, 118, 105, 118, 101,
+114, 114, 97, 32, 97, 44, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 32, 118, 105, 116, 97, 101, 44, 32, 97, 108, 105, 113, 117, 101, 116, 32,
+118, 105, 116, 97, 101, 44, 32, 100, 117, 105, 46, 32, 77, 97, 117, 114, 105, 115, 32, 99, 111, 110, 118, 97, 108, 108, 105, 115, 32, 108, 101, 99,
+116, 117, 115, 32, 101, 116, 32, 109, 105, 46, 32, 77, 97, 117, 114, 105, 115, 32, 115, 97, 103, 105, 116, 116, 105, 115, 46, 32, 83, 101, 100, 32,
+97, 114, 99, 117, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 97, 117, 99, 116, 111, 114, 46, 32, 68, 111, 110, 101, 99,
+32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 112, 117, 114, 117, 115, 32, 110, 111, 110, 32, 116, 101, 108, 108, 117, 115, 46, 32,
+85, 116, 32, 108, 101, 111, 32, 119, 105, 115, 105, 44, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32,
+117, 108, 116, 114, 105, 99, 101, 115, 32, 101, 117, 44, 32, 103, 114, 97, 118, 105, 100, 97, 32, 97, 99, 44, 32, 108, 105, 98, 101, 114, 111, 46,
+32, 77, 97, 117, 114, 105, 115, 32, 102, 101, 114, 109, 101, 110, 116, 117, 109, 32, 100, 97, 112, 105, 98, 117, 115, 32, 100, 105, 97, 109, 46, 32,
+73, 110, 116, 101, 103, 101, 114, 32, 113, 117, 105, 115, 32, 108, 97, 99, 117, 115, 32, 100, 97, 112, 105, 98, 117, 115, 32, 111, 100, 105, 111, 32,
+112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 118, 97, 114, 105, 117, 115, 46, 32, 70, 117, 115, 99, 101, 32, 112, 101, 100, 101, 32,
+113, 117, 97, 109, 44, 32, 118, 101, 104, 105, 99, 117, 108, 97, 32, 117, 116, 44, 32, 112, 117, 108, 118, 105, 110, 97, 114, 32, 101, 116, 44, 32,
+116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 115, 101, 100, 44, 32, 102, 101, 108, 105, 115, 46, 32, 67, 117, 114, 97, 98, 105, 116, 117, 114, 32,
+101, 114, 111, 115, 32, 101, 110, 105, 109, 44, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 115, 101, 100, 44, 32, 97, 108, 105, 113, 117, 97,
+109, 32, 97, 99, 44, 32, 101, 117, 105, 115, 109, 111, 100, 32, 97, 99, 44, 32, 101, 114, 97, 116, 46, 32, 85, 116, 32, 100, 105, 103, 110, 105,
+115, 115, 105, 109, 44, 32, 108, 97, 99, 117, 115, 32, 97, 32, 105, 110, 116, 101, 114, 100, 117, 109, 32, 105, 97, 99, 117, 108, 105, 115, 44, 32,
+101, 110, 105, 109, 32, 111, 114, 99, 105, 32, 112, 111, 115, 117, 101, 114, 101, 32, 110, 117, 110, 99, 44, 32, 110, 101, 99, 32, 117, 108, 116, 114,
+105, 99, 105, 101, 115, 32, 108, 101, 99, 116, 117, 115, 32, 114, 105, 115, 117, 115, 32, 105, 110, 32, 111, 100, 105, 111, 46, 32, 69, 116, 105, 97,
+109, 32, 101, 116, 32, 109, 97, 115, 115, 97, 32, 105, 100, 32, 100, 117, 105, 32, 99, 111, 109, 109, 111, 100, 111, 32, 118, 101, 104, 105, 99, 117,
+108, 97, 46, 32, 78, 117, 110, 99, 32, 98, 108, 97, 110, 100, 105, 116, 32, 116, 111, 114, 116, 111, 114, 32, 113, 117, 105, 115, 32, 100, 117, 105,
+46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 110, 105, 115, 108, 46, 32, 83, 101, 100, 32, 118, 101, 110, 101, 110, 97, 116, 105, 115, 32, 98, 108,
+97, 110, 100, 105, 116, 32, 108, 105, 103, 117, 108, 97, 46, 32, 70, 117, 115, 99, 101, 32, 118, 105, 118, 101, 114, 114, 97, 32, 105, 109, 112, 101,
+114, 100, 105, 101, 116, 32, 109, 97, 103, 110, 97, 46, 32, 68, 111, 110, 101, 99, 32, 101, 103, 101, 116, 32, 110, 117, 110, 99, 32, 113, 117, 105,
+115, 32, 101, 115, 116, 32, 112, 104, 97, 114, 101, 116, 114, 97, 32, 108, 111, 98, 111, 114, 116, 105, 115, 46, 32, 86, 101, 115, 116, 105, 98, 117,
+108, 117, 109, 32, 113, 117, 105, 115, 32, 108, 101, 99, 116, 117, 115, 46, 32, 77, 97, 117, 114, 105, 115, 32, 118, 101, 108, 32, 111, 114, 99, 105,
+32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 110, 117, 110, 99, 32, 102, 101, 114, 109, 101, 110, 116, 117, 109, 32, 98, 105, 98, 101, 110, 100, 117,
+109, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 101, 103, 101, 116, 32, 108, 101, 111, 46, 32, 77, 111, 114, 98, 105, 32,
+118, 101, 108, 32, 117, 114, 110, 97, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 101, 114, 97, 116, 32, 102, 101, 114, 109, 101, 110, 116, 117, 109,
+32, 102, 97, 99, 105, 108, 105, 115, 105, 115, 46, 32, 83, 101, 100, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 44, 32, 108, 105, 98, 101, 114,
+111, 32, 101, 116, 32, 115, 111, 108, 108, 105, 99, 105, 116, 117, 100, 105, 110, 32, 99, 111, 110, 103, 117, 101, 44, 32, 119, 105, 115, 105, 32, 108,
+101, 99, 116, 117, 115, 32, 115, 111, 100, 97, 108, 101, 115, 32, 100, 111, 108, 111, 114, 44, 32, 101, 103, 101, 116, 32, 109, 111, 108, 101, 115, 116,
+105, 101, 32, 109, 97, 103, 110, 97, 32, 111, 114, 99, 105, 32, 118, 101, 108, 32, 116, 101, 108, 108, 117, 115, 46, 32, 83, 101, 100, 32, 116, 101,
+109, 112, 111, 114, 32, 97, 110, 116, 101, 32, 101, 116, 32, 101, 110, 105, 109, 46, 32, 77, 97, 117, 114, 105, 115, 32, 101, 108, 105, 116, 46, 32,
+67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 117, 108, 108, 97, 109, 99, 111, 114, 112, 101, 114, 32, 118, 101, 104, 105, 99, 117, 108, 97, 32, 109,
+97, 115, 115, 97, 46, 32, 83, 101, 100, 32, 118, 105, 118, 101, 114, 114, 97, 46, 32, 68, 117, 105, 115, 32, 110, 117, 108, 108, 97, 46, 32, 78,
+97, 109, 32, 98, 105, 98, 101, 110, 100, 117, 109, 46, 32, 78, 97, 109, 32, 116, 111, 114, 116, 111, 114, 32, 108, 111, 114, 101, 109, 44, 32, 117,
+108, 108, 97, 109, 99, 111, 114, 112, 101, 114, 32, 118, 105, 116, 97, 101, 44, 32, 100, 105, 99, 116, 117, 109, 32, 115, 101, 100, 44, 32, 112, 111,
+115, 117, 101, 114, 101, 32, 101, 117, 44, 32, 106, 117, 115, 116, 111, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 97, 100, 105, 112, 105, 115, 99,
+105, 110, 103, 32, 97, 114, 99, 117, 32, 118, 105, 116, 97, 101, 32, 116, 117, 114, 112, 105, 115, 46, 32, 68, 111, 110, 101, 99, 32, 109, 97, 108,
+101, 115, 117, 97, 100, 97, 32, 112, 111, 115, 117, 101, 114, 101, 32, 108, 105, 98, 101, 114, 111, 46, 32, 85, 116, 32, 115, 101, 100, 32, 116, 101,
+108, 108, 117, 115, 46, 32, 70, 117, 115, 99, 101, 32, 115, 101, 100, 32, 110, 117, 110, 99, 32, 101, 103, 101, 116, 32, 110, 105, 115, 108, 32, 100,
+97, 112, 105, 98, 117, 115, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 112, 111,
+116, 101, 110, 116, 105, 46, 32, 73, 110, 116, 101, 103, 101, 114, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 108, 105, 98, 101, 114, 111, 32,
+101, 116, 32, 109, 101, 116, 117, 115, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 112, 111, 115, 117, 101, 114, 101, 46, 32, 77, 97, 101, 99, 101,
+110, 97, 115, 32, 110, 111, 110, 32, 115, 101, 109, 32, 110, 111, 110, 32, 113, 117, 97, 109, 32, 102, 101, 114, 109, 101, 110, 116, 117, 109, 32, 98,
+108, 97, 110, 100, 105, 116, 46, 32, 68, 117, 105, 115, 32, 114, 105, 115, 117, 115, 32, 116, 101, 108, 108, 117, 115, 44, 32, 114, 117, 116, 114, 117,
+109, 32, 118, 105, 116, 97, 101, 44, 32, 105, 109, 112, 101, 114, 100, 105, 101, 116, 32, 110, 101, 99, 44, 32, 109, 97, 108, 101, 115, 117, 97, 100,
+97, 32, 110, 101, 99, 44, 32, 105, 112, 115, 117, 109, 46, 32, 78, 117, 110, 99, 32, 113, 117, 97, 109, 32, 100, 111, 108, 111, 114, 44, 32, 108,
+117, 99, 116, 117, 115, 32, 101, 103, 101, 116, 44, 32, 112, 108, 97, 99, 101, 114, 97, 116, 32, 110, 111, 110, 44, 32, 114, 104, 111, 110, 99, 117,
+115, 32, 97, 116, 44, 32, 116, 101, 108, 108, 117, 115, 46, 32, 68, 117, 105, 115, 32, 112, 101, 100, 101, 32, 108, 101, 99, 116, 117, 115, 44, 32,
+109, 97, 116, 116, 105, 115, 32, 97, 100, 105, 112, 105, 115, 99, 105, 110, 103, 44, 32, 116, 101, 109, 112, 111, 114, 32, 117, 116, 44, 32, 112, 111,
+114, 116, 97, 32, 97, 116, 44, 32, 109, 105, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 114, 105, 115, 117, 115, 32, 110,
+117, 108, 108, 97, 44, 32, 115, 111, 100, 97, 108, 101, 115, 32, 115, 101, 100, 44, 32, 105, 110, 116, 101, 114, 100, 117, 109, 32, 105, 100, 44, 32,
+110, 111, 110, 117, 109, 109, 121, 32, 118, 105, 116, 97, 101, 44, 32, 108, 105, 103, 117, 108, 97, 46, 32, 77, 111, 114, 98, 105, 32, 112, 117, 108,
+118, 105, 110, 97, 114, 32, 112, 101, 100, 101, 32, 117, 116, 32, 109, 97, 115, 115, 97, 46, 32, 78, 117, 110, 99, 32, 114, 105, 115, 117, 115, 32,
+109, 97, 117, 114, 105, 115, 44, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 101, 116, 44, 32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 101,
+117, 44, 32, 115, 117, 115, 99, 105, 112, 105, 116, 32, 118, 101, 108, 44, 32, 111, 114, 99, 105, 46, 32, 73, 110, 32, 102, 97, 117, 99, 105, 98,
+117, 115, 32, 102, 101, 108, 105, 115, 32, 105, 110, 32, 97, 114, 99, 117, 46, 32, 78, 117, 108, 108, 97, 32, 115, 105, 116, 32, 97, 109, 101, 116,
+32, 101, 108, 105, 116, 46, 32, 78, 117, 108, 108, 97, 32, 101, 114, 97, 116, 32, 115, 97, 112, 105, 101, 110, 44, 32, 115, 97, 103, 105, 116, 116,
+105, 115, 32, 101, 103, 101, 116, 44, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 101, 103, 101, 116, 44, 32, 118, 105, 118, 101, 114, 114, 97,
+32, 101, 117, 44, 32, 102, 101, 108, 105, 115, 46, 32, 78, 97, 109, 32, 97, 99, 32, 105, 112, 115, 117, 109, 46, 32, 83, 117, 115, 112, 101, 110,
+100, 105, 115, 115, 101, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 116, 117, 114, 112, 105, 115, 32, 118, 101, 108, 32, 115, 101, 109, 32, 108,
+97, 99, 105, 110, 105, 97, 32, 117, 108, 108, 97, 109, 99, 111, 114, 112, 101, 114, 46, 32, 77, 97, 117, 114, 105, 115, 32, 111, 114, 110, 97, 114,
+101, 32, 105, 112, 115, 117, 109, 32, 115, 101, 100, 32, 108, 105, 103, 117, 108, 97, 46, 32, 68, 117, 105, 115, 32, 102, 97, 99, 105, 108, 105, 115,
+105, 115, 32, 110, 101, 113, 117, 101, 32, 113, 117, 105, 115, 32, 111, 114, 99, 105, 46, 32, 78, 117, 108, 108, 97, 109, 32, 101, 116, 32, 101, 114,
+97, 116, 32, 101, 116, 32, 111, 114, 99, 105, 32, 108, 97, 99, 105, 110, 105, 97, 32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 46,
+32, 68, 111, 110, 101, 99, 32, 97, 99, 32, 105, 112, 115, 117, 109, 46, 32, 68, 117, 105, 115, 32, 109, 111, 108, 101, 115, 116, 105, 101, 32, 105,
+112, 115, 117, 109, 32, 97, 99, 32, 97, 114, 99, 117, 46, 32, 65, 101, 110, 101, 97, 110, 32, 99, 111, 110, 103, 117, 101, 32, 97, 99, 99, 117,
+109, 115, 97, 110, 32, 97, 110, 116, 101, 46, 32, 73, 110, 116, 101, 103, 101, 114, 32, 98, 105, 98, 101, 110, 100, 117, 109, 44, 32, 108, 101, 111,
+32, 117, 116, 32, 111, 114, 110, 97, 114, 101, 32, 97, 108, 105, 113, 117, 97, 109, 44, 32, 110, 117, 110, 99, 32, 101, 114, 97, 116, 32, 99, 111,
+110, 100, 105, 109, 101, 110, 116, 117, 109, 32, 97, 114, 99, 117, 44, 32, 117, 116, 32, 112, 117, 108, 118, 105, 110, 97, 114, 32, 109, 105, 32, 97,
+117, 103, 117, 101, 32, 101, 116, 32, 110, 117, 108, 108, 97, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 108, 97, 99, 105, 110, 105, 97, 32, 97,
+108, 105, 113, 117, 101, 116, 32, 119, 105, 115, 105, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 110, 101, 99, 32, 100, 117, 105, 46, 32, 69, 116,
+105, 97, 109, 32, 119, 105, 115, 105, 32, 108, 101, 111, 44, 32, 101, 117, 105, 115, 109, 111, 100, 32, 118, 105, 116, 97, 101, 44, 32, 118, 117, 108,
+112, 117, 116, 97, 116, 101, 32, 97, 44, 32, 100, 105, 99, 116, 117, 109, 32, 118, 105, 116, 97, 101, 44, 32, 113, 117, 97, 109, 46, 32, 81, 117,
+105, 115, 113, 117, 101, 32, 113, 117, 105, 115, 32, 116, 111, 114, 116, 111, 114, 46, 32, 69, 116, 105, 97, 109, 32, 105, 110, 116, 101, 114, 100, 117,
+109, 46, 32, 73, 110, 32, 109, 97, 115, 115, 97, 32, 101, 114, 97, 116, 44, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32, 115, 101, 100, 44,
+32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 118, 101, 108, 44, 32, 118, 101, 104, 105, 99, 117, 108, 97, 32, 102, 114, 105, 110, 103, 105, 108,
+108, 97, 44, 32, 97, 117, 103, 117, 101, 46, 32, 78, 117, 108, 108, 97, 32, 118, 101, 108, 32, 117, 114, 110, 97, 46, 32, 73, 110, 32, 108, 105,
+98, 101, 114, 111, 32, 109, 105, 44, 32, 112, 114, 101, 116, 105, 117, 109, 32, 115, 101, 100, 44, 32, 109, 97, 116, 116, 105, 115, 32, 116, 101, 109,
+112, 117, 115, 44, 32, 115, 97, 103, 105, 116, 116, 105, 115, 32, 115, 101, 100, 44, 32, 109, 97, 115, 115, 97, 46, 32, 83, 117, 115, 112, 101, 110,
+100, 105, 115, 115, 101, 32, 113, 117, 97, 109, 32, 119, 105, 115, 105, 44, 32, 102, 101, 114, 109, 101, 110, 116, 117, 109, 32, 113, 117, 105, 115, 44,
+32, 115, 97, 103, 105, 116, 116, 105, 115, 32, 97, 116, 44, 32, 99, 111, 110, 115, 101, 113, 117, 97, 116, 32, 101, 103, 101, 116, 44, 32, 111, 100,
+105, 111, 46, 32, 78, 117, 108, 108, 97, 109, 32, 105, 109, 112, 101, 114, 100, 105, 101, 116, 44, 32, 112, 117, 114, 117, 115, 32, 113, 117, 105, 115,
+32, 97, 108, 105, 113, 117, 97, 109, 32, 99, 117, 114, 115, 117, 115, 44, 32, 116, 117, 114, 112, 105, 115, 32, 111, 100, 105, 111, 32, 101, 103, 101,
+115, 116, 97, 115, 32, 106, 117, 115, 116, 111, 44, 32, 112, 108, 97, 99, 101, 114, 97, 116, 32, 103, 114, 97, 118, 105, 100, 97, 32, 116, 117, 114,
+112, 105, 115, 32, 119, 105, 115, 105, 32, 118, 101, 108, 32, 116, 111, 114, 116, 111, 114, 46, 32, 78, 117, 110, 99, 32, 117, 108, 116, 114, 105, 99,
+105, 101, 115, 32, 112, 111, 114, 116, 97, 32, 112, 117, 114, 117, 115, 46, 32, 80, 114, 111, 105, 110, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109,
+32, 101, 114, 97, 116, 32, 97, 99, 32, 111, 114, 99, 105, 46, 32, 85, 116, 32, 118, 101, 108, 32, 109, 97, 103, 110, 97, 32, 110, 101, 99, 32,
+109, 105, 32, 102, 101, 117, 103, 105, 97, 116, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 46, 32, 85, 116, 32, 108, 105, 103, 117, 108, 97, 46,
+32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 97, 110, 116, 101, 32, 105, 112, 115, 117, 109, 32, 112, 114, 105, 109, 105, 115, 32, 105, 110,
+32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 111, 114, 99, 105, 32, 108, 117, 99, 116, 117, 115, 32, 101, 116, 32, 117, 108, 116, 114, 105, 99, 101,
+115, 32, 112, 111, 115, 117, 101, 114, 101, 32, 99, 117, 98, 105, 108, 105, 97, 32, 67, 117, 114, 97, 101, 59, 32, 68, 111, 110, 101, 99, 32, 101,
+116, 32, 109, 97, 103, 110, 97, 32, 105, 110, 32, 100, 105, 97, 109, 32, 112, 111, 114, 116, 97, 32, 110, 111, 110, 117, 109, 109, 121, 46, 32, 77,
+97, 101, 99, 101, 110, 97, 115, 32, 117, 116, 32, 115, 101, 109, 32, 105, 110, 32, 116, 117, 114, 112, 105, 115, 32, 102, 101, 114, 109, 101, 110, 116,
+117, 109, 32, 118, 105, 118, 101, 114, 114, 97, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 97, 116, 32, 111, 114, 99, 105, 46,
+32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 104, 97, 98, 105, 116, 97, 110, 116, 32, 109, 111, 114, 98, 105, 32, 116, 114, 105,
+115, 116, 105, 113, 117, 101, 32, 115, 101, 110, 101, 99, 116, 117, 115, 32, 101, 116, 32, 110, 101, 116, 117, 115, 32, 101, 116, 32, 109, 97, 108, 101,
+115, 117, 97, 100, 97, 32, 102, 97, 109, 101, 115, 32, 97, 99, 32, 116, 117, 114, 112, 105, 115, 32, 101, 103, 101, 115, 116, 97, 115, 46, 32, 86,
+101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 97, 110, 116, 101, 32, 105, 112, 115, 117, 109, 32, 112, 114, 105, 109, 105, 115, 32, 105, 110, 32, 102,
+97, 117, 99, 105, 98, 117, 115, 32, 111, 114, 99, 105, 32, 108, 117, 99, 116, 117, 115, 32, 101, 116, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32,
+112, 111, 115, 117, 101, 114, 101, 32, 99, 117, 98, 105, 108, 105, 97, 32, 67, 117, 114, 97, 101, 59, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115,
+113, 117, 101, 32, 114, 117, 116, 114, 117, 109, 32, 101, 108, 101, 105, 102, 101, 110, 100, 32, 106, 117, 115, 116, 111, 46, 32, 78, 117, 108, 108, 97,
+109, 32, 118, 105, 116, 97, 101, 32, 112, 101, 100, 101, 46, 32, 68, 111, 110, 101, 99, 32, 99, 111, 110, 100, 105, 109, 101, 110, 116, 117, 109, 32,
+110, 105, 98, 104, 32, 101, 116, 32, 111, 100, 105, 111, 46, 32, 83, 101, 100, 32, 101, 116, 32, 109, 101, 116, 117, 115, 46, 32, 67, 108, 97, 115,
+115, 32, 97, 112, 116, 101, 110, 116, 32, 116, 97, 99, 105, 116, 105, 32, 115, 111, 99, 105, 111, 115, 113, 117, 32, 97, 100, 32, 108, 105, 116, 111,
+114, 97, 32, 116, 111, 114, 113, 117, 101, 110, 116, 32, 112, 101, 114, 32, 99, 111, 110, 117, 98, 105, 97, 32, 110, 111, 115, 116, 114, 97, 44, 32,
+112, 101, 114, 32, 105, 110, 99, 101, 112, 116, 111, 115, 32, 104, 121, 109, 101, 110, 97, 101, 111, 115, 46, 32, 78, 97, 109, 32, 116, 101, 109, 112,
+117, 115, 46, 32, 83, 101, 100, 32, 97, 99, 32, 119, 105, 115, 105, 46, 32, 73, 110, 32, 104, 97, 99, 32, 104, 97, 98, 105, 116, 97, 115, 115,
+101, 32, 112, 108, 97, 116, 101, 97, 32, 100, 105, 99, 116, 117, 109, 115, 116, 46, 32, 83, 101, 100, 32, 115, 101, 100, 32, 119, 105, 115, 105, 46,
+32, 85, 116, 32, 102, 97, 99, 105, 108, 105, 115, 105, 115, 32, 116, 101, 108, 108, 117, 115, 32, 110, 111, 110, 32, 108, 105, 103, 117, 108, 97, 46,
+32, 73, 110, 116, 101, 103, 101, 114, 32, 109, 101, 116, 117, 115, 46, 32, 73, 110, 32, 108, 97, 99, 105, 110, 105, 97, 32, 100, 117, 105, 46, 32,
+67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 111, 114, 110, 97, 114, 101, 46, 32, 77, 97, 117, 114, 105, 115, 32, 118, 101, 108, 32, 117, 114, 110,
+97, 46, 32, 78, 97, 109, 32, 99, 111, 110, 115, 101, 99, 116, 101, 116, 117, 101, 114, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 117, 114,
+110, 97, 46, 32, 78, 117, 110, 99, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32, 101, 114, 97,
+116, 46, 32, 83, 101, 100, 32, 98, 108, 97, 110, 100, 105, 116, 44, 32, 114, 105, 115, 117, 115, 32, 110, 111, 110, 32, 99, 111, 109, 109, 111, 100,
+111, 32, 110, 111, 110, 117, 109, 109, 121, 44, 32, 108, 105, 103, 117, 108, 97, 32, 101, 114, 97, 116, 32, 102, 101, 114, 109, 101, 110, 116, 117, 109,
+32, 110, 105, 98, 104, 44, 32, 101, 117, 32, 102, 97, 99, 105, 108, 105, 115, 105, 115, 32, 97, 110, 116, 101, 32, 110, 101, 113, 117, 101, 32, 115,
+101, 100, 32, 115, 101, 109, 46, 32, 69, 116, 105, 97, 109, 32, 115, 99, 101, 108, 101, 114, 105, 115, 113, 117, 101, 32, 106, 117, 115, 116, 111, 32,
+101, 103, 101, 116, 32, 119, 105, 115, 105, 46, 32, 78, 117, 110, 99, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 46, 32, 80, 114, 111, 105, 110,
+32, 112, 117, 108, 118, 105, 110, 97, 114, 32, 113, 117, 97, 109, 32, 110, 111, 110, 32, 108, 101, 99, 116, 117, 115, 46, 32, 80, 114, 111, 105, 110,
+32, 117, 116, 32, 116, 117, 114, 112, 105, 115, 32, 113, 117, 105, 115, 32, 97, 117, 103, 117, 101, 32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113,
+117, 101, 32, 100, 105, 99, 116, 117, 109, 46, 32, 70, 117, 115, 99, 101, 32, 101, 116, 32, 108, 111, 114, 101, 109, 46, 32, 65, 108, 105, 113, 117,
+97, 109, 32, 117, 114, 110, 97, 32, 108, 97, 99, 117, 115, 44, 32, 98, 108, 97, 110, 100, 105, 116, 32, 115, 101, 100, 44, 32, 118, 101, 115, 116,
+105, 98, 117, 108, 117, 109, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32, 112, 108, 97, 99, 101, 114, 97, 116, 32, 101, 116, 44, 32, 100, 111,
+108, 111, 114, 46, 32, 67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 97, 117, 99, 116, 111, 114, 32, 101, 114, 97, 116, 32, 110, 101, 99, 32, 108,
+111, 114, 101, 109, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 117, 114, 110, 97, 32, 119, 105, 115, 105, 44, 32, 108, 97, 99, 105, 110,
+105, 97, 32, 117, 116, 44, 32, 109, 111, 108, 101, 115, 116, 105, 101, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 44, 32, 99, 111, 110, 100, 105,
+109, 101, 110, 116, 117, 109, 32, 105, 100, 44, 32, 111, 100, 105, 111, 46, 32, 67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 99, 111, 110, 118, 97,
+108, 108, 105, 115, 32, 117, 108, 108, 97, 109, 99, 111, 114, 112, 101, 114, 32, 106, 117, 115, 116, 111, 46, 32, 68, 111, 110, 101, 99, 32, 118, 101,
+115, 116, 105, 98, 117, 108, 117, 109, 32, 101, 115, 116, 32, 97, 99, 32, 113, 117, 97, 109, 46, 32, 78, 117, 108, 108, 97, 109, 32, 118, 105, 116,
+97, 101, 32, 101, 108, 105, 116, 32, 101, 117, 32, 109, 97, 115, 115, 97, 32, 118, 97, 114, 105, 117, 115, 32, 118, 117, 108, 112, 117, 116, 97, 116,
+101, 46, 32, 78, 117, 108, 108, 97, 32, 102, 97, 99, 105, 108, 105, 115, 105, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 112,
+111, 116, 101, 110, 116, 105, 46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 110, 111, 110, 32, 108, 105, 98, 101, 114, 111, 46, 32, 78, 117, 108,
+108, 97, 109, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 109, 97, 115, 115, 97, 32, 105, 100, 32, 109, 97, 103, 110, 97, 32, 118, 105, 118,
+101, 114, 114, 97, 32, 99, 111, 109, 109, 111, 100, 111, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 108, 105, 98, 101, 114, 111, 32,
+116, 111, 114, 116, 111, 114, 44, 32, 108, 117, 99, 116, 117, 115, 32, 97, 99, 44, 32, 118, 105, 118, 101, 114, 114, 97, 32, 99, 111, 110, 103, 117,
+101, 44, 32, 99, 111, 110, 115, 101, 99, 116, 101, 116, 117, 101, 114, 32, 118, 101, 108, 44, 32, 108, 105, 98, 101, 114, 111, 46, 32, 65, 101, 110,
+101, 97, 110, 32, 97, 114, 99, 117, 32, 97, 117, 103, 117, 101, 44, 32, 108, 117, 99, 116, 117, 115, 32, 105, 100, 44, 32, 108, 97, 111, 114, 101,
+101, 116, 32, 112, 117, 108, 118, 105, 110, 97, 114, 44, 32, 100, 105, 99, 116, 117, 109, 32, 115, 101, 100, 44, 32, 108, 101, 99, 116, 117, 115, 46,
+32, 68, 111, 110, 101, 99, 32, 118, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 118, 111, 108, 117, 116, 112, 97, 116, 32, 100, 111, 108, 111, 114,
+46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 104, 97, 98, 105, 116, 97, 110, 116, 32, 109, 111, 114, 98, 105, 32, 116, 114,
+105, 115, 116, 105, 113, 117, 101, 32, 115, 101, 110, 101, 99, 116, 117, 115, 32, 101, 116, 32, 110, 101, 116, 117, 115, 32, 101, 116, 32, 109, 97, 108,
+101, 115, 117, 97, 100, 97, 32, 102, 97, 109, 101, 115, 32, 97, 99, 32, 116, 117, 114, 112, 105, 115, 32, 101, 103, 101, 115, 116, 97, 115, 46, 32,
+80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 97, 117, 103, 117, 101, 32, 116, 117, 114, 112, 105, 115, 44, 32, 108, 97, 111, 114, 101,
+101, 116, 32, 110, 101, 99, 44, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 97, 116, 44, 32, 110, 111, 110, 117, 109, 109, 121, 32, 118, 105,
+116, 97, 101, 44, 32, 110, 105, 98, 104, 46, 32, 69, 116, 105, 97, 109, 32, 111, 114, 99, 105, 32, 115, 97, 112, 105, 101, 110, 44, 32, 99, 111,
+110, 103, 117, 101, 32, 105, 110, 44, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32, 114, 117, 116,
+114, 117, 109, 32, 118, 101, 108, 44, 32, 110, 105, 98, 104, 46, 32, 73, 110, 116, 101, 103, 101, 114, 32, 101, 117, 32, 108, 111, 114, 101, 109, 46,
+32, 77, 97, 117, 114, 105, 115, 32, 112, 114, 101, 116, 105, 117, 109, 32, 108, 101, 111, 32, 101, 116, 32, 101, 108, 105, 116, 46, 32, 73, 110, 32,
+110, 111, 110, 117, 109, 109, 121, 32, 117, 108, 116, 114, 105, 99, 105, 101, 115, 32, 115, 97, 112, 105, 101, 110, 46, 32, 77, 97, 117, 114, 105, 115,
+32, 118, 97, 114, 105, 117, 115, 46, 32, 77, 97, 117, 114, 105, 115, 32, 115, 101, 100, 32, 108, 105, 98, 101, 114, 111, 46, 32, 67, 117, 114, 97,
+98, 105, 116, 117, 114, 32, 117, 108, 108, 97, 109, 99, 111, 114, 112, 101, 114, 32, 101, 108, 105, 116, 32, 101, 117, 32, 112, 117, 114, 117, 115, 46,
+32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 118, 101, 108, 105, 116, 32, 112, 101, 100, 101, 44, 32, 115, 101, 109, 112, 101, 114, 32, 115,
+105, 116, 32, 97, 109, 101, 116, 44, 32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 118, 105, 116, 97, 101, 44, 32, 116, 105, 110, 99, 105, 100, 117,
+110, 116, 32, 118, 101, 108, 44, 32, 100, 117, 105, 46, 32, 78, 117, 108, 108, 97, 32, 110, 101, 113, 117, 101, 32, 97, 110, 116, 101, 44, 32, 115,
+97, 103, 105, 116, 116, 105, 115, 32, 101, 117, 44, 32, 118, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 101, 116, 44, 32, 108, 97, 99, 105, 110,
+105, 97, 32, 97, 44, 32, 108, 105, 98, 101, 114, 111, 46, 32, 77, 111, 114, 98, 105, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 119, 105, 115,
+105, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 110, 111, 110, 32, 102, 101, 108, 105, 115, 32, 113, 117, 105, 115, 32, 97,
+114, 99, 117, 32, 98, 105, 98, 101, 110, 100, 117, 109, 32, 111, 114, 110, 97, 114, 101, 46, 32, 65, 101, 110, 101, 97, 110, 32, 101, 110, 105, 109,
+32, 109, 101, 116, 117, 115, 44, 32, 99, 111, 109, 109, 111, 100, 111, 32, 101, 117, 44, 32, 104, 101, 110, 100, 114, 101, 114, 105, 116, 32, 110, 111,
+110, 117, 109, 109, 121, 44, 32, 101, 117, 105, 115, 109, 111, 100, 32, 117, 116, 44, 32, 113, 117, 97, 109, 46, 32, 78, 117, 108, 108, 97, 32, 101,
+108, 101, 105, 102, 101, 110, 100, 32, 110, 105, 115, 108, 32, 113, 117, 105, 115, 32, 100, 111, 108, 111, 114, 46, 32, 67, 108, 97, 115, 115, 32, 97,
+112, 116, 101, 110, 116, 32, 116, 97, 99, 105, 116, 105, 32, 115, 111, 99, 105, 111, 115, 113, 117, 32, 97, 100, 32, 108, 105, 116, 111, 114, 97, 32,
+116, 111, 114, 113, 117, 101, 110, 116, 32, 112, 101, 114, 32, 99, 111, 110, 117, 98, 105, 97, 32, 110, 111, 115, 116, 114, 97, 44, 32, 112, 101, 114,
+32, 105, 110, 99, 101, 112, 116, 111, 115, 32, 104, 121, 109, 101, 110, 97, 101, 111, 115, 46, 32, 77, 97, 101, 99, 101, 110, 97, 115, 32, 112, 101,
+108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 109, 97, 115, 115, 97, 32, 105, 110, 32, 101, 114, 97, 116, 32, 109, 111, 108, 101, 115, 116, 105,
+101, 32, 109, 111, 108, 101, 115, 116, 105, 101, 46, 32, 77, 97, 117, 114, 105, 115, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 100, 97, 112,
+105, 98, 117, 115, 32, 108, 105, 98, 101, 114, 111, 46, 32, 83, 101, 100, 32, 115, 101, 100, 32, 114, 105, 115, 117, 115, 32, 105, 100, 32, 110, 101,
+113, 117, 101, 32, 100, 105, 99, 116, 117, 109, 32, 111, 114, 110, 97, 114, 101, 46, 32, 83, 101, 100, 32, 101, 117, 32, 108, 105, 103, 117, 108, 97,
+32, 97, 116, 32, 102, 101, 108, 105, 115, 32, 115, 111, 100, 97, 108, 101, 115, 32, 97, 99, 99, 117, 109, 115, 97, 110, 46, 32, 83, 101, 100, 32,
+105, 110, 116, 101, 114, 100, 117, 109, 44, 32, 117, 114, 110, 97, 32, 110, 111, 110, 32, 112, 104, 97, 114, 101, 116, 114, 97, 32, 104, 101, 110, 100,
+114, 101, 114, 105, 116, 44, 32, 113, 117, 97, 109, 32, 109, 105, 32, 111, 114, 110, 97, 114, 101, 32, 108, 105, 98, 101, 114, 111, 44, 32, 105, 100,
+32, 102, 114, 105, 110, 103, 105, 108, 108, 97, 32, 116, 111, 114, 116, 111, 114, 32, 111, 114, 99, 105, 32, 110, 111, 110, 32, 118, 101, 108, 105, 116,
+46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 110, 101, 99, 32, 114, 105, 115, 117, 115, 46, 32, 68, 111, 110, 101, 99, 32, 97, 116, 32, 110, 117,
+110, 99, 32, 118, 105, 116, 97, 101, 32, 116, 101, 108, 108, 117, 115, 32, 109, 111, 108, 101, 115, 116, 105, 101, 32, 118, 101, 115, 116, 105, 98, 117,
+108, 117, 109, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 118, 101, 108, 32, 106, 117, 115, 116, 111, 46, 32, 68, 117, 105,
+115, 32, 108, 105, 103, 117, 108, 97, 32, 108, 105, 98, 101, 114, 111, 44, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 113, 117, 105, 115, 44,
+32, 97, 100, 105, 112, 105, 115, 99, 105, 110, 103, 32, 98, 105, 98, 101, 110, 100, 117, 109, 44, 32, 102, 101, 117, 103, 105, 97, 116, 32, 118, 105,
+116, 97, 101, 44, 32, 118, 101, 108, 105, 116, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 101, 116, 32, 97, 114, 99, 117, 46, 32, 70, 117, 115,
+99, 101, 32, 101, 103, 101, 116, 32, 113, 117, 97, 109, 46, 32, 85, 116, 32, 97, 110, 116, 101, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115,
+115, 101, 32, 102, 101, 117, 103, 105, 97, 116, 32, 109, 101, 116, 117, 115, 32, 110, 111, 110, 32, 105, 112, 115, 117, 109, 46, 32, 78, 117, 108, 108,
+97, 32, 116, 101, 109, 112, 117, 115, 32, 108, 101, 111, 32, 117, 116, 32, 109, 105, 46, 32, 67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 118, 105,
+116, 97, 101, 32, 110, 105, 115, 108, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 46, 32, 69, 116, 105,
+97, 109, 32, 97, 32, 111, 114, 99, 105, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 97, 110, 116, 101, 32, 105, 112, 115, 117, 109,
+32, 112, 114, 105, 109, 105, 115, 32, 105, 110, 32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 111, 114, 99, 105, 32, 108, 117, 99, 116, 117, 115, 32,
+101, 116, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 112, 111, 115, 117, 101, 114, 101, 32, 99, 117, 98, 105, 108, 105, 97, 32, 67, 117, 114, 97,
+101, 59, 32, 86, 105, 118, 97, 109, 117, 115, 32, 117, 114, 110, 97, 32, 113, 117, 97, 109, 44, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32,
+97, 116, 44, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 118, 101, 108, 44, 32, 102, 101, 117, 103, 105, 97, 116, 32, 101, 103, 101, 116, 44, 32,
+110, 117, 108, 108, 97, 46, 32, 77, 97, 101, 99, 101, 110, 97, 115, 32, 108, 97, 99, 117, 115, 32, 109, 97, 103, 110, 97, 44, 32, 110, 111, 110,
+117, 109, 109, 121, 32, 101, 117, 44, 32, 105, 97, 99, 117, 108, 105, 115, 32, 115, 101, 100, 44, 32, 99, 111, 110, 115, 101, 99, 116, 101, 116, 117,
+101, 114, 32, 113, 117, 105, 115, 44, 32, 101, 110, 105, 109, 46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 97, 32, 101, 114, 111, 115, 46, 32,
+65, 108, 105, 113, 117, 97, 109, 32, 110, 111, 110, 117, 109, 109, 121, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 110, 101, 113, 117, 101, 46,
+32, 78, 117, 108, 108, 97, 32, 101, 110, 105, 109, 46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 109, 111, 108, 101, 115, 116, 105, 101, 44, 32,
+111, 114, 99, 105, 32, 113, 117, 105, 115, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 118, 111, 108, 117, 116, 112, 97, 116, 44, 32, 108, 97,
+99, 117, 115, 32, 109, 101, 116, 117, 115, 32, 108, 117, 99, 116, 117, 115, 32, 115, 97, 112, 105, 101, 110, 44, 32, 101, 116, 32, 102, 97, 99, 105,
+108, 105, 115, 105, 115, 32, 101, 114, 111, 115, 32, 110, 101, 113, 117, 101, 32, 105, 100, 32, 115, 97, 112, 105, 101, 110, 46, 32, 78, 117, 110, 99,
+32, 99, 111, 110, 100, 105, 109, 101, 110, 116, 117, 109, 32, 100, 111, 108, 111, 114, 32, 118, 101, 108, 32, 111, 114, 99, 105, 46, 32, 73, 110, 116,
+101, 103, 101, 114, 32, 119, 105, 115, 105, 32, 100, 105, 97, 109, 44, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32, 115, 105, 116, 32, 97, 109,
+101, 116, 44, 32, 102, 101, 117, 103, 105, 97, 116, 32, 105, 110, 44, 32, 100, 97, 112, 105, 98, 117, 115, 32, 105, 110, 44, 32, 108, 101, 99, 116,
+117, 115, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 101, 114, 97, 116, 32, 118, 111, 108, 117, 116, 112, 97, 116, 46, 32, 81, 117, 105, 115, 113,
+117, 101, 32, 109, 111, 108, 108, 105, 115, 32, 116, 117, 114, 112, 105, 115, 32, 118, 105, 116, 97, 101, 32, 116, 111, 114, 116, 111, 114, 46, 32, 77,
+97, 117, 114, 105, 115, 32, 116, 117, 114, 112, 105, 115, 32, 109, 105, 44, 32, 112, 114, 101, 116, 105, 117, 109, 32, 117, 116, 44, 32, 117, 108, 116,
+114, 105, 99, 101, 115, 32, 115, 101, 100, 44, 32, 112, 111, 114, 116, 97, 32, 105, 110, 44, 32, 106, 117, 115, 116, 111, 46, 32, 83, 117, 115, 112,
+101, 110, 100, 105, 115, 115, 101, 32, 112, 111, 115, 117, 101, 114, 101, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 117, 108, 116, 114, 105, 99, 105,
+101, 115, 32, 108, 97, 99, 117, 115, 32, 118, 105, 116, 97, 101, 32, 101, 110, 105, 109, 46, 32, 68, 111, 110, 101, 99, 32, 108, 97, 99, 117, 115,
+46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 112, 111, 116, 101, 110, 116, 105, 46, 32, 68, 111, 110, 101, 99, 32, 109, 111, 108,
+101, 115, 116, 105, 101, 44, 32, 109, 97, 103, 110, 97, 32, 115, 101, 100, 32, 101, 117, 105, 115, 109, 111, 100, 32, 100, 105, 99, 116, 117, 109, 44,
+32, 109, 97, 103, 110, 97, 32, 109, 97, 103, 110, 97, 32, 105, 110, 116, 101, 114, 100, 117, 109, 32, 100, 105, 97, 109, 44, 32, 118, 105, 116, 97,
+101, 32, 115, 97, 103, 105, 116, 116, 105, 115, 32, 108, 101, 111, 32, 108, 111, 114, 101, 109, 32, 97, 99, 32, 110, 101, 113, 117, 101, 46, 32, 67,
+114, 97, 115, 32, 109, 101, 116, 117, 115, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 110, 117, 110, 99, 46, 32, 68, 117, 105, 115, 32, 99, 111,
+110, 115, 101, 99, 116, 101, 116, 117, 101, 114, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 103, 114, 97, 118, 105, 100, 97, 32, 115,
+111, 108, 108, 105, 99, 105, 116, 117, 100, 105, 110, 32, 117, 114, 110, 97, 46, 32, 73, 110, 116, 101, 103, 101, 114, 32, 118, 111, 108, 117, 116, 112,
+97, 116, 44, 32, 109, 97, 115, 115, 97, 32, 113, 117, 105, 115, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 112, 117, 108, 118, 105, 110, 97, 114,
+44, 32, 101, 114, 111, 115, 32, 112, 117, 114, 117, 115, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 110, 117, 110, 99, 44, 32, 101, 103, 101,
+116, 32, 114, 104, 111, 110, 99, 117, 115, 32, 101, 110, 105, 109, 32, 108, 101, 99, 116, 117, 115, 32, 113, 117, 105, 115, 32, 116, 111, 114, 116, 111,
+114, 46, 32, 73, 110, 116, 101, 103, 101, 114, 32, 108, 97, 99, 105, 110, 105, 97, 32, 113, 117, 97, 109, 32, 113, 117, 105, 115, 32, 101, 114, 97,
+116, 32, 99, 111, 110, 118, 97, 108, 108, 105, 115, 32, 109, 97, 116, 116, 105, 115, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32,
+105, 97, 99, 117, 108, 105, 115, 32, 112, 111, 115, 117, 101, 114, 101, 32, 118, 101, 108, 105, 116, 46, 32, 69, 116, 105, 97, 109, 32, 116, 101, 108,
+108, 117, 115, 32, 101, 110, 105, 109, 44, 32, 97, 108, 105, 113, 117, 101, 116, 32, 110, 101, 99, 44, 32, 108, 97, 111, 114, 101, 101, 116, 32, 97,
+44, 32, 109, 111, 108, 101, 115, 116, 105, 101, 32, 110, 111, 110, 44, 32, 118, 101, 108, 105, 116, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 108,
+97, 99, 117, 115, 32, 118, 101, 108, 105, 116, 44, 32, 101, 108, 101, 105, 102, 101, 110, 100, 32, 105, 109, 112, 101, 114, 100, 105, 101, 116, 44, 32,
+102, 114, 105, 110, 103, 105, 108, 108, 97, 32, 105, 100, 44, 32, 100, 97, 112, 105, 98, 117, 115, 32, 115, 99, 101, 108, 101, 114, 105, 115, 113, 117,
+101, 44, 32, 108, 101, 99, 116, 117, 115, 46, 32, 78, 117, 108, 108, 97, 32, 113, 117, 105, 115, 32, 108, 111, 114, 101, 109, 46, 32, 78, 117, 108,
+108, 97, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 110, 101, 113, 117, 101, 32, 101, 116, 32, 100, 117, 105, 46, 32, 80, 104, 97, 115, 101,
+108, 108, 117, 115, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 117, 108, 116, 114, 105, 99, 105, 101, 115, 32, 111, 100, 105, 111, 46, 32, 80,
+104, 97, 115, 101, 108, 108, 117, 115, 32, 118, 105, 116, 97, 101, 32, 108, 105, 103, 117, 108, 97, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115,
+113, 117, 101, 32, 102, 101, 117, 103, 105, 97, 116, 32, 97, 114, 99, 117, 32, 97, 116, 32, 101, 114, 97, 116, 46, 32, 86, 105, 118, 97, 109, 117,
+115, 32, 117, 116, 32, 101, 114, 111, 115, 32, 117, 116, 32, 108, 111, 114, 101, 109, 32, 112, 117, 108, 118, 105, 110, 97, 114, 32, 105, 97, 99, 117,
+108, 105, 115, 46, 32, 80, 114, 111, 105, 110, 32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 105, 112, 115, 117, 109, 32, 105, 100, 32, 110, 117, 110,
+99, 46, 32, 67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 118, 101, 108, 32, 109, 97, 115, 115, 97, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105,
+115, 115, 101, 32, 110, 117, 108, 108, 97, 32, 105, 112, 115, 117, 109, 44, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 118, 101, 108, 44, 32,
+112, 111, 115, 117, 101, 114, 101, 32, 101, 103, 101, 116, 44, 32, 109, 111, 108, 108, 105, 115, 32, 97, 116, 44, 32, 114, 105, 115, 117, 115, 46, 32,
+86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 115, 101, 100, 32, 100, 105, 97, 109, 32, 105, 100, 32, 101, 115, 116, 32, 100, 97, 112, 105, 98,
+117, 115, 32, 117, 108, 116, 114, 105, 99, 101, 115, 46, 32, 80, 114, 111, 105, 110, 32, 116, 101, 109, 112, 117, 115, 44, 32, 101, 114, 111, 115, 32,
+97, 32, 115, 99, 101, 108, 101, 114, 105, 115, 113, 117, 101, 32, 118, 101, 115, 116, 105, 98, 117, 108, 117, 109, 44, 32, 105, 112, 115, 117, 109, 32,
+97, 114, 99, 117, 32, 97, 108, 105, 113, 117, 97, 109, 32, 109, 105, 44, 32, 117, 116, 32, 102, 101, 117, 103, 105, 97, 116, 32, 108, 105, 98, 101,
+114, 111, 32, 111, 100, 105, 111, 32, 105, 110, 32, 110, 105, 115, 108, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 101, 116, 32, 109, 97, 115, 115,
+97, 32, 97, 32, 109, 97, 117, 114, 105, 115, 32, 108, 117, 99, 116, 117, 115, 32, 99, 111, 110, 103, 117, 101, 46, 32, 85, 116, 32, 105, 100, 32,
+101, 114, 111, 115, 46, 32, 70, 117, 115, 99, 101, 32, 97, 110, 116, 101, 32, 101, 114, 111, 115, 44, 32, 112, 104, 97, 114, 101, 116, 114, 97, 32,
+110, 111, 110, 44, 32, 109, 111, 108, 101, 115, 116, 105, 101, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 44, 32, 98, 105, 98, 101, 110, 100, 117,
+109, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32, 119, 105, 115, 105, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 114, 117, 116, 114,
+117, 109, 44, 32, 100, 111, 108, 111, 114, 32, 101, 116, 32, 115, 101, 109, 112, 101, 114, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 44, 32, 101,
+114, 111, 115, 32, 97, 110, 116, 101, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 109, 97, 115, 115, 97, 44, 32, 115, 101, 100, 32, 115, 111,
+108, 108, 105, 99, 105, 116, 117, 100, 105, 110, 32, 108, 101, 99, 116, 117, 115, 32, 118, 101, 108, 105, 116, 32, 101, 116, 32, 109, 97, 115, 115, 97,
+46, 32, 73, 110, 32, 97, 117, 99, 116, 111, 114, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 101, 114, 97, 116, 32, 118, 111, 108, 117, 116, 112,
+97, 116, 46, 32, 69, 116, 105, 97, 109, 32, 114, 105, 115, 117, 115, 32, 108, 101, 111, 44, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 115,
+117, 115, 99, 105, 112, 105, 116, 44, 32, 115, 111, 108, 108, 105, 99, 105, 116, 117, 100, 105, 110, 32, 101, 116, 44, 32, 115, 111, 100, 97, 108, 101,
+115, 32, 101, 103, 101, 116, 44, 32, 110, 105, 115, 108, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 97, 110, 116, 101, 32, 105, 112,
+115, 117, 109, 32, 112, 114, 105, 109, 105, 115, 32, 105, 110, 32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 111, 114, 99, 105, 32, 108, 117, 99, 116,
+117, 115, 32, 101, 116, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 112, 111, 115, 117, 101, 114, 101, 32, 99, 117, 98, 105, 108, 105, 97, 32, 67,
+117, 114, 97, 101, 59, 32, 67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 108, 111, 98, 111, 114, 116, 105, 115, 44, 32, 108, 105, 98, 101, 114, 111,
+32, 97, 99, 32, 108, 97, 111, 114, 101, 101, 116, 32, 109, 111, 108, 108, 105, 115, 44, 32, 108, 105, 103, 117, 108, 97, 32, 108, 101, 111, 32, 112,
+111, 114, 116, 97, 32, 119, 105, 115, 105, 44, 32, 117, 116, 32, 101, 117, 105, 115, 109, 111, 100, 32, 102, 101, 108, 105, 115, 32, 108, 105, 103, 117,
+108, 97, 32, 105, 100, 32, 101, 108, 105, 116, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 110, 117,
+108, 108, 97, 32, 101, 117, 32, 101, 110, 105, 109, 46, 32, 68, 111, 110, 101, 99, 32, 97, 99, 99, 117, 109, 115, 97, 110, 32, 102, 97, 117, 99,
+105, 98, 117, 115, 32, 111, 114, 99, 105, 46, 32, 78, 117, 108, 108, 97, 32, 108, 97, 99, 105, 110, 105, 97, 32, 97, 110, 116, 101, 46, 32, 80,
+114, 97, 101, 115, 101, 110, 116, 32, 97, 116, 32, 110, 105, 98, 104, 46, 32, 77, 97, 117, 114, 105, 115, 32, 112, 111, 114, 116, 97, 32, 100, 105,
+103, 110, 105, 115, 115, 105, 109, 32, 119, 105, 115, 105, 46, 32, 85, 116, 32, 108, 97, 99, 105, 110, 105, 97, 32, 116, 111, 114, 116, 111, 114, 32,
+110, 101, 99, 32, 110, 117, 110, 99, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 101, 116, 32, 97, 117, 103, 117, 101, 46, 32, 73, 110,
+116, 101, 103, 101, 114, 32, 114, 104, 111, 110, 99, 117, 115, 44, 32, 108, 105, 98, 101, 114, 111, 32, 97, 32, 112, 101, 108, 108, 101, 110, 116, 101,
+115, 113, 117, 101, 32, 114, 104, 111, 110, 99, 117, 115, 44, 32, 116, 111, 114, 116, 111, 114, 32, 115, 97, 112, 105, 101, 110, 32, 108, 111, 98, 111,
+114, 116, 105, 115, 32, 112, 101, 100, 101, 44, 32, 101, 103, 101, 116, 32, 99, 111, 110, 100, 105, 109, 101, 110, 116, 117, 109, 32, 115, 97, 112, 105,
+101, 110, 32, 114, 105, 115, 117, 115, 32, 118, 105, 116, 97, 101, 32, 101, 108, 105, 116, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101,
+32, 115, 101, 100, 32, 116, 117, 114, 112, 105, 115, 32, 117, 116, 32, 100, 111, 108, 111, 114, 32, 112, 108, 97, 99, 101, 114, 97, 116, 32, 100, 105,
+103, 110, 105, 115, 115, 105, 109, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 113, 117, 105, 115, 32, 108, 101, 111, 46, 32, 67, 114, 97, 115, 32,
+117, 108, 116, 114, 105, 99, 101, 115, 46, 32, 77, 97, 101, 99, 101, 110, 97, 115, 32, 104, 101, 110, 100, 114, 101, 114, 105, 116, 32, 97, 117, 99,
+116, 111, 114, 32, 116, 111, 114, 116, 111, 114, 46, 32, 69, 116, 105, 97, 109, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 97, 114, 99, 117, 46
+};
diff --git a/source/blender/editors/datafiles/Bfont.c b/source/blender/editors/datafiles/Bfont.c
index 324bcffde77..1dcf9f72af4 100644
--- a/source/blender/editors/datafiles/Bfont.c
+++ b/source/blender/editors/datafiles/Bfont.c
@@ -30,103 +30,4 @@
int datatoc_Bfont_size= 25181;
-char datatoc_Bfont[]= {"\x80\x01\xe4\x01\x00\x00\x25\x21\x50\x53\x2d\x41\x64\x6f\x62\x65\x46\x6f\x6e\x74\x2d\x31\x2e\x30\x3a\x20\x42\x66\x6f\x6e\x74\x20\x30\x30\x31\x2e\x30\x30\x31\x0a\x31\x31\x20\x64\x69\x63\x74\x20\x62\x65\x67\x69\x6e\x0a\x2f\x46\x6f\x6e\x74\x49\x6e\x66\x6f\x20\x31\x30\x20\x64\x69\x63\x74\x20\x64\x75\x70\x20\x62\x65\x67\x69\x6e\x0a\x2f\x76\x65\x72\x73\x69\x6f\x6e\x20\x28" \
-"\x30\x30\x31\x2e\x30\x30\x31\x29\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x2f\x46\x75\x6c\x6c\x4e\x61\x6d\x65\x20\x28\x42\x66\x6f\x6e\x74\x29\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x2f\x46\x61\x6d\x69\x6c\x79\x4e\x61\x6d\x65\x20\x28\x42\x66\x6f\x6e\x74\x29\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x2f\x57\x65\x69\x67\x68\x74\x20\x28\x52\x65\x67\x75\x6c\x61\x72\x29\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x2f\x49\x74\x61\x6c\x69\x63\x41\x6e\x67\x6c\x65\x20\x30\x20\x64\x65\x66\x0a\x2f\x69\x73\x46\x69\x78\x65\x64\x50\x69\x74\x63\x68\x20\x66\x61\x6c\x73\x65\x20\x64\x65\x66\x0a\x2f\x55\x6e\x64\x65\x72\x6c\x69\x6e\x65\x50\x6f\x73\x69\x74\x69\x6f\x6e\x20\x2d\x31\x30\x30\x20\x64\x65\x66\x0a\x2f\x55\x6e\x64\x65\x72\x6c\x69\x6e\x65\x54\x68\x69\x63\x6b\x6e\x65\x73\x73\x20\x35\x30\x20\x64\x65\x66\x0a\x65\x6e\x64\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x2f\x46\x6f\x6e\x74\x4e\x61\x6d\x65\x20\x2f\x42\x66\x6f\x6e\x74\x20\x64\x65\x66\x0a\x2f\x45\x6e" \
-"\x63\x6f\x64\x69\x6e\x67\x20\x53\x74\x61\x6e\x64\x61\x72\x64\x45\x6e\x63\x6f\x64\x69\x6e\x67\x20\x64\x65\x66\x0a\x2f\x50\x61\x69\x6e\x74\x54\x79\x70\x65\x20\x30\x20\x64\x65\x66\x0a\x2f\x46\x6f\x6e\x74\x54\x79\x70\x65\x20\x31\x20\x64\x65\x66\x0a\x2f\x46\x6f\x6e\x74\x4d\x61\x74\x72\x69\x78\x20\x5b\x30\x2e\x30\x30\x31\x20\x30\x20\x30\x20\x30\x2e\x30\x30\x31\x20\x30\x20\x30\x5d\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x63\x75\x72\x72\x65\x6e\x74\x64\x69\x63\x74\x20\x65\x6e\x64\x0a\x63\x75\x72\x72\x65\x6e\x74\x66\x69\x6c\x65\x20\x65\x65\x78\x65\x63\x0a\x80\x02\x92\x5e\x00\x00\xd9\xd6\x6f\x63\x3b\x84\x6a\x98\x9b\x99\x74\xb0\x17\x9f\xc6\xcc\x44\x5b\xc2\xc0\x31\x03\xc6\x85\x70\xa7\xb3\x54\xa4\xa2\x80\xae\x6f\xbf\x7f\x98\xf7\x5a\x84\xba\xce\x2d\x03\x6a\x6b\x51\xb8\x48\x49\x31\x59\x1d\x92\xe5\x06\x9e\x62\x26\xd5\xad\xcc\x5d\xe4\xf8\x10\x7a\xa6\x9a\x35\xb5\x5f\x6a\x9b\x4b\x4f\x93\xc5\x6c\x23\xbc\xc6\x1d\xd7\xbf\x8f\x32\xf2\x1d\x58\xe4\x1a\x5f\x79\x0c\xee\x2f\x02\xaf\x49\x86\x95\xe9\x0c\x1d\x0b\xd2\x59\xe7" \
-"\x5b\x02\x19\x30\x0b\x0f\x69\x2c\x33\x77\x9c\x2a\xa6\x7a\xe8\x51\x7a\xbe\x12\x30\x08\x45\x22\x4a\xf6\xad\x5d\xa9\xdb\x9a\x1a\x3a\x40\xfb\x06\xb3\x6a\x9c\xcd\x69\x12\x55\x07\xfc\x2d\xe9\xd0\x41\x84\xc7\x60\x42\xf0\x3f\xcf\xd1\x53\x84\x00\x23\x97\x2a\x81\x2a\xb9\xb3\xcb\x56\x70\xc1\xce\x27\x59\x71\x1c\x75\x29\x42\x62\xd6\xf2\x91\xaf\x9b\x7c\x76\x07\x1e\xda\x7e\x7a\xd0\x26\x21\x62\x32\x22\xb9\x36\x08\x7a\xb2\x7f\xfe\x5f\x07\x86\x47\x06\x65\x92\x18\x3d\xc3\x47\xae\x92\xe6\xbf\x56\xb1\x7b\xed\xce\x13\x68\x46\xf6\xa2\xa3\x76\xab\x8c\x0b\xc0\xff\x4e\x34\x7d\x20\xfd\x0e\xc7\x7e\xfa\xb1\xf0\x63\x31\x00\x14\x8d\x2a\x7d\x2f\xd2\x1f\x12\x5a\xaa\xcd\x8f\xdb\x99\x79\x83\x2b\x67\x0d\x8a\xaa\x76\xd2\x12\xba\xb5\x61\x46\x19\x90\x96\x0c\x35\x6e\xb8\xd8\xe9\xf3\xc6\x5d\x9d\xfe\x7f\x8c\x2c\x8a\x7b\x2b\xe9\x9e\x63\xff\x6c\x86\x88\x3c\x1d\xe5\x07\x8d\xa3\xb9\x1e\x03\xe4\x84\x0d\xdd\x6d\x30\xe3\x3c\xe3\x87\x75\xdc\x80\x43\xc3\x93\x20\x76\x47\xbe\x83\x0b\xf5\xc8\x5d\x1e\xe2\x20\x72\x1a\x27\xe8\x8a\x21\x6d\xe8\x01\x0b\xe9\xd4\x4e\xdd" \
-"\x58\x9e\x87\x5f\x9f\x0e\x26\x1f\x0c\x6a\xff\x33\x93\x2a\x8b\xfe\xd2\x77\x06\x60\xdd\xe2\x8c\xb7\xd5\xde\x05\xcd\x0d\x8c\xfd\xd6\x7d\x67\xe3\x34\x3c\x66\x1f\xfa\xa3\x93\xe4\xa7\x3a\xcf\x9c\x44\xa6\x96\xa7\xa9\x74\x53\xc2\x96\x68\x98\x1f\x07\x9d\x26\x4c\x1d\x0a\xf7\x3f\x39\xc2\x6a\xe6\xb7\x78\x87\xbb\xc9\xd3\x52\xea\xa8\xb6\xa7\x5a\x38\x25\x6d\xa0\x90\x0d\x30\xcc\xbe\x0e\xa9\x67\x7f\x88\x66\x18\x51\x3d\x20\xe9\xe4\x9e\x12\xeb\xbd\x1c\x00\xde\x43\x11\x6e\x8f\x47\xdf\xb5\x21\x11\x42\x51\xd2\x07\x17\xba\xf5\xe5\xc6\x8f\x3e\x71\x21\x50\xec\x57\x94\x41\x2a\x1b\x6f\x80\xdf\xc4\x8c\x2d\x20\x5b\x7b\x9e\x88\x99\xa6\x90\x7e\x73\x85\xdc\xfe\xea\xc0\x7b\x0e\xef\x4b\xc7\x74\x1c\xf1\x19\x1e\x42\xe2\xf8\x9f\x8e\x2e\x29\x0a\xed\x6f\xcd\x1f\xe6\x48\xc4\x31\xc8\x32\x1d\x73\x99\x8d\xc6\xe1\xda\x9d\x56\x38\x43\xf9\x63\x32\x19\x97\x0e\xc8\x23\xba\xfa\xcc\x97\xbb\xd1\x33\x81\xa1\x44\x76\x82\x1f\x19\x86\xff\x4b\xaa\xf0\xe1\x71\x90\x05\xb2\x85\x2d\x55\xf2\x42\x0a\x0a\x41\x8a\x5d\x93\x48\xd2\xfa\xd1\x7b\x94\x87\x0c\x9c\x5e\x0d\xfa\x1f" \
-"\xd3\x9d\x52\x80\x84\x8f\x0b\x9b\x2f\xd3\x97\xe8\x8e\xfd\x52\x68\xea\xe7\xbe\xa9\x4e\x20\x5a\x02\x29\xc9\x7a\x8e\xcd\x90\xea\xcc\xc6\xe3\x38\x39\x06\x3f\x08\xed\x59\xc7\x1e\xe2\xa9\x30\xc6\xbf\x26\x72\x57\x87\xbd\x62\xfb\xe0\xd2\x9a\x3a\x57\x1a\x38\x29\xdb\x77\x7c\x6d\x53\xb6\xa9\xa6\x7b\xff\xbe\x23\x79\xb1\x25\x5c\x80\xf2\xf7\x84\xda\x95\x8c\x74\xb8\xa3\x0d\xf8\x8a\x44\x7c\xe5\xd3\x59\xd2\x65\xac\x95\xdd\xb6\x71\x24\xb6\x2e\x05\x8d\x7f\x93\x36\x76\x43\x6b\x69\xbb\x28\x35\xd0\xaa\x19\x2d\x71\xd8\x6e\x87\x38\x07\x1a\x0e\xe1\x3d\x4f\xe4\x48\x1e\x27\xdc\xc3\xe3\xe5\x99\xc4\x1c\x06\x6b\xf0\x36\x43\x06\x5e\x8f\x00\x22\xb4\x31\x0e\x29\x6f\x09\x29\x5e\xcb\xb8\x8b\x8e\x22\x8c\x8a\x5a\x19\xd8\x59\xfc\x2d\x2e\x84\xa9\x9a\xe6\x83\x0f\x14\x64\x63\xeb\x6a\x49\xb9\x59\x06\x42\xe6\xab\xca\x16\xd5\xe3\xb7\x20\x8a\x74\xfd\xd0\xe6\x79\x10\x3f\xee\x84\x45\x1c\x87\x58\x73\x12\x15\x0b\x66\xac\xc8\x25\xde\xff\x64\xdd\x50\xad\xda\x35\xd2\xfa\x94\xd3\xf1\x61\x96\xb9\x2b\xfa\x8a\x0e\x7a\x85\x1e\xbf\x36\x9e\x76\x16\x0c\xe8\x19\xe4\x3c" \
-"\x65\xce\x77\x1d\x39\x0c\x63\x24\xa7\xb6\x99\x56\xc3\x15\x46\x9a\x66\x6a\x2d\xec\x46\x97\x8f\xb9\xcf\xfc\x6a\x2e\xa8\x50\xd8\xce\x9d\xab\x76\x4d\x52\x99\x18\x36\xa5\x80\xa0\x1b\xc3\x75\xf1\x8d\x5d\x97\xe9\xef\xf4\x49\x7b\x85\x2a\x8a\x7b\x44\x9f\xe1\xd1\xab\xf2\x46\xd4\x06\xa8\x13\x74\xe4\x00\x0e\x94\xbf\x84\x0a\xfe\x53\x7d\x14\x11\x47\x7e\x8e\x38\x50\x37\x30\x7d\xb8\xac\x9c\xa3\xa1\x48\xf9\x69\xcc\xcf\xb3\xd9\x73\xb1\x02\x52\xdc\x8e\x0e\xb4\x8a\xfe\x53\x8b\x24\x46\xcb\x5b\x51\x52\xe5\x14\xfd\x4e\x84\xd5\x40\x9a\xa3\x3b\x5d\xf5\xa8\x26\x94\x30\xe4\x0d\xba\xcc\x5f\x8c\xb8\x76\x16\x82\x6f\x1b\x26\x8b\x7f\x6a\xac\xa1\xfe\x88\xbb\xa6\x30\xa2\x98\x7c\x45\x1b\xba\x32\x7e\x07\x90\x2b\x4b\xb0\x91\x9f\xca\xf4\x07\x4e\xcb\xfa\x20\x2a\xc3\x47\xba\x5a\x5c\xa2\x7e\x62\x2c\xc3\xa3\x2f\x58\x7c\x2b\xb1\x7a\xfb\xfe\x1d\xa1\x46\x62\xeb\x85\x34\x0c\x1c\xb8\x43\x91\x49\x58\x63\x45\x3c\xe3\x8e\x0f\xda\x52\xa7\x39\xe1\xe6\xda\x83\xfb\xab\x0b\x3f\xbf\x41\xec\xb2\x3f\x9f\xd5\xd3\x72\x40\xc8\x55\x49\x28\x5e\x7b\x6c\xab\x59\xa9\xce\x63" \
-"\xc4\x1f\x0f\x98\x8a\x4d\x89\xd2\xc5\xe4\xff\x49\x7e\x78\xf9\xd6\xaa\xd4\xa8\x49\x36\x7d\x71\x4e\xe2\x25\x89\xf9\xbc\xef\x21\xe7\xf4\x7d\x74\x89\x7e\xbb\x1f\xc1\xc2\x76\x79\x13\x50\xfa\x57\x30\x50\x3e\xf6\x1d\x79\xf7\x87\xc6\xc1\xfd\x94\xd3\x11\xd2\x11\xf7\x2c\xcd\x5b\x01\xbe\xc3\xec\x42\x5f\x90\x3a\xeb\x02\x2a\x4f\x19\x52\xa4\xa7\xf4\x72\xbc\xc0\x65\x17\x37\x45\x8d\xa8\x1c\x59\x3c\x74\x5b\xa2\x79\x1c\x7b\x60\xfc\xa5\xb4\x45\x38\xe8\x36\x7a\x8a\xdf\x9e\x83\x5e\xab\x52\x04\x70\x0d\xa0\x75\xaa\x92\x1c\xf1\x9a\xd3\x77\x10\xe9\x8d\x60\x5e\xa7\x0d\x25\x76\x69\x49\xd3\x61\x6d\x94\x83\xbe\x77\x2d\x7c\xd0\xe1\x27\x5e\x30\x3e\x21\xbc\xf8\x9a\xe9\x2e\x9e\x07\x90\x01\x79\x00\xeb\x47\x19\x34\x0d\x2e\x01\x19\xab\x1b\xb3\xaa\xa4\xe7\x02\x19\xb6\xe2\xfa\x60\xc0\x17\xb9\xda\xda\x10\x8c\x24\xb4\xd8\x3b\x5f\x31\xa5\xa2\x86\xfc\x2f\xa8\x41\xf2\xb2\xd3\x3e\x0a\xef\x99\x41\xdb\xf7\x48\x11\x69\x31\xfe\x55\x88\xd3\x75\xf0\xda\x4d\xdd\xa6\x29\x91\xc6\x04\x68\x88\xf1\x30\x00\x9e\xd2\xec\xcf\x1a\x91\x8c\x5f\xa4\x75\xc6\x00\xb7\x68\xa1" \
-"\x3b\x09\xbd\x08\x20\x2c\x1a\xff\x9d\x77\xf5\xfa\x31\xb0\x9c\xe3\x66\xe4\x69\x53\x18\x99\x55\xc4\x81\x85\x80\xd0\x81\xca\x3e\xcc\xad\x89\x5b\xdf\x70\xd0\xf3\x57\xb4\x6d\x52\x8d\x38\xef\xd2\x28\x56\xc8\xad\x1f\x20\xe6\x8c\xca\x3d\xdc\xb0\x5c\x6c\xcf\xb1\xd5\xa9\xee\xac\x9e\xfe\x26\xf2\x8d\x06\x73\xd9\xc1\x86\xa6\xe3\x24\xd0\x77\x56\x2c\x22\xc3\x47\x77\x5e\xea\xf1\x7a\x4f\xa9\xad\x24\xdd\x78\x44\x17\x03\x2c\x7d\x26\x4e\x48\xe6\x19\x3e\x12\xcd\xce\x42\x8c\x4f\x7d\xe5\xdf\x00\x5c\x19\x76\xfd\xa1\xdb\x33\xe4\xe5\xd4\x0d\x9b\x1a\x32\x36\x69\x36\x26\x55\x98\x31\x96\xe9\x58\xbf\x6f\x00\x7a\x93\x5f\xd7\x32\x21\xb0\xd1\x4d\x88\xc6\x06\x47\x61\x64\x98\x00\x9f\x5e\x5b\xca\x07\x94\x7d\xfe\x3a\x26\x6b\x31\x65\x0e\xc2\xa3\x0c\x4f\xfd\x99\x96\x36\x1e\x25\x8c\xbd\xf1\x8d\x2f\x39\x8b\x91\x4a\x58\x0f\xb2\xb3\x3f\xf1\x5b\x81\x1e\x4f\x13\x68\x48\x38\xd7\x25\x7c\xf2\x4d\x51\x6d\x9b\x00\xe9\x7a\xba\x6b\x5b\x91\x5c\xa2\x5a\x04\x71\xaa\x54\xd3\x84\x8e\x40\x1b\x5d\x98\xf8\x6b\x5e\x5d\xa0\x6d\xf9\xf1\xfb\x66\x82\x42\x60\x33\x70\x8c\xf5" \
-"\x97\x41\x2d\xbd\x9d\x75\xbc\x5b\x61\x31\x8a\x6b\x6a\x87\xcc\xcb\x26\x77\x21\x95\x57\x7a\x9e\xc6\x08\x8e\xda\x03\x38\xf9\x50\x56\xfd\x52\xf6\xcb\xe7\x39\xa0\x32\x34\xbb\x18\x6c\x82\xfd\xc1\x18\x33\xc9\x32\x03\x43\xb0\xbb\x7c\xa5\xac\x8e\xfc\x9c\x9b\xdc\xfc\x33\xed\x69\x5e\x30\x2c\xe9\xbb\xbc\x7b\x64\xda\xdf\x24\x72\x36\xdb\xdf\x27\x9c\x70\xce\x2e\x13\x0a\xd5\x8b\x45\x0c\x8a\x86\x2c\x82\x5e\x88\x04\x6f\x4d\x15\x73\xe1\xa2\x0f\x26\x9f\xda\x8a\x66\xab\x02\x8e\x30\x9e\x39\x5e\x3b\xb6\x11\x7f\xbe\xdf\xc4\x42\xee\x6b\x32\x9a\x02\x8e\xa7\x98\x12\x19\xe2\x01\xfd\xfb\x11\x66\x14\x6f\x1c\x61\x88\x0f\x3c\x41\xe6\x27\x31\x19\xa6\x1f\x12\x36\x04\x18\x59\xd3\xe2\xfa\x4a\xe2\xb9\x43\x8a\x1d\x12\x55\x9c\x7c\x91\x54\x11\xaf\xa7\x33\x0d\x36\x52\x61\x40\xce\xc9\x6f\xc7\xd6\xd2\xeb\x94\x37\xb5\xf1\x88\x56\xfe\xdb\x7a\x40\x67\xb3\x4f\x71\xa3\x7e\x4b\x6b\x4f\x66\xf4\x15\x93\xc6\xd2\xfb\x23\x88\x49\x0f\x20\x2d\x96\x86\xfd\x71\x53\x6f\xa1\x6e\xd4\xf2\x21\x0c\x0c\x10\x8f\xc2\xc7\x25\xe4\xfb\x6e\x07\xd5\xc6\x37\x50\x20\xd1\x8c\x22\x2f" \
-"\x66\xf9\xd9\xa6\x76\x1f\x6a\x02\x12\x6a\x2e\x92\x94\x7d\x00\xd0\x59\xd1\xf7\x37\x8f\xb1\x13\xb7\x7f\x47\x76\x14\x88\x03\xe9\x6d\x77\xb5\x73\xdf\x6e\x8b\xb6\xab\x6d\x68\x48\x3e\x98\x8f\x0e\x9d\x52\x9a\xfd\x8e\xd7\x3b\x01\x0b\x62\x6b\x8c\x0c\xf0\x90\x38\x26\x0e\xdc\xed\x9a\xae\x97\xb3\xcf\x68\xea\xde\x54\x7e\x9d\x5a\x34\x76\x7e\x60\x17\xcb\x87\x86\x29\x10\xc4\xd2\x2c\x7d\x44\x91\xe8\xec\x34\xde\x66\x83\x50\x65\xed\xda\xf4\xd7\xcd\x5f\x3a\x60\x12\x42\xd5\x5b\xf7\x3a\x2c\x39\x96\xc1\x8b\x87\x24\x8f\xec\x5e\xd1\xec\xd5\xe3\x2a\xb0\xad\xce\x57\x97\xf0\x91\xb9\x2d\xd1\xb1\xc9\x7b\x20\xc4\x2c\x9e\x53\xcb\xca\x06\x6a\x36\x5d\x2b\xd1\x0c\x72\x4c\x64\xf2\x68\xa5\x8a\x0f\x8f\x05\x21\xe4\xc3\xf3\x6f\x51\xf9\xae\x0f\xa7\x28\xa5\x33\x61\xb9\xd7\x96\x76\xfd\x16\x67\x09\x15\xb9\xee\xbd\x5e\x31\x68\x64\x62\xa5\xc4\x1f\x94\x70\x7d\xc7\x2e\x67\xfc\x4f\x64\xa5\x70\x68\x52\xf9\xdb\xcd\x22\xc6\x1f\xc6\xbf\xb5\x48\xd4\xb6\x3e\x57\x0d\x35\xab\x54\xde\x9c\x83\xc9\xa2\xad\x2f\x2c\xbb\x69\x77\x84\x2f\xe4\xb8\x24\x55\xda\x0b\xfb\xf2\x7c" \
-"\xcd\xa8\xfc\x18\xf5\x31\x54\xa1\x6b\xd3\x15\x3f\xdb\x59\x0f\x74\xc0\x12\xd0\x56\x5f\x4b\x47\xef\xf7\x69\x7c\x55\xae\x90\xdc\x18\xbc\x5e\x28\xd1\x84\xea\xe1\x35\x45\xf0\x2a\x2f\x5c\x12\xf0\x78\xd2\x8c\xa8\xda\x69\x3c\xf6\xf7\xee\xbc\xf7\x0a\xa2\x18\x88\xe2\x5b\x6b\x9d\xa8\x33\xba\x0f\x4f\x44\x9a\xe1\x34\x29\xe4\x7f\x23\x29\xe0\x61\xe1\x2c\x55\x10\xe1\x63\xc6\x30\xb6\x62\xeb\xff\xb2\x18\xd2\x3a\x0e\xc8\x54\x12\x84\x89\x23\xab\x3f\xc3\xee\xc3\xa7\xa7\x08\xcf\xe8\xd6\x64\x5b\xc3\x5a\xe9\x56\x62\xcf\xb9\xe5\xc4\x8c\xfd\xec\xdb\x96\x3e\x3e\x02\x0f\x33\xe8\x9d\x2c\xea\x6b\xbc\xdc\xd6\xd1\x2a\xa5\x12\x5e\x8f\xeb\xf1\xc0\xfe\x6a\x9b\x30\xf6\xef\x7b\x11\x8c\x0c\x65\xfb\x66\x9c\x7e\x82\x02\x26\x3e\xff\x1b\x86\xb6\x78\x17\x9e\x67\x04\x30\x9a\x4e\xec\x0e\xfe\xde\xef\x2a\xe4\xe0\x8a\x57\xd3\xec\x4e\xd4\x01\x6b\x8b\x51\x05\xee\xb9\x54\xcd\x33\x53\x43\x34\x2a\x87\xff\xf4\x7b\x9d\xb9\x74\x72\xa0\x74\xf6\x1e\x93\x7f\x81\x9c\x33\xe5\x27\x7a\x02\x7a\x91\xe5\x19\x7a\x02\x97\x07\x7d\xf6\x4c\x81\xd1\x6e\x8a\xf6\xd3\x21\xb7\x3c\xc0" \
-"\x6c\xa7\xa1\x9d\xad\xbc\x86\xc0\xb3\xcb\xc3\x88\x54\x29\x6e\xc1\x7a\x83\x0b\x4b\x7c\x53\x8b\x50\x0c\x47\x5d\xd6\xb3\x2b\x46\x8b\x5b\x35\xe4\x61\x69\x43\xe6\x76\x5c\xb7\x83\x72\xe7\x4a\x8c\x30\x87\xb4\x0a\xb8\x94\x2e\x4b\xb6\xcd\x53\x2f\x97\xce\x54\xf3\xe8\xe9\x7e\x8e\x1e\x0b\x71\xdb\xfc\x99\x12\x10\xd7\xee\x79\x9b\xff\x15\xd6\x59\x06\xc4\x03\xc9\x83\x30\xbb\x9f\xeb\x0e\x1b\x9b\xf5\x4d\xe5\x82\x70\xa8\xa4\xfd\x45\x17\xfd\xf2\xaf\x13\xe8\x9b\xa1\x1b\x9e\x5f\xa0\x5a\x4f\x6d\x85\xcb\x2a\x46\xb5\x78\xf7\xf4\x55\xbf\xa7\xff\x24\xfb\x73\x36\xbf\x4e\xd3\xb6\xfc\x05\x0c\x64\x20\x30\xc8\x1a\xea\x7b\x19\xa1\xfd\x86\xa8\x3c\x0f\xbb\x3e\x18\xef\xb1\x62\x5c\x6d\xc3\x70\x4e\xf2\xa1\xfa\xe0\xd2\x5e\x6f\x22\x64\xc4\x47\x67\x4a\x7b\xd8\xd9\xb4\xa0\x21\x40\x69\x7b\xb7\x7d\x54\x4d\x50\x63\x6d\xf7\xad\xa8\xef\x7a\x58\xe9\x75\xed\x94\x2b\x90\xc3\xff\xde\x7c\xd6\x85\x9c\x75\xf4\x07\x49\x0d\x64\xa4\x44\xaf\xbf\x5d\xe1\xfc\x80\x60\x4d\xe7\xc4\x96\xdf\x78\x38\x17\x65\x5e\x17\x32\x4c\x26\x1b\x59\xb8\x5d\x8c\x25\x4f\xf9\x42\xc7\x1b\xdc" \
-"\xe6\x72\xb0\xb3\xe4\xc9\x0c\x38\x71\x01\x19\xcf\x68\xb1\xbf\x4f\xed\x8f\xe2\x68\x5c\x15\xf9\x62\xcd\x16\x69\xd7\xb8\x8e\xb2\x6b\x08\xc2\x0d\x20\x9c\x54\x6d\x92\x98\x39\xf1\x48\x3e\x4a\x7a\xd4\x58\xb3\x39\x17\xba\x4a\x49\x52\x25\x50\xb6\xa5\x28\x59\x1e\xf4\xd1\x6e\xa3\x18\xb6\xc9\x8b\x91\xe1\x94\xdb\xb8\x01\x6d\x63\x9c\x25\xf7\xb1\x6f\x32\xd1\xdd\xd0\x4e\x00\x48\x06\xec\x4c\x4f\x3f\x84\x1a\xe3\x48\x8e\xe5\xf8\x78\xa0\x94\x9b\x5b\x33\x3d\x28\x16\xc0\x60\x8b\xc1\xc0\x29\x74\x4f\x8c\x74\x9e\xf8\x40\xa8\xe3\xae\x38\x72\x5c\xa0\x1f\xc8\x5e\x52\x63\x8b\x43\x5f\x2f\x4c\xb4\x98\x2b\x83\x95\xb1\x04\xd4\x38\xd1\xbe\xd1\x66\x7a\xe0\x48\xea\xf4\x6f\xaf\x8a\x78\x17\xcb\x09\x92\xea\xef\x5e\xf1\x1c\x15\xaa\x33\x02\xb0\x7d\xb3\xd9\x63\x53\x11\x10\x71\x7b\x6f\x44\x5e\x9c\xc8\x5a\x75\x1e\xae\x83\x2a\xa1\x5b\x4c\x55\xc7\x2c\x4b\xc7\x00\x9f\x6f\x9e\xec\x3f\xfc\x49\x43\xdc\x71\xa9\x9e\x4a\x07\x51\xd6\x95\x9b\xde\x81\x5b\x3f\xa9\xc4\xa8\xd0\xe6\x53\xa8\x04\x13\x1b\xb0\x9d\x92\x38\x2a\xfe\x8f\xab\x77\x3c\x7f\x39\x25\x6b\x54\xff\xf6" \
-"\x4c\x9f\x26\xb0\xe9\x0d\x61\x6b\x40\x37\xce\xc9\xcc\xda\x03\x8b\x7b\x96\x97\x6e\x1c\xc6\x63\xf7\xa7\x9b\x25\xb8\xfd\xd6\x15\xfd\xfa\xb3\x1a\xe9\x62\xcd\x75\x6d\x5e\xde\x0f\x97\xb8\x77\xdb\x9f\x1a\x34\xea\x37\x42\x64\x6c\xaf\xae\x11\x6f\x87\xbd\xf4\xee\xad\x17\x11\xf1\x88\x4e\x7c\x4b\xcb\x72\x87\xe4\xdd\x4f\xf4\xb4\x54\xd7\x78\x3a\xc1\xea\x11\x15\x84\x6e\x0a\x5d\x5d\x00\xb7\xf5\x86\x3d\x5f\x44\xbf\x8d\xed\x5f\x7e\x57\x3a\x95\x86\xd5\x6e\x74\xd8\xc0\x0a\x70\x26\xe8\x32\x23\x78\x39\x2d\xac\xe8\x25\x4d\xe2\x99\x6e\x83\xfd\xd2\xa8\xb4\x53\x38\x33\x38\xbd\xde\x61\xc1\x88\x8a\x2a\x94\x32\x6f\x18\x13\xfe\xb1\x6d\x2a\x04\x41\xac\x60\xfb\xa0\x36\x3a\xa5\xca\x40\x4b\x26\x3a\x4b\xb0\xd8\x62\x92\x7d\x76\xf8\x0e\x6a\xe4\xe2\x51\xf1\xfb\x7f\x1b\x17\x5c\x9d\x8c\x0c\x3b\x56\xfc\x7a\x0d\x80\x0e\xb8\x37\x9b\x2c\xfd\x1d\x2f\x7b\xbf\xb9\x9a\xa3\x72\xfa\xd8\x30\xda\x18\x29\x89\xba\xc8\xd1\x93\x56\xea\x0b\xfb\x2a\x38\xb5\xf3\xee\xa6\x87\x5c\x97\x56\xae\x59\x4f\x47\x0e\x18\x05\xb3\x57\x83\x87\x66\x3b\xba\x42\x01\x06\x48\x05\x1c\x4f" \
-"\x31\xba\xc2\x3e\xb3\x35\xba\x1f\x8f\x0f\x69\x20\xfb\xbc\x8a\x0b\xf4\x24\x64\x65\x50\xbb\xfd\x35\x5a\x9a\xd4\xb5\x7e\xd1\x3a\x0a\x37\xa8\x1b\xec\x73\x65\xe0\xc1\x67\xe7\xe7\x4c\x82\xa9\x40\xf7\x8f\xa0\x06\x0c\xbb\x3e\x73\x55\x85\x61\x83\x9d\xa4\x05\x12\x33\x45\x35\xe2\xaa\x20\xf8\x85\xc2\x3a\x72\xf3\x9c\x35\xdb\xe4\x25\x33\x96\xf0\xe3\x4a\x64\x42\x8c\x73\x64\x67\x2f\xa0\x91\x27\xa0\x4b\xde\xda\x1c\x6c\xe8\x6b\x5b\x00\x39\xfa\x88\x06\x21\x76\x73\x67\xb3\xdd\x6c\x28\x8e\xaf\xb9\x02\x0c\xc0\x42\xd5\x98\x29\xe9\xdf\x29\xd4\x55\x11\x34\x3a\xd3\xb5\x2e\xd3\xce\xbd\x1a\x08\x5a\x73\xe0\x97\xc3\xe0\xd5\x22\xa2\xbd\xde\xda\x9b\x4e\xc9\x65\xf2\x09\x38\xd7\x98\xef\xf7\x79\x03\x10\xdd\x38\x2d\x23\xf3\x92\x80\x2c\x72\xd7\x84\x65\xdc\xe9\xb4\x02\x1d\x57\xcb\xb9\x90\x10\x25\x71\x3c\xf4\xd6\x8c\xbf\x18\xc0\x25\xff\xa1\x93\xd8\x1e\x28\x9b\x58\x3c\xba\x87\x0b\x17\xe4\x2b\x9d\xcb\x66\xc4\xc5\x01\x01\x57\xda\x7e\x50\x4c\x1e\xb6\xcf\x99\x87\xf8\x06\xb5\xd7\x4d\x80\xc8\x0a\x13\x6b\x8a\xca\x54\x78\xbf\x8c\x75\x32\x20\x1b\x69\xae\xe0" \
-"\xaa\x7b\x35\x4c\x30\xd2\x06\xe3\xc3\x72\xeb\x57\x91\x96\x1a\x15\x11\xd6\xc6\xf5\x7d\x6d\x9c\xaa\xcc\x8f\xe4\x3e\xc4\x80\x15\xf3\x99\x5b\x47\xa4\x71\xa4\xff\x30\x24\xee\x69\xdc\xa3\x5d\x03\x21\x2f\x96\xf1\xd3\xbe\x6f\x9d\xea\xbd\x19\x3a\xf7\x4b\x76\xf7\xa7\xab\x76\xdf\x01\xb4\x62\x53\x00\x02\x6d\x11\xff\x74\xf4\x6b\x65\xdc\x64\x46\x15\x85\xb3\x5a\xd2\x74\x20\xc5\x18\x52\x72\x78\xda\x0e\x93\x50\xc2\x50\x45\x4e\xdf\x9d\xb7\x82\x31\x8b\xa2\x22\x0c\xb0\x2d\xf2\x67\xe8\x80\x44\x58\xe1\xb5\x95\x03\xd2\x14\x26\x9b\x06\xce\x88\x16\xaa\x5c\x9c\xa5\x74\x8e\xfa\x48\xcb\xeb\xc1\x74\xf4\x04\xd1\x37\xba\x1d\x08\x21\xc1\xdd\x49\x1b\xd4\xcc\x16\xc5\xb3\x08\x7a\x86\x08\xff\x60\x33\x02\xa9\xc1\x60\x80\xb2\x6d\x8f\x83\x32\xdb\xd0\x3a\x9f\x67\xe9\x64\x1a\x02\xb1\x81\x7a\xa8\x78\x47\x27\x73\xe4\x6c\x72\xa1\xf3\x18\x0a\xdd\x69\x00\x20\xe6\x4b\xd0\xe9\x04\x46\xf9\x62\x25\x2e\x57\x9e\x91\x3c\x55\xe5\xc7\xec\x7e\x50\xb7\xb5\x0c\x44\x03\x0f\x17\x24\x5c\x92\x6d\x3d\x18\x80\x4e\xef\x58\xe6\xd7\xcc\x5a\x93\x76\xab\x33\xa8\x5f\x5d\x17\x5a" \
-"\xf4\xa4\xac\xc9\xde\x70\x8f\xc1\xd1\x82\xc9\xcf\x76\xaf\x33\x03\x53\x90\x35\x07\x02\xdf\x92\x32\x65\xa8\x9f\x85\x1c\x42\x1d\x40\xe9\x4c\xb6\x85\xac\x44\xdf\x72\xfe\xec\x6f\x1e\x49\x89\x82\xa4\x83\xc4\xbd\x6f\x9b\x93\xd9\x40\xc2\x73\x8f\xc9\x4d\x16\x99\xe4\x53\xbf\x35\xd2\x57\xea\x15\x22\xbb\xb8\x1c\x3f\xb3\xd6\x53\x0e\x70\x20\xa9\x9f\x85\xcf\x13\xa9\xbc\x93\x6f\xba\x72\x2b\x76\x98\x19\x47\xb8\xf7\xef\x3e\x27\x7d\x08\xb0\x5b\x2e\x7f\x25\xa9\xf7\xba\xaa\xe7\x6a\x7c\x5d\x52\xcb\x87\x32\xb1\x55\x4a\x73\xdb\x4c\x60\xad\x2c\xf2\x26\xa3\xab\x0e\x00\x5f\x4c\x63\x4b\x0e\x27\xd5\x74\xb6\x48\x02\xea\xb0\x41\x62\x96\x24\x46\x56\x89\x97\xda\xf5\x8d\x11\x18\xe9\x29\xb9\x3a\xb2\x38\x36\x7a\x94\xe7\x97\x29\xd6\x60\x04\xf3\x2e\x3f\xc8\xe9\x80\xa1\x5f\x8a\xf4\xb7\x8d\x91\x0e\x19\x5b\xc5\x46\x03\xe3\xbb\xcb\xdf\x30\x78\x71\x07\x00\x82\xc1\xa0\x43\x6c\xb9\x47\xed\xab\x65\x9f\x60\x62\x22\x04\x8e\x72\x9b\xa0\x93\xc1\xaa\x30\x73\xfd\xac\xf5\x3b\x91\xb0\x37\xcb\xf5\x3c\x18\xf7\xeb\x4f\x0c\x75\x4a\x12\x97\x0e\xd0\x07\xe3\xe6\x8a\xb6" \
-"\x6b\x21\xac\xd3\xe8\xf4\x5b\x56\x50\xed\x37\x9a\xaf\x20\xdd\x11\x97\x4f\x68\xee\x19\xe2\x4c\x9b\x48\x27\x5a\xd1\x5d\x77\x36\x11\x09\xde\x3e\x12\x88\x19\x0f\x3b\xc2\xcb\x39\x96\x00\x34\x7a\x68\x54\xc7\x68\xb4\x9a\xb4\xb1\x8d\xad\xa9\x9a\x71\x23\x4b\xc6\x9d\x96\x50\x2c\xd4\xf8\xae\xe8\xfb\x8c\x4a\xd6\xbd\x29\x78\x71\x9c\x41\x10\x0f\xc9\x12\x2d\x10\xd2\x68\xf7\x26\x21\x28\xf9\x3d\x77\x99\xb3\x48\x58\x7a\x6d\xd0\x5b\xba\xe7\xf6\xc9\x9a\x1a\x24\x73\x7e\xd9\x2c\xc2\x8c\x67\xe5\x0f\xfa\xe3\x8c\x6a\xcc\x76\xa9\x9d\x54\x96\x1f\x80\xc2\xfe\x90\xdd\x54\x4f\xd3\x94\x21\x3c\x6b\xd3\xaa\x9f\xf8\x69\x3f\x72\x00\x17\xea\x5c\xe6\xf0\x76\x06\xfa\xb5\xb8\xe3\x40\xba\x28\x5e\x43\xe1\x85\x59\x0f\x10\xae\x90\xa5\x3b\x06\x49\x0d\x12\x1d\x0a\x2e\xed\x17\x33\x21\x1b\xc1\xd4\x3f\xc2\x05\x4f\x42\xb1\x51\xc8\x54\xfe\xe1\x24\x6e\xd0\xe1\xca\xd5\x59\xd6\x8c\x8e\xe3\xdf\x3c\xd6\x13\x91\x5c\x5c\xa4\xcf\xde\x9e\xfa\x0c\x92\x96\x43\xcc\x78\xd3\x6d\x5f\xba\x28\xa7\xb2\x5a\x22\x2e\xea\x1c\x6d\xab\xb6\x53\xc5\x24\x33\x45\x98\xa8\x79\x30\x47\xb3" \
-"\x16\xda\xa8\xb6\xa0\x93\xc3\xb1\xb0\xc9\xea\xd5\xd1\x87\xde\x09\x01\x9d\xaa\xf0\xaf\xf6\xda\xff\x5c\x35\x66\xab\x16\xeb\xb4\xf8\x76\x0a\x55\x0e\x18\xda\xb8\x84\xbf\xe1\x70\x42\x03\xe7\x24\xeb\x22\xd6\xb5\x39\x68\x97\x4c\x45\x65\x53\x14\x27\xaa\x6c\xa1\xef\xec\x7e\x09\x90\x1b\x75\xd1\xae\xad\x5c\x10\xb9\x19\x08\x41\x1d\x86\x43\x01\xf8\x3e\xdd\xef\x86\x0c\x0f\xfc\xcb\x8c\xb3\x34\xf7\x03\xe6\x22\xb8\x66\x52\x76\x4c\xda\xfe\xf2\x18\x73\x16\x77\x5a\x04\x95\xec\xb0\x74\x44\x4d\x7b\xc9\xc0\xff\xbc\x6b\xc3\x03\xd9\xb8\x6a\xdb\x74\x51\xcf\xc1\xe3\x65\x29\x1d\xe8\x48\x55\xec\x97\x4a\x5d\x96\xa6\xab\x9b\x51\x83\x51\x6d\xab\xb8\x25\xbe\x72\x6a\x71\x90\xea\x4c\x8f\x5c\x62\xbe\x70\x97\xc6\x97\xb5\x63\x07\xb6\x32\xbe\x9d\x8d\x11\xc7\x94\xe6\x0e\xf0\x5f\xee\x8b\xa1\x60\x55\x89\x9a\x4f\x43\xa8\x65\xfd\x7e\x17\xa5\x8f\x2f\x21\x9d\x64\x06\x82\xfd\xbc\x42\x15\xcd\xf3\x74\x3e\xf1\xa1\xb1\xc7\xea\x3d\x87\x37\x71\x19\x99\x1b\x81\x95\xbd\x8c\x70\xd3\x31\xb0\x26\x2c\x6e\x1d\x87\xb2\x7a\xe9\x03\xa6\x61\xaf\x3d\x9f\x62\x3d\x36\x2e\x3e" \
-"\xf6\x89\x11\x96\xf9\xa5\x63\xd3\xac\x4c\x07\x68\x27\x6a\x77\xdd\x9f\xd2\x60\x21\xec\x57\xa4\x70\x2f\xe2\xf7\xec\x8c\xb9\xb6\x14\xc9\x33\x58\x61\x34\xc6\x46\x31\xf8\x60\x33\x52\x73\xa9\x4e\x49\x70\x7b\x6a\x78\x71\xb8\x5d\xc2\xe0\x44\xd3\xc8\xed\xd1\x29\xa0\x7f\x59\xa3\x37\x09\x1b\xfc\x4e\x5d\x93\x8d\x0c\x9c\x2c\xe2\x6a\x7e\x9f\xb5\x6a\x54\x19\x27\xdc\x29\x86\xb8\xad\x45\x8d\x80\xdd\x39\xc2\x38\x29\x94\x6b\xf2\xf1\xae\x81\x98\x7b\x51\x65\x01\xcc\x09\x6d\x9a\x61\xa9\x3f\xa7\x34\x60\xef\x3f\x74\xa3\x7a\x9e\x5e\xdd\x23\x5a\xb8\x45\xba\xdc\x9b\xcd\x41\xbf\x1f\xd1\x3e\x78\x9c\x4d\x9a\xd4\x3a\xa5\xd0\xfe\x41\xcc\x94\xc8\x79\x4e\x81\x4f\x79\x27\x22\x03\xa9\x76\x78\x34\x23\x77\x8e\x1d\x0f\x90\x9c\x5a\x86\x65\x69\x0b\x70\x20\x4a\x00\xdb\x9f\x84\x64\x07\x6a\x58\x8e\x2a\x9f\x9f\x85\x0b\xaf\x5c\x58\x90\x0c\x37\xb9\x2f\x8e\x1f\x2b\x27\x10\x53\x7a\x36\x07\x96\x9e\xd7\x0e\x8f\x88\x93\x8d\xe7\x9d\x43\x98\x77\xa4\x72\x9f\x47\xd2\x90\x62\x7f\x2c\x84\xda\xaa\xb7\x06\xb9\xd2\x5e\x5f\x63\xf0\x74\x1e\x7e\x4c\x73\xd4\xf6\x66\x5c\x60" \
-"\x9f\xfc\xb1\xad\xee\x57\x91\x78\xef\x53\x67\x94\x6f\xc1\xc8\x9d\xc7\x54\xf5\xa7\x44\x2b\x09\x45\x37\x53\xa4\x6d\x5a\x2e\x65\xd7\x24\x17\x4a\xaa\x49\x1f\x97\x3f\x0d\xe9\x97\x6b\xf8\x1c\x5c\x23\x46\x05\xeb\x55\xdb\x14\xd5\x99\x9d\xf9\xb0\x25\xff\xbf\x31\xdd\xc3\xf3\xcd\x96\xee\xea\xa8\x89\x99\xc9\xde\xcd\xc7\xa2\x77\x92\x29\x59\x69\x72\x90\x1b\xc2\xa7\x0f\x11\x66\x9b\x51\x14\x40\x19\xeb\xd9\x3f\x9a\xf2\xe1\x0d\x21\xb6\x26\x74\x2f\x6b\x32\xcf\x6e\x1d\x88\x37\x21\x8b\x88\xd6\x3f\x5c\x7d\x5a\x76\xca\x07\x0d\x2d\x2b\xa2\x6a\x35\x8f\x0d\xbe\xab\xe2\xc4\x90\x11\x31\x88\x78\xf6\x63\x1c\xdb\xb8\xab\x91\xe8\xf2\xe1\x56\xd8\x1d\xfb\xf9\x29\xf4\x90\x6f\x02\x0d\x43\x45\x61\x3b\xca\x5c\xfe\x47\xbd\x06\x77\xb4\xba\xcb\x22\x12\x55\x73\x67\xb2\x0f\x8b\x2a\x9a\x27\x18\x00\x13\x16\xf0\xff\xfc\x5d\xd9\x97\x76\x59\x4c\xe4\x75\xc8\x89\x0d\xbe\xf7\xff\x18\xfd\xa2\x18\xb8\x14\x46\xad\xf2\x41\xff\x0e\x55\xeb\x63\x67\x83\xb5\x54\x50\x3f\x9c\xb8\xcc\xbf\x3d\x9c\xfc\x3b\x25\x6d\xe5\x66\x8b\x5e\xb2\xb2\xa4\xe7\x31\x9b\x23\x38\xc4\x0f\xa9" \
-"\x90\xfb\xd7\x59\x81\xe6\x48\xdb\x8b\xc5\x4e\x6d\x66\x19\x30\x2c\x7b\xd3\xd8\x6a\xb9\xed\x7c\x85\x27\x25\xa2\x14\xd3\x86\x9b\xa8\x0b\xde\x98\x8f\xd3\x70\x85\x88\x15\xa9\x59\xbb\x5c\x3d\x90\x7e\x8e\xa5\x5b\x40\x2d\x29\x38\xa4\x6c\x31\xf1\x89\x63\x2c\xbf\x64\x0b\xe1\xa6\xf4\xb7\x0e\x45\x8d\xb8\xc1\xdc\x48\xd3\x43\xdf\x10\x2b\xe3\x22\x57\x5b\x20\xe5\x54\xa2\x71\xfb\x7d\xda\x76\x1f\xfe\x10\x21\xaa\xc9\xd1\x31\x1e\x71\x68\xc1\xd4\x52\x40\x50\xd6\x20\x95\xd9\xf4\xed\xc1\xdf\x68\x4d\x80\xe4\x8c\x37\xfc\xcc\xe5\xbb\x24\x63\x99\xf1\x8a\x87\xab\xa9\x3e\xfa\xb8\x3f\xa7\x8b\xb7\x39\xaa\x24\xd9\xc9\x81\xa9\xde\x4e\x99\x41\x99\xc3\xd3\xe5\x9f\xbf\x00\x91\x0c\xd1\x19\xf7\x7a\x13\x6c\xad\xa3\xbb\xeb\xfe\x57\x50\x19\x6e\xb3\x9e\x30\xe8\x14\x8a\x51\xc6\x4e\x12\x2c\x4b\xb5\x12\xee\x60\x3d\xf7\xe5\xfe\x02\x37\xa9\x20\xb4\x88\xb1\xa1\xd5\x84\x80\x6c\x5d\x9f\xc9\xd4\xee\xdf\xe9\xba\xf3\x04\xf8\x05\x21\xd6\xc1\xd6\x5f\x33\x8d\x3c\x48\x3f\x8e\xb8\x25\x7a\x76\x88\x61\x5d\x8e\xf5\x08\x93\xe0\x7e\x43\x5d\xaa\x69\x79\xe7\xab\x55\x69\xbf" \
-"\x7e\x58\x39\x2a\xfd\xb3\x55\xfb\xc1\xa3\x70\x47\x1c\x89\x68\xc7\x79\x0d\x7a\x3a\xe7\xa0\xb0\x32\xc8\x50\x41\x63\x19\x43\x81\x5b\x61\xb2\x83\xc3\x6f\x94\x86\x47\x39\x91\x71\xd1\xb1\x33\x9a\x1d\x1c\xb4\x4a\x0d\x45\x93\x60\xd2\x6c\xb0\x59\xf8\xee\x40\x8c\x55\xc4\xa9\x14\xfb\xee\xc2\x29\x38\x27\x3b\xe2\xbd\x82\xb2\x5a\xb0\xe2\x2e\x6c\x9c\xcc\xae\x55\x76\xa5\x89\xb8\xa0\x85\x59\xaa\xb8\x25\x30\x41\xf1\xe0\x75\xa4\xf8\xd5\x70\x8f\x80\x17\x82\x85\xd8\x42\xbe\x3f\xee\xb3\x54\x47\x1b\x32\x53\xc7\x5b\x7e\xa4\xc0\x4c\x6b\x64\xe5\x06\x19\xa4\x59\xeb\x75\xf7\x3d\x6d\xcd\x4c\x80\xe6\x29\xf3\x55\x3a\xbd\x80\xd8\x15\x35\x44\x50\x01\x19\xab\xcb\x47\xb0\x2e\x06\x54\x23\x96\x5f\x90\x90\xfd\xd2\x4e\x0a\x1f\xda\xb3\xf8\x5f\x51\xf4\x4f\xd7\x3f\xc4\x64\xa5\x78\x36\x0e\xb4\x7d\x98\x6a\xad\x7d\x0e\x6c\xd3\xa1\x83\xe5\x72\x38\xfc\x10\xdd\x10\xf2\x4a\x57\xa8\x79\x7f\xf7\xd4\xc8\x47\xcc\x74\xf6\xff\x9a\x18\x89\x7f\x2d\xb1\xd4\x11\xd4\x66\xec\x1d\x58\xb1\xa6\x87\x6b\xd2\xe6\xdb\x7c\x47\x62\x32\xe6\x6b\xde\x4f\xde\xbe\x25\xf1\xf2\xa7\x1b" \
-"\x75\xfd\xc9\x4c\xfb\xba\x12\x87\x60\xbf\xcf\x0f\x6b\x43\x92\xfb\x69\x66\x19\xc8\x47\xd1\xa5\x7d\xc0\x12\xe4\xa2\xee\xd6\xdd\x8a\x31\x28\x64\x7a\xf9\x14\x79\x39\xc7\x0b\x00\xf3\x4c\x39\x17\xd3\x6e\xd4\xfa\xda\x5f\x9a\x91\xb3\xad\x2d\xe9\x9b\xf6\x43\x23\xcb\x5d\x05\x02\x5b\x79\x74\x5d\x40\x45\x1f\xb6\xb3\x4a\x3b\xc6\x29\x13\x66\x33\x4c\x7e\xe0\x99\x41\xfe\xba\x5a\x10\x5b\xdc\x9a\x82\x14\xbb\x67\x8d\xf8\xbc\xf5\xfa\x8b\xbf\x30\x8a\x28\xc7\xc9\x9b\x93\x53\x3e\xfe\x50\x03\x6b\x68\x24\x67\xba\x5e\xba\xe1\x6b\xa7\x76\xe6\xc7\x55\xf1\xdb\x8b\x14\x1c\xe9\x05\x83\x90\x65\x15\xe4\xec\xf9\x73\x52\x3e\x93\xaf\xfb\xae\x80\xb0\xff\xf8\x8e\xef\x71\xa5\xfe\xee\x16\x63\xa2\xca\x6c\x4f\xeb\xf6\x20\xdc\x0b\x33\xef\x6d\x04\xcc\xb3\xd4\x56\x26\x05\xe8\xaa\x4c\x97\x83\xa5\xce\x7a\x69\x7c\x6b\x1c\x89\xc4\x63\xc2\x06\x7a\x1d\x4b\xb2\x1a\xe8\x46\x21\xe7\x18\x49\x21\xbb\xb5\xf0\x4b\x16\x72\xa3\x62\x72\x06\x5d\x02\x20\x10\x4f\x5d\x77\xdb\x99\x0f\xb6\x81\x7b\xf2\xa2\xb6\x98\xc8\x18\x0e\x5f\x30\x23\x3c\xed\x47\xb7\x98\x5c\x86\x1f\x52\xae" \
-"\x35\x9b\xaa\x60\xdd\x5d\x89\x5a\x1f\x80\x14\x83\x0f\x56\x9a\x5d\xbe\xb2\x7c\xd6\x82\x2b\x40\x86\xf9\x00\x30\xd7\x5c\xec\xca\x18\x2f\x3c\xe8\xbe\x7c\x03\x47\x91\xb7\xd7\xf0\x01\x64\xeb\xcb\xb9\xcd\x7a\xde\x29\xc7\x7f\x04\x4a\x39\x5c\x50\xe3\x6d\x51\xc5\x20\x26\x23\x35\x5e\xf5\x09\x8d\xf5\xdf\xdf\x5f\x2a\xaf\x9d\xd1\xd7\x5a\x40\x00\xf8\xf4\xf6\x19\x3c\x07\xa9\x8a\xf6\xb8\x60\x9b\x44\x5e\x9b\x16\x0f\xf1\xa9\x14\x31\xd7\xd1\x6f\xef\xc8\x90\x05\x21\x99\x8e\xef\x94\x6e\x75\x6d\xf8\x43\x62\x6d\x9d\xbb\xac\xa0\xa9\x55\x36\x00\x99\x81\xd9\x96\x43\x7c\x97\x65\x6a\x83\xcf\x86\x05\xff\x8b\x92\xc0\x00\x73\x5b\x06\x81\x3a\x3c\x67\x6a\xdf\x34\xd3\x66\xfc\x99\x07\x24\x22\x20\x88\x6f\x18\xe7\xda\x65\x72\x31\x80\xb9\x3a\xeb\x1a\x6c\x94\xd8\x02\x6d\x7f\x4c\xaa\xe6\xa7\x4d\xe6\x90\x78\xea\xb7\x4e\xf6\xcc\xe4\x86\xf9\x58\x64\xc4\xc6\xa8\x71\xd8\x2a\x23\xc1\xea\x22\xc3\x98\x7d\x4f\x4f\x18\xa1\xad\x10\xae\x2e\x43\xaa\x83\x9c\xe8\x56\x59\xad\x1e\x27\xd1\xb1\x32\x89\x54\x6d\xcb\x19\xb3\x69\x2a\x97\x8d\x38\x2f\x92\x6d\xaf\xe1\xf3\xd2" \
-"\xce\x51\xc4\xed\x9f\xc9\xa5\x37\xb5\x99\x45\x99\x75\x76\xd9\x82\x41\x8b\x44\x76\x3b\xc9\xca\x52\x81\xa2\x17\x66\x3d\x9b\x6d\xce\x7d\x29\x6f\x8b\x53\xae\x85\xf2\x2c\x02\xeb\xba\x3a\xf7\x63\x88\xad\x6a\xfa\xf8\x22\x98\x85\x03\xd0\xaa\x81\x17\x3c\x49\xd4\x2e\xbf\xbe\x58\xcf\xdd\xa4\xb2\x2d\xd7\x83\xcc\xe1\x75\xad\x8a\xb4\x03\x00\x0f\x0e\xdd\x49\xb8\x16\xa7\x53\xd8\x1f\x89\xfe\x6c\x5a\x15\xeb\x05\x44\x8f\xec\xda\xb1\xaa\xef\xb4\x08\xa8\x8c\xe2\xbd\x10\x91\x3e\xa3\xe1\x5d\xcd\x25\x78\x62\x81\xf9\x81\xfd\xd5\xae\xc8\x13\x8f\x8c\x09\xb1\x32\x69\x86\x45\x71\xf4\x85\x06\x78\x19\x9b\x84\xfe\xe2\xcf\x2b\x38\xa8\x45\xa9\x5f\x53\xa6\x22\x45\xd5\xbb\x62\xf3\x77\x8f\x79\xf9\x77\x81\xa5\x67\x92\x8c\x0d\x88\xee\xa0\xaa\xfd\xab\xd4\x62\xef\xac\xc3\xf9\x44\xcf\x3c\x18\x82\x80\xa7\xa3\xb2\x82\xdc\x06\x8b\xc6\xc9\x6e\x1a\x5b\x9b\x90\x8f\xd4\x55\x6a\x32\xc6\x4a\xd2\xa8\x92\xe8\xac\x1e\x98\xce\x45\x2c\x2f\x58\xa5\xb4\xdd\x2d\xfc\xf8\x2f\x1a\x21\x8e\xbd\x4d\x4d\x14\xb9\xf7\xf9\x58\x43\x75\xf9\x97\x76\x39\x12\x89\x80\xbd\x86\x94\x55" \
-"\x07\x2f\x3c\x8e\x6e\x69\xfc\x2d\xa5\xbb\x86\x32\xff\xb4\x38\x82\x89\x4c\xbd\xda\x98\x2e\x94\x2c\x01\xef\x2f\x48\xc0\x46\x0e\x4a\x5a\x88\xf5\x23\x28\xab\x1d\x11\x61\x4d\xb8\x20\x26\x26\xfc\x0c\x00\xe2\x0b\xde\x84\xb7\x79\xd1\x53\x03\xa4\xf3\x20\x6f\x6d\x91\xcb\x39\xf1\xc0\x05\x6b\xa4\x80\x03\xda\x45\xb2\xc8\xde\x2d\x41\x69\x6e\x73\xb8\x4b\xf3\xdd\x31\xe2\xaa\xbd\x31\xf6\x81\x21\x96\x26\xcb\x03\xd6\x6f\xce\x96\xa8\x89\xa2\xe4\x03\x60\x69\xb8\x1b\x6a\x51\x20\x93\xe6\x3c\xdb\xc7\xb0\x4a\x64\x12\x50\x8c\x46\x80\x73\x77\x6f\x52\xac\x08\x06\xa8\xbc\x38\xc5\x70\x9f\xa9\xd8\xc8\x5a\xfb\x68\x70\x13\xb3\x47\x3b\xb5\x8a\xe0\x9e\xfc\x94\x32\x41\x37\x21\x78\x8e\x89\x6c\x14\x8e\xec\x90\x59\xc5\xbe\xbc\x13\x66\xe3\xf0\x26\xaa\x81\x7b\x45\x7b\xc1\x0d\x25\x85\x2c\xa7\xd2\x8d\xac\x9a\xd0\x2a\x9c\x23\x7e\xb0\x01\x62\xc1\x87\x66\xeb\xe5\x16\x22\xbb\x12\x6f\x40\x53\x6b\x11\x9d\xf1\x75\x3b\x08\xd3\x3c\xc8\x57\xb8\x59\x84\xf9\x3c\x12\x51\xed\xe1\x35\xdd\x83\xff\xda\x40\xef\xc2\x07\xb5\x28\x03\x2e\x6c\xdc\x34\x6c\x3e\xfe\x8c\x25\x74" \
-"\x0f\x28\xa9\x5a\x2f\x88\x66\xfd\x07\xdf\x84\xcf\x3c\xea\x15\x86\x9b\x3f\x70\x25\x48\xde\x37\x3b\x14\x22\xa7\x47\xde\xdd\xa4\xa1\x5c\x83\xf4\xeb\xf3\xed\xb8\x81\x4d\xa5\xa0\x8b\xab\xea\xea\x45\x71\x80\x5d\xd7\x09\x54\x29\xd5\x23\xa4\x18\x78\xcc\xb4\xb2\x99\x2f\xf5\x39\x16\xaf\xce\x0c\xaf\xcb\x81\x27\x5d\x7f\x12\x0c\x37\x2b\x24\xfc\x01\x68\x74\x3b\x87\xc1\x91\xb7\x29\x3e\x4e\xa5\xbd\xe8\x80\xe0\x0b\x8e\xff\x02\xdf\x5f\x50\xdb\x57\xf9\x79\x1f\xb5\x32\xf1\x1f\x7f\xae\x63\xee\xb0\x74\x41\xdc\xa0\xbd\x19\xcc\x67\x14\xe7\x2a\xc3\x22\xb4\x69\x79\x6e\x63\x95\x8b\x01\xdd\x7c\x43\xac\x2f\xbd\xcf\x0e\xe5\x4f\x9e\xbb\xcb\x7e\xec\x0e\x35\x79\xf3\x84\x4e\x27\x48\x07\xa5\x16\x4e\x29\x65\x80\x14\xa8\x88\xc6\x6d\xe2\x20\x87\xa8\x68\x9b\x73\x39\x32\x42\x11\x48\xf5\x7c\x46\xbc\xc2\x90\x59\x8c\x55\x08\x0a\x81\xe3\xa7\x0f\x0f\xc9\x36\xef\xc2\x9a\xcc\x81\x1b\xbe\xf5\x66\xa6\xb2\xc9\x07\xc5\x4e\x95\x45\xf5\x04\x8f\x04\x54\x0d\xd9\x3b\xf2\xdf\xe2\xc7\xe7\x76\xbc\x37\x73\x38\x0f\xd9\x03\x00\xb5\xbe\x03\xa2\x7f\x78\xce\xb5\x08\xe1\x9b" \
-"\x94\xca\x75\x46\x60\x51\xf6\xa5\xfd\x73\x94\xd9\x8a\x2c\xcb\x24\x2c\xdd\x3b\x7a\x44\xaa\xf8\xeb\x58\xf2\xd1\x2a\x47\x1f\x75\x05\x95\xdd\xd8\x9a\x74\x29\xe7\x8a\x7b\x55\x80\x47\x6d\x6f\x11\x48\xa3\xe1\x6d\x07\x28\x85\x4a\x4c\x9b\x6b\x22\xc1\x72\xf0\x3d\x1f\x18\x2e\xd7\xc5\x60\x72\xd5\x12\xd6\x39\x77\x32\x12\x05\xaf\xfe\x15\xf6\x40\x91\xab\xd9\xf3\x9f\xfa\xe7\xe4\x40\xa4\x61\x3d\x96\x09\xe6\x0b\x8a\x84\x5f\xd1\x8a\x61\x57\x8b\xbe\xab\x87\x9e\xaa\x63\xc6\x12\x7f\x2c\x66\x01\xec\x5a\x49\xd6\x87\x74\x6b\xf7\xaf\x2e\xee\x33\x4f\xa3\xf9\x05\x89\x91\x5c\x8a\x17\xcf\x9e\x32\x6d\x83\x54\x3d\xb8\xfc\xe8\x14\x43\x6b\xbd\x3d\xc6\x1b\x06\xbd\x77\x22\xec\x5e\x69\x41\x8c\xb5\xf8\x20\x0c\x77\x7e\x00\x0e\xe2\x4e\x07\x79\x6f\x2f\x1e\x31\xce\xbb\x7d\xf7\xeb\x06\xe5\x22\xa1\xae\x48\x9a\x25\x5e\x08\x58\x7d\x36\xb6\x64\x2e\x54\x90\xd5\xfb\x3e\x47\xb1\x78\xff\xc2\x0e\x69\xce\x97\xb3\x90\x8c\xbf\xa7\xf8\x2c\x46\xe3\x9a\x8e\x20\xae\x9f\xc7\x9a\x4e\xa5\x44\x60\x49\x08\x0d\xf6\xa2\x9b\x30\x07\x79\x5a\xad\x28\xe2\xa6\xbd\x23\x57\xe1\x2d" \
-"\xd1\xdc\x46\x16\x9c\xd8\x27\x7e\x54\x8e\xcf\x64\xdb\x9b\xa6\x2b\xfd\xa1\xff\x8f\x94\x5d\x11\x07\x6d\xb0\x70\x0e\x57\x93\xba\x7b\x20\x9f\xfc\x53\x6f\xb6\xfa\x1c\xef\xcf\x5c\x40\x11\x1a\xd8\x00\x29\x18\x8e\xf6\x13\xac\x20\x89\xea\x45\x93\xfb\xea\xcf\x5f\x06\x71\xd1\x6b\x45\x7a\xc6\x94\x0d\x12\x1c\xee\xbf\xa8\xcd\x90\xea\xb5\xf7\xc0\x97\xb0\x5f\x9d\x3c\xe0\x1a\x78\x18\x10\x42\x66\x33\xb9\x6f\x27\x06\xcd\xbb\x10\x01\x8d\x2d\xea\x30\x90\x1a\x5c\x9b\xd5\xda\x58\x97\x00\x6f\x6d\x1c\x2c\xac\x18\xd7\xcd\xba\x2a\x77\x7c\x30\x29\xc7\x55\x51\xf4\x18\xaa\x47\x9c\x8d\xf9\xea\xc1\xae\x4d\xb8\x2f\x6b\x70\xeb\x7c\xfe\x07\xa3\x9c\x47\x3b\x7a\xe0\xc4\xd7\x47\x51\x91\xcf\xb2\x61\x76\x2d\x9a\x6d\xbe\x8f\x3f\x53\x87\x6e\xa6\xae\x2f\xc3\x21\x00\xea\xd4\xdf\x0b\xf8\xd2\x9e\x11\x8b\xef\x0f\x39\x85\xb9\x98\x47\x38\x02\x3e\x0a\x67\xf3\xf7\xb6\x51\x0a\x26\x31\x07\x83\x0a\xca\xb8\x4f\x95\x54\xd5\x7a\x85\xd0\x18\x8d\x84\x0c\xf4\xfb\xa0\x29\x38\xdb\x7b\x78\x17\xf0\x28\x1d\x20\xd5\xde\x24\x31\xad\xb0\x0b\xd1\x91\x68\x9a\x9a\xb6\xb7\x05\x3c" \
-"\x83\x46\xe0\x2f\x7d\x6e\x2f\xf6\xb4\xde\x7d\xf3\xfb\x37\x19\x93\x4d\xa4\x74\xda\x98\xbf\xf4\x2f\xc7\x44\xd0\xd1\x31\x5a\xc5\xb0\x02\xbf\x7f\xc6\x30\x10\xa8\xf3\x29\xc3\x32\xaf\x21\xac\x5c\xb9\xfe\x60\xdd\x41\x18\x24\xbb\x0a\x68\xf2\x65\xb9\xb0\xce\xd7\xa6\x52\xbd\xf5\xd0\x3e\x26\xcf\x61\xc0\x2d\x2e\x62\x42\xc9\x45\x5f\xce\xd3\xcc\xe1\x89\xcc\x64\x6e\x3a\x54\x1d\x70\x90\x33\x0f\x01\xaa\x4f\x29\xef\x4d\x01\xd0\xd1\x50\xd0\xd6\x1b\xa8\x99\xe5\xbc\x28\xfa\x0d\xf0\x17\x60\x36\xeb\x17\xca\xa5\xd7\x6d\x8f\xa3\xa1\x88\x65\x6d\x62\x66\x36\xe7\x8d\x9d\x16\x05\xc9\x59\x0a\xf1\x71\xe1\xb9\xea\x80\xd4\xce\xba\x3b\x72\x4f\x45\x2b\xab\xd0\xdb\x3f\xdb\x70\x36\x4d\x9c\x74\x96\x8c\x71\xba\x4f\x83\x6d\xe7\xcd\xaa\xfd\x83\x61\x8d\x6b\xf2\x05\xee\xa7\x20\x87\xc2\x8f\x97\x47\x16\x51\xfe\x54\x78\x67\x83\x3d\x56\x7e\x42\x33\xc9\x00\xaa\x46\x12\x26\x98\xe1\x03\x75\x62\x64\x8d\x72\x27\xa1\xbd\x92\x94\x2b\x37\xbd\x12\x9d\xb5\xb9\x07\x75\x4d\x38\xe5\x5b\x50\xe9\x4f\xa5\x8c\x18\x62\xc5\x82\x32\x46\x2c\x6f\xe6\xf1\x5c\xcc\xf6\x4e\x13\x12" \
-"\xe7\xdb\xc9\xcf\x54\xcd\x89\x8a\x71\x2d\x04\x48\x91\xcc\x03\x56\xe6\xc8\xd0\xa6\xda\xb7\xd9\x15\x59\x17\x28\x6b\xa1\x44\xe6\x60\xec\x5b\x6a\x0f\x26\xff\x84\x0d\xf8\x62\x6a\xb1\xdf\x36\xf7\x72\x52\x93\xa1\x2a\x2b\x0a\xc0\x0c\x5e\xc8\xf8\xc8\x55\xe7\xf7\xf6\xc9\xdd\xb4\xd9\x71\x0c\xde\x58\x35\x15\x06\x1a\xd6\xdc\x98\xfd\x5c\x38\x9e\x11\xe9\xda\x5f\xea\x5b\x61\x47\x94\x0b\x03\xe2\xc7\xfa\xc9\x84\x5c\xf4\x12\xd2\xf8\xd4\x59\xb6\x60\x49\x79\xfa\xde\x3b\x79\x76\x13\x1c\xdd\x7e\x30\x77\xbe\xd9\x48\xc2\x5b\x04\xd5\x11\x89\x22\xf6\x07\x06\x8f\xf5\x61\xc0\xfc\x37\x91\x52\x0a\x4d\x6f\x1f\x50\x4a\x9c\x0e\x44\x6f\x52\x4c\xa8\xcb\x09\xdc\x36\xe9\xaf\xba\xa9\x68\xf3\x02\x8f\x6d\xd5\xf7\xa3\xc4\xb5\x25\x10\x32\xda\x1c\x81\x76\xa2\xbb\x62\xca\xe2\xf4\x27\x1b\x5a\xff\xeb\x7d\x62\xce\x9b\xb3\xd3\x3a\x87\x50\x61\xdc\x20\x88\x12\xe2\x3c\xfb\x33\xaa\xa5\x2f\x04\x3f\xa0\x29\x69\x55\x17\x7a\x20\x91\x45\x55\x9f\x93\x49\xd1\xc9\xa9\x19\xe1\xa4\x06\x97\x5c\x09\xdf\x37\x89\xca\x43\xdd\x64\xa1\xf8\x0a\xd1\xc3\x1b\x92\x04\xdb\xe3\xbe\xcb" \
-"\x86\xe4\x0a\xa0\x22\xdd\xfa\x6e\xcb\x21\xba\x3c\x88\xb9\xeb\x48\x2d\x69\xb0\xa1\x24\xa9\xb9\xae\xa8\x92\x17\x39\x80\xc6\xa2\xc2\xc5\x3e\xfe\x66\xc8\x9a\x8c\x62\x28\xd0\x80\x5f\x97\x4d\x28\xbe\x58\x4b\x9c\x2f\xcf\xdc\x0b\x7d\x9f\x18\x59\x8e\x3c\x02\x9c\x19\x2c\xcb\x27\xde\xa6\x7a\x5d\xd7\x5b\x57\x39\xc7\x45\xd3\xf4\x8c\xf1\x6a\x2b\xc1\x0a\x96\x41\xe2\xa3\xca\xa5\x9b\x5d\xdb\xcf\x1c\xae\x9d\xc9\xc7\xa9\xae\x1c\x24\x75\x6a\x9b\x57\xd1\xdf\xab\x68\x48\x4c\xb4\x65\xc4\xf8\xa3\xfc\x96\x21\xe0\x76\x80\x82\x91\xd3\x1c\x50\x11\xae\x21\x9c\x6c\x8b\x78\xe1\x6f\x09\x2e\xe4\x4f\x70\x79\x23\xb5\xaa\x0c\x83\xad\xa9\x04\x28\x08\x65\x22\x9a\xe3\xc8\x39\x32\x76\xdc\x80\x15\xd0\x3e\x83\x44\xc1\x34\xa3\x23\x60\x2d\xe1\x1a\xdb\x32\xc2\x2c\x16\xb5\x53\x15\x52\x23\x64\x0a\xf1\xda\x0c\x68\xf0\xfe\xbe\x36\x30\xd5\x57\x41\xb7\x1b\xe8\x17\xf6\xa9\xb3\xa4\x37\x42\x46\xdb\x07\xd6\x80\x3a\xf4\x78\x34\xff\xd5\xaa\x51\xeb\x10\x2e\x12\xe5\xba\x8b\x76\x7f\x0c\x4a\xad\x6a\xab\xa1\x03\x6c\x03\x71\xd3\x02\x58\x5a\xe3\xca\xc4\xc3\x45\x58\xa8\x28" \
-"\x57\xf7\xd2\x05\x1a\x75\x9f\x2a\x03\x49\x94\xf7\xec\x6e\x10\xec\xa9\xb3\x16\xc6\x20\x4f\x8a\x60\x46\x06\xa1\x1b\x47\x9b\xf1\x70\x3c\xbc\x33\x86\x9a\x00\xcf\xcb\x2b\x66\x58\xb4\x8b\xef\x48\x1a\x2e\xae\x4c\x41\x0e\x87\xca\xd3\x7c\xc9\x04\xe3\x28\x77\x2e\x66\x17\x47\x8f\xa7\xa4\x4d\xc0\x87\x10\x1b\x94\x7f\x7b\xbf\xd1\xa0\x31\x5d\x8a\x5e\xa1\xb5\xcd\x50\x50\x21\x49\xcb\x2d\x24\xc2\xad\x56\x07\xea\xc8\x8a\x14\x3e\x14\x6e\x54\x10\xee\xcf\x7b\xaf\xe9\x28\x87\x33\x55\x88\x40\xcc\xc6\xcf\x97\xa2\x85\xcf\x3a\xf6\xbb\xc9\x5b\xb9\x4c\x2e\xd1\xad\x99\x47\x9e\xf1\x6d\x42\x81\x6d\x13\x46\x1e\xba\x4c\xf9\x7d\xc5\xf3\xdf\xdb\x10\x5d\x86\xe8\x3b\xbc\x2a\x04\x9b\x81\xec\x91\xa6\xf4\xde\x67\x03\xa6\x91\x96\x39\x81\x13\xfd\x9d\xf2\x42\x61\xa5\x6b\x57\xb4\xf5\xf7\x2f\x13\x22\x87\xdb\x5e\x4c\x76\x9c\xf7\x94\x2c\x8e\xa4\x14\xb8\x60\xb3\x8a\x36\x27\xd4\xeb\x60\xd7\x27\x2d\x33\xd7\x27\x2f\x77\x78\x16\xc5\xa6\x9e\x1a\x73\x15\x10\x6e\x17\xa6\x84\xd1\xe8\x67\xf8\xc8\x85\xee\xe0\x0d\x32\x6e\x21\xd3\x9a\x05\xef\x89\xe2\x57\x83\x98\xe1\x3b" \
-"\xd0\x31\xcc\xed\x51\x95\x22\xa7\x2e\xb5\x79\x6e\x1f\x6c\xe2\x0a\x50\x06\x2f\x54\xb4\xb0\x56\x46\xab\xdd\x55\x8f\xac\xe3\x78\xe5\x4b\x8c\x85\xc3\xb0\xad\x5c\x52\xb3\x61\x73\x74\xec\xe0\x46\x2c\xa6\xce\x17\x63\x00\xd5\x2f\xcb\x99\xdd\xb2\xf6\xc4\x1e\x4a\xd0\x64\xf5\x55\x88\x84\x06\xd5\x49\xc7\xf8\x3d\xce\x8d\x4a\x3d\x64\xb5\x9d\x33\x83\x5f\x74\xd9\xda\xa2\x20\x88\x0a\x73\xdd\x41\x10\xdf\x13\xa3\xac\x49\x8c\x61\x45\x43\xc7\x74\x89\xfb\xbc\x6a\x44\x4e\x19\xe1\xca\x28\x75\xa1\x72\x0a\xd0\x1d\x30\xd9\x52\xea\x4b\x86\x9c\x09\xfd\xf1\x90\x16\xba\x8b\x65\x6f\x25\x48\x5f\x21\xb1\x14\xf6\xd2\x84\x01\xff\x54\x99\xab\x8c\xde\x39\x56\x22\xb5\xe4\x27\x0d\x9e\x23\x39\x71\x10\x3d\x61\x6f\x27\x30\xc0\x58\x66\xc9\x53\x49\x71\xe3\x74\x14\x49\xa9\x87\x6b\x08\x60\xfa\x17\x19\xf2\x33\xa6\x1d\xa0\xa9\x2b\xef\x5a\xfe\xc6\xd1\x36\xf9\x1f\xd9\x17\x76\x39\xc0\x14\x45\x4d\x32\x18\x22\xbe\xa6\x1c\xb5\x31\x7e\xde\x85\xab\x00\x55\xd4\xe2\x5e\x23\x0b\xba\xfd\x2a\xa2\xe7\x6f\x29\x35\x15\x00\xc4\xd3\x11\x49\xb4\xd3\x2b\x0a\x0b\xa9\x2a\xd9\x64" \
-"\xdc\x6a\xd3\x08\x44\x2c\x41\x7c\xd6\x67\xc6\x1e\xbf\x19\x47\x36\xaf\x26\xb3\xc7\x46\x8a\x61\x6c\xff\x8a\x7d\x28\xe3\xa1\x4c\xed\x89\xb5\x97\x82\xc7\x93\x32\xca\x3f\xcc\xc9\xd2\xb0\x60\x22\x38\x43\x7b\xb7\x01\x4c\x9a\xeb\xb3\xd8\x0c\x75\xbc\x2e\x9c\xfc\x71\xa0\xe9\xc5\x55\x88\x1e\xf8\x8c\x0c\x5e\x86\x41\x56\xc3\xea\xf6\x5b\xa9\x16\xf6\xb3\x32\x09\x72\xdd\xb5\x75\x4b\xf8\xfa\xb2\x0d\x1b\x11\xfd\xf2\x2e\xd9\x26\xad\x29\xc7\x1d\x4a\x28\x23\x44\xd2\xd0\x3a\xb4\x85\xf4\x8a\x71\xcf\x22\xe1\x7a\x5c\x6f\xdd\xb7\x18\x96\x31\x07\x15\x42\x38\x3a\xa5\x72\x53\x1b\x1f\x30\x0e\x06\xa0\x42\x2d\x40\x57\xb8\x07\x1d\x7b\xf8\xe7\x4c\x01\x85\x52\x7a\x36\xc6\x2b\x8f\x87\x05\xad\x5a\xea\xc1\x0b\x0d\x9e\xc8\xd2\xeb\x22\x10\x93\x22\x0c\xa2\x7d\x11\x2a\x78\xb2\xfe\x46\xf7\x62\xef\xfd\x79\x06\xe4\x88\x8e\xe0\x54\xb5\xf4\x7a\x82\xa5\xf7\x1a\x28\x07\xc2\x4b\x45\x6d\x9a\x08\x45\x49\x13\xbb\x5d\x8d\x85\xa3\x8e\x66\xe6\xa7\x40\x3c\x52\x8c\x49\xcd\xdd\x2c\x8b\x6a\x43\x4b\xe8\xc0\xc9\xc7\xc6\x03\x8a\xe4\x8c\xa1\xd4\x39\x37\x33\x5e\x26\x59\xe1" \
-"\x5c\x25\xef\x38\x23\x32\xcb\x7b\x91\x8c\x3e\x25\x4e\x11\xdf\xec\xd3\x03\x98\x30\xc8\x49\x12\xca\xcb\x64\xb9\xab\x33\xfe\x8f\x27\x8d\x7d\x1c\xec\xb3\x2d\xea\x7e\x14\x41\xae\x61\xf1\xf2\x2d\x3f\x31\x0a\x89\xea\x89\xba\xe1\x84\x24\x36\xc3\xad\x15\xb9\xa3\x76\x7d\xf4\x42\xac\x91\x7c\xf2\x05\x15\xe6\x33\xa5\x18\x47\x9d\x74\xac\xb7\x93\xb0\x94\x88\x58\x54\x0a\x53\x16\xad\x43\xe4\x11\x25\x88\xf8\xea\x4d\xe9\x91\x6f\xfd\x1f\x4d\xd4\x6f\xde\xd7\x2e\x4d\x1d\x0a\xc0\x79\x11\xad\x46\xfc\x35\x88\x10\xb1\xa2\x1c\x71\x7c\xb5\x92\xeb\xf8\x50\x50\xf2\x5e\x15\xc0\xa2\xec\x15\xa3\xf4\xd9\x0f\xa7\x54\xc3\x2b\xd8\xdc\xb1\x45\x63\x23\x3a\xd9\xfc\xc3\x66\x0d\xc4\x69\x06\xd9\x30\xd1\xc7\x8f\x8b\x33\xe3\xb4\x50\x94\xce\xb7\x99\x1f\xf5\x3c\xb6\xcd\xc7\x99\xf4\xe8\xfb\xd1\xa9\x2a\xa3\x43\xd9\xb5\x1b\x39\x73\x6b\x4e\xc0\xfe\xec\xb7\xe6\x72\x2a\x9b\x13\x8e\x53\xcf\xac\x35\x14\xfa\x02\x96\x25\xd6\xba\x23\x08\xb3\xaa\x5a\xd6\xa0\xda\xfb\x82\xc5\x18\xbf\x17\xec\xe3\x9d\x03\x60\x20\xa8\xad\xf8\xd7\x29\x0e\x0e\x50\x86\x22\x41\x6c\x6a\x2e\xc3" \
-"\x96\x96\x7b\x67\x38\x79\xca\xd5\x6b\xf5\xbf\x81\xc0\x28\x5a\x05\x1e\x64\x77\x9c\xd0\x16\xce\x77\x30\x45\x36\x16\xe6\xd9\x61\xa7\x72\x69\x9b\xbc\x4e\x03\xaa\xe2\xd1\xa7\x93\x9a\x5a\x7e\xc1\x0c\xfd\xe4\xa5\x03\x1f\x66\x6a\x02\xeb\x12\x27\x98\xad\xb6\xc2\x7e\xb7\x72\xca\xd1\x20\x44\x62\x63\xb9\x37\x15\x74\x59\xe0\x4f\xa0\xa6\xab\x27\xb3\xad\x92\x4f\xa7\x24\x4b\xc3\x16\xf8\xb1\x61\x7a\x0e\x56\xea\x63\x14\x8a\xfc\x02\x1f\x2f\xbf\xbb\x88\xe0\xe9\xac\x1c\x3b\x4d\xe7\x7c\x56\x43\x19\x09\xde\x77\x9d\x1d\x1e\xa6\x6f\x6b\x8a\x99\xfe\x1a\x69\xf3\x5b\xd0\x02\xf9\xbc\x28\x22\x8a\x5b\x20\xab\xf6\x40\x39\x07\x91\xf3\x9b\x5d\xe4\xe4\x9e\x5e\xb9\x95\x3f\xec\xb0\xba\x23\x91\xab\xd1\xd5\xd6\x01\x9e\x8f\xb9\x21\xf8\x54\x01\x5b\xc9\x00\xae\x70\x34\xa5\xca\x18\x14\xea\x7d\xff\x8e\x23\x8a\x15\x57\x9d\x28\x57\x96\xde\xe2\x72\x77\x7f\xbe\x7b\x19\x0a\xaf\x14\x42\x23\x08\xfd\xcb\x11\x4f\xef\x4f\x31\x5c\x6f\x3e\x40\x5e\x96\x5f\x32\xf6\x13\x4e\x59\xf7\x04\x19\x92\x8e\xc9\x65\x89\x24\xb3\x5d\x50\x9e\x90\x22\xf8\xad\x14\xf5\xb4\x1e\x84\xf1" \
-"\x0a\x78\xcd\x0a\xc8\x77\xc3\xc1\x30\xcd\x8f\x30\x35\x9b\xf2\x32\x63\xb5\x9a\xb6\x2c\xf3\x05\x12\x79\x8c\x3c\x38\x8d\xd5\x9c\x9e\x7a\x1c\x7d\x2a\x98\x53\x2f\x84\x10\x36\xf6\xa4\x7b\x44\xed\x97\x14\xa1\x80\x18\xfb\x99\x24\x09\x64\xe3\xeb\x0f\xcc\x21\x45\x5a\xaf\x47\xc8\xd7\x18\x1c\x88\x7b\xe0\x70\xcd\xb7\xab\x82\x77\x9d\x57\x9b\x37\x59\x32\x79\x8f\x0c\x76\x33\x83\x6d\x6f\x27\xc2\xce\x77\x96\x59\x09\xc7\x56\x58\xcf\x20\xf1\x8d\x6a\x0b\x13\xf1\x8c\x4a\x13\xf1\x74\xba\xe0\xd8\x8b\x53\x23\xba\xbd\x7a\x40\xa8\x79\x3f\xb6\x65\xe8\x98\x60\x04\xa2\xbf\x98\x49\x0c\xf0\x37\x33\x70\xda\xd8\x81\x1e\x27\x31\xd1\x84\x18\x8c\x16\x11\xd8\xda\x78\xdd\xf8\x28\xa9\x18\x4e\xc6\xdb\x63\x56\xe1\xe9\xff\xef\x76\x0d\x2c\xbe\x91\x98\xcf\x65\x66\xa8\xcc\xd4\xb3\x6d\x36\x65\x30\x9b\x5b\xaa\x0a\x57\x83\x31\x5f\xa5\xc7\x3e\xa2\xbb\xef\xba\x07\xe1\x80\xb2\xc9\x27\xdf\xd5\xc2\xca\x41\xd8\xbc\xcc\xa1\x35\x67\xc8\x6c\x38\x77\xcd\x98\xe3\x69\x08\x37\x63\x64\xe2\xe3\xce\x68\xac\xf9\x7e\x27\xb9\x01\xf3\x86\xe2\x68\x24\xb0\xf2\x33\x1b\x53\xfc\xfa" \
-"\xdb\x02\xc9\xc5\x40\x9c\x66\xab\xac\x3b\x23\x3c\x9a\x70\x20\x0e\xfc\x4e\x5b\xa2\x36\x8b\xdf\x9a\x61\x9d\xec\x31\x21\xfd\x43\x3c\x64\x7f\xcc\x53\xeb\x07\xd9\xd7\x88\x55\x4c\xac\xa1\xb4\x36\x3d\x2b\xbb\xcf\x7d\x32\x9d\xf6\x60\x9f\xcb\x11\x3d\x1a\xb8\xce\xce\xe8\x49\x20\xde\xfc\x40\x9c\x4e\x8c\x29\x79\x49\xde\x85\x48\x62\x2d\xa1\xac\x2a\xe6\xa4\xf8\x8b\xff\x8c\x54\x05\xf4\x83\x9e\xb9\xb1\x05\x1b\xc9\x44\x45\x25\x20\x0b\x4f\x0f\xda\xc9\x29\x3d\xdc\x52\x66\x8f\x89\x5d\xa1\x5d\xb8\x85\x8c\x09\x76\xdc\xd9\xb8\x9d\xe3\xb8\x01\xdb\x23\xb7\xb7\x9a\xc3\x7b\x3b\x7c\xa6\xfb\x97\xf8\x53\xc7\x9e\xa3\xce\x04\x83\x20\x45\x89\x5d\x34\xd5\x54\xdb\xe1\x55\x92\x1a\x15\x7a\x8a\x6c\xbd\x5d\x1d\x24\x13\x7f\xb9\xfb\xba\x86\x01\x8b\x82\x94\x18\x93\x71\x99\x12\x9c\x71\xdc\x88\x63\xcf\x10\xe0\x76\x05\x7d\xf7\xdf\xbb\xff\xb0\x2d\xe1\x64\x41\xe6\x5e\xf7\x6a\xec\x8b\x30\xaa\x87\xbc\x6e\x48\xf5\x4d\xe5\x77\x79\xdd\x75\x50\xa1\x0b\x53\x6f\x68\x07\x10\xd7\xc8\x4c\x46\x1e\xeb\x6d\xff\x6c\x33\x16\x27\x76\xa6\xb9\x0a\xc9\x19\x87\x8b\x7b\x2f\xe7" \
-"\x5e\xed\x2c\xcd\xe0\x65\x9f\xdb\x34\x4b\xdb\x75\x7f\x5e\x25\x62\xa6\x1a\xda\xb6\x87\x4f\x61\x80\x2f\x50\x0b\x81\xe8\xc7\x49\xee\x14\x60\x49\x08\x0d\xf6\x96\x71\x10\x5d\x1d\x3f\x63\xb8\x7f\x30\xb8\x0f\xc9\x29\x08\x49\x14\xfe\xba\xbe\x55\x39\x6a\xdb\x32\xde\xf5\x13\x01\xe0\x7e\xcc\xb0\xd4\x2e\xca\xfd\xf6\x8b\x8b\x9d\xa5\xe0\x64\x10\x30\x32\x92\x92\xbd\xd7\x69\xfa\xdb\x07\x69\x1b\xc3\x3a\xb9\xdf\x18\x84\xc7\x79\xb7\x1c\x0f\xf2\xaa\xc4\x78\x74\x10\xc5\xd1\xe2\x39\xdd\x06\x14\x9a\x62\x32\x64\xd1\x44\x23\x39\x4d\xa8\x8b\x65\xb3\x49\xb6\x9e\xed\x36\x8c\x27\xb5\x6c\x9a\x8b\x70\xb9\x70\x58\x33\x7d\x5d\x1a\xca\x4d\x9d\x30\x58\x42\x4a\x40\x37\x99\x4e\x7b\x9c\xab\x3b\x2b\x0b\x8e\xf9\x89\x19\x88\xdb\xf4\xd2\x75\x2c\x9c\x88\x50\xe0\xec\xd5\xbe\x47\xfc\x87\x25\x5f\x07\x05\x1c\xac\xf1\x1b\xd9\x8c\x13\x2a\x8a\x6b\x47\x0c\x4b\xb3\x70\x1d\x81\xbf\x09\x8d\xb3\xff\x01\xa2\x07\x76\x69\x2f\x31\x69\x2c\x14\x56\xb9\x02\x7d\x92\xf1\x9f\x69\xb0\xdd\x73\xd5\x0e\x42\xca\x5f\xfa\xd5\x2b\xf8\xb0\x04\x2e\x27\x54\x13\xba\x50\xf2\x35\xb6\x9c" \
-"\x03\x2b\x08\x4f\x58\x9c\x7f\x0b\xf7\xb3\xc7\xd0\xfb\x25\xd9\x16\xcf\xbf\x80\x35\xa0\x10\x9f\xc5\x13\xd6\xf0\x1d\xc1\xd4\x49\xbf\xf4\x1b\xbd\xe5\x63\xfb\xfe\x32\x2a\xbf\xc7\x0f\x95\x8d\x51\x3c\x19\x87\x78\xe7\x28\x54\x7f\x3b\x96\x7f\x2d\x9a\x87\x7c\x6d\xfc\xba\xcc\x62\x94\xa2\x85\x0a\xea\xe8\x98\x58\xd8\x36\xf2\xce\x4e\xa0\x0c\x4e\x0a\xe4\x02\xee\x32\x09\xe6\x74\xcc\xce\xa0\x09\xc7\x0c\x0c\xe0\x0d\x99\x51\x33\xfd\x8c\xc5\x94\x2f\xc0\x0e\xbb\xff\xd8\x6e\x8d\xc6\x23\xd4\xf4\x43\x4d\x30\x57\x2e\x2e\x71\xcd\xdc\x51\x69\x6d\x09\xf8\xc2\x64\x47\xbb\xa0\x09\xdd\xb2\xb0\x77\xc4\x24\x88\x0c\x44\x22\x71\xdd\xfa\xfa\x04\xfb\x14\x89\x46\xf1\xac\xb2\xb9\xd6\x17\x37\xc4\x1f\xa0\x4c\xd6\xe6\x8b\xc0\x90\x78\xbc\xe1\xd7\x84\x21\x69\xb2\x53\x45\x5c\xc0\x70\x7b\xdd\x22\x07\x49\x91\xe9\x38\x0c\x43\x6a\x98\x4d\x8f\x4d\xd9\x66\x06\xc7\x35\x0e\xa2\x0c\x86\x5b\x3b\xa9\xb5\x12\x2f\x0b\xce\x45\x41\x42\x1b\xa0\x62\x95\x16\x18\x35\xc4\x77\xe7\x54\xd3\xf6\xe7\xda\x63\x78\xc5\x97\x1e\x99\xc0\x78\xfd\x46\xea\xfd\xef\x22\x4a\x06\xe9\x95\x9b" \
-"\xd6\x0c\x7f\x39\x5c\xe1\xc9\xe9\x74\x30\xe2\x5e\x9f\xd4\x4e\xde\x63\x74\x1d\xbb\x03\x3b\xa7\x44\x6c\xa2\x92\x7d\x06\xb2\xe6\x3c\x9e\x3c\x55\x5e\x71\x5d\x02\x4b\xc3\xea\x42\xc8\x94\x80\x32\x38\x3a\xcd\x4f\xe2\x0b\xbd\xbd\x58\x20\x43\x53\x54\xbc\x1f\xb4\x4f\xfc\x09\xb1\xc7\x35\xa3\x42\x36\x6e\xf5\xae\x71\xe1\xcc\xb4\x95\x06\x8d\x12\xfa\x96\xa8\xe5\x63\x6b\x6e\x6c\x3f\x46\x2b\x92\xd8\x40\x2a\x03\xe3\x92\xdf\xe9\x06\x8c\x6c\xee\x15\xf5\x46\x0e\x98\x5c\x6d\x8a\x68\xc8\xc3\xf8\x7d\xe6\x08\x04\x8a\x7d\xe4\xdd\xe1\x62\x92\xe6\x5b\xe1\xf7\xcf\x1d\x70\xb9\xca\x9d\xda\x12\xc1\x2d\x36\x2f\xd7\xa2\x1d\x5c\x5f\x0d\x58\x28\x81\x01\x96\x6a\xcb\x75\x4c\xb0\x9d\xa9\x3d\x2d\xc9\x43\x23\xee\x95\x15\xae\x32\xa2\x96\x78\x16\x90\xc3\xbb\xd6\xef\xb2\xe7\xa5\xc8\xa7\xaa\x6b\x62\xf2\xcd\x48\x71\xa6\xa3\x06\xc5\x39\xd2\x6a\xe7\xc0\x11\x70\x4d\x53\xab\xd8\x7f\x49\x8f\xb6\xe0\x6f\x68\x89\x7b\x77\x34\x99\x2a\xcd\xa1\x91\xae\xa7\x26\x75\x82\x52\x1f\xe4\x66\xea\x1e\xc7\xc2\xcf\x49\x6d\x40\xe7\x37\xdd\x41\xe1\xcb\x1c\x71\x02\x78\xc9\x16\x7d" \
-"\xd3\x4c\x52\x3a\x4b\xb5\x21\x79\xbd\x8a\x46\x7a\x9b\xfc\x85\x33\x23\xf1\xc1\x79\x94\x30\x2c\x9b\x7b\xf0\x09\xa9\x91\x0f\x4f\xd5\xb4\xa0\x1e\xc6\xe1\xd1\xba\x7c\xba\x35\xf0\xf6\x0d\xbc\x34\xd3\xdd\xb5\xd4\x8c\x8f\xbb\xb2\x0b\xb5\xca\x4e\x32\x37\x77\xe4\x71\x78\xe7\xb8\xa5\x7a\x79\x5e\xb5\xde\xf8\xe1\xcc\xf5\xae\xcd\x3f\xdb\xc0\xf6\x52\x65\x6d\x73\xa0\x99\x52\x83\x26\xdb\xe5\x3a\x72\xcd\x8a\x8d\x89\xed\x59\x5e\xf5\x54\xb1\xa6\x00\x26\x10\xad\x38\xf8\x43\x37\x72\xfc\x59\xfb\x92\x5d\x18\x68\x71\xb5\x25\xa4\x25\x9e\x60\x89\xbf\xd6\x15\x33\xd7\x3a\x7b\x6f\xa1\x74\x9d\x70\xd3\xbc\xd2\x34\x69\xdb\x5b\xd5\xbf\x85\xab\x2f\x66\xae\x33\xaa\xb4\x0a\x1e\xb5\x11\x2b\x4c\x0d\xf2\x88\x29\x2d\x9b\x18\x2d\x4f\x92\xda\x06\x6b\x2f\x8e\x20\x8d\x5e\xa5\x0c\x95\x54\xaa\x7a\xca\x43\x82\x7e\x27\x81\xf4\xbb\x13\xe3\x16\x6c\xea\x5e\x62\x3d\x9b\xfb\xe4\xd4\x2b\x25\xfe\x51\xde\x29\x43\x05\xe1\x7c\x35\xcb\x6f\x18\xd4\x40\x11\x55\xc2\xff\x38\xbe\x73\xc0\xcb\x37\xaa\x98\xbb\xa6\x74\x55\x42\xa7\xd5\xf7\x81\x0f\x76\x56\x68\xe0\xc3\x6c\x6d\x06" \
-"\xc8\xbf\x22\x8a\x75\x4a\xb6\xd1\x12\xcc\xb6\x8b\xb8\x1b\x6b\xaf\x0e\x91\x9b\xc5\xfb\x35\x8d\xd1\x62\x82\xe6\x02\x5b\x5b\x5a\xfe\x83\xfc\x5b\x55\x27\xd4\x49\x5a\x39\xb8\x90\x1a\xa3\x06\x20\xf3\xea\xa2\xea\xec\xa7\xea\x49\x71\x32\x4d\xa5\x81\x7a\xd3\x06\x22\xc2\xb8\x1d\x87\xe2\x5b\x72\x0e\x60\xf6\xf3\x16\xc8\xf2\xdc\xae\xe3\xf4\xa8\xc7\xc5\x37\x72\x3e\xd7\xac\x3a\x3c\x52\x29\xcd\x08\x6b\xfd\x3e\x6c\x7a\xf9\x4e\x89\x27\xa7\x0e\x23\x99\x88\x3e\xc1\xd3\x78\x31\xed\xe8\x16\xd7\xbe\x84\xa1\xfa\xf9\xae\xfd\x5a\x5d\xd2\x23\xde\x23\x3e\x3c\xcc\x6b\x3f\xc6\x79\x93\x44\xd5\x4b\x31\x32\x03\x05\x4a\x1e\x5c\x77\x0b\xdf\x85\xde\x1d\xe9\xf8\x5d\x57\xc2\x8b\x54\x34\xd6\x2c\x92\x13\xf1\x52\xcc\xa3\x9a\xfd\x82\x9f\x58\x94\x74\xcf\x1d\x72\x75\x96\x9a\x18\x51\x4e\x5f\x01\xd0\x54\xc5\xac\x8d\x03\x6b\x12\xc0\x78\xc4\x5b\x1e\x52\x5a\xe8\xa3\x0a\x8e\x60\xc6\x3e\x7e\xd4\x99\x64\xcf\x92\x7a\xe9\x5c\xbc\x93\x1b\x09\x66\xcc\x77\xd1\xf2\x47\xde\x6c\x72\xf9\xad\x3b\x0e\x43\x1a\x68\xf0\x88\xc7\x46\x83\x27\x86\x12\x01\x98\x4f\xe0\x82\x68\xc3" \
-"\xb3\xd7\x5a\xba\xf4\xee\x0c\x5a\xb5\x91\x4b\xee\x54\x9e\x6f\x3f\xbb\x79\x98\x84\xa7\x96\x8a\x3e\xcb\x28\x46\x8a\x9a\xd2\x25\x32\xe2\x45\xfd\x8f\x1a\x00\xf3\x83\x05\x8b\x4f\x30\x30\x73\x7a\x3d\x47\x29\x01\xe8\xef\x04\x60\x4a\xd1\xfd\x80\xe0\xde\x9e\x61\x96\x10\x1e\x84\xf0\xc7\xc5\x76\x0d\x47\x38\xa0\xbe\x23\xd7\x6e\xa5\xfe\x1a\x45\x2b\xc3\xa3\x1e\xf5\x8a\x30\x50\x8c\xf5\x59\x53\xa5\x41\x27\x14\x53\x73\x77\x6f\x5a\xca\x65\xac\x5b\xb2\x23\x11\x78\x2d\x76\x5b\x3c\xbd\xb4\x85\x22\x13\x89\x98\x8f\x10\xba\xd6\x04\x2e\xf2\x17\xb3\xe5\xcc\x37\xda\x16\xbc\x05\xde\x8c\x45\xc3\x2b\x1f\x22\x9f\x83\x35\x1c\x53\xd0\x9e\x70\xa3\x10\x3d\xaf\x03\x45\x71\x86\xae\x15\x7d\xa2\x5b\xb6\xfb\x78\x11\x5e\x64\xfc\xc7\x76\x23\xf8\x40\xce\xb3\x26\x79\xb0\x54\xc5\x09\x02\x2d\x6f\xf4\xa1\xfa\xc7\x82\xd0\xa7\xfa\x00\x9b\x39\x00\x5f\x27\xce\xed\x05\x17\x3a\x8e\x89\x4d\xa4\x98\xdb\x5e\x39\xed\x10\xdb\x77\x39\x3a\x65\xbd\x68\xcd\xe4\x1c\xed\x77\x8f\x63\xf1\x05\xa0\x73\x5b\xd7\xf6\xc6\x99\x3c\xba\x40\xf8\x7e\x43\x38\x9b\xb3\x37\x66\x03\x2f\x44" \
-"\x91\x29\xd1\x2d\x94\x6a\x0b\x47\xbf\xab\xf5\x21\x06\x85\xd8\x01\x6d\x80\x38\x78\xf7\x11\xa9\x96\xad\x3d\x6f\x00\x41\x02\x5f\xe5\x3f\x3b\xb9\x94\xd5\x95\x8c\xbe\x39\x97\xa3\x49\x09\xe7\xfa\x4c\x7e\xd3\x0c\xaf\x0e\x26\x92\x1e\x66\x16\x7c\x3a\x89\xef\xb5\x63\xb0\x02\xb8\x30\xc4\x84\xf8\x8c\x5a\xc2\x5f\x06\x5a\xf2\xab\xfe\xbd\xeb\x08\x44\xf4\x73\x59\xd9\x0a\x3d\xac\xfc\x4b\xba\x75\xd4\xd8\x3e\xfd\x62\x9c\xe9\x60\x8b\x37\x5b\xfb\xa8\xdd\x43\xe7\x12\x8c\xfa\x26\xe8\x8f\x41\xdc\xea\x81\x6a\xb8\x3f\xab\x77\x60\x20\x09\x2d\x97\x4a\x47\x51\xa2\x6d\x3a\xc2\x7d\xbf\xa9\xf4\x09\xbe\x25\x26\x62\x24\xee\xb0\x26\x96\x1e\xe3\x00\xbf\x3c\xbd\x00\x04\xb2\xc4\xee\xb6\xe9\x08\x7e\x0e\xec\x49\x64\x10\x96\x31\x1a\x68\x98\xc5\x84\x35\xe5\x64\xc4\xce\x07\x4a\x5b\x8f\x17\xce\x78\xfc\x34\x49\xa1\x94\x29\xa0\x89\x1d\xcf\xde\x0d\x80\x90\xbf\xa2\x3c\x18\xe2\xbb\xfa\x49\x4c\xf6\xf0\x1f\xfe\x6d\x90\x66\xf8\xcf\xd7\x2c\xb6\x1d\xca\x36\x8d\x6b\x7c\xef\xcd\xf3\x36\x9e\x00\x94\xca\x62\x41\xe9\xc9\x3c\xa9\x22\x40\x51\x3e\xcd\xe1\xe4\xe9\xfa\x17" \
-"\x92\x35\x68\x78\x44\x47\xb3\x1a\x9c\xe6\x19\xe1\xeb\x8a\x14\xc4\xdf\x48\xb0\xed\x43\x6b\xca\xd3\x20\x1f\xb8\x1a\xb2\x40\x86\xe1\x73\x08\xe3\x09\xc8\x21\x1f\x1f\x3a\x52\xfb\xf9\x36\x2e\x3c\x0c\xe9\x42\xde\x90\xf3\x6f\x6e\x19\x75\x4d\x6c\xdf\xd3\xd1\x17\x4e\xa2\x9a\x4d\x54\xfb\xa6\x59\xcf\x2d\x4e\x33\x55\x12\x33\x0e\x38\x09\x83\xba\x6f\xe5\xe6\x0b\xc5\xc4\xc9\xb8\x86\x93\x34\x0e\xb9\x91\x0e\x09\xa4\x9d\x52\x03\xfc\x2a\xf4\x8c\xcf\xbd\x4d\x0d\xe8\xf8\x8b\x0a\x89\x1e\xbd\x5b\x5c\xca\x3f\xf9\x61\xd4\x8b\x27\x9b\xfb\xfd\x0a\xf9\x0d\x73\xee\xcb\x70\x93\xba\xb9\x2e\xef\x33\x8f\x94\xfb\xa3\xd0\xfe\x79\xf0\xf3\x16\xa2\x2f\xc4\x2c\xf9\x00\x3b\x7f\x90\x52\x0b\x45\x7c\x4c\x83\xe7\xec\xa9\x61\xac\xa8\x9d\x18\x11\x3d\x6c\xe5\xb6\x99\x00\xc4\x17\x76\x28\x46\xa7\xb2\x4f\x2f\x71\x4b\x5d\x2e\x87\x94\x79\x39\x14\x96\x1c\x42\xd2\x8d\x8e\x5b\x83\x70\xef\xbc\x23\x05\xb5\x80\x02\x3b\x78\x06\xe4\xce\x82\x84\x68\x1e\xdb\x93\x52\x0c\x30\x09\x62\x33\x22\xc4\x87\xec\x73\xb2\x0a\x19\x08\xcd\x1c\xe7\x8c\xc7\xe0\xe0\xa2\x7b\x58\xc2\xca\xda" \
-"\x74\x31\xe9\x89\x70\x48\xeb\x9d\x7d\x89\x4a\x84\x31\x45\xe8\xf9\xf7\xf1\x2f\x08\x70\x05\x48\x8a\x95\x79\x02\x94\xcc\x5d\xe7\x2c\x81\x8c\x95\xce\x68\x25\xd0\xb5\x56\x43\x7a\xa7\x72\xa6\xc8\x86\xb4\xb3\x8b\x78\x10\x6a\xab\x5d\x3a\xb3\xaf\xb3\xf4\x94\x24\x53\xab\x9d\xb6\x92\x6f\x16\x00\x90\x6e\x69\x2f\x5a\xec\xb1\x2f\x2c\x23\xfa\xed\x6f\x8d\x59\x06\xba\x16\xc4\x20\xa6\x17\x8f\x11\x60\x7f\x3a\x8b\x89\x1d\xfa\xa4\x34\x8d\x01\x0d\x75\x52\x5d\xf1\xfe\x78\x8b\xa5\x01\x72\x69\x07\x87\xb4\x39\xfc\xca\xe9\x45\xfd\x26\x0b\x58\xdf\x11\xcb\x40\xa2\xaa\x7f\x3b\xa3\x5a\x08\x3a\x95\x14\xd6\x9f\x1a\xa0\x78\xf4\x7b\x5b\xcb\x1f\x56\xed\x14\xf2\x42\x0e\xb6\xce\x7f\x36\x77\x24\xb6\x29\x81\x80\xc1\x51\x13\xb6\x78\x55\x17\xd2\xdc\xb1\xca\xcc\x66\x8f\x51\xf3\xe9\x0f\x43\xb7\x9d\x60\x7a\x78\x82\x4f\x9a\x76\x24\x4e\x98\x18\x7b\x5a\x56\xa9\xc8\x14\x1d\x39\xd2\x85\x10\x34\x18\xca\x14\xad\x65\xe6\x3d\x2f\x69\x5e\xf4\x2f\xd9\xcf\x57\x57\x5d\xcc\x8a\x6e\x08\x96\xc8\xf8\x81\x8b\x86\xe1\x22\x22\x96\xf7\x46\xc2\x90\xa7\x15\x62\xa1\x07\x26\x4e" \
-"\x03\x24\x2a\x86\xa1\x9d\xcb\x57\x22\xab\x1c\xc7\x40\xba\x82\xdf\x67\x79\x58\x82\x32\xae\x0a\x32\x4f\x0d\x5c\xa2\x63\x01\x55\xa8\x7a\x3d\x84\x50\x55\x70\xee\x06\xb3\xcf\xa2\x35\x10\xc6\xfa\xda\xce\xca\xf2\xf8\x1f\x4a\x56\xc5\x85\xc1\x24\x63\x85\xa0\xdf\x37\x24\x99\x65\xa5\xbc\xb8\xb3\xbd\x24\xc6\xfe\x33\xc7\x0d\x74\x18\x0a\x87\x65\xd0\xa6\x36\x6b\x01\xa6\x61\x26\xc9\x2d\x56\xda\x2c\xa3\x3c\xad\x81\x45\x11\xcc\x37\x55\x8d\x50\x64\x58\x7f\x6c\xcd\x41\x49\x9f\xcc\xd8\xfa\xf0\x11\x79\xc4\xc4\x79\x2e\x40\x19\xd7\x58\x66\xdd\xf4\x23\xf8\x60\x72\x42\x7d\x86\x07\x53\x61\x00\x50\xa6\xe0\xd8\x16\xd5\x12\x2a\xf2\x7e\xb6\x51\xe0\x0a\x25\xc1\x2b\xae\x4a\x9f\x93\x3a\x41\xd9\x93\x6e\xd6\x5f\x7a\xae\x7d\x79\x4a\x42\x90\x4a\x63\x34\x84\x68\x69\x8b\xe1\x80\x3e\x01\xbc\x07\x2b\xb9\xde\x86\x06\xd8\x34\xd3\xd5\x53\x6d\xb0\xa6\x98\xa1\x30\xd3\x7c\xc6\xf1\x34\xed\x8b\x9b\x14\xe9\x8c\x37\x93\x44\x4d\xa6\x6a\x51\xd5\xfa\x4a\x7d\xa5\xd5\x41\x93\x5c\x1f\xd0\xf2\xa9\x5a\x1e\xef\xa5\x8f\xc4\x55\xf7\x79\x93\x26\xb5\xaa\x4b\x1e\xe0\x69\x79" \
-"\x1b\xc5\xf6\xac\x27\x6d\x06\xd1\x2a\xd0\x0d\x94\x99\x61\xf7\x26\xa8\xb9\x4c\x2a\x66\x91\xa6\x1b\xf2\x25\x88\x2d\xf5\x20\xc8\xb1\xe1\xf8\x9a\x75\xac\xb8\x25\x9c\xd0\x64\x97\x40\x10\xc1\xfe\xd5\xcd\x8c\xcf\x99\x40\x9b\x39\x2f\xed\x3b\xe7\x0a\x82\xcc\x48\x1e\x11\x3c\x4c\x73\xa1\xed\x68\x05\x26\xfe\x5a\x98\xd0\x31\xc2\xa0\xf3\x6a\x4e\x29\xfb\x8f\x68\x82\xb4\xf1\x62\xd3\xee\xc2\xe0\x24\xf2\x27\x6d\xb4\x43\x82\xd2\x2c\x08\xa2\x96\x10\x4c\x53\x28\x56\x61\x57\xbb\x2a\x32\x3f\x23\x62\xc0\x17\x8a\xec\x5a\x03\x9d\x13\x05\xfc\xe4\xd3\xef\x01\x55\xbe\x36\x90\xda\xdd\xb8\x13\x59\x4b\x8a\x35\x73\xce\x1f\x64\x63\xbb\x50\xa2\xde\x86\xa7\xee\x75\x54\x24\x3e\xb2\xe0\x93\x77\xa0\x41\xf4\xf5\x9d\xbc\xb8\xde\x2a\x35\xbc\x54\x33\x05\x16\xd6\xe5\x5c\xf9\x11\x4e\x06\x4f\x91\x5c\xc9\x35\x3a\x2d\x57\x5a\x13\xc2\xfd\x12\x44\x57\x3a\x30\xce\x55\xf1\xad\x28\x00\x26\x4b\xd2\xe3\xfe\x96\x75\xa8\x58\x29\xb4\x1f\x4d\xef\x88\x25\x6a\xde\x21\x3f\xef\xd9\xf5\x1d\x0b\xff\x5e\xb5\x84\x5b\x50\x98\x0f\xe0\xfd\xbb\x68\xbf\x5f\xb4\x37\x6c\x18\x41\x20" \
-"\x1b\x93\xc9\x66\x66\x40\xf5\x0e\xc4\x9a\xa9\x85\xbf\x75\x31\x6c\x4b\x85\x48\x5f\x30\x7e\x01\xa6\xbb\x81\xdf\x5e\x60\x27\xe1\xde\xc4\xd2\x81\x23\x18\xba\x91\x06\xad\x52\x43\x82\x61\xa7\x8a\xa7\x39\xb5\xe4\xf9\xf7\x2c\x1d\x09\x8c\xf5\x31\xa4\xd2\x77\x5b\xb0\x0f\x1f\xce\x58\xe5\x9b\x17\x48\x72\xe0\xed\xbe\xc2\x93\x85\xe9\xaa\x16\x40\xf1\xa2\xcc\x34\xd0\x8a\x9f\x1d\x5e\x19\x75\x67\x84\xe8\x41\xc6\x5a\xb7\x71\x06\x4c\x34\x8d\xc7\xa6\xaa\x80\xc7\xfb\x3c\x89\x56\x4e\x34\x10\x48\x40\x70\xae\x43\x36\x49\x3f\x37\xb7\x1e\x0b\x30\x83\x07\x5e\x97\x11\xa6\x73\x3e\x05\xdd\x47\x1e\x89\x23\xb5\xfa\xbb\x44\x1a\xbb\x33\xca\xf9\x4c\xa2\x3f\x0a\x90\x7b\x77\xd9\x9b\x0f\xd6\xd4\x34\x27\xd0\x6d\xd2\xce\xe6\xf2\xba\xfe\xaa\x8a\x34\x28\x82\x07\x66\x43\x1c\x26\x6a\x98\x7a\xac\xb8\xa6\x51\x1e\xec\x95\xd5\xec\xae\x82\x8c\x2c\x8f\xc7\x09\x76\x3a\x0b\x1e\x7e\x8b\x27\x80\x5c\x53\xf2\xcf\xc8\x9d\xf5\x93\x54\xcf\x8c\x78\x3b\x38\xe4\x91\xb1\x82\x30\x8b\x4e\x65\x7c\x2a\xe4\x81\xac\x0e\xf8\x90\x8e\xbd\x26\x9e\x3a\x55\x54\x4b\x88\xb4\xaf\x0d\xb8" \
-"\x00\x1a\x80\xea\x97\xa7\x28\x06\xa3\x08\x17\x39\x45\x2a\x59\xae\x32\x00\xd8\xba\xa6\x07\x8f\x7b\x5f\x17\x1a\x86\x7f\x7d\xc7\x75\x1a\xd7\x81\xd4\x77\x53\x02\x42\x60\xf7\x7e\xf1\x31\xab\xba\xde\x92\xea\x73\xc7\x7b\x70\x4f\x93\x35\xd2\x5f\xc0\xa6\x31\x89\xf5\x50\x78\x0e\xb8\xf2\xed\x83\x1b\x8d\x64\xb2\xb9\x36\xf5\x98\x37\xf3\x58\x2d\x7a\x30\xe5\xd6\x37\x76\x69\xde\x1a\xbd\x44\x2a\x15\x22\x39\xa5\xf6\x6d\x23\x54\x2d\x4c\xc4\x74\x7f\x58\xb4\x0a\xb3\x67\xe2\xd0\x21\x5b\x6f\x0c\xe7\xdd\xa6\x40\xc7\x5d\x57\x3a\xa4\x6c\x17\x7e\xa9\xd8\x77\x44\x68\x18\x33\x9c\x47\xaf\xb5\x5d\xb8\x7c\xab\x22\x48\x73\x5f\x94\x48\xa6\xf1\xb2\xdf\x24\x0a\x0c\xdb\x32\xac\x8b\x98\x1a\xe8\xb9\xf9\x5f\xf9\x08\xf4\x14\x4e\x88\x8d\x91\xa9\xa8\x02\xd0\x09\x1e\x25\x32\x95\x2f\x32\x11\x40\xd6\xa8\x20\x17\xe4\xe8\x1f\x4e\xdb\x4d\x08\x50\xfd\x29\x4f\x08\x7b\x41\xea\x24\x4e\x97\x17\x44\x12\x46\x0a\x09\x09\x21\x8e\x81\x73\x8f\xbf\x7f\xd1\x8d\xca\xbd\x37\x78\x10\x94\xb8\x7a\xb2\x4d\x0a\x95\x12\x1e\x06\x65\x35\x5a\x9b\xef\xfd\x52\x39\x0b\x7d\x54\x07\xaf" \
-"\x74\x3e\xd2\xe8\x70\x82\xfd\x69\x99\xcb\x1f\x78\xfb\xf1\x2d\x29\x7f\x60\x92\x0b\xbb\xb4\x73\x15\x3f\xb6\xd5\xc4\xaf\xff\xa2\x1f\xe9\x41\xc5\x6e\x2a\x88\x36\x76\xea\xb0\x03\xfc\x53\x04\x6b\x85\x13\xe2\x22\xa3\xe8\x1f\x27\xab\xb2\xf2\x24\x45\x40\x21\xa7\x8b\x51\xb8\xa0\xcf\x77\x25\x89\x28\xa5\x32\xa7\xf3\xbc\x52\x8e\x5b\x02\x00\xd1\x10\xa6\x98\x86\x71\xb9\xec\xfd\xa1\x78\x5a\x5e\xbd\x51\xc9\xe0\x3c\x42\x52\x17\x0c\xc7\xc5\x56\xc6\x10\x36\xae\xed\x79\xba\xf4\x8d\x32\x1a\x98\x78\x4e\x34\x47\x73\x28\x5e\x9c\x16\xa2\xf1\xdb\x5a\xd4\xec\x15\x99\xaa\x8e\x14\xc8\xfb\x31\x62\xc0\xad\x0e\xa7\xc7\xa7\xb0\xeb\x6f\x3d\xf3\x1e\xd7\x23\x71\x7f\x7a\xfa\x4f\xa2\x28\x82\x51\x1f\x33\xb1\xf0\x09\x1f\xc0\xd2\x97\xab\x4e\xc9\x32\x66\xe3\x4b\xc4\xef\xe8\xaf\xf0\x77\xcd\xbf\xb4\xd1\x44\x7b\x56\xf4\x72\xf4\xd1\x07\x23\x11\x10\x59\x85\x59\x2a\x09\x12\x7c\x15\xfc\x65\xf4\x58\x4f\xd6\xea\x91\x8c\x34\x76\x2f\x2c\x79\x2b\x0e\x06\x9d\x1a\x10\xac\xfc\x55\x5e\x54\x3b\x86\x13\x77\x0a\x46\x5b\x9d\xf6\x08\x4a\x20\x0f\x17\xe6\x02\xcd\xbc\x67\xed" \
-"\x5c\x13\x58\x15\x93\x87\x75\x7c\x6b\x8c\x27\x98\x33\x38\xf6\x7a\x99\xae\x6a\x91\x8c\x92\x4e\xb4\xf3\xd4\x3e\x2e\x03\x83\x89\x4e\x38\x4f\xa0\xfc\x75\x54\x7e\xc7\xc2\xf0\xe3\x17\xbc\x28\xce\x48\x44\x28\x3a\x5b\xb7\x50\x28\x1f\x41\x09\x46\x17\x22\x40\xc7\xd5\x8a\x50\x8c\x3a\xca\xd7\x73\xdf\x5c\xb5\xda\x74\xfc\xd2\xbe\xd2\x36\xa6\xf1\x42\x84\x3e\x62\x6d\x9e\x33\x34\x59\x45\x18\xab\xb0\xeb\x74\xaf\x12\x6f\x50\xa7\xd1\xaa\x96\xc2\x98\x17\x60\xa2\x29\xf4\xe8\x50\x55\x4c\xe2\x7e\xf0\xc4\xd6\x51\x28\xb7\xe1\x66\x0a\xa6\x39\xe7\xe6\xe8\x95\xa4\x74\x70\x7a\x00\xb6\x35\xc7\xfc\x37\x32\x6f\xf3\xc8\x40\xbf\x1d\xf0\x56\xbb\x7e\x85\x79\xf9\xf9\x25\x3a\xae\xd1\x27\x98\x67\x97\x83\x7f\xcf\x9a\x0e\xbc\xef\x1c\x6b\x21\x0a\x39\x52\x9e\x74\x3f\xe1\x1d\x67\x50\x86\x54\xf5\x25\x0d\x01\x46\x5f\xb4\x52\xbf\x00\x43\xf3\x43\xda\x94\x1e\xf8\xa0\x85\x5c\x53\xbe\xc5\xfb\x96\x75\x1c\xb2\x79\x11\x10\xd1\x04\xbc\x9b\x37\x52\x86\x80\x03\x68\x8e\x84\x90\x20\x65\x00\xdf\xa6\x4f\x31\x6c\x40\xe7\xa2\x06\x1b\x5e\x74\x44\xeb\xa8\x24\x73\x27\xbf\x97" \
-"\x1c\xca\xe4\x23\x5a\x35\xac\xaa\xad\x97\xec\xae\xc5\x13\x55\xd8\xc0\x9e\x80\x23\x06\x58\x15\x19\x9e\x5c\x12\xd5\x16\x88\x77\x95\x7c\xd5\x67\xc5\x06\xce\xae\x24\xc4\xc7\xd0\x44\x39\x54\x1c\xda\xfb\xd6\x4b\x9d\xfe\x2e\x3d\xe4\xbc\x57\x5d\x7d\x9b\x26\xaf\x04\x24\xa0\x1f\xb1\x46\xde\xf5\x55\xf6\x45\x6d\x2d\x4d\x97\xaf\xca\x17\x11\x8b\x42\x4d\xa6\x9b\xfb\x52\x9c\x0b\x4d\x66\xde\x14\xaa\xff\xe8\xa2\x29\x49\x1a\x59\x76\x3a\x7e\xd4\xcf\x6c\x37\x05\x88\x96\xf0\xdf\xb9\x67\xe7\x73\xb6\xbd\x27\xa4\xa2\xb6\x70\x71\x0b\x5d\xfa\x6c\xf7\xe7\x8f\xac\x43\xdf\xdd\xe0\x18\x74\x80\x77\xe8\x8f\x5a\x1b\x95\x31\xe2\xc3\xee\x42\xe9\x0f\x61\x89\xaa\x9b\xec\x7c\xb9\x5f\xc0\x79\x24\x52\x4c\xf9\x1f\x2e\x66\xb9\x0e\xf3\x1e\xf4\xd9\xb8\x9c\x9c\xcf\x23\x26\x59\x6b\xd4\x8b\x4b\xa1\x10\x4e\xe8\x4c\xd1\x07\x5c\x5e\x50\x9f\x3a\xa2\x8a\xd8\xce\xe7\x5d\x55\xc6\x8c\x5a\xc8\xaa\x4f\x76\x1a\x34\xa8\x6f\xa5\xe0\x5b\x2d\x55\x2a\xa2\x8e\x37\x00\x13\xa7\x8e\x56\x4a\xeb\x2b\xe6\x03\xa2\x5d\x21\xef\x2b\xb5\xfd\x9b\x6a\x1c\x30\x96\x2b\xea\x66\xbb\xf7\xbb" \
-"\x28\x2b\x9e\x21\x30\xf2\xd6\x5f\xb6\x7e\x03\x19\xda\x2f\xa3\x8c\xd9\x06\xdd\xc7\x39\x4c\xb6\xf4\x6e\x31\xa8\xf0\x81\x1f\xe2\xb9\x23\x12\xb9\xbd\x02\x11\xbe\x86\x89\x1d\x4c\x76\x30\xd8\x21\xbc\x67\xa0\x42\x8f\x17\xe6\xff\x18\xee\x06\x6f\x12\xd6\xa3\xf4\x1e\x24\x04\xd8\x1f\xa2\x3c\x7f\xeb\xcb\x43\x22\x45\x14\xe3\xdc\x38\x6b\x4e\x51\x0a\xa0\xa9\x13\xff\xd3\x7e\x2e\x4d\x2e\x98\x2e\x72\x87\x8b\x17\x03\xac\x34\x50\x56\x0b\x05\xbe\x33\x56\xbe\x43\x00\x4b\x11\xa0\xe5\x0c\xfe\x98\xdd\x03\xd5\xdc\xd5\xf4\x33\x9d\x49\xfb\xce\xd5\x2b\x71\xf7\xf5\xbd\x34\xe2\xfa\x6d\xd4\x04\xa8\x84\x18\x89\xa0\xaf\xdb\xcc\x9c\x20\xfd\x79\x08\xd1\xc8\x60\x58\x5d\x42\xf3\x54\x4c\x94\x8e\xe5\x56\x1f\x6a\x0a\x17\x88\xc8\x84\x98\x96\x33\x7d\xca\x0d\xca\x3f\x6e\x26\x7d\x0c\x71\x11\xa2\x5c\xd9\x18\x6c\xeb\xd1\x51\x41\xca\xb3\x3c\xb0\x0b\x5b\x3e\x2d\x7e\x60\x09\x42\x99\x86\x0b\x28\xe7\xcd\x42\x05\xf9\x5c\x63\x77\xce\x69\x6c\xcf\x4f\x2c\x3d\x0a\xb3\x12\x07\x21\x0f\x44\xcc\x28\xd6\xab\xdf\xb1\x62\x5e\xb0\xf3\xa5\x98\xe7\x9a\x01\x43\xe2\xec\x6d\x89" \
-"\xca\x48\xea\xf3\x17\x9c\x29\x69\x76\x28\x48\x70\x93\x35\x4c\x7e\x9e\xff\x91\xd5\xd6\x2b\xf1\xc2\x7d\xe3\x68\xf1\xc4\xf4\xed\x8c\xd6\x3e\xd2\xf9\xcf\x8f\x3a\x6a\xb6\x0a\x4b\xf7\x72\x13\x7f\xd2\xd9\x66\xbe\xc8\x95\x24\x3b\x89\xcc\xde\xdf\x7b\x3f\xd7\x54\xf9\x31\x95\x53\x89\xcd\xe0\xc0\x2c\xa6\x65\x6d\xb5\x62\xdb\x11\xa9\xba\x23\x0b\x6c\x83\x4b\xb9\xdc\x3a\xd6\x81\x43\x0f\x6a\xdc\x43\x4c\x07\xf7\x9a\xc9\x92\x19\xe0\x33\xa9\xb4\x3d\x49\xa9\xd8\xa3\x40\xb3\x90\x3d\xb8\xa3\xa3\x08\x71\x28\x2a\x35\x2e\x50\x32\xc7\x9c\x06\x8a\x2c\x56\x82\x0c\xc3\xfb\xbf\x63\x7a\x7f\x74\x9b\xf8\xcd\x56\xac\x31\xc5\x84\x65\x7c\x20\x17\xe1\x4e\xfc\x17\xb6\x1b\x0a\x5d\x87\xdc\x62\xf6\x3e\x9d\x86\x66\x01\x71\xf4\x41\x27\x03\x6a\xa8\x16\x8e\x10\x40\x8c\x0f\x50\x63\x23\x16\xb3\xa5\xa6\x55\x64\xe9\x5a\xe5\x12\x4e\x5c\xcc\xff\xda\xe0\x79\xda\x95\x92\x65\x5a\xed\xd1\x8d\xac\x47\xc1\x5a\xaf\xbd\xa5\xa9\x58\x1b\x0f\xc5\xe1\x84\x20\x7a\xd7\x59\x5c\x82\xaf\xa0\xba\xc9\x14\x3d\x40\xa2\x85\x03\x2b\xf2\x01\xfd\xfc\xb5\x88\xfd\xda\xa3\x82\x6f\x24\x0e" \
-"\x85\x07\xdb\xcc\x91\x22\x20\xaa\xc1\xec\x97\x4a\x4a\x93\x4c\x8a\x6b\x79\x7a\x75\x9e\x1c\xf6\x32\xff\x87\x8a\xa4\x11\x26\xa4\xd2\x4b\xae\x74\xd0\x92\x91\xa3\x36\xa1\x8e\x68\xf2\xfd\x4c\x61\xba\x5c\x83\x45\xbd\xd9\xf1\xe1\x9d\x4e\x25\x4e\x60\xdc\xc2\x03\xf6\xd6\x79\xb2\x5d\x1a\x2e\xa5\x89\x04\xdf\x61\x0e\x5e\x32\x34\xea\x32\x56\x45\x8d\xa5\x79\xca\x98\x25\x55\x16\x87\xd4\xe9\x1e\x6a\xd0\x98\x0a\xc4\x17\x90\x02\xc7\x12\x2b\x2f\xec\x53\x1e\x36\xf9\x07\x91\x74\xef\x24\xbf\x73\xab\x65\x4d\x27\x66\xa7\xf9\x98\xea\xc1\x8d\x18\x8f\xfe\x84\xf1\x31\xdd\xdf\xbd\x67\x0c\xf5\x14\xf0\xd5\x79\x98\x52\x45\xb3\xc0\xba\x06\x42\x38\x16\x16\x90\xf0\x7d\x57\x0d\xf8\x5d\x6c\xe5\xf5\x94\x0e\x3e\x83\x2d\x64\xc9\x3f\x44\x76\xf9\x42\x62\x84\x8d\x4a\x8c\x14\xdc\x51\x86\x8d\xac\xbe\xc7\x95\xcd\x5d\x39\x2d\x71\xf0\x0f\xa1\x04\x7a\xe4\x1c\x96\xdc\xb7\x58\xe2\x33\x75\x06\x6b\x7a\x27\xa5\x19\x0f\xc5\xc7\x95\x9d\x83\xd6\x2c\xfd\xf0\xf7\xf1\x8b\xe5\xe8\xd4\xda\x71\x17\xbc\x84\x93\xfa\xfc\x0e\x91\x07\xf6\x65\x1b\xbe\x9b\x1b\xe0\x14\x25\x3f\x02" \
-"\x36\x26\x05\x22\xba\x02\x6b\xdd\xa1\x42\xf8\xd9\x3f\x4f\xca\x53\x35\xfd\x7f\x57\xfc\x6c\x85\xaf\x0e\x52\x8c\x84\x96\x5e\xea\x78\x78\xd6\x20\xea\x35\x51\x3c\x6b\xff\xa6\xbc\x59\x99\x09\xad\xea\x55\xf4\x0b\x4c\xd9\xbe\x16\x10\x93\x50\x17\x71\x7e\xf1\x54\x39\x86\x54\x98\x2a\x61\x9e\xb0\xf7\x8a\xf9\x36\x6e\x67\x70\xaa\x34\xee\x6d\x1b\x83\x89\x54\x25\x35\xa2\x2d\x0c\x87\xe4\xb3\xc5\x2c\xa3\x8f\x21\x00\x7d\xc6\x2d\x7a\x5d\xfc\x94\xd0\xa3\xf2\x63\x7e\xc3\x7a\xf7\x67\x8d\x16\xd0\x94\x71\xec\xd2\xdf\x39\xf1\x80\x09\x28\x69\xcf\x6d\x45\xe5\xcc\xee\x62\x7c\x64\xe3\x11\xb9\xe2\x12\x77\xc0\x32\x18\x62\xc4\xbb\xe6\xe0\x3c\xbf\x9d\x29\xb3\x5f\x4c\x99\x06\xd9\xe8\x5d\x02\x6e\x29\x94\x8c\xcb\x09\x9c\xe1\xae\x1a\x10\x01\xb6\x14\xf2\xdd\x72\x48\x15\x8d\xe2\xd5\xc8\x11\xc6\x10\x64\xb0\xd8\x49\xf0\x4c\x06\xed\x4e\xc8\x77\x4d\x27\xf0\x9e\x1f\x94\x83\xbb\x3f\xe8\xd2\x40\xb3\xfa\xe8\x35\x4e\x28\x12\x59\x21\x27\x8c\xd1\x38\x70\xf9\x92\xde\x07\x7f\xa1\x41\x92\x21\x92\x7f\x38\x72\x20\x54\x50\x18\x70\xe5\xe6\xd5\x5e\x5b\x94\xf4\x6d\x0d" \
-"\x9d\x6f\x33\xc9\xad\xad\x42\x88\x96\x06\x6f\x6f\x9a\x0b\x11\x74\x0d\x1b\xd1\xf2\x3b\x63\x15\xa9\xde\x44\x48\xde\xa4\x3d\xd9\xc9\x35\xcd\x21\x0f\x8d\x0a\x50\x0a\xd7\x52\x7d\x2b\xa5\x36\xb8\x1a\x97\x47\xcb\xce\x32\x3a\x39\xa1\x34\xa8\x16\xf2\xb3\x7d\x6f\x2b\x5b\x57\x03\x07\x7e\xb1\x36\xa3\x94\x5d\xff\x37\x7c\x2b\x8d\x48\xa6\x22\x93\xa3\x87\x00\x32\x7e\x98\xa5\x01\xf4\x76\x5f\x60\x50\x04\xbb\xce\x6e\xef\xd6\xb7\xd1\x7d\xfc\x28\xb6\x7e\x86\x02\x2d\xb6\x8a\xb3\x02\x66\x8a\x65\x13\x5c\x86\x27\x45\x78\x39\xbe\x39\x82\xf5\x49\xdd\x17\xae\xb7\x5d\x1c\x9d\x2a\xe7\xd9\xce\x8b\x73\x26\xbc\x81\x7c\x0c\x6e\x59\x6c\x84\x33\x8e\xf4\x87\xf5\xfb\x44\x80\x38\xda\x1a\xf8\x81\x22\x9d\xa7\x54\x8a\xf5\x5f\x40\xac\x4a\x09\xfc\x11\xbc\x49\x6e\xe5\x4e\xe6\x99\xe7\x2c\xbf\x2e\x7e\x27\xf1\x7b\xdf\x2e\x2f\x27\x45\x8b\x76\x07\xb8\xb7\xa6\xab\x3d\x70\xc8\x6f\xc4\x3d\x7b\xd9\xbc\xc1\x66\xd4\x69\x5c\x00\x9f\x1b\xb0\x4a\x32\xfa\x6b\x44\x1a\xc4\xcb\xef\x00\x2a\xb8\x23\x8f\x0e\x6a\xac\x4c\x93\x70\x64\x19\xd7\x29\xaa\x7e\x5f\x6c\xda\x52\x24\x09" \
-"\x74\xb1\xb6\x7b\xfe\xbe\x38\x35\x7d\xef\x42\xf3\x91\x0a\x3d\x66\x39\x6d\xc5\x50\x9f\x61\xfd\x78\x30\xf9\x61\xb1\x02\xb9\x99\x0e\xc9\x79\xa5\x6b\x85\x76\xf8\xdc\x44\xce\x60\x89\x9a\x79\xd7\xd9\xbd\x4a\x4c\xcc\xde\x23\xde\xe3\x53\x34\x4d\xb4\x7a\x7b\xb8\xf9\xd4\xf0\x16\xc8\x88\xc2\xce\x6f\x78\xa2\xfd\xba\x9b\xd5\x95\x27\x61\xfc\x84\x5f\x46\xf1\x2f\x36\x13\x8f\xbc\x95\x94\xee\xa1\xc2\x79\x11\x5d\x6f\x85\xf2\xc9\xd4\xb7\x8a\x98\xb2\x25\xe6\x8c\x6b\x89\x7a\xa3\x4b\x05\x87\xe1\xba\x20\x32\x83\x68\xc5\x10\x57\xa3\xb4\xfb\xaa\x1b\xb5\xf1\x55\xb3\x7e\x74\xdb\xce\x4f\xf2\x05\x65\x29\xa5\x50\xdf\x42\x20\x44\x47\x58\x35\x75\xd8\xd1\xac\x70\xd4\x81\x98\x31\x6d\x3d\xec\x4f\xde\x9c\x0b\xef\x1f\xca\x3d\x7b\xcd\x3a\x80\x07\x5f\x1b\x8b\x87\x5b\x77\xc0\xbb\x0d\x63\xa5\x67\xfe\x8c\xc3\xea\x64\x4f\xe7\x9a\xb0\xe9\x52\xd6\xbf\x3c\xc1\x35\x8f\xd5\xfa\x83\x5b\x28\x91\xe1\xd4\x6a\x4d\xc9\x6a\xb9\x78\x8d\xe1\xc3\x05\x6e\x84\xeb\xbd\x5f\x2a\x5a\x37\xc2\x74\xde\x93\x5b\xac\xaf\xdc\xe8\x17\x5f\xc9\x04\x96\x66\xfa\x17\xc4\x56\x78\x1c\x2a" \
-"\xbc\x30\x2e\x90\x42\x55\x7c\x2a\xbb\x89\xd4\xc4\xe6\xf5\x6f\x93\xcc\xa1\x3f\x23\x64\x16\x90\xe8\xd0\x58\x65\x97\x0a\x1f\xd2\x5a\x01\x04\xca\x87\x78\x66\x51\x79\xbd\xc9\x2c\xde\xd1\x30\xbc\x98\x6c\xfa\x41\xad\x0d\xf0\x01\x7b\x6d\x24\xa3\x89\xac\x45\xfa\xa2\x0a\x4b\x59\x39\x66\x93\x4d\x12\x5d\x04\x68\xd8\xe1\xcf\xe5\x18\x39\xbb\xe4\x63\xda\xcc\x3a\x73\x2c\x78\xd1\x63\xc8\xd6\x9c\xdd\x8b\x11\x83\x9f\xa4\xe9\xa0\x06\x02\x1b\x0f\x3c\xcc\xdb\x12\xbe\xa4\xd2\xcb\xbc\x22\x74\x24\x86\x65\xc1\x4b\x58\xbd\xde\xf5\xae\xcb\x00\xc7\xa1\x39\x16\x04\xdb\x4d\x18\x24\x8d\x46\xd7\xdb\x1f\x5c\x69\x0a\x46\x66\xa9\xf4\xd7\xe6\xa9\x58\xf0\x9d\xbe\x05\x82\xba\xe8\x4c\x75\x2d\xe6\xb5\x73\x43\x23\xac\x0f\xa5\x1e\x7d\xb4\x39\xf5\x19\x61\xf4\xaa\xb6\xb4\x6b\x18\xe7\xc3\x8c\x61\x32\xdc\xdc\xc1\xc4\x90\x31\x20\x5a\x3e\xce\x6d\x55\x23\x87\xdc\xf9\xff\x4e\x67\xcf\x62\x9c\xe4\xd5\xfe\x16\xe7\xf7\xbf\x98\xfa\x25\x08\xac\xcc\x88\xb5\x1e\x4b\x09\xae\xe2\xaf\xac\xee\xed\x6b\x1b\xe6\x2e\xc5\xf0\x8c\xa2\xe1\x41\xa5\xf9\xd1\x31\x98\x13\x66\x60\x60" \
-"\xce\x91\x28\x27\x9b\x44\x08\xe4\xb0\x00\x70\x06\x1b\xa4\x0c\xdc\xb9\x8c\x5f\x47\xca\x7d\xea\x0f\xf6\x34\xce\x05\x67\xc6\x06\x41\x0c\xd1\x57\xdf\x79\xef\x7c\x78\x80\x9c\xc2\xfa\xef\x85\xf7\xe3\x4c\x6b\x49\x26\xe4\xf1\x21\x13\x3d\x8a\x46\x25\x2d\x3a\xef\x0d\xb0\x1b\x11\x29\xca\xe9\x3e\xdf\xaf\x9d\x24\xea\xc0\x17\xb4\x40\x3d\xe7\x67\xad\x53\xa9\xf1\x33\xc9\x51\x43\xd9\x4f\xf6\xcb\xf7\xe9\x75\xfd\x99\xfc\x32\x36\xfb\x78\xfe\xd7\x69\xa8\x2f\x80\x3d\x8b\xf3\x5b\x8e\xa6\xb3\x1a\x61\x41\xab\xa7\xf4\x72\xbc\xc0\x65\x17\x37\x73\xcd\xde\xd1\x3b\x6f\x53\x93\xbc\x1a\xa3\x7b\xf4\xfc\x62\x94\x68\x6e\x51\x1b\xa7\x43\xc8\x55\xfb\x50\xa3\x75\x24\x4e\x89\x5f\x22\x3b\xa3\xac\xa4\x59\xf7\x48\x40\xb5\x29\x56\xff\xb8\x9e\xee\xb9\xe2\x46\x70\x7b\xb3\x03\x49\x01\x6f\x6e\xa1\x31\x1d\x70\x7c\xf4\x6e\xee\xf7\x0e\x0e\x4c\xc7\x9f\xc5\xb3\xfa\xf4\xf7\x55\xac\x38\x62\x46\xe8\x63\xcc\xe2\x4b\x79\x49\xef\xcd\xbf\xd2\x4a\x5c\x04\x00\xea\xc1\xc4\xc2\xad\x44\x2c\x0f\x28\x9b\xa6\xcd\xc5\x34\xcf\xa9\x7b\x8f\x05\xb3\xea\x1f\xca\x56\x38\x18\xe9\x3e" \
-"\x79\xd3\x85\x13\xd1\x58\x20\x9e\x55\x46\x55\xf8\xf9\x30\xe1\x2f\x56\x0d\x80\x06\x8c\x24\x1f\x80\x3a\xd7\xb0\x51\x81\x7d\xac\xe0\xd1\xcf\xf6\xad\xcf\xc1\x16\x61\x3c\xad\xb7\x4d\xfd\x9b\x12\xb2\x24\x71\xba\xd8\x46\x35\x2f\xb0\xb0\x6e\x58\x86\x51\xda\xa4\xe6\x2d\xf1\x1b\x50\x64\x61\x07\xf1\x76\x48\xc8\xa5\xbb\x9b\xbe\x5e\x28\x1e\xcd\x99\x47\x68\x8d\x0f\xdc\x0f\x99\xb1\xc8\x9b\xef\x78\x65\x88\x11\x99\xff\x58\xa3\xb9\xdd\xc7\xd8\x62\x45\x5f\x3b\xaf\xa4\xe9\xfd\x85\xe1\x02\x9c\x79\x5d\xe9\x0b\xac\xa4\xfc\x42\x19\x3b\x8d\xc3\x72\x83\xe0\x32\x8b\xe3\x87\xf0\x04\xab\x0e\xce\x8c\xcf\x37\xd3\x9f\x87\x08\xc1\xef\xe9\xcf\x35\xf4\xee\x54\x13\x49\x01\x5e\x68\x2a\x94\x1a\x03\x65\xc6\x99\xef\xef\x22\xe6\xfd\x6c\x06\x36\x3b\x36\xfc\x31\x56\x43\x5a\xae\xc4\x8c\xef\xb5\x40\x55\x0b\x2c\x09\xe5\xf9\x88\x48\x7d\xc7\xbf\xf2\x9c\x91\x51\x46\xc1\x2c\xb5\x85\x24\xd3\xf2\x1e\x90\xf4\x07\x59\x61\x62\xf4\x3d\xb8\x03\xae\x65\xad\xdd\xef\x91\xa6\xe1\xb6\x52\xca\x4c\x4c\x96\xc6\x5d\x78\x64\xfe\x2f\x15\xa8\x3d\x26\xa5\x30\x1f\x4c\x3b\x25\x59" \
-"\x6a\x57\xcb\xb3\xf8\x9c\xa2\x40\x32\x4c\x05\x7b\x71\x09\xd7\xe2\x17\xcd\x2c\xf5\x75\xb3\xfb\xa0\x6a\xcd\x82\xbb\xfd\x97\xe0\x18\x20\x6b\xd2\xdd\x3e\x09\x85\xc0\x77\x8f\xe8\x45\xcc\x62\x05\x56\x79\x11\xf5\xb4\xf9\xe9\x30\xb9\x38\x3e\x14\xd7\x8c\x06\xdc\x8b\x2c\x2e\xb4\xec\xd7\xfa\x51\xc3\xfe\x65\x87\x28\x87\xeb\x8d\x16\xb7\x01\x1f\x03\x59\xfc\x57\xcf\x3a\x18\xa1\xe1\x1c\xd9\xae\x7a\x47\x2e\x64\x19\x55\xbd\xb1\x2d\xb9\x35\xd2\x6d\xde\xf0\xf4\x52\x4b\xbc\x11\xbf\x2d\xb8\xdc\x84\x69\x4b\x97\x0c\x05\xec\x94\x96\x0a\x16\xc7\x1a\x8f\x8e\x9f\x89\x57\x8e\x46\xf1\x43\x05\x0f\xeb\x57\x14\xe0\xcf\xd2\x26\x3c\xf5\x22\xee\x6c\xc1\xcc\xc2\xb3\x07\x83\x9e\x3f\xf5\xff\x5f\x22\xf7\x3f\x64\x27\x55\x33\xb6\xdc\x45\x7d\x58\xdf\x27\xa0\xb0\x73\x64\xe8\x96\x14\x28\xcd\x84\xe7\xc9\x61\x28\x42\xcf\x35\xc3\x27\x3b\x04\xbf\x8c\xd2\x42\x2e\x68\xc4\x40\x23\x16\x97\xd2\x58\xdc\x6c\x60\x5f\xaf\x61\x46\x19\x5a\x6f\x70\x7b\x6a\xcc\x16\x3b\x6a\xf8\xe8\xb2\x95\x20\x24\x10\xfe\xbf\xca\x5f\xb1\xb1\x74\x5f\xd5\xcd\xaa\xfe\x60\xb8\xe9\xa6\x0a\x9c" \
-"\x5f\xfe\x69\xcd\x37\x9e\x3d\x81\xd7\x62\xe6\x6b\x03\x3f\x9d\x9b\xcf\xf7\x9d\x4f\xfe\x8a\xbd\x5e\xf8\xf4\x98\xa7\x6f\x10\xca\xea\x51\x26\xfd\x01\xb4\xd2\x18\x59\xb8\xfc\x55\x06\x23\xdf\x09\x22\x53\xfe\xe0\x45\x8a\xc7\x25\x5a\x18\x15\x88\x0f\x33\x32\x1e\x36\xd8\xe3\x9c\x75\xf2\x64\x34\xa3\x59\x21\xa4\x62\x11\x59\xb0\x15\x9b\x0f\x92\xd8\x56\x75\xa8\x03\x79\x4b\xfc\x74\x50\xc7\xa2\xd7\x4a\x04\x1f\x76\xba\xce\xf9\x74\xdd\x63\x41\x36\x21\x0d\x4e\xd2\x23\xd2\x35\x7a\xbe\xc6\xdd\xb7\x86\xcc\x4f\x08\x19\xd2\xbc\xfd\x55\xc9\x2e\xfa\x03\xe8\xd0\x25\x0c\xdf\x48\x97\x94\xee\xa8\xcc\xfc\x1f\x01\x1c\x76\xf8\xaa\x95\x49\x3b\x20\xca\x65\x97\x0f\x08\xbd\xa3\xd9\x8d\x96\x74\x41\x81\xa6\x93\x36\x01\x42\xd6\xe4\x4d\x4c\x0c\x69\x01\x52\x81\x7b\x1c\x32\x6a\xef\x73\xbd\x51\xa5\x59\x40\xa2\x48\xad\xa2\x0c\x8f\xa1\x2a\xc3\x34\x31\x4f\x82\xe7\xcf\x7d\x71\x15\x2b\xb8\x78\x61\x4f\xa2\x24\x7d\xcc\xfd\x17\xeb\x16\x57\xfa\x81\x2e\x33\x8c\xb8\x7a\x05\xb0\x5b\x4d\x79\x63\x5e\xf6\xd9\xf7\xb5\x64\xbe\x51\x2b\x47\x61\xd8\x52\x90\x32\xd7\x48\x58" \
-"\x88\xca\xa7\x92\x14\x6c\x6f\x30\x08\x80\x4d\x3b\xb3\xe3\x74\x66\x6a\xaa\x7b\xb7\x96\x0f\x14\xe2\xb1\xf4\xc7\xd2\xe1\x60\x0b\xe8\xe6\x6b\xe6\x5c\x58\x07\xc8\xfa\xa2\x8f\xf5\xd7\xc2\xae\x7e\x1f\x91\xd3\x9e\xd2\x7d\xde\x56\x50\x69\xcf\x60\xc5\xf0\x10\x79\xe5\x10\x2b\x20\x12\x61\x74\xf9\x69\x35\x0a\x6d\xa3\xe2\x5a\x2b\xcd\x1b\xbe\x14\x4b\x05\x77\x61\x51\x64\xec\x1e\x0d\x2a\x1e\x94\xed\xe1\x95\x23\x11\x11\x05\x8e\x23\xfa\xd7\xc5\x9b\x11\x6f\x91\x81\x35\x39\x00\xc8\xf9\x59\xb0\xbd\x01\x74\x24\x0f\x8c\xb6\x5f\xd6\x8f\x74\xeb\x52\xa5\x35\xc0\xb5\xb7\x83\x6a\x05\x8e\x23\x1f\xeb\xb1\x5a\xcb\x79\xa7\xd8\xa5\x21\x2f\xe1\x15\xe3\xde\xeb\x52\x4a\xc3\xc5\xd7\x4f\xcd\x6c\x91\xb9\x58\xe0\xcf\xb9\x2b\x94\xc7\x37\xce\x37\x35\x24\x53\xe4\x0f\x9b\xf0\x34\x8b\x24\xa9\xca\x8c\x0b\x94\xc9\x64\x74\x05\x04\x5d\xd1\xff\x0e\x68\x1b\x1e\x8a\xe0\xb6\x88\x44\x1b\x12\x7f\x3d\xe7\x0d\x4f\xd3\x81\xaa\x53\x85\x79\x2a\xc9\x5b\xa1\x9d\x5d\x5c\xe4\xe6\x55\x2a\x48\xfc\x8e\x55\x31\x31\x5a\xf8\x69\x40\x65\x11\xb7\x68\x47\x42\x58\xe7\xf3\xb9\x7f\x6d" \
-"\x60\x10\x90\x43\x89\x8e\x33\x0f\xb0\xe5\xc3\xf4\x79\xe1\xeb\x01\x2f\x1a\xbb\xc7\x1d\x54\x2a\xd1\xc0\x17\x18\x42\x8b\x69\x3b\x2a\x62\x2a\x3b\x79\x2a\x13\xfc\xd8\x53\xaa\x0f\x99\xe3\xd1\xf2\xc0\x54\x7f\xe1\x07\x6a\x34\x7a\x0b\xc5\x0d\x72\xc4\xc2\x43\xd9\x6a\xc9\x09\x21\xbc\x2c\x50\x9c\x8a\x0d\xea\xbd\x1d\xf0\xbe\xf7\xe7\xc2\x71\x91\xb6\x3f\xb8\x51\xcb\x58\xad\x2b\x94\x7e\x3f\x37\x1e\xb3\xa9\x08\x04\xd3\x07\x49\x30\x98\xa9\x41\x8b\xef\x27\x2a\x42\x43\xd1\x04\x14\x66\xc1\x3a\x16\x9b\xe5\xf8\xe9\x63\xee\x3e\xad\x47\x38\x2b\x99\x81\xfd\xa1\x45\x57\x5e\x32\x35\x01\x12\xa7\xb3\xfd\xe8\x05\xf4\xb4\x49\xca\xce\xc7\xb1\x9c\xa8\x90\x9c\x70\xf7\xbb\x5d\x79\xe9\x95\x10\x50\x91\x43\xaf\x39\xfc\xb9\xda\x38\x0d\x00\xa4\xa0\x54\x13\x44\xa8\x0e\x59\x4d\xe1\x02\x0e\x53\x7c\x38\x37\xa2\xe5\x27\xc4\xf9\x1b\xf0\x5a\x85\xf1\xed\x4f\xa9\xe9\xad\x8f\xff\x24\xf9\xa6\x74\x74\xb1\xd8\x95\xe0\x1a\x40\x2c\xb1\x19\x05\xfd\x0d\x32\x41\xed\x0f\x8a\x2b\x5f\x6c\x14\x81\xb8\x8a\x79\x6e\xf0\x5b\x0c\x66\xbb\xb7\xe8\xc4\xfd\x8c\x5a\xae\xab\x09\x96" \
-"\x9f\x58\x61\x38\xe3\x9e\x5c\xe3\xd1\xe3\x89\xf8\xf8\xb6\xa7\xe5\x6e\xbc\x55\x1e\x4a\x07\x48\x63\x6a\xb2\xb5\x5a\xf8\x65\x3b\xb8\x40\x1a\xbc\x01\x4c\x91\xbf\x76\x4e\xa1\x5a\x9d\x6c\x79\xeb\x9a\x5a\x70\xec\xcc\xe2\x43\xc1\xcc\x88\x54\xe0\x2f\xa5\x00\x2c\x2e\xe2\x90\x71\x92\x85\x49\x49\x65\x3d\x31\xb7\x2d\x88\xd1\x0a\xb9\xcf\x18\xf1\xfd\x86\x71\xf8\xe9\x71\x4b\xa1\xb1\x02\x42\xd8\x3e\xb0\x3b\x04\xa3\x5a\xaf\x60\xee\xf3\xc3\x3e\x20\x3d\xe1\x4b\xb2\x7e\x60\x6d\x7a\xe7\xef\xb4\xc4\xcb\x14\xc1\x00\xcb\x31\x92\x22\x7f\xfa\xc0\xcc\x59\xff\x56\x09\x9b\x78\xa1\xed\x40\x94\x32\x36\x78\x5f\xbe\x79\x5d\x41\x7d\xbf\xca\xbe\x10\x70\xbf\x4d\x1c\x7d\x5a\x54\x80\x07\xda\xfb\xb1\x47\x90\xa2\x3c\x2b\xd9\xff\x31\x35\x65\x83\x2a\xc0\x40\x7b\xbc\x21\xd9\x93\xf8\x3f\x4b\x3d\x45\x95\xf8\x5a\x70\x94\x84\x0f\x72\x72\x42\xeb\xc6\xde\xa6\x6c\x8c\xac\xf8\x0e\xfc\x3f\x9e\x99\x91\x3d\x73\xa0\xc2\x1e\xca\x22\x12\x9e\x8b\x84\xaf\x49\x4d\x24\x0a\x55\x9c\xb4\x2c\x5c\xf5\x43\x7c\x15\x37\x03\xb5\xd0\x10\x4e\x90\x2d\x96\x99\xab\x63\xcb\x78\x66\x90" \
-"\xcd\x95\x10\xa8\xf5\x3c\x43\xab\x69\xa3\x4a\x65\xc5\xf3\x4d\xce\xbb\x4f\x7d\x36\xe8\x32\x63\x3c\xd1\x15\xe0\xcb\xf0\x36\x05\x40\xbe\x71\x34\x2b\x72\x99\x39\x18\xf6\xf9\x43\x05\x74\x6c\xa7\x18\x98\x9d\x91\x91\xb8\x87\x09\x15\x13\x28\xd0\x57\xfe\x30\xf9\xff\xa2\x27\x4b\x77\x14\xbc\xf5\xa6\x17\x86\x45\x40\x07\xf2\xb8\x59\x11\xa6\x24\x9e\x4c\x69\xeb\xd4\x4b\x0e\xb3\xa8\x33\xcc\x2a\x32\xbb\x05\x76\x4c\xad\x3a\x9b\xac\xc3\xa8\x2c\x1c\x81\x09\xbc\x08\x72\x4f\x39\xe9\x96\xaf\x24\xd5\x3b\xb0\xcf\x19\x0a\x94\x50\x03\x74\x0e\x78\xa1\xe9\xfa\x24\xd4\x74\x1a\xcb\x25\x81\x2a\x18\x41\xbe\x9d\x41\xc1\x84\xc3\xb5\x1b\x7d\xa1\xed\x11\x35\xcb\x20\x1d\x86\x78\xda\x78\x54\x8b\x27\x79\xf4\xbe\xa7\xb3\xa5\x71\xa9\xdb\x1f\x89\x56\x0f\x2b\xed\x63\x47\x2b\x97\xa7\xdd\xb6\x70\x9d\x6f\x28\x5b\x85\x11\x57\xde\x53\xdd\x27\xbc\x95\x33\x2d\x87\x68\x1b\x94\xf6\xf8\x1c\xa0\xdb\x7d\xc6\x29\x97\xce\x1a\xa7\xa7\x5e\x29\x69\xfb\x04\x23\xfb\xa6\x01\x6f\x9c\xd1\x7e\x27\x5d\x69\xea\xc5\x40\xb9\xb1\x30\xb6\x99\x63\x22\x1b\x6d\x7e\xc0\xb7\x14\x75\x83" \
-"\xd1\x5d\x25\x47\x60\x57\x04\xb7\x34\x10\x04\x7d\x0c\x35\x09\x4c\x68\x97\xaa\x09\xba\x4a\x98\x8c\xad\xe7\x34\x71\x0b\x73\x06\x4b\x3e\xd0\xc0\x66\x47\x70\xcc\x4a\xce\x14\x52\x05\x99\x10\xc2\xba\xb3\xbe\xaa\xdb\xfb\x6d\x18\x58\xdf\x89\xb9\xbe\xd9\xa8\x50\x65\xd2\x69\xdf\x73\x7c\x47\x5b\xc0\x30\x2a\xce\xdc\x0e\x30\x03\xe8\x63\x33\xf7\x27\x92\x97\x94\xe6\x5c\x71\x7b\xb8\x7c\xa9\x37\x05\xf9\xe2\x9c\x56\x51\xa7\x90\xa4\xa9\x49\xf1\x3d\x38\x14\xf7\x74\xac\x93\xaa\x03\x06\x50\xbd\x03\xdc\x0b\x3e\x38\x81\xb3\x91\xcd\x5b\x2e\x41\x1d\x72\xb8\xd0\x76\xef\x67\x21\xe0\xb1\x6d\x96\x13\x13\x64\x88\xa6\x61\x65\xa8\x09\x07\x1d\x8f\xa9\x5d\xba\x4c\x17\x03\xe3\x5d\xf0\xeb\x5e\xc3\x02\x2e\xbc\x4b\x25\xfc\x3c\x3e\xba\xfa\x8f\x85\x60\x7f\xd0\x7f\x37\xb0\xf7\xe8\x63\xc4\x63\xc5\x6b\xa2\xea\x2f\x6d\x1b\x79\x42\x49\xa0\x01\x34\x1d\x48\x59\xfc\xe7\x41\xec\xfa\xc6\xba\x81\x15\x66\x62\x39\x14\xb8\xdd\xae\x30\x25\x0b\xb9\x7b\xbb\x66\x4e\x5c\x03\x45\xa1\xde\x21\x96\xfa\x75\x55\x76\x6f\x04\x91\xf2\x3e\xff\x1b\x30\x48\x57\xfd\x20\x9d\x82\x44" \
-"\x3f\xe0\xdf\xe3\x1d\xd9\xb1\xad\x3d\xce\x22\x0e\xcd\x46\xa1\xe0\x1c\x83\xc5\xcb\x69\x21\xb2\x83\x90\xba\x93\x77\xa7\xac\x07\x74\x34\xd6\x34\xbf\x10\x14\x8a\xf1\x96\x3c\x11\x1e\x5a\x16\x90\xbb\xe3\xa3\x86\xb0\x42\x79\x0e\x01\xe8\x63\x5d\x39\x19\x71\xb1\xf3\x7e\x2e\x31\x00\x43\xcf\xc6\xff\x26\xa4\x34\xdd\x34\xdc\x5a\xc4\xbf\x49\x21\x88\x63\x4a\xc3\x1f\xe7\xc2\xc7\xb6\x8c\x52\x9d\xbc\x08\x0c\x51\x54\x6b\x02\x02\x23\x59\xa8\x3a\x82\x10\x3c\x58\xa3\xd4\x57\x84\xc2\xc2\x3f\xbb\x62\xf3\x73\x40\xf5\xaf\x09\xda\x00\x20\xd2\xc5\x28\xa6\x2c\x0f\xea\xee\x21\x99\xe0\xfa\x78\x33\x00\xe3\x78\xdb\x2c\x1e\x56\x40\x68\xea\xab\x89\x4e\x7d\xcc\xfd\x3c\x86\xd3\xda\x2f\x0f\x91\x32\xe7\x6c\x8f\x7e\x63\x50\x6d\xf2\xd3\x92\x8e\x53\x16\xea\x96\x30\x7b\xe3\x34\xd0\xd5\x89\x53\xd9\x52\x2b\x9b\xd4\xe6\xa2\x8b\x6b\xf3\xdc\x2d\xfd\xdc\xfa\x61\x67\xef\x36\x0e\x16\x83\x4a\xab\x63\xdb\x62\x28\xd8\xb0\x9e\x52\xfa\x6a\xfe\x02\x63\x31\x38\xa8\x77\xb8\x8c\xb6\x74\xba\x1d\x67\xdf\x14\x09\x5f\x06\x24\x1c\x86\x5a\x08\x39\x41\x9e\x21\xee\x9b\x3d\xd2" \
-"\xec\x7e\x6d\x90\xfc\xde\x2c\x68\x6a\xd4\x8c\xc3\x1f\xde\x8d\x83\x37\x01\xa0\xec\x34\x9b\xaa\xad\x9a\x55\xee\x06\x9a\x5d\xf4\xac\x14\xcf\x03\xf9\x8f\x34\x16\x4d\x64\x0e\xe3\xfe\x23\x42\x1b\x25\xde\x62\x07\x16\x91\xca\xd6\x74\xd6\x21\xde\x8a\x20\x9a\x33\x56\x68\x77\x1c\x6b\x44\x0d\xd9\x9b\xc4\xdf\xcd\xb4\x5e\x16\x95\x9c\xa7\xca\x2d\x7d\x25\x69\xcf\x91\x1a\xa2\x9b\xa7\x07\x9b\x33\xc9\x03\x48\xb6\x9a\xd1\x0e\xc5\xd7\x8c\x72\xba\x79\xac\x5e\x4d\x10\x8e\x00\x67\xb8\x17\x1d\x37\x65\xd3\x3c\xe5\x36\x4e\x79\xf6\x4f\xd4\x60\xef\x34\xb6\x84\x2a\xd6\xd0\x1c\x30\xfc\x4f\x71\x91\x5a\x6e\x2e\x91\xbe\x50\x3f\xa6\xd2\x4d\x22\x6f\x7d\x33\x66\x0a\x03\xc2\xd1\x09\xa0\x0f\x9b\x24\xeb\x8e\xfc\x7d\xae\x2c\xba\x4e\xab\x36\x3e\x0e\xe3\xbf\xc0\xea\x2b\x54\x63\x60\xc9\x01\x0c\x65\x62\xed\x0c\xf9\xba\x94\xdd\x11\xd1\x0b\xb5\x94\xa6\xb1\x2c\xa2\x10\x55\x23\xd6\x55\x72\x64\xf9\x4c\x52\x4a\x46\x1e\x92\x63\xe6\x0f\x9d\x75\x9a\xdb\x83\xa3\xc1\xaf\xd8\x1e\x93\xb0\xe0\x74\x52\x90\xe0\x83\xf9\x32\xf7\xc4\xed\x41\xb2\x66\x69\xfc\x14\x1f\xa6\x11" \
-"\xd9\xcf\x8c\xd8\xfe\x7b\x3b\x4d\x11\x6f\x62\xa8\xd2\xed\x4c\x6e\x6b\x10\x64\x28\x2e\xd0\x51\xc9\xa0\x34\x89\x19\xb4\x88\x25\xd6\xad\xac\x5f\x71\xd2\xc3\x5f\xde\xac\x76\x77\xbd\x62\xfd\x7b\x6b\x12\x62\x6f\xc9\xe0\xc5\x6d\x88\x96\x95\x05\x57\x7c\xbc\x25\xc9\x49\xc6\x1a\x06\x3e\x86\xbc\x88\xce\x7e\x65\x2e\xea\x11\xca\x2f\x87\xdf\x39\x3b\x35\x72\x26\x59\x1f\x01\x4c\x4c\xee\x8f\x0b\xbe\x1e\x4c\xe6\x2e\xa2\x33\x00\xba\xcf\x7e\x6b\xdb\x9c\x12\x68\xf7\x9e\xf4\x91\x14\x54\x1f\x44\x8d\x37\xbe\xdd\x69\x66\x38\x51\x9a\x7d\x47\x7b\x7e\xec\xb3\x51\xe7\xdc\xa7\x77\xce\x73\x6a\x3b\xa6\xa6\x03\x89\x2b\x38\x20\x05\x2d\xd7\x91\xa2\x2f\x94\xea\x72\x12\x03\xa6\xf8\xd1\x75\xc0\x67\x23\x53\x4f\x13\xd4\xe6\x0c\x80\xd6\x8e\x94\xad\xea\xd4\x3e\x4e\x90\x08\x8d\x3f\xfc\xff\xbc\x1b\xbf\x84\x35\xd7\xdc\x13\xbf\x4b\xfd\x91\xe6\x7a\x9c\x73\xfa\x49\xab\xd2\x16\xe9\xf4\x5b\x3a\x2f\x4b\x44\x74\xb6\x62\xb6\x4b\x42\x24\x9f\x40\xcd\xb0\x66\x32\xed\x26\x6b\x94\x3a\x3d\x40\x01\xf9\x44\x4b\xeb\x68\x19\xe4\x93\xe9\x2e\x19\xbe\x76\xc4\x22\x27\x01\x3c" \
-"\xc9\x43\x4d\x40\x09\x2b\x00\x96\x29\x49\x39\xfe\xd3\x60\x5d\x81\xe7\x3f\x0c\xb1\x6a\xee\x46\x49\x57\xfb\x07\xfe\x33\xd4\x22\x22\x89\x7f\xd1\xcf\x46\x3c\x44\x47\x4a\xd0\x77\xd3\x99\x64\xad\x15\xb2\x5f\x71\x06\x67\xf4\xcc\xc8\x8d\x3a\x9c\x0d\x15\x6d\xa9\xd7\xce\xb8\x0a\xf8\xd6\xdb\x02\x16\x6c\x25\xf7\x9d\x66\xa7\xfd\x8e\x8b\xb1\x3e\xf3\x3b\x93\x45\xe7\x96\x7b\xb1\xe7\xe0\x21\x1d\x4b\xb8\x73\x8f\xda\x04\x0a\x7d\x23\x32\xc9\x8f\x2c\xaf\x6c\xce\xf7\x98\x51\xf9\x87\xdd\x17\x84\x50\x68\x18\x06\x0a\xd0\x9b\x61\x2d\x09\x34\x1d\xe8\x98\xb0\x4b\xf2\xf1\x6f\x80\x7f\x90\x60\x9f\xab\x49\xfa\x34\xa3\x2b\x9e\xe8\x59\xe3\x41\xdb\x97\x99\xe3\x3d\x2e\xe8\xb1\xaa\xcb\xed\x09\xfd\xe1\xde\xe0\xc8\x56\x92\xb4\x68\x08\x0f\xbd\xb8\x5e\xb1\x24\x39\xaa\xce\x3e\x2f\x98\x43\x4d\x6a\x0a\x1a\xb4\x2c\x7c\xaf\x05\x51\x60\xd7\x8f\x8e\x98\x3d\x02\x51\xd8\x42\x8e\xd8\x47\x08\xaf\xf5\x33\x90\xba\xa6\x1c\xe6\x40\x9f\x96\x5a\xf9\x41\x97\x0a\x88\x5b\x26\x92\x01\xf3\x17\x8d\xe0\x7d\x6c\x04\xa6\xba\xf1\x37\x0a\xca\xfb\xe6\x60\xfc\xf8\xc5\x30\x1d\xef" \
-"\x81\xcc\xb8\x0f\x0a\x59\x82\xaf\x90\x3b\x9b\x21\xab\x79\x20\x13\xfc\x6d\xdc\xbf\x73\xed\x25\xf3\xe9\x79\x7a\x5a\xfa\x42\x8e\x2c\x23\xcb\xda\x91\xf3\x8c\x1c\xa1\xd5\x99\xe7\x4c\x8a\x4c\xfb\x97\x07\x0b\x40\xc1\x49\xe6\xbf\xc4\x99\x53\x05\x5e\x6b\x68\x01\x41\xcb\x95\x99\xd1\x4c\x52\x3c\x00\x15\x99\x3f\xac\x77\x6a\xdf\x33\xd4\xf4\x90\x19\x19\x7e\xd8\x09\x5d\x2a\x2e\xbc\x86\x9a\xc3\x54\x2e\x7e\x80\x88\x6f\x15\x5a\x67\xdb\xc6\x27\xa1\x35\xff\x97\xd5\x69\x87\x73\xe2\x5e\x1c\x30\xfc\x50\x21\x3c\xd5\xce\xf7\xbf\xaf\xc3\xe3\x76\x36\xb9\xcd\xc3\xf8\x0b\xee\xca\x0d\xec\x26\xb6\x01\x01\x33\x6f\xbe\xea\xf9\x57\xbd\xea\x23\x94\xe2\x48\x83\x4d\xf9\xd6\x30\x24\x74\x3a\xe4\x4d\xa8\xde\xbe\x73\xc1\x9d\xae\xd5\x69\x78\x17\x62\x86\x16\xcd\x96\xc0\xca\x80\x41\x80\x55\xfe\x63\x87\xe3\xaa\x50\x60\xea\xe1\xad\xac\x9c\xb3\xea\x51\xb9\x22\xe3\x9b\x29\xf2\xf4\x8a\x94\x3a\xff\xe8\x3f\x92\xb8\xe9\x9d\x69\xce\xb5\x35\x2a\xa5\x3b\x4d\x47\xce\xdb\xa9\xa8\xf6\x3d\x72\xab\x93\x16\x65\xda\x5c\x5d\x3a\x67\x50\xf0\x98\x50\x89\xb3\xb5\xaf\xcb\xf5" \
-"\x6f\xe7\x04\x29\x9e\x5e\xe0\xbd\xac\x7a\x61\x5c\x5d\x7e\x2f\xe5\xef\x34\xe1\x66\x26\x19\x3d\xc4\x79\xe3\x5e\x1b\x94\x85\x3d\x62\xf7\x07\x52\xbb\x9f\x6a\x4a\x33\xf5\xab\x2a\x45\xbc\xe3\x22\xb2\x88\xd2\x89\x3e\x56\x65\x08\xcc\x6a\x06\xea\x69\x85\x33\x45\x32\xa4\x54\xb6\x49\x5e\x6b\x0a\x86\x13\xa5\x6f\xbf\x91\xee\x00\x08\xbc\x39\x7b\xb9\x84\x09\xa9\x2b\xd7\x5c\x4a\x6c\xb0\xdb\x58\x1a\xe3\xff\xac\xc6\xaf\x28\x6a\x78\xe3\x94\x18\x97\xc3\x79\xb6\x46\xb1\xfb\x69\x1b\xa8\x10\x8e\xcf\xb0\x4a\x2f\xd9\xa1\x8b\x1c\x3c\xe4\xc4\xf6\xe9\xf9\xb8\xd4\x24\xc4\x60\x7d\x4f\xc5\x25\x11\x85\xfb\x59\xe2\xbb\xe8\x26\xee\x9e\xb7\x5c\x60\x23\x03\x1c\xf7\x44\x6f\x67\xae\x6e\x51\xa4\x92\xa5\xc3\xdb\x72\x1b\xcf\x53\xff\xfd\x7e\x58\xf2\xc6\x6f\x66\xda\xf9\x72\x09\x99\xdd\xdf\xb0\xbc\x58\x11\xd0\x2e\xb2\xee\x24\xfd\x6d\xe0\xde\x4f\x9a\x7d\x12\xc8\x65\x74\x39\x01\x81\x61\xc9\x97\x6f\xb7\xde\x8c\x87\x72\x9c\x5f\x54\xb2\xf1\x9f\xb1\x70\x3e\x19\x7d\x73\xe8\x66\xfb\x3e\xcb\x0e\x05\x96\x5c\x63\xf1\xdb\x35\xfa\x45\x30\x41\x8d\xf3\x82\x7c\xe1\x1e" \
-"\xb0\x3b\x11\xaf\x91\xfe\x31\xf1\xeb\x89\xe2\x88\x2a\x00\xfb\xa0\xcd\x9c\xc0\x0a\x09\x55\x37\x0e\x3b\x26\xac\xc0\x18\xdd\x42\x36\xed\xee\x93\x5a\xe4\xbd\x16\x09\xdc\xa4\x64\xda\x4c\xb0\x80\xb8\x88\x98\xfc\x43\xa2\xe3\x77\x85\x05\x0f\x6c\x82\xa5\xd3\x18\x13\x22\x4a\xea\xd1\xce\xcb\x05\xe8\x05\x85\x5c\xfb\x6f\xf2\x51\x39\x64\x0c\x74\x8b\xbd\x71\xa7\x8d\xb5\xae\x2f\x0a\x69\xed\x0a\xaa\xc3\x8c\xf5\xb8\xce\x2c\x07\xaf\xb6\x94\x9f\xd1\xef\x8d\xc0\xc2\x07\xbd\xe1\x5d\x25\xa1\x5a\x51\xa7\x61\x20\xa1\x0c\x93\x6e\x51\x80\x0e\x4e\x92\xfc\x13\xfc\xdd\x39\xc4\xe9\x62\xc0\xa6\x31\xc7\x96\x60\x1e\xf7\xa9\xb7\xfc\xd2\xc9\xe2\x17\x72\xc1\xe5\x7b\xfb\x5d\xbb\xbf\x2c\xc3\xd6\xde\xf3\x09\xb4\xd7\x22\x59\x43\xdc\xa2\xc3\xc8\x43\x7e\xf7\x3b\x8e\x23\x52\xee\x80\x19\x33\x87\x98\xee\x64\x34\x3b\x76\x98\x93\x6f\x85\x8a\x29\xc4\xd2\x18\xf1\x0a\x23\x49\xa3\x5e\x61\xb5\x20\x90\x18\xac\xbf\xcd\x0c\x19\xe6\x6c\x82\x8a\xf8\xa4\x62\x8d\x5c\x63\x38\xb4\xc0\x37\x3f\x46\xad\xa4\x39\x1a\x5f\x87\xf3\xff\x9f\xd3\xa3\x2f\x80\x47\x9b\x62\xbb\x51\x9f" \
-"\xbf\x01\x37\xe1\xf1\x10\xae\xf0\xa8\x7a\x25\x28\x61\xcf\x9d\x9d\xb0\x07\xfc\x51\x85\xd6\x80\x53\xf9\x21\x48\x8f\x04\x57\x08\xc5\xe7\x15\xde\x4a\x8a\x84\x95\x6c\x66\x18\xdd\x9a\x53\xbb\x50\x1f\x07\x3f\x74\xb4\xa9\x54\xca\x12\xbc\x0e\x76\x62\xa6\x4b\xf4\x0a\x01\xdb\x4f\x69\xa3\x00\xf9\xfd\x60\x56\xc9\x27\x61\x53\x53\xae\x30\xf9\x49\x27\xbf\xd0\xa8\x22\x43\x97\xfe\x10\x12\x87\x5c\x9d\xe0\xe1\x29\xfe\x2d\xcb\x29\xc5\xd8\x8d\x0f\xd2\x21\xdb\x43\xbd\xdc\x45\x32\x13\x4f\x2b\x4b\x7a\x01\x5d\x2c\x41\xc5\x0f\x1d\xea\x27\xaf\xe9\x88\x05\x41\x7b\x74\x6d\x88\x3f\x5c\x3b\x1f\x9e\x01\x28\xdb\x9e\x5e\x27\xec\xcf\xc6\x7c\xf7\xd1\x96\xa8\x92\x1b\xa4\x50\x6d\xfb\xdc\x65\x96\x1d\x8e\x2c\xc7\x47\xe8\x1b\x24\x76\x45\xe6\x54\x1a\xac\xfc\xe3\x2e\x13\x23\xa8\xef\x05\x0f\xdc\x80\x5f\xd4\x6a\xcd\xf2\x38\x80\x09\x14\x1c\x18\x21\x0b\xb1\xf4\x6e\xed\x83\xe9\xb7\xdf\x79\x73\x5a\xe1\xdf\xa0\x53\x42\x88\x46\x3a\x99\x0d\x68\x88\xcf\x27\xea\x81\x8c\xf7\xdb\xb0\x48\x78\xd3\xb9\x85\x76\x83\xd4\x3b\xba\xb2\xc7\xe4\x36\xe7\x61\xbb\xe0\x61\xed\xce" \
-"\xd7\x09\x16\x0c\x0c\x93\x15\x26\xa5\x4e\x95\xf5\x91\x76\x67\xf5\x81\x78\x05\x8e\x31\x00\xd3\xe0\xef\x4d\x72\x30\xac\x9e\xab\x13\xe0\xc9\x52\xda\x4e\xa8\x5b\x86\x0f\x28\xbb\x72\x2a\x1a\x08\x8e\xd3\x3d\xe9\x08\x9b\xb1\x93\x95\xe8\xa0\x01\xb1\x87\xf5\x90\x45\x16\x9d\x9c\xc8\x6d\x85\xc9\x9d\xd4\xfe\x86\xd5\xbf\xff\x65\xff\x14\xeb\x69\x3e\xdd\xd2\x9f\x40\xf6\x88\xb5\x3c\x29\x95\x81\xe0\x2e\x4f\xad\x88\x69\x7d\xc0\xf4\x10\xec\xac\xc2\xf7\x88\xa0\xbf\xdb\x18\x65\x97\xcc\xbd\xfe\x45\xa0\x4f\x54\x95\x2b\x6c\x5a\x41\x10\x4b\x31\xb6\x1d\xd3\xbc\x87\x91\x83\x6c\x8f\x61\x5f\x26\x26\xf4\x75\x5c\x9d\x5b\x26\x76\x76\x86\x6c\x7b\x53\xd7\xef\xe4\xba\x2d\x70\xca\xa6\x7f\xc7\x50\xb7\xfb\x70\x71\xed\x31\x94\x5c\x1f\x36\xf2\xd0\x0c\x2f\x65\x4a\x4f\x13\x4e\x7a\x3c\x7d\x55\x85\x03\x34\x7b\xec\x3c\x3e\xb2\x65\x6f\x5b\x59\xe4\x3f\x3e\x74\x35\x94\x47\x2e\x99\x85\xf4\x3b\x57\x75\xab\x43\xb6\x77\x03\xcc\xd7\xcd\x80\xf8\x0b\x3b\x22\x0f\x73\xf9\xb1\xf0\xc6\x3a\x34\x17\x65\x84\x76\x27\xb5\xc7\x31\x27\x62\xc4\x17\xb3\xc7\x3e\x41\xa5\xf6\xda" \
-"\xa1\x96\xa3\xfd\x5e\x7c\xd7\x0a\xf5\x47\x87\xa8\x3b\xfb\xe5\x9d\x27\x4b\xb3\xd3\x53\x21\xac\x51\x02\x1e\xde\xae\x42\x50\x0b\xc4\xbb\x7b\xff\x7f\xbb\xd0\xec\x6a\x58\x36\x5d\xfd\x25\x21\x9b\x52\x1a\x9c\x39\x57\x94\x82\x2c\x54\xcf\xab\xc8\x83\x52\x1c\x3d\x7a\x9b\x72\xa0\xfd\x1d\xb1\x32\xa8\x64\x49\x12\x84\x5c\x88\x43\x18\x9c\x95\xa4\x78\x6d\x82\xaa\x9c\xa4\xf8\x68\x53\x98\xe7\xd3\x64\x4e\x3b\xaa\x93\x65\x56\xfe\x7f\x8f\x7c\xb2\xe8\x23\x23\xf3\x03\xdc\xc6\xb6\x92\x47\xfa\x32\x3d\x98\xfd\x65\xdb\xdb\x9f\x3a\x22\xef\x6f\x90\x1d\x08\x63\x18\xd4\x7b\xb0\xab\x00\x84\xfd\x23\x8c\xa6\x9d\x44\xd7\xd9\x69\x4e\xe0\x12\x76\xd8\x4f\xe3\x65\x3b\x99\x1b\xd9\xf3\xfa\xc1\xd5\x64\xb8\x45\x4e\xe5\x07\x90\x6b\x05\xd6\xdf\x8b\x7b\x2c\x8c\xa5\x83\xd7\x41\x4d\xb5\x8f\x65\xda\xc6\x57\x2f\xbf\x0a\x66\xe7\x00\xef\x17\x80\x53\x0b\xda\x3e\x68\xb9\x49\xd3\xd8\x28\x46\xe7\x5c\xbb\xac\xff\x42\x9f\x5d\x9c\x23\xac\x7b\x02\xe6\x7b\xec\xf1\x9a\x58\x88\xb3\x93\xae\x59\x32\x05\x9e\xa9\x80\x7f\xd7\xe7\x52\x53\x9f\x42\xf1\xcd\x67\x8f\x14\xf8\xef\x8f" \
-"\x1f\xd2\xf9\x27\x19\x08\x08\xf2\x6f\x6f\xbc\x23\xbe\xfb\x11\x72\xa4\x31\x18\x71\x9f\x32\x73\x38\xbe\xb4\x5b\x7d\xed\x63\x74\xd3\x24\xd0\x73\x0c\x49\x3d\x63\x6e\x51\x40\x53\xa3\x83\x9a\xd3\x09\xa5\x0b\x1e\xb1\xb1\x2b\xf1\x07\x6c\xcb\xe0\x4b\x19\xf6\xa0\x21\x94\x20\x83\xb7\xbe\x00\xdb\x1c\xd0\xf2\x86\xae\x5b\x5c\x33\x24\xf0\x2b\x8b\x93\x65\xb7\x33\xd8\xf9\x2a\xa6\x34\x85\x73\xf9\x06\xf0\x17\x1b\x17\x4d\xb4\x28\xaf\xf0\xad\x68\x46\x89\x53\x52\xab\x9b\xd7\x88\x83\x04\xac\x13\x64\xff\x92\xa0\xc7\x80\xb1\x82\xa3\x38\x68\x6b\x66\x2c\xb2\xc4\xbb\x00\x26\x35\xe6\xbf\x94\xda\xcf\x69\x42\x6a\x67\x34\xf1\x77\xe9\x3f\x3f\xb6\x2d\x65\x3d\xd2\x59\xaf\x65\x62\x59\xac\xfc\xec\x24\x36\x8f\x83\x37\x23\xbd\x80\x39\x49\x22\xe5\xfa\xce\xfd\x2b\x25\x35\x88\xac\x49\xdd\x1b\xcd\xcf\x15\x78\x5c\x06\xdc\xa6\x42\x5f\x2d\xf1\xd1\x70\x48\x16\x1f\xdd\xe8\xdc\x9d\xf8\x4e\x69\xd6\xe6\x29\xc1\xd3\x2e\xf9\x1a\x0b\xf2\x2a\xe1\x74\xcf\xa6\x8d\x74\xb9\xdf\x56\xda\xbe\xff\xb9\xfa\xc7\xb5\x38\xbc\x84\x25\x1b\x55\xf8\x70\xa1\xb6\xa4\x99\x81\x28\x25" \
-"\x0d\x08\x43\xec\x24\xb6\x97\x82\x60\x83\x41\x1a\x67\xef\x41\xf3\xea\xa2\x07\x5a\xed\x18\x63\x91\x2f\xb5\x63\x41\x26\x24\x70\x9d\xef\xe1\x7f\xa1\xa8\x06\x42\xe7\xfc\x8e\x9a\xe1\x8a\xbd\xf3\x42\x8e\x47\x3d\xef\x37\xe6\x3b\x28\xe0\x86\x68\x64\xbd\xa6\xf9\x42\x5b\x92\x9a\x1c\x43\x4e\x8a\x28\x72\x47\xac\x03\xa8\xe9\x09\x6a\xe4\x8f\x38\xc1\xe3\xf3\x90\x33\xde\x5e\xe0\x2b\x4f\x95\xd4\xf5\x34\x44\xc8\x11\xeb\x2d\xa4\x93\x3e\x76\x34\xd8\xc3\x4e\x0d\x42\xbe\xbc\xf1\x8e\xea\xb6\x55\x30\x94\xd6\x7b\x39\xdf\xbc\xe5\x77\xa9\xb4\xc1\x46\xfa\xd7\xf9\x1d\x58\x7b\x58\xe2\xd2\xab\xaa\x20\x50\x55\x03\x1a\xdb\x6d\x61\x86\x0b\x60\x76\x47\x82\x56\xb6\x4d\x74\x89\xd6\x1c\x8c\xf2\xe3\xb2\xa7\xc8\xd6\xaf\x6b\x60\x84\x21\x28\x40\x5d\xce\x5a\x81\x84\xdd\xaa\xf2\x71\xeb\xfb\xac\xc1\x23\x3a\x55\x46\x09\x4b\x68\x47\xa1\x63\xd6\x06\x21\xcc\xfa\xac\xc7\x21\xb7\xf6\xfa\x6d\xfb\x32\x6a\x72\x10\x86\x96\x13\xdb\x15\x3c\x3f\xfb\xcc\x9d\x2d\x6a\xe9\x85\x9a\x91\x87\xc9\x4d\x3b\xb2\xb0\xd9\x6d\xec\x13\x13\xc8\x05\xa5\xeb\x51\x0e\x2a\x99\x28\xbd\x56" \
-"\x5c\x5a\xef\x4d\x35\x88\x41\x70\x5e\x82\x68\x47\x37\x4f\x16\xfa\x22\xb2\x0e\x5b\x18\x91\xfa\x04\xc5\x60\x48\x76\x8e\x1f\x53\x89\x0e\x39\x73\x24\xca\x90\x0a\x13\x7b\xb0\x17\x5d\x23\x5a\x91\x49\xa3\x7c\x42\x9c\x08\x52\xf3\x16\xcc\x3b\x4d\x31\xde\x01\xf6\x07\x4b\x0f\xea\x6e\x09\xe8\x1d\x9c\xef\xfa\x58\x18\xf4\x7b\x0f\xa9\x42\xb4\xfe\xd2\xe9\x86\x1b\x64\xa2\x67\x9e\xdf\x95\xe2\xa7\x8c\x35\x22\x39\x69\xdd\x70\x74\x48\xcf\xa9\x62\xc8\xbd\x21\x48\xb5\xa2\xa6\x04\x1d\x62\x9d\xb8\xf4\xbc\x7f\xba\x23\xba\xca\x18\x15\xb9\xa0\x3f\x11\x70\x4e\x60\x31\x57\x3c\x9a\xd7\x31\xc4\xb3\x7a\x3c\xfd\x9a\x56\xb1\xe3\x46\x01\x50\xcd\x3a\x42\x67\x92\xaa\x6c\x22\x86\x95\x86\xa0\xe1\x98\x3f\x12\xc7\x65\x9e\xc7\xeb\x7c\x62\x69\x08\x3e\x64\x5c\xf8\x51\x3b\x6c\xbe\x9c\xd8\x6a\x67\x5a\x45\xc7\xa0\x15\x42\xcb\x7d\x9d\xbd\x08\x73\x0f\x9e\x4d\x69\x7c\xab\xb4\xe3\x86\x32\xd0\xf5\xfe\x23\xe7\xd7\xe7\xc1\xda\xd8\x44\xcc\xe5\xe9\x5f\x78\xb1\x69\x6c\x5c\x09\xb5\x77\xc4\x13\x61\x05\x91\xfe\x70\x9c\x46\x09\x44\x27\x54\x21\x50\x02\x15\xe4\xb8\x91\xda" \
-"\x13\xca\xe7\x90\x03\x1d\x16\x0e\x92\xc1\x5a\xd8\x3f\x5f\xc5\x46\xc6\x44\xeb\x84\x10\x1f\x64\xb3\x13\x69\x13\xb2\xd2\xde\x76\x94\x25\xca\x32\xde\x54\xf6\x59\x24\x19\xb7\x50\xaf\x4f\x9a\x26\x77\x59\x7d\x85\x38\x15\x3d\xbb\x7b\x50\xe0\xbb\x0f\x54\x2e\x13\x01\x18\xf6\xfa\x20\xe2\xc1\x31\x76\xfc\x01\x2f\xac\xa1\xaf\x3c\x71\x38\xf8\xc6\x64\x75\x4e\x8a\x9a\x28\xe7\x76\x78\x17\xdf\x08\xef\x91\x33\x2b\x52\x92\x53\x81\x2b\x92\x4b\xab\x14\xba\x9d\xae\x89\xcd\xbb\xc6\x25\x0a\x6c\x41\x9a\xd4\xcf\x3f\xb2\x0b\x33\x05\x3e\xac\x7a\xdb\x93\x10\xdf\xf3\x86\x92\xa1\xad\x76\x71\xb9\xd4\xc7\x1d\x53\x05\xf1\x2a\x36\xa0\x39\x64\x74\x6f\xda\xc1\x27\x42\x43\x8d\xa1\xb3\x8d\x36\x57\x10\x2b\x0f\x5d\x29\xf0\x3e\x42\xe7\x3b\x2a\x30\x2e\xcf\x8d\x1b\xa0\x9c\xf7\x8a\x81\x82\x44\x22\x42\x45\xb1\x2d\x6c\x1a\x24\x32\x6d\x2e\xee\x52\xbb\xdb\xa6\xe1\x73\xcc\x79\xe4\x7a\x5c\x41\x43\x45\xa2\x68\x0a\x75\x11\x21\x71\x6e\x0a\x09\x02\x29\x18\xe3\xad\x31\x0a\x02\x93\x73\xc5\x5d\x85\x8b\x56\x26\x8a\x66\x5c\x11\x5e\x73\x4a\x65\x05\x0c\xde\xba\xe5\x10\x7e" \
-"\x10\xea\x69\xbf\xb8\xb6\x1b\x3b\x98\x76\xb3\x72\x4e\x41\x0f\x15\x2b\xd7\x07\xd7\x6e\xcf\x98\x80\x0e\x6a\xbc\x49\xe6\xb7\x17\x65\x5c\x5f\xfa\x73\xf5\x28\x3a\xa7\x9d\xc9\x01\xe5\xe9\x27\xf3\x67\xfd\x68\x87\xf8\xdb\x4a\x7f\x5b\x87\xe0\xf0\x2a\x06\x46\x46\x30\x17\x34\x4e\x0c\xd4\xcb\x37\x86\x6c\x6b\xb9\xed\x81\x78\xea\x36\xf3\xfc\xe7\x13\xbe\xbe\x2e\x30\x73\xc8\x91\x77\xc3\x8c\x7a\x15\x55\x78\xbd\x21\xd0\x3b\x27\xb5\x39\x37\x80\x90\x95\x78\x41\x4d\x71\x4b\xcb\xc2\xfb\xd9\x4d\x6e\x38\x36\x5d\xf0\x65\xdb\x34\xae\xa3\x99\xc1\x18\x10\x70\x67\xb2\xfc\x39\x02\x07\x37\xb8\x50\xb0\xf8\x80\xec\x49\xfa\x42\xda\x3f\x10\xe6\x95\x20\x95\xed\xc7\xa8\x51\x93\x3f\xd3\xfb\x70\xdf\x3e\x5c\x3c\x72\x9c\xcb\x0c\xe1\xe8\xfa\xa6\x7b\xc2\xe3\x38\x52\x04\x68\xa8\xaa\x26\x5d\x7a\xe8\xcf\xe4\x44\x3a\xf7\xa2\x60\x80\x14\xf9\x72\x5d\x25\xc7\xe5\x98\x86\xa8\x0e\xd4\x99\x89\x1f\xf1\xbd\xa3\xdf\xf7\xc4\x16\x43\x1b\x69\x0a\xeb\x1c\x18\xb1\xf9\xe6\x13\xf7\x91\xe4\x97\xc3\x11\xc9\x5d\xe2\xa7\x4c\xe3\x55\xcf\xc8\x8b\x25\x94\x28\xf3\xd6\x3c\x37\xf1" \
-"\xb7\x7e\xa0\x61\x06\x81\x68\xb6\xcf\xfa\x4d\x7b\xeb\xd3\x9e\xab\x34\xab\xba\x35\x79\x18\x89\x69\xa4\xf7\xac\x84\xc9\x1f\x87\x7b\x00\xa4\xa4\xeb\xa7\x67\x3f\x28\x36\x66\x2e\xc5\xb9\xc2\x0e\xc3\x9f\xb6\x78\x04\x24\x0e\xc2\xdb\x9b\x17\xe9\x94\xa9\x71\x9e\x5c\x67\x44\xf7\x85\xd6\xfc\x09\xdc\x32\xc6\xfb\x4b\x22\x0a\x73\xd1\xac\x93\xa8\xb9\x51\x46\xae\x9b\x50\x6f\xf6\x4e\xc7\x9b\xc0\x02\xf1\xa2\x7b\x7b\x4d\xe4\x65\x16\xf1\x59\xf5\x3f\x03\xeb\x4c\xa2\x14\x0c\x51\xe4\xfe\x32\x92\x4c\x95\x70\xe2\x58\xe7\xa7\xe5\x1b\xfa\x15\x62\x54\xeb\xfb\xd5\xee\xd1\x6f\x22\x90\xb5\xbe\x16\x3c\x70\xf4\x62\xf1\x13\x33\xa3\x04\xc6\x08\x32\xc2\xc8\xf1\x9b\xc0\x61\x5f\xad\x31\x5e\xa9\x70\x15\x57\x17\xe5\xe2\x4b\x3c\x86\x7e\x15\x0a\x56\x54\xee\x71\x13\x4d\xcd\x03\x9e\x69\xf1\x62\x56\xed\xe9\xbe\x61\x88\xca\xea\x93\x79\xfd\x9c\xb0\xee\xde\x47\x23\xb9\x7f\xd4\xd3\x00\x56\x81\x83\x5d\x6f\xa7\x79\x8a\x45\xfb\x04\x5a\xe5\x2b\x30\x90\x8a\x00\x30\xf9\xca\xcb\x2e\x75\xaf\x1b\x60\xe6\x77\x5d\x9c\x81\xba\x7a\x85\x72\xa0\xc4\x32\x51\x61\x3f\x0d\xbc" \
-"\x92\x3f\x04\xdc\xde\xa5\x09\xec\x7c\x75\x91\x5b\xf4\xba\xe9\x23\x4e\xf1\x2d\x26\x7f\xb3\xa5\x14\xfd\x83\xab\x29\xe6\x9e\xa2\x53\x32\x13\x17\x53\x80\x79\x43\xf8\x11\x91\x62\x70\xbe\xfa\xed\xf3\xf8\x40\x92\x29\x10\x2c\x9a\x21\x3c\xa2\xa1\x9c\xe5\xb0\xac\x31\x2a\xf0\xeb\x55\x5a\xa2\x97\xaa\xb7\x1b\x15\xb7\x28\x86\xbb\xc1\x4b\xb7\x4c\x3f\xeb\x1b\x5a\x85\x1a\x8a\x53\x96\x4d\xce\xe9\xa6\xcc\x5a\x7d\xd3\x85\xe5\x0a\xa6\x0c\x92\xb8\x98\x6b\xf2\xf5\x34\x91\x9a\x22\xf9\x0d\x66\xfd\xd1\x14\x03\xe1\x58\x9c\x89\x1e\xb6\xce\xd3\xff\x95\x27\x40\x85\x10\x7d\x05\x73\xdc\x33\x7a\xf2\x79\xde\xd4\xef\xed\xd0\x1f\x48\x62\x24\x83\xb9\x09\x7c\x0e\x37\xec\xc4\x26\x44\x52\x11\xc5\xff\xa8\xc7\x9e\x5e\x34\x3a\x7e\x64\x39\x76\xb8\xd6\x2a\x41\xf9\x9c\x80\x52\x8b\xea\x3f\x77\x37\x59\x6c\xcf\xd1\xe2\x22\xc6\x86\x36\x83\x9a\x57\x60\x1f\x0b\xf1\x01\x0b\x61\x3d\xa7\x14\xdf\xbc\xa3\x1f\xfa\xbd\x0d\x1d\xc4\xd1\xda\x77\x66\x0d\xac\x95\x95\xdb\xfb\x40\xee\xd3\xd4\x88\x52\xed\x96\x8c\xbc\xc9\x7b\xbf\x53\x85\xc1\xfd\x19\x1b\xf6\x48\x3c\xd4\xe3\xf1" \
-"\xd1\xce\x8e\x1d\x0b\x0b\x92\xb6\xcb\xd6\x19\xc0\xec\xc5\xb0\x06\xd8\x69\x91\xbf\x73\xa1\x6b\xaa\xc2\x79\x94\xcd\x41\x74\x9d\x60\xad\xd9\x1e\x60\xae\xef\xb2\x97\x79\x2e\x03\x56\x41\x20\x78\xc3\x42\x56\x90\xce\x5b\x24\x94\x2a\xd8\xd0\xa4\xcb\x95\x45\xe6\x31\x4e\xe0\xb1\x17\xaf\x67\xbf\x6f\xb5\x82\xff\xd7\xbd\xad\x86\xbd\x40\x24\xe2\x86\x59\x74\x8a\x5c\x51\xf6\xca\x0a\xf3\x15\x51\xa5\xd2\xeb\x31\x63\xd9\x13\xb8\x36\x47\x66\x84\x31\x87\xe4\x9c\x43\xaa\x26\xad\xc8\xef\xf4\xff\x41\xd3\x64\xa1\x76\x6f\xda\xdb\x57\x17\x39\x09\xf6\x66\xfc\x9d\xcd\x62\x0c\x61\xc6\xb7\x8d\xdf\x9a\x17\xb4\x7b\x50\x9c\x90\xe7\x5f\x2a\x87\x1f\xf4\xa4\x79\x8a\x74\x9a\xcf\xde\x8a\x20\x54\xb9\x38\x72\x09\xf4\x0b\xd5\xed\xa6\x5b\x1f\xd9\x14\xb3\xa8\x79\x8b\xed\xb5\xdd\x5a\xae\x02\xb0\x22\xd2\x82\xf1\x82\xf0\xb2\x59\xb0\x82\xb9\xf3\x34\x65\x74\x70\x06\x3c\x54\x06\x6e\x1d\xf6\x42\x0a\xa4\x82\x2e\x4b\xa3\xb3\x2d\xfa\x20\x39\x30\x4a\xa9\x85\x2c\xa7\xf1\x67\x1f\x77\xf3\x4a\xd0\x04\xa2\x11\x0b\x48\x7e\x0a\x51\x75\xbc\x67\xde\xa3\x4e\xce\x48\xd8\x49" \
-"\x02\xdd\xe6\x7a\x6b\x8d\x7e\x01\xec\x3f\x33\xa9\xa0\x0e\xa5\xd0\xae\x09\x5b\x4a\xfc\x92\xc6\x4f\xee\xaf\x27\x66\x4b\x96\x28\x6d\x8f\x75\x4d\x99\xea\x52\x26\xa2\x17\xf2\x6b\x7c\xd9\x0d\x33\x37\x5c\x01\x1c\x8a\x3e\xd1\x45\xde\x3f\x3e\x96\xdd\x4a\xe8\xdc\xb5\x15\x24\xcb\xb6\xc1\xb7\xad\x71\x9d\xf1\xd0\x83\xac\x00\xb0\x37\xe5\x3f\x36\x54\xc5\x69\xc4\x9a\x3c\x34\x32\xbf\xe6\xca\x81\x55\xeb\x4b\xf5\xac\x3a\xe6\x00\xfb\xfa\x68\x7b\xf7\xe0\x78\x76\x1e\x32\xdf\x90\xe9\xf3\xd5\x3a\xe4\x7c\x18\xa8\xc2\x18\xc0\x04\x3f\x6b\x27\x37\xca\xc4\xfe\x95\x8d\xbd\x88\xda\x6c\xcb\x64\xc6\x79\xf0\xfc\xd0\xc8\xe6\xb2\x75\xc7\x02\x37\xa5\xd6\xd2\xf6\x8e\xb2\x3f\x56\xf9\x9c\x64\xac\xca\xc5\x94\xde\x4c\xb9\xdd\xf8\x47\x07\xe7\xe0\x9e\xec\x1b\x2c\x35\x3a\xb5\x41\xb0\x92\xdf\xfe\x05\xf9\xcf\xda\xa0\xd4\xf5\x0e\x72\xf6\x99\x8b\x37\xe6\x59\x8f\x7d\x85\x67\xf9\x7b\x5b\xe5\xc3\xd6\x41\xfb\xdb\x0b\x30\xa7\x48\x09\x83\x6e\xcf\xf4\xc5\x9f\x17\x33\xa1\x87\xfb\xdc\x34\xf2\x7a\xc7\x15\xe7\x22\xb9\x54\x8c\x70\x03\xa4\xe7\x40\xa2\xc0\x67\xb6\xa2\x70" \
-"\x02\x8e\x16\x94\x3e\x47\x4f\xe8\x55\x26\x0f\x57\xe6\xe8\x70\xcb\x5e\xe6\xac\xe9\xdb\x9e\xf6\x57\x3d\x9b\x16\x0e\x9d\x17\x3d\x63\xc4\x61\x46\xd8\xad\xec\xd3\x78\xc5\x1c\xe7\x2f\xd7\x42\x47\x2e\x42\x1c\x1d\xdf\x4d\xad\x90\x52\xdc\xde\x63\xe5\x4a\x35\x58\x74\x7b\xa2\xf0\xa8\xd8\x8e\xcd\x90\xb7\x7f\x87\x04\xa2\x5b\xb0\x4e\x1a\xb2\xf9\x68\xc3\x4c\x69\xce\x8f\x14\x9e\xdc\x16\x43\xc9\xed\x4e\xf1\x38\x6f\x3f\xa0\xf0\xa8\x83\xfd\x3e\x08\x33\x58\x2b\xae\xd9\xeb\xf3\x47\x32\xd2\x07\xeb\x38\x3f\x80\x6f\x20\xf4\xbb\xd9\xaa\x4d\x98\x41\x07\xc8\x1e\x2f\x53\x7e\x8b\xaa\x8e\xdb\xb8\x9c\x36\x66\xf9\x5e\x20\x02\xcc\xce\x4d\xe6\x3c\xb8\x8f\xa7\x6e\xf1\xcb\x3c\x2c\xae\x80\x96\xba\xd7\xda\xbd\x57\x6b\xd8\x54\x4c\xa6\xab\x5b\x17\x10\xd0\xd3\xb5\xea\x3d\xcb\xe0\xac\x80\x81\x42\x07\xf9\x00\x4b\x9d\xeb\x31\xf4\x9a\x9d\x6b\xcd\x46\x92\x26\xbc\x06\xda\x85\xe7\xcc\xa8\xea\x85\x11\xf5\x55\xfd\xa3\xf2\xa8\x38\x09\x63\x8e\xec\xed\x43\x14\xe2\x3c\x04\x56\x53\xd0\xf3\x13\x7f\xa8\x06\x9c\x43\xb3\x42\xaa\xf2\xd3\xaa\xc7\xbc\x47\xe7\xbf\x43\x2a" \
-"\x6d\x25\x75\x9a\xe7\x74\x3f\xe8\xce\x6b\x8d\x11\x7f\x8f\x4f\xf7\xa0\x3e\x97\xea\x74\x7e\x0e\xdf\x08\x05\x34\x52\x08\x63\x11\x09\x07\x04\xd0\x6a\x0b\xd0\x9c\x9d\x55\x33\xec\x80\x29\x42\x63\xf3\xdc\x99\x83\x6f\x4e\xbd\x5f\xdb\x33\x64\x29\x96\xbc\xda\x23\x25\xb0\x1f\x7a\xfc\xcf\xde\xd6\x8e\x5f\x13\x88\x9f\xc3\xd1\x27\xb6\x13\x61\xb9\x48\x53\xa5\xd0\xf9\x53\x04\xf4\xe6\x1e\x07\x0d\xa1\x5a\xc8\x79\x8a\x43\x97\xfc\xc5\xa5\x2c\xd7\x09\x51\x76\xb3\x9f\x0f\x03\x9c\x69\x97\x68\x6d\xa1\xca\x8f\xc7\x29\xbb\xac\x9a\x40\x69\x45\x43\xad\xe2\x22\xea\x6f\x45\xf4\x2d\xe6\x31\x0b\x12\x9e\x38\xb8\x37\x7c\x2e\xfc\xd7\x6d\xec\x7c\x9c\xac\x94\x9f\x2c\x93\x81\x32\x31\xe6\x80\xd5\x89\xa1\x7d\x8c\xde\x24\x5a\x75\xdf\x92\xed\x7a\x27\x76\xbc\x5d\x0b\x28\x31\x72\xe6\x50\x1f\xdd\x3a\xc7\xae\xc0\x70\x1f\xec\x62\x38\x4c\x1b\xc7\x4e\x1c\x30\x3e\xf6\xcf\x1e\x55\x32\x1f\x04\x8f\x3a\xf1\x83\x53\xcb\x46\xf1\x7c\x96\xa0\x58\x1e\xe3\xb1\xd5\x4b\x8b\x7a\x53\x53\x29\x61\x8c\x4e\x9d\xbc\xac\x55\x34\xca\x4c\x2f\x91\x4c\x7e\x90\xe4\x31\xef\x67\xc4\x95" \
-"\xcb\x85\x9f\xc9\xd7\xf1\x47\xf5\x72\x31\x7d\xe4\x16\xc0\xeb\xe6\xf6\xf7\x64\x6e\x4c\x4a\xd6\xe2\xdd\x78\x8c\xfa\x6c\x09\xcb\x28\x5c\x13\xb8\x88\x56\x4c\xfa\xb1\x40\x4c\xd6\x4f\xbe\x56\x08\x83\xb2\x00\xc8\xab\xf5\x90\x5e\x02\xec\x0b\xbb\x77\xa5\x53\x82\xfc\x31\x7e\xfe\x83\x26\x2b\xf5\xaa\x35\x07\xb7\xcd\x54\x47\x10\x7f\x56\xf9\x1f\xa9\x41\x21\xcf\x92\x6f\x9b\x2b\x91\x55\xfa\xd8\x26\x5f\x12\x81\xba\x0e\x03\x9e\x2b\xb7\x2c\xcd\x5a\x25\x8d\x1b\x82\x73\x04\x79\x43\x71\x2b\x6d\xfb\x47\x67\x20\x81\xa3\x49\x74\xfc\x20\x95\x11\x96\x75\xa8\xda\x38\xa3\xad\x7d\x54\x67\x88\xc3\x59\x2e\x1b\x2d\x99\x06\xb8\x51\x5d\x83\x1c\x2a\xab\x57\xb1\x87\x6d\x18\x4e\x50\x67\x6e\xa8\x03\xfb\xa5\x8b\xab\x19\x4d\xa6\xfa\xc1\xa6\xa8\xc3\xa0\x0c\x19\x6e\x24\x00\x84\xf7\xc7\xc3\x1e\xb1\x0e\xb0\xc5\x3a\x8e\x5d\x2b\x97\x7e\x1c\xb8\xe7\xb3\x71\xe3\x1a\xa5\x62\xb4\xb7\xda\xb6\x96\x7d\xe7\x66\xe7\xce\x27\x39\x79\xc1\x2b\x0b\xfe\xad\x1d\xfb\x2d\xab\x6a\x57\x72\x26\x3a\x99\x48\x54\xc1\x24\x02\x8e\xd7\x79\x93\xa0\x0b\x25\xf3\xd5\xd9\xb5\x98\x70\xbf" \
-"\x9b\xd9\x88\x75\xaf\xb6\x7d\x86\xda\x3a\xd4\xef\x27\xfa\x77\xdc\x71\xd6\x8f\xcc\x7c\x0b\x99\xc8\x9e\xd7\xfd\x28\x23\x11\xe8\x2d\xd9\x2f\xbf\x9f\xc7\x52\x29\x6a\x9e\xf4\xde\xfe\x85\x6d\x97\x2b\xbb\xcb\xa5\x3d\xa3\xcd\x07\xd9\x0c\xfc\x7b\x5a\xff\xff\x58\xdd\x7a\x4c\xad\xb9\x55\xb9\x21\xe4\xe2\xa1\x48\xd9\x22\xc5\x8c\xbe\x12\x07\x8e\xb1\xcb\x31\x5d\x5b\x0c\x0c\x1d\x23\x64\x88\x3a\x16\xae\x31\x47\xd1\xda\xc7\x7d\x33\x6e\x75\x2d\xcd\x8d\x51\xc0\x94\xd3\xee\xda\x54\xe3\xbf\xa0\x31\x6e\xcf\xbe\x08\x9c\xb8\xa7\x94\xe4\x45\x13\x27\x03\xd2\xcc\xc4\xe6\x7b\x40\x7b\x85\x73\x21\x55\x0f\x2d\x90\xda\x1f\xc0\x22\x3c\xd0\xa6\x71\x97\x7a\xf9\xab\xcf\x08\xa4\xcf\x8a\xf6\xd9\xfb\x22\x1b\x91\x90\x39\x3c\xa5\xcb\x75\xc7\x50\x8d\xda\x24\x41\x18\x73\x21\x98\x8b\x98\x22\x48\x63\xc0\xdb\x31\x41\xbb\xd9\x0e\xd0\x38\x3e\x8f\x0c\x33\xe1\xbb\x26\x13\x72\x53\x76\x75\x11\xf9\xe0\xb9\xe1\xed\x47\x4f\x43\x4b\x33\x00\x5c\x7b\x9b\x7a\x9a\x69\x65\xeb\x11\xa0\x23\x98\x6c\x2d\x97\x9a\x5c\x95\x3f\xff\x4d\x99\x68\x62\xd0\xfb\x70\xbd\x26\x66\xcd\x75" \
-"\xff\xe8\x96\x6d\x33\x46\x05\x0b\xe0\x29\x8d\xc8\xe3\xaa\x01\xdc\x22\x67\x70\xb9\xa9\xcf\x8d\xb7\xac\x3d\x81\x71\x7e\xc8\x3b\xc5\x5d\xf5\xf0\x3a\xe8\x28\x5a\x7d\x25\x86\xd2\x52\x76\xea\xc8\x73\xa9\x7c\xbc\x01\xac\xec\x1f\x4f\xd3\xd5\x92\xc3\xce\x69\x39\xf1\x3b\xed\x91\x20\x06\x18\xfd\x17\x3c\xd3\x02\x5e\x2a\xbe\xb4\xd5\xb1\x17\xa7\x68\x03\xe2\xab\xd0\x5f\x60\x39\x35\x8d\x73\x58\xae\x0a\xce\xea\x96\xb6\x9d\xf2\x5d\x61\x50\x09\x9a\x98\xa6\x5e\x8d\xee\xd4\x44\xe7\xf4\x00\x24\xa7\x02\x09\xa9\x10\x97\xaa\x21\x33\x01\x69\xd2\xc2\xe0\x92\xdd\xe3\x89\x3f\x90\x0e\x05\x8c\x1e\xc1\xcb\x2f\x5a\x14\xe9\xa9\x42\xc0\x5b\xfc\xa1\x8c\x43\xca\x0c\x18\xbe\xf2\x2e\xd0\x79\x08\xc2\xa4\xa4\x7d\xd8\xc2\xf2\x7d\x83\x23\x05\x2d\x12\x98\x9d\xf0\x23\x38\xf6\x90\xaf\x02\x07\x7b\x0d\x9e\xa8\x73\xdd\xc3\x36\xec\x23\x84\xf6\x07\x64\x6c\x78\x11\x17\xd2\x3d\xee\x26\x49\x95\x1c\xf9\x1d\x05\xe8\x1c\x83\x54\x4f\x9b\x1a\x52\x60\x96\xdb\x7a\xa7\xe7\x38\xe9\xb0\x9a\xd5\x7e\x0e\x9b\x0d\x44\x9d\x19\xec\xf4\x40\x7d\x4a\xf7\xf1\x7b\xb1\x66\x2b\xf4\x7a" \
-"\xad\x4b\x84\xf4\xf8\xec\xf6\xa1\x8a\x44\x56\x02\x34\x79\xe8\x60\x64\xcf\xee\xdb\x40\xc5\xa2\x08\x61\x90\x59\x79\x42\x92\xa6\xe9\x07\x91\xd9\xdf\x33\xfe\x80\x01\xd3\x01\x00\x00\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" \
-"\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x63\x6c\x65\x61\x72\x74\x6f\x6d\x61\x72\x6b\x0a\x80" \
-"\x03"};
+char datatoc_Bfont[25181]= {128, 1, 228, 1, 0, 0, 37, 33, 80, 83, 45, 65, 100, 111, 98, 101, 70, 111, 110, 116, 45, 49, 46, 48, 58, 32, 66, 102, 111, 110, 116, 32, 48, 48, 49, 46, 48, 48, 49, 10, 49, 49, 32, 100, 105, 99, 116, 32, 98, 101, 103, 105, 110, 10, 47, 70, 111, 110, 116, 73, 110, 102, 111, 32, 49, 48, 32, 100, 105, 99, 116, 32, 100, 117, 112, 32, 98, 101, 103, 105, 110, 10, 47, 118, 101, 114, 115, 105, 111, 110, 32, 40, 48, 48, 49, 46, 48, 48, 49, 41, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 47, 70, 117, 108, 108, 78, 97, 109, 101, 32, 40, 66, 102, 111, 110, 116, 41, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 47, 70, 97, 109, 105, 108, 121, 78, 97, 109, 101, 32, 40, 66, 102, 111, 110, 116, 41, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 47, 87, 101, 105, 103, 104, 116, 32, 40, 82, 101, 103, 117, 108, 97, 114, 41, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 47, 73, 116, 97, 108, 105, 99, 65, 110, 103, 108, 101, 32, 48, 32, 100, 101, 102, 10, 47, 105, 115, 70, 105, 120, 101, 100, 80, 105, 116, 99, 104, 32, 102, 97, 108, 115, 101, 32, 100, 101, 102, 10, 47, 85, 110, 100, 101, 114, 108, 105, 110, 101, 80, 111, 115, 105, 116, 105, 111, 110, 32, 45, 49, 48, 48, 32, 100, 101, 102, 10, 47, 85, 110, 100, 101, 114, 108, 105, 110, 101, 84, 104, 105, 99, 107, 110, 101, 115, 115, 32, 53, 48, 32, 100, 101, 102, 10, 101, 110, 100, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 47, 70, 111, 110, 116, 78, 97, 109, 101, 32, 47, 66, 102, 111, 110, 116, 32, 100, 101, 102, 10, 47, 69, 110, 99, 111, 100, 105, 110, 103, 32, 83, 116, 97, 110, 100, 97, 114, 100, 69, 110, 99, 111, 100, 105, 110, 103, 32, 100, 101, 102, 10, 47, 80, 97, 105, 110, 116, 84, 121, 112, 101, 32, 48, 32, 100, 101, 102, 10, 47, 70, 111, 110, 116, 84, 121, 112, 101, 32, 49, 32, 100, 101, 102, 10, 47, 70, 111, 110, 116, 77, 97, 116, 114, 105, 120, 32, 91, 48, 46, 48, 48, 49, 32, 48, 32, 48, 32, 48, 46, 48, 48, 49, 32, 48, 32, 48, 93, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 99, 117, 114, 114, 101, 110, 116, 100, 105, 99, 116, 32, 101, 110, 100, 10, 99, 117, 114, 114, 101, 110, 116, 102, 105, 108, 101, 32, 101, 101, 120, 101, 99, 10, 128, 2, 146, 94, 0, 0, 217, 214, 111, 99, 59, 132, 106, 152, 155, 153, 116, 176, 23, 159, 198, 204, 68, 91, 194, 192, 49, 3, 198, 133, 112, 167, 179, 84, 164, 162, 128, 174, 111, 191, 127, 152, 247, 90, 132, 186, 206, 45, 3, 106, 107, 81, 184, 72, 73, 49, 89, 29, 146, 229, 6, 158, 98, 38, 213, 173, 204, 93, 228, 248, 16, 122, 166, 154, 53, 181, 95, 106, 155, 75, 79, 147, 197, 108, 35, 188, 198, 29, 215, 191, 143, 50, 242, 29, 88, 228, 26, 95, 121, 12, 238, 47, 2, 175, 73, 134, 149, 233, 12, 29, 11, 210, 89, 231, 91, 2, 25, 48, 11, 15, 105, 44, 51, 119, 156, 42, 166, 122, 232, 81, 122, 190, 18, 48, 8, 69, 34, 74, 246, 173, 93, 169, 219, 154, 26, 58, 64, 251, 6, 179, 106, 156, 205, 105, 18, 85, 7, 252, 45, 233, 208, 65, 132, 199, 96, 66, 240, 63, 207, 209, 83, 132, 0, 35, 151, 42, 129, 42, 185, 179, 203, 86, 112, 193, 206, 39, 89, 113, 28, 117, 41, 66, 98, 214, 242, 145, 175, 155, 124, 118, 7, 30, 218, 126, 122, 208, 38, 33, 98, 50, 34, 185, 54, 8, 122, 178, 127, 254, 95, 7, 134, 71, 6, 101, 146, 24, 61, 195, 71, 174, 146, 230, 191, 86, 177, 123, 237, 206, 19, 104, 70, 246, 162, 163, 118, 171, 140, 11, 192, 255, 78, 52, 125, 32, 253, 14, 199, 126, 250, 177, 240, 99, 49, 0, 20, 141, 42, 125, 47, 210, 31, 18, 90, 170, 205, 143, 219, 153, 121, 131, 43, 103, 13, 138, 170, 118, 210, 18, 186, 181, 97, 70, 25, 144, 150, 12, 53, 110, 184, 216, 233, 243, 198, 93, 157, 254, 127, 140, 44, 138, 123, 43, 233, 158, 99, 255, 108, 134, 136, 60, 29, 229, 7, 141, 163, 185, 30, 3, 228, 132, 13, 221, 109, 48, 227, 60, 227, 135, 117, 220, 128, 67, 195, 147, 32, 118, 71, 190, 131, 11, 245, 200, 93, 30, 226, 32, 114, 26, 39, 232, 138, 33, 109, 232, 1, 11, 233, 212, 78, 221, 88, 158, 135, 95, 159, 14, 38, 31, 12, 106, 255, 51, 147, 42, 139, 254, 210, 119, 6, 96, 221, 226, 140, 183, 213, 222, 5, 205, 13, 140, 253, 214, 125, 103, 227, 52, 60, 102, 31, 250, 163, 147, 228, 167, 58, 207, 156, 68, 166, 150, 167, 169, 116, 83, 194, 150, 104, 152, 31, 7, 157, 38, 76, 29, 10, 247, 63, 57, 194, 106, 230, 183, 120, 135, 187, 201, 211, 82, 234, 168, 182, 167, 90, 56, 37, 109, 160, 144, 13, 48, 204, 190, 14, 169, 103, 127, 136, 102, 24, 81, 61, 32, 233, 228, 158, 18, 235, 189, 28, 0, 222, 67, 17, 110, 143, 71, 223, 181, 33, 17, 66, 81, 210, 7, 23, 186, 245, 229, 198, 143, 62, 113, 33, 80, 236, 87, 148, 65, 42, 27, 111, 128, 223, 196, 140, 45, 32, 91, 123, 158, 136, 153, 166, 144, 126, 115, 133, 220, 254, 234, 192, 123, 14, 239, 75, 199, 116, 28, 241, 25, 30, 66, 226, 248, 159, 142, 46, 41, 10, 237, 111, 205, 31, 230, 72, 196, 49, 200, 50, 29, 115, 153, 141, 198, 225, 218, 157, 86, 56, 67, 249, 99, 50, 25, 151, 14, 200, 35, 186, 250, 204, 151, 187, 209, 51, 129, 161, 68, 118, 130, 31, 25, 134, 255, 75, 170, 240, 225, 113, 144, 5, 178, 133, 45, 85, 242, 66, 10, 10, 65, 138, 93, 147, 72, 210, 250, 209, 123, 148, 135, 12, 156, 94, 13, 250, 31, 211, 157, 82, 128, 132, 143, 11, 155, 47, 211, 151, 232, 142, 253, 82, 104, 234, 231, 190, 169, 78, 32, 90, 2, 41, 201, 122, 142, 205, 144, 234, 204, 198, 227, 56, 57, 6, 63, 8, 237, 89, 199, 30, 226, 169, 48, 198, 191, 38, 114, 87, 135, 189, 98, 251, 224, 210, 154, 58, 87, 26, 56, 41, 219, 119, 124, 109, 83, 182, 169, 166, 123, 255, 190, 35, 121, 177, 37, 92, 128, 242, 247, 132, 218, 149, 140, 116, 184, 163, 13, 248, 138, 68, 124, 229, 211, 89, 210, 101, 172, 149, 221, 182, 113, 36, 182, 46, 5, 141, 127, 147, 54, 118, 67, 107, 105, 187, 40, 53, 208, 170, 25, 45, 113, 216, 110, 135, 56, 7, 26, 14, 225, 61, 79, 228, 72, 30, 39, 220, 195, 227, 229, 153, 196, 28, 6, 107, 240, 54, 67, 6, 94, 143, 0, 34, 180, 49, 14, 41, 111, 9, 41, 94, 203, 184, 139, 142, 34, 140, 138, 90, 25, 216, 89, 252, 45, 46, 132, 169, 154, 230, 131, 15, 20, 100, 99, 235, 106, 73, 185, 89, 6, 66, 230, 171, 202, 22, 213, 227, 183, 32, 138, 116, 253, 208, 230, 121, 16, 63, 238, 132, 69, 28, 135, 88, 115, 18, 21, 11, 102, 172, 200, 37, 222, 255, 100, 221, 80, 173, 218, 53, 210, 250, 148, 211, 241, 97, 150, 185, 43, 250, 138, 14, 122, 133, 30, 191, 54, 158, 118, 22, 12, 232, 25, 228, 60, 101, 206, 119, 29, 57, 12, 99, 36, 167, 182, 153, 86, 195, 21, 70, 154, 102, 106, 45, 236, 70, 151, 143, 185, 207, 252, 106, 46, 168, 80, 216, 206, 157, 171, 118, 77, 82, 153, 24, 54, 165, 128, 160, 27, 195, 117, 241, 141, 93, 151, 233, 239, 244, 73, 123, 133, 42, 138, 123, 68, 159, 225, 209, 171, 242, 70, 212, 6, 168, 19, 116, 228, 0, 14, 148, 191, 132, 10, 254, 83, 125, 20, 17, 71, 126, 142, 56, 80, 55, 48, 125, 184, 172, 156, 163, 161, 72, 249, 105, 204, 207, 179, 217, 115, 177, 2, 82, 220, 142, 14, 180, 138, 254, 83, 139, 36, 70, 203, 91, 81, 82, 229, 20, 253, 78, 132, 213, 64, 154, 163, 59, 93, 245, 168, 38, 148, 48, 228, 13, 186, 204, 95, 140, 184, 118, 22, 130, 111, 27, 38, 139, 127, 106, 172, 161, 254, 136, 187, 166, 48, 162, 152, 124, 69, 27, 186, 50, 126, 7, 144, 43, 75, 176, 145, 159, 202, 244, 7, 78, 203, 250, 32, 42, 195, 71, 186, 90, 92, 162, 126, 98, 44, 195, 163, 47, 88, 124, 43, 177, 122, 251, 254, 29, 161, 70, 98, 235, 133, 52, 12, 28, 184, 67, 145, 73, 88, 99, 69, 60, 227, 142, 15, 218, 82, 167, 57, 225, 230, 218, 131, 251, 171, 11, 63, 191, 65, 236, 178, 63, 159, 213, 211, 114, 64, 200, 85, 73, 40, 94, 123, 108, 171, 89, 169, 206, 99, 196, 31, 15, 152, 138, 77, 137, 210, 197, 228, 255, 73, 126, 120, 249, 214, 170, 212, 168, 73, 54, 125, 113, 78, 226, 37, 137, 249, 188, 239, 33, 231, 244, 125, 116, 137, 126, 187, 31, 193, 194, 118, 121, 19, 80, 250, 87, 48, 80, 62, 246, 29, 121, 247, 135, 198, 193, 253, 148, 211, 17, 210, 17, 247, 44, 205, 91, 1, 190, 195, 236, 66, 95, 144, 58, 235, 2, 42, 79, 25, 82, 164, 167, 244, 114, 188, 192, 101, 23, 55, 69, 141, 168, 28, 89, 60, 116, 91, 162, 121, 28, 123, 96, 252, 165, 180, 69, 56, 232, 54, 122, 138, 223, 158, 131, 94, 171, 82, 4, 112, 13, 160, 117, 170, 146, 28, 241, 154, 211, 119, 16, 233, 141, 96, 94, 167, 13, 37, 118, 105, 73, 211, 97, 109, 148, 131, 190, 119, 45, 124, 208, 225, 39, 94, 48, 62, 33, 188, 248, 154, 233, 46, 158, 7, 144, 1, 121, 0, 235, 71, 25, 52, 13, 46, 1, 25, 171, 27, 179, 170, 164, 231, 2, 25, 182, 226, 250, 96, 192, 23, 185, 218, 218, 16, 140, 36, 180, 216, 59, 95, 49, 165, 162, 134, 252, 47, 168, 65, 242, 178, 211, 62, 10, 239, 153, 65, 219, 247, 72, 17, 105, 49, 254, 85, 136, 211, 117, 240, 218, 77, 221, 166, 41, 145, 198, 4, 104, 136, 241, 48, 0, 158, 210, 236, 207, 26, 145, 140, 95, 164, 117, 198, 0, 183, 104, 161, 59, 9, 189, 8, 32, 44, 26, 255, 157, 119, 245, 250, 49, 176, 156, 227, 102, 228, 105, 83, 24, 153, 85, 196, 129, 133, 128, 208, 129, 202, 62, 204, 173, 137, 91, 223, 112, 208, 243, 87, 180, 109, 82, 141, 56, 239, 210, 40, 86, 200, 173, 31, 32, 230, 140, 202, 61, 220, 176, 92, 108, 207, 177, 213, 169, 238, 172, 158, 254, 38, 242, 141, 6, 115, 217, 193, 134, 166, 227, 36, 208, 119, 86, 44, 34, 195, 71, 119, 94, 234, 241, 122, 79, 169, 173, 36, 221, 120, 68, 23, 3, 44, 125, 38, 78, 72, 230, 25, 62, 18, 205, 206, 66, 140, 79, 125, 229, 223, 0, 92, 25, 118, 253, 161, 219, 51, 228, 229, 212, 13, 155, 26, 50, 54, 105, 54, 38, 85, 152, 49, 150, 233, 88, 191, 111, 0, 122, 147, 95, 215, 50, 33, 176, 209, 77, 136, 198, 6, 71, 97, 100, 152, 0, 159, 94, 91, 202, 7, 148, 125, 254, 58, 38, 107, 49, 101, 14, 194, 163, 12, 79, 253, 153, 150, 54, 30, 37, 140, 189, 241, 141, 47, 57, 139, 145, 74, 88, 15, 178, 179, 63, 241, 91, 129, 30, 79, 19, 104, 72, 56, 215, 37, 124, 242, 77, 81, 109, 155, 0, 233, 122, 186, 107, 91, 145, 92, 162, 90, 4, 113, 170, 84, 211, 132, 142, 64, 27, 93, 152, 248, 107, 94, 93, 160, 109, 249, 241, 251, 102, 130, 66, 96, 51, 112, 140, 245, 151, 65, 45, 189, 157, 117, 188, 91, 97, 49, 138, 107, 106, 135, 204, 203, 38, 119, 33, 149, 87, 122, 158, 198, 8, 142, 218, 3, 56, 249, 80, 86, 253, 82, 246, 203, 231, 57, 160, 50, 52, 187, 24, 108, 130, 253, 193, 24, 51, 201, 50, 3, 67, 176, 187, 124, 165, 172, 142, 252, 156, 155, 220, 252, 51, 237, 105, 94, 48, 44, 233, 187, 188, 123, 100, 218, 223, 36, 114, 54, 219, 223, 39, 156, 112, 206, 46, 19, 10, 213, 139, 69, 12, 138, 134, 44, 130, 94, 136, 4, 111, 77, 21, 115, 225, 162, 15, 38, 159, 218, 138, 102, 171, 2, 142, 48, 158, 57, 94, 59, 182, 17, 127, 190, 223, 196, 66, 238, 107, 50, 154, 2, 142, 167, 152, 18, 25, 226, 1, 253, 251, 17, 102, 20, 111, 28, 97, 136, 15, 60, 65, 230, 39, 49, 25, 166, 31, 18, 54, 4, 24, 89, 211, 226, 250, 74, 226, 185, 67, 138, 29, 18, 85, 156, 124, 145, 84, 17, 175, 167, 51, 13, 54, 82, 97, 64, 206, 201, 111, 199, 214, 210, 235, 148, 55, 181, 241, 136, 86, 254, 219, 122, 64, 103, 179, 79, 113, 163, 126, 75, 107, 79, 102, 244, 21, 147, 198, 210, 251, 35, 136, 73, 15, 32, 45, 150, 134, 253, 113, 83, 111, 161, 110, 212, 242, 33, 12, 12, 16, 143, 194, 199, 37, 228, 251, 110, 7, 213, 198, 55, 80, 32, 209, 140, 34, 47, 102, 249, 217, 166, 118, 31, 106, 2, 18, 106, 46, 146, 148, 125, 0, 208, 89, 209, 247, 55, 143, 177, 19, 183, 127, 71, 118, 20, 136, 3, 233, 109, 119, 181, 115, 223, 110, 139, 182, 171, 109, 104, 72, 62, 152, 143, 14, 157, 82, 154, 253, 142, 215, 59, 1, 11, 98, 107, 140, 12, 240, 144, 56, 38, 14, 220, 237, 154, 174, 151, 179, 207, 104, 234, 222, 84, 126, 157, 90, 52, 118, 126, 96, 23, 203, 135, 134, 41, 16, 196, 210, 44, 125, 68, 145, 232, 236, 52, 222, 102, 131, 80, 101, 237, 218, 244, 215, 205, 95, 58, 96, 18, 66, 213, 91, 247, 58, 44, 57, 150, 193, 139, 135, 36, 143, 236, 94, 209, 236, 213, 227, 42, 176, 173, 206, 87, 151, 240, 145, 185, 45, 209, 177, 201, 123, 32, 196, 44, 158, 83, 203, 202, 6, 106, 54, 93, 43, 209, 12, 114, 76, 100, 242, 104, 165, 138, 15, 143, 5, 33, 228, 195, 243, 111, 81, 249, 174, 15, 167, 40, 165, 51, 97, 185, 215, 150, 118, 253, 22, 103, 9, 21, 185, 238, 189, 94, 49, 104, 100, 98, 165, 196, 31, 148, 112, 125, 199, 46, 103, 252, 79, 100, 165, 112, 104, 82, 249, 219, 205, 34, 198, 31, 198, 191, 181, 72, 212, 182, 62, 87, 13, 53, 171, 84, 222, 156, 131, 201, 162, 173, 47, 44, 187, 105, 119, 132, 47, 228, 184, 36, 85, 218, 11, 251, 242, 124, 205, 168, 252, 24, 245, 49, 84, 161, 107, 211, 21, 63, 219, 89, 15, 116, 192, 18, 208, 86, 95, 75, 71, 239, 247, 105, 124, 85, 174, 144, 220, 24, 188, 94, 40, 209, 132, 234, 225, 53, 69, 240, 42, 47, 92, 18, 240, 120, 210, 140, 168, 218, 105, 60, 246, 247, 238, 188, 247, 10, 162, 24, 136, 226, 91, 107, 157, 168, 51, 186, 15, 79, 68, 154, 225, 52, 41, 228, 127, 35, 41, 224, 97, 225, 44, 85, 16, 225, 99, 198, 48, 182, 98, 235, 255, 178, 24, 210, 58, 14, 200, 84, 18, 132, 137, 35, 171, 63, 195, 238, 195, 167, 167, 8, 207, 232, 214, 100, 91, 195, 90, 233, 86, 98, 207, 185, 229, 196, 140, 253, 236, 219, 150, 62, 62, 2, 15, 51, 232, 157, 44, 234, 107, 188, 220, 214, 209, 42, 165, 18, 94, 143, 235, 241, 192, 254, 106, 155, 48, 246, 239, 123, 17, 140, 12, 101, 251, 102, 156, 126, 130, 2, 38, 62, 255, 27, 134, 182, 120, 23, 158, 103, 4, 48, 154, 78, 236, 14, 254, 222, 239, 42, 228, 224, 138, 87, 211, 236, 78, 212, 1, 107, 139, 81, 5, 238, 185, 84, 205, 51, 83, 67, 52, 42, 135, 255, 244, 123, 157, 185, 116, 114, 160, 116, 246, 30, 147, 127, 129, 156, 51, 229, 39, 122, 2, 122, 145, 229, 25, 122, 2, 151, 7, 125, 246, 76, 129, 209, 110, 138, 246, 211, 33, 183, 60, 192, 108, 167, 161, 157, 173, 188, 134, 192, 179, 203, 195, 136, 84, 41, 110, 193, 122, 131, 11, 75, 124, 83, 139, 80, 12, 71, 93, 214, 179, 43, 70, 139, 91, 53, 228, 97, 105, 67, 230, 118, 92, 183, 131, 114, 231, 74, 140, 48, 135, 180, 10, 184, 148, 46, 75, 182, 205, 83, 47, 151, 206, 84, 243, 232, 233, 126, 142, 30, 11, 113, 219, 252, 153, 18, 16, 215, 238, 121, 155, 255, 21, 214, 89, 6, 196, 3, 201, 131, 48, 187, 159, 235, 14, 27, 155, 245, 77, 229, 130, 112, 168, 164, 253, 69, 23, 253, 242, 175, 19, 232, 155, 161, 27, 158, 95, 160, 90, 79, 109, 133, 203, 42, 70, 181, 120, 247, 244, 85, 191, 167, 255, 36, 251, 115, 54, 191, 78, 211, 182, 252, 5, 12, 100, 32, 48, 200, 26, 234, 123, 25, 161, 253, 134, 168, 60, 15, 187, 62, 24, 239, 177, 98, 92, 109, 195, 112, 78, 242, 161, 250, 224, 210, 94, 111, 34, 100, 196, 71, 103, 74, 123, 216, 217, 180, 160, 33, 64, 105, 123, 183, 125, 84, 77, 80, 99, 109, 247, 173, 168, 239, 122, 88, 233, 117, 237, 148, 43, 144, 195, 255, 222, 124, 214, 133, 156, 117, 244, 7, 73, 13, 100, 164, 68, 175, 191, 93, 225, 252, 128, 96, 77, 231, 196, 150, 223, 120, 56, 23, 101, 94, 23, 50, 76, 38, 27, 89, 184, 93, 140, 37, 79, 249, 66, 199, 27, 220, 230, 114, 176, 179, 228, 201, 12, 56, 113, 1, 25, 207, 104, 177, 191, 79, 237, 143, 226, 104, 92, 21, 249, 98, 205, 22, 105, 215, 184, 142, 178, 107, 8, 194, 13, 32, 156, 84, 109, 146, 152, 57, 241, 72, 62, 74, 122, 212, 88, 179, 57, 23, 186, 74, 73, 82, 37, 80, 182, 165, 40, 89, 30, 244, 209, 110, 163, 24, 182, 201, 139, 145, 225, 148, 219, 184, 1, 109, 99, 156, 37, 247, 177, 111, 50, 209, 221, 208, 78, 0, 72, 6, 236, 76, 79, 63, 132, 26, 227, 72, 142, 229, 248, 120, 160, 148, 155, 91, 51, 61, 40, 22, 192, 96, 139, 193, 192, 41, 116, 79, 140, 116, 158, 248, 64, 168, 227, 174, 56, 114, 92, 160, 31, 200, 94, 82, 99, 139, 67, 95, 47, 76, 180, 152, 43, 131, 149, 177, 4, 212, 56, 209, 190, 209, 102, 122, 224, 72, 234, 244, 111, 175, 138, 120, 23, 203, 9, 146, 234, 239, 94, 241, 28, 21, 170, 51, 2, 176, 125, 179, 217, 99, 83, 17, 16, 113, 123, 111, 68, 94, 156, 200, 90, 117, 30, 174, 131, 42, 161, 91, 76, 85, 199, 44, 75, 199, 0, 159, 111, 158, 236, 63, 252, 73, 67, 220, 113, 169, 158, 74, 7, 81, 214, 149, 155, 222, 129, 91, 63, 169, 196, 168, 208, 230, 83, 168, 4, 19, 27, 176, 157, 146, 56, 42, 254, 143, 171, 119, 60, 127, 57, 37, 107, 84, 255, 246, 76, 159, 38, 176, 233, 13, 97, 107, 64, 55, 206, 201, 204, 218, 3, 139, 123, 150, 151, 110, 28, 198, 99, 247, 167, 155, 37, 184, 253, 214, 21, 253, 250, 179, 26, 233, 98, 205, 117, 109, 94, 222, 15, 151, 184, 119, 219, 159, 26, 52, 234, 55, 66, 100, 108, 175, 174, 17, 111, 135, 189, 244, 238, 173, 23, 17, 241, 136, 78, 124, 75, 203, 114, 135, 228, 221, 79, 244, 180, 84, 215, 120, 58, 193, 234, 17, 21, 132, 110, 10, 93, 93, 0, 183, 245, 134, 61, 95, 68, 191, 141, 237, 95, 126, 87, 58, 149, 134, 213, 110, 116, 216, 192, 10, 112, 38, 232, 50, 35, 120, 57, 45, 172, 232, 37, 77, 226, 153, 110, 131, 253, 210, 168, 180, 83, 56, 51, 56, 189, 222, 97, 193, 136, 138, 42, 148, 50, 111, 24, 19, 254, 177, 109, 42, 4, 65, 172, 96, 251, 160, 54, 58, 165, 202, 64, 75, 38, 58, 75, 176, 216, 98, 146, 125, 118, 248, 14, 106, 228, 226, 81, 241, 251, 127, 27, 23, 92, 157, 140, 12, 59, 86, 252, 122, 13, 128, 14, 184, 55, 155, 44, 253, 29, 47, 123, 191, 185, 154, 163, 114, 250, 216, 48, 218, 24, 41, 137, 186, 200, 209, 147, 86, 234, 11, 251, 42, 56, 181, 243, 238, 166, 135, 92, 151, 86, 174, 89, 79, 71, 14, 24, 5, 179, 87, 131, 135, 102, 59, 186, 66, 1, 6, 72, 5, 28, 79, 49, 186, 194, 62, 179, 53, 186, 31, 143, 15, 105, 32, 251, 188, 138, 11, 244, 36, 100, 101, 80, 187, 253, 53, 90, 154, 212, 181, 126, 209, 58, 10, 55, 168, 27, 236, 115, 101, 224, 193, 103, 231, 231, 76, 130, 169, 64, 247, 143, 160, 6, 12, 187, 62, 115, 85, 133, 97, 131, 157, 164, 5, 18, 51, 69, 53, 226, 170, 32, 248, 133, 194, 58, 114, 243, 156, 53, 219, 228, 37, 51, 150, 240, 227, 74, 100, 66, 140, 115, 100, 103, 47, 160, 145, 39, 160, 75, 222, 218, 28, 108, 232, 107, 91, 0, 57, 250, 136, 6, 33, 118, 115, 103, 179, 221, 108, 40, 142, 175, 185, 2, 12, 192, 66, 213, 152, 41, 233, 223, 41, 212, 85, 17, 52, 58, 211, 181, 46, 211, 206, 189, 26, 8, 90, 115, 224, 151, 195, 224, 213, 34, 162, 189, 222, 218, 155, 78, 201, 101, 242, 9, 56, 215, 152, 239, 247, 121, 3, 16, 221, 56, 45, 35, 243, 146, 128, 44, 114, 215, 132, 101, 220, 233, 180, 2, 29, 87, 203, 185, 144, 16, 37, 113, 60, 244, 214, 140, 191, 24, 192, 37, 255, 161, 147, 216, 30, 40, 155, 88, 60, 186, 135, 11, 23, 228, 43, 157, 203, 102, 196, 197, 1, 1, 87, 218, 126, 80, 76, 30, 182, 207, 153, 135, 248, 6, 181, 215, 77, 128, 200, 10, 19, 107, 138, 202, 84, 120, 191, 140, 117, 50, 32, 27, 105, 174, 224, 170, 123, 53, 76, 48, 210, 6, 227, 195, 114, 235, 87, 145, 150, 26, 21, 17, 214, 198, 245, 125, 109, 156, 170, 204, 143, 228, 62, 196, 128, 21, 243, 153, 91, 71, 164, 113, 164, 255, 48, 36, 238, 105, 220, 163, 93, 3, 33, 47, 150, 241, 211, 190, 111, 157, 234, 189, 25, 58, 247, 75, 118, 247, 167, 171, 118, 223, 1, 180, 98, 83, 0, 2, 109, 17, 255, 116, 244, 107, 101, 220, 100, 70, 21, 133, 179, 90, 210, 116, 32, 197, 24, 82, 114, 120, 218, 14, 147, 80, 194, 80, 69, 78, 223, 157, 183, 130, 49, 139, 162, 34, 12, 176, 45, 242, 103, 232, 128, 68, 88, 225, 181, 149, 3, 210, 20, 38, 155, 6, 206, 136, 22, 170, 92, 156, 165, 116, 142, 250, 72, 203, 235, 193, 116, 244, 4, 209, 55, 186, 29, 8, 33, 193, 221, 73, 27, 212, 204, 22, 197, 179, 8, 122, 134, 8, 255, 96, 51, 2, 169, 193, 96, 128, 178, 109, 143, 131, 50, 219, 208, 58, 159, 103, 233, 100, 26, 2, 177, 129, 122, 168, 120, 71, 39, 115, 228, 108, 114, 161, 243, 24, 10, 221, 105, 0, 32, 230, 75, 208, 233, 4, 70, 249, 98, 37, 46, 87, 158, 145, 60, 85, 229, 199, 236, 126, 80, 183, 181, 12, 68, 3, 15, 23, 36, 92, 146, 109, 61, 24, 128, 78, 239, 88, 230, 215, 204, 90, 147, 118, 171, 51, 168, 95, 93, 23, 90, 244, 164, 172, 201, 222, 112, 143, 193, 209, 130, 201, 207, 118, 175, 51, 3, 83, 144, 53, 7, 2, 223, 146, 50, 101, 168, 159, 133, 28, 66, 29, 64, 233, 76, 182, 133, 172, 68, 223, 114, 254, 236, 111, 30, 73, 137, 130, 164, 131, 196, 189, 111, 155, 147, 217, 64, 194, 115, 143, 201, 77, 22, 153, 228, 83, 191, 53, 210, 87, 234, 21, 34, 187, 184, 28, 63, 179, 214, 83, 14, 112, 32, 169, 159, 133, 207, 19, 169, 188, 147, 111, 186, 114, 43, 118, 152, 25, 71, 184, 247, 239, 62, 39, 125, 8, 176, 91, 46, 127, 37, 169, 247, 186, 170, 231, 106, 124, 93, 82, 203, 135, 50, 177, 85, 74, 115, 219, 76, 96, 173, 44, 242, 38, 163, 171, 14, 0, 95, 76, 99, 75, 14, 39, 213, 116, 182, 72, 2, 234, 176, 65, 98, 150, 36, 70, 86, 137, 151, 218, 245, 141, 17, 24, 233, 41, 185, 58, 178, 56, 54, 122, 148, 231, 151, 41, 214, 96, 4, 243, 46, 63, 200, 233, 128, 161, 95, 138, 244, 183, 141, 145, 14, 25, 91, 197, 70, 3, 227, 187, 203, 223, 48, 120, 113, 7, 0, 130, 193, 160, 67, 108, 185, 71, 237, 171, 101, 159, 96, 98, 34, 4, 142, 114, 155, 160, 147, 193, 170, 48, 115, 253, 172, 245, 59, 145, 176, 55, 203, 245, 60, 24, 247, 235, 79, 12, 117, 74, 18, 151, 14, 208, 7, 227, 230, 138, 182, 107, 33, 172, 211, 232, 244, 91, 86, 80, 237, 55, 154, 175, 32, 221, 17, 151, 79, 104, 238, 25, 226, 76, 155, 72, 39, 90, 209, 93, 119, 54, 17, 9, 222, 62, 18, 136, 25, 15, 59, 194, 203, 57, 150, 0, 52, 122, 104, 84, 199, 104, 180, 154, 180, 177, 141, 173, 169, 154, 113, 35, 75, 198, 157, 150, 80, 44, 212, 248, 174, 232, 251, 140, 74, 214, 189, 41, 120, 113, 156, 65, 16, 15, 201, 18, 45, 16, 210, 104, 247, 38, 33, 40, 249, 61, 119, 153, 179, 72, 88, 122, 109, 208, 91, 186, 231, 246, 201, 154, 26, 36, 115, 126, 217, 44, 194, 140, 103, 229, 15, 250, 227, 140, 106, 204, 118, 169, 157, 84, 150, 31, 128, 194, 254, 144, 221, 84, 79, 211, 148, 33, 60, 107, 211, 170, 159, 248, 105, 63, 114, 0, 23, 234, 92, 230, 240, 118, 6, 250, 181, 184, 227, 64, 186, 40, 94, 67, 225, 133, 89, 15, 16, 174, 144, 165, 59, 6, 73, 13, 18, 29, 10, 46, 237, 23, 51, 33, 27, 193, 212, 63, 194, 5, 79, 66, 177, 81, 200, 84, 254, 225, 36, 110, 208, 225, 202, 213, 89, 214, 140, 142, 227, 223, 60, 214, 19, 145, 92, 92, 164, 207, 222, 158, 250, 12, 146, 150, 67, 204, 120, 211, 109, 95, 186, 40, 167, 178, 90, 34, 46, 234, 28, 109, 171, 182, 83, 197, 36, 51, 69, 152, 168, 121, 48, 71, 179, 22, 218, 168, 182, 160, 147, 195, 177, 176, 201, 234, 213, 209, 135, 222, 9, 1, 157, 170, 240, 175, 246, 218, 255, 92, 53, 102, 171, 22, 235, 180, 248, 118, 10, 85, 14, 24, 218, 184, 132, 191, 225, 112, 66, 3, 231, 36, 235, 34, 214, 181, 57, 104, 151, 76, 69, 101, 83, 20, 39, 170, 108, 161, 239, 236, 126, 9, 144, 27, 117, 209, 174, 173, 92, 16, 185, 25, 8, 65, 29, 134, 67, 1, 248, 62, 221, 239, 134, 12, 15, 252, 203, 140, 179, 52, 247, 3, 230, 34, 184, 102, 82, 118, 76, 218, 254, 242, 24, 115, 22, 119, 90, 4, 149, 236, 176, 116, 68, 77, 123, 201, 192, 255, 188, 107, 195, 3, 217, 184, 106, 219, 116, 81, 207, 193, 227, 101, 41, 29, 232, 72, 85, 236, 151, 74, 93, 150, 166, 171, 155, 81, 131, 81, 109, 171, 184, 37, 190, 114, 106, 113, 144, 234, 76, 143, 92, 98, 190, 112, 151, 198, 151, 181, 99, 7, 182, 50, 190, 157, 141, 17, 199, 148, 230, 14, 240, 95, 238, 139, 161, 96, 85, 137, 154, 79, 67, 168, 101, 253, 126, 23, 165, 143, 47, 33, 157, 100, 6, 130, 253, 188, 66, 21, 205, 243, 116, 62, 241, 161, 177, 199, 234, 61, 135, 55, 113, 25, 153, 27, 129, 149, 189, 140, 112, 211, 49, 176, 38, 44, 110, 29, 135, 178, 122, 233, 3, 166, 97, 175, 61, 159, 98, 61, 54, 46, 62, 246, 137, 17, 150, 249, 165, 99, 211, 172, 76, 7, 104, 39, 106, 119, 221, 159, 210, 96, 33, 236, 87, 164, 112, 47, 226, 247, 236, 140, 185, 182, 20, 201, 51, 88, 97, 52, 198, 70, 49, 248, 96, 51, 82, 115, 169, 78, 73, 112, 123, 106, 120, 113, 184, 93, 194, 224, 68, 211, 200, 237, 209, 41, 160, 127, 89, 163, 55, 9, 27, 252, 78, 93, 147, 141, 12, 156, 44, 226, 106, 126, 159, 181, 106, 84, 25, 39, 220, 41, 134, 184, 173, 69, 141, 128, 221, 57, 194, 56, 41, 148, 107, 242, 241, 174, 129, 152, 123, 81, 101, 1, 204, 9, 109, 154, 97, 169, 63, 167, 52, 96, 239, 63, 116, 163, 122, 158, 94, 221, 35, 90, 184, 69, 186, 220, 155, 205, 65, 191, 31, 209, 62, 120, 156, 77, 154, 212, 58, 165, 208, 254, 65, 204, 148, 200, 121, 78, 129, 79, 121, 39, 34, 3, 169, 118, 120, 52, 35, 119, 142, 29, 15, 144, 156, 90, 134, 101, 105, 11, 112, 32, 74, 0, 219, 159, 132, 100, 7, 106, 88, 142, 42, 159, 159, 133, 11, 175, 92, 88, 144, 12, 55, 185, 47, 142, 31, 43, 39, 16, 83, 122, 54, 7, 150, 158, 215, 14, 143, 136, 147, 141, 231, 157, 67, 152, 119, 164, 114, 159, 71, 210, 144, 98, 127, 44, 132, 218, 170, 183, 6, 185, 210, 94, 95, 99, 240, 116, 30, 126, 76, 115, 212, 246, 102, 92, 96, 159, 252, 177, 173, 238, 87, 145, 120, 239, 83, 103, 148, 111, 193, 200, 157, 199, 84, 245, 167, 68, 43, 9, 69, 55, 83, 164, 109, 90, 46, 101, 215, 36, 23, 74, 170, 73, 31, 151, 63, 13, 233, 151, 107, 248, 28, 92, 35, 70, 5, 235, 85, 219, 20, 213, 153, 157, 249, 176, 37, 255, 191, 49, 221, 195, 243, 205, 150, 238, 234, 168, 137, 153, 201, 222, 205, 199, 162, 119, 146, 41, 89, 105, 114, 144, 27, 194, 167, 15, 17, 102, 155, 81, 20, 64, 25, 235, 217, 63, 154, 242, 225, 13, 33, 182, 38, 116, 47, 107, 50, 207, 110, 29, 136, 55, 33, 139, 136, 214, 63, 92, 125, 90, 118, 202, 7, 13, 45, 43, 162, 106, 53, 143, 13, 190, 171, 226, 196, 144, 17, 49, 136, 120, 246, 99, 28, 219, 184, 171, 145, 232, 242, 225, 86, 216, 29, 251, 249, 41, 244, 144, 111, 2, 13, 67, 69, 97, 59, 202, 92, 254, 71, 189, 6, 119, 180, 186, 203, 34, 18, 85, 115, 103, 178, 15, 139, 42, 154, 39, 24, 0, 19, 22, 240, 255, 252, 93, 217, 151, 118, 89, 76, 228, 117, 200, 137, 13, 190, 247, 255, 24, 253, 162, 24, 184, 20, 70, 173, 242, 65, 255, 14, 85, 235, 99, 103, 131, 181, 84, 80, 63, 156, 184, 204, 191, 61, 156, 252, 59, 37, 109, 229, 102, 139, 94, 178, 178, 164, 231, 49, 155, 35, 56, 196, 15, 169, 144, 251, 215, 89, 129, 230, 72, 219, 139, 197, 78, 109, 102, 25, 48, 44, 123, 211, 216, 106, 185, 237, 124, 133, 39, 37, 162, 20, 211, 134, 155, 168, 11, 222, 152, 143, 211, 112, 133, 136, 21, 169, 89, 187, 92, 61, 144, 126, 142, 165, 91, 64, 45, 41, 56, 164, 108, 49, 241, 137, 99, 44, 191, 100, 11, 225, 166, 244, 183, 14, 69, 141, 184, 193, 220, 72, 211, 67, 223, 16, 43, 227, 34, 87, 91, 32, 229, 84, 162, 113, 251, 125, 218, 118, 31, 254, 16, 33, 170, 201, 209, 49, 30, 113, 104, 193, 212, 82, 64, 80, 214, 32, 149, 217, 244, 237, 193, 223, 104, 77, 128, 228, 140, 55, 252, 204, 229, 187, 36, 99, 153, 241, 138, 135, 171, 169, 62, 250, 184, 63, 167, 139, 183, 57, 170, 36, 217, 201, 129, 169, 222, 78, 153, 65, 153, 195, 211, 229, 159, 191, 0, 145, 12, 209, 25, 247, 122, 19, 108, 173, 163, 187, 235, 254, 87, 80, 25, 110, 179, 158, 48, 232, 20, 138, 81, 198, 78, 18, 44, 75, 181, 18, 238, 96, 61, 247, 229, 254, 2, 55, 169, 32, 180, 136, 177, 161, 213, 132, 128, 108, 93, 159, 201, 212, 238, 223, 233, 186, 243, 4, 248, 5, 33, 214, 193, 214, 95, 51, 141, 60, 72, 63, 142, 184, 37, 122, 118, 136, 97, 93, 142, 245, 8, 147, 224, 126, 67, 93, 170, 105, 121, 231, 171, 85, 105, 191, 126, 88, 57, 42, 253, 179, 85, 251, 193, 163, 112, 71, 28, 137, 104, 199, 121, 13, 122, 58, 231, 160, 176, 50, 200, 80, 65, 99, 25, 67, 129, 91, 97, 178, 131, 195, 111, 148, 134, 71, 57, 145, 113, 209, 177, 51, 154, 29, 28, 180, 74, 13, 69, 147, 96, 210, 108, 176, 89, 248, 238, 64, 140, 85, 196, 169, 20, 251, 238, 194, 41, 56, 39, 59, 226, 189, 130, 178, 90, 176, 226, 46, 108, 156, 204, 174, 85, 118, 165, 137, 184, 160, 133, 89, 170, 184, 37, 48, 65, 241, 224, 117, 164, 248, 213, 112, 143, 128, 23, 130, 133, 216, 66, 190, 63, 238, 179, 84, 71, 27, 50, 83, 199, 91, 126, 164, 192, 76, 107, 100, 229, 6, 25, 164, 89, 235, 117, 247, 61, 109, 205, 76, 128, 230, 41, 243, 85, 58, 189, 128, 216, 21, 53, 68, 80, 1, 25, 171, 203, 71, 176, 46, 6, 84, 35, 150, 95, 144, 144, 253, 210, 78, 10, 31, 218, 179, 248, 95, 81, 244, 79, 215, 63, 196, 100, 165, 120, 54, 14, 180, 125, 152, 106, 173, 125, 14, 108, 211, 161, 131, 229, 114, 56, 252, 16, 221, 16, 242, 74, 87, 168, 121, 127, 247, 212, 200, 71, 204, 116, 246, 255, 154, 24, 137, 127, 45, 177, 212, 17, 212, 102, 236, 29, 88, 177, 166, 135, 107, 210, 230, 219, 124, 71, 98, 50, 230, 107, 222, 79, 222, 190, 37, 241, 242, 167, 27, 117, 253, 201, 76, 251, 186, 18, 135, 96, 191, 207, 15, 107, 67, 146, 251, 105, 102, 25, 200, 71, 209, 165, 125, 192, 18, 228, 162, 238, 214, 221, 138, 49, 40, 100, 122, 249, 20, 121, 57, 199, 11, 0, 243, 76, 57, 23, 211, 110, 212, 250, 218, 95, 154, 145, 179, 173, 45, 233, 155, 246, 67, 35, 203, 93, 5, 2, 91, 121, 116, 93, 64, 69, 31, 182, 179, 74, 59, 198, 41, 19, 102, 51, 76, 126, 224, 153, 65, 254, 186, 90, 16, 91, 220, 154, 130, 20, 187, 103, 141, 248, 188, 245, 250, 139, 191, 48, 138, 40, 199, 201, 155, 147, 83, 62, 254, 80, 3, 107, 104, 36, 103, 186, 94, 186, 225, 107, 167, 118, 230, 199, 85, 241, 219, 139, 20, 28, 233, 5, 131, 144, 101, 21, 228, 236, 249, 115, 82, 62, 147, 175, 251, 174, 128, 176, 255, 248, 142, 239, 113, 165, 254, 238, 22, 99, 162, 202, 108, 79, 235, 246, 32, 220, 11, 51, 239, 109, 4, 204, 179, 212, 86, 38, 5, 232, 170, 76, 151, 131, 165, 206, 122, 105, 124, 107, 28, 137, 196, 99, 194, 6, 122, 29, 75, 178, 26, 232, 70, 33, 231, 24, 73, 33, 187, 181, 240, 75, 22, 114, 163, 98, 114, 6, 93, 2, 32, 16, 79, 93, 119, 219, 153, 15, 182, 129, 123, 242, 162, 182, 152, 200, 24, 14, 95, 48, 35, 60, 237, 71, 183, 152, 92, 134, 31, 82, 174, 53, 155, 170, 96, 221, 93, 137, 90, 31, 128, 20, 131, 15, 86, 154, 93, 190, 178, 124, 214, 130, 43, 64, 134, 249, 0, 48, 215, 92, 236, 202, 24, 47, 60, 232, 190, 124, 3, 71, 145, 183, 215, 240, 1, 100, 235, 203, 185, 205, 122, 222, 41, 199, 127, 4, 74, 57, 92, 80, 227, 109, 81, 197, 32, 38, 35, 53, 94, 245, 9, 141, 245, 223, 223, 95, 42, 175, 157, 209, 215, 90, 64, 0, 248, 244, 246, 25, 60, 7, 169, 138, 246, 184, 96, 155, 68, 94, 155, 22, 15, 241, 169, 20, 49, 215, 209, 111, 239, 200, 144, 5, 33, 153, 142, 239, 148, 110, 117, 109, 248, 67, 98, 109, 157, 187, 172, 160, 169, 85, 54, 0, 153, 129, 217, 150, 67, 124, 151, 101, 106, 131, 207, 134, 5, 255, 139, 146, 192, 0, 115, 91, 6, 129, 58, 60, 103, 106, 223, 52, 211, 102, 252, 153, 7, 36, 34, 32, 136, 111, 24, 231, 218, 101, 114, 49, 128, 185, 58, 235, 26, 108, 148, 216, 2, 109, 127, 76, 170, 230, 167, 77, 230, 144, 120, 234, 183, 78, 246, 204, 228, 134, 249, 88, 100, 196, 198, 168, 113, 216, 42, 35, 193, 234, 34, 195, 152, 125, 79, 79, 24, 161, 173, 16, 174, 46, 67, 170, 131, 156, 232, 86, 89, 173, 30, 39, 209, 177, 50, 137, 84, 109, 203, 25, 179, 105, 42, 151, 141, 56, 47, 146, 109, 175, 225, 243, 210, 206, 81, 196, 237, 159, 201, 165, 55, 181, 153, 69, 153, 117, 118, 217, 130, 65, 139, 68, 118, 59, 201, 202, 82, 129, 162, 23, 102, 61, 155, 109, 206, 125, 41, 111, 139, 83, 174, 133, 242, 44, 2, 235, 186, 58, 247, 99, 136, 173, 106, 250, 248, 34, 152, 133, 3, 208, 170, 129, 23, 60, 73, 212, 46, 191, 190, 88, 207, 221, 164, 178, 45, 215, 131, 204, 225, 117, 173, 138, 180, 3, 0, 15, 14, 221, 73, 184, 22, 167, 83, 216, 31, 137, 254, 108, 90, 21, 235, 5, 68, 143, 236, 218, 177, 170, 239, 180, 8, 168, 140, 226, 189, 16, 145, 62, 163, 225, 93, 205, 37, 120, 98, 129, 249, 129, 253, 213, 174, 200, 19, 143, 140, 9, 177, 50, 105, 134, 69, 113, 244, 133, 6, 120, 25, 155, 132, 254, 226, 207, 43, 56, 168, 69, 169, 95, 83, 166, 34, 69, 213, 187, 98, 243, 119, 143, 121, 249, 119, 129, 165, 103, 146, 140, 13, 136, 238, 160, 170, 253, 171, 212, 98, 239, 172, 195, 249, 68, 207, 60, 24, 130, 128, 167, 163, 178, 130, 220, 6, 139, 198, 201, 110, 26, 91, 155, 144, 143, 212, 85, 106, 50, 198, 74, 210, 168, 146, 232, 172, 30, 152, 206, 69, 44, 47, 88, 165, 180, 221, 45, 252, 248, 47, 26, 33, 142, 189, 77, 77, 20, 185, 247, 249, 88, 67, 117, 249, 151, 118, 57, 18, 137, 128, 189, 134, 148, 85, 7, 47, 60, 142, 110, 105, 252, 45, 165, 187, 134, 50, 255, 180, 56, 130, 137, 76, 189, 218, 152, 46, 148, 44, 1, 239, 47, 72, 192, 70, 14, 74, 90, 136, 245, 35, 40, 171, 29, 17, 97, 77, 184, 32, 38, 38, 252, 12, 0, 226, 11, 222, 132, 183, 121, 209, 83, 3, 164, 243, 32, 111, 109, 145, 203, 57, 241, 192, 5, 107, 164, 128, 3, 218, 69, 178, 200, 222, 45, 65, 105, 110, 115, 184, 75, 243, 221, 49, 226, 170, 189, 49, 246, 129, 33, 150, 38, 203, 3, 214, 111, 206, 150, 168, 137, 162, 228, 3, 96, 105, 184, 27, 106, 81, 32, 147, 230, 60, 219, 199, 176, 74, 100, 18, 80, 140, 70, 128, 115, 119, 111, 82, 172, 8, 6, 168, 188, 56, 197, 112, 159, 169, 216, 200, 90, 251, 104, 112, 19, 179, 71, 59, 181, 138, 224, 158, 252, 148, 50, 65, 55, 33, 120, 142, 137, 108, 20, 142, 236, 144, 89, 197, 190, 188, 19, 102, 227, 240, 38, 170, 129, 123, 69, 123, 193, 13, 37, 133, 44, 167, 210, 141, 172, 154, 208, 42, 156, 35, 126, 176, 1, 98, 193, 135, 102, 235, 229, 22, 34, 187, 18, 111, 64, 83, 107, 17, 157, 241, 117, 59, 8, 211, 60, 200, 87, 184, 89, 132, 249, 60, 18, 81, 237, 225, 53, 221, 131, 255, 218, 64, 239, 194, 7, 181, 40, 3, 46, 108, 220, 52, 108, 62, 254, 140, 37, 116, 15, 40, 169, 90, 47, 136, 102, 253, 7, 223, 132, 207, 60, 234, 21, 134, 155, 63, 112, 37, 72, 222, 55, 59, 20, 34, 167, 71, 222, 221, 164, 161, 92, 131, 244, 235, 243, 237, 184, 129, 77, 165, 160, 139, 171, 234, 234, 69, 113, 128, 93, 215, 9, 84, 41, 213, 35, 164, 24, 120, 204, 180, 178, 153, 47, 245, 57, 22, 175, 206, 12, 175, 203, 129, 39, 93, 127, 18, 12, 55, 43, 36, 252, 1, 104, 116, 59, 135, 193, 145, 183, 41, 62, 78, 165, 189, 232, 128, 224, 11, 142, 255, 2, 223, 95, 80, 219, 87, 249, 121, 31, 181, 50, 241, 31, 127, 174, 99, 238, 176, 116, 65, 220, 160, 189, 25, 204, 103, 20, 231, 42, 195, 34, 180, 105, 121, 110, 99, 149, 139, 1, 221, 124, 67, 172, 47, 189, 207, 14, 229, 79, 158, 187, 203, 126, 236, 14, 53, 121, 243, 132, 78, 39, 72, 7, 165, 22, 78, 41, 101, 128, 20, 168, 136, 198, 109, 226, 32, 135, 168, 104, 155, 115, 57, 50, 66, 17, 72, 245, 124, 70, 188, 194, 144, 89, 140, 85, 8, 10, 129, 227, 167, 15, 15, 201, 54, 239, 194, 154, 204, 129, 27, 190, 245, 102, 166, 178, 201, 7, 197, 78, 149, 69, 245, 4, 143, 4, 84, 13, 217, 59, 242, 223, 226, 199, 231, 118, 188, 55, 115, 56, 15, 217, 3, 0, 181, 190, 3, 162, 127, 120, 206, 181, 8, 225, 155, 148, 202, 117, 70, 96, 81, 246, 165, 253, 115, 148, 217, 138, 44, 203, 36, 44, 221, 59, 122, 68, 170, 248, 235, 88, 242, 209, 42, 71, 31, 117, 5, 149, 221, 216, 154, 116, 41, 231, 138, 123, 85, 128, 71, 109, 111, 17, 72, 163, 225, 109, 7, 40, 133, 74, 76, 155, 107, 34, 193, 114, 240, 61, 31, 24, 46, 215, 197, 96, 114, 213, 18, 214, 57, 119, 50, 18, 5, 175, 254, 21, 246, 64, 145, 171, 217, 243, 159, 250, 231, 228, 64, 164, 97, 61, 150, 9, 230, 11, 138, 132, 95, 209, 138, 97, 87, 139, 190, 171, 135, 158, 170, 99, 198, 18, 127, 44, 102, 1, 236, 90, 73, 214, 135, 116, 107, 247, 175, 46, 238, 51, 79, 163, 249, 5, 137, 145, 92, 138, 23, 207, 158, 50, 109, 131, 84, 61, 184, 252, 232, 20, 67, 107, 189, 61, 198, 27, 6, 189, 119, 34, 236, 94, 105, 65, 140, 181, 248, 32, 12, 119, 126, 0, 14, 226, 78, 7, 121, 111, 47, 30, 49, 206, 187, 125, 247, 235, 6, 229, 34, 161, 174, 72, 154, 37, 94, 8, 88, 125, 54, 182, 100, 46, 84, 144, 213, 251, 62, 71, 177, 120, 255, 194, 14, 105, 206, 151, 179, 144, 140, 191, 167, 248, 44, 70, 227, 154, 142, 32, 174, 159, 199, 154, 78, 165, 68, 96, 73, 8, 13, 246, 162, 155, 48, 7, 121, 90, 173, 40, 226, 166, 189, 35, 87, 225, 45, 209, 220, 70, 22, 156, 216, 39, 126, 84, 142, 207, 100, 219, 155, 166, 43, 253, 161, 255, 143, 148, 93, 17, 7, 109, 176, 112, 14, 87, 147, 186, 123, 32, 159, 252, 83, 111, 182, 250, 28, 239, 207, 92, 64, 17, 26, 216, 0, 41, 24, 142, 246, 19, 172, 32, 137, 234, 69, 147, 251, 234, 207, 95, 6, 113, 209, 107, 69, 122, 198, 148, 13, 18, 28, 238, 191, 168, 205, 144, 234, 181, 247, 192, 151, 176, 95, 157, 60, 224, 26, 120, 24, 16, 66, 102, 51, 185, 111, 39, 6, 205, 187, 16, 1, 141, 45, 234, 48, 144, 26, 92, 155, 213, 218, 88, 151, 0, 111, 109, 28, 44, 172, 24, 215, 205, 186, 42, 119, 124, 48, 41, 199, 85, 81, 244, 24, 170, 71, 156, 141, 249, 234, 193, 174, 77, 184, 47, 107, 112, 235, 124, 254, 7, 163, 156, 71, 59, 122, 224, 196, 215, 71, 81, 145, 207, 178, 97, 118, 45, 154, 109, 190, 143, 63, 83, 135, 110, 166, 174, 47, 195, 33, 0, 234, 212, 223, 11, 248, 210, 158, 17, 139, 239, 15, 57, 133, 185, 152, 71, 56, 2, 62, 10, 103, 243, 247, 182, 81, 10, 38, 49, 7, 131, 10, 202, 184, 79, 149, 84, 213, 122, 133, 208, 24, 141, 132, 12, 244, 251, 160, 41, 56, 219, 123, 120, 23, 240, 40, 29, 32, 213, 222, 36, 49, 173, 176, 11, 209, 145, 104, 154, 154, 182, 183, 5, 60, 131, 70, 224, 47, 125, 110, 47, 246, 180, 222, 125, 243, 251, 55, 25, 147, 77, 164, 116, 218, 152, 191, 244, 47, 199, 68, 208, 209, 49, 90, 197, 176, 2, 191, 127, 198, 48, 16, 168, 243, 41, 195, 50, 175, 33, 172, 92, 185, 254, 96, 221, 65, 24, 36, 187, 10, 104, 242, 101, 185, 176, 206, 215, 166, 82, 189, 245, 208, 62, 38, 207, 97, 192, 45, 46, 98, 66, 201, 69, 95, 206, 211, 204, 225, 137, 204, 100, 110, 58, 84, 29, 112, 144, 51, 15, 1, 170, 79, 41, 239, 77, 1, 208, 209, 80, 208, 214, 27, 168, 153, 229, 188, 40, 250, 13, 240, 23, 96, 54, 235, 23, 202, 165, 215, 109, 143, 163, 161, 136, 101, 109, 98, 102, 54, 231, 141, 157, 22, 5, 201, 89, 10, 241, 113, 225, 185, 234, 128, 212, 206, 186, 59, 114, 79, 69, 43, 171, 208, 219, 63, 219, 112, 54, 77, 156, 116, 150, 140, 113, 186, 79, 131, 109, 231, 205, 170, 253, 131, 97, 141, 107, 242, 5, 238, 167, 32, 135, 194, 143, 151, 71, 22, 81, 254, 84, 120, 103, 131, 61, 86, 126, 66, 51, 201, 0, 170, 70, 18, 38, 152, 225, 3, 117, 98, 100, 141, 114, 39, 161, 189, 146, 148, 43, 55, 189, 18, 157, 181, 185, 7, 117, 77, 56, 229, 91, 80, 233, 79, 165, 140, 24, 98, 197, 130, 50, 70, 44, 111, 230, 241, 92, 204, 246, 78, 19, 18, 231, 219, 201, 207, 84, 205, 137, 138, 113, 45, 4, 72, 145, 204, 3, 86, 230, 200, 208, 166, 218, 183, 217, 21, 89, 23, 40, 107, 161, 68, 230, 96, 236, 91, 106, 15, 38, 255, 132, 13, 248, 98, 106, 177, 223, 54, 247, 114, 82, 147, 161, 42, 43, 10, 192, 12, 94, 200, 248, 200, 85, 231, 247, 246, 201, 221, 180, 217, 113, 12, 222, 88, 53, 21, 6, 26, 214, 220, 152, 253, 92, 56, 158, 17, 233, 218, 95, 234, 91, 97, 71, 148, 11, 3, 226, 199, 250, 201, 132, 92, 244, 18, 210, 248, 212, 89, 182, 96, 73, 121, 250, 222, 59, 121, 118, 19, 28, 221, 126, 48, 119, 190, 217, 72, 194, 91, 4, 213, 17, 137, 34, 246, 7, 6, 143, 245, 97, 192, 252, 55, 145, 82, 10, 77, 111, 31, 80, 74, 156, 14, 68, 111, 82, 76, 168, 203, 9, 220, 54, 233, 175, 186, 169, 104, 243, 2, 143, 109, 213, 247, 163, 196, 181, 37, 16, 50, 218, 28, 129, 118, 162, 187, 98, 202, 226, 244, 39, 27, 90, 255, 235, 125, 98, 206, 155, 179, 211, 58, 135, 80, 97, 220, 32, 136, 18, 226, 60, 251, 51, 170, 165, 47, 4, 63, 160, 41, 105, 85, 23, 122, 32, 145, 69, 85, 159, 147, 73, 209, 201, 169, 25, 225, 164, 6, 151, 92, 9, 223, 55, 137, 202, 67, 221, 100, 161, 248, 10, 209, 195, 27, 146, 4, 219, 227, 190, 203, 134, 228, 10, 160, 34, 221, 250, 110, 203, 33, 186, 60, 136, 185, 235, 72, 45, 105, 176, 161, 36, 169, 185, 174, 168, 146, 23, 57, 128, 198, 162, 194, 197, 62, 254, 102, 200, 154, 140, 98, 40, 208, 128, 95, 151, 77, 40, 190, 88, 75, 156, 47, 207, 220, 11, 125, 159, 24, 89, 142, 60, 2, 156, 25, 44, 203, 39, 222, 166, 122, 93, 215, 91, 87, 57, 199, 69, 211, 244, 140, 241, 106, 43, 193, 10, 150, 65, 226, 163, 202, 165, 155, 93, 219, 207, 28, 174, 157, 201, 199, 169, 174, 28, 36, 117, 106, 155, 87, 209, 223, 171, 104, 72, 76, 180, 101, 196, 248, 163, 252, 150, 33, 224, 118, 128, 130, 145, 211, 28, 80, 17, 174, 33, 156, 108, 139, 120, 225, 111, 9, 46, 228, 79, 112, 121, 35, 181, 170, 12, 131, 173, 169, 4, 40, 8, 101, 34, 154, 227, 200, 57, 50, 118, 220, 128, 21, 208, 62, 131, 68, 193, 52, 163, 35, 96, 45, 225, 26, 219, 50, 194, 44, 22, 181, 83, 21, 82, 35, 100, 10, 241, 218, 12, 104, 240, 254, 190, 54, 48, 213, 87, 65, 183, 27, 232, 23, 246, 169, 179, 164, 55, 66, 70, 219, 7, 214, 128, 58, 244, 120, 52, 255, 213, 170, 81, 235, 16, 46, 18, 229, 186, 139, 118, 127, 12, 74, 173, 106, 171, 161, 3, 108, 3, 113, 211, 2, 88, 90, 227, 202, 196, 195, 69, 88, 168, 40, 87, 247, 210, 5, 26, 117, 159, 42, 3, 73, 148, 247, 236, 110, 16, 236, 169, 179, 22, 198, 32, 79, 138, 96, 70, 6, 161, 27, 71, 155, 241, 112, 60, 188, 51, 134, 154, 0, 207, 203, 43, 102, 88, 180, 139, 239, 72, 26, 46, 174, 76, 65, 14, 135, 202, 211, 124, 201, 4, 227, 40, 119, 46, 102, 23, 71, 143, 167, 164, 77, 192, 135, 16, 27, 148, 127, 123, 191, 209, 160, 49, 93, 138, 94, 161, 181, 205, 80, 80, 33, 73, 203, 45, 36, 194, 173, 86, 7, 234, 200, 138, 20, 62, 20, 110, 84, 16, 238, 207, 123, 175, 233, 40, 135, 51, 85, 136, 64, 204, 198, 207, 151, 162, 133, 207, 58, 246, 187, 201, 91, 185, 76, 46, 209, 173, 153, 71, 158, 241, 109, 66, 129, 109, 19, 70, 30, 186, 76, 249, 125, 197, 243, 223, 219, 16, 93, 134, 232, 59, 188, 42, 4, 155, 129, 236, 145, 166, 244, 222, 103, 3, 166, 145, 150, 57, 129, 19, 253, 157, 242, 66, 97, 165, 107, 87, 180, 245, 247, 47, 19, 34, 135, 219, 94, 76, 118, 156, 247, 148, 44, 142, 164, 20, 184, 96, 179, 138, 54, 39, 212, 235, 96, 215, 39, 45, 51, 215, 39, 47, 119, 120, 22, 197, 166, 158, 26, 115, 21, 16, 110, 23, 166, 132, 209, 232, 103, 248, 200, 133, 238, 224, 13, 50, 110, 33, 211, 154, 5, 239, 137, 226, 87, 131, 152, 225, 59, 208, 49, 204, 237, 81, 149, 34, 167, 46, 181, 121, 110, 31, 108, 226, 10, 80, 6, 47, 84, 180, 176, 86, 70, 171, 221, 85, 143, 172, 227, 120, 229, 75, 140, 133, 195, 176, 173, 92, 82, 179, 97, 115, 116, 236, 224, 70, 44, 166, 206, 23, 99, 0, 213, 47, 203, 153, 221, 178, 246, 196, 30, 74, 208, 100, 245, 85, 136, 132, 6, 213, 73, 199, 248, 61, 206, 141, 74, 61, 100, 181, 157, 51, 131, 95, 116, 217, 218, 162, 32, 136, 10, 115, 221, 65, 16, 223, 19, 163, 172, 73, 140, 97, 69, 67, 199, 116, 137, 251, 188, 106, 68, 78, 25, 225, 202, 40, 117, 161, 114, 10, 208, 29, 48, 217, 82, 234, 75, 134, 156, 9, 253, 241, 144, 22, 186, 139, 101, 111, 37, 72, 95, 33, 177, 20, 246, 210, 132, 1, 255, 84, 153, 171, 140, 222, 57, 86, 34, 181, 228, 39, 13, 158, 35, 57, 113, 16, 61, 97, 111, 39, 48, 192, 88, 102, 201, 83, 73, 113, 227, 116, 20, 73, 169, 135, 107, 8, 96, 250, 23, 25, 242, 51, 166, 29, 160, 169, 43, 239, 90, 254, 198, 209, 54, 249, 31, 217, 23, 118, 57, 192, 20, 69, 77, 50, 24, 34, 190, 166, 28, 181, 49, 126, 222, 133, 171, 0, 85, 212, 226, 94, 35, 11, 186, 253, 42, 162, 231, 111, 41, 53, 21, 0, 196, 211, 17, 73, 180, 211, 43, 10, 11, 169, 42, 217, 100, 220, 106, 211, 8, 68, 44, 65, 124, 214, 103, 198, 30, 191, 25, 71, 54, 175, 38, 179, 199, 70, 138, 97, 108, 255, 138, 125, 40, 227, 161, 76, 237, 137, 181, 151, 130, 199, 147, 50, 202, 63, 204, 201, 210, 176, 96, 34, 56, 67, 123, 183, 1, 76, 154, 235, 179, 216, 12, 117, 188, 46, 156, 252, 113, 160, 233, 197, 85, 136, 30, 248, 140, 12, 94, 134, 65, 86, 195, 234, 246, 91, 169, 22, 246, 179, 50, 9, 114, 221, 181, 117, 75, 248, 250, 178, 13, 27, 17, 253, 242, 46, 217, 38, 173, 41, 199, 29, 74, 40, 35, 68, 210, 208, 58, 180, 133, 244, 138, 113, 207, 34, 225, 122, 92, 111, 221, 183, 24, 150, 49, 7, 21, 66, 56, 58, 165, 114, 83, 27, 31, 48, 14, 6, 160, 66, 45, 64, 87, 184, 7, 29, 123, 248, 231, 76, 1, 133, 82, 122, 54, 198, 43, 143, 135, 5, 173, 90, 234, 193, 11, 13, 158, 200, 210, 235, 34, 16, 147, 34, 12, 162, 125, 17, 42, 120, 178, 254, 70, 247, 98, 239, 253, 121, 6, 228, 136, 142, 224, 84, 181, 244, 122, 130, 165, 247, 26, 40, 7, 194, 75, 69, 109, 154, 8, 69, 73, 19, 187, 93, 141, 133, 163, 142, 102, 230, 167, 64, 60, 82, 140, 73, 205, 221, 44, 139, 106, 67, 75, 232, 192, 201, 199, 198, 3, 138, 228, 140, 161, 212, 57, 55, 51, 94, 38, 89, 225, 92, 37, 239, 56, 35, 50, 203, 123, 145, 140, 62, 37, 78, 17, 223, 236, 211, 3, 152, 48, 200, 73, 18, 202, 203, 100, 185, 171, 51, 254, 143, 39, 141, 125, 28, 236, 179, 45, 234, 126, 20, 65, 174, 97, 241, 242, 45, 63, 49, 10, 137, 234, 137, 186, 225, 132, 36, 54, 195, 173, 21, 185, 163, 118, 125, 244, 66, 172, 145, 124, 242, 5, 21, 230, 51, 165, 24, 71, 157, 116, 172, 183, 147, 176, 148, 136, 88, 84, 10, 83, 22, 173, 67, 228, 17, 37, 136, 248, 234, 77, 233, 145, 111, 253, 31, 77, 212, 111, 222, 215, 46, 77, 29, 10, 192, 121, 17, 173, 70, 252, 53, 136, 16, 177, 162, 28, 113, 124, 181, 146, 235, 248, 80, 80, 242, 94, 21, 192, 162, 236, 21, 163, 244, 217, 15, 167, 84, 195, 43, 216, 220, 177, 69, 99, 35, 58, 217, 252, 195, 102, 13, 196, 105, 6, 217, 48, 209, 199, 143, 139, 51, 227, 180, 80, 148, 206, 183, 153, 31, 245, 60, 182, 205, 199, 153, 244, 232, 251, 209, 169, 42, 163, 67, 217, 181, 27, 57, 115, 107, 78, 192, 254, 236, 183, 230, 114, 42, 155, 19, 142, 83, 207, 172, 53, 20, 250, 2, 150, 37, 214, 186, 35, 8, 179, 170, 90, 214, 160, 218, 251, 130, 197, 24, 191, 23, 236, 227, 157, 3, 96, 32, 168, 173, 248, 215, 41, 14, 14, 80, 134, 34, 65, 108, 106, 46, 195, 150, 150, 123, 103, 56, 121, 202, 213, 107, 245, 191, 129, 192, 40, 90, 5, 30, 100, 119, 156, 208, 22, 206, 119, 48, 69, 54, 22, 230, 217, 97, 167, 114, 105, 155, 188, 78, 3, 170, 226, 209, 167, 147, 154, 90, 126, 193, 12, 253, 228, 165, 3, 31, 102, 106, 2, 235, 18, 39, 152, 173, 182, 194, 126, 183, 114, 202, 209, 32, 68, 98, 99, 185, 55, 21, 116, 89, 224, 79, 160, 166, 171, 39, 179, 173, 146, 79, 167, 36, 75, 195, 22, 248, 177, 97, 122, 14, 86, 234, 99, 20, 138, 252, 2, 31, 47, 191, 187, 136, 224, 233, 172, 28, 59, 77, 231, 124, 86, 67, 25, 9, 222, 119, 157, 29, 30, 166, 111, 107, 138, 153, 254, 26, 105, 243, 91, 208, 2, 249, 188, 40, 34, 138, 91, 32, 171, 246, 64, 57, 7, 145, 243, 155, 93, 228, 228, 158, 94, 185, 149, 63, 236, 176, 186, 35, 145, 171, 209, 213, 214, 1, 158, 143, 185, 33, 248, 84, 1, 91, 201, 0, 174, 112, 52, 165, 202, 24, 20, 234, 125, 255, 142, 35, 138, 21, 87, 157, 40, 87, 150, 222, 226, 114, 119, 127, 190, 123, 25, 10, 175, 20, 66, 35, 8, 253, 203, 17, 79, 239, 79, 49, 92, 111, 62, 64, 94, 150, 95, 50, 246, 19, 78, 89, 247, 4, 25, 146, 142, 201, 101, 137, 36, 179, 93, 80, 158, 144, 34, 248, 173, 20, 245, 180, 30, 132, 241, 10, 120, 205, 10, 200, 119, 195, 193, 48, 205, 143, 48, 53, 155, 242, 50, 99, 181, 154, 182, 44, 243, 5, 18, 121, 140, 60, 56, 141, 213, 156, 158, 122, 28, 125, 42, 152, 83, 47, 132, 16, 54, 246, 164, 123, 68, 237, 151, 20, 161, 128, 24, 251, 153, 36, 9, 100, 227, 235, 15, 204, 33, 69, 90, 175, 71, 200, 215, 24, 28, 136, 123, 224, 112, 205, 183, 171, 130, 119, 157, 87, 155, 55, 89, 50, 121, 143, 12, 118, 51, 131, 109, 111, 39, 194, 206, 119, 150, 89, 9, 199, 86, 88, 207, 32, 241, 141, 106, 11, 19, 241, 140, 74, 19, 241, 116, 186, 224, 216, 139, 83, 35, 186, 189, 122, 64, 168, 121, 63, 182, 101, 232, 152, 96, 4, 162, 191, 152, 73, 12, 240, 55, 51, 112, 218, 216, 129, 30, 39, 49, 209, 132, 24, 140, 22, 17, 216, 218, 120, 221, 248, 40, 169, 24, 78, 198, 219, 99, 86, 225, 233, 255, 239, 118, 13, 44, 190, 145, 152, 207, 101, 102, 168, 204, 212, 179, 109, 54, 101, 48, 155, 91, 170, 10, 87, 131, 49, 95, 165, 199, 62, 162, 187, 239, 186, 7, 225, 128, 178, 201, 39, 223, 213, 194, 202, 65, 216, 188, 204, 161, 53, 103, 200, 108, 56, 119, 205, 152, 227, 105, 8, 55, 99, 100, 226, 227, 206, 104, 172, 249, 126, 39, 185, 1, 243, 134, 226, 104, 36, 176, 242, 51, 27, 83, 252, 250, 219, 2, 201, 197, 64, 156, 102, 171, 172, 59, 35, 60, 154, 112, 32, 14, 252, 78, 91, 162, 54, 139, 223, 154, 97, 157, 236, 49, 33, 253, 67, 60, 100, 127, 204, 83, 235, 7, 217, 215, 136, 85, 76, 172, 161, 180, 54, 61, 43, 187, 207, 125, 50, 157, 246, 96, 159, 203, 17, 61, 26, 184, 206, 206, 232, 73, 32, 222, 252, 64, 156, 78, 140, 41, 121, 73, 222, 133, 72, 98, 45, 161, 172, 42, 230, 164, 248, 139, 255, 140, 84, 5, 244, 131, 158, 185, 177, 5, 27, 201, 68, 69, 37, 32, 11, 79, 15, 218, 201, 41, 61, 220, 82, 102, 143, 137, 93, 161, 93, 184, 133, 140, 9, 118, 220, 217, 184, 157, 227, 184, 1, 219, 35, 183, 183, 154, 195, 123, 59, 124, 166, 251, 151, 248, 83, 199, 158, 163, 206, 4, 131, 32, 69, 137, 93, 52, 213, 84, 219, 225, 85, 146, 26, 21, 122, 138, 108, 189, 93, 29, 36, 19, 127, 185, 251, 186, 134, 1, 139, 130, 148, 24, 147, 113, 153, 18, 156, 113, 220, 136, 99, 207, 16, 224, 118, 5, 125, 247, 223, 187, 255, 176, 45, 225, 100, 65, 230, 94, 247, 106, 236, 139, 48, 170, 135, 188, 110, 72, 245, 77, 229, 119, 121, 221, 117, 80, 161, 11, 83, 111, 104, 7, 16, 215, 200, 76, 70, 30, 235, 109, 255, 108, 51, 22, 39, 118, 166, 185, 10, 201, 25, 135, 139, 123, 47, 231, 94, 237, 44, 205, 224, 101, 159, 219, 52, 75, 219, 117, 127, 94, 37, 98, 166, 26, 218, 182, 135, 79, 97, 128, 47, 80, 11, 129, 232, 199, 73, 238, 20, 96, 73, 8, 13, 246, 150, 113, 16, 93, 29, 63, 99, 184, 127, 48, 184, 15, 201, 41, 8, 73, 20, 254, 186, 190, 85, 57, 106, 219, 50, 222, 245, 19, 1, 224, 126, 204, 176, 212, 46, 202, 253, 246, 139, 139, 157, 165, 224, 100, 16, 48, 50, 146, 146, 189, 215, 105, 250, 219, 7, 105, 27, 195, 58, 185, 223, 24, 132, 199, 121, 183, 28, 15, 242, 170, 196, 120, 116, 16, 197, 209, 226, 57, 221, 6, 20, 154, 98, 50, 100, 209, 68, 35, 57, 77, 168, 139, 101, 179, 73, 182, 158, 237, 54, 140, 39, 181, 108, 154, 139, 112, 185, 112, 88, 51, 125, 93, 26, 202, 77, 157, 48, 88, 66, 74, 64, 55, 153, 78, 123, 156, 171, 59, 43, 11, 142, 249, 137, 25, 136, 219, 244, 210, 117, 44, 156, 136, 80, 224, 236, 213, 190, 71, 252, 135, 37, 95, 7, 5, 28, 172, 241, 27, 217, 140, 19, 42, 138, 107, 71, 12, 75, 179, 112, 29, 129, 191, 9, 141, 179, 255, 1, 162, 7, 118, 105, 47, 49, 105, 44, 20, 86, 185, 2, 125, 146, 241, 159, 105, 176, 221, 115, 213, 14, 66, 202, 95, 250, 213, 43, 248, 176, 4, 46, 39, 84, 19, 186, 80, 242, 53, 182, 156, 3, 43, 8, 79, 88, 156, 127, 11, 247, 179, 199, 208, 251, 37, 217, 22, 207, 191, 128, 53, 160, 16, 159, 197, 19, 214, 240, 29, 193, 212, 73, 191, 244, 27, 189, 229, 99, 251, 254, 50, 42, 191, 199, 15, 149, 141, 81, 60, 25, 135, 120, 231, 40, 84, 127, 59, 150, 127, 45, 154, 135, 124, 109, 252, 186, 204, 98, 148, 162, 133, 10, 234, 232, 152, 88, 216, 54, 242, 206, 78, 160, 12, 78, 10, 228, 2, 238, 50, 9, 230, 116, 204, 206, 160, 9, 199, 12, 12, 224, 13, 153, 81, 51, 253, 140, 197, 148, 47, 192, 14, 187, 255, 216, 110, 141, 198, 35, 212, 244, 67, 77, 48, 87, 46, 46, 113, 205, 220, 81, 105, 109, 9, 248, 194, 100, 71, 187, 160, 9, 221, 178, 176, 119, 196, 36, 136, 12, 68, 34, 113, 221, 250, 250, 4, 251, 20, 137, 70, 241, 172, 178, 185, 214, 23, 55, 196, 31, 160, 76, 214, 230, 139, 192, 144, 120, 188, 225, 215, 132, 33, 105, 178, 83, 69, 92, 192, 112, 123, 221, 34, 7, 73, 145, 233, 56, 12, 67, 106, 152, 77, 143, 77, 217, 102, 6, 199, 53, 14, 162, 12, 134, 91, 59, 169, 181, 18, 47, 11, 206, 69, 65, 66, 27, 160, 98, 149, 22, 24, 53, 196, 119, 231, 84, 211, 246, 231, 218, 99, 120, 197, 151, 30, 153, 192, 120, 253, 70, 234, 253, 239, 34, 74, 6, 233, 149, 155, 214, 12, 127, 57, 92, 225, 201, 233, 116, 48, 226, 94, 159, 212, 78, 222, 99, 116, 29, 187, 3, 59, 167, 68, 108, 162, 146, 125, 6, 178, 230, 60, 158, 60, 85, 94, 113, 93, 2, 75, 195, 234, 66, 200, 148, 128, 50, 56, 58, 205, 79, 226, 11, 189, 189, 88, 32, 67, 83, 84, 188, 31, 180, 79, 252, 9, 177, 199, 53, 163, 66, 54, 110, 245, 174, 113, 225, 204, 180, 149, 6, 141, 18, 250, 150, 168, 229, 99, 107, 110, 108, 63, 70, 43, 146, 216, 64, 42, 3, 227, 146, 223, 233, 6, 140, 108, 238, 21, 245, 70, 14, 152, 92, 109, 138, 104, 200, 195, 248, 125, 230, 8, 4, 138, 125, 228, 221, 225, 98, 146, 230, 91, 225, 247, 207, 29, 112, 185, 202, 157, 218, 18, 193, 45, 54, 47, 215, 162, 29, 92, 95, 13, 88, 40, 129, 1, 150, 106, 203, 117, 76, 176, 157, 169, 61, 45, 201, 67, 35, 238, 149, 21, 174, 50, 162, 150, 120, 22, 144, 195, 187, 214, 239, 178, 231, 165, 200, 167, 170, 107, 98, 242, 205, 72, 113, 166, 163, 6, 197, 57, 210, 106, 231, 192, 17, 112, 77, 83, 171, 216, 127, 73, 143, 182, 224, 111, 104, 137, 123, 119, 52, 153, 42, 205, 161, 145, 174, 167, 38, 117, 130, 82, 31, 228, 102, 234, 30, 199, 194, 207, 73, 109, 64, 231, 55, 221, 65, 225, 203, 28, 113, 2, 120, 201, 22, 125, 211, 76, 82, 58, 75, 181, 33, 121, 189, 138, 70, 122, 155, 252, 133, 51, 35, 241, 193, 121, 148, 48, 44, 155, 123, 240, 9, 169, 145, 15, 79, 213, 180, 160, 30, 198, 225, 209, 186, 124, 186, 53, 240, 246, 13, 188, 52, 211, 221, 181, 212, 140, 143, 187, 178, 11, 181, 202, 78, 50, 55, 119, 228, 113, 120, 231, 184, 165, 122, 121, 94, 181, 222, 248, 225, 204, 245, 174, 205, 63, 219, 192, 246, 82, 101, 109, 115, 160, 153, 82, 131, 38, 219, 229, 58, 114, 205, 138, 141, 137, 237, 89, 94, 245, 84, 177, 166, 0, 38, 16, 173, 56, 248, 67, 55, 114, 252, 89, 251, 146, 93, 24, 104, 113, 181, 37, 164, 37, 158, 96, 137, 191, 214, 21, 51, 215, 58, 123, 111, 161, 116, 157, 112, 211, 188, 210, 52, 105, 219, 91, 213, 191, 133, 171, 47, 102, 174, 51, 170, 180, 10, 30, 181, 17, 43, 76, 13, 242, 136, 41, 45, 155, 24, 45, 79, 146, 218, 6, 107, 47, 142, 32, 141, 94, 165, 12, 149, 84, 170, 122, 202, 67, 130, 126, 39, 129, 244, 187, 19, 227, 22, 108, 234, 94, 98, 61, 155, 251, 228, 212, 43, 37, 254, 81, 222, 41, 67, 5, 225, 124, 53, 203, 111, 24, 212, 64, 17, 85, 194, 255, 56, 190, 115, 192, 203, 55, 170, 152, 187, 166, 116, 85, 66, 167, 213, 247, 129, 15, 118, 86, 104, 224, 195, 108, 109, 6, 200, 191, 34, 138, 117, 74, 182, 209, 18, 204, 182, 139, 184, 27, 107, 175, 14, 145, 155, 197, 251, 53, 141, 209, 98, 130, 230, 2, 91, 91, 90, 254, 131, 252, 91, 85, 39, 212, 73, 90, 57, 184, 144, 26, 163, 6, 32, 243, 234, 162, 234, 236, 167, 234, 73, 113, 50, 77, 165, 129, 122, 211, 6, 34, 194, 184, 29, 135, 226, 91, 114, 14, 96, 246, 243, 22, 200, 242, 220, 174, 227, 244, 168, 199, 197, 55, 114, 62, 215, 172, 58, 60, 82, 41, 205, 8, 107, 253, 62, 108, 122, 249, 78, 137, 39, 167, 14, 35, 153, 136, 62, 193, 211, 120, 49, 237, 232, 22, 215, 190, 132, 161, 250, 249, 174, 253, 90, 93, 210, 35, 222, 35, 62, 60, 204, 107, 63, 198, 121, 147, 68, 213, 75, 49, 50, 3, 5, 74, 30, 92, 119, 11, 223, 133, 222, 29, 233, 248, 93, 87, 194, 139, 84, 52, 214, 44, 146, 19, 241, 82, 204, 163, 154, 253, 130, 159, 88, 148, 116, 207, 29, 114, 117, 150, 154, 24, 81, 78, 95, 1, 208, 84, 197, 172, 141, 3, 107, 18, 192, 120, 196, 91, 30, 82, 90, 232, 163, 10, 142, 96, 198, 62, 126, 212, 153, 100, 207, 146, 122, 233, 92, 188, 147, 27, 9, 102, 204, 119, 209, 242, 71, 222, 108, 114, 249, 173, 59, 14, 67, 26, 104, 240, 136, 199, 70, 131, 39, 134, 18, 1, 152, 79, 224, 130, 104, 195, 179, 215, 90, 186, 244, 238, 12, 90, 181, 145, 75, 238, 84, 158, 111, 63, 187, 121, 152, 132, 167, 150, 138, 62, 203, 40, 70, 138, 154, 210, 37, 50, 226, 69, 253, 143, 26, 0, 243, 131, 5, 139, 79, 48, 48, 115, 122, 61, 71, 41, 1, 232, 239, 4, 96, 74, 209, 253, 128, 224, 222, 158, 97, 150, 16, 30, 132, 240, 199, 197, 118, 13, 71, 56, 160, 190, 35, 215, 110, 165, 254, 26, 69, 43, 195, 163, 30, 245, 138, 48, 80, 140, 245, 89, 83, 165, 65, 39, 20, 83, 115, 119, 111, 90, 202, 101, 172, 91, 178, 35, 17, 120, 45, 118, 91, 60, 189, 180, 133, 34, 19, 137, 152, 143, 16, 186, 214, 4, 46, 242, 23, 179, 229, 204, 55, 218, 22, 188, 5, 222, 140, 69, 195, 43, 31, 34, 159, 131, 53, 28, 83, 208, 158, 112, 163, 16, 61, 175, 3, 69, 113, 134, 174, 21, 125, 162, 91, 182, 251, 120, 17, 94, 100, 252, 199, 118, 35, 248, 64, 206, 179, 38, 121, 176, 84, 197, 9, 2, 45, 111, 244, 161, 250, 199, 130, 208, 167, 250, 0, 155, 57, 0, 95, 39, 206, 237, 5, 23, 58, 142, 137, 77, 164, 152, 219, 94, 57, 237, 16, 219, 119, 57, 58, 101, 189, 104, 205, 228, 28, 237, 119, 143, 99, 241, 5, 160, 115, 91, 215, 246, 198, 153, 60, 186, 64, 248, 126, 67, 56, 155, 179, 55, 102, 3, 47, 68, 145, 41, 209, 45, 148, 106, 11, 71, 191, 171, 245, 33, 6, 133, 216, 1, 109, 128, 56, 120, 247, 17, 169, 150, 173, 61, 111, 0, 65, 2, 95, 229, 63, 59, 185, 148, 213, 149, 140, 190, 57, 151, 163, 73, 9, 231, 250, 76, 126, 211, 12, 175, 14, 38, 146, 30, 102, 22, 124, 58, 137, 239, 181, 99, 176, 2, 184, 48, 196, 132, 248, 140, 90, 194, 95, 6, 90, 242, 171, 254, 189, 235, 8, 68, 244, 115, 89, 217, 10, 61, 172, 252, 75, 186, 117, 212, 216, 62, 253, 98, 156, 233, 96, 139, 55, 91, 251, 168, 221, 67, 231, 18, 140, 250, 38, 232, 143, 65, 220, 234, 129, 106, 184, 63, 171, 119, 96, 32, 9, 45, 151, 74, 71, 81, 162, 109, 58, 194, 125, 191, 169, 244, 9, 190, 37, 38, 98, 36, 238, 176, 38, 150, 30, 227, 0, 191, 60, 189, 0, 4, 178, 196, 238, 182, 233, 8, 126, 14, 236, 73, 100, 16, 150, 49, 26, 104, 152, 197, 132, 53, 229, 100, 196, 206, 7, 74, 91, 143, 23, 206, 120, 252, 52, 73, 161, 148, 41, 160, 137, 29, 207, 222, 13, 128, 144, 191, 162, 60, 24, 226, 187, 250, 73, 76, 246, 240, 31, 254, 109, 144, 102, 248, 207, 215, 44, 182, 29, 202, 54, 141, 107, 124, 239, 205, 243, 54, 158, 0, 148, 202, 98, 65, 233, 201, 60, 169, 34, 64, 81, 62, 205, 225, 228, 233, 250, 23, 146, 53, 104, 120, 68, 71, 179, 26, 156, 230, 25, 225, 235, 138, 20, 196, 223, 72, 176, 237, 67, 107, 202, 211, 32, 31, 184, 26, 178, 64, 134, 225, 115, 8, 227, 9, 200, 33, 31, 31, 58, 82, 251, 249, 54, 46, 60, 12, 233, 66, 222, 144, 243, 111, 110, 25, 117, 77, 108, 223, 211, 209, 23, 78, 162, 154, 77, 84, 251, 166, 89, 207, 45, 78, 51, 85, 18, 51, 14, 56, 9, 131, 186, 111, 229, 230, 11, 197, 196, 201, 184, 134, 147, 52, 14, 185, 145, 14, 9, 164, 157, 82, 3, 252, 42, 244, 140, 207, 189, 77, 13, 232, 248, 139, 10, 137, 30, 189, 91, 92, 202, 63, 249, 97, 212, 139, 39, 155, 251, 253, 10, 249, 13, 115, 238, 203, 112, 147, 186, 185, 46, 239, 51, 143, 148, 251, 163, 208, 254, 121, 240, 243, 22, 162, 47, 196, 44, 249, 0, 59, 127, 144, 82, 11, 69, 124, 76, 131, 231, 236, 169, 97, 172, 168, 157, 24, 17, 61, 108, 229, 182, 153, 0, 196, 23, 118, 40, 70, 167, 178, 79, 47, 113, 75, 93, 46, 135, 148, 121, 57, 20, 150, 28, 66, 210, 141, 142, 91, 131, 112, 239, 188, 35, 5, 181, 128, 2, 59, 120, 6, 228, 206, 130, 132, 104, 30, 219, 147, 82, 12, 48, 9, 98, 51, 34, 196, 135, 236, 115, 178, 10, 25, 8, 205, 28, 231, 140, 199, 224, 224, 162, 123, 88, 194, 202, 218, 116, 49, 233, 137, 112, 72, 235, 157, 125, 137, 74, 132, 49, 69, 232, 249, 247, 241, 47, 8, 112, 5, 72, 138, 149, 121, 2, 148, 204, 93, 231, 44, 129, 140, 149, 206, 104, 37, 208, 181, 86, 67, 122, 167, 114, 166, 200, 134, 180, 179, 139, 120, 16, 106, 171, 93, 58, 179, 175, 179, 244, 148, 36, 83, 171, 157, 182, 146, 111, 22, 0, 144, 110, 105, 47, 90, 236, 177, 47, 44, 35, 250, 237, 111, 141, 89, 6, 186, 22, 196, 32, 166, 23, 143, 17, 96, 127, 58, 139, 137, 29, 250, 164, 52, 141, 1, 13, 117, 82, 93, 241, 254, 120, 139, 165, 1, 114, 105, 7, 135, 180, 57, 252, 202, 233, 69, 253, 38, 11, 88, 223, 17, 203, 64, 162, 170, 127, 59, 163, 90, 8, 58, 149, 20, 214, 159, 26, 160, 120, 244, 123, 91, 203, 31, 86, 237, 20, 242, 66, 14, 182, 206, 127, 54, 119, 36, 182, 41, 129, 128, 193, 81, 19, 182, 120, 85, 23, 210, 220, 177, 202, 204, 102, 143, 81, 243, 233, 15, 67, 183, 157, 96, 122, 120, 130, 79, 154, 118, 36, 78, 152, 24, 123, 90, 86, 169, 200, 20, 29, 57, 210, 133, 16, 52, 24, 202, 20, 173, 101, 230, 61, 47, 105, 94, 244, 47, 217, 207, 87, 87, 93, 204, 138, 110, 8, 150, 200, 248, 129, 139, 134, 225, 34, 34, 150, 247, 70, 194, 144, 167, 21, 98, 161, 7, 38, 78, 3, 36, 42, 134, 161, 157, 203, 87, 34, 171, 28, 199, 64, 186, 130, 223, 103, 121, 88, 130, 50, 174, 10, 50, 79, 13, 92, 162, 99, 1, 85, 168, 122, 61, 132, 80, 85, 112, 238, 6, 179, 207, 162, 53, 16, 198, 250, 218, 206, 202, 242, 248, 31, 74, 86, 197, 133, 193, 36, 99, 133, 160, 223, 55, 36, 153, 101, 165, 188, 184, 179, 189, 36, 198, 254, 51, 199, 13, 116, 24, 10, 135, 101, 208, 166, 54, 107, 1, 166, 97, 38, 201, 45, 86, 218, 44, 163, 60, 173, 129, 69, 17, 204, 55, 85, 141, 80, 100, 88, 127, 108, 205, 65, 73, 159, 204, 216, 250, 240, 17, 121, 196, 196, 121, 46, 64, 25, 215, 88, 102, 221, 244, 35, 248, 96, 114, 66, 125, 134, 7, 83, 97, 0, 80, 166, 224, 216, 22, 213, 18, 42, 242, 126, 182, 81, 224, 10, 37, 193, 43, 174, 74, 159, 147, 58, 65, 217, 147, 110, 214, 95, 122, 174, 125, 121, 74, 66, 144, 74, 99, 52, 132, 104, 105, 139, 225, 128, 62, 1, 188, 7, 43, 185, 222, 134, 6, 216, 52, 211, 213, 83, 109, 176, 166, 152, 161, 48, 211, 124, 198, 241, 52, 237, 139, 155, 20, 233, 140, 55, 147, 68, 77, 166, 106, 81, 213, 250, 74, 125, 165, 213, 65, 147, 92, 31, 208, 242, 169, 90, 30, 239, 165, 143, 196, 85, 247, 121, 147, 38, 181, 170, 75, 30, 224, 105, 121, 27, 197, 246, 172, 39, 109, 6, 209, 42, 208, 13, 148, 153, 97, 247, 38, 168, 185, 76, 42, 102, 145, 166, 27, 242, 37, 136, 45, 245, 32, 200, 177, 225, 248, 154, 117, 172, 184, 37, 156, 208, 100, 151, 64, 16, 193, 254, 213, 205, 140, 207, 153, 64, 155, 57, 47, 237, 59, 231, 10, 130, 204, 72, 30, 17, 60, 76, 115, 161, 237, 104, 5, 38, 254, 90, 152, 208, 49, 194, 160, 243, 106, 78, 41, 251, 143, 104, 130, 180, 241, 98, 211, 238, 194, 224, 36, 242, 39, 109, 180, 67, 130, 210, 44, 8, 162, 150, 16, 76, 83, 40, 86, 97, 87, 187, 42, 50, 63, 35, 98, 192, 23, 138, 236, 90, 3, 157, 19, 5, 252, 228, 211, 239, 1, 85, 190, 54, 144, 218, 221, 184, 19, 89, 75, 138, 53, 115, 206, 31, 100, 99, 187, 80, 162, 222, 134, 167, 238, 117, 84, 36, 62, 178, 224, 147, 119, 160, 65, 244, 245, 157, 188, 184, 222, 42, 53, 188, 84, 51, 5, 22, 214, 229, 92, 249, 17, 78, 6, 79, 145, 92, 201, 53, 58, 45, 87, 90, 19, 194, 253, 18, 68, 87, 58, 48, 206, 85, 241, 173, 40, 0, 38, 75, 210, 227, 254, 150, 117, 168, 88, 41, 180, 31, 77, 239, 136, 37, 106, 222, 33, 63, 239, 217, 245, 29, 11, 255, 94, 181, 132, 91, 80, 152, 15, 224, 253, 187, 104, 191, 95, 180, 55, 108, 24, 65, 32, 27, 147, 201, 102, 102, 64, 245, 14, 196, 154, 169, 133, 191, 117, 49, 108, 75, 133, 72, 95, 48, 126, 1, 166, 187, 129, 223, 94, 96, 39, 225, 222, 196, 210, 129, 35, 24, 186, 145, 6, 173, 82, 67, 130, 97, 167, 138, 167, 57, 181, 228, 249, 247, 44, 29, 9, 140, 245, 49, 164, 210, 119, 91, 176, 15, 31, 206, 88, 229, 155, 23, 72, 114, 224, 237, 190, 194, 147, 133, 233, 170, 22, 64, 241, 162, 204, 52, 208, 138, 159, 29, 94, 25, 117, 103, 132, 232, 65, 198, 90, 183, 113, 6, 76, 52, 141, 199, 166, 170, 128, 199, 251, 60, 137, 86, 78, 52, 16, 72, 64, 112, 174, 67, 54, 73, 63, 55, 183, 30, 11, 48, 131, 7, 94, 151, 17, 166, 115, 62, 5, 221, 71, 30, 137, 35, 181, 250, 187, 68, 26, 187, 51, 202, 249, 76, 162, 63, 10, 144, 123, 119, 217, 155, 15, 214, 212, 52, 39, 208, 109, 210, 206, 230, 242, 186, 254, 170, 138, 52, 40, 130, 7, 102, 67, 28, 38, 106, 152, 122, 172, 184, 166, 81, 30, 236, 149, 213, 236, 174, 130, 140, 44, 143, 199, 9, 118, 58, 11, 30, 126, 139, 39, 128, 92, 83, 242, 207, 200, 157, 245, 147, 84, 207, 140, 120, 59, 56, 228, 145, 177, 130, 48, 139, 78, 101, 124, 42, 228, 129, 172, 14, 248, 144, 142, 189, 38, 158, 58, 85, 84, 75, 136, 180, 175, 13, 184, 0, 26, 128, 234, 151, 167, 40, 6, 163, 8, 23, 57, 69, 42, 89, 174, 50, 0, 216, 186, 166, 7, 143, 123, 95, 23, 26, 134, 127, 125, 199, 117, 26, 215, 129, 212, 119, 83, 2, 66, 96, 247, 126, 241, 49, 171, 186, 222, 146, 234, 115, 199, 123, 112, 79, 147, 53, 210, 95, 192, 166, 49, 137, 245, 80, 120, 14, 184, 242, 237, 131, 27, 141, 100, 178, 185, 54, 245, 152, 55, 243, 88, 45, 122, 48, 229, 214, 55, 118, 105, 222, 26, 189, 68, 42, 21, 34, 57, 165, 246, 109, 35, 84, 45, 76, 196, 116, 127, 88, 180, 10, 179, 103, 226, 208, 33, 91, 111, 12, 231, 221, 166, 64, 199, 93, 87, 58, 164, 108, 23, 126, 169, 216, 119, 68, 104, 24, 51, 156, 71, 175, 181, 93, 184, 124, 171, 34, 72, 115, 95, 148, 72, 166, 241, 178, 223, 36, 10, 12, 219, 50, 172, 139, 152, 26, 232, 185, 249, 95, 249, 8, 244, 20, 78, 136, 141, 145, 169, 168, 2, 208, 9, 30, 37, 50, 149, 47, 50, 17, 64, 214, 168, 32, 23, 228, 232, 31, 78, 219, 77, 8, 80, 253, 41, 79, 8, 123, 65, 234, 36, 78, 151, 23, 68, 18, 70, 10, 9, 9, 33, 142, 129, 115, 143, 191, 127, 209, 141, 202, 189, 55, 120, 16, 148, 184, 122, 178, 77, 10, 149, 18, 30, 6, 101, 53, 90, 155, 239, 253, 82, 57, 11, 125, 84, 7, 175, 116, 62, 210, 232, 112, 130, 253, 105, 153, 203, 31, 120, 251, 241, 45, 41, 127, 96, 146, 11, 187, 180, 115, 21, 63, 182, 213, 196, 175, 255, 162, 31, 233, 65, 197, 110, 42, 136, 54, 118, 234, 176, 3, 252, 83, 4, 107, 133, 19, 226, 34, 163, 232, 31, 39, 171, 178, 242, 36, 69, 64, 33, 167, 139, 81, 184, 160, 207, 119, 37, 137, 40, 165, 50, 167, 243, 188, 82, 142, 91, 2, 0, 209, 16, 166, 152, 134, 113, 185, 236, 253, 161, 120, 90, 94, 189, 81, 201, 224, 60, 66, 82, 23, 12, 199, 197, 86, 198, 16, 54, 174, 237, 121, 186, 244, 141, 50, 26, 152, 120, 78, 52, 71, 115, 40, 94, 156, 22, 162, 241, 219, 90, 212, 236, 21, 153, 170, 142, 20, 200, 251, 49, 98, 192, 173, 14, 167, 199, 167, 176, 235, 111, 61, 243, 30, 215, 35, 113, 127, 122, 250, 79, 162, 40, 130, 81, 31, 51, 177, 240, 9, 31, 192, 210, 151, 171, 78, 201, 50, 102, 227, 75, 196, 239, 232, 175, 240, 119, 205, 191, 180, 209, 68, 123, 86, 244, 114, 244, 209, 7, 35, 17, 16, 89, 133, 89, 42, 9, 18, 124, 21, 252, 101, 244, 88, 79, 214, 234, 145, 140, 52, 118, 47, 44, 121, 43, 14, 6, 157, 26, 16, 172, 252, 85, 94, 84, 59, 134, 19, 119, 10, 70, 91, 157, 246, 8, 74, 32, 15, 23, 230, 2, 205, 188, 103, 237, 92, 19, 88, 21, 147, 135, 117, 124, 107, 140, 39, 152, 51, 56, 246, 122, 153, 174, 106, 145, 140, 146, 78, 180, 243, 212, 62, 46, 3, 131, 137, 78, 56, 79, 160, 252, 117, 84, 126, 199, 194, 240, 227, 23, 188, 40, 206, 72, 68, 40, 58, 91, 183, 80, 40, 31, 65, 9, 70, 23, 34, 64, 199, 213, 138, 80, 140, 58, 202, 215, 115, 223, 92, 181, 218, 116, 252, 210, 190, 210, 54, 166, 241, 66, 132, 62, 98, 109, 158, 51, 52, 89, 69, 24, 171, 176, 235, 116, 175, 18, 111, 80, 167, 209, 170, 150, 194, 152, 23, 96, 162, 41, 244, 232, 80, 85, 76, 226, 126, 240, 196, 214, 81, 40, 183, 225, 102, 10, 166, 57, 231, 230, 232, 149, 164, 116, 112, 122, 0, 182, 53, 199, 252, 55, 50, 111, 243, 200, 64, 191, 29, 240, 86, 187, 126, 133, 121, 249, 249, 37, 58, 174, 209, 39, 152, 103, 151, 131, 127, 207, 154, 14, 188, 239, 28, 107, 33, 10, 57, 82, 158, 116, 63, 225, 29, 103, 80, 134, 84, 245, 37, 13, 1, 70, 95, 180, 82, 191, 0, 67, 243, 67, 218, 148, 30, 248, 160, 133, 92, 83, 190, 197, 251, 150, 117, 28, 178, 121, 17, 16, 209, 4, 188, 155, 55, 82, 134, 128, 3, 104, 142, 132, 144, 32, 101, 0, 223, 166, 79, 49, 108, 64, 231, 162, 6, 27, 94, 116, 68, 235, 168, 36, 115, 39, 191, 151, 28, 202, 228, 35, 90, 53, 172, 170, 173, 151, 236, 174, 197, 19, 85, 216, 192, 158, 128, 35, 6, 88, 21, 25, 158, 92, 18, 213, 22, 136, 119, 149, 124, 213, 103, 197, 6, 206, 174, 36, 196, 199, 208, 68, 57, 84, 28, 218, 251, 214, 75, 157, 254, 46, 61, 228, 188, 87, 93, 125, 155, 38, 175, 4, 36, 160, 31, 177, 70, 222, 245, 85, 246, 69, 109, 45, 77, 151, 175, 202, 23, 17, 139, 66, 77, 166, 155, 251, 82, 156, 11, 77, 102, 222, 20, 170, 255, 232, 162, 41, 73, 26, 89, 118, 58, 126, 212, 207, 108, 55, 5, 136, 150, 240, 223, 185, 103, 231, 115, 182, 189, 39, 164, 162, 182, 112, 113, 11, 93, 250, 108, 247, 231, 143, 172, 67, 223, 221, 224, 24, 116, 128, 119, 232, 143, 90, 27, 149, 49, 226, 195, 238, 66, 233, 15, 97, 137, 170, 155, 236, 124, 185, 95, 192, 121, 36, 82, 76, 249, 31, 46, 102, 185, 14, 243, 30, 244, 217, 184, 156, 156, 207, 35, 38, 89, 107, 212, 139, 75, 161, 16, 78, 232, 76, 209, 7, 92, 94, 80, 159, 58, 162, 138, 216, 206, 231, 93, 85, 198, 140, 90, 200, 170, 79, 118, 26, 52, 168, 111, 165, 224, 91, 45, 85, 42, 162, 142, 55, 0, 19, 167, 142, 86, 74, 235, 43, 230, 3, 162, 93, 33, 239, 43, 181, 253, 155, 106, 28, 48, 150, 43, 234, 102, 187, 247, 187, 40, 43, 158, 33, 48, 242, 214, 95, 182, 126, 3, 25, 218, 47, 163, 140, 217, 6, 221, 199, 57, 76, 182, 244, 110, 49, 168, 240, 129, 31, 226, 185, 35, 18, 185, 189, 2, 17, 190, 134, 137, 29, 76, 118, 48, 216, 33, 188, 103, 160, 66, 143, 23, 230, 255, 24, 238, 6, 111, 18, 214, 163, 244, 30, 36, 4, 216, 31, 162, 60, 127, 235, 203, 67, 34, 69, 20, 227, 220, 56, 107, 78, 81, 10, 160, 169, 19, 255, 211, 126, 46, 77, 46, 152, 46, 114, 135, 139, 23, 3, 172, 52, 80, 86, 11, 5, 190, 51, 86, 190, 67, 0, 75, 17, 160, 229, 12, 254, 152, 221, 3, 213, 220, 213, 244, 51, 157, 73, 251, 206, 213, 43, 113, 247, 245, 189, 52, 226, 250, 109, 212, 4, 168, 132, 24, 137, 160, 175, 219, 204, 156, 32, 253, 121, 8, 209, 200, 96, 88, 93, 66, 243, 84, 76, 148, 142, 229, 86, 31, 106, 10, 23, 136, 200, 132, 152, 150, 51, 125, 202, 13, 202, 63, 110, 38, 125, 12, 113, 17, 162, 92, 217, 24, 108, 235, 209, 81, 65, 202, 179, 60, 176, 11, 91, 62, 45, 126, 96, 9, 66, 153, 134, 11, 40, 231, 205, 66, 5, 249, 92, 99, 119, 206, 105, 108, 207, 79, 44, 61, 10, 179, 18, 7, 33, 15, 68, 204, 40, 214, 171, 223, 177, 98, 94, 176, 243, 165, 152, 231, 154, 1, 67, 226, 236, 109, 137, 202, 72, 234, 243, 23, 156, 41, 105, 118, 40, 72, 112, 147, 53, 76, 126, 158, 255, 145, 213, 214, 43, 241, 194, 125, 227, 104, 241, 196, 244, 237, 140, 214, 62, 210, 249, 207, 143, 58, 106, 182, 10, 75, 247, 114, 19, 127, 210, 217, 102, 190, 200, 149, 36, 59, 137, 204, 222, 223, 123, 63, 215, 84, 249, 49, 149, 83, 137, 205, 224, 192, 44, 166, 101, 109, 181, 98, 219, 17, 169, 186, 35, 11, 108, 131, 75, 185, 220, 58, 214, 129, 67, 15, 106, 220, 67, 76, 7, 247, 154, 201, 146, 25, 224, 51, 169, 180, 61, 73, 169, 216, 163, 64, 179, 144, 61, 184, 163, 163, 8, 113, 40, 42, 53, 46, 80, 50, 199, 156, 6, 138, 44, 86, 130, 12, 195, 251, 191, 99, 122, 127, 116, 155, 248, 205, 86, 172, 49, 197, 132, 101, 124, 32, 23, 225, 78, 252, 23, 182, 27, 10, 93, 135, 220, 98, 246, 62, 157, 134, 102, 1, 113, 244, 65, 39, 3, 106, 168, 22, 142, 16, 64, 140, 15, 80, 99, 35, 22, 179, 165, 166, 85, 100, 233, 90, 229, 18, 78, 92, 204, 255, 218, 224, 121, 218, 149, 146, 101, 90, 237, 209, 141, 172, 71, 193, 90, 175, 189, 165, 169, 88, 27, 15, 197, 225, 132, 32, 122, 215, 89, 92, 130, 175, 160, 186, 201, 20, 61, 64, 162, 133, 3, 43, 242, 1, 253, 252, 181, 136, 253, 218, 163, 130, 111, 36, 14, 133, 7, 219, 204, 145, 34, 32, 170, 193, 236, 151, 74, 74, 147, 76, 138, 107, 121, 122, 117, 158, 28, 246, 50, 255, 135, 138, 164, 17, 38, 164, 210, 75, 174, 116, 208, 146, 145, 163, 54, 161, 142, 104, 242, 253, 76, 97, 186, 92, 131, 69, 189, 217, 241, 225, 157, 78, 37, 78, 96, 220, 194, 3, 246, 214, 121, 178, 93, 26, 46, 165, 137, 4, 223, 97, 14, 94, 50, 52, 234, 50, 86, 69, 141, 165, 121, 202, 152, 37, 85, 22, 135, 212, 233, 30, 106, 208, 152, 10, 196, 23, 144, 2, 199, 18, 43, 47, 236, 83, 30, 54, 249, 7, 145, 116, 239, 36, 191, 115, 171, 101, 77, 39, 102, 167, 249, 152, 234, 193, 141, 24, 143, 254, 132, 241, 49, 221, 223, 189, 103, 12, 245, 20, 240, 213, 121, 152, 82, 69, 179, 192, 186, 6, 66, 56, 22, 22, 144, 240, 125, 87, 13, 248, 93, 108, 229, 245, 148, 14, 62, 131, 45, 100, 201, 63, 68, 118, 249, 66, 98, 132, 141, 74, 140, 20, 220, 81, 134, 141, 172, 190, 199, 149, 205, 93, 57, 45, 113, 240, 15, 161, 4, 122, 228, 28, 150, 220, 183, 88, 226, 51, 117, 6, 107, 122, 39, 165, 25, 15, 197, 199, 149, 157, 131, 214, 44, 253, 240, 247, 241, 139, 229, 232, 212, 218, 113, 23, 188, 132, 147, 250, 252, 14, 145, 7, 246, 101, 27, 190, 155, 27, 224, 20, 37, 63, 2, 54, 38, 5, 34, 186, 2, 107, 221, 161, 66, 248, 217, 63, 79, 202, 83, 53, 253, 127, 87, 252, 108, 133, 175, 14, 82, 140, 132, 150, 94, 234, 120, 120, 214, 32, 234, 53, 81, 60, 107, 255, 166, 188, 89, 153, 9, 173, 234, 85, 244, 11, 76, 217, 190, 22, 16, 147, 80, 23, 113, 126, 241, 84, 57, 134, 84, 152, 42, 97, 158, 176, 247, 138, 249, 54, 110, 103, 112, 170, 52, 238, 109, 27, 131, 137, 84, 37, 53, 162, 45, 12, 135, 228, 179, 197, 44, 163, 143, 33, 0, 125, 198, 45, 122, 93, 252, 148, 208, 163, 242, 99, 126, 195, 122, 247, 103, 141, 22, 208, 148, 113, 236, 210, 223, 57, 241, 128, 9, 40, 105, 207, 109, 69, 229, 204, 238, 98, 124, 100, 227, 17, 185, 226, 18, 119, 192, 50, 24, 98, 196, 187, 230, 224, 60, 191, 157, 41, 179, 95, 76, 153, 6, 217, 232, 93, 2, 110, 41, 148, 140, 203, 9, 156, 225, 174, 26, 16, 1, 182, 20, 242, 221, 114, 72, 21, 141, 226, 213, 200, 17, 198, 16, 100, 176, 216, 73, 240, 76, 6, 237, 78, 200, 119, 77, 39, 240, 158, 31, 148, 131, 187, 63, 232, 210, 64, 179, 250, 232, 53, 78, 40, 18, 89, 33, 39, 140, 209, 56, 112, 249, 146, 222, 7, 127, 161, 65, 146, 33, 146, 127, 56, 114, 32, 84, 80, 24, 112, 229, 230, 213, 94, 91, 148, 244, 109, 13, 157, 111, 51, 201, 173, 173, 66, 136, 150, 6, 111, 111, 154, 11, 17, 116, 13, 27, 209, 242, 59, 99, 21, 169, 222, 68, 72, 222, 164, 61, 217, 201, 53, 205, 33, 15, 141, 10, 80, 10, 215, 82, 125, 43, 165, 54, 184, 26, 151, 71, 203, 206, 50, 58, 57, 161, 52, 168, 22, 242, 179, 125, 111, 43, 91, 87, 3, 7, 126, 177, 54, 163, 148, 93, 255, 55, 124, 43, 141, 72, 166, 34, 147, 163, 135, 0, 50, 126, 152, 165, 1, 244, 118, 95, 96, 80, 4, 187, 206, 110, 239, 214, 183, 209, 125, 252, 40, 182, 126, 134, 2, 45, 182, 138, 179, 2, 102, 138, 101, 19, 92, 134, 39, 69, 120, 57, 190, 57, 130, 245, 73, 221, 23, 174, 183, 93, 28, 157, 42, 231, 217, 206, 139, 115, 38, 188, 129, 124, 12, 110, 89, 108, 132, 51, 142, 244, 135, 245, 251, 68, 128, 56, 218, 26, 248, 129, 34, 157, 167, 84, 138, 245, 95, 64, 172, 74, 9, 252, 17, 188, 73, 110, 229, 78, 230, 153, 231, 44, 191, 46, 126, 39, 241, 123, 223, 46, 47, 39, 69, 139, 118, 7, 184, 183, 166, 171, 61, 112, 200, 111, 196, 61, 123, 217, 188, 193, 102, 212, 105, 92, 0, 159, 27, 176, 74, 50, 250, 107, 68, 26, 196, 203, 239, 0, 42, 184, 35, 143, 14, 106, 172, 76, 147, 112, 100, 25, 215, 41, 170, 126, 95, 108, 218, 82, 36, 9, 116, 177, 182, 123, 254, 190, 56, 53, 125, 239, 66, 243, 145, 10, 61, 102, 57, 109, 197, 80, 159, 97, 253, 120, 48, 249, 97, 177, 2, 185, 153, 14, 201, 121, 165, 107, 133, 118, 248, 220, 68, 206, 96, 137, 154, 121, 215, 217, 189, 74, 76, 204, 222, 35, 222, 227, 83, 52, 77, 180, 122, 123, 184, 249, 212, 240, 22, 200, 136, 194, 206, 111, 120, 162, 253, 186, 155, 213, 149, 39, 97, 252, 132, 95, 70, 241, 47, 54, 19, 143, 188, 149, 148, 238, 161, 194, 121, 17, 93, 111, 133, 242, 201, 212, 183, 138, 152, 178, 37, 230, 140, 107, 137, 122, 163, 75, 5, 135, 225, 186, 32, 50, 131, 104, 197, 16, 87, 163, 180, 251, 170, 27, 181, 241, 85, 179, 126, 116, 219, 206, 79, 242, 5, 101, 41, 165, 80, 223, 66, 32, 68, 71, 88, 53, 117, 216, 209, 172, 112, 212, 129, 152, 49, 109, 61, 236, 79, 222, 156, 11, 239, 31, 202, 61, 123, 205, 58, 128, 7, 95, 27, 139, 135, 91, 119, 192, 187, 13, 99, 165, 103, 254, 140, 195, 234, 100, 79, 231, 154, 176, 233, 82, 214, 191, 60, 193, 53, 143, 213, 250, 131, 91, 40, 145, 225, 212, 106, 77, 201, 106, 185, 120, 141, 225, 195, 5, 110, 132, 235, 189, 95, 42, 90, 55, 194, 116, 222, 147, 91, 172, 175, 220, 232, 23, 95, 201, 4, 150, 102, 250, 23, 196, 86, 120, 28, 42, 188, 48, 46, 144, 66, 85, 124, 42, 187, 137, 212, 196, 230, 245, 111, 147, 204, 161, 63, 35, 100, 22, 144, 232, 208, 88, 101, 151, 10, 31, 210, 90, 1, 4, 202, 135, 120, 102, 81, 121, 189, 201, 44, 222, 209, 48, 188, 152, 108, 250, 65, 173, 13, 240, 1, 123, 109, 36, 163, 137, 172, 69, 250, 162, 10, 75, 89, 57, 102, 147, 77, 18, 93, 4, 104, 216, 225, 207, 229, 24, 57, 187, 228, 99, 218, 204, 58, 115, 44, 120, 209, 99, 200, 214, 156, 221, 139, 17, 131, 159, 164, 233, 160, 6, 2, 27, 15, 60, 204, 219, 18, 190, 164, 210, 203, 188, 34, 116, 36, 134, 101, 193, 75, 88, 189, 222, 245, 174, 203, 0, 199, 161, 57, 22, 4, 219, 77, 24, 36, 141, 70, 215, 219, 31, 92, 105, 10, 70, 102, 169, 244, 215, 230, 169, 88, 240, 157, 190, 5, 130, 186, 232, 76, 117, 45, 230, 181, 115, 67, 35, 172, 15, 165, 30, 125, 180, 57, 245, 25, 97, 244, 170, 182, 180, 107, 24, 231, 195, 140, 97, 50, 220, 220, 193, 196, 144, 49, 32, 90, 62, 206, 109, 85, 35, 135, 220, 249, 255, 78, 103, 207, 98, 156, 228, 213, 254, 22, 231, 247, 191, 152, 250, 37, 8, 172, 204, 136, 181, 30, 75, 9, 174, 226, 175, 172, 238, 237, 107, 27, 230, 46, 197, 240, 140, 162, 225, 65, 165, 249, 209, 49, 152, 19, 102, 96, 96, 206, 145, 40, 39, 155, 68, 8, 228, 176, 0, 112, 6, 27, 164, 12, 220, 185, 140, 95, 71, 202, 125, 234, 15, 246, 52, 206, 5, 103, 198, 6, 65, 12, 209, 87, 223, 121, 239, 124, 120, 128, 156, 194, 250, 239, 133, 247, 227, 76, 107, 73, 38, 228, 241, 33, 19, 61, 138, 70, 37, 45, 58, 239, 13, 176, 27, 17, 41, 202, 233, 62, 223, 175, 157, 36, 234, 192, 23, 180, 64, 61, 231, 103, 173, 83, 169, 241, 51, 201, 81, 67, 217, 79, 246, 203, 247, 233, 117, 253, 153, 252, 50, 54, 251, 120, 254, 215, 105, 168, 47, 128, 61, 139, 243, 91, 142, 166, 179, 26, 97, 65, 171, 167, 244, 114, 188, 192, 101, 23, 55, 115, 205, 222, 209, 59, 111, 83, 147, 188, 26, 163, 123, 244, 252, 98, 148, 104, 110, 81, 27, 167, 67, 200, 85, 251, 80, 163, 117, 36, 78, 137, 95, 34, 59, 163, 172, 164, 89, 247, 72, 64, 181, 41, 86, 255, 184, 158, 238, 185, 226, 70, 112, 123, 179, 3, 73, 1, 111, 110, 161, 49, 29, 112, 124, 244, 110, 238, 247, 14, 14, 76, 199, 159, 197, 179, 250, 244, 247, 85, 172, 56, 98, 70, 232, 99, 204, 226, 75, 121, 73, 239, 205, 191, 210, 74, 92, 4, 0, 234, 193, 196, 194, 173, 68, 44, 15, 40, 155, 166, 205, 197, 52, 207, 169, 123, 143, 5, 179, 234, 31, 202, 86, 56, 24, 233, 62, 121, 211, 133, 19, 209, 88, 32, 158, 85, 70, 85, 248, 249, 48, 225, 47, 86, 13, 128, 6, 140, 36, 31, 128, 58, 215, 176, 81, 129, 125, 172, 224, 209, 207, 246, 173, 207, 193, 22, 97, 60, 173, 183, 77, 253, 155, 18, 178, 36, 113, 186, 216, 70, 53, 47, 176, 176, 110, 88, 134, 81, 218, 164, 230, 45, 241, 27, 80, 100, 97, 7, 241, 118, 72, 200, 165, 187, 155, 190, 94, 40, 30, 205, 153, 71, 104, 141, 15, 220, 15, 153, 177, 200, 155, 239, 120, 101, 136, 17, 153, 255, 88, 163, 185, 221, 199, 216, 98, 69, 95, 59, 175, 164, 233, 253, 133, 225, 2, 156, 121, 93, 233, 11, 172, 164, 252, 66, 25, 59, 141, 195, 114, 131, 224, 50, 139, 227, 135, 240, 4, 171, 14, 206, 140, 207, 55, 211, 159, 135, 8, 193, 239, 233, 207, 53, 244, 238, 84, 19, 73, 1, 94, 104, 42, 148, 26, 3, 101, 198, 153, 239, 239, 34, 230, 253, 108, 6, 54, 59, 54, 252, 49, 86, 67, 90, 174, 196, 140, 239, 181, 64, 85, 11, 44, 9, 229, 249, 136, 72, 125, 199, 191, 242, 156, 145, 81, 70, 193, 44, 181, 133, 36, 211, 242, 30, 144, 244, 7, 89, 97, 98, 244, 61, 184, 3, 174, 101, 173, 221, 239, 145, 166, 225, 182, 82, 202, 76, 76, 150, 198, 93, 120, 100, 254, 47, 21, 168, 61, 38, 165, 48, 31, 76, 59, 37, 89, 106, 87, 203, 179, 248, 156, 162, 64, 50, 76, 5, 123, 113, 9, 215, 226, 23, 205, 44, 245, 117, 179, 251, 160, 106, 205, 130, 187, 253, 151, 224, 24, 32, 107, 210, 221, 62, 9, 133, 192, 119, 143, 232, 69, 204, 98, 5, 86, 121, 17, 245, 180, 249, 233, 48, 185, 56, 62, 20, 215, 140, 6, 220, 139, 44, 46, 180, 236, 215, 250, 81, 195, 254, 101, 135, 40, 135, 235, 141, 22, 183, 1, 31, 3, 89, 252, 87, 207, 58, 24, 161, 225, 28, 217, 174, 122, 71, 46, 100, 25, 85, 189, 177, 45, 185, 53, 210, 109, 222, 240, 244, 82, 75, 188, 17, 191, 45, 184, 220, 132, 105, 75, 151, 12, 5, 236, 148, 150, 10, 22, 199, 26, 143, 142, 159, 137, 87, 142, 70, 241, 67, 5, 15, 235, 87, 20, 224, 207, 210, 38, 60, 245, 34, 238, 108, 193, 204, 194, 179, 7, 131, 158, 63, 245, 255, 95, 34, 247, 63, 100, 39, 85, 51, 182, 220, 69, 125, 88, 223, 39, 160, 176, 115, 100, 232, 150, 20, 40, 205, 132, 231, 201, 97, 40, 66, 207, 53, 195, 39, 59, 4, 191, 140, 210, 66, 46, 104, 196, 64, 35, 22, 151, 210, 88, 220, 108, 96, 95, 175, 97, 70, 25, 90, 111, 112, 123, 106, 204, 22, 59, 106, 248, 232, 178, 149, 32, 36, 16, 254, 191, 202, 95, 177, 177, 116, 95, 213, 205, 170, 254, 96, 184, 233, 166, 10, 156, 95, 254, 105, 205, 55, 158, 61, 129, 215, 98, 230, 107, 3, 63, 157, 155, 207, 247, 157, 79, 254, 138, 189, 94, 248, 244, 152, 167, 111, 16, 202, 234, 81, 38, 253, 1, 180, 210, 24, 89, 184, 252, 85, 6, 35, 223, 9, 34, 83, 254, 224, 69, 138, 199, 37, 90, 24, 21, 136, 15, 51, 50, 30, 54, 216, 227, 156, 117, 242, 100, 52, 163, 89, 33, 164, 98, 17, 89, 176, 21, 155, 15, 146, 216, 86, 117, 168, 3, 121, 75, 252, 116, 80, 199, 162, 215, 74, 4, 31, 118, 186, 206, 249, 116, 221, 99, 65, 54, 33, 13, 78, 210, 35, 210, 53, 122, 190, 198, 221, 183, 134, 204, 79, 8, 25, 210, 188, 253, 85, 201, 46, 250, 3, 232, 208, 37, 12, 223, 72, 151, 148, 238, 168, 204, 252, 31, 1, 28, 118, 248, 170, 149, 73, 59, 32, 202, 101, 151, 15, 8, 189, 163, 217, 141, 150, 116, 65, 129, 166, 147, 54, 1, 66, 214, 228, 77, 76, 12, 105, 1, 82, 129, 123, 28, 50, 106, 239, 115, 189, 81, 165, 89, 64, 162, 72, 173, 162, 12, 143, 161, 42, 195, 52, 49, 79, 130, 231, 207, 125, 113, 21, 43, 184, 120, 97, 79, 162, 36, 125, 204, 253, 23, 235, 22, 87, 250, 129, 46, 51, 140, 184, 122, 5, 176, 91, 77, 121, 99, 94, 246, 217, 247, 181, 100, 190, 81, 43, 71, 97, 216, 82, 144, 50, 215, 72, 88, 136, 202, 167, 146, 20, 108, 111, 48, 8, 128, 77, 59, 179, 227, 116, 102, 106, 170, 123, 183, 150, 15, 20, 226, 177, 244, 199, 210, 225, 96, 11, 232, 230, 107, 230, 92, 88, 7, 200, 250, 162, 143, 245, 215, 194, 174, 126, 31, 145, 211, 158, 210, 125, 222, 86, 80, 105, 207, 96, 197, 240, 16, 121, 229, 16, 43, 32, 18, 97, 116, 249, 105, 53, 10, 109, 163, 226, 90, 43, 205, 27, 190, 20, 75, 5, 119, 97, 81, 100, 236, 30, 13, 42, 30, 148, 237, 225, 149, 35, 17, 17, 5, 142, 35, 250, 215, 197, 155, 17, 111, 145, 129, 53, 57, 0, 200, 249, 89, 176, 189, 1, 116, 36, 15, 140, 182, 95, 214, 143, 116, 235, 82, 165, 53, 192, 181, 183, 131, 106, 5, 142, 35, 31, 235, 177, 90, 203, 121, 167, 216, 165, 33, 47, 225, 21, 227, 222, 235, 82, 74, 195, 197, 215, 79, 205, 108, 145, 185, 88, 224, 207, 185, 43, 148, 199, 55, 206, 55, 53, 36, 83, 228, 15, 155, 240, 52, 139, 36, 169, 202, 140, 11, 148, 201, 100, 116, 5, 4, 93, 209, 255, 14, 104, 27, 30, 138, 224, 182, 136, 68, 27, 18, 127, 61, 231, 13, 79, 211, 129, 170, 83, 133, 121, 42, 201, 91, 161, 157, 93, 92, 228, 230, 85, 42, 72, 252, 142, 85, 49, 49, 90, 248, 105, 64, 101, 17, 183, 104, 71, 66, 88, 231, 243, 185, 127, 109, 96, 16, 144, 67, 137, 142, 51, 15, 176, 229, 195, 244, 121, 225, 235, 1, 47, 26, 187, 199, 29, 84, 42, 209, 192, 23, 24, 66, 139, 105, 59, 42, 98, 42, 59, 121, 42, 19, 252, 216, 83, 170, 15, 153, 227, 209, 242, 192, 84, 127, 225, 7, 106, 52, 122, 11, 197, 13, 114, 196, 194, 67, 217, 106, 201, 9, 33, 188, 44, 80, 156, 138, 13, 234, 189, 29, 240, 190, 247, 231, 194, 113, 145, 182, 63, 184, 81, 203, 88, 173, 43, 148, 126, 63, 55, 30, 179, 169, 8, 4, 211, 7, 73, 48, 152, 169, 65, 139, 239, 39, 42, 66, 67, 209, 4, 20, 102, 193, 58, 22, 155, 229, 248, 233, 99, 238, 62, 173, 71, 56, 43, 153, 129, 253, 161, 69, 87, 94, 50, 53, 1, 18, 167, 179, 253, 232, 5, 244, 180, 73, 202, 206, 199, 177, 156, 168, 144, 156, 112, 247, 187, 93, 121, 233, 149, 16, 80, 145, 67, 175, 57, 252, 185, 218, 56, 13, 0, 164, 160, 84, 19, 68, 168, 14, 89, 77, 225, 2, 14, 83, 124, 56, 55, 162, 229, 39, 196, 249, 27, 240, 90, 133, 241, 237, 79, 169, 233, 173, 143, 255, 36, 249, 166, 116, 116, 177, 216, 149, 224, 26, 64, 44, 177, 25, 5, 253, 13, 50, 65, 237, 15, 138, 43, 95, 108, 20, 129, 184, 138, 121, 110, 240, 91, 12, 102, 187, 183, 232, 196, 253, 140, 90, 174, 171, 9, 150, 159, 88, 97, 56, 227, 158, 92, 227, 209, 227, 137, 248, 248, 182, 167, 229, 110, 188, 85, 30, 74, 7, 72, 99, 106, 178, 181, 90, 248, 101, 59, 184, 64, 26, 188, 1, 76, 145, 191, 118, 78, 161, 90, 157, 108, 121, 235, 154, 90, 112, 236, 204, 226, 67, 193, 204, 136, 84, 224, 47, 165, 0, 44, 46, 226, 144, 113, 146, 133, 73, 73, 101, 61, 49, 183, 45, 136, 209, 10, 185, 207, 24, 241, 253, 134, 113, 248, 233, 113, 75, 161, 177, 2, 66, 216, 62, 176, 59, 4, 163, 90, 175, 96, 238, 243, 195, 62, 32, 61, 225, 75, 178, 126, 96, 109, 122, 231, 239, 180, 196, 203, 20, 193, 0, 203, 49, 146, 34, 127, 250, 192, 204, 89, 255, 86, 9, 155, 120, 161, 237, 64, 148, 50, 54, 120, 95, 190, 121, 93, 65, 125, 191, 202, 190, 16, 112, 191, 77, 28, 125, 90, 84, 128, 7, 218, 251, 177, 71, 144, 162, 60, 43, 217, 255, 49, 53, 101, 131, 42, 192, 64, 123, 188, 33, 217, 147, 248, 63, 75, 61, 69, 149, 248, 90, 112, 148, 132, 15, 114, 114, 66, 235, 198, 222, 166, 108, 140, 172, 248, 14, 252, 63, 158, 153, 145, 61, 115, 160, 194, 30, 202, 34, 18, 158, 139, 132, 175, 73, 77, 36, 10, 85, 156, 180, 44, 92, 245, 67, 124, 21, 55, 3, 181, 208, 16, 78, 144, 45, 150, 153, 171, 99, 203, 120, 102, 144, 205, 149, 16, 168, 245, 60, 67, 171, 105, 163, 74, 101, 197, 243, 77, 206, 187, 79, 125, 54, 232, 50, 99, 60, 209, 21, 224, 203, 240, 54, 5, 64, 190, 113, 52, 43, 114, 153, 57, 24, 246, 249, 67, 5, 116, 108, 167, 24, 152, 157, 145, 145, 184, 135, 9, 21, 19, 40, 208, 87, 254, 48, 249, 255, 162, 39, 75, 119, 20, 188, 245, 166, 23, 134, 69, 64, 7, 242, 184, 89, 17, 166, 36, 158, 76, 105, 235, 212, 75, 14, 179, 168, 51, 204, 42, 50, 187, 5, 118, 76, 173, 58, 155, 172, 195, 168, 44, 28, 129, 9, 188, 8, 114, 79, 57, 233, 150, 175, 36, 213, 59, 176, 207, 25, 10, 148, 80, 3, 116, 14, 120, 161, 233, 250, 36, 212, 116, 26, 203, 37, 129, 42, 24, 65, 190, 157, 65, 193, 132, 195, 181, 27, 125, 161, 237, 17, 53, 203, 32, 29, 134, 120, 218, 120, 84, 139, 39, 121, 244, 190, 167, 179, 165, 113, 169, 219, 31, 137, 86, 15, 43, 237, 99, 71, 43, 151, 167, 221, 182, 112, 157, 111, 40, 91, 133, 17, 87, 222, 83, 221, 39, 188, 149, 51, 45, 135, 104, 27, 148, 246, 248, 28, 160, 219, 125, 198, 41, 151, 206, 26, 167, 167, 94, 41, 105, 251, 4, 35, 251, 166, 1, 111, 156, 209, 126, 39, 93, 105, 234, 197, 64, 185, 177, 48, 182, 153, 99, 34, 27, 109, 126, 192, 183, 20, 117, 131, 209, 93, 37, 71, 96, 87, 4, 183, 52, 16, 4, 125, 12, 53, 9, 76, 104, 151, 170, 9, 186, 74, 152, 140, 173, 231, 52, 113, 11, 115, 6, 75, 62, 208, 192, 102, 71, 112, 204, 74, 206, 20, 82, 5, 153, 16, 194, 186, 179, 190, 170, 219, 251, 109, 24, 88, 223, 137, 185, 190, 217, 168, 80, 101, 210, 105, 223, 115, 124, 71, 91, 192, 48, 42, 206, 220, 14, 48, 3, 232, 99, 51, 247, 39, 146, 151, 148, 230, 92, 113, 123, 184, 124, 169, 55, 5, 249, 226, 156, 86, 81, 167, 144, 164, 169, 73, 241, 61, 56, 20, 247, 116, 172, 147, 170, 3, 6, 80, 189, 3, 220, 11, 62, 56, 129, 179, 145, 205, 91, 46, 65, 29, 114, 184, 208, 118, 239, 103, 33, 224, 177, 109, 150, 19, 19, 100, 136, 166, 97, 101, 168, 9, 7, 29, 143, 169, 93, 186, 76, 23, 3, 227, 93, 240, 235, 94, 195, 2, 46, 188, 75, 37, 252, 60, 62, 186, 250, 143, 133, 96, 127, 208, 127, 55, 176, 247, 232, 99, 196, 99, 197, 107, 162, 234, 47, 109, 27, 121, 66, 73, 160, 1, 52, 29, 72, 89, 252, 231, 65, 236, 250, 198, 186, 129, 21, 102, 98, 57, 20, 184, 221, 174, 48, 37, 11, 185, 123, 187, 102, 78, 92, 3, 69, 161, 222, 33, 150, 250, 117, 85, 118, 111, 4, 145, 242, 62, 255, 27, 48, 72, 87, 253, 32, 157, 130, 68, 63, 224, 223, 227, 29, 217, 177, 173, 61, 206, 34, 14, 205, 70, 161, 224, 28, 131, 197, 203, 105, 33, 178, 131, 144, 186, 147, 119, 167, 172, 7, 116, 52, 214, 52, 191, 16, 20, 138, 241, 150, 60, 17, 30, 90, 22, 144, 187, 227, 163, 134, 176, 66, 121, 14, 1, 232, 99, 93, 57, 25, 113, 177, 243, 126, 46, 49, 0, 67, 207, 198, 255, 38, 164, 52, 221, 52, 220, 90, 196, 191, 73, 33, 136, 99, 74, 195, 31, 231, 194, 199, 182, 140, 82, 157, 188, 8, 12, 81, 84, 107, 2, 2, 35, 89, 168, 58, 130, 16, 60, 88, 163, 212, 87, 132, 194, 194, 63, 187, 98, 243, 115, 64, 245, 175, 9, 218, 0, 32, 210, 197, 40, 166, 44, 15, 234, 238, 33, 153, 224, 250, 120, 51, 0, 227, 120, 219, 44, 30, 86, 64, 104, 234, 171, 137, 78, 125, 204, 253, 60, 134, 211, 218, 47, 15, 145, 50, 231, 108, 143, 126, 99, 80, 109, 242, 211, 146, 142, 83, 22, 234, 150, 48, 123, 227, 52, 208, 213, 137, 83, 217, 82, 43, 155, 212, 230, 162, 139, 107, 243, 220, 45, 253, 220, 250, 97, 103, 239, 54, 14, 22, 131, 74, 171, 99, 219, 98, 40, 216, 176, 158, 82, 250, 106, 254, 2, 99, 49, 56, 168, 119, 184, 140, 182, 116, 186, 29, 103, 223, 20, 9, 95, 6, 36, 28, 134, 90, 8, 57, 65, 158, 33, 238, 155, 61, 210, 236, 126, 109, 144, 252, 222, 44, 104, 106, 212, 140, 195, 31, 222, 141, 131, 55, 1, 160, 236, 52, 155, 170, 173, 154, 85, 238, 6, 154, 93, 244, 172, 20, 207, 3, 249, 143, 52, 22, 77, 100, 14, 227, 254, 35, 66, 27, 37, 222, 98, 7, 22, 145, 202, 214, 116, 214, 33, 222, 138, 32, 154, 51, 86, 104, 119, 28, 107, 68, 13, 217, 155, 196, 223, 205, 180, 94, 22, 149, 156, 167, 202, 45, 125, 37, 105, 207, 145, 26, 162, 155, 167, 7, 155, 51, 201, 3, 72, 182, 154, 209, 14, 197, 215, 140, 114, 186, 121, 172, 94, 77, 16, 142, 0, 103, 184, 23, 29, 55, 101, 211, 60, 229, 54, 78, 121, 246, 79, 212, 96, 239, 52, 182, 132, 42, 214, 208, 28, 48, 252, 79, 113, 145, 90, 110, 46, 145, 190, 80, 63, 166, 210, 77, 34, 111, 125, 51, 102, 10, 3, 194, 209, 9, 160, 15, 155, 36, 235, 142, 252, 125, 174, 44, 186, 78, 171, 54, 62, 14, 227, 191, 192, 234, 43, 84, 99, 96, 201, 1, 12, 101, 98, 237, 12, 249, 186, 148, 221, 17, 209, 11, 181, 148, 166, 177, 44, 162, 16, 85, 35, 214, 85, 114, 100, 249, 76, 82, 74, 70, 30, 146, 99, 230, 15, 157, 117, 154, 219, 131, 163, 193, 175, 216, 30, 147, 176, 224, 116, 82, 144, 224, 131, 249, 50, 247, 196, 237, 65, 178, 102, 105, 252, 20, 31, 166, 17, 217, 207, 140, 216, 254, 123, 59, 77, 17, 111, 98, 168, 210, 237, 76, 110, 107, 16, 100, 40, 46, 208, 81, 201, 160, 52, 137, 25, 180, 136, 37, 214, 173, 172, 95, 113, 210, 195, 95, 222, 172, 118, 119, 189, 98, 253, 123, 107, 18, 98, 111, 201, 224, 197, 109, 136, 150, 149, 5, 87, 124, 188, 37, 201, 73, 198, 26, 6, 62, 134, 188, 136, 206, 126, 101, 46, 234, 17, 202, 47, 135, 223, 57, 59, 53, 114, 38, 89, 31, 1, 76, 76, 238, 143, 11, 190, 30, 76, 230, 46, 162, 51, 0, 186, 207, 126, 107, 219, 156, 18, 104, 247, 158, 244, 145, 20, 84, 31, 68, 141, 55, 190, 221, 105, 102, 56, 81, 154, 125, 71, 123, 126, 236, 179, 81, 231, 220, 167, 119, 206, 115, 106, 59, 166, 166, 3, 137, 43, 56, 32, 5, 45, 215, 145, 162, 47, 148, 234, 114, 18, 3, 166, 248, 209, 117, 192, 103, 35, 83, 79, 19, 212, 230, 12, 128, 214, 142, 148, 173, 234, 212, 62, 78, 144, 8, 141, 63, 252, 255, 188, 27, 191, 132, 53, 215, 220, 19, 191, 75, 253, 145, 230, 122, 156, 115, 250, 73, 171, 210, 22, 233, 244, 91, 58, 47, 75, 68, 116, 182, 98, 182, 75, 66, 36, 159, 64, 205, 176, 102, 50, 237, 38, 107, 148, 58, 61, 64, 1, 249, 68, 75, 235, 104, 25, 228, 147, 233, 46, 25, 190, 118, 196, 34, 39, 1, 60, 201, 67, 77, 64, 9, 43, 0, 150, 41, 73, 57, 254, 211, 96, 93, 129, 231, 63, 12, 177, 106, 238, 70, 73, 87, 251, 7, 254, 51, 212, 34, 34, 137, 127, 209, 207, 70, 60, 68, 71, 74, 208, 119, 211, 153, 100, 173, 21, 178, 95, 113, 6, 103, 244, 204, 200, 141, 58, 156, 13, 21, 109, 169, 215, 206, 184, 10, 248, 214, 219, 2, 22, 108, 37, 247, 157, 102, 167, 253, 142, 139, 177, 62, 243, 59, 147, 69, 231, 150, 123, 177, 231, 224, 33, 29, 75, 184, 115, 143, 218, 4, 10, 125, 35, 50, 201, 143, 44, 175, 108, 206, 247, 152, 81, 249, 135, 221, 23, 132, 80, 104, 24, 6, 10, 208, 155, 97, 45, 9, 52, 29, 232, 152, 176, 75, 242, 241, 111, 128, 127, 144, 96, 159, 171, 73, 250, 52, 163, 43, 158, 232, 89, 227, 65, 219, 151, 153, 227, 61, 46, 232, 177, 170, 203, 237, 9, 253, 225, 222, 224, 200, 86, 146, 180, 104, 8, 15, 189, 184, 94, 177, 36, 57, 170, 206, 62, 47, 152, 67, 77, 106, 10, 26, 180, 44, 124, 175, 5, 81, 96, 215, 143, 142, 152, 61, 2, 81, 216, 66, 142, 216, 71, 8, 175, 245, 51, 144, 186, 166, 28, 230, 64, 159, 150, 90, 249, 65, 151, 10, 136, 91, 38, 146, 1, 243, 23, 141, 224, 125, 108, 4, 166, 186, 241, 55, 10, 202, 251, 230, 96, 252, 248, 197, 48, 29, 239, 129, 204, 184, 15, 10, 89, 130, 175, 144, 59, 155, 33, 171, 121, 32, 19, 252, 109, 220, 191, 115, 237, 37, 243, 233, 121, 122, 90, 250, 66, 142, 44, 35, 203, 218, 145, 243, 140, 28, 161, 213, 153, 231, 76, 138, 76, 251, 151, 7, 11, 64, 193, 73, 230, 191, 196, 153, 83, 5, 94, 107, 104, 1, 65, 203, 149, 153, 209, 76, 82, 60, 0, 21, 153, 63, 172, 119, 106, 223, 51, 212, 244, 144, 25, 25, 126, 216, 9, 93, 42, 46, 188, 134, 154, 195, 84, 46, 126, 128, 136, 111, 21, 90, 103, 219, 198, 39, 161, 53, 255, 151, 213, 105, 135, 115, 226, 94, 28, 48, 252, 80, 33, 60, 213, 206, 247, 191, 175, 195, 227, 118, 54, 185, 205, 195, 248, 11, 238, 202, 13, 236, 38, 182, 1, 1, 51, 111, 190, 234, 249, 87, 189, 234, 35, 148, 226, 72, 131, 77, 249, 214, 48, 36, 116, 58, 228, 77, 168, 222, 190, 115, 193, 157, 174, 213, 105, 120, 23, 98, 134, 22, 205, 150, 192, 202, 128, 65, 128, 85, 254, 99, 135, 227, 170, 80, 96, 234, 225, 173, 172, 156, 179, 234, 81, 185, 34, 227, 155, 41, 242, 244, 138, 148, 58, 255, 232, 63, 146, 184, 233, 157, 105, 206, 181, 53, 42, 165, 59, 77, 71, 206, 219, 169, 168, 246, 61, 114, 171, 147, 22, 101, 218, 92, 93, 58, 103, 80, 240, 152, 80, 137, 179, 181, 175, 203, 245, 111, 231, 4, 41, 158, 94, 224, 189, 172, 122, 97, 92, 93, 126, 47, 229, 239, 52, 225, 102, 38, 25, 61, 196, 121, 227, 94, 27, 148, 133, 61, 98, 247, 7, 82, 187, 159, 106, 74, 51, 245, 171, 42, 69, 188, 227, 34, 178, 136, 210, 137, 62, 86, 101, 8, 204, 106, 6, 234, 105, 133, 51, 69, 50, 164, 84, 182, 73, 94, 107, 10, 134, 19, 165, 111, 191, 145, 238, 0, 8, 188, 57, 123, 185, 132, 9, 169, 43, 215, 92, 74, 108, 176, 219, 88, 26, 227, 255, 172, 198, 175, 40, 106, 120, 227, 148, 24, 151, 195, 121, 182, 70, 177, 251, 105, 27, 168, 16, 142, 207, 176, 74, 47, 217, 161, 139, 28, 60, 228, 196, 246, 233, 249, 184, 212, 36, 196, 96, 125, 79, 197, 37, 17, 133, 251, 89, 226, 187, 232, 38, 238, 158, 183, 92, 96, 35, 3, 28, 247, 68, 111, 103, 174, 110, 81, 164, 146, 165, 195, 219, 114, 27, 207, 83, 255, 253, 126, 88, 242, 198, 111, 102, 218, 249, 114, 9, 153, 221, 223, 176, 188, 88, 17, 208, 46, 178, 238, 36, 253, 109, 224, 222, 79, 154, 125, 18, 200, 101, 116, 57, 1, 129, 97, 201, 151, 111, 183, 222, 140, 135, 114, 156, 95, 84, 178, 241, 159, 177, 112, 62, 25, 125, 115, 232, 102, 251, 62, 203, 14, 5, 150, 92, 99, 241, 219, 53, 250, 69, 48, 65, 141, 243, 130, 124, 225, 30, 176, 59, 17, 175, 145, 254, 49, 241, 235, 137, 226, 136, 42, 0, 251, 160, 205, 156, 192, 10, 9, 85, 55, 14, 59, 38, 172, 192, 24, 221, 66, 54, 237, 238, 147, 90, 228, 189, 22, 9, 220, 164, 100, 218, 76, 176, 128, 184, 136, 152, 252, 67, 162, 227, 119, 133, 5, 15, 108, 130, 165, 211, 24, 19, 34, 74, 234, 209, 206, 203, 5, 232, 5, 133, 92, 251, 111, 242, 81, 57, 100, 12, 116, 139, 189, 113, 167, 141, 181, 174, 47, 10, 105, 237, 10, 170, 195, 140, 245, 184, 206, 44, 7, 175, 182, 148, 159, 209, 239, 141, 192, 194, 7, 189, 225, 93, 37, 161, 90, 81, 167, 97, 32, 161, 12, 147, 110, 81, 128, 14, 78, 146, 252, 19, 252, 221, 57, 196, 233, 98, 192, 166, 49, 199, 150, 96, 30, 247, 169, 183, 252, 210, 201, 226, 23, 114, 193, 229, 123, 251, 93, 187, 191, 44, 195, 214, 222, 243, 9, 180, 215, 34, 89, 67, 220, 162, 195, 200, 67, 126, 247, 59, 142, 35, 82, 238, 128, 25, 51, 135, 152, 238, 100, 52, 59, 118, 152, 147, 111, 133, 138, 41, 196, 210, 24, 241, 10, 35, 73, 163, 94, 97, 181, 32, 144, 24, 172, 191, 205, 12, 25, 230, 108, 130, 138, 248, 164, 98, 141, 92, 99, 56, 180, 192, 55, 63, 70, 173, 164, 57, 26, 95, 135, 243, 255, 159, 211, 163, 47, 128, 71, 155, 98, 187, 81, 159, 191, 1, 55, 225, 241, 16, 174, 240, 168, 122, 37, 40, 97, 207, 157, 157, 176, 7, 252, 81, 133, 214, 128, 83, 249, 33, 72, 143, 4, 87, 8, 197, 231, 21, 222, 74, 138, 132, 149, 108, 102, 24, 221, 154, 83, 187, 80, 31, 7, 63, 116, 180, 169, 84, 202, 18, 188, 14, 118, 98, 166, 75, 244, 10, 1, 219, 79, 105, 163, 0, 249, 253, 96, 86, 201, 39, 97, 83, 83, 174, 48, 249, 73, 39, 191, 208, 168, 34, 67, 151, 254, 16, 18, 135, 92, 157, 224, 225, 41, 254, 45, 203, 41, 197, 216, 141, 15, 210, 33, 219, 67, 189, 220, 69, 50, 19, 79, 43, 75, 122, 1, 93, 44, 65, 197, 15, 29, 234, 39, 175, 233, 136, 5, 65, 123, 116, 109, 136, 63, 92, 59, 31, 158, 1, 40, 219, 158, 94, 39, 236, 207, 198, 124, 247, 209, 150, 168, 146, 27, 164, 80, 109, 251, 220, 101, 150, 29, 142, 44, 199, 71, 232, 27, 36, 118, 69, 230, 84, 26, 172, 252, 227, 46, 19, 35, 168, 239, 5, 15, 220, 128, 95, 212, 106, 205, 242, 56, 128, 9, 20, 28, 24, 33, 11, 177, 244, 110, 237, 131, 233, 183, 223, 121, 115, 90, 225, 223, 160, 83, 66, 136, 70, 58, 153, 13, 104, 136, 207, 39, 234, 129, 140, 247, 219, 176, 72, 120, 211, 185, 133, 118, 131, 212, 59, 186, 178, 199, 228, 54, 231, 97, 187, 224, 97, 237, 206, 215, 9, 22, 12, 12, 147, 21, 38, 165, 78, 149, 245, 145, 118, 103, 245, 129, 120, 5, 142, 49, 0, 211, 224, 239, 77, 114, 48, 172, 158, 171, 19, 224, 201, 82, 218, 78, 168, 91, 134, 15, 40, 187, 114, 42, 26, 8, 142, 211, 61, 233, 8, 155, 177, 147, 149, 232, 160, 1, 177, 135, 245, 144, 69, 22, 157, 156, 200, 109, 133, 201, 157, 212, 254, 134, 213, 191, 255, 101, 255, 20, 235, 105, 62, 221, 210, 159, 64, 246, 136, 181, 60, 41, 149, 129, 224, 46, 79, 173, 136, 105, 125, 192, 244, 16, 236, 172, 194, 247, 136, 160, 191, 219, 24, 101, 151, 204, 189, 254, 69, 160, 79, 84, 149, 43, 108, 90, 65, 16, 75, 49, 182, 29, 211, 188, 135, 145, 131, 108, 143, 97, 95, 38, 38, 244, 117, 92, 157, 91, 38, 118, 118, 134, 108, 123, 83, 215, 239, 228, 186, 45, 112, 202, 166, 127, 199, 80, 183, 251, 112, 113, 237, 49, 148, 92, 31, 54, 242, 208, 12, 47, 101, 74, 79, 19, 78, 122, 60, 125, 85, 133, 3, 52, 123, 236, 60, 62, 178, 101, 111, 91, 89, 228, 63, 62, 116, 53, 148, 71, 46, 153, 133, 244, 59, 87, 117, 171, 67, 182, 119, 3, 204, 215, 205, 128, 248, 11, 59, 34, 15, 115, 249, 177, 240, 198, 58, 52, 23, 101, 132, 118, 39, 181, 199, 49, 39, 98, 196, 23, 179, 199, 62, 65, 165, 246, 218, 161, 150, 163, 253, 94, 124, 215, 10, 245, 71, 135, 168, 59, 251, 229, 157, 39, 75, 179, 211, 83, 33, 172, 81, 2, 30, 222, 174, 66, 80, 11, 196, 187, 123, 255, 127, 187, 208, 236, 106, 88, 54, 93, 253, 37, 33, 155, 82, 26, 156, 57, 87, 148, 130, 44, 84, 207, 171, 200, 131, 82, 28, 61, 122, 155, 114, 160, 253, 29, 177, 50, 168, 100, 73, 18, 132, 92, 136, 67, 24, 156, 149, 164, 120, 109, 130, 170, 156, 164, 248, 104, 83, 152, 231, 211, 100, 78, 59, 170, 147, 101, 86, 254, 127, 143, 124, 178, 232, 35, 35, 243, 3, 220, 198, 182, 146, 71, 250, 50, 61, 152, 253, 101, 219, 219, 159, 58, 34, 239, 111, 144, 29, 8, 99, 24, 212, 123, 176, 171, 0, 132, 253, 35, 140, 166, 157, 68, 215, 217, 105, 78, 224, 18, 118, 216, 79, 227, 101, 59, 153, 27, 217, 243, 250, 193, 213, 100, 184, 69, 78, 229, 7, 144, 107, 5, 214, 223, 139, 123, 44, 140, 165, 131, 215, 65, 77, 181, 143, 101, 218, 198, 87, 47, 191, 10, 102, 231, 0, 239, 23, 128, 83, 11, 218, 62, 104, 185, 73, 211, 216, 40, 70, 231, 92, 187, 172, 255, 66, 159, 93, 156, 35, 172, 123, 2, 230, 123, 236, 241, 154, 88, 136, 179, 147, 174, 89, 50, 5, 158, 169, 128, 127, 215, 231, 82, 83, 159, 66, 241, 205, 103, 143, 20, 248, 239, 143, 31, 210, 249, 39, 25, 8, 8, 242, 111, 111, 188, 35, 190, 251, 17, 114, 164, 49, 24, 113, 159, 50, 115, 56, 190, 180, 91, 125, 237, 99, 116, 211, 36, 208, 115, 12, 73, 61, 99, 110, 81, 64, 83, 163, 131, 154, 211, 9, 165, 11, 30, 177, 177, 43, 241, 7, 108, 203, 224, 75, 25, 246, 160, 33, 148, 32, 131, 183, 190, 0, 219, 28, 208, 242, 134, 174, 91, 92, 51, 36, 240, 43, 139, 147, 101, 183, 51, 216, 249, 42, 166, 52, 133, 115, 249, 6, 240, 23, 27, 23, 77, 180, 40, 175, 240, 173, 104, 70, 137, 83, 82, 171, 155, 215, 136, 131, 4, 172, 19, 100, 255, 146, 160, 199, 128, 177, 130, 163, 56, 104, 107, 102, 44, 178, 196, 187, 0, 38, 53, 230, 191, 148, 218, 207, 105, 66, 106, 103, 52, 241, 119, 233, 63, 63, 182, 45, 101, 61, 210, 89, 175, 101, 98, 89, 172, 252, 236, 36, 54, 143, 131, 55, 35, 189, 128, 57, 73, 34, 229, 250, 206, 253, 43, 37, 53, 136, 172, 73, 221, 27, 205, 207, 21, 120, 92, 6, 220, 166, 66, 95, 45, 241, 209, 112, 72, 22, 31, 221, 232, 220, 157, 248, 78, 105, 214, 230, 41, 193, 211, 46, 249, 26, 11, 242, 42, 225, 116, 207, 166, 141, 116, 185, 223, 86, 218, 190, 255, 185, 250, 199, 181, 56, 188, 132, 37, 27, 85, 248, 112, 161, 182, 164, 153, 129, 40, 37, 13, 8, 67, 236, 36, 182, 151, 130, 96, 131, 65, 26, 103, 239, 65, 243, 234, 162, 7, 90, 237, 24, 99, 145, 47, 181, 99, 65, 38, 36, 112, 157, 239, 225, 127, 161, 168, 6, 66, 231, 252, 142, 154, 225, 138, 189, 243, 66, 142, 71, 61, 239, 55, 230, 59, 40, 224, 134, 104, 100, 189, 166, 249, 66, 91, 146, 154, 28, 67, 78, 138, 40, 114, 71, 172, 3, 168, 233, 9, 106, 228, 143, 56, 193, 227, 243, 144, 51, 222, 94, 224, 43, 79, 149, 212, 245, 52, 68, 200, 17, 235, 45, 164, 147, 62, 118, 52, 216, 195, 78, 13, 66, 190, 188, 241, 142, 234, 182, 85, 48, 148, 214, 123, 57, 223, 188, 229, 119, 169, 180, 193, 70, 250, 215, 249, 29, 88, 123, 88, 226, 210, 171, 170, 32, 80, 85, 3, 26, 219, 109, 97, 134, 11, 96, 118, 71, 130, 86, 182, 77, 116, 137, 214, 28, 140, 242, 227, 178, 167, 200, 214, 175, 107, 96, 132, 33, 40, 64, 93, 206, 90, 129, 132, 221, 170, 242, 113, 235, 251, 172, 193, 35, 58, 85, 70, 9, 75, 104, 71, 161, 99, 214, 6, 33, 204, 250, 172, 199, 33, 183, 246, 250, 109, 251, 50, 106, 114, 16, 134, 150, 19, 219, 21, 60, 63, 251, 204, 157, 45, 106, 233, 133, 154, 145, 135, 201, 77, 59, 178, 176, 217, 109, 236, 19, 19, 200, 5, 165, 235, 81, 14, 42, 153, 40, 189, 86, 92, 90, 239, 77, 53, 136, 65, 112, 94, 130, 104, 71, 55, 79, 22, 250, 34, 178, 14, 91, 24, 145, 250, 4, 197, 96, 72, 118, 142, 31, 83, 137, 14, 57, 115, 36, 202, 144, 10, 19, 123, 176, 23, 93, 35, 90, 145, 73, 163, 124, 66, 156, 8, 82, 243, 22, 204, 59, 77, 49, 222, 1, 246, 7, 75, 15, 234, 110, 9, 232, 29, 156, 239, 250, 88, 24, 244, 123, 15, 169, 66, 180, 254, 210, 233, 134, 27, 100, 162, 103, 158, 223, 149, 226, 167, 140, 53, 34, 57, 105, 221, 112, 116, 72, 207, 169, 98, 200, 189, 33, 72, 181, 162, 166, 4, 29, 98, 157, 184, 244, 188, 127, 186, 35, 186, 202, 24, 21, 185, 160, 63, 17, 112, 78, 96, 49, 87, 60, 154, 215, 49, 196, 179, 122, 60, 253, 154, 86, 177, 227, 70, 1, 80, 205, 58, 66, 103, 146, 170, 108, 34, 134, 149, 134, 160, 225, 152, 63, 18, 199, 101, 158, 199, 235, 124, 98, 105, 8, 62, 100, 92, 248, 81, 59, 108, 190, 156, 216, 106, 103, 90, 69, 199, 160, 21, 66, 203, 125, 157, 189, 8, 115, 15, 158, 77, 105, 124, 171, 180, 227, 134, 50, 208, 245, 254, 35, 231, 215, 231, 193, 218, 216, 68, 204, 229, 233, 95, 120, 177, 105, 108, 92, 9, 181, 119, 196, 19, 97, 5, 145, 254, 112, 156, 70, 9, 68, 39, 84, 33, 80, 2, 21, 228, 184, 145, 218, 19, 202, 231, 144, 3, 29, 22, 14, 146, 193, 90, 216, 63, 95, 197, 70, 198, 68, 235, 132, 16, 31, 100, 179, 19, 105, 19, 178, 210, 222, 118, 148, 37, 202, 50, 222, 84, 246, 89, 36, 25, 183, 80, 175, 79, 154, 38, 119, 89, 125, 133, 56, 21, 61, 187, 123, 80, 224, 187, 15, 84, 46, 19, 1, 24, 246, 250, 32, 226, 193, 49, 118, 252, 1, 47, 172, 161, 175, 60, 113, 56, 248, 198, 100, 117, 78, 138, 154, 40, 231, 118, 120, 23, 223, 8, 239, 145, 51, 43, 82, 146, 83, 129, 43, 146, 75, 171, 20, 186, 157, 174, 137, 205, 187, 198, 37, 10, 108, 65, 154, 212, 207, 63, 178, 11, 51, 5, 62, 172, 122, 219, 147, 16, 223, 243, 134, 146, 161, 173, 118, 113, 185, 212, 199, 29, 83, 5, 241, 42, 54, 160, 57, 100, 116, 111, 218, 193, 39, 66, 67, 141, 161, 179, 141, 54, 87, 16, 43, 15, 93, 41, 240, 62, 66, 231, 59, 42, 48, 46, 207, 141, 27, 160, 156, 247, 138, 129, 130, 68, 34, 66, 69, 177, 45, 108, 26, 36, 50, 109, 46, 238, 82, 187, 219, 166, 225, 115, 204, 121, 228, 122, 92, 65, 67, 69, 162, 104, 10, 117, 17, 33, 113, 110, 10, 9, 2, 41, 24, 227, 173, 49, 10, 2, 147, 115, 197, 93, 133, 139, 86, 38, 138, 102, 92, 17, 94, 115, 74, 101, 5, 12, 222, 186, 229, 16, 126, 16, 234, 105, 191, 184, 182, 27, 59, 152, 118, 179, 114, 78, 65, 15, 21, 43, 215, 7, 215, 110, 207, 152, 128, 14, 106, 188, 73, 230, 183, 23, 101, 92, 95, 250, 115, 245, 40, 58, 167, 157, 201, 1, 229, 233, 39, 243, 103, 253, 104, 135, 248, 219, 74, 127, 91, 135, 224, 240, 42, 6, 70, 70, 48, 23, 52, 78, 12, 212, 203, 55, 134, 108, 107, 185, 237, 129, 120, 234, 54, 243, 252, 231, 19, 190, 190, 46, 48, 115, 200, 145, 119, 195, 140, 122, 21, 85, 120, 189, 33, 208, 59, 39, 181, 57, 55, 128, 144, 149, 120, 65, 77, 113, 75, 203, 194, 251, 217, 77, 110, 56, 54, 93, 240, 101, 219, 52, 174, 163, 153, 193, 24, 16, 112, 103, 178, 252, 57, 2, 7, 55, 184, 80, 176, 248, 128, 236, 73, 250, 66, 218, 63, 16, 230, 149, 32, 149, 237, 199, 168, 81, 147, 63, 211, 251, 112, 223, 62, 92, 60, 114, 156, 203, 12, 225, 232, 250, 166, 123, 194, 227, 56, 82, 4, 104, 168, 170, 38, 93, 122, 232, 207, 228, 68, 58, 247, 162, 96, 128, 20, 249, 114, 93, 37, 199, 229, 152, 134, 168, 14, 212, 153, 137, 31, 241, 189, 163, 223, 247, 196, 22, 67, 27, 105, 10, 235, 28, 24, 177, 249, 230, 19, 247, 145, 228, 151, 195, 17, 201, 93, 226, 167, 76, 227, 85, 207, 200, 139, 37, 148, 40, 243, 214, 60, 55, 241, 183, 126, 160, 97, 6, 129, 104, 182, 207, 250, 77, 123, 235, 211, 158, 171, 52, 171, 186, 53, 121, 24, 137, 105, 164, 247, 172, 132, 201, 31, 135, 123, 0, 164, 164, 235, 167, 103, 63, 40, 54, 102, 46, 197, 185, 194, 14, 195, 159, 182, 120, 4, 36, 14, 194, 219, 155, 23, 233, 148, 169, 113, 158, 92, 103, 68, 247, 133, 214, 252, 9, 220, 50, 198, 251, 75, 34, 10, 115, 209, 172, 147, 168, 185, 81, 70, 174, 155, 80, 111, 246, 78, 199, 155, 192, 2, 241, 162, 123, 123, 77, 228, 101, 22, 241, 89, 245, 63, 3, 235, 76, 162, 20, 12, 81, 228, 254, 50, 146, 76, 149, 112, 226, 88, 231, 167, 229, 27, 250, 21, 98, 84, 235, 251, 213, 238, 209, 111, 34, 144, 181, 190, 22, 60, 112, 244, 98, 241, 19, 51, 163, 4, 198, 8, 50, 194, 200, 241, 155, 192, 97, 95, 173, 49, 94, 169, 112, 21, 87, 23, 229, 226, 75, 60, 134, 126, 21, 10, 86, 84, 238, 113, 19, 77, 205, 3, 158, 105, 241, 98, 86, 237, 233, 190, 97, 136, 202, 234, 147, 121, 253, 156, 176, 238, 222, 71, 35, 185, 127, 212, 211, 0, 86, 129, 131, 93, 111, 167, 121, 138, 69, 251, 4, 90, 229, 43, 48, 144, 138, 0, 48, 249, 202, 203, 46, 117, 175, 27, 96, 230, 119, 93, 156, 129, 186, 122, 133, 114, 160, 196, 50, 81, 97, 63, 13, 188, 146, 63, 4, 220, 222, 165, 9, 236, 124, 117, 145, 91, 244, 186, 233, 35, 78, 241, 45, 38, 127, 179, 165, 20, 253, 131, 171, 41, 230, 158, 162, 83, 50, 19, 23, 83, 128, 121, 67, 248, 17, 145, 98, 112, 190, 250, 237, 243, 248, 64, 146, 41, 16, 44, 154, 33, 60, 162, 161, 156, 229, 176, 172, 49, 42, 240, 235, 85, 90, 162, 151, 170, 183, 27, 21, 183, 40, 134, 187, 193, 75, 183, 76, 63, 235, 27, 90, 133, 26, 138, 83, 150, 77, 206, 233, 166, 204, 90, 125, 211, 133, 229, 10, 166, 12, 146, 184, 152, 107, 242, 245, 52, 145, 154, 34, 249, 13, 102, 253, 209, 20, 3, 225, 88, 156, 137, 30, 182, 206, 211, 255, 149, 39, 64, 133, 16, 125, 5, 115, 220, 51, 122, 242, 121, 222, 212, 239, 237, 208, 31, 72, 98, 36, 131, 185, 9, 124, 14, 55, 236, 196, 38, 68, 82, 17, 197, 255, 168, 199, 158, 94, 52, 58, 126, 100, 57, 118, 184, 214, 42, 65, 249, 156, 128, 82, 139, 234, 63, 119, 55, 89, 108, 207, 209, 226, 34, 198, 134, 54, 131, 154, 87, 96, 31, 11, 241, 1, 11, 97, 61, 167, 20, 223, 188, 163, 31, 250, 189, 13, 29, 196, 209, 218, 119, 102, 13, 172, 149, 149, 219, 251, 64, 238, 211, 212, 136, 82, 237, 150, 140, 188, 201, 123, 191, 83, 133, 193, 253, 25, 27, 246, 72, 60, 212, 227, 241, 209, 206, 142, 29, 11, 11, 146, 182, 203, 214, 25, 192, 236, 197, 176, 6, 216, 105, 145, 191, 115, 161, 107, 170, 194, 121, 148, 205, 65, 116, 157, 96, 173, 217, 30, 96, 174, 239, 178, 151, 121, 46, 3, 86, 65, 32, 120, 195, 66, 86, 144, 206, 91, 36, 148, 42, 216, 208, 164, 203, 149, 69, 230, 49, 78, 224, 177, 23, 175, 103, 191, 111, 181, 130, 255, 215, 189, 173, 134, 189, 64, 36, 226, 134, 89, 116, 138, 92, 81, 246, 202, 10, 243, 21, 81, 165, 210, 235, 49, 99, 217, 19, 184, 54, 71, 102, 132, 49, 135, 228, 156, 67, 170, 38, 173, 200, 239, 244, 255, 65, 211, 100, 161, 118, 111, 218, 219, 87, 23, 57, 9, 246, 102, 252, 157, 205, 98, 12, 97, 198, 183, 141, 223, 154, 23, 180, 123, 80, 156, 144, 231, 95, 42, 135, 31, 244, 164, 121, 138, 116, 154, 207, 222, 138, 32, 84, 185, 56, 114, 9, 244, 11, 213, 237, 166, 91, 31, 217, 20, 179, 168, 121, 139, 237, 181, 221, 90, 174, 2, 176, 34, 210, 130, 241, 130, 240, 178, 89, 176, 130, 185, 243, 52, 101, 116, 112, 6, 60, 84, 6, 110, 29, 246, 66, 10, 164, 130, 46, 75, 163, 179, 45, 250, 32, 57, 48, 74, 169, 133, 44, 167, 241, 103, 31, 119, 243, 74, 208, 4, 162, 17, 11, 72, 126, 10, 81, 117, 188, 103, 222, 163, 78, 206, 72, 216, 73, 2, 221, 230, 122, 107, 141, 126, 1, 236, 63, 51, 169, 160, 14, 165, 208, 174, 9, 91, 74, 252, 146, 198, 79, 238, 175, 39, 102, 75, 150, 40, 109, 143, 117, 77, 153, 234, 82, 38, 162, 23, 242, 107, 124, 217, 13, 51, 55, 92, 1, 28, 138, 62, 209, 69, 222, 63, 62, 150, 221, 74, 232, 220, 181, 21, 36, 203, 182, 193, 183, 173, 113, 157, 241, 208, 131, 172, 0, 176, 55, 229, 63, 54, 84, 197, 105, 196, 154, 60, 52, 50, 191, 230, 202, 129, 85, 235, 75, 245, 172, 58, 230, 0, 251, 250, 104, 123, 247, 224, 120, 118, 30, 50, 223, 144, 233, 243, 213, 58, 228, 124, 24, 168, 194, 24, 192, 4, 63, 107, 39, 55, 202, 196, 254, 149, 141, 189, 136, 218, 108, 203, 100, 198, 121, 240, 252, 208, 200, 230, 178, 117, 199, 2, 55, 165, 214, 210, 246, 142, 178, 63, 86, 249, 156, 100, 172, 202, 197, 148, 222, 76, 185, 221, 248, 71, 7, 231, 224, 158, 236, 27, 44, 53, 58, 181, 65, 176, 146, 223, 254, 5, 249, 207, 218, 160, 212, 245, 14, 114, 246, 153, 139, 55, 230, 89, 143, 125, 133, 103, 249, 123, 91, 229, 195, 214, 65, 251, 219, 11, 48, 167, 72, 9, 131, 110, 207, 244, 197, 159, 23, 51, 161, 135, 251, 220, 52, 242, 122, 199, 21, 231, 34, 185, 84, 140, 112, 3, 164, 231, 64, 162, 192, 103, 182, 162, 112, 2, 142, 22, 148, 62, 71, 79, 232, 85, 38, 15, 87, 230, 232, 112, 203, 94, 230, 172, 233, 219, 158, 246, 87, 61, 155, 22, 14, 157, 23, 61, 99, 196, 97, 70, 216, 173, 236, 211, 120, 197, 28, 231, 47, 215, 66, 71, 46, 66, 28, 29, 223, 77, 173, 144, 82, 220, 222, 99, 229, 74, 53, 88, 116, 123, 162, 240, 168, 216, 142, 205, 144, 183, 127, 135, 4, 162, 91, 176, 78, 26, 178, 249, 104, 195, 76, 105, 206, 143, 20, 158, 220, 22, 67, 201, 237, 78, 241, 56, 111, 63, 160, 240, 168, 131, 253, 62, 8, 51, 88, 43, 174, 217, 235, 243, 71, 50, 210, 7, 235, 56, 63, 128, 111, 32, 244, 187, 217, 170, 77, 152, 65, 7, 200, 30, 47, 83, 126, 139, 170, 142, 219, 184, 156, 54, 102, 249, 94, 32, 2, 204, 206, 77, 230, 60, 184, 143, 167, 110, 241, 203, 60, 44, 174, 128, 150, 186, 215, 218, 189, 87, 107, 216, 84, 76, 166, 171, 91, 23, 16, 208, 211, 181, 234, 61, 203, 224, 172, 128, 129, 66, 7, 249, 0, 75, 157, 235, 49, 244, 154, 157, 107, 205, 70, 146, 38, 188, 6, 218, 133, 231, 204, 168, 234, 133, 17, 245, 85, 253, 163, 242, 168, 56, 9, 99, 142, 236, 237, 67, 20, 226, 60, 4, 86, 83, 208, 243, 19, 127, 168, 6, 156, 67, 179, 66, 170, 242, 211, 170, 199, 188, 71, 231, 191, 67, 42, 109, 37, 117, 154, 231, 116, 63, 232, 206, 107, 141, 17, 127, 143, 79, 247, 160, 62, 151, 234, 116, 126, 14, 223, 8, 5, 52, 82, 8, 99, 17, 9, 7, 4, 208, 106, 11, 208, 156, 157, 85, 51, 236, 128, 41, 66, 99, 243, 220, 153, 131, 111, 78, 189, 95, 219, 51, 100, 41, 150, 188, 218, 35, 37, 176, 31, 122, 252, 207, 222, 214, 142, 95, 19, 136, 159, 195, 209, 39, 182, 19, 97, 185, 72, 83, 165, 208, 249, 83, 4, 244, 230, 30, 7, 13, 161, 90, 200, 121, 138, 67, 151, 252, 197, 165, 44, 215, 9, 81, 118, 179, 159, 15, 3, 156, 105, 151, 104, 109, 161, 202, 143, 199, 41, 187, 172, 154, 64, 105, 69, 67, 173, 226, 34, 234, 111, 69, 244, 45, 230, 49, 11, 18, 158, 56, 184, 55, 124, 46, 252, 215, 109, 236, 124, 156, 172, 148, 159, 44, 147, 129, 50, 49, 230, 128, 213, 137, 161, 125, 140, 222, 36, 90, 117, 223, 146, 237, 122, 39, 118, 188, 93, 11, 40, 49, 114, 230, 80, 31, 221, 58, 199, 174, 192, 112, 31, 236, 98, 56, 76, 27, 199, 78, 28, 48, 62, 246, 207, 30, 85, 50, 31, 4, 143, 58, 241, 131, 83, 203, 70, 241, 124, 150, 160, 88, 30, 227, 177, 213, 75, 139, 122, 83, 83, 41, 97, 140, 78, 157, 188, 172, 85, 52, 202, 76, 47, 145, 76, 126, 144, 228, 49, 239, 103, 196, 149, 203, 133, 159, 201, 215, 241, 71, 245, 114, 49, 125, 228, 22, 192, 235, 230, 246, 247, 100, 110, 76, 74, 214, 226, 221, 120, 140, 250, 108, 9, 203, 40, 92, 19, 184, 136, 86, 76, 250, 177, 64, 76, 214, 79, 190, 86, 8, 131, 178, 0, 200, 171, 245, 144, 94, 2, 236, 11, 187, 119, 165, 83, 130, 252, 49, 126, 254, 131, 38, 43, 245, 170, 53, 7, 183, 205, 84, 71, 16, 127, 86, 249, 31, 169, 65, 33, 207, 146, 111, 155, 43, 145, 85, 250, 216, 38, 95, 18, 129, 186, 14, 3, 158, 43, 183, 44, 205, 90, 37, 141, 27, 130, 115, 4, 121, 67, 113, 43, 109, 251, 71, 103, 32, 129, 163, 73, 116, 252, 32, 149, 17, 150, 117, 168, 218, 56, 163, 173, 125, 84, 103, 136, 195, 89, 46, 27, 45, 153, 6, 184, 81, 93, 131, 28, 42, 171, 87, 177, 135, 109, 24, 78, 80, 103, 110, 168, 3, 251, 165, 139, 171, 25, 77, 166, 250, 193, 166, 168, 195, 160, 12, 25, 110, 36, 0, 132, 247, 199, 195, 30, 177, 14, 176, 197, 58, 142, 93, 43, 151, 126, 28, 184, 231, 179, 113, 227, 26, 165, 98, 180, 183, 218, 182, 150, 125, 231, 102, 231, 206, 39, 57, 121, 193, 43, 11, 254, 173, 29, 251, 45, 171, 106, 87, 114, 38, 58, 153, 72, 84, 193, 36, 2, 142, 215, 121, 147, 160, 11, 37, 243, 213, 217, 181, 152, 112, 191, 155, 217, 136, 117, 175, 182, 125, 134, 218, 58, 212, 239, 39, 250, 119, 220, 113, 214, 143, 204, 124, 11, 153, 200, 158, 215, 253, 40, 35, 17, 232, 45, 217, 47, 191, 159, 199, 82, 41, 106, 158, 244, 222, 254, 133, 109, 151, 43, 187, 203, 165, 61, 163, 205, 7, 217, 12, 252, 123, 90, 255, 255, 88, 221, 122, 76, 173, 185, 85, 185, 33, 228, 226, 161, 72, 217, 34, 197, 140, 190, 18, 7, 142, 177, 203, 49, 93, 91, 12, 12, 29, 35, 100, 136, 58, 22, 174, 49, 71, 209, 218, 199, 125, 51, 110, 117, 45, 205, 141, 81, 192, 148, 211, 238, 218, 84, 227, 191, 160, 49, 110, 207, 190, 8, 156, 184, 167, 148, 228, 69, 19, 39, 3, 210, 204, 196, 230, 123, 64, 123, 133, 115, 33, 85, 15, 45, 144, 218, 31, 192, 34, 60, 208, 166, 113, 151, 122, 249, 171, 207, 8, 164, 207, 138, 246, 217, 251, 34, 27, 145, 144, 57, 60, 165, 203, 117, 199, 80, 141, 218, 36, 65, 24, 115, 33, 152, 139, 152, 34, 72, 99, 192, 219, 49, 65, 187, 217, 14, 208, 56, 62, 143, 12, 51, 225, 187, 38, 19, 114, 83, 118, 117, 17, 249, 224, 185, 225, 237, 71, 79, 67, 75, 51, 0, 92, 123, 155, 122, 154, 105, 101, 235, 17, 160, 35, 152, 108, 45, 151, 154, 92, 149, 63, 255, 77, 153, 104, 98, 208, 251, 112, 189, 38, 102, 205, 117, 255, 232, 150, 109, 51, 70, 5, 11, 224, 41, 141, 200, 227, 170, 1, 220, 34, 103, 112, 185, 169, 207, 141, 183, 172, 61, 129, 113, 126, 200, 59, 197, 93, 245, 240, 58, 232, 40, 90, 125, 37, 134, 210, 82, 118, 234, 200, 115, 169, 124, 188, 1, 172, 236, 31, 79, 211, 213, 146, 195, 206, 105, 57, 241, 59, 237, 145, 32, 6, 24, 253, 23, 60, 211, 2, 94, 42, 190, 180, 213, 177, 23, 167, 104, 3, 226, 171, 208, 95, 96, 57, 53, 141, 115, 88, 174, 10, 206, 234, 150, 182, 157, 242, 93, 97, 80, 9, 154, 152, 166, 94, 141, 238, 212, 68, 231, 244, 0, 36, 167, 2, 9, 169, 16, 151, 170, 33, 51, 1, 105, 210, 194, 224, 146, 221, 227, 137, 63, 144, 14, 5, 140, 30, 193, 203, 47, 90, 20, 233, 169, 66, 192, 91, 252, 161, 140, 67, 202, 12, 24, 190, 242, 46, 208, 121, 8, 194, 164, 164, 125, 216, 194, 242, 125, 131, 35, 5, 45, 18, 152, 157, 240, 35, 56, 246, 144, 175, 2, 7, 123, 13, 158, 168, 115, 221, 195, 54, 236, 35, 132, 246, 7, 100, 108, 120, 17, 23, 210, 61, 238, 38, 73, 149, 28, 249, 29, 5, 232, 28, 131, 84, 79, 155, 26, 82, 96, 150, 219, 122, 167, 231, 56, 233, 176, 154, 213, 126, 14, 155, 13, 68, 157, 25, 236, 244, 64, 125, 74, 247, 241, 123, 177, 102, 43, 244, 122, 173, 75, 132, 244, 248, 236, 246, 161, 138, 68, 86, 2, 52, 121, 232, 96, 100, 207, 238, 219, 64, 197, 162, 8, 97, 144, 89, 121, 66, 146, 166, 233, 7, 145, 217, 223, 51, 254, 128, 1, 211, 1, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 99, 108, 101, 97, 114, 116, 111, 109, 97, 114, 107, 10, 128, 3};
diff --git a/source/blender/editors/datafiles/CMakeLists.txt b/source/blender/editors/datafiles/CMakeLists.txt
index d37ee338733..a359b0ef6f5 100644
--- a/source/blender/editors/datafiles/CMakeLists.txt
+++ b/source/blender/editors/datafiles/CMakeLists.txt
@@ -19,8 +19,45 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
+set(INC "")
-SET(INC "")
+set(SRC
+ Bfont.c
+ add.png.c
+ bfont.ttf.c
+ blenderbuttons.c
+ blob.png.c
+ blur.png.c
+ bmonofont.ttf.c
+ clay.png.c
+ clone.png.c
+ crease.png.c
+ darken.png.c
+ draw.png.c
+ fill.png.c
+ flatten.png.c
+ grab.png.c
+ inflate.png.c
+ layer.png.c
+ lighten.png.c
+ mix.png.c
+ multiply.png.c
+ nudge.png.c
+ pinch.png.c
+ preview.blend.c
+ prvicons.c
+ scrape.png.c
+ smear.png.c
+ smooth.png.c
+ snake_hook.png.c
+ soften.png.c
+ splash.png.c
+ startup.blend.c
+ subtract.png.c
+ texdraw.png.c
+ thumb.png.c
+ twist.png.c
+ vertexdraw.png.c
+)
-BLENDERLIB(bf_editor_datafiles "${SRC}" "${INC}")
+blender_add_lib(bf_editor_datafiles "${SRC}" "${INC}")
diff --git a/source/blender/editors/datafiles/Makefile b/source/blender/editors/datafiles/Makefile
deleted file mode 100644
index c76014df60e..00000000000
--- a/source/blender/editors/datafiles/Makefile
+++ /dev/null
@@ -1,49 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_datafiles
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../makesdna
-CPPFLAGS += -I../../../imbuf
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/datafiles/SConscript b/source/blender/editors/datafiles/SConscript
index 99acd52806e..dd0db90af44 100644
--- a/source/blender/editors/datafiles/SConscript
+++ b/source/blender/editors/datafiles/SConscript
@@ -6,4 +6,4 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' #/intern/guardedalloc'
-env.BlenderLib ( 'bf_editor_datafiles', sources, Split(incs), [], libtype=['core'], priority=[235] )
+env.BlenderLib ( 'bf_editor_datafiles', sources, Split(incs), [], libtype=['core', 'player'], priority=[235, 30] )
diff --git a/source/blender/editors/datafiles/blenderbuttons.c b/source/blender/editors/datafiles/blenderbuttons.c
index f4afe8b0252..27f5dd23d5a 100644
--- a/source/blender/editors/datafiles/blenderbuttons.c
+++ b/source/blender/editors/datafiles/blenderbuttons.c
@@ -1,6560 +1,6579 @@
/* DataToC output of file <blenderbuttons> */
-int datatoc_blenderbuttons_size= 209697;
+int datatoc_blenderbuttons_size= 210319;
char datatoc_blenderbuttons[]= {
-137,
- 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 2, 90, 0, 0, 2,128, 8, 6, 0, 0, 0, 68,254,214,163,
- 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,
-116,111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222,
-244, 66, 75,136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17,
- 69, 69, 4, 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,163,136,138,202,251,225,123,
-163,107,214,188,247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,
-224,131,199,196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,
-190, 0, 1,120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128,
- 20, 0, 64,122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,
-230,211, 0,128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69,
- 0, 88, 48, 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48,
- 81,136,133, 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,
-178, 60,185, 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153,
- 25, 50,129, 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191,
- 6,255, 34, 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238,
- 4,104, 94, 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,161,144,185,217,217,229,228,
-228,216, 74,196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,190,226, 36,129, 50, 93,129,
- 71, 4,248,224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88,
- 42, 20,227, 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0,
-176,106, 62, 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104,
-131,225,207,119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,
-160,129, 42,176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128,
- 28,114, 96, 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,
-112, 15,250, 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,
-193, 72, 4, 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,
-186,145, 59,200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116,
- 49,154,143, 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108,
- 48, 46,198,195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18,
-129, 69,192, 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,
-194, 39, 34,147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55,
- 36, 18,137, 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,
-100,107,178, 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226,
- 40, 82,202,106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182,
- 82,175, 81,135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,105,175,232,116,186, 17,221,
-149, 30, 78,151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,
-119, 24,175,152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,
-149, 74,149, 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,
-169, 9,212,150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195,
- 76,195, 79, 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,129, 53,196, 38,177,205,217,
-124,118, 42,187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63, 7,227,152,113,248,156,116,
- 78, 9,231, 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,150,151,150, 88,171, 72,171,
- 81,171, 71,235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,
-217, 83,221,167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,152,158,190, 94,128,158, 76,
-111,167,222,121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,
-113,111, 60, 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,163,213, 70,141, 70, 15,140,
-105,198, 92,227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,
-199,205,204,205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120, 90, 44,182,168,182,184,101,
- 73,178,228, 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,214,187,173,187,167, 17,167,
-185, 78,147, 78,171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,182,125, 97,103, 98, 23,103,
-183,197,174,195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,
-154,206,156,238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23,
-103,185,115,131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,113, 93,225,122,210,245,157,
-155,179,155,194,237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209,
- 63, 11,159,149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,183,165,119,170,247, 97,239,
- 23, 62,246, 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,111,158, 95,133,223, 67,127,
- 35,255,100,255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,191,142, 63, 58,219,101,246,
-178,217,237, 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,231,152,206,145,206,105, 14,
-133, 80,126,232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209,
-220, 67,115,223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198,
- 46,102, 89,204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,226,157,226, 11,227,123, 23,
-152, 47,200, 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140,
- 37,242, 19,119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,
-188, 53,121, 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,
-131,146,145,144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,110,139,183, 47, 30,149, 7,201,
-107,179,144,172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,137,202, 57,150,171,158, 43,
-205,237,204,179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178,
- 60,113,121,219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,174,126,189, 38,122, 77,107,
-129, 94,193,202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27,
- 62, 21,137,138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,169,171,196,185,100,207,102,
-210,102,233,230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,245,246, 69,219, 47,151,205,
- 40,219,187,131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97,
-215,248,110,209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251,
-179,247, 63,174,137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210,
- 61, 84, 82,143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226, 35,112, 68,121,228,233,247,
- 9,223,247, 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98,
- 91,186, 79,204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,218,233,130,211,147,103,242,
-207,140,157,149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,116,225,210, 69,255,139,231,
- 59,188, 59,206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,254,147,211, 79,199,187,156,
-187,154,174,185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,255,214,213,158, 57, 61,221,
-189,243,122,111,247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217,
- 67,221,135,213, 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5,
-143,153,143,203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,158, 23,254,162,254,203,174,
- 23, 22, 47,126,248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,235, 25,175,219,198,194,198, 30,
-190,201,120, 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,255,104,249,177,245, 83,208,
-167,251,147, 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 32, 99, 72, 82, 77, 0, 0,122, 37, 0, 0,128,131,
- 0, 0,249,255, 0, 0,128,233, 0, 0,117, 48, 0, 0,234, 96, 0, 0, 58,152, 0, 0, 23,111,146, 95,197, 70, 0, 3, 40, 76,
- 73, 68, 65, 84,120,218,236, 93,119,120, 20,197, 3,125,187,183, 87,114,119,201,165, 55, 18, 72,161, 67, 0,105, 10, 72,239, 66,
- 40, 22, 4, 17, 69,108, 63,105, 22, 4, 65, 17,165,131, 34, 85, 69,196, 6, 40,210, 68, 16, 80,138, 72,239, 69,122,135, 0,233,
- 61,151,235,109,231,247, 71,110,207,203,113, 45, 16, 80, 96,222,247,237,119,183,237,237,204,206,236,236,219, 55,141, 33,132,128,
-130,130,130,130,130,130,130,130,162,242,193,210, 91, 64, 65, 65, 65, 65, 65, 65, 65,241, 31,193,134, 13, 27, 42, 98,129,117,246,
-151,211,190,180,251,175,115,222,197,184,147, 74,228,108,103,231,252,248, 62, 9,103,187,255, 42,167, 16,223, 10,240,118,174, 72,
- 62,170,172,251,233, 20, 78, 82,217,225,188, 91,156,149,245, 28,185, 9, 39,185, 11,233,254,241,125, 18,206,118,255, 53, 78,215,
-252,227, 39,111,133, 56,253,204, 83, 21, 13, 39,169,236,112,222, 45,206, 59,125,142,188,132,147,220,105, 94,242,144,246, 31,227,
- 33, 1, 33, 4,220, 93, 20, 89,126, 35, 53, 53,149,113,226,103,254,171,156,206,247, 65,224,175,204,176, 86, 34,118, 84, 54,167,
-203,253,172, 44,124,156,154,154,202,108,216,176, 97, 39,128,118,149, 25,247,202, 72,119,151,184, 86, 10,239,109,136,172, 10,113,
- 86, 86,190,191,219,156,149,245, 44,185,114, 86, 70,190,119,151,238,119, 49,141, 42, 43,156,149,242, 44,221,141, 60,239, 38,255,
-220, 49,175, 43,103,101, 60, 75,174,156,149,145,239,239, 5,103,101, 60, 75,238, 56, 43, 35,223,123, 74,251,135,205,160, 98,111,
-231,166,221, 69,167,172,253,127, 89, 16,221, 45,177, 89, 1, 7,230, 95,231,172,228, 52,250,216,206, 89,153, 95, 55,237, 43, 43,
-141,238, 70,126,119,230,172, 44,126, 87,158,202, 72, 39,119,156,119, 26, 94, 15,225,172,244,184,223,105,190,191, 87,156,149,156,
- 70,149,242, 44,185,112,182,175,228,143,129,246, 78,235, 31, 87, 38,103,101, 61, 75,110,194,121,199,233,228,142,243, 78,195,235,
- 33,156,149, 30,247,202,120,135,220, 45,222, 7, 26,119,171,250,172,178, 57, 43,200,253, 64,113, 86,176,122,166,243, 93, 72,251,
-127, 53,156,149,201,233, 26,198,202,172,238,185,155,225,172, 76,206, 10,132,245,129,227,188,223,210,253,191,120, 63, 61,241,221,
- 73,181,148, 39,119,244,110,132,179, 50, 57,253,228,126, 32, 56,239, 32,237, 31, 40, 84,184,234,240, 94, 8,184, 74,254, 50, 65,
- 37, 59, 48,119, 83,184, 86,102, 56,219,223, 13,135,240, 46,160,210,195,105,255, 82,254,232, 46,196,253,126,185,167,244, 89,162,
-207,210,127,238, 89,114,201,147,237, 43,209, 41,170, 84,231,217,149,179, 50,174,225,204, 81, 89,121,244,110,199,189, 50,159,165,
-187,145,246, 20,119,224, 66, 80, 78,202, 73, 57, 41, 39,229,164,156,148,243,161,229,124,224, 64, 8,161,195, 59, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,220, 71,240,218, 70,171, 74,149, 42, 27, 20, 10, 69, 13, 79,251,181, 90,109,
- 86, 86, 86, 86, 7,122, 27,255, 61,208, 52,162,184,143,192,226,159, 94,206, 60, 0, 98, 95, 40, 40, 40, 40, 30,104,120, 20, 90,
- 50,153, 44,249,220,185,115,181,120,158,135,205,102,131,213,106,117,252,154, 76, 38,180,109,219,182,194, 13,233,163,163,163,119,
-137, 68,162,196,138,156, 99,179,217,110,228,228,228,180,246,114,200, 62, 0,201, 12,243, 79,155, 64,225,191,167, 95, 0,153, 22,
-139,165,137, 55, 78,134, 97,146, 93,249, 60,112, 9,255,189,114, 6, 7, 7, 31,225, 56, 46,222, 29,151,167,255, 60,207, 95,205,
-203,203,107,117, 47,211,232, 97, 70,116,116,244, 46,142,227, 42,156, 63,179,179,179, 61,230,207,216,216,216,227, 44,203, 86,169,
- 0,165,136,231,249, 11, 89, 89, 89,173,189, 8,145,125, 0,146,189,145,184,230, 39,134, 97,210,109, 54, 91, 51, 95,207,145, 55,
- 46, 55,121,212, 23,167, 67,100,113, 28, 55, 35, 42, 42,234, 13,157, 78,103, 0, 64, 68, 34, 17,113, 10, 27, 0,192,106,181,230,
- 21, 23, 23, 55,160, 57,145,130,130,226,161, 16, 90, 60,207,179, 70,163, 17, 23, 47, 94,132,135,249, 16,109,183,113,189, 90, 71,
-255,220, 26, 21, 20, 21, 13,171,217, 12,101, 68,164,131, 59,231,236,105, 88, 45,102, 88, 77, 38, 84,107,222, 66, 8, 3,234,213,
-171, 39,242,193, 25, 63,115,230,204,168,160,160, 32, 24, 12, 6, 24, 12, 6, 24,141, 70, 24, 12, 6,152, 76, 38,152, 76, 38,152,
-205,102,152,205,102, 88,173, 86, 24,141, 70,108,219,182,205,102,177, 88,188,114, 78,157, 58, 53, 74,165, 82, 57,248,132, 69,224,
- 20,120, 45, 22, 11, 12, 6, 3,182,111,223,238,149,147,227,184,248,204,204,204, 40,137, 68, 2, 66, 8,120,158, 7, 33,164,220,
-226,138,234,213,171,155,189, 5,242, 46,165,209,195,140, 90, 83,151,111,140, 10,150,203, 96,229,121,164, 54,170,238,216,113,245,
-155, 85, 32, 86, 27,120,171, 21, 53,135, 15,114,108,175, 91,183,174,215,252, 73, 8, 73,152,186,124, 99,136,191,156, 5, 5, 5,
-250, 58,117,234,100,162,108,112, 63, 79, 66, 43, 94,175,215, 71,217,249,111, 17, 68, 44,203,150, 91, 54,111,222,140,212,212, 84,
- 95,113,143,127,251,237,183,163, 44, 22, 11, 76, 38, 19,140, 70, 35, 44, 22, 11,172, 86,171, 99,177,217,108,142,197,100, 50,225,
-224,193,131,254, 58, 89, 51,187,116,233, 50,100,227,198,141,202, 95,127,253, 85,153,152,152, 8,137, 68, 2,145, 72, 4,145, 72,
- 4,150,101,193,113, 28, 30,123,236, 49,134,102, 65, 10, 10,138,135, 70,104, 25,141,198,107,141, 27, 55, 38,246,255,113, 50,153,
- 76,226,242,149, 91,165,102,205,154, 23, 92,207,243, 85, 93, 21, 20, 21,141,113, 85,195, 0, 0, 19,174, 23, 56, 94, 16,159,180,
-122,196,113,204,164,140, 18, 0,128, 92, 46, 7,227,252, 25,237, 1, 74,165, 18, 93,186,116,129, 84, 42, 69,179,102,205, 32, 22,
-139,221, 46, 18,137, 4, 98,177,216,231, 77, 97, 24, 6,129,129,129,152, 56,113,162, 32,146,160, 12,144, 97, 68,171,102, 8, 0,
-193,215,167, 47,193,196, 19,112, 28,231, 88,252,225,148, 72, 36, 56,117,234, 20, 56,142,131, 72, 36,114,252, 10,255,215,175, 95,
-143,103,158,121, 6, 28,199, 65, 46,151, 3, 62, 70, 14,118, 78, 35,147,201, 20, 43,149, 74,205, 0, 4,113, 38, 97, 24, 38,230,
-118,210,232, 97, 70,176, 92,134, 23, 23,174, 5, 0,220,156, 51,220,145,118, 7,135, 78,112, 28,147,240,218,179, 96, 24, 6, 98,
-177, 24, 44,203, 86, 26,103, 97, 97,161,126,192,128, 1,123,130,130,130, 54,171,213,106,248, 16,112,184,121,243, 38, 56,142,243,
-152,223, 89,150,197,236,217,179,113,249,242,101,191,226,110, 48, 24,176,120,241, 98,216,108,182,114,188,194,127,215,109,126,138,
-172, 41, 93,187,118, 29,180,113,227,198, 80,134, 97,240,249,231,159, 67, 34,145,160, 71,143, 30, 8, 15, 15,199,150, 45, 91, 32,
-145, 72, 48,102,204, 24,154,249, 40, 40, 40,188,149,121, 98, 0,143, 0,136,180,155, 8,165, 0, 66,156, 14,201,179,255, 70, 10,
-235, 12,195, 28,118,195,211,220,126, 76, 30,195, 48,135,157,214, 77, 0,164,110,182, 23, 0,144,219, 23, 35,202,220,255, 20,167,
-235, 8,231,193,211,117, 57,160,108,254, 33, 0, 59, 0,180, 79, 77, 77,221, 9, 0,217,217,217, 79,100,103,103, 3, 0,146,147,
-147,207, 93,184,112,161,142,160,121,236,213, 83, 18,171,213, 90, 75,168,170, 18,220,162,206,157, 59,123,253,194,183,154,205,183,
- 8, 16,119, 90,202, 93,117,133, 39, 1, 99, 54,155,241,236,179,207, 2,128,199,151,142,243,226,135,118,131,201,100, 2,199,113,
-168, 93, 53, 18, 31,118,107,140, 71,137, 5, 90, 13, 3,107,137, 22,125, 2, 45, 56, 87,175, 9, 22,221,200,195,117,181, 6, 28,
-199,249,197,201,243,188, 71,145, 37, 18,137,176,112,225, 66, 12, 24, 48, 0, 34,145,200, 47, 62,231, 52, 74, 74, 74,218,120,225,
-194,133,112,134, 97,140,246, 52,146, 89,173, 86,149,213,106, 13,183,217,108,225, 21, 73,163,135, 25, 86,158,119,155, 15, 61,229,
- 89,127,210,201, 31,206,194,194, 66,125,106,106,234, 1,153, 76,182, 36, 58, 58, 58, 51, 61, 61,221,167,208,114, 21, 63,174, 31,
- 21,159,125,246, 25,230,207,159,143, 14, 29, 58,248, 21, 78,163,209, 8,134, 97,176,104,209,162, 91,246, 77,158, 60,249,150,235,
-249,224,100, 0,176, 85,170, 84, 25,250,199, 31,127,168,132, 99, 35, 34, 34, 32, 22,139,209,160, 65, 3, 4, 5, 5, 97,207,158,
- 61,176,217,108,126, 63,151, 20, 20, 20, 15, 46,220,105, 17, 39,180, 29, 55,110, 92,179, 25, 51,102, 76,107,217,178,229,207,251,
-246,237, 91,206, 48,204, 6,167, 50, 49,213, 94,190,110, 16,214, 9, 33,205,157, 69,143, 93,172, 69, 50, 12,179, 65, 56,222,121,
- 93,248, 37,132,116, 6, 32, 21,214,199,141, 27,151, 50, 99,198,140,105, 99,199,142,125,127,250,244,233,146,113,227,198, 53,156,
- 49, 99,198, 52,225, 58,238,194,225,206,209,242, 58,247,148, 80, 69,117,254,252,121, 79, 85, 84,206, 47, 0,175,165,165, 50, 34,
-210,225,100, 77, 74, 8,119,108,159,152, 94,236,120,129, 45,104, 90, 3, 74,165, 18,221, 38,125,234,151, 83,100, 50,153,144,155,
-155,235,112, 25,124, 45,254,114, 42,228, 1,216,246,118, 3,220, 44,144,226,227,253,133,216,248,247,101,136,197, 98,116,175,215,
- 0, 79, 72,130, 48, 62, 65,138,183, 47,165,193, 66,252,107,211, 75, 8,113, 43,176,132,255, 66, 21,138,191, 66,203, 37,141,110,
- 26, 12,134,130,139, 23, 47,234,249,178, 23,187,156, 16, 18,202, 48, 76,169,221,229,138,245, 55,141, 30,102,164, 54,170,238,112,
-157, 14, 6,117,114,108,127, 70,123,202,145, 38,163, 22,126, 2, 0,232,208,228, 49,159,207,131, 63,156, 5, 5, 5,250,214,157,
-218,239,180,233, 77, 63, 12, 26, 52,232,218, 95,127,253, 37,247, 39,172,238,132,150,224,218, 10, 34,139,227, 56,152, 76, 38,191,
-226,110, 50,153, 60, 62, 31, 18,137,228,118, 28, 45,104,181, 90,211,186,117,235,176, 96,193, 2,132,135,135,163,107,215,174,136,
-141,141,197,170, 85,171, 64, 8,193,240,225,195, 33,151,203, 5,247,154,102, 64, 10,138,135, 27,222,180,136,108,198,140, 25,211,
- 92,133,140,243,186,179,128,114, 17, 83,206, 98, 45,197,199,251,127,131,171,120, 18,174,203, 48,204,134,233,211,167,167,250, 8,
- 71,158, 39,161,229,117, 72,124,163,209,120,173, 81,163, 70,126,169, 9,157, 78,151,237, 75,108,184,251,170,119,118, 9, 2, 3,
- 3,161, 84, 5,130,245,179,220,181, 88, 44, 14,161,178,117,235, 86,200,229,114,244,232,209,227,142, 28, 45,179,217, 12,169, 68,
- 12, 54, 34, 26, 47,206,249, 11, 5,165,122,199, 11,102,199,213,107, 56,150,147,139,183, 91,118,130, 82,158, 11,141,201,228,151,
-243,198,243,252, 45, 34,139,227, 56, 60,251,236,179, 14, 55,193,185,221, 10,188, 84, 29,134,135,135, 31,225, 56, 46,222, 41,141,
- 2,146,147,147,129,127,218,245, 48, 60,207,107, 66, 66, 66,126, 1, 80,133, 16, 18, 15, 32,200,159, 52,162,112,159, 63, 93,183,
-243, 46, 78,213,237,112, 22, 20, 20,232, 83, 83, 83, 15,216,244,166, 31, 50, 50, 50, 14, 0, 8,120,244,209, 71, 43, 44,180, 4,
-129, 37, 22,139, 49,123,246,108,204,159, 63,223,177,223, 95,161,101,181, 90,203, 9,168, 75,151, 46,149,187,150,171,176,243, 81,
-109, 74, 80,214,187,144, 79, 78, 78,118,156, 19, 19, 19,131,144,144, 16,240, 60, 15,158,231, 17, 16, 16, 0,185, 92, 14,137, 68,
- 66, 51, 29, 5, 5,133, 55, 45,162, 31, 59,118,236,251, 12,195,108,176, 59, 75,167,189, 8, 42,119,218,163,185,139, 88,203,243,
-112, 92,170, 59,177,229,252, 95,192,184,113,227, 82, 92,195,225,174,186,210, 81,170,186, 12,187, 95, 14,206, 85, 84,149,245, 18,
-243,246, 34, 11, 12, 81, 65,174, 84, 66, 36, 98,193, 48, 12,241,197,101, 54,155, 29, 5,255, 27,111,188,225,181,221,138,191,237,
-169,204,102, 51, 88, 78,132,172,152, 36,216,216,221,142,115,133,133,229,196,184, 30, 83, 7,162,243,199, 33,246,243,133,235,234,
-104, 13, 31, 62, 28,139, 23, 47, 6,203,178,142,123,194,113, 28,106,214,172,137,107,215,174,121,229,226, 56, 46,254,250,245,235,
- 81,206,247, 81, 16,177,132, 16,216,108, 54, 84,175, 94,221,112,241,226,197, 55,233,163,123,103, 34,203,211,118,155,141,247,219,
-133,113,119, 92, 65, 65,129,190, 95,191,126, 59, 75, 74, 74,126,168, 95,191,254, 37,148, 31, 2,193, 39, 31,199,113,229, 4,150,
- 32,178,230,205,155, 87, 78, 20, 89, 44, 22,191, 62, 4, 44, 22,203, 45,130,103,214,172, 89,229,126, 1,160, 85,171, 86,126, 57,
-195, 0, 8,203,178, 68, 34,145,160, 75,151, 46,104,216,176, 33,126,253,245, 87,240, 60,143, 97,195,134, 65, 46,151, 99,238,220,
-185,176, 90,173,152, 57,115, 38,117,180, 40, 40, 40,188,105, 17,227,244,233,211, 79, 79,159, 62,221,225, 44,185, 58, 90, 30,222,
-187, 61,237,162, 42, 82, 16,105, 0,140,238, 4,145, 59,151,204, 85,128, 57,111,155, 49, 99,198, 52,215,112,184, 86, 87,150, 19,
- 90,247, 10,217,103, 78,225,211,199, 27, 3, 40, 95, 93,184,240,177, 58, 80, 6, 42,161, 12, 10, 68,191,245,187, 1,192, 94,232,
-143,245,203,209, 18,132, 86, 65, 65,129, 87,145, 85, 17, 71,139,149,114, 88, 29, 95, 4, 34, 21,131, 51, 89,202, 9, 45, 17, 39,
-198,205,240, 36,176, 98, 9, 56,155,213, 47, 78, 66,200, 45, 85,133,131, 7, 15, 6,195, 48,142, 30, 98,141, 26, 53,114,230, 98,
-124,189, 28, 71,135,149,181,193,115,173,142,157,153,111,160, 79,236,237,228,207, 35,223,224,220,154,161, 0,128,214, 90,173, 35,
- 45,166, 54,250,167,239,192,156, 83, 59, 29,238,227, 36,188,123, 91,156, 5, 5, 5,250, 71,235,166, 28,144,132, 5,255,112,227,
-198,141, 3, 0,216,254,253,251,135, 52,106,212,200,175,103, 82,232, 92,225, 42,178,156,157, 44,225,215, 71, 15, 91, 39,225,104,
-243, 75, 64, 9,213,136,126,228,121, 34,228,109,149, 74,133,192,192, 64, 71,143,219,128,128, 0, 40, 20, 10, 71,251, 78, 63,133,
- 27, 5, 5,197,195,139, 80, 65,232,216,197, 82, 57,167,201,222,182, 42,213,121,221,157,227,101,119,160,118,249, 40, 95, 55,218,
- 5,154, 91, 8,206,154,203, 57, 27, 60,137, 52, 78, 80,144,206,191, 49, 49, 49,191, 7, 6, 6, 38,249, 27,251,138,244, 98,179,
- 89,204,183, 56, 91, 12,195, 32, 48, 40, 16,242, 64, 37,228, 65,129, 30, 93, 47,111, 66, 75,112,138,132,151,206,146, 37, 75, 16,
- 24, 24,136,151, 94,122,169,194,109,180, 28, 66, 75,194, 98,139,108, 59, 68, 82,174,156,200,226, 56, 14, 34,177, 24,217,129,177,
- 96,197, 98,112, 86,255, 92,178,146,146, 18,112, 28,135, 15, 63,252,208,241, 5,239, 44,178, 42, 18,103,111, 96, 25, 70,112,183,
-100, 53,106,212,120,151, 97,152, 4, 0,137, 90,173, 86,150,149,149,213,145, 62,175, 94,148,129,205,114,139, 11,229,201,125,189,
- 93, 78,193,201,146,132, 5,255, 80,167, 78, 29,135,147,165, 80, 40,132,222,166,190,211,152,101,221,138, 44,215, 30,130, 28,199,
-149,229,101, 31,189, 35,157, 29,173,233,211,167, 59,120,157,157, 44, 1, 21,121,142,132,176,238,220,185, 19,199,142, 29,195, 27,
-111,188, 1,185, 92,142,249,243,231,195,106,181, 98,242,228,201,144,203,229,144, 74,165, 52,243, 81, 80, 80, 55,171,156, 22,113,
- 65,158, 75, 59, 40,198, 69,212,228,185, 19, 88,206,213,132,194,127,134, 97, 44,110,120, 77, 46, 85,138,174,219,133,223,130,233,
-211,167,255, 37, 56, 89, 78,219,203,133,195,167,163, 37,147,201,146, 46, 94,188,232, 24, 8,211,219,175,201,100, 66,135, 14, 29,
-252,118,198,132, 94,135, 28, 39, 42, 39, 44, 20, 65,129, 80,168,130, 32, 15, 12,116, 21, 28,140,175, 66, 92,248, 34,118, 22, 90,
- 31,125,244, 17, 56,142,195,226,197,139, 1, 0,239,190,251,174,223,109,180, 4, 78,216, 24,164,147, 43,104, 60,231, 25,152,126,
-180, 32,103,239, 9,112, 28,135,168, 22, 79,128,127,244, 25,232,228,129,224,108, 86,191,123, 29, 22, 22, 22,226,218,181,107, 16,
-137, 68,120,231,157,119,202,141,117,228,218,147,109,235,214,173, 62,227,238,206,201,250,232, 70,161,131, 71, 46,151,179, 39, 78,
-156, 72,226,121, 62, 89,175,215,215,104,213,170, 21, 79, 31,101, 31,162,136,183,250, 37,170,252,205,159,174,156, 66,155,172,146,
-146,146, 31,110,220,184,113, 16, 0, 59,104,208,160, 16,133, 66,129,111,191,253, 86, 7, 64,186,106,213, 42,185, 47, 81, 36,228,
- 27, 95, 34, 75, 44, 22,151,229,101,127,226, 78,202, 15, 89,226,171, 97,188, 63,121, 94, 8, 43,195, 48,176,217,108,144,203,229,
-229,156,172,128,128, 0,200,100, 50,154,241, 40, 40, 40,124,149, 37,135,253, 46,199, 9,105,238, 36,170, 14,223, 14,111, 69,174,
-231, 11,156, 39,161, 97, 52, 26,113,246,236, 89,127,121,252, 30, 24,179,106,179,199, 48, 41,163, 4, 12,195,224,235, 86,245,161,
- 84, 5, 66,161, 84,226,233, 95,119, 58, 10,238, 83,211,222,133, 76, 25,136, 42,109,186,250, 85,144, 11, 85,135,206, 66,171,184,
-184, 24, 98,177, 24, 83,166, 76, 1,203,178,152, 57,115, 38,226,226,226,144,149,149,133, 85,171, 86,249,229,104,137,108, 34,196,
-190, 80, 23,138,193,193, 80,189,208, 22,161, 93, 62, 66,134,137,195, 62,131, 2,109, 13,103, 32,221, 50, 15, 38,222,230,119, 15,
- 44,171,213,138,157, 59,119,186, 54,120,119,180,169,178, 90,173,176, 88, 44, 48,155,205,152, 57,115,166, 63, 61, 60,111, 73, 55,
-225, 30,218, 7, 65, 21, 93,184,112, 33,146, 16, 18, 6, 32, 24, 64, 62,125, 92,189, 35,182,197,112, 68, 54,251, 31, 0, 96,253,
-244,151, 29,219, 63, 60,245, 79,254,156,253, 99,217, 4, 0,117, 18,187, 86,136,179,160,160, 64,223,189, 67,171, 93, 6, 94,252,
-125,131, 6, 13,202, 57, 89, 1, 1, 1,140,125,221, 47,187,140,101, 89,136, 68,162, 91,170, 11, 61,137, 45,127,218,104, 89,173,
- 86,199, 64,162,222,218, 51,222,142,163,245,242,203, 47, 35, 54, 54,214,225,100, 77,154, 52, 9,114,185, 28,227,198,141,131,197,
- 98,193,188,121,243,104,230,163,160,160,184,231,162,236, 94,192,109, 73,106, 48, 24,210, 26, 54,108, 8, 15,251,226, 2, 2, 2,
-196, 46,145,170, 82,179,102,205, 11,110,170, 16, 59, 3,216,230,174, 80,103, 24, 6, 65,170, 32, 4, 4, 42,161,112,113,177, 2,
-130, 84,144, 5, 6,130,149,184, 45,204,111,225, 20,218,150, 56, 11, 45, 97, 41, 41, 41,129, 88, 44,198,130, 5, 11,160, 82,169,
- 96, 52, 26,125,114, 10, 47, 29,145, 72, 4,221,205, 82,156,155,182, 13,210,128,125,168,209,117, 0, 98,197,114, 72,246,252, 2,
-189,205,226,107,192,210, 91, 56,107,213,170,133, 9, 19, 38,220, 50,172,131, 39,196,197,197,249,140,187,171,147, 53,187,126, 53,
- 72,164, 18,140, 58,115, 19, 70,163,145, 25, 48, 96, 0, 15, 64, 15, 32, 79,175,215,223,240,231,126, 86, 2,238,123, 78,111,189,
- 98, 5,240,196,230, 78,192,184,229, 20,156, 44, 3, 47,254,254,218,181,107,130,147, 21,172, 80, 40,240,213, 87, 95,233, 0,176,
-147, 39, 79, 86, 36, 36, 36,136,252,201, 75, 34,145, 8,115,230,204,113,219, 38,203,157,232,170,200,115,228,124,110,187,118,237,
-220, 14, 88,234, 65,188,221,194, 41,132, 53, 60, 60,220,225,100,217,108, 54, 71,111, 67, 97,244,121, 47, 31, 21, 52,127, 82, 78,
-202,249,240,112, 62,144,112, 91, 2,103,101,101,117,247,116, 66,245,234,213, 47, 94,188,120,177,166, 48, 21,135,189,224,148, 24,
- 12,134, 90,173, 90,181,242,105,237,240, 60, 15,153, 76, 6, 66, 8, 58, 78,152, 1,134, 5, 88,148,127,137, 69, 61,222, 9, 34,
- 17, 7,190,108,170, 15,159,189, 14,245,122,125,185,151,131,187, 69,163,209,192,104, 52,250, 61,154,183,193, 96, 40, 55, 4, 3,
- 67,120, 92,255,115,229, 45,189, 15,133,197,223,118, 59, 1, 1, 1,229,170,126,124, 56, 86,140, 63,142,150,115,213,163, 68, 42,
- 1, 39, 17, 11,142, 86,233,165, 75,151,250,209,108,238, 63,132, 14, 11, 0, 80,187, 85, 15,240,188, 13,196,102, 43, 55, 77, 82,
-221,164,238,224,137, 13,102,139, 14, 70,163,209,215,176, 39, 76,126,126,190,190, 95,191,126, 59, 1,124,215,167, 79,159, 11, 40,
- 27, 93,152, 4, 6, 6,202,196, 98, 49, 15,160, 16, 0, 41, 42, 42, 10,206,200,200,224, 13, 6, 67, 53, 95,225,220,184,113, 35,
-206,158, 61,139, 54,109,218,148,155, 14, 74,112, 69,157, 71,119,247, 39,127, 10,213,229,238, 70,132,247, 36,228,252,133, 72, 36,
- 66,112,112, 48, 36, 18, 9,166, 76,153, 2,137, 68, 2,133, 66, 1, 0,152, 55,111,158, 99,240, 85, 10, 10, 10,138,135, 70,104,
-249, 42, 55,189, 84, 43,122,173, 66,180, 90,173,233, 9, 9, 9, 21,186,152,205,102,203,241, 33,220,210, 87,173, 90, 37,113,118,
- 33,124,253, 18, 66,114,124,188,108,211,215,175, 95, 47,113,231,110,120,154, 96,218, 23,167,205,102, 75, 79, 76, 76,244,232,152,
-184,131,197, 98,201,240, 37, 90,103,228,233,203,137,132, 81,103,110,122,156, 59,145,194,103, 94,243,146, 63, 63,184,221,252,121,
-169,118,237,218, 25, 33, 33, 33,155,162,163,163, 11,246,238,221, 27,222,188,121,243,112,231, 99,154, 55,111, 30,235,114,154, 9,
-158,231, 57, 4,195, 48,233,125,250,244,113,155,231, 5,209,228, 38,127,166,251,202,243,135, 14, 29,146, 56,159,239,137,223,233,
- 57, 74,247, 67,184, 94,111,220,184, 49,235,204,227, 41,239, 91, 44,150, 60,154, 11, 41, 40, 40, 30,122,161,165,215,235,111, 54,
-108,216,208,234, 97,223, 13,111,231, 22, 20, 20, 52,171,236, 8, 88, 44,150, 86,247, 3,103,126,126,126,165,198,221,106,181,166,
-219, 7, 40,245,122, 12,205,226,255, 94, 26, 1, 64,110,110,238,163, 0,160,213,106,225,107, 90,157, 10, 8,194, 74,207,159, 86,
-171,181,213,221,184,167,133,133,133, 45,105,206,162,160,160,160, 66,171, 2,160,147, 17,255, 55,112, 55, 68, 43, 5, 5, 5, 5,
- 5, 5, 69,229,130,165,183,128,130,130,130,130,130,130,130,226,238,128, 65, 89,207, 1,119,168, 72,111,130,206,183,113,237,109,
-148,147,114, 82, 78,202, 73, 57, 41, 39,229,124,232, 56,125,113, 63, 48,189, 25,239, 69,123,233,206,148,147,114, 82, 78,202, 73,
- 57, 41, 39,229,164,156, 15, 35, 8, 33,180,234,144,130,130,130,130,130,130,130,226,110,129,163,183,224, 95,131, 8, 21, 24, 81,
-223, 15,213, 28, 10,192,211,132,113, 38,134, 97,138,110,131,147, 1, 32,177, 47,194, 64, 71, 22, 0,102, 0,102,134, 97,136,111,
-142,143,217,204,204,208, 20, 98, 19, 55, 39, 12, 35,230,121,252, 93,173, 90,213,227, 12,243,132, 9, 0,148,209,117,235, 5, 42,
-229,157,141,102, 83,146, 76, 44, 61, 91,172,213,108, 53,230, 94, 76,163,217,131,130,226, 95, 65, 47, 0, 19, 81,214,172,100, 58,
-128,149,244,150, 80, 80,220, 37,161, 21, 24, 24,120,132,101,217,120, 95,227,243, 8,176,207,101,150, 94, 84, 84,212,172, 2,215,
-238, 23, 24, 24,216, 65, 44, 22, 63, 14, 0, 22,139,101,175, 70,163,249, 11,192, 42, 0,214,219,140,147, 10,192,179, 0, 6,218,
-215,127,178, 23, 22,234,219,228,107, 24, 28, 28,188, 70, 44, 22,147,252,252,252, 22, 0, 16, 30, 30,126,192, 98,177, 48,106,181,
-250,105, 0, 39, 43,200,199,138,197,226,217, 45, 90,180,104,187,123,247,238,239, 0, 44,168,164,180,148,177, 44,235, 86,160,240,
- 60,159,120, 27, 34, 75, 2, 32,120,193,130, 5,225,203,150, 45,107,156,158,158,222, 0, 0,226,227,227, 79, 13, 26, 52,232,248,
-136, 17, 35, 10, 8, 33, 37, 12,195,152,189,241,100,102,134,166,228,102, 95,125, 35, 39,247,236,179, 0, 16, 19,219, 96,165, 72,
-196, 74, 8, 57,186, 95, 17, 49, 48,162,102,141,196,255,253,252,237, 2, 73, 98, 82, 85,108,223,119,236,145, 17,111,190,159,146,
- 1,124, 70,197,214,189, 67, 80, 80,208, 17,150,101,227,189, 61,227,238,158,121,155,205,150, 94, 88, 88,216,204, 19, 39,199,113,
-241,222,202, 11,119,219,120,158,191,154,159,159,239,118,168, 9,149, 74,181,159,227,184, 36,127,185,132, 95,171,213,154,238,169,
-151,174, 74,165, 58, 34, 18,137,226,189,197,211,221, 62,158,231,175,230,229,229,121, 10,231, 45,113,175,140,112,222, 14,167,183,
-112, 10,229, 17,128,121,225,225,225,143, 21, 20, 20, 60, 15,224,125,181, 90,221, 72, 36, 18, 33, 44, 44,236,125,147,201,116, 57,
- 56, 56,248,155,146,146,146,125, 0,222, 4, 64,231, 75,165,160,168, 44,168, 84,170, 28,141, 70, 67, 4,240, 60, 79, 44, 22, 11,
- 49, 26,141, 68,175,215, 19,173, 86, 75, 52, 26, 13, 81,171,213,164,164,164,132, 20, 20, 20,144,200,200, 72,215,193, 27, 61,213,
-225, 54, 80,169, 84, 23,103,204,152, 97,188,118,237, 26, 49,155,205,196,108, 54,147,180,180, 52,242,233,167,159, 26, 85, 42,213,
- 69, 0, 13, 60,156,219,217, 67, 97,209, 5,192,242,198,141, 27,155, 54,110,220, 72, 12, 6, 3,209,106,181,100,229,202,149,164,
-126,253,250, 38, 0,203,237,199,176,126,114, 2, 64,235,152,152,152,244, 43, 87,174,216,182,110,221,106, 14, 14, 14,222, 22, 28,
- 28,188, 45, 45, 45,205,118,229,202, 21, 62, 34, 34, 34, 29, 64,235, 10,132, 19, 0,158, 25, 53,106, 84, 78, 90, 90, 26,105,215,
-174,221,223, 78,219, 25,248,158,231,174,179, 59, 39,139, 16, 18, 67, 8,137, 69,217, 32,151,183, 44,132,144, 88,251, 49,161,126,
-114, 42,175, 94,189, 90, 53, 58, 58,122, 6,195, 48, 38, 87, 62,134, 97, 76,209,209,209, 51,174, 94,189, 90,149, 16,162,244,198,
-153,126, 99,225,171,155, 54,118, 42,214, 22,157, 39,218,162,243,228,187,239,219,171, 95, 31,241,252,242,216,234, 77, 22,135,196,
-167, 44, 56,123,254,210, 34, 66,200,162,191, 14, 95, 92,244,209,151,191, 47,122,114,196,220,175,194, 19, 26,191, 94,129,251,121,
- 39,160,156, 0, 66, 66, 66,178,181, 90, 45, 33,132, 16,155,205, 70,204,102, 51, 49, 26,141, 68,167,211, 17,141, 70, 67, 74, 75,
- 75, 29,207,121, 73, 73,137,227,127, 84, 84,148,199,231, 61, 52, 52, 52, 71,175,215,151, 43, 59, 76, 38,147,163,252,208,233,116,
- 68,167,211, 17,173, 86,235, 88, 52, 26, 13,169, 82,165,202, 77, 47,225,204, 18,194,201,243, 60,177, 90,173,196,108, 54, 59,120,
- 13, 6, 67,185,197,104, 52, 18,163,209, 72, 18, 18, 18,252, 14,167, 63,156, 6,131,129,196,199,199,103,122,226, 12, 11, 11,203,
- 49, 24, 12,229, 56,157,227,239,202, 43,172,199,196,196,100, 87,132,211,159,112,122,187,159,118, 44,184,112,225, 2,209,235,245,
- 36, 46, 46,174,224,233,167,159,182,216,108, 54,178,113,227, 70,210,184,113, 99,190,125,251,246,230,252,252,124,242,210, 75, 47,
- 17, 47, 31,133,244, 57,162,156, 20,158, 77, 11,207,142, 22,195, 48, 80, 42,149, 88,177, 98,133,199,233, 56,156,255, 87,171, 86,
-205,223,235, 54, 75, 74, 74,218,185,103,207, 30,121,108,236, 63, 3, 98,155, 76, 38,132,134,134, 98,216,176, 97,210, 94,189,122,
-213,236,218,181,235,129,235,215,175,183, 3,112,196, 7,223, 83,145,145,145,159,127,248,225,135,209,253,251,247, 71,120,120,185,
- 65,183,209,175, 95, 63, 60,253,244,211,146, 11, 23, 46, 12, 88,178,100,201,128,133, 11, 23,102,107, 52,154, 17, 0,126,241, 70,
- 42,151,203,251, 84,169, 82,229,171, 61,123,246, 68, 69, 69, 69, 33, 57, 57,153, 29, 51,102, 76,205, 90,181,106,201,227,227,227,
-217,172,172, 44,252,250,235,175,113,207, 61,247,220,234,156,156,156,255,153,205,230,117,126,196, 93, 26, 30, 30,254,254,255,254,
-247,191, 8,181, 90,109, 61,122,244,232, 69, 97,187, 84, 42,157,220,178,101,203,230, 59,118,236,248, 17,192, 55,183,227,100, 17,
- 66,212,248,167,138, 79,128, 69,216,239,143,179, 69, 8,145,254,253,247,223, 97, 45, 91,182,252,197,104, 52, 54,121,227,141, 55,
-110, 76,155, 54, 77,174, 82,169, 84, 0, 24,181, 90, 93, 52,113,226, 68,211,220,185,115,223,171, 87,175, 94,167,253,251,247, 63,
- 69, 8,177,216, 5,217,173,124, 12,227, 8,207,205,140, 60,236,220,199, 75, 39,140,123, 55,254,147,169, 73,215, 15,159,185,201,
-115,114, 21,126,219,117, 26, 57, 5, 26,252,190,255, 12, 98,194,131, 24,137, 76,156, 18, 28, 87,191, 93, 73,198,153, 93,240, 50,
- 66, 58, 69,229,128, 97, 24, 40, 20, 10,252,246,219,111,183, 76, 93,229,110, 90, 43,142,227, 16, 18, 18,226,115,118,131,128,128,
- 0,108,221,186,213,237,220,139,238,166,244, 9, 14, 14,134,183,143, 13,134, 97, 16, 16, 16,128,189,123,247,130,101, 89,183, 83,
- 3,185,110, 83, 42,149, 96,189,204,117, 37,112,238,218,181,203, 39,151,240, 27, 24, 24, 8,148, 85,253,123,126, 40,101, 50,236,
-217,179,199, 99,156, 93,255, 7,218,231,123,245,197,185,119,239,222,114, 83,127,185, 78, 9,230,188,174, 84, 42,193,248, 32, 13,
- 13, 13,109, 17, 31, 31,143, 67,135, 14, 97,213,170, 85, 97, 41, 41, 41,184,116,233, 18, 24,134,193,180,105,211,152,250,245,235,
-139,179,179,179,209,166, 77, 27,172, 93,187,182,149, 90,173,166, 15, 12,197,191, 37, 88,196, 0, 30, 1, 16,137,178,102, 55,165,
- 0, 66, 80, 54,147,134, 20, 64, 1, 0,185,125, 49, 2,208, 0,136,176,159,158,111, 47, 91,156, 5, 66,158,243,228,211,132,144,
-230,118,110, 97,134,138, 72,167, 99,133,107,184,174,187,254,186,229,230, 0, 96,195,134, 13,194,203,172,125,106,106,234, 78,231,
-200,249, 35,178,132,121,202,220, 60,211,174, 93, 52,101, 74,165,114,205,129, 3, 7,228,145,145,255,196,193,104, 52,162,180,180,
- 20, 26,141, 6,165,165,165, 8, 10, 10,194,170, 85,171,228,157, 58,117, 90, 83, 90, 90, 90,203,126,211, 60,113,206,201,202,202,
-138,182, 90,173,144, 74,221, 55, 81, 98, 89, 22,117,235,214,197,251,239,191,143,110,221,186,197,116,232,208, 97,142,139,208,186,
-165, 43,169, 66,161,248,234,232,209,163, 81, 10,133, 2, 23, 47, 94, 68,122,122, 58, 70,141, 26, 85,149,231,121,220,188,121, 19,
-151, 46, 93, 66, 70, 70, 6,150, 44, 89, 18,213,183,111,223,175,220, 8, 45,119,221, 83,223,120,251,237,183,235,132,134,134,178,
-159,126,250,105,177, 86,171,253,194,190,125,194,252,249,243, 95,104,219,182,109,212, 43,175,188, 66,246,238,221,187,204,158,112,
- 30,239,167,115,155, 44,123, 53, 31,236,153,239,156,203, 57,117,157,246,131, 16, 18, 3,192,200, 48, 76,177, 27, 78, 6, 64,112,
-215,174, 93,223, 49, 26,141, 77,246,236,217,115,249,241,199, 31, 79, 0,144, 37,100,190,224,224, 96,229,156, 57,115,162, 83, 83,
- 83, 47,116,236,216,177, 73,215,174, 93,223,201,203,203,155, 70, 8,201,115,106,179,229,224,228,121,252, 29, 19,219, 96,229,174,
-253, 35,158,221,177,215, 36,121,247,205,143,110, 84,171,154, 88,242,247,197, 66,219,153,171,121, 40,213, 91,241,100,199,178, 9,
-204, 91, 52,168,134,207, 87,236,193,176,183, 62, 16,255,178,114,233,211,151, 9,148,154,204, 51, 27,189,220,207, 59, 5,229,132,
-163,138, 9, 98,177, 24, 79, 60,241, 4, 24,134,185,101, 46, 79,177, 88,140,253,251,247,163, 99,199,142, 16,139,197,120,249,229,
-151,253,226,228, 56, 14, 93,187,118,117,204,163,232,204,231, 42, 26, 60,104,130,109,183,124, 29,114, 28, 88,150,245, 56,145,182,
- 43,167,175,114, 73, 8,167, 55, 46,231,125,190,194,105,159,242,200,111,145,229, 47,167, 16, 78,142,227,208,170, 85, 43, 28, 63,
-126,220,171,232,242,160, 47,203,197,189,168,168,232,197, 90,181,106,237, 90,176, 96, 65, 24, 0, 20, 20, 20, 56, 38,188, 23,137,
- 68, 56,127,254, 60, 76, 38, 19, 62,254,248, 99,179, 90,173,126,133, 62, 71,148,243,110,114,122,211, 34, 0,218,142, 27, 55,174,
-217,140, 25, 51,166,181,108,217,242,231,125,251,246, 45,103, 24,102, 3, 33, 36, 85,248, 29, 55,110, 92,202,140, 25, 51,166,141,
- 29, 59,246,253,233,211,167,159,102, 24,102, 3, 0,184,174,219,203,146, 84, 23, 17, 23, 41,240,216,159,185,114,199,186, 91,119,
-253,117,199,237, 16, 90, 0,144,154,154,202,216, 35,201, 56, 23,106,254, 10, 45,127,230,238,227, 56,110,248,180,105,211,162,189,
-137, 44,141, 70,131,204,204, 76, 36, 36, 36,224,229,151, 95,142, 94,176, 96,193,112,171,213, 58,203, 11,173, 68, 36, 18,225,208,
-161, 67,200,205,205, 69,195,134, 13,145,148,148, 84,238,128, 43, 87,174, 96,211,166, 77, 40, 46, 46, 70,211,166, 77,129,178,198,
-221,110,209,168, 81,163,143,235,214,173,219,149,101, 89,171, 92, 46,199,223,127,255,141, 38, 77,154, 96,197,138, 21,168, 86,173,
- 26, 20, 10, 5, 46, 92,184,128,134, 13, 27, 98,231,206,157,136,140,140, 68,227,198,141,173,106,181,122,119, 97, 97,225, 95,215,
-175, 95,255,216, 83, 56,227,226,226, 62,122,253,245,215,165,153,153,153,252, 15, 63,252,176, 7,192, 30, 0,195, 63,248,224,131,
- 33,221,186,117,139, 58,118,236, 88,201,225,195,135, 15,122, 16, 89,254, 56, 89, 86,215,151,146,205,102, 51,234,245,122,147,209,
-104,180,176, 44,155,198, 48,140,201,102,179,213,242,100, 66, 12, 30, 60,184,122,126,126,254,176,183,222,122,235,154, 93,100,157,
- 71, 89, 3,120, 0,128,213,106, 53,106, 52, 26,117,203,150, 45, 19,158,123,238,185,203,203,151, 47, 31, 54,120,240,224, 85, 63,
-252,240,131, 6,128,222,149,176, 90,181,170,199, 69, 34, 86,162, 45, 13,187,186,122,213, 55,111,111, 90, 63,188,234,205,155, 25,
- 53,195, 35, 34,181,146,192,200,204, 85, 63,125,127, 4,128, 41, 51, 79,141,147, 87,178, 33, 22,139,112,246,102, 9,218,118,239,
- 39,190,124,113,106,107, 0, 27,233,183,220,221,255, 88, 20, 38,161,222,177, 99,135, 87, 71,107,255,254,253, 16,139,197,144,203,
-229,152, 59,119,174, 87, 82, 65, 24, 8,110,145, 47, 49, 35, 76,142,238,205,125,226,121,222, 49,209,187,235,242,197, 23, 95,224,
-173,183,222, 42,119, 13,187,216, 96,124,113,122, 10, 95, 66, 98, 34,114,115,114,202,109,243,103, 82,122,155,205, 6,177, 88,140,
-197,139, 23, 35, 53, 53, 21, 27, 54,108,240,250,251,196, 19, 79,128,101, 89,226,207,253,108,213,170, 21,204,102,179, 35,204,231,
-207,159,119,203,187,112,225, 66, 95,193,236, 5, 96, 98,147, 38, 77, 84, 29, 58,116,192,174, 93,187,240,244,211, 79, 27,205,102,
-243, 69, 0,232,217,179,103,237, 5, 11, 22, 72,143, 30, 61,138,240,240,112,241,141, 27, 55,190, 3,109, 32, 79,113,151,225, 78,
-139, 8,239,188, 25, 51,102, 76,115, 21, 49,206, 16,246, 51, 12,179, 97,250,244,233,169,206,162,200,121, 93,112,157, 92, 68, 92,
-138,179, 35,229, 44,162, 60, 9, 40,151,247,173,243,241,121,110,133,150, 61, 98,237,157, 93, 32,161,240,245, 37,178,188,124, 57,
-150, 67,112,112,112,143, 39,159,124,210, 33,114, 12, 6,131, 67, 96, 9, 34, 75, 88,191,112,225, 2,154, 53,107, 38, 9, 14, 14,
-238, 81, 80, 80, 48,203, 15, 17,135, 42, 85,170, 32, 63, 63, 31,167, 78,157, 66, 66, 66, 2, 44, 22, 11, 54,111,222,140,146,146,
- 18,136,197, 98, 72, 36, 18,152,205, 94,219,110,163,110,221,186, 79, 44, 91,182,172,217,210,165, 75,139,132, 47,186,159,126,250,
- 9,132, 16, 68, 70, 70, 66,167,211, 33, 39, 39, 7,127,253,245, 23,172, 86, 43, 2, 3, 3,145,156,156, 44,237,211,167, 79,235,
-137, 19, 39,138,189, 8,173, 86, 79, 63,253,116,176, 74,165,194,155,111,190, 73,204,102,243,116,251,182,143, 70,140, 24, 17,158,
-150,150,102,122,245,213, 87, 15,153,205,230, 79, 5, 51,209, 89,224,120, 72, 88,143, 78,150,197, 98, 17,238,233, 53,141, 70,131,
-136,136,136, 4,103,103,203,147, 24,220,187,119,111, 43, 0,162,201,147, 39, 7, 0,200,113, 14,131,201,100,130, 70,163,129, 86,
-171,181,148,148,148,228,142, 30, 61,218,186,124,249,114,145,253,156,179,238,132, 22,195, 60, 97, 82,169, 20, 82, 66, 68, 31, 44,
- 90,180, 40,176, 91,183,110,108, 96, 96, 32, 74, 75, 75, 85,191,255,241, 71, 96,167, 14,173,147,167,205,248,100,139, 42,190, 97,
-206,222,191,175, 34, 35,187, 4, 38,139, 5,201,177,193,101,126, 24,197, 93,135,189, 35,139,195,209,114, 22, 21,187,118,237, 66,
-247,238,221, 29,207,186, 68, 34, 41,231,124,249,226,228, 56, 14,221,187,119,191,197,225,217,177, 99,135, 91,247,201, 23,156, 69,
-145,171, 56,114, 39,192, 88,150,245, 57, 96,160,224,230,185, 19, 91,206,174,190,139,120,243, 85,205, 1,142,227, 48, 98,196, 8,
-136,197, 98,140, 25, 51, 6, 28,199,161,113,227,198,224, 56, 14, 45, 91,182,132, 88, 44, 70,199,142, 29, 43, 28,247, 3, 7, 14,
-160, 73,147, 38,142, 48, 53,110,220, 24,205,155, 55, 7,199,113,104,211,166, 13,196, 98, 49,186,118,237,234, 15,231,251,165,165,
-165,141, 2, 3, 3,113,225,194, 5,136, 68, 34, 48, 12,115, 9, 64, 35, 0,136,141,141,189,172,211,233,170, 27, 12, 6,188,254,
-250,235,140,201,100,106, 56,102,204,152, 15, 12, 6, 3, 21, 90, 20,119, 13,174, 90,196, 9,250,177, 99,199,190,207, 48,204, 6,
-193,161,114,117,158,220,173,187, 41,155, 4, 7,234,176,253, 89,109,238, 34,226,242, 24,134, 57, 76, 8,233,233,233, 92, 0, 38,
- 23, 97, 85,174,234,208,185,218,208,167,163, 37, 20,190,254, 10, 45, 95, 48, 24, 12,143, 68, 69, 69,121, 20, 89,206,191, 38,147,
- 9, 73, 73, 73, 48, 24, 12,143, 84,244,165, 17, 27, 27, 11,179,217,140,111,190,249, 6, 18,137, 4, 18,201, 63,250,194,100,242,
-110, 22,157, 57,115,230,218,129, 3, 7,154, 52,109,218, 52,116,237,218,181,121,237,218,181,139,236,214,173, 27,228,114, 57,244,
-122, 61, 44, 22, 11, 90,180,104,129,186,117,235, 34, 61, 61, 29,191,255,254,123,126,173, 90,181, 34, 14, 30, 60,200,103,103,103,
- 95,247, 66,221,165, 83,167, 78, 96, 24, 6,127,252,241, 71, 62,128,195, 50,153,108,211,212,169, 83, 67, 77, 38, 19, 63,104,208,
-160, 27,133,133,133,111, 1, 48, 75,165,210,249,237,218,181,107,185,109,219,182, 31,121,158,159, 91,209,140,234,122,111,181, 90,
- 45, 2, 2, 2,252, 25, 74, 66, 92, 88, 88,216, 0, 0,148, 74,101, 24,128,203,142, 28,174,215,151, 19,195, 38,147,201, 16, 22,
- 22,166, 4, 0,251, 57, 98, 15,156,145, 86, 43, 86, 95,191,126, 53,200,185,253, 92, 72, 72, 8, 6, 62,247, 28,251,120,171, 86,
-210, 70,143, 60,210,117,252,103, 75, 87, 84, 9, 87,153,146,171,132,195, 98,179, 96,219,150,205, 60,225, 45, 91,104,177,115,111,
-132,150, 32, 54, 92, 29, 45,177, 88,140,157, 59,119,222,178, 77, 34,145,224,235,175,191,246, 75, 24, 8,162,202, 83,213,153, 75,
- 85, 23,227, 75,192,136,197, 98,136, 68, 34, 44, 94,188, 24, 60,207,227,237,183,223, 46, 87,157,232,204,239,151,157,231, 36, 2,
-235,126,196, 3, 48, 33,125,182,204,113,190,107,120,237,231,248,229,146, 45, 88,176,192, 47, 71,171,103,207,158, 62,133,171,115,
- 13,131,115,184,142, 31, 63,238,150,119,209,162, 69, 62,239,167,205,102,195,198,141, 27, 29, 34, 85,192,248,241,227, 95,151, 74,
-165,209,187,119,239, 70,118,118, 54,180, 90, 45, 52, 26, 13, 90,180,104,145,204,178,236,223,217,217,217,105,103,207,158,125,146,
- 62, 61, 20,247,208,209, 50, 78,159, 62,253,244,244,233,211,221, 58, 86,174,206,146, 55,231, 73, 16, 88,118, 65, 20, 41,136, 55,
-148, 53,171, 57,236,235, 92, 0, 82,215,170, 67,175, 70,144,139,138,156,232,174,240,245,167,250,208, 79, 59,157, 99, 24, 6, 6,
-131,193,173,192,114, 22, 7,102,179, 25,133,133,133,176,217,108,183, 61,214,151,187, 47, 89, 95, 66,235,212,169, 83, 47, 13, 25,
- 50, 36, 51, 56, 56,184, 81, 94, 94, 94, 46,207,243, 29,247,239,223, 31,201,113, 28, 84, 42, 21, 84, 42, 21, 54,109,218, 4,133,
- 66,129, 17, 35, 70,228,218,108,182, 93, 65, 65, 65,225,122,189,254, 68,118,118,246,120,143, 10, 70, 44,238,218,166, 77, 27, 28,
- 61,122, 20, 69, 69, 69, 91, 1, 52,126,254,249,231,187, 87,173, 90,149,153, 58,117,170,225,202,149, 43,115, 1,228, 42,149,202,
-101,203,150, 45,235,208,180,105,211,160, 65,131, 6, 97,231,206,157,139, 0, 24,252,141,179, 86,171, 45, 39,176,212,106, 53, 74,
- 75, 75,161, 84, 42,173,126,222, 51, 49,254,233, 97, 8, 66,136, 35,109,236,110,150,144, 62,132,227, 56,161, 87,163, 39,145, 5,
-165, 82, 57,121,233,210,165,114,215, 78, 10, 54,155, 13, 57, 57, 57, 80,169, 84,248,112,252,120,201,164, 81,175, 52, 17, 5, 70,
-239,103, 89, 6, 38, 51, 41, 38,188,105,179, 54,167,255,110,224, 99, 90,242,220, 3, 8,194,160,119,239,222,183, 84, 23, 74, 36,
- 18,108,221,186, 21,125,251,246,117,124,184, 52,109,218,212,231,199,149, 32, 12,122,245,234,229,112,134, 54,111,222,236,182,218,
- 79,112,164,252, 17,132,194,177, 35, 71,142, 4,199,113,248,252,243,207,241,206, 59,239,128,101, 89,204,158, 61, 27, 44,203, 98,
-194,132, 9,126,139, 76,103, 1,147,246, 73,217,111,252, 59,106, 20, 44,140, 6, 0, 4,169, 84, 66,132, 42, 84,246,112, 28,231,
-112,178, 30,121,228, 17,136,197, 98,180,108,217, 18, 28,199, 57,156,172, 30, 61,122, 56,223, 71,226, 15, 39,199,113,184,120,241,
-162, 35,204, 45, 91,182, 44,231,100,113, 28,135,158, 61,123,250, 19,204,105, 33, 33, 33, 19,235,214,173, 91,111,206,156, 57, 98,
-145, 72,132, 78,157, 58,213,142,137,137,185,110,181, 90,195, 39, 79,158,172,112,115,142, 28, 64,163,122,245,234, 41,233, 83, 67,
-113, 23, 29,173,137,110,118,133, 58,183,185,170,192,135,228, 6,231,227, 5, 14, 87,113,100,119,200,118,249,226,114,119,174, 47,
-112,130,130,244,102,169,251, 35,180,236,182,179,215,139, 41, 20,138,147,185,185,185, 45,229,114,121, 57,145,229, 78,112,137, 68,
- 34,100,103,103, 67,161, 80,156, 52, 26,141,149,150,136,190,170, 14, 1, 24, 46, 93,186, 52,202,105,189,115,143, 30, 61,126,216,
-186,117,107,236,182,109,219,112,240,224, 65, 68, 70, 70, 98,193,130, 5, 89, 57, 57, 57, 47, 1,216,154,159,159,239,243,186,213,
-171, 87,111, 16, 24, 24,136,189,123,247, 2,192, 78, 0,175, 12, 27, 54,140,177, 88, 44, 88,184,112,161, 22,192, 31, 33, 33, 33,
- 27, 87,173, 90,213,164, 81,163, 70,210,109,219,182,169, 15, 30, 60,248,167,159, 34,203,198,243,252, 45, 2,203,249,158, 6, 5,
- 5,249,227,104, 89,130,131,131, 79,169,213,234,126,122,189, 94, 45,147,201,130,212,106,181,209, 89, 96, 9,252, 28,199,137, 47,
- 94,188,152, 9, 32, 57, 56, 56,248, 20, 60, 84,115,114, 28,215,169, 83,167, 78,156,107, 26,228,228,228, 32, 59, 59, 27,102,179,
- 25, 77,155, 54,101, 68,140, 69, 84,116,243,164,203,176, 14, 84,100,221, 35, 71,139, 8,207,186,208, 75,208, 93, 79,195,205,155,
- 55, 59,214, 89,150,197,247,223,127,239,151, 40,218,186,117,171,215, 6,235, 46, 85,135, 62,173,113,225,248, 47,191,252,178,108,
-122, 11,187,147,197,178, 44,198,142, 29, 11,153, 76,134,169, 83,167, 98,236,216,177,224, 56,206,103,213,161,179,128, 73, 28,163,
-115,254, 56, 42,123, 40,236,237,161, 24,134,113, 22, 91,140,191,226,205,155,155,231, 79, 77,128, 51,167,112, 94, 64, 64,128,199,
-134,240, 46,156,222, 46,240, 27,128,171,177,177,177,123, 91,182,108, 25,124,228,200, 17,204,158, 61, 91, 98, 52, 26,171,109,219,
-182,205,113, 93,119,247, 75,171,213,202,233,147, 67,113, 55,220, 44, 47,187,243, 92,218, 87, 49,206,213,120, 94,126, 93,143,135,
-211, 54,103,222, 60,134, 97, 44,110,174,151,231, 70, 92,185, 94,195,249,152, 60,143,142,150,175,194,194,151,224,242,199,209,210,
-233,116,127,254,241,199, 31,205,159,123,238, 57,206, 91,181,161, 86,171, 69,116,116, 52, 78,159, 62,109,213,233,116,127,250,225,
-148, 85,166,208,114,197,182,220,220, 92,145,197, 98, 65,205,154, 53, 17, 23, 23, 7,131,193,128,226,226, 98, 17,128,173,126,114,
- 72,148, 74,165, 8, 0,138,139,139,129,178,174,166,181,107,213,170,133,163, 71,143,162,176,176,240, 23, 0,221, 38, 78,156,216,
-180, 69,139, 22,146, 21, 43, 86,232,222,120,227,141, 95, 44, 22,139, 95, 74,131,231,121,147,213,106, 77, 98, 89,214, 92, 92, 92,
-156,225,124, 63,163,163,163,195,148, 74, 37,147,147,147, 99,241, 71,104, 53,106,212,232,208,141, 27, 55, 48,121,242,228,188,105,
-211,166,213, 42, 45, 45, 45, 42, 41, 41,177, 58,139, 45,131,193,192, 70, 68, 68,200, 22, 46, 92, 40, 7,128, 70,141, 26, 29,242,
- 36,180,180, 90,109, 85,133,226,159, 15, 99,163,209,136,236,236,108,100,103,103, 35, 39, 39, 7,165,165,165, 72, 78, 78,134, 78,
-167, 75,160,197,204,191, 38,180,202, 85,159, 57, 63,223,206, 47,242,138, 60,235,206, 2,166,119,239,222,142,182, 93,130, 67, 38,
- 44,171, 87,175,118,109, 96,238,151,208,250,242,203, 47, 49,114,228, 72, 4, 4, 4, 96,206,156, 57,229,170, 14, 93,197, 1,207,
-243,140, 63,113, 79,122, 79,143,236,249, 97, 16,139,197, 8,127, 35,167, 92, 21,157, 27,193,225, 87, 56,167, 77,155, 86, 41, 85,
-135,206,156, 9, 9,101,143,202,226,197,139,209,175, 95, 63,236,222,189,251,182,171, 14, 83, 82, 82,126,218,176, 97, 67,240,153,
- 51,103,160, 86,171,145,151,151, 7,163,209,136,244,244,116,143,181, 2,246,178, 60,128, 62, 57, 20,247,184,156, 58,124, 47,121,
- 43,243,122,156,143, 23,184,223, 66,203, 31, 71,203,104, 52,206,121,243,205, 55,135,117,238,220, 57, 44, 40, 40, 8,153,153,153,
-183,136, 44,141, 70,131,192,192, 64,232,245,122,172, 95,191, 94,109, 52, 26,231,248, 18, 7, 22,139, 5, 81, 81, 81,200,207,207,
- 7,239,161,253, 52,203,178,144,203,229,208,104, 52,128,143, 70,230,238, 94, 24,102,179, 25, 22,139, 5, 22,139, 5,102,179,185,
-162, 51,114, 43,148, 74,165, 32, 60, 0, 64, 91,165, 74,149,154, 1, 1, 1,184,118,237, 26, 80,214,179,175,115,247,238,221,197,
- 5, 5, 5,228,213, 87, 95,221, 67, 8,121, 29,222, 71,199, 55,237,218,181, 43, 9, 0,228,114,249, 5, 0, 72, 79, 79,183, 20,
- 23, 23,151,115, 10, 21, 10, 5,233,219,183,111, 44, 33, 4,187,118,237, 74,146, 72, 36, 4,158,123, 53, 26,214,173, 91,119, 38,
- 56, 56,120,249,140, 25, 51,158, 75, 77, 77, 61,221,160, 65,131, 36,173, 86,155,171,215,235,245, 6,131,129,136, 68, 34, 73,104,
-104,104,192,150, 45, 91, 46,239,223,191,191,179, 74,165, 90,190,110,221,186, 51,158,156, 55,165, 82,153,174,211,233, 18,133, 52,
-117, 22, 89,217,217,217, 32,132,224,234,213,171, 80, 40, 20, 55,124, 85,235, 82,220, 61, 8, 31, 85,174,206,139,235, 54,127, 69,
-150,179, 48,216,178,101,139,215, 49,180,252,229,116, 22, 69,239,188,243, 14,230,207,159,127,139,163, 53,117,234, 84, 0,192,248,
-241,227,253,110,163, 37,184, 87,217,243,195, 16, 51,178,176, 92,216, 1,128, 17,194, 87,177,103, 30, 28,199, 97,242,228,201,183,
- 52, 82,119,174,218,243,179,138,175, 92, 56,115,115,115,193,113, 28,194,194,194, 48,112,224, 64,116,237,218,213, 81, 5, 89, 81,
-222,115,231,206,237,125,239,189,247, 26,166,164,164, 96,202,148, 41,133, 33, 33, 33, 65,175,189,246, 26, 87, 92, 92,204,120,115,
-180,168,208,162,160,168, 4,161, 37, 60, 96,254,246, 58,244, 80, 88,118, 70,249,177, 54, 74,116, 58,221,192, 46, 93,186,172, 93,
-185,114,165,188,122,245,234, 56,119,238, 28, 10, 11, 11, 97, 50,153, 32,145, 72, 16, 27, 27,139,226,226, 98,124,255,253,247,122,
-157, 78, 55, 16, 64,137, 15,206, 15,154, 53,107,246,213,172, 89,179, 2, 26, 55,110,140,194,194, 66,104, 52, 26,135, 16, 98, 24,
- 6, 42,149, 10,114,185, 28,135, 14, 29,194,230,205,155,245, 0, 62,240,193,233, 78,205,193,108, 54, 59, 4,151, 31, 66,203,153,
- 83, 41,184, 58, 58,157, 14, 0, 44, 85,171, 86,141, 1,128,171, 87,175, 2, 64, 90,114,114,242,196,234,213,171, 51,203,150, 45,
- 35,132,144,205, 30, 68,150,131,147, 97,152, 66, 66, 72, 17,128, 24,147,201, 36, 1,128,146,146, 18,115, 68, 68, 68,148, 76, 38,
-227,229,114, 57, 31, 16, 16,192,103,102,102, 90,173, 86,171, 4, 0,218,180,105, 99, 2,144,237, 50, 71,161, 51, 39, 79, 8, 81,
- 47, 90,180,104,226,160, 65,131, 90,182,106,213, 42,101,232,208,161,167, 94,125,245, 85, 54, 46, 46, 46,180,180,180,212,112,233,
-210,165,162,207, 62,251,172,244,192,129, 3,157,197, 98,241,245, 69,139, 22, 77, 4,160,102, 24,134,119,199,105,181, 90,255,220,
-182,109,219, 75,169,169,169, 92, 70, 70, 6,114,114,114, 28, 34, 43, 39, 39, 7,117,235,214,197,254,253,251,109,102,179,121, 91,
- 5,238,103,101,129,114,150,125,132, 16,225, 89,247, 36,176,132,143, 41,127, 57,157, 69, 81,191,126,253,202,185, 88, 18,137, 4,
-107,214,172,113, 91,110,184,121,174,202,197,221,121,140,175,247,222,123,175,156,104,251,240,195, 15, 61, 22,103,190,238,167,192,
- 83,178, 56,174,124,175, 67, 15,207,185,183,112, 10,101,167, 88, 44,198,135, 31,126,232,183,163,133, 91,219,104,221,194, 41,196,
-189, 93,187,118,208,233,116, 14, 33,235,201,209,242,117, 63,109, 54,219,200,249,243,231, 19,149, 74,245,152, 90,173,126,254,198,
-141, 27, 75,116, 58,221,163, 37, 37, 37, 94, 29, 45,163,209, 40,163,207, 17,229,196,221, 25,159,235,225, 17, 90,246,151, 36,170,
- 86,173, 90,110,238, 44,150,101,203, 45, 21,105,103, 96,199,150,139, 23, 47, 62,245,248,227,143,255, 56,114,228,200,160,198,141,
- 27,139, 19, 19, 19,161,213,106,113,237,218, 53,156, 62,125,218,186,110,221, 58,181, 78,167,123, 30,128, 63,189,206,150,158, 57,
-115,102,115,183,110,221, 38,180,104,209,226,127, 31,125,244,145,168,118,237,218, 40, 41, 41, 65,104,104, 40,162,162,162,112,254,
-252,121,172, 95,191,222,150,159,159,255, 21,128, 73,112, 83,135,234,235,131,223,108, 54, 99,192,128, 1,224,121, 30,115,231,206,
-133, 63, 19, 42, 59,193,108, 54,155, 9, 0,198,222,158, 75,103, 31, 93, 26,151, 46, 93, 2,128,235, 73, 73, 73, 65, 0,176,109,
-219, 54, 6,101,227,107,249,243,133, 79, 8, 33, 14,103,171,110,221,186,215, 92, 11, 71,193,201, 18, 92, 48, 95,225,102, 24,198,
- 64, 8,201,213,233,116,221,222,121,231,157, 9, 95,126,249,229,115, 95,126,249,229, 45,199,169, 84,170,229,179,103,207,158,244,
-236,179,207,230, 50, 12,227,177, 29,153, 86,171, 29,255,226,139, 47, 62,123,242,228,201,160,128,128, 0,104,181, 90, 20, 20, 20,
-192,108, 54, 35, 57, 57, 25,185,185,185, 88,186,116,105,169, 94,175,255,152, 62,142,255, 14,156,133,129, 39, 87,203, 15,145,229,
-209,213,249,237,183,223,220,142, 81, 85, 81, 78, 87,177,225,239,216, 86,222, 62,138,132, 97,105,220, 13, 25, 81,193,114,237, 22,
- 94,142,227,240,233,167,159, 58, 6,109,117,231,100, 85,196,209, 18, 56,195,194,194,202,108,114,133, 2, 60,207,163,103,207,158,
-119,194,203, 3, 24,225, 52,226,251,180,209,163, 71, 79,172, 91,183,110,109, 0, 50,231,123, 80, 65, 23,159,130,130,194,151,208,
-178,217,108,233,117,234,212, 41, 87,192,249,154,204,212, 98,177,164,251,121,221,205, 90,173, 54,121,246,236,217,111, 42,149,202,
-206, 58,157,174,161,189,224, 56,169,213,106,183, 25,141,198,121,168,216, 36,208,121, 0,134, 31, 56,112, 96,110,183,110,221,166,
-118,236,216,241,153, 81,163, 70, 49,132, 16, 44, 92,184,144, 92,185,114,101,181,221,197,186,114, 59, 55, 41, 44, 44,236,204,247,
-223,127, 31,189,118,237, 90, 88, 44, 22,204,155, 55, 15, 65, 65, 65,103, 10, 11, 11,253,165,200,221,190,125,251, 15,173, 90,181,
-122, 97,255,254,253, 75, 1,156,216,185,115,231,146,214,173, 91,191,184,127,255,254,159, 0,156,254,235,175,191,150,180,104,209,
-226,197,195,135, 15,175, 2,112,188, 2,133,175,195,217,178, 90,221,215, 52,122,112,178,188,113,170, 9, 33,230, 33, 67,134,140,
-122,246,217,103,191, 57,124,248,240,163,197,197,197, 13, 1, 32, 36, 36,228,100,243,230,205, 15,173, 92,185,242,188,221,201,242,
-213, 88, 63, 79,171,213,246,109,216,176,225, 47, 83,166, 76, 81,166,164,164,112, 53,107,214, 68, 90, 90, 26, 78,157, 58,101,253,
-238,187,239, 52,122,189,190, 55,128, 34,250, 56,254,123, 66,139, 16,130,144,144,144,114, 31, 81, 66,151,255,138, 86, 23, 58,191,
-152,133,169,122, 92,121, 61,113,122, 27, 54, 65, 64, 96, 96,160, 99,112, 83,127,154, 44,240,188,247,241,216, 8, 33, 14, 78, 97,
-241, 67,100,249,236, 33,104,159, 2,199,111, 78,127,134,119, 80, 42,149,176, 88, 44, 14, 94, 63,122,126, 86, 84, 45,254, 6,224,
- 55,139,197,114, 9, 64, 13, 42,174, 40, 40,238,162,208, 42, 42, 42,106,118,151,175,173, 54, 26,141,147,140, 70,227, 36, 97,131,
-193, 96,184, 83,206, 43, 0,158,221,190,125,251,172,237,219,183, 11,245, 8,147,225,123,190, 68,175, 56,119,238, 92,170, 88, 44,
-254,122,249,242,229, 45, 8, 33, 8, 14, 14, 62,144,150,150,246, 90, 69, 56,108, 54,219,144,253,251,247, 15,131,189, 45,147,217,
-108, 30,178,119,239,222, 55, 81, 54, 31, 19,108, 54,219,144,131, 7, 15, 58,214, 43,248,162, 36,132, 16, 35, 33,164,138,135, 67,
-140, 21,116,224, 4,103,203,180,114,229, 74, 13,128,191,241,207, 56, 89, 22,251, 98,112,169, 46,244,134,191,180, 90,109,205, 15,
- 63,252,112,154, 72, 36,234,164,213,106,227,148, 74,229, 77,171,213,250,167, 78,167,251, 0,101,115, 84, 81,252, 75, 48,153, 76,
- 25,117,234,212,225,220,125, 64,121,123,145,123,251,176,178,217,108,233,181,106,213,242,249,113,230,134, 51,195,139,104,184,158,
-156,156,204,250,203, 37,192,108, 54,231,122, 11,103,114,114, 50, 42,202,233, 43,238, 73, 73, 73,110,227,238, 67, 16,122,140,187,
-213,106,189, 45, 78,111,247,211, 27,244,122,125, 81,100,100,164,198, 96, 48,136,141, 70,163,216,106,181,150,179, 31,229,114,121,
-158, 94,175,167, 15, 15, 5,197,157, 8,173,251, 28, 71, 80, 54,189, 68,101,193,120,242,228,201, 23, 28,246, 84,110,238,237,242,
-184, 42, 73,141,143,245,138, 8,163, 74,119,132,236, 66, 74, 87, 73,116,249, 26,141,230, 85, 97, 69,104, 3, 66,241,239,163,160,
-160,224,177,202,230, 44, 44, 44,172,244, 15,181,252,252,252,150,119, 33,238,205, 30, 86, 78,111,200,204,204,124,204,135, 16,163,
- 15, 14, 5,133,159, 96,233, 45,160,160,160,160,160,160,160,160,184, 59, 96, 80,214,115,192, 29, 42,210,155,160,243,109, 92,123,
- 27,229,164,156,148,147,114, 82, 78,202, 73, 57, 31, 58, 78, 95,220, 15, 76,111,198,123,209,206,177, 51,229,164,156,148,147,114,
- 82, 78,202, 73, 57, 41,231,195, 8, 66, 8,173, 58,164,160,160,160,160,160,160,160,184, 91,160, 66,139,130,130,130,130,130,130,
-130,130, 10, 45, 10, 10,138,251, 20,181,171, 86,173,122,182,118,237,218, 25, 0, 6,223,229,107, 13,108,209,162, 69,129, 76, 38,
-219, 2,160, 54,189,245, 20, 20, 20, 84,104, 81, 80, 80, 60,208, 34,171, 97,195,134,123,206,157, 59, 87,119,219,182,109, 85,226,
-226,226, 62,185,155, 23,107,214,172,217,204,221,187,119,135,253,241,199, 31, 93, 98, 98, 98,118,221,166,216,170, 93,173, 90,181,
-179,181,107,215, 78, 7, 48,176,146,131, 56,184,101,203,150,133, 82,169,116, 51, 21,130, 20, 15, 1, 26, 0,104, 72,133, 22, 5,
- 5, 5,197, 93, 20, 89,251,246,237, 11, 55, 24, 12, 56,119,238, 28,242,242,242,142,223,205, 11, 94,184,112,161,104,223,190,125,
-136,143,143,199, 79, 63,253, 20,153,148,148,180,187,130,130,166,118,195,134, 13,247,156, 61,123,182,238,182,109,219,226,162,162,
-162, 62,171,204,240, 61,250,232,163, 83,119,239,222, 29,186,101,203,150,174,145,145,145,183, 43, 4, 41, 40,254,203,144, 1,120,
-129, 97,152, 67, 13, 26, 52, 56,153,146,146,114,130, 97,152,253, 0,250,225,193, 29,187,211, 63,108,216,176, 97,231,134, 13, 27,
-118,210, 60, 66, 65, 65, 81, 9, 72, 73, 73, 73,209,106,181, 90,146,151,151, 71, 62,255,252,115, 18, 22, 22,102, 6,240, 39,128,
-117,110,150,247, 1,168,252,228, 86,217,143,119,199,243,103, 88, 88,152,249,243,207, 63, 39, 87,175, 94, 37,103,206,156, 33,181,
-107,215,214,251, 41,104,106, 55,108,216, 48, 95, 8,243,166, 77,155, 8,199,113,155, 43,243,166,168, 84,170,211,187,118,237, 34,
- 87,174, 92, 33, 91,182,108, 33,209,209,209,185, 84,108, 81, 60, 32, 72, 4, 48, 51, 48, 48,176,176, 87,175, 94,228,219,111,191,
- 37,235,215,175, 39,191,252,242, 11,153, 51,103, 14,233,208,161, 3,145, 74,165, 25, 0,198, 0, 8,121, 88,180, 8, 33,164,108,
- 86,251, 13, 27, 54, 16, 0,237, 1, 32, 53, 53,149,138, 45, 10, 10,138, 59,197, 62,157, 78,215, 82,167,211,161,180,180, 20, 85,
-171, 86,133, 88, 44,118,123, 96,110,110, 46,246,238,221,139, 17, 35, 70,156,201,206,206,110, 11,239,243, 94,134, 54,105,210,100,
-223, 95,127,253, 85, 59, 40, 40,200,177,145,231,121,152,205,102, 88, 44, 22,152,205,102, 24,141, 70, 24,141, 70, 72,165, 82,200,
-229,114,132,133,133,157,130,247, 42, 12,135,251,166,215,235,113,236,216, 49, 12, 26, 52, 40,175,160,160,160, 45,128, 11,149,120,
- 95,106, 71, 69, 69,237, 90,186,116,105,100,114,114, 50,110,220,184,129,151, 95,126, 57,255,250,245,235,109, 42,249, 58, 20, 20,
-247, 18, 99,159,122,234,169,169,209,209,209,108,131, 6, 13, 16, 27, 27, 11,163,209, 8,189, 94, 15, 66, 8, 56,142, 3, 33, 4,
- 37, 37, 37,216,181,107, 23,254,250,235, 47, 99, 81, 81,209,247, 0,230, 1,184,232, 36,178, 30, 56, 45, 82, 78,104,165,166,166,
- 50, 52,175, 80, 80, 80, 84, 18, 78,150,148,148, 52, 48, 26,141,208,106,181,126,157,112,245,234, 85, 12, 30, 60,248, 76,118,118,
-246,227,112, 63,169,188,170, 73,147, 38, 7,119,237,218, 85,219, 96, 48, 64,173,246, 61,239,188, 84, 42, 69, 64, 64, 0,194,195,
-195,247, 3,104,229,233, 75,188, 65,131, 6, 71,246,239,223, 31,166,215,235,113,252,248,113, 12, 28, 56,208, 92, 88, 88,184, 7,
-128,167,192, 23,162,108, 30,213,235,110,246, 37, 0,120,211,254,133,239, 14,202,200,200,200,214,203,150, 45,147, 84,175, 94, 29,
- 58,157, 14,253,250,245, 43,188,112,225, 66,115, 0,215,104,214,161,184, 15,113,225,220,185,115,181,108, 54, 27,242,243,243, 97,
- 52, 26,161,211,233, 28, 66, 75, 36, 18,129, 16, 2,171,213,234,248, 48, 58,122,244, 40,182,109,219, 70,174, 94,189,250,145,253,
- 89,122, 32,181, 8, 21, 90, 20, 20, 20,119, 11,181,107,213,170,117,252,247,223,127, 15,144, 72, 36, 88,191,126, 61, 62,250,232,
- 35, 75, 97, 97,225,110, 87,241, 18, 29, 29,157,178,100,201,146,164,228,228,100,156, 56,113, 2, 79, 63,253,244, 7, 0,166,185,
-225,124, 95,173, 86, 79, 53,155,205, 56,126,252, 56, 94,124,241,197,107, 57, 57, 57,167, 93, 69, 76, 82, 82, 82,155,207, 62,251,
- 76,220,180,105, 83,168,213,106, 60,243,204, 51,186,243,231,207,183, 0,112,218, 67, 88, 63, 43, 44, 44,124,199,102,179,161,180,
-180, 20,241,241,241,144, 72, 36, 94, 35,167,215,235,145,152,152,184, 63, 47, 47,239, 22,241, 22, 30, 30,190,253,198,141, 27, 29,
-228,114,185, 87, 14,179,217,140,244,244,116, 72,165, 82, 24,141, 70,212,168, 81,227,123, 0, 67,104,214,161,184, 31,133,214,223,
-127,255, 93,235,231,159,127, 70,147, 38, 77, 80,175, 94, 61,104, 52, 26,135,232, 50,153, 76,176, 88, 44,183,156,164, 86,171,241,
-246,219,111, 95,132,189,250,252, 65, 21, 90, 66,195,180,137, 66,157,104,106,106,106, 59,154,103, 40, 40, 40,238,180,224,189,120,
-241, 98,227,206,157, 59,239, 94,189,122,117, 68,143, 30, 61, 80,163, 70, 13,241,147, 79, 62, 25,169,211,233, 58, 57, 31,152,147,
-147, 19,250,226,139, 47, 30,185,121,243,102,146,125, 83,115, 15,156,205,131,130,130,112,245,234, 85, 65,100, 53,131, 75, 53,163,
- 84, 42,221,252,247,223,127,139,165, 82, 41, 14, 31, 62,140,193,131, 7,231, 95,187,118,205, 87,181, 92,136,201,100,130, 72, 36,
- 2, 0,164,167,167,251,140,220,141, 27, 55,192,243,188,209,221, 62,150,101,101, 71,143, 30, 69,149, 42, 85,188,114,176, 44,235,
- 42,232,138,105,182,161,184, 79, 97, 49,153, 76,104,214,172, 25,174, 93,187,134,163, 71,143, 58, 4, 87,126,126, 62, 50, 51, 51,
-203, 29,124,232,208, 33, 28, 59,118, 12,109,219,182,117,229,121, 32,181,136, 67, 57,110,216,176,161,157, 61,114, 59,105,158,161,
-160,160,168, 36,212,174, 82,165,202,174,165, 75,151, 70,198,198,198,162, 67,135, 14, 55,179,179,179,171,185, 57,110, 29, 33,164,
-247,213,171, 87, 81,189,122,245,245, 0,250,220,206, 49, 9, 9, 9,121,135, 15, 31,142, 56,115,230, 12, 6, 14, 28,152,103,111,
-243,229,171,237, 83, 82,221,186,117, 15,111,217,178, 37,140,101, 89,156, 62,125,218,159,170,195, 52,148,181, 47,185,238,102, 95,
- 2,128, 15, 1,132,121, 56, 87, 89,171, 86,173,214, 71,142, 28,145, 48, 12,131,180,180, 52,161,234,176,153,157,151,130,226,126,
- 67,223, 42, 85,170,124, 55,108,216,176,224, 22, 45, 90, 32, 61, 61, 29, 25, 25, 25, 40, 42, 42, 66,227,198,141,145,146,146,130,
- 43, 87,174, 96,243,230,205, 56,118,236, 24,100, 50, 25,226,227,227, 17,184,252,103,124,205,224, 12,128,148, 7, 85,139,220,139,
-185, 14, 41, 40, 40, 40,106, 75, 36,146,205,113,113,113,185,112, 63, 46, 85,232, 51,207, 60,147,105,179,217,200,149, 43, 87, 8,
-202,122, 15,194,131,208, 34, 87,174, 92, 33,209,209,209, 87, 1,132,186, 57,102,112, 76, 76,204, 77,133, 66,113, 10, 21, 28,214,
-161,102,205,154,121,231,207,159, 39, 55,111,222, 36,127,252,241, 7, 9, 15, 15,191, 27, 61, 2,107,215,169, 83, 39,191,180,180,
-148, 24, 12, 6,178,107,215, 46,146,144,144,144, 7,218,243,144,226,254, 71, 16,128,201,201,201,201,134, 89,179,102,145,205,155,
- 55,147,197,139, 23,147,169, 83,167,146, 81,163, 70,145,150, 45, 91,146,150, 45, 91,146,126,253,250,145,119,222,121,135,116,239,
-222,157, 4, 6, 6,150, 0,120,242, 65,190, 41, 84,104, 81, 80, 80,252, 27, 72, 0, 48,199, 46,168,214, 61,243,204, 51,153, 70,
-163,145,100,100,100,144, 53,107,214, 16,148, 13,221,224, 14,239,103,103,103,147,236,236,108, 97,104,132,171,248,103, 88,135,111,
-237,188,119, 36,130, 18, 19, 19,243,142, 28, 57, 66,210,210,210,200,166, 77,155,136, 93,176, 85, 26,228,114,249, 22,181, 90, 77,
- 12, 6, 3,217,190,125, 59, 29,222,129,226, 65, 68, 20,128, 5,245,235,215,183,204,157, 59,151,172, 91,183,142,124,254,249,231,
-164,111,223,190,100,204,152, 49,164,127,255,254, 36, 50, 50,210, 8, 96, 6,128,224, 7,253,102,220, 11,161, 69,103, 54,167,156,
-148,147,114,186, 98,243,153, 51,103,136, 0,155,205, 70, 50, 50, 50,200,150, 45, 91, 72, 76, 76,204,105,148, 31, 79,203,153, 83,
- 85,175, 94,189,115,231,207,159, 39, 55,110,220, 32,102,179,217,193,113,238,220, 57, 2, 96,103, 37,132,179,118, 92, 92, 92,238,
-142, 29, 59,200,249,243,231, 73, 76, 76,204,205,202,140,123, 98, 98, 98,110, 94, 94, 30,217,190,125, 59,137,140,140,244, 37,178,
-104, 94,162,156,247, 51,103, 34,128,101, 77,155, 54,181,205,159, 63,159,252,239,127,255, 35, 9, 9, 9, 54,251, 71, 81,220,195,
-162, 58,157, 27,195, 83, 80, 80, 80,220, 43,200, 14, 28, 56, 0,153, 76,230,216,112,226,196, 9,231,113,180, 60,141,219,160, 62,
-123,246,236,227, 61,122,244,216, 61,127,254,252,122,206,189,152,118,236,216, 1, 0,198, 74, 8,219,133,140,140,140,182,221,186,
-117,155, 23, 30, 30,254, 72,118,118,246,132,202,140,120, 90, 90,218, 59, 13, 27, 54,156, 86, 90, 90,170,214,233,116,253, 64,199,
-206,162,120,112,145, 6, 96,208,209,163, 71, 63, 57,122,244,232, 7, 0, 8,128, 41, 0,206, 62,108, 55,130, 10, 45, 10, 10,138,
-123,141,193,175,190,250,170,107, 99,241,195, 0,190,240, 34,178, 4, 20, 93,187,118,173, 85,207,158, 61,135,161,124,239, 68,161,
-113,122,101,224,130,201,100,234,234,218, 83,170,146,240, 83,118,118,246, 79, 52, 11, 80, 60, 68, 56, 13,160,255,195,124, 3,168,
-208,162,160,160,184,215,184, 14,224,229, 59, 56, 95, 13,247,227,108, 81, 80, 80, 80,252,231, 64, 39,149,166,160,160,160,160,160,
-160,160,160, 66,139,130,130,130,130,130,130,130,226,254, 2, 3,207, 61, 7,182, 85,128,231,118,122, 52,108,163,156,148,147,114,
- 82, 78,202, 73, 57, 41,231, 67,199,233,139,123, 27, 30, 16,208,225, 29, 40, 39,229,164,156,148,147,114,222, 13, 78,198,190,176,
-246, 69, 88,255, 47,199,157,249, 15,199,253, 97,225,124,224,240,111, 14,239, 32, 36, 4,143,178, 46,159, 20,255, 61, 56, 63, 32,
-132,166, 19, 5, 5, 69, 5,203, 14,145,211,203,214,102, 95,240, 31, 44, 75,156, 69, 1,127,135,239,165,187, 17,247,135,153,243,
-129,128, 55,161,245,136, 82,169,252, 72, 42,149, 38, 51, 12, 99,211,106,181, 39,141, 70,227, 34, 0,251,239,240,154,223, 70, 71,
- 71, 15, 46, 40, 40,224, 89,150, 5,203,178, 96, 24, 6, 44,203, 66, 44, 22,235, 75, 74, 74, 84,183, 67, 26,217,160,239,187, 28,
-195,140,180, 17,219,162,220, 83,235,167,250,218, 78,225,253,129,145, 72, 36, 79,133,133,133,133,228,229,229, 17,150, 45,107,202,
- 39, 18,137,132,137,112,173, 37, 37, 37, 63,248, 75, 22, 26, 26,122, 40, 44, 44, 44, 68, 56,159, 97, 24, 20, 20, 20, 20,231,230,
-230, 62, 10, 0, 1, 1, 1,123,149, 74,101, 56,199,113, 16,137, 68, 16,137, 68,208,233,116, 5, 5, 5, 5,143,211,164,184, 63,
-177,106,213, 42, 81,183,184,151,107,112, 68,223,136,101, 73, 48,207, 51, 37, 86, 70,126, 98,115,198,183,151,253, 57,191, 95,191,
-126, 54,122, 23,239, 29,164, 82,233,220,232,232,232, 87, 52, 26,141,142, 97, 24,194, 48, 12, 24,166,236, 59,203,245,215,102,179,
-165, 23, 20, 20, 52,243,241,178, 21, 75,165,210,217, 49, 49, 49, 47,234,116, 58,157,157,207, 45, 47, 0, 88, 44,150,244,252,252,
-252,102,126,149,245,145,145,139,228,114,249,243, 58,157, 78,203, 48, 12,239,226, 30, 56,191,204,175,228,231,231,183,241, 37, 12,
-164, 82,233,188,232,232,232,151,236,113,119,132,243, 78,227, 30, 29, 29,253,162, 86,171,245,139,211, 75,220,111,225,188, 27,225,
-252,143,114, 62,248, 66,171,113,227,198, 63, 31, 60,120,176,150, 88, 44, 6, 0, 24, 12,134,134, 11, 22, 44,120,225,189,247,222,
-155, 1, 96,220,109, 94,111, 73,155, 54,109, 6,236,218,181,139, 93,183,110, 29,219,188,121,115, 48, 12, 3,155,205, 6,155,205,
-134, 6, 13, 26,200,111, 55, 34,193, 74,197,216, 99, 91,191, 14,120,164,243,171, 35,115,129,169,190,182,123, 19,152, 0,198, 3,
- 72,174, 96, 16,242,236,247,229,152, 7,177,177,143,101,217, 10,113,242, 60,127,181,168,168,168,149, 23, 1, 83,233,156,118,145,
-245,116,155, 54,109,130,183,109,219,198,220,188,121,147,145,203,229,224,121, 30, 54,155, 13, 22,139, 5,245,235,215,175,144, 19,
- 26, 18, 18,162, 26, 59,118,108,141, 39,158,120, 2,107,214,172,193, 11, 47,188,128,214,173, 91, 95,204,205,205, 5, 0, 40,149,
-202,240, 51,103,206,212, 10, 11, 11,131, 78,167, 67, 73, 73, 9,186,116,233,130,130,130,130,251,250,225,122,172,113,252, 20,134,
-101, 28, 99, 69, 17,171,173,240,224,137,204,241,119,202, 27, 22, 22,118, 76, 38,147, 69,251, 84,203, 78, 47, 50,131,193,144, 83,
- 88, 88,216,196,199, 41,137, 0,122,137, 68,162,154, 28,199,213, 1,144,104,181, 90,163, 1, 64, 34,145,228,136, 68,162, 52,139,
-197,114,222,100, 50, 93, 2,240, 27,188, 76,128,220, 45,238,229, 26,140, 85,247, 76,169,145,239,161,168, 62,163,182,238,202,216,
- 11, 10,153,110, 83,183,184,151, 87,251, 43,182,254, 69,212, 6,176, 18,101, 19, 74,255, 15,101,227, 0,221, 9,226, 0,244, 70,
-217,156,143, 73,102,179, 57, 31,192, 81,148,181, 67,185, 8, 32, 33, 50, 50,242, 39,158,231,141, 5, 5, 5, 47,195,205, 68,213,
- 45,154, 86, 61,194,178,108,188,224, 9,240,196,150,126,224,104,122,165,188,160, 88,150,157,151,154,154,250,210,234,213,171, 21,
- 71,143, 30, 85,212,171, 87,207,241, 65,196,243,252, 45,109, 76,146,146,146,124,185, 26, 28,203,178,115,159,121,230,153,231,150,
- 45, 91,166,184,126,253,186,162, 74,149, 42, 14, 78,103,177, 37,160, 74,149, 42,254,230,253,111,187,118,237, 58,104,233,210,165,
-226,245,235,215,203, 35, 34, 34, 16, 30, 30, 14,137, 68,114,203,177,143, 63,254, 56,239, 59,234,236,188, 62,125,250, 12, 90,177,
- 98,133,226,224,193,131,138, 6, 13, 26, 64, 36, 18,221,113,220,251,246,237,251,220,207, 63,255,172, 56,121,242,164,162,102,205,
-154, 16, 76, 5, 87, 62,150,101, 81,181,106, 85,191, 56,123,247,238,253,220,202,149, 43, 21,199,142, 29, 83,212,169, 83,199,113,
- 63, 9, 33,183, 29,206,255, 56,231, 67,225,104, 73,205,102, 51,118,238,220, 9,150,101, 17, 22, 22,134,193,131, 7, 99,235,214,
-173, 99,183,111,223,190,225, 54,156,173,111,237, 34, 75, 12, 0,191, 60,223, 23, 87,197,192,136, 92, 19, 36, 18, 9,174, 92,185,
- 2,145, 72, 84, 97,107, 81, 38,147,189, 72, 8,249, 80,151,113, 88,166,215, 91, 96,200, 60,162,144,203,229,142, 23,128, 46,211,
-190, 61,235,136, 66, 46,151, 95, 17,137, 68,147, 53, 26,205, 18, 79,124, 53,107,214,252,241,244,233,211,117,221, 61,184,222,160,
-211,233, 80,173, 90,181,132,194,194,194,154,238,246,139,197,226,248,235,215,175, 71, 73,165, 82, 16, 66, 28, 15,177,235,175,240,
-223,108, 54,163,126,253,250,102,111,215,244,198,105,181, 90, 17, 16, 16, 0,193,141, 50,153, 76,208,104, 52,190, 56, 25,137, 68,
-242,148, 32,178, 0, 96,249,242,229,136,137,137, 65, 84, 84, 20,148, 74, 37,228,114,185,131,211, 95,136, 68, 34,116,235,214, 13,
- 31,127,252, 49,102,204,152,129,209,163, 71,151, 43,104,197, 98, 49,194,194,194,240,199, 31,127, 64,165, 82, 33, 33, 33, 1,130,
-192,191,175,109, 65,150, 9,219,127,228,134,195,161,237,222,177, 46,247, 88, 19,238, 75,251,171, 18, 44, 11,240,124,217,171,147,
- 97, 64,172, 22,190,232,200,201,204, 9,126,220,207, 42,105,105,105, 81,254,222, 35,171,213,138, 42, 85,170,136,124, 28,214, 35,
- 37, 37,229,151,161, 67,135, 74,106,214,172,201, 72, 36, 18,112, 28, 7,142,227, 4,129,158, 64, 8, 73,224,121,190,125, 78, 78,
- 14, 89,176, 96,193, 39, 59,118,236,120, 18,192, 38,183, 5, 11,209, 55, 42, 53,242, 61,118, 31,199,163,207,116,126, 15,127,172,
- 26,251,104,155,198, 60,130, 20,250,203, 0,254,203, 66,171,118, 74, 74,202,241,131, 7, 15, 6,152,205,102,180,104,209,226,192,
-133, 11, 23,154,226,246, 70,112, 15, 5,240,217,184,113,227, 6, 13, 29, 58, 84, 20, 18, 18, 2,169, 84,138,210,210, 82, 92,190,
-124,249,197, 31,126,248,129,124,245,213, 87, 95, 0, 8, 74, 75, 75,107,121,232,208, 33,116,232,208,225, 77, 0,111,223,170, 8,
- 68,241,123, 15, 93,139, 18,214,123,119,107, 40,105,217,140,205, 41,115,113, 92,143, 38,224,109,124,250,161,191, 51,252, 17, 98,
-159,244,237,219,119,224,234,213,171, 3, 1, 96,225,194,133,120,234,169,167, 16, 22, 22, 6,133, 66, 1,137, 68, 2,177, 88, 92,
-238,215,199,203, 86, 4,224,147,254,253,251, 63,179,108,217,178, 32, 0, 88,182,108, 25,250,246,237,139,240,240,112, 4, 5, 5,
- 65, 42,149, 66, 36, 18, 85,248,102,134,133,133,125,219,250,209, 71,135, 44, 93,186, 20, 0,240,193, 91,111,225,137,199, 30, 67,
-160, 66, 14,133, 92, 10,225, 94, 72, 69, 98,116, 31, 49,210,167,190, 4, 48,235,169,167,158,122,118,197,138, 21, 65, 0,112,244,
-232, 81,228,230,230, 34, 58, 58, 26,114,185, 28, 82,169,212, 17,103,134, 97, 32,151,203,253,138,251, 83, 79, 61,245,204,207, 63,
-255, 28, 4, 0, 75,150, 44, 65,183,110,221, 28,113,151,201,100,144, 72, 36,229, 22, 87,209,233,142,243,201, 39,159,124,102,229,
-202,149, 65, 0,240,195, 15, 63,160,115,231,206, 8, 13, 13,117,220, 79,129,171, 34,105,244, 31,231,124, 56,132,214,241,227,199,
-159, 86, 42,149,211, 1, 68, 74,165,210,144,231,158,123,174,234,144, 33, 67,208,191,127,127,108,223,190,253,245, 10, 10, 45, 38,
- 58, 58,122,240,174, 93,187, 28,111,104, 19,185, 69, 48, 85,248, 5,110,199,135, 71, 94,127, 61,102,198,101, 13, 14, 28, 58,143,
- 0,176,204,161, 89,179, 34, 13,151, 46,193,102, 50, 97,210,149,210,178,237, 86,194,236,124,103, 68,204, 35,115,191,248, 16,192,
- 18, 47, 46,128,204,104, 52,226,226,197,139, 21, 10,196,205,155, 55,193,243,188,209,155,187, 32,145, 72,112,234,212, 41,191,122,
- 33, 36, 36, 36,120,123, 0,125,114,110,222,188, 25,163, 70,141,194,249,243,231, 33, 76, 85,226, 7, 39, 19, 22, 22, 22, 34,136,
- 44, 65, 4,201,229,114,136,197, 98,134,227, 56, 70,168,218,179, 63, 92,126, 9, 99,150,101,241,227,143, 63, 98,230,204,153, 24,
- 51,102, 12, 22, 45, 90,132, 70,141, 26,253,147, 9, 57, 14,106,181, 26,161,161,161, 8, 13, 13, 45, 39, 16,239,103,184, 38,243,
-236, 57,243, 21,224, 73, 89, 35, 16,194, 3, 60, 64, 64,192, 19, 30, 57, 25,151,241,209,199,159,250,253,246, 17,139,197,184,116,
-233,146, 35, 31, 8,206,176, 32,140,156, 93,131,196,196, 68,159,121, 73, 34,145, 76,252,245,215, 95,165, 63,254,248, 35, 86,172,
- 88, 1,134, 97, 32,147,201,160, 84, 42, 17, 18, 18,130,240,240,112,199, 18, 31, 31,207,124,247,221,119,146, 70,141, 26, 77, 84,
-171,213,155,220,167, 57, 9, 86, 84,159, 81,251,153,206,239, 1, 0,158,121,143,160,232,226,212, 71,216,226, 9,193,255,101,145,
-213,176, 97,195, 61,251,246,237, 11,208,233,116,224,121, 30,155, 54,109, 82,116,238,220,121,247,181,107,215,218, 84, 84,108, 37,
- 38, 38,174,223,183,111,223,227,145,145,145, 40, 41, 41,129, 90,173,134,197, 98,129, 72, 36, 66, 66, 66, 2, 62,249,228, 19,166,
- 79,159, 62,195, 95,124,241, 69,131, 92, 46, 23,156,141, 68,247,121,169,124,102, 90,240,249,151, 33,132,148,229, 31,194,147,114,
-191,133,185,105,120,235,157,143,252, 10, 99,213,170, 85,255,183,102,205,154, 64,103,103,201, 89, 4, 56,139, 44, 97,241, 33, 12,
-216,106,213,170, 13,249,233,167,159, 28,156, 17, 17, 17,224, 56, 14, 98,177, 24, 28,199,129,101, 89,236,222,189, 27,211, 39,142,
- 67,104,100, 21,204,255,124,161,207,112, 70, 70, 70, 46,234,214,173,219,243, 75,150,252, 83,116, 55,172, 94, 29, 61, 31,127, 12,
- 81, 17, 42, 68,132, 6,149,221, 39,158,193,137,243,215,124,190,143, 0,176, 85,171, 86,125,121,213,170, 85,129,206, 31,132, 66,
- 92,133,143,103,193,197, 55,153, 76,104,214,172,153, 95,113,119,230, 20,220, 54, 65,180, 9,247, 83,184,142,240,188,250, 8,231,
- 16, 65, 8,219, 5,103, 57, 14,177, 88,140, 85,127, 44,245,232,102,223, 46,103, 69,211,221,149, 51, 45, 45, 13,211,166, 77,131,
-240,209,230,220, 84, 40, 46, 46, 14,243,231,207,247, 89, 46,185, 60, 3,205, 1, 68, 58,109, 50, 1,144, 58,253,230, 49, 12,115,
-216,205,113,194,118,177,189,198, 42, 18,101,237,198, 74, 1,132,184,225,243,196,147,111,127,231, 69,186, 28, 95,238, 58, 30,133,
-214,134, 13, 27,132,167,184,125,106,106,234, 78,251,255, 98,153, 76,118, 83,161, 80,196, 0, 40,221,180,105, 19, 94,123,237, 53,
-216,173,213,222,193,193,193,167,221,184, 58,199,141, 70,227,123, 0,114,236,155,132, 46,154,108, 97, 97, 33,191,117,235, 86,118,
-217,147, 93, 97, 34, 64,227, 15,167,163, 91,106, 42, 54,199, 73, 33, 2,240,232,185,124, 40, 20, 10, 78,173, 86, 91,156,219,109,
-185,105,187,181,205, 37, 67,137, 2, 56, 14, 45,246,108,196,168, 61, 27,241,168, 82,138,130,213, 43, 81,186,119, 23, 88,150, 65,
- 91,101, 4, 70, 15,220,138, 86, 42, 25,164, 70, 45, 88,150,117,151,179, 29,156, 23, 47, 94,236,167, 82,169,166,187,220, 96,127,
-112, 21,101,243, 56,193, 67, 56, 65, 8, 65,163, 70,141,192, 48,140,195, 45, 16, 22,225,161, 19,150, 99,199,220,214, 64,122,228,
-180, 87,193, 65,169, 84,226,207, 63,255,116, 28,211,169, 83, 39, 24, 12, 6,132,133,133,249,197,153,151,151, 71, 50, 51, 51,153,
-101,203,150, 65, 44, 22, 35, 60, 60, 28, 10,133,130, 89,186,116,233, 56,137, 68, 18,111, 48, 24,120,147,201, 4,169, 84, 58, 95,
- 72, 31,142,227,180,106,181, 58,220, 19,167, 72, 36,194,208,161, 67,241,238,187,239, 98,209,162, 69,120,253,245,215,111,113,188,
- 12, 6, 3, 34, 34, 34, 28, 98,203,205, 3,120, 55,186,251,222, 93, 78,158,224,244,177,205, 56,115,114, 27,120, 27, 15, 27, 79,
- 64,136, 13,188, 21, 56,186,245, 64,173,172,171,153,113, 4,164,172,233, 45, 0, 89,137,198,218, 46, 92, 90, 7,192,186,157, 5,
-166,185,190,194,201,113, 28, 12, 6, 3,126,253,245, 87,156, 59,119, 14,155, 54,109,130, 94,175, 71, 68, 68, 4, 66, 66, 66,240,
-216, 99,143,225,197, 23, 95, 68, 98, 98,162,207,184, 19, 66,150,220,188,121,179,113,235,214,173,153,226,226, 98, 20, 23, 23, 67,
-175,215,195,102,179,193,106,181,130,227, 56, 4, 4, 4, 64, 46,151, 35, 58, 58, 26, 6,131,129, 24,141,198, 37,158, 56,121,158,
- 41,209, 93, 25,123,225,143, 85, 99, 31,125,230, 61,130,213, 51, 25,212,168, 38,211,253,121, 36,104,200,186, 61,163,187, 0, 32,
- 60,113, 88, 11,196, 98,227,243,223, 29,247,217,240,123,158, 70,183,138,172,112,189, 94,143,210,210,210, 50, 91, 95, 42,197,234,
-213,171, 35,122,245,234,181, 43, 51, 51,179,173, 23,177,117, 11,103, 80, 80, 80,130, 72, 36,194,169, 83,167,240,213, 87, 95,225,
-207, 63,255, 68, 78, 78, 78, 81,149, 42, 85,130,219,183,111,207,190,245,214, 91,104,220,184, 49,190,255,254,251, 0, 95,156,132,
- 16,164, 93,220,141,180, 75,123,192,243,101,174,117,217,226,254, 63,241, 51,238, 90,173,214,112,252,248,241,192,111,190,249, 6,
- 81, 81, 81, 72, 74, 74,130, 66,161, 64, 64, 64, 64,185,151,172,243,139,215,215,179,169,215,235, 13,105,105,105,129, 63,255,252,
- 51,194,195,195,145,152,152, 8,133, 66, 1,169, 84, 10,142,227,192, 48, 12,150, 45, 91,134,229, 31, 15, 68,218,249,147,232,219,
-179,139,207,112, 42, 20,138,231,151, 44, 89, 82,206, 2,137, 14, 13, 5, 39,102, 33, 18, 51, 8,237,244, 36, 0,160,104,251, 90,
-111,163, 67, 58,115, 50,165,165,165,134,131, 7, 15, 6, 30, 57,114, 4, 60,207, 35, 49, 49, 17, 58,157, 14, 42,149,202, 17,255,
-173, 91,183,162, 79,159, 62,248,241,199, 31,209,178,101, 75,159,113,215,104, 52,134,147, 39, 79, 6,254,244,211, 79, 8, 11, 11,
- 67,213,170, 85, 29,113, 23, 22,177, 88, 12,145, 72,132,228,228,100,148,148,148, 32, 48, 48,208,103, 26, 29, 61,122, 52,240,167,
-159,126, 66,104,104, 40,226,227,227, 29,142,155, 32,142,102,126,249,113, 57,130, 0, 38,246,142, 57, 43,154,238,174,156,125,251,
-246, 69,141, 26, 53,160, 82,169,160, 84, 42, 29,220,222, 56, 61,104, 17,135,222,102, 24,102,131,211, 51,145,202, 48,204, 6,231,
- 95, 79,199,217,255,182, 29, 55,110, 92,179, 25, 51,102, 76,107,217,178,229,207,251,246,237, 91,238,137,207, 19,207,184,113,227,
- 82,102,204,152, 49,205,249,120, 55,215,241,236,104,165,166,166, 50,246, 72, 50, 0,146,154, 54,109,122,120,251,246,237, 97, 65,
- 65, 65,142,131,111,220,184,129,226,226, 98, 4, 5, 5,169,102,207,158,173,106,223,190, 61,162,163,163, 29, 95, 0, 23, 47, 94,
-172, 95,187,118,109, 53, 0, 87,223,150,103, 89, 22,173, 90,181,194,105,123,109, 71,183,212, 84,196,199,199, 59, 26,121, 4, 4,
- 4, 96,248,240,225,204,168, 81,163, 56,193,205, 32,132, 64,175,215, 35, 54, 54, 86,238,205,213, 1,128, 20,125, 62,214,182,111,
- 11,150, 1,116,199, 14, 65, 34,101,192,138, 24, 52, 33, 5,248,189, 67, 91, 48, 0, 76,127,239,135, 31, 46,204, 49, 0, 93,238,
-142,195, 65,112,249,242,101,191, 28, 45,123,188,152,219,229, 20, 28,141,125,251,246,193,102,179,249,203, 73, 88,150,133, 82,169,
- 68, 76, 76, 12,228,114, 57, 20, 10, 5,243,243,207, 63,143, 79, 74, 74,138, 29, 53,106, 20,171, 86,171,217, 86,173, 90,225,169,
-167,158,226,132, 42,206,148,148, 20,159,113,217,185,115, 39,190,250,234, 43,188,254,250,235,110, 29, 45,134, 97, 16, 25, 25, 9,
-149, 74,133, 7, 5, 60, 0,179,213, 2,157, 70,239,168,210,181,217,108, 56,185,227,239, 90, 87,255,190,152,178,225,231, 31,197,
- 0, 96,216,177,214,249,180,216,167,190, 92, 89,187, 93,168,248,224,206, 34,203, 65,111,121,158,227, 56, 12, 30, 60, 24, 51,102,
-204,192,243,207, 63,143, 77,155, 54, 97,194,132, 9,120,229,149, 87,110,113,181,124,125, 57, 90, 44,150,175, 95,120,225,133,215,
- 87,175, 94, 93,231,189,247,222, 99, 5, 71, 75,161, 80,128, 97, 24, 24, 12, 6, 24,141, 70,232,245,122,156, 63,127,158,127,245,
-213, 87, 47,152, 76,166,175, 61, 86, 87, 50,242, 19, 10,153,110, 83,245,120,182,134,246,218,167, 65,173, 31, 75,212, 51,242,166,
- 37, 79,214,238, 76,122, 12, 78, 12, 5, 33, 32, 60,192, 19,192,104,212, 98,248,240, 55, 69,255, 98, 82, 57, 68,150,193, 96,192,
-241,227,199,209,161, 67, 7,220,188,121, 19,103,207,158, 69,173, 90,181,176,116,233,210,200,231,158,123,110, 87,110,110,110, 91,
-127,157,173,147, 39, 79,142,123,228,145, 71,230,105, 52,154, 66,141, 70, 51, 15,192,114, 0,197,151, 47, 95,174,119,249,242,229,
- 5,155, 55,111,110,243,209, 71, 31,137, 92,218,232,136, 60,217,163, 22,139, 21,122,189,209,171,192, 18,214, 9,225,253,138, 56,
-195, 48,164, 78,157, 58,232,213,171, 23,196, 98, 49, 20, 10, 5, 2, 3, 3,203, 85,155,185, 10, 46,111,229, 7, 0,158, 97, 24,
- 84,169, 82, 5, 61,122,244,128, 68, 34, 41,199, 41,228,195, 30, 61,122, 96,228,164, 15,241,245,200,142,248,234,133, 90,232, 60,
- 37,199,107, 56,117, 58,157,230,175,191,254,146,191,251,250,235,120,164,102, 77, 68,168, 84,168, 22, 29, 9,185, 76, 10,137,115,
-152, 24,191, 76,118, 2,128, 23,137, 68,104,208,160, 1,114,114,114,112,237,218, 53, 92,187,118, 13, 44,203,162,117,235,214, 14,
- 23,230,210,165, 75,152, 52,105, 18,140, 70,163,223,113,175, 89,179, 38, 58,118,236, 8,169, 84, 10,133, 66, 81,174,202, 80,184,
-167,165,165,165,168, 81,163, 6,214,173, 91,135,218,181,107,251,228,172, 91,183, 46,218,181,107, 87,238,126,202,229,114,135, 40,
- 2,128,155, 7, 53,142,107,196,197,197, 85,136,115,203,161, 27,248,102,235, 95, 48,154,120,168,117,150,114, 39,196, 70,168,176,
-231,167,247,252,138,187,192,185,120,241, 98, 20, 23, 23, 59,140, 3,225,163, 92, 48, 81,170, 86,173,138,133, 11,221, 59,153, 46,
- 90,196,221, 59, 47,213,207,247,173,112,156,144,185,100, 51,102,204,152,230,122,190, 47, 62,231,253, 46,231,155, 92,196, 89, 78,
-133,170, 14,101, 50,217,251,127,253,245, 87, 88, 73, 73, 9, 46, 93,186, 4,150,101, 29,117,234, 28,199,193,108, 54,227,202,149,
- 43, 8, 11, 11, 67,110,110, 46,100, 50, 25, 68, 34, 17, 76, 38, 19, 0, 52,241,244, 2, 39,132, 96,100, 94, 89, 19,161, 63,170,
- 72,144, 6,160,103, 94,217,131, 33, 52,136, 95,179,102, 13, 2, 3, 3, 17, 20, 20,228,248,245, 85,141,116,242,218,101,228,136,
- 25,176,251,119,131, 97, 1,150, 1, 24, 17,192,178, 4, 44,195,128,221,191, 11, 12, 3, 40,195, 67, 43, 90, 0,251,106, 24,239,
-181, 1,188, 39,247,201,157,139,229,250,127,199,142, 29,240,151,179, 70,141, 26, 8, 12, 12,116, 44,155, 55,111, 46,231,104,217,
-108, 54,132,135,135,251,195, 73,202,220, 8, 30, 81, 81, 81, 16,139,197,204,210,165, 75,199, 37, 39, 39,199,190,243,206, 59,172,
- 72, 36,194,177, 99,199,112,230,204, 25, 36, 38, 38,250,221,102,171,184,184, 56,107,220,184,113,182,113,227,202,250, 80,164,164,
-164,160,184,184, 56, 87,216,175, 86,171, 11,186,118,237, 90,174,221, 70,126,126,254,253,221, 18,222,126, 31,173,102, 43,116, 6,
- 3, 52,165, 58,135, 59,148,155,153, 19,242,222,168,183,197,179,134,191, 4, 0, 24, 53,247,115,148, 46,250,167, 32, 91, 59,106,
- 64,212,147,159,173, 24, 11,160,143, 55,126,141, 70, 3,131,193,128,234,213,171, 99,223,190,125, 40, 45, 45, 69,247,238,221,193,
- 48,140,163,135,104, 5, 96,202,200,200,120, 60, 53, 53,245,240,156, 57,115,170,215,171, 87,143,209,106,181,208,233,116,112,254,
- 61,121,242, 36, 89,190,124,249, 85,157, 78,215,202,110,157,187,197,230,140,111, 47,119,139,123,121,245,159,199, 68,169, 81, 53,
- 46,168, 50,138,170, 91, 11, 50,100, 90,181,254,188,193, 70,206,128,216, 0, 27,120, 16, 43, 15,155,189,218,235,223,130, 92, 46,
- 95,176,103,207,158,112,131,193,128,163, 71,143, 98,208,160, 65,166,252,252,124, 41, 0, 60,255,252,243,166,101,203,150, 73,107,
-212,168,129,165, 75,151, 70, 62,245,212, 83,171,180, 90,109, 3, 63,169,127,204,202,202,250,209,117, 99,120,120,248,252, 27, 55,
-110,180,119,110,243, 99,181, 90, 29,193,113,251, 96,242,128,197, 98,129, 94,111, 68, 73, 73, 41, 76,102,139,189,204,228, 97,179,
- 89,237,191, 60,172,246,114, 84, 42,225,130,154, 52,136,209, 16, 66,192, 50, 76,241,209, 83,217, 85,189,137,118,119, 85, 92,126,
-186, 89,174,176, 9,189,204,194,195,195, 33, 22,139,241,227,143, 63,226,196,222,205,144,138, 8,108, 86, 11,172, 22, 51,108, 22,
- 19,196, 34, 17,254, 60,118, 13, 93,234, 6,249, 37, 8, 35, 34, 34,208,179,101, 75,164,182,108, 89,214,189,141,227, 16, 40,147,
- 65, 33, 9, 40,115,178, 0, 16, 27,235,239, 32, 2,188, 16,206,232,232,104, 28, 57,114, 4, 35, 71,142,196,204,153, 51, 33,151,
-203, 29,189,159,207,157, 59,135,149, 43, 87,162, 75,151, 46, 21,142,187,224,224,141, 29, 59, 22,153,153,153,152, 59,119, 46,154,
- 54,109, 10,177, 88,140,226,226, 98,180,106,213, 10, 57, 57, 57,126,113, 58, 87,239, 73,165,210,114,238,147, 32, 0, 43,154, 70,
-206,156, 47,245,141,197,250,189,203,193,128,193,129,159,222, 46, 39, 10, 23,174,216, 93, 97,206, 9, 19, 38,148, 11,167, 63,110,
-150,191,112,113,157,124, 30,199, 48,204, 81,193,108, 29, 59,118,236,251, 12,195,108, 24, 59,118,236,251,211,167, 79, 63,237, 15,
-159,187,253, 12,195,108,180,139,176,158, 78,219,142, 86, 72,104, 41, 20,138, 71, 3, 3, 3,113,233,210, 37,116,239,222,221, 84,
- 80, 80,112, 65, 44, 22,215,202,207,207,151,229,230,230, 66,167,211,105, 38, 79,158,124, 13,128,188, 69,139, 22, 53,254,252,243,
- 79,220,188,121, 19,203,150, 45, 3,128,181,238,219,108,176,224,121,222,145, 41, 92, 63,219, 68, 34, 17,246,239,223,143,253,251,
-203, 55,253,250,230,155,111,124,190, 48,158,250,245, 55, 28, 59,118, 12,206,195, 3, 8,255,157,183, 5, 4, 4, 0,222,123,120,
-148,131,175,134,241,190, 26,192,187,131,191,109,191,220,245,204,241,132,140,140, 12,143,231,239,223,191,191,156,163,229,139, 83,
- 36, 18,193,102,179, 65, 46,151, 51, 18,137,132,145, 72, 36,241,130,200, 18,137, 68,142, 7, 70, 38,147, 65, 38,147,149,251, 74,
-245,132,204,204,204, 14,153,153,153, 30,247,231,229,229, 61,158,151,151,135, 7, 17,102,139, 5,122,157, 9,165, 26, 61, 38, 78,
-255,190,108,227, 68, 28, 4,112,240,241,255,141,196,208,110, 93, 58, 86,180,154, 90,184,223, 81, 81, 81,216,185,115, 39, 24,134,
-193,170, 85,171, 16, 28, 28,140,110,221,186, 65,165, 82, 97,236,216,177,232,215,175, 95, 69, 11,179,146,130,130,130,199,223,122,
-235,173,195,159,126,250,105,181,170, 85,171,194,100, 50,193,108, 54,195,100, 50,225,242,229,203, 88,190,124,249, 77,157, 78,247,
- 56,128, 18, 95,100,155, 51,190,189,252,203,174, 81,153,157,251, 63,165, 63,151,243, 7,178,179, 11, 96,181,102,128,183, 89, 97,
-182,218,202, 28, 62,171, 21, 86,171, 13, 18,137, 72,245,233,212,183,183,242, 32, 96, 89,198, 4,224,137,123,149, 70, 33, 33, 33,
- 41,121,121,121,184,120,241, 34, 94,124,241,197,236,130,130,130,179, 0, 58, 1, 64, 65, 65,193,158, 65,131, 6,213, 91,178,100,
- 73, 76, 82, 82, 18, 2, 3, 3, 85, 90,173,214, 23,101, 32,128,161, 0,186,162,172, 29,136,128, 66, 0,147, 89,150,149, 29, 61,
-122,244,150,158,118,187,118,237, 2,128,131,238,191,128,236,142,150,193,128,188,130, 34,188,242,191,241,255,124, 25,129,148, 19,
- 23, 4, 4,111,140, 64, 0, 0,228,231, 92,198, 75,175,140,148,249,250, 32,112,247, 34,172, 64, 27,157,114, 31,106, 66, 30, 13,
- 12, 12, 44,171,126, 91,183, 28, 27, 63,251, 31, 96, 51,131, 88,244,128, 89, 7,152, 53,224, 77, 58, 48, 18, 57, 96,209,251, 37,
-180, 2, 3, 3, 17, 40,151, 35, 42, 36,164,108, 16, 72,145, 8, 98, 49, 7,222, 2, 48, 54,198, 33, 72,121,255, 6, 6,113,124,
- 84,202,229,114,164,165,165, 97,232,208,161, 48,155,205,232,219,183, 47, 76, 38, 19, 12, 6, 3,244,122, 61,146,147,147,161,211,
-233,252,226, 19,122, 43, 6, 6, 6, 66, 34,145,224,237,183,223, 70,179,102,205, 48,105,210, 36,140, 25, 51, 6,201,201,201,120,
-227,141, 55,176,124,249,114,164,164,164,248,226, 37,206,105, 36,220, 79, 65,108, 57, 87,241, 1,168,112, 26,185,114, 50, 12, 91,
- 78,176, 9,203,155, 47,116,170, 48,231,140, 25, 51,144,151,151,119,139,147, 37,252,143,139,139,195,151, 95,126,121,187, 53, 67,
-130,123, 20,237,102, 95, 79, 87, 39,138, 16,210,220,222,118,202, 56,125,250,244,211,211,167, 79, 79,101, 24,102,195,244,233,211,
- 83, 61, 57, 90,238,120,220,236,247,251,165,197,185,212,141,182,119,222, 41,220,232,176,176, 48, 81,181,106,213, 88,149, 74,133,
-226,226, 98, 68, 70, 70,146,188,188,188,254, 10,133,226,227,159,127,254,185,134, 70,163,193,185,115,231, 48,127,254,252,131, 0,
-230,121, 19, 90,155, 34,237,214,177,221,201,114, 94,239,213,171, 23,146,146,146,202,185, 89,114,185,220,107,230, 17,246, 9,142,
-144, 72, 36, 66,237,218,181,229, 87,175, 94,213, 75, 36, 18,196,199,199,203,179,179,179,245, 18,137,164,194, 61, 93,124, 53,140,
-247,213, 0,222,157,240,105,222,188,121, 57, 7,203,249,215,249,255,250,245,235,125, 86, 29, 10,156,245,234,213,115,220,175,160,
-160, 32,225, 92, 0, 64,247,238,221,193,243, 60, 34, 34, 34,252,226, 20, 68,173,189, 1, 60, 12, 6, 3, 95, 90, 90,202, 30, 61,
-122, 20, 82,169, 20, 65, 65, 65,142,182, 58, 1, 1, 1, 14, 55,147,194, 93,129,192,195,100,177, 64,175,215, 67,163,209, 0, 0,
- 46,159, 90, 83, 94,136, 25,213,183,205, 47, 20,176,133,133,133,216,188,121, 51,254,248,227, 15, 52,107,214,204,173,168,174,128,
-224,202, 43, 44, 44,108, 61,122,244,232, 3, 83,166, 76,169, 18, 22, 22, 6,179,217,140, 27, 55,110,224,187,239,190,203,212,233,
-116,173, 43, 82,192,128, 0, 22,139, 21, 6,157, 17, 37,234, 82,124, 60,245, 7,143, 89, 15, 0, 10,115,207,163, 87,239,126,210,
-123,153, 78,153,153,153,239,180,110,221,122,106,105,105,105,177, 78,167,235, 7, 96,150,243,247, 84, 65, 65, 65,155,222,189,123,
-207, 9, 11, 11,107,154,155,155,251,190, 31,148, 99,211,210,210,222, 79, 72, 72, 40,183,209,104, 52, 34, 33, 33,161,118,110,110,
-238,192,182,109,219,126, 8, 32,204,105,119, 16,128, 45, 0,190,244,148,151,132,170, 67,141, 70, 15, 85, 72, 44, 50,174,237,244,
- 25, 16,137,200, 0,194,243, 94,203, 16,225, 3,216,211,226,163,103,220, 45, 65, 21,142, 21, 94,216, 79, 60,253, 2,158, 24, 58,
- 3, 10, 49, 48,237,165,199,145, 28, 2, 64, 30, 6, 73,219,247,192,132,216,239,209,208,223,252, 34, 31,243,213, 87, 56,102, 47,
-143,227, 35, 35, 49,186,127,127, 16, 11,176,239,204, 25,172,248,235, 47,244,239,208, 1,138,128, 0,191, 63, 88,120,158,135, 68,
- 34,193,229,203,151,177,111,223, 62,212,173, 91, 23,151, 46, 93, 42, 55, 12, 5, 33,196,223,248, 59,226, 46,147,201, 32, 22,139,
-145,157,157,141,212,212, 84, 72, 36, 18,252,240,195, 15,216,185,115, 39, 70,143, 30,141, 33, 67,134,160,125,251,246, 56,123,246,
-172, 95,156,132,144, 91,122, 43,186, 86,231, 86, 52,141, 92, 57, 93,223,251,183,147,238, 2,231,148, 41, 83,220,118,168,240,135,
-211,157, 22,113,147,118, 71,157,197,144,224, 60, 57, 11, 35,215,117, 0,161,194,182,177, 99,199,190,239,239,121,206,235,130, 35,
- 86,145, 42, 76,135,208, 74, 77, 77, 45, 23,243,194,194,194, 3, 7, 14, 28,168,175, 84, 42,113,254,252,121,169, 74,165,170, 47,
- 20,232, 44,203, 98,213,170, 85, 65, 61,122,244,216, 58,107,214,172,120,158,231,145,147,147,131,119,223,125, 87, 99,181, 90, 7,
- 0,176,122,122,129,251,114,166,126,251,237,214,135,109,221,186,117,126, 85,129, 8, 66,138,227, 56,132,134,134,234,245,122, 61,
- 20, 10, 5, 66, 67, 67,245, 58,157, 14, 74,165, 82,168, 43,102,241, 79, 79, 5, 95,238,147,175,134,241,174, 13,224,125,226,204,
-153, 51,126, 29,103,175,106,245, 43,151,167,165,165,121, 44, 72,118,238,220, 9,222, 94,208,250,203,105,255,202, 35,130,240, 83,
- 40, 20, 8, 11, 11,131, 76, 38,131, 92, 46, 47, 39,178,100, 50,153,207, 7,199,215,128,164, 1, 1, 1,135,148, 74,101,136,176,
- 95, 44, 22,163,180,180,180,184,176,176,240,209,251,186,234, 16, 4, 86,179, 21,122,189, 1,154, 82,125,165,243,155, 76, 38,200,
-100, 50, 44, 95,190, 28,143, 63,254, 56, 90,180,104,113,139,200,186, 77,123, 62,189,176,176,176,253,188,121,243, 14,206,158, 61,
- 59, 84,163,209,224,251,239,191, 47,209,104, 52,237, 1,164, 87, 72,108,242, 4, 22,179, 25, 58,131, 17, 90, 77,217, 61,184,114,
-122,205,127, 45,169,150,103,103,103, 47,247,178,255,138,213,106, 77, 21,198,125,243, 3,143, 37, 36, 36, 32, 59, 59,187,220,198,
-235,215,175,195,102,179, 25, 81, 54, 78,214,203,206, 70, 50,254, 25, 61,219,211, 87,124,153, 59,170, 55, 66,163, 41,115, 65, 12,
-218,252,202,201,167,118,177,225,169, 77,214,237,228, 33,134, 97, 28,141,190,135, 15, 31,142,147, 39, 78,160, 83, 21, 53,146, 99,
-130, 64,212, 25,144,116,252, 8,127,231,201, 49,107,206,166, 10,115,175,116,106, 2, 49,107,229, 74,183,251,174,244,233, 83,161,
-184, 95,184,112, 1,114,185, 28, 54,155,237,150,247, 77, 69,227,239, 44, 96,230,204,153,131,209,163, 71,227,135, 31,126,192,201,
-147, 39,241,200, 35,143,160,115,231,206,200,205,205,197,137, 19, 39, 96, 52, 26,253, 14,167,115,187,185, 11, 87,207, 96,219,190,
-223,113, 61,253, 26, 50,179,111,222,118,186, 59,115,186, 10,173, 95,182, 29,199,211, 93,154,220, 22,231,199, 31,127,140,220,220,
-220,114, 78,150,115,185,228,201,209,114,213, 34, 46,200,119,105, 11, 37,172,155, 92, 68,143,235,186,235,241, 0,144, 11, 64,228,
-227, 60,215,245,252,233,211,167,239, 16,156, 48, 59,175,200, 87,251,172,114,142,150, 11,102,244,233,211,167,247,252,249,243, 35,
- 3, 2, 2, 28, 61,144,198,142, 29,139,209,163, 71,163,122,245,234,136,136,136,136, 11, 9, 9, 65, 65, 65, 1,102,206,156,137,
-180,180,180,215,224,102,160, 61, 87,161,213,230,106, 41,164,210,127, 62, 88, 5,103, 11, 0,134, 12, 25,114,139,163, 37, 36,144,
- 55, 88, 44, 22,132,135,135, 67,167,211, 65, 36, 18,161,111,223,190,162, 83,167, 78,217,186,117,235,134, 39,159,124, 82,116,226,
-196, 9, 91,207,158, 61, 33, 18,137,208,177, 99, 71,245, 47,191,252, 50, 10,192,103,126,136,173, 74,107, 24, 47,100, 50,127,199,
- 62,242, 71, 92,122,227,100, 24, 6, 58,157, 14, 28,199, 57, 26,202,251,195, 41, 84, 29, 58, 63,128, 44,203, 34, 36, 36,196, 81,
-120, 8,142,150, 32,180,124,241,250, 26,144, 84,161, 80,168,206,159, 63, 95, 67,232,120,145,159,159,143,142, 29, 59, 94, 44, 44,
- 44,188,191, 45, 45, 30, 48, 91,109,208,232, 13,208,232,117,149, 70, 43, 60, 15,139, 22, 45,194,217,179,103, 97, 48, 24,176, 96,
-193, 2, 71,167, 2,103,145,117, 7,130,235,178, 92, 46,231,187,119,239,142, 3, 7, 14, 64, 38,147, 89,112, 27,227, 95,241,132,
-135,217,106,133, 65,175,135,198,119,149,219,131, 2,135,170, 62,123,246, 44, 76, 38, 19, 38, 77,154,100, 59,124,248,240, 14,148,
- 13,128, 42, 56,120, 3,219,181,107, 55, 89,169, 84,134,108,220,184,241, 77, 0, 63,120,123,121, 91,172,118,209, 94,137,247,209,
-185, 70,192, 93,155,172,219, 25,102,197,249,197,202,243, 60, 94,123,245, 85,116,174,162,198,147, 77, 35,161,205,186, 8, 69,112,
- 36,152,144, 68,204,154,179, 9,167,175,250,221, 20,147, 0, 64,247,118,125,208,168,238,173,195,131,181,238, 84,246, 77,182,231,
-207, 67,200,201,207,172,112,220,181, 90,173, 71,231,170, 2,142,150,227,153, 19,238, 95,227,198,141, 81,171, 86, 45,236,216,177,
- 3, 77,154, 52,193,165, 75,151,112,233,210, 37,164,165,165,225,228,201,147, 40, 42, 42,170,112, 26,253,186,101, 5,138, 74, 11,
- 33,149, 72, 81, 88,156,143,235, 25,215, 16, 29, 30,115,199,233, 46,160, 78,207,143, 1, 0, 85, 34,131, 43, 36,180,156, 57, 63,
-249,228,147, 91,196,251,157, 14,217,195, 48,204, 33,111,235, 21, 61,255, 94,194,147,208,186,150,151,151,215,162,127,255,254, 99,
- 1, 52,183,111, 43, 1,176,114,235,214,173,125,162,162,162, 58,180,108,217,146,147, 74,165,216,183,111, 31,126,249,229,151, 31,
- 0,172,240,118, 33,169, 84,170, 79, 76, 76,148, 11, 25, 81,120, 16, 85, 42,149,104,230,204,153,204, 55,223,124,227,209,229,242,
-149, 64, 37, 37, 37,208,106,181, 8, 14, 14,134,217,108, 70,247,238,221,109,103,207,158,133, 68, 34, 65,239,222,189,109,103,206,
-156,113, 36,244,226,197,139,227,245,122,125,171, 63,254,248,163, 43,128,182, 21,184, 87, 66,195,248, 64,248,217, 0,222,211, 87,
-158, 63,240,183, 58,206, 19,231,200,145, 35,111,139, 83, 34,145, 88,133,145,223, 89,150,133,217,108, 70,147, 38, 77,144,155,155,
-235,120,104,148, 74,165, 67,100,249, 35,180,124, 13, 72,202,113, 28, 76, 38, 19,218,182,109, 11,134, 97,240,249,231,159, 63, 24,
-213,145, 60,207, 4, 6,134,163, 74,149,218,136,140, 50,128,231, 43,119, 86,153, 49, 99,198,148, 19, 83,238, 70, 94, 22,238,255,
-237, 64,224,186,147,217,231, 9,224,168,242,210,106, 13,247, 93, 18, 70, 69, 69,181,200,205,205, 93,231,178,185, 16,192,100, 47,
- 31,150,142,132,190,121,243, 38,186,117,235,134,223,127,255, 93,180,118,237,218, 78,235,215,175, 63,115,241,226,197,155, 77,154,
- 52,169,250,250,235,175,203,218,182,109,139,252,252,124, 52,109,218,116, 98, 70, 70,134, 23,161,101,191,143, 6, 35,180,218,202,
-119, 71,221,185, 89,119,242, 98, 20,242,228,132, 9, 31,162,115,108, 49,250, 62, 18,140, 37, 27,246, 98, 96, 99, 57, 96,146, 85,
-152, 79, 8, 75, 88,149, 36, 36,166,180,184,101,191, 76, 85, 54,150,107, 98, 74, 11,176, 55, 47, 85, 56,238,206, 97,118, 21, 85,
-183,227,232, 57,223,207, 87, 94,121, 5,239,189,247, 30,186,118,237,138, 75,151, 46, 97,215,174, 93,184,116,233, 18, 70,142, 28,
-137,148,148, 20, 60,242,200, 35, 21,226, 92,191,109, 53,212,154, 18,176, 12,139,194,146, 2, 24,140,122,140,121, 99,194, 29,167,
-187,227,229,191,109, 58, 0, 96,205,214, 99,183,205,249,193, 7, 31, 32, 59, 59,187,156,147,117, 39,237,178,238,119,120, 27, 45,
-237, 26,128,215, 92, 55,154, 76,166,160, 73,147, 38,117,137,136,136, 0,195, 48,152, 51,103, 14,194,194,194, 30, 7,112,218,100,
- 50,229,107,181,218,209, 78, 34,164, 51,236, 99,109,228,228,228,184,237,183,175,213,106,205, 93,186,116, 17,199,198,198,150,235,
-109,168, 84, 42, 61,185, 59, 14, 78, 97,159,213,106,197,152, 49, 99, 48,109,218, 52, 84,171, 86, 13, 61,123,246, 68,106,106, 42,
- 24,134, 65,247,238,221,209,179,231, 63, 85,185, 33, 33, 33,146,223,127,255,189, 29,203,178,103,156, 94, 32,229, 56,221, 65,104,
- 24,111,177, 88,252,109, 0, 95,142, 83,200,108, 35, 71,142,196,180,105,211,240,254,251,222,155,122,124,245,213, 87,192,173,237,
-169,238, 58,103, 97, 97, 97,185,194, 94,161, 80,124,254,228,147, 79,114, 55,111,222, 44, 39,174,156, 23, 55, 5, 81, 57, 78, 95,
- 3,146,138, 68, 34, 68, 71, 71, 99,202,148, 41, 8, 15, 15, 71, 76, 76,140,187,129,252,124,166,209,109,224,174,114,218, 8,127,
-244,211, 25, 31,182,254,126,217,122,177, 76, 10,236,223,181, 6,234,162,242,213, 73, 70,243, 63, 93,169,165, 77, 58,193,116,236,
- 79,191,242,146, 32,166, 63,254,248, 99,124,252,241,199, 94, 3,180,104,209,162, 59,142,187,159, 98,235, 86, 78,158, 48, 10,101,
- 40, 2,148, 85, 80, 63, 37, 20, 60,177,254,167,210,200, 3, 14, 31, 58,116,168,119,120,120, 56,210,211,211, 35,197, 98,113,239,
-114,118,149, 94,143,196,196,196,218,121,121,121,173,124,113,142, 28, 57,210, 56,126,252,120,217,128, 1, 3,240,228,147, 79, 98,
-192,128, 1, 50,137, 68, 82,147, 16, 2,179,217,140,244,244,116,252,249,231,159,200,203,203, 59,231, 45,156, 60, 33,140, 92, 17,
-130, 0,101, 44,234, 55, 8, 1,207, 91, 43, 37,238,206,174,184,179,155, 85, 65,145,229, 54,127, 2,192,225, 63,215, 97,194,219,
- 13,240,195,198,131,152,127, 8,104, 20,146,139,250,145,121,224,243,206,225,221,129,205, 48,235,167, 35, 0,128, 93, 59,125,166,
- 17,241,150, 7, 13,122,243, 29,197,221,217,185,114,190,142, 31,109,180,110,225, 20, 62, 18, 75, 75, 75, 81, 92, 92,140, 37, 75,
-150,224,165,151, 94, 66,110,110, 46,210,210,210,112,241,226, 69,252,252,243,207, 80, 40, 20,183,149, 70,163, 94,253, 0,227,103,
-189, 3, 2,130, 58, 53,234, 99,236,208,143,209,188, 81,203, 59, 78,119, 87,248,225,102,121,228,156, 59,119,238,237,230,165,135,
- 78,104,185, 69, 68, 68,196,128,118,237,218,193, 96, 48, 32, 50, 50, 18,105,105,105, 96, 89,182, 58, 80, 86,133, 23, 23, 23,183,
- 50, 47, 47,175,186,191,124, 34,145, 8, 86,171,213,209,246, 71, 88, 0,160, 87,175, 94,248,237,183,223,124,126, 81,196,196,196,
-160,106,213,170,120,235,173,183,110,233,229,224,220,211, 65, 46,151, 99,227,198,141,217,133,133,133,133,132,144, 10,117,115, 19,
- 26,198,239,217,179,199,239, 6,240,206, 48,155,205, 55, 47, 94,188, 24,187,104,209, 34,145,151,151,159, 3,187,118,237,178,194,
- 71, 85,205,221,224,116,247,101, 74, 8,241, 40,178,252, 25, 70,192,215,128,164, 28,199,225,194,133, 11,152, 48, 97, 2, 24,134,
-193,154, 53,107, 30,136,135,235,212,249,130,111, 88,150, 13,237,245, 68,235,134, 96, 24,152, 77,183,214, 84, 7, 22,105, 28, 34,
-235,201,207, 86, 96,237,168,254,254,136,158,203,187,119,239, 14, 91,180,104, 17,231, 79,186,239,222,189,219, 74, 8,169,112,181,
-159,240,194, 49,155,205,208,235,111,207, 69, 33,132,236,155, 62,117,124,151,165, 63,110, 18, 51,140, 9,251,119,174, 65, 73,177,
-251,230, 12, 82, 49,135,111,150,252, 98,149,136, 69, 55,255,229,164,251,162,111,223,190, 3, 22, 44, 88, 80,223,221, 78, 63, 58,
-193,164, 25, 12, 6,100,100,100, 64,167,211,173, 30, 55,110,156,121,211,166, 77, 47, 63,245,212, 83,120,228,145, 71, 16, 27, 27,
-139,172,172, 44, 92,190,124, 25, 75,150, 44, 33,123,247,238, 93, 13, 96,152,143,251,184,110,198,212,241, 47, 46,249,105,147,148,
-101,204,216,191,107, 13, 74, 92, 68,251,173,238,180, 24,223,254,240,139, 89, 34, 17,159,247,229, 22, 57,187, 89,149,249, 98,236,
- 61,104, 40,158,156, 55, 31,213,155,119,195,140,153,157,241,237,212,126,152,221, 93, 2,243,170,129,104,244,204, 82, 44,159,212,
- 3, 0, 80,229, 91, 63,221, 18, 78,130, 27,110, 28,171,226,146, 0,187,184,169,152,107, 42,196,221,155,115, 85, 81, 71,139,101,
- 89, 36, 37, 37,161,122,245,234,120,252,241,199,209,164, 73, 19,116,232,208, 1, 39, 78,156,192,137, 19, 39, 48,114,228, 72,111,
- 34,203,103, 26,181,111,213, 5, 7,219,156,191,227,180,113, 77,247,202,128, 63,121,105,232,208,161, 0,240, 80,185, 91, 21, 22,
- 90,106,181,250, 4,207,243, 13,131,131,131, 5, 71,202,177,239,250,245,235,224,121, 94, 87,209,132, 49,153, 76,194,224,152,229,
-198,101, 18, 26,199,123,123,240, 9, 33,182,194,194, 66,180,107,215, 14,109,218,180,113, 84,159, 56, 47, 78,194, 4,107,215,174,
- 5, 33,164,194,141,172,157, 26,198,107, 80,193, 6,240, 0,144,155,155,219,173,109,219,182, 91, 57,142,243,107, 22, 77,158,231,
-211,114,114,114,158,184,215,156,238,210,135,231,121,143, 34,203,159,130,200,215,128,164, 28,199, 65,169, 84,226,215, 95,127, 69,
- 68, 68,196, 3,245,128,157, 56,155,247,137,183,253,237,194,165, 59, 1, 68, 62,249,217,138, 27, 59, 11,204, 9, 79,126,182,226,
-250,218, 81,253,171,121, 59, 39, 59, 59,187,107,255,254,253,127,247, 55,221,173, 86,235,181,236,236,236, 10, 15,151, 64, 8,193,
-249,243,231,249, 87, 94,121, 37, 63, 47, 47,175,223,237,196,127,236,132,249,179,167, 77, 28, 30,222,189, 75,139,230, 96, 1,147,
-231,198,191,132, 1, 8, 39, 22,221, 28,253,254,220, 87,251,245,235,247,111, 38,155, 58, 59, 59,251,241,167,159,126,122, 24,254,
-105, 58, 81, 78, 72,193, 67,239,106, 59,230, 85,173, 90,181,129, 72, 36,146, 1,152, 0,224,250,222,189,123,191,216,187,119,111,
- 87, 0,143,137, 68,162, 88,155,205,150, 97,255,232, 89, 1,224,111,223,249, 40,247,117, 16, 62,190,123,231,199,186,129, 97,136,
-201,100,244,241,129, 4, 2, 66,136, 68, 34, 62,127,248, 68, 86, 35,111, 31, 82, 78, 51,112, 84,122,149,253,176, 97,195, 48,108,
-216, 48, 71,126,250,252,243, 54, 88,125,106, 15,158,105,148, 14,227,215,173,193,168,170,249,253,193, 7, 0, 31,124,248, 74,165,
-133,205, 57,238,206,142,150,187,231,160, 34,109,180, 68, 34, 17,242,243,243,113,225,194, 5,228,228,228, 64,167,211,225,236,217,
-179, 48,155,205, 40, 42, 42, 66,131, 6, 13,110, 59,156,149,149, 70,255, 38,231,195, 88,125, 88, 97,161,101, 54,155, 63, 74, 74,
- 74, 18, 7, 4, 4,212,183,217,108, 32,132,192,102,179, 17,187,168,169,112, 47, 60,177, 88,108,168, 85,171, 22,227,174,119,130,
-240, 95,169, 84,234,189,184, 37,211, 19, 19, 19,199, 49, 12, 35,242,244, 21, 34,252,231,121,222,198,113,220,244,219,188, 87,119,
-218, 48, 94,155,151,151,215,178,146,211,239,110,112,186,166,143,182,110,221,186,142, 25,237, 93,199, 68,177, 79,182,170,245, 33,
-206,189, 14, 72,170,213,106,179,186,117,235,102,115,222,239, 60,160,233, 3, 13,134, 92,239, 49,224,229,132,157, 5,230, 4, 0,
- 16,196, 22, 8,185,238,229, 44,125,118,118,118,187,187, 29,180,171, 87,175,154, 30,123,236,177, 31, 75, 75, 75,135, 2,184,237,
-214,252,239,127,244,249,251,247, 97,202,168, 1, 76,187,205,115,175, 23, 20, 20,116,116,217,246,183, 32,168,132,113,237, 42, 44,
-218,207,229, 87,250,216, 98, 86,171, 53,189,122,245,234, 21,114,110, 44, 22, 75,186,175,253,174, 99,132, 57,227, 52,130,241,254,
- 1,160,172,243,119,129, 95,156, 6,131,161,176,101,203,150,226, 10,198, 45,215,223,184,199,198,198,162, 74,149, 42,142, 95, 1,
-174,219,125,133,211,106,181,166,199,199,199, 35, 34, 34,194,227,136,239,174,109,178,252,225,172,236, 52,242,198, 89,165,202,210,
- 74,231,188,221,112, 82,248,135,206,148,147,114, 82,206,251,150, 83, 68,239, 39,229,164,156,148,243, 30,114, 62,112, 32,132,128,
-182, 82,163,160,160,240, 4, 27,189, 5, 20, 20, 20, 20,119, 6,198,139, 42,173, 72, 79,159,219, 81,182,219, 40, 39,229,164,156,
-148,147,114, 82, 78,202,249,208,113,250,226,174,236,158,198,255, 26,238,100,120,156,187, 41,192, 40, 39,229,164,156,148,147,114,
- 82, 78,202,249,240,113, 62,112,160, 85,135, 20, 20, 20, 20, 20, 20, 20, 20,119, 17, 84,104, 81, 80, 80, 80, 80, 80, 80, 80, 80,
-161, 69, 65, 65, 65, 65, 65, 65, 65, 65,133, 22, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20,247, 21, 8, 33,101, 83,240,108,216,176,193, 49,208, 67,106,106, 42, 67,111, 13, 5, 5, 5, 5,
- 5, 5,197,189,196,131,170, 69, 56, 42,176, 40, 40, 40, 40, 40, 40, 40,254, 11,120, 16,181, 8,235, 78, 73, 82, 80, 80, 80, 80,
- 80, 80, 80,220,107, 60,136, 90,132,125,144, 85, 36, 5, 5, 5, 5, 5, 5,197,253,131, 7,222,209,162,174, 22, 5, 5, 5, 5,
- 5, 5,197,191,133,251, 88,139, 16,251,226,188, 78, 65, 65, 65, 65, 65, 65, 65, 65,113,135, 2,203,227, 47,157,235,144,130,130,
-130,130,130,130,130,226,246,193,184, 89,191,167,110, 22,157,217,156,114, 82, 78,202, 73, 57, 41, 39,229,164,156, 15, 37, 28,227,
-104, 81, 80, 80, 80, 80, 80, 80, 80, 80,220,153,174,114,250,239,112,186,168,208,162,160,160,160,160,160,160,160,184,115,145,197,
-184, 91,167,109,180, 40, 40, 40, 40, 40, 40, 40, 40,238, 18,168,163, 69, 65, 65, 65, 65, 65, 65, 65,113,103,112,109, 4, 79,171,
- 14, 41, 40, 40, 40, 40, 40, 40, 40, 42, 89,108,185,221,232,169,231,192,182, 10,144,223, 78,239,131,109,148,147,114, 82, 78,202,
- 73, 57, 41, 39,229,124,232, 56,125,113,111,195,253,135,118, 0,118, 0,104,111,255, 5, 0,134,144,187, 63,210, 3,237,250, 74,
- 57, 41, 39,229,164,156,148,147,114, 82,206, 7, 29,174, 3,150,150,173,208, 1, 75, 41,252, 0, 7,239, 85,204,190,246, 83, 80,
- 80, 80, 80, 80, 60,108, 98,139, 56,191, 36,221,161, 38,128,247, 1, 4, 59,109, 59, 4, 96,186,203,113, 63, 1, 80, 56,173,107,
- 1, 76, 2,112,201,103,104, 8,145,216,249,101,246,133, 7, 96, 0, 96, 4, 80,202, 48,140,133,166,217,191,142,150, 0, 82,237,
-255, 55, 0,216, 95,193,253, 15, 20, 98, 99, 99,229,161,161,161, 93,143, 29, 59, 38, 61,123,246, 44,118,239,222, 77,190,249,230,
- 27,115, 81, 81,209,150,172,172, 44, 61,205, 46, 15, 4,186, 1, 24,107,255, 63, 3,192,230, 59,228, 99, 20, 10,197, 72,165, 82,
-217, 67, 38,147, 85,177, 90,173,140, 78,167,203,212,106,181, 91,173, 86,235,103,246,114,175,162,232, 19, 22, 22,246,114,157, 58,
-117,106,166,165,165,101,100,102,102,254, 4, 96, 21,128,126, 85,170, 84, 25,152,152,152, 24,119,254,252,249, 75,133,133,133,223,
- 2, 88,247, 47,134,147,130,226, 97, 2,227,205,141,112,135, 9,132,144,129,229, 24,152, 91, 57, 58,118,236,216,123,203,150, 45,
- 10,158,231, 33, 44,114,185,220, 10, 96,176, 15,145, 21,190,111,223,190,132,161, 67,135, 62,153,153,153,217,172,180,180,244, 81,
- 0, 80, 40, 20, 7,163,162,162, 14,207,155, 55,239,103, 66, 72, 58,195, 48,165, 21,140, 40, 39, 22,139, 95, 10, 13, 13,237, 97,
-181, 90,155, 16, 66, 32, 22,139,143, 21, 21, 21,109,182, 88, 44,223, 2,184, 29,241, 38,229, 56,110,152, 76, 38,235,102,181, 90,
- 27, 2, 0,199,113, 39,141, 70,227,102,171,213,250, 5, 0,211,109,112, 6, 72,165,210, 97, 42,149,170,139,201,100,106, 8, 0,
- 82,169,244,164, 90,173,222,106, 50,153,190,176, 11,206,127, 27, 28,128, 84, 66,136, 24, 0, 68, 34, 81,159, 71, 31,125, 52,129,
- 97, 24,158, 97, 24, 66, 8, 97, 14, 30, 60,216,216,102,179,177,246,252,145, 10,224, 48, 0,235,253,248,132, 68, 68, 68, 76,227,
-121,190,138,215, 68, 11, 8,104,118,236,216,177, 58, 43, 87,174,180,125,253,245,215,197, 67,134, 12, 9, 28, 58,116, 40,247,249,
-231,159,127,145,149,149,245,166,235,241,225,225,225,179, 89,150,141,240,231,250, 60,207,231, 23, 20, 20,188, 67,203,170,127, 29,
- 99,191,220, 86,218,150, 16, 96, 88,151, 32,246, 78,133, 86, 92, 92,220,146, 23, 95,124,113, 64,195,134, 13, 57, 66, 8, 44, 22,
- 11,140, 70, 99,157,253,251,247,183, 95,179,102, 77,179,210,210,210,126, 21,164,124,245,189,247,222,155, 50,121,242,228, 8,177,
- 88,204, 88, 44,150, 26, 43, 87,174,108,242,250,235,175,191,181,104,209,162,170,207, 62,251,108,144,176,125,194,132, 9,205,103,
-204,152,145, 12,224,179,127, 33,156, 20, 20, 15, 27,218,161,124, 27,173,137, 0, 62,246, 38,180,148,246,151,103, 14,202,156, 44,
- 56,253, 58,176,125,251,246,245, 28,199, 9,142,214,163, 90,173, 54, 26,229, 93, 48,119, 34, 43,113,208,160, 65, 45, 87,175, 94,
- 61,237,217,103,159,205, 86, 40, 20,181,158,122,234,169, 82,134, 97, 68, 43, 87,174,108, 92,189,122,117,121,175, 94,189, 6,117,
-236,216,113, 20, 33,100, 55,195, 48,121,126, 70,178,126, 88, 88,216, 47,159,124,242, 73, 66,183,110,221, 36, 17, 17, 17, 32,132,
- 32, 51, 51, 51,110,227,198,141,221, 39, 78,156, 56,170,176,176,176, 47,128, 51, 21,184,113,205,229,114,249,234,137, 19, 39,198,
-118,239,222,157,139,137,137,129,193, 96,192,217,179,103, 59,111,222,188,185,237,162, 69,139,222,212,235,245,207,216, 5,134,191,
-120, 52, 56, 56,120,205,247,239,189, 23,221,226,165,151,184,176,176, 48, 16, 66,144,151,151,215,121,207,210,165,237,223,248,228,
-147, 55, 75, 74, 74,158,118,119,191,255, 77, 72,165, 82,118,217,178,101,143, 72,165, 82, 0,128,201,100, 66, 74, 74, 10,243,192,
-124,138, 48, 76,124,102,102,102,176, 68, 34,113,187,223,102,179,161,109,219,182, 73, 18,137, 4,159,125,246,153, 37, 63, 63,191,
-241,130, 5, 11,142, 45, 95,190, 60,226,139, 47,190,120, 6,192, 45, 66,139,101,217,136,244,244,116,183,156, 54,155, 13,102,179,
- 25, 86,171, 21, 38,147, 9,245,234,213,163,197,212,127, 3, 9, 0,176,233,132, 1, 0,194,238,148, 76,169, 84,214,125,238,185,
-231,184,188,188, 60,136,197, 98,152,205,102,100,103,103, 35, 37, 37, 69,244,227,143, 63,214,174, 40, 95,141, 26, 53,134,204,152,
- 49, 35,114,211,166, 77,230,101,203,150,153,186,116,233, 34, 30, 50,100,136,170,109,219,182,245,226,227,227,217,239,190,251,206,
-184,117,235, 86,203,160, 65,131,164,211,167, 79,143,220,184,113, 99,175, 51,103,206,124,118,175,195, 73, 65,241, 16, 98, 7,254,
- 25,226, 65,248,245, 42,180,224, 36,174,250, 0,128, 88, 44,110, 28, 29, 29,189,196,106,181,198,216, 93,157,236,156,156,156,207,
- 44, 22,203,113,251,177,235,120,158,239,237,203,201, 26, 52,104, 80,203,223,127,255,125,214,254,253,251, 75, 10, 10, 10, 98,214,
-175, 95,111, 24, 53,106, 84, 26, 0, 92,189,122, 53,185, 87,175, 94,113,195,135, 15, 79,239,218,181,235,188, 14, 29, 58,140, 32,
-132,108,101, 24, 70,235, 75,100,165,164,164,236,219,181,107, 87, 80, 72, 72, 72,185, 29,137,137,137, 24, 49, 98,132,164,119,239,
-222,213, 59,117,234,180,247,242,229,203,109, 0,156,242, 71, 16,213,172, 89,115,219,246,237,219, 3, 67, 67, 67, 81, 92, 92,140,
-236,236,108,232,116, 58,168, 84, 42, 60,251,236,179,146,118,173, 31,175, 58,124,228,155,219,210, 51, 50, 58,251, 41,182, 30,125,
-188,126,253,109,203,167, 79, 15,180,220,184, 1,185, 92, 14,141, 70, 3, 0, 8, 10, 10, 66,179,164, 36,238,200,210,165,113, 3,
-199,140,217,118,248,194,133,206,255,146,216,146,217,127,141, 0, 54,136, 68,162, 62, 82,169,148,237,211,167, 15,182,109,219,198,
- 24, 12, 6,206,238,238, 88,251,244,233, 3,185, 92, 14,147,201,196,163,172,234,208,122, 63, 63, 37, 82,169, 20,151, 47, 95, 46,
-183,173,180,180, 20,121,121,121, 40, 40, 40,128,209,104, 68,113,113, 49,120,158,103,228,114,121, 30,207,243, 96,217, 50, 67,207,
- 19,167, 68, 34,193,133, 11, 23,202,109,179, 90,173,208,106,181, 48, 26,141, 48,155,205, 40, 45, 45,149, 7, 5, 5,213,140,136,
-136, 72, 7,176,174,176,176,240,179,156,156,156,235,180,220,250, 87,112, 99,195,113, 67, 53,148, 57,213,215, 42,129,143, 7,128,
-221,187,119, 35, 39, 39, 7,249,249,249,200,203,203, 67,124,124, 60, 8, 33, 21,174,142,187,124,249,242,151, 13, 26, 52, 96, 78,
-159, 62,189, 25,192,231, 43, 87,174, 28, 92, 88, 88, 56,118,244,232,209, 97,159,126,250,105,225,152, 49, 99,102, 0,248, 97,229,
-202,149,255,171, 91,183,110,143,115,231,206, 45,250, 55,194, 73, 65, 81,217, 32,132, 52, 7, 16,105, 95,205,183,151,187,225, 78,
-235, 39, 24,134, 49, 57, 29,103, 2, 32,117,243, 43, 64, 88,207, 99, 24,230,176,211,121,121, 12,195, 28,190,221, 96,186,252,150,
-125,116, 3,192,134, 13, 27,136,176,184, 59, 51, 42, 42,106,100,199,142, 29,103, 29, 61,122,180, 94, 86, 86, 86,104, 86, 86, 86,
-232,209,163, 71,235,117,236,216,113, 86, 84, 84,212, 72,167, 27,225,122,234, 54,167,125,146,125,251,246, 37,252,242,203, 47, 51,
-182,109,219, 86,210,184,113, 99,211,246,237,219,173, 93,187,118,205,181,191,160,173, 93,187,118,205,253,235,175,191,108, 45, 90,
-180,144,255,254,251,239, 55,247,238,221, 59,123,245,234,213,209,132, 16,145, 59, 78, 59,196, 33, 33, 33,191,238,220,185,243, 22,
-145,229,140,170, 85,171, 98,195,134, 13,170,144,144,144,117, 0, 36,158,194,105, 71, 64, 64, 64,192,154,191,254,250, 43, 48, 40,
- 40, 8,185,185,185, 16,139,197,136,138,138, 66, 73, 73, 9,178,179,178,112,253,226, 69,176, 38, 19,230, 76,157, 28, 36,151,203,
- 87,187, 36,160, 91,206,224,224,224, 53,203,167, 77, 11, 44,216,182, 13,127, 79,153, 2,179,217,236,168,114, 53,155,205,216, 59,
-116, 40,242,254,252, 19,223, 77,152, 16, 24, 28, 28,188, 6, 64,128, 15,206,202,128, 51,231, 80, 0,133,246,101, 40,128,253, 41,
- 41, 41, 71,207,158, 61,139, 54,109,218, 96,213,170, 85,141, 70,143, 30, 61,116,244,232,209, 67, 87,173, 90,213,168, 77,155, 54,
- 56,123,246, 44, 82, 82, 82,142,162,124,251,172,187, 29,206,187,198,105,179,217,202, 45, 60,255,207, 59,166, 74,149, 42,185,191,
-252,242, 11,158,125,246, 89, 86, 42,149,102,245,239,223, 95,182,103,207, 30, 98, 23,153,126,135,211, 96, 48, 64,175,215, 67,171,
-213,226,234,213,171,242, 79, 62,249,164,245,199, 31,127, 92, 99,219,182,109,113,239,191,255,254, 27,145,145,145,199,162,163,163,
- 19, 30,132,251,121, 31,114,102, 3, 48,163,172,189,233,245, 59,225,236,216,177, 99,131, 26, 53,106, 68,175, 60, 29,138, 34, 73,
- 29,240,146, 16,240,146, 16,216,194,155,227,178,244, 9, 84,171, 86, 45, 58, 48, 48,176,101, 5,195,185,236,244,233,211,143,217,
-191,148, 11, 0,204, 26, 51,102,204, 68,134, 97,118,143, 25, 51,102, 50,128, 89,246,237, 83,206,157, 59,215, 2,192,242,127, 41,
-156, 52, 47, 81,206, 10,195,135, 22,137,100, 24,102, 3,195, 48, 27,198,141, 27,215, 1, 64,184,203,122, 43,231,227, 0, 72,221,
-253, 10,139,211,246, 72, 66, 72, 79,167,243, 34,111, 51,248,140,155,229, 31,161, 5, 0,169,169,169, 76,106,106,170,176,227, 16,
-195, 48,235, 1, 28, 18,139,197,141, 31,121,228,145, 62,127,252,241, 71, 80,100,228, 63,215,143,140,140,196,234,213,171,131,234,
-215,175,223, 71, 44, 22, 55, 6,112, 72,165, 82,173,247,226,194,132, 12, 29, 58,244,201, 23, 94,120, 65,221,184,113, 99, 0, 40,
- 62,115,230,140,162, 69,139, 22, 90,171,213,202, 88,173, 86,166, 69,139, 22,218, 51,103,206, 40, 44, 22, 75,105,243,230,205,149,
-157, 58,117, 74,123,231,157,119, 6,185, 17, 28,206,120,110,230,204,153,241,161,161,161,222,148, 48, 74, 75, 75, 17, 29, 29,141,
-161, 67,135,198,136,197,226,151,189,221, 45,142,227,134,205,156, 57, 51, 42, 36, 36, 4, 69, 69, 69,136,143,143,135,201,100,194,
-133, 11, 23, 96,208,106, 96, 41, 85,195,162, 46, 70,222,149, 75, 8, 17,115, 24,212, 59, 53,154,227,184, 97, 62,220,146, 97,223,
-142, 25, 19,109, 74, 75,195,213, 85,171, 96,179,222,106,254, 88,205,102,156, 92,188, 24,134,244,116,204,120,229,149,104,169, 84,
- 58,236, 30, 59, 89,159, 18, 66,228,132, 16, 57,195, 48,243, 90,182,108,249,163, 92, 46, 31, 58,125,250,244,110, 91,182,108,233,
-190,107,215,174,246, 86,171, 85,108,181, 90,197,187,119,239,110, 99, 48, 24, 56,153, 76, 6,142,227, 8, 30, 80,136,197, 98, 72,
- 36, 18,200,229,114,180,110,221,250,202, 55,223,124, 99,137,143,143, 23,175, 89,179, 38,180, 74,149, 42,202,207, 63,255,188,184,
-180,180,116,166,191,124,102,179, 25, 70,163, 17,122,189, 30, 6,131, 1,219,183,111, 79, 26, 62,124, 56,103, 48, 24,108,189,122,
-245, 42,180, 88, 44,198, 49, 99,198,168,194,194,194, 70,209,111,216,127, 5, 86, 0, 26,187,208, 50,186, 60, 31, 13,157, 28, 95,
-159, 40, 46, 46, 94,244,237,183,223,198,179,178, 16,236, 49,245,192,207,252, 68,108, 9,254, 28,185, 9,239, 34, 42,190, 6, 6,
- 12, 24, 16, 69, 8,249,188, 18,194,188, 0, 64, 91, 0,243,110,231,228,123, 16,206, 4,165, 82,185, 42, 40, 40,104,143, 82,169,
- 92, 5,123,245,236,157,160, 75, 13,116,238, 93,151, 77,239, 82, 29,164,119, 93, 54,189, 75, 13, 58,212,192,131, 2, 23, 45,226,
-140, 60, 66, 72, 42, 33, 36,117,198,140, 25,211,156,222,239,194,186,220, 79,103, 44,149, 16,146, 90, 78, 33,149, 9,172, 59, 54,
-221,220, 44,101,154,194, 89, 73, 58, 69,206,209,187, 48, 58, 58,122,201,146, 37, 75,130, 92, 25,179,178,178,160, 86,171, 49,126,
-252,248,160, 23, 94,120,225,205,244,244,244, 23,125, 4, 66,154,157,157,221,100,224,192,129, 1,102,179,185,136,231,121, 86,173,
- 86,115,193,193,193, 54,225,128,224,224, 96, 91, 73, 73,137, 88,171,213,138,108, 54,155,241,133, 23, 94,144,190,242,202, 43,205,
- 0,136, 60,145, 70, 70, 70,118,233,209,163,135,212,211,126,139,197, 2,173, 86, 11,173, 86, 11,179,217,140,214,173, 91,203,190,
-249,230,155,174,185,185,185, 11, 61, 42, 14,153,172, 75,151, 46, 93,196,133,133,133, 8, 14, 14,198,245,235,215,113,237,218, 53,
- 24, 53, 26,152, 53,106,152, 53,165,176,150,170, 65,212, 37, 40,184,116, 30, 45,234,214,145,252, 36,147,117,211,106,181,179, 61,
-113,170, 84,170, 46, 45, 6, 15,230,148, 74, 37,218, 15, 44,235,103,240,123,221,186, 32, 54, 27,120,155, 13, 54,171, 21,221, 46,
- 92,128,197, 98, 1,203,178,104, 94, 88,200,169,150, 46,237,146,151,151, 55,235,223,200,236, 50,153,140, 91,182,108,217,115, 82,
-169, 20,132, 16,198,100, 50, 97,203,150, 45, 15,221, 67, 47,149, 74, 17, 16, 16, 0,179,217,140,196,196, 68,253,192,129, 3,247,
- 77,157, 58,181, 26,203,178, 74,137, 68,242, 71, 65, 65,193,180,172,172,172,171,254,242, 89, 44, 22,152, 76, 38,152, 76, 38,232,
-245,122, 92,185,114, 37, 38, 41, 41,137, 25, 58,116,168, 77,167,211, 37,207,159, 63,255,242,150, 45, 91, 20, 51,103,206,124, 10,
-192, 8, 90,236,222,219,228, 6, 16, 92, 45,156,211,138, 69,208, 0, 8,178,139,130,167, 24,134,105, 81,175, 94,189,208,179,103,
-207, 22, 17, 66, 14, 0,248, 25, 64,150, 55, 50,158,231, 25,158,231,241,250,163,197, 24,218, 82, 4,139,165, 4, 37, 37, 37,184,
-126,253, 58,206,156, 57,131,131, 7,207,220,238,179,249,114, 96, 96, 96,215,128,128,128, 68,171,213,202,106, 52,154,235, 58,157,
-110, 27,207,243,139,224, 82,101,225, 15,238, 86, 56, 5, 40,149,202, 79,222,127,255,253,199,131,131,131,113,252,248,241,228, 21,
- 43, 86,124,162,213,106,239,168,113,125,128,152,253,110,246,220,207,227,226,162, 66,112, 98,215,111,113,211,190, 90,249, 29,192,
-199,211, 44,124,255,195, 69,139, 56,139,161,195,132,144,158, 12,195,108,112, 21, 74, 21,178,157,238,240,124, 31,142,150,235,196,
-210,229,133,150, 7, 5, 9,171,213, 26,227,236,100, 17, 66,144,149,149,133,140,140, 12,228,229,229, 33, 52, 52, 20,102,179, 57,
-198,159,242,161,180,180,244,209,240,240,112,157, 88, 44, 54,234,245,122, 40, 20, 10, 94, 44, 22, 19,251,117, 24,123,175, 69,155,
-209,104,100, 56,142,179, 4, 5, 5, 5, 26,141,198, 58,240,210,150,140, 16,242,104,120,120,184,219,125, 70,163, 17, 26,141, 6,
- 90,173, 22, 26,141, 6, 70,163, 17,209,209,209,176, 90,173, 77,188,126,210, 90,173, 13, 35, 35, 35,145,153,153, 9,185, 92,142,
-244,244,116,152, 52,165, 48,151,150,194,170, 85,195, 86, 82, 2, 94,173, 6,175, 85,195, 98,210, 33,174, 86, 93, 8, 61, 18, 61,
-193,100, 50, 53, 12, 15, 15,135, 86,251, 79,115, 51, 98, 23, 88, 86,171, 21, 86,123,227,104,161, 58, 49, 34, 34, 2, 66,143,196,
-123, 4, 35,128,209, 44,203,206,147,201,100,220, 27,111,188,129,172,172,172,114,121,226,141, 55,222,112,180,201,106,219,182,237,
-238,128,128, 0,107, 94, 94, 30,140, 70,163,248, 65,125,232, 25,134, 1,195, 48,101,105,100,181, 34, 34, 34, 66,155,159,159,127,
-176,184,184,248,185,219,225,179, 88, 44, 66,143, 46,232,245,122, 16, 66,112,252,248,113, 4, 4, 4,136,109, 54,219,105,171,213,
-170, 16,139,197, 96,237,141,191, 40,238, 25,218,215, 9,145,206,158,222, 34, 42,228,145, 94, 74,173, 66, 42,210,242,215, 31, 73,
-252,254,211, 51, 43, 94, 24,244,114,208,164, 73,147, 18, 34, 34, 34, 2, 46, 95,190,108,152, 60,121,114,210,178,101,203, 24,148,
- 85,211,121,196,141, 27, 55,214,190,255,254,251, 97, 61,122,244, 72,150,201,100, 76, 73, 73, 9,242,242,242,144,147,147,131,107,
-215,174,145, 19, 39, 78, 92, 49, 26,141,171, 42, 18,200,216,216,216,111,158,123,238,185, 23,154, 54,109, 42, 22, 28, 82,173, 86,
-219,120,231,206,157,189,127,255,253,247, 54, 90,173,182,194,249,242,230,205,155,171, 62,248,224, 3,229, 19, 79, 60, 81, 71, 38,
-147,177,149, 17, 78,103,176, 44, 27, 29, 24, 24,136,109,219,182, 33, 36, 36, 4, 44,203, 70,223,105, 98, 25,204,124, 92,149,152,
-112, 24,246,206, 70,157,200, 4, 24,204,124, 28,205,194, 15,142,163,229,225, 93,223, 92,112,164,124,136, 37,253,216,177, 99,223,
-103, 24,102,195,216,177, 99,223,119,231,104,217,255,218,156,143,115, 58,222, 88,217, 98,171, 66, 3, 77,242, 60,143,140,140, 12,
-100,102,102, 34, 35, 35, 3, 5, 5, 5, 96, 89, 22,132, 16,127,122,159, 17,134, 97,248,173, 91,183,134,238,219,183, 79,219,188,
-121,243, 98,161,253,139,213,106,101, 44, 22, 11, 99,111, 23,195, 92,191,126, 93,178,103,207,158,144,115,231,206, 69,163,172,193,
- 26,239,195, 10,188,101,155, 32,176,156, 23,131,193,128,128,128, 0,255, 84,135,253, 69,120,252,232,209, 50,145,165, 41,181, 87,
- 25,150,192,166, 46, 1,209,150, 66,106,179, 64, 10, 2,198,160,243,251,254, 57, 67, 16, 89,102,187,208, 50,153, 76,176, 88, 44,
-224,121, 30, 86,235,191,210,174,252,203, 70,141, 26, 53, 89,187,118,237,144,140,140,140, 91,118,246,237,219, 23, 35, 70,140,192,
-240,225,195,207,245,236,217,243,196,111,191,253,134, 97,195,134,129,231,249, 71, 0,148, 0,248,253, 65,123,232,141, 70,163,195,
-129, 50, 24, 12, 48,155,205,128,151,198,239,190,242,166,144,182, 86,171, 85,224,102,214,174,253, 5,187,119,239,102,207,156, 57,
- 29,255,198, 27, 67,133, 6,247,180,196,189, 55,120, 66,202, 50, 95,143,108, 24, 22, 48,170, 81,184, 86,202, 49,154, 11, 95,191,
-175,185, 86, 77,165,141,174,170, 48,197, 39,133, 84,153, 54,109,106,236,185,115,231,141,227,199,143, 63,219,191,127,255,168, 81,
-163, 70,213, 91,179,102, 77, 27,131,193,240, 45,128, 98, 79,166, 75,239,222,189, 15, 68, 69, 69, 37,125,245,213, 87,185, 55,111,
-222, 12,181, 88, 44, 74,179,217,204,107,181,218,107,122,189,126,155,217,108,222, 6,224,104, 69, 2, 27, 20, 20,212,104,240,224,
-193,226,226,226, 98,112, 28, 7,179,217,140,220,220, 92, 60,254,248,227,162,245,235,215,215,191,157, 27, 80, 84, 84, 52,251,219,
-111,191,221,177,124,249,242,174, 42,149,170,169, 76, 38,139, 1, 96, 43, 45, 45,205,209,106,181,127,223, 78, 56,203,149,115, 54,
- 91,206,209,163, 71,171,171, 84, 42,220,184,113, 3, 54,155, 45,231, 78, 19, 45, 64,194,222, 60,185,107,125,213,186, 17, 73,216,
-179,239, 0, 2, 36,236, 77, 58,212,215, 3, 15,161, 13, 21,156, 5,148, 27,129,180,111,250,244,233,242, 25, 51,102, 96,250,244,
-233,167,221, 57, 90,130,224,154, 62,125,250,105,225, 56,167,227,119,221, 65, 24, 61, 59, 90,158, 20, 36, 80,214,187, 48, 47, 47,
- 47, 52, 36, 36,196, 33,176, 50, 51, 51,145,153,153, 9,169, 84,138,235,215,175, 67, 42,149,102,249,243, 17, 34,151,203,143, 52,
-110,220,184,246,213,171, 87, 37,147, 39, 79,174,122,244,232, 81,213,227,143, 63,222, 64, 46,151,219, 8, 33, 48, 24, 12,236,217,
-179,103, 3,103,205,154, 21,247,232,163,143,154, 30,125,244,209, 99, 43, 87,174,212,195,203,248, 87, 12,195, 28,202,202,202, 74,
- 78, 76, 76, 20, 68, 91, 57,113,229, 44,184,128,178, 42, 79,142,227,142,121, 11, 40,199,113, 39, 47, 92,184,208, 89, 17, 32,131,
-169, 84, 13,179, 70, 13,107,105, 41,108,165, 37,176,149,148, 0, 90, 53,164, 86, 43,196, 54, 11,228, 1, 1,200, 72, 79, 7,199,
-113, 39,189,113, 74,165,210,147, 57, 57, 57,157, 67, 66, 66, 28, 47, 81,139,213, 90,182,216,108, 48, 89,173, 14, 71, 75, 44, 22,
-227,230,205,155,144, 74,165, 39,239,117, 78,102, 89,214, 38, 12,225,224, 33, 30,136,142,142,230, 91,180,104,129, 97,195,134,193,
-102,179,217,147,129,105, 15, 96, 15,202,218,183,220,151,112, 39,110,133, 70,235,122,189, 30, 26,141, 6, 69, 69, 69,156, 92, 46,
-175, 29, 23, 23,119,192,100, 50,173,178, 90,173,223, 93,187,118, 77,237,137,211, 46,204, 28,162,139,231,121, 16, 66, 96,179,217,
- 96,177, 88, 32,145, 72,248,157, 59,119, 97,214,156, 79,176,228,187,101,164,119,239,222,204,250,245,235,193,243,124, 58, 45, 87,
-239, 9, 62, 43,254,121,106, 0,172, 54,173,113,231,114,205,143, 23,213,218, 73, 63,206, 61, 98,146,138,212,205,218, 69, 55, 76,
- 78,170, 45, 10, 9, 9,101, 23, 46,154, 87,240,211,178,213,151,111,220,184,161,254,226,139, 47, 90,214,174, 93, 59,248,239,191,
-255,142,243, 36,180, 20, 10, 69,205,151, 95,126,121,112, 81, 81,145,100,201,146, 37, 43,179,178,178,142,160,108,104, 25,231, 30,
-212, 61, 1,252,128,178, 42,203,104,123, 57,183, 7,192,100,111,223,107, 12,195,224,175,191,254,186,165,119, 32,127,103,234, 60,
-164, 70,141, 26,207, 94,189,122,117,119, 78, 78,206,211,174, 59, 37, 18,201,164, 90,181,106,117, 59,125,250,244, 68, 0,155, 42,
- 66,172,211,233,198,172, 94,189,250, 83,145, 72, 84,197,102,179,101,234,245,250, 49,119,236,104, 89,248, 87,166, 47, 92,177, 88,
-111,178, 85,147, 75, 69, 55, 12, 22,254, 85,154,149, 31, 92, 55,203,142, 60, 39, 55, 42, 15,101,243, 8, 58,175,255,109,127, 25,
-153, 8, 33,194,177,121, 78, 46,150,201,197, 5,115,183, 47,239, 14, 6, 75,119,215,227,144,241,230,104,141, 3,240, 40,128, 67,
- 57, 57, 57,243, 94,120,225,133, 89, 63,253,244, 83,144, 90,173, 70, 78, 78, 14,114,115,115,193,113, 28, 84, 42, 21,190,252,242,
- 75,125, 78, 78,206, 60,231,115,112,235, 8,242, 0, 96,136,136,136, 56,178,108,217,178,152,175,191,254,154,123,241,197, 23,175,
-247,236,217,179,206,151, 95,126,121, 85, 34,145, 16,155,205,198, 24,141, 70,230,245,215, 95,175, 62,103,206,156, 52,145, 72,164,
-120,246,217,103, 25,165, 82,121, 8, 94,134, 13,200,203,203,219,250,235,175,191, 62,249,206, 59,239,200, 76, 38,147, 91, 39, 75,
-216, 22, 18, 18,130,189,123,247,154,138,138,138,182,248,112, 49,182,254,177,105, 99,219,231,251,247,151, 88, 74,213,176,148,170,
- 97, 85,171, 97, 43, 45, 6,163, 81, 67,108,179, 66, 46,225, 17, 19, 31, 0,171, 62, 16, 27, 15,255,109, 49, 26,141, 94, 7, 54,
- 84,171,213, 91,247, 44, 89,210,254,209,132, 4,110,239,200,145, 48, 91, 44,120,226,194, 5,135,184, 50,155,205, 88,215,176, 33,
-108, 12,131, 71, 94,123, 13,151,172, 86,171, 90,173,222,250, 95,124, 24, 78,156, 56,145, 59,112,224,192,163, 60,207, 55,169,136,
-187,243, 95,135,197, 98,185,197,141,178,217,108,101,174, 99,153,115, 32,221,184,113, 99,219,179,103,207, 74, 78,157, 58,133,221,
-187,119, 63,242,211, 79, 63,141,171, 86,173, 90,195, 27, 55,110,100,251, 18,111,238, 6,253,133,189,253,225,202,229,171,240,191,
-255,253,143,201,206,206,198,207, 63,255, 12, 95,131,167, 82, 84, 26,180,176,218,228,166,157,203, 53, 61, 55,221, 40,221,159,165,
-159, 12, 96, 51, 12, 54,114,233, 24, 57,209,180,105,104, 4, 0, 24, 13,182,152,154, 53,107,182,227, 56, 78, 10, 0,129,129,129,
- 77,195,195,195,191, 44, 40, 40,104,237, 46, 77, 83, 83, 83, 91, 68, 69, 69, 53,254,253,247,223,255,206,202,202, 58, 13,224,160,
-235, 65,213,171, 87, 31,127,238,220,185,230, 98,177,152,241,145, 71, 0, 0,237,218,181,171, 45,147,201,194, 55, 93, 12,134, 90,
- 82, 3, 68, 84, 2,112, 1,176,133, 52,194,117, 73, 61,196,199, 31, 8, 47, 42, 42,122,164,164,164,228,239, 10,222,131, 14, 79,
- 62,249,228,119, 75,150, 44,137,111,215,174, 29, 57,118,236, 24, 11, 23,123,168,122,245,234, 93,247,239,223,223,228,213, 87, 95,
-253,106,197,138, 21, 67, 81,190,167,173, 47, 92,183,143, 55, 88,105,216,122, 25,219, 0, 91,130,221, 51,163,185,248, 33, 64, 69,
-134, 92,184,131,225, 25,238, 40,136, 30, 13, 12, 15,219, 31,181,143,137,245,168,197, 98, 57,126,226,196,137,117,207, 62,251,172,
-166,160,160, 0,225,225,225, 72, 76, 76, 4,195, 48,248,242,203, 47,245,215,174, 93, 91, 99, 31, 75,235,209,204,204,204,222,118,
-177,229, 14,165,243,231,207, 95,177,116,233,210,144,163, 71,143,138,172, 86,171,170, 78,157, 58,186,125,251,246, 5,138,197, 98,
- 34,145, 72,248,163, 71,143, 42,170, 87,175,110, 96, 24, 70,246,231,159,127, 22, 28, 56,112,160,218,232,209,163,191, 69, 89,119,
-107, 79, 88, 62,101,202,148,140,171, 87,175,194,104, 52, 66,173, 86,163,164,164,196,177, 20, 23, 23,163,164,164, 4, 98,177, 24,
-217,217,217,248,229,151, 95,178,236,163,196,123,115, 54,190,248,252,203,133,121, 89, 55,174, 67,165,144,195,170, 46,134,173,164,
- 0, 40, 45,129,212, 98,134, 82,108, 67,213, 26,114, 4, 40, 84,200, 81,107,176,100,223,225,108,251, 40,241, 30, 97, 50,153,190,
- 24, 49,103, 78,142, 85, 34, 65, 66,191,126, 48,219,171, 10,157,133,150,141, 97, 80,173, 83, 39,176,193,193,152,182,102, 77,142,
-125,148,248,123, 10,158,231, 69, 38,147,201, 91, 60,192,243,124,250,217,179,103, 87, 0,216,193, 48, 12, 97, 24,134,160,108,176,
- 54,205,253,252, 32, 91, 44, 22, 76,152, 48, 1, 18,137, 4, 19, 38, 76,192, 71, 31,125,132, 89,179,102, 97,225,194,133,248,241,
-199, 31,177,113,227,198,164, 61,123,246, 72,118,237,218, 69,166, 79,159,158, 95,189,122,117,209,107,175,189, 22, 34,151,203,223,
-246,198, 57,102,204, 24, 4, 5, 5, 97,204,152, 49,248,228,147, 79,240,205, 55,223, 96,221,186,117,216,187,119, 47, 68, 34, 17,
-159,158,126, 19, 6,131,129,204,159, 63, 63, 99,221,186,117,250,121,243,230,129,227, 56,134, 22,173,247, 4, 31,200, 7,126,120,
- 54,100,241,249, 43,251,179,244, 31, 0,248, 67,248, 34, 85,169, 84,242,181,107,127,229, 0, 96,205,234, 95,196, 23, 46, 92, 8,
-254,245,215, 95, 3,162,162,162,240,227,143, 63, 6,200,229,242, 40, 15,156,182,117,235,214, 25,165, 82,105,248, 43,175,188,210,
-189,121,243,230,111,217, 63, 68, 59, 1,168,143,178,222,139, 93,174, 92,185,114, 38, 34, 34,226,226,150, 45, 91,180,254, 4,180,
-180,180,244,219, 31,126,248, 33,177,208, 22,134, 77,218, 39,177,132,255, 20, 27, 67,190,195,245,132,143,160,168,210, 12,207, 61,
-247, 92, 21,155,205,182,184,130,241,127,174,111,223,190, 63, 44, 89,178, 36,254,149, 87, 94,201, 62,118,236, 88, 14,128, 37, 0,
-150, 57, 47,231,206,157,203,127,225,133, 23,178, 22, 47, 94, 28,251,236,179,207, 46, 4,240, 52,205, 58, 20, 20,229,191,133,224,
-161,215,161,167,194,124,157,213,106,237,205,113,220,122,148, 31,176,244, 77,147,201, 20,203, 48, 12,145, 72, 36,217, 57, 57, 57,
-243,156, 7, 44, 77, 79, 79,239, 29, 31, 31,239, 56, 7,101,179,123, 59,143,165,165,122,226,137, 39, 58,239,223,191,127,193,134,
- 13, 27,114, 75, 75, 75, 3, 87,175, 94, 45,159, 49, 99,198,117,158,231,201,123,239,189,151,208,173, 91, 55,157,205,102,203,122,
-237,181,215,170, 39, 37, 37,189,118,238,220,185,109, 12,195, 56, 11,173,114,156,118,212,175, 81,163,198,222, 53,107,214,168, 66,
- 66, 66,144,155,155,139,194,194, 66,104,181, 90,216,108, 54,136,197, 98,228,229,229, 97,242,228,201,234,204,204, 76,119, 3,150,
-186,227,124, 52, 49, 46,110,235,188,137, 19,130, 66, 56, 22, 5,231,207,194, 90, 84, 0,177,213,130,170,245,131, 33,145,202,113,
-233, 66, 41,222, 94,254, 75,233,141,194, 98,119, 3,150,186,229,108, 86,179,230,182,175, 70,143, 14, 52,220,188,137,216,151, 94,
-130, 78,167,131,217,108, 6,203,178,184, 50,111, 30, 36,145,145, 24,191,114,165,246,244,141, 27,157,112,235, 80, 25,238, 56,239,
- 20,206,156, 67, 25,134,113, 52,134,239,219,183,111,185, 3,127,253,245, 87, 44, 92,184, 16, 70,163,209, 74, 8,121, 19,192,151,
- 0, 2,237,187, 53,247, 48,156,149,206, 25, 22, 22, 54,239,247,223,127, 79,140,138,138, 98,156, 71,108,183,139, 79, 0,192,176,
- 97,195, 58, 29, 56,112, 64,214,184,113, 99, 99,126,126,126,243,200,200,200,237,203,150, 45,139,120,246,217,103, 51,207,156, 57,
- 19,231,202, 25, 30, 30, 62,107,205,154, 53, 53,106,212,168,193, 10,174,152,107,245,228,144, 33, 67, 58, 47, 91,182, 76,250,228,
-147, 79, 26,181, 90,109,116, 80, 80,208,229, 53,107,214, 68,244,233,211, 39,251,204,153, 51,177,247,235,253,124, 16, 56,235,215,
-175,127,233,244,233,211, 53,132,117,189, 94,143,188,188, 60,228,231,231, 35, 36, 36, 4, 93,186,116,185,146,150,150, 86,195, 3,
-103,227,103,158,121,102,226,226,197,139, 59, 43,149, 74,201,174, 93,187,180,219,182,109, 51, 92,191,126,221,106,177, 88, 72,108,
-108, 44,215,186,117,235,128, 30, 61,122, 40,101, 50, 25,251,225,135, 31,230, 79,157, 58, 53,130, 97,152,229, 0, 6,186,227,108,
-220,184,241,193, 63,254,248,227, 81,134, 97, 32, 18,137, 96, 50,153, 81, 92, 92,140,140,140,116,156, 57,115, 6,251,247,239,199,
-150, 45, 91,254,214,106,181,141,253,140,123, 56,128, 93, 70,163,177,142, 84, 42,245, 91,216,219,108, 54,112, 28,119, 30, 64, 87,
- 0,233, 52, 47, 81, 78,138, 50,137, 3, 55,141,225, 9, 33, 94,123,243,193,238, 78,173,179,127,153, 31,114, 51,132,195, 56, 0,
- 19,156, 92, 48, 95,118,158,154, 16,178,187,115,231,206,195, 58,117,234, 52,167,107,215,174, 89, 89, 89, 89,201,179,103,207,142,
-183, 90,173,230, 51,103,206,176,151, 47, 95,190,126,228,200,145, 26,181,106,213,122,237,220,185,115, 59, 93, 68,150, 39,156,185,
-124,249,242,227, 29, 58,116,248,229,181,215, 94,171,214,162, 69, 11,105, 72, 72, 8, 56,142,195,213,171, 87,241,247,223,127,155,
- 86,174, 92,153, 94, 92, 92, 92,145, 41,120, 14,165,101,100,116,121,118,248,155,107, 94,235,219, 43,226,177, 58,181,165,177,177,
-177,128, 94,143,243, 55,178,113,224,252,223,230,111,118, 31,200, 51, 26,141, 79,195,255, 41,120, 14, 29,185,116,169,115,199,209,
-163,215, 76,122,254,249,104,100,101,113,177,177,177,144, 74,165,184,118,237, 26, 46,243,188,117,230,162, 69, 57,106,181,250,223,
-152,130, 71, 6,224, 83,158,231, 57, 0,144,203,229, 24, 49, 98, 4,156,167,220, 89,184,112, 33,244,122, 61, 0,112, 12,195,124,
- 10,224,187,251,221,197, 18, 80, 88, 88, 56,254,137, 39,158,152,206,113,156,199, 81,111, 67, 67, 67, 81, 90, 90, 10,171,213,106,
-203,200,200, 56, 31, 26, 26, 10,177, 88, 12, 66,136,219,231,168,160,160, 96,252,211, 79, 63, 61,133,101, 89, 79,206, 7, 84, 42,
-213,245,237,219,183,215,124,245,213, 87,217,239,191,255,254,234, 43,175,188, 34,219,190,125,187,141, 16,242, 11, 45,183,254, 99,
-165,168, 83,199, 6,251, 71,156,183,161, 20,142,175, 94,189,122,206,145, 35, 71, 34,135, 13, 27,150,252,252,243,207,171, 58,116,
-232, 16,232,124,128, 94,175,231,127,251,237, 55,237,194,133, 11, 75,118,239,222,157, 54,100,200,144, 22,240, 50,119,234,141, 27,
- 55, 54, 78,155, 54, 45,184, 71,143, 30,181, 0, 56,218,103,229,229,229,225,250,245,235, 56,117,234,212,117,179,217,188,190, 2,
- 81, 42, 0, 48,105,192,128, 1,159, 46, 93,186,180,202, 43,175,188,146,189,114,229,202, 83, 40, 27,176,216, 21, 33,125,251,246,
-109,184,116,233,210,216, 87, 94,121, 37, 27,101,237,200,104, 59, 66, 10,138,127,208, 30,183,182,211,242,250, 1,243,131,201,100,
- 34, 6,131,129,232,116, 58,162,209,104, 8,220,207, 2,191, 46, 51, 51,147,164,167,167,147, 27, 55,110,144,180,180, 52, 2,224,
- 71, 23,197,235,174,192, 82,254,244,211, 79, 53,226,226,226, 38, 42, 20,138,205, 34,145, 72, 45, 18,137,212, 50,153,236,143,240,
-240,240,143,102,206,156, 25, 71, 8,145,120, 81,209,158,192,137,197,226, 87,163,162,162,214,133,133,133,165,135,134,134,166, 71,
- 69, 69,173, 19,139,197,255, 3, 32,246,161,204, 61, 33,128,227,184,119,149, 74,229, 86,153, 76,150, 43,147,201,114,149, 74,229,
- 86,142,227,222,133,247,129, 84,189,114, 74,165,210,119, 35, 35, 35,183,170, 84,170, 92,149, 74,149, 27, 25, 25,185, 85, 42,149,
-222, 9,231,157,124,149, 8, 66, 75, 71,236, 96, 24,198,242,200, 35,143,124,213,164, 73,147, 47,155, 52,105,242,101,163, 70,141,
-190,102, 24,198, 34,236, 7,160,131,231,193, 27,239,102, 56,255, 53,206,148,148,148,101, 75,151, 46,229,199,143, 31,175,174, 85,
-171, 86,225,248,241,227,213, 75,151, 46,229, 83, 82, 82,150,221, 46,103,116,116,116, 66, 74, 74, 74,225,226,197,139,173, 23, 46,
- 92, 32,139, 23, 47,182,166,164,164, 20,186,140, 12,255, 64,222,207,255, 58,103,253,250,245, 47, 17, 39,152, 76, 38,146,151,151,
- 71, 46, 92,184, 64,118,239,222, 77,226,227,227, 47,249,193, 25, 14,224,117, 0,191,197,196,196,156,107,217,178,229,141,199, 31,
-127,252, 70, 66, 66,194, 85,177, 88,188, 31,101, 35,188,167,216,151, 79, 1,212,242,193,217, 50, 36, 36,100, 90,124,124,252,250,
-154, 53,107,238, 77, 76, 76,220, 31, 22, 22,182, 33, 32, 32, 96, 6,254, 25, 25,187,162,113,239,240,228,147, 79, 94,215,104, 52,
-182,166, 77,155,158,115,119, 82,221,186,117,247,104, 52, 26, 91,255,254,253,211, 1,164,210,188, 68, 57,239, 18,231, 3,253,129,
-230,138,154,118,193,180,206,105, 25,231,230,184,113, 46,199,252, 96, 63,215,103, 66, 16, 66, 68,132, 16, 37, 33, 36,152, 16, 18,
- 70, 8, 9, 33,132, 4, 18, 66,100,132, 16,150,102,194,127,133,115,168, 93, 64,233,236,255, 93,225,107,255, 3,125, 63,227,226,
-226, 66,155, 55,111, 62,124,237,218,181,239, 94,185,114,229,221,181,107,215,190,219,188,121,243,225,113,113,113,161,119, 18,206,
-232,232,232,132,122,245,234, 45,168, 91,183,110,122,189,122,245, 22,184,136, 44,154, 63,255, 37,206,164,164,164,223, 27, 54,108,
-120,169, 81,163, 70,151, 27, 53,106,116,169,126,253,250,151,234,212,169,115,169,122,245,234,151,170, 86,173,122, 41, 34, 34,226,
-247,219, 8,103, 24,128, 88,220, 58, 13,216,191, 29,247,246, 41, 41, 41, 7, 2, 2, 2,220,142, 13,198,113,220,164, 70,141, 26,
-157, 68, 89, 79, 73,154,151, 40, 39, 21, 90,149, 32,180,104,134,121,120, 57,101,240, 62,205,136,175,253,244,126, 82, 78,202, 73,
- 57, 41, 39,229,164,176, 11, 45, 58,250, 52,133, 43,140,240, 62, 50,174,175,253, 20, 20, 20, 20, 20, 20, 15,157,166,114, 89,218,
- 9, 59, 24, 47,170,180, 34,189, 9,110, 71,217,110,163,156,148,147,114, 82, 78,202, 73, 57, 41,231, 67,199, 41, 96,142,135,237,
-231, 93,214,191,190, 79,133, 23, 67,171, 14, 41, 39,229,164,156,148,147,114, 82, 78,202,249, 95,225,116,135,215,238, 83,145,213,
- 14,240, 49,188, 3, 5, 5, 5, 5, 5, 5, 5, 5, 69,133,225,123, 82,233, 85,171, 86,137,132,255, 3, 6, 12, 24, 98,179,217,
-134, 11,235, 34,145,232,243,159,127,254,249, 59,111, 87,232,215,175,159,205, 27,167, 59,248,186,142, 59,206,250,181, 84,111,132,
- 7, 43,222, 44, 46,209,205,189,154,105,219,109, 48, 24,234, 9,251, 2, 2, 2,206,126,247,221,119, 23, 43, 59,156, 67,134, 12,
-169,229,122,157,196,120,113,251,176,160,128, 17,133,197,154,217,167, 47,105,190,166,121,236, 95, 65, 4,128,212,160, 0, 73,239,
-250, 33,146,150,167, 10, 12,251,180,102,219,111, 40,235, 13, 91,244, 32, 70, 56, 38, 38,166,142, 74,165, 26, 4,160,190, 78,167,
-139, 82, 40, 20,185, 0,206,168,213,234,101,217,217,217,231,253,229,105,151,136,235, 0,170,217, 87,111,236, 76, 67,130, 63,251,
-124,161,107,117, 24, 8, 32, 99, 24,152,183, 92,134, 99, 2,205,110, 53, 96,224,201,173,219,187,214,128,137, 16, 72, 24,192,184,
-229, 10, 2, 30,160,164, 82, 1,232,130,178, 33, 28, 78, 0,216,130,178,158,187, 20, 20, 20, 15, 14, 92, 39,148,118,172,115, 30,
-196, 68, 91, 9,199, 44, 32, 32, 33, 0, 9, 55, 26,141, 98,169, 84, 10,147,201, 4,133, 66,254,197,235,175, 12,153, 8, 22,197,
- 22, 43, 70,124,247,221,119,183, 61,211,117, 69,174, 3,224, 47,215,243, 67, 85,242, 41, 59,126,123, 47,180,109,207,153, 51, 76,
-215,242,199,148,150,150,178, 50,153, 12, 70,163, 17,193,193,193,143,191,241,218,107, 77, 89, 49, 49, 73, 36,202,125,115,230,204,
-201,190,221,112,190,253,246,219, 49,102,179,161, 21,207,243, 82,147,201, 36,115,189, 78,176, 66, 57,115,199,111,239, 41,218,165,
-206,152, 8, 80,161,245, 47, 64,154, 16,170,220, 57,119, 64,251,186, 45,235,215, 4,127,102, 23, 12, 38,115,239, 29,233,154,222,
- 31,237,207,124, 39, 93, 99,110, 2, 47, 3, 65,222,135, 16, 37, 39, 39, 15,139,140,140,236,191,104,209, 34, 73,114,114, 50, 2,
- 2, 2,160,215,235, 99,175, 92,185, 18,251,198, 27,111,180,147,203,229, 43,174, 94,189,250, 5,252,155, 8,174,218,142, 31, 62,
- 4, 0, 60, 62,104,114, 53, 0,239, 58, 9, 1,199,190,246,131, 39, 87, 3, 48, 26,229, 39, 70,206, 2,176,222, 67,169, 35,221,
-176,116, 22,122,191,240, 46, 7,224, 13, 71,224, 89,224,143, 31,231,161,251,128, 55,203,109,103, 8,184,223,150,206, 66,234, 11,
-239,122,156,213,188, 91, 77,198,194,243,196,163, 19,207,178,140,117,243, 37,226,110,130,225, 28, 0,238,230, 35,237,134,178, 9,
-157,221, 30,223,179,142, 40,199,108,177,185, 29,112, 86, 34, 22,229,110, 60,111,187,229,220, 23, 27,195, 98,177,149,149,173, 18,
- 14,182,117, 87,131,119,124,240,193, 7, 92,106,106, 42,190,249,230,155,214, 95,127,253,245,107,165,165,165,127,218,239,219,101,
-250,248, 82, 80, 60,208,130,203,189,208,226, 68,248,106,253,154,239,106,228,228,230,227,197, 87, 71, 97,249,242,229, 40, 42, 42,
- 66,104,104, 40,164, 18,137,120,238,167, 31,198,168, 84,202,152, 23, 95, 27,243, 21,128, 58,183, 27,154, 10, 94,167,166,235,249,
-140,125, 14, 68, 78,196,138,165, 82, 41,187, 98,197, 10, 20, 23, 23, 35, 36, 36, 4, 82,169,152,157, 51, 99,156, 92,165, 10,148,
-191, 60,116,108,107, 0,171,110, 55,156, 38,147,166,245,218,229,223,169,242,242,242, 48,248,127, 99,224,122, 29,137, 68, 98, 19,
- 94, 44, 52,143,253, 43,248, 96,209,136, 23,234, 54, 8, 2,204,167,247, 66, 44, 18, 65, 17, 28,138, 46,156, 8, 34, 6,245, 94,
-220,156,246, 62,128,143, 30,148,200, 38, 39, 39, 15,235,215,175, 95,255, 41, 83,166, 72, 88,182,172,227,176, 86,171,133, 94,175,
- 71, 92, 92, 28,118,236,216, 33, 25, 63,126,124,255, 95,127,253, 21, 87,175, 94,157, 95, 81,254,211,167, 79, 39, 86,171, 86,205,
- 0, 0,189, 26, 6,185,238, 75, 16,246, 1, 64, 80, 80,144, 79,190,240, 16,165,241,244,233, 3,245,133,243,134,117,138,179,121,
-216,110, 0,160,240,198,197,243,132,219,178,224, 13,143,251, 95,157,242,147,245,196,170,221,117,146,147,147,245,206,219, 3, 3,
- 3, 61,157, 18,173,209,104,170,185,110, 20,142, 55, 91,108, 81,158,174,215,117,196, 66,183, 2,204, 98, 3,247,211, 79, 63, 1,
- 0, 62,123,119,160,104,241,193,124,142,227,202,138,218, 79, 63,253, 20,147, 38, 77,146,110,222,188,185,199,210,165, 75,123,172,
- 91,183,110,174, 39,161, 74, 65, 65,113, 95,138, 44,231, 95,207, 66,139,101,152, 32, 85, 80, 32,158,121,238,117,252,254,251, 31,
-104,219,182,173, 99, 95, 82, 82, 18,250, 61,221, 7, 63,255, 48, 7, 0,130,238, 36, 68,119,122,157,162, 18,237, 71,221,251, 47,
-152,124, 35, 91,179,127,195,134, 13,104,211,166, 77,185,243,159,123,246, 25,252,248,237,167,240, 50,202,188, 95, 96, 8, 43, 9,
- 82, 41, 49,224,197,255,193,221,117, 94, 27,220,119, 67,183,126,243, 58,231, 20,104,231,208,124,118,239, 81, 35, 38,188,107,195,
-186,117, 80,244,203, 23,248,187,216,128,223, 51, 13,120,185,203, 99, 72, 9,147,163,141,213,134, 24,165,184, 99,182,214,242, 64,
- 8,173,152,152,152, 58,145,145,145,229, 68, 86,105,105, 41, 52, 26, 13,212,106, 53, 74, 75, 75,193,178, 44,198,140, 25, 35,217,
-185,115,103,255,152,152,152,109,126, 84, 35,222,176, 59, 89,128, 72,172,153, 48, 97,130, 49, 42, 42,202,168, 80, 40, 8, 39,145,
-149,182, 31, 60, 57, 8, 0, 88, 78, 82, 58,119,238, 92, 83, 92, 92,156,129,227, 56,233,155,111,190,233,215,240, 48, 70,163,145,
- 56,115,154, 76, 70,199,246,153, 51,103,154,162,163,163,141, 10,133,130,152,205,254,155,142, 39,175, 21, 66, 38, 17, 65, 38, 17,
- 33, 64, 42, 70, 80, 98,115,200,138, 78,193,106,181,226,147, 79, 62, 49,199,196,196,152, 20, 10, 5,145, 74,165,146,145, 35, 71,
-250, 12,231,144, 33, 67, 72, 72, 72,136, 89,161, 80, 72, 38, 77,154,116,203,180, 25,219, 79,100, 64, 46, 21, 67, 33,227, 80, 51,
- 41, 30, 50,162,247, 59,172, 34, 81,249,214, 8, 50,153, 12,173, 91,183, 70,253,250,245,177,110,221,186,246, 84,104, 81, 80, 60,
- 16,240, 56,221, 14, 7, 0, 27, 54,108,104, 7, 96, 7, 0,164,166,166, 50,101,103, 16,140, 30,246, 52, 94, 30, 60, 0, 54, 27,
-239, 24,221,148, 97, 25, 12,125,169, 7,120,222,159, 26, 9,223, 93, 60,111,227, 58,255, 76, 82,205,176, 34, 0,168,145, 16, 75,
- 94,123,249,121,216,120,254,159,138, 18, 17,240,250,224,238,101,219, 42, 33,156, 34,216, 48,234,141,167,224,238, 58,117,106, 84,
- 97,173,102, 3,152,242,147, 61,222,141,201, 54, 41,167, 27,212,175, 26, 91,221,162,215,195, 96,176, 96,201,249, 66,253,214, 12,
-109, 20, 27,146,150, 55,239,153, 22, 1,162,188, 76, 36, 4, 73,107,102,107, 45, 15, 68,220, 85, 42,213,160, 69,139, 22,221, 34,
-178,114,114,114, 88,141, 70, 3,179,217,204,151,150,150,194,102,179, 97,236,216,177,226,241,227,199, 15,202,206,206,158, 36,104,
- 30,119,156,246,118, 87,163, 79,159, 62,157,240,193, 7, 31,152, 59,118,236,120, 35, 41, 41, 73, 43, 18,137, 16, 27, 27, 59,175,
- 75,151, 46, 97, 83,166, 76, 49,247,232,209, 35, 77, 36, 18,161,102,205,154,218, 83,167, 78, 37, 0,144,251, 27,119,103,206,239,
-182,127, 78, 0,128, 97, 24,116,233,210,229,122,205,154, 53,181, 34,145, 8, 23,127,155, 73,252,189,159, 98,142, 69,173,184, 96,
-123, 33,194, 0,242, 64, 71, 75,188, 46, 93,186,164,215,169, 83, 71,195,178, 44, 78,158, 60, 25,143, 91,167,181,186,133, 83, 46,
-151, 91,158,123,238,185, 27,231,207,159,119,119, 60, 56, 17,139, 22,117,236, 6, 86, 92, 19, 32,125,143,199,112,138, 69,176,142,
- 31, 54,144, 11, 9, 0,100, 65, 17, 70,181, 90, 13,149, 74, 85,230,144,153,205, 56,126,252, 56, 90,182,108,217,110,213,170, 85,
- 59,233,243, 78, 57, 41,231, 63,112,167, 69,238, 67, 55,139,113, 90, 47,215, 70,107,135,107,164,108, 54, 43,146,170, 69, 99,230,
-135, 67, 96,179,241,176,217,108,176,218,127,109, 54, 27, 44,102,115,165,132,236, 78,174, 19,170,146, 79,249, 99,197,136,208,142,
-125, 63,237, 52,253,131,193, 91,109, 54,128,231, 45,176, 88, 0, 27,111, 1,111,179,193, 98,169,156,166, 57, 22,158, 71, 66,124,
- 12,166,127, 48, 24,174,215, 89,246,243,170, 94,219,215,143, 81,180, 77,157, 49,234,226,117,221, 39, 84,216,223, 91, 4, 72,100,
- 28,225, 2, 96, 50, 89, 81,106,226, 77, 0,180, 6, 11,111, 38,202,136, 0, 0,224, 88,230, 65,234, 93, 91, 63, 57, 57,185,156,
-200,154, 53,107, 86,196,151, 95,126, 25, 7, 0, 79, 63,253,116, 70,167, 78,157,242, 47, 92,184,128,216,216, 88, 38, 63, 63,191,
- 39,128, 55,237,231,142, 6,240,165, 7, 94,109,181,106,213, 12,145,145,145, 70, 65, 16,177, 44, 11,142,227, 80,173, 90, 53, 67,
- 84, 84,148,177,102,205,154, 90,137, 68, 2,150,101, 33, 8, 61,191, 62,243, 24, 6, 34,145, 8, 2,167,171,219, 35,112, 86, 4,
- 98,142,189,181,120,115,226,100, 89,214,237,245, 60,230,161,128, 0, 2,192,227,241, 34,214,169,120,228,188,183, 16, 88,114, 28,
- 98, 0, 59, 8, 33, 56,118,236, 24,174, 94,189, 10,137, 68,130,152,152, 24, 76,154, 52, 9, 70, 99,153,222,237,215,175, 95, 59,
- 0, 39,233, 19, 76, 65,225,192,142,251, 80, 96,185,186, 90,222,219,104,109,216,176,161, 93,106,106,234, 78, 65, 0,149,137, 29,
- 55,226,199, 98,133,197, 98, 6, 42, 97, 32, 46,111,215,177,217,120,175,215, 17,218,104,241, 60,225,220,138, 44,158,135,213, 98,
-169,148,187,199,219, 44,224,121, 11,220, 93,135, 97, 88,155,189,192,151,208,231,228,222, 35,166, 90, 2,107,169,150,132,221, 86,
- 3,226,194,101, 82,228,235,145, 92,187,174,232,184,206,130,189, 39,206, 34, 34, 80,245,192,164,139, 78,167,139, 10, 8, 8,128,
- 86,171,117, 56, 89, 95,126,249,101,156,201,100, 98, 1,128,227,196,241,121,124, 92,128,141, 7,130, 85, 89, 40, 42, 42, 9, 39,
-132, 48,118,193,243, 41,128,239,224,101,100,127,137, 68,226, 16, 40,206, 2, 72, 38,147,221,150,128, 17, 32,136, 51,137, 68,226,
-118,187,107,245,154, 47, 72,156,133, 22, 72,153,171,229, 34,182, 68, 34, 17,132,182, 81,190, 32,149, 74, 29,113,119, 7, 78,228,
-116, 61, 81,197,155, 98,154,205,102,104, 52, 26, 20, 23, 23, 35, 32,160,204, 48, 35,132,128, 97,152, 55, 1,188, 69,159, 98, 10,
- 10,247, 90,228, 62, 22, 91,238,133, 22,202, 44, 59, 6, 0,172, 22,179, 91,241,179,234,183,189,184,145,173, 69, 76,196, 33, 16,
- 47,117,146,238,208,191,127,255, 31, 98, 99, 99, 91, 8,235, 50,121, 96,248,107, 35, 62,134,213,106, 70,144,156,197,171,131,186,
-151, 19, 89,101,142,150, 9,158,228, 92, 81,137,246,163,238,253,230, 79, 14, 86,133,239,119, 21, 63,211,151, 28,125,166, 72,109,
-140,103,217,195, 40, 98, 98,109,253, 94,255,120,136, 83,225,126, 98,197,194, 9,239,248,237, 7, 50,172,248,153, 55,230,189, 70,
-184,192,122, 10,182,116,215,123,131, 31, 91,235, 44,230,194,194,194, 54,116,125,102,110,231,156, 66,218, 70,235,223, 64, 80,112,
- 8, 27,223,172, 61,154,189,185, 0,219,199,189, 71,128, 34,132,199,198,177, 29,134, 77, 69, 96,179, 94, 56,240,234, 32, 30, 40,
-124, 32,226,170, 80, 40,114,117, 58, 93,172, 94,175,135, 90,173,134, 90,173, 46, 47, 8,196, 98,230,181,255, 13,143, 16, 75,164,
-176,152, 77,248,125,217, 84,159,156,194, 16, 14,189, 26, 6, 65, 36,150,150,158, 73, 78,158,199,113, 28, 88,150,197,111, 95,188,
-247,230, 47,179, 71, 4, 1,192,137, 13, 95,168, 7,140,249,124, 62,203,178, 48, 26,141,178,138,132,251,230,205,155,241, 70,163,
-209, 96, 23,104,130,240,195,181,107,215,170, 26,141, 70,189,243,118,127, 32, 87, 4, 1, 33, 73,128, 34,234, 22,247, 44, 45, 45,
-173,138,197, 98,209,113, 28, 7,147,201,228,151, 42, 98, 89, 86,114,242,228,201,120,158,231,221, 30, 95,191,122, 21, 32,166, 33,
- 32, 13,246, 59,206,254,140, 8,109, 23, 91, 4, 21, 44, 75, 41, 40, 30,116,103,235, 62,124, 38, 24, 15,255, 29, 66,171,253,134,
- 13, 27,136,243, 23,162,213, 98,177,139,172,127, 68,143,205,198, 35, 51,207,128, 11, 23, 46, 98,238,220,185,216,123,224,221,224,
- 41, 83,166,200,198,143, 31,111,236,223,191,255,108,158,231, 27,177, 44,123, 2,255, 84, 85,148,119,133,120,190,234,209,163, 71,
-147,133,117,139,197,130,160,160, 32, 4, 5, 5,161, 78,205,248, 91, 68,150,205,102,131,217, 75,213,161,208, 70,139, 33, 60,177,
- 88,108,176,241,188, 67,252, 20,169,141,241,235,183, 29,171,225,116,120,109,225, 79,235,230,245, 60,139,193, 55, 38, 57,226,177,
- 98,225,132,119,166,124,243,141,172,200, 22, 57,114,192, 51, 47,167,244, 27, 48, 8,207, 61,245, 68, 59,163,201,180, 78,196, 18,
-222,226,184, 30, 88, 16,184,182,209,162,184, 71,184, 92,172,181,136,101,114, 4,198, 36,226,162,198, 38, 17,137, 68,135,174, 20,
-235, 36,172,136, 3,203, 73,112,166,200, 96,121,128,162,123,230,242,229,203,177, 85,171, 86,133, 90,173,134,213,106,229,159,126,
-250,233, 12,142, 19,199,115, 98, 49,147, 58, 96, 56,159,157,157,105, 97, 89, 17, 8,177,225,137,126,111, 48,178, 0,185,196,108,
- 50, 89, 81, 86,117,232,206,205,114, 30,194, 33,168, 75,151, 46, 97, 66, 79,192, 95,102,143, 8,114,218,167,106,218,180,105,152,
-115,175, 67, 63,221, 34,166,127,255,254,242,106,213,170, 49, 0,112,120,217, 7,130,123,198,244,234,213, 43,160, 90,181,178,118,
-248,127,126, 49,194,111,206, 8, 5, 1, 74,174, 1, 37,105,183, 56, 89,189,122,245,146, 37, 39, 39, 87,232, 89,180, 55,128,247,
- 56,118,151,146,179, 2,217,199,252,226,122,177, 49, 44,113,129,224,102, 63,193, 66, 26, 24,110,108,241,222,230,131, 84,108, 81,
- 80,248, 5, 23, 45,114, 95,161,157, 93, 32,182,183,255, 58, 4, 23, 7, 0,118,139,142,113,210, 89,176, 88,205,183,136, 44,155,
-205, 6, 49, 99,196,220,185,115,241,214, 91,111, 1,128,228,157,119,222, 89, 59,101,202,148, 39,121,158,111, 68, 8,105,195, 48,
-140,183,175,198, 29,177,177,177, 57,132, 16, 49,203,178,109,190,248,226,139,176, 30, 61,122, 32, 40, 40, 8,132, 39,183,136, 44,
-155,141,135,217,108,130, 39, 75, 43, 84, 37,159,242,199,170,145,161, 29,251,124,218,201,198,243, 91, 5,145,197,219,108, 0, 95,
-118, 82, 65,110, 6,182,252,190, 14, 95, 45,252,170, 8, 12, 57, 7, 2,222, 46, 6,225, 65, 12, 54,218,115,248,108,155,214,205,
-235, 97,202, 55,223,200, 78, 31,205, 90, 59,252,237,247, 83,250, 13, 24,132, 85, 63, 47, 3,107, 45, 62,230, 44,178,108, 22, 30,
- 37, 69,249,189,254,162,109,180,254, 45,132,109,217,186,149, 25, 52,104, 16, 95, 90, 90, 10,137, 84,202, 91, 44, 22, 81,171, 86,
-173,108,111,189,245, 22,155,157,157, 13,117,169,134, 3, 16,134, 7,192,214, 82,171,213,203,222,120,227,141,118,187,118,237,146,
-176, 44, 11,181, 90,141, 14, 29, 58,228,231,241,113, 1,175,253,111,120, 68,102,102,134, 85, 37,231,140, 18,137, 24,185,185,185,
-124,187, 30, 3,245, 3,134,188, 85,229,173, 15,166, 47,202,218,183,240, 75,127,174,225,220, 19,208,117,223,226,197,139, 77,113,
-113,113, 6,153, 76, 38, 29, 60,120,176, 95,245,135, 38,147,137,204,156, 57,211,232,218,187,208,100, 50,145,185,115,231,154,226,
-227,227,141,114,185,156, 88, 44,190,219,125,178, 44, 99,125,117,202, 79, 86,171,213, 90,206,197, 18, 68,150,133,103, 52, 11, 22,
- 44, 48,199,199,199,155, 20, 10, 5,145,201,100, 18,127,194, 57,124,248,112, 18, 26, 26,106, 86, 42,149,146, 49, 99,198,220, 81,
-175, 67,139, 13,220,148, 47, 28,195, 59,200,130,130,130, 80, 90, 90,234, 8,107,108,108, 44, 21, 91, 20, 20,110,112,139, 22,185,
- 63, 93, 56,255,198,209,226, 1, 77, 78,110,126, 84, 68,116, 34,172, 86,171,125,177,192,106,177, 96,228,235, 3, 48,123,225, 2,
- 0, 16,196, 86,151,119,222,121,103, 45, 0,159,133,217,138, 21, 43, 38,191,243,206, 59,170,156,156,156,205, 63,252,240, 67,216,
-192,129, 3, 49,122,244,104,124,250,233,167, 16, 75, 3, 16, 22, 89,213,113, 29,225,186,249,121,133, 32, 32, 26, 15, 62,157,185,
-172,144, 2, 23, 30,153, 0,139,205, 2,222, 98,129,197, 98, 1, 35, 42,139,218,150,223,215, 97,224, 75,195, 33,150,169, 66, 63,
-159,251,137, 62,165, 89,236,147,227, 95,121,197,232,135, 9,200,158, 62,154,181,118,248, 91, 99,186, 8, 34,107,205,178,133,231,
- 62, 27,219,103,185, 76,202, 57,174, 99,225,121,176,172,136,182,209,250,151, 68,150, 76, 38, 91,189,105,211,166, 75, 77,154, 52,
- 97,180, 90, 45, 44, 22, 11,242,243,243,177,118,237,218, 51,132, 16,132,134,134, 98,211,166, 77,252,192,129, 3, 87, 27,141,198,
-103,238,119,177,149,157,157,125, 94, 46,151,175,120,255,253,247, 7,140, 29, 59, 86,204,243, 60, 46, 92,184, 0, 48, 12, 17, 75,
-164, 96, 89, 22, 98, 49,135,146, 18, 53,175, 8, 12,201, 50, 19,145, 66, 44,145,130, 21, 73,188,117, 19,190, 97, 31,140, 20, 44,
- 39, 41, 21,122, 2, 74, 36, 18, 28, 88, 53, 75,221,126,240,100, 21, 0, 72,100,242,162,174, 93,187, 94,175, 87,175,158,246,200,
-145, 35, 9,184,181,215,161,235,243,105,237, 59,120,140, 72, 33, 15,208,118,233,210,229,134,192,153,182,245,115,245,160,161, 31,
- 48,140, 72,170, 77, 77, 77,189,158,146,146,162, 21,137, 68, 56,187,238, 19,117,223,193, 99, 2, 24, 47,131,172,110,190, 68, 94,
- 61,177,106,119,157,169, 83,167, 90,122,244,232,113, 83,104, 47,150,150,150, 86,165,103,207,158,178, 57,115,230, 88,122,246,236,
-153,222,160, 65, 3, 13,203,178, 56,122,244,104,188, 55,167, 74,128, 92, 46,183,188,252,242,203, 55, 78,157, 58,117,187,189, 14,
-189,162,106,213,170,224,121, 30, 29, 58,116,128,193, 96,160,206, 22, 5,197,131, 9,215,113,180, 60,143, 12,111,177, 90,134,191,
-254,230,196,207, 1, 38,208,169, 20,248,199, 88, 34, 96,222,125,119,148, 18,128, 92, 16, 91,111,191,253,182,207,105, 78,156, 68,
- 86,179,129, 3, 7, 98,220,184,113,248,236,179,207,108,159,126,250,169,232,252,197,107,230,193, 67, 63, 42,118,185, 14, 8,136,
-134,183,240,195,221,241, 21,149,104, 63,106,211,115,198,196,140, 28,221,158,193,111,140,119,148, 94, 54, 0,106, 38,214, 6, 0,
- 95, 45, 92,168, 21,203, 84,202,126, 3, 6, 1, 64,151,207,231,126,178,118, 10,190,241, 45,182, 8, 83,119,248,219, 99, 66, 5,
-145,245,197,156,169,167,130,153,156, 5, 35, 70,157,177, 56, 95, 7, 0,194,130,176,182, 77,207, 25,221,114, 11,181,243,104, 62,
-187,119,144, 74,165,147,183,111,223,174,108,216,176, 33, 83, 80, 80, 0,155,173, 44, 69,204,102, 51, 74, 74, 74, 80, 90, 90, 10,
-163,209,136,166, 77,155,178,243,231,207, 87,142, 24, 49, 98,178,201,100, 26,122,191,199,251,234,213,171, 95,172, 95,191, 30, 59,
-119,238,236, 63,118,236, 88,113, 76, 76, 12, 19, 28,156,195, 88,204, 38, 0,132,228,229,229,241,138,192,144,172,136,232,248, 27,
-153,217,185,117, 45,102, 19,120,155,217, 99,107,115,251,240, 14,239,158, 62,125, 58,113,214,172, 89, 38,231,158,128, 3,198,124,
- 62,191,105,211,166, 97, 11, 22, 44, 48,165,166,166, 94, 23, 26,175,251,211, 24,126,203, 21,188,121,250,244,201,250,174,156,237,
- 95,155,245,173,192,233,220, 27,177,215,168, 69,223,214,172, 89, 51, 44, 37, 37,229,186, 55,222,228,228,100,125,108,108,172,169,
- 78,157, 58, 26,177, 88,252,127,246,206, 58, 60,138,171,141,226,103,102, 93,227, 78, 72, 8, 22,197, 37,184, 91,209, 22, 45, 78,
- 41, 86,172, 80,138,180,120,161, 80,188, 88,129,150, 2,165,248, 71,139,107,113, 39, 9,193, 18, 36, 16,119,151,117,153,251,253,
-145,108,154,132,200,110, 66, 75,105,231,247, 60,243,108, 50,114,246,142,238,153,247,222,251,222,252, 72,150, 94,175,172, 89,179,
- 38,227,236,236,172,245,243,243,203,179,180,209,190, 88, 44, 38,166,168, 88,105, 88,210,235,144,199,129, 97,216,176, 97,133,153,
-225,103,213,169,147, 56, 98,196, 8,215,153, 51,103, 98,231,206,157,184,121,243,230, 27,102,191,125,251,246,184,118,237,218, 18,
-252,139, 18,235,178,176,252,199, 40, 63,143, 86, 73,118,237,218,251, 7,138,180,105, 42,141,101,203,150, 9, 11, 34, 89, 93, 63,
-255,252,115,168, 84, 42,219, 82, 86,235,130,130, 92, 27,165,153,172, 85,171, 86,237, 39,132,184, 3,104, 99, 52, 50,119,127,252,
-105, 87,199,178,190,111,208,160, 65,111,104, 18,138,230,208, 52,149, 39,224,145, 7, 63,236,216,249,107,177,245,243, 27,191,123,
-131,194,195,205, 27, 86,169, 0,116, 45,105,182,240,231, 48, 35,133,154, 38, 38, 78,154, 88,104,178, 54,111, 88,117, 33,160,169,
-199, 71,243, 63,253,166, 84,115,246,205,162, 9, 82,154,166, 90,149,104,163,245,134,230, 91,128,213,252,147,142,195,134, 13,107,
- 16, 24, 24, 72, 23, 53, 89, 90,173,182, 48,113,167,169,177,120,124,124, 60,218,183,111, 79, 55,104,208,160,222,189,123,247, 58,
-226,207,225,156,222,215,125, 55,190,126,253,122,163,139,139,203,197,133, 11, 23,142, 72, 75, 75,235,149,153,153,101,127,114,215,
- 55,232, 49,104, 18,213,190,231, 80,133,150,112, 69,113,137,201, 62, 87, 78,239,179, 59,115,112, 11,116, 90,237, 4, 0,225,248,
- 51,189, 67, 73, 77,165, 41,141,131,143,143,143,162,168, 81,241,240,240, 80,187,185,185,105, 2, 2, 2, 10,231,151,209,155,239,
-141,125,183, 84,179,160,253,151,162,162,227,105, 50,109, 37,211, 70, 72, 36, 18,152,204,151, 37,229, 44,218,219,178,212, 7,101,
-197,189, 14, 11, 53, 11,210, 59, 20,243,105,123,247,238,237,178,119,239,222,166, 0, 30, 32,127,172, 67, 61,144, 95,149, 88,164,
-209,252,226,130,137,189,223, 89,205,255,170,230,251, 76,123,252,217, 54, 11,200,111,171,117,181, 76,163, 85, 17,166,134,239, 0,
-232, 25, 51,102,100,170, 84, 42,219, 17, 35, 70,148,187, 77, 82, 82,210,206, 61,123,246, 20, 51, 89,253,251,247, 31,115,228,200,
-145,139, 41, 41, 41,149,218, 43, 91, 43,241,178,171, 39,230,216,182,239,189,242,115, 0,171,203, 8,228, 49, 1, 77, 93, 63,218,
-188, 97,213,111, 37,204,214, 47, 0,250,151,229, 74,187,125,208, 15,251,118,109, 54,181,237, 18, 63, 14,138, 63, 51, 36,100,105,
-169,189, 21,109,100,194,165, 5,229,152,201,182,209,250,123,224,243,249, 29,230,206,157,203, 87, 40, 20,111,152,172,146, 70, 43,
- 39, 39, 7, 15, 31, 62,196,232,209,163,133,161,161,161, 29,116, 58,221,229,127,195, 49, 72, 74, 74,122, 86,144,140,116,186, 41,
-133,131, 80, 36,230, 15,253,228,115,247,194, 94,135, 7,183, 64,163, 86, 1, 0,215,156,244, 14, 92, 46,151, 31, 26, 26,234,105,
-138, 90,233,116, 58,161,105,126, 80, 80,144,167, 41,183,150, 90,173, 54,187,215,225, 95,165,249,232,209, 35,119, 83,239, 72, 83,
-239, 66, 46,151,203, 15, 14, 14,118, 55,105,106, 52, 26,179,122, 29, 10, 4, 2,126,104,104,168,187,209,104,124,107,189, 14,139,
- 26, 99,228,143,179, 88,108,172,197,130,182,101, 20, 69, 81,132,173, 54,100, 97,121,239, 41,217, 83,178,252, 65,165, 43,194,212,
-240,221,130, 77,184,213,171, 87,239,246,241,199, 31, 23, 51, 89, 3, 7, 14, 52, 30, 61,122,244,138,171,171,107, 50, 77,211,207,
- 44, 45, 71, 97, 27, 45,188,241, 6, 9,154,166, 31,182,105,230, 7,154,166, 31,206,255,244, 83,205, 50,252, 84,204,108, 29,251,
-237, 80,247,184,204,167,165, 91, 51, 0,246, 78,213, 48,108,204, 20, 12, 27, 51,197, 22, 64,107,160,236,222,138,229,149,131,229,
-175,129,162, 40,129,155,155,219, 99,181, 90, 13,138,162,160,209,104, 10, 13, 86,110,110, 46,178,179,179, 11,255,215,233,116, 72,
- 77, 77,133,135,135, 7, 40,138,250, 87,183,163,211,233,116,134,185, 75,214,236,225,112,249, 6,134,209, 81, 58,157,238, 19, 75,
-238,243,185,115,231,210, 40,165,237,213,212,169, 83, 75,157,255,174, 52,191,250,234,171, 82,123, 9, 78,157, 58,181,220,222,131,
-101,241,197, 23, 95,188,181, 94,135,230, 63,190, 88, 88, 88,254,101,148,218,117,175, 82, 70,139,166,233,135,165,244, 46,164, 0,
- 16,154,166, 31,150,146,229,192, 16, 19, 19,179,196,198,198,102,130, 66,161, 56,219,191,127,255, 25, 3, 7, 14, 52, 2,249, 13,
-228, 43,187, 71,153,217,138, 69, 29,250,124, 55, 51, 43, 79,179,169,228,178,146,145, 39,147,217,218,242,253,170,173,191, 29, 57,
- 48, 48, 41, 33,110,107, 89,251, 86,150,161, 42,171,183, 98,118,142,106, 73,135, 62,223,125,158,153,163, 98,219,104,253, 77, 24,
-141,198,243, 98,177,152, 50, 13,166, 92, 52,122,149,147,147, 3,165, 82,137,130, 33,105, 0, 0,121,121,121,176,182,182,134,209,
-104, 36,255,178, 67,161, 1,240,101, 65,180, 10, 0,190,140,188,178,177,232,181,253,168,232,178,114,162, 89,137,230, 12, 16, 93,
-218,118,229, 45,251, 11, 52,147,203, 25, 32,186, 60,146, 45,212, 75, 6, 0, 62,143,147, 82,214,224,209,124, 30, 39,165,156,118,
-251, 22,190, 55, 80, 4,192, 18,246,206,102, 97,121,127,223,255,223,213, 23,119, 97, 53, 89, 77, 86,243,111,209, 20, 22, 76,230,
- 46, 99,143, 39,171,201,106,178,154,255, 52,205,210, 24,255,158, 24, 45, 82,202, 4, 66, 8,254, 77, 99,192,177,176,252,151,209,
- 84,114, 25, 11, 11, 11, 11, 75,213,121, 99, 48,233,162, 11,202,114,165,150,244, 38,168,140,179,189,200,106,178,154,172, 38,171,
-201,106,178,154,172,230,127, 78,179, 34,237,162,219,143, 7,176,227, 61, 49, 91,111,152, 44, 66,254,250,214, 42,108, 88,149,213,
-100, 53, 89, 77, 86,147,213,100, 53, 89,205,202,194, 86, 29,178,176,176,176,176,176,176,176,252,199,177, 44, 97, 41, 75, 41,120,
-244,155, 15, 6, 95, 21, 28,206, 85,136, 61,182,248,223,182,139, 3, 7, 14,228, 88,178,126,100,164, 13, 29, 2,215,181, 86, 82,
-126,159, 60,133,126, 45, 19,178,104, 83, 69, 23,162, 67,205,198, 35, 37, 34,201,103, 90,173,214, 75, 38,151,167,100,164,167,110,
-203,136,121,180,165,200, 58, 86,119,239,222,117, 13, 12, 12, 76, 0,144, 91,228, 77,129,133,133,229,109, 98,227, 87, 29, 20,245,
- 9, 64,254,236,118,201,144,167,200, 14,223, 85,108, 61,107,223, 49,160, 41,255, 34,115, 84, 32,248, 17, 89, 97,177, 21,252,224,
-216, 68, 68, 68,120,214,174, 93, 59, 26, 64, 86,201,111, 47,101, 25,123,159,179,188,207,180, 71,241,132,165,133,247, 66,213,141,
- 86,157,254, 94, 48,208,163, 64, 48, 28, 20, 66, 17,121,100, 64,165,116,106,125, 84, 13, 12,183, 57,128,198, 0,105, 44, 21,139,
- 26,169,180,186, 20,134,144,145,120,117,232,129,197,122, 94, 3, 39,161,236,225, 44,150, 32,242,200, 15, 22,233, 49,228,235,251,
-215,142, 10,109, 36, 20,106, 55,233, 63, 27,197, 51, 56, 87, 22, 1,128,182, 52, 77,251, 75, 36, 18, 87,165, 82,153,202, 48, 76,
- 44,242,235,167, 51, 43,169, 73, 3, 24, 43,147, 74,123,120,202, 5,141, 99,210,178,227,115,245,198,235,200, 79,232,154,249,182,
-174,168,124,147,229,178,227,243,161,129,163, 87, 77,235, 2,155, 14,223,205, 86, 2,229, 25, 45,202,221,187,213,177, 33, 31, 15,
-234, 48,121,252,104, 89, 53, 71, 25, 18,211, 20,246, 63,236,220,187,102,239,222,125,189, 63, 29,210,181, 7, 0,124,243,205, 55,
- 31, 86,175, 94,189, 6,135,195,137, 92,176, 96,193, 47,139, 22, 45, 34, 84,217, 35,149,187, 22, 92,195,166, 7,190, 20, 64, 0,
-128,154, 0, 94, 3,120,130,226, 89,198, 43,195,123,161, 89,173, 90, 53, 55,134, 97, 62,117,118,118,238,149,156,156,124,138,166,
-233,159,226,227,227, 19,222,229, 83,135, 16,178,157,162,168,241,132,144, 29, 22,124, 78,176,228, 59, 68, 34, 81,178, 90,173,118,
- 42,248, 59, 69,173, 86, 59,255, 85,251,243,119,126,215,223,244,254, 61,238,252,141, 39, 61,138,206,234,214,198,191,148, 39, 10,
-229,127,254,198,211,118,197,215, 11, 48,150,241, 12,164, 8, 33, 88,178,100, 9,181,116,233,210, 49,181,106,213,170, 67,211,244,
-243,133, 11, 23, 22, 75,125, 83,114, 89,145,251,156, 53, 91, 44,239, 43,150, 13, 42, 93, 33,126, 3,165, 80,147,129, 0, 53,186,
-125,179, 70,109, 38,140,236, 67, 17,142, 8, 67,199,205, 49, 88,172,229, 57, 90, 8,142,106, 89,125,127,239, 25,131,250,116,161,
-155, 6,212,128,171,163, 53, 64,243,176,253,116,148,253,166, 85, 11,182, 2, 8,172, 68, 41, 23,189,186,189,223, 41, 49,203, 8,
-138, 2, 40, 10,160, 41, 32, 79,205,160,219,135,163, 22, 1,248,193,194,167, 18,109, 35,161, 48, 99,191, 26, 0, 56,111,225,164,
-212,112,116,116, 28, 51,125,250,116,105, 64, 64,128,141, 72, 36, 18,168,213,106,231,136,136, 8,199, 5, 11, 22, 4,168, 84,170,
- 19, 0,238, 91,168,233, 81,219,221,237,208,166, 25, 99,155, 55,168,233, 9,158, 54, 15,140, 70, 81,253, 69,196,203,150, 19,183,
- 30, 30,247, 52, 67,253, 49, 42, 49,100, 66, 90, 90, 26, 5, 0, 14, 14, 14,164,184,201,106, 49,122,253,204,110,152,177,238, 60,
-148,106,237,175,229,105,216,213,104, 56,226,163,143,250,117, 88,254,245, 84, 89,124,186, 14,161,145, 42,216,201,248, 88,244,229,
- 36,129, 70,163,111,185,245,151,189,227, 55,175,156,243,163,209,104,236, 4,160,169,209,104, 12, 2,240,203,146, 37, 75,202,122,
-248, 46, 5,240, 85,193, 5,189,143,195,225, 92,232,216,177,163,215,167,159,126, 74, 53,105,210, 4,193,193,193, 53,247,239,223,
-223,229,212,169, 83,145, 70,163,241, 17,128,231, 40, 24,246,196, 12,120, 0,188, 57, 28, 78,253,127,178,166,171,171,171, 88,171,
-213,142,114,119,119, 31,223,170, 85,171,250,125,250,244,161,188,189,189,241,236,217,179, 38,103,206,156, 89,116,253,250,245, 71,
-113,113,113, 59, 4, 2,193,158,196,196, 68,213,223,254, 59, 78, 81,227, 1,184, 21,248,228, 37,102,124, 38, 32, 63,151, 84,162,
-185,223,161, 86,171,157, 76,141, 77, 41,138,114,250, 43,247,199,194,239, 10,163, 40,202,174, 96, 93,148,247, 73,211, 52, 12, 6,
-131,194,104, 52,214,170, 64,211,187,224, 69,202,108,175, 11,160,188, 68,208, 98, 0,232,214,218, 63, 3, 20,158, 22, 70,180,222,
-124,201,124, 90,104,192, 8,252,207,223,124,106, 87, 44, 10, 86,242, 45,118,201, 18,106,209,162, 69, 88,188,120,113, 31, 0,109,
- 25,134,185,238,235,235,187,177,152, 36,195, 20, 46, 91,180,104,209,247,229,220,231, 44, 44,239, 11, 29, 96,201,160,210,101,190,
-255,212, 26,208, 14, 70,140,246,180,119, 26, 56,237,211,193,226, 0,223,218, 80, 67,134,168, 52, 35, 78,159, 60, 3, 0, 7, 45,
-139, 58, 13,110,202,229,170,247,172, 90,252,165, 79,219,230, 1,120, 28,175, 71, 80,188, 17,202, 72, 61, 56,180, 30, 70,134, 0,
- 4,234,202,238,117, 92,166, 1, 55,158,107, 65, 83, 0,135, 6,104,154, 2,135,174,164, 24,163,125,241,205,174,144,128,180,100,
- 6, 96,180, 47,170,120, 66,252,235,214,173, 59, 98,233,210,165, 54, 73, 73, 73,210,224,224, 96, 8,133, 66,216,218,218,114, 92,
- 93, 93,221,214,173, 91,167,154, 54,109, 90, 47,157, 78, 23, 5, 32,205, 76, 77,223,158, 77,235,223,218,177,234, 27,107,253,221,
- 51,200, 58,240, 63,112,104, 2,190, 84, 6, 47,177, 24,103, 62,170,109, 55,240,100,228,209,123,201, 10, 95, 0,241, 21,137,133,
-135,135,115, 52, 26,205,199, 86, 86, 86, 45,120, 60,158,179,200,182, 6,147,192,109,154,158, 74,213,124,157,226,164,108, 55,179,
-139,115,143,181,159,119,196,140,117,231,177, 97,255,157,221,141,145,180,176,188,188,217, 18,137,108,194,180,207, 62,149,197,165,
-233,176,236,104, 26,118, 93,203,193,168,182,114,204,248,192, 26,195,134, 14,145, 30,254,223,145, 9, 0,126, 44,178,201, 51, 95,
- 95, 95, 42, 60, 60,188,180,135,175, 45,128, 57, 90,173,150,230,243,249,148, 72, 36, 26,177,124,249,114,221,208,161, 67,227, 76,
- 43,180,109,219, 22,109,219,182,165,114,115,115,107, 94,190,124,185,230,222,189,123, 13,183,111,223, 14, 3,112,172,236,136,133,
- 56, 70,173, 86, 85, 23,137,197,202, 31,182,110, 93,219,174, 93, 59, 70, 40,252, 51,253, 84,101, 52, 1,192,218,218,250, 71, 39,
- 39, 39,106,222,188,121, 9,111, 75,179, 70,141, 26,231,155, 55,111,222,177, 91,183,110,220,214,173, 91,195,205,205,173,112,153,
-131,131, 3,218,182,109, 75,197,198,198, 54,184,126,253,250,214,243,231,207,111,124,240,224,193,229,168,168,168,110,127,115, 68,
-107, 71,129,153, 72,180,112,253,247, 30,138,162,100,219,183,111,119, 50,141,201,168,215,235, 97, 52, 26, 11, 63, 77, 19,195, 48,
- 48, 26,141, 88,190,124,185, 81,161, 80,152,115,140, 20, 69,222,154, 77, 19, 83,218,167, 64, 32,112, 48, 37,236,173,224,201,254,
-212, 85,152,229, 39,149, 74, 61, 1,244,132, 99,157, 57,197, 87,200,127,127, 86, 40, 20,209,137, 26,155,167, 0,218,149,163,102,
-179,116,233,210, 81,139, 23, 47,238, 87, 36, 74, 91,127,208,160, 65, 37,135,189,170, 95,240,169,160, 40,234, 10, 77,211, 39, 0,
-236,194, 91,140,186,179,252,187, 32,132, 52, 3,224, 88,100,150, 22,249,181, 66, 40,248,157,164, 0,216,151,152, 95,116, 61,211,
-103,106,193,124,199,130,237, 72, 17,221, 84,138,162,238, 87,178,136, 87, 81, 70, 59, 45, 46, 0,156, 60,121,146,244,238,221,155,
- 50,125,150,110,138, 6,158, 30, 59,180,111,143, 94,157, 91,129, 22,217,226, 69, 10,112, 59,134,128, 75,235, 65,131,224,238,205,
-203, 4, 92,102, 79,137,173,202,142,158,212, 24,240, 69,253, 0,223,239,126, 90, 53,157, 19,150,194,197,174,235, 74,232,212,121,
- 72, 77,138, 65, 74, 66, 52, 18,227, 94, 35, 62,230,245, 35,128, 90,100,182,230, 27, 39, 6, 48, 50, 5,239,128, 12, 74,139,232,
-153,175,169, 83,132,215,244, 14, 8,200, 20, 24, 1,157, 34,220,140,175, 47, 75,179, 94,157, 58,117,134,126,253,245,215,118, 79,
-158, 60, 17, 43,149, 74,205,153, 51,103,158, 69, 69, 69, 89,185,186,186,102, 76,154, 52,169,142,155,155,155, 85,255,254,253, 5,
- 7, 14, 28,248, 16,197,187,181,150,165, 25,208,183, 69,163,219, 59, 55,174,151,166, 31,222, 4,109,196, 67,156, 78, 84,224,102,
-178,146,212,180, 22, 82, 83, 26, 56, 66, 38,228,226,155,214,110,178,158,191, 69,124,167,103,152, 97,229,105,222,186,117,203, 85,
- 34,145,172, 27, 62,124,184,235,212,169, 83,133, 70,174, 13,247,200,237,116,235, 57, 91,111,187, 41, 53, 58,206,208,142, 53, 48,
-115,120,125,204,220,112,201,100,178,198,123,121,101, 49, 33, 33,101,107,234,117, 58, 47,119, 39, 43,132, 70,169,176,235, 90, 14,
-254,248,218, 13,157,151, 39,160,127, 99, 46,124, 61,100, 48,232,244,222,131, 6, 13,218, 83,240,214,126, 31,192,135,131, 6, 13,
-242,225,112, 56,151, 0,252, 94,209, 57, 18,137, 74, 31, 61,197,214,214, 22,237,219,183,135,175,175, 47,183, 93,187,118,245, 75,
- 24,152, 98,154, 58,157,214,149, 97, 8,228,114,185,216,222,222,222, 86, 46,151,167,151,246, 67,101,137, 38, 0,216,217,217, 13,
-104,223,190, 61,119,255,254,253,105,145,145,145,119,135, 14, 29,250,218,202,202,170, 88,244, 87, 42,149,162, 78,157, 58, 88,176,
- 96, 1,183, 71,143, 30, 21,106, 58, 59, 59,119,221,187,119, 47, 40,138, 42,252,209,126, 35, 88,236,233, 9, 23, 23, 23,244,236,
-217,147, 59, 96,192,128,174, 81, 81, 81,149,186,143, 44,224, 98, 41, 17,173, 37, 37,206, 83,153,213,111,165,173,111,198,121, 79,
- 49, 69,151, 10,244, 80,133,123,179,220,234, 78,145, 72, 84, 24,133, 42,229,187,222,208,164,105, 26,243,231,207, 7, 69, 81,224,
-241,120,224,243,249,165,126,118,232,208,193,210,114,198, 82, 20, 69,243,249,252, 57, 92, 46,247, 83,141, 70,227, 46, 18,137, 18,
-140, 70,227,110,141, 70,179, 28,128,158, 16, 98, 83,134,201, 42, 85, 83, 42,149,122,190,120,241,162,110, 89, 5,209,104, 52,168,
- 95,191, 62,160, 65, 88,121,154, 17, 17, 17,158,181,106,213,242, 6, 96, 26,162,237, 26, 33,164, 93,145,255,139,114,141, 16,242,
- 65,193,223,207, 95,189,122,229, 89,187,118,237,204,191,235,250,100, 53,255,121,154, 21,120, 17, 71,138,162, 78, 22,185, 87,123,
-155,254,159, 59,119,238, 87, 43, 86,172,120, 66, 81,212,201,162,243,139,174, 87,244,179,224,121,115,146, 16,210,123,222,188,121,
- 1, 43, 87,174,252,214,180,238, 95, 97, 18, 45,137,104, 89,165,170,165,184, 30, 99, 5, 46,199, 8, 46, 77,129,203, 1, 64, 40,
- 68, 71, 69, 32, 55, 39,235, 6, 34,143, 70,154, 23,201, 26,216,186, 97,195,122,171,246,109,152, 77,255,124, 93,137, 44,133, 26,
-225, 15,174,224,254,149,223,147,140, 6,227,239,160, 72, 16, 64, 7,227, 53,243, 12, 56, 82,185, 49, 46, 40,194,205, 55, 90, 5,
-230,170,152,217,122,103, 52,240,241,241, 25,178, 96,193, 2,135,144,144, 16, 81,118,118,118,238,190,125,251, 18, 52, 26, 77, 20,
-128,115,209,209,209, 62,223,127,255,189, 96,213,170, 85,245,234,213,171,231,122,232,208, 33,109, 41,195, 25,189,161,249,229,232,
- 97,183, 63,157,246,185, 40,236,208, 22, 8,194,130, 49,255, 97,154,241,143, 68,229,215, 0, 54, 32, 54,175,117,170,218,112, 97,
-125,251,234,116, 13, 57, 31,181,109, 4, 29,194, 51,212,229, 70,178, 36, 18,201,186,189,123,247,122, 54,107,214,140, 6,128,235,
-207, 13,194, 57, 91,111,187,157, 91,209,154,106,237,111,143,148, 44, 13,166,111, 9,197,153,219, 41,103, 77, 38,171,162, 66,202,
-229,242,212,184,148, 28,103,123,153, 8, 35,219,200,208,121,121, 2, 6, 54, 21, 66,200,167,240, 44, 50, 9,181,107,213,160, 66,
-111, 28,107, 90, 96,178,154, 37, 38, 38, 2, 64, 83, 0,145,177,177,177,174,129,129,129,217, 69,228, 50, 1,124, 39, 16, 8,230,
- 83, 20, 69,154, 53,107, 22, 90,175, 94,189, 60, 91, 91, 91,168, 84, 42,104, 52, 26,240,249,124,168, 84, 42, 68, 71, 71,227,238,
-221,187,176,181,181,181,232, 68,229,229,229, 65, 46,151,131, 97,152, 42,107, 26,141, 70,106,219,182,109,210, 39, 79,158, 72,143,
- 28, 57,226, 60, 99,198,140,116, 63, 63,191,160, 33, 67,134,188,116,114,114,210, 60,124,248, 16,183,110,221, 66,102,102, 38, 90,
-180,104, 97,150,166, 86,171, 5,151,203,133, 74,165,130, 80, 40, 4,151,203,133,193, 96, 0,195, 48,133,230, 43, 47, 47, 15, 25,
- 25, 25,224,243,249,208,106,181,239,226, 13,244,141, 8, 85,121,213,111,149,137,104, 21, 53,106,102,154,172,138, 34, 81,101, 86,
-119,102,101,101,137,109,108,108,230, 0, 72,172,232,187, 40,138, 2,135,195, 1,159,207, 7, 69, 81,104,215,174, 29,198,142, 29,
-139,198,141, 27, 35, 34, 34, 2, 7, 14, 28,192,253,251,247,193,227,241, 10,215, 55,187,126,162, 67, 7,142, 72, 36,186,213,183,
-111,223,128,175,191,254, 90, 84,163, 70, 13,132,133,133,121,172, 92,185,114,206,197,139, 23,251, 41, 20,138,166,166,167, 93,249,
- 81,250,130, 42,193,252,234,194,158, 26,141, 6, 97, 97, 97,150,108,243, 6,181,107,215,142,166,105,250, 37,195, 48,215, 1,212,
- 39,132,180,163, 40,234, 12,242,219, 37, 22, 69, 65, 8,249,128,162,168, 28, 0,143,104,154,126,206, 48, 76, 52, 27,183, 97, 49,
-227,185,210,187,228,255, 20, 69,157, 92,177, 98, 69,239,210,204, 85, 41,247,102,177,249, 43, 87,174,252,182,200,255, 85,137,168,
-182, 71,241,198,240, 29, 10,162, 92,127, 26,173,147, 39, 79,150,239, 64, 24,244, 63,121,116,255,157,206, 58,120, 6, 52,105, 91,
- 36, 58, 68, 16,124,247, 22, 0,178,219,172,162,184,246, 22,211, 28,238,238,109,223, 78,165,183, 95, 81, 34, 54, 33, 5,183, 78,
-239, 70,106, 98,212, 46,128,204, 64,228,145,156, 42,159,137, 26,253,235, 57,217, 59,216,168,117, 4, 12, 1,240,134,217,122, 39,
- 52,246,246,246, 30,112,251,246,109, 7,181, 90, 45,186,113,227,134,114,239,222,189, 73, 58,157,238, 10,128,155, 5,235,132,164,
-166,166, 14, 42, 48, 38, 28, 46,151, 43,208,233,116,229,181, 93,104,252,229,167,163,110,124,183,109,167,232,229,227, 80,124,127,
-228, 52,178,148, 74,227,149, 20,213,135, 0, 76,142,254, 82, 72,154, 42,158,128, 84,231,209, 20, 92,165, 60,151,240, 12,181, 8,
- 40,189, 74, 86,163,209, 12, 29, 62,124,184,171,201,100, 1, 64, 90,174,158,171,212,232, 57,173,253,237,209,164,227, 32, 4, 95,
- 62,140, 67,215,226, 81,203, 81,114,205, 75,154,101,214, 17, 77, 77, 73,220,182,126,211,246,245,223, 45,249, 82, 48,179,167, 53,
- 6, 54,229, 65,196,167, 96, 37,225, 97,249,198, 31,245, 33,119,175, 61,116,117,117, 61, 9,224,195,196,196, 68,184,186,186,230,
- 1,120,206,225,112, 34,141, 70, 99,105,141,186, 23, 2,112,222,179,103, 15,173,215,235,243, 34, 34, 34,224,226,226, 2,103,103,
-103, 88, 91, 91, 35, 60, 60, 28,127,252,241, 7,158, 61,123, 6,134, 97,208,176, 97, 67,139, 78, 86,122,122, 58, 30, 62,124,136,
-158, 61,123,205, 72, 77, 77,177,178,181,179, 87,220,184,126,109, 77,101, 52, 25,134,161, 0, 32, 32, 32, 0, 1, 1, 1,162,248,
-248,120,247,147, 39, 79, 58, 45, 91,182, 44,198,211,211,115,159, 74,165, 42, 22, 57, 48,215,104,153,204,133,201, 4,138, 68, 34,
-240,249,124,228,228,228, 32, 57, 57, 25,185,185,249,157, 54,109,108,108,222,137,209, 42, 35, 66,245,214,214,255,139,205,225, 27,
-213,157, 54, 54, 54,195, 1,204, 49,115, 95, 96, 48, 24,192,231,243, 17, 24, 24,136, 77,155, 54,225,254,253,251,248,253,247,223,
-225,225,225,129,209,163, 71,131,166,105, 60,121,242,196,210, 34, 50,183,111,223,158,243,225,135, 31, 6,236,217,179, 71, 20, 29,
- 29,141,103,207,158,193,198,198, 6,155, 54,109, 18,142, 31, 63,190,246,229,203,151, 23, 34,191,243, 75,249, 20,233, 93,168, 16,
-187, 14,174, 95,191,254, 27,171,184,184,184, 88,159, 59,119,206,169,208,128,149,236,145,248, 38, 89, 11, 23, 46, 92,239,235,235,
-187,161,160,186,176, 45, 0, 41, 33,164,195,145, 35, 71, 40, 0, 24, 56,112, 32,161, 40,202,244,131,244,232,240,225,195, 29,195,
-195,195,201,226,197,139,217, 54, 90, 44,101,121,145,241,166,123,178, 44, 3,101,137, 81, 43, 26,241, 50, 49,111,222,188,128, 21,
- 43, 86,220,171,162,201, 42,250,198, 68, 76,102,171,240,199,180,204, 42,195,194,216, 23,237,234,226,100,111, 55,119,116,107, 48,
- 12, 96, 48, 2, 6, 35,129, 66,169, 66,216,227,251, 74,136,168, 35,102, 21, 71, 40, 88,181,236,235,207,107,134,198,209, 72,200,
-212,225,234,177,237, 36, 53, 49,106, 0, 34, 15,127,242,118, 76,214,224,250, 46,206, 78, 87,247,111,255,134,190,255, 90, 11, 35,
-147,239,179, 24,134, 20,254,253, 14,112,113,116,116, 28,118,231,206, 29, 71,161, 80, 40,122,241,226, 5,115,248,240,225, 76,157,
- 78,119,177,136,201, 2,128,214, 77,155, 54, 53,200,100, 50, 40, 20, 10,157, 78,167, 83,151, 99,178,220, 59, 52,110,112,237,187,
-109, 59, 69,106,173, 22,217, 42, 13, 56,246, 78, 37, 77, 22, 0,180,234, 88,183, 90, 53, 74, 36, 7, 1, 16,149,163, 75, 40,203,
-100, 1,128, 80, 40,236, 50,117,234,212, 98,227,226, 57,200,121, 6,137,144,103,188,249, 52,141, 9,190,124, 24,215,159,164, 49,
- 34, 62,199,232, 72, 94,215, 52,247, 0,100,197, 61,221,246,251,241,147, 23,190, 88,176, 42, 79,169,200, 69, 45, 55, 49,242,114,
-179,177,124,197,119,250,219,183,175, 95,153, 51, 99, 98,203,195,135, 15,175, 68,126, 99,112, 0,120,126,248,240,225, 81, 11, 22,
- 44,248, 5,127,166,121, 40, 73,194,176, 97,195,226,252,253,253,179,125,125,125,179,211,211,211,241,244,233, 83,100,102,102,226,
-251,239,191, 71, 88, 88, 24, 76, 17, 65,179,218,170,188,105,144,144,153,153, 33, 35,132, 32, 51, 35, 93,250,245,215, 95, 91, 87,
- 70,211,104, 52, 22,187,183,170, 85,171,134, 73,147, 38,241,149, 74,165, 77, 76, 76,140, 85,209,101,230,106,106,181,218,194,140,
-195,132, 16,104,181, 90,100,103,103, 67,171,213,226,229,203,151,133, 38,171,224,251,223, 89, 68,203,244,183, 72, 36, 74, 54, 93,
-203,166, 42, 56,145, 72,148, 82,214,250, 85,161,200,119,145,130,191, 45, 53,135, 21,238,143,153,231, 29,124, 62, 31, 99,199,142,
-197,189,123,247, 16, 17, 17, 1, 14,135, 3,133, 66, 1,165, 82,137,174, 93,187, 66, 32, 16, 88, 26,209, 34,124, 62,127,248, 87,
- 95,125, 37,138,140,140, 68, 90, 90,154,169, 49, 61,140, 70, 35,102,204,152, 33, 22, 10,133,195, 45, 13,221, 39, 38, 38,118,127,
-249,242,165,119,201, 41, 41, 41, 41,187,104,155,194,202,114,228,200, 17,106,224,192,129,100,224,192,129,196,100,184, 88, 88, 74,
-163, 12, 47,178,163,172,136,214,219,136,138,153, 34, 91, 40,232, 32, 82, 9, 76, 38,171,125, 17,227, 69,153, 34, 92,230, 85, 29,
-214, 26,220,200,217,222,238,242,158, 45, 75,101, 39, 31, 83,136,139,141, 66,106, 98, 52,154,182,236,128,176,199,161, 96,244,198,
-163,120,121,164,226,150,156, 53, 6,214,245,245,245,251,172,125,203,122, 88,117, 50, 15, 47,130,207, 33, 43, 53,113, 51,162, 14,
- 31,125, 43,103,200,115, 96, 3,103, 39,187,203,191,108, 89,106,115,230, 41,141,216,216, 40, 28,251,101, 61,209,235, 52, 89, 40,
-222,147,203,226,183,102, 49,163, 21,228,101, 37, 67,155,107,132,136, 86,138, 44,172,164, 72, 2,112,125,253,250,245,157, 91,180,
-104, 33, 24, 54,108, 88, 82,102,102,230, 49, 0,119,138,172,227, 95,183,110,221,158,155, 54,109,114,142,141,141,197,197,139, 23,
-147,144,223,245,191, 44,226,174,133, 62,222,250,199, 47, 63,126, 41,174,233,131,239,191,250,194,112,228,254,211,190, 0,206, 20,
- 89,199,183, 75,253,186, 39,151,205,154, 76, 51, 33,103,241, 48, 58, 25,175,179, 53,127,148, 37,152,150,150, 70, 41,149, 74, 79,
- 27, 27,155,162, 23, 36, 92,165, 10,205,236,193,117, 19,186,206,185,225,166,214, 25, 33,228,209,100,122, 63,207,132,123,199,142,
-216,167,169,211, 40, 83,111,196,138, 24, 55,164, 75,191, 45,123,127, 27,121,242,228,169,207,116, 26,117, 61, 31, 31,111, 18,116,
-251,242,195, 57, 51, 38,246,168,228, 25,151,221,187,119,143,230,112, 56,197, 12,122,209, 8,145,165,145, 34, 75, 48, 87,179,164,
-209, 50, 97, 48, 24,168,202,106,106, 52,154, 82,135,118, 40,173,173, 22,195, 48,127,201,254, 91, 18,161, 42, 90,101,104,106, 79,
-167, 86,171,157, 10,218,108, 57,191,205,136, 86, 85,122, 34,150, 87,125,105, 73,249,104,154, 6,195, 48,224,243,249,104,216,176,
- 33, 78,158, 60, 9, 59, 59, 59, 88, 89, 89,193,202,202, 10, 98,177, 24,246,246,246,133, 70,139,166,205,238,165, 67, 52, 26,141,
-135,135,135, 7, 94,190,124, 9,145, 72, 84, 56, 9,133, 66, 4, 4, 4, 64,161, 80, 84,195,187,140,221,179,176,252,181,207,149,
-147, 69,205, 18, 69, 81, 39,231,206,157,251, 85,101,245,230,206,157,251, 85,105, 17,174, 42, 26,174, 98,209, 45,110, 81, 7, 89,
-170,147, 44, 48, 89,187, 54, 47,177,250,237, 1, 16, 23, 23,137, 11,135, 54,230,234,117,218, 76,134,209,123,190,126, 22, 10,208,
-216,109, 86, 17,104,210,188, 95,207,142,212,133, 39, 90,228,100,165,226,121,208,185, 40,168, 4,243,222,154,201,114,118,184,188,
-103,203, 18,155, 19,143, 41,196,198, 70,225,204,254,239,115,244, 58, 93, 23, 68, 30, 9,170,138,244,112, 62,191, 31,191,122, 76,
-239, 79,219, 38,192, 72, 25, 49, 60, 44,252,131,148, 36,244, 75,188, 81,126,207,176,162,164,166,166, 30, 91,191,126, 61,181,122,
-245,234,246,106,181,250,127, 0,138,134, 40,235,213,170, 85,235,227, 29, 59,118,216,197,198,198,242,110,220,184,161,184,124,249,
- 50, 1,112,162,130,136,203,236,174,159, 76,226, 52,174, 81,109,106, 72, 84,124, 95, 0,103,139, 44, 14,232,221,196,255,230,206,
- 21, 11,229,250,155, 71,144,151, 24,139,121, 55,227,114, 0,152,125,188,245,122, 61,178,179,179,161,207, 75, 55, 52,117, 85,100,
- 47, 30,228,164, 73,206, 84,115,121,140,210,224,107,149,162,185,156,254,154, 35,145, 72, 44, 58,150, 91, 86,124,185, 23,192,222,
- 65,131, 6,237,121,116,251, 84, 83, 87, 87,215, 83,190,190,190, 20, 0,148,209,195,176, 44,150, 2,152,209,170, 85, 43, 42, 48,
- 48,240,238,134, 13, 27,206,151,103, 86, 42, 19,209,170, 8,115, 53, 25,134,161,203, 56,190, 84,101, 53,139, 70,180, 42, 50, 90,
-239, 50,162, 85,154,105, 41,106, 18,139, 26,161,127, 66,175,195,242,204,148, 37,229, 51,181,147,227,243,249, 8, 13, 13, 69,245,
-234,213,161,211,233, 32,151,203, 33,151,203, 33,147,201,144,155,155, 11, 30,143, 7, 11,247,153, 17,137, 68, 49, 79,159, 62,245,
-118,116,116,132,209,104, 44,102,182, 94,188,120, 1,169, 84, 26,111,105, 68,203,213,213,245, 92, 65,175,195, 98,184,184,184, 88,
-191,141,227, 90, 52,146, 53,112,224, 64,182,138,144,165,220,104, 86, 25, 81,173,212, 18,145, 40,109,145,255, 83,145,159,195,173,
-119,193,223, 40,229,111,109, 41,243,210, 87,172, 88,113,185, 72,251,174,212, 42,238,130, 41,197, 67,177, 30, 46,220,138, 34, 89,
- 78,118,182,151,127,250,126,177,213,161, 96, 32, 62, 54, 18, 87,143,110,202, 54, 24,117,157,192,144,196,219, 23,143, 30, 1, 5,
- 37, 94, 31,185,106,222, 35, 2,141, 27,251,121,226,247, 39,122,164,198,189, 0, 33,204, 46,164,236, 85, 86,249,236,212,234,223,
-208,201,206,225,242,174, 77,139,173,127, 11,165, 16, 23, 27,137, 11,135, 54,229, 24,244,202,206,136, 60, 26, 92, 89,217,177,128,
- 45, 71, 42,218, 58,160, 67,227,193,158,181,220,193, 16, 61, 24, 62, 65,255,217, 14,220,231, 33,202,223,175,139,178, 15, 49,121,
-204,103,241,119,204,107, 64,151,151,151,247, 59,128, 32, 20, 79,175,208,160, 78,157, 58,131,183,110,221,234, 24, 23, 23, 39, 10,
- 9, 9, 81,109,223,190, 61,133, 97,152,223, 0,152, 83,149,250, 69, 72, 84,252, 79, 40,158, 47,167,193,151,159, 12,187, 61,108,
-204,167,162,200,139,123, 97, 27, 25,134, 89, 55, 19,140,207, 51,181, 67, 11,162,107,165,226,224,224, 64,210,210,210,162,179,178,
-178,188,165, 82, 41,210,211,211,145,145,145,129,236,236,108,104,114, 50, 12,246,198, 44, 5,101,200, 0,143,199, 67, 74,172, 30,
- 70,163, 49,201,220,104, 22, 0,219,165, 75,151,142, 99, 24,198,148, 17,177, 88,239,194, 34,235,153,174, 7,239, 65,131, 6,237,
- 41,210,235, 48,187,168, 22,242,211, 59, 80, 5,233, 29, 90,156, 61,123, 54,188, 71,143, 30,113,165,153, 21,161, 80,104,113, 67,
-233,178,122, 49, 86, 70,179,172,136, 86,201,249,150,104,154,170, 47, 77,141,224, 75,206, 55,193,225,112,192, 48, 12,204,232, 84,
-241,151,154,150,162,189, 3, 43, 99,114, 74,156,155,114, 19,135, 86,178, 39,226, 91,141,104,153,206, 5,159,207,199,241,227,199,
- 49,102,204, 24, 24,141, 70, 72, 36, 18,200,100, 50, 72,165, 82, 28, 61,122, 20,166,244, 15,150,248, 87,189, 94,255,235,138, 21,
- 43,190,218,182,109,155,152, 16, 2,129, 64, 80,104,180, 22, 47, 94,172,210,233,116,191,154,101,180, 76, 25,223, 25,242, 84, 42,
- 53,148,219,235,176,180,109,202,104,175,101,179,116,233,210, 81, 12,195,244, 67,137, 20, 14, 37,214, 43,150,250,129, 77,239,192,
- 98,198,243,228,254, 63,184,120, 38,131, 69, 21,137,100, 21, 26, 46,186, 60,243,226,104,107,115,249,199,239, 23, 91,237,187, 79,
- 33,242,245,107, 92,249,223,198,124,147,245,234,208, 3, 68, 31, 73, 70,228,145, 54,120,125,164,187,217,111, 79, 20,213,216,205,
-201, 6, 25, 10, 6, 57,105, 49, 0, 65,200,219, 48, 89,142,182,142,151,127,222,180,216,250,240, 3, 26,145,145,145,184,112,104,
- 99,182,193,160,238, 84, 21,147, 53,156,207,239, 87,167,174,123,196,252,113,253, 6, 7,214,118,129,125, 76, 56, 78,140, 30,140,
-111, 14,124, 4,185, 35, 7,205,123,202, 49,118,185,203, 96,215, 0,225, 75,215, 54,232,103,129,116, 81,147,213,216,203,203,107,
-240,157, 59,119, 28,234,215,175, 47,122,246,236,153,122,251,246,237, 41, 42,149,234, 60,128, 80, 11, 52,139,154,172,198,115,199,
-143,190,253,221,143,123, 68, 52, 95,128, 85,191,158,192,180,107,113,198, 83,209, 57,131, 80,188, 90,177, 84, 52, 26,205,197, 77,
-155, 54,105,104,154, 70, 70, 70, 6,210,210,210,144,146,146, 82,248,153,149,149, 5, 14,135,131, 75,151, 46,105,115,114,114,238,
-152, 91,192, 91,183,110,121,197,199,199,251, 38, 38, 38, 54, 45,152,158, 33,191,119,161,172,200,188,166,137,137,137,237, 1,220,
- 55,205,143,139,139,171,113,247,238, 93,215,138,244,229,114, 57,248,124,126,177,136,150, 80, 40,132,179,179, 51, 12, 6, 3, 14,
- 30, 60, 8, 0, 25,229,105,240,249,130, 68,154,166,192, 16, 70, 35, 18,137, 24, 87, 87,215, 82, 13,150, 37,154, 5,196,125,240,
-193, 7,234,224,224,224, 82, 35, 90,149,209, 36,132, 40,187,117,235,134,132,132, 4,136, 68,162,194, 31,107,147,161,162,105, 26,
- 66,161, 16, 73, 73, 73,152, 48, 97, 2, 8, 33,202,191,251,201, 83,180, 77, 83,129, 25,162, 0, 80, 5, 70,232,141,118, 90,230,
-182,129, 50, 85, 13, 18, 66, 96, 50, 92, 37,150, 23,126,151, 57,217,219, 75,180,233, 26,159,149,149,245, 93,126,113,200,246, 18,
-159, 59, 44,248, 81, 40, 52, 90, 97, 97, 97,216,179,103, 15,178,178,178, 32, 16, 8,144,153,153,137,157, 59,119,226,233,211,167,
- 16, 8, 4, 48, 29, 11,115,253, 91, 96, 96,224,119,215,175, 95,127, 58,116,232, 80, 85,104,104, 40, 84, 42, 21, 66, 67, 67,209,
-189,123,119,245,205,155, 55, 35, 84, 42,213, 82,152, 83,117,104,202,248, 94, 48,188,142, 70,163, 65, 72, 72, 72,169, 83, 89,219,
-148, 36, 34, 34,194,211,104, 52,122, 19, 66,218, 18, 66,172, 80,144,194,161,224,255,162,211, 7, 5,203,172, 8, 33,109,141, 70,
- 99,157,136,136, 8, 79,214, 78,176,188,167, 92, 45, 98,182, 72, 17,147,117,181,252,136, 22, 67,111,250,105,227, 18,171, 95,239,
-209,136,141,142, 64,208,233,173,217, 70, 70,223,201,194,225,112,186,160, 72,174, 13,145, 88, 90,143,161,242,187, 51,231,164,197,
- 2,132, 83, 25,163, 85, 76, 19, 12,189,105,231,198,197,214,251,131, 40, 36,196,190,194,205, 99, 91,178, 13, 6, 77,103,188, 62,
- 18, 82, 25,205,225,124,254, 2, 30,135,154,223,173,117, 35,126,155, 70,117, 33, 77,137, 66, 82, 92, 2, 14,134,165,102, 68,100,
-106, 62,189, 73,233, 16,253, 74,243, 83,207,113,118,118,182, 46, 60,244,158,104,111,119,231, 68,206,239, 20, 79,161, 35, 58,178,
- 34,241,102,225,176, 20,197,203,249, 38, 46,114,185,124,104, 80, 80,144,149, 72, 36, 18, 7, 5, 5, 49,219,183,111, 79, 87,169,
- 84,167, 1,220, 54,107,223,223,196,189, 89,221, 90, 87,191,221,242,163, 40, 79,161,132, 66,171,131,208,217,213,248,219,237,199,
- 3, 80,118, 2,204, 98,154, 66,161,112,255,254,253,251,123,182,107,215,206,179, 94,189,122,116, 70, 70, 6,242,242,242, 10, 27,
- 87, 59, 58, 58, 34, 44, 44,140,137,140,140, 76, 16, 10,133, 7,204, 45,103,171, 86,173, 34,105,154,126, 86, 80,141,246, 12, 37,
-122, 23, 22, 89,213, 59, 49, 49,177,153,171,171,235, 85, 0,146, 34,189, 14,139,106,154,210, 59,124, 5,128,166, 40,234,126,104,
-104,104, 94,143, 30, 61, 32, 22,139,161, 80, 40,224,225,225, 1,131,193,128,211,167, 79, 35, 56, 56, 88,193, 48,204,213, 82,204,
-107,177,114,170,213, 42, 15, 0,180, 74,169,108, 56,106,212,168,246, 51,103,206, 44,214, 37,221,201,201, 9,118,118,118, 22,105,
- 2, 64, 70, 70,134,223,217,179,103, 63, 15, 13, 13,253,162,103,207,158,214, 95,125,245,149,208,203,203, 11, 70,163,145,174,172,
-102,102,102,166,117, 72, 72,200,154, 54,109,218, 76,238,209,163, 7,247,219,111,191,133,181,181, 53,140, 70, 35,196, 98, 49,114,
-114,114,176,116,233, 82,220,184,113,195, 64, 8,217,146,157,157, 61,203,194,107, 9, 85,189, 55,203,138, 0,149,149,146,161,140,
-245,255,242,114,150,104,211,133,130, 20, 14,115,202,200, 96, 15,115,175,121,147,209,226,112, 56,136,138,138,194,246,237,219,223,
-200,163,101, 74,255, 80,134,118,105,251, 78,174, 92,185, 98,164, 40,170,101, 80, 80,208,156,145, 35, 71,126,170, 80, 40,220,165,
- 82,105,130, 94,175,223,173, 82,169,150, 35,191, 61, 42,223,146,103,136, 66,161,136, 46,173,215, 97,201,117, 0,155,114, 53, 75,
-164,119, 40,150,194,161,196, 54,197, 82, 63,148,146,222,225, 47, 63,239,172,230, 63, 82,243,125, 55, 91,101, 39, 44,125,131,198,
-227,121, 60,149,190,254,245, 8,170, 42, 38,235,205,104,137, 90, 25,177,112,127, 76, 35,173, 70, 13, 69,118,242,115, 68, 29, 76,
-169,210,110, 21,148,243, 90, 4,133,168,200, 87,184,119,114, 75,126, 57, 95, 31,169,116, 57, 41, 96,222, 15,103,142,240, 41,107,
- 59, 60,252,124, 12, 18,178, 20, 56,243, 58,243, 16, 81,106, 62,251, 21,200,196, 13,128, 54,104,174,239,252, 58,105,107,219,254,
-214,131, 29,170,241,176,238,203,221, 16,205,181,231, 55,239,220,206,146, 49, 16,147, 68, 34,209,245,239,191,255,190, 75,219,182,
-109,133,131, 6, 13, 42,173,129,188,165,196,221,127,241,234,135, 83,219,214,126,105, 95,191, 5, 54, 47,152,109,220,127,251,113,
-201, 94,136,229,226,235,235,107,188,117,235,214,204, 9, 19, 38,172,235,210,165,139, 91,223,190,125, 5, 30, 30, 30, 16, 10,133,
-120,245,234, 21,174, 95,191,174,125,253,250,117,130, 82,169,156,217,160, 65, 3, 75,114,156,101, 46, 92,184,240,187,130,239,160,
- 10,170, 11,155,162,160,119,161,105,165,130,164,165, 77, 1, 72, 22, 47, 94, 60, 18, 0,202,232,246,189, 16,192, 54, 0, 92, 66,
- 72,210,222,189,123, 91, 30, 59,118,172,229,140, 25, 51,248, 61,123,246,196,157, 59,119,112,225,194, 5,157, 78,167,187, 93, 96,
- 92,205, 29, 42,135, 1, 16, 98, 48, 24, 30,175, 90,181,170, 37,135,195, 89,104, 90,240,244,233, 83,236,218,181,171, 50,154, 6,
- 0,107,146,147,147,127,216,187,119,239,194,139, 23, 47,126, 50,106,212, 40, 43,189, 94,143,176,176, 48,252,252,243,207,149,210,
-204,206,206,254,220,193,193, 97,254,233,211,167,119,159, 63,127,254,195, 17, 35, 70,208,211,166, 77,195,166, 77,155,240,191,255,
-253,143, 49, 26,141,199,120, 60,222,168,180,180, 52,197,187,120,234, 20, 84,195, 37, 88, 56,214, 97,133,186, 85,169, 26, 52,147,
-196,170, 10,152,246,163, 67,135, 14,133, 81, 70, 83, 20,174,232, 58, 20, 69, 89, 92,117, 8,192,134, 16,194, 0,216,130,252,241,
- 69,139,102,133,231,224,207,204,241,230, 42,250, 39,106,108,158, 66,131,176,242, 7,149,182, 1, 8,252, 43, 80,203, 90,184,112,
-225,250, 69,139, 22,173, 47,153,194,161,232, 74, 37, 83, 63, 44, 89,178, 4,108,122, 7,150,127, 43,165, 27,173,144, 29,122,125,
-205, 1, 95,125,255,237,236, 69, 6,189, 54,155, 64, 55, 16,175,142,134, 86,245,203, 8, 67,230, 94,218,183,120, 19, 8, 50,137,
-209, 48,167,202,165,255,139,202, 73, 89,219, 33,119,233, 36,252,239, 73, 2, 73, 82,232, 63,250, 85,167, 43, 22, 13,202,111,147,
-197, 12,185,172,206, 60,104,235,198,251,237,243, 78,246,212,169,140,145, 22,127, 79, 74, 74,202,241,245,235,215,211,107,215,174,
-109,175, 84, 42, 75, 54,144,175, 44,179,251, 76,157,203,105, 94,199,115,234,189,151,209,253, 96, 70,117, 97, 73, 90,181,106,149,
- 24, 30, 30, 62,236,252,249,243, 67,175, 93,187,214, 69,161, 80,120, 82, 20, 5,137, 68, 18,173,209,104, 46, 10,133,194,253, 22,
-154, 44, 0,192,162, 69,139,200,146, 37, 75,168,240,240,112,194,225,112,254, 0, 16,201,225,112,162,138, 54,130, 47, 58,223,180,
-205,226,197,139,205,249, 65,188,150,151,151, 23,188,116,233,210,118, 75,151, 46,109, 88, 16, 21,186,134, 63,219,124, 89,138, 30,
-192, 53, 62, 95,144, 64, 81,148, 59, 95, 32, 84,220,186,117,235, 98, 21, 53,149, 58,157,110, 78,108,108,236,186,117,235,214, 45,
-151, 74,165,205,158, 62,125,250, 71, 85, 52, 11, 76,212, 0, 59, 59, 59,183, 61,123,246, 28,222,185,115,103, 11, 46,151,123,135,
-162,168, 65,217,217,217,239,116, 80,233,130, 1,162,151, 88, 48,214,161, 89,186,111, 59, 73,233, 95, 97,220,140, 70, 99,222,252,
-249,243, 83, 74, 26,175,146,209, 43,211,255, 5,169, 92,204, 57,166,150,244,162,172,192,184, 80,121, 0,144, 63,118, 97,254,176,
- 58,230, 14, 42, 13, 64, 85,209,125, 78,211,244, 49, 0,207,105,154,126, 89,178,163, 75,209,101, 75,150, 44,169,232, 62,103, 97,
-121,175, 49,227,201,182,152, 6, 22, 87,182, 37,237,223, 24,174,124, 59,229, 28,198,231, 47,161,129, 47, 1, 80, 4, 88,247,171,
- 78,247,117,121, 27,186,180,194,114, 66, 97, 70,193,193,252, 54,233, 38,150, 85, 98,223,171,193,140,241, 7, 45,212,244, 65,249,
- 3,202,190,161, 57,112,224, 64, 78, 25, 63,230,197, 6,149, 46,139, 35, 71, 10,179,248,151, 85,206,162,215,155,252,238,221,187,
-110,129,129,129,137, 40,222,232,191,180,249,196,194,125,231, 0, 48,190,229,227,249, 94,104,214,170, 85, 75,240,234,213, 43,237,
- 63,235,222,100, 53,255,145,154, 54,126,213, 65, 97, 28,138,230, 14, 42, 55,162, 85,196,160, 17,242, 51,178,194, 98,203, 40,167,
-233, 62,183,137,136,136,240,172, 93,187,118, 52,128,172, 18,229, 40,109, 25, 97,207,209,127, 94,179, 52,198,163,248, 80,116,239,
- 21,165,245, 14,199, 95,112, 34, 88, 77, 86,147,213,100, 53, 89, 77, 86,147,213,100, 53, 43,107,180,222, 91, 8, 33,160,193,194,
-194,194,194,194,194,194,194,242,151, 64,149,227, 74, 45, 9, 9, 86,198,217, 94,100, 53, 89, 77, 86,147,213,100, 53, 89, 77, 86,
-243, 63,167, 89,145,118,209,237,223,215,170,195,241, 0,118,176, 85,135,172, 38,171,201,106,178,154,172, 38,171,201,106,254, 83,
- 52,203, 50, 44,239, 45,132, 16, 51,199, 58,100, 97, 97, 97, 97, 97, 97,249, 71,208,165, 46, 92,185, 70,208,103, 95,153,213,137,
-170, 66,122,212, 66, 53, 0,120, 91,122,255, 81, 92, 1,244, 42,242,255, 41, 20,244,140,103,141,214,251, 75, 29, 0, 95, 1,176,
- 46, 50,239, 30,128, 21, 37,214,219, 7,160,232,128,132, 10,228,143, 19,248,210,146, 47,163,105,122, 69,187,118,237, 62,187,113,
-227,198, 90,131,193,176,180, 18,229,245,116,117,117,253,142,162,168, 38, 0,120, 20, 69,189, 74, 78, 78, 94, 97, 48, 24,170,210,
-107,165,166,139,139,203, 74, 0,141,104,154,230, 81, 20, 21,145,156,156,188,204, 96, 48, 92,169,130,166,220,217,217,185, 53, 33,
-196, 5, 0,135,199,227,165,199,199,199,223, 69, 37,115, 43, 13, 92, 28,198,207, 81, 24,120, 0, 96, 37,229,234,143, 44,246,211,
-153, 59,143,189,196, 89, 88,254,219,144,252,158,201,197,232, 94, 11,203,137, 1,179,140, 0,213,205, 11, 27,207, 69, 98, 86, 89,
-219, 83,165,244,106, 46,169,217,189, 22,150, 27, 73,190, 70,183, 90, 88,115,238, 21,202,237,105,111,142,166,137, 29, 0, 61,222,
-140, 81, 10, 40,243,122, 95,255,211,233,133,226, 85,156,133, 85,158,229, 26,173, 33,117,225,106,228,130,123, 36, 12,166,110,188,
-114, 0, 13, 11,126,228, 95, 34, 63, 87, 81,110, 21, 11,247,190,104,254,211, 88, 72, 8, 25, 86,236, 98, 45, 37, 15, 81,167, 78,
-157,250,158, 63,127, 94, 98, 26,239,142, 97, 24,136,197, 98, 3,128,209, 22,124,151,211,144, 33, 67,230,254,244,211, 79, 24, 60,
-120,240,252,147, 39, 79,174, 7,144,103,238,198,182,182,182, 3,109,108,108, 54,253,248,227,143,142, 45, 90,180,164, 4, 2, 1,
- 94,189,138,112,159, 48, 97, 66,189,240,240,240, 99, 41, 41, 41,159, 90,186,243,118,118,118,195,109,108,108,214,109,223,190,221,
-161, 77,155, 54,160, 40, 10,193,193,193,238,159,127,254,121,195,152,152,152, 3,201,201,201,147, 45,213,180,183,183,175,107,109,
-109,221,113,243,230,205,226,214,173, 91, 67, 36, 18, 33, 52, 52, 84, 54,113,226, 68,151,248,248,248,176,228,228,228,171,150,154,
-172, 71,193, 39, 62, 52,232, 52,171, 0,128,203, 23,206,110,177,238,246,137, 71,151, 79,244,169,104,222,192,197, 97,191,179,102,
-139,133,133,165, 40,195,221,224, 66, 8,190, 60,255,243, 2, 26, 0,186,125,242,205,180,225,110, 88,251,107, 66,217, 99,216, 90,
-168, 55,107, 84, 53,108,218, 19,143,228,170,148,115, 7, 64,127,206,229, 78,107, 30, 24,232, 48,229,230,205, 8, 29,176,251, 63,
-114,138, 74,173,230, 44,211,104, 13,240,195, 82, 67,126,196,132,234, 81, 27, 7, 46, 68,114,174,119,234,212,169,246,216,177, 99,
-169,198,141, 27, 35, 56, 56,184,238,129, 3, 7,122,157, 58,117, 42,194,104, 52, 6, 3,120, 2,243,179, 90,243, 0, 4,112, 56,
-156, 38,255,112,205,127, 50,210, 2,115,149,140, 63, 19,157,190,145,240,244,210,165, 75,199,185, 92,174, 41,162,213, 92,161, 80,
- 56,151,136,130,153, 67, 13,189, 94,143,103,207,158,129,166,105, 30, 0, 47,188, 57,164, 70, 89,184, 75, 36,146,173,183,239, 5,
-219, 83, 92, 49, 50,213, 0,212, 58, 8,100,206,248,105,215, 94,187,153,211, 39, 15,184,114,229,202,245,220,220,220, 95, 44, 40,
-143,151, 84, 42, 93,255,240,225, 67,123,137, 68, 2,134, 97,144,155,155, 11, 23, 23, 23,252,248,227,143, 54, 51,103,206, 28,150,
-147,147,115, 69,173, 86,255,207, 18,115,110,109,109,221,241,241,227,199, 98,211,128,210, 90,173, 22,238,238,238,216,183,111,159,
-112,218,180,105,126, 89, 89, 89,113, 90,173,246,181,185,130, 57, 10, 3,207,160,211,172,218,179,101,113,117, 0, 24, 53,121,241,
- 42, 65,174,213,105,115,230,229, 40, 12,167, 0,176, 70,139,229,239,166,137,131,131,195,145,180,180,180,171, 0, 62,197,219,137,
- 52,212, 21,137, 68, 13, 24,134,113,161,105, 26, 28, 14, 39, 73,161, 80, 60, 4,240,162,178,130,246,181, 58,244,129, 80, 50, 6,
-132,105, 72, 3,160,104, 58,212,168, 83,238, 74,127,113,229, 68,149, 52, 5,226, 79, 0,210,144, 6, 24,138,166, 31, 50, 6,229,
-143,105,207,174,156,249,167,156,156, 59,217,240,174,229, 98,254,192,152,111, 67,239,227,154,112,165, 25,208,251,162,204,175, 86,
-156, 10,244,156, 62,125,186,203,228,207, 62,163,198,140, 30, 93,231,234,141, 27, 84,123, 75, 70, 43,120, 63, 41,179,193,126,169,
- 70,107,160, 31,108, 9, 48,231,192,166,175,104, 46,135, 67, 13,157,190, 98,216,206, 45,107,232,174,125, 6, 21, 86,159,180,109,
-219, 22,109,219,182,165, 86,173, 90, 85,231,143, 63,254,168,179,111,223, 62,195,237,219,183, 31, 2, 56, 88,214,151,117,175, 5,
- 21, 3,136,248, 60,174, 98,232,130, 95,182, 7, 6, 6, 66, 40, 20,162, 42,154, 0,208,181, 54,253,154,103, 87,243,225,208,169,
- 11,163, 91,180,104, 69,222,134,230,123,196, 61,160,112, 80,107,219,234,213,171,183, 54, 24, 12, 34, 0,224,114,185,234,216,216,
-216,169,200, 31, 27, 16, 0,142, 49, 12,211,215, 2,109, 26,192,162,190,125,251,206,159, 50,101, 10, 60, 60, 60, 48,109,218, 52,
-232,245,250,224, 51,103,206, 44, 4,176, 18, 21,220, 60, 78, 78, 78, 11,183,110,221,106,199, 21, 72,209,120, 78, 36, 18,179, 12,
- 0, 0,153, 16, 56, 62,137, 96,218,180,105, 86, 65, 65, 65,203, 44, 49, 90, 78, 78, 78, 75,127,252,241, 71, 59,137, 68, 2, 66,
- 72,225, 88,140,121,121,121,200,203,203,195,228,201,147,173,194,194,194,190,179,196,104, 57, 59, 59,183,222,188,121,179, 88, 36,
- 18, 33, 47, 47,143,175,211,233,168,220,220, 92, 40,149, 74,162,213,106,117, 83,167, 78, 21, 62,121,242,164, 67, 98, 98,226,107,
-176,252, 83,224, 0,248,136,199,227,245,175, 93,187,118,211,151, 47, 95, 62, 48, 24, 12, 71, 1, 28,125, 11, 47, 83,157,221,220,
-220,150, 39, 36, 36,108, 6,176,247,191,114, 64,157,157,157,143,222,186,117,171,250,214,173, 91, 71,175, 93,187,246, 52,128,255,
- 85, 65,142,207,231,243, 7,180,111,223,190,250,168, 81,163, 4,206,206,206,208,104, 52,136,140,140,180, 58,116,232,144,103,104,
-104,104, 92,193,136, 24,102,191, 80,216,215,109, 37, 3,215,234, 64,203, 86,173,219, 12, 30,240,145,220,217,222, 26, 42,173, 17,
- 47,163, 19, 61,206,158, 62,222, 62,156, 47,190,165,211,101,127,156,254,226, 86,158,165,154, 29, 59,118,110,211,165,115,103,185,
-181,141, 53,178, 21, 58,188,138,138,247,188,124,225, 68, 91, 46, 87,124,141,161,244, 35, 82, 30, 95, 80,190,203,115, 51, 13,224,
- 42, 68,246, 13, 26,182,106, 28,212,109,236,178,166,132, 16,208, 4, 27, 75, 70,179,166, 1,220,141,249,195,126, 89,164, 7, 66,
- 8, 69, 97, 77,209,104, 86,247, 90, 88, 78, 8,102,129, 6,213,189,130,106, 74, 19,221, 0,161,141,157, 93,224,196,241,227,169,
-220,156, 28,132,134,134, 42, 75,154,172,245,213,192,191, 70,163,198,177,216,202,155,237,127,104, 52,171,212,170, 67,179,243,104,
- 73, 36,146, 82,231, 91, 91, 91,163, 99,199,142, 88,177, 98, 5, 23, 64,147, 18,139,139, 15,178, 10, 8, 79,110,155, 7,107,169,
-144,246,240,240,144, 91, 89, 89, 85, 89, 19, 0, 64, 24,175, 86, 30,228,131,251,191,124, 53,250,226,190,117, 1,138,220, 44, 94,
-201, 85,100, 50, 25,188,189,189, 49,127,254,124,243, 52,171,206,223,170,233,226,226,226,211,182,109,219, 38,151,174, 94,181, 73,
- 72, 72, 16, 38, 36, 36, 8,207, 95,186,100,211,178,101,203, 38, 46, 46, 46, 62,133,135,234,205,174,166,229,149,243,155, 45, 91,
-182, 44, 60,118,236, 24,221,182,109, 91,216,218,218,162, 99,199,142, 56,125,250, 52,119,237,218,181,223, 2,152, 95, 81, 57,105,
-154,110,211,182,109, 91, 10,132, 32, 41,219,128,187, 43,124, 16,186,198, 23,185,106,130,140,236, 28,168, 84,106, 72, 36, 18, 17,
-242,171,123,205,221,247, 86, 45, 91,182,164, 0, 20,154,171,220,220,252, 41, 47, 79, 1,173, 86, 7,161, 80, 40, 7, 32, 50, 87,
-147, 16,226,210,186,117,107, 0,128, 78,167, 43,124,195,203,202,202,162,178,179,179,161,213,106,193,227,241,248,168,184, 93, 99,
-161,166,149,148,171,231,242,133,179, 71, 77, 94, 28, 59,106,242,226, 88, 46, 95, 56, 91, 43,207, 49,154, 51,207, 74,202,213,191,
-227,235,211,145,166,233,159,107,213,170, 21, 70,211,244, 30, 0, 46, 85,212,108, 6,224, 91,177, 88,124,209,215,215, 55, 86, 34,
-145, 92, 42, 48,234, 45, 43,169, 41,144, 72, 36,151,190,253,246,219,195, 15, 30, 60, 24,252,199, 31,127,120, 61,122,244,104,192,
-170, 85,171, 14,200,100,178,235, 40,222, 46,209,226,123,211,203,203,107,231,221,187,119,155,181,106,213,234, 39, 0,194,183,116,
-191,115, 0, 52,130, 89, 35,114,188,147,243,238,214,184,113,227,234, 34,145, 8, 93,186,116, 1,128, 14, 85,209,228,243,249, 3,
-230,207,159, 95,107,193,130, 5,130,196,196, 68, 92,186,116, 9,247,238,221,131,193, 96,192,164, 73,147,132,163, 70,141,170, 41,
-151,203, 7, 88, 84, 78,174,213,129,233,159,207,232,241,229,180,113,242,135, 49, 58,236,186, 24,131,223,111, 39, 34, 69, 41, 64,
-159, 1,163,172,187,247, 27,210, 93, 32,180, 62, 96,169,230,220, 57,115,122,140,255,100,152,252,105, 34,131,227,119,146,112,231,
- 89, 54, 12, 60, 27,244, 28,240,169,109,195,214, 61,122,113,193,219,253,174,207,209,143, 64,139,233,211,167, 59,206, 94,243,235,
- 77,183,102, 31,109, 76,205, 68,219,162,198,167, 46, 96, 99, 39,149,126,244,172,125,251,113,226,252,241, 98,203,213, 44,166,215,
-164,223,166,148, 76,180, 43,218, 62,171,157, 29,234, 20, 84, 43,114,206,255,188,128, 38, 20,166, 13,119, 43,246, 28, 40,181,156,
- 87,128,193,211,103,204,224, 89,219,218, 98,203,150, 45,208, 40, 20,197,218,204,118,174,142, 30, 23, 37,220,184,154,190,238, 97,
- 29, 61,169,235,255,194,247,149,241,101, 70,180, 78,158, 60, 73,122,247,238, 77, 1,192,145, 48,100, 14,240,195,119, 67,166,124,
- 59,159,162, 41, 82, 35,160,213,211,106,181,252, 21,246,246,246, 80, 42,149,208,104, 52,224,243,249, 80,171,213,136,137,137,193,
-157, 59,119, 96,107,107,107, 81, 73,114,114,114, 32,147,201, 32,147,201,222,138,230,188,209, 93,132,175, 98, 83,133,231,238, 92,
-105,255,253,103,255,107, 81,171, 81,135, 71,157,135, 76,123,108,229,232,166,126,244,232, 17,110,221,186,133,204,204, 76, 4, 6,
- 6,254, 91, 78,230,189,130, 54, 89,247, 0,216,214,174, 93,219,253,220,197,107,182,121,106,198, 42, 42, 89,207, 99, 24, 6, 18,
-137,171,225,224,145,227,217,131, 7,244,161,146,146,146, 82, 0,220, 43, 48,183, 21,141,169, 40, 2,224, 51,112,224,192,185,159,
-125,246, 25, 34, 34, 34, 48,110,220, 56,213,189,123,247,210, 91,181,106,101,255,227,143, 63,138,103,206,156,137,171, 87,175, 46,
- 58,121,242,228,111, 0, 34, 1,148, 58, 86, 27, 33,132,207,231,243, 97, 40,176, 13, 58, 35, 83,232,239,115,114,114, 64, 84,153,
-224,243,249, 28, 0,142, 48,179, 29, 29,195, 48,124, 30,143, 87,104,178, 98,146,115, 16,147,162, 68, 78,158, 22, 42,149, 1, 90,
- 21, 1, 71, 98,207, 5,162,156, 1, 68,153, 27, 29, 17,137, 68, 48, 24, 12,200,205,205, 47,134, 41, 82,166,213,106,145,157,157,
- 13, 14,135, 35, 3, 96, 5, 32,195, 28,193,130, 70,238,191, 23, 84, 3,226,254,175,125, 29, 94,158,154, 87,108,158,149,148,171,
- 63, 50,211,143, 99,239,222,240, 70,163,193,187,125, 11,231,189,219,246, 89, 66, 71, 71,199,203,135, 15, 31,246,171, 83,167, 14,
- 34, 35, 35,125, 7, 13, 26, 20,152,152,152,216, 8,150,143,201, 40,161,105,250,187, 81,163, 70,125, 54,116,232, 80,170,110,221,
-186,224,114,185, 48, 24, 12,238, 17, 17, 17, 29, 15, 29, 58, 52,103,231,206,157, 63, 26,141,198, 47, 96,126,187, 63, 90, 32, 16,
- 28,220,190,125,123,187,192,192, 64,236,217,179, 7,247,238,221, 99,154, 53,107, 70,143, 28, 57, 18,158,158,158,129, 35, 71,142,
-252, 93,163,209,244,172,100,100,203,179,101,203,150,213, 57, 28, 14, 90,181,106,197,191,117,235, 86, 99, 0,183,170,120, 76,101,
-238,238,238, 87, 59,116,232,208,232,226,197,139, 33, 73, 73, 73, 29, 44,216, 95, 0,232,231,230,230,182,202,218,218,218,214,130,
-103,172, 50, 62, 62,126, 22,128, 35,102,110,210,162, 73,147, 38,136,142,142,134,143,143, 15,248,124,126, 75,157, 78, 55, 1, 64,
- 15, 0, 95, 3, 8,179,160,188,117, 59,119,238, 92,189, 67,135, 14,212,145, 35, 71, 10,219,135,210, 52, 13,131,193, 0, 62,159,
-143, 22, 45, 90,208,193,193,193,213,238,223,191, 95, 23,102, 84, 35,218,215,234,208,167, 85,155,246,109,218, 5, 54,160,215, 30,
-121, 9, 35, 99, 4,135, 50,128, 75, 49, 96,244, 66, 8,249, 28,212, 13,104,202,121,246,228, 97,160, 86,163,235,147,254,226,226,
- 9,115, 52,123,116,235,218,214,207,167, 46,253,253,239,175,144, 21, 31,102,140, 15,191,150, 70,115,104,248, 53,233,228, 80,215,
-191, 17,167, 81, 96, 7, 94, 66,228,147,142,106,117,187, 46,153, 17,215, 46,190,139, 27,114, 9,192,113,175,230,240, 81,239,174,
- 29,248,137, 9, 9,138, 67, 71, 78, 60, 86,234,113, 7, 0,174, 2, 84, 79,160, 65,253,230,205,219,255,184,114,165,189,171,171,
- 43,111,196,208,161,134, 29, 33, 33, 33, 40,163,234,119, 9,192,113,112,113,233, 50,113,226, 68, 78, 98, 66, 2, 57,116,244,212,
- 35,147, 30,242,223, 82,234, 55,112,247,237, 13,197, 51,139,170, 41,251, 0, 2,103, 23, 23,191, 9, 19, 38, 32, 41, 33, 1,123,
-246,238,205, 83, 3,183, 77, 81,172,227, 28,108,246,175,229, 50,102,246,167,125,169,234,174, 14,152,184,104, 71,203,142,186,148,
- 90, 72,252,243,252, 23,245, 34,239,177,201, 26, 95,170,209, 42,201,255,194,176, 80,206,135,215,161, 67,251,233,212, 92,157, 34,
- 34, 34, 2, 14, 14, 14,112,117,117,133,181,181, 53,158, 62,125,138, 75,151, 46,225,249,243,231, 96, 24, 6, 13, 27, 54,180,168,
- 52,105,105,105,120,248,240, 33,108,109,109,223,154,102,173,234,142,152, 82,221,145,159,156,158,195,191,120,239,121,224,142,121,
- 3,252,105,223, 1, 59,139, 14, 18,171,213,106,241, 47,161,176,119, 97,245,234,213, 91,239,218,181,139,175, 49, 64, 94,119,194,
-237,213, 10,181, 81, 10, 0, 82, 17, 71, 17,188,202,251,139,111,190,249, 70,241,201, 39,159,248,198,198,198,174, 48, 35,214,191,
-188,115,231,206, 95, 18, 66,120,211,167, 79, 7, 0,140, 26, 53, 42,231,206,157, 59,117, 1,164, 92,186,116,201,109,236,216,177,
- 47, 46, 95,190, 44,153, 49, 99, 6,199, 96, 48, 60,229,114,185,228,228,201,147, 75, 1, 44,126,227, 23,145,166,131, 66, 66, 66,
-106,184,121,122,195,211,158, 70,219,249,207,243, 31,112, 18, 6,113, 81,175, 16,254,232, 30, 92, 92, 92,172, 93, 93, 93,195,226,
-226,226,116,241,241,241,115, 20, 10,197,214, 10,202, 24, 26, 28, 28,236,234,233,233,137,188,188, 60,196,165, 42, 49,237,168, 4,
- 57,170,252, 32, 6, 15, 42, 52,170,238, 45, 23,211,218,123, 41, 41, 41, 58,173, 86,187, 32, 59, 59,123, 87,121,154, 60, 30, 47,
-253,209,163, 71, 50, 15, 15, 15,168,213,106,146,145,145, 65, 41, 20, 10,228,230,230, 82,167, 78,157,250, 48, 49, 49,177,153,151,
-151, 23,229,238,238,190, 52, 49, 49, 81, 21, 31, 31, 63,206,156,170,201, 2,195,100,228,114,185,107,199,143, 31, 63,248,183,223,
-126, 11, 58,178,216,175, 95,145,234, 18,235,128,128,128,115, 13, 26,248,187,237, 93, 83,127, 35,128,213,255,128,107,107,204, 87,
- 95,125,229,103,103,103,135,137, 19, 39, 98,201,146, 37, 88,184,112, 97,157,137, 19, 39,142, 7,176,222, 2, 29,177,139,139,203,
-253,239,191,255,222,183,117,235,214, 56,125,250, 52,246,239,223,143,215,175, 95, 27,188,188,188,184,129,129,129, 88,180,104, 17,
-186,119,239, 62,110,234,212,169,237, 19, 18, 18, 26,155,105, 62, 62, 89,180,104, 81,191, 54,109,218, 96,244,232,209,154, 43, 87,
-174, 12, 6,112,254,194,133, 11,157,174, 94,189,122,228,215, 95,127, 21,127,251,237,183, 93,102,206,156, 57, 17,192,166, 74,236,
-255,135,237,218,229,143,161,220,166, 77, 27,172, 90,181,170,123, 21,141,150,192,222,222,254,212,158, 61,123, 26,121,123,123, 99,
-196,136, 17,141, 7, 15, 30,124, 42, 51, 51,179, 43, 0,179, 30, 72,213,170, 85,251,238,216,177, 99,181,203,170, 89, 40, 13,141,
- 70, 99,247,209, 71, 31,173,140,138,138,178,200,104,237,219,183, 15,179,102,205, 66,195,134, 13, 27,180,104,209, 98,219,132, 9,
- 19, 48,112,224,192,206, 79,159, 62,117, 70,126,175,229, 10, 17,137, 68, 13, 62,254,248, 99,193,221,187,119, 1, 0, 1, 1, 1,
-104,212,168, 17,162,163,163, 17, 20, 20, 4,141, 70, 3,103,103,103,244,239,223, 95, 20, 21, 21,213, 32, 45, 45,173, 66,163, 69,
- 11, 37, 99,250,245,238, 41, 63,126, 39, 17, 70,198,128,166,181,173, 16,232,235,132,103,113, 57, 8, 14,139,131, 81,203,135,149,
-157, 61, 90,182,239,102,151, 20,255,122, 76, 58, 80,113,123, 45,161,100, 76,255,126,189,100,199,111, 39, 32, 43, 33,156,188,188,
-247,219, 37,189, 90, 49, 14, 0,130,254, 56,176,205,197, 94,220,181,110,147,166,156, 14, 93,251,218, 30,221,159, 52, 38,243,239,
- 25,219,239, 13,174, 86,199,118, 79, 94,218,168,217,195,218, 18,158,173,251, 61,185, 94,191,217,180,172, 59,208,109,206, 87, 95,
-181,248,116,252,120, 17,195, 48,248,245,151, 95,114, 30,134,132, 60, 27, 15, 48, 19,202,208,219, 12,120, 14,238,215, 79, 40,183,
-178,194,231,211,166, 65,174,215, 95, 46, 60, 36, 64,231,207,191,252,178,245,228,201,147,197,219,150,126, 22,212,125,236,178, 38,
- 12, 33,148,169,154,114, 95,249,161,184,102, 99,251,245,131,220,202, 10,211,167, 79, 7,165,211,157, 43, 52, 80, 92, 92,254,228,
-195,182,129,195,250,180, 1, 5, 10,251, 79,222,192,203,232,212, 71,151, 19,241,234,125,117, 85, 37, 40,179,141, 86,185, 85,135,
-185, 58, 36,119,238, 53, 32,177,110,221,186,185,117,234,212,201, 77, 79, 79,199,227,199,143,145,153,153,137, 77,155, 54, 33, 60,
- 60, 28, 12,195, 84,218,192, 48, 12,131,183,173, 9, 0,206,246, 86, 24,209,179, 57, 87,163, 86,136, 82, 83, 83,139, 85, 31,253,
-139,140, 86, 33, 6,131, 65,228,229,229, 5, 26,160,178,149,122, 89,210,190,118, 84,210,190,118, 84,182, 82, 47,211,106,181,180,
- 76, 38,131, 70,163, 17,153, 33,197,251,224,131, 15,190,252,237,183,223,120,203,151, 47, 71,189,122,245,160,211,233,112,231,206,
-157, 56, 0, 41, 5,235, 36, 92,187,118, 45,193,100,132, 87,172, 88,129,163, 71,143, 82, 93,186,116,153, 83,218,245,148,152,152,
-248,221,132, 9, 19, 50,148,185, 25,216, 62, 68,133, 35, 35, 82,241,115,191,215, 24,106,127, 24, 25,201, 49,216,177, 99, 7, 46,
- 92,184, 72,157, 63,127,129,127,229,202, 21,105,175, 94,189, 54, 86,171, 86,237,100,121,133, 76, 72, 72, 88, 62,121,242,228,172,
-220,220, 92,228,230,230, 66,165, 82, 35, 67, 1, 60, 90,231,135, 71,235,252,160,102,196,216,178,121, 43,253,232,209, 35,135,215,
-175, 95,187,245,233,211,103,157,171,171,235,206,242, 52,227,227,227,239, 78,153, 50, 69,157,147,147, 3,173, 86,171, 51, 26,141,
- 90,149, 74,165, 63,112,224,192, 12,123,123,251,150,167, 79,159,230, 93,184,112,145,123,229,202, 85,254,165, 75,151,172, 59,118,
-236,120,208,217,217,121,183, 57,145, 50, 14,135,179, 97,239,222,189, 99,182,108,217,226, 28, 24, 24,232, 95,162, 42,202,181,107,
-215,174, 53,126,249,229,151,106,171, 86,173,154,131,252, 14, 40,239, 20, 7, 7,135,169,253,250,245,195,150, 45, 91,112,226,196,
-137,153, 27, 55,110,196, 7, 31,124, 0, 55, 55,183, 41, 48,191,218, 11, 0, 86,175, 95,191,222,215,215,215, 23,163, 70,141,210,
-142, 27, 55,238,139, 93,187,118,121, 93,191,126,157,191,123,247,238, 26, 19, 39, 78,156, 62,108,216, 48,117,205,154, 53,177,105,
-211,166,218, 52, 77,111, 48,235,254,118,118,158, 49,116,232, 80,172, 89,179, 6, 87,174, 92, 25,128,252, 31, 84, 45,128, 51, 55,
-111,222,236,243,237,183,223, 98,192,128, 1,112,119,119,159, 94,153,200,147,159,159,223,130, 30, 61,122,224,250,245,235,104,220,
-184, 49, 90,182,108, 57, 19,128, 67, 37, 15, 39, 45,147,201, 14,238,218,181,171,109,141, 26, 53,176,108,217, 50,212,170, 85, 11,
- 59,119,238,108, 43,149, 74, 15,194,204,230, 27,214,214,214, 50,137, 68,130, 57,115,230,144, 1, 3, 6,100, 84, 52,205,156, 57,
-147, 8,133, 66,216,218,218, 90,155,107,138, 69, 34, 81,171,122,245,234,225,206,157, 59,184,112,225, 2,230,207,159,143, 25, 51,
-102, 32, 53, 53, 21, 31,127,252,177, 4,192, 64, 11,246,219,201,209,209, 17, 57, 57,249,227,194,215,171, 87, 15, 15, 30, 60, 64,
-106,106, 42,220,221,221,145,148,148, 4,123,123,123,120,123,123,131, 97, 24, 39,243, 36, 73, 61, 7, 59,107,164,100,106,192,133,
- 1, 77,234, 58,224,242,227,116,196,164,106,225,100,111,131,164,148, 84, 84,179, 23,161,122,117, 15, 16,194,212, 51,203, 1,115,
-232, 38, 66,145, 24, 25,185, 58,196,135, 93, 73,215, 25, 53, 19,178, 34,111,198,102, 69,222,140,213,105,212, 19,130,110, 92, 72,
-175,225, 44, 70,245,234,213, 65, 17,166,249,187,184, 31, 7,121,160,186, 84,204, 29,117,225,231, 5,212,201, 31,231, 81,154,244,
-152,102, 61,156,243, 35,203,142,128,215,160,143, 63,110,245,197, 23, 95,136,146,147,147,153, 97, 67,134,100, 44, 95,188,248,226,
-217, 10, 94, 12,242,128, 58, 93,187,118, 5, 13,224,236,249,243,138, 36, 32, 14, 0,156,129,234,125, 63,250,168,221, 87,115,231,
-138,211,210,211,153, 59, 17,121,199,195, 83, 72,127, 59, 35,188,204,105,159,101, 4,234,155,116,207,157, 59, 71, 84, 64, 16, 0,
-116,168,142, 41,221, 90, 7, 4,142,236,215, 14,137, 41,153,152,190,252,103,108, 59,116,245,156,181,158,116,250, 23,253, 20,143,
-175,148,209, 42,168,250,121, 99,158, 82,249,102,237, 65, 85, 13,204, 95,161, 89, 26,255, 70,163,101, 66,175,207,175, 37,209,234,
- 25,104,245,140,233,173, 22, 42,149,202,108,137,115,231,206,237,153, 54,109, 26,214,173, 91,135, 23, 47, 94,128,207,231,163, 94,
-189,122,174, 0,100,166,103,126,147, 38, 77,156,104,154,198,179,103,207,176,118,237, 90,124,242,201, 39,228,214,173, 91, 59, 81,
-122,190,148, 7, 25, 25, 25,155, 39,140,251, 36, 43, 51, 57, 6,122, 85, 38, 82,226, 95, 65,163,200,194,178, 21,223, 65,169,231,
- 34, 41, 91,135,164,108, 29,104,161, 29,182,253,184,139,227,231,231,215,131,195,225,244, 46,167,156,119,146,147,147,127,156, 52,
-105, 82, 86, 82, 82, 82,225,254,105,245, 4, 90,125,241,235, 85, 34,145, 96,195,134, 13,214,117,235,214,237,199,229,114, 59,150,
-163,153, 24, 27, 27, 27, 62,105,210, 36,109,114,114, 50,178,179,179,113,252,248,241, 62, 53,106,212,176, 93,185,122, 29,165,208,
-113,145,148,165, 67, 82,150, 14, 2,153, 19, 14, 30,249,141,227,237,237, 61,140,203,229,182,172,200,100,253,250,235,175, 35,135,
- 12, 25, 34, 95,189,122,117,198,177, 99,199,182, 0, 40,122, 66,158,109,216,176,225,208,193,131, 7,115,191,252,242, 75,187, 85,
-171, 86,205,124,199,102,171,227,144, 33, 67,124, 24,134,193,225,195,135, 31, 1, 88,255,219,111,191,221,215,104, 52,248,248,227,
-143,189, 10,170,145,204,161,217,176, 97,195, 62,107,219,182, 45, 62,255,252,115,221,197,139, 23,155, 0, 88,135,252,170, 92, 2,
- 32, 26,192,198,171, 87,175, 54,156, 58,117,170,166,121,243,230, 24, 61,122,244, 39, 0,218, 86,160,219,106,232,208,161,190, 12,
-195,224,192,129, 3, 15, 1,156, 46,177,252,210,145, 35, 71,238,104,181, 90, 12, 31, 62,188, 38, 0, 75, 30,228,124,161, 80,120,
-248,155,111,190,177,137,143,143,199,200,145, 35, 53,207,158, 61,195,226,197,139,197,214,214,214,167,139,220, 3,102, 35, 20, 10,
-119,252,240,195, 15,253,234,215,175,143, 73,147, 38,105,183,110,221, 58,237,179,207, 62,211, 54,105,210, 4, 91,182,108,233, 39,
- 16, 8, 44, 26, 90, 36, 33, 33, 33, 43, 44, 44,204,190,162, 41, 46, 46,206,220,238,249, 18,153, 76,118, 59, 32, 32, 32,167, 94,
-189,122, 77, 13, 6, 3,158, 62,125,250,106,207,158, 61, 76,189,122,245,176,121,243,102,172, 90,181, 10,189,123,247, 6,135,195,
- 49,219,104,113, 56, 28,232,116, 58, 72, 36, 18,112,185, 92,188,122,245,202,148, 90, 6,124, 62, 31, 0, 32,149, 74, 33, 22,139,
- 65,211,180, 89,189,209, 40, 10, 36, 71,169, 7,143, 71,131, 75, 51, 8,143,206,134, 78,207, 64,196,231,128,199,165, 0,194,192,
- 70,202,131, 72,192, 1, 77, 81,140,153,154,200, 86,232, 32,224,211,224,241, 5, 20,109, 48,138, 11,127, 28,185, 70,177, 88, 44,
-160, 28,172,132, 16,241,255, 65,195, 2, 83,249, 13,203,199, 0, 60,169,135,199,224, 53,107,215, 10,114,242,242, 48, 96,192,128,
-140,168,251,247,247,170,128,251,237, 43,232,164, 68,115,185,117, 59,180,111,143,224,144, 16,228,102,102,190, 4,242, 27,199, 11,
-220,220,134,108,216,176, 65,160, 82,171, 49,160,127,255,172, 23, 55,110,252, 26,155,135,147, 7,162,243,141, 88,133,231,157,207,
-119, 49,233,102,103,102,102, 2,249, 41, 36,156, 29,101, 43, 39, 15,235,142, 92,165, 26,179,191,219,203,132,132, 39, 78,185, 30,
-135, 94,191, 37, 32,251, 95,246, 51, 60,190,196, 4,192,140,132,165,166,232, 82, 69,102, 69,163,209,188,117, 3, 84, 85,205,210,
- 76, 98, 85, 53,255,137,112,185, 92,245,243,231,207, 5, 86,246,110,140,189,156,151, 89,227,147, 27,214, 0, 96, 39,227,102,235,
-140,122, 38, 33, 33, 1, 66,161, 80,109,102,117,195,184, 29, 59,118, 44, 3,224,207,229,114, 79,238,218,181,139,218,187,119,175,
-237,208,161, 67, 35,194,194,194,226, 3, 2, 2, 60,119,237,218,101, 5, 0, 27, 55,110, 36, 7, 15, 30,236,142,252,148, 25,101,
-230,113, 73, 78, 78, 94,156,158,158,126,107,242,228,201,155, 4, 2,129,173, 84, 42,181,191,126,253, 58,165,214, 17, 52,251, 42,
-186,176, 39,162,149,152,198,181,121, 86, 24, 63,126, 60, 39, 44, 44,108, 69,124,124,252,201,114, 52,231,100,101,101, 93,127,241,
-226,197, 58,107,247, 70,142, 82,207,175,172, 3,231, 61, 3, 0,120, 58,240, 64, 23, 60, 23,179,178,178,144,154,154,138,207, 62,
-251,204, 54, 34, 34, 98, 78,124,124,252,229,114,162, 90, 87,211,210,210,226,158, 60,121,210,129,199,227, 9,164, 82,105,179,219,
-183,111, 83,106, 45,131, 6,115,162,145,145,151, 95, 78, 59, 25, 23, 65,223, 56, 99,202,148, 41,220,151, 47, 95,126,151,152,152,
-216,166,212,135, 25, 77,175, 42,106,178,102,207,158, 29, 10,160, 38,128, 98, 85,163, 70,163,145, 26, 62,124,248, 99, 0,245,190,
-252,242, 75, 59, 66,200,204, 57,115,230,100, 0,216,254,119, 95, 75, 86, 86, 86, 43, 39, 76,152,128,131, 7, 15, 34, 51, 51,115,
- 3, 0,228,228,228,172,223,183,111,223,129,113,227,198,225,151, 95,126, 89,153,154,154,122, 22, 21,119,213,254,224,227,143, 63,
-198,153, 51,103,240,199, 31,127, 44, 0,240,180,140,245, 94, 92,191,126,125,206,177, 99,199,190, 31, 58,116, 40,126,254,249,231,
- 30, 0,202,107, 32,219,181,123,247,238, 56,125,250, 52,210,211,211,183,148,182, 66, 86, 86,214,214,227,199,143,183,232,222,189,
- 59, 86,172, 88,209, 21,192, 37, 51,118,221,215,218,218,122,215,247,223,127,223,172,126,253,250, 24, 54,108,152, 90,167,211,245,
-248,242,203, 47, 79,236,223,191, 95,190,103,207,158,166,227,199,143,191, 91,144,243,237,142, 89,161, 44,154,254,118,237,218,181,
- 99, 59,116,232,128,153, 51,103, 26,206,157, 59,215, 23,192,249,179,103,207, 70,204,158, 61,251,212,218,181,107, 57,107,214,172,
- 25, 59,125,250,244, 84,134, 97,222,149,185,254,102,227,198,141, 45,186,117,235,134, 87,175, 94,225,206,157, 59,208,233,116,191,
-220,190,125,251, 90,157, 58,117,190,209,106,181, 39,164, 82,233, 40,185, 92, 30,208,168, 81,163, 78, 65, 65, 65, 18,152,215, 78,
- 47, 57, 50, 50,210,198,218,218, 26, 6,131, 1,143, 30, 61,130,135,135, 7,116, 58, 29, 94,191,126,141,250,245,235,131,207,231,
- 35, 57, 57, 25, 69,162,229, 21,152, 34,250, 81, 68, 84, 66, 77, 59,185, 20, 48,138,240,224, 89, 28, 28, 29,108, 97,164,104, 36,
- 37, 37,162,145,143, 59, 40,138, 66, 86,122, 18, 40,138,122,108,142,166,145, 48,193, 49, 9, 41,213,236,229, 66,212,111,209,205,
-254,246,217,212,189, 86, 53, 91,143,231,114, 40,142, 64, 40,219, 62,118,244,104, 7,134, 33,200, 74, 79, 6,151,166,239,189,139,
- 19,116, 56, 6,177,237,107,137, 30,116, 27,187,172, 17, 69, 64, 84, 58,236,249, 57, 25,153, 18,160,209,198,175,191,182,177,119,
-112,192,176, 97,195,152,244,248,248,139, 74, 51, 19, 43,215,172, 83,199, 89, 38,151,227,230,205,155,224,228,183,177,197, 78,192,
-119,213,236,217,246, 78, 46, 46,248,100,236, 88, 38, 57, 38,230,146, 10, 72,176,164,172, 53,107,213,226,153,116,233, 2,221, 68,
- 14,166,125,217,183,173, 80, 42, 22,226,219,109,191, 33, 54, 77,113,224,118, 34,182,253, 75,227, 29, 59,202,141,104,149,213,248,
- 44,191, 81,181,164, 92,179, 34, 18,137, 10,163, 41, 22,188,233,189,117,205,138,248, 43, 52,223, 33,243, 0, 28, 3, 48, 47, 54,
- 54, 54,124,236,216,177, 58,131, 78,147,123,107, 89,205,185, 33, 43,106, 76,186,189,216,117,210,239,211,172,231, 42,179, 51,114,
- 55,110,220,168,143,141,141, 13, 47,186, 77, 5,218, 49, 0, 78,239,222,189,123,235,225,195,135, 81,175, 94, 61, 60,125,250,212,
- 73,161, 80, 52,126,252,248,177,157,175,175, 47,246,238,221,139,131, 7, 15,174, 3,112,161, 60,147,101,194, 96, 48, 92, 76, 74,
- 74,242,142,142,142,174,109, 99, 99,163,183,177,177, 65,201,158,136, 57, 42, 6,233, 89,217,176,179,179,135,149,149,149,151, 25,
-230,252,116, 82, 82, 82, 93,198,214,167, 93,221,180, 13,217,193,223, 86, 71,240,183,213,113,122,142, 27, 92,109, 4,200,204,204,
- 68,106,106, 42, 82, 83, 83, 65, 81, 20,244,122,189,159, 25,154,175, 19, 19, 19,127,138,137,137, 57,230,236,236, 12,185, 92, 14,
- 2, 32, 41, 75,143,208, 53,190, 8, 93,227,139,164, 44, 61,114,114,115, 81,163, 70, 13,200,229,242,178,170, 40,232,106,213,170,
-245, 28, 50,100,136, 28, 0, 10, 12, 84,103, 66,200,164, 82,166,137, 6,131,161,181,105,221, 89,179,102,217, 1,232,254, 55, 95,
- 79, 28, 0,147,199,141, 27,215, 84, 36, 18, 97,243,230,205,175, 1,252,106,122,214,111,221,186,245, 25, 0, 76,155, 54, 45, 0,
-192, 76,148,145, 9,186, 48, 52,196,231, 55,241,243,243,195,237,219,183, 1,224,183, 10,190,251,200,173, 91,183, 80,167, 78, 29,
-136, 68,162,102, 21,172,235, 85,189,122,117, 60,123,246, 12, 0, 30,148,177,206,131,103,207,158,229, 87,247, 80,148,151, 25,251,
-222,175, 91,183,110,143, 46, 95,190,220,172, 85,171, 86, 24, 59,118,172,246,238,221,187, 61, 1, 92,123,240,224, 65,199,225,195,
-135, 43,234,214,173,139,171, 87,175,250, 14, 31, 62,252, 22, 77,211,203,204,208,252,100,233,210,165,243, 62,252,240, 67, 44, 93,
-186,148, 28, 58,116,104, 24,128,243, 5,203,206, 29, 56,112, 96,228,242,229,203, 73,255,254,253,177,100,201,146,121, 0, 38,149,
- 39,166, 80, 40,178,141, 70, 35, 20, 10,133, 89, 33,121,115,215,119,112,112,248,160, 91,183,110,152, 63,127, 62,170, 85,171,134,
- 19, 39, 78, 16, 0, 39, 1, 92,215,106,181,237, 0,172, 85, 40, 20,191,223,190,125, 27, 93,187,118,229,163,248, 16, 35,229,125,
-255,163,125,251,246,105,172,173,173,225,233,233,137,154, 53,107, 34, 41, 41, 9, 81, 81, 81,168, 95,191, 62,154, 52,105, 2,131,
-193,128,159,126,250, 73,157,155,155,107, 86, 78, 62,131, 86,177,231,194,169,163,217,246,114, 33,220,157,172, 81,163,154, 29,242,
-178,210,144,154,148,128, 38,126, 30,104,223,164, 6,210,178,181, 56,119,242,104,102,110,174,114,143, 89, 33,124,141,114,215,197,
-179, 39,178,109,229,124,120,251, 4, 96,248,216,105,141, 26, 53, 14,188,208,188,121,235,115,171, 87,126,219,160,115, 75, 63, 42,
- 46, 77,141, 51, 39,127,203,204,206,201,217,245, 46, 30,244, 75, 0,142,218,186,238,181, 45,199,130,127,242,239, 49,238,167,240,
- 56,108, 0, 0, 61,135,227,219,243,131, 15, 16, 23, 23,135,163,135, 15, 39, 42,129,135,230,234,137,197, 98, 26, 0,178,179,179,
- 33, 44,104,119,103, 0,124,122,245,234,133,212,180, 52,236,251,245,215,212, 51, 64,136, 37,229,236, 3, 8, 36,226,252,128, 96,
-118,118, 54, 40, 32, 7, 0, 40, 46,122, 54,175, 87, 7,169, 25, 57,184,124, 47, 60,175,134, 10,159,149,167,243, 30, 55,132,175,
- 92, 27, 45, 0,105, 51,103,206,132, 80, 40,132,171,171,107,161, 57, 50,153, 21,129, 64, 0, 87, 87, 87, 24, 12, 6, 28, 56,112,
- 0, 0,210,202,125,195, 3, 52,125, 39,173, 96, 52,122,162,228,241,120,111, 69,179,224,205, 81, 51, 96,246,207,204,217, 91,165,
-119,138,169,140,230,123, 64,243,130,156, 88,205, 1,100, 70, 69, 69,197, 13, 30,208, 55, 59, 58,226, 73,146, 34, 43, 33, 49, 39,
- 61, 54, 49,246,245,227,164,175,230,204,204,142,139,139,139, 69,126, 46,173,230, 9, 9, 9,166,109,204, 97,230,224,193,131,127,
- 24, 55,110, 28, 9, 13, 13, 5, 0, 4, 7, 7, 99,244,232,209,100,228,200,145, 27, 0,204,173, 68,185, 21, 42,149,170, 88, 52,
- 68,103,100, 10,171,252,114,114,114,144,144,144, 0,173, 86,107,182, 35,126,113,110,205,243,140,168, 32,125,128,167, 20, 1,158,
- 82,248, 86,151,128, 50,228, 21,154,172,212,212, 84,211,155,179,218,130,114,230,104, 52,154, 98,229, 44, 90, 53,153,147,147,131,
-164,164, 36, 24,141,198,178,126,200,152,248,248,248,115, 7, 15, 30,204, 5,128,213,171, 87,103, 80, 20,245, 7, 69, 81, 63,148,
- 50,109,227,114,185, 55, 77,235,174, 89,179, 38, 3,111, 86,137,253,149,124, 88,191,126,253,204,121,243,230,109,158, 62,125, 58,
-182,109,219,134,196,196,196,185,248, 51, 23, 15,147,150,150, 54,123,203,150, 45, 24, 51,102, 12, 22, 46, 92,184,166,113,227,198,
- 57, 0,134,151, 37,232,232,232,232,206,229,114, 17, 18, 18,146, 3,224, 85, 5,223,159, 20, 18, 18,146, 76, 81, 20, 92, 93, 93,
-107,149,183,162,157,157, 93,109,185, 92,142,248,248,120,160,224,141,185, 20,162, 18, 18, 18,136, 64, 32,128,155,155, 91,157,138,
-118,222,214,214,118,246, 79, 63,253,196,125,242,228, 9, 58,119,238, 28,119,245,234,213,174, 0, 76, 93,210, 67,130,131,131,219,
-118,236,216,241,249,133, 11, 23,240,221,119,223, 81, 13, 27, 54,156, 84,145,166,167,167,231,196, 79, 62,249, 4,155, 54,109,194,
-246,237,219, 39, 1, 56, 92, 98,149,253, 91,182,108,153,182,125,251,118,140, 29, 59, 22, 94, 94, 94,195,203,211,139,142,142,158,
-211,161, 67,135,224, 23, 47, 94,152, 53,226,129,153,235,119, 12, 12, 12,172,173, 82,169,176,107,215,174, 87,181,107,215,190,127,
-248,240,225,153,120,243, 7,251,247,163, 71,143, 98,196,136, 17,104,216,176,225, 46, 0, 67,205,185, 45,195,194,194, 98, 47, 93,
-186,196,240,249,124,120,122,122,162,119,239,222, 24, 54,108, 24, 26, 52,104, 0,157, 78,135,163, 71,143, 50,143, 31, 63,142,211,
-106,181,102,229, 82, 74,127,113,229, 68,100,228,243,155, 33,119,175,233,185, 28, 26, 30,174,118,248,168, 75, 35,124, 58,176, 53,
-154,248, 86, 67,116,138, 10,151, 46, 93,208, 71, 70,190,186,109, 78,143, 67,147,102,248,211,135,183,158,132,220, 48,240,184, 20,
-124,125,234, 98,254, 87,179,109,151, 47,154, 99, 83,183,150, 7, 30,190,206,198,133,243,103,244, 9,113,177,151,223, 85,143,195,
-171, 0, 95, 38,164,164, 28,154,134,145, 22, 42, 56, 5, 29,105,234,249,251,123, 59,187,184,224,212,169, 83,160, 45,232, 17,122,
- 21,224,203,100,249,181,224,121,121,121, 48,233,213,246,241,241,241,240,244,196,233, 83,167,192, 97,152,176,246, 22, 38, 24,125,
-150, 95, 13, 93,168, 75, 1,234,207,170, 67, 94,187,186,147,143,173,181, 20,119, 31,190,132, 70, 79,238,253,154,137,119,154,143,
-236, 47,100, 60, 42, 89,117,184,122,219,182,109,205,127,250,233,167,174, 51,103,206,148,141, 26, 53, 10, 34,145, 8, 74,165, 18,
-238,238,238, 48, 26,141, 56,123,246, 44,130,130,130,242, 24,134,185,128, 55,211, 6,116, 65,145, 94, 26,231, 94, 65,156,239,183,
-148,205,143, 13, 26,244, 86, 52, 1, 64,246,146,177, 74,175,161,221,187,241,240,141,254,251,206,133, 80,159, 15,109, 79, 55,241,
-169, 14, 0,112,118,118,134,149,149,149,197,154,111,129,191, 92,179,104,181,110, 82, 82,210,179,164,164,164,148,113,227,198,249,
-154, 26,190, 11,133, 66,117, 65, 36, 43,179,180,109,204, 40,167, 14,192,103, 63,253,244,211,241,236,236,236,115, 95,126,249, 37,
-150, 47, 95,142, 19, 39, 78,180, 5,112,179,146,251,110,204,204,204,204,186,119,239,158,115, 29,191,198,168,233,196, 67,187, 5,
- 47, 64, 8,129,189,132, 32, 55, 43, 3, 15, 30,132, 32, 55, 55,247,174, 37,229,212,233,116, 89, 41, 41, 41, 14, 78, 78, 78,200,
-200,200, 64, 90, 90, 90,161,201,202,204,204, 68, 70, 70, 6,161,168, 55,114,182,148,167,169, 72, 73, 73, 81,134,135,135, 11,156,
-171,215, 65, 45, 39, 62, 2,191,122, 6, 16, 2, 15, 59, 26,185, 57, 89,184,125,251, 54,178,179,179,175,148,165,201, 48,204, 23,
-195,135, 15,231, 0, 24,249,229,151, 95,218, 1,104, 56,123,246,236, 11, 40,209,179,144,203,229,174,223,187,119,111, 61, 83, 21,
-227,156, 57,115,214, 1,248,233,239,186,150,236,237,237,191, 56,117,234,148, 92,167,211, 97,227,198,141, 88,183,110,221, 78,188,
-153,168,242,212,230,205,155,183,208, 52, 61,121,202,148, 41,152, 48, 97,130,164,105,211,166, 51, 19, 19, 19,127, 45, 77, 51, 62,
- 62,126,126,147, 38, 77, 22,166,164,164,124,107,150, 89,126,241, 98,124,147, 38, 77,230,167,164,164,172, 42,239, 28, 73,165, 82,
-169,209,104, 68,100,100,100, 38, 80,102,251, 14,117,100,100,100,188,209,104,116,151, 72, 36,118, 21, 93,159,153,153,153,223, 54,
-109,218,116,113,114,114,242,121, 0,203, 74, 49,228,161,137,137,137, 1,211,167, 79,159,186,114,229,202,254, 73, 73, 73, 7, 42,
-210,140,142,142,254,182, 99,199,142, 11,158, 63,127,190, 27,101, 87, 1,111, 94,178,100,137,110,239,222,189,147, 34, 35, 35, 87,
- 84,160,121, 50, 45, 45,237,164, 5,231,183,172,245, 11, 53, 57, 28,206,236,149, 43, 87,210,219,182,109, 3, 33,100,141,209,104,
- 44,171,156, 15,127,255,253,247, 61,173, 91,183, 30,117,248,240, 97, 81, 64, 64,192, 4,141, 70,179,191,162,235, 83,169, 84, 30,
- 61,124,248,112,255,135, 15, 31,186,143, 26, 53, 74,228,237,237, 13,157, 78,135,196,196, 68,108,219,182, 77,253,248,241,227,184,
-172,172,172,163,150, 60, 67, 12,218,156,161,183, 46, 29,219, 31,245,226,113,203, 14, 61,250,217,106,117,238, 16,166,115,144,149,
-158,132,179, 39,143,102, 70, 70,190,186,173, 84,102, 13,181, 68, 83,167,201,254,248,246,229,227, 7,226, 34,195, 91,180,235,216,
-211, 86,173,245,132,144, 79, 35, 61, 57, 30,103, 79, 29,203,136,140,124,125, 93,173,215,140,126, 87,207,121,142, 23,150,113,146,
-130,198, 77,236,211, 8, 98, 91,247, 7, 60, 96, 99,107, 64,236,224,236,204, 47,184,119, 32,203,111,243,104,150,102, 50, 32,168,
- 83, 80, 75,165, 84, 42,193, 3,180, 99, 0,158,163,163,163, 24, 0,158, 63,127, 14, 73,126,173,134, 69,229,204, 3,164,146, 34,
-186, 52,160, 76,231,162, 90,109, 43, 41, 5, 0,113, 73,233,208,234,203,253,221,120,223,217, 81,196,112,237,168,140, 0, 31, 64,
- 23,153, 76,182,124,225,194,133,107,238,222,189,187,166,119,239,222,107,132, 66,225,242,130,131,205, 47,231, 68,252,109,154,205,
-220, 96,215,177, 22,117,173, 91,109,138,153,216,214,214, 56, 58, 80,170,237,212,169,211,150, 42,150,179, 42, 55,203, 95,169,121,
- 76,175,215, 19,228, 87,219, 29, 67,217, 85,130,243,138, 44, 79,138,137,137, 33, 5,127, 91, 82, 78,135, 33, 67,134, 48,185,185,
-185,100,240,224,193, 4, 21, 15,225, 83,174,166, 80, 40,236,216,174, 93, 59,125,114,106, 6,121,246, 58,158,220, 9,126, 74,206,
- 93,186, 69, 14, 28, 61, 69, 54,109,217, 78, 26, 52,104,160, 5,224,105,137, 38,151,203,237,212,177, 99,199,244,228,228,100, 18,
- 30, 30, 78,174, 93,187, 70,142, 28, 57, 66,182,111,223, 78,126,248,225, 7, 82,189,122,245,100, 0,206,150,104,138,197,226,126,
- 31,124,240,129, 62, 43, 71, 73, 34,227,211,201,163,240, 72,114,243,222, 35,114,246,210, 77,242,235,254,195,196,223,223, 95,109,
-134, 38,135,195,225,108, 58,112,224, 64, 14, 33,132,244,235,215, 47, 14,197, 19,169,214,252,226,139, 47, 82, 8, 33,100,213,170,
- 85,233, 40,189, 33,252, 95,125, 45,245,168, 86,173,218, 51, 62,159,127, 10,192,200, 10,182,251,152,203,229,158,112,113,113,185,
- 15,224,163,119,112, 31,245,118,114,114,186, 3,160,162, 17, 14, 76,235,125,248, 47,185,223,255, 10,205, 78, 92, 46,247, 26, 80,
-254, 32,194, 69,158,215,223,112, 56,156,211, 0, 58, 91, 88,206,186, 14, 14, 14,131,109,109,109, 63,183,181,181,253,220,201,201,
-105,176, 64, 32,168, 91,149,125,183,175,219,165,143, 71,227,190,191, 87,111,216, 43,218,163, 81,239,104,175, 38,253,126,183,175,
-219,165, 79, 85, 53, 61,155,244, 59,230,209,168,119,140, 71,163, 62, 81, 53,155,245,251,221,193,167,203, 7,239,242, 28,141,172,
- 6,183,174, 53, 97, 32,215, 22, 16,114,109, 1,233, 82, 19, 76, 75, 27,248, 55, 7,228,221,187,116, 89, 75,140,198,181,253, 63,
-252,112,109, 29,192,158, 0,156,146, 83,105,154,141, 1,171,194,109,251,245, 91, 91, 11,112,232, 10, 72,218,183,109,187,134, 24,
-141,107,135,127,252,241, 90, 15,192,165, 52,189,178, 52, 9,192,169, 6,184, 21,213,117, 0,106, 15,244, 66,192,188, 62, 94,132,
- 92, 91, 64,150, 12,242, 38, 77,156, 49,178, 2,205,178, 34, 69,239,109, 68,171,180,182,226, 21, 33, 45,120,184,174, 40,248,148,
-190,133,139,240,173,107,182,112,133,119,151,218, 84,120, 79, 31,110, 6,242,187, 36, 75,255,133, 15,201,221, 90,173,150,168,213,
-106,162, 84, 42, 73, 94, 94, 94, 73, 3, 85,104,200, 18, 18, 18, 72, 92, 92, 28,137,137,137, 33, 81, 81, 81, 4,127,182,189, 49,
-187,156, 86, 86, 86, 63, 13, 26, 52,200,200,227,241, 54,189,141,125,183,179,179, 91, 17, 24, 24,168,251,254,251,239,201,239,191,
-255, 78,126,252,241, 71, 50,101,202, 20, 82,175, 94, 61,141,141,141,205,208,202,104,186,184,184,204,247,241,241, 73,223,185,115,
- 39,249,245,215, 95,201,134, 13, 27,200,215, 95,127,109,116,119,119, 79,146,203,229,221, 43,163,233,228,228,180,163, 77,155, 54,
-186, 29, 59,118,144, 11, 23, 46,144,125,251,246,145, 47,190,248,130,248,250,250,106,164, 82,233, 0, 51, 53, 57, 92, 46,119,237,
-196,137, 19,147,220,220,220, 78,149, 88, 38,241,247,247,191, 63,124,248,240, 4, 0,115,254, 69,215, 39,171,201,106,178,154,127,
-129,209, 26,230,134,106, 4,224, 72,248,252,143,219,183,109,187,134, 15,124,108,169, 41, 18,113, 56, 3, 91, 7, 6,174,225, 3,
- 67, 77,235,138, 56,156,129,237,219,182, 93,195,227,112, 70,148,165, 87,158, 38, 1, 56,124, 46,119, 78,235,150, 45,215,114,129,
-175, 76,243, 58,213,164,194,190,232, 81,157,180,245,164, 94,142,112,130,228, 95,108,180, 74,165, 50, 70,171, 48,128,240, 23, 92,
-132,239,139,230, 63,229,166,174, 83, 96,152,142, 89, 16,209, 58,134,252, 81,212,235, 84,178,156,226,183,188,239,245, 29, 28, 28,
-206,212,169, 83, 39,181, 70,141, 26, 9,182,182,182,251, 1,184, 87, 81, 51,192,197,197,229, 23,103,103,231, 23,174,174,174, 15,
- 29, 28, 28,214, 35, 63,235,124,165, 53,121, 60, 94,160,179,179,243, 21, 47, 47,175, 44, 79, 79,207,100, 7, 7,135, 3,165, 68,
-178,204,209,116, 69,233, 15, 21,126,193, 50,246, 71,135,213,100, 53, 89,205, 98, 6,166, 91, 45,172,236, 90, 19,134,174, 53, 97,
-236,230,133,245, 69, 13, 74,111, 64, 92, 89, 83, 52, 26, 16,150, 92,191, 34,189,138, 52, 9,192,105, 5,200, 74,110,211,211, 29,
-254,102,106,190,239, 17, 45,211,115,190, 88, 68,139, 91, 73, 65,195, 95, 80,200,247, 69,243,159,194, 75,148,211, 24,185, 8, 43,
-222,226,119,170,222,242, 62, 60, 74, 75, 75,251, 32, 45,237,173,246, 77,120,146,148,148, 52,242,109, 10,234,245,250,187,201,201,
-201, 29,222,130, 84, 89, 93,175,117, 48,179, 91, 54, 11, 11,203,127, 7, 10, 48,226, 21,230,118,169,139,141, 92, 35,232,179,175,
- 17, 95,162, 75,158,138,170,140,102, 62,198,221,165, 60,227,169,202,150,243, 79,242,222,208,136,195, 83,234,191,115,218, 18,145,
-223, 70,203,252, 60, 90, 44, 44, 44, 44, 44, 44, 44,239,142,139, 47,216, 23,177,247,128, 83, 40, 30,125, 59, 85,196,136,150, 25,
-250,180,164, 39, 69,101,194,167, 23, 89, 77, 86,147,213,100, 53, 89, 77, 86,147,213,252,207,105,154, 40,107,236,212,103, 37,254,
-175, 84, 47,190,127, 2, 85,105,163,245, 87, 26, 48, 86,147,213,100, 53, 89, 77, 86,147,213,100, 53,255,123,154,239, 51,101,246,
- 58,100,171, 14, 89, 88, 88, 88, 88, 88, 88, 88,170, 70,153, 81, 55,214,104,177,176,176,176,176,176,176,176, 84, 13, 87,228, 15,
- 81,117, 10,127, 14, 85,181,131, 53, 90, 44, 44, 44, 44, 44, 44, 44, 44, 85,167, 23,254,236,109, 88, 44,186, 69,179,199,134,133,
-133,133,133,133,133,133,165,202,140, 47,242,201,166,119, 96, 97, 97, 97, 97, 97, 97, 97,121, 75,152,215, 51,242,228,201,147,132,
- 61, 86, 44, 44, 44, 44, 44, 44, 44,239,138,247,212,139,152,162, 88,197, 70,249, 96,123, 29,178,176,176,176,176,176,176,176, 84,
-157, 29, 69, 12, 87,177,121,172,209, 98, 97, 97, 97, 97, 97, 97, 97,169, 26, 38,131,117, 10, 37,134, 84,163, 1,182,202,144,133,
-133,133,133,133,133,229,221,242,158,123,145, 29, 5,211, 27,195, 37,153,122, 29,118, 40,216,193, 14,236,169,102, 97, 97, 97, 97,
- 97, 97,121, 7,188,207, 94,196, 21,165,180,209, 98, 97, 97, 97, 97, 97, 97, 97, 97,169, 58,227, 75,124, 2,200,111, 12, 79,177,
-199,134,133,133,133,133,133,133,133,229,173, 24,173,162,236,248, 59, 6,149,102, 97, 97, 97, 97, 97, 97, 97,249, 79, 66, 8,249,
-203, 51,195,179, 35,155,179,154,172, 38,171,201,106,178,154,172, 38,171,249, 95, 96, 60, 74,100,133, 7,216,244, 14, 44, 44, 44,
- 44, 44, 44, 44, 44,111,195,100,237, 40,237,127,118,172, 67, 22, 22, 22, 22, 22, 22, 22,150,191, 8, 54,162,197,194,194,194,194,
-194,194,194, 82, 53,118,160,148,172,240,172,209, 98, 97, 97, 97, 97, 97, 97, 97,121,123,102,235, 13,216,170, 67, 22, 22, 22, 22,
- 22, 22, 22,150,170, 49,190,172,255, 41,148,221,115,224,162, 5, 95, 80,153,222, 7, 23, 89, 77, 86,147,213,100, 53, 89, 77, 86,
-147,213,252,207,105, 86,164,125, 17,239, 31,165, 54,134,255, 59,242,104,177, 93, 95, 89, 77, 86,147,213,100, 53, 89, 77, 86,147,
-213,252,183, 99, 26,130,199, 52,185, 2,249,121,180,216, 54, 90, 44, 44,239, 57,228, 48, 56,200,244,241, 2, 33,110,224, 8, 18,
-145,248,232, 21,181, 24, 76,149, 53,147,253, 61, 33,214, 59,195, 32, 74, 69,242,195,215, 85,213,100, 97, 97, 97,249, 23,147,136,
- 50,218,104,177, 70,139,133,229,125, 39,213,215, 27, 92,172, 0, 13, 87, 16, 93, 4, 28,253, 87, 0, 79, 31, 87, 89,147,207, 44,
-131,145,118, 7,209, 61,135,147,207, 74,224,217, 83,246, 96,179,176,176,176, 88,198,223,222, 24,158,199,227, 37, 3, 96, 68, 34,
-209, 81,176,163, 92,179,252,181,184, 22, 92,103, 76,193,117,103, 9, 50, 46,151,187, 80, 34,145, 92, 22, 10,133, 41, 66,161, 48,
- 69, 42,149, 94,230,114,185, 11, 1,200,254, 41, 59, 72,126,169, 39, 1,109,252, 64,171,103,170,157,125,148,229,164,212, 24,189,
- 65, 27,122,146,157,117,101, 85,210,228, 82,221,212, 58,198,227,215,123, 74,103,133,214,224, 7,130, 42,105, 22,193,134,207,231,
-159, 5,224,192, 94,158,255, 78,252,128,166, 77,185,220, 89,190, 64, 39,128, 29, 79,151,133,229,111, 55, 90,122,189,222, 41, 45,
- 45,141,218,179,103, 79, 95,107,107,235, 8, 46,151, 59, 15, 0,255,191,114,192,101, 50,217, 45, 43, 43,171,100,107,107,235,100,
- 43, 43,171,144,138,230,255, 75,241,118,116,116,140,182,179,179,123, 94,116,166, 99,131,143, 90,213,105, 61,114,145,189,127,191,
-246, 85,212,231,115,185,220,121,214,214,214, 17,123,246,236,233, 27, 31, 31, 79,233,245,122, 39, 11,182,111,103,107,107, 27,118,
-247,238,221, 5,105,105,105,237, 99,239,236,116, 76,186,187,221, 49,250,202,218, 14, 65,167, 55, 45,176,177,177,126, 10,160,221,
- 63,226, 72,170, 25,103,208,156,142, 79, 18,149,146,196, 28,189,115,112,148, 82, 14,112, 58, 64, 91,133,151,152,108,198, 25, 32,
-157, 66,227, 84,210, 91, 25,142,206,215, 95,105,172, 64,211, 29,161,166, 92,170,252,192,161,233, 73, 12,195,116,229,243,249,159,
-179,143,223,127, 39, 2,154,110,125,171,111,223,101,115, 26, 52,152,234, 11,244, 41,195,108, 81, 0,166,249,250,250,158, 1,240,
-241, 91,252,250,239,124,124,124,226, 1, 76,103,207, 4,203,223, 76, 99,211, 11, 62,138,180,209,178,200,104, 13,244, 66,235,161,
- 53,113,117,176, 23,114,135,212, 68,222,136,154,184, 49,192, 11,157, 42, 83, 26,123,123,123,180,107,215,142, 19, 31, 31, 47,254,
-226,139, 47, 22,137, 68,162, 72, 0,221, 43,163, 37, 22,139,131, 36, 18, 73, 44,151,203, 45, 86, 22,137, 68, 18, 36,149, 74, 99,
-185, 92,110,231,162,243,229,114,249, 45, 43, 43,171,100,185, 92, 30, 82,134, 17, 10,178,178,178, 74,150,201,100, 65, 69,231,115,
-185,220,206, 50,153, 44, 78, 46,151,151,156,223, 73, 46,151,199,150,156, 95, 22, 60, 30,207, 61, 54, 54,214, 41, 46, 46,206, 73,
- 32, 16, 56, 23,157, 31, 19, 19,227, 20, 27, 27, 91,108,190, 37,112,185,220, 78, 82,169, 52, 86, 34,145, 4,149, 54,191,228, 62,
-149, 69,145, 99,215,201,156,249,150,154,172,110,221,186,221, 72, 76, 76,244,176,177,177,177, 41,186,192,206,218,166,251, 47, 59,
-183,204,236,215,179,219, 36, 71,191, 15,235, 87, 82,191,187, 72, 36,138,252,226,139, 47, 22,197,199,199,139, 91,182,108,201,161,
-105,139,222, 39,186,244,235,215,239, 88,114,114,114,181,134, 13, 27,114, 12, 6, 3,158, 28, 95, 8,201,195,207, 33,138,220,134,
-234,226, 84,110,196,133,149,238,221, 58, 52, 61,134,119,220, 24,148, 28,246,227,131, 98,218, 49,132, 56,134,197,171, 29,123,245,
- 29,196,125, 16,171,114,212, 27,141,118, 0,167, 3,217,229, 41,172,148, 38, 87,223,150, 33,196,249,143, 40,158, 99,199,193, 83,
- 57,151,162,184,142,122,163,209, 30, 52,218, 87, 70,179,232,229,207,225,112,102,174, 93,187,150, 6, 48, 5,128,224,191,244, 20,
-110,238,134,106,157,106,115,238, 53,118, 69,235,183, 40, 27, 80,112,191,123,255, 83,246, 83,203, 48,207, 14,188,126,125,110, 68,
-237,218,189,231, 52,104, 48,166, 20,179, 69, 1,152,179,114,229,202,145, 79,158, 60,113,172, 89,179,230,132,183,244,210,191, 97,
-229,202,149,179,159, 60,121,226,230,229,229,181, 4,108,250,162,127, 21,132, 16, 1, 33,164, 35, 33,164, 23, 33,164, 51, 33,164,
-121,193,223,205, 10,166, 94,132,144, 46, 37, 62,155, 21,108,107, 90, 30, 88,134, 70,175,146,219, 21,217,166,228,255,197,254, 46,
-197,104,245, 66,126, 91,173, 94,197,118,224,228,201,147,164,232,103, 73,134,120, 97,241,212, 86,213,148, 97, 39,246,145,188,216,
-215, 36, 51,252, 1,121,176,227, 91, 50,181,153,163,114, 88, 77,124,103,249,241, 34,228,230,205,155,228,201,147, 39, 36, 47, 47,
-143,188,120,241,130, 4, 6, 6,170, 36, 18,201, 31, 0,188, 44, 17,147,203,229,201,127,252,241, 7,233,214,173, 91,182, 76, 38,
- 91, 99,186,185,172,172,172,146,111,222,188, 73,186,117,235,150, 45,151,203, 55, 0,224, 0,192,128, 1, 3, 82, 8, 33,196,209,
-209, 49,161, 52,189,126,253,250,101, 18, 66,136,181,181,181,169,170,137, 35,151,203, 55, 76,158, 60, 57,239,254,253,251,196,214,
-214,214, 52,159,182,178,178, 90, 51,101,202,148,188,224,224,224,162,243,203,197,206,206, 46,214,104, 52,146, 19, 39, 78, 16, 39,
- 39,167,194, 50,216,218,218,198, 26,141, 70,114,236,216,177, 50,203, 86, 94,160, 64, 38,147,173, 30, 49, 98, 68,110, 84, 84, 20,
-177,183,183, 79, 46, 50,127,205,168, 81,163,114, 99, 98, 98,136,131,131,131, 89,101,180,183,183, 79,190,117,235, 22,233,223,191,
-127, 78,209, 99,106,111,111,159,124,251,246,109,211,252,213,230, 60,200,220,220,220, 38, 56, 57, 57, 37, 56, 57, 57, 37,216,216,
-216, 44,119,117,117, 77, 74, 77, 77, 37,132, 16, 82,171, 86,173,148,162,145, 44,167,128,190, 51,182, 29,190,125,247,218,227,244,
-212, 6, 93, 39,173,182,110,208,207,218,130, 99,224, 37,145, 72,254,104,223,190,189, 42, 54, 54,150, 40, 20, 10,242,240,225, 67,
-114,243,230, 77,242,242,229, 75, 2,192,156, 62,182,114,153, 76, 22,175,209,104, 24,141, 70,195,164,166,166, 26, 83, 82, 82,140,
-225,107, 92, 9,249,153, 87, 56,101, 29,235, 67,146,174,173, 96,172,100,146, 56, 0,242,119,246,224,217,226,239, 78,182,251, 28,
-120,186,208, 35,252,218,202, 30,122, 18,117,137,236, 27,227,168,191, 58,163, 90, 4,249,193,247,127,100,187, 95,245, 74,105,254,
-224,183,239,225,215, 30,207, 54, 45,153,166,143,142,142, 38,179, 70,245, 48,156,159, 90,237, 21,217,230,123,184, 50,154, 69, 24,
-250,209, 71, 31,229,197,196,196, 16,127,127,127, 5,135,195, 25,251, 95, 50, 89, 93,188, 5,241, 15,127,157,197,244, 9,144,164,
-191, 37,179, 21,224,228,228,148,182,123,247,110, 34,151,203, 83,254, 65,102,139,242, 5,250,238,105,208,224, 24, 51,112,160,113,
- 79,131, 6,199,124,129,190, 5, 6,139, 2, 48,119,213,170, 85,193,122,189, 62,120,215,174, 93,193,125,251,246, 13, 6, 48,171,
-138,223,249,253,119,223,125, 71,244,122, 61,217,181,107, 23,233,219,183, 47, 1,176,209,220,141,101, 50, 89,157,250,245,235,239,
-245,247,247,143,105,216,176,161,214,207,207, 79,237,237,237, 29, 21, 16, 16,176, 91, 40, 20,122,129,229,111,161, 60, 47, 66, 8,
-105, 62,119,238,220,121, 0,200,220,185,115,231, 17, 66,122, 21,248,137, 94, 69,255, 46,249,105, 50, 79,166,255, 75,211, 48, 77,
-165,105,150,246, 29, 37,190, 7,101, 68,178,198, 23,148,251,207,157, 59,121,242,100,251,147, 39, 79, 94, 45,185,115,131,106,162,
-213,212, 86,213, 84,170,212, 68,242,248,219,207,201,229,142,238,228,102, 7, 23,242,124,230, 71, 36,241,215, 13,228,179, 70,182,
-202,129, 53,209,209, 82,163, 21, 28, 28, 76,130,131,131, 73, 72, 72, 8,137,140,140, 36,217,217,217,228,224,193,131, 70,123,123,
-123,149, 80, 40, 92, 9, 64,108,142,152,149,149, 85, 50, 33,132,104, 52, 26,178,124,249,114,117, 65,164,202,217,218,218, 58,153,
- 16, 66,178,178,178,200,202,149, 43,213,214,214,214, 15, 1,184, 57, 56, 56,196,190,126,253,154, 56, 59, 59,151,106,102,108,109,
-109,147,159, 61,123,102, 50, 78,213,108,109,109, 31, 31, 63,126, 92, 71, 8, 33,113,113,113,196,206,206, 46, 25,128,179,189,189,
-253,131,147, 39, 79,234, 8, 33, 36, 33, 33,193, 52,223, 44,163,165, 82,169,200,249,243,231,139,149,193, 52,255,204,153, 51,197,
- 12,152, 25, 56, 91, 91, 91, 7, 31, 60,120, 80,107, 52, 26,201,227,199,143, 77, 38,209,217,198,198, 38,228,240,225,195, 90,163,
-209, 72,194,195,195,205, 54,131, 53,106,212, 72, 33,132, 16,131,193, 64,182,109,219,166, 49, 29, 83,211,124,173, 86, 75,182,110,
-221,170,177,178,178, 10, 6, 80,110,244,205,193,193, 33, 65,171,213,146,172,172, 44, 18, 24, 24,152,119,243,230, 77,146,147,147,
- 67, 8, 33,164, 70,141, 26, 41, 0,224,211,126,236, 55,119, 95,228,229,124, 50,123,203, 33,175,230,195,190, 61,119, 47, 62,238,
-167,223,131,130, 29, 2,250,245, 48, 39,168, 41, 20, 10, 87,186,186,186,170,175, 95,191,110,212,233,116, 36, 38, 38,134,132,132,
-132, 20, 94, 99,143, 30, 61, 50,203,104,113,185,220,133,119,239,222,213, 25,141, 70, 38, 45, 45,205,152,146,146, 98, 76, 73, 73,
- 49,148, 52, 90,228,103, 30, 73, 59, 51,142,156,218, 49, 93,203,231,243, 23,190,155,104, 22, 56,100,187, 79, 63,178,221, 39,120,
-247, 8,135,180,220,144,253,132, 92,152, 78, 94,125, 83,147, 44,236, 33,207,101,182,251, 4,147,237,190, 3,201,226,246, 92,139,
- 52,119,248,245, 33,219,125,130,191, 27,228,153,254, 32,248, 62,185,122,245, 42,217,186, 97, 21,153,218,165,154,130,217,238, 19,
- 76,126,240,235,111,137,102, 81,132, 66,225,139, 27, 55,110,144,107,215,174,145, 37, 75,150, 16,137, 68, 18,243, 54,162,122,228,
- 7,111, 79,242,163,119,123,178,179,174, 43,185,210,254, 31,215,193,167,185, 27,170,117,245, 22,196,165, 61,248,157,144,140,151,
- 36,105,141, 63,233,225,195,171,170,217, 10,112,114,114, 74,141,138,138, 34, 73, 73, 73,100,221,186,117,196,202,202,234, 31,109,
-182,124,128,126, 0,230,173, 94,189,186,208,100,109,217,178, 37,248,209,163, 71,193, 30, 30, 30,167,171,240, 93, 27, 87,175, 94,
- 93,104,178,182,108,217, 66, 30, 61,122, 68, 60, 61, 61, 99, 43,218,112,196,136, 17,146, 86,173, 90, 5, 15, 31, 62, 92,185,123,
-247,110, 18, 21, 21, 69, 30, 62,124, 72, 86,175, 94, 77, 22, 45, 90, 68,126,254,249,103,210,191,127,127, 69, 96, 96,224,221,129,
- 3, 7,138, 44,140, 40,112, 11,162, 48, 2, 66, 8,143, 16, 98, 50,154, 92, 0, 60,211,203, 63, 75,113,163, 85,150, 23, 41,203,
- 76,149,101,176, 74, 46, 43,199,136,149,107,216,204,248,190, 66, 83, 85,198,117, 80, 44, 34,113,165,119,239,222,237,223,248,241,
- 33, 88, 58,254,139,111, 68,145,187,215, 33,249,224,102,112,178,146,193,203, 77,135,230,198, 41,232,111, 28,199,200,150, 45,197,
- 98,138, 90,102,233, 1, 21, 8, 4, 16, 8, 4,224,243,249, 80, 42,149, 72, 72, 72, 64,155, 54,109,232,144,144, 16,209,132, 9,
- 19,166,139,197,226, 24, 0, 31, 86,120, 55, 83,249, 17,233, 91,183,110, 97,220,184,113,194,189,123,247, 54,116,116,116, 12, 53,
- 26,141, 2, 0, 8, 15, 15,199,144, 33, 67,132,251,247,239,175,231,230,230, 22,162,211,233, 36, 66,161, 16, 28, 14,167, 76, 61,
-129, 64, 0,189, 94, 47,172, 91,183,238,195,208,208,208,128,222,189,123,243,162,163,163,241,250,245,107,232,245,122,129,183,183,
-247,163,144,144,144,134,189,122,245,226,197,198,198, 34, 58, 58,186,176, 28,230,148, 87,171,213, 66, 40, 20,162,104,149, 22, 69,
- 81,208,104, 52, 16, 8, 4,102,107,113,185,220, 78,190,190,190,143, 66, 67, 67, 27,247,235,215,143,127,255,254,125,196,197,197,
-193,104, 52, 10,252,252,252, 30,133,134,134, 54,234,219,183, 47,255,225,195,135, 72, 78, 78,134,185, 85,104,166,245, 66, 67, 67,
- 49,124,248,112,193,217,179,103, 27,185,186,186, 62, 52, 24, 12, 2, 0,120,244,232, 17,134, 12, 25, 34, 56,119,238, 92,227,234,
-213,171, 63,172,160, 42,145, 3, 0,122,189, 30, 19, 38, 76,144, 90, 89, 89, 33, 54, 54, 22, 12,195,192,104, 52, 2, 0,210, 51,
-211, 31,133, 62,122, 28, 62,114,232,160,246, 42,157, 70,115,251, 94, 80, 88,173, 26,158,238, 20, 69,106, 84, 80,212, 15,165, 82,
-105,204,154, 53,107,102, 68, 69, 69, 9,125,125,125,233, 87,175, 94, 33, 55, 55, 23,124, 62,191,240, 26, 51,119,191, 5, 2, 65,
- 7,127,127,127,174, 90,173, 6,195, 48, 0, 64,104,154, 46,245,100,136,178,110,192,207,217,192, 19,139,197, 29,222,201, 19, 41,
-199,223, 30, 12,186, 70,167,106,133, 66, 27,119,185,204,213, 27,136,185,134,154,142, 66,112,104,142,232,254,107,165, 20, 32, 93,
-225,145,102,111,153, 38,211,245,117,138, 86,168,183,171, 39,115,115,247, 64,122,122, 58,170,215,242,133, 90,224, 40,184,245, 82,
- 33, 3,101,161,230,159,180,173, 91,183,174, 75,157, 58,117,144,150,150,134,198,141, 27,195,214,214,214, 22, 64,215, 74,155,172,
- 93,158, 66,228,160, 53, 64,175,129,145, 90, 2, 61,119, 5, 94,166, 54, 38,219, 27,243,254, 73, 38,203, 74, 38,184,179,255,192,
-193,106,246, 30,126,192,169, 79,224,108, 35,196,206, 73,141,237, 28,173,133,199, 42,105,182, 2,156,157,157, 47,221,189,123,215,
- 65, 36, 18, 33, 36, 36, 4,254,254,254, 88,183,110,157,163,173,173,237,181,127,136,217, 34,225,192,137,239, 30, 62,220,181, 55,
- 34,226,228,136,218,181,123, 15,247,246, 94, 62,241,227,143,199, 78,155, 54, 13,171, 86,173,194,177, 99,199,208,186,117,107,140,
- 31, 63, 94, 31, 19, 19,179,167,146,223,179,121,205,154, 53, 83,167, 79,159, 94, 82, 83, 23, 29, 29, 93,110,109,139,191,191,191,
-251,139, 23, 47,226,103,206,156,217,120,239,222,189, 98,137, 68,130,172,172, 44,252,248,227,143,152, 55,111, 30, 40,138, 2, 33,
- 4, 63,255,252,179,100,204,152, 49,205, 35, 34, 34,226, 61, 61, 61, 43,108,214, 65, 8,161, 8, 33, 34, 0,146,130, 73, 10, 64,
-178,127,255,126,235,126,253,250, 89, 21,204, 19, 23, 76, 66,176,148,164, 84, 47, 82,228,183,242,100,137,227,221,187,228,188,146,
-203, 8, 33,189,203,211,176,208, 64,151,246,125,167,202, 51, 91, 69,127,129, 58,148,234, 34,129, 6, 46, 94, 62,200,190,112, 24,
- 98, 46, 5, 49,167, 96,226, 82,160, 95, 61, 66,117, 17, 15,122, 66, 2, 42,107,180, 76, 19,143,199,131, 82,169,132,209,104,196,
-188,121,243,132,231,207,159,183,167,105,250,127, 21,233, 20, 53, 76,207,159, 63,135,159,159, 31,117,226,196, 9,231, 41, 83,166,
-136, 77,223,147,157,157,141, 58,117,234, 80,103,206,156,113,250,250,235,175,101,229,153, 25,138,162,192,231,243, 49,125,250,116,
-241,189,123,247,236,220,220,220,240,234,213, 43,100,100,100, 64, 38,147, 97,250,244,233,226,187,119,239, 58,186,185,185, 33, 42,
- 42, 10,217,217,217,144,201,100, 22, 27, 45, 62,159, 95,108, 27,138,162,160,211,233, 44, 50, 6,214,214,214,251,130,131,131, 29,
-173,173,173,241,240,225, 67, 24, 12, 6, 88, 91, 91, 99,234,212,169,226,224,224, 96, 71, 27, 27, 27,132,135,135,131, 16, 2, 43,
- 43, 43,139,202, 8, 0, 12,195, 32, 60, 60, 28, 53,106,212,192,181,107,215,156, 38, 78,156, 40, 50,205,127,249,242, 37,220,221,
-221,113,237,218, 53, 39,169, 84,186,175, 44, 45,134, 97,144,152,152,136, 39, 79,158,224,213,171, 87, 72, 77, 77, 69, 90, 90, 26,
-114,115,115, 97, 48, 24, 0, 0,146,220,156, 83,251, 15,157, 8, 21,139,197, 18,127,239,186, 30,143, 30, 63, 77, 17,139,197, 18,
- 79, 15, 15,111, 96, 49, 93,142, 33,252, 95,116,116,180,253,152, 49, 99,248, 73, 73, 73,200,204,204, 4,151,203,125,227,218, 18,
- 8,204,107, 10,100, 48, 24,252, 68, 34, 17,165,211,233, 10, 35, 96, 2,129, 0, 51,246, 41,225,191, 16,197,166,143, 55,164,128,
- 24,245,208,106,181,126,127,251, 47, 24, 64,129,210,214, 5, 69, 53,190,243, 74, 97,215,182,247, 80, 62, 94,159, 5, 24, 61, 64,
-115,209,161,129, 59,247,216, 35,133, 51, 8, 26, 64, 3, 95, 66, 42,238,249, 69, 0, 10,208,213, 1,168,166,231, 95, 24,236, 91,
-127, 52,137, 31, 31, 31, 15, 62,159, 15,161, 80,136,198,157, 6,112,247,135,234, 93, 64,161, 33,116,240, 49, 71,179, 88,216, 81,
- 44, 94,176,104,209, 34,105, 81,205,177, 99,199, 74,173,173,173, 23, 85,218,100, 41, 36, 45, 97, 32,211,159,196, 43,107, 44, 63,
-149,228, 23,145,162,242, 1, 33, 51, 1,125,163,183, 96,182, 58, 8,133,194,215, 0,218, 84,201,100,201, 5,183, 15, 28, 56, 88,
-205,174,122,190,201,130, 65, 13,240,196,112,113,180,193,206, 25, 29,237, 28,109,196,150,154,173, 0,103,103,231, 63,238,220,185,
-227, 32, 18,137, 16, 28, 28, 12, 62,159, 15,145, 72,132,250,245,235, 99,251,246,237,142,118,118,118,255, 40,179,181,242,225,195,
-221, 43,158, 60,121, 62, 55, 32,192,247, 67,169,212,110,242,240,225,214, 95,127,253,245,201,227,199,143,239,234,213,171, 87,218,
-189,123,247,214, 3, 56,108,105,196, 12,192,150,181,107,215, 78, 54, 25,183,175,191,254,250,231,227,199,143,175,232,213,171, 87,
-226,189,123,247,102, 2,216, 82,158, 64, 94, 94,222,241,249,243,231, 91,127,244,209, 71,166,255,113,227,198, 13,236,217,179, 7,
- 82,169,180,216,186,125,251,246,197,184,113,227,108,181, 90,109,185,191, 73, 78, 78, 78,157,239,220,185,227,143,252, 14, 94, 66,
-147,209,122,252,248,177, 77, 78, 78,142,141, 76, 38,179,113,117,117,149,155,204,214, 71, 31,125,100,195,229,114,219,128, 5, 21,
-121,145,162, 70,199,156,121,149, 93,223, 92,179, 85, 98, 86,153, 57,180,138, 25,173,222,189,123, 95, 69, 25, 61,169,116, 25,201,
- 16,194, 8, 49,135,130,132, 83,196,108,129, 1, 55, 59, 5, 84, 37, 58,240,150,246, 99, 40, 16, 8,192,225,112,160,213,106,145,
-158,158,110,145, 41,176,178,178,130, 76, 38,131, 74,165,130,193, 96,128, 72, 36, 50,153, 17, 88, 89, 89,129,199,227,129,199,227,
- 65, 36, 18,189, 17, 77, 42, 25,205,225,243,249,144, 74,165, 72, 76, 76, 68,116,116, 52, 24,134,129, 76, 38,131, 84, 42,133, 64,
- 32, 64, 66, 66, 2, 18, 18, 18, 64, 8,129, 84, 42,133, 84, 42,133, 37, 13,174,141, 70, 99,169, 63,254,122,189,222,162,136,150,
-193, 96, 64, 88, 88, 24, 98, 98, 98, 32, 18,137, 10,247, 85, 40, 20,226,229,203,151, 72, 74, 74,130, 68, 34,129,149,149, 21,172,
-173,173,205,214, 53,237,139, 92, 46,135, 88, 44, 70,102,102, 38,148, 74,101,225, 49,181,178,178,130, 84, 42, 69,118,118, 54, 82,
- 82, 82,202,221,119,163,209,136,132,132, 4,164,166,166, 34, 54, 54, 22,105,105,105,133,102,171, 32,106, 84,181,192, 78, 78, 14,
-210,211,211, 11, 35,145,101, 77,230,192, 48, 12,114,115,115,113,231,206, 29,138, 97, 24,100,101,101, 49,169, 73, 73,198,207, 18,
- 4, 56,182,248, 7,114,240,236, 3,245,254,211,193,170,163,127, 60, 81,109, 57,250, 72, 37, 10, 92, 98,120, 39,143,161,173, 1,
-214,208,243,186,165,229,233,133,169, 58,190,181,115, 64, 23,224,245, 25,128,230, 2, 34, 91,180,168, 87, 19,209,153, 70,233,179,
-100,173, 8, 20,186, 99,139,183,173, 89,154, 70, 94,215,212, 92,189, 48, 74,231,104,229,215,160, 9,146,147,147, 33, 20, 10, 33,
- 20, 10,209,180,117, 23,188, 78, 55, 74,158,198,171, 36, 32,232,102,150,230,159,212,146,201,100, 45,219,180,105, 67, 21,213,236,
-217,179, 39, 40,138,170, 15,192,215,162,135,220,198, 90, 2,232, 36, 45,192, 37,211,159, 38, 42,221,142, 61, 86,123,247,249,112,
-128,221,247, 23, 83,252,194,146, 52, 94, 32,250, 47, 64,116, 77,170, 96,182,218,203,229,242,147,155, 54,109,242, 18,137, 68,103,
- 0,180,173,140,136, 76,204,217,182, 96,242,208,106,182, 38,147,165, 87, 2, 92, 49,192, 19, 3, 92, 49, 92,156, 28,176,108, 92,
- 87, 59,137,136,119,212, 2,195,186,127,203,150, 45,142, 37, 77,150,105,106,220,184, 49, 22, 46, 92,232,104,103,103,183,239, 29,
-255, 88,118,179,182,182,222,219,165, 75,151, 59, 9,114,249,184,196, 38, 77, 4,127, 88, 91,103,119,206,206,182,246,124,252, 88,
-231, 3, 60, 2,176, 53, 46, 46,174,135, 5, 38,235, 99, 43, 43,171,224,206,157, 59,235,228,114,121,204,186,117,235, 62,155, 50,
-101, 10, 86,173, 90,133,249,243,231,255, 8,224, 83, 0, 95,197,197,197,185, 85,100,178, 0, 32, 41, 41,105,216,156, 57,115,210,
-210,210,210, 0, 0,245,235,215, 71, 86, 86, 22,102,205,154,133,207, 63,255, 28, 0,208,168, 81, 35, 16, 66,144,156,156,140, 53,
-107,214, 36, 39, 37, 37,141,174,224,217, 30,123,248,240,225,230, 58,157,206, 29,249,213,131,194,172,172, 44,171,140,140, 12,185,
- 78,167,147, 50, 12, 35,181,177,177,145, 1,144,140, 28, 57,146,251,244,233, 83, 63,131,193, 16,207,122,171, 63, 41,207,139, 84,
- 6,138,162, 78, 85, 37,114, 85, 90, 68,172, 12,202,143,104,245,238,221,155, 42,250, 89, 44, 98, 68,225, 97, 76,208, 53,216, 5,
- 52, 41, 22,205,146,112, 40,136,173,172,241, 58, 54, 26,124, 80, 79,222,150,209,202,204,204,196,103,159,125,166, 26, 54,108, 88,
- 58,195, 48, 3,204, 53, 5,214,214,214,176,182,182,198,211,167, 79, 73,255,254,253,147,215,173, 91,167, 42,106,180,158, 63,127,
- 78,186,117,235,150,178,104,209,162,188,242,140,150, 41,162,181,114,229, 74, 85,135, 14, 29, 82,159, 60,121, 66, 76,102, 74, 38,
-147, 97,205,154, 53,170,142, 29, 59, 38,223,191,127,159,152,230, 89, 18,209,162,105,186,208,104, 21,221,134,166,105, 48, 12, 99,
-145,209, 82, 40, 20,195,122,245,234,149, 28, 30, 30, 78, 76,251,105,109,109,141,117,235,214,169,186,118,237,154,252,228,201, 19,
- 98,154,103,101,101,101,182, 25, 52,125,191, 92, 46,135,149,149, 21,158, 62,125, 74,186,117,235,150,188,113,227, 70,117,209,249,
- 97, 97, 97,164,111,223,190,201,185,185,185,195,202, 51, 47,166,234, 60,131,193, 0,181, 90,141,180,180, 52,196,198,198, 22, 86,
- 29,170,164, 86, 61,134, 14,238,211, 80,165, 82, 41,159, 62,127, 17, 83,191,158,191,147, 74,165, 82, 70,199,196, 60, 7, 22, 51,
-229,104, 15, 8, 8, 8, 72,255,236,179,207, 84,153,153,153, 85, 54, 90, 2,129, 32,156,203,229,146,182,109,219, 18,173, 86, 75,
- 98, 99, 99,245,105,153,153, 6,223,111,191, 37, 79,102,204,160,196, 65, 65, 66,153, 76, 70, 21,104,210,175, 94,189, 98,196, 98,
-113,248,223,254, 36,162, 25, 23, 80,164,205,245, 23,121, 54, 93,251, 12, 17, 80, 73,247, 0, 93, 30, 32,180, 5,132,182,224, 74,
-237,241, 65,219, 70,156,221,119,114, 92, 64,152, 86,224, 11,221, 43,212,228, 17,103,128,105,123,225,185,218,182,205,192,169,130,
-140,140, 12,112, 56,156, 66, 83, 36,145, 74,209,249,195,145,244,207,247, 52, 46, 0,105, 13,138,227,110,193,189, 62,123,193,130,
- 5,252,204,204, 76,208, 52,253,167,166, 68,130,137, 19, 39, 10,173,172,172,230,155,253,240, 59,236,199, 7, 79,216, 2, 32,159,
- 63, 75, 82,187, 29,127,164,242,249, 98,229, 78,113, 64,163,230,152,208,193, 73,188,242, 84, 74, 64,104,172,170, 38, 96,156, 1,
-131,182,105, 37,204, 86, 91,185, 92,126, 42, 40, 40, 72,210,179,103, 79,172, 89,179, 70, 42, 22,139,207, 84,230,193,175,200, 51,
- 78, 89,186,241,151,228,135,235,187, 3, 58, 69,190,193, 42, 50,165,228, 49, 88,184,243, 82,182, 94, 79,134,154,171,169, 82,169,
- 70,125,250,233,167,233, 71,143, 30,125,195,100,137, 68, 34, 68, 70, 70, 98,249,242,229, 25, 25, 25, 25,163,223,165,201,154, 50,
-101,202,242,184,184, 56,159, 11, 23, 46,112, 83, 83, 83,157,214,254,244, 83,246,145,236,236,140, 21,143, 31, 63,251,170, 94,189,
-186,115, 27, 52, 24, 93, 78,234,135, 82, 77,214,228,201,147,247,199,197,197, 53,190,120,241, 34, 47, 53, 53,213,125,242,228,201,
- 88,189,122, 53,230,207,159,191, 29,192, 4,152,215,225,229,207, 0,130, 78,247, 44, 51, 51,179,119,247,238,221,179, 50, 51, 51,
-209,160, 65, 3,244,233,211, 7, 46, 46, 46,112,115,115, 67,191,126,253,224,237,237,141,244,244,116, 12, 29, 58, 52, 35, 53, 53,
-181, 59,128, 87,229,105,166,167,167, 71,236,219,183,239,249,212,169, 83, 27,199,197,197,249, 1,176,207,205,205,149,230,230,230,
- 10,181, 90,173,216,214,214,214,182, 81,163, 70, 14,227,199,143,151, 61,120,240,192, 47, 46, 46, 46, 15, 64, 52,107,175, 10, 77,
- 86,153, 94, 4, 64,106,129,225,209,150,248, 76,173, 96,153,185,219,150,250,183, 25,235,149, 52, 91, 69,167, 55,170, 14, 75,191,
- 24,129,133,123, 14,239, 86, 11, 60,234,192,218,167, 33, 36, 34, 17,196, 2, 1,196,182,246,208, 48, 12,126,138, 76, 82, 42, 8,
-153,111,233, 1, 45,249, 67, 72, 81, 20, 54,111,222,108,104,217,178,165,250,210,165, 75,155, 84, 42,149, 7,128,223, 45, 49, 5,
- 27, 55,110, 84, 78,159, 62, 61, 52, 37, 37,165,161, 72, 36,210,154,230,111,218,180, 73, 57,114,228,200,199,113,113,113,141, 37,
- 18,137,178,172,246, 89, 69,141,150, 80, 40,212,164,164,164, 52, 31, 59,118,108,248,214,173, 91, 21, 18,137, 4, 82,169, 20, 66,
-161, 80,155,146,146,210,240,179,207, 62, 11, 93,189,122,181, 82, 44, 22, 67, 42,149, 90, 84, 45, 71, 8,121,195, 80, 21,157,111,
- 46, 6,131,225, 82, 74, 74, 74,195,233,211,167, 63,248,254,251,239, 21, 38, 3, 84,180,140,107,215,174, 85,202,100, 50,139, 34,
- 90,166,245,164, 82, 41, 54,108,216,160,156, 58,117,106,104, 74, 74, 74, 67,161, 80,168, 45, 50, 95, 49,101,202,148, 7, 41, 41,
- 41, 13, 13, 6,195,165,114,222,240,140, 57, 57, 57,224,114,185,120,252,248,177,134,207,231,131,166,105,188,124,249,178,208,104,
-217,217,217,249, 55,172, 95,207,247,151,253,135,175,138,249, 66, 97,203,230, 77,253, 94, 69, 69,199, 17, 66, 69, 85, 80,212,223,
- 85, 42,149,199,165, 75,151, 54,181,108,217, 82,189,121,243,102, 67, 89,145, 45,115,208,104, 52, 87, 67, 66, 66,244, 34,145,136,
- 74, 76, 76, 52,112, 56, 28, 24,141, 70,162,105,222, 92, 83,255,251,239,201,211,185,115, 41, 43,169,148,203,231,243, 33,145, 72,
-168,179,103,207,106,149, 74,229,213,191,223,104, 65, 2, 10,226, 23, 41, 26,185,136, 54, 80,120,254,123,190,201, 18,217, 0, 34,
- 91, 64,100,139,106,213,220,113, 47, 82, 41, 7, 13, 1,140,102,228, 16, 35, 68, 10, 10,146,199,201,144,243, 4, 98, 42, 41, 41,
-169,208, 16,153, 38,175, 58,126, 8,137,206,147,129, 34, 66,112, 96, 73, 10,146,222,246,246,246,220,196,196,196, 55, 52,253,253,
-253, 57,122,189,222,252,212, 46, 9, 70, 87,128,153,252, 60, 73,237,250, 91,168,194,103,198,138,159,197, 98, 99, 22, 16,180, 17,
- 1,181,220, 48, 99, 96, 35,193,215,199, 83, 3,238, 71, 41,107,129, 67, 38,128,201,115,180,160,156,109,228,114,249,153,251,247,
-239, 75,228,114, 57, 94,189,122,133,230,205,155, 99,199,142, 29, 18,137, 68,114, 26,128, 69,237,241,238, 38, 35, 58, 47,215,216,
-114,246,225,152,164,135,137,134, 98, 38, 43, 85, 65,240,233,119,199,179, 50,115,212, 3,238,196,150,125,255,148,194,131,172,172,
-172,110,243,231,207, 79, 79, 77, 77, 45,102,178,162,163,163, 77,134,160, 3,128, 39,239,234,199,210,218,218,122,248,138, 21, 43,
-112,255,254,125,244,236,217, 19,215,174, 93, 67, 70, 70, 6, 14,156, 57,243, 98,223,139, 23, 95,153,218,108,149,145,250,161, 84,
-172,172,172,190, 88,177, 98, 5,130,130,130, 10, 53,211,211,211,177, 98,197,138, 56, 0,147, 44, 53, 89, 38, 82, 82, 82,238, 61,
-123,246,172,123,131, 6, 13,194, 54,109,218, 20,231,234,234,202,140, 31, 63, 30,159,126,250, 41, 28, 29, 29,141, 27, 54,108,136,
-105,219,182,237,227,136,136,136, 46, 74,165,242,145, 57,239, 2,105,105,105,183,118,236,216,113,167, 83,167, 78,146, 81,163, 70,
- 57, 30, 59,118,204, 94,169, 84,186, 9,133, 66, 39,173, 86, 43, 8, 11, 11,227, 28, 57,114,196,229,233,211,167,145,106,181,250,
- 94,101,203,254, 95,131,162,168,251, 20, 69,157,162, 40,234, 98,137,207,251,229, 45,179, 96,219,178,254, 46,119,189, 18,197,220,
- 81, 98, 50,159,225,181,176,120, 98, 61,185,242,214,136, 22, 36,105,124, 27,146, 60,196,143,220,104,111, 71,198,214,166, 20,163,
- 42,153,222, 65,165, 82, 21, 78, 71,143, 30, 37, 46, 46, 46, 10,185, 92,110,113,122, 7, 23, 23,151,228,156,156, 28,210,172, 89,
-179, 12, 71, 71,199,194, 84, 4,174,174,174,201, 10,133,130,180,104,209, 34,195,201,201,105, 3, 10, 26,101,187,187,187,199, 18,
- 66,136,167,167,103, 66, 89,122, 6,131,129,184,184,184,152,122,232,241,236,236,236,126, 8, 12, 12,204, 72, 78, 78, 38,174,174,
-174,133,169, 19, 28, 29, 29,215, 52,111,222,188,228,252,138,202, 27, 27, 23, 23, 71,226,226,226, 72,245,234,213, 19,138,206,143,
-142,142, 38,209,209,209,196,221,221,221,226,244, 14,142,142,142,171, 75, 41, 75,165,202,232,225,225,145,172, 82,169, 72,171, 86,
-173,138, 29, 83, 15, 15,143,100,181, 90,109,154,111, 86,122, 7,177, 88, 60, 65, 36, 18, 37,136, 68,162, 4,161, 80,184,188, 70,
-141, 26, 41,135, 14, 29, 34, 27, 54,108, 48,117, 73,135,163,127,223,150,117, 90,141,254,202,209,191,223, 23, 85, 73,239, 32,151,
-203,255,112,113,113, 81, 28, 61,122,180,216,245,165, 82,169,204, 78,239, 32, 22,139,227,242,242,242,152,228,228,100,253,205,155,
- 55,149, 65, 65, 65,202,199,143, 31, 43, 35, 35, 35, 85,233, 41, 41,186,228,228,100, 85,118,118,182, 38, 52, 52, 84, 35,145,188,
-155,244, 14,100,135,119, 29,242,131,239,241,136,165, 94, 79,167,183,147,168, 31, 45,107, 72,200,255, 62, 34,228,244,167,132, 92,
-154, 77,238,109, 31, 79, 90,121, 9,141, 55,103, 85,127, 78,182,249,252,102, 78, 74, 6,178,163,126, 29,242,131,239,233, 23, 75,
-188,158,142,106,235,166,254,105,235, 6,114,247,238, 93,242,248,241, 99,242,234,213, 43,114,250,247, 67,164, 85, 45, 73,190,230,
- 15,190,199, 45, 76,243,208, 90, 40, 20,230,173, 91,183,142,220,185,115,167, 80,243,248,241,227, 68, 34,145, 40, 1,243,122, 45,
- 19,128, 34, 63,248,127,104,216,234,115,253,235,174,178,220,244,147,179, 9,121,180,155,144, 29, 1,132,236, 10, 36,228, 80, 47,
- 66, 78,140, 38,119, 54, 12, 36,173,189,248,122,178,205,231, 26,217,238,111,118, 99,123, 30,143,151,115,244,232, 81,146,144,144,
- 64,174, 93,187, 70,130,130,130, 72,120,120, 56,137,137,137, 33,167, 78,157, 34, 60, 30, 79,141, 74, 12, 91, 22,232, 12,207, 46,
-117,249,137,161, 43, 91, 19,114,108, 40, 73,221, 55,156,244,174, 39,207,104, 81,189, 74,249,232, 26,217,219,219,167,157, 58,117,
-138, 68, 70, 70,146,171, 87,175, 18, 39, 39,167, 52, 0, 1,239,250, 7,177, 75,151, 46,119, 9, 33,193, 61,123,246, 12, 6,112,
-182, 75,151, 46,193,175, 95,191, 14,110,222,188,249, 29,148,159,250,161, 76, 58,119,238,172, 35,132,144,158, 61,123, 18, 0, 9,
- 93,186,116, 33,175, 95,191, 38,205,155, 55,215,190,165, 98,115, 0,140,230,241,120, 63,217,217,217, 93,182,181,181,189,196,225,
-112,118, 0, 24,129,202,231,227,226, 0,112, 3,224, 15,160,105,193,228, 87, 48,143,237,113,248, 31,161, 48,189,131, 57, 12,244,
- 66,235, 49,181,168,171,195,106, 34,119,104, 77,228,125, 82,155, 50, 39, 97,105,151,178,140, 22,195, 48,228,249,243,231,164, 99,
-199,142, 10,169, 84, 26, 15,243, 19,150, 22,211,116,112,112, 8,114,114,114,122, 35,137,102,145,249,197, 18,150, 58, 57, 57,221,
-114,117,117, 77,118,116,116, 12, 41, 77,211,193,193, 33,200,213,213, 53,217,193,193,161, 88,114, 79, 14,135,211,211,193,193, 33,
-190,228,124, 46,151,219,201,201,201, 41,182,228,252, 50,246, 29, 46, 46, 46,177, 9, 9, 9, 36, 53, 53,149,120,120,120, 36,148,
- 52, 96, 73, 73, 73,197, 12,152, 57,154, 21,149,165,156, 50,150,170,105,198, 49,173,204,121, 55,225, 93,173, 90,181,148,181,107,
-215, 18,153, 76,150, 82,116,129, 79,187, 79, 22,220,125,145,151,243,233,156, 31, 14,149,146,176,212,220,228,160,221,165, 82,105,
-124,199,142, 29, 21,207,159, 63, 39, 12,195, 16,134, 97,202, 50, 90,165,105,246,104,218,180,105,122, 90, 90,154, 49, 55, 55,215,
- 16, 27, 27,171,121,253,250,181,106,217,178,101,186,212,212, 84,117, 94, 94,158,246,225,195,135, 26, 87, 87,215, 84, 0, 61, 44,
- 61, 71,149,253,237, 42, 89,125, 70,182,251,181, 38,219,252, 78,133, 47,242, 12, 27, 29, 40,213, 4,175,237, 73,200,165,217,228,
-206, 15,159,146,150, 94,130,124, 67,180,221,247, 12,249,217,187, 29,217, 88, 75, 96,150,230, 79,181,219,146,237,190,103,158, 46,
-244, 12,251,168,137,163,118,255,238,237,228,229,203,151,228,248,145,125,164, 69,205, 2,147,181,205,239, 60,249,193,175,163, 57,
-154,165,153,173,157, 59,119,146,151, 47, 95,146,223,126,251,205, 92,147,213,165, 52,163, 53,175,139, 44,235,211, 64,145,102,104,
- 35,129,182, 95, 0, 95,215,173, 14,223,208,202,147,107,108,232, 74, 51,126,142, 32,221,124,196, 26,178,205,231, 26,217,230,215,
-221,220,114, 10, 4,130, 24, 20,201,169, 83,114, 18, 10,133,169,229, 24,173, 46, 21,154, 45,111, 97,226, 31, 75, 59,145, 62, 13,
-228,233,102,154,172,138,174,165, 70, 14, 14, 14,105,187,118,237, 34,206,206,206,169,102,154,172,191,252,250,180,182,182,222,155,
-151,151, 23,124,238,220,185,224, 46, 93,186, 4,239,221,187, 55,248,198,141, 27,193, 18,137,100,175, 41, 56, 81,210,108,249,189,
-249,252,239, 82, 34,162, 21,156,155,155, 75,206,157, 59, 71,186,116,233, 66,246,238,221, 75,110,220,184, 65, 36, 18, 73,112,101,
-203,249, 87,236, 59,171,249,159,102,124, 41,147,101, 70,235, 45,158, 8,162, 86,171,201,172, 89,179,180, 34,145, 72,201,231,243,
- 45, 29,130,231,189,190, 8, 29, 28, 28,110, 57, 59, 59, 39, 59, 59, 59, 23, 51,123, 69,231, 59, 56, 56,132,252,203,111, 64,111,
- 62,159, 31,205,227,241,138, 15,193,227,223,183,101,237,214,163,230, 59, 7,244,253,160,138,229,228,243,249,252,121, 34,145, 72,
- 57,107,214, 44,109, 94, 94,158, 37, 70, 11, 0,186, 74, 36,146,248, 61,123,246,168, 94,188,120,161,207,200,200, 48,220,189,123,
- 87, 31, 20, 20,164, 93,188,120,113,174, 68, 34,137, 71,217,105, 9,254,150,227, 73, 54,214, 18,152,204,214,163,249,158,225,125,
-234, 73,116, 59,102,118, 35, 45,107,148, 48, 89,101,103,114, 47, 93,179,192,108, 61,248,218, 35,188,163,183,204,176, 98,254, 12,
-210,162,166,184,184,201,178, 64,179,164,217,146, 72, 36,185,139, 22, 45,178, 36,146, 85,220, 16,254,228,227, 65,182,251,238,205,
- 55, 81, 21, 76, 63,248,252, 72, 54,251,120,252, 83,238,163, 64,103,120,118,246, 22, 62,177, 32,146,101, 78, 57, 27,217,218,218,
-134, 89, 16,201,250, 59,246,189,219,196,137, 19,131, 95,191,126, 29,252,234,213,171,224, 27, 55,110, 4,127,248,225,135,193, 0,
-186, 21, 89,167,208,108,233,250,247,215, 52,162,233, 25, 21,104,126, 60,113,226, 68,242,250,245,107,242,234,213, 43,114,227,198,
- 13,242,225,135, 31, 18, 88, 54,124, 15,107,138, 88,163,245, 78, 34, 90,127,245,128,159, 93, 0, 92, 44, 58, 67, 36, 18, 37,171,
-213,106, 71,153, 76,246,123, 94, 94,222, 84,228,119,139,172,146,230, 95, 81, 78, 86,243, 95,161,233, 42,147,201, 54,229,229,229,
-125, 40, 18,137, 82,213,106,181,179, 5,154, 54, 66,161,112,134, 72, 36,234,168, 84, 42,189, 1, 64, 42,149, 62,215,104, 52,151,
- 85, 42,213,122, 0, 89,239,122,223,201,198, 90, 2, 8, 4, 77, 65, 48, 55, 56, 70, 81,115,197,185, 12,207,153,157,108, 99, 90,
-213,150, 70,130,199,124, 7, 74,115,143, 26, 19,173,177, 88, 83, 76, 53,135,145, 55,247, 94,148,178,198,119, 23,114, 61,191,232,
- 40,139,105, 85, 75, 22, 3,130,239, 32, 84,222,182, 84,179,164,217,146, 74,165,123, 20, 10,197, 56, 0,151, 45,221,119,114,216,
-143, 15,133,190, 26,244,156,122, 32,229, 12,225, 67,136, 18, 52,231, 49,146,144, 76, 45, 14,211,177,247,209,223,174,217, 77, 38,
-147, 13,247,245,245,173,245,244,233,211, 87, 74,165,242, 87, 0,231, 75,172, 67,249, 2, 29, 37, 92,110, 67,149,193,112, 45, 12,
- 8,170, 64,243, 99,153, 76,246,133,175,175,111,192,211,167, 79,159, 40,149,202,181, 0, 14,176,231,232, 95,165,249,175, 52, 90,
-127,123, 22,101,211,143, 93, 94, 94, 30,123, 6, 88,254,106, 18,243,242,242,250, 23, 92,119,150,110,155,165,209,104, 22,106, 52,
-154,133, 40,104, 63,146,153,153,249,143,106,180, 74, 77,123,165, 37, 27,107, 5, 65, 32, 88,217,196, 67, 60,245,232, 68,177, 18,
-132,138, 3,143,217, 80,129,201,170, 72,243, 30,196,250,149,205, 61,197,159,255, 54, 65,172, 4, 65, 18, 8,214, 87, 96,178,204,
-229,166, 66,161,168, 89,233,125, 30, 20,166, 3, 16, 73,128, 40, 44, 46,231, 69,113, 49, 8,197, 54, 50,126,151,156,207,203,203,
- 59,127,239,222,189,114,127,131,194,129, 75, 48,152,221, 25,224, 64, 94, 94,222,129, 10, 52, 89, 88,254,113,112,217, 67,192,194,
- 82,241, 75,201, 63,181, 96,212,180, 87, 90,114,216,239, 62,210, 56,179, 64,163, 38, 96,136,134,194,144, 68, 77,139,214, 86, 81,
-243, 46,210,168,233,224,192, 27, 2, 67, 4,242,180, 73,212,164,104,237, 63,102,191, 1,130,197,172,145, 98, 97, 97,249,199, 48,
- 30,197,123, 26, 22,254,207, 26, 45, 22,150,247,156,130, 40, 79, 92,193,244,143,213,100, 97, 97, 97,249, 15, 26, 46, 80, 40,187,
- 65,155, 37,117,175,149,105, 20,119,145,213,172,148, 38, 7,128, 53, 0, 27,228, 15,227, 96,234, 38, 92, 81,154,141, 15, 0,232,
-217,227,201,106,178,154,172, 38,171,201,106,190, 99,205,138,180,223,199,182, 95,165,101,134,223,241,174,122, 29,178,154,149,167,
- 59,123, 60, 89, 77, 86,147,213,100, 53, 89,205,127,169,230,191, 14, 66, 72,165, 19,177,177,188, 27, 68,236, 33, 96, 97, 97, 97,
- 97, 97,249,199,209,184,224,211, 21,249,209, 45, 87,211,130,119,218, 70, 75,108, 95,215, 21, 92,186, 1,197, 16, 95, 0, 32, 52,
- 21, 14, 3,243, 80,149,254, 34,177,170,218, 50, 55,111, 59, 2,193, 97, 10,218, 65,121, 9,207, 51,170,170, 87,207,219,170,191,
-179,131,124,120, 82,122,246,158, 39,207,242,142, 89,178,173,181,181,167,181,200,206,118,160, 70,167,175, 39,224,243, 99,116, 89,
- 57, 59, 50, 51, 95,229, 86,162, 24,118,229, 45, 92,188,152, 80, 39, 19, 67, 40,190, 68, 71,219, 91,241,169, 60,228,145,188, 68,
- 25,227,149, 21, 73,142, 28, 25, 68, 44, 61, 55, 20,141, 14, 82,185,188,137, 80, 36,105, 46,145,219,214,101, 8,144,145, 28, 31,
-165,213, 27,110, 24,181,202, 96,194,224,202,219, 56, 87, 44, 44, 44, 44, 44, 44,255, 2,163, 21, 2,160, 23,242,219,104, 85,220,
- 24,222,211,191,205,125,145, 72,236, 5, 0, 12, 33, 96, 8,160,200,201, 10, 78,122, 21,212, 29, 0, 28,106, 52, 62,199, 19, 89,
- 53, 97, 72,254,114, 35, 3, 24,116,234,200,156,232,187,205,204, 41,145,212,209,251,163, 78, 93, 58,247,239,221,187,151, 79,253,
-122,245,107, 3,192,163,199,143, 34, 78,158, 60,245,236,210, 69,234,168, 34,245,249,111, 85,217, 99, 2,209, 55, 77,155, 54,106,
- 19, 20, 20,178, 20,192,228,170, 30, 65,123,123,217,212,243,255,155,213,174,115,255, 53, 82,192, 50,163, 37,178,179, 29,216,175,
- 79,143, 70, 95, 78,155, 72,127, 58,235, 91,175,251, 55,175,172,146,185, 6,100, 17, 70,127, 94,145, 60,228,122,121, 3, 39,151,
-244,143,101, 25,172, 95, 51,206,210, 27,118,181,180, 85,101, 68, 12, 33,140,113, 8, 69, 81,224, 8, 36, 71, 28,107,181, 57,100,
-211, 97,102, 38, 0,179,123,140, 89,185,250,119,113,114,117, 63, 58,228,147, 25, 34,137,181, 51, 23, 28, 62, 0, 10, 9, 81, 97,
-184,116, 96,133,237,231, 75,118, 54,190,249, 48,218,240,199,255,182,168, 41, 62,175,191, 50,241, 41,155, 75,133,133,133,133,133,
-229,191,204,169, 2,115,117,170,228,130, 50,141,150, 72, 36,246,186,115,229,164,221,111, 55, 98, 1, 0, 93, 26,187,224,171,101,
-155,186,237,221, 24,244, 12, 0, 90,118,234,237,189,116,222, 52,220,122,146, 2, 66, 8, 26,213,177,199, 7,253, 6,153,103, 60,
-156,253,154, 13, 28, 56, 96,216,172, 89, 95,244,125,249,242,101,212,254,253,251,175, 3, 64,219,118,237,234,124,251,237,183,131,
-215,216,218, 9, 15, 30,249, 95,188, 58, 57,236,126,101,246, 86,228, 86,171,154, 79,221,154,195, 15,254,188,137,238,208,125,192,
-208, 40, 40, 86,168, 19, 94,197,155,179,173,131,131,195,116, 30,143,103, 13, 0, 12,243,167,255,209,233,136, 11, 0, 24,140,140,
-220,214,205, 39,151,195, 23, 25,133, 66,254,211,220,188,188, 61, 57,241, 97, 63,149,167,169,209,235, 3, 62,159, 52,134,126,240,
- 42, 29, 94, 1,109, 57, 27, 86,124, 13,198,168,183,157, 49,111,217,192,160,187, 7,161, 72,198, 85, 51,119,141, 87,114, 70,181,
-106, 45, 56,223,172,144,117,165, 40,140,246,108,249,201,135, 75,119, 31,225, 53,173, 99, 5,141,158,193,153,224,244,150, 63,172,
-255,102,245,205, 31,122,157, 0,176, 29,192, 31, 0, 42, 52,117,118,246,118,191, 78,159,191, 94,166,208,254,153,166,168,192,100,
-225,199, 61,135, 17, 26,203,192,215,199,151,235, 50,125,149,108,251,178,241,187,149,249, 99,119,177,176,176,176,176,176,252, 87,
- 73, 68,241,222,134, 59, 42, 52, 90, 0, 32, 19,115,241,236,117, 18, 0,192, 70, 12, 76,157, 48, 10,233,105,169,222, 90, 3,131,
- 79, 70,141, 64, 72,120, 34,158, 69,166,130, 16, 2,111,119,137,217,165,225,128,105,250,201,216, 79,218,159, 59,127,254,222,130,
-249, 11,126,161, 40,220, 6,128,237, 59,126,108,185,112,209,194,113, 35, 70,141,232,122,228,200,145, 39, 0, 42,101,180,184,148,
-124,211,234,149,203, 5,113,105,106,245,244, 89,115,153, 47,102, 78,223, 0, 96,128, 89, 78,134,199,179,142,139,139,147,209,116,
-241,230,107,223, 45,159,123,173,107,255, 53, 47,162, 98,178, 30,156, 59,126,188,153,191,191, 63,226,226,147, 90,175,250,126, 91,
-195, 51,231,196, 99,114,115, 84,253,149,105, 97,165, 14,218, 44,228,241,158, 44, 89,245, 67, 35,198,166, 14,253,213,184,158, 8,
-168,237,134,248,148, 44,180,235,222,151, 27,124,255,126, 55,192,108,163, 85, 50, 65,227, 64, 45,147,210,240,219, 61,119, 59,127,
-216,202,173, 41, 77,115,144,167,210, 35, 53, 91, 3, 35, 3,180,245,179, 70,143,189,223,115, 51, 20,250,143,150,253, 47,246,163,
-219, 27,123, 39,171,179, 19,166, 0, 56, 90,254,215, 16, 59,119, 39, 43, 60,139,205, 45,213,100, 41,212, 6, 0, 0,159, 99, 4,
- 5, 98,207,222, 95, 44, 44, 44, 44, 44,255,113, 74,237,117, 8, 20,140, 74,126,242,228,201, 82,219,239, 24,141, 4,207, 34, 19,
-241, 44, 50, 17,247,194, 83,161, 35, 60,108, 88,181, 4,107, 87, 44, 66,134,138,198,111,183, 98,241, 60, 50, 9,207, 35,147,144,
-150, 89,106,166,247, 98, 85, 74,107, 86,136, 27,175, 95,111,181,186, 91, 59,105, 7, 59, 91, 91,219, 23, 79,126, 81, 44,156,153,
-236,183,228,243, 88, 62, 79, 43,140,147,202,164,173, 14, 31, 62,228,239,236,232, 36,149,201,228,179, 37,213, 26,238,180,182,110,
- 96, 93,158,102, 73,196, 78,190,125,251,246,234,209,201,197,197,153,153,184, 33, 56,188,158,159,175,190,110,157,186,173,197, 78,
-117,251,150,179, 89,161, 38,195, 48,160,105, 26,201,201,201, 72, 72, 72,192,235,215,175,241,252,249,115,196,198, 70, 37, 51,132,
-240,140, 96,104, 87, 87,119,112,185, 2,120,213,240,196, 15, 27, 86, 72,150, 45,254,170,185, 72, 42, 56, 86,194, 8, 21,106,170,
- 51, 50,143,156, 62,123, 62,254,204,254, 31,140, 0,144,146,153,135, 75,247, 95, 34,228,105,172,165, 39,178,100, 10,135, 26,241,
-209, 47,115, 12,145,167, 56, 75,191,254, 34,246,198,141,155, 81,217,185, 90,228, 42,117, 80,170,245,208,104,141,208, 27, 25,120,
- 58,138,240,251,220,122, 56,126,249,161, 51, 69, 81,235, 43, 58,158, 26,141,222,216,198, 87,138,161, 29,171,195,215, 93,138,248,
-103,183, 49,125,254,122, 4,189,214, 32, 51, 51, 11,122, 69, 26,152,188, 56,164, 69,134,192, 96, 52,146,138,206,251, 91,130,213,
-100, 53, 89, 77, 86,147,213,252, 23,107,150,229, 69,222, 19,118,148, 50,161,208,104,149, 69, 68,108, 6,158,189, 78, 66, 19,223,
-106,168, 93,195, 21,247,158,103,226,215, 75,177,216,121, 46, 26,151, 66, 83,193,112,229, 72,202, 1, 94, 68, 37,227, 69,116, 90,
-133,249,179, 57, 66,222,144,207, 63,207,158, 85,223, 63,167,197,149, 51, 83, 81,205,241,133,255,156, 57, 89, 83, 57, 66,222, 16,
-219,234,242,253,115,103,205, 24, 46,151, 72, 4, 90,141, 22,181,106,122,138,166, 77,153, 58,134,178, 21,238, 55,119, 47,229,213,
-252,108,133, 98,241, 79,203, 22,207, 22,174,255,237, 69,140, 66, 11,197,209,219,201,175,190,152,187, 48,131,203, 19,253, 32,175,
-230,103,107,174,150, 94,175,135, 70,163,129, 86,171,133, 78,167, 67,124,108, 88,223, 63,126,251,178,123,205,234,118,221,133, 34,
- 17, 8,128, 28,149, 1,175, 19,149,232,216,185, 43,167, 73,227,198, 1, 50, 87,191,177,165,105,101,103, 71,103, 51,132, 35, 63,
-249,251, 62,206,161, 11, 15,240,203,201,251, 56,118,249, 1,238, 93, 61, 99, 32,140,190,112,252, 47,153,107, 29,111,153,107,253,
-104,153, 91,131,228,194,169, 90,189,160,114,143, 41,135, 38, 29, 59,119,185, 56, 97,242,180, 43,202,220,244,148,159, 54, 45,137,
- 79, 77,136, 10, 19,242, 41,131, 68,200, 65,158,218,128,221,127, 36, 96,224,138, 80, 60,141,201, 3, 33,164,194, 1,188, 25, 96,
-230,144,177, 95, 26,245, 58, 29,124, 60,100,216,183, 99, 37,250,118,108,136, 78,245,109,209,172,182, 20, 18,174, 6, 79,194,159,
-225,192,190,221, 6,134,161,191, 96, 95,100, 88, 88, 88, 88, 88,216,136, 86,225,228, 90,116, 65,153, 85,135,106,181, 42,114,192,
-144, 17,112,117,114,145,245,235, 48,154, 31, 28,145,133,212,196,104,188,124,254, 24, 74,181, 30,124,219,154,128,200, 5, 53,188,
- 60,241,240,217, 49,221,198,213,167,242, 24,131, 38,178, 44,189,190,125, 93,221, 95,134, 83,244,234, 85, 30,119,158, 63,203,108,
-178,111,254, 46, 12, 27, 38,115, 88,189,202,227, 78,212, 43, 41, 45, 17,145, 86, 99, 70, 13,165,104,138, 96,206,156, 89,232,215,
-187, 7, 62, 25, 51,146,218,179,103,119,139, 44, 51,247,146, 1,111,243,188,175,151, 8,146,179, 12,218,123,207,243, 52, 18,169,
- 88,124,243, 69,158, 34,192,203, 67,220,179,255,232,132, 83,135,127, 90, 15, 96,148, 57, 90, 38,131,165,215,235,161,211,233, 0,
-192, 8, 0, 52,157,255,153,158,171, 69, 74,150, 6,201, 89, 26, 24,140, 12,250, 15, 25, 37,190, 31, 20, 58, 10, 64, 25,237,181,
- 24, 70,111,208,227,232,133, 16,196,223, 63,194, 80, 52, 39,187, 72, 99,120,200, 92,235,120,187,184,120, 92,235,221,127,164,163,
- 64,148, 95, 13,155,171,208, 96,207,182, 85,229,150,147,166, 40,194, 24, 13, 89, 6,189, 94, 81,171,102,173,120, 95,255,134,162,
- 27, 87,206,245,189,121,241,104,158,161,214, 72,155,136,168, 68,112,120, 66,112,248, 34,104,116,230,189, 44, 36,191,188,179, 5,
- 0, 53,246,179, 89, 27,102,124,249, 21,103,230,198,235,208,170,149,208,168, 20,200,201,206,132,152,171,199,147, 91,199, 13,196,
-168,159,161, 72,124,176,133,189,191, 88, 88, 88, 88, 88,254,227,148, 28,126,167,112, 94,153, 70, 43,250,233,141,102, 0,224,221,
-180, 91,186, 76,196,181,227,210, 20,146,227, 34,176,103,205,116, 48, 12, 65,207,113,171, 33,247,114,129,152,207,129, 38, 47, 61,
- 47, 35,226,106,185,109,117, 40, 74,223,117,203,246,120,175,207, 38,213,178,218,183, 47,143, 7, 0,251,246,229,241, 38, 77,172,
-110,181,117,123,164, 87, 96,155, 38, 32, 70, 35,122,247, 27,128, 33, 31, 15, 65, 84,146, 18,255,187, 22, 3,133, 74,107, 86,111,
- 57,177,131,111, 67, 7,123,199, 30,159,143,238, 33,229,114, 40,170,174,167, 53, 39, 54, 85,111,224,112,120,198, 19,247,179, 19,
-250,247,255,216,225,210,233, 67,157,140, 14,190, 13, 85,105,225,161, 21,233,105, 52, 26, 24,141, 70,104, 52, 26,232,245,122,216,
- 57,212, 60,221,117,192,154,184,196,164,220, 83, 73,153,234, 64,133,222,128,228, 44, 13, 82,178, 52,200, 82,232,224, 34,183,133,
- 65,175,173, 95,150, 30, 33,228,151, 15, 7,140, 24, 9,128,166,104,195,174,188,196,240,231,249, 75,254, 52, 89, 61,250, 13,115,
-188, 22, 28,129,151, 65,103, 50, 9, 99,200,207,226, 78, 49,113,229, 31, 87, 16, 14, 5,134,207,165,244, 28,154,102,116,186, 60,
-189,147,147,227,165,171,151,206,246, 81, 27, 94,129,195, 23, 22,174,171,210, 26,205,190, 98,146, 95,222,217, 12, 0,223,111,220,
-176,182, 85,215, 97,252,171, 33,145, 80,233,129,150,141,189,241,251,193, 31, 53,132,232,191, 84, 36, 62,216,204,222, 91, 44, 44,
- 44, 44, 44, 44,197, 12,214, 41,228, 55,142, 47, 30,209, 50,213,141,246,238,221,187,100,131,107,196, 39,103,192, 94,198,133,163,
-155, 23,134, 79, 95,139, 95,214,207,132,209,168, 7, 33,128,193,104, 94,102, 2, 66,120, 23, 38, 79,242,242,173,225,197,113, 28,
- 62, 76,162,250,117,159, 82, 60,124,152, 68, 85,175,190,125,246,228, 73, 94,145,185,106,143,214, 6,163, 17, 55,159,164,224,113,
-100, 54, 30, 71,229, 64, 38, 54, 63,205, 23, 71,192,159,180,106,229, 10, 62,151, 67, 81, 79,162,243,242,226,210, 13,121, 28, 30,
- 79, 39, 17, 11,136,150,112, 53, 81,105, 36,189,243,135, 99, 84, 39,246,126, 63, 22,192,148,178,116, 76, 61, 13, 77,145, 44,211,
- 39, 33,132, 80, 0,195, 80, 70, 99, 92,154, 26,121, 58, 61,146, 51,255, 52, 90,148,161,236,154, 83,153,107, 29,111, 43,185,236,
- 44,135,195, 17, 18, 2,232,117,134,193,112,173,211, 61, 47,241,229,243,162, 38,235,206,147, 4, 68, 60,184,152,108,212, 41, 71,
- 40, 83,158,253, 97,238,190, 83, 20, 8,135, 3,134, 67, 83, 12, 69,129,225,209, 68, 11, 66,152,146, 37, 82, 90, 96,180, 76,102,
- 75,192,227,204, 63,127, 96,189,211, 39,189,252,112,240, 90,190,231, 83,231,166,230, 40,226, 89,147,197,194,194,194,194,242,118,
- 41,207,139,188, 71, 81,173, 55, 35, 90,229,237, 16, 33,192,139,232, 52,212,112,119,132,123,141,218,120, 30,246,240,207,101, 0,
- 12, 70,243,170,163,142, 31, 79,140, 91,187,214,138,153, 57, 51,187,229,170, 85, 30,183, 39, 77,172,110, 93,175,190,125,246,236,
-217, 49, 45,215,173,179,190,125,225, 14,207, 72, 10,242,117,153,114,115, 89, 54, 70, 16,221,188,161,127, 77,206,146,125, 47, 98,
-254,120,148,155,194,231,243,245, 46,182, 34, 74, 46, 19,112, 56, 52, 79,160,209,211, 26,239,128,198,156, 19, 52,213,184, 60, 21,
-147,209, 42, 89,117,152,158, 26,209,247,252,255,102,213,235,240,225,106,187,248, 84, 21,178,181,156,194,170, 67, 14, 77,225, 81,
- 88, 52,192,225, 63, 46, 77,211, 74,110,119,110,255,175,191,120,172, 91,181, 28, 58,131, 17,147,103, 46,192,152, 81, 35,206,193,
-181, 78,119, 15, 47,159,224,235, 39,118, 73,186, 79,252, 1,209,207,130,146, 12,154,156, 3,150,152,172, 66,179, 5, 16, 35, 97,
-232,140,204, 28,153,198, 0, 17, 74,241,125, 26, 29, 83,169, 43, 39, 79,101,192,137,187, 73, 56,249,219, 1, 88,203,165,236,147,
-128,133,133,133,133,229,173,243,158,154, 43,148, 48, 87, 64, 89, 17,173,242,240,116,119,198,221,199,145,168,239, 91, 19,214, 86,
-114,132, 71,196,129, 67,243, 64, 83,128,222, 96,190, 25, 34, 58,253,193,117,235,172, 17, 29, 41,165,183,254, 16,233, 53,121,146,
- 87,228,186,117,214,183,137, 78,127, 16,192, 8, 66,242,199, 5, 50, 37, 72, 53, 90,224, 11, 8,163,175,238,108, 39,225, 4,189,
- 82,164,211, 52, 71, 99,111, 45, 98,236,173,133,180,189, 92,192,227,243, 56,140,129,208, 58,119, 39, 47, 53, 97,152,134,230,232,
- 21,173, 58, 52, 26,141,160, 40,218, 88, 96,196,164,177,233, 42,100,171, 57, 72,206,210, 32, 51, 87,135,186,213,164,184,120,233,
-136,210,168, 87,237, 43, 77,139,195,227, 91,215,246,114,199, 87,223,172,131, 74, 99,196,139,248, 60,240,133, 66, 23,103,151,128,
-208, 17,159,205, 21, 78,219, 17,129,177,157,236, 49,243,122, 68,188, 50, 89, 52,215,146, 51,107, 52, 26,161, 82,107,249,201,105,
-153,182, 57,185, 10, 43,177, 72,168,114,180,179, 78, 43,109, 93,181,133, 17, 45, 19, 18, 17, 23,125, 90,184, 64,173, 27, 10,149,
-198,128, 91,127, 28,101,159, 8, 44, 44, 44, 44, 44, 44,127,178,163,172, 5,102, 25, 45,153, 68, 4,194, 17,225,122,112, 4,124,
-252, 27, 96,247,241,123,168, 83,191, 5, 18,115, 13, 32,160, 43,236,109,104, 98,214, 60, 85, 8,128,144,190,125, 37,238, 31,125,
- 84,173, 43, 33,188, 11, 63,108,207,137, 3,128,154,245,242,101, 24,134,128, 16,128, 48,249,134,203,108, 40,110,116,100, 98, 78,
- 13, 47, 23, 41,158,198,233, 52, 82, 33,159,182,149, 10, 56,142,214, 2, 62,159,203,133,145, 80,154,196,196, 8, 13, 5, 68,153,
- 35, 87,178,234, 80, 34,115, 61,221,249,195,213,169, 81, 49,217, 65,117, 51,148, 13,179,117, 2, 16, 2,212,173, 38,197,227, 59,
-167,140,201,241, 47, 95,168,146,159,109, 43, 77,139, 97,192,209, 25, 24,132,190,202, 70,150, 66,143,172, 60, 29, 90,119,236,195,
-111,221,165, 47,174, 63, 78, 3, 99,208, 99,213,143,167,114,141, 68, 63, 4, 8,211, 91,176,211,244,221,144, 39,238,169,153, 10,
- 33,143,203,205,242,173,227,249, 90,192,231, 25,114,114,114, 4,197,215,226, 64, 42, 22, 32, 35, 79, 15, 0,122, 75,175,158,108,
-133, 30,199,239, 36,225,196,209,253, 16,139,197, 32,236, 13,197,194,194,194,194,194, 82, 20, 87,228, 15,191,115,170,224,179,208,
-124,153, 53,168,180,145, 33,112,176,183,131, 72,106,133,200,100, 29,114, 41, 39,100, 42, 9,140,198,252,136, 86, 57,129,167, 82,
- 71,247, 62,126, 60, 49,238,216,177,180,157,199,143, 39, 22,105,232,253,103, 36,171,240,147, 33,102,107, 82,196,120,241,248,153,
- 43,217,125, 3, 29,109,105, 14, 71,197,231,209, 26, 46,159,163,227,115,105, 61,159, 75,107,157,173,120,156, 43, 39, 14, 8, 8,
-133, 43, 21,105,170,213,106,116,233,210, 5, 61,123,246, 68,191,126,253, 48,104,208, 32,120,123,251, 57,209, 28, 74, 75, 40,134,
-113, 20,228,162,182, 35, 5,174, 58, 22,127, 28,248, 78,249,248,230,239,161, 70,141,186, 15,138, 91,206, 63, 53, 9, 97, 50,178,
- 53, 80,235,140,200,204,211, 33, 83,161,131,193,177, 37,126,191,149, 0,149,214,136,232,224, 35,170,212,164,184,233,154,148,151,
-145, 21,156,138, 57,197,255, 37,113,159,126, 50, 42, 85, 46,162, 95,182,109,213, 44,213,193,222,206, 64, 81,127, 70, 94, 41,138,
-130,200,202, 9,182, 54,114, 68,134,156,193,249, 85,157, 85, 0,190, 54,231,120, 22,197, 74,194, 69,223, 64, 23,244,233, 63, 20,
-245, 91,116, 55,199, 88,179, 35,218,179,154,172, 38,171,201,106,178,154,255, 37, 76, 99, 28,154, 62,205,203, 12,111, 50, 64,181,
- 92,165,168, 83, 77, 10,181,206, 9,106,173, 17, 10,181, 17, 57, 74, 29,114,148,122, 68, 38, 41,241,248,120,213, 75,152, 31,197,
-202,207,248, 73, 8, 0, 42,223,224,153, 27, 61, 17,232,180,223,172, 93,245,237,224, 3,141, 27,105,167,245,114,173,254, 48, 82,
-155, 64, 81,180,138,230,112,245,118,114, 46, 47, 60,252, 97,234,237,107,167,219,137, 12,198,145,202,114,116, 12, 6, 67,118,181,
-106,213, 0, 20, 31,130,199,175,182,184,223,205, 83,115,106,182,239,187,202,113,253,242, 89, 74,154,195,103, 40, 46,255,177, 81,
-175,218,175, 74,126,246, 3,202,177, 31, 52, 95, 20,118,247,193,211, 22, 54,118,213,241, 50, 94, 1,133,218, 0,157,129,129,173,
-140,143,184, 71,231,116,145,225, 65,135,242, 18, 30,238,174,196, 97,219,247, 60,236,177,123,143, 30,221, 7,180,104,209,146,179,
-112,225, 2,248,248,248, 64,165, 82,129,166,105, 84,175, 81, 27,145,207, 31,224,206,169,111,140,202,244,168,109, 0,150, 2, 72,
-181,244, 75,210,114,180, 56, 19,148,130, 83,191, 29, 4,135, 39, 96,111, 39, 22, 22, 22, 22, 22,150, 55, 25, 95,226,115,135, 89,
- 70, 75,173, 86, 71,182,233,210, 7, 12, 67, 96, 36, 0, 99, 44,136, 60, 49,127, 70,159,140,122,117,100, 85, 75,199, 48,198,123,
-155,119,236,236,217,184,121,123,142,191,135, 12, 57,233, 73,184,115,243,178, 1, 12,185,109,206,246,233,233, 47,242,196,206,117,
- 6, 12, 30,248,209,225, 81,159, 76,204,106,215,177,163,212,201,201, 69, 19, 23, 31,167,252,121,239,175,250,115,167,143,181, 99,
- 96,248, 56, 61,253,101, 94,121, 58,217,217,217,223,151, 54, 95, 40,144,181, 6, 80,147,195,165,180,170,212, 23, 22,181, 8, 79,
-139,143,237,255,237, 55,139,163,134,141,155, 33,168, 85,173, 54, 82,178, 57,136,140, 75, 66,248,181, 99,154,248,231,247,127,203,
-137, 11, 25,107,166, 84, 98, 41,243,226, 0,172,191,115,231,118, 64,143, 30, 61,186,119,234,212,137,140, 31, 63, 30,132, 0,127,
-236,152, 68, 50, 34,239, 28, 65,126, 20,235, 85, 37,207, 75,244,181,219, 15,236, 6,181,107,202,181,151,143,197,206,131,167,245,
- 32, 76, 52,123, 63,177,176,176,176,176,176, 20, 82,249, 54, 90,177, 97,249,249,180,254,106,114,147, 82, 70,236,222,253,203,178,
- 95,246, 30,104,173,214,106,171, 17,240, 99,141, 6,237,213, 60, 35, 22,154,171,161, 74,126, 25,100,111, 95,183,222,207, 63,110,
-254,250,231,157, 91,219,131, 49,250, 82, 64, 20,161,112, 69,164, 55,142,170,200,100,149,107,150,210,114,183,119, 29,176, 70,149,
-158,158,247,139,165,219,170,210,159, 37,209, 28, 93,245,237, 27,190, 89, 77,211,156,110, 70, 35,195, 99,140,250,151, 70,157,250,
- 59, 85,234,179,227, 48,187,149, 27, 50,202, 89,246, 4,192,147, 75,151, 46,181,189,116,233, 82,115, 0,223, 35,127, 12,197,160,
-170,156, 23, 77,122,110,231, 47,103,125,249,199, 23,160, 60, 25,134,192, 96,100,162,249, 42,101,103,246,158, 98, 97, 97, 97, 97,
- 97, 41,100, 60,222, 76, 90,106, 94, 68,235,239, 34, 51,243, 85, 46, 50, 49,173,170, 58,233,233, 47,242, 0,188,209,115, 79, 89,
- 69,221,199, 47,114,254,135, 23, 57,255,171,236,246,138,148,215,169,192,235, 81, 85, 44,134, 57, 13,217,175, 23, 76,111,133,180,
-180, 48, 5,210, 16,200,222, 67, 44, 44, 44, 44, 44, 44, 22, 27, 46,243, 26,195,179,176,176,176,176,176,176,176,176, 84,104,178,
-138,126, 2,200,111,123, 94, 86,207, 1, 75, 70,230,174, 76,239,131,139,172,102,149, 53,121, 0, 4, 0,100, 0, 42,170,210,236,
-142,130,241, 26,217,227,201,106,178,154,172, 38,171,201,106,190, 67,205,138,180, 47,226, 95,130,101,137,215, 43, 7,219,245,149,
-213,100, 53, 89, 77, 86,147,213,100, 53, 89,205,127, 59,227, 75,153, 64, 8,249,231,180,209, 98, 97, 97, 97, 97, 97,249,187,176,
-183,175, 43, 3, 10,219,245, 86,136,196,193,207, 25, 0,148,105, 97,201,236,209, 99, 41,133,162,227, 28,190,149, 54, 90, 60,154,
- 43,248, 82, 34,183, 15,147, 90,219,199,255,199, 15, 46,229, 93, 67, 58,181,107, 59,175,223,125,106,138,251, 89,178,161,196,209,
-123,151, 75,237,192, 24,169,147,247, 84,184, 54, 22, 87,165, 16, 82,167,154,142,178,234, 77,111,202,171, 5,124,240, 23,236,163,
-208,223,223,191,165,191,191,127, 75, 0,194,183, 33, 40,113,242, 30,234, 94,167,197, 53,167, 90,141, 46, 75,157,235, 14,124,219,
- 5,150,185,214,177,151, 85,111,242, 63,153, 91,131, 76,153,107,131, 28,153,123,147,171,114, 7,191, 90, 21,109, 87,189,239,183,
-190, 75,246, 63,222, 95,189,239,183,190,165, 45,183,237,177, 81,190,232,192,139,229,246,125,190,147,177,207,149,202, 81,189,245,
- 80, 27,215,246, 95,216, 91,186, 93, 53,239, 22, 79,106, 4,180, 77,113,171, 27,248,216,220,109,220,125, 90,134,120,250,183, 78,
-118,247,110, 25,196, 30,121,243, 16, 57,214,108, 41,178,245, 56, 37,180,245, 56, 45,180,171,217,177,170,122,174,174,174, 98, 95,
- 95,223, 30, 45, 90,180,152,208,185,115,231,207, 27, 53,106, 52,222,211,211,179, 27,222, 97,103, 44,137,147,247, 60, 13,143, 74,
-211,240,168, 52,137,147,247,188,138,159,175, 62,203, 40,218,152, 64,209,198, 4,169,147,207,178,127,202,185, 18, 58,123,123, 74,
-156,188,215,201, 93,252,239,137,157,234,246,177,116,123, 91, 91,219,110,142,142,142, 31,154, 38, 91, 91,219,110,236, 29, 80,105,
- 10,163, 88, 37,254,174,212,133,206,225, 9, 37, 55,134,125, 50,185,222,202,197,115, 69, 27,118,254,142, 13,203,103, 61,213, 40,
-178,252,255,137,123,238, 80,179,121, 16,135,230,184, 23,157,103,100,140,113,105,175,239, 53,125, 27,250, 62, 53,196, 99,191,158,
- 61, 98,230,208,193, 93, 60,187,244,158, 78, 61,123,173, 58,102,190, 69, 67,195, 67,255,251,173,250,181, 43,151, 55,238,220,185,
- 99,105,170,193,103, 29, 79,200,221,156, 19,251, 36,203,146, 50, 88, 57,214,170,201,149, 58, 92,107,211,111,178, 75,240,197, 95,
-119, 27,181, 76, 87,101, 90,145,209,191, 43,143, 99,237,218,181,155,113, 56, 28,251,169, 83,167,242, 1, 96,253,250,245,117,140,
- 70, 99,122, 68, 68,196,125, 84, 34,249,105,190,193,244, 25,241,253,234, 37,191,124,240, 65, 79, 36,164, 41,176,106,221,150, 14,
-103, 79, 30, 26,164, 72,126,113,228,109,156, 19, 27, 27, 47, 43,240,229,143,166,207, 94,234,212,163, 67, 51, 78,158,218,128,179,
-215, 30,180,253,117,203,210,123,128, 95,243,220,180,176, 50,115,138, 49,202,236,249,206, 50,210,131, 81,102, 3,192,208, 55,126,
-236,101,250, 46,142, 98, 99, 15, 87, 33,247, 65, 58, 80,225,160,143, 54, 53, 90,159,227, 9,133,158, 52, 77,131,166, 0,154,166,
-192,161,168,252,113, 66,117,170,232,248,240,235,221,255, 9,247,137,220,163,121, 18, 56, 92,123,154,250,179,124, 20, 93,240, 73,
- 72, 78,210,139, 27,246,111,225,107,172,235,213,177, 9,104, 93, 71,241,243,213,215, 25, 82,110,187,207, 79, 81,132,222, 26,115,
-125, 93,168, 89, 6, 64, 36,178, 61,113,226,132, 99,143, 30, 61,172,157, 2,250, 93, 53,103, 27, 1, 39,207,255,228,201,227,252,
- 30, 61,186, 91,112,125,122,119, 5, 77,239,165, 0, 30,195,144,245, 28,134, 28,202, 75,127, 30, 1, 88, 54,250,148,216,201,103,
- 44, 13, 98,246,115,134, 1, 21,164, 74,121,182,179,178, 7,151, 43,180,234,204,227,243, 63,175,233, 93,191,113,124,212,203, 32,
- 69, 94,238, 58,131, 38,251,170,197, 66,122,195,151, 23,175, 7,127,192,229,241,168, 30,157, 3, 57, 26,224,114, 85, 78,186,179,
-179,243,135,155, 54,109,170,213,178,101, 75, 0,128,193, 96,176, 58,124,248,176,203, 55,223,124, 35,125,254,252,121,101, 7, 78,
-173,230,232,232,232, 33, 16, 8,170, 1,128, 86,171,141, 79, 77, 77,141, 1, 80,225,139,191,212,185,150, 3, 8,150, 94,191,118,
-141, 11, 0,109,219,182, 91,230,209,102,138, 45,135, 47, 83,149,122, 56,180,185,210,172,136,203, 51,238,220,189, 77, 1, 64,139,
-192,150,115, 37, 14,126,155,223,101,100, 75,228,228, 19, 72, 3, 51, 91,180,237,210,127,200,199, 35,232,128,186, 30,232,214,181,
-211, 28, 21,112,194,162,107,134,203, 21,223,187,119,175, 54, 77,211, 28,131,193,160,110,209,162, 69, 76, 85,202,229,230,221,242,
- 22, 5,186,186,206,160,253, 49,245, 85,208, 50,224,141,129, 99, 56,214,213, 27,127, 13, 14,119, 28,195, 48,177,185, 49, 65,173,
-254,133, 17,173, 55,143,179,165, 74, 52, 87,240,249,208, 49,159,213,155,241,197, 87,162,233, 27, 46,225,212,150,185,105,255, 84,
-147, 5, 0, 28,154,227,126,238,252, 57, 39,137,128, 3, 0,200, 83, 27,240, 65,143, 30, 21,255, 34,212,104,126,133,166, 40, 31,
-211,128, 54, 70,131, 78,196,229, 9,212, 84,190, 65, 2, 5,192,193,173,198, 37,103,195, 13,201,208,193, 93, 60,247, 30,184, 16,
- 23, 19,151,110,241, 67,141,226,240,209,162, 93, 55,116,233,218,221,250,222,221, 91, 75,119,108,251, 97,158, 65,167,255,129,209,
- 51,235,212, 25, 47, 19, 42,124,152,187,212,109, 34,144, 57,156,237, 63,225, 27,123, 53,109,135,133,203,191,119,184,118,102,223,
-213,248,216,134, 76,116,116,172,154, 80,212,211,204,140,196,207, 21, 73, 17,207,204, 61,100, 50,153,172,150, 76, 38,107,216,160,
- 65, 3,209,172, 89,179,120, 29, 58,116,248,211,178,143, 31,207,191,114,229,138,235,154, 53,107,122, 62,124,248, 80,157,151,151,
- 23,154,151,151,247, 10, 22, 52,180,119,113,113,156, 50,224,163, 62,232,212,127, 50,140, 12,133,241,159,205,192,185, 51, 71, 39,
- 2,120, 43, 70, 75, 47,177,250,102,220,132, 89,142, 45,154, 53,226, 44,221,247, 12, 98, 1, 23,221,155,250, 80, 99,166,206,183,
-217,185,113,233, 79, 72, 67,251,210, 34, 89,140, 50,123,126, 61, 7,237,199,125, 91,214,196,241,253,218,143,209,121, 54,104,137,
-245,178,216,227, 95,133, 3, 64,173, 30, 83,229, 66, 99,234, 38, 55, 27,142,147,208,152,186,169, 86,143,169, 23, 95,157,221,148,
- 91, 94, 89,120, 66,161,231,254,125,251,234,218,202,249,224,210, 20, 56, 28, 10, 92, 14, 13,181,214,136, 65,131, 63,126,107,151,
-185,216,169,110, 79, 26, 24,147,255,131,141, 93,170,148, 23,167, 45, 57, 39, 20,135,111,127,242,248,111, 92, 39,107, 33, 56, 28,
- 10, 28, 26,224,208, 20,162,146, 85, 24, 59,118,140,117, 85, 13,251, 7,173,157,154,125, 57,196,167,123,139,122,118, 13, 14,222,
-166,172, 91,124, 48,196, 62, 77, 45, 25,125,224,216,229,143, 73,219, 25,119, 9, 97, 86,199,221,248,254,124,121, 34, 26,141, 38,
-185,123,143, 15,172, 40,174, 84,114,241,247,221,237,184, 52, 5,189,145,192, 96, 36, 48, 22,140,141, 74, 21,188,193,208, 52, 5,
-194, 16,140, 27, 55, 22,221,123,124,160,100, 12, 76,156,249, 15, 57,122,239,217,139, 55, 29, 53,122, 6,107, 54,237, 92,170,200,
- 78, 93,250, 58,220, 62, 42, 47, 59,109,134, 42,229,133,217,227, 96,208, 32, 77, 99, 95, 61,158,176,239,228, 29,212,243,247,131,
-145,201, 47,167,143,187, 20,251, 78,221,129,175,143,111,126,185, 25, 2,239,234, 50, 52,107,218, 12, 0, 42,101,180,184, 66,249,
-194,246,189, 70, 44,233, 61,232, 19, 56, 57, 58,130, 38,250,222, 23, 79,237,235,189,107,235,234, 47, 13,234,156, 53, 22,137, 17,
- 99,225,239, 2, 97,152, 42, 71,157,220,220,220, 28,155, 53,251, 51, 29,163,193, 96,128,151,151, 23,226,227,227,125, 42,243,158,
-230,234,234,218,107,209,162, 69, 78, 61,123,246,228,185,184,184, 0, 0,146,146,146,170,157, 61,123,182,241,162, 69,139, 82, 18,
- 19, 19, 79,161,156,140, 62, 70, 61,205,167,185,224,136, 68,146,252,125, 4, 69,207,154, 50,178,129,179,171,155,166,180,245, 83,
- 83,147, 4,179, 39, 95,166,184, 92,126,193,250,160, 9, 97,168,114,162, 68, 93,120, 60, 94,169, 53, 20, 58,142, 85, 11,194,179,
-254,148,230,208,249, 23,171, 65,159,154, 25, 19,226,103, 65, 36, 46,128, 39,224,255, 48, 96,200, 39,173, 6,246,239, 7, 87, 71,
-107, 92,188,241, 16, 19,167,204,212, 27,116,250,117,149,122,120,112, 56,220,148,148,148, 40, 91, 91, 91,151,170,255,222, 82, 53,
- 47,156, 59,227,116,241,143, 75,115,215,110,216, 56, 73,167, 53,232, 25, 66, 10,199, 49, 22,139,133,188,174,189, 7, 91, 57,213,
-110, 33,218,184,232, 83,222,191, 48,162,181,227,173, 24, 45,129, 88, 62,120,193,236,169,162,111,126,189,131, 83, 91, 38,166, 41,
-115,210, 28, 11,223, 20,172,108, 66, 20, 57, 89,141, 43, 83, 66,153,163,119, 75,138,195,157, 64,113, 56, 82,138,166, 4,140,145,
-137, 53,104,181,203, 84,233, 47, 18,171,186,247, 12, 67,240,191, 91, 41,150, 25, 32,130, 58,123, 15,254,230,244,127,246,206, 58,
- 60,138,227,255,227,239, 61,215,184, 39, 36, 1, 66, 66,176, 0,193,221, 61, 56,197,165, 56,133,210, 66,105,129, 66,177, 2,165,
- 80,188,180, 64, 41, 80,164,184, 6,119, 43,154, 64, 32, 64, 18,136,251,197, 46,231,126,243,251, 35,210, 64,163,208,254,190,149,
-121, 61,207, 61,201,222,237,189,111,118,119,118,247,189,159,249,204,140,155,189, 0, 58,163, 5,195, 70,140,198,158, 61,123,108,
- 92,236,248,208, 25,204, 88,179,118,173, 82,149,112,198, 53, 33, 57, 47,181,107,223,217, 23, 99,227,101,207,146,210,117,135,170,
- 90, 54,189,209, 2,133,198, 12,141,158,133,128,250,205,176,102, 93, 29, 97, 82, 98,220,236,221,187,118,204,124,254,156,189,199,
-202,102, 45,213,165,191, 72, 46,245,164,115,111,208,195,214,193,233,215,129, 83, 86,216,199,200, 56, 32, 48,226,181,173, 16, 67,
-199,205,180,245,115, 23, 65, 34,100,219,199, 37,166,122,204,249,252,243,219,177, 22,210, 92,145, 21, 27, 87, 81,121,170, 87,175,
- 62, 40, 36, 36, 68,252,217,103,159,113,189,189,189,177,107,255, 97,223,118, 61, 62,232,155,150,158,233, 77, 8,129,155,171,107,
-242,164, 15, 63, 56,125,246,236,217,196,228,228,100,238,234,213,171, 91, 28, 63,126,188, 94, 70, 70, 70,165,159, 76, 45,132, 64,
-167,183,192, 82,120,131,204,202,215, 87,217,159,122,121,121, 9, 82, 83, 83,245, 37,162, 12,204,239,129, 66,166, 71,151, 14, 45,
- 56,219,206,197, 67,165,179, 64, 34,228, 34, 62, 83,131,166,141,131,152,159, 44,230, 70,165, 9, 78, 24,218,103,161,155,148,244,
-236,215,170, 38, 92, 29,196,216,249,253, 10,156,186, 27,215, 51, 83,197, 96, 51, 97, 79,241, 16,112,186, 73,172,233,155, 59, 54,
-173,229,222,185,137, 47, 30, 54,173,229,126, 51, 44, 42, 90,244,193,218,143, 83, 85,220,203,121,231,103, 42, 75,191,240,176,224,
-104,195,195,207, 23, 18, 33, 22,114, 32, 17,114, 32, 17, 20,252,101,177,152,247,123,170,245,168,235,205,182, 90, 38,176,217,156,
- 9,195,135,126,224, 57,114,248, 7, 4,108, 22, 14, 31, 61,221,127,223,190,189,233, 38,163, 97,135,133,197,254,185,172,250,243,
-198, 14,101, 1,174,118,124,124,190,227, 25,108, 69, 92,216,136,185,176, 21,115,209,185,161, 11,216,239, 62, 8,140,195,212,254,
-126,189,167, 14,172,222, 41,208, 71, 26,240,228,117,254,243, 9,203, 31,109,184, 46,239,244,233,247,235,235, 57,169,228, 6,206,
-162, 57,147, 56, 41,105,105,157, 14,159,190,209,217, 98, 24, 31,101, 54,170,191,204,138, 56, 92,106, 84, 56, 37,234,110,176, 87,
-203, 33, 66,163,202,244,244, 73, 84, 74,173, 60,189, 0,145, 9, 10, 72,132, 28, 72,139,246,173,144, 3,137,144, 11,169,144,131,
-180,148,120,228,170,217,183, 83,157, 88,157,112,227,174,185, 42, 5,215, 25, 45,120, 28,167, 66,245,192,198,240,240,240,132,161,
-247,168,234,247,175, 30, 61,249,224,198,137,111, 52, 25, 47,191,172,172,206,254,208,123,152, 55,107, 74, 24, 3,132, 23,222,164,
-131, 23,173,218,210,100,217,188,233,111,188, 55,103,233,166, 38,239, 30,201,178, 89,216,121,224, 71, 75,219,117, 27, 8,101,110,
- 38,126,187,120, 8, 61, 66, 6, 99,212,248, 79, 96,111,239,188,102,221,242, 47,158,152,245,138,171,127,184,230,186,215,105, 27,
-212,160,238, 62, 47, 79, 79,111,171,181, 96,150, 15, 66, 0,149, 50, 31, 95,124, 58, 9, 86, 66,208, 40,184,121,103, 97,187,110,
-132, 20,206, 6,146,157,147,173,142,122,249,188,171, 78, 22,117,191,210,251, 82,167, 51,101,101,101,225,241,227,199,136,142,142,
- 70,100,100, 36,114,114,114, 96,103,103,167, 82,171,213, 85, 10,222, 55,108,216,112,228,213,171, 87,133, 14, 14, 14,197,111, 26,
- 12, 6,216,216,216, 96,228,200,145,220,238,221,187,123,245,233,211,103,236,179,103,207,246, 3, 80,148, 90,158,220, 87,105, 54,
-110,129, 91, 59,116,236, 48, 13, 0, 68,182, 30,113,155,119,157,142, 44,247,129,214,206,211,183,117,235, 54,181, 64, 8, 24,144,
-141,154,156,232,140,114,162, 68,146,123,247,238,249,177,217,108,206,239,247, 32, 43,126,216,121,176,206,165, 91, 79, 7,173, 90,
-243,157,208, 86, 34, 64, 86,190, 1, 19, 71, 13,172,244, 61, 88,228, 22,216,187,117,235,246, 39,151, 45,253,138, 35,149, 72,112,
-241,126, 44, 62,254,244,115, 93,122,194,179,239,136,149,187, 69,147, 21, 45,123,207, 91,229,159,210, 61, 46,160,154, 20, 54,253,
-122, 8,167,142,233, 39, 52,152, 44,144,171, 77,208, 27, 45,176, 88, 9,242,213, 38, 60, 79, 82,194,217,182,234, 83,185, 17, 66,
-154, 1,112, 1,144,197, 48,204,195,146,203, 69, 15,116, 69,222,248,173,229,236,194,251,131, 19, 0, 3, 10,122,234, 23, 87,159,
-194,229,178,222, 47,250,254,115, 0,117, 11, 53, 45, 0, 30, 48, 12,147, 87,134,217,250, 67,148,139, 19, 26, 26, 74, 66, 66, 66,
-138,175,248,111, 47,191,141,128,199,245,148,216,185,128,144, 23, 40, 57,129,177,171,187, 87,206,119,235, 54, 56,206,248,104, 74,
-162, 66,158,235, 91,248,246,229,202,220, 44, 56, 12,123, 93,135, 54, 45,187, 79,251,232, 35, 4,250, 85,227, 89, 44, 22,242, 44,
- 58,206,180,251,231,157,227,110,222,229,111, 80,164, 60, 91, 88, 34, 4, 89,165,110,159, 22,171, 37,229,237, 8,150,197,106,121,
-251,233,246, 15,154, 12, 3,216, 75,249,216,122, 46, 30,132, 0, 12, 8,236, 36, 92, 28,184,158,130,184,176, 99,138,144, 70, 10,
-245,200, 85, 75, 58,119,234, 61,243,234,243,215,186, 67, 50,153,238, 2,128,140,242, 52, 75,191,160, 91,161, 55, 90, 96, 50,155,
-113,228,244,105,244,236,220, 2,173, 91,183, 64,251,118,173, 57,143,194, 34,198,127, 52,109,146, 55,126,239,221, 81,172, 41,116,
-243,111, 38,181,115, 62, 52,104,218,106,155,167, 41,102,112,216, 64, 77,119, 17, 28,109,120, 48,152, 25, 36,100, 25, 11,207, 28,
-123,124, 60,103,169,227,188,217,211,206, 42,178,248, 13,128, 23,198,242,182, 93,163,209,240, 71,143, 30,205, 53,153, 76,198,145,
- 19, 63,233,158,145,145,213,255,135,141,223, 10, 92, 93,221,160,209,153, 17, 22,249,170,238,178,101, 75,107,158, 62,127,253,196,
-146,207,167,158,236,217,179,167,221,193,131, 7,173, 21,237,207, 55,158, 16, 51,179,191,223,185,239,200,158,245,223,173, 68, 84,
- 98, 30,126,222,182, 5,196, 98,222, 90,193,174, 42,169, 73, 70,143, 30, 45, 58,113,226, 68,181,148,148, 20,133, 70,163,201,122,
- 35, 30,193, 98, 56,153,185, 26, 56,219,240,193,227,176,224,230, 32,132,171,157, 0, 92, 54,192, 98, 24, 75,105,154, 63, 31, 58,
-179,220,170,201,199,169, 95, 13,195,119,126,191, 2,227,103, 44,192,179,108,254,121,150,216,110,249,244,225,131,230,185,136, 44,
- 61, 61,237, 89,174,157,155, 84,135, 68,200,195,252,153,163,209, 60, 44,193, 53, 85,110, 93,144,165,101, 55, 94,122,190,120,178,
-238,203,111, 6, 71, 10, 34, 88, 54, 98, 46,206,239, 91, 35, 83,231,103,229, 23, 53,201, 25,244,186,196, 74, 86,227,203,165, 60,
-217,206,107, 28, 84,127,197,180,201, 19, 88,109, 90, 53, 39, 44, 22, 23,217, 74, 3, 67, 8,240,233,199, 83, 49,125,234, 36,247,
-228, 52,217,162, 45, 91,182, 46,188,122,137,124,173,206,122,185,164, 60, 77, 22, 83, 16, 5,146, 10, 57,144,138, 10,140,139, 84,
-200,129,206, 96, 1,195,128,109,239, 19,156,207, 20, 68,114,211,114, 19,203,124, 2,127, 67,211,209,167,254,149, 75,113, 54,117,
-242, 14,229,221,141, 79,139, 92, 30, 22,145,249, 0, 64,174,119,123,251,177, 70, 51,129, 74,103, 70,124,166, 6,102, 35, 97,198,
-247,242, 69,141, 33, 76,224,202,157,225,123,206, 69,192,182,196, 69,255, 13,205,212,123, 71,116, 78, 13, 6, 14, 91,191,105,219,
-195,239, 86, 44, 96,103,231, 27, 96, 37, 4, 66, 62, 27, 34, 62,167,240,197,134, 86,157,143, 45, 63,254,148, 97, 6, 51, 8, 55,
-110,152,171, 82, 63, 97, 37,163, 6,246,110,127,128, 1,248, 12,139,151,226,233, 91,221,183, 75,223,113,194, 46,253, 70,195, 98,
- 54,204, 11,187, 69,174,105,100, 81, 87, 42,163,217,160, 94, 93, 48, 64,184, 90, 22, 61, 21, 0, 36,174,181,183,214, 9,172,211,
-228,237,247,252,253, 3,155, 84,230,184, 23, 71, 74,133, 54, 51, 28, 28, 93, 22, 4,214,111,236,154,153,167,103,108,156,170, 33,
- 62,230, 49,126,253,113,209, 94,171,206,176,244,202,153, 67, 43, 54,252,124,124,104,151,158, 3,177,243,135,111,231,231,164, 23,
- 27,173,203, 37,162, 85,163,118,239,216,238,205,229, 11, 96, 50, 91, 97,178,144,130,191,102, 11,114,115,243, 96, 50, 91, 33, 20,
-219,192,108,101, 96,178, 88, 97, 50, 91,161, 55,152, 37, 83, 71,247,249, 72, 7,220, 47,173,156, 94,117, 58, 92,224, 9, 4,190,
- 4, 5,115,215, 18, 66, 16,159,161,101,121,120,120,236, 7, 0,129, 64, 0,129, 64, 0,171,213,138,176,168,172, 25,206,129,181,
-167,161,208,224, 89,140,134, 68,121,194,157, 30,101,109,187,187,187,123,223,183, 77,150, 78,167,131, 74,165,194,173,187, 15,237,
-118,236, 57,210, 51, 62, 49,197,207, 74,236,244, 54,174,126, 61,148,178,216,190,101,237, 79,101,102,212, 71,182, 45, 39,177, 62,
-155, 62,214,127,211,238,208, 7,175, 46, 44, 47, 55, 79,171, 70,151,185,134,207,166, 12,110,186,106,227,207, 49,121,119,182,206,
-170,232, 24,113, 56, 28,110, 86, 86, 86,241,249,189,249,167, 95,155,134, 71,165, 14,216,176,126,131, 48, 44, 86,137,167,241,105,
- 24,219,213,167,224, 9,167, 18,199, 93,226,230,231, 92,179, 86,173,253, 91, 54,174,226,196,164,233,240,253,177, 7,184,122,114,
-235,173, 12,217,253,158,200, 76,215,190,203, 53,228, 79, 48, 90,101,106, 94,139,200,134, 74,103,134,222, 96,134,201, 74,160,208,
-152, 32,147, 27,160,208, 24,161,210,154, 49,182,155, 79,169,223,171,192,143,184, 48, 12, 19, 74, 8, 9, 33,132,116, 5,192, 47,
- 90, 46,184,103, 51,161,133,134,236,141,229,121,243,230,125,249,205, 55,223, 68, 22,173, 91,244,126,209,186,229,189, 95,226,251,
- 78,243,231,207,111,176,106,213,170,149,173, 90,181, 58,240,219,111,191,197, 1,200,171,108,243, 33,167,228,198,132,134,134, 86,
-180,163,253,140, 38,163,192, 86,196, 69,205, 26, 62,248,240,203,157,206,191,172,154, 32, 19,242, 57,236,115,231,206, 57,230, 24,
-164, 96,177,216,149,126, 68,145,186, 4,180,230,241,248,103,214,174, 93,139,225,125,219,137,146,178, 77,170,136, 36,109,166,218,
- 0,179,171, 75,109,254,242,149,171,164,171, 86,175,153, 30,122,202, 42, 87,101, 62, 95, 83,122, 19, 95,211, 71,108,166, 68, 14,
- 22,195,128, 88, 45, 41,121, 9, 15,155, 2,192,251,228, 98,169,116, 38,176, 11,115,107, 24, 6,208,232,204, 96,179, 25,153, 60,
-234,208,243,145, 95, 47,239,188,247,192,165, 52,194,178, 87,170,213,241, 98, 20,204, 57, 88,101,116, 6, 11,244, 38, 11, 34,159,
-132,161,125,203,122,104,221,180, 14, 52, 58, 11, 52,122, 51,106,212, 10, 4, 0,231, 82, 15, 28,155, 21, 71, 44, 38, 29, 33, 22,
-155,144,102, 46,112,181,231,195,195, 65, 0, 1,159, 3,147, 25,208, 26,172,208, 25, 44, 72,144,105,161,212,138, 16,212,225,131,
-154, 78, 30,143,244, 25, 9,162, 19,185, 73,143, 6,149,107, 78, 45, 22,236,222,127,196, 63, 45, 45,179,255,217, 19,251, 4, 89,
- 10, 19, 34, 18,212,144,201,245, 0,219, 5,139, 87,126, 47,152, 59,107,242,128,221,191, 30, 77,236,210,174, 69, 98, 85,183, 89,
-147, 21,181,247,208,225, 35, 91, 67, 66, 6,136, 34,239,159, 69,204,227, 43, 43,212,178, 42,229,103,177, 26, 53,106,100,158, 60,
-121,178,114,229,202,149,222,167, 78,157,170,145,149,149,245, 24,128,201,222,222,190, 78,109,127,223, 39, 23,207,159,243,234, 51,
-224, 3,110, 74,182, 22,118, 98, 30,124, 93,197,184,123,235,130,137,207,231,150,154,111, 82,216, 60, 56, 2, 93,190,192,169,187,
-113, 61, 35,115,132,215, 39, 77, 24,155,120,241,102, 84,206,230, 61, 23,191,245,146,154, 30, 11,173, 89,155, 31, 53,173,229, 62,
-239,227,209,248,102,211, 94,220, 8,139,146,169, 89, 30, 43,210,245,230, 75,101,135,210, 1, 14,155,129,141,136, 11,181, 34, 43,
-255,117,248,249,218,127, 82,152,122,236,197, 19,123, 89,185, 74, 19,146,179,117, 76, 90,174, 18, 22, 43,129,189,152, 7,179,149,
- 64,158,155,205,236,219,187, 7, 15, 31,222,101,129,205,154, 8, 96, 73,185, 59,148, 41,104, 42,148, 10,185, 5, 17, 33, 81,193,
- 95,147,197,138, 64,255, 90,216,190,121,157,173,179,171, 27,218,182,175,124,110,180,141,147,111,163, 3,187, 54,227,250,111,225,
- 29,111,108,248,190,153,212,211,101, 19,195, 88,190, 3,129, 78,111,180, 32, 95,158, 7,190, 33, 25,205,189,178,224, 40,182, 32,
- 65,225,129,103, 25, 49,210,138, 46,248, 57,207,142, 63,102,200,128,133, 71, 78, 95,253,166, 71,183,142,120,150,160,128,136,207,
-129,144,207,134,144,207, 6,151,177, 96,221,143, 91, 77,121,249,202,144,156,200,147,217,239, 80, 63, 47, 23, 62,253, 22,152, 59,
-139,202,101,239,166,133,191, 76,250, 98,117,143,158, 3,199, 49,207, 30, 94,251, 82, 3, 92,169,220,131, 30,169,212,123, 86,107,
-229,239,113, 66, 27,231,141, 51,231, 46,159,217, 61,228, 3,176,217, 28,152, 76, 38, 28, 61,184, 23,187,190, 95,252,210,160,202,
- 25, 7,192,106,144,177, 39, 31,218,251,227, 7, 95, 44, 90,199, 52,104,212,188,197,181,244, 63, 78, 71,107,101, 51,219,198, 76,
-152, 50,204,205,205,205,230,247,136, 22, 65,237,192,122,232,221,111, 48, 46,156, 60,142,231,145, 17,176,146, 2,195,100,181, 18,
-200,243,114, 50,204, 38,195,238, 50, 91, 60,132, 66,223,157,187,246, 4,176, 88, 12,140, 38, 43, 12,102, 43,102,125,244,161, 97,
-234,167, 95,182,237,221,189, 67, 36,159, 13, 69, 66, 82,186,253,221,240, 23, 65, 86,174,212,123,194,156,117, 60,157,222,130,124,
-141, 9,103,127, 46,219,235, 8, 29,124, 90, 85,111,210,123,194,212,175,182, 11, 4,108,150,177,126,109,239,184, 14, 45,235, 39,
-251,120, 58, 43,151,173,250,190,249,237,251,225,189,135,142,156, 32, 28, 91,167, 9,227,233, 36,178,249,112,228,192,134, 22,179,
-113,140, 38, 55,185,204,241, 5,185, 98, 7,185, 79, 13,127,205,239, 17,163,218,199, 24,130,154,111, 56, 15, 6,113,218,204,232,
- 65, 0,224,225,233,163,227, 10,108,149, 85,136,192, 16, 0,216,244,211,175, 77,159, 68,167, 77, 90,191,126,131, 56, 44, 86,137,
-199,177,249, 16,240, 88, 48,154,172, 96, 42, 25,212,182, 18,246,148, 5,243,231,217,230,169, 45,184, 30,145,133,200, 71,215,136,
- 65,165, 27, 41, 54,219, 14,130,171,205, 24, 0,181, 0,188,102, 24,178, 77,157,233,126, 18,184, 97,174,106,189,183, 90, 11,158,
-151,109, 93,252,106, 90, 56,130,222, 92,190,164, 21,195,144,250, 12,129, 3, 64, 82,115, 11,239,169,149,117,106,234,204,104,172,
- 94,185, 8, 27,119, 28, 71, 90,142, 14,118,150,100,156,252,121, 57, 62,251,102, 63,180,250,178,179, 26, 42,242, 35,165, 25,163,
-183, 13, 87,209,255, 69,235,125,243,205, 55, 33,111, 29,155,144, 50,142,217, 31,214, 43,250,254,170, 85,171, 86,150,248, 92, 83,
- 89,147, 85,108,180,138, 54,170, 2,179, 85,219,197,195,247,183,147, 39,142, 57,228,169,140, 16,242,216,240,169,225,143, 37,155,
- 79,186,244,106,234,140,108,163, 29,126,221,254, 93,174, 78,163, 60, 88,169,139,133,107, 96, 11,145, 84,114,246,216,209,227,240,
-243,113,229,237,187,149, 27, 31, 30,167, 45, 14,245, 42,178, 18,249, 53,108, 53,156, 65, 3, 7,138,175, 92,189,246,169, 10, 40,
-213,104,177, 25,118,181,159,246, 28,117,181, 17,113,193, 48,128, 82,107,198,164, 49,131,223,255, 54, 70,172,236, 9,227,198,130,
- 41, 52, 89,138,156, 12,124, 57,247, 35,157,196, 20,243, 60, 41, 33, 41,181,107,223,207,174, 40, 84,140,110,216,232,143, 30, 62,
-143,254, 38, 79,163,121,183, 73,126,244, 6, 11,244, 70, 43, 98, 99, 95, 99,214,216,110,224,178, 89, 96,179,173, 5,201,210,230,
-178, 43,163, 42, 45, 58, 23,238,188, 33,123,215,206,248,201,211,205,213, 73, 42, 17, 17,169, 88,192,212,175, 19,192,107,217,178,
- 53,191, 70, 96, 67,222,173, 23, 90, 36,101,105, 17,151,150, 15,129, 91, 99,206,240,206,189,176,119,195,156,142,185, 73,143, 88,
-248, 99,146,226, 27, 92,186,126,175,239,142, 31,215, 11, 50,229, 70,188, 76, 82, 33, 35, 79,135,244, 60, 61, 50,114,117,144,138,
-184,104,223,111,178,224,204,201,109,125,187,180,107,177,233, 93,182, 59, 46, 46,254, 76, 66,106,250, 7, 13,131,155, 99,239, 47,
-187,218,217,219,215,176,149,203,227, 21,149, 61, 58,203,151, 47,231,175, 90,181,138,179,121,243,102, 69,203,150, 45,221,231,207,
-159,223, 67, 38,147, 61,168, 94,189,122,224,133, 99,187,175, 54,110,223,191, 25,172, 70,151,118, 29, 58,241, 4, 86, 14, 46,134,
-134, 26, 15, 29,220,151,163,213, 42,167,150,107, 56,196,118,203, 51, 85, 12, 92,188,188, 34,165,124, 75, 55, 14, 75, 30,157,119,
-126,230,158, 60,224,152, 95,207,143, 47, 95,123, 20, 21,221, 52, 44,193,245,106,216, 43, 89,174,198, 88, 59,246,252,103,229, 94,
-120,217, 12, 3, 46,155, 5, 27, 17, 7,172,194,171,170,212,179,225, 43, 48,140, 75, 81,228,148, 1, 83,248, 23, 96, 24,164,229,
- 37, 61,174, 68,206, 6, 67,172, 4,136, 74, 81, 67,165, 43, 8,205, 87,115, 22, 35, 43, 51, 5, 63,108,218,141,240, 71, 15,209,
-189, 87, 63,108,249,105, 31, 38,141,249, 64, 87,209,211, 15,139, 85, 24,209, 42, 17,205,146,138, 56, 0, 24,200,213, 38, 28,189,
-157,140, 90, 53, 89,149,190, 49, 0,128,141, 84,140,124,165, 22, 44,158, 13, 94,135,157, 21,159,187,118,127,254,194,175,215,127,
-158,151, 30,145,244,234,233, 45, 4, 58,231,163,166,151, 17,145, 25,182,120,148, 83, 3,129,254,126, 96,241, 30, 86, 74, 59, 59,
- 50,104,245, 73,214,209,144,166,141,235,181,242,117,181,135,214, 96, 41,140,106,177,177,107,231, 30, 36,196,167, 76,200,121,126,
- 50,252,207,112,180,106, 89, 92,150,192,213,127,250,211,251, 87,226, 6,142,156, 14, 15, 47,159, 70,242,164,199,149, 78, 91,168,
-204,123,150, 74, 26, 45,158,216,126,254,172, 5,223,206,236,222,103, 8,238,221,186,130,199,145,175,209,162, 69, 51,244, 26, 48,
- 28, 74, 69,110,157,195,123, 54,116, 51,107,148, 23, 56, 2,243,204,230,173, 59, 51, 86,139, 5, 49, 47,159,189, 46, 77, 75,155,
- 30,245,248,110,122,148,237, 27,205, 83,206,117, 26, 73,237, 28, 31,235,141, 22,164,166,166,224,206,111,215,131,181,233, 81,143,
-171,178,191, 4, 60, 54, 46,134,203, 96, 52, 89, 97, 52, 91,209,190, 67, 55, 3,143,165,111,183, 98,253,206,150,233,105,233, 44,
-137,173,179,213,209,171, 46,207, 67, 96,212, 63,137,205,231, 25, 77, 86,248,121, 74,202,213,116,241,244, 95, 57,103,206,172,186,
-108,158, 8, 74,181,222,144,158,150,234,190,253,215,107,170, 23, 47,159,122, 85,115,181,179,253,118,195, 54,158, 66,199, 64,150,
-175, 71,174, 82,193,140,156,242,133,231,142,239,191, 25, 85,158,209, 42, 37, 93,164,230,153,139,183,234, 56,216,240, 24,149,206,
-108,205, 81, 24, 45, 35, 7,188, 95,167,203, 66,147, 53,121,253,186, 13,226,240, 88, 37,158,196,230, 67,200, 99,131,207, 99,193,
- 96,178,162,146,167, 19,203,221,213,125,106,235,166, 65,184,240, 56, 27,108, 54, 11, 90,101,158,134,131,156,232,166, 29,187,139,
-155, 52,111,137, 78, 29, 59,224, 85,116,148, 79,232,169,163, 93,238,222,185,145, 97, 54,214,158,161,206,138, 62, 94,165,192,130,
- 70,195, 54,241,221, 63,244,240,170,222,102,208,240, 15,237,124,125,188, 24, 87,103, 39,152, 9, 7,147,199, 12,174,244,153, 95,
- 96,204,129, 85, 95,207,135, 94,111,128,139, 61, 31,132, 0, 59, 55, 45,129,193, 96,128,167,147, 0,249,234,178,103,147,171,200,
-143,148, 21,133,170, 82,238, 73, 9, 51, 86,222,251, 12,195,132,206,155, 55,239, 75, 0,100,222,188,121, 95, 22, 45,127,243,205,
- 55, 90, 0,105, 21, 52, 29,110,127,195,104, 21,109, 92,217,103, 55, 47,208,217,201,227,238,197, 11,231,237, 78, 60,177,226,222,
-241, 71,232,211,194, 3, 60, 14, 11, 98, 59, 79, 60,137,207,199,153, 99, 63,202, 79, 30,216,150,170,215,235,215, 84,220,214,236,
-223, 84, 42,150, 92,248,101,239, 65,171,179,147, 19,235,135,139, 89,177, 57, 74,115,113,147, 86,244,253, 83,214, 71, 23,182,123,
- 16, 48,231,133, 66,161,191,193, 96,112,168,232,192,238,188,152, 88,152,196,203,252, 25,215, 86, 48,108,182,101,239,190,189,112,
-182,229, 67,111,178, 98,222,231,159,104,199,118,151,202, 71, 14, 29,222,185, 83,239,153, 87,185,146,128, 43,173,131, 3, 72,227,
-198,141,229,108, 54,187, 82,169, 20,174,174,174, 75, 88, 44,214, 8, 62,159,111, 99, 48, 24,148, 6,171, 78,172,214, 25,160, 51,
- 2, 26,141, 14, 92, 94,129, 89,228,178, 25,104,117, 6,104,180,134,242, 79,140,140,103,183, 1,212, 86,148,136, 41, 93,121,225,
-199,223,127,248,228, 39, 67,134, 14, 91,232,213,104,128, 52, 62, 61, 31, 60,198,136,102,117, 61,112,237,252,113,146,146, 16, 61,
-171, 34,147, 5, 0,178,172, 92,111, 23, 23, 55,132,199,169,144,154,163, 69, 70,161,201, 74,207,211, 67,169, 85,162,161,175, 39,
-228,249,249,222,239,188,127,129,227, 23, 46, 92,248,160,119,255, 97,152,249,249,210,182, 63,255,248, 93,132,132,207, 29,175,206,
-140,185, 94, 25,163,245,236,217,179,220,185,115,231,214,250,233,167,159, 88,163, 70,141,210, 6, 5, 5, 9, 71,143, 30,221,118,
-207,158, 61, 66,177, 88,168,125,114,235,212,194,137, 31,207,235,191,125,227,242, 70,121,121,121,140,217,100, 58,103,204,203,155,
-167,170,192,204, 37,159,250,242,229,226, 88,227,184,110,237, 92, 78, 57,138, 89,245, 5,196, 48, 28,117,151, 28,196,139, 37,198,
-216,243,155,149,162, 15,214,126,156, 38,183, 46,208,177, 92, 87, 84,100,178, 0,128,197,102, 96, 48, 91, 96, 35,226,130,197, 98,
- 21,153,120,143, 93, 7,207,137, 93,236,248,224,178, 89,224,176, 25, 40, 52, 38,100, 43,140,152,254, 97,255, 74, 63, 9,152, 45,
- 4, 90,131, 25,154,194,167, 67,165, 34, 27,243, 63,159,141, 94,125, 7, 98,226,212,217,200,211, 2,143,226,148, 48,154, 76, 21,
-158, 20, 44,134, 5,141,222,140,241,221,125,145,171, 50, 66,173, 53,195, 96,182, 66,204,231,128,203, 97, 65, 34,228,192, 86,204,
- 5, 8,225, 21, 93, 76,184, 92,174,206,100, 50,237, 45,231,137, 30, 53,188,221,160, 53,177,208,124,216,119,232,218,170, 54, 34,
-111, 31,229,220,184,247,180,230,167,159, 47,192, 39,147,250,226,200,203, 90,112,116,245,133, 84, 34,130,137,176, 0,144, 74, 38,
-236, 45,177,178,140, 3, 71,108,253,105,103,212,178, 69,243,132,114, 53, 3, 1,143,141,171, 87, 46,227,238,253, 71, 27,179,159,
-159,220,139, 63, 17, 46, 97,185,217,218,218, 66,200,103,195, 96,212, 27, 42,159,186, 64, 64,128, 96,137,107,237,173,133, 79,252,
-193, 22, 43, 74,121,175, 98,163,197, 17,218,206,155,241,249,178,149,221,251, 12,193,197,208, 35, 56,124,228,160,165, 85,207, 9,
-236,125,187,126, 68,219,174,253,208,182,251, 48,156, 59,190,103,182,218,202,212,155, 60,115,225,215,237, 59,247,198,197, 51, 71,
-144,153,145,178,182,178,229,101,115,153,153,157,187,245,133,206, 96, 65,187, 46, 33, 56,127,250,248,199, 40,236,100, 81,249,155,
-216, 91,215,103,176,204,179,103,205,228,202,228, 6,110,150,194,128,148, 44, 13,226, 51, 53, 56,121,224,103, 82,249,235,133,161,
- 89,251,134,213,184,147, 87, 95, 77,246,174,230,161,231,234,181,162,232,215,177,117, 38,126, 56,150, 91,211,191, 14, 75,150,175,
- 71, 86,190, 30,217,249,122,168,116,102,248, 87, 11, 96,153,204, 76,171,170, 30,103,103, 59, 62,119,203,233, 56,216, 74,184,104,
- 93,231,221, 59,218, 90,173,214,223, 77,214,250, 2,147, 21, 17,151, 15, 1,143, 13, 1,143, 5, 1,143, 13,179,133, 84,234,193,
- 69,228, 90,187,247,244, 25, 31,121, 26,204, 64, 78,190, 1, 28, 54, 3, 87,103, 7, 73,179, 70, 35,176,243,187,143, 1, 0,147,
-230,254,128,137,227, 71,163,110,253, 32,200,243,242,220, 71, 12,233,189, 30,192,241,202,150,245,236,197,235, 62, 23,111,134,207,
-157, 62,103,177,116,104,223, 78,236,199,177,249, 72,207,213,227,117,180,178, 74,145, 55, 0, 48, 91,172, 32, 32,216,125, 48, 20,
- 34, 62, 7, 89,249, 70, 16, 66,176,124,243, 33,216,136,184, 72,207, 43,104,238, 47,143,114,253, 72, 57, 17,169, 42, 68, 27, 67,
- 80,144,203,229, 82,217,136,214, 55,223,124, 19,249,205, 55,223,148, 26, 33, 43, 97,178,222,109, 82,105, 30, 79, 82,199,214,201,
-249,222,197,243,103,109,142, 63,177,224,218,147, 28, 12,105, 87, 13,170,220, 36,172,249,124,104, 46, 3, 98, 96,177,217,114,189,
- 86,115, 76,171, 85,175, 0, 96, 44,183,210,184,215, 14,150, 8,165,151,183,108,255,197,236,236,234,138,189,183,114, 83,242,212,
-102,211,239,205, 86, 38,230,209,133,237, 53,205, 86, 83, 79, 93,230,171,135, 21, 61,137, 91, 9,120,223,252,120, 18, 0,129,213,
-106, 5,177, 90,193, 21, 74, 37,206,126, 45, 51, 11, 47,116, 66, 14,139,209,149,188, 2, 16,171, 57, 37, 59,174,252, 48, 40, 3,
-192, 78,204,197,193, 27,169, 0,144,201, 86,134,189, 24, 57,180,160,185, 80,103, 16, 42,234,215,170, 69,154, 53,107, 38, 23,137,
- 42, 53,252, 21,219,205,205,237,193,194,133, 11,235, 76,156, 56, 81,192,231,243, 97, 54,155, 29,183,109,223,110,221,190, 98, 18,
- 6,125,188, 5, 60,190, 0, 90,157, 17, 92, 46, 7,121,249, 42,200, 21, 26, 40, 53,166,170,215,160,216, 88, 67, 22,176,250,196,
-113,254,192, 30,210,134,205,249, 44, 30,154, 4,122,224,218,133, 19,228,222,249,157,147,180,178,232, 95, 42, 89, 17,161,210,153,
-144,150,163, 67,106,142, 14, 25,121, 58,100,228,234,145,145,167, 3,195, 48,208, 25,204,239,117,227, 82,203,162, 14,239,253,101,
- 71, 63,189, 17,195,219,119, 31,136,217,139,183,248,238,221,186,234,114, 28, 97,181,169,100,162,173, 37, 50, 50, 50,225,195, 15,
- 63,108,244,235,175,191,178, 27, 52,104,160,125,241,226,133,184,208, 68, 26,165, 82,177,232,231,239,191,185,208,188,121,243, 3,
-169,209, 47,175, 22,182,167, 87,120, 97,247,237, 48, 78, 32, 50,134, 79,246,145,180,238,225,231, 46,134,143, 68,217,163,142,244,
-201,154,156,206,159,172,204,186,186, 81,150,174, 55, 95,202,210,178, 27,167,170,184,149,202,193, 51,233,117,137,131,134, 12, 7,
-155, 97,193,168,211, 36, 22, 85, 46, 87, 59, 62,150,236,123, 9,169,144, 11, 27, 17, 7, 82, 17, 23,109,235, 57,162, 10,215, 51,
- 98,178, 88,161,209, 91,160,213,155,161, 51,152,225,236,237,128,159,246, 30, 70,146, 76,139,147, 15,179, 17,149,168, 68, 64, 53,
- 9, 8,169,248, 50,105,181,152,212,125, 7,143,178, 97,179, 24,176, 89, 12,171, 94,157,218,200, 85, 25,193,227,176,192, 19,138,
- 32, 17,112, 96, 43,226,130,199,227, 66, 38,147, 65,175,215,195,199,199, 71, 88,190, 21, 36,176,145,138, 16, 80,211, 19, 70,147,
- 25,103,111, 62,199,138, 89,131,208,173,125, 83, 48, 92, 41, 94,234,131, 97,227,104, 3, 43,139, 5,163,217, 10,131,209, 2,128,
-165, 43, 75,207,219,219,187,179, 68, 34,145,104, 52, 26,101, 82, 82,210,245,140,168,227, 73, 22,118,255,201,231, 47, 94,221, 27,
-210,171, 27,194, 35, 34,113,228,248,169, 91,217, 78,249,115,138,190, 83,191,126,253,150,206,206,206,210,156,156, 28,197,179,103,
-207, 30,188,235,115, 1, 97,177, 62,109,213,182, 35, 84,114, 25, 50,147,227, 43,253, 20, 93,215,215, 6, 95,125,179,165, 73, 96,
-237,192, 38, 22, 82, 96,188,234,249,216,224,179,197,155,154,212, 10,168,221,164,168, 67, 72, 93,159,242,135,101,227,136,109,186,
-143,153, 56,251,155,126, 67,198,225,234,197, 83, 88,183,226,243,189, 18, 59,151,186,142, 14,118,141, 27,180,236,142, 91,151, 79,
- 65,104,227, 14, 7, 39,247,182,163,198,207,232, 58,100,212, 20,220,189,117, 25, 27, 87,125,185,199,162, 87,238,175, 76, 89, 37,
-174, 53, 93, 26, 5, 55, 31,105,227,232, 6,121,190, 18, 54, 14,174,168,219,176,217,200,231, 79,244,115,213,178,184,172,119, 54,
- 29,132, 64,111, 36,200, 83, 25,145,156,165, 69, 66, 70,129,209,178, 90,171,144, 19,100,177, 50, 82, 33,135,227,104,122,229,243,
-244,242, 85,226,235,237,198,172,254,250,115,182, 17, 66,100,201, 11, 76, 86,150,194,128,172,124, 3, 84, 58, 19, 28, 37, 28, 88,
- 45,214, 42, 63,117,231,169,140,176, 17,115, 97, 39,230, 85, 58,202, 88, 26, 63,238, 58, 24,248, 36, 58,109,192,186,117, 27,196,
-143,227, 74,152, 44,110, 65, 52, 75,192, 99,195, 98,181, 2,149, 56,227,185, 28,238,204,254,189,187, 34, 57, 91, 91,208,107,153,
-197, 32, 32,168, 57,156, 69, 86,116, 25, 54, 15, 0,208,183,119, 65,106, 91, 92,186, 26,167,239,101, 1,111, 38,118,151,127, 45,
-214,106,217,219,247,157,249,244,240,161, 3,118, 58, 11, 7,219,206, 37, 64,163, 55, 67,200, 99, 67,192, 99, 67,196, 99,191,145,
-143, 93,177,209, 42,200,185, 75,202, 54, 65,163,211, 65,161, 53,129, 0,120,240, 74, 5,173,193,140,124,181, 9, 45,235, 56,188,
- 95, 32,132, 97,206, 16, 66,250,188,109,136,222, 54, 75, 37, 34, 82,165,105, 60, 44,169, 81,180,126, 89, 70,174,100,206, 22,128,
- 42,245,224,226,188,237, 28, 75, 46,243, 36, 14,117,237,108,236,238,157, 63, 23, 42, 61,254,196,138,235, 17, 5, 38,203,164,205,
-198,218,185, 35, 82, 20,242,236, 78, 0, 98, 43,251, 99, 98,231,186, 13,133,124,193,213,111, 55,108, 51,186,186,121, 89,143,221,
-147,203,242, 53,150, 55,220,132, 69,175,103, 17, 43,225,233, 50, 95, 85,170, 13,129,197, 98,140,139, 63, 30, 8, 43, 33, 88,178,
-225, 48, 86,206, 25, 6,169,104,148,152, 97, 24,177, 90,103,198,172,165, 59,176,246,171, 9, 54, 98, 1, 7, 12, 83,144, 19, 53,
-102,248,192,202, 85, 64,157, 25,175,239,255,170, 82,198,133,190, 40,217, 92,216,162,109,175, 71, 45, 90,180,144, 59, 56, 56, 64,
- 36, 18,253, 30,169, 40, 3, 55, 55,183,175, 22, 47, 94, 28, 56,117,234,212,226,193, 62, 57, 28, 14,166,127,244, 17,203, 98, 33,
- 56,119,110, 39, 92,170, 7,227,212,165,123,232,217,185, 25, 84, 26, 29,114,229, 74, 88,193,126,231,138,168,148,103, 95,205, 72,
-120,218,188, 77,167,190,184,126,225, 4,185,119,238,231, 73, 85, 25,163,199,193,209, 33, 57,236,233,235,186, 12,227, 88, 16,209,
- 42, 52, 89, 6,147, 21,190,110, 98, 36, 39,188,134,189,157, 93,114,101,245, 68, 46,129,253, 25, 22,153,202,128,236, 84,103,198,
- 28, 6, 64,212,233, 47, 70, 28,222,191, 61, 34,242,217,227, 21, 33, 35,103,114,186, 15,249,136,189,245,155, 25, 95, 2,168,236,
-192,123,198,168,168,168,231, 19, 38, 76,104,125,247,238, 93, 11, 0, 13,195, 48, 38, 54,155, 45, 54, 24, 12,188, 78,157, 58,229,
-191,124,249,242, 6, 74, 79, 90,124,131,182, 31, 30,118,102, 4,202, 94,124,171,113,132,175,141,178, 91,167,118,173,208,170,190,
- 55,146,219,181, 2,128,153,137, 42,105,160,174,214,142,131, 38,179,232,236,214, 93,167, 87, 78, 26,214,117,214, 94,206,146,117,
-233,161, 75,202, 77, 68, 77,126,113,163, 71,105, 54,158,195,102,193, 70,196,133, 84,196,129,141,136, 11, 27, 33, 23, 38, 51,169,
-202,147, 35, 49,153,173, 5, 17, 45,131, 25, 42,173, 25, 87, 31,103, 34, 35,223, 0,185,210, 8,173,209, 2, 2, 82,240, 52, 90,
-137,171,121,214,171, 59,246, 69,119, 82,123,159,224,252,237,155,191,179, 61,122, 59,165,184, 71,159,157,152, 15, 27,113, 65,111,
-236,155, 55,111,194,201,169,226,167,125,171,213,138, 35,231, 31, 96,221,238,171, 56,191,243, 11, 8,121,108, 52,236,191, 20,227,
- 6,180,128,149, 88,241, 58, 42, 50, 51,160, 94, 35, 55, 22, 75, 4, 22,195, 64,111,178, 2, 32,101,238, 79,131,193,224,148,148,
-148,164,240,247,247,119,247,244,244, 28,194,102,179, 9,148,143,245, 39, 14,228,106,174,132,238, 23,171,181,122,139,216,156,191,
-211, 63, 93,219, 7,254,254, 96, 24,134,216,218,218,242,174, 94,189,170, 10, 10, 10,114,121,199, 83,137, 37,114,173,189,113,226,
-180, 79,135,212,242,243,195,225,253, 59, 65, 8,115,180,178, 95,222,119,250, 46,190,158,255,102, 15,195,207, 22,111,106,178,118,
-233,204, 55,222,155, 54,127, 93,185,189, 14, 69, 2,233,156, 65, 35, 38,227,209,131,223,176,102,233,103, 7,244,170,220,113, 38,
-179,233,131,220,244,184, 3, 53,235,181, 0, 49, 42,113,241,208,119, 24, 54,122,146,160,123,200, 16,220,189,117, 25, 43,191,156,
-182, 79, 35,151,125,136, 74, 38, 57, 91, 9,119,106,167, 30, 3,184, 90,189, 17,155, 86, 47,194,148, 57, 43,208,178,115, 95,238,
-179,199,247,166, 2, 88, 86,233,116, 8,163, 5,157,130,156, 11,204,179,201,138, 83,113,108, 78,105, 53,144,195,102, 88,141,253,
-236,161, 53,152,161,168,224,161,146,195,227,102,200,243, 21,213,191, 95,249, 41, 91,173, 51, 35, 43,223, 0, 89,190, 30,217,242,
-223, 13, 86,118,190, 30, 89,249, 6,112, 57, 12,162, 99, 19,193,226,114,170,156,159,151,167, 50,161,121,109,135,130,115,244, 29,
- 91, 71, 76, 28,219, 22,231,111, 60, 25,180,110,221,122,225,147,120, 37, 34,226, 20,133,145, 44, 54, 4, 92, 22,248,133,255, 91,
-172, 5,185,145,229, 97,235,226, 87,115,236,152, 81, 93,108,165, 34,164,197,200,192, 97, 23, 12, 17, 99,231,234, 13, 59,129, 14,
- 51,166, 77,134,179,147, 61,146,178,245,216,120, 60, 26, 17,207, 95,193,170,173,218,102,111,218,118,160,231,196,233,159,217,179,
-184,124,236,185, 16, 95, 80, 78,182, 5, 47,239,157,214,165,189,126,170, 86, 41,114, 8,136,165,146, 57,200, 12, 49, 91, 10,170,
-219,202, 37,243,112, 96,247, 15,184, 16, 38, 43,174,129,183,143,174,197,167,243,151, 35, 91, 97, 64,105,245,178, 60, 63, 2, 32,
-171, 68, 36,234, 15,203, 37,204, 81,105,203, 76,225,178,161, 12, 13,195, 91,230,202,240,214,251,134,183,244, 74, 27,251,111,123,
-133, 77,135,127, 48, 69,246, 46, 13,196, 66,201,111,231,206,157,150,156,136, 32,197, 38,203,168,201, 38, 43,102,246, 77, 81,200,
-179,186, 87,201,100,185, 4, 52, 16,136, 5, 55, 22, 46,223,168,119,243,170,110, 62,251, 88,145,163,212, 89,204,127,204, 65,144,
- 88, 36,118, 46, 58, 14, 95,176,142,171, 53, 44,202,206,126,161,174, 40,242,100, 37, 4,161,247, 51, 64, 72,193, 35,210,161,155,
-169, 40,124, 50,135,197, 90,208,172,114,233,177, 12,156,194, 60,148,202,134,191,127,220,246,131,162, 79, 80,190,122,228,202, 37,
-197,205,133, 45, 27, 21, 68,178,108,109,109, 97,111,111, 15,169, 84,138,138,154, 14, 25,134, 25, 51,113,226,196, 63, 60,253,203,
-100, 50,116,237,210, 9,155,127,248, 9,141,186,140,197,165, 59, 23, 96, 52, 89,209,176,158, 31,170,123, 58, 32, 57, 83,249, 78,
- 39,186,196, 45,112,122,243, 78, 3,190,108,219,185, 47,174,158, 63, 70,238,157,223, 53,185,170, 3, 33,246,233,218,250,244,215,
- 95, 47,169,185,112,197,247, 2, 27, 33, 7, 47, 84, 6,176, 24, 6,190,110, 98, 56, 73, 88,184,126, 98,143,110, 88,223,214,149,
- 30, 28,207,219,219,107,239,218,205,219, 37,107, 87, 45,237,244, 40,140,185,170, 74,139,206, 5, 0, 77,102,212,234,151,192,243,
-106,191, 93, 60,219,168,195, 64,184,121,250,117,139,203,124, 89,105,179, 1, 64, 19, 27, 27, 27,183,112,225,194,192, 85,171, 86,
- 17, 54,155,109, 5, 32,216,176, 97,131, 38, 38, 38,230, 49, 10,186,230,162,162,155, 77,151,110,245,103, 73,249,150,150,142, 98,
- 86,125, 63,119, 49, 90,213, 47,104, 21, 29,214,167, 45,188,125,124, 16,155,161,105,156,171,177,114, 85, 6,182,223,150,109, 17,
- 15,107, 56,179, 39,153,181,134,231, 0, 78,190, 67,179,105,113,130,124, 81, 52,203, 70,196,133,181,160,174, 84,201,104,233,141,
- 22,104,245, 22,104, 13,102,168, 13, 22,104, 12, 22, 88, 73,193, 57,193, 48, 12,140,102, 43, 42,245,216,252, 86,221,183,117,116,
-134, 95, 13, 6,182,226,130,178,217, 22, 14,247,192, 0,112,114,114,130,171,171,107,165,162,162, 6, 99,193, 41,110, 48, 89,139,
-155,245, 13, 70, 51, 8, 33,136,142,142,250, 34, 33, 46,174,191,127,128,127,251,122, 13, 27, 57,138, 5, 44, 0, 40,211,104,105,
- 52, 26,139,141,141,141,171,163,163, 35, 43, 53, 53,181,216, 60,251, 55,238,100, 62,126,236, 40, 6, 13, 26,168,122,241,224, 73,
-113, 23,119,173, 86,203,180,105,211,198,214,219,219,155,165,215,235, 21, 85, 61, 76, 18,151,218, 3, 28,156, 28, 87,140,249,112,
- 74,237, 78, 93,123,226,218,149,139, 56,121,236,215, 95, 52, 89,209, 23, 43, 43, 18, 24, 88,231, 15,189, 14,107, 5,212,254, 67,
-175,195,234, 53, 3,202, 53, 90,245, 26, 54,107, 65, 24, 14, 46,132, 30, 34, 58,150,113, 26, 0,171, 69,167, 60,116,240,199,175,
-150,141,152, 58,191, 86,239,126, 35, 48,102,244, 56,112, 56,108, 92,191,116, 26,107,151,206, 62,163,202,151,141,173, 76,154, 64,
- 65,232,173, 46,207, 75,228,253,137, 79,173, 6, 8,187,119, 11,175,163,159, 69, 62,121,120,183,190,127, 80, 75,184,120,250,126,
-146,232,204, 94,133, 23, 47,140, 21,201, 24,116,186,196,113, 99, 71,163,100,175,195, 86,193,129, 78,204,219, 39, 0, 0,141, 82,
-102,252,249,187, 89, 49, 69,189, 14,173, 70, 67, 98, 89,186,249,121, 89, 71,174,223,185, 63,167,127,159,158,172,108,133,161, 32,
-130,149,111, 40,124,233,145, 93,244,191, 66,143, 0, 79, 41,162, 34,195,172,186,252,236,163, 85, 60, 47,117,227, 62,232,241,188,
-168,238, 90,173, 4, 12,160,171,114,179, 20,215,118,242,234, 53,235,132, 79,226, 84,136,136, 87, 20, 52, 21,114,217, 5, 6,139,
-203, 42, 54, 93, 5,189,217, 43,136, 14, 49,236,149,227,199, 14, 71,182,194, 8,171, 21,224,176, 89,133, 47, 30,146,148, 12,146,
-149, 26,100,231,101, 33, 46, 33, 17,242,140,215, 96,177, 88,112,246,172, 93,233,145,164, 45,132,239,161, 49,144,160, 33,125,218,
-115,142,253,150, 14,177,128, 3,189, 50, 19,231, 14,126,151,165, 87, 41, 86,104, 53,170, 99,149, 25,207,241,247, 20, 4, 38, 75,
-161,210,185, 9,184,108, 28,222,253, 61, 62, 24, 55,237,141,171,239, 23, 11,190, 6, 88, 12,114,243,148, 96, 24, 38,171,106,215,
- 37,230, 97,121,203,239, 24, 25,123,111,141, 82,204,214, 31, 31, 20,202,126, 26, 37,231, 46,158, 63, 45,185,157, 32,192,131,168,
-244, 66,147,149,101, 93,254,113,159, 20,101,126,110, 15, 0,209, 85,123, 46,100,245, 24, 54,126, 78,164, 95,237,122,250,107,207,
- 84,241,114,181,169,204, 60,135, 86, 67, 22, 70, 62, 58,179,185,119,190, 41,246, 35,137, 71, 61,139,213,108, 94,173,205,138, 94,
- 90, 70,211, 33,127,233,198,195,197,205,134,115, 87,237, 41,248,223, 98,129,133, 88, 65,172,192,140,175,126,132,217,106,129,213,
- 98,129,213, 66, 96,178, 16,113, 69,197,117,245,172,126, 44,239,229,161, 58, 35,151,253,177,185,208,222,222, 30, 78, 78, 78,112,
-114,114,130,173,173,109,133, 70,139,203,229, 74, 57,156, 55,119,117, 98, 98, 34, 18, 18, 18, 96,107,107, 11, 98, 53,193, 96, 2,
- 26,180,236,142,167,175,159,225,242,237,199, 32, 86, 11, 36,210,170,207,242, 34,113, 11,252,168, 89,199,254,223,119,238, 55, 1,
-151,142,109, 35, 15,111,158,158,162,149, 69,239,168,116,132,222, 98, 97, 76, 38, 19,250,116,239,152, 24, 30,249,234,252,130, 57,
- 83,123,182, 14,153, 34,104, 21,232, 5,157,193,130,148,132,215,184,126, 98,151,174,118, 77,143, 11, 93,218,181, 72, 52,153, 76,
-176, 88, 44, 21,222,200,117, 6, 99, 54,155, 43,146, 12, 31, 62,146,251,240,193,131,163, 18,151,128,195, 22,134,245,132, 33,214,
-134, 12, 33,131, 26, 54,172, 11,163,201, 10,141, 70,145, 87,213,109, 86, 42,149,113, 59,119,238,172, 57,118,236, 88,113,189,122,
-245,184,175, 95,191,198,218,181,107,115,148, 74,101, 92,101, 53, 46,222,140,218,192, 97,242, 98,138, 34, 90, 73,109, 91, 97,120,
- 72, 91, 28, 56,115, 27,215,111,221, 69,162, 74,250, 88,101,230,156, 72, 78, 76,211,215,119, 84, 28,237,215,170, 58,251,240,238,
-188,163,145, 29,231, 13, 37, 68,112, 49,251,198, 18,117,229, 79,110, 64,169, 53,193, 86, 92, 48,222, 83, 81,100,139,205, 48,149,
-118, 68, 12, 16,119,235,110, 88,131,166, 1,245, 16, 30,151, 15,153, 92, 15,173,222, 12,171,149,192, 10, 2, 39, 27, 62,132, 60,
- 22,146, 18,226, 96, 37,198,248, 42,222, 42,178, 58,180,239,192, 1, 24, 48, 12,225,112, 57, 28, 16, 20,140,175, 40, 18,137, 84,
-174,174,174,149,138,104, 25,205,102, 12,234,217, 2, 45,155, 53, 68,255, 41, 5, 99,102, 94,249,101, 30, 28,164, 92, 28,216,187,
- 3,201, 55, 55,236,173,217,106,234,197,103, 79, 35, 7, 71,134,255, 54,178, 87, 19, 81, 99,119, 78, 26,175,172, 48,169, 90,173,
- 62, 10,128,207,227,241,122,182,111,223,222,241,232,209,163,114,103,103,103, 43,159,199,203,234,215, 55,196,202,229,241,114,139,
-214,189,115,231, 14,119,202,148, 41, 54,121,121,121, 73,153,153,153,119, 1,152,202,127, 16, 12,236, 10, 22,126, 5,195, 8,165,
- 34,113, 98,141, 26,126,158,205, 90,182,176, 27, 48,232, 3, 8,248, 2, 92,186,120, 30,155,214,175, 58,164, 74,127, 49,190, 42,
-123,242,207,234,117,152,146, 20, 31,167,209,234,131, 26, 52,237,200,220,186,120, 98,166, 17,206,235,217, 2,227,119, 93, 7, 77,
-171, 21,151,166,194,166,111,190,128,131,157, 4,241,175, 95,106, 99, 94, 60,253,209,164, 83,124, 81,105,147, 5, 64,156, 99, 25,
-220,106,116, 79, 7,189,209,130,155, 87,207,232,172,102,107,207,187, 55,206,190,174, 86,187,153,176, 65,179, 46, 14,217, 39,119,
- 12,210, 0, 7, 42,210, 73,125,249,199, 8, 46, 49,200,227,175, 92,189,108,231,230, 91,159,205,128,129, 81,175, 67, 86,236, 67,
-179, 38,243,165, 66,145,250,172, 82,189,112,115,146,241,213,252,197,223,126,212,172,105, 83, 9,129,240,141, 8, 86,145,193,202,
- 86, 24,224,108,195,135, 86,145,133,152,135,231,117,154, 44,118,185,227,157,153, 13,106,113,182, 44,147,255,123, 58, 67,116,203,
-242,214,207,150,101,242,205, 6,181,184,226, 91, 29, 27,182, 18, 62,158,198,167, 22, 39,190, 11,184, 5,185, 89,124, 46,187, 56,
- 79,171,232, 90, 80, 1, 29,121, 66,123,164,230,232,192,128,192,106, 49,195,108, 50, 64,169, 80, 32, 53, 45, 3,153, 25,153, 80,
- 42,229, 16, 75, 29,208,160,113,115,216, 72,132,120,114,253, 16, 8, 33,149, 26,215,208,196,112, 3,155,181,108, 39,120,150, 80,
-144,139, 37,228, 18,156,254,117, 85,142, 74, 33,107,167, 74,143,137,169,234,181,216,108,177, 92,142,120, 30, 83,191,154, 71, 13,
-230,241,235,124,236,253,105, 51, 12,133,145, 77,147,201,130,103, 73,106,164,231,106,144, 20,251,130, 88, 45,150,203,248,143,192,
- 41, 59, 0, 8, 78,195, 6,117,209,125,212, 0,252,240,195,143,136,141, 75,176,174,152,217, 59, 73,165,148,247,170,130,201,234,
-138,194,177, 54, 52,153, 81,171,181, 14,205, 82, 78,133,231,178,180, 6, 82,110,130,143,208,197, 23,237,198,175,189,160, 85,230,
-242, 45,122, 13,231,244,222,241,191,150,166, 89,224,160, 97, 88,241,217, 48, 72, 69, 28, 48, 12,131,162,230,194, 45, 95, 79,134,
- 88, 80,208,182,172,213,155, 49,106,214, 58,236, 93, 55, 27, 4,192,136, 15,110,107,202, 42, 39, 10,230, 46,156,225,129, 7,213,
- 18, 19,100,169, 93,251,126,118, 69,103, 20,232, 67, 6,142,125,212,180,105, 83,185, 72, 36,130, 72, 36,130,173,173, 45, 28, 28,
- 28, 96,111,111, 95,225,182,155, 76, 38,149,193, 96,112,226,243,249,176, 90,173,136,143,143, 71,124,124, 60,242,243,243,145,149,
-149, 5,181, 74, 97,126,112,229, 48,167, 65,171,222,240,244, 11,130,111, 64, 35,112,217, 12, 56, 28, 22,174,159,250,169,172,114,
-150,110,178, 58,244,219,210,165,255, 68, 92, 58,182,157, 60,188,121,122,170, 86, 22,253, 83,101,143, 81, 97,115,207,147, 65,131,
- 6, 5, 77,153, 50,133,183,120,206,148, 11,103, 46, 94,143, 62, 28,186,189,111, 94,158,220,155, 16, 2,123, 59,187,228, 97,125,
- 91,159,238,212,166, 89,226,149, 43, 87,172,191,254,250,171,158, 97,152,167,229,105, 22, 92,164,100,191, 92,185,124,117, 73,187,
- 14, 29,177, 99,247,175, 29, 34,159,191,232,240,250,117, 12,188,125,253, 80,163,102, 0, 52,140, 3,174,222,184, 5,149, 92,246,
- 75,101,202,249, 86, 84,139,201,203,203,251,109,216,176, 97,221,111,223,190,205, 26, 54,108,152, 38, 59, 59,251, 78,137, 40, 22,
-169, 72,243,238,214,129, 89, 0,126,241,237, 48,238, 80,170, 81,254, 9,128, 85, 62,190, 62,184,126,235, 46,238,222,190,255, 99,
-182,216,103,233,248, 81, 31, 78,174,222,143, 61,177, 95,171,234,108, 87, 7, 49,246,111, 95,203, 62,117, 55, 97, 93, 66,142,101,
-199,170, 27, 75,190,174,204, 49, 42,190,113, 40,141,104, 83,215, 17, 38, 11,129,149, 20, 92,112,109,132,220,178, 46,188,127,208,
-228, 24, 4,227,167, 78,153,242,186, 65,195,198,159,142,250,112, 42,175,177,159, 55, 30,188,146, 3, 12, 3, 71,119, 9,210,211,
-211,113,243,200,118,115, 94,234,203, 31,217,108,235,178, 42,236, 79,228, 37, 62,246, 47,177, 56, 57, 59, 59, 27,215,175, 95, 71,
-145,193,114,113,113, 41,203,104,189,161,153,147,153,118,231,235, 53,219,218, 76, 26, 51, 16, 33, 29,235,227,198,195,215, 48, 20,
-142,215, 84,212,149, 60,238,238, 86,254, 39,195,252, 12, 31, 13,170,173,208,154,248, 9, 95,197,231,223, 68,193, 28,172,214, 50,
-202,105,200,205,205, 61, 21, 21, 21,213,182, 81,163, 70,213,207,158, 61,155, 27,121,255,194,204,146,133,248,236,179,207,164, 63,
-252,240,131,152, 16,114,199, 96, 48,196, 86,106,219, 89,216, 31,246,232,145,147,209,100,197,173,251, 79,234,118,105,211, 24, 86,
- 2, 60,124,248, 16, 59,126,222,161,123, 26,241,248, 59,117,166,251,178,114,204, 75,169,251,211,242,126,189, 14,139, 53,211, 83,
- 19,190,187,116,230,200,222,102, 29,250, 98,228,140,101,203,174,159,249,117, 73,147,118, 33,172,186,205,186, 35,236,238, 85, 92,
- 62,123,254, 91,163, 42,119, 9, 42,206, 29, 41,181,156, 2,145,248,227,122, 77, 58, 32, 41, 49, 1,241, 49,207,126,209,229,190,
- 74, 75,124,205,254, 37, 45, 37,113,106,205,250,109,112,251,194,129,153,229, 24,173,114,235,188,183,139,104,251,217,208, 83,195,
- 83, 82,182,186,171,181, 58, 1, 33, 68, 39,224,115, 50,164, 44,229, 65, 69,165,203,249,194,152,149, 86,125,208, 7,163,166,158,
-217,180,105, 61,215,205, 94,140,140, 60, 29, 20, 90, 35,148, 26, 35, 88, 12, 3,127, 79, 9, 52,202, 92,220, 56,178,198,100, 80,
-229, 13, 3, 94, 27,203,210,148,184, 6, 46,207,123,117,117,198,103,211,174,129,111,231,237, 89,163,243,252,114,163,117,202,212,
-199,125, 63,155,118, 58,144, 16,210, 69,226, 26,168, 84,203,162, 22,150,181,237, 12, 83,112,126,143,236,228, 13,163,185, 96,252,
- 49,179, 21,176, 88,173,133, 81, 62,128, 20,183,231, 51, 21,108, 59, 99, 61,120,230, 14,210, 50,229,208, 26, 76,208, 27,204, 48,
-154, 44, 96,177,217,176,119,176, 71, 64,141, 96,216,217,219, 34, 51, 35, 13,119,175,156, 66,116,196,141, 59, 12,193, 82,109, 86,
-204,149,202, 28, 35,158,200, 62,208,195,211,157,149,174, 48, 64,196,103,227,241,141,179, 70,147, 65,255, 93, 37, 77,214, 31, 52,
-229, 57,185,235, 62,157,243,249,136, 93, 59,119,187, 7,213,180, 69, 74,182, 22, 41, 89, 58, 40,117,166, 66, 35,102,133, 94,149,
-141,136,171,187, 51, 44, 58,229, 58,252, 71, 40,211,104,153,141, 58,229,209,243, 15,156,230, 45, 89,195,126,245, 58,214,180,252,
-147, 62, 41, 90,149,162,119,149, 35, 89, 37,216, 53,189,230,129,191, 98, 35,254,208, 92, 72,172,176, 18,130,211,247, 51,138,155,
- 11,173,133,153,151,225,175,203,159, 70,176,228,220,133, 29,123,207,188, 20, 17,165,220,167,213,102,218,189,124,245, 93, 30, 0,
-176,217,236,226, 87, 81,110,150, 78,167, 51, 84,208,132,178,231,167,159,126,154, 59,117,234, 84, 65,114,114, 50, 94,191,126, 13,
-185, 92, 14,161, 80,136,243,231,207,155, 96, 53,127, 23,113,251,120,124, 84,216,197, 69,129, 77,187, 87, 11,106,213, 27, 98,177,
- 4, 28, 82,249,100, 76,177,107,237,225, 77, 59,244,251,190,203,128, 73,184,124,252, 39,242,240,198,169,105,218,172,232,237, 85,
-221,151,114,185, 60, 18, 64,204,119,223,125,215,120,199,142, 29, 53,231,204,153, 19,187,231,251, 37,155, 0, 32, 39, 39, 7, 0,
- 16, 30, 30, 78,166, 77,155,166,215,233,116,113,121,121,121, 97,168,160, 3, 4, 0,104,179,196, 43,119,108, 89,213, 32, 57, 53,
-125,160, 95,131,230,112,169,217, 28,238,254, 45,144,167, 52,226,193,171, 52,196,190,184,130, 23,183,142,156,213, 72,205, 75, 80,
-197,241,141, 27, 53,106,228,205, 98,177,106,168, 84, 42,247,122,245,234, 53,146, 72, 36,225,141, 26, 53, 10,230,112, 56, 41,143,
- 30, 61, 74,168,138, 86,226,141,221,122,223, 14,227, 54, 38, 42,109, 58,197,102,104,130, 19,149, 54,225, 26,129,221,236,172,171,
- 27,245,187,216, 94,235,136, 49, 59,242,240,110,197,209,253,219,215,178, 71, 77,254,204,242, 44,223,225, 19,142,136,127,169,106,
-225,106, 86,250, 71, 99,251,255, 62,188, 67, 97, 36,171,240,255, 74,133,233,243,243, 35,242, 1,204,141,120,206,253,254,217, 39,
- 83,190,110,216,172,205,232,246,189,134,177,204, 60, 41, 46, 28,223, 74,226, 34,174, 30,230, 16,203, 2,109, 37,102, 3,168,176,
- 57,200, 96,168,140,201,250, 99, 25,147, 37, 29, 15,255,250,243,184,163,199,143,125, 51,160, 95,127,167, 45, 95, 13,197,154,109,
- 39, 32, 17, 9, 64,172, 86, 12,237,228, 61,100,209,196, 58,125,189,221,132, 94, 71,175,165,220,156,177,254,217, 92,141,198, 24,
- 93,137, 72, 12,201,206,206,190, 37,149, 74,179,218,182,109,219, 82, 32, 16, 48,217,217,217, 28, 87, 87, 87,179,157,157,157, 33,
- 37, 37, 69,163,215,235,143, 2,168,210,176,227, 70,147, 21,241,153, 58,156, 60,118, 20, 79,238, 95,193,139, 23, 81,202, 23,207,
- 95,108,102, 56,100,189, 58, 51, 38, 23,168,242, 3, 62,172,165,246, 58, 36, 85,238,117,104,209, 43,247,239,249,113,121,103,141,
- 78, 63,174, 81,235, 62,168, 94,183, 13,203,104,178,224,233,195,107,184,118,100,253, 26,163, 42,119,222,251, 28, 99,207,106, 53,
- 3, 8,155,143,223,174,159, 1,177, 90,127, 4, 0, 98,181,254, 24,126,251,236,212, 22,189, 39,194,209,181,122, 35,121, 82, 56,
-131,119, 24, 61,156,199, 97,169,207, 29,221,117, 60, 62, 62, 30, 47, 95,190,196,171, 87,175,144,155,155,139,253,251,227,171,116,
-124, 52,121, 9,151,162,159,179,122, 12, 30, 58,242,244,144,225, 99,132, 53, 3,130, 88,129,213, 28,224, 36,229, 32,234, 85, 2,
-162, 31, 69, 88,163, 30,156,213, 25, 21,178, 1,218,188,132, 50,141,159,216,185,174, 27, 96,153, 87, 52,119, 97,171, 86,109, 2,
- 63, 95,241, 77, 75, 39, 23,215, 82,175,227, 57, 89, 50,254, 23, 51, 78, 5,222,189,247, 91,165,230, 58,180, 90, 44, 57,147,199,
- 13,179,178, 11, 38, 10, 69,113,156,186,112,239, 21, 60, 76, 21,188, 79,172,230, 10, 35,248, 31, 14,108, 7,179,213, 10,181,214,
- 8,133, 90,143,124,165, 14,233,178, 28, 60,137,136,192,141,211,167,240, 58,234, 73,156,201, 96,184,200, 98, 49, 71,180,153,209,
- 55,170,214,210,196,169,233,228,232,136,184, 92, 21,132,124, 14, 18,162, 31,233,213,138,252,125,239, 90,143,180, 57, 49,233, 50,
- 54,211,125,216,176,225,231, 59,247,232,103,215,172,117, 87,177,179,173, 61,120, 28,130,152,248, 52,132,221, 57,175,142,125,114,
- 83, 97, 50,168,122,254, 25,179,190,252,205,169,184,215,161, 81,175,238, 59,162,127,135, 99,108, 54,135,111,181,154,245, 70,131,
-126,240,251,152,172,191, 10, 66, 44, 41,227, 70, 12,124,227,217,192,108, 37,162, 17, 31, 92,208,150,124, 86, 48, 89,136,120,196,
- 7,119, 52, 5, 23,144,178, 19,251, 60, 60, 28,251, 20,205, 93,152,152,152,243, 48, 55, 87,127, 13, 64,138, 78,167,123,231, 50,
-102,102,102,126,189, 98,197,138, 16,141, 70, 83,167, 99,199,142, 2, 91, 91, 91,228,228,228,224,226,197,139,166,208,208,208,231,
- 50,153,108, 17, 32, 51,107, 17,252, 75,132,238,248,216,168, 71, 23, 23,213,105,218,163, 90, 80,235,222,149,191,152, 9, 68,147,
- 58,247,155,192, 92, 62,241, 19,121,112,253,196, 71,218,172,152,109,239,177, 91,141, 58,157,238,190, 78,167,123,182, 96,193,130,
-102,110,110,110,110,139, 22, 45, 18, 42, 20, 10,238,150, 45, 91,116,217,217,217, 25, 10,133,226, 46,202,201,167,249, 35,225,166,
-252, 84, 12, 58,119,244,167, 78,228,232, 79,221,236,157,189,186,219,185, 84,171, 37,207, 74,141,203,207, 74,187, 8,224,114,225,
- 64,145, 85,162,113,227,198,126, 12,195, 12, 3,208, 64, 34,145,248, 75,165, 82, 1, 33,164, 14,195, 48,145, 86,171, 53,162, 94,
-189,122,161,207,159, 63,175,210, 96,178,137, 55,118,235,189, 3,219,252,154,171,177,242, 12, 44,222,175,137, 55,118,235, 1, 64,
-118,233,115, 13,128,147,207, 59,206, 29,116,234,110,194,166,200, 60,187,153, 89,215,191, 57, 85,213, 50,231,167, 60,241,255,179,
-234,191, 46,253,121, 10,128,113, 17,143,176,246,105,248,221,197, 12, 1,215, 2,243,114,173,236,213,163, 63, 67,159,203,229,234,
-188,188,188, 74,237, 93, 40, 16, 8,116,122,125,121, 1,148, 27,102, 85, 58,118, 0, 29,118, 31, 59,180,123,220,137, 83, 39,191,
-105,223,101,128,147,176, 90, 53,212,112,101,176,123, 94,147,153, 87,194,179, 30,244,251,252,230, 15,177,105,186, 8, 84, 49, 31,
- 70,165, 82, 69, 3,200, 83,169, 84,253, 9, 33,201, 12,195,120,231,229,229, 61, 54,153, 76, 79,171,108, 8,172, 24,217,170, 85,
-243,253, 12,195,112,136,217,186,250, 46,151,253,171, 46,253, 69, 10,222,115, 90,146,160, 26,182,152,181,104, 99,147, 90,254,181,
-155, 20,205,117, 88,191,186, 13,166,204, 93,219,164,122,205,128, 38,191,207,127, 88, 97,154, 0, 49,105,242,198, 31,251,121,245,
-205,240,123,215,190,116,246,168, 94, 61, 35, 37,246, 69,242,171,199, 95, 91,116,138, 99,239,123,156,227, 95, 69,174,223,241,221,
-220, 57,233,169,113, 59, 52, 89, 49,207, 0, 64,147, 21,243,236, 69, 24,190,202,206, 72,153,147, 35,139,253,238, 93,247,133, 90,
-173, 78,219,183,111,159,125,155, 54,109, 88,110,110,110,200,202,202,194,181,107,215,172, 86,171, 53,181,202, 90,185,113,215,212,
-185,140,227, 47,219,190, 95,205,147,216,244, 54,155,205,158,132, 0, 28, 14, 39,221,160, 81,156, 87,178, 36,159, 35, 47, 65, 87,
-254, 61,195,202, 0, 96, 21,205, 93,104,181, 90,153,213,155,118, 39,112,133, 54,165, 14,134,104,210, 41,197, 86,171,181,210,115,
- 29,202,147,194,106,253, 89,231, 55, 67,200,210, 70, 77, 91,126,105, 50, 25,117,133,231,135, 14,128,142, 16,228,176, 88,204, 13,
-182,213,116, 65,241, 30, 15, 83, 12, 3, 91,194,112, 96, 35,226,128, 1, 3, 85,126, 46,169, 74, 78, 86,169,134, 88, 22, 29,169,
-145,117,240, 61,103, 56, 52,246,234,165,179, 31, 88, 44,150, 26,133, 49,131,120,189, 86,125, 88,149,238,240, 11,240,200,140,127,
- 63,103,138,204, 22,243, 23,255, 80,165,154, 81,254, 78,154,129, 53, 69,253,171,121,185,141,141, 79,144, 61,136, 77,214,252,130,
- 55,167,213,121,159,114,178,221,220,220,190, 98, 24,102, 52,159,207,151, 26, 12, 6, 53, 33,100, 79,102,102,230,215,248,195,228,
-191,193, 92,145,171,118, 44, 95, 40, 94,104,212,169,127,211,200,162, 71, 86,180,237, 98,151,218,221,133, 18,201, 92,157, 86,189,
- 71,147, 25,189,251, 79,222,159,118, 2,129, 32, 88, 42,149,114,179,179,179,239, 3,200,255, 59, 29,247, 70,141, 26,249,176, 88,
-172, 26, 86,171,213, 13,128, 29, 10,122,133,100,115, 56,156,212,194,136, 22,169,170,102,219, 15, 15, 59,119,233, 86,127,214,197,
-155, 81, 27, 10,155, 21,139,241, 26,178, 78, 56,186,119,167,207,126, 57,118,178,180, 94,135,255,184, 58,255,255,167,217,129, 35,
-245,200, 30,199,226,219, 45,239, 18,168,211,100,167,165, 78,187,245, 52,235, 62, 0,229,251,148,147,199,227,141, 50, 26,141, 34,
- 30,143,167, 53, 26,141,251,254, 46,219, 46,114, 13,156,192, 2,169,244,204, 20, 86, 48,143,222,234,180,242,111,169, 75,236,160,
-160,160,118, 60, 30,207,199, 98,177,136, 13, 6,131, 70,171,213,198, 39, 36, 36,252,134,178, 39, 62,255, 75,203, 41,113, 13, 88,
-207,227, 9, 62, 1, 0,163, 81,191, 81, 45,139,153, 85,222, 23,203, 89,255, 31,125,140,156,107, 52,141,225,176,185, 46, 40, 28,
-152,219,106, 54,103,101,198, 61, 12,248, 31,150,243, 95, 7, 33,228, 47,255,141,174, 84,147,106, 82, 77,170, 89, 10, 44,186, 63,
-169,230,255, 82, 83,232, 81,215, 91,232, 81,183,210,131, 46,151,177, 62,221,159,148, 34, 38,151,242, 2, 33, 4, 28,186,111, 40,
- 20,202,255, 0, 43,221, 5,148,255, 37,186,244, 23,201,127,229,250,148,255, 28,101,230, 68, 51,229,184,210,170,132, 4,223,197,
-217, 94,166,154, 84,147,106, 82, 77,170, 73, 53,169,230,127, 78,179, 34,237,127, 98,147,228,228,183,150,207, 0, 72,167, 77,135,
- 84,147,106, 82, 77,170, 73, 53,169, 38,213,252,187,104,254,155, 40,110, 58,100,209,125, 65,161, 80, 40, 20, 10,133,242,215, 64,
-115,180, 40, 20, 10,133, 66,161, 80,222,143,210,154, 14,169,209,162, 80, 40, 20, 10,133, 66,249, 19, 40, 51, 25,158, 54, 29, 82,
- 40, 20, 10,133, 66,161,188, 31, 69, 17, 45, 15,148, 24,222,129, 26, 45, 10,133, 66,161, 80, 40,148, 63,143,116,148, 22,221, 10,
- 13, 13, 37,165,253, 79,161, 80, 40, 20, 10,133,242,255,193, 63,220,139,148,140,100, 77, 46, 92,126,179,215, 33, 53, 88, 20, 10,
-133, 66,161, 80,254, 46,102,235, 31, 70, 81, 36,171,232, 85, 60,105,118,177,209, 10, 9, 9, 97,168,217,162, 80, 40, 20, 10,133,
-242,191,226,223,232, 69, 88,111,111, 32, 61,204, 20, 10,133, 66,161, 80,254,151,102,235,223,180, 61,116,120, 7, 10,133, 66,161,
- 80, 40,148,247,195, 3, 64,159, 18,203,103, 80,162,249,144, 66,161, 80, 40, 20, 10,133,242,238, 76, 46,109,153, 16, 66, 35, 90,
- 20, 10,133, 66,161, 80, 40,127,129,217,162, 80, 40, 20, 10,133, 66,161,252, 85,252,127, 76, 42, 77,103, 54,167,154, 84,147,106,
- 82, 77,170, 73, 53,169,230,191,157,162,113,180,128, 18,227,104, 1,116,100,120, 10,133, 66,161, 80, 40,148,247,165, 15, 10,198,
-207,154, 92,248,183, 15, 53, 90, 20, 10,133, 66,161, 80, 40,127, 46,127,152,126,135, 26, 45, 10,133, 66,161, 80, 40,148, 63,215,
- 96,109,167, 70,139, 66,161, 80, 40, 20, 10,229, 47,134, 26, 45, 10,133, 66,161, 80, 40,148,191, 8, 6,101,247, 28,184, 92, 5,
-157,119,233,125,112,153,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 57,205,138,180, 47,227,159, 71,209,200,240,103,240,123,
- 34,252,118, 66,254,250,105, 27,105,215, 87,170, 73, 53,169, 38,213,164,154, 84,147,106,254,219,153,252,214, 95, 0,255, 63,227,
-104, 81, 40, 20, 10,133, 66,161,252,215,204, 86,177,225,162, 83,240, 80, 40, 20, 10,133, 66,161,188, 31,219,203,250,128, 70,180,
- 40, 20, 10,133, 66,161, 80,222,143,201,101, 45, 83,163, 69,161, 80, 40, 20, 10,133,242,215, 24, 46,106,180, 40, 20, 10,133, 66,
-161, 80,254, 68,147, 53,185,212, 79, 67, 67, 67, 9,221, 71, 20, 10,133, 66,161, 80,254, 87,252,219,188, 72,241,240, 14, 69, 27,
- 70,205, 22,133, 66,161, 80, 40,148,255,165,201,250,135,122, 17, 15,252,222,219,112,114,225, 50, 8, 33,180,215, 33,133, 66,161,
- 80, 40, 20,202,123,210, 7,111,246, 60,156, 92,180, 76,141, 22,133, 66,161, 80, 40, 20,202,251, 51,185,220, 79,105,179, 33,133,
- 66,161, 80, 40,148,255, 37,255,198, 28, 45,134, 30, 86, 10,133, 66,161, 80, 40,148,247,162,180,104,214,255,203, 92,135, 20, 10,
-133, 66,161, 80, 40,255, 73,195, 69,141, 22,133, 66,161, 80, 40, 20,202, 95, 96,178,138,140,214, 95, 61, 96, 41,157,217,156,106,
- 82, 77,170, 73, 53,169, 38,213,164,154,255, 21,147, 85,114,136, 7, 0,180,215, 33,133, 66,161, 80, 40, 20,202,251, 66, 39,149,
-166, 80, 40, 20, 10,133, 66,249,139,160,147, 74, 83, 40, 20, 10,133, 66,161,252, 63, 27, 46,106,180, 40, 20, 10,133, 66,161, 80,
-254, 68,147,245,134,217,162, 57, 90, 20, 10,133, 66,161, 80, 40,239, 71,153, 57, 90, 12,202,238, 57,112,185, 10, 63,240, 46,189,
- 15, 46, 83, 77,170, 73, 53,169, 38,213,164,154, 84,243, 63,167, 89,145,246,101,252,243,153,140,255,167, 1, 75,105,215, 87,170,
- 73, 53,169, 38,213,164,154, 84,147,106,254,215,152, 12, 20,140,163, 69,155, 14, 41, 20, 10,133, 66,161, 80,254, 4, 99, 85, 26,
-212,104, 81, 40, 20, 10,133, 66,161,188, 31,116, 28, 45, 10,133, 66,161, 80, 40,148,191, 8, 15, 20, 68,181,138,254, 6, 83,163,
- 69,161, 80, 40, 20, 10,133,242,231,208, 7, 5, 81,173,162,191,212,104, 81, 40, 20, 10,133, 66,161,252,137,148, 58,142, 22, 3,
- 0,161,161,161, 69,253, 15, 59,134,132,132,220,160,251,138, 66,161, 80, 40, 20,202,255, 39,255, 70, 47, 66, 8,249, 61,162, 21,
- 18, 18,194, 0,184, 78, 15, 53,133, 66,161, 80, 40,148,255, 5,255, 70, 47,194,122,203, 73,118,164,135,153, 66,161, 80, 40, 20,
-202,255,130,127,163, 23,225,188,229, 34, 41, 20, 10,133, 66,161, 80,254, 39,252,131,189,136, 7, 10, 18,225,207, 20,254, 5, 10,
-135,124,160,227,104, 81, 40, 20, 10,133, 66,161,188, 31, 69,189, 13, 39,227,173, 49,181,104, 20,139, 66,161, 80, 40, 20, 10,229,
-253, 40,109,100,248,255,151,185, 14, 41, 20, 10,133, 66,161, 80,254,147,208,185, 14, 41, 20, 10,133, 66,161, 80,254, 28, 74, 70,
-181,182,255,127,253, 40,157,217,156,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 37,147, 85,188,252,198, 56, 90, 20, 10,133,
- 66,161, 80, 40,148, 63, 23,218,116, 72,161, 80, 40, 20, 10,133,242,126, 20,245, 56, 44,185, 76,141, 22,133, 66,161, 80, 40, 20,
-202,159,104,182,254, 0,109, 58,164, 80, 40, 20, 10,133, 66,121, 63, 38,151,245, 1, 53, 90, 20, 10,133, 66,161, 80, 40,127,145,
-225, 98, 80,118,207,129,203, 85, 16,126,151,222, 7,151,169, 38,213,164,154, 84,147,106, 82, 77,170,249,159,211,172, 72,251, 50,
-254,121,252,207, 6, 44,165, 93, 95,169, 38,213,164,154, 84,147,106, 82, 77,170,249,159,132, 14,239, 64,161, 80, 40, 20, 10,133,
-242, 23, 82, 21,163,229,194,225,112,190, 20,137, 68, 63,136, 68,162,109, 28, 14,231, 59, 0, 14, 85,253, 65,137, 68, 50,211,221,
-221,253,165,187,187,123,138,143,143,207, 89, 27, 27,241,167,126, 2,180, 7,192,253,147,182, 39, 16,192,167, 34,145,232,133, 80,
- 40, 76, 0,176, 23,192,167, 0,156,223, 71,248,107, 79, 12,126,246, 73,255, 19, 95,123, 98,240, 91, 31,245,113,115,115,187, 5,
-160,251,159,117, 80,134,139,209,117,136, 4, 73, 67, 36, 72, 26, 46,126,247,167, 6, 27, 27,155,209, 30, 30, 30,119,157,156,156,
- 82, 61, 60, 60,238, 8,133,194, 33, 85,148,112,117,115,115, 91,227,237,237, 29,237,233,233,185, 1, 5,179,147,255,109,105, 39,
- 64,187,150, 2,100,181,226, 67,217,134,143, 31, 90,241,209,173, 27, 32,126, 71,185,182, 0,142,216,218,218, 62,230,112, 56,161,
- 0, 6, 21,214,175, 65, 28, 14, 39,212,214,214,246, 49,128, 35,133,235,189, 75, 61, 93, 3, 32, 21,192,202,194,229,143,189,189,
-189,149, 13, 27, 54, 76,104,216,176,225, 46,127,127,255, 49,149, 21, 19,139,197,221,188,189,189,143,250,248,248, 36,180,106,213,
- 42,215,203,203, 43,170, 90,181,106,187, 5, 2, 65, 71,122,137,163, 80, 40,148,191, 63,125, 1,124, 3, 96,115, 68, 68, 68, 24,
- 33, 36,140, 16, 18, 22, 17, 17, 17, 6,224, 7, 0,171, 80,118, 8,241,141,247,157,156,156,150, 46, 95,190, 92,151,158,158, 78,
-178,178,178, 72,116,116, 52, 89,191,112,174,181,135, 35,135,248,185, 56,104, 60, 60, 60, 94,251, 86,171,118,160,190,148, 53, 23,
- 64,173,202,104,150,192, 65, 36, 18,221, 95,184,112,161,234,214,173, 91, 42,131,193,160,178, 90,173,170,180,180, 52,213,229,203,
-151, 85,109,218,180, 81, 1,152, 5,128, 93, 5,205, 98,150,121,226, 6,249,249, 43,178,204, 19, 55, 74,190, 95,167, 78,157,231,
- 86,171,149, 12, 30, 60, 88, 15,192,171, 42,154,111,227, 5, 8,235,219,194,126,136, 20,153,230,221, 95, 19,178,101, 14, 25, 34,
- 65,210,187,104,186,186,186,158,156, 57,115,166, 34, 53, 53,149,232,245,122,146,148,148, 68,166, 76,153,146,239,234,234,186,175,
-146,219,238, 20, 20, 20,148,121,247,238, 93,171, 92, 46, 39,215,175, 95,183, 54,104,208, 32,179,146,102,171,235, 91,101,217,238,
-233,233,121,182, 42, 47, 87, 87,215, 29, 85, 61, 70, 45, 4, 72, 50,134, 93, 35,228,225, 69,114,106,112, 43,178,190,105, 53, 50,
-200,145, 47,111,203,199,199, 29, 74, 31,202,164, 44,205, 15, 58,116,232,160,126,250,244,169, 37, 39, 39,135, 60,127,254,220, 58,
-105,210, 36, 29,128,200, 73,147, 38,233,158, 63,127,110,205,201,201, 33, 79,159, 62,181,116,232,208, 65, 13, 96, 98, 21,202,201,
- 2,176,115,201,146, 37,132, 16, 66,150, 47, 95, 78, 26, 54,108, 72, 58,119,238, 76, 84, 42, 21, 33,132, 36, 16, 66,118,153,205,
-230,113,149,209,180,179,179, 27, 61,115,230, 76,149, 70,163, 33, 69, 88,173, 86, 34,151,203,201,230,205,155,213,238,238,238,103,
-203,120,200,160, 77, 30, 84,147,106, 82,205,191,155,230, 63, 25, 15, 20,228,105, 21,189, 60,128,130,166,195,138, 24, 49,119,238,
-220, 34, 83,117,174,109,219,182, 15,198,141, 27, 23, 54,110,220,184,176,182,109,219, 94, 7,112,225,209,163, 71, 97, 95,124,241,
- 69, 24,128, 17, 21, 28, 8,135,214,173, 91,203, 51, 50, 50, 72, 64, 64, 0,169, 94,189, 58,201,200,200, 32,132, 16,242,240,131,
- 38,228, 74, 93,144,228,155,231,200,197,227, 71,200, 36, 15, 14,105,231, 97,103,242,112,119,207,113,118,118, 94,129,130,164,253,
-242, 14,238,192,186,117,235, 42, 35, 35, 35, 85, 49, 49, 49,170,165, 75,151,170, 58,119,238,172, 10, 10, 10, 82, 13, 26, 52, 72,
-181,105,211, 38,149,209,104, 84,237,216,177, 67,101,107,107, 27, 89,138,217,122,103,163,197,225,112, 54, 70, 68, 68,144,215,175,
- 95,147,194, 40, 69, 89,154,118,246,246,246, 61, 29, 28, 28,102,217,219,219,247, 4, 96, 7, 0, 1,128,180,145, 29,124, 62,110,
-228, 87, 39,116, 68,215, 90,155,187, 54,107, 50,196,134, 37, 55,125, 63,135,144,193, 62,239,100,180,236,236,236, 70,127,250,233,
-167, 74,189, 94, 79, 52, 26, 13, 81,169, 84, 68,163,209, 16,165, 82, 73, 70,140, 24,161, 16, 10,133, 3, 43,210,116,118,118,254,
-250,230,205,155,230,140,140, 12,114,243,230, 77,114,246,236, 89,178,101,203, 22,171,171,171,235,186,170,158,128,238,238,238,151,
- 46, 94,188, 24, 22, 30, 30, 30,118,255,254,253, 48,147,201, 20,102, 52, 26,195,140, 70, 99, 88,104,104,104,216,177, 99,199,194,
- 14, 30, 60, 24,102, 48, 24,194, 12, 6, 67,152, 94,175, 15,171, 89,179,230,249,170, 30,163,230, 2, 36, 27,110,157, 34,100,221,
-116,146,255,237, 52, 34,159,221,155,200,166,180, 39, 63, 52,171, 70,218,139,112,250,173,122, 84,166, 38,151,203,189,145,144,144,
- 96,157, 63,127,190,161, 94,189,122,249,227,199,143,215,233,245,122, 66, 8, 33,122,189,158,140, 31, 63, 94, 87,175, 94,189,252,
-249,243,231, 27,226,227,227,173, 28, 14,231,114, 21,202,185,170,200,100,221,184,113,131,148, 68,165, 82,145,206,157, 59, 39, 52,
-108,216,112, 87,141, 26, 53, 70, 86,164, 41,149, 74,251,207,155, 55, 79, 69, 74,193,100, 50, 17,165, 82, 73,226,227,227,173,213,
-171, 87, 79, 3,224, 68, 47,230, 84,147,106, 82, 77,106,180,254, 50,202,156,130,167,220,157,248,197, 23, 95,132, 17, 66,194, 22,
- 44, 88, 16, 86, 24,217,226, 1,144, 22,190, 56, 0,134,207,155, 55, 47,140, 16, 18, 54,119,238,220,162,117,202, 58, 16,125, 15,
- 31, 62,108,220,176, 97, 3,113,115,115, 35,238,238,238,100,227,198,141,196,106,181,146,140,208,125,228, 74, 93,144, 23, 95,142,
- 37,132, 16, 18,189, 98, 6,185, 82, 23, 36,246,199,101,100,212,168, 81, 26,177, 88, 60,162,156,131,235,216,164, 73, 19,165, 86,
-171, 85,237,222,189, 91, 37, 22,139, 31, 2,168,135,130,166, 72,166,176,172, 99,234,213,171,167,120,246,236,153,234,215, 95,127,
- 85, 1, 88, 90,201, 10, 83, 11, 64, 39,137, 68, 50,104,158, 23, 55,134,252,252, 21,153,231,134,167, 0, 26, 0,112, 41, 92,199,
-115,238,220,185,132, 16, 66,188,189,189,111,150,161,105, 23, 20, 20, 52, 55, 38, 38,102,177,201,100, 90, 28, 30, 30,190,184,118,
-237,218,243,251,213,244,104,117, 98, 68,183,224,252,101,211,130,201,218,217, 65,223,245,106,222,245,192,176,142, 35, 62,172,225,
-124,107,188,171, 80, 51,212,142,173,124,171,233,176, 82, 21,219,203,203,235,126, 82, 82, 82,177,185, 82, 42,149, 36, 53, 53,149,
-196,197,197,145, 91,183,110, 17, 15, 15,143, 43, 21,105,186,187,187, 63, 79, 74, 74, 34, 63,174, 95, 79, 6, 55,168, 67,218,219,
-219,144, 14, 14, 54,164,169, 84,168,174, 11, 52,173,170,209,122,252,248,113, 24,128, 48, 0, 97, 57, 57, 57, 97, 57, 57, 57, 97,
-121,121,121,197,239, 1, 8,203,207,207, 15,203,207,207, 15, 51, 24, 12, 97,126,126,126, 85, 54, 90,109,132,104,211, 66,136,220,
- 86, 2,104,251,122, 57,167, 77,171,233,108,185, 55,162, 21,201,155,222,153,108, 8,246, 34,109,249,248,184,146,154,125,249,124,
-254,117, 0,115, 10, 77,249,216,158, 61,123,106, 8, 33,164,103,207,158, 26, 0, 99, 11,223,255,180,208,100,245,172,100, 57, 89,
-254,254,254,234,162, 72, 22,128,223,252,253,253,213, 13, 27, 54, 36, 13, 27, 54, 36,222,222,222,202, 66,237, 74, 93,208,106,213,
-170, 21,173,213,106,139, 13,160, 92, 46, 39,105,105,105, 36, 54, 54,150, 68, 70, 70,146,135, 15, 31,146,132,132, 4,114,232,208,
- 33,139,189,189,253, 25,122, 49,167,154, 84,147,106, 82,163,245,151, 26,173,183, 95,111, 26,173,208,208,208,183,109,215,183,143,
- 30, 61, 10,155, 55,111, 94, 24,202, 25,136, 11,192,228, 5, 11, 22, 20, 69,189,190, 41,231,230,191, 35, 58, 58,154,140, 29, 59,
-150, 4, 6, 6,146,192,192, 64, 50,110,220, 56,146,159,159, 79, 84,175,158,145, 43,117, 65, 30, 14,109, 74, 8, 33, 68,249, 34,
-156, 92,169, 11, 18, 54,170, 53,121,242,228, 9,169, 86,173,218,197,114,126,255,244,157, 59,119,178,246,237,219,151,129,130,124,
- 44, 46,128,150, 0, 54,138, 68,162,157, 40,104, 46,172, 14,192, 33, 32, 32, 32, 87,163,209,168, 6, 15, 30,172, 2,224, 83,142,
-102,135,192,192,192,215, 59,118,236, 32, 50,153,140,228,230,230,146,213,109,106, 19,242,243, 87,100,121,211,234,214, 31,127,252,
- 81, 63,103,206, 28,181,163,163, 99, 40, 0,207,193,131, 7,155, 9, 33,164,125,251,246,153,165,137,217,219,219,247,140,137,137,
- 89,172,211,233, 22,203,229,242,197,185,185,185,139, 79,157, 56,177,184, 71,131,218, 99,243,151, 77, 11, 62, 49,162, 91,112, 47,
- 47,135, 65,235,186, 55,155,154, 58,127,226,224, 5,173,235,189,208,173,250,228,218, 7, 53,221,214,188,203,209,118,113,113, 73,
-215,235,245, 4,192, 31, 94,175, 95,191, 38, 78, 78, 78, 73, 21,105, 56, 58, 58, 46,248,116,248, 48,203,192,234, 94,228,245,134,
-133,196,116,233, 87, 98, 58,187,155,188,250,118, 54,233,231,238,172,104,201, 99,205,171,108,121,220,221,221, 47,221,191,127,255,
- 13,163,149,151,151, 87,170,209, 82, 40, 20, 97, 6,131, 33,204,223,223,255,252,251,214,250,150,124,248,117, 16,177, 31,134,143,
-109, 71,178,166,117, 38, 61,237,184, 9,239, 33, 55, 28,192,117, 0,163,170,248, 61, 22,128, 85, 69,134,234,219,111,191, 37,132,
- 16,226,239,239,175,198,251,141, 99,103, 87,167, 78,157,184,137, 19, 39,154,235,214,173, 43,107,211,166,141,252,193,131, 7,228,
-198,141, 27,228,236,217,179,228,200,145, 35,228,217,179,103, 36, 53, 53,149, 68, 71, 71,147, 62,125,250,200, 1,116,160,215, 66,
- 10,133,242,119,166, 20, 47,242,143,166,184,215, 97,104,104, 40, 9, 9, 9, 97, 74,108,160, 29, 0, 97,211,166, 77,179, 86,173,
- 90,181, 22, 5,195,202, 51, 65,108,124,208, 89,196,121,210, 89,196,121, 18,196,198, 7,133, 17,163,237, 43, 86,172,248,186, 97,
-195,134,233, 0, 68, 0,220,203,248,177,118, 78, 78, 78, 72, 74, 74,130,157,157, 29,236,236,236,144,148,148, 4, 66, 8,204, 4,
- 48, 17, 64,111, 52, 66,171,213, 66,103, 37,208, 90, 1,133, 74, 5,119,119,119, 24,141, 70,191, 50,182,161,209,208,161, 67,253,
-130,130,130,178,190,248,226,139, 52, 20,228,202,236,156, 48, 97,194,165,223,126,251, 45, 72,165, 82,229, 70, 70, 70,234, 26, 52,
-104,208, 19,128,123, 76, 76,204,232,205,155, 55, 99,236,216,177, 40,231,166,211,160, 79,159, 62,103,159, 61,123,230, 55,106,212,
- 40, 92,191,126, 29,171, 87,175, 70,118,118, 54, 1, 0,189, 94, 79, 44, 22,139,177,117,235,214,198, 13, 27, 54, 52,111,223,190,
-253,253,154, 53,107,178, 1, 32, 46, 46,238, 85,105,130, 12,195,212,246,245,245,133, 94,175, 71, 86, 86, 22,158, 61,123, 6, 27,
- 59, 59, 68,164,101,187,117, 92,247, 99,206,151, 39, 46,113,135, 55, 15,114,156,213,173,141,126,229,197,235, 1,245, 60,221,220,
- 12, 70,147,123,116,122,102,218,187, 28, 88, 30,143,151,148,157,157, 13,131,193, 0,173, 86, 11,133, 66,129,156,156, 28,100,103,
-103, 35, 45, 45, 13, 60, 30,239,117, 69, 26,182,185,185, 55,227,238,220, 96, 14,109,253, 22,126,230, 92,112,142,110, 4,231,228,
- 15,168,101,200,194,182,133, 83,108, 12, 78, 46, 75,108,109,108,242,236,237,237,183, 3,240,175, 72, 47, 56, 56, 24, 57, 57, 57,
-200,201,201,129,147,147, 19, 28, 28, 28,224,224,224, 0,185, 92,142,252,252,124, 40, 20, 10, 4, 4, 4,160, 81,163, 70,216,179,
-103,207,159, 82,193,239, 25, 16,107,134,101,218,165,168, 52,240, 36, 18,212,116,144,250, 54,147,194,177,156,175,116,230,114,185,
-135, 29, 29, 29, 47, 2,152, 14, 64, 2, 96,186,163,163,227, 69, 46,151, 59, 0,192,114, 0,251,170, 88,140,149, 75,150, 44,153,
- 27, 19, 19, 35,126,242,228, 9,190,248,226, 11, 44, 93,186, 20,175, 94,189,250, 30,128,181,112,157,143,156,156,156, 66, 89, 44,
-214, 79, 0,122, 3,232,233,225,225,209,165, 2,221, 1,115,230,204,209, 53,105,210, 36,250,197,139, 23, 3,238,220,185,211,116,
-246,236,217,249,137,137,137,136,142,142,134,135,135, 7,188,189,189,161, 82,169,144,151,151,135, 1, 3, 6,216,217,218,218,142,
-160,151,113, 10,133,242,119, 54, 89,111,121,145,127, 90, 68,171,212,229, 82,159,168,197, 98,241,146,176,176,176, 86, 13, 27, 54,
-228, 0, 56, 4, 0, 65,108, 12, 25,208,186,241,206, 19,219,191,109,120,108,195,194,134, 61, 26, 6,236, 12, 98,163,168, 23, 91,
-104,211,166, 77, 29,194,194,194, 90, 11, 4,130,143,203, 50,118, 0,224,224,224, 0, 59, 59, 59,216,219,219,195,193,193, 1, 86,
-171, 21, 42,141, 14,106, 11,160,212, 25,144,159,159, 15,101,225,178, 74,111,132, 90,173, 46,254,110, 41,116,156, 56,113, 98,214,
-230,205,155,101,233,233,233,223, 2,104, 48,118,236,216,254,155, 54,109,194,213,171, 87,117,189, 3,107, 57,173,104,215,248,235,
-122,233,175, 22, 7,114, 49, 9,192,205,155, 55,111,162,117,235,214, 96, 24,102, 88,105,130, 34,145,232,135, 3, 7, 14,136, 34,
- 35, 35, 81,171, 86,173,200, 97,195,134,125,240,237,183,223,250, 73, 84,185,183, 1,192,156,147, 17, 57, 99,198,140,175, 86,172,
- 88,145,149,149,149,101,212,104, 52,174,253,250,245, 67, 82, 82, 18, 82, 83, 83,127, 43,195,100, 70,135,135,135,147,252,252,124,
-196,198,198, 34, 60, 60, 92,244,213, 87, 95, 53,183,176, 88,253, 83, 96,243,225,216, 54, 77,155,143,106,217, 24,251,238, 62,225,
-221,138,138,179,111, 90,221,203,225,113,114,122, 13, 19,131,215,239,114,180,149, 74,229,198,175,191,254, 90,165, 82,169,144,146,
-146,130,167, 79,159,226,197,139, 23, 72, 72, 72,192,234,213,171, 85,185,185,185,155, 42,210,240, 20,114, 62, 91, 51,123, 2,195,
-121,254, 27,240,228, 6,160, 81, 2, 90, 21,244, 47,195,176,235,101, 6,182, 28, 61,206, 79, 76, 74,178, 63,120,240,224, 68, 31,
- 31,159, 48, 0, 1, 21,185,122, 0, 96,177, 88,111,155, 80,176, 88, 44, 37,128, 12,137, 68,146,108, 99, 99,147,204, 98,177, 50,
- 8, 33,234, 63,163,230,179,204, 48,130,205, 6,248, 34,176,184,229, 78,237,249,193,176, 97,195, 14, 36, 39, 39,247,136,141,141,
-109,181,105,211,166,175,133, 66, 97,196,166, 77,155,190,142,141,141,109,149,156,156,220, 99,216,176, 97, 7, 0,140,169,202,239,
-251,251,251,207, 88,188,120, 49, 86,175, 94,141, 70,141, 26, 33, 32, 32, 64,179,100,201,146,141, 0, 22, 2,248,216,223,223,255,
-246,140, 25, 51,198,203,100, 50,247,148,148,148, 70,223,127,255,253,148,141, 27, 55, 54, 75, 75, 75, 19, 86, 32,221,182,123,247,
-238, 56,119,238, 28, 0,164, 3,136,205,201,201, 49,167,165,165,161, 78,157, 58,104,222,188, 57, 84, 42, 21, 84, 42, 21,228,114,
- 57,124,125,125, 97,181, 90, 91,209, 75, 57,133, 66,161,252,191, 26,174,210,141,150, 80, 40,116, 8, 14, 14, 70,205,154, 53, 29,
- 80,216, 91,203,137,207,153, 63,107,226,112,177, 52,236, 60,152,240, 43, 24,214,174,190,216,137,207,153, 95,248, 21,142,175,175,
-175, 32, 56, 56, 24, 18,137,196,171,140, 31,191,158,145,145,129,224,224, 96,216,219,219,195,206,206, 14,193,193,193, 48, 26,141,
-200, 87, 42,161,182, 0, 26,147, 21,249,249,249,200,205,202,132,198, 2,152,109,156,144,144,144, 0, 54,155, 29, 87,134,166, 71,
-173, 90,181,178, 34, 34, 34,178, 0,220, 4, 48,117,233,210,165,152, 55,111, 30, 22, 45, 90,116, 64,156, 30,223,253,192,185,147,
- 78,251,151,124,228, 18,192,103,134, 3, 48, 38, 39, 39,195,222,222, 30, 18,137,164, 84, 99,208,190,125,251, 38, 18,137, 4,187,
-119,239, 38, 41, 41, 41,109, 80,208,133, 63,142, 97, 10,204,158,136,133,124, 0, 27,195,194,194, 90,124,245,213, 87, 81, 93,187,
-118,229,182,108,217, 18,203,151, 47, 7,128,208,210, 52,229,114,249,189, 49, 99,198, 24,174, 93,187,134,151, 47, 95, 74, 78,156,
- 56, 49,100,249,242,229,245, 19, 19, 19, 5,167,207,158,239,181, 55, 89, 49,228,219,139,183,132, 43, 46, 92,191,231,108, 43,169,
- 87,195,217, 17,225,137,169, 60, 11, 27, 15, 42, 58,162, 45,184,236,137, 29,133,156,240,118, 2, 86,122, 71, 33, 39,172, 25,151,
- 61, 65,169, 84, 30, 60,117,234,212,133,217,179,103,171,100, 50, 25,108,108,108,144,147,147,131,149, 43, 87,170,194,195,195,143,
- 26, 12,134,211, 21,233, 90,172,164,137,119,117, 31,224,117, 68,241,123, 70, 43,193, 3, 3, 15, 33, 83, 63, 65, 96,157, 58, 48,
- 24, 12,104,208,160, 1,179,116,233, 82,137,157,157,221,231, 21,154, 30,214, 31,170,155,153, 97,152, 12, 66, 72,170, 74,165, 74,
- 17,137, 68,137, 60, 30, 47, 49, 55, 55, 55,133, 16,146,249,103,248, 44,194,194,103,173, 27,248, 3, 2, 17, 18,115, 84,105, 15,
- 85,200, 45,109, 69, 27, 27,155, 9, 91,182,108, 17,254,252,243,207,166, 25, 51,102,232,167, 76,153,194,213,106,181,174, 83,166,
- 76,225,206,152, 49, 67,255,243,207, 63,155,182,108,217, 34,148, 74,165,131,222,165, 32, 38,147, 9, 17, 17, 17,223,190,122,245,
- 74,130,130,225, 70, 62, 89,178,100,201,216,152,152, 24,225,230,205,155,113,228,200, 17, 28, 57,114, 4,253,251,247,199,204,153,
- 51,177,120,241,226,242,228,196, 13, 27, 54, 12,118,114,114,194,141, 27, 55,210, 0, 36, 2,104, 34,149, 74,109,250,247,239,143,
- 30, 61,122, 64,167,211,193,104, 52, 22, 27, 45, 54,155, 13,123,123,123, 39,122, 13,164, 80, 40,148,191,220,100,189, 97,182, 56,
- 0, 80, 20,170, 11, 9, 9, 97,202,187, 49, 90,242,100,144,171, 53, 72,200,215, 32, 41,207,250,198,103, 86,171,181,220, 95, 79,
- 75, 75, 59,125,247,238,221, 9,193,193,193,156,180,180,130, 22,177,224,224, 96,104, 52, 26,164, 61,185, 15,181, 21,144,212, 10,
-130, 90,173, 70,222,139,199,144, 54,108, 5,167, 62,163,176,110,243,102,125, 78, 78,206,214,210, 52,249,124, 62,183, 90,181,106,
- 89,113,113,113,102, 0,185,118,118,118,221,125,124,124,112,253,250,117, 0,216, 71,128, 53, 8,191, 6,220, 56, 6, 82, 16, 82,
-145,250,250,250, 66, 38,147, 65,165, 82, 93, 47, 77,243,238,221,187, 49, 38,147,169, 65,191,126,253,152, 95,126,249,229,144, 66,
-161, 88, 4,224,169,222, 10,246,147,228, 76,168, 45, 16, 2,232,230,224,224,240,233,226,197,139,187,204,152, 49, 3,167, 78,157,
-194,197,139, 23,141, 40,200, 5,187, 91,138,108,126,108,108,236,182, 57,115,230,180,100,177, 88, 83, 47, 93,186,100, 14, 8, 8,
- 80, 24,141, 70, 75,237,192, 64,214,162,165,203,120,211,167, 78,182,207,209,224,121,143,218, 30,173, 25, 6,120,158, 42, 75,124,
-165, 66, 78,121,251,180, 61,159, 29, 58,160, 77,195,246, 19,134,245,149, 74,106,213,131,250,217,125,247,109,135,207,174, 19,133,
-199,132,220,144,201,250,159, 58,117,106,200,245,235,215,167, 27, 12,134,154, 2,129,224,181, 92, 46,223,160, 82,169, 42, 52, 89,
-108, 54,187,143,222,163,154,131, 60, 55, 23,194,194, 72,148,194,100, 69,182,222,140,151,246, 1, 24, 81,205,187,184, 25, 52, 35,
- 35, 3,238,238,238,140,197, 98,233, 91,158,230,197,139, 23, 17, 18, 18, 82,100, 60,193, 48, 12, 24,134,201, 14, 12, 12,204, 20,
- 8, 4, 57, 60, 30, 79,177,102,205, 26,157, 78,167, 3,135,195, 17, 90, 44, 22,246,251,212,246,230, 98,184, 10, 8,243,195,148,
-126,157,186, 54,170, 87,135,220,124,248,132,201,211,232,118,149, 19, 5,252,222,223,223,159,147,155,155,123, 26,192, 75,147,201,
-180,255,208,161, 67,194,209,163, 71,235, 14, 31, 62, 60, 18,128,223,218,181,107,135,168, 84,170,237, 85, 41,199,171, 87,175,190,
- 95,177, 98,197,220, 5, 11, 22, 96,207,158, 61, 51, 94,189,122, 53,175, 48,210,213,127,241,226,197, 88,179,102, 13,246,236,217,
- 99,125,249,242,229, 89,171,213,250,106,246,236,217, 13,221,220,220,178,211,211,211, 95,149, 35,219,180,103,207,158,250,219,183,
-111,243,149, 74,229, 45, 0,159, 78,155, 54,109, 98,139, 22, 45, 20,195,134, 13,147,230,230,230,202,197, 98, 49,127,199,142, 29,
- 14, 28, 14, 7,106,181, 26, 12,195, 64,169, 84, 26,232,117,144, 66,161,252, 93, 41,203,139,252, 67, 40,243,222,192, 41,109, 3,
- 53, 26, 77,102, 82, 82, 82,157,212,212, 84, 51, 0, 51, 0,228, 24,204,223,172,216,113,236,231, 65, 45,253, 37,233, 38, 19, 78,
- 60,140,212,228, 24,204, 69,201,239,230,212,212, 84,101, 98, 98,162,141, 86,171, 85,149,241, 91,191,253,240,195, 15,218,107,215,
-174,217,196,198,198,194, 98,177,160, 73,147, 38,136,142,142, 70,222,203, 8, 72,234, 52,129,164, 67, 8, 34,195, 30, 34,252,226,
-101,196,171, 12,230,168,133, 43,242, 85,106,245, 98,163,209,120,162, 52, 65, 46,151,155, 11,128, 16, 66, 44, 0,160, 80, 40,158,
-170, 84,170,118,110,110,110,120,254,252,185, 68,109,193,204, 33,243,215,109, 34,132, 88,120, 5,189,185,102, 13, 27, 54, 12,143,
- 30, 61, 2,128, 71,165,105, 42, 20,138, 25,147, 38, 77,186,182,123,247,110, 78,108,108,108,143,159,127,254,185, 71, 84, 84, 20,
- 97,114,147, 44,183, 53, 92,248,141,157,217,236, 71,223,192,139, 33, 33, 33,240,240,240,192,142, 29, 59,176, 97,195, 6,211, 71,
- 31,125, 20,179, 97,195,134,102, 50,153,108,127, 25,219,159, 47,151,203,207, 59, 57, 57, 77,175, 95,191,190, 82,173, 86, 35, 39,
- 39, 7,105,105,105,112,116,114, 98,153,193,106,237, 98,111,191,255,116,134, 82,194, 57,127, 15,247, 83,210,203,141,102,181,228,
-178,199, 12,106,223,184,253,199, 11,230, 75,113,251, 4,152, 73,139, 65,126,254, 26,159,140, 27, 98,163,211,239,239,160,126,146,
- 48, 58, 76,161,216,171, 80, 40,142, 84,177,178,244,108,221,186,245,129, 21, 43, 86,136,190, 92,189, 2,107,235,120,193,156,147,
-131, 44,189, 5,217,122, 51, 20,121, 47,241,252,121, 36,156,156,156, 17, 31, 31, 15,157, 78,135, 23, 47, 94, 16, 54,155,125,186,
-162,136, 78, 17, 37,154, 11,229, 2,129, 32,135,203,229,102,114, 56,156,220,216,216, 88,181, 78,167, 3,139,197,146, 88, 44, 22,
- 81, 37,202, 90,205,217,217,121, 54, 10, 6, 19, 61,165,204,206,222, 24,204,133, 61, 56,232,232,235,236,212,107,225,148,209,206,
- 62,158,174,242,216,152,215,166,173, 23,238,100,235,244,101,119,214, 0, 16,154,155,155, 91, 28,145, 60,124,248,240, 39,135, 15,
- 31,158, 8, 96, 39, 10,230,221,186, 44,151,203,127,124,135,147,111,225,209,163, 71,231, 46, 88,176, 0, 34,145,168,120,240, 84,
-145, 72, 36, 4,128, 95,127,253, 21,207,159, 63,111,129,194,124, 45,171,213,122, 32, 61, 61,189, 34, 77,191,160,160,160,216, 99,
-199,142,241, 1,120, 78,155, 54,173,213,166, 77,155, 48,110,220,184,172,200,200,200,150, 0,226, 0,248, 77,157, 58,245,193,158,
- 61,123, 28,172, 86, 43,242,242,242, 96, 48, 24,226,232,165,156, 66,161, 80,179,245,151, 16, 12, 32, 28, 5,227,103,245, 1,112,
- 6, 5,105, 29,101,226, 93,232,206, 46, 0,232, 87,116,127, 44, 35, 25, 30, 40,232,145,117, 30,192, 79, 0,220,202, 18,117,114,
-114,250,124,236,216,177,166,148,148, 20,146,145,145, 65,142, 28, 57, 66,102, 77, 24,107,233, 86,203,211, 90,203,211, 77,237,226,
-226, 18,237,225,236,184,171,177, 24,179, 0, 84,171,196,134,141,141,138,138,154, 60,118,236,216, 9,133,191, 59,225,192,129, 3,
-170, 75,151, 46,169,216,108,118, 40, 10,134,118, 40, 50,148, 99,250,246,237,171,210,235,245,170,192,192,192, 92, 20, 36,238,151,
-197,144,142, 29, 59,230,157, 59,119,142, 88, 44,150, 63,140, 81,148,149,149, 69, 46, 94,188, 72,218,180,105, 35, 7, 48,186, 75,
-151, 46,215,239,220,185,115,189,109,219,182, 71, 43, 42,176,179,179,243,252, 39, 79,158, 60, 74, 72, 72, 8, 59,115,230, 76,216,
-254,253,251,195,166, 78,157,250,180, 97,195,134,218,152,152, 24,171,217,108, 38, 79, 30, 63, 38,129,181,107,171, 1,248,150,165,
-211, 89,196,121,160,216,241, 53,209, 45, 31, 71,116, 3,188, 9, 0,162, 92,247, 57,201,156,209,149, 68, 79,239, 69, 58, 9,217,
-119,223,165,166, 56, 58, 58, 94,120,244,232, 17, 81, 42,149,228,217,179,103,100, 76, 72, 15,114,119, 98, 87,114,190,135, 63,217,
-211,161, 6, 89,215,189, 33,233,209,161, 29,249,225,135, 31,200,177, 99,199,200,252,249,243,173,206,206,206, 74,148,147,163,229,
-238,238,126,233,208,161, 67, 97, 0,194,216,108,118,152, 66,161, 8, 83, 42,149,167,147,147,147,183, 4, 6, 6,206,173, 95,191,
-254,200, 58,117,234,116,238, 84,195,119,110, 23, 27, 65,116, 87, 91,225,235,218, 82,241, 58,252,113,220,171, 98,236, 0,223, 90,
-126,126,202, 27, 55,110, 88,245,122, 61,185,117,235,150,181,110,237, 0,221,218,161, 61,143,198,239, 88,117, 84,119,238,151, 11,
-154,147,219,239, 28,254, 48, 36,162,163,152,245, 75, 43, 73,241,112, 28,239,202,112, 0, 39,240,123,175,195,177, 0, 78,162,252,
- 94,136, 44, 0, 59,151, 47, 95, 94,178,167, 33, 0,176, 26, 54,108, 24, 70, 8, 9,107,216,176, 97, 88, 85, 11, 34, 22,139,103,
-159, 58,117,106,137,143,143,207,234, 97,195,134,237,144,203,229,103, 70,142, 28, 25,129,130,206, 32, 12, 10,102, 71,232, 91,173,
- 90,181,172,240,240,112,114,253,250,117, 50,120,240, 96, 37,143,199, 27, 69, 47,227, 20, 10,133,242,151, 48,185,180,191, 21,141,
-163,181, 34, 34, 34,162,104, 12,173,105,229,137,207,155, 55, 47,236,209,163, 71, 97, 40, 24, 37,190, 92, 56, 28,206,241,143, 62,
-250,136,184,185,185,169, 92, 93, 93,143,115,217,236,137,222, 34, 4,227,221,186,186,183,219,187,119,111,255,239,191,255,190, 15,
-128, 22, 0,184, 94, 94, 94,105, 25, 25, 25,170, 59,119,238,168,218,180,105,163,114,118,118,150, 5, 5, 5,169,214,174, 93,171,
- 50,153, 76,170,217,179,103,171,240,199,241,190, 74, 67, 8, 96, 58,159,207, 63, 94,183,110,221,136,133,253, 58,155, 86,207,156,
- 72,198,250,187,168, 0,124, 15,224, 35, 0,246, 0,184, 67,134, 12,185,242,226,197,139, 11, 65, 65, 65,219, 42,161,235, 89,191,
-126,253,171, 7, 14, 28,120,116,236,216,177,176,207, 63,255,252,145,147,147, 83, 74, 76, 76,140, 85,167,211,145,188,188, 60, 34,
-151,203,201,153, 51,103, 44,142,142,142,155,203,220,112, 1, 59,157, 92,220, 87,234, 16, 14,201, 11, 70,145, 54,124, 86,234,187,
-212, 20,137, 68,146,155,147,147, 67, 50, 50, 50, 72,108,108, 44, 57,122,244, 40,233,217,186, 57, 57, 56,117, 16,217, 55,161, 63,
- 89,211,179, 57,105, 97, 35, 84,187,219, 72, 31,217,216,216,200, 42,211,235,208,221,221,253,146, 94,175, 47, 30,190,161, 90,181,
-106, 97,129,129,129,199,130,130,130,214,157, 58,117,234,147,245,235,215,247,239, 84,195,119,238,202, 30,173,181,154,203,135,137,
-242,208,247,100, 94,147, 0, 93,161,153, 47, 21, 47, 39,199,189, 55,174, 95,183, 22,153, 95,179,217, 76, 78, 28, 63, 78,134,246,
-234, 22,145,127,254,215,159,110, 45,158,113, 96,118,147,128, 19,109,132, 24, 94,158, 97, 43,126, 20,145,194,169,189, 45,107, 75,
-111, 31,199,244,118,118,172,239, 91,218,188, 49,189,212,208,128,128,128, 88, 66, 72,122,157, 58,117, 98, 1,236,171, 83,167, 78,
-201,229, 15,203,144, 45, 30,156,116,201,146, 37,164,240,252, 96, 1, 88,180, 98,197,138, 48, 66, 72,152,191,191,255,109, 0,104,
- 36,129,115, 7, 59,214, 79,253,252,220,114, 58,216,177,126,106, 36, 41,125,202, 40, 95, 30,106,183,115, 17,223,234,239,239,161,
-236,232,101,119,115,223,174,159, 87,247,238,221,123, 7,128,205, 0,190,118,114,114,186, 53,124,248,240,231,123,246,236,121,190,
-118,237, 90, 99, 76, 76, 12, 25, 63,126,188, 90, 32, 16,124, 77,175,131, 20, 10,133,242,151, 81, 52, 50,188, 71, 85,140, 86,223,
-185,115,231,134, 17, 66,138,198,210, 26, 93,202, 58,253, 22, 44, 88, 16, 70, 8, 41, 26, 29,254,237, 1,204, 74, 27,208,108,201,
-150, 45, 91,136, 64, 32,248,233, 29, 55,166,164,166,251,128, 1, 3, 90, 42, 20,138,102,110,110,110,205, 10, 35, 87,222,206,206,
-206,177,251,247,239, 87,105,181, 90, 21, 33, 68,101, 54,155, 85,143, 30, 61, 82,117,236,216, 81, 85,226,169,191,162,114,190,193,
-151,238,184,253,112,225, 4,242,165, 59,110,191,245,209,168,157, 59,119,158,139,139,139, 59,109,107,107,251, 69, 37, 53,189, 93,
- 92, 92, 22, 57, 58, 58, 94,112,118,118,254,210,209,209, 49,221,104, 52,146,188,188, 60, 18, 29, 29, 77,174, 95,191, 78,238,222,
-189, 75, 28, 29, 29, 83,202, 42,103, 23, 17,231, 94,222,234,233,196,186,115, 5, 49,108,154, 79, 0, 16,249,250,121, 36,251,135,
-165,228,225,164, 30,164,163,144,253,219, 59,236, 79,216,219,219,111, 63,126,252,184,245,213,171, 87, 36, 52, 52,148,156, 57,115,
-134,204,156, 57,147,212,246,244,208,183,228,179, 50,219, 9, 56, 23,222,101,192, 82,189, 94, 31,166, 80, 40,194, 84, 42, 85, 88,
-221,186,117,195,154, 55,111,126,172,101,203,150,235, 14, 31, 62,252,201,202,149, 43,251,119,177, 17, 68,107, 46, 31, 38,228,243,
- 94,132, 76,111, 75, 94, 79,236, 72, 58,139, 56, 79,202,212,116,115, 75, 41, 26,173, 93,173, 86,147,155, 55,111,146,171, 87,175,
- 18,119,103,103, 69,123, 17,123,114, 27, 1, 58,180,177,133,125,101,203,217,201,142,181,235,222, 15,223, 88,180,231,246,144, 95,
-199,246, 50,119,180,103,109, 41,177,222, 65, 66, 72,250,224,193,131,227, 9, 33,233, 71,143, 30, 77, 38,132,164, 15, 26, 52, 40,
-158, 16,146, 14,224, 64,105,154,111, 13, 78,186,179,208,100, 77, 95,178,100, 73, 24, 33, 36,108,201,146, 37, 97, 64,193, 32,170,
- 29,236, 88,187,239,111, 91, 99,213,159,217, 77, 14,143,239, 99,233, 96,199,218, 93,106, 57,237, 57,167,195,119,174, 39,134, 11,
-251,200,241,153, 35, 45,109,221,109,111, 4, 4, 4,172,249,228,147, 79,142,221,189,123,247,169,197, 98,121, 30, 27, 27,251,124,
-243,230,205,207, 91,181,106,117,219,201,201, 41,130,207,231,127, 84,209, 49,250,147,160,154, 84,147,106, 82, 77, 74, 9, 8, 33,
- 40,175,191,251,233,111,191,253, 86, 66, 8,153, 61,100,200, 16,172, 90,181,106,104,253,250,245,135,123,121,121,185, 0, 64, 90,
- 90,154,230,217,179,103,138, 33, 67,134, 96,209,162, 69, 88,189,122,245, 58, 20,228,178,252,127,146,113,226,196,137,106, 51,102,
-204,144,173, 92,185,210, 58,126,252,248, 58, 0,158,101,103,103,215, 30, 57,114,228,116, 14,135, 51,196,215,215, 55, 40, 61, 61,
- 61, 75,171,213,238, 3,176, 13, 21,180,153,150,133,128, 5, 75,211,234, 30,184,192,130,165,196,219,189, 22, 45, 90, 52,108,208,
-160, 65,198,245,235,215,155, 21, 10,197,169, 74,202, 37,103,101,101, 45, 43, 90,112,116,116,116,127,242,228,201, 71,174,174,174,
-172,216,216, 88,232,245,122,188,122,245,202,138,130,166,169, 82, 81,153,201,198, 31,143, 94, 10,156, 61, 42,196, 86,243,242, 49,
-120,108, 54, 76, 92, 62, 50,238, 93,192,206,155, 47, 21,106, 35, 54,189,203,118,202,229,242,239,102,206,156, 57,242,139, 47,190,
- 16,250,250,250, 50,191,253,246, 27, 14, 29, 58,164,151,201,100, 61, 1,220,248,125,232,167,170, 97,181, 90,193,231,243, 1, 0,
-243,230,205, 3,139,197,226,202,100, 50, 62,195, 48, 2,134, 97,196, 12,195,176, 77,113,207, 97, 85,228, 33, 51, 79,142,228, 76,
-121,185,122, 22,171,245,208,253,251,247,103, 53,110,220,152,245,240,225, 67,100,101,101,225,213,171, 87,196, 66,200,129,155, 90,
- 75, 65, 82,162,190,242,229, 19, 59, 58, 13,104,228, 32, 96,241,119, 45, 66,123, 3,139,189,213,138,193, 40, 24, 75, 11, 0,118,
- 50, 12,195, 3,144, 83,183,110,221, 78, 47, 94,188, 16,213,173, 91, 87,251,242,229,203,115, 12,195,120, 1,216, 93,154,166, 72,
- 36,202, 6,144,125,244,232, 81, 0,152,132,130,157,215,100,241,226,197,233, 55,111,222,196,146, 37, 75, 50, 1,108, 1, 0,169,
-131, 83,191, 32, 59, 30,195,255,101, 9, 90,233,193,218,100, 37,165, 70, 93,165,174,110,157,235, 75, 88,224,254,252, 21,154,185,
- 7,178,248,102, 99,131,165, 75,151,222, 84,169, 84,250,131, 7, 15, 26, 62,252,240, 67,118, 76, 76,204, 3, 0,183, 0, 28, 69,
- 97,142, 37,133, 66,161, 80,254, 82,222, 30,214,161,194, 28,173,183, 93,235, 42, 0, 63, 70, 69, 69, 21, 79, 42, 29, 21, 21, 21,
- 6, 96, 43, 10, 70,131,239, 91, 5,199,187,176, 48,162,181,237, 29, 55,230,109, 77, 97,112,112,176,232,197,139, 23, 60,148, 62,
-225, 49,243, 14,154,127,160,180,185, 14, 3, 2, 2, 54,152, 76,166, 99, 91,183,110, 61,204,102,179, 71,190,135,219,247,245,247,
-247,207,219,191,127,191, 53, 52, 52,148, 44, 92,184,208,226,225,225,145,135, 63,230,104,189,161,217,158,207, 62, 50,167,142,151,
-226,209,232,182,228,245, 39,253,200,173, 81, 29,201,100, 47,169,162,189,144,125,232, 61,159, 74,252,237,236,236,118,138, 68, 34,
-133,173,173,237, 37, 0,173,223,231, 24, 57, 57, 57,237,113,119,119,191, 84,242,229,230,230,118,204,197,197,229,123,103,103,231,
-133,246,246,246, 83,252,132,252,245,159,212,246,212, 69, 12,168, 75, 46,183,113, 33,163,156,249,111, 55, 29,190, 93, 78, 15, 63,
- 63,191,156,189,123,247, 90, 79,159, 62, 77,230,207,159,111,173, 94,189,186, 2,229,228,181,149, 27,209,178,103, 31, 58, 50,168,
-165, 53,179,143, 23, 89, 85,199,198,218,201,129, 93, 86, 15,197, 81,133, 6,120,108, 69,154,181,106,213,218, 74, 8,217,181,124,
-249,242, 93,248,125, 46,208,110, 75,151, 46, 93, 76, 8, 89,188,116,233,210,197, 0,122, 0, 64,123, 59,214,222,125,253,155, 90,
-210,122,123,146,111,234, 72, 45,237,237, 88,123, 75,141,100, 58,114, 78,156,156,216,199,154, 62,177, 13, 89,228, 47,177,180,116,
- 20, 92,225,243,249,159,160, 32,226,220, 28, 0,159, 62, 53, 83, 77,170, 73, 53,105, 68,235,239, 97,188, 42, 51,169,116, 73,220,
- 29, 29, 29,119,214,172, 89,243,176,175,175,239, 97,169, 84,186, 14, 5, 73,243, 85, 61, 16,126, 43, 86,172, 80,216,217,217, 53,
-250, 19, 15,174, 43, 0, 47,252,113,226,220, 63,173,194, 44,243,192,140,152, 47,134, 62, 89,230,129, 25, 37,222,110, 94,167, 78,
-157,111, 80, 48,154,247,251, 86, 66, 95, 71, 71,199,205,142,142,142, 41,133,185, 89,190,149,209,108,202,102,143,236, 36,100,255,
-214,154,207,202,232, 36,228,220,105,198,102,143,248,135,158,128,229,117,182, 40, 75,179,154,179,179,243,122, 71, 71,199, 52,103,
-103,231,205, 85, 52, 89,111,104, 54, 18,193,163,179, 61,251, 68,107, 27, 70,221,217,142,125,180,169,184,236, 78, 29, 85,216,246,
-224, 37, 75,150,140, 35,132,140,243,244,244, 28, 82,194,248, 7, 45, 90,180, 40,132, 16, 18, 82, 52, 2,124,115, 49, 92, 59,218,
-179,247,183,177,101,228, 29,237,217,251,155,139,225, 90, 86, 57, 59,217,179, 15,181,177,101,228,237,109, 89,251,125, 4,168, 78,
- 47,230, 84,147,106, 82, 77,106,180,254, 29, 70,139, 86, 24,170, 73, 53,169, 38,213,164,154, 84,147,106, 82,163, 85,186,177, 42,
-249,242, 40, 50, 90, 28,186,111, 40, 20, 10,133, 66,161, 80,222,139, 50, 7, 44,101,202,113,165, 85, 73,108,127, 23,103,123,153,
-106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 57,205,138,180,255,191, 59,214,253,101,208,166, 67,170, 73, 53,169, 38,213,164,
-154, 84,147,106,254, 93, 52,255,117, 16, 66,222,105,144, 80, 10,133, 66,161, 80, 40, 20,202,239, 4, 23,254, 45, 30,184,180, 40,
-154, 85,106,142, 22,167,249,242, 76,179,217,236, 10, 0, 28, 14, 71,102,122,176,208,163, 60,117, 46,208,197, 92, 48,253, 14, 56,
-192, 36, 51,112,169, 20,205, 75,102,179,217,161, 80, 51,207,244, 96, 97,143,114, 53,155, 47,191, 80,114,125,243,131,133,221,254,
-224, 20, 1, 54,183,249,242,180,183,202,234, 89,217,189,194,224,141, 49,177,254,178,114,254, 83, 52,255,203,112, 91, 44,207, 52,
-153, 10,234, 17,151,203,145, 25,239,151, 95,143,120, 45,150,167,149, 92,223,116,127,161, 91,121,154, 98,145, 32,167,150,151,203,
-186,242, 52, 99,211,178,103,171, 53, 58,167,242, 52,171,122,110,122,123,120,116,177, 20,158,155,108, 96, 82, 74,122,250,165,191,
- 89, 93,106, 10, 96, 33, 0,219, 18,239, 69, 0,248,148,214, 74, 10,133,242, 15, 51, 90,225, 40,152,231,112,123,161,217,218, 94,
-166,209, 50,155,205,174, 97,199, 23, 67,173, 7,186,140, 89,238,234, 55, 96,219, 31, 38, 74, 54,235,242,248,242,200,131, 65,108,
-147,194,193,133, 99,180, 77, 75, 75, 99, 0,128, 97,152,159, 0,248,148,162,233, 16,118,124, 49, 52, 6,160,253,240,165, 14, 62,
-128,109, 22,143,247,153, 72, 34,233,164,213,106,235, 3,128, 72, 36,138,212,170,213,215, 92,140,198,181,111,175, 95,214,150,149,
- 44,107,231,209,203, 93,235, 12,216, 54,211, 98,181,242, 83, 31,110,109,175,203,142,225,112,205,250, 45, 95, 2,231, 22,151, 98,
-170,202,208,251,253,119, 63,152,239,196, 5, 58,243,133,194, 70,246, 14, 14,237,172,132,212,181, 90,173,140,197,108,126,174,200,
-207,191,101, 53,155,159,152, 13,106,167,176, 83,223, 88,203, 43,231,219,219,242, 1,192, 57, 14, 12,145, 72,165,157,216, 92,110,
-107, 0,176,152, 76,191,169, 85,170,107, 3,129, 35,149,217,246,202,238,159,119, 93,255,191,134,201,100,118,141,187,176, 24,122,
- 19, 16, 60,248, 27,215,134, 35,127,217, 15, 0, 6,217, 19, 55, 85,204,169, 22, 0, 32,169, 21,114, 95,224, 30,156, 9, 0,156,
-196,116,215,232,208, 5,208,155,128,186, 33, 75, 93, 43,210,252,112,209, 33,167, 47, 38, 15, 18, 0,192,197,163,223,215,190,122,
-236,199, 94, 0,208,121,208,180,115,221, 7,207,136, 6,128,213,219,143, 57, 29,248,102,104,185,154,149, 59, 55,243,121,249, 49,
-161,254, 6, 69,186,189,183,132,227, 30, 19, 19,195, 2, 0, 79, 79,207, 74,157,155,213, 0,187,116, 96, 58,139,205,110, 87,203,
-223, 63, 24, 0,137,125,253, 58,220, 98, 54,223,246, 0,182,252,201,117,105, 38, 33,111, 14,206,202, 48, 12,173,144, 20, 10,229,
-159,198,153, 66,115,117,230, 15, 15,179,101,125, 67,173, 7,110,188, 2, 58,180,108,136,201, 35,123, 75, 75,126,118,100,219, 82,
-159,152,135, 39,235,252,252,203, 90, 86,195,134, 13, 17, 23, 23, 87,169, 82,104, 12,192,245, 24, 0,242, 23, 54,121, 18,201,235,
-245,107,214,216,118,235,214,141,227,233,233, 9,134, 97,144,145,145,209,242,242,229,203, 77,103,205,154, 53, 21,242, 23,121, 26,
- 3,148,215, 99, 42,214, 45, 42,107,253,218,213,177,112,198, 80, 59, 0,248,114,204,150,166, 15,163, 50, 29, 95,191,126,221,101,
-238,220,185, 57,236,107,215,126,116, 6,118,101, 2,201,149, 41,231,158,211,247,133,118,233,191,250,141,154, 49,227,168,191,191,
-191,212,215,215,151,177,177,177, 1,155,205, 70, 94, 94,158,207,179,103,207,122, 61,120,240, 64,125,249,198, 79,252, 71, 15,250,
-197,202,132, 45,116,149,218,118,109,154,240,162,141, 77,228,232,129, 3,171, 13, 29, 58, 84, 88,171, 86, 45, 0,192,235,215,175,
- 3,142, 28, 57, 50,252,232,209,163,139,160, 77, 51,107, 12,208, 85,180,237,197,154, 0,132, 64,107,123, 87,215, 81,108, 46,183,
-190,217,108,246, 42,140, 54,164, 90, 76,166, 72,185, 76,182,239,237,245, 41,127, 68,111, 2, 94,164, 3, 93,219, 5, 99,244,160,
-174, 18, 0,152, 59,108, 69,203,196,248, 87, 60,131,193,128,218,129,117,219,124,253,205,186, 11, 96,177,176,247,216,229,226,245,
- 43,163, 25,241, 34, 14,139,191, 94,143,180,167, 71, 90, 90,242, 95,117, 82, 42,242,217, 0, 96,107,103, 55,232,200,193, 95,175,
-121, 6, 13,185,247, 42,219, 88, 41,205,242,206,205,243, 7, 55,123,164, 60,187, 86,239,135,139, 59,185, 62, 62, 62,120,250,244,
-105,213,206,205,252, 40, 27,171,135,199,243,181,159,127,238,222,190,125,123, 72,165, 82,112, 56, 28,152,205,230,174,183,111,223,
-238,186,120,241,226,105,200,143, 82, 87,246,220,172, 4,107, 25,134,233,244,225,228,153, 30,189,251, 15,193,160,158,109,104, 69,
-164, 80, 40,255, 52,138,162, 87, 37,123, 30,110, 47,215,104,113, 56, 28, 89,183,177, 43, 93,219,181,104,128,135, 79,162,243, 19,
-146,210, 85, 69,159,229, 70, 30,169,221,191,141, 87,189,155, 55,111, 64,175,215,227,183,223,126,195,147, 39, 79, 16, 31, 31,143,
- 41, 83,166,232, 11,155, 14, 75,211,204,107, 63,124,169, 3,242, 99,164, 1,252,168, 26,151, 95,190,100,235,116, 58,220,188,121,
- 19,121,121,121,224,243,249,168, 86,173, 26,186,119,239,206,121,249,242,165, 99,151,110, 61,237,218,247, 28, 17, 7,187, 0, 21,
-135,195,201, 43,107, 30, 17, 14,135, 35,235, 50,102,185,107,189,128,234,120,157,144,150,191,240,155,159, 85, 86, 43,225,196,198,
- 39, 26,111,220,184,129,224,224, 96, 92,186,116,201, 41, 55, 55,247,171, 45, 91,182, 44,228,126,251,195, 70,147, 33,103, 14,202,
-214,203,107, 63,124,169,131,147,236,176,239,213,243, 39,120,145,145,145,188,173, 91,183, 34, 39, 39, 7,124, 62, 31,246,246,246,
-112,119,119, 71,237,218,181,153, 47,191,252, 82, 26, 18, 18,137,143, 39, 13,241, 53,250, 77,140, 42,171,156,197,219,174, 74, 20,
- 59, 43, 46,214, 58,118,230, 12,171,109,219,182,111, 60,182,215,172, 89, 19, 61,122,244, 16,142, 26, 53,170,214,208,225, 35,173,
-237,251,124,248, 26, 82, 95, 77,133,154,234,100,145,147,230,174,103,215,225,195, 79, 45, 93,186,212,222,221,221, 29, 18,137, 4,
- 0,144,159,159, 95, 45, 33, 33,161,229,162, 69,139, 6,223,143, 56,200,105, 31,146,156, 6,137,183,182,188,253,249, 95,133,203,
-229,200,138,162, 72, 54, 18, 81, 94,114, 74,166, 26, 0, 12, 6, 3, 12, 6, 3,244,122, 61, 62,154, 54,133, 61,105,112,115,127,
-223,118, 51, 31,199,167,102,230,214,189,124,207,177,232,187,166, 10, 52, 57,154,120,185, 60,233,202,164,197,159,127,238,238,230,
-246,123,139,224,222, 61,123,216,185,185,185, 93, 23, 47, 94, 92,143,136, 59,202,235,134, 44,181, 47, 79,179,188,115, 83, 30,125,
-166,198,215, 51,122, 52,218,246, 77, 40, 44, 22, 11,238,222,189,139,155, 55,111, 98,221,186,117,228,220,185,115,249,182, 18,201,
- 36,148,123,110, 70,217,180,245,200,240,251,246,219,163,140, 64, 32,192,201,147, 39,241,242,229, 75,176, 88, 44, 52,108,216, 16,
-163, 71,143, 70,215,174, 93,221, 39, 79,158, 66,218,247, 28, 22, 11,187, 64,229,123,214, 37, 22,128,153,243, 23,127,235, 49,102,
-226,116,172,254,250, 75,106,180, 40, 20,202, 63, 57,154, 85,230, 16, 15, 8, 13, 13, 37,133,175, 14, 0, 64, 0, 86,205, 1,219,
- 14, 28,126,100, 61, 83,115,192,182, 3, 4, 96, 17,128,101, 11, 84,111,220,184,177, 73, 46,151,147, 7, 15, 30,144,143, 62,250,
- 72,189,113,227,198,107,103,206,156, 57, 98, 54, 26,119,120,122,120,124, 71, 80,122,130, 61, 1, 88,190,128,157, 88, 44,206, 74,
- 74, 74, 34,103,207,158, 37, 75,150, 44, 33,251,246,237, 35,231,206,157, 35,151, 47, 95, 38,231,206,157, 35, 7, 14, 28, 32, 17,
- 17, 17, 36, 58, 58,154, 72, 36,146, 44, 95,192,174, 28, 77, 54, 1,216,181, 7,108,157,115,244,161,105,105,224,128,109,179, 8,
-192,118, 0,234, 52,110,220,216,114,228,200, 17,178,119,239, 94,242,203, 47,191,144,136,136, 8,146,157,157, 77, 56, 2, 73, 86,
-209,247,202, 42, 39, 1, 88, 94, 94, 94, 89,114,185,156,120,123,123, 19, 62,159, 79,220,220,220, 72,237,218,181, 73,203,150, 45,
- 73,175, 94,189,200,200,145, 35,201, 87, 95,125, 69,228,114, 57, 17, 10,133,153, 69,223, 43, 75, 51, 24, 16, 73, 36,146,164,176,
-176, 48, 82, 22, 90,173,150,100,103,103,147, 11, 23, 46, 16,137, 68,146, 20, 12,136,202,211, 20, 1, 77,130,130,130,178,178,179,
-179,137,209,104, 36, 73, 73, 73,228,217,179,103,228,229,203,151, 36, 41, 41,137,104,181,218, 98,237,232,232,104,226,231,231,151,
- 37, 2,154,148,165,249, 95,166,168, 78,188,253,242,113,115,235,229,238,238,174, 61,122,244, 40, 73, 77, 77, 37,187,119,239, 38,
- 44, 96,197,219,235,149,167,201, 7,186,183,109,219,214,114,247,238, 93,242,248,241, 99, 50,111,222, 60,210,163, 71, 15,210,179,
-103, 79,178,120,241, 98,146,146,146, 66, 82, 82, 82, 72,175, 94,189, 44,124,160,123, 69,245,179,180,115,211, 14,240, 9, 9, 9,
-209, 26,141, 70, 18, 27, 27, 75,234,215,175,159,194, 6, 70, 73,128,122, 29, 0, 65, 69,245,211, 11,112,240,240,240, 72,191,123,
-247, 46, 57,118,236, 24,241,245,245,205, 98, 3, 31,218, 2, 53,109,129,154,108,224,195,154, 53,107,102,221,189,123,151,228,228,
-228, 16, 31, 31,159,116, 47,192,225, 61,234, 18, 11,192,206,249,139,191, 37, 81, 41,106, 50,127,241,183, 4, 64, 18, 41,200, 30,
-189, 68,107, 36,133,242,223,227,109, 47,242,143,191,175, 16,242,102,175,195,144,144, 16, 6,192,245,242,190,164,101,179, 87,174,
- 94,189,154,163,211,233,240,243,207, 63, 43, 63, 24, 60,248,112,135,118,237, 98,107,248,250,202, 25, 22,171,194,217,134,179, 4,
-130, 79, 86,175, 94,109,111, 48, 24,240,232,209, 35, 52,109,218, 20,238,238,238,144, 74,165,144, 74,165,112,117,117, 69, 96, 96,
- 32,100, 50, 25,108,108,108,240,197, 23, 95,216,101, 9, 4,159, 84,164,107,181, 18, 14, 0, 88,172, 86, 62, 15,152,236,215,172,
-217,163, 69,139, 22,177,156,156,156,224,232,232, 8,169, 84,138,151, 47, 95,194, 96, 48, 64, 44, 18, 87,106,144, 86, 22,139,197,
-146, 74,165,184,122,245, 42,102,206,156,137,214,173, 91,195,222,222, 30, 54, 54, 54,168, 95,191, 62,186,119,239,142, 73,147, 38,
- 33, 54, 54, 22, 76, 37,146, 74,158,115, 56,211, 39, 77,154,228, 26, 28, 28, 92,234,231, 58,157, 14,114,185, 28, 89, 89, 89,168,
- 86,173, 26,134, 12, 25,226,250,156,195,153, 94,150,158, 19,224, 94, 45, 32,224,212,131, 7, 15,156, 37, 18, 9,246,238,221,139,
- 19, 39, 78,224,252,249,243, 56,123,246, 44, 66, 67, 67,113,242,228, 73,100,101,101, 1, 0, 2, 2, 2,112,232,208, 33,103,169,
-171,107,168, 19,224, 78, 79,233,202,145,152,153,121,177,126, 70,134,243,168,145, 35,111,169, 84, 42,140, 26, 53, 10, 43, 87,173,
-250,146, 11,204,170,204,247, 3, 1, 59, 71, 15,143, 93,223,126,251, 45, 43, 35, 35, 3, 3, 7, 14,204, 94,187,106,213,132,240,
- 11, 23,106,133,157, 63, 95,107,229,210,165, 19, 58,116,232,144,157,146,146,130, 61,123,246,176,220,124,124,118, 5, 2,118, 85,
- 45,167, 18,152,185, 97,195, 6,161, 78,167, 67,183,110,221, 98,173,145,145,129,102,224, 87, 21,240,242, 58, 96,172,232,251,233,
-192,244, 47,190,248,194, 93, 32, 16,224,179,207, 62,203,214, 36, 38, 54, 48, 3,191,228, 3, 9,249, 64,130, 25,248, 69, 25, 23,
-215, 96,204,152, 49,217, 2,129, 0,235,215,175,119, 79,255,125,210,237,202,210, 20,192, 41, 0, 55, 0,164,125, 56,121,230,135,
-193,205, 91, 97,207,142, 45,248,102,233,220, 93, 0, 62, 96, 24,102, 31,128, 57,180,230, 81, 40,255, 77, 42,227, 69,254,166, 76,
- 46,235, 3, 78, 73, 39, 9,160, 99,121, 42, 14, 78, 78, 77, 27, 52,104,128,155, 55,111, 34, 40, 40,232,129,189,189,189,153, 39,
- 16,128,203,229,130, 88, 43,244, 89, 16, 73, 36, 93,186,118,237,202,185,119,239, 30,252,252,252, 32, 18,137,192,229,114,223,120,
-241,120, 60,120,120,120, 64,161, 80,160, 75,151, 46,220, 77,155, 54,117,129, 94,255,117,133, 55,196,152,103,210,172,123,223,142,
-252,105,247,174,154,237,219,183, 71,126,190, 2, 86,171, 21, 98,177, 24, 6,131, 1, 28, 14,167,160, 9,200, 68, 20,149,217, 99,
- 22,139,197,194,102,179,225,231,231,135,149, 43, 87, 66,167,211,129,199,227, 1, 0, 20, 10, 5,228,114, 57,158, 61,123,134,132,
-132, 4,144, 74,140, 72,102, 99,103,215,123,232,208,161,165, 78,248,171,215,235,145,159,159,143,252,252,124,200,229,114,232,116,
- 58,180,106,213,138,127, 38, 52,180, 55,114,114,214,150,250, 29,161,112,240,158, 61,123, 92,249,124, 62,180, 90, 45,148, 74, 37,
-146,147,147,145,152,152,168,147,201,100,102, 27, 27, 27,150,175,175, 47, 75, 32, 16, 8, 6, 12, 24,192, 40, 20, 10, 48, 12,131,
-144,144, 16,167,253,123,247, 14,133,193,176,142,158,210,149,227, 34,160,111, 98, 48,244,109,209,188,249,213, 7, 15, 31, 6,127,
-242,201, 39,136,136,136,248, 86,124,240,224, 13, 13,240,164,188,239,198, 2,211,191, 43, 97, 96, 72, 98, 98,144, 17,200, 42,177,
- 74,130,111, 92,220,249, 49, 99,198, 60,141,136,136,112, 94,191,126,189,251, 7, 3, 7, 78, 7,176,162, 42,101,180,177,179,107,
-230,225,225,129,115,231,206, 33, 41, 62,126,174, 25,208, 86, 41,188,196,102,183,109,223,190, 61, 78,158, 60,137,148,196,196,185,
-230, 55,203, 88,240,160, 4,100,113, 98, 99,231,238,218,181,107,231,248,241,227,193,230,112,218,194, 92,165,134,195, 63, 36,190,
-143,159,242, 9,118,109,223,180, 11,192, 68, 0, 86, 0, 15,104,141,163, 80,254,219, 81,173,138,188,200, 63,200,108,109, 7, 80,
-181,136,150,171,171,171,151, 84, 42, 69, 90, 90, 26,234,214,169, 35, 19, 8, 4,224,115,185, 16,242,249,149, 42,129, 70,163, 9,
-242,244,244, 68,126,126, 62,156,157,157,193,227,241,138, 95,124, 62,191,248,127, 27, 27, 27,176, 88, 44,248,248,248, 64,163,209,
- 4, 85,168,155,249,204,245,224,166,105, 31,221,189,113,174,230,192,129,131,224,224,224, 8,111,239,106,112,117,117,133, 72, 36,
-130,183,183, 55,106,213,170, 69,214,174, 93, 11,177,107,195, 74, 93,200, 75,154, 39, 14,135, 3,139,197,130,204,204, 76, 68, 69,
- 69, 33, 34, 34, 2,119,239,222,197,227,199,143,161, 84, 42, 43, 53,242,171, 70,171,109,196,225,112, 74, 53, 89,114,185, 28,114,
-185,188,216,104,101,101,101, 33, 33, 33, 1, 42,181,186,113, 57,166,119, 80,131, 6, 13,216, 0, 32, 18,137,208,184,113, 99,108,
-219,182,205,124,250,196,137, 97,245,238,222,117,244,190,112,193,254,167,173, 91,135, 13, 25, 50,196,114,239,222, 61, 40, 20, 10,
-188,120,241, 2, 46, 46, 46, 28,190, 80, 56,148,158,206, 85, 35, 12, 80, 59, 43,149, 61, 91,183,110, 29,151,159,159,143, 53,107,
-214,176,184, 54, 54,219,151,150,209,196, 87, 12,155,221,166,125,251,246, 56,117,234, 20,210, 18, 19,231, 37,150, 98, 96, 18,129,
-172,164,216,216,121,187,118,237, 66,247,238,221,193,112, 56, 85, 78, 84,106,217,178,101, 3,171,213,138,167, 79,159,194, 30,184,
- 95,213,239,215,242,247, 15, 46,138,252, 74,128, 91,101,173, 39, 1,110,133,135,135, 67, 36, 18,161,110,189,122, 77,170,248, 51,
-107, 25,134, 73, 31, 63,229, 19, 28, 59,127, 7, 0,176,107,251,166,204, 18, 38,139, 66,161,208,136,214, 63, 53,162, 85,100,172,
- 74,190,240,134,209,170,164,249, 0, 0,112,185, 92,240, 5, 2,240,249,252, 2,131, 36, 16, 84, 90,131, 97, 24, 8,133,194, 98,
- 99, 85,210, 96,149,252, 95, 44, 22, 87,122,232,250,188, 87,231,219, 77,156, 48,158, 47, 16, 8, 96, 48,232, 65, 8,129, 64, 32,
-132,189,189, 61,252,252,252,160, 80, 40,208,186, 77, 7,125,178,156, 23,234, 84,119, 64,196,187,236, 61,179,217, 12,181, 90,141,
-188,188, 60,228,230,230, 66,161, 80, 64,171,213, 86,186, 43,186,213,106,101, 39, 39, 39,227,215, 95,127, 69, 78, 78, 14,128,130,
- 68,235, 34,115, 85,244, 55, 46, 46, 14,123,247,238, 69,124,124,124,149,142, 79,187,118,237, 16, 26, 26,202,238,216,165,203,142,
- 75,190,190,105,151,124,125,211, 58,118,233,178,227,212,169, 83,108, 47, 47, 47, 36, 36, 36,224,209,163, 71,200,203,203, 3, 33,
-132,246,159,127, 7, 94, 3,121,154,220,220,241, 95,126,249, 37,145, 74,165, 88,243,221,119,141, 86, 0, 35, 42,107, 96,236,202,
- 49, 48,118,239,103, 96, 64, 8,129,213,106,133,197, 98,121,167,109, 99, 24,134,225,114,185, 85, 29, 90,161, 42, 43, 23, 39,190,
-127,241,213, 74,156, 61,121,164,232,253, 24,106,178, 40, 20,202,191,128, 50, 19,225, 57, 37, 28,100,241,223,178,200,204,204, 76,
- 85,171,213, 53,125,125,125,145,146,146,226,234,227,227,147,200,231,114,193,227,243,193,176, 42,246, 4, 98,177,248,105, 90, 90,
- 90, 27, 47, 47, 47,152,205,230, 98, 83,245,118,211, 97, 81,148,230,241,227,199, 16,139,197, 79,161, 43,119,228, 4, 88, 12,121,
-213,155, 52,105, 82, 28, 25,178,183,183,135,189,189, 29, 4, 2, 33, 22, 44, 88, 96, 93,191,118,237, 22,159,206, 75,243,199,205,
-250,146,124,185, 98,199,159,186,103, 43,123, 99, 18,139,197, 79,189,189,189, 91,217,217,217,225,216,177, 99, 72, 72, 72, 64, 94,
- 94, 30, 52, 26, 13,244,122, 61, 52, 26, 13, 12, 6, 3,132, 66, 33,234,213,171, 7, 91, 91, 91, 92,190,124,249, 41,244,250,210,
-205,101, 78,206,177,167, 79,159,182,106,222,188,121,113, 68,165, 83,167, 78, 76,167, 78,157,156,139,163,104, 26, 13,178,179,179,
-241,224,193, 3, 92,190,124, 25, 12,195, 32, 38, 38,198,162,215,106, 15,208,115,226,221,208, 1,191,177,119,237,218, 57,117,234,
-212, 9,109,218,180,129, 5,232, 5, 96,239,255,208,192, 0, 0,238,222,189,251,204, 98,177,180,169, 93,187, 54,228, 64, 11, 0,
- 39,171,100, 34, 95,189, 10, 55,155,205, 93, 26, 53,106,132, 99,135, 15,183, 3,144, 80,218,122,106,160, 93,112,112, 48,180, 90,
- 45, 94, 60,127, 30, 86, 5,147,181, 99,254,226,111, 63, 28, 51,113, 58,246,236,216,130, 93,219, 55, 37,239,220,182,209, 27,149,
-200, 31,163, 80, 40,255,169,104, 86,133, 94,228,111,202,228,178,204, 23,167, 42, 42,249,121,121, 97,225,225,225, 53,155, 52,105,
-130, 29, 59,118, 52,111,221,170, 85, 42,143,207, 55,243,121, 60,176, 42,113, 35,209,170,213, 87,174, 92,185,210, 98,192,128, 1,
-156,123,247,238,193,221,221,189,216,104, 21,253,229,112, 56, 32,132, 64, 44, 22,227,248,241,227, 70,173, 90,125,165,194,104,145,
-197,106, 97, 21, 26, 61, 66, 8,228,114, 57,120, 60, 30,214,173, 91,143,205,107,215,142,180, 0, 71, 2, 36, 46,159, 3, 16,254,
-207,110,208, 26,205,213,179,103,207, 54, 93,180,104, 17,183, 90,181,106,144,203,229,200,203,203, 67, 78, 78, 14, 20, 10, 5, 20,
- 10, 5,242,242,242, 32,151,203, 33, 20, 10, 17, 17, 17, 97,210,105, 52, 87,203,210, 19,232,116, 71,199,142, 29,251, 69,120,120,
-184, 7,135,195,129,201,100,130,213,106,133,213,106,133,209,104,196,171, 87,175, 16, 25, 25,137,151, 47, 95, 34, 55, 55, 23, 92,
- 46, 23,108, 54, 27,143, 31, 63,206,147,152, 76,135, 13,244,156,126,103,184,192,177,219,183,111, 79, 24, 61,122, 52, 60,171, 85,
-235,128,148,148, 74, 25,152, 19,229, 24,152,252,119, 51, 48,191, 27, 32,165,242, 97, 92, 92, 92,155,142, 29, 59,194,163, 90,181,
-111,235,165,164, 92,122, 94,133, 60, 45,139,217,124,235,246,237,219, 93,198,140, 25,131, 29, 59,118,124,235, 18, 23,119, 62,235,
-173,102, 78, 23,192,165, 70,173, 90,223,126,248,225,135,184,120,241, 34, 44,102,243,173,114, 36, 75,142,248, 94,253,195,201, 51,
-189,223, 74,124,223,198, 48,204, 12, 0,107,104,141,162, 80, 40,255,230,136, 86,149,154, 14, 69, 22,203,252, 57,115,230,152, 88,
- 44, 22, 6, 13, 26,100,115,242,212,169, 33,143,159, 60,241,147,201,100,246, 22,139,165, 66, 45, 23,189,126,227,156, 57,115,228,
- 6,131, 1,129,129,129,200,205,205,133,197, 98, 1,135,195, 1,135,195, 1,195, 48, 96,177, 88,144, 74,165, 8, 15, 15,199,206,
-157, 59, 21, 46,122,253,198, 10,111, 18, 22,203,211,189,123,247,130,205,102, 19,161, 80, 8,134, 97,192,225,112,176,126,253,122,
-217,102,224, 24, 0,176, 89, 44, 3, 0,176, 88, 76,101,179,119, 43,108,183,228,243,249,176, 22,116, 2,168,112, 93, 7,189,126,
-195,234,213,171,149, 47, 94,188,128, 90,173, 46,142,190,169, 84,170,226,228,122,185, 92, 14,134, 97,160, 86,171,113,234,212, 41,
-165,131, 94,191,161, 44,189, 28, 32, 35, 37, 38,166, 95,243,230,205,115,226,226,226,144,159,159,143,167, 79,159,226,242,229,203,
- 56,116,232, 16, 46, 94,188,136, 87,175, 94,193,108, 54,195,203,203, 11,132, 16,156, 56,113, 34,223,172, 84,246,202, 1, 50,232,
- 57, 81, 54,213,221,221,187,184,185,186, 38,185, 56, 59,167, 84,119,119,239,242,246,231,118, 64,116,116,116, 52,204,102, 51,252,
-252,252, 28,203,203,211, 34,102,243,237,219,183,111, 99,204,152, 49,240,174, 89,115,149, 47,224,242,246, 58,190,128,139,111,173,
- 90,171,138, 12, 12, 49,155,111, 87,181,204, 54,192,166,207, 63,255, 92,203,227,241,112,240,224, 65, 63,147,191,255, 75, 14, 48,
- 66, 10,212,233, 8,240, 42,250,190, 7,176,229,171,175,190,202, 96, 24, 6,251,246,237,115,182,171, 85,235, 25, 7, 24,107, 7,
- 84,183, 3,170,115,128,177,118,181,106, 61, 59,120,240,160,179,217,108,198,172, 89,179, 50, 60,128, 45,229, 72,206, 36,132,244,
- 37,132,180, 39,132,120,239,220,182, 17,103, 79, 30, 41, 50, 89, 19, 81,144,244, 62, 26,192, 51, 90,227, 40, 20,202,191,153, 82,
-195, 80,156,230,203, 51, 1,226,218,161,101, 67, 60,124, 18,149,239,236, 96,123,161,232,179,220,200, 35,181, 59, 7,217, 54,252,
-225,135, 31,192,229,114,145,156,156,140,231,207,159,195,214,214, 22, 35, 71,142,212,107,149,202,126, 37,230, 58,236, 10,224,114,
-161,102,193,124,106,249, 49,210, 90,156,136,154,231,207,134,178,237,236,236,160, 82,169,192, 98,177, 32, 20, 10, 33, 22,139, 33,
- 18,137,240,232,209, 35,244,233,219,223,146, 37,110,255,251,128,165,191,207,167, 86,172, 89, 52,214, 80, 11, 64, 28, 14,124,230,
-234,233, 57,103,225,194,133,162, 30, 61,122,128,199,227,161, 90,245,128, 12,191,158,107, 54,177, 88,140, 57, 37, 71,177,160, 86,
-117, 79,187,231, 49, 9, 0, 24,153,233,193, 66,207, 18,115, 29,254,161,156, 62,134, 27,126,199,127, 89,107,219,184,113, 65, 62,
-186, 92, 46, 71,102,102, 38,100, 50, 25,228,114, 57,212,106, 53, 0, 32, 52, 52, 20,103,111,190, 84,104,171, 13,137, 45,171,156,
-191,111,123,148,141,167,241,126,141,253,123,127, 97,187,184,184, 32, 51, 51, 19, 89, 89, 89,144,203,229,208,106,181,176, 88, 44,
-200,205,205,197,207,187,126,177,228, 72,219,199, 23, 15, 8, 89,158,166, 58, 89,228,168,186,227, 21, 92,207,151, 76,152, 48,193,
-198,214,214, 22, 86,171, 21,121,121,121, 72, 74, 74, 66, 92, 92, 28,110,222,188,169,150,201, 13, 80, 59,119, 75, 41, 30,176,180,
- 20,205, 63,145,127,156,102,201,113,171, 60, 61, 60,210, 18, 19, 19, 93, 45, 22, 11,188,188,188,204,242,220,220, 85,124,224,162,
- 13,144, 14,128,100, 3, 11, 55,108,218, 52,190,127,255,254,104,214,172, 89,114, 70,102,102,141,210,234, 18, 1,216,129,128,157,
-166, 90,181,200, 7, 15, 30,184, 39, 37, 37, 97,204,152, 49,217,137,175, 95,207,179, 43,204,215,202, 7,218,249,214,170,181,234,
-224,193,131,206, 53,107,214, 68, 80, 80, 80,134, 48, 41,169,126, 20,144, 95, 70,253, 44,243,220,148, 71,159,169, 49,109, 96,131,
-102, 31,125,244, 17,204,102, 51,110,222,188,137,251,247,239, 35, 49, 49, 17,119,238,220,145,219, 74, 36,195, 74,204,117, 88,106,
-253,236, 21,160,246,219,183,111, 47,195,227,241,176,107,215, 46,132,135,135, 3, 0,130,131,131,241,225,135, 31,194,108, 54, 99,
-212,168,209,228, 76,148, 40,182,188,250, 9,160, 1,128,239, 80, 96,242,154, 17, 66,132, 12,195,164, 1,240, 70,213,114,178,104,
-253,164,154, 84,243,191,163,249,175,162,220, 73,165, 75,206,167,182,252, 71,216,189, 57,205,199,164,180, 35,219,150,114,218,182,
-107, 95,103,233,146,197,172,230,205,155,195,219,219, 27,193,193,193, 72, 74, 74, 18,216,219,219, 87, 52,159,154,170,125,207, 17,
-113, 13, 27, 54,180,159, 55,111,158, 93,247,238,221,185,222,222,222, 32,132, 32, 60, 60, 28,199,142, 29, 51,238,216,177, 67,161,
-113,235, 43, 15,187,246,171,170, 50,243,169,221, 7, 52, 0,150, 85, 75, 75,219, 62,125,218,180,197,141,155, 52,153,176,100,201,
- 18,150, 84, 44,226,174, 92, 48, 81, 8, 0,203,191, 63,100,215,127,200, 72,108,240, 7, 58,140, 40,125, 30,185,146,229, 76, 74,
-153,148,216,123, 96, 23,255,207,102,140,183, 12, 29, 58, 84, 98,107,107, 11,111,111,111, 56, 56, 56, 32, 54, 54, 22, 41, 41, 41,
-228,244,233,211,170,187,143,163,185, 39, 46, 62, 76, 20,218,121, 84,102, 94, 66,101,251, 30, 31,196,247,238,221,219, 97,236,216,
-177, 54, 77,155, 54,229, 10, 4, 2, 8, 4, 2,100,102,102,226,213,171, 87,198,211,167, 79,171, 52,174,189,242,194,174, 29, 84,
- 86,114,174, 67,109,251,225, 75, 95,221,186,180,100, 86,228,211,167,163,173, 64, 35,163,209,232,101,177, 88, 24, 22,139,149,110,
-181, 90,159, 26,149,202,157,250,224, 37,235,233, 92,135,149,195, 98,177,240, 44, 22, 11,228,114, 57, 46, 93,186,196,121,253,250,
-245,194, 39, 79,158, 44, 76, 75, 75,131,201,100,194,224,193,131, 17, 28, 28,140,107,215,174, 33, 43, 51,243,116,121, 90, 81, 64,
-190, 32, 37,229,195, 73,147, 38,157,219,187,119, 47,235,201,147, 39,206,187,118,237,250,185, 52, 3, 51,122,244,104,107,102, 82,
-210,135,122, 32,191,156,250, 89,222,185,153,125,254,224,230, 39, 3, 6, 13,169,183,100,209, 66,110,235,214,173,225,236,236,140,
-118,237,218,193,104, 52,218,215,173, 91,183,162,115, 83,217,190,231,176,216, 70,141, 26, 73,214,175, 95,239, 62,126,252,120,204,
-152, 49, 3, 0,160,213,106,113,241,226, 69,204,154, 53, 43, 35,137,211, 66, 93, 81,253, 44,140, 84, 21, 25,176, 27, 0,218, 3,
-136, 5, 77,124,167, 80, 40,255, 78,138, 38,149,246, 64,193,196,210,103, 80,240,112, 94,241, 92,135,183,238, 63, 67,201,105, 62,
- 10,240,120,110,246, 25,251,122,202,156, 85, 65,108,147,194,129,203,232,108, 99,162,163,153,138,230, 60, 44,158, 79,205, 46, 64,
-229, 20,119,160,249,202,229,203, 63,217,176, 97, 67,151,162, 33, 28,196, 98,241, 83,173, 90,125,197, 69,175,223,168,177, 11,184,
- 82,213,185,249, 82,128, 76, 0,211, 28,194,194, 54,133,244, 31,188, 90,232,232,199,253,114,197, 14, 29,155,197, 50,188, 74,203,
-194, 6,127, 64, 82,137, 14,146, 26, 3, 16, 41,247, 48,103, 58, 13,137,250,234,243,207, 63, 91,190,108, 89,115,169, 84,218,193,
-104, 54, 7, 88,173, 86,192,106,141,209,168,213, 55,136,209,248, 64, 31,188,104,173,208,206,131, 84,122, 94, 66,251,186, 74,199,
-248, 35,205,119,239,220, 57,243,240,225,195,127,216,118, 39,189,126,147,198,190,238,229,202,108,123,201,117,116,192,111,144,201,
-126, 43, 47,116, 73,231, 58,172, 28, 28,171,117,178,131,131,195,158, 46, 93,186, 8,187,118,237,138, 62,125,250,160,117,235,214,
-176, 90,173, 32,132, 64,169, 84,226,208,161, 67, 88,189,122,117, 76, 13, 96, 89, 69,122,122,224,138,224,236,217, 94,141, 26, 53,
-218, 85,158,129, 41, 52, 89, 21,230, 36,150,127,110, 10, 98,204,118,253, 18,134, 79, 95,233,111, 80,164,219, 59,137,205,238,145,
-207,158,178, 42,127,110, 6, 42, 45,225,135, 90, 12, 30, 56,112, 58,155,195,105, 87,216, 3,146,188,120,254, 60,172,104, 82,105,
- 4,127,120,169,138,117,169,104,236, 58,154,248, 78,161, 80,254,237, 70,171, 15, 10,242,181,138,167,228, 41,115,174,195,162,168,
- 15,135,195,145,197,158,152, 50,178, 60,117, 46,208,165, 48,146,133, 10,231, 58, 44,252, 63, 1, 80, 66,175,255,250,141,193, 72,
- 75,244, 46,228,190,181,126, 85,134, 69,204, 3,162, 96,214,135, 64,246, 28, 56, 53,173, 64,175,249,242,185, 37,183,169,204,155,
-236, 27,191,203,203,213, 1,183,160, 82,221,130, 74, 85,106,210, 46,151,195,203,173,168,156,111,111,123, 18,160,120,223,109,127,
- 91,179, 66,243,240, 30,251,243,191, 70,106,118,246, 9, 0,210,106,161,161,110,231, 67, 67,135,126, 54,123,246, 96, 15, 79,207,
- 90,206,206,206, 14, 54, 54, 54,172,123,247,238,197,153,117,186, 77,141,129,221,133,209,212, 10,209, 3, 87, 2,147,146,234,127,
- 48,112,224,116,134,195,105, 91,210,192, 16,179,249,142, 31,176,165,188, 72,214,187,158,155,222, 2,143, 46,133,145, 44,176,129,
- 73,149,169, 27, 41, 5,229, 88, 1,179,121, 5, 34, 34, 74,169,243, 85,174, 75,203, 25,134, 81,130, 38,190, 83, 40,148,127, 47,
- 69,243, 29,158,249,255,254,225,174, 84,147,106,254,139, 52,217, 40,232, 69, 71,247, 39,213,164,154, 84,147,106, 82,202,165,104,
-174, 67, 14,221, 21, 20, 74,165,177,224,247,102, 48, 10,133, 66,161, 80,138, 40,202,205, 42,201,118,160, 32,117,167, 44, 87, 90,
-149,222, 4,239,226,108, 47, 83, 77,170, 73, 53,169, 38,213,164,154, 84,243, 63,167, 89,145,246, 63,177, 55, 99, 81, 78, 86,113,
-110, 86,101,103,183,121, 95,104, 88,149,106, 82, 77,170, 73, 53,169, 38,213,164,154,255,118, 60, 10, 77, 86,241,171,168,233,144,
- 69,247, 13,133, 66,161, 0, 75,150,128, 69, 8, 24, 66,150,176, 8, 57,204, 38,100, 8,155, 16,188,215, 84, 32, 67,134,148, 62,
-152,237,199, 35, 29,108,232, 30,167, 80,254, 85,164,163,140, 73,165,105,142,214,255, 22, 31,119,119,247,109, 0,152,140,140,140,
-201, 0,146,232, 46,249,251,225,232,232,216,197,108, 54, 67,161, 80, 92,249, 55,110, 95,189, 90, 24, 72, 88,168, 91,252, 6, 65,
-210,139, 87,216, 83,218,186,117,253, 49, 6,204,239, 99,113, 49, 86,188,120,254, 26,199,171,240,115,172, 94, 93,189,183, 0,192,
-185,203,201,211,241,215,140,171, 85,219,197,197,229, 2,135,195,225, 88, 44,150,105, 50,153, 44,180,108, 35, 52,132, 13, 0, 92,
-114,109,190, 60,195,117,222,167, 83, 25,174, 70,191, 83,174,215,170,243,217, 92,118,188,128,235,126,123,202,120,214,185, 60, 85,
-171,231,165,125,255,200,145, 35,101,206,226, 93,223, 31,189, 88,150,122,125,131, 27,196,197,126,183,177,249,134, 14,126,206,220,
-184,228,199,210,111,183,230,111,227,219,251,246, 29, 51,148, 9,229,136,153,209, 59,119,230,168,232, 89, 86,121, 86, 2,142, 70,
- 32,136, 43, 16,120, 91,204,102, 55, 6, 32,108, 14, 39,211,164,215, 39,243,128,136,249,128,252,223,174,201, 19, 8,170, 89,204,
-102, 55, 0,248, 59,150,147,242, 38,101, 26, 45,169, 84,250,136,197, 98, 85, 43, 57, 25,110,209,124,130, 69,239,149,252,140, 97,
- 24, 88, 44,150,148,188,188,188,166, 85,248,125, 91, 0, 67, 1, 20,117, 81,223, 15,224, 16,222, 61,225,216,150,199,227,205,145,
- 72, 36,157,181, 90,109,125, 0, 16,137, 68,145,106,181,250,170,209,104,252,238, 29,117, 57, 0, 62,144, 74,165,157, 88, 44, 86,
- 39, 66, 8, 67, 8,185,166, 82,169,174, 2, 56, 12,224, 93, 70, 74, 16,185,186,186,174,112,116,116, 28, 49,127,254,252, 28, 39,
- 39,167,192, 89,179,102, 61,204,205,205,253, 53, 59, 59,123, 1,170, 48, 71,221, 95, 76, 45,119,119,247,253, 92, 46,151,157,156,
-156,220, 9, 0,188,189,189,175, 25, 12, 6,139, 76, 38, 27, 9,224,117, 21,245, 36, 0, 90, 74,165,210,166, 82,169,180,189,197,
- 98,169, 91, 56, 63,227, 11,149, 74,117,211,104, 52, 62, 2,112, 15,128,250,111,116,142,216,112, 56,156,189,133,117, 61, 0,128,
-242,223,118, 17, 32, 44,212,125, 30,249, 50,176,216,120,213,175, 83,246,202, 12,124, 74, 89,183,210, 70,171,115, 7,143,190,253,
-250,117, 99, 1,128,193,116,174,239,213, 27,233, 39,255,108,147, 53,104,208,160,223,246,238,221,235,160,215,235, 49,121,242,228,
-253,151, 47, 95,222,162, 80, 40,230,151,123,225,144, 58,204, 90,179,254,162,152, 97, 88, 0,224,106,181, 90, 92, 83, 83, 95, 7,
- 60,127,246, 91,207,200,200,187, 43,181, 47,175,222,179, 50,220, 41, 70,180,123, 89,153, 66,212,245, 67, 72,223,193, 3,251, 44,
- 91,182, 4, 35,134,141,168, 30, 25,169, 19,121,217,198,242,115,181, 18,127, 39, 23,215,126,203,150, 31, 97,110,223, 58,209,111,
-239,174,165, 87,199,143,119,234, 76,205, 86,165, 96,150,115, 56, 45,237,252,253,219, 15, 59,113, 2, 82,111,111, 14, 71, 32, 96,
- 1,128, 89,175,247, 86, 37, 39,123, 28,236,215,175,197,146,232,232,235, 75,128,251, 84,243,127,162, 73,169,138,209, 98,177, 88,
-213, 82, 83, 83, 93, 37, 18, 73,193,197,152, 16, 88, 44, 22, 88, 44,150,226,201,139, 9, 33,197,127,205,102, 51,234,212,169, 83,
-169, 39, 90, 0,157, 1,140,235,216,177,227,144,239,190,251,142, 27, 20, 20, 84, 52,101, 72,187, 47,191,252,242,251,240,240,240,
-163, 0,118,163, 96,240,198,202, 62,241,246,144, 72, 36,251,214,172, 89, 99,219,173, 91, 55,142,167,167, 39, 24,134, 65, 70, 70,
- 70,203,203,151, 47, 55,157, 53,107,214, 52,181, 90, 61, 10,192,133, 42,236,159, 6, 54, 54, 54, 71, 6, 14, 28, 88,173, 67,135,
- 14,194,122,245,234,193, 98,177,224,241,227,199,227, 31, 61,122, 52,252,232,209,163,139,149, 74,229, 16, 84,126,190, 54, 70, 42,
-149,142,181,181,181, 93,177,104,209, 34,199, 81,163, 70,241,159, 61,123,150,231,231,231,199,220,190,125,219,229,208,161, 67,211,
- 86,173, 90,245,129, 66,161, 88,160, 82,169,126, 65, 37,230, 80,180,177,177,121,196, 98,177,170, 85,198, 8, 3,168,138, 25,110,
- 92,163, 70,141, 67,183,110,221,170,145,144,144, 96, 25, 48, 96,192, 30, 0,184,122,245,106,144,201,100, 98,186,119,239,126, 46,
- 37, 37,101, 40,128,199,149,220,246,134,142,142,142, 39, 71,140, 24,225, 88,171, 86, 45,113,141, 26, 53, 24,137, 68, 2, 54,155,
-141,252,252,124,207,103,207,158,117,189,127,255,190,246,242,229,203,185,122,189,190, 31,128,136, 42, 28,167,214,174,174,174,163,
-185, 92,110, 3,179,217,236, 5, 0, 28, 14, 39,213,100, 50, 61,147,201,100,123, 1,252,246,174, 39,136,155,155,219,230, 21, 43,
- 86, 56,203,100, 50,178,106,213,170,205, 74,165,114,236,191,245, 98,176,255,215,195,120,244,240, 62, 80, 48,109, 14, 83, 74,253,
- 99, 0,240, 62,253,116, 54,154, 54,107,129,145, 35, 62,168, 80,179,119,151,106,107,184,124,158,147, 78,167,251, 45, 95,163, 63,
- 44, 17, 11,135,142, 24, 30, 18, 3, 0,231,206, 95, 31,218,188,185,195, 53, 59,177,224, 3,161, 80,216,218,100, 48,230,156,189,
-146,242,121, 85, 76,149,151,151,215, 5, 7, 7, 7,113,110,110,110, 70, 86, 86,214,143,125,251,246, 93,190,123,247,110,135,184,
-184, 56, 36, 39, 39,227,147, 79, 62,145,166,164,164, 76,143,136,136,184,107, 48, 24,202,140,108, 41,149,185, 27,191,156,215,127,
-145,157,157, 51, 91, 34,182,133,141,157, 35,252,106, 53, 66,203,214,125,209,171,207, 4,188,138, 9,111,185,123,215,178,240,212,
-212,203,223, 72, 29,107, 46,151,203,107,148,121, 93,170, 87, 27, 29,250, 13, 44, 48, 89,139, 22, 45, 65,244,203,151,202,132,120,
-214,199,103, 78,112,196,189,186,212, 17,152, 13, 25, 9,183,111,157,168,209,182,221, 0, 0,104,186,119,215,210,171, 31,143,116,
-232,178,121,127,158,146,222,146,202,190,118, 46,227,114,199,246, 88,191,222, 53,120,218, 52,158, 42, 62,222, 24,187,117,171, 38,
-243,230, 77, 11, 71, 32, 32,222, 61,123, 50, 46,157, 58, 9,167,189,120,193,187,179,106, 85,123,238,210,165,126, 11,140,198,125,
- 84,243,255, 85,243,191, 78, 81, 18,124,201,222,135,219,203, 53, 90, 12,195, 64, 34,145,224,224,193,131,224,114,185,224,112, 56,
-224,114,185,101,254,239,227,227, 83,153,130, 12,114,119,119,255,126,203,150, 45,110, 61,122,244,128, 80, 40, 44,254,128,205,102,
-163, 91,183,110,232,218,181, 43, 55, 45, 45,109,248,193,131, 7,135,175, 92,185, 50, 83, 46,151,207, 64,225,196,208,229,208, 41,
- 48, 48,240,216,197,139, 23, 69, 58,157, 14, 55,111,222, 68, 94, 94, 30,248,124, 62,170, 85,171,134,238,221,187,115, 94,190,124,
-233,216,173, 91,183, 99,209,209,209, 33, 0,174, 85,162,172, 77, 93, 93, 93,111, 28, 62,124, 88,216,168, 81, 35,230,213,171, 87,
- 8, 14, 14, 6, 0,228,231,231, 99,192,128, 1,194, 81,163, 70,213, 26, 62,124,248, 61,153, 76,214, 1,192,163, 10,244,154,184,
-187,187,255, 50,112,224, 64,207,149, 43, 87,218,218,216,216, 32, 33, 33, 33,221,221,221, 61,160,104,127, 15, 31, 62,156,223,183,
-111, 95,143,213,171, 87,111, 60,114,228,200,231, 50,153,108, 44,128,176,114, 93,107,161, 33, 22,139,197,200,204,204,196,254,253,
-251, 49,125,250,116,176,217,108,200,100, 50, 28, 58,116, 8, 31,127,252,113,145,161,169,148, 25, 22,139,197, 93,253,253,253,127,
-190,122,245,106, 53,123,123,123,120,122,122,178,190,250,234,171, 6,126,126,126,162,234,213,171,179,211,211,211,113,236,216, 49,
-191,209,163, 71,159, 76, 74, 74, 26,175,215,235, 43,108, 82,115,115,115,219,121,230,204, 25,159,200,200, 72,108,221,186, 21,185,
-185,185,224,243,249,176,183,183,135,187,187, 59, 2, 2, 2,152,121,243,230,137,251,246,237, 43,158, 49, 99,198, 78,131,193,208,
-184, 18,199,168,145,171,171,235,182, 78,157, 58,249, 45, 93,186,212,222,221,221, 29, 69, 15, 6,249,249,249,213, 18, 18, 18, 90,
- 46, 90,180,104,200,163, 71,143,226,100, 50,217, 20, 0, 79,170,120,226, 52,174, 87,175, 94,200,128, 1, 3,216,233,233,233,216,
-187,119,111,136, 82,169,108, 92, 5,115,249,143,226,209,195,251,152,252,209, 39, 42, 79,111,111,222,197, 11, 63, 15, 58,114,188,
-246, 67,123, 81,193,132,212,114, 45,140, 67, 6, 70, 55,235,222, 99, 2,175,119,159, 1,170,237, 63,108,148, 86,198,104,113,249,
- 60,167,253,251,214, 37,221,186,253,168,193,165,203,247,123, 14,234,215,143,240,120,246,126, 0,240,249,172, 79,185,199, 78,157,
-218,213,173,107,139,180,118,109,155, 38,141, 28, 53,219,167, 10,197,173, 93,187,118,237,235,225,225,225,110, 2,129, 0,185,185,
-185, 78,219,183,111, 95,215,182,109, 91, 86,108,108, 44, 94,190,124,137,248,248,120,228,231,231,163, 91,183,110,210,176,176,176,
- 31, 1,148,105,180,140,172,206, 43, 60,171,155, 54, 57,137, 36, 53,140, 22,133, 43, 49,165,215,187,116,230, 82,195, 3,123,181,
-193,110, 30,117, 2,198,125,184, 24,203,150, 31,229,254,186,255,219, 69, 87, 46, 31, 0, 88, 53,202,158, 17,128,160,245,151, 11,
-230, 67,161,212, 99,212,136, 73, 24, 61, 98,146, 19,129,193,131, 88,116, 18,131, 54,207,222,134,247, 34,116,203,142,117, 3, 1,
- 84, 43, 97,182,174, 80,179, 85, 54,203, 56,156, 22, 33,223,127,239,210, 96,226, 68,193,147,165, 75,213,217, 55,111,106,253,123,
-247,206, 11,158, 58, 85, 15, 0,202,248,120, 94,244,226,197, 98,151,246,237, 69,173,230,204,113,176, 24, 12,238,203,150, 45,107,
-190,168, 96,242,242, 42,105,250, 12, 29,106, 89,180,107, 87,179,155,179,103,119,100, 76, 38,118,207, 86,173, 30,175,218,187, 55,
-245,125, 52,255,204,114,166,221,184,161,207,245,243, 67,240,128, 1, 57, 62,174,174,250, 63,115,219,223,167,156,148, 98,138,114,
-181, 38,151,124, 66, 69,104,104,104, 7, 0,215, 1, 44, 13, 9, 9, 89, 2, 0,118,118,118,153,114,185,220,245,216,177, 99, 21,
-154, 44, 46,151, 11, 15, 15, 15, 4, 4, 4,200,100, 50,153, 91, 57, 5, 72,182, 90,173,213, 8, 33,197,209,151,178,208,235,245,
-136,137,137, 65,195,134, 13, 83, 80, 48, 17,109,153, 65, 29,177, 88, 28,251,242,229, 75,231,231,207,159,227,209,163, 71,240,243,
-243,131,131,131, 3,184, 92, 46, 76, 38, 19, 20, 10, 5, 2, 3, 3, 33, 16, 8,208,164, 73,147,108,181, 90,237, 87, 65, 19,144,
- 64, 34,145,196,220,184,113,195, 59, 56, 56, 24, 15, 30, 60,128,183,183, 55,220,221,221, 1, 0,241,241,241,184,125,251, 54,122,
-247,238,141,240,240,112, 12, 30, 60, 56, 89,173, 86, 7, 0,208,151, 37,232,232,232,152,126,245,234,213,148,160,160, 32,157, 90,
-173,102,101,102,102,114,111,222,188,105, 86, 42,149,210,252,252,124,174, 92, 46,231, 42, 20, 10,142, 90,173,230,178, 88, 44,158,
- 86,171,229, 94,185,114,133,109, 52, 26,203, 29, 32,179,232, 56,157, 58,117, 10, 65, 65, 65, 56,118,236, 24, 62,251,236, 51,220,
-185,115, 7,222,222,222, 56,124,248, 48,230,204,153,131,168,168, 40, 56, 59, 59,163, 94,189,122, 21, 29, 35,212,170, 85,235,213,
-211,167, 79,107,241,120,188,162,121, 29,139,230,203, 67, 86, 86, 22, 94,191,126,141,212,212, 84,248,251,251, 99,196,136, 17,175,
- 83, 83, 83,253, 43,170,121, 94, 94, 94, 89,145,145,145,206, 13, 27, 54, 68,102,102, 38,236,237,237, 97,103,103, 7,123,123,251,
-226,255,253,252,252, 48,123,246,108,184,187,187,203,116, 58,157, 91, 69, 38, 40, 40, 40,232,194,149, 43, 87,156,109,109,109,145,
-145,145, 1,133, 66, 1, 14,135, 3,177, 88, 12,103,103,231, 98, 35, 31, 19, 19,131, 62,125,250,100,199,198,198,246,168,130, 73,
- 98,185,185,185,189,140,136,136, 8, 32,132, 32, 41, 41, 9, 81, 81, 81,248,232,163,143, 98,116, 58, 93, 29,252,139,230,236, 43,
-145,119,197, 27,251,225,100,222,192,254,173, 13, 47, 34, 67, 25,129, 53, 10,141, 27,216,230, 3,192,227,103, 10, 59, 61, 43, 16,
-117,235,135,144,227, 39,127,227,255,178,123, 59, 23, 86,184,129, 65,212,139, 24,124, 93,150,118,247, 78, 30, 19, 63,253,116,124,
-131,142,109, 59,176,148,106,181,235,143, 63,174,111, 18, 27,251,194, 21, 0,252,252,234,202,166, 77,155, 21,102, 35,145,200,174,
-223,190, 97,221,176, 97,231,179,139,215,210,119, 84,162,200,126, 1, 1, 1,119, 79,157, 58,229,236,234,234, 10, 59, 59, 59,168,
-213,106, 24,141, 70, 60,127,254, 92,119,240,224, 65,147,173,173,173, 77, 70, 70, 6,228,114, 57, 24,134,193,169, 83,167,146, 0,
-248,190, 45, 84,148,163, 5, 0, 31,245,170,203,173,215, 57,192,129, 39, 48,139, 68,220,104, 15, 48, 22, 1, 67,164,110,231, 46,
- 60,110,120,238,210,131,145, 3, 7,125,230,210,174,195, 64, 44, 90, 56,196,148,150,150, 20,108, 68,187,151,165,229,104,213,241,
- 71,231, 1,131, 7,126,176,108,217, 18, 44, 89,180, 20,161,167, 78,228, 75, 37, 44,189,173, 61,215,174,125,203, 54,186,217,211,
-251, 39,171, 84,105,222,203, 86, 31, 28,209,167,255,236,106,109,219, 13,192,237, 91, 39,176,119,215,210, 71,140,136,208,102,196,
-183, 88, 2, 56,216,251,249, 77,153, 25, 19,195,123,178,100,137,202,156,150,150,215,116,214,172,236,210,214, 77,185,116, 73,194,
-247,244,180,117,232,215,207,113,163,175, 47, 49,201,100,219, 74,203, 49, 42, 77,243,178, 84,106,127,224,220,185, 46,132,203,237,
-240,197,220,185,162,144,144, 16, 40, 20, 10, 28, 61,122, 20,219,182,110,213,123,120,120, 60,245,124,246, 44,188,129, 66,177,176,
-178,154, 77,103,205,202,182, 88, 44,204, 7,115,230,116,139,140,143,239,156, 33,147, 85, 7, 0, 15, 71,199,228,166,126,126,143,
-118,134,134, 70,109,174, 81,195, 90,217,114,254,116,254,188,219,145,132,132,137,142,142,142,162, 76,153,140, 35,224,243,115, 90,
-214,171,119,248,135, 5, 11,174,155, 35, 34,120,194,106,213,108,237, 66, 66,170,188,237, 77,103,205,202,206, 85, 42, 57, 51,151,
- 47,111,147,152,153, 89, 93,165,215,251,203,149, 74,119,139,201,196,178, 21,139,115,106, 6, 6,202,180, 55,111,166,215,212,104,
- 62,217, 1,200,254,170, 99, 93,154, 23,249, 7,241,246, 56, 90,103, 8, 33,111,204,117,120, 61, 36, 36,228, 15,189,107, 8, 33,
-149,138,102,113,185,220, 55,154,169,202,129,199, 48, 12,194,194,194,224,228,228, 4,119,119,119, 8, 4,111, 78, 62,152,149,149,
-133, 59,119,238,224,197,139, 23,104,212,168, 81, 81, 51, 70,217,142, 72, 32,248,116,245,234,213,246, 6,131, 1,143, 30, 61, 66,
-211,166, 77, 33, 16, 8,192,227,241,222, 48,129, 50,153, 12,245,235,215,199, 23, 95,124, 97,183,114,229,202, 79,245,122,125,153,
- 79,164, 28, 14,103,198,164, 73,147, 92,139, 34, 88,201,201,201,104,210,164, 73,241,231, 46, 46, 46,120,252,248, 49,154, 54,109,
-138,106,213,170, 97,200,144, 33,174,123,247,238,157, 97, 54,155,191, 43, 75,147,207,231,179,130,130,130,154, 1,128, 68, 34, 1,
-139,197,138,182,181,181,117,113,115,115,147,216,218,218,254, 97, 27,119,237,218, 37,103,177, 88,166, 10,221, 0,139,133,140,140,
- 12, 52,104,208, 0,249,249,249, 0, 0,181, 90, 13,127,127,127, 40, 20,138, 98,211,234,233,233, 9,173,182,252,212,175,134, 13,
- 27, 46,169, 83,167, 78,119,137, 68, 34,224,114,185,120,242,228, 9,130,131,131,113,240,224, 65,248,248,248, 64, 44, 22, 35, 38,
- 38, 6, 65, 65, 65,184,113,227, 6, 92, 92, 92, 80,191,126,125,129,171,171,235,173,220,220,220,107,137,137,137, 75,202, 41, 39,
- 75, 42,149,226,198,141, 27,216,185,115, 39,226,227,227,145,150,150, 6, 27, 27, 27, 52,110,220, 24,245,234,213, 67,235,214,173,
- 17, 19, 19, 3,166,226,202,228, 30, 16, 16, 16,250,224,193, 3,103, 66, 8,246,238,221, 11,149, 74, 5,131,193, 0, 22,139, 5,
-161, 80, 8, 7, 7, 7,116,238,220, 25, 46, 46, 46, 8, 8, 8,192,161, 67,135,156,123,245,234,117, 86, 38,147, 53, 6,144, 81,
-209,126,117,112,112,248,100,241,226,197,222,174,174,174, 72, 72, 72, 64,126,126, 62,220,220,220,208,177, 99, 71,175,203,151, 47,
-127, 98, 50,153,214,255, 91,110,100, 37, 18,223,153,139, 23,126, 30, 20, 80, 51, 47,168, 81,160,216,251, 88,168,155,247,193, 80,
- 89,125, 0,104, 80,215, 45,114, 80,136, 56,249, 73,100,104,242,197, 11, 39, 30,189,136,198, 49, 84,162,105, 59, 95,163, 63,124,
-233,242,253,158,193,141,154, 88, 87,127, 59,167,207,244,143, 38, 10, 92,221, 38, 32, 51,233, 4, 46, 95, 13,243,153,243,217, 36,
-151,239,214,254,116,238,210,229,251,172,124,141,126, 97,229, 66, 89, 62,155,119,255,208,218, 89,153,125, 4,175, 94,242, 33,178,
-105, 0, 63,191,218, 80, 40, 20, 16, 10,133,194, 17, 35, 70, 88,230,207,159,175,177,181,181, 21, 51, 12,131,107,215,174,201, 0,
-244,168, 72, 87,231,234, 64, 44, 70,147,153,240,217, 86,194,216,104, 25, 75, 46,255,217,243, 56,116,239,218, 41,179,109,139, 6,
- 43,231, 47, 91,251,101, 64,237, 96,151,241, 19,151,114,151, 47, 25,185, 21, 12,218,149,166,243,242, 21,174, 50,135,143,139, 0,
-244, 89,246,245, 18,196,198,198, 56, 76, 30, 39, 95,202, 17,136, 60,235,248,182,177,217,186,243, 90, 79,127,255, 26,213,103,207,
- 24,114,102,221,247,235,250,148,140,108,237,222,181,248, 36,128, 46,149,217,183,255, 33, 26,142, 14, 13,133, 42, 41,201,148,123,
-235,150,174,203,247,223,103,123,247,232,177,222, 96, 52, 58, 23, 93, 42, 88, 12, 3,166, 40,117,194,106,101, 56, 95,124,193, 34,
- 28, 14, 76, 14, 14,227,144,151, 87,187, 34,205,207,210,211, 7,141,156, 56,177,207,201,243,231, 81,163, 70,141,226,251,153,189,
-189, 61,230,204,153,131, 89,179,102, 9, 30, 63,126,220,252,200,145, 35,205,191, 91,179,198, 13,192,160,202,148,243,226,189,123,
- 14, 83,151, 45, 91,208,168,105, 83,159, 61,251,247, 11,106,213,170, 5, 0,120,253,250,117,192,183,171, 86,249, 54, 8, 10,202,
- 92,249,233,167,187, 35,231,207,175, 15,224, 86,121,154, 25, 55,111, 26,142, 36, 36, 76,188,122,237,154,125,131, 6, 13, 0, 0,
- 81, 81, 81,174, 27, 55,110,156, 84,127,200,144, 81,203,166, 77, 91, 24,162,211,201,109,179,178, 4, 33,155, 55,115, 14,124,240,
- 65,133,154, 69,229, 4,128,142,227,199,127,218,174, 83,167,122,131, 38, 78,116,244,241,241, 97,164, 82, 41,140, 70, 35,210,210,
-210, 28, 34, 35, 35,107,133, 42,149,138,227,247,238,237,133,197,210,237, 47, 60,214,165,122,145,127, 88, 36,235,143,158,162,240,
-111,199,208,208, 80, 2,160, 99, 72, 72,200,141,162, 27,184,197, 98,169,148,201,226,112, 56, 96, 24,166,178,102, 11,132, 16,100,
-103,103, 35, 59, 59,187,184,233, 72, 38,147,225,234,213,171,136,137,137, 1,151,203, 5,143,199,131,209, 88,241, 28,180, 18,137,
-164,107,215,174, 93, 57,247,238,221,131,159,159, 31, 68, 34, 81,113,185,138, 94, 60, 30, 15, 30, 30, 30, 80, 40, 20,232,210,165,
- 11,119,211,166, 77, 93,203, 51, 90,118,118,118,189,135, 14, 29,202, 47, 90, 86,169, 84, 96,179,217,197,166, 69,165, 82, 33, 55,
- 55, 23,114,185, 28, 58,157, 14,173, 90,181,226,135,134,134,246,206,201,201,249,174, 50,219,175,209,104, 84, 50,153,204,190, 93,
-187,118, 14,187,119,239,142,106,213,170, 85,224, 27, 53,237,250,117,157, 78,167,227,178, 88,172, 74,205,163,183,111,223,190,226,
-125,159,154,154,138,173, 91,183, 22,127, 22, 19, 19,131, 77,155, 54, 21, 79, 5, 80,222, 49,170, 83,167, 78,175,189,123,247, 54,
-221,179,103, 79, 30,155,205, 70, 84, 84, 20,246,239,223, 15, 66, 8, 92, 92, 92,160,209,104,144,153,153,137,107,215,174,193,108,
- 54, 67, 42,149,194,203,203, 75, 56, 99,198,140,182, 75,151, 46,229,150,103,180, 44, 22,139,133,205,102,195,215,215, 23,139, 22,
- 45,130, 78,167, 3,143, 87,224, 47, 21, 10, 5,228,114, 57,194,195,195,145,144,144, 0, 82,193, 40,111, 66,161,112,200,158, 61,
-123, 92,249,124, 62,180, 90, 45,148, 74, 37,146,147,147,145,152,152,168,147,201,100,102, 27, 27, 27,150,175,175, 47, 75, 32, 16,
- 8, 6, 12, 24,192, 20, 25,206,144,144, 16,167,189,123,247, 14, 51, 24, 12, 21,153, 36, 23,119,119,247, 47, 39, 77,154, 36, 44,
- 89,103, 51, 50, 50, 48,104,208, 32,241,111,191,253, 54, 95,161, 80,236, 7,144,245, 47,187,161,145, 35,199,107, 63,124,116, 57,
- 42,232, 88,168,155,119, 98,138,165,205,156,207,215,114, 0, 96,251,182,111,218, 28, 11, 77,189, 83,167, 70,102,242,145,227,181,
- 31, 58, 56,188,168,200, 8,176, 58,119,240,232, 43, 17, 11,135, 14,234,215,143,252,248,227,250, 38,211, 63,154, 40,240,173, 61,
-167, 32,194,201,117, 69, 23,243,215,140, 70,251, 90,248,227,143,235,155, 12,234, 55, 56, 60, 62, 62, 97, 91,231, 14,130, 67, 87,
-111,164,159, 46, 47, 98,232,234, 36,244, 18, 11,212,240,242,171,135,192,186, 18, 60,126, 18,133,163,135,239,162,110,253,150,208,
-235,245, 48,155,205,146,190,125,251,106, 14, 30, 60,168,139,142,142, 86,106,181,218, 14, 0,162, 43,218,248,148,148,231,214, 64,
-247,150, 70,158, 72, 96, 86,230,243, 52,243, 22, 30,249,160, 73,139,238, 77, 29, 60,188,184, 46, 18,235,233, 94,221,154,239,223,
-185, 99,209,172,133,139,247,163, 89,243,238,173, 94, 68,221,170, 7,224,105,169,230, 53, 22,161,172,163,199,205,177,175, 94,245,
- 73, 76, 72, 72,169,237,230,110,120, 45, 39,166, 79,230,253,212,173, 93,135, 33, 13,107,213,109,207,127,241,252, 6,179,232,139,
- 97,191, 46, 91,189,110, 68,145,217,186,114,233,215, 14,227,198,221,229,239,222, 93,118,116,252,191, 6, 79, 32,168, 38,245,245,
-229,196,239,222,173,245,235,219, 55, 15, 0, 12, 70,163,115,124, 66,130,157, 88, 44, 6, 33, 4, 38,147,233,141, 28,226,162,188,
-225, 6,129,129,110,149,209,140,255,234,171,134, 95,124,241, 5, 50, 50, 50, 96, 54,155,193,229,114,223,190,102, 67,173, 86, 99,
-220,184,113,216,188,102, 77,203,202,104, 90, 44, 22,102,234,178,101, 11,230, 46, 88, 80,107,202,148, 41,172,146,215, 94, 71, 71,
- 71, 28, 57,122,148,191,101,203,150,106, 95,110,222, 60,110,164, 64, 16, 11,189,190, 92,205,108,127,127, 56,102,102,138,138, 76,
- 22, 0, 4, 6, 6, 98,235,214,173,130, 9, 19, 38,240,251,246,237,187,246,113,163, 70, 27,215,183,109,251,202,169,118,109, 91,
-190, 64, 80,173, 34,205,162,253, 9, 0, 74,157,174,193,250,141, 27, 29,238,223,191,143,204,204, 76,100,100, 20, 60,143, 50, 12,
-131,102,205,154, 49,163, 71,143,182,171,233,237,221, 28, 22,203, 95,121,184,255,224, 69,254, 65, 76, 46,229,189,223,115,180, 10,
- 55,136, 41,220, 64,166,196,205,241, 13,195, 82,145,209,122, 23,228,114, 57,228,114, 57,118,236,216, 1, 30,143, 87,124,243, 5,
- 0,131,193, 80, 25,211, 18,228,233,233,137,252,252,124,212,174, 93,251,141, 72, 22,143,199, 3,135,195, 1,143,199,131, 64, 32,
-128, 94,175,135,143,143, 15, 52, 26, 77, 80,121,154, 90,173,182,177,163,163, 99,241, 13, 86, 95, 88, 89,245,122,125,113,121, 13,
- 6, 3,242,242,242,160, 82,169,160, 84, 42,161, 86,171,131, 43,179,189, 86,171, 21,207,158, 61,123, 29, 24, 24,216,152,205,102,
- 67, 42,149, 74,212,106,117,113,110, 81,110,110, 46,126,249,229, 23,245,152, 49, 99,156, 79,157, 58, 85,161,209, 98, 24, 6, 31,
-127,252, 49, 4, 2, 1, 52, 26, 13,126,252,241, 71,204,156, 57, 19, 60, 30, 15, 74,165, 18, 91,183,110,197,236,217,179,193,225,
-112, 96, 48, 24,176,113,227,198, 50,181,158, 63,127, 30,127,239,222,189,224, 38, 77,154, 56, 28, 63,126, 60,171, 91,183,110, 46,
- 61,122,244,128, 72, 36,130, 86,171,133,201,100, 66,203,150, 45, 81,167, 78, 29,200,100, 50,156, 59,119, 46, 59, 32, 32,192,249,
-254,253,251,214,140,140,140,196, 10,204, 53, 41, 17, 49,132,197, 98, 65,102,102, 38,228,114, 57,178,178,178,144,150,150,134,148,
-148, 20,112, 56,156, 10, 71,211,117,114,114, 26,220,160, 65, 3, 54, 0,136, 68, 34, 52,110,220, 24, 11, 22, 44, 48,107,181,218,
-161, 0,206, 21,174,214,235,167,159,126, 58,126,251,246,109,142,167,167, 39, 94,190,124, 9, 23, 23, 23,142, 80, 40,172,208,104,
-185,187,187,239, 58,125,250,180, 99,145,185, 46,218,207, 26, 77,193,225, 24, 52,104,144,227,158, 61,123,118,153,205,230,222,255,
-182,155,154,189, 8,188,198, 13,108,243, 15,134,202,234,207,249,124, 45,167, 78,131,130,135,215,201, 83,192,249,110,205,103,245,
- 71,245,183, 61, 99, 47, 82,240, 42,210,233,213,213,123, 75,191,126,221, 88, 35,134,135,196,240,120,246,126,219,182, 47,117,117,
-117,155, 80,194,134,217,194,201,217, 22,126,190,124,230,200,153, 23,174,243,230,127,173,223,183,103, 93,236,175, 7, 66,123,242,
-185,151,186,159,187,156, 60,173, 44,237,232,215,242, 83, 26,189,176,174, 34, 39,130,113,116,107,131,198,141, 2,225,234,146,135,
-159,118, 29, 68,141,154,205,160,215,235, 97,107,107, 43,182, 88, 44, 70, 54,155,189,175, 50, 38, 11, 0,174, 92,145, 91,235,215,
-151, 27,216, 74,171,121,250,204,239, 6,118,235,213,175, 94,231,206, 93,173, 23, 47,253, 31,123, 87, 29, 31,197,241,190,159,221,
- 61,205,197,229,226, 2, 4, 8, 4,130, 21,105,113,215, 80,164, 88, 11, 5, 74,209,210, 2,133, 34, 69, 75, 5, 41,180, 64,113,
-104, 11, 20,119, 8, 30, 74,112, 13, 18, 15, 36, 16,191,184, 92,114,126, 43,191, 63, 34,223, 4, 34,119,129, 26,191,125, 62,159,
-253,236,221,222,238,115, 51, 59,179, 59,207,188,243,206, 59, 23, 13, 29, 90, 25, 20,253,250,180,204, 56,127,105,211, 83, 69,218,
-243,134, 77,155,117, 68,100,196,149,190, 28,135,112,130,168,220,250, 20,241, 12,231,181,108,228,149,131, 7, 39,177, 26,246,161,
-197,119,223,135,245, 27, 48, 96,108, 64,231, 78,157,217, 75,193,127,234,197,200,142,178,233,216, 62,245,179, 79,251, 29,255,117,
-239,250,222,231,207,253,222,160, 64,153, 24,196,139,172,151, 58,105, 52,237, 34,144, 72,200,172, 43, 87,232,102, 19, 38,232, 74,
-159, 71,153, 76,134,147, 39, 79, 66, 44, 22,151,109, 34,145,168,236,179,139,139, 11,136,146,105,164,166,112, 2,128, 66,161, 64,
-122,122, 58,108,109,109, 33,151,203,145,158,158,142, 91,183,110, 33, 54, 54, 22, 66,161, 16,125,251,246, 5, 89,133,111,243,203,
-156,195,231,204,233,229,223,172,153,247,203, 34, 11, 0, 12, 6, 3,114,115,115, 49,104,208, 32,242,220,185,115,174,231,147,146,
-222, 7,176,183, 58,206, 86, 3, 6,228,100, 28, 57, 82,233,127,191,243,206, 59,196,205,155, 55, 37,125,251,244,153, 53,251,251,
-239, 55,253,178,103, 79, 50, 67,211,174,230,228,157, 36, 73,146, 32, 8,120,121,121, 33, 55, 55, 23, 69, 69,197, 35,216, 86, 86,
- 86,176,183,183,135,209,104, 4,203,113,194,191,178,172,171,210, 34,255, 17,108, 47, 39,184,182,191, 98,209, 42,201, 20, 0,116,
- 45,223,176,176, 44,107,146,200, 18, 10,133, 53,250, 92,153, 98,229,122, 25,166, 8,173,210,180, 74,165,210,178, 7,173,188,192,
- 42, 77, 39, 73,146,160, 40,202,164,144,248, 44,203, 82,133,133,133, 56,122,244, 40,186,116,233, 82, 54, 44, 85, 80, 80,128,252,
-252,124, 20, 20, 20, 64,171,213,226,197,139, 23,184,124,249, 50, 26, 52,104, 0,192,180,224,175,241,241,241, 15,234,214,173,219,
-186,180, 17,239,214,173,155,231,174, 93,187,210,250,247,239,239,206,113, 28, 22, 45, 90,148,253,238,187,239, 58,149,111,228,107,
- 2, 69, 81,184,117,235, 22, 26, 52,104, 0,142,227, 32, 18,137, 16, 19, 19, 3,103,103,103,176, 44, 11,129, 64,128,172,172, 44,
- 88, 91, 87, 31, 35, 49, 60, 60,124,252, 39,159,124,146,102,107,107,219, 60, 39, 39, 71, 33,145, 72, 58, 93,187,118,205,203, 96,
- 48,192,198,198, 6, 54, 54, 54, 56,123,246, 44,236,236,236, 48,115,230,204, 36,141, 70,115,203,210,210,210, 69,163,209, 60, 73,
- 79, 79, 95,100, 78,121,211, 52, 13,149, 74,133,188,188, 60,228,230,230, 66,169, 84, 66,171,213,214,152,198,202,208,169, 83, 39,
- 4, 5, 5, 81, 43, 86,172,248, 53, 62, 62, 30, 0,224,235,235,139,153, 51,103, 82, 30, 30, 30,120,241,226, 5, 30, 60,120, 0,
-131,193, 0,142,227,170,125,120, 5, 2, 65,183,143, 63,254,184,163,183,183, 55, 97, 48, 24,192,178, 44,116, 58, 29, 74, 63, 39,
- 37, 37,193,223,223,159,244,241,241,121, 47, 62, 62,190, 27, 76,155, 88,193, 3, 64, 70,210, 9,120, 8,157, 1,210, 6,156,230,
- 4,114,178,107, 23,197, 37, 51, 51,243,251,185,139,111, 78,248,101,181,193, 37, 69, 1, 52, 10, 24,140,134, 77,122, 96,252, 24,
- 26, 43,126, 60, 10,111,159, 70, 72, 76, 76, 68,183,110,221, 68,105,105,105,159, 20, 21, 21,205, 49,149,251,210,165, 59,204,197,
-179,231,134, 13, 31, 57,182,117,207,158,253,233, 11, 23,206, 34,252,201,133,136, 79, 70,126,144,201,177, 69,132,131,157,197,195,
-152,232,251, 13,155,183,236, 10, 61,205,116, 2,150,173, 6,150,113, 85, 63,239,208,159, 57,227, 70,158, 57,241,251,152, 15, 71,
-143,107,209,163, 71,111,227,133, 75,167,241,224,246,165,199,107, 87, 79,188,186, 98,253,161,110,189,250,126,208, 84,238,114,235,
-108,128,159,238, 83, 47, 71,219,184, 29,187,114,249,202, 82,217,179, 41,149,178, 40,121, 47,146, 4, 1,142,227, 42,136,172,151,
-133, 22, 73,146, 53, 26, 0,202,115,150,111,139, 74, 59,212,219,182,109,131, 68, 34,129, 88, 44,134, 80, 40,172,209,253,162, 60,
-103,196,139, 23,221,119,239,221, 43,169, 76,100,229,228,228, 32, 39, 39, 7, 69, 69, 69, 24, 53,106,148,232,155,251,247,223, 65,
-137,235, 71, 85,156,222,110,110, 58, 75, 11,139,140,200,200, 72,247, 38, 77,154, 84, 72,175, 82,169,132,133,133, 5,246,238,219,
- 39, 10, 28, 48, 96, 90,143,179,103,215,162,134,248, 87,149,229,157, 32, 8, 56, 59, 59,195,222,222, 30, 4, 65,128,166,105,164,
-167,167, 35, 34, 34, 2,247,239,223, 7, 69, 16,244, 95, 89,198,149,105,145,255,160, 85,107,123,165, 67,135, 85,141,137,154, 35,
-180, 40,138,170,181, 85,171, 42,152, 50,116, 40,147,201,194,210,210,210, 58,120,120,120,128,166,233, 50,161,245,242,208, 97,169,
-245,227,209,163, 71,144,201,100, 97, 90,173,182, 90, 78,142,227,222,107,219,182, 45,142, 29, 59,134, 43, 87,174,224,249,243,231,
- 80,171,213,208,233,116,208,104, 52,136,136,136, 0,203,178, 8, 8, 8,128,165,165, 37,100, 50, 89,152, 78, 87,125, 71, 84,165,
- 82, 41,132, 66, 97, 35, 11, 11,139,178, 99,110,110,110,200,201,201, 97,141, 70, 35,118,239,222,173,116,117,117,181,180,176,176,
- 48, 89,184, 18, 4,129,204,204, 76,120,122,122,150,249,104, 21, 22, 22,194,217,217,185, 84, 88, 64,167,211,193,218,218,186,198,
-161, 67, 0,218,103,207,158,205, 46,247,189,205,240,225,195,247, 31, 60,120,176, 94,112,112, 48,238,222,189, 11,185, 92,142, 31,
-126,248,225,121, 66, 66,194,135, 0,238,103,102,190, 89,191, 72, 83,234, 80, 78, 78,206,209,176,176,176,247,218,182,109, 91,246,
-150,232,214,173, 27,209,173, 91, 55,167,242,166,254,172,172, 44,220,187,119, 15,193,193,193, 32, 8, 2, 79,159, 62,101, 52, 26,
-205,254,234, 70, 41, 60, 60, 60,118, 45, 92,184,208,138,166,233,178,186,109, 97, 97, 1,169, 84, 10,145, 72, 4,138,162,144,144,
-144,128, 65,131, 6,217,110,220,184,241,119,157, 78, 87, 31,128, 1,111, 9,242, 53, 48, 60, 10, 87,218, 6,248,187, 68,108,223,
-182,162,195,164,201, 40, 29, 58,164, 3,252,157, 35, 30,133,103,216,182,118,174, 57,191,231,130,147, 63,211, 27,207, 13, 60,119,
- 62,100,196, 87,179,102, 10,125,125,253, 51,131,255, 12,245,238, 65,127, 75, 56, 58,217, 32, 39, 91,137,132,164, 12,196, 39,234,
- 57, 95, 95,255,204, 7,247,194, 36, 63,254,188,174,161, 74,173, 45, 29, 58,172,182,158, 94,191,245,124,240,218, 13,146,171, 99,
- 63,105, 35,182,176,112, 71,110,118, 24,188,189,229, 24, 20,216, 28,191,237,185, 5, 91, 91, 7,184,184,184,128, 36, 73, 75, 83,
-243,158,157,157, 77, 28, 61,112,125,194,199,227, 38,190,219,167,247, 0,250,252,133, 51,130, 43, 23, 79,221,250,125,251,215,199,
- 57, 74, 37, 35,184, 66,139, 58,117, 93,159,196, 61,123,244, 97,247,158,163, 96, 33,178,110, 0, 52,174,180,194,150, 77, 48,224,
-144,116,236,224, 50,233,199,227, 38,181,239,211,231,125,250,194,133, 19,184,112,118,207,157,165, 75,235,156,125,158,186, 79,116,
-251,126,138,116,240,176,169,121, 65,231,162,244, 31, 12,172, 27,235,110,217, 82, 3, 60,231, 85, 85,249,142,164, 64,144, 65,235,
-116, 94,158,125,250, 80,234,196, 68,161,149,139, 11, 13, 0, 70,163,177, 70,161,133, 42,134,160, 95,230, 52, 53, 45,106,181, 26,
-108, 21,177, 19, 95,230, 76,207,204,172, 83,210, 9, 47,131,209,104, 44, 19, 89, 57, 57, 57,200,207,207,135,165,165, 37,178,116,
- 58, 23, 83, 56,123,183,107,183,251,155,101,203,230, 28, 57,122, 84, 84, 94,100,149,110, 66,161, 16,171, 86,175, 22,125,241,213,
- 87, 83,167, 9, 4, 51, 64,211, 38,223,207,210, 78, 59, 69, 81, 16, 8, 4, 72, 76, 76, 68, 82, 82, 18, 18, 19, 19,145,152,152,
- 8, 11, 11, 11,112,127,241, 36,160,255,176,127, 86,169,200, 42,191, 47,179,114, 85, 27,222,193, 28,103,120, 83,133, 1, 99,198,
-248,174, 41, 66, 75,165, 82, 5, 95,190,124,185,221,224,193,131, 5,119,238,220,129,171,171,107,153,208, 42,221,151, 14, 71,201,
-100, 50, 28, 63,126,220,160, 82,169,130,107,120,152, 46,159, 61,123,182,245,146, 37, 75,132,227,199,143, 71,100,100, 36, 38, 79,
-158,140,252,252,124, 40,149, 74,228,228,228, 64,173, 86,163, 93,187,118,144, 74,165,120,242,228,137, 81,173, 86, 95,174,193, 98,
-199,101,102,102, 22,201,229,114,183,151,127, 27, 54,108,152,203,230,205,155,213,209,209,209,198, 14, 29, 58,216,152, 42, 56, 74,
-113,224,192,129, 50, 75, 93,108,108, 44, 54,111,222, 92,230,147, 21, 26, 26,138, 53,107,214,148,197, 62, 51, 19,247,179,179,179,
-105,163,209,136, 6, 13, 26,192,195,195, 3, 90,173, 22,235,214,173,163, 1,220,255,167,106,179, 86,171, 61, 50,118,236,216,121,
- 15, 31, 62,116, 19, 8, 4,197, 38,237,146,252, 25, 12, 6, 60,123,246, 12, 17, 17, 17,136,142,142, 70,110,110,110, 89, 71,224,
-209,163, 71,121, 70,163,241, 80, 85,188,114,185,124,209,111,191,253,230, 42,147,201, 42,212,231, 82,107,104,169,149, 52, 43, 43,
- 11,118,118,118,232,209,163,135,243,229,203,151, 23,233,116,186, 37,111, 73,155, 70, 12, 27, 18,219,230,139,207, 6, 99,104,160,
- 44,249, 88, 80,234,205, 53, 63,206, 46,113,134,119,142, 24, 26,232,145,252, 56,198, 14,195,134,156,104, 3, 32, 5,213, 59,108,
-179,127, 94, 85,156,108,219,214,254,202,177, 83,167,126, 95, 48,119, 86,232,156,217, 19,229,106, 77,156,212,215, 71, 76, 0, 64,
-124,162,158,123, 18,201,106,215,172,157, 21,186, 98,245, 70, 50, 35, 39,127,242,189,123, 85,135, 55, 40, 47, 94, 72, 18, 82,223,
-198, 93,210, 26,250,117,172,123,231,214, 94, 88,201, 52,104,212,184, 13,250,244,126, 15, 87, 66, 30, 33, 61, 75, 11,133, 66, 1,
-157, 78, 87,109,184,132,232, 39,199,199,112, 4,231, 77,112, 68, 18, 65,114,210, 49, 99, 63,237, 52, 96,192,251, 92, 80,208, 41,
-250,196,241,189, 55, 14,253,177,225, 8, 41, 18, 10, 52,122, 91, 61, 65,104, 11, 64,134, 71, 22,169,138, 59, 52, 66,137,168,106,
-243,107, 73, 96,215, 38, 77, 27,187,142, 25, 59,217,182,127,191, 65,220,217,179, 39,216, 67, 7,119, 95, 57,180,179,217, 94,150,
- 84,138, 20,201,106, 73,129,210, 88,192, 17, 98,187, 34, 37,171,206,136,175,175,117, 31, 48,204, 0, 28,225,213, 85,249,118, 64,
-167, 75, 41, 74, 78,118,115,232,210, 69,242,108,217, 50,153, 75,187,118, 90,162,196,135,184, 58,161, 69, 81, 20, 64,146,172, 41,
-156,166,166, 69,163,209,128, 5,140,181,225,164,105,186,130,200, 42, 21, 90,165,207,139, 41,156,219,151, 46,189,227,221,167, 79,
-110, 72, 72,136, 75,215,174, 93,137,194,194, 66, 20, 22, 22, 86, 16, 91,238,238,238, 68,147,128, 0,217,129, 43, 87,124, 77,189,
-159,166,228,157, 36,201,191, 92,104,253,199,177,189, 74,235, 97,117, 87,149, 90,180, 76, 17, 90, 38, 90,180,140, 70,163, 17,206,
-206,206,200,206,206,174,178,225, 39, 73, 18, 22, 22, 22,165, 99,196,213,206,188,211,233,116,235,230,204,153, 51,189, 95,191,126,
- 78,141, 26, 53, 66, 86, 86, 22, 92, 92, 92, 32,149, 74,203,124,199, 74,249, 66, 67, 67,241,219,111,191, 41,117, 58,221,186, 26,
- 56,127, 94,189,122,245,103, 67,135, 14,117,112,117,117,133,189,189, 61,158, 60,121, 2,123,123,123, 40,149, 74,196,196,196,192,
-218,218,186,204,111,231,212,169, 83,133, 58,157,238,231, 26,196, 27,119,237,218, 53,131,181,181,245,147,172,172, 44, 42, 55, 55,
- 87,144,151,151, 39, 80, 42,149,194,130,130, 2,225,249,243,231,157,108,109,109,213,127,254,249,103,150,183,183, 55,245,252,249,
-115,202,104, 52,214,168, 94, 9,130,192,140, 25, 51, 32, 18,137,160,211,233,176,110,221, 58,204,153, 51,167,204, 39,107,245,234,
-213, 88,184,112, 97,153,112,222,177, 99,135, 89, 53,135,227, 56, 24, 12, 6, 24,141, 70, 24,141, 70,147,196,239,235,192, 68,193,
-158,254,244,233,211,192,182,109,219, 94, 60,124,248,176, 99, 73, 76, 50,100,100,100, 32, 35, 35, 3, 89, 89, 89, 40, 42, 42, 2,
- 77,211,240,240,240, 64, 70, 70, 6, 78,156, 56, 81, 80, 88, 88,216, 7,213,204, 56,164, 40,106,108,167, 78,157, 4, 47,167,161,
-180,151, 87, 42,222, 37, 18, 9,210,210,210,208,173, 91, 55,113, 72, 72,200, 88, 0,255,105,161, 85, 62,188, 67,239, 62, 19, 68,
-254, 77,219,235, 31, 71, 4, 37, 55,174,155,145, 60,122,144,205, 25, 0,120, 20,158, 97,251, 56,198, 14,254, 77, 3,185,222,125,
-236, 91,103,164,111,111, 6,192, 80,221,114, 61, 0, 96, 43,147, 12,239,213,179, 93,154,181,165, 37,185,102,237,142,115, 91,182,
-252,252,206,145, 51,255, 11,239,176,102,109,113,120,135, 94, 61,219,177,209, 81,209,195, 1,236, 52, 85,188, 4, 6, 14,124,248,
-219,174,223, 16, 29,241,167,251,188, 25,205,197,185, 25, 70, 88, 88,121,161,117, 75, 23,108,223, 21,134,199,143, 31,167,235,245,
-250,110,213,214,111,130,243,142,136, 12,247,107,214,180,137,235,152,177,147,108, 2, 3, 7, 33, 40,232, 36,254,216,189,243,218,
- 7,163,134,254,154,154,167,164,156,133, 50,145,140, 99,197,148,200, 86, 32,146, 88,100,234,245,197,115, 32,132, 66,169, 13, 48,
-188,218,134,103,202,164,209,182,221,123, 14,194,153,179, 39,241,199,238,237, 87, 23, 55, 29,182,179,110, 43,127,162,221, 59, 63,
- 78,173, 91,175,174,143,170, 40, 67, 73, 18, 98,131, 86,203, 90,255,184, 59,225,167,248,133, 99,227, 1,172, 5, 63,235,176, 60,
-158,252,209,191,127,219, 47,226,226, 68,242,142, 29, 45,210,174, 92,145,149,172, 68, 82,173,208, 18, 8, 4,224,170, 30,234,170,
-192, 73,236,217, 67, 2,168,118, 18,150, 72, 36,130, 90,173,134,177,106, 11,118, 5, 78,183, 11, 23,146,227,226,226, 26, 58, 56,
- 56, 84, 16, 89,185,185,185,101,159,181, 90, 45,212,106, 53, 44, 44, 44, 34, 52,149,143,136, 84,224,204,184,118, 77,187,114,198,
-140, 37, 31,142, 26,181, 33,248,242,101,169,163,163, 35, 10, 10, 10, 42, 8, 45,189, 94,143,238, 61,122,136, 86, 63,124, 56, 6,
- 74,229, 82, 83,238,167, 75,183,110, 53,250, 3, 83, 20, 5,246, 47, 30, 58,124, 11, 48,169, 50,225, 69,214, 52,132, 99,234,172,
-195, 42, 26,200,151, 87,247, 94,216,186,117,107,109,108,108, 44,188,189,189,203,196, 74,249,255,180,177,177,129,157,157, 29, 66,
- 67, 67,241,253,247,223,107, 0, 44,172,129,179, 80,173, 86,143,236,213,171,151, 70, 32, 16,160,113,227,198,101,241,179, 88,150,
-133, 88, 44,134,165,165, 37, 30, 62,124,136,129, 3, 7,170,213,106,245, 72,188, 26, 67,235,101,206, 2,181, 90,253, 81,239,222,
-189,213,145,145,145,232,212,169, 19, 30, 63,126,140,162,162, 34, 20, 21, 21,225,197,139, 23,104,210,164, 9,212,106, 53, 54,111,
-222,172, 81,171,213, 31, 1, 40,168,142,179,176,176,112,224,156, 57,115,168,253,251,247,215,245,240,240,104,218,166, 77,155, 70,
- 61,122,244,168, 63,100,200, 16,159,254,253,251,187, 53,108,216, 80,219,167, 79, 31,121,191,126,253,228,106,181, 90,120,243,230,
- 77,133,209,104,236, 87, 67, 58,203,196, 73,108,108,108,217, 80,161, 64, 32, 64,118,118,118, 89,228,254,210,151, 82, 21, 66,184,
-103, 77, 98,187, 84, 96,149, 10, 46, 19,252,220, 42,227,172,241, 34,177, 88, 92,106,241,228, 76,224,124, 20, 21, 21,213,171, 75,
-151, 46,143, 38, 76,152, 80,152,158,158, 14,107,107,107,248,250,250,194,207,207, 15, 78, 78, 78, 48, 24, 12, 56,126,252,184,234,
-196,137, 19, 97, 5, 5, 5,221,240,106, 12,173,158, 47,221,199, 23,149,189,100, 75,173, 89,165, 66, 75, 42,149,194,195,195,163,
-244,222,190, 48,231,126,214, 18,127, 45,103,137,128,233,209,189, 79,189,254, 3, 6,219, 30, 63,121, 75,188, 97,211,137,176,214,
- 61,177,195,177,142,242,148, 99, 29,229,169,214, 61,177, 99,195,166, 19, 97,199, 79,222, 18,247, 31, 48,216,182, 71,247, 62,245,
- 34, 35,162, 27,149, 95,247,176,178,116, 74,165,210,246,157, 58,182,206, 11,185,113,149, 93,177,122, 35,217,189,219, 7, 15,119,
-254,122,252,248,206, 95,143, 31,239,222,237,131,135, 43, 86,111, 36, 67,110, 92,101, 59,117,108,157, 39,149, 74,219,155,146,247,
- 41,147, 70,219, 14,232, 63, 8, 65, 65,199,233, 35, 7, 54,175, 62,120,244,105,151, 79,167, 95,203,136,141,125,204,101,166, 92,
-128,144, 76, 68, 84, 84, 84, 65,137,200,138, 53,133,115,242,196,209,229, 69,214,117, 71,215, 78, 59,162,162,192, 92,186,116,218,
-120,249,242, 67,205,245, 71,153, 5, 15, 34,179,115,211,178,114,159, 43,149, 57,122,150,101,192, 48, 12,245,205, 55,101, 14,187,
-149,150, 81,135, 14, 93,241,103,240, 62,236,222,181,173,128,101,161, 29,126,228, 8, 51,124,248, 50,206,167, 78, 29,159,189, 7,
-246, 17,129,239, 15,182,229, 0,118,224,208, 65,118,251, 15,238, 39,234, 53,168, 87,199,215,183, 44,164,205,127,175, 46,253, 5,
-156,203,128, 60,101, 98,226,213,208,141, 27,117, 46, 35, 71, 58,136, 93, 92,108,192, 48, 68,233,251,189,170, 77, 32, 16,188,108,
-129,169,146,211,195,201, 41,245,212,169, 83,240,243,243,131,135,135, 7,202,251,200,150, 6,228,118,116,116,196,209,163, 71,193,
- 85, 12, 78, 93, 37,103,171,186,117, 67, 87,173, 92,169,103, 89, 22,121,121,121,175, 88,179,242,242,242,192,178, 44,206,158, 57,
-163, 87, 22,175, 4, 98, 82,222,187, 81, 84,209,135,157, 59,175, 24, 48, 96,128, 33, 46, 46, 14, 44,203,162,188,101, 43, 51, 51,
- 19, 86, 86, 86,208,234,116, 94, 0,100,166,112,102,158, 63,111,137, 26,222,235,149, 88,180,254,138,114,255,175,139,172,242, 11,
- 74, 79, 50,201,162, 69,211, 52,188,188,188, 42, 44,233, 66,146,100,133,205,204, 25,135,123, 34, 35, 35, 47,244,233,211,103,201,
-187,239,190, 59,101,201,146, 37, 84,163, 70,141, 80, 80, 80, 0,123,123,123, 56, 59, 59, 35, 38, 38, 6,167, 78,157, 98,178,179,
-179,183, 2, 88, 14,211,166,208, 95,121,250,244,105, 96,243,230,205, 15,206,159, 63,223,182,119,239,222, 66, 47, 47, 47,112, 28,
-135,135, 15, 31,226,216,177, 99,134,157, 59,119, 42, 75, 68,150,169,206,203, 23,211,210,210, 62,232,215,175,223,222,177, 99,199,
- 90, 51, 12, 35,124,241,226, 5,116, 58, 29,140, 70, 35,146,146,146, 12, 65, 65, 65, 69,106,181,122, 52,128,139, 38,240,133,230,
-231,231, 55,185,116,233,210,216,155, 55,111,126, 63, 97,194, 4,199, 30, 61,122,136,104,154,198,141, 27, 55,178, 90,181,106,229,
-156,153,153,105, 56,122,244,104,142, 86,171, 93,200, 48,140, 73, 75,240, 16, 4, 1,165, 82, 9, 39, 39, 39,232,116, 58,176, 44,
- 11,189, 94, 15, 43, 43,171,178,101,147, 56,142,131, 57,206,245, 47,213, 1,202, 96, 48, 96,212,168, 81, 96, 89, 22,235,214,173,
- 3, 77,211,102,147,217,218,218, 62,120,244,232, 81, 96,203,150, 45,203,196, 75,105, 29,146, 72, 36,112,114,114,130,163,163, 35,
-130,130,130, 32, 20, 10, 31,212,228,239, 86,130,199,217,217,217,173, 46, 93,186,212, 62, 44, 44,236, 99, 0, 45, 13, 6,131, 7,
-195, 48, 4, 73,146, 10,142,227,158, 40,149,202, 95, 97,226, 18, 60,153,153,153,223,143, 27, 55,174,213,190,125,251,172, 4,130,
-255, 61, 26, 2,129, 0, 18,137, 4,165,193, 49, 57,142,131, 94,175,199,162, 69,139,148, 42,149,234,251,183,229, 45,209,186, 77,
- 59,108,223,188,222,234,242,159, 23,178,162,158,226, 88, 37, 33, 28, 82, 50,210,183, 55, 75, 75, 78,182,106,221,166,157, 73,156,
- 70,189, 33,231,163,209, 95,122,151, 44,193,179,232,197,139,132,109,123,247,252, 20, 15, 0, 63,254,188,174, 97, 70, 78,254,228,
-232,168,232,225,219,182, 29,104,111,212, 27,114, 76,225,252,159,120,217, 91, 0, 14, 90, 0,119, 31,134,101,212, 29, 56,242,252,
-194, 6,245,108,222,207,204,209,164, 22, 21,169, 63, 7, 16,111,106,222, 59,118,232,130, 63, 47,238,199, 31,187,247, 42, 57,150,
-210, 58, 57, 57,113, 0, 16, 21,229,196, 69, 69,229,115,255,243, 43,182, 83, 9,185,199,203,191,252,188,199,151, 5,202,220,159,
-215,109,174,126, 40,165,121,139,119,209,188,197,187,152,254,249,215,182, 77,154, 54,246, 6,128, 35, 71,192, 52,109, 16,121,122,
-201,226,101,239, 47, 95,190, 12,202, 66, 29,150, 47, 47, 94,174, 39, 38, 60,242, 76,124, 60,244,124,155, 85, 17, 75,104,250, 46,
-190,252,178,161, 58, 55, 87,222,113,222, 60, 39,193, 87, 95,145,213, 57,195,151,127,126, 77,225,188,255,228,201,153,201,159,126,
-154,186,116,201,146, 62, 91,183,109,179,104,214,172, 25,210,211,211,209,184,113, 99,120,120,120,224,210,165, 75, 56,122,232,144,
- 42,191,176,112, 33,128, 45,166,112,238, 57,123, 54,166, 81,211,166,217,219,182,109,115, 31, 48, 96, 0,161, 82,169, 80, 80, 80,
-128,130,130, 2,232,116, 58,148, 4,132,230, 98,159, 62,141, 50, 26,141, 91, 77,205, 59,147,149, 37, 93,222,174, 93,138,136,101,
- 87,125, 48,116,232,156,229,223,126, 43,169, 87,175, 30,161,211,233,202,172, 90, 6,131, 1, 86, 86, 86, 6,189, 94,239, 8, 64,
-109, 10,167,100,231, 78, 58, 43, 43, 11,114,185,188, 44, 92, 83,249,184,132,133,133,133,224, 56,142, 15,166, 91, 11, 84,169,144,
-236,237,237, 31, 8, 4, 2,207,242,214,173,202,214,206, 43,127,204,104, 52,166,100,103,103,183,126, 73,241, 86,229, 15,229, 11,
-224,135,238,221,187,127, 48,123,246,108, 34, 36, 36, 4, 39, 78,156,224,226,227,227,143,148, 88,177,226,171,233,233, 84,197,105,
- 45,145, 72,102, 90, 90, 90,246, 44, 13,225, 32,147,201,194, 84, 42, 85,112,201,112, 97, 97, 45, 56,109, 36, 18,201, 12, 75, 75,
-203, 94, 37,203,175,192,218,218,250,145, 74,165,186,164,211,233,214,163,234,133,170,171,227,180,176,181,181,253,222,201,201,233,
-163,175,190,250,202,241,218,181,107,138, 63,255,252, 83,148,159,159,191, 79,175,215, 87,183,168,244, 43,156, 14, 14, 14, 15, 40,
-138,242,252,139,202, 8,205,155, 55, 15, 26, 56,112,224,128,209,163, 71,195,104, 52, 98,203,150, 45,184,116,233,210,153,103,207,
-158, 5,214,208, 27,125,153,211,201,211,211, 51,100,202,148, 41, 62,163, 70,141,146,217,219,219, 67, 32, 16, 64,165, 82,225,217,
-179,103,120,248,240, 33,119,242,228,201,162,208,208,208, 20,181, 90,221, 21, 64,182, 25,247,243,117,122,205, 21, 56, 5, 2, 65,
- 23, 47, 47,175, 3, 75,151, 46,181,238,213,171,151,133,163,163, 35, 40,138,130,209,104,132, 66,161, 64,120,120, 56, 46, 92,184,
-160, 58,114,228,136, 42, 39, 39,103, 20,128,171,255, 68, 58,223, 36,167,127, 67, 44,126,105,161,232, 42,163,189,215,112,110,141,
-233,236,222,197,109,208,240, 15,250,245, 5,128,195, 71,207,157, 55, 97, 81,233, 42,211, 89, 83, 90, 77,225,108,220,128, 92, 26,
- 17, 25, 94, 33,160,101,211, 38, 1,177,254,205,134,126,103, 10, 81,185,200,240, 21,242, 94,110, 56,182,188, 77,183,194, 48,171,
-191, 47, 2, 7, 13, 31, 50,224,235,133, 11,240,195,247, 43,112,242,240,241, 51, 81,241, 21,150, 9,250,207,213,165,191,152,147,
-248, 78, 32,120, 87,230,230,214,121, 29,203, 46,120, 28, 30,110, 85,190,195, 86,106,121, 46,223,169,116,119,119,207, 84, 40, 20,
- 46,166,112, 6,254,242,139, 65,109,105, 41, 89,176,106, 85,151, 34,173,182,203,242,229,203, 5,247,239,223,199,230,141, 27,105,
-109, 74,202,222, 44, 96, 70, 21,163, 33, 85,114,250,204,152, 33,157,187,121,243,120,223, 6, 13,156, 63,254,248, 99,161, 80, 40,
-132, 74,165, 66,114,114, 50, 46, 94,184,160,143,140,138,138, 84, 42,149,239, 3, 72, 51,149, 51,240,151, 95, 12,118,190,190,144,
-201,229,220,229, 43, 87,108, 39,207,156, 57,165, 78,221,186,182,125,250,246, 21,218,216,216, 32, 47, 47, 15, 47, 94,188,192,241,
-227,199, 51,139,138,138,220, 1, 48,166,112,238,189,121,179,249,217,171, 87,135,125,247,221,119,226,128,128, 0,216,218,218,162,
-176,176, 16,225,225,225,184,122,245,170,110,235,214,173, 5, 5, 5, 5, 83, 24,134, 57,245, 23,150,251,219, 96,213, 42,197,246,
-210,209,159,191,218,195,223,148,130,104, 13, 96,113,201,231,111, 81,243,154,129,111,211,203,199,219,193,193, 97,187, 86,171,229,
- 52, 26,205,100, 0, 73,255,194,116, 10, 90,183,110,189, 57, 51, 51,179, 61,199,113,176,181,181,189, 21, 17, 17, 49, 13, 85,204,
-188,169,129,147, 2,208,222,202,202,170,157,181,181,117, 23,157, 78,231, 95, 50,252, 22,165, 82,169,174, 26, 12,134,187, 37,214,
- 39,230, 31,206, 59, 5,160,151,187,187,251,167, 44,203, 54, 32, 8,194,142, 97, 24, 24,141,198,124,150,101,159, 21, 20, 20,236,
- 4,112,233, 95,144,206, 55,194,217,164, 62,134,112, 36,252,171, 18, 4, 21,132,214, 75, 2,130, 96, 17, 21, 25,135,227,102,164,
-147,236,215,211,107, 19, 80, 60, 51, 17, 53, 59,215,254, 79,104,153, 32, 94,204, 22,153,245,169,113, 28,193, 85,224, 36, 56, 34,
-169,113,243, 33,127,188,142,208, 50, 21, 77,252,208, 5, 28,218,179, 28,238, 70, 63,195,159,111,241,187,238,141,113,254, 0, 56,
-108,180,183,191, 69, 10, 4,174, 0,200, 18,235, 11,203, 18, 4,195, 17, 4, 93,126,120,235,165,142,101,181,156, 6,160,153, 80,
- 34,241, 98,104,218, 37, 29,176, 58,203, 48,239,104, 57,174,200, 19, 88,252, 8,136,169, 77, 58, 13, 64, 51, 74, 34,241, 62,203,
-113,131,178, 44, 45,155,103,106, 52,114, 0,156,149,165,101,148, 82,165,218,173,213,106, 55,225,213,145,139, 26, 57, 69, 18,137,
- 39, 67,211, 46, 0, 64, 10, 4,153, 7,117, 58,175, 20, 27,155,143,181, 58,157,143,149,149,149, 81,175,215, 43,181, 90,237,104,
-154,166, 47,155,147,247,103, 52,221,228, 38, 73,118, 50, 88, 90, 58, 26, 8,194, 82, 79,211, 6,189,193,144,172,213,106,195, 0,
-252, 4, 32,238, 47, 46,247,183, 10,166,132,147,122, 83, 15, 11,207,201,115,242,156, 60, 39,207,201,115,242,156,127, 61,167, 12,
-128,119, 73,103,241,191,152,247,183,202,186, 85, 58,251, 95,192,223, 11, 30, 60,120,240,224,193,227,173,128, 26,149,248,100,241,
-248,103, 65, 84,163, 74,205, 49, 9,214, 70,217, 6,243,156, 60, 39,207,201,115,242,156, 60, 39,207,249,255,142,179, 38,238,255,
-226,144,228, 43,107, 29,114, 28,183,253,239,248, 99,222,252,203,115,242,156, 60, 39,207,201,115,242,156, 60,231,255, 59,148, 14,
- 29,146,252,173,168, 18, 46, 37,219,155, 62,151,199,219, 93, 23, 94,134, 71,201,102,206,249,110,252, 45,231,193,131, 7,143,183,
- 3,255,132,208, 50,181,209,122,157,198,237,117,133,207, 10,130, 64, 26, 65, 32, 13,192,138, 55,120,110, 77,112,119,114,114,250,
-162, 73,147, 38,123, 93, 92, 92,166, 3,112, 54,243,250,134, 50,153,108,189,165,165,101,136,165,165,101,136, 76, 38, 91, 15,160,
-225, 27, 42, 55, 2,192,100,137, 68,114,197,205,205, 45, 85, 44, 22, 95, 1, 48, 5,181,159,185,218, 8,197,113,210,190, 5,208,
-220,156, 11,157,155, 14, 58, 36,111, 58,232,137,188,233,160,112,199,128,129, 13,229, 77, 7,133,203,155, 14,122,226,220,116,208,
-161,191,160,190,190, 78,249,174, 32, 8, 36, 17, 4,146, 76,188,246, 39, 2, 72, 38, 8,164,188,129,186,196,131, 7, 15, 30, 60,
-254,107,112,119,119,255,192,205,205, 45,216,205,205,237,146,187,187,251, 7, 38, 92,210,179,146,134,135, 33, 8, 48, 53, 52, 36,
-213,157, 87,147,185,178,252,181,107, 76,204, 90,121, 78, 23,130, 0,195,149,128, 32,192, 58, 59, 59,111,112,115,115, 91,241,242,
-230,236,236,188,129, 32,192,150, 59,151, 41, 39,240,204, 53,171,186,140, 25, 51,230,112, 94, 94, 94,144, 94,175, 15,122,250,244,
-105, 80,215,174, 93, 15,190,100,221,168,146, 83, 42,149,126,216,182, 93,251,208,171, 55,238, 62,141,125,150,144, 22, 25,243, 60,
-225,244,249,203,247, 3,154, 53,191, 39,149, 74, 63, 52,163,140, 8, 0,147, 5, 2,193, 21, 43, 43,171, 20,129, 64,112, 5,192,
- 84,138,162, 78,173, 92,185, 50, 33, 34, 34, 34,227,230,205,155,249, 87,175, 94, 77,157, 48, 97,194, 51,130, 32, 78, 87, 34,216,
-123, 86, 98,165,121,217,170,179, 36, 49, 49,241,188, 66,161,184, 96, 97, 97,241,189, 9,231,151,113,202,155, 14,122,146, 89, 96,
-224, 50, 11, 12,156,188,233, 32,174,220,231, 39,102,222,243,154,202,232,149,186, 32,145, 72,188,107, 16,244, 61,171,186, 22,128,
-107,201,111,173, 1,252, 82,178,149, 78, 61,119,149, 74, 36,111,170, 46,189,137,188,243,156, 60, 39,207,201,115,254,221,156,255,
-101,180, 42,217,187,161,216, 95,203,173,182,179, 14, 63,123,250,244,169, 21, 0,248,249,249, 77, 3,112,212, 28, 33, 65, 16,152,
-203,178, 28, 9, 0, 36, 73,204,235,214,173,123, 43, 11, 11,139, 10, 81,144, 53, 26,141,248,202,149, 63,123,176, 44, 71,148,156,
- 55,151,227,176, 30, 64,134,169,255,161,215,235, 72,161, 80, 12,146, 36,190, 12, 8,104, 86, 39, 59, 59,251, 26, 73,146,123, 83,
- 83, 83,243,204, 54,227, 16, 4,118,236,216,225,231,230,230,246, 74,180,102,133, 66, 33, 30, 52,232,125,179,248,198, 1, 18,157,
- 68,210, 78, 68, 16,110, 12, 77,219, 1,128, 64, 32,200,187, 47, 22,183,254,225,187,239,100, 4, 65,176, 57, 57, 57,208,104, 52,
-152, 53,107,150, 69,100,100,228,224,236,236,236, 77, 53,208,250, 53,111,209,106,214,133, 11,231,253,149,185,121,218, 29, 63,111,
- 11,213, 8, 68,234,186, 77, 26,139, 54,111,223,109, 63,105,252,232,207,163,163, 35, 30,161,242,229, 72,202,131, 4,112,124,230,
-204,153, 77, 3, 3, 3,197,133,133,133, 82,141, 70, 83,103,239,222,189,139, 90,183,110,109,213,178,101, 75,241,129, 3, 7,136,
-130,130, 2,112, 28, 39,107,220,184, 49, 55, 98,196, 8,237,193,131, 7,167, 3,216, 80,141,240,157, 91,124, 47,201,117,141, 26,
- 53, 90, 10, 0, 79,159, 62, 21,149,187,199, 66,127,127,127, 75, 0,136,137,137,249,134,227,216,153, 0,192,113, 88, 13, 96, 65,
- 37,166,181,167, 77, 59, 14, 7, 8, 52,136,184,113, 88,218,180,211,112, 45, 56, 60, 35,128,167, 37, 29,130,229, 64,185,184, 80,
- 21, 17,149,150,150, 86,171,181, 9, 7, 12, 8, 36, 8,130, 56, 18, 26, 26,122, 52, 51, 51,179, 46,203, 50, 19,171, 75,231, 75,
-245,136,112,116,116, 28,151,157,157,189, 2,192,167, 81, 81, 81,173, 0,192,223,223, 95, 4,224,129,141,141, 77, 7,131, 94, 79,
-240,239, 42, 30, 60,120,240,248,207, 10,173,135, 0, 6,224,127, 75,240,108, 7, 96,182,208, 18, 3,192,181,107,215, 0, 64, 82,
-139,132, 16,229, 5,204,140, 25, 51,224,230,230,246,178,120, 65, 72,200,149,215,201,108,133,255,248,246,219,111,173,242,243,243,
-123,254,250,235,175,157, 57,142, 91,147,150,150,118,167,134,235, 51, 56, 14,171, 73,146,152, 71, 16, 4, 36, 18,105,236,148, 41,
- 83, 30,150,252, 86,231,244,233,211,178,129, 3, 7,170, 1, 36, 0,128, 68, 34,245,160, 40,210,175, 88,185, 98,117,117,130,112,
- 24,224, 75,139,197,221, 39,255,242, 11,253,206,192,129, 2, 75,185,156, 0,128,132,232,104,199,213, 63,254,216, 33, 47, 62, 94,
-172,113,116,204,201, 81,169, 52,177,177,177,144, 72, 36, 4, 69, 81,239,212,148, 97, 75, 75,203, 47,190,251, 97,149,165, 50, 55,
- 95,163, 85, 22,234, 41,218,168,179,182,144, 49, 25,233,153, 57, 86, 22,150,234,121,139,151,137, 63,155, 56,246, 11,149, 74, 53,
-173, 6,170,233, 95,126,249,165,127,219,182,109, 61, 14, 29, 58, 68, 20, 20, 20, 64, 32, 16, 88,181,108,217, 18,173, 91,183,102,
-254,252,243, 79,162,110,221,186, 8, 8, 8,192,141, 27, 55,112,235,214, 45,162, 85,171, 86,178, 99,199,142,141, 49, 26,141, 27,
-106, 18,215, 20, 69,206,106,220,184,113, 75, 75, 75, 75,189,159,159, 31, 38, 78,156, 8,142,227,208,179,103,207, 0, 43, 43,171,
-163, 42,149, 74, 28, 19, 19,221,185, 38,145,157, 25,113,114, 68,169,101, 11, 64, 51,112,120,150, 21,113,178,121,185, 83,252, 99,
- 98, 98,222,205,203,203, 43,115, 70, 44, 93,192,188,115,231,206,230,212,165, 12,142,195,234,129, 3, 3,231, 1, 4,209,179,103,
-207,252,233,211,167,147,209,209,209, 31, 13, 25, 50, 56,224,233,211,103,168, 38,157,229,235, 17, 49,110,220,248, 12, 43, 43,171,
-161, 71,142, 28,137, 81, 40, 20, 2,145,168, 76,103, 82,206,206,206,114, 63, 63,191,169, 14, 14, 14,153, 20, 73, 58,115,224,184,
-154,234, 18, 15, 30, 60,120,240,248, 87,225, 76,137,184, 58,243,242, 15, 2, 0, 8, 10, 10, 42, 11, 95, 26, 24, 24, 88,101,175,
-154,227,184,140,199,143, 31,123,169,213,106,112, 28,103, 74, 35, 80,126,138,102, 6, 65,144,155, 73,146,152, 70, 16, 4, 2, 2,
-154, 61, 95,183,110, 93,101,107,122,233, 3, 2,154, 61,167, 40,178, 30,199,113, 32, 8,114, 11,199,177, 25, 85,112, 86,218, 48,
-138,197,146,185, 0,224,234,234, 22,127,238,220, 57,253,176, 97,195,240,227,143, 63,138,230,207,159, 63, 71, 32, 16, 76, 79, 74,
- 74, 74,175, 38,157, 0,176, 64, 46,119,150,237,216,177,195,111,202,148, 41, 15, 21, 10,197, 2, 0,112,115,115, 91, 1,160, 9,
-128,132,114,199,176,117,235,193,212,137, 19, 39,198,102,102,102, 46,168,138,115, 40, 80,223,171,113,227,238,203,175, 93,227, 72,
-157,142,200,190,126, 93,153,149,145, 97,140,203,202,146,237,122,240, 32,112,209,138, 21, 66, 47,111,111,132,156, 58,229,148,173,
- 86,103, 21,232,116,218,140,140, 12,142,166,233, 91, 38,228,189,169,179,220, 89,182,237,167, 45,247,173,133, 20,235,236,233, 65,
- 8, 29, 28, 4,164,204, 70, 76, 9, 72, 93,189, 58, 13,197, 0,154,214, 84, 70, 34,145,104, 76,239,222,189,101, 7, 15, 30, 36,
- 2, 2, 2, 96,103,103,135,235,215,175,227,209,163, 71,200,203,203, 35,141, 70, 35,218,180,105,131, 85,171, 86,193,219,219, 27,
-249,249,249, 72, 74, 74,114, 18,139,197,114,163,209, 88,213,253,172, 80,159,230,206,157, 11, 55, 55, 55,208, 52,141,220,220, 92,
-208, 52, 13, 43, 43, 43, 0, 64, 74, 74, 10, 78,157, 58,105, 74, 93,170, 17, 28,199,225,189,247,222, 43, 36, 8, 34,234,101,139,
-150, 57,156, 30, 30, 30, 7,178,178,178,251,117,239,222, 29,121,121,121,198,101,203,150,161,121,243,230,240,243,243, 51, 37,157,
- 11, 68, 34,241,175, 62, 62, 62, 63,205,152, 49,195,205,193,193, 1, 58,157,110, 81,122,122, 58,166, 78,157, 10, 0,232,223,191,
-127,115,161, 80,120,110,194,132, 9,168, 91,183,110,106,110,110,110, 82,104,104,232, 68,181, 90, 29, 94,219,188,155, 8,158,147,
-231,228, 57,121,206,127, 21,167,169, 90,228, 95, 10, 69,169, 5,171, 4,219, 43, 8,173,192,192, 64, 34, 40, 40,136, 51, 33, 99,
- 57,158,158,158, 94, 22, 22, 22, 0,144, 99,110, 42, 88,150,157,238,232,232,152,185, 96,193,130,142,126,126,126,250,233,211,167,
-135, 39, 36, 36, 44, 44,127, 78,157, 58,117,190,223,184,113, 35, 98, 99, 99, 19, 86,172, 88,113, 35, 39, 39,199,220,117,204,230,
-115, 28,214,149, 88,199,178, 79,157, 58,213,252,218,181,107,211,126,254,249,103,249,103,159,125, 38,250,226,139, 47, 70, 3,248,
-177, 38, 18,138,162,212,149, 13, 23, 86, 6, 55, 55, 55, 61, 69, 81, 85, 6,137, 11, 4, 44,164, 98,113,183,229,215,174,113,250,
-132, 4,245,111,107,215, 90,111,187,119,111,169,145,227, 92,156,157,157,209,169, 67,135, 34, 41, 69,101,103,166,167,179,206,245,
-235, 83, 47,206,157,115,210,136,197,105, 7, 15, 30, 44,200,201,201, 57, 81,163, 9,143, 32,148, 44,199,233,173, 60,189,141,195,
- 6,247, 10,184,127,247, 81,180,181,179, 19,217,170,101, 64,243,232,216,132, 80,176,172,129, 32, 8,101, 77, 60,182,182,182,126,
- 57, 57, 57, 80, 42,149,144,203,229, 88,183,110, 29, 92, 93, 93,161, 86,171, 17, 17, 17,193,121,122,122, 18,215,174, 93,131,167,
-167, 39,178,178,178,160,215,235, 81, 88, 88,152,169,211,233,170, 90,155, 49,131, 36,169,223, 73,146, 24, 79, 16, 4,234,213,243,
- 77,220,180,105,147,158,101, 89,248,251,251, 99,200,144, 33, 56,118,236, 24, 34, 34, 34, 74, 45, 79,122, 31,159, 58,137, 36, 73,
-248,148,104,165, 90, 91,117, 74,151,246, 73, 75, 75, 27, 90,203,135,134,116,119,119, 31,221,160, 65,131,105, 31,126,248,161, 81,
- 44, 22, 67,165, 82,149,222, 11, 99,191,126,253,243, 7, 14, 12,180, 61,115,230, 76,181,233,212,235,245,241, 5, 5, 5,159,126,
-249,229,151,123,183,110,221,106,191,112,225, 66,176, 44, 11,142,227, 64,211,116,217,162,223, 44,203,226,248,241,227,136,139,139,
-251,254, 37,145,197,131, 7, 15, 30,255, 47, 96,134, 22,249, 55,194, 13,197,195,134,120, 89,108,253,237,145,225, 41,138,218,118,
-241,226,197,150,157, 59,119, 22,244,232,209, 35,224,252,249,243, 1,169,169,169,225, 37,214,131,128, 30, 61,122, 4, 56, 59, 59,
- 99,253,250,245,106,138,162,182,213,242,111,202, 26,189,244,244,244,135, 0,214, 28, 59,118,108,245,228,201,147,225,234,234,218,
- 68,161, 80,252,173,121,182,145, 72, 90, 77, 88,183,142, 22, 26,141,228, 47,107,214,216,172,189,114,101,245,161,195,135, 5,239,
-189,247, 30,193,113, 28,194,158, 60,177, 88,181, 97,131,108,212,224,193, 9, 49,241,241,244,201, 11, 23,140, 25,169,169,185,169,
- 89, 89, 75, 0,228,214,196,111, 52, 26,111, 63,125,250,212,189, 83,151,247, 60,174,222, 11,127, 52,108,112,255,238, 66, 1, 73,
- 60, 75, 72,121,224,230,234,100, 27,114, 37, 88, 99, 52, 26,111,215,196,163, 82,169, 94,208, 52,237,192,113,156, 60, 36, 36, 4,
-114,185, 28,121,121,121, 48, 26,141,208,235,245,122,181, 90, 45,205,201,201,129, 86,171,133, 78,167,131,141,141, 13,194,194,194,
- 50,104,154,254,179, 42, 78,134, 97, 38, 72, 36,146,111,133, 66,161, 88, 36, 18,165, 61,120,240, 0, 74,165,178,142,157,157,221,
-143, 52, 77, 35, 45, 45, 13,215,174, 93,251,202,198,198, 38, 1, 0,164, 82, 41,196, 98,137,163, 78,167,163, 1,164,214,246,158,
-191,206, 26, 83,174,174,174,222, 22, 22, 22,203,231,205,155,235,223,162, 69, 75,100,101,101,129,101, 89, 88, 90, 90, 66,173, 86,
-195,198,198, 6,237,219,183,127,177,124,249,114, 5,199, 97, 82, 77, 98, 48, 51, 51, 51, 75, 32, 16, 76,159, 60,121,242,183,126,
-126,126,245, 56,142, 67,195,134, 13,209,187,119,111,156, 59,119, 14,177,177,177, 80,169, 84,204,157, 59,119,246, 43, 20,138,211,
-252,235,150, 7, 15, 30, 60,254,115,120,197, 55,171,130, 69,235,239, 68,102,102,102, 86,116,116,244,249,208,208,208,192, 17, 35,
- 70, 32, 36, 36,100, 28,128, 47, 1, 64, 34,145,140, 27, 49, 98, 4, 66, 67, 67, 17, 29, 29,125, 62, 51, 51, 51,235, 77,252,167,
- 88, 44,214,234,245,197,198, 41,169, 84, 42, 53,243,242, 58, 37, 67,134, 0, 80,167,154, 99, 85,155, 70, 4, 2,183,102,125,251,
- 10,242, 30, 61, 82,238,184,123,247,219,189,123,247, 10, 58,118,236, 72, 24, 13, 6, 48, 44, 11, 95, 95, 95,162, 71,207,158,150,
-191,239,221,235,192,168, 84,215,190,155, 55,239,250,246, 9, 19,138,158,150,248,129,213, 4,157, 78,183, 97,218,212, 79,123, 94,
- 9,185,238,209,164,113,125,135,243, 23,175, 60,116,116,180,149,249, 53,104, 96,153,147,151,203, 44,156,255,149, 64,167,211,253,
- 82, 19,143, 70,163, 57, 30, 28, 28, 60,216,203,203, 75, 30, 30, 30, 14,189, 94, 15,134, 97,208,163, 71, 15,112, 28, 39, 1,192,
- 10, 4, 2, 68, 71, 71,195, 96, 48,100, 62,125,250, 52,237,217,179,103, 18, 0, 43,107, 72, 95,162, 78,167, 67, 84, 84,241,168,
-157,167,167,103,175, 1, 3, 6,128,166,105,244,237,219, 23, 39, 79,158,236, 21, 21, 21,181,182,188,230,123,221, 50, 47,177,144,
-249,187,187,187, 31, 43, 57,100,146, 19,188,135,135, 71,128,175,175,239,214,149, 43, 87,138, 60, 61, 61,193,113, 28,236,237,237,
-160, 86,171,145,157,157,131, 38, 77,154,192,203,203, 11, 43, 87,174, 4,128,253,166, 90,220,210,210,210,158,165,165,165,141,200,
-204,204, 20,229,231,231,183,238,213,171,215,250,158, 61,123,226,225,195,135,184,126,253,250, 40,137, 68,146,105, 48, 24,104, 87,
- 87,215, 73, 4, 65,216, 24, 12,134,125, 57, 57, 57, 10,254,221,197,131, 7, 15, 30,255, 9,148,250,104,161,220,222, 60,139,150,
-191,191,191,101, 66, 66,194,199,117,234,212, 17, 3,128,133,133, 69, 19, 95, 95,223, 57,241,241,241,133,230,166, 70,173, 86, 31,
-218,187,119,111,239,159,126,250, 73,212,191,127,255,250,199,142, 29,107, 11, 0,253,251,247,175,111,109,109,141,189,123,247, 26,
-212,106,245, 27,139,137,100, 52, 26, 59,183,105,211, 6,185,185,185, 72, 72, 72, 48,107, 88,230,244,233,211, 50, 20,251,101, 85,
-123,172, 58,208,122,189,189,157,135, 7,153,122,229,138, 33, 87,169,116,235,220,165, 11, 97, 52, 24, 64,146, 36,114,114,114,144,
-148,148, 4, 91, 59, 59, 34,250,233, 83,171,157,115,231,158,174,211,162,133,152,209,235, 29,205, 72,166, 42, 59, 51, 99,252,231,
-211, 63, 59,190,111,223,126,121,190, 82, 25,103, 97, 33,211, 73, 36, 34,215, 25,159,127,206,228,230,230,142, 5, 80,100, 2,207,
-202,125,251,246,245,237,219,183,239, 19,111,111,111,231,172,172, 44,215,252,252,124, 38, 55, 55,151, 66,177,175, 21, 1, 0, 87,
-174, 92,129, 82,169,164, 25,134,185,134,226, 88, 88,122, 83, 19,234,227,227, 99,219,186,117,235,174,114,185, 28, 5, 5, 5,112,
-116,116, 68,203,150, 45,187, 82, 20,245,107, 98, 98, 98,193,155,172,245,151, 46, 93,178,230, 56,238, 93,142,227,208,183,111, 95,
-147,174, 97, 24,230,147, 1, 3, 6,136, 8,130,128, 70,163,134, 84,106, 1, 75, 75, 43, 88, 91,219,192,207,175, 17,210,210,210,
-208,167, 79, 31,125, 92, 92,220,102,133, 66, 97,118, 29, 45, 40, 40, 24,212,190,125,251,217, 83,167, 78, 5, 77,211, 24, 52,104,
- 16,146,147,147,215,190,120,241,226,160,187,187,251,232, 79, 62,249, 68,238,232,232,136,217,179,103, 91, 0,248,134,127,119,241,
-224,193,131,199,127, 2, 47,251,104,189,106,209,170,110, 76,212,213,213,181, 19, 65, 16,139, 52, 26,141,184,116, 72,134, 32, 8,
-177, 92, 46, 63,169,209,104, 86, 40, 20, 10,179,156,226,242,243,243,149,207,159, 63, 63,121,251,246,237,225, 67,135, 14,197,165,
- 75,151,198, 2,192,208,161, 67,113,251,246,109, 60,127,254,252,100,126,126,190,242, 77,228,220,195,195,163, 95,151, 46, 93,134,
-182,105,211, 6, 65, 65, 65, 96, 24,230,150, 57,215,151,159, 97,136, 74,102, 29,150, 30, 51,137,140,162, 64, 16, 4,104,154, 6,
- 0,100,103,101, 33, 54, 38, 6,185,121,121,208,105,181, 80,169,213,140, 95,221,186,154, 2,189, 94, 72, 0,230,142,125, 37,134,
-222,191,147,164, 86,169,156, 29,237, 29, 52, 50,153, 4,249,202, 2,209,131,251,119,138, 0,196,153,200,161,231, 56,174,203,185,
-115,231,150, 80, 20, 53,194,202,202, 10,211,166, 77,163,186,118,237, 10,145, 72, 4,157, 78,135,252,252,124,236,221,187, 55,139,
- 97,152,122, 37,215, 88,201,100,178,221, 20, 69,165, 20, 22, 22, 46,170,241, 15,244,250,254,129,129,129, 2,189, 94,143,239,190,
-251, 14, 75,151, 46, 69,223,190,125, 5,247,239,223,239, 15, 96,223,155,170,241, 44,203,162, 87,175, 94,229,157,225,163, 76,185,
- 78, 40, 20, 6, 52,104,208, 0, 89, 89, 89,200,202,202,130, 92, 46,135,187,187, 59, 92, 93, 93,177,118,237, 90,110,253,250,245,
-231, 13, 6,195,230,236,236,236,140, 90,212,197, 73, 99,199,142,157, 52,124,248,112, 20, 21, 21,225,246,237,219,232,208,161, 3,
- 86,175, 94,237,118,237,218,181, 47,219,180,105, 3,161, 80,136,144,144, 16,208, 52,157,204,191,183,120,240,224,241,255, 13,255,
- 81,255,172,106, 81,173, 69,203,203,203,203,142, 97,152,175, 6, 12, 24,208,107,240,224,193,232,211,167, 79,133,223,247,237,219,
-103,125,244,232,209, 21, 27, 54,108,232,107, 48, 24, 86,154, 51,212,199,178,236,241,125,251,246,245,127,239,189,247,100,221,186,
-117,243, 5, 0,137, 68,162,223,183,111,159,154,101,217,227,181,200, 75,105,112,199, 12, 0,112,119,119,111, 46, 16, 8,134,246,
-235,215,175,249,248,241,227, 17, 17, 17,129,189,123,247, 62,243,243,243,187,145,145, 97, 86, 27,153, 80,195,172,195, 21, 53, 89,
-183, 40,177, 56, 39, 63, 61,221,206,202,219, 91,104,111,109,173, 8, 10, 10,242,234,217,179, 39,145,156,156,140,188,188, 60,104,
-181, 90,220,191,127,159, 21, 0,137, 2,123,123, 34,241,246,109,130, 18,139,115, 80,113, 38, 95,141,240,114,179,111,184,120,254,
-148, 58, 90,157,182,105, 65, 65, 1, 45, 16, 10,133,158,174,118,201, 49,113,102,141,196,233,100, 50, 89,107, 0, 2,150,101,213,
- 14, 14, 14,178,139, 23, 47, 66, 44, 22,131, 32, 8, 52,107,214, 12, 82,169, 84,196,113, 92, 18, 0, 88, 91, 91,139,183,109,219,
-102, 59,122,244,232,235, 53, 17,183,106,213, 74, 40,145, 72,222,247,243,243,195,237,219,183, 17, 30, 30,158,120,251,246,109,159,
- 86,173, 90,193,219,219,251,125, 55, 55,183,195, 15, 31, 62, 52,190,137,138, 93, 60, 99,213,124,103,120,134, 97, 88,130, 32, 64,
-146, 36, 88,150, 69, 86, 86, 22,234,213,171,135, 77,155, 54, 97,221,186,117,223, 41, 20,138, 83,181, 73,143,191,191,191,168, 94,
-189,122, 99,135, 15, 31,142,248,248,120,172, 88,177, 34, 91,161, 80, 92,185,112,225,194, 7, 83,167, 78,165, 58,116,232,128,156,
-156, 28,252,254,251,239,244,131, 7, 15,126, 75, 79, 79,223,195,191,114,121,240,224,193,227, 45, 22, 90, 94, 94, 94,195, 69, 34,
-209,236,145, 35, 71, 82,141, 26, 53, 66, 70, 70, 6,108,108,108,140, 4, 65, 8, 1,192,206,206,206,104, 97, 97,129, 41, 83,166,
-160, 69,139, 22,157,230,206,157,219, 65, 32, 16,108, 74, 75, 75,219,109,202, 31,103,102,102,170, 73,146, 60, 50,109,218,180,149,
-143, 30, 61,172, 7, 0,247,238,221,123,158,150,150, 54, 63, 51, 51, 83,109,102, 62, 74,131, 98, 18, 18,137,244,110,195,134, 13,
- 95,180,110,221,218,102,240,224,193,144,203,229, 8, 13, 13,197,170, 85,171,158,234,245,250, 37, 87,175, 94,165,255,238,155, 76,
-235,116,233, 15, 78,156,176,238,250,209, 71, 54, 51, 6, 12, 88,243,217,180,105, 63, 45, 94,188, 88,208,168, 81, 35, 66,173, 86,
-227,238,221,187,220,209,163, 71,141,191,127,251,237, 58, 88, 90, 10,111, 31, 61, 42,214,235,245,137,102, 90, 75,186,116,236,220,
-169,209,154,159, 54, 64,171, 41,194,221, 91,103,144,151,151,133,109,219,143, 53,242,240,224,186,164,166,166, 94, 53,149,139, 32,
- 8,191, 75,151, 46, 57,115, 28, 7,177, 88,140,229,203,151,195,221,221, 29, 54, 54, 54, 40, 44, 44,196,151, 95,126,105, 59,115,
-230, 76, 91, 0,136,136,136, 40, 11,207, 80, 19,210,210,210,218, 79,153, 50,197,154,166,105,156, 63,127, 94, 79, 16,196,162,224,
-224,224, 95,155, 53,107, 38,238,212,169,147,245,158, 61,123, 58, 0, 8,121, 83, 66,171,150,215, 61,187,120,241, 98,155, 17, 35,
- 70,112, 66,161,144,200,207,207,135,157,157, 29, 54,109,218,164, 82, 40, 20,103,106, 93, 7,104, 90, 44,147,201,196, 28,199,225,
-200,145, 35, 72, 76, 76,252, 36, 39, 39, 39,157, 97,152, 99, 95,125,245,213,156, 70,141, 26,213,141,137,137, 73, 44, 44, 44, 92,
-157,153,153,249,130,127, 53,241,224,193,131,199,127, 10,165, 78,240,165,179, 15,207,160,120, 56,177,106,161,197, 48,204,148, 11,
- 23, 46, 80, 44,203, 98,251,246,237,120,240,224, 1, 39,147,201, 22,201,100,178,141, 22, 22, 22,140, 70,163,153, 60,113,226,196,
-209, 75,151, 46, 37, 59,117,234,132,219,183,111,147,245,234,213, 27, 11,160,188,208,234,137,106, 98,109, 20, 20, 20,220,207,200,
- 72,175, 87, 46, 64,101, 61,137, 68,122,191,134,204,188,204,249,114, 80,204,118,203,151, 47, 87,185,185,185,233,195,195,195,177,
-117,235, 86,246,193,131, 7, 87,196, 98,241, 54,133, 66,161, 51,145,243, 77,160,140, 83, 76,211,161,127,204,153,227,255,206,160,
- 65,236,167,179,103, 23,137, 44, 44,190, 88,179, 97,195,220,252,194, 66,119, 16, 4,231,104,107,155,184,125,249,242, 21,125,223,
-127,191, 40,226,234, 85,233,163, 75,151,132,114,163,241,177, 57,233, 76, 77, 77,189, 26, 18,114, 29,187,118,252, 4,131, 65, 7,
- 69,106,177, 78,203,206, 41, 64, 13, 34,235, 21, 78,154,166, 11, 62,248,224, 3, 17, 0,139, 49, 99,198,136, 51, 51, 51, 81,191,
-126,125, 0,128, 82,169,196,153, 51,103,208,184,113, 99, 0, 64, 88, 88, 88,217,231,154,210,105,105,105,249,126,135, 14, 29,144,
-152,152,136,136,136,136,203, 10,133, 34, 7,192,229,228,228,228,254,109,218,180,193,241,227,199, 7, 86, 35,180,204, 42, 35, 19,
-133,214, 43,156, 22, 22, 22,243,143, 29, 59,246,201,173, 91,183, 70,204,153, 51, 71,216,163, 71, 15, 0, 64, 97, 97,161, 26, 0,
- 83, 27,206,242,105, 50, 26,141, 96, 89, 22, 14, 14, 14,170,156,156, 28,100,102,102,190,200,204,204,156, 22, 23, 23, 87, 43,206,
- 55, 81, 63,121, 78,158,147,231,228, 57,255, 37,156,111, 3, 76,143, 12,207,113, 28,205,178, 44, 66, 66, 66,112,236,216, 49,198,
- 96, 48, 76, 82, 40, 20, 97,229, 78,217, 16, 26, 26,122,233,131, 15, 62,216, 29, 19, 19, 67, 69, 70, 70,130,227, 56,198,156,212,
-104,181, 90, 35, 65,188,122,236,117,115,185,107,215, 46,164,167,167, 27,146,147,147,131,105,154, 62,254,154,179, 23, 95,123,214,
-225, 46, 64,247,161, 94, 31,188,180, 99,199, 94, 75, 46, 93,146,124,250,245,215,186,113,227,199,127,197,232,245, 70, 74, 36, 98,
-197,150,150, 36, 35,145, 8, 35,174, 94,149,174,159, 58,213, 65,163,211,157,223,107,134,131,121,169, 69,171,107,215, 78, 24,247,
-233, 44,104,202, 89,180,110,223,143,133,206, 0,179, 44, 90, 58,157,174,169, 66,161,128, 84, 42, 77, 2,224,250,241,199, 31,131,
-101, 89,104, 52, 26, 20, 22, 22, 34, 45, 45,173, 96,252,248,241, 76,137,120, 18, 12, 29, 58,212,198, 20, 94, 95, 95, 95,119,161,
- 80,136,243,231,207, 67, 40, 20,158, 1, 0,161, 80,120,230,210,165, 75,253, 71,141, 26, 5, 15, 15, 15,223,248,248,120, 2, 53,
-248,167, 57, 55, 29,116,136, 3, 26,130, 64,131, 98, 19, 28, 26,200,155, 14,122, 66, 0, 79, 75,162,198, 71,181,106,213, 10, 48,
-209, 47,171, 60, 74, 38,119,172, 51, 26,141,135,231,206,157, 59,173, 93,187,118,189,151, 46, 93, 74, 0,160,222,196, 19, 72,211,
-244,107,133,158,224,193,131, 7, 15, 30,255,106,171,214, 43,168, 82,104, 17, 4,177,189, 75,151, 46,147, 0, 80, 4, 65,108, 77,
- 75, 75, 11,123,249, 28,133, 66, 17,235,238,238,254, 99,221,186,117, 39, 3,224, 8,130,216,110,102,162, 50, 56, 14,171, 72,146,
-152, 91, 44,238,106, 21,160,178,116,169,147,185, 0, 8,146,164,118, 63,124,248,240,235,164,164,164, 44, 19, 45, 16,213,226, 77,
-204, 58, 4,128,253,192,139,145,137,137, 23,102, 7, 4,244,236, 59,117, 42,154,247,237,107,227,238,227,195,104, 12, 6, 54,236,
-198, 13,226,214,145, 35,162, 71,151, 46, 9, 53, 58,221,249,227, 64,146,185,233, 76, 77, 77,189,250,231,149,171, 23,135, 13,237,
-223,219,183,174,123,177,104,120,145,134,236,220,130,139,230,136,172,151, 68,239,160, 77,155, 54,157, 18,137, 68,130,242, 75,217,
- 24, 12,134, 92,157, 78,215, 20, 0,242,242,242,220,183,111,223,126,128, 36,201,196,154,248, 34, 35, 35, 79, 46, 89,178,100,104,
- 66, 66,194,197,228,228,228, 4, 0, 72, 74, 74, 74, 48, 26,141,187, 21, 10,197,208,196,196,196,163, 48, 97, 18, 0, 7, 52,140,
-184,113,184, 25, 0, 52,237, 56, 28, 17, 55, 14, 75, 1, 52,107,218,113, 56, 0,160,182,107, 25,150, 71, 73,104,133, 69,183,111,
-223,222,215,187,119,239,137,120,141,152, 94, 0,160,215,235,141, 26,141,134,102, 24, 70, 96, 48, 24, 56,189, 94,111,228,223, 73,
- 60,120,240,224, 97, 58, 56,142,107, 3, 64, 94,242,181,212,128, 34,127,233,179, 30, 37,203, 5,150,190,126, 75,190,103, 17, 4,
-113,191, 28, 71,217,113, 19,174, 5,128,108, 0, 79, 8,130,168,202, 8,178,189,170,239, 85, 10,173,180,180,180,163, 48, 97,209,
-104, 83,207,171, 6, 11, 74,214,137, 3,106,191,182, 91, 25, 7,195, 48, 25, 73, 73, 73,175, 93,160, 36, 73,190, 24, 56,112,160,
- 89,231,215,116,206, 65, 32,241,115,157,110, 79,208, 47,191,180, 60,191,117,171, 7, 67,211,142, 4,192, 81, 98,113,142, 94,175,
- 79,144, 27,141,143,205,181,100, 85,176,198, 60, 79,237, 19,255, 60, 21, 13, 26, 52,224,158, 61,123, 86,108,235,121, 61, 60, 86,
-169, 84, 94, 53, 85, 1,181, 90,221,201, 68, 49,184, 63, 53, 53,117,127, 37,130,253,128, 66,161, 56, 96,106,162,202, 22,149, 6,
- 72,150, 96,135, 53,237, 56,252, 8, 0,182,116, 81,233, 55,137,244,244,244, 24,148,196,121,123, 29, 36, 38, 38,234, 8,130,248,
- 99,213,170, 85, 99, 30, 61,122,116, 48, 45, 45, 77,199,191, 54,121,240,224,193,195, 60,145, 69, 16, 68, 80,201,247,192, 18,163,
- 80,208,203,159, 75,207, 41, 61,175,252, 57,165, 28, 47, 31,175,238, 90, 0,152, 63,127,254,215, 43, 86,172,144, 1, 48,117, 49,
-230, 90, 47, 42,253, 87, 33,227, 95,194, 81, 94, 20,236,248, 43, 50,250, 11,160, 7, 77,223, 1, 93,206, 39,223,248,102,141, 27,
-207,158, 61, 35,222,230, 7,174,116, 81,233,114, 8,248, 47,164, 59, 33, 33, 97,147,183,183,247,182,180,180, 52, 26, 60,120,240,
-224,193,195, 28,200, 43, 19, 70, 85,136,178,192,234,126,175,208,113,175,228,188,202,190, 19, 4, 17,180, 98,197,138, 64, 51,210,
- 91,102,209, 34,249,178,227,193,227,239,195, 63, 49,235,149, 7, 15, 30, 60,120, 84,142,151,173, 88,165,226,235,229,239,243,231,
-207,255, 26,213,143, 56,185,161,216,138,229, 86,242,189,204, 95,139, 64,241,204,129,202, 96,206,108,130,158,181,200, 95, 48,207,
-201,115,242,156, 60, 39,207,201,115,242,156,255,239, 56,107,226, 14,174, 68, 16, 13,168,106,168,175,186, 97,196,151, 63,215,116,
-109, 77,231, 18, 4, 81, 85,152,159,210,161,194,178, 61,199,113,219,241, 55,160, 39,207,201,115,242,156, 60, 39,207,201,115,242,
-156, 60,231,235,128,227,184, 54, 28,199, 13, 64,241,132, 41,142,227,184, 1, 28,199,245,157, 63,127,254,130,210, 99,243,231,207,
- 95,192,113, 92,143,210,243, 74,206, 41,187,166,244,216,203,251,151,143, 85,119,110, 53, 73,156,244,210,231, 73,165,147,200,254,
- 45, 62, 90, 60,120,240,224,193,131, 7, 15, 30,149,162,116,198, 96, 57,107, 83, 22,128,176, 21, 43, 86,228,149,243,157,202, 2,
-240, 24, 64,139,146,243,178, 74, 68, 90,121,223, 42,125,201,119,125, 37,231,232, 77, 57,183, 10,108,175,226, 51, 47,180,170, 66,
- 11, 87,242, 91,111, 79,231,214, 37, 5, 0,142,101, 1, 0,108, 73, 12, 36,174, 52, 24, 18,203,130,227, 56,164,101,230,135,134,
-101, 98,113,109,255,207,207, 29, 14,206, 82,233, 58,150,227, 58,150, 28,186, 90,144,163,155, 21,161, 68,190,169, 28,141, 93,224,
- 47, 37,241, 21,203,161, 57, 0,144, 4,158,104, 89,252, 24,157, 97,126, 60,169,202,234,121, 83, 57, 38,137, 45,100, 35,109,237,
-236, 27,228,229,101, 63, 53,104,117,135, 35,179,176, 13,230,175,203, 8, 95,123,188,203,114,248, 26, 0, 41, 36,177,246,105,174,
-201, 51, 57,120,240,224,193,227,117,173, 35,175, 21, 23,143, 32, 8,166, 18, 78,226, 53, 57,249, 0,123, 38,136,173, 74, 14,223,
-171,228,216,253,127, 83,186,205, 18, 90, 77,228,152, 10, 2,203, 0,112,224,240, 77,100, 22,182,152,117,189, 27,122, 74, 41,106,
- 39, 0, 74,107, 96,102,115, 44,174, 85,122, 51, 73,116,150,138,168,181, 0, 88, 45,195, 76,136, 84,152,238, 47,214,212, 3,125,
- 5, 44,249, 7,203,113, 66,134,229,118,131, 67,144,149, 8, 55,239,164, 66,107, 78, 90,189, 61,157, 91,159,184,167,232,125,101,
-203, 12,180,107, 94, 31, 28, 67, 3,172, 17,178, 78, 95,225,242,207, 31,163,157,191, 55, 56,214, 8,176, 52,172,250,173, 65,191,
- 0, 91, 46, 44,179,118,235, 96,251,185,195,193,199,201, 57,124,199,142,157,174,238,190, 77, 8,150, 54, 32,230,222,197,209, 51,
-231, 46,233,222, 20, 5, 1,166,136,173,230,110,248,212,187, 78,163,175,102, 45,251,137,114,115,247,178,100,141, 58, 58,253, 69,
- 84,171, 13,171,151, 28, 21,145,137,107,159, 40,176,211,212,186,220, 68,142,201, 2,137,120,184,133,212,178,129, 90, 93,248,140,
- 49, 24, 15,147, 66, 65,223, 31,215,172,107,217,181, 87,127, 43,166, 48,157, 52,178,104,114,232,224, 1,159, 95, 54,109,238, 31,
-174, 96,222, 7,192,154,147,103,150,195,220,216, 61,147,250, 11, 5, 20,225,255,201, 14, 10,160,107, 37,180,252,157,241, 33,193,
-161,198,240, 18, 28,129,235, 81,153,216, 95,155,255,104,236,140, 95, 9, 14,126, 32,112,132,224,112, 32, 50, 11,153,252, 43,143,
- 7,143,183, 11, 36, 73, 94, 97, 89,182,219, 27, 22, 6,239,114, 28,119,135,191,187,255,191, 97,158, 69,139,192,119, 17,113,201,
-246, 96, 12,104,234,231,251, 45, 96,158,208,146, 82,212,238,251, 79, 51, 92, 65, 27,176,227,251,105, 7,245, 70,128, 54, 26,192,
-208, 70, 48,180, 17, 52,109, 0, 99, 52,130, 51,234,176,228,183, 43,128,190, 16,173, 3, 26,238, 6, 24, 55, 83,255, 67,200,145,
-127,132,222,184,232, 64,232, 11,176,127,203,138,207,147,179,138, 62, 15,126,146,150,221,196, 89,179, 32, 50, 19,191,155, 35, 8,
-174,108,157,129,189,199,207,164,172,255, 85, 21,205,114, 28, 28,108, 44, 26,141, 14,140,240,218,115,242, 74,242,186,221,218,104,
- 0,176,181, 20, 55, 26,251,228,169,247,235, 20,130,179, 84,186,110,219,230, 95, 92,221, 28, 45, 8,250,214, 74,208, 12, 3, 47,
-159, 1,212,130,233,163,221,190,251,121,231,207, 80,234,198, 85,119,125, 35,103, 52,169, 83,215,127,246,238, 51,183,188, 85,202,
- 76,253,197,125, 95,199, 65, 7,163,171,135,191,240,219, 21, 63, 81, 11,231,205,248, 82,207,164,220,141,201, 68,100, 77,239, 26,
-127,103,156, 92,177,114, 77,243,238,253, 2,173,216,162, 44, 74,171, 42,242,219,241,219,206,101,141,155,183,149,117, 10,240, 20,
-101, 30,158, 66,104, 10,115, 97, 32,165,146,238, 77,123,218,104,198,140, 50,238,216,181,119,122,100, 38, 54,152,147,103,166,220,
-176, 53,203,214, 62,234, 58,193,161,211,163, 59, 87, 38, 51,105,247,193, 49, 70,128, 49,148,237,193, 24,193,177,197,251,118, 83,
-126, 3, 80, 59,161, 69,114,232, 29,124,227,190, 91, 70,186,162,205,207,107,126, 88,192,221,191,127, 14, 12,254,136,202,197, 85,
-115, 5, 38, 15, 30, 60,254,213, 22, 19,154,227, 56,193, 27,230,236,207,113,220,217,215,164,249, 10,192,167, 37,159,119, 2,248,
-241, 13, 36,205, 19,128,107,201,231,116, 0, 41,124, 13,120, 45,148,197,205,122,249,187,185, 21, 74, 10,142, 5,142, 12, 6, 0,
- 11,115, 83,193, 1, 82, 16, 20, 96, 84, 97, 80,191, 94,112,114,118, 5,140,106,192,160, 6,140, 26,192,168, 2,140, 26,100, 43,
- 18, 1,131, 10,136, 63, 7,154,227, 36,102,103, 87, 87, 0,196, 30, 70,143, 86,222,144,219, 74, 49, 99, 80, 19,167,237,231, 99,
-119,238,188, 24,211, 51, 50, 19, 35, 77, 74, 43,199,161, 93,179, 6, 88,191, 83, 21,125,250, 97, 86, 31, 0,232,223,194,241,124,
-187, 38, 62, 94,235,118,107,163,207,134,229,245, 5,128,190, 77,109,206,181,109,228,230,205,162,246, 86, 95,150,227, 58,185,215,
-105, 64, 48,143,182,129, 85,166, 64,169,212, 32,229,197, 30,216,123,188, 67, 50, 44,186,212,116,189, 5,133,249, 95, 44, 92, 37,
- 84, 43, 51,244,172, 33,139,145, 83,121,148, 64,204, 18, 72,189,170, 43, 98,243,153, 89,147, 62,166,103, 47,254,126, 62,128,209,
-213,241, 52,113,198,244,181,107,215, 53,235,208,186,177,115,250,209, 25, 68, 81, 94, 6,104, 74, 38, 25,244, 94, 7,216, 53,108,
-194,102,132,172, 37,196,190, 61, 97,231,232,139,212, 91,251,144,112,231, 24,209,177,213, 80,201,239,251, 69, 99, 0, 67,165, 66,
-171,129, 19, 58,246,233,220,246,160,175,183,187, 27,199,177, 96, 89, 14, 28,203,160, 72,107,196,130, 67,241, 96, 24, 6, 31,244,
-233,216,195, 82, 76,112, 44,203,130,227, 88, 36,167,231,168,255,188, 27,221, 35, 62, 15,119, 77,177, 84,181,120,183, 91,199, 39,
-161,119, 26, 27, 99, 79,163,245,232, 21,209, 4,112,163, 92,157,235,248,240,194,239,141,129,223,106,175,229, 8, 48, 9,231, 87,
-194,187,243, 36,106,219,254,243,242,130,172,212,177, 71,247,108, 30,182,101,219,182,189,209,153,152,194,191, 95,120,240,120, 59,
-192,113,220, 27, 23, 91,137,137,137,105,175, 35,182, 60, 60, 60, 58,167,166,166,174, 46,245, 86, 33, 8, 98,117,157, 58,117,150,
-252,175,163, 90,161,175, 87,192, 48,204,232,212,212,212,107,213,113, 14, 24, 48,192,253,204,153, 51,117,203,113,214, 5, 80,183,
-178,115,237,236,236,152,246,237,219, 39,156, 57,115, 38,141,175, 33,181, 18, 92,102, 11,173,232,164,195, 51, 90,233, 20, 69, 0,
- 16,109,194,249, 21,134,252,180, 70,102,229,174,101, 31,175,108, 90,199, 1,133, 42, 61, 46, 62, 72, 0,195, 24,193,208,116,137,
-101,139, 6, 67, 27,209,167,133, 19,218,107,167, 96, 67, 80, 12,104,134, 93, 81, 29,231,203, 48,112,236,135, 45,123,142, 56,196,
-178,156, 88, 34, 36, 11,252,188, 28,157,103,127,208,130,156, 49,168, 41, 52, 6,122,196,190,144,184, 63,163, 50,177,195, 36, 78,
-246,213,144, 71, 92,101,199, 24,186,198,188, 87, 99,141,106,215,179,107, 39, 27, 78, 87, 0, 99,118, 60, 10,213, 70,196,231, 24,
-145,174,205,135,132, 80,152,196,201,114,104,238,233,225, 38,187,121,112,222, 11, 71, 74, 41,112,166,104,145,152,164,193,176, 28,
-197,229, 71,234, 28, 26,247, 18,150,250,109, 85,151, 78, 11,153,245,199,157,123, 15,176, 77,218, 55,137,176,240,235, 3,231, 86,
- 94,120,113,109, 23, 50, 31, 4, 33, 39, 45,129,176,209,230,195,197,177, 62,250,141, 30,137, 31, 71,182, 65,161,178, 16,148, 34,
-206, 86, 44,148,216, 1,134, 74, 57, 57, 6,163,215,174,250,222, 77, 64,145,197,247,179,116, 99,140,208,232,116, 0, 67, 67, 42,
- 96, 65,112,165,191, 25,193, 24, 13,178,230, 67,231, 77, 3,152,187, 53,229, 61, 42, 19,251,155,200,209, 9,172,177, 49,103,212,
-128, 0,110, 68,102,253, 79,252,248, 59,227,195,119,250,140,239,196, 17,184, 94,155, 50, 10,112, 68, 96,235,186, 86,150,150,202,
-104,164, 28,249, 28,113,144,114, 46, 29, 62,197,135,159, 76,151,109,223,190,125, 32,192, 77, 69, 69, 31,181,191, 98,145, 85,158,
-147,231,252, 79,114,218,216,216,212,171, 83,167,206, 18,163,209,216, 89, 36, 18,185, 24, 12, 6,176, 44,155, 46, 22,139,175, 39,
- 36, 36, 44, 87, 42,149,207,255,109,121,127,242,228,137, 57, 98,171, 70, 78,161, 80,136,152,152,152,103,102,136,173,224,151,174,
-255,227,198,141, 27, 56,116,232, 16, 0, 32, 54, 54, 22, 13, 27, 54,180,172,236,194, 23, 47, 94, 88,118,237,218,245, 15, 0, 94,
-213,113,134,133,133,213, 59,125,250, 52,142, 28, 57, 2, 0,136,137,137,129,159,159, 95,165,137,185,113,227, 6,245,209, 71, 31,
-213, 3,144,246, 55,148,209,219, 32,178,202,239,255, 39,180,130,130,130,184,192,192, 64,226,229,207,149, 32,222,219, 94,220, 10,
- 90, 6, 0,226,205, 77, 65, 84, 6, 86,173,223,115,161,239,229, 35,155, 58, 75, 69, 36,150,238,152,157,156,149, 91,248,174,128,
- 40, 30,126,161, 57,144,246, 86,226,219, 43,198,182,240,206, 43,210,226,212,189,212,107,145,153,230,153, 72, 35, 21,184, 4,176,
-118,197,223, 24,104, 53,153,126, 99,127,188,116,224,192,252,190,205,103, 13,106,142,147,183, 18,102, 1,116,141, 81,223, 57,150,
- 5,199,210,101,206,239, 37, 93, 7,128,173,184, 40, 48, 11,174,248, 24,107,158, 69,171, 11, 32,200,115, 70, 63,107,153,120,227,
-228,201, 19,109,140, 89, 79,145,171, 23, 33, 57, 79,139,116,141, 16, 69, 2,103,164, 70,135, 49, 36,129, 75, 53,154, 92, 8, 40,
- 57, 90,107,103, 47,182, 34, 3,122, 77,243, 80,158,255, 58, 79, 76,208,148,205,144,239,236,178, 47,255,148, 64,171,178, 84, 4,
-129, 26,195,207,219,218,218, 53,212,230, 36, 80, 5,121,217,176,115,109,138,190, 35, 2,241,205,128, 38, 40, 84,170,144,149,123,
-155,107,224,102, 67, 36, 94,223,139,133,253,252,145,147,161,128,206, 8, 16, 42, 93,174, 86,175, 45,170,242, 62,146,216, 54,115,
-206,220, 15,125,220,228,150,165,147, 10, 56,150, 65, 11,127, 95,244,234,220, 14,151,110,220,196,253,176, 88,176, 37,147, 10, 56,
-150, 69, 74,102, 94,134,214,192,236, 50,235,134, 50, 52, 56,163,182, 82, 33,134, 90, 12, 25, 6, 56, 67,198, 0,139,219,212,179,
-158, 48, 63,208,199,218, 82, 66, 64,107,100,160,213, 27, 81,120,115, 35, 28,235, 52,131, 76, 42, 37, 90, 65, 35,120, 8,240,235,
- 22,242,224, 81, 14,195,134, 13,147,102,100,100,132,120,121,121, 53,233,213,171,151,172, 83,167, 78, 80,169, 84,184,120,241, 34,
- 84, 42,149,143,151,151,151,207,197,139, 23,135, 38, 37, 37, 69,122,122,122,118, 61,114,228,136,201, 62,180, 37, 2,136, 42,123,
- 5, 3, 52, 65, 16, 40, 57, 70,148, 28,171,245, 58,183, 98,177, 24,137,137,137,111,220,178,149,154,154,250,172, 54,150,173,162,
-162, 34,145,135,135, 7,228,114, 57, 24,134,129, 74,165,194,137, 19, 39, 80, 80, 80, 0,150,101, 97, 97, 97,129,239,214,238, 64,
-244,195, 16,220,189,123, 23, 5, 5, 5,162,154, 56, 83, 82, 82,136, 22, 45, 90, 64,167,211,129,166,105,104,181, 90, 4, 7, 7,
-151,125, 23, 8, 4,152,251,237,207,136,125, 16,130, 71,143, 30, 33, 37, 37,229,111, 89,109,196, 12, 45,242,111, 68,149, 49,179,
-254,246, 89,135, 12, 67, 47,216,190,251,192,237, 5, 83, 70, 98,250,168,158, 94,203, 55, 29,235, 25,149,141,221, 0,224,239,132,
-177, 99,186, 53,240,182,147, 9,241,205,190, 7, 0,199, 45,120,221,255,139,200, 69,108, 19, 23,118,214,241,187,137, 33, 95,143,
-108, 5, 95, 55,155,134,121,226, 92,113,124,188, 9,107, 10,178, 52,236,173, 36,141,250,183,112, 60, 15,150,133,157,181,164, 49,
- 24, 26,118, 86,146, 70,125,155,218,156, 3, 0, 27,153,176,113,101,150,175,170,208,218, 75, 56, 73, 38, 17, 76,178,180,182,243,
- 30, 55,176,151, 69,255,129, 67, 45,172,132, 52,114,238, 94,132, 82,232, 9,163,131, 15,116,198, 92,164, 60,143, 99, 46,223,137,
- 74,205, 46,212,205,174, 49,153, 28,174,165, 62,143,145,215,107,222,203, 62, 59,104, 97,102,189,241,251,234,146, 96,201,194,189,
- 67, 50, 44,157,219, 90,220,139,127, 94,196,114,149, 90,116, 42, 64, 89, 80,144, 96,100,224,166, 97, 4,214,113, 87,126,199,252,
-126,205,144,151,155, 9,173,129, 70,129,134, 54,184,218, 73, 37,186,231,225,208, 25,104,232,141, 44,132,118, 30,184,120, 59, 44,
-155, 53, 26,207, 85,197, 25,159,131, 71,241, 39, 30, 89,149, 63,230,235,132, 22,243,108, 44, 30,193,168, 65, 98, 74, 26,118,159,
-185,221, 42, 62, 7,143, 94,167,156, 57,150, 46, 30,126, 46,103,201, 34, 56,116,170,141, 19,124, 99,103,180, 21, 73, 69,191,172,
-158,245, 81,147,247,252, 28, 36,108,202,109, 16,172, 1,150,140, 0, 26, 49, 3, 91, 47, 95,176,250, 66, 78,173,213,230, 71, 0,
-124,164,119, 30, 60,202,161, 81,163, 70,174,169,169,169, 17,115,230,204,113, 24, 50,100, 8,142, 31, 63, 14,165, 82,137, 93,187,
-118, 97,221,186,117, 88,182,108, 25,140, 70, 35,182,111,223, 46, 59,122,244,104,219,205,155, 55,167,120,123,123, 55, 77, 74, 74,
- 74,175, 65, 96, 17, 0, 36, 0,132, 37,109, 23, 1,128, 61,123,246, 44,250,247,239,143,179,103,207,178, 37,199, 24, 20,119,126,
-106,181,158,168, 88, 44,134, 88, 44, 70, 65, 65,193, 27, 17, 91, 66,161, 16, 86, 86, 86, 16,139,197, 40, 44, 44, 52, 91,108,209,
- 52, 77,165,164,164,160,160,160, 0,189, 6, 14,196,207, 43, 86,160, 91,183,110,232,213,171, 23, 56,142, 67,112,112, 48,122,118,
- 8,192,200,247,187, 34, 42, 42, 10, 52, 77,155,148,222,244,244,116,100,100,100,160,239,192,129,216,177,121, 51,218,181,107,135,
- 70,141, 26,129,166,105,132,132,132, 96, 88,159, 14,144, 14,238,137,216,216, 88,190, 82,155,110,205,122, 35, 62, 90,175,141,136,
- 44,220, 97, 79, 94, 13, 26,213,167,109,224,192,142, 77,176,227,224,229,239, 33, 87, 30, 0, 0, 71,157,228,187,143,187,249, 34,
- 50, 41, 15,151, 31,165, 5, 69,101,227,141,204,214, 96, 25, 56, 57,218,200, 0, 74, 12,141,129,165,109,226,107,118, 96,102, 57,
- 14,178,206,243, 48,102, 96,164, 87,187, 38, 94, 94,165,179, 14,173,250,255,132,177, 97,207,188,219, 52,114,245, 6, 99, 4, 24,
- 35,108, 70,238, 3,190,181,172, 49, 29, 29,234,138, 47,205,156, 49,163,125,191,193, 35, 44,196, 50, 91, 48,202,100, 24,211,195,
-144,243,244, 26, 84,178,134, 72, 79,140,199,161, 11,119, 11,158,166,228, 40, 73, 18, 23, 51, 10,116, 95,197,231,161,168, 38, 94,
-173, 17, 43,150, 44,156, 61,224,208,129,131,214, 18,223,142, 68,220,198,254, 5, 98, 1, 45,145,215,125,135, 84, 75,157,184, 31,
-118, 29,180, 81,233,177,178, 38, 30,181, 74,121, 44,248,226,249,145, 13,234,117,180,126,113,255, 12, 52, 90, 29,116, 70,160,105,
-219,174, 96, 24, 78, 76,144, 4,107, 67, 81, 68,102, 78, 30, 8, 35,147,113,253,241, 11,197,141,199,241,148,206, 26, 43,171,141,
- 46,242,178,186, 39,168, 47, 6,118,109, 9, 24, 53,120,191,115, 51,252,188,247,242,231, 0, 51,254,245, 10,185,216,162,197, 1,
- 29,155,200,177,149,227,208,241,193,137,117,141, 91, 15,158, 9,115, 44, 90, 77,157,208,207,191,158,251,239, 63,127, 55,207,193,
-209,179, 33, 69,176, 70,112,174,205, 1,101, 10, 71,164,220,134,173, 71, 59, 48,238, 29,176,125,195,154, 34,150,229, 14, 0,224,
-167,100,243,224, 81,254,125,164,213, 30, 91,181,106,149, 67, 96, 96, 96,169, 69, 6,183,111,223,198,206,157, 59, 97,105, 89,241,
- 61,217,191,127,127,112, 28,231,176,116,233,210, 99, 0,222,171,138,179,125,251,246, 3, 31, 61,122,148,214,178,101,203,248, 18,
-177, 37, 2, 64,134,135,135,147,201,201,201,132,189,189, 61,231,238,238,110, 76, 75, 75, 99, 1, 48,159,124,242, 9,117,248,240,
-225, 6, 42,149,234,106,109,133,150, 88, 44,126, 35, 62, 91, 66,161, 16, 4, 65, 64, 44, 22, 67, 36, 18,129,227, 56,179,196, 22,
-195, 48,130,179,103,207,226,193,131, 7, 88,214,178, 37,102,121,120,192,193,193, 1, 33, 33, 33,224, 56, 14,150,150,150,200,205,
-205,197,129, 3, 7,208,189,123,119,208, 52, 45, 50,133,247,200,145, 35, 8, 13, 13,197,183,173, 91, 99,150,173, 45,172,172,172,
- 16, 28, 92, 60, 26, 40,145, 72,144,152,152,136,224,224, 96,116,237,218,149,175,212,175, 9,147, 43, 79, 23, 64,144, 75,192,213,
-160,215,128,163, 57,128,128,187,191, 63, 68, 81, 81, 21,157,115, 76, 1, 73, 98,225,134,221, 65, 3,126,154, 57,144,152, 52,168,
-149,251,242,223,175, 76, 5,128, 9, 31,248,121,200, 36, 2,172, 63, 25,201,145, 36, 22,190,137, 12,250,251, 67, 68,228, 96,106,
-175,118,141,144,150,175, 71, 92, 90,254,159, 81, 38, 14,245, 92,254,105, 12,246,156, 10, 73, 94,183, 71, 27,205,113, 28,236,172,
- 36,141,198, 62,137,243,254,253,108,104,210,218, 67,218,104,142,229, 96, 39, 19, 54, 30, 31,213,161,198, 89,135,173,189,132,147,
-190,156, 61,187,195,160,241,115,164,116,244, 97,232,227, 46,128, 53,104,160, 52,136,144, 79,185, 34, 37, 41, 9, 63,108, 15, 74,
- 86,170,244, 35, 35,178,204, 19,152, 79,115, 80, 36, 32,148, 67,126,248,230,235, 75, 43,190, 91,106,165,137, 15, 41,162, 8, 90,
- 67,213,233, 34,248,110,217, 79, 68,161, 78, 63, 34, 62, 15,133, 53,241,232,172,177,114,213,218, 13, 3, 38,142, 30, 26,237,215,
-176,139, 35,147,246,220, 81,171, 84,102,238, 59, 31,234, 90,210, 83, 36, 0, 32, 46, 37, 7, 89, 5, 42,154,161,141, 87,173,133,
- 88, 30,105,138,117,176, 4,245,156, 33, 15,236,216,244, 35,185,181, 8,154,162,124, 56, 91, 11,209,167, 93,253,143,140,247, 98,
-231, 61,207, 52, 71,174,189, 44,180,140,224,140, 26,220, 89,217,189, 49,199, 24, 27,131, 49,194,240,228, 15,243, 45, 99, 4,102,
- 77,239,108,101, 99,175,127, 65, 66,101, 9, 88, 56,129,176,241, 1,108,235, 18, 66,255, 17, 72,139,143,160, 63,255,104,116,206,
-243,132,148, 95,157, 44,222,200,204, 31, 30, 60,222, 42, 36, 38, 38,126,188, 96,193,130, 27,237,218,181,115,113,114,114, 66,179,
-102,205,112,234,212, 41,204,153, 51,167,236,156,150, 45, 91,130,227, 56,228,230,230, 98,213,170, 85,233,105,105,105, 31, 87,219,
- 65,143,136,136,222,179,103, 79,231, 38, 77,154, 24, 68, 34, 81, 62, 0, 73,126,126,190, 52, 55, 55,151,208,106,181, 96, 89,150,
-181,181,181,101,210,210,210,140, 35, 71,142,212,221,186,117,171,190, 74,165, 74,124, 29,139,150,151,151, 87,120, 78, 78, 78, 1,
- 65, 16,175, 29,250,161, 84,100, 57, 57, 57,201,139,138,138, 88, 0,121,181, 9,253, 64,211, 52, 90,183,110,141, 11,215, 30,226,
-236,229, 91, 80,166,197, 96,234,196,143,209,172, 89, 51, 92,184,112,161,214,101,214,162, 69, 11,156, 15,190,129, 27, 15, 30, 35,
- 49,246, 9, 62,159, 58, 17, 77,155, 54,197,249,243,231,249, 10,109, 58,206,160,162,111,214,153,151,133, 86,215,160,160,160,210,
-158,249, 43,242,181,177, 19, 90, 8,237,196,127, 44,237, 87,223, 95,216,107, 41, 8,161, 5, 14, 55, 60,223, 97,225, 15, 27,163,
- 41,231,196,209,225,153, 53,207, 14,171,240,208,100, 34,130,187, 27,189,255,113, 84,227,143,222,111,231,133, 29,167,100,139, 1,
- 96, 68,167,122,184,247, 52, 11,119, 99, 51,247, 71,102, 33,226,117,115, 29,224, 12, 25,147,141,253,171,190, 24,212,213,199,211,
- 21, 59,143,223, 0, 65,224,152, 73, 13, 46,199,113,237,154,248, 96,221,158,151,103, 24,186,122,175, 61,164,141,190, 24, 81,216,
- 15, 0,122, 53,150,157,107, 83,223,222,155, 43,239,184, 85, 9, 44,196,130,201,253,134,142,145,210,177,167,128,132, 96, 16,180,
- 14, 26, 3, 11, 69,118, 33,212,182, 94, 8,185,253, 88, 83,160,213,207,140,204,170,157, 21, 47, 42, 27,241,162,251,143,147,138,
- 84, 26, 55,153,188,190,150, 34, 89,182, 72,199,225, 94,100,130, 50, 50, 29, 49,166,112,196,199, 67,255,174, 7,221,105,235,238,
- 67, 75,132, 34,241, 8,138, 0,225,108,103, 41,223,250,211,183,176,182,182, 2,171, 47, 2, 84, 89, 24,242,217, 15, 89,225,105,
-198,122, 0,208,208, 17, 86,157,234, 9,119, 11, 72, 34,229, 74,156, 97, 81, 77,255, 65, 24, 49,101,116,159,150, 66, 86,175,194,
- 23,171, 14, 98,219,188, 65, 24,211,195, 95,120,230,102,236, 20, 0,203,107, 91,214, 28, 67,131, 51,106,240,222,215,215,162, 9,
-224, 6, 7,116,124,112,232,187,198,192, 67,147, 57, 90, 1, 66, 70, 64,248, 55,247,182, 20,177, 41, 55,193,166,220,228, 40,175,
- 14, 32,188, 59, 19,132,107,107,238,151,213,203, 84, 59,118,236,188,200,146,248,198,132, 80, 25, 60,120,252,127, 69,124, 90, 90,
- 90,223,254,253,251, 95,190,112,225,130, 67, 64, 64, 0, 0,224,193,131, 7,197,157,206,214,173,225,231,231,135,140,140, 12,140,
- 26, 53, 42, 91,161, 80,244, 69, 13, 62,191,133,133,133,207,143, 28, 57,226,162, 82,169, 90, 46, 90,180, 40,211,199,199, 71,169,
-213,106,137,252,252,124,150,166,105,216,219,219,139, 91,182,108,137,246,237,219, 23,221,190,125,187, 78,114,114,114, 33,128,132,
-218, 36,126,208,160, 65,184,118,173,120,210,222,155,136,171, 37, 18,137, 16, 16, 16,224, 17, 31, 31,159, 90,210,182,152,253,142,
- 47,223,188, 60,126,252, 24, 87, 31,166, 64,160,215, 64,156,149,134, 59,199,143, 96,224,228,105,160,233,218,123, 49, 60,126,252,
- 24, 39,130,239,192, 82, 34, 64, 76, 76, 4,142, 28, 57,130,169, 83,167,190, 22,103, 45, 81,173, 22,249,151, 67,129, 42,252,180,
- 4, 0, 16, 24, 24,120,181,212, 90, 81, 30,190,190, 16, 75,138,176,180, 87, 43,143,185, 35, 58,214,167,140,202, 52,176, 12, 11,
- 74, 8, 56, 59,217,224,143, 63,246,215,219,127,240,224,237,205,155, 54,111, 96,105,122, 97,120, 38,212,102, 36,106,233, 79, 7,
-111,140,248, 99,118, 87,193,212,126,141, 29, 0, 64, 36, 32,177,254, 84, 4, 13, 96,233,235,228,246, 93, 15, 72,139,140,152,228,
-236,104,187,120,193,167, 3, 28,186,182,246,195,213,187,225,216,112,228,246, 53,113, 38,246,152, 92,185, 89, 35, 94,214, 79,149,
-205, 58, 4, 91,179,223, 37,195,112,174, 34, 75,123, 24, 18,174, 0, 6, 45,180, 58, 3,146,115, 24, 36,231,106, 33,144,137,240,
- 32, 54, 69,227,152,142,160,215,200, 54, 97, 41,147,186, 47,249,126,173,167, 86, 83, 68, 43,243,178,105,145,248,142, 80,102, 33,
- 81,152,227,170,112, 39, 21,218,206,117,133,239, 0, 44, 37,150,114,234,175,191, 28,103,153, 26,121, 1, 13,200, 52, 16, 28, 7,
- 11,255, 1,176,182,160, 68, 29,235, 8,147, 0,192,210, 82, 38, 94,245,205, 28,219,153,243,190,169,209, 7,204, 31, 16,249,249,
-186,206, 12,240,177,199,181,208,104, 92, 11, 75,140,184,246, 32,166,105,183,102,238,240,243,180,155, 33,206,203, 95, 25, 5,243,
- 45,164,197, 5, 67, 3, 70,109,217,172, 67,127,103,124,216,102,196,162,170,102, 27, 86,138,186, 0, 27,203,112, 32, 40, 10, 32,
-200,226, 25,144,201, 55, 33,176,243,229,246, 31, 58,161,222,185,115,207,183, 81,217,188, 21,139, 7,143,154, 80, 80, 80,240, 36,
- 42, 42,170, 79,243,230,205,119,125,241,197, 23,214,163, 71,143,118,159, 56,113, 34, 9, 0, 25, 25, 25,236,186,117,235,210,126,
-249,229,151,130,236,236,236,241, 70,163, 49,204,148, 39, 92,161, 80,220,250,245,215, 95,179,174, 95,191,222,180,109,219,182,146,
-119,222,121,135,181,183,183, 23, 72, 36, 18, 70,175,215,107, 99, 99, 99,153,248,248,120,183,252,252,252,103, 0,226, 80,139, 97,
-253, 18,235,213,114,138,162,150,112, 28, 23,240, 38,124,180,100, 50,153, 59,128,103, 4, 65, 52, 48,119,216,240,149, 6, 91, 32,
- 64, 94, 94, 30,212,233, 17,144,166, 60, 69,115, 75, 18, 77,236,173, 96, 99, 99,243, 90,162,168,160,160, 0, 80,165,226,198,141,
-199, 0, 77,195,214,214, 22,182,182,182,127,187,208,170, 74,139,252, 71, 48,169,146, 99,213,251,104, 53,145, 99,170,133, 30,235,
- 38, 15,168, 47,170,235,237, 9, 93,202, 3, 60, 78, 46,194,194,119,219, 70, 82, 18,107,237,228,143, 7,181, 30, 58,172, 14,186,
-182,111, 67,212,117,179,157,177,242,167, 45,159, 53, 65,246,156,200, 76,172, 55, 37, 69,145, 89,120,206, 34,115,231,149, 39, 41,
- 83, 60,101, 26,176, 44,135, 43, 97, 10,132, 37,228,237,140,206,194,115,115,114,215,196, 13, 61, 5, 32, 15,114, 28, 39,181,181,
-180, 44,108,226,231,233,212,243,189, 22,100,223, 46,173, 33,162,128, 27,247, 30, 99,214, 79,199,238,176, 44, 55,192,228, 25, 98,
- 44,251,138,128, 42,158, 97,104,172, 48,195,144,227, 56,174,120,214, 97,245,110, 95, 20, 69,164,171, 19,239,187, 10, 29, 27, 66,
- 19,119, 5, 9,121, 44, 18, 51, 11,161, 20,184, 66,151,154, 10,112,108,210,213,215,112,172,118,114,114,114,174,215,196,175,254,
-198,221, 71, 96, 80, 23,224,121,200, 46, 20,229, 41,240,221,214, 83,245, 61, 60, 28,187,164,166,166, 94, 53,227,101,227,119, 57,
-104,191, 51, 56,128, 18, 74,112,102,243, 33,100, 59, 90,192, 73, 38, 2,171,201,194,228,153,163,109,251,245, 26,109, 11, 0,137,
- 49,143,224, 35,211,152,196,107,112,196,208, 17,221, 26,217,193,168,193,238,243,143,180, 36,208,119,207,197,136,184,110,141,237,
-164, 35, 58,250,216, 47, 79,203,255, 0, 57,181, 11, 42, 90,106,209, 42,179,240,213, 98,182,225, 17,128,105,204, 34,238,224,173,
- 76,203, 97,189,222,145,137, 4, 4,193, 21,165,130,179,112,194,150,221,135,139,196, 70,108, 7, 15, 30, 60, 76,130, 70,163, 9,
-213,104, 52,205,190,250,234,171, 15,191,254,250,235,206,150,150,150,245, 0, 64,165, 82, 61, 55, 26,141,215, 74,158, 79,115,102,
- 7,114, 0,158,197,197,197, 61,143,139,139,115,217,187,119,175, 29, 0,105,201,111, 90, 0,249, 0, 50,240, 26, 51, 14, 75, 69,
- 21, 65, 16, 75,222,212,125, 40, 21, 85, 4, 65, 52,168,205,245, 36, 73, 50, 4, 65,128, 32, 8, 72, 36, 18, 92,191,126, 29,195,
- 7,244, 66,212,153,124, 4,216, 89,161,237,248,201, 56,120,233, 18, 40,138, 2, 65, 16,160, 40,202,172,118, 68, 32, 16,224,198,
-141, 27, 24, 51,106, 24, 36, 2,192,214,214, 22, 95,125,245, 21, 78,158, 60, 9,129,128, 95,165,207, 12,108, 47, 39,184, 76,140,
-163, 69, 96,249,165, 93, 63,136,192, 24,113,122,215, 26, 4,133, 23,233, 99,178,176,176, 81, 22,214, 29, 65, 33,155,245,211,158,
- 41,151,110,132,255,248,201,200, 64, 89,247,110,189,208,189,107, 55, 65,211, 54, 93, 22, 3, 21,132, 86, 79, 84, 19,107,131, 97,
-241,237,246,243,209,147, 15,134,196, 18, 48, 20, 98,100,239, 54, 28,195,226,219, 26, 50,243, 10,167,173,133,213,193, 27,183,111,
-219,195, 80,132,132, 71,127, 74,235,212,171, 15, 48, 6, 60,123,246, 20,191,236, 62,206,134,220,139,249, 67, 79,227,139,248, 60,
-168, 76,229, 44, 86, 86, 52,108, 45,197,141,250, 54,181, 57,199,130,131,157, 76,212,152, 99, 25,216,201,132,141,123, 53,150,157,
-227, 56,142,179,182, 16, 54,230, 24, 99,141,156, 26, 61,189,109,247,111, 59,215, 78,152, 48,193, 50, 59, 37, 29,105,202,112, 20,
-137, 61, 96,148,121, 33,238,209, 53,141, 90, 71,155,210,136, 87,121, 63,179,179,179, 51, 67,239,230,226,224,214, 21, 48,234,117,
-200, 76, 41,214,170,105,217, 74,216, 56,121,220, 78, 77, 77, 53,153,211, 64,179, 5, 67, 71, 79, 18, 89, 88,195, 98,204,208, 64,
-113, 92,142, 14,173,220,173,139, 95, 26, 69, 89,136, 10,190,129,174, 37, 62,166,241,201, 36,124, 90,184,155,148, 78,107,169,232,
-139,126,239,120,224,121,146, 2,215, 35, 82,119, 63,207, 69, 26, 19,173,216, 29,151,150, 63,101,208,187,222,248,249,100,228,231,
-128,113,191, 57,121,247,119,198,135, 28,135,142,197,206,240, 26,112, 64, 71,127,103,124,104,226, 76,195, 87, 56, 5, 34,124,180,
-246, 92,226,162,195,247,179, 7,205,253,168,147, 77,251,246,253,197,160,245, 40,212,232,140, 81,249, 80,190, 78, 25,189, 6,120,
- 78,158,243,191,202,201, 0,248,195,104, 52,254,145,159,159,255, 38, 57,211,240,106, 92,167,215,202,123,249, 97, 66,142,227, 4,
- 37,214,172,154,156,225,171,229, 44, 63, 76,200,113,220,217, 18,107, 86, 77, 86,173, 10,156, 44,203,166,181,110,221,218, 97,224,
-192,129, 96, 24, 6, 79,159, 62, 69, 98,114, 50,122, 78,249, 28,118,118,118,184,246,228, 9, 98, 98, 98,176,100,201, 18, 24,141,
- 70,156, 56,113, 34,165, 38, 78,129, 64, 96,168, 95,191,190,104,240,224,193,160,105, 26,241,241,241, 72, 77, 77,197,172, 89,179,
- 96,107,107,139,208,208,208, 50,206,236,236,108, 8, 4, 2, 67, 37,214,173,191,162, 46,253,215,241,138,200,170, 94,104, 1, 12,
- 24, 35, 10, 46, 45,197,250,235, 48, 24,140,104, 28,153,133, 23,145,255,179, 72,109,161,238, 62, 57,253, 36, 60,250,121,232,205,
-238, 98,100,134,193,220,158,196,211, 28, 40,172,165,133,133, 48, 20,218, 32,254, 28, 94,100, 20, 22, 61,205,129,194,236, 30, 3,
-203, 16, 48,168, 1,197, 3,220,186,118, 21, 33,119, 30,227,126, 88, 52,115, 43, 52,246, 32,201,226,219,168, 28, 60,173, 69, 47,
- 4, 86, 3,126,198,184,176,103,222,109,252, 92,188,193,208,224, 88, 35,108, 71,238,199,248,200,246,222,109,124,237,188,139, 45,
- 89, 70,216,127,250, 39,176, 86, 90, 45,223,131,100,227,118,241,201, 11, 31, 20,230,231,188,219,163,203,123,150,182,254,253,144,
-253, 44, 22, 79, 31,223,208,132,134,199,221,122,144,108,124, 45,107,137,135,135, 71,231, 30, 93, 26, 97,228,228, 5, 48,168, 11,
- 16, 31,242, 27,138,114,211,113,253,182, 21,162,149,202,247, 0,152,108,209,186,157, 68, 55, 69, 82, 30, 58,212, 17, 38, 89, 67,
-231,250,113,224, 64, 72, 8, 45, 88,157, 18,132, 58, 27,113,169,250,130, 15,182, 38, 51, 0, 32,147, 16, 2, 75,174,192,198, 36,
-203,163,143, 99, 67, 25,101,196,158, 75, 17, 96,217,226,229,155, 88, 22, 91,246,252, 25, 55,229,219, 49,173,208,196,219,190,197,
-163,212, 76, 2,102,152,252, 9, 14,157,238, 31,252,166,177,246,242, 98,128, 53,224,198, 12,135,198,157,214,231,118, 66, 45,151,
-219, 9, 79, 67, 42,128, 41, 16,168,183,205, 88,127,126,113,235, 75,145, 29,103,127, 58,200, 6, 28,191, 0, 59, 15, 30, 60,254,
-126, 20, 21, 21, 77, 30, 63,126,252, 54,161, 80, 40, 7, 64,176, 44, 11,150,101, 5, 63,254,248,163,144, 97, 24,146, 36, 73,134,
-162, 40,250,236,217,179, 70,134, 97,178,180, 90,237,228,154, 56,105,154,142,155, 54,109, 90,253,154,102, 40, 30, 56,112,160, 84,
-100,197,241, 37, 97,146,200, 42,191, 47,179,114, 85,221,120,112,248,166,195,152,165, 75, 1, 16,224,176, 44, 50, 11, 47, 94, 62,
- 37, 44, 23,105, 77, 40,195,172,166,109,186, 44, 45,189,198,220,148,105, 25,102, 88,155,102,126, 7, 0, 64,199, 49, 99,106,147,
- 59,165, 78, 51,162,101,155,247, 14,178, 28, 39,160, 57,110, 39,201,226,168,150, 70,148, 41, 51,237,170, 66, 90,102,126,104,191,
- 0, 91, 14, 40, 30, 50, 44, 27, 46, 44, 9,227,192,113, 28, 87, 54, 92,184, 70,138,236, 2, 93,141,113,160,110,190,208,247,210,
-211,247, 39, 93,188,249,104, 50,195,112,174, 20, 69,164,107,244,244,182,215, 21, 89, 0,144,154,154,122, 53,248, 82,234,197, 39,
- 45, 92,122, 59,201, 74,172, 92,106, 32, 91,141,139,169, 89, 69, 87,107,195,153,167, 50, 14,250,122,221,201, 83, 98, 33, 37, 0,
-199, 21, 7, 20,229, 56,104, 13, 76,238,237, 36,186, 41, 0, 52,115,128,251, 87, 39,232, 3, 20, 69, 36,214,196,119, 55, 70,241,
-243,200,149,193,115, 34, 18,242,118, 38,228, 35, 28, 0, 18,242, 17,126,232,198,139,197,113,233,133,115,194, 19,243,214,192, 76,
-191, 10,142,192,245, 54, 35,151,190,114,236,117,239,103,180, 2,143, 1, 12, 1, 82,122,141,156,253,203,108,130, 0,191,252, 4,
- 15, 30,255,143, 80,106,213, 34, 73,114,249, 27,228, 60, 75, 16, 68,127, 0,207,204,184,236,110, 81, 81, 81,179, 55,156,189, 28,
-154,166,115, 76, 57,241, 31,112,136,255,175,226, 31,115, 45,233,201,115,254,253,156, 13, 26, 52,224,204, 16, 44,252,253,228, 57,
-121, 78,158,243,255, 21, 39,199,113,212,235,108, 85,112, 18,175,179,241,101,244,159,199,203,206,240,147, 74,141, 19,252,112,200,
- 91,136,103,207,158, 17,252, 93,224,193,131, 7,143,202, 65, 16, 4,243, 23,112,242,193,139,121,148, 10,174, 10,214, 45,146,191,
- 39, 60,120,240,224,193,131, 7, 15, 30,111, 68,100,149,223, 23,139,112, 84,109,254, 51,103, 54, 65,109, 76,136,193, 60, 39,207,
-201,115,242,156, 60, 39,207,201,115,254,191,227,172,137,251,173,152,205, 88, 67, 28,243, 55, 6,222, 31,128,231,228, 57,121, 78,
-158,147,231,228, 57,121,206,183, 29, 85,250,104,241, 67,135, 60,120,240,224,193,131, 7, 15, 30,127, 17,120,103,120, 30, 60,120,
-240,224,193,131, 7,143,215, 67,141,139, 74,243,224,193,131, 7, 15, 30, 60,120,240,168, 29,170, 95, 84,154, 7, 15, 30, 60,120,
-240,224,193,131, 71,173, 97,254,162,210, 60,120,240,224,193,131, 7, 15, 30, 60, 76,194,118,254, 22,240,224,193,131, 7, 15, 30,
- 60,120,252, 61,168, 56,235, 48, 40, 40,136, 43,191,231,193,131, 7, 15, 30, 60,120,240,248, 59,241,182,106, 17,126,232,144, 7,
- 15, 30, 60,120,240,224,193,227,245, 48,137, 23, 90, 60,120,240,224,193,131, 7, 15, 30,127, 13,170,244,209, 42, 13, 88,218,181,
-196, 84,215,149,191, 87, 60,120,240,224,193,131, 7,143,127, 0,111,183, 22,225,253,179,120,240,224,193,131, 7, 15, 30,188, 22,
-121, 51, 40,117,134,231,193,131, 7, 15, 30, 60,120,240,224,241,122,224,215, 58,228,193,131, 7, 15, 30, 60,120,240,248,155, 5,
-215, 95, 46,180,248,149,205,121, 78,158,147,231,228, 57,121, 78,158,147,231,252,255, 36,178, 42,136, 45,126,214, 33, 15, 30, 60,
-120,240,224,193,131,199,235,161,198, 89,135, 60,120,240,224,193,131, 7, 15, 30, 60,106,135, 73, 0, 2, 75, 62, 7,162,156, 85,
-139,183,104,241,224,193,131, 7, 15, 30, 60,120,188, 30,182, 3,112, 43, 17, 88,103, 0, 40,120,161,197,131, 7, 15, 30, 60,120,
-240,224,241,102, 80,222, 47,107, 64, 57,241,197, 11, 45, 30, 60,120,240,224,193,131, 7,143,215, 68,149, 62, 90, 4,170,158, 57,
- 16,108,198, 31,212,102,246, 65, 48,207,201,115,242,156, 60, 39,207,201,115,242,156,255,239, 56,107,226, 14,198,127, 15,175,132,
-117,224, 56,110,251,223,241,199,252,212, 87,158,147,231,228, 57,121, 78,158,147,231,228, 57,255,223,225, 47, 11, 88,218, 10,176,
-224,111,239, 91, 9,151,146,141, 7, 15, 30, 60,120,240,224, 81, 61,254,154, 89,135,254,192,167,163, 3,228, 91,141,225, 89, 54,
-225,128,186,186,115,229,114,249, 54,153, 76, 54, 90,173, 86,171, 8,130, 96,203, 43, 64, 0,229, 23, 7,138,207,202,202,234, 84,
-211,127,139,197,226,117, 46, 46, 46,159, 22, 21, 21,169, 9,130,224, 8,130, 0, 65, 16, 0,240,202,158, 97,152,148,156,156,156,
-214,255,113,169, 76, 57,185,184,220, 19, 82,148,135,185,151, 50, 44,251, 34, 51, 35,227, 61, 51, 46, 89, 65, 16,152, 91,252,183,
- 88, 13, 96,193, 91,215,243, 0, 40, 83,206, 11, 0,172, 99,129,145, 12, 73,126, 46, 4, 54,233, 88,118, 43, 0, 16, 0, 83,219,
-255,214,221, 69,125,130, 67, 11,130,128, 45,199,161,128, 35,240, 88,210, 14,113,255,208,173, 24, 42, 20, 10, 7,217,216,216, 88,
-229,228,228, 92, 5,112, 0,192, 40, 71, 71,199, 46, 74,165,178,200,104, 52,158, 4,112,172, 54,196,157, 90, 96,158, 88, 36,252,
- 68,107, 48,174,186,249, 24,191,117,105, 5, 71,154,197, 74,169, 72,208, 73,167,167, 87,223,120,130,157,102, 82, 18, 37, 91,233,
- 59,195,236, 69,197, 14,155, 88,238, 0,112,194,222,222, 79, 34,183,185, 44, 20, 83, 47,242, 51,138, 70, 15,203,204, 76, 30,254,
- 26,229,254,111,132,147,147,211, 56,146, 36,191,231, 56, 14, 12,195, 44,204,205,205,221,245,134,168, 23, 2,176, 43,249,156, 15,
-224,251,215,228, 75, 4,224, 93,242, 57, 9,128, 15,223,174,215, 26, 91,142, 31, 63, 62,165, 91,183,110,248,249,231,159,177,101,
-203,150,132,172,172,172,149, 0,118, 3,208,255, 3, 60, 60,170, 66, 19,160,255,143,125,218, 49,198,223,191,101,203, 29,238, 89,
-197,195,252,235,199, 31,127,108,224, 56,142,139,137,137,225,244,122, 61,103, 52, 26, 57,154,166, 57,154,166, 57,163,209, 88,182,
-121,120,120,164,190,116,249, 43,156, 36, 73,174,255,224,131, 15, 10, 57,142,227, 30, 60,120,192,105, 52, 26, 78,167,211,113,122,
-189,158,211,106,181,156, 70,163,169,176,185,184,184,100, 84,199,105, 99, 99,243,192,222,222, 62,195,222,222, 62,195,193,193, 33,
-195,193,193, 33,195,209,209,177,108,115,114,114, 42,219,228,114,121,134, 92, 46,207,112,112,112,120, 80, 83, 58, 75,208, 7,192,
- 85, 19,182, 62,149, 92,219,179,188,208,114,115,115,203,224,106, 1, 79, 79,207,100, 19,210, 89, 10, 23,130, 0, 83,122, 45, 65,
-128,149, 72, 36,222,229,127,199,171,150,174, 26, 77,202,238,238,238, 31,184,185,185, 5,187,185,185, 93,114,119,119,255,192,132,
- 42, 86,129,211,218,218,250,129,147,147, 83,134,171,171,107,102,233,230,230,230, 86, 97,115,119,119, 47,219, 92, 92, 92, 50,236,
-237,237,171, 44, 35, 14,160,170,218, 66, 0,129, 4,232, 46,160,168, 32, 23, 23, 23,101, 88, 88, 24,195,113, 28, 71,146,100,106,
-233, 57,230,228,253,101,145,165,190,129,133,217, 87, 36,119,139, 94,172, 44,200,190, 34,185,171,190,129,133,186,187,168, 95, 91,
- 78, 19, 81, 25,231,216,177, 99,199, 62,206,200,200, 72,205,207,207, 87,108,221,186, 53, 86, 42,149,222,216,186,117,107,108,126,
-126,190, 34, 35, 35, 35,117,236,216,177,143, 1, 76, 51,131, 19, 0,240, 94, 11,188, 59, 97,168,155,250,241,137, 49,234,238,109,
- 4,143, 58, 4, 32,176,215,123,162,212,141,243,253,213,215,118,116, 84,119,123,135, 12, 55,147,147, 16, 8, 4,237,189,189,189,
- 63,145,203,229, 31,151,108, 99, 74, 55, 87, 87,215, 49,174,174,174, 99,236,237,237,135, 87,199,121, 24,160, 76,217,188,164,210,
-246,195,235,121,171, 19,151, 47,227,194,102,126,206,125,226,235,165, 28,230,236, 92,231, 31, 40,163,191,148,211,217,217, 57,205,
-104, 52,114, 6,131,129,115,116,116, 76,123,131,233, 92,195,113,220, 26,142,227,214, 0, 88,243, 6, 56,203,222,103,102, 8,236,
-234, 56,165, 2,146,156, 45, 19,139, 47, 73, 4,130, 76,137, 64,144, 41, 19,139, 47, 9, 72,114, 14, 0,233,191,169,140,254, 2,
- 78, 43,185, 92,254,124,221,186,117,156, 90,173,230,212,106, 53,183,110,221, 58, 78, 46,151, 63, 7, 96,101, 6,103,109,121,222,
- 38, 11, 86,133,173,116,232,240,141, 88,180,252,129,214,221, 91, 52, 56, 58, 99,220, 72,176, 71,214, 17, 53,244,152,126,125,175,
-117,235, 79,118,239,222, 13, 0, 24, 61,104, 16,122,183,109, 11,107, 43, 75,136,197,197,201, 33, 56, 2, 34,161, 8,131,103,125,
-105,202,223,175, 30, 60,120,240, 71, 71,142, 28,177, 2,128, 45, 91,182, 96,232,208,161,112,112,112,128, 76, 38,131, 72, 36,130,
- 80, 40,172,176,175, 9, 20, 69,121,166,166,166, 58, 75,165,210, 50, 43, 27,203,178, 21,182,242,171,114,211, 52,141,134, 13, 27,
-154,122,187,230, 23, 20, 20,116, 86,169, 84,101, 28,149,109,245,234,213, 3,128, 11,166, 16,126,255,221,183, 96,105, 21, 4, 2,
-128,166, 1,157,129, 4,203, 85, 42,110, 48,109,218,180,215, 90, 77,124,192,128, 64,130, 32,136, 35,161,161,161, 71, 51, 51, 51,
-235,178, 44, 51,177,150,150,174,207,158, 62,125,106, 5, 0,126,126,126,211, 0, 28, 53, 39, 29, 2,129,192,243,201,147, 39,206,
- 18,137,164, 74,203,101, 57, 11, 38, 12, 6, 3, 90,181,106, 69,155,243, 31, 46,128,119, 46, 73, 78,108,249,206, 59,147,150, 14,
- 30, 44,189,119,239,158,148, 36, 73,208, 52,141, 31,127,252,145,230, 56,206,174, 9, 96, 19, 9, 40,171,161,249, 26,192,184,146,
-198, 96, 39,128, 31, 43,168, 5, 14, 45, 52, 70, 73, 96,124,209,224,182,237,234,204, 67,100, 68, 88, 91, 95,171, 19,176, 22,232,
-226,128,191,215,170,101, 99, 99, 51,232,231,159,127,150,239,220,185, 83, 25, 19, 19, 99,216,186,117,171,124,242,228,201,214, 6,
-131, 1, 83,166, 76,201,106,212,168,145,232,231,159,127,150, 31, 59,118,172,187, 74,165,218,108, 86,121, 17,248,118,212,160,222,
-208, 26, 73, 24,141,180,220, 77,110,253,199,140,177, 93,133, 28,167,199,158,147,161, 48,210,236,111,102, 90,178,222, 27, 54,108,
-152,239,254,253,251, 5,209,209,209,130,198,141, 27,131,101, 89, 48, 12, 3,163,209, 8, 0, 96, 89, 22, 13, 26, 52,120,237,251,
-242, 9,224,231,228,226,112,233,189,254,253, 44,220,164, 18, 56,228,101, 97,130, 72, 96,189, 75,166,219, 11,160,253, 91,101,217,
-229, 56, 8, 4, 2, 36, 39, 39,195,217,217,217,130,101, 89, 5,128,101,121,121,121,219,241,246,162,173, 88, 32, 56,186,231,183,
-245,174,237,218,183,167, 92,220,156, 17,251, 52, 9, 2,130,233,249,228,126,104,215, 79,166,206,158,161,167,233, 15, 0,220,123,
-219, 50,238,218,126,218, 16,130,164,182, 16, 28,139,111, 54,158, 42, 92,177,122,157,108,202,196,177,212,172, 89,179,224,229,229,
- 85,119,200,144, 33,171, 1, 76,173,145,167,221,180, 33,160,200, 45,224, 56, 44,253,229, 84,225, 15,171,215,201,166,214,130,231,
- 63,142, 42,159,145,215, 22, 90,254,128,111, 83, 47,231,139, 43,230, 78, 21,114,231,126, 39,213, 57,153, 85,158, 43,151,203,183,
-245,237,219,119,244,174, 93,255,179, 70,191, 23, 16,128, 33,221, 59,194,217,209, 22, 50, 75,113,113,115,196, 18,120, 28,243,194,
- 36, 65,224,229,229, 53,229,232,209,163, 86,229,197,132, 72, 36, 42,219,202,139,172,210,173,180, 1,174, 14, 82,169, 20,193,193,
-193, 16, 8, 4,160, 40, 10, 2,129,160,108, 43,255,157,162, 40,184,184,152,229,186,180,210,214,214,182,121, 97, 97,161, 77,126,
-126, 62,188,189,189,149, 0,158,148,251,189,121, 86, 86,150,141, 57,132, 44,173,194,172, 9,254, 16,234,239, 64, 47,108, 11,141,
-160, 3,110,221,143, 66,208,133,171, 72, 77, 75, 71,199,119, 91,226,227, 15,135,225,210,165, 75, 96, 24,179, 71, 58, 50, 56, 14,
-171, 7, 14, 12,156, 7, 16, 68,207,158, 61,243,167, 79,159, 78, 70, 71, 71,127, 52,100,200,224,128,167, 79,159,149, 88, 21,137,
-185, 28,135,245, 0, 50, 76,228, 21, 3,192,181,107,215, 0, 64, 82,155,186, 39,145, 72,112,251,246,109,148, 14, 19,147, 36, 9,
-146, 36, 65, 81, 20, 78, 63,115,130, 74, 79, 66,157, 17,142,207, 3,189, 81,175, 94, 61,144,100,205, 46,137, 93, 1,233, 45, 96,
- 8, 33, 20,206,114,115,119,175,219,197,215, 87, 22, 28, 28, 76, 1,128,143,143, 15,167, 80, 40,242, 79,158, 60, 89, 40, 0,182,
-248,112,220,238,234, 68,150,151,151, 87,135,212,212,212,239, 75,239, 57, 65, 16,171,235,212,169,179,164,172,220, 88, 22,203,126,
- 83, 9,103,204,152, 41,106,215,117, 17, 0,160,221,192,253, 80,198,175,240, 39,114,191,182,253,187,223, 18, 74,165,242, 96,131,
- 6, 13,168,156,156,156, 91, 0, 18,141, 70,227,252, 63,254,248,195,121,194,132, 9,153,123,247,238, 93, 9,192,125,213,170, 85,
- 93, 85, 42,213, 33,115,120, 59, 54, 71,255,119,154, 7,188,235,237,229,133,171,183,238, 65, 36, 22,218, 77, 27, 23, 8, 43, 43,
- 1,214,236, 60,195, 38,166,228, 78,191,241, 4,187,205, 16, 89,109,135, 13, 27, 86,119,255,254,253, 98, 0,120,242,228, 9,210,
-211,211, 33,151,203, 97, 97, 97, 1,161, 80, 8,138,162, 32, 20, 10,223,136,200,178,245,114,188,123,226,196, 73, 11, 7, 7, 59,
-108,252,114, 6, 62,206,204,128,157,181, 21,140, 69,170,186,111, 89, 67,225,215,169, 83, 39, 41,195, 48, 80,169, 84, 8, 9, 9,
-177,181,176,176,176,245,244,244, 92, 90, 93, 35, 82,201,187, 51, 67,171,213, 58,151,124,206,212,106,181, 46, 0,148, 18,137,164,
-244, 61, 93, 84,178, 55,117, 56, 49, 17,175, 14, 19, 38, 17, 4, 81,254, 88,109,209,166,109,155,230,193,199,142,236,179, 42, 40,
- 76,135,157,125, 38, 72, 20, 96,251,246, 77,176,176,176,193,210,165, 95, 11, 94,244,236,238,209,167,255, 7,193, 17, 81,177, 61,
-223, 58,177,197, 17,219,123, 14, 28,237, 96, 33,179, 46,105, 75,140,216,181, 99, 6, 72,146,196,146, 37, 75,208,180,105,211, 73,
- 17, 17, 17,139, 0,228, 86, 79,131,237,205, 58,143,112, 16, 75,139,139,152,101,140,216,122, 96, 78, 49,207,130,201, 24, 53,176,
-222,164,175,134, 61, 63,223,212, 23,133, 37, 29,115,141,144, 68, 18,209, 14,101,130, 33, 40, 40,168, 75, 96, 96,224,213,170,190,
-255, 7,224,134,255,197,207,170, 32,190, 4, 65, 65, 65, 92, 96, 96, 32, 81, 46,115, 21,190, 87,135, 22,128,147,189,173, 44,120,
-203,178, 25, 86,130, 59,103, 40, 77,210, 51,164,105, 43, 52,228, 21,166,104,202,100,178,209,187,118,237,170, 96, 82,242,118,113,
-134, 72, 36,132, 80, 68,192,174, 83,113,244,250,252,235, 65, 32,136, 42, 69, 86, 5, 78,149, 74,165,125,244,232,145,213,206,157,
- 59,225,236,236,140,186,117,235, 66, 38,147, 65, 42,149, 86, 16, 87,229, 5, 87, 37, 66,171, 2,103,233,239, 2,129, 0, 36, 73,
-226,210,165, 75,160,105, 26,195,134, 13,123, 69,100, 9, 4,130,170,132, 91, 85,211, 83, 47, 0,120,194,113, 92,231,146, 6,248,
- 9,128, 46,229,126,239, 35,151,203,231, 3, 88,105, 42, 39, 69,113,160,180,183,192,122,174,131, 32,121, 6,244,194, 22,184,114,
- 35, 20,187,182,253, 12, 0,168,219,184, 13,134, 15, 9, 44,179,198,153,152,206, 50,120,120,120, 28,200,202,202,238,215,189,123,
-119,228,229,229, 25,151, 45, 91,134,230,205,155,195,207,207,207,164, 50,170,162,231,156,241,228,201, 19, 47,141, 70, 3,142,227,
- 76, 17,103,175,112, 18, 4,129, 63,254,248, 3, 90,173,246,149,147,237,187,252,128, 57, 67,125, 48,254,243,221, 88, 29,115, 8,
-155, 55,111,174, 54,239, 50,160,185,214,182,193,122, 49, 69, 55, 95,249,245,103,146,143, 63,254,152, 26, 63,126, 60,146,146,146,
- 48, 97,194, 4,237,165, 75,151,244,233, 10,197, 73, 49,203,110, 52, 84, 20,198, 85,114, 74, 36,146, 61, 23, 46, 92,192,161, 67,
-197,186, 36, 54, 54, 22, 13, 27, 54,180,172, 32,146,115, 15,163, 48,113, 35,238,158,142, 70,187,129,251,113,247,244,135, 96,242,
-207, 8, 91, 55, 68,129, 57,247,179, 22,168,140,243, 80, 78, 78, 78,153,136,218,187,119,175,197,222,189,123, 7, 3, 56, 5,224,
- 16, 0,228,230,230,254,100, 38, 39, 64, 96,252,136,161,131, 33, 16, 89, 35,250, 89, 10,186,188,215, 10, 46,206,206,120, 18, 21,
-135,196,212,220, 12,130,192,184, 62,237,197, 43, 53, 26,253,162,235,143,241,107, 13,156,132,167,167,167,223,225,195,135, 69,229,
- 44,208,101,207, 56, 69, 81,101,223, 75,133,119,109,234,103,169,200,178,246,180,186,251,237,166, 14,150,119,195,246,162,161, 79,
-127,216,247, 15,196,175, 23, 47,226,105, 68,164, 86,175,166,123,252, 3,101,244, 87,113,250, 13, 29, 58,244,214,190,125,251,236,
-146,147,147,113,237,218, 53,212,173, 91, 23,106,181,218,148, 14,111, 5, 78,173, 86,235, 92,122, 13, 65, 16,206,165,134,119,189,
- 94, 95, 90, 24,165, 15,162, 93,185,243,236,170,225,244, 46,119, 94,169,184,242,121, 3,121, 23, 75, 69,162,195, 39,142, 29,176,
-138,140,190,134,150, 45,222,133,149,109, 19,176, 76, 58,114,114,139,144,247, 44, 13,223,125,183, 26, 75,151, 45,196,169,227, 71,
-172, 26,249,183, 56,170,167,233, 6, 0,180,111, 77,185, 19,220,164,224,211,123,183, 16, 28, 11, 77, 70,180, 68,168,122, 46, 27,
-253,225, 7,212,200,145, 35,113,234,212, 41, 68, 68, 68,108,169, 70,100, 5,151,179,204, 79, 10,191,118,104, 11, 56, 14,154,204,
-104,137, 72,243, 92, 54,246,163,225,212,199,163,122,227,206,159,235,209,187,229,243,112,119,103, 12,201, 43,145,216, 2, 10, 57,
- 18, 41,110,114,119,113,167,156,216, 10, 1, 64,148, 19, 88, 33,248,159, 15,230,127, 1, 3, 74,132,213,164,151, 59, 38,130,218,
- 8, 44, 0,104, 8, 88, 17, 98,209,221, 93, 75, 63,115,151, 37, 69, 8,116,225,183,145,166, 99,185,173, 9, 52,219, 10,176,120,
- 8,104, 94,190, 70,173, 86,171,226,226,226, 44,198, 13, 25,130,246, 1, 1,112,115,116, 68, 3, 79, 79, 88, 72,196, 16,139,132,
- 21,186,172, 38,143, 33, 16, 4,215,168, 81, 35, 12, 28, 56, 16, 66,161, 16, 50,153, 12, 86, 86, 86, 16,139,197,149, 90,179, 76,
-237,229,114, 28, 7,138,162, 16, 30, 30,142,196,196, 68,216,217,217,225,230,205,155,232,209,163,199, 43, 86,173,242,226,204, 28,
- 19,125, 37, 13,127,169, 16,187, 96, 14, 23,195, 16, 40,226, 90, 64,154, 48, 29,106,162, 21,116, 58, 26, 58,157, 14,191,222, 48,
-224, 94,156, 10, 6,131, 30, 58,157,174,186,255,172, 10,164,187,187,251,232, 6, 13, 26, 76,251,240,195, 15,141, 98,177, 24, 42,
-149, 10,106,181, 26, 17, 17, 17,198,126,253,250,231, 15, 28, 24,104,123,230,204, 25,174,100,232, 48,195, 12,238, 28, 15, 15, 15,
-175,146,225,217,156,218,212,106,130, 32,202, 68,204,203, 24,247, 83, 36, 4, 84,113,153,108,217,178, 5, 12,195,128,227,184, 42,
- 11, 73, 75, 16,151,151,253,176,214,118,213,186,223, 96,235,224,130,171, 87,175, 50,231,207,159, 47, 36,128,216,167, 17, 17, 63,
-189, 15,156, 61, 12, 24,204, 73, 95, 94, 94,158, 69,221,186,117,225,233,233, 9,150,101, 97, 52, 26,203,172, 47, 57, 57, 57,208,
-104, 52,112,176,204, 71,125, 71, 79,208,133, 33, 80,132,127, 3, 55,171,104,236,190,160, 55,190,227,135,199,255,130, 23,199,239,
- 37,219,107,246,154,225,225,236,234, 5,146, 51, 34, 45, 51, 7,131, 7,244, 6, 37,178,194,139,228,108,180,104,226,235,246,209,
-251, 29,220, 40,130,198,220,149,251,167, 1,236,175, 53,209, 21, 21, 21, 49,209,209,209,120,242,164, 88,239,218,216,216,192,210,
-210,178,194, 51, 78,146,228,107, 89,180, 74, 69,214, 15, 91,122, 88,146, 66, 21,148, 76, 48,118,254, 17,138, 22,141, 2,177,245,
-238,125, 45,147,145,219,115,141, 86, 27,123,224, 63,108,204,112,117,117,157,204,178,236, 82,142,227,242, 59,118,236,232,178,127,
-255,126,251,212,212, 84,132,134,134, 98,201,146, 37, 89, 12,195,208, 28,199, 17, 28,199,125,243, 6,254,142, 45, 39,176,222, 36,
-132, 50, 41, 62,119,178, 33, 6, 9, 72,155,186,180,178,232, 69,182,158, 59,169,166,217, 95, 0, 24,171,125,185,145,228,167, 71,
- 14,110,113,119,146,179,232, 42,239, 14, 69,134, 1, 63,124, 57, 22, 57, 57,133,248,117,199, 10, 0, 98, 24,104, 10,157,187,126,
- 0,103,103, 15, 76,154, 56,201,117,203,182,173,159,209, 44,187, 6,111, 9,210,111,109, 62, 14, 32, 88, 46,151, 71,124, 54,105,
-146,188,110,221, 49,144, 74,165, 56,112,224, 0,246,111,220,200,172, 3,134, 75,128, 43, 83,128,227,213,242,220,253, 31,207,140,
- 41, 83,228,254,254, 83, 32,145, 72,240,231,249,223,161, 77,255,163,112, 64,123, 24,212, 90, 12,168, 51,144,115, 72, 56, 77,228,
- 10,133,120, 6, 0, 66, 41, 20, 0, 94, 30, 6,251,175, 9,172, 82,156,193,255,102, 26, 78,170, 96,209,170,245,187, 83, 40, 14,
-219, 49,115,148,143, 11,116,132,254,198,105,164,234, 88,102,213, 83, 3,245,176,128,155, 19, 85,137,200, 42,169,216,172,183,183,
- 55,186,183,110,141, 33,157, 58, 65, 32, 16, 64, 42, 22,193, 90,106, 1,142, 41,182,100,149, 14, 29, 86,211, 38,162, 50,235,147,
-163,163, 35, 68, 34, 81,153,192, 50,195,154, 85, 41, 39,203,178, 16, 8, 4,120,242,228, 9, 58,118,236, 8, 47, 47, 47, 28, 58,
-116, 8,125,250,244,121,101, 40,209, 92,145, 85, 42,180, 94, 26,198,235, 3,160,212,146,101,150,208,210,234, 9,100,235, 91,128,
- 32, 2, 64,211, 0,195, 1, 58,173, 22, 28, 7,112, 28, 96, 52,232,161,213,106,203,254,211,148, 33, 89, 87, 87, 87,111, 11, 11,
-139,229,243,230,205,245,111,209,162, 37,178,178,178,192,178, 44, 44, 45, 45,161, 86,171, 97, 99, 99,131,246,237,219,191, 88,190,
-124,185,130,227, 48,201, 76,145,245,218, 40,189,231, 23, 47, 94,172, 48,108, 88,186,169, 20, 41, 24,255,197, 94,136, 5,197, 67,
- 75,165, 62, 60,213,189,119,187,117,238,128, 91, 15, 99,233, 79,231,174,215, 9,115, 66, 87,186,178,236,174,148,215,200, 23,199,
-113,200,206,206, 70, 70, 70, 6, 6, 13, 30,140,253,251,246, 33, 33, 33, 1, 77,154, 52, 65,183,110,221,224,236,236,140,132,132,
- 4,220,187,174,131, 46, 47, 23,185,250, 80,200,172,219,225,196,213, 56,221,146, 45,134,184,127,240,133, 49, 8,192, 88, 27, 27,
-155,122,106,181, 90, 65,211,244, 97, 0,135, 1, 12, 23, 8, 4,195,101, 50,153,155, 82,169,124,142,226,217, 68, 39,107, 34,179,
-144, 74, 29, 37, 82, 27,176,180, 14, 2,129, 0, 94, 94,117,193, 49,122,228, 41, 53, 24, 55,114, 32, 30, 62,137,194,249, 43,119,
-104,163,145,221, 96,202,109,165, 40,138,243,243,243, 67,102,102, 38,132, 66, 33, 44, 44, 44, 96,101,101,133, 5, 11, 22, 96,227,
-198,141,101, 34,171,182, 66,235, 19,192,207,198,219,234,206,247,155,138, 69, 86,122,154, 2, 25, 41, 66,200, 29, 93,176, 97,227,
- 58, 85, 94, 66,122,187,223,128,216,255,122, 35,203,178,236, 55,169,169,169,206, 2,129,192,149,166,105, 36, 39, 39,227,193,131,
- 7,152, 62,125,122, 70, 78, 78, 78, 87,212, 50,143, 82,169, 52,179,212,146, 85, 50,116, 88,213,112, 98,126, 57, 75, 86,126, 53,
-148, 85, 13, 19,250,214,245,180,190,180,227,231, 89,222,109,218,181, 39,101, 2,155,188,162,103,233, 29,111, 92,187,218,126,250,
-207,191,126,150,152, 87,212, 27, 64,124, 85,164, 18,161,176,223,187, 29, 58, 8,192,101, 64, 32,238,136,213,171, 70, 34, 43, 91,
-137,188,220, 66,136, 68,150,208, 27, 41, 48, 44,129,246, 29, 59,225,247,221, 7,209,116,226, 4, 74, 44, 20,246,162,245,250,183,
- 70,104,149, 96,197, 47,191,252,226,221,168, 81, 35,236,218,181, 11, 87,246,236,193,199, 5, 5,184, 74,146,148, 81, 40,116, 58,
-107, 52,110, 71, 13, 66,171, 60, 79,211,166, 77,241,219,111,191,225,143, 63,254, 72, 26,221, 35,243,232,172,209,112, 54, 24,208,
- 55, 52, 6, 14,117, 6, 2,161, 49,112,120,167, 17, 26,208, 2, 60, 35,136,138,225,160,130,130,130,186,148,223,255,199,160, 64,
- 21, 67,236, 2, 0, 93,131,130,130,184,242,251, 26, 95,156,242,134, 83, 86,244,174,231, 19, 80,223,155, 48, 30, 90,143,100, 21,
-173, 95, 20, 99, 16, 63, 45,226,102, 69, 1,235,170,233, 65,112, 20, 69,193,218,194, 2,114, 59,187, 98, 51, 63, 73, 2, 44,192,
- 26, 1,130, 41, 22, 0, 28, 75,128, 99,204,122, 97, 64, 44, 22, 87,234,248,110,174,111, 86,121,206,194,194, 66,188,120,241, 2,
-147, 38, 77,130, 76, 38, 43, 86,238,233,233,240,241,241,129, 64, 32, 64,106,106, 42,254,252,243, 79,212,171, 87, 15, 18,137,196,
- 44,181, 85,206,186,212, 28,197,179, 12,155, 43, 20, 10, 27, 55, 55, 55,152,109,209, 98, 57,168,117, 4,244,122, 6, 79,159, 62,
- 69, 90, 90, 26, 94, 60,127,134, 54, 42, 37, 56, 80,224, 56,206, 44,139,150,135,135, 71,128,175,175,239,214,149, 43, 87,138, 60,
- 61, 61,193,113, 28,236,237,237,160, 86,171,145,157,157,131, 38, 77,154,192,203,203, 11, 43, 87,174, 4,128,253,127,183,200,122,
-169, 78,149, 9,173,242,130,235,139,247,189,145,155,107, 5,138, 34,203,132,115, 13, 62, 90, 34, 0,232,218,123,168,224,210,249,
-179,150, 52,176, 60,157,162,150, 11,106, 46, 71, 35,195,178,178,170,126, 79, 78, 78,134, 80, 40,196,145,195,135,145,155,145,129,
- 22, 45, 90,160,109,219,182,120,246,236, 25, 30, 62,124, 8, 71, 71, 71,200, 61,223,195,213,231, 6, 68,166,105, 96,107,107,139,
-184, 20,242,159, 12, 25, 48,177,103,207,158, 75,126,250,233, 39,103, 87, 87, 87, 97, 86, 86, 86,163, 77,155, 54,181,216,180,105,
-211,140,207, 62,251,204,229,179,207, 62,179,151,203,229,130,244,244,116,191, 47,191,252,242,157,224,224,224,122, 0,214, 86, 71,
-104,105,105,237, 64,137, 44, 65, 16, 2,216,217,218, 67, 32,182, 4, 75, 11,192,176,128,141,173, 28,183, 30, 30,193,205,176,194,
-201,153, 57, 56,108,146,125,172,164,220, 29, 29, 29, 95,177, 84, 79,159, 62, 29, 59,118,236, 40, 27, 70,172,173,200,250, 97, 83,
- 15, 43,162, 68,100,165, 39, 11, 64,232,234,225,244,241,219,249,121, 9,233, 29,223, 6,145, 85,250,142,227, 56, 14,207,159, 63,
-135, 90,173,198,245,235,215,241,205, 55,223,100,189, 44,178,156,157,157, 39,218,216,216, 44, 43, 42, 42, 90,157,158,158,190,190,
-198,142, 95,177,136, 42,253, 92,186,175,116, 56,209,196,164,250, 84,102,201,242,114,147, 94,120,120,125,175,143, 45,247,152, 64,
-226, 36,224,169, 50,194,250,174,115,231,254,109, 6,144,173, 54,127, 91,167,237,228, 5, 23,146,149,218, 70, 85, 89,182, 88,134,
-105,101,105,101, 13, 32, 19,161, 15, 66,202, 68, 86, 78,110, 1,116, 6, 10, 58, 61, 1,173,129, 68,247,158,125,177,113,235, 31,
- 72,205,204, 5,195, 48,205,222, 50,145,229, 16, 16, 16, 48,101,248,240,225, 88,190,124, 57,130,127,250, 73, 63,149, 32,148, 2,
-128, 59,195, 48, 96, 57,142, 32, 77,115, 98,175,192,179,102,205,154,227, 0, 70,173,156,142,247,242,138, 48,206,125, 32,231, 80,
-103, 96,241,137,195,230,113, 0,224,144, 21, 92,177,201, 12, 12, 12, 36, 74, 71,214,204, 29, 97,251,183, 67, 16, 24, 24,120, 53,
- 40, 40, 8,229,247,213, 93, 96,237,210,168,255, 87,179,167,173,106,211,167, 19,161,152,221, 11,185, 74, 45,253,117,164, 65,156,
-162,169, 94,100,149,199, 87,155, 54,225, 97,108,241,115,236,233,236,140,185, 31,125, 4,142, 6,110, 70, 68,226, 96,112, 48, 70,
-246,236, 9, 75,169,212,100,203, 6,203,178,149, 90,177,202, 91,179,204,181, 58,229,231,231,227,240,225,195,104,219,182, 45,100,
- 50, 25, 4, 2, 1,154, 55,111,142,168,168, 40,248,250,250,130, 32, 8,156, 56,113, 2, 67,134, 12, 65,124,124, 60,222,123,239,
- 61,171,196,196, 68,179,133, 86,100,100,164, 13,199,113,157, 75,173, 31,181,133, 78,167, 67,116,116, 52, 6, 14, 28, 8,123,123,
-123,120,120,236, 71,240,133,189,144, 5,124, 12,130,128, 89, 66,139, 97,152, 79, 6, 12, 24, 32, 34, 8, 2, 26,141, 26, 82,169,
- 5, 44, 45,173, 96,109,109, 3, 63,191, 70, 72, 75, 75, 67,159, 62,125,244,113,113,113,155, 21, 10,197, 33,115,211,234,239,239,
-111,153,144,144,240,113,157, 58,117,196, 0, 96, 97, 97,209,196,215,215,119, 78,124,124,124,161,185, 86,173, 82,129, 69, 16, 4,
- 40,138, 42, 19, 90, 2,146,132,155,171,115,217,247, 18,255, 52,162, 26, 46,101,106,142, 78, 2, 0,222,222,222,216,184,237, 20,
- 57, 96,192, 0,204,152, 49, 3, 70,163, 17,155, 55, 23, 79,178,251,240,195, 15, 97, 48, 24,112,244,104,241, 36, 73,129, 64, 80,
-173,217,228,193,131, 7, 8, 13, 13,133,209,104, 68, 65, 65, 1,206,157, 59,135,171,215,174,225,192,137,203, 72,120,254, 12,205,
- 27,249, 96,194,132, 79, 32, 20, 10,177,123,247,110,116,236,216,241, 31,125, 33, 8,133,194,209, 59,118,236,112,219,181,107, 87,
-254,137, 19, 39, 84,239,190,251,174,100,221,186,117,206, 27, 55,110,148,235,245,122,204,156, 57, 51,243,206,157, 59,186,193,131,
- 7, 91,110,223,190,221,173,126,253,250,189,104,154,174, 76,104, 89, 2, 24, 9, 96, 76, 94,161, 94,144, 95,168, 1, 75,235,241,
- 60,225, 5, 10,138,244, 96, 25, 3,146, 82,210, 80,164,101,144,147, 91,136,230,173,122,255, 18, 18, 18,178,208, 96, 48,124, 13,
- 32,168,166,116, 70, 68, 68,224,206,157, 59, 72, 72, 72,192,243,231,207, 43, 42,197,137, 19,241,199, 31,127,152,109,209,170, 92,
-100, 81, 32,116,190, 8, 58,113, 55, 63,243,153,226,173, 17, 89, 37,239,160,165,110,110,110, 75,221,220,220,164, 23, 47, 94,180,
-173, 83,167, 14,104,154,214,191,108,201,234,218,181,235,162, 29, 59,118,184,249,250,250, 78, 7,176,254,223,144,118,146,196,196,
-213, 91,166, 56, 89,139,147,210,240,116,109, 73, 44, 65, 10, 80, 43,129,144,125, 16,116, 88,252, 98,250,224,121,246,243,119, 45,
-159,200,130,173,114,134,108, 92,124, 50,182,108,217,136, 89, 51,199,225,247, 95, 87,131,101, 5,208, 25, 41,120,215,125, 23, 58,
- 3, 11,130, 20,160, 69,171,214,184, 18,114, 29, 66, 18, 56,188,107,203, 91,166,179,144, 27, 30, 30,190,249,196,137, 19,159,207,
-152, 49, 3, 44,203,138,151,109,217,162,201,202,202, 90, 1,243,226, 95,189,204, 51,100,203,150, 45,177,243, 55,102, 29,159, 53,
- 26, 84,194,105, 34, 55, 52, 6, 14,195,230,113, 56,178,138,192, 59,141,144, 43,171,188,137,191,246,210,254,237, 16, 90,165, 74,
-178,252,190, 50,180,106, 88,239, 91, 91, 7,251, 79, 72,107, 15,167,185, 51,166, 10,226,211,181, 56, 90,231,163,162, 63,247,108,
-176, 76,167, 37,191,196, 65,187,206,156, 63, 62,248,231,159,101,159,127,220,191,191,210,223, 20,195,134,153,220, 51,171,202,138,
-101,174, 37, 11, 0,100, 50,153, 93,175, 94,189,208,163, 71, 15,124,240,193, 7,101, 62, 89, 45, 91,182,196,129, 3, 7, 48,116,
-232, 80, 60,122,244, 8,110,110,110,104,220,184, 49, 26, 55,110,140,179,103,207,154,251,146, 3,195, 48, 8, 8, 8, 40,157,117,
-216, 60, 37, 37,197,166,182, 5,169,211,233,144,147,147, 3, 7, 7, 7,136,197, 98,180,107,215, 22,159,127,209, 14, 78,110,191,
- 33,192,191, 17, 84, 42, 85,217,244,119, 19, 26,219,128, 6, 13, 26, 32, 43, 43, 11, 89, 89, 89,144,203,229,112,119,119,135,171,
-171, 43,214,174, 93,203,173, 95,191,254,188,193, 96,216,156,157,157,109,182, 37,203,213,213,181, 19, 65, 16,139, 52, 26,141,184,
- 92, 15, 87, 44,151,203, 79,106, 52,154, 21, 10,133,194,100, 71, 80,130, 32, 96, 48, 24, 64, 16, 4,206, 60,119,135, 74, 79, 64,
-153, 18,138, 25,239,251, 84, 16, 94, 66,161,176,198,225, 82,142,227, 84,163, 70,141,114,246,242,242, 68,114, 92, 4,142, 28,225,
-240,211, 79, 63,149,206,138, 68,108, 73,199,160,244,123,183,110,221, 80,183,110, 93,112,102,196,202, 96, 89, 22, 79,158, 60,193,
-254,147, 87,225,230,227,143,164,167,209,120,120,246, 52,234,200, 29,208,180, 85,107, 24,141,198,215, 10,189,241, 38, 96, 52, 26,
-119, 54,108,216,144,211,235,245, 87, 1,108, 12, 11, 11, 27,167, 80, 40,102,158, 58,117,202,125,248,240,225,105,167, 79,159, 94,
- 7, 96, 87, 88, 88,216,148,239,190,251,174, 7, 77,211,149,206, 22,164, 40,234,247, 47,191,252,178,235,240,225,195, 9, 17,105,
-212, 95,188,176, 91, 64,211, 70,226,171,175,119, 50, 33, 55,174,146, 52,109, 36, 62, 24,245, 37,123,246,207, 48,114,242, 23, 63,
- 50, 45,223, 29,128,240,240,112,215,192,192,192,239,140, 70, 99,181, 66,171,212, 82, 85,149,133,146,162, 40,140, 27, 55, 14, 7,
- 14,152,238, 65, 53, 1,240,181,241,177,186,243,195,166,158, 86,132,160,168,156,200,170,143,160, 19,119,243, 51,158,166,189, 85,
- 34, 11, 0,114,114,114,182, 1,216,198,178,108,134,165,165, 37, 10, 11, 11, 43,171,127,210,176,176, 48,169, 88, 44, 70,239,222,
-189, 29,130,131,131, 99, 73,146, 92,159,150,150, 86,165,226,168,108,152,176,178,225, 68,188,198,172, 67,123, 57, 2,219,117,106,
-101, 29, 99,187,220, 90, 42,208, 62,170, 19, 43,181, 33, 0, 20,232, 92,158,223, 74, 28,169, 36, 50, 37, 45, 91,119,123, 7, 54,
- 2,203,192,124,186,176, 82,161, 69, 82,212,195,130,188,252,126,202, 66, 61,110,220, 12,199,168,145, 13,160, 51, 16, 96, 89, 18,
- 69, 42, 29, 64, 9, 65, 2,248,240,163,177,224, 8, 1,114, 51,210, 64, 81, 84, 24,104, 26,111, 25, 22, 76,153, 50,165,223,215,
- 95,127, 93,111,238,220,185,152, 59,119,174,207,142, 29, 59,182,253,240,195, 15,115,179,178,178,154,161,134,224,227,213,240,212,
- 57,125, 96,241,236,147,215,183, 22, 12,104,175,121,250, 78,163, 98,203,215, 59,141,144, 43, 20,226,153,128, 66, 14,199, 85,116,
- 51, 10, 12, 12,236, 82,126,255, 31,195,203, 78,240,101,223, 77,242,209,106, 80,207,163,111,171,150, 1, 95, 44,252,122,161,117,
-212,173, 16,204,255,118, 35,215,176,117,175,194,109,215, 31,234,139, 44,235,246, 43,202,126,118,211, 84,125, 1, 0,125,187, 15,
- 69,243, 38,109, 95,249,177, 99,183,226, 96,237, 55,174, 60, 64, 70, 86,170,201,141,109,137, 56,168,212, 39,203,148, 41,253, 47,
- 67,163,209,228,135,135,135, 59,167,164,164, 84,112,124,175, 91,183, 46, 8,130,192,221,187,119,113,231,206, 29,140, 26, 53, 10,
- 2,129, 0, 66,161, 16, 87,175, 94, 53,203, 26, 83,206,186,244, 4,197,179, 14,251,120,122,122, 86, 53,219,176, 70, 46,141, 70,
-131,130,130, 2, 92,184,112, 1, 13, 26, 52,192, 15, 63,252, 0,119, 55, 23, 44, 92, 56, 27, 44,203, 66,169, 84,130, 97, 24, 83,
- 45, 90,108,169,181,136,101, 89,100,101,101,161, 94,189,122,216,180,105, 19,214,173, 91,247,157, 66,161, 56,101,110, 26,189,188,
-188,236, 24,134,249,106,192,128, 1,189, 6, 15, 30,140, 62,125, 42,198, 99,221,183,111,159,245,209,163, 71, 87,108,216,176,161,
-175,193, 96, 88,153,153,153,153,101, 10,239,111,191, 21,135, 95,146,189,187, 20,243,135,215,193,152,105,187,177,118,237, 49, 72,
- 36,146, 10, 13,239,242,229,203,171, 21, 49, 44,199, 53, 20,101,223, 74,155, 61,111,141,243,138, 21,193, 8, 14,206, 4, 73,146,
-112,115,115, 3, 73,146,120,241,226, 5, 72,146,132,143,143, 15, 72,146, 68,106,106,106,169, 79, 96, 30, 42,153,245, 88,121, 47,
-156,132, 86,171, 69,114, 82, 2, 82,226, 98, 97,165, 76,135,220, 70,134,188,136, 39,104, 62, 97, 98, 89,252,167,127, 24,127,232,
-245,250, 63,202,125, 95,115,250,244,105, 61, 65, 16, 31,160,216, 79,163,212,162,241, 29, 77,211,223, 85, 69,242,238,187,239,182,
-252,250,235,175,133,165,225, 54,220,189,191,167, 13, 6, 3, 11, 0,141,154,119,174,160,246,159, 61,123,134,181,107,215, 66,165,
- 82, 65, 36, 18,137, 76,185, 15, 44,203,150,205, 48,172, 76,132,153, 35,178, 0,192,209,199,243,151,187,161, 87,153,199,113, 91,
- 53, 97, 49,231, 44, 20, 73, 36, 72,253,219, 43,178, 94,182,108,121,122,122, 46,101, 89,150,227, 56,110,113,185,159, 36,222,222,
-222,215, 47, 94,188,232, 72,211, 52, 54,108,216, 96,151,158,158,110,215,185,115,231,249, 0,170, 20, 90,149, 13, 19, 86, 54,156,
-136,114,179, 14, 37, 18,137,131, 94, 95,165,241,228,149, 89,135, 12, 3, 63, 27,107, 59,228, 33, 5, 58, 39, 99,203,124, 71, 58,
-247,146, 98,226, 35,247,196, 86, 77, 44, 25, 99, 61, 82,169,135,135,204, 14, 44,199, 85, 57, 53, 90,103, 52,158,123, 20,250,176,
-183,183, 87, 3,234, 84,208, 53, 12, 26, 50, 28, 58, 29, 9,173,145, 0, 65, 9, 65, 80, 34, 52,107,222, 10,141,155, 54, 7, 7,
-224,193,189, 91,180,222,104,188,244, 54,149,189, 91,135,207, 71, 17, 4,214,131, 99,185, 74,226,104,213, 27, 50,100,200, 10, 0,
- 95,212,196,227,252,238,231,163, 72,178,152,167,124, 28,173, 47, 63,159,130,136,123, 66,219,107,161,171, 68,125,222,197,153,172,
- 96, 2, 50,233,255,102, 29, 10,201,215, 10,205,241, 95, 17, 92, 53, 11, 45, 47, 47, 47, 59, 27,137,244,183,207, 38,124, 98,157,
-248,248, 54,210, 35,239,226,230,181,216,188,131, 71,143,229,170,114, 50, 39,152, 33,178,202,134,249, 28, 93,235,160,174,255,171,
- 66, 75,106, 37, 7, 0,212,245,111, 11,202,210,214,220, 33,143, 87,172, 89,181, 17, 89,229, 95,216,149,197,208,154, 60,121, 50,
-118,236,216,129, 14, 29, 58,160, 97,195,134,101, 47,123,115,173,102,149, 88,151,204,158,109, 88, 30,133,133,133,240,241,241,193,
-246,237,219, 17, 22, 22, 6,107,107,107,140, 26, 53, 10,133,133,133,101, 2,203, 84,103,120,142,227,158, 93,188,120,177,205,136,
- 17, 35, 56,161, 80, 72,228,231,231,195,206,206, 14,155, 54,109, 82, 41, 20,138, 51,181, 16, 89,195, 69, 34,209,236,145, 35, 71,
- 82,141, 26, 53, 66, 70, 70, 6,108,108,108,140, 4, 65, 8, 1,192,206,206,206,104, 97, 97,129, 41, 83,166,160, 69,139, 22,157,
-230,206,157,219, 65, 32, 16,108, 74, 75, 75,219, 93, 93, 93, 34, 8,162,172, 65,157,176, 62, 26,122,125,113, 3,189,121,243,102,
-148,248,186,253,111,136, 32, 46, 14, 48, 97, 38,139,149,149, 21, 26, 54,108, 88,105,217,119,234,212, 9, 15, 30, 60, 40, 30,154,
- 20, 8,224,236,236,140,155, 55,111,154, 52,147,170, 52, 16,100,120,120, 56,252,235, 58, 33, 44,248, 34,156,100, 66,180,112,119,
-133,103,167, 46,136,141,141,253, 39,173, 89, 4,138,253, 48,122,150,212,193,157, 0, 38,151,251,190, 9,192, 47,230, 16,210, 52,
-205,145, 36, 73, 36, 39, 39, 27,100, 50, 25,225,224,224, 32,144, 72, 36,208,233,116,101,130,235,217,179,103, 8, 10, 10, 66, 74,
- 74, 10, 28, 28, 28, 72, 91, 91, 91, 24, 12,134, 60, 83,248,253,252,252,224,234,234, 90,193,241,125,194,132, 9,181, 18, 89,227,
-128,128, 29,223,175,172, 35, 33, 41, 91,127,167,190,120, 30,253, 66, 75,234, 33,253,255, 32,178, 0, 32, 63, 63,127, 27,128,109,
-165,223,157,156,156,198, 83, 20,181, 80,167,211,217, 94,189,122,213, 78, 46,151, 19,187,119,239, 54, 46, 94,188, 56,159,162,168,
- 60,130, 32,126,254,231,197, 33, 34,179, 11,226,124,132,246,238,236, 99, 45,119,107,102,242,252,198,121,194, 6,114,162,105, 0,
-134,100, 70,221, 24, 79,199,181,207, 80,164,147, 28,216,200,106,222,193, 59,231,127,189,252,171,216,232,135,222, 82, 27, 41, 38,
- 79,249, 26,103,206, 95, 1, 65, 10,113,253,214, 93,232, 13, 12,178,115, 11, 48,242,195,209,240,116,115, 66,228,157, 11, 89, 52,
-203,110,122,187, 68, 54,187,177,247,160,241,246, 18, 11, 89,201, 61, 97,240,199,175,179, 65,146,235,177,100,201, 18, 4, 4, 4,
- 76, 11, 15, 15,255, 6, 53,196,209, 34, 8,118, 99,179, 46, 31,218,139, 36,197, 60, 28,203, 96,251,225,249, 37,113,180,102, 97,
-211,182,163,205,154,214,125,190,172,186, 56, 90,111,145,200, 42,191,175, 94,104,249,248,248, 72, 44,133,152, 36,164, 4,115, 63,
-251,104,176, 60, 51, 46, 2, 41, 81, 15,139,135, 23, 12, 26, 67,250,211, 40, 83, 66,161,247, 68,197,248, 29, 92,117, 67, 87, 90,
-173, 73, 61,250, 10,156,165, 13,238,203,214, 44, 51, 69,214, 43,156,229,197, 86,249,184, 89, 94, 94, 94, 88,177, 98,133, 41,113,
-180, 94,206,123, 41,250,160,216, 1,190,188, 51,124, 31, 19, 69, 86,165,156,114,185, 28, 57, 57,197, 17, 18,186,118,237,138,174,
- 93,255, 55,159,193, 96, 48,148, 89,177,172,173,173, 43,179,104,189,194,105, 97, 97, 49,255,216,177, 99,159,220,186,117,107,196,
-156, 57,115,132, 61,122,244, 40, 21,115,106,152,182,182, 91, 5, 78,134, 97,166, 92,184,112,129, 98, 89, 22,219,183,111,199,131,
- 7, 15, 56,153, 76,182, 72, 38,147,109,180,176,176, 96, 52, 26,205,228,137, 19, 39,142, 94,182,108, 25,217,169, 83, 39,220,190,
-125,155,172, 87,175,222, 88,160, 66, 16,203, 74,243,126,247,238, 93,144, 36, 9, 58, 55, 9,211,230, 31,132,165,133, 0,209,209,
-209,200,205,205,125, 37,136,169, 41,247,179,188,165,164,116,235,212,169, 83,217, 48,100,187,118,237, 64, 81, 20, 30, 61,122, 84,
-213, 48,108,121, 78,206,209,209,177,172,126,136, 68, 34, 92,185,114, 5,223,126,251, 45,188, 29,236,144, 23, 21, 6,215,174,221,
-209,235,147,137, 24, 53,106, 20, 40,138,130,131,131, 67,153,229,215,132,186,244, 58, 40,207,249,137,191,191,255,216,200,200, 72,
-207,102,205,154,185,133,135,135,119, 11, 8, 8,240, 9, 11, 11, 43,253, 46,129,105,190, 57,101,156,247,239,223, 63,178,113,227,
-198, 41,227,198,141, 19,177, 44,203, 36, 38, 38, 26, 1, 16,174,174,174,212,253,251,247,217, 83,167, 78, 65,163,209,192,211,211,
-147,244,240,240, 32, 46, 93,186,196, 70, 69, 69,221,229, 56,238,107, 83,242,206, 48, 76,133, 48, 14,165,159,247,237,219,103,246,
-243, 94,167,177,223, 15, 61, 58, 55,242,202, 78,123, 4, 69,106, 28,152, 2,185, 33,232,196,105,157,153, 34,235,175, 46,163,191,
-147,115,249,211,167, 79, 61,116, 58, 29,196, 98, 49, 54,111,222,108, 88,177, 98, 69,100,118,118,118, 71, 84, 62,163,188, 2,103,
- 45,103, 29,230, 86,195,249,202,172,195,130, 28,156, 57,113,242,126, 27,171, 33, 59, 49, 45, 45,171,204,177,145, 35, 8,135, 99,
- 46, 77, 58,202,218, 54, 75, 37,207, 46, 37, 11, 25,245,153,106,242,174,215,232,245,195,135, 12,253,240,242,129, 3,251,173, 22,
- 47, 93,138,155,119,195,144,147, 95, 4,150,163,192, 18, 4, 22, 46, 92, 12, 87, 39, 7, 40,211,158,170,117, 6,195, 16, 84,140,
-161,245,159, 47,119,130, 32,167, 95, 58,181,123, 61, 73,128, 85,101,196, 72,168,194, 56,217,152, 81, 67, 4,195,135, 15,199,177,
- 99,199, 16, 30, 30,190,181, 26,145, 85,198,201,113,228,244,176,171, 7,215, 19, 0,171,201,138,145, 8,138,158,203,198,126, 52,
- 68, 48,106,212, 40, 28, 15,186,133, 3,167,159,111, 57,112, 26,167,241,118,195,252,200,240,214, 2,132,119,108,226,235,209,169,
- 85, 83,169,128,209, 32, 37, 42, 14,185, 42, 45, 46, 69, 36,230,147, 28, 89,235,216, 58,197, 47, 72, 17,146,146,158, 86,210,179,
-146,150, 52,232, 90,179, 56, 73,146,172, 96,205,122, 29, 75, 86,249,116,186,184,184, 84, 88,206,165,124,195, 93,234, 3, 84,139,
-208, 14,243,147,146,146,108,146,146,146,192,113, 28,238,222,189,107,211,174, 93,187,249,175, 99,205,154, 61,123,118,153,213,234,
-229,125,101,199,106, 66,137, 83,250, 58,163,209,120,120,238,220,185,211,218,181,107,215,123,233,210,165, 4,204, 88,128,247, 37,
-107, 14,205,178, 44, 66, 66, 66,112,236,216, 49,198, 96, 48, 76, 82, 40, 20, 97,229, 78,217, 16, 26, 26,122,105,232,208,161,187,
- 99, 98, 98,168,200,200, 72,112, 92,205,243, 78, 53, 26, 13, 26, 54,108, 8,154,166,177,106,154, 23, 10, 11,155,129,166,105, 48,
- 12, 3, 75, 75,203, 50, 43, 94,121,241, 92, 83, 61, 98, 24,230, 21,161,117,247,238, 93, 80, 20,133,142, 29, 59,226,225,195,135,
-101, 22,173,154, 44, 80, 6,131, 33,201,197,197,197,101,249,242,229,101,233,202,202,202,194,197,139, 23,241,238,123,237,209,100,
-210,100,164,165,165,225,231,159,127,134,187,187, 59,126,248,225, 7,228,230,230,130,166,233,191,219,156,222, 47, 50, 50,210,243,
-163,143, 62,202, 12, 11, 11,243, 12, 10, 10,178, 11, 12, 12,180,252,240,195, 15, 51,195,194,194, 60, 9,130,104, 15, 51,157,160,
- 89,150, 93,176,112,225,194,243, 63,252,240,195,252, 47,190,248,162,221,184,113,227,132, 66,161,144, 77, 77, 77,165,247,239,223,
- 79, 52,108,216,144, 20,137, 68,196,133, 11, 23,216,123,247,238,221,161,105,122, 21,128,235,230, 88,156,203,139, 44,138,162, 76,
- 21, 89, 21, 48,211, 89, 50,214,154,204,234,184,113,243, 10,178, 81, 93, 79,195,158,253, 23,147,175,223,126, 26, 79,233,232,153,
-191, 85, 19, 26,224,109, 6, 69, 81,135,252,253,253,199, 79,159, 62,221,162, 79,159, 62,146,101,203,150, 21, 20, 22, 22, 86, 37,
-178, 42,233, 48,255, 45,179, 14,127, 93, 48, 39,104,230,151,205,198,251,126,234, 90, 7,193,170, 76,228, 9, 40,210,198,142, 68,
- 43, 31, 10,133,217,207,228,167, 47,239,122, 1,160,166,184,108,247, 67,159,132,247,108,218,172,229,209, 85, 63,172,114, 94, 52,
-111,174,240,104,208, 57,112,180, 1,119,175, 94,133,149,136,225,162, 66,131, 51,116, 6,253, 96,188,133, 75,240, 40,110,254,114,
- 0,192, 73, 7, 7,135,199,159,140, 27,215,208,223,255, 67,200,100, 50, 28, 57,114, 4,127,108,216,192,172, 3, 70, 72,128,135,
- 83,106,136,167,151,121,167,140,231,209,196, 79, 62,241,107,213,234, 83,200,100, 50, 28, 62,124, 24,187,215,173, 51,153,231, 63,
-142,210,200,240,103,240,191, 8,241, 53,248,104,145, 68,225,157,167,137, 69,119,159, 38, 22,129,229, 56,150,227,116, 36,137,100,
-149,193,240,195,211,231,169,181, 18, 5,165, 67,135,223,125, 63,253,205,141,121,148, 19, 63,181,157,210, 93,137,200, 74, 41,191,
- 70, 90,249, 70,186,170,207, 70,163, 49,197, 68,250,149,222,222,222,175, 28,171,189,233,151, 51, 75,100,153, 26, 71, 11, 0,114,
-114,114, 20, 0, 22,221,190,125,123, 95,239,222,189, 39, 2, 72,173,101, 25,109,239,210,165,203, 36, 0, 20, 65, 16, 91,211,210,
-210,194, 94,121,224, 21,138, 88,119,119,247, 31,235,214,173, 59,185,184, 99, 74,108,175,161, 33,127,222,172, 89, 51, 67,101,101,
- 81,213,119,150,101,107, 44,163,252,252,124,180,109,219,246,149, 53, 45, 57,142, 67, 98, 98, 98,169,197,169,236,222, 87, 39,224,
-138,138,138, 38,127,254,249,231,219,132, 66,161, 55, 0,162, 84,228, 50, 12, 67,253,242,203, 47, 82,134, 97, 40, 0, 4, 73,146,
-180, 80, 40,212, 30, 59,118,140,166,105, 58, 73,167,211, 77,254,155, 95, 16,135,137,226,165, 24, 84,145,145,145,141, 74, 44, 89,
- 41,225,225,225,143, 14, 28, 56, 32, 7,112,176,150,188,215,213,106,245,245, 21, 43, 86,116,218,188,121,243,130,201,147, 39,183,
- 29, 53,106,148,160,107,215,174, 56,115,230, 12, 19, 18, 18,114, 87,163,209,172, 52, 71, 96,149,148,101,129,151,151, 87,153,224,
-170,225, 89,174,214,145,215,209, 71,178,113,244, 84,119,233,246,149, 23,139,178,211,244,183,140, 69,250,175,119, 1,225,248,127,
-140,140,140,140, 57, 0, 22,255,252,243,207,105, 45, 90,180,144,136, 68, 34,189,169, 34,235,111, 4,205,230, 23,245,255,169,215,
-176,147, 93, 22,126, 94,183, 87,183,142, 50,175, 58,206, 30, 81,113, 25,120,118,251,140,234,241,233,239, 19, 56, 93,222, 32, 0,
-166,120,174,223,211, 25, 12, 13,102,207,157, 61, 77, 44, 20,246,102, 24,166,121,143, 75, 39, 56,138,162,194,244, 70,227,165,146,
-225, 66,237, 91, 92,228,223,253,248,227,143, 13,253,253,253,113,228,200, 17, 92,218,187, 23, 35,179,179,113,133,162, 40, 82, 36,
-114, 60,109, 48,172,129,105, 2,233,187,181,107,215,250, 5, 4, 4,224,208,161, 67,184,176,123, 55, 70,212,142,167,170,182,174,
- 13, 0,121,201,215,108, 0, 49, 0,222, 1, 96, 1, 64,135,226,165,157,156,202, 55, 97, 37,191,149,254,126,141, 32,136,191,210,
- 17,182,230,200,240, 47, 35,252, 89,194, 59,111, 58, 21, 26,141, 38,183, 97,195,134,102,205,185, 54, 26,141,213,142,225,210, 52,
-157,226,235,235,107,178,213,194, 20, 81,148,155,155,219,250, 47, 44,140,215,242,197,170,208,136,176,108,130,155,155, 27, 91,218,
-232, 87, 38,194, 42, 59,198, 1, 47,204,249,159,244,244,244, 24, 0, 95,214, 54,157,105,105,105, 71, 97,194,162,209,166,158, 7,
- 0,121,121,121,111,124, 49, 95,130,227, 82,151, 45, 91,102,150,192, 6,199, 85, 39, 62,195,138,138,138,218,153,242,223, 6,131,
- 1,255, 32, 14,149,108,100,120,120,248, 68,130, 32,250,160,120, 72, 96, 43,222, 76, 52,239,235, 74,165,242,250,234,213,171, 59,
-109,223,190,125, 38,199,113, 80, 42,149,235,204, 21, 88,101,189,231,204,204, 51,111, 42,227,185, 25,250, 63,247,111, 77,233,174,
-201, 55,204,220, 81,164,223, 13, 30,101,198, 40,142,227,126, 31, 51,102,204,187, 0,118,189, 46, 89, 21,179, 14, 95, 23, 47,216,
-188,130, 22, 87,102,127,251,201, 21, 59,235, 1, 96, 4,141,160, 39, 79, 67,159,115, 6,192,111, 48,205,205,161, 44,191, 52,203,
-174,165,245,250,181,229, 26,151,255, 15,229,236, 16, 16, 16, 48,115,252,248,241, 88,188,120, 49, 46,172, 89, 99,152, 74, 16, 5,
- 66,128, 59, 95,220,209, 36, 9, 96,158,169, 60, 99,199,142,197,226,197,139,113,118,213,170,218,242, 84, 7, 57, 65, 16, 65, 0,
- 48,127,254,252,175, 87,172, 88, 97,191, 96,193,130,230, 43, 87,174,252,161,228,123, 68,233,239, 37,109, 93,224,130, 5, 11,154,
-150,251,189, 16,192,253,191,248,126, 86, 26, 25,254,175, 70, 79,158,147,231,228, 57,121, 78,158,147,231,228, 57,121,206,215, 1,
-199,113, 3,138,119, 85,239,171,250, 92,110,143,191, 57,205,197, 19,161,248,142, 27, 15, 30, 60,120,240,224,193,227,191,136,242,
- 86,172,218,252,254, 6, 81,234,163, 85, 30,219,129,226,105,221, 85,169, 82,115,102, 61,212, 70,217, 6,243,156, 60, 39,207,201,
-115,242,156, 60, 39,207,249,255,142,179, 38,238, 87,174,231, 56,110, 0, 65, 16, 65, 28,199, 5, 86,181, 47, 21, 86, 47,127, 46,
-183,127, 99,110, 7,149,160,212, 55,171,204, 71,235,239, 10,217,195,155, 85,121, 78,158,147,231,228, 57,121, 78,158,147,231,124,
- 45,148, 14, 1, 2,224,230,207,159,191,224, 95, 56,116,232, 86, 34,178,202,182, 26,135, 14, 57,238, 48,149,154, 10, 27,177, 88,
- 38, 2, 0,189, 94,109,240,240,128,146, 32,134,255,147, 11,222,242,248,111,162,116,186,119,198, 27, 62,151, 7, 15, 30, 60,120,
-252,255, 64, 86,169,165, 10, 64, 22, 0,162,228,187,190,100,159, 85, 34,200, 94,254, 92,225,247,191, 16, 10, 84,225,252, 46,168,
- 74,100,101,103,203,156, 4,130, 60, 63,134,209, 54, 6, 0,129,128,140,206,206,182,143,229,184,195,217,181, 17, 91, 78,206,206,
-161, 66,138,242, 48,229, 92, 35,195,164,102,103,100, 84, 12, 29, 79, 16,111,131,192, 51, 85, 68,188,142,216,248,203,133,138,147,
-147,147,139,139,139,203,251, 54, 54, 54,239,229,231,231,223,203,202,202, 58, 94,205,186,135, 43, 8, 2,115,139,235, 21, 86, 3,
- 88, 80, 13,181, 57,231,190,140,134, 50,153,108, 26, 65, 16, 1, 37, 15, 88,184, 90,173,222, 12,224,233,255,195, 23,146, 5,128,
-193, 2,129, 96,172,147,147, 83,219,244,244,244,101, 0,106, 27,205, 91, 0, 96,182,157,157,221, 72, 59, 59, 59,223,220,220,220,
-120,165, 82,121, 8,192, 90, 0, 53, 78,149, 94,246,133,219,123, 93,251,116, 93, 20,114, 33,228,187,101, 27, 20,183, 95,249,125,
-182,155, 99,239, 94, 29, 22,135,156,190,181,252,235, 77,105,185,102,166,141, 44,217,128,226,217,145, 28, 94, 13,246,250,186, 16,
- 2, 24, 8,160, 43,128, 16, 0,167, 77,201,119, 21,120, 23,192,215, 37,105, 94, 11,224,202,191,188, 30, 89,186,184,184,172, 2,
- 48, 80, 32, 16, 68,166,166,166, 78, 2,144,242, 15,167, 73, 0,160, 13,128, 0, 20,135,225,184, 15,211, 66, 56,212, 8, 71, 71,
-199, 64,129, 64, 48,173, 36,180,203,230,156,156,156,160,127,107,193,136,197,226,117,174,174,174,159,106, 52, 26, 53, 65, 16, 92,
-249,120,143, 52, 77,167,100,103,103,183,126,219, 94,106, 4, 65,220,255,151, 39,113, 82, 37,199,170,142,163,149,154, 10, 27,129,
- 32,207, 47, 51, 61,108,100,154,226,201, 8, 0,112,119,107,126,200,217,181,217,193,212, 84,177,193,181,209, 16, 43,161, 76,176,
-153,162,132, 45,181,122,157,147, 80, 32,204, 54,208,198, 71,164,158,155,150, 30,115,188,210, 96,139, 66,138,242, 72,136,189,226,
- 76, 27,114, 33,148,186, 67,104,225, 93,101,106,221,221,221,107,149, 75,123,123, 95,107,131, 68, 58, 83, 40,164,122,177, 28, 29,
-192,177, 0, 73, 8,195,105,198,120, 89,164,211,253,148,151, 23, 95, 88,219, 59,216,200, 17,174, 28, 48, 10, 4,122,129,195, 37,
- 2, 56, 16,147,131,116, 51, 40, 76, 21, 17,175, 35, 54,202, 95,251, 51,128, 57,111,186, 38,121,120,120,216, 7, 6, 6,174,251,
-246,219,111, 45,172,172,172,136,164,164,164, 62,243,230,205,235,252,224,193,131, 47, 83, 83, 83,211, 94, 22,125, 4,129,185, 44,
-203,145, 0, 64,146,196, 60,185,220, 89, 70, 81,212, 43,177,141, 24,134,145,101,101,101, 78,103, 89,142, 40, 57,119, 46,199, 97,
-189, 41,130, 81, 42,149,126, 24,208,172,229,151,171,126, 92,107,229,226,236,108, 73, 51,172,225, 69, 98,130,108,209,252, 57,237,
-226,158, 61, 93,175,213,106,247,215,230,185,166, 40,106,164, 68, 34, 9, 4,224, 95,114, 44, 74,167,211, 5, 49, 12,115,208,212,
- 6,221,197,197,229, 26, 69, 81,117,204,249, 99,134, 97,146, 50, 50, 50, 58,214,178,136,134,123,123,123,255,214,165, 75, 23, 89,
-219,182,109, 33, 22,139,177,120,241,226,217, 10,133,162, 38,161, 37, 0, 48, 91, 38,147,141,180,180,180,244, 45, 42, 42,138,211,
-104, 52, 71,197, 98,113,207,245,235,215,123,117,232,208,193, 58, 35, 35,131,160, 40,202,229,236,217,179, 31,175, 91,183,174, 15,
- 77,211, 61,106,106,228, 10,226,184, 69,146,129,254,157, 10,226,174, 44, 2,208,239,229,223,105,173,116, 44, 71,121, 5,106,184,
-135,201, 37,226,195,100,145, 37, 20, 10,215,187,186,186,142,215, 22,199, 10,224, 94,110,112, 0, 64,175,215,231,229,231,231, 55,
-170,205, 35, 15, 96,130,157,157,221,248,175,190,250,202,190, 95,191,126,216,187,119,239,103, 59,118,236,200, 83, 42,149,191,163,
- 56, 16,102,140,153,156,115,211,211,211,251, 11,133, 66,194,203,203,139,210,104, 52,230, 8, 45, 63, 20, 47,194,124, 31,192,102,
- 20,135, 46,232, 6, 20, 63,239, 0, 86,151, 10, 55,146, 36, 55, 55,106,212,232,253,168,168,168, 45, 0,190,171,237,179,238,234,
-234,186,109,211,166, 77, 35, 6, 13, 26, 68,101,101,101,121,180,104,209, 98, 95,122,122,122,167, 55,240, 26,249, 68, 34,145,204,
-106,222,188,121,147,152,152,152, 88,165, 82,185,182,228,126, 86,247, 76,121, 2,232,105,103,103,215, 99,225,194,133, 86,129,129,
-129,216,190,125,123,255, 29, 59,118, 20, 21, 22, 22, 94, 70,177, 79,207,107,137, 64,129, 64, 48, 45, 37, 37,197,137,227, 56,184,
-185,185, 77, 3,240,175, 20, 90, 36, 73,174, 31, 58,116,232,248,125,251,246,201, 18, 18, 18,100, 30, 30, 30,101,193,179, 9,130,
-168,117,251,201,227,181,177,189,156,224,170, 57,142,150, 88, 44, 19, 49,140,182,113,154,226,201,136,206, 93,126,177, 5,128,107,
- 87, 63, 31,225,236,218, 52, 92, 44,150,197, 74,108,164,199,134, 14,236,217,114, 88, 96, 23,194,211,205, 25, 41,138, 76,151, 95,
- 15, 92,232, 27,116,225,202, 49, 20, 7, 16,171, 20,180, 33, 23, 22,134, 96,196,220,216, 0,167,174,105,216,120, 54, 5,183, 31,
-191,128,186, 32, 27,117, 92, 45,240,227,204,222,112,181,151,213,174,235,229,220,176, 27, 45,144, 28,252,232,195, 49,182,239, 15,
-246, 23,250,184,186,130,227, 36,136,141, 43,106,127,238,226,149, 54, 71, 15,239,159,102, 41,108, 56, 82,149,249,212,228,151, 91,
- 43, 55, 88,168, 12, 24, 44,160,136,143, 59,180,110,210,227,195,254,157,200, 38,254, 13, 16, 25, 17,213,251,228,159,119,127, 36,
-111, 69, 92,166, 25,110,143,165, 8, 39, 30, 42,170, 13,232,247,138,224,232,209,163,103, 39,137, 68, 82, 33,120,146, 78,167, 19,
- 93,190, 28,252,110,109,196, 70,233,127,232,245, 58, 82, 40, 20,131, 36,137, 47, 3, 2,154,249,103,103,103, 95, 33, 8,226,183,
-180, 52,243,172, 5,159, 3,226, 60,129,224, 29, 82, 34,113, 99,244,122, 71, 0, 32,196,226,188, 23, 36,217,108,225,215, 95, 91,
- 81, 20,197,230,228,228, 64,173, 86, 19, 19, 39, 78,148,198,197,197, 13, 77, 77, 77,221, 80, 67,143, 4, 59,118,236,240,115,115,
-115,123,101,245, 88,133, 66, 33, 30, 52,232,253,218, 20,189, 95,243, 22,173,102, 93,184,112,222, 95,153,155,167,221,241,243,182,
- 80,163, 84,166,171,231,223, 72,184,121,251,110,219, 73,227, 71,127, 30, 29, 29,241, 8,230,173, 87,231,109, 97, 97,113,108,205,
-154, 53, 1,221,186,117, 19, 58, 59, 59, 35, 35, 35, 3, 81, 81, 81, 1,127,254,249,231,224,221,187,119,207,214,104, 52, 67, 1,
-147, 22, 68,109,120,121,207,111,206,150, 14,142, 96,140, 70,184, 55,111, 85,230, 32,249,236,207,139,160, 13, 6,176, 70, 35,252,
- 3, 7,151, 88,147, 57,248,251,251,215, 54,234,174,123,211,166, 77,255,248,225,135, 31, 68, 58,157, 14,119,239,222,197,149, 43,
- 87, 88,133, 66, 81, 83, 64, 92, 1, 65, 16, 23,151, 46, 93,234,217,177, 99, 71,235,236,236,108, 48, 12,227,116,226,196,137,105,
- 45, 91,182,180,241,242,242, 18,239,217,179, 7, 69, 69, 69,160,105,218,193,215,215,215,225,195, 15, 63,212,239,217,179,103, 54,
-128, 85, 85, 89,178,148,113,220, 34, 5,225,219,183,209, 59, 99,145, 78,156,239, 59,171, 47,206,217,212, 39,202, 44, 91,125,125,
-125,173,149,169,178,121, 86, 54,205, 28,148,169,193,243,250,250,250,238, 56, 31,111, 82,103,136, 44,105,108, 62, 58,112,224,128,
- 44, 42, 42, 74,230,239,239, 15,150,101,203, 34,240,151, 6,156,109,216,176, 97,109,238,227,202, 41, 83,166,204, 27, 49, 98, 4,
-154, 55,111, 94, 22, 20,117,201,146, 37,152, 55,111,158,253,181,107,215,102,239,223,191,127,246,241,227,199, 87, 1,152,111,166,
- 53,166, 20,230,150,241, 55,207,159, 63, 31,126,236,216,177,209,115,231,206,109, 8, 96, 58,128,197, 57, 57, 57, 93, 74,172, 49,
-226, 18,161,245,201,236,217,179,167,206,159, 63, 31,253,251,247, 95,124,247,238,221,239,107,105,229,163,104,154,238, 63,104,208,
- 32,202,104, 52,194,210,210, 18, 70,163,177,254,235, 26, 37, 0,108,154, 60,121,242,212, 41, 83,166,192,222,222, 30, 70,163,209,
-239,192,129, 3, 59, 22, 47, 94,252, 30,128, 9, 85,164,117,236,212,169, 83, 63, 24, 51,102, 12, 90,183,110, 13,129,160,248, 54,
-174, 89,179, 6,203,151, 47,183,186,120,241,226,224, 61,123,246, 12, 62,121,242,228, 81, 84, 92,182,203, 44,176, 44, 11,129, 64,
-128,228,228,100, 56, 59, 59, 75, 88,150,189, 64, 16,196,246,220,220,220,227,255,162,198,124,245,240,225,195, 63,218,183,111,159,
- 21, 0,252,248,227,143,152, 53,107, 22, 92, 92, 92, 96,101,101,197, 75,157,127,143, 69,107, 82,141, 22,173,154,160, 86,171, 91,
- 45,248,226, 99,144,100,113,175,177, 65, 61,111,172,248,122, 18,113, 50,232, 66,171,106,109,240, 82,119,196,220,216, 0,137,215,
- 76,232,140, 52,238, 60,126,142, 75, 63,246, 41,110, 45,251, 45,132,206,208,163,180,177,113, 16, 91, 88,172,214, 51,204, 77,184,
-186,222, 69, 98, 98, 86, 77, 34, 75,238,234, 18,180,117,235, 42,139,128,250,141, 96,160,141, 72,205, 76, 5, 65, 72,224,233, 97,
-141, 79,198,246, 19,118,233,226,238,244,205, 55,219,206,164,179, 24,162,206,126, 90, 99,192, 80, 63, 39,236,106, 21,208,112,196,
-135, 3, 58, 74,154, 5, 52,133, 72, 98, 81,246,219, 59,173, 91,227,157,214,173,201,249, 69,133,189,238,221, 15,237,117,228,226,
- 29,157,218,152,120, 40, 54, 27,227,106,120,201,148, 9,142, 25, 51,102,192,197,197,165,194, 9, 25, 25, 25,248,243,207,203,149,
- 94, 99,198,139,172,236, 63,190,255,254,123,235,188,188,188,126, 59,119,238,236,206,178,236,247,233,233,233, 55, 76, 33, 25, 3,
-212, 41,144, 72,122,140, 95,187,150,109,249,254,251,148,157,171, 43,201, 50, 12,145, 22, 31,239,248,243,134, 13, 93,115,159, 61,
-179, 80, 57, 56,228,230,105, 52,234,216,216, 88, 72,165, 82, 66, 32, 16,180,169,132, 42,131,227,176,154, 36,137,121, 4, 65, 64,
- 34,145,198, 78,153, 50,229, 97,201,111,117, 78,159, 62, 45, 27, 56,112,160, 26, 64, 2, 0, 72, 36, 82, 15,138, 34,253,138, 29,
- 8,177,218, 20,129,105,105,105,249,197,119, 63,172,178, 84,230,230,107, 12, 42,149, 81,110, 99, 69, 16, 86,214,148,178,160,176,
- 48, 85,145,165, 91,184,108, 57, 53,249,147, 49, 95,168, 84,170,105,166,138,172, 22, 45, 90,220, 59,118,236,152,179,163,163, 35,
-242,243,243,145,147,147,131,123,247,238,129,101, 89, 12, 29, 58, 84,210,190, 93,219, 86, 95, 47, 92,116, 59, 57, 53,245, 61, 83,
-196,150,165,131, 19,126,236,216,178,184,177, 78,200, 41, 43,159,237,195, 3,203,206, 89,158, 82, 80,106,157,123,157, 37,164,222,
-235,209,163,135, 8, 0, 38, 76,152,160, 44, 44, 44, 92, 1, 96, 31,106,142,232, 63,123,209,162, 69, 30,245,234,213,243,217,183,
-111, 31,138,138,138, 0,192,185, 94,189,122,240,243,243, 99, 66, 66, 66,224,231,231, 7,107,107,107, 92,187,118, 13,183,111,223,
- 70,235,214,173,173, 69, 34,209, 8,131,193, 80,169,208,234,218,167,235, 34,201, 64,255, 78,141,222, 25, 11, 43, 27, 55,236,216,
-127, 16, 49,161,187, 59,233, 12, 81,139, 68,204,213, 49, 26, 78, 50, 46, 43,201,106,126,157,214, 93, 28, 27, 52,125, 31, 62,239,
- 60,116,210, 50,215,159, 47,234, 85,111,165, 64,170,221,189,108,173, 34,167, 42,145, 5,224,199,161, 67,135, 14, 63,112,224,128,
- 29, 0,132,133,133, 33, 35, 35, 3,114,185, 28, 82,169, 20, 66,161,176,108,125,210, 90, 98,220,230,205,155,203, 68, 27, 77,211,
-101,171, 0,200,100, 50,116,238,220, 25, 45, 91,182,196,241,227,199,199, 85, 33,180, 58,182,107,215,110,175,143,143,143, 87,249,
-131, 42,149, 10,163, 70,141, 2, 0,116,233,210,165,135,133,133, 5, 87, 42, 8, 21, 10, 69,209,253,251,247,123, 1,184, 91,133,
-178,212,164,166,166,226,171,175,190,194,139, 23, 47, 62,219,186,117,107, 34, 0,169, 88, 44, 46,235, 31, 3,240,107,218,180,233,
-250, 89,179,102, 33, 46, 46, 14,145,145,145,247, 80,251,161, 84,198,210,210,242,153,209,104,108, 77,211, 52, 52, 26, 13,134, 12,
- 25, 34, 61,122,244,104, 6, 69, 81,209,217,217,217,163, 81,236,147, 98, 42,164, 0,214, 78,153, 50,101,234,220,185,115,113,249,
-242,101,156, 60,121, 18, 99,198,140,193,204,153, 51, 97,101,101, 53,126,230,204,153,183, 81,188,160,249,203,232,177,121,243,102,
- 48, 12,243,202,179, 33,149, 74,209,177, 99, 71, 52,105,210, 4, 39, 79,158,236,241, 26, 66,203,167, 99,199,142, 98,150,101,161,
- 82,169, 16, 18, 18, 98,101, 97, 97, 97,229,233,233, 57, 17,192,191, 70,104,249,248,248, 76, 57,112,224,128, 85,249,209, 31,137,
- 68,130,114,245,128,199, 63,111,209,170,182,135, 85, 6,189, 94,109, 16, 8,200,104,119,183,230,135,174, 93,253,188,108,232, 16,
- 32,163,245,122,181, 1, 0, 24,150,131, 82, 77,195, 66, 66, 34, 33,189, 16, 17,241,217,149, 81, 85,152,162, 41,180,240,134,164,
-109, 2, 56,142,131,222,192, 64, 87,144,142, 21,103,212,136, 74,209, 66,175,202,131,222, 80,236,134,229,228,228, 36,184,112,225,
-220,172,224,224, 63,167,254,254,251,239, 84,138,173,109,100, 33,208,170, 50, 78,123,123, 95,107, 86, 44, 62,180,101,235, 98, 11,
-142,138, 71,108,146, 10, 13, 60,219,194,201,206, 11,233,217, 42,220,140, 60,139,232,167, 65,168,231,230,131,153, 95,244,149,126,
-247,195,190,131, 34,186,174,119,126,254, 11,101, 85,233, 44,237, 69,109, 59, 31, 11, 58, 55, 30, 76, 78, 28,152,194,180, 87, 78,
-176,146,123,227,157,110, 30,144,123,213,151,140,155,185,124, 44, 80, 65,104,149,231,204, 32, 8,114, 11, 73, 18, 83, 9,130, 64,
-243,230, 45, 82,214,174, 93, 91, 89, 40,112, 67,243,230, 45, 82, 40,138,244, 44,126,177,147,155, 57,142,205,168, 33,157, 21, 68,
-141, 88, 44,153, 91,108,246,119, 75, 62,115,230,140, 97,248,240,225, 88,179,102,141,120,222,188,121, 11, 41,138,154, 80,201,240,
- 94, 5,206, 33,128,183, 93,253,250,189,191,191,121,147, 19, 26,141, 68,238,189,123,202,124,133,130, 78, 47, 44, 20, 31,142,142,
-238,255,233,156, 57, 98, 47, 47, 47,220, 8, 10,114,204, 82,169,184,124,157, 78,147,159,159,207,209, 52,125,175, 10,206, 5,114,
-185,179,108,199,142, 29,126, 83,166, 76,121,168, 80, 40, 22, 0,128,155,155,219, 10, 0, 77, 0, 36,148, 59,134,173, 91, 15,166,
- 78,156, 56, 49, 54, 51, 51,115, 65,117,233, 44,135,166,206,114,103,217,254,109,123,158, 56, 88, 91,144,114, 79,119, 82,104,103,
- 39,160,197, 22, 34, 22,208,212,243,170,111, 9,160,105, 21,215,190,204, 73, 88, 88, 88, 28, 59,117,234,148,179, 80, 40, 4,195,
- 48,144,203,229,120,241,226, 5,242,243,243, 81, 88, 88,136,231,209, 81,168,235,229,133,111,230,207,115,155, 62,111,254, 49,181,
- 90,221,250,165,198,236,213, 5,144,141,134, 87, 44,123,149,173, 98,240,242,176,151,137,229, 94, 30, 47,146,146,146, 96,101,101,
-133,128,128, 0,171,155, 55,111, 94,175, 70,100,149, 95, 4,120, 68,135, 14, 29,172,247,237,219,135,214,173, 91,195,214,214, 22,
- 33, 33, 33, 8, 11, 11,131,193, 96, 32,139,138,138, 96,101,101,133,149, 43, 87,194,219,219, 27,133,133,133, 72, 72, 72,112, 20,
- 10,133, 78, 47, 69,180, 47,227, 12,185, 16,242, 93, 65,220,149, 69,233,196,249,190, 59,246, 31,196,196, 15, 71,194,149,139,191,
-110, 91,159,248,174,247,192, 14, 75, 56,202, 43,208,210,186,185,125,195,128,129, 16,137,173, 48,125,238,114,196,134,159,182, 87,
- 23, 62,249,140, 96,146,189,150,173, 61, 60,163,146,188, 19, 0, 72, 47, 47,175, 79, 15, 31, 62,108, 93,102,122,161,168,178, 53,
- 15,203, 47, 2, 95,205,130,239, 53,222, 79,130, 32,240,226,197, 11, 56, 59, 59,195,202,202,170,108, 1,241,168,168, 40,220,185,
-115, 7,165,171, 81, 84,193, 57, 58, 56, 56,216,203,210,210,178,194, 9, 28,199, 33, 59, 59, 27, 52, 77, 67, 38,147,129, 97, 24,
- 24, 12, 6, 24,141, 70,104,181, 90,171, 38, 77,154, 76, 51, 26,141,119, 43,227,100, 89,246,203, 17, 35, 70,116,184,123,247,174,
-239,134, 13, 27,160,215,235,127, 76, 79, 79,199, 7, 31,124, 0,150,101,209,163, 71,143,119, 57,142,139, 89,184,112, 33, 0, 96,
-214,172, 89, 70,149, 74, 53,165, 54,121, 47, 65,147,119,222,121,199,247,242,229,203,232,212,169, 19,116, 58, 29,214,172, 89, 99,
-179,117,235, 86,155, 61,123,246,200,231,206,157,251, 91, 86, 86, 86,159, 26, 56, 9, 0, 63,186,186,186, 78,237,218,181,171, 69,
-201, 26,166,216,189,123, 55,190,249,230,155, 3, 0, 22,158, 59,119,110,233,201,147, 39,199,126,250,233,167,248,230,155,111,102,
-230,231,231,239,172,138,243,249,243,231,144,203,229,176,177,177, 41,126, 89, 26, 12,120,244,232, 17, 46, 93,186,132,198,141, 27,
-155,146,167,170,210,233, 51,116,232,208,223,246,239,223,111,157,156,156,140,107,215,174,161,110,221,186, 80,171,213,166,172, 13,
- 27,252, 23, 52,216, 85,114,106, 52, 26,109, 82, 82,146,213,170, 85,171,224,230,230, 6, 31, 31, 31, 72,165, 82, 16, 4, 1,163,
-209, 88, 93, 56,129, 26,211,217,165, 11, 4,217,169,246,131,108,237,236, 63,227, 56, 78, 80, 80,144,183,205,128,252, 35,241,241,
-208,255,141,121,255, 47,163, 21,128,135,168,184,230,161,162, 76,104, 5, 5, 5,113,129,129,129, 68,233,222,195, 3,202,236,108,
-251, 88,103,215,102, 7,157, 93,155,150,172,251, 69, 70, 83,148,125,172,139,139, 90, 9, 0, 6,154,195,173,232,124, 60,121,150,
-142,176,103,233,176,148,152,102,124,209, 25,232, 98,143, 85,142,131,182,232,127,157, 86,131, 58, 15, 58, 67,177,187,135, 94,167,
- 70, 65, 86, 36, 49,124, 72, 47,233,212,169,147,225,230,230, 33,175,138,207, 32,145,206,156, 62,171,191,157,131,157, 16, 65, 55,
-207,227,221,198, 67, 32,149, 8,145, 83,160, 5, 8,224,105,252, 37,128,181, 70,120,108, 18,218, 53,149,161, 79,111,127,171,227,
- 71, 98,230, 0, 88,108, 74,122,233,148,123, 16, 53,236, 7, 33, 99,132, 49, 59, 6,108,126, 34, 96,233, 10, 13, 97,133, 28, 69,
- 34,162,175, 31, 53,169,207,200,178,236,103, 78, 78, 78,249, 11, 23, 46,236,218,160, 65, 3,195,180,105,211, 30, 39, 38, 38,126,
-249, 82,111,229,167,205,155, 55,227,217,179,103,169,223,127,255,125, 72,118,118,246, 34, 51, 11,122, 62,199, 97, 93,201, 80, 92,
-246,137, 19, 39,222,185,122,245,234,204,117,235,214,185,124,254,249,231,226,207, 63,255,252, 19, 0,223, 86, 55, 92,168,148, 72,
-122,126,127,237, 26, 71,167,164,232,254,248,229, 23,241,166, 91,183, 22, 26, 88,214,221,201,217,153,104,223,174,157, 74, 70,146,
-217, 57, 25, 25,180,220,215,151,122,113,233,146, 35,103, 97,145,118,238,220, 57,101, 81, 81, 81,149, 75,231, 80, 20,165,174,108,
-184,176, 50,184,185,185,233, 43,243,225,170,166, 65, 84,178, 28,103,176,171, 87,143,235,221,227,189, 6,207, 98,226,227,165,118,
-118, 84,195, 6,117, 27, 69, 68,191,184,199, 49,140,150, 32, 8,165, 73, 99, 37, 20, 53,114,221,186,117,205,108,108,108,192,178,
- 44,108,109,109,145,149,149, 5,189, 94, 15,165, 82, 9,125, 97, 1,244, 5, 5, 8, 75,124,129, 14, 93,187,226,255,216,187,234,
-240, 40,174,246,123,102,125, 55,187,113, 23, 8, 16, 8, 16, 8, 4,183, 64, 8, 78, 9, 20,247,162,133, 82,130, 67, 9, 80,138,
- 20, 8, 45,238, 78,113,183, 18, 92,131, 4,143, 19, 72, 32, 46, 27,247,245, 29,249,253, 17,105, 8,145, 77,160,223,239,251,218,
- 61,207,179,207,202,204,156,189,115,239,157,185,103,222,247,189,239, 29,209,175,143,203,177,203,127,142,162, 40,234,116,149,254,
-188,150,173, 75, 45, 89,171,235,153,255,229, 11, 74,204, 45, 21, 93,191,181,118, 6, 79, 34, 65,239,249, 62, 95,114,161, 7, 94,
-187,118,237,250,208,161, 67,191, 89,184,112, 33, 75, 42,149,222,140,141,141,237, 2,224,109, 85, 7, 73, 36,146,134,153,153,153,
- 40, 44, 44,132,177,177, 49,182,110,221, 10,107,107,107,200,229,114,188,122,245,138,113,112,112, 32, 30, 62,124, 8, 7, 7, 7,
-100,101,101, 65,163,209, 64,161, 80,164,170,213,234, 74,221,229,197,238,193,254,243,250,225,198,251, 55, 71,187,218, 19, 49,175,
- 70, 46,240,248,240, 62,244, 93,194,237, 59, 79,127, 37,149,194,196,220,164,187,139, 27,180, 11,180,152,185,104, 21,118,110, 88,
-129,247, 47, 30,101, 91,215,205,223, 37, 34, 84, 71,170, 42,175, 76, 38, 83,190,123,247,206, 48, 56, 56, 24, 4, 65,192,216,216,
- 24, 6, 6, 6, 21,138,173, 90,128, 85,214, 2, 37,147,201,192,227,241, 96,110,110,142,131, 7, 15,150, 14,188,245,235,215,175,
-138, 99, 95,239,222,189, 71,213,173, 91,215,176,236,143,237,218,181,195,244,233,211,177,103,207, 30, 4, 4, 4,124,178,158,102,
-106,106,170, 84,171,213, 86,117,222,185,105,105,105,253,134, 12, 25,242,230,241,227,199, 70, 7, 15, 30, 4, 73,146, 21,190, 14,
- 28, 56,128,231,207,159, 47, 7,240,174,150,253,168,233,176, 97,195, 30,157, 56,113,194, 36, 35, 35, 3, 37,125, 67, 38,147,129,
-162, 40, 52,105,210,132, 32, 73,178,186,184, 55, 22,155,205,190,188, 99,199,142,129,223,127,255, 61, 56, 28, 14,212,106, 53,118,
-236,216,129,197,139, 23,167, 21, 63,148,106, 0, 44, 59,114,228,200,132, 65,131, 6,193,205,205,205,229,193,131,202, 35, 59, 10,
- 11, 11, 81, 88, 88, 8, 46,151, 11, 27, 27, 27,172, 89,179, 6,106,117,209,109,165,113,227,198,165,151, 49,128,125,141, 27, 55,
- 30, 24, 25, 25,185, 17, 69,177,107,159,193,198,198,102, 8,195, 48,211, 40,138, 42,232,218,181,171,249,169, 83,167, 12,147,147,
-147,241,230,205, 27, 44, 95,190, 60,135,166,105,138,166,105, 66,161, 80,196, 88, 89, 89,189, 17, 8, 4, 34,185, 92,158,157,149,
-149,181, 14,192,205,255,175,145,156, 32, 8,130,203,229, 98,202,148, 41,224,112, 56, 16,137, 68, 80, 42,149,208,106,181,165, 98,
- 30, 53,116, 75, 55,106, 36, 49,231,128,247,189,169, 97,179,185, 35,230,120, 89,218,218,217,195,196, 72,128,136,136,183, 93,238,
-223,187,179,131,207,121,191,151, 86,107,247,190,143,203,251,219, 23,187, 47,175, 69,254, 71,133,214,103,107, 30,114, 42,110,204,
- 17, 20,195,156,203, 76, 78,230,107,248,124,131,200, 18, 43,151,181,181, 60,159, 32, 70, 80,150,205,191, 5,169,209, 22,223, 40,
-152,226,151,142, 66, 75, 75,225,195,251, 48, 60,190,253, 39, 44,228,201,200,140,105, 5,240, 90, 64,173,200,131, 82,173, 41, 22,
- 37, 20,130,223,220, 67,126, 94, 54, 92,219,122, 1, 44,214,243,202,248,140,205, 9,175,206,109, 90,178, 63, 36,132,161, 93,227,
-225,112,114,232,138,120,105, 62,114, 11, 85,200,201, 87,162,149,171, 15, 50,114, 20,200,151, 43,241,246,195, 49,216,219, 57,177,
- 8, 78,116, 79, 93,133,150,234,237, 69,168,222, 93, 1,207,177, 11,248, 77, 6,129,237,232,142,132,144, 7, 8,190,177, 5, 73,
-225, 79,192,208, 20,108, 27,183,215,245, 34,217,113,243,230,205,246, 93,186,116,225,244,234,213,203,237,250,245,235,110, 82,169,
- 52,184, 88, 96,184,245,234,213,203,205,210,210, 18,219,182,109, 83, 16, 4,177,163,150,141, 93,106, 1, 75, 79, 79,127, 9, 96,
-237,197,139, 23,119, 76,159, 62, 29, 86, 86, 86, 45, 82, 82, 82, 42, 61, 48,131,203,117,155,184,110, 29,195,101,179,153,211, 59,
-119,242, 86,221,188,185,233,143, 35, 71,120, 61, 60, 61, 9,134, 97, 16, 20, 20,100,240,219,206,157, 6, 99,191,253, 54, 46, 62,
- 61,157,244, 15, 8,208, 72,147,146, 10,210,101,178, 85, 82,169, 52,245,255,163,103,107,181,218,103, 49,177, 49,246,109, 59,180,
-178, 12,140,136, 9,239,219,163,115,103, 22,139,197,122, 31, 29, 31, 96,105,105,100,112,231,246, 29,141, 86,171,125,166, 11,151,
- 64, 32,240,234,209,163, 7, 39, 39, 39, 7,118,118,118,200,200,200, 64,114,114,114,145,197, 33, 47, 7,154,188, 60,104,243,115,
- 65,201, 10, 17,243,234, 37, 90, 57, 53, 16,156, 19, 8,188,228,114,121,149, 66,171,228, 41,179,162,133,174, 75,126,227, 27, 26,
-130, 47,145,128,168,185,219,240, 91, 19, 19,147,197,185,185,185,215, 1,172,209,104, 52,222,139, 23, 47,110,183,125,251,118,139,
-181,107,215, 26, 77,155, 54,237, 92, 97, 97, 97, 43, 20, 45,170, 90,217, 0,246,145, 36, 73,115, 0,214,247,238,221,131,149,149,
- 21,242,242,242, 74, 44, 45,106,185, 92, 46,204,202,202,130, 74,165,130, 90,173,134,145,145, 17, 94,191,126,157, 77,146,228,213,
-234, 10,103,212,144, 88,163,210, 68,252,108,238, 34, 78,209,144,166, 30,233,217,116,206,202, 77,210,213, 0, 54,245,115,114, 58,
-160,161, 31,197, 68,133, 93, 53,141,125,245, 48, 59, 37, 74,230,116,240,122, 76, 85, 49, 90, 12, 0,154, 32, 8,166,113,227,198,
-200,200,200, 0,155,205,134,129,129, 1, 36, 18, 9,150, 44, 89,130, 29, 59,118,212, 70,104, 9,197, 98,241, 58, 22,139, 53,138,
-197, 98, 89, 82, 20, 5, 31, 31, 31, 12, 28, 56, 16,124, 62, 31, 26,141,166,212,162, 89, 98,165,170,198,210, 17,244,252,249,115,
-163,231,207, 63,185,109,121, 90, 88, 88,220, 87,169, 84,136,142,142,198,229,203,151,187, 3,240,175, 97, 91, 71, 7, 5, 5,245,
-115,119,119, 63,218,166, 77,155,134, 12,195,160, 69,139, 22, 24, 61,122, 52,142, 29, 59,134,224,224, 96,228,229,229,209,119,238,
-220,249, 3,192,198,154,142,225,197,245,219,100,216,176, 97, 79, 78,158, 60,105,154,149,149, 5,133, 66, 1,153, 76,134,115,231,
-206,161, 75,151, 46,176,176,176,192,137, 19, 39, 72,134, 97,170,106,123, 22,139,197, 58,184,119,239,222,129, 83,167, 78,197,174,
- 93,187,112,250,244,105, 12, 26, 52, 8,163, 70,141, 66, 70, 70,134,245,134, 13, 27, 38, 20,187, 9, 87,140, 30, 61, 26,133,133,
-133,120,245,234, 85,132,142,215, 60,114,115,115,145,155,155, 11,145, 72, 84,246, 26, 35, 0, 28,219,178,101,203,152,185,115,231,
-194,201,201,105, 69, 76, 76,204, 22, 84, 48, 75,148,166,233, 31,146,147,147, 77, 57, 28,142, 57, 73,146, 72, 76, 76,196,235,215,
-175, 49,115,230,204,236,236,236,236,233, 0,226, 1, 44,155, 50,101,202,154,249,243,231,151,246,165,249,243,231,251, 93,191,126,
-189,223,127,218,154,211,184,177, 73,115, 62, 91, 48, 39,167,128,109,158,147,147, 83,122,239, 80,171,213, 80,169, 84,159, 88,178,
-120, 60,174,121,187, 86,117,175, 41,228, 5, 75,223, 70,229, 86,186, 64,186, 75, 67,227,150, 6, 98,227,185, 93,186,246, 24,215,
-167,223, 96, 54,169,213,226,214,173,171, 56,116,104, 55, 60,221, 27,195,169, 81, 11,204,154, 61,199, 88,165, 38,125,238,220,185,
-185,216,228,249,227,155, 5,249,185, 75,170,226,252,151,227, 90,177,184,186, 86,161,235,176, 34, 5, 89,156,194, 33,167,248,171,
-133,169,169,233, 78,138,162, 60,141,140,140, 64,231, 70,226,237,235, 23,200,206,225, 66,165,160, 64, 51, 69, 98, 75, 39,225,162,
- 82,227,209,173, 43,216,186,101, 19,178,178,178,224,222,173, 59, 10, 57,117, 80,183, 78, 93, 40, 21,242,226,139, 6,208,168,181,
-176,180,118, 68, 96, 96,176, 54, 95, 38,171,244,134,196, 19,106, 92,234, 90, 55,134, 74,211, 9, 66, 62, 31,121, 5,106,228, 20,
-139,172, 19,231, 71, 66, 37, 87,128, 84,107, 64,170,181,176,172, 59, 12, 77,173,123,128,166,174, 54,175, 81,245,209, 20, 52,177,
-143,160,137,125, 4, 81,167,217,248,211,119, 76,185,129, 84,183,117,119, 51, 50, 50,210,195,195,195,175, 6, 5, 5, 13, 25, 57,
-114, 36, 30, 60,120, 48, 13,192,140, 98,247,205,180,145, 35, 71, 34, 40, 40, 8,225,225,225, 87, 51, 50, 50,210,191, 70,203,243,
-249,124,133, 74, 85, 52,198, 26, 24, 24, 8,171,217,215,190,221,208,161,172,188,192,192,252, 45, 79,159,174, 56,112,240, 32,175,
- 87,207,158,132,150, 36, 65, 83, 20, 26, 57, 59, 19,125,250,244, 17, 31, 59,123,214,156,173,213, 62, 95,228,237,125,111,207,248,
-241, 5, 47,101, 50, 93, 3,205,235, 21,187, 12, 1,160, 94, 21,191,233, 12,149, 74,181,253,135,239, 39,245,242,127,244,164, 78,
-221, 58,246, 70,183,238,248, 7, 11, 68,124,150, 83,253,134,236,156,188,108,206,234, 21, 75, 69, 42,149, 74, 87,209,234, 98, 97,
- 97,129,212,212, 84,124,248,240, 1, 42,149, 10, 90,173, 22,180, 92, 6,117, 78, 46,212,121,217, 32,148, 10, 8, 40, 10,202,204,
- 52,212,115,106, 0,252, 53, 35,177, 90, 87, 84, 69, 66,171,228, 93,104,100, 4,158, 88, 2, 22,151,171,243,226,232, 0,218,180,
-111,223,254,236,133, 11, 23,120,147, 39, 79,238,112,247,238,221,157, 0,226,147,147,147,123, 46, 95,190,252,229,206,157, 59, 5,
-211,167, 79,111,178,113,227,198, 9, 0,246, 85, 70,162, 84, 42,207, 94,187,118,109,172,163,163,163,117,104,104, 40,148, 74, 37,
-104,154, 70,255,254,253,129,162,216, 26, 0,192,251,247,239, 21, 74,165, 50, 61, 44, 44, 44, 63, 62, 62, 94, 3, 29,102, 9,174,
-220, 46,125,150,159,250,104,168,181,141,253,115,161,168, 94,125,166, 48,112,200,188,225,246, 27,182,156, 79, 86,222,140,142, 46,
-248,185,119,131,245,178,130,144,153, 38, 14,133,187,110,250,197,232, 18, 8, 95, 58,187,208,220,220, 28, 28, 14, 7, 92, 46, 23,
- 60, 30, 15, 4, 65, 96,246,236,217,216,191,127,127,117,174,195, 79, 68,150,161,161, 97,248,170, 85,171, 28,166, 79,159,206, 19,
- 10,133,200,201,201,193,137, 19, 39, 48,101,202, 20, 28, 58,116,168,194,248, 23, 29, 92, 74,229,173,165,115,199,143, 31, 15,181,
- 90,141,209,163, 71,227,192,129, 3,115, 41,138,242,175,197, 37,253, 60, 56, 56,216, 57, 56, 56,216, 8,192,160, 81,163, 70, 29,
- 25, 54,108, 24,252,253,253,113,245,234,213,238, 40,154,244,161, 0,224, 11,192,170,248,189,170,235, 83,108,109,109,189,155,166,
-233, 65,150,150,150,193,141, 27, 55,118, 61,121,242,164, 73,122,122,122,201,228, 7,196,198,198,226,240,225,195,210,131, 7, 15,
-230, 83, 20,101,206, 98,177,174,229,230,230, 46,169, 66,176, 29,220,178,101,203,164, 98,119, 32, 46, 92,184,192,108,218,180,137,
- 88,190,124, 57,114,114,114,224,233,233,137,189,123,247,206, 41, 44, 44,116,219,180,105,211,247, 35, 70,140,192,234,213,171, 33,
-147,201,182, 84,247,176, 82,133,248, 34, 0,116,222,178,101,139,227,220,185,115,113,225,194, 5,180,105,211, 70, 20, 19, 19,179,
- 7,192,212,138,218,143, 97, 24,196,196,196, 64, 46,151,227,201,147, 39, 88,177, 98, 69, 78, 25,145, 53,103,198,140, 25,107,230,
-204,153,131,117,235,214, 49,161,161,161,233,195,134, 13,179,222,191,127, 63,187, 81,163, 70,115,228,114,249,127, 76,104, 53,105,
-100,182,190, 93,155,174,139,109,237, 27,225,196,201, 83,200,206,206, 46,173,147,146,122, 97, 24, 6, 5, 5, 5, 72, 77, 77,133,
-177,145, 33, 54,108, 92,243,205,143,211, 38,213, 65, 81, 26,140,207, 77,150, 78,166, 27,135,141,154,188, 96,244,216, 73, 8, 13,
-126,131, 99, 71,246, 33, 44, 52,168,148,143,212,106, 16, 25,241, 26,145, 17,175, 97,109,227,136, 62,189,186, 19, 99,198,140,233,
- 63,126,236, 40, 75, 0,127, 91,234,136,255, 97,107, 22,240,121, 30,173,253,159, 8,173,106,204,117, 22,166,166,166,225,103,206,
-156, 49,119,119,119,103,147, 36,137,155,183,110, 97,230,140,239, 48, 97,188, 15, 52, 48, 5,169,230,129,230, 9,117, 42,137, 66,
- 33, 7, 3, 6, 50,153, 12, 1, 1, 1, 96,104, 18,199,246,111, 2,195,208,165, 66, 11, 96,160,214,104, 96, 95,183, 9,118, 31,
- 88, 75,130,203,125, 9,109,197,169,107,242,179,216,148,150,100,144,156,158,128, 4,105, 24,140, 13,235,130,195,173,139,172, 92,
- 57, 56, 44, 27,104,149,239, 65, 21, 31, 43,151, 37, 65,161,249,178,246,163, 42,176,158, 50, 53,184,233, 42, 20,138,227,199,143,
- 31,255,102,243,230,205,252, 1, 3, 6, 52, 62,127,254,124,103, 0, 24, 48, 96, 64, 99, 35, 35, 35, 28, 63,126, 92,173, 80, 40,
-142,127, 69,139, 79,143,246,237,219, 35, 39, 39, 7,177,177,177,193, 85,158,155, 90,109, 46,177,178, 98,167, 63,120,160,205,200,
-201,169,211,163, 71, 15, 66, 75,146, 96, 17, 4,178,243,242, 16, 31, 23, 7, 19, 19, 19, 34,252,253,123,201,142, 89,179, 46, 53,
-118,117,229,148,204, 72,212, 5, 87,175, 94, 53, 64, 81, 92, 86,149,191,213, 16,178,244,180,212, 73,222,222,222,151,142, 31, 63,
- 97,156,150,158, 22, 41,224,243, 73,137, 68,104, 55,126,220,143,156,220,220,220,177, 0, 10,117, 37,203,201,201, 65, 76, 76, 12,
- 68, 34, 17,120, 92, 46,104,133, 28,148,172, 16,202,236, 12,176, 53,106,240, 41, 10,102, 6, 2,212,177,182, 70, 93, 75, 11,157,
- 56, 63,220,191, 93, 26,248, 94,214, 93,184,161,189, 11,248, 98, 9,248,134, 18,252,232,247,176,248,105,148, 7, 44,255, 85, 23,
- 90, 11,123,123,251, 63, 79,158, 60,201,203,200,200, 64, 80, 80, 80, 48,128, 60, 0,134, 0,232,136,136,136,187, 97, 97, 97, 94,
-197,179,238,170,155, 45,182,233,226,197,139,189,221,221,221,201,250,245,235,139,211,211,211,235,228,228,228,208, 82,169,244, 19,
-147,208,237,219,183, 5, 5, 5, 5, 50,154,166, 47, 21,139,172,106,243, 23,205, 27,110, 47, 12, 8,196,108,143,190,245, 90, 24,
- 89,180, 68, 54, 25,216,226,121,176,116,246,188,225,246,219,183,156, 79, 86,138, 8,213, 17,130, 74,172,195, 17, 42,117, 13, 98,
-102,128,162, 88,169,128,128, 0,196,199,199, 35, 38, 38,230, 19, 65, 53,109,218, 52, 28, 59,118, 76, 39,139,150, 88, 44, 94,183,
-114,229, 74,135,185,115,231,242,202,136, 34,120,123,123, 35, 47, 47, 15, 7, 14, 28,128,183,183,119,141, 7,254,114,104,208,163,
- 71,143, 1,182,182,182,200,202,202,130,141,141, 13,220,221,221, 7,250,251,251,215, 7, 16, 91,203,126,255, 99,223,190,125,215,
-172, 90,181, 10, 90,173, 22, 83,166, 76, 65, 84, 84,212,217,168,168,168,173,117,235,214,157,253,211, 79, 63, 89, 91, 91, 91, 99,
-228,200,145, 98,146, 36,135, 86, 70, 98,102,102,230,187,111,223,190,177, 3, 6, 12, 96,105, 52,154,110,247,239,223, 71, 92, 92,
- 28,212,106, 53, 72,146,196,199,143, 31,225,237,237, 45, 45,158,221,248, 81,135,114, 77, 94,182,108,217,164,217,179,103,227,183,
-223,126,195,202,149, 43,255, 48, 54, 54,118,109,213,170, 85,235,149, 43, 87, 98,209,162, 69,112,116,116,132,185,185,121,211,229,
-203,151,187,204,159, 63, 31,219,183,111,199,138, 21, 43,254, 0,112,184, 54, 21, 65,211, 52,177,126,253,122,183, 45, 91,182,216,
-150,136, 44, 22,139,133, 51,103,206, 32, 48, 48,112, 96,116,116,116, 69,199,236,181,177,177,153,102,107,107,203,191,115,231,142,
-196,209,209, 17, 36, 73,106,139, 69,214,142,186,117,235,206,252,248,241, 35, 6, 12, 24,128,232,232,232,227, 0, 38, 24, 27, 27,
-203,230,207,159,111, 32, 18,137,140,229,114, 57,254, 83, 96,179,136,137,235, 86, 47,194,171,192,247,184,120,145,135, 87,175, 94,
-193,218,218, 26, 2,129, 0, 12,195, 64,165, 82, 33, 35, 35, 3, 90,141, 10, 45,154, 55,192,209,131,235,145,158,158, 1,176,136,
- 74, 67,110, 8, 22, 49,110,210,119, 67,240,248,201, 45,236,217,179, 15,133,133,178, 74, 30,190,133,104,212,216, 5,246,118, 86,
- 72, 76, 74, 4,193,130,197,223,121,174,255,227,174,195,210, 91, 16,116, 73,239, 80, 22, 38, 38, 38, 91, 79,159, 62,109,238,233,
-233,201,150,201,100,160,105, 26, 93,221,221, 49,123,238, 92, 92, 61,121, 18,206, 29, 70,131, 80, 75, 64, 26,232, 54,235, 65,169,
-144,163, 89,235,206, 24, 49,114, 20, 18,226,227,209,215,107, 24,148, 74,121,233, 19, 70,137, 69, 75,173,214,192,194,170, 14,110,
-223,190,205,198,148, 41,111,177,163, 98,163, 4,165,225,135, 68,126, 84,118,201, 85, 4, 34,224,213, 49,104, 84, 26,180,104,177,
- 28, 26,218, 28, 86, 14,211,160,213, 94, 70,126,198,253, 34, 55,134,185, 39,146, 18, 18,192, 98,243,194,107, 91,131,180, 44,227,
-139,110,186,121,121,121,121, 49, 49, 49,231, 3, 2, 2,198, 13, 29, 58, 20,183,111,223,254, 30, 0,134, 14, 29,138,128,128, 0,
-196,196,196,156,207,203,203,203,251, 26,173,109,107,107, 59,168,123,247,238,163,219,181,107, 7, 63, 63, 63, 48, 12,243, 88,167,
- 11,155,203,101, 88, 44, 22,104,154, 6, 1, 32, 43, 55, 23, 81, 81, 81,200,202,204,132, 86,171,133,172,176,144,118,105,220,184,
-144,161,105,195,154,148,167,236, 12, 67, 84, 48,235,176,228,183, 90,156,106,252,203,231, 79, 19, 10, 10, 11, 45, 77, 77, 76, 11,
-248,124, 62,149,147,155,155,247, 54, 60, 84,173,227,224, 80,130,136,176,176, 48,215,148,148, 20, 36, 36, 36,128,148, 21,128,173,
- 82,131,165,146,163,103,231, 78, 16,129,129, 16, 52,184,180, 22, 92, 54, 23, 5, 69,179,243,170,117,119, 80,101, 30, 18, 74, 68,
- 22, 65, 16, 69,238, 66,177, 24,124,137,225, 39, 22, 46, 93,250,147, 64, 32, 56,121,238,220, 57, 91,123,123,123,172, 94,189, 26,
- 14, 14, 14, 77,237,236,236,228,198,198,198, 34,107,107,107, 52,107,214, 12,157, 59,119,198,141, 27, 55,160, 67, 29,144, 12,195,
-244,121,252,248,241,130,167, 79,159,142, 16,139,197,196,172, 89,179, 56,253,251,247,135, 64, 32,128, 92, 46, 71, 78, 78, 14, 78,
-157, 58,149, 73,211,116,201,164, 20,115, 3, 3,131,195, 4, 65,196,202,100,178,185,229, 9,143,110,110, 97,151,158, 77, 79, 97,
- 10, 13,134,120,244,173,215,162, 71,223, 94,104,224,220, 3, 61,250, 38, 0,192,122, 51, 78,220,232,223,151,153, 92, 50, 49, 36,
- 14,223,190,121,103,133,187, 71,143,101,139, 11, 31,172,249,109,127,110,181,241,116, 4, 65,128,166,233, 79,114, 7,149,223, 62,
- 97,194, 4,156, 57,115,166,218,122,100,177, 88,163,166, 79,159,206, 43,103,121, 70,114,114, 50,188,188,188, 48,116,232,208, 79,
-132,150,133,133, 5,108,108,108, 16, 23, 23, 7, 0, 89, 58,246,171,217,147, 39, 79, 38, 20, 10, 5,166, 78,157,138, 3, 7, 14,
- 96,244,232,209,132,191,191,255,108, 0,115,107,218,217, 89, 44,214,134,159,126,250,105,129,183,183, 55,178,179,179,113,253,250,
-117,244,239,223, 31,103,206,156,177,188,126,253,250, 58, 79, 79, 79,176,217,108,248,249,249,129, 36,201, 42,115,125,241,120,188,
- 65, 3, 6, 12, 96, 37, 38, 38,130,199,227,161,109,219,182, 72, 74, 74,130, 92, 46, 71,114,114, 50,230,204,153,147,154,149,149,
-213, 93,215,235,136,199,227,205,157, 61,123, 54, 78,159, 62, 13, 31, 31,159, 35, 0,166,230,229,229,141,120,250,244,233,233,111,
-191,253, 22,201,201,201,184,116,233, 18, 86,172, 88, 65, 76,152, 48, 1,187,118,237,194,156, 57,115,254, 40,182, 58, 85,214,241,
- 11,210,211,211,141, 27, 54,108,136,180,180, 52, 20, 22, 22,226,210,165, 75, 86, 55,110,220,168,111,111,111,111, 20, 19, 19, 67,
-253,250,235,175,252,185,115,231, 98,235,214,173, 8, 10, 10,194,177, 99,199,208,163, 71, 15, 50, 58, 58,186, 66, 43, 89,113,202,
-134, 75, 12,195,220, 17,139,197, 40, 40, 40, 40,185,238, 22,250,248,248,120,251,250, 22, 25,217, 83, 82, 82, 48,113,226,196,241,
-247,238,221,163, 61, 61, 61, 13,120, 60, 30,148, 74,165,236, 63, 57,106,211, 20, 13,128, 70,253, 58, 18,220,186,122, 16,111,130,
-163,241, 38, 56, 12,124, 65, 81, 16,188, 66, 33, 71,235, 22,141,208,161,109,123,164, 72,147,113,252,216, 65,152, 89,216, 87,121,
- 31, 97, 24, 6, 60, 14, 5,151,198, 54, 56,121,108, 31,252,174,223,195,177,227,167, 74, 99,222, 56, 28, 46, 90,181,238,128,182,
-109,221, 17, 29,243, 17, 7, 15,238,129,165, 85, 29,189,115,176,150, 40,117, 29,150,125, 47,167,252,123,184,187,187,179, 11, 11,
- 11,161, 84, 42,145,154,154,138,184,184, 56,152,152,154, 32, 58, 37, 22,221, 13, 52, 72,165,243, 17, 17, 28, 78, 17,108,110, 80,
-117,127, 56,192,163, 21,224,209, 10, 51, 39,143,174,226,145,149,129,216,200,162,200,117, 67,146, 31,176,125, 59, 89,153,208, 34,
- 41,237,221, 91,119,238,183,159, 60, 97, 16,247,246,253, 3,208,170,105, 40,180,198,144, 41,213,144,105,184, 96, 25,247, 7, 50,
-253,193,230, 8,208,209,173, 17, 46, 93,188,161, 97, 72,237, 61,157, 43,200,218, 21,100, 90, 88, 25,161,149, 94,206,239, 96,166,
-179,235,176,116,224,165,168, 51, 39, 78,156, 24,220,169, 83, 39, 3, 79, 79,207,134,197, 3,167,230,196,137, 19,242,226,100,152,
- 53,197, 39,217,224,109,108,108, 90,243,120,188,209,253,251,247,111, 61,105,210, 36,188,125,251, 22,199,143, 31,143,108,212,168,
-209, 3,169,180,242, 25,217,108, 62, 63,171, 48, 61,221, 68, 82,191, 62,199,212,208, 48,229,198,245,235,142,189,122,247, 38, 18,
- 18, 18,144,149,149, 5,165, 82,137,160,224, 96,134,203,102, 39, 17, 70, 70,172,247,129,129, 44, 54,159,159, 85,153,181,177, 2,
-196, 85, 51,235,208,183,182,214,173, 58,182,166, 13, 87,248,252,208, 64,169, 82,186,230,231,231,147, 28, 46,151,235, 96, 99, 18,
-255,254,163,238,247, 68,149, 74,229,119,247,238,221,193,189,122,245, 18, 68,134, 4,129,204,203,131, 58, 47, 7, 60,154,130, 89,
-107, 55,176, 53, 42, 64,173,133,189, 11, 3,101,174, 1,252, 95,188,215,170, 84,170,106,147, 26,150, 8, 45, 86, 57, 97,192,151,
- 72, 32, 48, 52,130, 64, 34, 41, 47, 24,170,123,146, 51,232,211,167, 79,207,142, 29, 59,130, 97, 24,236,223,191, 31, 26,141,134,
-175,209,104,160, 86,171,161,209,104,144,159,159,143, 99,199,142, 97,247,238,221, 79, 1,252,161,195,233,147, 34,145,232, 91,130,
- 32,172, 56, 28,142,220,210,210, 82,124,230,204,153,210,116, 19,173, 90,181,130,161,161, 33, 15,197, 73, 33,173,172,172,184,135,
- 14, 29, 50, 25, 56,112,224,163, 10,221, 29, 45,154, 46,106, 64,154,122, 8, 69,245,234, 27, 89,180, 68, 3,231, 30, 0,128,222,
- 94,147,209,160, 81, 93,228,103,134,212, 87, 42,226,134,240, 56, 57,166,225,219,147,223,138, 6,184, 78,146,165, 63,140, 66,197,
-211,251, 43, 28, 40, 88, 44, 86,165,238, 88, 93, 68, 86,145,102, 97, 89,150,196,249, 0, 64, 86, 86, 22,164, 82, 41, 34, 34, 34,
-208,164, 73, 19,100,103,103,195,222,222, 30,106,181, 26,237,218,181,131, 66,161,192,150, 45, 91,240,228,201,147,167, 0,230,232,
-240, 31, 34,103,103,231,137,173, 91,183,198,245,235,215,241,234,213,171,228, 91,183,110,217,187,187,187,163,126,253,250,147, 98,
- 99, 99,151, 22,187,250,116,133,216,221,221,125,150,183,183, 55,194,194,194,240,195, 15, 63,100, 37, 38, 38, 94, 58,123,246,236,
-212, 21, 43, 86,176,250,246,237, 11,169, 84,138, 13, 27, 54, 80, 79,158, 60,217, 8, 96,117, 53,245,248, 46, 49, 49,209, 65,169,
- 84, 34, 59, 59, 27, 36, 73, 66, 46,151,227,198,141, 27, 56,118,236, 88, 90,177,200,250,160,107,225,220,220,220,154,177, 88, 44,
-156, 62,125, 26, 0,126, 70, 81,198,254, 75, 67,134, 12, 73,254,245,215, 95,237,151, 44, 89,130,239,191,255, 30, 26,141, 6,191,
-253,246, 27,150, 44, 89,114,173, 88,100, 85,117, 19,221,108, 99, 99, 51,237,135, 31,126,104, 58,127,254,124, 4, 4, 4, 88,189,
-126,253,186,109, 80, 80, 16,234,212,169,131,172,172, 44,142,185,185, 57,182,110,221,138,121,243,230, 93, 0,144,249,236,217,179,
- 81, 49, 49, 49,190, 0, 54, 84, 35,218,247,218,219,219, 79, 99, 24,134,145,203,229,113, 62, 62, 62, 27,214,174, 93,139,121,243,
-230, 33, 60, 60, 28,121,121,121, 48, 52, 52, 36,126,250,233,167,137, 63,255,252, 51,166, 76,153,194,200,100,178,221,255,233,129,
-154, 97, 40,200,115,194, 64,169, 76,209,170, 69, 19,180,114,173,135, 91,247,223, 0, 0,122, 14,115,135, 92, 86,128, 35, 71,246,
-227,195,135, 40,112,184, 92,152,152,217,232, 98, 9,132, 58,255, 29,114, 53, 82,244,242,108,139,254,125,187,227,143,163,103, 64,
-106, 53,152, 58,121, 44,114,114,115,113,244,232, 65, 68,199,124, 4,135,203,133,185,197,223,159, 8,181, 42, 45,242, 63, 47,180,
-116,112, 63,129,166,105, 36, 39, 39,227,245,235,215,136,141,141,133,129,129, 1, 20, 36, 69,239,185,251,132, 38, 8, 94, 18,205,
- 48, 79, 25,178, 52, 75,241,231, 28, 20,149, 92, 38, 99,173,177,169,169, 41, 95,165, 82,128, 36,181,101, 70, 21, 2, 32, 0, 30,
- 7,176,181,107,128,196,132, 68, 70,169, 84, 62,172,242, 9, 74,165,220,122,229,210, 57,239,206, 93,220, 45,250,247, 92,133, 75,
-151,151, 35, 39, 63, 31, 74, 13, 23, 50,165, 6,114, 37, 96, 98,214, 24,237, 90,180, 68, 74, 74, 22, 66, 94,249, 23,114, 84,114,
- 93, 2, 69,163,118, 44,155,236, 60,121,230, 34,136, 28,187, 64, 21,113, 9,116, 97, 90,169, 69, 75, 40, 49,133, 89, 93, 23,228,
-202, 84, 56,119,239, 13, 80,131,165, 94,210,211,211,229,108, 54,251,132,183,183,247,111,111,222,188,118, 0,128, 55,111,222, 36,
- 73,165,210,197,233,233,233, 53,181, 73,151,100,131, 39,132, 66,209,155, 70,141, 26,165,180,109,219,214,120,200,144, 33,176,176,
-176, 64, 80, 80, 16,124,125,125,223,105, 52,154, 69,254,254,254, 85,186,122,212,106,117,242,155,203,151,141,186,127,247,157,201,
-162,129, 3, 55,120,123,123,111, 93,189,122, 53,215,217,217,153,208,106, 52, 8, 13, 13,101, 78,158, 56,161,221,189,100,201, 22,
-190, 88,204,121,121,229, 10,151, 84,169,146,255,191, 59,177,189,189,189,135,123,183,174, 46, 27, 55,111,135, 82, 81,136, 23, 1,
-215,144,147,147,129,125,251, 47,186,216,219, 51, 30,201,201,201,254,186, 10,224,195,135, 15, 47,232,208,186,117,107,167, 58,117,
- 16, 26, 31, 11, 62, 77,129, 71,146, 96,107, 84, 96,145, 74,212,113,101, 64,176, 12, 33, 77,205,199,218,211,231,195,116, 17,198,
- 77,191, 25,132,213, 73,121, 32, 8, 2,155, 58,185,130,111, 40, 1, 79, 44,193,143,127,222, 47, 21, 6,126,171,151,128, 47,145,
-160, 97, 7,157, 18,194,203, 31, 60,120,240, 58, 52, 52,180,157,171,171, 43, 22, 44, 88,128,184,184, 56,208, 52,141,180,180, 52,
-165, 84, 42, 77,206,200,200,136, 67, 81,254,159, 3,213, 12, 98,101, 85,135,189,191,191,127,169,187,225,222,189,123,176,179,179,
-131,177,177, 49,242,243,243, 49,125,250,116,147, 95,126,249, 5, 0,240,250,245,107,148, 21, 40,229, 17,250, 38, 98, 99,110, 1,
-147,195, 20, 6, 14,201, 38, 3, 91,244,232,155,136,222, 94,147,112,199,239, 15,220,191,117, 23,102,156,184, 88,136, 11,110,100,
-198,102,230, 39,201,156,247,186,180,153,202,150,202,110,237,157, 53, 40,146,109,107, 75,159, 91,178, 39, 63,183,170,178, 58, 59,
- 59,195,218,218,186, 52, 70,139,195,225, 96,202,148, 41, 96, 24, 70, 87,145, 85, 60,214,208, 25, 74,165,210, 90, 40, 20, 34, 53,
- 53, 21, 31, 63,126, 68,116,116,116,105,234, 0,154,166,181, 11, 23, 46,228,206,154, 53, 11,123,246,236,193,195,135, 15,159, 2,
- 88, 5, 64,215,135,181,177, 35, 71,142, 52, 84,171,213, 56,117,234, 20, 9,192,235,220,185,115,175,219,181,107,199,233,215,175,
-159,225,174, 93,187,198, 22,183,145,206, 66,203,200,200,136,167,209,104,176,107,215, 46, 36, 38, 38,122, 0,136,120,249,242,229,
-222,145, 35, 71,238,118,117,117,109, 20, 22, 22, 22, 85, 88, 88,248, 35,128,144,234,200,210,210,210, 38,183,109,219,246, 28, 77,
-211,142,189,122,245, 18,111,222,188,217,232,253,251,247,112,112,112, 0, 77,211,161,168,225, 18, 86, 81, 81, 81, 17, 82,169,212,
-165,123,247,238,184,113,227,198,122,138,162,214, 1,248,109,198,140, 25,246,241,241,241,104,221,186, 53,204,204,204,240,254,253,
-251, 2,169, 84,186, 27, 69, 75, 18, 85,103,194,141, 1,176,120,239,222,189, 45,247,238,221, 59,218,204,204,172, 99, 80, 80, 16,
- 30, 63,126,140,141, 27, 55,226,151, 95,126, 65,215,174, 93,177, 96,193,130, 76, 0,163, 1,144, 49, 49, 49, 58,229,205, 43,177,
-108, 1, 64,155, 54,109, 82,124,125,125, 49,117,234, 84,230,208,161, 67,219, 78,156, 56, 49,119,236,216,177,165, 99,224,196,137,
- 19,153,227,199,143, 79, 68,209, 50, 76,255, 73,104, 53, 26, 53,140,204, 26,160, 48, 55, 1, 25,137, 1, 48, 48,180, 65,223, 30,
-110,144, 43,212,184,122,229, 2, 66, 66,131,193, 98,177, 96,109, 83, 7, 38,166, 22,136,140,140, 2,170,158,109,172,213,104, 52,
- 48, 52,173,135,194,188, 68,168,211,223, 64, 36,177,194,164,239,134, 64,174,208,224,226,165, 11, 8, 11, 11, 1,155,205,134,141,
-109, 29, 24,155, 20,113, 18, 76,213, 51,152,245, 0, 80, 65, 62,173,106,133, 22,155,205,126,112,243,230,205,225, 29, 58,116,224,
-124,248,240, 1, 31, 62, 20, 61,220,228,228,228,144, 4,168,243,233,161, 87,198, 84,113,120, 47, 20,207,206, 40,187,118,161,196,
-208, 48,249,253,187, 8,235,156,236, 52, 4, 7, 62,193,135,200, 80,196, 70, 71, 64,163, 81,130,205, 98,129,197,102,161, 94,131,
-230,120,242, 52, 64,173, 36,201,128,202, 56,139,202, 17, 93, 32,182,114, 30,181,102,245, 82,191,121,139, 86,138, 70, 12,223,131,
-144,247,111, 81, 72,218,128, 97, 0, 27,115, 49, 90, 57,253,132,228,148, 12,156,254, 99,151,156,214,104,198,149,203,161,245, 25,
- 39, 0, 88,103,162,217,238,253,127, 76, 57,112,236,228,202, 69,179,166, 91,127, 59,116, 28,248,217,111,161, 77,121,131, 6,237,
-250,131, 16,152,224,250,237,251,240,127,253, 54,141,166,152,149,214, 89, 56, 20, 89, 13,103, 89,228,230,230, 62, 75, 77,149, 58,
-148,201, 2,239, 32, 16, 8,171,155, 29, 87,158,243,147,140,243,108, 54,171,205,154, 53,107,180,214,214,214,154,176,176, 48,236,
-217,179,135,126,243,230,205,109, 22,139,181, 67, 42,149, 42,171,227,180,212,106,131, 79,250,248, 52,107, 63,116, 40, 51,102,214,
- 44, 57, 4,130,217, 27, 54,109,242,201,200,201,177, 99,104, 26,150,102,102, 73, 27,150, 44,241, 29, 62,114,100, 78,248,147, 39,
-162,128,203,151, 69,124,146,124,163, 67, 57,191, 6, 42,229, 76, 78, 78,246,127,248,240, 49,142, 28,216, 12,141, 70, 5,105,114,
- 60, 0, 32, 51, 43, 15,213,136,172,242,156,140, 92, 46, 31,250,243, 47,191, 60,255,121,222, 92,155,110, 61,123, 33, 33, 56, 8,
-154,236, 12, 16, 90, 18, 92,130, 3, 89,186, 1,210,211, 10,177,248,248,217,244, 66,185,124,104, 5,131, 68,133,229, 44,177, 88,
- 9,140, 12,193, 19, 75,192,151, 24,126, 98,197, 18, 26, 25,129, 47,150,128,195,231, 87, 20,192,253, 25,103, 97, 97,225,176,225,
-195,135,135,188,124,249,210,116,234,212,169,232,220,185,115,160, 66,161,240, 4, 80, 80,219,250,164,105, 58,185, 91,183,110, 44,
-130, 32, 36,227,198,141, 19,100,100,100,148,102, 86, 47, 44, 44,196,141, 27, 55,208,164, 73,209,172,254,240,240,112, 52,111,222,
-188, 82,206,239, 23,135, 37, 3, 88, 61,111,184,253,134,231,193,210,217, 0,214, 55,104, 84, 7,247,111,221,197,227,251, 1, 62,
- 29, 93,233,237,223,140,107,247,171,129,231,200, 69, 46,109,166,178, 37, 70,182, 56,122,241, 2, 59,226,205,193,181,114,121,104,
- 67,236,185,180,176,178,114, 18, 4, 1,134, 97, 62, 75,229,192,102,179,113,226,196,137,154,158,251,217, 3, 7, 14,204,248,225,
-135, 31,120, 82,169, 20,239,222,189,131, 76, 38,131, 80, 40,196,173, 91,183, 72, 0,187, 78,156, 56,113,235,196,137, 19,253, 80,
- 52,155,232, 94, 77,250,167, 88, 44,246,238,219,183, 47,222,189,123,135, 87,175, 94, 93, 0, 16, 18, 24, 24,120,225,195,135, 15,
-163,186,118,237,138, 63,254,248,195, 91,161, 80, 28,168, 9, 39, 77,211,101,115, 38,149,172,248, 16, 92, 88, 88,216, 49, 32, 32,
-160,166,237, 46,205,202,202,234, 82, 44,172, 19,173,173,173,141,130,131,131, 81,183,110, 93,104, 52,154, 14, 53,237, 75,121,121,
-121,155,119,236,216,113,104,242,228,201,248,245,215, 95,199,157, 61,123,118,220, 55,223,124,131, 1, 3, 6,224,240,225,195, 8,
- 9, 9, 89, 15,221,150, 21,171,232,220, 67, 0,132, 88, 91, 91,207,172, 83,167, 14, 54,110,220,136,208,208, 80,223,213,171, 87,
- 47, 9, 9, 9, 65,147, 38, 77, 4, 17, 17, 17,100,109,238, 33, 0, 96,100,100,100,164,213,106,113,249,242,229, 23, 0,230,141,
- 27, 55,206,106,235,214,173,163, 37, 18, 9,178,179,179, 21, 97, 97, 97, 99, 1, 92,249, 79,223,235, 24,130, 88, 54,245,251,217,
-123,191,159, 58, 86,216,182, 77, 43,200,243,147,160, 40, 76,131,188, 32, 21, 59, 14,220, 6, 65,176, 96,105,105, 11, 43, 27, 7,
-196,199, 39,224,233,181,235,106,153, 92,177,149,175,165,215, 87,205, 57,171,136,179,117, 17,167, 92,150, 14, 69, 97,122, 41,167,
-149,149, 93, 49,103, 60,158, 4, 92, 87, 42,100,178,205,106,134,248,253,111, 62,247,255,101,212,108,173,195,178,200,201,201,153,
- 51,125,250,116,207,197,139, 23,155,147, 36,201, 54, 51, 51, 67,124,124, 60,121,254,252,249,236,194,194,194, 57,181, 41, 13,135,
-203, 13,113,110,220,196,243,219,111,191, 37, 7, 13, 26,200, 27, 63,185, 31,199,210,202, 10,121,185, 89,136,124, 23,132,247,111,
-223,192,185,137, 27, 86,172,222, 2,152,152, 84,187,144,100,241,178, 58, 94,171,126, 94,120,166,139, 71, 31,163, 38,205,221,120,
-173, 26, 26, 67,163, 37,145,148,148,132, 43,151,131, 53, 97,175, 31,231,211,164,122,148, 60, 83,183, 37,120,252, 1, 18, 89,216,
-231,106,165, 57,177,110,195,142, 5,187,246, 29, 89,180,120,246, 84,113, 87,247,222, 8,189,251, 7, 46,248,157,145, 41, 85,234,
- 13, 60, 54, 54,133,101, 65, 30, 89,195, 58, 80, 42,149,154,242,227,169, 82,169,212,124,105, 75, 31, 62,124, 24,105,105,105,234,
-184,184,184,155, 36, 73,158,173, 98,177,231,207,176, 3, 80, 15, 81,169,238,254,236,238,222,239,231, 91,183,132, 19,127,250, 73,
- 61,110,252,248,133, 80,169, 52,224,243, 25,142, 88,204,130, 64,192, 13,127,242, 68,180,109,198, 12, 51, 66,173,190,115,164,138,
-180, 1, 21,224,171,207, 58, 44,177,104,117,239,222, 21, 19,167,206,131,162,140, 69,235,217,171, 72,168, 52,208,217,162, 85,140,
-132,184,196,196,142,179,151,253,124,113, 84,223,158, 46,174,142,245, 4,150,245,235, 65, 98, 99,131,172,140, 12, 60,121,245, 94,
-187,250,204,197,176, 98,145,165, 83, 94, 25,154,166,139,130,220, 1,244,156,179, 24, 4,155, 13, 20,167,113, 40,153, 57, 84,191,
- 93,103, 16, 28, 14, 40,134,134, 74,165,210, 37,232, 47,233,227,199,143,195,198,141, 27,119,207,207,207,143,213,183,111,223, 86,
-151, 46, 93,162,191,164,239, 40, 20,138,142, 0, 32, 20, 10, 99, 77, 76, 76,236, 39, 79,158, 12,173, 86, 11,185, 92,142,188,188,
- 60, 36, 37, 37,229, 78,158, 60, 89, 3, 0, 34,145,136, 63,124,248,112,163,234, 56,183,156, 79, 86,206, 27,110,191,221,140, 19,
- 55, 58, 63, 51,164,190, 25, 39, 46,182,163, 43,189,125,203,249,100,165,145,157,108, 77,102,156,127,164, 84,118,107,239,209,139,
- 23,216, 19,134, 12,163, 28, 36, 81, 62, 66, 43,230,124,117,188, 4, 65,124,150,156, 84, 71,145,245, 9, 10, 10, 10,150, 44, 95,
-190,124, 64, 78, 78,142, 67,191,126,253,120, 46, 46, 46,120,254,252, 57,252,252,252,200,103,207,158, 37,202,100,178,165, 0,148,
- 0,110,215,166, 78, 27, 55,110, 92,159,195,225,148,184,210,118, 22,255,188,243,210,165, 75,163,166, 78,157,138,122,245,234, 53,
-139,136,136, 16,160, 6,215, 17,195, 48,165, 94,134,175, 9,130, 32,162,183,109,219,102,111, 99, 99, 67,220,184,113,131,100,179,
-217,181,177,220, 28, 62,120,240, 96, 7,173, 86,251,253,180,105,211,224,225,225, 1,146, 36,113,252,248,113, 28, 60,120, 80, 87,
-145, 85, 37, 34, 35, 35,223, 36, 38, 38,118, 91,184,112, 33, 54,110,220,184,100,225,194,133, 72, 76, 76, 68,100,100,100,208,151,
-240,230,231,231, 43, 18, 18, 18, 12, 58,117,234,212, 54, 44, 44, 44,204,211,211,179,249,212,169, 83,177,126,253,122,230,225,195,
-135,195, 1,220,248,255, 24,189,223,127,200, 62,198,165, 56,183, 86,175,217,252, 75, 67,167,250, 63, 76,153, 52,146,221,216,185,
- 57,100,121, 73, 48,183,176,134, 67,157, 6,200, 72,207,196,205,155, 55,168,204,204,220,195, 20,139, 88,245,225, 67,118,202,151,
-112,218, 59, 52, 64,122,122, 58,174, 95,191, 78,229,230,228,239,135,150,181, 58, 34, 62, 55, 13,122,232, 98,201,154,134, 42,178,
-196, 87, 5, 11, 83, 83,211, 83, 70, 70, 70,105, 70, 70, 70,105,166,166,166,167, 0,157,102, 31,244, 42,115,119, 96,127,242, 26,
- 62, 92, 8,161,176, 35, 56,156,249, 38,166,166, 55,140,141,141,179,186,119,239,174,222,187,119,175, 50, 34, 34,156, 78, 78, 78,
-100,140,141,141,243, 74,247,175,136,179, 28, 76, 77,157, 12,197,182,205,127, 49,118,104,245, 68, 98,219,172, 64, 98,219,172,192,
-216,193,237,169,216,182,217, 74, 83, 83, 39, 67,157,202, 89, 9, 26, 88,193,210,217, 2,187,154, 88, 18, 10,103, 11,236,106, 96,
- 5, 75,157,207,189,106,183, 31, 69, 16,160, 80, 52, 13, 27,181,224, 44,225,160,217,108,246, 17, 7, 7, 7, 91,212, 44, 97,221,
-103,156,227,129,122,227, 5,130,239,207,249,248, 76,140,125,248,112, 92,126, 76,204,152,188,232,232,145, 65,103,206,140,218, 57,
-106,212,248, 49, 2,193,180,225,128,147,174,156,182,182,182,190,111,222,188,241,211,245, 85, 70,120,233, 92,159, 78, 13,236,111,
-245,237,213,129,241,158, 62,148,241,158, 62,148,233,219,171, 3,227,212,192,254,214, 23,180, 17,193,102,179, 71, 27, 24, 24,156,
- 18, 27, 24,132,138, 13, 12, 66, 13, 12, 12, 78,177,217,236,209,168, 58,134,234, 19, 78,115,115,243,215,214,214,214,105, 53,121,
- 89, 88, 88, 4,214,160,156, 99,234,215,175,159,200, 98,177,182,212,240,154,174,138,211, 89, 36, 18, 69,139,197,226,164,178, 47,
-145, 72, 84, 54, 49,148,185,129,129,193, 85,177, 88,188, 85, 23,206,223,151, 53,255,229,233,237,153, 33,191, 47,107,254, 75,249,
-109,179, 6,155, 78,126,126,111, 85,214,172,193,166,147,117, 41,167,149,149,213, 67, 43, 43, 43,169,149,149,149,212,218,218,186,
-202,151,133,133,197,107, 29, 56,133,134,134,134, 91, 13, 13, 13,211,196, 98, 49, 37,145, 72,210,196, 98,241, 22,148, 73,109, 81,
-219,250,100,177, 88,235,155, 53,107,166,100,179,217,135,202,109,218,216,176, 97, 67, 37,135,195,217, 80, 67, 78,163,174, 93,187,
- 82,193,193,193,140,135,135, 7, 3,192,244, 43,182,187,141,169,169,233, 13, 35, 35,163, 4, 67, 67,195, 29, 0,196,181,228, 36,
- 0,140,182,183,183, 15,234,209,163,135,220,222,222, 62, 0,192,183, 95,177,156, 3, 6, 15, 30, 76, 39, 36, 36, 48, 12,195, 48,
- 9, 9, 9,204,224,193,131,105, 20, 37,138,252,146,123,242,178, 25, 51,102, 48,207,158, 61, 99,158, 61,123,198, 4, 4, 4, 48,
- 3, 6, 12,160, 1,124,247,133,247,121,124,173,115,119,105, 96,225,212,180,145,233,217,177,195,220,233,219, 87,182, 48, 43,150,
-254,192,244,246,104,206, 52,105,104,122,209,217,217,220,249,107,112,254,178,116, 58,211,171, 91, 51,218,197,201,244,140, 75, 3,
- 11,167,255,240,185,255,163,172, 90, 37, 15,210,127,119,192,217, 95,166,197, 79,197, 82,197,176,179,179, 67, 86, 86, 7, 33,135,
-227, 46, 16, 8, 60, 89,108,246,131,236,140,140,185,197,143, 91,212,127,202, 84, 91,229,128,238, 4,126, 21, 75, 18,212,134,243,
-147, 64,246, 90,114,214,132, 67, 39,206,202, 22,149,166, 85,170, 20,115,146,124,189, 3, 85,214,193, 39,156,246,246,246,223,211,
- 52, 93, 95,215, 2,177, 88,172,216,228,228,228, 3,181,169,207, 70,141, 26, 49,197,238,109,226,107,182,251,223,209,151,254, 77,
-156, 71, 55,183,176,107,210,162,233,162,208, 55, 17, 27,139,221,138,165, 88, 57,203,212,208,189, 71,247,229, 79,238, 63,252,117,
-229,142,156,130,255,231,115,103, 65,199,152,182,175,192, 89,146, 36,180, 70,156, 92, 46,119,111,251,246,237,191,127,254,252,249,
- 33,138,162,166,253, 75,251,231, 0, 54,155,189,176,113,227,198,173, 34, 35, 35,131, 40,138,218,136, 10, 18, 69,214,162,156, 75,
-235,215,175,255, 35,143,199, 19, 20, 22, 22,230,164,164,164, 44, 7,112,246,191,173, 62, 93, 26,153,181,101,152,210,164,219,107,
-223,125,204,126,249,213, 56, 25,154,162, 25,246,154,200,152,172,192,255,135,118,255,199,136,172, 98,161,181,255, 63,241,199,189,
-244,156,122, 78, 61,167,158, 83,207,249,213, 57, 69,250,250,212,115,254, 3, 57,255, 81, 40,177,104,113,244, 85,161,135, 30,122,
-232,241, 63, 7,133,190, 10,244,208,227,191, 14,101,173, 90,165,214, 44,162, 10, 85, 90, 19,147, 96,109,148,237, 93, 61,167,158,
- 83,207,169,231,212,115,234, 57,245,156,255, 58,206,127,170,200, 42,235, 42,156,166,119, 29,234, 57,245,156,122, 78, 61,167,158,
- 83,207,169,231,252,111,226,252, 95, 23, 90, 40, 39,180,244,174, 67, 61,254, 51,216, 62, 4,246, 0, 48,251, 18,146,255,142,253,
-245,208, 67, 15, 61,244,208,227,255, 25,251, 81,137,235,240,191, 65,104,217, 1,232,136,162,133,111,223, 3,120, 12, 32,231, 11,
-248, 44, 0,140, 36, 8, 98, 4, 0, 48, 12,115, 14, 69,179, 70, 50,117, 57, 88, 40, 20,166, 41,149, 74,171,226,207,233, 74,165,
-178,236, 90, 6, 4, 62,159,205,198,148,121, 85,136,250,245,235,167,169, 84, 42, 43, 29,254, 62,143, 97,152, 16, 22,139, 21, 42,
-145, 72,238, 71, 70, 70,250,213,228,196, 61, 61, 61, 39,178,217,236,181, 0, 64, 81,212,178, 7, 15, 30, 28,249, 27,219,173, 67,
- 29, 59,155, 63, 52, 90, 13,153,150,145,189, 28,159, 39,242, 3, 0,236,242,130, 47, 65, 98, 81,241,231, 13, 51,253,170,206,163,
- 83,211,253,171, 64, 91, 46,151,235,109,109,109,221, 63, 41, 41,233, 53,128,159,128,234,179, 26,215,169, 83,231, 59, 14,135, 51,
-142,162, 40, 39, 54,155, 29, 77,146,228,137,196,196,196, 99,250,123,136, 30,122,232,161,135, 30, 58,136,173,207, 80, 35,161,213,
-196, 28, 54, 12, 48, 26, 4,122,131,193, 29, 2, 56,253, 62, 11,169,186, 30,255, 77, 19,104,181,100,209,127,242, 88,160,110,124,
-100,237,239,223,191,191,195,172, 89,179,208,185,115,103, 60,127,254,188,211,225,195,135, 39,159, 61,123, 54,132,166,233, 7, 0,
-158, 3, 58,165, 82, 16,163, 40, 79,203,216,254,253,251,247, 90,187,118, 45,187,121,243,230, 80, 40, 20,120,248,240,161,251,134,
- 13, 27,182, 62,125,250,244, 46,128,147,197,130,160,210, 5,240,148, 74,165, 85,201, 98,156, 4, 65, 88, 13, 31, 62,252,101, 89,
-113, 85,188,190, 26,193, 48,204, 51,130, 32, 2, 40,138,122,126,254,252,249,196, 38, 64,135,233,245,121,231,231,198,106, 28,202,
-115,170, 84, 42,171,203,191,175, 3, 71, 32,128,170, 32, 31,157, 38,253, 37,122,239,252,178, 8, 4, 77,130, 13, 38,199,115,205,
-214, 16, 0,161, 41, 41, 41, 33, 30, 30, 30,177, 53,109, 97, 54,155,189,246,230,205,155,182, 12,195,160,111,223,190,107, 1,252,
- 93, 66, 75,208,177,173,219,131,171, 23, 78, 9, 11,179,211,208,239,219, 81, 39,162, 18,211, 39, 2,184,240,137,104,234, 15,107,
-130,192,162, 25,235, 78,178, 1, 96,247,210,177, 63,109,233,131,237,243,110, 35, 21,128,103,177,248, 1,128,223, 1, 60,216,213,
- 31,214, 0, 22,207, 88,119,146, 0,128, 61, 75,199, 46,218,213, 31,219,102,222,168,113,218,138, 31, 39, 78,156,184,125,237,218,
-181,108, 91, 91, 91, 36, 39, 39,247,107,214,172, 89,227,252,252,252,102,168, 34,136,184, 94,189,122,103,186,246, 24,216, 96,232,
-136,209, 6,150, 22,166, 72,145,102, 26,157, 57,117,104, 58,251,217,195,254,113,113,113,163,244,247, 16, 61,244,208, 67, 15, 61,
- 42, 65,237, 51,195,183,182,133, 72,166,193, 96, 14,155,248,174, 75,219,102, 61,199,124,211,149,213,204,165, 17,222,134, 71,244,
-185,114,255,197, 6, 86, 64,248, 61,146, 98,142,137,121,184, 28, 40,173,122, 38,140,150, 4,231,246,229,147, 69, 35,225,228,177,
-236,151, 47, 95, 54,106,211,166, 77,233,210, 48, 61,123,246, 68,207,158, 61,137,221,187,119,187,221,190,125,219,237,224,193,131,
-154,123,247,238,253,129,170,243,163,120, 55,108,216,112,195,246,237,219, 5, 30, 30, 30, 16, 8, 4,165, 27, 36, 18, 9, 6, 14,
- 28,136,129, 3, 7,178, 83, 82, 82,250, 94,189,122,181,239,239,191,255,174,142,143,143, 95,136,191,178, 52, 87,137,229,203,151,
-183,173,224,231,155, 4, 65,124, 36, 73, 50,200,205,205, 45,177, 49,208,104,250, 55,157,239,252,216,197, 89, 60,119,201,225, 10,
-121, 56,124, 62,142, 78, 44, 26,171,203, 10,173,216,251, 55, 32, 49, 50,204, 50, 48, 52, 12, 1, 16, 10, 32,132, 97,152,208,232,
-232,232,136,166,128, 91, 71, 83,214, 31,135,114,232,150, 53, 16, 91, 72, 76, 76,132,177,177,177,200,195,195, 67, 74, 16,196,202,
-135, 15, 31,126,237,128,188, 14, 43, 23,253,200,203,137, 11, 65,234,187,103,152, 63,194,221, 96,238,142, 63,127, 85,170,181, 23,
-170, 58,136, 32, 88,172,223, 3,104, 31, 20, 45,198,187, 60, 43, 43,203, 3, 0,204,205,205,249, 0, 30,108,121,129,111,230,117,
- 33,190, 36,183, 27,143,205,102,239, 58,124,248,240,212,239,190,251,174,104,233,136, 39, 79, 32,145, 72,176,122,245,234,122, 11,
- 22, 44,240, 37, 73,114, 78,101,150,172,174, 61, 6, 54,216,182,241,215,102, 5,217,121,170,125,187,206,190,178,115,109,194,154,
-225,189,192,112,155, 70,101, 67, 81,212,119,122,203,150, 30,122,232,161,135, 30, 53,177,102, 85, 43,180, 26, 91,224, 72,107, 87,
-231,145, 99, 6,184, 11, 90,184, 54, 7, 79,240, 87,234,150, 54,109,219,162, 77,219,182, 44,159,194,130,222, 47, 95,189,233,125,
-254,246,115,149, 92, 27,127, 54, 50, 19, 19,117, 45, 85,201,162,180,107,191,181,238, 33,203, 77, 23, 2,128,216,196, 74,185,244,
-114,234,253, 46, 93,186,192,193,193,129,119,239,222,189, 41,213, 8,173,165,239,223,191, 23,176,217, 85,231, 67,181,179,179,195,
-240,225,195,209,164, 73, 19,126,247,238,221,151, 86, 38,180,132, 66, 97, 58, 65, 16, 86, 0, 96,102,102, 70,173, 92,185, 50,136,
- 41, 2, 0, 48, 12,195, 60, 99,177, 88,207,105,154,126,241,231,159,127, 38, 53, 3,172,250,181,105,242,248,199,241,195, 13,152,
-243, 91, 43, 21, 9,202,252,252, 10,127, 55,144,136, 51, 68, 98,113,136,192, 64, 24,138,162,181,188, 66, 29, 28, 28, 34,154, 1,
- 14,237,155,212,191,189,123,222, 88,195, 67,211,126,173,182, 46, 91,183,110,221,184,101,203,150, 66,138,162, 32,147,201,176,103,
-207, 30, 99,145, 72,100,220,191,127,255, 21,101, 59,128, 11,208, 98,152, 29,123,218,170, 20,106,102, 45, 58,146, 73,215, 78,109,
-227,134, 15,236,111,212,182, 99, 87, 68, 61, 56,142,236,236, 2,228,229, 22,130,166,233,207,242,250,204,188,129,180, 93, 94,216,
-176,123,201,216,197, 4,139, 69,184, 13,249, 9,131,108,242,102,239,221,187, 55, 28, 0,151,207,231,151,237,135,118, 34,123,215,
- 13,141,250,116,197,158,101,227,193,208, 52, 3, 96, 67, 13,172, 89, 86,134,134,134, 87,110,223,190,221,161, 93,187,118,120,254,
-252, 57, 98, 98, 98,240,227,143, 63,170,103,206,156,201,155, 48, 97, 2, 49,127,254,252, 89,191,255,254,251,121, 0, 79, 63,187,
- 16, 56,156,113,223, 14, 29,197, 47,204,205, 87,170, 85, 26,181,153,133, 9,173,146, 41,229,153, 57,249,202, 81, 99,191, 87,135,
- 7,190, 24, 7,224, 51,161,245,133,245,169,135, 30,122,232,161,135, 14, 96, 24,166, 29, 0, 75, 0, 25, 4, 65,188, 42,251,189,
-120,151,146,213, 90,202,127,207, 68,145, 87,202,188, 12, 93, 38,138,194,125, 44, 1, 80, 0, 94, 18, 4,145,243,133, 69,172,122,
-233, 29, 63, 63, 63,166,236,123, 25,161,197, 48, 12,195,104,179, 62, 50,170,200, 27,140,252,213,129,207, 94,138,240, 11,140,244,
-229, 89,230,197,201, 95,152,198, 22, 85,175,194,254, 77, 19,104,199,182, 4, 51,163, 29,152, 57,221, 77,148, 47, 95,190,188, 71,
-211,180,159, 79, 87, 48,204,219,147, 12,243,246, 36, 51,175, 19,152,243,231,207,223,244,245,245,245, 59,118,236,152, 31,128,234,
-226,148,210, 10, 94, 5, 48, 47,172,192, 84,134,247,239,223, 51,123,247,238,101,150, 44, 89,194, 28, 58,116,136, 65, 53, 25,212,
-251,246,237,251, 48, 44, 44,140,153, 48, 97, 66, 16,170, 72, 12,232, 2,136,199,213,179,121,167, 58,179, 85,163,254,174, 5,147,
-211, 77, 88,225,249,219,218,218,126, 82,158,245,206, 54,204,206,246,206,204,145,222,109, 82, 25,134,185,201, 48,204,122,134, 97,
- 70, 49, 12,211, 4, 0, 90, 3, 70,223,218,154,127, 80,158,221,166, 80, 79,235, 88,237,186,119,173, 91,183,110,188,112,225,194,
-108,181, 90,205,196,198,198, 50,251,246,237, 99,238,220,185,195, 92,190,124,153,113,119,119, 79, 41, 83, 94,235,201, 77, 28,211,
-212, 7, 87,169,106,211,139,184,108,246,206, 87,119,206, 51, 31, 30,159, 99, 94,158,246,101, 78,252, 60,134,153,245,109, 7,141,
-145, 72,160, 4,208,163,178,227,102,118, 65,163, 38,245, 44, 35,227,227,227, 25,141, 70,195, 76,154, 52,137,233,219,183, 47,211,
-167, 79, 31,166, 87,175, 94, 76,207,158, 61,153, 30, 61,122, 48,247,239,223,103, 82, 82, 82,152, 94, 93,219,200,188, 92,208,182,
- 6, 69,115,117,116,116, 76,141,141,141,101, 52, 26, 13,115,239,222, 61,230,248,241,227,204,189,123,247, 24, 31, 31, 31, 6,192,
-145, 25, 51,102, 40,114,114,114,152,190,125,251, 38,161,130,172,241,142,142,142, 17, 97,145,137,137, 91,214, 29,184,127,116,231,
-169,251, 23,207,223,185,127,229,214,203,107,151,111,189, 58,251, 34, 56,250,178,163,163, 99, 68, 5,237,255, 69,245,169,135, 30,
-122,232,161, 71,245, 90,164, 88,104, 13, 40, 54,118, 12, 96, 24,166, 87,185,239, 3,138,133,211,103,223,125,124,124,150,148,253,
- 94,178,143,143,143,207, 18, 0, 76,167, 78,157, 78, 49, 12,211,232, 43, 20,127, 90,249, 87,141,102, 29,146, 73, 47,193,115,238,
- 15, 46,165,133, 54,243, 61,232,220,120, 64,108, 3, 5, 33, 65,150, 52, 30,239, 30, 95,168,122, 33,137, 98, 92,127, 15, 46,128,
-123, 17, 17, 17,120,247,238, 29, 18, 19, 19, 97, 96, 96,240,217,126, 79,158, 60,129, 72, 36,130,173,173,173,110, 74, 87,253,233,
- 56, 23,210,198, 17,146, 78, 30,200, 28,243, 3,238,221,187,135,244,244,116,240,120, 60,240,249,124,144, 36, 89, 45, 31,139, 85,
-180,226,111,137, 21,171,162,125, 60, 0,142,192, 76,114,117,247,138, 57,245, 89,207,252,184,138,132, 15, 72, 81, 82,186, 89,242,
- 36, 98, 24,136, 13,164, 34,145, 65, 8,138,221,133, 0, 66, 9,130,136,106, 13,112,197, 18,225,213, 63,214,204,183, 97, 7,222,
- 19, 42, 62,132, 84,200,209,171, 87,175,233, 0, 86, 48, 12,147,219,178,101, 75,235,181,107,215,154, 38, 39, 39,227,237,219,183,
- 56,123,246,108, 6, 89,116,162, 4,195, 48,171, 0,160, 35, 32, 52,177, 52,185,181,243,151, 57,134,120,112,134, 95,155, 94,100,
-236, 50,240,218,176, 9, 51,102,110,159, 51, 16,178, 2, 5, 78,222, 9,196,205, 55, 31, 7, 1,120,130, 42,226,222,118, 61,197,
- 7, 32,163,231,208,161, 67,131, 30, 61,122,100,113,240,224, 65,144, 36, 89,225,235,224,193,131,184,251,248,205,108, 0,175,117,
- 44,150, 93,253,250,245,239,190,120,241,194,210,192,192, 0,119,238,220, 65,110,110,110,169, 37,107,226,196,137, 68,110,110,238,
-232, 61,123,246, 12,139,139,139,219,248,248,241,227, 44, 20,173, 5,249, 73, 71, 96,179,217, 31, 73, 82,211,212,214,165, 17,103,
-196,192,174, 93, 11,179, 66, 32, 49,111,137,103,193, 31,175,230,230,100, 41,216,108,246,199,178,251,127,141,250,212, 67, 15, 61,
-244,208,163,102, 32, 8,194,143, 97, 24, 47,130, 32,252,202,255, 86,254,115,201,126,190,190,190,165,223, 75,142, 89,191,126,253,
-186, 50,223,229, 95,169,120, 85, 6,195,119, 47, 86,144,221, 43,218, 73,245,246, 34, 84,239,174,128,231,216, 5,252, 38,131,192,
-118,116, 71, 66,200, 3, 4,223,216,130,164,240, 39, 96,104, 10,182,141,219,235, 90, 16,101,211,166, 77,161, 84, 22,133,102,169,
- 84, 42,240,196,166,202,249,211,198, 10, 1,128,230, 8, 85,101, 20,172, 78,132,134, 93, 60,209, 62,141,193, 75,235, 34, 67, 69,
-251,180,162,227,214, 76,154, 4, 30,143, 7, 30,143, 7,162, 56,244, 71, 23,161, 69, 20,239, 76, 23,185,175, 42, 42, 4, 33, 23,
-112, 79,158, 94,225,221, 94, 16, 23,202, 87,133, 61, 67,138,138,102,174,166, 81,215,116, 41,175,129,216, 32, 89,100, 96, 16, 42,
-146,136, 75,133, 22, 65, 16, 31, 1,128,225,114,143, 29, 95,229,221, 82,156, 22, 45, 86,190,186, 7,169,146,214, 84, 66,179,234,
-198,141, 27, 86, 28, 14,199,134,162, 40, 36, 36, 36, 32, 60, 60, 28,219,182,109, 75, 43, 40, 40,232, 30, 24, 24, 24, 89, 86, 59,
- 82, 34,254,217, 99,171,231, 52,224,132,248, 11, 85, 31,195,106,220,123, 44, 92, 7,247, 29,212,221,237,218,244,241,203, 48,248,
-155, 62,152,208,189, 25, 19,155,146,173, 4,112,167,216,244, 90, 29,146, 3, 3, 3,123,119,235,214,237, 68,171, 86,173, 92, 24,
-134, 65,139, 22, 45, 48,122,244,104, 28, 59,118, 12,193,193,193,200,207,207,215,220,190,125,123, 43,128,195, 58, 22,203,192,212,
-212,244,230,253,251,247, 45, 13, 12, 12,112,251,246,109, 40, 20, 10,216,218,218, 98,230,204,153,252,245,235,215, 31,205,207,207,
- 31,225,235,235, 43,140,141,141,221,121,235,214,173,122, 40, 90,119,238,179, 78,160, 86,171,247,159, 60,118,100,251, 76,239, 89,
-246,247,159,191,189,167, 42, 44, 48,118,116, 76,204,183, 52,149, 24,110,253,109, 85, 93,181, 90, 61,189,226,250,124, 88,171,250,
-212, 67, 15, 61,244,208,227, 51, 84,169, 69,202,138,167,242, 98,171, 38, 34, 13,128,194,199,199,103, 41, 65, 16,126, 62, 62, 62,
- 75,125,125,125, 21, 0, 82,254, 14,145, 85, 42,180,188,188,188,252,253,252,252,224,229,229,229, 95, 41, 5, 77, 65, 19,251, 8,
-154,216, 71, 16,117,154,141, 63,125,199,148, 59,121,186,214,165, 27,184,250,206,125,149, 74,197, 57,114,228, 72,105,220, 22, 0,
- 80, 20,245,213, 91,177, 38, 66,171, 88,232,125, 86,136,250, 2,137,255,254,121, 35, 58,154, 83,114,174,250,201, 85, 36,171,104,
-114,227, 7,141,252, 85, 46,243,123,101,156,151,231, 78, 71,226,227,187, 48,144, 72, 18,167, 62, 10, 45,181, 98, 21,139,172, 24,
- 0,168, 39, 48,188,183,119,206, 96,119, 27, 30,120,234,107,231,144,162,162, 85,123,227,180,135, 43,233,108, 96, 24, 6, 49, 49,
- 49,144,203,229, 8, 8, 8,192,133, 11, 23, 50, 42, 16, 89,168, 47,144, 60, 60,244,211,184, 14, 70, 5,169, 60,245,171,187, 72,
- 81,209, 58,185,186, 44, 90, 12,238,194, 99, 17,183, 9, 22, 91,212,179, 99, 99,204,253,126, 8,182, 28,250,147, 84, 91,117,245,
-218,126,229,250,200, 66,149,102,169,142, 34,171,212,216, 24, 24, 24,216, 44, 48, 48, 80, 0,192,115,244,232,209,215,135, 13, 27,
- 6,127,127,127, 92,189,122,213, 25,128,180,120,191,213, 40, 90, 40,251,119, 0,209,149, 25, 30,121, 60,222,233,187,119,239, 54,
-183,179,179,195,221,187,119,161, 80, 40, 48, 99,198, 12,181,183,183, 55,111,226,196,137, 68, 94, 94, 94,169, 37, 43, 32, 32, 32,
-171, 50,145, 5, 0,201,201,201, 55, 46,156, 61,222,185, 91,183,110, 67, 26, 56, 55, 49,138, 46,200, 79, 55, 48, 16,138, 30,251,
- 63,224,189,122,241,116,103,114,114,242,203,138,235,243,158,206,245,169,135, 30,122,232,161, 71,229,208, 73,139,148,179, 76,213,
- 4,101,142,227,250,250,250,134,251,250,250,126, 98,241,250, 66,148,159,117,120,173,100, 76,171, 85, 30, 45, 42, 47,225,243, 19,
-160,233,154,156,236,103,191,153,154,154,146, 34,145,232, 19,161, 69,235,200,153,125,233, 20,162,127, 28, 91,106,201, 42,177,108,
-161,223,196, 47, 18, 90, 52, 77, 7, 0,248,164, 16, 6, 86,141,199,108, 29,232,210,165, 89, 3,123,150,246,236, 54, 36,201, 73,
-229,138,247, 26,229,187, 2,102, 80, 68, 5, 65,214,165,156,164, 22, 66,177, 40, 94, 36, 17,151, 23, 89,113, 0, 32,182,118, 30,
-182,177,127,147,238,110, 77, 26,178,200, 51,155,145, 44,215, 22,250, 68,104, 52,209, 50,230, 98, 37,117,184,162, 79,159, 62, 43,
-204,205,205,133,219,183,111, 55,118,116,116, 4, 73,146,234,242, 34,203,192,170,241,152,109,131, 93,187, 52,182, 49,101,105,207,
-239, 64,162,130,146,111,139,214, 30,213, 69,100, 89, 24, 75,110,237, 93,247,163,200, 64,192,133, 82,169,196,250,221,231,113,251,
-105,152, 87,102,216,229, 91, 0,110,125, 65,135,156,234,229,229,181,101,245,234,213,208,106,181,152, 50,101, 10, 62,126,252,120,
-251,253,251,247,219,234,214,173,187,240,167,159,126,178,179,177,177,193,200,145, 35,121, 90,173,118, 98, 37, 28,191,157, 60,121,
-210,203,205,205, 13,254,254,254,200,205,205,133,173,173, 45,188,189,189,249,190,190,190, 71,243,243,243, 71,172, 91,183, 78, 24,
- 19, 19, 83,165, 37,235,147,126, 77, 81,107,246,109,249,113, 97,187,142,238,172, 15, 31, 34,201,132,246, 30,172, 7,119,175, 62,
- 50, 55, 55, 63,154,144,144,240, 87,125, 14,105, 81,227,250,212, 67, 15, 61,244,208,227,235,128, 32,136,107,197,113, 87,159, 88,
-185,202,139,176, 18,139, 85,217,239,229,247, 47,222,254, 53, 30,150,247, 87, 32,188, 62, 77,239,224,229,229,165,243,180,122, 90,
-150,161,147,120, 42,143,111,154, 64,107, 47, 1,103,169, 7, 11, 60,177,169,114,224,234, 59,247, 43,219, 87, 44, 22,235,108,209,
-162, 85,202,234, 26,165, 70, 66,171, 56, 70,235, 38,195, 48,159, 8, 45, 99,235,198, 30,139,127,154,179,213,125, 88, 63, 86,218,
-247,157,144, 91,168, 82,253,244,150,164,147,228, 85,139,172,162, 81, 92, 27,107, 32,150,132, 10,197, 6,101, 69, 86, 2, 0, 8,
-173, 26,182, 95, 52,119,230,238, 30, 99, 6, 18, 25, 51,220,145,147,171, 80, 45, 12, 39,137,100, 5, 51, 34, 2,120, 80, 17,221,
-253,251,247,247, 1,216,231,225,225,145, 38, 22,139, 81, 88, 88,248, 89, 27,148,148,183,203,176,126,172,180,169, 29,144, 45,211,
-168,126, 10, 39,145,162,160, 79, 87, 39,178, 44, 77, 12,111,237, 93,251,163, 65, 74, 82, 28,120, 60, 30, 36, 18, 9,238, 60, 9,
- 69,102,248,149, 47, 17, 88, 96,177, 88, 43,125,124,124, 86,204,156, 57, 19, 89, 89, 89,184,122,245, 42,190,249,230, 27,156, 58,
-117,202,241,250,245,235, 91, 60, 61, 61,193,102,179,225,231,231, 7,173, 86, 27, 85, 9,205,144,105,211,166, 45, 28, 54,108, 24,
- 94,190,124, 9,169, 84,250,137, 37, 43, 55, 55,119,244,238,221,187,135,197,198,198, 86,107,201, 42,135,246,245, 27,182,230, 45,
- 89,190, 9, 42,121, 58, 39, 35,249,185,255,189, 59,172,103,217,217,217, 6, 0,242,106, 91,159,122,232,161,135, 30,122,232,108,
-213,170, 76,139,100, 20,139,168,140,138,190,151, 17, 88, 21,125, 39,202, 89,193,212,229,182, 7,255,157,231,164,147, 69,139, 99,
-237, 10, 50, 45,172,140,208, 74,255,100,187,208,208, 76, 39,215,161,150, 4,103,239,225,210, 60, 90,194,172,172, 44,161,133,133,
-133,178,172, 64, 48, 48, 48,128,157,157, 29,114,114,114,176,127,255,126,160,250,160,104,210,104,216,120,180, 31, 51, 5,175, 28,
-248, 96,180,154, 82,203,214,222, 73,147, 62, 17, 91, 60, 30,175, 36, 54,172,186, 65,247, 69,177,165,233, 25, 0,166,181,115,131,
- 95,133, 98,241, 36,161, 69, 29,139,185, 63, 78,229,198,166,171,112,223,125, 73,238,249,223, 22, 75, 18, 25,201,204, 4,228, 61,
-173,134, 47,250,219, 61,199,203, 91,178,146, 90, 57, 55, 88, 38, 52, 16,126,207, 55,171,103,227, 51,255, 71,110,108,154,138,184,
-223,254,167,252, 11,191,255,100, 16, 3,195,133, 73,200,125,160, 67,243,172,248,230,155,111, 86, 48, 12,195,208, 52,189, 28, 0,
-202,150,119,190,247,247,220,232, 84, 37,238,185, 47,203,185,240,219, 98,195, 68, 84, 93, 94,139, 22,131,187, 88,155, 26,221,218,
-187,110,166,129, 52, 57, 30, 2,129, 0,134,134,134, 72, 76,203, 3,151,195, 86,124, 97,127, 19,116,237,218,117,241,143, 63,254,
-136,208,208, 80,204,152, 49, 67,154,144,144,112,241,204,153, 51, 51,126,249,229, 23, 78,223,190,125, 33,149, 74,177, 97,195, 6,
-237,147, 39, 79,214, 1,216, 80, 97,127,228,112,166,254,250,235,175, 76, 74, 74, 10, 17, 19, 19, 3, 91, 91, 91,204,154, 53,139,
-191,110,221,186,210,152,172,154, 88,178, 74,144,156,156,236,127,251,238, 51, 12,186,177, 21,164, 86,229,159,155,149,240,232, 93,
-116,142,191, 25,159,191,192,190,117,139, 90,213,167, 30,122,232,161,135, 30, 95,197,138,245,170,170,239,255, 5,168,200,117,168,
-147,208,138,218,177,108,178,243,228,153,139, 32,114,236, 2, 85,196, 37,208,133,105,165, 22, 45,161,196, 20,102,117, 93,144, 43,
- 83,225,220,189, 55, 0, 16, 85,147, 82, 21, 20, 20,160, 77,155, 54,216, 53,177,113, 15,101, 65,150, 80, 4, 64, 37, 48, 82, 94,
-230,119,189,127,253,250,117, 57, 77,211,167, 1, 92,175,134,102,101,243,230,205,119,110,218,180,137,239, 50,102, 50, 10,159, 63,
- 46,111, 65,129, 72, 36,130, 64, 32, 64, 72, 72, 8,238,223,191,175, 6,176,178,154, 6,125, 65,146,100,240,153, 51,103,146, 26,
- 53,176,239,215,166, 85,203,217, 75,151,248, 24,190,125,124, 27,203,215,237,164, 27,181,237,155,183,254,212,229,130, 60, 73,221,
-158, 10,233,251, 32, 29, 78, 53,184,156,200, 74,105, 90,191, 78,143, 86,174,205, 23, 45, 95,190,204, 40,252,241, 29,252,242,251,
- 94,198,217,173, 87,222,239, 23,174,228,103, 26,212,235,163, 76,127,247, 82,151, 58,244,247,247,223, 7, 96, 95,201,247,242,229,
-245, 89,189,141,110,220,174, 95,206,250, 83, 23,100,249,134,117,123, 85, 85, 94, 75,151, 33,157, 29, 44, 77,111,237, 88,243,131,
- 65,106,114, 2, 4, 2, 1, 36, 18, 9, 18,164,185, 88,177,245,172, 76, 67,211,253,190, 84,104, 25, 26, 26, 10, 52, 26, 13,118,
-237,218,133,132,132,132, 78, 0, 18, 94,191,126,189,119,212,168, 81,219, 91,180,104,209, 52, 60, 60, 60,170,176,176,112, 38,128,
-119,149,145,152,152,152,116,178,180,180, 36,158, 61,123,134, 31,126,248, 65, 61,107,214, 44,222,132, 9, 19,136,156,156,156,218,
- 90,178, 0, 0,246,246,246, 30,189,123,118, 68,151,222, 51,252,213,202,220, 71,177,239,142,250,179,152,167,194,218,214,167, 30,
-122,232,161,135, 30,255, 26,212, 46, 49,184, 7,192,105,108,142,233,205,237,121,169,199,126,155,197, 20, 68, 7, 48,138,151,251,
-152,252, 75,223, 51,215, 54, 76, 96,174,239,152,203,204, 24,208,156,105,106, 69,164, 54, 54,199,116,143,207,133,219, 39,171,123,
-127,211, 4,218,222, 13,193,244,110, 8,102, 64, 99,104, 1, 44,109,221,186,245,101,239,246,127,229,209,242,110, 15, 6,192, 15,
- 0, 36,149, 20,171,162, 21,195,109, 1,236,111,211,166, 13,249,224,193, 3,230,253,136, 94, 76, 96, 83, 11,102,230,204,153,204,
- 47,191,252,194,140, 29, 59,150,177,180,180, 36,139, 43,194,182, 58,206, 65,131, 6, 57, 0, 64,157, 58,117, 76,218,186, 52, 74,
- 13,185,119,149,121,116,108, 59,115,200,123, 40,211,161,133, 75,166, 77,211,110,193, 34,219, 38,173,170,169,190, 82, 78, 27, 27,
-155, 37, 12,195,244, 99, 24,198, 22, 0,156,157,205, 37,173,155, 54, 74, 9,190,123,149,121,124,124, 39,115,200,123, 40,211,177,
-101,179, 44, 7, 23,207,119, 66,171,166,237,117,225,172, 8, 21,150,215,181,105,166,117,163,206, 65, 85,148,183,148,179, 65,251,
-145, 87,146, 82,210,152, 23, 47, 94, 48,215,175, 95,103, 30, 63,126,204, 28, 59,115,133,169,219,110, 68,161, 69,139,193, 93,106,
-208,117, 42, 43,167,241,128, 1, 3,152,168,168, 40,166,127,255,254, 12, 0,227, 90,114, 94,142,141,141,101,194,194,194,152,165,
- 75,151, 50, 0,142,252,248,227,143,138,188,188, 60,166, 87,175, 94, 9,197, 2,139, 83,155,114, 58,213,183, 95, 63,100, 96,215,
-149,222, 63, 12,243,248,210,250,252,138,208,115,234, 57,245,156,122,206,127, 3,231,255, 50,108,139,173, 90, 37,239,173,117,202,
-163,229, 15,144,200,194, 62, 87, 43,205,137,117, 27,118, 44,216,181,239,200,162,197,179,167,138,187,186,247, 70,232,221, 63,112,
-193,239,140, 76,169, 82,111,224,177,177, 41, 44, 11,242,200,106, 74, 81,156, 71,235, 19, 4, 6, 6, 26,152, 53,252, 43, 7,211,
-135,162,220,172,123,107,120,130, 82, 0,211,222,188,121,179,201,211,211,115,237,247, 93,218, 15,245,238,220, 3, 90,173, 22,199,
-142, 29, 67,124,124,252, 69, 0,203,116,181,184,133,134,134,102, 54,107,232, 56,135,203,230, 44,154, 57,118,136,101,198,199,183,
- 72,138, 8, 4, 0,168, 84, 10,109,106,212, 35,183,154, 20, 78, 36, 18,189,176,180,180,124,111,105,105,153,211,184, 65,157,105,
- 2,112,151,207, 24,253,173, 85, 86,236, 59, 36,134, 23,121, 70, 85, 74,185, 38, 41,234, 65,211,218,180,174,163,163,163, 64,204,
-197,244, 10,203,171, 86,106,211, 62,188,107,165, 11,143, 92,165, 94,183,106,203,177, 62,107, 22, 77, 18, 24, 25, 25,225, 77,216,
- 7, 44,223,124, 74,166, 80,107,251,101,134, 94,254, 42,238, 49,134, 97,160,213,106,117,158,232, 80, 9, 22,187,185,185, 53, 89,
-187,118,173,243,196,137, 19,241,165,150,172,178,136,142, 77,246,177,175,227,212,236,195,251, 55,158,102, 34,222,137, 47,169, 79,
- 61,244,208, 67, 15, 61,254, 53, 24, 80,108,204,153, 86,230, 61, 16, 58, 62,245, 35, 44, 29,114, 0,171, 27,176, 11,247, 46, 89,
-187,101, 5,139,216, 58,137,102,152, 63, 72, 22, 86,197,100, 33,227, 11, 11, 39,231,114, 64,246, 25, 60,150, 3, 0, 92, 78,237,
- 6,200, 98, 68, 1, 24,118,224,233,203,118, 7,158,190,252,185,248,183, 53, 0,106,228,203, 53,228, 32,204,189,153,147,125,215,
-214,205,133,108, 74,129,164,136,143,200,150, 41,113, 39, 60, 62,151,197,176,254,168,105,161, 98, 98, 98, 30, 2,128,181,177, 65,
- 68,215,102, 13,235,118,107,211,220,128, 75,168,145,244,246, 13,242, 20,106,220, 14,143,207, 3, 65,212, 58,160,250,107,149, 55,
- 45,244,202,171, 63, 65,244, 34, 8,226,238, 82,239, 49,130, 21,155, 79,127, 85,145, 5, 64,158,156,156,156, 37,151,203,205, 83,
- 82, 82,212,168,125,146,184, 15,249,249,249, 45,230,206,157,187,122,225,194,133,139,126,251,237, 55, 94,109, 98,178, 42, 67, 78,
-114,252,165,110,205,191, 94,251,235,161,135, 30,122,232,241,175,192,180,114,239,208, 89,104,149, 10,134,116,100, 0,152,233,228,
-196,204,143,142,134,250,107,149,172, 34, 75,215, 23,226, 21,128,129,181, 62,154, 69, 20, 60,143,138, 47,124, 17, 21, 95, 8,154,
- 97,104,134, 81,177, 88, 72,148,105, 52,235,162, 98,146,107, 63,235,142, 32,168, 87, 31, 18, 20,175, 63, 38, 42, 25,154,102,104,
-134, 81, 19, 4, 82,181, 90,122, 93,120, 76,252,149,255,134,242,102,134, 94,126,234, 71, 18, 93,159,190, 8,155, 47,147,105,118,
-102, 70, 92, 14,248,138,237,162, 13, 13, 13, 29,215,169, 83,167,201, 20, 69,237, 5,160,253, 2, 46, 53, 73,146,139,215,175, 95,
-127, 49, 52, 52,244,108, 64, 64,128,244,107,136,172,191,181,253,245,208, 67, 15, 61,244,248,167,162,118,139, 74, 87,134,175, 41,
-178,254, 27, 17,246, 33,174,205,223,193, 27,254, 33,206,245,127,161,188,105, 17,151, 94,167, 1,163,255,166,234,189, 77, 81,212,
-237,175, 41,170,111,222,188, 89, 31, 21, 44,171,243,223,214,254,122,232,161,135, 30,122,252, 99, 49,173, 50,241,197,209,215,141,
- 30,255, 0, 48, 95, 75,100,233,161,135, 30,122,232,161, 71, 45, 80,169, 69,139, 64,229, 51, 7,238,214,224, 15,106, 51,251,224,
-174,158, 83,207,169,231,212,115,234, 57,245,156,122,206,127, 29,231, 63, 17,182, 40, 10,136,191, 86,252, 14,134, 97,246,255, 39,
-254, 88, 63,245, 85,207,169,231,212,115,234, 57,245,156,122, 78, 61,231, 63, 29,159, 5,194,151,164,119, 96,233,235, 70, 15, 61,
-244,208, 67,143,191, 17,130,226, 87,109,183,235,161,199,255,162,216, 42, 21, 92,181,137,209,106, 84,252,254,225,111, 44,172,183,
-173,173,237,180,150, 45, 91,186,240,120, 60, 86, 65, 65,193,170, 7, 15, 30,172, 44,191, 83,215,102,156,215,108, 22, 28,254,250,
-133, 0, 8, 54,192, 98,129, 98,144,244, 56, 68,209, 86,223,238,255,213,112, 20, 25, 89,254, 73,176,216,124,138,212,128,210,106,
- 80, 20,110, 85, 4,154, 38,227, 41,141,170,111,101, 7,219,184, 13,169, 75, 82,244,111, 0,179, 11, 96,253, 8,208,187, 9,112,
-102, 48, 32,247, 16, 96,255, 0, 54,243, 59, 40,226, 39, 14,151,189, 68, 26,120, 62,241,159, 80, 97,231,206,157, 99,127,201,241,
- 35, 70,140,168,112, 1, 81, 59, 59, 59, 63, 3, 3,131,134,149, 29, 39,147,201,164, 82,169,212,243, 31,222, 31,187, 1,216, 1,
-160,121,185,223,223, 1,152, 3,224,222,151,254,129, 7,192,177, 6,166,243,128,159, 0, 64, 3,252,158, 6,236,243,255, 47,138,
- 49,180,180,180,124,196,225,112,156,101, 50,153,172,160,160,192,201,208,208, 48, 90, 44, 22,139, 73,146,140,202,200,200,232, 86,
- 67,186, 31,241,215, 82, 90,139, 0,236,174,225,118, 61,244,248, 95,193, 23,205, 58,108, 92,116,127,128, 7,128,110,237,218,181,
-179,150,201,100,120,247,238, 93, 26,128, 71, 0,252,139, 95,145, 95,163,164, 44, 22,107,227,150, 45, 91, 22,204,154, 53,171,116,
- 49,232,144,144, 16,184,185,125,158, 35,148,205,130,195,131,171,119,173, 94,133, 70,162, 93,175,225,197, 66,139, 5,200,164,240,
-236,221,190,182, 69, 48, 52, 53, 53, 93, 69, 16,196, 8, 22,139, 85,237,160, 70,211, 52,197, 48,204,185,156,156,156, 21, 0, 10,
-106,242, 71, 98, 3,129,150,164,168, 10,255,131,195,102, 83, 50,185,170,210,180, 23,102,102,102, 1, 44, 22,171, 65,217, 5,179,
-129, 79, 23,208,174,108, 27, 73,146, 73,153,153,153,186,136, 80, 33,139,195,155, 67, 16,188,222, 96,209,141, 1, 2, 4, 88,145,
- 52,165,190, 67,147,154,109, 0,148, 95, 34,178,108,235, 56, 61,158,183,108,189, 67, 88,196, 59, 44,245, 30,139,223,118, 28,193,
-146, 57,147,177,109,255, 41,204,153, 54, 6,205,154, 53, 71, 85,203,138,211,224,173, 91, 54,123, 68, 47,223, 93,103,221,151,204,
- 28, 33,240,221,117,174,235, 82,239, 81,252,117, 59,207,118, 93,234, 61, 82,224,187,243,172,251,146,217, 35, 68,235,118,159,167,
- 1,140,175, 77, 33,199, 56,219,201, 8,146,172,240,105,155,225,112, 84,167,162, 82,196,255, 31, 87,244,196,137, 19, 91, 42, 20,
-138, 55, 99,123,183, 94,223,170,177,125,114, 69,251,100,165, 38,219, 71,191, 15,244,225,242, 68,109,190,245, 57, 18, 82,165,201,
- 65, 32,104,240,238,221, 59,103,154,166, 65, 81, 20, 72,146, 44,125, 87,171,213,232,214,173,219,215,154, 56, 51, 16,192,170,162,
-139, 21,190, 0,206,126, 1,151,132,195,225,204,227,243,249, 30, 36, 73,186, 0, 0,151,203,141, 80,169, 84,254, 36, 73,110, 1,
- 80, 88, 67,190,173,201,201,201,205, 36, 18, 9, 52, 26, 77,233, 2,244,108, 54,187,105,221,186,117,119, 41,149, 74,231, 47, 61,
-121,107, 96,122,103,119,247,109, 19, 22, 44, 96, 43, 30, 61,194,182,195,135,183, 34, 63, 31, 0,118, 85,119, 44,159,207,191,197,
- 98,177, 28,107,242,127, 52, 77,199,171,213,234,190, 53, 57,134,195,225, 56,167,164,164, 88,217,217,217,161,160,160, 0, 98,177,
- 88, 92,242,189, 22,150,172, 13, 12,195,136,138,239,237,219, 58,118,236,216,137, 32, 8, 18, 0, 67,211, 52,235,197,139, 23, 99,
-104,154,230, 20,223,159, 54, 0, 56, 12, 64,165, 31,179,245,248, 31,181,102,237,175,169,208,186, 14,192,163, 93,187,118,162,209,
-163, 71,195,195,195, 3,206,206,206, 16, 10,133, 69, 55,241,172, 44,235,160,160,160,145,143, 30, 61, 26,121,245,234, 85,188,125,
-251, 86, 1,224, 9,128, 10, 47,234,158, 94,238,179,132, 18,193,118, 0,200, 72,202,146, 38,197,164,111,151, 74,165, 27, 0,148,
- 77, 17,238, 52,126,252,248,249,179,103,207,134,159,159, 31, 78,157, 58, 5,149, 74,133,130,130, 42,244,139, 60, 29, 57,247,215,
- 3,226, 88, 32,193, 31, 48,176, 2,196,214,181,174, 41, 83, 83,211, 85,115,230,204,153,219,172, 89,179,210, 44,230, 90,173, 22,
- 36, 73, 66,171,213, 34, 39, 39, 7,243,231,207, 47, 26,104, 25, 6, 52, 77,227,198,141, 27,179,166, 77,155,134,156,156,156,121,
- 21,113,118,108, 83,231, 53,139, 96, 57,148,216,106, 24,138, 74,122, 30,148,212,150,164, 40,182, 82,169,169,112,165,114,161,144,
- 87,165,200,227,114,185, 14,111,255,252,211,138,197,231,131,161, 40,128,166,193,208,116,113,117, 22,191,152,162,223, 24,138, 6,
-163,165, 64,147, 52, 72,133, 10,237,127,252, 81,151,170,232,204,229,139, 78,141,251,126,129, 77,135,142, 29,185,245,234,216,129,
-164,104,124,140, 77,178,121,243,250,121,151,115, 71,119,205, 80, 43, 10,198, 0,168, 85,158, 45,190,129,209,237,157,123, 14, 56,
-188, 10, 10,195,189, 7,143,112,247,190, 63, 0,224,214,131,128, 18,193, 93,109, 83,129, 44,108, 49,103,202, 96,193,250,157,167,
-185,115,166, 12, 97,255,182,243, 12,119,246,228,111,217,235,183,159,226,205,158,252, 45,123,253,142, 83,188,217, 83, 6,179,125,
-183, 29,106, 9,192, 20, 64, 78,101,100,149,181, 17, 65,146,130, 19,209,105,108, 0,200,216,187, 23,218,244,116,216,173, 88, 1,
- 0, 24,231,100,173,179,187,195,194,194,226, 53,151,203,117,168,110, 63,173, 86, 91,173, 8,158, 56,113,162,155, 66,161,120, 77,
-146, 36,195,225,112,124,198, 14,233,115,185, 95, 87,183,172,178,251,132,132, 4,155,175, 91,247,231,224,179,111, 10,152,145,109,
- 12,223,248,109,156,216,214,107,225,145,224, 42, 6,100,150, 74,165, 66, 84, 84, 20,202, 46,242, 94, 6, 84,109,159,157, 0,108,
- 51, 55, 55,239,144,149,149, 53, 14,192,210,252,252,252,150,108, 54, 27,102,102,102, 75,213,106,245, 71, 99, 99,227,131,121,121,
-121, 1,197, 86, 35, 93,151, 12,232,102,100,100,116,236,210,165, 75,166,173, 91,183,102,101,102,102,162,126,253,250,200,206,206,
-110,255,232,209,163, 54, 83,166, 76,153, 82, 80, 80,240, 93,241,195,160,174,104, 98, 96, 96,192, 76,152, 48,129,160,168,191, 78,
-247,208,161, 67,232,235, 74, 54,180, 52, 49,144, 43,213, 76,222,189, 40,227, 31,120, 60,222,147,248,248,248,188,154, 86, 6, 15,
-248,105,194,130, 5,108, 73, 92, 28, 36,193,193, 24,151,159,207,249,173,200,186, 85,173,208, 98,177, 88,142,199, 78,253,225,204,
-231,243, 65,146,100,169, 24, 44,185, 71,105,181, 90,104, 52, 26,104,181, 90, 80, 20, 5,173, 70, 11,223, 53,191,215,250, 94,104,
- 96, 96, 96, 96,107,107,155,102, 96, 96, 96,240, 53, 70, 33,129, 64,192, 57,122,244,232, 24, 62,159, 15, 0, 80,171,213,112,117,
-117, 37,244,227,179, 30,255, 48,177,245,153,149,171, 42,161,213, 63, 63, 63, 31, 20, 69,193,208,208, 16,108,246,167,227,190,185,
-185, 57,122,247,238,141,110,221,186, 97,244,232,209,120,251,246,173,104,244,232,209,189, 43, 35, 27,187,192, 11,117,156,173,139,
- 7, 19,218,246,233,181,160,245,135,126, 61,111,153,154,154,186,160,204,110, 83,166, 79,159, 78,100,101,101, 97,196,136, 17,143,
- 84, 42,213, 32, 0,249,149,113, 82, 52,146, 60, 71,143, 3,205, 16,162, 45, 47, 14, 16,106,165,130, 97,177, 88,138, 18,215, 97,
-109,106,137, 32,136, 17,118,118,118, 56,125,250, 52,212,234,207,211,133, 25, 25, 25, 33, 60, 60,252, 47,171, 26,155,141,142, 29,
- 59,178, 9,130, 24, 1, 96, 94,197,156, 44,135,167,175,226,172, 74,190,123,245,110,206,235,216,134,149,150,146, 38, 99, 0, 16,
-203,150, 45, 43, 21,110, 0,176,106,213, 42, 93,202, 9, 22,151,139, 12,127,255,191,110,196, 28, 22, 88, 60, 2, 4, 23, 96,113,
-138,188,168, 96, 0,134, 2,104, 18,160,181,128,208,182,142, 46,213,208,222,190,174,179,223,186,205,187, 77, 84, 90, 6,167,175,
-220, 67,108,108, 12,216, 44, 22,156, 26, 58,163, 79,247,174,220, 54,237, 58,213,249,125,229,130,171, 41, 9, 31,250, 3,120, 89,
-227,138,166, 25, 97,195,186, 22, 56,120,232, 13, 44, 77, 37, 24, 49,248, 27,136,132, 2,252,182,227, 15,172, 89,226, 13,103, 39,
- 71,236,219,186,182,210,195,141,141,141, 87,187, 56, 55,116,220,125,244, 26, 92,154, 54,101,239, 62,118, 13, 46,205,138,223,155,
-187,176,119, 31,187,134,102,205,155,177,119, 31,187,134,150,205,155,212,123, 45,125,177, 58, 59, 59,219,187,242,250, 44,215, 70,
-125,138,218,136, 91, 72,151, 14, 4,113, 51,102, 0, 64,169,208,170, 9,184, 92,174, 67, 74, 74,138, 85,117,251, 85,103, 53, 40,
-182,100,189, 38, 73, 18,233,233,233, 68,110,110, 46, 99, 98, 98, 50,248,230,190,165,151,250,186,187,101, 3, 64,112,112,176,153,
-175,239,186,193,103, 94,231, 67,241,124, 39,113,226, 79,127,122,220, 32,143,215, 87,214, 79,108,131,226, 37, 33,202, 67,165, 82,
-197,182,106,213,138, 41,254,108, 47, 16, 8,120,229,250,155, 93,163, 70,141, 62,179, 90,235,224, 82,220,246,236,217, 51,239,102,
-205,154,161,105,211,166, 1, 29, 58,116, 48, 18,139,197,184,121,243, 38, 92, 92, 92,154, 27, 25, 25,189, 56,119,238, 28,119,241,
-226,197,110,135, 15, 31, 6,128, 89, 58, 84,103, 47, 79, 79,207,211,126,126,126, 66, 30,143, 7,133, 66,129,240,240,112, 24, 27,
- 27,131,207,231,227,219,111,191,101,119,233,210,197,188,123,247,238, 23, 34, 35, 35,199,160, 6, 51,160,148, 74, 37,179,116,233,
- 82, 24, 24, 24,192,192,192, 0, 98,177, 24, 98,177, 24, 18, 33,136,189,115,234,138,102,239,207, 21,205, 91,177,119,253,177,221,
- 43, 31,212,169, 67,255,146,152,152,152, 91,211,190,160,120,244, 8,146,224, 96,160,204,181,171, 43,140,197,102,240,241,241,169,
-206, 34, 5, 30,143,135,206,157, 59, 87,203,103,102,102,118,145,195,225,124,242,100, 74,146,164,208,199,199,135,138,140,140, 20,
-179, 88, 44, 49, 77,211,240,241,241,161, 72,146, 20, 90, 89, 89, 5,208, 52,157,150,153,153, 57, 84,135,226,170, 0, 44, 98,177,
- 88,219, 4, 2, 1,167, 94,189,122,241,203,151, 47,127, 86,108,205, 4,195, 48,172,122,245,234,181, 23,137, 68,142, 42,149,138,
- 68,145,235, 80,111,205,210,163, 66, 48, 12,211,166,200, 40, 92, 10, 53, 0,126,241,231,172,162,209, 14, 22,229,126, 7,128,204,
-226, 7, 69,235, 74,190,103, 1,120, 11,160, 9, 0,171,226,109,175, 8,130,200,174, 69, 49, 43,183,104,249,249,249,149, 62,194,
-122,121,121,149, 14, 44,134,134,134,120,245,234, 21, 8,130,128,161,161, 33,140,140,140, 96,108,108,140,252,252,124,188,125,251,
- 22,239,222,189, 67, 92, 92, 28, 8,130,128,147,147, 19, 74, 46,160, 50, 40,189,193,157,220,228, 7,161, 68, 0,130, 0, 90,247,
-104,137,150,221, 92,209,238,101,244,156,215,119,137,253, 82,169, 52, 10, 0,199,213,213,117, 74,199,142, 29,177,121,243,102,168,
- 84,170,205,149,136,172, 82,206,199,111,201,182, 0, 96,107,107,187,240,248,205,143, 6,227,251, 53,148, 75,165,210,141,181,168,
-156, 79,110,196,153,153,153, 58,175,197, 71,211, 52,114,114,114,170,228, 44,111, 33,216,178,109,167, 73, 65, 94, 26,126,253,237,
- 56,180, 90, 45, 22, 44, 88, 0,154,166, 75, 95,185,185,185, 58,149,147,161,168,207,109, 7,172, 34,239, 41,193, 1,234,142, 42,
-210, 21, 9,167,119,130, 96, 0,130, 2,240,249,121,149, 31,132,132,108,158,232,204,202,223,182,155, 4,190, 75,194,149,123,129,
-208,228, 39, 67, 26,124,169,200,228,216,121, 12,206,170,216,232,208,178, 33,230, 46,251,221,244,231,185,223,157, 81, 43, 10,154,
-226, 83, 55,226,221,234, 47, 26, 10,191,174, 94,141,253,219, 55,227,247,205,219,145,159,151, 11, 46,215,162,248, 70, 79,129,162,
-168,170,207,157, 97,250,249,204,153, 68,252,182,231, 34,218, 55,179,197,133,155, 47,225,222,202, 17,151,110,191, 70,183, 54,245,
-113,229,110, 32,122,116,104,136,235,254, 97,152, 59,125, 12, 49,230,214,225,126, 53,105,163,173, 91,119,154, 20,228,167,193,111,
-237, 81,164,239,218,133,120,111,111,180, 47,222,231, 37, 65,128,231,224, 0,240,170,111,163,242,136,136,136,128, 74,165,170,232,
-105, 31, 46, 46, 46,213,182,187, 66,161,120, 67,146, 36,147,150,150, 70,164,165,165, 65, 44, 22, 19,225,225, 97, 84,243,230,174,
- 67,152,119,231, 15, 0,128,175,239,186, 33,103,223,228, 67, 30,176, 29,138,103, 59,192,171, 31,194,218,191,106,186,102,218,138,
-125,111,202, 92,163,159,148, 51, 53, 53,181,127,106,106, 42, 0,160, 65,131, 6,239, 34, 35, 35,155,148,184,154,139, 93,136, 60,
-146, 36,157, 75,220,137, 36, 73, 66,165, 82,161, 87,175, 94,236,170,206,221,212,212,180,163,139,139, 11, 2, 3, 3,177,125,251,
-118, 51, 79, 79, 79,124,248,240, 1, 4, 65, 96,221,186,117, 68,179,102,205,184,153,153,153,232,219,183, 47, 46, 94,188,216, 57,
- 63, 63,191,186,250, 52, 20,139,197,135,175, 94,189, 42,100,177, 88, 40, 40, 40, 0, 77,211,232,210,165, 11, 88, 44, 22,194,194,
-194,176,108,217, 50, 92,188,120, 17,151, 47, 95, 22,181,105,211,230,176, 92, 46,119,193,167,110,253,202,218,136, 81, 42,149,140,
- 64, 32,128, 64, 32,128, 80, 40,132, 80, 40, 4,159,207, 71,161, 18,152,182, 37, 94,197, 22, 90,208,205, 91,185, 55,156, 52,123,
- 29,107,227,242,201,247, 1, 92,209,181,207, 3, 69, 49, 89,219,254,248, 99,251,184,188, 60, 22, 0, 28, 36, 8, 90,195, 48,191,
-235,114,189, 3, 64,161, 50, 15,142, 78, 14,184,112,230, 50,134,141, 26, 92,161,200,226,114,121,224,113,185, 48, 50, 19, 87,203,
-201,227,241,172,223,189,123,103,206,229,114,193, 48, 12, 40,138,130, 70,163, 73,251,249,231,159, 45, 7, 12, 24, 96,120,227,198,
- 13,214,128, 1, 3,104, 83, 83, 83,217,203,151, 47,211, 73,146, 52,239,218,181,107, 77,250,252,238,150, 45, 91,182,190,116,233,
-210,100, 31, 31,159,215, 11, 23, 46,252,181,236,198, 13, 27, 54,172,190,126,253,186,227,144, 33, 67,142, 5, 7, 7,239,174,201,
- 61,228, 75,239,243,122,206,255, 62,206,202,180, 72, 49,172, 9,130,240, 43,115,207,246, 42,249,238,227,227,179,212,215,215, 55,
-156, 32, 8,191,178,191,151,236, 87,252,176,232, 87,209,247,226, 99,205,150, 44, 89,226,186,126,253,250,117,157, 58,117, 58, 29,
- 16, 16, 16, 3,160,166, 66,171,234, 24,173,146, 19, 42,123,146,229, 6, 53,228,231,231, 35, 63, 63, 31,137,137,137,216,187,119,
-111,241, 5,205, 5,135,195, 1,135,195, 41,141,103,168, 12,247,252,158,236, 0,176,163,117,235,214,220,208,103,231,110,252,180,
-127,118,207,182,189, 90,179,223,220, 11, 29,142,162,245, 8,251, 79,152, 48,193, 2, 0,142, 30, 61,154, 9,224,198,255,147,106,
- 62, 23, 21, 21, 53,215,214,214,182, 52, 70,165,172,251,144, 36, 73, 8,133, 66,148,196,178, 40,149, 74,236,221,187,151,100, 24,
-230, 92, 21,156,136, 12,191,143,168,240, 7, 69,199,209, 52,104,234,175,227, 87,174, 92, 89, 58, 13, 20, 0,102, 20, 91, 78,170,
- 21,121, 21,213, 57, 83,238,189,220,239, 12, 69, 85,227,158,224,205, 30,254,157,183, 45, 77,112,240,231,253, 32,112,185, 92,208,
-101,172,153, 92,118,209,211,114,248,135, 20,216, 89, 55,199,160, 49,211,109, 46, 29,219, 57,155,212, 40,127,171,105, 93, 55,109,
-217, 9,115,230,206,197,129,253,251,177,108,197,234, 82, 5, 64, 82, 20,200,106,203,201, 98,245,234,226, 10,178, 48, 5,108, 54,
- 27, 61,218, 55, 4,155,205, 70,239, 78,141,193,102,179,209,183, 75, 83,112, 56, 28,244,115,111,134, 70,141, 26,129,195,225,176,
-170,105,119, 68,134,223, 67, 84,248,195, 50,162,151, 1, 3, 64, 35,149,126,182,191, 86, 42, 5, 83,215,188,166,125, 11, 83,166,
- 76,201, 77, 76, 76,212,148,223, 86,167, 78, 29,222,163, 71,143, 76, 42,113,219,149, 66, 36, 18,181,225,112, 56,111,178,179,179,
-105, 3, 3, 3, 22, 77, 83,116,243,230,174,236,155,251,150, 94, 42,217,103,201,146,165,151, 70,182, 49, 26,114,252,156, 31,195,
-171,231, 78, 16, 92, 1,249,253,138,125, 60, 46, 79,212, 6, 80,232,242,240,192, 82,169, 84,120,255,254, 61,170, 43, 15,195, 48,
- 85,186,126,114,114,114, 38,184,184,184, 60,218,177, 99,135, 25, 65, 16,120,252,248, 49,216,108,118,233, 43, 58, 58, 26, 44, 22,
- 11, 63,253,244,147, 38, 63, 63,127,106,117,101,227,112, 56,115, 47, 92,184, 96,204,231,243, 81, 80, 80, 80,122,221,176,217,108,
-188,123,247, 14, 27, 55,110,196,132, 9, 19,144,144,144, 0, 59, 59, 59, 44, 88,176, 64,178,126,253,250,185, 26,141,102,181, 14,
- 77, 20,162, 86,171,219, 26, 24, 24, 64, 40, 20,162, 68,112, 1,192,237,112,110,152, 66,161,104, 97,110, 46,183,177,244,247,251,
-179,179,231, 32, 55,115, 75,219, 78, 82,169,244, 74, 77,250,192, 71, 96,127, 44, 69,253,220,255,210, 37,171,167,151, 46,209,207,
-175, 94, 77, 18, 20, 20,236,211,185, 15,105, 89,136,143, 78, 66,155, 54,109,240,230,205, 27,180,105,211,166,172,104, 2,159,207,
- 7,143,199, 3,143,199,131,133,169, 78, 33, 20, 12,139,197,194,211,167, 79, 65, 81, 20,212,106, 53,212,106, 53,154, 53,107,150,
-253,224,193, 3, 9, 0, 68, 71, 71, 51,227,199,143,207,125,241,226, 5, 90,181,170,122, 61,117,107,107,235, 71,108, 54,187, 94,
-217,223,178,178,178, 76,135, 14, 29,138,156,156,156,111,134, 14, 29,234, 94,124,253, 38,159, 63,127,126, 60, 0,240,249,124,176,
- 88, 44, 10,122,252,235, 81,157, 22, 41, 43,148,202, 11, 46, 95, 95, 95,175,242,191,149, 21, 85, 21,125, 46,123,236,250,245,235,
-215,149,225, 86,212,162,248,213,199,104,249,249,249, 49, 21, 40, 72,157, 81,157,208, 42, 65, 96, 96,160,214,206,206,238, 64, 84,
- 80, 92,207,134, 45,157, 32, 18, 11,250, 0,216, 33, 16, 8,230,127,247,221,119,120,254,252, 57,194,194,194, 14,225, 11,103,225,
-184,186,186,222, 18, 8, 4,142,149,184, 73,226,195,194,194,250, 86, 50, 48,172,184,122,245, 42,170, 10,134,191,127,255,126,217,
- 65,169,108, 48,124,197, 29,131,102,160,213,104, 33,147, 43,254, 26,196,139,133,150, 76, 38,195,168, 81,163, 62,177,104,165,167,
-167, 87,123,126, 4, 65, 96,227,149, 43,184,115,238, 28,190,113,115,195,197,151, 47,177,254,187,177,104,234,104, 15,134, 34,192,
- 16, 64,194,169,157,200,202, 47,196,201,123, 79,145, 93, 32,199,184,174, 93,225,108,100, 81, 53, 47,151,215,187,125,199, 78,188,
-187, 1,111,193,229,114,192, 2, 13, 70, 43,135,157, 75,119,176, 89, 44, 24, 91,215, 7,143,203, 5,151,203, 65,116, 98, 38, 92,
- 92,219,241,253,248,194,222,181, 17, 90,117, 28,235,131,162, 40, 76,152, 48, 1,167, 79,159,134,185,141, 35,140,235,184, 98,205,
-230,253,248,166, 87,215,106,207,191,228, 9,158,195,225,128,205,102,127,246, 94,242, 89, 23,235, 36, 67, 51,208,148,111, 35,154,
- 1, 24, 6, 14,107,215,194, 97,237, 90,188, 44,254,207,102, 50, 25, 20, 10, 5,208,161,121,141, 68,150, 90,173, 70, 98, 98,162,
- 38, 53, 53,213,186,130,237,105,106,181,186, 90, 97,115,228,200,145,144,137, 19, 39,182, 53, 51, 51,123, 29, 18, 28,172,109,233,
-230,198,189,177,119,233,229, 18,183, 33, 0,184,185,185,101, 47, 93,186,244,242,248, 17, 94,131,119,251,140,166,126, 92,125,140,
- 35, 16,137,218,122, 45, 60, 18,114,106,196,136,234,253, 61, 42, 85,108,203,150, 45, 25, 93,206, 75, 46,151,167, 86,177,121, 32,
-128, 85,173, 91,183, 54,242,244,244,196,163, 71,143, 48,108,216, 48,149, 70,163,137, 2,128, 1, 3, 6, 52, 62,121,242, 36,255,
-237,219,183,176,180,180,228,198,199,199, 31, 70, 53, 1,242,124, 62,191,123,187,118,237, 88, 42,149,234, 51,145,181,126,253,122,
-140, 25, 51, 6,141, 27, 55, 6, 77,211, 40, 44, 44,132,167,167, 39,119,251,246,237,221,117, 20, 90,115,154, 54,109,186, 17, 69,
-179, 14,203,222, 11, 35, 80,228,214, 66, 86, 86, 86,106,208,139,123,225, 93,123, 13,109, 91,175,145,171,109, 88,200,155, 42, 9,
-173,172,172,150,176, 88,172,145, 52, 77,179,243,243,243, 19,131,212,234, 70,205, 28, 29,173,187, 12, 30,140, 60, 46,151,189,237,
-222, 61, 86, 90, 65,129, 4,128, 78, 46, 72,165, 86, 6, 71,167,162, 80,191, 97,163, 6,227,205,155, 55, 24, 62,122, 8,120, 60,
- 30, 56, 28,110,209,181,201, 43,178,104,153, 88, 24,233,212, 55,181, 90,109,233, 61,188, 36,206, 75,163,209,160, 36, 52,203,192,
-192,160,116,155, 74,165, 2, 65, 16, 85,245, 13,231,179,171,151, 91,137,140,140, 65,105,181,104, 62,120,120,105,159,126,113,112,
-183, 8, 52, 45,202,141,143,197,172,115, 87,185,208, 67,143, 74,172, 90, 85,105,145,178, 66,233, 75, 65, 16,132,159,143,143,207,
- 82, 0,140,143,143,207,210,146,239,190,190,190, 10, 0,201,181, 20, 91,159, 89,185, 56, 95, 67,100,149,184, 23,170,130,167,167,
-231, 44, 67, 67,195,237, 37,223, 19,159, 39, 35,241,121, 50, 92,154, 52,239,210,218,173,109,222,152, 49, 99, 96,110,110,142,133,
- 11, 23, 50, 0, 14,213,244,255,163, 35,195, 37, 0, 24, 91, 91,219,133,197, 55,100,183,151, 47, 95, 90,190,122,245, 10,237,218,
-181,251,203,116,175,209,192,221,221,189, 42,170,130,226,160,246,121, 95,207, 74, 70, 67,163,209, 64, 46, 87, 64,173,214,128,212,
-210, 32, 73, 18,109,154, 27,226,216,126,159,162,223,200, 18,235, 89,145,213,204,193,198, 16,134, 18,174,150,197, 34, 20,175, 67,
- 82, 43,188, 99,170,213,106,132,196,199, 35, 56, 46, 14, 0, 48,200,183,234,192,215, 99,247, 30,161, 89,179,102,213,149,182,161,
-131,157, 13, 82,238,132, 20,221,188, 21,137,120,245,228, 44, 12, 13, 37, 0,128,230, 30,227,192,227, 21, 9, 45,153, 66, 3,139,
- 38,117, 64, 48, 76,165,105, 1, 12, 76,109,110,113,120, 66, 71,134,162,193, 48, 52, 24,154, 2,195,208, 96,115,121, 6,179,102,
- 76, 6, 77, 83,104,223,190, 61, 8, 54, 27,148, 86,133, 17, 3,123, 35, 39,175, 0,230, 38,186, 13, 18, 60, 30, 15, 30, 30, 30,
-162,202,182,127,248,240, 65, 81, 86,152, 85,221, 70, 90,200,100, 10,168, 84, 42,104,212, 36, 52, 90, 18, 84, 3, 30,126,253,121,
- 44, 72, 13, 9,249,232, 78,208,104, 73,208,115,135, 64,163,214, 34,193,128,197,106,233, 98,161,101,129, 80, 4, 69,100, 24, 85,
- 39,180, 74,196, 65,101,168, 40, 38,176, 18,177, 21, 60,113,226,196, 54, 45,221,220,222,140,236,229,182, 41, 52, 44, 60, 37, 52,
- 44,252,179,253, 28, 27,187,197,254,184,254,244, 2, 46, 79,212,198,107, 97,213,179, 14,203,162,172, 27,241, 11,177,180,160,160,
-160,165, 68, 34, 65,100,100, 36,216,108, 54, 8,130,248, 0,160, 37, 0,216,218,218,126,228,112, 56, 78,108, 54, 27,187,118,237,
- 34, 56, 28, 78,139, 78,157, 58, 45, 85, 42,149,103,171,120,160,115, 49, 52, 52,252,196,154,197,227,241,224,227,227,131,241,227,
-199,151,138, 44, 30,143,135, 35, 71,142,160,109,219,182, 80,171,213, 46, 58,150,247, 21,128,174, 58, 88,252,136, 98,113, 94,173,
- 24, 37, 73,114, 98,214,200,145,141,224,239,143, 46, 78, 78,205,218,180,105, 3,141,230, 47,131,166,147,147, 83,157,130,130,130,
- 84,133, 66,113, 2, 69,169, 13,130,170, 20, 69, 74, 26,241,209, 69,225,167,111,222,188, 65,251,246,237, 75, 45, 88,101,173, 89,
- 60, 30, 15, 34,190,164, 70, 66,139,166,139,238, 75, 5, 5, 5, 44,127,127,127,139,166, 77,155, 18, 0,208,180,105, 83, 34, 40,
- 40,200,204,192,192, 32,179, 97,195,134,213, 62, 0,139,140,140,113,100,226, 40, 0,192, 47,189,250,149, 62, 24,221, 92,181, 20,
- 92, 46, 23, 61, 23, 46,253,172,223,211, 52,205,134, 30,122,145,165,131, 22,249, 90, 34,171,188, 69,203,215,215, 55,220,215,215,
-247, 51,235, 88, 13, 81,189, 69,171,172,233,174,166, 40,185, 88, 43,195,230,205,155,209,162, 69,139, 42, 7,162,237,219,183,227,
-248,241,227,155, 1, 68,215,216,228,216,179,117,115,108,185, 20,238,212,184, 57, 1, 0,171,231, 14,100,201,100, 50, 60,125,250,
- 20,198,198,198,248,240, 65,231,180, 95,134,198,198,198,171, 88, 44,214, 8,118,249, 25, 0, 21, 11, 76,138,166,233,115,121,121,
-121,149,166,119, 96, 24, 64,163, 37, 33,147, 43,161, 86,171, 49,247,167,157,213, 22,194, 23, 32, 52,234, 2,142, 71,183, 78,162,
-202, 44, 58,237, 91,116,199,204,239, 36,159, 13,222,108, 22,192, 98, 1,173,218, 23, 89, 92,130, 94,134,131,166, 1,138, 6, 44,
-172, 76,113,232,212,166, 42, 69, 62, 73,209,197, 79,199, 20, 10, 85, 20, 92, 58,122, 33, 41,194,191,212,130,196,231, 21,185,140,
-121, 92, 46,104,134, 40,202,250, 80,153, 16,226,139, 28,115,164,209,206,251,253, 66, 49,205,171, 5,206,223, 13,193,240, 94, 45,
-241,224,197, 91,120,118,104,134,240,168, 56, 52,119,174,135, 93,135,207,129, 97, 80,176,103,203,154,212,191, 6, 52, 50, 94, 23,
-139,214,243,231,207, 21,229,173, 88,101,223,153,234,199, 67, 48,204, 95, 22, 45,133, 82,133,133, 75,116, 74,231, 83,212, 70, 93,
- 59,138,116,217,185, 42,139,149, 46, 66,172,188,101, 11,213,164,103,105, 0,160, 45,176,248,255,243,198, 73, 81, 20,174, 93,187,
- 86,218, 30, 21,181, 99,217,182,211, 65,228, 32, 62, 62, 30,225,225,225,232,216,177, 35,242,242,242,192,101,177,176, 32, 52, 20,
-205,190,251, 14,106, 30, 15, 52, 77,131,207,231, 99,250,244,233, 58,215,103, 13,239,206,197,193,220, 84,117,228,155, 58,117,234,
-212, 40, 82, 38, 67,248,187,119,232,181,114, 37, 0,224,250,245,235,159,244,137,249,243,231,243,223,190,125, 59,229,245,235,215,
- 83, 82, 82, 82, 54, 3, 88, 80,233,125,150, 81,149,198,104,141, 28, 59, 12,141,154, 54,192,241, 63, 78,149,110,159,191,104, 14,
-184, 92, 30,184, 60, 46, 76,140, 77,116, 58, 27,173, 86, 91, 42, 90,229,114, 57,235,250,245,235, 14,189,123,247,230,205,153, 51,
-135, 0,128,227,199,143,179,118,236,216, 33,190,115,231, 14,207,222,222, 94, 90,173,184,212,104, 62,107, 99,130, 32,192,229,114,
-193,227,243, 0,154, 6, 65, 16,226, 13, 27, 54,172, 14, 15, 15,111,215,180,105, 83,168, 84,170,239, 80, 52, 81, 67,159, 71, 75,
- 47,182,170,212, 34, 21,197, 90, 21, 91,165, 42, 67, 70,217,184,173,202,132, 90,217,152, 45,212,110, 82,134,110, 49, 90, 21,129,
-205,102, 87,107,173, 98,177, 88,213,186, 14,231,207,159, 15, 67, 67,195,202, 6, 32, 38, 52, 52,244,173, 84, 42,221, 15, 96,103,
-173, 26,231, 94, 96,248,170,121, 67, 10, 80,236, 91, 53, 49, 49,201,236,209,163, 71, 33, 0,205,217,179,159, 62, 32,171, 84,170,
- 74, 7,112, 99, 99,227, 85, 7, 15, 30,156, 61,120,240, 96, 86,249, 20, 3,101,221,123, 37, 47,173, 86,139,179,103,207,206, 94,
-188,120, 49,242,242,242,230, 85, 53,136,203,101, 10, 40,138, 3,161, 63,134,157,215,245,166, 94,233, 38,137,137, 45, 28, 26,180,
-172,116, 48, 97,241,138, 98,136,172,235,254, 53,128, 25, 26, 10, 65, 85,193, 73, 16,172,232,184,132, 20,251, 58, 54,102,248,152,
-152, 1,235,122, 45,144,147,252, 87, 61,112, 56,108,112,139, 93,135, 38, 70, 98,100,164,167,131,197, 98, 87, 41,140,215,156, 12,
-196,139,176, 56, 92,184, 27, 4,141, 82,134, 45, 71,111, 66,163, 42,132, 70, 41,131, 70, 89,244,190,110,241,247, 32, 8,164,106,
- 85,178,198, 53,105,119, 14,135,131, 14, 29, 58, 84, 42,116,146,147,147,117,180,104, 49,165, 22, 45,133,178,134,109,164,219,147,
- 83,149, 22,171,146,237,181, 21, 6, 37, 41, 31, 68, 34, 81,219, 35, 71, 42, 79,227, 80, 17,108,108,108,110, 72, 36,146,250,186,
-238, 95,131,228,165,235, 76, 76, 76, 86, 53,109,218,212,101,203,150, 45, 92, 54,155,141,158, 61,123, 54,182,177,177,137, 7,128,
-230,205,155,219,149,220, 99,126,252,241, 71,230,249,243,231, 97, 69,207, 24,149,131,207,231,191, 51, 54, 54,110,235,233,233,137,
-188,188, 60, 36, 38, 38, 66, 44, 22,163,217,166, 77, 8,253,241, 71,184,237,221, 11, 86,143, 30, 32, 8, 2,124, 62, 31,161,161,
-161, 16,137, 68,239,148,202, 74, 83,190,117, 0,240, 59,128, 46,248,203, 93,200, 0,120,138,162,180, 11, 47, 42,184,223,177, 0,
-128,162,233,234, 26,107,236,194,133, 11,145,203,229, 2, 3, 6,128, 23, 29, 13,141, 70,131,142, 29, 59,150, 90,217, 59,118,236,
- 8, 14,135,131,150, 45, 91,194,206,206, 14,187,118,237, 26, 91,149,208, 82, 22,106, 16, 31,157,132, 78,157, 58,149, 90,174, 6,
- 12, 24, 80,106,209,226,114,185,165,150, 45,130,170, 94,184, 18, 4,193,148,125, 72,166, 40,138,224,112, 56,156,121,243,230, 17,
-195,134, 13, 99,212,106, 53,205,231,243, 89, 23, 46, 92, 32, 30, 60,120,192,145,201,100,213, 62,136,187, 14, 25,129, 95,122,247,
- 47,186,246,235, 91,130,203,227,130,207,227, 97,225,187,164,210,118, 49, 58,114,154,191,126,253,250,225, 77,155, 54, 45,114,195,
- 3, 28,125, 30, 45, 61,170, 49,244,100,148, 19, 73,234, 50,223, 51, 0, 16,197,223, 51,202, 8,170, 12,130, 32, 94, 49, 12,211,
-174,220,190, 37,219,213,229,222, 75,182, 7,215,162,248, 37,107, 29,126, 38,190,170,122, 34,142,122,246,236,153,115,155, 54,109,
-144,144,144,240,217, 76,184,146,129, 75, 44, 22, 67, 36, 18, 33, 32, 32, 0, 0,162, 42, 35,123,240,224,193, 14, 20,101, 93, 46,
- 42,145,173,109, 39,207,145,221, 3,218,247,107,135,147,190,167,242,164, 82,105, 75,252,149, 67,135,176,179,179, 27,207,229,115,
- 70, 57,185,214,245, 0, 77,255,126,239,234,211,149, 85,157,161, 83,227,230,133, 0, 20, 37,179, 14,107, 57,251, 16, 44, 22,107,
-196,224,193,131, 89,111,223,190,197,168, 81,163,112,252,248,241, 74,247, 29, 63,126, 60, 78,159, 62,141,193,131, 7,179,150, 44,
- 89, 82,105,122,135, 79,173, 37,234,175,214, 41, 35, 63, 4,227,216,233,131,149,198, 32, 89, 89, 21,197, 99,165,167,103,150,254,
-214,174, 77,213,158, 17,154, 84,223, 9,124,253,178, 83,231,110, 61,121,137,105,185,160, 73, 21,148, 5,127, 29, 47,207, 77, 3,
- 67, 42,193, 51, 48,131,141,133, 49,222, 60,187,173,214,168,149,119,170,226,156, 61,184, 57,126, 28,232, 2, 48, 52,134, 44, 56,
- 4,191,157,179, 74,159,160,221,135,205,193,189,179,219,116,142,241, 43, 15, 46,151,139,208,208, 80, 69,101,214, 44, 54,155,173,
- 75, 78,174, 98,171,163, 22,114,185, 2,114,133,242,107,222, 59, 44,173,173,173,247,152,154,154, 10, 43, 17, 82,150,150,150,150,
-123,204,205,205,133,186,186, 14, 43, 19, 89,197,121,181, 94, 79,156, 56,177, 70, 98, 75, 32, 16,212,143,138,138, 42, 77, 86, 90,
-213,187, 90,173,134,167,167,167,174,201, 75,175, 2,136,177,181,181,125,218,172, 89, 51,227,143, 31, 63,226,212,169, 83, 60, 46,
-151, 91,183,228,254, 81, 80, 80, 0, 54,155,141,244,244,116, 45,128,201,168,198,117,166, 82,169,252,253,253,253, 91, 13, 28, 56,
-144,253,238,221, 59,176,217,236,162,114,117,234, 4,183,189,123, 17, 54,111, 30, 60,226,226,160,212,104, 32, 20, 10,113,235,214,
- 45,141, 92, 46,247,175,140, 79, 36, 18,237,143,141,141,109, 46, 20, 10,161,209,104, 64,211, 52, 88, 44, 22,193,225,112,220, 77,
- 76, 76,182, 3,104, 87,174,177,172,220,218,121, 54,161, 72,146,146, 38,124,204,168,174, 2,178,178,178,112,245,234, 85,116,236,
-216, 17, 30, 30, 30, 72, 78, 78, 70,116,116, 52,190,249,230,155,210,125,130,131,131, 17, 24, 24,136,134, 13, 27, 86,111,209, 99,
-105,209,176, 73,125,240,120,188, 34, 11, 17,151, 87,252,224,195, 45,181,100,241,184, 60,112, 57, 92, 8, 69, 66,157, 45, 90, 4,
- 65,128,197, 98,129, 32, 8,136, 68,162,146,135,108,218,193,193, 65,154,157,157,109, 11,128, 45, 18,137, 64, 81,148, 78, 15, 45,
- 37, 99, 68,137,200,226,241,121,165,150, 45, 0,200,205,205, 85, 14, 30, 60,248,132, 74,165,154,132,218,173, 80,162,199,191, 12,
- 4, 65,188,250,255, 56,182, 6, 24, 80, 44,172, 62, 11,138,175,170,131,127,211,185,115,231,189, 99,198,140,233,185,117,235, 86,
- 72, 36, 18, 72,165,210,210, 1,145,207,231,163, 78,157, 58,200,206,206,198,190,125,251,144,148,148,116, 31,192,116, 93, 75, 36,
-149, 74,159,127, 8,138,202,242, 28,222,217,188,121,231, 38, 38,137, 81, 73, 29,165, 82,105, 64,177,200, 58, 52,102,254, 55,147,
- 60,135,182, 7,143,207, 69,226,135, 84,220,187,250,244, 63,210,152,108, 54,155, 77, 16, 4, 70,141, 26,165,211,254,163, 71,143,
-134,191,191, 63,170,114, 51,210, 37, 22, 45,185, 18, 50,197,215,123, 88,155, 57,107, 60,102,206, 26, 95, 42, 38,116,113,189, 0,
-128,157,221,153, 42,132,150,102,171,223,153,125,211, 90,183,239,228,216,182,121,125,188,120, 29,132,147,123,255, 50, 50, 28,222,
-177, 26,191, 29,190,143, 58,214,166,208,168,100,184,113,254, 64,170, 70, 37,223, 90, 75,163, 92,145,184, 37, 8, 48, 12, 93,163,
-115, 47, 17, 79, 92, 46, 23,174,174,174,149, 90,180,178,179,179, 21,213, 13, 12,165,109,164,214,162, 80,166,128, 66,254,213,132,
-150,155,187,187,251,157,115,231,206,153, 91, 89, 89, 33, 37, 37,165,188,208,114,235,210,165,203,157,115,231,206,153, 91, 91, 91,
- 35, 49, 49, 81,231,180, 34, 21,136, 44,100,100,100, 16, 57, 57, 57,180,169,169,105,141,196, 22,139,197,130, 74,165, 66, 68, 68,
-132,174,127,171,243, 12, 49, 99, 99,227, 35,167, 79,159, 54,206,204,204, 4,155,205, 70, 68, 68,196, 39,179, 14, 75, 94,135, 14,
- 29,226, 13, 25, 50,228, 96,110,110,110,149,211,218, 72,146,220, 60,126,252,248, 41,201,201,201,166, 86, 86, 86,144, 74,165,224,
-243,249, 96, 24, 6,132,167, 39,186,198,196, 64, 67, 81, 16,137, 68,136,140,140,196,254,253,251,101,197,169, 98, 42, 52,144, 17,
- 4,225,204,227,241, 48,110,220,184, 79, 54, 28, 61,122, 20,131,218,178,219, 90, 26,115, 10, 73, 8, 85,105,162,254, 55,216,108,
- 54,225,214,161, 71,227, 14,221, 6,184,190, 15,123,241, 49, 35, 45,169,186,155,146, 86,173, 86,163,105,211,166,120,245,234, 21,
-238,222,189,139, 30, 61,122,192,195,195, 3, 33, 33, 33,184,125,251, 54, 2, 3, 3, 65, 16, 4,204,205,205, 75,194, 47,170,140,
-193, 80,203, 73,164,167,100,125,102,189, 42,255,157,199,227, 65,165,208,232,212, 70,239,222,189,195,171, 87,175, 74, 83,203,176,
-217,108,242,187,239,190, 3,195, 48, 76,108,108, 44, 12, 13, 13,153,137, 19, 39, 82, 28, 14,135, 76, 78,214, 45, 62,184, 68, 84,
-149,136, 44, 14,143,251,137, 64,163,105,186, 32, 36, 36,100, 26,128,144, 98, 75, 22,160,207,163,165,199,255, 54,174,225,243,133,
-165,171,181,104,197, 0,232,117,234,212,169,177,151, 47, 95,222,188,125,251,118, 75, 47, 47, 47,228,228,228,192,209,209, 17,182,
-182,182,240,243,243,195,245,235,215, 51, 41,138, 90, 0,160, 34,211, 79, 47, 84,145,179, 38,249,163,244,156,170,176,240,199, 54,
- 30, 46,184,127,246,177,175,141,141,205,116, 54,155, 61,119,226,210,111, 39,117, 31,220, 14,145,129,177,120,126, 59, 20,105, 9,
-153,213,114,150, 15,134, 55, 49, 49,153, 98, 96, 96,192, 7,160,169,224,169,184,252,172,195, 82, 78,138,162, 40,181, 90,141, 51,
-103,206,232, 36,182, 78,157, 58, 5,165, 82, 9,234,115,255,106, 41, 39, 67, 51, 4,135, 43,128, 93,157,166,208,104,100,160,233,
- 90, 79,168, 44,229, 44,121, 2,253,200,231,195, 42, 51, 19, 47, 94,188,208, 77,114, 15, 24, 80, 93, 27, 41,213,202,130,113,219,
-214, 46,244,243,246,249,221,164, 71,231, 86,248,101,211, 81,104, 52,135,193, 98,179, 32, 18,240,208,166,125, 23,176,161,194,158,
-245,139,114,229,249, 57,227,240,249, 82, 60,159,112, 50, 85,121, 88, 24,128,162,105,220,125,244, 82,231,115, 47, 29,237, 41, 10,
- 28, 14, 7, 31, 62,124, 80, 84, 52,219,144,205, 46,114,115,150, 60,169, 87,197,201,208, 52,193,229, 9, 81,199,177, 25,212,170,
-194,175,210, 70, 86, 86, 86,139, 46, 93,186,100, 94,146, 42, 33, 36, 36, 4, 4, 65, 68,252,101,113, 44,218,174, 80, 40, 16, 22,
- 22,134,144,144, 16,160,104,134,155,206,215, 81,137, 37, 43, 35, 35,131,144, 74,165, 48, 48, 48, 96,133,132,132,168, 90,182,108,
-249,186,154,235,187,148, 83,169, 84,198, 85, 22, 63,169, 84, 42,237,133, 66, 33,183,220, 32,106,215,168, 81,163,200, 10, 92,136,
-159,149, 51, 47, 47,239,197,226,197,139,219,244,235,215, 15,139, 22, 45,202, 54, 53, 53, 53,220,179,103, 15,135,205,102, 19,222,
-222,222, 84,122,122,122,225,129, 3, 7,140, 47, 95,190,140,220,220,220, 0, 29,206,189, 64,169, 84, 78,235,220,185,243,209,155,
- 55,111, 26, 56, 59, 59, 35, 63, 63, 31, 12,195,224,200,145, 35,240,246,246,134, 80, 40, 68,100,100, 36, 6, 13, 26, 36,151,203,
-229,211,240,121,236,100, 9, 39, 65, 16, 4, 67,211, 52,150, 47, 95, 94,154,156,180, 36, 89,169,161,136,192,254,249, 13,196,115,
- 14,228,137,199,254,114,224, 59, 0,160, 72,146,122, 31,246,226,227,145,157,191, 60,224,241,120,143,170,105,163,101,115,230,204,
-217, 51, 96,192, 0,145, 68, 34, 65,118,118, 54,158, 62,125,138,103,207,158,225,249,243,231, 80,171,213, 48, 55, 55,135,169,169,
- 41,164, 82, 41,222,189,123,167, 0,176,172, 42, 78,190, 1, 23, 78,141, 75,102,254, 22, 89,176,184,101,102, 27,150,181,110,241,
-184, 92,157,174,163,110,221,186,161, 67,135, 14, 37, 2,136,138,143,143,151,170, 84, 42,162,140,232, 79, 46, 17,228,117,235,214,
- 37,143, 31, 63,206, 84,197,249,124,255, 46,220,252,117, 25,248, 60, 30, 22, 68, 36,150,138,174,163, 61, 90,131,203,231,193,101,
-224,176,178,199,238, 70,145,187, 16,229, 68, 86, 85, 99,199, 23, 95,155,122,206,255, 90,206,255,101, 72, 81,139, 37,120, 74,112,
- 82,169, 84,222,248,254,251,239,215,187,185,185,125,191,101,203, 22,130,199,227, 97,229,202,149, 76, 74, 74,202, 31,197, 79, 33,
- 57,181, 41, 21,195, 48,127, 60,188, 24, 48, 99,130,207, 96, 98,254,214,137,238,175,239,133,189,107,209,217, 25, 45, 58, 59,227,
-245,253,183,216,185,244,212,113, 74, 75, 45, 79, 77, 77, 77,168,134, 74,213,171, 75,147,242,193,240,230,254, 15,238,153,215,116,
-214, 33, 77,211,231, 78,157, 58, 53,123,232,208,161,172,151, 47, 95,126, 22,147, 85,178,236, 14, 77,211,184,115,231, 14, 52, 26,
- 13,254,248,227, 15,154,166,233,202,243,104,129,185,178,109,235,250, 9,127, 28,187,194,231,243, 8, 60,123,116, 1,121, 57, 85,
-207,234,226,241,184, 56,116,228,162,134,199,227,190,175,104,187, 70,163, 73,188,119,239,158,117, 95,138,226,178, 88,172,138, 4,
- 84,133, 56,119,238,156,150,166,233,248,106,118, 11, 72, 75, 74, 24,184,102,209,228, 83, 3, 70,126,111,221,185,179, 59,215,194,
-202, 26, 4, 65, 32, 61, 45, 29,145, 97, 47,181, 55, 46, 28, 76,147,201,117, 91,130,103,242,198,135,165, 49, 89, 0,224,229,189,
-189, 52, 62, 11, 0, 6, 78, 92, 12,207,142,205, 65,232, 98,122,250, 75,100,209, 36, 73, 66, 44, 22,131, 36,201, 10, 83, 60, 24,
- 27, 27,139,148, 74,165,162, 56, 17, 99,149,166, 34, 6,248,234,109, 68, 81,148, 75, 78, 78, 14,100, 50, 25,158, 61,123,198,172,
- 93,187, 54, 35, 35, 35,163, 52,104, 83,171,213,186,100,103,103,163,176,176, 16, 1, 1, 1,204,250,245,235, 51,178,178,178,150,
-214,228, 26, 18,137, 68,109, 57, 28,206,235,156,156, 28,218,192,192,128,165,213,106,181, 45, 91,182, 20,136, 68, 34,157, 23, 84,
-151, 74,165,253, 42,219,230,228,228, 20, 21, 21, 21,213,136,162,168,178,107, 32,242,148, 74,165,115,231,206,157,117,185,127,204,
- 57,124,248, 48, 46, 94,188,216, 62, 63, 63,127,124,124,124,252, 81, 0,237, 57, 28, 14,130,130,130, 34,148, 74,229,152,161, 67,
-135, 30,201,201,201,121,129,162, 37,120,116,193,205,200,200,200,113, 46, 46, 46,135, 87,173, 90, 37,241,240,240,224,216,217,217,
-161, 93,187,118,136,140,140,196,181,107,215,180,187,119,239,150,201,229,242,201, 0,238, 84,221,236, 32, 72,146, 4,159,207, 47,
-125, 9, 4, 2,240,120, 60, 20, 40, 24, 76,221, 20,173, 32, 33, 82,108, 94, 57,237, 26, 3, 16,169,137,209,153,233,169,137, 47,
- 8,130,120, 36,149, 74,243, 42,169, 51,190, 82,169,108,197, 48, 12,155, 32,136,173, 26,141,102,226,172, 89,179,108,215,173, 91,
-135, 38, 77,154, 32, 51, 51, 19, 98,177, 24,206,206,206,200,200,200,192,203,151, 47, 41,185, 92,190, 23,192,106, 20,199,143, 84,
-134,220,204,124, 56,216,212,253,196,242,201, 48, 12, 24, 10,208,170, 40, 80, 26, 6,106, 66, 11, 46, 87, 11, 30,143,167,139,229,
-137,161,105, 26, 57,182,182,160,195,194,240,252,249,115, 48, 12, 83,169, 85,173,105,211,166, 58,220,216,105,240, 5,252, 79,220,
-133, 4, 65,128,199,231,131,203,231, 85, 52,115, 70,111,197,210,227, 31, 13, 93,125,227,185, 0,166, 7, 7, 7, 31,237,222,189,
-187, 31,195, 48, 92, 20,249, 35, 31,127,201,159,167,166,166,190, 9,184,246,102,137,181,131,233,250,254,227,221,209,164,149, 35,
- 40,146,194,211,235, 65,248, 99,221,229,211,201,137,201, 19,161,195,218,103, 52, 77, 63,232,210,182, 9, 11,101,114,117,219,217,
-217,209,181,153,117,152,151,151,183, 98,193,130, 5, 88,180,104, 81,109,102, 29, 86,136,208,119, 25,211, 9, 48, 14, 3,251,119,
-237, 11,130,197,168,213,170, 42,110,124, 40,205, 92,202,227,113,223,191, 10,145,182,172,104,191,140,140,140,190,147, 38, 77,186,
-195,225,112,234,215,164,206,105,154,142, 79, 75, 75,235, 89,253,158,228, 83,149, 34,223,249,234,233,125,243,110, 94, 60,220,151,
-166,169,134, 4, 0, 54,135,247, 81,171,209,220, 82, 41,242,183, 64,199, 69,165, 55, 76,239,132, 57,219,110, 99,215,162,129,152,
-181,254, 44, 14, 46,159,138, 37,155, 78,225,247, 69,115,176,118,251, 9,252, 50,103, 28,134,143,157, 68, 51, 4,235,137,174,231,
-193,102,179,111,238,219,183,111,194,212,169, 83, 75, 39, 45, 48, 12,243,201,141, 93,171,213, 42,104,154,198,222,189,123,105, 0,
- 55,171,226,251,180,141, 8,166,170,120, 41, 93,219, 40, 63, 63,127,114,167, 78,157,142, 0, 16, 48, 12,243, 33, 39, 39,231, 7,
-224,175,165,161, 10, 11, 11, 39,119,238,220,249, 8,195, 48, 2,130, 32, 62,219,174, 11,138, 83, 61,180, 53, 53, 53,125, 93,108,
-201, 18,212, 38, 32,190,170,170,174,194,173,168,139, 11,145, 6, 48,171, 76,198,247,117,237,219,183, 47,187,168,116, 68, 78, 78,
- 78,219, 90,148,235,142, 66,161,104,190,124,249,242,121, 66,161,208, 83, 46,151, 55, 6, 0,177, 88, 28,169, 82,169, 30, 40, 20,
-138, 45,168, 62, 55,149,154,166,233, 72,146, 36, 93, 45, 45, 45,139,102,212, 22,139, 45, 0,248,243, 53,245, 26,160,218, 21, 25,
-197, 79,234, 92,176,235,215,175,215, 51, 53, 53,237, 67, 16,196,112,134, 97,154, 22, 20, 20,168,150, 47, 95, 30,112,238,220,185,
-188,250,245,235,247, 31, 48, 96, 0, 97,102,102,134, 87,175, 94, 49, 89, 89, 89, 23, 0, 44,133, 14, 51,173,105,154,142,223,176,
- 97, 3,106,122,189, 87,181, 93,163,209,164, 94,191,126,221,162, 95,122, 58,135,166,105, 12, 28, 56,240, 19, 1, 87, 30,239,223,
-191,135, 74,165,170, 50,153,163, 42, 47, 7, 61,230, 45, 6,138,103,127,150,160,200,146,197,128, 81,235,117,149, 30,255, 46,252,
-221, 11,122,234,100, 90,180,181,181, 29, 37, 20, 11,102, 58, 54,182,109,153, 18,157,254,182, 32, 79,126, 92, 42,149,238,171,228,
- 70,174, 19,103, 13, 19,150,234,205,191,127, 19,231, 95,121,180, 40, 48, 12, 5,134,102,192, 48, 52,104,154, 42, 90,240,154,161,
-193, 80, 20, 65, 16,120,162, 86, 84,153, 25,188,124, 57, 77, 45, 44, 44, 86, 51, 12,211,143,205,102,179,202, 26,195,202,126, 46,
-182,100,221,204,200,200,248,165, 2,203,235,255, 92,125,158, 59,119,174, 66,241,175,235,172,195, 17, 35, 70, 80, 53,188, 54, 31,
-136,197, 98,219,138,182,201,100,178, 4,169, 84,218,231,191,164, 62,203,206, 24,172, 9,103,141,103, 29, 86,199,233,232,232, 40,
-208,104, 52,173, 1, 56, 19, 4, 97, 2, 32, 91,163,209,220,202,204,204, 76, 3,208, 22,192,242,226, 99,126, 5,240,250,255,249,
-122, 23, 89, 88, 88, 28,102,177, 88, 14,186, 28, 76,146,164, 58, 59, 59,123, 66,185, 7,130, 82, 78,115,115,243,215, 28, 14,199,
- 65, 7,158,164,172,172,172,182,250,251,167,158,243, 31,132,242, 65,240,211, 24,134,217,255,159,248,227, 94,122, 78, 61,167,158,
- 83,207,169,231,212,115,234, 57,245,156,255, 2,161,133,114, 66, 11, 12,195,232,167,213,234,161,135, 30,122,232,161,135, 30,122,
-124, 33,174,149, 19, 91,215, 74, 62, 16, 85,168,210,154,152, 4,107,163,108,239,234, 57,245,156,122, 78, 61,167,158, 83,207,169,
-231,252,215,113,254, 43,240,183,172, 76,241,149, 26, 72,207,169,231,212,115,234, 57,245,156,122, 78, 61,231,191,143,243,127, 25,
-149,186, 14, 89,250,186,209, 67, 15, 61,244,208, 67, 15, 61,244,248,123,160,179,208, 18, 91, 55,117,177,112,108,121,196,212,161,
- 69,136,169, 67,139, 16, 11,199,150, 71,196,214, 77, 93,254,165,245, 38, 2, 48,150,195,225,220,177,177,177,201, 71, 37, 75,239,
-252, 3, 96, 4, 96, 56,138,242,251, 12, 1, 96,240, 53,201, 61, 0,206, 40, 96,230,119, 64,194,119, 64,194, 40, 96,166,199, 63,
-112, 57,142,149,179,109, 59, 61,186, 49,246,198,202,217,182,157, 42,220,190,192,214,252,249,237, 17,219,214,205,180, 51,251, 74,
-127,105,104,101,101,181,223,218,218, 58,206,202,202, 42,222,202,202,234, 48, 0, 99,253,237, 78, 15, 61,244,208,227,111, 67, 73,
-140, 86,201,171, 52, 70,139, 3, 0,126,126,126, 30, 0, 30, 2,232,238,229,229,229, 95,254,104,211,186,174, 83, 27, 54,104,184,
-104,205,202,165,132,141,149,133, 1, 73,209,154,216,184,196,102, 43,214,172, 63,159,194,231,108,206, 73, 8, 59, 88,139, 66, 17,
-108, 54,123,148, 64, 32,240, 2, 80, 34,216, 34, 84, 42,149, 31, 69, 81,103,160,219, 52,109, 88, 91, 91, 63, 98,179,217,245,106,
-242,199, 20, 69, 37,164,165,165,185,215,178, 50, 71,212,173, 91,247,176,135,135,135, 65,251,246,237,193,231,243,177,124,249,242,
- 5, 82,169,116,139,174, 4,166,166, 78,134, 26,129,112, 46,135,207,239,205,104,213,174, 12, 24,128, 37, 8,163, 73,213, 61,158,
- 74,181, 57, 39, 39,186, 64, 71,170,165, 0, 38, 22,215,213, 65, 0, 27,190,164,151, 76,104, 5,173,150, 42,234, 19, 60, 14,168,
- 43, 49,198, 15,151, 45, 91,198,241,242,242,194,193,131, 7,221,247,239,223, 63,173,160,160,224, 30,128, 63, 1,124,252,210, 94,
-105, 13, 76,239,236,238,190,109,194,130, 5,108,197,163, 71,216,118,248,240, 86, 20,229, 91,218, 85,211,190,196,227, 97,184,133,
- 5,215,139, 97,208,154, 0, 8, 2, 8,202,200,162,175,107, 52,212, 25,232,144,139,173, 10,140,197,167,211,241, 79,214,148, 32,
-239, 35,243,179, 96,160, 75,215,188,143, 15,126, 6,208,191,252,118, 82, 41,156,192,176,235,120, 41,152,192, 68, 0,155,190,176,
- 90, 13, 44, 45, 45, 67,174, 92,185,226,208,190,125,123, 14, 0,188,126,253,250, 59, 47, 47,175, 30, 25, 25, 25,174, 0,242,255,
-159,110, 66, 66, 14,139, 53,147,207,229,246,166, 40,170, 5, 0,176,217,236, 80,181, 86,123,135,164,233, 93,208, 49, 39,155, 30,
-122,232,241,207, 69,117, 90,228,191, 28,149,102,134, 47, 57, 57,166,236,123, 89,136,173,154, 52,235,216,115,216,251,188, 2,185,
- 50, 46, 46, 57,103,254,204,181,119,166,205,217,120,121,211, 1,191,235,254, 47, 34,158,187,180,239,243, 86,108,213,164, 89, 37,
-212,149,249,112,235,138, 68,162, 55,187,119,239,214, 68, 70, 70, 50,185,185,185,204,251,247,239,153, 11, 23, 46, 48, 51,102,204,
- 80,138, 68,162, 55, 0,234,234,194,105,109,109,157,246,254,254,109, 38, 41, 36,144,137,127,253,130,209,106,181,140, 70,163, 97,
- 52, 26, 13,243,246,166, 31, 19,242,231, 69, 38,232,194, 25, 70,173, 86, 51,106,181,154, 81,169, 84, 76,131, 6, 13, 82,116, 44,
-103,121,216, 53,111,222, 92,237,231,231,199,156, 63,127,158, 89,176, 96, 1,227,230,230, 70, 1,240,214,245,220,197, 86,206,158,
-134,246, 45, 51,166,250,236,210, 92, 11,184,197,132,199, 4, 49,225, 49, 81,204,185,187, 17,204,196,133,219, 53,134,246,110, 25,
- 98, 43,103,207,234,206,221,212,212,180, 35, 65, 16, 76, 9, 0, 48,245,234,213, 43, 44,251,170, 91,183,238, 39,175, 58,117,234,
- 20,214,175, 95,255,163,185,185,121,235,138, 56,199,180, 0,195,188, 61,201, 48,111, 79, 50,203,186,129, 9, 15, 15,127,206, 48,
-204,195,146,151, 66,161,120,120,233,210,165,135,223,126,251,237, 67, 0,131,170,168, 39,157,234,243, 59, 32,161,224,202, 21,134,
-217,178,133, 97, 60, 60,152, 8,128,249, 14, 72,168, 33,103, 3, 27, 27,110,208,198, 13,211,212, 87,174,252,193,220,184,113,141,
-185,126,221,143,185,124,233, 48,179,117,203, 76,141,181, 53, 55, 12, 64,163, 26,112,114, 0,172, 5,176, 25, 69,150,203,200,140,
-140, 12, 38, 53, 53,149, 1, 16, 89,252,219,102, 75, 75,203, 77,168,216,250,214,171,172, 37,107, 94, 63,155, 27, 35,251,187, 51,
- 5,121, 41,204,200,254,238,204,188,126, 54,159, 88,182,250, 57, 57, 25,206, 26,216, 34, 35,252,245,113,106,214,192, 22, 25,253,
-156,156, 12,107, 89,159, 4,138,214, 9,221,125,255,254,125,146, 41, 3,173, 86,203, 28, 61,122,148, 50, 53, 53,253,163, 6,156,
-141, 45, 45, 45,227,205,204,204, 34,203,254,104,217,114, 72,231,166, 93,191, 91, 97,222,236, 91,143, 26,148,179,189,144,199, 75,
-186,115,118, 15,149,149, 16,202,168, 21,105, 76,222,135, 64, 38, 41,226, 57,115,116,223,102, 45,159,195, 73, 2,208,254, 75,250,
- 82, 13,161,231,212,115,234, 57,255, 11, 57,171,210, 34,255,139,248, 44,189, 67,101, 39, 38, 16,240,125, 86, 44, 91, 76,228,102,
-229, 42,148,249, 5,106,173, 82,169,100,241, 24,101,232,219,152,116, 22,135,157, 59,111,206,108, 67,159, 37,203,124,100,192, 56,
- 29,255,187,174,155,155,219,203,139, 23, 47, 90,153,153,153, 33, 47, 47, 15, 89, 89, 89,120,249,242, 37, 24,134,193,208,161, 67,
- 5, 29,218,181,107,253,243,242,229,207,146,146,147, 59,161,242,129,247, 47,241, 98,102,129, 13,238, 69,107,209,254, 18,151, 85,
- 52,234, 16, 4,246,143,240, 42,221,103,117, 82, 94,209, 99,181, 80, 88,186, 32,113, 45,208,169,103,207,158, 60, 0,152, 50,101,
- 74,126, 65, 65,129,111,177,133, 67,167,149, 86,197, 86,206,158, 22,182,118,126,123,246,110, 16,181,104,232, 12,141,150, 68,124,
-106, 10, 56, 92, 19, 56, 56,240, 48,105, 92,111,110,183,206,102, 22,107,127,221,127, 45,149,198, 16,121,102,212,173,202,184, 76,
- 76, 76,142,158, 57,115, 6,103,207,158, 5, 0, 68, 70, 70,194,217,217, 89, 92, 93, 25,194,194,194,156, 6, 13, 26,116, 58, 43,
- 43,171, 81,117,251,150, 79,140, 47, 16, 8,224,238,238,142,102,205,154,225,202,149, 43,221,139, 45, 91, 95, 4,197,163, 71,144,
- 4, 7, 3,254,181,122,120,105,208,166,141,227,243,235,215,142, 91, 92,187, 30,129, 77,155, 14,227,227,199, 34, 67,155,147,147,
- 19,198,142, 25,193, 13, 13, 13,104, 62,124,248,216,128,199,143, 63,186, 23, 11,165,234,176,234,192,129, 3, 75,235,215,175,143,
-225,195,135,143,104,222,188,185,141,145,145, 17,246,237,219, 7, 91, 91, 91, 39,181, 90,253,225,202,149, 43,118,169,169,169,152,
- 61,123, 54,210,210,210, 22, 84, 70,212,189,111,247,159, 5, 3, 93,186, 54,105, 51, 1, 18, 35, 91, 28, 56,117, 6,239,223, 28,
-237,170,210, 68,252,204,163,252,199, 43, 24,193,196,140, 4,137, 79,189,182, 30,230,141,154, 15,130, 99,155, 64, 11, 37,245, 56,
-230,231,222, 13,214,115,132,202,163, 43, 55, 73,179, 62, 35, 29,126,142,237,154,255,206, 44,236, 14,178,128,149,116,137,192, 42,
-181,214, 50, 24,212,173, 91,183,210,134,139,139,139,131, 74,165,130,139,139, 11, 75,173, 86,123,234, 88,175,141,251,244,233,243,
-228,250,245,235,230,141, 27, 55,206,200,206,206, 46,221, 96, 99,110,210,215,255,226,214,217,107,183,157,104,122,140, 33,114, 51,
- 34, 46,135, 86,195,213,190, 75,199, 54,119,111, 92, 60, 46, 33, 10, 19,193, 55,201, 4,232, 44, 68,159, 62, 4,194,192, 12,163,
-102,204,231,120,246,236, 97,223,187,255,176,187,239,163, 62,246, 4,240, 74,255, 92,175,135, 30,255,106,171, 22,243, 79, 59,167,
- 82,161,229,229,229, 69, 84,116,130, 52, 67,183,180,182, 50, 23,109,221,120,228, 21, 91,163, 86,139, 77,140,213, 92, 99, 35,154,
- 48, 52,102,107,212,218, 66, 71, 39, 71, 62,205,208, 45, 43,225, 47, 63,197,147, 16,137, 68, 23,255,252,243, 79, 43, 46,151, 11,
-154,166, 97,105,105,137,216,216, 88,228,230,230,162,160,160, 0, 31, 35, 34, 80,191,110, 29,172,244, 89,108, 59,123,177,207, 69,
-185, 92,222, 22,159,186, 17, 63,155, 54, 74,105, 63, 93, 55,186,100, 9,150,207, 30,249,139,127,171, 96,155,174, 83, 81, 99, 19,
- 18, 18, 32,145, 72,224,234,234, 42,121,250,244,233,227, 42, 68,214, 39,156,166,166, 78,134,180,128,127,118,247,158,229, 34,141,
- 54, 12,111,163,179,209,164,126, 87, 88,155,215, 69, 74,182, 26,207, 95,254,137,176,144,147,104,104, 95, 23,222, 51,122, 8,215,
-111, 56,127,134, 71,214,175,155,155, 27,155, 95, 17,103,126,126,190,164, 65,131, 6,168, 91,183,104,221, 51,138,162,240,246,237,
- 91, 80, 20, 85,250,189,236,251,145, 11,247, 65,230,199, 99,194,119,223, 33, 43, 43, 75, 82, 17, 39,151, 13,114,254,180,177, 28,
- 17, 23,224,139,205,212,133,133,133,165,211, 83, 53, 26, 13,130,130,130,208,169, 83, 39,143,115,231,206, 85,167,138,116,170, 79,
- 13,240,251,182, 63,254,216, 62, 46, 47,143, 5, 0, 7, 9,130,214, 48,204,239,186,246, 37, 43, 43,238,133,155, 55,142, 89,176,
- 89,239, 96,102,252, 27, 94,190,140,135, 70, 83, 84,222,172,172,116,204,154,153, 15, 30,215, 16, 87,174,156, 48,119,113,113,191,
-144,154,170,113,197,167,110,196,138,202, 41,188,113,227, 6,102,205,154,133,183,111,223,218,177,217,108,188,120,241, 2, 34,145,
- 8, 27, 55,110,100,187,184,184,216,137,197, 98,220,188,121, 19,105,105,105, 68, 85,229,124,120,235,225,154,188,143, 15,126, 78,
- 37,110,246, 59,112,234, 12,190, 31, 51, 10, 54, 76,244, 99,227,134,196,154, 62, 3,187,252,194,176,235,120,137, 13, 91,154, 58,
-187, 14, 4,143, 47,129,247, 79,171, 17, 25,118,213, 84, 94, 16, 50,147,160, 18,235,172,220,116,110,206,103,229, 60, 63,130,154,
-114,242,105,155, 59,117, 95, 57, 6, 7, 77,123, 33, 13,220, 31,242,151,208,114,226, 16, 44,202,184,228, 73,234,195,135, 15,248,
-248,241, 35, 56, 28, 14, 20, 10, 5, 72,146,172,176,156,118,118,118,211, 73,146,252,165,184,157,143, 8,133,194,201,199,143, 31,
- 55, 47, 43,180, 45, 91, 14,233,108,110, 40,238,153,150,158,149, 19,240, 42,252,253,252,233,195,187, 63,122, 30,150,168,225,126,
-155,144, 23,114, 37,175,146,250, 20,138,248,252, 11, 55, 47,157,144,104, 99,238, 67,236,210, 29, 92,137, 51, 40,109, 50,228, 57,
- 50, 20,124,148, 66,181,103, 39, 90,205,156,135,171,151,207, 75,154,183,104,123, 78,165,213, 58, 3, 80,215,226,218,172, 9,244,
-156,122, 78, 61,231,127, 39,103,165, 90,132, 97,152, 54, 0,172,139,191,102, 21,235, 2, 11, 0,153, 40, 90, 69,198,186,248,222,
-193, 47,115, 88,249,239,101,247, 45,255,189,236,231,172,226,207, 86,197,239,175, 8,130,200,174,166,232,182, 40, 90,154,240, 90,
-241, 59, 80,236, 74,172, 54,240,152, 32, 88,249, 20, 69, 11,120,150, 86,202, 41, 35,123,182,184,125,247,117,144,129,133, 17,167,
-111,247,214, 30, 47, 67, 99,158, 17, 44, 66, 75, 16, 44,157,226, 62,216,108,246,168,173, 91,183,182, 48, 50, 50, 2, 77,211, 48,
- 54, 54, 70, 70, 70, 6,212,106, 53,242,242,242,160, 42,200,135,166, 32, 31,193,137,113,232,226,209, 29,195,250,245,113, 57,113,
-249,207, 81, 20, 69,157,174,138,215,174,101,235, 82, 75,214,234,122,230,127,153, 38, 18,115, 75, 69,215,111,173,157,193,147, 72,
-208,123,190,207,151,244,129,192,107,215,174,221, 24, 58,116,104,255,133, 11, 23,178,164, 82,233,205,216,216,216, 46, 0,222, 86,
- 43, 42, 4,194,185, 63,206,245, 50, 53,149, 48, 56,119,231, 79,116,107, 61, 6, 6,124, 54,178,242, 53, 32, 8, 32, 34,252, 34,
- 8,194, 12, 33,145, 82,116,109,101,132, 62,125, 93, 36,151,207, 71, 44,196, 95,241, 65,159, 53, 77, 78, 78, 14,210,211,211,161,
-213,106,161,213,106, 49,124,196, 8, 28, 59,122, 20, 50,153, 12, 10,133, 2,106,181, 26, 20, 69,129,197, 98,225,142,223, 57, 36,
-198, 68,160,115,167, 78, 64, 37, 75, 47, 29, 13, 2, 23,192,243,247,239,223, 35, 34, 34, 2, 73, 73, 73, 16, 10,133,176,177,177,
-193,234,213,171,161, 82, 21,173, 81, 54, 98,196, 8, 15, 0,161, 95,122, 65,125, 4,246,199, 82,212,207,253, 47, 93,178,122,122,
-233, 18,253,252,234,213, 36, 65, 65,193, 62, 93,142,229,241, 48,124,195,239, 51,154,136,197, 98, 36, 37,108, 69,211,166, 60, 44,
-152,103, 14,223,223, 50, 1, 0,179,103, 57,160, 93, 91, 11,228,231,158,135,133,213, 82,108,223, 62,167,225,196,137,155,191,147,
-203,169, 35,213, 80,255,252,231,159,127, 14,115,118,118,182, 15, 12, 12, 36,248,124, 62, 68, 34, 17, 68, 34, 17,132, 66, 33,210,
-211,211, 17, 27, 27,203,108,216,176, 33, 25,192,207, 85, 17,173,220, 46,125, 6,160,255,188,126,184,241,254,205,209,174,246,236,
-152,224, 97,222,238,113, 33,207, 3, 11,110,223,121,250, 43,169, 20, 38,230, 38,221, 93,220,160, 93,160,197,204, 69,171,176,115,
-195, 10,188,127,241, 40,219,186,110,254, 46, 17,161,170,176,156, 30, 30, 43, 57,182,214,102,228,244,137,195, 76,174, 90, 7, 76,
-191,206, 33, 50, 82, 51,223,108, 68,108,160, 66,208,168,245,248,198, 78, 44,245,253,251,247, 69,221,186,117,131, 82,169, 44,181,
- 76, 30, 63,126,156, 38, 73,242, 65,133,125, 83,163,249, 37, 57, 57,217, 86,161, 80,160, 95,191,126,179, 55,110,220, 40, 46, 89,
-163,142,162,168, 79, 44, 89,107,182, 28,187, 53,247,151, 93, 15,110,157,254,205,110,141,207,228,238,227,188,215, 62, 64, 37,235,
- 72,114, 88,172,153, 87, 47, 29,182, 17,154,106, 33, 50,235, 3,101,154, 2,239,247,127, 15,121,190, 18,237,214,172, 2,192,135,
- 90,203,194,190,129,195,193, 53,183,195,138,169,147,237,150,237, 59, 48,131,166,233,173,250,231,122, 61,244,208,163, 28,172, 9,
-130,240, 3, 0, 31, 31,159,165,190,190,190,225, 4, 65,248, 49, 12,227, 85,108, 64,241, 99, 24,198,171,100,159, 98,113,246,217,
-247,146,125,203,127, 47,255,121,201,146, 37,205,215,175, 95,191,174, 83,167, 78,167, 3, 2, 2, 98, 0, 84, 39,180, 6, 20, 11,
-171,242, 75,241, 20,205, 58,244,242,242, 34,202,190,127, 98,209,162,233, 71, 31, 98,226,228,125,122,117,112,240,243, 15,125, 53,
-105,210,128,158,163, 6,118,235, 27,155,144, 21,209,208,209,198, 34, 60, 60,212,136,166,233, 71,186,212,146, 64, 32,240,234,209,
-163, 7, 39, 39, 39, 7, 6, 6, 6,200,200,200, 64,114,114, 50, 52, 26, 13,148,121,185, 80,229,229, 66,153,155, 3, 77, 94, 14,
- 62,190,126,137,150, 13,157, 4,197,193,242, 85,162,196,234, 82,222, 82, 85,214,178,197, 55, 52,132,192,208, 16, 68,205,221,134,
-223,154,152,152, 60, 47, 25, 84, 53, 26,205,204,197,139, 23,103,210, 52,141,181,107,215, 26, 73, 36,146,115, 0, 4,213,145, 24,
- 90,178,189, 58,181,114,101,189,139, 13,129,187,219, 4, 52,110,240, 13, 98,211, 20,200, 44,208, 32, 61, 87,131,118,221,118,160,
-158,219, 42,212,105,229,139,136,248,108,216,217, 59,179,192, 17, 84,185,248,115, 98, 98,226, 39,223, 79,159, 58, 5,185, 92,142,
-134, 13, 27, 98,204,152, 49, 88,188,120, 49,198,140, 25, 3, 59, 59, 59,140, 27, 57, 8, 43, 86,172, 64,106,106,106,117, 69, 85,
- 53,110,220, 88,229,232,232,168,114,116,116, 84,105, 52, 26, 20, 22, 22, 34, 55, 55,183,124,125,207,169,105, 69, 90, 89, 89, 45,
-177,177,177, 9,177,178,178, 10, 23, 8, 4,215,131, 8,226,157,210,209,209,186,203,224,193, 68,179,145, 35,217,241, 34, 17,225,
- 15, 72,116,225,178, 48,227, 14,240,236,209,159,159,155,115,184,212, 72, 53,121,146, 37,158,248, 55,199,211,199,109, 49,107,102,
- 67, 16, 44, 33, 8, 22, 31,114,217,125,116,104,223,137,103, 98, 66, 84,215,151,198, 2, 8,234,210,165,139,157,183,183, 55, 33,
- 16, 8, 48,123,246,108,205,212,169, 83,163,198,140, 25, 19,117,239,222, 61,202,209,209, 17,117,234,212, 33,234,212,169, 99, 11,
- 32,168,248,152, 42, 97,212,144, 88,163,210, 68, 60, 54,113, 22,199, 80,176,232, 92,168, 21, 12, 95,185, 73,154,181,102,119,204,
-166,216,247,114,167,247, 47, 30,101, 69,133, 93,165, 99, 95, 61,204, 76,137, 42,112, 90,179, 59,102,211,210, 93, 41, 21, 94,212,
-254,254,160, 47,250,249,107,228, 50, 57,103,240, 64, 79,249,244, 41,163, 26,155, 73,154, 31,135,125, 31,183,122,117, 29,198,173,
- 88,183, 93, 51,117,198, 92,205,193, 67,135,153,130,130, 2,228,231,231, 99,251,246,237,228,213,171, 87,147, 41,138,154, 91,217,
- 51, 16, 0,104,181, 90, 76,159, 62, 93,108,100,100,132,196,196,196, 82,139, 40, 0, 72, 51,178, 66,159,190, 10,123, 55,255,135,
- 17, 30, 50,149, 74,117,235,225,235,136,102,206,142, 14, 4,193, 84, 58, 17,133,207,229,246,110,219,161, 3,155, 97,114, 65,112,
-234,226,227,209, 13,200, 79,205, 70,126,122, 54,216, 92, 49, 72, 8,160,165,249, 48,105,217, 30,145,175, 2, 97,111,105,205, 17,
-112,185,125,245,227,137, 30,122,252, 59, 81,149, 22, 41, 43,150,214,175, 95,191,174,170,237,101,222,213,229,190,151, 10,169,242,
- 34,172,236,103, 0, 88,191,126,253, 58,134, 97,188, 2, 2, 2, 78, 1, 80,232,120, 10,211,202,188, 79,251, 68,104, 85,105,133,
- 82,170,125, 23, 46,254, 25,166,198, 34,227,246,173,157,109,174,220,244,127,253, 40,224,117, 68,189, 58, 22,150,140, 86,109,250,
-251,230,157, 14,132, 92,177, 94,199, 66,184, 88, 88, 88, 64,163,209,224,195,135, 15, 72, 74, 74,130, 70,163, 1, 41,147, 65,149,
-155, 11,101, 78, 14, 40, 89, 1,120, 20, 5, 69, 70, 58,204, 13,132,192, 95, 51, 18,171,177,188, 17, 21, 10,173,146,119,161,145,
- 17, 4,134, 70, 96,113,185, 21,186, 21, 43, 65,155,246,237,219,159, 13, 11, 11,235,208,171, 87,175, 95, 81, 52, 69, 62, 62, 57,
- 57,185,231,242,229,203, 85,214,214,214,152, 62,125,122, 19, 0, 19,170, 21,153,124,181,139,163, 77, 19, 52,118,154,128,122,117,
-122, 32, 87,166, 69, 70,190, 22,233,185, 26,236,219,209, 9, 23, 14,182,199,147, 11, 93, 17,118,171, 55,114,181, 54,144,216,125,
- 11,134, 82, 55,175,138,243,206,157, 59, 88,189,122, 53,126,253,245, 87,172, 93,187, 22,191,254,250, 43,146,147,147,225,234,234,
-138,132,132, 4,220,184,113, 3, 82,169, 20, 22, 22, 22,120,249,242, 37,182,108,217,130, 39, 79,158, 84,123,210,186,100,179, 45,
-222,167, 70,190,116,146, 36, 39, 74, 7, 15,110,145,102,102,214,172,117,235,214,253,103,207,158,237,212,165, 75,151,210,237, 78,
- 78, 78,117, 69, 34, 81, 42,138,102, 80,182,170,138,139, 6, 90, 91, 90,186, 66,173,122, 87,220,198, 92, 16,132, 16, 61,122, 71,
-160, 75,215,215,208,104,121, 96, 17, 2,176, 88, 66,144,100, 22, 76, 77,237,192, 48,132,107, 53, 69, 92,158,145,145,225,124,247,
-238, 93, 86,108,108, 44,132, 66, 33, 0,196,173, 92,185,114,231,166, 77,155,222,154,155,155, 83,126,126,126,184,124,249, 50,188,
-188,188,216, 83,167, 78,117,174, 83,167,206,222,234,206,123,229,118,233,179,147,155,111,140,230,106, 77, 91, 9, 69,245,234, 67,
- 38,249,246, 71, 15, 11, 49, 0,220,140,142, 46,176,170,155,191, 94, 86, 16,146, 96,226, 80,248,219,205,232,234,102,156,174,164,
-223, 68,189,123,126,242,210,205,188,244,180, 28,110,235, 22,205, 21,190,171, 23,241,234,213,111,244,251,138,197, 63,216, 36,231,
- 11,115,123,207,190,241,238,226,205,151,133,227, 39,125, 79, 78,153,230,173,188,113,243,206, 37,154,166, 91,160,146, 25,135, 52,
- 77, 67, 42,149, 34, 60, 60, 28,209,209,209,200,200,200, 64,102,102, 38, 10, 10, 10, 74,221,141, 6, 5,249,215,118,254,113, 53,
- 88, 44, 18, 25,116,104,225, 92,247, 69,224,219,116,177, 72,100,224, 92,191,110, 99, 96,101,133,247, 17,138,162, 90, 8, 13, 68,
- 0, 8,228,134, 61, 66, 97, 78, 33, 10,115, 11, 81,144, 93, 8,149,134, 13,165,138, 5,133,154, 5, 71,143, 62, 40,148, 41, 81,
-152,149, 7,154,162,220,244,195,141, 30,122,232, 81,197, 88,239,231,227,227,179, 84,199,125,117,118,111,150, 23, 94, 62, 62, 62,
- 75, 9,130,240, 91,178,100, 73,115, 84, 62,161,170, 44,246, 87,240, 2,160, 67,122,135,172,172,168, 66, 67,194,101,232,188,159,
-126,185,113,234,208, 14, 43,149, 74,158, 96,110, 42,161, 36, 6,124,139, 41,211,215,162,160, 48,103,136, 76,247,116, 4,200,201,
-201, 65, 76, 76, 12, 68, 34, 17,120, 92, 46, 40,133, 2,148, 66, 6, 69, 78, 22, 88, 26, 21,120, 20, 5, 51, 3, 17, 28,237,108,
- 80,207,218, 70, 39,206, 15,247,111,151, 6,190,151,117, 23,110,104,239, 2,190, 88, 2,190,161, 4, 63,250, 61, 4, 0,240,120,
- 60, 96,249,175, 58, 25, 77,236,237,237,255, 60,121,242, 36, 47, 35, 35, 3, 65, 65, 65,193, 0,242, 0, 24, 2,160, 35, 34, 34,
-238,134,133,133,121, 57, 59, 59, 3, 64,195,234,200,242, 51, 89,148,150,100,144,152, 26,135,216,164, 64,152, 25, 55, 0,215,160,
- 49,210,115, 53, 16,136, 26, 64,171,250,203,251,168,204,143,135, 66,195,214,233,220,213,106, 53, 72,146, 4, 73,146, 80,171,213,
-152, 54,109, 26,158, 6, 4,224,244,229,123,136,249, 24,137, 38,245,109,240,221,119,227,209,190,125,123, 4, 4, 4, 84,201, 53,
-161, 21,180,246, 18,112, 54,247,103,129, 47, 49, 87,117, 92,124,235, 69,117, 98,139, 32, 8, 6,149,184, 34,203, 97, 83,167, 78,
-157, 26, 69,202,100, 8,127,247, 14,189, 86,174, 4, 0, 92,191,126,253,147,115,153, 63,127, 62,255,237,219,183, 83, 94,191,126,
- 61, 37, 37, 37,101, 51,128,138,131,205, 25,224,218,181,103,248,225,135,183,200,200,200, 0, 0,156, 57,245,151, 46,141,141,209,
-160,223,128, 34,143,150,137,137, 9, 54,111,118,213,169, 62, 41,138,194,254,253,251, 75,221,133, 0,192,225,112,186,204,159, 63,
-127,104, 69,251, 55,106,212,136, 87, 29,231,188,225,246,194, 39,193,204, 76,227, 70,245,154, 27, 89,180, 68,150, 54,208, 53, 48,
- 89, 58,107,222,112,251,173, 91,206, 39, 43, 69,132,234, 8, 65, 37,214,225, 8,149, 71,117, 41, 99,244,205, 29,234, 44,199,137,
- 71, 83, 51,242,151,121,127, 63,214,220,200,196, 74,118,112,167,175, 41,139,205, 98,254,124,173,201,109,238,100,110,242,109,199,
-109,133, 63,204, 91, 30,168, 38, 19,189,145,248,103, 36,170, 72,113, 65, 81, 20, 82, 82, 82,144,145,145,129,132,132, 4,100,102,
- 22,185, 95, 51, 51, 51, 65,211,244,151,220, 16,161, 72, 72, 64,252,165,131,168, 55,126, 60,218,253,186, 26, 20,205,129, 66, 78,
- 97,115,231,158,200,201, 83, 64, 69, 19,176,107,211, 25,223, 95,127, 12, 22, 67, 1,251,118,233, 71, 18, 61,244,248,151, 66,151,
-244, 14, 37,130,200,215,215,215,235,107,255,127, 89,177,229,235,235, 27,238,235,235, 91,147,255, 42,239, 50, 44,253, 94, 18,163,
-245,176, 76, 0,218,103,131,102, 65,102, 68,244,219,183,156, 20,153, 66,102, 96,109,101,169, 50, 16, 10,232,188,252, 2,118, 96,
-104,176, 70,150,250,241,125, 13,206, 35, 34, 44, 44,204, 53, 37, 37, 5, 9,241,241, 32, 21, 50,176, 84,106, 48, 74, 57,122,185,
-119,134, 16,128,144, 69,128, 71,107,192, 97,243, 81, 80,152, 15, 0, 17,213, 14,142, 90,237,103,150, 45,130, 32,192, 55, 52, 4,
- 95, 44, 6, 95, 98,248,137,133, 75, 23,139,141, 64, 32, 56,121,238,220, 57, 91,123,123,123,172, 94,189, 26, 14, 14, 14, 77,237,
-236,236,228,198,198,198, 34,107,107,107, 52,107,214, 12,157, 59,119,198,141, 27, 55, 0, 29,114, 74,105, 73, 97,200,251, 56,116,
-201,204, 14,192,227,135,123,160, 86,168,208,218, 99, 15, 52,156,122,176,108,190, 10,244,135,227,144,167, 94, 41,178, 30,216, 12,
- 68, 82, 66, 28, 8, 54, 63, 92, 87,203, 83,201,231,224,224, 96,156,186,226, 15, 91, 71, 23, 36, 68,189,195,187, 7,119,241,212,
-210, 28,142, 46,205, 74,221, 64,149,150,145, 2,103,205,174,162, 52, 81, 63,207, 28, 43,200,206,206, 22,152,153,153,169, 74,234,
-206,214,214,246, 75,196,214,216,133, 11, 23, 34,151,203, 5, 6, 12, 0, 47, 58, 26, 26,141, 6, 29, 59,118, 68,187,118,237, 0,
- 0, 29, 59,118, 4,135,195, 65,203,150, 45, 97,103,103,135, 93,187,118,141,173, 76,104,177, 8, 4,145,100, 86, 83, 39, 39,167,
- 82,161,117,244, 88, 6, 2, 95,247, 6, 1, 62,182,239,252, 80,186,111,221,186,117,145, 42,141, 6, 65, 48, 97,213,148,241, 87,
- 27, 27,155,229,182,182,182, 78,155, 54,109, 98, 11,133, 66,204,152, 49,163, 65, 97, 97, 97,189, 98, 83, 50,150, 44, 89, 2, 0,
- 88,177, 98, 5, 86,174, 92, 9,149, 74, 37,175,140,236,232,230, 22,118,233,217,244, 20,166,208, 96,136,167, 69,189, 22, 61,250,
-246, 66, 3,231, 30,232,209, 55, 1, 0,214,153,113,226, 70,254,190,204,228,146,137, 33,113,248,246,205, 59, 43,220, 61,122, 44,
- 91, 92,248, 96,205,111,251,115,171,141,121,204,139, 63, 82,240,158, 63,106,203,142,189,199,182,252,178,100,142, 48, 33, 67,157,
-147,156,195, 20, 74, 4, 28, 73, 67,107, 66, 50,235,167, 95, 99, 82, 82,162, 23, 32,241,102,181, 51, 45,105,154, 70,116,116,116,
-105, 76,159, 82,169,132, 76, 38, 67, 98, 98, 98,105,159, 81,136,141,250,121, 79, 26,232, 38, 83, 40,228, 47, 66,163, 18,126,158,
- 61,174,147, 76,161,144, 71,197, 38, 68, 2,219, 43, 84, 99, 44, 22, 43, 84, 94, 32,239, 37,207, 85, 34, 35,232, 61, 28,122, 58,
- 66, 75, 18, 80,147, 20, 50,178, 10,160, 34, 1,138,197, 69,243,145,223,129, 34, 56,200, 76, 73, 6,139,205, 14,198,167, 65,251,
-122,232,161,199,191, 7, 85,106,145, 18,139, 86,167, 78,157, 78,151,181, 58,149,124, 6,160, 66,213,161, 60, 25,101,197, 84,137,
- 59,177,178,255, 41,199,171, 43, 62,139,209,170, 54,189, 67,201,127,214, 49,206,183,219,176, 98,156, 3, 77,146, 77,210, 51,211,
- 72, 14, 71,192,173, 99,172,144,102, 39,232,254,239, 42,149,202,239,238,221,187,131,123,247,238, 45,136, 10, 13,134, 58, 47, 15,
-234,188, 92,112,105, 18,102,162,182, 96,105, 84, 32,212,106,216, 55,165,161, 44, 16,193,255,105,152, 86,165, 82,249,233, 42,180,
- 88,108,246,167,113, 89, 18, 9, 4,134, 70, 16, 72, 36,229, 93,139,213,137, 2,131, 62,125,250,244,236,216,177, 35, 24,134,193,
-254,253,251,161,209,104,248, 26,141, 6,106,181, 26, 26,141, 6,249,249,249, 56,118,236, 24,118,239,222,253, 20,192, 31,213, 14,
-102,164,250,238,173, 59,247,219, 79, 30,231,197,189,238,183, 25,164,154,130,130,112,128, 76,166, 69,161,218, 0,148,249,120, 32,
-237, 26,216, 28, 33, 58,181,108,128, 43,231, 47,106, 64,170,238,233,168,194, 63,177, 10, 37, 38,196, 33,233, 99, 36, 36,249,169,
-176, 52, 50,128, 60, 58, 18,173,191,155, 80, 43,235, 68,157, 58,117, 64,211, 52, 60, 61, 61, 75,131,171,107, 43,182,178,178,178,
-112,245,234, 85,116,236,216, 17, 30, 30, 30, 72, 78, 78, 70,116,116, 52,190,249,230,155,210,125,130,131,131, 17, 24, 24,136,134,
- 13,171, 54, 18,102,102,107,175, 39, 37, 6,141,248,246,219,111,121,207,159, 63, 7,195, 48,112,118, 54,130,145,161, 24, 4, 75,
- 0, 23, 23, 43, 0, 69,207, 0,221,187,119, 71,126,126, 52,153,147,195, 92,175,230,116, 79, 2,184,172, 86,171, 63,116,235,214,
-205,238,227,199,143,152, 55,111, 30,231,204,153, 51, 37,166,100,248,248,124, 58,153, 66,161,168,220,117,223,164, 69,211, 69, 13,
- 72, 83, 15,161,168, 94,125, 35,139,150,104,224,220, 3, 0,208,219,107, 50, 26, 52,170,139,252,204,144,250, 74, 69,220, 16, 30,
- 39,199, 52,100,123,242, 91,209, 0,215, 73,202,244,135, 81, 40,114,157, 86,219,236,138,168, 51,105, 9,220,241,103, 47,255,121,
- 99,250, 55, 94,131,184, 90,138, 36, 93, 29,185, 38,231, 46, 93, 75, 79,142, 79,216,134,132,155, 97,127,217,255,170,180,226, 81,
-249,249,249, 16,139,197, 8, 11, 11, 83, 13, 24, 48, 64,192, 98,177,240,225,195,135, 82,161,101,101, 97,214,172, 75, 59,215,166,
-107,182, 28,187, 37, 22, 8, 4,125,187,183,117,121, 27, 21,159,196, 48, 68, 92,165,214, 86,173,246, 78,104, 80,176,167,165, 93,
- 35,118,244,195,231, 48,239,250, 13, 84, 42, 22, 20,106, 26, 42, 18, 32,217, 60,216,182,234, 0,147,134, 46, 96, 0,188,122,254,
- 84,171,210,106,111,233,199, 26, 61,244,248, 87, 91,181,152,170, 68, 82,241,231,108, 0,113,190,190,190,153,101,172, 77, 25, 0,
-130, 1,184, 21,239,151, 81,238,184, 12,130, 32, 94, 49, 12,211,174, 12, 79, 70, 25,193, 85,246,179,186,220, 62,193, 53, 16, 89,
-101,223, 63, 21, 90,149, 77,169, 4, 0, 11, 11, 11,171,214,173,219, 54, 60,112,232, 44, 24,134,193,251,192,141,200, 73,127,135,
-229,235,158, 53,180,183,183,247, 72, 78, 78,246,215,165, 4, 20, 69,157, 57,124,248,240,130, 14,109, 90,183,174,239,224,128,224,
-184, 88,240, 24, 10, 60,138, 2, 75,163, 2,135, 82,195,193,149, 2,139,144, 32, 37, 37, 15,235, 79,158, 13, 43,206, 18, 95, 37,
-154,126, 51, 8,171,147,242, 64, 16, 4, 54,117,114, 5,223, 80, 2,158, 88,130, 31,255,188, 95, 42,174,252, 86, 47, 1, 95, 34,
- 65,195, 14, 58, 37,132,151, 63,120,240,224,117,104,104,104, 59, 87, 87, 87, 44, 88,176, 0,113,113,113,160,105, 26,105,105,105,
- 74,169, 84,154,156,145,145, 17, 7,224, 18,128, 3,208, 33,243, 56, 79,165,220,234,119,225,168,119, 39,119, 15,139,111,135,236,
-198,229,243,243,145,155,151, 15, 57, 41,130, 76, 73, 66,166, 98,195,204,188, 5, 58,180,108,137,148,228,116,132, 63,191, 85,200,
- 81,201, 55,214,164,131, 18, 4,129,192,192, 64, 56,217, 25, 34,242,177, 63, 44, 12,184,112,179,179,129, 93, 23,247,210,252, 82,
- 85,129,203, 6, 57,118,236,216,210,204,240,125,250,244,137, 29, 63,126,188,237,252,249,243,113,232,208, 33, 60,125,250,244,179,
- 0,109, 15, 15, 15, 60,122,244,104, 21,128, 21,213, 25,245,212,106, 53,154, 54,109,138, 87,175, 94,225,238,221,187,232,209,163,
- 7, 60, 60, 60, 16, 18, 18,130,219,183,111, 35, 48, 48, 16, 4, 65,192,220,220, 28,218, 34,241,172,173,140, 76,163,193,185,223,
-126, 63,188,116,203,150,221,205,199,141, 27,135, 11, 23, 78, 99,242,164, 38, 32, 88, 2, 16,132, 0,131, 6, 54,193,234, 95, 95,
-161, 67,135,238,176,176,224, 98,203,230, 43, 49, 10, 5,117, 76,135,106, 92,115,251,246,109, 59,165, 82,137,220,220, 92, 70, 34,
-145, 16, 89, 89, 69, 51, 90, 43,178,104,201,229,114, 97,101, 68,161,111, 34, 54,230, 22, 48, 57, 76, 97,224,144,108, 50,176, 69,
-143,190,137,232,237, 53, 9,119,252,254,192,253, 91,119, 97,198,137,139,133,184,224, 70,102,108,102,190, 84,230,188,215,165,205,
- 84,118,146,236,214,222, 89,131, 34,217,182,182,244,185, 37,123,242,115,171, 18, 90, 0,136,236,183,199,255,188,196, 96, 80,231,
- 78, 29, 26,185,214,181,229,231,100,166, 51,231,175,220, 8,211,196, 94,184, 90, 70, 96, 49,213, 8,245,213, 62, 62, 62,191, 20,
-127, 62,242,243,207, 63, 79, 93,191,126,189,101,106,106,106,105,140, 86,122,102,246,253,206, 3,102, 81, 89,185,121,234,195, 91,
-126, 26, 46, 18, 10,248, 63,175, 63,252, 80,203,198,243,202,120, 73,154,222, 53,114,222,242, 57, 81,239, 3,237,235,137,248,184,
-242,211, 10, 4,223,126, 0, 45,139,135, 31,238,190,128, 74, 67, 33, 55, 51, 11,247,166,204,132,196,218, 20,187, 31, 94, 72,163,
-105,122,143,126,168,209, 67,143,127, 47, 42,211, 34, 4, 65, 84,148, 99, 47,173,130,223, 94, 85,117, 92, 37, 60, 95, 3,149,102,
-133,215,105, 10, 94,102,102,102,250,163, 71, 47,240,208,111, 13,252,253,214, 32, 60, 48, 24, 41,201,106, 36,167, 41, 97,100,100,
-244,172,138, 67,203,103,142,101,228,114,249,208,159,151,255,146, 42, 20, 25,160, 91,207,158,176,177,180,130, 1,143, 11, 54, 73,
-131, 77,112, 81,152, 97,130,200, 16, 57, 22, 31, 62,158, 94, 40,151, 15,173, 96,144,232, 85,153,200, 32, 8, 2, 2, 35, 67,240,
- 37,134, 16, 24, 26,125,226, 70, 20, 26, 25, 65,104,104, 4, 14,159, 95, 81, 48,252,103,156,133,133,133,195,134, 15, 31,158,147,
-151,151,135,169, 83,167,194,223,223, 63,240,214,173, 91, 70, 33, 33, 33,162,140,140,140, 70, 0,250, 0,216, 87,133,200,250,132,
- 51, 39, 39,186,128, 33, 85,163,124,127,153,171, 80,146,230, 24, 49,225, 12,196,172, 68,144, 20, 13, 6,128,157, 25, 31, 93,122,
-253,138,116,117,103,156,217,187, 86, 78,107,148,227,202,229,208,250,132,147, 97, 24,198,218,218,250,179, 58,184,123,247, 46, 70,
- 12, 31,134,190, 67, 6,195,178,190, 19,172,122,125,131,190, 83,127,192,222,189,123,193, 98,177, 96, 97, 97, 81,126,224, 45,229,
- 60, 26, 4,238,169, 80, 16,167, 66, 65, 28, 9, 4, 7,192,119,199,143, 31,255,205,205,205,237,193,211,167, 79, 55, 2, 24, 85,
-246,191,202, 96,101, 57,107, 86, 69,109,180,108,206,156, 57,138,168,168, 40,136,197, 98,144, 36,137,167, 79,159, 98,247,238,221,
-216,180,105, 19, 2, 3, 3, 97,110,110,142,134, 13, 27, 66,165, 82,225,213,171, 87, 10, 0,203,170,224,164, 51, 50,200, 97,219,
-183,175,207,242,242,234,138,195,135,119,194,198,166, 51,184, 28, 27,112,184,150, 16, 75,154,226,224,129,223,208,191,127,107,252,
-121,229,108,118,102, 22, 57, 12, 0,169, 67, 95, 82,190,120,241, 2,123,247,238,197,240,225,195,147, 71,140, 24, 65,229,229,229,
-149, 90,180, 74, 50,253,174, 44,142, 49, 83,169, 84,130,202, 56,191, 95, 28,150,252,211,218,240,213,105,169,201, 29,253, 31, 60,
- 27,123,255,214, 93,196, 68,221,199,253, 91,119,241,248,126,128, 79, 90,106,114,199,214,237, 27,243,134, 78,245, 94,116,244,226,
- 5,182,196,200, 22, 71, 47, 94, 96,143,153, 53,119,109,219,190, 61,150, 85,215,231,139,219,145, 41, 76, 79, 91,178,110,227,142,
- 66, 82,163,100,109,216,182, 43, 69,145, 33, 93, 86,166, 95, 50,213,245, 79,133, 66,177, 79,169, 84,218, 41,149, 74, 59,149, 74,
-181, 44, 46, 46,174,219,130, 5, 11, 50, 40,138, 42,181,150,102,188,253,243,217,187, 39, 71,214, 89, 89,152,138, 58,183,107,222,
-100,243,190,243, 15, 19, 18,211, 78,148,201,161, 85, 81, 57,149,133, 10,229,176,193, 67,199,203,114,115, 84,232, 52,215, 7,180,
- 80, 2, 21, 5,104, 25, 54, 72,130,131,208, 53,155, 33, 50, 51,196,201,216, 55,242, 60,173,102, 24, 62,205,161, 85,213,185,127,
- 9,244,156,122, 78, 61,231,127, 39,231,255, 50,108,241,233, 90,135,182,159, 88,180,170,155, 82,105,111,111,223,237,219, 65,189,
-208,221,235,103, 48, 12,131,119,111,126, 71, 78,198,123,216,219, 8, 16,157,144,223, 9,128,127, 13, 10,147, 16,151,152,216,113,
-206,178,159, 47,142,232,211,211,197,181,126,125, 65,189,122,142, 16, 91, 89, 33, 51, 51, 3, 79,158,191,213,174, 61,117, 46,172,
- 88,100,233,228,152,164,105,186, 40,200, 29, 64,207, 57,139, 65,176,217, 64,113, 26,135,146,129,177,126,187,206, 32, 56, 28, 80,
- 12, 13,149, 74,165,203,108,185,164,143, 31, 63, 14, 27, 55,110,220, 61, 63, 63, 63, 86,223,190,125, 91, 93,186,116,233, 75,214,
-204,131, 44, 61,234, 1, 0,175,181, 75,166,159,233,216, 99,176,145,115,243,182,188,182,245,216,208,104, 9,164, 36,199,195,239,
-226, 75,205,219, 23,183,242, 25, 82, 57, 74,158, 25,245,160, 42, 46,141, 70,147,208,168, 81, 35,235,189,123,247,150, 6,195, 83,
- 20,133,204,204, 76, 60,123,246, 12, 45,218,117,128,203,164, 41,200,200,200,192,246,237,219, 81,183,110, 93, 12, 28, 56, 16,217,
-217,217, 32, 73, 82, 87,135, 47, 5,224, 86,241, 11,229, 68, 22, 81,188, 4, 80,149,110, 67, 39, 39, 39,190, 82,169,108,197, 48,
- 12,155, 32,136,173,106,181,122,226,146, 37, 75,108,215,173, 91,135, 38, 77,154, 32, 51, 51, 19, 98,177, 24,206,206,206,200,200,
-200,192,203,151, 47, 41,185, 92,190, 23, 69, 11, 89,103, 84, 83,190, 15, 47, 95,198,118,156, 61,251,199,139,191,173,159,238,172,
- 84,117,231,155,153,185,131, 97, 72,100,100,196,161, 32,255,169,230,215,213,127,124, 76, 75,215, 14, 5, 16,165,227, 57,175,240,
-246,246, 6, 0, 33,128,159,163,163,163,131, 92, 92, 92,156, 43,179,104,233,130, 45,231,147,149, 0, 78, 13,235,107, 55, 47, 63,
- 51,196,217,140, 19, 23,219,209,149,222,190,229,124,178,210,200, 78,182, 38, 51,206, 63, 82, 42,187,181,247,232,197, 11,236, 9,
- 67,134, 81, 14,146, 40, 31,161, 21,115, 94, 7,106,198,205,205,173, 14, 65,100, 55, 72,207,122,255,122,242,212,233, 35,141,121,
-138,235,110, 14, 89, 13, 89,117, 91, 11, 3, 3, 3, 99, 81,195,153,161,197,136, 76, 78, 78,238,182,100,201,146, 91, 12,195,124,
- 18,155,144,158,153,125,191,147,151, 55,147,155,155, 23,148, 17,241,167, 46,185,212, 94,190,124, 19,216,211,181, 69,235, 11,191,
-173, 91,111,221,125,206, 2, 78,228,131,135, 0,165, 69,188,255, 67, 80, 2, 53,189, 57,224, 78, 90,158, 70, 51, 4,250,172,240,
-122,232,241,175,183,102, 85,165, 69,254,203, 49, 0,149, 4,195,235,124, 50, 78, 13,236,111, 53,113,174,215,167,174,131, 37, 0,
- 32, 58, 54, 5,209,177,201,183,163, 99,146,251, 86,163,120, 43,155, 94, 89,186,168, 52, 81,156,194,129,209,109, 81,233, 79, 56,
-205,205,205, 95,115, 56, 28,135,154,212, 6, 69, 81, 41,153,153,153,173,117, 44,231,152,250,245,235,175,143,143,143,191, 72,211,
-244,188, 26,170,253, 10, 57, 75, 22,149,102,113,248,189, 24, 82,221, 2, 0, 8, 14, 95,151, 69,165,203,114,182,144, 72, 36,251,
-184, 92,110,221,146,118, 44,137,193,162, 40,138,173,209,104,132, 20, 69,177, 1, 16, 44, 22,139,228,114,185, 74,130, 32, 72,146,
- 36, 19, 84, 42,213,116,252,149,112,180,170,115,175,118,160, 47, 22, 90,168,192,162,117, 23, 0,162,162,162, 26,155,154,154,142,
- 34, 8, 98, 56,195, 48, 77, 11, 10, 10, 84,203,151, 47, 15, 60,119,238, 92,126,253,250,245,251, 13, 24, 48,128, 8, 9, 9, 65,
- 88, 88, 24,147,149,149,117,190,216,138, 21, 93,195,190,196, 18, 8,216,163,205,204, 88, 3, 24, 6,110, 96, 64, 16, 44,132,230,
-229,209,215,229,114,234, 68,177, 96,172,105,255, 44,193,216,122,245,234,253, 17, 27, 27,203,173,204,146, 90,217,185,151,199,239,
-203,154,255,220,169,107,215, 97,207, 30, 63,190,244,211,218,240,213,101,183,205, 26,108, 58,121,204,204, 57,191,159,218,181,237,
-167, 29,151,115, 14,235, 82,206, 86,173, 90, 57, 17, 4, 49, 10,128, 43,195, 48,141, 24,134, 16, 18, 4,147, 67, 16, 68, 56,128,
- 16,181, 90,237,247,246,237,219,164, 47, 56,247,218, 60,225, 86,198, 89,186,168, 52, 40,170, 37, 5, 48, 58, 46, 42,253,159, 46,
-167,158, 83,207,169,231,252,255,227,252, 95,198,180, 10, 6, 72,221, 50,195,151, 32, 58, 38,185,111,116, 76, 50, 26, 53,106,196,
-124,248,240,161, 70, 34,173,178, 65,154,162,168,211,114,185,252,244,151,144,100,101,101,181,253,155, 43,239, 84,108,108,236,169,
-175, 73, 88, 44,164, 86, 23,191,106,139,208,194,194,194, 14,186,238,172,209,104,254,142,186, 33,138,173, 89,171, 42,219,161, 79,
-159, 62,241, 26,141,230, 46,128, 68,130, 32, 76, 0,100,107, 52,154, 91, 36, 73,166,125,248,240,161,237,230,205,155, 75, 50,223,
-255, 10,224,117, 45,203, 65,171, 84,212,201,148, 20,234,228,223,112,142, 39,213,106,245,124,115,115,243,134, 74,165,146,175, 84,
- 42,121,101, 39, 31,136, 68,162,140,170, 2,226,203,194,196,144, 56,194,227,228,152,155, 24, 18,229,133, 20,204,236,113, 65, 33,
- 11,107, 98,102,143, 11,186, 22, 44, 40, 40, 40,218,205,205,237, 56,139,197,170,207, 48,140, 53,192, 24, 51, 12, 50, 24,134,201,
-228,112, 56,201,111,223,190, 77,254, 47,186, 9, 41, 73,154,222, 72,170,213,127,197, 29,234,103, 23,234,161,135, 30,255, 28, 84,
- 26,163,197,169, 41,211,135, 15, 31, 8,125,125,234, 81, 86,108, 85,181, 49, 62, 62, 94, 5, 32,160,248, 85, 30,175, 1, 12,252,
-111, 63, 65,169, 84,218,186,178,109,186,138, 44,160, 40,102, 11, 8,155, 91,209,182,149, 59,114, 10,176,227,226,162,154,150, 45,
- 56, 56, 56, 1, 58,186,216,245,208, 67, 15, 61,244,248,219, 48,173, 50,241,197,209,215,141, 30,122,232,161,135, 30,122,232,161,
-199, 23, 97,127, 25,193,245,137,117,139, 64,229, 51, 7,106,226,123,173,205,236,131,187,122, 78, 61,167,158, 83,207,169,231,212,
-115,234, 57,255,117,156,255, 84,124, 34,178,116, 73,142,254, 53,160,159,250,170,231,212,115,234, 57,245,156,122, 78, 61,167,158,
-243,223, 32,178, 62,121,149,100, 61,208,187, 14,245,208, 67,143,127, 45,206,157, 59,167,211,162,162,163,127, 58,232, 37,145,152,
- 46, 47,204,207, 91,127,122,227,228, 75, 37,191,143, 24, 49,130,210,215,162, 30,122,232,129,218, 4,195, 55,104,224,208,140, 69,
-209, 93, 24,134,197,102, 88,140,150,200, 87,156,137,206,201,249, 36,237, 64,157, 58,117, 76,184, 44, 12, 36, 24, 70, 76, 16, 52,
- 69,179, 89, 79, 99, 98,146,222,214,160, 96,124, 83, 83, 83,111, 30,143,215, 75,173, 86, 59,176, 88,172, 36,149, 74,117, 87, 46,
-151,239,196,231,137, 11,255,223,208,184,113,227, 49, 15, 31, 62, 52,113,119,119, 87,137, 68, 34, 82,161, 80,112,110,222,188,249,
-127,236, 93,119, 88, 20,215,219, 61, 51,179,189,194,210,171, 40, 40,138,162, 2,246, 94, 19,141, 93, 99,137,177, 23,212,152, 24,
- 53,209,104,162,137,221,104, 76,172,137, 37,118,163,198, 26,123, 55, 98,111,216, 80,177, 75,239, 44,176,176,108,159,153,239, 15,
-216,205,138,148, 93,196, 68,127, 31,231,121,134,101,118,103,207,222,153,185,115,239,185,239,125,239,251, 10, 62,250,232,163,236,
-103,207,158,149,107, 69,162,151,151, 87,251,245,235,215,251,119,234,212, 9, 53,106,212, 80, 15, 24, 48,128,215,172, 89, 51,222,
-168, 81,163, 94, 36, 37, 37,157,181,147,174, 14, 65, 16, 91, 9,130,160, 24,134, 25,130,127, 66, 55, 84, 52, 72,146, 36,199, 16,
- 4,209,155,101,217, 0,130, 32,158,179, 44,187,159, 97,152,210, 2,183,150,134,143, 1,116, 33, 73, 50, 12, 0, 24,134,185, 5,
-224, 40, 96,251,202,187,127,147, 83, 44, 22,135, 2, 64,126,126,254,237,138,226, 36, 8, 34, 20, 0, 88,150, 45, 47,231,112,145,
- 72, 52, 26, 0, 52, 26,205,239,176, 33, 29, 84, 81,176,107,130,216,176,217,209, 0,128, 91, 63, 4, 1, 0,236,217, 39,198, 70,
- 19,246,252, 86,113,124,246,112, 20,131, 46,131, 6, 13, 90,240,199, 31,127,252, 0,224,192,219,168,248, 30, 30,190,171,126, 94,
-190,206,107,226,231, 35,127, 68, 65, 70,136,210, 31, 72,224, 3, 62, 69,245,208,211,244,133, 7,192,110, 0, 28, 39, 39,167,129,
-124, 62,191,181, 94,175,247,228,112, 56,201,122,189,254,124, 78, 78,206, 14,148,146, 1,193,230,235,250, 16, 10, 67, 62, 60, 8,
-230,159, 60,111, 44, 9, 29, 79,140, 20,162, 54,178,222,129,102,148, 4,240,101,225,185,110, 64,201,225, 60, 74,107,124, 38,122,
-121,121,245, 86,169, 84,249, 20, 69,177, 40, 88,245, 92,240,167,224,115,130, 97,152, 52,165, 82, 57,164, 44, 46, 73, 21,212,226,
- 75,136,173,180, 17, 26,147,142, 29,167,142, 71,180,212, 23,205, 89, 96, 8, 11, 84, 35, 41,210,149, 97,152,100, 0,103, 73, 19,
- 14,229, 37,225,233, 59,218,185,251, 21, 94,215,170,133,251, 92, 0,238, 0,238, 2,152, 8, 32,175, 82,255,252,107, 40,234, 12,
-127, 4, 64,178, 69,104, 89,133,187,111,219,173, 91,183, 8,127,127,159, 58,125,123,245, 89, 48,118,204, 56,130,162, 72, 68,221,
-191,207,249,116,200,240, 15, 21, 10,133,183, 84,167,171, 13,130, 96,242,133,194, 40,149, 42, 39,113,247,142, 63,100, 65,181,106,
-209, 52,205, 96,205,218,213, 31,237,249,107,223,183, 54,138,173,154, 30, 30, 30, 91,167, 77,155,230,209,163, 71, 15,202,195,195,
- 3, 49, 49, 49,142, 59,119,238,172,181,114,229,202,254, 89, 89, 89, 67, 0, 60, 46,199,201,182,242,112, 34, 63,148,137,136, 14,
-200,165,145,107,196,153, 20, 13, 78, 2,184, 80,222,171,151,159,159,255, 69,126,126,126,147, 70,141, 26,177, 27, 54,108, 32,134,
- 13, 27,198, 18, 4, 65,104, 52,154,205, 0,202, 37,180, 36, 18,201,175,157, 58,117, 10, 12, 12, 12,124,254,236,217,179, 46,187,
-118,237, 58, 58,116,232,208, 0,137, 68,242, 4, 64, 77, 59,233, 54,101,102,102,134,104, 52, 26,248,248,248,108, 0,208,224, 45,
- 84, 34,130,162,168,253,222,222,222,236,226,197,139, 15,132,132,132,184, 43,149, 74,211,148, 41, 83, 58, 94,189,122,245, 35,154,
-166,123,216, 33,182, 20, 4, 65,172,117,119,119,119,249,241,199, 31,159, 54,108,216,240,174, 64, 32,224, 63,121,242, 68, 60,121,
-242,228, 73,143, 31, 63,238,207,178,236, 24,192,174, 14, 66, 65, 16,196, 90, 47, 47, 47,151, 5, 11, 22,196,132,133,133, 69,241,
-120, 60,222,147, 39, 79, 36,223,124,243,205,196,232,232,232,114,113,146, 36,185,166, 73,147, 38,138, 31,126,248,225, 97,173, 90,
-181, 46, 83, 20,197, 79, 72, 72, 32,103,205,154,245,249,169, 83,167,250, 49, 12, 51,182, 60,229,116,115,115, 83,204,154, 53,235,
- 97,179,102,205,174,242,120, 60,222,163, 71,143,200,105,211,166,125,254,244,233, 83,155,203,233,228,228,212,142, 32,136,117, 41,
- 41, 41, 28, 0,240,244,244,108, 44,151,203, 87, 90,231,180, 52,251, 8, 24,141,198, 92,173, 86, 59, 72,169, 84, 22, 27, 8,119,
-216,244, 21,221, 1, 96,165,193,188, 95,240, 90,214, 62,176,230,144, 45, 39, 29,234, 81, 16, 23,239,103,245,136, 94, 0, 48,176,
- 48, 85,248,207,106,128,195,225, 48,161, 30, 19,217,219, 41,118,133,140,233,217,190,125,251, 89,103,207,158, 93,221,182,109,219,
-111,182,109,219,230, 22, 31, 31,191,232,194,133, 11,190,159,124,242,201,176, 51,103,206, 44,204,200,200,216, 83, 81,149,159,207,
- 19, 8, 8,146,128, 72, 40,150,219,114, 60,151, 36,187, 93,238,217,115,244,239,143, 30,133,173,140,142,246, 87,123,122, 54,153,
- 48, 97,130,123,159, 62,125, 72, 95, 95, 95, 60,125,250,212,121,219,182,109,181,127,255,253,247,222,217,217,217, 95, 2,136,125,
- 19,145,165,206, 70, 61,157, 30, 97, 44, 11, 71,203, 3, 75, 32, 91, 96,192, 45,246, 33,238,189, 3, 98,235,251, 77,155, 54,253,
-240,244,233, 83, 44, 92,184, 16, 0, 86,217,249,253,201, 61,123,246,236,186,111,223, 62,209,238,221,187, 69,141, 26, 53,130,135,
-135, 7, 10, 7, 83,150,192,212,254,254,254,182, 93, 51, 6, 63, 47, 59, 58,162, 65,148,242, 24,126,237,147,178, 80,228, 3, 83,
-243,158,129,189,187, 13, 11,131,131,171, 24, 66, 41, 7,217,153,170,186,143,110,197,119,250,123,215,211, 69, 79, 35,211,127, 84,
-199,225,123,148, 28,147,239, 63,129,179,179,243,134, 23, 47, 94,180,147, 72, 36,175,188,255,252,249,243,208,192,192,192, 28, 0,
- 95,217, 43,220, 92, 93, 93,183, 51, 12,163,203,204,204, 28, 9, 0, 50,153,236, 15,137, 68,162, 72, 78, 78,254,246,109, 13,100,
-204, 40,170, 69,222,115,139,150,197, 95,171,184, 92,135, 4, 73, 51, 45,198,142, 25, 71, 12, 24,248, 73,202,211,231, 47, 24, 14,
-151, 63,240,248,137, 19,226, 58,117,234,144,186, 85,171, 96, 74, 79,135,113,210,164,230,167, 79,159, 54,246, 27, 56, 88,195,165,
-136, 77, 1,254,213,196,127,238,216,233,177,111,239,158, 22, 0,202, 18, 90,124, 15, 15,143,173,231,206,157,243,246,247,247, 71,
-118,118, 54, 98, 98, 98,160, 86,171,209,191,127,127,110,139, 22, 45,188,251,246,237,187, 53, 39, 39,167,165, 29,150, 45,247, 26,
- 62,156,195, 99,134,247,169,249,209,135, 45, 36,222,190,213,193,166,104, 17,255, 44,186,209,225,115, 87, 39,108,218,123,244,241,
-211, 28,182, 27,138,207,141, 84, 42, 50, 50, 50,166,246,238,221,123,111,187,118,237, 92, 5, 2, 1,188,188,188,136, 30, 61,122,
-164, 37, 37, 37,205, 46,183,106, 41, 76, 97, 67,146, 36,109,253, 90, 76,122, 32, 91,224,163, 80, 40,160, 80, 40, 0,192,251, 77,
- 71,158,142,142,142,171,100, 50, 89, 95,149, 74,165, 33, 73,146, 37, 8,130,213,235,245, 34,133, 66,113,231, 97,244, 99, 47,157,
- 78, 87, 99,201,178,223,151,183,111, 21, 34, 63,117,234, 20,250,244,233,195,158, 60,121,114,140,173,121,234, 8,130, 88,219,187,
-119,239,252,153, 51,103,106,159, 62,143,241,126,248,248, 57, 33, 17,242, 25, 23, 23, 23,238,245,235,215, 57, 75,151, 46, 21,206,
-154, 53,107, 45,203,178,125,237,184,158,107, 63,249,228, 19,195,215, 95,127,157,252,232,233, 11,183,123, 15,159,178, 82, 33,215,
-228,226,226, 76, 93,189,122,149, 41, 15, 39, 73,146,107,166, 78,157,170, 26, 51,102, 76, 86,166, 50,199, 35, 75,149,199, 10,184,
-148,209,195,195,131,115,224,192, 1,221,246,237,219,201,209,163, 71,175, 97, 24,166,159, 29,215,119, 77,143, 30, 61,114,167, 77,
-155,150,253,228,249, 75,143,123, 15, 30, 67, 44,224, 26,221,221,221,168, 27, 55,110, 24,150, 44, 89, 66,206,155, 55,207,166,114,
- 74, 36,146, 45,187,118,237,226, 28, 56, 80,208,246, 93,185,114,133, 12, 8, 8, 16, 91, 31,163,209,234, 64, 18, 64, 70, 70,134,
-184, 89,179,102, 91, 0,188, 22,220, 55,108,118, 52,134, 77, 7,190,248,226,139,100,123, 43, 75,152,231,132, 50,143,161, 87, 7,
-177, 75,243, 71,244,226,112, 56,204,232,209,163, 83,138,126,174,213,106, 9, 0, 61,176,200,118,177,213,165, 75,151,239,142, 28,
- 57, 82,125,219,182,109,191,108,223,190, 93, 15, 0, 66,161,208,101,231,206,157, 11,251,247,239,143,254,253,251,207,220,179,103,
- 79,133, 9, 45,154,165, 13, 0, 32, 16, 10, 4,209,209,209, 68, 80, 80, 80,169, 94,174, 6,134,185,249,251,163, 71, 13, 63, 11,
- 10,106,164,100,152, 26,188,143, 62,202,155, 60,121,114,134, 74,165, 66, 76, 76, 12, 12, 6, 3,134, 13, 27, 70,181,109,219,214,
-171,127,255,254, 43,114,115,115, 63, 6, 96,176,161, 78, 46,241,246,246, 14,207,201,201,201, 51, 91,117, 90, 14,161, 57,173, 67,
- 77,130,250, 53,140,124, 30,101,226,117,159,196, 16, 39, 87, 17,234, 32,127, 92, 4, 0, 94, 62,210,237, 28, 12, 20, 11,185, 15,
-252,105, 46,230,185,250,136,218,167,199,106,230,168,227, 74, 21, 75, 31, 75, 36,146, 94,106,181,122, 79, 97,231, 92,179, 91,183,
-110,184,122,245, 42, 0,180, 40, 20, 90,237, 73,146,252,148, 97,152,245, 0, 74, 75,229, 54,161,103,207,158, 31,236,219,183, 79,
- 6, 0,123,246,236,129,209,104, 68, 64, 64, 0,120, 60, 30,248,124, 62,184, 92,174, 37, 59,136,141,240,116,117,117,129,139, 3,
- 23, 10, 39,201, 71,223,252,214,147, 83,165,142, 28,105,244,125, 40,217,108,152, 88, 29,120,206, 18,212,234,228,136,176, 15,219,
-147,135,214, 68,125,123,232,215,135, 13,243, 73,116, 71, 44,116,239, 74,207, 78,146,164,224,238,221,187,240,242,242,122,229,125,
-138,162, 0,160,117, 57, 40,103, 62,127,254,188, 89,100,100, 36,218,181,107, 55,179, 94,189,122,157, 35, 34, 34, 60, 50, 51, 51,
-209,174, 93,187, 21, 9, 9, 9, 7,222,246, 57, 89,107,145,255, 21, 83, 23, 89, 68, 73,182, 45, 24, 5,147, 20, 69,145,120,241,
- 60,198,216,174, 93,135,161,113,113,113,210, 38, 77,154,144, 92, 46, 23,234,179,103,161,189,113, 3, 82,169, 20,189,123,247,230,
-158, 63,127, 94, 46,151,202, 71,189,124,241, 50,151,162, 72,176, 44, 89,166,207,131, 66,161,248,252,219,111,191,245, 8, 12, 12,
-132,201,100,178, 68, 52, 55,153, 76,136,143,143,135, 84, 42,197,144, 33, 67,220,196, 98,241,231, 54,158, 71,213,154, 1,110,183,
-206, 29, 93,219, 96,242,216, 46,146,154,226, 83,144,196,127, 9,233,158,207, 80, 59,233, 56,166,245,106, 34, 57,249,235,204,176,
-234, 94, 78,183,172, 76,172, 54, 67,167,211, 93,140,138,138, 26, 21, 17, 17,193, 0,192,223,127,255,205, 62,124,248,112,204,155,
-140, 66, 25,134, 65,118,118, 54, 24,134,161, 10,247,205,175,255,105,125,144,203,229,107, 58,119,238,252, 73,108,108,172,232,216,
-177, 99,206,113,113,113, 46, 47, 95,190,116,173, 89,179, 38,103,225,194,133, 71,180, 58, 3,101,164, 89,189,137, 54,230, 38,223,
-191,255, 60, 43, 53,245,214,198,141, 27, 53, 4, 65,244,182,241, 55, 62,246,244,244,116,158, 62,125, 58, 8,174,184,113,173,218,
-245, 2, 41,174,200,129,228,242, 29, 52, 26, 45,253,226,197,139,248,233,211,167, 87, 11, 9, 9,241, 66,193,244,154, 77,156, 94,
- 94, 94, 46, 95,127,253, 53, 56, 2, 89,104,253,144,176,234,124,129, 68, 70,113, 69,178, 38, 77,154,180,125,254,252,121,210,180,
-105,211, 60, 27, 53,106,100, 23,103,163, 70,141, 20,163, 71,143, 54, 9, 69,178,102,254,254, 1,181,235, 7,215,238, 90,179,102,
-205, 94, 28, 14,199,148,158,158, 30, 59,100,200, 16,207,238,221,187,187,219,195,233,230,230,166,152, 54,109,154,201,215, 47,160,
- 83,167, 15, 62,108,202, 19,201, 28, 56,124,137, 99,126,190,150,126,244,232, 81,236,140, 25, 51, 60, 67, 67, 67,221,108,225,204,
-207,207,231,186,184,184,160,110,221,186,168, 19, 16,128,156,156, 28,236,219,183, 15,155, 54,109,194,250,245,235,177, 99,199, 14,
- 52,108,249, 33,100, 50, 25,146,146,146,160, 82,169,184,255,118,133,162, 87, 7,177, 43,245,225, 61,198,141, 27,151, 52,122,244,
-232, 20,145, 72,196, 20,221,156,156,156,232, 65,131, 6,165, 14,249,102, 89, 15,243,212, 98, 25,150,172,187, 71,143, 30,125,182,
-109,219, 54,212,169, 83, 7,157, 58,117,226, 3,192,231,159,127,206,239,223,191, 63,118,237,218,133, 61,123,246, 60, 8, 12, 12,
-188, 4,160,167, 45,229, 28, 50,100, 72,203,126,253,250, 93,232,215,175,223,237, 1, 3, 6,172, 27, 51,102,204, 43, 61, 87,114,
- 82,194, 77,189, 94,143,144,176, 70,226,185, 27,174, 13, 42,139,239, 33,176,109, 93,116,244,166, 31,239,223,143,157, 89,167,142,
-163,223,203,151, 78,155,151, 44,113, 49, 39,233, 54, 26,141,136,143,143,135, 66,161,192,160, 65,131, 92, 4, 2,193, 16, 27,138,
-185,180,103,207,158,195,227,226,226,164,191,255,254,187,231,237,219,183,189,146,147,147, 61,207,156, 62,225, 58,229,171,207,101,
- 14, 82, 62, 63, 41,157, 37, 0,224,101, 18, 36,209, 47,208,146,101,225,104, 61,157, 88, 46,120, 66, 36,242,193,202,234, 45, 29,
- 31,127,189, 43,116,192,180,195, 97, 46, 10, 79,193,244, 82,190, 81,127,241,226,197,187, 15, 29, 58, 52,176,101,203,150,123, 1,
-136,138, 57, 70,216,176, 97,195,125,187,118,237, 26,222,170, 85,171,139, 0,234,150, 56,138,244,241,233,253,215, 95,127, 57,155,
-247, 93, 92, 92, 32, 20, 10, 95, 19, 89, 60, 30, 15, 36, 73,218,125,122,243,119, 14,228, 56,213,214, 33, 42,235, 40,118, 45,190,
-139,197, 31, 61, 98, 22, 52,127,169, 91, 53, 36, 26, 39,119,221, 69, 26,238,162,203,103,213, 49,112, 70, 72, 71, 49,141,121,239,
- 82, 7,158,158,158,254,105,235,214,173,119,119,233,210, 69, 23, 25, 25,137,244,244,116,120,123, 91,198,218, 41,229,160,116, 18,
-139,197,240,245,245, 69, 96, 96,224,192,243,231,207,123, 24,141, 70,188,124,249, 18,105,105,105,183,254,141,115,178,214, 34,239,
- 25,138, 58,195, 31,121, 77,104, 21,230, 22, 58, 7, 0, 44, 65,168,239, 70, 69,113, 41, 62,127,240, 31,219,183, 11,120, 60, 30,
- 98, 99, 99,241,224,193, 3,228,159, 57, 3,205,229,203, 72, 77, 77, 69, 94, 94, 30,220,221,221,177,118,195, 6,137,158,102, 71,
- 60,122,252,152, 98, 73,214,218,223,160,216, 37,158, 2,129,160, 99,159, 62,125, 74, 20,100, 73, 73, 73,232,210,165, 11,151,162,
-168,226, 86, 53, 20,229, 36,188, 92,137, 67,103,246,206,245,244,228, 63, 0,158, 78, 6,114,111, 1,172, 14, 48,233,129,196,123,
-192,145,217,240,203,139, 38, 78,204, 29,234,225, 45,230, 28, 42, 70, 41,151,181, 20, 53, 32, 40, 40,104,253,224,193,131, 73, 0,
-104,223,190, 61, 17, 20, 20,180, 14, 64, 64, 41,223, 57, 93, 70, 39,121, 53, 43, 43, 11,253,251,247,119,174, 94,189,250,233,254,
-253,251, 59,155,223, 47, 47,167,217,154, 92,167, 78,157, 76,161, 80,184, 3,176,169,129,181,112, 58, 58, 58,174,234,210,165, 75,
-223,237,219,183,243, 0,224,220,185,115, 56,116,232, 16,238,223,191,143, 39, 79,158, 48, 97, 97, 97,174,203,214,239, 94,179,106,
-245,150,165,189, 90,132,120,181,109, 28, 86, 91,154,151,149,231,238,238,222,130,101,217, 0, 27,203,217,101,246,236,217, 15, 30,
- 62,139,117, 32, 57, 92, 14,143,203, 17,200,229, 18,119,133, 76,226,227, 36, 22,122, 11, 72, 66,154,159,159,159,178, 99,199, 14,
- 6, 64, 23, 91, 57,231,206,157,251,226,225,211, 88, 71,130,228,112,184, 28, 46, 79, 42, 21, 59,126,212,169, 93, 35, 0,224,129,
-229,169, 84,170,212, 77,155, 54, 25,236,225,252,225,135, 31,162,148,217,121, 10, 14,151,203,229,112, 40,203,181,148,136, 68,174,
- 98,129,128,175,211,233, 18,151, 47, 95,174,177,135,115,246,236,217, 15, 30, 61,139,115, 34, 9,130, 34, 8,146, 35,151, 73,156,
-157, 29,196,174,174, 82,145,139,152, 67,241, 85, 42, 85,226,214,173, 91,109,226, 52, 24, 12,188,212,212, 84, 60,124,248, 16,190,
-141, 26,225,212,169, 83,168, 82,165, 10,250,247,239,143, 79, 62,249, 4, 34,145, 8,237,155,213,195,244,233,211,241,236,217, 51,
- 24, 12, 6, 65,113,156,102, 63,169,162,240,242,242,138, 44,171,242, 20,249,238, 43,229, 12,245, 0,187, 82, 31,222,195, 90, 96,
-149,196,239,228,228, 68, 23,103,237, 42,202,217,165, 75,151,239,206,156, 57, 83,125,235,214,173, 61,134, 12, 25,114,113,235,214,
-173,104,218,180, 41, 30, 62,124,136,106,213,170, 97,243,230,205,248,228,147, 79, 46,174, 88,177,162, 71,100,100,100,136,191,191,
-255,183,101,113, 14, 24, 48, 96,124,104,104,232,217,148,148,148,102, 74,165,178,238,190,125,251, 70,244,238,221,251,197,192,129,
- 3, 59, 88, 4,163,209,184,253,200,193,189,232,218,163, 15,106, 5,215, 93, 51,236,219,109,245,202,120, 54,217,251,192,186, 77,
-201,201,233,219,181,218,252,254, 92,174, 88,124,237,154,211,158,213,171, 93,172,151,124, 39, 38, 38,162,123,247,238, 92, 30,143,
-215,170,140,114, 46,238,213,171, 87,255,125,251,246, 41,204, 86,157,203,151, 47,227,222,189,123,136,137,137, 65,118,118, 54, 58,
-140,201,195,184,133, 5,220,227, 22,178,248,240,115, 86, 82,206, 54,196, 2, 81, 21,120, 56,203, 57,151, 70, 44,175,245,121,248,
-154, 58, 28,169, 19, 23,127,124,243, 4, 25, 47,117,123, 74,224, 36,154, 53,107,182,173, 95,191,126,132, 94,175,135, 94,175,215,
- 3, 40, 54,170,175,183,183,183,176,126,253,250, 24, 51,102, 12, 41,151,203, 87,148, 84, 78,181, 90,173, 59,122,244, 40,134, 12,
- 25,130, 47,191,252, 18, 53,106,212,128, 66,161, 0,151,203,197,150,109,127,186,124, 50, 98,108,205, 6, 45, 91,135,212,105,208,
-180,126,174,142,106,196, 21, 41, 70,151, 96, 13, 41,246,220,243,220, 34, 17,245,242, 10, 86,246, 72, 96,174,111,206,207,155,242,
-233, 79,209,143, 34, 82,239,127,219,111, 93, 20,123,165,121,198,182,137,113, 72, 53, 62, 68,171,254,126,240, 15, 85, 76,146,248,
- 34,168,188,215,211, 70,216,197, 89,175, 94,189,150,215,175, 95, 23,180,110,221, 26,177,177,177,224,114, 45,227, 41,250, 77,202,
- 57,123,246,108,129, 86,171,197,157, 59,119, 48,116,232,208, 68,131,193, 48,233, 77,202,105,143, 69,203,172, 69,222, 51,172, 43,
-178, 37,151,100,209,154, 13, 0, 70, 6,135, 6, 15, 29,145,127,248,240, 97, 49,159,207, 71,108,108, 44,146,147,147,177,101,211,
- 38,186,189,155, 91,110, 39,111,111,213,150, 77,155, 88,189, 94, 15,150,101, 17, 20, 20,132,190,125,251,138, 62,238, 63, 48,141,
- 80,105,254,180, 97,154,199,211, 60,191, 62, 98,196,136,215, 62,159, 50,101, 10,228,114, 57, 8,130,240,176,225,228,250, 77,152,
-221,203, 71,225,239,152,202,166,108, 81,130, 18, 2, 28, 25,192,145, 3, 66, 7, 64, 32, 3,248, 98,232, 34,207, 42, 73,182, 83,
- 76,159, 86, 35,189, 1,216, 51,213, 3, 47, 47,175,153,103,207,158,117,141,140,140,100, 85, 42, 21,146,147,147,217, 5, 11, 22,
-184,122,121,121,205, 44,239, 29, 73, 74, 74,154,219,181,107,215,212,161, 67,135, 58, 28, 63,126,220,119,232,208,161, 14, 93,187,
-118, 77, 77, 74, 74,154,251, 38,119,154,199,227, 81,247,239,223,119,154, 55,111,222, 39, 0,110, 6, 7, 7,103,122,123,123,223,
- 68,129,211,100,169,144,201,100, 22,145,101,182,174,113, 56, 28,112,185, 92,120,121,121,233,149, 74, 37,221,170, 65,128, 40,200,
-129, 52,122, 9,120, 34, 39,145,208, 71, 38,119,104,146,153,153,121,151, 32,136,231, 54, 78,241,133, 54,110,220,152, 75,179, 92,
-102,220,224,246, 94,159, 15,111,231,246,219,188,209, 85,150,207, 13,247, 94, 60,107, 84,208,220,169,131,218,145, 12,163,173, 86,
-173,154,135,217,161,221, 6,243,121, 88,195,134, 13, 57, 12,184,120,248, 56, 38, 53, 54, 33, 49,247,131,182,205, 44,150,203, 58,
-161, 97,157, 92, 93, 93, 91, 7, 5, 5, 53, 36, 8,194,166, 37,201, 34,145, 40,180, 86,173, 90, 28,146,226, 18,206, 10,153,175,
- 76, 42,114,183, 76,161, 56, 58, 54,119,114,117,237, 71,178,108,142,167,167,167,155, 72, 36, 10,181,227,220, 57, 12,120,112,119,
-115,114,112,117,113,148,118,106,215,162, 70,179,230,205,106,214,107,210,180, 89,112,131,134, 31, 19, 38,147, 42, 32, 32,192,205,
-236, 36, 95,134,165, 85,184,125,251,118,204,155, 55, 15,245,253,252,224,237,237, 13, 55, 55, 55, 92,190,124, 25,215,175, 95,135,
- 66,161, 64, 90, 90, 26,150, 44, 89,130,253,251,247,195, 96, 48,200,236,173, 79,182,136,173,210, 96, 50,153,200,162, 2,171, 36,
-126,145, 72,196,152,157,228, 75,194,209,163, 71,183,153, 45, 89, 19, 39, 78,108,185,108,217,178,139,209,209,209,144, 74,165,184,
-126,253, 58, 70,140, 24,113,113,197,138, 21, 45,199,142, 29,139, 77,155, 54,225,197,139, 23, 27, 74,227, 27, 48, 96,192,172, 81,
-163, 70, 45,143,136,136, 32,221,221,221,161, 80, 40,208,171, 87, 47,108,216,176,129, 99, 50,153, 54,246,235,215,239,118,191,126,
-253,110,211,241, 39,191,219,189,126,193,229,168,187,183, 49,126,194,215,124,189,201, 56,205,134,211,103, 53, 82,105,174,169,117,
-107,229, 46,163, 49,127, 0,143, 39,118,184,125,219,233,208,198,141, 22,177, 53,125,250,116, 56, 56, 56, 0, 5, 14,204, 40,197,
-170, 19,190,127,255,126, 75,123,232,236,236, 12, 62,159, 15, 30,143, 7, 46,151, 11,138,162,112,122,141, 4,171,167, 23,232,139,
-213,211, 9,156, 92, 69,168,223,228,222,137,189, 81, 87,225,206,191,253,217,230,224,144,186, 29,156,113,121,103, 10, 22,116,141,
- 76,184,190, 43,125,178, 54, 13, 63,151,240,181, 6, 83,166, 76,169,147,150,150,134, 27, 55,110,224,198,141, 27, 37, 89,128,180,
- 7, 15, 30, 92,148,151,151, 7,127,127,127,244,236,217,179, 53,128, 70, 37, 60, 55,104,216,176, 33,186,119,239,142,118,237,218,
-161,126,253,250,208, 27, 76,220,126,131,195,107,221,127,145,238,189, 96,201, 2,241,217,191,247,145, 23, 47, 70, 80,219,246,158,
-116,104,214,238,195,229, 60,153,231, 85,136,156, 61,109, 57,207,124, 58, 19,161,158, 31, 97,221,153, 9,228,202,115, 67,165, 91,
- 14,173, 12,144,201,100,196,173, 27,183,141, 91,126,221, 21, 87, 87,210, 51,237,234,206, 76,228, 19, 41,232, 48,220,159,100,128,
-190,239, 74,207, 46, 20, 10,151, 69, 68, 68,120, 24, 12, 6, 68, 69, 69,225,203, 47,191,212,190, 33,165,197, 0,226,235,235,139,
-115,231,206, 97,208,160, 65,218,212,212,212, 43,255,214, 57, 89,107,145,255, 21,112,172, 20,164, 5,241,241,241,217, 10,133,194,
-187, 86,173, 90,164, 94,175, 47,152,146,216,179,135, 94,191,113,227, 17,173, 86, 59, 1, 0,111,213,111,191,173,241,246,241,105,
- 55,120,200, 16,194,104, 52,162,107,215,174,252,195,135, 15, 59, 63, 79, 75,203,181,161,195,121,229,247,134, 13, 27,134,101,203,
-150, 1, 0,190,248,226, 11,139,105,157,176,193, 97, 73,234,128, 46,157,186, 53,148,199, 75, 86,202, 13,205,141,121, 85,159,201,
-174, 74,242, 68, 13, 65,242, 57, 16, 82, 96, 12, 70,211,147,180,222, 55,159, 61,169, 93, 71,164,204,172,214, 49,184, 13,214,159,
-218,218, 37,159,214,238,178,185,193, 17,139, 27, 75,165, 82,220,188,121, 83,217,176, 97,195,108,150,101, 29,230,206,157,235, 34,
- 22,139, 27,191,193,181,127,249,248,241,227,214, 45, 90,180,248,156, 36,201,142, 12,195,156, 78, 77, 77, 93, 5,224,165,141,223,
- 31, 7,224, 7, 0,150,145,165, 94,175, 7, 73,146, 96, 89, 22, 3, 6, 12,192,244,233,211,235,220,187,119, 15,103,207,158,117,
-234,216,177,227, 85, 0,217, 0, 70, 2, 40,214,106,166, 82,169, 52,215,175, 95, 23,157, 61,123, 22, 12,195,192,201,201, 9,114,
-185, 28, 2,129, 0,189,122,245,146, 78,155, 54,173,195,137, 19, 39,210, 84, 85,171, 80,194,228, 68,181, 64, 42,149,193,195,187,
-213,216,129,159, 70,179, 44,187,223,142,198,129, 47,226,152,180, 4,173, 35, 23,127,191,130, 20,243,120,132,144,199,129,128,201,
-199,119,139,230, 19, 60,150,230,192,206,249,121, 30,143,199,147, 9,160,167,248,148, 81, 76,160, 66,162,196, 81, 20,197, 23,242,
- 74,246,199,224,146, 36, 73,146, 36, 15,128,205, 73,251, 4, 2, 1, 79, 38, 96, 75,228, 20, 81, 4, 69, 16, 4, 31, 37,172, 68,
- 11,245, 0,107,182, 34,241, 39, 60,215, 89,139,226, 86,173, 90,225,200,217,155,216,115,232, 52, 50, 98,239, 98,198, 55, 19,209,
-168, 81, 35, 28, 62,124,184,212, 50,153,125,180, 74,178, 46,123,121,121, 69, 38, 37, 37, 53, 40,233,187,165, 77, 25,150, 96,165,
-122,157,255,123, 7,132,205,142, 70, 25, 62, 90, 61, 91,181,106, 53,126,251,246,237,250,206,157, 59,243, 7, 12, 24,128,186,117,
-235,182, 28, 62,124, 56, 0,160, 99,199,142, 88,182,108, 89,203,225,195,135,227,207, 63,255,196,190,125,251,116,109,219,182,253,
-230,220,185,115,137, 40, 88,209,249, 26, 24,134,233,190,118,237,218,162,150, 66,152, 76, 38, 24,141, 70, 79,147,201,228, 89,216,
- 22, 97,249,242, 21, 25, 39, 79, 28,198, 55,223,206,134,155,171, 71,168,141,117,136, 24,246,245,215, 25,155,151, 44,193,146, 63,
-255,196,215,213,170,137,183, 62,120,128,147, 90, 45,118,157, 61,155, 81,248, 59,101,250,102,170,213,106,205,209,163, 71,229,187,
-118,237,130,163,163, 35,106,212,168, 1, 39, 39, 39,112,185, 92,144,148, 8, 20, 79,129, 90,193,141, 1, 92, 7, 0, 84,243,130,
- 58,200, 31, 23, 9, 2,217, 44,105,191, 79,145,160, 10,170,186,248, 8, 35,198,111,170,235, 40,119,227,225,248,170, 56,156, 88,
- 25,191, 95,155,129, 95, 96,194, 35,148,236,243,213,208,223,223, 31,105,105,105, 56,122,244,168, 26, 40, 81,144,129, 97,152, 69,
-191,253,246,219,148,111,191,253, 86, 16, 20, 20, 4, 0,161, 0,110, 20,119,172, 68, 34,129,183,183,183, 69, 88, 14, 24, 58, 54,
- 96,204,228,177,162,222, 31,182, 3,135,227,130,108,181, 17,153,185, 70, 40, 92,164,248,102,114, 63,225,233,134,222,141,214,174,
-248,227,160, 70,131, 70,192,235,237, 1, 65,224,198,181,187, 23,235, 9,131, 0,130, 4,226,201,191, 65,128, 64, 30, 97, 4, 65,
- 81, 44, 77,211,136,139,139, 3,203,178, 24,212,123, 68,124,248,130,125,110, 45, 7,169,224, 91,203, 11, 4,139, 54,239,138, 16,
-112,118,118, 14,205,204,204,196,203,151, 47, 49,116,232,208,196,140,140,140, 83,106,181,122, 68, 82, 82, 18, 0, 40,203, 65,105,
- 17,243,161,161,161,104,220,184, 49,250,247,239, 47,204,207,207,239, 23, 16, 16,224,157,158,158,222,252,109,158, 79, 81, 45,242,
- 63, 37,180,138,125,208,140,198, 90,186, 53,107,160, 62,125, 26,252,147, 39,177,203,203, 43, 79,171,213,126, 5, 32,190,240,193,
-159,184,105,243,230, 75, 61,174, 92,145,235,163,163, 17,112,239, 30,184,142,142,161,246, 22, 96,227,198,141, 80,169, 84,200,201,
-201, 1, 0,172, 92,185, 18, 42,149, 10, 38, 27, 19,206,114,120,104,233,225, 86, 13, 41,120, 2,134, 67, 74, 99,106,229, 55,149,
-106,101, 73,222,113,238,234, 28,210, 27,209,177, 77, 36,154, 76,125, 83,130,210, 67,155,145, 15,239, 22, 53,192, 1,167,165, 61,
-101, 52,207,251,115, 56, 28,229,227,199,143,187,215,172, 89,243, 16, 0,151,242,248, 3, 20,193,211,212,212,212, 9,229,249, 34,
- 69, 81, 63,188,120,241,194,109,195,134, 13,159,207,157, 59,151,181, 22, 90,230,255, 57, 28, 14, 88,150,133,131,131, 3,184, 92,
-174,251,229,203,151,221,155, 52,105,242, 43,195, 48,161, 37,156, 39, 91,183,110, 93,188,120,241, 2, 28, 14, 7, 14, 14, 14, 96,
- 76, 6,204,158, 60, 22, 52, 37,224, 76,157, 58, 53,180, 79,159, 62, 81, 27, 54,108, 48,202,155,181,104,158,153,153,121,127,252,
-160,193, 81, 7, 14, 28,208, 23,134,120, 40,123,136,207,178,183,159, 60,121, 66,249,120,185, 83,172, 41,159,145,240, 0,225,221,
-229, 44, 95,234, 1, 33,135, 98,121, 4, 9,129, 80,228,240, 50, 33, 33,147, 97,152,135,182,112, 50, 12,115,235,197,139, 23, 34,
-119, 55,103, 78,190, 70,159, 39,226,178,252,152, 91, 55,159, 87, 13,107, 24, 0, 0,218, 91,215,207, 9,106,213, 22,197,164,166,
- 75,170, 85,171,102, 19,167, 70,163,185,157,152,152, 72,185,187,187,115, 98,227, 19, 14, 58, 74, 37,174,114, 71,199,166, 0, 96,
-200,205,185, 78,234,116,233, 20,151,227,158,158,153,169,212,104, 52, 47,108, 61,247,103,207,158,113, 60, 61,221,168,227, 39,207,
- 28,114, 23, 11,220,100,124,142, 92, 64, 16,132,152, 34, 84, 60, 19,147, 33, 20,139,221, 94, 38, 36, 40, 89,150, 45,209, 66,248,
- 99,246,224,222, 5,247,107,246,159, 86,220,184,123,247, 46,142, 93,124, 8, 9,171, 7,161,205,193,201, 77,191, 99,208,212,111,
-223,216,239,175, 44,177, 85, 46,107,214,218,218,145, 69,248,145, 92,134, 35,252,160, 65,131,102,111,219,182,205,226,128,242,240,
-225, 67,180,111,223,222, 60,205,129, 78,157, 58,161, 73,147, 38,120,248,240, 33, 2, 3, 3,113,246,236, 89, 1, 69, 81,130,193,
-131, 7, 47,248,227,143, 63,142,150,105,247, 95,183, 14, 35, 70,140, 40,206,177,250, 25, 0, 45,161, 8,202,155,254,227, 22, 23,
-101,102, 6,210,210, 83,110,219,122, 29, 8,130,192,176,175,191,206, 88,171,215, 99,251,181,107, 24, 34,145,136, 55, 63,125,138,
-174, 77,154,160, 94,251,246, 25,182,180,117,102,171,142, 86,171, 5,151,203,133, 92, 46,135,179,179, 51,120, 60, 30, 40,174, 23,
- 56,252, 16,144, 60, 30,194, 90,133, 96,201, 87,146,252,161, 31, 97, 5, 65, 32, 91,192,199, 45,158,184, 68, 95, 29, 66, 82, 5,
-189, 88, 22,170,252,120,252,109, 22, 36, 14,126,112,224,202,184, 39, 71,253, 26,228, 40,119,227,225,216,138, 88,156,252, 53, 97,
-175, 54, 5, 51, 10,175, 5, 83,202, 64,162,158,163,163, 35,226,227,227, 17, 23, 23,247, 0,165, 59,248,231, 63,124,248,240,185,
- 64, 32,168,227,234,234, 10, 0,254, 37, 13,204, 25,134,177,248, 97,109,221,190,219, 37,180,117,128,240,131,150,117,176,229,208,
-124,124,214,111, 5,184, 20, 1,154, 54,224,151,101,221, 64,235,242,208,175, 71, 56,209,166, 99, 96,200,233, 67,250, 81, 70, 77,
-214,239,175, 13, 4, 56,152,247,211, 39,151, 29, 5, 82,178, 30, 24,194,209,197,197, 77,194,227,241,224, 44,247,212,127, 59,102,
- 82, 50,203,178,150,231,134, 75,241,140,100,174,147, 38, 51, 37, 79,228,200,213, 0, 44, 89,181,124,209,108, 42, 30, 9, 9, 9,
- 19, 90,183,110,189, 32, 55, 55, 55, 75,173, 86, 15, 2, 0,127,127,127, 63,146, 36, 5, 0, 74,155, 29,241, 67,241, 97, 33,120,
-247,238,221,131, 76, 38, 67, 98, 98,162,181,241, 5, 12,195,188, 51,139, 0,222, 81,132, 1,184, 5,192, 19, 64, 87, 88,133,119,
- 32, 11, 77,117,109, 14, 31, 62,204, 30, 62,124,184,141,165,243, 98, 89,198,164, 84,130,213, 21, 92, 91, 46,151,203, 2,176, 94,
-209, 36,118,116,116, 36,184, 62, 62, 32, 4, 5,174, 31,108, 5, 46,125, 53, 26,109, 11, 45,195,208,160, 64, 24,192, 90, 13, 90,
-212, 66, 2,243, 93, 58, 96, 2,127, 38, 82,248,142,214, 61, 29, 96, 98, 65,131,161,236, 44, 14,171, 86,171, 97, 50,153, 20,213,
-171, 87, 63, 98, 50,153, 20,133,157, 27,251, 95,221, 81,154,166,159, 83, 20,133,207, 63,255, 28,102,235,143, 94,175, 71, 74, 74,
- 10,116, 58, 29,244,122, 61, 94,188,120,129,156,156, 28,232,245,122,220,191,127, 31,254,254,254,160, 40,202,179,148,198,156,101,
- 89, 22,190,190,190,168, 90,181, 42, 40,130,197,250,197,179,240,221,151, 99,241,137, 63,131,141,171,126, 65,219,182,109,107, 87,
-171, 86,173, 25,135,195,161, 61, 60, 60,120,251,246,237, 59, 72,211,116, 47,216,222,242, 28,157, 62,125,122,213,224,224, 96, 55,
- 71,185,204, 40,224, 83,224, 27,213,172, 64,151,201,114,242, 51,224,235,235,103,130, 72, 28, 56,100,200, 16,186, 36, 43, 68,113,
-156, 95,125,245,149,103, 80, 80,144,131,194, 81,166,230,115,169, 52, 30,216,140,156,187, 55,174, 2, 0,223,213, 77, 11,161,184,
-206,208,161, 67, 77,246,112,206,156, 57,211,223,213,213,213,145, 4,155, 75, 27, 12,255,204,183,235,244,153, 4,151,171, 1,143,
-223,240,139, 47,190, 32,236,225,156, 50,101, 74,181, 58,117,234, 56, 58,202, 37,121, 28, 46,149,204, 99,152,100, 33,152, 20,174,
-222,144, 37,116,117,201,135, 88, 26, 54,100,200,144, 18, 57,205,214,172,105,211,166,197, 23, 17,222, 80, 42,149,208,166, 68,129,
-151, 24,141, 16, 41, 23,141, 92, 21, 16, 8, 4,150,165,239, 37, 85,215,146,124,180,138, 19, 91,182,126,183,225,156, 82,166, 0,
-215,214,142, 44, 26, 55, 43, 41, 41, 9,158,158,158,165, 62, 79,127,252,241,199,183,237,218,181, 75,235,212,169,147,254,200,145,
- 35, 32, 8, 2,103,207,158, 69, 98, 98, 34, 58,117,234, 4,150,101,205,171,218,112,251,246,109,116,236,216, 81,223,186,117,235,
-196,194,248, 90,101, 98,196,136, 17, 48, 26,141,200,203,203,131, 82,169,196,225,195,135, 17, 18, 18,194,138,197,226, 62,148,239,
-135,243,251,141,250,182,121,221,250,161,248,117,197, 18, 61,159,195,253,209,158,231,149, 32, 8, 12,253,234,171,140,156,176, 48,
-229, 86,181, 58,127,152, 92, 46,174, 30, 31,239,116,243,196, 9, 23,131,193, 96, 19,135,217,170,227,227,227, 99, 17, 89, 60, 30,
- 15, 28,190, 43, 40, 73, 61,240,157, 59, 65,236,209, 7,127,223, 18,232, 28, 36,216, 47,147,226,184,196,177,228,208, 14, 98, 95,
-204,111, 62,192,115, 95,139, 79, 60,207,136,171, 96, 67, 97,127, 64,178, 28, 98,223,240, 95,106, 86,119,173, 42,194,149,221, 41,
- 56,249,107,194, 95,218, 20,204, 2,240,180,172,231,220, 96, 48,104,105,154, 6, 73,146,224,112, 56,214, 62,129,151,254,250,235,
- 47,220,188,121, 19,176, 10,219,147,155,155, 75, 83, 20, 5,161, 80, 8, 0,210, 82,218, 59,112,185, 92,112,185, 92,156,187,122,
-222,249,147,143,187, 17,151,239,156, 66,139,144,129,200,204, 51, 32, 53,199,128,236,124, 32,184,209, 12,212,237,184, 31,119, 95,
-228, 34,180,126, 93,138,226, 75,134, 22,199,167,125,137,120,117, 28,250,102, 62, 96,106,232, 19, 68,199,174, 28,120,248,224,252,
-158,187,247,119,254,118,232,105,243, 70,173,213,133,198, 4,228,229,229,177, 4, 65,176,147, 70,127,251,124,235,136, 44,122,197,
-160,187, 12, 71, 39,124,246, 47, 54,245,126,174,174,174,151,157,157,157,207, 22,138, 35, 63,153, 76,118,201,211,211, 51, 26, 5,
- 11, 61, 14, 36, 39, 39, 7,169,213,234, 22, 40, 88,156, 21,155,153,153,217,190,208,242, 20, 91,138, 37,108,131, 74,165,154, 72,
-211,116,143,194,237, 35,154,166, 67,159, 60,121, 82, 39, 52, 52,244, 65, 64, 64,192,237,128,128,128, 99, 1, 1, 1, 7, 3, 2,
- 2, 14,182,107,215,110,153, 57,220,195, 91,158, 54,124, 77,139,188,103, 66, 11,133, 34,107, 93,225, 43, 44, 66, 11,192,185,162,
- 14,104, 38,129,224,190,105,252,120, 56, 30, 60, 8,238,147, 39, 24, 62,116,168, 92, 44, 22,175, 64, 65,140,166, 22, 82,169,244,
-215, 89,179,102,201, 92, 22, 46,132,215,249,243,136, 57,124, 24, 70, 46,247, 70,121, 74,167,209,104,192,225,112, 44,150, 24,137,
- 68, 2,154,166, 81,156,201,247,181, 7,208,132, 43,137,169,209,224,163, 42, 24,176,121,199, 85,173,175, 13,124, 62,195,237,176,
-202, 63,240,169,154, 23, 56,199,181,169,219, 10,191,150,215,212, 4, 39,143,239, 40, 68, 92, 92, 60,104, 48,118,205, 55,107,181,
-218, 28,181, 90,141,208,208, 80,231,155, 55,111, 86, 15, 9, 9,113, 42,124,255,250, 27,222,152,102, 94, 94, 94,187,189,189,189,
- 95,122,121,121,237, 6,208,204,142,239,110,184,112,225, 2, 40,138,194,172, 89,179,144,155,155, 11,131,193,128,204,204, 76,196,
-197,197, 65,175,215, 35, 33, 33, 1,143, 30, 61,130, 94,175, 71, 76, 76, 12,116,186,178, 7, 36, 12,195, 64, 46,151, 67,171,201,
-195,234,249,223, 97,230,180,201,200,121, 22,137,132,164, 84, 56, 58, 72, 48, 97,194, 4, 74,161, 80, 48, 12,195, 84,165,105,186,
- 35,195, 48,107,108,185, 79, 86,245,237,162,175,175,111,221,197,139, 23,215,249,110,254, 26,158,156,147,199, 10,100, 66,134, 47,
- 19,176,252,218, 77, 49, 98,198, 10,222,242,165, 63, 63,190,114,229, 74, 34,108, 11,222, 73, 2,184, 24, 22, 22, 86, 51, 49, 49,
- 49, 36, 40, 40,168,150,139, 95, 53,129,192,211, 59,155,231, 89, 69,197,234,180,215, 8,239, 42,173,214,172, 89, 19,117,233,210,
-165, 36,123, 56, 37, 18, 73,237, 45, 91,182,212,117,119,119,175,203, 21,137,132,249, 57, 57,187, 76,249,234,221,148,163, 66, 72,
-202, 29, 63,218,191,127,127,228,222,189,123, 83,236,225, 12, 12, 12, 12,154, 63,127,126,112,189,122,245,130, 61,252,171, 11, 68,
-222,190,153, 66, 31,191, 76, 81,189, 16, 1,124,170,118,254,245,215, 95,111, 95,185,114,197, 38, 78,138,162, 76, 36, 73,130,203,
-229, 66, 44, 22,227,248,241,227, 24, 63,106, 32,124,189,157, 81, 43, 40, 8, 29, 62,155,136,189,123,247, 90,124,120, 40,138, 42,
-177, 71,223,188,112,194,161, 48, 79, 34, 18,107,107, 71, 98,109,237,200, 48, 79, 34,178, 68,177, 85,248,121,113,199,216,212, 26,
-149, 48,221,104,131,216, 58,122,238,220,185, 69,195,134, 13,227,119,233,210, 5,215,174, 93,195,136, 17, 35, 46,238,219,183, 15,
- 0,112,237,218, 53, 76,154, 52,233,226,153, 51,103, 48,118,236, 88,180,111,223,158,127,225,194,133, 95, 97, 67,236, 31,147,201,
-132,141, 27, 55,194,100, 50, 65, 42,149,194,201,201, 9,221,186,117, 67, 84, 84,212,216, 77,155, 54, 69, 83, 92,238,167, 93,123,
-124,140, 35, 7,247,225,209,253,168,177,155, 23, 12,182, 59, 40, 48, 73,146,232, 50,116,104, 70, 70,112,176,114,179, 74,149, 63,
- 82,161, 16, 7,165,164, 56,253,189,123,183,139, 13, 66,141,160,105,218, 34,174,204,162,195,188,113,248,174,224, 72,234,130, 35,
-107,132,187, 79,121, 70, 94, 19,220,226, 55,194,195,210,226,103,113,249,228,136, 62,223,249,163,207,119,254,232, 57,181,218,112,
-113, 21,172,151, 84,193,184, 46, 95, 86,109, 23,208,200, 1,170, 52, 3, 14,255, 18, 19,171,205,196, 66, 0,143,108,121,206, 25,
-134,121,144,152,152, 8, 62,159,143, 42, 85,170,212, 4, 96,246, 11,220, 48,122,244,232, 47,230,204,153, 51, 25,192,156,194,247,
-164,237,218,181, 11,206,203,203,195,147, 39, 79, 0,224,102, 41,214, 96,203, 42, 67,165, 42, 70, 80,205,171, 30, 66,106,143,129,
- 66, 81, 31,137, 74, 61,146,148,122,172, 95,221, 11,145, 23,230,225,230,201, 33,136, 77, 73,129,200,163, 55,104,147,174,174, 13,
-131,122,175, 59,119,238, 16, 23, 46, 92, 32, 24,134,129,209,104,100,115, 85, 42,246,214,197,139,208, 68, 68, 16,114,185,156,104,
-217,184,117,222,230,121, 71,174,239, 95,117,241,166, 33,223,238,129,250,155, 96,230,243,231,207,155,237,222,189,187, 29,128,153,
-245,234,213,187, 18, 23, 23,215,252,252,249,243,181,124,124,124, 86,148,151,212, 28, 22, 34, 38, 38,230,149,173, 48, 44,132,190,
- 80, 52,116, 41, 20,115, 61, 1, 76,194, 27,172,178,183, 3,231,222, 99,103,248, 35, 40,178,218,176,168,208,178, 14, 20,134, 0,
-133, 66,102, 52, 26, 18, 78,157, 58,101, 32, 73, 18, 98,177, 24,195, 70,140, 32, 87,255,246, 91,171,129,205,154,157, 13,255,224,
-131, 99,103,207,156, 9,107,210,164, 9, 88,150, 5, 73,146,248,243,207, 63, 53, 90,173, 38,211,215,215,215,209,150, 70,195,250,
- 1, 82,169, 84, 22,161,149,147,147, 3,119,119,119,155,167, 14,213, 42,156, 62,115, 60, 50,139,165, 63,139,235,242,116,169,225,
-199,148, 94, 77,178, 25,154,147, 67, 27,145,163, 97,145,171, 5,231, 26,233,212,100, 88, 96,111,195,139,142, 77, 30, 69, 68, 95,
-206,212,210, 90,187, 86, 75,164,165,165,125,215,175, 95,191, 76, 79, 79, 79, 66, 46,151,195,219,219,155,236,217,179,103, 70,124,
-124,252,156,242,222, 17,103,103,231, 79,218,181,107,119, 40, 49, 49,177,111, 68, 68, 68,213,243,231,207,247,109,215,174,221, 33,
-103,103,231, 79,108,164,216,245,237,183,223,170,249,124, 62,154, 54,109,138,220,220, 92, 20,174,242, 41,117,179,101,138,148,199,
-227, 97,237,226, 31, 48,115,218,100, 40,163,175,225,238,197, 83, 56,151, 66, 96,198,252,159,193,227,241,202, 21,235,171,134,171,
-184, 94, 61, 47,217,195, 73, 35, 6, 36, 77,159, 54, 77,118,251,246,109,238, 23, 95, 78, 98, 99,146,149,224,119, 89, 66,161,205,
-119,228, 29,181, 43,186,126,212, 1,179,102,126, 93,175, 48,104,103,169,168,237, 42,174, 87,215, 75,246,224,235,240,129,207,191,
-252,242, 75,209,143, 63,254,168,109,214,172,153, 38, 53, 53, 85, 36, 81, 56, 5,113, 28, 28,235,198, 36,167, 72,155, 53,107,246,
-226,179,207, 62,203,182,151,115,198,140, 25,226, 19, 39, 78,112,250,245,235,103,202,202,202,146,114, 69,162, 80, 66, 32,108,156,
-158,149,229,208,183, 95,191,167,125,251,246,205, 47, 12, 88,106, 51,231,247,223,127, 47,126,244,232, 17,167, 89,179,102,198,148,
-148, 20,153,196,217, 37,132,114,116,106,244, 50, 57, 85,222,184, 73,147,103, 95,124,241,133,186,180,114, 90,139, 20,153, 76,150,
-216,162, 69, 11,252,242,203, 47, 88,190,124, 57, 58,119,238,140,168,251, 81,232,250,197,100,212, 25, 55, 9, 7, 47, 95, 69, 98,
- 98, 34,230,206,157,139,144,144, 16,240,120,188, 71,197, 62,143, 99,163,137,219, 41, 32,110,167,128, 32,198, 70, 19,230,253, 18,
- 45, 91,115,114, 96,125,124,113,199,221,252,190,120, 75, 87,152, 39, 17, 89,154, 31, 86, 89, 98,171,111,223,190,227,205, 33, 28,
- 70,142, 28,121,113,197,138, 21, 45, 71,142, 44, 24,104, 55,109,218, 20,243,230,205,107, 57, 99,198,140,139,243,231,207, 71,135,
- 14, 29, 16, 16, 16, 80,230,194, 23,154,166, 97, 50,153, 48,112,224, 64,152, 76, 38,164,167,167,227,241,227,199, 88,183,110, 29,
- 88,150, 21, 2,128,167,151, 79, 67, 62,159,143, 59,183,110,228,207, 28,217,228, 15, 59, 44, 89,132,245, 32, 38, 47, 47, 15,125,
-199,141,203, 72,168, 81, 67,185, 38, 35, 35,127,148, 66, 33,174, 22, 27,235, 36,211,235,189, 81,138, 95, 34, 65, 16, 96, 24,198,
- 34,172,204,130,171,232, 86,216, 81,218, 4, 67, 62,115,244,252,182, 36, 0, 64,235,193, 94,232, 57,181,218,112,207, 64,241,202,
- 86,131, 10,140,222,123,231, 61,103,115,147,232, 31, 97,196, 3, 59, 44,214,215,174, 93,187, 6, 71, 71, 71,244,235,215, 79, 64,
-146,228, 66,243,120, 21, 5,177,179,150,154,185, 4, 2,193,146, 33, 67,134,144,217,217,217,184,123,247, 46, 0,156, 41,169, 93,
- 98, 89,214,114,238,121, 74, 2, 52,195,199,165, 91,199,113,242,252, 30,188, 76, 76, 71,108,154, 22,224, 56, 64,171, 78,128, 65,
-147, 8,125,246, 45,168,116, 98,155, 10,204,227,241,210,235,213,171,199, 54,106,212,136,101, 89, 22,207,158, 61, 51,197,196,198,
-154,110, 44, 91,198,222, 27, 51,134,144, 61,126,204, 19,137, 68,132,191,191, 63,132, 66, 33, 35, 20, 10, 51,255,197,206,251,173,
-132, 91,120, 11, 97, 33, 42,210,170,197,226,253, 68, 50, 94, 93,109,104, 9, 96, 90, 92,192, 82,176,114,209,128, 61,191,174,118,
-232, 55,112,176, 58, 36, 36, 68,225,237,237, 13,130, 32,208,171,119,111,162, 93, 68,132,140,235,229, 5,231, 6, 13, 44,211, 17,
-167, 79,157,194,241,227,199,213, 71,254,218,239, 61, 98,212,168,238, 0,182,148, 82, 24,142, 64, 32,176,252,110,114,114, 50, 4,
- 2,129,197, 39, 66,165, 82,193,213,213, 21,201,201,201,182,102,190,222, 58,125,218,213,105,105, 77,190,243,111, 34,227, 18,199,
-212, 41,160, 89, 22, 92,130, 6, 52, 44,140, 52,160, 51,178,104, 88,141,114, 58,169, 49, 41, 14, 95,219,247, 2,192, 86,123,174,
-158, 78,167,251,251,246,237,219, 99, 24,134,217, 3,128,140,136,136, 96, 30, 60,120, 48, 30,182, 59,174,191,110,182, 23,139,167,
-158, 61,123,214,105,234,212,169, 89,135, 15, 31,206,233,214,173,155,195,186,117,235,156,218,183,111, 63, 53, 51, 51,115,167, 45,
-134,192,184,184,184, 45,241,241,241,227, 27, 53,106, 4,165, 82, 9,131,193,128,200,200, 72, 4, 6, 6,226,230,205,155,168, 89,
-179, 38,110,220,184,129, 90,181,106,129,166,105,104,181, 90, 48, 12, 67,151,213,152, 43, 51,210,129,204, 56, 36, 93, 59,134,199,
-247, 34,113, 54,137,192,170,157,135, 80,165,170,127,185,226,212,212,116, 19, 7,123,186, 58,159,252,113,246,247,110, 49,127,255,
-137,125, 27, 87, 49,231,142, 29,171,195,151, 97, 76,155,129, 19, 63,214, 27,225, 7,128,223,188, 73, 35,116, 81, 60,162,197, 85,
-145,114,246, 65,233, 1, 22,107,186,137,131,221, 93,156, 79,252,180,112,142,236,217,241,205,216,181,246, 23,118,239,182, 29, 33,
- 90,160, 73,112,112,112, 23,146, 36, 29, 1,104, 11,253,188,108, 74,109, 83, 28,231,233, 67,135,194,180, 64,147, 3, 7, 14,116,
- 17,139,197, 30, 0,140,249,249,249,207,223,132,243,204,225,195, 97,230,114, 18, 4,225, 6,192,192,178,236, 51,216,153,130,167,
-127,255,254,243, 38, 77,154, 52,141,166,105, 87,171,209, 57,181,100,201, 18, 14,195, 48, 20,203,178, 6,146, 36, 13, 39, 78,156,
-160, 77, 38, 83,146, 86,171, 29,247, 38,173,200,199, 31,127,140,171, 87,175,206, 70,193, 34, 12, 91,173,213,175,248,105, 21,166,
-236, 41, 55,127, 68, 68,196,220, 79, 63,253,116,250,206,157, 59, 31,175, 88,177,162,199,216,177, 99,241,231,159,127,162, 70,141,
- 26,184,115,231, 14,190,251,238, 59, 0,104, 57, 99,198,140,131, 27, 54,108, 8,136,137,137, 89, 98,131, 69, 3, 38,147, 9, 59,
-118,236, 64,175, 94,189,224,234,234, 10, 47, 47, 47, 16, 4,241,247,168, 81,163,126, 3, 0,138,160,120, 0,160,211,234,116, 65,
- 65,141,108,182,224,242,120, 60, 75, 91,151,146,146, 98, 89, 41,248,225,167,159,102,172,255,241, 71,252,161,209, 96,148, 66, 33,
- 78,240,241,241, 60,248,236, 89,248,253,130,198,153, 45,205,170, 83,150,200,178,213,165, 65,147,140,111,255, 90,240,210, 3, 64,
-231,214,131,189,208,122,176, 23, 26,245,116, 35, 72,138,192,189,147,153,136, 58,173,220,107, 84,225,111,216,151, 46,231,193,194,
-133, 11, 15,182,105,211,166, 71,237,218,181, 49,122,244,232,207, 54,110,220,200, 51, 26,141, 95,226,159, 48, 15, 14, 36, 73,206,
- 89,187,118,109,184,147,147, 19, 46, 92,184,128,243,231,207,255, 13, 32,174,164,118, 9,128, 37,102, 86, 21,223,154,218, 71, 49,
-121,226,180,196, 75,184,120,225, 47,212, 8,153, 8,145, 71,119, 56, 5,205,135, 33,122, 57,244,153, 39,225,228,219, 13, 9, 49,
-207, 64,113, 4, 81,101, 57,161,176, 44,123, 63, 33, 33, 33, 32, 32, 32,128,120,249,242,165, 9, 0, 75,211, 52,107,104,213,202,
- 88,231,199, 31,185, 81,159,125, 70, 52,127,244,136, 98, 9,130,137,140,140, 4,128,135,255, 69, 47,110, 14,183, 16, 21, 21, 85,
- 82,184, 5,187, 80,175, 94,189,150,231,207,159, 23,104,181, 90,156, 59,119, 14,141, 27, 91,214,118,253,167,209,239,173,181,200,
-123,134,240, 98,222, 91,247,138, 69,235,149,138,205, 16,220, 90, 53,107,210, 60, 18,155,122,117,239,158,127,251,246,109,203,168,
- 79,123,253, 58,212,199,143,131,166,105,176, 44,139,243, 17, 17, 24, 50,120,112, 30,151, 34,214, 87,171, 86,149, 37,216, 87, 98,
-183,116, 44,102,244,208,175, 95,191,126,150,198, 39, 62, 62, 30, 18,137, 4,124, 62, 31, 12,195,192,100, 50,129,162, 40, 56, 56,
- 56,192,100, 50, 21,103,130, 41,202,105,164,149,234,190, 27,186, 14, 74,246,202, 51,176, 99, 28,171,193,143, 39,178, 60,156, 30,
-114, 2, 61, 66,184,112,225,164,177,103,150,124,144,196,232, 50,251,226,245, 21, 93,101, 45,249,175, 89,191,126,253,223,134, 12,
- 25, 66, 2, 64,199,142, 29,201,250,245,235,175, 68,233,169,114, 74,229, 20, 10,133, 2, 0, 56,116,232,144,242,241,227,199,157,
- 15, 29, 58,164,180,126,223, 70,206,117,139, 23, 47,134, 88, 44,134,201,100,130, 94,175,183,248,103, 89,191, 26, 12, 6,184,184,
-184,224,200,145, 35,160,105,250, 72, 89,229,244,245,171, 10,194,181, 58,182, 28, 58,139,243, 25,188,242,136, 44, 11,103,117, 15,
- 73, 45, 15, 23,231, 83, 63, 45,152,235,154,245, 52, 18, 9, 9, 9,236,137,227, 71,174,104,129,196,156, 92,204,204, 86,163,150,
- 70, 15, 97,227, 0,196,157, 90,251, 13, 59,163, 53,140, 40,126,213,160,133,179,142,135,164,150,183,171,243,137,159,127, 90, 32,
-203,126, 26,137,228,148, 20, 28, 61,114,232,182, 22, 48, 79, 55, 14,103, 24,166, 46,195, 48,117, 1, 12, 47, 69,188,216,197,153,
-159,159, 95, 47, 63, 63,191, 94, 69,114,178, 44, 91,143,101, 89,155, 57,173,125,162,150, 46, 93, 26,157,156,156, 60, 36, 45, 45,
-173,147,121,203,202,202,234,152,151,151,215, 54, 63, 63,191,149,102,105, 85,135,252,252,124,183,188,188, 60, 79,173, 86,219, 16,
- 64,164, 29,117,222, 2,235,168,211,201,201,201,179,146,147,147,137,178,202, 73,141,139, 38,182,255,252,245, 95,107,215,174,245,
-124, 67,254, 87,202,153,145,145,177,103,231,206,157,161,254,254,254, 1,195,135, 15,199,154, 53,107,176, 98,197, 10, 29, 0,108,
-216,176, 65,103,101,201,242,141,137,137,105, 84,194,180, 97, 71, 43,107,201,214, 15, 63,252,144, 61,127,254, 60,122,245,234,101,
- 9, 36,250,251,239,191,195,100, 50,169, 58,116,232,192, 0,128, 70,155,175, 98, 25, 22,122, 67,137,243,239,175, 93, 79, 62,159,
-255,145,117,188, 64,115, 48,102, 62,159, 15,150,101, 81,171,101,203,140,236,144, 16,229,198,156,156,252, 89,245,234,201,195,131,
-130,134,215, 6, 6, 23,199, 73, 16,196, 43, 86,157,162,155, 29,150, 44,235,114,166,105,146, 48,250,175, 5, 47,143,155, 45, 91,
- 66, 41, 7,218, 92, 19,246,255,248, 50, 93,155,142,223, 75, 18, 63,165,157,187, 82,169,252,226,199, 31,127,212, 41, 20, 10,124,
-252,241,199,152, 63,127,254,168,150, 45, 91,230,184,185,185, 93,173, 81,163,198,189, 1, 3, 6, 36, 71, 70, 70,126,209,174, 93,
- 59, 60,121,242, 4, 63,255,252,115,118, 86, 86,214,160,210, 56, 9,130,176, 88,242,122,118,237,168, 92,189,242, 23,166, 67,155,
-241, 16,139,228, 48,114,125,161,204, 51, 34, 75,205, 66, 47,104, 2, 62, 79,128, 78,205,130,113,245,196,230,124, 90,175,222, 82,
- 86,157,207,203,203,219, 59,108,216, 48, 21,143,199,131, 94,175,103,185, 92, 46, 4, 5,126,199, 12,183,115,103, 67,243, 7, 15,
- 76, 52,203, 50, 4, 65,224,171,175,190, 82,103,101,101,237, 44,207,115,100, 7,172, 57, 43, 42,220, 66,199, 34,253, 79, 69,132,
-133,120, 27,231,254, 62, 99, 93, 49,219, 63, 22, 45,243,146, 74,243, 43, 65, 48, 52, 77, 51,168,230, 95, 77, 22,243, 50,110, 85,
-255,254,253, 70,118,233,210, 85,220,181,107, 87, 97,112,116,193,104,244,208,161, 67,216,183,111, 95,254,201,147, 39, 85, 2, 46,
-181,193,183,138,175, 59, 77, 51, 32, 8,166, 84, 53, 44,147,201,190,252,246,219,111, 69, 57, 57, 57, 88,177, 98, 5, 19, 26, 26,
- 74, 74, 36, 18, 24, 12, 6,108,216,176,193, 24, 28, 28,204, 37, 73, 18, 57, 57, 57, 32, 73,242,145,141, 39,120, 55, 39, 46,177,
-211,111,237,250,236,107,244,249, 8,231, 58,237,154, 43,218,250,122,195,216,128, 69, 82,252, 75, 60, 62,115, 50,235,254,137,101,
-153,208,166,246, 65,217,233,129,138,235, 8,126, 56,121,242,164,219, 23, 95,124,193,106,181, 90, 34, 46, 46,142, 93,176, 96,129,
-219,232,209,163,127, 72, 74, 74,250,164,156, 55,133,200,206,206, 6, 65, 16, 76, 97, 67, 98, 30,245,219, 51, 47, 23,181,101,203,
-150, 3,189,123,247,238,217,161, 67, 7, 68, 71, 71, 91,166, 8,173,133,150,121,245,225,194,133, 11,179, 1, 76, 47,139,148,203,
-229, 98,197,150, 61,200,206,202,128,187,187, 23,132, 34, 17,202,187,194,146, 79,146,179, 22,205,253,222, 45,227,225, 85, 34,234,
-202, 89,102,247,221,212, 52, 19,205, 22, 31,241, 63, 55,137, 45, 84,255,165,143,102, 72,106,214,162, 5,115, 28,204,211,154, 59,
-111, 37,171, 8,154,253,226,141, 30,145,247,133,243, 95,134,151,151, 23,146,147,147, 9, 47, 47, 47,182,208, 71,139, 45, 69,104,
-189, 90,193, 11,166,203,136,210,166, 13,203,203,255,226,197,139, 5, 13, 26, 52,248,250,201,147, 39,187,235,212,169, 51, 22, 64,
- 21,157, 78,151, 61, 99,198,140,159, 54,108,216, 48,210, 22, 75, 22, 0,252,249,231,159,203, 70,140, 24,113,188,123,247,238,223,
- 48, 12, 83,223,170, 99,127,225,230,230,102,153,194, 77, 79, 77,153, 54,102,228,192,105,121,121, 89, 54,199,185,147, 74,165,225,
- 51,102,204, 16,170,213,106,252,250,235,175, 76,112,112, 48,105, 30, 20,109,219,182,205, 84,179,102, 77, 78,191,241,227, 51,150,
-166,164, 96,222,133, 11,234,105,117,235,134,110,124,252,184, 33, 24,102,107, 73, 86,157,226, 44, 89,102,183,139,114, 34,169, 80,
-108,253, 14,160,115,243,254, 30, 56,176,248, 37,178, 98,244, 63,193,132,103,176, 33, 45, 80, 49, 72,216,187,119,111,167,212,212,
-212, 3,223,127,255,189, 67,195,134, 13, 81,183,110, 93,174, 84, 42,109, 98, 14, 23,147,147,147,131,211,167, 79, 99,205,154, 53,
-250,251,247,239,247, 46,109,186,138,166,233,180,154, 53,107,154,175, 3, 75, 16, 68,166, 74, 71, 56,236,170,221, 68, 58,124,204,
-110,226,226,141,203, 72, 50, 48,208, 25, 25, 84,243, 15, 67,219,206, 75,113,240,216, 61, 58, 41,230,193, 3,163, 38,107,189, 13,
-229,125,246,244,233,211,253,115,231,206,237,255,205, 55,223,136, 50, 50, 50,104,157, 78,199,236,217,179,135, 26, 62,124, 56,205,
-114, 56, 12,143,195,193,151, 95,126,169,201,206,206,254, 11,248, 87, 19, 76,191,149,112, 11,111, 33, 44, 68,133, 89,179,172, 95,
-255, 87, 80,236, 19,202, 80,228,165, 53,107, 87,127,244,231,142,157, 30, 20, 69,122, 60,123,254,252, 70,143, 62,125, 19, 79,157,
- 58,229,196,115,112,104, 12,128,209,143, 29,123,197,160,211, 40, 15, 31, 56,224, 87,173, 90,213,144,194,164,210, 44, 67,145,151,
- 74,251,193,188,188, 60,245,133, 11, 23,242,167, 79,159, 78,196,199,199,111,119,119,119, 31,112,236,216, 49,105,159, 62,125, 52,
-209,209,209,123, 61, 60, 60,122,182,107,215, 78,246,245,215, 95,235,242,242,242,236, 73, 60,250,128, 77,207,170,125,253,251, 37,
-159, 94, 95,188,250, 3,112,168, 22,208,113, 1,198,120, 9,134,220, 83, 0,182,195,142,120, 71,214,144, 72, 36, 33, 98,177, 24,
-183,111,223,206,106,210,164,137, 94,171,213,242,230,207,159,239, 44,145, 72, 66,202,123,225, 89,150,101,179,178,178,192, 48, 12,
- 7, 0, 81,248, 10,198,254,181,248,159,244,232,209,227,192,174, 93,187, 62,236,218,181, 43, 2, 2, 2, 96, 52, 26, 81,179,102,
- 77,232,245,122, 4, 6, 6, 66,167,211, 97,246,236,217,200,201,201,153,140, 82,114,158, 17, 4, 1,147,201,100,113,182,245,246,
-241, 43,136,211,243, 6, 97, 44, 36, 92, 50,224,209,225,141, 72,203,204, 96,118,221, 73, 77,205, 55,208,157,158,166,231,223, 47,
-122, 92, 62, 13,117,187,225, 19, 18, 1, 64,199,148,158,113, 94,194, 71,192,227, 35,191, 35, 53, 45, 3,127,222, 74,206, 86, 27,
-152,206,143,139,225,180,171,156,239, 9,103,216,236,104,244,157, 96,251,177,111, 2, 91, 5, 85, 73,184,157, 2,226,166,120, 35,
-139,181, 27,139,141,145,245,134,252, 7,158, 60,121,114, 0, 0, 30, 60,120, 16, 63,112,224,192,105, 47, 95,190,156, 11,224,104,
- 76, 76,204, 90,123,136, 54,110,220,248, 4,192,136,210,142,217,185,100,196,126, 0,251,237,225,205,205,205,213, 70, 70, 70,106,
-191,254,250,107, 34, 62, 62,254,152,135,135,199,135,199,143, 31, 23,247,233,211, 71, 23, 21, 21,117,198,203,203,171,117,199,142,
- 29,165, 71,175, 93, 75,204,127,246,236,240,225,151, 47,125,140, 12,115,184,180,231,179,130, 69,214, 43, 98,107,255,188,151,139,
- 14, 44,122,217,145,209, 97,175, 62, 11, 87, 0, 36,188, 1,231,249, 75,151, 46,213, 25, 60,120,240,174,110,221,186, 53,175, 83,
-167, 14,170, 84,169,130,199,143, 31, 35, 61, 61, 29,119,239,222,197,161, 67,135, 14,105,181,218, 50, 19,106, 43,149,202,215,211,
- 19, 9,157,188, 54,255, 58,235,208,141,139,141,107,182,234, 58, 76, 84,215,139,129,222,192, 34, 62,246, 25,102,207, 92,159,159,
- 28,251,228,129,193,100,232, 13, 27, 23,234,104, 52,154,117,203,151, 47,231, 30, 62,124,184,235,170, 85,171,100,126,126,126, 20,
-143,199, 35, 1,176, 55,111,222,100, 39, 76,152,160,206,200,200, 56,162, 82,169,214,253,203,125,244,249,231,207,159,135, 81, 20,
- 85,161,225, 22,222, 32, 44, 68, 37, 42, 18,254,254, 62,117,170,251,121,141, 13,168,226, 51,222,223,207,119,104,113, 78,238, 1,
- 10,133,204,191,170,119,120, 64, 21,159,241,213,253,188,198,250,251,251,212,177,193,180, 24, 32,151,203,143,121,122,122,134, 2,
-128,131,131, 67, 79, 71, 71,199,251, 14, 14, 14, 61, 11, 71,129, 61,165, 82,233,195,224,224,224,209,255,162,185,178, 84,206,154,
- 53,107, 14,204,203,203,251,172,102,205,154, 3,205,251,207,158, 61,179,236,151,135,211,215,215,183,195,205,155, 55, 63, 89,178,
-100,201,199, 53,106,212,232,185, 96,193,130,143,255,250,235,175, 79,124,124,124, 26,150,131, 83, 0,224, 15, 46,151,155,202,231,
-243,211,184, 92,110,170,121,227,112, 56,169, 20, 69,165, 2, 88, 91,130,181,172,163,213, 40,231,162,187,187,123,140,187,187,123,
-140,135,135, 71,140,135,135, 71,140,167,167,231,107,155,139,139,203, 69, 91,175,103,144,135,180,101,147, 42,178, 75,245, 60,165,
- 23,107,187, 75,130, 42,226, 30, 5,121, 72, 91, 54,174,226,112,169,158,167,236,194,255, 55,206, 80, 15,176,236,154, 32,150, 93,
- 19,196,134,122,128, 45,107,191, 34,205,254,158,158,158,172,167,167,231,172,183, 53,149, 80, 2,255,191,254,188, 87, 32,103,128,
- 76, 38,219, 89,165, 74, 21,115, 91,215, 93, 46,151,255, 45,149, 74,187, 23,182,117,221, 37, 18, 73, 68,112,112,240,176,178, 56,
-157,156,156,110,186,185,185,165, 20,110,201,238,238,238,201,238,238,238,201,110,110,110, 73,110,110,110, 73,174,174,174,137,230,
-205,209,209,241,106, 57,207,221, 13, 64, 83, 0, 13, 1,200, 43,240,122,250, 3, 24, 83,216, 6,253, 8, 96, 52,128,250, 21,112,
-143, 8,174,200,105,156,192,209,247, 18, 87,234,154,203,149,186,230, 10, 28,124, 46,149,146,130,199, 22,206, 90, 78, 78, 78,243,
-229,114,249, 95, 50,153,236,130, 76, 38, 59,224,226,226,178, 0, 64,173,255,168, 46, 73, 1,108, 64, 65,124,166,163, 40,152, 10,
- 63,128,130, 69, 5,126,239, 96,157,255,255,140,240, 98, 12, 42,248, 55,162, 64,117,172,228,172,228,172,228,172,228,172,228,172,
-228,124, 15, 57,201,202,235, 89, 41,180,236, 20, 90,175,108,102,161,197,169,188, 54,149,168, 68, 37, 42, 81,137, 74,188, 6,166,
-242, 18, 84,194, 78, 20, 59,181, 76,148,162, 74,237,137, 53, 85, 30,101,123,186,146,179,146,179,146,179,146,179,146,179,146,179,
-146,243,255, 29,231,255, 11,252, 91,201, 99, 42,205,170,149,156,149,156,149,156,149,156,149,156,149,156,149,156,255,235,168,156,
- 58,172, 68, 37, 42, 81,137, 74, 84,162, 18,149,120, 75, 88,103, 37,184, 94,153, 66,172, 20, 90,246,131, 4,240, 25,128,190, 0,
-170,163, 32,155,253, 30, 0,191,161,124,115,250,114, 0,211, 0,180, 64,193,234,156, 23, 0, 46,160, 96,117, 78, 94,229,229, 46,
- 30, 46, 46, 46,223,114,185, 92, 71,160, 32,181,137,249,213,250,127,154,166,179, 85, 42,213,130,183, 84, 4, 10, 54, 70, 80, 54,
-151,213,186,108,214,175, 70,163,241,109,150,179, 18,239, 38,106, 58, 57, 57,253,161, 84, 42, 7,193, 42,201,114, 37, 42,241,191,
- 0, 87, 87,215,177, 6,131, 97, 6,143,199,155,159,158,158,190,250,255,209,169,191, 38,178, 94, 17, 90,135, 15, 31,142, 0,128,
-110,221,186,181, 1, 0, 71, 71,199,203, 36, 73,250,219,243, 11, 12,195,188,200,206,206, 46, 49,128,154,163,163,227,101,138,162,
- 94,227, 52, 26,141, 50, 14,135,147, 91,220,119, 76, 38, 83,130, 74,165,106,248,142, 92, 68, 2,192, 97,133, 66,161,157, 59,119,
-238,111,109,219,182,245, 77, 74, 74, 50, 77,157, 58,181,245,157, 59,119,186, 2,248,200, 78,177,213,140, 32,136,205,161,161,161,
-251,135, 14, 29,186,171, 73,147, 38,252,204,204, 76,217,158, 61,123,188,183,108,217, 18,201, 48,204, 32,148,146,104,245,125, 4,
-203,178, 37,230, 74, 44,237,179,162,224,114,185,142, 9, 9, 9, 50,243,247, 10,133, 21,140, 70, 35,140, 70, 35,212,106, 53, 66,
- 66, 66, 42,188,252, 30, 30, 30, 97, 4, 65,172,146, 74,165, 13,243,242,242,110, 0, 24,159,156,156,124,199,158,178,154, 76, 38,
-176, 44,107, 41,103,157, 58,117, 42, 91,102,251, 48,138,207,231,119, 14, 12, 12,108,172,211,233,178, 94,188,120,113,157,166,233,
-239, 81,113, 57,218, 28, 0,124, 47, 16, 8,154, 84,175, 94,221,247,201,147, 39,241, 6,131,225, 26, 10,146, 33,231, 84,132,200,
-106,211,166,205,197, 95,127,253,213,121,220,184,113, 23, 47, 92,184,208,178, 82,108, 85,226,191,130,175,175,175,163, 90,173, 94,
- 15, 32,140,203,229,122, 8,133, 66,136, 68,162, 20,129, 64,112, 91, 36, 18,141,188,116,233, 82,182,189,156, 52, 77,127, 31, 19,
- 19,227,209,180,105,211,197,110,110,110,179, 51, 50, 50,180, 6,131,225, 76, 86, 86,214,100, 0,170,210,190, 91, 84,139,188,103,
- 34,203,250, 21,102,209,197, 41, 60, 49, 22, 64,219, 87, 20, 24,135,227, 19, 27, 27,235, 38, 20, 10,193, 48,140,165, 51, 43,186,
-153,223,215,235,245,168, 91,183,174,161,140, 14,199, 55, 62, 62,222,141,207,231, 91,222,211,235,245,240,246,246,102, 18, 18, 18,
-220, 10,211, 30, 88,160,211,233,224,227,227,243, 46,229, 60,250,204,201,201, 41, 39, 46, 46, 62, 68,171, 51,204, 25,253,197,244,
-111, 7,245,253, 64,113,249,242,101,230,163,143, 62,210, 69, 68, 68,124,134,130,196,169, 54, 53,230, 4, 65,108,153, 58,117,234,
-108,161, 88,238,124,246,242, 3,221,150, 61, 71, 18, 67,107, 86, 35, 38, 79,158, 76, 77,152, 48,225,124, 88, 88,216, 31, 12,195,
- 52,128, 29,150, 45,133, 66,113, 92, 32, 16, 84, 45,188,126,113, 89, 89, 89, 31,190, 75, 53,177, 80, 72,113,240,122,240, 88, 14,
- 65, 16,118, 7,148,205,204,204,132, 70,163,121,109,171, 83,167,206,219,112, 68,228,112,185,220, 3, 11, 23, 46,244, 78, 73, 78,
-198, 47, 75,151, 54, 69,129, 37,179,169, 45, 95, 78, 75, 75,123,173,156, 65, 65, 65,168,132, 93,152, 54,123,246,236,133,159,126,
-250, 41,104,154,134, 70,163,241,122,250,244,105,240,140, 25, 51,122, 63,123,246,172, 49,128,231,111, 58, 24, 15, 12, 12,140,158,
- 56,113,162, 83,227,198,141, 81,152,165,194,235,194,133, 11, 77, 55,108,216, 48, 36, 46, 46, 46, 8, 64,250,155,252,128,147,147,
-211, 31,191,255,254,187,179, 88, 44,198,193,131, 7,157, 59,116,232,112,225,214,173, 91,173,222, 64,108,145,206,206,206, 19, 0,
-180,103, 24,134, 15,224, 90, 86, 86,214, 60,216, 31,213,221, 83, 42,149,238, 37, 73,178,154,213,179, 10,146, 36, 93, 8,130,200,
- 48,191, 71, 16,132, 27,195, 48, 87,148, 74,101,243,202,234,248,126,195,217,217,121, 84,106,106,234,175, 2,129,128,167, 80, 40,
- 32, 22,139,193,225,112,192,225,112,170, 8, 4,130, 42, 2,129,160, 75,187,118,237,198,255,253,247,223,165, 70,216,111, 22,234,
- 62, 28, 36, 49,135, 34, 72, 10, 0, 72,174, 68,238,224,224,128, 57,115,230, 72,122,246,236, 41, 1,128,139, 23, 47, 14, 29, 54,
-108, 88,135,132,132,132,186, 37,137,173,226,180,200,123,132, 18,131,217, 90, 39,149,142,120,229,201, 37, 73,240,249,124, 92,189,
-122, 21,182, 4, 43, 55,167, 72, 40,181, 53, 40,140, 48,126,231,206, 63, 6, 0,115, 71,195,231,243,113,233,210,171, 65,229,155,
- 53,107,102,179,133,163,162,208,183, 78, 65,144,199,221,159, 23,148,171,223,170,130,232,218,187, 63, 15, 66,235,159, 99,209,119,
-194,172, 1,249, 90, 67, 35, 0,234,236,172,172,172, 27,251,246, 37,133,214,172,201,251,227,143, 63, 26,123,123,123,247,181, 67,
-104, 77,107,208,160,193, 94, 74,228,224, 50,116,216,240,161, 35, 57,164, 97,200,152,175,231,199, 39,103,168,195,195,195,247, 29,
- 60,120,112,232,162, 69,139, 30, 78,153, 50,101, 26,128,239,108, 45,191, 80, 40,172,250,232,209,163, 64,154,166, 81,167, 78,157,
-119, 49,141, 65, 40, 10,130,239,125, 10, 96, 71,225,123, 3, 81, 16,185, 63, 12,192,109,123, 44, 91,102, 11, 86,113, 91, 69,195,
-219,219, 59,104,240,224,193, 46,202,140, 12,252,178,116,169,249,237,134, 40, 99, 26,209,252,252,232,245,122,124,252,241,199,131,
-105,154,230,152, 69,160, 78,167,211,231,228,228,104,241,143, 99,105, 58,128, 15,108, 40,142,191, 68, 34,249, 9, 64,152, 70,163,
-241, 6, 0,137, 68,146,200, 48,204,126,181, 90,253, 29,254, 73,224,107,247, 0, 23, 64, 48, 74, 78, 5,197, 46, 92,184,240,201,
-244,233,211,159,255, 7,156, 85,221,221,221, 23,244,235,215, 15, 71,142, 28,193,209,163, 71,141, 34,145,136, 51,108,216, 48, 98,
-252,248,241,138,137, 19, 39,118, 1,176,252, 13,111,115,151,217,179,103, 59,213,174, 93, 27,123,246,236,193,221,187,119, 53,129,
-129,129,162,182,109,219,130,195,225, 56,125,251,237,183, 31, 1,216,252, 38, 63,160, 84, 42,231,125,253,245,215, 91,118,236,216,
- 33,123,241,226, 5, 86,173, 90,229, 50, 96,192,128,136,184,184,184, 54,118,136, 45, 1,128, 9, 0,218, 81, 20,213,106,216,176,
- 97,166, 47,190,248,130, 75,146,164,113,233,210,165,174, 27, 54,108, 24,192,229,114,195, 50, 51, 51,109, 25,164,145, 0,230,140,
- 28, 57,114,196,223,127,255,173,184,126,253, 58,223,217,217, 25, 52, 77, 91, 44,197, 12,195,184,153,235,172,201,100, 66, 80, 80,
-144,143,213,247, 69,239,171,208, 32, 73,210,192, 48, 12, 23,128, 16,128,174,172,253,255, 37,145,229,228,228, 52, 78,169, 84,254,
-230,225,225, 1,119,119,247,215,218, 92,157, 78, 7,161, 80,200,243,240,240,248,189,103,207,158,220, 3, 7, 14,148, 56, 5, 72,
- 80,196,247, 7,119,206,245,118, 82,200, 0, 0,203,214,156,200, 7,128,191,254,250, 11, 73, 73, 73, 80, 40, 20,168, 91,183, 46,
- 53,119,238, 92,207,201,147, 39,255,146,149,149, 53,178, 36,174,162, 90,228, 61,179,104,173, 43,110,191, 84, 31, 45,150,101, 45,
-121,242,108,172,180, 69,223, 58, 93,132,143,208,235,245, 40,106,209, 50, 63,188, 92, 46,183,168,249, 17, 4, 65,176,165,113, 22,
-131, 97, 18,137, 36, 68,173, 86,175,180, 99,116,107,225,220,253,121, 16,182, 8,166, 14, 52,103, 34,237,242,117,193,235, 22, 0,
-151, 95,142, 92,245,107,155, 54,222, 19,102,174,152,165,201, 76,202,248,118,112,247,170,129, 30,206, 34, 73,118, 90,142, 83,173,
- 90,157,138, 88,105,202, 42,103,235,161, 67,135,110, 61,121, 53,134, 16, 10,121, 60, 14, 69,113, 91,214,171,233,236,235, 64, 57,
-200, 0,135,248,231, 79, 46, 15, 31, 62,188,222,148, 41, 83, 90,217,193,137,194, 14, 23,219,182,109, 3, 65, 16,164, 61,231, 94,
-129, 40,122,223,205, 15,113, 40,128, 91,133,251,219,173, 58,149,237,133,239,221, 50,139,173, 98,172, 94,167,139,138, 23,243,244,
-155,209,104,196,176, 97,195, 6,155, 76, 38,142, 85, 35, 81, 84,192, 20, 39, 98,108, 58,119, 79, 79,207,147, 0, 62, 32, 8, 2,
-122,173, 86,255,211,207, 63, 91,127,124,179,136,200, 58, 93,210,179,100, 52, 26, 65,211, 52,231,214,173, 91, 92,171,186,206, 5,
- 32, 1,224,194,178, 44, 72,146,188,103,195, 61, 10, 18,139,197,151, 15, 29, 58, 36,111,216,176, 33,193,231,243, 97, 50,153, 16,
- 21, 21,229,187,104,209,162, 49,167, 79,159,254, 72,173, 86,215,193,235,201,211,109,185,239,193, 23, 46, 92, 80, 7, 4, 4, 20,
- 43, 28, 85, 42, 21,167,102,205,154,109, 74, 16, 69,111,155, 51, 33, 53, 53,181,215, 7, 31,124, 48, 54, 37, 37, 37,218,100, 50,
-125, 3,160,174,139,139,203,173, 62,125,250, 64, 36, 18,181,211,104, 52,203,223,164,206,187,185,185,245,108,222,188, 57, 86,173,
- 90,133, 69,139, 22,117, 4,112, 6, 64, 7,149, 74,117,186, 71,143, 30,112,116,116,236,149,157,157,189,249, 13,158,163,154,173,
- 91,183,254,125,206,156, 57,178, 35, 71,142, 32, 48, 48, 16,185,185,185,248,234,171,175,220,126,248,225,135,115,217,217,217,109,
-173,158,139,146, 56,235, 8, 4,130,205, 59,118,236,144, 6, 4, 4, 4,240,120, 60, 50, 32, 32, 0, 74,165, 18, 90,173, 86, 48,
-127,254,252,122, 34,145,232,206,242,229,203, 55, 3,232, 83, 70, 57, 73, 0,243,214,174, 93, 59, 54, 60, 60,220,113,240,224,193,
-180, 94,175,199,174, 93,187, 64, 81, 20,184, 92, 46,196, 98,177, 37,121, 53,143,199, 67,173, 90,175, 5, 73, 63, 88,202,249,230,
-160,192, 15,213, 17,246, 77,187,158, 46,133,207, 50,245,193,229,114, 33, 20, 10, 33, 20, 10, 33, 16, 8,240,232,209,163,153, 66,
-161,112,105, 9,214,241,215, 56,137,127,212, 69, 8,128,235,101,237,227,117,215,144,183,222,126, 22, 3, 31,130, 32,150, 1,104,
- 87,208,237,146, 17, 46, 46, 46, 95,166,166,166,198,218,202,233,233,233,233,156,153,153,185,220,211,211, 19,238,238,238,150,254,
-219,219,219, 27, 70,163, 17,169,169,169, 96, 89, 22,217,217,217, 16,139,197,240,242,242, 90, 30, 30, 30,190,103,221,186,117,153,
-197,114, 50, 88,212, 99,192,140,239, 41,138, 34, 1,128,226, 72,165, 19,167, 3, 85,171, 86, 69,203,150, 45,161,213,106,145,147,
-147,131,224,224, 96, 14, 65, 16, 67, 9,130,144,179, 44,187, 26,192,217,255, 65, 67, 97,137,206,240,179,139,206,139,154,179,197,
-243,120, 60,155,132, 86,225,241,101,153, 33, 72,163,209, 8, 30,143,247,138, 69,130, 32, 8,208, 52,253,202,251,102,161, 85, 30,
-161, 62,126,252,120,230,247,223,127, 31,155,149,149,181, 6,229,156, 74, 24, 58,116,232,107,254, 30,147, 39, 79, 78, 72, 75, 75,
- 99, 63,238, 20, 34,137, 62,150,148, 92, 93, 33, 21,185,202,100,213,132, 10, 39,199,204,204,204, 43,133,141,137,173,168,209,160,
- 65, 3,209,150,125, 23, 18, 70, 79, 90, 56,183, 97,128,179,188,190,143,139,194,195, 65,196,151,146,132, 90,104, 50, 38, 56, 57,
- 57, 5,218, 91,110,115,187, 32, 22,139, 65,146,228, 59, 97,209,178,154, 46,188,197,178, 44,148, 74, 37,142, 28, 57,130,174, 93,
-187,222, 50,139, 16,149, 74,133,228,228,100,120,122,122,222, 42,180,124,148, 57,141,200, 48, 12, 12, 6, 3, 12, 6,131, 69,192,
- 88,213, 33,139,128, 49, 31, 75, 81,212,189,114,158,194, 92,133, 66,209,186, 93,187,118,252,157,187,118,241, 89,150, 85,163, 32,
-135, 90, 30,203,150,144, 32,187, 8, 76, 38,147,197,202,198,229,114, 17, 23, 23,103,233,184,204,185, 37,133, 66,161,109,166, 12,
-129,224,235, 63,255,252, 83,222,184,113, 99, 34, 51, 51, 19, 12,195, 88, 26,201,223,126,251, 77,216,183,111, 95,239,200,200,200,
-111,117, 58,221,236,242,220,174,146, 4, 17, 0,200,229,114, 19,108,139,152, 93, 38,167,201,100, 34, 90,180,104, 49, 37, 35, 35,
-163,158, 70,163,153,111,203,101, 4,112, 48, 33, 33,193,186, 99,191, 19, 29, 29,173,233,223,191,191,168, 90,181,106, 77, 30, 60,
-120,240, 70,117,181,102,205,154,205,184, 92, 46,174, 93,187,166, 3, 96, 30, 89, 71,220,189,123, 87,215,167, 79, 31,129,175,175,
-111,179,236,108,155, 93, 86,106, 6, 5, 5,157,114,115,115, 19,153,219, 80, 87, 87, 87,238,186,117,235,100,137,137,137, 48, 24,
- 12,152, 54,109, 26,186,117,235, 6, 23, 23, 23, 76,158, 60,217,125,241,226,197,127,228,229,229, 53, 40,205,104,205,231,243,183,
- 62,125,250, 52,208,211,211, 83,116,245,234, 85,212,175, 95, 31, 25, 25, 25, 72, 73, 73, 65, 94, 94, 30, 82, 82, 82, 48,114,228,
- 72,183, 95,126,249,197,203, 6, 75,150, 69,100,173, 91,183, 46,123,239,222,189,212,250,245,235,101, 92, 46,215, 34,180, 56, 28,
-142, 69,104,153,115, 43,150, 99,166, 33,187, 80,180, 57,230,228,228,228,188,193, 45, 18, 0,224, 91,139, 44,129, 64, 0,129, 64,
- 0,161, 80,248, 70,121, 89,223, 19,120, 19, 4,241,128,199,227, 9,196, 98, 49,143, 36, 73, 8, 4,130, 78, 78, 78, 78,247,235,
-214,173, 91,247,212,169, 83, 49,182,144,104,181,218,173, 2,129,128,235,230,230, 6, 0, 8, 12, 12, 68,253,250,245,161, 86,171,
-153,156,156, 28, 56, 58, 58,146,177,177,177,208,104, 52, 72, 78, 78,134,159,159, 31,151, 36,201,173, 40,240, 67,126, 13,151,111,
-165,172, 1,176,198,188,239,226,226,146,106,109,233, 20, 10,133,240,246,246, 70, 98, 98, 34,100, 50, 25,245,195, 15, 63,244,217,
-181,107, 87,239,203,151, 47, 15, 5,176,205,138,106,246,123,236,163,101, 22, 89,214,175,255, 8,173,110,221,186,205, 58,124,248,
-112,155,226, 70,225, 92, 46,183,194,124, 93,204,130, 74, 46,151, 23,181, 90,129, 97,152,146, 44, 90,118,255,142, 80, 40, 20,141,
- 27, 55, 46,119,245,234,213,118,139,173,126,171,162, 45, 86,172,215,134,145,117,234, 92,254,246,219,111,123,254,253,247,223,137,
- 13, 3,170,113, 36, 73,177,121, 66,185,163, 35,124,170,116, 29,214,171,207, 93, 20,172, 62,180, 21, 79,115,115,115, 69,213,125,
-196,122,146,212, 18, 85, 4, 28,153,167,132, 39,240, 80, 40,188,121,122, 93,154, 92,161,224,235,116,186,108,148,146, 4, 26, 0,
-220,221,221, 79,136, 68, 34, 63,243,190, 66,161,112, 96, 89, 22, 98,177, 24,158,158,158, 82,138,162, 30, 91, 61, 92,177,169,169,
-169,157,202, 42,152,163,163,227, 9,129, 64,224, 71,146, 36, 8,130, 0, 69, 81, 32, 73, 18, 36, 73, 90,254,167, 40, 10, 4, 65,
- 32, 63, 63, 63, 54, 38, 38,166,147, 13,231,107, 2, 16, 70, 16,196,173, 35, 71,142,160, 73,147, 38, 56,118,236, 24, 58,119,238,
-140,156,156, 28, 68, 69, 69,161,117,235,214, 0,240,169,173,247,220,218,249,221, 60, 40,120,244,232,145, 69,184, 88,111, 50,153,
-236, 77, 76,236, 23,251,245,235,135,223,127,255,157, 45, 28, 76, 72, 8,130,168,239,224,224,240,232,225,195,135, 54,249,193,176,
- 44, 11,131,225,159, 67,205,157, 87,161, 63,132, 93,201,129, 41,138,234,212,160, 65, 3, 34, 39, 39,199, 44, 32,193,225,112, 64,
- 81, 20, 40,138,194,175,191,254, 42,106,220,184,241, 12,129, 64, 48,133,199,227,169,140, 70,227, 78,173, 86, 59, 31, 64,246,187,
-212, 34,181,106,213,106, 82,124,124,124, 55, 63, 63,191, 67,111, 64,195, 26,141, 70, 61, 0, 17, 69, 81,220, 10,104,163,168,194,
-186,165,181, 18,251,166,194,125, 1, 10,166,137,109,130,139,139,203, 31, 71,143, 30,245,241,243,243,131,209,104,132,201,100, 66,
- 94, 94, 30, 34, 34, 34,160,211,233, 96, 50,153, 16, 24, 24,136,239,191,255, 94,251,229,151, 95, 10,215,174, 93,155,150,151,151,
- 55,168, 12,218, 47,247,236,217, 35,241,244,244, 20,105, 52, 26, 60,127,254, 28, 13, 26, 52, 64,110,110, 46,212,106, 53,242,243,
-243, 97, 48, 24,160, 82,169, 28,105,154,214,151,193, 53,211, 90,100,141, 25, 51,230, 30,159,207,111,240,197, 23, 95, 32, 33, 33,
-193,242,204,143, 30, 61, 26,238,238,238,150,103,169,240,249,180,171, 97,230,112, 56, 16, 8, 4,224,241,120,217, 85,170, 84, 1,
- 65, 16,194,216,216,216,242, 76,197,201, 1,168,184, 92, 46,223, 90, 96, 9, 4, 2, 92,187,118,237, 91, 62,159,191,212, 30, 95,
- 79,182, 72,231, 86,214,254, 59, 48,104, 93,198,227,241, 4, 78, 78, 78, 60,171, 1, 39, 79, 42,149,194,205,205,109, 21,128, 46,
- 54,158,119,168,147,147,147,165,125, 15, 9, 9, 65,124,124,252,254,156,156,156, 33,105,105,105, 32, 73,114, 43, 73,146,189,205,
-131,212,172,172, 44,248,250,250,134,150,196,215, 60,204, 99, 44, 8,246, 21,139, 86,145, 1, 26,228,114, 57, 94,190,124, 9,181,
- 90,205, 62,121,242,132, 24, 55,110, 28,161,215,235, 55, 69, 70, 70, 94, 65,193,106,251, 18,181,200,123, 2,251,125,180,204, 22,
- 45, 91, 59, 0,130, 32,202, 28, 77, 24,141, 70,105,112,112,112,113, 14, 95, 68,113, 66,171,112, 58,169, 92, 21,157,203,229,202,
-202, 43,182,138,226,208,222, 29,238,139,190,159,246,189,147, 87,181,234, 83,166,204,228,116,239,222,253,234,150, 45, 91,104,167,
-218, 93, 58,156, 61,177,205,125,249, 87, 83,143, 29, 61,122, 20, 40,112,140,182, 21, 23, 15, 31, 62,236, 49,121,194,120,124,255,
-245,151,199,229,129, 46,124, 41,225, 36, 17,234,212,233, 82,176, 26, 65,141,160,110,251, 14, 29, 74, 6, 16, 89, 26,137, 88, 44,
-246,123,240,224, 65,160,245, 66, 2,189, 94, 15,177, 88,140,179,103,207,186,138, 68, 34, 87, 0,208,104, 52,168, 91,183,174,173,
- 22, 19,191,199,143, 31, 7,202,100, 50,228,231,231, 67,167,211,193,104, 52,130, 97, 24, 16, 4, 1, 46,151, 11, 62,159, 15,137,
- 68, 98,239,202,190,219, 0, 62,237,218,181,235,246, 99,199,142, 33, 56, 56, 24, 89, 89, 89,136,142,142, 54,139, 44,243,180,161,
- 77, 48, 91,137,172,253,177, 56, 28, 14,254, 8, 8,192,232,164, 36,139,128, 89,230,224,128,239,153,242,101,211,168, 91,183, 46,
-123,241,226, 69, 28, 63,126, 28, 61,122,244, 32, 14, 28, 56, 96,160,105,154,151,148,148,116, 47, 41, 41,201, 38, 14,134, 97, 44,
-101, 53,183,219,214, 2,203, 94,161,101, 50,153,100,124, 62, 31, 90,173, 22,102,203,131,245,230,239,239, 15,165, 82,201, 81,169,
- 84,156,164,164, 36,241,188,121,243,190, 56,119,238,156,103,110,110,238,192,255,178, 21, 90,189,122,181,223,232,209,163,227, 56,
- 28, 14,219,185,115,231,193,177,177,177,189, 60, 61, 61,207,252,253,247,223, 63, 3,168,105, 47,159,139,139,203, 77, 14,135,227,
-163, 82,169,120,187,119,239, 54,230,230,230,242, 92, 93, 93, 83,205,109,135,249, 90, 27,141, 70,155, 86, 46,187,184,184,220,204,
-200,200,224,173, 92,185,210,152,153,153,201,115,119,119, 79, 53,243,100,103,103,243,118,239,222,109, 84,169, 84, 60, 7, 7,135,
-155, 57, 57, 57,101,242,101,100,100, 12, 26, 58,116,232,133, 51,103,206,184, 80, 20,133,216,216, 88,100,102,102,194,209,209, 17,
- 91,183,110,133,159,159, 31,246,236,217,163, 84, 42,149,163,126,250,233,167, 25,133, 34,171, 44, 31,173,214, 77,154, 52,241,203,
-206,206,134,163,163, 35,212,106, 53,110,222,188,137, 58,117,234, 32, 41, 41, 9, 36, 73,194,209,209, 17,191,253,246, 91, 62, 65,
- 16,202,210,136, 68, 34, 81,175,240,240,112, 71, 0, 8, 15, 15,119, 12, 15, 15, 47,182,131,107,214,172, 25, 86,173, 90, 85, 84,
-104,217, 51, 48,176, 88,157,172,196,145,182,105,211,166, 56,119,238,220, 84, 59,197,145,222, 44,218,138, 90,179, 4, 2,129,221,
-139,105, 24,134,225,161,192,165,129,176,101,255, 29, 64, 27,145, 72,196, 43,250,102,126,126, 62,207,211,211,179,149, 29,194,215,
- 89, 36, 42, 48, 56,249,249,249, 33, 39, 39,135,214,235,245, 3,182,109,219,102, 4,128,176,176,176, 1, 52, 77,107, 77, 38, 19,
-197,231,243,161, 86,171,225,230,230,230, 92,138,109,244,155,131, 59,231,121, 20,245,209,242,244,244, 68, 88, 88, 24,116, 58, 29,
-146,147,147, 17, 17, 17, 97,164,105,122,251,234,213,171, 25, 87, 87,215, 17, 31,127,252, 49, 21, 25, 25,249, 57,128, 73, 37,105,
-145,247,204,154,181,174, 68,161, 85,168, 32,207, 1,104, 91,244, 36,139,138,159,210,132, 86, 89, 83,135,124, 62, 63, 59, 46, 46,
- 78, 98,221,169,152, 76, 38,120,121,121, 49, 44,203, 18,197, 9,173, 55, 49, 5,115,185, 92,217,244,233,211,179, 87,175, 94, 61,
-232,229,203,151,179,108,249,206,238,207,131,176,165,136,200, 90,179,104,206,170,149,139,230, 57, 61, 59,190, 9,235, 87, 44,161,
-105, 26,145,245,234,213,107,149,151,151,199,113,144, 24,145,145,141, 99,133, 34,203, 86, 81, 72, 2,216,120,253,250,245,200, 46,
- 93,186, 92,218,248,231, 62,167,164,231,207,175, 8, 84, 25,201,242, 26,129, 28,158,183, 95,239, 92,173,150, 55, 96,192, 0, 87,
- 0, 31,151,213,136,101,103,103, 35, 37, 37,165,168, 0,195,163, 71,143, 94, 59,214,166,194,145, 36,104,154,198,222,189,123, 33,
- 22,139, 33,145, 72, 94,217,204, 34,171,156, 11, 21, 30, 3, 64,231,206,157,161, 84, 42, 33,149, 74,109, 46, 87, 81,241,194,178,
- 44,244,122, 61,244,122, 61, 12, 6, 3, 13,128,203,225,112, 48, 50, 33,193, 98,229,177, 71,192, 20, 69,189,122,245,216,203,151,
- 47,227,210,165, 75, 80,171,213, 88,185,114, 37, 60, 61, 61,219, 3,152,105, 47,151,149,147, 62,173, 82,169,184, 42,149,202, 98,
- 29,228,114,185, 22,235,129,141,150, 60, 30,135,195,177,140, 70,205,155,181, 85,139,162, 40,184,187,187,195,195,195, 3,107,214,
-172,225, 85,171, 86,173,219,127,217, 2, 45, 94,188,184,198,178,101,203, 54,108,217,178,229,216,160, 65,131,118, 69, 69, 69, 13,
-119,112,112,184,119,246,236,217,121, 2,129,128, 41,231,243,237,147,148,148,228,102,253, 22,195, 48, 98,147,201,100, 17,182,249,
-249,249, 54, 15, 48,184, 92,174,207,131, 7, 15,196, 0, 48,111,222, 60, 46, 0,177,217, 25,220,204,153,159,159,207,173, 83,167,
-142,143,173,117,253,194,133, 11,173, 58,118,236,120,249,212,169, 83, 10, 63, 63, 63, 36, 38, 38, 34, 49, 49, 17, 53,106,212,192,
-130, 5, 11,212, 42,149,170, 5,128,199,121,121,121, 7,108,228,244, 82, 40, 20,220,184,184, 56,152, 76, 38,132,134,134,226,183,
-223,126,195,128, 1, 3, 80,183,110, 93,168, 84, 42, 60,120,240, 0,155, 55,111, 86,240,120,188, 82,219, 14,141, 70,115, 96,221,
-186,117,190, 69, 45, 90,131, 7, 15,150,164,166,166, 90,234,228,156, 57,115, 94,153, 66,180,167, 77, 46,156,218, 42,113, 43, 15,
- 76, 38,147, 92, 40, 20,170, 4, 2, 1,223,236,159, 21, 17, 17, 97,183, 53,171,200, 0,208,158,253,255, 12,102,209, 90, 76,223,
- 10, 15, 15, 15,155,121, 4, 2, 1, 97,110, 27, 77, 38, 19,114,114,114,104, 79, 79, 79,203,244,254,173, 91,183,232,170, 85,171,
-210, 20, 69, 81,124, 62, 31, 4, 65, 64, 44, 22,151,216,224,179, 52, 59,167,251,128,153,175,172, 58,156, 56, 29, 48, 24, 12,184,
-117,235, 22, 12, 6, 3, 34, 34, 34,140, 63,253,244, 83, 82,118,118,246, 68, 0,156, 19, 39, 78, 12,157, 58,117, 42,229,230,230,
-214, 49, 45, 45, 13,101,105,145,247, 72,108,189,102,229, 50,247, 66,231,186,117,235, 70, 20, 46,173, 36,204,194,201, 30,161, 85,
-248,240,149,217,243, 18, 4,129,228,228,100,203,190,155,155,155,221,191,101, 43,156,157,157,213,205,154, 53,147,101,100,100, 28,
- 88,188,120,113,185, 44, 89,107, 22,205, 89,181,112,238, 15, 78,202,135, 87,145,144,148, 12,101,154, 49,242,226,189,151,251, 1,
-236, 7, 0,172,173,125,142, 24, 27,253,171,173,156, 65, 46,162, 16, 46,143,179,255,131, 46,221,124,251,135, 79, 34, 63,251,236,
-179,150, 67,135, 14,205, 25, 52,104,208, 4,169, 84, 90,211, 96, 48,100,237, 59,114, 36,166,127,255,254,213,104,154, 30,138, 50,
- 98,142,104, 52,154,216,182,109,219, 90, 95, 79,249,233,211,167,221, 99, 98, 98, 48,126,252,248,244,196,196,196,108,235, 99,109,
- 41,163,193, 96,136, 13, 9, 9, 41,113,186,208, 60,165, 8, 0,185,185,185,177,118, 92,210,129, 40,116,124,207,204,204,196,163,
- 71,143,192,225,112,208,180,105, 83, 92,188,120, 17, 45, 91,182,188,101,143, 85, 75,171,213,194,207,207, 15, 90,173, 22,106,181,
- 58, 31,128, 96,107,181,106, 0,128,207, 51, 51,113,243,167,159,112,117,225, 66, 88,215,103, 91, 81,191,126,125,246,234,213,171,
-184,119,239, 30,116, 58, 29, 70,141, 26, 5, 0, 68, 97,221,181, 39,100, 70, 0, 69, 81,157,187,116,233,226, 5, 0,106,181,154,
-184,126,253, 58,132, 66,161,229, 89, 56,116,232, 16, 18, 19, 19, 65, 16, 4, 20, 10,133, 79, 86, 86, 86, 53, 0, 47, 75, 49,251,
- 19, 47, 95,190,196,143, 63,254, 8,134, 97, 48,117,234, 84, 4, 6, 6, 90, 4, 86,108,108, 44,230,205,155, 7,154,166,241,195,
- 15, 63,160, 70,141, 26, 48, 26,141, 66, 20, 31, 86,227, 95,193,228,201,147,159,237,223,191,255, 88,124,124,252, 71,139, 22, 45,
-106, 67, 16, 4, 51,101,202,148, 31,229,114, 57,253, 38,188, 89, 57,185,120,244, 52,214, 34,132,138,110,174, 46, 78,118,243, 61,
-121, 30,111,249, 62, 77, 91,243,209,112,118, 82,216, 91,196,124,163,209,168,238,221,187,183,227,222,189,123,137, 26, 53,106,224,
-197,139, 23,102,203, 80, 62,236, 15,233,144,168, 84, 42, 3, 41,138,226, 61,125,250, 20, 85,171, 86, 69,147, 38, 77, 48,127,254,
-124,100,100,100,192,100, 50,193,205,205,141, 49, 26,141,183, 12, 6,195,249, 50,184,230,140, 25, 51,134, 7, 96,108,161,101,171,
-222,196,137, 19,153, 37, 75,150,224,214,173, 91, 22, 11,150,181, 51,188,189, 83,135,214, 86, 39,235, 45, 34, 34, 98, 42,159,207,
-103, 1, 92,131,253,129,158,245, 69, 45, 90,229,177,102,189, 45,188,205,149,140,158,158,158, 17, 50,153,172, 91, 86, 86,214, 43,
- 86,173, 22, 45, 90, 24,220,221,221, 47,216,202, 35,149, 74,179, 40,138,114, 6,128,196,196, 68, 72, 36, 18,222,243,231,207, 23,
-162, 32,120, 54,170, 85,171,182, 80,169, 84,242,170, 21,182,167, 30, 30, 30,208,235,245, 37,186,177, 92,185,157,186, 9,192, 38,
-243,190,147,147, 83,114, 78, 78,142,104,201,146, 37,121, 11, 23, 46,212,208, 52,173, 3,112, 54, 59, 59,219, 18, 71, 43, 37, 37,
- 37,135,203,229, 58, 57, 58, 58,122,155,133, 86,113, 90,228, 61, 67,201, 22,173, 66, 37,201, 22, 21, 68, 4, 65,188,230,160, 94,
-134,208, 42, 83,100,209, 52,253,138,149,193,236,240, 94,220,111, 21,118,234,229,154, 58, 44, 20, 89,194,125,251,246,109, 93,188,
-120,241, 53, 91,191,103,237,163,181,246,231,185,139,204, 34,235,238,165, 83, 56, 16,157,147, 49,117,225,210,101,229,189, 3,181,
- 93,196,245,221,221,157,207,253,180, 96,142,252,217,241,205,216,181,246, 23,246,238,141, 27,141,111,220,184, 49,100,252,248,241,
- 85, 10, 43,150, 18,192, 29, 0,253, 97,195, 42,157,196,196,196, 78, 69, 58,225,199, 60, 30,207, 93, 44, 22, 35, 49, 49, 49,239,
-201,147, 39,118, 79,201,100,100,100,116,122, 11, 21,144, 99, 22, 89, 25, 25, 25,120,240,224, 1,218,181,107, 7, 0,184,120,241,
- 34, 90,180,104,129,200,200, 72, 52,104,208,224, 22,128, 70, 40, 35, 80,171,209,104,204,174, 93,187,182,197,186,149,147,147,195,
- 0, 64,120,114, 50,214,121,122,130,195,225,224,234,194,133,248,206,104,196,124, 59, 5,124, 72, 72, 8,123,253,250,117,196,196,
-196,192,100, 50,161,103,207,158, 40,231, 67, 95, 55, 40, 40,232,244,217,179,103, 93,165, 82, 41,212,106, 53,242,242,242, 48,108,
-216, 48, 12, 24, 48, 0, 58,157, 14,187,119,239,198,193,131, 7, 33,147,201,160, 86,171,161, 86,171, 21, 93,187,118,189,252,248,
-241,227,214, 0,158,150, 32,180,216, 78,157, 58,225,194,133, 11,160, 40, 10,141, 27, 55, 70,102,230, 63,139,129,220,221,221,139,
-251,140,250, 47,133, 22,135,195, 97, 35, 34, 34, 22,181,105,211, 6,241,241,241, 31, 53,104,208, 96,229,240,225,195, 19,223,148,
- 87,225, 32, 67, 72,157, 0,232,116, 58,232,116, 58,120,121,121, 33, 55, 55, 23,207,158, 61,131, 78,167,131,187,155,163,221,124,
- 97,117,107, 88,248,220,220,220,160, 86,171,241,242,229, 75,232,245,122,184,184,216, 37,180,124, 59,117,234,244,247,246,237,219,
-157, 55,111,222,172,111,219,182, 45,127,229,202,149,132, 92, 46,135, 85,199, 98, 47, 34, 46, 94,188,232,215,177, 99,199, 90, 15,
- 31, 62, 68, 68, 68, 4,244,122, 61,194,194,194,240,228,201, 19, 52,107,214, 12,121,121,121,215,110,220,184,113,208, 22,195, 48,
-128, 25, 99,198,140,129, 89,108, 93,184,112, 1,201,201,201,144,201,100,175, 9, 45,179,239, 99,225,170,113, 47, 91, 10,107, 22,
- 68, 86,150,167,239, 28, 29, 29, 13, 0,150,149,211,250, 4, 0,136,143,143, 23,212,171, 87, 79, 39, 20, 10,249,133,162,109,233,
-155,240, 85, 36, 42, 96, 37, 99,137,240,240,240,152,232,226,226,210,209,223,223, 31,169,169,169, 60, 62,159,143, 22, 45, 90, 24,
- 26, 53,106,100,240,240,240,248,220, 86, 30,129, 64,240,144,199,227,181, 46, 24, 76,208,136,139,139, 3,203,178, 83,235,214,173,
-251,101,110,110, 46, 50, 51, 51,249,114,185,220, 50,168,174, 85,171, 22,116, 58,221, 67, 59, 44,111,115,170, 86,173, 58,131,199,
-227,205,207,200,200, 40, 46, 44, 4,223,209,209, 81,206,227,241, 96, 48, 24, 94, 17,155, 69,181,200,251, 46,178, 94, 17, 90, 86,
- 42,242, 21,161, 99,143, 69,203, 22,171,129,217,193,222,122,223, 44,234,138,254, 86,121, 99,104, 57, 56, 56,232,204, 34,107,254,
-252,249,215,202,195,177,103,251, 54, 79, 7, 38,223, 55,233,218, 81, 60,190, 23,137,253, 15,178, 51,166, 46, 92, 58,161,251,199,
- 3, 83,139, 10, 51, 91, 16,232, 42,174,235,238,230,124,238,231,197, 11,229,202,135, 87,145,156,146,130,163,215,110, 68, 26,128,
- 7, 0,166, 86,164,105, 25, 40,152, 58,164, 40,234,157,168,176,133,247,216,226, 12,159,156,156,108, 22, 89, 97, 0,208,178,101,
-203, 91,133, 34,203,252, 94,153,177,180,178,179,179,139,166,172,233, 8,192,197,124,254, 28, 14, 7, 45,102,204,176, 91,100, 1,
- 96, 35, 35, 35,161, 84, 42,205, 35,197,242,138, 44,120,120,120,124,125,246,236, 89,215,141, 27, 55,170,182,108,217,146,201, 48,
- 12, 55, 36, 36,196,167, 97,195,134,196,214,173, 91, 1, 0,253,251,247,199,212,169, 83,113,255,254,125, 72, 36, 18,180,108,217,
-146,158, 53,107,150,219,196,137, 19, 63, 79, 77, 77,157, 80,108,239,200, 48, 60,161, 80,120, 6, 64,251,135, 15, 31, 2,192,101,
- 20,164,112, 50, 91, 17, 74,252,204,150,206, 55, 55, 55,151, 43,147,201,138, 13, 13,193, 43, 24, 13,217,107,129,176,112, 94,186,
-116,233,199,159,127,254,121,255, 87, 95,125,245,244, 13, 57,139,181,104,117,235,214, 13, 26,157, 1, 9,169, 57,160,105, 19, 52,
-134, 52,187,249,172, 45, 90,221,186,117, 67,190, 86,143,184,100, 37, 76, 38, 26,185, 26,155,251,114,241, 7, 31,124,112, 98,231,
-206,157, 30, 87,174, 92, 1, 77,211,204,147, 39, 79, 94,246,238,221, 91, 62,101,202, 20,231, 55, 88,100,180, 98,224,192,129,125,
- 47, 93,186,164,172, 85,171,150,211,181,107,215,144,150,150, 6,147,201,132,246,237,219,131,207,231,199, 45, 92,184,144, 7, 96,
-133,173,247,166, 80,108, 25,110,220,184, 49,250,234,213,171, 78, 78, 78, 78,124, 38, 40, 8,201,167, 78, 97,239,222,189,175,125,
- 97,237,218,181,128,141, 81,248,205, 22,167,235,215,175, 87,136,192,122,165,167,230,243,203, 61,253,248,190,226,250,245,235,137,
-159,125,246, 89, 29,185, 92,190,172, 85,171, 86,237,156,157,157, 73,133, 66, 17,225,237,237,253,101, 72, 72,136,205,179, 11, 92,
- 46,119,184, 68, 34,121,102, 50,153,168,188,188, 60,168,213,106, 0,128,201,100,226,147, 36,137,106,213,170, 89,250,146,198,141,
- 27,195,195,195,131,142,142,142, 30,110, 43,127,122,122,250, 43,171, 16,139,193,152, 22, 45, 90,112,116, 58, 29, 98, 98, 98, 46,
- 90,127, 80,156, 22,121, 79, 16, 94,170,248, 50,159,148,245,201,121,123,123,199, 27,141, 70,246, 1,192,222,185,115,135, 13, 15,
- 15, 47,117,211,106,181,172,155,155, 91,114, 49,157, 31,172, 57,117, 58,221, 43,223,211,233,116,172,187,187, 59,173,209,104, 94,
-227,212,104, 52,172,143,143, 79, 98,105,156,197, 96,216,237,219,183, 87,127,247,221,119, 77,236,184, 64, 22, 78,118, 77, 16,187,
-121,243,230, 79, 88,150,109,211,170,142,223,189,126, 33,238,108,139, 64,183,164,131,123,182, 15, 96, 89,182, 77,209,205, 28,224,
-180, 52,206, 32,119, 73,237, 14,193, 85,178,238, 30,223,193,158, 93,242, 5,251,115,207, 64,182,129,143, 44, 59,200, 69,100,111,
-142,152, 50,179,165, 7, 7, 7, 63,102, 24,134,213,235,245,108,112,112,240,147,138,224, 44, 7, 74,227, 12, 69,129, 47,219,192,
- 98,222, 11,125,131,114,222,101, 89,150, 85, 42,149,108, 94, 94, 30,171,211,233, 88,154,166, 89,107, 0,184,107, 3, 39,107, 48,
- 24,216,172,172, 44, 22,182,251,220, 21,203,233,233,233,249,242,249,243,231,108,245,234,213,227, 11,205,241, 19,213,106, 53, 91,
- 20,106,181,154,109,215,174, 29,251,228,201, 19,182,106,213,170,218, 39, 79,158,176,158,158,158,143,202, 40,167,191,175,175,239,
- 25, 23, 23,151, 8, 0,129,118,124, 86,234,245,220,189,123,119, 0,203,178,163, 88,150, 13, 47, 97, 27,197,178,108,208,127,205,
- 89,120,125, 83, 89,150,101,243,243,243, 89,165, 82,201, 38, 37, 37,177,249,249,249,108, 94, 94, 30,123,251,246,109,246,202,149,
- 43,236,189,123,247, 88, 39, 39,167, 84, 91, 56,205,124,122,189,158, 85,169, 84,108, 90, 90, 26,171,209,104, 88,181, 90,205, 70,
- 69, 69,177, 55,111,222,100, 31, 62,124, 88, 28,223,107,156,206,206,206,107, 83, 82, 82,242, 46, 95,190,156,191,102,205,154,124,
- 15, 15,143,135, 0,252, 0,212, 84, 40, 20, 41, 95,124,241, 5, 43,149, 74, 99,203,249, 28,213,225,114,185,183, 23, 45, 90,116,
-253,240,225,195,169, 7, 15, 30,212,111,216,176, 33, 97,252,248,241,231, 57, 28,206,109, 0,117,202,249, 28,185, 57, 58, 58, 94,
-190,118,237,154, 41, 43, 43,139,205,206,206,102, 85, 42, 21,171, 86,171, 89,141, 70,195,234,245,122,214,104, 52,178,231,207,159,
-103,221,221,221,173,167, 37,191, 41,101,144, 53,137,101,217,175, 89,150,229, 84,116, 91,103,197,221,170,162, 56, 43,162,173, 35,
- 73,210, 80,216,118, 52, 45,216, 45,125,255,191, 42,103,135, 14, 29,126, 24, 48, 96, 0,219,185,115,103, 54, 44, 44,236,181,173,
- 65,131, 6,236,184,113,227,216,195,135, 15,179, 63,253,244,211, 15, 21, 80, 78, 14, 10, 22,189, 44,232,208,161,131,241,194,133,
- 11,108,255,254,253, 89, 0,157, 74,211, 34,239,179,224, 50, 47,166, 49,135,119, 32,172, 95, 1,192, 96, 48,196, 63,126,252,216,
-179,150,201, 68, 1,192,175,191,254,250,154,149,194, 26, 23, 46, 92, 48, 17, 4,241,172,180, 95, 55, 24, 12,241,103,207,158,117,
- 95,181,106, 21,215,202, 4, 12,147,201,196, 36, 37, 37,145, 43, 87,174,124,229,248,115,231,206,153, 76, 38, 83,156,157, 39,185,
- 57, 52, 52,116,115, 69, 92,173,243,247, 99,190, 60,113,244, 47,151,166, 77, 90,101,203,157,156,138, 29,133,237,254, 60, 8,196,
-216,210,173, 90, 4,135,156,191,104,193, 28, 71,243, 20,228,159,183, 82,178,181, 58,186, 93,116,134,230,110, 69,223,225,188,188,
-188, 24,243, 74, 64,181, 90, 29,247, 14, 86,194,219, 40,136,113,101, 42,242, 94, 35,188,161,211, 41,195, 48,112,112,112,176, 88,
- 67,203, 97, 17,101,139, 88,210,222,200, 71,128,101,217, 75, 81, 81, 81, 85,135, 13, 27, 38,219,178,101,203,115,154,166,185, 35,
- 71,142, 52,120,120,120,240, 46, 94,188,104, 4, 64,180,105,211,134,147,146,146,194, 38, 38, 38, 42,123,244,232,145, 59,122,244,
-104,231, 59,119,238,240, 25,134, 41, 43,104,225,139,248,248,248, 14,229,248,172, 84,244,235,215,239, 57,222, 60,141,205, 91,231,
- 52, 67,153,173,194,243,152,196,194, 8,230, 12,232,216, 84,139, 95,149,209,104,130, 82,149,105,183, 69,235,217,203,196,194, 20,
- 99, 52,104, 58,169,144,175,192, 33,158,205,202, 47,187, 55,225,112, 90,206,154, 53,171, 11, 73,146,228,213,171, 87,117,139, 23,
- 47,142, 79, 79, 79,239, 9, 32, 14, 0,178,178,178,218,110,222,188,249, 15, 27, 66, 57,148,132, 7, 70,163,177,217, 55,223,124,
- 51, 1, 64, 75, 0, 85, 10,185, 47, 22, 90,178,202, 27,193, 60, 45, 59, 59,251,195, 46, 93,186,156,162, 40,170,154,213,115,228,
- 2, 32,195,252, 92,176, 44,235,150,154,154,250,145, 45,132, 4, 65, 44,125, 91, 13,201,219,228,126,195,118,232,189, 88,201,120,
-230,204,153,217, 61,123,246,228,248,249,249,125,235,231,231, 71,102,101,101, 33, 47, 47, 15, 36, 73,194,195,195, 3,193,193,193,
-240,240,240, 96, 30, 62,124,184, 96,218,180,105,101,198,228,171, 93,187,118,128,209,104,172, 78,146,100, 0,128, 0,150,101, 3,
- 8,130, 8, 0,224, 4, 0,114,185, 92, 94,181,106, 85, 78,211,166, 77,209,164, 73, 19,156, 59,119, 14,123,246,236,217, 4,224,
-132,181, 53,171,168, 22,121, 23,240, 32, 20,108,157,219, 32,238, 55, 64, 27,130,193, 57,150, 68,219,224, 72, 75,156,189,162, 34,
-171,228,164,210,197,152,254, 58,181,111,223,222,242,192,217,208,169,196,148,245,240,165,167,167,119, 26, 62,124,248, 43,156, 52,
- 77,235, 50, 51, 51, 63,107,222,188,249,111, 20, 69, 9,138, 84,216,216,180,180,180,127, 53, 87, 95,209, 56, 90,157,186,244,202,
-120, 83, 78, 41,143,172,254,248,200,239, 72, 77,203,192,159,183, 82,178,114,245,116,219, 39, 25,249, 81,111,163,252,177,177,177,
-157,223,101,169,111, 53,141, 88, 20, 55,237, 73,189, 83, 92,245,178, 33, 32,105, 89, 57,234,136,194,112, 34, 21,242,144,167,164,
-164, 44,153, 49, 99,198,135, 11, 22, 44,112, 61,118,236,152,220,124,254,125,250,244, 73,139,138,138,106, 5, 64,160,213,106, 79,
- 47, 88,176,192,117,206,156, 57,206, 0,156, 1,160,107,215,174,169,169,169,169,171, 80,137, 82, 97, 52, 26, 19,130,107,215,122,
-101,228,104, 30, 0, 90,255,111, 50,153, 18,236,225, 43,142,199,122,159,166,233, 82,249, 40,138,250,170, 73,147, 38,212, 87, 95,
-125,149,122,236,216, 49,115, 34, 93,107,133,246,184,140,160,164,182, 64, 7, 96,113,225, 86,145, 80, 43,149,202,102,118,126,135,
-174,172,141,197, 14, 40,237,217,255, 79,112,224,192,129,153,253,251,247,223,236,228,228,180, 45, 32, 32,160,150,187,187,187, 92,
- 36, 18, 65,167,211,229,234,245,250, 71,143, 31, 63, 30, 52,115,230,204, 23, 54, 89, 56, 54,111,166, 0,240, 24,134, 17,146, 36,
- 41, 1, 32, 39, 8, 66, 97, 22, 90, 4, 65,192, 96, 48, 32, 38, 38, 6,223,125,247, 29,125,230,204,153,159, 0,252, 96, 71,223,
-209, 8,128,171, 85, 59,238, 10, 64,143,130, 0,182,233, 4, 65,220,120,219,215,139, 96,112,174,206,109, 16, 15, 66, 81, 92, 63,
- 81,122, 82,233,146, 30,184,244,244,244,102, 21,253, 16,151,196,153,158,158,238,247,174, 60, 33, 67,117,139,119, 96,237,226, 87,
-242, 28,154, 69, 88,113,251,101, 33, 71, 99, 26,191,226,196,253, 37, 58, 19,203, 24, 76,204,136, 39,233,249, 15,254,191,182, 62,
-165, 9,169, 55,204,107,249, 65, 69, 21,177, 2, 79, 55, 42, 58, 58,186,249,248,241,227,103,138,197,226,198, 0,144,159,159,127,
- 53, 41, 41,105, 46, 10, 87, 21,150,245,121, 37, 74, 70, 70, 70, 70,195,119,145, 79,175,215,127,217,188,121,243,229, 52, 77,255,
-108, 50,153, 46,254, 63,184, 21,218,202,218,248,254, 98,215,174, 93, 47, 0, 52, 3,128,190,125,251, 82, 0,176,103,207, 30,187,
-197,243,176, 97,195,104,150,101, 13,133,245, 65,141,130,213,133, 89,230, 54, 85,173, 86,103, 37, 37, 37, 61,164,105,250, 33,128,
- 63, 96,255,138, 91, 87,130, 32, 14,179, 44,219,173,176,191, 56,204,178,108, 55,235,247,222,182, 85,171,140, 67,202,118,134,175,
- 68, 1,246, 60, 0, 81,116, 42,176,172,253,178,240, 56, 85, 29, 1,160, 65,229,213,253,127,137,231, 73, 73, 73, 67,223,224,243,
- 74,188,127,136,211,235,245, 61,255, 31,157,111, 78,229, 45,255, 31,233,255,202, 33,176,204,120,248,240,225, 91,115, 17,248,175,
- 81,231,246,171, 3,240,162,251, 86, 8, 47, 78,120, 85, 10,173, 74, 84,162, 18,149,168,196,155, 32,187,242, 18, 84,226,127, 25,
-102,223, 44,243,126, 9, 62, 90, 69,253,179, 44,251, 4, 74, 94, 57, 96, 79, 86,242,242,172,146, 56, 93,201, 89,201, 89,201, 89,
-201, 89,201,249,159,115, 58, 2,168, 10, 96, 81, 25,199, 21, 93, 93,152, 10, 32, 3,128,177,242,122, 86,114,190,129,126,176, 9,
- 44,203,118, 45,109,234,144, 32,136, 35,111, 75,104, 89,156,225, 67, 49, 43,248, 54,102,153,247,203, 18, 90, 44,203,174,251, 55,
-132, 96,199, 74,206, 74,206, 74,206, 74,206, 74,206, 74,206, 74,206, 74,206, 55, 20, 90,237,166, 77,155, 54, 29, 5,161, 49,216,
-105,211,166, 77,103, 89,182,107,193, 71,108,215,183,249,219,247, 27,160,205,131, 80,176,230,237,126, 3,180, 41,225,208,112,171,
-237,213,240, 14,149,168, 68, 37, 42, 81,137, 74, 84,162, 18,239, 48, 46, 47, 92,184, 48,127,225,194,133,102,199,247,116, 0, 68,
-161,133, 43,253,109,254,112,225, 52,161, 45, 11,165, 74, 79,193,243, 31,192,139,228,240, 6,115,121,130,118, 96,153, 96, 0, 0,
- 73,221,167,245,218,191, 77, 38,195, 54, 0, 73,229, 37, 14, 2,106,215,112, 20, 29,212,209, 52, 47, 62, 87,223, 55,186, 32,205,
-129,221,232, 11,180, 16,240,249, 39, 5,142,142,162,226, 62,215,101,103,107,116,122,253,135,123,128, 75,149,207, 64, 37, 42, 81,
-137, 74, 84,226, 61,129, 68,161, 80,156, 33, 73,210,207,252,134,245,170,239,162, 43,192,105,154, 78, 86, 42,149, 31,162, 96,170,
-248,223,228,180,254,190, 30,229,236,203, 43, 26,182, 78, 29,194, 58,188,131, 85, 20,214, 50, 51,102,215,242,144,180,170, 21,224,
-183, 61, 41, 37,245,150, 74,171, 31,249, 56, 41, 79,105,111, 33, 41,174, 96,180,204,193,113,254, 39,195,191,116, 14,172, 89,139,
-240,245,245, 6, 88, 32, 46, 62,193,253,217,211, 39, 29,118,109, 89, 49, 89,149,163,252,206,168,211,253,110, 47,119,109, 64, 82,
- 69, 42,184,248,251,180, 79, 29, 57, 48, 97,224,188,237,199,137, 60,131,239,195,130,229,166,118,137, 44, 71,103,231, 19, 11, 79,
-159, 22, 41,234,215,127,229, 51,150,101, 11,242,235,221,189, 43,250,246,195, 15, 79,244, 85, 42, 59, 85,138,173,255, 73,120,200,
-229,242,137, 92, 46,183,173,193, 96,240,227,243,249,241, 52, 77, 71,100,101,101, 45, 3,144, 88,121,121, 42, 81,137, 50, 81, 90,
-126,205,255, 44,247, 38, 0, 72,165,210,155, 36, 73,250, 88,139, 0,115,206, 94,243,126,209, 87,134, 97, 94, 40,149,202,230,165,
-208, 6, 56, 57, 57,253, 6,160, 81, 89,225,106, 10, 99,179,221, 80, 42,149,159,161,228,213,122, 50,133, 66, 49,155, 32,136,126,
- 36, 73, 82,101,157, 19,195, 48, 52,203,178,187,179,178,178,126, 0,144, 91,210,113, 10,133,226,116,116,116,116, 35, 55, 55,183,
- 50,173, 52, 38,147, 9,113,113,113,174,141, 27, 55, 62,175, 84, 42,131,222, 38,167, 61, 90,228,191, 68, 41,171, 14, 75,172,232,
- 0, 94,201, 47, 68,148,126, 35, 49,120,227,252,207,188,147, 99,159,122,143, 89,176,163, 38,225, 76,183,125,148,169, 73,177,245,
- 7,121, 66,233,193,102,173, 59,181, 27, 55,225, 43,201,237,168, 71, 56,121,238, 10, 84,106, 29, 40,146,132,163, 76,140,154, 53,
-171, 19, 75,215,237,117,217,180,102,233,207, 87, 47,156,234,170, 85,231,244,176, 75,166,139, 57,223, 77,237,221, 88,226,236, 68,
- 3, 12,141,175,187,132, 72,190, 61,124,235, 59,228,155,166,219, 45,178,206,156, 17,167,165,166, 98,142,151, 23, 56, 38, 19,132,
- 36, 9, 33, 65, 64, 72,146,144, 8,133,232,188, 97, 3,230, 30, 59, 38,158,249,209, 71,149, 98,235,127, 12, 82,169,116,184,151,
-151,215,226,245,235,215, 59,251,251,251, 67, 34,145, 64,169, 84,186, 60,126,252, 56,116,210,164, 73, 67,147,147,147,103,168, 84,
-170,181,149, 87,170, 18,149, 40, 17,161, 0,110,161, 48,127,169, 29,159,149, 8,161, 80,152,170,213,106,221, 74, 59,134,207,231,
-167,233,245,122,247,178,184, 72,146,244, 73, 76, 76,116, 19,139,197,160,105,186, 48, 27, 0, 99, 25, 72, 91,103, 63, 41, 12, 84,
-139,160,160, 32, 67,105,156, 50,153,236,215,180,180,180,142,230, 60,129, 86,130,170, 88, 36, 38, 38,118,172, 83,167,206,175,185,
-185,185, 31,150, 32, 94,102, 79,152, 48, 97, 98,221,186,117,205, 86,160,194, 44, 8, 5,175, 25, 25, 25, 24, 63,126,188,229, 55,
- 24,134,193,169, 83,167, 38, 12, 31, 62, 28, 89, 89, 89,147, 74, 57,119, 63, 55, 55, 55,162, 48,161,120,137,152, 53,107, 22,102,
-205,154,133, 21, 43, 86, 16, 92, 46,215,177,140,235, 89, 33,156,182,106,145,255,194,130, 85, 70,100,248, 35,120, 53,188,195,145,
-215,132,150,173, 32, 89,230,232,188,101,235, 71,206, 25,214,146,216, 56,169, 99,224,216, 21,167,175,144, 60,182,245,195,100,109,
-188, 13,150,172, 17,141,154,119,108, 59,126,226, 84,201,142,191,206,226,241,195,187,136,190,184,243,149, 99, 26,126, 56, 28, 41,
- 25,185, 24, 62,238,107, 41, 65,113,218, 94, 56,125, 96,132, 81,167,217,104,163, 53,203,221, 79,192,255,162,105,227, 96,110,162,
-232, 49, 60, 20, 34,180,108, 80,131,235,123,226,222, 23,106,152,150, 63, 44, 88, 37, 99,151,200, 90,255,233,167,104,101, 52,194,
-141,162, 64, 17, 4, 40, 0, 36, 65, 64,171,211,225,198,224,193,104,188,117, 43,126, 56,116, 72, 60,187,123,119,187,196,150, 68,
- 34,185, 77, 16,132, 34, 47, 47,175, 43, 10, 18, 75,191, 15,168, 35,149, 74,143,176, 44,155,165, 86,171, 67,223,161,114,121,162,
- 96,142,190,232,232,152,135,130, 21, 85,118,101, 22, 22, 8, 4,163,251,246,237,187,116,213,170, 85,226,212,212, 84, 36, 37, 37,
-129,166,105, 8,133, 66, 4, 6, 6, 18,167, 79,159,118,158, 58,117,234,146, 35, 71,142, 8,114,115,115,151,219, 51,176,225,114,
-185,235,156,156,156, 62,114,119,119,151,164,165,165,229,103,103,103,159,210,233,116,163, 81,254,180, 41, 36,151,203, 29, 84,181,
-106,213, 94, 94, 94, 94,238,137,137,137, 25, 9, 9, 9, 7,117, 58,221, 38,148, 51, 81,179,213, 53,173,143,194,104,245, 0,146,
-171, 86,173,122, 63, 38, 38, 38,173, 2, 57,147,170, 86,173,250,160, 28,156, 18, 0,187, 0,120,149,113, 92, 18,128,254,176,211,
-154, 93,137,138, 19, 89,133,217, 30,138, 10,170,210, 62, 43, 21, 58,157,206,213, 96, 48,128, 91, 66,178,120,181, 90, 13,153, 76,
-230,106,107, 33, 69, 34, 17,118,238,220, 9, 46,151, 11, 46,151,139,172,172, 44,248,248,248, 88,246,121, 60,158,229,255, 42, 85,
-170,148,201, 71,211,116, 99,138,162,144,151,151, 7,154,166, 45, 91,118,118, 54, 88,150,133, 64, 32, 0, 77, 23,164,115,178,250,
-188,113, 73,124, 4, 65,244,243,242,242,194,142, 29, 59,160,215,235, 95,251, 92, 46,151, 35, 42,234,159, 36, 35, 20, 69,161, 73,
-147, 38, 36, 65, 16,253, 0, 76, 42,133,151, 5,128,240,240,112, 80, 20, 5,138,162, 64,146,164,229,127,243, 70,211, 52,102,205,
-154, 5, 91,178,118,188, 13,206,119, 13,101, 68,134, 79, 70, 9, 62, 90,100,105,164,181,220, 37,159, 77, 26,216, 49,255,187, 17,
- 93,216,233, 67, 62, 96,167, 14,108,195,126,212,186,222, 95, 20,135, 67, 92,123, 16, 7, 31, 7, 96,211,248, 70,126,190, 46,146,
-168, 96, 39,105,205, 98, 40,172,151,120,122,137, 37,242, 31, 63,251,242,107,233,145,243,247, 16, 23, 31,247,154,200, 2,128,155,
- 39, 55, 33, 57, 41, 17,183,162, 19, 48,104,196,231, 82,185,220,241,199, 34, 13,106,137,203, 70, 29,100,188,159,166,245,111, 41,
-204, 51, 38, 33, 87, 1, 80, 1,124,112,197,106, 76,237, 86, 95, 32,151,241, 74, 75, 85, 97,225, 20,240,249, 39, 23,158, 62,109,
- 17, 89, 45,116, 58, 8,104, 26, 38,154,182,136, 44,189,201, 4,141, 94, 15,207,188, 60, 60, 27, 62, 28,172,209,136, 25,251,247,
-139, 5,124,254, 73, 91,202, 9, 0, 60, 30,207,243,224,193,131, 85,234,213,171,119, 14,182, 7, 51, 61,253, 22,234,142,173,156,
- 13, 66, 66, 66, 34,182,110,221, 90,133,199,227,121, 86, 4,167, 80, 40,252, 88, 34,145,164, 11,133,194,143,203, 89, 78, 18,192,
-188,145, 35, 71, 70, 86,175, 94,253,108,161,176,178,136,154,234,213,171,159, 30, 57,114,228,109, 0,179, 74,168,235,197,113,122,
-123,121,121,205, 95,181,106,149,248,201,147, 39, 72, 76, 76,132,209,104,196,192,129, 3, 65,211, 52, 52, 26, 13,244,122, 61, 22,
- 45, 90, 36,113,118,118,254, 14, 5,137,130,109, 57,119,158,131,131,195,147, 45, 91,182,244,125,249,242,165,244,236,217,179, 68,
- 84, 84,148,100,201,146, 37, 61,157,157,157, 31, 3, 16,148,227,122,146,158,158,158, 27, 15, 28, 56,240, 89, 84, 84,148,207,190,
-125,251,184, 87,175, 94,245, 92,179,102,205, 40, 79, 79,207,173, 0,168,114,222,163, 80,177, 88,220, 97,202,148, 41,204,229,203,
-151, 19, 47, 95,190,156,184,116,233, 82,180,106,213,170,197,156, 57,115,194,202,201,217, 64, 38,147,181,159, 50,101, 10,115,225,
-194,133,164,107,215,174, 37, 44, 89,178,132,108,223,190,125,203,249,243,231,215,183,147,115,215,229,203,151,219,196,199,199,251,
- 39, 36, 36, 84, 75, 72, 72,168,154,144,144, 80, 53, 49, 49,209, 47, 57, 57,185, 74, 74, 74,138,111, 90, 90,154,111, 68, 68, 68,
- 75, 0,219,223,177,231,232,255, 3, 39,199, 44,164,148, 74, 37,142, 28, 57,130, 66,235, 85,168,181,200, 82,169, 84, 72, 78, 78,
- 54,127,198,177,165,156,114,185,252,204,250,245,235, 89,173, 86,139,156,156, 28,164,165,165, 33, 62, 62, 30,207,158, 61, 67,102,
-102, 38, 30, 61,122, 4,177, 88,124,198,150,114, 18, 4, 1,154,166, 45, 66,234,212,169, 83, 24, 57,114, 36,148, 74,165,229, 61,
- 14,135, 99,249,223,252,157,178, 56,205,150, 39,154,166,113,237,218, 53,140, 25, 51, 6, 75,151, 46,197,246,237,219,113,248,240,
- 97, 40,149, 74,139,216, 50,153, 76,101,114,102,100,100,128, 97,108, 27, 51,177, 44,139,156,156, 28,155,239,187,181, 0,226,112,
- 56,175,137, 34,243,102, 79, 93,122, 67,206,119, 22, 54, 68,134, 47,121,132,109,254,167,208, 84,215,246, 21,161, 85,213,227,187,
-197, 19,251,137, 64, 27,192, 26, 53,128, 33, 31, 48,228,129,209,231,131,224,137, 0,163, 6,174, 2, 37,118,141,171, 37,255,102,
-199,243,135,244, 35,162,107,116, 70,238,241, 98,123, 4, 14,111, 80,191, 97, 19,156, 19,210, 84, 72, 76,205, 1, 69,254,211,239,
-133,117, 28, 6, 14, 69,226,250,137, 2,195, 21, 73, 81,200, 81,235,144,157,103, 64,223, 97, 19,157,126, 95,250,253, 32,147, 65,
- 91,106,140,151,186, 64, 96,176, 84,218,187, 78,157, 42,228, 67, 65, 52,194, 62,186, 8,154, 1,216, 11,221, 17,154,229, 70, 5,
-157,228,247, 86,231, 26,230, 71, 1, 79, 74,181,102, 56, 58,138, 20,245,235, 99,142,151, 23, 90, 27,141,224,177, 44, 62, 72, 77,
-197,221,137, 19,161,219,187, 23, 36, 0,222,199, 31,163,221,178,101, 56,239,229, 5, 15,141, 6,217,147, 39,195,245,248,113,240,
-228,114, 17,210,109, 91,252, 64, 16, 4,218,182,109,139,211,167, 79, 59,119,238,220,249,196,189,123,247,250,152, 76,166,243,229,
-185,137, 14, 14, 14, 55, 57, 28,142, 79, 89,199,153, 76,166,132,156,156, 28,187,211,140,112, 56,156,214, 77,154, 52,217,191,111,
-223, 62,133,193, 96,168,144, 81, 8,159,207,239,220,179,103,207,245,171, 87,175,150,143, 26, 53,106,253,225,195,135,243,245,122,
-253,113,123, 44, 57, 0,230,173, 93,187,118,108,120,120,184,227,168, 81,163,216,103,207,158, 89, 91,175, 92, 91,181,106, 85,125,
-253,250,245, 30,141, 26, 53,154, 48,102,204, 24, 30,128, 25,101, 89,121,164, 82,233,184,245,235,215,187,100,100,100, 32, 47, 47,
-207,210,200, 38, 36, 36, 64, 36, 18,129, 36, 73,144, 36, 9, 46,151,139, 31,127,252,209,121,220,184,113, 19,149, 74,229, 68, 27,
-172,100,235,126,251,237, 55,215, 15, 63,252,144,124,249,242, 37, 72,146,132, 80, 40,196,167,159,126, 74,106, 52, 26,197,156, 57,
-115, 54,171,213,234, 1,246, 92, 67, 46,151, 59,104,221,186,117, 53, 91,180,104,193,137,142,142, 70,179,102,205,112,253,250,117,
-124,252,241,199,220,220,220,220,106, 83,167, 78, 29,169,211,233,236,141,227,226, 41, 22,139,235,254,253,247,223,241,190,190,190,
-150,134,165, 90,181,106,116,215,174, 93,149,209,209,209,181, 46, 95,190,156,217,188,121,115,123, 18,150,123,139,197,226,160,163,
- 71,143, 38,207,153, 51,167,195,218,181,107,123, 2, 64,227,198,141, 15,206,157, 59,247,172, 82,169, 12, 62,127,254,188,178,117,
-235,214, 9, 54,242,121,121,122,122,210,227,199,143,151,150,118,208,134, 13, 27,178, 81,144,112,217, 31,192, 11, 84,226,223,130,
- 9, 64, 24, 65, 16,183,142, 28, 57,130, 38, 77,154,224,200,145, 35,232,218,181,235, 45,107, 49, 16, 21, 21,133,214,173, 91,163,
-208,162,101,147,175, 86, 78, 78,206,180, 89,179,102, 93, 24, 52,104,144,248,149,198,128, 36,225,232,232,136, 46, 93,186,104,213,
-106,245, 52, 91, 11, 74,211, 52, 56, 28, 14, 18, 18, 18,176, 97,195, 6, 44, 88,176, 0,129,129,129, 48, 26,141,175,137,173,194,
-118,207,166,198,207,100, 50,225,198,141, 27,216,182,117, 43,102,124,247, 29,100, 50, 25, 0,192, 96, 48, 64,153,149, 5,161, 80,
-104, 17, 99,101, 8,167,221, 79,159, 62,157,232,227,227,243,202,148,161,249,181,176,205, 2,195, 48, 48,153, 76,208,106,181, 88,
-186,116,169,137,101,217,221,101,245, 63,102, 81, 52,113,226, 68,232,116,255, 24,212,235, 23,250, 36, 87,173, 90, 21, 33, 33, 33,
-150,125,146, 36, 89, 91, 57,127,111, 94, 23, 26,171,163,107,205, 90, 2, 0,240,241,241, 65,173, 90,181,224,233,233, 89, 34,103,
-113, 90,228,191,134, 29,145,225, 75, 22, 90, 37,101,202,126,248, 50,101,209,168,169, 75,150, 72,132, 20,247,203, 94,245, 80,197,
-145, 7,136,156,192,107,253, 13, 8,199,130,129, 60,171,124, 1,156,252, 6, 63,247, 86,146,225,127,104,255, 50,208, 10,215,231,
- 89, 89,175, 57,225,113,121,194,118, 1, 53,106, 18,113,201, 74,112, 56, 28, 72, 28, 92,208,188,215, 36, 80, 20, 9,169,163, 11,
- 8, 90,243,143, 34, 38, 41,112, 40, 14,148,185, 26, 84,245,175, 65, 10,132,162,118,234, 50,132,150,220,129,251,219,148, 1,205,
-133,153,166, 4,136,170, 8, 65,155,187, 83, 47, 62, 72,231, 92,124,213, 57, 80, 20,126,240,222,111,200, 49,182,183,229,194, 80,
- 38, 19,220, 40, 10, 6,150,197,221,137, 19, 17,182,110, 29,110,153,133,225,186,117,184, 21, 30, 14, 39, 46, 23, 2,146, 4,107,
- 52,190, 54,167,111,139,208, 2,128,248,248,120,236,221,187,215,169, 95,191,126,251,163,162,162, 6,217, 41, 54,204, 92, 46,215,
-174, 93,115,243,247,247, 47,241,152, 23, 47, 94,160, 97,195,134,118, 79, 79,241,249,252,206,237,219,183,223,177,119,239, 94,135,
- 7, 15, 30,192,205,205,237,141,133,150, 64, 32,104,221,177, 99,199, 29, 91,182,108,145,167,167,167, 99,221,186,117,242,238,221,
-187,111,143,140,140,236,165,211,233,108, 17,155,175,136,172,117,235,214,101,111,216,176,225,119,188, 58, 69,152,188, 97,195,134,
-141,141, 26, 53,250, 44, 60, 60,220, 17,192,216, 66,223,129, 82,197,150, 64, 32,104, 27, 16, 16,240,202,168, 86, 32, 40, 48, 54,
- 73, 36, 18, 56, 56, 56,128,199,227, 65,167,211, 33, 44, 44,140,224,243,249, 45,109, 57,103,153, 76,214,177,119,239,222,228,197,
-139, 23,145,146,146, 2, 71, 71, 71, 72,165, 82,208, 52,141, 81,163, 70, 81, 75,151, 46,109,171, 86,219, 55,195,229,235,235,219,
-179, 67,135, 14,156,251,247,239,227,229,203,151,208,233,116,120,252,248, 49,228,114, 57,134, 12, 25,194, 91,188,120,113,247,196,
-196, 68,123,133, 86,221,240,240,240, 84,107,145,101,134, 68, 34, 33,106,214,172,169,116,118,118,110, 0,192, 30,161, 85,247,243,
-207, 63, 79, 91,184,112, 97,235,211,167, 79, 91,130, 94,158, 62,125,122, 42, 0, 44, 95,190,252,130,171,171,107, 3, 0,182, 10,
- 45,176, 44,203,124,242,201, 39,177,124, 62, 31, 92, 46, 23,124, 62,255,149,141,199,227,129, 36, 73,153,249,113,254, 31, 22, 53,
-141, 0,252,130,130,228,186,223, 1,184,246,142,148,235, 54,128,176,174, 93,187, 90,196,214,177, 99,199,208,185,115,103,100,103,
-103,227,254,253,251,214, 34,203,158, 4,203,183,141, 70,227,157,157, 59,119, 54,239,215,175, 31, 97,245,124,225,193,131, 7,120,
-244,232,209, 45, 91,249, 72,146, 4,195, 48,224,114,185, 88,178,100, 9, 12, 6, 3,254,248,227, 15,236,217,179, 7, 36, 73,130,
- 32, 8, 16, 4, 1,185, 92,142, 21, 43, 86,216,213,238,209, 52,141,205,155, 55,227,155,169, 83, 45, 34,171,112, 38, 3, 30,238,
-238,112,118,113,193,243,231,207,203, 20, 90, 89, 89, 89, 63, 28, 58,116, 8,165, 57,195, 31, 58,116,200,242,127, 17,103,248,178,
-251, 57,138,130, 78,167,195, 7, 31,252,147, 42,246,243,207, 63,183,252,175, 84, 42, 65, 81,148,249, 90, 16,182,114,106, 88,160,
-151,240,159,247,186,124,245,213, 43, 22,186,146, 56, 75,210, 34,239,162,117,171, 24,177, 21, 86,104,157,245, 4,208, 21, 5, 62,
- 90,201, 64, 25, 62, 90, 79,210,212,171, 56, 68,114,200,194,241, 31, 14,171,226,230, 0, 54, 47, 21,188,246, 63,224, 78,186, 8,
- 75,150, 30, 5, 0,124,253,105, 67,212,239, 56, 15,250, 77, 31, 98, 98, 51,138, 63, 56, 65, 55, 5,192,204,215, 27, 70, 38,200,
-199,219, 11,119,158, 69,129, 67, 81,224, 59,184,192,193,201, 29,140, 73,143,156,180,151, 56,183,239, 87, 0,192,218,205,187, 65,
-146, 36, 56, 28, 10, 58, 61,141,192, 42, 94, 96, 24, 38,168,180,114,214, 6,154,183,117,119,105,226,235,231, 72,220, 87,188, 68,
- 77, 55,231, 34, 19, 33, 2, 4, 38, 73,137,102, 82, 81,227,172, 28, 85,243,135,192,229, 50,197, 0, 73,130, 36, 8,136,121, 60,
-232,246,238, 45,240,218, 92, 87,208,103,221, 10, 15, 7,249,215, 95,144, 9, 4,160, 8, 2,156, 66, 19,116,121,160, 82,169, 64,
- 16, 4,182,109,219,166, 24, 50,100,200,246,251,247,239,135,107,181,218,189,246,112,100,103,103,119,109,209,162,197,217,205,155,
- 55,187,122,120,120,188,246,121, 74, 74, 10,134, 13, 27,150,158,157,157,109, 87, 80, 55,161, 80,248,113,207,158, 61,215,111,218,
-180, 73,254,244,233, 83,228,229,229,193,213,213,245, 77,235,104,131,166, 77,155,238,223,187,119,175, 67, 74, 74, 10,114,114,114,
-160,211,233,176,109,219, 54,199, 46, 93,186,236,141,142,142,238, 12, 32,178, 12,142,153,214, 34,107,204,152, 49,247, 0,184, 1,
-248,173,168, 6, 45,252,172,158,149,216,202, 1,176,184,148,145,168,159, 68, 34, 65, 90, 90, 26,134, 13, 27,134, 39, 79,254, 49,
-128,122,121,121, 89, 70,122,207,159, 63,135,171,171, 43, 8,130,112,179,229,164, 93, 93, 93,165,122,189, 30, 35, 71,142, 68,124,
-124,252, 43,156, 9, 9, 9, 32, 8, 66,108,239,133,116,119,119,119,215,104, 52,104,213,170, 21,180,218,130,188,190,253,251,247,
- 7,151,203, 69, 90, 90, 26,184, 92,174, 75, 57,238,143, 75,215,174, 93, 75, 12,173, 34,151,203, 13, 10,133,162,182,157,156,206,
-221,187,119, 79, 92,183,110,221,107, 11, 91,174, 95,191,222,195,201,201,233,180,147,147, 83, 77, 59, 57, 25,107, 81,197,227,241,
- 94, 17, 90, 92, 46, 23, 36, 73, 50,248,223,199, 79, 0,204,171,224, 86, 3, 8,121,135,202,102, 17, 91,199,142, 29, 67,112,112,
- 48,178,178,178, 16, 29, 29, 93, 94,145,101,110,239,190,153, 61,123,246,201, 62,125,250, 72,204,131, 86,145, 72,132,201,147, 39,
-107,242,242,242,190,177,171, 18, 49, 12, 56, 28,142,101,144, 44, 20, 10, 17, 22, 22,102, 17, 89, 4, 65, 32, 63, 63, 31, 28, 14,
-199,188, 34,145,176,177,140,240,244,240,128, 76, 38, 67,141,192, 64, 60, 45,108, 71,204,255, 11, 4, 2, 16, 4, 1,147,169, 76,
- 67, 94,110,161, 83,251,164, 10,190, 55,172, 89, 20,149,106, 58,246,242, 2,195, 48,102,145,201, 86, 4,167,139,139, 11,242,242,
-242,108,229,124, 39, 81,130, 69,203, 44,180,186,162,192, 87,235,181,240, 14,109, 0,156,195,171, 75, 42,201,218,238,210, 13, 11,
-199,117, 24,246, 97,176, 11, 52,233, 47, 33,148,185,128,112,172,138, 37, 75,143,226,254,139, 76, 0,192,146,237, 55,177, 99, 78,
- 23, 64,228,132, 90, 14, 25,240,144,113,122, 63, 74,123, 93,104, 17, 96, 9,134,101,193,161,200,194,185, 91, 10, 20, 69, 66,153,
-158,140,101, 63,140, 45, 20, 89,123,112,228, 66, 52,124, 2,130,255,153,199, 37, 8,128, 45,189,114,187, 58,240,214,141,235,211,
- 84,148, 74, 36,195,209, 75, 12,161,176,136,126, 84,240, 64, 84, 37, 49,190,173,143,248,198, 33,237,186,135, 57,134, 50, 59, 10,
- 33, 73, 22, 56,191, 19, 68,177,206, 61,100,225,103, 20, 65, 20, 68,127,101,236,107,211,205, 66, 94, 36, 18,193, 96, 48,128,162,
- 40,172, 92,185,210,177, 99,199,142,191,217, 43,180, 0, 60, 72, 77, 77,237, 50,106,212,168, 99,187,119,239,118,113,113,113,121,
-101,244, 48,106,212,168,140,212,212,212, 46,176,211,233,158,203,229,254,182,122,245,106,121, 76, 76, 12,242,243,243, 33, 18,137,
- 44,141, 79,121,235,103,227,198,141, 79, 28, 63,126, 92,145,147,147, 3,131,193, 0,145, 72, 4,150,101, 65, 81, 20,254,252,243,
- 79,231,110,221,186, 29,141,139,139,107, 95, 90, 89, 69, 34, 81,175, 66,225,132,240,240,112,199,240,240,240, 54, 64,137,145,122,
- 45, 8, 15, 15,119,156, 52,105, 82,119,141, 70,179,184,148,115,142, 87, 42,149, 30, 34,145, 8,251,246,237,131, 84, 42,133, 88,
- 44,134,151,151, 23,148, 74, 37,196, 98, 49, 88,150,133,209,104, 52, 55, 22,153,182,156,120,122,122,122,158,201,100,114, 56,118,
-236, 24, 50, 51,255,249, 74,149, 42, 85,144,157,157, 13,134, 97,242,237,189,152, 73, 73, 73,169, 4, 65,248,222,185,115, 7, 49,
- 49, 49,232,220,185, 51,254,250,235, 47, 52,108, 88, 48, 59,172,215,235,203, 19,196,143,166, 40,138, 45,165,222, 18, 0, 20, 21,
-201, 89,216,121,217,197,201, 48, 12, 99, 22, 89,214,175,214,226,171,140,223,252, 95,129,131,245, 56,225, 93, 45,100,231,206,157,
-161, 84, 42, 33,149, 74, 43,194, 63,231,138, 70,163,121,124,224,192,129, 6, 93,187,118, 5,159,207,199,227,199,143, 17, 25, 25,
- 25, 13,224,138,189, 66,139,203,229, 98,246,236,217, 24, 59,118, 44,220,221,221,241,205, 55,223,128,195,225, 88, 54,130, 32, 44,
- 22, 46,123,224,230, 94,250,194, 71,179, 67,124, 89,198,112, 7, 7,135,217, 36, 73,246,163,108,184,112, 52, 77,211, 12,195,236,
-206,201,201, 41, 53,188,131,217,113,221,150,123, 97,125, 13,202,232,211,222,152,179, 4, 45,242,159,163,232,106,195, 18, 44, 90,
-230, 85,135,175,165, 2, 50,159,229,185, 66,147,221, 57,107,145,245,227,216,118,195, 62, 12, 86,224,224,153,107,224, 25,178, 1,
-125,110, 41,119,216, 8,130, 39,129,187, 3,183, 88, 95, 33,130,164, 30, 37, 36, 38,193, 89, 33, 45, 20, 89,133, 27, 73,162,126,
-112,193, 96,246,200,133,104,248,248, 7,131, 67, 81,224, 80, 20,164, 34, 1, 82, 83,146,193,225,144,143, 74,250,217,186, 20,250,
-244,169,233, 91, 85,225,204, 69,134,171, 30,158,238, 37, 24, 6, 26,200,224,227,201, 71, 39,103,161, 95, 93, 10,125, 74,149,229,
- 44,107, 17, 90, 6,147, 9,188,143, 63,182, 76, 23,222, 10, 15, 71,216,186,117,160,123,246,132,218, 96,120,197, 84, 92, 94,161,
- 37, 18,137,144,155,155,139, 65,131, 6, 41,141, 70,227,103,229,172, 11,145,153,153,153,125, 7, 15, 30,156,105, 22, 48, 6,131,
- 1,131, 7, 15,206,204,204,204,236,107,131,149,232, 53, 24,141,198,207, 26, 54,108,168,204,200,200,176,148,179, 60, 13,142, 25,
- 78, 78, 78, 71, 54,108,216,224,164,211,233, 96, 50,153, 44,156, 34,145, 8, 20, 69,193,213,213, 21, 59,118,236,112,117,114,114,
- 42, 53,103,149, 70,163, 57,176,110,221,186,108, 0, 88,183,110, 93, 54, 65, 16, 17, 4, 65,172, 33, 8, 98,117,145,109, 13, 65,
- 16, 17,214,199,106, 52,154,253,165,113,235,245,250,136,232,232,104, 86, 44, 22,131,162, 40, 24, 12, 6, 8,133, 66,139, 73, 92,
-165, 82, 65,163, 41,152,230,142,140,140,132,209,104,188,104,203,185,231,230,230,158,217,188,121, 51, 83,165, 74, 21, 4, 7, 7,
- 35, 44, 44, 12, 77,155, 54,133,159,159, 31,230,206,157, 75,171,213,234,115,229, 16, 90, 71,118,237,218,101,244,245,245, 69,131,
- 6, 13, 32, 16, 8, 80,191,126,125,120,121,121, 97,193,130, 5,250,156,156,156, 99,229,184, 77,113, 81, 81, 81, 84, 41, 34, 87,
- 14, 27, 86,239, 22, 65,252,141, 27, 55,168,166, 77,155, 30, 44,250, 65,227,198,141, 15, 74,165, 82, 7,179,137,221,158, 17,185,
-181,184, 18, 8, 4,150,205,252, 62,135,195,249,255, 96,209,154, 8,224, 30, 10,226, 48,125,243,142,149,205,226,248,158,153,153,
-137,232,232,104, 68, 70, 70,162,105,211,166,184,120,241, 34,240,143,131,188,221,200,201,201,249,102,206,156, 57,106,243, 74,190,
-239,190,251, 78,147,155,155,251,141,189,109, 48,203,178,224,114,185,168, 85,171, 22, 38, 77,154,132,163, 71,143,226,241,227,199,
- 48, 26,141, 22, 33,100,246,201,180,199,162,197,227,241,224,238,238, 14,163,209,104,177,102, 1,192,211, 39, 79,192,225,112,192,
- 48, 12,244,122,125,153, 22, 45, 7, 7,135,217,235,215,175,159,144,145,145,225,153,158,158,238,102,189,165,166,166,186, 37, 39,
- 39,187, 37, 38, 38,186,197,199,199,187,197,198,198,186,189,124,249,210,115,209,162, 69, 19, 28, 28, 28,102,219, 82, 78,138,162,
- 80,191,126,125,124,254,249,231,150,109,213,170, 85,150,237,220,185,115,118, 59,175, 83, 20,133, 90,179,150,160, 75, 58,107,217,
-142,186, 18,150,237,254,215, 99, 74,227, 44,170, 69,222, 9,152, 87, 27, 90, 39,150, 46, 6,230, 85,135,230,182,204,226,182, 81,
-212, 25, 30, 0, 16,228, 33,158,247,227,232,214,195, 62,168,237,128, 3,103,110, 98,206,254, 23,143, 2,135,185,214,170,174, 72,
- 7,147, 30,141,175, 63,109,136, 37,219,111, 2, 40,152, 58,100,210,238,131,205,122, 14, 86,230,139,151,202,140, 98,167, 29, 76,
-122,237,217, 23,207,158,180,171, 85,183, 17,153,146,145,247,202,242,207,176,182,125, 65, 16, 4,188,253,131, 65,113, 56,160, 40,
- 18, 28,138,130,163, 92,136,232, 59,119, 24,157, 70,115,182, 56,206, 54, 0,135, 47,226,175,250,180, 83,125, 97, 18, 63, 13,174,
-158, 18,240,184, 5,218,145,125,209,183, 72, 15,193, 1,234,202, 48, 60,209, 89,116, 54, 85,187, 74,161, 54, 28,140, 40, 97, 4,
-200, 48, 12,164, 2, 1,180, 58, 29, 52, 38, 19,218, 46, 91,102,153, 46, 36, 9, 2,183, 1,212, 91,182, 12,151,247,238,133,156,
-207, 7, 4, 2,155, 87,133, 20, 39,180, 50, 50, 50, 48,116,232,208,204,228,228,228, 33,229,241,209, 50, 67,167,211,157, 79, 73,
- 73, 25,210,183,111,223,109,251,246,237,115,234,219,183,175, 50, 37, 37,101,136,141,126, 79,175, 65,171,213,238,141,143,143,207,
- 31, 58,116,232,214,237,219,183, 59,187,184,184, 88, 70, 34,229,170,172, 4,145,209,161, 67, 7,129, 45,199,149,113,200,156, 66,
-231,246,177,133,150,173,122, 99,198,140,185,140, 2,255, 43,107,204, 90,187,118,109,127,171, 41,198, 53, 0,150,149, 70,172, 82,
-169, 86, 79,154, 52,105,196,249,243,231, 93,132, 66, 33, 8,130, 0,143,199, 67,141, 26, 53, 44,171,104,184, 92, 46, 88,150,197,
- 87, 95,125,149,145,150,150,182,220,198,123, 51,102,206,156, 57,173,181, 90,173, 98,232,208,161,148, 80, 40, 68,106,106, 42,150,
- 46, 93, 74,111,218,180, 41, 91,173, 86, 15, 43,135, 16,222,252,253,247,223,183,205,203,203,243, 31, 53,106, 20, 47, 39, 39, 7,
- 26,141, 6, 83,166, 76,209,111,220,184, 49, 65,163,209,216, 29,240,183, 89,179,102,207, 98, 99, 99, 91,230,231,231,103,137,197,
-226,162,214, 62, 66, 34,145, 52, 2,176,213, 30,206,176,176,176,231,113,113,113, 77,231,205,155, 23, 97, 52, 26,185,215,175, 95,
-239,105, 22, 89, 43, 87,174, 60, 39, 20, 10, 59,160,132,101,209,165,212, 17, 70, 32, 16,188, 98,193, 42,250, 63,135,195,249,255,
- 96,209, 58,135,130,144, 25,239, 26, 94, 17, 89,247,239,223, 71,187,118,237, 0, 0, 23, 47, 94, 68,139, 22, 45,112,241,226, 69,
-180,108,217,210,238, 88, 90,133,248, 91,165, 82,197,158, 59,119,174,142,175,175, 47,174, 92,185,242, 18,192,223,246, 22,210, 44,
-180, 56, 28, 14, 6, 14, 28,136,142, 29, 59,162, 74,149, 42,175,172, 54, 52,255,111,143,216, 48,153, 76,168, 91,183, 46,116,122,
- 61,120, 60,158,101,106,146,195,225,192,213,205, 13,207,158, 61,179,201,162, 69,146,100,191, 94,189,122,145, 15, 30, 60,192,128,
- 1, 3,176,109,219,182, 18,143, 29, 60,120, 48,118,238,220,137, 94,189,122,145,211,167, 79, 47, 53,188,131,217, 9,221,150,115,
- 50,247,211,101,181,251, 21,197,105,173, 69,222, 53, 88,133,118, 40, 14,225,197,188,183,238, 21,161,101, 21, 36, 12,254,174,226,
-225, 29,107,112,112,224,236, 77,204, 57, 16,183,153,102,217,125,251,110,101, 29,254,166, 5, 96,216,253, 41,234,247,221, 90, 48,
- 93, 8,128, 73,187, 15,195,238,193, 32,196, 46,184,144,200, 69,142,198,112,164,248,138,103,216,246,215, 31,191, 78,106,250, 91,
- 75, 87, 79, 55, 7, 40,115, 52, 22,177,117,235,220, 30, 0, 64,159, 49,243,193,161, 10,166, 20,229, 82, 33, 68, 60, 10,123,183,
- 44,207, 48, 24,180,197,214,174, 92, 46, 57,118,122,243, 26, 14,124,137, 17, 42, 15, 22,193,174,255,100,202, 33,252,247,188, 46,
-184, 66, 21,112,185,159,133, 79,171, 75,229,203, 31,100,143,133,145, 89,245, 90,135,152,157,173,201,190,115, 71,212,121,253,122,
- 92, 31, 50, 4,222, 52,141, 8, 47, 47, 56,113,185,112, 16, 8, 64, 18, 4, 52,135, 15,227,242,190,125,112, 23, 8, 0,153, 12,
-166,185,115,161,139,142,134, 49, 55, 87, 83,142,145, 25,250,247,239,159,145,145,145,209, 87,175,215,159,127,211,138,160,209,104,
-142,199,199,199,143,109,214,172,217,111, 70,163,241, 51,141, 70,115,252, 77,248,244,122,253,241,148,148,148,143,251,247,239,191,
-103,255,254,253, 46,142,142,142,229,230,202,204,204,108, 88, 65,245,157, 1, 48,163,208,185,125,108,120,120,184,227,141, 27, 55,
- 70,108,216,176,225, 55,171,209,132,219,200,145, 35, 71, 23, 17, 89,101,174, 58, 4, 16,151,150,150, 54,119,242,228,201,243,127,
-254,249,103,169,217,241,253,238,221,187, 48,153, 76,224,114,185,160,105, 26, 35, 71,142,204,203,204,204, 92,130,146, 35, 58,191,
- 86,181, 84, 42, 85,141,121,243,230,109, 88,182,108, 89, 71,138,162, 36, 52, 77,171,243,243,243, 35,180, 90,237, 48,148, 47,142,
- 22,147,158,158, 62,116,230,204,153, 67,151, 46, 93,218,139, 36, 73, 55,147,201,148,145,155,155,123, 72,163,209,108, 68, 57,166,
-146,174, 92,185,146,254,233,167,159,190, 72, 79, 79, 15,242,241,241,201,145, 74,165,122,189, 94, 79,137, 68, 34,185, 68, 34, 9,
- 3,112,133, 32,136,135,246,112,222,186,117, 43,101,212,168, 81, 49, 58,157,174,214,154, 53,107, 46,200,229,242, 51, 4, 65, 16,
- 60, 30, 79, 33, 18,137,218, 1,136, 32, 8,226,169, 61,156, 36, 73, 50,214,214,171,162,254, 89,124, 62,255,255,139,143,214,187,
- 8, 75,120,135,140,140, 12, 60,120,240,192, 44,178,194, 0,160,101,203,150,183,204, 98, 43, 50, 50, 18, 13, 26, 52,184, 5,128,
-107,111,125, 85,169, 84,147, 7, 13, 26,116,188,112,112, 60,185, 28, 3, 63,139,208, 50, 11,170, 42, 85,170, 88,246,173, 55, 43,
- 31, 45,155, 64,211, 52,120, 60, 30, 56, 28, 14, 60,189,188, 44,191,197,178, 44,158, 61,123, 6,165, 82,105,147,208,162, 40,138,
- 34, 8, 2, 3, 6,216,182, 32,249,147, 79, 62, 65, 68, 68, 4, 40, 27, 85, 33, 69, 81,168, 90,181,106,153,199,152,117,169,173,
-156, 62, 62, 62,229,230,180,214, 34,239,146,192, 42,238,255,226, 68, 85, 73, 15,196,107,120,158,166,153, 55,248,151, 75,211, 31,
-166,104,247, 69,167,230, 79, 2,192,238,190, 47, 62, 89,223,149,250,240,195,154, 9,208,173,107, 9, 66, 94, 16,188,141,205, 75,
- 6, 33,113, 71, 2,227,141, 89, 7, 31,165,152, 64,148,228,255,146,148,151,151, 51, 99,203,250,149, 63,143, 28,247,149,244,254,
-243, 84,228,228,233, 64, 81,164,117,227, 9, 14,135,130, 92, 34,132,175,135, 3,182,255,254, 75,110,174, 42,123, 38, 74,200,123,
- 88, 69,198, 27,211,161, 81,117, 1,207, 83,141, 90,245,250,131, 18,254, 35, 2,216,148, 18,102, 7, 91,156,196, 71,113,106,225,
- 95,113,234, 49,183,179,244,175, 11, 45,189,254,195,239, 58,117, 58, 49,231,232, 81,113,227,205,155,241,124,228, 72,120,105, 52,
- 16, 20, 78, 37,146, 4, 1, 41,143, 7, 41,143, 87, 32,178,150, 46,133,198,100,194,178, 33, 67,242,117,122,125, 39,123, 30,242,
-204,204, 76,244,236,217, 51, 61, 41, 41,169, 11,202, 49,181, 87, 18,212,106,245, 94, 0,123, 43,138, 79,167,211,157, 79, 72, 72,
-248,168,103,207,158, 71,143, 31, 63,238,250,142, 4,153, 51,139, 45,195,141, 27, 55, 70, 95,184,112,225, 57, 94, 77, 44,154,125,
-225,194,133,231,163, 70,141, 34, 54,108,216,176, 17,192,247,176, 49,128,167, 90,173, 94,121,234,212, 41,180,110,221,250,251,133,
- 11, 23, 58, 55,108,216, 16,110,110,110,200,205,205, 69,100,100, 36, 38, 78,156,168, 84,169, 84, 11,179,179,179,127,182,179,204,
- 6,157, 78, 55,216,122, 41,117, 69, 92, 7,157, 78,183, 41, 57, 57,121, 83, 69, 17,142, 31, 63,254,238,179,103,207, 50, 93, 93,
- 93,155,240,120,188,122, 40,240, 3, 74, 1,176,209, 94, 65,100,198,184,113,227,238, 60,123,246, 44,195,219,219,187,105, 33,167,
- 35, 10,210, 24,173, 47, 7,103,210,205,155, 55,125, 26, 53,106, 68,114,185, 92,150,162, 40,112,185, 92,150,195,225,176,133,126,
- 53, 44, 0, 28, 58,116, 72, 0, 64,137, 74,252,219,176,132,119, 72, 78, 78,182, 22, 89,102,171, 85, 88,203,150, 45,111, 21,138,
- 44,243,103,229,241, 47, 59,205, 48,204, 27,229,235,101, 89, 22,115,230,204,193,218,181,107, 81, 86, 68,243,194,213,125, 68, 89,
-124,102,139, 22, 77,211, 48, 24, 12,184,127,255,190, 37,102,151,121,186,208, 28,218,193,100, 50,149,186, 90,157,166,105, 90,175,
-215,227,207, 63,255,180, 73,108,237,216,177, 3, 90,173, 22,116, 25, 10,206, 58, 20, 67, 72, 72, 8,148, 74,165,101,177, 79, 88,
-216, 63,161,242, 12, 6,131, 93,194,213,204, 89,171, 86, 45,100,100,100,192,236, 47,236, 59,228, 31, 99,143, 73,253, 63, 27, 63,
-184, 68,139,150,205, 61,102,125, 7, 7, 7, 29,223,184,191, 71,176,160,109,191, 48, 7,248,123,200,192,229, 9,145,164, 50,225,
-244, 67, 21,214,159, 75,137,215, 24,233,110, 79,210,243,163, 74,227, 17,136,229,199, 27, 54,239,216, 98,200,232,137,146, 60, 29,
-141,152,152, 88,164,167, 37,131, 36, 72,120,122,251,192,207,175, 42, 68,124, 18,219,214,253,172,190,117,249,204,165,188,220,172,
-206, 37,113,117,117,224, 93, 94,250,113,139,166, 1, 1, 50, 2, 38, 35, 64, 27, 1,147, 17, 96, 10, 95,205,239, 49,175,214,185,
- 7, 15,178,217,233,183,149, 87,143,228, 24,138,205, 89,213, 23,104,225,232,228,116, 98,214,161, 67, 98,198, 96, 64,230,228,201,
- 16,155, 76, 16, 22,142, 74, 10, 78, 68, 0,211,220,185, 5, 34,107,240,224,252,156,236,108,187, 82,240,184,184,184,220, 36, 8,
-194, 37, 61, 61,253,189,138, 12,239,234,234,122,132,101,217,140,140,140,140,134,239, 80,185,220, 0,100, 3, 48, 20, 51,144,112,
-133,253,254, 63,102, 84,117,117,117,157, 78,146,100, 51,150,101,157, 73,146,204, 98, 24,230, 74, 90, 90,218, 34, 0,207, 42,251,
-211,255, 12,230,200,240,213,202, 56, 46, 13,192,151, 40,112, 10,142,169,188,108,255, 58, 42, 60, 5, 79, 69,194,201,201,233,218,
-137, 19, 39, 26,250,251,251,147,214, 14,239,230, 88,121,230,233, 45, 14,167, 64,203,157, 63,127,222, 52, 96,192,128, 43,169,169,
-169,173, 75,226,148,201,100, 39,239,221,187,247, 65, 78, 78,206,107,130,202, 58, 82,188,121, 95,173, 86, 99,220,184,113,167, 74,
- 74,193,227,224,224,176,244,231,159,127,158,208,167, 79, 31,210, 28,142,194,122, 51,167, 11, 50,111, 6,131, 1, 91,183,110,101,
-150, 47, 95,190, 34, 39, 39,167,196,169, 67, 79, 79,207,248,164,164, 36, 31,115,168, 5, 91,130,138, 86,173, 90, 53, 57, 54, 54,
-214,235,223,228,124,143, 5,215, 58,107,225,109,175,105,130,168,229, 38,233,207, 2,253, 72, 48,117, 73,130,224,155, 88, 60, 6,
-139,147, 98, 78,254,111,183,146, 97,211,212, 25, 87, 36, 26, 47,147, 42,126,232, 51,232,115,231,170, 1,129,132,187,167, 55, 8,
-144, 72, 77, 73, 68,236,139, 39,236,254, 63,126,205, 84,171,148,179, 53, 26,245,175,165,241,212, 6, 2,170,201,121,187,249, 52,
-106,194, 44,128,138,228,167,122,109,196, 1,192,192, 37, 31,197,228, 26,251, 63, 44,101,218,199, 44,182,102,236,223, 47,230,215,
-172,249, 90,160, 56,134, 97,160,139,142,198,178, 33, 67,236, 22, 89,149,168, 68, 37, 42, 4,254, 40, 59, 70,150, 17, 5,241,185,
- 76,149,151,235, 63,193, 59,155, 84, 26,128,196,201,201,233, 12, 69, 81,126,102,139,140,181,181,190,152,132,210, 49,169,169,169,
- 29, 0,148,182, 66, 56, 64, 38,147,253, 74,211,116, 99, 91,146, 74, 83, 20,117, 61, 55, 55,119, 60, 74, 73, 42,253, 54, 86, 29,
- 58, 59, 59, 63,139,141,141, 13, 48,175,162,182,238, 43,139, 91, 89,254,244,233, 83,180,105,211, 38, 54, 37, 37,165,234,191,201,
-249,174,162,132, 85,135,225,197,220, 99,251, 44, 90,111, 1, 94, 60,129,116, 40, 95, 36,108,207, 24, 77,181, 64, 0, 28, 46,247,
-145, 94,171, 57,171,211,228,109, 65, 9,211,133,255, 38,250, 2, 45, 4,124,254, 73,158, 92, 46, 42, 78,180, 25,115,115, 53, 58,
-189,254,195, 74,145, 85,137, 74, 84,162, 18,149,120,143, 80,211,201,201,233, 4,151,203, 21, 88,139,201,162,255,155, 97, 50,153,
-180,233,233,233,157, 1, 60,254,151, 57,223,107,216, 19,196,252, 21,216,233,164,214,209, 86,206,194,173,205,187,206,249, 22,207,
-157,173, 64,206, 54,133,156,179,222,147,114,182,121, 87, 57,205,231,107, 7,111, 71,123,234, 81, 69, 93, 79,171,114,178, 21, 93,
-206,183,197, 89, 81,207, 81, 49,229,100,223,194,125,159,245,158,148,179,205,187,198, 89,180,254,216,200,107, 23,167,141,117,202,
-222,114,178, 21, 93,206,183,197,249,166,207, 81, 41,229,100,223,180, 46,149,112,239,103,225, 61,196,131, 80,176, 15, 66,193,222,
-111, 80,108,220,198,226, 44, 90, 96, 89, 22,118, 57, 18,190,173,149, 0,230,176,251,133,252,196,187,202,105,125, 29, 42, 50, 85,
-192, 91, 72, 59,112,174,162, 57,139, 92,207,138,194,172,194, 21, 38, 17,176, 33,224,168, 61,231, 94, 17,247,189,200,185, 86, 8,
-111, 57, 68,150, 93,156, 21, 85,239,223, 54,103, 69, 61, 75, 69, 57, 43,162,222, 23,119,223,223,226, 61,170,168,114, 86,200,179,
-244, 54,234,124, 49,245,231,141,121,139,114, 86,196,179, 84,148,179, 34,234,253,191,193, 89, 17,207, 82,113,156, 21, 81,239, 75,
-186,247,239,171,133,202, 60, 93, 88, 24,226,129,176, 65,108,173, 3, 0,178, 60, 23,237,109,224,109, 36,146,172,104, 65,244,182,
-196,166, 29, 22,152,255,156,179,130,239,209,172, 66,206,138, 28,221,180,173,168,123,244, 54,234,187, 53,103, 69,241, 23,229,169,
-136,251, 84, 28,231,155,150,183,132,114, 86,248,185,191,105,189,255,183, 56, 43,248, 30, 85,200,179, 84,132,179,109, 5, 15, 6,
-218, 90,237,207,170, 72,206,138,122,150,138, 41,231, 27,223,167,226, 56,223,180,188, 37,148,179,194,207,189, 34,250,144,183,197,
-251, 95, 90,180, 88,178,196, 58,177,174,200,246,175, 8,141,255,108, 74,206, 78,238,255, 41, 78, 59,167,103, 58,190,133,123,255,
-159,150,179, 34, 57,139,150,177, 34,167,123,222,102, 57, 43,146,211,142,178,254,207,113,190,111,247,253, 93,188,158, 37,241,189,
-201,180, 84, 73,214,209,183, 81,206,138,228,180,145,251,127,130,243, 13,238,253,255, 12,202, 53,117,248, 54, 97,190,240, 21, 60,
- 50, 65, 5, 91, 96,222,218,121, 87,112, 57,219,190, 13, 11,225, 91, 64,133,151,179,112,164,252,195, 91, 56,247,247,229,154, 86,
- 62, 75,149,207,210, 59,247, 44, 21,169,147,109, 43,208, 82, 84,161,150,231,162,156, 21,241, 27,214, 28, 21, 85, 71,223,246,185,
- 87,228,179,244, 54,238,253,251,134,255, 27, 0,133,106,237, 30,181,247, 74, 74, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68,
+ 82, 0, 0, 2, 90, 0, 0, 2,128, 8, 6, 0, 0, 0, 68,254,214,163, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,116,111,115,
+104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222,244, 66, 75,
+136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, 69, 69, 4,
+ 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,163,136,138,202,251,225,123,163,107,214,
+188,247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,224,131,199,
+196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,190, 0, 1,
+120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, 20, 0, 64,
+122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,230,211, 0,
+128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, 0, 88, 48,
+ 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, 81,136,133,
+ 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,178, 60,185,
+ 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, 25, 50,129,
+ 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191, 6,255, 34,
+ 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238, 4,104, 94,
+ 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,161,144,185,217,217,229,228,228,216, 74,
+196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,190,226, 36,129, 50, 93,129, 71, 4,248,
+224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, 42, 20,227,
+ 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0,176,106, 62,
+ 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104,131,225,207,
+119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,160,129, 42,
+176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, 28,114, 96,
+ 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,112, 15,250,
+ 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,193, 72, 4,
+ 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,186,145, 59,
+200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116, 49,154,143,
+ 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, 48, 46,198,
+195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18,129, 69,192,
+ 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,194, 39, 34,
+147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, 36, 18,137,
+ 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,100,107,178,
+ 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, 40, 82,202,
+106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182, 82,175, 81,
+135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,105,175,232,116,186, 17,221,149, 30, 78,
+151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,119, 24,175,
+152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,149, 74,149,
+ 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,169, 9,212,
+150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195, 76,195, 79,
+ 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,129, 53,196, 38,177,205,217,124,118, 42,
+187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63, 7,227,152,113,248,156,116, 78, 9,231,
+ 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,150,151,150, 88,171, 72,171, 81,171, 71,
+235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,217, 83,221,
+167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,152,158,190, 94,128,158, 76,111,167,222,
+121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,113,111, 60,
+ 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,163,213, 70,141, 70, 15,140,105,198, 92,
+227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,199,205,204,
+205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120, 90, 44,182,168,182,184,101, 73,178,228,
+ 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,214,187,173,187,167, 17,167,185, 78,147,
+ 78,171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,182,125, 97,103, 98, 23,103,183,197,174,
+195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,154,206,156,
+238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23,103,185,115,
+131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,113, 93,225,122,210,245,157,155,179,155,
+194,237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209, 63, 11,159,
+149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,183,165,119,170,247, 97,239, 23, 62,246,
+ 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,111,158, 95,133,223, 67,127, 35,255,100,
+255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,191,142, 63, 58,219,101,246,178,217,237,
+ 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,231,152,206,145,206,105, 14,133, 80,126,
+232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209,220, 67,115,
+223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, 46,102, 89,
+204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,226,157,226, 11,227,123, 23,152, 47,200,
+ 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, 37,242, 19,
+119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,188, 53,121,
+ 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,131,146,145,
+144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,110,139,183, 47, 30,149, 7,201,107,179,144,
+172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,137,202, 57,150,171,158, 43,205,237,204,
+179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, 60,113,121,
+219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,174,126,189, 38,122, 77,107,129, 94,193,
+202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, 62, 21,137,
+138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,169,171,196,185,100,207,102,210,102,233,
+230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,245,246, 69,219, 47,151,205, 40,219,187,
+131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97,215,248,110,
+209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251,179,247, 63,
+174,137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210, 61, 84, 82,
+143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226, 35,112, 68,121,228,233,247, 9,223,247,
+ 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98, 91,186, 79,
+204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,218,233,130,211,147,103,242,207,140,157,
+149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,116,225,210, 69,255,139,231, 59,188, 59,
+206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,254,147,211, 79,199,187,156,187,154,174,
+185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,255,214,213,158, 57, 61,221,189,243,122,
+111,247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217, 67,221,135,
+213, 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5,143,153,143,
+203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,158, 23,254,162,254,203,174, 23, 22, 47,
+126,248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,235, 25,175,219,198,194,198, 30,190,201,120,
+ 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,255,104,249,177,245, 83,208,167,251,147,
+ 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 6, 98, 75, 71, 68, 0,255, 0,255, 0,255,160,189,167,147, 0,
+ 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 9, 30,
+ 17, 28, 2,215, 58, 34, 2, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236, 93,119,120, 20,213,226, 61, 51, 59,179,187,217,146, 77,
+ 35, 61,144, 66, 9, 96, 0, 67, 81,130, 84, 65, 80,140,138, 10, 86,132,167,207,103,197,134, 5, 84, 68, 68, 32, 54, 64,240, 39,
+242,208,167,128,160,128, 5, 4,164, 68, 74,232, 29,233, 9,144, 4, 18, 66, 58,201, 38,219,203,220,223, 31,217, 89, 55,203,182,
+ 64, 98,129,123,190,111,190,221,157,157, 57,115,239,157,123,239,156, 57,183, 1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20,215, 52, 86,175, 94, 77,154,112,248,144, 64, 57, 29,219,128,191, 59,103, 11,198,157, 52, 35,231, 0, 7,
+231,187,255,144,112, 14,248,187,114,138,241,109, 2,239,144,166,228,163,230, 74, 79,151,112,146,230, 14,103, 75,113, 54, 87, 57,
+242, 16, 78,210, 2,247,253,221,127, 72, 56, 7,252,221, 56,221,243, 79,128,188, 77,226, 12, 48, 79, 53, 53,156,164,185,195,217,
+ 82,156, 87, 91,142,124,132,147, 92,109, 94,242,114,239,223,197,117, 4,174, 5, 69, 86,192,200,204,204,100, 92,248,153,191, 43,
+167,107, 58,136,252,205, 25,214,102,196,150,230,230,116, 75,207,230,194,187,153,153,153,204,234,213,171,183, 2, 24,208,156,113,
+111,142,251,238, 22,215,102,225,189, 2,145,213, 36,206,230,202,247, 45,205,217, 92,101,201,157,179, 57,242,189,167,251,222,130,
+247,168,185,194,217, 44,101,169, 37,242,188,135,252,115,213,188,238,156,205, 81,150,220, 57,155, 35,223,255, 25,156,205, 81,150,
+ 60,113, 54, 71,190,247,118,239,175, 55,131,138,253,139, 5,129,123, 1, 31,248,119, 22, 68, 45, 37, 54,155,224,192,252,229,156,
+205,124,143,222,117,112, 54,231,219,205,192,230,186, 71, 45,145,223, 93, 57,155,139,223,157,167, 57,238,147, 39,206,171, 13,175,
+151,112, 54,123,220,175, 54,223,255, 89,156,205,124,143,154,165, 44,185,113, 14,108,230,151,129,129, 46,191,223,109, 78,206,230,
+ 42, 75, 30,194,121,213,247,201, 19,231,213,134,215, 75, 56,155, 61,238,205,241, 12,105, 41,222,107, 26, 45,213,124,214,220,156,
+ 77,228,190,166, 56,155,216, 60, 51,164, 5,238,253, 95, 26,206,230,228,116, 15, 99,115, 54,247,180,100, 56,155,147,179, 9, 97,
+189,230, 56,255,105,247,253,239,152,158,222,248,174,166, 89,202,155, 59,218, 18,225,108, 78,206, 0,185,175, 9,206,171,184,247,
+215, 28,184,191, 75, 64,196,132,111,230, 55, 19, 52,179, 3,211,146,194,181, 57,195, 57,176, 37, 28,194, 22, 64,179,135,211,241,
+166, 60,185, 5,226,254, 79, 73, 83, 90,150,104, 89,250,219,149, 37,183, 60, 57,176, 25,157,162,102,117,158,221, 57,155,227, 26,
+174, 28,205,149, 71, 91, 58,238,205, 89,150, 90,226,222, 83, 92,133, 11, 65, 57, 41, 39,229,164,156,148,147,114, 82,206,235,150,
+243,154, 4, 75,147,128,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,226, 31, 5,175,237,187,113,113,113,171,
+149, 74,101, 59,111,255,235,116,186,139, 23, 47, 94, 28, 68,147,240,175, 3,189, 71, 20,255, 32,176,248,195, 65, 23, 0, 16,199,
+ 70, 65, 65, 65,113, 77,195,107,103,120,185, 92,158,114,242,228,201, 14,130, 32,192,110,183,195,102,179, 57, 63,205,102, 51,250,
+247,239,223,228,142,244,209,209,209, 57, 18,137, 36,169, 41,231,216,237,246,243,101,101,101,125,125, 28,178, 19, 64, 10,195,252,
+161, 25,197,239,222, 62, 1,148, 88,173,214,238,190, 56, 25,134, 73,113,231,243,194, 37,126,247,201, 25, 18, 18,178,159,227,184,
+ 4, 79, 92,222,190, 11,130,144, 95, 81, 81,209,231,207,188, 71,215, 51,162,163,163,115, 56,142,107,114,254, 44, 45, 45,245,154,
+ 63, 99, 99, 99, 15,177, 44, 27,215, 4, 74,137, 32, 8,185, 23, 47, 94,236,235, 67,136,236, 4,144,226,243, 13,202, 45, 63, 49,
+ 12, 83,108,183,219,123,250, 43, 71,190,184, 60,228, 81,127,156, 78,145,197,113, 92, 86, 84, 84,212, 51,122,189,222, 8,128, 72,
+ 36, 18,226, 18, 54, 0,128,205,102,171,168,169,169,233, 66,115, 34, 5, 5,197,117, 33,180, 4, 65, 96, 77, 38, 19,242,242,242,
+ 64,136,199,250,222,126, 5,215,235,112,224,183,141, 81,193, 81,209,176, 89, 44, 80,181,138,116,114,151,157, 56, 6,155,213, 2,
+155,217,140, 54,189,122,139, 97, 64,231,206,157, 37,126, 56, 19, 62,248,224,131,168,224,224, 96, 24,141, 70, 24,141, 70,152, 76,
+ 38, 24,141, 70,152,205,102,152,205,102, 88, 44, 22, 88, 44, 22,216,108, 54,152, 76, 38,100,103,103,219,173, 86,171, 79,206,105,
+211,166, 69,105, 52, 26, 39,159,184,137,156, 34,175,213,106,133,209,104,196,166, 77,155,124,114,114, 28,151, 80, 82, 82, 18, 37,
+149, 74, 65, 8,129, 32, 8, 32,132, 52,218,220,209,182,109, 91,139,175, 64,182,208, 61,186,158,209, 97,218,210, 53, 81, 33, 10,
+ 57,108,130,128,204,110,109,157,127,228,127,185, 28,196,102,135, 96,179,161,253,243,163,157,251, 59,117,234,228, 51,127, 18, 66,
+ 18,167, 45, 93, 19, 26, 40,103, 85, 85,149,161, 99,199,142, 37,104,112,155,189, 9,173, 4,131,193, 16,229,224,191, 76, 16,177,
+ 44,219,104, 91,191,126, 61, 50, 51, 51,253,197, 61,225,229,151, 95,142,178, 90,173, 48,155,205, 48,153, 76,176, 90,173,176,217,
+108,206,205,110,183, 59, 55,179,217,140, 61,123,246, 4,234,100,125,112,219,109,183, 61,190,102,205, 26,213,207, 63,255,172, 74,
+ 74, 74,130, 84, 42,133, 68, 34,129, 68, 34, 1,203,178,224, 56, 14, 55,223,124, 51, 67,179, 32, 5, 5,197,117, 35,180, 76, 38,
+ 83, 65,122,122, 58,113,124,143,151,203,229, 82,183,183,220,184,246,237,219,231,186,159,231,175,185, 42, 56, 42, 26, 19, 91,135,
+ 3, 0,222, 57, 87,229,124, 64,124,216,231, 70,231, 49,239, 93,168, 5, 0, 40, 20, 10, 48,174,175,209, 94,160, 82,169,112,219,
+109,183, 65, 38,147,161,103,207,158,224,121,222,227, 38,149, 74,193,243,188,223, 68, 97, 24, 6,106,181, 26, 83,166, 76, 17, 69,
+ 18, 84, 65,114,140,235,211, 19, 65, 32,248,239,177,211, 48, 11, 4, 28,199, 57,183, 64, 56,165, 82, 41,142, 30, 61, 10,142,227,
+ 32,145, 72,156,159,226,247, 85,171, 86, 97,228,200,145,224, 56, 14, 10,133, 2,240, 51,115,176,235, 61, 50,155,205,177, 50,153,
+204, 2, 64, 20,103, 82,134, 97, 98,174,228, 30, 93,207, 8, 81,200, 49,102,222, 79, 0,128,162, 89,207, 59,239,221,158,103,223,
+113, 30,147,248,159, 7,192, 48, 12,120,158, 7,203,178,205,198, 89, 93, 93,109,120,232,161,135,182, 7, 7, 7,175,215,106,181,
+240, 35,224, 80, 84, 84, 4,142,227,188,230,119,150,101, 49,115,230, 76,156, 57,115, 38,160,184, 27,141, 70, 44, 88,176, 0,118,
+187,189, 17,175,248,221,125, 95,128, 34,235,253,161, 67,135,142, 94,179,102, 77, 24,195, 48,248,236,179,207, 32,149, 74, 49,124,
+248,112, 68, 68, 68, 96,195,134, 13,144, 74,165,120,253,245,215,105,230,163,160,160,240, 85,231,241, 0,110, 4, 16,233, 48, 17,
+234, 0,132,186, 28, 82,225,248,140, 20,127, 51, 12,179,207, 3, 79, 47,199, 49, 21, 12,195,236,115,249,109, 6, 32,243,176,191,
+ 10,128,194,177,153,208,224,254,167,185, 92, 71, 60, 15,222,174,203, 1, 13,235, 15, 1,216, 2, 96, 96,102,102,230, 86, 0, 40,
+ 45, 45,189,163,180,180, 20, 0,144,146,146,114, 50, 55, 55,183,163,168,121, 28,205, 83, 82,155,205,214, 65,108,170, 18,221,162,
+ 33, 67,134,248,124,195,183, 89, 44,151, 9, 16, 79, 90,202, 83,115,133, 55, 1, 99,177, 88,240,192, 3, 15, 0,128,215,135,142,
+235, 22,128,118,131,217,108, 6,199,113, 72,109, 29,137, 73,195,210,113, 19,177, 66, 87,207,192, 86,171,195, 61,106, 43, 78,118,
+238,142,249,231, 43,112, 78, 91, 15,142,227, 2,226, 20, 4,193,171,200,146, 72, 36,152, 55,111, 30, 30,122,232, 33, 72, 36,146,
+128,248, 92,239, 81,114,114,242,154,220,220,220, 8,134, 97, 76,142,123, 36,183,217,108, 26,155,205, 22, 97,183,219, 35,154,114,
+143,174,103,216, 4,193, 99, 62,244,150,103, 3,185, 79,129,112, 86, 87, 87, 27, 50, 51, 51,119,203,229,242,133,209,209,209, 37,
+197,197,197,126,133,150,187,248,113,127,169,248,228,147, 79, 48,103,206, 28, 12, 26, 52, 40,160,112,154, 76, 38, 48, 12,131,249,
+243,231, 95,246,223,212,169, 83, 47,187,158, 31, 78, 6, 0, 27, 23, 23,247,236,186,117,235, 52,226,177,173, 90,181, 2,207,243,
+232,210,165, 11,130,131,131,177,125,251,118,216,237,246,128,203, 37, 5, 5,197,181, 11, 79, 90,196, 5,253, 39, 78,156,216, 51,
+ 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106,151, 58, 49,211, 81,191,174, 22,127, 19, 66,122,185,138, 30,135,
+ 88,139,100, 24,102,181,120,188,235,111,241,147, 16, 50, 4,128, 76,252, 61,113,226,196,180,172,172,172,233, 19, 38, 76,120,115,
+198,140, 25,210,137, 19, 39,118,205,202,202,154, 46, 94,199, 83, 56, 60, 57, 90, 62,215,158, 18,155,168, 78,157, 58,229,173,137,
+202,245, 1,224,179,182, 84,181,138,116, 58, 89,239, 37, 70, 56,247, 79, 41,174,113, 62,192,230,246,104, 7,149, 74,133, 97,239,
+125, 20,144, 83,100, 54,155, 81, 94, 94,238,116, 25,252,109,129,114, 42, 21, 65,200,126,185, 11,138,170,100,120,119, 87, 53,214,
+ 28, 62, 3,158,231,113,123,231, 46,184, 67, 26,140,183, 19,101,120,249,116, 33,172, 36,176, 62,189,132, 16,143, 2, 75,252, 46,
+ 54,161, 4, 42,180,220,238, 81,145,209,104,172,202,203,203, 51, 8, 13, 15,118, 5, 33, 36,140, 97,152, 58,135,203, 21, 27,232,
+ 61,186,158,145,217,173,173,211,117,218, 19, 60,216,185,127,164,238,168,243,158,140,159,247, 33, 0, 96, 80,247,155,253,150,135,
+ 64, 56,171,170,170, 12,125, 7, 15,220,106, 55,152,191, 25, 61,122,116,193,230,205,155, 21,129,132,213,147,208, 18, 93, 91, 81,
+100,113, 28, 7,179,217, 28, 80,220,205,102,179,215,242, 33,149, 74,175,196,209,130, 78,167, 51,175, 92,185, 18,115,231,206, 69,
+ 68, 68, 4,134, 14, 29,138,216,216, 88, 44, 95,190, 28,132, 16, 60,255,252,243, 80, 40, 20,162,123, 77, 51, 32, 5,197,245, 13,
+ 95, 90, 68,158,149,149, 53,221, 93,200,184,254,118, 21, 80,110, 98,202, 85,172,165,249,121,254,175,118, 23, 79,226,117, 25,134,
+ 89, 61, 99,198,140, 76, 63,225,168,240, 38,180,124, 78,137,111, 50,153, 10,186,117,235, 22,144,154,208,235,245,165,254,196,134,
+167,183,122, 87,151, 64,173, 86, 67,165, 81,131, 13,176,222,181, 90,173, 78,161,178,113,227, 70, 40, 20, 10, 12, 31, 62,252,170,
+ 28, 45,139,197, 2,153,148, 7,219, 42, 26, 99,102,109, 70, 85,157,193,249,128,217,146, 95,128,131,101,229,120, 57, 99, 48, 84,
+138,114,212,155,205, 1, 57,111,130, 32, 92, 38,178, 56,142,195, 3, 15, 60,224,116, 19, 92,251,173,192, 71,211, 97, 68, 68,196,
+126,142,227, 18, 92,238, 81, 80, 74, 74, 10,240, 71,191, 30, 70, 16,132,250,208,208,208, 31, 1,196, 17, 66, 18, 0, 4, 7,114,
+143, 40, 60,231, 79,247,253,130,155, 83,117, 37,156, 85, 85, 85,134,204,204,204,221,118,131,249,155, 11, 23, 46,236, 6, 16,116,
+211, 77, 55, 53, 89,104,137, 2,139,231,121,204,156, 57, 19,115,230,204,113,254, 31,168,208,178,217,108,141, 4,212,233,211,167,
+ 27, 93,203, 93,216,249,105, 54, 37,104, 24, 93, 40,164,164,164, 56,207,137,137,137, 65,104,104, 40, 4, 65,128, 32, 8, 8, 10,
+ 10,130, 66,161,128, 84, 42,165,153,142,130,130,194,151, 22, 49, 76,152, 48,225, 77,134, 97, 86, 59,156,165, 99, 62, 4,149, 39,
+237,209,203, 77,172, 85,120, 57, 46,211,147,216,114,253, 46, 98,226,196,137,105,238,225,240,212, 92,233,172, 85,221,166,221,111,
+ 4,215, 38,170,230,122,136,249,122,144,169, 67, 53, 80,168, 84,144, 72, 88, 48, 12, 67,252,113, 89, 44, 22,103,197,255,204, 51,
+207,248,236,183, 18,104,127, 42,139,197, 2,150,147,224, 98, 76, 50,236,236, 54,231,185,226,198,114, 60,206,197,116,132,228,212,
+ 33,240, 1, 62,112,221, 29,173,231,159,127, 30, 11, 22, 44, 0,203,178,206, 52,225, 56, 14,237,219,183, 71, 65, 65,129, 79, 46,
+142,227, 18,206,157, 59, 23,229,154,142,162,136, 37,132,192,110,183,163,109,219,182,198,188,188,188, 23,105,209,189, 58,145,229,
+109,191,221, 46, 4,236,194,120, 58,174,170,170,202, 48,106,212,168,173,181,181,181,223,220,112,195, 13,167,209,120, 10, 4,191,
+124, 28,199, 53, 18, 88,162,200,250,244,211, 79, 27,137, 34,171,213, 26,208,139,128,213,106,189, 76,240,124,252,241,199,141, 62,
+ 1,160, 79,159, 62, 1, 57,195, 0, 8,203,178, 68, 42,149,226,182,219,110, 67,215,174, 93,241,243,207, 63, 67, 16, 4, 60,247,
+220,115, 80, 40, 20,152, 61,123, 54,108, 54, 27, 62,248,224, 3,234,104, 81, 80, 80,248,210, 34,166, 25, 51,102, 28,155, 49, 99,
+134,211, 89,114,119,180,188, 60,119,239,116,136,170, 72, 81,164, 1, 48,121, 18, 68,158, 92, 50,119, 1,230,186, 47, 43, 43,107,
+186,123, 56,220,155, 43, 27, 9,173, 63, 11,165,199,143,226,163, 91,210, 1, 52,110, 46,156,119,115, 71,168,212, 42,168,130,213,
+ 24,181,106, 27, 0, 56, 42,253, 9, 1, 57, 90,162,208,170,170,170,242, 41,178,154,226,104,177, 50, 14, 43, 18, 46,129,200,120,
+112,102,107, 35,161, 37,225,120, 20, 69, 36,131,229,165,224,236,182,128, 56, 9, 33,151, 53, 21,142, 29, 59, 22, 12,195, 56, 71,
+136,117,235,214,205,149,139,241,247,112,124, 45,188,161, 15,158,123,115,236, 7,149, 70, 90, 98,175, 36,127,238,255, 18, 39,127,
+120, 22, 0,208, 87,167,115,222,139,105,221,254, 24, 59, 48,235,232, 86,167,251,248, 30, 94,189, 34,206,170,170, 42,195, 77,157,
+210,118, 75,195, 67,190, 57,127,254,252,110, 0,236,131, 15, 62, 24,218,173, 91,183,128,202,164, 56,184,194, 93,100,185, 58, 89,
+226,167,159, 17,182, 46,194,209, 30,144,128, 18,155, 17, 3,200,243, 68,204,219, 26,141, 6,106,181,218, 57,226, 54, 40, 40, 8,
+ 74,165,210,217,191, 51, 64,225, 70, 65, 65,113,253, 34, 76, 20, 58, 14,177,212,200,105,114,244,173,202,116,253,237,201,241,114,
+ 56, 80, 57,126,234,215, 53, 14,129,230, 17,162,179,230,118,206,106,111, 34,141, 19, 21,164,235,103, 76, 76,204,175,106,181, 58,
+ 57,208,216, 55,101, 20,155,221,106,185,204,217, 98, 24, 6,234, 96, 53, 20,106, 21, 20,193,106,175,174,151, 47,161, 37, 58, 69,
+226, 67,103,225,194,133, 80,171,213,248,215,191,254,213,228, 62, 90, 78,161, 37,101,177, 65,190, 9, 18, 25,215, 72,100,113, 28,
+ 7, 9,207,163, 84, 29, 11,150,231,193,217, 2,115,201,106,107,107,193,113, 28, 38, 77,154,228,124,131,119, 21, 89, 77,137,179,
+ 47,176, 12, 35,186, 91,242,118,237,218,189,202, 48, 76, 34,128, 36,157, 78, 39,191,120,241,226,173,180,188,250, 80, 6,118,235,
+101, 46,148, 55,247,245, 74, 57, 69, 39, 75, 26, 30,242, 77,199,142, 29,157, 78,150, 82,169, 20, 71,155,250,191,199, 44,235, 81,
+100,185,143, 16,228, 56,174, 33, 47,251, 25, 29,233,234,104,205,152, 49,195,201,235,234,100,137,104, 74, 57, 18,195,186,117,235,
+ 86, 28, 60,120, 16,207, 60,243, 12, 20, 10, 5,230,204,153, 3,155,205,134,169, 83,167, 66,161, 80, 64, 38,147,209,204, 71, 65,
+ 65,221,172, 70, 90,196, 13, 21,110,253,160, 24, 55, 81, 83,225, 73, 96,185, 54, 19,138,223, 25,134,177,122,224, 53,187, 53, 41,
+186,239, 23, 63,171,102,204,152,177, 89,116,178, 92,246, 55, 10,135, 95, 71, 75, 46,151, 39,231,229,229, 57, 39,194,244,245,105,
+ 54,155, 49,104,208,160,128,157, 49,113,212, 33,199, 73, 26, 9, 11,101,176, 26, 74, 77, 48, 20,106,181,187,224, 96,252, 85,226,
+226, 27,177,171,208,154, 60,121, 50, 56,142,195,130, 5, 11, 0, 0,175,190,250,106,192,125,180, 68, 78,216, 25, 20,147,179, 72,
+159, 53, 18,230,111,173, 40,219,241, 59, 56,142, 67, 84,239, 59, 32,220, 52, 18,122,133, 26,156,221, 22,240,168,195,234,234,106,
+ 20, 20, 20, 64, 34,145,224,149, 87, 94,105, 52,215,145,251, 72,182,141, 27, 55,250,141,187, 39, 39,107,242,249,106, 39,143, 66,
+161, 96,127,255,253,247,100, 65, 16, 82, 12, 6, 67,187, 62,125,250, 8,180, 40,251, 17, 69,130, 45, 32, 81, 21,104,254,116,231,
+ 20,251,100,213,214,214,126,115,254,252,249, 61, 0,216,209,163, 71,135, 42,149, 74,124,245,213, 87,122, 0,178,229,203,151, 43,
+252,137, 34, 49,223,248, 19, 89, 60,207, 55,228,229, 64,226, 78, 26, 79, 89,226,175, 99,124, 32,121, 94, 12, 43,195, 48,176,219,
+237, 80, 40, 20,141,156,172,160,160, 32,200,229,114,154,241, 40, 40, 40,252,213, 37,251, 2,174,199, 9,233,229, 34,170,246, 93,
+ 9,111, 83,174,231, 15,156, 55,161, 97, 50,153,112,226,196,137, 64,121, 2,158, 24,179,117,207,155,241,222,133, 90, 48, 12,131,
+255,246,185, 1, 42,141, 26, 74,149, 10,247,255,188,213, 89,113, 31,157,254, 42,228, 42, 53,226,250, 13, 13,168, 34, 23,155, 14,
+ 93,133, 86, 77, 77, 13,120,158,199,251,239,191, 15,150,101,241,193, 7, 31, 32, 62, 62, 30, 23, 47, 94,196,242,229,203, 3,114,
+180, 36,118, 9, 98, 31,235, 4,229,216, 16,104, 30,235,143,176,219, 38,227,130,153,195, 78,163, 18,253,141,199, 33,219,240, 41,
+204,130, 61,224, 17, 88, 54,155, 13, 91,183,110,117,239,240,238,236, 83,101,179,217, 96,181, 90, 97,177, 88,240,193, 7, 31, 4,
+ 50,194,243,178,251, 38,166,161, 99, 18, 84, 73,110,110,110, 36, 33, 36, 28, 64, 8,128, 74, 90, 92,125, 35,182,247,243,136,236,
+249, 52, 0, 96,213,140, 39,156,251, 39, 29,253, 35,127,206,252,182, 97, 1,128,142, 73, 67,155,196, 89, 85, 85,101,184,125, 80,
+159, 28,163,192,127,221,165, 75,151, 70, 78, 86, 80, 80, 16,227,248, 29,144, 93,198,178, 44, 36, 18,201,101,205,133,222,196, 86,
+ 32,125,180,108, 54,155,115, 34, 81, 95,253, 25,175,196,209,122,226,137, 39, 16, 27, 27,235,116,178,222,123,239, 61, 40, 20, 10,
+ 76,156, 56, 17, 86,171, 21,159,126,250, 41,205,124, 20, 20, 20,127,186, 40,251, 51,224,177, 38, 53, 26,141,133, 93,187,118,133,
+151,255,226,131,130,130,120,183, 72,197,181,111,223, 62,215, 67, 19,226, 16, 0,217,158, 42,117,134, 97, 16,172, 9, 70,144, 90,
+ 5,165,155,139, 21, 20,172,129, 92,173, 6, 43,245, 88,153, 95,198, 41,246, 45,113, 21, 90,226, 86, 91, 91, 11,158,231, 49,119,
+238, 92,104, 52, 26,152, 76, 38,191,156,226, 67, 71, 34,145, 64, 95, 84,135,147,211,179, 33, 11,218,137,118, 67, 31, 66, 44,175,
+128,116,251,143, 48,216,173,254, 38, 44,189,140,179, 67,135, 14,120,231,157,119, 46,155,214,193, 27,226,227,227,253,198,221,221,
+201,154,121, 67, 27, 72,101, 82,140, 63, 94, 4,147,201,196, 60,244,208, 67, 2, 0, 3,128, 10,131,193,112, 62,144,244,108, 6,
+252,227, 57,125,141,138, 21, 33, 16,187, 39, 1,227,145, 83,116,178,140, 2,255,117, 65, 65,129,232,100,133, 40,149, 74,124,241,
+197, 23,122, 0,236,212,169, 83,149,137,137,137,146, 64,242,146, 68, 34,193,172, 89,179, 60,246,201,242, 36,186,154, 82,142, 92,
+207, 29, 48, 96,128,199, 9, 75,189,136,183,203, 56,197,176, 70, 68, 68, 56,157, 44,187,221,238, 28,109, 40,206, 62,239,227,165,
+130,230, 79,202, 73, 57,175, 31,206,107, 18, 30,107,224,139, 23, 47,222,238,237,132,182,109,219,230,229,229,229,181, 23,151,226,
+112, 84,156, 82,163,209,216,161, 79,159, 62,126,173, 29, 65, 16, 32,151,203, 65, 8,193,173,239,100,129, 97, 1, 22,141, 31, 98,
+ 81,183, 12,134, 68,194, 65,104, 88,234,195,239,168, 67,131,193,208,232,225,224,105,171,175,175,135,201,100, 10,120, 54,111,163,
+209,216,104, 10, 6,134, 8, 56,247,219,178,203, 70, 31,138, 91,160,253,118,130,130,130, 26, 53,253,248,113,172,152, 64, 28, 45,
+215,166, 71,169, 76, 10, 78,202,139,142, 86,221,233,211,167, 71,209,108, 30, 56,196, 1, 11, 0,144,218,103, 56, 4,193, 14, 98,
+183, 55, 90, 38,169, 83,242,237, 16,136, 29, 22,171, 30, 38,147,201,223,180, 39, 76,101,101,165, 97,212,168, 81, 91, 1,252,239,
+158,123,238,201, 69,195,236,194, 68,173, 86,203,121,158, 23, 0, 84, 3, 32,151, 46, 93, 10,185,112,225,130, 96, 52, 26,219,248,
+ 11,231,154, 53,107,112,226,196, 9,244,235,215,175,209,114, 80,162, 43,234, 58,187,123, 32,249, 83,108, 46,247, 52, 35,188, 55,
+ 33, 23, 40, 36, 18, 9, 66, 66, 66, 32,149, 74,241,254,251,239, 67, 42,149, 66,169, 84, 2, 0, 62,253,244, 83,231,228,171, 20,
+ 20, 20, 20,215,141,208,242, 87,111,250,104, 86,244,217,132,104,179,217,138, 19, 19, 19,155,116, 49,187,221, 94,230, 71,184, 21,
+ 47, 95,190, 92,234,234, 66,248,251, 36,132,148,249,121,216, 22,175, 90,181, 74,234,201,221,240,182,192,180, 63, 78,187,221, 94,
+156,148,148,228,213, 49,241, 4,171,213,122,193,159,104,205,170, 48, 52, 18, 9,227,143, 23,121, 93, 59,145,194,111, 94,243,145,
+ 63,223,186,210,252,121, 58, 53, 53,245, 66,104,104,232,218,232,232,232,170, 29, 59,118, 68,244,234,213, 43,194,245,152, 94,189,
+122,197,186,157,102,134,247,117, 14,193, 48, 76,241, 61,247,220,227, 49,207,139,162,201, 67,254, 44,246,151,231,247,238,221, 43,
+117, 61,223, 27,191, 75, 57, 42, 14, 64,184,158, 75, 79, 79,103, 93,121,188,229,125,171,213, 90, 65,115, 33, 5, 5,197,117, 47,
+180, 12, 6, 67, 81,215,174, 93,109, 94,254, 59,239,235,220,170,170,170,158,205, 29, 1,171,213,218,231,159,192, 89, 89, 89,217,
+172,113,183,217,108,197,142, 9, 74,125, 30, 67,179,248, 95,119,143, 0,160,188,188,252, 38, 0,208,233,116,240,183,172, 78, 19,
+ 4, 97,179,231, 79,155,205,214,167, 37,210,180,186,186, 58,131,230, 44, 10, 10, 10, 42,180,154, 0,186, 24,241,223, 3, 45, 33,
+ 90, 41, 40, 40, 40, 40, 40, 40,154, 23, 44, 77, 2, 10, 10, 10, 10, 10, 10, 10,138,150, 1,131,134,145, 3,158,208,148,209, 4,
+ 67,174,224,218,217,148,147,114, 82, 78,202, 73, 57, 41, 39,229,188,238, 56,253,113,211,209,140, 45, 44,192, 40, 39,229,164,156,
+148,147,114, 82, 78,202,121,253,113, 94,147,160, 77,135, 20, 20, 20, 20, 20, 20, 20, 20, 45, 4,142, 38,193, 95, 6, 9,154, 48,
+163,190, 63, 16, 66,194, 0,120, 91, 48,206,204, 48,204,165, 43,224,100, 0, 72, 29,155, 56,209,145, 21,128, 5,128,133, 97, 24,
+226,159,227, 93,182,164, 36, 44,141,216,249, 94,132, 97,120, 65,192,225, 54,109, 90, 31, 98,152, 59,204, 0,160,138,238,212, 89,
+173, 82, 12, 49, 89,204,201,114, 94,118,162, 70, 87,191,209, 84,158, 87, 72,179, 7, 5,197, 95,130,187, 0, 76, 65, 67,183,146,
+ 25, 0,150,209, 36,161,160,104, 33,161,165, 86,171,247,179, 44,155,224,111,126, 30, 17,142,181,204,138, 47, 93,186,212,179, 9,
+215, 30,165, 86,171, 7,241, 60,127, 11, 0, 88,173,214, 29,245,245,245,155, 1, 44, 7, 96,187,194, 56,105, 0, 60, 0,224, 17,
+199,239, 37,142,202, 66,123,133,124, 93, 67, 66, 66,126,224,121,158, 84, 86, 86,246, 6,128,136,136,136,221, 86,171,149,209,106,
+181,247, 3, 56,210, 68, 62,150,231,249,153,189,123,247,238,191,109,219,182,255, 1,152,219, 76,247, 82,206,178,172, 71,129, 34,
+ 8, 66,210, 21,136, 44, 41,128,144,185,115,231, 70, 44, 94,188, 56,189,184,184,184, 11, 0, 36, 36, 36, 28, 29, 61,122,244,161,
+113,227,198, 85, 17, 66,106, 25,134,177,248,226, 41, 41, 9, 75, 43, 47,205,127,166,172,252,196, 3, 0, 16, 19,219,101,153, 68,
+194, 74, 9, 57,176, 75,217,234,145, 86,237,219, 37, 61,253,221, 87,115,165, 73,201,173,177,105,231,193, 27,199,189,248,102,218,
+ 5,224, 19, 42,182,254, 60, 4, 7, 7,239,103, 89, 54,193, 87, 25,247, 84,230,237,118,123,113,117,117,117, 79,111,156, 28,199,
+ 37,248,170, 47, 60,237, 19, 4, 33,191,178,178,210,227, 84, 19, 26,141,102, 23,199,113,201,129,114,137,159, 54,155,173,216,219,
+ 40, 93,141, 70,179, 95, 34,145, 36,248,138,167,167,255, 4, 65,200,175,168,168,240, 22,206,203,226,222, 28,225,188, 18, 78, 95,
+225, 20,235, 35, 0,159, 70, 68, 68,220, 92, 85, 85,245, 40,128, 55,181, 90,109, 55,137, 68,130,240,240,240, 55,205,102,243,153,
+144,144,144, 47,107,107,107,119, 2,120, 17, 0, 93, 47,149,130,162,185,160,209,104,202,234,235,235,137, 8, 65, 16,136,213,106,
+ 37, 38,147,137, 24, 12, 6,162,211,233, 72,125,125, 61,209,106,181,164,182,182,150, 84, 85, 85,145,200,200, 72,247,201, 27,189,
+181,225,118,209,104, 52,121, 89, 89, 89,166,130,130, 2, 98,177, 88,136,197, 98, 33,133,133,133,228,163,143, 62, 50,105, 52,154,
+ 60, 0, 93,188,156, 59,196, 75,101,113, 27,128,165,233,233,233,230, 53,107,214, 16,163,209, 72,116, 58, 29, 89,182,108, 25,185,
+225,134, 27,204, 0,150, 58,142, 97, 3,228, 4,128,190, 49, 49, 49,197,103,207,158,181,111,220,184,209, 18, 18, 18,146, 29, 18,
+ 18,146, 93, 88, 88,104, 63,123,246,172,208,170, 85,171, 98, 0,125,155, 16, 78, 0, 24, 57,126,252,248,178,194,194, 66, 50, 96,
+192,128,195, 46,251, 25,248, 95,231,110,136, 39, 39,139, 16, 18, 67, 8,137, 69,195, 36,151,151,109,132,144, 88,199, 49, 97, 1,
+114,170,242,243,243, 91, 71, 71, 71,103, 49, 12, 99,118,231, 99, 24,198, 28, 29, 29,157,149,159,159,223,154, 16,162,242,197, 89,
+124,126,222,147,107,215, 12,174,209, 93, 58, 69,116,151, 78,145,255,125, 61, 80,251,212,184, 71,151,198,182,237,190, 32, 52, 33,
+109,238,137, 83,167,231, 19, 66,230,111,222,151, 55,127,242,231,191,206,191,119,220,236, 47, 34, 18,211,159,106, 66,122, 94, 13,
+ 40, 39,128,208,208,208, 82,157, 78, 71, 8, 33,196,110,183, 19,139,197, 66, 76, 38, 19,209,235,245,164,190,190,158,212,213,213,
+ 57,203,121,109,109,173,243,123, 84, 84,148,215,242, 30, 22, 22, 86,102, 48, 24, 26,213, 29,102,179,217, 89,127,232,245,122,162,
+215,235,137, 78,167,115,110,245,245,245, 36, 46, 46,174,200, 71, 56, 47,138,225, 20, 4,129,216,108, 54, 98,177, 88,156,188, 70,
+163,177,209,102, 50,153,136,201,100, 34,137,137,137, 1,135, 51, 16, 78,163,209, 72, 18, 18, 18, 74,188,113,134,135,135,151, 25,
+141,198, 70,156,174,241,119,231, 21,127,199,196,196,148, 54,133, 51,144,112,250, 74, 79, 7,230,230,230,230, 18,131,193, 64,226,
+227,227,171,238,191,255,126,171,221,110, 39,107,214,172, 33,233,233,233,194,192,129, 3, 45,149,149,149,228, 95,255,250, 23,241,
+241, 82, 72,203, 17,229,164,184, 18, 71,139, 97, 24,168, 84, 42,124,255,253,247, 94,151,227,112,253,222,166, 77,155, 64,175,217,
+ 51, 57, 57,121,235,246,237,219, 21,177,177,127, 76,136,109, 54,155, 17, 22, 22,134,231,158,123, 78,118,215, 93,119,181, 31, 58,
+116,232,238,115,231,206, 13, 0,176,223, 15,223,125,145,145,145,159, 77,154, 52, 41,250,193, 7, 31, 68, 68, 68,163, 73,183, 49,
+106,212, 40,220,127,255,253,210,220,220,220,135, 22, 46, 92,248,208,188,121,243, 74,235,235,235,199, 1,248,209, 23,169, 66,161,
+184, 39, 46, 46,238,139,237,219,183, 71, 69, 69, 69, 33, 37, 37,133,125,253,245,215,219,119,232,208, 65,145,144,144,192, 94,188,
+120, 17, 63,255,252,115,252,195, 15, 63,188,162,172,172,236,105,139,197,178, 50,128,184,203, 34, 34, 34,222,124,250,233,167, 91,
+105,181, 90,219,129, 3, 7,242,196,253, 50,153,108,106, 70, 70, 70,175, 45, 91,182,124, 11,224,203, 43,113,178, 8, 33, 90,252,
+209,196, 39,194, 42,254, 31,136,179, 69, 8,145, 29, 62,124, 56, 60, 35, 35,227, 71,147,201,212,253,153,103,158, 57, 63,125,250,
+116,133, 70,163,209, 0, 96,180, 90,237,165, 41, 83,166,152,103,207,158,253, 70,231,206,157, 7,239,218,181,235, 62, 66,136,213,
+ 33,200, 46,231, 99, 24,103,120,138, 46, 84, 96,235, 78, 65,246,206,196, 87, 19, 62,156,150,124,110,223,241, 34,129, 83,104,240,
+ 75,206, 49,148, 85,213,227,215, 93,199, 17, 19, 17,204, 72,229,124, 90, 72,252, 13, 3,106, 47, 28,207,129,143, 25,210, 41,154,
+ 7, 12,195, 64,169, 84,226,151, 95,126,185,108,233, 42, 79,203, 90,113, 28,135,208,208, 80,191,171, 27, 4, 5, 5, 97,227,198,
+141, 30,215, 94,244,180,164, 79, 72, 72, 8,124,189,108, 48, 12,131,160,160, 32,236,216,177, 3, 44,203,122, 92, 26,200,125,159,
+ 74,165, 2,235, 99,173, 43,145, 51, 39, 39,199, 47,151,248,169, 86,171,129,134,166,127,239,133, 82, 46,199,246,237,219,189,198,
+217,253,187,218,177,222,171, 63,206, 29, 59,118, 52, 90,250,203,125, 73, 48,215,223, 42,149, 10,140, 31,210,176,176,176,222, 9,
+ 9, 9,216,187,119, 47,150, 47, 95, 30,158,150,150,134,211,167, 79,131, 97, 24, 76,159, 62,157,185,225,134, 27,248,210,210, 82,
+244,235,215, 15, 63,253,244, 83, 31,173, 86, 75, 11, 12,197, 95, 2, 66, 8, 15,224, 70, 0,145,104,232,118, 83, 7, 32, 20, 13,
+ 43,105,200, 0, 84, 1, 80, 56, 54, 19,128,122, 0,173, 28,167, 87, 58,234, 22, 87,129, 80,225,186,248, 52, 33,164,151,131, 91,
+ 92,161, 34,210,229, 88,241, 26,238,191,221, 63, 61,114,115, 0,176,122,245,106,241, 97, 54, 48, 51, 51,115,171,107,228, 2, 17,
+ 89,226, 58,101, 30,202,180,251, 16, 77,185, 74,165,250, 97,247,238,221,138,200,200, 63,226, 96, 50,153, 80, 87, 87,135,250,250,
+122,212,213,213, 33, 56, 56, 24,203,151, 47, 87, 12, 30, 60,248,135,186,186,186, 14,142, 68,243,198, 57,235,226,197,139,209, 54,
+155, 13, 50,153,231, 46, 74, 44,203,162, 83,167, 78,120,243,205, 55, 49,108,216,176,152, 65,131, 6,205,114, 19, 90,151, 13, 37,
+ 85, 42,149, 95, 28, 56,112, 32, 74,169, 84, 34, 47, 47, 15,197,197,197, 24, 63,126,124,107, 65, 16, 80, 84, 84,132,211,167, 79,
+227,194,133, 11, 88,184,112, 97,212,136, 17, 35,190,240, 32,180, 60, 13, 79,125,230,229,151, 95,238, 24, 22, 22,198,126,244,209,
+ 71, 53, 58,157,238,255, 28,251,223,153, 51,103,206, 99,253,251,247,143,250,247,191,255, 77,118,236,216,177,216,113,227,188,166,
+167,107,159, 44, 71, 51, 31, 28,153,239,164,219, 57,157, 92,254, 7, 33, 36, 6,128,137, 97,152, 26, 15,156, 12,128,144,161, 67,
+135,190, 98, 50,153,186,111,223,190,253,204, 45,183,220,146, 8,224,162,152,249, 66, 66, 66, 84,179,102,205,138,206,204,204,204,
+189,245,214, 91,187, 15, 29, 58,244,149,138,138,138,233,132,144, 10,151, 62, 91, 78, 78, 65,192,225,152,216, 46,203,114,118,141,
+123, 96,203, 14,179,244,213, 23, 39,159,111,211, 58,169,246,112, 94,181,253,120,126, 5,234, 12, 54,220,123,107,195, 2,230,189,
+187,180,193,103,223,111,199,115, 47,189,197,255,184,108,209,253,103, 8, 84,245, 37,199,215,248, 72,207,171, 5,229,132,179,137,
+ 9, 60,207,227,142, 59,238, 0,195, 48,151,173,229,201,243, 60,118,237,218,133, 91,111,189, 21, 60,207,227,137, 39,158, 8,136,
+147,227, 56, 12, 29, 58,212,185,142,162, 43,159,187,104,240,162, 9,178,221, 42, 91,112, 28, 7,150,101,189, 46,164,237,206,233,
+175, 94, 18,195,233,139,203,245, 63,127,225,116, 44,121, 20,176,200, 10,148, 83, 12, 39,199,113,232,211,167, 15, 14, 29, 58,228,
+ 83,116,121,209,151,141,226,126,233,210,165, 49, 29, 58,116,200,153, 59,119,110, 56, 0, 84, 85, 85, 57, 23,188,151, 72, 36, 56,
+117,234, 20,204,102, 51,222,125,247, 93,139, 86,171,253, 55, 45, 71,148,179, 37, 57,125,105, 17, 0,253, 39, 78,156,216, 51, 43,
+ 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106, 66, 72,166,248, 57,113,226,196,180,172,172,172,233, 19, 38, 76,120,
+115,198,140, 25,199, 24,134, 89, 13, 0,238,191, 29,117, 73,166,155,136,139, 20,121, 28,101,174,209,177,158,126,187,127,122,226,
+110,228,104,101,102,102, 50,142, 72, 50,174,149, 90,160, 66, 43,144,181,251, 56,142,123,126,250,244,233,209,190, 68, 86,125,125,
+ 61, 74, 74, 74,144,152,152,136, 39,158,120, 34,122,238,220,185,207,219,108,182,143,125,208, 74, 37, 18, 9,246,238,221,139,242,
+242,114,116,237,218, 21,201,201,201,141, 14, 56,123,246, 44,214,174, 93,139,154,154, 26,244,232,209, 3,104,232,220,237, 17,221,
+186,117,123,183, 83,167, 78, 67, 89,150,181, 41, 20, 10, 28, 62,124, 24,221,187,119,199,247,223,127,143, 54,109,218, 64,169, 84,
+ 34, 55, 55, 23, 93,187,118,197,214,173, 91, 17, 25, 25,137,244,244,116,155, 86,171,221, 86, 93, 93,189,249,220,185,115,239,122,
+ 11,103,124,124,252,228,167,158,122, 74, 86, 82, 82, 34,124,243,205, 55,219, 1,108, 7,240,252, 91,111,189,245,248,176, 97,195,
+162, 14, 30, 60, 88,187,111,223,190, 61, 94, 68, 86, 32, 78,150,205,253,161,100,183,219, 77, 6,131,193,108, 50,153,172, 44,203,
+ 22, 50, 12, 99,182,219,237, 29,188,153, 16, 99,199,142,109, 91, 89, 89,249,220, 75, 47,189, 84,224, 16, 89,167,208,208, 1, 30,
+ 0, 96,179,217, 76,245,245,245,218,140,140,140,196,135, 31,126,248,204,210,165, 75,159, 27, 59,118,236,242,111,190,249,166, 30,
+128,193,157,176, 77,155,214,135, 36, 18, 86,170,171, 11,207, 95,177,252,203,151,215,174,122,190,117, 81,209,133,246, 17,173, 34,
+117, 82,117,100,201,242, 37, 95,239, 7, 96, 46,169,208,226,200,217, 82,240,188, 4, 39,138,106,209,255,246, 81,252,153,188,105,
+125, 1,172,161,239,114, 45,255,178, 40, 46, 66,189,101,203, 22,159,142,214,174, 93,187,192,243, 60, 20, 10, 5,102,207,158,237,
+147, 84, 20, 6,162, 91,228, 79,204,136,139,163,251,114,159, 4, 65,112, 46,244,238,190,253,223,255,253, 31, 94,122,233,165, 70,
+215,112,136, 13,198, 31,167,183,240, 37, 38, 37,161,188,172,172,209,190, 64, 22,165,183,219,237,224,121, 30, 11, 22, 44, 64,102,
+102, 38, 86,175, 94,237,243,243,142, 59,238, 0,203,178, 36,144,244,236,211,167, 15, 44, 22,139, 51,204,167, 78,157,242,200, 59,
+111,222, 60,127,193,188, 11,192,148,238,221,187,107, 6, 13, 26,132,156,156, 28,220,127,255,253, 38,139,197,146, 7, 0,119,222,
+121,103,234,220,185,115,101, 7, 14, 28, 64, 68, 68, 4,127,254,252,249,255,129,118,144,167,104, 97,120,210, 34,226, 51, 47, 43,
+ 43,107,186,187,136,113,133,248, 63,195, 48,171,103,204,152,145,233, 42,138, 92,127,139,174,147,155,136, 75,115,117,164, 92, 69,
+148, 55, 1,229,246,188,117, 61,190,194,163,208,114, 68,108,160,171, 11, 36, 86,190,254, 68,150,143, 55,199, 70, 8, 9, 9, 25,
+126,239,189,247, 58, 69,142,209,104,116, 10, 44, 81,100,137,191,115,115,115,209,179,103, 79,105, 72, 72,200,240,170,170,170,143,
+ 3, 16,113,136,139,139, 67,101,101, 37,142, 30, 61,138,196,196, 68, 88,173, 86,172, 95,191, 30,181,181,181,224,121, 30, 82,169,
+ 20, 22,139,207,190,219,232,212,169,211, 29,139, 23, 47,238,185,104,209,162, 75,226, 27,221,146, 37, 75, 64, 8, 65,100,100, 36,
+244,122, 61,202,202,202,176,121,243,102,216,108, 54,168,213,106,164,164,164,200,238,185,231,158,190, 83,166, 76,225,125, 8,173,
+ 62,247,223,127,127,136, 70,163,193,139, 47,190, 72, 44, 22,203, 12,199,190,201,227,198,141,139, 40, 44, 44, 52, 63,249,228,147,
+123, 45, 22,203, 71,162,153,232, 42,112,188,220, 88,175, 78,150,213,106, 21,211,180,160,190,190, 30,173, 90,181, 74,116,117,182,
+188,137,193, 29, 59,118,244, 1, 32,153, 58,117,106, 16,128, 50,215, 48,152,205,102,212,215,215, 67,167,211, 89,107,107,107,203,
+ 95,123,237, 53,219,210,165, 75, 37,142,115, 78,120, 18, 90, 12,115,135, 89,163, 81,202, 8,145,188, 53,127,254,124,245,176, 97,
+195, 88,181, 90,141,186,186, 58,205,175,235,214,169, 7, 15,234,155, 50, 61,235,195, 13,154,132,174,101, 59, 14,231,227, 66,105,
+ 45,204, 86, 43, 82, 98, 67, 26,252, 48,138, 22,135, 99, 32,139,211,209,114, 21, 21, 57, 57, 57,184,253,246,219,157,101, 93, 42,
+149, 54,114,190,252,113,114, 28,135,219,111,191,253, 50,135,103,203,150, 45, 30,221, 39,127,112, 21, 69,238,226,200,147, 0, 99,
+ 89,214,239, 2,235,162,155,231, 73,108,185,186,250,110,226,205, 95, 51, 7, 56,142,195,184,113,227,192,243, 60, 94,127,253,117,
+112, 28,135,244,244,116,112, 28,135,140,140, 12,240, 60,143, 91,111,189,181,201,113,223,189,123, 55,186,119,239,238, 12, 83,122,
+122, 58,122,245,234, 5,142,227,208,175, 95, 63,240, 60,143,161, 67,135, 6,194,249,102, 93, 93, 93, 55,181, 90,141,220,220, 92,
+ 72, 36, 18, 48, 12,115, 26, 64, 55, 0,136,141,141, 61,163, 6,111,130,189, 0, 0, 32, 0, 73, 68, 65, 84,215,235,219, 26,141,
+ 70, 60,245,212, 83,140,217,108,238,250,250,235,175,191,101, 52, 26,169,208,162,104, 49,184,107, 17, 23, 24, 38, 76,152,240, 38,
+195, 48,171, 69,135,202,221,121,242,244,219, 67,221, 36, 58, 80,251, 28,101,181,151,155,136,171, 96, 24,102, 31, 33,228, 78,111,
+231, 2, 48,187, 9,171, 70, 77,135,174,205,134,126, 29, 45,177,242, 13, 84,104,249,131,209,104,188, 49, 42, 42,202,171,200,114,
+253, 52,155,205, 72, 78, 78,134,209,104,188,177,169, 15,141,216,216, 88, 88, 44, 22,124,249,229,151,144, 74,165,144, 74,255,208,
+ 23,102,179,111,179,232,248,241,227, 5,187,119,239,238,222,163, 71,143,176,159,126,250,169, 98,192,128, 1,145,195,134, 13,131,
+ 66,161,128,193, 96,128,213,106, 69,239,222,189,209,169, 83, 39, 20, 23, 23,227,215, 95,127,173,236,208,161, 67,171, 61,123,246,
+ 8,165,165,165,231,124, 80,223, 54,120,240, 96, 48, 12,131,117,235,214, 85, 2,216, 39,151,203,215, 78,155, 54, 45,204,108, 54,
+ 11,163, 71,143, 62, 95, 93, 93,253, 18, 0,139, 76, 38,155, 51, 96,192,128,140,236,236,236,111, 5, 65,152,221,212,140,234,158,
+182, 58,157, 14, 65, 65, 65,129, 76, 37,193, 87, 87, 87,119, 1, 0,149, 74, 21, 14,224,140, 51,135, 27, 12,141,196,176,217,108,
+ 54,134,135,135,171, 0,192,113, 14,239,133, 51,210,102,195,138,115,231,242,131, 93,251,207,133,134,134,226,145,135, 31,102,111,
+233,211, 71,214,237,198, 27,135,190,253,201,162,239,227, 34, 52,230,148,184, 8, 88,237, 86,100,111, 88, 47, 16,193,186,129, 86,
+ 59,127,142,208, 18,197,134,187,163,197,243, 60,182,110,221,122,217, 62,169, 84,138,255,254,247,191, 1, 9, 3, 81, 84,121,107,
+ 58,115,107,234, 98,252, 9, 24,158,231, 33,145, 72,176, 96,193, 2, 8,130,128,151, 95,126,185, 81,115,162, 43,127, 64,118,158,
+139, 8,236, 52, 89, 0, 96, 70,241, 76,185,243,124,247,240, 58,206, 9,200, 37,155, 59,119,110, 64,142,214,157,119,222,233, 87,
+184,186,182, 48,184,134,235,208,161, 67, 30,121,231,207,159,239, 55, 61,237,118, 59,214,172, 89,227, 20,169, 34,222,126,251,237,
+167,100, 50, 89,244,182,109,219, 80, 90, 90, 10,157, 78,135,250,250,122,244,238,221, 59,133,101,217,195,165,165,165,133, 39, 78,
+156,184,151,150, 30,138, 63,209,209, 50,205,152, 49,227,216,140, 25, 51, 60, 58, 86,238,206,146, 47,231, 73, 20, 88, 14, 65, 20,
+ 41,138, 55, 52,116,171,217,231,239, 92, 0, 50,247,166, 67,159, 70,144,155,138,156,226,169,242, 13,164,249, 48, 64, 59,157, 99,
+ 24, 6, 70,163,209,163,192,114, 21, 7, 22,139, 5,213,213,213,176,219,237, 87, 60,215,151,167, 55, 89,127, 66,235,232,209,163,
+255,122,252,241,199, 75, 66, 66, 66,186, 85, 84, 84,148, 11,130,112,235,174, 93,187, 34, 57,142,131, 70,163,129, 70,163,193,218,
+181,107,161, 84, 42, 49,110,220,184,114,187,221,158, 19, 28, 28, 28, 97, 48, 24,126, 47, 45, 45,125,219,171,130,225,249,161,253,
+250,245,195,129, 3, 7,112,233,210,165,141, 0,210, 31,125,244,209,219, 91,183,110,205, 76,155, 54,205,120,246,236,217,217, 0,
+202, 85, 42,213,226,197,139, 23, 15,234,209,163, 71,240,232,209,163,177,117,235,214,249, 0,140,129,198, 89,167,211, 53, 18, 88,
+ 90,173, 22,117,117,117, 80,169, 84,182, 0,211,140,199, 31, 35, 12, 65, 8,113,222, 27,135,155, 37,222, 31,194,113,156, 56,170,
+209,155,200,130, 74,165,154,186,104,209, 34,133,251, 32, 5,187,221,142,178,178, 50,104, 52, 26, 76,122,251,109,233,123,227,255,
+221, 93,162,142,222,197,178, 12,204, 22, 82, 67, 4,243,122, 93,217,131,219,128,119,105,205,243, 39, 64, 20, 6,119,223,125,247,
+101,205,133, 82,169, 20, 27, 55,110,196,136, 17, 35,156, 47, 46, 61,122,244,240,251,114, 37, 10,131,187,238,186,203,233, 12,173,
+ 95,191,222, 99,179,159,232, 72, 5, 34, 8,197, 99, 95,120,225, 5,112, 28,135,207, 62,251, 12,175,188,242, 10, 88,150,197,204,
+153, 51,193,178, 44,222,121,231,157,128, 69,166,171,128, 41,252,176,225, 51,225, 21, 45,170,230, 69, 3, 0,130, 53, 26, 49, 66,
+ 77,170,123, 56,142,115, 58, 89, 55,222,120, 35,120,158, 71, 70, 70, 6, 56,142,115, 58, 89,195,135, 15,119, 77, 71, 18, 8, 39,
+199,113,200,203,203,115,134, 57, 35, 35,163,145,147,197,113, 28,238,188,243,206, 64,130, 57, 61, 52, 52,116, 74,167, 78,157, 58,
+207,154, 53,139,151, 72, 36, 24, 60,120,112,106, 76, 76,204, 57,155,205, 22, 49,117,234, 84,165,135,115, 20, 0,186,117,238,220,
+ 89, 69, 75, 13, 69, 11, 58, 90, 83, 60,252, 21,230,218,231,170, 9, 47,146,171, 93,143, 23, 57,220,197,145,195, 33,203,241,199,
+229,233, 92,127,224, 68, 5,233,203, 82, 15, 68,104, 57,108,103,159, 23, 83, 42,149, 71,202,203,203, 51, 20, 10, 69, 35,145,229,
+ 73,112, 73, 36, 18,148,150,150, 66,169, 84, 30, 49,153, 76,205,118, 19,253, 53, 29, 2, 48,158, 62,125,122,188,203,239, 33,195,
+135, 15,255,102,227,198,141,177,217,217,217,216,179,103, 15, 34, 35, 35, 49,119,238,220,139,101,101,101,255, 2,176,177,178,178,
+210,239,117,219,182,109,219, 69,173, 86, 99,199,142, 29, 0,176, 21,192,191,159,123,238, 57,198,106,181, 98,222,188,121, 58, 0,
+235, 66, 67, 67,215, 44, 95,190,188,123,183,110,221,100,217,217,217,218, 61,123,246,252, 22,160,200,178, 11,130,112,153,192,114,
+ 77,211,224,224,224, 64, 28, 45,107, 72, 72,200, 81,173, 86, 59,202, 96, 48,104,229,114,121,176, 86,171, 53,185, 10, 44,145,159,
+227, 56, 62, 47, 47,175, 4, 64, 74, 72, 72,200, 81,120,105,230,228, 56,110,240,224,193,131, 57,247,123, 80, 86, 86,134,210,210,
+ 82, 88, 44, 22,244,232,209,131,145, 48, 86,201,165,162, 35,110,211, 58, 80,145,245, 39, 57, 90, 68, 44,235,226, 40, 65, 79, 35,
+ 13,215,175, 95,239,252,205,178, 44,190,254,250,235,128, 68,209,198,141, 27,125,118, 88,119,107, 58,244,107,141,139,199,127,254,
+249,231, 32,132, 56,157, 44,150,101, 49, 97,194, 4,200,229,114, 76,155, 54, 13, 19, 38, 76, 0,199,113,126,155, 14, 93, 5, 76,
+210,235,122,215,151,163,134, 66,225,232, 15,197, 48,140,171,216, 98, 2, 21,111,190,220,188, 64, 90, 2, 92, 57,197,243,130,130,
+130,188,118,132,119,227,244,117,129, 95, 0,228,199,198,198,238,200,200,200, 8,217,191,127, 63,102,206,156, 41, 53,153, 76,109,
+178,179,179,157,215,245,148, 94, 58,157, 78, 65, 75, 14, 69, 75,184, 89, 62,254,174,112,235, 95,197,184, 54,227,249,248,116, 63,
+ 30, 46,251, 92,121, 43, 24,134,177,122,184, 94,133, 7,113,229,126, 13,215, 99, 42,188, 58, 90,254, 42, 11,127,130, 43, 16, 71,
+ 75,175,215,255,182,110,221,186, 94, 15, 63,252, 48,231,171,217, 80,167,211, 33, 58, 58, 26,199,142, 29,179,233,245,250,223, 2,
+112,202,154, 83,104,185, 35,187,188,188, 92, 98,181, 90,209,190,125,123,196,199,199,195,104, 52,162,166,166, 70, 2, 96, 99,128,
+ 28, 82,149, 74, 37, 1,128,154,154, 26,160, 97,168,105,106,135, 14, 29,112,224,192, 1, 84, 87, 87,255, 8, 96,216,148, 41, 83,
+122,244,238,221, 91,250,253,247,223,235,159,121,230,153, 31,173, 86,107, 64, 74, 67, 16, 4,179,205,102, 75,102, 89,214, 82, 83,
+ 83,115,193, 53, 61,163,163,163,195, 85, 42, 21, 83, 86, 86,102, 13, 68,104,117,235,214,109,239,249,243,231, 49,117,234,212,138,
+233,211,167,119,168,171,171,187, 84, 91, 91,107,115, 21, 91, 70,163,145,109,213,170,149,124,222,188,121, 10, 0,232,214,173,219,
+ 94,111, 66, 75,167,211,181, 86, 42,255,120, 49, 54,153, 76, 40, 45, 45, 69,105,105, 41,202,202,202, 80, 87, 87,135,148,148, 20,
+232,245,250, 68, 90,205,252,101, 66,171, 81,243,153,107,249,118,125,144, 55,165,172,187, 10,152,187,239,190,219,217,183, 75,116,
+200,196,109,197,138, 21,238, 29,204, 3, 18, 90,159,127,254, 57, 94,120,225, 5, 4, 5, 5, 97,214,172, 89,141,154, 14,221,197,
+129, 32, 8, 76, 32,113, 79,126,195,128,210, 57,225,224,121, 30, 17,207,148, 53,106,162,243, 32, 56, 2, 10,231,244,233,211,155,
+165,233,208,149, 51, 49,177,161,168, 44, 88,176, 0,163, 70,141,194,182,109,219,174,184,233, 48, 45, 45,109,201,234,213,171, 67,
+142, 31, 63, 14,173, 86,139,138,138, 10,152, 76, 38, 20, 23, 23,123,109, 21,112,212,229, 65,180,228, 80,252,201,245,212,190, 63,
+147,183, 57,175,199,249,121,128, 7, 44,180, 2,113,180, 76, 38,211,172, 23, 95,124,241,185, 33, 67,134,132, 7, 7, 7,163,164,
+164,228, 50,145, 85, 95, 95, 15,181, 90, 13,131,193,128, 85,171, 86,105, 77, 38,211, 44,127,226,192,106,181, 34, 42, 42, 10,149,
+149,149, 16,188,244,159,102, 89, 22, 10,133, 2,245,245,245,128,159, 78,230,158, 30, 24, 22,139, 5, 86,171, 21, 86,171, 21, 22,
+139,197,239, 91,178,187,153,167, 82,169, 68,225, 1, 0,186,184,184,184,246, 65, 65, 65, 40, 40, 40, 0, 26, 70,246, 13,185,253,
+246,219,249,170,170, 42,242,228,147, 79,110, 39,132, 60, 5,223,179,227,155,115,114,114,146, 1, 64,161, 80,228, 2, 64,113,113,
+177,181,166,166,166,145, 83,168, 84, 42,201,136, 17, 35, 98, 9, 33,200,201,201, 73,150, 74,165, 4,222, 71, 53, 26, 87,174, 92,
+121, 60, 36, 36,100,105, 86, 86,214,195,153,153,153,199,186,116,233,146,172,211,233,202, 13, 6,131,193,104, 52, 18,137, 68, 34,
+ 13, 11, 11, 11,218,176, 97,195,153, 93,187,118, 13,209,104, 52, 75, 87,174, 92,121,220,155,243,166, 82,169,138,245,122,125,146,
+120, 79, 93, 69, 86,105,105, 41, 8, 33,200,207,207,135, 82,169, 60,239,175, 89,151,162,229, 32,190, 84,185, 59, 47,238,251, 2,
+ 21, 89,174,194, 96,195,134, 13, 62,231,208, 10,148,211, 85, 20,189,242,202, 43,152, 51,103,206,101,142,214,180,105,211, 0, 0,
+111,191,253,118,192,125,180, 68,247,170,116, 78, 56, 98, 94,168,110, 20,118, 0, 96,196,240, 53,173,204,131,227, 56, 76,157, 58,
+245,178, 78,234,174, 77,123, 1, 54,241, 53, 10,103,121,121, 57, 56,142, 67,120,120, 56, 30,121,228, 17, 12, 29, 58,212,217, 4,
+217, 84,222,147, 39, 79,238,120,227,141, 55,186,166,165,165,225,253,247,223,175, 14, 13, 13, 13,254,207,127,254,195,213,212,212,
+ 48,190, 28, 45, 42,180, 40, 40,154, 65,104,137, 5, 44,208, 81,135, 94, 42,203, 33,104, 60,215, 70,173, 94,175,127,228,182,219,
+110,251,105,217,178,101,138,182,109,219,226,228,201,147,168,174,174,134,217,108,134, 84, 42, 69,108,108, 44,106,106,106,240,245,
+215, 95, 27,244,122,253, 35, 0,106,253,112,190,213,179,103,207, 47, 62,254,248,227,160,244,244,116, 84, 87, 87,163,190,190,222,
+ 41,132, 24,134,129, 70,163,129, 66,161,192,222,189,123,177,126,253,122, 3,128,183,252,112,122, 82,115,176, 88, 44, 78,193, 21,
+128,208,114,229, 84,137,174,142, 94,175, 7, 0,107,235,214,173, 99, 0, 32, 63, 63, 31, 0, 10, 83, 82, 82,166,180,109,219,150,
+ 89,188,120, 49, 33,132,172,247, 34,178,156,156, 12,195, 84, 19, 66, 46, 1,136, 49,155,205, 82, 0,168,173,173,181,180,106,213,
+ 42, 74, 46,151, 11, 10,133, 66, 8, 10, 10, 18, 74, 74, 74,108, 54,155, 77, 10, 0,253,250,245, 51, 3, 40,117, 91,163,208,149,
+ 83, 32,132,104,231,207,159, 63,101,244,232,209, 25,125,250,244, 73,123,246,217,103,143, 62,249,228,147,108,124,124,124, 88, 93,
+ 93,157,241,244,233,211,151, 62,249,228,147,186,221,187,119, 15,225,121,254,220,252,249,243,167, 0,208, 50, 12, 35,120,226,180,
+217,108,191,101,103,103,255, 43, 51, 51,147,187,112,225, 2,202,202,202,156, 34,171,172,172, 12,157, 58,117,194,174, 93,187,236,
+ 22,139, 37,187, 9,233,217, 92,160,156, 13, 47, 33, 68, 44,235,222, 4,150,248, 50, 21, 40,167,171, 40, 26, 53,106, 84, 35, 23,
+ 75, 42,149,226,135, 31,126,240, 88,111,120, 40, 87,141,226,238, 58,199,215, 27,111,188,209, 72,180, 77,154, 52,201,107,117,230,
+ 47, 61, 69,158,218, 5,241,141, 71, 29,122, 41,231,190,194, 41,214,157, 60,207, 99,210,164, 73, 1, 59, 90,184,188,143,214,101,
+156, 98,220, 7, 12, 24, 0,189, 94,239, 20,178,222, 28, 45,127,233,105,183,219, 95,152, 51,103, 14,209,104, 52, 55,107,181,218,
+ 71,207,159, 63,191, 80,175,215,223, 84, 91, 91,235,211,209, 50,153, 76,114, 90,142, 40, 39, 90,102,126,174,235, 71,104, 57, 30,
+146,104,221,186,117,163,181,179, 88,150,109,180, 53,165,159,129, 3, 27,242,242,242,238,187,229,150, 91,190,125,225,133, 23,130,
+211,211,211,249,164,164, 36,232,116, 58, 20, 20, 20,224,216,177, 99,182,149, 43, 87,106,245,122,253,163, 0, 2, 25,117,182,232,
+248,241,227,235,135, 13, 27,246, 78,239,222,189,159,158, 60,121,178, 36, 53, 53, 21,181,181,181, 8, 11, 11, 67, 84, 84, 20, 78,
+157, 58,133, 85,171, 86,217, 43, 43, 43,191, 0,240, 30, 60,180,161,250,123,225,183, 88, 44,120,232,161,135, 32, 8, 2,102,207,
+158,141, 64, 22, 84,118,129,197, 98,177, 16, 0,140,163, 63,151,222, 49,187, 52, 78,159, 62, 13, 0,231,146,147,147,131, 1, 32,
+ 59, 59,155, 65,195,252, 90,129,188,225, 19, 66,136,211,217,234,212,169, 83,129,123,229, 40, 58, 89,162, 11,230, 47,220, 12,195,
+ 24, 9, 33,229,122,189,126,216, 43,175,188,242,206,231,159,127,254,240,231,159,127,126,217,113, 26,141,102,233,204,153, 51,223,
+123,224,129, 7,202, 25,134,241,218,143, 76,167,211,189, 61,102,204,152, 7,142, 28, 57, 18, 28, 20, 20, 4,157, 78,135,170,170,
+ 42, 88, 44, 22,164,164,164,160,188,188, 28,139, 22, 45,170, 51, 24, 12,239,210,226,248,215,192, 85, 24,120,115,181, 2, 16, 89,
+ 94, 93,157, 95,126,249,197,227, 28, 85, 77,229,116, 23, 27,129,206,109,229,235,165, 72,156,150,198,211,148, 17, 77,172,215, 46,
+227,229, 56, 14, 31,125,244,145,115,210, 86, 79, 78, 86, 83, 28, 45,145, 51, 60, 60,188,193, 38, 87, 42, 33, 8, 2,238,188,243,
+206,171,225, 21, 0,140,115,153,241,125,250,107,175,189, 54,165, 83,167, 78,169, 0,228,174,105,208, 68, 23,159,130,130,194,159,
+208,178,219,237,197, 29, 59,118,108, 84,193,249, 91,204,212,106,181, 22, 7,120,221,245, 58,157, 46,101,230,204,153, 47,170, 84,
+170, 33,122,189,190,171,163,226, 56,162,211,233,178, 77, 38,211,167,104,218, 34,208, 21, 0,158,223,189,123,247,236, 97,195,134,
+ 77,187,245,214, 91, 71,142, 31, 63,158, 33,132, 96,222,188,121,228,236,217,179, 43, 28, 46,214,217, 43, 73,164,240,240,240,227,
+ 95,127,253,117,244, 79, 63,253, 4,171,213,138, 79, 63,253, 20,193,193,193,199,171,171,171, 3,165, 40,223,180,105,211, 55,125,
+250,244,121,108,215,174, 93,139, 0,252,190,117,235,214,133,125,251,246, 29,179,107,215,174, 37, 0,142,109,222,188,121, 97,239,
+222,189,199,236,219,183,111, 57,128, 67, 77,168,124,157,206,150,205,230,185,165,209,139,147,229,139, 83, 75, 8,177, 60,254,248,
+227,227, 31,120,224,129, 47,247,237,219,119, 83, 77, 77, 77, 87, 0, 8, 13, 13, 61,210,171, 87,175,189,203,150, 45, 59,229,112,
+178,252,117,214,175,208,233,116, 35,186,118,237,250,227,251,239,191,175, 74, 75, 75,227,218,183,111,143,194,194, 66, 28, 61,122,
+212,246,191,255,253,175,222, 96, 48,220, 13,224, 18, 45,142,127,157,208, 34,132, 32, 52, 52,180,209, 75,148, 56,228,191,169,205,
+133,174, 15,102,113,169, 30,119, 94,111,156,190,166, 77, 16,161, 86,171,157,147,155, 6,210,101, 65, 16,124,207,199, 70, 8,113,
+114,138, 91, 0, 34,203,239, 8, 65,199, 18, 56, 1,115, 6, 50,189,131, 74,165,130,213,106,117,242, 6, 48,242,179,169,106,241,
+ 23, 0,191, 88,173,214,211, 0,218, 81,113, 69, 65,209,130, 66,235,210,165, 75, 61, 91,248,218, 90,147,201,244,158,201,100,122,
+ 79,220, 97, 52, 26,175,150,243, 44,128, 7, 54,109,218,244,241,166, 77,155,196,118,132,169,240,191, 94,162, 79,156, 60,121, 50,
+147,231,249,255, 46, 93,186,180, 55, 33, 4, 33, 33, 33,187, 11, 11, 11,255,211, 20, 14,187,221,254,248,174, 93,187,158,131,163,
+ 47,147,197, 98,121,124,199,142, 29, 47,162, 97, 61, 38,216,237,246,199,247,236,217,227,252,221,196, 7, 37, 33,132,152, 8, 33,
+113, 94, 14, 49, 53,209,129, 19,157, 45,243,178,101,203,234, 1, 28,198, 31,243,100, 89, 29,155,209,173,185,208, 23, 54,235,116,
+186,246,147, 38, 77,154, 46,145, 72, 6,235,116,186,120,149, 74, 85,100,179,217,126,211,235,245,111,161, 97,141, 42,138,191, 8,
+102,179,249, 66,199,142, 29, 57, 79, 47, 80,190, 30,228,190, 94,172,236,118,123,113,135, 14, 29,252,190,156,121,224,188,224, 67,
+ 52,156, 75, 73, 73, 97, 3,229, 18, 97,177, 88,202,125,133, 51, 37, 37, 5, 77,229,244, 23,247,228,228,100,143,113,247, 35, 8,
+189,198,221,102,179, 93, 17,167,175,244,244, 5,131,193,112, 41, 50, 50,178,222,104, 52,242, 38,147,137,183,217,108,141,236, 71,
+133, 66, 81, 97, 48, 24,104,225,161,160,184, 26,161,245, 15,199,126, 52, 44, 47,209, 92, 48, 29, 57,114,228, 49,167, 61, 85, 94,
+126,165, 60,238, 74,178,222,207,239,166, 8,163,102,119,132, 28, 66, 74,223, 76,116,149,245,245,245, 79,138, 63,196, 62, 32, 20,
+127, 61,170,170,170,110,110,110,206,234,234,234,102,127, 81,171,172,172,204,104,129,184,247,188, 94, 57,125,161,164,164,228,102,
+ 63, 66,140, 22, 28, 10,138, 0,193,210, 36,160,160,160,160,160,160,160,160,104, 25, 48,104, 24, 57,224, 9, 77, 25, 77, 48,228,
+ 10,174,157, 77, 57, 41, 39,229,164,156,148,147,114, 82,206,235,142,211, 31, 55, 29,205,216,194, 2,140,114, 82, 78,202, 73, 57,
+ 41, 39,229,164,156,215, 31,231, 53, 9,218,116, 72, 65, 65, 65, 65, 65, 65, 65, 65,133, 22, 5, 5, 5, 5, 5, 5, 5, 5, 21,
+ 90, 20, 20, 20, 20,174, 72,109,221,186,245,137,212,212,212, 11, 0,198,182,240,181, 30,233,221,187,119,149, 92, 46,223, 0, 32,
+149, 38, 61, 5, 5, 5, 21, 90, 20, 20, 20,215,180,200,234,218,181,235,246,147, 39, 79,118,202,206,206,142,139,143,143,255,176,
+ 37, 47,214,179,103,207, 15,182,109,219, 22,190,110,221,186,219, 98, 98, 98,114,174, 80,108,165,182,105,211,230, 68,106,106,106,
+ 49,128, 71,154, 57,136, 99, 51, 50, 50,170,101, 50,217,122, 42, 4, 41,174, 3,116, 1,208,149, 10, 45, 10, 10, 10,138, 22, 20,
+ 89, 59,119,238,140, 48, 26,141, 56,121,242, 36, 42, 42, 42, 14,181,228, 5,115,115,115, 47,237,220,185, 19, 9, 9, 9, 88,178,
+100, 73,100,114,114,242,182, 38, 10,154,212,174, 93,187,110, 63,113,226, 68,167,236,236,236,248,168,168,168, 79,154, 51,124, 55,
+221,116,211,180,109,219,182,133,109,216,176, 97,104,100,100,228,149, 10, 65, 10,138,191, 51,228, 0, 30, 99, 24,102,111,151, 46,
+ 93,142,164,165,165,253,206, 48,204, 46, 0,163,112,237,206,221, 25, 24, 86,175, 94,189,117,245,234,213, 91,105, 30,161,160,160,
+104, 6,164,165,165,165,233,116, 58, 29,169,168,168, 32,159,125,246, 25, 9, 15, 15,183, 0,248, 13,192, 74, 15,219,155, 0, 52,
+ 1,114,107, 28,199,123,226,249, 45, 60, 60,220,242,217,103,159,145,252,252,124,114,252,248,113,146,154,154,106, 8, 80,208,164,
+118,237,218,181, 82, 12,243,218,181,107, 9,199,113,235,155, 51, 81, 52, 26,205,177,156,156, 28,114,246,236, 89,178, 97,195, 6,
+ 18, 29, 29, 93, 78,197, 22,197, 53,130, 36, 0, 31,168,213,234,234,187,238,186,139,124,245,213, 87,100,213,170, 85,228,199, 31,
+127, 36,179,102,205, 34,131, 6, 13, 34, 50,153,236, 2,128,215, 1,132, 94, 79, 90,132,113, 68,140, 0, 24, 8, 0,153,153,153,
+ 84,108, 81, 80, 80, 92, 45,118,234,245,250, 12,189, 94,143,186,186, 58,180,110,221, 26, 60,207,123, 60,176,188,188, 28, 59,118,
+236,192,184,113,227,142,151,150,150,246,135,239,117, 47,195,186,119,239,190,115,243,230,205,169,193,193,193,206,157,130, 32,192,
+ 98,177,192,106,181,194, 98,177,192,100, 50,193,100, 50, 65, 38,147, 65,161, 80, 32, 60, 60,252, 40,124, 55, 97, 56,221, 55,131,
+193,128,131, 7, 15, 98,244,232,209, 21, 85, 85, 85,253, 1,228, 54, 99,186,164, 70, 69, 69,229, 44, 90,180, 40, 50, 37, 37, 5,
+231,207,159,199, 19, 79, 60, 81,121,238,220,185,126,205,124, 29, 10,138, 63, 19, 19,238,187,239,190,105,209,209,209,108,151, 46,
+ 93, 16, 27, 27, 11,147,201, 4,131,193, 0, 66, 8, 56,142, 3, 33, 4,181,181,181,200,201,201,193,230,205,155, 77,151, 46, 93,
+250, 26,192,167, 0,242, 92, 68,214, 53,169, 69,156, 66, 43, 51, 51,147,161,121,133,130,130,162,153,112,164,182,182,182,139,201,
+100,130, 78,167, 11,232,132,252,252,124,140, 29, 59,246,120,105,105,233, 45,240,188,168,188,166,123,247,238,123,114,114,114, 82,
+141, 70, 35,180, 90,255,235,206,203,100, 50, 4, 5, 5, 33, 34, 34, 98, 23,128, 62,222,222,196,187,116,233,178,127,215,174, 93,
+225, 6,131, 1,135, 14, 29,194, 35,143, 60, 98,169,174,174,222, 14,192, 91,224,171,209,176,142,234, 57, 15,255, 37, 2,120,209,
+241,134,239, 9,170,200,200,200,190,139, 23, 47,150,182,109,219, 22,122,189, 30,163, 70,141,170,206,205,205,237, 5,160,128,102,
+ 29,138,127, 32,114, 79,158, 60,217,193,110,183,163,178,178, 18, 38,147, 9,122,189,222, 41,180, 36, 18, 9, 8, 33,176,217,108,
+206, 23,163, 3, 7, 14, 32, 59, 59,155,228,231,231, 79,118,148,165,107, 86,139, 80,161, 69, 65, 65,209, 18, 72,237,208,161,195,
+161, 95,127,253, 53, 72, 42,149, 98,213,170, 85,152, 60,121,178,181,186,186,122,155,187,120,137,142,142, 78, 91,184,112, 97,114,
+ 74, 74, 10,126,255,253,119,220,127,255,253,111, 1,152,238,129,243, 77,173, 86, 59,205, 98,177,224,208,161, 67, 24, 51,102, 76,
+ 65, 89, 89,217, 49,119, 17,147,156,156,220,239,147, 79, 62,225,123,244,232, 1,173, 86,139,145, 35, 71,234, 79,157, 58,213, 27,
+192, 49, 47, 97,253,164,186,186,250, 21,187,221,142,186,186, 58, 36, 36, 36, 64, 42,149,250,140,156,193, 96, 64, 82, 82,210,174,
+138,138,138,203,196, 91, 68, 68,196,166,243,231,207, 15, 82, 40, 20, 62, 57, 44, 22, 11,138,139,139, 33,147,201, 96, 50,153,208,
+174, 93,187,175, 1, 60, 78,179, 14,197, 63, 81,104, 29, 62,124,184,195,119,223,125,135,238,221,187,163,115,231,206,168,175,175,
+119,138, 46,179,217, 12,171,213,122,217, 73, 90,173, 22, 47,191,252,114, 30, 28,205,231,215,170, 22, 17, 59,166, 77, 17,219, 68,
+ 51, 51, 51, 7,208, 60, 67, 65, 65,113,181, 21,111, 94, 94, 94,250,144, 33, 67,182,173, 88,177,162,213,240,225,195,209,174, 93,
+ 59,254,222,123,239,141,212,235,245,131, 93, 15, 44, 43, 43, 11, 27, 51,102,204,254,162,162,162,100,199,174, 94, 94, 56,123, 5,
+ 7, 7, 35, 63, 63, 95, 20, 89, 61,225,214,204, 40,147,201,214, 31, 62,124,152,151,201,100,216,183,111, 31,198,142, 29, 91, 89,
+ 80, 80,224,175, 89, 46,212,108, 54, 67, 34,145, 0, 0,138,139,139,253, 70,238,252,249,243, 16, 4,193,228,233, 63,150,101,229,
+ 7, 14, 28, 64, 92, 92,156, 79, 14,150,101,221, 5, 93, 13,205, 54, 20,255, 80, 88,205,102, 51,122,246,236,137,130,130, 2, 28,
+ 56,112,192, 41,184, 42, 43, 43, 81, 82, 82,210,232,224,189,123,247,226,224,193,131,232,223,191,191, 59,207, 53,169, 69,156,202,
+113,245,234,213, 3, 28,145,219, 74,243, 12, 5, 5, 69, 51, 33, 53, 46, 46, 46,103,209,162, 69,145,177,177,177, 24, 52,104, 80,
+ 81,105,105,105, 27, 15,199,173, 36,132,220,157,159,159,143,182,109,219,174, 2,112,207,149, 28,147,152,152, 88,177,111,223,190,
+ 86,199,143, 31,199, 35,143, 60, 82,225,232,243,229,175,239, 83,114,167, 78,157,246,109,216,176, 33,156,101, 89, 28, 59,118, 44,
+144,166,195, 66, 52,244, 47, 57,231,225,191, 68, 0,147, 0,132,123, 57, 87,213,161, 67,135,190,251,247,239,151, 50, 12,131,194,
+194, 66,177,233,176,167,131,151,130,226,159,134, 17,113,113,113,255,123,238,185,231, 66,122,247,238,141,226,226, 98, 92,184,112,
+ 1,151, 46, 93, 66,122,122, 58,210,210,210,112,246,236, 89,172, 95,191, 30, 7, 15, 30,132, 92, 46, 71, 66, 66, 2,212, 75,191,
+195,127, 25, 28, 7,144, 70,181, 8, 5, 5, 5,197, 85,136, 45,169, 84,186, 62, 62, 62,190, 28,158,231,165, 10, 27, 57,114,100,
+137,221,110, 39,103,207,158, 37,104, 24, 61, 8, 47, 66,139,156, 61,123,150, 68, 71, 71,231, 3, 8,243,112,204,216,152,152,152,
+ 34,165, 82,121, 20, 77,156,214,161,125,251,246, 21,167, 78,157, 34, 69, 69, 69,100,221,186,117, 36, 34, 34,162, 37, 70, 4,166,
+118,236,216,177,178,174,174,142, 24,141, 70,146,147,147, 67, 18, 19, 19, 43, 64, 71, 30, 82,252,243, 17, 12, 96,106, 74, 74,138,
+241,227,143, 63, 38,235,215,175, 39, 11, 22, 44, 32,211,166, 77, 35,227,199,143, 39, 25, 25, 25, 36, 35, 35,131,140, 26, 53,138,
+188,242,202, 43,228,246,219,111, 39,106,181,186, 22,192,189, 52,233, 40, 40, 40, 40,154, 23,137, 0,102, 57, 4,213,202,145, 35,
+ 71,150,152, 76, 38,114,225,194, 5,242,195, 15, 63, 16, 52, 76,221,224, 9,111,150,150,150,146,210,210, 82,113,106,132,124,252,
+ 49,173,195, 87, 14,222,171, 18, 65, 73, 73, 73, 21,251,247,239, 39,133,133,133,100,237,218,181,196, 33,216,154, 13, 10,133, 98,
+131, 86,171, 37, 70,163,145,108,218,180,137, 78,239, 64,113, 45, 34, 10,192,220, 27,110,184,193, 58,123,246,108,178,114,229, 74,
+242,217,103,159,145, 17, 35, 70,144,215, 95,127,157, 60,248,224,131, 36, 50, 50,210, 4, 32, 11, 64, 8, 77,174,171, 7, 93,217,
+156,114, 82, 78,202,233,142,245,199,143, 31, 39, 34,236,118, 59,185,112,225, 2,217,176, 97, 3,137,137,137, 57,134,198,243,105,
+185,114,106, 58,119,238,124,242,212,169, 83,228,252,249,243,196, 98,177, 56, 57, 78,158, 60, 73, 0,108,109,134,112,166,198,199,
+199,151,111,217,178,133,156, 58,117,138,196,196,196, 20, 53,103,220,147,146,146,202, 43, 42, 42,200,166, 77,155, 72,100,100,164,
+ 63,145, 69,243, 18,229,252, 39,115, 38, 1, 88,220,163, 71, 15,251,156, 57,115,200,211, 79, 63, 77, 18, 19, 19,237,142,151,162,
+248,235, 73, 8, 93,223,179,180, 82, 80, 80,252, 21,144,239,222,189, 27,114,185,220,185,227,247,223,127,119,157, 71,203,219,188,
+ 13,218, 19, 39, 78,220, 50,124,248,240,109,115,230,204,233,236, 58,138,105,203,150, 45, 0, 96,106,134,176,229, 94,184,112,161,
+255,176, 97,195, 62,141,136,136,184,177,180,180,244,157,230,140,120, 97, 97,225, 43, 93,187,118,157, 94, 87, 87,167,213,235,245,
+163, 64,231,206,162,184,118, 81, 8, 96,244,129, 3, 7, 62, 60,112,224,192, 91, 0, 8,128,247, 1,156,184,222, 18,130, 10, 45,
+ 10, 10,138, 63, 27, 99,159,124,242, 73,247,206,226,251, 0,252,159, 15,145, 37,226, 82, 65, 65, 65,159, 59,239,188,243, 57, 52,
+ 30,157, 40,118, 78,111, 14,228,154,205,230,161,238, 35,165,154, 9, 75, 74, 75, 75,151,208, 44, 64,113, 29,225, 24,128, 7,175,
+231, 4,160, 66,139,130,130,226,207,198, 57, 0, 79, 92,197,249, 90,120,158,103,139,130,130,130,226,111, 7,186,168, 52, 5, 5,
+ 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20, 20, 20, 20, 20,255, 44, 48,240, 62,114, 32,187, 9, 60, 87, 50,162, 33,155,114,
+ 82, 78,202, 73, 57, 41, 39,229,164,156,215, 29,167, 63,238,108, 80,180,168, 0,163,156,148,147,114, 82, 78,202,249,207,230,100,
+ 28, 27,235,216,196,223,127,231,184, 51,127,227,184, 95, 47,156,215, 36,254,170,206,240,226,141, 16,208, 48,228,147,226,239, 7,
+215, 2, 66,232,125,162,160,160,104, 98,221, 33,113,121,216,218, 29, 27,254,134,117,137,171, 40, 16,174,242,185,212, 18,113,191,
+158, 57,175,121,161,117,163, 74,165,154, 44,147,201, 82, 24,134,177,235,116,186, 35, 38,147,105, 62,128, 93, 87,121,205,175,162,
+163,163,199, 86, 85, 85, 9, 44,203,130,101, 89, 48, 12, 3,150,101,193,243,188,161,182,182, 86,115, 37,164,145, 93, 70,188,202,
+ 49,204, 11,118, 98,159, 95,126,116,213, 52,127,251, 41,124, 23, 24,169, 84,122, 95,120,120,120,104, 69, 69, 5, 97,217,134,174,
+124, 18,137, 68, 92, 8,215, 86, 91, 91,251, 77,160,100, 97, 97, 97,123,195,195,195, 67,197,243, 25,134, 65, 85, 85, 85, 77,121,
+121,249, 77, 0, 16, 20, 20,180, 67,165, 82, 69,112, 28, 7,137, 68, 2,137, 68, 2,189, 94, 95, 85, 85, 85,117, 11,189, 21,255,
+ 76, 44, 95,190, 92, 50, 44,254,137,118, 28, 49,116, 99, 89, 18, 34, 8, 76,173,141, 81,252,190,254,194, 87,103, 2, 57,127,212,
+168, 81,118,154,138,127, 30,100, 50,217,236,232,232,232,127,215,215,215,235, 25,134, 33, 12,195,128, 97, 26,222,179,220, 63,237,
+118,123,113, 85, 85, 85, 79, 63, 15, 91, 94, 38,147,205,140,137,137, 25,163,215,235,245, 14, 62,143,188, 0, 96,181, 90,139, 43,
+ 43, 43,123, 6, 84,215, 71, 70,206, 87, 40, 20,143,234,245,122, 29,195, 48,130,235,127,132, 16,215,135,249,217,202,202,202,126,
+254,132,129, 76, 38,251, 52, 58, 58,250, 95,142,184, 59,195,121,181,113,143,142,142, 30,163,211,233, 2,226,244, 17,247,203, 56,
+ 91, 34,156,127, 83,206,107, 95,104,165,167,167,127,183,103,207,158, 14, 60,207, 3, 0,140, 70, 99,215,185,115,231, 62,246,198,
+ 27,111,100, 1,152,120,133,215, 91,216,175, 95,191,135,114,114,114,216,149, 43, 87,178,189,122,245, 2,195, 48,176,219,237,176,
+219,237,232,210,165,139,226, 74, 35, 18,162, 82, 78, 56,184,241,191, 65, 55, 14,121,242,133,114, 96,154,191,253,190, 4, 38,128,
+183, 1,164, 52, 49, 8, 21,142,116, 57,232, 69,108,236,100, 89,182, 73,156,130, 32,228, 95,186,116,169,143, 15, 1,211,236,156,
+ 14,145,117,127,191,126,253, 66,178,179,179,153,162,162, 34, 70,161, 80, 64, 16, 4,216,237,118, 88,173, 86,220,112,195, 13, 77,
+114, 66, 67, 67, 67, 53, 19, 38, 76,104,119,199, 29,119,224,135, 31,126,192, 99,143, 61,134,190,125,251,230,149,151,151, 3, 0,
+ 84, 42, 85,196,241,227,199, 59,132,135,135, 67,175,215,163,182,182, 22,183,221,118, 27,170,170,170,254,209,133,235,230,244,132,
+247, 25,150,113,206, 21, 69,108,246,234, 61,191,151,188,125,181,188,225,225,225, 7,229,114,121,180, 95,181,236,242, 32, 51, 26,
+141,101,213,213,213,221,253,156,146, 4,224, 46,137, 68,210,158,227,184,142, 0,146,108, 54, 91, 52, 0, 72,165,210, 50,137, 68,
+ 82,104,181, 90, 79,153,205,230,211, 0,126,129,143, 5,144,135,197, 63,209,142,177,233, 71,214,153,132,225,202,182, 89,169,250,
+179, 19,114,149,114,253,218, 97,241, 79,172, 8, 84,108,253,133, 72, 5,176, 12, 13, 11, 74, 63,141,134,121,128,174, 6,241, 0,
+238, 70,195,154,143,201, 22,139,165, 18,192, 1, 52,244, 67,201, 3,144, 24, 25, 25,185, 68, 16, 4, 83, 85, 85,213, 19,240,176,
+ 80,117,239, 30,173,247,179, 44,155, 32,122, 2, 2,177, 23,239, 62, 80,220, 44, 15, 40,150,101, 63,205,204,204,252,215,138, 21,
+ 43,148, 7, 14, 28, 80,118,238,220,217,249, 66, 36, 8, 2, 26,107, 23, 32, 57, 57,217,159,171,193,177, 44, 59,123,228,200,145,
+ 15, 47, 94,188, 88,121,238,220, 57,101, 92, 92,156,147,211, 85,108,137,136,139,139, 11, 52,239,127, 53,116,232,208,209,139, 22,
+ 45,226, 87,173, 90,165,104,213,170, 21, 34, 34, 34, 32,149, 74, 47, 59,246,150, 91,110, 17,252, 71,157,253,244,158,123,238, 25,
+253,253,247,223, 43,247,236,217,163,236,210,165, 11, 36, 18,201, 85,199,125,196,136, 17, 15,127,247,221,119,202, 35, 71,142, 40,
+219,183,111, 15,209, 84,112,231, 99, 89, 22,173, 91,183, 14,136,243,238,187,239,126,120,217,178,101,202,131, 7, 15, 42, 59,118,
+236,232, 76, 79, 66,200, 21,135,243,111,206,121, 93, 56, 90, 50,139,197,130,173, 91,183,130,101, 89,132,135,135, 99,236,216,177,
+216,184,113,227,132, 77,155, 54,173,190, 2,103,235, 43,135,200,226, 1,224,199, 71, 71, 32,159, 7,198,149,155, 33,149, 74,113,
+246,236, 89, 72, 36,146, 38, 91,139,114,185,124, 12, 33,100,146,254,194, 62,185,193, 96,133,177,100,191, 82,161, 80, 56, 31, 0,
+250, 18,199,254,139,251,149, 10,133,226,172, 68, 34,153, 90, 95, 95,191,208, 27, 95,251,246,237,191, 61,118,236, 88, 39, 79, 5,
+215, 23,244,122, 61,218,180,105,147, 88, 93, 93,221,222,211,255, 60,207, 39,156, 59,119, 46, 74, 38,147,129, 16,226, 44,196,238,
+159,226,119,139,197,130, 27,110,184,193,226,235,154,190, 56,109, 54, 27,130,130,130, 32,186, 81,102,179, 25,245,245,245,254, 56,
+ 25,169, 84,122,159, 40,178, 0, 96,233,210,165,136,137,137, 65, 84, 84, 20, 84, 42, 21, 20, 10,133,147, 51, 80, 72, 36, 18, 12,
+ 27, 54, 12,239,190,251, 46,178,178,178,240,218,107,175, 53,170,104,121,158, 71,120,120, 56,214,173, 91, 7,141, 70,131,196,196,
+ 68,136, 2,255, 31,109, 11,178, 76,248,174,253,231,157, 14,237,237,183,118,226,110,238,206,125,238,120, 84,130,101, 1, 65,104,
+120,116, 50, 12,136,205, 42, 92,218,127,164,228,157, 0,210, 51,174,176,176, 48, 42,208, 52,178,217,108,136,139,139,147,248, 57,
+108,120, 90, 90,218,143,207, 62,251,172,180,125,251,246,140, 84, 42, 5,199,113,224, 56, 78, 20,232,137,132,144, 68, 65, 16, 6,
+150,149,149,145,185,115,231,126,184,101,203,150,123, 1,172,245, 88,177, 16, 67,183, 58,147, 48,124,219, 33,220, 52,114,200, 27,
+ 88,183,124,194, 77,253,210, 5, 4, 43, 13,103, 0,252,157,133, 86,106, 90, 90,218,161, 61,123,246, 4, 89, 44, 22,244,238,221,
+123,119,110,110,110, 15, 92,217, 12,238, 97, 0, 62,153, 56,113,226,232,103,159,125, 86, 18, 26, 26, 10,153, 76,134,186,186, 58,
+156, 57,115,102,204, 55,223,124, 67,190,248,226,139,255, 3, 16, 92, 88, 88,152,177,119,239, 94, 12, 26, 52,232, 69, 0, 47, 95,
+174, 8, 36, 9, 59,246, 22, 68,137,191,239, 30,214, 85,154,209,147, 45,107,112,113,220,143, 38, 16,236, 66,241,222,195, 23, 2,
+ 17, 98, 31,142, 24, 49,226,145, 21, 43, 86,168, 1, 96,222,188,121,184,239,190,251, 16, 30, 30, 14,165, 82, 9,169, 84, 10,158,
+231, 27,125,250,121,216, 74, 0,124,248,224,131, 15,142, 92,188,120,113, 48, 0, 44, 94,188, 24, 35, 70,140, 64, 68, 68, 4,130,
+131,131, 33,147,201, 32,145, 72,154,156,152,225,225,225, 95,245,189,233,166,199, 23, 45, 90, 4, 0,120,235,165,151,112,199,205,
+ 55, 67,173, 84, 64,169,144, 65, 76, 11,153,132,199,237,227, 94,240,171, 47, 1,124,124,223,125,247, 61,240,253,247,223, 7, 3,
+192,129, 3, 7, 80, 94, 94,142,232,232,104, 40, 20, 10,200,100, 50,103,156, 25,134,129, 66,161, 8, 40,238,247,221,119,223,200,
+239,190,251, 46, 24, 0, 22, 46, 92,136, 97,195,134, 57,227, 46,151,203, 33,149, 74, 27,109,238,162,211, 19,231,189,247,222, 59,
+114,217,178,101,193, 0,240,205, 55,223, 96,200,144, 33, 8, 11, 11,115,166,167,200,213,148,123,244, 55,231,188, 62,132,214,161,
+ 67,135,238, 87,169, 84, 51, 0, 68,202,100,178,208,135, 31,126,184,245,227,143, 63,142, 7, 31,124, 16,155, 54,109,122,170,137,
+ 66,139,137,142,142, 30,155,147,147,227,124, 66,155,201,101,130,169,201, 15,112, 7, 38,237,127,234,169,152,172, 51,245,216,189,
+247, 20,130,192, 50,123, 63,254, 56,210,120,250, 52,236,102, 51,222, 59, 91,215,176,223, 70,152,173,175,140,139,185,113,246,255,
+ 77, 2,176,208,135, 11, 32, 55,153, 76,200,203,203,107, 82, 32,138,138,138, 32, 8,130,201,151,187, 32,149, 74,113,244,232,209,
+203, 84,189, 39, 36, 38, 38,250, 42,128,126, 57,215,175, 95,143,241,227,199,227,212,169, 83, 16,151, 42, 9,128,147, 9, 15, 15,
+ 15, 21, 69,150, 40,130, 20, 10, 5,120,158,103, 56,142, 99,196,166, 61, 71,225, 10, 72, 24,179, 44,139,111,191,253, 22, 31,124,
+240, 1, 94,127,253,117,204,159, 63, 31,221,186,117,251, 35, 19,114, 28,180, 90, 45,194,194,194, 16, 22, 22,214, 72, 32,254,147,
+225,126,155,103,206,154,163,132, 64, 26, 58,129, 16, 1, 16, 0, 2, 2,129, 8, 40,187,112, 6,147,223,253, 40,224,167, 15,207,
+243, 56,125,250,180, 51, 31,136,206,176, 40,140, 92, 93,131,164,164, 36,191,121, 73, 42,149, 78,249,249,231,159,101,223,126,251,
+ 45,190,255,254,123, 48, 12, 3,185, 92, 14,149, 74,133,208,208, 80, 68, 68, 68, 56,183,132,132, 4,230,127, 61,184,254,121, 0,
+ 0, 32, 0, 73, 68, 65, 84,255,251,159,180, 91,183,110, 83,180, 90,237, 90,207,247,156,132, 40,219,102,165,142, 28,242, 6, 0,
+ 96,228, 27, 4,151,242,166,221,200,214,188,243,119, 94, 68, 54,181,107,215,174,219,119,238,220, 25,164,215,235, 33, 8, 2,214,
+174, 93,171, 28, 50,100,200,182,130,130,130,126, 77, 21, 91, 73, 73, 73,171,118,238,220,121, 75,100,100, 36,106,107,107,161,213,
+106, 97,181, 90, 33,145, 72,144,152,152,136, 15, 63,252,144,185,231,158,123,158, 31, 51,102,140, 81,161, 80,136,206, 70,146,231,
+188,212, 56, 51,205,253,236,243, 80, 66, 26,242, 15, 17, 72,163,207,234,242, 66,188,244,202,228,128,194,216,186,117,235,167,127,
+248,225, 7,181,171,179,228, 42, 2, 92, 69,150,184,249, 17, 6,108,155, 54,109, 30, 95,178,100,137,147,179, 85,171, 86,224, 56,
+ 14, 60,207,131,227, 56,176, 44,139,109,219,182, 97,198,148,137, 8,139,140,195,156,207,230,249, 13,103,100,100,228,252, 97,195,
+134, 61,186,112,225, 31, 85,119,215,182,109,113,231, 45, 55, 35,170,149, 6,173,194,130, 27,210, 73, 96,240,251,169, 2,191,207,
+ 35, 0,108,235,214,173,159, 88,190,124,185,218,245,133, 80,140,171,248,242, 44,186,248,102,179, 25, 61,123,246, 12, 40,238,174,
+156,162,219, 38,138, 54, 49, 61,197,235,136,229,213, 79, 56, 31, 23,133,176, 67,112, 54,226,224,121, 30,203,215, 45,242,234,102,
+ 95, 41,103, 83,239,187, 59,103, 97, 97, 33,166, 79,159, 14,241,165,205,181,171, 80,124,124, 60,230,204,153,227,183, 94,114, 43,
+ 3,189, 0, 68,186,236, 50, 3,144,185,124, 86, 48, 12,179,207,195,113,226,126,222,209, 98, 21,137,134,126, 99,117, 0, 66, 61,
+240,121,227,169,116, 60,243, 34,221,142,111,116, 29,175, 66,107,245,234,213, 98, 41, 30,152,153,153,185,213,241,189, 70, 46,151,
+ 23, 41,149,202, 24, 0,117,107,215,174,197,127,254,243, 31, 56,172,213,187, 67, 66, 66,142,121,112,117, 14,153, 76,166, 55, 0,
+148, 57,118,137, 67, 52,217,234,234,106, 97,227,198,141,236,226,123,135,194, 76,128,244, 73, 51, 48, 44, 51, 19,235,227,101,144,
+ 0,184,233,100, 37,148, 74, 37,167,213,106,173,174,253,182, 60,244,221,202,118,203, 80,146, 32,142, 67,239,237,107, 48,126,251,
+ 26,220,164,146,161,106,197, 50,212,237,200, 1,203, 50,232,175,106,133,215, 30,217,136, 62, 26, 57,100, 38, 29, 88,150,245,148,
+179,157,156,121,121,121,163, 52, 26,205, 12,183, 4, 14, 4,249,104, 88,199, 9, 94,194, 9, 66, 8,186,117,235, 6,134, 97,156,
+110,129,184,137,133, 78,220, 14, 30,244,216, 2,233,149,211,209, 4, 7,149, 74,133,223,126,251,205,121,204,224,193,131, 97, 52,
+ 26, 17, 30, 30, 30, 16,103, 69, 69, 5, 41, 41, 41, 97, 22, 47, 94, 12,158,231, 17, 17, 17, 1,165, 82,201, 44, 90,180,104,162,
+ 84, 42, 77, 48, 26,141,130,217,108,134, 76, 38,155, 35,222, 31,142,227,116, 90,173, 54,194, 27,167, 68, 34,193,179,207, 62,139,
+ 87, 95,125, 21,243,231,207,199, 83, 79, 61,117,153,227,101, 52, 26,209,170, 85, 43,167,216,242, 80, 0, 91, 98,184,111,203,114,
+ 10, 4,199, 14,174,199,241, 35,217, 16,236, 2,236, 2, 1, 33,118, 8, 54,224,192,198,221, 29, 46,230,151,196, 19,144,134,174,
+183, 0,228,181,245,182, 1, 17,178,142, 0, 86,110,173, 50,207,246, 23, 78,142,227, 96, 52, 26,241,243,207, 63,227,228,201,147,
+ 88,187,118, 45, 12, 6, 3, 90,181,106,133,208,208, 80,220,124,243,205, 24, 51,102, 12,146,146,146,252,198,157, 16,178,176,168,
+168, 40,189,111,223,190, 76, 77, 77, 13,106,106,106, 96, 48, 24, 96,183,219, 97,179,217,192,113, 28,130,130,130,160, 80, 40, 16,
+ 29, 29, 13,163,209, 72, 76, 38,211, 66,111,156,130,192,212,234,207, 78,200, 93,183,124,194, 77, 35,223, 32, 88,241, 1,131,118,
+109,228,250,223,246, 7, 63,190,114,251,107,183, 1, 32, 2,113, 90, 11,196,106, 23, 42, 95,157,248,201,243,127,250, 61,186, 92,
+100, 69, 24, 12, 6,212,213,213, 53,216,250, 50, 25, 86,172, 88,209,234,174,187,238,202, 41, 41, 41,233,239, 67,108, 93,198, 25,
+ 28, 28,156, 40,145, 72,112,244,232, 81,124,241,197, 23,248,237,183,223, 80, 86, 86,118, 41, 46, 46, 46,100,224,192,129,236, 75,
+ 47,189,132,244,244,116,124,253,245,215, 65,254, 56, 9, 33, 40,204,219,134,194,211,219, 33, 8, 13,174,117,195,230,249, 59, 9,
+ 48,238, 58,157,206,120,232,208, 33,245,151, 95,126,137,168,168, 40, 36, 39, 39, 67,169, 84, 34, 40, 40,168,209, 67,214,245,193,
+235,175,108, 26, 12, 6, 99, 97, 97,161,250,187,239,190, 67, 68, 68, 4,146,146,146,160, 84, 42, 33,147,201,192,113, 28, 24,134,
+193,226,197,139,177,244,221, 71, 80,120,234, 8, 70,220,121,155,223,112, 42,149,202, 71, 23, 46, 92,216,200, 2,137, 14, 11, 3,
+199,179,144,240, 12,194, 6,223, 11, 0,184,180,233, 39, 95,179, 67,186,114, 50,117,117,117,198, 61,123,246,168,247,239,223, 15,
+ 65, 16,144,148,148, 4,189, 94, 15,141, 70,227,140,255,198,141, 27,113,207, 61,247,224,219,111,191, 69, 70, 70,134,223,184,215,
+215,215, 27,143, 28, 57,162, 94,178,100, 9,194,195,195,209,186,117,107,103,220,197,141,231,121, 72, 36, 18,164,164,164,160,182,
+182, 22,106,181,218,239, 61, 58,112,224,128,122,201,146, 37, 8, 11, 11, 67, 66, 66,130,211,113, 19,197,209, 7,159,191,219,136,
+ 32,136,137,189,106,206,166,222,119,119,206, 17, 35, 70,160, 93,187,118,208,104, 52, 80,169, 84, 78,110, 95,156, 94,180,136, 83,
+111, 51, 12,179,218,165, 76,100, 50, 12,179,218,245,211,219,113,142,175,253, 39, 78,156,216, 51, 43, 43,107,122, 70, 70,198,119,
+ 59,119,238, 92,234,141,207, 27,207,196,137, 19,211,178,178,178,166,187, 30,239,225, 58,222, 29,173,204,204, 76,198, 17, 73, 6,
+ 64,114,143, 30, 61,246,109,218,180, 41, 60, 56, 56,216,121,240,249,243,231, 81, 83, 83,131,224,224, 96,205,204,153, 51, 53, 3,
+ 7, 14, 68,116,116,180,243, 13, 32, 47, 47,239,134,212,212, 84, 45, 0,119,223, 86, 96, 89, 22,125,250,244,193, 49, 71,107,199,
+176,204, 76, 36, 36, 36, 56, 59,121, 4, 5, 5,225,249,231,159,103,198,143, 31,207,137,110, 6, 33, 4, 6,131, 1,177,177,177,
+ 10, 95,174, 14, 0,164, 25, 42,241,211,192,254, 96, 25, 64,127,112, 47,164, 50, 6,172,132, 65,119, 82,133, 95, 7,245, 7, 3,
+192,124,120, 23, 2,112, 97, 14, 2,184,173,101, 28, 14,130, 51,103,206, 4,228,104, 57,226,197, 92, 41,167,232,104,236,220,185,
+ 19,118,187, 61, 80, 78,194,178, 44, 84, 42, 21, 98, 98, 98,160, 80, 40,160, 84, 42,153,239,190,251,238,237,228,228,228,216,241,
+227,199,179, 90,173,150,237,211,167, 15,238,187,239, 62, 78,108,226, 76, 75, 75,243, 27,151,173, 91,183,226,139, 47,190,192, 83,
+ 79, 61,229,209,209, 98, 24, 6,145,145,145,208,104, 52,184, 86, 32, 0,176,216,172,208,215, 27,156, 77,186,118,187, 29, 71,182,
+ 28,238,144,127, 56, 47,109,245,119,223,242, 0, 96,220,242,147,235,105,177,247,125,190, 44,117, 64, 24,191,103,235, 37,235, 30,
+ 95,121,158,227, 56,140, 29, 59, 22, 89, 89, 89,120,244,209, 71,177,118,237, 90,188,243,206, 59,248,247,191,255,125,153,171,229,
+239,205,209,106,181,254,247,177,199, 30,123,106,197,138, 21, 29,223,120,227, 13, 86,116,180,148, 74, 37, 24,134,129,209,104,132,
+201,100,130,193, 96,192,169, 83,167,132, 39,159,124, 50,215,108, 54,255,215,107,115, 37,163,248, 93, 41,215,175,109,155,192,182,
+211, 21,124, 20,220,247,230, 36, 3,163,232, 81,123,111,234, 16, 50,124,108, 82, 24, 8, 1, 17, 0,129, 0, 38,147, 14,207, 63,
+255,162,228, 47,188, 85, 78,145,101, 52, 26,113,232,208, 33, 12, 26, 52, 8, 69, 69, 69, 56,113,226, 4, 58,116,232,128, 69,139,
+ 22, 69, 62,252,240,195, 57,229,229,229,253, 3,117,182,142, 28, 57, 50,241,198, 27,111,252,180,190,190,190,186,190,190,254, 83,
+ 0, 75, 1,212,156, 57,115,166,243,153, 51,103,230,174, 95,191,190,223,228,201,147, 37,110,125,116, 36,222,236, 81,171,213, 6,
+131,193,228, 83, 96,137,191, 9, 17, 2,138, 56,195, 48,164, 99,199,142,184,235,174,187,192,243, 60,148, 74, 37,212,106,117,163,
+102, 51,119,193,229,171,254, 0, 32, 48, 12,131,184,184, 56, 12, 31, 62, 28, 82,169,180, 17,167,152, 15,135, 15, 31,142, 23,222,
+155,132,255,190,112, 43,190,120,172, 3,134,188, 95,230, 51,156,122,189,190,126,243,230,205,138, 87,159,122, 10, 55,182,111,143,
+ 86, 26, 13,218, 68, 71, 66, 33,151, 65,234, 26, 38, 38, 32,147,157, 0, 16, 36, 18, 9,186,116,233,130,178,178, 50, 20, 20, 20,
+160,160,160, 0, 44,203,162,111,223,190, 78, 23,230,244,233,211,120,239,189,247, 96, 50,153, 2,142,123,251,246,237,113,235,173,
+183, 66, 38,147, 65,169, 84, 54,106, 50, 20,211,180,174,174, 14,237,218,181,195,202,149, 43,145,154,154,234,151,179, 83,167, 78,
+ 24, 48, 96, 64,163,244, 84, 40, 20, 78, 81, 4, 0, 69,123,234,157,215,136,143,143,111, 18,231,134,189,231,241,229,198,205, 48,
+153, 5,104,245,214, 70, 39,196,182,210, 96,251,146, 55, 2,138,187,200,185, 96,193, 2,212,212,212, 56,141, 3,241,165, 92, 52,
+ 81, 90,183,110,141,121,243, 60, 59,153,110, 90,196,211, 51, 47, 51,192,231,173,120,156,152,185,228, 89, 89, 89,211,221,207,247,
+199,231,250,191,219,249,102, 55,113, 86,214,164,166, 67,185, 92,254,230,230,205,155,195,107,107,107,113,250,244,105,176, 44,235,
+108, 83,231, 56, 14, 22,139, 5,103,207,158, 69,120,120, 56,202,203,203, 33,151,203, 33,145, 72, 96, 54,155, 1,160,187,183, 7,
+ 56, 33, 4, 47, 84, 52,116, 17, 90, 23, 39, 69, 33,128, 59, 43, 26, 10,134,216, 33,254,135, 31,126,128, 90,173, 70,112,112,176,
+243,211, 95, 51,210,145,130, 51, 40,227, 25,176,187,182,129, 97, 1,150, 1, 24, 9,192,178, 4, 44,195,128,221,149, 3,134, 1,
+ 84, 17, 97, 77,173,128,253,117,140,247,217, 1,222,155,251,228,201,197,114,255,190,101,203, 22, 4,202,217,174, 93, 59,168,213,
+106,231,182,126,253,250, 70,142,150,221,110, 71, 68, 68, 68, 32,156,164,193,141, 16, 16, 21, 21, 5,158,231,153, 69,139, 22, 77,
+ 76,249,127,246,174, 59, 60,138,106,125,191, 51,219,119,147,108, 54, 61, 33, 33,148, 0, 82, 34, 77,225,194,165,151, 0, 66,104,
+ 34, 69, 46, 4, 17, 81,138,168, 40, 17,129, 31, 42, 32,161, 73,147, 42,200, 37, 32, 72,151, 46, 69,164,131, 5, 20, 36,129, 64,
+ 8, 9,164,111,234,246, 50,237,247, 71,118,227,102,179, 73, 54, 33,194, 5,231,125,158,121,118,167,189,115,206,156, 51,103,222,
+243,157,239,124,211,176, 97,200,244,233,211, 73,129, 64,128,235,215,175, 35, 33, 33, 1,245,235,215,119,219,103,171,168,168, 40,
+235,147, 79, 62, 97, 62,249,164,100, 14, 69,100,100, 36,138,138,138,114,237,251, 53, 26, 77,126,159, 62,125,202,248,109,228,229,
+229, 61,219,158,240,182,251, 72, 91,105, 24, 76, 38,232,180,134, 82,235, 80,110,102,142,234,227, 15, 63, 16, 45,155,250, 6, 0,
+224,195,149,107,160,221,248, 87, 67,118,224,195, 81,129, 67,191,220, 53, 19,192,224,202,248,117, 58, 29, 76, 38, 19, 34, 34, 34,
+112,249,242,101,104,181, 90,244,235,215, 15, 4, 65,148,206, 16,173, 6, 44, 25, 25, 25,157,162,163,163,127, 93,177, 98, 69, 68,
+243,230,205, 9,189, 94, 15,131,193, 0,199,223,155, 55,111,114, 59,119,238, 76, 49, 24, 12,255,182,153,206, 93,226, 68,198, 55,
+201,125, 67,223,220,251,227,117, 65,116, 96,163, 36,101, 70, 97, 4,157,159, 33,213,107,140,119, 76, 12,151, 0,142, 1, 24,176,
+224,104, 22,140,109,216,235,105, 65, 46,151,127,117,241,226, 69, 63,147,201,132,107,215,174, 97,204,152, 49,150,188,188, 60, 9,
+ 0,252,231, 63,255,177,108,223,190, 93,210,168, 81, 35,108,219,182, 45,224,213, 87, 95,221,163,215,235, 95,116,147,250,219,172,
+172,172,111,157, 55,250,249,249,173,126,248,240, 97,119, 71,159, 31,154,166, 75,147,227,242,193,100, 1,138,162, 96, 52,154, 81,
+ 92,172,133,197, 74,217,218, 76, 22, 12, 67,219,126, 89,208,182,118, 84, 34, 22,122,181,125, 49, 88,199,113, 28, 72,130, 40,186,
+246,103,118,221,202, 68,187,171, 33, 46, 55,173, 89,206, 96,236,179,204,252,252,252, 32, 18,137,240,237,183,223,226,198,165, 19,
+144, 8, 56, 48, 52, 5,154,178,130,161, 44, 16, 9, 4,248,241,250, 3, 68, 53,243,114, 75, 16,250,251,251, 99, 64,199,142,136,
+238,216,177,100,122,155, 80, 8, 79,169, 20, 10,177,172,196,146, 5,128, 99, 72,119,131, 8,176,246,116, 6, 5, 5,225,183,223,
+126,195,180,105,211,176,120,241, 98,200,229,242,210,217,207,183,111,223,198,238,221,187, 17, 21, 21, 85,237,188,219, 45,120, 51,
+103,206, 68,102,102, 38, 86,174, 92,137,151, 94,122, 9, 34,145, 8, 69, 69, 69,248,247,191,255,141,156,156, 28,183, 56, 29,135,
+247, 36, 18, 73, 25,235,147, 93, 0, 86,183,140, 28, 57,223, 24, 18,130, 67,151,118,130, 0,129,171, 59, 62, 40, 35, 10,215,239,
+186, 80,109,206,185,115,231,150, 73,167, 59,214, 44,119,225,100,117,170,242, 56,130, 32,174,217,141,173, 51,103,206,156, 69, 16,
+196,145,153, 51,103,206,138,139,139,187,229, 14,159,171,253, 4, 65, 28,181,137,176, 1, 14,219,174, 85, 75,104, 41, 20,138,246,
+158,158,158,184,119,239, 30,250,245,235,103,201,207,207, 79, 18,137, 68, 77,242,242,242,164,185,185,185, 48, 24, 12,186,249,243,
+231, 63, 0, 32,239,208,161, 67,163, 31,127,252, 17,143, 30, 61,194,246,237,219, 1,224,128,107,159, 13, 18, 44,203,150, 86, 10,
+231,110,155, 64, 32,192,149, 43, 87,112,229, 74, 89,215,175,205,155, 55, 87,249,194,120,245,251,195,184,126,253, 58, 28,195, 3,
+216,255, 59,110,147,201,100, 64,229, 51, 60,202,160, 42,199,248,170, 28,224, 93,193, 93,223, 47, 87, 51,115, 42, 66, 70, 70, 70,
+133,231, 95,185,114,165,140, 69,171, 42, 78,129, 64, 0,134, 97, 32,151,203, 9,177, 88, 76,136,197,226, 48,187,200, 18, 8, 4,
+165, 15,140, 84, 42,133, 84, 42, 45,211, 75,173, 8,153,153,153, 61, 50, 51, 51, 43,220,175, 86,171, 59,169,213,106, 60,143,176,
+ 82, 20,140, 6, 11,180, 58, 35, 62,143,251,111,201,198,207,241, 51,128,159, 59,189, 51, 13,147,251, 70,245,172,238, 48,181,253,
+126, 7, 6, 6,226,220,185,115, 32, 8, 2,123,246,236,129,183,183, 55,250,246,237, 11,165, 82,137,153, 51,103, 98,248,240,225,
+213,109,204,138,243,243,243, 59,189,255,254,251,191, 46, 93,186, 52,188,110,221,186,176, 88, 44,176, 90,173,176, 88, 44, 72, 78,
+ 78,198,206,157, 59, 31, 25, 12,134, 78, 0,138,171, 34, 59,145,241, 77,242,254,243, 31,102,246, 30,249,170,241,118,206, 15,200,
+206,206, 7, 77,103,128,101,104, 88,105,166,196,194, 71,211,160,105, 6, 98,177, 64,185,244,139, 15, 78,177,224, 64,146,132, 5,
+192, 43, 79,170,140, 84, 42, 85,164, 90,173,198,221,187,119, 17, 19, 19,147,157,159,159,159, 8,160, 23, 0,228,231,231, 95, 28,
+ 51,102, 76,243,248,248,248,224, 6, 13, 26,192,211,211, 83,169,215,235,171,162,244, 4, 48, 25, 64, 31,148,248,129,216, 81, 0,
+ 96, 62, 73,146,210,107,215,174,149,155,105,119,254,252,121, 0,248,217,117, 15,200,102,209, 50,153,160,206, 47,196,132,119,230,
+252,213, 51, 2, 87, 70, 92,112,224, 48,233, 93,200, 0, 32, 47, 39, 25,111, 76,152, 38,173,170, 67,224,234, 69, 88, 13, 31,157,
+ 50, 29, 53,123, 29,245,244,244, 44, 25,126, 59,184, 19, 71,191,124, 7, 96,172,224, 40, 35, 96, 53, 0, 86, 29, 88,139, 1,132,
+ 88, 14, 80, 70,183,132,150,167,167, 39, 60,229,114, 4,170, 84,224, 56, 14, 66,129, 0, 34,145, 16, 44, 5, 16, 12, 81, 42, 72,
+ 89,247, 2,131,148,118, 42,229,114, 57, 82, 83, 83, 49,121,242,100, 88,173, 86, 12, 25, 50, 4, 22,139, 5, 38,147, 9, 70,163,
+ 17, 13, 27, 54,132,193, 96,112,139,207, 62, 91,209,211,211, 19, 98,177, 24, 31,124,240, 1, 94,126,249,101,204,155, 55, 15,177,
+177,177,104,216,176, 33, 38, 77,154,132,157, 59,119, 34, 50, 50,178, 42, 94,206,177,140,236,247,211, 46,182, 28,135,248, 0, 84,
+187,140,156, 57, 9,130, 44, 35,216,236,203,123, 99,123, 85,155,115,209,162, 69, 80,171,213,229, 44, 89,246,255,161,161,161, 88,
+183,110, 93, 77, 71,134,236,214,163, 32, 23,251, 6, 56, 91,162, 56,142,107,103,243,157, 50,199,197,197,221,138,139,139,139, 38,
+ 8,226, 72, 92, 92, 92,116, 69, 22, 45, 87, 60, 46,246,187,253,210, 18, 58,141,141,118,119,220,105,191,209,190,190,190,130,240,
+240,112, 82,169, 84,162,168,168, 8, 1, 1, 1,156, 90,173, 30,169, 80, 40, 62,251,238,187,239, 26,233,116, 58,220,190,125, 27,
+171, 87,175,254, 25,192,170,202,132,214,177, 0,155,233,216,102,201,114, 92, 31, 56,112, 32, 26, 52,104, 80,198,154, 37,151,203,
+ 43,173, 60,246,125,118,139,144, 64, 32,192, 11, 47,188, 32, 79, 73, 73, 49,138,197, 98,132,133,133,201,179,179,179,141, 98,177,
+184,218, 51, 93,170,114,140,175,202, 1,222,149,240,105,215,174, 93, 25, 11,150,227,175,227,255, 67,135, 14, 85, 57,116,104,231,
+108,222,188,121,233,253,242,242,242,178,159, 11, 0,232,215,175, 31, 88,150,133,191,191,191, 91,156,118, 81,107,115,128,135,201,
+100, 98,181, 90, 45,121,237,218, 53, 72, 36, 18,120,121,121,149,250,234,200,100,178, 82,107, 38, 15, 87, 13, 2, 11, 11, 69,193,
+104, 52, 66,167,211, 1, 0,146,255,220, 87, 86,136,153, 53, 53,230,183, 55,176, 5, 5, 5, 56,113,226, 4,126,248,225, 7,188,
+252,242,203, 46, 69,117, 53, 4,151,186,160,160,160,243,140, 25, 51,174, 46, 88,176,160,142,175,175, 47,172, 86, 43, 30, 62,124,
+136, 45, 91,182,100, 26, 12,134,206,213,105, 96,192, 1, 20, 69,195,100, 48,163, 88,163,197,103, 95,108,173,176,234, 1, 64, 65,
+238, 29, 12, 28, 52, 92,242, 36,203, 41, 51, 51,115,122,231,206,157,191,208,106,181, 69, 6,131, 97, 56,128,101,142,253,169,252,
+252,252, 46,131, 6, 13, 90,225,235,235,251, 82,110,110,238, 44, 55, 40,103,166,166,166,206,170, 87,175, 94,153,141,102,179, 25,
+245,234,213,123, 33, 55, 55,119,116,215,174, 93,255, 15,128,175,195,110, 47, 0, 39, 1,172,171,168, 46,217,135, 14,117, 58, 35,
+148,170, 16,100, 60, 56, 87,101, 66,196, 2, 19, 56,150,173,180, 13,177,119,128, 43, 90,170,152, 25, 87, 46,169,246, 99,237, 47,
+236, 87,134,141,197, 43,147, 23, 65, 33, 2, 22,190,209, 9, 13, 85, 0,228,190, 16,119,253, 24,132,202,118,143, 38, 31,118,139,
+ 60,118,195, 6, 92,183,181,199, 97, 1, 1,152, 49,114, 36, 56, 10,184,156,144,128, 93, 63,253,132,145, 61,122, 64, 33,147,185,
+221, 97, 97, 89, 22, 98,177, 24,201,201,201,184,124,249, 50,154, 53,107,134,123,247,238,149, 9, 67,193,113,156,187,249, 47,205,
+187, 84, 42,133, 72, 36, 66,118,118, 54,162,163,163, 33, 22,139,177,117,235, 86,156, 59,119, 14, 51,102,204,192,248,241,227,209,
+189,123,119, 36, 38, 38,186,197,201,113, 92,185,217,138,206,195,185,213, 45, 35,103, 78,231,247,126, 77,202,221,206,185, 96,193,
+ 2,151, 19, 42,220,225,116,165, 69, 92,148,221, 53, 71, 49,100,183, 60, 57, 10, 35,231,117, 0, 62,246,109, 51,103,206,156,229,
+238,121,142,235,118,139, 88,117,134, 48, 75,133, 86,116,116,116,153,156, 23, 20, 20, 92,189,122,245,106, 11, 15, 15, 15,220,185,
+115, 71,162, 84, 42, 91,216, 27,116,146, 36,177,103,207, 30,175,254,253,251,159, 90,182,108, 89, 24,203,178,200,201,201,193, 71,
+ 31,125,164,163,105,122, 20, 0,186,162, 23,120, 85,150,169,195,135,203, 63,108, 7, 15, 30,116,107, 8,196, 46,164,132, 66, 33,
+124,124,124,140, 70,163, 17, 10,133, 2, 62, 62, 62, 70,131,193, 0, 15, 15, 15,251, 88, 49,137,191,102, 42, 84,101,125,170,202,
+ 49,222,217, 1,190, 74, 36, 36, 36,184,117,156,109,168,213,173, 90,158,154,154, 90, 97, 67,114,238,220, 57,176,182,134,214, 93,
+ 78, 91, 47,143,179, 11, 63,133, 66, 1, 95, 95, 95, 72,165, 82,200,229,242, 50, 34, 75, 42,149, 86,249,224, 84, 21,144, 84, 38,
+147,253,226,225,225,161,178,239, 23,137, 68,208,106,181, 69, 5, 5, 5,237,159,233,161, 67,112,160,173, 52,140, 70, 19,116, 90,
+ 99,173,243, 91, 44, 22, 72,165, 82,236,220,185, 19,157, 58,117, 66,135, 14, 29,202,137,172, 26,154,231,211, 11, 10, 10,186,175,
+ 90,181,234,231,229,203,151,251,232,116, 58,252,247,191,255, 45,214,233,116,221, 1,164, 87, 75,108,178, 28, 40,171, 21, 6,147,
+ 25,122, 93,201, 61,184,127,107,223,255, 90, 81,237,204,206,206,222, 89,201,254,251, 52, 77, 71,219,227,190,185,129,127,213,171,
+ 87, 15,217,217,217,101, 54,166,165,165,129, 97, 24, 51, 74,226,100,189,233,104, 72,198, 95,209,179, 43,234,197,151, 88, 71,141,
+102,232,116, 37, 86, 16,147, 62,175,118,234,169, 77,108, 84,228,147, 85,147, 58, 68, 16, 68,169,211,247,212,169, 83,113,243,198,
+ 13,244,170,163, 65,195, 96, 47,112,154, 12,136,123,126,138, 63,212,114, 44, 91,113,172,218,220,187, 29, 92, 32,150,237,222,237,
+114,223,253,193,131,171,149,247,164,164, 36,200,229,114, 48, 12, 83,238,125, 83,221,252, 59, 10,152, 21, 43, 86, 96,198,140, 25,
+216,186,117, 43,110,222,188,137,214,173, 91,163,119,239,222,200,205,205,197,141, 27, 55, 96, 54,155,221, 78,167,163,223, 92, 82,
+ 74, 2, 78, 95, 62,142,180,244, 7,200,204,126, 84,227,114,119,228,116, 22, 90,251, 79,255,142, 97, 81,109,107,196,249,217,103,
+159, 33, 55, 55,183,140, 37,203,177, 93,170,200,162,229,172, 69,156,144,231,228, 11,101, 95,183, 56,137, 30,231,117,231,227, 1,
+ 32, 23,128,160,138,243,156,215,243,226,226,226,206,218, 45, 97, 54, 94, 65, 85,254, 89,101, 44, 90, 78, 88, 52,120,240,224, 65,
+171, 87,175, 14,144,201,100,165, 51,144,102,206,156,137, 25, 51,102, 32, 34, 34, 2,254,254,254,161, 42,149, 10,249,249,249, 88,
+188,120, 49, 82, 83, 83, 39,194, 69,160, 61,103,161,213, 37, 69, 11,137,228,175, 14,171,221,178, 5, 0,227,199,143, 47,103,209,
+178, 23, 80,101,160, 40, 10,126,126,126, 48, 24, 12, 16, 8, 4, 24, 50,100,136,224,207, 63,255,100,250,246,237,139,161, 67,135,
+ 10,110,220,184,193, 12, 24, 48, 0, 2,129, 0, 61,123,246,212,236,223,191,255, 67, 0, 95,186, 33,182,106,205, 49,222, 94,201,
+220,141,125,228,142,184,172,140,147, 32, 8, 24, 12, 6, 8,133,194, 82, 71,121,119, 56,237, 67,135,142, 15, 32, 73,146, 80,169,
+ 84,165,141,135,221,162,101, 23, 90, 85,241, 86, 21,144, 84,161, 80, 40,239,220,185,211,200, 62,241, 34, 47, 47, 15, 61,123,246,
+188, 91, 80, 80,240,108,155,180, 88,192, 74, 51,208, 25, 77,208, 25, 13,181, 70,107,127, 30, 54,110,220,136,196,196, 68,152, 76,
+ 38,124,245,213, 87,165,147, 10, 28, 69,214, 99, 8,174,100,185, 92,206,246,235,215, 15, 87,175, 94,133, 84, 42,165, 80,131,248,
+ 87, 44,199,194, 74,211, 48, 25,141,208, 85, 61,228,246,188,160, 84, 85, 39, 38, 38,194, 98,177, 96,222,188,121,204,175,191,254,
+122, 22, 37, 1, 80,237, 22,188,209,221,186,117,155,239,225,225,161, 58,122,244,232,123, 0,182, 86,246,242,166,104,155,104,175,
+197,251,232, 56, 34,224,202, 39,171, 38, 97, 86, 28, 95,172, 44,203, 98,226, 91,111,161,119, 29, 13,134,190, 20, 0,125,214, 93,
+ 40,188, 3, 64,168,234, 99,217,138, 99,184,149,226,182, 43, 38, 7, 0,253,186, 13, 70,171,102,229,195,131,117,238, 85,210, 39,
+187,248,227, 47,200,201,203,172,118,222,245,122,125,133,150,171,106, 88,180, 74,159, 57,251,253,107,211,166, 13,154, 52,105,130,
+179,103,207,162,109,219,182,184,119,239, 30,238,221,187,135,212,212, 84,220,188,121, 19,133,133,133,213, 46,163,239, 79,238, 66,
+161,182, 0, 18,177, 4, 5, 69,121, 72,203,120,128, 32,191,224,199, 46,119, 59,154, 14,248, 12, 0, 80, 39,192,187, 90, 66,203,
+145,115,201,146, 37,229,196,251,227,134,236, 33, 8,226,151,202,214,171,123,254,147, 68, 69, 66,235,129, 90,173,238, 48,114,228,
+200,153, 0,218,217,182, 21, 3,216,125,234,212,169,193,129,129,129, 61, 58,118,236, 40,148, 72, 36,184,124,249, 50,246,239,223,
+191, 21,192,174,202, 46, 36,145, 72,140,245,235,215,151,219, 43,162,253, 65, 84, 42,149,130,197,139, 23, 19,155, 55,111,174,208,
+202, 85, 85, 1, 21, 23, 23, 67,175,215,195,219,219, 27, 86,171, 21,253,250,245, 99, 18, 19, 19, 33, 22,139, 49,104,208, 32, 38,
+ 33, 33,161,180,160, 55,109,218, 20,102, 52, 26,255,253,195, 15, 63,244, 1,208,181, 26,247,202,238, 24,239, 9, 55, 29,224, 43,
+234,229,185, 3,119,135,227, 42,226,156, 54,109, 90,141, 56,197, 98, 49,109,143,252, 78,146, 36,172, 86, 43,218,182,109,139,220,
+220,220,210,135,198,195,195,163, 84,100,185, 35,180,170, 10, 72, 42, 20, 10, 97,177, 88,208,181,107, 87, 16, 4,129, 53,107,214,
+ 60, 31,195,145, 44, 75,120,122,250,161, 78,157, 23, 16, 16,104, 2,203,214,238, 87,101, 98, 99, 99,203,136, 41, 87,145,151,237,
+247,191, 38,176,115,185, 51, 75,182,178,183,163,125,200, 75,175, 55, 61,115, 69, 24, 24, 24,216, 33, 55, 55,247,160,211,230, 2,
+ 0,243, 43,233, 88,150, 22,244,163, 71,143,208,183,111, 95, 28, 63,126, 92,112,224,192,129, 94,135, 14, 29, 74,184,123,247,238,
+163,182,109,219,214,125,251,237,183,165, 93,187,118, 69, 94, 94, 30, 94,122,233,165,207, 51, 50, 50, 42, 17, 90,182,251,104, 50,
+ 67,175,175,125,235,168, 43,107,214,227,188, 24,237,117,114,238,220,255, 67,239,144, 34, 12,105,237,141,248, 35,151, 48,186,141,
+ 28,176, 72,171,205,103, 79,139,111,157, 6,168, 31,217,161,220,126,169,178, 36,150,107,253,200, 14, 32, 31,221,171,118,222, 29,
+211,236, 44,170,106, 98,209,115,188,159, 19, 38, 76,192,199, 31,127,140, 62,125,250,224,222,189,123, 56,127,254, 60,238,221,187,
+135,105,211,166, 33, 50, 50, 18,173, 91,183,174, 22,231,161,211,123,161,209, 21,131, 36, 72, 20, 20,231,195,100, 54, 34,118,210,
+220,199, 46,247,210,151,255,233, 56, 0,192,190, 83,215,107,204, 57,123,246,108,100,103,103,151,177,100, 61,142, 95,214,179,142,
+202,162,165, 61, 0, 48,209,121,163,197, 98,241,154, 55,111, 94,148,191,191, 63, 8,130,192,138, 21, 43,224,235,235,219, 9,192,
+ 45,139,197,146,167,215,235,103, 56,136,144,222,176,197,218,200,201,201,113, 57,111, 95,175,215, 91,163,162,162, 68, 33, 33, 33,
+101,102, 27,122,120,120, 84,100,221, 41,229,180,239,163,105, 26,177,177,177, 88,184,112, 33,194,195,195, 49, 96,192, 0, 68, 71,
+ 71,131, 32, 8,244,235,215, 15, 3, 6,252, 53,148,171, 82,169,196,199,143, 31,239, 70,146,100,130,195, 11,164, 12,167, 43,216,
+ 29,227, 41,138,114,215, 1,190, 12,167,189,178, 77,155, 54, 13, 11, 23, 46,196,172, 89,149,187,122,108,216,176, 1, 40,239, 79,
+245,183,115, 22, 20, 20,148,105,236, 21, 10,197,154,161, 67,135, 10, 31, 61,122, 84, 70, 92, 57, 46, 46, 26,162, 50,156, 85, 5,
+ 36, 21, 8, 4, 8, 10, 10,194,130, 5, 11,224,231,231,135,224,224, 96, 87,129,252,170, 44,163, 26,224,111,229,100, 56,246,218,
+210, 69,255,215,249,191,219, 15,137,164, 18,224,202,249,125,208, 20,150, 29, 78, 50, 91,255,154, 74, 45,105,219, 11,150,235, 63,
+186, 85,151,236, 98,250,179,207, 62,195,103,159,125, 86,105,130, 54,110,220,248,216,121,119, 83,108,149,231,100, 57, 66,225,225,
+ 3,153, 71, 29,180,136,244, 1,203,209,255, 83,101, 84, 1,126,253,229,151, 95, 6,249,249,249, 33, 61, 61, 61, 64, 36, 18, 13,
+ 42, 99,174, 50, 26, 81,191,126,253, 23,212,106,245,191,171,226,156, 54,109,154,121,206,156, 57,210, 81,163, 70, 97,232,208,161,
+ 24, 53,106,148, 84, 44, 22, 55,230, 56, 14, 86,171, 21,233,233,233,248,241,199, 31,161, 86,171,111, 87,150, 78,150,227, 8,185,
+ 66, 5,153, 71, 8, 90,188,168, 2,203,210,181,146,119, 71,171,184,163, 53,171,154, 34,203,101,253, 4,128, 95,127, 60,136,185,
+ 31,188,136,173, 71,127,198,234, 95,128, 86,170, 92,180, 8, 80,131, 85,223,198, 71,163, 95,198,178, 29,191, 1, 0,206,159,171,
+178,140,184,202,234,160,201,104,125,172,188, 59, 90,174, 28,175,227,134,143, 86, 57, 78,123, 39, 81,171,213,162,168,168, 8,241,
+241,241,120,227,141, 55,144,155,155,139,212,212, 84,220,189,123, 23,223,125,247, 29, 20, 10, 69,141,202,232,195,183,102, 99,206,
+178,233,224,192,161,105,163, 22,152, 57,249, 51,180,107,213,241,177,203,221, 25,110, 88,179, 42,228, 92,185,114,101, 77,235,210,
+ 63, 78,104,185,132,191,191,255,168,110,221,186,193,100, 50, 33, 32, 32, 0,169,169,169, 32, 73, 50, 2, 40, 25,194, 11, 13, 13,
+221,173, 86,171, 35,220,229, 19, 8, 4,160,105,186,212,247,199,190, 0,192,192,129, 3,113,248,240,225, 42,123, 20,193,193,193,
+168, 91,183, 46,222,127,255,253,114,179, 28, 28,103, 58,200,229,114, 28, 61,122, 52,187,160,160,160,128,227,184,106, 77,115,179,
+ 59,198, 95,188,120,209,109, 7,120, 71, 88,173,214, 71,119,239,222, 13,217,184,113,163,160,146,151, 95, 41,206,159, 63, 79,163,
+138,161,154,191,131,211, 85,207,148,227,184, 10, 69,150, 59, 97, 4,170, 10, 72, 42, 20, 10,145,148,148,132,185,115,231,130, 32,
+ 8,236,219,183,239,185,120,184,254,188,147,191,153, 36, 73,159,129,175,116,110, 9,130,128,213, 82,126,164,218,179, 80, 87, 42,
+178,134,126,185, 11, 7, 62, 28,233,142,232, 73,190,112,225,130,239,198,141, 27,133,238,148,251,133, 11, 23,104,142,227,170, 61,
+236,103,127,225, 88,173, 86, 24,141, 53,179,162,112, 28,119, 57,238,139, 57, 81,219,190, 61, 38, 34, 8, 11,174,156,219,135,226,
+ 34,215,238, 12, 18,145, 16,155,227,247,211, 98,145,224,209, 83, 46,186,181, 67,134, 12, 25,245,213, 87, 95,181,112,181,211,141,
+ 73, 48,169, 38,147, 9, 25, 25, 25, 48, 24, 12,123, 63,249,228, 19,235,177, 99,199,222,124,245,213, 87,209,186,117,107,132,132,
+132, 32, 43, 43, 11,201,201,201,136,143,143,231, 46, 93,186,180, 23,192,148, 42,238,227,193, 69, 95,204,137,137,223,113, 76, 66,
+ 18, 86, 92, 57,191, 15,197, 78,162,189,188,117, 90,132,111,182,238,183,138,197,162, 59, 85, 89,139, 28,173, 89,181,249, 98, 28,
+ 52,102, 50,134,174, 90,141,136,118,125,177,104,113,111,124,243,197,112, 44,239, 39,134,117,207,104,180,122,109, 27,118,206,235,
+ 15, 0,168,243,141,155,214, 18,161, 24, 15, 93, 88,172,138,138,101, 54,113, 83, 61,171,169, 61,239,149, 89,174,170,107,209, 34,
+ 73, 18, 13, 26, 52, 64, 68, 68, 4, 58,117,234,132,182,109,219,162, 71,143, 30,184,113,227, 6,110,220,184,129,105,211,166, 85,
+ 38,178,170, 44,163,238,255,142,194,207, 93,238, 60,118,217, 56,151,123,109,192,157,186, 52,121,242,100, 0,248, 71, 89,183,170,
+ 45,180, 52, 26,205, 13,150,101, 91,122,123,123,219, 45, 82,165,251,210,210,210,192,178,172,161,186, 5, 99,177, 88,236,193, 49,
+203,196,101,178, 59,199, 87,246,224,115, 28,199, 20, 20, 20,160, 91,183,110,232,210,165, 75,233,240,137,227,226, 32, 76,112,224,
+192, 1,112, 28, 87,109, 39,107, 7,199,120, 29,170,233, 0, 15, 0,185,185,185,125,187,118,237,122, 74, 40, 20,186,245, 21, 77,
+150,101, 83,115,114,114, 94,121,210,156,174,202,135,101,217, 10, 69,150, 59, 13, 81, 85, 1, 73,133, 66, 33, 60, 60, 60,240,253,
+247,223,195,223,223,255,185,122,192,110, 36,170,151, 84,182,191,155,159,228, 28,128,128,161, 95,238,122,120, 46,223, 90,111,232,
+151,187,210, 14,124, 56, 50,188,178,115,178,179,179,251,140, 28, 57,242,184,187,229, 78,211,244,131,236,236,236,106,135, 75,224,
+ 56, 14,119,238,220, 97, 39, 76,152,144,167, 86,171,135,215, 36,255, 51,231,174, 94,190,240,243,169,126,253,162, 58,180, 3, 9,
+ 88, 42,118,254,229, 8,128, 19,138, 4,143,102,204, 90,249,214,240,225,195,159,102,177,105,178,179,179, 59, 13, 27, 54,108, 10,
+254,114,157, 40, 35,164, 80,193,236,106, 27, 86,213,173, 91,247, 69,129, 64, 32, 5, 48, 23, 64,218,165, 75,151,214, 94,186,116,
+169, 15,128,127, 9, 4,130, 16,134, 97, 50,108,157,158, 93, 0,254,168,186, 30,229,190, 13,142, 13,235,215,251, 95,125, 65, 16,
+156,197, 98,174,162,131, 4, 14, 28,199,137,197,162, 59,191,222,200,106, 85, 89, 71,202,225, 11, 28,181, 62,100, 63,101,202, 20,
+ 76,153, 50,165,180, 62,173, 89,211, 5,123,255,188,136,215, 90,165,195,252,117,103, 16,202,112,183, 59,124, 0, 48,251,255, 38,
+212, 90,218, 28,243,238,104,209,114,245, 28, 84,199, 71, 75, 32, 16, 32, 47, 47, 15, 73, 73, 73,200,201,201,129,193, 96, 64, 98,
+ 98, 34,172, 86, 43, 10, 11, 11,241,226,139, 47,214, 56,157,181, 85, 70, 79,147,243,159, 56,124, 88,109,161,101,181, 90, 63,109,
+208,160,129, 72, 38,147,181, 96, 24, 6, 28,199,129, 97, 24,206, 38,106,170, 61, 11, 79, 36, 18,153,154, 52,105, 66,184,154,157,
+ 96,255,239,225,225, 97,172,196, 90, 18, 87,191,126,253, 79, 8,130, 16, 84,212, 11,177,255,103, 89,150, 17, 10,133,113, 53,188,
+ 87,143,235, 24,175, 87,171,213, 29,107,185,252,254, 14, 78,231,242,209, 55,107,214,172,244,139,246,206, 49, 81,108, 31, 91,213,
+ 87, 33,206, 43, 13, 72,170,215,235,179,250,246,237,203, 56,238,119, 12,104,250, 92,131,224,210,250,143,122,179,222,185,124,107,
+ 61, 0,176,139, 45,112, 92, 90, 37,103, 25,179,179,179,187,253,221, 73, 75, 73, 73,177,252,235, 95,255,250, 86,171,213, 78, 6,
+ 80, 99,111,254, 89,159,174,153,245, 12,150,140, 6,192,194, 26,158,155,150,159,159,223,211,105,219, 31,118, 65,101,143,107, 87,
+109,209,126, 59,175,214, 99,139,209, 52,157, 30, 17, 17, 81, 45,203, 13, 69, 81,233, 85,237,119,142, 17,230,136, 91,240,198,172,
+171, 64,201,228,239,124,183, 56, 77, 38, 83, 65,199,142, 29, 69,213,204, 91,174,187,121, 15, 9, 9, 65,157, 58,117, 74,127,237,
+112,222, 94, 85, 58,105,154, 78, 15, 11, 11,131,191,191,127,133, 17,223,157,125,178,220,225,172,237, 50,170,140,179, 78,157,109,
+181,206, 89,211,116,242,112, 15,189,121, 78,158,147,231,124,102, 57, 5,252,253,228, 57,121, 78,158,243, 9,114, 62,151,224,189,
+212,120,240,224, 81, 17, 24,254, 22,240,224,193,131,199,227,129,168, 68,149, 86,103,166, 79, 77,148,237,105,158,147,231,228, 57,
+121, 78,158,147,231,228, 57,255,113,156, 85,113,215,246, 76,227,231, 26,188, 89,149,231,228, 57,121, 78,158,147,231,228, 57,121,
+206,127, 44,248,161, 67, 30, 60,120,240,224,193,131, 7, 15, 94,104,241,224,193,131, 7, 15, 30, 60,120,240, 66,139, 7, 15, 30,
+ 60,120,240,224,193,131, 7, 47,180,120,240,224,193,131, 7, 15, 30, 60,120,161,197,131, 7, 15, 30, 60,120,240,224,193,131, 7,
+ 15, 30, 60,120,240,224,193,131, 71, 9, 8, 0, 56,114,228, 72,233, 7, 1,163,163,163, 9,254,182,240,224,193,131, 7, 15, 30,
+ 60,158, 36,158,107, 45,226,152, 57, 30, 60,120,240,224,193,131, 7, 15, 94,139,212, 14, 72, 94,108,241,224,193,131, 7, 15, 30,
+ 60,120,177,197,103,140, 7, 15, 30, 60,120,240,224,193,139,172,103, 10,101, 44, 90,188,224,226,193,131, 7, 15, 30, 60,120, 60,
+ 77,177,245,140,106, 17,206,182, 56,174,243,224,193,131, 7, 15, 30, 60,120,240,120, 76,129, 85,217, 47, 15, 30, 60,120,240,224,
+193,131, 7,143, 90, 18, 92,246,255, 79, 76,104,241, 95, 54,231, 57,121, 78,158,147,231,228, 57,121, 78,158,243, 31, 11, 33,127,
+ 11,120,240,224,193,131, 7, 15, 30, 60, 30, 27,142, 86, 44,130, 23, 90, 60,120,240,224,193,131, 7, 15, 30,181, 39,178, 8, 87,
+235,252,183, 14,121,240,224,193,131, 7, 15, 30, 60,254, 38,240, 22, 45, 30, 60,120,240,224,193,131, 7,143,199, 3, 1,126,232,
+144, 7, 15, 30, 60,120,240,224,193,227,111, 21, 91, 46, 55, 86, 52,115,224,116, 53,200,107, 50,251,224, 52,207,201,115,242,156,
+ 60, 39,207,201,115,242,156,255, 56,206,170,184, 79,227,217, 67, 55, 0,103, 1,116,183,253, 86, 40,188,106, 27,252,212, 87,158,
+147,231,228, 57,121, 78,158,147,231,228, 57,159,119, 84, 24,168,148,119,134,231, 81, 21,132,168,124,136,185,170,253, 60,120,240,
+224,193,131,199, 63, 77,108, 17,225, 72,218, 0, 0, 32, 0, 73, 68, 65, 84,113,142, 47, 73, 87,104, 12, 96, 22, 0,111,135,109,
+191, 0,136,115, 58,110, 7, 0,133,195,186, 30,192, 60, 0,247,170, 76, 13,199,137,109,252, 82,219,194, 2, 48, 1, 48, 3,208,
+ 18, 4, 65,241,101,246,212,209, 17, 64,180,237,255, 17, 0, 87,170,185,255,185, 66, 72, 72,136,220,199,199,167,207,245,235,215,
+ 37,137,137,137,184,112,225, 2,183,121,243,102,107, 97, 97,225,201,172,172, 44, 35, 95, 93,158, 11,244, 5, 48,211,246,127, 17,
+128, 19,143,201, 71, 40, 20,138,105, 30, 30, 30,253,165, 82,105, 29,154,166, 9,131,193,144,169,215,235, 79,209, 52,253,165,173,
+221,171, 46, 6,251,250,250,190,217,180,105,211,198,169,169,169, 25,153,153,153, 59, 0,236, 1, 48,188, 78,157, 58,163,235,215,
+175, 31,122,231,206,157,123, 5, 5, 5,223, 0, 56,248, 20,211,201,131,199, 63, 9, 68,101,214, 8, 87,152,203,113,220,232, 50,
+ 12, 68,121,142,158, 61,123, 14, 58,121,242,164,130,101, 89,216, 23,185, 92, 78, 3, 24, 87,133,200,242,187,124,249,114,189,201,
+147, 39, 15,205,204,204,124, 89,171,213,182, 7, 0,133, 66,241,115, 96, 96,224,175,171, 86,173,250,142,227,184,116,130, 32,180,
+213,204,168, 80, 36, 18,189,225,227,227,211,159,166,233,182, 28,199, 65, 36, 18, 93, 47, 44, 44, 60, 65, 81,212, 55, 0,106, 34,
+222, 36, 66,161,112,138, 84, 42,237, 75,211,116, 75, 0, 16, 10,133, 55,205,102,243, 9,154,166,215, 2,176,212,128, 83, 38,145,
+ 72,166, 40,149,202, 40,139,197,210, 18, 0, 36, 18,201, 77,141, 70,115,202, 98,177,172,181, 9,206,167, 13, 33,128,104,142,227,
+ 68, 0, 32, 16, 8, 6,183,111,223,190, 30, 65, 16, 44, 65, 16, 28,199,113,196,207, 63,255,220,134, 97, 24,210, 86, 63,162, 1,
+252, 10,128,126, 22,159, 16,127,127,255,133, 44,203,214,169,180,208,100,178,151,175, 95,191,222,116,247,238,221,204,215, 95,127,
+ 93, 52,126,252,120,207,201,147, 39, 11,215,172, 89,179, 54, 43, 43,235, 61,231,227,253,252,252,150,147, 36,233,239,206,245, 89,
+150,205,203,207,207,159,254,180,242, 31, 19, 99, 42, 99,238,142,143,151, 53, 2,144, 94,195,250,253,247,113,154, 98, 56, 0,136,
+151,197, 55,138, 49,197, 36,219,255, 63, 46,175, 3,102,174, 59,173,237,202,113,192,148, 40, 47,242,113,133, 86,104,104,104,124,
+ 76, 76,204,168,150, 45, 91, 10, 57,142, 3, 69, 81, 48,155,205, 77,175, 92,185,210,125,223,190,125, 47,107,181,218,225,213,164,
+124,235,227,143, 63, 94, 48,127,254,124,127,145, 72, 68, 80, 20,213,104,247,238,221,109,223,126,251,237,247, 55,110,220, 88,119,
+196,136, 17, 94,246,237,115,231,206,109,183,104,209,162,134, 0,190,124, 10,233,228,193,227,159,134,110, 40,235,163,245, 57,128,
+207, 42, 19, 90, 30,182,151,103,142,205,146, 5,135,223, 82,156, 57,115,230,144, 80, 40,180, 91,180,218,235,245,250, 32, 39, 43,
+152, 43,145, 85,127,204,152, 49, 29,247,238,221,187,112,196,136, 17,217, 10,133,162,201,171,175,190,170, 37, 8, 66,176,123,247,
+238, 54, 17, 17, 17,242,129, 3, 7,142,233,217,179,231,135, 28,199, 93, 32, 8, 66,237,102, 38, 91,248,250,250,238, 95,178,100,
+ 73,189,190,125,251,138,253,253,253,193,113, 28, 50, 51, 51, 67,143, 30, 61,218,239,243,207, 63,255,176,160,160, 96, 8,128,132,
+106,220,184,118,114,185,124,239,231,159,127, 30,210,175, 95, 63, 97,112,112, 48, 76, 38, 19, 18, 19, 19,123,159, 56,113,162,235,
+198,141, 27,223, 51, 26,141,175,217, 4,134,187,104,239,237,237,189,239,191, 31,127, 28,212,225,141, 55,132,190,190,190,224, 56,
+ 14,106,181,186,247,197,109,219,186, 79, 90,178,228,189,226,226,226, 97,174,238,247,211,132, 68, 34, 33,183,111,223,222, 90, 34,
+145, 0, 0, 44, 22, 11, 34, 35, 35,137,231,229, 9, 33, 8, 34, 44, 51, 51,211, 91, 44, 22,187,220,207, 48, 12,186,118,237,218,
+ 64, 44, 22,227,203, 47,191,164,242,242,242,218,124,245,213, 87,215,119,238,220,233,191,118,237,218,215, 0,148, 19, 90, 36, 73,
+250,167,167,167,187,228,100, 24, 6, 86,171, 21, 52, 77,195, 98,177,160,121,243,230, 79, 53,255,241,241,178, 48, 0,211, 99, 98,
+ 76, 31,216, 54,125, 9,224, 67, 0, 41,168,225, 55,187,254, 6, 78,199,250,182,220,225,255, 99,167,213, 1,245, 0,224,216, 13,
+ 19, 0,248, 62,238,125,245,240,240,104,246,250,235,175, 11,213,106, 53, 68, 34, 17,172, 86, 43,178,179,179, 17, 25, 25, 41,248,
+246,219,111, 95,168, 46, 95,163, 70,141,198, 47, 90,180, 40,224,216,177, 99,214,237,219,183, 91,162,162,162, 68,227,199,143, 87,
+118,237,218,181,121, 88, 88, 24,185,101,203, 22,243,169, 83,167,168, 49, 99,198, 72,226,226,226, 2,142, 30, 61, 58, 48, 33, 33,
+225,203, 39,157, 78, 30, 60,254,129, 56,139,191, 66, 60,216,127, 43, 21, 90,112, 16, 87,131, 1, 64, 36, 18,181, 9, 10, 10,138,
+167,105, 58,216,102,213,201,206,201,201,249,146,162,168,223,109,199, 30,100, 89,118, 80, 85,150,172, 49, 99,198,116, 60,126,252,
+248,178, 43, 87,174, 20,231,231,231, 7, 31, 58,116,200,244,225,135, 31,166, 2, 64, 74, 74, 74,195,129, 3, 7,134, 78,157, 58,
+ 53,189, 79,159, 62,171,122,244,232,241, 46,199,113,167, 8,130,208, 87, 37,178, 34, 35, 35, 47,159, 63,127,222, 75,165, 82,149,
+217, 81,191,126,125,188,251,238,187,226, 65,131, 6, 69,244,234,213,235, 82,114,114,114, 23, 0,127,186, 35,136, 26, 55,110,124,
+250,204,153, 51,158, 62, 62, 62, 40, 42, 42, 66,118,118, 54, 12, 6, 3,148, 74, 37, 70,140, 24, 33,238,214,185, 83,221,169,211,
+222, 59,157,158,145,209,219, 77,177,213,190, 83,139, 22,167,119,198,197,121, 82, 15, 31, 66, 46,151, 67,167,211, 1, 0,188,188,
+188,240,114,131, 6,194,223,182,109, 11, 29, 29, 27,123,250,215,164,164,222, 79, 73,108, 73,109,191,102, 0, 71, 4, 2,193, 96,
+137, 68, 66, 14, 30, 60, 24,167, 79,159, 38, 76, 38,147,208,102,221,161, 7, 15, 30, 12,185, 92, 14,139,197,194,162,100,232,144,
+126,150,159, 18,137, 68,130,228,228,228, 50,219,180, 90, 45,212,106, 53,242,243,243, 97, 54,155, 81, 84, 84, 4,150,101, 9,185,
+ 92,174,102, 89, 22, 36, 73, 58, 11,128, 50, 16,139,197, 72, 74, 74, 42,179,141,166,105,232,245,122,152,205,102, 88,173, 86,104,
+181, 90,185,151,151, 87, 99,127,127,255,116, 0, 7, 11, 10, 10,190,204,201,201, 73,123,194,217,207,179, 11,162,248,120,217,125,
+ 0,146,255, 69, 78, 7, 75, 86,168,109,253,143, 90, 74,171, 29, 15,143,252,110, 10,183, 89,199, 30,212, 2, 31, 11, 0, 23, 46,
+ 92, 64, 78, 78, 14,242,242,242,160, 86,171, 17, 22, 22, 6,142,227,170, 61, 28,151,156,156,188,238,197, 23, 95, 36,110,221,186,
+117, 2,192,154,221,187,119,143, 43, 40, 40,152, 57, 99,198, 12,223,165, 75,151, 22,196,198,198, 46, 2,176,117,247,238,221,239,
+ 52,107,214,172,255,237,219,183, 55, 62,141,116,242,224, 81,219,224, 56,174, 29,128, 0,123,219, 98,107,119,253, 28,214,111, 16,
+ 4, 97,113, 56,206, 98,107, 27,156,127,237,176,175,171, 9,130,248,213,225, 60, 53, 65, 16,191,214, 52,153, 78,191, 37,157,110,
+ 0, 56,114,228, 8,103, 95, 92,157, 25, 24, 24, 56,173,103,207,158,203,174, 93,187,214, 60, 43, 43,203, 39, 43, 43,203,231,218,
+181,107,205,123,246,236,185, 44, 48, 48,112,154,195,141,112, 62,245,180,195, 62,241,229,203,151,235,237,223,191,127,209,233,211,
+167,139,219,180,105, 99, 57,115,230, 12,221,167, 79,159, 92,219, 11,154,238,211,167, 79,238, 79, 63,253,196,116,232,208, 65,126,
+252,248,241, 71,151, 46, 93, 90,190,119,239,222, 32,142,227, 4,174, 56,109, 16,169, 84,170,239,207,157, 59, 87, 78,100, 57,162,
+110,221,186, 56,114,228,136, 82,165, 82, 29, 4, 32,174, 40,157, 54,200,100, 50,217,190,159,126,250,201,211,203,203, 11,185,185,
+185, 16,137, 68, 8, 12, 12, 68,113,113, 49,178,179,178,144,118,247, 46, 72,139, 5, 43,190,152,239, 37,151,203,247,186,104,236,
+203,113,122,123,123,239,219,185,112,161,103,254,233,211,248, 99,193, 2, 88,173,214,210, 33, 87,171,213,138, 75,147, 39, 67,253,
+227,143,216, 50,119,174,167,183,183,247, 62, 0,178, 42, 56,107, 3,142,156,147, 1, 20,216,150,201, 0,174, 68, 70, 70, 94, 75,
+ 76, 76, 68,151, 46, 93,176,103,207,158, 86, 51,102,204,152, 60, 99,198,140,201,123,246,236,105,213,165, 75, 23, 36, 38, 38, 34,
+ 50, 50,242, 26,202,250,103,253,221,233,252,219, 56, 25,134, 41,179,176,236, 95,239,152, 58,117,234,228,238,223,191, 31, 35, 70,
+140, 32, 37, 18, 73,214,200,145, 35,165, 23, 47, 94,228,108, 34,211,237,116,154, 76, 38, 24,141, 70,232,245,122,164,164,164,200,
+151, 44, 89,210,249,179,207, 62,107,116,250,244,233,208, 89,179,102, 77, 10, 8, 8,184, 30, 20, 20, 84,239, 9,231,221,234,244,
+127, 5,128,140,106, 90,136,254,110, 78,206,118, 62, 98, 76, 49,173, 29, 26,216,234,242, 86,118, 63,179,109,105,213, 3, 72,123,
+156,186,212,179,103,207, 23, 27, 53,106, 20,180,251,150, 15, 10,197, 77,193,138, 85, 96,197, 42, 48,126,237,144, 44,121, 5,225,
+225,225, 65,158,158,158, 29,171,153,206,237,183,110,221,250,151,173,167,156, 15, 96, 89,108,108,236,231, 4, 65, 92,136,141,141,
+157, 15, 96,153,109,251,130,219,183,111,119, 0,176,243, 41,165,243,153,120,222,121,206,255, 45,206, 42,180, 72, 0, 65, 16, 71,
+ 8,130, 56,242,201, 39,159,244, 0,224,231,180,254,111,199,227, 0, 72, 92,253,218, 23,135,237, 1, 28,199, 13,112, 56, 47,160,
+134,201, 39, 92, 44,127, 9, 45, 0,136,142,142, 38,162,163,163,237, 59,126, 33, 8,226, 16,128, 95, 68, 34, 81,155,214,173, 91,
+ 15,254,225,135, 31,188, 2, 2,254,186,126, 64, 64, 0,246,238,221,235,213,162, 69,139,193, 34,145,168, 13,128, 95,148, 74,229,
+161, 74,172, 48,170,201,147, 39, 15, 29, 59,118,172,166, 77,155, 54, 0, 80,148,144,144,160,232,208,161,131,158,166,105,130,166,
+105,162, 67,135, 14,250,132,132, 4, 5, 69, 81,218,118,237,218,121,244,234,213, 43,117,250,244,233, 99, 92, 8, 14, 71,188,190,
+120,241,226, 48, 31, 31,159,202,148, 48,180, 90, 45,130,130,130, 48,121,242,228, 96,145, 72,244,102,101,119, 75, 40, 20, 78, 89,
+188,120,113,160, 74,165, 66, 97, 97, 33,194,194,194, 96,177, 88,144,148,148, 4,147, 94, 7, 74,171, 1,165, 41,130,250,254, 61,
+168, 68, 66,140, 25, 20, 29, 36, 20, 10,167, 84, 97, 45,153,242, 77,108,108,144, 37, 53, 21, 41,123,246,128,161,203, 27,127,104,
+171, 21, 55, 55,109,130, 41, 61, 29,139, 38, 76, 8,146, 72, 36, 83,158,176, 37,107, 41,199,113,114,142,227,228, 4, 65,172,234,
+216,177,227,183,114,185,124,114, 92, 92, 92,223,147, 39, 79,246, 59,127,254,124,119,154,166, 69, 52, 77,139, 46, 92,184,208,197,
+100, 50, 9,165, 82, 41,132, 66, 33,135,231, 20, 34,145, 8, 98,177, 24,114,185, 28,157, 59,119,190,191,121,243,102, 42, 44, 44,
+ 76,180,111,223, 62,159, 58,117,234,120,172, 89,179,166, 72,171,213, 46,118,151,207,106,181,194,108, 54,195,104, 52,194,100, 50,
+225,204,153, 51, 13,166, 78,157, 42, 52,153, 76,204,192,129, 3, 11, 40,138, 50,199,198,198, 42,125,125,125, 63,124,146,249,140,
+137, 49,177, 54,203,211,109,155,104,121,128,199,244,121,250, 59, 56, 1, 88,108, 62, 89,118,248,219,184, 45,181,116, 43,104, 0,
+ 58,155,208, 50, 59, 61, 31, 45, 29, 44,190, 85,162,168,168,104,227, 55,223,124, 19, 70, 74, 85,184,104,233,143,239,216,207,113,
+210,123, 13,114,235,125,132,192,176, 70, 24, 53,106, 84, 32,199,113,107,106, 33,205, 95, 1,232, 10, 96, 85, 77, 78,126, 2,233,
+172,231,225,225,177,199,203,203,235,162,135,135,199, 30,216,134,103, 31, 7, 81,141,208,123, 80, 51, 50, 61, 42, 2,220,160,102,
+100,122, 84, 35, 62,212,192,243, 2, 39, 45,226, 8, 53,199,113,209, 28,199, 69, 47, 90,180,104,161,195,251,221,190, 46,119,211,
+ 50, 22,205,113, 92,116, 25,133, 84, 34,176, 30,219,232,230, 98, 41,209, 20,142, 74,210, 33,115,165,179, 11,131,130,130,226,227,
+227,227,189,156, 25,179,178,178,160,209,104, 48,103,206, 28,175,177, 99,199,190,151,158,158, 30, 83, 69, 34, 36,217,217,217,109,
+ 71,143, 30, 45,179, 90,173,133, 44,203,146, 26,141, 70,232,237,237,205,216, 15,240,246,246,102,138,139,139, 69,122,189, 94,192,
+ 48,140,121,236,216,177,146, 9, 19, 38,188, 12, 64, 80, 17,105, 64, 64, 64, 84,255,254,253, 43, 28, 58,160, 40, 10,122,189, 30,
+122,189, 30, 86,171, 21,157, 59,119,150,110,222,188,185, 79,110,110,238,250, 10, 21,135, 84, 26, 21, 21, 21, 37, 42, 40, 40,128,
+183,183, 55,210,210,210,240,224,193, 3,152,117, 58, 88,117, 26, 88,117, 90,208, 90, 13, 56, 77, 49,242,239,221, 65,135,102, 77,
+197, 59,164,210,190,122,189,126,121, 69,156, 74,165, 50,170,195,184,113, 66, 15, 15, 15,116, 31, 93, 50,207,224,120,179,102,224,
+ 24, 6, 44,195,128,161,105,244, 77, 74, 2, 69, 81, 32, 73, 18,237, 10, 10,132,202,109,219,162,212,106,245,178,167, 81,217,165,
+ 82,169,112,251,246,237,175, 75, 36, 18,112, 28, 71, 88, 44, 22,156, 60,121,242, 31,247,208, 75, 36, 18,200,100, 50, 88,173, 86,
+212,175, 95,223, 56,122,244,232,203, 95,124,241, 69, 56, 73,146, 30, 98,177,248,135,252,252,252,133, 89, 89, 89, 41,238,242, 81,
+ 20, 5,139,197, 2,139,197, 2,163,209,136,251,247,239, 7, 55,104,208,128,152, 60,121, 50, 99, 48, 24, 26,174, 94,189, 58,249,
+228,201,147,138,197,139, 23,191, 10,224,221, 39,157,223,152, 24, 83, 51, 0,205,226,227,101, 98,155,229,215,242, 63,198,201,161,
+196,241, 29,241,178,248, 68, 0,234, 90, 20, 89, 18, 0,222,225,126, 66,189, 72, 0, 29, 0, 47,155, 40,120,149, 32,136, 14,205,
+155, 55,247, 73, 76, 76, 44,228, 56,238, 42,128,239, 0,100, 85, 70,198,178, 44,193,178, 44,222,110, 95,132,201, 29, 5,160,168,
+ 98, 20, 23, 23, 35, 45, 45, 13, 9, 9, 9,248,249,231,132,154, 62,155,111,122,122,122,246,145,201,100,245,105,154, 38,117, 58,
+ 93,154,193, 96, 56,205,178,236, 70,212,192, 71,237,239, 74,167, 29, 30, 30, 30, 75,102,205,154,213,201,219,219, 27,191,255,254,
+123,195, 93,187,118, 45,209,235,245,143,229, 92, 47, 19,145, 91,150,175, 92, 19, 26, 26,168,194,141,243,135, 67, 23,110,216,189,
+ 5, 96,195,120,153,242,236,195, 73,139, 56,138,161, 95, 57,142, 27, 64, 16,196, 17,103,161, 84, 45,179,211, 99,158, 95,133, 69,
+203,249,195,210,101,133, 86, 5, 10, 18, 52, 77, 7, 59, 90,178, 56,142, 67, 86, 86, 22, 50, 50, 50,160, 86,171,225,227,227, 3,
+171,213, 26,236, 78,251,160,213,106,219,251,249,249, 25, 68, 34,145,217,104, 52, 66,161, 80,176, 34,145,136,179, 93,135,176,205,
+ 90,100,204,102, 51, 33, 20, 10, 41, 47, 47, 47, 79,179,217,220, 20,149,248,146,113, 28,215,222,207,207,207,229, 62,179,217, 12,
+157, 78, 7,189, 94, 15,157, 78, 7,179,217,140,160,160, 32,208, 52,221,182,210, 46, 45, 77,183, 12, 8, 8, 64,102,102, 38,228,
+114, 57,210,211,211, 97,209,105, 97,213,106, 65,235, 53, 96,138,139,193,106, 52, 96,245, 26, 80, 22, 3, 66,155, 52,131,125, 70,
+ 98,133,221,112,139,165,165,159,159, 31,244,250,191,220,205, 56,155,192,162,105, 26,180,205, 57,218, 62,156,232,239,239, 15,251,
+140,196, 39, 4, 51,128, 25, 36, 73,174,146, 74,165,194, 73,147, 38, 33, 43, 43,171, 76,157,152, 52,105, 82,169, 79, 86,215,174,
+ 93, 47,200,100, 50, 90,173, 86,195,108, 54,139,158,215,135,158, 32, 8, 16, 4, 81, 82, 70, 52, 13,127,127,127,125, 94, 94,222,
+207, 69, 69, 69,175,215,132,143,162, 40,251,140, 46, 24,141, 70,112, 28,135,223,127,255, 29, 50,153, 76,196, 48,204, 45,154,166,
+ 21, 34,145, 8,164,205,249,235, 73,193, 54, 35,240, 75, 0, 97, 54, 11,209,155, 40,113, 56,207,112,209,144,184,117,235,220,228,
+172,190,112, 51,197,216, 45, 77, 25,168,217,112,164, 43,116,111,170,146, 44,143,235, 16,168,106, 61,208, 67,175,144, 8,244,108,
+ 90,235,250,255, 93,154,176,107,236,152, 55,189,230,205,155, 87,207,223,223, 95,150,156,156,108,154, 63,127,126,131,237,219,183,
+ 19, 40, 25,166,171, 16, 15, 31, 62, 60, 48,107,214, 44,223,254,253,251, 55,148, 74,165, 68,113,113, 49,212,106, 53,114,114,114,
+240,224,193, 3,238,198,141, 27,247,205,102,243,158,234, 36, 50, 36, 36,100,243,235,175,191, 62,246,165,151, 94, 18,217, 45,164,
+122,189,190,205,185,115,231, 6, 29, 63,126,188,139, 94,175,175,118,189,124,244,232,209,158,217,179,103,123,188,242,202, 43, 77,
+165, 82, 41, 89, 27,233,116, 4, 73,146, 65,158,158,158, 56,125,250, 52, 84, 42, 21, 72,146, 12,122,220,250,106,178,178,161,117,
+130,253, 96,186,180, 28, 77, 3,234,193,100,101, 67,121,137,242,252, 88,180, 42,120,215,183,179, 91,164,170, 16, 75,198,153, 51,
+103,206, 34, 8,226,200,204,153, 51,103,185,178,104,217,254, 50,142,199, 57, 28,111,174,109,177, 85,173, 64,147, 44,203, 34, 35,
+ 35, 3,153,153,153,200,200,200, 64,126,126, 62, 72,146, 4,199,113,238,204, 62,227, 8,130, 96, 79,157, 58,229,115,249,242,101,
+125,187,118,237,138,236,254, 47, 52, 77, 19, 20, 69, 17, 54,191, 24, 34, 45, 45, 77,124,241,226, 69,213,237,219,183,131,108,189,
+ 85,182, 10, 83, 96,185,109,118,129,229,184,152, 76, 38,200,100, 50,247, 84,135,237, 69,248,251,181,107, 37, 34, 75,167,181, 13,
+ 25, 22,131,209, 20,131,211,107, 33, 97, 40, 72,192,129, 48, 25,220,190,127,142,176,139, 44,171, 77,104, 89, 44, 22, 80, 20, 5,
+150,101, 65,211, 79,197,175,124, 93,171, 86,173,218, 30, 56,112, 96,124, 70, 70,249,119,225,144, 33, 67,240,238,187,239, 98,234,
+212,169,183, 7, 12, 24,112,227,240,225,195,152, 50,101, 10, 88,150,109, 13,160, 24,192,241,231,237,161, 55,155,205,165, 22, 40,
+147,201, 4,171,213, 10, 84,227,179, 10,206,117,211, 94,182, 52, 77,219,185,137, 3, 7,246,227,194,133, 11,100, 66,194,173,176,
+ 73,147, 38,219, 29,238,159,116, 86,211, 81, 50,115, 79, 98,107, 40, 44, 40,241,127,170, 40,164, 66, 4, 42, 31,178,227, 42,227,
+124, 28,180,218,208,106,196, 7, 31,124, 16,133,146, 25,206, 41,143,105,209,122, 69, 66, 18, 95, 79,107,233, 43,251,176,149,159,
+ 94, 34, 36,116, 73, 95,207,210, 61, 8, 87,234,131,234, 42, 44, 97, 13, 84,117, 22, 46,252, 34,228,246,237, 59,230, 57,115,230,
+ 36,142, 28, 57, 50,240,195, 15, 63,108,190,111,223,190, 46, 38,147,233, 27, 0, 69, 21, 25, 93, 6, 13, 26,116, 53, 48, 48,176,
+193,134, 13, 27,114, 31, 61,122,228, 67, 81,148,135,213,106,101,245,122,253, 3,163,209,120,218,106,181,158, 6,112,173, 58,137,
+245,242,242,106, 53,110,220, 56, 81, 81, 81, 17,132, 66, 33,172, 86, 43,114,115,115,209,169, 83, 39,193,161, 67,135, 90,212,228,
+ 6, 20, 22, 22, 46,255,230,155,111,206,238,220,185,179,143, 82,169,124, 73, 42,149, 6, 3, 96,180, 90,109,142, 94,175,255,163,
+ 38,233, 44,211,206, 49, 76,206,181,107,215, 34,148, 74, 37, 30, 62,124, 8,134, 97,114, 30,183, 14,200,196,228,163,155,231, 15,
+213,109,230,223, 0, 23, 47, 95,133, 76, 76, 62,226, 67,125, 61,247,176,251, 80,193, 81, 64,185, 16, 72,151,227,226,226,228,139,
+ 22, 45, 66, 92, 92,220, 45, 87, 22, 45,187,224,138,139,139,187,101, 63,206,225,248,243,143,145,198,138, 45, 90, 21, 41, 72,160,
+100,118,161, 90,173,246, 81,169, 84,165, 2, 43, 51, 51, 19,153,153,153,144, 72, 36, 72, 75, 75,131, 68, 34,201,114,167, 19, 34,
+151,203,127,107,211,166,205, 11, 41, 41, 41,226,249,243,231,215,189,118,237,154,178, 83,167, 78, 47,202,229,114,134,227, 56,152,
+ 76, 38, 50, 49, 49,209,115,217,178,101,161,237,219,183,183,180,111,223,254,250,238,221,187,141,168, 36,254, 21, 65, 16,191,100,
+101,101, 53,172, 95,191,190, 93,180,149, 17, 87,142,130, 11, 40, 25,242, 20, 10,133,215, 43, 75,168, 80, 40,188,153,148,148,212,
+ 91, 33,147,194,162,213,192,170,211,128,214,106,193,104,139,193, 20, 23, 3,122, 13, 36, 52, 13, 17, 67, 65, 46,147, 33, 35, 61,
+ 29, 66,161,240,102,101,156, 18,137,228,102, 78, 78, 78,111,149, 74, 85,250, 18,165,104,186,100, 97, 24, 88,104,186,212,162, 37,
+ 18,137,240,232,209, 35, 72, 36,146,155, 79,186, 38,147, 36,201,216, 67, 56, 84,144, 15, 4, 5, 5,177, 29, 58,116,192,148, 41,
+ 83,192, 48,140,173, 24,136,238, 0, 46,162,196,191,229,153,132, 43,113,107,119, 90, 55, 26,141,208,233,116, 40, 44, 44, 20,202,
+229,242, 23, 66, 67, 67,175, 90, 44,150, 61, 52, 77,111,121,240,224,129,166, 34, 78,155, 48, 43, 21, 93, 44,203,130,227, 56, 48,
+ 12, 3,138,162, 32, 22,139,217,115,231,206, 99,217,138, 37,136,223,178,157, 27, 52,104, 16,113,232,208, 33,176, 44,155,254,132,
+179,111,177,137,150,202, 26, 13,231,144, 10, 31,161,242,144, 10, 21,113, 58,246,254, 28,183, 17, 46,142, 41,135, 15, 62,248,224,
+ 4, 74,134, 12,243,108, 98,238,113, 56,191, 44,250,238, 11, 25,104, 70,111, 62,183, 83,247,237, 93,141,126,222,183, 43,127,179,
+ 72, 4,154,151,187, 5,181,108,216,224, 5,129, 74,229, 67,174,223,184, 42,127,199,246,189,201, 15, 31, 62,212,172, 93,187,182,
+227, 11, 47,188,224,253,199, 31,127,132, 86, 36,180, 20, 10, 69,227, 55,223,124,115, 92, 97, 97,161, 56, 62, 62,126,119, 86, 86,
+214,111, 40, 9, 45,227, 56,131,122, 0,128,173, 54, 33, 26,100,107,231, 46, 2,152, 95, 89,127,141, 32, 8,252,244,211, 79,229,
+102, 7,178,143,167,206, 85,141, 26, 53, 26,145,146,146,114, 33, 39, 39,103,152,243, 78,177, 88, 60,175, 73,147, 38,125,111,221,
+186,245, 57,128, 99,213, 33, 54, 24, 12,177,123,247,238, 93, 42, 16, 8,234, 48, 12,147,105, 52, 26, 99, 31,219,162, 69,177, 19,
+226,214,239,218,100,180, 48,225,114,137,224,161,137, 98,223,226,117,200,243,107,205,178, 65,237, 96,141, 82, 3, 32,156,214,255,
+176,189,140, 44, 28,199,217,143, 85, 59, 88,177, 44, 78, 86, 48, 87,251,212,143, 17, 44,157,171,168,141,171,200,162,245, 9,128,
+246, 0,126,201,201,201, 89, 53,118,236,216,101, 59,118,236,240,210,104, 52,200,201,201, 65,110,110, 46,132, 66, 33,148, 74, 37,
+214,173, 91,103,204,201,201, 89,229,120, 14,202, 71,144, 7, 0,147,191,191,255,111,219,183,111, 15,254,250,235,175,133, 49, 49,
+ 49,105, 3, 6, 12,104,186,110,221,186, 20,177, 88,204, 49, 12, 67,152,205,102,226,237,183,223,142, 88,177, 98, 69,170, 64, 32,
+ 80,140, 24, 49,130,240,240,240,248, 5,149,132, 13, 80,171,213,167,190,255,254,251,161,211,167, 79,151, 90, 44, 22,151,150, 44,
+251, 54,149, 74,133, 75,151, 46, 89, 10, 11, 11, 79, 86, 97,197, 56,245,195,177,163, 93,255, 51,114,164,152,210,106, 64,105, 53,
+160, 53, 26, 48,218, 34, 16, 58, 13, 68, 12, 13,185,152, 69,112,152, 12,180,209, 19, 71,127,253,131, 50,155,205,149, 6, 54,212,
+104, 52,167, 46,198,199,119,111, 95,175,158,240,210,180,105,176, 82, 20, 94, 73, 74, 42, 21, 87, 86,171, 21, 7, 91,182, 4, 67,
+ 16,104, 61,113, 34,238,209, 52,173,209,104, 78,253, 47, 62, 12, 55,110,220,200, 29, 61,122,244, 53,150,101,219,226, 9,125, 52,
+243, 73,128,162,168,114,214, 40,134, 97, 74,172,142, 37,150, 3,201,209,163, 71,187, 38, 38, 38,138,255,252,243, 79, 92,184,112,
+161,245,142, 29, 59, 62, 9, 15, 15,111,249,240,225,195,236,170,196,155,171,160,191,176,249, 31,238,222,185, 7,239,188,243, 14,
+145,157,157,141,239,190,251, 14, 85, 5, 79,253, 59, 16, 19, 99, 98,227,227,101,117,225,228,247,228, 34,164,194,239,112, 51,164,
+ 66, 69,156,166,152, 18, 43,153, 44,190, 36,216,168, 41,166,100, 56, 80, 22, 95,165,165, 12, 49,166, 24,141,205, 33, 62,171, 22,
+ 56,245,160, 25,185,229,220, 78,221,128, 99, 15,181, 87,178,140,243, 1,156,128,137,225,238, 93,231,110,188,244,146,143, 63, 0,
+152, 77, 76,112,227,198,141,187, 9,133, 66, 9, 0,120,122,122,190,228,231,231,183, 46, 63, 63,191,179,171, 50,141,142,142,238,
+ 16, 24, 24,216,230,248,241,227,127,100,101,101,221, 2,240,179,243, 65, 17, 17, 17,115,110,223,190,221, 78, 36, 18, 17, 85,212,
+ 17, 0, 64,183,110,221, 94,144, 74,165,126,199,238,122, 67, 35,110, 4, 78, 80, 12, 8,101, 96, 84,173,144, 38,110,142,176,176,
+171,126,133,133,133,173,139,139,139,255,168,102,209,247, 24, 58,116,232,150,248,248,248,176,110,221,186,113,215,175, 95, 39,157,
+ 71, 17, 34, 34, 34,250, 92,185,114,165,237, 91,111,189,181, 97,215,174, 93,147, 81,118,166,109, 85, 72,179,197, 27,172, 53,156,
+ 74,198,105,128,169,103,179,153,241, 10,229, 31,128,234,132, 92,120,140,240, 12,143,149,196, 10, 13, 24, 21,108,111,111,139,137,
+213,158,162,168,223,111,220,184,113,112,196,136, 17,186,252,252,124,248,249,249,161,126,253,250, 32, 8, 2,235,214,173, 51, 62,
+120,240, 96,159, 45,150, 86,251,204,204,204, 65, 54,177,229, 10,218,213,171, 87,239,218,182,109,155,234,218,181,107, 2,154,166,
+149, 77,155, 54, 53, 92,190,124,217, 83, 36, 18,113, 98,177,152,189,118,237,154, 34, 34, 34,194, 68, 16,132,244,199, 31,127,204,
+191,122,245,106,248,140, 25, 51,190, 65,217,105,226,206,216,185, 96,193,130,140,148,148, 20,152,205,102,104, 52, 26, 20, 23, 23,
+151, 46, 69, 69, 69, 40, 46, 46,134, 72, 36, 66,118,118, 54,246,239,223,159,101,139, 18, 95,153,101, 99,237,154,117,235,213, 89,
+ 15,211,160, 84,200, 65,107,138,192, 20,231, 3,218, 98, 72, 40, 43, 60, 68, 12,234, 54,146, 67,166, 80, 34, 71,163, 67,252,229,
+ 95,179,109, 81,226, 43, 54, 23, 88, 44,107,223, 93,177, 34,135, 22,139, 81,111,248,112, 88,109, 67,133,142, 66,139, 33, 8,132,
+247,234, 5,210,219, 27, 11,247,237,203,177, 69,137,127,162, 96, 89, 86, 96,177, 88, 42,203, 7, 88,150, 77, 79, 76, 76,220, 5,
+224, 44, 65, 16, 28, 65, 16, 28, 74,130,181,233,158,229, 7,153,162, 40,204,157, 59, 23, 98,177, 24,115,231,206,197,167,159,126,
+138,101,203,150, 97,253,250,245,248,246,219,111,113,244,232,209, 6, 23, 47, 94, 20,159, 63,127,158,139,139,139,203,139,136,136,
+ 16, 76,156, 56, 81, 37,151,203, 63,168,140, 51, 54, 54, 22, 94, 94, 94,136,141,141,197,146, 37, 75,176,121,243,102, 28, 60,120,
+ 16,151, 46, 93,130, 64, 32, 96,211,211, 31,193,100, 50,113,171, 87,175,206, 56,120,240,160,113,213,170, 85, 16, 10,133,196, 83,
+106, 36, 62,176, 9, 42, 71, 75,144,115, 72,133,124, 0, 43, 81,181,111, 84, 69,156,144,197,199,215,181,137,163,100, 7, 65,116,
+ 24,192,116, 84, 62,189,218,206, 49, 25, 64,112, 45,112,206,150,143,254,191, 68,213,166, 59,247,175,100, 25,103, 3,248,193,158,
+ 39,165, 82, 41, 63,112,224,123, 33, 0,236,219,187, 95,148,148,148,228,253,253,247,223,203, 2, 3, 3,241,237,183,223,202,228,
+114,121, 96, 5,156,204,193,131, 7,205, 18,137,196,111,194,132, 9,253,218,181,107,247,190,173, 35,218, 11, 64, 11,148,204, 94,
+140,186,127,255,126,130,191,191,255,221,147, 39, 79,234,221, 41, 32,173, 86,251,205,214,173, 91,235, 23, 48,190, 56,166, 31,138,
+120,118, 41,142,170,182, 32,173,222,167, 80,212,121, 25,175,191,254,122, 29,134, 97, 54, 85,179,220, 95, 31, 50,100,200,214,248,
+248,248,176, 9, 19, 38,100, 95,191,126, 61, 7, 64, 60,128,237,142,203,237,219,183,243,198,142, 29,155,181,105,211,166,144, 17,
+ 35, 70,172, 7, 48,140,127,245,243,224, 81,182, 47,132,170,102, 29,186,120,225,150,254,207,205,205, 93, 93, 88, 88,120,233,222,
+189,123,239, 89, 44,150, 16,130, 32, 56,177, 88,156,157,147,147,179,202, 33, 96,169, 43,191,146,222,176,197,218, 32, 8,130,226,
+ 56, 46,189, 71,143, 30, 31,244,234,213,235,171, 35, 71,142,152,186,119,239,142,189,123,247,250,247,232,209,195,192,178, 44,119,
+236,216, 49,255,190,125,251, 26,206,158, 61,171,127,251,237,183,155, 54,105,210,100, 98,108,108,172,154, 32, 8,214, 21,167,253,
+ 93, 86, 84, 84, 52,164, 95,191,126,151,246,237,219,167, 84,169, 84,160,105, 26, 6,131, 1, 6,131, 1, 28,199,193,219,219, 27,
+106,181, 26,243,231,207,215, 20, 23, 23, 15,118, 33,220,156, 57, 77, 38,147,105,216,228,247,167,159, 90,245,249, 92,175,240, 6,
+ 13,144,127,199, 4,218,100,128,136, 35, 81,247, 5,111,136, 37,114,220, 75,210,226,163, 93, 7,180, 70,147,233, 53, 23,189,229,
+114,156,197,197,197,195, 98, 62,253,244,244,134, 25, 51, 60,219, 4, 5, 65, 32, 16,192,108, 54,131, 97, 24,136, 68, 34, 68,198,
+196, 64, 28, 16,128, 57,187,118,233, 53, 26,205, 48,148,255, 20,143, 51,103,109,192,145,115,242,141, 27, 55,198, 54,107,214, 12,
+147, 38, 77,194,144, 33, 67,202, 28,248,253,247,223, 99,253,250,245, 48,155,205, 99, 1, 92, 7,176, 14, 37, 67, 29,112, 18, 89,
+127,119, 58,107,157,147, 97,152,194,164,164, 36,229,210,165, 75, 9,171,213,138,207, 63,255, 28,118,193,105,175,215, 83,166, 76,
+169,227,229,229,133,207, 62,251,204,146,151,151,215,115,201,146, 37,103,182,111,223,238,255,205, 55,223,188, 14, 32,214,153,147,
+101,217,220,155, 55,111,122,109,216,176,129,164,105, 26,203,151, 47, 47, 55, 60, 57,126,252,120, 88,173, 20, 4, 2,161,197,100,
+ 50,183,144,203,229,201,126,126,126,114,174,172,115,215,147,188,159,161, 40, 9, 97,224,232,248,110,113,244,207, 66,197, 33, 21,
+170,195,169,150,197,199,119, 55,197,196,156,181, 9,162, 68,219, 49,123,237, 38,253,106,112,218, 5, 97, 77, 56, 79,217,150, 42,
+ 97, 50,153,160, 86,171,145,151,151, 7,149, 74, 5,129, 64, 64, 84,148, 78,179,217,252,231, 71, 31,125,116, 99,211,166, 77,189,
+175, 92,185, 50,240,252,249,243, 61, 78,159, 62,109, 74, 75, 75,163, 41,138,226, 66, 66, 66,132,157, 59,119,150,245,239,223,223,
+ 67, 42,149,146,179,103,207,206,251,226,139, 47,252, 81,214,135,205, 57,239, 2,130, 32,240, 97, 87, 45, 98,123, 8, 96,177, 88,
+ 81, 84, 84,132,140,140,116, 36, 36, 36,224,202,149, 59,224, 56,142,172, 70,185,251, 1,152,253,221,119,223,133, 74, 36, 18, 98,
+215,174, 93,117,118,237,218, 85,165, 37,117,199,142, 29,117,118,239,222, 61,207, 54,122,145,254, 44, 62,239, 60,231,255, 44,231,
+179, 12,231,200,240,168, 82,104,217,218,249,246,176,125,148,148,162,168, 95, 92,132,112,248, 4,192, 92, 7, 43, 88, 85,230, 60,
+ 13,199,113, 23,122,247,238, 61,165, 87,175, 94, 43,250,244,233,147,149,149,149,213,112,249,242,229, 97, 52, 77, 91, 19, 18, 18,
+200,228,228,228,180,223,126,251,173, 81,147, 38, 77, 38,222,190,125,251, 28, 65, 16, 86, 55, 50,152,144,156,156,220,169, 71,143,
+ 30,251, 39, 78,156, 24,222,161, 67, 7,137, 74,165,130, 80, 40, 68, 74, 74, 10,254,248,227, 15,203,238,221,187,211,139,138,138,
+170,243, 9,158, 95, 82, 51, 50,162, 70, 76,125,111,223,196, 33, 3,253,255,213,244, 5, 73, 72, 72, 8, 96, 52,226,206,195,108,
+ 92,189,243,135,117,243,133,171,106,179,217, 60, 12,238,127,130,231,151,223,238,221,235,221,115,198,140,125,243,254,243,159, 32,
+100,101, 9, 67, 66, 66, 32,145, 72,240,224,193, 3, 36,179, 44,189,120,227,198, 28,155,200,122,210, 81,225,165, 0,150,178, 44,
+ 43, 4, 0,185, 92,142,119,223,125, 23,142,159,220, 89,191,126, 61,140, 70, 35, 0, 8, 9,130, 88, 10, 96,203,179,110,197,178,
+163,160,160, 96,206, 43,175,188, 18, 39, 20, 10, 43,140,122,235,227,227, 3,173, 86, 11,154,166,153,140,140,140, 59, 62, 62, 62,
+ 16,137, 68,224, 56,206,229,115,148,159,159, 63,103,216,176, 97, 11, 72,146,172,200,242, 1,165, 82,153,118,230,204,153,198,111,
+189,245, 22,249,223,255,254, 55,101,194,132, 9,210, 51,103,206, 48, 28,199,237,127,210,247,160, 75,151,157,192,134,152,215, 0,
+188, 6,148,115,120,207,176,109,171, 86, 72,133, 46, 93,118, 98, 3,254,226,116, 28,198,179, 11, 34,155, 21,170,185, 44, 62,126,
+ 5, 74,252, 44, 42,229,238,178,179, 11, 54,196,160, 86, 57,221,129,163,246,213,235,245, 96, 24,166, 50,107,222,239,123,247,238,
+ 93,241,219,111,191, 5, 76,153, 50,165,225,127,254,243, 31,101,143, 30, 61, 60, 29, 15, 48, 26,141,236,225,195,135,245,235,215,
+175, 47,190,112,225, 66,234,248,241,227, 59, 84,150,206,135, 15, 31, 30, 93,184,112,161,119,255,254,253,155, 0, 40,245,207, 82,
+171,213, 72, 75, 75,195,159,127,254,153,102,181, 90, 15, 85, 35, 75,249, 0,230,141, 26, 53,106,233,182,109,219,234, 76,152, 48,
+ 33,123,247,238,221,127,162, 36, 96,177, 51, 84, 67,134, 12,105,185,109,219,182,144, 9, 19, 38,100,163,196,143, 44, 29, 60,120,
+240,176,163, 59,202,251,105, 85, 58, 50,177,213, 98,177,112, 38,147,137, 51, 24, 12,156, 78,167,227,224,250, 43,240, 7, 51, 51,
+ 51,185,244,244,116,238,225,195,135, 92,106,106, 42, 7,224, 91, 39,197,235,170,193,242,216,177, 99, 71,163,208,208,208,207, 21,
+ 10,197, 9,129, 64,160, 17, 8, 4, 26,169, 84,250,131,159,159,223,167,139, 23, 47, 14,229, 56, 78, 92,137,138,174, 8, 66,145,
+ 72,244, 86, 96, 96,224, 65, 95, 95,223,116, 31, 31,159,244,192,192,192,131, 34,145,232, 29, 0,162, 42,148,121, 69,144, 9,133,
+194,143, 60, 60, 60, 78, 73,165,210, 92,169, 84,154,235,225,225,113, 74, 40, 20,126,132,202, 3,169, 86,202, 41,145, 72, 62, 10,
+ 8, 8, 56,165, 84, 42,115,149, 74,101,110, 64, 64,192, 41,137, 68,242, 56,156,143,211, 43,177, 11, 45, 3,103, 3, 65, 16, 84,
+235,214,173, 55,180,109,219,118, 93,219,182,109,215,181,106,213,234,107,155, 85,146,179, 89, 91, 12,168, 56,120,227,223,153,206,
+167,198, 25, 25, 25,185,125,219,182,109,236,156, 57,115, 52, 77,154, 52, 41,152, 51,103,142,102,219,182,109,108,100,100,228,246,
+154,114, 6, 5, 5,213,139,140,140, 44,216,180,105, 19,157,148,148,196,109,218,180,137,142,140,140, 44,112,138, 12,255, 36,242,
+ 78, 0,136,176, 89,127, 14, 1,216,131, 18,231,247, 80, 0, 68,140, 41,134,179,205, 62, 60, 1,160, 79, 5,101,239, 46,103,152,
+ 41, 38,134,179,249, 84,157, 4,144,232,176,222, 13,101,253,191,158, 4,167, 75,180,104,209,226, 30,231, 0,139,197,194,169,213,
+106, 46, 41, 41,137,187,112,225, 2, 23, 22, 22,118,207, 13, 78, 63, 0,111, 3, 56, 28, 28, 28,124,187, 99,199,142, 15, 59,117,
+234,244,176, 94,189,122, 41, 34,145,232, 10, 74, 34,188, 71,218,150,165, 0,154, 84,193,217, 81,165, 82, 45, 12, 11, 11, 59,212,
+184,113,227, 75,245,235,215,191,226,235,235,123, 68, 38,147, 45,194, 95,145,177,171, 91,231,123, 12, 29, 58, 52, 77,167,211, 49,
+ 47,189,244,210,109, 87, 39, 53,107,214,236,162, 78,167, 99, 70,142, 28,153, 14, 32,250,159,240,188,243,156, 79,133,243, 31,133,
+198, 54,193,116,208, 97,249,196,197,113,159, 56, 29,179,213,118,110,149, 5,193,113,156,128,227, 56, 15,142,227,188, 57,142,243,
+229, 56, 78,197,113,156, 39,199,113,210, 42,204,223,124,197,254,251, 56, 39,219, 4,148,193,246,223, 25, 85,237,127,174,239,103,
+104,104,168, 79,187,118,237,166, 30, 56,112,224,163,251,247,239,127,116,224,192,129,143,218,181,107, 55, 53, 52, 52,212,231,113,
+210, 25, 20, 20, 84,175,121,243,230, 95, 53,107,214, 44,189,121,243,230, 95, 57,137,172, 39,153,119,137, 77,196, 52,179, 45, 13,
+109,219, 8,148,196,194, 90,107, 19, 54, 17, 21,244,212,170,195,105,231, 59, 4,160,175,109, 57,100,219, 22,246, 20, 56,203,161,
+ 65,131, 6,199, 91,182,108,121,175, 85,171, 86,201,173, 90,181,186,215,162, 69,139,123, 77,155, 54,189, 23, 17, 17,113,175,110,
+221,186,247,252,253,253,143,215,160,140,124, 1,132,160,252,103,192,158,118,157,239, 30, 25, 25,121, 85, 38,147,185,140, 13, 38,
+ 20, 10,231,181,106,213,234, 38, 74,102, 74,242,237, 39,207,201, 11,173,255, 33,240,149,240,217,227,148,162,242,207,140, 84,181,
+159,191,159,207, 54,167,203,111,117,217,132, 76, 67,155,192,145,212, 2,167, 35,159,189, 78, 69, 56,136,166,167,193,201,215, 37,
+158,147,231,228,133, 86,173, 67,200,223, 2, 30, 78, 48, 63,230,126, 30,207,197,104, 60,126, 0, 0, 32, 0, 73, 68, 65, 84, 54,
+170, 19, 19,235,113, 56, 93,241,221,127,202,156, 60,120,240,224, 81, 91,109,103,119, 0,231,236,189,194,138, 84,105,117,102, 19,
+212, 68,217,158,230, 57,121, 78,158,147,231,228, 57,121, 78,158,243, 31,199,105,199,138, 10,182,223,113, 90,255,250, 25, 21, 94,
+ 79, 36, 76, 15,111, 86,229, 57,121, 78,158,147,231,228, 57,121, 78,158,179,166,152,248,140,138,172,110,246, 21,126,232,144, 7,
+ 15, 30, 60,120,240,224,193,163,246, 80,117, 28,173, 61,123,246, 8,236,255, 71,141, 26, 53,158, 97,152,169,246,117,129, 64,176,
+230,187,239,190,219, 82,217, 21,134, 15, 31,206, 84,198,233, 10, 85, 93,199, 21,103,139, 38,202, 73,126,222,138,247,138,138, 13,
+ 43, 83, 50,153, 11, 38,147,169,185,125,159, 76, 38, 75,220,178,101,203,221,218, 78,231,248,241,227,155, 56, 95,167,126,152,168,
+187,175,151,236,221,130, 34,221,242, 91,247,116, 95,243,117,236,169,192, 31, 64,180,151, 76, 60,168,133, 74,220,241,207,124,211,
+101,189,149, 57,140,146,217,176,133,207, 99,134,131,131,131,155, 42,149,202, 49, 0, 90, 24, 12,134, 64,133, 66,145, 11, 32, 65,
+163,209,108,207,206,206,190,227, 46, 79,183,250, 72, 3, 16,110, 91,125,120, 46, 21,245,220,217, 87, 21,250, 68,192,196, 1, 82,
+130,128,245,100,242, 95,206,232,125, 27,193,196,114,229,183,247,105, 4, 11,199, 65, 76, 0,230,147,247, 33,123,142,138, 74, 9,
+ 32, 10, 37, 33, 28,110,160, 36,252,132,129,127,100,121,240,120,174,224, 60, 84, 88,186, 46,172, 64, 76,116, 21, 11,137,175, 56,
+112, 42,128,243, 51,155,205, 34,137, 68, 2,139,197, 2,133, 66,190,246,237, 9,227, 63, 7,137, 34,138,198,187, 91,182,108,169,
+241,151,174,171,115, 29, 0, 63, 57,159,239,163,148, 47, 56,123,248, 99,159,174, 3, 22, 47,178, 60,200,139,213,106,181,164, 84,
+ 42,133,217,108,134,183,183,119,167, 73, 19, 39,190, 68,138, 56,139, 88,236,113,121,197,138, 21,217, 53, 77,231, 7, 31,124, 16,
+108,181,154,254,205,178,172,196, 98,177, 72,157,175,227,173,240, 88,124,246,240,199,138,110,209,139, 62, 7,120,161,245, 20, 32,
+169,231,227,113,110,229,168,238,205, 58,182,104, 12, 54,225, 60, 76, 22,235,160,179,233,186, 65,159, 94,201,156,158,174,179,182,
+ 69, 45, 4,172,252, 31,130,160, 97,195,134, 83, 2, 2, 2, 70,110,220,184, 81,220,176, 97, 67,200,100, 50, 24,141,198,144,251,
+247,239,135, 76,154, 52,169,155, 92, 46,223,149,146,146,178, 22,238,125, 8, 46,252,236,214,255, 3, 0,116, 26, 51, 63, 28, 37,
+ 31,139, 54, 56,239,235, 62,110,126, 56,128, 25, 40,251, 97,228, 44,148,132, 80,112,213,234, 72,142,108, 91,134, 65, 99, 63, 18,
+ 2,152, 84,154,120, 18,248,225,219, 85,232, 55,234,189, 50,219, 9, 14,194,195,219,150, 33,122,236, 71, 21,126, 71,177,111, 99,
+130, 98, 89,174, 66, 75, 60, 73, 18,244,137,123,156,171, 15, 12,231,160, 36, 6, 88, 57, 74,148,124,208,217,229,241, 3,154, 10,
+114,172, 20,227, 50,224,172, 88, 36,200, 61,122,135, 41,119,110, 76, 27, 80, 20, 83,210,182,138,133, 96, 14,166,120,159,157, 61,
+123,182, 48, 58, 58, 26,155, 55,111,238,252,245,215, 95, 79,212,106,181, 63,218,238, 91, 50,255,248,242,224,241, 92, 11, 46,215,
+ 66, 75, 40,192,134, 67,251,182, 52,202,201,205, 67,204, 91, 31, 98,231,206,157, 40, 44, 44,132,143,143, 15, 36, 98,177,104,229,
+210,255, 11, 86, 42, 61,130, 99, 38,198,110, 0,208,180,166,169,169,230,117, 26, 59,159, 79,216, 62,165, 35, 20,144, 34,137, 68,
+ 66,238,218,181, 11, 69, 69, 69, 80,169, 84,144, 72, 68,228,138, 69,159,200,149, 74, 79,249,155,147,103,118, 70, 73,252,159, 26,
+193, 98,209,117, 62,176,115,139, 82,173, 86, 99,220, 59,177,112,190,142, 88, 44,102,236, 47, 22,190,142, 61, 21,204,222,248,238,
+216,102, 47,122, 1,214, 91,151, 32, 18, 8,160,240,246, 65,148, 80, 0, 1,129,230, 49, 39, 82,103, 1,248,244,121,201,108,195,
+134, 13,167, 12, 31, 62,124,228,130, 5, 11,196, 36, 89, 18,114, 78,175,215,195,104, 52, 34, 52, 52, 20,103,207,158, 21,207,153,
+ 51,103,228,247,223,127,143,148,148,148,213,213,229,191,117,235, 86,253,240,240,112, 19, 0, 12,108,233,229,188,175,158,125, 31,
+ 0,120,121,121, 85,201,231,167,242, 48,223,186,117,181,133,253,188, 41,189, 66,153, 10,182,155, 0, 40, 42,227, 98, 89, 78,120,
+242,171, 73, 21,238,127,107,193, 14,250,198,158, 11, 77, 27, 54,108,104,116,220,238,233,233, 89,209, 41, 65, 58,157, 46,220,121,
+163,253,120, 43,197, 4, 86,116,189, 62,239,174,119, 41,192, 40, 6,194, 29, 59,118, 0, 0,190,252,104,180, 96,211,207,121, 66,
+161,176,164,169, 93,186,116, 41,230,205,155, 39, 57,113,226, 68,255,109,219,182,245, 63,120,240,224,202,138,132, 42, 15, 30, 60,
+158, 73,145,229,248, 91,177,208, 34, 9,194, 75,233,229,137,215, 94,127, 27,199,143,255,128,174, 93,187,150,238,107,208,160, 1,
+134, 15, 27,140,239,182,174, 0, 0,175,199, 73,209,227, 94,167,176, 88,255,105,191,145, 95,205,127,152,173,187,114,228,200, 17,
+116,233,210,165,204,249,175,143,120, 13,223,126,179, 20,149, 68,153,119, 11, 4, 71,138,189,148, 30, 24, 21,243, 14, 92, 93,103,
+226,184, 33, 71,250, 14, 95,213, 59, 39, 95,191,130,175,103, 79, 30,141,130,253,250,180,108,214, 20,133,251,215,226,143, 34, 19,
+142,103,154,240,102,212,191, 16,233, 43, 71, 23,154, 65,176,135,168,103,182,158,122, 46,132, 86,112,112,112,211,128,128,128, 50,
+ 34, 75,171,213, 66,167,211, 65,163,209, 64,171,213,130, 36, 73,196,198,198,138,207,157, 59, 55, 50, 56, 56,248,180, 27,195,136,
+ 15,109,150, 44, 64, 32,210,205,157, 59,215, 28, 24, 24,104, 86, 40, 20,156, 80, 44,213,118, 31, 55,223, 11, 0, 72,161, 88,187,
+114,229, 74, 75,104,104,168, 73, 40, 20, 74,222,123,239, 61,210,157, 52,155,205,102,206,145,211, 98, 49,151,110, 95,188,120,177,
+ 37, 40, 40,200,172, 80, 40, 56,171,213,125,163,227,205, 7, 5,144,138, 5,144,138, 5,144, 73, 68,240,170,223, 14,210,194, 63,
+ 65,211, 52,150, 44, 89, 98, 13, 14, 14,182, 40, 20, 10, 78, 34,145,136,167, 77,155, 86,101, 58,199,143, 31,207,169, 84, 42,171,
+ 66,161, 16,207,155, 55,175,220, 76,161, 51, 55, 50, 32,151,136,160,144, 10,209,184, 65, 24,164,156,209,237,180, 10, 4,101,189,
+ 17,164, 82, 41, 58,119,238,140, 22, 45, 90,224,224,193,131,221,121,161,197,131,199,115,129, 10,103, 24, 10, 1,224,200,145, 35,
+221, 80,242, 65, 68, 68, 71, 71, 19, 37,103,112,152, 49,101, 24,222, 28, 55, 10, 12,195,150,126,231,139, 32, 9, 76,126,163, 63,
+ 88,214,157, 17,137,170,167,120,214,224, 58,165,156, 28, 65, 10, 0,160, 81,189, 16,110,226,155,255, 1,195,178,127, 13,148, 8,
+128,183,199,245, 43,217, 86, 11,233, 20,128,193,135,147, 94,133,171,235, 52,109, 84,135,164,173, 38, 16,101, 63,246,248,119,124,
+108,147,231,116,129, 22,117, 67, 34, 40,163, 17, 38, 19,133,248, 59, 5,198, 83, 25,250, 64, 82,149,170, 94,245, 90, 7,153, 64,
+157,137,122, 94,146,198,217,122,234,185,200,187, 82,169, 28,179,113,227,198,114, 34, 43, 39, 39,135,212,233,116,176, 90,173,172,
+ 86,171, 5,195, 48,152, 57,115,166,104,206,156, 57, 99,178,179,179,231,217, 53,143, 43, 78,155,223,213,140, 91,183,110,213,155,
+ 61,123,182,181,103,207,158, 15, 27, 52,104,160, 23, 8, 4, 8, 9, 9, 89, 21, 21, 21,229,187, 96,193, 2,107,255,254,253, 83,
+ 5, 2, 1, 26, 55,110,172,255,243,207, 63,235, 1,144,187,155,119, 71,206, 45,103,214,112, 0, 64, 16, 4,162,162,162,210, 26,
+ 55,110,172, 23, 8, 4,184,123,120, 49,231,238,253, 20, 9, 73, 52, 9,245,182, 53, 34, 4, 32,247, 44,245,196,139,138,138, 74,
+111,218,180,169,142, 36, 73,220,188,121, 51, 12,229, 63,107, 85,142, 83, 46,151, 83,175,191,254,250,195, 59,119,238,184, 58, 30,
+ 66, 1,137, 14, 77,109, 6,172,208,182, 64,250,197, 10,211, 41, 18,128,158, 51,101,180, 80, 37, 3,164, 94,254,102,141, 70, 3,
+165, 82, 89, 98, 33,179, 90,241,251,239,191,163, 99,199,142,221,246,236,217,115,142,127,222,121, 78,158,243, 47,184,210, 34,207,
+160, 53,203,241, 67,247,101,124,180,206, 58,103,138, 97,104, 52, 8, 15,194,226,255, 27, 15,134, 97,193, 48, 12,104,219, 47,195,
+ 48,160,172,214, 90, 73,217,227, 92,199, 71, 41, 95,240,195,174,119,125,122, 14, 89,218, 43,110,246,184, 83, 12, 3,176, 44, 5,
+138, 2, 24,150, 2,203, 48,160,168,218,113,205,161, 88, 22,245,194,130, 17, 55,123, 28,156,175,179,253,187, 61, 3,207, 28,138,
+ 85,116,141, 94,244,225,221, 52,195, 18, 94,216, 63, 89,200,196, 82, 33, 39,148,193, 98,161,161,181,176, 22, 0,122, 19,197, 90,
+ 57, 15,127, 25, 0, 8, 73,226,121,154, 93,219,162, 97,195,134,101, 68,214,178,101,203,252,215,173, 91, 23, 10, 0,195,134, 13,
+203,232,213,171, 87, 94, 82, 82, 18, 66, 66, 66,136,188,188,188, 1, 0,222,179,157, 59, 3,192,186, 10,120,245,225,225,225,166,
+128,128, 0,179, 93, 16,145, 36, 9,161, 80,136,240,240,112, 83, 96, 96,160,185,113,227,198,122,177, 88, 12,146, 36, 97, 23,122,
+110,117,243, 8, 2, 2,129, 0,118, 78,103,107,143,157,179, 58, 16, 9,201,242,205,155, 3, 39, 73,146, 46,175, 87, 97, 29,146,
+201, 56, 0, 21, 30, 47, 32, 29,154, 71, 97,229, 30, 2,241,191, 67, 4,224, 44,199,113,184,126,253, 58, 82, 82, 82, 32, 22,139,
+ 17, 28, 28,140,121,243,230,193,108, 46,209,187,195,135, 15,239, 6,224, 38,255, 4,243,224, 81,138,179,207,160,192,114,182,106,
+ 85,238,163,117,228,200,145,110,209,209,209,231,236, 2,168, 68,236,184, 16, 63, 20, 13,138,178, 2, 28, 87, 43, 66,171,162,235,
+ 48, 12, 91,233,117,236, 62, 90, 44,203, 9, 93,138, 44,150, 5, 77, 81,181,114,247, 88,134, 2,203, 82,112,117, 29,130, 32, 25,
+ 91,131, 47,230,159,147, 39,143,224,240,122, 36, 21,222, 0, 23,104, 19, 66,253,164, 18,228, 25,209,240,133,102,130,223, 13, 20,
+ 46,221, 72,132,191,167,242,185, 41, 23,131,193, 16, 40,147,201,160,215,235, 75, 45, 89,235,214,173, 11,181, 88, 44, 36, 0, 8,
+133,162, 48, 53, 27, 42, 99, 88,192, 91,153,133,194,194, 98, 63,142,227, 8,155,224, 89, 10, 96, 11, 42,137,238, 47, 22,139, 75,
+ 5,138,163, 0,146, 74,165, 53, 18, 48,118,216,197,153, 88, 44,118,185,221,121,120,173, 42,136, 29,133, 22,184, 18,171,150,147,
+216, 18, 8, 4,176,251, 70, 85, 5,137, 68, 82,154,119, 87, 16, 10, 28,174, 39,168,190, 43,166,213,106,133, 78,167, 67, 81, 81,
+ 17,100,178, 18,131, 25,199,113, 32, 8,226, 61, 0,239,243, 79, 49, 15, 30,174,181,200, 51, 44,182, 92, 11, 45,148,152,236, 8,
+ 0,160, 41,171, 75,241,179,231,240, 37, 60,204,214, 35,216,255, 23,112,213,140,122, 58,114,228,200,173, 33, 33, 33, 29,236,235,
+ 82,185,167,223,196,119, 63, 3, 77, 91,225, 37, 39,241,214,152,126,101, 68, 86,137, 69,203, 82,225, 55, 65, 10,139,245,159,246,
+ 27,190,122,190,183,210,239,138,179,248,137,139,191,246, 90,161,198, 28, 70,146,191,162,144, 8, 97,134,191,253,217,120,135,198,
+253,198,174,245,115,167,187,109, 15, 36, 72,209,107,147, 86, 77,228,132,158,205, 21,164,246,252,199,227,254,117,192, 81,204,249,
+250,250, 30,233,243,218,202,222, 57, 5,188,143,214,211,128,151,183,138, 12,123,185, 59, 94,126,239, 43,156,249,228, 99, 14, 40,
+132, 95, 72, 40,217, 99,202, 23,240,124,121, 32,174,190, 53,134, 5, 10,158,139,188, 42, 20,138, 92,131,193, 16, 98, 52, 26,161,
+209,104,160,209,104,202, 10, 2,145,136,152,248,206, 84,127,145, 88, 2,202,106,193,241,237, 95, 84,201,105, 15,225, 48,176,165,
+ 23, 4, 34,137, 54,161, 97,195, 85, 66,161, 16, 36, 73,226,240,218,143,223,219,191,252, 93, 47, 0,184,113,100,173,102, 84,236,
+154,213, 36, 73,194,108, 54, 75,171,147,238, 71,143, 30,133,153,205,102,147, 77,160,217,133, 31, 30, 60,120, 80,215,108, 54, 27,
+ 29,183,187, 3,185,194, 11, 80, 53, 0, 20,129,229,172,103,169,169,169,117, 40,138, 50, 8,133, 66, 88, 44, 22,183, 84, 17, 73,
+146,226,155, 55,111,134,177, 44,235,242,248, 22, 17,117,128,224,150,128,196,219,237, 60,115,110,116, 68,109, 98,235,137, 69,144,
+230,193,227, 89,177,108, 61,131,207, 4, 81,193,255, 82,161,213,253,200,145, 35,156, 99, 15,145,166, 40,155,200,250, 75,244, 48,
+ 12,139, 76,181, 9, 73, 73,119,177,114,229, 74, 92,186,250,145,247,130, 5, 11,164,115,230,204, 49,143, 28, 57,114, 57,203,178,
+173, 72,146,188,129,191,134, 42,202, 90,133, 88,182,238,181,107,215, 26,218,215, 41,138,130,151,151, 23,188,188,188,208,180,113,
+ 88, 57,145,197, 48, 12,172,149, 12, 29,218,125,180, 8,142,229, 40,138, 1,195,178,165,226,167, 80, 99, 14, 59,116,250,122, 35,
+135,195, 95,176,255,233,220,174,121,197, 98,112,210,188,210,124,236, 90, 63,119,250,130,205,155,165,133, 76,192,180, 81,175,189,
+ 25, 57,124,212, 24,188,254,234, 43,221,204, 22,203, 65, 1,201,177, 84,233,245, 64,130,131,179,143, 22,143, 39,132,228, 34, 61,
+ 37,146,202,225, 25, 92, 31,119,117,140, 88, 32, 16,252,114,191,200, 32, 38, 5, 66,144, 66, 49, 18, 10, 77,212,115,148,221,132,
+228,228,228,144,186,117,235, 66,163,209,128,166,105,118,216,176, 97, 25, 66,161, 40, 76, 40, 18, 17,209,163,166,178,217,217,153,
+ 20, 73, 10,192,113, 12, 94, 25, 62,137,144,202,228, 98,171,197, 66,163,100,232,208,149, 53,203, 49,132,131, 87, 84, 84,148,175,
+125, 38,224,254,229,239,122, 57,236, 83,190,244,210, 75,190,142,179, 14,221,180, 22, 17, 35, 71,142,148,135,135,135, 19, 0,240,
+235,246,217,118,235, 25, 49,112,224, 64, 89,120,120,137, 31,254,143,107,223,117,155,211, 95,193, 1,197, 15,128,226,212,114,150,
+172,129, 3, 7, 74, 27, 54,108, 88,173,103,209,230, 0, 95, 97,236, 46, 15, 33, 13,100, 95,119,139, 43,166, 13,168, 80, 79, 8,
+151,191, 66, 66,226,233,103,238,240,241,137,159,121,177,197,131,135, 91,112,210, 34,207, 20,186,217, 4, 98,119,219,111,169,224,
+ 18, 2,128,205, 68, 71, 56,232, 44, 80,180,181,156,200, 98, 24, 6, 34,194,140,149, 43, 87,226,253,247,223, 7, 0,241,244,233,
+211, 15, 44, 88,176, 96, 40,203,178,173, 56,142,235, 66, 16, 68,101,189,198,179, 33, 33, 33, 57, 28,199,137, 72,146,236,178,118,
+237, 90,223,254,253,251,195,203,203, 11, 28,203,149, 19, 89, 12,195,194,106,181, 84,248,153, 91, 31,165,124,193, 15,123,166,249,
+244, 28,188,180, 23,195,178,167,236, 34,139,101, 24,128, 45, 57, 41, 63, 55, 3, 39,143, 31,196,134,245, 27, 10, 65,112,183,193,
+129,181,137, 65, 84, 32, 6, 91, 93,252, 53,177, 75,231,118,205,177, 96,243,102,233,173,107, 89, 7,166,126, 48, 43,114,248,168,
+ 49,216,243,221,118,144,116,209,117, 71,145,197, 80, 44,138, 11,243, 6,254,196,251,104, 61, 45,248,158, 60,117,138, 24, 51,102,
+ 12,171,213,106, 33,150, 72, 88,138,162, 4,255,254,247,191,153,247,223,127,159,204,206,206,134, 70,171, 19, 2,240,197,115, 96,
+214,210,104, 52,219, 39, 77,154,212,237,252,249,243, 98,146, 36,161,209,104,208,163, 71,143, 60, 53, 27, 42,155,248,206, 84,255,
+204,204, 12, 90, 41, 23,154,197, 98, 17,114,115,115,217,110,253, 71, 27, 71,141,127,191,206,251,179,227, 54,102, 93, 94,191,206,
+157,107, 56,206, 4,116,222,183,105,211, 38, 75,104,104,168, 73, 42,149, 74,198,141, 27,231,214,248,161,197, 98,225, 22, 47, 94,
+108,118,158, 93,104,177, 88,184,149, 43, 87, 90,194,194,194,204,114,185,156,163,168,170,253, 62, 73,146,160,223, 90,176,131,166,
+105,186,140, 21,203, 46,178, 40,150,208,125,245,213, 87,214,176,176, 48,139, 66,161,224,164, 82,169,216,157,116, 78,157, 58,149,
+243,241,241,177,122,120,120,136, 99, 99, 99, 31,107,214, 33,197, 64,184, 96,109,105,120, 7,169,151,151, 23,180, 90,109,105, 90,
+ 67, 66, 66,120,177,197,131,135, 11,148,211, 34,207,166, 21,206,189, 56, 90, 44,160,203,201,205, 11,244, 15,170, 15,154,166,109,
+ 11, 5,154,162, 48,237,237, 81, 88,190,254, 43, 0,176,139,173,168,233,211,167, 31, 0, 80,101, 99,182,107,215,174,249,211,167,
+ 79, 87,230,228,228,156,216,186,117,171,239,232,209,163, 49, 99,198, 12, 44, 93,186, 20, 34,137, 12,190, 1,117, 75,175, 99,191,
+110,158,186, 0, 28, 56, 93, 5,118, 58,107, 73, 35, 5,161, 95, 64, 61, 80, 12, 5,150,162, 64, 81, 20, 8, 65, 73,214, 78, 30,
+ 63,136,209,111, 76,133, 72,170,244, 89,179,114,137, 49,242,229,144,161,115, 38, 76, 48,187, 97, 4, 36,111, 93,203, 58, 48,245,
+253,216, 40,187,200,218,183,125,253,237, 47,103, 14,222, 41,149, 8, 75,175, 67,177, 44, 72, 82,192,251,104, 61, 37,145, 37,149,
+ 74,247, 30, 59,118,236, 94,219,182,109, 9,189, 94, 15,138,162,144,151,151,135, 3, 7, 14, 36,112, 28, 7, 31, 31, 31, 28, 59,
+118,140, 29, 61,122,244, 94,179,217,252,218,179, 46,182,178,179,179,239,200,229,242, 93,179,102,205, 26, 53,115,230, 76, 17,203,
+178, 72, 74, 74, 2, 8,130, 19,137, 37, 32, 73, 18, 34,145, 16,197,197, 26, 86,225,169,202,178,114, 2,133, 72, 44, 1, 41, 16,
+ 87, 54, 77,248,161, 45, 24, 41, 72,161, 88,107,159, 9, 40, 22,139,113,117,207, 50, 77,247,113,243,149, 0, 32,150,202, 11,251,
+244,233,147,214,188,121,115,253,111,191,253, 86, 15,229,103, 29, 58, 63,159,244,144,113,177, 2,133, 92,166,143,138,138,122,104,
+231, 76, 61,181, 70, 51,102,242,108,130, 16, 72,244,209,209,209,105,145,145,145,122,129, 64,128,196,131, 75, 52, 67,198,197,202,
+136, 74,130,172,158,184,199,189,117, 99,207,133,166, 95,124,241, 5,213,191,127,255, 71,118,127,177,212,212,212, 58, 3, 6, 12,
+144,174, 88,177,130, 26, 48, 96, 64,250,139,255,207,222,117,199, 53,113,254,225,231, 46,155,189, 71, 16, 68, 69, 81, 20,112,139,
+ 11,197, 58,107, 29,173,226,194,189, 71,157,173,179, 14,220, 74,221,168,117,214, 90,220, 84,171,162,214, 81, 23, 42, 46, 16, 7,
+ 67, 69, 1, 25, 97, 67,128,144,157,187,223, 31, 36, 52, 32, 35, 65, 91,107,127,121, 62,159,124,146,220,189,247,220,123,251,185,
+239,251, 29, 94, 94,197, 36, 73, 34, 50, 50,210,185, 58, 75,149, 6, 70, 70, 70,138, 9, 19, 38,188,123,254,252,121,109,163, 14,
+171,133,139,139, 11, 40,138, 66,183,110,221, 32,145, 72, 12,150, 45, 3, 12,248,111,162, 98, 30,173,170, 51,195, 43,148,138,111,
+167,204, 94,185, 19, 32, 76,181,238, 2,127, 25,150,104, 16,223,127,255,157, 9, 0, 35,141,216,154, 59,119,110,141,101, 78,180,
+ 68, 86,155,128,128, 0, 44, 94,188, 24,155, 55,111, 86,253,248,227,143,140,248, 87,137,242,177,211, 87, 20, 84, 88, 15,104,208,
+197,148,130,250,182, 50,190,124,161,104,133,239, 87, 27, 86,166,101,150,220, 25, 59,109,105,217,221, 75, 5,160,144,224,171, 0,
+ 96,207, 79, 63,137, 88, 92,115,147, 33,195, 71, 1, 64,207,157,219,130,206,172,193,129,154,197, 22, 77,120,124, 59,119,129,149,
+ 70,100,237,218,186,246,185, 5,145, 25, 60,243,187, 24,133,246,122, 0,192,218, 12,103,124,191,218,208, 59, 43, 79,180,221,112,
+158,253,115,224,112, 56,171,175, 95,191,110,226,237,237, 77,228,230,230, 66,165, 42, 61, 34,114,185, 28, 66,161, 16, 69, 69, 69,
+144, 74,165,104,221,186, 53,185, 99,199, 14,147,153, 51,103,174,150,201,100,211, 63,247,237,126,251,246,237,174,115,231,206,225,
+214,173, 91,195, 22, 45, 90,196,114,116,116, 36, 44, 44, 50, 9,133, 92, 6,128,166,179,179,179, 41, 99, 83, 75,129,173,131,243,
+187,244,140, 44, 15,133, 92, 6, 74, 37,175,210,219, 92,157,222,225,251, 23, 47, 94,212,219,180,105,147, 76, 59, 18,112,248,130,
+157, 59, 90,183,110,109, 29, 28, 28, 44,235,215,175, 95,178,198,121, 93, 23,103,248, 43,111, 48,251,197,139,103,205, 42,114,250,
+ 77,222,116, 80,195,169, 29,141,216,255,187,189, 7, 27, 53,106,100,237,233,233,153, 92, 29,111,131, 6, 13,196,124, 62, 95,214,
+164, 73,147, 98, 22,139, 85,106,201, 82, 40, 74, 26, 52,104, 64, 57, 56, 56,200,154, 54,109, 90,172,175,211,190,145,145, 17,173,
+177,138, 85, 6,125,162, 14, 89, 12, 40, 3, 2, 2,202, 50,195,127,223,168,145, 96,212,168, 81,252,121,243,230,225,224,193,131,
+184,123,247,238,123, 98,191,107,215,174,184,125,251,246, 74,252,135, 18,235, 26, 96,192,255, 25,170,207,163, 85, 17,135, 14,133,
+252, 9, 45,159,166,202,176,102,205, 26,174,218,146,213,115,206,156, 57, 16,139,197, 86,149, 52,235, 1,117,174,141,202, 68, 86,
+ 80, 80,208, 49,154,166,157, 1,116, 86,169,168, 7,251, 15, 28,234, 86,213,250,134, 12, 25,242, 30, 39, 77,144, 12,146, 36,138,
+ 57, 44,250,201, 79,251, 14, 30, 41,215,190,212,249,189, 49, 8, 60,221,185, 45, 72, 12,160,103, 69,177,133,191,202,140,148,113,
+106, 48,117,218,212, 50,145,181,115, 91,208, 85,207, 54,117,191, 89, 58,113,117,165,226,108,245,138, 41, 38, 36, 73,116,172,224,
+163,245, 30,231, 71,128,129,243, 47,116, 11, 8, 8,104,238,227,227, 67,106,139, 44,153, 76, 86,150,184, 83,227, 44,158,150,150,
+134,174, 93,187,146,205,155, 55,247,122,248,240, 97, 55,252, 85,206,233,115,221,118,213,219,183,111,119, 56, 58, 58, 94, 91,190,
+124,249,168,156,156,156,175,242,243, 11,108,194, 14,173, 70,159, 33,211,136,174,125, 71,136,100, 52,147,151, 42,200,108,114,243,
+226, 81,235, 75, 39,118, 65, 46,147, 77, 1, 16,135,191,210, 59, 84,228, 44,209,164,113,104,210,164,137, 72, 91,168,212,173, 91,
+ 87,226,228,228, 36,245,244,244, 44,155, 94, 69, 52,223,123,219,174, 47,167,218,255, 75, 84,211,254,212,136,182,138,105, 35,140,
+141,141,161, 17, 95,250,244, 83, 59,218,178,210, 27,101,205, 81,135,101,156,234,244, 14,229,116, 90, 72, 72, 72,143,144,144,144,
+ 54, 0,158,160,180,214,161, 2, 40, 29, 74,212,114,154, 15, 84,127, 12,215,187,129,243,255,149,243,115, 70, 87,252,229,155, 5,
+148,250,106,221,170, 82,104,213, 4,141,227, 59, 0,114,238,220,185,249, 98,177,216,106,212,168, 81,213, 46,147,145,145,113,240,
+240,225,195,229, 68,214,160, 65,131,198,133,134,134, 94,203,202,202,170,213, 86, 89,153, 27,173,185,117,126,161, 85,215,126, 27,
+230, 0,248,177, 10, 67, 30,229,217,134,255,205,206,109, 65,103, 42,136,173, 95, 1, 12,170, 74,149,246,250,114, 32,142, 30,218,
+169,241,237, 50,122,254, 56,237,210,176,168, 85,149, 70, 43, 90,154,114, 87,169,251, 49,207,224,163,245,207,128,205,102,251, 45,
+ 90,180,136, 45, 18,137,222, 19, 89, 21,133, 86, 97, 97, 33,158, 62,125,138,177, 99,199,114,163,163,163,253,228,114,249,141,255,
+194, 62,200,200,200,136, 87, 39, 35,157,173, 73,225,192,229, 25,177, 71,140,159,227, 92, 22,117,120, 98, 23,164, 18, 49, 0, 48,
+117, 73,239,192,100, 50,217,209,209,209,174, 26,171,149, 92, 46,231,106,166, 63,126,252,216, 85,147, 91, 75, 34,145,232, 28,117,
+248,119,113, 62,123,246,204, 89, 19, 29,169,137, 46,100, 50,153,236,200,200, 72,103, 13,167, 84, 42,213, 41,234,144,195,225,176,
+163,163,163,157, 85, 42,213, 71,139, 58,212, 22,198, 40,173,179, 88,174,214,162,218,183,140, 32, 8,130, 54, 12, 27, 26, 96,192,
+103,143,138,145,146,213, 23,149,174, 9, 26,199,119, 61, 22, 97,186,184,184,244, 26, 62,124,120, 57,145,229,239,239,175, 58,125,
+250,244, 77, 62,159,159, 73,146,100,188,190,253, 40,243,209,194,123,111,144, 32, 73,242,105,231,182, 77, 65,146,228,211,165, 19,
+ 39, 74,215,224, 64, 57,177,117,246,204,201,222,169,249, 49,149, 75, 51, 0, 54,246,117, 16, 48,238, 91, 4,140,251,214, 10, 64,
+ 39,160,234,104,197,234,250, 97,192,223, 3,130, 32, 56, 78, 78, 78,207, 37, 18, 9, 8,130,128, 84, 42, 45, 19, 88, 69, 69, 69,
+ 16, 10,133,101,255,229,114, 57,178,179,179, 81,183,110, 93, 16, 4,241,159,246,163,147,203,229,202, 69, 43, 55, 29,102, 48,217,
+ 74,138,146, 19,114,185,124,188, 62,215,249,162, 69,139, 72, 84,226,123, 53,115,230,204, 74,167,127, 42,206, 37, 75,150, 84, 26,
+ 37, 56,115,230,204,106,163, 7,171,194,119,223,125,247,209,162, 14,117,191,125, 25, 96,128, 1,255, 49, 84, 26,186, 87, 43,161,
+ 69,146,228,211, 74,162, 11, 9, 0, 52, 73,146, 79, 43,201,114,160,124,247,238,221, 74, 75, 75,203, 41, 34,145,232,143, 65,131,
+ 6,205,245,247,247, 87, 1,165, 14,242,181,221,162,124,161,104,133, 95,255,141,243, 10,138,165,193, 21,231, 85,180, 60,105,196,
+214,174,237, 65,187,207,132, 30,247,207, 72, 79,221, 93,213,182, 85, 37,168,170,138, 86, 20, 22,138, 87,250,245,223, 56, 39,191,
+ 80,108,240,209,250,135,160, 82,169,174, 24, 25, 25, 17,154, 98,202,218,214,171,194,194, 66,148,148,148, 64, 93,146, 6, 0, 80,
+ 92, 92, 12, 11, 11, 11,168, 84, 42,250, 63,182, 43,164, 0,230,171,173, 85, 0, 48, 63,241,230, 14,237,115,251,153,246,188,106,
+172, 89, 2, 93, 10, 68, 87,182, 92,117,243,254, 6,206,204,106, 10, 68, 87,135, 76, 61,249, 50, 1,128,205, 98,100, 85, 85, 60,
+154,205, 98,100, 85,227,183,175,231,123, 3, 65, 3, 88,105,184,178, 13, 48,224,243,125,255,255, 84, 43,238, 97,224, 52,112, 26,
+ 56,255, 17, 78,174,250,163,235, 60,195,254, 52,112, 26, 56, 13,156,255, 54,206,202, 48,249, 51, 17, 90,116, 37, 31, 0,181,180,
+104, 25, 96,128, 1,255, 58, 72,107, 57,207, 0, 3, 12, 48,192,128, 15,199,123,197,164,181,103, 84,165, 74,245,137, 38,168,141,
+178,189,102,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,243,255,142,179, 38,110,237,229, 39, 3,216,247,153,136,173, 79, 18,
+208, 98, 48,171, 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,172, 45, 12, 67,135, 6, 24, 96,128, 1, 6, 24, 96,128, 1,
+255,231,208, 47, 97,169, 1,149,160,238,192,165,160,176, 68,189, 59,131,144,114, 54,240,191,182,137,254,254,254, 12,125,218, 39,
+ 38, 90,146, 81,224,111, 54, 55, 97,247, 47, 22, 41, 54, 83, 81, 43,130,107, 58, 17,109, 27,180, 26,109,204, 51,158, 46,147,201,
+234,155,154,153,101,229,229,102,239,201,123,247,108,151, 86, 27,243, 7, 15, 30,240,125,124,124,210, 1, 20,105,189, 41, 24, 96,
+128, 1, 31, 19,150, 77, 93, 64, 16,227, 1,250,175,176, 75,138,142,129, 48,238, 80,185,118, 22, 30,227, 64, 18,205,180,166,136,
+ 65, 99, 63, 10, 98, 83,106,120,224, 88, 38, 36, 36,184, 54,108,216, 48, 25, 64, 65,197,181, 87, 50,207,112,157, 27,240, 57,163,
+ 43,202, 39, 44, 45,187, 22, 62, 92,104, 53, 26, 84, 31, 74,114, 12,104,140, 4,129,104, 36,134, 14,174, 21,143,219, 55,117, 64,
+ 49,219, 1,104, 5,208,173, 76,140,120, 45,197, 50,121, 22, 69,211,163,241,230,228, 19,189,249,234,251, 79, 67,213,229, 44, 86,
+ 34, 49,244, 39,189,248, 40,250,135, 71,183, 79,115, 45,141, 9, 52,108, 61,104, 1,202,103,112,174, 45, 56, 0,124, 73,146,108,
+102,108,108,204, 47, 41, 41,201,166, 40, 42, 5,165,227,211,249,181,228, 36, 1, 76, 48, 53, 49,233,227,106,198,105,245, 46, 71,
+152, 86,164, 80,133,163, 52,161,107,254,199, 58,163, 74, 69,150,227,190, 57, 35,124,198, 6,205,234, 1, 75,191,141, 11, 74,128,
+234,132, 22,225,220,184,227,217, 97,195,135,248,205,152, 60,214,180,142,157, 41, 4, 57, 34,155,159, 14,134,108, 10, 9, 57,218,
+111,226,176,158,125, 0, 96,245,234,213, 95,187,184,184,212, 99, 48, 24,137,203,150, 45,251,117,197,138, 21, 52, 81,117,165,114,
+190,250, 28,214,220,240, 77, 0,120, 2,104, 0,224, 45,128, 23, 40,159,101,188, 54,248, 44, 56,235,212,169,227, 68, 81,212, 68,
+ 7, 7,135,175, 50, 51, 51, 47,144, 36,121, 32, 45, 45, 45,253, 83,222,117,104,154,222, 75, 16,196,100,154,166,247,233,241, 61,
+ 69,159,117,240,120,188, 76,137, 68, 98,175,254,157, 37,145, 72, 28,254,174,237,249, 39,215,245, 15,189,127, 79,186,114,231, 69,
+ 31,237, 73,189, 58, 55,171,228,142, 66, 52,187,114, 39,166, 75,249,118,158,170, 42,238,129, 4, 77,211, 88,185,114, 37,177,106,
+213,170,113,110,110,110,141, 72,146,124,185,124,249,242,114,169,111, 42,206,211,186,206, 13, 98,203,128,207, 21,250, 21,149,174,
+ 17, 77,253, 77, 32,161,253, 1, 98,108,215,182, 45, 59, 79, 25,221,159,160, 25, 60,140,152,180, 80,169, 55,151,235, 88, 46, 24,
+226, 53,222,205, 26,207, 29,210,191, 7,217,198,179, 30,248,118, 22, 0,201,194,222,139, 73, 54,193, 65,203,118, 3,240,169, 69,
+ 47, 87,188,137, 56,102, 47, 40, 80,129, 32, 0,130, 0, 72, 2, 40,150, 80,232,245,245,152, 21, 0,126,210,243,174, 68, 90, 26,
+ 19,152,123, 76, 2, 0,140,143,112, 80,234,217,217,217,141,155, 61,123,182,137,167,167,167, 37,143,199,227, 72, 36, 18,135,132,
+132, 4,187,101,203,150,121,138,197,226,243, 0, 30,233,201, 89,183,161,179,211,201,224,185, 19,218, 53,111,224, 10,150,172, 24,
+148, 84,228,242, 42,225,117,135,169,187, 79, 77,138,201,147, 12, 71, 45, 74, 38,228,228,228, 16, 0, 96,107,107, 75,151, 23, 89,
+237,199,110,157,215, 11,115,183, 92, 65,137, 68,118,164, 58, 14,235,122, 45, 70,125,243,205, 64,191,181, 63,204, 52, 77,203,149,
+ 35, 58, 81, 12,107, 83, 54, 86,204,159,198,145, 74, 21, 29,118,255, 26, 50,121,231,134,133,251, 85, 42,213, 23, 0,218,168, 84,
+170,199, 0,126, 93,185,114,101, 85, 55,223, 85, 0,150,168, 79,232,163, 12, 6,227,106,183,110,221,234, 79,156, 56,145,104,221,
+186, 53, 34, 35, 35, 27, 28, 59,118,172,199,133, 11, 23, 18, 85, 42,213, 51, 0, 47,161, 46,123,162, 3, 88, 0, 26, 51, 24, 12,
+239,127, 51, 39,159,207, 55,146,201,100, 99,156,157,157, 39,119,236,216,209,187,127,255,254, 68,227,198,141, 17, 31, 31,223,250,
+210,165, 75, 43,194,195,195,159,165,166,166,238,227,112, 56,135, 5, 2,129,248, 31,127,142, 19,196,100, 0, 78,106,157,188, 82,
+135,239,116,148,230,146, 18,232,186, 14,137, 68, 98,175, 41, 97, 67, 16,132,253,223,185, 61,122,174, 43,150, 32, 8,107,117, 91,
+ 84,247, 77,146, 36,148, 74,165, 72,165, 82,185,213,192,217, 88,253, 34,165,179,214, 5, 80, 93, 34,104, 35, 0,232,213,169, 89,
+ 30, 8,196,148, 89,180,222,127,201,140, 41, 19, 96, 52,154, 93,185, 27, 99, 93,206, 10, 86,241, 45,118,229, 74, 98,197,138, 21,
+ 8, 12, 12,236, 15,192,151,162,168,112, 15, 15,143, 29,229, 40, 41,170,108,222,138, 21, 43,182, 87,115,157, 27, 96,192,231, 2,
+ 63,232, 83, 84,186,202,247, 31,183,193, 93,160,194, 88, 87, 27,123,255, 89, 19,135, 26,121,122, 52,132, 4,166, 72,202, 81,225,
+ 98,216, 37, 0, 56,161,159,213,105,104, 27, 38, 83,114, 56, 40,112,126, 19,223,118,158,120,158,166,192,227, 52, 21, 74, 18, 21,
+ 96,144, 10,168, 40, 26,160, 33,169,237, 86,167,230, 43,113,231,165, 12, 36, 1, 48, 72,128, 36, 9, 48,200, 90,146, 81,178, 87,
+171, 15, 69,121,230,100, 82, 0, 37,123,245,129, 7,164,153,187,187,251,168, 85,171, 86, 89,102,100,100,152, 68, 70, 70,130,203,
+229,194,202,202,138,193,231,243,157,182,108,217, 34,158, 53,107,214, 87,114,185, 60, 9, 64,142,142,156, 30,125,219,120,223,219,
+ 23,180,218, 66,241,224, 18, 10,142,255, 6, 6, 73,131,109, 98,138,250, 70, 70,184,244, 77, 67,107,255,176,196,211, 15, 51, 69,
+ 30, 0,210,106, 34,139,139,139, 99, 72,165,210,225,230,230,230,237, 89, 44,150, 3,207,170, 30,149,206,108,147,155, 77, 52,120,
+155,101, 95,210,101, 94, 15,135, 62,155,231,116,195,220, 45, 87,176,237,216,253, 95, 90, 33, 99,121,117,121,179,141,141, 77,167,
+204,154, 62,209, 52, 53, 71,142, 53,167,115,112,232,118, 33,198,248,154, 97,238,151, 22, 8, 24, 49,204,228,212,111,161, 83, 0,
+236,215, 90, 36,222,195,195,131,136,139,139,171,236,230,107, 5, 96,161, 76, 38, 35,217,108, 54,193,227,241, 70,173, 93,187, 86,
+ 62, 98,196,136, 84, 77, 3, 95, 95, 95,248,250,250, 18, 69, 69, 69, 13,110,220,184,209, 32, 36, 36, 68, 25, 17, 17, 17, 11,224,
+108,213, 22, 11,163,119, 18,137,216,133,103,100, 84,242,211,238,221,155,187,116,233, 66,113,185,127,165,159,170, 13, 39, 0, 88,
+ 88, 88,236,183,183,183, 39, 22, 47, 94,156,254,177, 56,235,213,171,119,165, 93,187,118,221,122,245,234,197,236,212,169, 19,156,
+156,156,202,230,217,218,218,194,215,215,151, 72, 73, 73,105, 30, 30, 30,190,251,202,149, 43, 59,158, 60,121,114, 35, 41, 41,169,
+215, 63,108,209,218,167, 22, 19, 2, 61,219,127,246, 32, 8,194,116,239,222,189,246,154,154,140, 10,133, 2, 42,149,170,236, 91,
+243,161, 40, 10, 42,149, 10,107,215,174, 85,137, 68, 34, 93,246,145, 72,235,173, 89,243,161, 42,251,230,112, 56,182,154,132,189,
+ 53,220,217, 99,248,220,130,166, 38, 38, 38,174, 0,250,194,174,209,194,242, 13, 74,223,159, 69, 34, 81,178, 64,106, 25, 3,160,
+ 75, 53,108,150,171, 86,173, 26, 19, 24, 24, 56, 80,203, 74,235, 61,100,200,144,138,101,175,188,213,223, 34,130, 32,110,146, 36,
+121, 30,192, 33,124, 68,171,187, 1,255, 45,208, 52,221, 22,128,157,214, 36, 25, 74, 71,133,160,126, 78, 18, 0,108, 42, 76,215,
+110,167,249,206, 86, 79,183, 83, 47, 71,107,241,102, 19, 4,241,168,150, 93,188,133, 42,252,180,152, 0, 16, 22, 22, 70,247,235,
+215,143,208,124, 87, 46,138,252, 47, 78, 24, 49,160,207, 87,221, 59,130,228, 89,225, 85, 22, 16,241,142, 6,147, 84,128, 4,141,
+ 7,119,111,208, 96, 82,135, 43, 44, 85,181,245,164,222,224,239,188, 61, 61, 54, 30, 8,154,205,136,205, 98,226, 80,120, 9,228,
+146, 98,100,103,188, 67, 86,122, 50, 4,169,111,145,246,238,237, 51,128, 88,161, 51,231,123, 7, 6, 80, 81,234,119, 64, 10,168,
+ 38,242,178,102, 78,185, 40,174, 65, 99, 79,207,124,142, 10,144,139,226,116, 88,125, 85,156, 94,141, 26, 53, 26,241,195, 15, 63,
+ 88,191,120,241,194,168,164,164, 68,122,233,210,165,248,164,164, 36,115, 62,159,159, 55,109,218,180, 70, 78, 78, 78,230,131, 6,
+ 13,226, 28, 63,126,252,107,148, 15,107,173,138,211,115, 64,251,150, 17, 7,119,108, 53,201, 61, 21, 12, 89,194, 83, 92, 20,136,
+112, 55,179,132,110, 96,193, 37,190,109,110, 7, 83, 46, 19,171, 59, 57,153,246, 61,147,176, 81, 65, 81, 1,213,113,222,187,119,
+143,111,108,108,188,101,228,200,145,252,153, 51,103,114, 85, 76, 75,102,104, 68,174,197,194,221, 17, 78, 37, 82, 57, 99, 68,183,
+122,152, 55,210, 27,243,182, 93,215,136,172,201,245,235, 23, 80, 81, 81, 85,115, 42,228,242,250,206,246,230,136, 78, 18,227,208,
+237, 66,252,249,131, 19,186,175, 77,199,160, 86, 76,120,212, 53,133, 82,174,104, 60,100,200,144,195,234,183,246, 71, 0,190, 30,
+ 50,100, 72, 19, 6,131,113, 29,192,239, 53, 29, 35, 30,175,242,234, 41, 86, 86, 86,232,218,181, 43, 60, 60, 60,152, 93,186,116,
+241,174, 32, 96,202,113,202,229, 50, 62, 69,209, 48, 51, 51, 51,178,177,177,177, 50, 51, 51,203,173,236, 65,165, 15, 39, 0, 88,
+ 91, 91, 15,238,218,181, 43,243,216,177, 99, 57,137,137,137, 15, 70,140, 24,241,214,220,220,188,156,245,215,196,196, 4,141, 26,
+ 53,194,178,101,203,152,125,250,244,169,145,211,193,193,161,103, 72, 72, 8, 8,130, 40,123,104,191,103, 44,118,117,133,163,163,
+ 35,250,246,237,203, 28, 60,120,112,207,164,164,164, 90, 93, 71,122,224, 90, 37, 22,173,149, 21,142, 83,149,195,111,149,181,215,
+225,184,103,105,172, 75,106, 62,124,192,181, 89,237,112, 39,143,199, 43,179, 66, 85,178,174,247, 56, 73,146,196,210,165, 75, 65,
+ 16, 4, 88, 44, 22,216,108,118,165,223,126,126,126,250,246, 51,133, 32, 8,146,205,102, 47,100, 50,153, 19,165, 82,169, 51,143,
+199, 75, 87,169, 84,191, 72,165,210,181, 0, 20, 52, 77, 91, 86, 33,178, 42,229, 52, 49, 49,113,125,245,234,149,123, 85, 29,145,
+ 74,165,240,246,246, 6,164,136,173,142, 51, 33, 33,193,213,205,205,173, 49, 0, 77,137,182,219, 52, 77,119,209,250,175,141,219,
+ 52, 77,127,169,254,253,242,205,155, 55,174, 13, 27, 54,204,255,167,206, 79, 3,231,191,143,179, 6, 45, 98, 71, 16, 68,152,113,
+ 48, 25,151, 0, 0, 32, 0, 73, 68, 65, 84,214,181,218, 79,243,127,209,162, 69, 75,214,175, 95,255,130, 32,136, 48,237,233,218,
+237,180,191,213,247,155, 48,154,166,251, 45, 94,188,216,115,195,134, 13,235, 52,109,255, 14,145,168,143, 69,203, 60, 91, 98,130,
+240,119,230, 96, 50, 84, 96,146, 4,152, 12, 0, 52,129,228,164, 4, 20, 21, 22,220, 65,226,233, 68,221, 44, 89,254,157, 90,180,
+240, 10, 58,186,109, 1,249,115,120, 9, 10, 68, 18,196, 61,185,137, 71, 55,127,207, 80, 41, 85,191,131,160, 31, 3,100, 36,222,
+ 82,241, 64,104,237,106, 92, 16, 52,179, 84,104,169,197, 85, 57,177,245,201,208,188, 73,147, 38,195,150, 45, 91,102, 27, 21, 21,
+197, 19, 10,133, 69, 71,143, 30, 77,151, 74,165, 73, 0, 46, 39, 39, 39, 55,217,190,125, 59, 39, 40, 40,200,203,203,203,139,127,
+242,228, 73, 89, 37,229,140,222,227,156, 63, 54, 32, 98,226,172, 57,188,216,147,187,192,137,141,196,210,167, 57,170, 63, 5, 37,
+ 63, 0,216,134,148,226, 78,217, 18,229,213,173, 93, 93,200,122,102,108, 52,180,228,248,197,229, 73,170,181,100, 25, 27, 27,111,
+ 9, 9, 9,113,109,219,182, 45, 9, 0,225, 47,149,220,133,187, 35,156, 46,175,239, 68,116,106,102,131,172, 2, 41,102,239,138,
+198,165,136,172, 63, 52, 34,171,166, 78,154,153,153,101,167,102, 21, 58,216,152,242, 48,186,179, 41,186,175, 77,135,127, 27, 46,
+184,108, 2,241,137, 25,104,232, 86,143,136,190,115,182,141, 90,100,181, 21, 8, 4, 0,208, 6, 64, 98, 74, 74, 10,223,199,199,
+ 71,168, 69,151, 15, 96, 35,135,195, 89, 74, 16, 4,221,182,109,219,104, 47, 47,175, 98, 43, 43, 43,136,197, 98, 72,165, 82,176,
+217,108,136,197, 98, 36, 39, 39,227,193,131, 7,176,178,178,210,235, 64, 21, 23, 23,195,204,204, 12, 20, 69,125, 48,167, 74,165,
+ 34,246,236,217, 99,242,226,197, 11,147,208,208, 80,135,185,115,231,230, 54,109,218,244,241,176, 97,195, 94,219,219,219, 75,159,
+ 62,125,138,123,247,238, 33, 63, 63, 31,237,219,183,215,137, 83, 38,147,129,201,100, 66, 44, 22,131,203,229,130,201,100, 66,169,
+ 84,130,162,168, 50,241, 85, 92, 92,140,188,188, 60,176,217,108,200,100,178, 79,241, 6,250,158,133,170,186,225,183,218, 88,180,
+180,133,154,142, 34,171, 38, 75, 84,149,195,157, 5, 5, 5, 70,150,150,150, 11, 1, 8,106, 90, 23, 65, 16, 96, 48, 24, 96,179,
+217, 32, 8, 2, 93,186,116,193,132, 9, 19,208,170, 85, 43, 36, 36, 36,224,248,241,227,120,244,232, 17, 88, 44, 86, 89,123,157,
+199, 39,252,252, 24, 60, 30,239,222,128, 1, 3, 60,127,248,225, 7, 94,189,122,245, 16, 27, 27, 91,119,195,134, 13, 11,175, 93,
+187, 54, 80, 36, 18,181,209,220,237,170,183,210,171,135, 4, 75,135, 11,251, 74,165, 82,196,198,198,234,179,204,123,104,216,176,
+ 97, 50, 73,146,175, 41,138, 10, 7,224, 77,211,116, 23,130, 32, 46,161,212, 47, 81, 27, 34,154,166,191, 36, 8,162, 16,192, 51,
+146, 36, 95, 82, 20,149,108,176,219, 24,160,195,125,165, 95,197,255, 4, 65,132,173, 95,191,190, 95,101,226,170,146,107,179,220,
+244, 13, 27, 54,172,211,250,255, 33, 22,213,174, 40,239, 12,239,167,182,114,253, 37,180,194,194,194,170, 87, 32, 20, 6,133,157,
+ 62,118,191,187, 28,174,158,173,125,181,172, 67, 52, 34, 31,220, 3, 64,255,162, 83, 87,248,253,140, 72, 6,243,151, 61,235,102,
+146,123,111,150, 32, 37, 61, 11,247, 46,254,130,108, 65,210, 33,128,158,139,196,208,194, 15, 62, 18,245, 6,121,217,219,216, 90,
+ 74,228, 52, 40, 26,192,123, 98,235,147,160, 85,227,198,141, 7, 71, 68, 68,216, 74, 36, 18,222,157, 59,119, 74, 66, 66, 66, 50,
+228,114,249, 77, 0,119,213,109,162,178,179,179,135,168,133, 9,131,201,100,114,228,114,121,117,190, 11,173,230, 79, 28,115,103,
+227,158,131,188,215,207,163,177, 61,244, 34, 10, 74, 74, 84, 55,179,196, 95, 3,208, 40,250,235, 81, 57,226, 52, 26,180, 11,139,
+ 36,192, 55, 97, 57,198,229, 73,120, 64,229, 67,178, 82,169,116,196,200,145, 35,249, 26,145, 5, 0, 57, 69, 10,102,137, 84,193,
+232,212,204, 6,173,187, 13, 65,228,141, 83, 56,121, 59, 13,110,118,198,183,235,155, 20,232,180, 71,179,179, 4,123,182, 6,239,
+221,186,113,229,124,206,188,190, 22,240,111,195, 2,143, 77,192,220,152,133,181, 59,246, 43,162, 30,220,126,202,231,243,195, 0,
+124, 45, 16, 8,192,231,243,139, 1,188,100, 48, 24,137, 42,149,170, 50,167,238,229, 0, 28, 14, 31, 62, 76, 42, 20,138,226,132,
+132, 4, 56, 58, 58,194,193,193, 1, 22, 22, 22,136,139,139,195,159,127,254,137,248,248,120, 80, 20,133, 22, 45, 90,232,117,176,
+114,115,115,241,244,233, 83,244,237,251,213,220,236,236, 44,115, 43,107, 27,209,157,240,219,155,106,195, 73, 81, 20, 1, 0,158,
+158,158,240,244,244,228,165,165,165, 57,135,133,133,217,175, 89,179,230,157,171,171,235, 81,177, 88, 92,206,114,160,171,208,210,
+136, 11,141, 8,228,241,120, 96,179,217, 40, 44, 44, 68,102,102, 38,138,138, 74,131, 54, 45, 45, 45, 63,137,208,170,194, 66,245,
+209,218,255,205,226,240,189,225, 78, 75, 75,203,145, 0, 22,234,184, 45, 80, 42,149, 96,179,217,240,241,241, 65,112,112, 48, 30,
+ 61,122,132,223,127,255, 29,117,235,214,197,216,177, 99, 65,146, 36, 94,188,120,161,111, 23,169,136,136,136,133, 95,127,253,181,
+231,225,195,135,121,201,201,201,136,143,143,135,165,165, 37,130,131,131,185,147, 39, 79,110,120,227,198,141,229, 40, 13,126,169,
+ 30, 90,209,133, 34, 35,254, 80,111,111,239,247,154, 56, 58, 58, 90, 92,190,124,217,190, 76,128, 85,140, 72,124, 31, 5,203,151,
+ 47,223,234,225,225,177, 77, 61, 92,232, 11,192,132,166,105,191,208,208, 80, 2, 0,252,253,253,105,130, 32, 52, 15,164,103,167,
+ 78,157,234, 22, 23, 23, 71, 7, 6, 6, 26,124,180, 12,168, 74,139, 76,214, 92,147, 85, 9, 40,125,132,154,182,197, 75,131,197,
+139, 23,123,174, 95,191,254,225, 7,138, 44,237, 55, 38, 90, 35,182,202, 30,166, 85, 14, 25,150,217,190, 72,190,163,189,141,245,
+162,177,157, 64, 81,128, 82, 5, 40, 85, 52, 68, 37, 98,196, 62,127, 84, 2, 30, 17,170, 83,119,184,156,160, 53, 63,204,105, 16,
+157, 74, 34, 61, 95,142, 91,103,247,210,217,130,164,193, 72, 60, 53,254,227,136,172,161,222,142, 14,246,183,142,237, 93, 77, 62,
+122, 43,131,138, 42,213, 89, 20, 69,151,253,254, 4,112,180,179,179, 11,184,127,255,190, 29,151,203,229,189,122,245,138, 58,117,
+234, 84,190, 92, 46,191,166, 37,178, 0,160, 83,155, 54,109,148,166,166,166, 16,137, 68,114,185, 92, 46,169, 70,100, 57,251,181,
+106,126,123,227,158,131, 60,137, 76, 6,161, 88, 10,134,141,125, 69,145, 5, 0, 29,187,185,215,169, 67,240,204, 64, 3, 72, 42,
+148,167, 87, 37,178, 0,128,203,229,246,152, 57,115,102,185,186,120,182,102, 44,165, 49,151,165,186, 27,147, 67, 69,222, 56,133,
+240, 23, 57, 20,143,205, 80,217,209,111, 27,232,186, 3, 10, 82, 99,246,252,126, 46,236,234,119,203,130,138, 75, 68, 69,112,115,
+ 50, 66,113,145, 16,107,215,111, 84, 68, 68,132,223, 92, 56,119,106,135, 83,167, 78,109, 64,169, 51, 56, 0,188, 60,117,234,212,
+152,101,203,150,253,138,191,210, 60, 84, 68,122, 64, 64, 64,106,179,102,205,132, 30, 30, 30,194,220,220, 92,196,196,196, 32, 63,
+ 63, 31,219,183,111, 71,108,108, 44, 52, 22, 65,157,124, 85,222, 23, 72,200,207,207, 51,165,105, 26,249,121,185, 38, 63,252,240,
+131, 69,109, 56, 85, 42, 85,185,107,171, 78,157, 58,152, 54,109, 26,187,164,164,196,242,221,187,119,230,218,243,116,229,148,201,
+100,208, 88,134,104,154,134, 76, 38,131, 80, 40,132, 76, 38,195,235,215,175,203, 68,150,122,253,159,204,162,165,249,205,227,241,
+ 50, 53,231,178,102, 8,142,199,227,101, 85,213,254, 67,160,181, 46, 90,253, 91, 95,113, 88,227,246,232,120,220,193,102,179, 49,
+ 97,194, 4, 60,124,248, 16, 9, 9, 9, 96, 48, 24, 16,137, 68, 40, 41, 41, 65,207,158, 61,193,225,112,244,181,104,209,108, 54,
+123,228,146, 37, 75,120,137,137,137,200,201,201,209, 56,211, 67,165, 82, 97,238,220,185, 70, 92, 46,119,164,190,166,123,129, 64,
+208,251,245,235,215,141, 43,126, 50, 50, 50,132,218, 62,133,181, 69,104,104, 40,225,239,239, 79,251,251,251,211, 26,193,101,128,
+ 1,149,161, 10, 45,178,175, 42,139,214,199,176,138,105, 44, 91, 80, 7,136,212, 2, 26,145,213, 85, 75,120, 17, 26, 11,151,110,
+ 67,135,110, 67, 91, 58,216, 88,223, 56,188,107,149,105,216,115, 2,169, 41, 73,200, 22, 36,163, 77, 7, 63,196, 62,143, 6,165,
+ 80,157,198,235,208,154, 61, 57,235,249,187,123,120, 52,157,222,181,131, 23,130,194,138,241, 42,242, 50, 10,178, 5, 59,145,116,
+234,244, 71, 57, 66,174,254,205, 29,236,173,111,252,186,107,149,229,165, 24, 18, 41, 41, 73, 56,251,235, 86, 90, 33,151, 22,160,
+124, 36,151,222,111,205, 70,148,140, 83, 92,144, 9, 89,145, 10, 60,178,132,167,231, 32, 69, 6,128,240,173, 91,183,118,111,223,
+190, 61, 39, 32, 32, 32, 35, 63, 63,255, 44,128,251, 90,109,154,185,187,187,247, 13, 14, 14,118, 72, 73, 73,193,181,107,215, 50,
+ 80, 26,250, 95, 21, 82,111, 71, 63,223,253,231,175,251,231, 27, 53,104,130,237, 75,190, 83,134, 62,138, 25, 0,224,146, 86, 27,
+143, 30,222,238, 97,107,190,159, 65, 82, 81,127,224,105,114, 38,222, 10,165,127, 86, 69,152,147,147, 67,148,148,148,184, 90, 90,
+ 90,106,159,144,224,155,136,164, 11,134,186,167,247, 92,120,199, 73, 34, 87,129,203, 34,233,217, 3, 93,211, 31,158, 13,181,201,
+145,228, 16,154,104,196,154, 48,105, 88,143,129,187, 66,206,140, 14, 11,187, 48, 93, 46,149,120, 53,105,210,152,126, 28,113,227,
+233,194,185, 83,251,212,242,136,155, 62,124,248,144,100, 48, 24,229, 4,186,182,133, 72, 95, 75,145, 62,208,149,179,162,208,210,
+ 64,169, 84, 18,181,229,148, 74,165,101, 66,171,226,195,189, 50,193,248,119,108,191, 62, 22, 42,237, 33, 67,141, 63,157, 68, 34,
+177, 87,251,108, 57,124, 76,139,214,135, 68, 34, 86, 55,124,169, 79,255, 72,146, 4, 69, 81, 96,179,217,104,209,162, 5,194,194,
+194, 96,109,109, 13,115,115,115,152,155,155,195,200,200, 8, 54, 54, 54,101, 66,139, 36,117,142,210,161,165, 82,105,221,186,117,
+235,226,245,235,215,224,241,120,101, 31, 46,151, 11, 79, 79, 79,136, 68,162, 58,248,148,182,123, 3, 12,248,123,239, 43, 97,218,
+ 98,137, 32,136,176, 69,139, 22, 45,169, 45,223,162, 69,139,150, 84,102,225,250, 64,193, 85,206,186,197,212, 86,144,149, 42, 73,
+181,200, 58,180,115,165,249,153, 39, 64,106,106, 34,174,158,220, 81,164,144,203,242, 41, 74,225,250, 54, 62, 26, 32,241,139, 78,
+ 93, 32,233,118, 3,251,118, 35,174,190,144,161,176, 32, 27, 47, 31, 95, 78,130,152,179,248,163,137, 44, 7,219, 27,135,119,173,
+180, 60,255,156, 64, 74, 74, 18, 46, 29,219, 94,168,144,203,123, 32, 49,244,241,135, 80,143,100,179, 7,178, 93,222,245,155,232,
+155, 14, 21,161,194,200,216,184, 47,179, 50, 48, 80,112,167,250,200, 48,109,100,103,103,159,221,186,117, 43,241,227,143, 63,118,
+149, 72, 36,191, 1,208, 54, 81,122,185,185,185, 13,223,183,111,159,117, 74, 74, 10,235,206,157, 59,162, 27, 55,110,208, 0,206,
+215, 96,113, 89,208,115,252, 52, 70,171,122,117,102, 70, 37,165, 13, 0,240,135,214,108,207,126,173,155,221, 61,184,126,185,153,
+226,110, 40,138, 5, 41, 88,124, 55,181, 16,128,206,251, 91,161, 80, 64, 40, 20, 66, 81,156,171,108,195, 23, 9, 3,135,216, 75,
+ 51,243, 37, 76, 22, 85,162,244, 48,207,146,222,200,125,203, 48, 54, 54,214,107, 95,238, 90, 63, 63, 4, 64,200,144, 33, 67, 14,
+ 63,139,184,208,134,207,231, 95,240,240,240, 32, 0,160,138, 8,195,170,176, 10,192,220,142, 29, 59, 18, 62, 62, 62, 15,182,109,
+219,118,165, 58,177, 82, 27,139, 86, 77,208,149,147,162, 40,178,138,253, 75,212,150, 83,219,162, 85,147,208,250,148, 22,173,202,
+ 68,139,182, 72,212, 22, 66,255,134,168,195,234,196,148, 62,253,211,248,201,177,217,108, 68, 71, 71,195,197,197, 5,114,185, 28,
+102,102,102, 48, 51, 51,131,169,169, 41,138,138,138,192, 98,177,160,231, 54, 83, 60, 30,239, 93, 76, 76, 76, 99, 59, 59, 59,168,
+ 84,170,114, 98,235,213,171, 87, 48, 49, 49, 73,211,215,162,197,231,243, 47,171,163, 14,203,193,209,209,209,226, 99,236, 87,109,
+ 75,150,191,191,191, 97,136,208,128,106,173, 89, 85, 88,181,178, 43, 88,162,100, 90,255,179, 81,154,195,173,159,250, 55, 42,249,
+ 45,171,100, 90,238,250,245,235,111,104,249,119,101,127,224, 38,104, 82, 60,148,139,112, 97,214,100,201,178,183,182,186,113, 96,
+123,160,249,201, 72, 32, 45, 37, 17,183, 78, 7, 11,149, 42,249, 23,160,104, 65,196,181,211,161, 32, 80,130,183,161,183,116,187,
+ 69,160, 85,171,166,174,248,253,133, 2,217,169,175, 64,211,212, 33,100,133,148,124,240,209,113, 27,212,194,222,218,246,198,161,
+224, 64,139, 51,209, 4, 82, 83, 18,113,245,100,112,161, 82, 81,210, 29,137,167, 35,107, 75, 59, 1,176, 98,152,240,118, 15,246,
+107, 53,212,213,205, 25, 20,173, 0,197,166, 49,104,129, 45,243,101, 84,201,239,225, 60,225, 73,170,152,154,158,118, 95, 55, 7,
+186,226,226,226,223, 1, 60, 70,249,244, 10,205, 27, 53,106, 52,116,247,238,221,118,169,169,169,188,168,168, 40,241,222,189,123,
+179, 40,138, 58, 3, 64,151,161,212,239,162,146,210, 14,160,124,190,156,230,243,199, 7, 68, 4,140,155,200, 75,188, 22, 2,171,
+196, 88,124,127, 55, 93,245, 50, 95, 54, 66,109, 93,171, 20,182,182,182,116, 78, 78, 78,114, 65, 65, 65, 99, 19, 19, 19,228,230,
+230, 34, 47, 47, 15, 66,161, 16,210,194, 60,165,141,170, 64, 68, 40,243,192, 98,177,144,149,162,128, 74,165,202,208,213,154, 5,
+192,106,213,170, 85,147, 40,138,210,100, 68, 44, 23, 93,168,213, 78,115, 62, 52, 30, 50,100,200, 97,173,168, 67,109,103,120, 77,
+122, 7, 66,157,222,161,253, 31,127,252, 17,215,167, 79,159,212,202,196, 10,151,203,213,219, 81,186,170, 40,198,218,112, 86,101,
+209,170, 56, 93, 31, 78,205,240,165,198, 9,190,226,116, 13, 24, 12, 6, 40,138,130, 14, 65, 21,127,171,104,209,142, 14,172,141,
+200,169,112,108,170, 77, 28, 90,203, 72,196,143,106,209,210, 28, 11, 54,155,141,115,231,206, 97,220,184,113, 80,169, 84, 48, 54,
+ 54,134,169,169, 41, 76, 76, 76,112,250,244,105,104,210, 63,232,163, 95, 21, 10,197,145,245,235,215, 47,217,179,103,143, 17, 77,
+211,224,112, 56,101, 66, 43, 48, 48, 80, 44,151,203,143,232, 36,180, 52, 25,223, 41, 58,198,196, 68, 89,109,212, 97,101,203, 84,
+225,175,101,185,106,213,170, 49, 20, 69, 13, 68,133, 20, 14, 21,218,149, 75,253, 96, 72,239, 96,128, 14,247,147, 71,255,226,238,
+105, 4, 22,161,101,201, 42, 19, 92,100,117,226,197,206,202,242,198,254,237,129,230, 71, 31, 17, 72,124,251, 22, 55,127,219, 81,
+ 42,178,222,156,124,130,228,208, 76, 36,134,118,198,219,208,222, 58,191, 61, 17, 68, 43, 39,123, 75,228,137, 40, 20,230,188, 3,
+104, 68,125, 12,145,101,103,101,119,227,231,224, 64,139, 83, 79, 72, 36, 38, 38,226,234,201, 29, 66,165, 82,242,197,135,136,172,
+145,108,246,192, 70,238,206, 9, 75, 39, 13, 28,234,211,208, 17, 54,239,226,112,126,236, 80,172, 62,254, 13,204,236, 24,104,215,
+215, 12, 19,214, 58, 14,229,123,114, 95,243, 59, 99,160, 30,212,218, 34,171, 85,253,250,245,135,222,191,127,223,214,219,219,155,
+ 23, 31, 31, 47,217,187,119,111,150, 88, 44,190, 2, 32, 90, 15, 78,109,145,213,106,209,228,177, 17, 27,247, 31,230,145,108, 14,
+130,142,156,199,172,219,169,170, 11,201,133, 67, 80,126, 88,177, 82, 72,165,210,107,193,193,193, 82,146, 36,145,151,151,135,156,
+156, 28,100,101,101,149,125, 23, 20, 20,128,193, 96,224,250,245,235,178,194,194,194,251,186,118,240,222,189,123,245,211,210,210,
+ 60, 4, 2, 65, 27,245, 39, 30,165,209,133,166, 90,211,218, 8, 4,130,174, 0, 30,105,166,167,166,166,214,123,240,224, 1,191,
+ 38,126, 51, 51, 51,176,217,236,114, 22, 45, 46,151, 11, 7, 7, 7, 40,149, 74,156, 56,113, 2, 0,242,170,227, 96,179, 57, 2,
+146, 36, 64,209,148,148,199,227, 81,124, 62,191, 82,129,165, 15,167, 26,169, 95,126,249,165, 36, 50, 50,178, 82,139, 86,109, 56,
+105,154, 46,233,213,171, 23,210,211,211,193,227,241,202, 30,214, 26, 65, 69,146, 36,184, 92, 46, 50, 50, 50, 48,101,202, 20,208,
+ 52, 93,242, 79,223,121,180,125,154,212, 98,136, 0, 64,168,133,208,123,126, 90,186,250, 64,105,134, 6,105,154,134, 70,112, 85,
+152, 95,182, 46, 93,178,183, 87,240,233,154, 92, 80, 80,176,177,180, 59,244,222, 10,223,251,244,120, 40,148, 9,173,216,216, 88,
+ 28, 62,124, 24, 5, 5, 5,224,112, 56,200,207,207,199,193,131, 7, 17, 19, 19, 3, 14,135, 3,205,190,208, 85,191,249,248,248,
+108, 12, 15, 15,143, 25, 49, 98,132, 56, 58, 58, 26, 98,177, 24,209,209,209,232,221,187,183,228,238,221,187, 9, 98,177,120, 21,
+116, 25, 58,212,100,124, 87,151,215,145, 74,165,136,138,138,170,244, 83,213, 50, 21,145,144,144,224,170, 82,169, 26,211, 52,237,
+ 75,211,180, 57,212, 41, 28,212,255,181, 63, 95,170,231,153,211, 52,237,171, 82,169, 26, 37, 36, 36,184, 26,228,132, 1,159, 41,
+110,105,137, 45, 90, 75,100,221,170,222,162, 69,145,193, 7,118,172, 52, 63,242,144, 68, 74,114, 2, 30, 95,220, 45, 84, 81,138,
+ 47,244, 44,135,211, 3, 90,185, 54,120, 70, 38, 94, 20, 81, 26,206, 92,152,147, 2,208,140,218, 8,173,114,156,160,200,224,131,
+ 59, 2, 45,142, 61, 38,144,158,242, 6,119,207,238, 18, 42,149,210,238,120, 27, 26, 85, 27,206,145,108,246, 50, 22,131, 88,218,
+171, 83, 75,118,231,150,238, 48,201, 74, 66, 70,106, 58, 78,196,102,231, 37,228, 75, 39,222, 37,228, 72,126, 35, 61,208,119,146,
+181,181,149, 35, 11,253,166,218, 88,223, 63, 95,248, 59,193, 18,201,105, 57,189, 94,112,183,172, 44, 69,249,126,190, 15, 71, 51,
+ 51,179, 17,143, 31, 63, 54,231,241,120, 70,143, 31, 63,166,246,238,221,155, 43, 22,139, 47, 2,136,208,105,219,223,135,115, 91,
+119,183, 91,235,118,237,231, 21,139, 74, 32,146,201,193,117,224,171,206, 68, 60, 31,140,170, 19, 96,150,227,228,114,185,199,142,
+ 29, 59,214,183, 75,151, 46,174, 94, 94, 94,100, 94, 94, 30,138,139,139,203,156,171,237,236,236, 16, 27, 27, 75, 37, 38, 38,166,
+115,185,220,227,186,246,179, 99,199,142,137, 36, 73,198,171,135,209,226, 81, 33,186, 80,171,105, 99,129, 64,208,150,207,231,223,
+ 2, 96,172, 21,117,168,205,169, 73,239,176, 4, 0, 73, 16,196,163,232,232,232,226, 62,125,250,192,200,200, 8, 34,145, 8,117,
+235,214,133, 82,169,196,197,139, 23, 17, 25, 25, 41,162, 40,234, 86, 37,226,181, 92, 63, 37, 18,113, 93, 0,164,184,164,164,197,
+152, 49, 99,186,206,155, 55,175, 92, 72,186,189,189, 61,172,173,173,245,226, 4,128,188,188,188,166,127,252,241,199,156,232,232,
+232,239,250,246,237,107,177,100,201, 18,110,253,250,245,161, 82,169,200,218,114,230,231,231, 91, 68, 69, 69,109,234,220,185,243,
+140, 62,125,250, 48,215,173, 91, 7, 11, 11, 11,168, 84, 42, 24, 25, 25,161,176,176, 16,171, 86,173,194,157, 59,119,148, 52, 77,
+239, 18, 10,133,223,235,121, 46,225, 67,175,205,170, 44, 64, 85,165,100,168,162,253,223,222,207, 10, 62, 93, 80,167,112, 88, 88,
+ 69, 6,123,232,122,206,107,132, 22,131,193, 64, 82, 82, 18,246,238,221,251, 94, 30, 45, 77,250,135, 42,184, 43,219,118,250,230,
+205,155, 42,130, 32, 58, 60,126,252,120,225,232,209,163, 39,138, 68, 34,103, 19, 19,147,116,133, 66,241,139, 88, 44, 94,139, 82,
+127, 84,182, 62,247, 16,145, 72,148, 92, 89,212, 97,197, 54,128,101,181,156, 21,210, 59,148, 75,225, 80, 97,153,114,169, 31, 42,
+ 73,239,240,183, 31,119, 3,231,191,146,243,115, 23, 91, 85, 39, 44,125, 15,173, 38,179, 88, 98,133,119,120, 2,241, 33, 34,235,
+125,107,137,164, 36, 97,249,177,119, 45,101, 82, 9, 68,194,204,151, 72, 58,145,245, 65,155,165,238,231,237, 4, 2, 73,137,111,
+240, 48,108, 87,105, 63,223,134,214,186,159, 4,176,248,167, 75,161,108,194,194, 26, 79,231,140, 67,122,129, 8,151,222,230,159,
+164, 75,164,211,143, 0,249,184, 3,144, 74,105,248,193, 31, 50,118,251, 14,178, 24,106, 91,135,133, 45,243,127, 1,111,145, 13,
+187, 93,247, 46,250,212, 64,204,224,241,120,225,219,183,111,239,225,235,235,203, 29, 50,100, 72,101, 14,242,250, 34,245,209,171,
+ 55, 63, 93,216,179,121,190,141,119,123,236, 92,182, 64,117, 44,226,121,197, 40,196,106,225,225,225,161,186,119,239,222,188, 41,
+ 83,166,108,233,209,163,135,211,128, 1, 3, 56,117,235,214, 5,151,203,197,155, 55,111, 16, 30, 30, 46,123,251,246,109,122, 73,
+ 73,201,188,230,205,155,235,147,227, 44,127,249,242,229, 27,213,235, 32,212,195,133,109,160,142, 46,212, 52, 82, 39, 45,109, 3,
+192, 56, 48, 48,112, 52, 0, 84, 17,246,189, 28,192, 30, 0, 76,154,166, 51, 66, 66, 66, 58,156, 61,123,182,195,220,185,115,217,
+125,251,246,197,253,251,247,113,245,234, 85,185, 92, 46,143, 80, 11, 87, 93, 75,229, 80, 0,162,148, 74,229,243,160,160,160, 14,
+ 12, 6, 99,185,102, 70, 76, 76, 12, 14, 29, 58, 84, 27, 78, 37,128, 77,153,153,153, 63,133,132,132, 44,191,118,237,218,248, 49,
+ 99,198,152, 43, 20, 10,196,198,198,226,231,159,127,174, 21,167, 80, 40,156, 99,107,107,187,244,226,197,139,191, 92,185,114,229,
+235, 81,163, 70,145,179,102,205, 66,112,112, 48,126,251,237, 55, 74,165, 82,157,101,177, 88, 99,114,114,114, 68,159,226,174,163,
+ 30,134, 75,215,179,214, 97,141,188, 31, 50, 52,168, 35, 4, 31, 74,160,217, 14, 63, 63,191, 50, 43,163,198, 10,167,221,134, 32,
+ 8,189,135, 14, 1, 88,210, 52, 77, 1,216,133,210,250,162,218, 89,225, 25,248, 43,115,188,174,140,205, 4, 82,203, 24, 72, 17,
+ 91,125, 81,105, 75,128, 70,179, 26,216, 10,150, 47, 95,190,117,197,138, 21, 91, 43,166,112,208,110, 84, 49,245,195,202,149, 43,
+ 97, 72,239, 96,192,127, 21,149, 11,173,168,125, 10, 69,131,193, 75,182,175, 91,176, 66,169,144, 9,105,200,253,241,230,116,244,
+135,174,140,166,232, 69,215,143, 6, 6,131, 70, 62,173, 82, 46,252,224,222,255, 77,253, 36, 44,172, 81,180,106, 26,126,123,145,
+ 78,103,136, 20,223, 28,145,203,203, 89,131, 74,125,178,168, 97, 55, 36,249, 39,172,156, 88,103,230,124, 97, 67, 92,200, 27,173,
+247,122,178,178,178,206,109,221,186,149,220,188,121,115,215,146,146,146,138, 14,242,181,197,130,254, 51, 23, 49,218, 53,114,157,
+249,240,117,242, 64,232, 48, 92, 88, 17, 29, 59,118, 20,196,197,197, 5, 92,185,114,101,196,237,219,183,123,136, 68, 34, 87,130,
+ 32, 96,108,108,156, 44,149, 74,175,113,185,220, 99,122,138, 44, 0,192,138, 21, 43,232,149, 43, 87, 18,113,113,113, 52,131,193,
+248, 19, 64, 34,131,193, 72,210,118,130,215,158,174, 89, 38, 48, 48, 80,151, 7,226,237,226,226,226,200, 85,171, 86,117, 89,181,
+106, 85, 11,181, 85,232, 54,254,242,249,210, 23, 10, 0,183,217,108, 78, 58, 65, 16,206,108, 14, 87,116,239,222,189,107, 31,200,
+ 89, 34,151,203, 23,166,164,164,108,217,178,101,203, 90, 19, 19,147,182, 49, 49, 49,127,126, 8,167, 90, 68, 13,182,182,182,118,
+ 58,124,248,240,169,131, 7, 15,182,103, 50,153,247, 9,130, 24, 34, 20, 10, 63,105, 81,105,117,129,232,149,122,212, 58,212,137,
+247, 99, 39, 41,253, 59,132,155, 74,165, 42, 94,186,116,105, 86, 69,225, 85,209,122,165,249,175, 78,229,162,203, 62,213, 39,138,
+178, 6,225, 66, 20, 3, 64,105,237,194,210,178, 58,186, 22,149, 6, 32,174,233, 58, 39, 73,242, 44,128,151, 36, 73,190,174, 24,
+232,162, 61,111,229,202,149, 53, 93,231, 6, 24,240, 89, 67,135, 59, 91, 32, 9, 4,214,214,147,246, 31, 52, 87,126,156,126, 6,
+176,217, 43, 73, 96, 62, 0,130, 6,182, 28,145,203,127,168,110, 65,199,142, 88, 75, 19,152,171,222,153,235, 50,238, 98, 77, 45,
+182,189, 14,116,168, 63,168, 39,103, 19, 84, 95, 80,246, 61, 78,127,127,127, 70, 21, 15,243,114, 69,165,171, 66,104,104, 89, 22,
+255,170,250,169,125,190,153, 61,120,240,192,201,199,199, 71,128,242, 78,255,149, 77,167,245,220,118, 6, 0,213, 71,222,159,159,
+ 5,167,155,155, 27,231,205,155, 55,178,127,215,181,105,224,252, 87,114, 90, 54,117, 1,129, 73,208,206, 29, 84,173, 69, 75, 75,
+160,209,244,207, 40,136, 77,169,162,159,154,235,220, 50, 33, 33,193,181, 97,195,134,201, 0, 10, 42,244,163,178,121,180,225, 24,
+253,223,115, 86,134,201, 40, 95,138,206,128, 74, 14,132,129,211,192,105,224, 52,112, 26, 56, 13,156, 6, 78, 3,103,109,133,214,
+103, 13, 18, 6, 24, 96,128, 1, 6, 24, 96,128, 1, 6,252, 45, 32,170, 81,165,250,152, 4,107,163,108,175, 25, 56, 13,156, 6,
+ 78, 3,167,129,211,192,105,224,252,191,227,172,137, 91,123,249,207,117,232,240, 31,235,183,193,172,106,224, 52,112, 26, 56, 13,
+156, 6, 78, 3,167,129,243, 67, 4,203,103, 13, 38, 12, 48,192, 0, 3, 12, 48,192,128,207, 6, 61,220,193,103,170, 64,254,241,
+ 70,167, 32,170, 26,209,199, 13,117, 0,224, 99,241,253,159,130, 15,224, 43,173,255, 23,160,142,140, 55, 8,173,207, 23,141, 0,
+ 44, 1,160, 93,139,236, 33,128,245, 21,218, 29, 5,160, 93,144, 80,132,210, 58,129,175,245, 89, 25, 73,146,235,187,116,233, 50,
+253,206,157, 59,155,149, 74,229,170, 90,244,215,149,207,231,111, 36, 8,162, 53, 0, 22, 65, 16,111, 50, 51, 51,215, 43,149,202,
+ 15,137, 90,105,224,232,232,184, 1, 64, 75,146, 36, 89, 4, 65, 36,100,102,102,174, 81, 42,149, 55, 63,128,211,204,193,193,161,
+ 19, 77,211,142, 0, 24, 44, 22, 43, 55, 45, 45,237, 1,106,153, 91,201, 63, 48,150, 93, 40, 82,178, 0,192,220,132,169, 8, 13,
+108, 42,215,117,154,225, 20, 55,192,128,255,111,208,165,145,201,229,208,219, 13,107,105, 37,190, 87, 1, 68,175,250,216,113, 57,
+ 17,223, 87,181, 60, 81, 73, 84,115, 69,206,222,110, 88,171,162, 75, 57,122,185, 97,211,229, 55,168, 54,210, 94, 23, 78, 13,246,
+ 1,228,100, 29,170, 20, 16,186, 69, 95,255,219,241, 21,202, 15, 21,150, 13, 29, 86, 43,180,134,185,131,175, 98,130, 25, 26, 11,
+ 77, 24,175, 25,128, 22,234,135,252,107,148,230, 42, 42,250,192,206,125, 46,156,255, 54, 44,167,105, 58,160,220,201, 90, 73, 30,
+162, 47,190,248, 98,192,149, 43, 87,140, 53,245,238, 40,138,130,145,145,145, 18,192, 88, 61,214,101, 63,108,216,176, 69, 7, 14,
+ 28,192,208,161, 67,151,134,133,133,109, 5, 80,172,235,194, 86, 86, 86,254,150,150,150,193,251,247,239,183,107,223,190, 3,193,
+225,112,240,230, 77,130,243,148, 41, 83,188,226,226,226,206,102,101,101, 77,212,119,227,173,173,173, 71, 90, 90, 90,110,217,187,
+119,175,109,231,206,157, 65, 16, 4, 34, 35, 35,157,231,204,153,211,226,221,187,119,199, 51, 51, 51,103,232,203,105, 99, 99,227,
+110, 97, 97,209,109,231,206,157, 70,157, 58,117, 2,143,199, 67,116,116,180,233,212,169, 83, 29,211,210,210, 98, 51, 51, 51,111,
+233, 43,178,158, 69,158,255, 90, 41,151, 6, 1, 0,147,205, 93,208,126, 75,196,249,103, 55,206,247,175,105,154,127, 96,236,239,
+ 6,177,101,128, 1, 6,104, 99,164, 19, 28,105, 26,243,175,252,188,140, 4,128, 94,227, 87,207, 26,233,132,205, 71,210,171,174,
+ 97,171, 39,223,247, 99,234, 32,248,112, 26, 50, 63,164,159,251, 0,114, 14,147, 57,171,157,143,143,237,183,119,239, 38,200,129,
+ 95,254, 79, 14, 81,165,195,156, 85, 10,173,193, 77,177, 74, 89,106, 49, 33,250, 52,196,241,171,137,140,240, 47,190,248,162,225,
+132, 9, 19,136, 86,173, 90, 33, 50, 50,210,253,248,241,227, 95, 93,184,112, 33, 65,165, 82, 69, 2,120, 1,221,179, 90,179, 0,
+120, 50, 24,140,214,255,114,206,127, 51, 76,212,226, 42, 19,127, 37, 58,125, 47,225,233,245,235,215,207, 49,153, 76,141, 69,171,
+157, 72, 36,114,168, 96, 5,211, 5,245, 20, 10, 5,226,227,227, 65,146, 36, 11, 64,125,188, 95, 82,163, 42, 56, 27, 27, 27,239,
+142,120, 24,105, 67, 48,141,144, 47, 1, 32,145,131, 99,234,128, 3,135, 66,172,231,205,158, 49,248,230,205,155,225, 69, 69, 69,
+191,234,209,159,250, 38, 38, 38, 91,159, 62,125,106, 99,108,108, 12,138,162, 80, 84, 84, 4, 71, 71, 71,236,223,191,223,114,222,
+188,121, 1,133,133,133, 55, 37, 18,201,111,250,136,115, 11, 11,139,110,207,159, 63, 55,210, 20,148,150,201,100,112,118,118,198,
+209,163, 71,185,179,102,205,106, 90, 80, 80,144, 42,147,201,222,234, 74, 88, 40, 82,178,148,114,105,208,225, 93,129, 46, 0, 48,
+102, 70, 96, 16,167,200,252,162, 46,211, 10, 69,202, 11, 0, 12, 66,203,128,127, 26,173,109,109,109, 67,115,114,114,110, 1,152,
+136,143, 99,105,112,231,241,120,205, 41,138,114, 36, 73, 18, 12, 6, 35, 67, 36, 18, 61, 5,240,170,182,132, 54,110,126,253,193,
+ 53, 30, 7,154,106, 65, 2, 32, 72, 50, 90, 37, 47, 57,148,251,234,230,249, 15,226,228, 24,141, 7,232, 22, 36, 64, 17, 36,249,
+148, 82,150,236,207,137,191,121,233,223,114,112,238, 11,209,216,205, 81,247,194,152, 31,131,111,120, 3,240, 73, 10,228,209, 36,
+221,135, 21,103, 2,125,103,207,158,237, 56, 99,250,116, 98,220,216,177,141,110,221,185, 67,116,213,167, 90,193,231,137, 42, 29,
+223, 43, 21, 90,254, 77, 97, 69, 3, 11,143, 7, 47, 33,153, 12, 6, 49, 98,246,250,128,131,187, 54,145, 61,251, 15, 41, 27, 62,
+241,245,245,133,175,175, 47, 17, 20, 20,212,232,207, 63,255,108,116,244,232, 81,101, 68, 68,196, 83, 0, 39,170, 90, 89,111, 55,
+136, 41,128,199,102, 49, 69, 35,150,253,186,215,199,199, 7, 92, 46, 23, 31,194, 9, 0, 61, 27,146,111, 89,214, 13,158,142,152,
+185, 60,185,125,251,142,244,199,224,252,140,240, 16, 40, 43,106,109,229,226,226,210, 73,169, 84,242, 0,128,201,100, 74, 82, 82,
+ 82,102,162,180, 54, 32, 0,156,165, 40,106,128, 30,220, 36,128, 21, 3, 6, 12, 88,250,237,183,223,162,110,221,186,152, 53,107,
+ 22, 20, 10, 69,228,165, 75,151,150, 3,216,128, 26, 46, 30,123,123,251,229,187,119,239,182,102,114, 76,208,106, 97, 34, 4, 5,
+ 74, 0,128, 41, 23, 56, 55,141,198,172, 89,179,204, 31, 63,126,188, 70, 31,161,101,111,111,191,106,255,254,253,214,198,198,198,
+160,105,186,172, 22, 99,113,113, 49,138,139,139, 49, 99,198, 12,243,216,216,216,141,250, 8, 45, 7, 7,135, 78, 59,119,238, 52,
+226,241,120, 40, 46, 46,102,203,229,114,162,168,168, 8, 37, 37, 37,180, 76, 38,147,207,156, 57,147,251,226,197, 11, 63,129, 64,
+240, 22, 6,252, 91,192, 0,240, 13,139,197, 26,212,176, 97,195, 54,175, 95,191,126,162, 84, 42, 79, 3, 56,253, 17, 94,166,186,
+ 59, 57, 57,173, 77, 79, 79,223, 9, 32,228,255,101,135, 58, 56, 56,156,190,119,239,158,203,238,221,187,199,110,222,188,249, 34,
+128,223, 62,128,142,205,102,179, 7,119,237,218,213,101,204,152, 49, 28, 7, 7, 7, 72,165, 82, 36, 38, 38,154,159, 60,121,210,
+ 53, 58, 58, 58, 85, 93, 17, 67,231, 23, 10, 27,247,142,166, 96,154, 31,239,208,177, 83,231,161,131,191, 49,115,176,177,128, 88,
+166,194,235,100, 65,221, 63, 46,158,235, 26,199, 54,186, 39,151, 11,135,231,190,186, 87,172, 47,103,183,110,221, 59,247,232,222,
+221,204,194,210, 2, 66,145, 28,111,146,210, 92,111, 92, 61,239,203,100, 26,221,166, 8,197,168,172,231, 87, 75, 62,229,177,153,
+ 5, 48, 69, 60,155,230, 45, 58,182,122,220,107,194,154, 54, 52, 77,131,164,177,163,162, 53,107, 22,192,220, 81, 90,246, 75, 47,
+ 62,208, 52, 77, 16,216,164,109,205,234,237,134,181, 52,141,239, 65,130,232, 93,195, 48,165, 6,189, 0,174,165,181,181,207,212,
+201,147,137,162,194, 66, 68, 71, 71,151, 84, 20, 89, 91,235,128,125,155, 68,189,179, 41,181, 23,219,255, 82,107, 86,165, 67,135,
+ 58,231,209, 50, 54, 54,174,116,186,133,133, 5,186,117,235,134,245,235,215, 51, 1,180,174, 48,187,124,145, 85,128, 27,182,103,
+ 49, 44, 76,184,100,221,186,117,205,204,205,205, 63,152, 19, 0, 64, 83,245, 59,214,165,191,124,244,235,146,177,215,142,110,241,
+ 20, 21, 21,176, 42, 54, 49, 53, 53, 69,227,198,141,177,116,233, 82,221, 56, 63, 28,255, 40,167,163,163, 99, 19, 95, 95,223,214,
+215,111,221,178, 76, 79, 79,231,166,167,167,115,175, 92,191,110,217,161, 67,135,214,142,142,142, 77,202,118, 21, 77,235,211,207,
+213,187,118,237, 90,126,246,236, 89,210,215,215, 23, 86, 86, 86,232,214,173, 27, 46, 94,188,200,220,188,121,243, 58, 0, 75,107,
+234, 39, 73,146,157,125,125,125, 9,208, 52, 50,132, 74, 60, 88,223, 4,209,155, 60, 80, 36,161,145, 39, 44,132, 88, 44,129,177,
+177, 49, 15,165,195,189,186,110,123,199, 14, 29, 58, 16, 0,202,196, 85, 81, 81,233,167,184, 88, 4,153, 76, 14, 46,151,107, 6,
+128,167, 43, 39, 77,211,142,157, 58,117, 2, 0,200,229,242,178, 55,188,130,130, 2, 66, 40, 20, 66, 38,147,129,197, 98,177, 81,
+179, 95, 99, 25,167,185, 9, 83,193,100,115, 23,140,153, 17,152, 50,102, 70, 96, 10,147,205, 93, 32, 51, 43, 84,233, 50,205,220,
+132,169,248,196,231,167, 29, 73,146, 63,187,185,185,197,146, 36,121, 24,128,227, 7,114,182, 5,176,206,200,200,232,154,135,135,
+ 71,138,177,177,241,117,181, 80,239, 80, 75, 78,142,177,177,241,245,117,235,214,157,122,242,228,201,208, 63,255,252,179,254,179,
+103,207, 6, 7, 5, 5, 29, 55, 53, 53, 13, 71,121,191, 68,189,175,205,250,245,235, 31,124,240,224, 65,219,142, 29, 59, 30, 0,
+192,253, 72,215, 59, 3, 64, 75,232, 84,145,227,147, 28,119,167, 86,173, 90,185,240,120, 60,244,232,209, 3, 0,252, 62,132,147,
+205,102, 15, 94,186,116,169,219,178,101,203, 56, 2,129, 0,215,175, 95,199,195,135, 15,161, 84, 42, 49,109,218, 52,238,152, 49,
+ 99, 26,152,153,153, 13,214,171,159, 76,243,227,179,231,204,237, 51,127,214, 36,179,167,239,228, 56,116,237, 29,126,143, 16, 32,
+171,132,131,254,131,199, 88,244, 30, 56,172, 55,135,107,113, 92, 95,206, 69, 11, 23,246,153, 60, 62,192, 44, 70, 64,225,220,253,
+ 12,220,143, 23, 66,201,178, 68,223,193, 19,173, 90,116,234,243, 21, 19,172, 95, 62,245, 49,218, 15,180,159, 61,123,182,221,130,
+ 77, 71,238, 58,181,253,102, 71,118, 62,124,181,133,143, 59, 96,105,109, 98,242, 77,124,215,174,147,140, 74,235,197, 86,203, 89,
+142,175,245,192,224,172,124,116,209,246,207,234, 98,141, 70,234, 97, 69,198,149,159,151,145, 52,129, 89, 35,157,202,221, 7, 42,
+237,231, 77, 96,232,236,185,115, 89, 22, 86, 86,216,181,107, 23,164, 34, 81, 57,159,217,238, 46,232,115,205,152,153,218,192,195,
+ 57,182,155, 43, 17,254, 31,124, 95,153, 92,165, 69, 43, 44, 44,140,238,215,175, 31, 1, 0,161,177,200, 31,220, 20, 27,135,125,
+187,110, 41, 65, 18,116, 61,207,142, 49,117,220,154,137,108,108,108, 80, 82, 82, 2,169, 84, 10, 54,155, 13,137, 68,130,119,239,
+222,225,254,253,251,176,178,178,210,171, 39,133,133,133, 48, 53, 53,133,169,169,233, 71,225, 92, 60,182, 7,247, 77, 74, 54,247,
+242,253,155, 93,183, 79,255,173,189, 91, 75,191,103,221,135,205,122,110,110,231, 36,121,246,236, 25,238,221,187,135,252,252,124,
+248,248,248,252, 87, 14,230, 67,181, 79,214, 67, 0, 86, 13, 27, 54,116,190,124,237,182, 85,177,132, 50, 79,202, 84,176, 40,138,
+130,177, 49, 95,121, 34,244,156,112,232,224,254, 68, 70, 70, 70, 22,128,135,106,113, 91, 83, 77, 69, 30,128, 38,254,254,254,139,
+166, 79,159,142,132,132, 4, 76,154, 52, 73,252,240,225,195,220,142, 29, 59,218,236,223,191,223,104,222,188,121,184,117,235,214,
+138,176,176,176, 51, 0, 18, 1, 84, 90,171,141,166,105, 54,155,205,134, 82, 45, 27,228, 42,170, 76,223, 23, 22, 22,130, 22,231,
+131,205,102, 51, 0,216, 65, 71, 63, 58,138,162,216, 44, 22,171, 76,100,189,203, 44,196,187,172, 18, 20, 22,203, 32, 22, 43, 33,
+ 19,211, 96, 24,219, 48,129, 36, 7, 0, 73, 80,170, 87, 0, 0, 0, 32, 0, 73, 68, 65, 84,186, 90, 71,120, 60, 30,148, 74, 37,
+138,138, 74,187,161,177,148,201,100, 50, 8,133, 66, 48, 24, 12, 83, 0,230, 0,242,116, 33, 84, 59,185,255,174, 30, 6,196,163,
+ 35, 3,108, 95, 95, 88, 92,110,154,185, 9, 83, 17, 58,175, 41,195,198,185,197,157,150, 67,127,241, 40,155,246,105,253,179,184,
+118,118,118, 55, 78,157, 58,213,180, 81,163, 70, 72, 76, 76,244, 24, 50,100,136,143, 64, 32,104, 9,253,107, 50, 26,147, 36,185,
+113,204,152, 49,211, 71,140, 24, 65,184,187,187,131,201,100, 66,169, 84, 58, 39, 36, 36,116, 59,121,242,228,194,131, 7, 15,238,
+ 87,169, 84,223, 65,119,191, 63,146,195,225,156,216,187,119,111, 23, 31, 31, 31, 28, 62,124, 24, 15, 31, 62,164,218,182,109, 75,
+142, 30, 61, 26,174,174,174, 62,163, 71,143,254, 93, 42,149,246,173,165,101,203,181, 67,135, 14, 46, 12, 6, 3, 29, 59,118,100,
+223,187,119,175, 21,128,123, 31,184, 79, 77,157,157,157,111,249,249,249,181,188,118,237, 90, 84, 70, 70,134,159, 30,219, 11, 0,
+ 3,157,156,156,130, 44, 44, 44,172,244,184,199,150,164,165,165,125, 15, 32, 84,199, 69,218,183,110,221, 26,201,201,201,104,210,
+164, 9,216,108,118, 7,185, 92, 62, 5, 64, 31, 0, 63, 0,136,213,163,191,238,221,187,119,119,241,243,243, 35, 66, 67, 67,203,
+252, 67, 73,146,132, 82,169, 4,155,205, 70,251,246,237,201,200,200,200, 58,143, 30, 61,114,135, 14,195,136, 54,110,126,253, 59,
+118,238,218,185,139, 79,115,114,115,232,107,168, 40, 21, 24,132, 18, 76,130, 2,165,224,130,203,102,192,221,179, 13, 35,254,197,
+ 83, 31,153, 84,222, 63,247,213,181,243,186,112,246,233,213,211,183,105, 19,119,114,251,239,111, 80,144, 22,171, 74,139,187,157,
+ 67, 50, 72, 52,109,253,133,173,123,179,150,140,150, 62,126,172,244,196, 23,221, 36,146, 46, 61,242, 19,110, 95,251, 20, 23,228,
+ 74,128,225, 92,199,246,155,126, 61,253,216,130,244,116,209,201,208,243,207, 75, 20,184, 15, 0,183, 0,162, 47,208,220,187, 93,
+187,174,251, 55,108,176,225,243,249,172, 81, 35, 70, 40,247, 69, 69, 69,161,138,161,223,149, 0,195,214,209,177,199,212,169, 83,
+ 25,130,244,116,250,228,233, 11,207, 52,124, 40,125, 75,241,110,238,236,209, 15,162,120,189,134, 41,251, 3, 28, 7, 71,199,166,
+ 83,166, 76, 65, 70,122, 58, 14,135,132, 20, 75,128, 8,141, 21,235, 28, 3, 59,155,185, 57,142, 91, 48,113, 0,225,194,183,197,
+212, 21,251, 58,116,147,103,185, 65,240,215,241,215,214, 34,159,177,200,154, 92,169,208,170,136,223, 98,177,220,140,141,250, 39,
+ 79, 30, 35,179,139,228,162,132,132, 4,216,218,218,130,207,231,195,194,194, 2, 49, 49, 49,184,126,253, 58, 94,190,124, 9,138,
+162,208,162, 69, 11,189,122,147,147,147,131,167, 79,159,194,202,202,234,163,113,186,185,216,225, 91, 23, 59,118,102,110, 33,251,
+218,195,151, 62,251, 22, 15,110, 70,122, 12, 62,168, 93, 36, 86, 38,147,225, 63,130,178,232, 66, 23, 23,151, 78,135, 14, 29, 98,
+ 75,149, 48,115,159, 18,241,163, 72,162, 50, 1, 0, 19, 30, 67, 20, 25,212,248,187,213,171, 87,139,198,143, 31,239,145,146,146,
+178, 94, 7, 91,255,218,238,221,187,207,167,105,154, 53,123,246,108, 0,192,152, 49, 99, 10,239,223,191,239, 14, 32,235,250,245,
+235, 78, 19, 38, 76,120,117,227,198, 13,227,185,115,231, 50,148, 74,101, 12,147,201,164,195,194,194, 86, 1, 8,124,239,137, 72,
+146,143,163,162,162,234, 57,185, 54,134,171, 13, 9,223,165, 47, 75,111,112,198, 20, 82,147,222, 32,238,217, 67, 56, 58, 58, 90,
+240,249,252,216,212,212, 84,121, 90, 90,218, 66,145, 72,180,187,134, 62, 70, 71, 70, 70,242, 93, 93, 93, 81, 92, 92,140,212,236,
+ 18,204, 58,109,140, 66,113,169, 17,131, 5, 49, 90,186, 52, 54, 51, 34,101, 15,179,178,178,228, 50,153,108,153, 80, 40, 60, 84,
+ 29, 39,139,197,202,125,246,236,153,105,221,186,117, 33,145, 72,232,188,188, 60, 66, 36, 18,161,168,168,136,184,112,225,194,215,
+ 2,129,160,109,253,250,245, 9,103,103,231, 85, 2,129, 64,156,150,150, 54, 73,151,161, 73,181, 96, 82, 49,153,204,205,147, 39,
+ 79, 30,122,230,204,153,199,161,129, 77, 7,106, 13,151, 88,120,122,122, 94,110,222,188,153, 83,200, 38,239, 29, 0,126,252, 23,
+156, 91,227,150, 44, 89,210,212,218,218, 26, 83,167, 78,197,202,149, 43,177,124,249,242, 70, 83,167, 78,157, 12, 96,171, 30, 60,
+ 70,142,142,142,143,182,111,223,238,209,169, 83, 39, 92,188,120, 17,199,142, 29,195,219,183,111,149,245,235,215,103,250,248,248,
+ 96,197,138, 21,232,221,187,247,164,153, 51,103,118, 77, 79, 79,111,165,163,248, 24,191, 98,197,138,129,157, 59,119,198,216,177,
+ 99,165, 55,111,222, 28, 10,224,202,213,171, 87,191,184,117,235, 86,232,145, 35, 71,140,214,173, 91,215, 99,222,188,121, 83, 1,
+ 4,215, 98,251,191,238,210,165,180,134,114,231,206,157, 17, 20, 20,212,251, 3,133, 22,199,198,198,230,194,225,195,135, 91, 54,
+110,220, 24,163, 70,141,106, 53,116,232,208, 11,249,249,249, 61, 1,232,116, 67,170, 83,167,206,198,179,103,207, 54,172,106,100,
+161, 50, 72,165, 82,235,111,190,249,102, 67, 82, 82,146, 94, 66,235,232,209,163,248,254,251,239,209,162, 69,139,230,237,219,183,
+223, 51,101,202, 20,248,251,251,119,143,137,137,113, 64,105,212,114,141,224,241,120,205,135, 15, 31,206,121,240,224, 1, 0,192,
+211,211, 19, 45, 91,182, 68,114,114, 50, 30, 63,126, 12,169, 84, 10, 7, 7, 7, 12, 26, 52,136,151,148,148,212, 60, 39, 39,167,
+ 70,161, 69,114,141,199, 13,236,215,215,236,220,125, 1, 84,148, 18,109, 26,154,195,199,195, 30,241,169,133,136,140, 77,133, 74,
+198,134,185,181, 13, 58,116,237,101,157,145,246,118, 92, 46, 80,179,191, 22,215,120,220,160,129, 95,153,158,139, 72, 71, 65,122,
+ 28,253,250,225,153,235, 10,137,104, 18, 0, 60,254,243,248, 30, 71, 27,163,158,238,173,219, 48,252,122, 14,176, 58,125, 44, 99,
+ 92,254, 63, 83,219,239, 61,220,114,193, 94, 87, 86,206,152, 5, 1,190, 52,203,202,249,161,153, 66,177, 83, 51,175, 55,208,107,
+225,146, 37,237, 39, 78,158,204,163, 40, 10, 71,126,253,181,240,105, 84, 84,252,100,128,154, 82, 5,223, 78,192,117,232,192,129,
+ 92, 51,115,115,204,153, 53, 11,102, 10,197,141,178, 93, 2,116,159, 51,127,126,167, 25, 51,102, 24,237, 89, 53,253,113,239, 9,
+107, 90, 83, 52, 77,104,134, 41,143, 86,111,138,107, 59, 97,224, 64,152,153,155, 99,246,236,217, 32,228,242,203,101, 2,138,137,
+ 27,227,191,246,245, 9,232,223, 25, 4, 8, 28, 11,187,131,215,201,217,207,110, 8,240,230,115, 85, 85, 21, 80,165,143, 86,181,
+ 67,135, 69,114,100,118,255,106,176,192,221,221,189,168, 81,163, 70, 69,185,185,185,120,254,252, 57,242,243,243, 17, 28, 28,140,
+184,184, 56, 80, 20, 85,107, 1, 67, 81, 20, 62, 54, 39, 0, 56,216,152, 99, 84,223,118, 76,169, 68,196,203,206,206, 46, 55,124,
+244, 31, 18, 90,101, 80, 42,149,188,250,245,235,131, 4, 8, 97,137,194, 52,227,104, 23, 34,227,104, 23, 66, 88,162, 48,149,201,
+100,164,169,169, 41,164, 82, 41, 79, 7, 42,214,151, 95,126, 57,255,204,153, 51,172,181,107,215,194,203,203, 11,114,185, 28,247,
+239,223, 79, 5,144,165,110,147,126,251,246,237,116,141, 16, 94,191,126, 61, 78,159, 62, 77,244,232,209, 99, 97,101,231,147, 64,
+ 32,216, 56,101,202,148,188,146,162, 60,236, 29, 38, 70,232,168,108,252, 60,240, 45, 70,216,156, 66, 94,230, 59,236,219,183, 15,
+ 87,175, 94, 35,174, 92,185,202,190,121,243,166,201, 87, 95,125,181,163, 78,157, 58, 97,213,117, 50, 61, 61,125,237,140, 25, 51,
+ 10,138,138,138, 80, 84, 84, 4,177, 88,130, 60, 17,240,108, 75, 83, 60,219,210, 20, 18,202, 8,187,118,238, 38,159, 61,123,102,
+251,246,237, 91,167,254,253,251,111,225,243,249, 7,171,227, 76, 75, 75,123,240,237,183,223, 74, 10, 11, 11, 33,147,201,228, 42,
+149, 74, 38, 22,139, 21,199,143, 31,159,107, 99, 99,211,225,226,197,139,172,171, 87,175, 49,111,222,188,197,190,126,253,186, 69,
+183,110,221, 78, 56, 56, 56,252,162,139,165,140,193, 96,108, 11, 9, 9, 25,183,107,215, 46, 7, 31, 31,159,102, 21,134,162,248,
+ 61,123,246,172,247,235,175,191,214, 9, 10, 10, 90,136,210, 0,148, 79, 10, 91, 91,219,153, 3, 7, 14,196,174, 93,187,112,254,
+252,249,121, 59,118,236,192,151, 95,126, 9, 39, 39,167,111,161,251,176, 23, 0,252,184,117,235, 86, 15, 15, 15, 15,140, 25, 51,
+ 70, 54,105,210,164,239, 14, 29, 58, 84, 63, 60, 60,156,253,203, 47,191,212,155, 58,117,234,236,128,128, 0, 73,131, 6, 13, 16,
+ 28, 28,220,144, 36,201,109, 58, 93,223, 14, 14,115, 71,140, 24,129, 77,155, 54,225,230,205,155,131, 81,250, 64,149, 1,184,116,
+247,238,221,254,235,214,173,195,224,193,131,225,236,236, 60,187, 54,150,167,166, 77,155, 46,235,211,167, 15,194,195,195,209,170,
+ 85, 43,116,232,208, 97, 30, 0,219, 90,238, 78,210,212,212,244,196,161, 67,135,124,235,213,171,135, 53,107,214,192,205,205, 13,
+ 7, 15, 30,244, 53, 49, 49, 57, 1, 29,221, 55, 44, 44, 44, 76,141,141,141,177,112,225, 66,122,240,224,193,121, 53,125,230,205,
+155, 71,115,185, 92, 88, 89, 89,233, 26,248, 98,196,227,241, 58,122,121,121,225,254,253,251,184,122,245, 42,150, 46, 93,138,185,
+115,231, 34, 59, 59, 27,195,135, 15, 55, 6,224,175,199,118,219,219,217,217,161,176,176,180, 46,188,151,151, 23,158, 60,121,130,
+236,236,108, 56, 59, 59, 35, 35, 35, 3, 54, 54, 54,104,220,184, 49, 40,138,178,215,141,146,246,178,181,182, 64, 86,190, 20, 76,
+ 40,209,218,221, 22, 55,158,231,226, 93,182, 12,246, 54,150,200,200,202, 70, 29, 27, 30, 92, 92,234,130,166, 41, 47,157, 20, 48,
+131,108,205,229, 25, 33,175, 72,142,180,216,155,185,114,149,116, 74, 65,226,221,148,130,196,187, 41,114,169,100,202,227, 59, 87,
+115,235, 57, 24,193,197,197, 5, 4, 77,181,251, 20,215,227,144,186,112, 49, 49, 98,142,185,250,243, 50, 34,108,255, 98, 66,154,
+251,174,109, 31,135, 82,203,178, 29, 80,127,200,240,225, 29,191,251,238, 59, 94,102,102, 38, 21, 48,108, 88,222,218,192,192,107,
+127,212,240, 98, 80, 12, 52,234,217,179, 39, 72, 0,127, 92,185, 34,202, 0, 82, 1,192, 1,112, 25,240,205, 55, 93,150, 44, 90,
+100,148,147,155, 75,221, 79, 40, 62, 23,151, 69, 15,178, 86,161,190, 46,254, 89, 42,192, 91,195,123,249,242,101, 90, 12, 60, 6,
+ 0, 63, 23,124,219,171,147,167,207,232,129, 93, 32,200,202,199,236,181, 63, 99,207,201, 91,151, 45, 20,244, 23,255,161, 71,241,
+228, 90, 9, 45,245,208,207,123,211, 74, 74,222, 31, 61,248, 80, 1,243,119,112, 86,134,255,162,208,210, 64,161, 40, 29, 37,145,
+ 41, 40,200, 20,148,230,173, 22, 98,177, 88,103,138,203,151, 47, 31,158, 53,107, 22,182,108,217,130, 87,175, 94,129,205,102,195,
+203,203,139, 15,192, 84,115,207,111,221,186,181, 61, 73,146,136,143,143,199,230,205,155, 49,126,252,120,250,222,189,123, 7, 81,
+121,190,148, 39,121,121,121, 59,167, 76, 26, 95,144,159,249, 14, 10,113, 62,178,210,222, 64, 42, 42,192,154,245, 27, 81,162, 96,
+ 34, 67, 40, 71,134, 80, 14,146,107,141, 61,251, 15, 49,154, 54,109,218,135,193, 96,244,171,166,159,247, 51, 51, 51,247, 79,155,
+ 54,173, 32, 35, 35,163,108,251,100, 10, 26, 50, 69,249,243,213,216,216, 24,219,182,109,179,112,119,119, 31,200,100, 50,187, 85,
+195, 41, 72, 73, 73,137,155, 54,109,154, 44, 51, 51, 19, 66,161, 16,231,206,157,235, 95,175, 94, 61,171, 13, 63,110, 33, 68,114,
+ 38, 50, 10,228,200, 40,144,131, 99,106,143, 19,161,103, 24,141, 27, 55, 14, 96, 50,153, 29,106, 18, 89, 71,142, 28, 25, 61,108,
+216, 48,179, 31,127,252, 49,239,236,217,179,187, 0,104, 31,144,248,109,219,182,157, 60,113,226, 68,209,252,249,243,173,131,130,
+130,230,125, 98,177,213,109,216,176, 97, 77, 40,138,194,169, 83,167,158, 1,216,122,230,204,153, 71, 82,169, 20,195,135, 15,175,
+175, 30, 70,210, 5,109, 3, 2, 2,166,251,250,250, 98,206,156, 57,242,107,215,174,181, 6,176, 5,165, 67,185, 52,128,100, 0,
+ 59,110,221,186,213, 98,230,204,153,210,118,237,218, 97,236,216,177,227, 1,248,214,192,219,113,196,136, 17, 30, 20, 69,225,248,
+241,227, 79, 1, 92,172, 48,255,122,104,104,232,125,153, 76,134,145, 35, 71, 54, 0,160,207,141,156,205,229,114, 79,173, 94,189,
+218, 50, 45, 45, 13,163, 71,143,150,198,199,199, 35, 48, 48,208,200,194,194,226,162,214, 53,160, 51,184, 92,238,190,159,126,250,
+105,160,183,183, 55,166, 77,155, 38,219,189,123,247,172,233,211,167,203, 90,183,110,141, 93,187,118, 13,228,112, 56,122,149,232,
+ 72, 79, 79, 47,136,141,141,181,169,233,147,154,154,170,107,120,190,177,169,169,105,132,167,167,103,161,151,151, 87, 27,165, 82,
+137,152,152,152, 55,135, 15, 31,166,188,188,188,176,115,231, 78, 4, 5, 5,161, 95,191,126, 96, 48, 24, 58, 11, 45, 6,131, 1,
+185, 92, 14, 99, 99, 99, 48,153, 76,188,121,243, 70,147, 90, 6,108, 54, 27, 0, 96, 98, 98, 2, 35, 35, 35,144, 36,169, 83, 52,
+ 26, 65,128, 46, 44, 81,128,197, 34,193, 36, 41,196, 37, 11, 33, 87, 80,224,177, 25, 96, 49, 9,128,166, 96,105,194, 2,143,195,
+ 0, 73, 16,148,142,156, 16,138,228,224,176, 73,176,216, 28,130, 84,170,140,202, 30,142, 76,149,145,145, 17,135,176, 53,231,130,
+199,254, 23,149, 5, 38, 74, 29,203,199, 1, 44,147,186,117,135,110,218,188,153, 83, 88, 92,140,193,131, 7,231, 37, 61,122, 20,
+ 34, 6, 30,117,173, 33, 72,137,100, 50,221,253,186,118, 69,100, 84, 20,138,242,243, 95, 3,165,206,241, 28, 39,167, 97,219,182,
+109,227,136, 37, 18, 12, 30, 52,168,224,213,157, 59, 71, 82,138, 17,118, 60,185, 84,136,213,120,220,217,108, 71, 13,175, 48, 63,
+ 63, 31, 40, 77, 33,225, 96,103,186, 97, 70, 64,111, 20,149, 72,176, 96, 99, 8, 21, 21, 39,248, 54, 60, 21, 95,157, 73,135,240,
+ 63,246, 24,158, 92,225, 3, 64,135,132,165, 26,235, 82, 77, 98, 69, 42,149,126,116, 1,244,161,156,149,137,196, 15,229,252, 55,
+130,201,100, 74, 94,190,124,201, 49,183,113,162,108,204, 88,249,245,198,223,177, 0, 0,107, 83,166, 80,174, 82, 80,233,233,233,
+224,114,185, 18, 29,135, 27, 38,237,219,183,111, 13,128,102, 76, 38, 51,236,208,161, 67, 68, 72, 72,136,213,136, 17, 35, 18, 98,
+ 99, 99,211, 60, 61, 61, 93, 15, 29, 58,100, 14, 0, 59,118,236,160, 79,156, 56,209, 27,165, 41, 51,170,204,227,146,153,153, 25,
+152,155,155,123,111,198,140, 25,193, 28, 14,199,202,196,196,196, 38, 60, 60,156,144,200,105,180, 93,146, 92, 22,137,104,110, 68,
+226,246, 98,115, 76,158, 60,153, 17, 27, 27,187, 62, 45, 45, 45,172, 26,206,133, 5, 5, 5,225,175, 94,189,218, 98,225,220,210,
+206,196,117,137,133,207,226,120, 0,128,171, 45, 11,164,250,190, 88, 80, 80,128,236,236,108, 76,159, 62,221, 42, 33, 33, 97, 97,
+ 90, 90,218,141,106,172, 90,183,114,114,114, 82, 95,188,120,225,199, 98,177, 56, 38, 38, 38,109, 35, 34, 34, 8,137,140, 66,243,
+133,201,200, 43, 46,237,167,181, 41, 19,143, 87, 59,224,219,111,191,101,190,126,253,122,163, 64, 32,232, 92,233,205,140, 36,131,
+180, 69,214,130, 5, 11,162, 1, 52, 0, 80,110,104, 84,165, 82, 17, 35, 71,142,124, 14,192,107,254,252,249,214, 52, 77,207, 91,
+184,112, 97, 30,128,189,255,244,185,100,110,110,190, 97,202,148, 41, 56,113,226, 4,242,243,243,183, 1, 64, 97, 97,225,214,163,
+ 71,143, 30,159, 52,105, 18,126,253,245,215, 13,217,217,217,127,160,230, 80,237, 47,135, 15, 31,142, 75,151, 46,225,207, 63,255,
+ 92, 6, 32,166,138,118,175,194,195,195, 23,158, 61,123,118,251,136, 17, 35,240,243,207, 63,247, 1, 80,157,131,108,207,222,189,
+123,227,226,197,139,200,205,205,221, 85, 89,131,130,130,130,221,231,206,157,107,223,187,119,111,172, 95,191,190, 39,128,235, 58,
+108,186,135,133,133,197,161,237,219,183,183,245,246,246, 70, 64, 64,128, 68, 46,151,247,153, 63,127,254,249, 99,199,142,153, 29,
+ 62,124,184,205,228,201,147, 31,168,115,190,221,215,201,148, 69,146,235, 54,111,222, 60,193,207,207, 15,243,230,205, 83, 94,190,
+124,121, 0,128, 43,127,252,241, 71,194,130, 5, 11, 46,108,222,188,153,177,105,211,166, 9,179,103,207,206,166, 40,234, 83,137,
+235,213, 59,118,236,104,223,171, 87, 47,188,121,243, 6,247,239,223,135, 92, 46,255, 53, 34, 34,226,118,163, 70,141, 86,203,100,
+178,243, 38, 38, 38, 99,204,204,204, 60, 91,182,108,249,197,227,199,143,141,161,155,159, 94,102, 98, 98,162,165,133,133, 5,148,
+ 74, 37,158, 61,123,134,186,117,235, 66, 46,151,227,237,219,183,240,246,246, 6,155,205, 70,102,102, 38,180,172,229, 53,136, 34,
+242, 89, 66, 82,122, 3,107, 51, 19, 64,197,195,147,248, 84,216,217, 90, 65, 69,144,200,200, 16,160,101, 19,103, 16, 4,129,130,
+220, 12, 16, 4,241, 92, 23, 78, 21, 77, 69,190, 75,207,170, 99, 99,198,133,119,251, 94, 54, 17,127,100,135,152, 55,232, 52,153,
+201, 32, 24, 28,174,233,222, 9, 99,199,218, 82, 20,141,130,220, 76, 48, 73,242,225,167, 56, 64,167,222, 33,165,171, 27,239, 73,
+175, 9,107, 90, 18, 52,104,177, 28,135,127,206, 68,190, 49,208,114,199, 15, 63, 88,218,216,218, 34, 32, 32,128,202, 77, 75,187,
+ 86,162, 99, 98,229, 6,141, 26, 57,152,154,153,225,238,221,187, 96,148,250,216,226, 32,224, 17,180, 96,129,141,189,163, 35,198,
+ 79,152, 64,101,190,123,119, 93, 12,164,235,211,215, 6,110,110, 44, 13, 47,169,230, 21, 48, 48,107,254, 0, 95,174,137, 17, 23,
+235,246,156, 65, 74,142,232,120,132, 0,123,254,163,246,142,125,213, 90,180,170,114, 62, 43,117,170, 54,174, 86,172,240,120,188,
+ 50,107,138, 30,111,122, 31,157,179, 38,252, 29,156,159, 16,139, 1,156, 5,176, 56, 37, 37, 37,110,194,132, 9,114,165, 92, 90,
+116,111, 77,131, 69, 81,235,235, 77,139, 8,228, 79,251,125,150,197,162, 18, 97, 94,209,142, 29, 59, 20, 41, 41, 41,113,218,203,
+212,192,253, 14,192,197, 95,126,249,101,247,169, 83,167,224,229,229,133,152,152, 24,123,145, 72,212,234,249,243,231,214, 30, 30,
+ 30, 8, 9, 9,193,137, 19, 39,182, 0,184, 90,157,200,210, 64,169, 84, 94,203,200,200,104,156,156,156,220,208,210,210, 82, 97,
+105,105,137,138,145,136,133, 98, 10,185, 5, 66, 88, 91,219,192,220,220,188,190, 14,226,252, 98, 70, 70,134, 59,101,213,164,139,
+123,206, 54, 97,228, 58, 23, 68,174,115,193,197,133, 78,224, 91,114,144,159,159,143,236,236,108,100,103,103,131, 32, 8, 40, 20,
+138,166, 58,112,190, 21, 8, 4, 7,222,189,123,119,214,193,193, 1,102,102,102,160, 1,100, 20, 40, 16,189,201, 3,209,155, 60,
+144, 81,160, 64, 97, 81, 17,234,213,171, 7, 51, 51,179,170,134, 40,200, 58,117,234,244, 29, 54,108,152, 25, 0,168, 5, 84,119,
+154,166,167, 85,242,153,170, 84, 42, 59,105,218,126,255,253,247,214, 0,122,255,195,231, 19, 3,192,140, 73,147, 38,181,225,241,
+120,216,185,115,231, 91, 0, 71, 52,247,250,221,187,119,199, 3,192,172, 89,179, 60, 1,204, 67, 21,153,160,203, 76, 67,108,118,
+235,166, 77,155, 34, 34, 34, 2, 0,206,212,176,238,208,123,247,238,161, 81,163, 70,224,241,120,109,107,104, 91,223,197,197, 5,
+241,241,241, 0,240,164,138, 54, 79,226,227,227, 75,135,123, 8,162,190, 14,219, 62,176, 87,175, 94,207,110,220,184,209,182, 99,
+199,142,152, 48, 97,130,236,193,131, 7,125, 1,220,126,242,228, 73,183,145, 35, 71,138,220,221,221,113,235,214, 45,143,145, 35,
+ 71,222, 35, 73,114,141, 14,156,227, 87,173, 90,181,248,235,175,191,198,170, 85,171,232,147, 39, 79, 6, 0,184,162,158,119,249,
+248,241,227,163,215,174, 93, 75, 15, 26, 52, 8, 43, 87,174, 92, 12, 96, 90,117,100, 34,145, 72,168, 82,169, 32, 18,137,116, 50,
+201,235,218,222,214,214,246,203, 94,189,122, 97,233,210,165,168, 83,167, 14,206,159, 63, 79, 3, 8, 3, 16, 46,147,201,186, 0,
+216, 44, 18,137,126,143,136,136, 64,207,158, 61,217, 40, 95, 98,164,186,245, 63, 59,122,244,168,212,194,194, 2,174,174,174,104,
+208,160, 1, 50, 50, 50,144,148,148, 4,111,111,111,180,110,221, 26, 74,165, 18, 7, 14, 28,144, 20, 21, 21,233,148,147, 79, 41,
+ 19, 29,190,122,225,180,208,198,140, 11,103,123, 11,212,171, 99,141,226,130, 28,100,103,164,163,117,211,186,232,218,186, 30,114,
+132, 50, 92, 14, 59,157, 95, 84, 84,114, 88, 39, 19,190,180,228,208,181, 63,206, 11,173,204,216,104,220,196, 19, 35, 39,204,106,
+217,178,149,207,213,118,237, 58, 93,254,113,195,186,230,221, 59, 52, 37, 82,115, 36,184, 20,118, 38, 95, 88, 88,120,232, 83,220,
+232, 87, 2, 12,137,133,251,237, 93,103, 35, 15, 52,235, 51,233, 64, 92, 42,182, 1,128,130,193,240,232,251,229,151, 72, 77, 77,
+197,233, 83,167, 4, 37,192, 83, 93,249,140,140,140, 72, 0, 16, 10,133,224,170,253,238,148, 64,147,175,190,250, 10,217, 57, 57,
+ 56,122,228, 72,246, 37, 32, 74,159,126,246, 7, 56,198, 70,165, 6, 65,161, 80, 8, 2, 40, 4, 0,130,137,190,237,188, 26, 33,
+ 59,175, 16, 55, 30,198, 21,215, 19, 99,122,117, 60,159,177, 35,124,237,124,180, 0,228,204,155, 55, 15, 92, 46, 23,124, 62,191,
+ 76, 28,105,196, 10,135,195, 1,159,207,135, 82,169,196,241,227,199, 1, 32,167,218, 55, 60, 64, 58, 96,218,122, 74,170,160, 75,
+ 88, 44,214, 71,225, 84,191, 57, 74, 7, 47,248,153,250,227, 94,229, 65, 49,181,225,252, 12,208, 78,157, 19,171, 29,128,252,164,
+164,164,212,161,131, 7, 8,147, 19, 94,100,136, 10,210, 5,133,185, 41,130,148,183,207, 51,150, 44,156, 39, 76, 77, 77, 77, 65,
+105, 46,173,118,233,233,233,154,101,116,193,188,161, 67,135,254, 52,105,210, 36, 58, 58, 58, 26, 0, 16, 25, 25,137,177, 99,199,
+210,163, 71,143,222, 6, 96, 81, 45,250, 45, 18,139,197,229,172, 33,114, 21, 85, 54,228, 87, 88, 88,136,244,244,116,200,100, 50,
+157, 21,241,171,203,155, 94,230, 37, 61, 86,120,186,154,192,211,213, 4, 30, 46,198, 32,148,197,101, 34, 43, 59, 59, 91,243,230,
+ 44,209,163,159,133, 82,169,180, 92, 63,181,135, 38, 11, 11, 11,145,145,145, 1,149, 74, 85,213,131,140, 74, 75, 75,187,124,226,
+196,137, 34, 0,248,241,199, 31,243, 8,130,248,147, 32,136,159, 42,249,236, 97, 50,153,119, 53,109, 55,109,218,148,135,247,135,
+196,254, 78,124,237,237,237,157,191,120,241,226,157,179,103,207,198,158, 61,123, 32, 16, 8, 22,225,175, 92, 60, 84, 78, 78,206,
+130, 93,187,118, 97,220,184,113, 88,190,124,249,166, 86,173, 90, 21, 2, 24, 89, 21,161,157,157,157, 51,147,201, 68, 84, 84, 84,
+ 33,128, 55, 53,172, 63, 35, 42, 42, 42,147, 32, 8,240,249,124,183,234, 26, 90, 91, 91, 55, 52, 51, 51, 67, 90, 90, 26,160,126,
+ 99,174, 4, 73,233,233,233, 52,135,195,129,147,147, 83,163,154, 54,222,202,202,106,193,129, 3, 7,152, 47, 94,188, 64,247,238,
+221, 83,111,221,186,213, 19,128, 38, 36, 61, 42, 50, 50,210,183, 91,183,110, 47,175, 94,189,138,141, 27, 55, 18, 45, 90,180,152,
+ 86, 19,167,171,171,235,212,241,227,199, 35, 56, 56, 24,123,247,238,157, 6,224, 84,133, 38,199,118,237,218, 53,107,239,222,189,
+152, 48, 97, 2,234,215,175, 63,178, 58,190,228,228,228,133,126,126,126,145,175, 94,189,210,169,226,129,142,237,187,249,248,248,
+ 52, 20,139,197, 56,116,232,208,155,134, 13, 27, 62, 58,117,234,212, 60,188,255,192,254,253,244,233,211, 24, 53,106, 20, 90,180,
+104,113, 8,192, 8, 93, 46,203,216,216,216,148,235,215,175, 83,108, 54, 27,174,174,174,232,215,175, 31, 2, 2, 2,208,188,121,
+115,200,229,114,156, 62,125,154,122,254,252,121,170, 76, 38,211, 41,151, 82,238,171,155,231, 19, 19,255,199,222,121,135, 71, 81,
+181, 81,252,204,246,190,155,186, 73, 72, 72, 8, 45,149,142, 84,233,161, 72, 23, 81, 68, 16, 43,162,130, 72,177,125, 34, 86, 4,
+105, 34,136, 20, 69, 65, 4, 20, 69, 90,164,136, 40,145, 78, 2,132, 0, 33,129,244,186,233,101,179,125,103,238,247, 71,138, 33,
+164,236, 38, 40,150,251,123,158,121, 38,185,179,115,246,206,157,118,246,189, 45,225,212,197,115, 81, 54, 1,159, 7,127, 31, 55,
+ 60, 24,209, 13,207, 76,238,143, 30, 33,190, 72,203, 51,226,248,241,159,109, 41, 41, 73,103, 28,233,113, 88,173, 25,127, 45,246,
+244,213,139, 39,237, 66, 1,131,144,224,142, 88,244,191, 87, 93,151,188,253,154, 75,199,118,254,136, 77, 46,197,207, 71, 15,217,
+178, 51, 51,126,189, 87, 61, 14, 79, 0, 34,165,132, 81,240,121, 60,176, 60, 73, 5,191,170, 35, 77,167,176,176, 32, 47,111,111,
+ 68, 70, 70,130,231, 68,143,208, 19,128, 72,169,172,172, 5,215,235,245,168,214,107, 31, 28, 28,236, 31, 16,128,159, 34, 35,193,
+231,184,235,131,156, 28, 96,244, 70,101, 53,116,141, 46, 3,152, 94,104, 13, 85,251,214,218, 96, 87,141, 2,231, 98,111,194,108,
+ 35,231,191, 41,198, 61, 29,143,236, 79,100, 38,154, 89,117,184, 98,227,198,141,189,190,248,226,139,225,243,231,207, 87,206,152,
+ 49, 3, 82,169, 20, 6,131, 1,126,126,126, 96, 89, 22,135, 15, 31, 70,116,116,180,158,227,184,159,113,231,176, 1, 17,168,213,
+ 75,227, 72, 18,100,149,126,203,208,107,223,195, 15,223, 21, 77, 0, 80,222,228,212,133,109, 44,219,215,238, 62, 57,105,199,145,
+139,204,203, 83, 7,241,122, 4,183, 6, 0,120,121,121, 65,173, 86, 59,173,121, 23,248,211, 53,107, 87,235,230,230,230,222,200,
+205,205,205,123,246,217,103, 67,170, 27,190, 75, 36, 18, 83, 85, 36,171,184,190,125, 28,200,167, 21,192, 11, 95,124,241,197,254,
+210,210,210, 35,175,188,242, 10,150, 44, 89,130, 3, 7, 14, 12, 0,112,170,153,199,206, 22, 23, 23,151,156, 63,127,222,171, 67,
+104,119,180,213, 10, 49,240,173, 68, 16, 66,224, 46, 39, 40, 47, 41,194,165, 75, 23, 81, 94, 94,126,206,153,124, 90,173,214,146,
+188,188, 60, 15,173, 86,139,162,162, 34, 20, 20, 20,212,152,172,226,226, 98, 20, 21, 21, 17,134,185, 99,204,150,198, 52, 43,242,
+242,242, 12,241,241,241, 98,175,214, 29,208, 78, 43, 66,239,255,221, 0, 8,129,191, 27, 15,229,101, 37, 56,115,230, 12, 74, 75,
+ 75,127,107, 72,147,227,184, 5,211,166, 77,227, 3,120,252,149, 87, 94,113, 3,208,245,213, 87, 95,253, 25,117,122, 22, 10, 4,
+130,143,183,111,223,222,169,186,138,241,181,215, 94, 91, 13,224,139,191,234, 90,114,119,119, 95, 16, 25, 25,169,178, 90,173, 88,
+187,118, 45, 86,175, 94,189, 5,119, 14, 84, 25,249,233,167,159,174,231,241,120, 47,206,158, 61, 27,207, 61,247,156,188,103,207,
+158,243,115,114,114,190,169, 79, 51, 43, 43,107, 81,143, 30, 61, 22,231,229,229,125,232,144, 89, 78, 76,156,217,163, 71,143, 69,
+121,121,121,203, 27, 59, 71, 10,133, 66,193,178, 44, 82, 82, 82,138,129, 6,219,119,152, 82, 82, 82,178, 88,150,245,147,203,229,
+110, 77, 93,159,197,197,197, 31,246,236,217,243, 29,157, 78,119, 20,192, 7,245, 24,242,203, 57, 57, 57,225,115,231,206,157,179,
+108,217,178, 73,185,185,185,187,154,210, 76, 75, 75,251,112,200,144, 33,111, 37, 36, 36,108, 69,195, 85,192,159,190,251,238,187,
+214,237,219,183, 63,159,146,146,178,180, 9,205,131, 5, 5, 5, 7,157, 56,191, 13,125,190, 70,147,207,231,191,186,108,217, 50,
+222,198,141, 27, 65, 8, 89,201,178,108, 67,249,140,221,187,119,239,182,254,253,251,207,216,189,123,183, 52, 60, 60,252, 57,179,
+217,188,179,169,235,211, 96, 48,236,217,189,123,247,164,216,216, 88,191, 25, 51,102, 72,131,130,130, 96,181, 90,145,147,147,131,
+141, 27, 55,154,226,226,226, 50, 75, 74, 74,246, 56,243, 12,177, 91,202,166,158, 62,190,111,103,106, 98, 92,223,193,163, 38,184,
+ 90,172,126,144, 20,242, 81, 82,152,139,195, 7,247, 20,167,164, 36,157, 49, 24, 74,166, 58,163,105, 53,151, 62,122,230,215,253,
+187, 50, 83,226,251, 12, 28, 50,218,213,100, 9,128, 68,196, 67,161, 46, 11,135, 35,247, 21,165,164, 36,255,110,178,153,159,184,
+ 87,207,121,126, 32, 62,224,231, 70, 63, 59,107, 92, 55,200, 92,253, 46, 9,129,181,253, 1,153,135,151,151,168,234,222,129,178,
+178,205,163, 67,154, 58, 64,220,161,170,150,202, 96, 48, 64, 8, 88,158, 4,132,158,158,158, 50, 0, 72, 72, 72,128,188,178, 86,
+195,169,124,234, 1,133,188,150, 46, 15, 48, 20, 10,224,219, 94,173, 96, 0, 32, 51,183, 16, 22, 91,163,239,141,127, 58,155,107,
+ 25,174,205,205, 17, 16, 1,136, 80, 42,149, 75, 22, 47, 94,188,242,220,185,115, 43,199,142, 29,187, 82, 34,145, 44,169, 42,108,
+ 81, 35, 39,226, 47,211,188,175, 21,220,134,180, 99,162, 70,180,103,184, 89, 3, 92,217, 39,122, 43, 44, 67,135, 14, 93,223,194,
+124,182,228,102,249, 51, 53,247,217,108, 54,130,202,106,187,125,104,184, 74,240,141, 90,219,115,211,211,211, 73,213,223,206,228,
+211, 99,202,148, 41, 92,121,121, 57,121,228,145, 71, 8,154,158,194,167, 81, 77,137, 68, 50,100,224,192,129, 54, 93,126, 17,185,
+145,156, 69,206,198, 92, 35, 71,142,159, 38,187,246, 68,146,117,235, 55,145, 46, 93,186, 88, 0, 4, 56,163, 41, 16, 8,134, 14,
+ 25, 50,164, 80,167,211,145,248,248,120, 18, 21, 21, 69,190,255,254,123,178,105,211, 38,178, 97,195, 6,210,186,117,107, 29, 0,
+ 47,103, 52,101, 50,217,132, 7, 30,120,192, 86, 82,102, 32, 41, 89,133,228, 74,124, 10, 57,117,254, 10, 57,124,252, 20,249,102,
+231,110, 18, 22, 22,102,114, 64,147,207,231,243,215,237,218,181,171,140, 16, 66, 38, 76,152,144,137,219, 7, 82,109,187, 96,193,
+130, 60, 66, 8, 89,190,124,121, 33,234,111, 8,255,103, 95, 75,163,124,125,125,111,136, 68,162, 72, 0,143, 55,177,223,163, 2,
+129,224,128,183,183,247, 5, 0, 15,222,131,251,104,172, 86,171, 61, 11,160,169, 25, 14,170, 63, 55,241, 95,114,191,255, 25,154,
+ 67, 5, 2, 65, 20,208,248, 36,194,181,158,215,239,243,249,252,159, 0, 12,115, 50,159, 29, 61, 60, 60, 30,113,117,117,125,217,
+213,213,245,101,173, 86,251,136, 88, 44,238,216,146, 99,119,239, 24, 49,206,191,251,248,189,173,187,142, 73,243,239, 54, 54, 45,
+176,199,132,189,238, 29, 35,198,181, 84, 51,160,199,132,125,254,221,198,166,251,119, 27,151,218,246,190, 9,123, 61,130, 35, 30,
+184,151,231,232,113, 95,180, 26,222, 22,118, 18,245, 22, 33, 81,111,145,136,182,224,250,186, 32,172, 23,160, 26, 25, 17,177,138,
+176,236,170, 73, 19, 39,174,234, 0,184, 19,128, 95,119,169, 79,179, 59,160,174,217,119,194,132, 85,237, 0,143,225,128,124,208,
+128, 1, 43, 9,203,174,154,246,232,163,171,252, 1,239,250,244, 26,210, 36, 0,223, 23,104, 85, 91,215, 3,104, 63, 57, 16,225,
+111,140, 11, 36, 36,234, 45,242,238,195, 65,164,135, 23, 30,111, 66,179,161, 72,209, 63, 58,162,229, 44,138,170,135,235,210,170,
+181,226, 46, 92,132,119, 93,179,143, 15,130, 34,218, 51,241,163,131, 5, 69,168,236,146,172,248, 23, 62, 36,183, 90, 44, 22, 98,
+ 50,153,136,193, 96, 32,122,189,190,174,129,170, 49,100,217,217,217, 36, 51, 51,147,164,167,167,147,212,212, 84,130, 63,218,222,
+ 56,156, 79,181, 90,253,197,195, 15, 63,204, 10,133,194,117,119,227,216,221,220,220,150,246,238,221,219,250,201, 39,159,144,189,
+123,247,146,207, 63,255,156,204,158, 61,155,116,234,212,201,236,226,226, 50,181, 57,154,222,222,222,139,130,131,131, 11,183,108,
+217, 66,190,249,230, 27,178,102,205, 26,242,230,155,111,178,126,126,126,185, 42,149,106,100,115, 52,181, 90,237,230,251,239,191,
+223,186,121,243,102,242,243,207, 63,147, 29, 59,118,144, 5, 11, 22,144,144,144, 16,179, 66,161,120,200, 65, 77,190, 64, 32, 88,
+ 53,107,214,172,220, 86,173, 90, 69,214,217, 38, 15, 11, 11,187, 48,109,218,180,108, 0,175,253,139,174, 79,170, 73, 53,169,230,
+159, 96,180, 30,107, 5, 95, 2,240,229, 34,209,163,131, 6, 12, 88, 41, 2, 30,117,214, 20, 73,249,252,201,253,123,247, 94, 41,
+ 2,166, 86,127, 86,202,231, 79, 30, 52, 96,192, 74, 33,159, 63,189, 33,189,198, 52, 9,192, 23, 9, 4,175,245,239,219,119,149,
+ 0,248, 95,117,218,208,182,204,245, 5,163, 90,147, 1, 1,204,205,233, 90,200,255,197, 70,235,174, 35,248, 19, 46,194,127,138,
+230,223,229,166,238, 80,101,152,246, 57, 17,209,218,135,202, 89,212, 59, 52, 51,159,178,187,124,236,157, 61, 60, 60, 14,117,232,
+208, 33,191, 77,155, 54,217,174,174,174, 59, 1,248,181, 80, 51,220,219,219,251,107, 47, 47,175, 68, 31, 31,159, 88, 15, 15,143,
+143, 81, 57,234,124,179, 53,133, 66, 97,111, 47, 47,175,223, 2, 3, 3, 75, 2, 2, 2,116, 30, 30, 30,187,234,137,100, 57,162,
+233,131,250, 31, 42,162,170,109,244,165, 67, 53,169, 38,213,188,205,192,140,104,135,101,195,219,194, 62,188, 45,216, 17,129,248,
+184,182, 65, 25, 11,200,154,107,138,158, 0, 36,117, 63,223,148, 94, 83,154, 4,224,247, 3,148,117,247, 25,237,135, 48, 7, 53,
+255,233, 17,173,234,231,188,115,195, 59, 52,128,253, 79,200,228, 63, 69,243,239,194, 77, 52,210, 24,185, 22, 75,239,226,119, 26,
+239,242, 49, 92, 41, 40, 40,120,160,160,224,174,246, 77,184,154,155,155,251,248,221, 20,180,217,108,231,116, 58,221,224,187, 32,
+213, 80,215,107, 43, 28,236,150, 77,161, 80,254, 59, 48, 0,139, 36,188, 30,209, 17,107, 5, 44,120,135,147,145, 85,167, 75,158,
+145,105,142,102, 37,236,214,122,158,241, 76,115,243,249, 7,250, 59, 52, 50,113,141,249,239,156,182, 28, 84,182,209,106,177,209,
+162, 80, 40, 20, 10,133,242, 23,112, 44,145,254, 16,251, 7, 16,137,219,163,111,145,181,140,104,131,161, 79,103,122, 82, 52, 39,
+124,122,140,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 57,205,106, 26,154, 59,245, 70,157,255,155,213,139,239,191, 2,173,
+103,167,154, 84,147,106, 82, 77,170, 73, 53,169,230,191,157,102,143,163, 69,161, 80, 40, 20, 10,133, 66,105,156, 6,163,110,212,
+104, 81, 40, 20, 10,133, 66,161,180, 12, 31, 84, 78, 81, 21,137, 63,166,170,218, 76,141, 22,133, 66,161, 80, 40, 20, 74,203, 25,
+131, 63,122, 27,222, 22,221,226,209,178,161, 80, 40, 20, 10,133, 66,105, 49, 51,107,173,105, 27, 45, 10,133, 66,161, 80, 40,148,
+187,132, 99, 61, 35, 15, 30, 60, 72,104, 89, 81, 40, 20, 10,133, 66,185, 87,252, 67,189, 72,117, 20,235,142, 89, 62,104, 68,139,
+ 66,161, 80, 40, 20, 10,165,101,108,174,101,184,110, 75,163, 70,139, 66,161, 80, 40, 20, 10,165,101, 84, 27,172, 72,212,153, 82,
+141, 7,208, 42, 67, 10,133, 66,161, 80, 40,247,150,127,184, 23,217, 92,181,220, 49, 93, 82,117,175,195,193, 85, 7, 56,152,158,
+106, 10,133, 66,161, 80, 40,247,128,127,178, 23,241, 65, 3,109,180, 40, 20, 10,133, 66,161, 80, 40, 45, 99,102,157,117, 13, 12,
+ 45, 27, 10,133, 66,161, 80, 40,148,187, 98,180,106, 67, 39,195,166, 80, 40, 20, 10,133, 66,249, 39, 67,103, 54,167,154, 84,147,
+106, 82, 77,170, 73, 53,169,230,127,129,153,168, 51, 42, 60, 64,135,119,160, 80, 40, 20, 10,133, 66,185, 27, 38,107,115,125,255,
+211,185, 14, 41, 20, 10,133, 66,161, 80,254, 36,104, 68,139, 66,161, 80, 40, 20, 10,165,101,108, 70, 61,163,194, 83,163, 69,161,
+ 80, 40, 20, 10,133,114,247,204,214, 29,208,170, 67, 10,133, 66,161, 80, 40,148,150, 49,179,161,255, 25, 52,220,115,224,152, 19,
+ 95,208,156,222, 7,199,168, 38,213,164,154, 84,147,106, 82, 77,170,249,159,211,108, 74,251, 24,254,121, 52,216, 24,254,207,134,
+118,125,165,154, 84,147,106, 82, 77,170, 73, 53,169,230,191,157,234, 41,120,170,151,154,169,120,104, 27, 45, 10,229, 31, 14,217,
+ 13, 62,138,131, 3, 65, 72, 43,240,197, 57,200,185,146,196,188, 3,174,197,154,186,176, 0,200,108, 94,176, 75,243,161,139, 77,
+110,169, 38,133, 66,161,252,139,201, 65, 3, 17, 44,106,180, 40,148,127, 58,249, 33, 65, 16, 96, 41,120,240, 1,177,222,130,103,
+216, 82,224, 90, 92,139, 53, 69,220, 7, 96,121,126, 32,214, 4,104,131,151, 1, 55,174,209,112,241,142,135, 0, 0, 32, 0, 73,
+ 68, 65, 84,194,166, 80, 40, 20,231,248,203, 27,195, 11,133, 66, 29, 0, 78, 42,149,238, 1,157,229,154,242,231,226, 83,117,157,
+113, 85,215,157, 51, 40, 5, 2,193, 98,185, 92,254,171, 68, 34,201,147, 72, 36,121, 10,133,226, 87,129, 64,176, 24,128,242,239,
+114,128,228,235, 78,114,240,216, 7, 44, 54,206,247,240,149, 18,173,193,204, 6,129,103, 31, 77,182,116, 84,182, 72, 83,192,140,
+ 48, 89, 57,255,111,206, 27,188, 42, 44,246, 80, 16,180, 72,179, 22, 46, 34,145,232, 48, 0, 15,122,121,254, 59, 9, 5,122,246,
+ 20, 8, 22,134, 0, 67, 65,231,211,165, 80,254,122,163,101,179,217,180, 5, 5, 5,204,182,109,219,198,107, 52,154, 91, 2,129,
+224, 13, 0,162,255, 74,129, 43,149,202,211,106,181, 90,167,209,104,116,106,181,250, 98, 83,233,255, 82,130, 60, 61, 61,211,220,
+220,220, 18,106, 39,122,118,121,176, 95,135,254,143,191,237, 30, 54, 97, 80, 11,245, 69, 2,129,224, 13,141, 70,115,107,219,182,
+109,227,179,178,178, 24,155,205,166,117, 98,255,129,174,174,174,215,207,157, 59,247, 86, 65, 65,193,160,140,179, 91, 60,115,207,
+109,242, 76,251,109,213,224,232,159,214,189,229,226,162,185, 6, 96,224,223,162, 36, 77,156, 23,120,252, 33, 87,115, 12,242,156,
+ 50,155, 87, 76,170, 65, 5,240, 7,195,210,130, 31, 49,165,156, 23, 64,134, 94,206, 52, 42, 78, 23,121,122,253,158,100, 86,131,
+199, 27, 2, 19,227,221,226, 7, 14,143,247, 60,199,113,195, 69, 34,209,203,244,241,251,239, 68,204,227,245, 63, 61,126,252, 7,
+175,117,233, 50, 39, 4, 24,215,128,217, 98, 0,188, 20, 18, 18,114, 8,192,163,119,241,235, 63, 10, 14, 14,206, 2, 48,151,158,
+ 9,202, 95, 76,247,234, 31,248,168,211, 70,203, 97,163, 53, 57, 16,253,167,182,197,137, 71, 2, 81, 62,165, 45,244,211,219,226,
+228, 67,129, 24,218,156,220,184,187,187, 99,224,192,129,252,172,172, 44,217,130, 5, 11,222,150, 74,165, 41, 0, 70, 54, 71, 75,
+ 38,147, 69,203,229,242, 12,129, 64,112, 91, 94,228,114,121,180, 66,161,200, 16, 8, 4,195,106,167,171, 84,170,211,106,181, 90,
+167, 82,169, 46, 54, 96,132,162,213,106,181, 78,169, 84, 70,215, 78, 23, 8, 4,195,148, 74,101,166, 74,165,170,155, 62, 84,165,
+ 82,101,212, 77,111, 8,161, 80,232,151,145,145,161,205,204,204,212,138,197, 98,175,218,233,233,233,233,218,140,140,140,219,210,
+157, 65, 32, 16, 12, 85, 40, 20, 25,114,185, 60,186,190,244,186,199,212, 16,181,202,110,168, 35,233,206,154,172, 17, 35, 70,156,
+204,201,201,241,119,113,113,113,169,189,193, 77,227, 50,242,235, 45,235,231, 79, 24, 61,226,121,207,208,137,157,155,169, 63, 82,
+ 42,149,166, 44, 88,176,224,237,172,172, 44, 89,223,190,125,249, 60,158, 83,191, 39, 34, 38, 76,152,176, 79,167,211,249,118,237,
+218,149,111,183,219,113,117,255, 98,200, 99, 95,134, 52,101, 35, 90,203,242, 5,183,126, 94,230, 55, 98,112,207,125,184,199,141,
+ 65,201,238, 80, 17, 24,110, 32, 71,136,231,245, 44,147,231,152,241, 15, 11, 46,101, 24, 61,109, 44,235, 6,240, 7,147,175, 2,
+ 36,205,210, 20,216, 6,112,132,120,253,146, 42,244, 28,242,200, 28,254,241, 84,129,167,141,101,221,193,195,160,230,104,214,190,
+252,249,124,254,252, 85,171, 86,241, 0,204, 6, 32,254, 47, 61,133,123,181,130,239,208,246,252,243,221,125,208,255, 46,202,134,
+ 87,221,239, 65,127,151,227,180,112,220,141, 93,201,201, 71,166,183,111, 63,246,181, 46, 93,158,172,199,108, 49, 0, 94, 91,182,
+108,217,227, 87,175, 94,245,108,219,182,237,115,119,233, 71,255,154,101,203,150,189,122,245,234,213, 86,129,129,129,239,130, 14,
+ 95,244,175,130, 16, 34, 38,132, 12, 33,132,140, 33,132, 12, 35,132,244,170,250,251,190,170,101, 12, 33, 36,162,206,250,190,170,
+125,171,183,247,110, 64, 99, 76,221,253,106,237, 83,247,255,219,254,174,199,104,141, 65,101, 91,173, 49,183, 29,192,193,131, 7,
+ 73,237,117, 93,166, 4,226,157, 57,253,124, 13,215, 15,236, 32,250,140,100, 82, 28,127,137, 92,218,252, 33,153,115,159,167,225,
+177,182,248,200,249,242, 34,228,212,169, 83,228,234,213,171, 68,175,215,147,196,196, 68,210,187,119,111,163, 92, 46,255, 5, 64,
+160, 51, 98, 42,149, 74,247,203, 47,191,144, 17, 35, 70,148, 42,149,202,149,213, 55,151, 90,173,214,157, 58,117,138,140, 24, 49,
+162, 84,165, 82,173, 1,192, 7,128,135, 30,122, 40,143, 16, 66, 60, 61, 61,179,235,211,155, 48, 97, 66, 49, 33,132,104, 52,154,
+234,170, 38,190, 74,165, 90,243,226,139, 47,234, 47, 92,184, 64, 92, 93, 93,171,211,121,106,181,122,229,236,217,179,245, 49, 49,
+ 49,181,211, 27,197,205,205, 45,131,101, 89,114,224,192, 1,162,213,106,107,242,224,234,234,154,193,178, 44,217,183,111, 95,131,
+121,107, 44, 80,160, 84, 42, 87, 76,159, 62,189, 60, 53, 53,149,184,187,187,235,106,165,175,156, 49, 99, 70,121,122,122, 58,241,
+240,240,112, 40,143,238,238,238,186,211,167, 79,147, 73,147, 38,149,213, 46, 83,119,119,119,221,153, 51,103,170,211, 87, 56,242,
+ 32,107,213,170,213,115, 90,173, 54, 91,171,213,102,187,184,184, 44,241,241,241,201,205,207,207, 39,132, 16,210,174, 93,187,188,
+218,145, 44,109,248,248,121, 27,119,159, 57, 23, 21, 87,152,223,101,248,243, 43, 52, 93, 38,104,156, 40,131, 64,185, 92,254,203,
+160, 65,131,140, 25, 25, 25,164,162,162,130,196,198,198,146, 83,167, 78,145,155, 55,111, 18, 0,196,145,203, 73,169, 84,102,153,
+205,102,206,108, 54,115,249,249,249,108, 94, 94, 30, 27,191,210,135,144, 47,133, 53, 75,201,190,113, 36, 55,106, 41,167, 86,202,
+ 51, 1,168,238,217,131,103,125,152, 31,217, 20,188,235,218, 98,255,248,168,101,163,108, 36,245, 56,217,241,164,167,237,196, 60,
+223, 91,100, 67,200, 15,100, 83,104,235,102,105,110, 8,221, 17,251,166,255,141,117,239,190,100, 75, 75, 75, 35, 11,103,140,178,
+ 31,157,227,155, 68, 54,134,236,110,142,102, 45,166, 62,248,224,131,250,244,244,116, 18, 22, 22, 86,193,231,243,159,254, 47,153,
+172,136, 32,113, 86,236, 55, 11,185,113,225,242,194,187,100,182,194,181, 90,109,193,214,173, 91,137, 74,165,202,251, 27,153, 45,
+ 38, 4, 24,191,173, 75,151,125,220,228,201,236,182, 46, 93,246,133, 0,227,171, 12, 22, 3,224,245,229,203,151,199,216,108,182,
+152,175,190,250, 42,102,252,248,241, 49, 0, 22,182,240, 59, 63,249,232,163,143,136,205,102, 35, 95,125,245, 21, 25, 63,126, 60,
+ 1,176,214,209,157,149, 74,101,135,206,157, 59,111, 15, 11, 11, 75,239,218,181,171, 37, 52, 52,212, 20, 20, 20,148, 26, 30, 30,
+190, 85, 34,145, 4,130,242,151,208,152, 23, 33,132,244,122,253,245,215,223, 0, 64, 94,127,253,245, 55, 8, 33, 99,170,252,196,
+152,218,127,215, 93, 87,155,167,234,255,235,211,168, 94,234,211,172,239, 59,234,124, 15, 26,136,100,205,188,227,224, 14, 30, 60,
+ 56,232,224,193,131, 39,234, 30,220,195,109,209,111, 78, 63, 95,163, 49, 63,135,196,125,248, 50,249,117,136, 31, 57, 53,216,155,
+ 36,204,127,144,228,124,179,134,188,208,205,213, 48,185, 45,134, 56,107,180, 98, 98, 98, 72, 76, 76, 12,185,120,241, 34, 73, 73,
+ 73, 33,165,165,165,228,219,111,191,101,221,221,221,141, 18,137,100, 25, 0,153, 35, 98,106,181, 90, 71, 8, 33,102,179,153, 44,
+ 89,178,196, 84, 21,169,242,210,104, 52, 58, 66, 8, 41, 41, 41, 33,203,150, 45, 51,105, 52,154, 88, 0,173, 60, 60, 60, 50,146,
+147,147,137,151,151, 87,189,102,198,213,213, 85,119,227,198,141,106,227,228,235,234,234, 26,183,127,255,126, 43, 33,132,100,102,
+102, 18, 55, 55, 55, 29, 0, 47,119,119,247, 75, 7, 15, 30,180, 18, 66, 72,118,118,118,117,186, 67, 70,203,104, 52,146,163, 71,
+143,222,150,135,234,244, 67,135, 14,221,102,192, 28,192, 75,163,209,196,124,251,237,183, 22,150,101, 73, 92, 92, 92,181, 73,244,
+114,113,113,185,184,123,247,110, 11,203,178, 36, 62, 62,222, 97, 51,216,166, 77,155, 60, 66, 8,177,219,237,100,227,198,141,230,
+234, 50,173, 78,183, 88, 44,228,179,207, 62, 51,171,213,234, 24, 0,141, 70,223, 60, 60, 60,178, 45, 22, 11, 41, 41, 41, 33,189,
+123,247,214,159, 58,117,138,148,149,149, 17, 66, 8,105,211,166, 77, 30, 0, 4, 15,122,250,253,115,137,250,178,167, 94, 93,255,
+ 93, 96,175,199, 62, 60,114, 62, 43,243,139,189,209, 49, 30,225, 19, 70, 57, 18,212,148, 72, 36,203,124,124,124, 76,191,255,254,
+ 59,107,181, 90, 73,122,122, 58,185,120,241, 98,205, 53,118,229,202, 21,135,140,150, 64, 32, 88,124,238,220, 57, 43,203,178, 92,
+ 65, 65, 1,155,151,151,199,230,229,229,217,235, 26, 45,242,165,144, 20, 28,122,150, 68,110,158,107, 17,137, 68,139,239, 77, 52,
+ 11,124,178, 41,120, 2,217, 20, 28,179,117,186, 71, 65,249,197,157,132,252, 60,151, 36,189,223,150, 44, 30,165, 42,231, 54, 5,
+199,144, 77, 33,147,201, 59,131, 4, 78,105,110, 14, 29, 71, 54, 5,199,124,244,112, 64,225,165,152, 11,228,196,137, 19,228,179,
+ 53,203,201,156, 8,223, 10,110, 83,112, 12,217, 16, 58,201, 25,205,218, 72, 36,146,196,147, 39, 79,146,168,168, 40,242,238,187,
+239, 18,185, 92,158,126, 55,162,122,100, 67, 80, 0,249, 60,104, 16,217,210,209,135,252, 54,232,111,215,193,167, 87, 43,248, 14,
+ 15, 18,103, 22, 92,218, 75, 72,209, 77,146,187, 50,140,140, 10, 22,182,212,108,133,107,181,218,252,212,212, 84,146,155,155, 75,
+ 86,175, 94, 77,212,106,245,223,218,108, 5, 3, 19, 0,188,177, 98,197,138, 26,147,181,126,253,250,152, 43, 87,174,196,248,251,
+251,255,212,130,239, 90,187, 98,197,138, 26,147,181,126,253,122,114,229,202, 21, 18, 16, 16,144,209,212,142,211,167, 79,151,247,
+235,215, 47,102,218,180,105,134,173, 91,183,146,212,212, 84, 18, 27, 27, 75, 86,172, 88, 65,222,126,251,109,242,229,151, 95,146,
+ 73,147, 38, 85,244,238,221,251,220,228,201,147,165, 78, 70, 20, 4, 85, 81, 24, 49, 33, 68, 72, 8,169, 54,154, 2, 0,194,234,
+ 31,255, 20,199,188, 72, 67,102,170, 33,131, 85,119, 91, 35, 70,172, 81,195,230,192,247,221,105,170,234, 70, 66,106,253,253,219,
+216,177, 99, 7,221,241,242, 33,120,111,230,130,247,165, 41, 91, 87, 67,247,237,167,224,151,232, 32, 44, 47,132,249,100, 36,108,
+ 39,247,227,241,190,125,101, 50,134,249,192,217, 2, 21,139,197, 16,139,197, 16,137, 68, 48, 24, 12,200,206,206,198,253,247,223,
+207,187,120,241,162,244,185,231,158,155, 43,147,201,210, 1, 76,108,242,110,102, 42, 35,210,167, 79,159,198,179,207, 62, 43,217,
+190,125,123, 87, 79, 79,207,203, 44,203,138, 1, 32, 62, 62, 30, 83,166, 76,145,236,220,185,179, 83,171, 86,173, 46, 90,173, 86,
+185, 68, 34, 1,159,207,111, 80, 79, 44, 22,195,102,179, 73, 58,118,236, 24,123,249,242,229,240,177, 99,199, 10,211,210,210,144,
+156,156, 12,155,205, 38, 14, 10, 10,186,114,241,226,197,174, 99,198,140, 17,102,100,100, 32, 45, 45,173, 38, 31,142,228,215, 98,
+177, 64, 34,145,160,118,149, 22,195, 48, 48,155,205, 16,139,197, 14,107, 9, 4,130,161, 33, 33, 33, 87, 46, 95,190,220,125,194,
+132, 9,162, 11, 23, 46, 32, 51, 51, 19, 44,203,138, 67, 67, 67,175, 92,190,124,185,219,248,241,227, 69,177,177,177,208,233,116,
+112,180, 10,173,250,115,151, 47, 95,198,180,105,211,196,135, 15, 31,238,230,227,227, 19,107,183,219,197, 0,112,229,202, 21, 76,
+153, 50, 69,124,228,200,145,238,173, 91,183,142,109,162, 42,145, 15, 0, 54,155, 13,207, 61,247,156, 66,173, 86, 35, 35, 35, 3,
+ 28,199,129,101, 89, 0, 64, 97,113,225,149,203, 87,226,226, 31,159,250,240, 32,163,213,108, 62,115, 62,250,122,187, 54, 1,126,
+ 12, 67,218, 52,145,213,137, 10,133, 34,125,229,202,149,243, 82, 83, 83, 37, 33, 33, 33,188,164,164, 36,148,151,151, 67, 36, 18,
+213, 92, 99,142, 30,183, 88, 44, 30, 28, 22, 22, 38, 48,153, 76,224, 56, 14, 0, 8,143,199,171,247,100, 72, 75, 78, 34,212,203,
+ 46,148,201,100,131,239,201, 19,169, 44,204, 29, 28,134,167,229, 91, 36, 18, 23, 63,149,210, 39, 8, 72,143, 66, 91, 79, 9,248,
+ 60,190,244, 66,178, 65, 1,144,225,240, 47,112,119, 78,147, 27,158,156,103,145,216,220, 58, 41, 91,249,249,163,176,176, 16,173,
+219,133,192, 36,246, 20,159,190, 89,161, 4,227,164,230, 31, 12,232,216,177,163,119,135, 14, 29, 80, 80, 80,128,238,221,187,195,
+213,213,213, 21,192,240,102,155,172,175, 2, 36, 40, 67,127,128,183, 18, 44,243, 46,108,130,165,184,153,223,157,108,234, 46,252,
+ 59,153, 44,181, 82,124,118,231,174,111,125,221,253, 67,129,200,167,224,229, 34,193,150,231,187,187,121,106, 36,251,154,105,182,
+194,189,188,188,142,159, 59,119,206, 67, 42,149,226,226,197,139, 8, 11, 11,195,234,213,171, 61, 93, 93, 93,163,254, 38,102,139,
+196, 3, 7, 62,138,141,253,106,251,173, 91, 7,167,183,111, 63,118, 90, 80,208,146, 89,143, 62,250,244, 75, 47,189,132,229,203,
+151, 99,223,190,125,232,223,191, 63,102,206,156,105, 75, 79, 79,223,214,204,239,249,116,229,202,149,115,230,206,157, 91, 87,211,
+154,150,150,214,104,109, 75, 88, 88,152, 95, 98, 98, 98,214,252,249,243,187,111,223,190, 93, 38,151,203, 81, 82, 82,130,207, 63,
+255, 28,111,188,241, 6, 24,134, 1, 33, 4, 95,126,249,165,252,201, 39,159,236,117,235,214,173,172,128,128,128, 38,155,117, 16,
+ 66, 24, 66,136, 20,128,188,106, 81, 0,144,239,220,185, 83, 51, 97,194, 4,117, 85,154,172,106,145,128, 82,151,122,189, 72,173,
+119,229,193, 58,229, 61,182,110, 90,221,109,132,144,177,141,105, 56,105,160,235,251,190,200,198,204, 86,237, 55,208,224,122, 93,
+ 36,208,197, 59, 48, 24,165, 63,239,134, 76,192, 64,198,175, 90, 4, 12,120, 73, 87,208, 90, 42,132,141,144,240,230, 26,173,234,
+ 69, 40, 20,194, 96, 48,128,101, 89,188,241,198, 27,146,163, 71,143,186,243,120,188, 31,154,210,169,109,152, 18, 18, 18, 16, 26,
+ 26,202, 28, 56,112,192,107,246,236,217,178,234,239, 41, 45, 45, 69,135, 14, 29,152, 67,135, 14,105,223,124,243, 77,101, 99,102,
+134, 97, 24,136, 68, 34,204,157, 59, 87,118,254,252,121,183, 86,173, 90, 33, 41, 41, 9, 69, 69, 69, 80, 42,149,152, 59,119,174,
+236,220,185,115,158,173, 90,181, 66,106,106, 42, 74, 75, 75,161, 84, 42,157, 54, 90, 34,145,232,182,125, 24,134,129,213,106,117,
+202, 24,104, 52,154, 29, 49, 49, 49,158, 26,141, 6,177,177,177,176,219,237,208,104, 52,152, 51,103,142, 44, 38, 38,198,211,197,
+197, 5,241,241,241, 32,132, 64,173, 86, 59,149, 71, 0,224, 56, 14,241,241,241,104,211,166, 13,162,162,162,180,179,102,205,146,
+ 86,167,223,188,121, 19,126,126,126,136,138,138,210, 42, 20,138, 29, 13,105,113, 28,135,156,156, 28, 92,189,122, 21, 73, 73, 73,
+200,207,207, 71, 65, 65, 1,202,203,203, 97,183,219, 1, 0,242,242,178,200,157,223, 29,184, 44,147,201,228, 97, 65, 29,253,175,
+196, 93,203,147,201,100,242, 0,127,255, 32,224, 29, 94, 35,134,240,135,180,180, 52,247, 39,159,124, 82,148,155,155,139,226,226,
+ 98, 8, 4,130, 59,174, 45,177,216,177,166, 64,118,187, 61, 84, 42,149, 50, 86,171,181, 38, 2, 38, 22,139, 49,111,135, 1, 97,
+139,113,219,242,232,154, 60, 16,214, 6,139,197, 18,250,151,191,193, 0, 6,140,165, 35, 24,166,251,217,164, 10,183, 1, 99,167,
+138,144,124, 24,224,108, 0, 79,128,193, 93,252, 4,251,174, 84,120,129,160, 11,204, 8, 33,164,233,158, 95, 4, 96, 0,107, 7,
+128,233,121, 52,209,238,222,255,193,231, 69, 89, 89, 89, 16,137, 68,144, 72, 36,232, 62,244, 33,193,206,203, 54,111, 48,232, 10,
+ 43,130, 29,209,188, 45,236, 40,147,189,245,246,219,111, 43,106,107, 62,253,244,211, 10,141, 70,243,118,179, 77, 86,133,188, 47,
+236,100,238,213, 44, 67,155, 37,145,185,161,183,242,140,193, 32,100, 62, 96,235,118, 23,204,214, 96,137, 68,146, 12,224,254, 22,
+153, 44,149,248,204,174, 93,223,250,186,181,174, 52, 89,176,155, 0,161, 12,222,158, 46,216, 50,111,136,155,167,139,204, 89,179,
+ 21,238,229,229,245,203,217,179,103, 61,164, 82, 41, 98, 98, 98, 32, 18,137, 32,149, 74,209,185,115,103,108,218,180,201,211,205,
+205,237,111,101,182,150,197,198,110, 93,122,245,106,194,235,225,225, 33, 19, 21, 10,183, 23,167, 77,211,188,249,230,155, 7,247,
+239,223,255,213,152, 49, 99, 10,206,159, 63,255, 49,128,221,206, 70,204, 0,172, 95,181,106,213,139,213,198,237,205, 55,223,252,
+114,255,254,253, 75,199,140, 25,147,115,254,252,249,249, 0,214, 55, 38,160,215,235,247, 47, 90,180, 72,243,224,131, 15, 86,255,
+143,147, 39, 79, 98,219,182,109, 80, 40, 20,183,125,118,252,248,241,120,246,217,103, 93, 45, 22, 75,163,239, 36,173, 86, 59,236,
+236,217,179, 97,168,236,224, 37,169, 54, 90,113,113,113, 46,101,101,101, 46, 74,165,210,197,199,199, 71, 85,109,182, 30,124,240,
+ 65, 23,129, 64,112, 63, 40,104,202,139,212, 54, 58,142,164, 53,247,243,142,154,173, 58, 73, 13,142,161,117,155,209, 26, 59,118,
+236, 9, 52,208,147,202, 90,164,131, 4, 44,100,124, 6,114,126, 45,179, 5, 14,130,210, 60, 48,205,232,192, 91,223,203, 80, 44,
+ 22,131,207,231,195, 98,177,160,176,176,208, 41, 83,160, 86,171,161, 84, 42, 97, 52, 26, 97,183,219, 33,149, 74,171,205, 8,212,
+106, 53,132, 66, 33,132, 66, 33,164, 82,233, 29,209,164,186,209, 28,145, 72, 4,133, 66,129,156,156, 28,164,165,165,129,227, 56,
+ 40,149, 74, 40, 20, 10,136,197, 98,100,103,103, 35, 59, 59, 27,132, 16, 40, 20, 10, 40, 20, 10, 56,211,224,154,101,217,122, 95,
+254, 54,155,205,169,136,150,221,110,199,245,235,215,145,158,158, 14,169, 84, 90,115,172, 18,137, 4, 55,111,222, 68,110,110, 46,
+228,114, 57,212,106, 53, 52, 26,141,195,186,213,199,162, 82,169, 32,147,201, 80, 92, 92, 12,131,193, 80, 83,166,106,181, 26, 10,
+133, 2,165,165,165,200,203,203,107,244,216, 89,150, 69,118,118, 54,242,243,243,145,145,145,129,130,130,130, 26,179, 85, 21, 53,
+106, 89, 96,167,172, 12,133,133,133, 53,145,200,134, 22, 71,224, 56, 14,229,229,229, 56,123,246, 44,195,113, 28, 74, 74, 74,184,
+252,220, 92,246,133,108, 49,246,189,179,129,124,123,248,146,105,231, 79, 49,198, 61,191, 92, 53,174,223,115,197, 40,237,253,174,
+253,158, 60,134, 62, 11,215,192, 38, 28, 81,160,183, 73,242,173, 34,141, 87,120, 4,144,124, 8,224, 9, 0,169, 43,250,116,106,
+139,180, 98, 86,113, 67,103,145,130,193, 72,172, 15,114,117, 72,147, 21, 14,207, 47,183, 73, 82,173,158,234,208, 46, 61,160,211,
+233, 32,145, 72, 32,145, 72,208,179,127, 4,146, 11, 89,249,181, 44,163, 28, 4, 35, 28,210,252,131,118, 74,165,178,239,253,247,
+223,207,212,214, 28, 61,122, 52, 24,134,233, 12, 32,196,169,135,220,218,118, 98, 88,229,125, 32, 32,115,175,229, 24, 90,237,139,
+ 51, 5,141,155,248,144,219, 39,199,242, 66,175,231,154, 3, 65,108, 11, 64,172, 61, 90, 96,182, 6,169, 84,170,131,235,214,173,
+ 11,148, 74,165,135, 0, 12,104,142,136, 82,198,223,248,214,139, 83,125, 93,171, 77,150,205, 0, 8,100,128, 80, 6, 8,100,240,
+214,122,224,131,103,135,187,201,165,194, 61, 78, 24,214,157,235,215,175,247,172,107,178,170,151,238,221,187, 99,241,226,197,158,
+110,110,110, 59,238,241,203,114,132, 70,163,217, 30, 17, 17,113, 54, 91,165,122, 54,167, 71, 15,241, 47, 26, 77,233,176,210, 82,
+ 77, 64, 92,156, 53, 24,184, 2,224,179,204,204,204, 81, 78,152,172, 71,213,106,117,204,176, 97,195,172, 42,149, 42,125,245,234,
+213, 47,204,158, 61, 27,203,151, 47,199,162, 69,139, 62, 7,240, 12,128,255,101,102,102,182,106,202,100, 1, 64,110,110,238, 99,
+175,189,246, 90, 65, 65, 65, 1, 0,160,115,231,206, 40, 41, 41,193,194,133, 11,241,242,203,149,157, 98,187,117,235, 6, 66, 8,
+116, 58, 29, 86,174, 92,169,203,205,205,125,162,137,103,123,198,238,221,187,123, 89,173, 86, 63, 84, 86, 15, 74, 74, 74, 74,212,
+ 69, 69, 69, 42,171,213,170,224, 56, 78,225,226,226,162, 4, 32,127,252,241,199, 5,215,174, 93, 11,181,219,237, 89,212, 91,253,
+ 65, 99, 94,164, 57, 48, 12, 19,217,146,200, 85,125, 17,177, 6,104, 60,162, 53,118,236, 88,166,246,250,182,136, 17,131,216,244,
+232, 40,184,133,247,184, 45,154, 37,231, 51,144,169, 53, 72,206, 72,131, 8,204,213,187,101,180,138,139,139,241,194, 11, 47, 24,
+ 31,123,236,177, 66,142,227, 30,114,212, 20,104, 52, 26,104, 52, 26, 92,187,118,141, 76,154, 52, 73,183,122,245,106, 99,109,163,
+149,144,144, 64, 70,140, 24,145,247,246,219,111,235, 27, 51, 90,213, 17,173,101,203,150, 25, 7, 15, 30,156,127,245,234, 85, 82,
+109,166,148, 74, 37, 86,174, 92,105, 28, 50,100,136,238,194,133, 11,164, 58,205,153,136, 22,143,199,171, 49, 90,181,247,225,241,
+120,224, 56,206, 41,163, 85, 81, 81,241,216,152, 49, 99,116,241,241,241,164,250, 56, 53, 26, 13, 86,175, 94,109, 28, 62,124,184,
+238,234,213,171,164, 58, 77,173, 86, 59,108, 6,171,191, 95,165, 82, 65,173, 86,227,218,181,107,100,196,136, 17,186,181,107,215,
+154,106,167, 95,191,126,157,140, 31, 63, 94, 87, 94, 94,254, 88, 99,230,165,186, 58,207,110,183,195,100, 50,161,160,160, 0, 25,
+ 25, 25, 53, 85,135, 70,133,122,212,212, 71,198,117, 53, 26,141,134,107, 9,137,233,157, 59,133,105,141, 70,163, 33, 45, 61, 61,
+ 1,120,135,107, 68,251,161,240,240,240,194, 23, 94,120,193, 88, 92, 92,220, 98,163, 37, 22,139,227, 5, 2, 1, 25, 48, 96, 0,
+177, 88, 44, 36, 35, 35,195, 86, 80, 92,108, 15,249,240, 67,114,117,222, 60, 70, 22, 29, 45, 81, 42,149, 76,149, 38, 47, 41, 41,
+137,147,201,100,241,127,249,147,136,199,121,131, 33,247,255,158,168,119, 25, 62,110,138,152,201, 61, 15, 88,245,128,196, 21,144,
+184, 66,160,112,199, 3, 3,186,241,183,158, 45,243, 6,225,250, 65, 36,241,107, 82, 83, 72,188, 0,110,192,207, 9, 38,215,251,
+ 39,207, 17, 23, 21, 21,129,207,231,215,152, 34,185, 66,129, 97, 19, 31,231,125,121,222,236, 13,144,254, 96,248,126, 78,220,235,
+175,190,245,214, 91,162,226,226, 98,240,120,188, 63, 52,229,114,204,154, 53, 75,162, 86,171, 23, 57,252,240,219, 29, 42,130, 80,
+210, 7, 32, 47,223,200, 53,181,218,127,197, 24,188, 96,217, 22, 89,120,183, 94,120,110,176, 86,182, 44, 50, 47,252,114,134,177,
+ 45,192,206,131,221,210,179, 25,102,107,128, 74,165,138,140,142,142,150,143, 30, 61, 26, 43, 87,174, 84,200,100,178, 67,205,121,
+240, 87,232,217,217,239,173,253, 90, 23,251,241, 72,192, 90, 81,105,176,106, 45,121,122, 14,139,183, 28, 47,181,217,200, 84, 71,
+ 53,141, 70,227,140,103,158,121,166,112,207,158, 61,119,152, 44,169, 84,138,148,148, 20, 44, 89,178,164,168,168,168,232,137,123,
+105,178,102,207,158,189, 36, 51, 51, 51,248,231,159,127, 22,228,231,231,107, 87,125,241, 69,233,247,165,165, 69, 75,227,226,110,
+252,175, 83,167,142,175,119,233,242, 68, 35, 67, 63,212,107,178, 94,124,241,197,157,153,153,153,221,143, 29, 59, 38,204,207,207,
+247,123,241,197, 23,177, 98,197, 10, 44, 90,180,104, 19,128,231,224, 88,135,151, 63, 2, 8, 86,235,141,226,226,226,177, 35, 71,
+142, 44, 41, 46, 46, 70,151, 46, 93, 48,110,220, 56,120,123,123,163, 85,171, 86,152, 48, 97, 2,130,130,130, 80, 88, 88,136,169,
+ 83,167, 22,229,231,231,143, 4,144,212,152,102, 97, 97,225,173, 29, 59,118, 36,204,153, 51,167,123,102,102,102, 40, 0,247,242,
+242,114, 69,121,121,185,196, 98,177,200, 92, 93, 93, 93,187,117,235,230, 49,115,230, 76,229,165, 75,151, 66, 51, 51, 51,245, 0,
+210,168,189,170, 49, 89, 13,122, 17, 0,249, 85,134,199, 82,103,157,223,196, 54, 71,247,173,247,111, 7, 62, 87,215,108,213, 94,
+238,168, 58,172,255, 98, 4, 22,111,219,189,213, 36,246,239, 0, 77,112, 87,200,165, 82,200,196, 98,200, 92,221, 97,230, 56,124,
+145,146,107,168, 32,100,145,179, 5, 90,247, 69,200, 48, 12, 62,253,244, 83,123,223,190,125, 77,199,143, 31, 95,103, 52, 26,253,
+ 1,236,117,198, 20,172, 93,187,214, 48,119,238,220,203,121,121,121, 93,165, 82,169,165, 58,125,221,186,117,134,199, 31,127, 60,
+ 46, 51, 51,179,187, 92, 46, 55, 52,212, 62,171,182,209,146, 72, 36,230,188,188,188, 94, 79, 63,253,116,252,103,159,125, 86, 33,
+151,203,161, 80, 40, 32,145, 72, 44,121,121,121, 93, 95,120,225,133,203, 43, 86,172, 48,200,100, 50, 40, 20, 10,167,170,229, 8,
+ 33,119, 24,170,218,233,142, 98,183,219,143,231,229,229,117,157, 59,119,238,165, 79, 62,249,164,162,218, 0,213,206,227,170, 85,
+171, 12, 74,165,210,169,136, 86,245,231, 20, 10, 5,214,172, 89, 99,152, 51,103,206,229,188,188,188,174, 18,137,196, 82, 43,189,
+ 98,246,236,217,151,242,242,242,186,218,237,246,227,141,252,194, 99,203,202,202, 32, 16, 8, 16, 23, 23,103, 22,137, 68,224,241,
+120,184,121,243,102,141,209,114,115,115, 11,235,218,185, 83,200,215, 59,119,159,144,137, 36,146,190,189,122,134, 38,165,166,101,
+ 18,194,164, 54,145,213,189, 70,163,209,255,248,241,227,235,250,246,237,107,250,244,211, 79,237, 13, 69,182, 28,193,108, 54,159,
+184,120,241,162, 77, 42,149, 50, 57, 57, 57,118, 62,159, 15,150,101,137,185, 87, 47,115,231, 79, 62, 33,215, 94,127,157, 81, 43,
+ 20, 2,145, 72, 4,185, 92,206, 28, 62,124,216, 98, 48, 24, 78,252,245, 70, 11,114, 48,144, 37,230,153, 85, 82,158,157, 65,194,
+222, 74,147, 37,117, 1,164,174,128,212, 21,190,190,126, 56,159, 98, 80,129, 7, 49, 88, 7,198, 16, 35, 68, 1, 6,242, 56, 29,
+ 84, 66,177,140,201,205,205,173, 49, 68,213, 75, 96,135, 80, 92, 76,211, 43,193, 16, 9,248,112,102, 8,146,177,238,238,238,130,
+156,156,156, 59, 52,195,194,194,248, 54,155,205,241,161, 93,178, 89, 31,128,123, 49, 33,215,228,243,227,229,138,224,121, 75,191,
+148,201,216, 18, 32,122, 45,194,219,181,194,188,201,221,196,111,238,207, 15,191,144,106,104, 7, 62,121, 14,156,222,211,137,124,
+222,175, 82,169, 14, 93,184,112, 65,174, 82,169,144,148,148,132, 94,189,122, 97,243,230,205,114,185, 92,254, 19, 0,167,218,227,
+157,211, 33, 77, 95,206,246,125,117,119,122,110,108,142,253, 54,147,149, 95, 65,240,204, 71,251, 75,138,203, 76, 15,157,205,104,
+248,254,169,135, 75, 37, 37, 37, 35, 22, 45, 90, 84,152,159,159,127,155,201, 74, 75, 75,171, 54, 4,131, 1, 92,189, 87, 47, 75,
+141, 70, 51,109,233,210,165,184,112,225, 2, 70,143, 30,141,168,168, 40, 20, 21, 21, 97,215,161, 67,137, 59, 18, 19,255, 87,221,
+102,171,129,161, 31,234, 69,173, 86, 47, 88,186,116, 41,162,163,163,107, 52, 11, 11, 11,177,116,233,210, 76, 0,207, 59,107,178,
+170,201,203,203, 59,127,227,198,141,145, 93,186,116,185,190,110,221,186, 76, 31, 31, 31,110,230,204,153,120,230,153,103,224,233,
+233,201,174, 89,179, 38,125,192,128, 1,113,183,110,221,138, 48, 24, 12, 87, 28,249, 45, 80, 80, 80,112,122,243,230,205,103,135,
+ 14, 29, 42,159, 49, 99,134,231,190,125,251,220, 13, 6, 67, 43,137, 68,162,181, 88, 44,226,235,215,175,243,191,255,254,123,239,
+107,215,174,165,152, 76,166,243,205,205,251,127, 13,134, 97, 46, 48, 12, 19,201, 48,204,177, 58,235, 11,141,109,115, 98,223,134,
+254,110,244,115,117,178,185,185,206,226, 56,211,218,225,157, 89,157, 84,134,211,211,251,144,220,153,247, 19,221,148, 80,114,114,
+144, 27,121,186, 61, 83, 49,163,153,195, 59, 24,141,198,154,101,207,158, 61,196,219,219,187, 66,165, 82, 57, 61,188,131,183,183,
+183,174,172,172,140,220,119,223,125, 69,158,158,158, 53, 67, 17,248,248,248,232, 42, 42, 42, 72,159, 62,125,138,180, 90,109,205,
+240, 14,126,126,126, 25,132, 16, 18, 16, 16,144,221,144,158,221,110, 39,222,222,222,213, 61,244,132,110,110,110, 27,122,247,238,
+ 93,164,211,233,136,143,143, 79,205,208, 9,158,158,158, 43,123,245,234, 85, 55,189,169,252,102,100,102,102,146,204,204, 76,210,
+186,117,235,236,218,233,105,105,105, 36, 45, 45,141,248,249,249, 57, 61,188,131,167,167,231,138,122,242,210,172, 60,250,251,251,
+235,140, 70, 35,233,215,175,223,109,101,234,239,239,175, 51,153, 76,213,233, 14, 13,239, 32,147,201,158,147, 74,165,217, 82,169,
+ 52, 91, 34,145, 44,105,211,166, 77,222,119,223,125, 71,214,172, 89, 83,221, 37, 29,158, 97,227,251,118,232,247,196,255, 60,195,
+ 38, 44,104,201,240, 14, 42,149,234, 23,111,111,239,138, 61,123,246,220,118,125, 25,141, 70,135,135,119,144,201,100,153,122,189,
+158,211,233,116,182, 83,167, 78, 25,162,163,163, 13,113,113,113,134,148,148, 20, 99, 97, 94,158, 85,167,211, 25, 75, 75, 75,205,
+151, 47, 95, 54,203,229,247,102,120, 7,178, 57,168, 3,217, 16,178,255,214,123,129,215,230, 14,148,155,174,124,208,149,144, 31,
+ 30, 36,228,167,103, 8, 57,254, 42, 57,191,105, 38,233, 23, 40, 97, 79, 45,108,157, 64, 54, 6,255,232,200,144, 12,100,115,231,
+ 14,100, 67,200, 79,137,239, 6, 94,155, 49,160,149,233,139,207,214,144,115,231,206,145,184,184, 56,146,148,148, 68,126,218,251,
+ 29,233,215, 78, 94,169,185, 33,100,191,147,195, 60,244,151, 72, 36,250,213,171, 87,147,179,103,207,214,104,238,223,191,159,200,
+229,114, 3,224, 88,175,101, 2, 48,100, 67,216, 68,251,103,193,191,191, 57, 92, 89, 94,120,240, 85, 66,174,108, 37,100,115, 56,
+ 33, 95,245, 38,228,187, 49,132, 28,120,130,156, 93, 51,153,244, 15, 20,217,200,198,224, 40,178, 41,204,225,198,246, 66,161,176,
+108,207,158, 61, 36, 59, 59,155, 68, 69, 69,145,232,232,104, 18, 31, 31, 79,210,211,211, 73,100,100, 36, 17, 10,133, 38, 52, 99,
+218,178,222, 94, 8,136,232, 40,202,185,188,172, 63, 33,251,166,146,252, 29,211,200,216, 78,170,162, 62,173, 91, 52, 30, 93, 55,
+119,119,247,130,200,200, 72,146,146,146, 66, 78,156, 56, 65,180, 90,109, 1,128,240,123,253, 66,140,136,136, 56, 71, 8,137, 25,
+ 61,122,116, 12,128,195, 17, 17, 17, 49,201,201,201, 49,189,122,245, 58,139,198,135,126,104,144, 97,195,134, 89, 9, 33,100,244,
+232,209, 4, 64,118, 68, 68, 4, 73, 78, 78, 38,189,122,245,178,220,165,108,243, 1, 60, 33, 20, 10,191,112,115,115,251,213,213,
+213,245, 56,159,207,223, 12, 96, 58,154, 63, 30, 23, 31, 64, 43, 0, 97, 0,122, 86, 45,161, 85,105,180,199, 33,229, 78, 38, 7,
+162,255,147,237,152, 19,143,181, 69,249,212,182,208, 63,213,158,113,100,192,210,136,134,140, 22,199,113, 36, 33, 33,129, 12, 25,
+ 50,164, 66,161, 80,100,193,241, 1, 75,111,211,244,240,240,136,214,106,181,119, 12,162, 89, 43,253,182, 1, 75,181, 90,237,105,
+ 31, 31, 31,157,167,167,231,197,250, 52, 61, 60, 60,162,125,124,124,116, 30, 30, 30,183, 13,238,201,231,243, 71,123,120,120,100,
+213, 77, 23, 8, 4, 67,181, 90,109, 70,221,244, 6,142, 29,222,222,222, 25,217,217,217, 36, 63, 63,159,248,251,251,103,215, 53,
+ 96,185,185,185,183, 25, 48, 71, 52,155,202, 75, 35,121,172, 87,211,129, 50,109,206,121,175, 38,200,215,215, 55,111,213,170, 85,
+ 68,169, 84,230,213,222, 16, 60,240,169,183,206, 37,234,203,158,121,109,195,119,245, 12, 88,234,232,224,160, 35, 21, 10, 69,214,
+144, 33, 67, 42, 18, 18, 18, 8,199,113,132,227,184,134,140, 86,125,154,163,122,246,236, 89, 88, 80, 80,192,150,151,151,219, 51,
+ 50, 50,204,201,201,201,198, 15, 62,248,192,154,159,159,111,210,235,245,150,216,216, 88,179,143,143, 79, 62,128, 81,206,158,163,
+230,190,187,234, 86,159,145, 77,161,253,201,198,208,200,248,183, 3,174, 63,209, 91, 97,142, 89, 53,154,144,227,175,146,179, 27,
+158, 33,125, 3,197,149,134,104, 83,200, 33,242,101,208, 64,178,182,157,216, 33,205, 47,218, 15, 32,155, 66, 14, 93, 91, 28,112,
+253,193, 30,158,150,157, 91, 55,145,155, 55,111,146,253,223,239, 32,125,218, 86,153,172,141,161, 71,201,134,208, 33,142,104,214,
+103,182,182,108,217, 66,110,222,188, 73,126,252,241, 71, 71, 77, 86, 68,125, 70,235,141, 8,101,201, 51,189,165,230,169,221,196,
+150, 9,225, 34,235,136, 14, 34,123,191, 0, 1,219,213,135,199,133,122,130,140, 8,150,153,201,198,224, 40,178, 49,116,164,163,
+249, 20,139,197,233,168, 53,166, 78,221, 69, 34,145,228, 55, 98,180, 34,154, 52, 91, 65,146,156, 95,222, 27, 74,198,117, 81, 21,
+ 58,104,178,154,186,150,186,121,120,120, 20,124,245,213, 87,196,203,203, 43,223, 65,147,245,167, 95,159, 26,141,102,187, 94,175,
+143, 57,114,228, 72, 76, 68, 68, 68,204,246,237,219, 99, 78,158, 60, 25, 35,151,203,183, 87, 7, 39,234,154,173,208, 59,159,255,
+ 17,117, 34, 90, 49,229,229,229,228,200,145, 35, 36, 34, 34,130,108,223,190,157,156, 60,121,146,200,229,242,152,230,230,243,207,
+ 56,118,170,249,159,102, 38, 26,168, 58,252,211,127,220,212,103,180, 76, 38, 19, 89,184,112,161, 69, 42,149, 26, 68, 34,145,179,
+ 83,240,252,163, 47, 66, 15, 15,143,211, 94, 94, 94, 58, 47, 47,175,219,204, 94,237,116, 15, 15,143,139,255,242, 27, 48, 72, 36,
+ 18,165, 9,133,194,219,167,224, 9, 27,223,183,125,255, 25,139,188,194,199, 63,208,194,124,138, 68, 34,209, 27, 82,169,212,176,
+112,225, 66,139, 94,175,119,198,104, 1,192,112,185, 92,158,181,109,219, 54, 99, 98, 98,162,173,168,168,200,126,238,220, 57, 91,
+116,116,180,229,157,119,222, 41,151,203,229, 89,104,120, 88,130,191,164, 60,201,218,118,226,106,179,117,101, 81, 64,252,184, 78,
+114,235,230,249, 35, 72,223, 54,117, 76, 86,195, 35,185,215,175, 89,101,182, 46,189,233, 31, 63, 36, 72,105, 95,186,104, 30,233,
+211, 86,118,187,201,114, 66,179,174,217,146,203,229,229,111,191,253,182, 51,145,172,219, 13,225, 23,193,254,100, 83,200,246, 74,
+ 19,213,196,178, 33,248,115,242,105,176,255,223,229, 62,234,237,133,128, 97, 65,146,171, 78, 68,178, 28,201,103, 55, 87, 87,215,
+235, 78, 68,178,254,138, 99, 31, 49,107,214,172,152,228,228,228,152,164,164,164,152,147, 39, 79,198, 76,156, 56, 49, 6,192,136,
+ 90,159,169, 49, 91,214, 73,147,204,221,120,188,121, 77,104, 62, 58,107,214, 44,146,156,156, 76,146,146,146,200,201,147, 39,201,
+196,137, 19, 9,156,155,190,135,154, 34,106,180,238, 9,127,246,132,159, 17, 0,142,213, 78,144, 74,165, 58,147,201,228,169, 84,
+ 42,247,234,245,250, 57,168,236, 22,217, 34,205, 63, 35,159, 84,243, 95,161,233,163, 84, 42,215,233,245,250,137, 82,169, 52,223,
+100, 50,121, 57,161,233, 34,145, 72,230, 73,165,210, 33, 6,131, 33, 8, 0, 20, 10, 69,130,217,108,254,213,104, 52,126, 12,160,
+228, 94, 31, 59, 89,219, 78, 12,177,184, 39, 8, 94,143, 73,175,104,187,244, 72, 81,192,252,161,174,233,253,218, 43, 82, 32,228,
+ 62, 2, 99, 62,207, 60,153,102,118, 90, 83,198,244, 2, 43,124,253,124,170,161,205, 71, 63,151, 7, 44, 24,162, 76,239,215, 78,
+153, 14,130,143, 32, 49,156,113, 86,179,174,217, 82, 40, 20,219, 42, 42, 42,158, 5,240,171,179,199, 78,118,135,138, 80, 97,243,
+133,141,223, 9,164,145, 41,124, 8, 49,128,199,143, 67, 46,116,204, 59,215,173,244, 62,250,203, 53, 71, 40,149,202,105, 33, 33,
+ 33,237,174, 93,187,150,100, 48, 24,190, 1,112,180,238,251, 39, 4, 24, 34, 23, 8,186, 26,237,246,168,235, 64,116, 19,154,143,
+ 42,149,202, 5, 33, 33, 33,225,215,174, 93,187,106, 48, 24, 86, 1,216, 69,207,209,191, 74,243, 95,201, 95, 62,138,114,245,203,
+ 78,175,215,211,210,167,252,217,228,232,245,250, 73, 85,215,157,179,251,150,152,205,230,197,102,179,121,113,245, 15,146,226,226,
+226,191, 85,163, 85,230,165, 36, 11, 89,219, 46, 26, 98,241,178, 30,254,178, 57,123,102,201, 12, 32, 76, 38,132,220,154, 38, 76,
+ 86, 83,154,231, 33,179, 45,235, 21, 32,123,249,199,231,100, 6, 16,228,130,224,227, 38, 76,150,163,156,170,168,168,104,219,236,
+ 99,126,248,186, 21, 64, 10, 1, 82,241, 78, 35, 63, 20,223, 1, 97,104, 35,227,123,201, 81,189, 94,127,244,252,249,243,141,125,
+134,196, 3, 4,249, 91,179, 0, 0, 32, 0, 73, 68, 65, 84,199, 97,119,184, 51,192, 46,189, 94,191,171, 9, 77, 10,133, 26, 45,
+ 10,229, 31,200,223,246,133,205,188,148,100, 33,187, 67, 47,160,128,191, 16, 60,180, 5,236,105,168,176,231, 50, 47,165, 89, 90,
+168,121, 14, 5,204, 92,240, 17, 4,177,253, 22,244,150, 92,230,249, 52,203,223,230,184, 1,130,119,168,145,162, 80, 40,127, 27,
+102,226,246,158,134, 53,255, 83,163, 69,161,252,195,169,138,242,100, 86, 45,127, 91, 77, 10,133, 66,249, 15, 26, 46, 48,104,184,
+ 65,155, 51,117,175,205,105, 20,119,140,106, 54, 75,147, 15, 64, 3,192, 5,149,211, 56, 84,119, 19,110,106,152,141, 7, 0,216,
+104,121, 82, 77,170, 73, 53,169, 38,213,188,199,154, 77,105,255, 19,219,126,213,215,203,112,243, 95,241,197,180, 71,198,221,101,
+ 36, 45, 79,170, 73, 53,169, 38,213,164,154,255, 82,205,127, 37, 60, 90, 4,255, 40,164,180, 8, 40, 20, 10,133, 66,249,219,209,
+189,106,237,131,202,232,150, 79,245,134,123,218, 70, 75,230,222,209, 7, 2, 94, 23,134, 35, 33, 0, 64,120, 76, 60,236, 92,172,
+177, 48, 49,167,165,218,202, 86, 65,110, 4,226,221, 12, 44, 15,235,179, 19,138, 90,170,215, 41, 72, 61,201,203, 67, 53, 45,183,
+176,116,219,213, 27,250,125,206,236,171,209, 4,104,164,110,174,147,205, 86, 91, 39,177, 72,148,110, 45, 41,219, 92, 92,156, 84,
+222,140,108,184, 53,182,241,157,119, 8,115, 48,231, 34, 35,146, 91,121,238,106, 17,163,135,158,232,115,148, 92, 96, 73, 10,249,
+254,251,135,137,179,231,134,225, 97,176, 66,165,234, 33,145,202,123,201, 85,174, 29, 57, 2, 20,233,178, 82, 45, 54,251, 73,214,
+ 98,136, 33, 28,126,187, 27,231,138, 66,161, 80, 40,148,127,129,209,186, 8, 96, 12, 42,171, 12,155,110, 12, 31, 16,118,255, 5,
+169, 84, 22, 8, 0, 28, 33,224, 8, 80, 81, 86, 18,147,155, 20, 61, 18, 0, 60,218,116, 63, 34,148,170,123,112,164,114, 59,203,
+ 1,118,171, 41,165, 44,237,220,125,142,228, 72,225, 25,244,224,208,136, 97,147,198,142, 29, 19,220,185, 83,231,246, 0,112, 37,
+238,202,173,131, 7, 35,111, 28, 63,198,236,169,200, 79,248,177, 37, 71, 76, 32,125,191,103,207,110,247, 71, 71, 95,124, 15,192,
+139, 45, 45, 65,119,119,229,156,163, 63, 44, 28, 56,108,210, 74, 5,224,156,209,146,186,185, 78,158, 48,110, 84,183, 87, 94,154,
+197,123,102,225,135,129, 23, 78,253,182, 92,233, 19, 94, 66, 56,219,209, 10,221,148,223, 27,155, 56,185,174,127,108,200, 96,125,
+ 83,116,152,183,230,171,190,174,198,162, 91, 83, 8,199, 78, 97, 24, 6,124,177,252,123,207,118,247,127,231, 50,120,126, 49, 0,
+135,123,140,169,125,194, 34,180, 62,126,123,166, 60, 53, 79, 42,215,120, 9,192, 23, 1, 96,144,157,122, 29,199,119, 45,117,125,
+249,221, 45,221, 79,197,166,217,127,249, 97,189,137, 17, 9, 39, 25,114,174,209,177, 84, 40, 20, 10,133,242, 95, 38,178,202, 92,
+ 69,214,221,208,160,209,146, 74,101,129,103,127, 59,232,246,227,201, 12, 0, 64, 68,119,111,252,239,131,117, 35,182,175,141,190,
+ 1, 0,125,135,142, 13,122,239,141,151,112,250,106, 30, 8, 33,232,214,193, 29, 15, 76,120,216, 49,227,225, 21,122,223,228,201,
+ 15, 61,182,112,225,130,241, 55,111,222, 76,221,185,115,231,239, 0, 48, 96,224,192, 14, 31,126,248,225, 35, 43, 93,221, 36,223,
+126,255, 67,150, 73,119,253, 66,115,142, 86,218,170,157,111,112,199,182,211,190,253,114, 29,111,240,200,135,166,166,162, 98,169,
+ 41, 59, 41,203,145,125, 61, 60, 60,230, 10,133, 66, 13, 0,112,220, 31,254,199,106, 37,222, 0, 96,103, 57,149,107,171,224,114,
+190, 72,202, 74, 36,162,107,229,122,253,182,178,172,235, 95, 52,166,105,182,217,194, 95,126,254, 73,222,165,164, 66, 4,134, 15,
+224,175, 89,250, 38, 56,214,230, 58,239,141, 15, 38, 71,159,251, 22, 21, 58,156,112,240,208,132,117, 19,124,125,251,240,223, 95,
+170, 28,206, 48,120, 34,160,239, 83, 19,223,219,250,189,176,103, 7, 53,204, 54, 14,135, 98, 10,251,110,248,248,253, 21,167, 54,
+140, 57, 0, 96, 19,128, 95, 0, 52,105,234,220,220,221,190,153,187,232, 99,101,133,229,143, 97,138,170, 76, 22, 62,223,182, 27,
+151, 51, 56,132, 4,135, 8,188,231, 46, 87,110,250, 96,230, 86, 67,229,220, 93, 20, 10,133, 66,161,252, 87,201,193,237,141,223,
+ 55, 55,105,180, 0, 64, 41, 19,224, 70,114, 46, 0,192, 69, 6,204,121,110, 6, 10, 11,242,131, 44,118, 14, 79,205,152,142,139,
+241, 57,184,145,146, 15, 66, 8,130,252,228, 14,231,134, 15,174,231, 83, 79, 63, 53,232,200,209,163,231,223, 90,244,214,215, 12,
+131, 51, 0,176,105,243,231,125, 23,191,189,248,217,233, 51,166, 15,255,254,251,239,175, 2,104,150,209, 18, 48,170,117, 43,150,
+ 45, 17,103, 22,152, 76,115, 23,190,206, 45,152, 63,119, 13,128,135, 28,114, 50, 66,161, 38, 51, 51, 83,201,227,221,222,124,237,
+163, 37,175, 71, 13,159,180, 50, 49, 53,189,228,210,145,253,251,239, 11, 11, 11, 67,102, 86,110,255,229,159,108,236,122,232,136,
+236,201,242, 50,227, 36, 67,193,245,122, 39,109,150, 8,133, 87,223, 93,190,161, 27,231,210,129,247,191,103, 71, 35,188,125, 43,
+100,229,149, 96,224,200,241,130,152, 11, 23, 70, 0, 14, 27,173,186, 3, 52, 78,182,112,121, 93, 63,220,118,110,216,196,126,173,
+122,242,120,124,232,141, 54,228,151,154,193,114,192,128, 80, 13, 70,109,255, 68, 80, 84, 97,123,240,131, 31, 50, 30, 60,179,118,
+172,206, 84,154, 61, 27,192,158,198,191,134,184,249,105,213,184,145, 81, 94,175,201,170, 48,217, 1, 0, 34, 62, 11, 6,196,157,
+222, 95, 20, 10,133, 66,249,143,211, 96,175, 67, 30, 0, 28, 60,120,176,222,246, 59, 44, 75,112, 35, 37, 7, 55, 82,114,112, 62,
+ 62, 31, 86, 34,196,154,229,239, 98,213,210,183, 81,100,228,225,199,211, 25, 72, 72,201, 69, 66, 74, 46, 10,138,235, 29,233,253,
+182, 42,165,149, 75,101,221, 63,254, 88,189, 98,196, 64,197, 96, 55, 87, 87,215,196,171, 95, 87, 44,158,175, 11,125,247,229, 12,
+145,208, 34,201, 84, 40, 21,253,118,239,254, 46,204,203, 83,171, 80, 42, 85,175,202,125,187,110,209,104,186,104, 26,211,172,139,
+ 76, 27, 50,126,252,152, 81, 67,189,189,189,184, 89,107, 98,226, 59,133,134,216, 58,118,232,216, 95,166,237, 56,190,145,221,106,
+ 52, 57,142, 3,143,199,131, 78,167, 67,118,118, 54,146,147,147,145,144,144,128,140,140, 84, 29, 71,136,144, 5,199,243,241,241,
+131, 64, 32, 70, 96,155, 0,108, 88,179, 84,254,193, 59,255,235, 37, 85,136,247,213, 49, 66, 53,154,166,162,226,239,127, 58,124,
+ 52,235,208,206, 13, 44, 0,228, 21,235,113,252,194, 77, 92,188,150,225,236,137,172, 59,132, 67,155,172,180,155,101,246,148, 72,
+254,123,111, 46,200, 56,121,242, 84,106,105,185, 5,229, 6, 43, 12, 38, 27,204, 22, 22, 54,150, 67,128,167, 20,123, 95,239,132,
+253,191,198,122, 49, 12,243,113, 83,229,105, 54,219,216,251, 67, 20,152, 58,164, 53, 66,252, 20,200,186,113, 6,115, 23,125,140,
+232,100, 51,138,139, 75, 96,171, 40, 0,167,207, 68, 65,202, 69,216, 89,150, 52,117,222,239, 18, 84,147,106, 82, 77,170, 73, 53,
+255,197,154, 13,121,145,127, 8,155,235, 89, 80, 99,180, 26,226, 86, 70, 17,110, 36,231,162, 71,136, 47,218,183,241,193,249,132,
+ 98,124,115, 60, 3, 91,142,164,225,248,229,124,112, 2, 21,114,203,128,196, 84, 29, 18,211, 10,154, 28, 63,155, 47, 17, 78,121,
+249,229,210,133,157,195,202,250,252,118,104, 14,124, 61, 19,195, 94,123,173,100, 14, 95, 34,156,226,218, 90,181,243,245,133,243,
+166,169,228,114,177,197,108, 65,187,182, 1,210,151,102,207,121,146,113,149,236,116,244, 40, 85,190,161,174, 18,153,236,139, 15,
+222,121, 85,242,241,143,137,233, 21, 22, 84,236, 57,163, 75, 90,240,250,226, 34,129, 80,186, 65,229, 27,234,234,168,150,205,102,
+131,217,108,134,197, 98,129,213,106, 69, 86,198,245,241,191,252,248,202,200,182,173,221, 70, 74,164, 82, 16, 0,101, 70, 59,146,
+115, 12, 24, 50,108, 56,191, 71,247,238,225, 74,159,208,167,235,211, 42, 45, 77, 43,229, 8, 95,117,112,239, 14,254,119, 63, 95,
+194,215, 7, 47, 96,223,175,151,112,254,196, 33, 59,225,108, 53,243,127, 41,125, 58, 4, 41,125, 58,167, 41, 91,117,209,213, 44,
+190,157,162, 27, 45, 83, 62,143, 12, 25, 22,113,236,185, 23, 95,250,205, 80, 94,152,247,197,186,119,179,242,179, 83,175, 75, 68,
+140, 93, 46,225, 67,111,178, 99,235, 47,217,152,188,244, 50,174,165,235, 65, 8,105,114, 2,111, 14,152, 63,229,233, 87, 88,155,
+213,138, 96,127, 37,118,108, 94,134,241, 67,186, 98,104,103, 87,220,215, 94, 1,185,192,140,171,241, 55,176,107,199, 86, 59,199,
+241, 22,208, 31, 50, 20, 10,133, 66,161, 17,173,154,197,167,246,134, 6,171, 14, 77, 38, 99,202, 67, 83,166,195, 71,235,173,156,
+ 48,248, 9, 81,204,173, 18,228,231,164,225,102, 66, 28, 12, 38, 27, 68,174,109, 1,169, 55,218, 4, 6, 32,246,198, 62,235,218,
+ 21,145,122,206,110, 78,105, 72,111,252,120, 31,191,155,241, 12,111,197,114,255,179, 9, 55,138,123,236, 88,244, 21, 30,123, 76,
+233,177, 98,185,255,217,212, 36, 5, 79, 46, 37,253,158,156, 49,149,225, 49, 4,175,189,182, 16, 19,198,142,194, 83, 79, 62,206,
+108,219,182,181, 79,137,131, 71,201, 65,248,233, 27,111,190, 43,214,149,216, 45,231, 19,244,102,185, 66, 38, 59,149,168,175, 8,
+ 15,244,151,141,158,244, 68,118,228,238, 47, 62, 6, 48,195, 17,173,106,131,101,179,217, 96,181, 90, 1,128, 5, 0, 30,175,114,
+ 93, 88,110, 65, 94,137, 25,186, 18, 51,236, 44,135, 73, 83,102,200, 46, 68, 95,158, 1,160,129,246, 90, 28,103,179,219,176,231,
+231,139,200,186,240, 61,199,240,248,165,181, 26,195, 67,233,211, 33,200,219,219, 63,106,236,164,199, 61,197,210,202,106,216,242,
+ 10, 51,182,109, 92,222,104, 62,121, 12, 67, 56,214, 94, 98,183,217, 42,218,181,109,151, 21, 18,214, 85,122,242,183, 35,227, 79,
+ 29,219,163,183,183,123,220,229, 86,106, 14,248, 66, 9,248, 34, 41,204, 86,199,126, 44,232,110,158, 93, 15,128,121,250,133,133,
+107,230,189,242, 63,254,252,181,191,195, 98, 50,192,108,172, 64, 89,105, 49,100, 2, 27,174,158,222,111, 39,172,109, 94, 69,206,
+165,245,244,254,162, 80, 40, 20,202,127,156,186,211,239,212,164, 53,104,180,210,174,157,188, 15, 0,130,122,142, 40, 84, 74, 5,
+110, 2, 30, 3, 93,230, 45,108, 91, 57, 23, 28, 71, 48,250,217, 21, 80, 5,122, 67, 38,226,195,172, 47,212, 23,221, 58,209,104,
+ 91, 29,134,177, 13, 95,191, 41, 43,240,133,231,219,169,119,236,208, 11, 1, 96,199, 14,189,240,249, 89,173,213,159,109, 74, 9,
+236,125,127, 15, 16,150,197,216, 9, 15, 97,202,163, 83,144,154,107,192, 15, 81,233,168, 48, 90, 28,234, 45, 39,243, 8,233,234,
+225,238, 57,234,229, 39, 70, 41, 4,124,134,233, 24,160,225,103,228,219,236,124,190,144, 61,112,161, 52,123,210,164, 71, 61,142,
+255,244,221, 80,214, 35,164,171,177, 32,254,114, 83,122,102,179, 25, 44,203,194,108, 54,195,102,179,193,205,163,237, 79,195, 31,
+ 90,153,153,147, 91, 30,153, 91,108,234, 93, 97,179, 67, 87, 98, 70, 94,137, 25, 37, 21, 86,120,171, 92, 97,183, 89, 58, 55,164,
+ 71, 8,249,122,226, 67,211, 31, 7,192, 99,120,246,175,244, 57,241, 9,149, 91,254, 48, 89,163, 38, 60,230, 25, 21,115, 11, 55,
+163, 15, 21, 19,206, 94, 57,138, 59,195,101, 54, 94,174, 32,124, 6,156, 72,192,216,248, 60, 30,103,181,234,109, 90,173,231,241,
+ 19,199, 15,143, 51,217,147,192, 23, 73,106, 62,107,180,176, 14, 95, 49,186,155,103, 63, 5,128, 79,214,174, 89,213,111,248, 99,
+162, 19, 23, 83, 96,180, 1,125,187, 7, 97,239,183,159,155, 9,177,189, 82,145,115,233, 83,122,111, 81, 40, 20, 10,133,114,155,
+193,138, 68,101,227,248,219, 35, 90,213,117,163, 99,199,142,173,219,224, 26, 89,186, 34,184, 43, 5,240,108, 21,136,105,115, 87,
+225,235,143,231,131,101,109, 32, 4,176,179,142,141, 76, 64,136,240,231, 23,159, 15, 12,105, 19,200,247,156,246,152,220,248,205,
+ 14,131,108,218, 99,114, 99,167,206,238,165, 47, 62, 31,152, 82,110,242,239,111,103, 89,156,186,154,135,184,148, 82,196,165,150,
+ 65, 41,115,124,152, 47,190, 88,244,252,242,101, 75, 69, 2, 62,195, 92, 77,211,235, 51, 11,237,122,190, 80,104,149,203,196,196,
+ 66, 4,230,212, 2, 82, 56,108,226,147,198, 3,219, 63,121, 26,192,236,134,116,170,123, 26, 86, 71,178,170,215,132, 16,194, 0,
+ 28,199,176,108,102,129, 9,122,171, 13,186,226, 63,140, 22, 99,111,184,230, 84,233,211, 33, 72,173, 82, 30,230,243,249, 18, 66,
+ 0,155,213,254, 8,124, 58,140,212,231,220, 76,168,109,178,206, 94,205,198,173, 75,199,116,172,213, 48,221,144,119,227, 23, 71,
+143,157, 97, 64,248,124,112,124, 30,195, 49, 12, 56, 33,143, 88, 64, 8, 87, 55, 71, 6, 39,140, 86,181,217, 18, 11,249,139,142,
+238,250, 88,251,212,152, 80,124, 27, 85,233,249, 76,229,249,101, 21, 89,212,100, 81, 40, 20, 10,229,238,210,152, 23,249, 7, 69,
+181,238,140,104, 53,118, 64,132, 0,137,105, 5,104,227,231, 9,191, 54,237,145,112, 61,246,143,109, 0,236,172, 99,213, 81,251,
+247,231,100,174, 90,165,230,230,207, 47,237,187,124,185,255,153,231,103,181,214,116,234,236, 94,250,234,171,233,125, 87,175,214,
+156,249,249,172,144, 37, 85,227,117, 85,143,205, 69,136, 51,237,226,120,189,186,134,181,229,191,187, 35, 49,253,151, 43,229,121,
+ 34,145,200,230,237, 42,101, 84, 74, 49,159,207, 19,138,205, 54,158, 57, 40,188, 59,255, 0,143,233,222,152, 74,181,209,170, 91,
+117, 88,152,127,107,252,209, 31, 22,118, 26, 60,113,133, 91, 86,190, 17,165, 22,126, 77,213, 33,159,199,224,202,245, 52,128, 47,
+138,171, 79, 83,173,114, 59,178,243,155,175,253, 87, 47, 95, 2,171,157,197,139,243,223,194,147, 51,166, 31,129, 79,135,145,254,
+129,193, 49,191, 31,248, 74, 62,114,214, 6,164,221,136,206,181,155,203,118, 57, 99,178,106,204, 22, 64, 88,194,241,138,138,203,
+148,102, 59,164,168,199,247,153,173, 92,179,174, 28,189,209,142, 3,231,114,113,240,199, 93,208,168, 20,244, 73, 64,161, 80, 40,
+148,187,206, 63,212, 92,161,142,185, 2, 26,138,104, 53, 70,128,159, 23,206,197,165,160,115, 72, 91,104,212, 42,196,223,202, 4,
+159, 39, 4,143, 1,108,118,199,205, 16,177,218,190, 93,189, 90,131,180, 20, 5,239,179, 13, 41,129, 47, 62, 31,152,178,122,181,
+230, 12,177,218,190, 5, 48,157, 16,160,210,108, 85, 26, 46,214, 9, 95, 64, 56, 91,107, 47, 55, 57, 63, 58,169,162,144,199,227,
+155,221, 53, 82,206, 93, 35,225,185,171,196, 66,145,144,207,217, 9,207,234,167, 13, 52, 17,142,235,234,136, 94,237,170, 67,150,
+101,193, 48, 60,182,202,136, 41, 50, 10,141, 40, 53,241,161, 43, 49,163,184,220,138,142,190, 10, 28, 59,254,189,129,181, 25,119,
+212,167,197, 23,138, 52,237, 3,253,240,191,247, 87,195,104,102,145,152,165,135, 72, 34,241,246,242, 14,191, 60,253,133,215, 37,
+ 47,109,190,133,167,135,186, 99,254,239,183,178, 12, 58,233,235,206,156, 89,150,101, 97, 52, 89, 68,186,130, 98,215,178,242, 10,
+181, 76, 42, 49,122,186,105, 10,234,251,172,201,201,136, 86, 53,114,169, 0,227,250,120,195,100,157, 10,163,217,142,211,191,236,
+161, 79, 4, 10,133, 66,161, 80,254,160,193, 9,164, 29, 50, 90, 74,185, 20,132, 47,197,239, 49,183, 16, 28,214, 5, 91,247,159,
+ 71,135,206,125,144, 83,110, 7, 1,175,201,222,134,213, 44,124,195,120, 17,192,197,241,227,229,126, 15, 62,232, 59,156, 16,225,
+207, 27, 54,149,101, 2, 64,219, 78,149, 50, 28, 71, 64, 8, 64,184, 74,195,229, 48,140, 32, 45, 37,167,172, 77,160,183, 2,215,
+ 50,173,102,133, 68,196,115, 85,136,249,158, 26,177, 72, 36, 16,128, 37,140, 57, 39,231,150,153, 1, 82, 29,145,171, 91,117, 40,
+ 87,250,252, 52,108,226,138,252,212,244,210,232,142, 69,134,174,165, 86, 49, 8, 1, 58,250, 42, 16,119, 54,146,213,101,221, 76,
+ 52,234,110,108,172, 79,139,227,192,183,218, 57, 92, 78, 42, 69, 73,133, 13, 37,122, 43,250, 15, 25, 39,234, 31, 49, 30,191,199,
+ 21,128,179,219,176,252,243,200,114,150,216,166, 0,215,109, 78, 28, 52,239,220,197,171,126,249,197, 21, 18,161, 64, 80, 18,210,
+ 33, 32, 89, 44, 18,218,203,202,202,196,183,127,138, 15,133, 76,140, 34,189, 13, 0,108,206, 94, 61,165, 21, 54,236, 63,155,139,
+ 3,123,118, 66, 38,147,129,208, 27,138, 66,161, 80, 40,148,218,248,160,114,250,157,200,170,117,141,249,114,104, 82,105,150, 35,
+240,112,119,131, 84,161, 70,138,206,138,114, 70,139, 98, 3, 1,203, 86, 70,180, 26, 9, 60,213, 59,187,247,254,253, 57,153,251,
+246, 21,108,217,191, 63,167, 86, 67,239, 63, 34, 89, 53,107,142, 56,172,201, 16,246,216,254, 67,191,149,142,239,237,233,202,227,
+243,141, 34, 33,207, 44, 16,241,173, 34, 1,207, 38, 18,240, 44, 94,106, 33,255,183, 3,187,196,132,193,111, 77,105,154, 76, 38,
+ 68, 68, 68, 96,244,232,209,152, 48, 97, 2, 30,126,248, 97, 4, 5,133,106,121,124,198, 66, 24,142,243, 20,151,163,189, 39, 3,
+129, 41, 3,191,236,250,200, 16,119,106,239,101,214,108, 26,135,219, 45,231, 31,154,132,112, 69,165,102,152,172, 44,138,245, 86,
+ 20, 87, 88, 97,247,236,139,189,167,179, 97,180,176, 72,139,249,222,152,159,155, 57,215,156,119, 51,165,137, 83,241,218,237,255,
+146,204,103,158,154,145,175,146,242,110, 14,232,119, 95,190,135,187,155,157, 97,254,136,188, 50, 12, 3,169, 90, 11, 87, 23, 21,
+ 82, 46, 30,194,209,229,195,140, 0,222,116,164, 60,107,163,150, 11, 48,190,183, 55,198, 77,154,138,206,125, 70, 58, 98,172,233,
+140,246, 84,147,106, 82, 77,170, 73, 53,255, 75, 84,207,113, 88,189,118,108,100,248,106, 3,212,206, 71,129, 14,190, 10,152,172,
+ 90,152, 44, 44, 42, 76, 44,202, 12, 86,148, 25,108, 72,201, 53, 32,110,127,203,115, 88, 25,197,170, 28,241,147, 16, 0, 76,165,
+193,115, 52,122, 34,182, 90,222, 95,181,252,195, 71,118,117,239,102,121,105,140, 79,235,216, 20, 75, 54,195,240,140, 60,190,192,
+230,166, 18, 8,227,227, 99,243,207, 68,253, 52, 80,106,103, 31, 55, 52,162, 99,183,219, 75,125,125,125, 1,220, 62, 5, 79,104,
+123,217,132, 83,145,175,181, 29, 52,126,185,231,199, 75, 22, 26,120,124, 17,199, 8, 68,113,172,205,184,211,168,187,177, 1,141,
+216, 15,158, 72,122,253,220,165,107,125, 92,220, 90,227,102, 86, 5, 42, 76,118, 88,237, 28, 92,149, 34,100, 94, 57, 98, 77,137,
+143,254, 78,159, 29,187,181, 25,197,182, 35,225,122,156,223,168, 81, 35, 31,234,211,167, 47,127,241,226,183, 16, 28, 28, 12,163,
+209, 8, 30,143,135,214,109,218, 35, 37,225, 18,206, 70,190,207, 26, 10, 83, 55, 2,120, 15, 64,190,179, 95, 82, 80,102,193,161,
+232, 60, 68,254,248, 45,248, 66, 49,189,157, 40, 20, 10,133, 66,185,147,153,117,214,155, 29, 50, 90, 38,147, 41,229,254,136,113,
+224, 56, 2,150, 0, 28, 91, 21,121,226,254,136, 62,177, 54, 83, 74, 75,115,199,113,236,249, 79, 55,111, 25,221,189,215, 32,126,
+152,191, 18,101,133,185, 56,123,234, 87, 59, 56,114,198,145,253, 11, 11, 19,245, 50,175, 14, 15, 61, 50,249,193,221, 51,158,154,
+ 85, 50,112,200, 16,133, 86,235,109,206,204,202, 52,124,185,253, 27,219,145,159,246, 13,228, 96,127,180,176,240,166,190, 49,157,
+210,210,210, 79,234, 75,151,136,149,253, 1,180,229, 11, 24,139, 49, 63,209,169, 22,225, 5, 89, 25,147, 62,124,255,157,212,199,
+158,157, 39,110,231,219, 30,121,165,124,164,100,230, 34, 62,106,159, 57, 43,225,194,143,101,153, 23,159,118, 80, 42,167,158,180,
+ 76, 0, 31,159, 61,123, 38,124,212,168, 81, 35,135, 14, 29, 74,102,206,156, 9, 66,128, 95, 54, 63, 79,138, 82,206,126,143,202,
+ 40, 86, 82, 51,207, 75, 90,212,153, 75,110, 15, 15,236, 41,112, 87, 61,141, 45,223,254,100, 3,225,210,232,253, 68,161, 80, 40,
+ 20, 74, 13,205,111,163,149,113,189,114, 60,173, 63,155,242,220,188,233, 91,183,126,253,193,215,219,119,245, 55, 89, 44,190, 4,
+162, 12,214,110, 57,161,103,177,216, 81, 13,163,238,102,180,187,123,199, 78, 95,126,254,233,155, 95,110,249,108, 16, 56, 54,132,
+ 1, 82, 9,131,223,164, 54,118, 70, 83, 38,171, 81,179, 84, 80,190,105,248, 67, 43,141,133,133,250,175,157,221,215, 88,120, 35,
+151,199,183,182,222,180,230,253, 21, 60, 30,127, 4,203,114, 66,142,181,221,100,173,166,143,140,249, 55,246,195,225, 86,110, 40,
+106,100,219, 85, 0, 87,143, 31, 63, 62,224,248,241,227,189, 0,124,130,202, 57, 20,163, 91,114, 94,204,133,229,195, 94, 89,248,
+202, 47, 11,192, 4,112, 28,129,157,229,210, 68, 70,195, 48,122, 79, 81, 40, 20, 10,133, 82,195, 76,220, 57,104,169, 99, 17,173,
+191,138,226,226,164,114, 20,227,165,150,234, 20, 22, 38,234, 1,220,209,115,207,208, 66,221,184,196,178, 31,144, 88,246, 67,115,
+247,175,200, 75,206, 7,146,103,180, 48, 27,142, 52,100,255,189,106,185, 43, 20, 20, 92,175, 64, 1,122,211,123,136, 66,161, 80,
+ 40, 20,167, 13,151, 99,141,225, 41, 20, 10,133, 66,161, 80, 40, 77,154,172,218,107, 0,149,109,207, 27,234, 57,224,204,204,220,
+205,233,125,112,140,106,182, 88, 83, 8, 64, 12, 64, 9,160,169, 42,205,145,168,154,175,145,150, 39,213,164,154, 84,147,106, 82,
+205,123,168,217,148,246, 49, 80,254, 84, 3, 70, 53,169, 38,213,164,154, 84,147,106, 82,205,255,158,230, 63,153,153,245, 44, 0,
+254, 70,109,180, 40, 20, 10,133, 66,249,171,112,119,239,168, 4,106,218,245, 54,137,220, 35,212, 11, 0, 12, 5,215,117,180,244,
+ 40,245, 80,123,158,195,187,210, 70, 75,200, 19,136, 95,145,171,220,175, 43, 52,238, 89,255,241,194,101,130,218, 40,230, 12, 31,
+ 24,184, 55,184,173,108,130, 51, 59,202, 61,131,190,242,110,223, 59, 93,161, 13,154, 3,159,238,178,150,100, 66,161,109,235,169,
+108,221,243,148,202, 55,252,129, 63,225, 24, 37, 97, 97, 97,125,195,194,194,250, 2,144,220, 13, 65,185, 54,104,170, 95,135, 62,
+ 81,218,118,221,126, 85,120,117,156,124,183, 51,172,244,233,224,174,108,221,227, 7,101,171, 46,197, 74,159, 46,101, 74,191, 30,
+ 39, 84, 30,161,237,154,218,175,245,248, 15, 67,222,221, 25,183,179,245,248, 15, 67,234,219,238, 58,106,173,234,237, 93,137, 75,
+220,199,125,164,164,207,149,230,209,186,255, 84, 23,159, 65, 11,220,157,221,207, 55,168,207,213, 54,225, 3,242, 90,117,236, 29,
+231,232, 62,126,193,125, 47, 6,132,245,215,249, 5,245,141,166, 37,239, 24, 82,207,182,125,165,174,254,145, 18, 87,255,159, 36,
+110,109,135,180, 84,207,199,199, 71, 22, 18, 18, 50,170, 79,159, 62,207, 13, 27, 54,236,229,110,221,186,205, 12, 8, 8, 24,113,
+ 47,127,232,203,181, 65,111,152,133, 76,129, 89,200, 20,200,181, 65,111, 52,253,124, 13,254,128,225,177,217, 12,143,205, 86,104,
+131, 63,248,187,156, 43,137, 87, 80,128, 92, 27,180, 90,229, 29,118, 94,166,237, 56,206,217,253, 93, 93, 93, 71,120,122,122, 78,
+172, 94, 92, 93, 93, 71,208, 59,160,217,212,142, 98,181, 56,162,197, 23, 74,228, 39, 31,123,234,197, 78,203,222,121, 93,186,102,
+203, 94,172, 89,178,240,154,185,162, 36,236,239,120,228, 30,109,123, 69,243,121,124,191,218,105, 44,199,102, 22, 36,159,239,121,
+ 55,244,131,219,200,158,126,243,213,233,243,167, 62, 18, 17, 16, 49,118, 46,115, 35,217,184,207,113,139,134,174,223,253,240, 99,
+235,168,223,126, 93,187,101,203,230,247,242,237,193,171,133, 18,193,167,101, 25, 87, 75,156,201,131,218,179, 93, 91,129,194, 35,
+234,254, 9, 47,122,199, 28,251,102, 43,107,225,134, 27, 10,106,205,254,221,124, 60,219,183,111,127, 31,159,207,119,159, 51,103,
+142, 8, 0, 62,254,248,227, 14, 44,203, 22,222,186,117,235, 2,154, 49,248,105,165,193, 12,158,254,201,138,119,191,126,224,129,
+209,200, 46,168,192,242,213,235, 7, 31, 62,248,221,195, 21,186,196,239,239,198, 57,113,113, 9, 84, 67,164,186, 50,247,213,247,
+180,163, 6,223,199,215,155,236, 56, 28,117,105,192, 55,235,223, 59, 15,132,246, 42, 47,184,222,224,152, 98,156,161,116,145,151,
+146,140,226, 12,165, 0, 48,245,142,151,189,210, 22,225, 41, 99, 71,249, 72, 4,151, 10,129, 38, 39,125,116,105,211,255,136, 80,
+ 34, 9,224,241,120,224, 49, 0,143,199,128,207, 48,149,243,132, 90,141,105, 89,241,191,143,252, 59,220, 39, 42,255, 94,185,224,
+ 11,220,121,204, 31,249, 99,120, 85,107, 66,202,114, 19, 79,186,223,133,175,209,116,234,224, 18,222,191, 67,197,151, 39,146,139,
+ 20,130,129, 47, 71, 50,132,247, 89,250,239,171, 47, 59,100, 0,164, 82,215, 3, 7, 14,120,142, 26, 53, 74,163, 13,159,112,194,
+145,125,196,124,125,216,193,131,251, 69,163, 70,141,116,226,250, 12, 26, 14, 30,111, 59, 3, 8, 57,142,124,204,231,200,119,250,
+194,132, 91,128,115,179, 79,201,180,193, 79,243, 64, 28,126,206,112, 96,162,141,121, 55,182, 52,183,112, 5, 18,245, 48,161, 72,
+244,114,219,160,206,221,179, 82,111, 70, 87,232,203, 87,219,205,165, 39,156, 22,178,217, 95, 57,246,123,204, 3, 2,161,144, 25,
+ 53,172, 55,223, 12,252,218,146,147,238,229,229, 53,113,221,186,117,237,250,246,237, 11, 0,176,219,237,234,221,187,119,123,191,
+255,254,251,138,132,132,132,230, 78,156,234,235,233,233,233, 47, 22,139,125, 1,192, 98,177,100,229,231,231,167, 3,104,242,135,
+191,194,171,157, 7, 8,222,251, 61, 42, 74, 0, 0, 3, 6, 12,252,192,255,254,217,174,124,145,210, 88,111,113, 88,202, 21, 37,
+183,126,157,119,246,220, 25, 6, 0,250,244,238,251,186,220, 35,244,211,123, 25,217,146,106,131,123,243,128,249,125, 6, 68, 76,
+154,242,232,116, 94,120, 71,127,140, 24, 62,244, 53, 35,112,192,169,107, 70, 32,144,157, 63,127,190, 61,143,199,227,219,237,118,
+ 83,159, 62,125,210, 91,146,175, 86, 65,125, 79, 51,224,181,182,218, 45,159,231, 39, 69,127, 0,220, 49,113, 12, 95,211,186,251,
+155,224, 11,158,229, 56, 46,163, 60, 61,186,223,191, 48,162,117,103, 57, 59,171,196, 19,136, 95,158,250,228, 11,157,230, 45,248,
+159,116,238,154,227,136, 92,255,122,193,223,213,100, 1, 0,159,199,247, 59,114,244,136, 86, 46,230, 3, 0,244, 38, 59, 30, 24,
+ 53,170,233, 55, 66,155, 94,191,241, 24, 38,184,122, 66, 27,214,110,149, 10,132, 98, 19, 83,105,144,192, 0,240,104,213,230,184,
+151,253,164,124,234, 35, 17, 1,219,119,253,156,153,158, 89,232,244, 67,141,225,139,208,103,224, 8, 68, 12, 31,169, 57,127,238,
+244,123,155, 55,110,120,195,110,181,109,224,108,220,106, 83,209,205,236, 38, 31,230,222, 29,123,136,149, 30,135, 39, 61,247,190,
+187,137,231,134,197, 75, 62,241,136, 58,180,227, 68, 86, 70, 87, 46, 45, 45,195, 68, 24,230, 90,113, 81,206,203, 21,185,183,110,
+ 56, 90,100, 74,165,178,157, 82,169,236,218,165, 75, 23,233,194,133, 11,133,131, 7, 15,254,195,178,207,156, 41,250,237,183,223,
+124, 86,174, 92, 57, 58, 54, 54,214,164,215,235, 47,235,245,250, 36, 56,209,208,222,219,219,115,246, 67, 15,142,195,208, 73, 47,
+130,229, 24,204,124, 97, 30,142, 28,218, 51, 11,192, 93, 49, 90, 54,185,250,253,103,159, 91,232,217,231,190,110,252,247,118,220,
+128, 76, 44,192,200,158,193,204,147,115, 22,185,108, 89,251,222, 23, 40,192,160,250, 34, 89,156,161,116, 81, 39, 15,203,163,227,
+251,182,197,254,157,150, 71, 49,236, 85,240,228,154, 15, 50,246,255, 47, 30, 0,218,141,154,163,146,176,249,235, 90,185,240,181,
+ 18, 54,127, 93,187, 81,115,142, 37, 29, 94, 87,222, 88, 94,132, 18, 73,192,206, 29, 59, 58,186,170, 68, 16,240, 24,240,249, 12,
+ 4,124, 30, 76, 22, 22, 15, 63,242,232, 93,187,204,101,218,142,163,121,192,147,149, 47,108,124,101,204, 75,252,201,153,115,194,
+240, 69,238, 7,247,255, 40,208,106, 36,224,243, 25,240,121, 0,159,199, 32, 85,103,196,211, 79, 63,169,105,169, 97,127,160,191,
+246,190, 87,166, 4,143,236,211,201,173,203,183,103, 24, 77,159, 7,166,184, 23,152,228, 79,236,218,247,235,163,100,192,188,115,
+132,112, 43, 50, 79,126,114,180, 49, 17,179,217,172, 27, 57,234, 1, 53, 35, 80,200,143,237,221, 58, 80,192, 99, 96, 99, 9,236,
+ 44, 1, 91, 53, 55, 42, 83,245, 11,134,199, 99, 64, 56,130,103,159,125, 26, 35, 71, 61, 96,224,236, 92,166,227, 15, 57,222,246,
+195,199, 78,121,154,109, 28, 86,174,219,242, 94, 69,105,254,123,201,241,238,169,250,210,130,121,198,188, 68,135,231,193,224,129,
+244,204, 72,138,123,110,199,193,179,232, 20, 22, 10,150,171,204,103,176,159, 2, 59, 34,207, 34, 36, 56,164, 50,223, 28,249, 63,
+123,103, 29, 29,197,245,183,241,103,214, 53,238, 9,193, 3,193, 18,220,221,139,107,209, 66,113, 90, 74,141, 34, 45, 45, 80,180,
+ 20,167, 64, 11,148, 82,160,184, 7, 11, 14,165,104,128,144, 0, 73,136, 19,223,216,186,239,220,247,143, 77, 40, 18,217, 0,125,
+251,107,123, 63,231,236,217,204,100,247,217, 59,115,103,238, 60,247,123, 13,181, 3,229,104,214,180, 25, 0,188,150,209,226,137,
+156,190,233,208,123,244,130, 62, 67,199,193,219,203, 11, 28, 98,233,115,238,196,111,125,126,217,248,253, 23, 86,131,106, 69,133,
+196,136,237,217,115,129,176,236, 27, 71,157,252,253,253,189,154, 53,251,115, 58, 70,171,213,138,106,213,170, 33, 61, 61, 61,248,
+117,234,105,126,126,126,189,231,205,155,231,221,171, 87, 47,190,175,175, 47, 0, 32, 43, 43, 43,224,244,233,211,141,231,205,155,
+151,147,153,153,121, 2,101,204,232, 99,179,112, 4, 28, 30,184, 98,177,212,126,140, 96, 56, 51,166,189, 23,234,227,231,111, 44,
+233,243, 10, 69,150,112,230,135, 23, 25, 30, 79, 80,244,121,112, 8, 97,153, 50,162, 68, 93,249,124,126,137, 45, 20,102,174,115,
+ 75,194,119,153,192,225,114,236, 23,171,213,162, 40, 72,189, 91,183, 2,145,184,250,124,161, 96,211,224, 97,227, 90, 15, 25,212,
+ 31,126, 94, 46, 56,247,123, 36,166, 76,251,204, 98, 53, 91, 86,189, 86,225,193,229,242,114,114,114,146,221,220,220,124,223,252,
+121,203, 84, 63,123,230,148,247,185,243, 23,102,175, 92,179,110,170,217,100,181,176,132, 60, 91,199, 88, 34, 17,241,187,245,121,
+215,217,187,102, 75,241,186,121, 19,248,255,194,136,214,230,183, 98,180,132, 18,167,119,191,158,249,145,120,225,174, 27, 56,177,
+ 97, 74,174, 78,149,235,245,172,166,224,236,122, 87,171, 42,108,252, 58, 41,148,123,213,110,197,112,121,147, 25, 46, 87,198,112,
+ 24, 33,107, 99,159, 90, 77,166, 69,250,188,184,204, 55, 61,122,150, 37, 56,248, 71, 78,197, 12, 16, 65,208,206,189,135,189,125,
+ 92, 69, 48,152,109, 24, 54, 98, 52,118,236,216,225,228,229, 34,132,193,100,197,247, 43, 87,170, 53,201, 39,188,147,159, 22,164,
+119,237,251, 89,120, 66, 82, 78, 84,106,166, 97, 95, 69,211,102, 52,219,160,210, 89,161, 51,114, 80,171,126, 51,124,191,170,142,
+ 56, 53, 37,241,179,237,191,108,157,254,240, 33,119, 7,203,229, 44, 48,100, 62,122, 90,226, 77,231,219,160,135,179,155,199,238,
+129,147, 23,187,198,229,240, 64, 96, 70,188,179, 24,239,142,157,238, 92,195, 87, 2,153,152,235,154,152,146,238, 55,227,139, 47,
+126, 79,176,145,230, 42, 69, 66, 98,121,233,169, 90,181,234,160, 62,125,250, 72, 63,255,252,115,126, 96, 96, 32,126,249,109,127,
+149,118, 61,134,246,205,200,204, 14, 36,132,192,199,219,251,233,196,247,135, 30, 63,121,242,100,202,211,167, 79,249,203,151, 47,
+111,113,248,240,225,122, 89, 89, 89, 14,215, 76,109,132,192, 96,180,193, 86,244,128, 84, 40,141, 21,246,167, 1, 1, 1,162,244,
+244,116,227,115, 81, 6,230,207, 64, 33,211,163, 75,135, 22,188,159, 78, 37, 65, 99,176, 65, 38,230, 35, 41, 91,135,166,141, 66,
+152, 45, 54,107,195,146, 4,199,191,219,123,174,143,156,244,236,215,170, 58,188,221,164,216,246,195, 98, 28,187,158,216, 51, 91,
+195, 96, 61,225, 78,246, 19,241,186,201,216,204,245, 29,155,214,244,237,220,164, 10,110, 55,173,233,123, 37, 34, 38, 86, 50,116,
+229, 71,233, 26,254,185,130,211,211,213, 37, 23, 60, 28,184, 59, 9,240,243,153, 20, 72,197, 60,200,196, 60,200, 68,246,119, 14,
+135,121,179, 90,173, 95,221, 64, 46,107, 27,207,229,242,198, 15,127,119,168,255,200,225, 67, 9,184, 28,236, 63,120,188,255,174,
+ 93, 59, 51, 45,102,211, 86, 27,135,251,115,105,215,207, 11, 39,148, 3,120,187, 8,241,197,214, 40, 56, 75,248,112,146,242,225,
+ 44,229,163,115,168, 23,184,175, 63, 9,140,219,148,254, 53,122, 77, 25, 88,181, 83,112,101,121,173,251,241,202,135,227, 23,221,
+ 89,115,169,176,211, 39, 63,172,174,231,161, 41, 52,241,190,153, 49,145,151,150,145,209,105,255,241,203,157,109,166,113, 49, 86,
+179,246, 75, 69,228,254, 18,163,194,105, 49,215, 27, 7,180, 28, 34, 54,107, 44, 15,238,199,164,213, 44, 48,138, 16,157,172,130,
+ 76,204,131,188,248,220,138,121,144,137,249,144,139,121,200, 72, 75, 66,190,150,251,123,186, 7,167, 19, 46, 95,183, 86, 36,225,
+ 6,179, 13,247, 18, 53,168, 26,220, 8,126,126,254, 48,245, 26, 85,245,230,133,131, 71,111, 93, 62,178, 84,151,245,248, 75, 71,
+117,126, 11,187,129,217,159, 78,142, 96,128,187, 69, 15,233,198,223, 44,219,208,228,219,217, 31,190,176,111,198,130,117, 77, 94,
+ 63,146,229, 52,183,243,192, 15, 22,180,235, 54, 16,234,252,108,252, 17,190, 15, 61,250, 12,198,168,113, 31,195,213,213,243,251,
+ 85,139,102,222,183, 26, 85, 23, 94, 41,115,125,235,180, 13,105, 80,119, 87,128,191,127, 32,203,218, 87,249, 32, 4,208,168,149,
+152,249,201, 68,176,132,160, 97,227,230,157,197,237,186, 17, 82,180, 26, 72,110, 94,174, 54,230,241,195,174,134,156,152,155, 14,
+159, 75,131,193,162, 80, 40,112,239,222, 61,196,198,198, 34, 58, 58, 26,121,121,121,112,113,113,209,104,181,218, 10, 5,239, 67,
+ 67, 67, 71, 94,184,112, 65,236,230,230,246,108,167,201,100,130,147,147, 19, 70,142, 28,201,239,222,189,123, 64,239,222,189,199,
+ 68, 69, 69,253, 6, 64, 85, 98,122,242,159,100, 56,249, 4,255,216,161, 99,135,169, 0, 32,113,246, 75, 92,255,203,241,232, 50,
+ 43,180, 46,254, 85, 90,183,110, 83, 19,132,128, 1, 89,171,203,139,205, 42, 35, 74, 36,187,113,227, 70, 13, 46,151,203,251,243,
+ 25,196, 98,227,182,189,117,206, 94,125, 48,104,217,247, 43,196,206, 50, 17, 20, 74, 19, 38,140, 26,232,240, 51, 88,226, 19,220,
+171,117,235,246, 71,191, 93,240, 53, 79, 46,147, 33,252,102, 2, 62,250,228, 11, 67,102,114,212, 10,194,242, 55,232, 20,177, 57,
+111,248,168, 36,120, 11,212,170, 36,135, 83,191, 30,226, 41,239,245, 19,155, 44, 54, 20,106, 45, 48,154,109,176,177, 4, 74,173,
+ 5, 15, 83,213,240,116,174,248, 82,110,132,144,102, 0,188, 0, 40, 24,134,185,253,252,118,113,133,174,216, 27,191,180,157, 91,
+244,124,240, 0, 96,130,125,164,254,179,203,167,104,187,180,253,197,223,127, 8,160,110,145,166, 13,192, 45,134, 97, 10, 74, 49,
+ 91,175, 68,185,120, 97, 97, 97,164, 79,159, 62,207, 74,252,151,183, 95, 70, 36,224,251,203, 92,188, 64,200, 35, 60,191,128,177,
+183,111, 64,222,138, 85,107,220,167,125, 48, 57, 69, 85,152, 95,165,104,247, 57, 71, 30, 22, 60,134,187,170, 67,155,150,221,167,
+126,240, 1,130,107, 84, 18,216,108, 54, 18, 21,155,104,217,254,243,182,177, 87,174, 11,215,168,210,162,230, 62, 23,130,172,208,
+176, 79, 27,107, 75,123, 57,130,101, 99,109, 47,215,110, 95,209,100, 24,192, 85, 46,196,143,167,146, 64, 8,192,128,192, 69,198,
+199,158, 75,105, 72,140, 56,164,234,211, 80,165, 29,185,108,126,231, 78,189,166, 95,120, 24,111,216,151,147, 99, 56, 3, 32,171,
+ 44,205,146, 11,116, 22, 70,179, 13, 22,171, 21, 7,142, 31, 71,207,206, 45,208,186,117, 11,180,111,215,154,119, 39, 34,114,220,
+ 7, 83, 39, 6,226,207,209, 29,207, 52,197, 62, 65,205,228, 46,158,251, 6, 77, 93,238,244, 32,205, 10, 30, 23,168,238, 43,129,
+187,147, 0, 38, 43,131,100,133,185,232,206,113,197, 71, 51,218, 68,194,144, 0, 0, 32, 0, 73, 68, 65, 84, 22,184,207,254,108,
+234, 73,149, 66,216, 0,120,100, 46,235,216,117, 58,157,112,244,232,209,124,139,197, 98, 30, 57,225,227,238, 89, 89,138,254, 27,
+215,126, 39,242,246,246,129,206, 96, 69, 68,244,147,186,223,126,187,160,250,241,211,151,142,204,255, 98,202,209,158, 61,123,186,
+236,221,187,151, 45,239,124,190, 80, 67,204,206,253, 97,219,174, 3, 59, 86,175, 88,130,152,148, 2,252,252,211, 6, 16,155,245,
+199,114, 78,213,243,154,100,244,232,209,146, 35, 71,142, 84, 74, 75, 75, 83,233,116, 58,197, 11,241, 8, 14,195,203,206,215,193,
+211, 73, 8, 1,143, 3, 31, 55, 49,188, 93, 68,224,115, 1, 14,195,216, 74,210,252,121,223,137, 69,172, 78,137, 99,187, 77,195,
+183,253,176, 24,227,166,125,133,168, 92,225,105,142,212,101,209,135,195, 7,205,246,146,216,122,250,187,114,188, 59, 55,169, 10,
+153, 88,128, 57,211, 71,163,121, 68,178,119,122, 33,251,149, 66,207,109,180,224,244,179,197,186,207,189, 24, 28,177, 71,176,156,
+164,124,156,222,245,125,142, 86,169, 80, 22, 55,201,153,140,134, 20, 7, 47,227,115, 37,212,108,103, 55, 10,169,191,120,234,164,
+241,156, 54,173,154, 19, 14,135,143, 92,181,137, 33, 4,248,228,163, 41,248,112,202, 68,223,167, 25, 57,223,108,216,240,227,220,
+ 11,103,201, 66,173,226,241,252,178, 52, 57,140, 61, 10, 36, 23,243, 32,151,216,141,139, 92,204,131,193,100, 3,195,128,235, 90,
+185,177,146,177, 71,114, 51,242, 83, 74,173,129,191,160,233, 94,185,254,249,179,137, 78,117, 10,246, 21, 92, 79,202,136, 94, 20,
+ 17,153,125, 11, 64,126, 96,123,215, 49,102, 43,129,198, 96, 69, 82,182, 14, 86, 51, 97,198,189, 83, 5,213,134, 48,193, 75,182,
+221,221,113, 42, 18,206,207, 21,250, 47,104,166,223, 56, 96,240,104, 48,112,216,234,117, 63,221, 94,177,248, 43,110,174,210, 4,
+150, 16,136,133, 92, 72,132,188,162, 23, 23,122,173, 18, 27, 54,109,201,178,130, 25,132,203,151,173, 21,185, 62,193,146, 81, 3,
+123,181,223,195, 0, 66,134, 35, 72,243,175, 82,181, 74,151,190, 99,197, 93,250,141,134,205,106,154, 29,113,149, 92,212,229,196,
+156,119, 68,179, 65,189,186, 96,128,187,218,156,216, 41, 0, 32,243,174,253, 99,157,224, 58, 77, 94,222, 23, 20, 20,220,196,145,
+124,127, 22, 41, 21, 59, 77,115,115,247,250, 42,184,126, 35,239,236, 2, 35,227,228, 81, 9, 73,113,247,176,123,211, 55, 59, 89,
+131,105,193,249, 19,251, 22,175,249,249,240,187, 93,122, 14,196,182,141,223,205,201,203,124,102,180,206, 61, 23,173, 26,181,125,
+235,230, 64,190, 80, 4,139,149,133,197, 70,236,239, 86, 27,242,243, 11, 96,177,178, 16, 75,157, 96,101, 25, 88,108, 44, 44, 86,
+ 22, 70,147, 85, 54,101,116,239, 15, 12,192,205,146,210, 25, 80,167,195, 25,129, 72, 84,133,192,190,118, 45, 33, 4, 73, 89,122,
+142,159,159,223,111, 0, 32, 18,137, 32, 18,137,192,178, 44, 34, 98, 20,211, 60,131,107, 79, 69,145,193,179,153, 77, 41,133,201,
+215,122,148,118,236,190,190,190,125, 95, 54, 89, 6,131, 1, 26,141, 6, 87,175,223,118,217,186,227, 64,207,164,148,180, 26, 44,
+113, 49, 58,121,215,232,161,206, 73,232, 91,218,249, 84,103,199,124,224,220,114, 34,231,243, 15,199, 4,173,219, 30,118,235,201,
+153, 69,101,246,211,170,214,101,150,233,243,201,131,155, 46, 91,251,115, 92,193,181, 31, 63, 45, 47,143,120, 60, 30, 95,161, 80,
+ 60,187,191,215,111,217,221,244,110, 76,250,128, 53,171,215,136, 35, 18,212,120,144,148,129, 49, 93, 43,219,107, 56, 14,228,187,
+204,167,134,103,245,154, 53,127,219,176,118, 25, 47, 46,195,128, 31, 14,221,194,133,163, 63, 94,205,202,185,217, 19,217,153,250,
+215, 41, 67,222,130,209, 42, 85,243, 98,100, 46, 52, 6, 43,140, 38, 43, 44, 44,129, 74,103, 65, 78,161, 9, 42,157, 25, 26,189,
+ 21, 99,186, 85, 46,241,123,229,248, 17, 47,134, 97,194, 8, 33,125, 8, 33, 93, 1, 8,139,183,237,207,108, 38,172,200,144,189,
+176, 61,123,246,236, 47,151, 46, 93, 26, 93,252,217,226,253,197,159, 45,107,255,115,223,247,152, 51,103, 78,131,101,203,150, 45,
+105,213,170,213,158, 63,254,248, 35, 17, 64,129,163,205,135,188,231, 15, 38, 44, 44,172,188, 19, 93,195,108, 49,139,156, 37,124,
+ 84,175, 86, 25,239,127,185,205,243,215,101,227,115,196, 66, 30,247,212,169, 83,238,121, 38, 57, 56, 28,174,195, 85, 20,185, 87,
+173,214, 2,129,240,196,202,149, 43, 49,188,111, 59, 73,106,174, 69, 19,153,170,207,214,154, 96,245,246,170, 45, 92,180,100,153,
+124,217,242,239, 63, 12, 59,198, 22,106,178, 31,126, 95,114, 19, 95,211, 59, 92,230,185, 62, 88, 12, 3,194,218,210, 10,146,111,
+ 55, 5,128, 55,233,139,165, 49, 88,192, 45,234, 91,195, 48,128,206, 96, 5,151,203,228, 20,198,236,123, 56,114,225,162,206, 59,
+247,156,205, 32, 28, 87,181, 86,155, 36,133,125,205,193, 10, 99, 48,217, 96,180,216, 16,125, 63, 2,237, 91,214, 67,235,166,117,
+160, 51,216,160, 51, 90, 81,173,102, 48, 0,120,150,152,113, 92, 78, 34,177, 89, 12,132,216,156,250, 52,243,130,183,171, 16,126,
+110, 34,136,132, 60, 88,172,128,222,196,194, 96,178, 33, 57, 71, 15,181, 94,130,144, 14, 67,171,123,248,221, 49,102, 37, 75,142,
+228,167,222, 25, 84,166, 57,181,217,176,253,183, 3, 65, 25, 25,217,253, 79, 30,217, 37, 82,168, 44,136, 76,214, 34,167,208, 8,
+112,189, 48,111,201, 15,162, 89,159, 78, 26,176,125,247,193,148, 46,237, 90,164, 84,244,152,117,138,152,157,251,246, 31,248,177,
+ 79,159, 1,146,232,155, 39, 17,119,239,252, 98,109, 78,133,250,103,113, 26, 54,108,104,157, 52,105,146,122,201,146, 37,129,199,
+142, 29,171,166, 80, 40,238, 1,176,184,186,186,214,169, 29, 84,229,126,248,233, 83, 1,189, 7, 12,229,167,229,234,225, 34, 21,
+160,138,183, 20,215,175,158,177, 8,133,252, 18,251,155, 20, 53, 15,142, 64,151,153, 56,118, 61,177,103,116,158,248,210,196,241,
+ 99, 82,194,175,196,228,173,223, 17,254, 93,128,220,114, 79,204, 42,214,223,105, 90,211,119,246, 71,163,177,116,221, 78, 92,142,
+136,201,209,114,252, 22,103, 26,173,103, 75, 15,165, 3, 60, 46, 3, 39, 9, 31, 90,149, 66, 25,127,247,116,237,183, 20,166, 30,
+ 19,126,100, 39, 39, 95,109,193,211, 92, 3,147,145,175,134,141, 37,112,149, 10, 96,101, 9, 10,243,115,153, 93, 59,119,224,246,
+237,235, 28,112, 57, 19, 0,204, 47,243,132, 50,246,166, 66,185,152,111,143, 8, 73,236,239, 22, 27,139,224,160,154,216,188,126,
+149,179,167,183, 15,218,182,119,188,111,180,147, 71,149,134,123,126, 89,143, 75,127,220,237,120,121,205, 15,205,228,254, 94,235,
+ 24,198,182, 2, 4, 6,163,217, 6,101, 97, 1,132,166,167,104, 30,160,128,187,212,134,100,149, 31,162,178,226,228,229, 21,248,
+121, 81,135,239, 49,100,192,220, 3,199, 47, 44,237,209,173, 35,162,146, 85,144, 8,121, 16, 11,185, 16, 11,185,224, 51, 54,172,
+218,244,163,165, 64,169,238,147, 23,125, 52,247, 53,174,207,115, 69,181, 95,187,185,179,105,188,118,174,155,251,235,196,153,203,
+123,244, 28, 56,150,137,186,125,241, 75, 29,112,222,177,138, 30,113,104, 31,203, 58,254,140, 19, 59,121,174,157, 62,107,209,244,
+238,125,134,130,203,229,193, 98,177,224,224,222,157,248,229,135,121,143, 77,154,188,177, 0, 88, 83, 14,119,210,190,157,155,134,
+206,252,102, 21,211,160, 97,243, 22, 23, 51, 95, 93,142,150,229, 50, 63,189, 55,126,242, 48, 31, 31, 31,167, 63, 35, 90, 4,181,
+131,235,161, 87,191,193, 56,115,244, 48, 30, 70, 71,130, 37,118,195,196,178, 4,133, 5,121, 89, 86,139,105,123,169, 45, 30, 98,
+113,149,109,191,236,168,197,225, 48, 48, 91, 88,152,172, 44, 62,253,224,125,211,148, 79,190,108,219,171,123,135,104, 33, 23,170,
+228,212, 76,215,235,119, 31,133,176,124,121,224,248, 25,171, 4, 6,163, 13, 74,157, 5, 39,127, 46,221,235,136,221, 42,183,170,
+218,164,215,248, 41, 95,111, 22,137,184, 28,115,253,218,129,137, 29, 90,214,127, 90,217,223, 83,253,237,178, 31,154,255,126,243,
+110,175,119, 71,142, 23,143,169,211,132,241,247,144, 56,189, 63,114, 96,168,205,106,126, 79,151,255,180,212,249, 5,249, 82,183,
+194,202,213,130,116,127, 70,140,106, 31, 98, 8,170,191,224, 60, 24, 36,234,179, 99, 7, 1,128,159,127,101, 3, 95,228,172,174,
+ 64, 4,134, 0,192,186, 45,187,155,222,143,205,152,184,122,245, 26,105, 68,130, 26,247, 18,148, 16, 9, 56, 48, 91, 88, 48, 14,
+ 6,181, 89,194,157,252,213,156,217,206, 5, 90, 27, 46, 69, 42, 16,125,231, 34, 49,105, 12, 35,165, 86,231, 65,240,118,122, 15,
+ 64, 77, 0,241, 12, 67,126,210,102,251, 30, 5, 46, 91, 43,122,221,179,172,189,190,236,236, 85,163,186,141, 39,234,197, 23,202,
+ 90, 49, 12,169,207, 16,184, 1, 36, 61,191,232,153,234,168, 83,211,102,199, 98,249,146,111,176,118,235, 97,100,228, 25,224, 98,
+123,138,163, 63, 47,194,231, 75,127,131,222, 88,122,175,134,242,252, 72, 73,198,232,101,195, 85,252,119,241,231,150, 46, 93,218,
+231,165,188,233, 83, 74,158,189,242,185,226,239, 47, 91,182,108,201,115,255,215, 57,106,178,158, 25,173,226,131, 42,199,108,213,
+246,242,171,242,199,209, 35,135,220, 10, 52,102,136, 5, 92, 84,174, 22,132,249,235,143,122,189,211,212, 19,185,102, 23,236,222,
+188, 34,223,160, 83,239,117,168,176,240, 14,110, 33,145,203, 78, 30, 58,120, 24, 53, 42,123, 11,118, 93,205, 79,186,155,168,127,
+ 22,234, 85, 41, 82,132,213,156,117,188, 65, 3, 7, 74,207, 95,184,248,137, 6, 40,209,104,113, 25,110,165, 45, 59, 14,122, 59,
+ 73,248, 96, 24, 64,173,183, 98,226,123,131,223,252, 49, 70, 88,238,248,177, 99,192, 20,153, 44, 85, 94, 22,190,156,245,129, 65,
+102,137,123,152,154,156,154,222,181,239,231,231, 85, 26,198, 48,108,244, 7,183, 31,198, 46, 45,208,233, 94,111,145, 31,163,201,
+ 6,163,153, 69, 66, 66, 60, 62, 29,211, 13,124, 46, 7, 92, 46,107,239, 44,109, 45,253, 98,212,100,196,230,195, 87, 48,100,231,
+202,105, 91,252,125,188, 61,228, 50, 9,145, 75, 69, 76,253, 58,181, 4, 45, 91,182, 22, 86, 11, 14, 21, 92,125,164, 71,170, 66,
+143,196, 12, 37, 68, 62,141,120,195, 59,191,131,157,107,102,116,204, 79,189,195,193,171,157, 20, 95,224,236,165, 27,125,183,110,
+ 90, 45,202, 46, 52,227,113,170, 6, 89, 5, 6,100, 22, 24,145,149,111,128, 92,194, 71,251,126,147, 68, 39,142,254,212,183, 75,
+187, 22,235, 94,231,184, 19, 19,147, 78, 36,167,103, 14, 13,109,220, 28, 59,127,253,165,157,171,107, 53,231,194,194, 36,149,163,
+185,179,104,209, 34,225,178,101,203,120,235,215,175, 87,181,108,217,210,119,206,156, 57, 61,114,114,114,110, 85,173, 90, 53,248,
+204,161,237, 23, 26,181,239,223, 12,172,217,171, 93,135, 78, 2, 17,203, 67,120, 88,152,121,223,222, 93,121,122,189,122, 74,153,
+134, 67,234,178, 40, 91,195,192, 43, 32, 32, 90, 46,180,117,227,113, 10, 99, 11, 78, 79,223, 81, 0, 28,170,209,243,163,115, 23,
+239,196,196, 54,141, 72,246,190, 16,241, 36, 39, 95,103,174,157,112,250,243, 50, 11, 94, 46,195,128,207,229,192, 73,194, 3,167,
+168, 84,149,251,135, 62, 1,195,120, 21, 71, 78, 25, 48, 69,239, 0,195, 32,163, 32,245,158, 3,125, 54, 24,194, 18, 32, 38, 77,
+ 11,141,193, 30,154,175,228, 41,133, 34, 59, 13, 27,215,109,199,221, 59,183,209,253,157,126,216,176,101, 23, 38,190, 55,212, 80,
+ 94,237,135,195, 41,138,104, 61, 23,205,146, 75,120, 0, 24, 20,106, 45, 56,248,251, 83,212,172,206,113,248,193, 0, 0, 78,114,
+ 41,148,106, 61, 56, 2, 39,196, 71,156,148,158,186,120,115,206,220,133,171,191, 40,200,140, 76,125,242,224, 42,130, 61,149,168,
+ 30, 96, 70,116,150, 51,238,228, 85, 67,112, 80, 13,112, 4,183, 29,210,206,141, 14, 89,126,148,115,176, 79,211, 70,245, 90, 85,
+241,118,133,222,100, 43,138,106,113,241,203,182, 29, 72, 78, 74, 27,159,247,240,232,221,183,225,104,181, 57,137, 10,145,119,208,
+135, 15,110,158, 79, 28, 56,242, 67,248, 5, 84,110, 88,152,122,207,225,110, 11,142,236,179, 57,104,180, 4, 82,215, 57,159,126,
+245,221,244,238,189,135,224,198,213,243,184, 23, 29,143, 22, 45,154,225,157, 1,195,161, 86,229,215,217,191, 99, 77, 55,171, 78,
+125,134, 39,178, 78,111,222,186, 51,195,218,108,136,123, 28, 21, 95,146,150, 62, 51,230,222,245,204, 24,231, 23,154,167, 60,235,
+ 52,148,187,184,223, 51,154,109, 72, 79, 79,195,181, 63, 46, 53,214,103,198,220,171,200,249, 18, 9,184, 8,191,155, 3,179,133,
+133,217,202,162,125,135,110, 38, 1,199,216,110,241,234,109, 45, 51, 51, 50, 57, 50,103, 79,214, 61,160,174,192, 79,100, 54,222,
+ 79, 80, 10,204, 22, 22, 53,252,101,101,106,122,249, 7, 45,153, 49,227,211,186, 92,129, 4,106,173,209,148,153,145,238,187,121,
+247, 69,205,163,199, 15, 2, 42,121,187, 56,127,183,230, 39,129,202,192, 32, 71,105, 68,190, 90,197,140,156, 60,211,127,235, 15,
+ 75, 71,149,101,180, 74,232, 46, 82,253, 68,248,213, 58,110, 78, 2, 70, 99,176,178,121, 42,179,109,228,128, 55, 27,116, 89,100,
+178, 38,173, 94,181, 70,122, 55, 65,141,251, 9, 74,136, 5, 92, 8, 5, 28,152, 44, 44, 28,188,157, 56,190,222,190, 83, 90, 55,
+ 13,193,153,123,185,224,114, 57,208,171, 11,116, 60,228,197, 54,237,216, 93,218,164,121, 75,116,234,216, 1, 79, 98, 99, 42,135,
+ 29, 59,216,229,250,181,203, 89, 86,115,237,105, 90, 69,236,225, 10, 5, 22,116, 58,174, 69,232,251,190, 95, 64,213, 54,131,134,
+191,239, 82,165,114, 0,227,237,233, 1, 43,225, 97,210,123,131, 29,190,243,237,198, 28, 88,182,112, 14,140, 70, 19,188, 92,133,
+ 32, 4,216,182,110, 62, 76, 38, 19,252, 61, 68, 80,106, 75, 95, 77,174, 60, 63, 82, 90, 20,170, 66,125, 79,158, 51, 99,101,237,
+103, 24, 38,108,246,236,217, 95, 2, 32,179,103,207,254,178,120,123,233,210,165,122, 0, 25,229, 52, 29,110,126,193,104, 21, 31,
+ 92,233,119,183, 32,216,211,195,239,122,248,153,211, 46, 71,238,179,184,113,248, 14,122,183,240,131,128,199,129,212,197, 31,247,
+147,148, 56,113,104, 83,225,209, 61, 63,165, 27,141,198,239,203,111,107, 14,106, 42,151,202,206,252,186,115, 47,235,233,225,193,
+217, 24,174, 72,200, 83, 91,159, 53,105,197,222, 60,198,222, 57,179,217,143,128, 57, 45, 22,139,131, 76, 38,147, 91,121, 25,187,
+ 45, 60,165,168, 19, 47,243, 54,202, 86, 48, 92,174,109,231,174,157,240,116, 22,194,104, 97, 49,251,139,143,245, 99,186,203, 11,
+ 71,190, 59,188,115,167, 94,211, 47,240,101,181,206,183,110, 92,139, 52,106,212,168,144,203,229, 58,212,149,194,219,219,123, 62,
+135,195, 25, 33, 20, 10,157, 76, 38,147,218,196, 26,164, 90,131, 9, 6, 51,160,211, 25,192, 23,216,205, 34,159,203, 64,111, 48,
+ 65,167, 55,149,125, 99,100, 69,253, 14,160,182,234,185,152,210,249, 71, 53,132,191,237, 63,250,241,144,119,135,205, 13,104, 56,
+ 64,158,148,169,132,128, 49,163, 89, 93, 63, 92, 60,125,152,164, 37,199,126, 90,158,201, 2,128, 28, 69,126,160,151,151, 15,238,
+ 38,106,144,158,167, 71, 86,145,201,202, 44, 48, 66,173, 87, 35,180,138, 63, 10,149,202,192,215, 62,191,192,225, 51,103,206, 12,
+237,213,127, 24,166,127,177,160,237,207,155, 86, 68,202,132,252,113,218,236,184, 75,142, 24,173,168,168,168,252, 89,179,102,213,
+220,178,101, 11,103,212,168, 81,250,144,144, 16,241,232,209,163,219,238,216,177, 67, 44,149,138,245,247,175, 30,155, 59,225,163,
+217,253, 55,175, 93,212,176,160,160,128,177, 90, 44,167,204, 5, 5,179, 53,229,152,185,167,199,190,124, 60, 47,193, 60,182, 91,
+ 59,175, 99,238, 82, 78,125, 17, 49, 13, 71,221,249,123,241,104,190, 57,225,244,122,181,100,232,202,143, 50, 10,217,175, 12, 28,
+239,197,229,153, 44, 0,224,112, 25,152,172, 54, 56, 73,248,224,112, 56,197, 38,222,239,151,189,167,164, 94, 46, 66,240,185, 28,
+240,184, 12, 84, 58, 11,114, 85,102,124,248,190,163, 51,132, 16,214,106, 35,208,155,172,208, 21,213, 14,213,170, 92,204,249,226,
+ 51,188,211,119, 32, 38, 76,249, 12, 5,122,224, 78,162, 26,102,139,165,220,155,130,195,112,160, 51, 90, 49,174,123, 21,228,107,
+204,208,234,173, 48, 89, 89, 72,133, 60,240,121, 28,200,196, 60, 56, 75,249, 0, 33,130,226,194,132,207,231, 27, 44, 22,203,206,
+ 50,106,244,168, 22,232, 3,189,133,131,230,195, 86,160,107,171,218,136,254,253, 32,239,242,141, 7,213, 63,249,226, 43,124, 60,
+177, 47, 14, 60,174, 9,119,239, 42,144,203, 36,176, 16, 14, 0,226, 96,135,189,249, 44,199, 60,112,196,143, 91,182,197,124,251,
+205,108,113,161,150,129, 72,192,197,133,243,231,112,253,230,157,181,185, 15,143,238,196, 91,132, 79, 56, 62,206,206,206, 16, 11,
+185, 48,153,141, 38,199,187, 46, 16, 16,160,177,204,187,246,143, 69, 53,254,198, 54, 22, 37,236, 43,223,104,241,196,206,179,167,
+125,241,237,146,238,189,135, 32, 60,236, 0,246, 31,216,107,107,213,115, 60,119,215, 47,155,208,182,107, 63,180,237, 62, 12,167,
+ 14,239,248, 76,203, 50,245, 38, 77,159,187,176,125,231, 94, 8, 63,113, 0,217, 89,105, 43, 29, 77, 47,151,207, 76,239,220,173,
+ 47, 12, 38, 27,218,117,233,131,211,199, 15,127,132,162, 65, 22,142, 63,196, 94, 42,159,193,177,126,246,233,116,126, 78,161,137,
+175, 80,153,144,166,208, 33, 41, 91,135,163,123,126, 38,142,151, 23,166,102,237, 67, 43,241, 39, 45,191,240, 52,176,146,159,145,
+111,212, 75, 98,227, 19,234, 76,120,127, 12,191,122, 80, 29, 78,142,210, 8,133,210,136, 92,165, 17, 26,131, 21, 65,149,106,113,
+ 44, 86,166, 85, 69,243,217,211, 69,200,223,112, 60, 17,206, 50, 62, 90,215,121,253,129,182, 44,203,254,105,178, 86,219, 77, 86,
+100,162, 18, 34, 1, 23, 34, 1, 7, 34, 1, 23, 86, 27,113,168,226, 34,241,174,221,235,195,105, 31,248,155,172, 64,158,210, 4,
+ 30,151,129,183,167,155,172, 89,195, 17,216,182,226, 35, 0,192,196, 89, 27, 49, 97,220,104,212,173, 31,130,194,130, 2,223, 17,
+ 67,122,173, 6,112,216,209,180,158, 12,191, 84, 57,252,202,221, 89, 31,206,152, 39,127,183,111, 39,238,189, 4, 37, 50,243,141,
+136,143, 85, 87, 40,242, 6, 0, 86, 27, 11, 2,130,237,123,195, 32, 17,242,160, 80,154, 65, 8,193,162,245,251,224, 36,225, 35,
+179,192,222,220, 95, 22,101,250,145, 50, 34, 82, 21,136, 54,246,129,189, 47,151,151,163, 17,173,165, 75,151, 70, 47, 93,186,180,
+196, 8,217,115, 38,235,245, 22,149, 22, 8,100,117,156, 61, 60,111,132,159, 62,233,116,248,190, 13, 23,239,231, 97, 72,187, 74,
+208,228,167,226,251, 47,222,205,103, 64, 76, 28, 46,183,208,168,215, 29,210,235,181,139, 1,152,203,188,104,124,107, 55,150,137,
+229,231, 54,108,254,213,234,233,237,141,157, 87,243,211, 10,180, 86,203,159,205, 86, 22,230,206,153,205,213,173,172,165,167, 33,
+251,201,237,242,106,226, 44,129, 96,233,166,163, 0, 8, 88,150, 5, 97, 89,240,197,114,153,103,141,150,217, 69, 5,157,152,199,
+ 97, 12,207,151, 0,132,181,166,229, 38,150, 29, 6,101, 0,184, 72,249,216,123, 57, 29, 0,178,185,234,136, 71, 35,223,181, 55,
+ 23, 26, 76, 98, 85,253,154, 53, 73,179,102,205, 10, 37, 18,135,166,191,226,250,248,248,220,154, 59,119,110,157, 9, 19, 38,136,
+132, 66, 33,172, 86,171,251, 79,155, 55,179,155, 23, 79,196,160,143, 54, 64, 32, 20, 65,111, 48,131,207,231,161, 64,169, 65,161,
+ 74, 7,181,206, 82,241, 43, 40, 33,193,164, 0,150, 31, 57, 44, 28,216, 67, 30,218, 92,200, 17,160, 73,176, 31, 46,158, 57, 66,
+110,156,222, 54, 81,159, 19,251,171,131, 23, 34, 52, 6, 11, 50,242, 12, 72,207, 51, 32,171,192,128,172,124, 35,178, 10, 12, 96,
+ 24, 6, 6,147,245,141, 30, 92,218,156,152,253, 59,127,221,218,207,104,198,240,246,221, 7,226,179,121, 27,170,236,252,113,217,
+185, 68,194,105,227, 96, 71, 91, 91,116,116,116,242,251,239,191,223,112,247,238,221,220, 6, 13, 26,232, 31, 61,122, 36, 45, 50,
+145,102,185, 92, 42,249,249,135,165,103,154, 55,111,190, 39, 61,246,241,133,162,246,244,114, 11,246, 42, 29,198,138, 36,230,187,
+147, 42,203, 90,247,168,225, 43, 69,101,153,186, 71, 29,249,253,239,243, 58,127,188, 68,113, 97,109, 78,166,209,122, 86,161,231,
+ 54, 74,215,240, 29,234,131,103, 49, 26, 82, 6, 13, 25, 14, 46,195,129,217,160, 75, 41,190,184,188, 93,132,152,191,235, 49,228,
+ 98, 62,156, 36, 60,200, 37,124,180,173,231,142, 10,148,103,196, 98, 99,161, 51,218,160, 55, 90, 97, 48, 89,225, 25,232,134, 45,
+ 59,247, 35, 53, 71,143,163,183,115, 17,147,162, 70,173, 74, 50, 16, 82,126, 49,201,218, 44,218,190,131, 71, 57,113, 57, 12,184,
+ 28,134, 83,175, 78,109,228,107,204, 16,240, 56, 16,136, 37,144,137,120,112,150,240, 33, 16,240,145,147,147, 3,163,209,136,202,
+149, 43,139,203,182,130, 4, 78,114, 9,106, 85,247,135,217, 98,197,201, 43, 15,177,248,211, 65,232,214,190, 41, 24,190, 28,143,
+141,141,225,228,238, 4,150,195,129,217,202,194,100,182, 1,224, 24, 74,211, 11, 12, 12,236, 44,147,201,100, 58,157, 78,157,154,
+154,122, 41, 43,230,112,170,141,219,127,210,233,240, 11, 59,251,188,211, 13,119, 35,163,113,224,240,177,171,185, 30,202, 25,197,
+223,169, 95,191,126, 75, 79, 79, 79,121, 94, 94,158, 42, 42, 42,234,214,235,214, 11, 8,135,243, 73,171,182, 29,161, 41,204, 65,
+246,211, 36,135,107,209,117,171, 56,225,235,165, 27,154, 4,215, 14,110, 98, 35,118,227, 85,175,178, 19, 62,159,183,174, 73,205,
+ 90,181,155, 20, 15, 8,169, 91,185,236,105,217,120, 82,167,238,239, 77,248,108,105,191, 33, 99,113, 33,252, 24, 86, 45,254, 98,
+167,204,197,171,174,187,155, 75,163, 6, 45,187,227,234,185, 99, 16, 59,249,194,205,195,183,237,168,113,211,186, 14, 25, 53, 25,
+215,175,158,195,218,101, 95,238,176, 25,213,191, 57,146, 86,153,119,117,175,134,141,155,143,116,114,247, 65,161, 82, 13, 39, 55,
+111,212, 13,109, 54,242,225,125,227, 44,109, 78,162,226,181, 77, 7, 33, 48,154, 9, 10, 52,102, 60, 85,232,145,156,101, 55, 90,
+ 44, 91,129, 62, 65, 54,150,145,139,121, 60,119,203,147,202, 15,206, 93, 32, 85, 2,125,152,229, 11,191,224,154, 33,134,162,208,
+110,178, 20, 42, 19, 20, 74, 19, 52, 6, 11,220,101, 60,176, 54,182,194,181,238, 2,141, 25, 78, 82, 62, 92,164, 2,135,163,140,
+ 37,177,233,151,189,193,247, 99, 51, 6,172, 90,181, 70,122, 47,241, 57,147,197,183, 71,179, 68, 2, 46,108, 44, 11, 56,112,199,
+243,121,252,233,253,123,117,197,211, 92,189,125,212, 50,135, 65,173,144,230,240,148,176,232, 50,108, 54, 0,160,111, 47,123,215,
+182,196, 76, 45,142,223, 80, 0, 47,118,236, 46,187, 44,214,235,185,155,119,157,248,100,255,190, 61, 46, 6, 27, 15, 63,157, 74,
+134,206,104,133, 88,192,133, 72,192,133, 68,192,125,161, 63,118,249, 70,203,222,231, 46, 53,215, 2,157,193, 0,149,222, 2, 2,
+224,214, 19, 13,244, 38, 43,148, 90, 11, 90,214,113,123,179, 64, 8,195,156, 32,132,244,126,217, 16,189,108,150,158,139, 72,149,
+164,113,251,121,141,226,207,151,102,228,158,239,179, 5,160, 66, 35,184,120, 47, 59,199,231,183, 5, 50,183,186, 46, 78, 46, 55,
+ 78,159, 10,147, 31,190,207,226, 82,164,221,100, 89,244,185, 88, 57,107, 68,154,170, 48,183, 19,128, 4, 71,127, 76,234, 89, 55,
+ 84, 44, 20, 93,248,110,205, 79,102,111,159, 0,246,208,141,194, 28,165,206,246,130,155,176, 25,141, 28,194, 18,129, 33,251,137,
+ 67,109, 8, 28, 14, 99,158,247,209, 64,176,132, 96,254,154,253, 88, 50, 99, 24,228,146, 81, 82,134, 97,164, 90,131, 21,159, 46,
+216,138,149, 95,143,119,146,138,120, 96, 24,123,159,168,247,134, 15,116,236, 2, 52, 88, 17,127,115,183, 70,157, 24,246,232,249,
+230,194, 22,109,223,185,211,162, 69,139, 66, 55, 55, 55, 72, 36,146, 63, 35, 21,165,224,227,227,243,245,188,121,243,130,167, 76,
+153,242,108,178, 79, 30,143,135, 15, 63,248,128, 99,179, 17,156, 58,181, 13, 94, 85, 27,227,216,217, 27,232,217,185, 25, 52, 58,
+ 3,242, 11,213, 96,193,125,237, 11, 81, 93,152,123, 33, 43,249, 65,243, 54,157,250,226,210,153, 35,228,198,169,159, 39, 86,100,
+142, 30, 55,119,183,167, 17, 15,226,235, 50,140,187, 61,162, 85,100,178, 76, 22, 22, 85,124,164,120,154, 28, 15, 87, 23,151,167,
+142,234, 73,188,130,251, 51, 28, 50,133, 1,217,166,205,142,219, 15,128,104, 51, 31,141,216,255,219,230,200,232,168,123,139,251,
+140,156,206,235, 62,228, 3,238,143, 75,167,125, 9,192,209,137,247,204, 49, 49, 49, 15,199,143, 31,223,250,250,245,235, 54, 0,
+ 58,134, 97, 44, 92, 46, 87,106, 50,153, 4,157, 58,117, 82, 62,126,252,248, 50, 74,238,180,248, 2,109,223,223,239,201,136,212,
+239, 8, 89,243,136, 42, 78,234,110,157,218,181, 66,171,250,129,120,218,174, 21, 0, 76, 79,209,200,131, 13, 53,183,238,181, 88,
+ 37, 39,127,252,229,248,146,137,195,186,126,186,147, 55,127, 85,102,216,252, 50, 59,162, 62,125,116,185, 71, 73, 54,158,199,229,
+192, 73,194,135, 92,194,131,147,132, 15, 39, 49, 31, 22, 43,169, 72,205,145, 88,172,172, 61,162,101,178, 66,163,183,226,194,189,
+108,100, 41, 77, 40, 84,155,161, 55,219, 64, 64,236,181, 81, 7, 74,115,197,147,107,174,197, 79, 82,215,202,141,149,155,215,175,
+112, 62,248,123,218,179, 17,125, 46, 82, 33,156,164,246,209,216, 87,174, 92,129,135, 71,249,181,125,150,101,113,224,244, 45,172,
+218,126, 1,167,183,205,132, 88,192, 69,104,255, 5, 24, 59,160, 5, 88,194, 34, 62, 38, 58,187, 86,189,134, 62, 28,142, 4, 28,
+134,129,209,194, 2, 32,165,158, 79,147,201,228,145,154,154,170, 10, 10, 10,242,245,247,247, 31,194,229,114, 9,212,247,140, 71,
+246,228,235,206,135,253, 38,213,234,141, 54,169, 85,185, 45, 40, 83,223, 27, 65, 65, 96, 24,134, 56, 59, 59, 11, 46, 92,184,160,
+ 9, 9, 9,241,122,205, 91,137, 35,241,174,189,118,194,212, 79,134,212,172, 81, 3,251,127,219, 6, 66,152,131,142,126,121,215,
+241,235, 88, 56,231,197, 17,134,159,207, 91,215,100,229,130,233, 47,236,155, 58,103, 85,153,163, 14, 37, 34,249,140, 65, 35, 38,
+225,206,173, 63,240,253,130,207,247, 24, 53,249, 99, 45, 86,203,208,252,204,196, 61,213,235,181, 0, 49,171, 17,190,111, 5,134,
+141,158, 40,234,222,103, 8,174, 95, 61,135, 37, 95, 78,221,165, 43,204,121, 31, 14,118,114,102, 9,127, 74,167, 30, 3,248,122,
+163, 25,235,150,127,131,201, 51, 22,163,101,231,190,252,168,123, 55,166, 0,248,214,225,238, 16,102, 27, 58,133,120,218,205,179,
+133,197,177, 68, 46,175,164, 43,144,199,101, 56,141,106,184, 66,111,178, 66, 85, 78,165,146, 39,224,103, 21, 42, 85, 85,127, 88,
+242, 9, 87,107,176, 66,161, 52, 33, 71,105, 68,110,225,159, 6, 43, 87,105,132, 66,105, 2,159,199, 32, 54, 33, 5, 28, 62,175,
+194,253,243, 10, 52, 22, 52,175,237,102,191, 71, 95,179,117,196,194,115,110,113,250,242,253, 65,171, 86,173, 22,223, 79, 82, 35,
+ 50, 81, 85, 20,201,226, 66,196,231, 64, 88,244,183,141,181,247,141, 44, 11,103,175, 26,213,199,188, 55,170,139,179, 92,130,140,
+184, 28,240,184,246, 41, 98, 92,188, 3,225, 34, 50, 96,218,212, 73,240,244,112, 69,106,174, 17,107, 15,199, 34,242,225, 19,176,
+250,138, 29,246,186,159,246,244,156,240,225,231,174, 28,190, 16, 59,206, 36,217,211,201,181,225,241,141,227,134,140,248, 7, 90,
+141, 42,143,128,216, 28,236,131,204, 16,171,205,126,185, 45,153, 63, 27,123,182,111,196,153,136,156,103, 87,224,239, 7, 87,226,
+147, 57,139,144,171, 50,161,164,235,178, 44, 63, 2, 64,241, 92, 36,234,149,237,231,204, 81, 73,219, 76,209,182,169, 20, 13,211,
+ 75,230,202,244,210,126,211, 75,122, 37,205,253,183,185,220,166,195, 87, 76,145,171, 87, 3,169, 88,246,199,169, 83,199,101, 71,
+ 34,201, 51,147,101,214,229,146,197,211,251,166,169, 10, 21,221, 43,100,178,188,106, 53, 16, 73, 69,151,231, 46, 90,107,244, 9,
+168,106, 61,121, 79,149,167, 54,216,172,175,246, 65,144,217,100, 46, 94, 6,158, 80,180,138,175, 55,125,147,155,251, 72, 91, 94,
+228,137, 37, 4, 97, 55,179, 64,136,189,138,180,239, 74, 58,138,106,230,176,177,246,102,149,179,247,114,192, 43,234,135,226,104,
+248,123,211, 79, 27, 85,189, 67,148,218,145, 75,230, 63,107, 46,108,217,208, 30,201,114,118,118,134,171,171, 43,228,114, 57,202,
+107, 58,100, 24,230,189, 9, 19, 38,188, 82,251,207,201,201, 65,215, 46,157,176,126,227, 22, 52,236, 50, 6,103,175,157,129,217,
+194, 34,180, 94, 13, 84,245,119,195,211,108,245,107,221,232, 50,159,224, 15,155,119, 26,240,101,219,206,125,113,225,244, 33,114,
+227,244, 47,147, 42, 58, 17, 98,239,174,173,143, 47, 92, 56,191,250,220,197, 63,136,156,196, 60, 60,210,152,192, 97, 24, 84,241,
+145,194, 67,198,193,165, 35, 59, 12,195,250,182,118,120,114,188,192,192,128,157, 43,215,111,150,173, 92,182,160,211,157, 8,230,
+130, 38, 35, 54, 31, 0,116,217, 49,203, 31, 3, 15, 43,253, 17,126,178, 97,135,129,240,241,175,209, 45, 49,251,177,195,102, 3,
+128, 46, 33, 33, 33,113,238,220,185,193,203,150, 45, 35, 92, 46,151, 5, 32, 90,179,102,141, 46, 46, 46,238, 30,236, 67,115, 81,
+222,195,166, 75,183,250,159,202,133,182,150,238, 82, 78,253, 26,190, 82,180,170,111,111, 21, 29,214,187, 45, 2, 43, 87, 70, 66,
+150,174, 81,190,142,229,107, 76,220, 26, 27,126,138,188, 93,205,147, 59,209,170, 55, 61, 4,112,180,162,249,195,224,207, 14,242,
+197,209, 44, 39, 9, 31,172,253, 90,169,144,209, 50,154,109,208, 27,109,208,155,172,208,154,108,208,153,108, 96,137,253,158, 96,
+ 24, 6,102, 43, 11,135,170,205, 47, 93,251,206,238,158,168, 81,141,129,179,212,158, 54,231,162,233, 30, 24, 0, 30, 30, 30,240,
+246,246,118, 40, 42,106, 50,219,111,113,147,133,125,214,172,111, 50, 91, 65, 8, 65,108,108,204,204,228,196,196,254, 65,181,130,
+218,215, 11,109,232, 46, 21,113, 0,160, 84,163,165,211,233,108, 78, 78, 78,222,238,238,238,156,244,244,244,103,230, 57,168, 81,
+ 39,235,225, 67, 7, 49,104,208, 64,205,163, 91,247,159, 13,113,215,235,245, 76,155, 54,109,156, 3, 3, 3, 57, 70,163, 81, 85,
+209,108,146,121,213, 30,224,230,225,190,248,189,247, 39,215,238,212,181, 39, 46,158, 15,199,209, 67,187,127,213, 41, 98,195, 29,
+ 21, 9, 14,174,243,202,168,195,154,181,106,191, 50,234,176,106,245, 90,101, 26,173,122,161,205, 90, 16,134,135, 51, 97,251,136,
+129, 99,158, 10,128,181, 25,212,251,246,110,250,250,219, 17, 83,230,212,236,213,111, 4,222, 27, 61, 22, 60, 30, 23,151,206, 30,
+199,202, 5,159,157,208, 40,115,198, 56,210, 77,192, 30,122,171, 43, 8,144, 4,126, 92,185,102, 3, 68,220,184,138,248,216,168,
+232,251,183,175,215, 15, 10,105, 9, 47,255, 42, 31,167,120,114,151,225,209, 35,115,121, 50, 38,131, 33,101,236,152,209,120,126,
+212, 97,171,198,193, 30,204,203, 55, 0, 0,157, 58,199,252,243,138, 79,227,138, 71, 29,178,102, 83, 74,105,186,202, 2,197,129,
+ 75,215,110,206,232,223,187, 39, 39, 87,101,178, 71,176,148,166,162,151, 17,185,197,127,171,140,168,229, 47, 71, 76,116, 4,107,
+ 80,230, 30,172,224,125,105, 24, 59,180,199,195,226,107,151,101, 9, 24,192, 80,225,102, 41,190,243,164,229,223,175, 18,223, 79,
+212, 32, 50, 73,101,111, 42,228,115,237, 6,139,207,121,102,186,236,163,217,203,137, 14, 49,220, 37,227,198, 12, 71,174,202, 12,
+150, 5,120, 92, 78,209, 75,128, 84, 53,131,167,106, 29,114, 11, 20, 72, 76, 78, 65, 97, 86, 60, 56, 28, 14, 60,253,107, 59, 60,
+147,180,141, 8,253,116, 38, 18, 50,164,119,123,222,161, 63, 50, 33, 21,241, 96, 84,103,227,212,222, 21, 10,163, 70,181, 88,175,
+211, 28,114,100, 62,199, 63,187, 32, 48, 10,149,198,224, 35,226,115,177,127,251, 15, 24, 58,118,234, 11,165,239,204,175, 22, 2,
+ 28, 6,249, 5,106, 48, 12,163,168, 88,185,196,220, 46,107,251, 53, 35, 99,111,172, 81,130,217,122,181,162, 80,122,109,148,156,
+ 10, 63,125, 92,246,123,178, 8,183, 98, 50,139, 76,150,130, 93,244, 81,239, 52,181, 50,191, 7,128,216,138,213, 11, 57, 61,134,
+141,155, 17, 93,163,118, 61,227,197, 40, 77, 82,161,214, 82,106, 63,135, 86, 67,230, 70,223, 57,177,190,151,210,146,240,129,204,
+175,158,141,181, 90,151,235, 21,177, 11, 74,105, 58, 20, 46, 88,187,255, 89,179,225,172,101, 59,236,127,219,108,176, 17, 22,132,
+ 5,166,125,189, 9, 86,214, 6,214,102, 3,107, 35,176,216,136,180,188,228,122,251, 87, 61, 84,240,120, 95,157,145,223,190,218,
+ 92,232,234,234, 10, 15, 15, 15,120,120,120,192,217,217,185, 92,163,197,231,243,229, 60,222,139,167, 58, 37, 37, 5,201,201,201,
+112,118,118, 6, 97, 45, 48, 89,128, 6, 45,187,227, 65,124, 20,206,253,126, 15,132,181, 65, 38,175,248, 42, 47, 50,159,224, 15,
+154,117,236,255, 67,231,126,227,113,246,208, 79,228,246,149,227,147,245, 57,177, 91, 29,142,208,219,108,140,197, 98, 65,239,238,
+ 29, 83,238, 70, 63, 57,253,213,140, 41, 61, 91,247,153, 44,106, 21, 28, 0,131,201,134,180,228,120, 92, 58,242,139,161,118,117,
+191, 51, 93,218,181, 72,177, 88, 44,176,217,108,229, 62,200, 13, 38,115, 46,151, 47,145, 13, 31, 62,146,127,251,214,173,131, 50,
+175, 90,251,109, 12,231, 62, 67,216, 80,134,144, 65,161,161,117, 97,182,176,208,233, 84, 5, 21, 61,102,181, 90,157,184,109,219,
+182,234, 99,198,140,145,214,171, 87,143, 31, 31, 31,143,149, 43, 87,230,169,213,234, 68, 71, 53,194,175,196,172,225, 49, 5,113,
+197, 17,173,212,182,173, 48,188, 79, 91,236, 57,241, 59, 46, 93,189,142, 20,141,252,158,198,202, 59,242, 52, 37,195, 88,223, 93,
+117,176, 95,171,170,220,253,219, 11, 14, 70,119,156,253, 46, 33,162,240,220,203,243,181,142,223,220,128, 90,111,129,179,212, 62,
+223, 83,113,100,139,203, 48, 14, 59, 34, 6, 72,188,122, 61,162, 65,211, 90,245,112, 55, 81,137,156, 66, 35,244, 70, 43, 88,150,
+128, 5,129,135,147, 16, 98, 1, 7,169,201,137, 96,137, 57,169,130,143, 10, 69,135,246, 29,120, 0, 3,134, 33, 60, 62,143, 7,
+ 2,251,252,138, 18,137, 68,227,237,237,237, 80, 68,203,108,181, 98, 80,207, 22,104,217, 44, 20,253, 39,219,231,204, 60,255,235,
+108,184,201,249,216,179,115, 43,158, 94, 89,179,179,122,171, 41,225, 81, 15,162, 7, 71,223,253, 99,228, 59, 77, 36,141,124,121,
+ 25,130,210,194,164, 90,173,246, 32, 0,161, 64, 32,232,217,190,125,123,247,131, 7, 15, 22,122,122,122,178, 66,129, 64,209,175,
+111, 31,150, 47, 16,228, 23,127,246,218,181,107,252,201,147, 39, 59, 21, 20, 20,164,102,103,103, 95, 7, 96, 41,187, 34, 24,220,
+ 21, 28,236, 6,195,136,229, 18,105, 74,181,106, 53,252,155,181,108,225, 50, 96,208, 80,136,132, 34,156, 13, 63,141,117,171,151,
+237,211,100, 62, 26, 87,145, 51,249,182, 70, 29,166,165, 38, 37,234,244,198,144, 6, 77, 59, 50, 87,195,143, 76, 55,195,115, 53,
+ 87,100, 94,209,117,208,212,154,137, 25, 26,172, 91, 58, 19,110, 46, 50, 36,197, 63,214,199, 61,122,176,201, 98, 80,205,116,216,
+100, 1,144,230,217, 6,183, 26,221,211,205,104,182,225,202,133, 19, 6,214,202,246,188,126,249,100,124,165,218,205,196, 13,154,
+117,113,203, 61,186,117,144, 14,216, 83,158, 78,250,227, 87, 35,184,196, 84,152,116,254,194, 57, 23,159, 42,245,185, 12, 24,152,
+141, 6, 40, 18,110, 91,117,217,143, 85,170,244, 40,135, 70,225,230, 61,197,215,115,230,125,247, 65,179,166, 77,101, 4,226, 23,
+ 34, 88,197, 6, 43, 87,101,130,167,147, 16,122,149, 2,113,183, 79, 27,116, 10,110,153,243,157, 89, 77, 90,105,110, 78,182,240,
+207,238, 12,177, 45,203,250,124,110, 78,182,208,106,210, 74,203,127,212,113,225, 44, 19,226, 65, 82,250,179,142,239, 34,190,189,
+111,150,144,207,125,214, 79,171,184, 44, 40,135,142, 2,177, 43,210,243, 12, 96, 64,192,218,172,176, 90, 76,221, 61,207,163, 0,
+ 0, 32, 0, 73, 68, 65, 84, 80,171, 84, 72,207,200, 66,118, 86, 54,212,234, 66, 72,229,110,104,208,168, 57,156,100, 98,220,191,
+180, 15,132, 16,135,230, 53,180, 48,252,224,102, 45,219,137,162,146,237,125,177,196,124,130,227,187,151,229,105, 84, 57,237, 52,
+153,113,113, 21, 45,139,173, 54,219,185,200,135,113,245, 43,249, 85, 99,238,197, 43,177,115,203,122,152,138, 34,155, 22,139, 13,
+ 81,169, 90,100,230,235,144,154,240,136,176, 54,219, 57,252, 71,224,149, 30, 0, 4, 47,180, 65, 93,116, 31, 53, 0, 27, 55,110,
+ 66, 66, 98, 50,187,120,122,175, 84,141,186,240,157, 10,152,172,174, 40,154,107, 67,151, 29,179, 92,239,214, 44,237,216,221,124,
+142,222, 68,202,236,224, 35,246,170,130,118,227, 86,158,209,171,243,133, 54,163,142,119,124,231,184,221, 37,105,218, 29, 52, 76,
+139, 63, 31, 6,185,132, 7,134, 97, 80,220, 92,184, 97,225, 36, 72, 69,246,182,101,189,209,138, 81,159,174,194,206, 85,159,129,
+ 0, 24, 49,244,119, 93,105,233,132,125,237,194,105,126,184, 85, 41, 37, 57, 39,189,107,223,207,207, 27,204, 34, 99,159,129, 99,
+238, 52,109,218,180, 80, 34,145, 64, 34,145,192,217,217, 25,110,110,110,112,117,117, 45,247,216, 45, 22,139,198,100, 50,121, 8,
+133, 66,176, 44,139,164,164, 36, 36, 37, 37, 65,169, 84, 66,161, 80, 64,171, 81, 89,111,157,223,207,107,208,170, 23,252,107,132,
+160, 74,173,134,224,115, 25,240,120, 28, 92, 58,182,165,180,116,150,108,178, 58,244,219,208,165,255, 4,156, 61,180,153,220,190,
+114,124,138, 62, 39,118,139,163,121, 84,212,220,115,127,208,160, 65, 33,147, 39, 79, 22,204,155, 49,249,204,137,240, 75,177,251,
+195, 54,247, 45, 40, 40, 12, 36,132,192,213,197,229,233,176,190,173,143,119,106,211, 44,229,252,249,243,236,238,221,187,141, 12,
+195, 60, 40, 75,211, 94, 72,229,252,122,254,220,133,249,237, 58,116,196,214,237,187, 59, 68, 63,124,212, 33, 62, 62, 14,129, 85,
+106,160, 90,245, 90,208, 49,110,184,112,249, 42, 52,133, 57,191, 58,146,206,151,162, 90, 76, 65, 65,193, 31,195,134, 13,235,254,
+251,239,191,115,134, 13, 27,166,203,205,205,189,246, 92, 20,139,148,167,121,253,199,129, 10, 0,191, 86,233, 48,118, 95,186,185,
+240, 99, 0,203, 42, 87,169,140, 75, 87,175,227,250,239, 55, 55,229, 74, 43, 47, 24, 55,234,253, 73, 85,251,113, 39,244,107, 85,
+149,235,237, 38,197,111,155, 87,114,143, 93, 79, 94,149,156,103,219,186,236,242,252,133,142,228,209,179, 7,135,218,140, 54,117,
+221, 97,177, 17,176,196, 94,224, 58,137,249,165, 21,188,175,104,242, 76,162,113, 83, 38, 79,142,111, 16,218,232,147, 81,239, 79,
+ 17, 52,170, 17,136, 91, 79, 10, 1,134,129,187,175, 12,153,153,153,184,114, 96,179,181, 32,253,241, 38, 46,151,253,182, 2,231,
+ 19, 5, 41,247,130,158,219,156,148,155,155,139, 75,151, 46,161,216, 96,121,121,121,149,102,180, 94,208,204,203,206,184,182,240,
+251,159,218, 76,124,111, 32,250,116,172,143,203,183,227, 97, 42,154,175,169,120, 40,121,226,245, 31,133, 31, 15,171, 97,250, 96,
+ 80,109,149,222, 34, 76,254, 58, 73,121, 5,246, 53, 88,217, 82,210,105,202,207,207, 63, 22, 19, 19,211,182, 97,195,134, 85, 79,
+158, 60,153, 31,125,243,204,244,231, 19,241,249,231,159,203, 55,110,220, 40, 37,132, 92, 51,153, 76, 9, 14, 29, 59, 7,191, 69,
+220,185,227, 97,182,176,184,122,243,126,221, 46,109, 26,129, 37,192,237,219,183,177,245,231,173,134, 7,145,247, 86,104,179,125,
+191, 45,195,188,148,120, 62,109,111, 54,234,240,153,102,102,122,242,138,179, 39, 14,236,108,214,161, 47, 70, 78,251,246,219, 75,
+ 39,118,207,111,210,174, 15,167,110,179,238,136,184,126, 1,231, 78,158,254,206,172,201,159,143,242,251,142,148,152, 78,145, 68,
+250, 81,189, 38, 29,144,154,146,140,164,184,168, 95, 13,249, 79, 50, 82,226,185,191,102,164,165, 76,169, 94,191, 13,126, 63,179,
+103,122, 25, 70,171,204,107, 62,208, 75,178,249,100,216,177,225,105,105, 63,250,106,245, 6, 17, 33,196, 32, 18,242,178,228, 28,
+245, 94,149,195,233,124,100, 86,100, 84, 29, 52,116,212,148, 19,235,214,173,230,251,184, 74,145, 85, 96,128, 74,111,134, 90,103,
+ 6,135, 97, 16,228, 47,131, 78,157,143,203, 7,190,183,152, 52, 5,195,128,120,115,105,154, 50,239,224, 69, 5, 79, 46, 76,251,
+124,234, 69, 8, 93, 2,253,171,117,158, 83,102,180, 78,157,126,175,239,231, 83,143, 7, 19, 66,186,200,188,131,213,218,156,152,
+185,165, 29, 59,195,216,239,239,145,157, 2, 97,182,218,231, 31,179,178,128,141,101,139,162,124, 0,121,214,158,207,148,115,236,
+ 12,187,247,196, 53,100,100, 23, 66,111,178,192,104,178,194,108,177,129,195,229,194,213,205, 21,181,170, 53,134,139,171, 51,178,
+179, 50,112,253,252, 49,196, 70, 94,190,198, 16, 44,208, 43,226,206, 59,146, 71, 2,137,107,176,159,191, 47, 39, 83,101,130, 68,
+200,197,189,203, 39,205, 22,147,113,133,131, 38,235, 21,205,194,188,252, 85,159,204,248, 98,196, 47,219,182,251,134, 84,119, 70,
+ 90,174, 30,105, 10, 3,212, 6, 75,145, 17, 99, 97,212,228, 34,242,194,246, 44,155, 65,189, 10,255, 17, 74, 53, 90, 86,179, 65,
+125,240,244, 45,143,217,243,191,231, 62,137, 79,176, 44,250,184,119,154, 94,163,234, 85,225, 72,214,115,252,242, 97,245, 61,127,
+197, 65,188,210, 92, 72, 88,176,132,224,248,205,172,103,205,133,108, 81,207,203,187,241,101, 47, 35,248,252,218,133, 29,123, 77,
+ 63, 27, 25,163,222,165,215,103,187, 60,126,178,162, 0, 0,184, 92,238,179, 87,113,223, 44,131,193, 96, 42,167, 9,101,199,150,
+ 45, 91,102, 77,153, 50, 69,244,244,233, 83,196,199,199,163,176,176, 16, 98,177, 24,167, 79,159,182,128,181,174,136,252,253,112,
+ 82, 76, 68,248, 55,193, 77,187, 87, 10,105,213, 11, 82,169, 12, 60,226,120,103, 76,169,119,237,225, 77, 59,244,251,161,203,128,
+137, 56,119,120, 11,185,125,249,216, 84,189, 34,118,115, 69,207,101, 97, 97, 97, 52,128,184, 21, 43, 86, 52,218,186,117,107,245,
+ 25, 51,102, 36,236,248, 97,254, 58, 0,200,203,203, 3, 0,220,189,123,151, 76,157, 58,213,104, 48, 24, 18, 11, 10, 10, 34, 80,
+206, 0, 8, 0,208, 43,164, 75,182,110, 88,214,224,105,122,230,192, 26, 13,154,195,171,122,115,248, 6,181, 64,129,218,140, 91,
+ 79, 50,144,240,232, 60, 30, 93, 61,112, 82, 39,183,206, 71, 5,231, 55,110,216,176, 97, 32,135,195,169,166,209,104,124,235,213,
+171,215, 80, 38,147,221,109,216,176, 97, 99, 30,143,151,118,231,206,157,228,138,104,165, 92,222,110,172,210, 97,236,218, 20,181,
+ 83,167,132, 44, 93,227, 20,181,211, 93,157,200,229, 51,197,133,181,198, 95,184, 1,171,136, 57, 55,122,255,118,213,193,223, 54,
+175,228,142,154,244,185, 45, 74,233,246, 49, 79, 34, 60, 91,177,112, 53, 39,243,131, 49,253,255,156,222,161, 40,146, 85,244,183,
+ 67, 97,122,165, 50, 82, 9, 96, 86,228, 67,254, 15, 81, 31, 79, 94, 24,218,172,205,232,246,239, 12,227, 88, 5,114,156, 57,252,
+ 35, 73,140,188,176,159, 71,108, 95,233, 29, 88, 13,160,220,230, 32,147,201, 17,147,245,106, 26,159,202, 58,238,223,253,243,216,
+131,135, 15, 45, 29,208,175,191,199,134,175,223,197,247, 63, 29,129, 76, 34, 2, 97, 89,188,219, 41,112,200, 55, 19,234,244, 13,
+244, 17, 7, 28,188,152,118,101,218,234,168, 89, 58,157, 57,214,129, 72, 12,201,205,205,189, 42,151,203, 21,109,219,182,109, 41,
+ 18,137,152,220,220, 92,158,183,183,183,213,197,197,197,148,150,150,166, 51, 26,141, 7, 1, 84,104,218,113,179,133, 69, 82,182,
+ 1, 71, 15, 29,196,253,155,231,241,232, 81,140,250,209,195, 71,235, 25, 30, 89,173,205,142,203, 7, 42, 92,193, 7, 91,226,168,
+ 67, 82,225, 81,135, 54,163,250,183, 29,155, 22,117,214, 25,140, 99, 27,182,238,141,170,117,219,112,204, 22, 27, 30,220,190,136,
+139, 7, 86,127,111,214,228,207,126,147, 60,246,175, 84,189, 22,225, 10,241,199,165, 19, 32, 44,187, 9, 0, 8,203,110,186,251,
+251,201, 41, 45,122, 77,128,187,119,213,134,133,169,119, 25,188,198,236,225, 2, 30, 71,123,234,224, 47,135,147,146,146,240,248,
+241, 99, 60,121,242, 4,249,249,249,248,237,183,164, 10,229,143,174, 32,249,108,236, 67, 78,143,193,239,142, 60, 62,100,248,123,
+226,234,181, 66, 56,193,149,220,224, 33,231, 33,230, 73, 50, 98,239, 68,178, 49,183, 78, 26,204,170,156, 1,250,130,228, 82,141,
+159,212,179,174, 15, 96,155, 93,188,118, 97,171, 86,109,130,191, 88,188,180,165,135,151,119,137,229,120,158, 34, 71, 56,115,218,
+177,224,235, 55,254,112,104,173, 67,214,102,203,155, 52,118, 24,203,181, 47, 20,138,103,113,234,162,179,103,175, 76,217,247, 19,
+214, 90,110, 4,255,253,129,237, 96,101, 89,104,245,102,168,180, 70, 40,213, 6,100,230,228,225,126,100, 36, 46, 31, 63,134,248,
+152,251,137, 22,147, 41,156,195, 97, 14,232,179, 99, 47, 87,172,165,137, 87,221,195,221, 29,137,249, 26,136,133, 60, 36,199,222,
+ 49,106, 85,202, 93,175,123, 29,233,243,226, 50,115,184, 76,247, 97,195,134,159,238,220,163,159, 75,179,214, 93,165,158,206,174,
+ 16,240, 8,226,146, 50, 16,113,237,180, 54,225,254, 21,149,197,164,233,249, 54, 86,125,249, 31,167,252, 81,135,102,163,182,239,
+136,254, 29, 14,113,185, 60, 33,203, 90,141,102,147,113,240,155,152,172,191, 10, 66,108,105, 99, 71, 12,124,161,110, 96,101,137,
+100,196,208, 51,250,231,235, 10, 22, 27,145,142, 24,122, 77,103, 47, 64, 74,239,216,231,231,231,222,187,120,237,194,148,148,188,
+219,249,249,198,139, 0,210, 12, 6,195,107,167, 49, 59, 59,123,225,226,197,139,251,232,116,186, 58, 29, 59,118, 20, 57, 59, 59,
+ 35, 47, 47, 15,225,225,225,150,176,176,176,135, 57, 57, 57,223, 0, 57, 86, 61, 26,255, 26,105, 56, 60, 38,230, 78,248, 55,117,
+154,246,168, 20,210,186,151,227,133,153, 72, 50,177,115,191,241,204,185, 35, 91,200,173, 75, 71, 62,208, 43,226,126,122,131,211,
+106, 54, 24, 12, 55, 13, 6, 67,212, 87, 95,125,213,204,199,199,199,231,155,111,190, 17,171, 84, 42,254,134, 13, 27, 12,185,185,
+185, 89, 42,149,234, 58,202,232, 79,243, 42,119, 45,202,116, 12, 58,117,112, 75, 39,114,112, 75, 55, 87,207,128,238, 46, 94,149,
+106, 22, 42,210, 19,149,138,140,112, 0,231,138, 38,138,172, 16,141, 26, 53,170,193, 48,204, 48, 0, 13,100, 50, 89,144, 92, 46,
+ 23, 17, 66,234, 48, 12, 19,205,178,108,100,189,122,245,194, 30, 62,124, 88,161,201,100, 83, 46,111, 55, 6, 6,183,217,157,175,
+ 99, 5, 38,142, 96,119,202,229,237, 70, 0,200, 57,251,133, 14,192,209,135, 29,103, 13, 58,118, 61,121, 93,116,129,203,116,197,
+165,165,199, 42,154,102,101,218,253,160,183,117,253, 27, 50, 31,166, 1, 24, 27,121, 7, 43, 31,220,189, 62,143, 33,224,219, 96,
+ 93,164,207,121,114,231,109,232,243,249,124, 67, 64, 64, 64,137,163, 11, 69, 34,145,193,104, 44, 43,128,114,217,170,201,196, 86,
+160,195,246, 67,251,182,143, 61,114,236,232,210,246, 93, 6,120,136, 43, 85, 66, 53,111, 6,219,103, 55,153,126,254,174,226, 86,
+191, 47,174,108, 76,200, 48, 68,162,130,253, 97, 52, 26, 77, 44,128, 2,141, 70,211,159, 16,242,148, 97,152,192,130,130,130,123,
+ 22,139,229, 65,133, 13, 1,139,145,173, 90, 53,255,141, 97, 24, 30,177,178,203,175,243,185,187, 13,153,143,210,240,134,203,146,
+132, 84,115,198,167,223,172,109, 82, 51,168,118,147,226,181, 14,235, 87,117,194,228, 89, 43,155, 84,173, 94,171,201,159,235, 31,
+150,219, 77,128, 88,116, 5,227, 14,253,188,252,202,221, 27, 23,191,244,244,171, 90, 53, 43, 45,225,209,211, 39,247, 22,218, 12,
+170, 67,111,154,207, 73, 79,162, 87,111, 93, 49,107, 70,102,122,226, 86,157, 34, 46, 10, 0,116,138,184,168, 71, 17,248, 58, 55,
+ 43,109, 70, 94, 78,194,138,215, 61, 23, 90,173, 54, 99,215,174, 93,174,109,218,180,225,248,248,248, 64,161, 80,224,226,197,139,
+ 44,203,178,233, 21,214,202, 79,188,168,205,103,220,127,253,233,135,229, 2,153, 83, 47,171,213,234, 79, 8,192,227,241, 50, 77,
+ 58,213,105, 53, 71,246, 5, 10,146, 13,101, 63, 51, 88, 6, 0,167,120,237, 66,150,101,153,229,235,182, 39,243,197, 78, 37, 78,
+134,104, 49,168,165, 44,203, 58,188,214, 97, 97,106, 68,205,183,117,127, 51,132, 44,104,216,180,229,151, 22,139,217, 80,116,127,
+ 24, 0, 24, 8, 65, 30,135,195, 92,230,178,150, 51,170, 55,168, 76, 49, 12,156, 9,195,131,147,132, 7, 6, 12, 52,202,124, 82,
+145, 62, 89, 37, 26,226,156,216,104, 93, 78,135, 42,167, 76,251,198, 92, 56,123,114,168,205,102,171, 86, 20, 51, 72, 50,234,181,
+251, 53,153,110,191, 2,119,172,248,247,115,162,216,108, 49,127,241, 15, 57,212,140,242,191,164, 25, 92, 93,210,191, 82,128,207,
+152,164,228,156, 91, 9, 79,117,191,226,197,101,117,222, 36,157, 92, 31, 31,159,175, 25,134, 25, 45, 20, 10,229, 38,147, 73, 75,
+ 8,217,145,157,157,189, 16,175, 44,254,219,152, 47,241,214,143, 17,138,165,115,205, 6,237, 31,186,156,216,145,229, 29,187,212,
+171,118,119,177, 76, 54,203,160,215,238,208,101,199,110,127,203,231,211, 69, 36, 18, 53,150,203,229,252,220,220,220,155, 0,148,
+255, 75,249,222,176, 97,195,202, 28, 14,167, 26,203,178, 62, 0, 92, 96, 31, 21,146,203,227,241,210,139, 34, 90,164,162,154,109,
+223,223,239,217,165, 91,253, 79,195,175,196,172, 41,106, 86,124, 70,192,144, 85,226,209,189, 58,125,254,235,161,163, 37,141, 58,
+252,199, 93,243,255,127,154, 29,120,114,191,220,177, 28,161,203,162, 46,193, 6, 93,110, 70,250,212,171, 15, 20, 55, 1,168,223,
+ 36,157, 2,129, 96,148,217,108,150, 8, 4, 2,189,217,108,222,245,191,114,236, 18,239,224,241, 28, 16,135, 87,166, 96,193,220,
+121,105,208,202,191,229, 90,226,134,132,132,180, 19, 8, 4,149,109, 54,155,212,100, 50,233,244,122,125, 82,114,114,242, 31, 40,
+125,225,243,191, 52,157, 50,239, 90,171, 5, 2,209,199, 0, 96, 54, 27,215,106,115,226, 62, 45,235,139,101,124,254, 31,157, 71,
+158,213,154,198,241,184,124, 47, 20, 77,204,205, 90,173,138,236,196,219,181,254,198,116, 82, 94, 51,115,169, 38,213,164,154, 84,
+243,101, 56,244,124, 82,205,191, 83, 83,236, 87, 55, 80,236, 87,215,225, 73,151, 75,249, 60, 61,159,148, 98, 38,149,240, 2,224,
+192,132,165, 20, 10,133,242, 23,192,210, 83, 64,249, 59, 49,100, 62,122,250, 87,126,158,242,159,163,212, 62,209, 76, 25,174,180,
+ 34, 33,193,215,113,182,231,168, 38,213,164,154, 84,147,106, 82, 77,170,249,159,211, 44, 79,251,159,216, 36, 57,233,165,237, 19,
+ 0,254, 95, 58,252,211,176, 42,213,164,154, 84,147,106, 82, 77,170, 73, 53,255,107, 60, 51, 94, 28,122, 46, 40, 20, 10,133, 66,
+161, 80,254, 26,104, 31, 45, 10,133, 66,161, 80, 40,148, 55,163,164,166, 67,106,180, 40, 20, 10,133, 66,161, 80,222, 2,165,118,
+134,167, 77,135, 20, 10,133, 66,161, 80, 40,111, 70,113, 68,203, 15, 47, 77,239, 64,141, 22,133, 66,161, 80, 40, 20,202,219, 33,
+ 19, 37, 69,183,194,194,194, 72, 73,127, 83, 40, 20, 10,133, 66,161,252,127,240, 15,247, 34,207, 71,178, 38, 21,109, 3,120, 46,
+162, 69, 13, 22,133, 66,161, 80, 40,148,255, 21,179,245, 15,163, 56,146, 85,252,202,124,197,104,245,233,211,135,161,102,139, 66,
+161, 80, 40, 20,202,223,197,191,209,139,112, 94, 62, 64,154,205, 20, 10,133, 66,161, 80,254, 78,179,245,111, 58, 30, 58,189, 3,
+133, 66,161, 80, 40, 20,202,155,225, 7,160,247,115,219,255,111, 75,240, 80, 40, 20, 10,133, 66,161,252,219,153, 84,218, 54,141,
+104, 81, 40, 20, 10,133, 66,161,188,125,179, 69,161, 80, 40, 20, 10,133, 66,249, 39, 67, 87, 54,167,154, 84,147,106, 82, 77,170,
+ 73, 53,169,230,191,157,226,121,180,128,210,230,209,162, 80, 40, 20, 10,133, 66,161,188, 22,189, 97,159, 63,107, 82,209,123,111,
+106,180, 40, 20, 10,133, 66,161, 80,222, 46,175, 44,191, 67,141, 22,133, 66,161, 80, 40, 20,202,219, 53, 88,155,169,209,162, 80,
+ 40, 20, 10,133, 66,249,139,161, 70,139, 66,161, 80, 40, 20, 10,229, 47,130, 65,233, 35, 7,206, 85, 64,231,117, 70, 31,156,163,
+154, 84,147,106, 82, 77,170, 73, 53,169,230,127, 78,179, 60,237,115,248,231, 81, 60, 51,252, 9,252,217, 17,126,243,255,199, 15,
+211,161,175, 84,147,106, 82, 77,170, 73, 53,169, 38,213,252,183, 51,233,165,247,103,208,166, 67, 10,133, 66,161, 80, 40,148,183,
+107,182,232, 18, 60, 20, 10,133, 66,161, 80, 40,111,137, 82,155, 9,105, 68,139, 66,161, 80, 40, 20, 10,229,205, 40,117, 81,105,
+106,180, 40, 20, 10,133, 66,161, 80,254, 26,195, 69,141, 22,133, 66,161, 80, 40, 20,202, 91, 52, 89,147, 74,252,111, 88, 88, 24,
+161,231,136, 66,161, 80, 40, 20,202,223,197,191,214,139, 20, 31, 24, 53, 91, 20, 10,133, 66,161, 80,168, 23,169, 48,126,248,115,
+180,225,164,162,109, 0,116,212, 33,133, 66,161, 80, 40, 20,202,155,210, 27, 47,142, 60,156, 84,188, 77,141, 22,133, 66,161, 80,
+ 40, 20,202,155, 51,169,204,255,210,102, 67, 10,133, 66,161, 80, 40,127, 39,255, 70, 47,194,208,108,165, 80, 40, 20, 10,133, 66,
+121, 35, 74,138,102,109,166,167,133, 66,161, 80, 40, 20, 10,229,175, 53, 92, 20, 10,133, 66,161, 80, 40,148,191,194,100,253,213,
+ 19,150,210,149,205,169, 38,213,164,154, 84,147,106, 82, 77,170,249, 95, 49, 89,207, 79,241, 0,128,142, 58,164, 80, 40, 20, 10,
+133, 66,121, 83,232,162,210, 20, 10,133, 66,161, 80, 40,127, 17,116, 81,105, 10,133, 66,161, 80, 40,148,255,103,195, 69,141, 22,
+133, 66,161, 80, 40, 20,202, 91, 52, 89, 47,152, 45,218, 71,139, 66,161, 80, 40, 20, 10,229,205, 40,181,143, 22,131,210, 71, 14,
+156,171,192, 15,188,206,232,131,115, 84,147,106, 82, 77,170, 73, 53,169, 38,213,252,207,105,150,167,125, 14,255,124, 38,225,255,
+105,194, 82, 58,244,149,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 53,232,244, 14, 20, 10,133, 66,161, 80, 40,111,219, 88,
+189, 12, 53, 90, 20, 10,133, 66,161, 80, 40,111, 6,157, 71,139, 66,161, 80, 40, 20, 10,229, 47,194, 15,246,168, 86,241,123, 99,
+106,180, 40, 20, 10,133, 66,161, 80,222, 14,189, 97,143,106, 21,191, 83,163, 69,161, 80, 40, 20, 10,133,242, 22, 41,113, 30, 45,
+ 6, 0,194,194,194, 72,209,118,199, 62,125,250, 92,166,231,138, 66,161, 80, 40, 20,202,255, 39,255, 86, 47,242, 44,162,213,167,
+ 79, 31, 6,192, 37,154,213, 20, 10,133, 66,161, 80,254, 14,254,141, 94,132,243,146,147,236, 72,179,153, 66,161, 80, 40, 20,202,
+223,193,191,209,139,240, 94,114,145, 20, 10,133, 66,161, 80, 40,127, 11,255, 96, 47,226, 7,123, 71,248, 19, 69,239, 64,209,148,
+ 15,116, 30, 45, 10,133, 66,161, 80, 40,148, 55,163,120,180,225, 43, 75,239,208, 40, 22,133, 66,161, 80, 40, 20,202,155, 81,210,
+204,240,155,233,105,161, 80, 40, 20, 10,133, 66,249, 11,161, 17, 45, 10,133, 66,161, 80, 40,148, 55,231,249,168,214,255, 91, 52,
+139,174,108, 78, 53,169, 38,213,164,154, 84,147,106, 82,205,255,146,201,122, 97,155,206, 12, 79,161, 80, 40, 20, 10,133,242, 23,
+ 65, 71, 29, 82, 40, 20, 10,133, 66,161,188, 25,197, 35, 14,159,223,166, 70,139, 66,161, 80, 40, 20, 10,229, 45,154,173, 87,160,
+ 77,135, 20, 10,133, 66,161, 80, 40,111,198,164,210,254, 65,141, 22,133, 66,161, 80, 40, 20,202, 95,100,184, 24,148, 62,114,224,
+ 92, 5,132, 95,103,244,193, 57,170, 73, 53,169, 38,213,164,154, 84,147,106,254,231, 52,203,211, 62,135,127, 30,127,219,132,165,
+116,232, 43,213,164,154, 84,147,106, 82, 77,170, 73, 53,255,179,208,166, 67, 10,133, 66,161, 80, 40,148,255, 1,163,229,197,227,
+241,190,148, 72, 36, 27, 37, 18,201, 79, 60, 30,111, 5, 0,183,138,254,160, 76, 38,155,238,235,235,251,216,215,215, 55,173,114,
+229,202, 39,157,156,164,159,212, 16,161, 61, 0,254, 91, 58,158, 96, 0,159, 72, 36,146, 71, 98,177, 56, 25,192, 78, 0,159, 0,
+240,124, 19,225,133,254, 24, 28,245,113,255, 35, 11,253, 49,248,165,127,245,246,241,241,185, 10,160,251,219,202,148,225, 82,116,
+ 29, 34, 67,234, 16, 25, 82,135, 75, 95,191,214,224,228,228, 52,218,207,207,239,186,135,135, 71,186,159,159,223, 53,177, 88, 60,
+164,130, 18,222, 62, 62, 62,223, 7, 6, 6,198,250,251,251,175,129,125,117,242,255, 89,218,137,208,174,165, 8,138, 86, 66,168,
+219, 8,177,177,149, 16,221,186, 1,210,215,148,107, 11,224,128,179,179,243, 61, 30,143, 23, 6, 96, 80,209,245, 53,136,199,227,
+133, 57, 59, 59,223, 3,112,160,232,115,175,115,157,126, 15, 32, 29,192,146,162,237,143, 2, 3, 3,213,161,161,161,201,161,161,
+161,191, 4, 5, 5,189,231,168,152, 84, 42,237, 22, 24, 24,120,176,114,229,202,201,173, 90,181,202, 15, 8, 8,136,169, 84,169,
+210,118,145, 72,212,145, 22,113, 20, 10,133,242,191, 79, 95, 0, 75, 1,172,143,140,140,140, 32,132, 68, 16, 66, 34, 34, 35, 35,
+ 35, 0,108, 4,176, 12,165,135, 16, 95,216,239,225,225,177, 96,209,162, 69,134,204,204, 76,162, 80, 40, 72,108,108, 44, 89, 61,
+119, 22,219,195,157, 71,106,120,185,233,252,252,252,226,171, 84,170,180,167,190,156, 51, 11, 64, 77, 71, 52,159,195, 77, 34,145,
+220,156, 59,119,174,230,234,213,171, 26,147,201,164, 97, 89, 86,147,145,145,161, 57,119,238,156,166, 77,155, 54, 26, 0,159, 2,
+224, 86, 64,243, 25,223,250,227, 50,249,249,107,242,173, 63, 46, 63,191,191, 78,157, 58, 15, 89,150, 37,131, 7, 15, 54, 2, 8,
+168,136,230,203, 4, 0,226,250,206,112, 29, 34, 71,182,117,251, 66, 66, 54,204, 32, 67,100, 72,125, 29, 77,111,111,239,163,211,
+167, 79, 87,165,167,167, 19,163,209, 72, 82, 83, 83,201,228,201,147,149,222,222,222,187, 28, 60,118,143,144,144,144,236,235,215,
+175,179,133,133,133,228,210,165, 75,108,131, 6, 13,178, 29, 52, 91, 93, 95, 74,203,102,127,127,255,147, 21,121,121,123,123,111,
+173,104, 30,181, 16, 33,213, 28,113,145,144,219,225,228,216,224, 86,100,117,211, 74,100,144,187,176,176,173, 16, 31,117, 40,121,
+ 42,147,210, 52,135,118,232,208, 65,251,224,193, 3, 91, 94, 94, 30,121,248,240, 33, 59,113,226, 68, 3,128,232,137, 19, 39, 26,
+ 30, 62,124,200,230,229,229,145, 7, 15, 30,216, 58,116,232,160, 5, 48,161, 2,233,228, 0,216, 54,127,254,124, 66, 8, 33,139,
+ 22, 45, 34,161,161,161,164,115,231,206, 68,163,209, 16, 66, 72, 50, 33,228, 23,171,213, 58,214, 17, 77, 23, 23,151,209,211,167,
+ 79,215,232,116, 58, 82, 12,203,178,164,176,176,144,172, 95,191, 94,235,235,235,123,178,148, 74, 6,109,242,160,154, 84,147,106,
+254,175,105,254,147,241,131,189,159, 86,241,203,225,192,196,136, 89,179,102, 21,155,170, 83,109,219,182,189, 53,118,236,216,136,
+177, 99,199, 70,180,109,219,246, 18,128, 51,119,238,220,137,152, 57,115,102, 4,128, 17,229,100,132, 91,235,214,173, 11,179,178,
+178, 72,173, 90,181, 72,213,170, 85, 73, 86, 86, 22, 33,132,144,219, 67,155,144,243,117, 65,158, 94, 57, 69,194, 15, 31, 32, 19,
+253,120,164,157,159,139,197,207,215, 55,207,211,211,115, 49, 94, 92,147,177,164,204, 29, 88,183,110, 93,117,116,116,180, 38, 46,
+ 46, 78,179, 96,193, 2, 77,231,206,157, 53, 33, 33, 33,154, 65,131, 6,105,214,173, 91,167, 49,155,205,154,173, 91,183,106,156,
+157,157,163, 75, 48, 91,175,109,180,120, 60,222,218,200,200, 72, 18, 31, 31, 79,138,162, 20,165,105,186,184,186,186,246,116,115,
+115,251,212,213,213,181, 39, 0, 23, 0,168, 5,200, 27,186,160,242, 71, 13,107,212, 9, 27,209,181,230,250,174,205,154, 12,113,
+226, 20, 90,126,152, 65,200,224,202,175,101,180, 92, 92, 92, 70,127,242,201, 39,106,163,209, 72,116, 58, 29,209,104, 52, 68,167,
+211, 17,181, 90, 77, 70,140, 24,161, 18,139,197, 3,203,211,244,244,244, 92,120,229,202, 21,107, 86, 86, 22,185,114,229, 10, 57,
+121,242, 36,217,176, 97, 3,235,237,237,189,170,162, 55,160,175,175,239,217,240,240,240,136,187,119,239, 70,220,188,121, 51,194,
+ 98,177, 68,152,205,230, 8,179,217, 28, 17, 22, 22, 22,113,232,208,161,136,189,123,247, 70,152, 76,166, 8,147,201, 20, 97, 52,
+ 26, 35,170, 87,175,126,186,162,121,212, 92,132,167,166,171,199, 8, 89,245, 33, 81,126, 55,149, 20,126,214,139,228, 76,110, 79,
+ 54, 54,171, 68,218, 75,112, 28,175,174,237, 89,162, 38,159,207,191,156,156,156,204,206,153, 51,199, 84,175, 94, 61,229,184,113,
+227, 12, 70,163,145, 16, 66,136,209,104, 36,227,198,141, 51,212,171, 87, 79, 57,103,206, 28, 83, 82, 82, 18,203,227,241,206, 85,
+ 32,157,203,138, 77,214,229,203,151,201,243,104, 52, 26,210,185,115,231,228,208,208,208, 95,170, 85,171, 54,178, 60, 77,185, 92,
+222,127,246,236,217, 26, 82, 2, 22,139,133,168,213,106,146,148,148,196, 86,173, 90, 53, 3,128, 7, 45,204,169, 38,213,164,154,
+212,104,253,101, 76, 42,103,187,228,147, 56,115,230,204, 8, 66, 72,196, 87, 95,125, 21, 81, 20,217, 18, 0,144, 23,189,120, 0,
+134,207,158, 61, 59,130, 16, 18, 49,107,214,172,226,207,148,150, 17,125,247,239,223,111, 94,179,102, 13,241,241,241, 33,190,190,
+190,100,237,218,181,132,101, 89,146, 21,182,139,156,175, 11,242,232,203, 49,132, 16, 66, 98, 23, 79, 35,231,235,130, 36,108,250,
+150,140, 26, 53, 74, 39,149, 74, 71,148,145,185,238, 77,154, 52, 81,235,245,122,205,246,237,219, 53, 82,169,244, 54,128,122,176,
+ 55, 69, 50, 69,105,125,175, 94,189,122,170,168,168, 40,205,238,221,187, 53, 0, 22, 56,120,193,212, 4,208, 73, 38,147, 13,154,
+ 29,192,143, 35, 63,127, 77,102,251,224, 1,128, 6, 0,188,138, 62,227, 63,107,214, 44, 66, 8, 33,129,129,129, 87, 74,209,116,
+ 9, 9, 9,153, 21, 23, 23, 55,207, 98,177,204,187,123,247,238,188,218,181,107,207,233, 87,221,175,213,145, 17,221, 26, 43,191,
+157,218,152,172,252, 44,100,197, 59,205,187,238, 25,214,113,196,251,213, 60,175,142,243, 22,235,222,117,225,170, 95,106, 58,116,
+232,194, 14, 8, 8,184,153,154,154,250,204, 92,169,213,106,146,158,158, 78, 18, 19, 19,201,213,171, 87,137,159,159,223,249,242,
+ 52,125,125,125, 31,166,166,166,146, 77,171, 87,147,193, 13,234,144,246,174, 78,164,131,155, 19,105, 42, 23,107,235, 2, 77, 43,
+106,180,238,221,187, 23, 1, 32, 2, 64, 68, 94, 94, 94, 68, 94, 94, 94, 68, 65, 65,193,179,125, 0, 34,148, 74,101,132, 82,169,
+140, 48,153, 76, 17, 53,106,212,168,176,209,106, 35, 70,155, 22, 98,228,183, 18, 65,223, 55,192, 51, 99,106,117, 79,219,141, 17,
+173, 72,193,135,157,201,154,198, 1,164,173, 16, 31, 57,168,217, 87, 40, 20, 94, 2, 48,163,200,148,143,233,217,179,167,142, 16,
+ 66,122,246,236,169, 3, 48,166,104,255, 39, 69, 38,171,167,131,233,228, 4, 5, 5,105,139, 35, 89, 0,254, 8, 10, 10,210,134,
+134,134,146,208,208, 80, 18, 24, 24,168, 46,210,118,168, 64,171, 89,179,102,172, 94,175,127,102, 0, 11, 11, 11, 73, 70, 70, 6,
+ 73, 72, 72, 32,209,209,209,228,246,237,219, 36, 57, 57,153,236,219,183,207,230,234,234,122,130, 22,230, 84,147,106, 82, 77,106,
+180,254, 82,163,245,242,235, 69,194,194,194,200, 75,187,190,187,115,231, 78,196,236,217,179, 35,202,113,102,147,190,250,234,171,
+226,168,215,210, 50, 30,254, 91, 99, 99, 99,201,152, 49, 99, 72,112,112, 48, 9, 14, 14, 38, 99,199,142, 37, 74,165,146,104,158,
+ 68,145,243,117, 65,110,191,219,148, 16, 66,136,250,209, 93,114,190, 46, 72,196,168,214,228,254,253,251,164, 82,165, 74,225,101,
+252,254,241,107,215,174, 41,118,237,218,149, 5,123,127, 44, 62,128,150, 0,214, 74, 36,146,109,176, 55, 23, 86, 5,224, 86,171,
+ 86,173,124,157, 78,167, 25, 60,120,176, 6, 64,229, 50, 52, 59, 4, 7, 7,199,111,221,186,149,228,228,228,144,252,252,124,178,
+188, 77,109, 66,126,254,154, 44,106, 90,149,221,180,105,147,113,198,140, 25, 90,119,119,247, 48, 0,254,131, 7, 15,182, 18, 66,
+ 72,251,246,237,179, 75, 18,115,117,117,237, 25, 23, 23, 55,207, 96, 48,204, 43, 44, 44,156,151,159,159, 63,239,216,145, 35,243,
+122, 52,168, 61, 70,249,237,212,198, 71, 70,116,107,252, 78,128,219,160, 85,221,155, 77, 73,159, 51, 97,240, 87,173,235, 61, 50,
+ 44,251,248,226,208,234, 62,223,191, 78,110,123,121,121,101, 26,141, 70, 2,224,149, 87,124,124, 60,241,240,240, 72, 45, 79,195,
+221,221,253,171, 79,134, 15,179, 13,172, 26, 64,226,215,204, 37,150,179,187,137,229,228,118,242,228,187,207, 72, 63, 95, 79, 85,
+ 75, 1,103,182,163,233,241,245,245, 61,123,243,230,205, 23,140, 86, 65, 65, 65,137, 70, 75,165, 82, 69,152, 76,166,136,160,160,
+160,211,111,122,213,183, 20,162, 70, 7, 9,247,246,221, 49,237,136, 98,106,103,210,211,133,159,252, 6,114,195, 1, 92, 2, 48,
+170,130,223,227, 0, 88, 86,108,168,190,251,238, 59, 66, 8, 33, 65, 65, 65, 90,188,217, 96, 20,151, 58,117,234, 36, 78,152, 48,
+193, 90,183,110,221,156, 54,109,218, 20,222,186,117,139, 92,190,124,153,156, 60,121,146, 28, 56,112,128, 68, 69, 69,145,244,244,
+116, 18, 27, 27, 75,122,247,238, 93, 8,160, 3, 45, 11, 41, 20,202,255, 50, 37,120,145,127, 60,156,226, 3,235,211,167, 15,243,
+220, 1,186, 0, 16, 55,109,218, 84,177,108,217,178,149,176,207, 5,193,132,112, 49,180,179,132,119,191,179,132,119, 63,132,139,
+161, 69, 17,163,205,139, 23, 47, 94, 24, 26, 26,154, 9, 64, 2,192,183,164, 31, 34,132,180,243,240,240, 64,106,106, 42, 92, 92,
+ 92,224,226,226,130,212,212, 84, 16, 66, 96, 37,128,133, 0, 70,179, 25,122,189, 30, 6,150, 64,207, 2, 42,141, 6,190,190,190,
+ 48,155,205, 53, 74, 73,127,195,119,223,125,183, 70, 72, 72,136, 98,230,204,153, 25,176,247,149,217, 54,126,252,248,179,127,252,
+241, 71,136, 70,163,201,143,142,142, 54, 52,104,208,160, 39, 0,223,184,184,184,209,235,215,175,199,152, 49, 99, 80,198, 67,167,
+ 65,239,222,189, 79, 70, 69, 69,213, 24, 53,106, 20, 46, 93,186,132,229,203,151, 35, 55, 55,151, 0,128,209,104, 36, 54,155,205,
+220,186,117,107,243,154, 53,107,154,183,111,223,254,102,245,234,213,185, 0,144,152,152,248,164, 36, 65,134, 97,106, 87,169, 82,
+ 5, 70,163, 17, 10,133, 2, 81, 81, 81,112,114,113, 65,100, 70,174, 79,199, 85,155,242,190, 60,114,150, 63,188,121,136,251,167,
+221,218, 24,151,132, 95,170, 85,207,223,199,199,100,182,248,198,102,102,103,188, 78,166, 10, 4,130,212,220,220, 92,152, 76, 38,
+232,245,122,168, 84, 42,228,229,229, 33, 55, 55, 23, 25, 25, 25, 16, 8, 4,241,229,105, 56,231,231, 95, 73,188,118,153,217,247,
+227,119,168, 97,205, 7,239,224, 90,240,142,110, 68, 77,147, 2, 63,205,157,236,100,242,240,154,239,236,228, 84,224,234,234,186,
+ 25, 64, 80,121,122,141, 27, 55, 70, 94, 94, 30,242,242,242,224,225,225, 1, 55, 55, 55,184,185,185,161,176,176, 16, 74,165, 18,
+ 42,149, 10,181,106,213, 66,195,134, 13,177, 99,199,142,183,114,113,223, 48, 33,193, 10,219,212,179, 49, 25, 16,200,100,168,238,
+ 38,175,210, 76, 14,247, 50,190,210,153,207,231,239,119,119,119, 15, 7,240, 33, 0, 25,128, 15,221,221,221,195,249,124,254, 0,
+ 0,139, 0,236,170, 96, 50,150,204,159, 63,127, 86, 92, 92,156,244,254,253,251,152, 57,115, 38, 22, 44, 88,128, 39, 79,158,252,
+ 0,128, 45,250,204, 7, 30, 30, 30, 97, 28, 14,103, 11,128, 94, 0,122,250,249,249,117, 41, 71,119,192,140, 25, 51, 12, 77,154,
+ 52,137,125,244,232,209,128,107,215,174, 53,253,236,179,207,148, 41, 41, 41,136,141,141,133,159,159, 31, 2, 3, 3,161,209,104,
+ 80, 80, 80,128, 1, 3, 6,184, 56, 59, 59,143,160,197, 56,133, 66,249, 95, 54, 89, 47,121,145,127, 90, 68,171,196,237, 18,107,
+212, 82,169,116,126, 68, 68, 68,171,208,208, 80, 30,128,125, 0, 16,194,197,144, 1,173, 27,109, 59,178,249,187,208, 67,107,230,
+134,246, 8,173,181, 45,132,139,226, 81,108, 97, 77,155, 54,117,139,136,136,104, 45, 18,137, 62, 42, 37, 17, 4, 0,220,220,220,
+224,226,226, 2, 87, 87, 87,184,185,185,129,101, 89,104,116, 6,104,109,128,218, 96,130, 82,169,132,186,104, 91, 99, 52, 67,171,
+213, 62,251,110, 9,116,156, 48, 97,130, 98,253,250,245, 57,153,153,153,223, 1,104, 48,102,204,152,254,235,214,173,195,133, 11,
+ 23, 12,189,130,107,122, 44,110,215,104, 97,189,204, 39,243,130,249,152, 8,224,202,149, 43, 87,208,186,117,107, 48, 12, 51,172,
+ 36, 65,137, 68,178,113,207,158, 61,146,232,232,104,212,172, 89, 51,122,216,176, 97, 67,191,251,238,187, 26, 50, 77,254,239, 0,
+ 96,205,203,138,158, 54,109,218,215,139, 23, 47, 86, 40, 20, 10,179, 78,167,251, 63,246,190, 59, 44,138,171,125,251,158,237,203,
+238,210,219,210, 85,138, 96, 65,197,222,176,183,136,157,216, 53,246, 88,162,209, 24, 99, 11,197,168,177, 68,141, 26, 19, 77,108,
+ 17,141, 5, 81, 17, 99,195,222, 21, 80, 84, 4, 65,144, 38,101,105,203, 22,182,176,229,124,127, 32, 4, 13,213,188,239,239,123,
+147,204,125, 93,123, 45,236,156,185,231,156,153,115,102,238,121,206,115,158,199,110,248,240,225,200,204,204,196,155, 55,111,238,
+214, 34, 50, 95,198,197,197,145,210,210, 82,164,166,166, 34, 46, 46,206,228,235,175,191,238,100, 96, 48, 70,100,195,116,218,212,
+238, 29, 58, 77,234,210, 14,135,239, 61,225,220, 74, 74,179,232,208,196,201,242,113, 86,110, 83, 29,133, 87, 31,114,181,229,114,
+249,246,111,190,249, 70,161, 80, 40,144,157,157,141,167, 79,159,226,197,139, 23, 72, 79, 79,199,166, 77,155, 20,197,197,197, 59,
+234,227,112,228,179,190,216,188,100, 6,197, 74,184, 11, 60,185, 1,148,201, 1,149, 2,154,196, 88, 28, 72,204,195,174,147,167,
+184, 25,153,153, 22,199,142, 29,155,233,234,234, 26, 11,192,171, 46, 62, 66, 42, 46, 33,131,193,120, 95,132,130,193, 96,200, 1,
+228, 9,133,194, 44, 83, 83,211, 44, 6,131,145, 71, 8, 81,254, 71,222, 36,244, 40, 7,147, 9,112, 77,192, 96,215,153,218,243,
+227,113,227,198, 29,205,202,202, 26,148,154,154,218,117,199,142, 29,223,240,249,252,248, 29, 59,118,124,147,154,154,218, 53, 43,
+ 43,107,208,184,113,227,142, 2,152,210,152,227,123,122,122, 46, 8, 14, 14,198,166, 77,155,208,182,109, 91,120,121,121,149,133,
+132,132,108, 7,176, 26,192,103,158,158,158,183, 23, 44, 88, 48, 93, 34,145,136,179,179,179,219,254,240,195, 15,115,182,111,223,
+222, 49, 39, 39,135, 95, 15,117,143,129, 3, 7,226,252,249,243, 0,144, 11, 32,181,168,168, 72,159,147,147, 3, 31, 31, 31,116,
+234,212, 9, 10,133, 2, 10,133, 2, 82,169, 20,110,110,110, 48, 26,141, 93,233, 91, 57, 13, 26, 52,104,252,159, 10,174,154,133,
+ 22,159,207,183,244,243,243, 67,179,102,205, 44,241,118,181,150, 53,151,181, 98,241,204,241, 2, 81,236, 5, 80,113, 87, 48,174,
+103, 43,129, 53,151,181,226,237, 46, 44, 55, 55, 55,158,159,159, 31,132, 66,161, 83, 45, 7,191,158,151,151, 7, 63, 63, 63, 88,
+ 88, 88,192,220,220, 28,126,126,126, 40, 47, 47, 71,169, 92, 14,165, 1, 40,211, 25, 81, 90, 90,138,226,130,124,148, 25, 0,189,
+169, 53,210,211,211,193,100, 50,211,106,225,116,240,240,240, 40,136,143,143, 47, 0,112, 19,192,167,161,161,161, 88,190,124, 57,
+130,130,130,142, 10,114, 95, 15, 60,122,254,140,245,145,144,121,182, 94, 92,106, 60,128,242,172,172, 44, 88, 88, 88, 64, 40, 20,
+214, 40, 12,252,253,253,219, 11,133, 66, 28, 60,120,144,100,103,103,119, 71,197, 18,254, 52,138,170, 16,123, 38, 12,148, 2,216,
+ 30, 27, 27,219,249,235,175,191, 78,234,223,191, 63,187, 75,151, 46, 88,187,118, 45, 0, 68,213,196, 41,149, 74,239, 79,153, 50,
+ 69,123,237,218, 53, 36, 38, 38, 10, 79,159, 62, 29,184,118,237,218, 86, 25, 25, 25,188,179,191, 95, 24, 18,150, 37, 11,220,120,
+233, 22,127,221,197,235,247,109,204,132, 45,155,218, 88, 33, 46,227, 13,199,192,196,195,250,174,104,103, 54,115,102,111, 62, 43,
+174, 39,143,145,219,155,207, 66,159, 74, 59, 0, 0, 32, 0, 73, 68, 65, 84,138,237,200,102,206,144,203,229,199, 34, 35, 35, 47,
+ 46, 89,178, 68, 33,145, 72, 96,106,106,138,162,162, 34,172, 95,191, 94, 17, 23, 23,119, 82,171,213,158,173,143,215, 96, 36,237,
+ 93,154,184, 2,175,226,171,126, 43, 55, 18, 60,212,114, 16,240,233, 34,120,251,248, 64,171,213,162,117,235,214, 84,104,104,168,
+208,220,220,252,203,122, 69, 15,227, 79,221, 77, 79, 81, 84, 30, 33,228,141, 66,161,200, 54, 49, 49,201,224,112, 56, 25,197,197,
+197,217,132,144,252,255,132,206, 34, 12,124,209,173,181, 39,192, 51, 65, 70,145, 34,231,145, 2,197, 53, 21, 52, 53, 53,157,177,
+107,215, 46,254,190,125,251,116, 11, 22, 44,208,204,153, 51,135,173, 82,169,236,230,204,153,195, 94,176, 96,129,102,223,190,125,
+186, 93,187,118,241, 69, 34,209,232, 15,169,136, 78,167, 67,124,124,252,198,148,148, 20, 33, 42,194,141, 44, 10, 9, 9,153,154,
+156,156,204,223,185,115, 39,194,195,195, 17, 30, 30,142, 17, 35, 70, 96,225,194,133, 8, 14, 14,174,139, 78,208,166, 77, 27, 63,
+107,107,107,220,184,113, 35, 7, 64, 6,128,246, 34,145,200,116,196,136, 17, 24, 52,104, 16,212,106, 53,202,203,203,171,132, 22,
+147,201,132,133,133,133, 53,125, 15,164, 65,131, 6,141,255,186,200,122, 71,108,177, 0,160,210, 84, 23, 16, 16, 64,213,245, 96,
+ 52,148, 72, 32, 85,150, 33,189,180, 12,153, 37,198,119,182, 25,141,198, 58,143,158,147,147,115,246,222,189,123, 51,252,252,252,
+ 88, 57, 57, 21, 51, 98,126,126,126, 40, 43, 43, 67,206,147, 7, 80, 26, 1,161,135, 47,148, 74, 37, 74, 94, 60,134,168, 77, 87,
+ 88, 15,157,132,173, 59,119,106,138,138,138,118,215,196,201,229,114,217,206,206,206, 5,105,105,105,122, 0,197,230,230,230, 3,
+ 93, 93, 93,113,253,250,117, 0, 56, 76,128,205,136,187, 6,220,136, 0,169, 48,169,136,220,220,220, 32,145, 72,160, 80, 40,174,
+215,196,121,239,222,189,100,157, 78,215,122,248,240,225,212,175,191,254,122, 92, 38,147, 5, 1,120,170, 49,130,249, 36, 43, 31,
+ 74, 3,248, 0, 6, 88, 90, 90,126, 30, 28, 28,220,111,193,130, 5,136,140,140,196,165, 75,151,202, 81,225, 11,118,175, 6,218,
+210,212,212,212, 61, 75,151, 46,237,194, 96, 48, 62,189,124,249,178,222,203,203, 75, 86, 94, 94,110,104,238,237,205, 8, 10, 93,
+195,153,255,233,108,139,162, 50, 36, 12,106,238,208,141,162,128,132, 55,146,140, 20, 5,138,234, 58,167,254, 92,102,212,200,238,
+109,252,103,140, 27, 38, 18,122,180,132,242,217, 3,241,158, 19,191,111, 53,137, 75, 14,184, 33,145,140,136,140,140, 12,188,126,
+253,250,124,173, 86,219,140,199,227,189,146, 74,165,223, 43, 20,138,122, 69, 22,147,201, 28,170,113,112,182,148, 22, 23,131,255,
+214, 18, 37,211, 25, 81,168,209, 35,209,194, 11, 19,156, 93,170,166, 65,243,242,242, 32, 22,139, 41,131,193, 48,172, 46,206, 75,
+151, 46, 33, 32, 32,160, 82,120,130,162, 40, 80, 20, 85,232,237,237,157,207,227,241,138, 56, 28,142,108,243,230,205,106,181, 90,
+ 13, 22,139,197, 55, 24, 12,204,191,210,219, 59, 9, 96,199, 35,212,143,115,134,247,233,223,182,165, 15,185,249,232, 9, 85, 82,
+166, 62, 80,135, 21,240, 7, 79, 79, 79, 86,113,113,241, 89, 0,137, 58,157,238,200,241,227,199,249,147, 39, 79, 86,159, 56,113,
+ 98, 34, 0,247, 45, 91,182, 4, 42, 20,138, 70,165, 84, 72, 73, 73,249, 97,221,186,117, 95,173, 90,181, 10,135, 14, 29, 90,144,
+146,146,178,252,173,165,107, 68,112,112, 48, 54,111,222,140, 67,135, 14, 25, 19, 19, 19,127, 55, 26,141, 41, 75,150, 44,105, 99,
+111,111, 95,152,155,155,155, 82, 7,109,135,193,131, 7,107,110,223,190,205,149,203,229,183, 0,124, 62,119,238,220,153,157, 59,
+119,150,141, 27, 55, 78, 84, 92, 92, 44, 21, 8, 4,220,189,123,247, 90,178, 88, 44, 40,149, 74, 80, 20, 5,185, 92,174,165,239,
+131, 52,104,208,248, 95, 69,109, 90,228,111,130, 90,159, 13,172,154, 26, 88, 86, 86,150,159,153,153,233,243,230,205, 27, 61, 0,
+ 61, 0, 20,105,245,223,174,219, 27,177,111,116, 23, 79, 97,174, 78,135,211,143,158,151, 21,105,245,149,206,239,250, 55,111,222,
+200, 51, 50, 50, 76, 85, 42,149,162,150, 99,221,253,241,199, 31, 85,215,174, 93, 51, 77, 77, 77,133,193, 96, 64,251,246,237,241,
+242,229, 75,148, 36,198, 67,232,211, 30,194, 94, 1,120, 30,251, 8,113,151,162,241, 90,161,213, 39,173, 94, 87,170, 80, 42,131,
+203,203,203, 79,215, 68,200,102,179,139, 1, 16, 66,136, 1, 0,100, 50,217, 83,133, 66,209,211,222,222, 30, 9, 9, 9, 66,165,
+ 1, 11, 3, 87,108,221, 65, 8, 49,112, 42, 86,115, 45, 30, 55,110, 28, 98, 98, 98, 0, 32,166, 38, 78,153, 76,182, 96,214,172,
+ 89,215, 14, 30, 60,200, 74, 77, 77, 29,180,111,223,190, 65, 73, 73, 73,132, 42,206, 52,220, 46, 99,195,125,234,194,142, 63,185,
+121, 95, 10, 8, 8,128,131,131, 3,246,238,221,139,239,191,255, 94, 55,111,222,188,228,239,191,255,190,163, 68, 34, 57, 82, 75,
+251, 75,165, 82,233, 5,107,107,235,249,173, 90,181,146, 43,149, 74, 20, 21, 21, 33, 39, 39, 7, 86,214,214, 12, 61, 24,221,108,
+ 45, 44,142,156,205,147, 11, 89, 23,238,227, 65,118,110,157,214,172, 46,108,230,148,209,254,237,252, 63, 91,181, 66,132,219,167,
+ 65,205, 10, 6,217,247, 13, 22,125, 18,104,170,214, 28,233,165,124,146, 62, 57, 86, 38, 11,147,201,100,225,141,236, 44,131,187,
+117,235,118,116,221,186,117, 38, 43, 55,173,195, 22, 31, 39,232,139,138, 80,160, 49,160, 80,163,135,172, 36, 17, 9, 9,207, 97,
+109,109,131,215,175, 95, 67,173, 86,227,197,139, 23,132,201,100,158,173,207,162, 83,137,106,211,133, 82, 30,143, 87,196,102,179,
+243, 89, 44, 86,113,106,106,170, 82,173, 86,131,193, 96, 8, 13, 6,131, 73, 3,234,234,108, 99, 99,179, 4, 21,193, 68, 35,229,
+133,133,219,253,216,176, 0, 11,189,221,108,172,135,172,158, 51,217,198,213,209, 78,154,154,252, 74,183,251,226,157, 66,181,166,
+246,197, 26, 0,162,138,139,139,171, 44,146, 39, 78,156, 88,116,226,196,137,153, 0,246,163, 34,239, 86,180, 84, 42,253,233, 3,
+ 6,223,234,147, 39, 79,126,181,106,213, 42,152,152,152, 84, 5, 79, 53, 49, 49,225, 3,192,111,191,253,134,132,132,132,206,120,
+235,175,101, 52, 26,143,230,230,230,214,199,233,238,235,235,155, 26, 17, 17,193, 5,224, 56,119,238,220,174, 59,118,236,192, 39,
+159,124, 82,240,252,249,243, 46, 0,210, 0,184,127,250,233,167, 15, 15, 29, 58,100,105, 52, 26, 81, 82, 82, 2,173, 86,155, 70,
+223,202,105,208,160, 65,139,173,255, 10,252, 0,196,161, 34,126,214, 80, 0,231, 80,225,214, 81, 43, 92,222,170,179,139, 0,134,
+ 87, 62, 31,107,113,134, 7, 42, 86,100, 93, 0,240, 11, 0,251,218, 72,173,173,173,191,156, 58,117,170, 46, 59, 59,155,228,229,
+229,145,240,240,112,178,120,198, 84,195, 0, 15, 71,163,135,163,189,210,214,214,246,165,131,141,213,129,118, 2, 44, 6,224,220,
+128,134, 77, 77, 74, 74,154, 61,117,234,212, 25,111,143, 59,227,232,209,163,138,203,151, 47, 43,152, 76,102, 20, 42, 66, 59, 84,
+ 10,202, 41,195,134, 13, 83,104, 52, 26,133,183,183,119, 49, 42, 28,247,107, 67, 96,239,222,189, 75,206,159, 63, 79, 12, 6,195,
+159, 98, 20, 21, 20, 20,144, 75,151, 46,145,238,221,187, 75, 1, 76,238,215,175,223,245, 59,119,238, 92,239,209,163,199,201,250,
+ 42,108, 99, 99,179,226,201,147, 39, 49,233,233,233,177,231,206,157,139, 61,114,228, 72,236,167,159,126,250,180, 77,155, 54,170,
+228,228,100,163, 94,175, 39, 79, 30, 63, 38,222,205,155, 43, 1,184,213,198,211,215,132,245, 80,182,247, 27,162, 94,251, 9, 81,
+143,116, 33, 0,136,124,235,151, 36,127, 65,127,242,114,254, 16,210,135,207,188,247, 33, 61,197,202,202,234, 98, 76, 76, 12,145,
+203,229,228,217,179,103,100, 74,192, 32,114,111,102,127,114, 97,144, 39, 57,212,171, 41,217, 58,176, 13, 25,212,171, 39,249,241,
+199, 31, 73, 68, 68, 4, 89,177, 98,133,209,198,198, 70,142, 58,124,180,196, 98,241,229,227,199,143,199, 2,136,101, 50,153,177,
+ 50,153, 44, 86, 46,151,159,205,202,202,218,229,237,237,253, 85,171, 86,173, 38,250,248,248,244,237,211,212,237,171,126,166,188,
+151,253,205,248,175,154,139, 4, 91,241,231,184, 87, 85, 48, 7,220, 60,220,221,229, 55,110,220, 48,106, 52, 26,114,235,214, 45,
+ 99,139,230, 94,234, 45, 99, 7,159,124,189,119,195, 73,245,249, 95, 47,150,157,249,249,206,137,105, 1,241,189, 5,140, 95,187,
+ 10,171,194,113,124, 40,198, 3, 56,141, 63, 86, 29, 78, 5,112, 6,117,175, 66,100, 0,216,191,118,237,218,234, 43, 13, 1,128,
+209,166, 77,155, 88, 66, 72,108,155, 54,109, 98, 27, 91, 17,129, 64,176, 36, 50, 50, 50,196,213,213,117,211,184,113,227,246, 74,
+165,210,115, 19, 39, 78,140, 71,197, 98, 16, 10, 21,217, 17,134, 57, 59, 59, 23,196,197,197,145,235,215,175,147, 49, 99,198,200,
+ 57, 28,206, 36,250, 54, 78,131, 6, 13, 26,255, 21,204,174,229,187, 78,172,139,143,143,175,140,161, 53,183, 46,242,229,203,151,
+199,198,196,196,196,162, 34, 74,124,157, 96,177, 88,167,230,205,155, 71,236,237,237, 21,118,118,118,167,216, 76,230, 76, 23, 19,
+248,225,195,150,186,247, 12, 11, 11, 27,241,195, 15, 63, 12, 5,208, 25, 0,219,201,201, 41, 39, 47, 47, 79,113,231,206, 29, 69,
+247,238,221, 21, 54, 54, 54, 18, 95, 95, 95,197,150, 45, 91, 20, 58,157, 78,177,100,201, 18, 5,254, 28,239,171, 38,240, 1,204,
+231,114,185,167, 90,180,104, 17,191,122,120, 95,221,166,133, 51,201, 84, 79, 91, 5,128, 31, 0,204, 3, 96, 1,128, 29, 24, 24,
+120,229,197,139, 23, 23,125,125,125,247, 52,128,215,177, 85,171, 86, 87,143, 30, 61, 26, 19, 17, 17, 17,251,229,151, 95,198, 88,
+ 91, 91,103, 39, 39, 39, 27,213,106, 53, 41, 41, 41, 33, 82,169,148,156, 59,119,206, 96,101,101,181,179,214,134,243,152,185,228,
+210,225, 26, 67, 56,100,173,154, 68,186,115, 25,111, 62,164,167, 8,133,194,226,162,162, 34,146,151,151, 71, 82, 83, 83,201,201,
+147, 39,201,224,110,157,200,177, 79, 71,147,195, 51, 70,144,205,131, 59,145,206,166,124,165,216, 84, 20, 99,106,106, 42,105,200,
+170, 67,177, 88,124, 89,163,209, 84,133,111,112,118,118,142,245,246,246,142,240,245,245,221, 26, 25, 25,185,104,219,182,109, 35,
+250, 52,117,251,106,253,160,110,170,178,232, 19, 68,126,252, 7,178,188,189,151,250,173,152,175, 17, 78,214, 86, 97, 55,174, 95,
+ 55, 86,138, 95,189, 94, 79, 78,159, 58, 69,198, 14, 25, 16, 95,122,225,183, 95,110, 5, 47, 56,186,164,189,215,233,238,124,140,
+175, 75,176, 85,189,138,136, 96,237,111,198,216,245,145,171, 85,110, 79,115,198, 15, 93, 76,223, 73, 47, 53,214,203,203, 43,149,
+ 16,146,235,227,227,147, 10,224,176,143,143, 79,245,255,167,213, 66, 91, 21,156, 52, 36, 36,132,188, 29, 31, 12, 0, 65,235,214,
+173,139, 37,132,196,122,122,122,222, 6,128,182, 66,216,244, 50,103,252, 50,220,221,190,168,151, 57,227,151,182,194,154, 83, 70,
+185,113,208,188,167,173,224,214, 8, 79, 7,121,111, 39,243,155,135, 15,236,219,244,209, 71, 31,237, 5,176, 19,192, 55,214,214,
+214,183,198,143, 31,159,112,232,208,161,132, 45, 91,182,148, 39, 39, 39,147,233,211,167, 43,121, 60,222, 55,244,125,144, 6, 13,
+ 26, 52,254,107,168,140, 12,239,208, 24,161, 53,236,171,175,190,138, 37,132, 84,198,210,154, 92, 67,153,225,171, 86,173,138, 37,
+132, 84, 70,135,127, 63,128, 89, 77, 1,205, 66,118,237,218, 69,120, 60,222, 47, 31,216,152,234,156,226,145, 35, 71,118,145,201,
+100, 29,237,237,237, 59,190,181, 92,185,216,216,216,164, 30, 57,114, 68,161, 82,169, 20,132, 16,133, 94,175, 87,196,196,196, 40,
+122,247,238,173,168,246,214, 95, 95, 61,223,193, 74, 49,110, 63, 90, 61,131,172, 20,227,246,123,155, 38,237,223,191,255,124, 90,
+ 90,218, 89, 51, 51,179,101, 13,228,116,177,181,181, 13,178,178,178,186,104, 99, 99,179,210,202,202, 42,183,188,188,156,148,148,
+148,144,151, 47, 95,146,235,215,175,147,123,247,238, 17, 43, 43,171,236,218,234,217,207,132,117,191,100,211,124, 98,220,191,142,
+104,119,172, 32, 0,136,116,219,114, 82,248, 99, 40,121, 52,107, 16,233,205,103,222,253,128,243, 9, 11, 11,139,159, 79,157, 58,
+101, 76, 73, 73, 33, 81, 81, 81,228,220,185,115,100,225,194,133,164,185,163,131,166, 11,151,145,223,147,199,186,248, 33, 1, 75,
+ 53, 26, 77,172, 76, 38,139, 85, 40, 20,177, 45, 90,180,136,237,212,169, 83, 68,151, 46, 93,182,158, 56,113, 98,209,250,245,235,
+ 71,244, 51,229,189, 44,139, 62, 65,200,151, 67, 8,153,223,131,188,154,217,155,244, 53, 97, 61,169,149,211,222, 62,187, 50, 90,
+187, 82,169, 36, 55,111,222, 36, 87,175, 94, 37, 98, 27, 27,153,191, 9,115,118,119, 30,122,117, 55,131, 69, 67,235,217,199,156,
+113,224,254,143,223, 26, 84,231, 15,145,223,166, 14,209,247,182, 96,236,170, 86,238, 24, 33, 36,119,204,152, 49,175, 9, 33,185,
+ 39, 79,158,204, 34,132,228,142, 30, 61,250, 53, 33, 36, 23,192,209,154, 56,223, 11, 78,186,255,173,200,154, 31, 18, 18, 18, 75,
+ 8,137, 13, 9, 9,137, 5, 42,130,168,246, 50,103, 28,124,176,103,179, 81,115,238, 32, 57, 49,125,168,161,151, 57,227, 96,141,
+245,180, 96,157,141,219,191,141,104, 47, 30, 38,167, 22, 78, 52,244, 16,155,221,240,242,242,218,188,104,209,162,136,123,247,238,
+ 61, 53, 24, 12, 9,169,169,169, 9, 59,119,238, 76,232,218,181,235,109,107,107,235,120, 46,151, 59,175,190,107,244, 31, 2,205,
+ 73,115,210,156, 52, 39,141,247, 13, 76,117,108, 59,187,113,227, 70, 33, 33,100, 73, 96, 96, 32, 54,108,216, 48,182, 85,171, 86,
+227,157,156,156,108, 1, 32, 39, 39,167,236,217,179,103,178,192,192, 64, 4, 5, 5, 97,211,166, 77, 91, 81,225,203,242,127,137,
+188,211,167, 79, 59, 47, 88,176, 64,178,126,253,122,227,244,233,211,125, 0, 60, 43, 44, 44,108, 62,113,226,196,249, 44, 22, 43,
+208,205,205,205, 55, 55, 55,183, 64,165, 82, 29, 6,176, 7,245,204,153,214, 6, 30, 3,134, 14, 77, 28,112,145, 1, 67,181,159,
+135, 4, 5, 5,141, 27, 61,122,116,249,182,109,219,244, 50,153, 44,178,129,116, 89, 5, 5, 5,107, 42,255,177,178,178, 18, 63,
+121,242,100,158,157,157, 29, 35, 53, 53, 21, 26,141, 6, 41, 41, 41, 70, 84, 76, 77,213, 8,133,158,108,255,233,228,101,239, 37,
+147, 2,204,202, 18, 31,131,195,100, 66,199,230, 34,239,254, 69,236,191,153, 40, 83,150, 99,199,135,180, 83, 42,149,126,183,112,
+225,194,137,203,150, 45,227,187,185,185, 81,119,239,222,197,241,227,199, 53, 18,137,100, 48,128, 27,127,132,126,106, 28,140, 70,
+ 35,184, 92, 46, 0, 96,249,242,229, 96, 48, 24,108,137, 68,194,165, 40,138, 71, 81,148,128,162, 40,166, 46, 45, 1, 70, 89, 9,
+242, 75,164,200,202,151,214,201,103, 48, 26,143, 63,120,240, 96,113,187,118,237, 24,143, 30, 61, 66, 65, 65, 1, 82, 82, 82,136,
+129,144,163, 55, 85,134, 10,167, 68, 77,195,235, 39,176,178, 30,217,214,146,199,224, 30, 8,130,191,150,193,220,109,196, 24, 84,
+196,210, 2,128,253, 20, 69,113, 0, 20,181,104,209,162,207,139, 23, 47, 76, 90,180,104,161, 74, 76, 76, 60, 79, 81,148, 19,128,
+131, 53,113,154,152,152, 20, 2, 40, 60,121,242, 36, 0,204, 66,197,201,107, 31, 28, 28,156,123,243,230, 77,132,132,132,228, 3,
+216, 5, 0, 34, 75,235,225,190,230, 28,138,251,107, 8,186,106,192,216, 97, 36, 53, 90, 93, 69,118,246,125, 91, 9, 25, 96,239,
+251, 26, 29,197,222, 12,174,190,188,117,104,104,232, 77,133, 66,161, 57,118,236,152,118,218,180,105,204,228,228,228,135, 0,110,
+ 1, 56,137,183, 62,150, 52,104,208,160, 65,227,191,138,247, 45, 88,245,250,104,189,175, 90, 55, 0,248, 41, 41, 41,169, 42,169,
+116, 82, 82, 82, 44,128,221,168,136, 6, 63,172, 17,138,119,245, 91,139,214,158, 15,108,204,251,156,124, 63, 63, 63,147, 23, 47,
+ 94,112, 80,115, 18, 71,234, 3, 56,255,132,154,114, 29,122,121,121,125,175,211,233, 34,118,239,222,125,130,201,100, 78,252, 11,
+106,223,205,211,211,179,228,200,145, 35,198,168,168, 40,178,122,245,106,131,131,131, 67, 9,254,236,163,245, 14,167, 63,151, 25,
+190,212,199, 73, 22, 51,185, 7,121,181,104, 56,185, 53,169, 55,153,237, 36,146,249,243,153,199,255,226, 91,137,167,185,185,249,
+126, 19, 19, 19,153,153,153,217,101, 0,221,254,202, 53,178,182,182, 62, 36, 22,139, 47, 87,255,216,219,219, 71,216,218,218,254,
+ 96, 99, 99,179,218,194,194, 98,142, 59,159,187,109, 81,115, 71,117,252,200, 22, 36,186,187, 45,153,100,195,125,127,234,240,253,
+122, 58,184,187,187, 23,133,133,133, 25,207,158, 61, 75, 86,172, 88, 97,108,210,164,137, 12,117,248,181,213,105,209,178, 96, 30,
+ 15, 31,221,197,152, 63,212,137,108,240, 49, 53,246,177,100,214,182, 66,113,210, 91, 1, 60,181, 62, 78, 15, 15,143,221,132,144,
+ 3,107,215,174, 61,128, 63,114,129, 14, 8, 13, 13, 13, 38,132, 4,135,134,134, 6, 3, 24, 4, 0,254,230,140,176,195, 35, 58,
+ 24,114, 62,114, 36,223,250,136, 12,254,230,140,176, 26, 45,153, 86,172,211,103,102, 14, 53,230,206,236, 78,130, 60,133,134, 46,
+ 86,188, 43, 92, 46,119, 17, 42, 44,206,157, 0,112,233,183,102,154,147,230,164, 57,105,139,214,255,156,240,106, 16,196, 86, 86,
+ 86,251,155, 53,107,118,194,205,205,237,132, 72, 36,218,138, 10,167,249,198, 94, 8,247,117,235,214,201,204,205,205,219,254, 7,
+ 47,174, 29, 0, 39,252, 57,113,238,127,172,195,172,113,192,130,228,101, 99,159,172,113,192,130,106, 63,119,242,241,241,249, 22,
+ 21,209,188,255,106, 39,116,179,178,178,218,105,101,101,149,253,214, 55,203,173, 33,156, 29,152,204,137,125,248,204,187,221,184,
+140,188, 62,124,214,157,142, 76,230,132,191,233, 0,172,107,177, 69,109,156,206, 54, 54, 54,219,172,172,172,114,108,108,108,118,
+ 54, 82,100,189,195,217,214, 4, 14,125, 45,152,167,187,153, 82,202,190,230,204,147, 29, 4,181, 47,234,104, 68,219,253, 66, 66,
+ 66, 62, 33,132,124,226,232,232, 24, 88, 77,248,251, 6, 5, 5, 5, 16, 66, 2, 42, 35,192,119, 18,192,174,183, 5,243, 72,119,
+ 51, 74,218,219,130,121,164,147, 0,118,181,213,179,143, 5,243,120,119, 51, 74,234,111,198, 56,226,202, 67, 19,250,102, 78,115,
+210,156, 52, 39, 45,180,254, 25, 66,139,238, 48, 52, 39,205, 73,115,210,156, 52, 39,205, 73,115,210, 66,171,102, 97, 85,253, 83,
+ 53,195,198,162,207, 13, 13, 26, 52,104,208,160, 65,131,198, 95, 66,173, 1, 75,169, 58, 84,105, 99, 28,219, 63, 68,217, 70,211,
+156, 52, 39,205, 73,115,210,156, 52, 39,205,249,175,227,172,143,251,255,122, 97,221,223, 26,180, 89,149,230,164, 57,105, 78,154,
+147,230,164, 57,105,206,127, 45, 24,244, 41,160, 65,131, 6, 13, 26, 52,104,208,248, 75,240,123,251,253,126,224,210,154,125,180,
+ 88,157,214,230,235,245,122, 59, 0, 96,177, 88, 18,221,195,213, 14,117,177,179,129,126,250,138,244, 59, 96, 1,179,244,192,229,
+ 26, 56, 47,235,245,122,203,183,156, 37,186,135,171, 7,213,201,217,105,237,197,234,229,245, 15, 87, 15,120,191, 12, 1,152,236,
+ 78,107,115,222,171,171, 99, 67,207, 10,133,119, 98, 98,253,215,234,249,119,225,252, 55,131,221,121,109,190, 78, 87,209,143,216,
+108,150,164,252, 65,221,253,136,211,121,109, 78,245,242,186, 7,171,237,235,226, 20,152,240,138, 60,156,108,183,214,197,153,154,
+ 83,184, 68, 89,166,182,174,139,179,177, 99,211,197,193,161,159,225,237,216,100, 2,179,178,115,115, 47,255,143,245,165, 14, 0,
+ 86, 3, 48,171,246, 91, 60,128,207,233, 94, 73,131, 6,141,191,153,208,138, 67, 69,158,195,159,223,138,173,159,107, 21, 90,122,
+189,222, 46,246, 84, 48,148, 26,160,223,148,181,118,238, 35,247,252, 41, 81,178, 94, 93,194,149, 62, 63,230,203,212,201, 44,109,
+ 89,229,102, 57, 57, 57, 20, 0, 80, 20,245, 11, 0,215, 26, 56, 45, 99, 79, 5,163, 76, 11,248,143, 15,181,116, 5,204, 10, 56,
+156, 47, 76,132,194, 62, 42,149,170, 21, 0,152,152,152, 60, 87, 41,149,215,108,203,203,183,188, 95,190,182,150, 85,175,107,223,
+201,107,237,124, 70,238, 89,104, 48, 26,185,111, 30,237,246, 87, 23, 38,179,216,122,205,174,149,192,249,224, 26, 68, 85, 45,124,
+127, 28,247,227, 21,214,108,160, 47,151,207,111,107, 97,105,217,211, 72, 72, 11,163,209, 72, 25,244,250, 4, 89,105,233, 45,163,
+ 94,255, 68,175, 85, 90,199, 70,126,107,172,171,158,239,183,229, 99,128,117, 10, 8, 20,138, 68,125,152,108,118, 55, 0, 48,232,
+116,119,149, 10,197,181, 81, 64,120, 67,218,222,208,243,243,161,229,255,109,208,233,244,118,105, 23,131,161,209, 1,126, 99,190,
+181,107, 51,241,215, 35, 0,160,149, 60,177, 87, 36, 71,118, 6, 0,161, 71,192, 3,158,216, 47, 31, 0, 88, 25,185,118, 47,163,
+ 86, 65,163, 3, 90, 4,132,218,213,199, 57, 45,232,184,245,178,217,163,121, 0,112,233,228, 15,205,175, 70,252, 52, 4, 0,250,
+142,158,123,126,224,152, 5, 47, 1, 96,211,207, 17,214, 71,191, 29, 91, 39,103,195,198,102, 41,167, 52, 57,202, 83, 43,203,181,
+112, 17,178,196,201,201,201, 12, 0,112,116,116,108,208,216,116, 6,204,115,129,249, 12, 38,179,167,135,167,167, 31, 0,146,250,
+234, 85,156, 65,175,191,237, 0,236,250, 15,247,165,133,132,188, 27,156,149,162, 40,186, 67,210,160, 65,227,239,134,115,111,197,
+213,185, 63,189,204,214,182,135, 82, 3,220, 72, 1,122,117,105,131,217, 19, 63, 18, 85,223, 22,190, 39,212, 53,249,209, 25,159,
+125,191,110, 97,180,105,211, 6,105,105,105, 13,170, 69,153, 22,184,158, 12, 64,250,194,180, 68, 40,124,181,109,243,102,179, 1,
+ 3, 6,176, 28, 29, 29, 65, 81, 20,242,242,242,186, 68, 71, 71,119, 88,188,120,241,167,144,190, 40, 41,211, 66,126, 61,185,126,
+222,202,186,182,106,222, 4,171, 23,140, 53, 7,128,149, 83,118,117,120,148,148,111,245,234,213,171,126, 95,125,245, 85, 17,243,
+218,181,159,108,128, 3,249, 64, 86, 67,234,121,232,236, 3,190,121,238,111,238,147, 22, 44, 56,233,233,233, 41,114,115,115,163,
+ 76, 77, 77,193,100, 50, 81, 82, 82,226,250,236,217,179, 33, 15, 31, 62, 84, 70,223,248,133, 27,243,112,120,170,132,223, 89,221,
+160,182,171,114,248,151, 76, 77,159, 79, 30, 53,202,121,236,216,177,124, 15, 15, 15, 0,192,171, 87,175,188,194,195,195,199,159,
+ 60,121, 50, 8,170, 28,125,153, 22,234,250,218, 94,197, 9,128, 15,116,179,176,179,155,196,100,179, 91,233,245,122,167,183,214,
+134, 55, 6,157,238,185, 84, 34, 57,252,126,121, 26,127,134, 70, 7,188,200, 5,250,247,244,195,228,209,253,133, 0,240,213,184,
+117, 93, 50, 94,167,112,180, 90, 45,154,123,183,232,254,205,183, 91, 47,130,193, 64, 88, 68,116, 85,249,134,112,198,191, 72, 67,
+240, 55,219,144,243, 52,188,139,161, 52,165,143, 92, 86,202, 4, 0, 51,115,243,209,225,199,126,187,230,232, 27,120, 63,165,176,
+188, 65,156,117,141,205, 11,199,118, 58,100, 63,187,214,242,199, 75,251,217,174,174,174,120,250,244,105,227,198,102,105,146,169,
+209,193, 33, 97,203,151, 95,138,253,253,253, 33, 18,137,192, 98,177,160,215,235,251,223,190,125,187,127,112,112,240, 92,148, 38,
+ 41, 27, 58, 54, 27,128, 45, 20, 69,245,153, 54,123,161,195, 71, 35, 2, 49,122,112,119,186, 35,210,160, 65,227,239,134, 74,235,
+ 85,245,149,135, 63,215, 41,180, 88, 44,150,100,192,212,245,118, 61, 59,183,198,163, 39, 47, 75,211, 51,115, 21,149,219,138,159,
+135, 55, 31,209,221,169,229,205,155, 55,160,209,104,112,247,238, 93, 60,121,242, 4,175, 95,191,198,156, 57,115, 52,111,167, 14,
+107,226, 44,241, 31, 31,106,137,210,100,145, 23, 55,169,105,116, 98, 34, 83,173, 86,227,230,205,155, 40, 41, 41, 1,151,203,133,
+179,179, 51, 6, 14, 28,200, 74, 76, 76,180,234, 55, 96,176,185,255,224, 9,105, 48,247, 82,176, 88,172,146,218,242,136,176, 88,
+ 44, 73,191, 41,107,237, 90,122, 53,193,171,244,156,210,213,223,238, 83, 24,141,132,149,250, 58,163,252,198,141, 27,240,243,243,
+195,229,203,151,173,139,139,139,191,222,181,107,215,106,246,198, 31,183,235,180, 69, 75, 81, 59, 95,137,255,248, 80, 75,107,201,
+ 9,183,171, 23, 78,115,158, 63,127,206,217,189,123, 55,138,138,138,192,229,114, 97, 97, 97, 1,177, 88,140,230,205,155, 83, 43,
+ 87,174, 20, 5, 4, 60,199,103,179, 2,221,202,221,103, 38,213, 86,207,170,182, 43, 50, 4, 54,178, 75, 30, 17,231,206, 49,122,
+244,232,241,206,107,123,179,102,205, 48,104,208, 32,254,164, 73,147, 60,198,142,159,104,244, 31, 58,237, 21, 68,110,101,245,114,
+ 42,179, 76,172,203,238, 57,246, 31, 63, 62, 50, 52, 52,212, 66, 44, 22, 67, 40, 20, 2, 0, 74, 75, 75,157,211,211,211,187, 4,
+ 5, 5,141,121, 16,127,140,229, 31,144,149, 3,161,139,170,174,243,249,111, 5,155,205,146, 84, 90,145, 76,133, 38, 37, 89,217,
+249, 74, 0,208,106,181,208,106,181,208,104, 52,152, 55,119, 14,115,214,152, 78,158,110, 61, 23, 62,126,253, 38,191,184, 69,244,
+125,171,202,125,117,245,112,178,202, 94, 75,165,153, 87,102, 5,127,249,165,216,222,254,143, 25,193,176, 67,135,152,197,197,197,
+253,131,131,131, 91, 18, 65,111,105,139,128, 80,139,186, 56,235, 26,155,210,151,231,154,126,179, 96, 80,219, 61,223, 70,193, 96,
+ 48,224,222,189,123,184,121,243, 38,182,110,221, 74,206,159, 63, 95,106, 38, 20,206, 66,157, 99, 51,201,180,135, 67,158,251,198,
+141, 39, 41, 30,143,135, 51,103,206, 32, 49, 49, 17, 12, 6, 3,109,218,180,193,228,201,147,209,191,127,127,241,236,217,115,136,
+255,224,113,169, 48,247,150,255,197,190,196, 0,176,112, 69,240, 70,135, 41, 51,231, 99,211, 55, 43,105,161, 69,131, 6,141,191,
+179, 53,171,214, 16, 15,136,138,138, 34,111, 63,189, 0,128, 0,140,102, 35,247, 28, 61, 17, 99, 60,215,108,228,158,163, 4, 96,
+ 16,128, 97, 6, 52,105,215,174,157, 78, 42,149,146,135, 15, 31,146,121,243,230, 41,183,111,223,126,237,220,185,115,225,250,242,
+242,189,142, 14, 14,223,145, 90, 28,236, 9,192,112, 3,204, 5, 2, 65, 65,102,102, 38,249,253,247,223, 73, 72, 72, 8, 57,124,
+248, 48, 57,127,254, 60,137,142,142, 38,231,207,159, 39, 71,143, 30, 37,241,241,241,228,229,203,151, 68, 40, 20, 22,184, 1,230,
+117,112, 50, 9,192,108, 62,114,247,210,147,143,116,161,222, 35,247, 44, 38, 0,211, 18,240,105,215,174,157, 33, 60, 60,156,132,
+133,133,145, 95,127,253,149,196,199,199,147,194,194, 66,194,226, 9, 11, 42,247,171,173,158, 4, 96, 56, 57, 57, 21, 72,165, 82,
+226,226,226, 66,184, 92, 46,177,183,183, 39,205,155, 55, 39, 93,186,116, 33, 67,134, 12, 33, 19, 39, 78, 36, 95,127,253, 53,145,
+ 74,165,132,207,231,231, 87,238, 87, 27,167, 31, 96, 34, 20, 10, 51, 99, 99, 99, 73,109, 80,169, 84,164,176,176,144, 92,188,120,
+145, 8,133,194, 76, 63,192,164, 46, 78, 19,160,189,175,175,111, 65, 97, 97, 33, 41, 47, 47, 39,153,153,153,228,217,179,103, 36,
+ 49, 49,145,100,102,102, 18,149, 74, 85,197,253,242,229, 75,226,238,238, 94, 96, 2,180, 39,244, 34,136, 90,251,210,251, 31, 87,
+123,251, 33, 98,177, 88,117,242,228, 73,242,230,205, 27,114,240,224, 65,194, 0,214,189, 95,174, 46, 78, 46, 48,176, 71,143, 30,
+134,123,247,238,145,199,143, 31,147,229,203,151,147, 65,131, 6,145,193,131, 7,147,224,224, 96,146,157,157, 77,178,179,179,201,
+144, 33, 67, 12, 92, 96, 96,125,253,179,166,177,105, 14,184, 6, 4, 4,168,202,203,203, 73,106,106, 42,105,213,170, 85, 54, 19,
+152, 36, 4, 90,246, 2,120,245,245, 79, 39,192,210,193,193, 33,247,222,189,123, 36, 34, 34,130,184,185,185, 21, 48,129,105,102,
+ 64, 51, 51,160, 25, 19,152,214,172, 89,179,130,123,247,238,145,162,162, 34,226,234,234,154,235, 4, 88,254,133,190,196, 0,176,
+127, 69,240, 70,146,148,173, 36, 43,130, 55, 18, 0,153,132, 16,130, 26,124, 60,105,208,160,241,207,199,251, 90,228,159,130,170,
+155,100, 64, 64, 0, 5,224,122, 93,133, 85, 76,230,250, 77,155, 54,177,212,106, 53,246,237,219, 39,255,120,204,152, 19,189,122,
+246, 76,109,234,230, 38,165, 24,140,122,179, 13, 23,240,120,139, 54,109,218,100,161,213,106, 17, 19, 19,131, 14, 29, 58, 64, 44,
+ 22, 67, 36, 18, 65, 36, 18,193,206,206, 14,222,222,222,144, 72, 36, 48, 53, 53,197,178,101,203,204, 11,120,188, 69,245,241, 26,
+141,132, 5, 0, 6,163,145,203, 1,102,187,119,236, 24, 19, 20, 20,196,176,182,182,134,149,149, 21, 68, 34, 17, 18, 19, 19,161,
+213,106, 33, 48, 17, 52, 40, 72, 43,131,193, 96,136, 68, 34, 92,189,122, 21, 11, 23, 46, 68,183,110,221, 96, 97, 97, 1, 83, 83,
+ 83,180,106,213, 10, 3, 7, 14,196,172, 89,179,144,154,154, 10,170, 1, 78, 37, 9, 44,214,252, 89,179,102,217,249,249,249,213,
+184, 93,173, 86, 67, 42,149,162,160,160, 0,206,206,206, 8, 12, 12,180, 75, 96,177,230,215,198,103, 13,136,157,189,188, 34, 31,
+ 62,124,104, 35, 20, 10, 17, 22, 22,134,211,167, 79,227,194,133, 11,248,253,247,223, 17, 21, 21,133, 51,103,206,160,160,160, 0,
+ 0,224,229,229,133,227,199,143,219,136,236,236,162,172, 1, 49, 61,164, 27,134,140,252,252, 75,173,242,242,108, 38, 77,156,120,
+ 75,161, 80, 96,210,164, 73, 88,191, 97,195, 74, 54,176,184, 33,251,123, 3,230, 86, 14, 14, 7, 54,110,220,200,200,203,203,195,
+168, 81,163, 10,183,108,216, 48, 35,238,226, 69,143,216, 11, 23, 60,214,135,134,206,232,213,171, 87, 97,118,118, 54, 14, 29, 58,
+196,176,119,117, 61,224, 13,152, 55,182,158,114, 96,225,247,223,127,207, 87,171,213, 24, 48, 96, 64,170,241,249,115,111, 61,240,
+155, 2, 72,188, 14,148,215,183,127, 46, 48,127,217,178,101, 98, 30,143,135, 47,190,248,162,176, 44, 35,163,181, 30,248,181, 20,
+ 72, 47, 5,210,245,192,175,242,180,180,214, 83,166, 76, 41,228,241,120,216,182,109,155, 56,247,143,164,219, 13, 69, 7, 0,145,
+ 0,110, 0,200,153, 54,123,225, 52,191, 78, 93,113,104,239, 46,124, 27,250,213, 1, 0, 31, 83, 20,117, 24,192, 82,186,231,209,
+160,241,239, 68, 67,180,200,255, 40,106, 77,185,195,170,174, 36, 1,244,174,139,197,210,218,186, 67,235,214,173,113,243,230, 77,
+248,250,250, 62,180,176,176,208,115,120, 60,176,217,108, 16, 99,189, 58, 11, 38, 66, 97,191,254,253,251,179,238,223,191, 15,119,
+119,119,152,152,152,128,205,102,191,243,225,112, 56,112,112,112,128, 76, 38, 67,191,126,253,216, 59,118,236,232, 7,141,230,155,
+122, 31,136,201,207, 68, 5,247, 55, 78,252,229,224,129,102,254,254,254, 40, 45,149,193,104, 52, 66, 32, 16, 64,171,213,130,197,
+ 98, 85, 76, 1,233,136,172, 33,103,204, 96, 48, 24,152, 76, 38,220,221,221,177,126,253,122,168,213,106,112, 56, 28, 0,128, 76,
+ 38,131, 84, 42,197,179,103,207,144,158,158,142,183,111,225,117,194,212,220,252,163,177, 99,199,214,152,240, 87,163,209,160,180,
+180, 20,165,165,165,144, 74,165, 80,171,213,232,218,181, 43,247, 92, 84,212, 71, 40, 42,218, 82,227, 62,124,254,152, 67,135, 14,
+217,113,185, 92,168, 84, 42,200,229,114,100,101,101, 33, 35, 35, 67, 45,145, 72,244,166,166,166, 12, 55, 55, 55, 6,143,199,227,
+141, 28, 57,146,146,201,100,160, 40, 10, 1, 1, 1,214, 71,194,194,198, 66,171,221, 74, 15,233,134,225, 18,160,105,175,213, 14,
+235,220,169,211,213,135,143, 30,249, 45, 90,180, 8,241,241,241, 27, 5,199,142,221, 40, 3,158,212,181,111, 42, 48,255,187,106,
+ 2,134,100,100,248,150, 3, 5,213,138,164,187,165,165, 93,152, 50,101,202,211,248,248,120,155,109,219,182,137, 63, 30, 53,106,
+ 62,128,117,141,169,163,169,185,121, 71, 7, 7, 7,156, 63,127, 30,153,175, 95,127,165, 7, 84,141,122,227, 98, 50,123,248,251,
+251,227,204,153, 51,200,206,200,248, 74,255,110, 29, 43, 94,148,128, 2, 86,106,234, 87, 7, 14, 28,216, 63,125,250,116, 48, 89,
+172, 30,208, 55,106,226,240, 79,142,239,211,231, 44,194,129,159,119, 28, 0, 48, 19,128, 17,192, 67,186,199,209,160,241,239,182,
+106,213,167, 69,254, 70, 98,235,231, 70, 91,180,236,236,236,156, 68, 34, 17,114,114,114,208,194,199, 71,194,227,241,192,101,179,
+193,231,114, 27, 84,131,178,178, 50, 95, 71, 71, 71,148,150,150,194,198,198, 6, 28, 14,167,234,195,229,114,171,254, 54, 53, 53,
+ 5,131,193,128,171,171, 43,202,202,202,124,235,229,205,127,102,119,108,199,220,121,247,110,156,111, 54,106,212,104, 88, 90, 90,
+193,197,197, 25,118,118,118, 48, 49, 49,129,139,139, 11, 60, 60, 60,200,150, 45, 91, 32,176,107,211,160, 27,121,117,241,196, 98,
+177, 96, 48, 24,144,159,159,143,164,164, 36,196,199,199,227,222,189,123,120,252,248, 49,228,114, 57, 26,160,179, 80,166, 82,181,
+101,177, 88, 53,138, 44,169, 84, 10,169, 84, 90, 37,180, 10, 10, 10,144,158,158, 14,133, 82,217,174, 14,209, 59,186,117,235,214,
+ 76, 0, 48, 49, 49, 65,187,118,237,176,103,207, 30,253,217,211,167,199,181,188,119,207,202,229,226, 69,139, 95,118,239, 30, 23,
+ 24, 24,104,184,127,255, 62,100, 50, 25, 94,188,120, 1, 91, 91, 91, 22,151,207, 31, 75, 15,231,198, 33, 22, 80,218,200,229,131,
+187,117,235,150, 86, 90, 90,138,205,155, 55, 51,216,166,166, 63,135,214, 50,197, 87, 5, 38,179,187,191,191, 63, 34, 35, 35,145,
+147,145,177, 60,163, 6, 1,147, 1, 20,100,166,166, 46, 63,112,224, 0, 6, 14, 28, 8,138,197,106,180,163, 82,151, 46, 93, 90,
+ 27,141, 70, 60,125,250, 20, 22,192,131,198,238,239,225,233,233, 87,105,249, 21, 2,183,106, 43, 39, 4,110,197,197,197,193,196,
+196, 4, 45, 90,182,108,223,200,195,108,161, 40, 42,119,250,156, 69,136,184,112, 7, 0,112,224,231, 29,249,213, 68, 22, 13, 26,
+ 52,104,139,214,223,213,162, 85, 41,172,170,127,240,142,208,106,160,248, 0, 0,176,217,108,112,121, 60,112,185,220, 10,129,196,
+227, 53,152,131,162, 40,240,249,252, 42, 97, 85, 93, 96, 85,255, 91, 32, 16, 52, 72,192, 0, 64, 73,202,133,158, 51,103, 76,231,
+242,120, 60,104,181, 26, 16, 66,192,227,241, 97, 97, 97, 1,119,119,119,200,100, 50,116,235,222, 75,147, 37,229, 68, 89,183, 24,
+ 25,255, 33,103, 79,175,215, 67,169, 84,162,164,164, 4,197,197,197,144,201,100, 80,169, 84, 13, 94,138,110, 52, 26,153, 89, 89,
+ 89,248,237,183,223, 80, 84, 84, 4,160,194,209,186, 82, 92, 85,126,167,165,165, 33, 44, 44, 12,175, 95,191,110,212,245,233,217,
+179, 39,162,162,162,152,189,251,245,219,123,217,205, 45,231,178,155, 91, 78,239,126,253,246, 70, 70, 70, 50,157,156,156,144,158,
+158,142,152,152, 24,148,148,148,128, 16, 66,175,159,255, 0,188, 2, 74,202,138,139,167,175, 92,185,146,136, 68, 34,108,254,238,
+187,182,235,128, 9, 13, 21, 48,230,117, 8, 24,243,191, 38, 96, 64, 8,129,209,104,132,193, 96,248,160,182, 81, 20, 69,177,217,
+236,198,134, 86,104, 76,225, 42,199,247,101, 95,175,199,239,103,194, 43,127, 79,166, 69, 22, 13, 26, 52,254, 1,168,213, 17,158,
+ 85, 77, 65, 86,125,215,134,252,252,252, 55, 74,165,178,153,155,155, 27,178,179,179,237, 92, 93, 93, 51,184,108, 54, 56, 92, 46,
+ 40, 70,253,154, 64, 32, 16, 60,205,201,201,233,238,228,228, 4,189, 94, 95, 37,170,222,159, 58,172,180,210, 60,126,252, 24, 2,
+129,224, 41,212,117, 70, 78,128, 65, 91,210,164,125,251,246, 85,150, 33, 11, 11, 11, 88, 88,152,131,199,227, 99,213,170, 85,198,
+109, 91,182,236,114,237, 27, 90,250,201,226,149,100,229,186,189,255,209, 51,219,208, 7,147, 64, 32,120,234,226,226,210,213,220,
+220, 28, 17, 17, 17, 72, 79, 79, 71, 73, 73, 9,202,202,202,160,209,104, 80, 86, 86, 6,173, 86, 11, 62,159,143,150, 45, 91,194,
+204,204, 12,209,209,209, 79,161,209,212, 44, 46,139,138, 34,158, 62,125,218,181, 83,167, 78, 85, 22,149, 62,125,250, 80,125,250,
+244,177,169,178,162,149,149,161,176,176, 16, 15, 31, 62, 68,116,116, 52, 40,148, 28,221,209, 0, 0, 32, 0, 73, 68, 65, 84,138,
+ 66,114,114,178, 65,163, 82, 29,165,199,196,135, 65, 13,220,101, 30, 56,176,255,211, 79, 63,157,209,189,123,119, 24,128, 33, 0,
+194,254, 63, 10, 24, 0,192,189,123,247,158, 25, 12,134,238,205,155, 55,135, 20,232, 12,224, 76,163, 68,100, 74, 74,156, 94,175,
+239,215,182,109, 91, 68,156, 56,209, 19, 64,122, 77,229,148, 64, 79, 63, 63, 63,168, 84, 42,188, 72, 72,136,109,132,200,218,187,
+ 34,120,227,180, 41, 51,231,227,208,222, 93, 56,240,243,142,172,253,123,182,187,160, 1,254, 99, 52,104,208,248, 87, 89,179,234,
+213, 34,255,163,152, 93,155,248, 98, 53,134,165,180,164, 36, 54, 46, 46,174, 89,251,246,237,177,119,239,222, 78,221,186,118,125,
+195,225,114,245, 92, 14, 7,140, 6, 60, 72, 84, 74,229,149, 43, 87,174,116, 30, 57,114, 36,235,254,253,251, 16,139,197, 85, 66,
+171,242,155,197, 98,129, 16, 2,129, 64,128, 83,167, 78,149,171,148,202, 43,245, 90,139, 12, 70, 3,227,173,208, 35,132, 64, 42,
+149,130,195,225, 96,235,214,109,216,185,101,203, 68, 3, 16,238, 37,180,253, 18, 0,255,255,219, 3,186,172,236,234,239,191,255,
+222, 33, 40, 40,136,237,236,236, 12,169, 84,138,146,146, 18, 20, 21, 21, 65, 38,147, 65, 38,147,161,164,164, 4, 82,169, 20,124,
+ 62, 31,241,241,241, 58,117, 89,217,213,218,248,120,106,245,201,169, 83,167, 46,139,139,139,115, 96,177, 88,208,233,116, 48, 26,
+141, 48, 26,141, 40, 47, 47, 71, 74, 74, 10,158, 63,127,142,196,196, 68, 20, 23, 23,131,205,102,131,201,100,226,241,227,199, 37,
+ 66,157,238,132,150, 30,211, 31, 12, 54, 16,113,251,246,237, 25,147, 39, 79,134,163,179,115, 47,100,103, 55, 72,192,156,174, 67,
+192,148,126,152,128,249, 67, 0,201,229,143,210,210,210,186,247,238,221, 27, 14,206,206, 27, 91,102,103, 95, 78,104,132,159,150,
+ 65,175,191,117,251,246,237,126, 83,166, 76,193,222,189,123, 55,218,166,165, 93, 40,120,111,154,211, 22,176,109,234,225,177,113,
+218,180,105,184,116,233, 18, 12,122,253,173, 58, 40,171, 71,124,111, 50,109,246, 66,151,247, 28,223,247, 80, 20,181, 0,192,102,
+186, 71,209,160, 65,227,159,108,209,106,212,212,161,137,193,176, 98,233,210,165, 58, 6,131,129,209,163, 71,155,158,137,140, 12,
+124,252,228,137,187, 68, 34,177, 48, 24, 12,245,114,217,106, 52,219,151, 46, 93, 42,213,106,181,240,246,246, 70,113,113, 49, 12,
+ 6, 3, 88, 44, 22, 88, 44, 22, 40,138, 2,131,193,128, 72, 36, 66, 92, 92, 28,246,239,223, 47,179,213,104,182,215,251,144, 48,
+ 24,158,134,133,133,129,201,100, 18, 62,159, 15,138,162,192, 98,177,176,109,219, 54,201, 78, 32, 2, 0,152, 12,134, 22, 0, 24,
+ 12,170,161,222,187,245,206, 91,114,185, 92, 24, 43, 22, 1,212, 91,214, 82,163,249,126,211,166, 77,242, 23, 47, 94, 64,169, 84,
+ 86, 89,223, 20, 10, 69,149,115,189, 84, 42, 5, 69, 81, 80, 42,149,136,140,140,148, 91,106, 52,223,215,198, 87, 4,228,101, 39,
+ 39, 15,239,212,169, 83, 81, 90, 90, 26, 74, 75, 75,241,244,233, 83, 68, 71, 71,227,248,241,227,184,116,233, 18, 82, 82, 82,160,
+215,235,225,228,228, 4, 66, 8, 78,159, 62, 93,170,151,203,135, 20, 1,121,244,152,168, 29, 77,196,226,126,246,118,118,153,182,
+ 54, 54,217, 77,196,226,126,239,111, 55, 7, 94,190,124,249, 18,122,189, 30,238,238,238, 86,117,249,105, 17,189,254,246,237,219,
+183, 49,101,202, 20,184, 52,107,182,193, 13,176,125,191,140, 27, 96,235,230,225,177,161, 82,192, 16,189,254,118, 99,235,108, 10,
+236,248,242,203, 47, 85, 28, 14, 7,199,142, 29,115,215,121,122, 38,178,128, 9, 34,192,167, 55,192,169,111,127, 7, 96,215,215,
+ 95,127,157, 71, 81, 20, 14, 31, 62,108, 99,238,225,241,140, 5, 76, 53, 7,154,152, 3, 77, 88,192, 84,115, 15,143,103,199,142,
+ 29,179,209,235,245, 88,188,120,113,158, 3,176,171, 14,202,133,132,144, 97,132, 16,127, 66,136,203,254, 61,219,241,251,153,240,
+ 74,145, 53, 19, 21, 78,239,147, 1, 60,163,123, 28, 13, 26, 52,254,201,168,209, 12,197,234,180, 54, 31, 32,118,189,186,180,193,
+163, 39, 73,165, 54,150,102, 23, 43,183, 21, 63, 15,111,222,215,215,172,205,143, 63,254, 8, 54,155,141,172,172, 44, 36, 36, 36,
+192,204,204, 12, 19, 39, 78,212,168,228,242,225,213,114, 29,246, 7, 16,253,150,179, 34,159, 90,105,178,200,131, 21,223,236,194,
+239, 81, 76,115,115,115, 40, 20, 10, 48, 24, 12,240,249,124, 8, 4, 2,152,152,152, 32, 38, 38, 6, 67,135,141, 48, 20, 8,252,
+255, 8, 88,250, 71, 62,181, 42,206,202, 88, 67,157, 1, 65, 28,240,133,157,163,227,210,213,171, 87,155, 12, 26, 52, 8, 28, 14,
+ 7,206, 77,188,242,220, 7,111,222,193, 96, 80,250,236, 34,217, 42,143, 38,142,230, 9,201,233, 0, 40,137,238,225,106,199,106,
+185, 14,255, 84, 79, 87,237, 13,247, 83,191,110, 49,107,215,174,194, 31, 93, 42,149, 34, 63, 63, 31, 18,137, 4, 82,169, 20, 74,
+165, 18, 0, 16, 21, 21,133,223,111, 38,202, 84,206,129,169,181,213,243,143,182, 39,153, 58,150, 63,104,122, 36,236, 87,166,173,
+173, 45,242,243,243, 81, 80, 80, 0,169, 84, 10,149, 74, 5,131,193,128,226,226, 98,236, 59,240,171,161, 72,228,255,186, 42, 32,
+100, 93,156,202, 44, 19, 43,197, 29, 39,191,150,110,100,198,140, 25,166,102,102,102, 48, 26,141, 40, 41, 41, 65,102,102, 38,210,
+210,210,112,243,230, 77,165, 68,170,133,210,102, 64,118, 85,192,210, 26, 56,255,131,248,219,113, 86,143, 91,229,232,224,144,147,
+145,145, 97,103, 48, 24,224,228,228,164,151, 22, 23,111,224, 2,151, 76,129, 92, 0,164, 16, 88,253,253,142, 29,211, 71,140, 24,
+129,142, 29, 59,102,229,229,231, 55,173,169, 47, 17,128,233, 13,152,151, 57, 59, 63,127,248,240,161, 56, 51, 51, 19, 83,166, 76,
+ 41,204,120,245,106,121,165,191, 86, 41,208,211,205,195, 99,195,177, 99,199,108,154, 53,107, 6, 95, 95,223, 60,126,102,102,171,
+ 36,160,180,150,254, 89,235,216,148,190, 60,215,116,238,168,214, 29,231,205,155, 7,189, 94,143,155, 55,111,226,193,131, 7,200,
+200,200,192,157, 59,119,164,102, 66,225,184,106,185, 14,107,236,159, 67,188,148,238,135, 15,135, 81, 28, 14, 7, 7, 14, 28, 64,
+ 92, 92, 28, 0,192,207,207, 15,211,166, 77,131, 94,175,199,164, 73,147,201,185, 36,147,212,186,250, 39,128,214, 0,190, 67,133,
+200,235, 72, 8,225, 83, 20,149, 3,192, 5,141,243,201,162,251, 39,205, 73,115,254,123, 56,255,145,168, 55,215,225,218,159, 96,
+254,110,154,143, 89, 57,225,123, 66, 89, 61,122,250,251,132,134, 4, 51, 58,117,234, 4, 23, 23, 23,248,249,249, 33, 51, 51,147,
+103, 97, 97, 81, 95, 62, 53,133,255,224, 9,105,109,218,180,177, 88,190,124,185,249,192,129, 3,217, 46, 46, 46, 32,132, 32, 46,
+ 46, 14, 17, 17, 17,229,123,247,238,149,149,217, 15,147,198, 94,251, 77,209,144,124,106, 15,128, 50, 0,107,156,115,114,126,158,
+ 63,119,110,112,187,246,237,103,132,132,132, 48, 68, 2, 19,246,250, 85, 51,249, 0,176,246,135,227,230, 35, 2, 39,226,123, 79,
+160,215,132,154,243,200, 85,175,103,102,246,172,140,143, 70,245,243,252, 98,193,116,195,216,177, 99,133,102,102,102,112,113,113,
+129,165,165, 37, 82, 83, 83,145,157,157, 77,206,158, 61,171,184,247,248, 37,251,244,165, 71, 25,124,115,135,134,228, 37,148,251,
+ 15,250,248,245, 71, 31,125,100, 57,117,234, 84,211, 14, 29, 58,176,121, 60, 30,120, 60, 30,242,243,243,145,146,146, 82,126,246,
+236, 89, 69,153,221,144,146,216,107,199,228, 13,204,117,168,242, 31, 31,154,114,235,114,200,226,231, 79,159, 78, 54, 2,109,203,
+203,203,157, 12, 6, 3,197, 96, 48,114,141, 70,227,211,114,185,124,191,198, 47,100, 27,157,235,176, 97, 48, 24, 12, 28,131,193,
+ 0,169, 84,138,203,151, 47,179, 94,189,122,181,250,201,147, 39,171,115,114,114,160,211,233, 48,102,204, 24,248,249,249,225,218,
+181,107, 40,200,207, 63, 91, 23, 87, 18, 80,202,203,206,158, 54,107,214,172,243, 97, 97, 97,140, 39, 79,158,216, 28, 56,112, 96,
+ 95, 77, 2,102,242,228,201,198,252,204,204,105, 26,160,180,142,254, 89,215,216, 44,188,112,108,231,147,145,163, 3, 91,134, 4,
+173,102,119,235,214, 13, 54, 54, 54,232,217,179, 39,202,203,203, 45, 90,180,104, 81,223,216,148,251, 15, 30,151,218,182,109, 91,
+225,182,109,219,196,211,167, 79,199,130, 5, 11, 0, 0, 42,149, 10,151, 46, 93,194,226,197,139,243, 50, 89,157,149,245,245,207,
+183,150,170, 74, 1,118, 3,128, 63,128, 84,208,142,239, 52,104,208,248,103,162, 50,169,180, 3, 42, 18, 75,159, 67,197,203,121,
+253,185, 14,111, 61,120,134,234,105, 62, 42,224,144,160,119,157,250,106,206,210, 13,190, 76,157,204,146, 77,169,205,146, 95,190,
+164,234,203,121, 88,149, 79,205,220, 75, 97,157,118,180,211,250,181,107, 23,125,255,253,247,253, 42, 67, 56, 8, 4,130,167, 42,
+165,242,138,173, 70,179,189,204,220,235, 74, 99,115,243,101, 3,249, 0,230, 90,198,198,238, 8, 24, 49,102, 19,223,202,157,189,
+114,221, 94, 53,147,193,208,166,228, 20,224,123, 79, 64,216,128, 5,146,101, 90,224,185,212, 65,159,111, 29,152,244,245,151, 95,
+126,177,118,205,154, 78, 34,145,168, 87,185, 94,239,101, 52, 26, 1,163, 49,185, 76,169,188, 65,202,203, 31,106,252,130,182,240,
+205, 29, 72,131,243, 18, 90,180,144, 91,189, 14,239,116,112,255,254,133, 39, 78,156,248, 83,219,173, 53,154, 29,101, 22, 45,162,
+ 27,210,246,234,101,212,192, 93, 72, 36,119,235, 50, 93,210,185, 14, 27,248,246, 97, 52,206,182,180,180, 60,212,175, 95, 63,126,
+255,254,253, 49,116,232, 80,116,235,214, 13, 70,163, 17,132, 16,200,229,114, 28, 63,126, 28,155, 54,109, 74,110, 10,172,169,143,
+ 79, 3, 92,225,253,254,251,144,182,109,219, 30,168, 75,192,188, 21, 89,245,250, 36,214, 61, 54,121,201,122,243,225,233,227,231,
+175,247,212,202,114, 45,172, 5,122,241,243,103, 79, 25, 13, 31,155,222,114, 67,220,241,206, 99, 70,141,154,207,100,177,122,190,
+ 93, 1, 73, 94, 36, 36,196, 86, 38,149,134,223,180,203,141,236, 75,149,177,235,104,199,119, 26, 52,104,252,211,133,214, 80, 84,
+248,107, 85,165,228,169, 53,215, 97,165,213,135,197, 98, 73, 82, 79,207,153, 88, 23, 59, 27,232,247,214,146,133,122,115, 29,190,
+253, 59, 29,144, 67,163,249,230,157, 96,164,213, 86, 23,178,223, 43,223,152,176,136, 37, 64, 18,244,154, 0, 72, 18,128,200,185,
+ 21,124,157,214,126, 85,189, 77,181, 62,100,223, 57, 46,167, 88, 13,220,130, 66,113, 11, 10, 69,141, 78,187,108, 22,167,184,190,
+122,190,223,246, 76, 64,246, 87,219,254, 62,103,189,226,225, 47,156,207,127, 27,222, 20, 22,158, 6, 32,114,142,138,178,191, 16,
+ 21, 53,246,139, 37, 75,198, 56, 56, 58,122,216,216,216, 88,154,154,154, 50,238,223,191,159,166, 87,171,119,180, 3, 14,190,181,
+166,214, 11, 13,112,197, 59, 51,179,213,199,163, 70,205,167, 88,172, 30,213, 5, 12,209,235,239,184, 3,187,234,178,100,125,232,
+216,116,225, 57,244,123,107,201, 2, 19,152,213,144,190,145, 93, 81,143,117,208,235,215, 33, 62,190,134, 62,223,232,190,180,150,
+162, 40, 57,104,199,119, 26, 52,104,252,115, 81,153,239,240,220,255,245,129,251,211,156, 52,231, 63,136,147,137,138, 85,116,244,
+249,164, 57,105, 78,154,147,230,164,209, 32,176,232, 83, 64,131, 70,131, 97,192, 31,211, 96, 52,104,208,160, 65,131, 70, 37, 42,
+125,179,170,227,103,160,194,117,167, 54, 85,218,152,213, 4, 31,162,108,163,105, 78,154,147,230,164, 57,105, 78,154,147,230,252,
+215,113,214,199,253,119, 92,205, 88,233,147, 85,229,155,245,127, 5,218,172, 74,115,210,156, 52, 39,205, 73,115,210,156, 52,231,
+ 63, 29, 14,111, 69, 86,245, 15,128, 70, 6, 44,165, 65,131, 6,141,127, 42, 66, 66,192, 32, 4, 20, 33, 33, 12, 66, 78, 48, 9,
+ 9,100, 18,130,191,148, 10, 36, 48,176,230, 96,182,159, 77,180, 52,165,207, 56, 13, 26,255, 40,228,162,150,164,210,180,143,214,
+255, 95,184,138,197,226, 61, 0,168,188,188,188,217, 0, 50,233, 83,242,191, 7, 43, 43,171,126,122,189, 30, 50,153,236,202, 63,
+177,125, 45, 61, 48,138, 48,208,162,234, 7,130,204, 23, 41, 56, 84, 83,217, 22,158,152, 2,234,143, 88, 92,148, 17, 47, 18, 94,
+225, 84, 35, 14,199, 24,210,223,101, 23, 0,156,143,206,154,143,255, 78, 92,173,230,182,182,182, 23, 89, 44, 22,203, 96, 48,204,
+149, 72, 36, 81,181, 11,161, 64, 38, 0,176,201,181, 21,210, 60,187,229,159,127, 74,177,203, 52,251,165, 26,149,178,148,201,102,
+190,230,177,197,183,231, 76,103,156, 47, 81,116, 77,168,105,255,240,240,240, 90,179,120,183,242,196, 16,134,161,229, 48,191,214,
+105,169,223,109,239,244,125, 47,119, 27,118, 90,214, 99,209,198,221,165,123,184, 22,110,195,166,140,165,162, 88, 2,106,242,254,
+253, 69, 10,122,148, 53, 28,235, 1,171,114,192,151,205,227,185, 24,244,122,123, 10, 32, 76, 22, 43, 95,167,209,100,113,128,248,
+ 21,128,244,159,206,201,225,241,156, 13,122,189, 61, 0,252, 47,214,147,198,187,168, 85,104,137, 68,162, 24, 6,131,225, 92, 61,
+ 25,110,101, 62,193,202,223,170,111,163, 40, 10, 6,131, 33,187,164,164,164, 67, 35,142,111, 6, 96, 44,128,202, 37,234, 71, 0,
+ 28,199,135, 59, 28,155,113, 56,156,165, 66,161,176,175, 74,165,106, 5, 0, 38, 38, 38,207,149, 74,229,213,242,242,242,239, 62,
+144,151, 5,224, 99,145, 72,212,135,193, 96,244, 33,132, 80,132,144,107, 10,133,226, 42,128, 19, 0, 62, 36, 82,130,137,157,157,
+221, 58, 43, 43,171, 9, 43, 86,172, 40,178,182,182,246, 94,188,120,241,163,226,226,226,223, 10, 11, 11, 87,161, 17, 57,234,254,
+203,240, 16,139,197, 71,216,108, 54, 51, 43, 43,171, 15, 0,184,184,184, 92,211,106,181, 6,137, 68, 50, 17,192,171, 70,242, 9,
+ 1,116, 17,137, 68, 29, 68, 34,145,191,193, 96,104,241, 54, 63,227, 11,133, 66,113,179,188,188, 60, 6,192,125, 0,202,255,161,
+ 49, 98,202, 98,177,194,222,246,117, 47, 0,242,127,218, 77,128, 48,208, 34,225,121,162,119,149,240,106,229, 83,123, 97, 10,174,
+ 53,148,109,176,208,234,219,203, 97,216,240,225, 3, 24, 0,160,213,157, 31,118,245, 70,238,153,255,112,115,154,143, 30, 61,250,
+110, 88, 88,152,165, 70,163,193,236,217,179,143, 68, 71, 71,239,146,201,100, 43,234,188,113,136, 44, 23,111,222,118, 73, 64, 81,
+ 12, 0,176, 51, 26, 13,118,111,222,188,242, 74,120,118,119,240,243,231,247,214,171, 18,175,222, 55, 82,236, 57,229,232,153,216,
+144, 74,180,112, 71,192,176, 49,163,134,174, 89, 19,130, 9,227, 38, 52,121,254, 92,109,226,100,150,202, 45, 86, 9, 61,173,109,
+237,134,175, 89, 27, 78,221,190,117,122,120,216,129,208,171,211,167, 91,247,165,197, 86,131, 64,173,101,177,186,152,123,122,250,
+143, 59,125, 26, 34, 23, 23, 22,139,199, 99, 0,128, 94,163,113, 81,100,101, 57, 28, 27, 62,188,115,200,203,151,215, 67,128, 7,
+ 52,231,255, 23, 78, 26,141, 17, 90, 12, 6,195,249,205,155, 55,118, 66,161,176,226,102, 76, 8, 12, 6, 3, 12, 6, 67, 85,242,
+ 98, 66, 72,213,183, 94,175,135,143,143, 79,131,222,104, 1,244, 5,240, 73,239,222,189, 3,191,251,238, 59,182,175,175,111,101,
+202,144,158, 43, 87,174,252, 33, 46, 46,238, 36,128,131,168, 8,222,216,208, 55,222, 65, 66,161,240,240,230,205,155,205, 6, 12,
+ 24,192,114,116,116, 4, 69, 81,200,203,203,235, 18, 29, 29,221, 97,241,226,197,115,149, 74,229, 36, 0, 23, 27,113,126, 90,155,
+154,154,134,143, 26, 53,202,185, 87,175, 94,252,150, 45, 91,194, 96, 48,224,241,227,199,211, 99, 98, 98,198,159, 60,121, 50, 88,
+ 46,151, 7,162,225,249,218, 40,145, 72, 52,213,204,204,108, 93, 80, 80,144,213,164, 73,147,184,207,158, 61, 43,113,119,119,167,
+110,223,190,109,123,252,248,241,185, 27, 54,108,248, 88, 38,147,173, 82, 40, 20,191,162, 1, 57, 20, 77, 77, 77, 99, 24, 12,134,
+115, 67,132, 48,128,198,136,225,118, 77,155, 54, 61,126,235,214,173,166,233,233,233,134,145, 35, 71, 30, 2,128,171, 87,175,250,
+234,116, 58,106,224,192,129,231,179,179,179,199, 2,120,220,192,182,183,177,178,178, 58, 51, 97,194, 4, 43, 15, 15, 15, 65,211,
+166, 77, 41,161, 80, 8, 38,147,137,210,210, 82,199,103,207,158,245,127,240,224,129, 42, 58, 58,186, 88,163,209, 12, 7, 16,223,
+136,235,212,205,206,206,110, 50,155,205,110,173,215,235,157, 0,128,197, 98,189,209,233,116,207, 36, 18, 73, 24,128,187, 31, 58,
+ 64,236,237,237,119,174, 91,183,206, 70, 34,145,144, 13, 27, 54,236,148,203,229, 83,255,169, 55,131, 35,191,157, 64,204,163, 7,
+ 64, 69,218, 28,170,134,254, 71, 1,224,124,254,249, 18,116,232,216, 25, 19, 39,124, 92, 47,231, 71,253,156, 55,179,185, 28,107,
+181, 90,125,183,180, 76,115, 66, 40,224,143,157, 48, 62, 32, 25, 0,206, 95,184, 62,182, 83, 39,203,107,230, 2,222,199,124, 62,
+191,155, 78, 91, 94,244,251,149,236, 47, 27, 35,170,156,156,156, 46, 90, 90, 90, 10,138,139,139,243, 10, 10, 10,126, 26, 54,108,
+216,218,131, 7, 15, 90,166,165,165, 33, 43, 43, 11,139, 22, 45, 18,101,103,103,207,143,143,143,191,167,213,106,107,181,108,201,
+229,197,219, 87, 46, 31, 17,100,110,110,195, 20, 10,204, 96,106,110, 5,119,143,182,232,210,109, 24,134, 12,157,129,148,228,184,
+ 46, 7, 15,172,137,123,243, 38,250, 91,145, 85,179,181, 82,105,211, 90,239, 75, 45,155,163,215,240, 81, 21, 34, 43, 40, 40, 4,
+ 47, 19, 19,229,233,175, 25,159,157, 59,205, 18, 12,233,231,195,211,107,243,210,111,223, 58,221,180, 71,207,145, 0,208, 33,236,
+ 64,232,213,207, 38, 90,246,219,121,164, 68, 78, 63,146,106,191,119,174, 97,179,167, 14,218,182,205,206,111,238, 92,142,226,245,
+235,242,212,221,187,203,242,111,222, 52,176,120, 60,226, 50,120, 48,101,219,167, 15,127,238,139, 23,156, 59, 27, 54,248,179, 67,
+ 67,221, 87,149,151, 31,166, 57,255, 79, 57,255,237,168,116,130,175,190,250,240,231, 58,133, 22, 69, 81, 16, 10,133, 56,118,236,
+ 24,216,108, 54, 88, 44, 22,216,108,118,173,127,187,186,186, 54,164, 34,163,197, 98,241, 15,187,118,237,178, 31, 52,104, 16,248,
+124,126,213, 6, 38,147,137, 1, 3, 6,160,127,255,254,236,156,156,156,241,199,142, 29, 27,191,126,253,250,124,169, 84,186, 0,
+111, 19, 67,215,129, 62,222,222,222, 17,151, 46, 93, 50, 81,171,213,184,121,243, 38, 74, 74, 74,192,229,114,225,236,236,140,129,
+ 3, 7,178, 18, 19, 19,173, 6, 12, 24, 16,241,242,229,203, 0, 0,215, 26, 80,215, 14,118,118,118, 55, 78,156, 56,193,111,219,
+182, 45,149,146,146, 2, 63, 63, 63, 0, 64,105,105, 41, 70,142, 28,201,159, 52,105,146,199,248,241,227,239, 75, 36,146, 94, 0,
+ 98,234,225,107, 47, 22,139,127, 29, 53,106,148,227,250,245,235,205, 76, 77, 77,145,158,158,158, 43, 22,139,189, 42,207,247,248,
+241,227,185,195,134, 13,115,216,180,105,211,246,240,240,240, 47, 37, 18,201, 84, 0,177,117,170,214,183,130, 88, 32, 16, 32, 63,
+ 63, 31, 71,142, 28,193,252,249,243,193,100, 50, 33,145, 72,112,252,248,113,124,246,217,103,149,130,166, 65, 98, 88, 32, 16,244,
+247,244,244,220,119,245,234, 85,103, 11, 11, 11, 56, 58, 58, 50,190,254,250,235,214,238,238,238, 38, 77,154, 52, 97,230,230,230,
+ 34, 34, 34,194,125,242,228,201,103, 50, 51, 51,167,107, 52,154,122,167,212,236,237,237,247,159, 59,119,206,245,249,243,231,216,
+189,123, 55,138,139,139,193,229,114, 97, 97, 97, 1,177, 88, 12, 47, 47, 47,106,249,242,229,130, 97,195,134, 9, 22, 44, 88,176,
+ 95,171,213,182,107,192, 53,106,107,103,103,183,167, 79,159, 62,238,161,161,161, 22, 98,177, 24,149, 47, 6,165,165,165,206,233,
+233,233, 93,130,130,130, 2, 99, 98, 98,210, 36, 18,201, 28, 0, 79, 26, 57,112,218,181,108,217, 50, 96,228,200,145,204,220,220,
+ 92,132,133,133, 5,200,229,242,118,141, 16,151,127, 43,196, 60,122,128,217,243, 22, 41, 28, 93, 92, 56,151, 46,238, 27, 29,126,
+170,249, 35, 11,147,138,132,212, 82, 21,202, 3, 71,189,236, 56,112,208, 12,206, 71, 67, 71, 42,126,254,113,187,168, 33, 66,139,
+205,229, 88, 31, 57,188, 53,243,214,237,152,214,151,163, 31, 12, 30, 61,124, 56,225,112, 44,220, 1,224,203,197,159,179, 35, 34,
+ 35, 15, 12,232,223, 57,167,103,143, 14,153, 19, 39, 45,113,109, 68,117,155, 55,111,222,252,122, 92, 92,156, 61,143,199, 67,113,
+113,177,245,207, 63,255,188,181, 71,143, 30,140,212,212, 84, 36, 38, 38,226,245,235,215, 40, 45, 45,197,128, 1, 3, 68,177,177,
+177, 63, 1,168, 85,104,149, 51,250,174,115,108,162,219, 97,109, 34,108, 90,110,144,217, 17, 93,110,203,203,231, 46,183, 57, 26,
+166,242,179,119,240,241,250,100, 90, 48,214,172, 61,201,254,237,200,198,160, 43,209, 71, 1, 70,211,218, 51, 2, 16,116, 91,185,
+106, 5,100,114, 13, 38, 77,152,133,201, 19,102, 89, 19,104, 29,136, 65, 45,212,170, 74, 44, 76, 57, 47,162,118,237,221, 58, 10,
+128,115, 53,177,117,133, 22, 91,181, 99, 13,139,213, 57,224,135, 31,108, 91,207,156,201,123, 18, 26,170, 44,188,121, 83,229,249,
+209, 71, 37,126,159,126,170, 1, 0,249,235,215,156,151,193,193, 2, 91,127,127,147,174, 75,151, 90, 26,180, 90,241,154, 53,107,
+ 58, 5, 85, 36, 47,111, 20,167,235,216,177,134,160, 3, 7, 58,222, 92,178,164, 55,165,211, 49, 7,119,237,250,120, 67, 88,216,
+155,191,194,249,159,172,103,206,141, 27,154, 98,119,119,248,141, 28, 89,228,106,103,167,249, 79,182,253,175,212,147, 70, 21, 42,
+125,181,102, 87,127, 67, 69, 84, 84, 84, 47, 0,215, 1,132, 6, 4, 4,132, 0,128,185,185,121,190, 84, 42,181,139,136,136,168,
+ 87,100,177,217,108, 56, 56, 56,192,203,203, 75, 34,145, 72,236,235,168, 64,150,209,104,116, 38,132, 84, 89, 95,106,131, 70,163,
+ 65,114,114, 50,218,180,105,147,141,138, 68,180,181, 26,117, 4, 2, 65,106, 98, 98,162, 77, 66, 66, 2, 98, 98, 98,224,238,238,
+ 14, 75, 75, 75,176,217,108,232,116, 58,200,100, 50,120,123,123,131,199,227,161,125,251,246,133, 74,165,210,189,158, 41, 32,158,
+ 80, 40, 76,190,113,227,134,139,159,159, 31, 30, 62,124, 8, 23, 23, 23,136,197, 98, 0,192,235,215,175,113,251,246,109,124,244,
+209, 71,136,139,139,195,152, 49, 99,178,148, 74,165, 23, 0, 77,109,132, 86, 86, 86,185, 87,175, 94,205,246,245,245, 85, 43,149,
+ 74, 70,126,126, 62,251,230,205,155,122,185, 92, 46, 42, 45, 45,101, 75,165, 82,182, 76, 38, 99, 41,149, 74, 54,131,193,224,168,
+ 84, 42,246,149, 43, 87,152,229,229,229,117, 6,200,172,188, 78,145,145,145,240,245,245, 69, 68, 68, 4,190,248,226, 11,220,185,
+115, 7, 46, 46, 46, 56,113,226, 4,150, 46, 93,138,164,164, 36,216,216,216,160,101,203,150,245, 93, 35,120,120,120,164, 60,125,
+250,212,131,195,225, 84,230,117,172,204,151,135,130,130, 2,188,122,245, 10,111,222,188,129,167,167, 39, 38, 76,152,240,234,205,
+155, 55,158,245,245, 60, 39, 39,167,130,231,207,159,219,180,105,211, 6,249,249,249,176,176,176,128,185,185, 57, 44, 44, 44,170,
+254,118,119,119,199,146, 37, 75, 32, 22,139, 37,106,181,218,190, 62, 17,228,235,235,123,241,202,149, 43, 54,102,102,102,200,203,
+203,131, 76, 38, 3,139,197,130, 64, 32,128,141,141, 77,149,144, 79, 78, 78,198,208,161, 67, 11, 83, 83, 83, 7, 53, 66, 36, 49,
+236,237,237, 19,227,227,227,189, 8, 33,200,204,204, 68, 82, 82, 18,230,205,155,151,172, 86,171,125,240, 15,202,217, 87,205,239,
+138, 51,117,218,108,206,168, 17,221,180, 47,158, 71, 81, 60, 99, 18,218,181, 54, 43, 5,128,199,207,100,230, 26,134, 55, 90,180,
+ 10, 32,167,206,220,229,254,122,240,103, 54,140,176, 7,133,164, 23,201,248,166, 54,238,129,125, 28,102,126,254,249,244,214,189,
+123,244, 98,200,149, 74,187,159,126,218,214, 62, 53,245,133, 29, 0,184,187,183,144,204,157,187, 56,214, 84, 40,148, 92,191,125,
+195,248,253,247,251,159, 93,186,150,187,183, 1, 85,118,247,242,242,186, 23, 25, 25,105, 99,103,103, 7,115,115,115, 40,149, 74,
+148,151,151, 35, 33, 33, 65,125,236,216, 49,157,153,153,153,105, 94, 94, 30,164, 82, 41, 40,138, 66,100,100,100, 38, 0,183,247,
+137, 42,125,180, 0, 96,222,144, 22,236,150,125,189, 44, 57, 60,189,137, 9,251,165, 3, 40, 3,143, 34, 34,251,243, 23, 31,183,
+ 57,127,249,225,196, 81,163,191,176,237,217,107, 20,130, 86, 7,234,114,114, 50,253,202,209, 51,177, 38, 31, 45, 31, 79,244, 29,
+ 57,102,212,199,107,214,132, 32, 36, 40, 20, 81,145,167, 75, 69, 66,134,198,204,130,109,238,223,165,187,122,201,252, 17, 89, 10,
+ 69,142,203,154, 77,199, 38, 12, 29,177,196,185, 71,207,145,184,125,235, 52,194, 14,132,198, 80, 38,132,158, 70,124, 15, 33,128,
+165,133,187,251,156,133,201,201,156, 39, 33, 33, 10,125, 78, 78, 73,135,197,139, 11,107, 42,155,125,249,178,144,235,232,104,102,
+ 57,124,184,213,118, 55, 55,162,147, 72,246,212,228, 99, 84, 19,103,180, 72,100,113,244,252,249,126,132,205,238,181,236,171,175,
+ 76, 2, 2, 2, 32,147,201,112,242,228, 73,236,217,189, 91,227,224,224,240,212,241,217,179,184,214, 50,217,234,134,114,118, 88,
+188,184,208, 96, 48, 80, 31, 47, 93, 58,224,249,235,215,125,243, 36,146, 38, 0,224, 96,101,149,213,193,221, 61,102,127, 84, 84,
+210,206,166, 77,141, 13,173,231, 47, 23, 46,216,135,167,167,207,180,178,178, 50,201,151, 72, 88, 60, 46,183,168, 75,203,150, 39,
+126, 92,181,234,186, 62, 62,158,195,119,118, 54, 51, 15, 8,104,116,219, 59, 44, 94, 92, 88, 44,151,179, 22,174, 93,219, 61, 35,
+ 63,191,137, 66,163,241,148,202,229, 98,131, 78,199, 48, 19, 8,138,154,121,123, 75, 84, 55,111,230, 54, 43, 43, 91,180, 23,144,
+252,183,174,117, 77, 90,228,111,132,247,227,104,253, 41,215,225,245,128,128,128, 63,173,174, 33,132, 52,200,154,197,102,179,223,
+153,166,170, 3, 28,138,162, 16, 27, 27, 11,107,107,107,136,197, 98,240,120,239, 38, 31, 44, 40, 40,192,157, 59,119,240,226,197,
+ 11,180,109,219,182,114, 26,163,118, 69,196,227,125,190,105,211, 38, 11,173, 86,139,152,152, 24,116,232,208, 1, 60, 30, 15, 28,
+ 14,231, 29, 17, 40,145, 72,208,170, 85, 43, 44, 91,182,204,124,253,250,245,159,107, 52,154, 90,223, 72, 89, 44,214,130, 89,179,
+102,217, 85, 90,176,178,178,178,208,190,125,251,170,237,182,182,182,120,252,248, 49, 58,116,232, 0,103,103,103, 4, 6, 6,218,
+133,133,133, 45,208,235,245,223,213,198,201,229,114, 25,190,190,190, 29, 1, 64, 40, 20,130,193, 96,188, 52, 51, 51,179,181,183,
+183, 23,154,153,153,253,169,141, 7, 14, 28,144, 50, 24, 12, 93,189,106,128,193, 64, 94, 94, 30, 90,183,110,141,210,210,138, 12,
+ 46, 74,165, 18,158,158,158,144,201,100, 85,162,213,209,209, 17, 42, 85,221,174, 95,109,218,180, 9,241,241,241, 25, 40, 20, 10,
+121,108, 54, 27, 79,158, 60,129,159,159, 31,142, 29, 59, 6, 87, 87, 87, 8, 4, 2, 36, 39, 39,195,215,215, 23, 55,110,220,128,
+173,173, 45, 90,181,106,197,179,179,179,187, 85, 92, 92,124, 45, 35, 35, 35,164,142,122, 50, 68, 34, 17,110,220,184,129,253,251,
+247,227,245,235,215,200,201,201,129,169,169, 41,218,181,107,135,150, 45, 91,162, 91,183,110, 72, 78, 78, 6, 85,127,103, 18,123,
+121,121, 69, 61,124,248,208,134, 16,130,176,176, 48, 40, 20, 10,104,181, 90, 48, 24, 12,240,249,124, 88, 90, 90,162,111,223,190,
+176,181,181,133,151,151, 23,142, 31, 63,110, 51,100,200,144,223, 37, 18, 73, 59, 0,121,245,157, 87, 75, 75,203, 69,193,193,193,
+ 46,118,118,118, 72, 79, 79, 71,105,105, 41,236,237,237,209,187,119,111,167,232,232,232, 69, 58,157,110,219, 63,229, 65, 86,205,
+241,157,186,116,113,223,104,175,102, 37,190,109,189, 5, 46, 17, 81,246, 46,199,162, 36,173, 0,160,117, 11,251,231,163, 3, 4,
+ 89, 79,158, 71,101, 93,186,120, 58,230,197, 75, 68,160, 1, 83,219,165,101,154, 19,151,163, 31, 12,246,107,219,222,184,105,227,
+210,161,243,231,205,228,217,217,207, 64,126,230,105, 68, 95,141,117, 93,250,197, 44,219,239,182,252,114,254,114,244, 3, 70,105,
+153,102,117,195, 76, 89,174, 59, 15,254,216,205, 70, 94, 24,142,148, 68, 46, 76, 76, 91,195,221,189, 57,100, 50, 25,248,124, 62,
+127,194,132, 9,134, 21, 43, 86,148,153,153,153, 9, 40,138,194,181,107,215, 36, 0, 6,213,199,171,182,179, 36,134,114,157,158,
+112,153, 70, 66,153,170, 40, 67, 49,247, 89, 66, 26, 6,246,239,147,223,163,115,235,245, 43,214,108, 89,233,213,220,207,118,250,
+204, 80,246,218,144,137,187, 65,161,103, 77, 60,137, 41,184, 74,157, 56,101, 2, 96,232,154,111, 66,144,154,154,108, 57,251, 19,
+105, 40,139,103,226,232,227,214,221,116,247,254,107,131, 61, 61,155, 54, 89,178, 32,240,220,214, 31,182, 14,173,110,217, 58,120,
+ 32,248, 12,128,126, 13, 57,183,255, 34,180,153, 28, 21, 5, 69,102,166,174,248,214, 45,117,191, 31,126, 40,116, 25, 52,104,155,
+182,188,220,166,242, 86,193,160, 40, 80,149,174, 19, 70, 35,197, 90,182,140, 65, 88, 44,232, 44, 45, 63, 65, 73, 73,243,250, 56,
+191,200,205, 29, 61,113,230,204,161,103, 46, 92, 64,211,166, 77,171,158,103, 22, 22, 22, 88,186,116, 41, 22, 47, 94,204,123,252,
+248,113,167,240,240,240, 78,223,109,222,108, 15, 96,116, 67,234,121,233,254,125,203, 79,215,172, 89,213,182, 67, 7,215, 67, 71,
+142,240, 60, 60, 60, 0, 0,175, 94,189,242,218,184, 97,131, 91,107, 95,223,252,245,159,127,126,240,249,138, 21,173, 0,220,170,
+139, 51,239,230, 77,109,120,122,250,204,171,215,174, 89,180,110,221, 26, 0,144,148,148,100,183,125,251,246, 89,173, 2, 3, 39,
+173,153, 59,119,117,128, 90, 45, 53, 43, 40,224, 5,236,220,201, 58,250,241,199,245,114, 86,214, 19, 0,122, 79,159,254,121,207,
+ 62,125, 90,142,158, 57,211,202,213,213,149, 18,137, 68, 40, 47, 47, 71, 78, 78,142,229,243,231,207, 61,162,228,114,217,169,251,
+247,195, 96, 48, 12,248, 47, 94,235, 26,181,200,223,204,146,245,103, 77,241,246,187,119, 84, 84, 20, 1,208, 59, 32, 32,224, 70,
+229, 3,220, 96, 48, 52, 72,100,177, 88, 44, 80, 20,213, 80,177, 5, 66, 8, 10, 11, 11, 81, 88, 88, 88, 53,117, 36,145, 72,112,
+245,234, 85, 36, 39, 39,131,205,102,131,195,225,160,188,188,254, 28,180, 66,161,176,127,255,254,253, 89,247,239,223,135,187,187,
+ 59, 76, 76, 76,170,234, 85,249,225,112, 56,112,112,112,128, 76, 38, 67,191,126,253,216, 59,118,236,232, 95,151,208, 50, 55, 55,
+255,104,236,216,177,220,202,255, 21, 10, 5,152, 76,102,149,104, 81, 40, 20, 40, 46, 46,134, 84, 42,133, 90,173, 70,215,174, 93,
+185, 81, 81, 81, 31, 21, 21, 21,125,215,144,246,151,149,149, 41, 36, 18,137, 69,207,158, 61, 45, 15, 30, 60,152,212,181,107, 87,
+239,119,122,218,245,235,106,181, 90,205,102, 48, 24, 13,202,163,119,248,240,225,170,115,255,230,205, 27,236,222,189,187,106, 91,
+114,114, 50,118,236,216, 1, 66, 8, 8, 33,117, 94, 35, 31, 31,159, 33, 97, 97, 97, 29, 14, 29, 58, 84,194,100, 50,145,148,148,
+132, 35, 71,142,128, 16, 2, 91, 91, 91,148,149,149, 33, 63, 63, 31,215,174, 93,131, 94,175,135, 72, 36,130,147,147, 19,127,193,
+130, 5, 61, 66, 67, 67,217,117, 9, 45,131,193, 96, 96, 50,153,112,115,115, 67, 80, 80, 16,212,106, 53, 56,156, 10,125, 41,147,
+201, 32,149, 74, 17, 23, 23,135,244,244,116, 16, 66,234,124,200,240,249,252,192, 67,135, 14,217,113,185, 92,168, 84, 42,200,229,
+114,100,101,101, 33, 35, 35, 67, 45,145, 72,244,166,166,166, 12, 55, 55, 55, 6,143,199,227,141, 28, 57,146,170, 20,156, 1, 1,
+ 1,214, 97, 97, 97,227,180, 90,109,125, 34,201, 86, 44, 22,175,156, 53,107, 22,191,122,159,205,203,203,195,232,209,163, 5,119,
+239,222, 93, 33,147,201,142, 0, 40,248,135, 61,208, 72,248,169,230,143, 98,162,147,124, 35,162,236, 93, 50,178, 13,221,151,126,
+185,133, 5, 0, 63,239,249,182,123, 68,212,155, 59, 62, 77,243,179,194, 79, 53,127,100,105,249,162, 62, 33,192,232,219,203, 97,
+152, 80,192, 31, 59,122,248,112,242,211, 79,219,218,207,159, 55,147,231,214,124,105,133,133,147,109,135,126,250,111,168, 50,213,
+ 43,254, 79, 63,109,107, 63,122,248,152,184,215,175,211,247,244,237,197, 59,126,245, 70,238,217,186, 44,134,118,214,124, 39, 1,
+ 79, 9, 39,247,150,240,110, 33,196,227, 39, 73, 56,121,226, 30, 90,180,234, 2,141, 70, 3,189, 94, 47, 28, 54,108, 88,217,177,
+ 99,199,212, 47, 95,190,148,171, 84,170, 94, 0, 94,214,215,248,236,236, 4,163,183,184, 75, 57,199,132,167,151,151,114,202,150,
+175, 14,255,184,125,231,129, 29, 44, 29,156,216,182, 66,227,217, 33, 3, 58, 29,217,191, 55,104,241,234,224, 35,232,216,105, 96,
+215, 23, 73,183, 90, 2,120, 90,163,120, 77, 69, 20,227,228, 41,125,106, 74,202,208,140,244,244,236,230,246, 98,237, 43, 41,209,
+ 45, 90,254,203,128,158,189, 2,219,120,180,240,231,190, 72,184, 65, 5, 45, 27,247,219,154, 77, 91, 39, 84,138,173, 43,151,127,
+235,245,201, 39,247,184, 7, 15,214,110, 29,255,183,129,195,227, 57,139,220,220, 88,175, 15, 30, 84,185, 15, 27, 86, 2, 0,218,
+242,114,155,215,233,233,230, 2,129, 0,132, 16,232,116,186,119,124,136, 43,253,134, 91,123,123,219, 55,132,243,245,215, 95,183,
+ 89,182,108, 25,242,242,242,160,215,235,193,102,179,223,191,103, 67,169, 84,226,147, 79, 62,193,206,205,155,187, 52,132,211, 96,
+ 48, 80,159,174, 89,179,234,171, 85,171, 60,230,204,153,195,168,126,239,181,178,178, 66,248,201,147,220, 93,187,118, 57,175,220,
+185,243,147,137, 60, 94, 42, 52,154, 58, 57, 11, 61, 61, 97,149,159,111, 82, 41,178, 0,192,219,219, 27,187,119,239,230,205,152,
+ 49,131, 59,108,216,176, 45,143,219,182,221,190,173, 71,143, 20,235,230,205,205,184, 60,158,115,125,156,149,231, 19, 0,228,106,
+117,235,109,219,183, 91, 62,120,240, 0,249,249,249,200,203,171,120, 31,165, 40, 10, 29, 59,118,164, 38, 79,158,108,222,204,197,
+165, 19, 12,134,255,230,229,254,147, 22,249, 27, 97,118, 13,191,253,225,163,245,182, 65,212,219, 6, 82,213, 30,142,239, 8,150,
+250,132,214,135, 64, 42,149, 66, 42,149, 98,239,222,189,224,112, 56, 85, 15, 95, 0,208,106,181, 13, 17, 45,190,142,142,142, 40,
+ 45, 45, 69,243,230,205,223,177,100,113, 56, 28,176, 88, 44,112, 56, 28,240,120, 60,104, 52, 26,184,186,186,162,172,172,204,183,
+ 46, 78,149, 74,213,206,202,202,170,234, 1,171,121,219, 89, 53, 26, 77, 85,125,181, 90, 45, 74, 74, 74,160, 80, 40, 32,151,203,
+161, 84, 42,253, 26,210, 94,163,209,136,103,207,158,189,242,246,246,110,199,100, 50, 33, 18,137,132, 74,165,178,202,183,168,184,
+184, 24,191,254,250,171,114,202,148, 41, 54,145,145,145,245, 10, 45,138,162,240,217,103,159,129,199,227,161,172,172, 12, 63,253,
+244, 19, 22, 46, 92, 8, 14,135, 3,185, 92,142,221,187,119, 99,201,146, 37, 96,177, 88,208,106,181,216,190,125,123,173, 92, 9,
+ 9, 9,175,239,223,191,239,215,190,125,123,203, 83,167, 78, 21, 12, 24, 48,192,118,208,160, 65, 48, 49, 49,129, 74,165,130, 78,
+167, 67,151, 46, 93,224,227,227, 3,137, 68,130,243,231,207, 23,122,121,121,217, 60,120,240,192,152,151,151,151,241,255,216,187,
+238,240, 40,170,246,123,102,123, 73,175,164,144, 80, 34,164,211, 12,160,244, 18, 90, 18, 12,162, 20, 69, 81, 81,154, 5, 20, 68,
+ 16, 5, 68, 52,128,162,136,130, 82, 44, 96, 16,144,110,168, 1, 19,144, 34, 66, 8, 37, 29, 2,169,187,201,110, 54,201,110,178,
+125,218,239, 15,146,124, 33, 38,217, 77,192,239,167,126,115,158,103,159,157,157,189,115,230,222,185,119,102,206,125,239,123,223,
+107, 67, 92,179,141, 44,134,160,105, 26,229,229,229,168,174,174,134, 90,173,134, 66,161, 64, 73, 73, 9, 4, 2, 1,108,232, 44,
+120,120,120, 60, 21, 25, 25,201, 7, 0,153, 76,134,222,189,123, 99,233,210,165,148,209,104,156, 12,224, 88, 93,178,113, 91, 22,
+186,136,224, 0, 0, 32, 0, 73, 68, 65, 84,183,110, 61,112,238,220, 57,129,159,159, 31,178,179,179,225,229,229, 37,144, 74,165,
+ 54,133,150,143,143,207,247,191,252,242,139,123,189,184,174,191,206, 6,195,189,234,152, 56,113,162,251,142, 29, 59,190,167, 40,
+ 42,230,223,246, 82,115,149, 65,212, 59,210, 89,187, 59, 73, 21,177,240,237,117,130,208,200,123,157,215,153,179, 32,248,244,147,
+ 5, 17,211,226,157,143,184,202,116, 34, 91, 60,227,162, 3, 54, 62,241,196, 40,222, 51, 83,227,242, 68, 34,215,160,205, 91, 62,
+240,246,238, 48,163,145, 12,115,134,135,167, 51,130, 58,137,137,189, 71,178,188, 23, 47,249,208,156,184,227,179,252,159,118, 37,
+141, 21, 11,147, 71, 31, 59, 85, 60,167, 37,238,220,219,213,135, 13,102,105,152, 78,115,157,112,239, 48, 16,189,123,133,192,219,
+171, 10, 91,191,223,141, 46, 93,251,194,108, 54,195,217,217, 89, 78,211,180,149,207,231, 39,218, 35,178, 0,224,244,233,106, 38,
+ 34,162,218,194,175, 97,168, 87,223,248,244,201, 81,227,158, 8, 31, 49, 34,154, 57,153,124,210, 58,176,143, 85, 57,110, 76,239,
+242,227,201, 27,243,148,138, 59,221, 35,122, 12, 66,102, 70,202, 88,150,197, 77,130,104,222,250,148,113, 11,199, 77, 76,102,202,
+238,221, 51, 25, 35,115, 85,182,234,163, 27,227, 98, 99,167, 71, 14, 25, 60,132, 73, 62,245,171, 69,140,138, 44,231, 65, 3, 74,
+ 95,125,121,220,129,111, 19,191, 24,125,252,216,247,221,180,186,194, 36, 78,100, 53,233,164, 81, 84, 7,129, 68,194, 83,167,164,
+ 80, 61,102,204, 48,215,223,143,114,185, 28,135, 14, 29,130, 88, 44,110,248,136, 68,162,134,237, 14, 29, 58,128,168,155, 70,106,
+ 15, 39, 0, 40,149, 74,148,149,149,193,197,197, 5, 94, 94, 94, 40, 43, 43,195,133, 11, 23,144,155,155, 11,161, 80,136,177, 99,
+199,130,215,130,111,115, 83,206, 73, 11, 23,142, 10,235,209, 35,176,169,200, 2, 0,171,213,138,202,202, 74,196,199,199,243,142,
+ 29, 59,230,115,188,168,232, 9, 0,137,173,113,246,137,141,213,148,239,221,219,236,185, 31,125,244, 81,226,252,249,243,146,177,
+ 99,198,188,185,224,163,143, 54,126,185, 99, 71, 49, 77, 81, 62,109, 41, 59,143,199,227, 17, 4,129,128,128, 0, 84, 86, 86,162,
+182,246,222, 8,182,163,163, 35,220,220,220, 64,146, 36, 24,150, 21,254,149,117,221,146, 22,249,135, 96, 75, 35,193,181,229, 79,
+ 22,173,186, 66, 1,192,176,198, 47, 22,134, 97,236, 18, 89, 66,161,208,166,207,149, 61, 86,174,166,176, 71,104,213,231, 85, 42,
+149, 54,220,104,141, 5, 86,125, 62,121, 60, 30,248,124,190,205,151,120,157, 24,226,215,212,212, 96,223,190,125, 24, 58,116,104,
+195,176,148, 86,171, 69,117,117, 53,180, 90, 45, 76, 38, 19,238,222,189,139,211,167, 79,163, 91,183,110,128,157,193, 95,243,243,
+243,175,116,233,210, 37,170,254, 37, 62,124,248,240,142, 63,252,240,131, 34, 38, 38,198,143,101, 89,188,247,222,123, 21,143, 61,
+246,152,103,227,151,188, 45,240,249,124, 92,184,112, 1,221,186,117, 3,203,178, 16,137, 68,200,201,201,129,183,183, 55, 24,134,
+129, 64, 32,128, 90,173,134,147, 83,235, 49, 18,111,222,188,249,226, 75, 47,189,164,112,113,113,233,169,209,104,148, 18,137,100,
+240,217,179,103, 3,172, 86, 43,156,157,157,225,236,236,140,163, 71,143,194,213,213, 21,243,231,207, 47, 50, 26,141, 23, 28, 28,
+ 28, 58, 24,141,198,235,101,101,101,239,181,165,190, 41,138,130, 94,175, 71, 85, 85, 21, 42, 43, 43,161,211,233, 96, 50,153,108,
+230,177, 57, 12, 30, 60, 24, 73, 73, 73,252,132,132,132,111,243,243,243, 1, 0, 65, 65, 65,152, 63,127, 62,223,223,223, 31,119,
+239,222,197,149, 43, 87, 96,181, 90,193,178,108,171, 55,175, 64, 32, 24,254,252,243,207, 15, 10, 12, 12, 36,172, 86, 43, 24,134,
+129,217,108, 70,253,118, 81, 81, 17,194,194,194,120,157, 58,117,122, 60, 63, 63,127, 56,236,155, 88,193, 1, 64,121,209, 65,248,
+ 11,189, 1,158, 51, 88,227, 65,104, 42,218, 23,197, 69,165, 82,125,180,232,253,243, 51,190, 92,107,237, 80,162, 4, 66, 34, 39,
+160,123,248, 72,188,248, 28,133,132, 79,246, 33,176, 83, 8, 10, 11, 11, 49,124,248,112,145, 66,161,120,169,182,182,118,161,189,
+220,201,201,191,211, 39,143, 30,123,122,210,148,233, 81,209,209, 49,212,137, 19, 71,113,243,250,137,140,151,166, 60,165, 98,153,
+ 90,194,221, 85,118, 53, 39,251,114,247,158,189,135,193, 66,209,131,129, 21,107,129, 21,108,203,247, 59, 44, 71,142,248,242,142,
+ 28,252,254,185,103,166,189,208,107,228,200,209,228,137,228, 95,112,229, 98,242,181,117,107, 95, 57,147,240,197,158,225,163,198,
+ 62, 21,225,213,225,194,209,200, 96,243,203, 1, 30, 46,183,183,254, 80,201, 53,150,230,238, 77,169,148, 65,221,115,145, 71, 16,
+ 96, 89,246, 62,145,213, 84,104,241,120, 60,155, 6,128,198,156,141,223, 69,245, 29,234,205,155, 55, 67, 34,145, 64, 44, 22, 67,
+ 40, 20,218,116,191,104,204,153,113,247,238,136,237,137,137,146,230, 68,150, 70,163,129, 70,163, 65,109,109, 45,166, 78,157, 42,
+250,224,242,229, 71, 81,231,250,209, 18,103,160,175,175,217, 65, 38, 43,207,204,204,244, 11, 15, 15,191, 47,191, 58,157, 14, 50,
+153, 12,137, 59,119,138,226, 98, 99,231,142, 60,122,116, 29,108,196,191,106,174,236, 4, 65,192,219,219, 27,110,110,110, 32, 8,
+ 2, 20, 69,161,172,172, 12, 25, 25, 25,184,124,249, 50,248, 4, 65,253,149,117,220,156, 22,249, 7, 90,181,182, 52, 59,116,216,
+210,152,104, 91,132, 22,159,207,111,183, 85,171, 37,216, 51,116, 40,151,203,111, 40, 20,138,129,254,254,254,160, 40,170, 65,104,
+ 53, 29, 58,172,183,126,164,167,167, 67, 46,151,223, 48,153, 76,173,114,178, 44,251,120,191,126,253,176,127,255,126,164,164,164,
+224,206,157, 59, 48, 24, 12, 48,155,205, 48, 26,141,200,200,200, 0,195, 48,136,140,140,132,131,131, 3,228,114,249, 13,179,185,
+245,142,168, 94,175, 87, 10,133,194, 16,153, 76,214,176,207,215,215, 23, 26,141,134, 33, 73, 18,219,183,111,215,249,248,248, 56,
+200,100, 50,187,133, 43, 65, 16, 80,169, 84,232,216,177, 99,131,143, 86, 77, 77, 13,188,189,189,235,133, 5,204,102, 51,156,156,
+156,108, 14, 29, 2, 48,221,186,117,107, 65,163,223,125, 39, 77,154,244,211,238,221,187,187,158, 58,117, 10,151, 46, 93,130,151,
+151, 23, 62,254,248,227, 59, 5, 5, 5,207, 0,184,172, 82, 61, 92,191, 72,123,218,144, 70,163,217,119,227,198,141,199,251,245,
+235,215,240,148, 24, 62,124, 56, 49,124,248,112,207,198,166,126,181, 90,141, 63,254,248, 3,167, 78,157, 2, 65, 16,200,203,203,
+163,141, 70,227, 79,173,141, 82,248,251,251,255,176,116,233, 82, 71,138,162, 26,218,182, 76, 38,131, 84, 42,133, 72, 36, 2,159,
+207, 71, 65, 65, 1,226,227,227, 93,190,250,234,171,239,205,102,243, 35, 0,172,248,151,160,218, 8,107,250, 77,157, 75,100, 88,
+135,140, 45,155, 19, 6,206,156,133,250,161, 67, 42, 50,204, 59, 35,253,102,185, 75,148,183,237,242, 30, 59, 85,252,170,133, 60,
+ 54,254,216,241,212,201,111,191, 57, 95, 24, 20, 20,166, 58,245,107, 90,224, 72,234, 67,194,195,211, 25,154, 10, 29, 10,138,202,
+145, 95,104, 97,131,130,194, 84, 87,254,184, 33,249,228,243,245,221,245, 6, 83,253,208, 97,171,237,244,183, 11,119, 38,172,219,
+ 32, 57, 51,253,165,190, 98,153,204, 15,149, 21, 55, 16, 24,232,133,248,184,158,248,110,199, 5,184,184,184,163, 67,135, 14,224,
+241,120, 14,246,150,189,162,162,130,216,183,235,183, 25,207,191,240,202, 99, 99, 70,199, 82,199, 79, 28, 17,164,156, 60,124,225,
+251, 45,239, 30, 96,249,122, 57,193,214,200, 58,119,241,185,126,251, 86,250, 51, 35,162,167, 66, 38,114,234, 6,132, 54,219, 96,
+ 27, 38, 24,176, 40,218,191,123,133,244,249, 23,102, 14, 24, 51,230, 9,234,196,137,131, 56,113,116,199,239,203,151,119, 62,122,
+167,116,167,232,226,229, 18,233,132,167,231, 84, 37, 29,203,178, 60, 53,190, 75,174,159, 67,111, 35,112,135, 83, 85,141, 59,146,
+ 2, 65, 57,101, 54, 7,116, 28, 51,134,111, 40, 44, 20, 58,118,232, 64, 1, 0, 73,146, 54,133, 22, 90, 24,130,110,202,105,111,
+ 94, 12, 6, 3,152, 22, 98, 39, 54,229, 44, 83,169, 58,215,117,194, 27, 64,146,100,131,200,210,104, 52,168,174,174,134,131,131,
+ 3,212,102,115, 7,123, 56, 71,247,239,191,253,131, 21, 43, 22,238,221,183, 79,212, 88,100,213,127,132, 66, 33,214,172, 93, 43,
+122,227,237,183,231,204, 21, 8,230,129,162,236,190,158,245,157,118, 62,159, 15,129, 64,128,194,194, 66, 20, 21, 21,161,176,176,
+ 16,133,133,133,144,201,100, 96,255,226, 73, 64,255, 96,255,172,122,145,213,248,187,193,202,213,106,120,135,182, 56,195,219, 43,
+ 12,232, 54,140,239,218, 35,180,244,122,253,169,211,167, 79,247,159, 48, 97,130,224,247,223,127,135,143,143, 79,131,208,170,255,
+174, 31,142,146,203,229, 56,112,224,128, 85,175,215,159,178,113, 51,157, 62,122,244,104,212,178,101,203,132, 47,190,248, 34, 50,
+ 51, 51, 49,107,214, 44, 84, 87, 87, 67,167,211, 65,163,209,192, 96, 48,160,127,255,254,144, 74,165,184,126,253, 58,105, 48, 24,
+ 78,219,176,216,177, 42,149,170,214,203,203,203,183,233,127, 79, 63,253,116,135, 77,155, 54, 25,178,179,179,201,129, 3, 7, 58,
+219, 43, 56,234,177,107,215,174, 6, 75, 93,110,110, 46, 54,109,218,212,224,147,149,150,150,134, 79, 63,253,180, 33,246, 89, 27,
+113,185,162,162,130, 34, 73, 18,221,186,117,131,191,191, 63, 76, 38, 19,214,175, 95, 79, 1,184,252,255,213,154, 77, 38,211,222,
+233,211,167,191,115,245,234, 85, 95,129, 64,112,207,164, 93, 87, 62,171,213,138, 91,183,110, 33, 35, 35, 3,217,217,217,168,172,
+172,108,232, 8,164,167,167, 87,145, 36,185,167, 37, 94, 47, 47,175,247,190,251,238, 59, 31,185, 92,126, 95,123,174,183,134,214,
+ 91, 73,213,106, 53, 92, 93, 93, 49,114,228, 72,239,211,167, 79,191,103, 54,155,151,253, 75,222,105,196,211, 79,230,246,125,227,
+213, 9,152, 24, 39, 47,222,159, 84,122,254,211, 79, 22,212, 57,195,123,103, 76,140,243, 47,190,150,227,138,167,159, 60,216, 23,
+ 64, 9, 90,119,216,102,126, 61,163, 60,212,175,159, 91,202,254,195,135,191, 95,178,232,205,180,133, 11, 94,241, 50, 24,111, 75,
+131, 58,137, 9, 0,200, 47,180,176,215, 51, 25,211,167,235,222, 76, 75, 88,251, 21,175, 92, 83, 61,235,143, 63, 90, 14,111,208,
+ 88,188,240,120,144, 6,133, 14, 85,116, 15, 30,212,229,247, 11,137,112,148, 27, 17, 18,218, 23, 99, 70, 63,142,148,212,116,148,
+169, 77, 80, 42,149, 48,155,205,173,134, 75,200,190,126,224, 57,150, 96, 3, 9,150, 40, 34,120,172,244,185,233, 47, 15,142,141,
+125,130, 77, 74, 58, 76, 29, 60,144,120,110,207,143, 27,246,242, 68, 66,129,209,226, 98, 33, 8,147, 22,188,155,153,181,250,123,
+ 29, 26,161, 68,212,178,249,181, 46,176,107,120, 68,168,207,115,211,103,185,196,140,139,103,143, 30, 61,200,236,217,189, 61,101,
+207,182, 30,137, 12, 79, 39, 82, 22, 27, 36, 90, 29,169,101, 9,177,107,173,142, 49,148,231, 63, 98,242,139,125,218, 10,236,229,
+212, 85,227,247,128,217, 92, 82, 91, 92,236,235, 62,116,168,228,214,138, 21,242, 14,253,251,155,136, 58, 31,226,214,132, 22,159,
+207, 7,120, 60,198, 30, 78,123,243, 98, 52, 26,193, 0,100,123, 56, 41,138,186, 79,100,213, 11,173,250,251,197, 30,206, 45,203,
+151,255, 30, 56,102, 76,101,106,106,106,135, 97,195,134, 17, 53, 53, 53,168,169,169,185, 79,108,249,249,249, 17,225,145,145,242,
+ 93, 41, 41, 65,246, 94, 79,123,202,206,227,241,254,114,161,245, 15, 71,139, 11, 73,183,186, 4, 79,189, 69,203, 30,161,101,167,
+ 69,139, 36, 73, 18,222,222,222,168,168,168,104,241,197,207,227,241, 32,147,201,234,199,136, 91,157,121,103, 54,155,215, 47, 92,
+184,240,181,113,227,198,121,134,132,132, 64,173, 86,163, 67,135, 14,144, 74,165, 13,190, 99,245,124,105,105,105,248,238,187,239,
+116,102,179,121,189, 13,206,207,215,174, 93,251,234,196,137, 19,221,125,124,124,224,230,230,134,235,215,175,195,205,205, 13, 58,
+157, 14, 57, 57, 57,112,114,114,106,240,219, 57,124,248,112,141,217,108,254,220,134,120, 99,207,158, 61,107,117,114,114,186,174,
+ 86,171,249,149,149,149,130,170,170, 42,129, 78,167, 19,106,181, 90,225,241,227,199, 61, 93, 92, 92, 12,191,254,250,171, 58, 48,
+ 48,144,127,231,206, 29, 62, 73,146, 54,213, 43, 65, 16,152, 55,111, 30, 68, 34, 17,204,102, 51,214,175, 95,143,133, 11, 23, 54,
+248,100,173, 93,187, 22, 75,151, 46,109, 16,206, 91,183,110,109, 83,203, 97, 89, 22, 86,171, 21, 36, 73,130, 36, 73,187,196,239,
+131,192, 78,193, 94,150,151,151, 23,215,175, 95,191,147, 63,255,252,179, 71, 93, 76, 50,148,151,151,163,188,188, 28,106,181, 26,
+181,181,181,160, 40, 10,254,254,254, 40, 47, 47,199,193,131, 7,181, 53, 53, 53, 99,208,202,140, 67, 62,159, 63,125,240,224,193,
+130,166,121,168,239,229,213,139,119,137, 68, 2,133, 66,129,225,195,135,139, 83, 83, 83,167, 3,248, 71, 11,173,198,225, 29, 70,
+143,153, 33, 10,139, 24, 96,185,150,145, 84, 28,218,165,188,120, 90,188,243, 17, 0, 72,191, 89,238,114, 45,199, 21, 97, 17,113,
+236,232, 49,110, 81,229,101, 91,122, 0,176,182,182, 92, 15, 0,184,200, 37,147, 70, 69,247, 87, 56, 57, 56,240, 62, 93,183,245,
+216,215, 95,127,254,232,222, 35,255, 9,239,240,233,186,123,225, 29, 70, 69,247,103,178,179,178, 39, 1,216,102,175,120,137,139,
+ 27,127,245,187, 31,190, 67,118,198,175,126,239,204,235, 41,174, 44, 39, 33,115, 12, 64, 84,239, 14,216,242,195, 13, 92,187,118,
+173,204, 98,177, 12,111,181,125, 19,108, 96, 70,230,205,224, 30, 17,225, 62,207, 77,159,233, 28, 23, 23,143,164,164, 67,248,113,
+251,182,179, 79, 77,157,248,109,105,149,142,239, 45,148,139,228, 44, 35,230,139, 92, 4, 34,137, 76,101,177,220,155, 3, 33, 20,
+ 74,157,129, 73,173,190,120,102,207,156,230, 50, 34, 58, 30, 71,142, 30,194,143,219,183,156,121, 63,226,233,109, 93,250,132, 17,
+253, 31,253,100, 78,151,174, 93, 58,233,107,203,117, 60, 66,108, 53,153, 24,167, 79,182, 23,124,150,191,116,122, 62,128,117,224,
+102, 29, 54,198,245, 31, 99, 98,250,189,113,251,182,200,107,208, 32,153, 34, 37, 69, 94,183, 18, 73,171, 66, 75, 32, 16,128,109,
+121,168,235, 62, 78, 98,199, 14, 30,128, 86, 39, 97,137, 68, 34, 24, 12, 6,144, 45, 91,176,239,227,244, 61,113,162,248,246,237,
+219,221,221,221,221,239, 19, 89,149,149,149, 13,219, 38,147, 9, 6,131, 1, 50,153, 44,195,216,252,136,200,125,156,229,103,207,
+154, 86,207,155,183,236,153,169, 83, 55,156, 58,125, 90,234,225,225, 1,173, 86,123,159,208,178, 88, 44, 24, 49,114,164,104,237,
+213,171,207, 65,167, 91,110,207,245,236, 48,124,184, 77,127, 96, 62,159, 15,230, 47, 30, 58,252, 23, 96,102,115,194,139,103,107,
+ 8,199,222, 89,135, 45,188, 32,155,174,238,189, 52, 42, 42,202,148,155,155,139,192,192,192, 6,177,210,248,156,206,206,206,112,
+117,117, 69, 90, 90, 26, 62,250,232, 35, 35,128,165, 54, 56,107, 12, 6,195,148, 81,163, 70, 25, 5, 2, 1, 66, 67, 67, 27,226,
+103, 49, 12, 3,177, 88, 12, 7, 7, 7, 92,189,122, 21,227,199,143, 55, 24, 12,134, 41,248,115, 12,173,166,156, 90,131,193,240,
+236,232,209,163, 13,153,153,153, 24, 60,120, 48,174, 93,187,134,218,218, 90,212,214,214,226,238,221,187, 8, 15, 15,135,193, 96,
+192,166, 77,155,140, 6,131,225, 89, 0,218,214, 56,107,106,106,198, 47, 92,184,144,255,211, 79, 63,117,241,247,247,143,232,219,
+183,111,200,200,145, 35, 31,121,242,201, 39, 59,197,196,196,248,118,239,222,221, 52,102,204, 24,175,113,227,198,121, 25, 12, 6,
+225,249,243,231,149, 36, 73,142,179,145,207, 6,113,146,155,155,219, 48, 84, 40, 16, 8, 80, 81, 81,209, 16,185,191,254,161,212,
+130, 16,142,182, 37,182,235, 5, 86,189,224,178,195,207,173, 57, 78,155, 7,137,197,226,122,139, 39,107, 7,103,122, 86, 86,214,
+168,161, 67,135,166,207,152, 49,163,166,172,172, 12, 78, 78, 78, 8, 10, 10, 66,112,112, 48, 60, 61, 61, 97,181, 90,113,224,192,
+ 1,253,193,131, 7,111,104,181,218,225,248,115, 12,173,232, 38,215,241,110,115, 15,217,122,107, 86,189,208,146, 74,165,240,247,
+247,175,191,182,119,219,114, 61,219,137,191,150,179, 78,192,140, 28, 49,166,107, 76,236, 4,151, 3,135, 46,136, 55,108, 60,120,
+ 35, 42, 26, 91, 61, 58,235, 14,123,116,214, 29,142,138,198,214, 13, 27, 15,222, 56,112,232,130, 56, 38,118,130,203,200, 17, 99,
+186,102,102,100,135, 52, 94,247,176,185,124, 74,165,210, 1,131, 7, 69, 85,165,158, 59,195, 36,172,253,138, 55, 98,248, 83, 87,
+183,125,123,224,192,182,111, 15, 28, 24, 49,252,169,171, 9,107,191,226,165,158, 59,195, 12, 30, 20, 85, 37,149, 74, 7,216, 83,
+246,217, 51,167,185,196,198,196, 35, 41,233, 0,181,119,215,166,181,187,247,229, 13,125,249,181,179,229,185,185,215, 88, 85,201,
+ 9, 8,121,133,200,202,202,210,214,137,172, 92,123, 56,103,189, 50,173,177,200,250,205,195,103,240,214,172, 44,208,201,201,191,
+144,167, 79, 95, 53,254,150,174,210, 94,201,172,168, 84,168, 43,239,232,116, 26, 11,195,208,160,105,154,255,193, 7, 13, 14,187,
+205,214,209,192,129,195,240,235,169,157,216,254,195,102, 45,195,192, 52,105,239, 94,122,210,164, 21,108,167,206,157, 59, 37,238,
+218, 73,196, 61, 49,193,133, 5,152,241, 19,227, 93,127,218,253, 19,209,181, 91,215,206, 65, 65, 13, 33,109,254,121,109,233, 47,
+224, 92, 1, 84,233, 10, 11,207,164,125,245,149,185,195,148, 41,238,226, 14, 29,156, 65,211, 68,253,243,189,165,143, 64, 32,104,
+106,129,105,145,211,223,211,179,244,240,225,195, 8, 14, 14,134,191,191, 63, 26,251,200,214, 7,228,246,240,240,192,190,125,251,
+192,222, 31,156,186, 69,206, 62, 93,186,164,173, 89,189,218,194, 48, 12,170,170,170,254,100,205,170,170,170, 2,195, 48, 56,122,
+228,136, 69,119,111, 37, 16,187,202, 62,156,207,175,125,102,200,144,132,216,216, 88,235,237,219,183,193, 48, 12, 26, 91,182, 84,
+ 42, 21, 28, 29, 29, 97, 50,155, 3, 0,200,237,225, 84, 29, 63,238, 0, 27,207,245,102, 44, 90,127, 69,189,255,211, 69, 86,227,
+ 5,165,103,218,101,209,162, 40, 10, 1, 1, 1,247, 45,233,194,227,241,238,251,180,113,198,225,142,204,204,204, 19, 99,198,140,
+ 89,246,216, 99,143,205, 94,182,108, 25, 63, 36, 36, 4, 90,173, 22,110,110,110,240,246,246, 70, 78, 78, 14, 14, 31, 62, 76, 87,
+ 84, 84,124, 3, 96, 37,236,155, 66,159,146,151,151, 23,215,179,103,207,221,139, 23, 47,118, 25, 61,122,180, 48, 32, 32, 0, 44,
+203,226,234,213,171,216,191,127,191,117,219,182,109,186, 58,145,101,175,243,242, 73,133, 66,241,212,184,113,227, 18,167, 79,159,
+238, 68,211,180,240,238,221,187, 48,155,205, 32, 73, 18, 69, 69, 69,214,164,164,164, 90,131,193, 48, 13,192, 73, 59,248,210,170,
+171,171,195,147,147,147,167,159, 63,127,254,163, 25, 51,102,120,140, 28, 57, 82, 68, 81, 20,206,157, 59,167,238,211,167,143,183,
+ 74,165,178,238,219,183, 79, 99, 50,153,150,210, 52,109,215, 18, 60, 4, 65, 64,167,211,193,211,211, 19,102,179, 25, 12,195,192,
+ 98,177,192,209,209,177, 97,217, 36,150,101,209, 22,231,250, 38,109,128,111,181, 90, 49,117,234, 84, 48, 12,131,245,235,215,131,
+162,168, 54,147,185,184,184, 92, 73, 79, 79,143,235,221,187,119,131,120,169,111, 67, 18,137, 4,158,158,158,240,240,240, 64, 82,
+ 82, 18,132, 66,225, 21, 91,254,110,117,184, 86, 81, 81,209, 39, 57, 57,121,192,141, 27, 55,158, 7,208,219,106,181,250,211, 52,
+ 77,240,120, 60, 37,203,178,215,117, 58,221,183,176,115, 9, 30,149, 74,245,209, 11, 47,188,208,103,231,206,157,142, 2,193,127,
+110, 13,129, 64, 0,137, 68,130,250,224,152, 44,203,194, 98,177,224,189,247,222,211,233,245,250,143,254, 45, 79,137,168,190,253,
+177,101,211, 23,142,167,127, 61,161,206,202,195,254,102, 66, 56,148,148,151,109,233,161, 40, 46,118,140,234,219,223, 46, 78,210,
+ 98,213, 60, 59,237,173,192,186, 37,120,222,187,123,183, 96,115,226,142,207,242, 1,224,147,207,215,119, 47,215, 84,207,202,206,
+202,158,180,121,243,174, 1,164,197,170,177,135,243, 63,226, 37, 81, 11, 22, 38, 0,151,174,222, 40,239, 50,126,202,241,165,221,
+186, 58, 63,161,210, 24, 75,107,107, 13,175, 3,200,183,183,236,131, 6, 14,197,175, 39,127,194,143,219, 19,117, 44,195, 55,121,
+122,122,178, 0,144,149,229,201,102,101, 85,179,255,241, 43,118,213, 11,217,107, 43,223,122,125,228, 91, 90, 93,229,231,235, 55,
+181, 62,148,210,179,215, 99,232,217,235, 49,188,246,250,187, 46,225, 17,161,129, 0,176,119, 47,232,136,110,153,191, 44,123,127,
+197, 19, 43, 87,174,128,174,198,140,250,229,122,114,110,102, 30,201,207,135,133,123,103,221,143,101, 20,117, 9,111,189,213,221,
+ 80, 89,233, 53,232,157,119, 60, 5,111,191,205,107,205, 25,190,241,253,107, 15,231,229,235,215,143,204,122,249,229,210,229,203,
+150,141,249,102,243,102, 89,143, 30, 61, 80, 86, 86,134,208,208, 80,248,251,251, 35, 57, 57, 25,251,246,236,209, 87,215,212, 44,
+ 5,240,181, 61,156, 59,142, 30,205, 9,137,136,168,216,188,121,179, 95,108,108, 44,161,215,235,161,213,106,161,213,106, 97, 54,
+155, 81, 23, 16,154,205,205,203,203, 34, 73,242, 27,123,203, 78,171,213,210,149,253,251,151,136, 24,102,205, 83, 19, 39, 46, 92,
+249,225,135,146,174, 93,187, 18,102,179,185,193,170,101,181, 90,225,232,232,104,181, 88, 44, 30, 0, 12,246,112, 74,182,109,163,
+212,106, 53,188,188,188, 26,194, 53, 53,142, 75, 88, 83, 83, 3,150,101,185, 96,186,237, 64,139, 10,201,205,205,237,138, 64, 32,
+232,216,216,186,213,220,218,121,141,247,145, 36, 89, 82, 81, 81, 17,213, 68,241,182,228, 15, 21, 4,224,227, 17, 35, 70, 60,181,
+ 96,193, 2, 34, 53, 53, 21, 7, 15, 30,100,243,243,243,247,214, 89,177,242, 91,233,233,180,196,233, 36,145, 72,230, 59, 56, 56,
+ 68,215,135,112,144,203,229, 55,244,122,253,169,186,225,194,154,118,112, 58, 75, 36,146,121, 14, 14, 14,163,234,150, 95,129,147,
+147, 83,186, 94,175, 79, 54,155,205, 95,160,229,133,170, 91,227,148,185,184,184,124,228,233,233,249,236,219,111,191,237,113,246,
+236, 89,229,175,191,254, 42,170,174,174,222,105,177, 88, 90, 91, 84,250, 79,156,238,238,238, 87,248,124,126,199,191,168,142,208,
+179,103,207,164,241,227,199,199, 78,155, 54, 13, 36, 73,226,235,175,191, 70,114,114,242,145, 91,183,110,197,217,232,141, 54,229,
+244,236,216,177, 99,234,236,217,179, 59, 77,157, 58, 85,238,230,230, 6,129, 64, 0,189, 94,143, 91,183,110,225,234,213,171,236,
+161, 67,135,106,211,210,210, 74, 12, 6,195, 48, 0, 21,109,184,158, 15,210,107,190,143, 83, 32, 16, 12, 13, 8, 8,216,181,124,
+249,114,167, 81,163, 70,201, 60, 60, 60,192,231,243, 65,146, 36,148, 74, 37,110,222,188,137, 19, 39, 78,232,247,238,221,171,215,
+104, 52, 83, 1,156,249,255,200,231,195,228, 12,235,142,247,155, 44, 20,221, 98,180,119, 27,105,109,230,115,196, 80,223,248, 73,
+ 79,141, 27, 11, 0, 63,239, 59,118,220,142, 69,165, 91,204,167,173,188,218,195, 25,218,141,183, 60, 35,243,230,125, 1, 45, 35,
+194, 35,115,195,122, 76, 92,101, 15, 81,163,200,240,247,149,189,209,112,108, 99,155,238,125,195,172, 97, 65,136,139,159,244,100,
+236,187, 75,151,224,227,143, 18,112,232,231, 3, 71,178,242,239, 91, 38,232, 31,215,150,254, 98, 78, 98,149, 64,240,152,220,215,
+119,200,122,134, 89,114,237,230, 77,199,198, 29,182,122,203,115,227, 78,165,159,159,159, 74,169, 84,118,176,135, 51,238,203, 47,
+173, 6, 7, 7,201,146, 53,107,134,214,154, 76, 67, 87,174, 92, 41,184,124,249, 50, 54,125,245, 21,101, 42, 41, 73, 84, 3,243,
+ 90, 24, 13,105,145,179,211,188,121,210, 69,155, 54,189, 24,212,173,155,247,243,207, 63, 47, 20, 10,133,208,235,245, 40, 46, 46,
+198,201, 19, 39, 44,153, 89, 89,153, 58,157,238, 9, 0, 10,123, 57,227,190,252,210,234, 26, 20, 4,185,151, 23,123, 58, 37,197,
+101,214,252,249,179, 59,119,233,226, 50,102,236, 88,161,179,179, 51,170,170,170,112,247,238, 93, 28, 56,112, 64, 85, 91, 91,235,
+ 7,128,182,135, 51,241,252,249,158, 71,207,156,121,122,213,170, 85,226,200,200, 72,184,184,184,160,166,166, 6, 55,111,222,196,
+153, 51,103,204,223,124,243,141, 86,171,213,206,166,105,250,240, 95, 88,239,255, 6,171, 86, 61,182,216, 20, 90,255,197, 27, 48,
+ 10,192,251,117,219, 31,194,246,154,129,255,166,135, 79,160,187,187,251, 22,147,201,196, 26,141,198, 89, 0,138,254,134,249, 20,
+ 68, 69, 69,109, 82,169, 84, 3, 88,150,133,139,139,203,133,140,140,140,185,104, 97,230,141, 13, 78, 62,128, 1,142,142,142,253,
+157,156,156,134,154,205,230,176,186,225,183, 44,189, 94,127,198,106,181, 94,170,179, 62,209,255,207,101,231, 3, 24,229,231,231,
+247, 50,195, 48,221, 8,130,112,165,105, 26, 36, 73, 86, 51, 12,115, 75,171,213,110, 3,144,252, 55,200,231, 67,225, 12,127, 4,
+ 79,178, 60,132,181, 36, 8,238, 19, 90, 77, 4, 4,193, 32, 43,243, 54, 14,180, 33,159,188,113,209, 1, 27,129,123, 51, 19, 97,
+219,185,246, 63, 66,203, 14,241,210,102,145,249, 8,255, 5,150, 96,239,227, 36, 88,162, 40,180,231,147, 63, 62,136,208,178, 23,
+225,193, 24, 10, 22, 3, 24, 22,151,178,111,225,215,127,241,179,238,161,113,126, 12,184,127,229,230,118,129, 39, 16,248, 0,224,
+213, 89, 95, 24,134, 32,104,150, 32,168,198,195, 91, 77, 58,150,173,114, 90,129, 30, 66,137, 36,128,166,168, 14,101,128,227, 81,
+154,126,212,196,178,181, 29,129,247,211,129,156,246,228,211, 10,244,224, 75, 36,129, 71, 89, 54, 94,237,224,208, 83,101, 52,122,
+ 1, 96, 29, 29, 28,178,116,122,253,118,147,201,180, 17,127, 30,185,176,201, 41,146, 72, 58,210, 20,213, 1, 0,120, 2,129,106,
+183,217, 28, 80,226,236,252,188,201,108,238,228,232,232, 72, 90, 44, 22,157,201,100,154, 70, 81,212,233,182,148,253, 22, 69,133,
+159,231,241, 6, 91, 29, 28, 60,172, 4,225, 96,161, 40,171,197,106, 45, 54,153, 76, 55, 0,124, 6,224,246, 95, 92,239, 28,218,
+121,179,112,156, 28, 39,199,201,113,114,156, 28, 39,199,249,215,115,202, 1, 4,214,117, 22,255,137,101,255, 55,193, 62, 31, 45,
+ 14, 28, 56,112,224,192,129,195, 63, 6, 6, 52,227,147,197,225,255, 23, 68, 43,170,180, 45, 38,193,246, 40,219, 83, 28, 39,199,
+201,113,114,156, 28, 39,199,201,113,254,207,113,218,226,254, 39, 14, 73,182,184,214,225, 95, 13,206,252,203,113,114,156, 28, 39,
+199,201,113,114,156, 28,231,255, 44,120,220, 37,104, 17, 29,234, 62, 15, 59, 45,135,127,119, 91,104, 10,255,186, 79, 91,210,251,
+114,151,156, 3, 7, 14, 28, 56,161,245, 87,191,180, 30,228,229,246,160,194, 39,129, 32,160, 32, 8, 40, 0, 36, 60,196,180,182,
+224,231,233,233,249, 70,120,120,120, 98,135, 14, 29, 94, 3,224,221,198,227,187,203,229,242, 47, 28, 28, 28, 82, 29, 28, 28, 82,
+229,114,249, 23, 0,186, 63,164,122, 35, 0,204,146, 72, 36, 41,190,190,190,165, 98,177, 56, 5,192,108,180,127,230,106, 8,238,
+197, 73,251, 16, 64,207,182, 28,232, 29, 17,191,199, 43, 34,254,186, 87, 68,252, 77,143,200,241,221,189, 34,226,111,122, 69,196,
+ 95,247,142,136,223,243, 23,180,215, 7,169,223, 4,130, 64, 17, 65,160,200,206, 99, 63, 35,128, 98,130, 64,201, 67,104, 75, 28,
+ 56,112,224,192,225,159, 6, 63, 63,191,167,124,125,125, 79,249,250,250, 38,251,249,249, 61,101,199, 33,209,205,188,120,104,130,
+ 0,109,227, 69,210, 90, 58, 91,230,202,198,199,126,106,103,209, 26,115,118, 32, 8,208,108, 29, 8, 2,140,183,183,247, 6, 95,
+ 95,223,132,166, 31,111,111,239, 13, 4, 1,166, 81, 90,186,145,192,107,171, 89,181,195,115,207, 61,247,115, 85, 85, 85,146,197,
+ 98, 73,202,203,203, 75, 26, 54,108,216,238, 38,214,141, 22, 57,165, 82,233, 51,253,250, 15, 72, 59,115,238, 82, 94,238,173, 2,
+ 69,102,206,157,130, 95,142,159,190, 28,217,163,231, 31, 82,169,244,153, 54,212, 17, 1, 96,150, 64, 32, 72,113,116,116, 44, 17,
+ 8, 4, 41, 0,230,240,249,252,195,171, 87,175, 46,200,200,200, 40, 63,127,254,124,245,153, 51,103, 74,103,204,152,113,139, 32,
+136, 95,154, 17,236,209,205, 88,105,154, 90,117,150, 21, 22, 22, 30, 87, 42,149, 39,100, 50,217, 71,118,164,111,224,244,138,136,
+191,174,210, 90, 89,149,214,202,122, 69,196,179,141,182,175,183,241,154,219,170,163, 63,181, 5,137, 68, 18,104, 67,208, 71,183,
+116, 44, 0,159,186,255,162, 0,124, 89,247,169,159,122,238, 35,149, 72, 30, 86, 91,122, 24,101,231, 56, 57, 78,142,147,227,252,
+111,115,254,147,209,167,238,219, 23,247,252,181, 26,222,221,109,157,117,248,106, 94, 94,158, 35, 0, 4, 7, 7,207, 5,176,175,
+ 45, 66,130, 32,176,136, 97, 88, 30, 0,240,120,196, 59,195,135,143,232, 35,147,201,238,139,130,108, 52, 26,197, 41, 41,191,142,
+100, 24,150,168, 75,183,136,101,241, 5,128,114,123,207, 97,177,152,121, 66,161, 24, 60, 30,241, 86,100,100,143,206, 21, 21, 21,
+103,121, 60, 94, 98,105,105,105, 85,155,205, 56, 4,129,173, 91,183, 6,251,250,250,254, 41, 90,179, 82,169, 20,199,199, 63,209,
+ 38,190, 23, 0,137, 89, 34,233, 47, 34, 8, 95,154,162, 92, 1, 64, 32, 16, 84, 93, 22,139,163, 62, 94,181, 74, 78, 16, 4,163,
+209,104, 96, 52, 26,241,230,155,111,202, 50, 51, 51, 39, 84, 84, 84,108,180, 65, 27,220,179, 87,159, 55, 79,156, 56, 30,166,171,
+172, 50,109,253,124,115,154, 81, 32, 50,116, 9, 15, 21,109,218,178,221,109,230,139,211, 94,207,206,206, 72, 71,243,203,145, 52,
+ 6, 15,192,129,249,243,231, 71,196,197,197,137,107,106,106,164, 70,163,177,115, 98, 98,226,123, 81, 81, 81,142,189,123,247, 22,
+239,218,181,139,208,106,181, 96, 89, 86, 30, 26, 26,202, 78,158, 60,217,180,123,247,238,215, 0,108,104, 69,248, 46,186,119, 45,
+121,235, 67, 66, 66,150, 3, 64, 94, 94,158,168,209, 53, 22,134,133,133, 57, 0, 64, 78, 78,206, 7, 44,203,204, 7, 0,150,197,
+ 90, 0, 75,154, 49,173,229, 69, 12,154, 4, 16,232,150,113,238,103,105,196,224, 73, 38,176,184, 69, 0,121,117, 29,130,149, 64,
+163,184, 80,247, 35, 75,161, 80,180,107,109,194,216,216, 56,130, 32,136,189,105,105,105,251, 84, 42, 85, 23,134,161, 95,105, 45,
+159, 77,218, 17,225,225,225,241, 66, 69, 69, 69, 2,128,151,179,178,178,250, 0, 64, 88, 88,152, 8,192, 21,103,103,231,129, 86,
+139,133,224,158, 85, 28, 56,112,224,240,143, 21, 90, 87, 1,196,226, 63, 75,240,108,105,143,208, 18, 3,192,217,179,103, 1, 64,
+210,142,140, 16,141, 5,204,188,121,243,224,235,235,219, 84,188, 32, 53, 53,229, 65, 10,123,223, 57, 62,252,240, 67,199,234,234,
+234,232,111,191,253,118, 8,203,178,159, 42, 20,138,223,109, 28, 95,206,178, 88,203,227, 17,239, 16, 4, 1,137, 68,154, 59,123,
+246,236,171,117,255,117,254,229,151, 95,228,227,199,143, 55, 0, 40, 0, 0,137, 68,234,207,231,243,130, 89,150,173,127,225,182,
+ 40, 8,159, 6,130, 40,177,120,196,172, 47,191,164, 30, 29, 63, 94,224,224,229, 69, 0, 64, 65,118,182,199,218, 79, 62, 25, 88,
+149,159, 47, 54,122,120,104, 52,122,189, 49, 55, 55, 23, 18,137,132,224,243,249,143,218, 42,176,131,131,195, 27,171, 62, 94,227,
+160,171,172, 54,154,116, 53, 22, 62, 69,154,157,100,114,186,188, 76,165,113,148, 57, 24,222,121,127,133,248,213, 87,166,191,161,
+215,235,231,218,160,122,237,173,183,222, 10,235,215,175,159,255,158, 61,123, 8,173, 86, 11,129, 64,224,216,187,119,111, 68, 69,
+ 69,209,191,254,250, 43,209,165, 75, 23, 68, 70, 70,226,220,185,115,184,112,225, 2,209,167, 79, 31,249,254,253,251,159, 35, 73,
+114,131, 45,113,205,231,243,222, 12, 13, 13,237,237,224,224, 96, 9, 14, 14,198, 43,175,188, 2,150,101, 17, 29, 29, 29,233,232,
+232,184, 79,175,215,139,115,114,178,135,216, 18,217,170,140, 67,147,235, 45, 91, 0,122,128,197, 45,117,198,161,198,195,143, 97,
+ 57, 57, 57,143, 85, 85, 85,225, 94,189,176, 13, 11,152, 15, 25, 50,164, 45,109,169,156,101,177,118,252,248,184,119, 0,130,136,
+142,142,174,126,237,181,215,120,217,217,217,207, 62,249,228,132,200,188,188, 91,104, 37,159,141,219, 17,241,194, 11, 47,150, 59,
+ 58, 58, 78,220,187,119,111,142, 82,169, 20,136, 68, 13, 58,147,239,237,237,237, 21, 28, 28, 60,199,221,221, 93,197,231,241,188,
+ 89,176,172,173,182,196,129, 3, 7, 14, 28,254, 86, 56, 82, 39,174,142, 52,253, 67, 0, 0, 73, 73, 73, 13,145,105,227,226,226,
+ 90,236, 85,179, 44, 91,126,237,218,181, 0,131,193, 0,150,101,237,121, 9, 52,158,162, 89, 78, 16,188, 77, 60, 30, 49,151, 32,
+ 8, 68, 70,246,184,179,126,253,250,230,214,244,178, 68, 70,246,184,195,231,243,186,178, 44, 11,130,224,125,205,178, 76,121, 11,
+156,205,190, 24,197, 98,201, 34, 0,240,241,241,205, 63,118,236,152,229,233,167,159,198, 39,159,124, 34, 90,188,120,241, 66,129,
+ 64,240, 90, 81, 81, 81, 89, 43,249, 4,128, 37, 94, 94,222,242,173, 91,183, 6,207,158, 61,251,170, 82,169, 92, 2, 0,190,190,
+190, 9, 0,194, 1, 20, 52,218,135,111,190,217, 93,250,202, 43,175,228,170, 84,170, 37, 45,113, 78, 4, 30, 9, 8, 13, 29,177,
+242,236, 89,150,103, 54, 19, 21,191,253,166, 83,151,151,147,183,213,106,249, 15, 87,174,196,189,151,144, 32, 12, 8, 12, 68,234,
+225,195,158, 21, 6,131, 90,107, 54,155,202,203,203, 89,138,162, 46,216, 81,246, 8,111, 47,111,249,230,207,190,190,236, 36,228,
+ 51,222, 29,253, 9,161,187,187,128, 39,119, 22,243, 5, 60,115,215,206,221,197, 0, 34,108,213,145, 72, 36,122,110,244,232,209,
+242,221,187,119, 19,145,145,145,112,117,117,197,111,191,253,134,244,244,116, 84, 85, 85,241, 72,146, 68,223,190,125,177,102,205,
+ 26, 4, 6, 6,162,186,186, 26, 69, 69, 69,158, 98,177,216,139, 36,201,150,174,231,125,237,105,209,162, 69,240,245,245, 5, 69,
+ 81,168,172,172, 4, 69, 81,112,116,116, 4, 0,148,148,148,224,240,225, 67,246,180, 37,155, 96, 89, 22,143, 63,254,120, 13, 65,
+ 16, 89, 77, 45, 90,109,225,244,247,247,223,165, 86, 87,140, 27, 49, 98, 4,170,170,170,200, 21, 43, 86,160,103,207,158, 8, 14,
+ 14,182, 39,159, 75, 68, 34,241,183,157, 58,117,250,108,222,188,121,190,238,238,238, 48,155,205,239,149,149,149, 97,206,156, 57,
+ 0,128,152,152,152,158, 66,161,240,216,140, 25, 51,208,165, 75,151,210,202,202,202,162,180,180,180, 87, 12, 6,195,205,246,150,
+221, 78,112,156, 28, 39,199,201,113,254,173, 56,237,213, 34,127, 83, 40,113,127, 56,135, 45,247, 9,173,184,184, 56, 34, 41, 41,
+137,181,163, 96,154,142, 29, 59, 6,200,100, 50, 0,208,180, 53, 23, 12,195,188,230,225,225,161, 90,178,100,201,160,224,224, 96,
+203,107,175,189,118,179,160,160, 96,105,227, 52,157, 59,119,254,232,171,175,190, 66,110,110,110, 65, 66, 66,194, 57,141, 70,211,
+214,117,204, 22,179, 44,214,215, 89,199, 42, 14, 31, 62,220,243,236,217,179,115, 63,255,252,115,175, 87, 95,125, 85,244,198, 27,
+111, 76, 3,240,137, 45, 18, 62,159,111,104,110,184,176, 57,248,250,250, 90,248,124,126,139, 65,226,226, 0,153, 84, 44, 30,190,
+242,236, 89,214, 82, 80, 96,248,110,221, 58,167,205,127,252,177,156,100,217, 14,222,222,222, 24, 60,112, 96,173,148,207,175, 80,
+149,149, 49,222,143, 60,194,191,123,236,152,167, 81, 44, 86,236,222,189, 91,171,209,104, 14,218, 52,225, 17,132,142, 97, 89,139,
+ 99,199, 64,242,233, 9,163, 34, 47, 95, 74,207,118,242,246,228,245,233, 29,217, 51, 59,183, 32, 13, 12, 99, 37, 8, 66,103,139,
+199,197,197, 37, 88,163,209, 64,167,211,193,203,203, 11,235,215,175,135,143,143, 15, 12, 6, 3, 50, 50, 50,216,142, 29, 59, 18,
+103,207,158, 69,199,142, 29,161, 86,171, 97,144,143,144,232, 0, 0, 32, 0, 73, 68, 65, 84,177, 88, 80, 83, 83,163, 50,155,205,
+ 45,173,205, 88,206,227,241,191,231,241,136, 23, 9,130, 64,215,174, 65,133, 27, 55,110,180, 48, 12,131,176,176, 48, 60,249,228,
+147,216,191,127, 63, 50, 50, 50,234, 45, 79,150, 78,157, 58, 23,242,120, 68,167, 58,173,212,110,171, 78,253,210, 62, 10,133, 98,
+ 98, 59,111, 26,158,159,159,223,180,110,221,186,205,125,230,153,103, 72,177, 88, 12,189, 94, 95,127, 45,200,113,227, 98,170,199,
+143,143,115, 57,114,228, 72,171,249,180, 88, 44,249, 90,173,246,229,183,222,122, 43,241,155,111,190,113, 91,186,116, 41, 24,134,
+ 1,203,178,160, 40,170, 97,209,111,134, 97,112,224,192, 1,220,190,125,251,163, 38, 34,139, 3, 7, 14, 28,254, 39,208, 6, 45,
+242,119,132, 47,238, 13, 27,162,169,216,250,175, 71,134,231,243,249,155, 79,158, 60,217,123,200,144, 33,130,145, 35, 71, 70, 30,
+ 63,126, 60,178,180,180,244,102,157,245, 32,114,228,200,145,145,222,222,222,248,226,139, 47, 12,124, 62,127,115, 59, 79,211,240,
+210, 43, 43, 43,187, 10,224,211,253,251,247,175,157, 53,107, 22,124,124,124,194,149, 74,229,127,181,204,206, 18, 73,159, 25,235,
+215, 83, 66,146,228,125,249,233,167,206,235, 82, 82,214,238,249,249,103,193,227,143, 63, 78,176, 44,139, 27,215,175,203,214,108,
+216, 32,159, 58, 97, 66, 65, 78,126, 62,117,232,196, 9,178,188,180,180,178, 84,173, 94, 6,160,210, 22, 63, 73,146, 23,243,242,
+242,252, 6, 15,125,220,255,204, 31, 55,211,159,158, 16, 51, 66, 40,224, 17,183, 10, 74,174,248,250,120,186,164,166,156, 50,146,
+ 36,121,209, 22,143, 94,175,191, 75, 81,148, 59,203,178, 94,169,169,169,240,242,242, 66, 85, 85, 21, 72,146,132,197, 98,177, 24,
+ 12, 6,169, 70,163,129,201,100,130,217,108,134,179,179, 51,110,220,184, 81, 78, 81,212,175, 45,113,210, 52, 61, 67, 34,145,124,
+ 40, 20, 10,197, 34,145, 72,113,229,202, 21,232,116,186,206,174,174,174,159, 80, 20, 5,133, 66,129,179,103,207,190,237,236,236,
+ 92, 0, 0, 82,169, 20, 98,177,196,195,108, 54, 83, 0, 74,219,123,205, 89,150,109,119,125,249,248,248, 4,202,100,178,149,239,
+188,179, 40,172, 87,175,222, 80,171,213, 96, 24, 6, 14, 14, 14, 48, 24, 12,112,118,118,198,128, 1, 3,238,174, 92,185, 82,201,
+178,152,105, 75, 12,170, 84, 42,181, 64, 32,120,109,214,172, 89, 31, 6, 7, 7,119,101, 89, 22,221,187,119,199,232,209,163,113,
+236,216, 49,228,230,230, 66,175,215,211,191,255,254,251, 79, 74,165,242, 23,238,113,203,129, 3, 7, 14,255, 56,252,201, 55,235,
+ 62,139,214,127, 19, 42,149, 74,157,157,157,125, 60, 45, 45, 45,110,242,228,201, 72, 77, 77,125, 1,192, 91, 0, 32,145, 72, 94,
+152, 60,121, 50,210,210,210,144,157,157,125, 92,165, 82,169, 31,198, 57,197, 98,177,201, 98,185,103,156,146, 74,165,210, 54, 30,
+222,185,110,200, 16, 0, 58,183,178,175,101,211,136, 64,224,219, 99,236, 88, 65, 85,122,186,110,235,165, 75, 31, 38, 38, 38, 10,
+ 6, 13, 26, 68,144, 86, 43,104,134, 65, 80, 80, 16, 49, 50, 58,218,225,251,196, 68,119, 90,175, 63,187,234,157,119,126,219, 50,
+ 99, 70,109, 94,157, 31,152, 45,152,205,230, 13,115,231,188, 28,157,146,250,155,127,120,232, 35,238,199, 79,166, 92,245,240,112,
+145, 7,119,235,230,160,169,170,164,151, 46,126, 91, 96, 54,155,191,180,197, 99, 52, 26, 15,156, 58,117,106, 66, 64, 64,128,215,
+205,155, 55, 97,177, 88, 64,211, 52, 70,142, 28, 9,150,101, 37, 0, 24,129, 64,128,236,236,108, 88,173, 86, 85, 94, 94,158,226,
+214,173, 91, 18, 0,171,109,228,175,208,108, 54, 35, 43,235,222,168, 93,199,142, 29, 71,197,198,198,130,162, 40,140, 29, 59, 22,
+135, 14, 29, 26,149,149,149,181,174,177,230,123,208, 58,175,179,144,133,249,249,249,237,175,219,101,151, 19,188,191,191,127,100,
+ 80, 80,208, 55,171, 87,175, 22,117,236,216, 17, 44,203,194,205,205, 21, 6,131, 1, 21, 21, 26,132,135,135, 35, 32, 32, 0,171,
+ 87,175, 6,128,159,236,181,184, 41, 20,138, 91, 10,133, 98,178, 74,165, 18, 85, 87, 87, 71,141, 26, 53,234,139,232,232,104, 92,
+189,122, 21,191,253,246,219, 84,137, 68,162,178, 90,173,148,143,143,207, 76,130, 32,156,173, 86,235, 78,141, 70,163,228,158, 93,
+ 28, 56,112,224,240,143, 64,189,143, 22, 26,125,183,205,162, 21, 22, 22,230, 80, 80, 80,240,124,231,206,157,197, 0, 32,147,201,
+194,131,130,130, 22,230,231,231,215,180, 53, 55, 6,131, 97, 79, 98, 98,226,232,207, 62,251, 76, 20, 19, 19,243,200,254,253,251,
+251, 1, 64, 76, 76,204, 35, 78, 78, 78, 72, 76, 76,180, 26, 12,134,135, 22, 19,137, 36,201, 33,125,251,246, 69,101,101, 37, 10,
+ 10, 10,218, 52, 44,243,203, 47,191,200,113,207, 47,171,213,125,173,129,178, 88,220, 92,253,253,121,165, 41, 41,214, 74,157,206,
+119,200,208,161, 4,105,181,130,199,227, 65,163,209,160,168,168, 8, 46,174,174, 68,118, 94,158,227,182, 69,139,126,233,220,171,
+151,152,182, 88, 60,218,144, 77,125,133,170,252,197,215, 95,123,245,192,206,157, 63,121, 85,235,116,183,101, 50,185, 89, 34, 17,
+249,204,123,253,117,186,178,178,114, 58,128, 90, 59,120, 86,239,220,185,115,236,216,177, 99,175, 7, 6, 6,122,171,213,106,159,
+234,234,106,186,178,178,146,143,123,190, 86, 4, 0,164,164,164, 64,167,211, 81, 52, 77,159,197,189, 88, 88, 22,123, 51,218,169,
+ 83, 39,151,168,168,168, 97, 94, 94, 94,208,106,181,240,240,240, 64,239,222,189,135,241,249,252,111, 11, 11, 11,181, 15,179,213,
+ 39, 39, 39, 59,177, 44,251, 24,203,178, 24, 59,118,172, 93,199,208, 52,253, 82,108,108,172,136, 32, 8, 24,141, 6, 72,165, 50,
+ 56, 56, 56,194,201,201, 25,193,193, 33, 80, 40, 20, 24, 51,102,140,229,246,237,219,155,148, 74,101,155,219,168, 86,171,141, 31,
+ 48, 96,192,130, 57,115,230,128,162, 40,196,199,199,163,184,184,120,221,221,187,119,119,251,249,249, 77,123,233,165,151,188, 60,
+ 60, 60,176, 96,193, 2, 25,128, 15,184,103, 23, 7, 14, 28, 56,252, 35,208,212, 71,235,207, 22,173,214,198, 68,125,124,124, 6,
+ 19, 4,241,158,209,104, 20,215, 15,201, 16, 4, 33,246,242,242, 58,100, 52, 26, 19,148, 74,101,155,156,226,170,171,171,117,119,
+238,220, 57,116,241,226,197, 73, 19, 39, 78, 68,114,114,242,116, 0,152, 56,113, 34, 46, 94,188,136, 59,119,238, 28,170,174,174,
+214, 61,140,146,251,251,251,143, 27, 58,116,232,196,190,125,251, 34, 41, 41, 9, 52, 77, 95,104,203,241,141,103, 24,162,153, 89,
+135,245,251,236, 34,227,243, 65, 16, 4, 40,138, 2, 0, 84,168,213,200,205,201, 65,101, 85, 21,204, 38, 19,244, 6, 3, 29,220,
+165,139, 81,107,177, 8, 9,160,173, 99, 95,133,105,151,127, 47, 50,232,245,222, 30,110,238, 70,185, 92,130,106,157, 86,116,229,
+242,239,181, 0,110,219,201, 97, 97, 89,118,232,177, 99,199,150,241,249,252,201,142,142,142,152, 59,119, 46,127,216,176, 97, 16,
+137, 68, 48,155,205,168,174,174, 70, 98, 98,162,154,166,233,174,117,199, 56,202,229,242,237,124, 62,191,164,166,166,230, 61,155,
+ 39,176, 88, 98,226,226,226, 4, 22,139, 5,171, 86,173,194,242,229,203, 49,118,236, 88,193,229,203,151, 99, 0,236,124, 88, 45,
+158, 97, 24,140, 26, 53,170,177, 51,124,150, 61,199, 9,133,194,200,110,221,186, 65,173, 86, 67,173, 86,195,203,203, 11,126,126,
+126,240,241,241,193,186,117,235,216, 47,190,248,226,184,213,106,221, 84, 81, 81, 81,222,142,182, 56,115,250,244,233, 51, 39, 77,
+154,132,218,218, 90, 92,188,120, 17, 3, 7, 14,196,218,181,107,125,207,158, 61,251, 86,223,190,125, 33, 20, 10,145,154,154, 10,
+138,162,138,185,231, 22, 7, 14, 28,254,215,240, 15,245,207,106, 21,173, 90,180, 2, 2, 2, 92,105,154,126, 59, 54, 54,118,212,
+132, 9, 19, 48,102,204,152,251,254,223,185,115,167,211,190,125,251, 18, 54,108,216, 48,214,106,181,174,110,203, 80, 31,195, 48,
+ 7,118,238,220, 25,243,248,227,143,203,135, 15, 31, 30, 4, 0, 18,137,196,178,115,231, 78, 3,195, 48, 7,218, 81,150,250,224,
+142,229, 0,224,231,231,215, 83, 32, 16, 76, 28, 55,110, 92,207, 23, 95,124, 17, 25, 25, 25, 72, 76, 76,188, 21, 28, 28,124,174,
+188,188, 77,239,200, 2, 27,179, 14, 19,108, 89,183,248, 98,177,166,186,172,204,213, 49, 48, 80,232,230,228,164, 76, 74, 74, 10,
+136,142,142, 38,138,139,139, 81, 85, 85, 5,147,201,132,203,151, 47, 51, 2,160, 80,224,230, 70, 20, 94,188, 72,240,197, 98, 13,
+238,159,201,103, 19, 1,190,110,221,223, 95, 60,187,179,201,108,138,208,106,181,148, 64, 40, 20,118,244,113, 45,206,185,221,166,
+145, 56,179, 92, 46,143, 2, 32, 96, 24,198,224,238,238, 46, 63,121,242, 36,196, 98, 49, 8,130, 64,143, 30, 61, 32,149, 74, 69,
+ 44,203, 22, 1,128,147,147,147,120,243,230,205, 46,211,166, 77,251,205, 22,113,159, 62,125,132, 18,137,228,137,224,224, 96, 92,
+188,120, 17, 55,111,222, 44,188,120,241, 98,167, 62,125,250, 32, 48, 48,240, 9, 95, 95,223,159,175, 94,189, 74, 62,140,134,125,
+111,198,106,219,157,225,105,154,102, 8,130, 0,143,199, 3,195, 48, 80,171,213,232,218,181, 43, 54,110,220,136,245,235,215,175,
+ 82, 42,149,135,219,147,159,176,176, 48, 81,215,174, 93,167, 79,154, 52, 9,249,249,249, 72, 72, 72,168, 80, 42,149, 41, 39, 78,
+156,120,106,206,156, 57,252,129, 3, 7, 66,163,209,224,251,239,191,167,174, 92,185,242, 93, 89, 89,217, 14,238,145,203,129, 3,
+ 7, 14,255, 98,161, 21, 16, 16, 48, 73, 36, 18, 45,152, 50,101, 10, 63, 36, 36, 4,229,229,229,112,118,118, 38, 9,130, 16, 2,
+128,171,171, 43, 41,147,201, 48,123,246,108,244,234,213,107,240,162, 69,139, 6, 10, 4,130,141, 10,133, 98,187, 61, 39, 86,169,
+ 84, 6, 30,143,183,119,238,220,185,171,211,211,175,118, 5,128, 63,254,248,227,142, 66,161, 88,172, 82,169, 12,109, 44, 71,125,
+ 80, 76, 66, 34,145, 94,234,222,189,251,221,168,168, 40,231, 9, 19, 38,192,203,203, 11,105,105,105, 88,179,102, 77,158,197, 98,
+ 89,118,230,204, 25,234,191,125,145, 41,179,185,236,202,193,131, 78,195,158,125,214,121, 94,108,236,167,175,206,157,251,217,251,
+239,191, 47, 8, 9, 9, 33, 12, 6, 3, 46, 93,186,196,238,219,183,143,252,254,195, 15,215,195,193, 65,120,113,223, 62,177,197,
+ 98, 41,108,163,181,100,232,160, 33,131, 67, 62,253,108, 3, 76,198, 90, 92,186,112, 4, 85, 85,106,108,222,178, 63,196,223,159,
+ 29, 90, 90, 90,122,198, 94, 46,130, 32,130,147,147,147,189, 89,150,133, 88, 44,198,202,149, 43,225,231,231, 7,103,103,103,212,
+212,212,224,173,183,222,114,153, 63,127,190, 11, 0,100,100,100, 52,132,103,176, 5,133, 66, 49, 96,246,236,217, 78, 20, 69,225,
+248,241,227, 22,130, 32,222, 59,117,234,212,183, 61,122,244, 16, 15, 30, 60,216,105,199,142, 29, 3, 1,164, 62, 44,161,213,206,
+227,110,157, 60,121,178,239,228,201,147, 89,161, 80, 72, 84, 87, 87,195,213,213, 21, 27, 55,110,212, 43,149,202, 35,237,110, 3,
+ 20, 37,150,203,229, 98,150,101,177,119,239, 94, 20, 22, 22,190,164,209,104,202,104,154,222,255,246,219,111, 47, 12, 9, 9,233,
+146,147,147, 83, 88, 83, 83,179, 86,165, 82,221,229, 30, 77, 28, 56,112,224,240,143, 66,189, 19,124,253,236,195, 35,184, 55,156,
+216,178,208,162,105,122,246,137, 19, 39,248, 12,195, 96,203,150, 45,184,114,229, 10, 43,151,203,223,147,203,229, 95,201,100, 50,
+218,104, 52,206,122,229,149, 87,166, 45, 95,190,156, 55,120,240, 96, 92,188,120,145,215,181,107,215,233, 0, 26, 11,173,104,180,
+ 18,107, 67,171,213, 94, 46, 47, 47,235,218, 40, 64,101, 87,137, 68,122,217, 70, 97,154,114, 54, 13,138,217,127,229,202,149,122,
+ 95, 95, 95,203,205,155, 55,241,205, 55,223, 48, 87,174, 92, 73, 17,139,197,155,149, 74,165,217, 78,206,135,129, 6, 78, 49, 69,
+165,253,184,112, 97,216,163,241,241,204,203, 11, 22,212,138,100,178, 55, 62,221,176, 97, 81,117, 77,141, 31, 8,130,245,112,113,
+ 41,220,178,114,101,194,216, 39,158,168,205, 56,115, 70,154,158,156, 44,244, 34,201,107,109,201,103,105,105,233,153,212,212,223,
+240,195,214,207, 96,181,154,161, 44,189,167,211, 42, 52, 90,216, 16, 89,127,226,164, 40, 74,251,212, 83, 79,137, 0,200,158,123,
+238, 57,177, 74,165,194, 35,143, 60, 2, 0,208,233,116, 56,114,228, 8, 66, 67, 67, 1, 0, 55,110,220,104,216,182,149, 79, 7,
+ 7,135, 39, 6, 14, 28,136,194,194, 66,100,100,100,156, 86, 42,149, 26, 0,167,139,139,139, 99,250,246,237,139, 3, 7, 14,140,
+111, 69,104,181,169,142,236, 20, 90,127,226,148,201,100,139,247,239,223,255,210,133, 11, 23, 38, 47, 92,184, 80, 56,114,228, 72,
+ 0, 64, 77, 77,141, 1, 0,221, 30,206,198,121, 34, 73, 18, 12,195,192,221,221, 93,175,209,104,160, 82,169,238,170, 84,170,185,
+183,111,223,110, 23,231,195,104,159, 28, 39,199,201,113,114,156,127, 19,206,127, 3,236,143, 12,207,178, 44,197, 48, 12, 82, 83,
+ 83,177,127,255,126,218,106,181,206, 84, 42,149, 55, 26, 37,217,144,150,150,150,252,212, 83, 79,109,207,201,201,225,103,102,102,
+130,101, 89,186, 45,185, 49,153, 76, 36, 65,252,121,223,131,150,242,135, 31,126, 64, 89, 89,153,181,184,184,248, 20, 69, 81, 7,
+ 30,112,246,226, 3,207, 58,252, 1, 48, 63, 99,177,156, 90, 62,104,208,168,101,201,201,146,151,223,125,215,252,194,139, 47,190,
+ 77, 91, 44, 36, 95, 36, 98,196, 14, 14, 60, 90, 34, 17,102,156, 57, 35,253, 98,206, 28,119,163,217,124, 60,177, 13, 14,230,245,
+ 22,173, 97,195, 6,227,133,151,223,132,177,145, 69,235,226,229, 92,152,173,104,147, 69,203,108, 54, 71, 40,149, 74, 72,165,210,
+ 34, 0, 62,207, 63,255, 60, 24,134,129,209,104, 68, 77, 77, 13, 20, 10,133,246,197, 23, 95,164,235,196,147, 96,226,196,137,206,
+246,240, 6, 5, 5,249, 9,133, 66, 28, 63,126, 28, 66,161,240, 8, 0, 8,133,194, 35,201,201,201, 49, 83,167, 78,133,191,191,
+127, 80,126,126, 62, 1, 27,254,105,222, 17,241,123, 88,160, 59, 8,116,187,103,130, 67, 55,175,136,248,235, 4,144, 87, 23, 53,
+ 62,171, 79,159, 62,128,157,126, 89,141, 81, 55,185, 99, 61, 73,146, 63, 47, 90,180,104,110,255,254,253, 71, 47, 95,190,156, 0,
+192,127, 24,119, 32, 69, 81, 15, 20,122,130, 3, 7, 14, 28, 56,252,173,173, 90,127, 66,139, 66,139, 32,136, 45, 67,135, 14,157,
+ 9,128, 79, 16,196, 55, 10,133,226, 70,211, 52, 74,165, 50,215,207,207,239,147, 46, 93,186,204, 2,192, 18, 4,177,165,141,153,
+ 42,103, 89,172,225,241,136, 69,247,196, 93,187, 2, 84,214, 47,117,178, 8, 0,193,227,241,183, 95,189,122,245,221,162,162, 34,
+181,157, 22,136, 86,241, 48,102, 29, 2,192, 79,192,221, 41,133,133, 39, 22, 68, 70, 70,143,157, 51, 7, 61,199,142,117,246,235,
+212,137, 54, 90,173,204,141,115,231,136, 11,123,247,138,210,147,147,133, 70,179,249,248, 1,160,168,173,249, 44, 45, 45, 61,243,
+107,202,153,147, 79, 79,140, 25, 29,212,197,239,158,104,184,171, 64, 69,165,246,100, 91, 68, 86, 19,209, 27,191,113,227,198,195,
+ 34,145, 72,208,120, 41, 27,171,213, 90,105, 54,155, 35, 0,160,170,170,202,111,203,150, 45,187,120, 60, 94,161, 45,190,204,204,
+204, 67,203,150, 45,155, 88, 80, 80,112,178,184,184,184, 0, 0,138,138,138, 10, 72,146,220,174, 84, 42, 39, 22, 22, 22,238,131,
+ 29,147, 0, 88,160,123,198,185,159,123, 0, 64,196,160, 73,200, 56,247,179, 20, 64,143,136, 65,147, 0, 0,237, 93,203,176, 49,
+234, 66, 43,188,119,241,226,197,157,163, 71,143,126, 5, 15, 16,211, 11, 0, 44, 22, 11,105, 52, 26, 41,154,166, 5, 86,171,149,
+181, 88, 44, 36,247, 76,226,192,129, 3, 7,251,193,178,108, 95, 0, 94,117, 63,235, 13, 40, 94, 77,182, 45,168, 91, 46,176,254,
+241, 91,247, 91, 77, 16,196,229, 70, 28, 13,251,237, 56, 22, 0, 42, 0, 92, 39, 8,162, 37, 35,200,150,150,126,183, 40,180, 20,
+ 10,197, 62,216,177,104,180,189,233, 90,193,146,186,117,226,128,246,175,237,214,192, 65,211,116,121, 81, 81,209, 3, 87, 40,143,
+199,187, 59,126,252,248, 54,165,183,149,102, 55, 80,248,186,217,188, 35,233,203, 47,123, 31,255,230, 27,127,154,162, 60, 8,128,
+229,139,197, 26,139,197, 82,224, 69,146,215,218,106,201,186,207, 26,115,167,116, 76,254,157, 82,116,235,214,141,189,117,235,214,
+ 61, 91,207,131,225,154, 94,175, 15,176,213, 4, 12, 6,195, 96, 59,197,224, 79,165,165,165, 63, 53, 35,216,119, 41,149,202, 93,
+246,102,170, 97, 81,105,128,199, 16,204,211, 17,131, 38,237, 5,192,212, 47, 42,253, 48, 81, 86, 86,150,131,186, 56,111, 15,130,
+194,194, 66, 51, 65, 16, 63,174, 89,179,230,185,244,244,244,221, 10,133,194,204, 61, 54, 57,112,224,192,161,109, 34,139, 32,136,
+164,186,223,113,117, 70,161,164,166,219,245,105,234,211, 53, 78, 83,207,209,116,127,107,199, 2,192,226,197,139,223, 77, 72, 72,
+144, 3,176,119, 49,230,118, 47, 42,253, 87,161,252,111,194,209, 88, 20,108,253, 43, 10,250, 37, 96, 1, 69,253, 14,170,145, 79,
+ 62,249,112,141, 27,183,110,221, 34,254,205, 55, 92,253,162,210,141, 16,249, 79,200,119, 65, 65,193,198,192,192,192,205, 10,133,
+130, 2, 7, 14, 28, 56,112,104, 11,188,154, 19, 70, 45,136,178,184,214,254,191,175,227,222, 76,186,230,126, 19, 4,145,148,144,
+144, 16,215,134,252, 54, 88,180,120, 92,221,113,224,240,223,195,255,199,172, 87, 14, 28, 56,112,224,208, 60,154, 90,177,234,197,
+ 87,211,223,139, 23, 47,126, 23,173,143, 56,249,226,158, 21,203,183,238,119,131,191, 22,129,123, 51, 7,154, 67, 91,102, 19, 68,
+183,163,124,167, 56, 78,142,147,227,228, 56, 57, 78,142,147,227,252,159,227,180,197,125,170, 25, 65, 20,219,210, 80, 95,107,195,
+136, 77,183,109, 29,107, 43, 45, 65, 16, 45,133,249,169, 31, 42,108,250,253,151, 35,154,227,228, 56, 57, 78,142,147,227,228, 56,
+ 57, 78,142,243, 65,192,178,108, 95,150,101, 99,113,111,194, 20,203,178,108, 44,203,178, 99, 23, 47, 94,188,164,126,223,226,197,
+139,151,176, 44, 59,178, 62, 93, 93,154,134, 99,234,247, 53,253,110,186,175,181,180,173,100,113,102,147,237,134,223,127, 23, 31,
+ 45, 14, 28, 56,112,224,192,129, 3,135,102, 81, 63, 99,176,145,181, 73, 13,224, 70, 66, 66, 66, 85, 35,223, 41, 53,128,107, 0,
+122,213,165, 83,215,137,180,198,190, 85,150,186,223,150,102,210, 88,236, 73,219, 2,182,180,176,205, 9,173,150,208,203,135,247,
+ 97, 96, 71,239,168,186, 10, 0,203, 48, 0, 0,166, 46, 6, 18, 91, 31, 12,137, 97,192,178, 44, 20,170,234,180, 27, 42,188,223,
+222,243, 5,251,193,221, 91, 42, 93,207,176,236,160,186, 93,103,180, 26,243,155, 25, 58, 84,219,203, 17,218, 1, 97, 82, 30,222,
+102, 88,244, 4, 0, 30,129,235, 38, 6,159,100,151,183, 61,158, 84,115,237, 60,194, 11, 51,197, 50,249, 20, 23, 87,183,110, 85,
+ 85, 21,121, 86,147,249,231, 76, 53, 54,163,237,235, 50, 34,200, 13,143, 49, 44,222, 5,192, 19,242,176, 46,175,210,238,153, 28,
+ 28, 56,112,224,240,160,214,145, 7,138,139, 71, 16, 4,221, 12, 39,241,128,156, 92,128, 61, 59,196, 86, 51,187,255,104,102,223,
+229,191, 83,190,219, 36,180,194,189, 48, 7, 4, 86, 0, 96,193,226,131, 76, 53,190,110,211,241,190,136,150,242,249,219, 0,240,
+ 77, 86,122, 1,203,224,108,179, 23,147,135, 33, 82, 17,127, 29, 0,198, 68,211, 51, 50,149,246,251,139, 69,248, 99,172,128,225,
+253,200,176,172,144,102,216,237, 96,145,228, 40,194,249,223, 75, 97,106, 75, 94, 3, 59,122, 71, 29,252, 67, 57, 58,229,235,121,
+232,223,243, 17,176, 52, 5, 48, 36,228,131,223,198,233,207,159, 71,255,176, 64,176, 12, 9, 48, 20, 28,199,125,138,113,145, 46,
+236, 13, 85,251,214,193, 14,246,131,123, 39, 79,239,155, 91,183,110,243,241, 11, 10, 39, 24,202,138,156, 63, 78, 78,155,191,104,
+217,136, 8,104, 35,237, 17, 91, 61,125,241,114, 96,231,144,183,223, 92,241, 25,223,215, 47,192,129, 33,205, 84,217,221,172, 62,
+ 27,214, 46,219, 39,226, 21,174,187,174,196, 54,123,219,114,184, 23,102, 9, 36,226, 73, 50,169, 67, 55,131,161,230, 22,109, 37,
+127,230, 9, 5, 99, 63,249,116,125,239, 97,163, 98, 28,233,154, 50, 30,201, 32,124,207,238, 93,157,190,220,184, 41,230,166,146,
+126, 2, 0,211,150, 50, 51, 44, 22,229,238,152, 25, 35, 20,240,137,176,151,182,242, 1,170, 93, 66, 43,204, 27,207, 16, 44,108,
+134,151, 96, 9,252,150,165,194, 79,237, 57, 71,168, 55,190, 37, 88, 4,131,192, 94,130,197,174, 76, 53, 84,220, 35,143, 3,135,
+127, 23,120, 60, 94, 10,195, 48,195, 31,178, 48,120,140,101,217,223,185,171,251,191,141,182, 89,180, 8,172,202,184, 93,236, 6,
+218,138,136,224,160, 15,129,182, 9, 45, 41,159,191,253,114, 94,185, 15, 40, 43,182,126, 52,119,183,133, 4, 40,210, 10,154, 34,
+ 65, 83, 36, 40,202, 10,154, 36,193,146,102, 44,251, 46, 5,176,212, 32, 42,178,251,118,128,246,181,247, 28, 66,150,247, 99,218,
+185,147,238,132, 69,139,159,190, 78,120,189, 88, 93,251,250,169,235,138,138,112,111,227,146, 76, 21,190,111,139, 32, 72,249,102,
+ 30, 18, 15, 28, 41,249,226, 91,125, 54,195,178,112,119,150,133, 76,139,203, 8,216,113, 40,165,120,253,118, 83, 54, 0,184, 56,
+136, 67,166, 95,207, 11,124,144, 74,240,150, 74,215,111,222,244,165,143,175,135,140,160, 46,172, 6, 69,211, 8,232, 20,203, 95,
+242,218, 52,223, 85,159,111,251, 28, 58,243, 11,173, 29, 31,226,141,240,206, 93,194, 22,108, 63,114, 33, 80,175, 83, 89, 78,238,
+124,247, 54,204, 32,125,252,195,132, 31, 38,124,198, 95,250,206,188,183, 44,116,201,165, 28, 21, 50,109, 61,107,194,188,113, 40,
+ 97,245,167, 61, 71,140,139,115,100,106,213,124,147,190, 54,120,235,119,219, 86,132,246,236, 39, 31, 28,217, 81,164,250,121, 54,
+ 97,172,169,132,149, 39,149,140,136,136,118, 54, 62, 55,149,220,250, 67,226,107,153, 42,108,104, 75,153,105,246, 63,109,143, 97,
+218, 31,117,157, 96, 49, 56,253,247,148, 89,180,226, 50, 88,154, 4,104,107,195, 55,104, 18, 44,115,239,187,255,236,239, 0,180,
+ 79,104,241, 88,140, 62,117,238,178,111,121,153,178,239,231,159,126,188,132,189,124,249, 24,104,252,152, 85,137, 51,109, 21,152,
+ 28, 56,112,248, 91, 91, 76, 40,150,101, 5, 15,153, 51,134,101,217,163, 15, 72,243, 54,128,151,235,182,183, 1,248,228, 33,100,
+173, 35, 0,159,186,237, 50, 0, 37, 92, 11,120, 32, 52,117,126,111,119, 28, 45, 41, 88, 6,216, 59, 1, 0,100,109,205, 5, 11,
+ 72, 65,240, 1, 82,143,248,113,163,224,233,237, 3,144, 6,192,106, 0, 72, 35, 64,234, 1,210,136, 10,101, 33, 96,213, 3,249,
+199, 64,177,172,164,205,197, 53,107,129,220,159, 49,178, 79, 32,188, 92,164,152, 23, 31,238,185,229,120,238,182,109, 39,115,162,
+ 51, 85,152, 98, 87, 94, 89, 22,253,123,116,195, 23,219,244,217,191, 92, 85,143, 1,128,152, 94, 30,199,251,135,119, 10, 88,191,
+221,148,125,244, 70,213, 88, 0, 24, 27,225,124,172, 95,136,111, 32,131,246, 91,125, 25,150, 29,236,215,185, 27, 65,167,111, 6,
+163, 43,129, 78,103, 68,201,221, 29,112,243,127,148, 71, 51, 24,106,235,120, 25, 31,139,223, 88,186, 70,104,208,149, 91, 24,171,
+154,246,226, 87,241, 5, 98,134, 64,233, 25,115, 45, 83, 77,191, 57,243,121,106,193,251, 31, 45, 6, 48,173, 53,158,112,111,188,
+182,110,221,250, 30, 3,163, 66,189,203,246,205, 35,106,171,202, 65,241,229,146,248,199, 7,194,181,123, 56, 83,158,186,142, 16,
+ 7, 69,195,213, 35, 8,165, 23,118,162,224,247,253,196,160, 62, 19, 37,223,255, 36,122, 14,176, 54, 43,180,186,121, 98,208,152,
+ 33,253,118, 7, 5,250,249,178, 44, 3,134, 97,193, 50, 52,106, 77, 36,150,236,201, 7, 77,211,120,106,204,160,145, 14, 98,130,
+101, 24, 6, 44,203,160,184, 76, 99,248,245, 82,246,200,252, 42, 92,178,199, 82,213,235,177,225,131,174,167,253, 30, 74,230,254,
+130,168,105, 9,217, 4,112,174, 81,155, 27,116,245,196,247,161,192,119,237,215,114, 4,232,130,227,171, 17, 56,100, 38,127,243,
+ 79,199,189,180,234,210,233,251,118,108,122,250,235,205,155, 19,179, 85,152,205, 61, 95, 56,112,248,119,128,101,217,135, 46,182,
+ 10, 11, 11, 21, 15, 34,182,252,253,253,135,148,150,150,174,173,247, 86, 33, 8, 98,109,231,206,157,151,253,167,163,122, 95, 95,
+ 79, 75,211,244,180,210,210,210,179,173,113,198,198,198,250, 29, 57,114,164, 75, 35,206, 46, 0,186, 52,151,214,213,213,149, 30,
+ 48, 96, 64,193,145, 35, 71, 20, 92, 11,105,151,224,106,179,208,202, 46,250,121, 94, 31,179,178, 22, 0,178,237, 72,127,223,144,
+159,137,164, 87,255,176,226,249,213, 17,157,221, 81,163,183,224,228,149, 2,208, 52, 9,154,162,234, 44, 91, 20,104,138,196,152,
+ 94,158, 24, 96,154,141, 13, 73, 57,160,104, 38,161, 53,206,166,176,178,204, 51,189,163, 39,239, 97, 24, 86, 44, 17,242,180,193,
+ 1, 30,222, 11,158,234,197,155, 23, 31, 1,163,149,154,188, 51,245,246,175, 89, 42,108,181,139,147,249,115,200, 35,182,185,125,
+ 52,101,179,236,173, 88,163,250, 71, 15, 27,236,204,154,181, 32, 43,242, 81, 99, 32,145,175, 33, 81,102,170,134,132, 80,218,197,
+201,176,232,217,209,223, 87,126,126,247, 59,119, 61,248, 58,129, 55,159, 18,137,121, 20,104,134,229,179,213,153,102,247,208, 81,
+194,122,191,173,214,242, 41,147, 59, 61, 63,100,116,172, 75,209,206,153,132, 44,120, 12,188,251, 4,224,238,217, 31,160,186,146,
+ 4,141,162,128,112, 54, 85,163,131,199, 35, 24, 55,109, 10, 62,153,210, 23, 53,186, 26,240,149,183, 93,196, 66,137, 43, 96,109,
+150,147,165, 49,109,221,154,143,124, 5,124,222,189,235, 89,255,161, 73, 24,205,102,128,166, 32, 21, 48, 32,216,250,255, 72,208,
+164, 85,222,115,226, 59,115, 1,250,146,173,178,103,169,240, 83,184, 23, 6,131, 33, 67, 89,210, 8, 2, 56,151,169,254,143,248,
+ 9,243,198, 51,143,142,121,113, 48, 75,224,183,246,212, 81,164, 7,226,162,186, 56, 58, 56,232,178, 81,178,247,117,220,134,148,
+237, 48,240,101, 60,243,210,107,242, 45, 91,182,140, 7,216, 57,184,223, 71,237,175, 88,100,149,227,228, 56,255,145,156,206,206,
+206, 93, 59,119,238,188,140, 36,201, 33, 34,145,168,131,213,106, 5,195, 48,101, 98,177,248,183,130,130,130,149, 58,157,238,206,
+223,173,236,215,175, 95,111,139,216,178,201, 41, 20, 10,145,147,147,115,171, 13, 98,235, 84,147,227,127, 60,119,238, 28,246,236,
+217, 3, 0,200,205,205, 69,247,238,221, 29,154, 59,240,238,221,187, 14,195,134, 13,251, 17, 64, 64,107,156, 55,110,220,232,250,
+203, 47,191, 96,239,222,189, 0,128,156,156, 28, 4, 7, 7, 55,155,153,115,231,206,241,159,125,246,217,174, 0, 20,255,133, 58,
+250, 55,136,172,198,223,255, 17, 90, 73, 73, 73,108, 92, 92, 28,209,116,187, 25,228, 7,186,137,251,192, 68, 3, 64,126, 91,115,
+144, 85,142, 53, 95,236, 56, 49,246,244,222,141, 67,164, 34, 30,150,111, 93, 80,172,174,172,121, 76, 64,220, 27,126,161, 88,240,
+220, 28,197, 23, 19,166,247, 10,172,170, 53,225,240, 31,165,103, 51, 85,109, 51,145,102, 42,145, 12, 48,174,247,126,209, 48, 25,
+ 85,193,211, 63, 73,222,181,107,241,216,158,111,198,247,196,161, 11, 5,111, 2,148,205,168,239, 44,195,128,101,168, 6,231,247,
+186,174, 3,192,220,191, 40, 48, 3,246,222, 62,166,109, 22,173,161,128,160,202, 27,227,156,228,226,175,102,205,122,197,153, 84,
+231,161,210, 34, 66,113,149, 9,101, 70, 33,106, 5,222, 40,205,190, 65,243, 8, 36,219, 52,185, 16,208,177,148,201,213, 77,236,
+200,139, 28, 53,215, 95,119,252,221, 42, 49, 65,241,157,159, 92,229, 90,113,250,179, 2, 74,175,214, 19, 4,108,134,159,119,113,
+113,237,110,210, 20,240,181, 85, 21,112,245,137,192,216,201,113,248, 32, 54, 28, 53, 58, 61,212,149, 23,217,110,190,206, 68,225,
+111,137, 88, 58, 46, 12,154,114, 37,204, 36, 64,232,205,149, 38,139,169,182,197,235,200,195,230,249, 11, 23, 61,211,201,215,203,
+161,126, 82, 1,203,208,232, 21, 22,132, 81, 67,250, 35,249,220,121, 92,190,145, 11,166,110, 82, 1,203, 48, 40, 81, 85,149,155,
+172,244, 15,109,186,160, 52, 5,150, 52, 53, 43,196,208,142, 33,195, 72,111,200,105,224,253,190, 93,157,102, 44,142,235,228,228,
+ 32, 33, 96, 34,105,152, 44, 36,106,206,127, 5,143,206, 61, 32,151, 74,137, 62, 48, 10,174, 2,220,186,133, 28, 56, 52,194,211,
+ 79, 63, 45, 45, 47, 47, 79, 13, 8, 8, 8, 31, 53,106,148,124,240,224,193,208,235,245, 56,121,242, 36,244,122,125,167,128,128,
+128, 78, 39, 79,158,156, 88, 84, 84,148,217,177, 99,199, 97,123,247,238,181,219,135,182, 78, 0,241, 27, 30,193, 0, 69, 16, 4,
+234,246, 17,117,251,218,189,206,173, 88, 44, 70, 97, 97,225, 67,183,108,149,150,150,222,106,143,101,171,182,182, 86,228,239,239,
+ 15, 47, 47, 47,208, 52, 13,189, 94,143,131, 7, 15, 66,171,213,130, 97, 24,200,100, 50,172, 90,183, 21,217, 87, 83,113,233,210,
+ 37,104,181, 90,145, 45,206,146,146, 18,162, 87,175, 94, 48,155,205,160, 40, 10, 38,147, 9,167, 78,157,106,248, 45, 16, 8,176,
+232,195,207,145,123, 37, 21,233,233,233, 40, 41, 41,249,175,172, 54,210, 6, 45,242,119, 68,139, 49,179,254,235,179, 14,105,154,
+ 90,178,101,251,174,139, 75,102, 79,193,107, 83,163, 3, 86,110,220, 31,157, 85,129,237, 0, 16,230,137,233,207, 13,239, 22,232,
+ 42, 23,226,131,157, 87, 0,150, 93,242,160,231,203,168, 68,110,120, 7,230,205, 3,151, 10, 83,223,157,210, 7, 65,190,206,221,
+171,196,149,226,252,124, 59,214, 20,100, 40,184, 57, 74, 66, 98,122,121, 28, 7,195,192,213, 73, 18, 10,154,130,171,163, 36,100,
+108,132,243, 49, 0,112,150, 11, 67,155,179,124,181,132,168, 0,225, 76,185, 68, 48,211,193,201, 53,240,133,241,163,100, 49,227,
+ 39,202, 28,133, 20, 52,151, 78, 66, 39,236, 8,210,189, 19,204,100, 37, 74,238,220,166, 79,255,158, 85, 90, 81, 99, 94, 96, 51,
+155, 44,206,150,222,201,241,234,218,115,148, 91, 69,210, 82, 85,215, 23,119,118,225,129,225,213, 36, 62, 89,238,224,221, 79,246,
+ 71,254,157, 90,134,109,214,162,115, 31,116, 90,109, 1, 73,195,215, 72, 11,156,110,167,124,143,197,227,122,160,170, 82, 5,147,
+149,130,214, 72, 89,125, 92,165, 18,243,157,155, 48, 91, 41, 88, 72, 6, 66, 87,127,156,188,120,163,130, 33,201, 99, 45,113,230,
+107,144,158,127, 48,221,177,241,190, 32, 79,244,122,199, 89,150, 14,210,136,194, 18, 5,182, 31,185,216, 39, 95,131,244, 7,169,
+103,150,161,238, 13, 63, 55,178,100, 17, 44, 6,183,199, 9, 62,212, 27,253, 68, 82,209,151,107,223,124, 54,252,241, 96,119, 9,
+ 83,114, 17, 4, 99,133, 3, 45,128, 81, 76,195, 37, 32, 8,140,165,134, 53,152, 76,213, 25, 0, 23,233,157, 3,135, 70, 8, 9,
+ 9,241, 41, 45, 45,205, 88,184,112,161,251,147, 79, 62,137, 3, 7, 14, 64,167,211,225,135, 31,126,192,250,245,235,177, 98,197,
+ 10,144, 36,137, 45, 91,182,200,247,237,219,215,111,211,166, 77, 37,129,129,129, 17, 69, 69, 69,101, 54, 4, 22, 1, 64, 2, 64,
+ 88,247,238, 34, 0, 48, 71,143, 30, 69, 76, 76, 12,142, 30, 61,202,212,237,163,113,175,243,211,174,245, 68,197, 98, 49,196, 98,
+ 49,180, 90,237, 67, 17, 91, 66,161, 16,142,142,142, 16,139,197,168,169,169,105,179,216,162, 40,138, 95, 82, 82, 2,173, 86,139,
+ 81,227,199,227,243,132, 4, 12, 31, 62, 28,163, 70,141, 2,203,178, 56,117,234, 20,162, 7, 70, 98,202, 19,195,144,149,149, 5,
+138,162,236,202,111, 89, 89, 25,202,203,203, 49,118,252,120,108,221,180, 9,253,251,247, 71, 72, 72, 8, 40,138, 66,106,106, 42,
+158, 30, 51, 16,210, 9,209,200,205,205,229, 26,181,253,214,172,135,226,163,245,192,200, 80,227,119,230,208,153,164,169, 99,250,
+197,141, 31, 20,142,173,187, 79,127, 4, 47,221, 46, 0,240, 48, 75, 86, 61, 63, 60, 8,153, 69, 85, 56,157,174, 72,202,170,192,
+ 67,153,173,193,208,240,244,112,150, 3,124, 49,140, 86,134,114,206,183,237,192,204,176, 44,228, 67,222,193,115,227, 51, 3,250,
+135, 7, 4,212,207, 58,116,140,249, 12,211,111,220, 10,236, 27,226, 19, 8,154, 4,104, 18,206, 83,118, 2, 31, 58,216,204,199,
+192, 46,226,228,249,243,230, 13, 24, 55, 97,178, 76, 44,119, 1,173, 43, 6, 89,118, 3,154,188,179,208,203,187,163,172, 48, 31,
+123, 78, 92,210,230,149,104,116, 60, 30, 78,150,107,205,111,231, 87,161,214, 22,175,137, 68,194,178,165, 11, 98,247,236,218,237,
+ 36, 9, 26, 68,220,254, 42, 70, 43, 22, 80, 18,175, 46,143,242, 12, 82, 79,246,227, 31,118, 59,235, 45, 88,109,139,199,160,215,
+237, 63,117,242,248,148,110, 93, 7, 57,221,189,124, 4, 70,147, 25,102, 18,136,232, 55, 12, 52,205,138, 9, 30,193, 56,243,249,
+132, 74, 83, 5,130,164,203,127,187,118, 87,121,238, 90, 62,223,236,132,213,173, 70, 23,105,170,238, 9,254, 27,227,135,245, 6,
+ 72, 35,158, 24,210, 3,159, 39,158,126, 29,160, 95,124,176, 74,190,103,209, 98,129, 65,225, 94,248,134,101, 49,232,202,193,245,
+161, 81, 19,230,163, 45, 22,173, 8, 79,140, 11,235,234,247,253,231,171,222,113,247,232,216,157, 79, 48, 36, 88,159,158,128,174,
+132, 37, 74, 46,194,197,191, 63,104,191,129,216,178,225,211, 90,134, 97,119, 1,224,166,100,115,224,208,248,121,100, 50,237, 95,
+179,102,141,123, 92, 92, 92,189, 69, 6, 23, 47, 94,196,182,109,219,224,224,112,255,115, 50, 38, 38, 6, 44,203,186, 47, 95,190,
+124, 63,128,199, 91,226, 28, 48, 96,192,248,244,244,116, 69,239,222,189,243,235,196,150, 8, 0,239,230,205,155,188,226,226, 98,
+194,205,205,141,245,243,243, 35, 21, 10, 5, 3,128,126,233,165,151,248, 63,255,252,115, 55,189, 94,127,166,189, 66, 75, 44, 22,
+ 63, 20,159, 45,161, 80, 8,130, 32, 32, 22,139, 33, 18,137,192,178,108,155,196, 22, 77,211,130,163, 71,143,226,202,149, 43, 88,
+209,187, 55,222,244,247,135,187,187, 59, 82, 83, 83,193,178, 44, 28, 28, 28, 80, 89, 89,137, 93,187,118, 97,196,136, 17,160, 40,
+ 74,100, 15,239,222,189,123,145,150,150,134, 15,163,162,240,166,139, 11, 28, 29, 29,113,234,212,189,209, 64,137, 68,130,194,194,
+ 66,156, 58,117, 10,195,134, 13,227, 26,245, 3,194,238,198, 51, 20, 16, 84, 18,240,177, 90,140, 96, 41, 22, 32,224, 23, 22, 6,
+ 81, 86,214,253,206, 57,246,128,199,195,210, 13,219,147, 98, 63,155, 63,158,152, 25,223,199,111,229,247, 41,115, 0, 96,198, 83,
+193,254,114,137, 0, 95, 28,202,100,121, 60, 44,125, 24, 5, 12, 11,131,136,208, 96,206,168,254, 33, 80, 84, 91,112, 91, 81,253,
+107,150,157, 67, 61,167, 63,123, 14, 59, 14,167, 22,175,223, 97,202,102, 89, 22,174,142,146,144,233,215,111, 7,126,127, 52,173,
+104,221, 30, 83, 54,203,176,112,149, 11, 67, 95,204, 26,104,115,214, 97, 84,128,112,230, 91, 11, 22, 12,140,127,113,161,148,202,
+254, 25,150,219, 39,192, 88,141,208, 89, 69,168,230,251,160,164,168, 8, 31,111, 73, 42,214,233, 45, 83, 50,212,109, 19,152,121,
+ 26,212, 10, 8,221,147, 31,127,240,110,114,194,170,229,142,198,252,212, 90, 62, 65, 25,249,157,135, 10, 86,173,248,140,168, 49,
+ 91, 38,231, 87,161,198, 22,143,217, 9,171,215,172,219, 16,251,202,180,137,217,193,221,135,122,208,138, 59, 30, 38,157, 78,181,
+243,120,154, 79, 93, 79,145, 0,128,219, 37, 26,168,181,122,138,166,200, 51, 78, 66,172,204,180,199, 58, 88,135,174,222,240,138,
+ 27, 20,241,172,151,147, 8,198,218,106,120, 59, 9, 49,166,255, 35,207,146,127,228,190,115, 71,213, 22,185,214, 84,104,145, 96,
+ 73, 35,126, 95, 61, 34,148,165,201, 80,208, 36,172,215,127,108,187,101,140,192,155,175, 13,113,116,118,179,220,229, 65,239, 0,
+200, 60, 65, 56,119, 2, 92,186, 16,194,176,201, 80,228,103, 80,175, 63, 59, 77,115,167,160,228, 91, 79,217, 67,153,249,195,129,
+195,191, 10,133,133,133,207, 47, 89,178,228, 92,255,254,253, 59,120,122,122,162, 71,143, 30, 4, 75, 75,198, 0, 0, 32, 0, 73,
+ 68, 65, 84, 56,124,248, 48, 22, 46, 92,216,144,166,119,239,222, 96, 89, 22,149,149,149, 88,179,102, 77,153, 66,161,120,190,213,
+ 14,122, 70, 70,246,142, 29, 59,134,132,135,135, 91, 69, 34, 81, 53, 0, 73,117,117,181,180,178,178,146, 48,153, 76, 96, 24,134,
+113,113,113,161, 21, 10, 5, 57,101,202, 20,243,133, 11, 23, 30,209,235,245,133, 15, 98,209, 10, 8, 8,184,169,209,104,180, 4,
+ 65, 60,112,232,135,122,145,229,233,233,233, 85, 91, 91,203, 0,168,106, 79,232, 7,138,162, 16, 21, 21,133, 19,103,175,226,232,
+233, 11,208, 41,114, 48,231,149,231,209,163, 71, 15,156, 56,113,162,221,117,214,171, 87, 47, 28, 63,117, 14,231,174, 92, 67, 97,
+238,117,188, 62,231, 21, 68, 68, 68,224,248,241,227, 92,131,182, 31, 71,112,191,111,214,145,166, 66,107, 88, 82, 82, 82,125,207,
+252, 79,242, 53,212, 19,189,132,174,226, 31,151,143,123, 36, 76, 56,106, 57, 8,161, 12, 63,119, 63, 62,112,233,199, 95,101,243,
+189, 11,167,221, 84,217,158, 29,118,223, 77,163, 66, 6,123, 41,251,167,107, 89,161,207, 62,209, 63, 0, 91, 15,203,223, 7,128,
+201,131,187,226,143, 60, 53, 46,229,170,126,202, 84, 35,227, 65, 75, 29,233, 13, 57, 93,129,159,214,188, 17, 63,172, 83, 71, 31,
+108, 59,112, 14, 4,129,253,118,189,112, 89,150,237, 31,222, 9,235,119, 52,157, 97,232, 19,184,110,143, 41,251,100, 70,205, 56,
+ 0, 24, 21, 42, 63,214,247, 17,183, 64,182,177,227, 86, 51,144,137, 5,179,198, 77,124, 78, 74,229, 30, 6, 10, 78,129,160,204,
+ 48, 90, 25, 40, 43,106, 96,112, 9, 64,234,197,107, 70,173,201, 50, 63, 83,221, 62, 43, 94, 86, 5,242, 69,151,175, 21,213,234,
+141,190,114,175, 71, 76,124, 30,195,212,154, 89,252,145, 89,160,203, 44, 67,142, 61, 28,249,249,176, 60,230, 79, 13,254,102,251,
+158,101, 66,145,120, 50,159, 0,225,237,234,224,245,205,103, 31,194,201,201, 17,140,165, 22,208,171,241,228,171, 31,171,111, 42,
+200,174, 0,208,221, 3,142,131,187, 10,183, 11,120, 68, 73,202,109,235,123,182,206, 65,144,152, 61,109, 76,111, 33, 99,209,227,
+141, 53,187,177,249,157,120, 60, 55, 50, 76,120,228,124,238,108, 0, 43,219, 91,215, 44, 77,129, 37,141,120,252,221,179,217, 4,
+112,142, 5, 6, 93,217,179, 42, 20,184,106, 55, 71, 31, 64, 72, 11,136,176,158,129, 14, 34,166,228, 60,152,146,243, 44, 63, 96,
+ 32,136,192, 33, 4,225, 19,197,126,185,118,133,126,235,214,109, 39, 25, 30, 62,176, 35, 84, 6, 7, 14,255,171,200, 87, 40, 20,
+ 99, 99, 98, 98, 78,159, 56,113,194, 61, 50, 50, 18, 0,112,229,202,149,123,157,206,168, 40, 4, 7, 7,163,188,188, 28, 83,167,
+ 78,173, 80, 42,149, 99, 97,195,231,183,166,166,230,206,222,189,123, 59,232,245,250,222,239,189,247,158,170, 83,167, 78, 58,147,
+201, 68, 84, 87, 87, 51, 20, 69,193,205,205, 77,220,187,119,111, 12, 24, 48,160,246,226,197,139,157,139,139,139,107, 0, 20,180,
+ 39,243,241,241,241, 56,123,246,222,164,189,135, 17, 87, 75, 36, 18, 33, 50, 50,210, 63, 63, 63,191,180,238,221,210,230,103,124,
+227,215,203,181,107,215,112,230,106, 9, 4, 22, 35,196,106, 5,126, 63,176, 23,227,103,205, 5, 69,181,223,139,225,255,216, 59,
+239,240, 40,170, 54,138,159, 41,219,178,233,101,211, 11, 33,144, 64, 32,244, 78, 16,144,166, 18, 62,138, 84, 65,154, 64, 64, 20,
+ 16,165, 35, 69,165, 35, 69, 58,168,244,142,148,160, 2, 81,122, 9,157,132, 36, 4, 2,132,180, 77,239,217, 62,229,251, 35,197,
+ 4, 82,118, 19,108, 56,191,231,153,103,182,204,158,157,153,187, 59,247,204,123,239,125,239,253,251,247,113, 60,244, 6,204,165,
+ 52, 30, 61,122,136, 35, 71,142, 96,226,196,137,181,210,172, 33, 85,122,145,127, 56, 74, 84,210, 79,139, 6,128,160,160,160,139,
+ 37,209,138,178,248,248, 64, 34, 45,192,130, 30, 45,220,102, 12, 14,172, 71, 25,242,146,193,177, 28, 40, 17,224,232, 96,133, 61,
+123,246,215,221,127,240,224,245, 77, 27, 55,173,231, 24,102,110, 68, 26, 84, 38,236,212,130,111, 15, 94, 25,188,103,122, 23,122,
+226,187, 13,237, 0, 64, 76,147, 88,119,242, 33, 3, 96, 65,109,142,182,157, 27,100, 5, 6,140,119,180,183,158, 63,251,163,222,
+118, 93, 90,249,225, 98, 88, 4,214, 31,185,126, 73,146,134,221, 70,255,184, 57, 3, 94,246, 79, 21,141, 58, 4, 87,125,191, 75,
+150,229,157,197,230,182,208,199,157, 7,244, 26,104,180,122, 36,100,178, 72,200,210,128,150,139,113, 59, 38, 81,109,159,130,144,
+ 90, 28, 54, 97, 46,151,185,126,249,205,106,119,141,186,128,201,203,206, 96,196,146, 27, 34,185,153, 84,105, 74, 87,133, 27, 73,
+208,188,229, 45,106, 9,112,148, 68,198,171,230,124, 54,202, 60, 41,242, 12,234,147,201, 32,120, 30,102,254,189, 97,105, 70,137,
+ 3,235,136,226, 1,192,220, 92, 46, 89,190,232,115,235,169, 51, 23, 85,219, 7,204, 31, 16,251,249, 56, 79, 13,240,178,197,165,
+ 59,209,184, 20,254,226,225,165,219,143, 26,119,109,226, 10, 63,119,155, 41,146,236,156,101, 81, 48, 61, 66, 90, 84, 48, 12, 96,
+208,148,142, 58,244,119,196,176,214,131,231, 85, 54,218,176, 66,188, 1, 46,134,229, 65, 80, 20, 64,144, 69, 35, 32, 19,174,130,
+182,241,225,247, 31, 58,174,218,177, 99,247, 87, 81, 25, 66, 20, 75, 64,160, 58,114,115,115, 31, 68, 69, 69,245,106,218,180,233,
+206, 79, 63,253,212,114,248,240,225,174,227,198,141, 35, 1, 32, 53, 53,149, 91,187,118,109,242,119,223,125,151,155,145,145, 49,
+218, 96, 48,132, 27,243, 15, 87, 42,149,215,190,255,254,251,244,203,151, 47, 55,110,211,166,141,180,101,203,150,156,173,173, 45,
+ 45,149, 74, 89,157, 78,167,137,137,137, 97,159, 62,125,234,146,147,147,243, 4, 64, 44,106,208,172, 95, 28,189, 90, 76, 81,212,
+151, 60,207, 7,188,142, 62, 90,114,185,220, 21,192, 19,130, 32,234,155,218,108,248, 74,133, 77,211,200,206,206,134, 42,229, 33,
+100,137,143,209,212,156, 68, 35, 91, 11, 88, 89, 89,213,202, 20,229,230,230, 2,133, 73,184,114,229, 62,192, 48,176,182,182,134,
+181,181,245, 95,110,180, 42,243, 34,255, 18,198, 87,240, 90,213,125,180, 26, 41, 48,209, 76,135,181, 19,122,215, 19,123,123,186,
+ 67,155,120, 27,247, 19, 10, 48,183, 93,155, 72, 74,106,169,153,240, 97,223, 86, 3, 6,214, 65,151, 14,173, 9,111, 23,235, 41,
+203,190,221,252,113, 35,100,124, 30,153,134,117,198,236, 81,100, 58,158,113, 72,219,113,254, 65, 98,176,187, 92, 13,142,227,113,
+ 62, 92,137,240,184,236, 29,209,233,120,102,202,209, 53,114, 65,119, 26,228, 65,158,231,101,214,230,230,249,141,252,220, 29,186,
+183,111, 70,190,211,185, 21,196, 20,112,229,230,125, 76,251,246,216, 13,142,227,123, 27, 61, 66,140,227, 94, 49, 80, 69, 35, 12,
+ 13,229, 70, 24,242, 60,207, 23,141, 58,172,186,219, 23, 69, 17, 41,170, 23,183,156, 69,246,190, 80,199,158, 71, 92, 54,135, 23,
+105,249,200,163,157,161, 77, 74, 2,120, 46,254, 98, 45, 58, 86, 59, 56, 56, 56,214,109,228, 87,111,195,174, 35,208,171,114,241,
+236,194, 78, 20,100, 43,241,245,150,147,245,220,220,236, 59, 39, 37, 37, 93, 52,225, 98,227,247, 91,200,126, 71,240, 0, 37,146,
+226,244,166, 67,200,176, 55,131,131, 92, 12, 78,157,142, 9, 83,135, 91,191,219, 99,184, 53, 0,188,120,116, 15, 94,114,181, 81,
+186,122,123, 12, 24,220,181,129, 13, 12,106,236,250,245,158,134, 4,222,217,125,246, 97,108,215,134, 54,178,193,129, 94,182,139,
+147,115,222, 71,102,205,146,138,150, 68,180, 74, 35,124, 53, 24,109,120, 4, 96, 27,114,136, 61,120, 45,205,124, 96,143,150,114,
+ 49, 77, 16,124, 65, 18,120, 51, 7,108,222,117,184, 64, 98,248,107,102, 98, 23, 16,120, 19, 80,171,213,119,212,106,117,147, 47,
+190,248, 98,216,156, 57,115,222, 50, 55, 55,175, 11, 0,133,133,133,207, 12, 6,195,165,226,255,167, 41,163, 3,121, 0, 79, 98,
+ 99, 99,159,197,198,198, 58,237,221,187,215, 6,128,172,248, 61, 13,128, 28, 0,169,168,197,136,195, 18, 83, 69, 16,196,151,175,
+235, 60,148,152, 42,130, 32,234,215,228,243, 36, 73,178, 4, 65,128, 32, 8, 72,165, 82, 92,190,124, 25,131,122,247, 64,212,233,
+ 28, 4,216, 88,160,205,232, 9, 56,120,238, 28, 40,138, 2, 65, 16,160, 40,202,164,122,132,166,105, 92,185,114, 5, 35,134, 14,
+132,148, 6,172,173,173,241,197, 23, 95,224,196,137, 19,160,105, 97,150, 62, 19,216, 86,198,112, 25,153, 71,139,192,226,115, 59,
+151,136,193, 26,112,106,231, 42,132, 68, 20,232, 30,165, 99,110,131,116,172, 61,130,124, 46,253,219,221,193,231,174, 68,172, 28,
+ 51, 36, 72,254,118,215, 30,120,187, 75, 87,186,113,235,206,243,129,114, 70,171, 59,170,200,181,193,114,248,106,219,175,209, 19,
+ 14, 94,136, 33,160,207,199,144,158,173,121,150,195, 87,213, 28,204, 43,154,214,102, 22, 7,175, 92,191,110, 11,125, 1,226,238,
+253, 46,171, 83,183, 30,192,234,241,228,201, 99,124,183,235, 39,238,194,205, 71,123,116, 12, 62,125,154,141, 66, 99, 53,139,156,
+ 21, 3,107,115, 73,131,119, 26, 91,253,194,129,135,141, 92,220,144,231, 88,216,200, 69, 13,123, 52,148,255,194,243, 60,111,105,
+ 38,106,200,179,134,106, 53,213, 58,102,235,174, 31,118,172, 30, 59,118,172,121, 70, 98, 10,146,243, 34, 80, 32,113,131, 65,238,
+129,216,123,151,212, 42, 45, 99, 76, 37, 94,233,249,204,200,200, 72,187, 19,150,133,131, 91,150,194,160,211, 34, 45,177,200,171,
+ 38,103,228,193,202,193,237,122, 82, 82,146,209,154,122,134,203, 29, 48,124,188,216,204, 18,102, 35, 6, 4, 73, 98, 51,181,104,
+225,106, 89,116,209, 40, 72, 71, 84,232, 21,116, 41,238, 99,250, 52,129,132, 87, 51, 87,163,246,211, 82, 38,254,244,221,150,110,
+120, 22,175,196,229,135, 73,187,158,101, 33,153,141, 86,238,138, 77,206, 9,238,219,206, 19,107, 78, 68,126, 2, 24,246,155,114,
+236,254,142, 24,198,243, 8, 44,234, 12,175, 6, 15, 4,250, 59, 98,152,145, 35, 13, 95,209,164,197,248, 96,245, 47, 47,230, 29,
+190,149,209,119,198, 7,157,172, 58,116,120, 79, 2, 70,135,124,181,214, 16,149,131,188,218,148, 81, 45, 16, 52, 5,205,127,171,
+ 38, 11, 96,143,193, 96,216,147,147,147,243, 58, 53,147,241,106, 94,167, 90, 29,123,217,102, 66,158,231,233,226,104, 86,117,157,
+225,171,212, 44,219, 76,200,243,252,207,197,209,172,234,162, 90,229, 52, 57,142, 75,110,213,170,149, 93,159, 62,125,192,178, 44,
+ 30, 63,126,140, 23, 9, 9,232, 30,252, 9,108,108,108,112,233,193, 3, 60,122,244, 8, 95,126,249, 37, 12, 6, 3,142, 31, 63,
+158, 88,157, 38, 77,211,250,122,245,234,137,251,245,235, 7,134, 97,240,244,233, 83, 36, 37, 37, 97,218,180,105,176,182,182,198,
+157, 59,119, 74, 53, 51, 50, 50, 64,211,180,190,130,232,214,159,241, 91,250,183,243,138,201,170,218,104, 1, 44, 88, 3,114,207,
+ 45,192,186,203,208,235, 13,104, 24,153,142,231,145,127, 68,164, 54, 83, 97, 15, 78, 61,136,136,126,118,231,234,219, 18,164,133,
+195,212, 59,137,199,153, 80, 90,202,242,243,161,207,183,194,211, 95,240, 60, 53,191,224,113, 38,148, 38,223, 49,112, 44, 1,189,
+ 10, 80,222,198,181, 75, 23,113,225,198,125,220, 10,143,102,175,221,137, 57, 72,114,248, 42, 42, 19,143,107,112, 23, 2,139,222,
+107, 48, 42,252,137,103,107, 63, 39, 79,176, 12,120,206, 0,235, 33,251, 49, 58,178,131,103,107, 31, 27,207,162, 72,150, 1,182,
+ 31,253, 14,172,150, 85,169,119, 59,193,176, 77,114,226,204,251,249, 57,153,237,186,117,110,111,110,237,255, 46, 50,158,196,224,
+241,253, 43,234, 59, 17,177,215,110, 39, 24,106, 21, 45,113,115,115,123,171, 91,231, 6, 24, 50, 97, 54,244,170, 92, 60,189,240,
+ 3, 10,178, 82,112,249,186, 5,162,243,242,218, 3, 48, 58,162,117, 61,158,105,140,248,108,116,172, 35,138,183,132,214,249,195,
+160, 62,144, 18, 26,112,218, 60, 16,170, 12,196, 38,233,114,223,223,146,192, 2,128, 92, 74,208,230,124,174,149, 81,145, 71, 47,
+123, 95, 57,101,192,238,115, 15,193,113, 69,211, 55,113, 28, 54,239,254, 61, 54,248,171, 17, 45,208,200,211,182,217,189,164, 52,
+ 2, 38,132,252, 9, 30,157,110, 29, 92,212, 80,243,219,124,128,211,227,202, 20,187,134,157,214,101,117, 66, 13,167,219,137, 72,
+ 70, 18,128, 96,208,170,173, 83,214,253, 58,191,213,185,200,192,233, 31,245,181, 2, 47, 76,192, 46, 32, 32,240,215, 83, 80, 80,
+ 48, 97,244,232,209, 91, 69, 34,145, 2, 0,193,113, 28, 56,142,163, 87,174, 92, 41, 98, 89,150, 36, 73,146,165, 40,138,249,249,
+231,159, 13, 44,203,166,107, 52,154, 9,213,105, 50, 12, 19, 59,105,210,164,122,213,141, 80, 60,112,224, 64,137,201,138, 21, 74,
+194, 40,147, 85,118, 93, 26,229,170,188,242,224,177,168,227,136, 5, 11, 0, 16,224,177, 48, 50, 29,207, 95,222, 36, 60, 11,201,
+141, 40,253,180,198,173, 59, 47, 40,249,140,169,123,166, 97,217,129,173,155,248, 29, 0, 0, 45,207,142,168,201,209,229,105,213,
+131,155,183,110,127,144,227,121,154,225,249, 29, 36,135,163, 26, 6, 81,198,140,180,171,140,228,180,156, 59,239, 6, 88,243, 64,
+ 81,147, 97,105,115, 97,113, 26, 7,158,231,249,210,230,194, 85, 50,100,228,106,171,205, 3,117,245,185,174,135,142,185, 53,254,
+236,213,123, 19, 88,150,119,166, 40, 34, 69,173, 99,182,214,214,100, 1, 64, 82, 82,210,197,208,115, 73,103, 31, 52,115,234,233,
+ 32, 47,142,114,169,128, 12, 21,206, 38,165, 23, 92,172,137,102,118,161,161,239,156,181, 39, 78, 74, 68, 20, 13,158, 47, 74, 40,
+202,243,208,232,217,172,235,241, 76, 99, 0,104, 98, 7,215, 47,142, 51, 7, 40,138,120, 81,157, 94,216, 35,229,154, 33,203, 66,
+ 63,127, 24,151,189, 35, 46, 7, 17, 0, 16,151,131,136, 67, 87,158,207,143, 77,201,255, 60,226, 69,246, 42,152,216,175,130, 39,
+112,185,245,144, 5,175,188, 86,219,243, 25,173,196,125, 0,253,129,196, 30, 67,166,127, 55,157, 32, 32, 76, 63, 33, 32,240, 31,
+162, 36,170, 69,146,228,226,215,168,249, 51, 65, 16,239, 1,120, 98,194,199,194, 10, 10, 10,154,188,230,195,203,100, 24, 38,211,
+152, 13,255,134, 14,241,255, 86,254,182,174, 37,221, 5,205,191, 94,179,126,253,250,188, 9,134, 69, 56,159,130,166,160, 41,104,
+254,167, 52,121,158,167,106,179, 84,162, 73,212,102, 17,202,232, 95,207,248,202,158, 11,205, 33,111, 32, 79,158, 60, 33,132,179,
+ 32, 32, 32, 32, 80, 49, 4, 65,176,127,130,166,144,188, 88,160,196, 96,149,139,110,145,194, 57, 17, 16, 16, 16, 16, 16, 16, 16,
+120, 45, 38,171,236,186,200,132,163,242,240,159, 41,163, 9,106, 18, 66, 12, 21, 52, 5, 77, 65, 83,208, 20, 52, 5, 77, 65,243,
+ 63,167, 89,157,182, 48,154,241, 79, 54, 96,130,166,160, 41,104, 10,154,130,166,160, 41,104,254,247, 52,255,205, 84,218, 71, 75,
+104, 58, 20, 16, 16, 16, 16, 16, 16, 16,248,147, 16, 58,195, 11, 8, 8, 8, 8, 8, 8, 8,212,142,106, 39,149, 22, 16, 16, 16,
+ 16, 16, 16, 16, 16,168, 25, 85, 79, 42, 45, 32, 32, 32, 32, 32, 32, 32, 32, 80, 99, 76,159, 84, 90, 64, 64, 64, 64, 64, 64, 64,
+ 64,192, 40,182, 9,167, 64, 64, 64, 64, 64, 64, 64, 64,224,175,161,252,168,195,144,144, 16,190,236, 90, 64, 64, 64, 64, 64, 64,
+ 64,224,175,228, 77,245, 34, 66,211,161,128,128,128,128,128,128,128, 64,237, 24, 47, 24, 45, 1, 1, 1, 1, 1, 1, 1,129, 63,
+135, 74,251,104,149, 36, 44,237, 82, 28,170,235, 34,156, 43, 1, 1, 1, 1, 1, 1,129,191,129, 55,219,139, 8,253,179, 4, 4,
+ 4, 4, 4, 4, 4, 4, 47, 34, 32, 32, 32, 32, 32, 32, 32, 32,240, 79, 66,152,235, 80, 64, 64, 64, 64, 64, 64, 64,224, 47, 54,
+ 92,127,186,209, 18,102, 54, 23, 52, 5, 77, 65, 83,208, 20, 52, 5, 77, 65,243,191,100,178,202,153, 45, 97,212,161,128,128,128,
+128,128,128,128, 64,237,168,118,212,161,128,128,128,128,128,128,128,128, 64,205, 24, 15, 32,168,248,113, 16,202, 68,181,132,136,
+150,128,128,128,128,128,128,128, 64,237,216, 6,192,165,216, 96,157, 6,160, 20,140,150,128,128,128,128,128,128,128,192,235,161,
+108,191,172,222,101,204,151, 96,180, 4, 4, 4, 4, 4, 4, 4, 4,106, 73,165,125,180, 8, 84, 62,114, 32,212,132, 47,168,201,
+232,131, 80, 65, 83,208, 20, 52, 5, 77, 65, 83,208, 20, 52,255,115,154,213,105,135,226,223,199,120, 83,204,215,235, 68, 24,250,
+ 42,104, 10,154,130,166,160, 41,104, 10,154,130,230,127,150,215, 62,234,176, 5, 96, 38,156,214, 55, 18,167,226, 69, 64, 64, 64,
+ 64, 64, 64,160,106,254,156, 81,135,254,192, 71,195, 3, 20, 91, 12, 17,233, 86, 17,128,170,170,109, 21, 10,197, 86,185, 92, 62,
+ 92,165, 82, 21, 18, 4,193,149,188,206,243, 60, 0,148,157,235,232,105,122,122,122,167,234,190, 91, 34,145,172,117,114,114,250,
+168,160,160, 64, 69, 16, 4, 79, 16, 4, 8,130, 0,128, 87,214, 44,203, 38,102,102,102,182,250, 87, 23, 33,207, 83, 14, 78, 78,
+ 55, 69, 20,229,102,234, 71, 89,142,123,158,150,154,218,222,132,143, 44, 37, 8,204, 40,250, 90,172, 0, 48,251, 77,251, 71,240,
+ 0,101,204,118, 1,128,101, 12, 48,132, 37,201, 79, 68,192, 70, 45,199,109, 1, 0, 2, 96,107,250,221,218, 48,212, 35,120, 52,
+ 35, 8, 88,243, 60,114,121, 2,247,165,109, 17,251, 55,157,138, 1, 34,145,168,175,149,149,149, 69,102,102,230, 69, 0, 7, 0,
+ 12,181,183,183,239,156,151,151, 87, 96, 48, 24, 78, 0, 56, 86, 19,225, 78,205, 48, 83, 34, 22,141,209,232, 13,203,175,222,199,
+ 15,157, 91,192,158,225,176, 76, 38,166, 59,105,117,204,138, 43, 15,176,195, 68, 73,162,120, 41,185,102,152, 60, 71,218, 97, 35,
+203, 29, 0,142,219,218,250, 73, 21, 86,191,137, 36,212,243,156,212,130,225, 3,211,210, 18, 6,213,162,220,255,137, 56, 56, 56,
+140, 34, 73,242, 27,158,231,193,178,236,220,172,172,172,157,175, 73,122, 46, 0,155,226,199, 57, 0,190,169,165,222, 11, 0,158,
+197,143,227, 1,120, 9,245,122,141,217,252,211, 79, 63, 5,119,237,218, 21,107,214,172,193,230,205,155,227,210,211,211,151, 1,
+216, 5, 64,247, 55,232, 8, 84, 70, 35,224,189,149,189,218,178,134, 31,191,226,202,188,220,189,146, 63,243,247, 31,126,248,161,
+158,231,121,254,209,163, 71,188, 78,167,227, 13, 6, 3,207, 48, 12,207, 48, 12,111, 48, 24, 74, 23, 55, 55,183,164,151, 62,254,
+138, 38, 73,146,235,222,127,255,253,124,158,231,249,219,183,111,243,106,181,154,215,106,181,188, 78,167,227, 53, 26, 13,175, 86,
+171,203, 45, 78, 78, 78,169, 85,105, 90, 89, 89,221,182,181,181, 77,181,181,181, 77,181,179,179, 75,181,179,179, 75,181,183,183,
+ 47, 93, 28, 28, 28, 74, 23,133, 66,145,170, 80, 40, 82,237,236,236,110, 87,183,159,197,244, 2,112,209,136,165, 87, 5,159,237,
+ 94,214,104,185,184,184,164,242, 53,192,221,221, 61,193,136,253, 44,193,137, 32,192,150,124,150, 32,192, 73,165, 82,207,178,239,
+227,213, 72, 87,181, 33,101, 87, 87,215,247, 93, 92, 92, 66, 93, 92, 92,206,185,186,186,190,111,196, 79,172,156,166,165,165,229,
+109, 7, 7,135, 84,103,103,231,180,146,197,197,197,165,220,226,234,234, 90,186, 56, 57, 57,165,218,218,218, 86, 90, 70, 60, 64,
+ 85,182, 92, 0,104, 41,240, 54, 77, 81, 33, 78, 78, 78,121,225,225,225, 44,207,243, 60, 73,146, 73, 37,219,152,114,236, 47,155,
+ 44,213, 21,204,205, 56, 47, 13, 43,120,190, 44, 55,227,188, 52, 76,117, 5,115,181, 97,168, 87, 83, 77, 35,169, 72,115,228,200,
+145, 35,239,167,166,166, 38,229,228,228, 40,183,108,217, 18, 35,147,201,174,108,217,178, 37, 38, 39, 39, 71,153,154,154,154, 52,
+114,228,200,251, 0, 38,153,160, 9, 0,104,223, 12,237,198, 14,112, 81,221, 63, 62, 66,245,118,107,250, 94,199, 0, 4,245,104,
+ 47, 78,218, 48,203, 95,117,105,123,160,170,107, 75, 50,194, 68, 77,130,166,233, 14,158,158,158, 99, 20, 10,197,135,197,203,136,
+146,197,217,217,121,132,179,179,243, 8, 91, 91,219, 65, 85,105, 30, 6, 40, 99, 22, 15,153,172,195,160,186,158,170, 23,139, 23,
+242,225, 83, 63,225,199,248,120,228, 13,116,116,172,243, 55,148,209,159,170,233,232,232,152,108, 48, 24,120,189, 94,207,219,219,
+219, 39,191,198,253, 92,197,243,252, 42,158,231, 87, 1, 88,245, 26, 52, 75,175,103, 38, 24,236,170, 52,101, 52, 73, 78,151, 75,
+ 36,231,164, 52,157, 38,165,233, 52,185, 68,114,142, 38,201,207, 1,200,254, 73,101,244, 39,104, 90, 40, 20,138,103,107,215,174,
+229, 85, 42, 21,175, 82,169,248,181,107,215,242, 10,133,226, 25, 0, 11, 19, 52,107,170,243, 38, 69,176, 94, 94, 94, 95, 68,203,
+ 31,104,245,118,179,250, 71,167,140, 26, 2,238,200, 90,162,154, 59,166,239,219,183,106, 53,102,215,174, 93, 0,128,225,125,251,
+162,103,155, 54,176,180, 48,135, 68, 82,180, 59, 4, 79, 64, 44, 18,163,223,180,207,140,249,250, 21,253,250,245,251,224,200,145,
+ 35, 22, 0,176,121,243,102, 12, 24, 48, 0,118,118,118,144,203,229, 16,139,197, 16,137, 68,229,214,213, 65, 81,148,123, 82, 82,
+146,163, 76, 38, 43,141,178,113, 28, 87,110,225,121,190, 36,250, 6,134, 97,224,235,235,107,236,233,154,149,155,155,251, 86, 97,
+ 97, 97,169, 70, 69, 75,221,186,117, 1,224,140, 49,130,223,124,253, 21, 56,166, 16, 52, 13, 48, 12,160,213,147,224,248, 10,205,
+ 13, 38, 77,154, 84,186,223, 53,161,119,239, 32,130, 32,136, 35,119,238,220, 57,154,150,150,230,205,113,236,184, 26, 70,186, 62,
+126,252,248,177, 5, 0,248,249,249, 77, 2,112,212,148,253,160,105,218,253,193,131, 7,142, 82,169,180,210,200,101,153, 8, 38,
+244,122, 61, 90,180,104,193,152,242, 29, 78,128,103, 22, 73,142,107,222,178,229,248, 5,253,250,201,110,222,188, 41, 35, 73, 18,
+ 12,195, 96,229,202,149, 12,207,243, 54,141, 0,171, 72, 32,175, 10,153, 57, 0, 70, 21, 87, 6, 59, 0,172, 44,231, 22,120, 52,
+ 83, 27,164, 65, 79, 11,250,181,105, 91,103, 38, 34, 31,134,183,241,177, 56, 14, 75, 90, 27, 11,252,181, 81, 45, 43, 43,171,190,
+107,214,172, 81,236,216,177, 35,239,209,163, 71,250, 45, 91,182, 40, 38, 76,152, 96,169,215,235, 17, 28, 28,156,222,160, 65, 3,
+241,154, 53,107, 20,199,142, 29,123,187,176,176,112,147, 73,229, 69,224,171,161,125,123, 66, 99, 32, 97, 48, 48, 10, 23,133,229,
+158, 41, 35,187,136,120, 94,135,221, 39,238,192,192,112, 63,152, 24,201,106, 63,112,224, 64,159,253,251,247,211,209,209,209,116,
+195,134, 13,193,113, 28, 88,150,133,193, 96, 0, 0,112, 28,135,250,245,235,215,250,188,140, 1,252, 28,156,236,206,181,127,239,
+ 93, 51, 23,153, 20,118,217,233, 24, 43,166, 45,119,202,181,123, 1,116,120,163, 34,187, 60, 15,154,166,145,144,144, 0, 71, 71,
+ 71, 51,142,227,148, 0, 22,102,103,103,111,195,155, 75, 27, 9, 77, 31,221,253,195, 58,231,182, 29, 58, 80, 78, 46,142,136,121,
+ 28, 15,154, 96,187, 63,184,117,167,203,152,137,211,167,232, 24,230,125, 0, 55,223,180, 3,119,238, 48,169, 63, 65, 82,155, 9,
+158,195,162, 13, 39,243,151,174, 88, 43, 15, 30, 55,146,154, 54,109, 26, 60, 60, 60,188,251,247,239,191, 2,192,196,106,117,218,
+ 78,234, 15,138,220, 12,158,199,130,239, 78,230, 47, 89,177, 86, 62,177, 6, 58,255,114, 42,253,143,212,218,104,249, 3, 62,141,
+ 61, 28,207, 46,157, 49, 81,196,255,242, 35,169,202, 76,171,116, 91,133, 66,177,245,157,119,222, 25,190,115,231, 31,209,232,246,
+ 1, 1,232,255,118, 32, 28,237,173, 33, 55,151, 20, 85, 71, 28,129,251,143,158, 27,101, 8, 60, 60, 60,130,143, 30, 61,106, 81,
+214, 76,136,197,226,210,165,172,201, 42, 89, 74, 42,224,170,144,201,100, 8, 13, 13, 5, 77,211,160, 40, 10, 52, 77,151, 46,101,
+159, 83, 20, 5, 39, 39,147,186, 46, 45,179,182,182,110,154,159,159,111,149,147,147, 3, 79, 79,207, 60, 0, 15,202,188,223, 52,
+ 61, 61,221,202, 20, 65,142, 41,196,180,177,254, 16,233,110, 64, 39,106, 3, 53,221, 17,215,110, 69, 33,228,204, 69, 36, 37,167,
+ 32,176, 93,115,124, 56,108, 32,206,157, 59, 7,150, 53,185,165, 35,149,231,177,162, 79,159,160,153, 0, 65,116,239,222, 61,103,
+242,228,201,100,116,116,244, 7,253,251,247, 11,120,252,248, 73,113, 84,145,152,193,243, 88, 7, 32,213, 72, 93, 9, 0, 92,186,
+116, 9, 0,164, 53,249,237, 73,165, 82, 92,191,126, 29, 37,205,196, 36, 73,130, 36, 73, 80, 20,133, 83, 79, 28, 80,168, 35,161,
+ 74,141,192, 39, 65,158,168, 91,183, 46, 72,178,250, 46,137, 93, 0,217, 53,160, 63, 33, 18, 77,115,113,117,245,238,236,227, 35,
+ 15, 13, 13,165, 0,192,203,203,139, 87, 42,149, 57, 39, 78,156,200,167,129,205, 94, 60,191,171, 42,147,229,225,225,209, 49, 41,
+ 41,233,155,146,115, 78, 16,196,138, 58,117,234,124, 89, 90,110, 28,135,133, 63, 20,138,166, 76,153, 42,110,219,101, 30, 0,160,
+109,159,253,200,123,186,212,159,200,154, 99,253, 87, 95, 37,242,242,242, 14,214,175, 95,159,202,204,204,188, 6,224,133,193, 96,
+152,181,103,207, 30,199,177, 99,199,166,237,221,187,119, 25, 0,215,229,203,151,119, 41, 44, 44, 60,100,138,110, 96, 83,188,215,
+178,105, 64, 59, 79, 15, 15, 92,188,118, 19, 98,137,200,102,210,168, 32, 88, 88,208, 88,181,227, 52,247, 34, 49,107,242,149, 7,
+216,101,130,201,106, 51,112,224, 64,239,253,251,247, 75, 0,224,193,131, 7, 72, 73, 73,129, 66,161,128,153,153, 25, 68, 34, 17,
+ 40,138,130, 72, 36,122, 45, 38,203,218,195, 62,236,248,241, 19,102,118,118, 54,216,240,217, 20,124,152,150, 10, 27, 75, 11, 24,
+ 10, 10,189,223,176,138,194,175, 83,167, 78, 50,150,101, 81, 88, 88,136, 11, 23, 46, 88,155,153,153, 89,187,187,187, 47,128, 9,
+163,167,100, 50, 89,170, 70,163,113, 44,126,156,166,209,104,156, 0,228, 73,165,210,146,235,116, 65,241,218,216,230,196, 23,120,
+181,153, 48,158, 32,136,178,175,213,148,214,109, 90, 55, 13, 61,118,100,159, 69,110,126, 10,108,108,211, 64, 34, 23,219,182,109,
+132,153,153, 21, 22, 44,152, 67, 63,239,254,182, 91,175,247,222, 15,125, 24, 21,211,253,141, 51, 91, 60,177,173,123,159,225,118,
+102,114,203,226,186,196,128,157,219,167,128, 36, 73,124,249,229,151,104,220,184,241,248,135, 15, 31,206, 3,144, 85,181, 12,182,
+ 53,121,107,176,157, 68, 86, 84,196, 28,107,192,150, 3,159, 23,233,204,158,128,161,125,234,142,255, 98,224,179, 95, 27,251, 32,
+191,248,198, 92, 45, 34, 17, 79,180, 69,169, 97, 8, 9, 9,233, 28, 20, 20,116,177,178,231,255, 2, 92,240, 71,254,172,114,230,
+139, 14, 9, 9,225,131,130,130,136, 50, 7, 87,238,121, 85, 52, 3, 28,108,173,229,161,155, 23, 78,177,160,111,156,166,212,241,
+ 79,144,172, 41, 87,145,151, 27,162, 41,151,203,135,239,220,185,179, 92, 72,201,211,201, 17, 98,177, 8, 34, 49, 1,155, 78, 69,
+217,235,115, 46,135,128, 32, 42, 53, 89,229, 52, 11, 11, 11, 53,247,238,221,179,216,177, 99, 7, 28, 29, 29,225,237,237, 13,185,
+ 92, 14,153, 76, 86,206, 92,149, 53, 92, 21, 24,173,114,154, 37,239,211, 52, 13,146, 36,113,238,220, 57, 48, 12,131,129, 3, 7,
+190, 98,178,104,154,174,204,184, 85, 54, 60,245, 12,128, 7, 60,207,191, 85, 92, 1, 63, 0,208,185,204,251,189, 20, 10,197, 44,
+ 0,203,140,213,164, 40, 30,148,230, 26, 56,247,181,160, 19,166, 64, 39,106,134,243, 87,238, 96,231,214, 53, 0, 0,239,134,173,
+ 49,168,127, 80,105, 52,206,200,253, 44,197,205,205,237, 64,122,122,198,187,111,191,253, 54,178,179,179, 13, 11, 23, 46, 68,211,
+166, 77,225,231,231,103, 84, 25, 85,114,231,156,250,224,193, 3, 15,181, 90, 13,158,231,141, 49,103,175,104, 18, 4,129, 61,123,
+246, 64,163,209,188,178,177,109,231, 37,248,124,128, 23, 70,127,178, 11, 43, 30, 29,194,166, 77,155,170, 60,118, 57,208, 84, 99,
+ 93,127,157,132, 98,154, 46,155,243,177,244,195, 15, 63,164, 70,143, 30,141,248,248,120,140, 29, 59, 86,115,238,220, 57, 93,138,
+ 82,121, 66,194,113, 27,244,229,141,113,165,154, 82,169,116,247,153, 51,103,112,232, 80,145, 47,137,137,137,129,175,175,175,121,
+ 57,147,156,117, 24,249, 47, 54, 32,236, 84, 52,218,246,217,143,176, 83,195,192,230,156, 22,181,242, 69,174, 41,231,179, 6, 84,
+164,121, 40, 51, 51,179,212, 68,237,221,187,215,108,239,222,189,253, 0,156, 4,112, 8, 0,178,178,178,190, 53, 81, 19, 32, 48,
+122,240,128,126,160,197,150,136,126,146,136,206,237, 91,192,201,209, 17, 15,162, 98,241, 34, 41, 43,149, 32, 48,170, 87, 7,201,
+ 50,181, 90, 55,239,242,125,124, 95,141, 38,225,238,238,238,119,248,240, 97,113,153, 8,116,233,127,156,162,168,210,231, 37,198,
+187, 38,191,207, 18,147,101,233,110, 17,246,213,198,142,230, 97,225,123,225,235,245, 30,108,223, 11,194,247,103,207,226,241,195,
+ 72,141, 78,197,116,251, 27,202,232,207,210,244, 27, 48, 96,192,181,125,251,246,217, 36, 36, 36,224,210,165, 75,240,246,246,134,
+ 74,165, 50,230,134,183,156,166, 70,163,113, 44,249, 12, 65, 16,142, 37,129,119,157, 78, 87, 82, 24, 37,127, 68,155, 50,219,217,
+ 84,161,233, 89,102,187, 18,115,229,245, 26,142, 93, 34, 19,139, 15, 31, 63,118,192, 34, 50,250, 18,154, 55,107, 7, 11,235, 70,
+224,216, 20,100,102, 21, 32,251, 73, 50,190,254,122, 5, 22, 44,156,139,147, 63, 29,177,104,224,223,236,168,142, 97,234, 3,208,
+188, 49,229, 78,240,227, 67, 79,237,221, 76,240, 28,212,169,209, 82, 81,225, 51,249,240, 97,239, 83, 67,134, 12,193,201,147, 39,
+241,240,225,195,205, 85,152,172,208, 50,145,249,241, 17,151, 14,109, 6,207, 67,157, 22, 45, 21,171,159,201, 71,126, 48,136,250,
+112,104, 79,220,248,125, 29,122, 54,127, 22,225,234,136,254,217,197, 22,155,166,144, 41,149,225, 42, 31,134, 27,101,204,214, 5,
+ 0, 68, 25,131,117, 1,127,244,193,252, 55,208,187,216, 88,141,127,249,198,132,174,137,193, 2, 0, 95,192,130,144,136,195,118,
+ 46,248,216, 85, 30,255,144,214, 70, 92, 71,178,150,227,183,196, 49, 92, 11,192,236, 46,160,126,249, 51, 42,149,170, 48, 54, 54,
+214,108, 84,255,254,232, 16, 16, 0, 23,123,123,212,119,119,135,153, 84, 2,137, 88, 84,238,150,213,232, 54, 4,130,224, 27, 52,
+104,128, 62,125,250, 64, 36, 18, 65, 46,151,195,194,194, 2, 18,137,164,194,104,150,177,119,185, 60,207,131,162, 40, 68, 68, 68,
+224,197,139, 23,176,177,177,193,213,171, 87,209,173, 91,183, 87,162, 90,101,205,153, 41, 33,250, 10, 42,254, 18, 35,118,198, 20,
+ 45,150, 37, 80,192, 55,131, 44,110, 50, 84, 68, 11,104,181, 12,180, 90, 45,190,191,162,199,205,216, 66,232,245, 58,104,181,218,
+170,190,179, 50, 72, 87, 87,215,225,245,235,215,159, 52,108,216, 48,131, 68, 34, 65, 97, 97, 33, 84, 42, 21, 30, 62,124,104,120,
+247,221,247,114,250,244, 9,178, 62,125,250, 52, 95,220,116,152,106,130,118,166,155,155,155, 71,113,243,108,102, 77,126,213, 4,
+ 65,148,154,152,151, 25,245,109, 36,104,170,168, 76, 54,111,222, 12,150,101,193,243,124,165,133,164, 33,136,223, 22, 46, 89,109,
+189,124,237, 15,176,182,115,194,197,139, 23,217, 95,127,253, 53,159, 0, 98, 30, 63,124,248,237,255,128,159, 15, 3,122, 83,246,
+ 47, 59, 59,219,204,219,219, 27,238,238,238,224, 56, 14, 6,131,161, 52,250,146,153,153, 9,181, 90, 13, 59,243, 28,212,179,119,
+ 7,147,127, 1,202,136, 69,112,177,136,198,174, 51, 58, 67, 75, 63,220,255, 7, 92, 56,126, 44, 94,106,121,215, 12, 55, 71,103,
+ 15,144,188, 1,201,105,153,232,215,187, 39, 40,177, 5,158, 39,100,160, 89, 35, 31,151, 15,254,215,209,133, 34, 24,204, 88,182,
+127, 18,192,125, 95,157, 92, 65, 65, 1, 27, 29, 29,141, 7, 15,138,252,174,149,149, 21,204,205,205,203,253,199, 73,146,172, 85,
+ 68,171,196,100, 45,217,220,205,156, 20, 21, 34,143, 13,197,142, 61,119,208,172, 65, 16,182,132,221,210,176,169, 89,221, 87,105,
+ 52, 49, 7,254,197,193, 12,103,103,231, 9, 28,199, 45,224,121, 62, 39, 48, 48,208,105,255,254,253,182, 73, 73, 73,184,115,231,
+ 14,190,252,242,203,116,150,101, 25,158,231, 9,158,231, 23,189,134,175,227,202, 24,172,215,137, 72, 46,195, 39, 14, 86, 68, 95,
+154,180,242,102,242, 10,158,103,232,248, 19, 42,134,251, 14,128,161,202,139, 27, 73,126,116,228,224,102, 87, 7, 5,135, 46,138,
+183,161, 76,213, 99,201,103, 35,145,153,153,143,239,183, 47, 5, 32,129,158,161,240, 86,151,247,225,232,232,134,241,227,198, 59,
+111,222,186,229, 99,134,227, 86,225, 13, 33,229,218,166,159, 0,132, 42, 20,138,135, 31,143, 31,175,240,246, 30, 1,153, 76,134,
+ 3, 7, 14, 96,255,134, 13,236, 90, 96,144, 20, 56, 31, 12,252, 84,165, 78,216, 31, 58, 83,130,131, 21,254,254,193,144, 74,165,
+248,253,215, 31,161, 73,217,147,223,187, 3,244, 42, 13,122,215,233,195,219,197,157, 34,178, 68, 34, 60, 1, 0,145, 12, 74, 0,
+ 47, 55,131,253,219, 12, 86, 9,167,241, 71,191,172,241,229, 34, 90, 53,190,118,138, 36,225,219,167, 14,245,114,130,150,208, 93,
+ 57,133, 36, 45,199, 46,127,172,167,238,230,242,159, 71, 85, 96,178,138,127,216,156,167,167, 39,222,110,213, 10,253, 59,117, 2,
+ 77,211,144, 73,196,176,148,153,129,103,139, 34, 89, 37, 77,135, 85,212,137,168, 40,250,100,111,111, 15,177, 88, 92,106,176, 76,
+136,102, 85,168,201,113, 28,104,154,198,131, 7, 15, 16, 24, 24, 8, 15, 15, 15, 28, 58,116, 8,189,122,245,122,165, 41,209, 84,
+147, 85, 98,180, 94,106,198,235, 5,160, 36,146,101,146,209,210,232, 8,100,232,154,129, 32, 2,192, 48, 0,203, 3, 90,141, 6,
+ 60, 15,240, 60, 96,208,235,160,209,104, 74,191,211,152, 38, 89,103,103,103, 79, 51, 51,179,197, 51,103,206,240,111,214,172, 57,
+210,211,211,193,113, 28,204,205,205,161, 82,169, 96,101,101,133, 14, 29, 58, 60, 95,188,120,177,146,231, 49,222, 68,147, 85,107,
+ 74,206,249,217,179,103,203, 53, 27,150, 44,133,202, 68,140,254,116, 47, 36,116, 81,211, 82, 73, 31,158,170,174,187, 93,223,234,
+136,107,119, 99,152,143,102,172,211,138, 50,239, 44,115,230,184,157,137,181, 56, 46,158,231,145,145,145,129,212,212, 84,244,237,
+215, 15,251,247,237, 67, 92, 92, 28, 26, 53,106,132,174, 93,187,194,209,209, 17,113,113,113,184,121, 89, 11,109,118, 22,178,116,
+119, 32,183,108,139,227, 23, 99,181, 95,110,214,199,254,141, 23,140,190, 0, 70, 90, 89, 89,213, 85,169, 84, 74,134, 97, 14, 3,
+ 56, 12, 96, 16, 77,211,131,228,114,185, 75, 94, 94,222, 51, 20,141, 38, 58, 81,157,152,153, 76,102, 47,149, 89,129, 99,180,160,
+105, 26, 30, 30,222,224, 89, 29,178,243,212, 24, 53,164, 15,238, 62,136,194,175,231,111, 48, 6, 3,183,222,152,211, 74, 81, 20,
+239,231,231,135,180,180, 52,136, 68, 34,152,153,153,193,194,194, 2,179,103,207,198,134, 13, 27, 74, 77, 86, 77,141,214, 24,192,
+207,202,211,226,198, 55, 27,139, 76, 86, 74,178, 18,169,137, 34, 40,236,157,176,126,195,218,194,236,184,148,182, 63, 0, 49,255,
+246, 74,150,227,184, 69, 73, 73, 73,142, 52, 77, 59, 51, 12,131,132,132, 4,220,190,125, 27,147, 39, 79, 78,205,204,204,236,130,
+ 26, 30,163, 76, 38, 75, 43,137,100, 21, 55, 29, 86,214,156,152, 83, 38,146,149, 83,133,100,101,205,132, 62,222,238,150,231,182,
+175,153,230,217,186,109, 7, 82, 78, 91,101, 23, 60, 73, 9,188,114,233, 98,135,201,107,190,255,248, 69,118, 65, 79, 0, 79, 43,
+ 19,149,138, 68,239,182,235,216,145, 6,159, 10, 90, 18,136, 21,203,135, 32, 61, 35, 15,217, 89,249, 16,139,205,161, 51, 80, 96,
+ 57, 2, 29, 2, 59,225,199, 93, 7,209,120,220, 88, 74, 34, 18,245, 96,116,186, 55,198,104, 21,179,244,187,239,190,243,108,208,
+160, 1,118,238,220,137,243,187,119,227,195,220, 92, 92, 36, 73,202, 32, 18, 57,252,108, 48,108, 67, 53, 70,171,172, 78,227,198,
+141,241,195, 15, 63, 96,207,158, 61,241,195,187,165, 29,157, 54, 28,142,122, 61,222,185,243, 8,118,117,250, 0,119, 30,193,174,
+101, 3,212,103,104, 60, 33,136,242,233,160, 66, 66, 66, 58,151, 93,255,203, 80,162,146, 38,118, 26, 64,151,144,144, 16,190,236,
+186,218, 11,232, 44, 71,207, 0, 0, 32, 0, 73, 68, 65, 84,167,194, 55,120,105,207,186, 94, 1,245, 60, 9,195,161,117, 72, 40,
+100,116,243, 30,233, 37,143, 11,248,105, 81,192,218, 42,238, 32,120,138,162, 96,105,102, 6,133,141, 77, 81,152,159, 36, 1, 14,
+224, 12, 0,193, 22, 25, 0,158, 35,192,179, 38, 93, 48, 32,145, 72, 42,236,248,110,106,223,172,178,154,249,249,249,120,254,252,
+ 57,198,143, 31, 15,185, 92, 94,228,220, 83, 82,224,229,229, 5,154,166,145,148,148,132,223,127,255, 29,117,235,214,133, 84, 42,
+ 53,201,109,149,137, 46, 53, 69,209, 40,195,166, 74,165,210,202,197,197, 5, 38, 71,180, 56, 30, 42, 45, 1,157,142,197,227,199,
+143,145,156,156,140,231,207,158,160,117, 97, 30,120, 80,224,121,222,164,136,150,155,155, 91,128,143,143,207,150,101,203,150,137,
+221,221,221,193,243, 60,108,109,109,160, 82,169,144,145,145,137, 70,141, 26,193,195,195, 3,203,150, 45, 3,128,253,127,181,201,
+122,233, 55, 85,106,180,202, 26,174, 79,255,231,137,172, 44, 11, 80, 20, 89,106,156,171,233,163, 37, 6,128, 46, 61, 7,208,231,
+126,253,217,156, 1, 22,167, 80,212, 98,186,250,114, 52,176, 28, 39,175,236,253,132,132, 4,136, 68, 34, 28, 57,124, 24, 89,169,
+169,104,214,172, 25,218,180,105,131, 39, 79,158,224,238,221,187,176,183,183,135,194,189, 61, 46, 62,211, 35, 50, 89, 13,107,107,
+107,196, 38,146,127,103,202,128,113,221,187,119,255,242,219,111,191,117,116,118,118, 22,165,167,167, 55,216,184,113, 99,179,141,
+ 27, 55, 78,249,248,227,143,157, 62,254,248, 99, 91,133, 66, 65,167,164,164,248,125,246,217,103, 45, 67, 67, 67,235, 2, 88, 93,
+149,160,185,185,165, 29, 37, 54, 7, 65,208,176,177,182, 5, 45, 49, 7,199,208, 96, 57,192,202, 90,129,107,119,143,224,106,120,
+254,132,180, 76, 28, 54, 42, 62, 86, 92,238,246,246,246,175, 68,170, 39, 79,158,140,237,219,183,151, 54, 35,214,212,100, 45,217,
+216,205,130, 40, 54, 89, 41, 9, 52, 8,109, 93,156,250,233,122, 78,118, 92, 74,224,155, 96,178, 74,174,113, 60,207,227,217,179,
+103, 80,169, 84,184,124,249, 50, 22, 45, 90,148,254,178,201,114,116,116, 28,103,101,101,181,176,160,160, 96, 69, 74, 74,202,186,
+106,111,252,138, 76, 84,201,227,146,117,133,205,137, 70,238,170, 87, 69,145, 44, 15, 23,217,153,187,151,247,122, 89,243,247, 9,
+188, 24, 15, 60,206,123,104, 25,230,248,214,123,173,123,147, 45, 54,125, 85,167,205,132,217,103, 18,242, 52, 13, 42,139,108,113,
+ 44,219,194,220,194, 18, 64, 26,238,220,190, 80,106,178, 50,179,114,161,213, 83,208,234, 8,104,244, 36,222,238,254, 14, 54,108,
+217,131,164,180, 44,176, 44,219,228, 13, 51, 89,118, 1, 1, 1,193,131, 6, 13,194,226,197,139, 17,250,237,183,186,137, 4,145,
+ 71, 3,252,105,150, 5,199,243, 4,105, 92, 39,246,114, 58,171, 86,173,250, 9,192,208,101,147,209, 62,187, 0,163, 92,251,240,
+118,117,250, 20,109, 56,112, 38, 15, 0,118,233,161,229,171,204,160,160, 32,162,164,101,205,212, 22,182,127, 58,116, 80, 80,208,
+197,144,144, 16,148, 93, 87,245, 1, 75,167, 6,239,125, 49,125,210,242,214,189, 58, 17,202,233, 61,144,149,167, 97,230, 68,234,
+ 37,137,234,170, 77, 86, 89,190,216,184, 17,119, 99,138,254,199,238,142,142,152,241,193, 7,224, 25,224,234,195, 72, 28, 12, 13,
+197,144,238,221, 97, 46,147, 25, 29,217,224, 56,174,194, 40, 86,217,104,150,169, 81,167,156,156, 28, 28, 62,124, 24,109,218,180,
+129, 92, 46, 7, 77,211,104,218,180, 41,162,162,162,224,227,227, 3,130, 32,112,252,248,113,244,239,223, 31, 79,159, 62, 69,251,
+246,237, 45, 94,188,120, 97,178,209,138,140,140,180,226,121,254,173,146,232, 71, 77,209,106,181,136,142,142, 70,159, 62,125, 96,
+107,107, 11, 55,183,253, 8, 61,179, 23,242,128, 15, 65, 16, 48,201,104,177, 44, 59,166,119,239,222, 98,130, 32,160, 86,171, 32,
+147,153,193,220,220, 2,150,150, 86,240,243,107,128,228,228,100,244,234,213, 75, 23, 27, 27,187, 73,169, 84, 30, 50,117, 95,253,
+253,253,205,227,226,226, 62,172, 83,167,142, 4, 0,204,204,204, 26,249,248,248,124,254,244,233,211,124, 83,163, 90, 37, 6,139,
+ 32, 8, 80, 20, 85,106,180,104,146,132,139,179, 99,233,243,226,254,105, 68, 21, 90,121, 73,153, 90, 41, 0,120,122,122, 98,195,
+214,147,100,239,222,189, 49,101,202, 20, 24, 12, 6,108,218, 84, 52,200,110,216,176, 97,208,235,245, 56,122,180,104,144, 36, 77,
+211, 85,134, 77,110,223,190,141, 59,119,238,192, 96, 48, 32, 55, 55, 23,191,252,242, 11, 46, 94,186,132, 3,199,127, 67,220,179,
+ 39,104,218,192, 11, 99,199,142,129, 72, 36,194,174, 93,187, 16, 24, 24,248,183, 94, 16, 68, 34,209,240,237,219,183,187,236,220,
+185, 51,231,248,241,227,133,237,218,181,147,174, 93,187,214,113,195,134, 13, 10,157, 78,135,169, 83,167,166,221,184,113, 67,219,
+175, 95, 63,243,109,219,182,185,212,171, 87,175, 7,195, 48, 21, 25, 45,115, 0, 67, 0,140,200,206,215,209, 57,249,106,112,140,
+ 14,207,226,158, 35,183, 64, 7,142,213, 35, 62, 49, 25, 5, 26, 22,153, 89,249,104,218,162,231,119, 23, 46, 92,152,171,215,235,
+231, 0, 8,169,110, 63, 31, 62,124,136, 27, 55,110, 32, 46, 46, 14,207,158, 61, 43,239, 20,199,141,195,158, 61,123, 76,142,104,
+ 85,108,178, 40, 16, 90, 31,132, 28, 15,203, 73,123,162,124, 99, 76, 86,241, 53,104,129,139,139,203, 2, 23, 23, 23,217,217,179,
+103,173,235,212,169, 3,134, 97,116, 47, 71,178,186,116,233, 50,111,251,246,237, 46, 62, 62, 62,147, 1,172,251, 39,236, 59, 73,
+ 98,220,138,205,193, 14,150,146,248,100, 60, 94, 93,156, 75,144, 2, 84,121,192,133,125,160, 59,206,127, 62,185,223, 76,219, 89,
+ 59, 23,143,227,192, 85, 58, 66, 54,246,105, 2, 54,111,222,128,105, 83, 71,225,199,239, 87,128,227,104,104, 13, 20, 60,189,219,
+ 65,171,231, 64,144, 52,154,181,104,133,243, 23, 46, 67, 68, 2,135,119,110,126,195,124, 22,178, 34, 34, 34, 54, 29, 63,126,252,
+147, 41, 83,166,128,227, 56,201,194,205,155,213,233,233,233, 75, 97, 90,254,171,151,117,250,111,222,188, 57,102,214,134,244,159,
+166, 13, 7, 21,119,138,200,186,243, 8,118, 3,103,242, 56,178,156, 64,203, 6,200,146, 87, 92,197, 95,122,105,253,102, 24,173,
+ 18, 39, 89,118, 93, 17, 45,124,235,126,101,109,103, 59,134,180,116,115,152, 49,101, 34,253, 52, 69,131,163,117, 62, 40,248,125,
+247,122,243, 20, 70,250, 93, 44, 52,107, 77,249,226,131,191,255, 94,250,120,229,254,253, 21,190,167, 28, 56,208,232, 59,179,202,
+162, 88,166, 70,178, 0, 64, 46,151,219,244,232,209, 3,221,186,117,195,251,239,191, 95,218, 39,171,121,243,230, 56,112,224, 0,
+ 6, 12, 24,128,123,247,238,193,197,197, 5, 13, 27, 54, 68,195,134, 13,241,243,207, 63,155,122,145, 3,203,178, 8, 8, 8, 40,
+ 25,117,216, 52, 49, 49,209,170,166, 5,169,213,106,145,153,153, 9, 59, 59, 59, 72, 36, 18,180,109,219, 6,159,124,218, 22, 14,
+ 46, 63, 32,192,191, 1, 10, 11, 11, 75,135,191, 27, 81,217, 6,212,175, 95, 31,233,233,233, 72, 79, 79,135, 66,161,128,171,171,
+ 43,156,157,157,177,122,245,106,126,221,186,117,191,234,245,250, 77, 25, 25, 25, 38, 71,178,156,157,157, 59, 17, 4, 49, 79,173,
+ 86, 75,202,220,225, 74, 20, 10,197, 9,181, 90,189, 84,169, 84, 26,221, 17,148, 32, 8,232,245,122, 16, 4,129,211,207, 92, 81,
+168, 35,144,151,120, 7, 83,254,231, 85,206,120,137, 68,162,106,155, 75,121,158, 47, 28, 58,116,168,163,135,135, 59, 18, 98, 31,
+226,200, 17, 30,223,126,251,109,201,168, 72,196, 20,223, 24,148, 60,239,218,181, 43,188,189,189,193,155,144, 43,131,227, 56, 60,
+120,240, 0,251, 79, 92,132,139,151, 63,226, 31, 71,227,238,207,167, 80, 71, 97,135,198, 45, 90,193, 96, 48,212, 42,245,198,235,
+192, 96, 48,236,240,245,245,229,117, 58,221, 69, 0, 27,194,195,195, 71, 41,149,202,169, 39, 79,158,116, 29, 52,104, 80,242,169,
+ 83,167,214, 2,216, 25, 30, 30, 30,252,245,215, 95,119, 99, 24,166,194,209,130, 20, 69,253,248,217,103,159,117, 25, 52,104, 16,
+ 33, 38, 13,186,179,103,118,209, 12, 99, 32,190,152,179,131,189,112,229, 34,201, 48, 6,226,253,161,159,113, 63,255, 30, 78, 78,
+248,116, 37,219,188, 93,111, 68, 68, 68, 56, 7, 5, 5,125,109, 48, 24,170, 52, 90, 37,145,170,202, 34,148, 20, 69, 97,212,168,
+ 81, 56,112,192,248, 30, 84, 99, 1, 31, 43, 47,139, 27, 75, 54,118,183, 32,232,130, 50, 38,171, 30, 66,142,135,229,164, 62, 78,
+126,163, 76, 22, 0,100,102,102,110, 5,176,149,227,184, 84,115,115,115,228,231,231, 87,244,251,147,133,135,135,203, 36, 18, 9,
+122,246,236,105, 23, 26, 26, 26, 67,146,228,186,228,228,228, 74, 29, 71, 69,205,132, 21, 53, 39,162, 22,163, 14,109, 21, 8,106,
+219,169,133,229, 35,235,197,150, 50, 90,115,175, 78,140,204,138, 0,144,171,117,122,118,237,197,144, 60, 34, 77,218,188, 85,215,
+150,176,162,205,131,114,152,252, 10,141, 22, 73, 81,119,115,179,115,222,205,203,215,225,202,213, 8, 12, 29, 82, 31, 90, 61, 1,
+142, 35, 81, 80,168, 5, 40, 17, 72, 0,195, 62, 24, 9,158,160,145,149,154, 12,138,162,194,193, 48,120,195,152, 29, 28, 28,252,
+238,156, 57,115,234,206,152, 49, 3, 51,102,204,240,218,190,125,251,214, 37, 75,150,204, 72, 79, 79,111,130,106,146,143, 87,161,
+ 83,231,212,129,249,211, 79, 92,222,146,219,187,131,250,113,203, 6, 69,145,175,150, 13,144, 37, 18,225, 9, 77, 33,147,231,203,
+119, 51, 10, 10, 10,234, 92,118,253, 47,227,229, 78,240,165,207,141,234,163, 85,191,174,219, 59, 45,154, 7,124, 58,119,206, 92,
+203,168,107, 23, 48,235,171, 13,188,111,171, 30,249, 91, 47,223,213, 21,152,123,191, 91,144,241,228,170,177,254, 2, 0,222,121,
+123, 0,154, 54,106,243,202,155,129, 93,139,146,181, 95, 57,127, 27,169,233, 73, 70, 87,182,197,230,160,194, 62, 89,198, 12,233,
+127, 25,181, 90,157, 19, 17, 17,225,152,152,152, 88,174,227,187,183,183, 55, 8,130, 64, 88, 88, 24,110,220,184,129,161, 67,135,
+130,166,105,136, 68, 34, 92,188,120,209,164,104, 76,153,232, 82,201,168,195, 94,238,238,238,149,141, 54,172, 86, 75,173, 86, 35,
+ 55, 55, 23,103,206,156, 65,253,250,245,177,100,201, 18,184,186, 56, 97,238,220,233,224, 56, 14,121,121,121, 96, 89,214,216,136,
+ 22, 87, 18, 45,226, 56, 14,233,233,233,168, 91,183, 46, 54,110,220,136,181,107,215,126,173, 84, 42, 79,154,186,143, 30, 30, 30,
+ 54, 44,203,126,209,187,119,239, 30,253,250,245, 67,175, 94,229,243,177,238,219,183,207,242,232,209,163, 75,215,175, 95,255,142,
+ 94,175, 95,150,150,150,150,110,140,238, 15, 63, 20,165, 95,146,183, 91,128, 89,131,234, 96,196,164, 93, 88,189,250, 24,164, 82,
+105,185,138,119,241,226,197, 85,154, 24,142,231,125,197, 25,215,146,167,207, 92,229,184,116,105, 40, 66, 67,211, 64,146, 36, 92,
+ 92, 92, 64,146, 36,158, 63,127, 14,146, 36,225,229,229, 5,146, 36,145,148,148, 84,210, 39, 48, 27, 21,140,122,172,248, 46,156,
+132, 70,163, 65, 66,124, 28, 18, 99, 99, 96,145,151, 2,133,149, 28,217, 15, 31,160,233,216,113,165,249,159,254,102,246,232,116,
+186, 61,101,158,175, 58,117,234,148,142, 32,136,247, 81,212, 79,163, 36,162,241, 53,195, 48, 95, 87, 38,210,174, 93,187,230,115,
+230,204, 17,149,164,219,112,245,252,134,209,235,245, 28, 0, 52,104,250, 86, 57,183,255,228,201, 19,172, 94,189, 26,133,133,133,
+ 16,139,197, 98, 99,206, 3,199,113,165, 35, 12, 43, 50, 97,166,152, 44, 0,176,247,114,255, 46,236,206, 69,246,126,236, 22,117,
+248,163, 95,204,148,241, 36, 72,221,155,107,178, 94,142,108,185,187,187, 47,224, 56,142,231,121,126,126,153,183,164,158,158,158,
+151,207,158, 61,107,207, 48, 12,214,175, 95,111,147,146,146, 98,243,214, 91,111,205, 2, 80,169,209,170,168,153,176,162,230, 68,
+148, 25,117, 40,149, 74,237,116,186, 74,131, 39,175,140, 58,100, 89,248, 89, 89,218, 32, 27,137,208, 58, 24,154,231,216, 51, 89,
+231,148,227,238,185,190,104,209,200,156, 53,212, 37,243,116,112,147,219,128,227,249, 74,135, 70,107, 13,134, 95,238,221,185,219,
+211,211,163, 62,117, 50,228, 18,250,246, 31, 4,173,150,132,198, 64,128,160, 68, 32, 40, 49,154, 52,109,129,134,141,155,130, 7,
+112,251,230, 53, 70,103, 48,156,123,147,202,222,165,227, 39, 67, 9, 2,235,192,115,124, 5,121,180,234,246,239,223,127, 41,128,
+ 79,171,211,113,108,247,201, 80,146, 44,210, 41,155, 71,235,179, 79,130,241,240,166,200,250,210,157,229,226, 94,237,112, 58, 61,
+148,128, 92,246,199,168, 67, 17, 89,171,212, 28,255, 22,195, 85,189,209,242,240,240,176,177,146,202,126,248,120,236, 24,203, 23,
+247,175, 35, 37, 50, 12, 87, 47,197,100, 31, 60,122, 44,171, 48, 51,109,172, 9, 38,171,180,153,207,222,185, 14,188,253, 95, 53,
+ 90, 50, 11, 5, 0,192,219,191, 13, 40,115,211,210, 8, 85, 20,205,170,137,201, 42,123,193,174, 40,135,214,132, 9, 19,176,125,
+251,118,116,236,216, 17,190,190,190,165, 23,123, 83,163,102, 21, 68,151, 76, 30,109, 88,150,252,252,124,120,121,121, 97,219,182,
+109, 8, 15, 15,135,165,165, 37,134, 14, 29,138,252,252,252, 82,131,101,108,103,120,158,231,159,156, 61,123,182,245,224,193,131,
+121,145, 72, 68,228,228,228,192,198,198, 6, 27, 55,110, 44, 84, 42,149,167,107, 96,178, 6,137,197,226,233, 67,134, 12,161, 26,
+ 52,104,128,212,212, 84, 88, 89, 89, 25, 8,130, 16, 1,128,141,141,141,193,204,204, 12,193,193,193,104,214,172, 89,167, 25, 51,
+102,116,164,105,122, 99,114,114,242,174,170,126, 75, 4, 65,148, 86,168, 99,215, 69, 67,167, 43,170,160, 55,109,218,132,226,190,
+110,127, 52, 17,196,198, 2, 70,140,100,177,176,176,128,175,175,111,133,101,223,169, 83, 39,220,190,125,187,168,105,146,166,225,
+232,232,136,171, 87,175, 26, 53,146,170, 36, 17,100, 68, 68, 4,252,189, 29, 16, 30,122, 22, 14,114, 17,154,185, 58,195,189, 83,
+103,196,196,196,252,157,209, 44, 2, 69,253, 48,186, 23,255, 6,119, 0,152, 80,230,249, 70, 0,223,153, 34,200, 48, 12, 79,146,
+ 36,145,144,144,160,151,203,229,132,157,157, 29, 45,149, 74,161,213,106, 75, 13,215,147, 39, 79, 16, 18, 18,130,196,196, 68,216,
+217,217,145,214,214,214,208,235,245,217,198,232,251,249,249,193,217,217,185, 92,199,247,177, 99,199,214,200,100,141, 2, 2,182,
+127,179,172,142,148,164,172,253, 29,222,193,179,232,231, 26, 82, 7,217,127,193,100, 1, 64, 78, 78,206, 86, 0, 91, 75,158, 59,
+ 56, 56,140,166, 40,106,174, 86,171,181,190,120,241,162,141, 66,161, 32,118,237,218,101,152, 63,127,126, 14, 69, 81,217, 4, 65,
+172,249,251,205, 33, 34, 51,114, 99,189, 68,182,174,220,125, 13,127,109,106,194,172,134,217,162,250, 10,162,113, 0,250,167, 69,
+ 93, 25,205,196,118, 72, 85,166,144, 60,184,200, 42,174,193, 59,102,205, 89,252, 69, 76,244, 93, 79,153,149, 12, 19,130,231,224,
+244,175,231, 65,144, 34, 92,190, 22, 6,157,158, 69, 70, 86, 46,134, 12, 27, 14,119, 23, 7, 68,222, 56,147,206,112,220,198, 55,
+203,100,115, 27,122,246, 29,109, 43, 53,147, 23,159, 19, 22,123,190,159, 14,146, 92,135, 47,191,252, 18, 1, 1, 1,147, 34, 34,
+ 34, 22,161,154, 60, 90, 4,193,109,104,210,121,152,173, 88, 90,164,195,115, 44,182, 29,158, 85,156, 71,107, 26, 54,110, 61,218,
+164,177,247,179,133, 85,229,209,122,131, 76, 86,217,117,213, 70,203,203,203, 75,106, 46,194,120, 17, 69,207,248,248,131,126,138,
+180,216,135, 72,140,186, 91,212,188,160, 87,235, 83, 30, 71, 25,147, 10,189, 59,202,231,239,224,171,106,186,210,104,140,186,163,
+ 47,167, 89, 82,225,190, 28,205, 50,209,100,189,162, 89,214,108,149,205,155,229,225,225,129,165, 75,151, 26,147, 71,235,229, 99,
+ 47,161, 23,138, 58,192,151,237, 12,223,203, 72,147, 85,161,166, 66,161, 64,102,102, 81,134,132, 46, 93,186,160, 75,151, 63,198,
+ 51,232,245,250,210, 40,150,165,165,101, 69, 17,173, 87, 52,205,204,204,102, 29, 59,118,108,204,181,107,215, 6,127,254,249,231,
+162,110,221,186,149,152, 57, 21,140,155,219,173,156, 38,203,178,193,103,206,156,161, 56,142,195,182,109,219,112,251,246,109, 94,
+ 46,151,207,147,203,229, 27,204,204,204, 88,181, 90, 61, 97,220,184,113,195, 23, 46, 92, 72,118,234,212, 9,215,175, 95, 39,235,
+214,173, 59, 18, 40,151,196,178,194, 99, 15, 11, 11, 3, 73,146, 96,178,226, 49,105,214, 65,152,155,209,136,142,142, 70, 86, 86,
+214, 43, 73, 76,141, 57,159,101, 35, 37, 37, 75,167, 78,157, 74,155, 33,219,182,109, 11,138,162,112,239,222,189,202,154, 97,203,
+106,242,246,246,246,165,191, 15,177, 88,140,243,231,207,227,171,175,190,130,167,157, 13,178,163,194,225,220,229,109,244, 24, 51,
+ 14, 67,135, 14, 5, 69, 81,176,179,179, 43,141,252, 26,241, 91,170, 13,101, 53,199,248,251,251,143,140,140,140,116,111,210,164,
+137, 75, 68, 68, 68,215,128,128, 0,175,240,240,240,146,231, 82, 24,215, 55,167, 84,243,214,173, 91, 71, 54,108,216, 16, 60,106,
+212, 40, 49,199,113,236,139, 23, 47, 12, 0, 8,103,103,103,234,214,173, 91,220,201,147, 39,161, 86,171,225,238,238, 78,186,185,
+185, 17,231,206,157,227,162,162,162,194,120,158,159, 99,204,177,179, 44, 91, 46,141, 67,201,227,125,251,246,153,252,127,175,211,
+208,111, 73,183,183, 26,120,100, 36,223,131, 50, 41, 22,108,174, 66, 31,114,252,148,214, 68,147,245,103,151,209, 95,169,185,248,
+241,227,199,110, 90,173, 22, 18,137, 4,155, 54,109,210, 47, 93,186, 52, 50, 35, 35, 35, 16, 21,143, 40, 47,167, 89,195, 81,135,
+ 89, 85,104,190, 50,234, 48, 55, 19,167,143,159,184,213,218,162,255, 14, 76, 74, 78, 47,237,216,200, 19,132,221, 49,167, 70,129,
+242, 54, 77,146,200,159, 23,144,249,172,234,116, 21,199,174, 83,235,116,131,250, 15, 24,246,219,129, 3,251, 45,230, 47, 88,128,
+171, 97,225,200,204, 41, 0,199, 83,224, 8, 2,115,231,206,135,179,131, 29,242,146, 31,171,180,122,125,127,148,207,161,245,175,
+ 47,119,130, 32, 39,159, 59,185,107, 29, 73,128, 43, 76,125, 36,165,242, 99,229, 35,134,246,167, 7, 13, 26,132, 99,199,142, 33,
+ 34, 34, 98, 75, 21, 38,171, 84,147,231,201,201,225, 23, 15,174, 35, 0, 78,157,254, 72, 74, 23, 60,147,143,252,160, 63, 61,116,
+232, 80,252, 20,114, 13, 7, 78, 61,219,124,224, 20, 78,225,205,198,244,204,240,150, 52, 34, 2, 27,249,184,117,106,209, 88, 70,
+179,106, 36, 70,197, 34,171, 80,131,115, 15, 95,228,144, 60, 89,227,220, 58, 69, 23, 72, 49,226,227, 31, 87,112,103, 37, 43,174,
+208, 53, 38,105,146, 36, 89, 46,154, 85,155, 72, 86,217,253,116,114,114, 42, 55,157, 75,217,138,187,164, 15, 80, 13, 82, 59,204,
+138,143,143,183,138,143,143, 7,207,243, 8, 11, 11,179,106,219,182,237,172,218, 68,179,166, 79,159, 94, 26,181,122,121, 93,209,
+107,213, 81,220, 41,125,173,193, 96, 56, 60, 99,198,140, 73,109,219,182,237,185, 96,193, 2, 2, 38, 76,192,251, 82, 52,135,225,
+ 56, 14, 23, 46, 92,192,177, 99,199, 88,189, 94, 63, 94,169, 84,134,151,217,100,253,157, 59,119,206, 13, 24, 48, 96,215,163, 71,
+143,168,200,200, 72,240,124,245,227, 78,213,106, 53,124,125,125,193, 48, 12,150, 79,242, 64,126,126, 19, 48, 12, 3,150,101, 97,
+110,110, 94, 26,197, 43,107,158,171,251, 29,177, 44,251,138,209, 10, 11, 11, 3, 69, 81, 8, 12, 12,196,221,187,119, 75, 35, 90,
+213, 69,160,244,122,125,188,147,147,147,211,226,197,139, 75,247, 43, 61, 61, 29,103,207,158, 69,187,246, 29,208,104,252, 4, 36,
+ 39, 39, 99,205,154, 53,112,117,117,197,146, 37, 75,144,149,149, 5,134, 97,254,234,112,250,187,145,145,145,238, 31,124,240, 65,
+ 90,120,120,184,123, 72, 72,136, 77, 80, 80,144,249,176, 97,195,210,194,195,195,221, 9,130,232, 0, 19, 59, 65,115, 28, 55,123,
+238,220,185,191, 46, 89,178,100,214,167,159,126,218,118,212,168, 81, 34,145, 72,196, 37, 37, 37, 49,251,247,239, 39,124,125,125,
+ 73,177, 88, 76,156, 57,115,134,187,121,243,230, 13,134, 97,150, 3,184,108, 74,196,185,172,201,162, 40,202, 88,147, 85,142,169,
+142,210,145,150,100,122,224,134, 77, 75,201, 6,222,238,250,221,251,207, 38, 92,190,254,248, 41,165,101,166,254, 80, 69,106,128,
+ 55, 25,138,162, 14,249,251,251,143,158, 60,121,178, 89,175, 94,189,164, 11, 23, 46,204,205,207,207,175,204,100, 85,112,195,252,
+151,140, 58,252,126,246,231, 33, 83, 63,107, 50,218,231, 35,231, 58, 8, 45, 76, 67, 54, 77,145, 86, 54, 36, 90,120, 81,200,207,
+120,162, 56,245,219,206,231, 0,170,203,203,118,235,206,131,136,238,141,155, 52, 63,186,124,201,114,199,121, 51,103,136,142,134,
+252, 2,158,209, 35,236,226, 69, 88,136, 89, 62,234, 78,104,170, 86,175,235,135, 55,112, 10, 30,229,213,239, 14, 0, 56, 97,103,
+103,119,127,204,168, 81,190,254,254,195, 32,151,203,113,228,200, 17,236, 89,191,158, 93, 11, 12,150, 2,119,131,171,201,167,151,
+118,163, 84,231,222,184, 49, 99,252, 90,180,248, 8,114,185, 28,135, 15, 31,198,174,181,107,141,214,249,151, 83,146, 25,254, 52,
+254,200, 16, 95, 77, 31, 45,146,200,191,241,248, 69, 65,216,227, 23, 5,224,120,158,227,121, 45, 73, 34,161, 80,175, 95,242,248,
+ 89, 82,141, 76, 65, 73,211,225,215,223, 76,126,125,109, 30,101,204, 79, 77,135,116, 87, 96,178, 18,203,206,145, 86,182,146,174,
+236,177,193, 96, 72, 52, 82,126,153,167,167,231, 43,175,213, 60,244,203,155,100,178,140,205,163, 5, 0,153,153,153, 74, 0,243,
+174, 95,191,190,175,103,207,158,227, 0, 36,213,176,140,182,117,238,220,121, 60, 0,138, 32,136, 45,201,201,201,225,175,252,225,
+149,202, 24, 87, 87,215,149,222,222,222, 19,138,110, 76,137,109,213, 84,228,207,154, 52,105,162,175,168, 44, 42,123,206,113, 92,
+181,101,148,147,147,131, 54,109,218,188, 50,167, 37,207,243,120,241,226, 69, 73,196,169,244,220, 87,101,224, 10, 10, 10, 38,124,
+242,201, 39, 91, 69, 34,145, 39, 0,162,196,228,178, 44, 75,125,247,221,119, 50,150,101, 41, 0, 4, 73,146,140, 72, 36,210, 28,
+ 59,118,140, 97, 24, 38, 94,171,213, 78,248,139, 47, 16,135,137,162,169, 24, 10, 35, 35, 35, 27, 20, 71,178, 18, 35, 34, 34,238,
+ 29, 56,112, 64, 1,224, 96, 13,117, 47,171, 84,170,203, 75,151, 46,237,180,105,211,166,217, 19, 38, 76,104, 51,116,232, 80,186,
+ 75,151, 46, 56,125,250, 52,123,225,194,133, 48,181, 90,189,204, 20,131, 85, 92,150,185, 30, 30, 30,165,134,171,154,255,114,149,
+ 29,121,237,189,164, 27,134, 79,116,149,109, 91,118,182, 32, 35, 89,119,205, 80,160,155,179, 19,136,192,127,152,212,212,212,207,
+ 1,204, 95,179,102, 77,114,179,102,205,164, 98,177, 88,103,172,201,250, 11, 97,184,156,130,247,190,237, 49,240, 68,231,185,159,
+120,247,232, 26, 40,247,168,227,232, 22, 21,155,138, 39,215, 79, 23,222, 63,245, 77, 28,175,205,238, 11,192,152,158,235, 55,181,
+122,125,253,233, 51,166, 79,146,136, 68, 61, 89,150,109,218,237,220,113,158,162,168,112,157,193,112,174,184,185, 80,243, 6, 23,
+249,215, 43, 87,174,244,245,247,247,199,145, 35, 71,112,110,239, 94, 12,201,200,192,121,138,162, 72,177,216,254,148, 94,191, 10,
+198, 25,164,175, 87,175, 94,237, 23, 16, 16,128, 67,135, 14,225,204,174, 93, 24, 92, 51,157,202,234,186,214, 0, 20,197, 79, 51,
+ 0, 60, 2,208, 18,128, 25, 0, 45,138,166,118,114, 40, 91,133, 21,191, 87,242,254, 37,130, 32,254,204,142,176,213,103,134,127,
+153,136, 39,113, 45, 95,247, 94,168,213,234, 44, 95, 95, 95,147,198, 92, 27, 12,134, 42,219,112, 25,134, 73,244,241,241, 49, 58,
+106, 97,140, 41,202,202,202,106,245, 39, 22, 70,173,250, 98,149,171, 68, 56, 46,206,197,197,133, 43,169,244, 43, 50, 97, 21,189,
+198, 3,207, 77,249,158,148,148,148, 71, 0, 62,171,233,126, 38, 39, 39, 31,133, 17,147, 70, 27,187, 29, 0,100,103,103,191,246,
+201,124, 9,158, 79, 90,184,112,161, 73, 6, 27, 60, 95,149,249, 12, 47, 40, 40,104,107,204,119,235,245,122,252,141, 28, 42, 94,
+200,136,136,136,113, 4, 65,244, 66, 81,147,192, 22,188,158,108,222,151,243,242,242, 46,175, 88,177,162,211,182,109,219,166,242,
+ 60,143,188,188,188,181,166, 26,172,210,187,231,180,180,211,175,235,192,179, 82,117,191,239,223,146,248,182, 58, 71, 63,117,123,
+129,110, 23, 4, 74,131, 81, 60,207,255, 56, 98,196,136,118, 0,118,214, 86,172,146, 81,135,181,229, 57,151,157,219,236,252,244,
+175,198,156,183,177,236, 13,150,110, 0, 29,121, 10,186,204,211, 0,126,128,113,221, 28, 74,143,151,225,184,213,140, 78,183,186,
+ 76,229,242, 95, 40,103,187,128,128,128,169,163, 71,143,198,252,249,243,113,102,213, 42,253, 68,130,200, 21, 1,252,175, 69, 55,
+154, 36, 1,204, 52, 86,103,228,200,145,152, 63,127, 62,126, 94,190,188,166, 58, 85,161, 32, 8, 34, 4, 0,102,205,154, 53,103,
+233,210,165,182,179,103,207,110,186,108,217,178, 37,197,207, 31,150,188, 95, 92,215, 5,205,158, 61,187,113,153,247,243, 1,220,
+250,147,207,103,133,153,225,255,108,186, 11,154,130,166,160, 41,104, 10,154,130,166,160, 41,104,214, 6,158,231,123, 23,173, 42,
+ 95, 87,246,184,204,250,111,129,134,128,128,128,128,128,128,128,192,191,144,178, 81,172,154,188,255, 26, 41,233,163, 85,150,109,
+ 64,209,176,238,202, 92,169, 41,163, 30,106,226,108, 67, 5, 77, 65, 83,208, 20, 52, 5, 77, 65, 83,208,252,207,105, 86,167,253,
+202,231,121,158,239, 77, 16, 68, 8,207,243, 65,149,173, 75,140,213,203,143,203,172, 95, 91,183,131, 10, 40,233,155,245, 74, 31,
+173, 63, 27, 33,172, 42,104, 10,154,130,166,160, 41,104, 10,154,130,102,173, 40,105, 2, 4,192,207,154, 53,107,246, 63,176,233,
+208,165,216,100,149, 93, 0, 84,209,116,200,243,135,169,164, 36, 88, 73, 36,114, 49, 0,232,116, 42,189,155, 27,242, 8, 98,208,
+223, 57,225,173,192,191,147,146,225,222,169,175,121, 91, 1, 1, 1, 1,129,255, 6,233, 37,145, 42, 0,233, 0,136,226,231,186,
+226,117,122,177, 33,123,249,113,185,247,255, 68,148,168, 36,146, 69, 87,102,178, 50, 50,228, 14, 52,157,237,199,178,154,134, 0,
+ 64,211,100,116, 70,134,109, 12,207, 31,206,168,137,217,114,112,116,188, 35,162, 40, 55, 99,182, 53,176,108, 82, 70,106,106,249,
+212,241, 4,241, 38, 24, 60, 99, 77, 68,109,204,198,159,110, 84, 28, 28, 28,156,156,156,156,254,103,101,101,213, 62, 39, 39,231,
+102,122,122,250, 79, 85,204,123,184,148, 32, 48,163,232,119,133, 21, 0,102, 87, 33,109,202,182, 47,227, 43,151,203, 39, 17, 4,
+ 17, 80,252, 7,139, 80,169, 84,155, 0, 60,254, 15, 94,144,204, 0,244,163,105,122,164,131,131, 67,155,148,148,148,133, 0,106,
+154,205,155, 6, 48,221,198,198,102,136,141,141,141, 79, 86, 86,214,211,188,188,188, 67, 0, 86, 3,168,118,168,244,194, 79, 93,
+218,119,233,213,101,222,133, 51, 23,190, 94,184, 94,121,253,149,247,167,187,216,247,236,209,113,254,133, 83,215, 22,207,217,152,
+156,101,226,190,145,197, 11, 80, 52, 58,146,199,171,201, 94,107,139, 8, 64, 31, 0, 93, 0, 92, 0,112,202,152,227,174,132,118,
+ 0,230, 20,239,243,106, 0,231,255,225,191, 35,115, 39, 39,167,229, 0,250,208, 52, 29,153,148,148, 52, 30, 64,226,223,188, 79,
+ 52,128,214, 0, 2, 80,148,134,227, 22,140, 75,225, 80, 45,246,246,246, 65, 52, 77, 79, 42, 78,237,178, 41, 51, 51, 51,228,159,
+ 90, 48, 18,137,100,173,179,179,243, 71,106,181, 90, 69, 16, 4, 95, 54,223, 35,195, 48,137, 25, 25, 25,173,222,180,139, 26, 65,
+ 16,183,254,225,187, 56,190,130,215, 42,207,163,149,148, 4, 43,154,206,246, 75, 75, 9, 31,146,172,124, 48, 24, 0, 92, 93,154,
+ 30,114,116,110,114, 48, 41, 73,162,119,110,208,223, 66, 36,167, 55, 81,148,168,185, 70,167,117, 16,209,162, 12, 61, 99,184, 71,
+234,248, 73, 41,143,126,170, 48,217,162,136,162,220,226, 98,206, 59, 50,250, 44,136,100,174, 16,153,121, 86,186,183,174,174,174,
+ 53, 58, 74, 91, 91, 31, 75,189, 84, 54, 85, 36,162,122,112, 60, 19,192,115, 0, 73,136, 34, 24,214,240,155, 88,171,253, 54, 59,
+251,105,126, 77,207, 96, 3,123, 56,243,192, 80, 16,232, 1, 30,231, 8,224,192,163, 76,164,152, 32, 97,172,137,168,141,217, 40,
+251,217, 53, 0, 62,127,221,191, 36, 55, 55, 55,219,160,160,160,181, 95,125,245,149,153,133,133, 5, 17, 31, 31,223,107,230,204,
+153,111,221,190,125,251,179,164,164,164,228,151, 77, 31, 65, 96, 6,199,241, 36, 0,144, 36, 49, 83,161,112,148, 83, 20,245, 74,
+110, 35,150,101,229,233,233,105,147, 57,142, 39,138,183,157,193,243, 88,103,140, 97,148,201,100,195, 2,154, 52,255,108,249,202,
+213, 22, 78,142,142,230, 12,203,233,159,191,136,147,207,155,245,121,219,216, 39,143,215,105, 52,154,253, 53,249, 95, 83, 20, 53,
+ 68, 42,149, 6, 1,240, 47,126, 45, 74,171,213,134,176, 44,123,208,216, 10,221,201,201,233, 18, 69, 81,117, 76,249, 98,150,101,
+227, 83, 83, 83, 3,107, 88, 68,131, 60, 61, 61,127,232,220,185,179,188, 77,155, 54,144, 72, 36,152, 63,127,254,116,165, 82, 89,
+157,209,162, 1, 76,151,203,229, 67,204,205,205,125, 10, 10, 10, 98,213,106,245, 81,137, 68,210,125,221,186,117, 30, 29, 59,118,
+180, 76, 77, 77, 37, 40,138,114,250,249,231,159, 63, 92,187,118,109, 47,134, 97,186, 85, 87,201,229,198,242,243,164,125,252, 59,
+229,198,158,159, 7,224,221,151,223,103, 52,178,145, 60,229, 17,164,230,239, 38, 20,155, 15,163, 77,150, 72, 36, 90,231,236,236,
+ 60, 90, 83,148, 43,128,127,185,194, 1, 0,157, 78,151,157,147,147,211,160, 38,127,121, 0, 99,109,108,108, 70,127,241,197, 23,
+182,239,190,251, 46,246,238,221,251,241,246,237,219,179,243,242,242,126, 68, 81, 34,204, 71, 38,106,206, 72, 73, 73,121, 79, 36,
+ 18, 17, 30, 30, 30,148, 90,173, 54,197,104,249,161,104, 18,230, 91, 0, 54,161, 40,117, 65, 87,160,232,255, 14, 96, 69,137,113,
+ 35, 73,114, 83,131, 6, 13,254, 23, 21, 21,181, 25,192,215, 53,253,175, 59, 59, 59,111,221,184,113,227,224,190,125,251, 82,233,
+233,233,110,205,154, 53,219,151,146,146,210,233, 53, 92, 70,198, 72,165,210,105, 77,155, 54,109,244,232,209,163,152,188,188,188,
+213,197,231,179,170,255,148, 59,128,238, 54, 54, 54,221,230,206,157,107, 17, 20, 20,132,109,219,182,189,183,125,251,246,130,252,
+252,252,223, 80,212,167,167, 86, 38,144,166,233, 73,137,137,137, 14, 60,207,195,197,197,101, 18,128,127,164,209, 34, 73,114,221,
+128, 1, 3, 70,239,219,183, 79, 30, 23, 23, 39,119,115,115, 43, 77,158, 77, 16, 68,141,235, 79,129, 90,179,173,140,225,170, 62,
+143,150, 68, 34, 23,179,172,166, 97,178,242,193,224,183, 58,127,103, 13, 0,151, 46,126, 50,216,209,185,113,132, 68, 34,143,145,
+ 90,201,142, 13,232,211,189,249,192,160,206,132,187,139, 35, 18,149,105, 78,223, 31, 56,243, 78,200,153,243,199, 80,148, 64,172,
+ 66, 24,125, 22,204,244,161,120,116,101, 61, 28,186, 36, 99,195,207,137,184,126,255, 57, 84,185, 25,168,227,108,134,149, 83,123,
+194,217, 86, 94,179, 91, 47, 71,223,174, 12, 45, 61,248,193,176, 17,214,255,235,231, 47,242,114,118, 6,207, 75, 17, 19, 91,208,
+225,151,179,231, 91, 31, 61,188,127,146,185,200,119, 72, 97,218, 99,163, 47,110, 45, 92, 96, 86,168, 71, 63,154, 34, 62,236,216,
+170, 81,183, 97,239,117, 34, 27,249,215, 71,228,195,168,158, 39,126, 15, 91, 73, 94,123,248, 27,195,242,187,205,197, 56,126, 87,
+ 89,101, 66,191, 87, 12, 71,183,110,221, 59, 73,165,210,114,201,147,180, 90,173,248,183,223, 66,219,213,196,108,148,124,135, 78,
+167, 37, 69, 34, 9, 72,146,248, 44, 32,160,137,127, 70, 70,198,121,130, 32,126, 72, 78, 54, 45, 90,240, 9, 32,201,166,233,150,
+164, 84,234,194,234,116,246, 0, 64, 72, 36,217,207, 73,178,201,220, 57,115, 44, 40,138,226, 50, 51, 51,161, 82,169,136,113,227,
+198,201, 98, 99, 99, 7, 36, 37, 37,173,175,230,142, 4,219,183,111,247,115,113,113,121,101,246, 88,165, 82, 41,233,219,247,127,
+ 53, 41,122,191,166,205, 90, 76, 59,115,230, 87,255,188,172,108,205,246, 53, 91,239, 24,100,114,109, 93,255, 6,162, 77,219,118,
+ 89,143, 31, 61,252,147,232,232,135,247, 96,218,124,117,158,102,102,102,199, 86,173, 90, 21,208,181,107, 87,145,163,163, 35, 82,
+ 83, 83, 17, 21, 21, 21,240,251,239,191,247,219,181,107,215,116,181, 90, 61, 0, 48,106, 66, 84,223,223,118,255,224,104,110,103,
+ 15,214, 96,128,107,211, 22,165,249,205,158,252,126, 22,140, 94, 15,206, 96,128,127, 80,191,226,104, 50, 15,127,127,255,154,102,
+221,117,109,220,184,241,158, 37, 75,150,136,181, 90, 45,194,194,194,112,254,252,121, 78,169, 84, 86,151, 16,151, 38, 8,226,236,
+130, 5, 11,220, 3, 3, 3, 45, 51, 50, 50,192,178,172,195,241,227,199, 39, 53,111,222,220,202,195,195, 67,178,123,247,110, 20,
+ 20, 20,128, 97, 24, 59, 31, 31, 31,187, 97,195,134,233,118,239,222, 61, 29,192,242,202, 34, 89,121,177,252, 60, 37,225,243, 78,
+131,150, 35,145, 66,252,250,206,180,119,240,139, 85, 61,162, 52,178,245,142,143,143,101, 94,146,124,166,133, 85, 19,187,188,164,
+208,153,239,248,248,108,255,245,169, 81, 55, 67,100,113,101,243,193,129, 3, 7,228, 81, 81, 81,114,127,127,127,112, 28, 87,154,
+129,191, 36,225,172,175,175,111, 77,206,227,178,224,224,224,153,131, 7, 15, 70,211,166, 77, 75,147,162,126,249,229,151,152, 57,
+115,166,237,165, 75,151,166,239,223,191,127,250, 79, 63,253,180, 28,192, 44, 19,163, 49, 37,152, 90,198,139,158, 61,123, 54,232,
+216,177, 99,195,103,204,152,225, 11, 96, 50,128,249,153,153,153,157,139,163, 49,146, 98,163, 53,102,250,244,233, 19,103,205,154,
+133,247,222,123,111,126, 88, 88,216, 55, 53,140,242, 81, 12,195,188,215,183,111, 95,202, 96, 48,192,220,220, 28, 6,131,161, 94,
+109,131, 18, 0, 54, 78,152, 48, 97, 98,112,112, 48,108,109,109, 97, 48, 24,252, 14, 28, 56,176,125,254,252,249,237, 1,140,173,
+100, 95, 71, 78,156, 56,241,253, 17, 35, 70,160, 85,171, 86,160,233,162,211,184,106,213, 42, 44, 94,188,216,226,236,217,179,253,
+118,239,222,221,239,196,137, 19, 71, 81,126,218, 46,147,224, 56, 14, 52, 77, 35, 33, 33, 1,142,142,142, 82,142,227,206, 16, 4,
+177, 45, 43, 43,235,167,127, 80,101,190, 98,208,160, 65, 31,236,219,183,207, 2, 0, 86,174, 92,137,105,211,166,193,201,201, 9,
+ 22, 22, 22,130,213,249,231, 68,180,198, 87, 27,209,170, 14,149, 74,213, 98,246,167, 31,130, 36,139,238, 26,235,215,245,196,210,
+ 57,227,137, 19, 33,103, 90, 84, 25,131,151,185,226,209,149,245,144,122, 76,133,214,192,224,198,253,103, 56,183,178, 87, 81,109,
+249,238, 92,104,245,221, 74, 42, 27, 59,137,153,217, 10, 29,203, 94,133,179,115, 24, 94,188, 72,175,206,100, 41,156,157, 66,182,
+108, 89,110, 22, 80,175, 1,244,140, 1, 73,105, 73, 32, 8, 41,220,221, 44, 49,102,228,187,162,206,157, 93, 29, 22, 45,218,122,
+ 58,133, 67,127, 85,198,227,106, 19,134,250, 57, 96,103,139, 0,223,193,195,122, 7, 74,155, 4, 52,134, 88,106, 86,250, 94,203,
+ 86,173,208,178, 85, 43,114, 86, 65,126,143,155,183,238,244, 56,114,246,134, 86,101,120,113, 40, 38, 3,163,170,185,200,148, 26,
+142, 41, 83,166,192,201,201,169,220, 6,169,169,169,248,253,247,223, 42,252,140, 9, 23,178,210,239,248,230,155,111, 44,179,179,
+179,223,221,177, 99,199,219, 28,199,125,147,146,146,114,197, 24,145, 17, 64,157, 92,169,180,219,232,213,171,185,230,255,251, 31,
+101,227,236, 76,114, 44, 75, 36, 63,125,106,191,102,253,250, 46, 89, 79,158,152, 21,218,217,101,101,171,213,170,152,152, 24,200,
+100, 50,130,166,233,214, 21, 72,165,242, 60, 86,144, 36, 49,147, 32, 8, 72,165,178,152,224,224,224,187,197,239,213, 57,117,234,
+148,188, 79,159, 62, 42, 0,113, 0, 32,149,202,220, 40,138,222, 54, 21,243, 0, 0, 32, 0, 73, 68, 65, 84,244, 43,202,196,142,
+ 21,198, 24, 76,115,115,243, 79,191, 94,178,220, 60, 47, 43, 71,173, 47, 44, 52, 40,172, 44, 8,194,194,146,202,203,205,207, 79,
+ 82,166,107,231, 46, 92, 76, 77, 24, 51,226,211,194,194,194, 73,198,154,172,102,205,154,221, 60,118,236,152,163,189,189, 61,114,
+114,114,144,153,153,137,155, 55,111,130,227, 56, 12, 24, 48, 64,218,161,109,155, 22,115,230,206,187,158,144,148,212,222, 24,179,
+101,110,231,128,149,129,205,139, 42,235,184,204,210,242,217, 54, 40,168,116,155,197,137,185, 37,209,185,218, 76, 33,213,190, 91,
+183,110, 98, 0, 24, 59,118,108, 94,126,126,254, 82, 0,251, 80,125, 70,255,233,243,230,205,115,171, 91,183,174,215,190,125,251,
+ 80, 80, 80, 0, 0,142,117,235,214,133,159,159, 31,123,225,194, 5,248,249,249,193,210,210, 18,151, 46, 93,194,245,235,215,209,
+170, 85, 43, 75,177, 88, 60, 88,175,215, 87,104,180,186,244,234, 50, 79,218,199,191, 83,131,150, 35, 97, 97,229,130,237,251, 15,
+226,209,157, 93,157,180,250,168,121, 98,246,226, 8, 53, 47, 29,149, 30,111, 49,171, 78,171,206,246,245, 27,255, 15, 94, 45,239,
+ 58,104,216,203,207,230,245,168,187,140,150,105,118, 45, 92,173,204,172,204,100, 1, 88, 57, 96,192,128, 65, 7, 14, 28,176, 1,
+128,240,240,112,164,166,166, 66,161, 80, 64, 38,147, 65, 36, 18,149,206, 79, 90, 67, 70,109,218,180,169,212,180, 49, 12, 83, 58,
+ 11,128, 92, 46,199, 91,111,189,133,230,205,155,227,167,159,126, 26, 85,137,209, 10,108,219,182,237, 94, 47, 47, 47,143,178, 47,
+ 22, 22, 22, 98,232,208,161, 0,128,206,157, 59,119, 51, 51, 51,227, 75, 12,161, 82,169, 44,184,117,235, 86, 15, 0, 97,149, 56,
+ 75,117, 82, 82, 18,190,248,226, 11, 60,127,254,252,227, 45, 91,182,188, 0, 32,147, 72, 36,165,247,199, 0,252, 26, 55,110,188,
+110,218,180,105,136,141,141, 69,100,100,228, 77,212,188, 41,149, 53, 55, 55,127, 98, 48, 24, 90, 49, 12, 3,181, 90,141,254,253,
+251,203,142, 30, 61,154, 74, 81, 84,116, 70, 70,198,112, 20,245, 73, 49, 22, 25,128,213,193,193,193, 19,103,204,152,129,223,126,
+251, 13, 39, 78,156,192,136, 17, 35, 48,117,234, 84, 88, 88, 88,140,158, 58,117,234,117, 20, 77,104,254, 50,221, 54,109,218, 4,
+150,101, 95,249,111,200,100, 50, 4, 6, 6,162, 81,163, 70, 56,113,226, 68,183, 90, 24, 45,175,192,192, 64, 9,199,113, 40, 44,
+ 44,196,133, 11, 23, 44,204,204,204, 44,220,221,221,199, 1,248,199, 24, 45, 47, 47,175,224, 3, 7, 14, 88,148,109,253,145, 74,
+165, 40,243, 59, 16,248,251, 35, 90, 85,222, 97,149,162,211,169,244, 52, 77, 70,187,186, 52, 61,116,233,226, 39,165, 77,135, 0,
+ 25,173,211,169,244, 0,192,114, 60,242, 84, 12,204,164, 36,226, 82,242,241,240,105, 70, 69, 82,229,134,104,138,204, 60, 33,109,
+ 19, 7,158,231,161,211,179,208,230,166, 96,233,105, 21,162, 18, 53,208, 21,102, 67,167, 47,234,134,229,224,224, 64,159, 57,243,
+203,180,208,208,223, 39,254,248,227,143, 84,162,181,117,100, 62,208,162, 34, 77, 91, 91, 31, 75, 78, 34, 57,180,121,203,124, 51,
+158,122,138,152,248, 66,212,119,111, 3, 7, 27, 15,164,100, 20,226,106,228,207,136,126, 28,130,186, 46, 94,152,250,233, 59,178,
+175,151,236, 59, 40,102,188, 61,115,114,158,231, 85,182,159, 37,119, 81, 91,127,141, 1,147,245, 20,108,102, 44,216,252,228, 87,
+ 54,176, 80,120,162,101, 87, 55, 40, 60,234, 73, 71, 77, 93, 60, 18, 40,103,180,202,106,166, 18, 4,185,153, 36,137,137, 4, 65,
+160,105,211,102,137,171, 87,175,174, 40, 21,184,190,105,211,102,137, 20, 69,186, 23, 93,216,201, 77, 60,207,165, 86,179,159,229,
+ 76,141, 68, 34,157, 81, 20,246,119, 73, 56,125,250,180,126,208,160, 65, 88,181,106,149,100,230,204,153,115, 41,138, 26, 91, 65,
+243, 94, 57,205,254,128,167, 77,189,122, 61,191,185,122,149, 23, 25, 12, 68,214,205,155,121, 57, 74, 37,147,146,159, 47, 57, 28,
+ 29,253,222, 71,159,127, 46,241,240,240,192,149,144, 16,251,244,194, 66, 62, 71,171, 85,231,228,228,240, 12,195,220,172, 68,115,
+182, 66,225, 40,223,190,125,187, 95,112,112,240, 93,165, 82, 57, 27, 0, 92, 92, 92,150, 2,104, 4, 32,174,204,107,216,178,229,
+ 96,210,184,113,227, 98,210,210,210,102, 87,181,159,101,104,236,168,112,148,239,223,186,251,129,157,165, 25,169,112,119, 37, 69,
+ 54, 54, 52, 35, 49, 19,115,128,186,174, 71, 61,115, 0,141, 43,249,236,203,154,132,153,153,217,177,147, 39, 79, 58,138, 68, 34,
+176, 44, 11,133, 66,129,231,207,159, 35, 39, 39, 7,249,249,249,120, 22, 29, 5,111, 15, 15, 44,154, 53,211,101,242,204, 89,199,
+ 84, 42, 85,171,151, 42,179, 87, 39, 64, 54,232, 95,137,236, 85, 52,139,193,203,205, 94, 70,150,123, 89,158,199,199,199,195,194,
+194, 2, 1, 1, 1, 22, 87,175, 94,189, 92,133,201, 42, 59, 9,240,224,142, 29, 59, 90,238,219,183, 15,173, 90,181,130,181,181,
+ 53, 46, 92,184,128,240,240,112,232,245,122,178,160,160, 0, 22, 22, 22, 88,182,108, 25, 60, 61, 61,145,159,159,143,184,184, 56,
+123,145, 72,228,240, 82, 70,251, 82,205, 11,103, 46,124,157, 27,123,126, 94, 10,241,235, 59,219,247, 31,196,184, 97, 67,224,204,
+ 63,189,108, 93,143,248,186,103,159,142, 95,242,148, 71,144,185,101, 83, 91,223,128, 62, 16, 75, 44, 48,121,198, 98,196, 68,156,
+178, 85,229, 63,248,152, 96, 19, 60, 22,174, 62, 60,165,130, 99, 39, 0,144, 30, 30, 30, 31, 29, 62,124,216,178, 52,244, 66, 81,
+165,115, 30,150,157, 4,190,138, 9,223,171, 61,159, 4, 65,224,249,243,231,112,116,116,132,133,133, 69,233, 4,226, 81, 81, 81,
+184,113,227, 6, 74,102,163,168, 68,115,120,104,104,168,135,185,185,121,185, 13,120,158, 71, 70, 70, 6, 24,134,129, 92, 46, 7,
+203,178,208,235,245, 48, 24, 12,208,104, 52, 22,141, 26, 53,154,100, 48, 24,194, 42,210,228, 56,238,179,193,131, 7,119, 12, 11,
+ 11,243, 89,191,126, 61,116, 58,221,202,148,148, 20,188,255,254,251,224, 56, 14,221,186,117,107,199,243,252,163,185,115,231, 2,
+ 0,166, 77,155,102, 40, 44, 44, 12,174,201,177, 23,211,168,101,203,150, 62,191,253,246, 27, 58,117,234, 4,173, 86,139, 85,171,
+ 86, 89,109,217,178,197,106,247,238,221,138, 25, 51,102,252,144,158,158,222,171, 26, 77, 2,192, 74,103,103,231,137, 93,186,116,
+ 49, 43,158,195, 20,187,118,237,194,162, 69,139, 14, 0,152,251,203, 47,191, 44, 56,113,226,196,200,143, 62,250, 8,139, 22, 45,
+154,154,147,147,179,163, 50,205,103,207,158, 65,161, 80,192,202,202,170,232, 98,169,215,227,222,189,123, 56,119,238, 28, 26, 54,
+108,104,204, 49, 85,182,159, 94, 3, 6, 12,248, 97,255,254,253,150, 9, 9, 9,184,116,233, 18,188,189,189,161, 82,169,140,153,
+ 27, 54,244, 79,168,176, 43,213, 84,171,213,154,248,248,120,139,229,203,151,195,197,197, 5, 94, 94, 94,144,201,100, 32, 8, 2,
+ 6,131,161,170,233,213,170,221,207,206,157, 65,103, 36,217,246,181,182,177,253,152,231,121, 58, 55, 55,123,171, 30, 57, 71,158,
+ 62,133,238, 47, 60,246,127, 51, 45, 0,220, 69,249, 57, 15,149,165, 70, 43, 36, 36,132, 15, 10, 10, 34, 74,214,110,110,200,203,
+200,176,141,113,116,110,114,208,209,185,113,241,188, 95,100, 52, 69,217,198, 56, 57,169,242, 0, 64,207,240,184, 22,157,131, 7,
+ 79, 82, 16,254, 36, 5,230, 82,227,130, 47, 90, 61, 83,212, 99,149,231,161, 41,248,227,166, 85,175,202,134, 86, 95,212,221, 67,
+167, 85, 33, 55, 61,146, 24,212,191,135,108,226,196, 9,112,113,113, 83, 84,166,167,151,202,166, 78,158,246,158,141,157,141, 8,
+ 33, 87,127, 69,187,134,253, 33,147,138,144,153,171, 1, 8,224,241,211,115, 0,103,137,136,152,120,180,109, 44, 71,175,158,254,
+255,103,239,186,195,162,184,218,239,153,237,176,187,244, 94, 44, 88, 0,123,239, 40, 98, 67, 99,239, 88, 98,239,216, 27,106,140,
+ 37, 42, 26, 77,236,189,196, 96,239,137,216, 80, 84, 44, 88,233,136, 88, 0, 41, 11, 82,150,165,108,223,157,157,249,253, 65, 9,
+ 42,101, 65,243,253,190,228,219,243, 60,243,192,236,206,156,125,231,222, 59,115,207,188,247,222,247, 21, 94,190, 16,191, 4,192,
+106,125,236, 37,211,158,131,227,218, 15,108,157, 22,218,156,120, 80,121,201,128,192, 30, 10, 66, 8,113, 70, 50, 94, 63,188,168,
+215, 59, 35, 69, 81,115,172,173,173,243, 86,173, 90,213,189, 97,195,134,154,217,179,103, 71, 38, 39, 39, 47,250,236,109,229,215,
+125,251,246,225,221,187,119,162,141, 27, 55,222,207,201,201,249,161,154, 21,237, 71,211,216, 81, 60, 20,151,115,229,202,149, 54,
+ 33, 33, 33, 11,118,236,216, 97, 55,119,238, 92,238,220,185,115, 39, 3,248,169,178,225,194, 2, 30,175,215,198, 7, 15,104, 50,
+ 45, 77,117, 98,247,110,238,222,208,208, 85, 26,138,114,180,182,181, 37, 58,119,232, 32,227, 51, 24, 57,226,204, 76,210,166,126,
+125,102,210,237,219, 86,180,177,113,250,141, 27, 55, 10,164, 82,105,133,169,115,152, 76,166,188,188,225,194,242,224,224,224,160,
+ 46,111, 14, 87, 37, 29, 98, 1, 69,211, 26,243,122,245,232, 62, 61, 59, 53,124, 23,159,144, 96,100,110,206,116,109,232,226, 30,
+251, 58,233, 57,173,211, 41, 9,130, 40,208,107,172,132,201, 28,189, 99,199,142,230,166,166,166,160, 40, 10,102,102,102,200,206,
+206,134, 90,173, 70, 65, 65, 1,212,133,249, 80,231,231, 35, 58, 57, 9, 93,186,119,199,200,190,125, 26, 7, 92,249,115,180, 78,
+167, 59, 83,233,120, 94,139,214,165,158,172,245,117,173,254, 26, 11, 74,205, 43, 21, 93, 91, 90,187,130, 35, 20,162,247, 34,191,
+175,185,209,195,175, 93,187,118,125,216,176, 97,223, 45, 89,178,132,145,145,145,113, 51, 41, 41,169, 11,128, 87,149,157, 36, 20,
+ 10, 27,228,228,228, 64, 42,149,194,204,204, 12, 59,118,236,128,157,157, 29,228,114, 57, 94,188,120, 65, 59, 59, 59, 19,247,239,
+223,135,179,179, 51,196, 98, 49, 52, 26, 13, 20, 10,197, 71,181, 90, 93,225,112,121,241,240, 96,191,133,125,113, 35, 62,236,247,
+174, 78, 68,226,139, 81,139, 61,223,197, 71,191, 78, 9,186,253,248, 39, 82,105,148,154,151,118,103,121,189,118,225,214,115,150,
+174,195,158,173,107, 16,255,236, 65,174, 93,237,130,189,198,132,234,120,101,246,202,100, 50,229,235,215,175, 77, 34, 35, 35, 65,
+ 16, 4,204,204,204,192,231,243,203, 21, 91, 53, 0,163,172, 7, 74, 38,147,129,195,225,192,202,202, 10, 71,142, 28, 41,237,120,
+ 93, 92, 92, 42,227, 56,216,187,119,239,209,181,107,215, 54, 41,251, 97,187,118,237, 48, 99,198, 12,236,223,191, 31,161,161,161,
+159,228,211,252,248,241, 99,134, 86,171,173,236,186,243, 50, 51, 51,251, 14, 29, 58, 52,236,225,195,135,166, 71,142, 28, 1, 73,
+146,229,110,135, 15, 31,198,211,167, 79, 87, 3,120, 93,195,118,212,104,248,240,225, 15, 78,158, 60,105,158,157,157,141,146,182,
+ 33,147,201,160,211,233,224,238,238, 78,144, 36, 89,213,188, 55, 6,147,201,188,178,123,247,238,129,211,166, 77, 3,139,197,130,
+ 90,173,198,238,221,187,177,124,249,242,204,226,151, 82, 13,128, 85,199,143, 31,159, 48,104,208, 32,180,108,217,178,241,189,123,
+ 21,207,236,144, 74,165,144, 74,165, 96,179,217,176,183,183,199,134, 13, 27,160, 86, 23, 61, 86,220,220,220, 74,111, 99, 0, 7,
+221,220,220, 6,190,121,243,102, 27,138,230,174,125, 1,123,123,251,161, 52, 77, 79,215,233,116,133, 93,187,118,181, 58,125,250,
+180,137, 72, 36, 66, 88, 88, 24, 86,175, 94, 45,161, 40, 74, 71, 81, 20,161, 80, 40, 18,109,109,109,195,120, 60,158,177, 92, 46,
+207, 21,139,197,155, 0,220,252,255,234,201, 9,130, 32,216,108, 54,166, 76,153, 2, 22,139, 5, 99, 99, 99, 40,149, 74,104,181,
+218, 82, 49,143,106, 14, 75, 55,108, 40,180, 98,129, 51,205,194,164,201,130,145,243, 7,216, 56, 56, 58,193,220,148,135,184,184,
+ 87, 93,238, 6,223,222,205,101,197, 31,160,212,218, 3,241, 31,242,255,246,100,247,159,107,145,127,168,208,250, 34,231, 33,171,
+252,202, 28,169,163,233,243, 57, 34, 17, 87,195,229,242,223,148,120,185,236,236,228, 5, 4, 49, 82,103,211,116, 48, 72,141,182,
+248, 65, 65, 23,111,122, 10, 45,173, 14,239,226, 99,240, 48,232, 79, 88,203, 69,200, 73,108, 5,112,154, 67,173,200,135, 82,173,
+ 41, 22, 37, 58, 68,134, 5,163, 32, 63, 23,205,218, 14, 0, 24,140,167, 21,241,153, 89, 17, 3, 58,183,105,193,124,151, 18,131,
+118,110, 35, 80,223,185, 43,146, 51, 10,144, 39, 85, 65, 82,160, 68,171,102,126,200,150, 40, 80, 32, 87,226,213,187, 0, 56, 57,
+214,103, 16,172,132,158,250, 10, 45,213,171, 75, 80,189,254, 3,156, 58, 93,192,117, 31, 4,102, 29, 15,164, 68,221, 67,228,141,
+237, 72,139,125, 4,154,210,193,193,173,189,190, 55,201,238,155, 55,111,182,239,210,165, 11,171, 87,175, 94, 45,175, 95,191,222,
+ 50, 35, 35, 35,178, 88, 96,180,236,213,171, 87, 75, 27, 27, 27,236,220,185, 83, 65, 16,196,238, 26, 86,118,169, 7, 44, 43, 43,
+235, 57,128,141,151, 46, 93,218, 61, 99,198, 12,216,218,218, 54, 79, 79, 79,175,240,196,108, 54,187,229,196, 77,155,104, 54,147,
+ 73,159,217,179,135,179,238,230,205, 95,126, 59,126,156,211,195,203,139,160,105, 26, 17, 17, 17,252, 45,123,246,240,199, 14, 30,
+252, 33, 57, 43,139, 12, 9, 13,213,100,164,165, 21,102,201,100,235, 50, 50, 50, 62,254,127,180,108,173, 86,251, 36, 49, 41,209,
+169,109,135, 86, 54,225,113,137,177,222, 61, 58,119,102, 48, 24,140,248,132,228, 80, 27, 27, 83,254,237,160,219, 26,173, 86,251,
+ 68, 31, 46, 30,143, 55,160, 71,143, 30, 44,137, 68, 2, 71, 71, 71,100,103,103, 67, 36, 18, 21,121, 28,242, 37,208,228,231, 67,
+ 91,144, 7,157, 76,138,196, 23,207,209,170,126, 61,222,121, 30,111,128, 92, 46,175, 84,104,149,188,101,150,151,232,186,228, 51,
+174,137, 9,184, 66, 33,136,234, 15, 27, 14, 54, 55, 55, 95,158,151,151,119, 29,192, 6,141, 70,227,187,124,249,242,118,187,118,
+237,178,222,184,113,163,233,244,233,211,207, 75,165,210, 86, 40, 74,170, 90, 81, 7,246,158, 36, 73, 43, 0,118,193,193,193,176,
+181,181, 69,126,126,126,137,167, 69, 45,151,203,141,196, 98, 49, 84, 42, 21,212,106, 53, 76, 77, 77,241,242,229,203, 92,146, 36,
+175, 86,101,156,105, 3, 98,131, 74, 19,247,131, 85, 99, 65,186,134,180,240,204,202,165, 36,107,127,201, 88, 15,224,151,190,245,
+235, 31,214, 80, 15, 18,223,198, 92,181, 72,122,113, 63, 55,253,173,172,254,145,235,137,149,205,209,162, 1, 80, 4, 65,208,110,
+110,110,200,206,206, 6,147,201, 4,159,207,135, 80, 40,196,138, 21, 43,176,123,247,238,154, 8, 45, 35,129, 64,176,137,193, 96,
+140,102, 48, 24, 54, 58,157, 14,126,126,126, 24, 56,112, 32,184, 92, 46, 52, 26, 77,169, 71,179,196, 75, 85,133,167, 35,226,233,
+211,167,166, 79,159,126,242,216,242,178,182,182,190,171, 82,169,144,144,144,128, 43, 87,174,116, 7, 16, 82,205,186, 78,136,136,
+136,232,235,225,225,241,123,155, 54,109, 26,208, 52,141,230,205,155,195,199,199, 7, 1, 1, 1,136,140,140, 68,126,126, 62,117,
+251,246,237,223, 0,108,171,110, 31, 94, 92,190,238,195,135, 15,127,116,234,212, 41, 11,177, 88, 12,133, 66, 1,153, 76,134,243,
+231,207,163, 75,151, 46,176,182,182,198,201,147, 39, 73,154,166, 43,171,123, 6,131,193, 56,114,224,192,129,129, 83,167, 78,197,
+222,189,123,113,230,204, 25, 12, 26, 52, 8,163, 71,143, 70,118,118,182,221,214,173, 91, 39, 20, 15, 19,174,241,241,241,129, 84,
+ 42,197,139, 23, 47,226,244,188,231,145,151,151,135,188,188, 60, 24, 27, 27,151,189,199, 8, 0, 1,219,183,111, 31,179, 96,193,
+ 2,212,175, 95,127, 77, 98, 98,226,118,148,179, 74,148,162,168,153, 34,145,200,130,197, 98, 89,145, 36,137,212,212, 84,188,124,
+249, 18,115,230,204,201,205,205,205,157, 1, 32, 25,192,170, 41, 83,166,108, 88,180,104, 81,105, 91, 90,180,104, 81,224,245,235,
+215,251,254,167,189, 57,110,110,230, 77,185, 76,222,124, 73, 33,211, 74, 34,145,148, 62, 59,212,106, 53, 84, 42,213, 39,158, 44,
+ 14,135,109,213,174, 85,237,107, 10,121,225,202, 87,111,243, 42, 76,144,222,184,129, 89, 11,190,192,108, 65,151,174, 61,198,245,
+233, 59,132, 73,106,181,184,117,235, 42,142, 30,221, 7, 47, 15, 55,212,111,216, 28,115,231,205, 55, 83,169, 73,191,219,183,111,
+ 46, 55,127,250,240,102, 97, 65,222,138,202, 56,255,199,113,173, 88, 92, 93, 43,119,232,176, 60, 5, 89, 28,194, 65, 82,188,107,
+109, 97, 97,177, 71,167,211,121,153,154,154,130,202,123,131, 87, 47,159, 33, 87,194,134, 74,161, 3, 69, 23,137, 45,189,132,139,
+ 74,141, 7,183,254,192,142,237,191, 64, 44, 22,195,163, 91,119, 72, 89,181, 80,187, 86,109, 40, 21,242,226,155, 6,208,168,181,
+176,177,171,131,240,240, 72,109,129, 76, 86,225, 3,137, 99,164,105, 92,219,206, 13, 42, 77, 39, 24,113,185,200, 47, 84, 67, 82,
+ 44,178, 78, 94, 24, 5,149, 92, 1, 82,173, 1,169,214,194,166,246,112, 52,178,235, 1, 74,119,181,105,181,138,143,210, 65,147,
+244, 0,154,164, 7, 48,238, 52, 15,127,250,143,249,172, 35,213, 47,239,110,118,118,118, 86,108,108,236,213,136,136,136,161,163,
+ 70,141,194,189,123,247,166, 3,152, 85, 60,124, 51,125,212,168, 81,136,136,136, 64,108,108,236,213,236,236,236,172,111, 81,243,
+ 92, 46, 87,161, 82, 21,245,177,124, 62,223,168,138, 99,157,218, 13, 27,198,200, 15, 15, 47,216,254,248,241,154,195, 71,142,112,
+122,245,236, 73,104, 73, 18,148, 78,135,134,174,174, 68,159, 62,125, 4, 1,231,206, 89, 49,181,218,167, 75,125,125,131,247,143,
+ 31, 95,248, 92, 38,211,119,162,121,221,226, 33, 67, 0,168, 91,201,103,122, 67,165, 82,237,154, 57,109, 82,175,144, 7,143,106,
+213,174,229,100,122,235,118, 72, 36,207,152,203,168,239,210,128, 41,201,207,101,173, 95,179,210, 88,165, 82,233, 43, 90, 27, 91,
+ 91, 91,227,227,199,143,120,247,238, 29, 84, 42, 21,180, 90, 45, 40,185, 12,106, 73, 30,212,249,185, 32,148, 10,240,116, 58, 40,
+115, 50, 81,183,126, 61,224,175, 21,137, 85, 14, 69,149, 39,180, 74,254, 26,153,154,130, 35, 16,130,193,102,235,157, 28, 29, 64,
+155,246,237,219,159,187,120,241, 34,103,242,228,201, 29,238,220,185,179, 7, 64,178, 72, 36,234,185,122,245,234,231,123,246,236,
+225,205,152, 49,195,125,219,182,109, 19, 0, 28,172,136, 68,169, 84,158,187,118,237,218,216, 58,117,234,216, 69, 71, 71, 67,169,
+ 84,130,162, 40,244,235,215, 15, 40,154, 91, 3, 0,136,143,143, 87, 40,149,202,172,152,152,152,130,228,228,100, 13,244, 88, 37,
+184,118, 87,198,147,130,143, 15,134,217,217, 59, 61, 53, 50,174,235, 66, 75,195,135, 46, 28,225,180,117,251, 5,145,242,102, 66,
+ 66,225, 15,189,235,109,150, 21, 70,205, 49,119,150,238,189, 25,152,168,207, 68,248,210,213,133, 86, 86, 86, 96,177, 88, 96,179,
+217,224,112, 56, 32, 8, 2,243,230,205,195,161, 67,135,170, 26, 58,252, 68,100,153,152,152,196,174, 91,183,206,121,198,140, 25,
+ 28, 35, 35, 35, 72, 36, 18,156, 60,121, 18, 83,166, 76,193,209,163, 71,203,157,255,162,199,144,210,231,222,210, 5,227,199,143,
+135, 90,173,134,143,143, 15, 14, 31, 62,188, 64,167,211,133,212,224,150,126, 26, 25, 25,233, 26, 25, 25,105, 10, 96,208,232,209,
+163,143, 15, 31, 62, 28, 33, 33, 33,184,122,245,106,119, 20, 45,250, 80, 0,240, 7, 96, 91,252,183,178,251, 83, 96,103,103,183,
+143,162,168, 65, 54, 54, 54,145,110,110,110,205, 78,157, 58,101,158,149,149, 85,178,248, 1, 73, 73, 73, 56,118,236, 88,198,145,
+ 35, 71, 10,116, 58,157, 21,131,193,184,150,151,151,183,162, 18,193,118,100,251,246,237,147,138,135, 3,113,241,226, 69,250,151,
+ 95,126, 33, 86,175, 94, 13,137, 68, 2, 47, 47, 47, 28, 56,112, 96,190, 84, 42,109,249,203, 47,191, 76, 27, 57,114, 36,214,175,
+ 95, 15,153, 76,182,189,170,151,149, 74,196, 23, 1,160,243,246,237,219,235, 44, 88,176, 0, 23, 47, 94, 68,155, 54,109,140, 19,
+ 19, 19,247, 3,152, 90, 94,253,209, 52,141,196,196, 68,200,229,114, 60,122,244, 8,107,214,172,145,148, 17, 89,243,103,205,154,
+181, 97,254,252,249,216,180,105, 19, 29, 29, 29,157, 53,124,248,112,187, 67,135, 14, 49, 27, 54,108, 56, 95, 46,151,255,199,132,
+150,123, 67,203,205,237,218,116, 93,238,224,212, 16, 39, 79,157, 70,110,110,110,105,153,148,148, 11, 77,211, 40, 44, 44,196,199,
+143, 31, 97,102,106,130,173,219, 54,124, 55,123,250,164, 90, 40, 10,131,241,165,203,178,190,197,182,225,163, 39, 47,246, 25, 59,
+ 9,209,145, 97, 8, 56,126, 16, 49,209, 17,165,124,164, 86,131, 55,113, 47,241, 38,238, 37,236,236,235,160, 79,175,238,196,152,
+ 49, 99,250,141, 31, 59,218, 6,192,223, 22, 58,226, 31,236,205, 2,190,140,163,117,232, 19,161, 85,133,187,206,218,194,194, 34,
+246,236,217,179, 86, 30, 30, 30, 76,146, 36,113,243,214, 45,204,153,245, 61, 38,140,247,131, 6, 22, 32,213, 28, 80, 28, 35,189,
+ 44, 81, 40,228,160, 65, 67, 38,147, 33, 52, 52, 20, 52, 69, 34,224,208, 47,160,105,170, 84,104, 1, 52,212, 26, 13,156,106,187,
+ 99,223,225,141, 36,216,236,231,208,150, 31,186,166, 64,204,212,105, 73, 26,162,172, 20,164,100,196,192,204,164, 54, 88,236,218,
+ 16,231,201,193, 98,216, 67,171,140,135,174,248, 92,185, 44, 13, 10,205,215,213,159,174, 28,239, 41, 93,141,135,174, 66,161, 56,
+113,226,196,137,239,126,253,245, 87,110,255,254,253,221, 46, 92,184,208, 25, 0,250,247,239,239,102,106,106,138, 19, 39, 78,168,
+ 21, 10,197,137,111,232,241,233,209,190,125,123, 72, 36, 18, 36, 37, 37, 69, 86,122,109,106,181,149,208,214,150,153,117,239,158,
+ 54, 91, 34,169,213,163, 71, 15, 66, 75,146, 96, 16, 4,114,243,243,145,252,225, 3,204,205,205,137,216,248,120,225,238,185,115,
+ 47,187, 53,107,198, 42, 89,145,168, 15,174, 94,189,202, 71,209,188,172, 74, 63,171, 38,100, 89,153, 31, 39,249,250,250, 94, 62,
+113,226,164, 89,102, 86,230, 27, 30,151, 75, 10,133, 70,142,227,199,205,102,229,229,229,141, 5, 32,213,151, 76, 34,145, 32, 49,
+ 49, 17,198,198,198,224,176,217,160, 20,114,232,100, 82, 40,115,179,193,212,168,193,213,233, 96,201,231,161,150,157, 29,106,219,
+ 88,235,197,249,238,110, 80,233,196,247,178,195,133, 91,219, 55, 6, 87, 32, 4,215, 68,136,217,129,247,139,223, 70, 57,192,234,
+159,244,161,181,118,114,114,250,243,212,169, 83,156,236,236,108, 68, 68, 68, 68, 2,200, 7, 96, 2,128,138,139,139,187, 19, 19,
+ 19, 51,160,120,213, 93, 85,171,197,126,185,116,233, 82,111, 15, 15, 15,210,197,197, 69,144,149,149, 85, 75, 34,145, 80, 25, 25,
+ 25,159,184,132,130,130,130,120,133,133,133, 50,138,162, 46, 23,139,172, 42,227, 23, 45, 28,225,100, 20, 26,142,121,158,222,117,
+155,155, 90,183, 64, 46, 25,222,252,105,100,198,188,133, 35,156,118,109,191, 32, 82, 26, 19,170,227,132, 46,181, 22,203, 72,169,
+239, 36,102, 26, 40,154, 43, 21, 26, 26,138,228,228,100, 36, 38, 38,126, 34,168,166, 79,159,142,128,128, 0,189, 60, 90, 2,129,
+ 96,211,218,181,107,157, 23, 44, 88,192, 41, 35,138,224,235,235,139,252,252,124, 28, 62,124, 24,190,190,190,213,238,248, 63, 67,
+189, 30, 61,122,244,119,112,112,128, 88, 44,134,189,189, 61, 60, 60, 60, 6,134,132,132,184, 0, 72,170, 97,187,159,237,237,237,
+189, 97,221,186,117,208,106,181,152, 50,101, 10,222,190,125,123,238,237,219,183, 59,106,215,174, 61,111,217,178,101,118,118,118,
+118, 24, 53,106,148,128, 36,201, 97, 21,145, 88, 90, 90,250, 31, 60,120,112,108,255,254,253, 25, 26,141,166,219,221,187,119,241,
+225,195, 7,168,213,106,144, 36,137,247,239,223,195,215,215, 55,163,120,117,227,123, 61,236,154,188,106,213,170, 73,243,230,205,
+195,150, 45, 91,176,118,237,218,223,204,204,204,154,181,106,213,170,245,218,181,107,177,116,233, 82,212,169, 83, 7, 86, 86, 86,
+141, 86,175, 94,221,120,209,162, 69,216,181,107, 23,214,172, 89,243, 27,128, 99, 53, 41, 8,138,162,136,205,155, 55,183,220,190,
+125,187, 67,137,200, 98, 48, 24, 56,123,246, 44,194,195,195, 7, 38, 36, 36,148,119,206, 1,123,123,251,233, 14, 14, 14,220,219,
+183,111, 11,235,212,169, 3,146, 36,181,197, 34,107,119,237,218,181,231,188,127,255, 30,253,251,247, 71, 66, 66,194, 9, 0, 19,
+204,204,204,100,139, 22, 45,226, 27, 27, 27,155,201,229,242,255, 84,231, 13, 38,131,152,184,105,253, 82,188, 8,143,199,165, 75,
+ 28,188,120,241, 2,118,118,118,224,241,120,160,105, 26, 42,149, 10,217,217,217,208,106, 84,104,222,180, 30,126, 63,178, 25, 89,
+ 89,217, 0,131,168,112,202, 13,193, 32,198, 77,250,126, 40, 30, 62,186,133,253,251, 15, 66, 42,149, 85,240,242,109,132,134,110,
+141,225,228,104,139,212,180, 84, 16, 12, 88,255,157,215,250, 15, 31, 58, 44,125, 4, 65,159,240, 14,101, 97,110,110,190,227,204,
+153, 51, 86, 94, 94, 94, 76,153, 76, 6,138,162,208,213,195, 3,243, 22, 44,192,213, 83,167,224,218,193, 7,132, 90, 8,146,175,
+223,170, 7,165, 66,142, 38,173, 59, 99,228,168,209, 72, 73, 78,134,247,128,225, 80, 42,229,165,111, 24, 37, 30, 45,181, 90, 3,
+107,219, 90, 8, 10, 10, 98, 98,202,148, 87,216, 93,190, 83, 66,167,225, 70,189,121,175,236,146,167, 8, 71,232,139, 0,104, 84,
+ 26, 52,111,190, 26, 26,202, 10,182,206,211,161,213, 94, 65, 65,246,221,162, 97, 12, 43, 47,164,165,164,128,193,228,196,214,180,
+ 4, 41, 89,246, 87, 61,116,243,243,243,243, 19, 19, 19, 47,132,134,134,142, 27, 54,108, 24,130,130,130,166, 1,192,176, 97,195,
+ 16, 26, 26,138,196,196,196, 11,249,249,249,249,223,162,182, 29, 28, 28, 6,117,239,222,221,167, 93,187,118, 8, 12, 12, 4, 77,
+211, 15,245,186,177,217,108,154,193, 96,128,162, 40, 16, 0,196,121,121,120,251,246, 45,196, 57, 57,208,106,181,144, 73,165, 84,
+ 99, 55, 55, 41, 77, 81, 38,213,177,167,236, 10, 67,148,179,234,176,228,179, 26, 92,106,242,243,167,143, 83, 10,165, 82, 27, 11,
+115,139, 66, 46,151,171,147,228,229,229,191,138,141, 86,235,217, 57,148, 32, 46, 38, 38,166, 89,122,122, 58, 82, 82, 82, 64,202,
+ 10,193, 84,169,193, 80,201,209,179,115, 39, 24,131,134, 17, 40,176, 41, 45,216, 76, 54, 10,139, 86,231, 85, 57,220,161, 43,243,
+146, 80, 34,178, 8,130, 40, 26, 46, 20, 8,192, 21,154,124,226,225,210,167, 61,241,120,188, 83,231,207,159,119,112,114,114,194,
+250,245,235,225,236,236,220,200,209,209, 81,110,102,102,102,108,103,103,135, 38, 77,154,160,115,231,206,184,113,227, 6,244, 40,
+ 3,146,166,233, 62, 15, 31, 62, 92,252,248,241,227,145, 2,129,128,152, 59,119, 46,171, 95,191,126,224,241,120,144,203,229,144,
+ 72, 36, 56,125,250,116, 14, 69, 81, 37,139, 82,172,248,124,254, 49,130, 32,146,100, 50,217,130,207, 9,127,255,181,185, 99, 86,
+ 46, 53,133,150,242,135,122,122,215,109,222,195,187, 23,234,185,246, 64, 15,239, 20, 0,216,108,201,250,224,243,243, 42,243,203,
+230, 38,196,177,160,155,183,215,120,120,246, 88,181, 92,122,111,195,150, 67,121, 85,206,167, 35, 8, 2, 20, 69,125, 18, 59,232,
+243,239, 39, 76,152,128,179,103,207, 86, 89,142, 12, 6, 99,244,140, 25, 51, 56,159,121,158, 33, 18,137, 48, 96,192, 0, 12, 27,
+ 54,236, 19,161,101,109,109, 13,123,123,123,124,248,240, 1, 0,196,122,182,171,121,147, 39, 79, 38, 20, 10, 5,166, 78,157,138,
+195,135, 15,195,199,199,135, 8, 9, 9,153, 7, 96, 65,117, 27, 59,131,193,216,186,108,217,178,197,190,190,190,200,205,205,197,
+245,235,215,209,175, 95, 63,156, 61,123,214,230,250,245,235,155,188,188,188,192,100, 50, 17, 24, 24, 8,146, 36, 43,141,245,197,
+225,112, 6,245,239,223,159,145,154,154, 10, 14,135,131,182,109,219, 34, 45, 45, 13,114,185, 28, 34,145, 8,243,231,207,255, 40,
+ 22,139,187,235,123, 31,113, 56,156, 5,243,230,205,195,153, 51,103,224,231,231,119, 28,192,212,252,252,252,145,143, 31, 63, 62,
+ 51,120,240, 96,136, 68, 34, 92,190,124, 25,107,214,172, 33, 38, 76,152,128,189,123,247, 98,254,252,249,191, 21,123,157, 42,106,
+248,133, 89, 89, 89,102, 13, 26, 52, 64,102,102, 38,164, 82, 41, 46, 95,190,108,123,227,198, 13, 23, 39, 39, 39,211,196,196, 68,
+221, 79, 63,253,196, 93,176, 96, 1,118,236,216,129,136,136, 8, 4, 4, 4,160, 71,143, 30,100, 66, 66, 66,185, 94,178,226,144,
+ 13,151,105,154,190, 45, 16, 8, 80, 88, 88, 88,114,223, 45,241,243,243,243,245,247, 47,114,178,167,167,167, 99,226,196,137,227,
+131,131,131, 41, 47, 47, 47, 62,135,195,129, 82,169,148,253, 39,123,109, 74, 71, 1,160,224, 82, 75,136, 91, 87,143, 32, 44, 50,
+ 1, 97,145, 49,224,242,138, 38,193, 43, 20,114,180,110,222, 16, 29,218,182, 71,122,134, 8, 39, 2,142,192,210,218,169,210,231,
+ 8, 77,211,224,176,116,104,236,102,143, 83, 1, 7, 17,120, 61, 24, 1, 39, 78,151,206,121, 99,177,216,104,213,186, 3,218,182,
+245, 64, 66,226,123, 28, 57,178, 31, 54,182,181, 12,131,131, 53, 68,233,208, 97,217,191,159, 41,255, 30, 30, 30, 30, 76,169, 84,
+ 10,165, 82,137,143, 31, 63,226,195,135, 15, 48,183, 48, 71, 66,122, 18,186,243, 53,248, 72, 21, 32, 46, 50, 86, 71, 48,217, 17,
+ 85,253, 96,127,207, 86,128,103, 43,204,153,236, 83,201, 43, 43, 13,129,169,117,209,208, 13, 73,190,195,174, 93,100, 69, 66,139,
+212,105,239,220,186,125,183,253,228, 9,131,216, 65,119, 15, 67,171,166,160,208,154, 65,166, 84, 67,166, 97,131, 97,214, 15,200,
+ 9, 1,147,197, 67,199,150, 13,113,249,210, 13, 13, 77,106,131,245, 46, 32,187,102, 32, 51, 99,202, 8,173,172,207,198, 29, 44,
+245, 30, 58, 44,237,120,117,186,179, 39, 79,158, 28,210,169, 83, 39,190,151,151, 87,131,226,142, 83,115,242,228, 73,121,113, 48,
+204,234,226,147,104,240,246,246,246,173, 57, 28,142, 79,191,126,253, 90, 79,154, 52, 9,175, 94,189,194,137, 19, 39,222, 52,108,
+216,240, 94, 70, 70,197, 43,178,153, 92,174, 88,154,149,101, 46,116,113, 97, 89,152,152,164,223,184,126,189, 78,175,222,189,137,
+148,148, 20,136,197, 98, 40,149, 74, 68, 68, 70,210,108, 38, 51,141, 48, 53,101,196,135,135, 51,152, 92,174,184, 34,111, 99, 57,
+248, 80,197,170, 67,255,154,122,183,106, 57, 88, 52, 88,227, 55,179,158, 82,165,108, 86, 80, 80, 64,178,216,108,182,179,189,121,
+114,252,123,253,159,137, 42,149, 42,240,206,157, 59, 67,122,245,234,197,123, 19, 21, 1, 50, 63, 31,234,124, 9, 56,148, 14,150,
+173, 91,130,169, 81, 1,106, 45,156, 26,211, 80,230,241, 17,242, 44, 94,171, 82,169,170, 12,106, 88, 34,180, 24,159, 9, 3,174,
+ 80, 8,158,137, 41,120, 66,225,231,130,161,170, 55, 57,126,159, 62,125,122,118,236,216, 17, 52, 77,227,208,161, 67,208,104, 52,
+ 92,141, 70, 3,181, 90, 13,141, 70,131,130,130, 2, 4, 4, 4, 96,223,190,125,143, 1,252,166,199,229,147,198,198,198,131, 9,
+130,176,101,177, 88,114, 27, 27, 27,193,217,179,103, 75,195, 77,180,106,213, 10, 38, 38, 38, 28, 20, 7,133,180,181,181,101, 31,
+ 61,122,212,124,224,192,129, 15,202, 29,238,104,222,104,105, 61,210,194,211,200,184,174,139,169,117, 11,212,115,237, 1, 0,232,
+ 61, 96, 50,234, 53,172,141,130,156, 40, 23,165,226,195, 80, 14, 75, 98, 17,187, 75,244,202,184,127,179, 73,178,172,251,111, 81,
+254,242,254,114, 59, 10, 6,131, 81,225,112,172, 62, 34,171, 72,179, 48,108, 74,230,249, 0,128, 88, 44, 70, 70, 70, 6,226,226,
+226,224,238,238,142,220,220, 92, 56, 57, 57, 65,173, 86,163, 93,187,118, 80, 40, 20,216,190,125, 59, 30, 61,122,244, 24,192,124,
+ 61,126,195,216,213,213,117, 98,235,214,173,113,253,250,117,188,120,241, 66,116,235,214, 45, 39, 15, 15, 15,184,184,184, 76, 74,
+ 74, 74, 90, 89, 60,212,167, 47, 4, 30, 30, 30,115,125,125,125, 17, 19, 19,131,153, 51,103,138, 83, 83, 83, 47,159, 59,119,110,
+234,154, 53,107, 24,222,222,222,200,200,200,192,214,173, 91,117,143, 30, 61,218, 6, 96,125, 21,229,248, 58, 53, 53,213, 89,169,
+ 84, 34, 55, 55, 23, 36, 73, 66, 46,151,227,198,141, 27, 8, 8, 8,200, 44, 22, 89,239,244, 53,174,101,203,150, 77, 24, 12, 6,
+206,156, 57, 3, 0, 63,160, 40, 98,255,229,161, 67,135,138,126,250,233, 39,167, 21, 43, 86, 96,218,180,105,208,104, 52,216,178,
+101, 11, 86,172, 88,113,173, 88,100, 85,246, 16,253,213,222,222,126,250,204,153, 51, 27, 45, 90,180, 8,161,161,161,182, 47, 95,
+190,108, 27, 17, 17,129, 90,181,106, 65, 44, 22,179,172,172,172,176, 99,199, 14, 44, 92,184,240, 34,128,156, 39, 79,158,140, 78,
+ 76, 76,244, 7,176,181, 10,209,126,192,201,201,105, 58, 77,211,180, 92, 46,255,224,231,231,183,117,227,198,141, 88,184,112, 33,
+ 98, 99, 99,145,159,159, 15, 19, 19, 19, 98,217,178,101, 19,127,248,225, 7, 76,153, 50,133,150,201,100,251,254,211, 29, 53, 77,
+235, 32,151,196, 64,167,178, 64,171,230,238,104,213,172, 46,110,221, 13, 3, 0,244, 28,238, 1,185,172, 16,199,143, 31,194,187,
+119,111,193, 98,179, 97,110,105,175,143, 39, 16,234,130,215,200,211,100,160,151, 87, 91,244,243,238,142,223,126, 63, 11, 82,171,
+193,212,201, 99, 33,201,203,195,239,191, 31, 65, 66,226,123,176,216,108, 88, 89,255,253,129, 80, 43,211, 34,255,120,161,165,199,
+240, 19, 40,138,130, 72, 36,194,203,151, 47,145,148,148, 4, 62,159, 15, 5,169,163,246,223,121, 68, 17, 4, 39,141,162,233,199,
+ 52, 89, 26,165,248, 75, 14,157, 78, 84, 38, 98,173,153,133,133, 5, 87,165, 82,128, 36,181,101,122, 21, 2, 32, 0, 14, 11,112,
+112,172,135,212,148, 84, 90,169, 84,222,175,244, 13, 74,165,220,241,199,229,243,190,157,187,120, 88,247,235,185, 14,151,175,172,
+134,164,160, 0, 74, 13, 27, 50,165, 6,114, 37, 96,110,233,134,118,205, 91, 32, 61, 93,140,168, 23, 33, 82,150, 74,174,207, 68,
+209,183,187, 87, 77,118,157, 60,103, 41,140,235,116,129, 42,238, 50, 40,105,102,169, 71,203, 72,104, 1,203,218,141,145, 39, 83,
+225,124,112, 24, 80,141, 84, 47, 89, 89, 89,114, 38,147,121,210,215,215,119, 75, 88,216, 75,103, 0, 8, 11, 11, 75,203,200,200,
+ 88,158,149,149, 85, 93,159,116, 73, 52,120,194,200,200, 56,172, 97,195,134,233,109,219,182, 53, 27, 58,116, 40,172,173,173, 17,
+ 17, 17, 1,127,127,255,215, 26,141,102,105, 72, 72, 72,165, 67, 61,106,181, 90, 20,118,229,138,105,247,239,191, 55, 95, 58,112,
+224, 86, 95, 95,223, 29,235,215,175,103,187,186,186, 18, 90,141, 6,209,209,209,244,169,147, 39,181,251, 86,172,216,206, 21, 8,
+ 88,207,255,248,131, 77,170, 84,162,255,239, 70,236,228,228,228,233,209,173,107,227,109,191,238,130, 82, 33,197,179,208,107,144,
+ 72,178,113,240,208,165,198, 78, 78,180,167, 72, 36, 10,209, 87, 0, 31, 59,118,108,113,135,214,173, 91,215,175, 85, 11,209,201,
+ 73,224, 82, 58,112, 72, 18, 76,141, 10, 12, 82,137, 90,205,104, 16, 12, 19,100,124, 44,192,198, 51, 23, 98,244, 17,198,141,190,
+ 27,132,245,105,249, 32, 8, 2,191,116,106, 6,174,137, 16, 28,129, 16,179,255,188, 91, 42, 12, 2,215,175, 0, 87, 40, 68,131,
+ 14,122, 5,132,151,223,187,119,239,101,116,116,116,187,102,205,154, 97,241,226,197,248,240,225, 3, 40,138, 66,102,102,166, 50,
+ 35, 35, 67,148,157,157,253, 1, 69,241,127, 14, 87,209,137,149, 85, 29, 78, 33, 33, 33,165,195, 13,193,193,193,112,116,116,132,
+153,153, 25, 10, 10, 10, 48, 99,198, 12,243, 31,127,252, 17, 0,240,242,229, 75,148, 21, 40,159, 35, 58, 44,110, 91, 94, 33, 45,
+161,165,225, 67,115,201,240,230, 61,188, 83,209,123,192, 36,220, 14,252, 13,119,111,221,129, 37,235, 67, 18, 4,133, 55,114,146,
+114, 10,210,100,174, 7, 26,183,153,202,204,144,221, 58, 48,119,208, 27,166,131, 3,117,126,197,254,130,188,202,108,117,117,117,
+133,157,157, 93,233, 28, 45, 22,139,133, 41, 83,166,128,166,105,125, 69, 86,113, 95, 67,101, 43,149, 74, 59,196,253, 47,128, 0,
+ 0, 32, 0, 73, 68, 65, 84, 35, 35, 35,124,252,248, 17,239,223,191, 71, 66, 66, 66,105,232, 0,138,162,180, 75,150, 44, 97,207,
+157, 59, 23,251,247,239,199,253,251,247, 31, 3, 88, 7, 64,223,151,181,177,163, 70,141, 50, 81,171,213, 56,125,250, 52, 9, 96,
+192,249,243,231, 95,182,107,215,142,213,183,111, 95,147,189,123,247,142, 45,174, 35,189,133,150,169,169, 41, 71,163,209, 96,239,
+222,189, 72, 77, 77,245, 4, 16,247,252,249,243, 3,163, 70,141,218,215,172, 89,179,134, 49, 49, 49,111,165, 82,233,108, 0, 81,
+ 85,145,101,102,102, 78,110,219,182,237,121,138,162,234,244,234,213, 75,240,235,175,191,154,198,199,199,195,217,217, 25, 20, 69,
+ 69,163,154, 41,172,222,190,125, 27,151,145,145,209,184,123,247,238,184,113,227,198,102,157, 78,183, 9,192,150, 89,179,102, 57,
+ 37, 39, 39,163,117,235,214,176,180,180, 68,124,124,124, 97, 70, 70,198, 62, 20,165, 36,170,202,133,155, 8, 96,249,129, 3, 7,
+ 90, 28, 56,112,192,199,210,210,178, 99, 68, 68, 4, 30, 62,124,136,109,219,182,225,199, 31,127, 68,215,174, 93,177,120,241,226,
+ 28, 0, 62, 0,200,196,196, 68,189,226,230,149,120,182, 0,160, 77,155, 54,233,254,254,254,152, 58,117, 42,125,244,232,209,157,
+ 39, 79,158, 92, 48,118,236,216,210, 62,112,226,196,137,244,137, 19, 39, 38,162, 40, 13,211,127, 18, 90,141, 70, 13, 83,203,122,
+144,230,165, 32, 59, 53, 20,124, 19,123,120,247,104, 9,185, 66,141,171,127, 92, 68, 84,116, 36, 24, 12, 6,236,236,107,193,220,
+194, 26,111,222,188, 5, 42, 95,109,172,213,104, 52, 48,177,168, 11,105,126, 42,212, 89, 97, 48, 22,218, 98,210,247, 67, 33, 87,
+104,112,233,242, 69,196,196, 68,129,201,100,194,222,161, 22,204,204,139, 56, 9,186,242, 21,204, 6, 0, 40, 39,158, 86,149, 66,
+139,201,100,222,187,121,243,230,136, 14, 29, 58,176,222,189,123,135,119,239,138, 94,110, 36, 18, 9, 73, 64,119, 33, 43,250,143,
+ 49,149,156,222, 11,197,171, 51,202,230, 46, 20,154,152,136,226, 95,199,217, 73,114, 51, 17, 25,254, 8,239,222, 68, 35, 41, 33,
+ 14, 26,141, 18, 76, 6, 3, 12, 38, 3,117,235, 53,197,163,199,161,106, 37, 73,134, 86,196, 89,100, 71, 66,161,192,214,117,244,
+134,245, 43, 3, 23, 46, 93,107, 60,114,196,126, 68,197,191,130,148,180, 7, 77, 3,246, 86, 2,180,170,191, 12,162,244,108,156,
+249,109,175,156,210,104,198,125, 22, 67,235, 11, 78, 0,176,203, 65,147,125,135,126,155,114, 56,224,212,218,165,115,103,216, 13,
+ 30, 54, 14,220,220, 87,208,166,135,161, 94,187,126, 32,120,230,184, 30,116, 23, 33, 47, 95,101, 82, 58,122,173,157, 24, 71,223,
+ 84,193, 89, 22,121,121,121, 79, 62,126,204,112, 46, 19, 5,222,153,199, 51,170,106,117,220,231,156,159, 68,156,103, 50, 25,109,
+ 54,108,216,160,181,179,179,211,196,196,196, 96,255,254,253, 84, 88, 88, 88, 16,131,193,216,157,145,145,161,172,138,211, 70,171,
+141, 60,229,231,215,164,253,176, 97,244,152,185,115,229,224,241,230,109,253,229, 23,191,108,137,196,145,166, 40,216, 88, 90,166,
+109, 93,177,194,127,196,168, 81,146,216, 71,143,140, 67,175, 92, 49,230,146,100,152, 30,118,126, 11, 84,200, 41, 18,137, 66,238,
+223,127,136,227,135,127,133, 70,163, 66,134, 40, 25, 0,144, 35,206, 71, 21, 34,235,115, 78, 90, 46,151, 15,251,225,199, 31,159,
+254,176,112,129,125,183,158,189,144, 18, 25, 1, 77,110, 54, 8, 45, 9, 54,193,130, 44,139,143,172, 76, 41,150,159, 56,151, 37,
+149,203,135,149,211, 73,148,107,103,137,199,138,103,106, 2,142, 64, 8,174,208,228, 19, 47,150,145,169, 41,184, 2, 33, 88, 92,
+110,121, 19,184,191,224,148, 74,165,195, 71,140, 24, 17,245,252,249,115,139,169, 83,167,162,115,231,206,225, 10,133,194, 11, 64,
+ 97, 77,203,147,162, 40, 81,183,110,221, 24, 4, 65, 8,199,141, 27,199,203,206,206, 46,141,172, 46,149, 74,113,227,198, 13,184,
+187, 23,173,234,143,141,141, 69,211,166, 77, 43,228,156,182, 60, 70, 4, 96,253,194, 17, 78, 91,159, 70,102,204, 3,176,185, 94,
+195, 90,184,123,235, 14, 30,222, 13,245,235,216,140,218,245,221,184,118, 63,241,189, 70, 45,109,220,102, 42, 83,104,234,128,223,
+ 47, 93,100,198,133, 29,217, 40,151, 71, 55,192,254,203, 75, 42,178,147, 32, 8,208, 52,253, 69, 40, 7, 38,147,137,147, 39, 79,
+ 86,247,218,207, 29, 62,124,120,214,204,153, 51, 57, 25, 25, 25,120,253,250, 53,100, 50, 25,140,140,140,112,235,214, 45, 18,192,
+222,147, 39, 79,222, 58,121,242,100, 95, 20,173, 38, 10,174, 78,251, 20, 8, 4,190,222,222,222,120,253,250, 53, 94,188,120,113,
+ 17, 64, 84,120,120,248,197,119,239,222,141,238,218,181, 43,126,251,237, 55, 95,133, 66,113,184, 58,156, 20, 69,149,141,153, 84,
+146,241, 33, 82, 42,149,118, 12, 13, 13,173,110,189,103,136,197,226, 46,197,194, 58,213,206,206,206, 52, 50, 50, 18,181,107,215,
+134, 70,163,233, 80,221,182,148,159,159,255,235,238,221,187,143, 78,158, 60, 25, 63,253,244,211,184,115,231,206,141,251,238,187,
+239,208,191,127,127, 28, 59,118, 12, 81, 81, 81,155,161, 95, 90,177,242,174, 61, 10, 64,148,157,157,221,156, 90,181,106, 97,219,
+182,109,136,142,142,246, 95,191,126,253,138,168,168, 40,184,187,187,243,226,226,226,200,154, 60, 67, 0,192,212,212,212, 84,171,
+213,226,202,149, 43,207, 0, 44, 28, 55,110,156,237,142, 29, 59,124,132, 66, 33,114,115,115, 21, 49, 49, 49, 99, 1,252,241,159,
+126,214,209, 4,177,106,234,180,121, 7,166, 77, 29,107,212,182, 77, 43,200, 11,210,160,144,102, 66, 94,248, 17,187, 15, 7,129,
+ 32, 24,176,177,113,128,173,189, 51,146,147, 83,240,248,218,117,181, 76,174,216,193,213, 82,155, 43,231,156, 91,196,217,186,136,
+ 83, 46,203,130, 66,154, 85,202,105,107,235, 88,204,153,140, 71,161,215,149, 10,153,236, 87, 53, 77,252,252, 55, 95,251, 63, 25,
+213,203,117, 88, 22, 18,137,100,254,140, 25, 51,188,150, 47, 95,110, 69,146, 36,211,210,210, 18,201,201,201,228,133, 11, 23,114,
+165, 82,233,252,154, 88,195, 98,179,163, 92,221,220,189, 6, 15, 30, 76, 14, 26, 52,144, 51,126,114, 95,150,141,173, 45,242,243,
+196,120,243, 58, 2,241,175,194,224,234,222, 18,107,214,111, 7,204,205,171, 76, 36, 89,156, 86,103,192,186, 31,150,156,237,226,
+217,199,212,189,105, 75, 78,171, 6,102,208,104, 73,164,165,165,225,143, 43,145,154,152,151, 15, 11, 40, 82, 61, 90,158,163, 95,
+ 10,158, 16,128,132, 24, 7,155,217,106, 78,110,218,186,123,241,222,131,199,151, 46,159, 55, 85,208,213,163, 55,162,239,252,134,
+139,129,103,101, 74,149,122, 43,135,137, 95, 98,196,144,191,169,102, 25, 40,149, 74,205,231,253,169, 82,169,212,124,109, 77, 31,
+ 59,118, 12,153,153,153,234, 15, 31, 62,220, 36, 73,242, 92, 37,201,158,191,192,110, 64, 61, 84,165,186,243,131,135, 71,223, 31,
+110,221, 50,154,184,108,153,122,220,248,241, 75,160, 82,105,192,229,210, 44,129,128, 1, 30,143, 29,251,232,145,241,206, 89,179,
+ 44, 9,181,250,246,241, 74,194, 6,148,131,111,190,234,176,196,163,213,189,123, 87, 76,156,186, 16,138, 50, 30,173, 39, 47,222,
+ 64,165,129,222, 30,173, 98,164,124, 72, 77,237, 56,111,213, 15,151, 70,123,247,108,220,172, 78, 93,158,141, 75, 93, 8,237,237,
+ 33,206,206,198,163, 23,241,218,245,103, 47,197, 20,139, 44,189,226,202, 80, 20, 85, 52,201, 29, 64,207,249,203, 65, 48,153, 64,
+113, 24,135,146,149, 67, 46,237, 58,131, 96,177,160,163, 41,168, 84, 42,125, 38,253,165,189,127,255,126,248,184,113,227,130, 3,
+ 3, 3, 25,222,222,222,173, 46, 95,190, 76,125, 77,219, 81, 40, 20, 29, 1,192,200,200, 40,201,220,220,220,105,242,228,201,208,
+106,181,144,203,229,200,207,207, 71, 90, 90, 90,222,228,201,147, 53, 0, 96,108,108,204, 29, 49, 98,132,105, 85,156,219, 47,136,
+148, 11, 71, 56,237,178,100,125,240, 41,200,137,114,177,100,125, 72,234,216,140,218,181,253,130, 72,105,234, 40,219,144,243, 33,
+228, 77,134,236,214,129,223, 47, 93,100, 78, 24, 58, 92,231, 44,124,235,103,100, 75, 95,168,138,151, 32,136, 47,130,147,234, 41,
+178, 62, 65, 97, 97,225,138,213,171, 87,247,151, 72, 36,206,125,251,246,229, 52,110,220, 24, 79,159, 62, 69, 96, 96, 32,249,228,
+201,147, 84,153, 76,182, 18,128, 18, 64, 80, 77,202,212,205,205,205,133,197, 98,149, 12,165,237, 41,254,120,207,229,203,151, 71,
+ 79,157, 58, 21,117,235,214,109, 18, 23, 23,199, 67, 53,238, 35,154,166, 75, 71, 25,190, 37, 8,130, 72,216,185,115,167,147,189,
+189, 61,113,227,198, 13,146,201,100,214,196,115,115,236,200,145, 35, 29,180, 90,237,180,233,211,167,195,211,211, 19, 36, 73,226,
+196,137, 19, 56,114,228,136,190, 34,171, 82,188,121,243, 38, 44, 53, 53,181,219,146, 37, 75,176,109,219,182, 21, 75,150, 44, 65,
+106,106, 42,222,188,121, 19,241, 53,188, 5, 5, 5,138,148,148, 20,126,167, 78,157,218,198,196,196,196,120,121,121, 53,157, 58,
+117, 42, 54,111,222, 76,223,191,127,127, 4,128, 27,255, 31,189,119,252,187,220, 0,182,142,117,107,253,134, 95,127,108, 80,223,
+101,230,148, 73,163,152,110,174, 77, 33,203, 79,131,149,181, 29,156,107,213, 67,118, 86, 14,110,222,188,161,203,201,201, 59,166,
+ 99, 16,235,222,189,203, 77,255, 26, 78, 39,231,122,200,202,202,194,245,235,215,117,121,146,130, 67,208, 50,214,199, 37,231,101,
+194, 0,125, 60, 89,211, 81, 73,148,248,202, 96,109, 97, 97,113,218,212,212, 52,211,212,212, 52,211,194,194,226, 52,160,215,234,
+131, 94,101,158, 14,204, 79,182, 17, 35,140, 96,100,212, 17, 44,214, 34,115, 11,139, 27,102,102,102,226,238,221,187,171, 15, 28,
+ 56,160,140,139,139,165, 68,162, 84,218,204,204, 44,191,244,248,242, 56, 63,131,133, 69,125, 19,129, 67,211, 31,205,156, 91, 61,
+ 18, 58, 52, 41, 20, 58, 52, 41, 52,115,110,249, 88,224,208,100,173,133, 69,125, 19,189,236,172, 0,245,108, 97,227,106,141,189,
+238, 54,132,194,213, 26,123,235,217,194, 70,239,107,175,124,216, 79, 71, 16,208,161,104, 25, 54,106,192, 89,194, 65, 49,153,204,
+227,206,206,206, 14,168, 94,192,186, 47, 56,199, 3,117,199,243,120,211,206,251,249, 77, 76,186,127,127, 92, 65, 98,226,152,252,
+132,132, 81, 17,103,207,142,222, 51,122,244,248, 49, 60,222,244, 17, 64,125,125, 57, 29, 28, 28,252,195,194,194, 2,245,221,202,
+ 8, 47,189,203,179,126, 61,167, 91,222,189, 58,208,190, 51,134,209,190, 51,134,209,222,189, 58,208,245,235, 57,221,250,138, 58,
+ 34,152, 76,166, 15,159,207, 63, 45,224,243,163, 5,124,126, 52,159,207, 63,205,100, 50,125, 80,249, 28,170, 79, 56,173,172,172,
+ 94,218,217,217,101, 86,103,179,182,182, 14,175,134,157, 99, 92, 92, 92, 82, 25, 12,198,246,106,222,211,149,113,186, 26, 27, 27,
+ 39, 8, 4,130,180,178,155,177,177,113,217,192, 80, 86,124, 62,255,170, 64, 32,216,161, 15,231,207,171,154,254,248, 56,104, 78,
+212,207,171,154,254,248,249,119,115,135, 88, 76,126, 26,188, 78, 60,119,136,197,100,125,236,180,181,181,189,111,107,107,155, 97,
+107,107,155, 97,103,103, 87,233,102,109,109,253, 82, 15, 78, 35, 19, 19,147, 29, 38, 38, 38,153, 2,129, 64, 39, 20, 10, 51, 5,
+ 2,193,118,148, 9,109, 81,211,242,100, 48, 24,155,155, 52,105,162,100, 50,153, 71, 63,251,106, 91,131, 6, 13,148, 44, 22,107,
+107, 53, 57, 77,187,118,237,170,139,140,140,164, 61, 61, 61,105, 0, 22,223,176,222,237, 45, 44, 44,110,152,154,154,166,152,152,
+152,236, 6, 32,168, 33, 39, 1,192,199,201,201, 41,162, 71,143, 30,114, 39, 39,167, 80, 0,131,191,161,157,253,135, 12, 25, 66,
+165,164,164,208, 52, 77,211, 41, 41, 41,244,144, 33, 67, 40, 20, 5,138,252,154,103,242,170, 89,179,102,209, 79,158, 60,161,159,
+ 60,121, 66,135,134,134,210,253,251,247,167, 0,124,255,149,207,121,124,171,107,111, 92,207,186,126,163,134, 22,231,198, 14,247,
+160,130,254,216, 78,175, 89, 57,147,238,237,217,148,118,111, 96,113,201,213,213,202,245, 91,112,254,184,114, 6,221,171, 91, 19,
+170,113,125,139,179,141,235, 89,215,255, 15, 95,251,191,209,171,133,191,123,194,217, 95,174,197, 79,197, 82,249,112,116,116,132,
+ 88,220,193,136,197,242,224,241,120, 94, 12, 38,243, 94,110,118,246,130,226,215, 45,221,127,202, 85, 91,105,135, 94, 31,220, 74,
+ 82, 18,212,132,243,147,137,236, 53,228,172, 14,135, 94,156, 21, 37,149,166, 84,170,116, 43,146,124,185, 27,149,150,193, 39,156,
+ 78, 78, 78,211, 40,138,114,209,215, 32, 6,131,145, 36, 18,137, 14,215,164, 60, 27, 54,108, 72, 23, 15,111, 19,223,178,222,255,
+142,182,244,191,196,249,251,175,205, 29,221,155, 55, 90, 26, 29, 22,183,173,120, 88,177, 20,107,231, 90,152,120,244,232,190,250,
+209,221,251, 63,173,221, 45, 41,252,127,190,118, 6,244,156,211,246, 13, 56, 75,130,132, 86,139,147,205,102, 31,104,223,190,253,
+180,167, 79,159, 30,213,233,116,211,255, 71,219,103,127, 38,147,185,196,205,205,173,213,155, 55,111, 34,116, 58,221, 54,148, 19,
+ 40,178, 6,118,174,116,113,113,153,205,225,112,120, 82,169, 84,146,158,158,190, 26,192,185,255,182,242,108,220,208,178, 45, 77,
+151, 6,221,222,248,250,125,238,243,111,198, 73, 83, 58,138,102,110,120,147, 40, 14,255,127,168,247,127,155,200, 58,244,159,248,
+225, 94, 6, 78, 3,167,129,211,192,105,224,252,230,156,198,134,242, 52,112,254, 11, 57,255,149, 96, 25,138,192, 0, 3, 12, 48,
+224, 31, 7,133,161, 8, 12, 48,224,191, 14,101,189, 90,165,222, 44,162, 18, 85, 90, 29,151, 96, 77,148,237, 29, 3,167,129,211,
+192,105,224, 52,112, 26, 56, 13,156,255,115,156,255, 86,145,117,168,146,253,191, 13, 6,183,170,129,211,192,105,224, 52,112, 26,
+ 56, 13,156, 6,206,255, 5,161, 85,238,190, 97,232,208,128,191, 29,187,134,194, 9, 0,230, 93,134,232,239, 56,222, 0, 3, 12,
+ 48,192, 0, 3,254,159,113, 8, 21, 12, 29,254, 55, 8, 45, 71, 0, 29, 81,148,248, 54, 30,192, 67, 0,146,175,224,179, 6, 48,
+138, 32,136,145, 0, 64,211,244,121, 20,173, 26,201,209,231,100, 35, 35,163, 76,165, 82,105, 91,252,127,150, 82,169, 44,155,203,
+128,192,151,171,217,232, 50, 91,185,112,113,113,201, 84,169, 84,182,122,252,124, 62, 77,211, 81, 12, 6, 35, 90, 40, 20,222,125,
+243,230, 77, 96,117, 46,220,203,203,107, 34,147,201,220, 8, 0, 58,157,110,213,189,123,247,142,255,141,245,214,161,150,163,253,
+111, 26,173,134,204,204,206, 93,141, 47, 3,249, 1, 0,246, 14,128, 63, 65, 98,105,241,255, 91,231, 4, 86, 30, 71,167,186,199,
+ 87,130,182,108, 54,219,215,206,206,174, 95, 90, 90,218, 75, 0,203,128,170,163, 26,215,170, 85,235,123, 22,139, 53, 78,167,211,
+213,103, 50,153, 9, 36, 73,158, 76, 77, 77, 13, 48, 60, 67, 12, 48,192, 0, 3, 12,208, 67,108,125,129,106, 9, 45,119, 43,216,
+211,128, 15, 8,244, 6,141,219, 4,112, 38, 94,140,143,250,158,255,157, 59,180, 90,178,232, 55, 57, 12,232,110,188,103, 28,234,
+215,175,159,243,220,185,115,209,185,115,103, 60,125,250,180,211,177, 99,199, 38,159, 59,119, 46,138,162,168,123, 0,158, 2,122,
+133, 82, 16,160, 40, 78,203,216,126,253,250,245,218,184,113, 35,179,105,211,166, 80, 40, 20,184,127,255,190,199,214,173, 91,119,
+ 60,126,252,248, 14,128, 83,197,130,160,194, 4,120, 74,165,210,182, 36, 25, 39, 65, 16,182, 35, 70,140,120, 94, 86, 92, 21,231,
+ 87, 35,104,154,126, 66, 16, 68,168, 78,167,123,122,225,194,133, 84,119,160,195, 12, 23,206,133, 5, 73, 26,231,207, 57, 85, 42,
+149,237,149,159, 55,129,197,227, 65, 85, 88,128, 78,147,254, 18,189,183,127, 92, 10,130, 34,193, 4, 45,241,218,176, 35, 10, 64,
+116,122,122,122,148,167,167,103, 82,117,107,152,201,100,110,188,121,243,166, 3, 77,211,240,246,246,222, 8,224,239, 18, 90,188,
+142,109, 91,222,187,122,241,180,145, 52, 55, 19,125, 7,143, 62,249, 54, 53,107, 34,128,139,159,136,166,126,176, 35, 8, 44,157,
+181,233, 20, 19, 0,246,173, 28,187,108,123, 31,236, 90, 24,132,143, 0,188,138,197, 15, 0,252, 12,224,222,222,126,176, 3,176,
+124,214,166, 83, 4, 0,236, 95, 57,118,233,222,126,216, 57,231, 70,181,195, 86,204,158, 56,113,226,174,141, 27, 55, 50, 29, 28,
+ 28, 32, 18,137,250, 54,105,210,196,173,160,160,160, 9, 42,153, 68, 92,183,110,221,179, 93,123, 12,172, 55,108,164, 15,223,198,
+218, 2,233, 25, 57,166,103, 79, 31,157,193,124,114,191,223,135, 15, 31, 70, 27,158, 33, 6, 24, 96,128, 1, 6, 84,128,154, 71,
+134,111,237, 0, 99,153, 6, 67, 88, 76,226,251, 46,109,155,244, 28,243, 93, 87, 70,147,198, 13,241, 42, 54,174,207, 31,119,159,
+109,101,132,198, 6,147, 58, 58, 64,192,193,149,240,140,202, 87,194,104, 73,176,130,174,156, 42,234, 9, 39,143,101, 62,127,254,
+188, 97,155, 54,109, 74, 83,195,244,236,217, 19, 61,123,246, 36,246,237,219,215, 50, 40, 40,168,229,145, 35, 71, 52,193,193,193,
+191,161,242,248, 40,190, 13, 26, 52,216,186,107,215, 46,158,167,167, 39,120, 60, 94,233, 23, 66,161, 16, 3, 7, 14,196,192,129,
+ 3,153,233,233,233,222, 87,175, 94,245,254,249,231,159,213,201,201,201, 75,240, 87,148,230, 74,177,122,245,234,182,229,124,124,
+147, 32,136,247, 36, 73, 70,180,108,217, 50,213, 13,104, 56,227,187,206,183,103,119,113, 21, 44, 88,113,172, 92, 30, 22,151,139,
+223, 39, 22,245,213,101,133, 86,210,221, 27, 16,154,154,136,249, 38, 38, 81, 0,162, 1, 68,209, 52, 29,157,144,144, 16,215, 8,
+104,217,209,130,241,219, 81, 9,213,162, 26, 98, 11,169,169,169, 48, 51, 51, 51,246,244,244,204, 32, 8, 98,237,253,251,247,191,
+245,132,188, 14,107,151,206,230, 72, 62, 68,225,227,235, 39, 88, 52,210,131,191, 96,247,159, 63, 41,213,218,139,149,157, 68, 16,
+ 12,198,207,161,148, 31,138,146,241,174, 22,139,197,158, 0, 96,101,101,197, 5,112,111,251, 51,124,183,176, 11,241, 53,177,221,
+ 56, 76, 38,115,239,177, 99,199,166,126,255,253,247, 69,169, 35, 30, 61,130, 80, 40,196,250,245,235,235, 46, 94,188,216,159, 36,
+201,249, 21,121,178,186,246, 24, 88,111,231,182,159,154, 20,230,230,171, 14,238, 61,247,194,177,153, 59, 99,150,239, 98,147,157,
+ 26,149,189, 78,167,251,222,224,217, 50,192, 0, 3, 12, 48,160, 58,222,172, 42,133,150,155, 53,142,183,110,230, 58,106, 76,127,
+ 15, 94,243,102, 77,193,225,253, 21,186,165, 77,219,182,104,211,182, 45,195, 79, 90,216,251,249,139,176,222, 23,130,158,170,228,
+218,228,115,111,114, 48, 81, 95,171, 74,146,210,110, 28,108,215, 67,150,151,101, 4, 0, 2,115, 91,229,202, 43, 31,239,118,233,
+210, 5,206,206,206,156,224,224,224, 41, 85, 8,173,149,241,241,241, 60, 38,179,242,120,168,142,142,142, 24, 49, 98, 4,220,221,
+221,185,221,187,119, 95, 89,145,208, 50, 50, 50,202, 34, 8,194, 22, 0, 44, 45, 45,117,107,215,174,141,160,139, 0, 0, 52, 77,
+211, 79, 24, 12,198, 83,138,162,158,253,249,231,159,105, 77, 0,219,190,109,220, 31,206, 30, 63,130, 79, 95,216, 81,161, 72, 80,
+ 22, 20,148,251, 57, 95, 40,200, 54, 22, 8,162,120,124,163,104, 20,229,242,138,118,118,118,142,107, 2, 56,183,119,119, 9,218,
+183,112,172,201,209,233, 63, 85, 89,150,173, 91,183,118,107,209,162,133,145, 78,167,131, 76, 38,195,254,253,251,205,140,141,141,
+205,250,245,235,183,166,108, 3,104, 12, 52, 31,238,200,156,190, 46, 93, 55,167, 6, 13,201,188,107,167,182, 31, 70, 12,236,103,
+218,182, 99, 87,188,189,119, 2,185,185,133,200,207,147,130,162,168, 47,226,250,204,185,129,204,189, 3,176,117,223,138,177,203,
+ 9, 6,131,104, 57,116, 25, 6,217,231,207, 59,112,224, 64, 44, 0, 54,151,203, 45,219, 14, 29,141,157,154,109,109,216,167, 43,
+246,175, 26, 15,154,162,104, 0, 91,171,225,205,178, 53, 49, 49,249, 35, 40, 40,168, 67,187,118,237,240,244,233, 83, 36, 38, 38,
+ 98,246,236,217,234, 57,115,230,112, 38, 76,152, 64, 44, 90,180,104,238,207, 63,255,124, 1,192,227, 47,110, 4, 22,107,220,224,
+ 97,163,185,210,188, 2,165, 90,165, 81, 91, 90,155, 83, 42,153, 82,158, 35, 41, 80,142, 30, 59, 77, 29, 27,254,108, 28,128, 47,
+132,214, 87,150,167, 1, 6, 24, 96,128, 1,122,128,166,233,118, 0,108, 0,100, 19, 4,241,162,236,126,241, 33, 37,217, 90, 62,
+223,207, 65,209,168,148, 85, 25,186, 28, 20, 77,247,177, 1,160, 3,240,156, 32, 8,201, 87,154, 88,249, 42,195,192,192, 64,186,
+236,223, 50, 66,139,166,105,154,214,138,223,211,170, 55, 55,104,249,139,195, 95,108,138,216,139,116,198,243,115,244,179, 83, 63,
+210,110,214,149,103, 97,255,206, 29,218,177, 45, 64,207,106, 7,122,126,119,115,229,243,231,207,131, 41,138, 10,244,235, 10,154,
+126,117,138,166, 95,157,162, 23,118, 2,125,225,194,133,155,254,254,254,129, 1, 1, 1,129, 0,170,154,167,148, 89,248, 34,148,
+126,102, 11,186, 34,196,199,199,211, 7, 14, 28,160, 87,172, 88, 65, 31, 61,122,148, 70, 21, 17,212,189,189,189,239,199,196,196,
+208, 19, 38, 76,136, 64, 37,129, 1, 27, 3,130,113,117,237, 95,171,206,238,208,168,191,111, 78, 75,186, 25,149,123,253, 14, 14,
+ 14,159,216,179,217,213,158,222,211,222,149, 62,222,187,205, 71,154,166,111,210, 52,189,153,166,233,209, 52, 77,187, 3, 64,107,
+192,116,176,131,213, 59,229,185,157, 10,245,244,142, 85,230,189,107,221,186,181,219,146, 37, 75,114,213,106, 53,157,148,148, 68,
+ 31, 60,120,144,190,125,251, 54,125,229,202, 21,218,195,195, 35,189,140,189,118,147,221,235,100,170,143,172, 83,213,164, 21,177,
+153,204, 61, 47,110, 95,160,223, 61, 60, 79, 63, 63,227, 79,159,252, 97, 12, 61,119,112, 7,141,169, 49, 79, 9,160, 71, 69,231,
+205,233,130,134,238,117,109,222, 36, 39, 39,211, 26,141,134,158, 52,105, 18,237,237,237, 77,247,233,211,135,238,213,171, 23,221,
+179,103, 79,186, 71,143, 30,244,221,187,119,233,244,244,116,186, 87,215, 54,178, 1,141,209,182, 26,166, 53,171, 83,167,206,199,
+164,164, 36, 90,163,209,208,193,193,193,244,137, 19, 39,232,224,224, 96,218,207,207,143, 6,112,124,214,172, 89, 10,137, 68, 66,
+123,123,123,167,161,156,168,241,117,234,212,137,139,121,147,154,186,125,211,225,187,191,239, 57,125,247,210,133,219,119,255,184,
+245,252,218,149, 91, 47,206, 61,139, 76,184, 82,167, 78,157,184,114,234,255,171,202,211, 0, 3, 12, 48,192,128,170,181, 72,177,
+208,234, 95,236,236,232, 79,211,116,175,207,246,251, 23, 11,167, 47,246,253,252,252, 86,148,221, 47, 57,198,207,207,111, 5, 0,
+186, 83,167, 78,167,105,154,110,248, 13,204,159, 94,206, 86,181, 71,171, 4,100,218,115,112, 92,251,129,173,211, 66,155, 19, 15,
+ 42, 47, 25, 16,216, 67, 65, 8, 33,206, 72,198,235,135, 23, 43, 79, 36, 81,140,235,241, 96, 3, 8,142,139,139,195,235,215,175,
+145,154,154, 10, 62,159,255,197,113,143, 30, 61,130,177,177, 49, 28, 28, 28,244, 83,186,234, 79,251,185,168, 54,117, 32,236,228,
+137,156, 49, 51, 17, 28, 28,140,172,172, 44,112, 56, 28,112,185, 92,144, 36, 89, 37, 31,131, 81,148,241,183,196,139, 85,222, 49,
+158, 0,139,103, 41,188,186,111,205,124, 23,198,147, 64,182, 34,229, 29,210,149, 58,253, 60,121, 66, 1,248, 2,126,134,177, 49,
+191,116,184, 16, 64, 52, 65, 16,111, 91, 3,108,129,208,232,234,111, 27, 22,217, 51,195,131,141, 20,239,162,202,229,232,213,171,
+215, 12, 0,107,104,154,206,107,209,162,133,221,198,141, 27, 45, 68, 34, 17, 94,189,122,133,115,231,206,101,147, 69, 23, 74,208,
+ 52,189, 14, 0, 58, 2, 70,230, 54,230,183,246,252, 56,223, 4,247,206,114,107,210,138,204, 26, 15,188, 54,124,194,172, 57,187,
+230, 15,132,172, 80,129, 83,183,195,113, 51,236,253, 32, 0,143, 80,201,188,183,189,143,241, 14,200,238, 57,108,216,176,136, 7,
+ 15, 30, 88, 31, 57,114, 4, 36, 73,150,187, 29, 57,114, 4,119, 30,134,205, 3,240, 82, 79,179, 28, 93, 92, 92,238, 60,123,246,
+204,134,207,231,227,246,237,219,200,203,203, 43,245,100, 77,156, 56,145,200,203,203,243,217,191,127,255,240, 15, 31, 62,108,123,
+248,240,161, 24, 69,185, 32, 63,105, 8, 76, 38,243, 61, 73,106, 26, 57, 52,110,200, 26, 57,176,107, 87,169, 56, 10, 66,171, 22,
+120, 18,249,254,106,158, 68,172, 96, 50,153,239,203, 30,255, 45,202,211, 0, 3, 12, 48,192,128,234,129, 32,136, 64,154,166, 7,
+ 16, 4, 17,248,249,103,159,255, 95,114,156,191,191,127,233,126,201, 57,155, 55,111,222, 84,102, 95,254,141,204,171,116, 50,124,
+247, 98, 5,217,189,188,131, 84,175, 46, 65,245,250, 15,112,234,116, 1,215,125, 16,152,117, 60,144, 18,117, 15,145, 55,182, 35,
+ 45,246, 17,104, 74, 7, 7,183,246,250, 26,162,108,212,168, 17,148,202,162,169, 89, 42,149, 10, 28,129,133,114,209,244,177, 70,
+ 0, 64,177,140, 84,101, 20,172, 94,132, 38, 93,188,208, 62,147,198,115,187, 34, 71, 69,251,204,162,243, 54, 76,154, 4, 14,135,
+ 3, 14,135, 3,162,120,234,143, 62, 66,139, 40, 62,152, 42, 26,190, 42,207, 8, 66,206, 99,159, 58,179,198,183, 61,239, 67, 52,
+ 87, 21,243, 4,233, 42,138,190,154,169,187,166,143,189,124, 1, 95,100,204,231, 71, 27, 11, 5,165, 66,139, 32,136,247, 0, 64,
+179,217, 1, 39,214,249,182, 16,100, 38, 8,148, 47,130,145,161,164, 52, 21,208,172,187,113,227,134, 45,139,197,178,215,233,116,
+ 72, 73, 73, 65,108,108, 44,118,238,220,153, 89, 88, 88,216, 61, 60, 60,252, 77, 89,237,168, 51,230,158, 11, 88, 63,191, 30, 43,
+ 42,196, 72,245, 62,166,218,173,199,186,217, 16,239, 65,221, 91, 94,155, 49,126, 21,134,124,215, 7, 19,186, 55,161,147,210,115,
+149, 0,110, 23,187, 94,171,130, 40, 60, 60,188,119,183,110,221, 78,182,106,213,170, 49, 77,211,104,222,188, 57,124,124,124, 16,
+ 16, 16,128,200,200, 72, 20, 20, 20,104,130,130,130,118, 0, 56,166,167, 89,124, 11, 11,139,155,119,239,222,181,225,243,249, 8,
+ 10, 10,130, 66,161,128,131,131, 3,230,204,153,195,221,188,121,243,239, 5, 5, 5, 35,253,253,253,141,146,146,146,246,220,186,
+117,171, 46,138,242,206,125,209, 8,212,106,245,161, 83, 1,199,119,205,241,157,235,116,247,233,171, 96,149,180,208,172, 78,157,
+212, 2, 27, 11,161,201,142, 45,235,106,171,213,234, 25,229,151,231,253, 26,149,167, 1, 6, 24, 96,128, 1, 95,160, 82, 45, 82,
+ 86, 60,125, 46,182,170, 35,210, 0, 40,252,252,252, 86, 18, 4, 17,232,231,231,183,210,223,223, 95, 1, 32,253,239, 16, 89,165,
+ 66,107,192,128, 1, 33,129,129,129, 24, 48, 96, 64, 72,133, 20,148, 14,154,164, 7,208, 36, 61,128,113,167,121,248,211,127,204,
+103, 23, 79,213,216,186,129,235,111,223, 85,169, 84,172,227,199,143,151,206,219, 2, 0,157, 78,247,205,107,177, 58, 66,171, 88,
+232,125, 97,132, 11, 79, 24,114,104,225,200,142, 86, 58, 57, 91,253,232, 42, 68, 42,138,220,246, 78, 35,127,145, 71,255, 92, 17,
+231,149, 5, 51,144,250,240, 14,248, 66, 97,234,212, 7,209,165, 94,172, 98,145,149, 8, 0,117,121, 38,193, 7,230, 15,241,176,
+231,128,163,190,118, 30,233, 42, 74,117,224,131,246, 88, 5,141, 13, 52, 77, 35, 49, 49, 17,114,185, 28,161,161,161,184,120,241,
+ 98,118, 57, 34, 11, 46, 60,225,253,163,203,198,117, 48, 45,252,200, 81,191,184,131,116, 21,165,215, 80,151,117,243, 33, 93, 56,
+ 12, 34,136, 96, 48,141,123,118,116,195,130,105, 67,177,253,232,159,164,218,182,235,128, 93,127, 92, 31, 37, 85,105, 86,234, 41,
+178, 74,157,141,225,225,225, 77,194,195,195,121, 0,188,124,124,124,174, 15, 31, 62, 28, 33, 33, 33,184,122,245,170, 43,128,140,
+226,227,214,163, 40, 81,246,207, 0, 18, 42,114, 60,114, 56,156, 51,119,238,220,105,234,232,232,136, 59,119,238, 64,161, 80, 96,
+214,172, 89,106, 95, 95, 95,206,196,137, 19,137,252,252,252, 82, 79, 86,104,104,168,184, 34,145, 5, 0, 34,145,232,198,197,115,
+ 39, 58,119,235,214,109,104, 61, 87,119,211,132,194,130, 44, 62,223,200,248, 97,200, 61,206,139,103,143,247,136, 68,162,231,229,
+151,103,176,222,229,105,128, 1, 6, 24, 96, 64,197,208, 75,139,124,230,153,170, 14,202,156,199,246,247,247,143,245,247,247,255,
+196,227,245,149,248,124,213,225,181,146, 62,173, 70,113,180,116,249, 41, 95, 94, 0, 69, 85,231, 98,191,248,204,194,194,130, 52,
+ 54, 54,254, 68,104, 81,122,114,230, 94, 62,141,132,217, 99, 75, 61, 89, 37,158, 45,244,157,248, 85, 66,139,162,168, 80, 0,159,
+ 24,193,183,117, 27,179, 99, 96,227, 46, 77,234, 57, 49,180,231,118, 34, 77, 78, 42,215,196,107,148,175, 11,233, 65,113,229, 76,
+178, 46,229, 36,181, 48, 18, 24, 39, 27, 11, 5,159,139,172, 15, 0, 32,176,115, 29,190,173,159,123,247,150,238, 13, 24,228,217,
+ 95, 33,146,107,165,126,113, 26, 77,130,140,190, 84, 65, 25,174,233,211,167,207, 26, 43, 43, 43,163, 93,187,118,153,213,169, 83,
+ 7, 36, 73,170, 63, 23, 89,124, 91,183, 49, 59,135, 52,235,226,102,111,193,208, 94,216,141, 84,133, 78,190, 51, 65,251,187, 62,
+ 34,203,218, 76,120,235,192,166,217,198,124, 30, 27, 74,165, 18,155,247, 93, 64,208,227,152, 1, 57, 49, 87,110, 1,184,245, 21,
+ 13,114,234,128, 1, 3,182,175, 95,191, 30, 90,173, 22, 83,166, 76,193,251,247,239,131,226,227,227,119,214,174, 93,123,201,178,
+101,203, 28,237,237,237, 49,106,212, 40,142, 86,171,157, 88, 1,199,150, 83,167, 78, 13,104,217,178, 37, 66, 66, 66,144,151,151,
+ 7, 7, 7, 7,248,250,250,114,253,253,253,127, 47, 40, 40, 24,185,105,211, 38,163,196,196,196, 74, 61, 89,159,180,107,157,110,
+195,193,237,179,151,180,235,232,193,120,247,238, 13,153,210,222,147,113,239,206,213, 7, 86, 86, 86,191,167,164,164,252, 85,158,
+ 67,155, 87,187, 60, 13, 48,192, 0, 3, 12,248, 54, 32, 8,226, 90,241,188,171, 79,188, 92,159,139,176, 18,143, 85,217,253,207,
+143, 47,254,254, 91,188, 44, 31, 42, 71,120,125, 26,222, 97,192,128, 1,122, 47,171,167,100,217,122,137,167,207,241,157, 59,180,
+ 78, 66,176, 86,122, 50,192, 17, 88, 40, 7,174,191,125,183,162, 99, 5, 2,129,222, 30, 45, 74,165,172,170, 82,170, 37,180,138,
+231,104,221,164,105,250, 19,161,101,102,231,230,185,124,217,252, 29, 30,195,251, 50, 50,167,117, 66,158, 84,165, 90,246,138,164,
+210,228,149,139,172,162, 94, 92,155,196, 23, 8,163,141, 4,252,178, 34, 43, 5, 0,140,108, 27,180, 95,186, 96,206,190, 30, 99,
+ 6, 18,217,179, 60, 32,201, 83,168,150,196,146,132, 72, 65,143,140, 3,238,149, 71,119,247,238,221,131, 0, 14,122,122,122,102,
+ 10, 4, 2, 72,165,210, 47,234,160,196,222, 46,195,251, 50, 50,167,118, 64,174, 76,163, 90, 22, 75, 34, 93, 65,157,169, 74,100,
+217,152,155,220, 58,176,113, 54, 63, 61,237, 3, 56, 28, 14,132, 66, 33,110, 63,138, 70, 78,236, 31, 95, 35,176,192, 96, 48,214,
+250,249,249,173,153, 51,103, 14,196, 98, 49,174, 94,189,138,239,190,251, 14,167, 79,159,174,115,253,250,245,237, 94, 94, 94, 96,
+ 50,153, 8, 12, 12,132, 86,171,125, 91, 1,205,208,233,211,167, 47, 25, 62,124, 56,158, 63,127,142,140,140,140, 79, 60, 89,121,
+121,121, 62,251,246,237, 27,158,148,148, 84,165, 39,235, 51,180,119,105,208,154,179, 98,245, 47, 80,201,179, 88,217,162,167, 33,
+193,183, 25, 79,114,115,115,249, 0,242,107, 90,158, 6, 24, 96,128, 1, 6,232,237,213,170, 72,139,100, 23,139,168,236,242,246,
+203, 8,172,242,246,137,207,188, 96,234,207,190,143,252, 59,175, 73, 47,143, 22,203,174, 25,200,204,152, 50, 66, 43,235,147,239,
+141, 76, 44,245, 26, 58,212,146, 96, 29, 56, 86, 26, 71,203, 72, 44, 22, 27, 89, 91, 91, 43,203, 10, 4, 62,159, 15, 71, 71, 71,
+ 72, 36, 18, 28, 58,116, 8,168,122, 82, 52,105, 58,124, 60,218,143,153,130, 23,206, 92,208, 90, 77,169,103,235,192,164, 73,159,
+136, 45, 14,135, 83, 50, 55,172,170, 78,247, 89,177,167,233, 9, 0,186,181,107,189,159,140, 4,130, 73, 70,214,181,172, 23,204,
+158,202, 78,202, 82,225,174,199,138,188, 11, 91,150, 11, 83,105,225,156, 20,228, 63,174,130, 47, 97,240,254, 19,159,123,178,210,
+ 90,185,214, 91,101,196, 55,154,198,181,172,107,239,183,104, 54, 59, 41, 83, 69,220,109,191,172,224,226,207,203,248,137, 48, 89,
+146,134,188,123,122, 84,207,154,239,190,251,110, 13, 77,211, 52, 69, 81,171, 1,160,172,189,139,124,167,177, 19, 62, 42, 17,236,
+177, 74,114,113,203,114,147, 84, 84,110,175,117,243, 33, 93,236, 44, 76,111, 29,216, 52,135,159, 33, 74, 6,143,199,131,137,137,
+ 9, 82, 51,243,193,102, 49, 21, 95,217,222,120, 93,187,118, 93, 62,123,246,108, 68, 71, 71, 99,214,172, 89, 25, 41, 41, 41,151,
+206,158, 61, 59,235,199, 31,127,100,121,123,123, 35, 35, 35, 3, 91,183,110,213, 62,122,244,104, 19,128,173,229,182, 71, 22,107,
+234, 79, 63,253, 68,167,167,167, 19,137,137,137,112,112,112,192,220,185,115,185,155, 54,109, 42,157,147, 85, 29, 79, 86, 9, 68,
+ 34, 81, 72,208,157, 39, 24,116, 99, 7, 72,173, 42, 36, 79,156,242,224,117,130, 36,196,146,203, 93,236,212,186,121,141,202,211,
+ 0, 3, 12, 48,192,128,111,226,197,122, 81,217,254,127, 1,202, 27, 58,212, 75,104,189,221,189,106,178,235,228, 57, 75, 97, 92,
+167, 11, 84,113,151, 65, 73, 51, 75, 61, 90, 70, 66, 11, 88,214,110,140, 60,153, 10,231,131,195, 0,224,109,117,172, 42, 44, 44,
+ 68,155, 54,109,176,119,162, 91, 15,101,161,216,200, 24,128,138,103,170,188,194,237,122,247,250,245,235,114,138,162,206, 0,184,
+ 94, 5,205,218,166, 77,155,238,249,229,151, 95,184,141,199, 76,134,244,233,195,207, 61, 40, 48, 54, 54, 6,143,199, 67, 84, 84,
+ 20,238,222,189,171, 6,176,182,138, 10,125, 70,146,100,228,217,179,103,211, 26,214,115,234,219,166, 85,139,121, 43, 87,248,153,
+188,122, 24,132,213,155,246, 80, 13,219,122,231,111, 62,125,165, 48, 95, 88,187,167, 34, 35, 62, 66,143, 75,141,252, 76,100,165,
+ 55,114,169,213,163, 85,179,166, 75, 87,175, 94,101, 26,251,240, 54,126,252,249, 0,237,218,178, 87,254,207, 23,255, 40,200,225,
+215,237,163,204,122,253, 92,159, 50, 12, 9, 9, 57, 8,224, 96,201,254,231,246,250,173,223, 73,185,181,235, 43,217,124,250,162,
+172,192,164,118,175,202,236,181,105, 60,180,179,179,141,197,173,221, 27,102,242, 63,138, 82,192,227,241, 32, 20, 10,145,146,145,
+135, 53, 59,206,201, 52, 20,213,247,107,133,150,137,137, 9, 79,163,209, 96,239,222,189, 72, 73, 73,233, 4, 32,229,229,203,151,
+ 7, 70,143, 30,189,171,121,243,230,141, 98, 99, 99,223, 74,165,210, 57, 0, 94, 87, 68, 98,110,110,222,201,198,198,134,120,242,
+228, 9,102,206,156,169,158, 59,119, 46,103,194,132, 9,132, 68, 34,169,169, 39, 11, 0,224,228,228,228,217,187,103, 71,116,233,
+ 61, 43, 68,173,204,123,144,244,250,247, 16, 6,253,216,168,166,229,105,128, 1, 6, 24, 96,192,255, 12,106, 22, 24,220, 19, 96,
+185, 89, 97, 70, 83, 39,206,199,128, 45,115,233,194,132, 80, 90,241,252, 32, 93,112,121, 26,125,109,235, 4,250,250,238, 5,244,
+172,254, 77,233, 70,182,196, 71, 55, 43,204,240,252, 82,184,125,146,221,251, 59,119,104,123, 55, 0,221,187, 1,232,254,110,208,
+ 2, 88,217,186,117,235, 43,190,237,255,138,163,229,219, 30, 52,128,153, 0,132, 21,152, 85, 94,198,112, 7, 0,135,218,180,105,
+ 67,222,187,119,143,142, 31,217,139, 14,111,100, 77,207,153, 51,135,254,241,199, 31,233,177, 99,199,210, 54, 54, 54,100,113, 65,
+ 56, 84,197, 57,104,208, 32,103, 0,168, 85,171,150,121,219,198, 13, 63, 70, 5, 95,165, 31, 4,236,162,143,250, 14,163, 59, 52,
+111,156, 99,223,168, 91,164,177,131,123,171, 42,138,175,148,211,222,222,126, 5, 77,211,125,105,154,118, 0, 0, 87, 87, 43, 97,
+235, 70, 13,211, 35,239, 92,165, 31,158,216, 67, 31,245, 29, 70,119,108,209, 68,236,220,216,235,181,145,109,163,246,250,112,150,
+135,114,237,109,214, 40,199,104,243, 99,239, 0, 0, 32, 0, 73, 68, 65, 84,174, 97,231,136, 74,236, 45,229,172,215,126,212, 31,
+105,233,153,244,179,103,207,232,235,215,175,211, 15, 31, 62,164, 3,206,254, 65,215,110, 55, 82,106,221,124, 72,151,106, 52,157,
+138,236, 52,235,223,191, 63,253,246,237, 91,186, 95,191,126, 52, 0,179, 26,114, 94, 73, 74, 74,162, 99, 98, 98,232,149, 43, 87,
+210, 0,142,207,158, 61, 91,145,159,159, 79,247,234,213, 43,165, 88, 96,177,106, 98,103,125, 23,167,205, 67, 7,118, 93,235, 59,
+115,184,231,215,150,231, 55,132,129,211,192,105,224, 52,112,254, 47,112,254,147,225, 80,236,213, 42,249,219, 90, 47,143, 86, 8,
+ 64, 66,140,131,205,108, 53, 39, 55,109,221,189,120,239,193,227, 75,151,207,155, 42,232,234,209, 27,209,119,126,195,197,192,179,
+ 50,165, 74,189,149,195,196, 47, 49, 98,200,223, 84, 97, 69,113, 28,173, 79, 16, 30, 30,206,183,108,240, 87, 12,166,119, 69,177,
+ 89, 15, 84,243, 2, 51, 0, 76, 15, 11, 11,251,197,203,203,107,227,180, 46,237,135,249,118,238, 1,173, 86,139,128,128, 0, 36,
+ 39, 39, 95, 2,176, 74, 95,143, 91,116,116,116, 78,147, 6,117,230,179,153,172,165,115,198, 14,181,201,126,255, 10,105,113,225,
+ 0, 0,149, 74,161,253,248,246, 65,203,234, 24,103,108,108,252,204,198,198, 38,222,198,198, 70,226, 86,175,214,116, 30,216,171,
+103,249, 12,182, 21, 39,189, 70,106,108,209,200,168, 74, 41,215,164,189,189,215,168, 38,181, 91,167, 78, 29,158,128,141, 25,229,
+218,171, 86,106, 51,223,189,110,165, 15,143, 92,165,222,180,110,123, 64,159, 13, 75, 39,241, 76, 77, 77, 17, 22,243, 14,171,127,
+ 61, 45, 83,168,181,125,115,162,175,124,147,225, 49,154,166,161,213,106,245, 94,232, 80, 1,150,183,108,217,210,125,227,198,141,
+174, 19, 39, 78,196,215,122,178,202, 34, 33, 73,228,231, 84,171,126,147,119,241, 97, 94,150,198,156,147, 95, 83,158, 6, 24, 96,
+128, 1, 6,252,207,160,127,177, 51,103,122,153,191,225, 85, 10,173, 18,196,100, 65, 14, 96,125, 61,166,244,192,138,141,219,215,
+ 48,136, 29,147, 40,154,254,141,100, 96, 93,162, 24,217, 95,105,156,156,205, 2,217,103,200, 88, 22, 0,176, 89, 53,235, 32,139,
+241, 22,192,240,195,143,159,183, 59,252,248,249, 15,197,159,109, 0, 80,173,177, 92, 19, 22, 98, 60,154,212,119,234,218,186,169,
+ 17, 83,167, 64, 90,220,123,228,202,148,184, 29,155,156,199,160, 25,191, 85,215,168,196,196,196,251, 0, 96,103,198,143,235,218,
+164, 65,237,110,109,154,242,217,132, 26,105,175,194,144,175, 80, 35, 40, 54, 57, 31, 4, 81,227, 9,213,223,202,222,204,232, 63,
+ 94,252, 9,162, 23, 65, 16,119, 86,250,142,225,173,249,245,204, 55, 21, 89, 0,228, 34,145, 72, 44,151,203,173,210,211,211,213,
+168,121,144,184,119, 5, 5, 5,205, 23, 44, 88,176,126,201,146, 37, 75,183,108,217,194,169,201,156,172,138, 32, 17, 37, 95,238,
+214,244,219,213,191, 1, 6, 24, 96,128, 1,255, 19,152,254,217, 95,232, 45,180, 74, 5, 67, 22,178, 1,204,169, 95,159, 94,148,
+144, 0,245,183,178,172, 60, 79,215, 87,226, 5,128,129, 53, 62,155, 65, 20, 62,125,155, 44,125,246, 54, 89, 10,138,166, 41,154,
+ 86, 49, 24, 72,149,105, 52,155,222, 38,138,106,190,234,142, 32,116, 47,222,165, 40, 94,190, 79, 85,210, 20, 69, 83, 52,173, 38,
+ 8,124,212,106,169, 77,177,137,201,127,252, 55,216,155, 19,125,229,113, 32, 73,116,125,252, 44,102,145, 76,166,217,147, 19,119,
+ 37,244, 27,214,139, 54, 58, 58,122, 92,167, 78,157, 38,235,116,186, 3, 0,180, 95,193,165, 38, 73,114,249,230,205,155, 47, 69,
+ 71, 71,159, 11, 13, 13,205,248, 22, 34,235,111,173,127, 3, 12, 48,192, 0, 3,254,173,168, 89, 82,233,138,240, 45, 69,214,127,
+ 35, 98,222,125,104,243,119,240,198,190,251,208,236,159, 96,111,102,220,229,151,153,128,207,223, 84,188, 65, 58,157, 46,232, 91,
+138,234,155, 55,111,186,160,156,180, 58,255,109,245,111,128, 1, 6, 24, 96,192,191, 22,211, 43, 18, 95, 44, 67,217, 24,240, 47,
+ 0,253,173, 68,150, 1, 6, 24, 96,128, 1, 6,212, 0, 21,122,180, 8, 84,188,114,224, 78, 53,126,160, 38,171, 15,238, 24, 56,
+ 13,156, 6, 78, 3,167,129,211,192,105,224,252,159,227,252, 55,194, 1, 69, 19,226,175, 21,255,173, 84,124,125, 75, 24,150,190,
+ 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,252,183,163,220,137,240, 64,209,228, 97, 3, 12, 48,192, 0, 3, 12,248,187,
+192, 43,222,106,250,189, 1, 6,252, 19,197, 86,169,224,170,201, 28,173,134,197,127,223,253,141,198,250, 58, 56, 56, 76,111,209,
+162, 69, 99, 14,135,195, 40, 44, 44, 92,119,239,222,189,181,159, 31,212,181, 9,235, 37,147, 1,231,191, 62, 33, 0,130, 9, 48,
+ 24,208,209, 72,123, 24,165,104,107,168,247,255,106,212, 49, 54,181,249,147, 96, 48,185, 58, 82, 3,157, 86,131,162,233, 86, 69,
+160, 40, 50, 89,167, 81,121, 87,116,178,125,203,161,181, 73, 29,181, 5,160,247, 2,140,217, 0,181,143, 0,107, 22, 13,114, 63,
+ 1,230, 76, 48,233,159,161, 35,150,177,216,204, 21, 25,225, 23, 82,255, 13, 5,118,254,252,121,230,215,156, 63,114,228,200,114,
+ 19,136, 58, 58, 58, 6,242,249,252, 6, 21,157, 39,147,201, 50, 50, 50, 50,188,254,229,237,177, 27,128,221, 0,154,126,246,249,
+107, 0,243, 1, 4,127,237, 15,120, 2, 44, 59, 96, 6, 7, 88, 6, 0, 26,224,231, 76,224, 96,200,127,209, 28, 67, 27, 27,155,
+ 7, 44, 22,203, 85, 38,147,201, 10, 11, 11,235,155,152,152, 36, 8, 4, 2, 1, 73,146,111,179,179,179,187, 85,147,110, 54,254,
+ 74,165,181, 20,192,190,106,126,111,128, 1,255, 20,124,213,170, 67,183,162,231, 3, 60, 1,116,107,215,174,157,157, 76, 38,195,
+235,215,175, 51, 1, 60, 0, 16, 82,188,189,249, 22,150, 50, 24,140,109,219,183,111, 95, 60,119,238,220,210,100,208, 81, 81, 81,
+104,217,242,203, 24,161, 76, 6,156,239, 93,189, 99,251, 34,250, 13,218,245, 26, 81, 44,180, 24,128, 44, 3, 94,189,219,215,212,
+ 4, 19, 11, 11,139,117, 4, 65,140,100, 48, 24, 85,118,106, 20, 69,233,104,154, 62, 47,145, 72,214, 0, 40,172,206, 15, 9,248,
+ 60, 45,169,211,149,251, 27, 44, 38, 83, 39,147,171, 42, 12,123, 97,105,105, 25,202, 96, 48,234,149, 77,152, 13,124,154, 64,187,
+162,239, 72,146, 76,203,201,201,209, 71,132, 26, 49, 88,156,249, 4,193,233, 13, 6,229, 6, 16, 32,192,120, 67,233,212,183, 41,
+ 82,179, 19,128,242,107, 68,150, 67,173,250, 15, 23,174,218,236, 28, 19,247, 26, 43,125,199, 98,203,238,227, 88, 49,127, 50,118,
+ 30, 58,141,249,211,199,160, 73,147,166,168, 44,173, 56, 5,206,166, 85,243, 70,246,242,223,123,206, 99,197,156,145, 60,255,189,
+231,187,174,244, 29,205,221,180,231, 92,215,149,190,163,120,254,123,206,121,172,152, 55,210,120,211,190, 11, 20,128,241, 53, 49,
+114,140,171,163,140, 32,201,114,223,182,105, 22, 75,117,250,109,186,224,255,227,142,158, 56,113, 98, 11,133, 66, 17, 54,182,119,
+235,205,173,220,156, 68,229, 29, 35,254, 40,114, 74,136, 15,247, 99,115,140,219, 12,246, 59, 30, 85,169,203,129,199,171,247,250,
+245,107, 87,138,162,160,211,233, 64,146,100,233, 95,181, 90,141,110,221,186,125,171,133, 51, 3, 1,172, 43,186, 89,225, 15,224,
+220, 87,112, 9, 89, 44,214, 66, 46,151,235, 73,146,100, 99, 0, 96,179,217,113, 42,149, 42,132, 36,201,237, 0,164,213,228,219,
+ 33, 18,137,154, 8,133, 66,104, 52,154,210, 4,244, 76, 38,179, 81,237,218,181,247, 42,149, 74,215,175,189,120, 59, 96, 70,103,
+ 15,143,157, 19, 22, 47,102, 42, 30, 60,192,206, 99,199,118,160,160, 0, 0,246, 86,117, 46,151,203,189,197, 96, 48,234, 84,231,
+247, 40,138, 74, 86,171,213,222,213, 57,135,197, 98,185,166,167,167,219, 58, 58, 58,162,176,176, 16, 2,129, 64, 80,178, 95, 3,
+ 79,214, 86,154,166,141,139,159,237, 59, 59,118,236,216,137, 32, 8, 18, 0, 77, 81, 20,227,217,179,103, 99, 40,138, 98, 21, 63,
+159,182, 2, 56, 6, 64,101,232,179, 13,248,135,122,179, 14, 85, 87,104, 93, 7,224,217,174, 93, 59, 99, 31, 31, 31,120,122,122,
+194,213,213, 21, 70, 70, 70, 69, 15,113,177,216, 46, 34, 34, 98,212,131, 7, 15, 70, 93,189,122, 21,175, 94,189, 82, 0,120, 4,
+160,220,155,186,231, 0,143,185, 70, 66,222, 46, 0,200, 78, 19,103,164, 37,102,237,202,200,200,216, 10,160,108,136,240,250,227,
+199,143, 95, 52,111,222, 60, 4, 6, 6,226,244,233,211, 80,169, 84, 40, 44,172, 68,191,200,179, 32,185,187, 25, 16, 36, 1, 41,
+ 33, 0,223, 22, 16,216,213,184,164, 44, 44, 44,214,205,159, 63,127, 65,147, 38, 77, 74,163,152,107,181, 90,144, 36, 9,173, 86,
+ 11,137, 68,130, 69,139, 22, 21,117,180, 52, 13,138,162,112,227,198,141,185,211,167, 79,135, 68, 34, 89, 88, 30,103,199, 54,181,
+ 94, 50, 8,134,115,137,175,134,214,233,210,158, 70,164,181, 37,117, 58,166, 82,169, 41, 55, 83,185,145, 17,167, 82,145,199,102,
+179,157, 95,253,249,167, 45,131,203, 5,173,211, 1, 20, 5,154,162,138,139,179,120,163,139, 62,163,117, 20,104,173, 14, 20, 73,
+129, 84,168,208,126,246,108,125,138,162, 51,155,107,124,122,220,180,197,246, 29, 58,118,100,215,173,229, 8, 82, 71,225,125, 82,
+154,125,216,203,167, 93,206,255,190,119,150, 90, 81, 56, 6, 64,141,226,108,113,249,166, 65,123,246, 31,118,126, 17, 17,131,224,
+123, 15,112,231,110, 8, 0,224,214,189,208, 18,193, 93,101, 85,129,148, 54,159, 63,101, 8,111,243,158, 51,236,249, 83,134, 50,
+183,236, 57,203,158, 55,121, 48,115,243,174,211,156,121,147, 7, 51, 55,239, 62,205,153, 55,101, 8,211,127,231,209, 22, 0, 44,
+ 0, 72, 42, 34,171,168,142, 8,146,228,157, 76,200,100, 2, 64,246,129, 3,208,102,101,193,113,205, 26, 0,192,184,250,118,122,
+ 15,119, 88, 91, 91,191,100,179,217,206, 85, 29,167,213,106,171, 20,193, 19, 39, 78,108,169, 80, 40, 94,146, 36, 73,179, 88, 44,
+191,177, 67,251, 92,233,219,181,165,184,236, 49, 81, 81,145, 86,155, 54,253, 57,228, 92, 88, 33, 61,170,141, 73, 88,224,182,137,
+109, 7, 44, 57, 30, 89, 73,135,204, 80,169, 84,120,251,246, 45,202, 38,121, 47, 3, 93, 77,223,157, 0,236,180,178,178,234, 32,
+ 22,139,199, 1, 88, 89, 80, 80,208,130,201,100,194,210,210,114,165, 90,173,126,111,102,102,118, 36, 63, 63, 63,180,216,107,164,
+111,202,128,110,166,166,166, 1,151, 47, 95,182,104,221,186, 53, 35, 39, 39, 7, 46, 46, 46,200,205,205,109,255,224,193,131, 54,
+ 83,166, 76,153, 82, 88, 88,248,125,241,203,160,190,112,231,243,249,244,132, 9, 19, 8,157,238,175,203, 61,122,244, 40,188,155,
+145, 13,108,204,249,114,165,154,206, 15,126,107, 54,147,195,225, 60, 74, 78, 78,206,175,110, 97,112,128,101, 19, 22, 47,102, 10,
+ 63,124,128, 48, 50, 18,227, 10, 10, 88, 91,138,188, 91, 85, 10, 45, 6,131, 81, 39,224,244,111,174, 92, 46, 23, 36, 73,150,138,
+193,146,103,148, 86,171,133, 70,163,129, 86,171,133, 78,167,131, 86,163,133,255,134,159,107,252, 44,228,243,249,124, 7, 7,135,
+ 76, 62,159,207,255, 22,189, 16,143,199, 99,253,254,251,239, 99,184, 92, 46, 0, 64,173, 86,163, 89,179,102,132,161,127, 54,224,
+ 95, 38,182,190,240,114, 85, 38,180,250, 21, 20, 20, 64,167,211,193,196,196, 4, 76,230,167,253,190,149,149, 21,122,247,238,141,
+110,221,186,193,199,199, 7,175, 94,189, 50,246,241,241,233, 93, 17,217,216,197, 3, 80,203,213,174,184, 51,161, 28, 30, 95,139,
+216,124,244,167, 11, 54, 31, 63,126, 92, 92,230,176, 41, 51,102,204, 32,196, 98, 49, 70,142, 28,249, 64,165, 82, 13, 2, 80, 80,
+ 17,167,142, 66,154,151,207, 56, 80, 52, 97,188,253,217, 97, 66,173, 84,208, 12, 6, 67, 81, 50,116, 88,147, 82, 34, 8, 98,164,
+163,163, 35,206,156,249, 63,246,190, 59, 46,138,107,125,255,153,217,190, 44,189,131, 10, 42,136,130, 32,216, 16,108,216, 53, 17,
+ 19,107,188,246, 36, 38,222, 36,150, 88, 18,177, 69, 99,131,196, 26, 19,141,154,196, 88,174, 13,187,216, 98,197,196,174, 40, 82,
+ 20, 20,105,194, 2, 75, 95,216, 54,187, 51,243,251, 3, 88, 1,217,130,201,253,221,251,189,217,231,243,217,207,238,236,204,190,
+123,230,156,153, 57,207,121,222,247,188,231, 32, 52,154,215,211,133,217,218,218, 34, 57, 57,249,149,170,198,225, 32, 44, 44,140,
+ 67, 16,196, 56, 0,115,155,182, 73,182,188,113, 47,203,181,110, 59,114,112, 32, 63,172, 43, 89,152, 95, 88,205, 2, 32,150, 44,
+ 89,162, 39,110, 0,240,245,215, 95,155, 83, 78,144, 60, 30,100,241,241,175, 30,196, 92, 18, 36,159, 0,193, 3, 72,110,141, 23,
+ 21, 44,192,210, 0,163, 3, 24, 45, 32,242,104,101, 78, 53,132,182,240,242,139, 91,187,113,155,189, 90,203,226,224,201,203,200,
+204,124, 1, 14, 73,194,199,215, 15, 67,250,245,225,117,237, 30,222,234,219, 21,243, 79,231,231, 60,123, 11,192,221,102, 87, 52,
+195,138,124,189,156,241,243, 47, 15,224,226, 96,141,113, 35,223,134, 88, 36,196, 55,223,255,138,213,139,102,194,207,199, 27, 59,
+ 54,175, 49,248,115, 59, 59,187,149, 1,126,190,222,219,246,156, 65,128,191, 63,103,219,222, 51, 8,232, 88,251, 30, 24,192,217,
+182,247, 12, 58, 6,118,228,108,219,123, 6,193,129, 29, 90,223,151,222, 89, 89, 90, 90, 58,211,112,125, 54,106,163, 33, 53,109,
+196,171, 98,244, 29, 65,214, 39,159, 0,128,158,104, 53, 7, 60, 30,175,101,126,126,190,171,169,227, 76,169, 6,181, 74,214,125,
+157, 78,135,162,162, 34,162,188,188,156,181,183,183, 31,121,126,199,226,227, 67,123,135,148, 2,192,163, 71,143, 28,163,163,215,
+142, 60,116,191, 18,202,219, 63, 16,255, 58, 21,207, 76,122, 39,226,254,201,152,105, 93, 81,187, 36, 68, 99,168,213,234,204,206,
+157, 59,179,181,159, 91, 8,133, 66,126,163,235,205,179, 93,187,118,175,169,214,102,184, 20,191,187,117,235,214,204,142, 29, 59,
+194,223,223,255,102,143, 30, 61,108, 37, 18, 9,206,159, 63,143,128,128,128, 64, 91, 91,219, 59,177,177,177,188,133, 11, 23,134,
+236,218,181, 11, 0,102,153, 81,157,131,250,247,239,127, 48, 46, 46, 78,196,231,243,161, 84, 42,145,156,156, 12, 59, 59, 59, 8,
+ 4, 2,188,251,238,187,156, 94,189,122, 57,245,235,215,239,104, 90, 90,218, 4, 52, 99, 6,148, 74,165, 98, 23, 47, 94, 12, 43,
+ 43, 43, 88, 89, 89, 65, 34,145, 64, 34,145,192, 90, 4, 98,251, 28, 47,241,236,157,229,226,185,203,183,199,236,221,182,226,106,
+171, 86,204, 87,185,185,185,229,205,189, 22,148,215,175,195,250,209, 35,160,222,189,107, 46,236, 36,142,136,138,138, 50,165, 72,
+129,207,231,163,103,207,158, 38,237, 57, 58, 58, 30,227,114,185, 13, 70,166, 58,157, 78, 20, 21, 21, 69,167,165,165, 73, 72,146,
+148, 48, 12,131,168,168, 40, 90,167,211,137, 92, 93, 93,111, 50, 12, 83, 88, 92, 92, 60,218,140,226,170, 1,124, 65,146,228,119,
+ 66,161,144,219,186,117,235,236,101,203,150,221,170, 85, 51,193,178, 44,217,186,117,235, 80,177, 88,236,173, 86,171,117,168,113,
+ 29, 90,212, 44, 11,154, 4,203,178, 93,107, 68, 97, 61, 52, 0, 4,181,159, 75,106,122, 59, 56, 55,250, 30, 0,138,107, 7,138,
+110, 6,182, 75, 0,164, 0,232, 0,192,181,118,223, 61,130, 32, 74,223,160,152,134, 21,173,184,184, 56,253, 16, 54, 50, 50, 82,
+223,177,216,216,216,224,222,189,123, 32, 8, 2, 54, 54, 54,176,181,181,133,157,157, 29, 42, 43, 43,145,146,146,130, 39, 79,158,
+ 32, 43, 43, 11, 4, 65,192,199,199, 7,117, 55, 80, 61,232, 31,112,251, 55,196, 65,100, 45, 4, 65, 0, 93, 6, 4, 35,184,111,
+ 16,186,223,205,152,115,255, 18,177, 83, 42,149,166, 3,224, 6, 5, 5,125, 24, 22, 22,134,141, 27, 55, 66,173, 86,111, 52, 64,
+178,244, 54,127, 79,209,117, 3, 0, 15, 15,143, 5,251,206, 63,183,154, 60,204, 87, 33,149, 74,215,191, 65,229, 52,120, 16, 23,
+ 23, 23,155,189, 22, 31,195, 48, 40, 43, 43, 51,106,179,177, 66,176,233,187, 31,236,229, 21,133, 88,245,205, 62,104,181, 90,204,
+159, 63, 31, 12,195,232, 95,229,229,229,102,149,147,165,233,215,181, 3,178,198,123, 74,112, 1,175,241, 53,188, 34,231,224, 15,
+ 32, 88,128,160, 1,188,126, 94,141, 59, 33, 17,135, 47, 62,180,226,155, 45,246, 9, 79, 94,226,228,229, 4, 80,149,121,144, 62,
+ 58, 94, 35, 57,246,156,128,195,106, 14,122, 4,251,226,243, 37,223, 58, 44,253,124,202, 33,141, 82,238,143,134,110,196, 75,166,
+111, 26, 26,171, 86,174,196,206, 45, 27,241,237,198, 45,168,172, 40, 7,143,231, 92,251,160,167, 65,211,180,241,115,103,217, 97,
+ 81,115,222, 39,190,249,241, 24, 66, 59,122,224,232,249,187,232,221,217, 27,199,127,187,143,190, 93,219,224,228,165, 4, 12,232,
+225,139,179,241, 73,248,124,198, 4, 98,194,133, 93,195,154,211, 70,155, 55,255, 96, 47,175, 44, 68,220,154, 61, 40,218,186, 21,
+217, 51,103, 34,180,246,152,187, 4, 1,126,203,150, 0,223,116, 27, 53, 70,106,106, 42,212,106,117, 83,163,125, 4, 4, 4,152,
+108,119,165, 82,249, 64,167,211,177,133,133,133, 68, 97, 97, 33, 36, 18, 9,145,156,156, 68, 7, 6, 6,141, 98,159, 28,249, 9,
+ 0,162,163,215,142, 58,252,160, 18,138,155, 91,160,188,245, 61,248,109, 18,201,157, 95,207,160, 62, 94,190,227, 65,189,123,180,
+ 65, 57, 11, 10, 10,222, 42, 40, 40, 0, 0,180,109,219,246, 73, 90, 90, 90,135, 58, 87,115,173, 11,145,175,211,233,252,234,220,
+137, 58,157, 14,106,181, 26,131, 6, 13,226, 24, 59,119, 7, 7,135,176,128,128, 0, 36, 36, 36, 96,203,150, 45,142,253,251,247,
+199,179,103,207, 64, 16, 4,214,174, 93, 75,116,236,216,145, 87, 92, 92,140,161, 67,135,226,216,177, 99, 61, 43, 43, 43, 77,213,
+167,141, 68, 34,217,117,250,244,105, 17, 73,146,144,203,229, 96, 24, 6,189,122,245, 2, 73,146, 72, 74, 74,194,146, 37, 75,112,
+236,216, 49,156, 56,113, 66,220,181,107,215, 93, 10,133, 34, 0, 13,221,250,134,218,136, 85,169, 84,172, 80, 40,132, 80, 40,132,
+ 72, 36,130, 72, 36,130, 64, 32, 64,149, 10,248,120, 83,182,154, 35,114,102, 2, 59,247,246,125,127,246, 90,114,253,178, 15,174,
+ 0, 56,105,238, 53, 15,212,196,100,125,247,235,175, 91, 38, 85, 84,144, 0,240, 51, 65, 48, 20,203,126,107,206,253, 14, 0, 85,
+170, 10,120,251,180,196,209, 67, 39, 48,102,252,200, 38, 73, 22,143,199, 7,159,199,131,173,163,196,164, 77, 62,159,239,246,228,
+201, 19, 39, 30,143, 7,150,101, 65,211, 52, 40,138, 42, 92,186,116,169,203,240,225,195,109,206,157, 59, 71, 14, 31, 62,156,113,
+112,112,168,190,123,247,110,145, 78,167,115,234,211,167, 79,115,174,249,109,193,193,193, 93,142, 31, 63,254, 65, 84, 84,212,253,
+ 5, 11, 22,172,170,191,115,221,186,117, 43,207,158, 61,235, 61,106,212,168,189,143, 30, 61,218,214,156,103,200,159,125,206, 91,
+108,254,247,217, 52,196, 69,106,225, 70, 16, 68, 92,189,103,118,100,221,118, 84, 84,212,226,232,232,232,100,130, 32,226,234,127,
+ 95,119, 92,237, 96, 49,174,169,237,218,223, 58, 46, 90,180, 40, 40, 38, 38,102,109,120,120,248,193,155, 55,111,190, 0,208, 92,
+162,101, 60, 70,171,238,132,234,159,100,163, 78, 13,149,149,149,168,172,172, 68,110,110, 46,182,111,223, 94,123, 67,243,192,229,
+114,193,229,114,245,241, 12,134,112, 57,238,143,239, 1,124,223,165, 75, 23,222,227, 91,177,231,190,220, 57,123, 96,183, 65, 93,
+ 56, 15, 46, 63, 30,139,154,245, 8,223,154, 58,117,170, 51, 0,236,217,179,167, 24,192,185,255, 16,107,142, 77, 79, 79,255,220,
+195,195, 67, 31,163, 82,223,125,168,211,233, 32, 18,137, 80, 23,203,162, 82,169,176,125,251,118, 29,203,178,177, 70,108, 34, 45,
+249, 10,210,147,175,214,252,142, 97,192,208,175,126,191, 98,197, 10,176, 44,171,239,236, 63,169, 85, 78, 76,146,188,166,234,156,
+109,244,222,232,123,150,166, 77,184, 39,248,179,199, 78,153,233,193, 16, 92,156,186,242, 16, 60, 30, 15, 76, 61, 53,147,199,169,
+ 25, 45, 39, 63,203,135,167, 91, 32,222,153, 48,195,253,248,222, 31,102,235, 40,213, 55,205,173,107,255,224,112,204,249,252,115,
+252,180,115, 39,150, 44, 95,169,103, 0, 58,154,134,206,100, 57, 73,114, 80,175, 32,232,170,242,193,225,112, 48, 32,212, 23, 28,
+ 14, 7,131,195,219,131,195,225, 96,104, 47,127,112,185, 92, 12,235,221, 17,237,218,181, 3,151,203, 37, 77,180, 59,210,146, 47,
+ 35, 61,249, 90, 61,210,203,130, 5, 64, 73,165,175, 29,175,149, 74,193,122, 57, 53,247,218,194,135, 31,126, 88,158,155,155, 75,
+ 53,222,215,170, 85, 43,254,245,235,215,237, 13,184,237,244, 16,139,197, 93,185, 92,238,131,210,210, 82,198,202,202,138,100, 24,
+154, 9, 12, 12,226,156,223,177,248,120,221, 49,139, 22, 45, 62,254, 94, 87,219, 81,251, 98,227, 88,126,235,222, 4,193, 19,234,
+ 62, 90,190,131,207,227,139,187, 2, 74,115, 6, 15,164, 90,173,198,211,167, 79, 97,170, 60, 44,203, 26,117,253,148,149,149, 77,
+ 13, 8, 8,184,254,253,247,223, 59, 18, 4,129,223,127,255, 29, 28, 14, 71,255,202,200,200, 0, 73,146,248,242,203, 47,169,202,
+202,202,233,166,202,198,229,114, 63, 63,122,244,168,157, 64, 32,128, 92, 46,215,223, 55, 28, 14, 7, 79,158, 60,193,250,245,235,
+ 49,117,234, 84,228,228,228,192,211,211, 19,243,231,207,183,142,137,137,249,156,162,168,149,102, 52, 81,162, 70,163,233,102,101,
+101, 5,145, 72,132, 58,194, 5, 0,191, 37,243,146,148, 74,101, 39, 39, 39,133,187, 75,124,220,169,158,253,223, 9,113,114,241,
+ 8,151, 74,165,205, 90, 58,235, 57,176, 51,147,166,151,190,117,252,184,235,141,227,199,153,219,167, 79,191, 20,202,229, 59,204,
+190,134,180, 36,178, 51, 94,162,107,215,174,120,240,224, 1,186,118,237, 90,159, 52, 65, 32, 16,128,207,231,131,207,231,195,217,
+193,172, 16, 10,150, 36, 73,220,184,113, 3, 52, 77, 67,163,209, 64,163,209,160, 99,199,142,165, 87,175, 94,181, 6,128,140,140,
+ 12,118,242,228,201,229,119,238,220, 65,231,206,198,215, 83,119,115,115,187,206,225,112, 90,215,255,174,164,164,196, 97,244,232,
+209, 40, 43, 43,123,123,244,232,209,189,107,239,223,188, 35, 71,142, 76, 6, 0,129, 64, 0,146, 36,105, 88,240,183,135, 41, 46,
+ 82,159, 40, 53, 38, 92,209,209,209,145,141,191,171, 79,170,154,250, 92,255,183, 49, 49, 49,107,235,217, 86,190, 65,241, 77,199,
+104,197,197,197,177, 77, 48, 72,179, 97,138,104,213, 33, 33, 33, 65,235,233,233,249, 83,250,195,172,129,190,193, 62, 16, 75,132,
+ 67, 0,124, 47, 20, 10,231, 77,153, 50, 5,183,111,223, 70, 82, 82,210, 47,248,147,179,112,130,130,130, 46, 8,133, 66,111, 3,
+110,146,236,164,164,164,161, 6, 58,134,229,167, 79,159,134,177, 96,248, 43, 87,174,212,239,148,234, 7,195, 55,125, 97, 48, 44,
+180,148, 22,213, 10,229,171, 78,188,150,104, 85, 87, 87, 99,252,248,241, 13, 20,173,162,162, 34,147,231, 71, 16, 4,214,159, 60,
+137,139,177,177,120, 59, 36, 4,199,238,222, 69,204,148,137,240,247,110, 1,150, 38,192, 18, 64,206,129, 31, 80, 82, 89,133,253,
+151,111,160, 84,174,192,164, 62,125,224,103,235,108,220, 46,143, 63, 56, 52, 44,156,127,233,102, 10,120, 60, 46, 72, 48, 96,181,
+ 10,120, 6,244, 3,135, 36, 97,231,214, 6,124, 30, 15, 60, 30, 23, 25,185,197, 8, 8,234, 46,136, 19,136, 6,191, 9,209,106,
+229,221, 6, 52, 77, 99,234,212,169, 56,120,240, 32,156,220,189, 97,215, 42, 8,171, 55,238,196,219,131,250,152, 60,255,186, 17,
+ 60,151,203, 5,135,195,121,237,189,238,179, 57,234, 36,203,176,160, 26,183, 17,195, 2, 44,139,150,107,214,160,229,154, 53,184,
+ 91,251,159, 29,171,171,161, 84, 42,129, 30,129,205, 34, 89, 26,141, 6,185,185,185, 84, 65, 65,129, 91, 19,251, 11, 53, 26,141,
+ 73, 98,179,123,247,238,196,105,211,166,117,115,116,116,188,159,248,232,145, 54, 56, 36,132,119,110,251,226, 19,117,110, 67, 0,
+ 8, 9, 9, 41, 93,188,120,241,137,201,227, 34, 71,110,139,250, 7,253,233,202,189, 92,161, 88,220, 45,114,193,238,196, 3,227,
+198,153,246,247,168,213,153,193,193,193,172, 57,231,165, 80, 40, 10,140,236, 30, 1,224,235, 46, 93,186,216,246,239,223, 31,215,
+175, 95,199,152, 49, 99,212, 20, 69,165, 3,192,240,225,195,219,239,223,191, 95,144,146,146, 2, 23, 23, 23, 94,118,118,246, 46,
+152, 8,144, 23, 8, 4,253,186,119,239, 78,170,213,234,215, 72, 86, 76, 76, 12, 38, 76,152,128,246,237,219,131, 97, 24, 84, 85,
+ 85,161,127,255,254,188, 45, 91,182,244, 51,147,104,205,241,247,247, 95,143,154, 89,135,245,159,133,169,168,113,107,161,164,164,
+164,224,225,157,203,201,125, 6,141,238,214,186, 93,144, 71, 82,226, 3,163, 6, 93, 93, 93, 23,145, 36,249, 30,195, 48,156,202,
+202,202,220,135, 26, 77,187,142,222,222,110,189, 70,142, 68, 5,143,199,249,238,242,101,178, 80, 46,183, 6, 96,150, 11, 82,165,
+173,134,183, 79, 77,168,223,152,241, 35,241,224,193, 3,140,253,199, 40,240,249,124,112,185,188,154,123,147, 95,163,104,217, 59,
+219,154,117,109,106,181, 90,253, 51,188, 46,206,139,162, 40,212,133,102, 89, 89, 89,233,247,169,213,106, 16, 4, 97,236,218,240,
+ 59,188,114,153,171,216,214, 14,180, 86,139,192,145, 99,245,215,244,157,159,183,137,193, 48,226,242,236, 76,204,138, 61,205,131,
+ 5, 22, 24, 80,181,140,113,145,250, 68,233,207,130, 32,136,184,168,168,168,197, 0,216,168,168,168,197,117,219,209,209,209, 74,
+ 0,121,111, 72,182, 94, 83,185,184,127, 5,201,170,115, 47, 24, 67,255,254,253,103,217,216,216,108,169,219,206,189,157,135,220,
+219,121, 8,232, 16,216,171, 75, 72,183,138, 9, 19, 38,192,201,201, 9, 11, 22, 44, 96, 1,252,210,220,255,207, 72, 75,182, 6,
+192,122,120,120, 44,168,125, 32,135,220,189,123,215,229,222,189,123,232,222,189,251, 43,233,158,162,208,187,119,111, 99,166,228,
+181, 65,237,115,255, 58,149,140, 1, 69, 81, 80, 40,148,208,104, 40,232,180, 12,116, 58, 29,186, 6,218, 96,239,206,168,154,239,
+116,117,234, 89,141,106,214,210,221, 6, 54,214, 60, 45, 73, 18,202,251,137, 5, 77, 62, 49, 53, 26, 13, 18,179,179,241, 40, 43,
+ 11, 0,240, 78,180,241,192,215,189,151,175,163, 99,199,142,166, 74,235,219,210,211, 29,249, 23, 19,107, 30,222,202, 92,220,251,
+227, 48,108,108,172, 1, 0,129, 17,147,192,231,215, 16,173,106, 37, 5,231, 14,173, 64,176,172,193,180, 0, 86, 14,238, 23,184,
+124,145, 55, 75, 51, 96, 89, 6, 44, 67,131,101, 25,112,120,124,171, 89,159,124, 0,134,161, 17, 26, 26, 10,130,195, 1,173, 85,
+ 99,220,136,193, 40,171,144,195,201,222,188, 78,130,207,231, 35, 34, 34, 66,108,104,255,179,103,207,148,245,137,153,241, 54,210,
+162,186, 90, 9,181, 90, 13, 74,163, 3,165,213,129,110,203,199,170,165, 19,161,163,116, 80,252, 35, 28,148, 86, 7,230,243, 81,
+160, 52, 90,228, 88,145,100,112,128,179,150, 4,161,124,152, 42,179, 53, 69,180,234,200,129, 33, 52, 21, 19,104,128,108, 61,154,
+ 54,109, 90,215,224,144,144, 7,239, 13, 10,217,240, 56, 41, 57,255,113, 82,242,107,199,121,183, 15,201,252, 52,230,224,124, 30,
+ 95,220, 53,114,129,241, 89,135,245, 81,223,141,248, 39,177, 88, 46,151, 7, 91, 91, 91, 35, 45, 45, 13, 28, 14, 7, 4, 65, 60,
+ 3, 16, 12, 0, 30, 30, 30,207,185, 92,174, 15,135,195,193,214,173, 91, 9, 46,151,219, 41, 60, 60,124,177, 74,165, 58,108,100,
+ 64, 23, 96, 99, 99,211, 64,205,226,243,249,136,138,138,194,228,201,147,245, 36,139,207,231, 99,247,238,221,232,214,173, 27, 52,
+ 26, 77,128,153,229,189, 7,160,143, 25,138, 31, 81, 75,206, 77,146, 81,157, 78, 55,173,228,189,247,218, 33, 62, 30,189,124,124,
+ 58,118,237,218, 21, 20,245, 74,208,244,241,241,105, 37,151,203, 11,148, 74,229,191, 80,147,218,224,161, 81, 82,164, 98,144,157,
+ 81, 19,126,250,224,193, 3,132,134,134,234, 21,172,250,106, 22,159,207,135, 88, 96,221, 44,162,197, 48, 53,207, 37,185, 92, 78,
+198,199,199, 59,251,251,251, 19, 0,224,239,239, 79, 60,124,248,208,209,202,202,170,216,215,215,215,228, 0, 88,108,107,135,221,
+211,198, 3, 0,190, 26, 52, 76, 63, 48, 58,255,245, 98,240,120, 60, 12, 92,176,248,181,235,158, 97, 24, 14, 44,176,144, 44, 51,
+184,200, 95, 69,178, 26, 43, 90,209,209,209,201,209,209,209,175,169, 99,205,132,105, 69,171,190,116,215, 92,212,221,172,134,176,
+113,227, 70,116,234,212,201,104, 71,180,101,203, 22,236,219,183,111, 35,128,140,102, 75,142, 3,187, 4, 98,211,241,100,159,246,
+129, 4, 0,172,252,124, 4, 89, 93, 93,141, 27, 55,110,192,206,206, 14,207,158,153,157,246,203,198,206,206,238,107,146, 36,199,
+113, 26,207, 0,104,154, 96,210, 12,195,196, 86, 84, 84, 24, 76,239,192,178, 0,165,213,161, 90,161,130, 70,163,193,231, 95,254,
+ 96,178, 16,209, 0, 65,105,228,220,136,190,225, 98, 67,138, 78,104,167,126,248,108,138,245,107,157, 55,135, 4, 72, 18,232, 28,
+ 90,163,184, 60,188,155, 12,134, 1,104, 6,112,118,117,192, 47, 7, 54, 24, 37,249, 58,154,169, 29, 29,211,168, 82,211, 8, 8,
+139,196,203,212,120,189,130, 36,224,215,184,140,249, 60, 30, 24,150,168,201,250, 96,136, 8, 9,196,222,101,210, 12,191,157,113,
+143,241,113,100, 39, 28,185,148,136,177,131,130,113,245, 78, 10,250,247,232,136,228,244, 44, 4,250,181,198,214, 93,177, 96, 89,
+200,127,220,180,186,224, 85,135,166,203, 54, 71,209,186,125,251,182,178,177,138, 85,255,157, 53,221, 31,130,101, 95, 41, 90, 74,
+149, 26, 11, 22,153,149,206,167,166,141,250,132,137,205, 57,216,152, 98,101, 14, 17,107,172,108,193, 68,122,150,182, 0,186, 1,
+ 11,255,147, 15, 78,154,166,113,230,204, 25,125,123, 52,213,142,245,219,206, 12,146,131,236,236,108, 36, 39, 39, 35, 44, 44, 12,
+ 21, 21, 21,224,145, 36,230, 63,126,140,142, 83,166, 64,195,231,131, 97, 24, 8, 4, 2,204,152, 49,195,236,250,108,230,211,185,
+ 54,152,155, 54,101,124, 67,120,120,120,187,180,234,106, 36, 63,121,130, 65, 43, 86, 0, 0,206,158, 61,219,224,154,152, 55,111,
+158, 32, 37, 37,229,195,251,247,239,127,152,159,159,191, 17,192,124,131,207, 89, 86,173,143,209,122,111,226, 24,180,243,111,139,
+125,191, 30,208,239,159,247,197, 28,240,120,124,240,248, 60,216,219,217,155,117, 54, 90,173, 86, 79, 90, 21, 10, 5,121,246,236,
+217,150,131, 7, 15,230,207,153, 51,135, 0,128,125,251,246,145,223,127,255,189,228,226,197,139,252, 22, 45, 90, 72, 77,146, 75,
+138,122,173,141, 9,130, 0,143,199, 3, 95,192, 7, 24, 6, 4, 65, 72,214,173, 91,183, 50, 57, 57,185,187,191,191, 63,212,106,
+245, 20,212, 76,212,176,228,209,178,144, 45,163, 92,164,169, 88,171, 90, 85,202, 16,100,245,227,182, 12, 17,181,250, 49, 91,120,
+179, 73, 25,230,197,104, 53, 5, 14,135, 99, 82,173, 34, 73,210,164,235,112,222,188,121,176,177,177, 49,212, 1,177,143, 31, 63,
+ 78,145, 74,165, 59, 1,252,240, 70,141,115, 57, 33,249,235,185,163,228,168,245,173,218,219,219, 23, 15, 24, 48,160, 10, 0,117,
+248,112,195, 1,178, 90,173, 54,216,129,219,217,217,125,253,243,207, 63,207, 30, 57,114, 36,217, 56,197, 64,125,247, 94,221, 75,
+171,213,226,240,225,195,179, 23, 46, 92,136,138,138,138,185,198, 58,113, 69,181, 18,202,218, 64,232,231, 73, 71,204,125,168, 27,
+220,101,109,239,129,150,109,131, 13,118, 38, 36,191, 38,134,200,205,235, 85, 7,102, 99, 35, 2,109,196, 38, 65,144, 25, 89, 57,
+249, 45, 90,185, 59,226,121,174, 12,110,173, 59,161, 44,239, 85, 61,112,185, 28,240,106, 93,135,246,182, 18,200,138,138, 64,146,
+ 28,163,196,120,245,254, 4,220, 73,202,194,209, 75, 15, 65,169,170,177,105,207,121, 80,234, 42, 80,170,106, 80,170,154,247,181,
+ 11, 63, 2, 65,160, 64,171,174,110,223,156,118,231,114,185,232,209,163,135, 65,162,147,151,151,103,166,162,197,234, 21, 45,165,
+170,153,109,100,222,200,201,168, 98, 85,183,255, 77,137, 65, 93,202, 7,177, 88,220,109,247,110,195,105, 28,154,130,187,187,251,
+ 57,107,107,235, 54,230, 30,223,140,228,165,107,237,237,237,191,246,247,247, 15,216,180,105, 19,143,195,225, 96,224,192,129,237,
+221,221,221,179, 1, 32, 48, 48,208,179,238, 25,243,233,167,159,178,183,111,223, 78,170, 25, 99, 24,134, 64, 32,120, 98,103,103,
+215,173,127,255,254,168,168,168, 64,110,110, 46, 36, 18, 9, 58,110,216,128,199,159,126,138,144,237,219, 65, 14, 24, 0,130, 32,
+ 32, 16, 8,240,248,241, 99,136,197,226, 39, 42,149,193,148,111, 61, 0,124, 11,160, 23, 94,185, 11, 89, 0, 55, 80,147,118,225,
+ 78, 19,207, 59, 18, 0,104,134, 49,213, 88, 19, 23, 44, 88,128,114, 30, 15, 24, 62, 28,252,140, 12, 80, 20,133,176,176, 48,189,
+202, 30, 22, 22, 6, 46,151,139,224,224, 96,120,122,122, 98,235,214,173, 19,141, 17, 45, 85, 21,133,236,140,151, 8, 15, 15,215,
+ 43, 87,195,135, 15,215, 43, 90, 60, 30, 79,175,108, 17,180,105,226, 74, 16, 4, 91,127,144, 76,211, 52,193,229,114,185,115,231,
+206, 37,198,140, 25,195,106, 52, 26, 70, 32, 16,144, 71,143, 30, 37,174, 94,189,202,173,174,174, 54, 57, 16, 15, 26, 53, 14, 95,
+ 13,126,171,230,222,111,227, 2, 30,159, 7, 1,159,143, 5, 79, 94,234,219,197,118,247, 65, 65, 76, 76,204, 88,127,127,255, 26,
+ 55, 60,192,181,228,209,178,192,132,208, 35,107, 68,146, 52,245,182,101, 0,136,218,109, 89, 61, 66, 37, 35, 8,226, 30,203,178,
+221, 27, 29, 91,183, 95,211,232,189,110,255,163, 55, 40,126,221, 90,135,175,145, 47, 99, 35,226,244, 91,183,110,249,117,237,218,
+ 21, 57, 57, 57,175,205,132,171,235,184, 36, 18, 9,196, 98, 49,110,222,188, 9, 0,233,134,140, 93,189,122,245,123,212,100, 93,
+174, 41,145,135, 71,120,255,247,250,221, 12, 29,214, 29,251,163, 15, 84, 72,165,210, 96,188,202,161, 67,120,122,122, 78,230, 9,
+184,227,125,130,188, 34,192, 48,223, 94, 62,125, 99,133,177, 51,244,105, 31, 88, 5, 64, 89, 55,235,240, 13,103, 31,130, 36,201,
+113, 35, 71,142, 36, 83, 82, 82, 48,126,252,120,236,219,183,207,224,177,147, 39, 79,198,193,131, 7, 49,114,228, 72,114,209,162,
+ 69, 6,211, 59, 52, 84, 75, 52,127,217, 69,153,246,236, 17,246, 30,252,217, 96, 12,146,171,107, 77, 60, 86, 81, 81,177,254,187,
+238, 93,141,123, 70, 24,157,230, 98,194,253,187,225, 61,251, 14,228,231, 22,150,131,209,169,161,146,191,250,189,162,188, 16,172,
+ 78, 5,190,149, 35,220,157,237,240,224,214,111, 26, 74,163,186,104,204,230,236,145,129,248,116, 68, 0,192, 50, 24, 53,255, 23,
+196,253, 48, 75, 63,130,238, 61,102, 14, 46, 31,254,206,236, 24,191,198,224,241,120,120,252,248,177,210,144,154,197,225,112,204,
+201,201, 85,171, 58,106,161, 80, 40,161, 80,170,254,202,103,135,139,155,155,219,143, 14, 14, 14, 34, 3, 68,202,197,197,197,229,
+ 71, 39, 39, 39,145,185,174, 67, 67, 36,171, 54,175,214,253,105,211,166, 53,139,108, 9,133,194, 54,233,233,233,250,100,165,198,
+222, 53, 26, 13,250,247,239,111,110,242,210,211, 0, 94,120,120,120,220,232,216,177,163,221,243,231,207,113,224,192, 1, 62,143,
+199,243,170,123,126,200,229,114,112, 56, 28, 20, 21, 21,105, 1,124, 0, 19,174, 51,181, 90, 29, 31, 31, 31,223,121,196,136, 17,
+156, 39, 79,158,128,195,225,212,148, 43, 60, 28, 33,219,183, 35,105,238, 92, 68,100,101, 65, 69, 81, 16,137, 68,184,112,225, 2,
+165, 80, 40,226, 13,217, 19,139,197, 59, 51, 51, 51, 3, 69, 34, 17, 40,138, 2,195, 48, 32, 73,146,224,114,185,189,237,237,237,
+183, 0,232,222,168,177, 92, 67,186,247,239, 64,235,116,180, 52,231,185,204, 84, 5,148,148,148,224,244,233,211, 8, 11, 11, 67,
+ 68, 68, 4,242,242,242,144,145,145,129,183,223,126, 91,127,204,163, 71,143,144,144,144, 0, 95, 95, 95,211,138, 30,169,133,111,
+135, 54,224,243,249, 53, 10, 17,143, 95, 59,240,225,233,149, 44, 62,143, 15, 30,151, 7,145, 88,100,182,162, 69, 16, 4, 72,146,
+ 4, 65, 16, 16,139,197,117,131,108,166,101,203,150,210,210,210, 82, 15, 0, 13, 3, 10, 12, 0, 0, 32, 0, 73, 68, 65, 84, 28,
+177, 88, 12,154,166,205, 26,180,212,245, 17,117, 36,139, 47,224,235,149, 45, 0, 40, 47, 47, 87,141, 28, 57,242, 95,106,181,250,
+125,188,217, 10, 37, 22,252,205, 64, 16,196,189,255,196,111,155,129,225,181,196,234,181,160,120, 99, 23,248,219, 61,123,246,220,
+ 62, 97,194,132,129,155, 55,111,134,181,181, 53,164, 82,169,190, 67, 20, 8, 4,104,213,170, 21, 74, 75, 75,177, 99,199, 14,188,
+124,249,242, 10,128, 25,230,150, 72, 42,149,222,126,246, 48,189,164,255,216,158, 78,129, 61, 59,216,231,166,191, 12,147, 74,165,
+ 55,107, 73,214, 47, 19,230,189,253,126,255,209,161,224, 11,120,200,125, 86,128,203,167,111,252,127,105, 76, 14,135,195, 33, 8,
+ 2,227,199,143, 55,235,248,127,252,227, 31,136,143,143,135, 49, 55, 35, 83,167,104, 41, 84,168, 86,254,117,131,181,207,102, 77,
+198,103,179, 38,235,201,132, 57,174, 23, 0,240,244, 60,100,132,104, 81,155,227, 14,237,248,184, 75,104,184,119,183,192, 54,184,
+115,255, 33,246,111,127, 37, 50,236,250,126, 37,190,217,117, 5,173,220, 28, 64,169,171,113,238,200, 79, 5,148, 90,177,249, 13,
+ 69,185, 26,114, 75, 16, 96, 89,166, 89,231, 94, 71,158,120, 60, 30,130,130,130, 12, 42, 90,165,165,165, 74, 83, 29,131,190,141,
+ 52, 90, 84, 85, 43,161, 84,252,101, 68, 43,164,119,239,222, 23, 99, 99, 99,157, 92, 93, 93,145,159,159,223,152,104,133,244,234,
+213,235, 98,108,108,172,147,155,155, 27,114,115,115,205, 78, 43,210, 4,201,130, 76, 38, 35,202,202,202, 24, 7, 7,135,102,145,
+ 45,146, 36,161, 86,171,145,154,154,106,238,223,154, 61, 67,204,206,206,110,247,193,131, 7,237,138,139,139,193,225,112,144,154,
+154,218, 96,214, 97,221,235,151, 95,126,225,143, 26, 53,234,231,242,242,114,163,211,218,116, 58,221,198,201,147, 39,127,152,151,
+151,231,224,234,234, 10,169, 84, 10,129, 64, 0,150,101, 65,244,239,143, 62, 47, 94,128,162,105,136,197, 98,164,165,165, 97,231,
+206,157,213,181,169, 98,154, 20,200, 8,130,240,227,243,249,152, 52,105, 82,131, 29,123,246,236,193, 59,221, 56,221, 92,236,184,
+ 85, 58,136,212,133,226,183,206,113, 56, 28, 34,164,199,128,246, 61,250, 14, 15,122,154,116,231,185,172,240,165,169,135,146, 86,
+163,209,192,223,223, 31,247,238,221,195,165, 75,151, 48, 96,192, 0, 68, 68, 68, 32, 49, 49, 17,191,253,246, 27, 18, 18, 18, 64,
+ 16, 4,156,156,156,234,194, 47,140,198, 96,104, 20, 58, 20,229,151,188,166, 94, 53,222,230,243,249, 80, 43, 41,179,218,232,201,
+147, 39,184,119,239,158, 62,181, 12,135,195,209, 77,153, 50, 5, 44,203,178,153,153,153,176,177,177, 97,167, 77,155, 70,115,185,
+ 92, 93, 94,158,121,241,193,117,164,170,142,100,113,249,188, 6, 4,141, 97, 24,121, 98, 98,226,199, 0, 18,107,149, 44,192,146,
+ 71,203,130,255,219, 56,131,215, 23,150, 54,169,104,189, 0, 48,232,192,129, 3, 19, 79,156, 56,177,113,203,150, 45, 46,145,145,
+145, 40, 43, 43,131,183,183, 55, 60, 60, 60, 16, 23, 23,135,179,103,207, 22,211, 52, 61, 31, 64, 83,210,207, 32, 24,201, 89,147,
+247, 92, 26,171,174,170,250,180,107, 68, 0,174, 28,254, 61,218,221,221,125, 6,135,195,249,124,218,226,119,223,239, 55,178, 59,
+210, 18, 50,113,251,183,199, 40,204, 41, 54,105,179,113, 48,188,189,189,253,135, 86, 86, 86, 2, 0, 84, 19,163,226,198,179, 14,
+245, 54,105,154,166, 53, 26, 13, 14, 29, 58,100, 22,217, 58,112,224, 0, 84, 42, 21,232,215,253,171,122,155, 44,195, 18, 92,158,
+ 16,158,173,252, 65, 81,213, 96,152, 55,158, 80,169,183, 89, 55, 2,125, 46, 16,192,181,184, 24,119,238,220, 49,143,114, 15, 31,
+110,170,141, 84, 26,149,124,210,119,107, 22,196,205,140,250,214,126, 64,207,206,248,106,195, 30, 80,212, 46,144, 28, 18, 98, 33,
+ 31, 93, 67,123,129, 3, 53,126,140,249,162, 92, 81, 89, 54, 9,175, 47,197,211,192, 38,107,204,195,194, 2, 52,195,224,210,245,
+187,102,159,187,190,183,167,105,112,185, 92, 60,123,246, 76,217,212,108, 67, 14,167,198,205, 89, 55, 82, 55,102,147,101, 24,130,
+199, 23,161,149,119, 71,104,212, 85,127, 73, 27,185,186,186,126,113,252,248,113,167,186, 84, 9,137,137,137, 32, 8, 34,245,149,
+226, 88,179, 95,169, 84, 34, 41, 41, 9,137,137,137, 64,205, 12, 55,179,239,163, 58, 37, 75, 38,147, 17, 82,169, 20, 86, 86, 86,
+100, 98, 98,162, 58, 56, 56,248,190,137,251, 91,111, 83,165, 82,101, 25,138,159, 84,169, 84, 45, 68, 34, 17,175, 81, 39,234,217,
+174, 93,187,180, 38, 92,136,175,149,179,162,162,226,206,194,133, 11,187, 14, 27, 54, 12, 95,124,241, 69,169,131,131,131,205,143,
+ 63,254,200,229,112, 56,196,204,153, 51,233,162,162,162,170,159,126,250,201,238,196,137, 19, 40, 47, 47,191,105,198,185,203, 85,
+ 42,213,199, 61,123,246,220,115,254,252,121, 43, 63, 63, 63, 84, 86, 86,130,101, 89,236,222,189, 27, 51,103,206,132, 72, 36, 66,
+ 90, 90, 26,222,121,231, 29,133, 66,161,248, 24,175,199, 78,214,217, 36, 8,130, 96, 25,134,193,178,101,203,244,201, 73,235,146,
+149,218,136, 9,236,156,215, 86, 50,231,167, 10,201,196,175,126,154, 2, 0,180, 78, 71, 63, 77,186,243,124,247, 15, 95, 93,229,
+243,249,215, 77,180,209,146, 57,115,230,252, 56,124,248,112,177,181,181, 53, 74, 75, 75,113,227,198, 13,220,186,117, 11,183,111,
+223,134, 70,163,129,147,147, 19, 28, 28, 28, 32,149, 74,241,228,201, 19, 37,128, 37,198,108, 10,172,120,240,105, 95, 55,243,183,
+ 70,193,226,213,155,109, 88, 95,221,226,243,120,102,221, 71,125,251,246, 69,143, 30, 61,234, 8, 16,157,157,157, 45, 85,171,213,
+ 68, 61,210,159, 87, 71,200,189,188,188,116,251,246,237, 99,141,217,188,189,115, 43,206,175, 90, 2, 1,159,143,249,169,185,122,
+210,181,103, 64, 23,240, 4,124, 4,140, 24, 83,255,183,219, 80,227, 46, 68, 35,146,101,172,239,248,211,247,166,197,230,127,173,
+205,255,203,144,226, 13,150,224,169,195,126,149, 74,117,238,163,143, 62,138, 9, 9, 9,249,104,211,166, 77, 4,159,207,199,138,
+ 21, 43,216,252,252,252, 95,107, 71, 33,101,111, 82, 42,150,101,127,189,118,236,230, 39, 83,163, 70, 18,243, 54, 79,235,125,255,
+114,210,147, 78, 61,253,208,169,167, 31,238, 95, 73,193, 15,139, 15,236,163,181,244,178,130,130,130, 28, 19,166,212,131,122,117,
+104, 28, 12,239, 20,127,245,178, 83,115,103, 29, 50, 12, 19,123,224,192,129,217,163, 71,143, 38,239,222,189,251, 90, 76, 86,221,
+178, 59, 12,195,224,226,197,139,160, 40, 10,191,254,250, 43,195, 48,140,225, 60, 90, 96, 79,126,183, 57,102,234,175,123, 79, 10,
+ 4,124, 2,183,174, 31, 69, 69,153,241, 89, 93,124, 62, 15,191,236, 62, 70,241,249,188,167, 77,237,167, 40, 42,247,242,229,203,
+110, 67,105,154, 71,146,100, 83, 4,170, 73,196,198,198,106, 25,134,201, 54,113,216,205,194,151, 57, 35, 86,127,241,193,129,225,
+239,125,228,214,179,103,111,158,179,171, 27, 8,130, 64, 81, 97, 17,210,146,238,106,207, 29,253,185,176, 90, 97,222, 18, 60, 31,
+172,191,166,143,201, 2,128,200,153, 91,244,241, 89, 0, 48, 98,218, 66,244, 15, 11, 4, 97,142,244,244,138,100, 49, 58,157, 14,
+ 18,137, 4, 58,157,174,201, 20, 15,118,118,118, 98,149, 74,165,172, 77,196,104, 84, 42, 98,129,191,188,141,104,154, 14, 40, 43,
+ 43, 67,117,117, 53,110,221,186,197,174, 89,179, 70, 38,147,201,244, 65,155, 90,173, 54,160,180,180, 20, 85, 85, 85,184,121,243,
+ 38, 27, 19, 19, 35, 43, 41, 41, 89,220,156,123, 72, 44, 22,119,227,114,185,247,203,202,202, 24, 43, 43, 43, 82,171,213,106,131,
+131,131,133, 98,177,216,236, 5,213,165, 82,233, 48, 67,251,124,124,124,210,211,211,211,219,209, 52, 93,127, 13, 68,190, 74,165,
+242,235,217,179,167, 57,207,143, 57,187,118,237,194,177, 99,199, 66, 43, 43, 43, 39,103,103,103,239, 1, 16,202,229,114,241,240,
+225,195, 84,149, 74, 53, 97,244,232,209,187,203,202,202,238,160,102, 9, 30,115,112, 62, 45, 45,109, 82, 64, 64,192,174,175,191,
+254,218, 58, 34, 34,130,235,233,233,137,238,221,187, 35, 45, 45, 13,103,206,156,209,110,219,182,173, 90,161, 80,124, 0,224,162,
+241,102, 7,161,211,233, 32, 16, 8,244, 47,161, 80, 8, 62,159, 15,185,146,197,244, 13, 25, 74, 29,196,202,141, 43, 62, 62,195,
+ 2, 68, 65,110, 70,113, 81, 65,238, 29,130, 32,174, 75,165,210, 10, 3,117, 38, 80,169, 84,157, 89,150,229, 16, 4,177,153,162,
+168,105,179,102,205,242, 88,187,118, 45, 58,116,232,128,226,226, 98, 72, 36, 18,248,249,249, 65, 38,147,225,238,221,187,180, 66,
+161,216, 14, 96, 37,106,227, 71, 12,161,188,184, 18, 45,221,189, 26, 40,159, 44,203,130,165, 1,173,154, 6, 77,177,208, 16, 90,
+240,120, 90,240,249,124,115,148, 39,150, 97, 24,148,121,120,128, 73, 74,194,237,219,183,193,178,172, 65, 85,205,223,223,223,140,
+ 7, 59, 3,129, 80,208,192, 93, 72, 16, 4,248, 2, 1,120, 2,126, 83, 51,103, 44, 42,150, 5,255,211, 48,215, 55, 94, 14, 96,
+198,163, 71,143,246,244,235,215, 47,142,101, 89, 30,106,252,145,191,255,153, 63, 47, 40, 40,120,112,243,204,131, 69,110, 45, 29,
+ 98,222,154,220, 27, 29, 58,123,131,214,209,184,113,246, 33,126, 93,123,226, 96, 94,110,222, 52,152,177,246, 25,195, 48, 87,123,
+117,235, 64,162, 94,174,110, 79, 79, 79,230, 77,102, 29, 86, 84, 84, 44,159, 63,127, 62,190,248,226,139, 55,153,117,216, 36, 30,
+ 63,145,205, 32,192,182, 28,241, 86,159,161, 32, 72, 86,163, 81, 27,121,240, 65,159,185,148,207,231, 61,189,151, 40, 13,110,234,
+ 56,153, 76, 54,244,253,247,223,191,200,229,114,219, 52,167,206, 25,134,201, 46, 44, 44, 28,104,250, 72,221, 13,181,178,210,239,
+244,193, 29,115,207, 31,219, 53,148, 97,104, 95, 2, 0,135,203,127,174,165,168, 11,106,101,229, 38,152,185,168,244,186, 25,225,
+152,243,221,111,216,250,197, 8,204,138, 57,140,159,151, 77,199,162, 13, 7,240,237, 23,115,176,102,203,191,240,213,156, 73, 24,
+ 59,241,125,134, 37,200, 63,204, 61, 15, 14,135,115,126,199,142, 29, 83,167, 79,159,174,159,180,192,178,108,131, 7,187, 86,171,
+ 85, 50, 12,131,237,219,183, 51, 0,206, 27,179,215,176,141, 8,214, 88,188,148,185,109, 84, 89, 89,249, 65,120,120,248,110, 0,
+ 66,150,101,159,149,149,149,253, 19,120,181, 52, 84, 85, 85,213, 7, 61,123,246,220,205,178,172,144, 32,136,215,246,155,131,218,
+ 84, 15,221, 28, 28, 28,238,215, 42, 89,194, 55, 9,136, 55, 86,213, 70,220,138,230,184, 16, 25, 0,179,234,101,124, 95, 27, 26,
+ 26, 90,127, 81,233,212,178,178,178,110,111, 80,174,139, 74,165, 50,112,217,178,101,115, 69, 34, 81,127,133, 66,209, 30, 0, 36,
+ 18, 73,154, 90,173,190,170, 84, 42, 55,193,116,110, 42, 13,195, 48,105, 58,157, 46,200,197,197,165,102, 70,109, 45,217, 2,128,
+ 83,247,233,251, 0,221,189, 70, 20,223,111,118,193,206,158, 61,219,218,193,193, 97, 8, 65, 16, 99, 89,150,245,151,203,229,234,
+101,203,150,221,140,141,141,173,104,211,166,205, 91,195,135, 15, 39, 28, 29, 29,113,239,222, 61,182,164,164,228, 40,128,197, 48,
+ 99,166, 53,195, 48,217,235,214,173, 67,115,239,119, 99,251, 41,138, 42, 56,123,246,172,243,176,162, 34, 46,195, 48, 24, 49, 98,
+ 68, 3, 2,215, 24, 79,159, 62,133, 90,173, 54,154,204, 81, 93, 81,134, 1,115, 23, 2,181,179, 63,235, 80,163,100,177, 96, 53,
+ 22, 94,101,193,223, 11,255,238, 5, 61,205,146, 22, 61, 60, 60,198,139, 36,194,207,188,219,123, 4,231,103, 20,165,200, 43, 20,
+251,164, 82,233, 14, 3, 15,114,179,108, 54, 51, 97,169, 69,254,253, 55,217,124,149, 71,139, 6,203,210, 96, 25, 22, 44,203,128,
+ 97,232,154, 5,175, 89, 6, 44, 77, 19, 4,129, 63, 52, 74,163,153,193, 27,151,211,193,217,217,121, 37,203,178,195, 56, 28, 14,
+ 89, 95, 12,171,255,185, 86,201, 58, 47,147,201,190,106, 66,121,253, 63, 87,159,177,177,177, 77,146,127,115,103, 29,142, 27, 55,
+142,110,230,189,121, 85, 34,145,120, 52,181,175,186,186, 58, 71, 42,149, 14,249, 47,169,207,250, 51, 6,155, 99,179,217,179, 14,
+ 77,217,244,246,246, 22, 82, 20,213, 5,128, 31, 65, 16,246, 0, 74, 41,138,186, 80, 92, 92, 92, 8,160, 27,128,101,181,191, 89,
+ 5,224,254,127,248,126, 23, 59, 59, 59,239, 34, 73,178,165, 57, 63,214,233,116,154,210,210,210,169,141, 6, 4,122,155, 78, 78,
+ 78,247,185, 92,110, 75, 51,236,188, 44, 41, 41,233,102,121,126, 90,108,254, 15,161,113, 16,188,193, 76,241,255, 14,162,101,177,
+105,177,105,177,105,177,105,177,105,177,105,177,105,177,249,191, 78,180,154,220,182, 76,171,181,192, 2, 11, 44,176,192, 2, 11,
+ 44,248,115, 56,211,136,108,157,169,251, 64, 24, 97,165,205,145, 4,223,132,217, 94,178,216,180,216,180,216,180,216,180,216,180,
+216,180,216,252,219,217,180,224, 47,132, 69, 86,181,216,180,216,180,216,180,216,180,216,180,216,180,216,252, 95,135, 65,215, 33,
+105,169, 27, 11, 44,176,192, 2, 11, 44,176,192,130,127, 15,204, 38, 90, 18, 55,255, 0,103,239,224,221, 14, 45, 59, 37, 58,180,
+236,148,232,236, 29,188, 91,226,230, 31,240, 55,173, 55, 49,128,137, 92, 46,247,162,187,187,123, 37, 12, 44,189,243, 63, 0, 91,
+ 0, 99, 81,147,223,103, 20, 0,171,191,210,120, 4,192, 29, 15,124, 54, 5,200,153, 2,228,140, 7, 62,139,248, 31,140, 27, 92,
+ 49,219, 35,252,250,185,137,231, 86,204,246, 8,111,114,255,124, 15,167,219,191,141,251,110,237,103,158,142,127,209, 95,218,184,
+186,186,238,116,115,115,203,114,117,117,205,118,117,117,221, 5,192,206,242,184,179,192, 2, 11, 44,248,183,161, 46, 70,171,238,
+165,143,209,226, 2, 64, 92, 92, 92, 4,128,107, 0,250, 69, 70, 70,198, 55,254,181,131, 87,208,116,223,182,190, 95,172, 94,177,
+152,112,119,117,182,210,209, 12,149,153,149,219,113,249,234,152, 35,249, 2,238,198,178,156,164,159,223,160, 80, 4,135,195, 25,
+ 47, 20, 10, 35, 1,212, 17,182, 84,181, 90, 29, 71,211,244, 33,152, 55, 77, 27,110,110,110,215, 57, 28, 78,235,230,252, 49, 77,
+211, 57,133,133,133,189,223,176, 50,199,121,121,121,237,138,136,136,176, 10, 13, 13,133, 64, 32,192,178,101,203,230, 75,165,210,
+ 77,230, 26,112,112,240,177,161,132,162,207,185, 2,193, 96, 86,171, 9, 98,193, 2,164, 48,137,209,169, 47,243,213,234,141,101,
+101, 25,114, 51, 77, 45, 6, 48,173,182,174,126, 6,176,238,207, 92, 37, 83, 59, 67,171,165,107,174, 9, 62, 23,244,201, 23,118,
+215,150, 44, 89,194,141,140,140,196,207, 63,255,220,123,231,206,157, 31,203,229,242,203, 0, 78, 1,120,254,103,175, 74, 55, 96,
+ 70,207,222,189,191,155, 58,127, 62, 71,121,253, 58,190,219,181,107, 51,106,242, 45,109,109,238,181,196,231, 99,172,179, 51, 47,
+146,101,209,133, 0, 8, 2,120, 40, 43, 97,206, 82, 20,125, 8,102,228, 98, 51,130,137,104, 56, 29,127,127,115, 13, 84, 60,103,
+151, 10, 71, 4,244,169,120,126,117, 41,128,183, 26,239,215,169, 68, 83, 89, 78,171, 72, 37,155,144, 11, 96,195,159,172, 86, 43,
+ 23, 23,151,196,147, 39, 79,182, 12, 13, 13,229, 2,192,253,251,247,167, 68, 70, 70, 14,144,201,100, 65, 0, 42,255, 67, 15, 33,
+ 17,151, 36, 63, 19,240,120,131,105,154,238, 4, 0, 28, 14,231,177, 70,171,189,168, 99,152,173, 48, 51, 39,155, 5, 22, 88,240,
+191, 11, 83, 92,228,191, 28, 6, 51,195,215,157, 28, 91,255,189, 62, 36,174, 29, 58,134, 13, 28,243,180, 66,174, 80,101,101,229,
+149,205,251,108,205,197,143,231,172, 63,177,225,167,184,179,241,119, 82,111, 7,132, 14, 73,145,184,118,232,104,192,180, 33, 31,
+174,151, 88, 44,126,176,109,219, 54, 42, 45, 45,141, 45, 47, 47,103,159, 62,125,202, 30, 61,122,148,253,228,147, 79, 84, 98,177,
+248, 1, 0, 47,115,108,186,185,185, 21, 62,189,242, 27,251, 50, 49,129,205,190,127,135,213,106,181, 44, 69, 81, 44, 69, 81,108,
+202,249, 56, 54,241,212, 49,246,225,209, 67,172, 70,163, 97, 53, 26, 13,171, 86,171,217,182,109,219,230,155, 89,206,198,240, 12,
+ 12, 12,212,196,197,197,177, 71,142, 28, 97,231,207,159,207,134,132,132,208, 0,102,154,123,238, 18, 87,191,254, 54, 45,130,101,
+211,163,182, 82,103,110, 94, 96,147, 95, 60,100,147, 95,164,179,177,151, 82,217,105, 11,182, 80, 54, 45, 66,100, 18, 87,191,254,
+166,206,221,193,193, 33,140, 32, 8,182, 14, 0,216,214,173, 91, 87,213,127,121,121,121, 53,120,181,106,213,170,170, 77,155, 54,
+207,157,156,156,186, 52,101,115, 66, 39,176,108,202,126,150, 77,217,207, 46,233, 11, 54, 57, 57,249, 54,203,178,215,234, 94, 74,
+165,242,218,241,227,199,175,189,251,238,187,215, 0,188, 99,164,158,204,170,207, 41, 64,142,252,228, 73,150,221,180,137,101, 35,
+ 34,216, 84,128,157, 2,228, 52,211,102, 91,119,119,222,195,245,235, 62,214,156, 60,249, 43,123,238,220, 25,246,236,217, 56,246,
+196,241, 93,236,230, 77,159, 81,110,110,188, 36, 0,237,154, 97,147, 11, 96, 13,128,141,168, 81, 46,211,100, 50, 25, 91, 80, 80,
+192, 2, 72,171,253,110,163,139,139,203, 6, 52,173,190, 13,170,175,100,205, 29,230,126,238,189,183,122,179,242,138,124,246,189,
+183,122,179,115,135,185, 55, 80,182,134,249,248,216,204, 26,209, 73,150,124,127, 31, 61,107, 68, 39,217, 48, 31, 31,155, 55,172,
+ 79, 2, 53,235,132,110,187,114,229,138,142,173, 7,173, 86,203,238,217,179,135,118,112,112,248,181, 25, 54,219,187,184,184,100,
+ 59, 58, 58,166,213,255,210, 37,120, 84, 79,255, 62, 83,150, 59,117,124, 55,162, 25,229, 12, 21,241,249, 47, 47, 30,254,145, 46,
+201,121,204,106,148,133,108,197,179, 4,246,101,234,109,118,207,142,141, 90, 1,151,251, 18, 64,232,159,185,150,154, 9,139, 77,
+139, 77,139,205,255, 66,155,198,184,200,255,101,112, 27,159, 96, 99, 8,133,130,168,229, 75, 22, 18,229, 37,229, 74, 85,165, 92,
+163, 85,169, 84, 36,159, 85, 61, 78,121, 81, 68,114, 57,229,115,231,204,182,137, 90,180, 36,170, 26,152,100,230,127,122,133,132,
+132,220, 61,118,236,152,171,163,163, 35, 42, 42, 42, 80, 82, 82,130,187,119,239,130,101, 89,140, 30, 61, 90,216,163,123,247, 46,
+ 75,151, 45,187,245, 50, 47, 47, 28,134, 59,222, 87,228,197,209, 25,235,122,215,172, 69,251, 85, 86, 73, 77,175, 67, 16,216, 57,
+ 46, 82,127,204,202,151, 53,171,101,136, 68, 34,253,130,196,111,128,240,129, 3, 7,242, 1,224,195, 15, 63,172,148,203,229,209,
+181, 10,135, 89, 43,173, 74, 92,253,250, 59,123,120,198,253,184,125,157,184,147,175, 31, 40,173, 14,217, 5,249,224,242,236,209,
+178, 37, 31,239, 79, 26,204,235,219,211,209,121,205,170,157,103, 10, 24,140, 82, 20,167, 95, 48,100,203,222,222,126,207,161, 67,
+135,112,248,240, 97, 0, 64, 90, 90, 26,252,252,252, 36,166,202,144,148,148,228,243,206, 59,239, 28, 44, 41, 41,105,103,234,216,
+198,137,241,133, 66, 33,122,247,238,141,142, 29, 59,226,228,201,147,253,106,149,173, 63, 5,229,245,235,176,126,244, 8,136,127,
+163,193, 75,219,174, 93,189,111,159, 61,179,207,249,204,217, 84,108,216,176, 11,207,159,215, 8,109, 62, 62, 62,152, 56, 97, 28,
+239,241,227,155,129, 99,199, 78,188,249,251,239,207,123,215, 18, 37, 83,248,250,167,159,126, 90,220,166, 77, 27,140, 29, 59,118,
+ 92, 96, 96,160,187,173,173, 45,118,236,216, 1, 15, 15, 15, 31,141, 70,243,236,228,201,147,158, 5, 5, 5,152, 61,123, 54, 10,
+ 11, 11,231, 27, 50,212,111,104,191,165,194, 17, 1,125, 58,116,157, 10,107, 91, 15,252,116,224, 16,158, 62,216,211, 71, 77,165,
+ 46,229,211,241,147,149,172,112,154, 44,199, 58,170,117,183, 8,167,118,129,239,192,187,107,130,179,138,254,253,197,210,193,109,
+ 99,184, 34,213,158, 21, 27,164, 37,175, 25, 29, 27,203, 9,170,124,226,152,116, 17, 37,192, 10,166,142, 96,233,213, 90, 22,239,
+244,237,219, 87,223,112, 89, 89, 89, 80,171,213, 8, 8, 8, 32, 53, 26, 77,127, 51,235,181,253,144, 33, 67,254, 56,123,246,172,
+ 83,251,246,237,101,165,165,165,250, 29,238, 78,246, 67,227,143,109,158,189,230,187,127,249,239,101,137,114, 89,234,137,199, 38,
+108,133,246, 10,235,122,233,220,177,125,214, 68, 85, 46, 4,246,197, 0, 83,130,140,131,191,128,176,114,196,248, 79,230,113,251,
+ 15, 28,208, 98,240, 91, 99, 46, 61, 77,127, 62, 16,192, 61,203,184,222, 2, 11,254,214,170, 22,251,191,118, 78,122,162, 21, 25,
+ 25, 73, 52,117,130, 12,203, 4,187,185, 58,137, 55,175,223,125,143, 67,105, 52, 18,123, 59, 13,207,206,150, 33,108,236, 56,148,
+ 70, 91,229,237,227, 45, 96, 88, 38,216,128,253,198, 83, 60, 9,177, 88,124,236,212,169, 83,174, 60, 30, 15, 12,195,192,197,197,
+ 5,153,153,153, 40, 47, 47,135, 92, 46,199,243,212, 84,180,241,106,133, 21, 81, 11, 61,102, 47,140, 58,166, 80, 40,186,161,161,
+ 27,241,181,105,163,180,182,225,186,209,117, 75,176,188, 54,228,175,253,174,137,125,230, 78, 69,205,204,201,201,129,181,181, 53,
+130,130,130,172,111,220,184,241,187, 17,146,213,192,166,131,131,143, 13, 35, 20, 28,222,246,227, 50, 49,165, 77, 66, 74, 70, 41,
+ 58,180,233, 3, 55, 39, 47,228,151,106,112,251,238, 41, 36, 37,238,135,111, 11, 47,204,252,100,128, 40,102,221,145, 67,124, 93,
+ 27,175,242,242,204,202,166,108, 86, 86, 86, 90,183,109,219, 22, 94, 94, 53,235,158,209, 52,141,148,148, 20,208, 52,173,223,174,
+255,190,251,232, 21,232, 42,179, 49,117,202, 20,148,148,148, 88, 55,101,147,199,129,110,222,199, 19,185, 98, 30, 32,144, 56,106,
+170,170,170,244,203,112, 80, 20,133,135, 15, 31, 34, 60, 60, 60, 34, 54, 54,214, 20, 43, 50,171, 62, 41,224,219,239,126,253,117,
+203,164,138, 10, 18, 0,126, 38, 8,134, 98,217,111,205,189,150, 92, 93,121, 71,207,159,219,235,204, 33,159,192,209,238, 27,220,
+189,155, 13,138,170, 41,111, 73, 73, 17,102,125, 86, 9, 62,207, 6, 39, 79,254,203, 41, 32,160,247,209,130, 2, 42, 8, 13,221,
+136, 77,149, 83,116,238,220, 57,204,154, 53, 11, 41, 41, 41,158, 28, 14, 7,119,238,220,129, 88, 44,198,250,245,235, 57, 1, 1,
+ 1,158, 18,137, 4,231,207,159, 71, 97, 97, 33, 97,172,156,215, 46, 92, 91, 93,241,252,234,210, 2,226,252,176,159, 14, 28,194,
+ 71, 19,198,195,157,205,248,221,206,151, 88, 61,100, 68,175,175, 88, 78,171, 72,137, 77,176,131, 95,208, 8,240, 5,214,152,249,
+229, 74,164, 37,157,118, 80,200, 19, 63, 35,232,220, 86, 43, 54,196,206,121,173,156, 71,198,209, 31,238,191,209,245,162,215, 61,
+239, 71, 15, 63,190, 35, 77,216,153,248,138,104,249,112, 9,146,182, 3,106,150, 79,121,246,236, 25,158, 63,127, 14, 46,151, 11,
+165, 82, 9,157, 78,215,100, 57, 61, 61, 61,103,232,116,186,175,106,219,121,183, 72, 36,250, 96,223,190,125, 78,245,137,182, 75,
+240,168,158, 78, 54,146,129,133, 69, 37,101, 55,239, 37, 63,157, 55, 99,108,191,235,183,147,114, 41,222,187, 57, 21,137, 39, 43,
+ 12,212,167, 72, 44, 16, 28, 61,127,252, 95,214,218, 23, 87, 32, 9,232, 7,158,181, 31,104,109, 30, 20,101,213,144, 63,151, 66,
+253,227, 15,232,252,217, 92,156, 62,113,196, 58,176, 83,183, 88,181, 86,235, 7, 64,243, 6,247,102,115, 96,177,105,177,105,177,
+249,223,105,211, 32, 23, 97, 89,182, 43, 0,183,218,205,146, 90, 94,224, 12,160, 24, 53,171,200,184,213, 62, 59, 4,245,126,214,
+120,187,254,177,141,183,235,127, 46,169,253,236, 90,251,126,143, 32,136, 82, 19, 69,247, 64,205,210,132,103,106,223,129, 90, 87,
+162,201,192, 99,130, 32, 43,105,154, 17,242, 93, 92, 85, 31,190, 55,176,211,111,151,238, 63,180,114,182,229, 14,237,215, 37,226,
+238,227, 23,183, 8,146,208, 18, 4,105, 86,220, 7,135,195, 25,191,121,243,230, 78,182,182,182, 96, 24, 6,118,118,118,144,201,
+100,208,104, 52,168,168,168,128, 90, 94, 9, 74, 94,137, 71,185, 89,232, 21,209, 15, 99,134, 13, 9,248,215,137, 83,227,105,154,
+ 62,104,204,174,103,112, 23,189,146,181,178,181,211, 43,105, 34,183, 92, 79,186,190,233,226, 7,190,181, 53, 6,207,139,250, 51,
+215, 64,194,153, 51,103,206,141, 30, 61,250,173, 5, 11, 22,144, 82,169,244,124,102,102,102, 47, 0, 41, 38, 73,133, 80,244,249,
+167,159, 71, 58, 56, 88,179,136,189,120, 10,125,187, 76,128,149,128,131,146, 74, 10, 4, 1,164, 38, 31, 3, 65, 56, 34, 49, 77,
+138, 62,157,109, 49,100,104,128,245,137, 35,169, 11,240, 42, 62,232,181,166, 41, 43, 43, 67, 81, 81, 17,180, 90, 45,180, 90, 45,
+198,142, 27,135,189,123,246,160,186,186, 26, 74,165, 18, 26,141, 6, 52, 77,131, 36, 73, 92,140,139, 69,238,139, 84,244, 12, 15,
+ 7, 12, 44,189,180,231, 33,120, 0,110, 63,125,250, 20,169,169,169,120,249,242, 37, 68, 34, 17,220,221,221,177,114,229, 74,168,
+213, 53,107,148,141, 27, 55, 46, 2,192,227, 63,123, 67, 61, 7,118,102,210,244,210,183,142, 31,119,189,113,252, 56,115,251,244,
+233,151, 66,185,124,135, 57,191,229,243, 49,118,221,183,159,116,144, 72, 36,120,153,179, 25,254,254,124,204,159,235,132,232,111,
+138, 1, 0,179,103,181, 68,247,110,206,168, 44, 63, 2,103,215,197,216,178,101,142,239,180,105, 27,167, 40, 20,244,110, 19,166,
+151,158, 58,117,106,140,159,159, 95,139,132,132, 4, 66, 32, 16, 64, 44, 22, 67, 44, 22, 67, 36, 18,161,168,168, 8,153,153,153,
+236,186,117,235,242, 0, 44, 53,102,104,197, 22,233, 45, 0,111,205, 29,134,115, 79, 31,236,233,211,130,243,226,209,152,153,189,
+179, 18,111, 39,200,127,187,120, 99,149, 78, 37,202, 45,127,121,105, 97,219,238, 9,206,159,125,241, 53,126, 88,183, 28, 79,239,
+ 92, 47,117,243,170,220, 42, 38,212, 77,150, 51, 34, 98, 5,215,195,205, 81, 55, 99,218, 24,251,211,110, 55,103,156,229, 18,178,
+130,226, 7,235,145,153,160, 20,182,235, 50,185,189, 15,169,185,114,229,138,184,111,223,190, 80,169, 84,122,101,114,223,190,125,
+140, 78,167,187,218,228,181, 73, 81, 95,229,229,229,121, 40,149, 74, 12, 27, 54,108,246,250,245,235, 37,117,107,212,209, 52,221,
+ 64,201, 90,189,105,239,133,207,191,218,122,245,194,193,111, 60, 87, 71,125,208,111,210,204, 53, 87, 97, 96, 29, 73, 46, 73,126,
+118,250,248, 46,119,145,131, 22, 98,199, 33, 80, 21, 42,241,116,231, 71, 80, 84,170,208,125,245,215, 0, 4,208,104, 73,236, 24,
+ 49, 22, 60, 39, 79, 44,159,254,129,231,146, 29, 63,125,194, 48,204,102,203,184,222, 2, 11, 44,104, 4, 55,130, 32,226, 0, 32,
+ 42, 42,106,113,116,116,116, 50, 65, 16,113, 44,203, 70,214, 10, 40,113, 44,203, 70,214, 29, 83, 75,206, 94,219,174, 59,182,241,
+118,227,207,139, 22, 45, 10,140,137,137, 89, 27, 30, 30,126,240,230,205,155, 47, 0,152, 34, 90,195,107,137,213,107, 75,239,144,
+117, 12,178,254,123, 3, 69,139, 97,174, 63,123,145,165, 24, 50,168, 71,203,184,248,199,247,222,127,127,248,192,241, 35,250, 14,
+205,204, 41, 73,245,245,118,119, 78, 78,126,108,203, 48,204,117,115,106, 73, 40, 20, 70, 14, 24, 48,128, 91, 86, 86, 6, 43, 43,
+ 43,200,100, 50,228,229,229,129,162, 40,168, 42,202,161,174, 40,135,170,188, 12, 84, 69, 25,158,223,191,139, 96, 95, 31, 97,109,
+176,188, 81,212,169, 46,141,149,170,250,202,150,192,198, 6, 66, 27, 27, 16,205,119, 27,190,107,111,111,127,187,174, 83,165, 40,
+234,179,133, 11, 23, 22, 51, 12,131, 53,107,214,216, 90, 91, 91,199, 2, 16,154, 50, 98,227,194,137, 12,239, 28, 68, 62,201, 76,
+ 68,239,144,169,104,223,246,109,100, 22, 42, 81, 44,167, 80, 84, 78,161,123,223,239,209, 58,228,107,180,234, 28,141,212,236, 82,
+120,182,240, 35,193, 21, 26, 93,252, 57, 55, 55,183,193,246,193, 3, 7,160, 80, 40,224,235,235,139, 9, 19, 38, 96,225,194,133,
+152, 48, 97, 2, 60, 61, 61, 49,233,189,119,176,124,249,114, 20, 20, 20,152, 42,170,186,125,251,246,106,111,111,111,181,183,183,
+183,154,162, 40, 84, 85, 85,161,188,188,188,113,125,207,105,110, 69,186,186,186, 46,114,119,119, 79,116,117,117, 77, 22, 10,133,
+103, 31, 18,196, 19,149,183,183, 91,175,145, 35,137,142,239,189,199,201, 22,139,137,120,192,218, 28, 91,206,142,188,225,253, 7,
+188, 37, 40, 47,219,165, 23,169, 62,120,223, 5,127,196, 7,226,198,239,221, 48,235, 51, 95, 16,164, 8, 4, 41,128,162,250, 10,
+122,132,134,243,237,237, 9, 83,215,210, 68, 0, 15,123,245,234,229, 57,115,230, 76, 66, 40, 20, 98,246,236,217,212,244,233,211,
+211, 39, 76,152,144,126,249,242,101,218,219,219, 27,173, 90,181, 34, 90,181,106,229, 1,224, 97,237,111,140,194,214,151, 88,173,
+166, 82,127,183,247,147,188,160,225,220,179, 74, 43, 28,187, 98,131,180,100,245,182, 23, 27, 50,159, 42,124,158,222,185, 94,146,
+158,116,154,201,188,119,173, 56, 63, 93,238,179,122,219,139, 13,139,183,230, 55,121, 83,199,199,131, 57, 22, 23, 79, 41,170, 21,
+220,145, 35,250, 43,102,124, 56,190,189,163,117,224, 62,180, 24, 18,210,218,171,229,164,229,107,183, 80,211, 63,249,156,250,249,
+151, 93,172, 92, 46, 71,101,101, 37,182,108,217,162, 59,125,250,116, 30, 77,211,159, 27, 26, 3, 1,128, 86,171,197,140, 25, 51,
+ 36,182,182,182,200,205,205,213, 43,162, 0, 32,149,149, 60,190,113, 47,233,201,188,127,142,139,168, 86,171,213, 23,174,221, 79,
+237,232,231,221,146, 32, 88,131, 19, 81, 4, 60,222,224,110, 61,122,112, 88,182, 28, 4,215, 11,207,247,172, 67,101, 65, 41, 42,
+139, 74,193,225, 73,160,131, 16, 90, 70, 0,251,224, 80,164,221, 75, 64, 11, 23, 55,174,144,199, 27,106,233, 79, 44,176,224,239,
+ 9, 99, 92,164, 62, 89,138,137,137, 89,107,108,127,189,119, 77,163,109, 61,145,106, 76,194,234,127, 6,128,152,152,152,181, 44,
+203, 70,222,188,121,243, 0, 0,165,153,167,240,113,189,119,243,243,104,113, 84,154,232, 5, 11,151,194,193, 78,108, 23,218,197,
+207,253,228,249,248,251,215,111,222, 79,109,221,202,217,133,213,106, 28,190,221,248, 67, 75, 66,161,140, 49,179, 16, 1,206,206,
+206,160, 40, 10,207,158, 61,195,203,151, 47, 65, 81, 20,116,213,213, 80,151,151, 67, 85, 86, 6,186, 90, 14, 62, 77, 67, 41, 43,
+130,147,149, 8,120, 53, 35,209,132,242, 70, 52, 73,180,234,222, 69,182,182, 16,218,216,130,228,241,154,116, 43, 26, 64,215,208,
+208,208,195, 73, 73, 73, 61, 6, 13, 26,180, 10, 53, 83,228,179,243,242,242, 6, 46, 91,182, 76,237,230,230,134, 25, 51,102,116,
+ 0, 48,213, 36,201, 20,104, 2,188,221, 59,160,189,207, 84,180,110, 53, 0,229,213, 90,200, 42,181, 40, 42,167,176,227,251,112,
+ 28,253, 57, 20,127, 28,237,131,164, 11,131, 81,174,117,135,181,231,187, 96,105, 77,160, 49,155, 23, 47, 94,196,202,149, 43,177,
+106,213, 42,172, 89,179, 6,171, 86,173, 66, 94, 94, 30,130,130,130,144,147,147,131,115,231,206, 65, 42,149,194,217,217, 25,119,
+239,222,197,166, 77,155,240,199, 31,127,152, 60,233, 58,226,106,198, 49,205,242,165,235,116,186,105,210,145, 35, 59, 21, 58, 58,
+118,236,210,165,203, 91,179,103,207,246,233,213,171,151,126,191,143,143,143,151, 88, 44, 46, 64,205, 12,202,206,198,108, 49, 64,
+ 23, 23,151, 32,104,212, 79,106,219,152, 7,130, 16, 97,192,224, 84,244,234,115, 31,148,150, 15,146, 16,130, 36, 69,208,233, 74,
+224,224,224, 9,150, 37,130, 76, 20,113,153, 76, 38,243,187,116,233, 18,153,153,153, 9,145, 72, 4, 0, 89, 43, 86,172,248, 97,
+195,134, 13, 41, 78, 78, 78,116, 92, 92, 28, 78,156, 56,129,200,200, 72,206,244,233,211,253, 90,181,106,181,221,212,121,175,216,
+ 34,189,181,127,227,185,127,240,180, 14,157, 69,226,214,109, 80,109,253,238,167, 17,206, 18, 0, 56,159,145, 33,119,245,170,140,
+169,150, 39,230,216,183,172,250,230,124,134,169, 25,167, 43,152, 7,233, 79,110,239, 63,126,190,162,168,176,140,215,165, 83,160,
+ 50,122,229, 23,252,214,109,218,125,187,124,225, 63,221,243, 42, 69,229,131,103,159,123,114,236,252,221,170,201,239,127,164,251,
+240,227,153,170,115,231, 47, 30,103, 24,166, 19, 12,204, 56,100, 24, 6, 82,169, 20,201,201,201,200,200,200,128, 76, 38, 67,113,
+113, 49,228,114,185,222,221,104, 37,175, 60,243,195,175,167, 31, 73,196, 98,171, 30,157,252,188,238, 36,164, 20, 73,196, 98, 43,
+191, 54, 94,237,129, 21, 77, 62, 71,104,154,238, 36,178, 18, 3, 32, 80,158,116, 29, 85,101, 85,168, 42,175,130,188,180, 10,106,
+138, 3,149,154,132, 82, 67,194, 59, 98, 8,170,170, 85,168, 42,169, 0, 67,211, 33,150,238,198, 2, 11, 44, 48,210,215,199, 69,
+ 69, 69, 45, 54,243, 88,179,221,155,141,137, 87, 84, 84,212, 98,130, 32,226, 22, 45, 90, 20, 8,195, 19,170,234, 99,103, 19, 47,
+ 0,102,164,119, 40, 41, 73,175,178, 33, 2, 70,207,253,242,171,115, 7,126,249,222, 85,173, 86,228, 56, 57, 88,211,214, 86, 2,
+231, 15,103,172,129,188,170,108, 84,181,249,233, 8, 80, 86, 86,134, 23, 47, 94, 64, 44, 22,131,207,227,129, 86, 42, 65, 43,171,
+161, 44, 43, 1, 73,169,193,167,105, 56, 90,137,225,237,233,142,214,110,238,102,217,124,118,229, 55,125,224,123,125,119,225,186,
+208, 0, 8, 36,214, 16,216, 88,227,211,184,107, 0, 0, 62,159, 15, 44, 91,101,150,104,210,162, 69,139, 83,251,247,239,231,203,
+100, 50, 60,124,248,240, 17,128, 10, 0, 54, 0,152,212,212,212, 75, 73, 73, 73,145,126,126,126, 0,224,107,202, 88,101, 49, 73,
+107,117, 44,114, 11,178,144,249, 50, 1,142,118,109,193,179,106,143,162,114, 10, 66,113, 91,104,213,175,188,143,170,202,108, 40,
+ 41,142, 89,231,174,209,104,160,211,233,160,211,233,160,209,104,240,241,199, 31,227,198,205,155, 56,120,226, 50, 94, 60, 79, 67,
+135, 54,238,152, 50,101, 50, 66, 67, 67,113,243,230, 77,163,182,166,118,134,182,133, 53,184, 27,223, 34, 33,176,118, 82,135, 45,
+188,112,199, 20,217, 34, 8,130,133, 1, 87,100, 35,108, 8, 15, 15,111,151, 86, 93,141,228, 39, 79, 48,104,197, 10, 0,192,217,
+179,103, 27,156,203,188,121,243, 4, 41, 41, 41, 31,222,191,127,255,195,252,252,252,141, 0,154, 14, 54,103,129, 51,103,110,225,
+159,255, 76,129, 76, 38, 3, 0, 28, 58,240,138,151,102,190,160, 48,108,120,141, 71,203,222,222, 30, 27, 55, 6,153, 85,159, 52,
+ 77, 99,231,206,157,122,119, 33, 0,112,185,220, 94,243,230,205, 27,221,212,241,237,218,181,227,155,178, 57,119,108, 11,209, 31,
+143,216,207,236,218,181, 14,180,117, 14, 70,137, 54, 33, 40, 33, 79, 58,107,238,216, 22,155, 55, 29,201, 83,137, 9,245,110,130,
+206,109,197, 21,169,246,152, 83,198,140,243,223,107, 74,188,167,237, 41,144, 85, 46,153,249,209, 68, 39, 91,123,215,234,159,127,
+136,118, 32, 57, 36,123,234, 62, 85, 30,232,227,100,255,110,216,119, 85,255,156,187, 44, 65,163,203,157,137,220, 83,105, 48,146,
+226,130,166,105,228,231,231, 67, 38,147, 33, 39, 39, 7,197,197, 53,238,215,226,226, 98, 48, 12,243,103, 30,136, 80,230,228, 32,
+251,248,207,104, 61,121, 50,186,175, 90, 9,154,225, 66,169,160,177,177,231, 64,148, 85, 40,161,102, 8,120,118,237,137,143,206,
+254, 14,146,165,129, 29, 91, 45, 61,137, 5, 22,252, 77, 97, 78,122,135, 58, 66, 20, 29, 29, 29,249, 87,255,127,125,178, 21, 29,
+ 29,157, 28, 29, 29,221,156,255,106,236, 50,212,111,215,197,104, 93,171, 23,128,246, 90,167, 41, 47, 78,205, 72, 73,225,230, 87,
+ 43,171,173,220, 92, 93,212, 86, 34, 33, 83, 81, 41,231, 36, 60,126, 68, 85, 23, 60,127,218,140,243, 72, 77, 74, 74, 10,202,207,
+207, 71, 78,118, 54,116,202,106,144,106, 13, 88,149, 2,131,122,247,132, 8,128,136, 36,192,103, 40,112, 57, 2,200,171, 42, 1,
+ 32,213,100,231,168,213,190,166,108, 17, 4, 1,129,141, 13, 4, 18, 9, 4,214, 54, 13, 20, 46,115, 20, 27,161, 80,184, 63, 54,
+ 54,214,163, 69,139, 22, 88,185,114, 37, 90,182,108,233,239,233,233,169,176,179,179, 19,187,185,185,161, 99,199,142,232,217,179,
+ 39,206,157, 59, 7,152,145, 83, 74,171, 19, 37, 62,205, 66,175,226,210,155,248,253,218,143,208, 40,213,232, 18,241, 35, 40,219,
+ 62, 66,105, 0, 0, 32, 0, 73, 68, 65, 84,110,107,184, 4,126, 13,230,217, 62, 40, 10, 78,214,168, 7,238, 35,240, 50, 39, 11,
+ 4, 71,144,108,174,242, 84,247,249,209,163, 71, 56,112, 50, 30, 30,222, 1,200, 73,127,130, 39, 87, 47,225,134,139, 19,188, 3,
+ 58,234,221, 64, 6,203, 72,131,187,122,107, 77,154,168,165,159, 77, 20,150,150,150, 10, 29, 29, 29,213,117,117,231,225,225,241,
+103,200,214,196, 5, 11, 22,160,156,199, 3,134, 15, 7, 63, 35, 3, 20, 69, 33, 44, 44, 12,221,187,119, 7, 0,132,133,133,129,
+203,229, 34, 56, 56, 24,158,158,158,216,186,117,235, 68, 67, 68,139, 36,240, 80,167, 43,241,247,241,241,209, 19,173, 61,123,101,
+ 72,184, 63, 24, 4, 4,216,242,195, 51,253,177, 94, 94, 94, 40,144,102,128, 32,216, 36, 19,101, 92,229,238,238,190,204,195,195,
+195,103,195,134, 13, 28,145, 72,132, 79, 62,249,164,109, 85, 85, 85,235, 90, 41, 25,139, 22, 45, 2, 0, 44, 95,190, 28, 43, 86,
+172,128, 90,173, 86, 24, 50,182,103, 99, 39,207,162, 82,230, 67,182,202,106, 84,127,231,214,157, 6, 12, 29,132,182,126, 3, 48,
+ 96,104, 14, 0,172,117,228,102,189,247,237, 18,251,227,246, 54,196,174,223,206, 95, 92,222, 59, 98,192,146,133, 85, 87, 87,127,
+179,179,220,100,204, 99, 69,246,110,249, 83,193,248, 77,223,111,223,187,233,171, 69,115, 68, 57, 50, 77, 89, 94, 25, 91,101, 45,
+228, 90,251,186, 17,214,179,190, 92,245, 34, 63, 63, 99, 62,114,207,155,156,105,201, 48, 12, 50, 50, 50,244, 49,125, 42,149, 10,
+213,213,213,200,205,205,213, 95, 51, 74,137,237,176,153,239,143, 8,169, 86, 42, 21,119, 30,167,231, 44,157, 61, 41,188, 90,169,
+ 84,164,103,230,164, 1, 91,154,100, 99, 36, 73, 62, 86,200, 21,131, 20,229, 42,200, 30, 62, 69,203,129,222,208,234, 8,104,116,
+ 52,100, 37,114,168,117, 0, 77,242, 16,248,222, 20,208, 4, 23,197,249,121, 32, 57,156, 71,104, 24,180,111,129, 5, 22,252,125,
+ 96,148,139,212, 41, 90,225,225,225, 7,235,171, 78,117,159, 1,168, 97, 60,148, 71, 86,159, 76,213,185, 19, 13,253, 79, 35,187,
+230,226,181, 24, 45,147,233, 29,234,254,179,149, 93,165,231,186,229,147, 90, 50, 58, 93,135,162,226, 66, 29,151, 43,228,181,178,
+ 83, 74, 75,115,204,255,119,181, 90, 29,119,233,210,165,145,131, 7, 15, 22,166, 63,126, 4, 77, 69, 5, 52, 21,229,224, 49, 58,
+ 56,138,187,129,164,212, 32, 52, 26,180,240,103,160,146,139, 17,127, 35, 73,171, 86,171,227,204, 37, 90, 36,135,211, 48, 46,203,
+218, 26, 66, 27, 91, 8,173,173, 27,187, 22, 77,145, 2,171, 33, 67,134, 12, 12, 11, 11, 3,203,178,216,185,115, 39, 40,138, 18,
+ 80, 20, 5,141, 70, 3,138,162, 80, 89, 89,137,189,123,247, 98,219,182,109, 55, 0,252,106,178, 51,211,105, 46, 93,184,120, 37,
+244,131, 73,145,188,179,113, 27,161,211,208, 80, 18, 45, 81, 93,173, 69,149,198, 10,180,211,100,160,240, 12, 56, 92, 17,194,131,
+219,226,228,145, 99, 20,116,234,203,102,178,240, 6,170, 80,110, 78, 22, 94, 62, 79,131,117,101, 1, 92,108,173,160,200, 72, 67,
+151, 41, 83,223, 72,157,104,213,170, 21, 24,134, 65,255,254,253,245,193,213,111, 74,182, 74, 74, 74,112,250,244,105,132,133,133,
+ 33, 34, 34, 2,121,121,121,200,200,200,192,219,111,191,173, 63,230,209,163, 71, 72, 72, 72,128,175,175,113,145,176,184, 84,123,
+246,101,238,195,113,239,190,251, 46,255,246,237,219, 96, 89, 22,126,126,182,176,181,145,128, 32,133, 8, 8,112, 5, 80, 51, 6,
+232,215,175, 31, 42, 43, 51,116,101,101,236, 89, 19,167,187, 31,192, 9,141, 70,243,172,111,223,190,158,207,159, 63,199,220,185,
+115,185,135, 14, 29,170,147,146, 17, 21,213,112, 50,133, 82,105,216,117,223,161,147,255, 23,109,117, 14, 17, 34,113,235, 54,182,
+206,193,104,235, 55, 0, 0, 48, 56,242, 3,180,109,231,133,202,226,196, 54, 42,101,214, 40, 62,183,204, 33,113, 75, 94,138,120,
+120,208,251,170,162,107,233,168,113,157,154,108,118,101,250,161,194, 28,222,228,195, 39, 78,157,155,241,118,228, 59, 60, 45,173,
+211, 5,121,243,236, 99,143,159, 41,202,203,206,249, 14, 57,231,147, 94,233,127, 70, 85, 60,186,178,178, 18, 18,137, 4, 73, 73,
+ 73,234,225,195,135, 11, 73,146,196,179,103,207,244, 68,203,213,217,177, 99,175,238, 65,254,171, 55,237,189, 32, 17, 10,133, 67,
+251,117, 11, 72, 73,207,126,201,178, 68,150, 65,181, 85,171,189,248,248,225,163,254, 46,158,237, 56, 25,215,110,195,169,207,219,
+ 80,171, 73, 40, 53, 12,212, 58, 64,199,225,195,163,115, 15,216,251, 6,128, 5,112,239,246, 13,173, 90,171,189, 96,233,107, 44,
+176,224,111,173,106,177,198, 72, 82,237,231, 82, 0, 89,209,209,209,197,245,212, 38, 25,128, 71, 0, 66,106,143,147, 53,250,157,
+140, 32,136,123, 44,203,118,175,103, 71, 86,143,112,213,255,172,105,116,204,163,102,144,172,250,239, 13,137,150,161, 41,149, 0,
+224,236,236,236,218,165, 75, 55,223,159,126, 57, 12,150,101,241, 52, 97, 61,202,138,158, 96,217,218, 91,190, 45, 90,180,136,200,
+203,203,139, 55,167, 4, 52, 77, 31,218,181,107,215,252, 30, 93,187,116,105,211,178, 37, 30,101,101,130,207,210,224,211, 52, 72,
+ 74, 13, 46,173, 65,203, 32, 26, 36, 97,141,252,252, 10,196,236, 63,156, 84,155, 37,222, 40,252,223,126, 7, 43, 95, 86,128, 32,
+ 8,108, 8, 15,130,192,198, 26,124,137, 53, 62, 61,117, 69, 79,174,226, 86, 46,130,192,218, 26,190, 61,204, 74, 8,175,184,122,
+245,234,253,199,143, 31,119, 15, 10, 10,194,252,249,243,145,149,149, 5,134, 97, 80, 88, 88,168,146, 74,165,121, 50,153, 44, 11,
+192,113, 0, 63,193,140,204,227,124,181,106,115,220,209, 61, 51,195,123, 71, 56,191, 59,106, 27, 78, 28,153,135,242,138, 74, 40,
+116, 98, 84,171,116,168, 86,115,224,232,212, 9, 61,130,131,145,159, 87,132,228,219, 23,170,184,106,197,250,230, 92,160, 4, 65,
+ 32, 33, 33, 1, 62,158, 54, 72,251, 61, 30,206, 86, 60,132,120,186,195,179, 87,111,125,126, 41, 99,224,113,160,155, 56,113,162,
+ 62, 51,252,144, 33, 67, 50, 39, 79,158,236, 49,111,222, 60,252,242,203, 47,184,113,227,198,107, 1,218, 17, 17, 17,184,126,253,
+250,215, 0,150,155, 18,245, 52, 26, 13,252,253,253,113,239,222, 61, 92,186,116, 9, 3, 6, 12, 64, 68, 68, 4, 18, 19, 19,241,
+219,111,191, 33, 33, 33, 1, 4, 65,192,201,201, 9,218, 26,242,172, 53,100,140,162, 16,251,205,183,187, 22,111,218,180, 45,112,
+210,164, 73, 56,122,244, 32, 62,120,191, 3, 8, 82, 8,130, 16,226,157, 17, 29,176,114,213, 61,244,232,209, 15,206,206, 60,108,
+218,120,242,133, 82, 73,239, 53,163, 26, 87,255,246,219,111,158, 42,149, 10,229,229,229,172,181,181, 53, 81, 82, 82, 51,163,181,
+ 41, 69, 75,161, 80,136, 12, 25,122,252, 32,117,125,185,156, 45, 99,171, 18, 70,149,234, 18, 58, 13, 24,154,139,193,145,239,227,
+ 98,220,175,184,114,225, 18, 28,185, 89,153,144,200,207, 21,103, 22, 87, 74,171,253,182, 7,116,157,206,121, 89,125, 97,251,172,
+119,210, 56, 30, 30, 76,236,162, 31, 43,203,141, 17, 45, 0, 68,105,202,190, 83,199, 89,188,211, 51,188, 71,187, 32, 47, 15, 65,
+ 89,113, 17,123,228,228,185, 36, 42,243,232,233,122, 4,139, 53, 65,212, 87, 70, 69, 69,125, 85,251,121,247,210,165, 75,167,199,
+196,196,184, 20, 20, 20,232, 99,180,138,138, 75,175,244, 28, 62,139, 46, 41,175,208,236,218,244,229, 88,177, 72, 40, 88, 26,179,
+235,154,150,131,219,134,236,234, 24,102,235,123,115,151,205, 73,127,154,208,162,181, 88,128,147, 95, 46,199,163,223,174, 66, 75,
+242,241,207, 75,119,160,166,104,148, 23,151,224,242,135,159,193,218,205, 1,219,174, 29, 45,100, 24,230, 71, 75, 87, 99,129, 5,
+127, 95, 24,226, 34, 4, 65, 52,149, 99,175,176,137,239,238, 25,251,157, 1, 59,127, 5, 12,102,133, 55,107, 10, 94,113,113,113,
+209,245,235,119,112, 45,110, 53,226,227, 86, 35, 57,225, 17,242,243, 52,200, 43, 84,193,214,214,246,150,145,159, 54,206, 28,203,
+ 42, 20,138,209, 75,151,125, 85, 32, 18, 91,161,239,192,129,112,119,113,133, 21,159, 7,142,142, 1,135,224,161, 74,102,143,180,
+ 68, 5, 22,238,218, 87, 84,165, 80,140,110,162,147, 24,100,136,100, 16, 4, 1,161,173, 13, 4,214, 54, 16,218,216, 54,112, 35,
+138,108,109, 33,178,177, 5, 87, 32,104, 42, 24,254, 53,155, 85, 85, 85, 99,198,142, 29, 91, 86, 81, 81,129,233,211,167, 35, 62,
+ 62, 62,225,194,133, 11,182,137,137,137, 98,153, 76,214, 14,192, 16, 0, 59,140,144,172, 6, 54,203,202, 50,228,172, 78, 61, 62,
+250,171,207,149, 42,157, 19,198, 77, 61, 4, 9,153, 11, 29,205,128, 5,224,233, 40, 64,175, 65,171, 80,164,233,137, 67,219,215,
+ 40, 24, 74, 53,169, 81, 14,173, 6, 54, 89,150,101,221,220,220, 94,171,131, 75,151, 46, 97,220,216, 49, 24, 58,106, 36, 92,218,
+248,192,117,208,219, 24, 58,253,159,216,190,125, 59, 72,146,132,179,179,115,227,142, 87,111,115,207, 67,240, 14, 60, 6,113,224,
+ 49,136,221, 9,224, 2,152,178,111,223,190,111, 66, 66, 66,174,222,184,113, 99, 61,128,241,245,255,171, 30, 86, 52, 82,179,154,
+106,163, 37,115,230,204, 81,166,167,167, 67, 34,145, 64,167,211,225,198,141, 27,216,182,109, 27, 54,108,216,128,132,132, 4, 56,
+ 57, 57,193,215,215, 23,106,181, 26,247,238,221, 83, 2, 88, 98,196, 38, 35,147,233,198,108,217, 18, 83, 18, 25,217, 7,187,118,
+253, 0,119,247,158,224,113,221,193,229,185, 64, 98,237,143,159,127,250, 6,111,189,213, 5,167, 78, 30, 46, 45, 46,209,141, 1,
+160, 51,227, 90, 82,221,185,115, 7,219,183,111,199,216,177, 99,243,198,141, 27, 71, 87, 84, 84,232, 21, 45,150,101,193,178, 44,
+ 86,212,198,152,169,213,106,161, 33,155, 31, 45, 76,202,251,114, 77,242,202,194,130,188,176,248,171,183, 38, 94,185,112, 9, 47,
+210,175,224,202,133, 75,248,253,202,205,168,194,130,188,176, 46,161,237,249,163,167,207,252, 98,207,177,163, 28,107, 91, 15,236,
+ 57,118,148, 51, 97,214,231,107,186, 13, 29,176,196,212, 53, 95,219,142,108, 85, 81,225,162,181,235,191,175,210, 81, 42,114,221,
+119, 91,243,149, 50,233,146,122,215, 37,107,234,250, 84, 42,149, 59, 84, 42,149,167, 74,165,242, 84,171,213, 75,178,178,178,250,
+206,159, 63, 95, 70,211,180, 94, 45,149,165,156,186,245,228,143,221,107, 93,157, 29,196, 61,187, 7,118,216,184,227,200,181,156,
+220,194,127,213,203,161,213, 84, 57, 85, 85, 74,213,152,145,163, 39, 87,151,151,169, 17,254,121, 20, 24,145, 53,212, 52,160,101,
+ 57,208, 17, 92, 60, 94,189, 17, 98, 71, 27,236,207,124,160,168,208, 82, 99,208, 48,135,150,177,115,255, 51,176,216,180,216,180,
+216,252,239,180,249,127, 25, 30,104,184,214,161, 71, 3, 69,203,212,148,202, 22, 45, 90,244,125,247,157, 65,232, 23,185, 20, 44,
+203,226,201,131,111, 81, 38,123,138, 22,238, 66,100,228, 84,134, 3,136,111, 70, 97,114,178,114,115,195,230, 44, 89,122,108,220,
+144,129, 1, 65,109,218, 8, 91,183,246,134,196,213, 21,197,197, 50,252,113, 59, 69,187,230, 64,108, 82, 45,201, 50,203, 49,201,
+ 48, 76, 77,144, 59,128,129,115, 22,130,224,112,128,218, 52, 14,117, 29, 99,155,238, 61, 65,112,185,160, 89, 6,106,181,218,156,
+217,114, 47,159, 63,127, 62,102,210,164, 73,151,227,226,226,200,161, 67,135,118, 62,126,252,248,159, 89, 51, 15,213, 69,233, 87,
+ 1, 68,174, 89, 52,227, 80,216,128,145,182,126,129,221,248,221, 90,115, 64,105, 9,228,231,101, 35,238,216, 93, 42,229,206,133,
+ 74, 86,167, 26,175, 40, 78,191,106,204, 22, 69, 81, 57,237,218,181,115,219,190,125,187, 62, 24,158,166,105, 20, 23, 23,227,214,
+173, 91,232,212,189, 7, 2,222,255, 16, 50,153, 12, 91,182,108,129,151,151, 23, 70,140, 24,129,210,210, 82,232,116, 58,115, 29,
+190, 52,128, 11,181, 47, 52, 34, 89, 68,237, 18, 64, 70,221,134, 62, 62, 62, 2,149, 74,213,153,101, 89, 14, 65, 16,155, 53, 26,
+205,180, 69,139, 22,121,172, 93,187, 22, 29, 58,116, 64,113,113, 49, 36, 18, 9,252,252,252, 32,147,201,112,247,238, 93, 90,161,
+ 80,108, 71,205, 66,214, 50, 19,229,123,118,247,110,102,216,236,217,159, 30,251, 38,102,134,159, 74,221, 79,224,232,216, 27, 44,
+171,131, 76,150, 5,121,229, 13,106,213,202, 95,159, 23, 22,105, 71, 3, 72, 55,243,156,151,207,156, 57, 19, 0, 68, 0,150,102,
+100,100, 60, 12, 8, 8,240, 51,164,104,153,131, 77, 71,242, 84, 0, 14,140, 25,234, 57,183,178, 56,209,207,145,155,149, 25, 22,
+196,108,217,116, 36, 79,101,235, 89,189,186, 56, 43, 62, 77, 90,125, 97,251,158, 99, 71, 57, 83, 71,141,161, 91, 90,167, 71,137,
+ 92,217, 35,102,152,102, 67, 66, 66, 90, 17, 68,105,219,162,146,167,247, 63,152, 62,227, 61, 59,190,242,108, 72,203, 18, 95,210,
+171,139, 40, 33, 33, 33, 19,205,156, 25, 90,139,180,188,188,188,190,139, 22, 45,186,192,178,108,131,216,132,162,226,210, 43,225,
+145, 51,217,242,242,138,135,178,212, 83,230,228, 82,187,123,247, 65,194,192,160, 78, 93,142,126,179, 54,198,173,223,156,249,220,
+180,171,215, 0, 90,139,236,248,107,160,133, 26,102,227,205,139,133, 21, 20, 53, 10,150,172,240, 22, 88,240,183, 87,179,140,113,
+145,255,114, 12,135,129, 96,120,179, 79,198,167,109,139, 11, 29,252, 90, 15,241,106,233, 2, 0,200,200,204, 71, 70,102,222,111,
+ 25, 47,242,134,154, 96,188,134,166, 87,234, 23,149, 38,106, 83, 56,176,230, 45, 42,221,192,166,147,147,211,125, 46,151,219,178,
+ 57,181, 65,211,116,126,113,113,113, 23, 51,203, 57,161, 77,155, 54, 49,217,217,217,199, 24,134,153,219, 76,182,223,164,205,186,
+ 69,165, 73,174, 96, 16,171,211,116, 2, 0,130, 43, 48,103, 81,233,250, 54, 59, 89, 91, 91,239,224,241,120, 94,117,237, 88, 23,
+131, 69,211, 52,135,162, 40, 17, 77,211, 28, 0, 4, 73,146, 58, 30,143,167, 34, 8, 66,167,211,233,114,212,106,245, 12,188, 74,
+ 56,106,236,220, 77,118,244,181, 68, 11, 77, 40, 90,151, 0, 32, 61, 61,189,189,131,131,195,120,130, 32,198,178, 44,235, 47,151,
+203,213,203,150, 45, 75,136,141,141,173,108,211,166,205,176,225,195,135, 19,137,137,137, 72, 74, 74, 98, 75, 74, 74,142,212,170,
+ 88, 25,205,188,150, 72,161,144,243, 15, 71, 71,114, 56,203, 34, 4, 44, 8,130,196,227,138, 10,230,172, 66, 65,255,171,150, 48,
+ 54,247,250,172,195,196,214,173, 91,255,154,153,153,201, 51,164,164, 26, 58,247,198,248,118, 73,224,210,240, 62,125,198,220,250,
+253,247,227, 95,174, 73, 94, 89,127,223,172,145, 14, 31, 76,248,108,206,183, 7,182,126,247,229,247, 39,202,118,153, 83,206,206,
+157, 59,251, 16, 4, 49, 30, 64, 16,203,178,237, 88,150, 16, 17, 4, 91, 70, 16, 68, 50,128, 68,141, 70, 19,151,146,146,242,242,
+ 79,156,251,155,140,112, 13,217,212, 47, 42, 13,154, 14,166, 1,214,204, 69,165,255,127,151,211, 98,211, 98,211, 98,243, 63,103,
+243,255, 50, 62,110,226, 59,243, 50,195,215, 33,227, 69,222,208,140, 23,121,104,215,174, 29,251,236,217,179,102,145, 52, 67,157,
+ 52, 77,211, 7, 21, 10,197,193, 63, 99,164,164,164,164,219,191,185,242, 14,100,102,102, 30,248, 43, 13,214, 18,169,149,181,175,
+ 55,197,227,170,170,170, 30,230, 30, 76, 81,212,191,163,110,136, 90, 53,235,107, 67, 7, 12, 25, 50, 36,155,162,168, 75, 0,114,
+ 9,130,176, 7, 80, 74, 81,212, 5,157, 78, 87,248,236,217,179,110, 27, 55,110,172,203,124,191, 10,192,253, 55, 44, 7,163, 86,
+211,251,243,243,233,253,255,134,115,220,175,209,104,230, 57, 57, 57,249,170, 84, 42,129, 74,165,226,215,159,124, 32, 22,139,101,
+198, 2,226,235,195,222,134,216,205,231,150, 57,217,219, 16,141,137, 20, 28, 91,224,168,178, 58,169,131, 99, 11, 28, 53,183, 96,
+ 15, 31, 62,204, 8, 9, 9,217, 71,146,100, 27,150,101,221, 0,214,142,101, 33, 99, 89,182,152,251,255,216,187,238,184, 40,174,
+182,123,102,102,103,251, 46,176, 75, 93,138, 5, 20, 68, 64, 1, 11,246,136,154, 24,123,137, 88,162, 98, 47, 49,106, 98,212,168,
+ 81,163,177,198,215,196,158,216,123,111, 81,176,247, 94,177, 43, 86,164, 55,169, 11,203,246,157,249,254,128, 37,168,148, 5, 77,
+222,228,253,246,252,126,227, 58,195,238,217,123,103,231,222,123,238,115,159,251, 60, 28, 78,210,227,199,143,147,254, 65,157,144,
+198,200, 48,139,141, 58,221,159,126,135,214,221,133, 86, 88, 97,197,255, 14,202,244,209,226, 84,150,233,197,139, 23,132,245,126,
+ 90, 81, 82,108,149,247,199,184,184, 56, 45,128,171, 69,199,187,184, 13,160,203, 63,189,130, 41, 41, 41,193,101,253,205, 82,145,
+ 5, 20,250,108, 1, 15, 75,141,206, 62,107, 69,118, 30, 86, 28,152, 84,217,178,221,187,119, 47, 30, 22, 46,177, 91, 97,133, 21,
+ 86, 88,241,151,225,195, 45, 90, 86, 88, 97,133, 21, 86, 88, 97,133, 21, 86,148,138,181, 37, 4,215, 91,214, 45, 2,101,239, 28,
+168,204,218,107, 85,118, 31,156,182,114, 90, 57,173,156, 86, 78, 43,167,149,211,202,249,255,142,243,127, 21,239,137,172,191, 3,
+214,173,175, 86, 78, 43,167,149,211,202,105,229,180,114, 90, 57,255, 63,136,172,119, 15, 0,214,165, 67, 43,172,176,226,255, 49,
+246,238,221,107, 81, 82,209,190,147,215,119,150, 72,100, 51,242,149,185, 11,119, 45, 30,114,208,124, 61, 44, 44,204,100,189,139,
+ 86, 88, 97, 5,170,226, 12,239,233,233,238, 71,154,152,230, 44, 75, 82, 44,201, 26, 8,165,122,247,171,236,236,183,194, 14,120,
+120,120,216,209, 36,186, 16, 44, 43, 38, 8,198,196, 80,228,149,152,152,196,199,149, 40, 24, 79, 38,147,125,205,229,114,219,233,
+116, 58,119,146, 36, 19,181, 90,237,233,130,130,130,149,120, 63,112,225,127, 13, 62, 62, 62,253,206,159, 63,111,215,162, 69, 11,
+173, 80, 40, 52,170,213,106,206,241,227,199,249, 29, 58,116,200,121,249,242,101,149,118, 36,186,186,186,182, 89,191,126,189,103,
+251,246,237, 81,187,118,109, 85,159, 62,125,184, 77,155, 54,229, 14, 27, 54, 44, 38, 57, 57,249,108, 37,233,252, 8,130,216, 74,
+ 16, 4,197, 48,204, 64,252, 25,186,225, 99,131, 36, 73,114, 36, 65, 16, 61, 88,150,245, 34, 8,226, 21,203,178, 7, 25,134, 41,
+ 47,112,107,121,248, 2, 64, 71,146, 36,131, 1,128, 97,152, 59, 0,142, 2,150,239,188,251, 59, 57, 69, 34, 81, 16, 0, 20, 20,
+ 20,220,253, 88,156, 4, 65, 4, 1, 0,203,178, 85,229, 28, 44, 20, 10,135, 3,128, 90,173, 94, 7, 11,210, 65,189, 11,118,181,
+ 47, 27, 60, 59, 26, 0,112,231, 71, 95, 0, 64,101,206,137, 81,209, 68,101,190,171, 52,190,202,112,148,130,142,253,251,247,159,
+191,125,251,246, 31, 1, 28,250, 43, 30,124, 23, 23,143,149,191, 44, 91,235,250,205,215, 67, 23,162, 48, 35, 68,249, 13, 18,248,
+148, 71, 81, 93,117, 38,211,165,199,192, 94, 0, 28,185, 92,222,143,199,227,181,210,233,116, 10, 14,135,147,162,211,233, 46,230,
+230,230,238, 68, 57, 25, 16, 44,190,175, 79, 32,211, 23,192,133, 96,254,204,243,198,146,208,114, 69, 72, 37,234, 34,251, 31,208,
+141,146, 0,198, 23,213,117, 3,202, 14,231, 81, 94,231,243,141,171,171,107, 15,165, 82, 89, 64, 81, 20,139,194, 93,207,133,255,
+ 20,254,157, 96, 24, 38, 61, 43, 43,107, 96, 69, 92,226,106,168,195, 19, 19, 91, 77, 6,168,141, 90,118,180, 42, 1,209, 18, 15,
+ 52, 99,129,129, 44, 80,147,164, 72, 71,134, 97, 82, 0,156, 37,141,136,200, 79,198,139,127,232,224, 94,189,232,190,214, 40, 58,
+167, 1, 56, 3,184, 15,224, 27, 0,249, 86,253,243,183,225, 93,103,248, 35, 0, 82,138,133, 86,137,112,247,173, 59,119,238,124,
+193,211,211,221,175, 87,247,158,243, 71,141, 28, 77, 80, 20,137,135,143, 30,113,190, 28, 56,248, 51,153, 76,230, 38,209,106,235,
+130, 32,152, 2,129,224,161, 82,153,155,180,119,231,118,169,111,157, 58, 38,147,137,193,234, 53,191,119,216,247,199,129,105, 22,
+138, 45, 31, 23, 23,151,173, 83,166, 76,113,233,218,181, 43,229,226,226,130,216,216, 88,187, 93,187,118,213, 89,177, 98, 69,239,
+236,236,236,129, 0,158, 85,161,178, 45, 93,228,228,103, 82, 33,209, 22,121, 38,228, 25,112, 38, 85,141,147, 0, 46, 85,245,238,
+ 21, 20, 20,140, 45, 40, 40, 8,105,212,168, 17,187, 97,195, 6, 98,208,160, 65, 44, 65, 16,132, 90,173,222, 12,160, 74, 66, 75,
+ 44, 22,175,106,223,190,189,183,183,183,247,171,151, 47, 95,118,220,179,103,207,209,240,240,112, 47,177, 88,252, 28,128, 79, 37,
+233, 54,101,102,102, 6,170,213,106,184,187,187,111, 0,208,224, 47,120,136, 8,138,162, 14,186,185,185,177,139, 22, 45, 58, 20,
+ 24, 24,232,156,149,149,101,156, 52,105, 82,187,235,215,175,119, 48,153, 76, 93, 43, 33,182,100, 4, 65,172,113,118,118,118, 88,
+184,112,225,139,134, 13, 27,222,231,243,249,188,231,207,159,139, 38, 76,152,240,237,179,103,207,122,179, 44, 59, 18,168,212, 0,
+ 33, 35, 8, 98,141,171,171,171,195,252,249,243, 99,131,131,131, 31,114,185, 92,238,243,231,207,197,223,127,255,253, 55,209,209,
+209, 85,226, 36, 73,114,117, 72, 72,136,236,199, 31,127,124, 82,167, 78,157,171, 20, 69,241, 18, 19, 19,201, 89,179,102,125,125,
+234,212,169, 48,134, 97, 70, 85,165,156, 78, 78, 78,178, 89,179,102, 61,105,218,180,233,117, 46,151,203,125,250,244, 41, 57,101,
+202,148,175, 95,188,120, 97,113, 57,229,114,121, 40, 65, 16,107, 83, 83, 83, 57, 0,160, 80, 40, 26,219,216,216,172, 40,153,211,
+210, 28,138,194, 96, 48,228,105, 52,154,254, 89, 89, 89,165, 6,194, 29, 52,117,121, 23, 0, 88,161, 55,159, 23,190, 86,116, 14,
+172,142,176,164,210, 65, 46,133,113,241,126, 81, 13,233, 14, 0,253,138, 82,133,255,162, 2, 56, 28, 14, 19,228,242, 13,123, 55,
+181, 82, 33, 99,186,181,105,211,102,214,217,179,103,127,111,221,186,245,247,219,182,109,115, 74, 72, 72,248,249,210,165, 75, 30,
+125,251,246, 29,116,230,204,153, 5, 25, 25, 25,251, 62,214,195,207,227,242,249, 4, 73, 64, 40, 16,217, 88,242,126,154, 36, 59,
+ 95,237,214,109,248,186,167, 79,131, 87, 68, 71,123,170, 20,138,144,113,227,198, 57,247,236,217,147,244,240,240,192,139, 23, 47,
+236,183,109,219, 86,119,221,186,117, 61,114,114,114,198, 3,136,251, 16,145,165,202, 65, 61,173, 14,193, 44, 11,187,226, 6, 75,
+ 32,135,175,199, 29,246, 9, 30,252, 3,196,214,204, 77,155, 54,253,248,226,197, 11, 44, 88,176, 0, 0, 86, 86,242,243, 19,186,
+117,235,214,233,192,129, 3,194,189,123,247, 10, 27, 53,106, 4, 23, 23, 23, 20, 77,166,138, 3, 83,123,122,122, 90,118,207, 24,
+252,178,244,232,144, 6, 15,179,142, 97, 85,207,212, 5, 66,119, 24,155,117,243,238,209,121, 80, 48,108, 29, 69, 16, 72, 56,200,
+201, 84, 6, 60,189,147,208,254,220,158, 23, 63,191,136,122,179, 80, 21,143,153, 40, 59, 38,223,127, 5,246,246,246, 27, 98, 98,
+ 98, 66,197, 98,241, 91,215, 95,189,122, 21,228,237,237,157, 11,224,187,202, 10, 55, 71, 71,199, 29, 12,195,104, 51, 51, 51,135,
+ 2,128, 84, 42,221, 46, 22,139,101, 41, 41, 41,211,254,170,137,140, 25,239,106,145,127,185, 69,171,216, 95,171,180, 92,135, 4,
+105, 98,154,143, 26, 57,154,232,211,175,111,234,139, 87, 49, 12,135,230,245, 59,126,226,132,200,207,207,143,212,174, 92, 9,227,
+155, 55, 48,124,251,109,179,211,167, 79, 27,194,250, 13, 80,211, 20,177,201,203,179,166,104,247,206, 93, 46, 7,246,239,107, 14,
+160, 34,161,197,115,113,113,217,122,254,252,121, 55, 79, 79, 79,228,228,228, 32, 54, 54, 22, 42,149, 10,189,123,247,166,155, 55,
+111,238,214,171, 87,175,173,185,185,185, 45, 42, 97,217,114,174,237,206,137, 28, 57,184,167, 79,135,207,154,139,221, 60,106,129,
+ 77,213, 32,225,101,116,163,200,243,215,199,109,218,127,244,217,139, 92,182, 51, 74,207,141, 84, 46, 50, 50, 50, 38,247,232,209,
+ 99,127,104,104,168, 35,159,207,135,171,171, 43,209,181,107,215,244,228,228,228,217, 85, 86, 45, 69, 41,108, 72,146, 52,149,124,
+ 45, 37, 61,144, 37,112,151,201,100,144,201,100, 0,224,246,161, 51, 79, 59, 59,187,149, 82,169,180,151, 82,169, 84,147, 36,201,
+ 18, 4,193,234,116, 58,161, 76, 38,187,247, 36,250,153,171, 86,171,173,189,120,233,186,101,109, 90, 6,218,156, 58,117, 10, 61,
+123,246,100, 79,158, 60, 57,210,210, 60,117, 4, 65,172,233,209,163, 71,193,140, 25, 51, 52, 47, 94,197,186, 61,121,246,138, 16,
+ 11,120,140,131,131, 3,125,243,230, 77,206,146, 37, 75, 4,179,102,205, 90,195,178,108,175, 74,220,207, 53,125,251,246,213, 79,
+156, 56, 49,229,233,139, 24,167, 7, 79, 94,176, 18, 1,109,116,112,176,167,174, 95,191,206, 84,133,147, 36,201,213,147, 39, 79,
+ 86,142, 28, 57, 50, 59, 51, 43,215, 37, 91,153,207,242,105,202,224,226,226,194, 57,116,232,144,118,199,142, 29,228,240,225,195,
+ 87, 51, 12, 19, 86,137,251,187,186,107,215,174,121, 83,166, 76,201,121,254,234,181,203,131,199,207, 32,226,211, 6,103,103, 39,
+234,214,173, 91,250,197,139, 23,147,115,231,206,181,168,156, 98,177,120,203,158, 61,123, 56,135, 14, 21,246,125,215,174, 93, 35,
+189,188,188, 68, 37,223,163,214,104, 65, 18, 64, 70, 70,134,168,105,211,166, 91, 0,188, 23,220, 55,120,118, 52, 6, 77, 5,198,
+142, 29,155, 82,217,135, 37, 88, 49,174,194,247,152,126,247,101,151, 20, 12,233,206,225,112,152,225,195,135,167,190,251,119,141,
+ 70, 67, 0,232,138,159, 45, 23, 91, 29, 59,118,252,225,200,145, 35,181,182,109,219,246,235,142, 29, 59,116, 0, 32, 16, 8, 28,
+118,237,218,181,160,119,239,222,232,221,187,247,140,125,251,246,125, 52,161,101, 98, 77,122, 0,224, 11,248,252,232,232,104,194,
+215,215,183,220,136,251,122,134,185,189,238,233,211,134, 95,249,250, 54,202, 98,152,218,220, 14, 29,242, 39, 76,152,144,161, 84,
+ 42, 17, 27, 27, 11,189, 94,143, 65,131, 6, 81,173, 91,183,118,237,221,187,247,242,188,188,188, 47, 0,232, 45,120, 38, 23,187,
+185,185,141,200,205,205,205, 55, 91,117, 90, 12, 52,113, 90, 5, 25,249,245,107, 27,120, 92,202,200,237,242, 45, 67,156, 92, 73,
+168,124, 61,113, 25, 0,184, 5,120, 83,201,201, 64,169,176,113,135,167,137,198, 92, 71,119, 97,155, 55,113,234,159, 84,241,229,
+138,165, 47,196, 98,113,119,149, 74,181,175,104,112,246,233,220,185, 51,174, 95,191, 14, 0,205,139,132, 86, 27,146, 36,191,100,
+ 24,102, 61,128,242, 82,185,141,235,214,173,219,167, 7, 14, 28,144, 2,192,190,125,251, 96, 48, 24,224,229,229, 5, 46,151, 11,
+ 30,143, 7,154,166,139,179,131, 88, 8,133,163,163, 3, 28,108,105,200,228,226, 14,223,255,214,141, 83,205,207, 6,233,166, 71,
+200, 98,115, 96,100,181,224,218,139, 81,167,189, 29,130, 63,107, 67, 70,172,126, 56, 45, 98,213,147,134, 5, 36,186, 32, 14,218,
+127,202,200, 78,146, 36,255,254,253,251,112,117,117,125,235, 58, 69, 81, 0,208,170, 10,148, 51, 94,189,122,213, 52, 42, 42, 10,
+161,161,161, 51,234,213,171,247,249,133, 11, 23, 92, 50, 51, 51, 17, 26, 26,186, 60, 49, 49,241,208, 95, 93,167,146, 90,228,127,
+197,212, 69,190,163, 36, 91, 23,206,130, 73,138,162, 72,196,188,138, 53,132,134,182, 13,143,143,143,151,132,132,132,144, 52, 77,
+ 67,117,246, 44, 52,183,110, 65, 34,145,160, 71,143, 30,244,197,139, 23,109,108, 36, 54,195, 94,199,188,206,163, 40, 18, 44, 75,
+ 86,232,243, 32,147,201,190,158, 54,109,154,139,183,183, 55,140, 70, 99,113, 68,115,163,209,136,132,132, 4, 72, 36, 18, 12, 28,
+ 56,208, 73, 36, 18,125,109, 97, 61,106,248,120, 57,221, 57,127,116, 77,131, 9,163, 58,138,125, 68,167, 32, 78, 24, 15,201,190,
+175, 80, 55,249, 56,166,116, 15, 17,159, 92, 53, 35,184,150,171,252, 78, 9, 19,171,197,208,106,181,151, 31, 62,124, 56,236,194,
+133, 11, 12, 0,156, 59,119,142,125,242,228,201,200, 15,153,133, 50, 12,131,156,156, 28, 48, 12, 67, 21,157,155, 95,255,171,207,
+131,141,141,205,234,207, 63,255,188,111, 92, 92,156,240,216,177, 99,246,241,241,241, 14,175, 95,191,118,244,241,241,225, 44, 88,
+176,224,136, 70,171,167, 12, 38, 86,103, 52, 25,242, 82, 30, 61,122,149,157,150,118,103,227,198,141,106,130, 32,122, 88,248, 29,
+ 95, 40, 20, 10,251,169, 83,167,130,160, 69,141,235,212,173,231, 77,209, 66, 91,146,230,217,170,213, 26, 83, 76, 76, 76,194,212,
+169, 83,107, 6, 6, 6,186,162,112,121,205, 34, 78, 87, 87, 87,135,137, 19, 39,130,195,151, 6,213, 15, 12,174,197,227,139,165,
+ 20, 45,148,134,132,132,180,126,245,234, 85,242,148, 41, 83, 20,141, 26, 53,170, 20,103,163, 70,141,100,195,135, 15, 55, 10,132,
+210,166,158,158, 94,117,235,251,215,237,228,227,227,211,157,195,225, 24,223,188,121, 19, 55,112,224, 64, 69,151, 46, 93,156, 43,
+195,233,228,228, 36,155, 50,101,138,209,163,186, 87,251,246,159,126,214,132, 43,148,218,114,120, 98,187,130, 2,141,233,233,211,
+167,113,211,167, 79, 87, 4, 5, 5, 57, 89,194, 89, 80, 80, 64, 59, 56, 56, 32, 32, 32, 0,126, 94, 94,200,205,205,197,129, 3,
+ 7,176,105,211, 38,172, 95,191, 30, 59,119,238, 68,195, 22,159, 65, 42,149, 34, 57, 57, 25, 74,165,146,254,187, 31, 40,211,239,
+190,236, 10,221,136,174,163, 71,143, 78, 30, 62,124,120,170, 80, 40,100,222, 61,228,114,185,169,127,255,254,105, 3,191, 95,218,
+213,188,180, 88,129, 37,235,254,209,163, 71, 95,110,219,182, 13,126,126,126,104,223,190, 61, 15, 0,190,254,250,107, 94,239,222,
+189,177,103,207, 30,236,219,183,239,177,183,183,247, 21, 0,221, 44, 41,231,192,129, 3, 91,132,133,133, 93, 10, 11, 11,187,219,
+167, 79,159,181, 35, 71,142,124,107,228, 74, 73, 78,188,173,211,233, 16, 24,220, 72, 52,103,195,141,254, 21,241, 61, 1,182,173,
+141,142,222,180,240,209,163,184, 25,126,126,118,213, 95,191,150,111, 94,188,216,193,156,164,219, 96, 48, 32, 33, 33, 1, 50,153,
+ 12,253,251,247,119,224,243,249, 3, 45, 40,230,146,110,221,186, 13,142,143,143,151,172, 91,183, 78,113,247,238, 93,215,148,148,
+ 20,197,153,211, 39, 28, 39,125,247,181,212, 86,194,227, 37,191, 97, 9, 0,120,157, 12,113,116, 12, 90,176, 44,236, 74, 46, 39,
+ 86, 9, 10, 8,133,238, 88, 81,171,133,221,179,137,123,130,250, 76,137, 12,118,144, 41,248, 83,203,249, 68,253, 69,139, 22,237,
+141,136,136,232,215,162, 69,139,253, 0,132,165,188, 71,208,176, 97,195, 3,123,246,236, 25,220,178,101,203,203, 0, 2,202,156,
+ 69,186,187,247,248,227,143, 63,236,205,231, 14, 14, 14, 16, 8, 4,239,137, 44, 46,151, 11,146, 36, 43, 93,189,121,187,250,113,
+228,117,181,120,152,125, 20,123, 22,221,199,162, 14, 79,153,249,205, 94,107, 87, 14,140,198,201, 61,247,145,142,251,232,248, 85,
+ 45,244,155, 30,216, 78,100,194,220,127,210, 0,254,230,205,155, 47, 91,181,106,181,183, 99,199,142,218,168,168, 40,188,121,243,
+ 6,110,110,197,115,237,212, 42, 80,202, 69, 34, 17, 60, 60, 60,224,237,237,221,239,226,197,139, 46, 6,131, 1,175, 95,191, 70,
+122,122,250,157,191,163, 78, 37,181,200,191, 12,239, 58,194, 31,121, 79,104, 21,229, 22, 58, 15, 0, 44, 65,168,238, 63,124, 72,
+ 83, 60,222,128,237, 59,118,240,185, 92, 46,226,226,226,240,248,241, 99, 20,156, 57, 3,245,213,171, 72, 75, 75, 67,126,126, 62,
+156,157,157,177,102,195, 6,177,206,196, 14,121,250,236, 25,197,146,108, 73,127,131, 82,183,120,242,249,252,118, 61,123,246, 44,
+ 83,144, 37, 39, 39,163, 99,199,142, 52, 69, 81,165,237,106,120,151,147,112,117, 36, 34,206,236,159,163, 80,240, 30, 3, 47, 38,
+ 0,121,119, 0, 86, 11, 24,117, 64,210, 3,224,200,108, 84,207,143, 38, 78,204, 9,119,113, 19,113, 34, 74, 81,202, 21,109, 69,
+245,242,245,245, 93, 63, 96,192, 0, 18, 0,218,180,105, 67,248,250,250,174, 5,224, 85,206,103, 78, 87, 48, 72, 94,207,206,206,
+ 70,239,222,189,237,107,213,170,117,186,119,239,222,246,230,235, 85,229, 52, 91,147,253,252,252, 50, 5, 2,193, 78,192,162, 14,
+182,152,211,206,206,110,101,199,142, 29,123,237,216,177,131, 11, 0,231,207,159, 71, 68, 68, 4, 30, 61,122,132,231,207,159, 51,
+193,193,193,142, 75,215,239, 93,189,242,247, 45, 75,186, 55, 15,116,109,221, 56,184,174, 36, 63, 59,223,217,217,185, 57,203,178,
+ 94, 22,150,179,227,236,217,179, 31, 63,121, 25,103, 75,114,104, 14,151,230,240,109,108,196,206, 50,169,216, 93, 46, 18,184,241,
+ 73, 66, 82, 80, 80,144,186,115,231, 78, 6, 64, 71, 75, 57,231,204,153, 19,243,228, 69,156, 29, 65,114, 56, 52,135,230, 74, 36,
+ 34,187, 14,237, 67, 27, 1, 0, 23, 44, 87,169, 84,166,109,218,180, 73, 95, 25,206, 31,127,252,241, 97, 86, 78,190,140, 67,211,
+ 52,135, 67, 21,223, 75,177, 80,232, 40,226,243,121, 90,173, 54,105,217,178,101,234,202,112,206,158, 61,251,241,211,151,241,114,
+146, 32, 40,130, 32, 57, 54, 82,177,189,189,173,200,209, 81, 34,116, 16,113, 40,158, 82,169, 76,218,186,117,171, 69,156,122,189,
+158,155,150,150,134, 39, 79,158,192,163, 81, 35,156, 58,117, 10,213,170, 85, 67,239,222,189,209,183,111, 95, 8,133, 66,180,105,
+ 90, 15, 83,167, 78,197,203,151, 47,161,215,235,249,165,113,154,253,164,222,133,171,171,107, 84, 69, 15,207, 59,159,125,171,156,
+ 65, 46, 96, 87,232, 70,116, 45, 41,176,202,226,151,203,229,166,210,172, 93,239,114,118,236,216,241,135, 51,103,206,212,218,186,
+117,107,215,129, 3, 7, 94,222,186,117, 43,154, 52,105,130, 39, 79,158,160,102,205,154,216,188,121, 51,250,246,237,123,121,249,
+242,229, 93,163,162,162, 2, 61, 61, 61,167, 85,196,217,167, 79,159, 49, 65, 65, 65,103, 83, 83, 83,155,102,101,101, 5, 28, 56,
+112, 96, 72,143, 30, 61, 98,250,245,235,215,182, 88, 48, 26, 12, 59,142, 28,222,143, 78, 93,123,162,142,127,192,234, 65,211,182,
+213,171,160,109,178,143,128,181,155, 82, 82,222,236,208,104, 10,122,211,180, 72,116,227,134,124,223,239,191, 59,148,204, 44,144,
+148,148,132, 46, 93,186,208, 92, 46,183,101, 5,229, 92,212,189,123,247,222, 7, 14, 28,144,153,173, 58, 87,175, 94,197,131, 7,
+ 15, 16, 27, 27,139,156,156, 28,180, 29,153,143,209, 11, 10,185, 71, 47, 96,241,217,215,172,184,138,125, 72, 49,132,213,224, 98,
+111,195,185, 50,100, 89,157,175, 71,172,246,227, 72,228, 52,182,127,255, 28, 25,175,181,251,202,224, 36,154, 54,109,186, 45, 44,
+ 44,140,208,233,116,208,233,116, 58, 0,165, 70,245,117,115,115, 19,212,175, 95, 31, 35, 71,142, 36,109,108,108,150,151, 85, 78,
+149, 74,165, 61,122,244, 40, 6, 14, 28,136,241,227,199,163,118,237,218,144,201,100,160,105, 26, 91,182,237,118,232, 59,100,148,
+ 79,131, 22,173, 2,253, 26, 52,169,159,167,165, 26,209, 66,217,240, 50,172, 33,165,214, 61,223, 41, 10, 15, 95, 95,195,138,174,
+137,204,205,205, 5,249,147,190,252, 79,244,211, 11,105,143,166,133,173,125,200, 94,107,150,177,237,155,120,164, 25,158,160,101,
+239,234,240, 12,146,125, 43,246,128,111, 85,239,167,133,168, 20,103,189,122,245, 90,220,188,121,147,223,170, 85, 43,196,197,197,
+129,166,139,231, 83,166, 15, 41,231,236,217,179,249, 26,141, 6,247,238,221, 67,120,120,120,146, 94,175,255,246, 67,202, 89, 25,
+139,150, 89,139,252,203,176,246,157, 35,165, 44,139,214,108, 0, 48, 48,136, 24, 16, 62,164, 32, 50, 50, 82,196,227,241, 16, 23,
+ 23,135,148,148, 20,108,217,180,201,212,198,201, 41,175,189,155,155,114,203,166, 77,172, 78,167, 3,203,178,240,245,245, 69,175,
+ 94,189,132, 95,244,238,151, 78, 40,213,187, 45, 88,230, 81,152,215,215,135, 12, 25,242,222,223, 39, 77,154, 4, 27, 27, 27, 16,
+ 4,225, 98, 65,229,194,198,205,238,238, 46,243,180, 75, 99, 83,183,100,129, 18, 0, 28, 41,192,177, 1, 4,182, 0, 95, 10,240,
+ 68,208, 70,157,205, 34,217,246,177, 61, 91, 14,117, 3, 80,153,165, 30,184,186,186,206, 56,123,246,172, 99, 84, 84, 20,171, 84,
+ 42,145,146,146,194,206,159, 63,223,209,213,213,117, 70, 85,127,145,228,228,228, 57,157, 58,117, 74, 11, 15, 15,183, 61,126,252,
+184, 71,120,120,184,109,167, 78,157,210,146, 7,149,255,129, 0, 0, 32, 0, 73, 68, 65, 84,147,147,231,124,200, 47,205,229,114,
+169, 71,143, 30,201,231,206,157,219, 23,192,109,127,127,255, 76, 55, 55,183,219, 40,116,154, 44, 23, 82,169,180, 88,100,153,173,
+107, 28, 14, 7, 52, 77,195,213,213, 85,151,149,149,101,106,217,192, 75,232,107, 75, 26, 92,249, 92,161, 92, 40,112,151,218,216,
+134,100,102,102,222, 39, 8,226,149,133, 75,124, 65,141, 27, 55,166, 77, 44,205,140, 30,208,198,245,235,193,161, 78,191,205, 29,
+ 94,109,217,156, 17,110,139,102, 13,243,157, 51,185,127, 40,201, 48,154,154, 53,107,186,152, 29,218, 45, 48,159, 7, 55,108,216,
+144,195,128,198,147,103,177,105,113,137, 73,121,159,182,110, 90,108,185,244, 11, 10,110,239,232,232,216,202,215,215,183, 33, 65,
+ 16, 22,109, 73, 22, 10,133, 65,117,234,212,225,144, 20, 77,216,203,164, 30, 82,137,208,185,120, 9,197,206,174,153,220,209, 49,
+140,100,217, 92,133, 66,225, 36, 20, 10,131, 42, 81,119, 14, 3, 46,156,157,228,182,142, 14,118,146,246,161,205,107, 55,109,214,
+212,167, 94, 72,147,166,254, 13, 26,126, 65, 24,141, 74, 47, 47, 47, 39,179,147,124, 5,150, 86,193,142, 29, 59, 48,119,238, 92,
+212,175, 94, 29,110,110,110,112,114,114,194,213,171, 87,113,243,230, 77,200,100, 50,164,167,167, 99,241,226,197, 56,120,240, 32,
+244,122,189,180,178,207,147, 37, 98,171, 60, 24,141, 70,242, 93,129, 85, 22,191, 80, 40,100,204, 78,242,101,225,232,209,163,219,
+204,150,172,111,190,249,166,197,210,165, 75, 47, 71, 71, 71, 67, 34,145,224,230,205,155, 24, 50,100,200,229,229,203,151,183, 24,
+ 53,106, 20, 54,109,218,132,152,152,152, 13,229,241,245,233,211,103,214,176, 97,195,150, 93,184,112,129,116,118,118,134, 76, 38,
+ 67,247,238,221,177, 97,195, 6,142,209,104,220, 24, 22, 22,118, 55, 44, 44,236,174, 41,225,228, 15,123,215,207,191,250,240,254,
+ 93,140, 25, 55,145,167, 51, 26,166, 88, 80,125, 86, 45,145,228, 25, 91,181,202,218, 99, 48, 20,244,225,114, 69,182,119,239,202,
+ 35, 54,110, 44, 22, 91, 83,167, 78,133,173,173, 45, 80,232,192,140,114,172, 58, 35, 14, 30, 60, 88,220, 31,218,219,219,131,199,
+227,129,203,229,130,166,105, 80, 20,133,211,171,197,248,125,106,161,190,248,125, 42,129,147, 43, 9,213,135,252,118, 34, 55, 4,
+200,156,121,119,191,218,236, 31, 24,208,214, 30, 87,119,165, 98,126,167,168,196,155,123,222, 76,208,164,227,151, 50, 62,214, 96,
+210,164, 73,126,233,233,233,184,117,235, 22,110,221,186, 85,150, 5, 72,115,248,240,225,159,243,243,243,225,233,233,137,110,221,
+186,181, 2,208,168,140,118,131,134, 13, 27,162, 75,151, 46, 8, 13, 13, 69,253,250,245,161,211, 27,233,176, 1, 35,234, 60,138,
+121,227, 54,127,241,124,209,217,115, 7,200,203,151, 47, 80,219,246,159,180,109, 26,250,217, 50,174, 84,113, 29, 66,123,133, 37,
+245, 44, 48,101, 34, 72,209, 1,107,207,140, 35, 87,156, 15,151,108,137, 88,225, 37,149, 74,137, 59,183,238, 26,182,172,218, 19,
+ 31, 32,238,150,126,125, 87, 38, 10,136, 84,180, 29,236, 73, 50, 64,175,127,202,200, 46, 16, 8,150, 94,184,112,193, 69,175,215,
+227,225,195,135, 24, 63,126,188,230, 3, 41,139, 13, 32, 30, 30, 30, 56,127,254, 60,250,247,239,175, 73, 75, 75,187,246,119,213,
+169,164, 22,249, 95, 1,167,132,130, 44, 70, 66, 66, 66,142, 76, 38,115,171, 83,167, 14,169,211,233, 10,151, 36,246,237, 51,173,
+223,184,241,136, 70,163, 25, 7,128,187,242,183,223, 86,187,185,187,135, 14, 24, 56,144, 48, 24, 12,232,212,169, 19, 47, 50, 50,
+210,254, 85,122,122,158, 5, 3,206, 91,223, 55,104,208, 32, 44, 93,186, 20, 0, 48,118,236,216, 98,211, 58, 97,129,195,146,196,
+ 22, 29,219,119,110,104,147, 32, 94, 97,163,111,102,200,175,241, 82,122, 93,156, 47,108, 8,146,199,129,128, 2,163, 55, 24,159,
+167,247,184,253,242,121, 93, 63, 97, 86,102,205,118,254,159, 96,253,169,173, 29, 11, 76,154, 61, 22,119, 56, 34, 81, 99,137, 68,
+130,219,183,111,103, 53,108,216, 48,135,101, 89,219, 57,115,230, 56,136, 68,162,198, 31,112,239, 95, 63,123,246,172, 85,243,230,
+205,191, 38, 73,178, 29,195, 48,167,211,210,210, 86, 2,120,109,225,231, 71, 3,248, 17, 64,241,204, 82,167,211,129, 36, 73,176,
+ 44,139, 62,125,250, 96,234,212,169,126, 15, 30, 60,192,217,179,103,229,237,218,181,187, 14, 32, 7,192, 80, 0,165, 90,205,148,
+ 74,165,250,230,205,155,194,179,103,207,130, 97, 24,200,229,114,216,216,216,128,207,231,163,123,247,238,146, 41, 83,166,180, 61,
+113,226, 68,186,178, 70, 53, 74,144,146,164,226, 75, 36, 82,184,184,181, 28,213,239,203,104,150,101, 15, 86,162,115,224, 9, 57,
+ 70, 13, 97,210,146,139,102, 46, 39, 69, 92, 46, 33,224,114,192,103, 10,240,195,207,243, 8, 46,107,226,160,146,235,243, 92, 46,
+151, 43,229, 67, 71,241, 40,131,136, 0,251, 49, 26, 7, 69, 81, 60, 1,183,108,127, 12,154, 36, 73,146, 36,185, 0, 44, 78,218,
+199,231,243,185, 82, 62, 91, 38,167,144, 34, 40,130, 32,120, 40, 99, 39, 90,144, 11, 88,179, 21,137, 55,238,149,182,164, 40,110,
+217,178, 37,142,156,189,141,125, 17,167,145, 17,119, 31,211,191,255, 6,141, 26, 53, 66,100,100,100,185,101, 50,251,104,149,101,
+ 93,118,117,117,141, 74, 78, 78,110, 80,214,103,203, 91, 50, 44,195, 74,245, 62,255, 76, 91, 4,207,142, 70, 5, 62, 90,221, 90,
+182,108, 57,102,199,142, 29,186,207, 63,255,156,215,167, 79, 31, 4, 4, 4,180, 24, 60,120, 48, 0,160, 93,187,118, 88,186,116,
+105,139,193,131, 7, 99,247,238,221, 56,112,224,128,182,117,235,214,223,159, 63,127, 62, 9,133, 59, 58,223, 3,195, 48, 93,214,
+172, 89,243,174,165, 16, 70,163, 17, 6,131, 65, 97, 52, 26, 21, 69,125, 17,150, 45, 91,158,113,242, 68, 36,190,159, 54, 27, 78,
+142, 46, 65, 22, 62, 67,196,160,137, 19, 51, 54, 47, 94,140,197,187,119, 99, 98,205,154,162,173,143, 31,227,164, 70,131, 61,103,
+207,102, 20,125, 79,133,190,153, 42,149, 74,125,244,232, 81,155, 61,123,246,192,206,206, 14,181,107,215,134, 92, 46, 7, 77,211,
+ 32, 41, 33, 40,174, 12,117,252, 27, 3,184, 9, 0,168,233, 10,149,175, 39, 46, 19, 4,114, 88,178,242, 62, 69,252,106,168,225,
+224, 46,184, 48,102, 83,128,157,141, 19, 23,199, 87,198,227,196,138,132,131,154, 12,252, 10, 35,158,162,108,159,175,134,158,158,
+158, 72, 79, 79,199,209,163, 71, 85, 64,153,130, 12, 12,195,252,252,219,111,191, 77,154, 54,109, 26,223,215,215, 23, 0,130, 0,
+220, 42,237,189, 98,177, 24,110,110,110,197,194,178, 79,248, 40,175,145, 19, 70, 9,123,124, 22, 10, 14,199, 1, 57, 42, 3, 50,
+243, 12,144, 57, 72,240,253,132, 48,193,233,134,110,141,214, 44,223,126, 88,173, 70, 35,224,253,254,128, 32,112,235,198,253,203,
+245, 4,190, 0, 65, 2, 9,228, 57, 16, 32,144, 79, 24, 64, 80, 20,107, 50,153, 16, 31, 31, 15,150,101,209,191,199,144,132, 17,
+243, 15, 56,181,232,175,132, 71, 29, 87, 16, 44, 62,249,167, 8, 1,123,123,251,160,204,204, 76,188,126,253, 26,225,225,225, 73,
+ 25, 25, 25,167, 84, 42,213,144,228,228,100, 0,200,170, 2,101,177,152, 15, 10, 10, 66,227,198,141,209,187,119,111, 65, 65, 65,
+ 65,152,151,151,151,219,155, 55,111,154,253,149,245,121, 87,139,252, 79, 9,173, 82, 27,154,193, 80, 71,187,122, 53, 84,167, 79,
+131,119,242, 36,246,184,186,230,107, 52,154,239, 0, 36, 20, 53,252,111, 54,109,222,124,165,235,181,107, 54,186,232,104,120, 61,
+120, 0,218,206, 46,168,178, 5,216,184,113, 35,148, 74, 37,114,115,115, 1, 0, 43, 86,172,128, 82,169,132,209,194,132,179, 28,
+ 46, 90,184, 56,213, 68, 42,158,131,225,144,146,216, 58, 5, 77, 36, 26,105,178, 91,188,179, 42,151,116, 67,116, 92,136, 88,157,
+169,107, 66, 80, 58,104, 50, 10,224,214,188, 54, 56,224,180,168, 76, 25,205,235,254, 28, 14, 39,235,217,179,103, 93,124,124,124,
+ 34, 0, 56, 84,197, 31,224, 29,188, 72, 75, 75, 27, 87,149, 15, 82, 20,245, 99, 76, 76,140,211,134, 13, 27,190,158, 51,103, 14,
+ 91, 82,104,153,255,207,225,112,192,178, 44,108,109,109, 65,211,180,243,213,171, 87,157, 67, 66, 66, 86, 49, 12, 19, 84, 70, 61,
+217,128,128, 0,196,196,196,128,195,225,192,214,214, 22,140, 81,143,217, 19, 70,193, 68,241, 57,147, 39, 79, 14,234,217,179,231,
+195, 13, 27, 54, 24,108,154, 54,111,150,153,153,249,104, 76,255, 1, 15, 15, 29, 58,164, 43, 10,241, 80,241, 20,159,101,239, 62,
+127,254,156,114,119,117,166, 88, 99, 1, 35,230, 2,130,251,203, 88,158,196, 5, 2, 14,197,114, 9, 18,124,129,208,246,117, 98,
+ 98, 38,195, 48, 79, 44,225,100, 24,230, 78, 76, 76,140,208,217,201,158, 83,160,214,229, 11,105,150, 23,123,231,246,171, 26,193,
+ 13,189, 0, 64,115,231,230,121,126,157,186,194,216,180, 55,226,154, 53,107, 90,196,169, 86,171,239, 38, 37, 37, 81,206,206,206,
+156,184,132,196,195,118, 18,177,163,141,157, 93, 19, 0,208,231,229,222, 36,181,218, 55, 20,205,113,126,147,153,153,165, 86,171,
+ 99, 44,173,251,203,151, 47, 57, 10,133, 19,117,252,228,153, 8,103, 17,223, 73,202,227,216,240, 9,130, 16, 81,132,146,107,100,
+ 50, 4, 34,145,211,235,196,196, 44,150,101,203,180, 16, 46,204, 25,208,163,240,247,154,189,187, 4, 55,238,223,191,143, 99,151,
+159, 64,204,234, 64,104,114,113,114,211, 58,244,159, 60,237,131,253,254, 42, 18, 91, 85,178,102,173,169, 27,245, 14, 63, 82, 42,
+112,132,239,223,191,255,236,109,219,182, 21, 59,160, 60,121,242, 4,109,218,180, 49, 47,115,160,125,251,246, 8, 9, 9,193,147,
+ 39, 79,224,237,237,141,179,103,207,242, 41,138,226, 15, 24, 48, 96,254,246,237,219,143, 86,104,247, 95,187, 22, 67,134, 12, 41,
+205,177,250, 37, 0, 13, 33,243,205,159,186,112,139, 67, 86,102, 6,210,223,164,222,181,244, 62, 16, 4,129, 65, 19, 39,102,172,
+209,233,176,227,198, 13, 12, 20,139, 69,155, 95,188, 64,167,144, 16,212,107,211, 38,195,146,190,206,108,213,209,104, 52,160,105,
+ 26, 54, 54, 54,176,183,183, 7,151,203, 5, 69,187,130,195, 11, 4,201,229, 34,184,101, 32, 22,127, 39, 46, 8,239,128,229, 4,
+129, 28, 62, 15,119,184,162, 50,125,117, 8,113, 53,116,103, 89, 40, 11, 18,112,206, 44, 72,108,171,195,150,150,210, 39,135,173,
+242,181,179,113,226,226,216,242, 56,156, 92,149,184, 95,147,138,233, 69,247,130, 41,103, 34, 81,207,206,206, 14, 9, 9, 9,136,
+143,143,127,140,242, 29,252, 11,158, 60,121,242,138,207,231,251, 57, 58, 58, 2,128,103, 89, 19,115,134, 97,138,253,176,182,238,
+216,235, 16,212,202, 75,240,105, 11, 63,108,137,152,135,175,194,150,131,166, 8,152, 76,122,252,186,180, 51, 76,218,124,132,117,
+ 29, 65,124,210,206, 59,240,116,132,110,152, 65,157,189,238,189,137, 0, 7,115,255,211,247,170, 29, 95, 66,214, 3, 67,216, 57,
+ 56, 56,137,185, 92, 46,236,109, 20,186,105, 35,191, 77, 97, 89,182,184,221,208, 20,215, 64,230,201,213,153,169,249, 66, 59, 90,
+ 13,176,100,141,170, 69,179,249,248, 72, 76, 76, 28,215,170, 85,171,249,121,121,121,217, 42,149,170, 63, 0,120,122,122, 86, 39,
+ 73,146, 15,160,188,213,145,234, 40, 61, 44, 4,247,193,131, 7,144, 74,165, 72, 74, 74, 42,105,124, 1,195, 48,255,152, 77, 0,
+255, 80, 4, 3,184, 3, 64, 1,160, 19, 74,132,119, 32,139, 76,117,159, 68, 70, 70,178,145,145,145,159, 20, 15, 94, 44,203, 24,
+179,178,192,106, 11,239, 45, 77,211, 44,128,146, 59,154, 68,118,118,118, 4,237,238, 14,130, 95,232,250,193,126,196,173,175, 6,
+131,101,161,101, 24, 19, 40, 16,122,176, 37, 38, 45, 42, 1,129,121, 14,109, 49,142, 55, 3,169, 60,187,146, 35, 29, 96,100, 97,
+ 2, 67, 85,178, 56,172, 74,165,130,209,104,148,213,170, 85,235,136,209,104,148, 21, 13,110,236,127,235, 23, 53,153, 76,175, 40,
+138,194,215, 95,127, 13,179,245, 71,167,211, 33, 53, 53, 21, 90,173, 22, 58,157, 14, 49, 49, 49,200,205,205,133, 78,167,195,163,
+ 71,143,224,233,233, 9,138,162, 20,229,116,230, 44,203,178,240,240,240, 64,141, 26, 53, 64, 17, 44,214, 47,154,133, 31,198,143,
+ 66, 95, 79, 6, 27, 87,254,138,214,173, 91,215,173, 89,179,102, 83, 14,135, 99,114,113,113,225, 30, 56,112,224,176,201,100,234,
+ 14,203,123,158,163, 83,167, 78,173,225,239,239,239,100,103, 35, 53,240,121, 20,120, 6, 21,203,215,102,178,156,130, 12,120,120,
+ 84, 55, 66, 40,242, 30, 56,112,160,169, 44, 43, 68,105,156,223,125,247,157,194,215,215,215, 86,102, 39, 85,241,104, 42,157, 11,
+ 54, 35,247,254,173,235, 0,192,115,116,210, 64, 32,242, 11, 15, 15, 55, 86,134,115,198,140, 25,158,142,142,142,118, 36,216, 60,
+147, 94,255,231,122,187, 86,151, 73,208,180, 26, 92, 94,195,177, 99,199, 18,149,225,156, 52,105, 82, 77, 63, 63, 63, 59, 59, 27,
+113, 62,135,166, 82,184, 12,147, 34, 0,147, 74,235,244,217, 2, 71,135, 2,136, 36,193, 3, 7, 14, 44,147,211,108,205,154, 50,
+101, 74,194, 59,194, 27, 89, 89, 89,208,164, 62, 4, 55, 41, 26,129, 18, 26,141, 28,101,224,243,249,197, 91,223,203,122, 92,203,
+242,209, 42, 77,108, 89,250,217,134, 63,149,179, 4,184,166,110,212,187,113,179,146,147,147,161, 80, 40,202,109, 79,219,183,111,
+159, 22, 26, 26,154,222,190,125,123,221,145, 35, 71, 64, 16, 4,206,158, 61,139,164,164, 36,180,111,223, 30, 44,203,154,119,181,
+225,238,221,187,104,215,174,157,174, 85,171, 86, 73, 69,241,181, 42,196,144, 33, 67, 96, 48, 24,144,159,159,143,172,172, 44, 68,
+ 70, 70, 34, 48, 48,144, 21,137, 68, 61, 41,143,207,230,133, 13,155,214, 44,160,126, 16, 86, 45, 95,172,227,113,232,133,149,105,
+175, 4, 65, 32,252,187,239, 50,114,131,131,179,182,170, 84, 5,131,108,108, 68,181, 18, 18,228,183, 79,156,112,208,235,245, 22,
+113,152,173, 58,238,238,238,197, 34,139,203,229,130,195,115, 4, 37,174, 7,158,125,123,136, 92,122,226,220, 29,190,214, 86,140,
+131, 82, 9,142,139,237,202, 14,237, 32,242,192,188,102,125, 20, 7,154,247, 85,156, 17, 85,195,134,162,241,128,100, 57,196,129,
+193,191,250,212,114,172, 33,196,181,189,169, 56,185, 42,241, 15, 77, 42,102, 1,120, 81, 81, 59,215,235,245, 26,147,201, 4,146,
+ 36,193,225,112, 74,250, 4, 94,249,227,143, 63,112,251,246,109,160, 68,216,158,188,188, 60, 19, 69, 81, 16, 8, 4, 0, 32, 41,
+167,191, 3, 77,211,160,105, 26,231,175, 95,180,239,251, 69,103,226,234,189, 83,104, 30,216, 15,153,249,122,164,229,234,145, 83,
+ 0,248, 55,154,142,128,118, 7,113, 63, 38, 15, 65,245, 3, 40,138, 39, 14, 47,141, 79,243, 26, 9,170,120,244,202,124,204,212,
+214, 37, 10,143, 93, 59,244,228,241,197,125,247, 31,237,250, 45,226, 69,179, 70,173, 84, 69,198, 4,228,231,231,179, 4, 65,176,
+223, 14,159,246,106,235,144,108,211,242,254,247, 25,142, 86,240,242,111,236,234,171, 59, 58, 58, 94,181,183,183, 63, 91, 36,142,
+170, 75,165,210, 43, 10,133, 34, 26,133, 27, 61, 14,165,164,164,248,170, 84,170,230, 40,220,156, 21,151,153,153,217,166,200,242,
+ 20, 87,142, 37,108,131, 82,169,252,198,100, 50,117, 45, 58, 58,152, 76,166,160,231,207,159,251, 5, 5, 5, 61,246,242,242,186,
+235,229,229,117,204,203,203,235,176,151,151,215,225,208,208,208,165,230,112, 15,127,241,178,225,123, 90,228, 95, 38,180, 80, 36,
+178,214, 22,189,162, 88,104, 1, 56,255,174, 3,154,145,207,127,100, 28, 51, 6,118,135, 15,131,126,254, 28,131,195,195,109, 68,
+ 34,209,114, 20,198,104,106, 46,145, 72, 86,205,154, 53, 75,234,176, 96, 1, 92, 47, 94, 68,108,100, 36, 12, 52,125,171, 42,165,
+ 83,171,213,224,112, 56,197,150, 24,177, 88, 12,147,201,132,210, 76,190,239, 53, 64, 35,174, 37,165, 69,131,135, 26, 96,192,230,
+ 31, 87,182,186,209,239,213,116,167, 72,165,167,247, 11, 21,215,251, 39,199, 38, 78,203,171,183,184,161, 34, 56,249, 60, 59, 1,
+226,227, 19, 96, 2, 83,169,245,102,141, 70,147,171, 82,169, 16, 20, 20,100,127,251,246,237, 90,129,129,129,242,162,235, 55, 63,
+240,135,105,234,234,234,186,215,205,205,237,181,171,171,235, 94, 0, 77, 43,241,217, 13,151, 46, 93, 2, 69, 81,152, 53,107, 22,
+242,242,242,160,215,235,145,153,153,137,248,248,120,232,116, 58, 36, 38, 38,226,233,211,167,208,233,116,136,141,141,133, 86, 91,
+241,132,132, 97, 24,216,216,216, 64,163,206,199,239,243,126,192,140, 41, 19,144,251, 50, 10,137,201,105,176,179, 21, 99,220,184,
+113,148, 76, 38, 99, 24,134,169, 97, 50,153,218, 49, 12,179,218,146,223,169,196,243,118,217,195,195, 35, 96,209,162, 69,126, 63,
+204, 91,205,181,225,228,179,124,169,128,225, 73,249, 44,175,110, 19, 12,153,190,156,187,108,201, 47,207,174, 93,187,150, 4,203,
+130,119,146, 0, 46, 7, 7, 7,251, 36, 37, 37, 5,250,250,250,214,113,168, 94,147,207, 87,184,229,112, 21,213,148,172, 86,115,
+131,112,171,214,114,245,234,213, 15,175, 92,185,146, 92, 25, 78,177, 88, 92,119,203,150, 45, 1,206,206,206, 1,180, 80, 40, 40,
+200,205,221, 99, 44, 80,237,165,236,100, 2,210,198,174,195,193,131, 7,163,246,239,223,159, 90, 25, 78,111,111,111,223,121,243,
+230,249,215,171, 87,207,223,197,179, 22, 95,232,230,145, 41,112,175,158, 41,172, 23,200,135,123,141,207, 87,173, 90,117,247,218,
+181,107, 22,113, 82, 20,101, 36, 73, 18, 52, 77, 67, 36, 18,225,248,241,227, 24, 51,172, 31, 60,220,236, 81,199,215, 23,109,191,
+250, 6,251,247,239, 47,246,225,161, 40,170,204, 17,125,243,130,113, 17,193, 10, 34, 10,107,234, 70, 97, 77,221,168, 96, 5, 17,
+ 85,166,216, 42,250,123,105,239,177,168, 55, 42, 99,185,209, 2,177,117,244,252,249,243, 63, 15, 26, 52,136,215,177, 99, 71,220,
+184,113, 3, 67,134, 12,185,124,224,192, 1, 0,192,141, 27, 55,240,237,183,223, 94, 62,115,230, 12, 70,141, 26,133, 54,109,218,
+240, 46, 93,186,180, 10, 22,196,254, 49, 26,141,216,184,113, 35,140, 70, 35, 36, 18, 9,228,114, 57, 58,119,238,140,135, 15, 31,
+142,218,180,105, 83, 52, 69,211, 95,118,234,250, 5,142, 28, 62,128,167,143, 30,142,218, 60,127, 64,165,131, 2,147, 36,137,142,
+225,225, 25, 25,254,254, 89,155,149,202,130,161, 50,153,200, 55, 53, 85,126,110,239, 94, 7, 11,132, 26, 97, 50,153,138,197,149,
+ 89,116,152, 15, 14,207, 17, 28,113, 0, 56,210, 70,184,255,130,107,224,134,224, 14,175, 17,158,148, 23, 63,139,230,145, 67,122,
+254,224,137,158, 63,120,162,219,228,154,131, 69,213,176, 94, 92, 13,163, 59,142,175, 17,234,213,200, 22,202,116, 61, 34,127,141,
+141,211,100, 98, 1,128,167,150,180,115,134, 97, 30, 39, 37, 37,129,199,227,161, 90,181,106, 62, 0,204,126,129, 27,134, 15, 31,
+ 62,246,167,159,126,154, 0,224,167,162,107,146,208,208, 80,255,252,252,124, 60,127,254, 28, 0,110,151, 99, 13, 46,222,101,152,
+165,140,229,215,116,173,135,192,186, 35, 33,147,213, 71, 82,150, 14,201, 89, 58,172,255,189, 59,162, 46,205,197,237,147, 3, 17,
+151,154, 10,161, 75, 15,152,140,218, 0, 11, 38,245,174,247,238,221, 35, 46, 93,186, 68, 48, 12, 3,131,193,192,230, 41,149,236,
+157,203,151,161,190,112,129,176,177,177, 33, 90, 52,110,149,191,121,238,145,155, 7, 87, 94,190,173, 47,168,244, 68,253, 67, 48,
+227,213,171, 87, 77,247,238,221, 27, 10, 96, 70,189,122,245,174,197,199,199, 55,187,120,241, 98, 29,119,119,247,229, 85, 37, 53,
+135,133,136,141,141,125,235, 40, 10, 11,161, 43, 18, 13, 29,139,196, 92, 55, 0,223,226, 3,118,217, 87, 2,231,255,197,206,240,
+ 71,240,206,110,195,119,133, 86,201, 64, 97,240,146,201,164, 6,131, 62,241,212,169, 83,122,146, 36, 33, 18,137, 48,104,200, 16,
+242,247,223,126,107,217,175,105,211,179, 35, 62,253,244,216,217, 51,103,130, 67, 66, 66,192,178, 44, 72,146,196,238,221,187,213,
+ 26,141, 58,211,195,195,195,206,146, 78,163,100, 3, 82, 42,149,197, 66, 43, 55, 55, 23,206,206,206, 22, 47, 29,170,148, 56,125,
+230,120, 84, 54,107,250, 42,190,227,139, 37,250,133,169,221, 67,114, 24, 19, 39,215,100, 64,174,154, 69,158, 6,156, 27,164, 60,
+100,144,119, 15,125, 76,187,144,167, 23,162,175,102,106, 76,154, 74,237,150, 72, 79, 79,255, 33, 44, 44, 44, 83,161, 80, 16, 54,
+ 54, 54,112,115,115, 35,187,117,235,150,145,144,144,240, 83, 85,127, 17,123,123,251,190,161,161,161, 17, 73, 73, 73,189, 46, 92,
+184, 80,227,226,197,139,189, 66, 67, 67, 35,236,237,237,251, 90, 72,177,103,218,180,105, 42, 30,143,135, 38, 77,154, 32, 47, 47,
+ 15, 69,187,124,202, 61, 44, 89, 34,229,114,185, 88,179,232, 71,204,152, 50, 1, 89,209, 55,112,255,242, 41,156, 79, 37, 48,125,
+222, 47,224,114,185, 85,138,245, 85,219, 81, 84,175,158,171,244,201,183, 67,250, 36, 79,157, 50, 69,122,247,238, 93,122,236,248,
+111,217,216,148, 44,240, 58, 46,166,240,201, 15,228, 61,149, 35, 58,117,104,139, 89, 51, 38,214, 43, 10,218, 89, 46,234, 58,138,
+234, 5,184, 74, 31, 79, 28,209,239,213,248,241,227,133, 11, 23, 46,212, 52,109,218, 84,157,150,150, 38, 20,203,228,190, 28, 91,
+187,128,216,148, 84, 73,211,166, 77, 99,190,250,234,171,156,202,114, 78,159, 62, 93,116,226,196, 9, 78, 88, 88,152, 49, 59, 59,
+ 91, 66, 11,133, 65, 4, 95,208,248, 77,118,182,109,175,176,176, 23,189,122,245, 42, 40, 10, 88,106, 49,231,204,153, 51, 69, 79,
+159, 62,229, 52,109,218,212,144,154,154, 42, 21,219, 59, 4, 82,118,242, 70,175, 83,210,108, 26,135,132,188, 28, 59,118,172,170,
+188,114,150, 20, 41, 82,169, 52,169,121,243,230,248,245,215, 95,177,108,217, 50,124,254,249,231,120,248,232, 33, 58,141,157, 0,
+191,209,223,226,240,213,235, 72, 74, 74,194,156, 57,115, 16, 24, 24, 8, 46,151,251,180,212,246, 56, 42,154,184,155, 10,226,110,
+ 42, 8, 98, 84, 52, 97, 62, 47,211,178,245, 83, 46, 74,190,191,180,247,221,158, 89,186,165, 43, 88, 65, 68,149,231,135, 85,145,
+216,234,213,171,215, 24,115, 8,135,161, 67,135, 94, 94,190,124,121,139,161, 67, 11, 39,218, 77,154, 52,193,220,185,115, 91, 76,
+159, 62,253,242,188,121,243,208,182,109, 91,120,121,121, 85,184,241,197,100, 50,193,104, 52,162, 95,191,126, 48, 26,141,120,243,
+230, 13,158, 61,123,134,181,107,215,130,101, 89, 1, 0, 40, 92,221, 27,242,120, 60,220,187,115,171, 96,198,208,144,237,149,176,
+100, 17, 37, 39, 49,249,249,249,232, 53,122,116, 70, 98,237,218, 89,171, 51, 50, 10,134,201,100,162,154,113,113,114,169, 78,231,
+134,114,252, 18, 9,130, 0,195, 48,197,194,202, 44,184,222, 61,138, 6, 74,139,160, 47, 96,142, 94,220,150, 12, 0,104, 53,192,
+ 21,221, 38,215, 28,172,240, 22,173,104,217,191,208,232,189,127,238, 43, 54, 47,217,180, 16, 6, 60,174,132,197,250,198,141, 27,
+ 55, 96,103,103,135,176,176, 48, 62, 73,146, 11,204,243, 85, 20,198,206, 90, 98,230,226,243,249,139, 7, 14, 28, 72,230,228,228,
+224,254,253,251, 0,112,166,172,126,137,101,217,226,186,231,103, 17, 48, 49, 60, 92,185,115, 28, 39, 47,238,195,235,164, 55,136,
+ 75,215, 0, 28, 91,104, 84,137,208,171,147,160,203,185, 3,165, 86,100, 81,129,185, 92,238,155,122,245,234,177,141, 26, 53, 98,
+ 89,150,197,203,151, 47,141,177,113,113,198, 91, 75,151,178, 15, 70,142, 36,164,207,158,113,133, 66, 33,225,233,233, 9,129, 64,
+192, 8, 4,130,204,191,113,240,254, 75,194, 45,252, 5, 97, 33, 62,166, 85,139,197,191, 19, 41,120,123,183, 97,113, 0,211,210,
+ 2,150,130,181, 17,246,217,183,234,119,219,176,126, 3, 84,129,129,129, 50, 55, 55, 55, 16, 4,129,238, 61,122, 16,161, 23, 46,
+ 72,105, 87, 87,216, 55,104, 80,188, 28,113,250,212, 41, 28, 63,126, 92,117,228,143,131,110, 67,134, 13,235, 2, 96, 75, 57,133,
+225,240,249,252,226,239, 77, 73, 73, 1,159,207, 47,246,137, 80, 42,149,112,116,116, 68, 74, 74, 10, 44, 92,153,219, 58,117,202,
+245, 41,233, 33, 63,120,134, 72,105,226,152, 42, 21, 38,150, 5, 77,152, 0, 53, 11,131, 9,208, 26, 88, 52,172, 73,201, 79,170,
+141,178,200, 27, 7, 98, 0,108,173,204,221,211,106,181,231,238,222,189, 59,146, 97,152,125, 0,200, 11, 23, 46, 48,143, 31, 63,
+ 30, 3,203, 29,215,223, 55,219,139, 68,147,207,158, 61, 43,159, 60,121,114,118,100,100,100,110,231,206,157,109,215,174, 93, 43,
+111,211,166,205,228,204,204,204, 93,150, 24, 2,227,227,227,183, 36, 36, 36,140,105,212,168, 17,178,178,178,160,215,235, 17, 21,
+ 21, 5,111,111,111,220,190,125, 27, 62, 62, 62,184,117,235, 22,234,212,169, 3,147,201, 4,141, 70, 3,134, 97, 76, 21,117,230,
+ 89, 25,111,128,204,120, 36,223, 56,134,103, 15,162,112, 54,153,192,202, 93, 17,168, 86,195,179, 74,113,106,124,156, 68,254, 10,
+ 71,251,147, 11,103,207,116,138, 61,183, 27, 7, 54,174,100,206, 31, 59,230,199,147, 98,228, 39,253,190,249, 66,103, 64,117, 0,
+188,102, 33,141,208, 81,246,212, 36,170,129,212,179,143,203, 15,176,232,227, 36,242,119,118,176, 63,241,159, 5, 63, 73, 95, 30,
+223,140, 61,107,126,101,247,111,219, 25,168, 1, 66,252,253,253, 59,146, 36,105, 7, 64, 83,228,231,101, 81,106,155,210, 56, 79,
+ 71, 68, 4,107,128,144, 67,135, 14,117, 20,137, 68, 46, 0, 12, 5, 5, 5,175, 62,132,243, 76,100,100,176,185,156, 4, 65, 56,
+ 1,208,179, 44,251, 18,149, 76,193,211,187,119,239,185,223,126,251,237, 20,147,201,228, 88, 98,118, 78, 45, 94,188,152,195, 48,
+ 12,197,178,172,158, 36, 73,253,137, 19, 39, 76, 70,163, 49, 89,163,209,140,254,144, 94,228,139, 47,190,192,245,235,215,103,163,
+112, 19,134,165,214,234,183,252,180,138, 82,246, 84,153,255,194,133, 11,115,190,252,242,203,169,187,118,237,122,182,124,249,242,
+174,163, 70,141,194,238,221,187, 81,187,118,109,220,187,119, 15, 63,252,240, 3, 0,180,152, 62,125,250,225, 13, 27, 54,120,197,
+198,198, 46,182,192,162, 1,163,209,136,157, 59,119,162,123,247,238,112,116,116,132,171,171, 43, 8,130, 56, 55,108,216,176,223,
+ 0,128, 34, 40, 46, 0,104, 53, 90,173,175,111, 35,139, 45,184, 92, 46,183,184,175, 75, 77, 77, 45,222, 41,248,217,151, 95,102,
+172, 95,184, 16,219,213,106, 12,147,201, 68,137,238,238,138,195, 47, 95,142,120, 84,216, 57,179,229, 89,117, 42, 18, 89,150,186,
+ 52,168, 83, 48,237,143,249,175, 93, 0,124,222,106,128, 43, 90, 13,112, 69,163,110, 78, 4, 73, 17,120,112, 50, 19, 15, 79,103,
+237, 55, 40,113, 14,149, 75,151,243,120,193,130, 5,135, 63,249,228,147,174,117,235,214,197,240,225,195,191,218,184,113, 35,215,
+ 96, 48,140,199,159, 97, 30,108, 73,146,252,105,205,154, 53, 35,228,114, 57, 46, 93,186,132,139, 23, 47,158, 3, 16, 95, 86,191,
+ 4,160, 56,102, 86, 53, 15, 31,205,211,216,124, 81,122,210, 21, 92,190,244, 7,106, 7,126, 3,161, 75, 23,200,125,231, 65, 31,
+189, 12,186,204,147,144,123,116, 70, 98,236, 75, 80, 28,254,195,138,156, 80, 88,150,125,148,152,152,232,229,229,229, 69,188,126,
+253,218, 8,128, 53,153, 76,172,190,101, 75,131,223,194,133,244,195,175,190, 34,154, 61,125, 74,177, 4,193, 68, 69, 69, 1,192,
+147,255,198, 40,110, 14,183,240,240,225,195,178,194, 45, 84, 10,245,234,213,107,113,241,226, 69,190, 70,163,193,249,243,231,209,
+184,113,241,222,174,255,106,244,251,146, 90,228, 95,134, 17,165, 92, 91,251,150, 69,235,173, 7,155, 33,232, 58, 62, 62, 38, 46,
+137, 77,221,187,116, 41,184,123,247,110,241,172, 79,115,243, 38, 84,199,143,195,100, 50,129,101, 89, 92,188,112, 1, 3, 7, 12,
+200,167, 41, 98,125,205,154, 53, 88,130,125, 43,118, 75,187, 82,102, 15, 97, 97, 97, 97,197,157, 79, 66, 66, 2,196, 98, 49,120,
+ 60, 30, 24,134,129,209,104, 4, 69, 81,176,181,181,133,209,104, 44,205, 4,243, 46,167,193,148,165,234,181,161, 83,255, 20,215,
+124, 61, 59,210,174, 38,170,115,133,197,141,211,197,134, 64,215, 64, 26, 14,156,116,246,204,226, 79,147, 25,109,102, 47,188,191,
+163,171,162, 45,255, 62,245,235,215,255,109,224,192,129, 36, 0,180,107,215,142,172, 95,191,254, 10,148,159, 42,167, 92, 78,129,
+ 64,192, 7,128,136,136,136,172,103,207,158,125, 30, 17, 17,145, 85,242,186,133,156,107, 23, 45, 90, 4,145, 72, 4,163,209, 8,
+157, 78, 87,236,159, 85,242, 85,175,215,195,193,193, 1, 71,142, 28,129,201,100, 58, 82, 81, 57, 61,170,215, 0,225, 88, 11, 91,
+ 34,206,226, 98, 6,183, 42, 34,171,152,179,150,139,184,142,139,131,253,169,255,204,159,227,152,253, 34, 10,137,137,137,236,137,
+227, 71,174,105,128,164,220, 60,204,200, 81,161,142, 90, 7, 65, 99, 47,196,159, 90,243, 61, 59,189, 21, 12, 40,125,215, 96, 49,
+167,159,139,184,142,155,163,253,137, 95,254, 51, 95,154,243, 34, 10, 41,169,169, 56,122, 36,226,174, 6, 48, 47, 55, 14,102, 24,
+ 38,128, 97,152, 0, 0,131,203, 17, 47,149,226, 44, 40, 40,168, 87, 80, 80, 80,239, 99,114,178, 44, 91,143,101, 89,139, 57, 75,
+250, 68, 45, 89,178, 36, 58, 37, 37,101, 96,122,122,122,123,243,145,157,157,221, 46, 63, 63,191,117, 65, 65, 65, 75,245,146, 26,
+182, 5, 5, 5, 78,249,249,249, 10,141, 70,211, 16, 64, 84, 37,158,249, 98,148,140, 58,157,146,146, 50, 43, 37, 37,133,168,168,
+156,212,232,104, 98,199, 47, 19,255, 88,179,102,141,226, 3,249,223, 42,103, 70, 70,198,190, 93,187,118, 5,121,122,122,122, 13,
+ 30, 60, 24,171, 87,175,198,242,229,203,181, 0,176, 97,195, 6,109, 9, 75,150, 71,108,108,108,163, 50,150, 13,219,149,176,150,
+108,253,236,179,207,216,139, 23, 47,162,123,247,238,197,129, 68,215,173, 91, 7,163,209,168,108,219,182, 45, 3, 0,106, 77,129,
+146,101, 88,232,244,101,174,191,191,119, 63,121, 60, 94,135,146,241, 2,205,193,152,121, 60, 30, 88,150, 69,157, 22, 45, 50,114,
+ 2, 3,179, 54,230,230, 22,204,170, 87,207,102,132,175,239,224,186,192,128,210, 56, 9,130,120,203,170,243,238, 81, 9, 75, 86,
+201,114,166,171,147, 49,252,143,249,175,143,155, 45, 91, 2, 9, 7,154, 60, 35, 14, 46,124,253, 70,243, 6,235,202, 18, 63,229,
+213, 61, 43, 43,107,236,194,133, 11,181, 50,153, 12, 95,124,241, 5,230,205,155, 55,172, 69,139, 22,185, 78, 78, 78,215,107,215,
+174,253,160, 79,159, 62, 41, 81, 81, 81, 99, 67, 67, 67,241,252,249,115,252,242,203, 47, 57,217,217,217,253,203,227, 36, 8,162,
+216,146,215,173, 83,187,172,223, 87,252,202,180,253,100, 12, 68, 66, 27, 24,104, 15,100,229, 27,144,173, 98,161,227,135,128,199,
+229,163,125, 83,127, 92, 63,177,185,192,164, 83,109,169,232,153,207,207,207,223, 63,104,208, 32, 37,151,203,133, 78,167, 99,105,
+154, 6,191,208,239,152,161, 63,255, 92,223,236,241, 99,163,137,101, 25,130, 32,240,221,119,223,169,178,179,179,119, 85,165, 29,
+ 85, 2, 37, 57, 63, 86,184,133,118,239,140, 63, 31, 35, 44,196, 95, 81,247,127, 51,214,150,114,252,105,209, 50,111,169, 52,191,
+ 18, 4, 99, 50,153, 24,212,244,172, 41,141,125, 29,191,178,119,239,176,161, 29, 59,118, 18,117,234,212, 73,224, 31, 93, 56, 27,
+141,136,136,192,129, 3, 7, 10, 78,158, 60,169,228,211,212, 6,143,106, 30,206, 38, 19, 3,130, 96,202, 85,195, 82,169,116,252,
+180,105,211,132,185,185,185, 88,190,124, 57, 19, 20, 20, 68,138,197, 98,232,245,122,108,216,176,193,224,239,239, 79,147, 36,137,
+220,220, 92,144, 36,249,212,194, 10,222,207,141, 79,106,255, 91,104,207, 3,141,190, 30, 98,239, 23,218, 76,214,218,195, 13,134,
+ 6, 44,146, 19, 94,227,217,153,147,217,143, 78, 44,205,132, 38,173, 39, 42, 78, 15, 84,218, 64,240,227,201,147, 39,157,198,142,
+ 29,203,106, 52, 26, 34, 62, 62,158,157, 63,127,190,211,240,225,195,127, 76, 78, 78,238, 91,197, 31,133,200,201,201, 1, 65, 16,
+ 76, 81, 71, 98,158,245, 87,102, 93,238,225,150, 45, 91, 14,245,232,209,163, 91,219,182,109, 17, 29, 29, 93,188, 68, 88, 82,104,
+153,119, 31, 46, 88,176, 32, 7,192,212,138, 72,105,154,198,242, 45,251,144,147,157, 1,103,103, 87, 8,132, 66, 84,117,135, 37,
+143, 36,103,253, 60,103,166, 83,198,147,235,196,195,107,103,153,189,247,211,210,141, 38,182,244,136,255,121,201,108,145,250, 47,
+127, 54, 67, 82,179,126,158,255,147,173,121, 89,115,215,157, 20, 37, 97, 98,199,126, 80, 19,249,183,112,254,205,112,117,117, 69,
+ 74, 74, 10,225,234,234,202, 22,249,104,177,229, 8,173,183, 31,240,194,229, 50,162,188,101,195,170,242,199,196,196,204,111,208,
+160,193,196,231,207,159,239,245,243,243, 27, 5,160,154, 86,171,205,153, 62,125,250,127, 54,108,216, 48,212, 18, 75, 22, 0,236,
+222,189,123,233,144, 33, 67,142,119,233,210,229,123,134, 97,234,151, 24,216, 99,156,156,156,138,151,112,223,164,165, 78, 25, 57,
+180,223,148,252,252,108,139,227,220, 73, 36,146, 17,211,167, 79, 23,168, 84, 42,172, 90,181,138,241,247,247, 39,205,147,162,109,
+219,182, 25,125,124,124, 56, 97, 99,198,100, 44, 73, 77,197,220, 75,151, 84, 83, 2, 2,130, 54, 62,123,214, 16, 12,179,181, 44,
+171, 78,105,150, 44,179,219, 69, 21,145, 92, 36,182,214, 1,248,188, 89,111, 23, 28, 90,244, 26,217,177,186,255,192,136,151,176,
+ 32, 45, 80, 41, 72,220,191,127,127,251,180,180,180, 67, 51,103,206,180,109,216,176, 33, 2, 2, 2,104,137, 68, 18, 98, 14, 23,
+147,155,155,139,211,167, 79, 99,245,234,213,186, 71,143, 30,245, 40,111,185,202,100, 50,165,251,248,248,152,239, 3, 75, 16, 68,
+166, 82, 75,216,238,169, 27, 34, 25, 60,114, 47,113,249,214, 85, 36,235, 25,104, 13, 12,106,122, 6,163,245,231, 75,112,248,216,
+ 3, 83,114,236,227,199, 6,117,246,122, 11,202,251,242,197,139, 23, 7,231,204,153,211,251,251,239,191, 23,102,100,100,152,180,
+ 90, 45,179,111,223, 62,106,240,224,193, 38,150,195, 97,184, 28, 14,198,143, 31,175,206,201,201,249, 3,248, 91, 19, 76,255, 37,
+225, 22,254,130,176, 16, 31,205,154, 85,242,245,127, 5,165,182, 80,134, 34,175,172, 94,243,123,135,221, 59,119,185, 80, 20,233,
+242,242,213,171, 91, 93,123,246, 74, 58,117,234,148,156,107,107,219, 24, 0,163, 27, 53,234,154, 94,171,206,138, 60,116,168,122,
+205,154, 53, 2,139,146, 74,179, 12, 69, 94, 41,239, 11,243,243,243, 85,151, 46, 93, 42,152, 58,117, 42,145,144,144,176,195,217,
+217,185,207,177, 99,199, 36, 61,123,246, 84, 71, 71, 71,239,119,113,113,233, 22, 26, 26, 42,157, 56,113,162, 54, 63, 63,191, 50,
+137, 71, 31,179,111,178,235,222,156,185,248,203,155,139,126,255, 20, 28,170, 57,180, 52,192, 24,174, 64,159,119, 10,192, 14, 84,
+ 34,222, 81, 73,136,197,226, 64,145, 72,132,187,119,239,102,135,132,132,232, 52, 26, 13,119,222,188,121,246, 98,177, 56,176,170,
+ 55,158,101, 89, 54, 59, 59, 27, 12,195,112, 0, 16, 69,175, 96, 42,191, 23,191,111,215,174, 93, 15,237,217,179,231,179, 78,157,
+ 58,193,203,203, 11, 6,131, 1, 62, 62, 62,208,233,116,240,246,246,134, 86,171,197,236,217,179,145,155,155, 59, 1,229,228, 60,
+ 35, 8, 2, 70,163,177,216,217,214,205,189,122, 97,156,158, 15, 8, 99, 33,166, 73,175,167,145, 27,145,158,153,193,236,185,151,
+150, 86,160, 55,181,127,241,166,224,209,187,239, 43, 48, 65, 21, 58,120, 92, 18, 0,104,153,242, 51,206,139,121,240,122,118,100,
+ 29,210,210, 51,176,251, 78, 74,142, 74,207,124,254,172, 20,206, 74,149,243, 95,194, 25, 60, 59, 26,189,198, 89,254,222, 15,129,
+165,130,170, 44,220, 77, 5,113, 91,180,145,197,154,141,165,198,200,250, 64,254, 67,207,159, 63, 63, 4, 0,143, 31, 63, 78,232,
+215,175,223,148,215,175, 95,207, 1,112, 52, 54, 54,118, 77,101,136, 54,110,220,248, 28,192,144,242,222,179,107,241,144,131, 0,
+ 14, 86,134, 55, 47, 47, 79, 19, 21, 21,165,153, 56,113, 34,145,144,144,112,204,197,197,229,179,227,199,143,139,122,246,236,169,
+125,248,240,225, 25, 87, 87,215, 86,237,218,181,147, 28,189,113, 35,169,224,229,203,200,200,196,133,151,166, 0, 0, 32, 0, 73,
+ 68, 65, 84,215,175,221, 13, 12, 19, 89, 94,251,252,200, 34,235, 45,177,117,112,238,235,159, 15,253,252,186, 29,163,197,126, 93,
+ 54,174, 1, 72,252, 0,206,139, 87,174, 92,241, 27, 48, 96,192,158,206,157, 59, 55,243,243,243, 67,181,106,213,240,236,217, 51,
+188,121,243, 6,247,239,223, 71, 68, 68, 68,132, 70,163,169, 48,161,118, 86, 86,214,251,233,137, 4,114,215,205,171,102, 69,220,
+186,220,216,167,101,167, 65,194, 0, 87, 6, 58, 61,139,132,184,151,152, 61, 99,125, 65, 74,220,243,199,122,163,190, 7, 44,220,
+168,163, 86,171,215, 46, 91,182,140,142,140,140,236,180,114,229, 74,105,245,234,213, 41, 46,151, 75, 2, 96,111,223,190,205,142,
+ 27, 55, 78,149,145,145,113, 68,169, 84,174,253,155,199,232,139,175, 94,189, 10,166, 40,234,163,134, 91,248,128,176, 16, 86,124,
+ 76,120,122,186,251,213,170,238, 58,202,171,154,251, 24,207,234, 30,225,165, 57,185,123,201,100, 82,207, 26,110, 35,188,170,185,
+143,169, 85,221,117,148,167,167,187,159, 5,166, 69, 47, 27, 27,155, 99, 10,133, 34, 8, 0,108,109,109,187,217,217,217, 61,178,
+181,181,237, 86, 52, 11,236, 38,145, 72,158,248,251,251, 15,255, 27,205,149,229,114,250,248,248,244,203,207,207,255,202,199,199,
+167,159,249,252,229,203,151,197,231, 85,225,244,240,240,104,123,251,246,237,190,139, 23, 47,254,162,118,237,218,221,230,207,159,
+255,197, 31,127,252,209,215,221,221,189, 97, 21, 56,249, 0,182,211, 52,157,198,227,241,210,105,154, 78, 51, 31, 28, 14, 39,141,
+162,168, 52, 0,107,202,176,150,181, 43, 49,203,185,236,236,236, 28,235,236,236, 28,235,226,226, 18,235,226,226, 18,171, 80, 40,
+222, 59, 28, 28, 28, 46, 91,122, 63,125, 93, 36, 45, 66,170, 73,175,212, 83, 72, 46,215,117, 22,251,126,140,223,200,215, 69,210,
+162,113, 53,219, 43,245, 20,210, 75,255,223, 56,131, 92,192,178,171,125, 89,118,181, 47, 27,228, 2,182,162,243,143,105,246, 87,
+ 40, 20,172, 66,161,152,245, 87, 45, 37,148,193,255,183,183,247,143,200,233, 37,149, 74,119, 85,171, 86,205,220,215,117,177,177,
+177, 57, 39,145, 72,186, 20,245,117, 93,196, 98,241, 5,127,127,255, 65, 21,113,202,229,242,219, 78, 78, 78,169, 69, 71,138,179,
+179,115,138,179,179,115,138,147,147, 83,178,147,147, 83,178,163,163, 99,146,249,176,179,179,187, 94,197,186, 59, 1,104, 2,160,
+ 33, 0,155,143,120, 63, 61, 1,140, 44,234,131, 22, 2, 24, 14,160,254, 71,248,141, 8, 90, 40, 31,205,183,243,184, 66, 75, 28,
+243,104,137, 99, 30,223,214,253, 74, 57, 41,120, 44,225,172, 35,151,203,231,217,216,216,252, 33,149, 74, 47, 73,165,210, 67, 14,
+ 14, 14,243, 1,212,249, 47, 61, 75, 18, 0, 27, 80, 24,159,233, 40, 10,151,194, 15,161,112, 83, 65,245,127,224, 51,255,255, 25,
+ 35,254, 91, 95,220,206,202,105,229,180,114, 90, 57,173,156, 86,206,127, 33, 39,105,189,159, 86,161, 85, 73,161,245,238, 1,160,
+156,200,240, 86, 88, 97,133, 21, 86, 88,241,255, 24,140,245, 22, 88, 81, 73,148,186,180, 76,148,163, 74, 43, 19,107,170, 42,202,
+246,180,149,211,202,105,229,180,114, 90, 57,173,156, 86,206,255,119,156, 86,124, 68, 88,205,170, 86, 78, 43,167,149,211,202,105,
+229,180,114, 90, 57,255,215, 97, 93, 58,180,194, 10, 43,172,176,194, 10, 43,172,248,139,176,182,132,224,122,107, 9,209, 42,180,
+ 42, 15, 18,192, 87, 0,122, 1,168,133,194,108,246,251, 0,252,134,170,173,233,219, 0,152, 2,160, 57, 10,119,231,196, 0,184,
+132,194,221, 57,249,214,219, 93, 58, 28, 28, 28,166,209, 52,109, 7, 20,166, 54, 49,191,150,252,191,201,100,202, 81, 42,149,243,
+255,162, 34, 80,176, 48,130,178,185,172, 37,203, 86,242,213, 96, 48,252,149,229,180,226,159, 9, 31,185, 92,190, 61, 43, 43,171,
+ 63, 74, 36, 89,182,194,138,255, 5, 56, 58, 58,142,210,235,245,211,185, 92,238,188, 55,111,222,252,254,255,168,234,239,137,172,
+183,132, 86,100,100,228, 5, 0,232,220,185,243, 39, 0, 96,103,103,119,149, 36, 73,207,202,124, 3,195, 48, 49, 57, 57, 57,101,
+ 6, 80,179,179,179,187, 74, 81,212,123,156, 6,131, 65,202,225,112,242, 74,251,140,209,104, 76, 84, 42,149, 13,255, 33, 55,145,
+ 0, 16, 41,147,201, 52,115,230,204,249,173,117,235,214, 30,201,201,201,198,201,147, 39,183,186,119,239, 94, 39, 0, 29, 42, 41,
+182,154, 18, 4,177, 57, 40, 40,232, 96,120,120,248,158,144,144, 16, 94,102,102,166,116,223,190,125,110, 91,182,108,137, 98, 24,
+166, 63,202, 73,180,250,255, 25, 52, 77,219, 37, 38, 38, 74,129,194,212, 36, 69,194, 10, 6,131, 1, 6,131, 1, 42,149, 10,129,
+129,129, 31,253,123, 93, 92, 92,130, 9,130, 88, 41,145, 72, 26,230,231,231,223, 2, 48, 38, 37, 37,229, 94,101,202,106, 52, 26,
+193,178,108,113, 57,253,252,252,172, 63,104,229, 48,140,199,227,125,238,237,237,221, 88,171,213,102,199,196,196,220, 52,153, 76,
+ 51,241,241,114,180,217, 2,152,201,231,243, 67,106,213,170,229,241,252,249,243, 4,189, 94,127, 3,133,201,144,115, 63,134,200,
+250,228,147, 79, 46,175, 90,181,202,126,244,232,209,151, 47, 93,186,212,194, 42,182,172,248,111,193,195,195,195, 78,165, 82,173,
+ 7, 16, 76,211,180,139, 64, 32,128, 80, 40, 76,229,243,249,119,133, 66,225,208, 43, 87,174,228, 84,150,211,100, 50,205,140,141,
+141,117,105,210,164,201, 34, 39, 39,167,217, 25, 25, 25, 26,189, 94,127, 38, 59, 59,123, 2, 0,101,121,159,125, 87,139,252,203,
+ 68, 86,201, 87,152, 69, 23,167,168, 98, 44,128,214,111, 41, 48, 14,199, 61, 46, 46,206, 73, 32, 16,128, 97,152,226,193,236,221,
+195,124, 93,167,211, 33, 32, 32, 64, 95,193,128,227,145,144,144,224,196,227,241,138,175,233,116, 58,184,185,185, 49,137,137,137,
+ 78, 69,105, 15,138,161,213,106,225,238,238,254, 79,202,121,244,149, 92, 46,207,141,143, 79, 8,212,104,245, 63, 13, 31, 59,117,
+ 90,255, 94,159,202,174, 94,189,202,116,232,208, 65,123,225,194,133,175, 80,152, 56,213,162,206,156, 32,136, 45,147, 39, 79,158,
+ 45, 16,217,216,159,189,250, 88,187,101,223,145,164, 32,159,154,196,132, 9, 19,168,113,227,198, 93, 12, 14, 14,222,206, 48, 76,
+ 3, 84,194,178, 37,147,201,142,243,249,252, 26, 69,247, 47, 62, 59, 59,251,179,127,224, 3,201,193,251,193, 99, 75,187, 86, 33,
+ 50, 51, 51,161, 86,171,223, 59,252,252,252, 44,205,149, 89,169,114,211, 52,125,104,193,130, 5,110,169, 41, 41,248,117,201,146,
+ 38, 40,180,100, 54,177,228,195,233,233,233,239,149,211,215,215, 23, 86, 84, 10, 83,102,207,158,189,224,203, 47,191,132,201,100,
+130, 90,173,118,125,241,226,133,255,244,233,211,123,188,124,249,178, 49,128, 87, 31, 58, 25,247,246,246,142,254,230,155,111,228,
+141, 27, 55, 70, 81,150, 10,215, 75,151, 46, 53,217,176, 97,195,192,248,248,120, 95, 0,111, 62,228, 11,228,114,249,246,117,235,
+214,217,139, 68, 34, 28, 62,124,216,190,109,219,182,151,238,220,185,211,242, 3,196, 22,105,111,111, 63, 14, 64, 27,134, 97,120,
+ 0,110,100,103,103,207, 69,229,163,186, 43, 36, 18,201,126,146, 36,107, 2,127, 70,163, 39, 73,210,129, 32,136, 12,243, 53,130,
+ 32,156, 24,134,185,150,149,149,213,204,250, 56,254,187, 97,111,111, 63, 44, 45, 45,109, 21,159,207,231,202,100, 50,136, 68, 34,
+112, 56, 28,112, 56,156,106,124, 62,191, 26,159,207,239, 24, 26, 26, 58,230,220,185,115,229, 70,216,111, 26,228, 60, 24, 36,241,
+ 19, 69,144, 20, 0,144,180,216,198,214,214, 22, 63,253,244,147,184, 91,183,110, 98, 0,184,124,249,114,248,160, 65,131,218, 38,
+ 38, 38, 6,148, 37,182, 74,211, 34,255, 34,172, 45,111,192, 67,145,122,188,240, 86,203, 37, 73,240,120, 60, 92,191,126, 29,150,
+ 4, 43, 55,167, 72, 40,183, 55, 40,138, 48,126,239,222,159, 6, 0,243, 64,195,227,241,112,229,202,219, 65,229,155, 54,109, 90,
+220,216,255, 46,244,242, 43, 12,242,184,247,235,194,114,133,173, 44,140,174,189,247,107, 95,180,250, 37, 14,189,198,205,234, 83,
+160,209, 55, 2,160,202,201,206,206,190,117,224, 64,114,144,143, 15,119,251,246,237,141,221,220,220,122, 85, 66,104, 77,105,208,
+160,193,126, 74,104,235, 16, 62,104,112,248, 80, 14,169, 31, 56,114,226,188,132,148, 12,213,136, 17, 35, 14, 28, 62,124, 56,252,
+231,159,127,126, 50,105,210,164, 41, 0,126,176,180,252, 2,129,160,198,211,167, 79,189, 77, 38, 19,252,252,252,254,137,105, 12,
+130, 80, 24,124,239, 75, 0, 59,139,174,245, 67, 97,228,254, 96, 0,119, 43, 67,102,182, 96,149,118,124,108,184,185,185,249, 14,
+ 24, 48,192, 33, 43, 35, 3,191, 46, 89, 98,190,220, 16, 21, 44, 35,154,219,143, 78,167,195, 23, 95,124, 49,192,100, 50,113,204,
+ 34, 80,171,213,234,114,115,115, 53,248,211,177,244, 13,128, 79, 45, 40,142,167, 88, 44,254, 15,128, 96,181, 90,237, 6, 0, 98,
+177, 56,137, 97,152,131, 42,149,234, 7,252,153,192,183,210, 19, 92, 0,254, 40, 59, 21, 20,187, 96,193,130,231, 83,167, 78,125,
+245, 95,224,172,225,236,236, 60, 63, 44, 44, 12, 71,142, 28,193,209,163, 71, 13, 66,161,144, 51,104,208, 32, 98,204,152, 49,178,
+111,190,249,166, 35,128,101, 31,248, 51,119,156, 61,123,182,188,110,221,186,216,183,111, 31,238,223,191,175,246,246,246, 22,182,
+110,221, 26, 28, 14, 71, 62,109,218,180, 14, 0, 54,127,200, 23,100,101,101,205,157, 56,113,226,150,157, 59,119, 74, 99, 98, 98,
+176,114,229, 74,135, 62,125,250, 92,136,143,143,255,164, 18, 98,139, 15, 96, 28,128, 80,138,162, 90, 14, 26, 52,200, 56,118,236,
+ 88,154, 36, 73,195,146, 37, 75, 28, 55,108,216,208,135,166,233,224,204,204, 76, 75, 38,105, 36,128,159,134, 14, 29, 58,228,220,
+185,115,178,155, 55,111,242,236,237,237, 97, 50,153,138, 45,197, 12,195, 56,153,159, 89,163,209, 8, 95, 95, 95,247, 18,159, 23,
+254, 91,133, 6, 73,146,122,134, 97,104, 0, 2, 0,218,138,206,255,151, 68,150, 92, 46, 31,157,149,149,245,155,139,139, 11,156,
+157,157,223, 27,107,181, 90, 45, 4, 2, 1,215,197,197,101, 93,183,110,221,232, 67,135, 14,149,185, 4, 72, 80,196,204,195,187,
+230,184,201,101, 82, 0,192,210,213, 39, 10, 0,224,143, 63,254, 64,114,114, 50,100, 50, 25, 2, 2, 2,168, 57,115,230, 40, 38,
+ 76,152,240,107,118,118,246,208,178,184,222,213, 34,255, 50,139,214,218,210,206,203,245,209, 98, 89,182, 56, 79,158,133, 15,237,
+187,151, 78,191,195, 71,232,116, 58,188,107,209, 50, 55, 94,154,166,223, 53, 63,130, 32, 8,182, 60,206, 82, 48, 72, 44, 22, 7,
+170, 84,170, 21,149,152,221, 22,115,238,253,218, 23, 91,248,147,251,153, 51,145,118,156, 88,248,186, 5,192,213,215, 67, 87,174,
+250,228, 19,183,113, 51,150,207, 82,103, 38,103, 76, 27,208,165,134,183,139,189, 80,156,147,158, 43,175, 83,167,253, 59, 22,153,
+138,202,217, 42, 60, 60,124,235,201,235,177,132, 64,192,229,114, 40,138,110, 81,207,199,222,195,150,178,149, 2,182, 9,175,158,
+ 95, 29, 60,120,112,189, 73,147, 38,181,172, 4, 39,138, 6, 92,108,219,182, 13, 4, 65,144,149,169,251, 71,196,233,242, 68, 22,
+203,178, 32, 8, 98, 71,137, 65,101, 71,209,181, 59, 37,196, 22,167,188,251,105,182,166,154, 69,213,160, 65,131, 6, 24,141, 70,
+ 78,137, 78,226, 93, 1, 83,154,136,177,168,238, 10,133,226, 36,128, 79, 9,130,128, 78,163,209,253,231,151, 95, 74,254,249,246,
+ 59, 34,235,116, 89,109,201, 96, 48,192,100, 50,113,238,220,185, 67,151,120,214,105, 0, 98, 0, 14, 44,203,130, 36,201, 7, 22,
+220, 79, 95,145, 72,116, 53, 34, 34,194,166, 97,195,134, 4,143,199,131,209,104,196,195,135, 15, 61,126,254,249,231,145,167, 79,
+159,238,160, 82,169,252,240,126,242,116, 75,126, 35,255, 75,151, 46,169,188,188,188, 74, 21,142, 74,165,146,227,227,227,243, 73,
+ 25,162,232,175,230, 76, 76, 75, 75,235,254,233,167,159,142, 74, 77, 77,141, 54, 26,141,223, 3, 8,112,112,112,184,211,179,103,
+ 79, 8,133,194, 80,181, 90,189,236, 67,158,121, 39, 39,167,110,205,154, 53,195,202,149, 43,241,243,207, 63,183, 3,112, 6, 64,
+ 91,165, 82,121,186,107,215,174,176,179,179,235,158,147,147,179,249, 3,218,145, 79,171, 86,173,214,253,244,211, 79,210, 35, 71,
+142,192,219,219, 27,121,121,121,248,238,187,239,156,126,252,241,199,243, 57, 57, 57,173, 75,180,139,178, 56,253,248,124,254,230,
+157, 59,119, 74,188,188,188,188,184, 92, 46,233,229,229,133,172,172, 44,104, 52, 26,254,188,121,243,234, 9,133,194,123,203,150,
+ 45,219, 12,160,103, 5,229, 36, 1,204, 93,179,102,205,168, 17, 35, 70,216, 13, 24, 48,192,164,211,233,176,103,207, 30, 80, 20,
+ 5,154,166, 33, 18,137,138,147, 87,115,185, 92,212,169,243, 94,144,244,195,229,212, 55, 23,133,126,168,118,168,220,178,235,233,
+114,248,138,151, 62,104,154,134, 64, 32,128, 64, 32, 0,159,207,199,211,167, 79,103, 8, 4,130, 37, 4, 65, 24, 45,225, 36,254,
+ 84, 23,129, 0,110, 86,116,142,247, 93, 67,254,206,254,211, 12,119,130, 32,150, 2, 8, 45, 28,118,201, 11, 14, 14, 14,227,211,
+210,210,226, 44,229, 84, 40, 20,246,153,153,153,203, 20, 10, 5,156,157,157,139,199,111, 55, 55, 55, 24, 12, 6,164,165,165,129,
+101, 89,228,228,228, 64, 36, 18,193,213,213,117,217,136, 17, 35,246,173, 93,187, 54,179, 84, 78, 6, 63,119,237, 51,125, 38, 69,
+ 81, 36, 0, 80, 28,137,228,155,169, 64,141, 26, 53,208,162, 69, 11,104, 52, 26,228,230,230,194,223,223,159, 67, 16, 68, 56, 65,
+ 16, 54, 44,203,254, 14,224,236,255,160,161,176, 76,103,248,217,239,174,139,154,179,197,115,185, 92,139,132, 86,209,251, 43,178,
+160,144, 6,131, 1, 92, 46,247, 45,139, 4, 65, 16, 48,153, 76,111, 93, 55, 11,173,170, 8,245, 49, 99,198, 48,235,214,173, 27,
+149,157,157,189, 26, 85, 92, 74, 8, 15, 15,127,207,223, 99,194,132, 9,137,233,233,233,236, 23,237, 3,197,209,199,146, 83,106,
+201, 36, 66, 71,169,180,166, 64, 38,183,203,204,204,188, 86,212,153, 88,138,218, 13, 26, 52, 16,110, 57,112, 41,113,248,183, 11,
+230, 52,244,178,183,169,239,238, 32,115,177, 21,242, 36, 36,161, 18, 24, 13,137,114,185,220,187,178,229, 54,247, 11, 34,145, 8,
+ 36, 73,254,147, 44, 90, 28,179,200,202,202,202,194,145, 35, 71,208,169, 83,167, 59,102, 17,162, 84, 42,145,146,146, 2,133, 66,
+113,167,200,242, 81,225, 50, 34,195, 48,208,235,245,208,235,245,197, 2,166,196, 51, 84, 44, 96,204,239,165, 40,234, 65, 21,203,
+ 62, 71, 38,147,181, 10, 13, 13,229,237,218,179,135,199,178,172, 10,133, 57,212,242, 89,182,140, 4,217,239,192,104, 52, 22, 91,
+217,104,154, 70,124,124,124,241,192,101,206, 45, 41, 16, 8, 44, 51,101,240,249, 19,119,239,222,109,211,184,113, 99, 34, 51, 51,
+ 19, 12,195, 20,119,146,191,253,246,155,160, 87,175, 94,110, 81, 81, 81,211,180, 90,237,236, 42,212,149, 40, 75, 16, 1,128,141,
+141,141, 17,150, 69,204,174,144,211,104, 52, 18,205,155, 55,159,148,145,145, 81, 79,173, 86,207,179,228, 54, 2, 56,156,152,152,
+ 88,114, 96,191, 23, 29, 29,173,238,221,187,183,176,102,205,154, 33,143, 31, 63,254,160,135,212,199,199,167, 41, 77,211,184,113,
+227,134, 22,128,121,102,125,225,254,253,251,218,158, 61,123,242, 61, 60, 60,154,230,228, 88,236,178,226,227,235,235,123,202,201,
+201, 73,104,238, 67, 29, 29, 29,233,181,107,215, 74,147,146,146,160,215,235, 49,101,202, 20,116,238,220, 25, 14, 14, 14,152, 48,
+ 97,130,243,162, 69,139,182,231,231,231, 55, 40,207,104,205,227,241,182,190,120,241,194, 91,161, 80, 8,175, 95,191,142,250,245,
+235, 35, 35, 35, 3,169,169,169,200,207,207, 71,106,106, 42,134, 14, 29,234,244,235,175,191,186, 90, 96,201, 42, 22, 89,107,215,
+174,205,217,191,127, 63,181,126,253,122, 41, 77,211,197, 66,139,195,225, 20, 11, 45,115,110,197, 42,172, 52,228, 20,137, 54,187,
+220,220,220, 15,241,115,227, 3,224,149, 20, 89,124, 62, 31,124, 62, 31, 2,129,224,131,242,178,254, 75,224, 70, 16,196, 99, 46,
+151,203, 23,137, 68, 92,146, 36,193,231,243,219,203,229,242, 71, 1, 1, 1, 1,167, 78,157,138,181,132, 68,163,209,108,229,243,
+249,180,147,147, 19, 0,192,219,219, 27,245,235,215,135, 74,165, 98,114,115,115, 97,103,103, 71,198,197,197, 65,173, 86, 35, 37,
+ 37, 5,213,171, 87,167, 73,146,220,138, 66, 63,228,247,112,245, 78,234,106, 0,171,205,231, 14, 14, 14,105, 37, 45,157, 2,129,
+ 0,110,110,110, 72, 74, 74,130, 84, 42,165,126,252,241,199,158,123,246,236,233,113,245,234,213,112, 0,219, 74, 80,205,254, 23,
+251,104,153, 69, 86,201,215, 63,133, 86,231,206,157,103, 69, 70, 70,126, 82,218, 44,156,166,233,143,230,235, 98, 22, 84, 54, 54,
+ 54,239, 90,173,192, 48, 76, 89, 22,173, 74,127,143, 64, 32, 16,142, 30, 61, 58,239,247,223,127,175,180,216, 10, 91, 25, 93,108,
+197,122,111, 26,233,231,119,117,218,180,105,221,206,157, 59,151,212,208,171, 38, 71,156, 28,151, 47,176,177,179,131,123,181, 78,
+131,186,247,188,143,194,221,135,150,226, 69, 94, 94,158,176,150,187, 72, 71,146, 26,162, 26,159, 35, 85,136,185,124, 23,153,204,
+141,171,211,166,219,200,100, 60,173, 86,155,131,114,146, 64, 3,128,179,179,243, 9,161, 80, 88,221,124, 46,147,201,108, 89,150,
+133, 72, 36,130, 66,161,144, 80, 20,245,172, 68,227,138, 75, 75, 75,107, 95, 81,193,236,236,236, 78,240,249,252,234, 36, 73,130,
+ 32, 8, 80, 20, 5,146, 36, 65,146,100,241,255, 41,138, 2, 65, 16, 40, 40, 40,136,139,141,141,109,111, 65,125,141, 0,130, 9,
+130,184,115,228,200, 17,132,132,132,224,216,177, 99,248,252,243,207,145,155,155,139,135, 15, 31,162, 85,171, 86, 64,225,146,162,
+ 69, 40,233,252,110,158, 20, 60,125,250,180, 88,184,148, 60,164, 82,233,135,152,216, 47,135,133,133, 97,221,186,117,108,209,100,
+ 66, 76, 16, 68,125, 91, 91,219,167, 79,158, 60,177,200, 15,134,101, 89,232,245,127,190,213, 60,120, 21,249, 67, 84, 42, 57, 48,
+ 69, 81,237, 27, 52,104, 64,228,230,230,154, 5, 36, 56, 28, 14, 40,138, 2, 69, 81, 88,181,106,149,176,113,227,198,211,249,124,
+254, 36, 46,151,171, 52, 24, 12,187, 52, 26,205, 60, 0, 57,255,164, 30,169,101,203,150,223, 38, 36, 36,116,174, 94,189,122,196,
+ 7,208,176, 6,131, 65, 7, 64, 72, 81, 20,253, 17,250, 40,170,232,217,210,148, 16,251,198,162,115, 62, 10,151,137, 45,130,131,
+131,195,246,163, 71,143,186, 87,175, 94, 29, 6,131, 1, 70,163, 17,249,249,249,184,112,225, 2,180, 90, 45,140, 70, 35,188,189,
+189, 49,115,230, 76,205,248,241,227, 5,107,214,172, 73,207,207,207,239, 95, 1,237,248,125,251,246,137, 21, 10,133, 80,173, 86,
+227,213,171, 87,104,208,160, 1,242,242,242,160, 82,169, 80, 80, 80, 0,189, 94, 15,165, 82,105,103, 50,153,116, 21,112,205, 40,
+ 41,178, 70,142, 28,249,128,199,227, 53, 24, 59,118, 44, 18, 19, 19,139,219,252,240,225,195,225,236,236, 92,220,150,138,250,228,
+ 74,117,204, 28, 14, 7,124, 62, 31, 92, 46, 55,167, 90,181,106, 32, 8, 66, 16, 23, 23, 87,149,165, 56, 27, 0, 74,154,166,121,
+ 37, 5, 22,159,207,199,141, 27, 55,166,241,120,188,178,172, 89,101,181, 75,182, 50,231,255,109, 16, 4,177,148,203,229,242,229,
+114, 57,183,196,132,147, 43,145, 72,224,228,228,180, 18, 64, 71, 11,235, 29, 36,151,203,139,251,247,192,192, 64, 36, 36, 36, 28,
+204,205,205, 29,152,158,158, 14,146, 36,183,146, 36,217,195, 60, 73,205,206,206,134,135,135, 71, 80, 89,124,205,130, 93, 70,129,
+ 96,223,178,104,189, 51, 65,131,141,141, 13, 94,191,126, 13,149, 74,197, 62,127,254,156, 24, 61,122, 52,161,211,233, 54, 69, 69,
+ 69, 93, 67,225,110,251, 50,181,200,191, 4,149,247,209, 50, 91,180, 44, 29, 0, 8,130,168,112, 54, 97, 48, 24, 36,254,254,254,
+165, 57,124, 17,165, 9,173,162,229,164, 42, 61,232, 52, 77, 75,171, 42,182,222, 69,196,254,157,206, 63,207,156, 50, 83,238, 90,
+179,214,164, 73, 51, 56, 93,186,116,185,190,101,203, 22,147,188,110,199,182,103, 79,108,115, 94,246,221,228, 99, 71,143, 30, 5,
+ 10, 29,163, 45,197,229,200,200, 72,151, 9,227,198, 96,230,196,241,199,109,188, 29,120, 18, 66, 46, 22,104, 85,111, 36, 96,213,
+252,218,190,157, 15, 68, 68,164, 0,136, 42,143, 68, 36, 18, 85,127,252,248,177,119,201,141, 4,186,255,107,239,187,227,163,168,
+214,247,159,153,217, 94,178,233,149, 64, 2, 72,147,208, 66,239, 85, 64, 64,177, 80,174, 82, 47, 24, 68,188, 94,208, 43,232, 15,
+189, 98,164, 8,194, 23, 20,164,228,130, 82, 68,175, 52,105, 2, 82, 76, 72,164, 39, 32, 33, 9,161,167,183,205,102, 55,187,155,
+205,150,153,157,223, 31,217, 89, 55, 33,101, 55,108, 4,188,251,124, 62,243,201,206,206,228,217, 51, 51,103,206,121,206,123,222,
+243,190, 38, 19,164, 82, 41,206,156, 57, 19, 40,145, 72, 2, 1,192, 96, 48,160, 83,167, 78,206, 90, 76, 34, 50, 51, 51,219,122,
+121,121,161,162,162, 2, 70,163, 17, 22,139, 5, 86,171, 21, 4, 65,128,207,231, 67, 40, 20, 66, 38,147,185,186,178,239, 42,128,
+215,199,142, 29,187,251,216,177, 99,136,138,138, 66, 89, 89, 25, 50, 50, 50, 56,145,229,146,143, 22,103, 37,114,244,199,226,241,
+120,248,174,117,107,188,145,159,111, 23, 48,235,188,189,241,111,107,227,178,105,116,234,212,137, 77, 74, 74,194,241,227,199,241,
+226,139, 47, 18, 7, 15, 30, 52, 51, 12, 35,200,207,207,191,158,159,159,239, 20,135,213,106,181,151,149,107,183, 29, 5,150,171,
+ 66,139,166,105, 47,161, 80,136,202,202, 74,112,150, 7,199,173, 85,171, 86, 80,169, 84,188,242,242,114, 94,126,126,190,116,233,
+210,165,255,136,143,143, 15,213,106,181,175, 61,206, 86,104,211,166, 77, 17,111,188,241, 70, 54,143,199, 99, 71,143, 30, 61, 53,
+ 43, 43,235,165,208,208,208,211,191,254,250,235, 26, 0,237, 92,229, 11, 8, 8,184,194,227,241,194,203,203,203, 5,123,246,236,
+177,104,181, 90, 65, 96, 96, 96, 17,215,118,112,247,218, 98,177, 56,181,114, 57, 32, 32,224,138, 82,169, 20,172, 95,191,222, 82,
+ 90, 90, 42, 8, 14, 14, 46,226,120,212,106,181, 96,207,158, 61,150,242,242,114,129,183,183,247, 21,141, 70,211, 32,159, 82,169,
+156, 50,125,250,244,196,211,167, 79, 7, 80, 20,133,172,172, 44,148,150,150,194,199,199, 7, 59,119,238, 68, 68, 68, 4,246,238,
+221,171, 82,169, 84,179,191,248,226,139,143,108, 34,171, 33, 31,173, 65,189,123,247,142, 80,171,213,240,241,241,129, 94,175,199,
+149, 43, 87,208,177, 99, 71,228,231,231,131, 36, 73,248,248,248, 96,227,198,141, 21, 4, 65,168,234, 35,146, 72, 36, 47,197,196,
+196,248, 0, 64, 76, 76,140, 79, 76, 76, 76,173, 29, 92,223,190,125,177, 97,195,134,154, 66,203,149,129,129,221,234,228, 32,142,
+ 42,251,244,233,131,248,248,248,133, 46,138, 35, 19, 39,218,106, 90,179, 68, 34,145,203,139,105,172, 86,171, 0, 85, 46, 13,132,
+ 51,251, 79, 0, 6, 75, 36, 18, 65,205, 47, 43, 42, 42, 4,161,161,161, 3, 93, 16,190,254, 18, 73,149,193, 41, 34, 34, 2, 26,
+141,134, 49,153, 76,147,119,237,218,101, 1,128,232,232,232,201, 12,195, 84,210, 52, 77, 9,133, 66,232,245,122, 4, 5, 5,249,
+215, 99, 27, 93,116,232,135,165, 33, 53,125,180, 66, 67, 67, 17, 29, 29, 13,163,209,136,130,130, 2, 36, 36, 36, 88, 24,134,217,
+189,105,211, 38,107, 96, 96,224,223, 95,125,245, 85, 42, 57, 57,249,109, 0, 11,234,210, 34, 79,153, 53, 43,174, 78,161,101, 83,
+144,241, 0,134,212,188,200,154,226,167, 62,161,213,208,212,161, 80, 40, 84,103,103,103,203, 28, 59, 21,154,166, 17, 22, 22,102,
+101, 89,150,168, 77,104, 61,138, 41,152,207,231,123,125,248,225,135,234, 77,155, 54, 77,185,127,255,254, 18,103,254,103,207,219,
+ 29,176,163,134,200,218,188, 50,118,195,250,149, 75,253,238, 28,255, 22, 91,191, 90,205, 48, 12,146, 59,119,238, 60, 80,167,211,
+241,188,101, 22, 40,213, 56,102, 19, 89,206,138, 66, 18,192, 55,151, 46, 93, 74, 30, 51,102,204,111,223,252,119,191, 95,254,221,
+187,231, 69,229,202, 2, 69,155,182, 60, 65,179,136,151,181,149,149,130,201,147, 39, 7, 2,120,181,161, 70, 76,173, 86,163,176,
+176,176,166, 0,195,205,155, 55, 31, 58,215,169,194,145, 36, 24,134,193,190,125,251, 32,149, 74, 33,147,201,170,109,156,200,106,
+228, 66,133, 76, 0, 24, 61,122, 52, 84, 42, 21,228,114,185,211,229,170, 41, 94, 88,150,133,201,100,130,201,100,130,217,108,102,
+ 0,240,121, 60, 30,102,229,230,218,173, 60,174, 8,152,154,232,220,185, 51,123,238,220, 57,252,246,219,111,208,235,245, 88,191,
+126, 61, 66, 67, 67,135, 1,248,216, 85, 46, 7, 39,125,166,188,188,156, 95, 94, 94,110,183, 14,242,249,124,187,245,192, 73, 75,
+158,128,199,227,217, 71,163,220,230,104,213,162, 40, 10,193,193,193, 8, 9, 9,193,230,205,155, 5, 45, 91,182, 28,247, 56, 91,
+160, 85,171, 86,181, 89,183,110,221,182, 29, 59,118, 28,155, 50,101,202,143,169,169,169, 51,189,189,189,175,159, 57,115,102,169,
+ 72, 36,178, 54,242,253, 14,207,207,207, 15,114,252,202,106,181, 74,105,154,182, 11,219,138,138, 10,167, 7, 24,124, 62, 63, 60,
+ 45, 45, 77, 10, 0, 75,151, 46,229, 3,144,114,206,224, 28,103, 69, 69, 5,191, 99,199,142,225,206,214,245,196,196,196,129, 35,
+ 70,140, 56,119,242,228, 73,223,136,136, 8,228,229,229, 33, 47, 47, 15,109,218,180,193,242,229,203,245,229,229,229,253, 1,100,
+234,116,186,131, 78,114,134,249,250,250,242,179,179,179, 65,211, 52,186,117,235,134,141, 27, 55, 98,242,228,201,232,212,169, 19,
+202,203,203,145,150,150,134,237,219,183,251, 10, 4,130,122,219, 14,131,193,112, 48, 46, 46,174,121, 77,139,214,212,169, 83,101,
+ 69, 69, 69,246, 58, 25, 27, 27, 91,109, 10,209,149, 54,217, 54,181, 85,231,214, 24,208, 52,173, 16,139,197,229, 34,145, 72,200,
+249,103, 37, 36, 36,184,108,205,170, 49, 0,116,101,255,177,129, 19,173,181,244,173, 8, 9, 9,113,154, 71, 36, 18, 17, 92,219,
+ 72,211, 52, 52, 26, 13, 19, 26, 26,106,159,222, 79, 73, 73, 97, 34, 35, 35, 25,138,162, 40,161, 80, 8,130, 32, 32,149, 74,235,
+108,240, 89,134,141,125, 97,242,199,213, 86, 29,206,255, 16, 48,155,205, 72, 73, 73,129,217,108, 70, 66, 66,130,229,139, 47,190,
+200, 87,171,213,243, 1,240, 78,156, 56, 49,125,225,194,133, 84, 80, 80,208,136,226,226, 98, 52,164, 69,158, 34,177,245,144,149,
+139,235,133,226,199,141, 27, 71,216,150, 86, 18,156,112,114, 69,104,217, 94,190, 6,123, 94,130, 32, 80, 80, 80, 96,223, 15, 10,
+ 10,114,249,183,156,133,191,191,191,190,111,223,190, 94, 74,165,242,224,170, 85,171, 26,101,201,218,188, 50,118,195,138,207, 62,
+241, 83,165, 95, 64,110,126, 1, 84,197,150,228,164,235,247, 15, 0, 56, 0, 0,216,242,108, 60,241,102,198,215,206,114,118, 8,
+144,116,229, 11,120, 7,158, 27, 51,174,249,164,152, 5,228, 91,111,189, 53, 96,250,244,233,154, 41, 83,166,188, 35,151,203,219,
+153,205,230,178,253, 71,143, 62,152, 52,105, 82, 75,134, 97,166,163,129,152, 35, 6,131, 33,107,200,144, 33,142,247, 83,113,234,
+212,169,224, 7, 15, 30, 96,222,188,121, 37,121,121,121,106,199,115,157, 41,163,217,108,206,234,218,181,107,157,211,133,220,148,
+ 34, 0,104,181,218, 44, 23,110,233,107,176, 57,190,151,150,150,226,230,205,155,224,241,120,232,211,167, 15,146,146,146, 48, 96,
+192,128, 20, 87,172, 90,149,149,149,136,136,136, 64,101,101, 37,244,122,125, 5, 0,209,206,150, 45, 1, 0,111,151,150,226,202,
+ 23, 95,224,194,138, 21,112,172,207,206,162, 75,151, 46,236,133, 11, 23,112,253,250,117, 24,141, 70,204,158, 61, 27, 0, 8, 91,
+221,117, 37,100, 70,107,138,162, 70,143, 25, 51, 38, 12, 0,244,122, 61,113,233,210, 37,136,197, 98,251,187,112,248,240, 97,228,
+229,229,129, 32, 8,248,250,250,134,151,149,149,181, 4,112,191, 30,179, 63,113,255,254,125,124,254,249,231,176, 90,173, 88,184,
+112, 33,218,182,109,107, 23, 88, 89, 89, 89, 88,186,116, 41, 24,134,193, 39,159,124,130, 54,109,218,192, 98,177,136,209,200, 16,
+ 26,238,192,187,239,190,123,231,192,129, 3,199,114,114,114,158, 95,185,114,229, 96,130, 32,172,239,191,255,254,231, 10,133,130,
+121, 20,222, 50,141, 22, 55,111,103,217,133, 80,205, 45, 48,192,207,101,190, 91,119,115,236,255,207, 48,142,124, 12,252,253,124,
+ 93, 45, 98,133,197, 98,209,191,252,242,203, 62,251,246,237, 35,218,180,105,131,123,247,238,113,150,161, 10,184, 30,210, 33, 79,
+165, 82,181,165, 40, 74,112,251,246,109, 68, 70, 70,162,119,239,222, 88,182,108, 25,148, 74, 37,104,154, 70, 80, 80,144,213, 98,
+177,164,152,205,230,179, 13,112,197,206,153, 51, 71, 0,224, 77,155,101,171,243,252,249,243,173,171, 87,175, 70, 74, 74,138,221,
+130,229,232, 12,239,234,212,161,163,213,201,113, 75, 72, 72, 88, 40, 20, 10, 89, 0, 23,225,122,160,103, 83, 77,139, 86, 99,172,
+ 89, 77,133,166, 92,201, 24, 26, 26,154,224,229,229, 53,174,172,172,172,154, 85,171,127,255,254,230,224,224,224, 68,103,121,228,
+114,121, 25, 69, 81,254, 0,144,151,151, 7,153, 76, 38,184,123,247,238, 10, 84, 5,207, 70,203,150, 45, 87,168, 84, 42, 65, 75,
+ 91,123, 26, 18, 18, 2,147,201, 84,167, 27,203,249,171, 69,223, 2,248,150,219,247,243,243, 43,208,104, 52,146,213,171, 87,235,
+ 86,172, 88, 97, 96, 24,198, 8,224,140, 90,173,182,199,209, 42, 44, 44,212,240,249,124, 63, 31, 31,159,102,156,208,170, 77,139,
+ 60,101,168,219,162,101, 83,146,108, 77, 65, 68, 16,196, 67, 14,234, 13, 8,173, 6, 69, 22,195, 48,213,172, 12,156,195,123,109,
+191,101,235,212, 27, 53,117,104, 19, 89,226,253,251,247,239, 92,181,106,213, 69,103,255,207,209, 71,107,203,154,207, 86,114, 34,
+235,247,223, 78,226, 96,134, 70,185,112,197,218,117,141,125, 2,207, 6, 72,187, 4, 7,251,199,127,177, 60, 86,113,231,248,118,
+252,184,229,255,216,223, 47, 95,238,117,249,242,229,105,243,230,205,107, 97,171, 88, 42, 0,215, 0, 76,130, 19,171,116,242,242,
+242, 70,213,232,132, 51, 5, 2, 65,176, 84, 42, 69, 94, 94,158,238,214,173, 91, 46, 79,201, 40,149,202, 81, 77, 80, 1,121,156,
+200, 82, 42,149, 72, 75, 75,195,208,161, 67, 1, 0, 73, 73, 73,232,223,191, 63,146,147,147,209,189,123,247, 20, 0, 61,209, 64,
+160, 86,139,197,162,126,246,217,103,237,214, 45,141, 70, 99, 5,128,152,130, 2,196,133,134,130,199,227,225,194,138, 21, 88,108,
+177, 96,153,139, 2,190,107,215,174,236,165, 75,151,240,224,193, 3,208, 52,141,241,227,199,163,145, 47,125,167, 14, 29, 58,156,
+ 58,115,230, 76,160, 92, 46,135, 94,175,135, 78,167,195,140, 25, 51, 48,121,242,100, 24,141, 70,236,217,179, 7,135, 14, 29,130,
+151,151, 23,244,122, 61,244,122,189,239,216,177, 99,207,101,102,102, 14, 2,112,187, 14,161,197,142, 26, 53, 10,137,137,137,160,
+ 40, 10,189,122,245, 66,105,233, 31,139,129,130,131,131,107, 59, 70, 61, 78,161,197,227,241,216,132,132,132,149,131, 7, 15, 70,
+ 78, 78,206,243,221,187,119, 95, 63,115,230,204,188, 71,229,245,245,246, 66,215,142,173, 97, 52, 26, 97, 52, 26, 17, 22, 22, 6,
+173, 86,139, 59,119,238,192,104, 52, 34, 56,200,199,101,190,232, 78,109,236,124, 65, 65, 65,208,235,245,184,127,255, 62, 76, 38,
+ 19, 2, 2, 92, 18, 90,205, 71,141, 26,245,235,238,221,187,253,183,111,223,110, 26, 50,100,136,112,253,250,245,132, 66,161,128,
+ 67,199,226, 42, 18,146,146,146, 34, 70,140, 24,209, 62, 61, 61, 29, 9, 9, 9, 48,153, 76,136,142,142,198,173, 91,183,208,183,
+111, 95,232,116,186,139,151, 47, 95, 62,228,140, 97, 24,192, 71,115,230,204, 1, 39,182, 18, 19, 19, 81, 80, 80, 0, 47, 47,175,
+135,132, 22,231,251,104, 91, 53, 30,230, 76, 97, 57, 65,228, 96,121, 90,236,227,227, 99, 6,176,174,145,214, 39, 0, 64, 78, 78,
+142,168,115,231,206, 70,177, 88, 44,180,137,182,181,143,194,231, 78,184, 97, 37, 99,157, 8, 9, 9,153, 31, 16, 16, 48,162, 85,
+171, 86, 40, 42, 42, 18, 8,133, 66,244,239,223,223,220,179,103, 79,115, 72, 72,200,219,206,242,136, 68,162,116,129, 64, 48,168,
+106, 48,193, 32, 59, 59, 27, 44,203, 46,236,212,169,211, 63,181, 90, 45, 74, 75, 75,133, 10,133,194, 62,168,110,223,190, 61,140,
+ 70, 99,186, 11,150,183,216,200,200,200,143, 4, 2,193, 50,165, 82, 89, 91, 88, 8,161,143,143,143, 66, 32, 16,192,108, 54, 87,
+ 19,155, 53,181,200,211, 46,178,170, 9, 45, 7, 21, 89, 77,232,184, 98,209,114,198,106,192, 57,216, 59,238,115,162,174,230,111,
+ 53, 54,134,150,183,183,183,145, 19, 89,203,150, 45,187,216, 24,142,189,187,119,133,122, 91, 43,154,231, 95,252, 25,153,215,147,
+113, 32, 77,173, 92,184, 98,237, 59, 47,188,250, 90, 81, 77, 97,230, 12,218, 6, 74, 59, 5, 7,249,199,175, 89,181, 66,161, 74,
+191,128,130,194, 66,252,124,241,114,178, 25, 72, 3,176,208,157,166,101,160,106,234,144,162,168, 39,169,194,218,157,225, 11, 10,
+ 10, 56,145, 21, 13, 0, 3, 6, 12, 72,177,137, 44, 56,107,209, 82,171,213, 53, 83,214,140, 0, 16,192, 93, 63,143,199, 67,255,
+143, 62,114, 89,100, 1, 96,147,147,147,161, 82,169,184,145, 98, 99, 69, 22, 66, 66, 66,254,117,230,204,153,192,111,190,249,166,
+124,199,142, 29,165, 86,171,149,223,181,107,215,240, 30, 61,122, 16, 59,119,238, 4, 0, 76,154, 52, 9, 11, 23, 46,196,141, 27,
+ 55, 32,147,201, 48, 96,192, 0,102,201,146, 37, 65,243,231,207,127,187,168,168,232,157, 90,123, 71,171, 85, 32, 22,139, 79, 3,
+ 24,150,158,158, 14, 0,231, 80,149,194,137,179, 34,212,121,204,153,206, 87,171,213,242,189,188,188,106, 13, 13, 33,168, 26, 13,
+185,106,129,176,115,254,246,219,111,159,175, 89,179,230,192,123,239,189,119,251, 17, 57,107,181,104,141, 27, 55, 14, 6,163, 25,
+185, 69, 26, 48, 12, 13,131,185,216,101, 62, 71,139,214,184,113,227, 80, 81,105, 66,118,129, 10, 52,205, 64,107,112,186, 47,151,
+ 62,247,220,115, 39,126,248,225,135,144,243,231,207,131, 97, 24,235,173, 91,183,238,191,252,242,203,138,247,223,127,223,255, 17,
+ 22, 25,125,245,218,107,175, 77,248,237,183,223, 84,237,219,183,247,187,120,241, 34,138,139,139, 65,211, 52,134, 13, 27, 6,161,
+ 80,152,189, 98,197, 10, 1,128,175,156,125, 54, 54,177,101,190,124,249,242, 27, 23, 46, 92,240,243,243,243, 19, 90, 59,116, 64,
+193,201,147,216,183,111,223, 67,255,176,101,203, 22,192,201, 40,252,156,197,233,210,165, 75,110, 17, 88,213,122,106,161,176,209,
+211,143, 79, 43, 46, 93,186,148,247,214, 91,111,117, 84, 40, 20,235, 6, 14, 28, 56,212,223,223,159,244,245,245, 77,104,214,172,
+217, 63,187,118,237,234,244,236, 2,159,207,159, 41,147,201,238,208, 52, 77,233,116, 58,232,245,250,170, 70,154,166,133, 36, 73,
+162,101,203,150,246,190,164, 87,175, 94, 8, 9, 9, 97, 50, 50, 50,102, 58,203, 95, 82, 82, 82,109, 21, 98, 45,152,211,191,127,
+127,158,209,104,196,131, 7, 15,146, 28, 15,212,166, 69,158, 18,196,212, 43,190,184,139,114,188,184,102,205,154,229, 88, 44, 22,
+ 54, 13, 96,175, 93,187,198,198,196,196,212,187, 85, 86, 86,178, 65, 65, 65, 5,181,116,126,112,228, 52, 26,141,213,254,207,104,
+ 52,178,193,193,193,140,193, 96,120,136,211, 96, 48,176,225,225,225,121,245,113,214,130, 25, 87,175, 94,221,180,120,241,226,222,
+ 46,220, 32, 59, 39,187,185, 3,187,125,251,246,191,177, 44, 59,120, 96,199,136,235, 19,187, 6,179,253,219, 6,229, 31,218,187,
+123, 50,203,178,131,107,110, 92,128,211,250, 56, 59, 4,203,158, 29, 30,213,162,236,247,227,223,179,103, 86,255,131, 93, 51,190,
+ 45,219, 61,220, 75,221, 33, 64,226,106,142,152, 6,179,165, 71, 69, 69,101, 90,173, 86,214,100, 50,177, 81, 81, 81,183,220,193,
+217, 8,212,199,217, 13, 85,190,108,175,213,242, 93,183, 71, 40,231,239, 44,203,178, 42,149,138,213,233,116,172,209,104,100, 25,
+134, 97, 29, 40, 13,213,230, 0, 0, 32, 0, 73, 68, 65, 84, 1,224,119, 39, 56, 89,179,217,204,150,149,149,177,112,222,231,174,
+ 86,206,208,208,208,251,119,239,222,101,159,121,230,153, 28,155, 57,126,190, 94,175,103,107, 66,175,215,179, 67,135, 14,101,111,
+221,186,197, 70, 70, 70, 86,222,186,117,139, 13, 13, 13,189,217, 64, 57, 91, 53,111,222,252,116, 64, 64, 64, 2,128,182, 46, 28,
+171,247,126,238,217,179,167, 53,203,178,179, 89,150,141,169, 99,155,205,178,108,135,199,205,105,187,191, 69, 44,203,178, 21, 21,
+ 21,172, 74,165, 98,243,243,243,217,138,138, 10, 86,167,211,177, 87,175, 94,101,207,159, 63,207, 94,191,126,157,245,243,243, 43,
+114,134,147,227, 51,153, 76,108,121,121, 57, 91, 92, 92,204, 26, 12, 6, 86,175,215,179,169,169,169,236,149, 43, 87,216,244,244,
+244,218,248, 30,226,244,247,247,223, 82, 88, 88,168, 59,119,238, 92,197,230,205,155, 43, 66, 66, 66,210, 1, 68, 0,104,231,235,
+235, 91,248,143,127,252,131,149,203,229, 89,141,124,143, 58,242,249,252,171, 43, 87,174,188,116,228,200,145,162, 67,135, 14,153,
+182,109,219,150, 59,111,222,188,179, 60, 30,239, 42,128,142,141,124,143,130,124,124,124,206, 93,188,120,145, 46, 43, 43, 99,213,
+106, 53, 91, 94, 94,206,234,245,122,214, 96, 48,176, 38,147,137,181, 88, 44,236,217,179,103,217,224,224, 96,199,105,201, 69,245,
+ 12,172, 23,176, 44,251, 47,150,101,121,238,110,235, 28,184, 7,186,139,211, 29,109, 29, 73,146,102, 91,219,209,167,106,183,254,
+253,199, 85,206,225,195,135,127, 50,121,242,100,118,244,232,209,108,116,116,244, 67, 91,247,238,221,217,185,115,231,178, 71,142,
+ 28, 97,191,248,226,139, 79,220, 80, 78, 30,170, 22,189, 44, 31, 62,124,184, 37, 49, 49,145,157, 52,105, 18, 11, 96, 84,125, 90,
+228,175, 32,184,184,240, 14,132,227, 95, 0, 48,155,205, 57,153,153,153,161,237,105,154, 2,128,175,191,254,250, 33,203,148, 35,
+ 18, 19, 19,105,130, 32,238,212,247,235,102,179, 57,231,204,153, 51,193, 27, 54,108,224, 59,152,128, 65,211,180, 53, 63, 63,159,
+ 92,191,126,125,181,243,227,227,227,105,154,166,179, 93,188,200,237,221,186,117,219,238,142,187,117,246,198,131,127,158,248,249,
+167,128, 62,189, 7,170, 21,126,126,181,142,194,246,188,221, 1,196,155,245, 91,181, 8, 30,185,108,229,242, 88, 31,110, 10,242,
+191, 41,133,234, 74, 35, 51, 52, 67,105,248,221,221, 79, 88,167,211, 61,224, 86, 2,234,245,250,236, 39,176, 18, 94, 69, 85,140,
+ 43,186,198,119, 61,241,136, 78,167, 86,171, 21,222,222,222,118,107,104, 35, 44,162, 44,103, 97,229, 30,221,163,148,135,101,217,
+223, 82, 83, 83, 35,103,204,152,225,181, 99,199,142,187, 12,195,240,103,205,154,101, 14, 9, 9, 17, 36, 37, 37, 89, 0, 16,131,
+ 7, 15,230, 21, 22, 22,178,121,121,121,170, 23, 95,124, 81,251,198, 27,111,248, 95,187,118, 77,104,181, 90, 27, 10, 90,120, 47,
+ 39, 39,103,120, 35,142,213,139,137, 19, 39,222,197,163,167,177,105,114, 78, 14, 42,117, 57,238, 62,200,179, 69, 48,183,130,201,
+ 42,178,251, 85, 89, 44, 52, 84,229,165, 46, 91,180,238,220,207,179,165, 24, 99,192, 48,249, 54,190, 42,135,120,182,172,162,225,
+222,132,199, 27,176,100,201,146, 49, 36, 73,146, 23, 46, 92, 48,174, 90,181, 42,167,164,164,100, 60,128,108, 0, 40, 43, 43, 27,
+178,125,251,246,239,156, 8,229, 80, 23,210, 44, 22, 75,223, 69,139, 22,189, 3, 96, 0,128, 22, 54,238, 36,155, 37,171,177, 17,
+204,139,213,106,245,200, 49, 99,198,156,164, 40,170,165,195,123, 20, 0, 64,201,189, 23, 44,203, 6, 21, 21, 21, 61,239, 12, 33,
+ 65, 16,107,155,170, 33,105, 74,238, 71,108,135,158,138,149,140,167, 79,159,254,116,252,248,241,188,136,136,136,255, 23, 17, 17,
+ 65,150,149,149, 65,167,211,129, 36, 73,132,132,132, 32, 42, 42, 10, 33, 33, 33,214,244,244,244,229, 31,124,240, 65,131, 49,249,
+158,125,246,217,214, 22,139,229, 25,146, 36, 91, 3,104,205,178,108,107,130, 32, 90, 3,240, 3, 0,133, 66,161,136,140,140,228,
+245,233,211, 7,189,123,247, 70,124,124, 60,246,238,221,251, 45,128, 19,142,214,172,154, 90,228, 73, 64, 90, 55,176, 29,175,130,
+184,209, 29,131, 9, 43,226, 89, 18, 67,162,146,237,113,246,106,138,172,186,147, 74,215, 98,250, 27, 53,108,216, 48,251, 11,231,
+ 68,167,242,160,161,151,175,164,164,100,212,204,153, 51,171,113, 50, 12, 99, 44, 45, 45,125,171, 95,191,126, 27, 41,138, 18,213,
+168,176, 89,197,197,197,127,106,174,190,154,113,180, 70,141,121, 73,249,168,156,114, 1,249, 76,230,209,255,160,168, 88,137,255,
+166, 20,150,105, 77,204,144, 91,202,138,212,166, 40,127, 86, 86,214,232,167, 64,241,215, 38, 90, 31, 53,121,118,137, 19, 1, 73,
+ 27,202, 81, 71,216,194,137,184,229, 37, 47, 44, 44, 92,253,209, 71, 31,141, 92,190,124,121,224,177, 99,199, 20,220, 0,229,149,
+ 87, 94, 41, 78, 77, 77, 29, 8, 64, 84, 89, 89,121,106,249,242,229,129,177,177,177,254, 0,252, 1, 96,236,216,177, 69, 69, 69,
+ 69, 27,224, 65,189,176, 88, 44,185, 81,207,182,183, 15,252, 28, 67, 58, 56,126,166,105, 58,215, 21,190,218,120, 28,247, 25,134,
+169,151,143,162,168,247,122,247,238, 77,189,247,222,123, 69,199,142, 29,227, 18,233, 58, 42,180,204, 6,130,146, 58, 3, 35,128,
+ 85,182,205,157,208,171, 84,170,190, 46,254, 15,227,169,141,181, 14, 40, 93,217,127, 44, 56,120,240,224,199,147, 38, 77,218,238,
+231,231,183,171,117,235,214,237,131,131,131, 21, 18,137, 4, 70,163, 81,107, 50,153,110,102,102,102, 78,249,248,227,143,239, 57,
+101,225,216,190,157, 2, 32,176, 90,173, 98,146, 36,101, 0, 20, 4, 65,248,114, 66,139, 32, 8,152,205,102, 60,120,240, 0,139,
+ 23, 47,102, 78,159, 62,253, 5,128, 79, 92, 24,184,246, 4, 16,232,208,142, 7, 2, 48,161, 42,128,109, 9, 65, 16,151,155,250,
+126, 17, 86,196,119,188, 10, 34,173, 27,106,235, 39,234, 79, 42, 93,215, 11, 87, 82, 82,210,215,221, 47,113, 93,156, 37, 37, 37,
+ 17, 79,202, 27, 50,221,184,234,123,108, 89, 85, 45,207, 33, 39,194,106,219,111, 8, 26, 3, 61,239,171, 19, 55, 86, 27,105,214,
+106,166,173,127,191, 85, 82,145,230,105,135,220,142,231,220,245, 46,185,177, 76,169, 25, 25, 25,253,230,205,155,247,177, 84, 42,
+237, 5, 0, 21, 21, 21, 23,242,243,243, 63,131,109, 85, 97, 67,199, 61,168, 27, 74,165,178,199,147,200,103, 50,153,254,217,175,
+ 95,191, 47, 25,134, 89, 67,211,116,210,255,192,163,168,244,212,198,167, 23, 63,254,248,227, 61, 0,125, 1, 96,194,132, 9, 20,
+ 0,236,221,187,215,101,241, 60, 99,198, 12,134,101, 89,179,173, 62,232, 81,181,186,176,140,107, 83,245,122,125, 89,126,126,126,
+ 58,195, 48,233, 0,190,131,235, 43,110, 3, 9,130, 56,194,178,236, 56,155,112, 59,194,178,236, 56,199,239,154,218,170,213,192,
+ 41, 13, 59,195,123, 80,133,189,105, 32,106, 78, 5, 54,180,223, 16, 50,139,244, 9, 0,186,123,238,238,255, 36,238,230,231,231,
+ 79,127,132,227, 30, 60,125,200, 54,153, 76,227,255,135,174, 87,227,121,228,127,145,254,175, 17, 2,139, 67,122,122,122,147,185,
+ 8, 60,110,116,188, 90,125, 0, 94,115,223, 1, 49,181, 9, 47,143,208,242,192, 3, 15, 60,240,224, 81,160,246,220, 2, 15,254,
+202,224,124,179,184,253, 58,124,180,106,250,103,217,247, 9,212,189,114,192,149,172,228,141, 89, 37,113,202,195,233,225,244,112,
+122, 56, 61,156,143,157,211, 7, 64, 36,128,149, 13,156, 87,115,117, 97, 17, 0, 37, 0,139,231,126,122, 56, 31, 65, 63, 56, 5,
+150,101,199,214, 55,117, 72, 16,196,209,166, 18, 90,118,103,248,110, 88, 18,117, 21, 75,184,125,103,133, 86, 83, 99,132,135,211,
+195,233,225,244,112,122, 56, 61,156, 30, 78, 15,231, 35, 10,173,161, 31,124,240,193,135,168, 10,141,193,126,240,193, 7, 31,178,
+ 44, 59,182,234, 16, 59,182, 41,127,251, 70,119, 12, 78,235, 6,150,219,110,116,199,224, 58, 78,141,113,216,236,240, 76, 29,122,
+224,129, 7, 30,120,224,129, 7, 79, 58,206,173, 88,177,162, 98,197,138, 21,156,227,123, 9, 0,194,102,225, 42,105,202, 31,182,
+ 77, 19, 58,179, 80,170,254, 20, 60,143, 1, 97, 36, 79, 48,149, 47, 16, 13, 5,107,141, 2, 0,144,212, 13,198, 84,249, 43, 77,
+155,119, 1,200,111, 44,113, 7,224,217, 54, 62,146, 67, 70,134, 17,228,104, 77, 19, 50,170,210, 28,184,140, 9, 64,127,145, 80,
+248,139,200,199, 71, 82,219,113,163, 90,109, 48,154, 76, 35,247, 2,191,121,222, 1, 15, 60,240,192, 3, 15,158, 18,200,124,125,
+125, 79,147, 36, 25,193,125,225, 24,119,176,102, 12, 66,134, 97, 10, 84, 42,213, 72, 84, 77, 21,255,153,156,142,255,111, 66, 35,
+251,114,119,195,213,169, 67, 30, 80, 45, 10,107,131, 25,179,219,135,200, 6,182,111, 29,177, 59,191,176, 40,165,188,210, 52, 43,
+ 51, 95,167,114,181,144, 20, 95,244,134,151,183,207,178,191,205,252,167,127,219,118,237,137,230,205,155, 1, 44,144,157,147, 27,
+124,231,246,173,225, 63,238,248,234,221,114,141,106,177,197,104,252,143,171,220,207, 2,178, 22,114, 81,210,127, 62,120,221,135,
+ 7, 26,175, 45,221,125,156,208,153,155,167, 87, 45, 55,117, 73,100,249,248,251,159, 88,113,234,148,196,183, 75,151,106,199, 88,
+150,173,202,175,247,251,239,146,255, 55,114,228,137, 9, 42,213, 40,143,216,250, 75, 34, 68,161, 80,204,231,243,249, 67,204,102,
+115,132, 80, 40,204, 97, 24, 38,161,172,172,108, 29,128, 60,207,237,241,192,131, 6, 81, 95,126,205,199,150,123, 19, 0,228,114,
+249, 21,146, 36,195, 29, 69, 0,151,179,151,219,175,249,215,106,181,222, 83,169, 84,253,234,161,109,237,231,231,183, 17, 64,207,
+134, 2, 38,219, 98,179, 93, 86,169, 84,111,161,238,213,122, 94,190,190,190,159, 18, 4, 49,145, 36, 73,170,161,107,178, 90,173,
+ 12,203,178,123,202,202,202, 62, 1,160,173,235, 60, 95, 95,223, 83, 25, 25, 25, 61,131,130,130, 26,180,210,208, 52,141,236,236,
+236,192, 94,189,122,157, 85,169, 84, 29,154,146,211, 21, 45,242, 56, 81,207,170,195, 58, 43, 58,128,106,249,133,136,250, 31, 36,
+166,126,179,236,173,102, 5, 89,183,155,205, 89,254,125, 59,194,159, 25,114,179,212, 80,232,236, 15, 10,196,242, 67,125, 7,141,
+ 26, 58,247,157,247,100, 87, 83,111,226,151,248,243, 40,215, 27, 65,145, 36,124,188,164,104,215,238, 25, 98,109,220,190,128,111,
+ 55,175, 93,115, 33,241,228,216, 74,189,230, 69,151,100,186,148,183,120,225,203,189,100,254,126, 12, 96,101,240,175, 49, 93,101,
+255,239, 72,202, 98, 84,208, 31,186, 44,178, 78,159,150, 22, 23, 21, 33, 54, 44, 12, 60,154,134,152, 36, 33, 38, 8,136, 73, 18,
+ 50,177, 24,163,183,109,195,103,199,142, 73, 63,126,254,121,143,216,250,139, 65, 46,151,207, 12, 11, 11, 91,181,117,235, 86,255,
+ 86,173, 90, 65, 38,147, 65,165, 82, 5,100,102,102,118, 91,176, 96,193,244,130,130,130,143,202,203,203,183,120,238,148, 7, 30,
+212,137,110, 0, 82, 80,123,254,210,250,142,213, 9,177, 88, 92, 84, 89, 89, 25, 84,223, 57, 66,161,176,216,100, 50, 5, 55,196,
+ 69,146,100,120, 94, 94, 94,144, 84, 42, 5,195, 48,182,108, 0, 86,251, 64,218, 49,251,137, 45, 80, 45, 58,116,232, 96,174,143,
+211,203,203,235,235,226,226,226, 17, 92,158, 64, 7, 65, 85, 43,242,242,242, 70,116,236,216,241,107,173, 86, 59,178, 14,241,242,
+233, 59,239,188, 51,191, 83,167, 78,156, 21,200,150, 5,161,234,175, 82,169,196,188,121,243,236,191, 97,181, 90,113,242,228,201,
+119,102,206,156,137,178,178,178, 5,245, 92,123, 68, 80, 80, 16, 97, 75, 40, 94, 39,150, 44, 89,130, 37, 75,150,224,171,175,190,
+ 34,248,124,190, 79, 3,247,211, 45,156,206,106,145,199, 97,193,106, 32, 50,252, 81, 84,247,205, 58,250,144,208,114, 22, 36,107,
+253,121,233,186,173,179, 98,103, 12, 32,190, 89, 48,162,237,155, 95,157, 58, 79, 10,216, 65,233, 5,149, 57, 78, 88,178,254,222,
+179,223,136, 33,243,230, 47,148,125,255,211, 25,100,166,255,142,140,164, 31,170,157,211, 99,228, 76, 20, 42,181,152, 57,247, 95,
+114,130,226, 13, 73, 60,117,240,239, 22,163,225, 27, 39,173, 89,193, 17, 34,225, 63,250,244,138,226,231, 73, 50, 17,226, 43,193,
+128,238,109,248,205, 79, 92,255,135, 30,244,151,233, 85,171,100, 92, 18, 89, 91, 95,127, 29, 3, 45, 22, 4, 81, 20, 40,130, 0,
+ 5,128, 36, 8, 84, 26,141,184, 60,117, 42,122,237,220,137, 79, 14, 31,150,126,250,194, 11, 46,137, 45,153, 76,118,149, 32, 8,
+ 95,157, 78, 55, 22, 85,137,165,159, 6,116,148,203,229, 71, 89,150, 45,211,235,245,221,158,160,114,133,162,106,142,190,230,232,
+ 88,128,170, 21, 85, 46,101, 22, 22,137, 68,111, 76,152, 48, 97,237,134, 13, 27,164, 69, 69, 69,200,207,207, 7,195, 48, 16,139,
+197,104,219,182, 45,113,234,212, 41,255,133, 11, 23,174, 62,122,244,168, 72,171,213,126,233,202,192,134,207,231,199,249,249,249,
+ 61, 31, 28, 28, 44, 43, 46, 46,174, 80,171,213, 39,141, 70,227, 27,104,124,218, 20,146,207,231, 79,137,140,140,124, 41, 44, 44,
+ 44, 56, 47, 47, 79,153,155,155,123,200,104, 52,126,139, 70, 38,106,118,184,167, 93, 96,139, 86, 15,160, 32, 50, 50,242,198,131,
+ 7, 15,138,221,200,153, 31, 25, 25,153,214, 8, 78, 25,128, 31, 1,132, 53,112, 94, 62,128, 73,112,209,154,237,129,251, 68,150,
+ 45,165, 85, 77, 65, 85,223,177,122, 97, 52, 26, 3,205,102, 51,248,117, 36,139,215,235,245,240,242,242, 10,116,182,144, 18,137,
+ 4, 63,252,240, 3,248,124, 62,248,124, 62,202,202,202, 16, 30, 30,110,223, 23, 8, 4,246,207, 45, 90,180,104,144,143, 97,152,
+ 94, 20, 69, 65,167,211,129, 97, 24,251,166, 86,171,193,178, 44, 68, 34, 17, 24,166, 42,157,147,195,241, 94,117,241, 17, 4, 49,
+ 49, 44, 44, 12,223,127,255, 61, 76, 38,211, 67,199, 21, 10, 5, 82, 83,255, 72, 50, 66, 81, 20,122,247,238, 77, 18, 4, 49, 17,
+192,130,122,120, 89, 0,136,137,137, 1, 69, 81,160, 40, 10, 36, 73,218, 63,115, 27,195, 48, 88,178,100, 9,106,164, 38,251,211,
+ 56,159, 52, 52, 16, 25,190, 0,117,248,104,145,245,145,182, 15,150,189,181,224,181, 17, 21,139,255, 62,134,253,112,218,115,236,
+194,215, 6,179,207, 15,234,252, 19,197,227, 17, 23,211,178, 17,238, 13,124, 59,175,103, 68,243, 0, 89,106,148,159,188, 93, 45,
+ 20,142, 75, 60,195,164, 50,197,231,111,253,243, 95,242,163,103,175, 35, 59, 39,251, 33,145, 5, 0, 87,126,249, 22, 5,249,121,
+ 72,201,200,197,148,191,191, 45, 87, 40,124, 62,175,209,160,214,185,108,212,219, 75,240,197, 7,147, 6,136,117,150,124,104,125,
+ 1,170,181, 16,124,169, 30, 11,199,117, 17, 41,188, 4,245,165,170,176,115,138,132,194, 95, 86,156, 58,101, 23, 89,253,141, 70,
+136, 24, 6, 52,195,216, 69,150,137,166, 97, 48,153, 16,170,211,225,206,204,153, 96, 45, 22,124,116,224,128, 84, 36, 20,254,226,
+ 76, 57, 1, 64, 32, 16,132, 30, 58,116,168, 69,231,206,157,227,225,124, 48,211, 83, 77, 80,119,156,229,236,222,181,107,215,132,
+157, 59,119,182, 16, 8, 4,161,238,224, 20,139,197,175,202,100,178, 18,177, 88,252,106, 35,203, 73, 2, 88, 58,107,214,172,228,
+103,158,121,230,140, 77, 88,217, 69,205, 51,207, 60,115,106,214,172, 89, 87, 1, 44,169,163,174,215,198,217, 44, 44, 44,108,217,
+134, 13, 27,164,183,110,221, 66, 94, 94, 30, 44, 22, 11, 94,123,237, 53, 48, 12, 3,131,193, 0,147,201,132,149, 43, 87,202,252,
+253,253, 23,163, 42, 81,176, 51,215, 46,240,246,246,190,181, 99,199,142, 9,247,239,223,151,159, 57,115,134, 72, 77, 77,149,173,
+ 94,189,122,188,191,191,127, 38, 0, 81, 35,238, 39, 25, 26, 26,250,205,193,131, 7,223, 74, 77, 77, 13,223,191,127, 63,255,194,
+133, 11,161,155, 55,111,158, 29, 26, 26,186, 19, 0,213,200,103,212, 77, 42,149, 14,127,255,253,247,173,231,206,157,203, 59,119,
+238, 92,222,218,181,107, 49,112,224,192,254,177,177,177,209,141,228,236,238,229,229, 53,236,253,247,223,183, 38, 38, 38,230, 95,
+188,120, 49,119,245,234,213,228,176, 97,195, 6, 44, 91,182,172,139,139,156, 63,158, 59,119,110,112, 78, 78, 78,171,220,220,220,
+150,185,185,185,145,185,185,185,145,121,121,121, 17, 5, 5, 5, 45, 10, 11, 11,155, 23, 23, 23, 55, 79, 72, 72, 24, 0, 96,247,
+ 19,246, 30,253, 47,112,242, 56, 33,165, 82,169,112,244,232, 81,216,172, 87,221, 28, 69, 86,121,121, 57, 10, 10, 10,184, 99, 60,
+103,202,169, 80, 40, 78,111,221,186,149,173,172,172,132, 70,163, 65,113,113, 49,114,114,114,112,231,206, 29,148,150,150,226,230,
+205,155,144, 74,165,167,157, 41, 39, 65, 16, 96, 24,198, 46,164, 78,158, 60,137, 89,179,102, 65,165, 82,217,191,227,241,120,246,
+207,220,255, 52,196,201, 89,158, 24,134,193,197,139, 23, 49,103,206, 28,172, 93,187, 22,187,119,239,198,145, 35, 71,160, 82,169,
+236, 98,139,166,233, 6, 57,149, 74, 37,172, 86,231,198, 76, 44,203, 66,163,209, 56,253,220, 29, 5, 16,143,199,123, 72, 20,113,
+155, 43,117,233, 17, 57,159, 88, 56, 17, 25,190,238, 17, 54,247,193,102,170, 27, 82, 77,104, 69,134, 44, 94, 53,127,162, 4,140,
+ 25,172,197, 0,152, 43, 0,179, 14, 86, 83, 5, 8,129, 4,176, 24, 16, 40, 82,225,199,185,237, 21,139,190,191,155,206,220, 36,
+198,102, 40,181,199,107,237, 17,120,130, 41, 19,103,188,227,159, 91, 92,142,188, 34, 13, 40,242,143,126, 47,122,196, 12,240, 40,
+ 18,151, 78, 84, 25,174, 72,138,130, 70,111,132, 90,103,198,132, 25,243,253,254,179,246,223, 83,104,115,101,189, 49, 94, 58, 1,
+109,163,228,242,151, 59,118,108, 65,166,139, 50, 16,253,124, 18, 24, 43,192, 38,190,128,110,101, 65, 84,135, 95,132, 47,235,181,
+230,101,169,192,173,122,173, 25, 62, 62, 18,223, 46, 93, 16, 27, 22,134, 65, 22, 11, 4, 44,139,231,138,138,240,251,252,249, 48,
+238,219, 7, 18,128,224,213, 87, 49,116,221, 58,156, 13, 11, 67,136,193, 0,245,187,239, 34,240,248,113, 8, 20, 10, 9, 74,156,
+ 91,252, 64, 16, 4,134, 12, 25,130, 83,167, 78,249,143, 30, 61,250,196,245,235,215, 95,161,105,250,108, 99, 30,162,183,183,247,
+ 21, 30,143, 23,222,208,121, 52, 77,231,106, 52, 26,151,211,140,240,120,188, 65,189,123,247, 62,176,127,255,126, 95,179,217,236,
+150, 81,136, 80, 40, 28, 61,126,252,248,173,155, 54,109, 82,204,158, 61,123,235,145, 35, 71, 42, 76, 38,211,113, 87, 44, 57, 0,
+150,110,217,178,229,205,152,152, 24,159,217,179,103,179,119,238,220,113,180, 94, 5, 14, 28, 56,240,153,173, 91,183,134,244,236,
+217,243,157, 57,115,230, 8, 0,124,212,144,149, 71, 46,151,207,221,186,117,107,128, 82,169,132, 78,167,179, 55,178,185,185,185,
+144, 72, 36, 32, 73, 18, 36, 73,130,207,231,227,243,207, 63,247,159, 59,119,238,124,149, 74, 53,223, 9, 43, 89,220,198,141, 27,
+ 3, 71,142, 28, 73,222,191,127, 31, 36, 73, 66, 44, 22,227,245,215, 95, 39, 13, 6,131,111,108,108,236,118,189, 94, 63,217,149,
+123,200,231,243,167,196,197,197,181,235,223,191, 63, 47, 35, 35, 3,125,251,246,197,165, 75,151,240,234,171,175,242,181, 90,109,
+203,133, 11, 23,206, 50, 26,141,174,198,113, 9,149, 74,165,157,126,253,245,215,156,230,205,155,219, 27,150,150, 45, 91, 50, 99,
+199,142, 85,101,100,100,180, 63,119,238, 92,105,191,126,253, 92, 73, 88,222, 76, 42,149,118,248,249,231,159, 11, 98, 99, 99,135,
+111,217,178,101, 60, 0,244,234,213,235,208,103,159,125,118, 70,165, 82, 69,157, 61,123, 86, 53,104,208,160, 92, 39,249,194, 66,
+ 67, 67,153,121,243,230,201,235, 59,105,219,182,109,106, 84, 37, 92,110, 5,224, 30, 60,248,179, 64, 3,136, 38, 8, 34,229,232,
+209,163,232,221,187, 55,142, 30, 61,138,177, 99,199,166, 56,138,129,212,212, 84, 12, 26, 52, 8, 54,139,150, 83,190, 90, 26,141,
+230,131, 37, 75,150, 36, 78,153, 50, 69, 90,173, 49, 32, 73,248,248,248, 96,204,152, 49,149,122,189,254, 3,103, 11,202, 48, 12,
+120, 60, 30,114,115,115,177,109,219, 54, 44, 95,190, 28,109,219,182,133,197, 98,121, 72,108,217,218, 61,167, 26, 63,154,166,113,
+249,242,101,236,218,185, 19, 31, 45, 94, 12, 47, 47, 47, 0,128,217,108,134,170,172, 12, 98,177,216, 46,198, 26, 16, 78,123,110,
+223,190, 61, 63, 60, 60,188,218,148, 33,247,215,214,102,193,106,181,130,166,105, 84, 86, 86, 98,237,218,181, 52,203,178,123, 26,
+234,127, 56, 81, 52,127,254,124, 24,141,127, 24,212,187,216,124,146, 35, 35, 35,209,181,107, 87,251, 62, 73,146,172,179,156,255,
+233,215, 9, 6,135,179,219, 47, 89, 13, 0, 8, 15, 15, 71,251,246,237, 17, 26, 26, 90, 39,103,109, 90,228,113,195,133,200,240,
+117, 11,173,186, 50,101,167,223, 47, 92, 57,123,225,234,213, 50, 49,197,255,231, 75,157,209,194, 71, 0, 72,252, 32, 24,180, 8,
+132, 79,213, 64,158, 85,221, 3,126, 89,132, 53, 47,171,200,152,239, 42,127, 50, 51,190,129,119,203,202, 30,114,194,227, 11,196,
+ 67, 91,183,105, 71,100, 23,168,192,227,241, 32,243, 14, 64,191,151, 22,128,162, 72,200,125, 2, 64, 48,134, 63, 20, 49, 73,129,
+ 71,241,160,210, 26, 16,217,170, 13, 41, 18, 75,134,234, 27, 16, 90, 10,111,254,198,247, 39,247, 19,151,210,185,144,180, 16,131,
+225,186,211, 48, 33, 72,127, 45,222, 27,221, 86, 18,115,232,250, 70,104, 44,195,156,185, 49, 20, 77, 35,136,162, 96,102, 89,252,
+ 62,127, 62,162,227,226,144,194, 9,195,184, 56,164,196,196,192,143,207,135,136, 36,193, 90, 44, 15,205,233, 59, 35,180, 0, 32,
+ 39, 39, 7,251,246,237,243,155, 56,113,226,129,212,212,212, 41, 46,138, 13,142, 43,224,226,197,139, 65,173, 90,181,170,243,156,
+123,247,238,161, 71,143, 30, 46, 79, 79, 9,133,194,209,195,134, 13,251,126,223,190,125,222,105,105,105, 8, 10, 10,122,100,161,
+ 37, 18,137, 6,141, 24, 49,226,251, 29, 59,118, 40, 74, 74, 74, 16, 23, 23,167,120,225,133, 23,118, 39, 39, 39,191,100, 52, 26,
+157, 17,155,213, 68, 86, 92, 92,156,122,219,182,109,255, 65,245, 41,194,130,109,219,182,125,211,179,103,207,183, 98, 98, 98,124,
+ 0,188,105,243, 29,168, 87,108,137, 68,162, 33,173, 91,183,174, 54,170, 21,137,170,140, 77, 50,153, 12,222,222,222, 16, 8, 4,
+ 48, 26,141,136,142,142, 38,132, 66,225, 0,103,174,217,203,203,107,196,203, 47,191, 76, 38, 37, 37,161,176,176, 16, 62, 62, 62,
+144,203,229, 96, 24, 6,179,103,207,166,214,174, 93, 59, 68,175,119,109,134,171,121,243,230,227,135, 15, 31,206,187,113,227, 6,
+238,223,191, 15,163,209,136,204,204, 76, 40, 20, 10, 76,155, 54, 77,176,106,213,170, 23,242,242,242, 92, 21, 90,157, 98, 98, 98,
+138, 28, 69, 22, 7,153, 76, 70,180,107,215, 78,229,239,239,223, 29,128, 43, 66,171,211,219,111,191, 93,188, 98,197,138, 65,167,
+ 78,157,178, 7,189, 60,117,234,212, 66, 0,248,242,203, 47, 19, 3, 3, 3,187, 3,112, 86,104,129,101, 89,235,223,254,246,183,
+ 44,161, 80, 8, 62,159, 15,161, 80, 88,109, 19, 8, 4, 32, 73,210,139,123,157,255,194,162,166, 39,128,255, 67, 85,114,221,197,
+ 0, 46, 62, 33,229,186, 10, 32,122,236,216,177,118,177,117,236,216, 49,140, 30, 61, 26,106,181, 26, 55,110,220,112, 20, 89,174,
+ 36, 88,190,106,177, 88,174,253,240,195, 15,253, 38, 78,156, 72, 56,188, 95, 72, 75, 75,195,205,155, 55, 83,156,229, 35, 73, 18,
+ 86,171, 21,124, 62, 31,171, 87,175,134,217,108,198,119,223,125,135,189,123,247,130, 36, 73, 16, 4, 1,130, 32,160, 80, 40,240,
+213, 87, 95,185,212,238, 49, 12,131,237,219,183, 99,209,194,133,118,145,101,155,201, 64, 72,112, 48,252, 3, 2,112,247,238,221,
+ 6,133, 86, 89, 89,217, 39,135, 15, 31, 70,125,206,240,135, 15, 31,182,127,174,225, 12,223,112, 63, 71, 81, 48, 26,141,120,238,
+185, 63, 82,197,190,253,246,219,246,207, 42,149, 10, 20, 69,113,247,130,112,150,211,192, 2, 47,137,255,248,110,204,123,239, 85,
+179,208,213,197, 89,151, 22,121, 18,173, 91,181,136,173,104,155,117, 54, 20,192, 88, 84,249,104, 21, 0, 13,248,104,221, 42,214,
+111,224, 17, 5, 93, 87,204, 27, 57,163, 69,144, 55, 88, 93, 17, 4,195, 62,193,181, 18, 9, 86,175,253, 25, 0,240,175,215,123,
+160,203,136,165, 48,125, 59, 18,243,251, 82,194,169,185,198,247, 1,124,252,112,195,104,237, 16,222, 44, 12,215,238,164,130, 71,
+ 81, 16,122, 7,192,219, 47, 24, 86,218, 4, 77,241,125,196,239,255, 26, 0,176,101,251, 30,144, 36, 9, 30,143,130,209,196,160,
+109,139, 48, 88,173,214, 14,245,149,243, 89,160,223,144,224,128,222,205, 35,124,136, 27,190,247,209, 46,200,191,198, 68,136, 8,
+109,243,229, 68, 95,185,164, 87,153,166,188, 95, 58,112,174, 65, 49, 64,146, 32, 9, 2, 82,129, 0,198,125,251,170,188, 54,227,
+170,250,172,148,152, 24,144, 63,253, 4, 47,145, 8, 20, 65,128,103, 51, 65, 55, 6,229,229,229, 32, 8, 2,187,118,237,242,157,
+ 54,109,218,238, 27, 55,110,196, 84, 86, 86,238,115,133, 67,173, 86,143,237,223,191,255,153,237,219,183, 7,134,132,132, 60,116,
+188,176,176, 16, 51,102,204, 40, 81,171,213, 46, 5,117, 19,139,197,175,142, 31, 63,126,235,183,223,126,171,184,125,251, 54,116,
+ 58, 29, 2, 3, 3, 31,181,142,118,239,211,167,207,129,125,251,246,121, 23, 22, 22, 66,163,209,192,104, 52, 98,215,174, 93, 62,
+ 99,198,140,217,151,145,145, 49, 26, 64,114, 3, 28, 31, 59,138,172, 57,115,230, 92, 7, 16, 4, 96, 99, 77, 13,106, 59,214,217,
+ 65,108,105, 0,172,170,103, 36, 26, 33,147,201, 80, 92, 92,140, 25, 51,102,224,214,173, 63, 12,160, 97, 97, 97,246,145,222,221,
+187,119, 17, 24, 24, 8,130, 32,130,156,185,232,192,192, 64,185,201,100,194,172, 89,179,144,147,147, 83,141, 51, 55, 55, 23, 4,
+ 65, 72, 93,189,145,193,193,193,193, 6,131, 1, 3, 7, 14, 68,101,101, 85, 94,223, 73,147, 38,129,207,231,163,184,184, 24,124,
+ 62, 63,160, 17,207, 39, 96,236,216,177,117,134, 86, 81, 40, 20,102, 95, 95,223,103, 93,228,244,127,225,133, 23,242,226,226,226,
+ 30, 90,216,114,233,210,165, 23,253,252,252, 78,249,249,249,181,115,145,211,234, 40,170, 4, 2, 65, 53,161,197,231,243, 65,146,
+164, 21,127,125,124, 1,128, 91, 5,183, 9, 64,215, 39,168,108,118,177,117,236,216, 49, 68, 69, 69,161,172,172, 12, 25, 25, 25,
+141, 21, 89, 92,123,183,232,211, 79, 63,253,229,149, 87, 94,145,113,131, 86,137, 68,130,119,223,125,215,160,211,233, 22,185, 84,
+137,172, 86,240,120, 60,251, 32, 89, 44, 22, 35, 58, 58,218, 46,178, 8,130, 64, 69, 69, 5,120, 60, 30,183, 34,145,112,178,140,
+ 8, 13, 9,129,151,151, 23,218,180,109,139,219,182,118,132,251, 44, 18,137, 64, 16, 4,104,186, 65, 67,158,214,230,212,190,192,
+205,207,134,229, 68, 81,189,166,227,176, 48, 88,173, 86, 78,100,178,238,224, 12, 8, 8,128, 78,167,115,150,243,137, 68, 29, 22,
+ 45, 78,104,141, 69,149,175,214, 67,225, 29, 6, 3,136, 71,245, 37,149,228,179,193,242,109, 43,230, 14,159, 49, 50, 42, 0,134,
+146,251, 16,123, 5,128,240,137,196,234,181, 63,227,198,189, 82, 0,192,234,221, 87,240,125,236, 24, 64,226,135,246,222, 74,132,
+120,241, 94,190, 89,252,176,208, 34,192, 18, 86,150, 5,143, 34,109,115,183, 20, 40,138,132,170,164, 0,235, 62,121,211, 38,178,
+246,226,104, 98, 6,194, 91, 71,253, 49,143, 75, 16, 0, 91,127,229, 14,244, 22,196,205,125,165,143,164,136, 40,128, 79,152, 20,
+ 98,113, 13,253,232, 43, 0, 17, 73, 98,222,144,112,233,229,195,149,113,233, 26,115,131, 29,133,152, 36,171,156,223, 9,162, 86,
+231, 30,210,118,140, 34, 8,176, 44, 11,214,234, 90,155,206, 9,121,137, 68, 2,179,217, 12,138,162,176,126,253,122,159, 17, 35,
+ 70,108,116, 85,104, 1, 72, 43, 42, 42, 26, 51,123,246,236, 99,123,246,236, 9, 8, 8, 8,168, 54,122,152, 61,123,182,178,168,
+168,104, 12, 92,116,186,231,243,249, 27, 55,109,218,164,120,240,224, 1, 42, 42, 42, 32,145, 72,236,141, 79, 99,235,103,175, 94,
+189, 78, 28, 63,126,220, 87,163,209,192,108, 54, 67, 34,145,128,101, 89, 80, 20,133,255,254,247,191,254,227,198,141,251, 57, 59,
+ 59,123, 88,125,101,149, 72, 36, 47,217,132, 19, 98, 98, 98,124, 98, 98, 98, 6, 3,117, 70,234,181, 35, 38, 38,198,103,193,130,
+ 5, 47, 24, 12,134, 85,245, 92,115,142, 74,165, 10,145, 72, 36,216,191,127, 63,228,114, 57,164, 82, 41,194,194,194,160, 82,169,
+ 32,149, 74,193,178, 44, 44, 22, 11,215, 88,148, 58,115,225, 37, 37, 37, 58,154,166,189,143, 29, 59,134,210,210, 63,254,165, 69,
+139, 22, 80,171,213,176, 90,173, 21,174,222,204,252,252,252, 34,130, 32,154, 95,187,118, 13, 15, 30, 60,192,232,209,163,241,211,
+ 79, 63,161, 71,143,170,217, 97,147,201,212,152, 32,126, 12, 69, 81,108, 61,245,150, 0,224,235, 78, 78, 91,231,229, 18,167,213,
+106,181,114, 34,203,241,175,163,248,106,224, 55,255, 42,240,118, 28, 39, 60,169,133, 28, 61,122, 52, 84, 42, 21,228,114,185, 59,
+252,115,206, 27, 12,134,204,131, 7, 15,118, 31, 59,118, 44,132, 66, 33, 50, 51, 51,145,156,156,156, 1,224,188,171, 66,139,207,
+231,227,211, 79, 63,197,155,111,190,137,224,224, 96, 44, 90,180, 8, 60, 30,207,190, 17, 4, 97,183,112,185,130,160,224,250, 23,
+ 62,114, 14,241, 13, 25,195,189,189,189, 63, 37, 73,114, 34,229,196,141, 99, 24,134,177, 90,173,123, 52, 26, 77,189,225, 29, 56,
+199,117,103,158,133,227, 61,104,160, 79,123,100,206, 58,180,200, 99, 71,205,213,134,117, 88,180,184, 85,135, 15,165, 2,226,174,
+ 50,222,102,178,139,119, 20, 89,159,191, 57,116,198,200, 40, 95, 28, 58,125, 17, 2,179, 26, 48,105,235,121,194, 22, 16, 2, 25,
+130,189,249,181,250, 10, 17, 36,117, 51, 55, 47, 31,254,190,114,155,200,178,109, 36,137, 46, 81, 85,131,217,163,137, 25, 8,111,
+ 21, 5, 30, 69,129, 71, 81,144, 75, 68, 40, 42, 44, 0,143, 71,222,172,235,103, 59, 81,120,229,149,118,205, 35,125,253,249, 80,
+ 6,154, 16, 26, 92,135, 97,160,187, 23,194, 67,133, 24,229, 47,142,232, 68,225,149,122,101, 57,203,218,133,150,153,166, 33,120,
+245, 85,251,116, 97, 74, 76, 12,162,227,226,192,140, 31, 15,189,217, 92,205, 84,220, 88,161, 37,145, 72,160,213,106, 49,101,202,
+ 20,149,197, 98,121,171,145,117, 33,185,180,180,116,194,212,169, 83, 75, 57, 1, 99, 54,155, 49,117,234,212,210,210,210,210, 9,
+ 78, 88,137, 30,130,197, 98,121,171, 71,143, 30, 42,165, 82,105, 47,103, 99, 26, 28, 14,126,126,126, 71,183,109,219,230,103, 52,
+ 26, 65,211,180,157, 83, 34,145,128,162, 40, 4, 6, 6,226,251,239,191, 15,244,243,243,171, 55,103,149,193, 96, 56, 24, 23, 23,
+167, 6,128,184,184, 56, 53, 65, 16, 9, 4, 65,108, 38, 8, 98, 83,141,109, 51, 65, 16, 9,142,231, 26, 12,134, 3,245,113,155,
+ 76,166,132,140,140, 12, 86, 42,149,130,162, 40,152,205,102,136,197, 98,187, 73,188,188,188, 28, 6, 67,213, 52,119,114,114, 50,
+ 44, 22, 75,146, 51,215,174,213,106, 79,111,223,190,221,218,162, 69, 11, 68, 69, 69, 33, 58, 58, 26,125,250,244, 65, 68, 68, 4,
+ 62,251,236, 51, 70,175,215,199, 55, 66,104, 29,253,241,199, 31, 45,205,155, 55, 71,247,238,221, 33, 18,137,208,165, 75, 23,132,
+133,133, 97,249,242,229, 38,141, 70,115,172, 17,143, 41, 59, 53, 53,149,170, 71,228, 42,224,196,234,221, 26,200,185,124,249, 50,
+213,167, 79,159, 67, 53, 15,244,234,213,235,144, 92, 46,247,230, 76,236,174,140,200, 29,197,149, 72, 36,178,111,220,247, 60, 30,
+239,127,193,162, 53, 31,192,117, 84,197, 97, 90,244,132,149,205,238,248, 94, 90, 90,138,140,140, 12, 36, 39, 39,163, 79,159, 62,
+ 72, 74, 74, 2,254,112,144,119, 25, 26,141,102, 81,108,108,172,158, 91,201,183,120,241, 98,131, 86,171, 93,228,106, 27,204,178,
+ 44,248,124, 62,218,183,111,143, 5, 11, 22,224,231,159,127, 70,102,102, 38, 44, 22,139, 93, 8,113, 62,153,174, 88,180, 4, 2,
+ 1,130,131,131, 97,177, 88,236,214, 44, 0,184,125,235, 22,120, 60, 30,172, 86, 43, 76, 38, 83,131, 22, 45,111,111,239, 79,183,
+110,221,250,142, 82,169, 12, 45, 41, 41, 9,114,220,138,138,138,130, 10, 10, 10,130,242,242,242,130,114,114,114,130,178,178,178,
+130,238,223,191, 31,186,114,229,202,119,188,189,189, 63,117,166,156, 20, 69,161, 75,151, 46,120,251,237,183,237,219,134, 13, 27,
+236, 91,124,124,188,203,206,235, 20, 69,161,253,146,213, 24, 83,194,218,183,159, 3, 9,251,118,227, 95,115,234,227,172,169, 69,
+158, 8,112,171, 13, 29, 19, 75,215, 2,110,213, 33,215,150,217,221, 54,106, 58,195, 3, 0, 58,132, 72,151,126,254,198,160, 25,
+207, 61,235,141,131,167,175, 32,246,192,189,155,109,103, 4,182,127,198,183, 4,214,146, 12,252,235,245, 30, 88,189,251, 10,128,
+170,169, 67,107,241, 13,176,101,119,193,122, 53,199,125,149,178,214,105, 7,218, 84,121,230,222,157, 91, 67,219,119,234, 73, 22,
+ 42,117,213,150,127, 70, 15,153, 0,130, 32,208,172, 85, 20, 40, 30, 15, 20, 69,130, 71, 81,240, 81,136,145,113,237,154,213,104,
+ 48,156,169,141,115, 48,192, 19, 74,132, 27, 94, 31,213, 69,156, 47, 44, 70, 96,168, 12, 2,126,149,118,100,239, 77,168,209, 67,
+240,128, 78, 94,152,153,231, 47, 57, 83, 84,185,193, 87,111, 62,148, 80,199, 8,208,106,181, 66, 46, 18,161,210,104,132,129,166,
+ 49,100,221, 58,251,116, 33, 73, 16,184, 10,160,243,186,117, 56,183,111, 31, 20, 66, 33, 32, 18, 57,189, 42,164, 54,161,165, 84,
+ 42, 49,125,250,244,210,130,130,130,105,141,241,209,226, 96, 52, 26,207, 22, 22, 22, 78,155, 48, 97,194,174,253,251,247,251, 77,
+152, 48, 65, 85, 88, 88, 56,205, 73,191,167,135, 80, 89, 89,185, 47, 39, 39,167, 98,250,244,233, 59,119,239,222,237, 31, 16, 16,
+ 96, 31,137, 52,170,178, 18,132,114,248,240,225, 34,103,206,107,224,148, 88,155,115,251,155, 54,203, 86,231, 57,115,230,156, 67,
+149,255,149, 35,150,108,217,178,101,146,195, 20,227,102, 0,235,234, 35, 46, 47, 47,223,180, 96,193,130,191,159, 61,123, 54, 64,
+ 44, 22,131, 32, 8, 8, 4, 2,180,105,211,198,190,138,134,207,231,131,101, 89,188,247,222,123,202,226,226,226, 47,157,124, 54,
+115, 98, 99, 99, 7, 85, 86, 86,250, 78,159, 62,157, 18,139,197, 40, 42, 42,194,218,181,107,153,111,191,253, 86,173,215,235,103,
+ 52, 66, 8,111,255,247,191,255, 61, 68,167,211,181,154, 61,123,182, 64,163,209,192, 96, 48,224,253,247,223, 55,125,243,205, 55,
+185, 6,131,193,229,128,191,125,251,246,189,147,149,149, 53,160,162,162,162, 76, 42,149,214,180,246, 17, 50,153,172, 39,128,157,
+174,112, 70, 71, 71,223,205,206,206,238,179,116,233,210, 4,139,197,194,191,116,233,146,221, 25,126,253,250,245,241, 98,177,120,
+ 56, 92, 76,190, 74, 16,132, 85, 36, 18, 85,179, 96,213,252,204,227,241,254, 23, 44, 90,241,168, 10,153,241,164,161,154,200,186,
+113,227, 6,134, 14, 29, 10, 0, 72, 74, 74, 66,255,254,253,145,148,148,132, 1, 3, 6,184, 28, 75,203,134, 95,203,203,203,179,
+226,227,227, 59, 54,111,222, 28,231,207,159,191, 15,224, 87, 87, 11,201, 9, 45, 30,143,135,215, 94,123, 13, 35, 70,140, 64,139,
+ 22, 45,170,173, 54,228, 62,187, 34, 54,104,154, 70,167, 78,157, 96, 52,153, 32, 16, 8,236, 83,147, 60, 30, 15,129, 65, 65,184,
+115,231,142, 83, 22, 45,146, 36, 39,190,244,210, 75,100, 90, 90, 26, 38, 79,158,140, 93,187,118,213,121,238,212,169, 83,241,195,
+ 15, 63,224,165,151, 94, 34, 63,252,240,195,122,195, 59,112, 78,232,206, 92, 19,215, 79, 55,212,238,187,139,211, 81,139, 60,105,
+112, 8,237, 80, 27, 98,106,249, 46,174,154,208,114, 8, 18,134, 86,129,210,153, 35,218,240,112,240,204, 21,196, 30,204,222,206,
+176,236,254,253, 41,101, 71, 22,245, 7,204,123, 94, 71,151, 9, 59,171,166, 11, 1, 88,139,111,192,188,103, 42, 8,105, 0, 18,
+243,248,208, 24,204, 71,107,175,120,230, 93, 63,125,247,245,130, 62, 27, 7, 4,134, 6,121, 67,165, 49,216,197, 86, 74,252, 94,
+ 0,192, 43,115,150,129, 71, 85, 77, 41, 42,228, 98, 72, 4, 4, 98, 0,180, 0, 0, 9,149, 73, 68, 65, 84, 20,246,237,248, 82,
+105, 54, 87,214, 90,187,180,124,242,205, 15,251,181,241, 22,202, 44, 40, 15, 97, 17, 21,248, 71,166, 28,162,213,222,135, 5, 87,
+ 55, 95, 4,220, 40,195,235,207,200, 21, 95,166,169,223,132,197,186,225,161, 14, 81,173, 54,168,175, 93,147,140,222,186, 21,151,
+166, 77, 67, 51,134, 65, 66, 88, 24,252,248,124,120,139, 68, 32, 9, 2,134, 35, 71,112,110,255,126, 4,139, 68,128,151, 23,232,
+207, 62,131, 49, 35, 3, 22,173,214,208,136,145, 25, 38, 77,154,164, 84, 42,149, 19, 76, 38,211,217, 71,173, 8, 6,131,225,120,
+ 78, 78,206,155,125,251,246,221,104,177, 88,222, 50, 24, 12,199, 31,133,207,100, 50, 29, 47, 44, 44,124,117,210,164, 73,123, 15,
+ 28, 56, 16,224,227,227,211,104,174,210,210,210, 30,110,170,239, 86, 0, 31,217,156,219,223,140,137,137,241,185,124,249,242,223,
+183,109,219,182,209, 97, 52, 17, 52,107,214,172, 55,106,136,172, 6, 87, 29, 2,200, 46, 46, 46,254,236,221,119,223, 93,182,102,
+205, 26, 57,231,248,254,251,239,191,131,166,105,240,249,124, 48, 12,131, 89,179,102,233, 74, 75, 75, 87,163,238,136,206, 15, 85,
+173,242,242,242, 54, 75,151, 46,221,182,110,221,186, 17, 20, 69,201, 24,134,209, 87, 84, 84, 36, 84, 86, 86,206, 64,227,226,104,
+ 89, 75, 74, 74,166,127,252,241,199,211,215,174, 93,251, 18, 73,146, 65, 52, 77, 43,181, 90,237, 97,131,193,240, 13, 26, 49,149,
+116,254,252,249,146,215, 95,127,253, 94, 73, 73, 73,135,240,240,112,141, 92, 46, 55,153, 76, 38, 74, 34,145, 40,100, 50, 89, 52,
+128,243, 4, 65,164,187,194,153,146,146, 82, 56,123,246,236, 7, 70,163,177,253,230,205,155, 19, 21, 10,197,105,130, 32, 8,129,
+ 64,224, 43,145, 72,134, 2, 72, 32, 8,226,182, 43,156, 36, 73, 90, 29,173, 87, 53,253,179,132, 66,225,255,138,143,214,147, 8,
+123,120, 7,165, 82,137,180,180, 52, 78,100, 69, 3,192,128, 1, 3, 82, 56,177,149,156,156,140,238,221,187,167, 0,224,187, 90,
+ 95,203,203,203,223,157, 50,101,202,113,219,224,248,221, 70, 12,252,236, 66,139, 19, 84, 45, 90,180,176,239, 59,110, 14, 62, 90,
+ 78,129, 97, 24, 8, 4, 2,240,120, 60,132,134,133,217,127,139,101, 89,220,185,115, 7, 42,149,202, 41,161, 69, 81, 20, 69, 16,
+ 4, 38, 79,118,110, 65,242,223,254,246, 55, 36, 36, 36,128,114, 82, 21, 82, 20,133,200,200,200, 6,207,225,116,169,179,156,225,
+225,225,141,230,116,212, 34, 79,146,192,170,237,115,109,162,170,174, 23,226, 33,220, 45, 54, 44,157,250,127,191,125,152, 94, 88,
+185, 63,163,168, 98, 1, 0,118,207, 13,233, 47, 93, 2,169,145, 35,219,229,194, 24, 55, 0,132,162, 42,120, 27,171, 43, 0, 33,
+ 11, 70,174,181, 25,150, 28,186, 89, 72,131,168,203,255, 37, 95,167,211,124,180, 99,235,250, 53,179,230,190, 39,191,113,183, 8,
+ 26,157, 17, 20, 69, 58, 54,158,224,241, 40, 40,100, 98, 52, 15,241,198,238,255,252,159, 86, 91,174,254, 24,117,228, 61,108,225,
+ 37,152, 51,188,231, 51, 34, 65,168, 30,237, 59, 79, 2, 37,254, 67, 4,176,133,117,204, 14,246,255, 5,207,103,235,197, 63,101,
+235,231, 92, 45, 51, 61, 44,180, 76,166,145,139, 71,141, 58, 17,251,243,207,210, 94,219,183,227,238,172, 89, 8, 51, 24, 32,178,
+ 77, 37,146, 4, 1,185, 64, 0,185, 64, 80, 37,178,214,174,133,129,166,177,110,218,180, 10,163,201, 52,202,149,151,188,180,180,
+ 20,227,199,143, 47,201,207,207, 31,131, 70, 76,237,213, 5,189, 94,191, 15,192, 62,119,241, 25,141,198,179,185,185,185,207,143,
+ 31, 63,254,231,227,199,143, 7, 62, 33, 65,230, 56,177,101,190,124,249,242, 27,137,137,137,119, 81, 61,177,168, 58, 49, 49,241,
+238,236,217,179,137,109,219,182,125, 3,224,223,112, 50,128,167, 94,175, 95,127,242,228, 73, 12, 26, 52,232,223, 43, 86,172,240,
+239,209,163, 7,130,130,130,160,213,106,145,156,156,140,249,243,231,171,202,203,203, 87,168,213,234, 53, 46,150,217,108, 52, 26,
+167, 58, 46,165,118,199,125, 48, 26,141,223, 22, 20, 20,124,235, 46,194,121,243,230,253,126,231,206,157,210,192,192,192,222, 2,
+129,160, 51,170,252,128, 10, 1,124,227,170, 32,226, 48,119,238,220,107,119,238,220, 81, 54,107,214,172,143,141,211, 7, 85,105,
+140,182, 54,130, 51,255,202,149, 43,225, 61,123,246, 36,249,124, 62, 75, 81, 20,248,124, 62,203,227,241, 88,155, 95, 13, 11, 0,
+135, 15, 31, 22, 1, 80,193,131, 63, 27,246,240, 14, 5, 5, 5,142, 34,139,179, 90, 69, 15, 24, 48, 32,197, 38,178,184, 99,141,
+241, 47, 59,101,181, 90, 31, 41, 95, 47,203,178,136,141,141,197,150, 45, 91,208, 80, 68,115,219,234, 62,162, 33, 62,206,162,197,
+ 48, 12,204,102, 51,110,220,184, 97,143,217,197, 77, 23,114,161, 29,104,154,174,119,181, 58,195, 48,140,201,100,194,127,255,251,
+ 95,167,196,214,247,223,127,143,202,202, 74, 48, 13, 40, 56,199, 80, 12, 93,187,118,133, 74,165,178, 47,246,137,142,254, 35, 84,
+158,217,108,118, 73,184,114,156,237,219,183,135, 82,169, 4,231, 47,220,124,218, 31,198, 30, 90,255,151,141, 31, 92,167, 69,203,
+233, 30,179,139,183,183,183, 81,104, 57,240, 98,148,104,200,196,104,111,180, 10,241, 2, 95, 32, 70,126, 57,141, 83,233,229,216,
+ 26, 95,152, 99,176, 48,227,110,149, 84,164,214,199, 35,146, 42,142,247,232, 55,162,255,180, 55,230,203,116, 70, 6, 15, 30,100,
+161,164,184, 0, 36, 65, 34,180, 89, 56, 34, 34, 34, 33, 17,146,216, 21,183, 70,159,114,238,244,111, 58,109,217,232,186,184,198,
+122, 11,206,173,125,181,127,159,214,173,189, 8,208, 22,128,177, 0,180, 5,176,218,254,114,223, 89,171,215,185,180, 52, 53,251,
+225, 85,213,133,163, 26,115,173, 57,171, 38, 0,253,125,252,252, 78, 44, 57,124, 88,106, 53,155, 81,250,238,187,144,210, 52,196,
+182, 81, 73,213,133,136, 64,127,246, 89,149,200,154, 58,181, 66,163, 86,187,148,130, 39, 32, 32,224, 10, 65, 16, 1, 37, 37, 37,
+ 79, 85,100,248,192,192,192,163, 44,203, 42,149, 74,101,143, 39,168, 92, 65, 0,212, 0,204,181, 12, 36, 2,225,186,255, 15,135,
+200,192,192,192, 15, 73,146,236,203,178,172, 63, 73,146,101, 86,171,245,124,113,113,241, 74, 0,119, 60,253,233, 99, 3, 23, 25,
+190,101, 3,231, 21, 3,248, 39,170,156,130, 31,120,110,219,159, 14,183,167,224,113, 39,252,252,252, 46,158, 56,113,162, 71,171,
+ 86,173, 72, 71,135,119, 46, 86, 30, 55,189,197,227, 85,105,185,179,103,207,210,147, 39, 79, 62, 95, 84, 84, 52,168, 46, 78, 47,
+ 47,175, 95,174, 95,191,254,156, 70,163,121, 72, 80, 57, 70,138,231,246,245,122, 61,230,206,157,123,178,174, 20, 60,222,222,222,
+107,215,172, 89,243,206, 43,175,188, 66,114,225, 40, 28, 55, 46, 93, 16,183,153,205,102,236,220,185,211,250,229,151, 95,126,165,
+209,104,234,156, 58, 12, 13, 13,205,201,207,207, 15,231, 66, 45, 56, 19, 84, 52, 50, 50,178, 32, 43, 43, 43,236,207,228,124,138,
+ 5, 87, 53,235,150,171,166, 9,162,125,144,108, 18, 11, 76, 36, 97,237, 68, 18,132,144,102,145, 9, 22,191, 72,121, 21, 27, 83,
+ 10,224,212,212, 25, 95, 34,153,231, 37,247,253,228,149, 41,111,251, 71,182,110, 75, 4,135, 54, 3, 1, 18, 69,133,121,200,186,
+119,139, 61,240,221,215,165,250,114,213,167, 6,131,254,235,250,120,158, 5, 90,183, 84, 8,246, 8, 25,180, 3, 39,128,106,228,
+167,122,104,196, 1,192,204, 39,111, 62,208, 90, 38,165,215, 51,237,195,137,173,143, 14, 28,144, 10,219,181,123, 40, 80,156,213,
+106,133, 49, 35, 3,235,166, 77,115, 89,100,121,224,129, 7,110, 65, 43, 52, 28, 35,203,130,170,248, 92,180,231,118, 61, 22, 60,
+177, 73,165, 1,200,252,252,252, 78, 83, 20, 21,193, 89,100, 28,173,245,181, 36,148,126, 80, 84, 84, 52, 28, 64,125, 43,132, 91,
+123,121,121,125,205, 48, 76, 47,103,146, 74, 83, 20,117, 73,171,213,206, 67, 61, 73,165,155, 98,213,161,191,191,255,157,172,172,
+172,214,220, 42,106,199,190,178,182,149,229,183,111,223,198,224,193,131,179, 10, 11, 11, 35,255, 76,206, 39, 21,117,172, 58,124,
+116,139, 86, 19, 32, 76, 32,146, 79, 23, 74,196,195,172, 22,186, 61, 8,128,199,231,223, 52, 85, 26,206, 24, 13,186, 29,168, 99,
+186,240,207,196, 4,160,191, 72, 40,252, 69,160, 80, 72,106, 19,109, 22,173,214, 96, 52,153, 70,122, 68,150, 7, 30,120,224,129,
+ 7, 79, 17,218,249,249,249,157,224,243,249, 34, 71, 49, 89,243, 51, 7,154,166, 43, 75, 74, 74, 70, 3,200,252,147, 57,255, 55,
+225,162,147,218, 8,103, 57,109,219,224, 39,157,179, 9,175,157,117, 35,231, 96, 27,231,146,167,164,156,131,159, 84, 78,238,122,
+ 93,224, 29,225, 74, 61,114,215,253,116, 40, 39,235,238,114, 54, 21,167,187,222,163, 90,202,201, 54,193,115, 95,242,148,148,115,
+240,147,198, 89,179,254, 56,201,235, 18,167,147,117,202,213,114,178,238, 46,103, 83,113, 62,234,123, 84, 79, 57,217, 71,173, 75,
+117, 60,251, 37,120, 10,145,214, 13,108, 90, 55,176, 55,186,215, 26,183, 49,166,174,255,115,201,145,176,169, 86, 2,112, 97,247,
+109,252,196,147,202,233,120, 31,220,153, 42,160, 9,210, 14,196,187,155,179,198,253,116, 23,150,216, 86,152, 36,192,137,128,163,
+174, 92,187, 59,158,123,141,107,117, 11,111, 35, 68,150, 75,156,238,170,247, 77,205,233,174,119,169, 38,167, 59,234,125,109,207,
+189, 9,159,145,187,202,233,150,119,169, 41,234,124, 45,245,231,145,121,107,114,186,227, 93,170,201,233,142,122,255,103,112,186,
+227, 93,170,141,211, 29,245,190,174,103,255,180, 26,154,184,233, 66, 91,136, 7,194, 9,177, 21, 7, 0,100, 99,110, 90, 19, 90,
+202,134,184,155,211,221,101,110, 10,177,233,130, 5,230,177,115,186,249, 25, 45,177,113,186,115,116, 51,196, 93,207,168, 41,234,
+187, 35,167,187,248,107,242,184,227, 57,213,198,249,168,229,173,163,156,110,191,246, 71,173,247,127, 22,167,155,159,145, 91,222,
+165, 26,156, 67,220, 60, 24, 24,226,176,191,196,157,156,238,122,151,106, 41,231, 35, 63,167,218, 56, 31,181,188,117,148,211,237,
+215,238,142, 62,164,169,120, 31,167, 69,139, 37,235,172, 19,113, 53,182, 63, 69,104, 60,182, 41, 57, 23,185,255, 82,156, 46, 78,
+207,140,104,130,103,255, 88,203,233, 78,206,154,101,116,231,116, 79, 83,150,211,157,156, 46,148,245, 47,199,249,180, 61,247, 39,
+241,126,214,197,247, 40,211, 82,117, 89, 71,155,162,156,238,228,116,146,251, 47,193,249, 8,207,254, 47, 7,222,147, 82, 16,238,
+198,187,121,100, 2, 55, 91, 96,154,236,186,221, 92,206, 33, 77, 97, 33,108, 2,184,189,156,182,145,242, 39, 77,112,237, 79,203,
+ 61,245,188, 75,158,119,233,137,123,151,106,212,201, 33,110,180, 20,185,213,242, 92,147,211, 29,191,225,200,225,174, 58,218,212,
+215,238,206,119,169, 41,158,253,211,134,255, 15, 96,195, 45,132, 53, 49,191, 76, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
0};
diff --git a/source/blender/editors/datafiles/prvicons.c b/source/blender/editors/datafiles/prvicons.c
index 5d6b63c1d80..4254fe5a08e 100644
--- a/source/blender/editors/datafiles/prvicons.c
+++ b/source/blender/editors/datafiles/prvicons.c
@@ -1,477 +1,390 @@
/* DataToC output of file <prvicons> */
-int datatoc_prvicons_size= 15052;
+int datatoc_prvicons_size= 12311;
char datatoc_prvicons[]= {
-137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13,
- 73, 72, 68, 82, 0, 0, 0,192, 0, 0, 0,192, 8, 6, 0, 0, 0, 82,220,108, 7, 0, 0, 0, 4,115, 66, 73, 84, 8, 8, 8,
- 8,124, 8,100,136, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 25,116, 69,
- 88,116, 83,111,102,116,119, 97,114,101, 0,119,119,119, 46,105,110,107,115, 99, 97,112,101, 46,111,114,103,155,238, 60, 26, 0,
- 0, 32, 0, 73, 68, 65, 84,120,156,237,125,121,156, 20,197,221,254, 83,125,205,204,206,206, 30,236,194, 94,200,130,200,181, 34,
- 32, 40, 1,228, 88, 48, 70, 64,209,168, 81,140, 33, 26, 77, 66, 98,242,198, 55,106,162,198, 11,242,198, 68, 5,209,188,106,140,
- 49, 94, 16,125,127, 49, 30,241, 74,226,145, 40,162, 34,114, 9,114, 45,187,171, 92,123,176,176,247, 28, 59, 71,119,215,239,143,
-217,158,237,233,233,158,233,185,150,197,237,103, 63,179, 51,221, 93, 93,245, 84,245,243,173,250,214,209,221,132, 82, 10, 11, 22,
- 6, 43,152, 19, 77,192,130,133, 19, 9,203, 0, 44, 12,110, 80, 74, 35, 31, 0,203,149,143,178,109,240, 93,222, 27,110,154,230,
-252,114,245,249,234, 56,213,219,218,223,122,233,234,241,136,119,142,206,113, 35,142,186,113,197,137,191, 60, 1,199,242,120,101,
-160, 87, 38,154,253,137,226, 55,228, 19,111,127,162,242, 77,230,250,104, 63,218,178,141,163, 15,109,222,116,243, 26,175, 76, 12,
-174,109,204,183, 94,124,102, 62, 81, 45, 0,165,244, 9,245,119, 28, 92, 72, 41,125,130, 82,186,205, 96,255, 19, 0, 64, 8, 89,
-174,108, 19, 66,150, 43,129,212,191,141,210, 85,199, 99,246, 28,147, 28,117,161,141, 95, 21,247,133, 70,156,180,199, 53,233, 62,
- 97,176, 29, 21, 78, 57, 95,155, 31,163, 50,209, 73,207,112,191,230,120, 76, 89,153,189, 62, 58, 72, 84,182, 23,234,149,157,118,
- 59, 81,153,196, 3, 33,164, 28, 64,115,130,248, 18, 34,161, 11,100, 80, 24,111, 18, 66,150,247,146, 72, 26,218, 2, 55,147,174,
-153,115,210,225,152, 10,167,222,237, 55,147,224, 20, 55, 62,147,225, 99,210, 75,151,135, 22,122, 6,161,124,122,119,197,148,173,
- 65,217, 24,114, 52,202,123, 18,101,114, 33,165,244,141, 20,206,139, 66, 66, 3,208,179, 42, 74,105,147, 89, 75, 77, 38, 94, 19,
-233,154,182,240, 84, 56, 38,203, 41,219,101, 96, 16, 62,233, 22, 32, 21,232,181,198,170,150, 36,166,108, 13,202,198,144,163, 81,
-222,147, 40,147, 55, 9, 33, 75, 82, 56, 47, 10, 92, 42, 39,169,107, 2, 29, 82,203, 21, 66,234,154, 36, 89,130,169,158,151, 12,
- 71,157, 99,122,113,196,212, 90, 9, 56,189,169, 9,167,221,206, 56,122,227, 87,220, 17,211,249, 75,245,250,152,141,223, 76, 28,
-137,210, 53, 10, 71, 41,109, 34,132, 92,152, 40, 92, 66, 30,212,154, 7,176, 48,136, 97, 13,131, 90, 24,212,176, 12,192,194,160,
-134,101, 0, 22, 6, 53, 44, 3, 72, 3,132,144,242, 84,135,223, 44, 12, 16,232,204,242, 37,154, 89, 77,102,182, 54,238, 57,113,
-102, 0, 19,206,226,170,247,233,165, 29,143, 71,170,233, 26,229,217, 12, 95,163,176,122,113,170, 57,105,243,169,141, 83,111, 59,
-206,185,134, 51,172, 38,174,101,170, 51,227, 70,231, 37,154, 65,143, 59, 99,159,169, 79, 50, 6,160,187, 95,239, 98,152, 61,199,
- 40,141, 68,225, 18, 8, 44, 33,143,116,210,213, 11,147,204,121,102,202, 49,153,112,102,242,145,236,117,137, 87,134,102,211, 72,
-182,172,147,201, 95, 38, 63,105,185, 64,169,204,214,154,156, 1,204,202, 76,179, 94,124, 25, 74, 55,153,243, 18,206,162, 26,193,
- 76,184, 84,103,139, 51,113, 45,227,165, 77, 77,142,207,167,122,205, 83, 69, 90, 6,160,151,169, 68, 25, 53, 58, 78,163,103, 30,
-179, 53,211,108, 52,139,154, 86,186,201,156,167, 23,214,172, 56,204,132, 51,226,145,136, 95, 38,174,101,188,180,147, 89,226, 96,
- 50, 92, 70,160, 59, 19,108, 48,171, 22, 51,163,105, 98,246, 45,149,115,226,206, 52,166, 56,211,252,102, 18,181,167,110,186, 41,
-158, 23, 51, 43,171, 23,214,160,140, 50, 58,139,171,153, 45, 54, 74,211,204,117, 73,106,102, 60, 78,126,227,149,149,118, 59, 42,
-108,111, 43,113,161,217,138, 35, 30,172,153, 96, 11, 39, 29,146,113,169, 18,198,101, 25,128,133,193, 12,107, 30,192,194,160,134,
-101, 0, 22, 6, 60, 8, 33, 89,115, 83,190, 18, 6, 96,205,200,126,181, 65, 41, 37,218,125,132,144,106, 66, 8, 85,125,170, 83,
-141, 92,119,210, 2,250, 51,140,166,238,201, 84,109,155,189,183, 51,238,236,168,222,121, 6,124,210,186, 87, 89,143,115,162, 60,
-105,227, 78,162,108,226,206,160, 38,251, 1, 80, 13,128, 2,168,238,221,166,170, 99, 84,249,214,134, 49,216,214,134,167,154,180,
-180,219,134,105, 39,147,190,122,159,118, 91,179,175, 90, 47, 13,117, 60,166,203, 77, 79,252,102,127,107,191, 19, 29, 79,244,173,
-151,150, 25,110,201,156,103, 54, 47,233,114, 55, 83,142,241,226, 73,250, 66,170, 68,166, 21,146,217,111,163,184,140,210, 50,155,
-118, 42, 60,140,210,208,132,175, 86, 11,223,136,111,188, 79,202, 46, 80,178,247,128, 38, 64,202,179,163,137,226, 73, 6, 26,206,
-111, 26,140,123,235,230, 41, 25,238,217,114,215,180,190, 50,165,148, 36,242,159,123,143,207, 87,111, 83,149,203, 97,214,255, 54,
- 74,155,106,220, 23,189,244,212,219, 70,113,107,227,233,197,251,148, 82, 66, 41, 93,111,134,163, 30, 82, 54, 0,154,220, 61,160,
- 17, 49,233,137,136,166, 49, 59,154, 40,158, 36,207,127,130, 82,218,164,196,165,254, 86,113, 50,138,219, 52,247, 84,242,102, 6,
-122, 34, 49, 16,142,246,248,251,128,190,208,204, 26,131,217,180,213,233,233,109,107, 17, 71,252, 0, 48, 63, 45,255, 31, 58, 51,
-193, 52,205,251, 68,245,206,161,225,251, 55,163,190,245,206, 69,242,247,223,234,114, 64,156, 89, 70,154,230,189,202, 58, 48, 53,
-203,172,199,147,234,204,252,102,114,146,199, 32,237,184, 53,174, 34,114, 69,116,154,237,249,102,106,108, 19,233,255, 90,239,152,
-186,197,210, 51, 60,213,190,249, 42,195, 80,243, 76,154,151, 53, 17,102,225,164, 68,111,173,175,110, 57,230,167,226, 10, 89, 6,
- 96, 97, 80,227, 43, 49, 15, 96,193, 66,170,176, 12,192,194,160,134,101, 0, 22, 6, 53, 44, 3,176, 48,168, 97, 25,128,133, 1,
-129, 61,211, 8,221, 51,141,208,221,103, 71,143,233, 43,251,247, 76,139,158,131,216,125, 54,169,214,134,215,134, 49,131,148,158,
- 13,106,193, 66,166,113,250,182,240, 24,127,175,136,137,222, 49, 53,136,140,247, 79,223, 70,137, 18, 62, 21,241, 3, 86, 11, 96,
-161,159,160, 8, 52,158, 80,247, 76, 35,148, 50,177,147, 89,122, 45, 3, 0,236,158, 70, 86, 42,191,245,140,196, 12,172, 22,192,
-194,128,192,158,105,132,234,137, 56, 94,203, 48,113, 27, 93,185,103, 26, 89,145, 78,186, 86, 11, 96,161, 95, 64, 25,204, 87,215,
-240,122, 45,129,218,215, 87,127,235,157,167,141, 47, 85, 88, 51,193, 22, 6, 53,172, 22,192,194,160,134,101, 0, 22, 6, 53, 44,
- 3,176, 48,168, 97, 25,128,133, 65, 13,203, 0, 44, 12,106, 88, 6, 96, 97, 80,195, 50, 0, 11,131, 26,150, 1, 88, 24,212,176,
- 12,192,194,160,134,101, 0, 22, 6, 53, 6,213, 98,184,233,211,167,151,202,178,252, 46,128,137,217, 74, 67, 16,132,150,141, 27,
- 55,150,102, 35,238, 49, 99,198,216, 10, 11, 11,103, 72,146,228,202, 70,252, 0,192,243,124, 96,211,166, 77,239,102, 43,254,129,
-134,164, 12,224,100, 22, 80, 47,247,247,215,172, 89, 35,204,155, 55, 15, 91,183,110, 69, 69, 69, 5,236,118, 59, 88,150, 5, 33,
- 4, 12,211,215, 32, 18, 66, 98,126,171,247,233,237,247,249,124,248,250,215,191, 94,146,105,238, 64, 88,252, 5, 5, 5, 51,239,
-187,239, 62,102,193,130, 5,216,190,125, 59, 42, 42, 42, 32, 8, 2, 56, 46,124, 25, 89,150, 53, 60, 63,222, 49, 0,224, 56, 14,
- 62,159, 15,213,213,213,182,140, 18, 31,224, 48,109, 0,122, 2, 42, 47, 47,143, 8,136, 97, 24, 16, 66,116,133,163,254, 29,111,
- 95,182, 4,164,112,127,224,129, 7,108,243,230,205, 27, 5, 0, 91,182,108,129,223,239, 71, 94, 94, 30,120,158,143,201,131,250,
- 99,180, 95,123,236,203, 47,191,204, 52,117, 0,125,226,191,255,254,251,153, 5, 11, 22,228, 0,192,230,205,155, 49,121,242,100,
-184, 92, 46,112, 28, 7,150,101,163, 68,174, 24, 5,208, 39,126,245, 62,245,126,229,251,192,129, 3, 89,225, 63,144, 97,202, 0,
-244, 4,180,105,211, 38, 76,154, 52, 9,121,121,121,224, 56, 14, 28,199, 69,137,193,232,119,188, 99,217, 16,144,194,125,245,234,
-213,182,234,234,234, 81,202,126,134, 97, 32,203,114,148, 17, 38, 35,124,163,227,153,134,158,248,129,176,104, 37, 73,130,122, 91,
- 65, 42,226, 31,172, 72,104, 0, 70, 2,226, 56, 14,178, 44, 3,136, 21, 79, 42,226,207,134,128, 20,238,171, 86,173,178,207,159,
- 63,127,100, 84,198, 57, 46,101,241, 27, 29,203, 52,140,196,175,240, 87,144, 9,241,107,195, 12, 22,196,205,117, 60, 1, 41,133,
-151, 41,241, 43,219,153,130,154,251,130, 5, 11, 70,106,143, 43,126, 63,165, 52, 35,226,207,180, 17,196, 19,191,194, 95, 11, 75,
-252,201,195,112, 24,212,140,128, 24,134,137, 18, 80,186,226,207,148,128, 18,113, 87,248,171,211, 76, 87,252, 12,195, 68,117,162,
-211, 65, 34,241, 43,252,141,220,151, 84,197, 63, 24,221, 33, 93,211, 55, 35, 32,197,133, 80, 4,148, 9,241,103, 66, 64,106,151,
- 77,219,106,169, 97,179,245, 13,118,100, 66,252,153, 50, 96, 51,226, 7,140,107,109, 75,252,201, 33,166, 20,205, 10, 72, 16, 4,
- 0,136, 18,110,186,226, 79, 87, 64,234,206,186,186,191, 2, 0,129, 64, 0, 7, 15, 30,196,225,195,135,209,214,214, 6,135,195,
-145,208,157, 49,227,242,104,143,167,131,120,226, 15, 4, 2, 56,112,224, 0, 14, 31, 62,140,142,142, 14,228,228,228,196,136,217,
- 18,127,242,136, 42, 41, 51, 2, 58,116,232, 80, 68, 64,106, 55, 98, 32,248,255,178, 44,191,251,224,131, 15, 10,115,231,206, 29,
- 37,203, 50, 26, 27, 27,177,119,239, 94,212,214,214,162,181,181, 21, 46,151, 11,133,133,133, 40, 44, 44,140, 12, 31, 42,174,203,
-137, 22, 63, 0, 20, 22, 22,206,120,224,129, 7,152,185,115,231,230, 72,146,132,198,198, 70,212,212,212,160,174,174, 46,138,127,
- 65, 65, 65,132,191, 90,248, 64,122,226, 31,140,134, 16, 85, 90, 70, 2,218,191,127, 63,142, 31, 63,174, 43,160, 76,250,255, 25,
-112,129, 38, 86, 85, 85,225,177,199, 30, 67,109,109, 45, 56,142, 67, 73, 73, 9,138,138,138, 80, 94, 94, 14,158,231,193,243, 60,
- 4, 65,128,221,110, 7,207,243, 81,121, 72,197,229,209,126,210,129, 36, 73,174,170,170, 42,252,225, 15,127, 64, 93, 93, 29, 88,
-150, 69,105,105, 41,138,139,139, 49,105,210,164,136,216,109, 54, 27,108, 54, 91, 84, 63,128,101, 89, 75,252, 41, 64,235, 2, 77,
-156, 48, 97, 2, 30,125,244,209,168, 11, 48,100,200, 16, 76,158, 60, 25, 28,199,129,231,121,216,108, 54,216,237,246,132,227,255,
-253,237, 2, 1,128,219,237,134,211,233, 68,117,117, 53, 10, 10, 10, 0,244, 77,180, 41,105, 8,130, 16,201, 7,195, 48, 49,147,
- 96,233,244, 5,210, 69,119,119, 55, 92, 46, 23,230,205,155,135,194,194, 66, 0,177,162,213, 26,129, 94,127,192, 18,191, 57,196,
-148,156, 34,160,121,243,230, 33, 63, 63, 63,170,102, 83,220, 5,165, 22, 85,215, 66,122,174, 68, 42,134,145, 46,156, 78, 39,166,
- 76,153, 2, 73,146,148, 55, 10, 70,226, 85,210, 82, 12, 89,201,139,194, 61,149,137,175, 76, 27,176,211,233,196,228,201,147,163,
- 38,185, 20,168, 69,173, 22,191,214, 8, 82, 17,191, 82,153, 13, 54,196,228, 88,239, 2,104,107, 80, 69, 64, 44,203, 70, 4,148,
-169,254, 64,218, 25,226, 56, 8,130, 16, 51,203, 11,244, 93,108, 69,236,138,225,198, 91, 6,145,108, 95, 32, 93, 40, 21,139, 40,
-138, 9, 93,154, 76,138,127,176, 34, 38,231,106, 1,169, 71,119,212, 23,122,229,159,254,131,173,123, 26, 33,245,206, 4, 39,139,
- 93,175,222,105, 40,172,116,161, 94, 23,163,204, 81,196, 91,162,145,168,230,239,239,142,176,222,186, 30, 61, 49,235,137,215, 18,
-127,242,208, 53, 0,165, 86, 49, 18,208,189, 55, 44, 70,107,167, 15,247, 61,253, 30,182,239,107,140,156,251,238, 19,215, 35, 47,
-215, 17, 21,182,189,203,135,250,195,199,241,228,203,159, 96,219,222,195, 0,226, 15,151,166, 11,181, 47,158,138,128,211, 57,150,
- 41,104,125,114,189,213,158,153,232,240, 14,118,241, 3, 58, 51,193,132,144,136, 75,160,184, 58,138,127,168, 30,118, 43, 45,206,
-195,143, 46,159, 21,117, 46,167,114,131, 20,129, 20, 23,230, 98,230,148, 83,241,212, 61,203, 48,103,218,105,225, 68,179, 56, 19,
-156,140,128, 51, 41,254, 76, 27,129,130,254, 18,127,188,153,229,175, 50,116, 13,192,172,239, 62,178,124, 72,116,100, 44, 99,120,
- 30,203, 48,184,254,202,185, 9,211,200, 4,210,173,217, 79,228, 40, 80, 60,119, 71,189, 79,217,159, 41,241, 15, 86,232,182,129,
-137, 46,188,242,219,229,180, 71,157,199, 38, 24, 9,154, 50,254, 20,124,109,210,168,126, 17,191,153,124,100,234, 88,166,196,175,
- 32,153,149,158,201,134,177,196, 31,141, 24, 3,208, 19,144,217, 81, 27, 51, 35, 65,107,239,253, 94,214,196,175,206,131,154,191,
- 89, 1, 15, 4,241,171, 97,137, 63,251, 48,108, 1,128,248,190,186,222,133,103,152,248,226,207,102,205,175,199, 63,219,226,207,
- 84,199, 93, 11,163, 78,176,246,152, 37,254,244, 97,216, 7, 72,228,255,235, 93,124,197, 5, 82,135,189,121,213,203,253, 46,254,
-100, 4, 60,208,196,175,133, 37,254,236, 66,183, 5, 72,217, 5,226,162, 93,160, 64, 72,194,134,173,117,134, 98,202, 22,140, 90,
-176, 76,186, 60,150,248,191, 26,208,237, 3,168, 93,136, 68,174,140, 26,108,239,113, 81,146,113,172,205,141, 63,189,248, 17,122,
- 2,161,126, 23,127,188, 78,240,201, 32,254,120,162,181,196,159, 89,152,238, 3,152,153,184,154,116,201,111,117, 19,233, 47,241,
-107,249,103, 82,252,153,156,171,136, 7,173, 72, 45,241,103, 23,134, 45, 64, 60, 97, 24,137, 97,247,107,119,129, 97, 24,136,146,
-140,150,214,110, 60,254,183, 15,241,242, 59,219, 7,132,248, 51,213, 17,238, 79, 88,226,207, 62,116,199,239,146, 89,200,166,119,
-158,192,115,168,172, 40,198,138,159, 46,129,195,198,247,187,120,146, 21,183, 37,254,193, 11,221, 22, 64,249, 78, 36,126,173, 40,
-180,199,114,236, 2,230,127,109,124,191,139, 39,211, 46,143, 37,254,175, 46, 12,251, 0,102,196,175,103, 0,218,243, 30,189,235,
-170,126,201,136,154, 67, 38, 93,158,254, 22,191, 26,102,132,109,137, 63, 61, 36,116,129,226,137, 95, 43,142,254, 28,237,137, 7,
- 75,252,150,248,205, 34, 97, 39, 56,153, 97,208,129, 32,254, 84,133,111,137,127,112, 34,238, 98,184,100,135, 65, 7,130,120,180,
- 60, 82,237, 11,156,104, 88,226,239, 31,152, 90, 10, 97, 36,126,143, 47, 16,117,174,199, 23, 24, 16,226, 57,153,197,175,119,111,
-174,122,201,179, 37,254,204, 34,169, 97, 80,237,144,225,129,198,182,168,243,234, 15, 31,239, 23,210,241,112, 50,139, 95, 15,137,
-214,251,107,143, 89, 72, 14,166,111,136,209,138,165,177,165, 19, 15, 62, 27,253, 34,145,251,159,252, 23,234, 15, 31,235, 55,242,
- 70,208, 51, 86, 75,252, 22,244, 96,106, 24, 84, 43,150,111,255,226, 73,124,182,239, 72,204,121, 91,118, 29,196, 55,190,255, 16,
-198,159, 90,138,191,220,255,125, 20, 21,228,102, 61, 3,122, 72,101,236,127,160,193, 18,127,255,192,112, 53,104, 60,255,255,111,
- 15,253, 40,242,123,160, 33,149, 81,160,129,134,100,110,115,180,144, 30,210,186, 39,120,160,226,100, 22,191, 2, 75,252,253, 3,
- 93, 21, 91,226, 63,177,176,196,223,127, 48,188, 39,248,100, 20,191, 2, 51, 35, 64, 39, 3, 44,241,103, 31, 9,159, 10,113,178,
-137, 63, 24, 12,162,190,190, 62,102,189, 82,127,136,159,231,249,180,227, 16, 69, 17,117,117,117, 0,250,223, 0, 6,163,145,197,
- 24, 64, 40, 20, 66,125,125,125,148,224,251, 75,252,233, 10,200,102,179,181,204,153, 51, 39, 43,239,233, 77,134, 67,170,231, 58,
- 28,142,192,172, 89,179, 78,232,123,122, 29, 14, 71, 32,113,168,175, 14,136,242, 4,101, 0, 56,231,156,115,142, 6, 2,129, 19,
- 46,160,143, 63,254, 56, 43,111, 90,183, 96, 65,139, 40, 3,176, 96, 97,176, 97,224, 59,245, 22, 44,100, 17,150, 1, 88, 24,212,
-176, 12,192,194,160,134,101, 0, 22, 6, 53, 44, 3,176, 48,168,145,212, 43, 66,122,223, 35,252, 46,128,137, 89,226, 3, 65, 16,
- 90, 54,110,220,152,149, 97, 80,139,127, 98, 12, 54,254,166, 13, 64,121,137,246,154, 53,107,132,121,243,230, 97,219,182,109,168,
-168,168,128,205,102,139,122,215, 46,128,152,111, 51,191, 9, 33,232,233,233,193,130, 5, 11,178, 50, 15,161,240,239,125, 15,242,
- 73,203, 95, 41,255,173, 91,183,162,188,188, 60,242,182, 72,189, 39,117,104,103,189, 19,229,203,237,118, 99,209,162, 69,131,170,
-252, 77, 25,128,250, 13,242,243,230,205, 27, 5, 0, 91,182,108, 65, 32, 16, 64, 94, 94, 94,212,139,221,146, 93,138,172, 62,246,
-197, 23, 95, 36,195,221, 52,212,252,231,206,157,123, 82,243, 87,202,255,147, 79, 62,193,196,137, 19, 77,243, 55,147,143, 3, 7,
- 14,100,157,255, 64, 43,255,132, 6,160, 38, 95, 93, 93, 61, 74,217,207,178, 44,100,213, 91, 34, 83,185, 9,165, 63,238,202, 74,
-196, 95,153, 8, 28,232,252, 87,175, 94,109, 88,254,137, 4, 98, 70, 68, 39,170,252, 21,156,168,242,143,107, 0,170,194,183, 87,
- 87, 87,143, 84, 31, 83, 22, 78, 81, 74, 51, 70, 62,211, 23,192, 12,127, 32,115,133,159, 45,254,171, 86,173,178,207,159, 63, 63,
-134,191,146, 94, 38,132,159,141,167, 94,159, 12,250, 49, 28, 5, 82,147,215, 22,190,146,129, 84, 11,190, 63,150, 41,127, 85,248,
-175, 90,181,202,190, 96,193,130, 24,254,106,193,102, 74,252,131,177,252,117, 91,128, 68,228,149, 12, 24, 93,132,116,158,199,153,
- 9,124, 85,248, 27,137, 31, 8, 47,149, 78,100, 4,169,184, 69,153,228, 31,175,252, 95,127,253,117, 20, 22, 22, 70, 58,193,122,
-121, 81,126,107,191,149,223, 12,195,224,214, 91,111, 77,171,252, 99, 12, 64,227,179,233,146, 7, 0, 65, 16, 98,246,165, 42,158,
- 76, 54,191, 95, 21,254,171, 87,175,182, 25,137, 7, 0,108,182,190, 85,211,201, 26,113,188,227,153,226,159,168,252,151, 46, 93,
-138, 83, 78, 57, 5,121,121,121, 16, 4, 1, 60,207,199,140,102,245, 71,249, 71, 25,128, 81,135, 5, 0, 2,129, 0, 14, 30, 60,
-136,195,135, 15,163,189,189, 29, 57, 57, 57,113,239, 28, 75,150,124, 38, 46, 64, 42,252, 91, 90, 90, 34, 15,163,170,172,172, 76,
-200,191,190,190, 30, 64,216,119,157, 48, 97, 66,191,241,247,251,253, 56,120,240, 32, 14, 30, 60,136,214,214, 86, 56, 28,142,148,
- 90,169, 68,199,179,197,223,227,241, 96,199,142, 29,216,190,125, 59,246,236,217, 3,183,219, 13,167,211, 9, 65, 16, 34,163, 64,
-102,107,126,117, 11,240,171, 95,253, 42, 45,254, 81, 6, 32,203,242,187,189,227,180,163,100, 89, 70, 99, 99, 35,246,237,219,135,
-253,251,247,163,173,173, 13, 46,151, 11, 67,134, 12, 65, 97, 97, 33, 92, 46, 87,100,252, 54,149,103,240, 24,237, 79, 7,169,240,
-223,182,109, 27, 46,187,236, 50,188,241,198, 27, 16, 4, 33,174,112, 8, 33,216,184,113, 35,174,189,246, 90, 60,243,204, 51, 56,
-253,244,211, 51,206,191,119,156,127,148, 44,203,104,104,104,192,222,189,123,177,127,255,126, 28, 59,118,204,176,252, 7,130,248,
-147, 41,255, 69,139, 22,161,160,160, 0, 46,151, 11, 57, 57, 57,176,217,108,145, 22,160,191,245,163,117,129, 38, 86, 85, 85,225,
-177,199, 30, 67, 93, 93, 29, 88,150, 69, 73, 73, 9,138,139,139, 81, 81, 81, 1, 65, 16,192,178, 44,108, 54, 27,236,118,123,164,
-230, 76,165,179,146,165, 38, 56,105,254,219,183,111,199,103,159,125, 6, 66, 8, 74, 74, 74,162,120,168,239,136, 83,190, 63,249,
-228, 19,108,220,184, 17, 0,240,195, 31,254, 48, 43,252, 31,125,244, 81,212,214,214,130,101, 89, 12, 27, 54, 12, 69, 69, 69,152,
- 52,105, 18,120,158, 7,199,113, 17,254,202,118, 38,196,159,237,242,255,248,227,143, 35, 2,231, 56, 14, 60,207, 71, 68,175,180,
- 0, 64,252, 26, 95,123,140, 16,130,219,111,191, 61,163, 6, 0,143,199, 3,151,203,133,234,234,106, 20, 20, 20,196, 36,200, 48,
- 76,132,188, 50, 11,169,231,187,165,218, 34,164,139,100,249,111,221,186, 53, 50, 23,176,105,211, 38, 0, 97,247, 70,249,104,183,
-213,251,178,193,223,237,118,195,225,112, 96,206,156, 57,200,207,207,143, 49, 72,165,188, 5, 65,136, 24,180,153, 73, 48, 51,198,
-145,205,242,255,233, 79,127, 26, 83,254,118,187,221,208,255,239, 47,253,196, 24, 64, 78, 78, 14, 38, 79,158, 12, 73,146, 34, 23,
- 89,129,146,176, 98,193, 44,203,130,231,249, 24, 23,232, 68,118, 36,147,229, 95, 95, 95,143,134,134, 6, 12, 31, 62,220,116, 26,
- 30,143, 7,185,185,185, 89,227, 63,105,210,164,168, 73, 58,109,139,148,168,252, 83, 17,127,134, 90, 0,195,242,127,226,137, 39,
-162,106,112,181, 49,107,107,251, 68, 53,191,250,247, 29,119,220,145, 86,249,199, 24,128, 98,157,138,107,163, 71, 64,177, 86,245,
-183,182, 48, 37, 89, 66,243,177, 6, 52, 30, 61,130,150,214,163,104,235,108, 69, 87,119, 7,124, 61, 94,252,230, 23,107,178, 34,
-158, 84,248, 3,136,136,127,229,202,149, 96, 24, 6,179,102,205, 66, 85, 85, 21,138,138,138,208,214,214,134,189,123,247, 98,227,
-198,141,144,101, 25, 43, 87,174, 68,110,110,110, 84,124,153,228,207,113, 28, 4, 65,128, 44,203, 81,252,245,202, 75,237,126,206,
-152, 49, 3, 71,143, 30, 5, 0,148,150,150, 98,203,150, 45, 9, 13, 67,207, 56,210,133, 81,249,255,252,231, 63, 79, 74, 63,253,
- 85,121,198, 24,128,226,147, 17, 66,116,155,121, 45, 89,183,183, 27,141, 71, 15,163,165,181, 25,173,157,199,209,217,213, 1,143,
-183, 27, 61, 1, 31,186, 61,221,232,118,119,161,203,221,137,110, 79, 23,186,221, 93,232,118,119,226,158, 95, 62,152,181, 11,144,
- 44,127, 53, 24,134,193,213, 87, 95,141,202,202,202,200,190,178,178, 50,148,149,149,225,180,211, 78,195,186,117,235,162,194,103,
-131,191,250,241,232, 70,110,150,242,173,124, 58, 59, 59, 81, 89, 89,137,125,251,246, 1, 0, 22, 45, 90,132,238,238,110, 20, 21,
- 21,245,171,248, 1,227,242,127,228,145, 71,162,202,220,168,118,191,229,150, 91,146,106,193,210,205, 67,140, 1,168,107, 70, 51,
- 68, 30,122,234,183, 81, 2,239,114,119,162,219,221, 5,143,207, 13, 89,150,225,114,230,225,212,202, 49,152, 50, 97, 26, 70,143,
- 28,139, 85,127,252,117,220,248,210, 69,178,252, 1,160,165,165, 5, 37, 37, 37,152, 53,107, 86,148,248,149,139, 8, 0,149,149,
-149,152, 53,107, 22, 0,160,167,167, 7, 14,135, 35, 43,252,181, 34, 81,127,100, 89,198, 77, 55,221,132,166,166, 38,252,230, 55,
-191,193,196,137, 19, 65, 8, 65,103,103, 39,102,206,156,137, 35, 71,142, 68, 90,131,206,206, 78, 20, 23, 23,131, 16,130,221,187,
-119,227,150, 91,110,193,136, 17, 35,240,248,227,143, 71,220, 38, 61, 65,165, 11,163,242,191,233,166,155, 50, 54, 82,152, 73,253,
-196,125, 81,182, 25, 34,127,123,243, 57, 48, 12,131,138,146, 83,112,106,229, 24, 76,159,114, 14, 70,143, 24,131,209, 35,199, 98,
-204,200,113, 24, 86, 92, 26, 21, 94, 49,128,108, 93,128,100,249, 3, 64, 73, 73,120, 5,109, 85, 85, 85, 76, 28,106, 40,199, 29,
- 14, 71, 76,252,153, 52, 0, 61,254,132, 16,220,124,243,205,152, 54,109, 26,254,231,127,254, 7,191,250,213,175, 80, 90, 90,138,
-101,203,150,225,175,127,253, 43,102,204,152, 1,143,199, 3,134, 97, 80, 85, 85,133,103,159,125, 22,203,150, 45,195,115,207, 61,
- 7, 73,146,176,110,221, 58,188,242,202, 43,184,254,250,235,241,244,211, 79, 27,138, 42, 19, 32, 36,188, 50, 51, 47, 47, 15,165,
-165,225,165,249,253, 33,254,140, 24,128,222, 5, 72,212,235,222,245, 78, 3,108,130,205, 52,193,108,139, 63, 89,254, 10,138,138,
-138, 34,191,181, 29,104,237,113,117,252,153,228,175,196,171, 23,127,115,115, 51, 46,190,248, 98,200,178,140, 39,159,124, 18,235,
-215,175,199,221,119,223,141,229,203,151,227,130, 11, 46,136, 12,231, 94,124,241,197,200,203,203,195,186,117,235,112,253,245,215,
-163,184,184, 24, 94,175, 23, 23, 93,116, 17, 94,127,253,117, 67, 81,101,210,128,135, 14, 29,138,138,138, 10, 4,131, 65,200,178,
-156, 49,129,103,186,242, 76,216, 2,152,233,120,152, 21,191, 81,211,158, 73,241,164,194,191,173,173, 45,210,225, 45, 43, 43, 51,
-140,183,173, 45,252, 70,156, 80, 40, 4,158,231,179,194, 95,207,128, 21,190,247,220,115, 15,110,187,237, 54, 60,245,212, 83,248,
-248,227,143, 49,121,242,100,188,246,218,107,104,106,106,194,230,205,155,225,247,251, 97,183,219,177,111,223, 62,156,126,250,233,
-152, 62,125, 58, 90, 90, 90, 80, 83, 83,131,113,227,198,225,206, 59,239,196,154, 53,107,116,203, 67,175, 66, 72, 39, 15,133,133,
-133, 81,226,255,253,239,127, 31, 85,169,104,243,169,253, 54,179,143, 97, 24,220,125,247,221,105,149,127, 92, 3, 48,211, 52,169,
-201,153, 21, 92, 54,197,159, 10,127,165,102,223,187,119,111,196, 0,212, 92,149,126,192,222,189,123, 1,244, 61,194, 49,219,252,
-181,124,171,170,170, 48,124,248,112,188,247,222,123, 56,243,204, 51,177,107,215, 46,236,221,187, 23, 53, 53, 53,120,251,237,183,
- 81, 95, 95, 15,150,101, 49,109,218, 52,124,247,187,223,197,184,113,227,224,245,122, 49,100,200, 16, 28, 57,114, 4, 46,151, 11,
- 83,166, 76, 73,120,125, 50,197, 95, 93,243,223,116,211, 77,105,213,238,217,154,193, 54,124, 58,180,242, 59, 17, 17,117,184, 84,
- 12, 38,211, 72,133,191,130,141, 27, 55,226,180,211, 78, 67,101,101, 37,180, 79,204, 59,116,232, 80,100, 6, 88,157, 86, 54, 16,
-207,128,175,188,242, 74,172, 92,185, 18,175,190,250, 42,246,238,221,139, 87, 95,125, 21, 27, 54,108,192, 93,119,221,133, 25, 51,
-102, 0, 0, 54,111,222,140, 95,252,226, 23,184,241,198, 27,113,209, 69, 23,129,231,121,220,113,199, 29,184,225,134, 27,250, 69,
-252,122,229,255,208, 67, 15, 69,141, 10,169,243,153,108,205,175,109, 1,210,129,169, 62, 64, 60,129, 43, 68,204, 90,180, 54,141,
- 76, 35, 21,254,202,133,145,101, 25,235,214,173,139, 59, 15,160, 14,159, 77,254,234, 15,165, 20, 93, 93, 93,232,232,232,192,243,
-207, 63,143,229,203,151,163,185,185, 25, 53, 53, 53,216,176, 97, 3, 54,108,216, 16, 53,107, 92, 89, 89,137,133, 11, 23, 98,246,
-236,217,152, 59,119, 46, 74, 74, 74,112,222,121,231, 97,221,186,117, 88,190,124, 57,138,139,139, 81, 88, 88,168, 59, 79,144, 41,
-254,218,188,220,124,243,205, 25,237,236,102,170,252,211, 30, 5,210,134, 51, 35,184,108,137, 39, 29,254, 64,120, 34, 44,153,248,
-179, 5,109, 13, 58,115,230, 76,140, 28, 57, 18, 51,102,204,192,236,217,179,177,120,241, 98,108,217,178, 5,239,190,251, 46,238,
-186,235,174, 40,241, 43,159,130,130, 2,172, 88,177, 2,207, 63,255, 60,238,188,243, 78, 44, 88,176, 0,205,205,205,120,232,161,
-135,240,217,103,159,161,173,173, 13, 7, 14, 28,200,138,168,244,202,255,193, 7, 31, 52, 60,174,221,103,230,152,242,157,241, 22,
- 64,143, 68, 42,157,218,108,142,244, 36, 66,178,252, 7, 18,244, 42,150,163, 71,143,162,166,166, 6, 13, 13, 13,240,120, 60,216,
-185,115,103,228, 61, 2, 51,102,204, 48, 44,251, 89,179,102,225,209, 71, 31,197,170, 85,171,208,216,216,136,203, 46,187, 12,130,
- 32,192,233,116, 98,216,176, 97, 89,187, 62,122,229,255,203, 95,254,114, 64,213,252, 10,226,186, 64,102, 8,170,207,233,111,242,
-122, 72,133,191, 50,177,101,118, 41, 68, 54, 93, 32, 37, 15,218,188, 40,219,138,219, 98,183,219,117, 39,156,180,253, 45,189, 69,
-114,218,178,202,180,248,245,202,255,129, 7, 30,208, 13,147, 74,205,175,142, 39, 43, 45,128,150,124, 60,129,171, 73, 39, 90,119,
-210,159, 72,134,191, 50,177,101,118, 41, 68,182,197,175, 45,215,210,210, 82, 44, 92,184, 16, 51,103,206, 68, 85, 85, 21, 46,190,
-248, 98,212,215,215, 99,250,244,233,216,188,121,115,228, 70, 30,109,158, 55,109,218,132, 37, 75,150,160,167,167, 7,185,185,185,
-120,246,217,103, 81, 91, 91,139, 93,187,118,161,162,162, 34,171,215, 70,203, 69,189,196, 33,149,190, 64,182,202, 60,225,107, 82,
- 19,145, 4,140,199,219,119,239,223,129,215,223,121, 9, 71, 91,143,162,161,233, 16, 10,242, 11,179,146,137,116,249, 43, 80, 47,
-133, 80,142,233, 45,133,200, 54,180, 6,176,117,235, 86,116,119,119,163,163,163, 3,107,215,174,133,205,102,195,172, 89,179,112,
-245,213, 87,227,191,255,251,191,177,112,225, 66, 20, 20, 20, 68,229,203,237,118, 99,229,202,149,248,244,211, 79, 17, 12, 6,241,
-218,107,175,161,179,179, 19, 43, 86,172, 64, 81, 81, 17,134, 12, 25,146, 85,241,239,222,189, 27, 46,151, 11,163, 71,143, 6, 0,
-172, 94,189, 58, 38,111,122,121,141, 23, 70,175,156,178, 54, 10,100,214, 66,149, 12,171,247, 73,178,132,255,251,251, 51,232,246,
-116,193,233,116,193,223,112, 0, 71,154, 14, 97,243,206, 79,178,222, 18,164,194, 95,153, 64, 82, 47,133, 80, 47, 69, 86,126, 43,
-199,179,237, 2,169,243,161,112, 30, 50,100, 8,138,138,138,240,157,239,124, 7,183,221,118, 27, 46,188,240, 66,140, 27, 55, 14,
-183,220,114, 11,102,207,158,141, 21, 43, 86, 68, 12,116,211,166, 77, 88,185,114, 37,254,252,231, 63, 35, 55, 55, 23, 62,159, 15,
-207, 62,251, 44,214,174, 93,139,177, 99,199,102,181, 86, 85,226, 45, 46, 46, 70,121,121, 57, 24,134, 1,165, 20,183,222,122,235,
-128,170,249, 21, 36,124, 73,158,154,224,222,186,207,241,214,250,215,209,210,214,130,134,166, 67,200,207,139,189,225,132, 16,130,
-255,125,234,126, 52, 30, 61,130,242,146, 10,116,117,119,162,179,187, 3,129, 96, 0, 84,150, 49,180, 40,251,111, 96, 74,166,128,
- 1,192,110,183, 3,208, 95,234,160,158, 15, 80,142,103,243,162, 36,226,189,110,221, 58,252,236,103, 63, 67, 71, 71, 7,218,219,
-219,177,100,201, 18,204,153, 51, 7,207, 63,255, 60,254,240,135, 63,128,101, 89, 44, 89,178, 4,159,126,250, 41,114,115,115,209,
-208,208, 0,167,211,137,101,203,150,225,201, 39,159,196,195, 15, 63,156,117, 97, 17, 66, 48,124,248,240,136,248, 25,134,193,170,
- 85,171, 98,102,130,213,249,213,238, 83,127,199, 75, 39,235, 45, 0,195, 48,144,100, 9, 47,255,243,255,224,243,123,145,151, 87,
-128, 35,205,135,209,120,244, 8,182,238,250, 84, 87, 84,127,127,235, 5,216, 4, 27, 14, 28,174,135,215,231,193,241,246, 99,232,
-114,119, 66,148, 68, 44, 93,242,221,180, 8, 39, 66, 50,226,215,142, 2,169,151, 66,104,197,175, 28,239, 15, 24,241,222,189,123,
- 55, 26, 26, 26,112,238,185,231, 98,255,254,253, 24, 62,124, 56,242,242,242,224,112, 56,112,251,237,183,227,222,123,239, 5, 33,
-225,103,100, 6, 2, 1,244,244,244,192,233,116,162,167,167, 7, 87, 92,113, 5, 46,189,244, 82,236,216,177, 3, 83,167, 78,205,
- 42,119, 69,184,234,135, 94,221,118,219,109,166,175, 77,127,142,206,197,109, 1, 20,130,143, 63,247,123,180,180, 54, 27,214,232,
- 90,242, 46,103, 30,246,214,237, 2,207,241, 16, 37, 17,161, 80, 16, 0,240,203, 31,223,141,155,127,116, 71,214, 51,101, 86,252,
-202,133, 82,214,246,168,151, 66, 40,241, 0,136, 89, 10,145,237,137, 48, 35,222,183,222,122, 43,158,126,250,105,184,221,110,140,
- 25, 51, 6,111,189,245, 22, 30,123,236, 49, 92,119,221,117, 88,188,120, 49, 26, 27, 27,193, 48, 12, 28, 14, 7, 94,127,253,117,
- 60,243,204, 51, 88,182,108, 25,174,184,226, 10,240, 60,143, 21, 43, 86,224,134, 27,110,192, 71, 31,125,148, 21,238,234, 60,104,
-243,113,255,253,247,155, 90, 11,148, 76,185,102,165, 5, 80, 34, 86,147,127,253,221,151, 96,183,217,117,107,244,203, 47,248, 78,
-140,229,254,233,254,231,176, 98,205, 47,209,208,116, 24, 78,103, 46, 10,243,135,224,198, 31,252, 10,103, 78, 60, 59, 45,178,102,
- 97, 86,252, 74, 97, 43,107,123,204, 46,133,200,182, 95,106,196,123,196,136, 17,120,245,213, 87,177,120,241, 98,252,232, 71, 63,
-194,232,209,163,241,200, 35,143, 96,221,186,117,104,107,107,195,210,165, 75, 65, 8,193, 51,207, 60,131,174,174, 46,172, 93,187,
- 22, 79, 62,249, 36, 46,185,228, 18,172, 92,185, 18,239,188,243, 78,212, 8, 87, 54,249,107,203, 95,253,248,146,129, 80,243, 43,
- 48,245,166,248,220, 28, 23,106,190,216, 19, 83,163,223,188,252, 78,220,180,252,246, 24,242,163, 78, 25,141,117,191,127,165,255,
-114,145,128,127,188,130, 87,195,236, 82,136,108,243, 55,250, 60,254,248,227,184,254,250,235,241,198, 27,111, 96,205,154, 53,145,
-133,109,203,151, 47,199,154, 53,107, 34,143,117,169,171,171,195,138, 21, 43, 48,118,236, 88, 60,252,240,195,216,177, 99, 7,110,
-184,225, 6, 84, 86, 86, 98,237,218,181, 89,231,175, 87,206,247,221,119, 95, 84, 24,237,119, 42,149, 74, 86, 91, 0,245,231,225,
-255,121, 10,191,125,228, 14, 52, 29,109,128,211,153,139,130,188, 66,252,252,251,183,225,204,137,103,159, 48,203,141, 7,179,226,
- 87,187, 56,132, 16,211, 75, 33,250, 99, 34, 76,143, 63,203,178,120,234,169,167, 98,142, 21, 23, 23, 99,199,142, 29,200,201,201,
- 1, 0,236,218,181, 43,234,118,200,169, 83,167,102,221,237, 73,196, 95,185,121,125,160,212,252, 10, 76, 13,131,158, 58,226, 52,
- 60,253,192,223, 6, 28,121, 61, 36, 35,126,109, 77,148, 76, 26,217, 68, 50,252, 9, 9, 15,145,182,183,183, 99,232,208,161, 0,
-128,138,138,138,172,142,243, 39,195, 93,225,255,187,223,253, 46, 42,140, 58,108, 50, 88,177, 98, 69, 70,249, 38,108, 1,146, 25,
- 69, 25, 40, 72,149,191,217,165, 16, 3,129,187, 54,140,222,194,182,254, 22,127,188, 60,220,121,231,157, 3, 82, 63,166, 70,129,
-140, 10,125,160, 34, 89,254,138, 75, 99,118, 41, 68,127,184, 64,201,136, 63, 94,235,118, 34,112, 50,233, 39,198, 4, 79, 38,242,
-122, 72,133,191,178,173, 93, 10,161, 14,167, 94, 10,145,237,252, 91,226, 55,135, 95,255,250,215, 16, 69, 49,173, 56,146, 90, 11,
- 52,208,197,175, 32, 85,254,102,151, 66,100, 19,233, 10,127, 32, 92,159,254,210, 79, 38,250, 3,134, 45,192,201, 42,254, 84,248,
- 43, 2, 55,187, 20, 66, 59, 71,144,105,156,204,226, 63,217,244, 19,211, 2,132, 66, 33,212,215,215, 71, 21,104,127,145, 87, 38,
-164,210, 65, 42,252,149, 99,218,167, 66, 40,190,190, 34,120,101, 41,132, 18,190,182,182, 54,227,252,125, 62, 31,190,248,226,139,
- 24, 81,199,187,187, 46, 83,226, 63, 81,229,159, 41,164,194,159,168,107,179,115,206, 57,231,104, 32, 16,200,254,106,181, 56,176,
-217,108, 45, 31,127,252,113, 74, 47,106, 62,217,249,207,154, 53,235,104, 48, 24, 60,105,249,159,140,229, 79,178,221,156, 91,176,
- 48,144,113,226, 7, 98, 45, 88, 56,129,176, 12,192,194,160,134,101, 0, 22, 6, 53, 44, 3,176, 48,168, 97, 25,128,133, 65, 13,
-195,199,162, 88,176,144,105,244,190, 71,248, 93, 0, 19,179,149,134, 32, 8, 45, 27, 55,110, 52, 61, 12,106, 25,128,133,126,129,
-242, 18,237,222,247, 32, 99,235,214,173,168,168,168,136, 60,224, 75,153, 45, 86,160,158, 56, 83, 79,250,169,161,221,239,243,249,
-240,245,175,127, 61,169,121, 8,203, 0, 44,100, 29,234, 55,200,207,155, 55,111, 20, 0,108,217,178, 5,126,191, 31,121,121,121,
-186,175, 73, 53,187, 4, 68,125,236,203, 47,191, 76,154, 27,231,116, 58, 86, 6, 2,193, 59, 36, 73, 54,101, 12,132,144, 32,165,
-116, 37,165,244,222,164, 83,203, 2, 28, 14, 71,117, 48, 24,156, 35,203,178,217,254,140, 4, 96, 61,165,180,255,110,145,138,131,
-147,157,127, 34, 40,226, 95,189,122,181,173,186,186,122,148,178,159, 97,152,200,251, 3,128,228,111,100, 50, 58,158, 44,152, 64,
- 32,120, 71,205,190, 93, 92, 40,232,131,153, 79,125,109, 77, 8, 64,102,111,203, 73, 3,193, 96,112,206,254,253,187,152, 80,168,
- 7,102, 62,117,117,251,101, 0,213, 39,154,183,130,147,157,127, 60, 40,226, 95,181,106,149,125,254,252,249,163,212,199,148, 55,
- 73, 2,201,139, 95,121, 62,106, 38, 22, 2,114,146, 36,115,149, 35, 71,161,199,219, 14, 89,138, 94, 91,173,183, 72,162,172,116,
-200, 81, 0,163, 83, 74, 45, 11,144,101,153, 25, 57,242, 84,248, 61,237,144,229,104,254,122,183,176, 87,148, 22,122, 0,244,207,
- 51, 26, 77,224,100,231,111, 4,181,248, 23, 44, 88, 48, 82,123, 92,241,251,227,189, 10, 54,149, 86, 33, 89,244,190,144, 22,144,
- 36, 49,230, 2, 64,103,157,144, 36, 83, 41,233, 84,178, 13, 25, 16,101, 29,254, 58, 79,113,144, 56, 71,246, 31,237,144, 44, 78,
-118,254, 26, 36, 18, 63, 0, 30, 79, 27,159, 0, 0, 26, 61, 73, 68, 65, 84,195, 55,196,167, 42,126,165, 85, 72, 22,170, 51,104,
- 88,240,189, 31, 74, 41,104,120,111,248, 67,195,203,131, 41,149, 56, 0,126, 66, 72, 69,210,169,101, 21,114, 88, 48,234,143,126,
- 56, 6,128, 72, 8,113,245, 39,187,196, 56,217,249,135,161,246,249,141,196, 15, 0, 54,155, 45,242, 59, 19,226, 79,171, 5,232,
-238,108,193,246, 77, 47,161,199,219, 5, 0,160,138,243, 67, 85,110, 80,239,111,150, 99,135,254,242,151, 55,250, 31,124,240,225,
- 67, 28,199, 70,142,169,130, 17,237, 78, 74, 17,195,140, 82, 26,181,143,101, 24,209,102,231,126,235,245, 6, 86, 38,155,137,238,
-206,163,216,190,233, 37,248,124, 93,189,123,228,200,151, 86, 70, 12,225,156,183,220,114,147,248,192, 3,191,191, 81,121,190,190,
- 62,250,206,148,229, 88,254, 90, 48, 12, 35, 11, 2,243, 97, 79, 79,104,125, 82,228,113,242,243, 87,160, 30,237, 81,119,120, 1,
- 32, 16, 8,224,224,193,131, 56,124,248, 48,218,218,218, 12, 95, 52,158,110, 71, 56, 89,112, 0,192,178, 4,185, 78, 59, 56, 18,
-236,149, 45, 85,137,159,106, 12,129,186,150,127,111, 9,126,113,227, 79, 33, 83, 25, 20, 20,164,183,124, 9,244,198,110, 17,181,
-143, 70,142,133, 35, 85,194, 29, 58,116,136, 59,123,198,185,119, 0, 88,153,108, 38, 24,142, 65,110,174, 29, 28, 19,236,187,236,
-154, 31,170, 77,225,135,215, 44,193,205, 55,254,180,247, 65, 87, 50,148,134, 48,170, 1,101,244,246,169,127,200,189,191,194, 59,
- 15, 30, 62,200,156,253,181,115,231, 0, 88, 63,216,248, 71,168,201,242,187, 15, 62,248,160, 48,119,238,220, 81,178, 44,163,177,
-177, 17,123,247,238, 69,109,109, 45, 90, 91, 91,225,114,185, 80, 88, 88,136,194,194, 66,184, 92, 46,112, 28,103,216,161,237, 15,
-241, 3,189, 6, 32,138, 50,186,186,124,240,122, 61,145, 3,234,251, 4,162,238, 25,160, 64,199,230,183, 96,119,228,130, 48, 28,
- 34,102,162,106, 42,212, 61,135,152,251, 13,148,198,133,246,109, 80, 0,237,237, 29,144,101,115, 67,177, 90,136,162,140,206, 78,
- 31,124, 62,119,100, 95,180, 7, 33, 71,253,220,177,249, 95,176,231,184, 0,134,131,186,182,213, 9, 29,179,165, 19, 28, 0,208,
-222,222,134, 36,134, 50,191, 82,252, 85,152, 88, 85, 85,133,199, 30,123, 12,181,181,181,224, 56, 14, 37, 37, 37, 40, 42, 42, 66,
-121,121, 57,120,158, 7,207,243, 16, 4, 1,118,187, 29, 60,207, 71, 70,131, 50,213, 17, 78, 22,189, 45, 0,131, 28,167, 13, 12,
- 9, 63, 38, 60, 92, 57,107,221, 32, 26,221, 39,166, 34, 40,148, 78,155, 90,244,209,225,162, 13,169, 55, 66,213, 87,164, 37,160,
-169,223,221,207, 49, 12,114,114,237, 96,152,240,155, 94,244,175,185,164,217, 31,130,140, 16,116, 79,136, 58, 89,229, 74,168,118,
- 51,170, 42, 89, 6, 0,109, 7, 54, 9,156,236,252,213,112,187,221,112, 58,157,168,174,174, 70, 65, 65,223,227,243,129,190, 91,
- 35, 5, 65, 0,207,243,176,217,108,225,167,143,119, 31, 71,221,163,223,131,167,177, 30,142,226, 50,148,159,127, 61,202,191,241,
-253,148, 12, 35, 89,244,182, 0, 18,186,187,125,240,245,182, 0, 17,205,210,228,133, 29,251, 91, 57,187,239, 95,244,254,176, 1,
-120,188, 61, 73,147, 87, 32,138, 98,152,191,199, 29,125, 32,202,135,214,212,139, 49,154,145, 13,246,171,142,246,253,139,217,239,
-241,249,147, 35,173,194,201,206, 95, 13,167,211,137, 41, 83,166, 64,146,164,168, 39,107, 40,223, 12,195,128,227, 56,240, 60, 15,
-134, 97,192,243, 60, 26, 63,120, 14,249,104,197,156,165,231,195,231, 13,226,179,183, 31,129,231,192,103, 24,251,195,255, 5,195,
- 11, 73,181, 10,201,130, 3, 0,134,101,224,204,177,129,129,195,208,245,209,186, 44,138,138, 99, 92, 31,170,218,210, 49,152,168,
-115, 85,255, 66,161, 16, 82, 5,195, 49,200,205, 17,192, 32,199,176,198, 83, 95,124,125,239, 66,142,173, 71,163,220,138, 88, 31,
- 67,157,146, 40, 6, 83, 96, 30,198,201,206, 95, 13,142,227, 32, 8, 66,204, 44, 47,128,200, 75,253, 20,191, 95, 89,254, 48,108,
-230, 37,216,253,159,167, 49,188,169, 1,195, 38,156,141,217, 23,148, 96,231, 71,159, 98,231,175, 23,225,140, 91, 95,132,189, 96,
-168,233,190, 64,210,124, 1, 64, 18, 37,116,187,125,240,122, 60, 26,161, 70,254,105,106,255,222,111, 3,145,171, 3, 81,221,237,
-232, 52, 40, 40,220,105,181, 0, 50,186,187,125,240,120, 60,136, 18,137, 81,109, 24,219,211,212,236,215, 57, 57, 74, 52,177,181,
-168,199,151,186,128, 78,118,254,106,112, 28, 7,150,101,193,178,108,212, 19,247,244,196,170, 24, 66,238, 41, 19, 48,241,182,151,
-177,125,245, 82, 76, 12, 2,195,167,205,195,212,111,124, 3, 95,110,219,140,109,183,205,193,153,119,190,134,220, 17, 19,178, 55,
- 10,196,176, 12,114, 28, 54, 64,238,237, 3, 68,185, 41,250, 46, 11,160,105, 33,194, 59, 84,191, 35,161,117,126,107,226, 1, 69,
- 48,152, 70, 11,192, 48,200,201,177,171,248,135,235,187, 79,183,212, 98,195,166,122,120, 60, 62,248,253, 65,248,131,193,240,183,
- 63,136, 96,239,239, 76,162,247, 98,232, 46, 19,225, 56, 78,158, 50,101,194,182, 45, 91, 62,255,231, 87,141,191, 26,106, 95, 92,
- 45, 80, 26, 10,224,240, 95,110, 69,247,190,143, 32, 5, 2,160, 84, 14,187,216,178,220,231, 42, 49, 12, 62,223,186, 31,108,193,
-112,148,143,159,136, 83,207,154, 1, 87, 81, 33,182,221,125, 62, 78,255,217,159, 49,236,236, 69,113,221,161, 84, 16,105, 1,186,
-220, 62,120,221, 94, 0,177, 53,187,161,176,161,250,173,221, 79,181, 34,143,236, 84,197,213, 23,222,227, 73,221, 7,149, 69, 17,
-157,221, 62,248, 60,225, 62,140, 82,123,110,216, 88,131, 23, 94,252, 59,138,139,139, 83,142, 59, 83, 56,120,240, 48,115,198,228,
-179,167, 1,136, 17, 80,182,249,203,178, 72, 24,134,163,122,251, 1, 64,239, 88, 50,252,213, 80,139, 81, 45,210,230,183,254,136,
- 92,127, 19,166, 93,122, 1, 88, 65, 0, 97,121, 16,150, 3, 97,194, 31, 48, 12, 64, 24, 0, 4,224,108,128,232, 7, 66, 62, 12,
- 29, 53, 22,179,243,139,240,233,159,254, 11,222, 35,215, 99,244,183,110,201,252, 40, 16,195, 50,112, 58, 4, 16,217, 22, 37,230,
-237,159,127,137, 15, 55,214,192,219, 19, 64, 48, 40, 34, 16, 8, 34, 16, 20, 17, 12,134, 16, 8,132,194,223, 65, 17,146,148,153,
-213, 17, 12,195,200,132, 16,221,139, 65, 8,233,161,148,222, 65, 41,125, 40,230, 60,197,135,150,237, 81,126, 45, 39,112, 40, 46,
- 46, 70,231,177,154,164,125,220, 96, 48,196,132,164, 16, 3, 0, 60,203,203,130,192,199, 25,106, 73, 12, 95,103, 43, 68, 81,212,
- 29,166, 72,200,191,181, 22,162,104,190,130,144,101,145,136, 34, 37, 84, 18, 73, 80, 18, 25, 42,202,132,112, 12, 21, 88, 78, 38,
- 44,215, 91,247,136,164,167, 39,200, 50, 0,108, 54, 65,226,109,188, 28,207, 16,124,221,198,252,181,208, 19,166, 28,236,129,195,
-233, 0, 79,253, 32,162, 8, 80, 30,144,121,128, 97, 65,249, 28, 32, 20, 8, 15,235, 18, 6, 8,249, 0, 42, 3,172, 0,136,126,
- 56,243,243, 49,231,242, 75,176,245,173,191,192,115,112, 23,206,188,229, 57, 16, 18,107, 4, 41,143, 2, 73,162, 4,183,167, 7,
- 30,183, 55,202, 0, 62,217, 82,135,255,247,194,203,253, 89,131, 26,230,160,161,161,193, 81,117,250, 89,247, 3,136, 49, 0, 81,
-148,209,237,241,194,211,237,137, 62, 32, 43,199,253, 16,131, 62, 83, 4,100, 89, 36, 62, 95,128,235,234,236,180,185,189, 94,129,
- 16, 66,115,115, 93,193,130,252,188,128,195, 33, 72,102,106, 75, 61, 4,227,164,159,144,127,208,103,202, 0,100, 89, 38,162, 36,
- 17,159,183,135,243,122,220,130,183,199,207, 5,131, 1, 78, 18, 69,134,229, 56, 89, 16,108,162,195, 97, 23, 57,150,165, 61, 61,
- 62,174,219,237,177, 49,132,208,252,188,188, 64, 81,241,144,158,156, 28,135,104,148,191,120,252,213,208,186, 64,202,167,100,254,
-213, 56,248,204,141,216,191,237, 95, 80,207, 75, 51, 44,143,170, 69, 87, 98,196,240, 92, 48,160, 0,219, 59, 21, 36,137,136, 44,
- 32,144, 2,224, 65, 49, 99,201,133,248,236,189,247,176,247,137,155,113,198,245,255,155,182,248, 1,165, 5, 96, 24, 56, 28, 2,
-100,201, 22,229,162, 8,130,128,226,162, 98,180,183,236,131,164,115, 1, 82, 82, 66,178,177,244, 30, 14,184, 61, 8,137,162,238,
-179,239, 24,134, 65,142,221, 6, 89,180, 71,237,183,219, 5, 0, 50,100, 89,214, 27, 35,137,129, 40,138,196,231,243,241, 45, 71,
-143, 59,119,236,220, 87,242,215,151,255, 51,213,225,176, 5, 47, 94, 50,123,247,148,137, 19, 90, 74, 74,135,122,115,114,114, 66,
- 28,151,138, 17, 24,167, 31,159,127,239,185,178, 94,247, 85, 21,187, 28,174,209, 59, 59, 58,236,199,219,218,114,106,235, 14, 20,
-109,218,188,103,196,161,134, 99, 69,221,157, 62,103, 65, 65,174,103,100,101, 73,235,244,179,170,142,148,149, 12,241, 29, 58,210,
-146,247,194,203, 27,102,129, 80,233,187, 87,156,251,241,215,102, 76,105, 44, 97, 75,125, 54, 27,163,223,156, 39,209,254,169, 71,
-127,148, 79, 78,233, 40,156,126,251,107,145,237, 96, 91, 35,246,174,249, 54,198,205,154,135,138,145,195, 64, 3,221, 0,103, 7,
- 41, 28, 5,118,228, 57,128,171, 28, 32, 12,104,231, 65,200,117,239, 64,110,222, 1,244, 28,199,228,121,115,241,241,107,111,226,
-200, 59,103,162,114,225,117,105,137, 31, 80, 90, 0, 73,134,219,221, 3,183,219, 23, 61,246, 79, 41, 40, 40,196,144, 15, 98, 40,
-245, 81,154,116,160,116,144,186,187, 58, 12,195,200,162,140,110, 79, 15, 60,221, 62, 68, 15,248,201,125,223, 9,222,239, 37,138,
- 34,241,121,125,124,211,209,163,185, 91,182,238,174,248,199,127,246, 44,254,247,251,155, 29,255,248,199, 63,112,247, 93,119,156,
-122,237, 85,254,127,157,125,214,196,198,242,210, 82, 79,142, 51, 5, 35,136,147,126,124,254,137, 13, 88,105,181,142, 29, 63,158,
-211,112,164, 41,127,237,243,111, 77,157, 56,101,246,164, 95,255,246,143, 76, 89, 89, 25,236,118, 59,142, 28, 57,130,109,219,182,
-141,123,250,169,167,100, 57,212,190,167,181,189, 51,111,243,214,125,229,219,182,109,195, 47,110, 90, 62,121,194,248, 83, 91,135,
- 20,230,251,109, 54,206,192,159, 53,111, 1, 90, 3,208,250,236,238,250,109,168,251,227,143, 49,245,130,111,162,176,192, 14,234,
- 61, 6,112,118, 48,149,231,128, 25,179, 16, 68,125,107,100,201, 25, 96,134, 77,132, 84,243, 38,196, 29,127, 1,219,115, 28,211,
-207,159,143, 13,107,111, 71,229, 55,174, 6,195,219,140,104,152, 66,111, 11, 64,194, 45,128,104,131,186, 35,235,176,135, 35, 15,
-175, 2, 77,203, 5, 54,134,105, 25, 25, 7,100, 24,244,214,160, 66,212,126,229, 5,216,137, 4,164,212,252, 77, 71,143,230,110,
-222,178,123,248,219,239,213, 44, 90,191,254, 67,135, 40,138, 56,239,188,243,112,202, 41,167,228, 92,119,237, 53,139, 36, 42,191,
- 53,253,108,185, 33, 21, 35,136,151,126, 34,254,189,153, 48, 60, 63, 20, 8, 50,237,109,237,246,109, 91,119,151, 61,247,226,134,
-243,215,174,251,191,194, 41, 83,166,192,231,243,245,142, 22,249, 49,108,216, 48, 44, 94,188, 24, 11, 23, 46,100,158,120,226,137,
- 51, 86,175, 94, 21,202,205,205,197,216,177, 99,209,218,218,149, 31,244,251,185, 80, 64,100,100,123, 80,183,195,156,168, 2, 81,
-160,238,140,234,137,255,216, 71, 47,162,233,141, 7, 49,227,210,203,225,100,125,128,207, 13,176, 54, 16, 87, 57, 48,250, 60, 72,
-148, 98,255,129, 86,236, 62,208, 6,175, 63,132,211, 42,242,113,246,248, 18, 8, 99, 23,131,110,250, 3,164,186,183, 33, 12, 29,
-135,161,167,140,192,177,237,255, 70,217,215, 46, 48,197,203, 8,125, 45,128,199, 7,119,183, 55,106, 20, 39,188,216, 42, 44,254,
- 19,109, 0,241,210, 23,101,197,135,246,169,231,133,194,252,229,200,134,238,185,178, 44, 18,191,175,135,107,106,106,201,221,188,
-101,215,240,119,214,215, 46,122,127,253, 6,135, 40,138,240,122,195,163, 98,227,199,143,199,179,107,255,146,115,237,247,174, 94,
- 8, 74,223,154,126, 54, 26,134,151,151,184,227,249,204,201, 32, 46,127,196, 55, 96, 89,150, 73, 79,192,207,118,116,117,216,159,
-123,241, 63,231,124,178,105,103, 33,207,243,104,110,110,198,227,143, 63,142, 15, 62,248,128, 30,109,110,236, 41, 45,171,112,204,
-155, 55,143, 44, 95,190, 28,223,255,254,247, 49,122,244,104,149, 59, 73, 33, 81,137,136, 52, 68,228,222, 86, 39, 38,157, 20, 90,
-128, 40,241, 3, 56,248,255, 86,162,167,110, 35,102, 95,122, 41,248,192, 49,208,144, 8, 66, 88, 0, 12,104,229, 92, 72, 50, 69,
-125, 99, 59,254,245,233, 33, 4, 69, 9, 59,235,143,227,143, 77, 93,248,225,133,167,227,154,243, 39, 0,179,110, 6,234,222, 6,
-245, 28, 67, 89,249, 20, 28,126,231,233,204, 24, 0,195, 16, 56,236, 2,164,144,210,156,132,199,254,237,142,112,159, 32,101, 3,
-200, 76, 39, 33, 28, 85,156,135,248,134,125,104, 33,170, 6,149,229,190, 62, 0, 12, 46, 42, 0,132, 66, 34,211,222,209,105,223,
-178,117, 87,197,219,235,247, 47,126,255,253, 13,118, 81, 20,177,115,231, 78,204,156, 57, 19,199,143, 31, 71,125,125, 61,198,142,
- 29,139,103,215,254, 37,231,154,107,150, 45, 34, 4,255,116,204,226, 14,241,101,165, 94, 67,159, 89,139, 56, 53,104, 92,254, 9,
- 12, 24,178, 8, 41, 36,145, 80, 32,200,130, 8,197,161, 80, 8,159,127,254, 57,174,191,254,199, 98,249, 80,254,179,111, 46,158,
- 86,207,210, 9,228,192,145,163,133,207, 60,253,248,153, 47,189,244,210,208, 85,171, 86,145, 9, 19, 38, 68,162, 8,143,121,244,
-166, 33, 27,148, 85, 18, 45,128,182, 19, 44, 7,123,176,255,225,107,225,178,201,248,218,249, 11,192,202, 94,244,240,165, 16,137,
- 13,185,190, 58, 16, 80, 72,206, 82, 80, 81,196,198,221,205,104,110,243, 98, 91,109, 11,188, 61,225,185,161,191,189, 95,135,111,
-205, 25, 5, 97,232, 25, 96, 8, 3,218,211,129,252,138, 60,236,219,177,197, 20,167,120,136,180, 0, 30,143, 31,221,238,222,158,
-126,239, 24,190, 44,135,151, 59, 83, 12, 4, 3,136,239, 67,123, 60,126,116,119,247,141, 84,200, 80,106,206,222,111,157, 11, 40,
-203, 50,233,241,251,217,246,142, 14,199, 63,223,221, 49,243,131, 15,183, 68,196,191,116,233, 21, 82, 83, 83, 51, 11, 0, 75,151,
- 94, 33,189,240,194,223,216, 49, 99,198, 96,221,186,231, 29,215, 94,243,237,121, 85, 19, 78,125, 49,191, 48,207,207,178,140,204,
- 48, 76,194,156,198,245,225,227,242,239,251,211, 5,195, 80,150,103,100,135,211, 17, 28, 55,186,104,203,130, 5,243,206,234,238,
-234, 12,126,235,226, 25,235,207,156, 60,246,168, 32,216,196,206,246, 14,231,191,215,239,158,191,119,223, 23,195,114,115,115,213,
-249, 7, 0,136,162,204, 82, 74, 40, 40,161,178,129, 1,164,210, 2, 16, 66, 16,236,104,198,222,251, 47,199,200, 9, 99,113,234,
-184, 74, 64,242,162,179, 59,136,141,175, 60,135,115,174,188, 26, 32, 4, 84, 12, 64, 18, 69, 80, 73, 66, 83,171, 27, 31,126,222,
- 16, 53,249,106, 23, 88,128,202, 8,133, 66,176,133, 35, 6,203,219, 16,234,241,232,166,159, 12, 34, 45,128,221, 46, 64, 12, 9,
- 81,171, 63,115,148, 81, 8, 42,135, 63, 90,152, 27,192,201, 8,226, 25, 0,195,132,107, 75, 81, 12,215,152, 74,200, 8,255, 56,
-144, 68,137,136,162,196,128,216, 10,125, 62, 31,246,237,219,135,107,174, 94,214, 67, 16,240, 0, 24, 10, 0, 4,129,246,107,174,
- 94,150,187,118,221,115,142,202,202, 74,240,130, 93,160,146, 76,168, 72,205,207,188,196,109, 1, 18,240,143,123,135, 24, 96,227,
- 57,169, 40, 63,175,231,202,111, 45,216,221,217,217,253, 5, 75, 8,117,185, 92,254,252,188, 60, 63, 24,192,235,245,216, 64, 56,
-254,200,145, 35, 81, 67,218,148, 82,108,223,190, 29,229, 37,133,109,246, 28, 94,228,121,197,152,211,107, 1,148,111,255,177, 67,
-216,253,219,139, 48,105,238, 28,148,150,228, 2,178,136,150,163, 93,216,185,126, 61,114,135,143, 67,200,219, 13,146,199,130, 6,
- 61,144,218,234, 16, 32, 78,140,173,112,198,220,137,187, 96,114, 25, 68, 49, 4,182,113, 91, 88,135,124, 14,130, 33, 25,142, 33,
-233,191,138,160,175, 5,240,246,160,219,237,139, 74, 92,148,194,125,128,176, 27,164, 35,231,254,124,183, 64,130, 62,128,199,231,
- 67,183,218,135,238,221, 15, 0, 48,104, 1, 0, 80,142,231,164, 92,167, 35, 48,122, 68,238,167,115,102,207,152, 26, 8,248, 67,
- 23,157, 63,101,203,171,255,220, 60, 69, 9,196,115,156,116,209,249,103,124,240,131,235,174,154, 68, 88, 91,193,148,211, 43,182,
-229,186,156, 1,142,231, 36, 0,212,204, 27,228,227,118,194, 77,240, 55,238,195,200, 36, 24, 10, 50, 65,127,128,149, 66, 18, 97,
- 9,161,148,202,196,231,243, 9,161, 80,144, 37,132, 80, 89,146,200,194,249, 85, 31, 95,250,205,133, 83, 65,216, 72,207, 90, 12,
- 73,236,208,226,220,198,101,151,207,223, 94,224,116,249,109, 60, 39,197,185, 21, 51, 97, 30, 21, 40,174, 79,221,159,126,138, 73,
-115,206, 65, 73, 33, 1,101,120, 28, 58,112, 20, 95,236,216,133,179,239,125, 31,199, 54,191,137,182,218,183, 80, 60,116, 2,224,
-110, 6,249,240, 62,248,207,127, 10, 51,199, 13,193,210,185,149,120,111,103, 11,130,162,132,153, 19,134,226,226,153, 21, 8,133,
- 66,176,111,121, 24, 0,192, 20, 84,162,179,195,141,194,241, 51, 77,115, 50,130,170, 5,224, 17, 10,132, 71,129, 20, 56, 28,189,
- 45,130, 44,131,154,172, 1,162,145, 57, 3,137,223, 2, 48,176,219, 5, 4,237,118,168, 47, 84,142,122, 28,221,224, 2,218, 4,
- 94, 26, 90, 92,232, 91,182,244, 27, 59,151,120,186,247,139, 65,137,117,123,189,118, 96,115,212, 98,144, 49, 99, 78, 57,126,230,
-148,113,255,228, 5, 78,204,115,185, 2, 67,139,243,125,188,192,107, 23,233, 27, 35, 65, 31, 32, 62,127, 99, 3,146,164, 16,233,
-236,236,182,213, 29, 56, 52,228,197, 87, 54, 76,170, 63,208, 84,198,178,125,171,253, 29, 14, 91,224,155,139,167,127, 94, 85, 53,
-234,216,148, 73, 99,254, 33,201, 18, 35, 74, 34, 19, 10, 73, 44, 75, 64,157, 46,167,127,104,113,145,215, 85,232,242, 19,150,208,
- 56,157,109,115,249, 68,159, 1,136,221,199, 49,100,248, 57,160, 8,162,118,103, 45,142,183,116, 96,250,253, 27,192,231, 22, 96,
-248,130,101,248,228,205, 63, 96,212, 25, 19,193, 52,110, 7,231,239,132,125,227, 61,240, 76,191, 13,151,206, 42,199,101,231, 84,
- 68,226, 2,149,192,111,126, 20,220,161,247, 1,134,131, 92, 54, 13,181,255,248, 0,179,239,123,196, 52, 39, 35,168,250, 0, 61,
-125,125,128,222, 90, 95, 18, 41,178, 62, 10,100,210, 72,226,117,130,195, 62,180, 79,197, 63,236, 71,132,223,160,217, 91,251, 27,
- 92, 64,142, 1,117, 58,156, 65,174,140,147,134, 6, 10,124,221, 94,159,208,212,216,172, 37, 70,115,115,236,129,242,210,146,174,
-156, 28,123,200,158, 99, 19, 5,158,147, 57, 6,212,172,107, 16, 15,233,240, 15,244, 4,216,174,142, 78,251,186,231,223, 62,235,
-201,181,175, 78, 26, 59,118,108,212,113,175,215,139, 25,103, 79,201,187,245,231,195, 95, 43, 46, 42,240,130, 2,221, 30,175,205,
-237,118,219, 41,165,132, 99, 56,217, 97, 19, 68,129,101,100, 6,233,231, 71, 61,246,159, 63,225, 28,124,250,175,127, 35,228,243,
-192,117,218, 89,152,250,155,191,130,229,109,225,155, 98,114, 11, 48, 98,241,143,240,197,158, 13, 24, 63,252,108, 72, 95,252, 27,
-185,187,159,134,112,116, 43, 60,147,150, 35, 88, 60, 9,148,176, 16,218,118, 33,119,207, 90,216,154, 63, 1, 0, 48,195,167,163,
-161,177, 3, 67,167,156,139,220,138, 49,105,113, 5, 52,125,128,144, 35, 92,227, 40,139,216,114,114, 4, 80,164, 49, 10,148, 17,
- 40,203,177, 19,251,208, 57, 14,117,141, 31,230,175,108,199, 29,135,231, 64, 29,156, 77,148,237,172, 36, 82,137, 48, 28,137, 9,
- 44,138, 18, 35,209, 16,161,176, 33,216, 19, 96, 37, 81, 34, 34, 47, 17,158,231,204,117,130, 77,244, 1,146,229, 47,203, 50, 9,
-132,130,140,183,167,135, 63,220,208, 54,108,252,248,241,104,105,105,137, 10,211,210,210, 2,134, 99, 72, 32, 20,100,125,254, 30,
- 46, 20, 18,217,154,186, 67, 67,223,124,251,243,185,146, 4, 97,226,132,161,219,190,117,113,245, 30,135,195, 22, 98,121,214,144,
-100, 50, 45,128, 50,252, 57,254,199,143,194,123,100, 31, 4,215, 16,216,139,202, 99, 38,198, 70, 94,248, 19,124,240,147, 63, 34,
-127,200, 44,148, 77,188, 28,210,254,127, 66,104,253, 28, 67,222,251,175,216, 72, 89, 1,236,105, 95, 71,135,152,143,253,155,223,
-195,185,127,220, 97,154, 79, 60,168,250, 0,126,184, 61,225,217, 94,165,182, 13,137, 18, 34,143, 72, 57,209, 6,144,200,135,246,
-248,225,233,173, 65,149,144,162, 40,246,141, 32,154,185,128, 50,192, 16, 74, 99, 23,228, 81,210,213,237,113,144, 35,148,242, 54,
- 78, 98, 8, 67,121, 27, 47,230,187,242,252,133, 5,121,254,156, 28,187,152,216, 8,210,225,111,208, 2,200, 50, 36, 73, 34, 84,
-150, 8, 97,123, 7, 76,101, 25,199,142, 29, 67, 77, 77, 13,238,190,251, 46,217,239,235,106, 95,124,222,228, 29,238,110,159, 35,
- 24, 8,242,235, 63,218, 61,210, 19,112,125,237,131, 13,155, 5,159,207,135,217,231,124,109,230,194,249,238,250, 96, 97,190,207,
- 38,240,146,113, 62,146,155, 8, 83, 62,174,202,211, 13,103,132, 57,155, 3,179, 87,127,136,173,247, 92,130,206, 97, 69, 24, 55,
-229,106,144,163,159,129,186,155, 65,221,205,128, 44,129,228,150,128,184,202, 64, 74, 39,225,224,151,205, 56,184,251, 19,204, 89,
-245, 30,236, 67, 82,122,143, 95, 12, 56, 0, 32, 12,129,221,198, 33,100,231,163, 22,195, 69,106, 36,163, 81,160, 12,192,108, 47,
- 33,209, 60,128,221,206, 33,232, 80,143,250,200,166, 91, 0, 68,133,146, 65,136, 38, 49, 98, 31,242,240,159,222,168, 86,211,117,
- 56,132,192,165, 75,102,109, 59,103,230,196,195, 37,252, 80,175,205, 38,196,157, 15,136, 63, 19,156,152,191,190, 0,251,230, 56,
-212, 79,228, 56,124,248, 48,102,207,158,141,215, 95,127,131,121,228,145, 71,138, 63,219,190,173,250,189, 15,255,227,158, 56,105,
-170,235, 7, 63,186,139, 95,184,112, 33,188, 94, 47,234,234,234, 32, 75,129, 46,150, 37, 50, 97,137,254,232, 79, 84, 90,230, 96,
-230,198, 21,229,227, 40,174,192,220,135, 54, 97,207,159,111,198, 71,175,191,141,242, 49, 99, 80, 56,116, 52, 92,227, 74, 65, 24,
- 6,158,214,227,232, 58,222,138,166,255,108,134,125,232, 72,156,251,248, 46,112,142,220,196, 36, 76,130, 3, 0, 89,146,225,245,
- 6,208,237,233,137,186, 73, 37, 20,146,122,127,157, 72, 23,168, 23, 9,231, 1,130,232,114, 71,175, 88, 12, 6,195,226,144, 77,
-172, 5, 2, 0, 6,160, 28,207, 74, 54,155, 61, 84, 94, 86,216,186,125,251,246,242,178,178, 50,212,127,113,192,198,113, 92,153,
- 58,172,223,239,199,180, 51, 79,119,157, 62,126,196,139, 5,121,121,126, 62,209,124, 64,130,181, 64,241,248, 71,250, 1, 49, 81,
-202, 32, 12,237,109, 28,251,146,190,238,186,107,165,123,238,249, 45,123,209, 69, 23,225,206, 59,239,132, 32, 8, 60,207,243, 67,
-120,158, 7,165, 20,173,173,173,120,229,149, 87,112,239,189,191,241, 92,121,201,244, 77, 46,151,211,207,115,108,220, 17,173, 84,
- 58,193,137,196,223,119,140,197,164,159, 60, 2,247,145, 26,180,237,254, 8, 13,159,189,131,182,247,158, 7,149, 68, 20,142, 61,
- 11,197, 83,207,199,148,111,206, 70,225,152,105,166, 57,152, 69,164, 5,176,217,120, 56,236, 66,212, 98,184,156,222,135, 20,156,
-216, 62, 0, 20, 18,198,199, 24,192,110,231,224,236, 29, 53,137,140,163,231,244,254, 48,154,221,212,129,192, 50,114,158,203, 22,
-184,228,130,233,187,190,243,237,203, 71,174, 94,243,191,121,211,166,197, 22,252,193,131, 7, 65,194,211,167,136, 55,202,212,135,
- 56,199, 19,240, 55,154,156, 2,100, 16, 66,168, 32,176, 98,190,203,225, 13, 6,131, 56,118,236, 24, 10,242,184,166, 63, 62,242,
- 59,255,203, 47,191, 60,102,233,210,165, 56,227,140, 51,112,202, 41,167,160,161,161, 1,187,118,237,194, 11, 47,188,128, 99,205,
-181,251,111,254,241,249,159,158, 50, 98, 88, 71, 65,129,203,207,243,140,156, 76, 45,111,132,228,197,223,183,157, 95, 89,133,252,
-202, 42,156,122,193,242,180,121,152, 5, 71, 8,145, 3,254, 0,211,227, 15,134,251, 0,125, 55,252, 66,150,195,247,117, 82, 89,
- 60, 97, 6,160,208, 9,134, 66, 32, 36,182,115, 10,128, 6,253, 65,226,243, 7,209,229,241, 35,114, 17,101, 64,150, 57,200, 0,
- 68, 49, 24,246,167, 77,128, 16, 34,231, 58, 29,129,211, 70, 86,180,126,111,233,244, 55,127,247,235,155, 38, 54,181,116, 20,107,
-125,181,130, 60,135,231,226, 69,103,237,204,117, 58,123, 88,134, 72,178, 44,199,157, 15,232,189,125, 81,207,138, 19,242,135, 44,
- 26,206, 99,240, 28, 43,229, 56,115, 2, 23,124, 99,234,206,169,103,158, 94, 8,128,187,240,188,169, 59,198,140, 41,111,171,173,
-111,218,247,236,159, 87,143,104, 62,214, 57,164,167, 39,228,116, 56,120,111,217,176,130,246,179,167,141, 62,180,236,210,139,154,
-139,139, 10,188,249,121, 46,127,142,205, 38, 34,193,124, 70,239, 13, 69,166, 60,214, 68,194, 55, 58,126, 34,192, 57,115,108,199,
-107,106,246,151, 12, 43, 41, 67,143,167, 61,178, 22, 84, 18,101, 12, 47, 25, 1, 73, 12,161,187,171, 93,247,228, 68, 47,217, 54,
- 51, 79, 70, 19,148, 41,237,237,132,215,127,217, 0,187, 93, 56,162, 61,238,116,218,124, 53, 53, 53,206, 97,195, 42,224,119,183,
-247, 45,128, 22,101, 20,149,141,128, 40, 6,209,221,169,207,223, 8,178, 44,139,206,252, 28,207,216,211, 42, 67, 63,190,110, 88,
- 91, 32, 24,224,169, 36, 19, 74, 41, 33,132, 80, 48, 4, 2,207,139,185,185, 57,126,123,142,224, 15,133, 68, 89,146,226,184, 56,
-178,140, 47, 15, 54,194,225,176,117, 39,203, 95, 22, 69,120, 60,157,198, 75,129,100, 81,206,205,177,247, 76,157, 50,254,200,105,
-163, 43, 94,130, 12, 56, 93,142,128,221,102, 15,149, 13, 45,110,159, 62,109,252,193, 96, 48,196,201,162,204, 48, 28, 35, 11, 2,
- 47,230, 56, 28, 33,167,211, 22,180,219,236, 34,195, 48,114, 80, 20,251, 30,241,164,151, 6,100,124,249,101,179, 46,127, 61,164,
-242, 80,171, 19, 5,206,110,227,183,191,244,242,203,139,254,235, 39, 63,192,190, 61, 59,194, 79,137,150, 40,130, 33, 25,231, 46,
- 94,128,142,246, 38,184, 61, 6,119, 3, 37, 50, 0, 19, 4, 18, 27, 81,120, 77,210, 39,155,107,252,146, 36,127,162, 61,238, 16,
-184,230, 23, 95,126,249,180,159,253,244,135,216,183,231, 51,136, 98,184,182, 12, 6,101, 44,184,224, 92,116,182, 55,193,231,247,
- 39,219,186, 83, 6, 76,200,238,176, 75,188, 32,248, 37, 81,100, 36,205,179, 76,121,142,145, 57,142,151, 32,129,250,253,193,184,
-153,144,101, 25,155,182,214,138,146, 36,198, 24,112, 60,254, 95,191,224, 92,116,118, 54,193, 23,255,153, 61, 20, 4, 98,158,203,
-225,181,219,120, 63, 0, 8, 2, 39,133, 39,195,108,112, 74, 14, 38, 16,148, 24,197,120,121,142,149,121,150,145, 9, 67,168, 36,
-201, 84,146, 18,223, 42, 42,203, 50, 54,110,174,209,229,175, 69,178,181,254,137, 20, 63, 0,112, 57, 60,243, 95, 47,189,252, 70,
-237,183, 46,187,148,253,246,119,111, 66,237,254,237, 16, 69, 9,227,198,159,137,161,195,134, 97,231,150,215, 16,240,167,104, 0,
-137,214, 10,153,104, 34, 40,165, 56,210,216,138,151, 94,251, 56, 20, 12,138, 49, 79, 44,200,145,185,127,190,244,210,235, 63,187,
-252,178,203,200,183,191,123, 51,106,107,183, 67, 20, 69,140, 31, 63, 21,195,134, 13,195,231, 91, 95,135,223,159,242,205, 60, 50,
- 0,153, 50,132, 48,154,231,203, 82, 2, 26,146, 66, 8, 73, 72,104, 92,135, 27,142,225,197,191,127, 36, 7,131,210,122, 67,254,
-151, 95, 70,190,125,205,205,168,173,217, 14, 89, 20, 49,118,252, 84, 12, 43, 45,197,222,237,111, 34,152,152, 63, 5, 32, 50, 76,
-120,101,170,198, 29,147, 89,134,144,190,251, 16,101, 26,146,228,240,123,102, 96,238, 73, 28, 7, 15, 31,195, 11,127,223,160,203,
- 95, 15, 39,139,248, 1,128, 80, 74, 49, 98, 68,241,245,109,173,158, 71,174,186,242, 34,246,194, 11, 47,192,216, 49,167,194,235,
-110,197,151,117, 91, 16, 12,196,185, 23, 52, 93, 3,136,211, 70, 72,146,140,163,199, 58,177, 99,215,129,158, 87,223,220, 44, 73,
-178,248,115, 81,164, 79,233,133, 29, 49, 98,232, 89,109,199,187, 23, 95,117,229, 69,100,201,197, 75, 48,246,180, 83,225,243,181,
-226, 96,253, 22, 4,253,153,121,226, 89,178,144, 69, 25, 77,199,218,177,125,199,151,226,203,175,109,146,131,162,248, 22,165,244,
- 51,189,176, 17,254, 87,125,147, 92,188,100, 9,198,142, 61, 21,126, 95, 59, 14,127,185, 29,193,160, 87, 21,105, 22,249,106,183,
-101, 25, 77, 71,219,177,117,199,151, 98,216,120,141,249, 43, 56,235,172,179,232,167,159,126,138, 64, 32,112, 66,196, 95, 91, 91,
-139,171,174,186, 10, 91,183,110, 53, 29, 57, 81,106,225,252,252,252,211,120, 78,126,212, 31, 16,167,248,124,129,161,148,210, 19,
-250, 14, 97, 66, 32, 11, 2,127, 68,150,229, 79, 66, 33,105, 5,165,180, 54, 94,248,252,252,252, 33, 60, 43, 45,246, 7,197, 82,
-175, 55,144, 3, 36,126, 36,120,150, 65,109, 54,190,155,138,242,145,160, 36,173,167,148,182,197, 11, 60, 96,249, 83,249, 72, 48,
-152,152, 63,208,103, 0,193, 96, 48, 97, 71, 56, 27, 72,197, 0, 34, 79, 99,238,234,234,170, 7,176, 48, 43,204,250, 1, 93, 93,
- 93,237, 0,158, 59,209, 60, 82,197,201,206, 95, 65, 48, 24, 68,125,125,125,204,227, 10,251,195,237,225,121,221,103, 38,196,133,
-245,154, 84, 11, 25,131,205,102,107,153, 51,103, 78,250,139,244,211,228,144, 76,120, 98,166, 35,106,193,194, 87, 21, 39,212,207,
-183, 96,225, 68,195, 50, 0, 11,131, 26,255, 31,244, 45,114, 84,193,188, 23, 3, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
- 0};
-
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0,192, 0, 0, 0,
+192, 8, 6, 0, 0, 0, 82,220,108, 7, 0, 0, 0, 1,115, 82, 71, 66, 0,174,206, 28,233, 0, 0, 0, 6, 98, 75, 71, 68, 0,
+255, 0,255, 0,255,160,189,167,147, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0,
+ 0, 7,116, 73, 77, 69, 7,218, 12, 7, 13, 58, 45, 79,248, 81, 14, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,125,121,120, 20,
+ 85,214,254, 91, 85,221, 85,189,164,179, 67, 2, 1, 18, 6, 8, 24, 48,136, 40, 66, 8, 97, 85, 1, 5,183, 25,151, 31,200, 51,
+ 58,126,124,226,140,142, 27,155, 32, 70,103, 20, 89, 29, 69,113, 25, 20, 68,249, 92,113, 16,253,252, 84, 28, 29, 81, 2, 36, 49,
+128, 96, 8,132, 64, 18, 18, 32,152,173,151,116,122,171,170,223, 31, 73, 53,213,157,222,183, 4,185,111,158,122, 82,221,213, 93,
+125,234,214,123,206, 61,231,220, 83,247, 82,162, 40,130,128,224, 82, 5, 77,154,128,128, 40, 0, 1, 1, 81, 0, 2, 2,162, 0,
+ 4, 4, 68, 1, 8, 8,136, 2, 16, 16, 16, 5, 32, 32, 32, 10, 64, 64, 64, 20,128,128,128, 40, 0, 1, 1, 81, 0, 2, 2,162,
+ 0, 4, 4, 68, 1, 8, 8,136, 2, 16, 16, 16, 5, 32, 32, 32, 10, 64, 64, 64, 20,128,128,128, 40, 0, 1, 1, 81, 0, 2, 2,
+162, 0, 4, 4, 68, 1, 8, 8,136, 2, 16, 16, 16, 5, 32, 32, 32, 10, 64, 64, 64, 20,128,128,128, 40, 0, 1, 1, 81, 0, 2,
+ 2,162, 0, 4, 4, 68, 1, 8, 8,136, 2, 16, 16, 16, 5, 32, 32, 32, 10, 64, 64, 64, 20,128,128,128, 40, 0, 1, 1, 81, 0,
+ 2, 2,162, 0, 4, 4, 68, 1, 8, 8,136, 2, 16, 16, 16, 5, 32, 32, 32, 10, 64, 64, 64, 20,128,128,128, 40, 0, 1, 1, 81,
+ 0, 2, 2,162, 0, 4, 4, 68, 1, 8, 8,136, 2, 16, 16, 16, 5, 32, 32, 32, 10, 64, 64, 64, 20,128,128, 64, 14,197,165,116,
+177, 99,198,140, 73, 23, 4, 97, 23,128, 17,209,250, 13,150,101, 27,138,138,138,210,163,113,238, 33, 67,134,112, 73, 73, 73, 99,
+121,158,215, 69, 75,126,165, 82,105,221,183,111,223, 46,162, 0,191, 49, 2,117,202,254,221,186,117,235,216,137, 19, 39,162,180,
+180, 20, 25, 25, 25, 80,169, 84, 96, 24, 6, 20, 69,129,166, 47,116,136, 20, 69,249,220,151,191, 39,189, 54,155,205,152, 54,109,
+ 90, 90,180,200,159,152,152, 56,238,249,231,159,167,167, 76,153,130,178,178, 50,100,100,100,128,101, 89, 40, 20, 29,183,145, 97,
+ 24,175,223,247,117, 76,130,205,102,195,164, 73,147, 56,210, 3, 4, 65, 32,142,227,192, 48, 12,104,154,238, 66, 14,127,196,113,
+223,143, 22,129, 36,217,215,174, 93,203, 77,156, 56,113, 32, 0,148,150,150,194, 98,177, 32, 62, 62, 30, 10,133,194,121, 13,210,
+117,120,219,124, 29, 63,117,234, 20,162, 73,254, 85,171, 86,209, 83,166, 76,209, 0, 64,113,113, 49, 70,140, 24,129,196,196, 68,
+167,252,114,146, 75, 74,225, 78,126,111,239, 51, 12, 19, 53,249, 47,122, 5,240, 68,160,253,251,247, 99,196,136, 17, 72, 72, 72,
+240, 74, 32,119,178,248, 59,118,242,228,201,104,185, 61,223,173, 89,179,134,155, 52,105,210, 64,103,240, 67,211, 16, 4,193, 69,
+ 1,125,145, 59, 80,197,136, 5,249,253, 89,244, 80,200, 79, 98,128, 32, 9,196, 48, 12, 68, 81,244, 74,160, 96,201, 47,237, 71,
+131,252,171, 87,175, 86, 77,158, 60, 57,203,155, 75, 16, 14,249,163, 37,187, 47,242,187,147, 89,126, 61,161,146,223,253,124, 68,
+ 1,194, 32, 80,168,228,143, 36,137,228,178, 79,153, 50, 37,203,147, 79, 28, 44,193, 3, 57, 22, 11,242, 7, 66, 98, 66,254, 48,
+ 21, 32, 80, 2, 73,238, 68,176,228,247,246,185, 88,144, 95,186,233, 82,208, 27, 41,242, 71, 74,126,127,228,151,218,223,155,235,
+ 18, 42,249, 47, 69, 87, 72, 17, 42,129,148, 74,101,200,150, 62,154, 46,144,220,101,115,239,181,228,224, 56,206, 99, 38, 39, 24,
+127, 63, 26, 10, 16, 8,249, 37,249, 35, 73,126,210, 3, 4, 73, 32,150,101,187,100,113,194, 37,191, 60, 13, 25,110,182, 71, 30,
+175, 0,128,213,106, 69,117,117, 53,106,107,107,209,220,220, 12,149, 74,229,145,200,225, 6,194,209, 34,191,213,106,197,169, 83,
+167, 80, 91, 91,139,150,150, 22,104, 52,154, 46,100, 15,135,252,151,106, 32,172, 8,150, 64, 53, 53, 53,104,110,110,134, 90,173,
+118, 18, 34, 18,150, 63, 92,242, 0,128, 32, 8,187,214,175, 95,207, 22, 20, 20, 12, 20, 4, 1,245,245,245, 56,122,244, 40,142,
+ 29, 59,134,198,198, 70,196,199,199, 35, 57, 57, 25, 9, 9, 9,208,233,116, 46,113, 64, 36, 98,129,112,145,148,148, 52,118,237,
+218,181,116, 65, 65,129,134,231,121,212,215,215,163,162,162, 2,149,149,149,104,108,108,132, 78,167, 67, 82, 82, 18, 18, 19, 19,
+161,211,233,160, 80, 40,186, 16, 63, 28,242, 95,242, 46,144, 32, 8,187, 58,243,252, 78, 2,149,151,151, 59, 9,164,211,233,144,
+156,156,140,196,196, 68,104,181, 90,151,252,127,184,228,143,144, 11, 49, 34, 39, 39, 7, 27, 55,110, 68,101,101, 37, 24,134, 65,
+ 90, 90, 26, 82, 82, 82,208,183,111, 95,231,160, 17,203,178, 80,169, 84, 78, 2,249,203,255, 7,115, 44, 28,240, 60,175,203,201,
+201,193, 43,175,188,130,147, 39, 79,130, 97, 24,244,234,213, 11,169,169,169,200,205,205,133, 66,161, 0,199,113, 96, 89,214, 57,
+254,226,205,234, 19,242,135,230, 2,141, 24, 62,124, 56, 94,126,249,101, 84, 86, 86, 66,161, 80, 32, 45, 45, 13,201,201,201,184,
+252,242,203,157, 4,226, 56, 14, 42,149, 10, 74,165, 18, 10,133, 34, 98,228,143,132, 21, 53, 26,141,136,139,139, 67, 65, 65, 1,
+ 18, 19, 19,157, 65,186, 60, 88, 87, 42,149, 93, 72,228,141,228,177,206, 2, 25, 12, 6,232,116, 58,228,231,231, 35, 41, 41,169,
+ 11,185, 37,121, 57,142,115,202,239,169, 23, 32,228, 15, 49, 6, 48, 24, 12,208,106,181, 78, 2,185,103,122,104,154,118, 42, 1,
+199,113,206,215,193,102,123,188, 29, 11, 23, 90,173, 22,185,185,185,224,121,222, 25,155,200,255,211, 52, 13,134, 97,160, 84, 42,
+157,255, 61,245, 0,161, 6,194,225, 34, 62, 62, 30, 35, 71,142,116,202,239, 45,243,227, 78,126,226,246, 68, 72, 1, 36, 2,185,
+143,146,202, 9,164, 80, 40,156,196, 97, 89,214,133, 64,225,186, 68, 97, 95, 80,167,139, 35,138,162, 71,242, 75,191, 39,183,252,
+145,138, 5, 34, 33,191,100,221, 29, 14,135, 95,210, 70,146,252,146, 59,120,201, 43,128,100,221, 5, 65,232,114, 99, 37,162, 23,
+190,254,111,148,254, 82, 15, 94,166, 36,193,224,240,142,229, 81, 75,131,202,111,164,164, 4,242,205,125, 0, 44, 24,203, 31,139,
+ 64,216, 83, 93,143,175,236,142, 39,242, 7, 18, 23,248,250,204, 37,175, 0,242, 27,224,126,147,105,154,198,115, 15,206, 64,147,
+190, 29,207,191,245, 45,202,142,214, 59,191,187,235,141, 5,208,105, 93,211,139, 45,134,118,156,168,253, 21,155,182,239,197, 79,
+229,181, 62, 83,166,145,128,220,149,138,116,138,211, 95,250, 51, 82,215, 16, 72, 86, 39, 20, 98, 19,242,119, 5,237,141, 64,146,
+117,145, 54, 41,224,149,222, 79, 79,141,199,252,223,143,115,109, 96, 15, 22, 53, 53, 41, 14,227,174,248, 29, 54,253,109, 14, 38,
+140, 30,236,115,192, 41, 18, 49, 64, 36, 71,117,131, 33,127,180,138,225, 98, 69,254, 75, 53, 22,240,170, 0,129,248,238, 3, 51,
+ 82, 92, 27, 89,225,221,151, 86, 48, 12, 22,220, 89,224,243, 55, 34,133, 72,145, 63,208,244,104,180, 10,226, 8,249,187,193, 5,
+242, 22, 52,122, 82, 4,157, 86,213,165, 7,240,165, 64, 35,135,246,195, 53,185, 3,163, 74,126, 95,242, 71, 82, 49,162, 85, 7,
+228,238,215,135, 67,254, 64,227, 8,146, 5, 10,210,133,240,102,241,252, 5,149, 52, 77,227,237,149,127,140, 58,249,253,109,209,
+ 80,140,104,129,144,191, 27,122, 0,247, 32, 50,208,129, 43,134, 9, 60,237, 25, 13,242,123,147, 63,218,177, 0, 33,255,111, 44,
+ 6, 8,117,224,138,241,240,217,199, 86,111,143, 41,249,163,225,242,196,154,252,242, 44, 28, 33,127, 15,137, 1, 2, 25,184,162,
+ 25,215, 24,192, 98,115, 96,119,105,101,204,200,239, 46,127, 52,253,253,104, 90,254, 72, 4,179,132,252, 17,140, 1, 2,173,223,
+151,210,160, 14, 94, 64, 67,163, 1,111,124,188, 7,237, 86,123,204,201, 47, 87,128,104, 5,194,177, 36, 62, 33,127, 55,198, 0,
+193,148, 48,143,188,245, 57,159,164,140, 54,249,131,201, 2,117,231, 67, 47,129,248,253,132,252,221,220, 3, 4,146, 6,117, 39,
+195,145, 79,159, 4, 69, 81,224, 5, 17, 13,141, 6,188,246,225, 15,216,254,117, 89, 76,201, 31, 72, 38,168, 59,107,125, 66, 85,
+ 8, 66,254, 24, 5,193,129, 90,126, 79,132,144,142,177, 74, 5, 6,244, 77,193,138, 7,110,132,154, 83, 18,242, 19,242, 95,124,
+ 10, 16, 74,253,190,251, 49,173,154,195,228,107,134,197,252,162, 8,249, 9,249, 35, 22, 4, 7,147, 6,245,244,189, 13,203,239,
+234,118,242,135,227,239, 19,242, 95,162,105,208, 80,234,247,163, 61, 75, 90, 40, 74, 16,142,213,239,206,107, 32, 15,184,119, 99,
+ 15, 16,234, 35,140, 61,129,252,222, 20,152,144,159, 32,164, 24, 32, 24, 23,136,144, 63,194,214,137,144, 63,246, 10, 16, 12,249,
+ 77,102,171,203,119,221, 95,119,219, 69, 93,196,228,151, 72, 77,200,223,205, 61, 64, 32,254,255,201,186, 70,151,239, 85,214,156,
+239,246, 11, 10,181,182,159, 88,126,162, 0, 30, 45,168, 55,242,215,157,107,193, 11,111,127,227,242,189,213,111,126,137, 19,181,
+ 61, 79, 9, 2, 33,126, 79, 33,191, 55, 98, 19,242,199, 48, 8,246, 71,254,187, 30,223,132, 3, 71, 79,119, 57, 89,201,225,106,
+ 92,127,223, 63, 48,236,119,233,216,250,252,189, 72, 73,140,235,209, 89, 32, 66,126, 2, 69, 32, 46,144,251,235, 15,214,207,239,
+ 17, 1, 47, 33, 63, 65, 84,122, 0,127, 83,133,244, 84,242, 7, 18, 4,199,186, 48, 47, 18,138, 64,200,223, 13, 65,240,197, 74,
+254, 64, 31,137, 36,228, 39,240,168, 0, 23, 51,249, 3, 81, 2, 66,126,130,176, 98,128,158, 14,155,205,134, 19, 39, 78,120,244,
+243,163, 77,126,165, 82, 25,246, 57, 28, 14, 7, 42, 43, 43, 61, 42, 64,180,193,178, 44, 81, 0,187,221,142,170,170,170,110, 9,
+ 22,195, 37, 16,199,113, 13, 19, 38, 76, 72,235,206, 6,229, 56,174, 33,212,239,170,213,106,107, 94, 94, 94,183,174,211,171, 86,
+171,173,151,146, 2, 80,242,149, 30,199,143, 31,127,206,106,181,118, 59,129,246,236,217,147, 14, 2,130, 88, 43, 0, 1,193, 37,
+ 31, 4, 19, 16, 16, 5, 32, 32, 32, 10, 64, 64, 64, 20,128,128,128, 40, 0, 1,193,111, 21, 65,141,180,116,174, 35,188, 11,192,
+136,104, 9,196,178,108, 67, 81, 81, 81, 84,210,160, 68,126, 34,127,200, 10, 32, 45,162,221,185,142, 48, 74, 75, 75,209,175, 95,
+ 63,112, 28,231, 92, 42,213,125,192, 44,216,253,246,246,118, 76,157, 58, 53, 45,138,141,255, 93,231, 66,218, 23,173,252, 82,251,
+151,148,148, 32, 35, 35,163,139,252,222,228,243,244,252,182,251,251, 70,163, 17, 51,102,204,184,164,218, 95, 17,140,240,107,215,
+174,229, 38, 78,156, 56, 16, 0, 74, 75, 75, 97,181, 90,145,144,144,224, 92, 58,201,223,116,232,254,142,157, 60,121, 18,209,108,
+252,181,107,215,114, 5, 5, 5, 23,173,252,107,214,172,113,182,255,254,253,251, 49,124,248,112,196,199,199,123,148, 63,148,233,
+ 96, 78,157, 58,117,201,181,191, 34, 24,225, 39, 77,154, 52,208,249, 69,133, 2,242, 65,180, 64, 4,140,197, 42,139,191, 85,249,
+ 87,173, 90,197, 77,158, 60,217, 41, 63,195, 48,206,165,108, 35, 53, 23, 82,180,201,223, 19,219, 95, 17,160,229, 81, 77,154, 52,
+ 41,203, 37,122,238, 44, 44,115, 95,138, 52,220, 21,215,163,100, 57, 47,106,249, 87,173, 90,165,154, 58,117,106, 23,249,221, 93,
+129, 64, 31, 2,138,213,196,191, 23, 67,251,211,129, 8, 63,121,242,228,172, 46,154,211,233,183, 5,210,248,193,116,103,209,104,
+252,139, 89,126, 79,228,151,122,128, 64,229,239,142, 89,240, 46,150,246, 87,132, 34,188,252, 2, 34, 41,124,164,110,192,111, 69,
+126,111,228,247, 68,160, 72,144, 63, 82,229,226,129,180,255,206,157, 59,145,144,144, 0,149, 74, 5,133, 66,225,210,163,185, 43,
+134,167,160, 93,146,119,241,226,197,145, 85, 0, 55,159, 45,203,219, 23,149, 74,165,199,168, 61, 92, 82, 69,216,231,188,104,229,
+ 95,181,106, 21,231,141,252,114,249, 61, 17, 38,148, 89, 49, 34, 21,195, 4,218,254,119,220,113, 7,250,245,235,135,248,248,120,
+176, 44, 11,165, 82,233,236,213, 98,217,254,138, 64, 2, 22, 0,176, 90,173,168,169,169, 65, 77, 77, 13, 90, 90, 90,160, 82,169,
+186, 8, 28,174,240,225,222, 0,127,242, 87, 87, 87,163,182,182,214, 69,254,243,231,207, 59, 23, 3,239,223,191,191, 95, 57,171,
+170,170,156,190,235,101,151, 93, 22, 21,249,215,172, 89,227, 18,240, 74,242,159, 58,117, 10, 53, 53, 53,104,108,108,132, 90,173,
+ 14,104,174,163, 96,123,134,104,181,191,201,100,194,193,131, 7, 81, 86, 86,134, 35, 71,142,160,173,173, 13, 90,173,214,101, 1,
+246, 64, 45,191,252, 1,167, 37, 75,150, 68, 78, 1, 4, 65,216,213,153,167, 29, 40, 8, 2,234,235,235, 81, 81, 81,129, 99,199,
+142,161,169,169, 9,113,113,113, 72, 73, 73, 65, 66, 66, 2,226,227,227,157, 66, 7,154,126,139,118, 22, 37, 20,249, 75, 75, 75,
+113,219,109,183,225,179,207, 62,115, 90, 85, 79,126,165,244,126, 81, 81, 17,238,185,231, 30,108,222,188, 25, 57, 57, 57, 17,151,
+191, 51,207, 63, 80, 16, 4,212,213,213,225,232,209,163,168,168,168, 64, 99, 99, 35,226,226,226,144,148,148,132,164,164, 36,104,
+181, 90,159, 6, 40,214,228, 15,166,253,103,204,152,129,164,164, 36,232,116, 58,104, 52, 26,231, 88,128, 55, 62,197, 50, 11, 52,
+ 34, 39, 39, 7, 27, 55,110,196,137, 19, 39,192, 48, 12,122,247,238,141,212,212, 84,244,237,219, 23, 44,203, 66,161, 80,128,227,
+ 56,167,239, 38,247,165, 35,177, 16, 93,152, 8, 90,254,178,178, 50, 28, 56,112, 0, 20, 69, 33, 61, 61,221,171,245,145,182,189,
+123,247,162,168,168, 8,162, 40,226,190,251,238,139,138,252, 47,191,252, 50, 42, 43, 43, 65,211,180, 83,254, 17, 35, 70, 56,173,
+ 37,199,113, 80,171,213,206,215, 61,104,213, 75,175,237,191,103,207, 30, 80, 20,229, 92, 8, 92,161, 80, 56,221, 30,121, 12, 16,
+136,229,151,247, 0, 75,151, 46, 13,171,253,187,196, 0, 38,147, 9, 58,157, 14, 19, 39, 78, 68, 98, 98,162,139,127, 44,117,185,
+ 74,165, 18, 74,165, 18, 28,199,129,166,105,231,178,158,145,112,135,194, 69,176,242,151,148,148, 56, 63,179,111,223, 62,167,123,
+ 35,109,210,107,249,251,210,126, 52,228, 55, 26,141,208,104, 52,200,207,207, 71, 66, 66, 66, 23, 2, 72,132, 97, 89, 22, 44,203,
+ 58,219, 62,208, 65,164,104,199, 48,222,218,127,193,130, 5, 93,218, 95,165, 82, 57,247,221,149, 32, 86,252,233,162, 0, 90,173,
+ 22, 35, 71,142, 4,207,243,206, 28,173, 60,119, 43, 17, 94,169, 84, 58, 47,198,211, 40,100,168,238, 80,184, 8, 86,254,170,170,
+ 42,212,213,213,161, 95,191,126, 65,145, 84,167,211, 69, 69,126,141, 70,131,203, 47,191, 28,130, 32,116, 25, 40,146,218, 76,146,
+ 95,110, 61,165, 99,221,189, 24,136,183,246,127,227,141, 55,186,184,147, 18,111,188,101,128,124,197, 3,210,182,108,217,178,200,
+ 42,128,212, 53,201,211,108,158, 86,142,151, 91,126, 79,214,159,231,121,212,215,215,227,244,233,211, 56,119,238, 28, 26, 27, 27,
+209,210,210,130,182,182, 54,172, 91,183, 46,106, 55, 32, 88,249, 1, 56,201, 95, 88, 88, 8,154,166,145,151,151,135,156,156, 28,
+164,164,164,160,169,169, 9,229,229,229, 40, 42, 42,130, 32, 8, 40, 44, 44,132, 78,167,243,154,117,137,132,252, 44,203, 66, 16,
+ 4,175,105, 78,185, 34, 72,251, 99,199,142, 69, 67, 67,199,243,248,233,233,233, 40, 41, 41, 9,169, 52, 34, 90,237,255,240,195,
+ 15, 7,197,159,110,201, 2, 73, 3, 44,210,116, 28,158,186,121,249,107,134, 97, 96, 48, 24, 80, 91, 91,139,179,103,207,226,215,
+ 95,127, 69, 75, 75, 11, 12, 6, 3,204,102, 51, 12, 6, 3,244,122, 61, 90, 91, 91,161,215,235,157,251,235,215,175,143,218, 32,
+ 76,176,242,187,143, 78,206,155, 55, 15,153,153,153,206,247,250,244,233,131, 62,125,250, 96,240,224,193,216,186,117,171,203,231,
+163, 33,191,228, 31, 75,238,150,175,153,186, 37, 34,181,182,182, 34, 43, 43, 11, 21, 21, 21, 0,128, 25, 51,102,192, 96, 48, 32,
+ 57, 57, 57,230, 99, 0,222,218,127,195,134, 13, 30, 19, 11,238,214,125,209,162, 69, 49, 93,187,185,139, 2, 72,141, 42, 31,110,
+247, 37,200,179,207, 62,219,133,224,122,189, 30, 70,163, 17,130, 32, 32, 62, 62, 30, 67,134, 12,193,232,209,163,145,157,157,141,
+167,159,126, 58,170, 55, 33, 88,249, 1,160,161,161, 1,105,105,105,200,203,203,115, 33, 63, 69, 81, 78, 55, 36, 51, 51, 19,121,
+121,121, 0, 58,170, 14,213,106,117, 84,228,151,206,227,137,252,130, 32,224,209, 71, 31,197,153, 51,103,240,204, 51,207, 96,196,
+136, 17,160,105, 26,122,189, 30,227,198,141,195,233,211,167,157,189, 65,107,107, 43, 82, 82, 82, 64, 81, 20,126,249,229, 23, 44,
+ 90,180, 8, 3, 6, 12,192,107,175,189,230, 50, 6, 18,233, 76,144,183,246,127,244,209, 71,163, 50,240, 24,110,251,251, 92, 35,
+ 44, 16, 65,222,125,247, 93,208, 52,141,254,253,251, 99,200,144, 33, 24, 63,126, 60,134, 12, 25,130,236,236,108,100,103,103, 59,
+ 51, 43,210,119,188, 41, 64, 36, 39,173, 10, 54,245,151,150,214, 81, 65,155,147,147,227,114, 14,119, 72,199,213,106,181,199, 2,
+174, 72,201,238,109,116,247,177,199, 30,195,232,209,163,241,204, 51,207, 96,233,210,165, 72, 79, 79,199,220,185,115,241,254,251,
+239, 99,236,216,177, 48,153, 76,160,105, 26, 57, 57, 57,216,188,121, 51,230,206,157,139,109,219,182,129,231,121,108,221,186, 21,
+159,124,242, 9, 22, 44, 88,128, 55,223,124, 51,170,165, 28, 20, 69,225,240,225,195, 80, 40, 20,184,252,242,203, 35, 90,236, 22,
+105,227,233,119,165,248, 64,162,238,211,167, 79, 67,165, 82, 5, 76,184,104, 79, 87, 24,172,252, 18, 82, 82, 82,156,251,238, 1,
+180,251,113,247,152, 34,146,240,214,142,146,229, 23, 4, 1,155, 54,109,194,127,254,243, 31,172, 88,177, 2,243,231,207,199,204,
+153, 51,113,224,192, 1,208, 52,141,155,110,186, 9,241,241,241,120,231,157,119,176, 96,193, 2,164,166,166,162,173,173, 13,179,
+103,207,198,206,157, 59,163, 94,202, 65,211, 52, 56,142,195,176, 97,195,160, 80, 40,192,243,124,196,210,228,145, 54,158, 62, 87,
+138, 15, 52,107,227,141,252,222, 26, 56,154,228, 15, 69,254,166,166, 38,103,192,219,167, 79, 31,175,231,110,106,106, 2,208, 49,
+253, 34,203,178, 81,155,107,212,155, 2,255,253,239,127,199,146, 37, 75,240,230,155,111, 98,207,158, 61,200,205,205,197,167,159,
+126,138, 51,103,206,160,164,164, 4, 22,139, 5, 42,149, 10,229,229,229, 24, 62,124, 56,198,140, 25,131,134,134, 6, 28, 61,122,
+ 20, 67,135, 14,197,147, 79, 62,233, 76, 64, 68, 43, 11, 39,157, 39, 39, 39,199,133,252, 47,190,248,162,139, 81, 9,118,212,215,
+219,177,167,158,122, 42,188,152, 43, 16, 2,249, 11, 60,130, 77,115, 70,179,126, 62, 20,249, 37,203, 94, 94, 94,238, 84, 0,249,
+ 57,164, 56,160,188,188, 28,192,133, 57, 52,163, 65,126, 95,237,154,147,147,131,126,253,250,225,219,111,191,197,168, 81,163,112,
+248,240, 97,148,151,151,163,162,162, 2, 95,127,253,181,115,240,105,244,232,209,152, 59,119, 46,134, 14, 29,138,182,182, 54,164,
+164,164,224,244,233,211,136,139,139,195,200,145, 35,163, 58, 14, 32, 63,143,220,242,187,199, 0,225,150,204, 68,138, 63,138, 96,
+253, 80, 79,214, 59,216, 72, 61,218, 19,237, 6, 43,191,132,162,162, 34, 12, 30, 60, 24,153,153,153,112,159, 49,175,166,166, 6,
+ 69, 69, 69,136, 54,252,185,138,119,222,121, 39, 10, 11, 11,177, 99,199, 14,148,151,151, 99,199,142, 29,216,189,123, 55,150, 47,
+ 95,142,113,227,198, 1, 0,138,139,139,177,112,225, 66, 60,242,200, 35,152, 53,107, 22, 88,150,197,178,101,203,240,224,131, 15,
+198,164, 28,218, 83,251,191,240,194, 11, 93,122,128,112, 44,191,180,191, 98,197,138,232, 41, 64, 32,218, 25,168,171,225,237,153,
+213,104, 42, 64,160,242, 75, 55, 70, 16, 4,108,221,186,213,231, 56,128,183,248, 32, 90, 10, 44,245, 64, 6,131, 1, 45, 45, 45,
+216,182,109, 27,230,207,159,143,179,103,207,162,162,162, 2,187,119,239,198,247,223,127,143,196,196, 68,231,231, 51, 51, 51, 49,
+125,250,116,228,231,231,163,160,160, 0,105,105,105,152, 54,109, 26,222,121,231, 29,204,159, 63, 31,169,169,169, 72, 74, 74,138,
+218,179, 12,158,218,255,177,199, 30,139,152,191, 31, 73, 89, 21,225,100, 80,130,125, 32, 35, 22,115,243,135, 42,191, 52, 16, 22,
+204, 13,142,149, 2,228,229,229, 33, 43, 43, 11, 99,199,142, 69,126,126, 62,102,206,156,137,146,146, 18,236,218,181, 11,203,151,
+ 47,119, 33,191,180, 37, 36, 36, 96,197,138, 21,216,182,109, 27,150, 45, 91,134,169, 83,167,226,220,185,115,120,225,133, 23,112,
+224,192, 1, 52, 54, 54,226,212,169, 83, 81,115,129,220,183,245,235,215,187, 60,253, 21,142,229,151,255, 86, 84,122,128, 96,179,
+ 40,221,161,185,209,200, 2,245, 4,120,114, 21,207,157, 59,135,138,138, 10,212,213,213,193,100, 50,225,208,161, 67,176,219,237,
+168,172,172,196,184,113,227,188,182,121, 94, 94, 30, 94,121,229, 21,172, 94,189, 26,245,245,245,184,245,214, 91,193,113, 28,180,
+ 90, 45,122,247,238, 29, 53, 23,200, 83,251, 63,254,248,227, 61,202,242, 71, 52, 11,212,147,200, 31,138,252,102,179, 25, 26,141,
+ 38,224, 82, 8, 65, 16,162,218,155,121, 35,165,124,244, 87,173, 86, 59, 71,178,125,181,189,188,196,216, 93,230,104,142,193,184,
+203,181,110,221, 58,143, 61, 92, 40,150, 63,234, 61, 64, 48, 3, 23,254,110, 64,119,173, 44, 19,140,252, 26,141, 38,168, 82,136,
+104,147,223,189, 93,211,211,211, 49,125,250,116,140, 27, 55, 14, 57, 57, 57,184,233,166,155,112,226,196, 9,140, 25, 51, 6,197,
+197,197,200,204,204,244,120,109,251,246,237,195,172, 89,179,208,222,222, 14,173, 86,139, 45, 91,182,160,178,178, 18,135, 15, 31,
+ 70, 70, 70, 70, 84,221, 82,119, 89, 22, 45, 90,212,173, 79,170,133, 60, 18,236, 47,144,244,149, 6, 61,120,240, 32,182,111,223,
+142, 51,103,206,160,166,166, 6,201,201,201, 61,138,252,238, 13, 43, 47,133,144, 7,200,238,165, 16,177,144, 95,126, 29, 37, 37,
+ 37, 48, 24, 12,104,109,109,197,219,111,191, 13,150,101, 49,126,252,120,204,155, 55, 15,127,253,235, 95, 49,125,250,116,103,233,
+180,116,109, 70,163, 17,133,133,133,216,191,127, 63,172, 86, 43,118,238,220,137,214,214, 86,172, 88,177, 2, 41, 41, 41, 72, 78,
+ 78,142, 42,249,139,139,139,193, 48, 12,198,142, 29, 11, 0, 88,179,102,141,215, 94, 34, 88,203, 31,213, 30, 32,216, 28,173, 39,
+ 5, 16, 4, 1,111,189,245, 22,244,122, 61,180, 90, 45,218,219,219, 81, 91, 91,235,172,183,239, 41,228,151,228,151,106,123,228,
+165, 16, 18,241,229,227, 0,210,241,104,186, 64,222,220,183,228,228,100,164,166,166, 98,206,156, 57, 88,178,100, 9,102,205,154,
+133,236,236,108, 44, 90,180, 8,249,249,249, 88,177, 98, 5,242,242,242, 64, 81, 20,246,237,219,135,194,194, 66,252,243,159,255,
+ 68, 92, 92, 28,204,102, 51,182,108,217,130, 45, 91,182, 32, 59, 59, 59, 38,150,159,101, 89, 12, 29, 58,212, 89,215, 36,127,120,
+ 61,152,146,237,104,195,107, 16,236, 73,176,195,135, 15,227,179,207, 62,195,217,179,103, 81, 83, 83,131,164,164, 36,143, 55,107,
+229,202,149,168,174,174,198,128, 1, 3,160,215,235,209,212,212,132,246,246,118,240, 60,143,244,244,232,175,126, 20,236, 52, 26,
+ 82,109,143,167, 82, 7,249,120,128,116, 60,218,217, 44, 95,114,111,221,186, 21, 15, 62,248, 32,154,155,155,209,220,220,140, 89,
+179,102, 97,194,132, 9,216,182,109, 27, 54,110,220, 8,134, 97, 48,107,214, 44,236,223,191, 31,113,113,113,206, 1,176,185,115,
+231, 98,211,166, 77,120,233,165,151,162, 46, 63, 77,211,184,250,234,171, 93,138,250, 86,175, 94,237,215,226, 7,106,249, 99,214,
+ 3,200,107,251,223,123,239, 61,152,205,102,196,199,199,163,186,186, 26,117,117,117, 40, 46, 46,118, 33,132,116,147, 62,248,224,
+ 3, 40,149, 74, 84, 85, 85,193,108, 54,163,161,161, 1,173,173,173,224,121, 30,119,223,125,119,183,165, 65,253,101,129,228,165,
+ 16,238,228,151,142,199,218,133,147,203,125,228,200, 17,212,213,213, 97,234,212,169, 56,118,236, 24,250,247,239, 15,157, 78, 7,
+149, 74,133, 39,158,120, 2, 43, 87,174, 4, 69, 81, 48,155,205,176,217,108,104,111,111,119,246, 0,183,223,126, 59,110,185,229,
+ 22, 28, 58,116, 8,163, 70,141,138, 73, 18, 66,158,246, 92,178,100,137,223, 88, 44,150,150, 63,224, 24,128,162, 40,252,227, 31,
+255, 64,125,125,189, 79,139, 46, 23, 94,167,211, 57,171, 1,121,158,135,221,110,135, 40,138,120,242,201, 39,177,108,217,178,110,
+ 25, 11,240,149, 5,146,106,123,228,165, 16,158,226, 0,169, 20, 34,218, 46,144, 55,185, 23, 47, 94,140, 55,223,124, 19, 6,131,
+ 1,131, 7, 15,198,151, 95,126,137, 87, 95,125, 21,247,222,123, 47,102,204,152,129,250,250,122,103,134,104,231,206,157,206,138,
+208,219,111,191, 29, 10,133, 2,133,133,133,120,232,161,135,240,195, 15, 63,196,188,253, 87,175, 94,237,181, 22, 40, 88,203, 31,
+245, 44,144,187,240,219,183,111, 7,203,178, 30, 45,250,156, 57,115,186,104,238,187,239,190,139,133, 11, 23,162,182,182, 22,113,
+113,113, 72, 78, 78,198,210,165, 75,113,245,213, 87,119,171, 5,245,102,121,164,218,158, 64, 75, 33, 98,229, 2,185,203,221,191,
+127,127,124,250,233,167,152, 57,115, 38,238,191,255,126, 12, 26, 52, 8, 27, 54,108,192,214,173, 91,209,212,212,132, 59,238,184,
+ 3, 20, 69, 97,243,230,205,104,109,109,197,150, 45, 91,176,105,211, 38,220,114,203, 45, 40, 44, 44,196,215, 95,127,237,146,225,
+138,101,251, 47, 93,186,180, 71, 89,254,160,130,224,184,184, 56,252,242,203, 47, 93, 44,250,178,101,203, 92,158,201,148, 48,104,
+208, 32,124,242,201, 39,221, 58,144, 20,108, 29,144,100,217, 3, 41,133,136,197, 53,120,146,253,181,215, 94,195, 3, 15, 60,128,
+207, 62,251, 12,235,214,173,195, 21, 87, 92, 1,138,162, 48,127,254,124,172, 91,183,206,169,200,149,149,149, 88,177, 98, 5,178,
+179,179,177, 97,195, 6, 28, 60,120, 16, 15, 61,244, 16, 50, 51, 51,177,101,203,150,110,105,255,231,159,127,222,111, 53,104, 40,
+191, 21,181, 30, 64, 46,252, 91,111,189,133, 39,158,120,194, 25, 80,201, 45,122, 79, 28, 81, 13,118, 26, 22,201,165, 9,180, 20,
+ 34,218, 46,144, 55,217,149, 74, 37, 54,109,218,212,229,120,106,106, 42, 14, 30, 60,232, 28,207,248,249,231,159,145,146,146,226,
+252,220,168, 81,163,162,238,246,248,187,134, 39,158,120,162, 71,142,200, 7,148, 5, 26, 52,104, 16, 62,252,240,195,139,166,156,
+ 32,216, 44, 80,176,100,238,142, 44,144, 47,242, 36, 37, 37,161,169,169, 9,189,122,245, 2, 0,100,100,100, 56, 31,135,236, 41,
+237,255,220,115,207,121, 29, 3,136,165,197, 15, 41, 11,116, 49,214,210,132, 34,127,160,165, 16, 61, 73,126,233,125,121, 97, 91,
+119,141,190,251,146,127,249,242,229, 61,146, 63, 1, 5,193,209,122,122,168,187,131, 96,119,151, 38,208, 82,136, 88,215, 2, 5,
+ 90, 54,208,221,228,191, 24,249, 67, 95,234,228,151,187, 52,238,165, 16,242,207,201, 75, 33, 98,233, 2, 5, 50, 1,238,165, 74,
+254,167,159,126, 26, 14,135, 35,122, 61,192,197, 70,254,112,229, 15,180, 20,162, 39,100,177,122, 34,249, 99,205,159,112,159, 7,
+246,216, 3,248,203, 68, 92, 12, 8, 86,126, 41,189, 25,104, 41, 68,180,211,161, 23, 51,249, 47, 54,254,116,233, 1,236,118, 59,
+170,170,170,188,206,224, 21, 77, 40,149,202,176,207, 17,138,252,146, 75,227, 62, 43,132,148,183,150,148, 64, 42,133,144, 62,127,
+252,248,241,136,203,223,214,214,134,147, 39, 79, 6, 52,147, 70,164,137,213, 93,237,223,157,252,161,228, 22,110,252,248,241,231,
+172, 86,107, 90,119,106, 36,199,113, 13,123,246,236, 9,169, 98,238, 98,151, 63, 47, 47,239,156,205,102, 35,237, 31, 67,249, 41,
+247, 33,127, 2,130, 75, 9, 52,105, 2, 2,162, 0, 4, 4, 68, 1, 8, 8,136, 2, 16, 16, 16, 5, 32, 32,184, 84,160, 32, 77,
+ 64, 16, 43,116,174, 35,188, 11,192,136,104,253, 6,203,178, 13, 69, 69, 69,233, 68, 1, 8,122, 34,249,191,235, 92, 7, 25,165,
+165,165,200,200,200,112, 89,112, 93, 94, 99,229, 62, 33,152,251,190,167,105, 18,205,102, 51,166, 77,155, 22,212, 56, 4, 81, 0,
+130,152,145,127,237,218,181,220,196,137, 19, 7, 2, 64,105,105, 41, 44, 22, 11,226,227,227,157,139,100, 7, 82,248,231,235,248,
+169, 83,167,130,119,129,180, 90,117,161,213,106, 91,198,243, 66, 64,202, 64, 81,148, 77, 20,197, 66, 81, 20, 87,246,132,198,213,
+106,181,163,173, 86,235, 40,158,231, 3,141,103, 4, 0,165,162, 40, 30, 36,242,199,142,252,107,214,172,225, 38, 77,154, 52,208,
+ 25,124,210,180, 75, 77, 85,119,205, 26, 77, 91,173,182,101, 21, 71, 15, 43,236, 54, 51, 2,217, 78, 28, 63,102, 7,240, 84, 79,
+105, 96,171,213, 58,234,216,209,159,105,155,173, 13,129,108,149,149,149, 2,128,209, 68,254,216,145,127,245,234,213,170,201,147,
+ 39, 15,148, 31,147,175,208, 25,238,242, 73,225, 20, 3, 42,120, 94, 80,100,102, 13, 68,123, 91, 51, 4,158,239,124,251, 66,121,
+132,123,161, 68,159,244,228,115, 0, 6,245,148, 70,230,121,158, 30,144,149, 5,171,185, 5,188,157,247,251,249,140,244, 20, 51,
+128,120, 34,127,236,200, 63,101,202,148, 44,247,227,242,181,129, 35,185,118, 88,200, 89, 32,158,119, 64, 16,188, 60, 92, 32,211,
+ 2, 65, 20,248,158,216,224,188,157,135, 0,187,119,167,225,194,117,138, 68,254,238, 37, 63, 0,231, 10,247, 82, 15, 16,169,133,
+243,130,118,129, 92, 8, 46,202, 55,209,185, 88,179,203,159, 40, 40, 0, 88, 40,138,202,232,113, 45, 47,184,110,188,180,225,194,
+ 6, 70,160, 0,240, 20, 69,105,137,252,209,245,249,189,145, 31, 0, 56,142,243,152,201, 9,228, 41,184,136,175, 20,111,104,109,
+ 64,217,222,143,209,110,110,237,208, 5, 81,102,244,157,251, 29, 59, 12,163,232,181,112,225, 35,150,245,235, 95,170, 81, 40,152,
+ 46, 61,132, 8, 80, 93,220, 40, 17, 93, 36, 19, 69,209,229, 61,134,166, 29,156, 74,241,108, 91,155,181, 48,216,139,208,183,156,
+ 71, 89,209,246, 14, 55,194, 15,193, 40,134, 81, 47, 92,248, 48,191,126,253,134,255, 39,173,104,238,197, 38,203,172, 46,252,182,
+ 44,195, 48, 2,199,209, 7,218,218,108, 63, 93,106,242,123,202,246,200, 3,222,206, 88, 7,213,213,213,168,173,173, 69,115,115,
+ 51, 84, 42,149, 71, 34,119,203, 66,217, 12, 67, 65,171, 85,129,161, 53, 78,162,139,157,204,117,233, 32, 58, 94,235,230,255,113,
+ 22, 30,127,228, 1,240, 98, 71,223, 76,137,148,143,124,173,139,138,119,252,115,211,122, 0,168,169,169, 81, 92, 61,118,234, 50,
+ 0, 65, 43,128,146,166,161,211,169,160,100, 52,174, 94, 3,207,123,162,132,242,191,255, 56, 27,143, 63,242, 23,240,146,111, 33,
+ 56,149,208, 75, 23, 41,177,196, 35,117, 0, 0,181,181,167,232, 49, 99,175, 29, 5,224,167, 75, 77,126,167,204,130,176,107,253,
+250,245,108, 65, 65,193, 64, 65, 16, 80, 95, 95,143,163, 71,143,226,216,177, 99,104,108,108, 68,124,124, 60,146,147,147,145,144,
+144, 0,157, 78,231, 18, 7, 68, 34, 22, 8, 41, 8, 6, 0,135, 67,128,222, 96,134,185,205,212,225,250,200, 76,183,232, 18, 7,
+116,188, 58, 80,252, 37, 56,117, 28,104,154,113,237, 33,220,194,103,151, 71, 13, 68, 23,235, 47,239, 29, 0,136,104,105,213, 67,
+ 16,132,144,198, 37,236,130, 0,189,222, 12,179,217, 8,240,240, 97, 69, 59,152, 82, 86,242, 37, 84,170, 78,249, 93, 93,108, 23,
+186,241,130, 95,227,234, 68,139, 94,143, 32, 82,153,191, 41,249,101, 24,145,147,147,131,141, 27, 55,162,178,178, 18, 12,195, 32,
+ 45, 45, 13, 41, 41, 41,232,219,183, 47, 88,150,133, 66,161, 0,203,178, 80,169, 84, 80, 40, 20,206, 88, 32, 82,129,112, 72, 10,
+ 64, 51, 20,180, 90, 14, 12,165,242, 72, 78,207,251, 14,160, 51,104,147,247, 16,148,236,187,148,139, 27, 36,202,222,239, 84, 16,
+ 0, 84,231,121, 41,209, 22,114,171, 51, 52,160,137,227, 64,211, 26, 64,150, 91, 22,186,220,116, 94,118,255,237, 78,249,105, 15,
+ 95, 16, 0, 48, 46,209,103, 23,199,194,141,155,214, 75, 86,126, 57,140, 70, 35,226,226,226, 80, 80, 80,128,196,196, 68,103,206,
+ 95,250, 47,205,112,199,178, 44, 56,142, 3,195, 48,224, 13,191,162,242,229, 63,194, 84,127, 2,234,212, 62,232,115,221,253,232,
+123,221,159, 98,151, 5,226, 29, 2, 12,134, 54,152, 77, 38,167, 29,119,181,222,162, 71,203, 46, 87, 10,207,150,221,165,227,112,
+ 59,175,235,111, 24, 77,237, 97,101, 80,140,122, 19,204, 38, 83,231, 45,231,187, 88, 60,127, 86,181,163, 11,247, 98, 44,121, 31,
+166,211,121,227, 45,151,172,252,114,104,181, 90,228,230,230,130,239,116,223,220, 75, 23,104,154, 6,195, 48, 80, 42,149,206,255,
+245,223,191,139,120,241, 87, 76,248,195, 52,152,205, 54, 28,248,250,101,180, 85, 31, 68,246,127,189, 8,202,205, 77,138,116, 22,
+168,179, 7,160,161, 85,115,160, 68,149, 71,114,250,238, 21,124, 17,219,237, 60,178,232,218, 61,198,176,217,194,152,223, 69,201,
+ 64,163,225, 0,112, 30, 83,135,130, 7, 75,232,219, 26,194,179, 21,134,224,193,146, 74, 65,158,253,210,149,223, 45,189,201,178,
+172,199,137,112,229,164,101, 24,198, 89,254,208,123,220, 45, 56,242,239,183,208,124,166, 30,189, 47, 27,141,252,153,105, 56,244,
+ 99, 41, 14, 61, 61, 3,151, 47,254, 8, 92, 66,106, 80,235, 80,135,208, 3,240,208, 27,219,209,102, 50,249, 32,185,220,154,123,
+ 39, 54,220,131,103,209, 67,108, 32, 63, 79,231,126,155, 57,244, 30, 64,176,243,157, 62,180,201,171, 37,116,181,134,188,255,116,
+164,243,159, 16,208,121, 44, 22,235, 37, 43,191,187, 2, 72,217, 41,249, 2, 25,238,171, 86,202,211,157,218,126,195, 48,124,241,
+199, 40, 91,123, 39, 70,216,129,126, 87, 78,192,149,215, 77, 69,213, 79, 37,248,105,201, 4, 92,177,108, 7,226, 6, 92, 22,149,
+ 64, 88, 33,105,166, 70,211,209, 3,136,110,126,203, 5, 87,198,179,245,118,241,239,221, 93, 38,209, 45, 56, 22,157,148,151,157,
+171,227,188,118,123,232, 61, 0,205, 48,208,104, 84,174, 22, 20,192,254,210, 74,236, 46, 58, 14,163,217, 10,187,213, 2,179,197,
+ 14,171,213, 14,139,197, 10,171,213, 2,139, 37, 50, 86, 79,150, 74, 4, 69, 81,243, 61, 26,121,165, 82,200,205,205,174, 40, 45,
+ 61,242,227,111, 77,126,247, 92,190,167, 1, 46,209,110,197,233,119,151,192,112,244, 71,240, 86, 43, 68, 81,232,224,137, 32,116,
+236, 3,160,104, 26, 63,255,116, 28, 84, 66, 6,250, 93, 54, 28,131, 70, 95,131,248,228, 36,148, 61, 53, 29,195, 31,252, 39,122,
+ 95, 61,195,239,106,165,161,245, 0, 60, 15,131,193,140, 54, 83,155,171,239, 47, 39,189,232, 94, 30,209, 53, 67, 36,122, 32,182,
+ 63,215, 71,218, 55,182,133,238,131, 10, 60, 15,189,201, 12,179,209,236,242,254,238,162, 10,124,248,225,199, 72, 77,237,214,153,
+ 58, 0, 0,167,170, 79,209,185, 87,140, 29, 6,224,199,223,154,252,158, 6,179,220, 21,224,220, 87,175, 65,107,169,195,149, 55,
+ 95, 15, 5,203,130,162, 21,160, 24, 69,231,127, 6,160, 24,128,162, 59, 54, 5, 7,209, 97, 5,236,102,244,250,221, 80,228, 39,
+245,194,254,215,255,130,182,211, 11, 48,232,247,139,124, 46,178, 17,114, 15,160,213,176,128,168,114, 33,231,129, 67, 39,241,195,
+222, 10,152,219,109,176, 90,237,176,217,236,176,118,110, 29,251, 14, 88,173,118,103,192, 19, 46,104,154, 22, 40,138, 18,189, 52,
+108,187, 40,138,203, 68, 81,124,193, 83,174, 91,167,225, 0, 94,229,102,181,104,164,166,166,162,249,252, 47,176,243,246,110, 37,
+144, 89,223, 8,187,221,238, 49,205,232, 95,254, 10, 8,188,165,199,202,239, 73, 9,228, 10, 64,211, 52, 4, 91, 59, 52, 26, 53,
+ 88, 88, 65,241, 60, 32, 42, 0, 81, 9,208, 10,136, 80, 1,124, 27, 64, 43, 58, 20,193,110,238,224,161, 82, 5, 56,172,208, 38,
+ 38, 96,194, 31,110, 65,233,151,239,192, 84,125, 24, 87, 44,124, 7, 20, 69, 71, 48, 11,196,243, 48,152,204, 48, 25,218, 92, 44,
+251,190,210, 74,188,247,193,118,164,166,164,198,170,157,189, 54,112, 93,125,157, 58,103,248, 85,171, 0,188,224, 49,143,110, 52,
+195,168, 55,187,249,199, 12,120, 0,118,187, 21,118,187,185, 91, 9,228,235,247,125,201, 47,125, 87,250,109,244,155, 0, 0, 15,
+139, 73, 68, 65, 84,176, 91,122,172,252,222, 20, 64, 78,208,180,201,243, 80,189,249, 17, 28, 43,251,218,101, 36,148,102,148,184,
+108,250, 31, 48,160,175, 14, 52, 4, 80,140,162,147, 6, 2, 68,222, 1,128, 2,120, 27,148, 20, 48,118,246,141, 56,240,239,239,
+112,244,159,143,227,242, 5, 47, 70,100,218, 69,103, 15,160, 86,115, 16, 29,156,139,203,194,178, 92,199, 28,249, 13,229,224, 29,
+221,123, 3,172, 70, 19,236, 14,135,210,115, 30,157,134, 70,163, 4,236, 92,103,144,215,225, 83,114, 42,165,223,244,159, 39,180,
+181, 89,152,219,231, 46,186,231,195,119, 87,111,214,106, 85, 62,190, 28,196,121,121, 95,227, 0,222,229,151, 50,255, 60,130,155,
+143,244,127,191,252,177,239,187,239,125, 49,254, 68, 85, 77,142,213, 98,211, 90,109, 14,117, 74,114,252,153,204,254,125,170,102,
+207,158, 92,124,215, 31,174,175, 14, 46, 87, 27, 56,249, 61,109,234,180, 44,228, 44,221,225,236, 17,108, 77,245, 40, 95,119, 23,
+134,142,157,128,140,172, 94, 16,173, 6, 80, 12, 11, 42,121, 16,232,129, 5,160,226, 51, 0,138,134,216, 90, 3,225,196, 55, 16,
+206, 30, 4,218,155, 49,114,210, 68,236,217,177, 19,167,191, 30,133,204,233,247,134, 61,237, 98,103, 15, 32,192,104, 48,195,100,
+108,115,241,203,133,206,224,196, 97,111,135,195,238,158,165,137,109, 81,162,193,208,234,253,222, 8, 2,140,122, 51, 76, 38,147,
+107,114,131,151,229,252,130,112,211,238,156,183,120,222,241,202,154,209,119,206, 91,204,127,246,225,250,205,145,144, 95,240, 65,
+224, 72,202, 95, 87,127, 94,245,167, 7,254,246,199,170, 83,117, 93,214, 66, 61,255,107, 75,214,249, 95, 91,178, 74,202,202,167,
+252,207,251, 95,236, 95,249,212,130,237, 35,134, 15, 49,132, 43,191, 7, 87,214,171, 50,208, 52, 13,227,137,159, 80,249,234,253,
+184,114,230, 77, 72, 74,100, 33,182,253, 10, 40, 84,160, 6, 78, 4,147, 61, 19,148,252,209,200,180, 17,160,123, 15, 7,127,236,
+ 11, 56, 14,109, 3, 99,105,196,152,233, 83,177,251,237, 39, 48,224,218,187, 65, 43,185,240, 93, 14,154,166,160, 81,179,208,104,
+ 56,104, 53, 28,180, 26, 21, 52, 26, 14,106, 21,235, 12,128, 69, 81,232,214, 13,162,224,199,130,118,200,172,235,220, 52, 26, 14,
+ 42,141, 74,118,243, 2,219, 22,175,216, 48,225, 68,213,233,145,162, 40,210, 39,170, 78,143, 92,188, 98,195, 4, 4,241,125,239,
+ 27, 31, 19,249,239, 89,240,244,189,158,200,239,110,168,143, 86,156, 26, 59,111,254,211, 11,143,252, 82, 25, 31,174,252,129,244,
+ 0, 18,249,207,255,248, 17,170,254,249, 23,140,189,229, 54, 36,105,108,128,185,177,227,222,198,247, 3, 53,248,122,240,130,128,
+242,234, 70,124,252,159,227,216,250,101, 57,126,248,185, 14,102,171, 29, 24, 50, 29,162,185, 25,142,159,223, 7,123,182, 8,189,
+250, 15,192,249,178,111,194, 79,219, 58,123, 0, 83, 59, 12, 6,115,215,154, 29, 81,236, 16, 80, 12,174, 11, 22, 35,220, 67,136,
+190, 44,168, 93,128,222,100,134, 73,111,118, 79,175, 72, 85,101, 16, 2,184,129, 95,127,187, 63,253,171, 93,123,103,216,237, 14,
+117,135,223,235, 80,127,181,107,239,140,201,147, 70, 85, 94, 55,229,154,115,209,234,221,252,203, 47, 89, 97,255,215,240,208,159,
+111,223,241,248,146,151,114,120, 94, 80, 14, 30,212,255,167, 27,103,230,255,144, 55,110,196, 25,157, 70,237,216,245, 93,201,128,
+157,159,255,152,127,162,234,244, 85, 0, 96, 48,182,245,190,231,129,191, 61,188,235,243,151,158,139,215,105, 29,145,186, 30,143,
+ 51, 90, 83, 20,170,223, 43, 68,123,101, 17,198,223,114, 51, 88,235,175, 16,237, 14, 80, 52, 3, 80, 60,196,172, 2,240,130,136,
+170, 51,173,248,170,184, 22, 14, 94, 64,217,241,243, 56, 81,223,138,255,186,113, 56,230, 93, 55, 12,226,184, 71,129,202,175, 32,
+154,206,163, 79,223, 43,112,122,215,102,244,185,230,134,240, 21,128,166, 41,168,212, 44,120, 7,235, 82, 10,173, 86,113, 78,242,
+137, 98,164,231,196, 15, 82, 65,124,253, 62, 3,104, 56, 14,130,198, 53, 68,224, 56,213, 5,218,248, 17,191,185,197,168,124,234,
+153, 77,127, 50,181,181,187, 44, 18, 96,106,107, 79,121,234,153, 77,127,186,106,100,206,234,228, 36, 93,200,169, 36, 94, 8, 85,
+254, 78, 5, 14,240, 57,164, 27,174,205, 59,115,160,236,248,219, 0,176,124,241, 31, 75,228,199, 6,221,211,239,232,253,247,220,
+114,116,229,250,119,126,218,242,206,231,255, 37,138, 34,221,210, 98,204, 40,252,251,155, 19,214,175,124,232, 59,223, 62,144, 16,
+ 84, 15, 32, 31, 19, 16,108,237, 40,127,233, 30,232, 88, 1,215, 92, 63, 25,140, 96, 70, 59,155, 14, 7,197, 33,206, 92, 9, 10,
+ 20, 4,109, 31,136, 14, 7,246,254,114, 14,103,154,218, 80, 90,113, 14,166,246,142,230,254,240,187, 74,220,150,159, 5,174,119,
+ 46,104,138,134,216,222,130,132,140,120, 28, 61, 88, 18,153,172, 11,207, 11, 48,153, 44, 48, 24,218,161, 55,154, 97,232,220,120,
+ 94,144, 30,130,137,194, 38, 6,176,185,126,222,215, 56,128,201,108,134,209,104,133,222,104,118,110, 78,210, 8,254,187,248, 57,
+247,174,248, 83,123,187, 37, 94,171, 85, 55,201,207,173,213,170,155,218,219, 45,241,115,238, 93,241,167,142,126, 36,180,205,103,
+ 53,143, 79,249,133, 78,229,241,190, 89,173, 22,250,131,143,119,101, 73,175,151, 47,158, 87,178,124,241,188, 18,111,159, 95,250,
+232,156,178,105,147,175,218, 33,253,254, 55,223, 22,207,180, 90, 45,244,209, 99, 85,186,255,253,170,168,175,167,239,240, 65,246,
+ 0,206, 96,183,229, 44,126, 94,113, 45,210, 83, 53,200, 29,147, 3,198,209,134, 86,189, 5,223,109,126, 13,130,185, 5,160, 24,
+136,188, 13,188,195, 1,158,231, 81,255,171, 17,223, 31, 60,237, 36, 63, 0,168, 88, 6, 16, 5,216,237,118,233, 7,192, 40, 89,
+216,219, 77,145,113,129,104,154,130, 90,165,132,195,198,202, 71,178,160, 86,179, 78,235, 27,249, 30, 32,200, 14,192,135, 2,208,
+ 12, 3, 78,165,132,221,170, 4,112,193,138,106, 52, 23, 44,168,191,177,138,207, 63, 94,253,154,180,127,217,232, 57,175, 75,251,
+165,187, 55, 61,113,193,140,135, 49,222,225,227,171,225,202,191,112,217,203, 83,190,219,125, 96,198,231, 95, 21,237,121,107,227,
+146,127,209, 52,237,183,123,125,250,137,251,190,253,110,119,217, 13, 14, 7,207, 89,172,182,248, 9,215, 63,176,162,221,108,213,
+221,125,215,244,119,166, 79,187,250, 76, 87,249,249,160, 21,192,114,190, 6, 71,158,157,141,220,130,124,164,247,142, 3, 4, 7,
+ 26,206,233,113,232, 63,223, 35,174,223, 80,216,219,244,160, 18, 24,136,150, 54, 8, 77, 39,208, 14, 13,134,244,213,192,253, 86,
+ 79, 25,217, 7, 60,239, 0,234,127,234,240, 4,148, 26,216,236, 34,212,201,105,145, 81,128,142, 30,160, 29, 6,231, 72,100, 71,
+173, 15, 47, 8,178, 71, 35,187, 91, 1, 4,159, 22,212,108,180,194, 40, 27, 73, 21, 58,199, 55, 46,144, 47, 84,249, 35,117,221,
+225,202,239, 37, 63,239,112, 80, 37,101,199,198, 90,109,246,184,146,159,142, 78,189,118,246, 35, 89,175,190,248,248, 27,217,131,
+250,123, 52,143, 13, 13,205,220,252,191,174,158,219,220,108, 72, 19, 69,209,153,110,105,109, 53,245,233,221, 43,241,228, 99, 15,
+221,121, 48,156,118,144,251,253,149,175,255, 25,185, 19,198, 35, 45,145,130,200, 40, 81,115,242, 28,170, 14, 29,193,213, 43,191,
+195,249,226,207,209, 92,249, 21, 82,123, 95, 6, 24,207, 1, 63,172,132,245,250, 55, 49, 54, 59, 9,119, 20,100,226,219, 67, 13,
+176, 57,120,140,187,172, 23,102,143,237, 11,187,221, 14,174,248,197, 14,131,145,152,137,214, 22, 35,146,134,141,139, 92, 15,192,
+169,148,208,216,164,172, 79,135, 18,104,212,172,147,124, 61, 89, 1,104, 0, 74,149, 18,154,206, 60,122,135,187, 42,116,228,214,
+209,225, 70, 32,212,103,249, 35, 52, 7,128, 47, 31,222,183,252,144,185, 34, 93,241,204,115,111,229,181,180, 26,251,116,124, 79,
+ 80,156, 57,219, 56,244,238,251,254,182,112,238, 29,215,126,252,224,253,183, 29,118,255,124, 90, 90,162,117,218,164,209,197,239,
+126,176,235,247, 60, 47, 40,101,169, 75, 71, 65,222,200, 31,189,253, 78, 48, 78,144,164, 0, 14,195,175, 72,238, 55, 30,162,104,
+195,177, 67,199,208,120,190, 21, 99, 86,237,134, 50, 46, 17,253,166,204,197,222,207, 95, 65,214,136, 17,160,235,127,130,162,189,
+ 5,170,162,191,195,120,245, 98,220,154,215, 23,183,230,245,189, 16, 75, 64,128,178,248, 69, 40,107,255, 3,208, 10, 8,125, 70,
+227,248,255,126,143,241, 43, 95,138,140, 2, 56,164, 24, 64,178, 64,157, 10,224,176, 11, 29, 47, 66,200, 2, 69, 56, 4,246,169,
+ 0,118, 1, 48, 27, 45,208,187,100, 81, 4, 72, 46,163, 32,240,221,110,255,125,157,201,183,252,157,143,195,123, 81,160,221, 69,
+135,242,229, 79,210, 49, 12,109,103,149, 10,235, 55,255,249,105,204,237, 55, 77, 60,158,150,150,212,165,204,243,193,249, 55, 31,
+190,126,234, 85,167, 22, 60,242,194,252,115, 13, 45,131, 4, 65, 80, 36, 38,198,157, 93,190,248,238, 34,175,138, 42, 32,232, 30,
+ 32,126, 88, 30,246,255,223, 55,176,155, 77,208, 13,190, 10, 87,254,237, 3, 48,202,142,135,225,149,218, 4,244,159, 49, 31, 85,
+191,252,128, 97, 25, 87,129,175,250, 6,113, 71,222, 2,123,174, 20,166,220,249,176,165,230, 66,160, 24,176, 77,135, 17,247,203,
+219,224,206,238,237, 80,212,126, 99, 80, 87,223,130, 94, 87, 76, 69, 92,198,144, 72,198, 0, 44,236, 54,214,133,153,106, 53,219,
+ 57, 65, 68,247,247, 0,240, 17, 3, 48, 52,160,210, 40, 97,183,187,102, 81, 52, 42,165,108, 80, 41, 68,249,249,200, 92, 55,239,
+115, 36,216,135,252,157, 61,130,167,129,168,245, 47,127,116,133, 94,223,214, 59, 49, 94,123,182,213,208,214,167,147,128,194,191,
+222,123,102,141,148,177,242, 54,128, 53,120, 80, 95,211,151, 59, 86,189,112,223, 3,107,111, 57,116,184,106,252,213, 87, 14,221,
+167, 84,210,162,119,166, 11, 65,247, 0,195,238,127, 25,230,186, 10,176,186,100,168, 82,250,118, 25, 23, 24, 56,235,207,248,254,
+129,215,144,144,156,135, 62, 35,254, 0,254,216, 23, 96, 27,127, 70,242,183,127,241,208, 72, 44,152,193,211,208,226, 72,192,177,
+226,111, 49,101,227,129,136,220, 23, 69, 71, 47, 47,192,100,182,192,104,108,119,177,208, 60, 47,197, 0,242, 32, 84,236, 38,254,
+251, 25, 73, 53, 91,161, 55,185,230,209,237, 18,121,249,192, 7,114, 0,128,101, 21,109, 54,155, 67, 11, 0,159,127, 85,212,239,
+198,235,175,169, 11, 48,158, 13, 41, 10,246, 41,191, 20,191,120,208,160,156,236,204,243,255,179,105,105,225,192,172,244,182,188,
+107, 31, 94,101,177,218,226, 29, 14,158,123,250,217, 45, 83, 94, 92,245,192, 87,254, 36, 98, 0,113,243, 43,143,125,242,209,142,
+221,101,179,103,142,171,245,165,165,124, 8, 65, 48, 77,211,208,101, 14,247, 94,191,207,169,145,191,230, 7,148,254,253, 22,180,
+246, 78,198,208, 43,230,129, 58, 87, 6,209,120, 14,162,241, 44, 32,240,160,226,210, 64,233,250,128, 74,207, 69,245,201,179,168,
+ 62,178, 23,249,171,254, 13, 85,114,122, 68,120, 69, 3, 0, 69, 83, 80,113, 10,168, 85, 44,212, 42, 37, 84, 42, 37,212,156, 18,
+234, 78, 11, 20, 94,250, 50,130,163,193, 94,175,130,134, 70, 73, 67,195,169,160,225,148, 23,182, 78,249,121,240, 46,115,235,248,
+219, 18,226,181,231,165, 83,111,220,180,243,166,157, 95,237,239,231, 50, 55, 79,164,225, 79,126,222,179,156,215, 78, 29,125,102,
+ 72,118,127,163,130, 85, 10,147, 39,142,252, 66, 58,221,191,119, 31,188,121,213,134,143,174,244,118,125,207,174,127,255,234,191,
+173,249,159,107,164,215,183,222, 92, 80,173, 96,149,130,175, 54, 9,133,252,129, 60,203,171, 78,205,192,132,245,123, 33,166, 12,
+195,143, 59,191, 66, 85, 75, 34, 90,146,242,193, 95,245, 32,132,177,143, 66,159,126, 29,106,204,125, 80,244,239, 98, 52,155, 24,
+ 76,121,245,103,196,103, 70,110,193,242, 11, 61, 64,155,197,249, 92,174, 84, 12,103,115, 8,157,175, 34,237, 2,137, 17,237, 1,
+ 96, 23, 96, 50, 91, 97,234,180,160,188,211,130,242, 65, 15,228, 0,192,229, 57,191, 59,240,237,238, 3, 3, 1,160,230,244,249,
+220,165, 79,109,202, 93,250,212, 38,143,159,253,185,232,245,255, 14, 59,154,240, 43, 63,239,215, 5, 89,190,104,206, 15,251,138,
+143, 78,104,105, 53,101,136,162, 72,111,221,246,245,127,239,217,123,164,244,198,235,199,252, 56,185, 32,183,214,108,182, 41,246,
+ 22,151,247,253, 98, 87,201,132,170,147,103, 71, 3, 16, 25, 37,197, 47,126,248,142,210, 72, 71, 67, 65,207,240,160, 80, 34,247,
+129, 13, 48,158,174, 64,211,145, 31, 81,119,112, 23,154,190,221, 6,145,119, 32, 41,251, 42,164,140,186, 14, 35,111,202, 71,210,
+144,200, 79,137,170,112,246, 0,172, 18, 54,149,210,165, 24, 78,163,166,156,227, 0, 82, 16, 28, 27, 7, 72, 12,238, 6, 48, 0,
+167, 84,130,227,220,125,104,249, 99,129,129,219,177,103,159,156,247,205,141,119, 84,141,110,106, 54,100,134,149,224, 15, 52,155,
+ 20,136,252,126,178, 81, 58, 13,235,216,184,254,193,127,204,127,232,197,133, 70,147,185, 55, 0, 84,157, 60,115,213,139,175,238,
+184,234,197, 87,119,120, 52,214, 63,252,120,100,236,226,135,126, 31,160, 2,132, 87, 11,228,239, 89, 94,138,162,144,144,153,131,
+132,204, 28,252,238,134,249, 49,115,173,105,138,162, 4,139,197,138,118,139, 13, 70, 83, 59, 76,166,118,152, 76, 29,189,129, 40,
+116,186, 52,130,195,181, 40, 45,234,155,216,101,115, 56, 28,160, 40,202,147, 22,136, 86,139, 5,102,171, 29, 38,179,165, 99, 51,
+ 89, 96, 50,153, 59, 57,211, 49,130, 24,204,198,178, 52,255,175,119,151,175,154,156,159,251, 73,175,212,132, 83,172, 82,209,230,
+213,120, 7,120, 78,115,199, 51,183, 98, 40,242, 7,154,138, 29, 62,172,191,225,141,151, 30, 92, 51,108, 72,191,125,254,108,213,
+192,204,244, 3,175,191,244,208,166, 64,137,210, 57, 10, 43,134,162, 4,129,144, 63, 22, 43,201,123,236, 1,180, 26,238,215, 99,
+ 21,199,210,122,167,245,133,185,173,217, 89, 11,196,243, 60, 82,210,250,131,119,216, 97,208, 55,203, 92, 17, 49,212,100,141,204,
+190,251, 59,135,216,229,117,101, 85, 61, 84, 42,246,180,251,103,181, 90,149,165,162,162, 82,157,214,187, 15,204,230,102,167,161,
+ 18, 4, 59, 50,122,103,128,183,219,161,215, 55, 6,221, 48, 20, 3,254,153, 39,231,126, 5,192,103, 48,105, 14,228, 97,114,129,
+ 71,117,237, 89,168,213,108, 91,208,242, 11, 60,244,198,150,128,229, 30,152,149,110,216,242,250, 99,155,119,124,190,247,187,255,
+219, 85, 58,166,174,190,113, 80,171,222,148,161, 80, 48,237, 28,167, 52, 13,202, 74, 47,255,253,236,252, 61, 83, 39,229,158, 1,
+ 0,179, 57,176, 7, 93,170,170,206, 66,235, 65,126,127, 10,208,147,201, 15, 0, 10, 21,167, 44,251,120,251,246, 25,127,126,224,
+ 62, 28, 45, 63,216, 81,147, 33,136,176,219,121, 76,155, 49, 5, 45,205,103, 96,148,103, 39,252, 41, 64, 64,254,124,240, 10, 80,
+180,255,168,133,231,133,189,238,159,213,176,108,227,246, 79,182,247, 95,176,224, 62, 84, 84, 28, 4,111,183,195, 46, 0,118,187,
+128,169,211,167,161,165,165, 14,102,115,247, 62,204, 3, 65, 64,209,254, 99,188, 40, 10, 13, 65,201,127,195, 52,232,155,235, 3,
+148,223,181,115,188,110,202,200,234,235,166,140,172, 14, 75,113,101,167,222, 91,122,156,231, 61,200,127, 49,147, 31, 0, 20, 26,
+ 37,253,151,143,183,127,118,252,247,183,221,202,220,117,247,163, 56, 94, 81, 6,158,231,145, 61,108, 20,122,245,234,141, 67, 37,
+159,194,106, 49, 7, 76,111,127, 61,128, 40,138, 65, 43,200,233,250, 70,124,252,233, 30,187,205,230,232,178, 48, 71, 2,165,216,
+243,209,246,207,238,184,237,214,155,169, 59,238,126, 12,149, 21,101,224,121, 59,178,135, 93,137,222,169,105, 56, 84,186, 51,200,
+ 41, 63, 34,159,231,169,175,111,196, 71, 59,246, 8,118,187,163, 52, 40,249,211,250,160,226,224,103,176,154,205, 81,146, 44, 48,
+212,214, 54,226,253,237,187, 61,202, 31,108, 16, 28,206, 68,182,209, 0, 37,138, 34, 6, 12, 72, 93,208,212,104,218,112,215,157,
+179,153, 89, 55,222,128,236, 33,191, 67,155,177, 17, 39, 43, 75, 96,179,154,131, 34, 47, 34,161, 0, 16,193,243, 2,206,157,111,
+197,161, 35,213,237, 59, 62, 47,230,121,193,241,176,195, 33,190,233,233,243,153,153, 41, 57,141,141,230,241,255,239,206, 89,212,
+236, 89, 55, 96,200,160, 65, 48,155, 27, 81, 93, 89, 10,139,165,123,158, 5, 22, 4, 30,103, 27,244, 40, 59,116,202,177,125,231,
+ 94,209,110,183,239, 21, 69,177,194,183,252, 55, 83, 55,207,186, 1,217,217, 89, 48,155, 91, 80, 91, 85, 6,123,132,228,231, 67,
+145,255,108, 11, 14, 28, 58,225,120,239, 95,190,229,151,112,213, 85, 87,137,251,247,239,135,213,106,237, 22,242, 31, 63,126, 28,
+115,230,204, 65,105,105, 41, 21,148, 2, 0, 64, 66, 66,194, 96, 37, 35,188,108,177, 57,174, 48,155,173,189,228,133, 82,221,162,
+153, 20, 4,150, 85,158, 22, 4, 97,175,221,206, 63, 37,138,226,113, 95,159, 79, 73, 73,137,103, 68, 71,190,217,102, 75,105,107,
+179,168, 0, 80,221,108, 92, 68, 53,203,182,137,130,208, 96,113, 56, 74, 69, 81,212,255,150,229,151, 43,128,205,102,235, 22,203,
+ 31,138, 2, 56,107, 72,244,122,253, 9, 0,211,113,145,162,169,169,201, 0,224, 11, 34,127,247,194,102,179,225,196,137, 19, 30,
+253,252,104,187, 61, 74,165, 50,248, 24, 0, 4, 4, 17, 2,199,113, 13, 19, 38, 76, 72,235,110, 25,130,142, 1, 8, 8, 46, 85,
+208,164, 9, 8,136, 2, 16, 16, 92,162,248,255,109, 43,244, 49,100,124,238,122, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+};
diff --git a/source/blender/editors/datafiles/splash.png.c b/source/blender/editors/datafiles/splash.png.c
index de4fcb8f865..f01e1499bca 100644
--- a/source/blender/editors/datafiles/splash.png.c
+++ b/source/blender/editors/datafiles/splash.png.c
@@ -1,6820 +1,5468 @@
/* DataToC output of file <splash_png> */
-int datatoc_splash_png_size= 218043;
+int datatoc_splash_png_size= 174800;
char datatoc_splash_png[]= {
-137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 1,245, 0, 0, 1, 26, 8, 6, 0,
- 0, 0, 8, 90,206, 70, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0,154,156, 24, 0, 0, 10, 79,105,
- 67, 67, 80, 80,104,111,116,111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103, 84,
- 83,233, 22, 61,247,222,244, 66, 75,136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136, 33,
-161,217, 21, 81,193, 17, 69, 69, 4, 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,163,
-136,138,202,251,225,123,163,107,214,188,247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81, 53,
-128, 12,169, 66, 30, 17,224,131,199,196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,126,
- 60, 60, 43, 34,192, 7,190, 0, 1,120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,192,
-116,145, 56, 75, 8,128, 20, 0, 64,122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227, 0,
- 80, 45, 0, 96, 39,127,230,211, 0,128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104, 59,
- 0,172,207, 86,138, 69, 0, 88, 48, 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16, 11,
-178, 0, 8, 12, 0, 48, 81,136,133, 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174, 16,
-231, 42, 0, 0,120,153,178, 60,185, 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2, 97,
-154, 64, 46,194,121,153, 25, 50,129, 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,142,
-182, 14, 95, 45,234,191, 6,255, 34, 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59, 6,
-128,109,254,162, 37,238, 4,104, 94, 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,161,
-144,185,217,217,229,228,228,216, 74,196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,190,
-226, 36,129, 50, 93,129, 71, 4,248,224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,211,
- 34,196, 73, 98,185, 88, 42, 20,227, 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223, 44,
-251, 3, 62,223, 53, 0,176,106, 62, 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,193,
-212, 40, 8, 3,128,104,131,225,207,119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,179,
- 63,199, 8, 0, 0, 68,160,129, 42,176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,194,
- 66, 16, 66, 10,100,128, 28,114, 96, 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112, 14,
- 46,194, 85,184, 14, 61,112, 15,250, 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,142,
- 8, 23,153,133,248, 33,193, 72, 4, 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242, 61,
-114, 2, 57,135, 92, 70,186,145, 59,200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,132,
- 70,162, 11,208,100,116, 49,154,143, 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,192,
-232, 24, 7, 51,196,108, 48, 46,198,195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,245,
- 99,207,177,119, 4, 18,129, 69,192, 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,218,
- 9, 55, 9, 3,132, 81,194, 39, 34,147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19, 47,
- 16,123,136, 67,196, 55, 36, 18,137, 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155, 52,
- 72, 26, 35,147,201,218,100,107,178, 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157, 98,
- 64,113,164,248, 83,226, 40, 82,202,106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17, 53,
-143, 90, 66,173,161,182, 82,175, 81,135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,105,
-175,232,116,186, 17,221,149, 30, 78,151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40, 25,
-155, 24, 7, 24,103, 25,119, 24,175,152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,182,
- 42,124, 21,145,202, 10,149, 74,149, 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,125,
-174, 70, 85, 51, 83,227,169, 9,212,150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,126,
- 89,253,137, 6, 89,195, 76,195, 79, 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,129,
- 53,196, 38,177,205,217,124,118, 42,187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63, 7,
-227,152,113,248,156,116, 78, 9,231, 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,150,
-151,150, 88,171, 72,171, 81,171, 71,235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,103,
-143,206, 5,157,231, 83,217, 83,221,167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,152,
-158,190, 94,128,158, 76,111,167,222,121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,219,
- 12,206, 24, 60,197, 53,113,111, 60, 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,163,
-213, 70,141, 70, 15,140,105,198, 92,227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,166,
- 41,166, 59, 76, 59, 76,199,205,204,205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120, 90,
- 44,182,168,182,184,101, 73,178,228, 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,214,
-187,173,187,167, 17,167,185, 78,147, 78,171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,182,
-125, 97,103, 98, 23,103,183,197,174,195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,180,
-114, 20, 58, 86, 58,222,154,206,156,238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,157,
- 83,155,211, 71,103, 23,103,185,115,131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,113,
- 93,225,122,210,245,157,155,179,155,194,237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,195,
-200, 67,224, 81,229,209, 63, 11,159,149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,183,
-165,119,170,247, 97,239, 23, 62,246, 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,111,
-158, 95,133,223, 67,127, 35,255,100,255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,191,
-142, 63, 58,219,101,246,178,217,237, 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,231,
-152,206,145,206,105, 14,133, 80,126,232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88, 26,
-209, 49,151, 53,119,209,220, 67,115,223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,218,
- 55,186, 52,186, 63,198, 46,102, 89,204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,226,
-157,226, 11,227,123, 23,152, 47,200, 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,240,
- 65, 16, 42,168, 22,140, 37,242, 19,119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242, 72,
- 42, 77,122,146,236,145,188, 53,121, 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118, 32,
-109, 50, 61, 58,189, 49,131,146,145,144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,110,139,
-183, 47, 30,149, 7,201,107,179,144,172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,137,
-202, 57,150,171,158, 43,205,237,204,179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29, 88,
-230,189,172,106, 57,178, 60,113,121,219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,174,
-126,189, 38,122, 77,107,129, 94,193,202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,223,
-181, 97,250,134,157, 27, 62, 21,137,138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,169,
-171,196,185,100,207,102,210,102,233,230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,245,
-246, 69,219, 47,151,205, 40,219,187,131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250, 84,
- 54,238,210,221,181, 97,215,248,110,209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,213,
-102,213,101,251, 73,251,179,247, 63,174,137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,182,
-215,185,212,213, 29,210, 61, 84, 82,143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226, 35,
-112, 68,121,228,233,247, 9,223,247, 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154, 70,
-155, 83,154,251, 91, 98, 91,186, 79,204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,218,
-233,130,211,147,103,242,207,140,157,149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,116,
-225,210, 69,255,139,231, 59,188, 59,206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,254,
-147,211, 79,199,187,156,187,154,174,185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,255,
-214,213,158, 57, 61,221,189,243,122,111,247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,188,
- 95,244, 64,237, 65,217, 67,221,135,213, 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,254,
-145,245,143, 15, 67, 5,143,153,143,203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,158,
- 23,254,162,254,203,174, 23, 22, 47,126,248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,235, 25,
-175,219,198,194,198, 30,190,201,120, 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,255,
-104,249,177,245, 83,208,167,251,147, 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 32, 99, 72, 82, 77, 0, 0,
-122, 37, 0, 0,128,131, 0, 0,249,255, 0, 0,128,233, 0, 0,117, 48, 0, 0,234, 96, 0, 0, 58,152, 0, 0, 23,111,146, 95,
-197, 70, 0, 3, 72,230, 73, 68, 65, 84,120,218,236,253,121,152,109,217, 89,222, 9,254,214, 90,123, 56,251, 76, 49, 71,220, 49,
-103, 73, 41, 52, 66, 74,128,177,193,137,157, 52, 5, 24, 99, 99,167,120,112,151,241,227, 1,169,202,213, 3,174,110, 36,185,203,
-213,118, 85, 25,131,178,236,198,116,217, 84,145, 6,187, 41,219,101,140,192,216,198, 54, 96, 37, 34, 65, 18,160, 33, 65,179,114,
-188,202,241,222, 27,115,196, 25,247,176,134,254, 99,173,125,134,184,113,111, 14,202, 76, 33,113,190,124, 78,198,141,136, 19,231,
-236,125,246,218,235,253,134,247,123, 63,225,156, 99, 97, 11, 91,216,194, 22,182,176,133,125,229,155, 92,124, 4, 11, 91,216,194,
- 22,182,176,133, 45, 64,125, 97, 11, 91,216,194, 22,182,176,133, 45, 64,125, 97, 11, 91,216,194, 22,182,176,133, 45, 64,125, 97,
- 11, 91,216,194, 22,182,176,133, 45, 64,125, 97, 11, 91,216,194, 22,182,176, 5,168, 47,108, 97, 11, 91,216,194, 22,182,176, 63,
-240, 22, 93,239, 23, 66,136, 87,226,253,234, 23, 77,129,155,164, 68, 90,203,211,192, 40,252,238,101,235,175, 91,180,234, 45,108,
- 97, 11, 91,216,194, 22,160,254,202,153, 0,132,148,226,182,191,249,231,222,252,119,239,253,134, 91,255, 68, 20, 9,245,239, 63,
-241,212,135,255,206,207,125,242,127, 44,181,125,232,229, 6,246,133, 45,108, 97, 11, 91,216,194,254, 48,153,184, 94, 68,251, 10,
- 68,234, 2, 72,254,155,239,124,221,255,242,143,190,255,141, 63,232, 14,135,208, 89, 66,108,172,242, 27,159,124,234,210, 15,254,
-227, 15,253,205, 39,174,244,127, 9,208,117,176,189,136,212, 23,182,176,133, 45,108, 97, 11,123,225,246,106,214,212, 5,144,102,
-213,176,195,149, 39, 25, 95,121,134,209,227, 95, 96,244,232, 99,124,235, 27, 46,220,246, 91, 63,250, 61, 63,251, 93,111,191,248,
-183,128,149, 0,232, 98,113,121, 22,182,176,133, 45,108, 97, 11,251,131, 9,234, 0,226,199,127,253,217,159,254,199, 31,223,251,
-100,115,165, 65,164, 4,118,247, 10,163,135, 63,199,217, 44,110,252,251,255,254, 79,253,191,255,187,239,123,235, 63, 17,130,215,
- 44,128,125, 97, 11, 91,216,194, 22,182,176, 23, 9,178,175,114,250,189, 1, 44, 3,111,248,175,254,216,230, 15,253,131,239,188,
-240, 93,169,134,113, 81, 33,211, 6,209,205,119,144,108,110,240, 75, 31,126,248, 51,127,253, 39, 63,244,158,171,135,227,255, 12,
- 88, 94, 66, 42,126,145,126, 95,216,194, 22,182,176,133, 45, 64,253,149, 3,245, 89, 96, 95, 2, 46,252,177, 59, 58,127,233, 95,
-124,255,109,127,237,230, 44,106,140, 70, 21, 40,133, 60,119, 11,141,139, 23,121,226,242,126,239, 93,255,232,193, 31,253,245, 79,
- 62,247,147, 64,191,198,234,151, 3,212, 95,161,115,195, 57,119, 23,190,124, 0,112, 73, 8,113,233,171,121,241,252, 97, 59,223,
-133,125,213,172,219,197,135,176,176, 5,168,191,204, 38,129, 46,176,117,166, 27,253,233,127,253,151,110,255,111,255,216,153,214,
-153,124,108, 0,139,216,186, 64,118,211,173,148,206,242,255,252,103, 31,249,223,255,151,127,247,153,191, 5, 60,195,139, 96,199,
- 63,207,141,123, 91,120,188, 16, 59, 20, 66, 60,244, 2,223,243, 3,192, 61,225,219,247, 10, 33,222,247, 85,190, 57,126, 85,156,
-111,112, 78,238, 9, 14,202, 93, 51,191,122, 8,184, 4,188, 95, 8,113,248, 50,188,207,201,215,231,229, 94,131,215,188,231,125,
-119,191,184,181,254,238, 7, 31,226,171,220, 22,160,190,176,175,102,123,169, 45,109, 18,159, 22,239,172,181,227, 55,173,181,162,
- 53,235,166, 94,128, 8,255, 19, 66, 8, 87,255, 68,212, 63,159,252, 54, 2,154,149,113,227,191,241,159,118,126,245, 31,254,153,
-139,127,230,155, 54, 91,203,101,229,224,112,159,188,217, 38, 94,219,226,255,251,174,187,127,224,174, 59,182, 94,247, 67, 63,245,
- 91, 63,124, 52, 40, 63,204,203,211,246,118, 47,240, 99, 47,114, 19,120, 63,240,128, 16,226,254,197,178,249,170,201, 50,220, 27,
- 30,215, 3,189,218, 97,249, 41,231,220,253,193,113,249, 82,192,253, 46,224, 3, 47,225,239, 30, 0,190,237, 85, 89,235,247,221,
- 61, 93,235,239,126,240, 85, 91,235,238,190,187,231,179, 62,239,126,112,145,245, 89,216,194, 94, 37, 80, 23,128,104,165,234,174,
-191,251, 29, 55,255,189,239,127,203,230,221, 75, 89,156, 88, 33, 61, 96, 75,233, 31, 66, 32, 34, 53,247, 61, 82, 34,148,154,126,
- 47,252,239, 44,194, 85, 78, 88, 29, 69,200,153,215,209,166,194,142, 5,127,233,219,222,248, 13, 95,123,199,198, 47,254,213, 31,
-127,224,111,127,226,209,221,127, 6, 20,188,250,253,236,247, 2,247, 58,231,238, 5,222,241,114, 68,110, 11,251,178,218, 39, 94,
-228,243,223, 9,220,227,156,123,199, 75,141,154,191,130,204,175,245,251,238,246,107,253,221, 15,190, 26,107,253,199,102,156,168,
-247, 2,239, 91, 44,209,133, 45,236,213,139,212, 55,238,251,238, 91,127,252,175,127,211,249,111, 46, 71, 22,103, 5, 74, 10, 31,
-192, 59,225, 31, 72,132, 21, 30,122, 29, 32,133,143,237,173, 3, 21,210,251,210,255, 78, 9, 33, 34, 41,212, 36, 45, 38,234,191,
-115, 88, 33, 40, 70, 37,111,190,121,115,227, 3,127,239,123,255,209, 95,255,201,223,120,205,191,250,224,163, 63, 10,236,242,242,
-137,213, 60,112,131,223,221,115,202,247, 31,112,206,125,219, 2,216,191,106,236,161, 16,157, 62, 36,132,120, 32, 68,242, 43,225,
- 90,191,115,102, 13,220, 6,252,188,115,238,109, 47,211,181,191, 31,159,222,127, 62,123, 57,215,217,139, 95,235,247,221,253,109,
-175, 18,176, 47,108, 97, 11,251,114, 68,234,105, 44,111,251, 83,175, 95,121,187, 27, 86, 84,121, 1,214,122,144,158,100,214,235,
-120, 94, 76,113, 87, 73,228,218,102, 0,119,139,144,128, 13, 89,124, 1, 19,132,151,214, 3,191,148, 96, 0,229, 95,162, 44, 42,
-150,146, 68,254, 31,239,254,206,191,241,246,215,157,121,211,223,252,233,143,188,187,168,204, 39, 95, 14, 96, 23, 66,220, 48,181,
- 25,162,243, 31, 99,154,166,189, 43,108,246,139,104,226, 43,219,238, 7,238, 63, 45,242, 14,160,253,126,224,253,206,185,159, 10,
-215,187, 6,246,151,235,218,191,191,118, 34, 94, 45, 19,239,126,240,198,107,221, 71,231,139,181,190,176,133,125,133,218, 75,233,
- 83, 87,101,101,247,127,238,211,187, 31, 21,178,160,149, 24, 90, 25, 52, 27, 46, 60,236,244,223,169,165, 33, 75, 48, 21, 34,109,
-122,144,183, 22,172, 61, 65, 86, 41,193,230, 96,199,224,114,160,240,223,187, 50, 60,223,225,156,165, 50, 22, 93, 24,254,198,159,
-123,251, 61, 31,184,239,207,253,219, 91,182,186,223, 27, 96,255, 21,237,183, 23, 66,188, 31, 95,211,156,141, 86,238, 93, 44,159,
-175,104,251, 54, 33,196,187, 94, 72, 42, 93, 8,241,174, 19, 17,245,123,190, 90, 63, 20,241,238, 7, 23,107,125, 97, 11,251, 67,
- 22,169,227, 96,255, 61,255,238,201,191,253,159, 62,187,247,189,175, 63,147,221, 44, 64, 90,231,108,216, 22,176,206, 67,246,168,
-180,242,107,111,234,124,205, 15,126,203, 29,183, 53,162,134,180,214,130, 82, 62,182,182, 22, 87, 14, 16, 74, 32, 47,190, 5,185,
-113, 7,162,123, 6,209,232,130, 46,176,195, 93, 92,255, 10,118,247, 81,208, 99, 16, 25, 14,131,113, 96, 7, 37,223,252,198,155,
-110,250,181,251,254,220,207,252, 23,239,253, 55,234,139, 87,142,127,145, 41,121,239,149, 2,246, 75,206,185,247,207, 68,108,119,
-189, 28,175,123, 10, 35,250,161,151,137,105, 61,203,122,126, 73,237,102, 47,199,107,188, 26,231,123,226, 56, 95,208,235,189,132,
- 8,249,126,166,132,179, 21,231,220, 93, 95,173,181,117,241,238, 7, 47,185,251,238,126, 73,107,221,221,119,247,181,215,247, 85,
- 72,221,159, 32,218,189,106,239,187,176,133,125, 53,128,186, 1,134,192, 23,126,243,137,193,143,255,230, 19,131, 44, 68,203, 39,
-109,237, 59,222,188,249, 87,191,247,109,183,158,109,202, 68,106,235,124,234, 61,207,113,197, 16,204, 16,245,218,111, 38,122,219,
- 95, 64,221,250,141,215, 77, 33,184,131, 39,209, 79,252, 58,230,169,143, 32, 84, 2,206,225, 4,148,163,146,215,158, 91, 91,250,
-183,255,195,247,252,227, 63,249,195, 63,127,176,119,156,127,144, 87,126, 32,204,203,194,200, 13,192,246,206, 16, 1,221,117,202,
-239, 47, 49, 77, 13, 31, 94,231, 53,126,108,230,111,223, 47,132,184,127,230,117,223,201, 9, 70,119,120,205,247,189, 16,246,190,
-115,238,157, 33, 26,189,237,197, 30,215, 43,113,190, 55, 56,215,247,132,215,157,221,204,191, 20,166,248,141,236, 36,128,175,124,
-149,239, 13, 47,120,173, 7, 32,191,254,245,189,239,238,233,245, 61, 1,180,238,190,187, 63,112,138,227,240, 78,119,223,221,247,
- 92,231,237,222, 27,142,237,158,240,184,235,122, 78,199,141,222,119, 97, 11, 91,128,250,212, 44,144,227, 7,175,244,153, 84,189,
- 39,146,174, 78, 8,190,230,125,127,254,181,127,231,135,239,190,229,110, 83, 66,105, 12,174, 42,112,249, 8,116, 1,145, 35,253,
-206,191, 73,244,182,239,127,254,168, 97,245, 22,226,213,191,138, 60,243,102,244,199,127, 26,164,241,144, 47, 4,229,168,226,205,
-175, 57,187,254,227,255,245,221,247,253,197, 31,251,213,239, 5,158,126,133, 65,125,118, 35,127, 73,155,132,115,238, 30,224,231,
-159, 7, 20,110, 11, 81,225, 59,111,192,182,174,123,171, 1, 30, 8, 45, 90, 63,117,131,168,234, 54,124,107,214, 93, 33,157,124,
- 61,240,253, 41,174,159,110,173,143,235, 94,231,220,183,189,138,231,123,218,185,126,224, 15, 1,176,126, 57,237, 5,173,245, 0,
-190, 47,252,250,222,119,247, 59, 78,244,194,223,115,157,231,223,118,131,227,122, 39, 47,172, 77,175,126,223,247, 4,178,223, 67,
-139,203,186,176, 5,168, 95,231, 94, 6,170,240, 96, 6,208,213,205,235,141,239,254,169,239,191,243,125,223,254,218,245,215, 20,
- 99,139, 49, 21, 20, 99,208, 21, 8,135,136, 33,253,179, 63,138,122,227,119, 77, 94,172, 55, 46,248,181, 79, 62,201,175,125,234,
- 73, 14, 6, 99, 98, 37,120,253,185, 85,254,244,219,238,224,235,110, 63,235, 95,248,226,219, 17, 73,135,234,195,255, 0,146,200,
- 31,130, 20,232, 65,193,127,249, 39,223,248,181,255,226,215, 31,254,171,191,246,241, 39,127,132, 87,168,221, 45, 0,222,189, 39,
- 34,194, 23,251, 26,247,134, 13,240,100, 4,248,192,204,198, 57, 27,237,220,198,148,105,255,208,243,108,192, 63, 63,179, 17,190,
-127, 38,178,188,235,196,113,191,211, 57,119,233, 58, 66, 49, 63,118, 10,160,207,190,214,189, 51,145,209,207,127,153,206,119,229,
- 4,160, 31,206, 28,223,109,175,224,189,114,207,243, 68,238, 95,202,186,122,217,203, 47, 95,210, 49,249,200,251,121,215,122, 32,
-213,189,248,235, 59, 15,176, 15,204,172,211,149,153, 44,193,245, 50, 5,135,167,100, 20, 46,157, 56,198,219,194,245,186,109,118,
-205,184,251,238,126,219,162,255,125, 97, 11, 80,127,126,171, 83,222, 75,223,241,198,213,191,113,255, 59, 94,247,238, 11,237, 44,
- 27, 15, 13,206, 20, 80, 21,225,157, 20, 66, 15,137,255,232, 95,155, 3,244,223,125,236, 10, 63,252, 47, 63,196,165,189, 62,141,
- 52, 38,142, 36,210,193,167,158, 57,224, 23,126,231, 97,190,251,109,183,243,223,223,251,205, 52,211, 24,185,117, 39,209, 27,223,
-129,254,253,127, 6,157, 45,192,249, 34,186, 19,252, 15, 63,240, 77,127,237, 63,127,226,201, 95,112,142,207,226, 75, 4, 47, 55,
-160,255,212, 9,208,184,255, 69,190,198,109,225, 53,102, 55,163,119,157, 82,219,125,223,137,232,182,126,239,183,221,224,229,223,
- 51, 3,192,239, 58, 9, 10,225,189,127,126,102,115,125,143,115,110, 46,213, 29, 82,238,239, 60,177, 57,191,227, 68, 29,125,246,
-216,238,249, 50,157,239,123,102, 94,239,189,129,196,120,242, 90,189, 18,118,239, 43, 0,188,167, 70,184,161, 28,241,126,124, 57,
-226, 85, 5,161, 0,232,207,187,214,131, 82,221,181,215,247,221, 15, 94,123,125,231,163,249,185,235, 91,179,241, 67, 26,190, 94,
- 83,247,139,119, 63,248,190,231,201, 14,188, 15,120,255,141,162,111,119,223,221,117, 68, 63,251,190,223,198,194, 22,182, 0,245,
-231, 5,244, 91,127,232, 79,156,255,159,126,236, 59,110,249, 63, 71, 54, 98, 84, 84, 96, 74, 48,218,215,209, 5,224, 12, 98,253,
- 34,209,215,255,192,228,143, 31,187,122,200, 15,252,227, 95, 99,103,172,105,182, 50, 42,165,136, 99, 69,162, 4,202, 37, 8,163,
-249,197,143, 62,142,146,146,191,251, 23,238,246, 17,251, 29,223,138,121,228, 87,193, 12, 32,202, 64,128, 46, 43,190,246,246,205,
- 51, 95,255,250, 51,223,254,209,207, 95,253, 2, 47,114, 8,140,115,238, 61,207, 19,161,157, 4,176,119,189, 4,162,213, 79,157,
-136, 46,175,219,235, 44,132,120, 32,164,183,235,136,244, 46,231,220, 59,159,167, 30,254,128, 16,226, 29,215,121,189, 75,206,185,
-247, 50, 85, 51,171,123,176,223,127, 10, 88,214, 27,244,169,125,248, 51,199,246,137, 47,227,249, 94,186,222,235,189, 18, 81,110,
- 88, 31, 47,217,161,123,158, 12,203,105,118, 91,184, 30,239,113,206,189,172,242,187,238,190,187, 95,252, 90,191, 22,168, 79,191,
-190,215,169, 91,139,119, 63,248,128,187,239,238,249,235,123,223,221,239,124,169,138,117, 55, 2,252, 19,207,187, 63,212,213,235,
-117,127, 79,112, 70, 22,209,250,194, 22,160,126, 29, 64, 23,171,173,232, 79,254,228,189,183,255,253,239,123,243,250, 91,138, 28,
- 10, 81,129,245,169,118, 98, 57,121,166,171, 74,162,215,126, 11,162,189, 62,121,129,247,254,203,143,240,216,179,199,176,212,230,
-120,160, 65, 24,148,128,166, 18,172,183, 34, 86,178,136,165,165, 54,255,246, 99,143,113,247, 27,110,230,158,183,220, 10, 42, 66,
-221,246, 45,232, 79,254, 44, 98,227, 22,112, 22, 43, 4, 73,150,240,125,119,191,238,158,143,126,254,234, 63, 5, 14,120,113, 41,
-248, 23, 42,163,121, 63, 47,161,183,120, 70, 91,124,114,234,207, 7, 62, 66,136,135,130, 52,233,123,102, 54,220, 27,109,130,239,
-122,158,215,123,192, 57,247, 16,243,169,208,250,248, 78, 74,165,190,239, 70,199, 55,115,108,239,252, 50,157,239,251, 94,173, 20,
-117, 56,151, 31, 59, 17,165,191, 28,160, 94,235,202,207, 70,154,179, 26,244,147,181,233,156,187,237,122, 60,136,151, 96, 47,110,
-173,159, 2,232,129,105, 62,127,125,159,135,136, 38,222,253,224, 67,238,190,187, 95,204,122,126, 89, 44, 56, 20,179,235,254, 94,
- 22, 61,247, 11,251, 42,182,151,210,223, 93,147,226,218,223,124,123,231,191,253,200,127,243,134, 95,248,190,215,175,190,101, 52,
- 50, 24,140, 7,116, 9, 40,129, 80, 2, 17, 9,132,146,136, 72, 32,207,189,113,242, 34, 95,220, 62,226, 87, 62,249, 52, 52, 51,
-223,230, 38, 37, 40,133, 65,210, 47, 12, 95,220, 29,113,105,103, 68,229, 4, 86, 41,126,253, 51, 79, 77, 15, 96,253, 14,220,184,
- 7,232,112, 52, 14,180,229,206, 11,171,183, 3,103,121,229,230,176,223, 27,162,200, 23,155,226,157,221, 0, 15, 95, 4, 40, 60,
-112,226,189,175, 11, 16, 47, 48, 77,123, 61,130,210, 61, 39, 0,246,133, 28,223,251,191, 76,231,123,233,213,210,223, 15, 37,132,
- 89,173,246,195,231,115,158,158,199, 14,241,236,237,219,133, 16,111, 19, 66,188, 67, 8,241,190,153,199, 59,132, 16,171,225, 57,
-179, 32,249,206,224,120,189,154,118,111,136,168, 87,158,247,250,190,240,136,251,133,174,231,151,219,222,255, 2,178, 35, 11, 91,
-216, 31,202, 72,189, 78,183,159,251, 43,223,184,241,119,126,242,187,111,254,193,216, 42, 70,165, 5,229,192, 89,132, 3, 97, 5,
- 78,137,144,122,247,127, 34,162, 4,185,114,211,228,133,158,220,237, 49, 30, 85,208, 77,167,126, 66, 29, 91, 75, 9,206,113, 52,
-168,168, 74,205,133,165,136,126, 94, 77, 15,162,179, 5, 40, 40, 70,136,172,131,195,129,214,220,186,213,217, 76, 19,117,166, 40,
-205, 23, 94,228,121,189,247, 6,191,155, 37,221,172, 48,195,254,126, 17,209,226, 61,215, 1, 86, 94, 64,116, 61, 23, 53, 94,135,
- 64,246, 66, 51, 7,151,110,112,142, 47,234,181, 78, 30,219,171,120,190,175, 10,131, 57, 56,110, 39,107,222,239,253, 82,122,211,
-195,223,190, 16,177,155,247, 57,231, 30, 96,190,196,241, 99,207,227, 72,189,114,107,253, 90,153,216,151,118,125,125,212, 60, 23,
-241,191, 28,140,244,144, 57,184, 17, 99,254,158, 19,217,144,133, 45,108, 1,234,117,244,219,105,168,111,250,159,191,235,194,125,
-239,186,107,227,143,150, 37,228,177,151,124,117,198, 33, 42, 75,146, 72,142,141,177, 25, 82, 18,169, 73, 7,187, 0,112,122,242,
- 98,155, 75, 77, 84, 18, 99, 44, 65, 47,222, 5, 80, 15, 95,157, 0, 37, 25,142, 42,158,202,115,210,183,204, 28,170, 51,224, 42,
-208, 57,200, 46,194, 89,156,181,172,182,226,230, 82, 51, 89,217, 41,199, 47, 42, 3,241, 66,106,150,161,174,250, 30,166,227, 57,
- 63,192,141,201,107, 92,103, 35,185, 45,140, 44,125, 41,182,114,131, 8,240, 75,177,151,180, 73,135,231,222,245, 42,159,239, 43,
- 14,234, 1,208, 63,112,226, 60,222,245,106, 78,232, 11,229,136,247, 50, 77,151,223,230,156,187,247, 36, 49,240, 69,191,238, 11,
-168, 71,135,186,251,141,214,250,252,245,157,246,154,191, 92,235,249,133, 0,121,221,218,246,158, 69,244,189,176,133,189, 56, 80,
-175, 83,217,241,157, 91,141,191,240, 47,191,239,214,247,125,221,102,115,115, 92, 90, 72, 35, 15,232,149, 37,170, 44, 73,166,248,
-239,126,253,185, 79,221,188,156, 44,255,224, 93, 27, 55,231, 14, 68, 29,173, 87, 21,118,239,113,228,197,183, 3,240,250,243,107,
-124,195,107, 54,249,237, 47,236, 66, 20,121, 16,151, 1,208,107, 93, 56,235,255, 54, 63, 24,242,154, 51,211,251,214,245, 46, 67,
-209,195, 21,203,136, 48, 49,198,217,218, 41, 64,242, 10,164,223, 67,244,196,204, 38,251, 66,200,107,167,109, 94, 47,102,190,245,
-151,195, 14, 95,134,231,126, 37,157,239, 11, 1,244,247,126,153, 70,238,206,170,216,241,106,125,142,226,221, 15,190, 47, 68,212,
-211,181, 62, 79,108,251,178, 94,223, 16,153, 47,116, 10, 22,182,176,151, 0,234,117,186,125,243, 29,111, 93,253,225,159,248,206,
- 11,255,183, 51,141, 56, 25, 89,129,104,250, 16,220,149,150,134,117,228, 9,252, 95,127,249,169, 95,190,255, 35, 59,191,244, 51,
-239,184,229,221,194,133,204,187, 10,236,247, 72,226,182, 63, 59,121, 97, 41, 5,127,235,207,190,141,239,252,252,127,128,188,130,
- 52, 9,211,221, 2,168, 91,192, 89, 24,140,248,218,175, 57,207, 95,252,227,111,152,252,173,221,249, 2,206, 85, 8, 83,250, 39,
- 58,135, 20,142,131, 65, 62,238,141,202,254, 43, 24, 61,189, 47,168,155,213,118, 47, 47,158,236,115,163, 30,220,151, 19,112,255,
-160,216, 87,218,249,158, 4,244,251, 95, 78,246,249,139, 92,111,135, 39,200,141,117, 43,215,171, 5,236, 47,100,173,191,170,215,
- 55, 68,232, 39,117, 10,238, 15, 25,156, 75,167,165,243, 67,230,225,199, 88,216,194,254,144,131,186, 0, 68,164,196,107,127,228,
-191, 56,247, 19, 63,252, 71,206,124,187,214, 48,138, 36, 34,149, 56,235,112, 99, 67, 43, 18, 60, 89,232,252, 47,255,139, 47,254,
-244,131,143,246,254, 37, 96,159, 62,174,182, 17,238, 78, 55,137,212,129, 70, 19,243,228,135,137, 14,159, 68,172,220, 2,192,119,
-124,237, 45,220,255, 95,127, 43, 63,244, 51, 31, 98,116, 84, 64, 35, 5,229,235,233,148, 21,140,198,124,221,157, 91,252,194, 15,
-127, 23,173, 70,236,143,170, 26, 99, 62,255,139,136, 36, 5, 97,192, 89,156, 53, 32, 37, 79, 92, 61,218,205, 75,179,203, 43, 71,
-148, 3, 95,115,190,103,102,147,125,209,209,215,151, 11, 36,190, 76,246, 21,115,190, 97, 26,219, 73, 64,127,215,151,249,176,190,
-156,142,220, 11, 89,235,247,191,208, 22,179,151,201,222,121, 2,208, 23, 74,113, 11, 91,216,140,201,231, 1,245,205, 31,251,206,
-243,255,248,221,127,244,204,183,231, 26,170,102,132,200, 20,206, 2, 35, 67,171,161,248,141,203,195,237,187,127,242,225,191,253,
-224,163,189,255, 21,120, 18,120,238,145,189,252, 17,164, 0, 19, 72, 79, 74,250, 20,187, 30, 80,125,248,199,231,222,228, 7,255,
-228, 27,248,157, 31,253,243,252,208,159,122, 19,183,174,166, 52, 92, 69, 91, 26,190,233, 53,235,252,163,191,254, 39,248,173, 31,
-185,151, 91,183,150, 38,207,215, 31,255,105,220,209,147, 16,167,184, 64,194, 67, 27,144,130, 71,158, 61,124, 10, 63,103,221,254,
- 1,251,156,159, 79, 22,243, 43,245,248,238,249, 10, 61,223,235, 1,250, 59,255,128, 1,250, 31, 84,251,114, 94,223, 89,214,252,
-251, 94, 32,160,223,182,184,100, 11, 91, 68,234,192,197,149,228,238,191,252,166,213, 63, 89,230, 22,218, 49, 34, 17,184,210,161,
-114, 77,218, 82,252,243, 79,237, 63,252,127,249,133, 39,255,231,222,216,124, 8,216,199, 15,122,105,252,214, 19,253,143, 93,233,
- 87,127,101,189, 25, 71,198,185,105, 19, 92,214,196, 62,253, 91,232,143,252, 67,162, 63,250, 67,147,247,121,243,205,235,252,248,
- 95,249, 22,126,244, 47,106,174, 30, 12, 73,226,136,115,171,173,107,142,199,124,254,223,161, 63,253,207,161,209,244, 94,135, 84,
- 56, 99, 17,198, 82,229, 5,191,248,161, 39, 62,130,215,163,127, 37, 65,253,165,108, 16,115, 41, 84,231,220,202,151, 91, 10,244,
-132, 93,154, 57,190, 23,196, 14, 14,253,219, 95,169,231,251,149, 4,232, 47,149,196,248, 74,174,245,249,235,123,223,221, 43,175,
-226,192,148,187, 94,194,231,241, 21,225, 88, 46,108, 97,175,116,164, 30,221,178,154,190,102, 37, 85,104,235,217,237,110,100, 72,
- 74,131, 72, 5, 63,252,107,207, 60,240, 3,255,252,137,255, 71,111,108,126, 29,216, 6,142,129, 18,168, 46, 31,149, 31,251,197,
- 47, 28,126, 50,142,192,229, 6,112, 8,137,239, 87,111,118, 48,159,254,223,169, 30,248, 91,184,209,222,220, 27, 54,226,136, 91,
-182,150,174, 5,244,106,140,249,232, 79,162, 63,244, 35,136, 52, 65, 40,229,235,245,113, 10,149, 38,150,240,187,143, 92,185,250,
-219,159,223,126, 0,175,253,254,138,128,250,137, 17,159, 47,102, 83, 57,217, 38,246,206, 63, 96,235, 96,246,248, 86,130,108,235,
-151,178, 81,254, 65, 63,223,175, 8, 64, 15,210,189, 39,157,175, 87,231,189,189,242,218,245,214,250, 87,206,245,245,146,178,139,
- 72,125, 97, 11, 80, 7,212,231,183,199,143, 62, 91, 26,221,108, 42,154,149,161,169, 96,160,172,251, 47,127,254,210,191,250,251,
- 31,184,242,119,128, 79, 1,123, 33, 66,247,232,237,135,188,108,255,196,111,110,191,255,184, 50, 68,149,129,202,122,214, 92, 16,
-165,161,213,193, 62,241, 43,148,191,248, 3,152,207,253, 34,174,247,220,233, 55,228,112, 23,251,196, 3,148,191,244, 87,208,191,
-255, 79,160,209, 0, 21,121,177, 25, 33, 16, 50, 70,228, 21, 40,199,223,253,185,223,255, 37,224,241,240,254, 47, 59,168,207,244,
- 45,207,218, 11,106, 47, 10,109, 72,179, 27,242,123,158, 39,210,125,181,237,253,204,215,110,223,243, 2, 62,139,247,124, 5,159,
-239,245, 0,253, 33,110,220,199,253,188, 78,159,115,238, 61, 51,143,123, 78,124,102, 47,118,189,205,146,187, 14,121,121,250,212,
- 95, 8, 16,222,112,173,139,119, 63,120,237,245,245,140,244, 47, 53, 91,196, 11,200, 22, 29,190,208, 8, 60,156,199,130, 32,183,
-176, 63, 84,118,195,244,251,254, 64,127,252,251,254,213, 23,223,247, 67,223,178,117,239, 90, 51, 90,250,194, 94,254,236,255,246,
-225,157, 95,254,220,229,209,191, 7,174, 0, 71, 33, 58,159, 5, 81, 3,140, 31,223,205,127,229, 71, 62,120,245,158,251,190,235,
-226,183,233,129,134, 72, 34, 82, 53,165,176, 53,187,160,143,169, 62,252,247, 16, 73, 27,177,118, 39,114,245,118,136, 26, 96, 43,
-236,209,211,184,221,207, 65,126, 4,113, 12,173,165,153,187, 21,176, 18, 87, 8,146,182,228,103, 31,120,228,243,255,249,247,158,
-251, 87,248,212,123,245, 10, 68,231,247,112,237,124,241,154,117,251, 66,237, 93,204,107,175,127, 32,140, 25,125,224, 5,188,255,
-189, 1, 44, 95, 17, 66, 82, 96, 89,191,111,102, 3,188,199, 57,247, 83,167, 69,172, 51, 45, 95, 43, 95,169,231,123, 3, 64,255,
-182, 47,177, 76,112,219, 9, 16,121,239, 76, 84,123, 87,208, 58,184,255,249,122,205,103,198,232,206,126,198,175,184, 52,110,136,
-206, 95,232, 90,191,246,250,250,177,170, 15,188,128,247,184, 55, 56, 7,239,187, 14,168,223,123, 3, 97,154,247,207, 92,183,119,
-186,251,238,126,255,117, 24,239,167,181, 38, 46,108, 97,127,168, 65,189, 2, 14,126,231, 82,255,159,254,206,165,254, 7,128, 14,
-190,110,126, 21,159,106, 31,132,231,156,148, 21,171,231,173, 95,253, 7,191,126,229,199,191,246, 98,243,214,239,127,203,218, 29,
-227, 94,137,232, 38,144, 74,175, 52,135,131, 56, 70,196,177,103,176,239,127, 10,189,243,208,228,229,132,140, 32, 74,160,213, 62,
-113,183, 2,165,193,217,140, 70,154,240,208, 99,219,135,255,247,127,242,209,251, 66,148, 62,230, 37, 76,104,115, 55,144, 70,187,
- 17,104,189,152, 77, 54,168,165,189,139,233,100,171, 26,232, 30, 8, 27,255, 67, 39,192,161,222, 96,239,154, 1,136, 87,210,238,
-103,126, 76,230, 59, 67,164,121,255,204,177,221,195,148,125,124, 41,108,246,119,125,165,157,111, 56,175,211, 82,198, 63,255, 34,
-150,194,251, 95, 66,239,250, 61,193, 97,170, 71,133,158,166,253,126,114, 84, 46,120, 25,224,151,197,193,113,247,221,253,210,214,
-250,137,154,121, 80,135,187,246,250,222,119,247, 75,189,190,181, 46,124,237,200,124, 34, 12, 99, 57, 89,114,152, 43, 21,133,231,
-221,207,116,220,107, 45,152, 51,203,146,127, 63,175,174, 44,237,194, 22,246, 7, 18,212, 77, 0,110, 29, 64, 92,134,159, 21,225,
- 97,184,254,208, 20, 13, 12,172,115,159,249,175,126,238,139,127,119,173, 21,253,200,255,233,142,165,243,249,113, 9,157, 24,209,
- 80,211,254,117,143,224,144, 52,110,220,135,230, 0,235,160, 48,216, 94, 73,118,118,139, 47, 92, 57, 28,188,227,125,191,249,190,
-227, 97,245,161, 25, 39,227,149,182,135, 2,160,191,104,210,146, 16,226,254, 25, 1,155,149,217,141,254,203,189, 16, 66,180,254,
-142, 16,221,220,118,157,200,115, 54,114,123, 7,207,147,218,252,131,124,190,167,216,139,141,232, 30,248, 18,222,235, 54, 94,120,
- 29,250,254, 87,193,161,187,241, 90,191, 14,195, 60, 76, 65,123, 89,174,175,120,247,131,135,238,190,187,223,203,252, 56,215,211,
-132,109,222, 23,178, 4,179,207,123,231, 13, 62,207,119,133, 99, 91,128,250,194,254, 80,152,124, 30, 24,213,248,122,249, 33,126,
-242,217, 17, 48, 10, 63,119,207,243,183, 5,112,220, 27,155, 7,255,236,253,143,254,191,254,249,239,239, 63,220, 72, 36,113,175,
-194, 30, 87,144,219,201,171, 8, 4, 66,156,242, 8,255, 97,128,210,226,122, 26,113, 88,144,173, 44,243,224,165,227,171,223,254,
-183, 31,248,219,151,182, 7,255, 38, 28,219,136, 87,142,245,254, 64,216, 92,223, 17, 6,113,124, 41,250,223,247,227, 37, 55,239,
-231,133,245, 32,191, 63,108, 76,175,252, 68, 43, 63, 20,230,109,207,243, 94, 15,224,199,158, 62,244,149,126,190, 95, 6,128,124,
- 47, 47,156, 92,249,126,124, 57,224, 93,175,114,231,192,116,173,191,251,193,183, 61, 95,203, 88, 80,153,123, 89,174,111,120,173,
-219, 79,100,135,174,247,158,239,224,198,196, 65,191, 78, 95,226,120,215,133, 45,236, 43,213,196,245,210,141, 66,188, 44,250, 45,
- 10,104, 6, 79,249, 13,127,249,155, 54,255,218,255,244, 29,231,255,244,249,165, 36,210,133, 67, 71, 2, 26, 10, 17, 73, 31,185,
-203,153,247,116, 14, 12, 56,109, 33, 55,168,202, 18,199,130,158,129,191,247,161,131,223,248,255,252,242, 19, 63, 85, 25,251,113,
-166,173,116,122,206,171,184, 65, 26,245,101, 58,183,151,197, 66, 42,248,100,148,120, 9, 63,221,236,129, 47,227,113,213,233,210,
- 89,161,143, 7, 94,224, 52,184,175,184,243,253, 50, 93,247,219,184,150,155,240, 16, 62,221,126,248, 21,121, 94,158,109,126,250,
-245,125,158,122,251,203,244,126,151,128,135,196,187, 31,188,116,131,207,126,177,243, 47,108, 1,234, 95, 34,176, 55,128, 37,224,
-204, 77,171,233,159,120,231, 55,111,254,153,191,116,215,250,215, 95,232,196, 49, 78,224,156,195, 10,129,157,121, 75,233, 64, 58,
-231, 91,215, 4,236,231,198,254,235, 79, 29,124,230,167, 62,178,243,203,159,126,102,248,159,128,103, 67,230, 96,124, 18,208, 23,
- 55,238,194, 22,182,176,133, 45,108, 1,234,175, 92, 52, 43,128, 4,104, 1, 93,224,204,106, 59,122,235,215,223,210,254,250, 63,
-255,150,213,183,191,229,124,243,236, 74,170, 90,173, 72, 36,145, 20, 82, 91,220,200,216,242,184,180,163,199,118,198,187,239,255,
-228,193,239,253,246,165,193,199, 46, 31,149, 15, 1,207, 1, 61,124, 13,253,186, 61,233, 11, 80, 95,216,194, 22,182,176,133, 45,
- 64,253,149, 1,245, 26,216, 37,144,226, 83,242, 77, 60,163,126, 21,216,106,166,114,173, 17,201,110,172, 68,162,173,211,185,118,
-253, 81, 97,246,157, 99, 7,159, 98,239,225,235,230, 67,158,159,168,183, 0,245,133, 45,108, 97, 11, 91,216, 2,212, 95, 65, 80,
- 63, 9,238,113,136,222,235, 71,196,100,250, 58,132, 8,188, 10,143, 50, 0,185,126, 62, 48, 95,128,250,194, 22,182,176,133, 45,
-108, 1,234,175, 30,168,159, 4,248, 26,228,235,175,179,160,238,102,190,190, 40,148, 94,128,250,194, 22,182,176,133, 45,236, 15,
-155, 69, 95,230,247,119, 51,192, 93,131,252,236,239, 22,182,176,133, 45,108, 97, 11, 91,216,151, 26,169, 47,108, 97, 11, 91,216,
-194, 22,182,176,175, 44,147,139,143, 96, 97, 11, 91,216,194, 22,182,176, 5,168, 47,108, 97, 11, 91,216,194, 22,182,176, 5,168,
- 47,108, 97, 11, 91,216,194, 22,182,176, 5,168, 47,108, 97, 11, 91,216,194, 22,182,176, 5,168, 47,108, 97, 11, 91,216,194, 22,
-182, 0,245,133, 45,108, 97, 11, 91,216,194, 22,182, 0,245,133, 45,108, 97, 11, 91,216,194, 22,246,234, 88,244,189,127,252, 46,
- 39,133,244, 10,108, 66,120,245,151,240, 63,175, 4, 35,252,164,180,201,215,249,159, 93,207,124,255,187,155, 40,211, 57,231, 38,
- 42,111,254,223, 98,230,121, 39, 21,224,228,220,207,102,213,237,174,215, 87,127,218,115,103,191, 23, 66,160,132, 37, 86, 18, 37,
- 98, 34, 37, 16,202, 33,227, 24, 41, 51, 86, 55,110,230, 13,111,251, 22,214, 54, 55,185,227,117,183,241, 31,254,211,127,224, 39,
-255,215,159,228,169,167,158, 34,138, 34, 90,205, 22, 89, 26, 19, 69,130,181,213,117,182, 54,206,242, 23,127,224, 7,248,238,239,
-249,118,112,134,159,248,135,255, 27,255,224, 39,126,130,102,187, 77,140,160, 29,199, 68,177,100,101,125,153,170,200, 89, 95, 91,
-195,152,146, 72, 66,154, 54,144, 66,208, 72, 50, 4,130, 52,142, 81, 73,202, 19, 79, 62,201,239,124,244,163,108,116,187,156,219,
-220,224,150, 11,231,248,212, 35,143,112,215, 91,223,202,241,209, 49, 31,254,216,199,105,116,218,228,121, 14,165,230,204,198, 38,
-171,171,203, 52,155, 25, 27, 27, 27,156, 59,127,145, 55,188,249,173,172,174,159,101, 56, 46, 56,218,223,101,255,240,152,227, 94,
- 15, 41, 21,121, 81, 80, 86,134,162,172,104,118, 58, 52,154, 93,140,145, 24, 43, 24, 15,118,185,185,107, 57, 39,143,105,187, 17,
-149, 5, 99, 29,198,128,214, 22,173, 29,149,177,104,109,208, 90, 99,172, 65, 91,139,117, 14,109, 29,214,185,160, 32, 36, 48, 86,
-224,194,181,119,128, 19,128, 16,126,125,137, 20,135,195, 90,141,181, 22, 99, 1,149,210,200,150,104,181,151,104,100,109,178, 86,
-135, 36,109, 18,197, 9, 82, 66, 36, 64, 10,135, 16, 18,164, 36,138, 34,162, 40, 38,142,147,201, 35, 74, 26, 68, 73, 70,210, 72,
- 73,146,132, 40,137,137,211,148, 40,142,144,145,194, 41, 57,183, 54,234,127, 91,107,131, 4,146,195, 89,235, 39, 6, 26,131, 51,
- 22, 93,105,172,209, 56,163, 49,218, 96,140,193, 88,227,159, 99,173,127, 62, 6,235, 76,248,222,191,134, 53, 6, 29, 94,131,176,
-238,157,115, 88,103,177,198, 98,234,191,117,118,242,179,250,189, 9, 15,107, 29, 22,139, 51,254,245,140,213, 96,131, 78,147,115,
-254,125,173,245,239, 91,255, 93,248,252, 29, 2, 68,132,144,138, 56,110,144, 54, 90,164,105,147,164,209, 36, 73, 82,162,212,127,
- 62, 42,138,137,227,136, 88, 41, 98, 9, 73, 44,105,196,130, 36,141, 81, 73,132, 76, 36, 50, 18, 72, 9, 50,232, 68,137,233, 14,
-128, 16, 10, 34,127, 77, 80, 10, 68,236, 47, 51, 14,225,252,215,250,217, 0,198, 89, 28,154,157, 71, 63,205, 7,255,233, 79,114,
-248,200,103,217,217,219,103,187,159,179,177,188, 74, 35,141, 40,139, 49,199,199, 71,180,178, 38,227, 81, 65,179,217,161,223,207,
-113, 88,138, 60,199,148,154,102, 42,217,218, 92, 70, 23, 35,150,151, 58, 44,183,218, 72, 32,203,154,108,157, 57,199,246,222, 30,
-170,209, 0,165,136, 4,108,108,174, 83, 86, 37,253,225,144,189,131, 3, 68, 20,177,127,120,196,202,218, 26,113,146,176,177,182,
- 78,146, 36, 28, 30, 28, 34, 35,133,144,138,237,221, 29,127,253, 4,180,150,150, 56, 26, 12, 72,155,109, 16, 17, 69,161, 89,106,
-119,217,189,122, 25,129, 33, 75, 21,131,222, 49,194, 90,186,157, 46,177,140, 17, 86, 83,233, 10,237, 44, 81,146,128,131, 98,156,
- 19, 73,137,144, 18,227, 12,157,118, 27, 93,105,156,117, 88,173,145, 82, 82, 85, 21, 8,139,181,134, 78,171, 69, 35, 77,200,243,
- 49,121,158,227,128,213,149, 21, 28, 10,149,102, 12,242,146, 50, 31,147,197,138,225,209, 62, 43,237, 6,111,122,205, 45, 36, 81,
-196,225,225, 49,253,254, 0,128, 86,171,205, 51,207, 60, 75,123,121, 25,149,196,140, 43,205,110,127,192,200, 41,218,155,103, 73,
-187, 43,228, 56,172,148,224, 64, 88, 17,214, 83,173, 11,102,195,186,114,215, 72,130, 73, 89,239,175, 4,252,240,216, 80, 47, 71,
- 33, 64, 34, 16, 98,250,144, 82,206,125,173,239,199,147,223, 35,252,123, 58, 28,198,186,176, 95, 56,140, 11,235,222,223, 10,216,
-153,251,203, 57,255,123, 23,246, 36,103, 29,198,218,240,152,254,219, 26,135, 53,150, 82, 87,104,235,208,214, 80,105,127,223,234,
- 74,227, 12,225,254, 12,175, 61,139, 97, 66,133,123,240, 26, 16,194,137,235,171,166, 77,238,141,240, 57,248,207,111,230,179,144,
- 32,195,191, 39, 95,235,127, 11, 17,182,208,217,207,146,185,251, 75, 8,129, 49,134, 72, 73,133,148,242, 26,176, 60,109, 3,188,
-209,191, 79, 57,133,107, 64,119, 22,192,173,157,190,134,115,243,224,239,127,198,220,207,102,223,243, 36,200,207,254,253,201, 99,
-154,253,157,113, 2, 97, 5, 22,139,113,194,143,118,197,160,148,165,213,238,160,203,146,131,221, 93,236, 29, 55,243,185,207, 62,
-204,219,223,254,141,244,122, 3,122,189, 30,149,214, 72, 1,198, 56,148,146,220,122,243, 77,216,124,204,149, 47, 94, 98,105,185,
-195,159,248,227,223,194, 63,249,103, 63, 3, 82, 33, 17, 84,198, 48,202,135, 36,205, 20, 97, 13,131,126, 31, 21, 9,146,102, 3,
- 99, 52,113,218, 96,156,143, 17, 14,202, 92,210,234,192, 99,143, 63, 78, 85, 20, 56,224,230,155,111, 34,137, 21,183,220,116, 1,
- 99, 12,218,106,138,170, 98,255,234, 14, 82, 10, 98, 4,151,183,175,162, 34, 73,179,149, 97,157,191,225, 70,195, 33,103,207, 69,
- 28,247,122,104,237, 39,210, 38, 73, 2, 8, 50, 41,169,244, 16,107, 44,189,222, 49,121, 89,161, 84,131, 36,109,146,165, 77,140,
- 43, 25, 22, 14,171, 43, 42,231, 2,168, 91, 42,109,209,149, 69,155,176,240,173,197,134, 27,196, 34,176, 4, 80,119,224,156,191,
-118, 82,248,205, 75, 42,137, 16, 97,113, 74,133,146, 17, 66, 10,156, 83, 24,227,175, 73,156,117,104,117,214,104,181, 87,201,218,
- 75,180,187, 75, 52,178, 22,113,156, 32,165, 64, 56,131,213, 26,167, 43,127,158, 56,164,148, 40,165,194, 6,226,127,175, 41,113,
-214, 98,180, 38,170, 98,180,214, 19,128,151,113,132, 84, 10, 21, 69,147, 13, 3, 1, 66, 73,175, 85,108,167,107,201,249,157,130,
- 56,181, 56,107,112, 86,227,156, 7, 94, 59,243, 28,255,240, 27, 73, 13,202, 19, 96,175, 65,126,238, 57,225,115, 10,160,110,172,
-241,155,140,214,216, 0,222,214,214, 95,131, 19, 97, 12, 46,124,239,172, 63, 30,107, 29,214, 85,254,123, 51,243,254,225,186, 88,
- 52,198,150, 56, 35, 40,109,137, 49, 99,202, 50, 37, 26, 39,196,113,138,140, 26, 68,113,140,138, 34,162, 40, 34,150,130, 88, 65,
-150,198,180,179,152, 86, 51, 37,201, 82,162, 42, 66, 68, 2, 39,241, 91,171, 11, 87,219, 9,132,144, 8, 21,121, 48, 87, 49, 66,
- 41,132,148, 19,231,205, 9, 57,183, 15, 56, 43, 17,182,226,232,185,207,241,203,255,228,239,115,245,145, 47, 48,222,239,113,124,
- 52,162,213,234,144, 70,160,139, 17,199,135, 71,100,141, 6,229,184,196, 84,142,203,207,238,146,164, 41, 8,129,213, 2,103, 29,
- 75, 75,109,156,179, 52,178, 6, 43,203,203,228,195, 17,157,118,155, 70,179,201, 81,175, 71, 94,150, 40, 4, 81,154,208, 89,234,
-114,120,116, 68,101, 44,189,193, 0, 17, 55, 56, 30, 12,136,179, 22, 82,197,180,154, 25,227,241, 16,171, 43,142,143, 14, 57,119,
-225, 2,251,135, 7, 36,113, 76, 37, 53,163,113,129, 27,107,180,137, 72, 93,130,117,150, 36,137,120,238,153, 47,210, 74, 34,172,
-169,232, 29, 30,209,206, 50, 34, 41, 25,245,143,201,210,140,210,104,172,117, 68,113,140, 67, 16, 39, 41, 73,146,145,168, 24, 25,
- 9,170, 42,167,170, 42,172, 53,164, 73, 76,214,109,162,164,223,188,149,242,155,187,181,142,162, 40,105, 52, 26,140,199, 57,237,
- 86, 27,173, 53, 14, 75,127,156,147, 53,219,180,150,151, 72, 36, 8, 91,113,176,191,195,206,206, 30,237, 86,147, 91,111,189,141,
-253,221, 29,246,118,119,177, 85,193,109, 55,157,167, 55,206,201,203,130, 72, 42,150,154, 25, 54, 47, 25, 29,237,147, 54, 26,108,
-109,110,146, 59, 15,148,224,193,221, 5, 64,119,206, 33, 17,211,123, 99, 6,208,230, 64,102, 22,189, 38, 0,232,239, 45, 78,252,
- 94, 4,160,226, 84,176,242,206, 65, 45, 28,238,156,195, 88,131,117,210,239, 59,206,175,243,217,123,202,225,252,239,235,251, 43,
- 96,140, 49, 53,152,251,123,203, 24,137, 17, 22, 43, 44, 70, 8,164, 0,109, 44,218, 10, 34, 33, 49, 74, 97,164,194,134,253,160,
-126,237,201,191,157, 99,226,174,214,120, 22,254,231,159, 89,255,216,205,161,249,244,220,221,228,124, 65, 32,164, 64, 5,240, 22,
-194, 59, 73, 82, 42,164, 20, 40, 33,231, 64,126,178,109, 9, 57,247, 26,254,221,124, 80,110,141, 36,154, 5,201,107,190,226, 23,
-215,181, 7, 86, 71,244, 55,136,212,153,223, 36, 79,130,182,148,226,154,232,122,250, 60, 49, 1,251,231,119, 30, 78, 7,127, 78,
- 89,116,206,129,177,222,239,244,128,110,193, 25,178, 88,209,235, 15,216,189,242, 28, 34,142, 57,216,187,157, 44,107,113,101,103,
-135,111,248,134,111,228, 35, 31,249, 16,206, 9, 84,156, 96, 77, 65, 49, 30,147, 40, 5,186,100,176,191,203,232,112,151, 91, 47,
-190,134, 55,188,254,117,124,230,225, 71,192, 73,108, 85, 81, 85, 21, 59,123,123,156,219,216, 0, 4, 74,197, 56,235, 64,134, 8,
- 17,208, 70,227,144,148,101,193,234,114,135,222, 97,202, 29,183,221, 76,171,153,129,179,108,109,108,144,143,114,158,121,230, 25,
-110,185,229, 38, 46, 93,185, 74,175, 63, 4, 37, 24, 85, 21, 81,164, 40,138, 2, 1,140, 70, 67, 6,189, 30,186,204,105, 36, 17,
-107,107,107,200, 40, 33, 29,141, 24,142,198,184,178,162,209,104, 80, 85,134, 92,151,244,123, 71, 44, 45,175, 33,164, 99,121,117,
-131,182, 40,233, 95,185, 74, 94,150,104,107,176,206, 97,140,243,139, 94,123, 15, 87, 27,135,182, 22,227,240, 32, 18,226,183, 58,
-211, 3, 32,133, 2, 33, 81,202, 3,169,140, 34, 15, 32, 74, 17,201, 24,169,188,119, 93, 25, 71,170, 82, 26,237, 53,218, 75, 27,
- 52, 59,107, 52,187,171,116,151,150,201,154, 25, 73,146,160,148, 4,103, 49,101,137, 30,143,168,170, 10,173, 75,176, 6, 33, 65,
- 40,127,243, 59,204,228,122,234,210,133,232,186, 66, 23, 57, 81, 28, 19, 37,254, 17, 39,137,143,198,148, 66, 40,233,211, 8,181,
-119, 45,220,116,245, 42, 23,214,168, 68, 16,207,175, 47,231, 38,235,219,175,189, 0,230, 64,240,108,230,129, 63, 68, 56,147,173,
-208,185,233, 90,180,206, 3,119, 0,115, 99, 60,200, 99, 45,214,106,116,216,248,107,160,183, 38, 56, 0, 86,251,231,107, 51,117,
- 6,180,193, 24,141,181, 21,218, 84,126,195,179,214,191,175, 41,169, 76,129,209, 57, 66,230, 40, 21,161,164, 34,138, 36,177,148,
- 52, 98, 73,100, 82,140,139,177, 34, 67, 8, 13, 78,129,241, 27,143, 63,190, 50, 56, 57, 32,164, 66, 70, 9, 68,145, 7,245, 72,
-249, 1, 14, 66,130, 84, 56,233, 35,248,250, 19, 85, 8, 6, 59,207,242,171, 63,243,143,216,255,252,167, 25,236, 30, 51, 44, 28,
- 42,137, 72,163, 10,103,198,236,108, 31,178,178,210,161,204, 13,182,130,222, 81, 78, 51, 75,208,214,175,151,124, 92,178,212,109,
-144,101, 41,174, 42,105,119,218, 24, 99, 72,211, 20,127, 55, 11, 70,227, 49,214, 65,172, 20,105,218,192, 88, 75,169, 53, 71, 61,
- 15,228, 71,189, 62,165,241,107,119,163,217,162,209,136,209, 69,197,104, 52,228,204,214, 38,101, 81,248,135,209,236,247,142,233,
- 46,175,163, 13, 44, 45,111, 82,148,222,145,186,114,229, 73,218,141, 24, 87,121, 71,179,149,196,148,227, 17,173,165, 46,235,231,
-207,130,133, 60, 56,185,227,113,137,181,254,254, 41,243, 18, 65, 78, 35,139,137, 99,193,242,114, 23,156,165,217, 72,145,206, 82,
-149, 57,227, 81,159,238,114,151,202, 24,172, 80, 12,181,166, 40, 74,210, 36,163,219, 93,198, 97, 73,146,132,210, 88,226, 52, 67,
- 8,193,120,112,204, 82,183, 75, 51,146,148,218, 34,162,132,199, 30,127,130,215,222,113, 27,105,146,176,187,125,213,191, 79,154,
- 98,140,102, 92,142,105, 54, 50, 10, 45,144,206,112,124,245, 57,186,157, 38,155,155,155,148,218, 7, 60,224,131,159, 58, 43, 52,
-235,244, 90, 55, 93,227, 19,199, 77,204,160,219, 36,112,115,156,132,137, 9, 24,213,192, 77, 13,100,181,243,239,127, 39, 67,150,
- 15,225,157, 73, 37, 21,214,133,251,197, 74,140,116,254, 30,145, 76,157,102, 8,193,133,119,168,141, 1, 45, 12,210, 88, 36, 2,
-131, 65, 98, 81, 66,224,164,192, 74,133,150, 18,171, 44,198, 42,159, 13,112, 22, 99,108,184,141,235, 96, 37,100,217,236,244,125,
-166,160, 62,123,238,117,162,109,234,244, 76, 48, 44,252,207,103, 48,175, 5,117,165, 20, 4, 80, 87, 74,162,164, 66,224,113, 82,
-138, 41,168,203, 25, 60,155,126,244, 2, 51, 1,117,227, 65,253, 26,143,107,226, 73,213, 62,201,233,169,247,235, 97,109, 8,116,
- 48,115,233,118, 55, 23,197,207, 30,216,181,224,125,253, 72,253, 26, 82, 64,200, 50, 60, 95, 90,190, 6, 29,231, 19, 68, 56, 81,
- 71,100, 22, 17,202, 15,227,254, 62,253,113, 73, 49,206,209,218,176,185,185,197,127,248,229,127,235,211,129,205, 14, 90,171,201,
-245,211, 85, 73, 22, 71, 84,195, 33,105, 26,147,198,138,111,250,198,111,224,119, 63,241,113,218,173, 14, 69,233,111,102,161, 45,
- 79, 60,113,137,115,103,182, 56,115,118, 19, 99, 28,113, 34,113, 56,198,227, 33,206, 58, 98, 21,147, 57,203,157,175,185,157, 51,
-235, 43,172,116,151, 16,194, 71,201,207, 93,185,204,198,218, 58, 55,223,124, 11,131,162,228,145,103,158,197, 74,208,206, 17, 11,
- 65,179,217,164,209,240,209,255,120, 52,164, 44,114,242,241,136,172,209,196,152, 34,128,160, 79,237, 1,116, 58, 29,148,138,201,
-171,138,188, 24, 83, 22, 67,132,140, 24,136,132,173, 51,235, 28,148, 32,198, 37,198,249,205,219,123,198, 76, 0,222, 24,139,161,
- 78,121, 77,197,251,165,240,145,154,148,146, 72, 37, 40,165, 60,136,199, 49, 81,164, 60,136, 40, 69,162, 34,164,130,202, 56,132,
- 21,164,217, 18, 89,119,157, 86,119,141,102,119,157, 86,119,149,230, 82,135, 70,214, 32,109,164,196, 81,132, 4, 76, 89, 97,203,
- 49,101,145, 83, 22, 57, 90, 23, 24, 93, 98,173,241, 11, 91,168,233,226, 11,215,214, 26,131,113, 62,205,166,171,138,168,140,168,
-146,210, 71,169, 73,140,138, 35,239, 21,215,107, 81,156,178, 86,133, 63,215, 73,116, 31,126, 56,235,236, 34,102,252, 1,230,255,
-237,194, 77, 87,223,251,179,158,189,113, 34,164, 16,103, 35,125,139, 49, 6, 38, 81,121, 29,129,107,156,177,193, 1, 48, 1,212,
- 45,166,210,147,136,222,104,237, 35, 57,173,209,166,242,231, 29,126, 94, 71,254,214,134,148,164,209, 96,181, 7,109, 37,176, 50,
- 66, 90, 9, 22,172,145, 24, 13, 82, 69, 56,132,191,143,141,241,160,110,124,186, 88, 8,133,141, 98, 68, 20, 35,226, 8,169, 34,
- 31, 85, 9,137,144, 49, 78,250,235, 33,164,255,219,241,232,136,255,248, 47,238,231,139, 15,125,156,193,229, 61,138, 42, 70, 75,
- 69,154,105, 98, 85,176,115,117, 64,183,213,164,202, 75,138, 81,197,160,175, 73,227, 8, 37, 37,149,118,140,243,146,102, 83,113,
-246,236, 42,184,146, 36,141,104, 54,155, 84,121, 65,154, 68,168, 72, 49, 42, 10, 6,249,152,172,213,166,212,154,150, 84, 88, 96,
-123,119,151,180,213, 97,231,224,144,164,213,230,232,224,128,219,111,191,131,241,120, 68, 51,105, 19,197, 49,121,175,199,210,210,
- 50,151, 30,123, 28, 99, 13,253,209,136, 82, 64,211, 66,183,187, 68,127, 48, 2, 28,189,195, 93, 26, 73, 76, 51,137,177,227, 17,
- 70,151,180,178, 46, 91, 27,155, 88,237,203, 52, 82, 74,156, 80, 32, 4, 75,203, 25, 69, 94,160,164, 34, 75, 83,226, 36,102, 52,
-232,211,110, 54,201,210,132, 98, 60,194,150, 57, 73, 26,177,117,110,139, 52, 58,203,104,112, 76,127,152, 83, 26, 65, 20,199, 52,
-178, 54,214, 88, 70,227, 28, 41, 44, 90,151, 24, 7,186,170,168,180, 65, 9, 71,169, 53, 89,146,160,157,193, 2,113,163,193, 51,
-151,175,114,211,197, 11,244, 7, 62,219,152,196, 9,171, 43, 75,140,139,146,203, 59, 59,180,155,109, 92,101, 72, 34,197,238, 51,
- 79,210,237,180, 89,238, 46, 49,174, 44, 90,128, 67,250, 12,145,153, 70,160,206, 90, 36,206,239,159,118,230, 94,113,204,148,127,
-220, 76, 26,222,157, 90,165, 21,167,196,132, 39, 35,118, 41, 4,126,183, 17, 8, 7,114, 18,185,251,123,204, 9,137, 18,117,118,
-208, 97,112,200, 16,161, 91,233,166,211,194,156, 47,223, 73, 43,188, 19, 44, 28, 2,137,117,190, 28,107, 39, 41,123, 31,108,217,
-153,168,220, 90,235, 51, 3,115,101,180, 16, 27,187, 19, 25,235,218,177,176,179,251,136,131,217,232, 93,158, 8, 54,235, 20,123,
-112,108,164,146,147,180,251, 92,164, 78, 56,127,102,157,162,169,153,240, 4, 99, 36,145,156, 73,148,203,107,106, 30, 83,224, 62,
-153, 38,247,207,151, 51,145,185,155, 7,210,176,225, 27,227,107,144,245,215, 41,152, 79,107, 9, 53,224,204, 58, 5, 32,230, 54,
-215, 27, 1,187, 16,194, 3,168, 16,215,164,249, 79, 47, 27,132,207, 86, 8, 92,248,249,197,243,103,233,102, 41,191,243,208,167,
-216,190,122,153,172,153,113,233,243, 95,100, 56, 26, 33, 68,184,184,198, 96,109,197, 48,207,249,252,195,143,240, 45,111,255,122,
-246,182,247,105,102, 49, 42,125,130,111,122,219,219,248,135,120, 16, 81, 82, 33,140, 99,169,213,101,167, 63, 96,111,111,143, 78,
-183,141,106,103, 97,243, 54, 8, 33,136,226,136, 98,156,211,239, 91,148, 18, 36,113, 68, 94,140, 73,162,136, 34, 47, 24,229, 99,
- 74, 93,146,101, 41,133,115,100,141,148,209,184, 0,160,187,212,101,117,109,157,162, 24,161,181,166,170, 10, 70,163, 1, 79, 94,
-186,196,214,217,115,200,168,193,217,179,103, 41,203,138, 43, 87,175, 82,148,165, 79,165, 73, 73, 36, 99,210,216, 80,148, 35, 70,
-163, 1, 85,169, 24,173,172, 82,184, 8, 93,250,141,187,190, 6, 46, 56, 89,214,129,149,179,252,139,233,162, 83, 50,154,164,182,
-149, 18, 1,220, 35,146, 56,246, 41, 94,165, 2,208,199,126,115, 16,150, 72,165,164,205, 14, 89,107,153,102,123,149,102,103,133,
-102,103,153,172,221, 34,105,196,164,105, 76,164,188,199, 26,197, 9, 52, 18, 26,182,229, 55,181,170, 68,235, 18, 93, 22, 24,163,
-113,198,129,157,174,221,185, 18,141,181,152,144, 66, 51,198, 80, 21, 37, 82, 41,162, 52, 33,142, 35,159, 81,168,215,161, 60, 81,
-198,145,211, 90, 24,115,217,163,240, 28,121, 58,152,139,144,193, 16,242,250,235, 28,161,166, 30,189, 15, 67,230, 75, 0,147,180,
-186,131, 80,127,175,211,236, 30,216,235,116,125, 29,229, 79, 35,119,163,125, 93,214,104, 31,249, 27,163,253, 87,109,176,166,162,
-170,124,164, 47,112,164,145,160, 17, 11, 26,141,132, 40,149,200,196, 19, 25,156, 4, 43, 8, 5, 22,227,211,139,194,133,124,170,
-197, 25, 3,174, 66, 88,133,141,164,231, 45, 72,137, 19, 17, 66, 40,148, 0,116,137,176, 21,191,249,111,127,142, 75,191,255,219,
- 28,111,239, 83,244, 45, 70,129, 72, 44, 89, 26,115,116, 48,166,221,202,144, 66, 48, 24, 20, 12, 6,150, 40, 86, 24,231, 24, 23,
- 21,163, 66,211,105, 39,172,175,182,193,149, 40, 89,215,247, 5, 74, 70, 72, 25,129, 80,140,243, 28,164,162,172, 52,205,102, 19,
-231, 28,207, 60,123, 25,149,164,244, 6, 99,210,172,197,209,241, 49, 43, 43, 75,100,169, 98,117,249, 12,101,145,115,120,116,196,
-202,218, 6, 79, 63,123, 25, 21, 69,140, 6, 5,198, 10, 26,237, 14,113,218,100, 92,228, 36, 73, 68, 62, 28,208,109,183, 16,174,
-194,153, 2,131, 99,235,236,121,148, 80,140,242, 10, 28, 88,171,105, 52, 82, 84,154,226, 28, 12,135, 35, 26,113, 68,179,145,176,
-180,188, 68,163,217,160,219,186,157,222,225, 1,253,222, 49, 55, 95, 56,207,214,250, 10,197,104,200, 51, 79, 61,137,169, 74,202,
-106, 76, 94, 89,140, 76, 17, 42, 99,123,255,144,193,113,143, 52,137, 89, 89,238,208, 78,155,232,162, 96, 48, 28,225,128,102,179,
-137,138, 34,140,115, 84,101, 73,127, 92,144, 53, 26,196,141, 6, 99, 99, 89,218, 58,135,141, 27, 84,195, 1,214, 64,183,221, 65,
- 27,195,206,193, 17, 89,218, 96, 88,140,137,226, 6,143,127,246,243,124,237, 55,124, 3,141, 88, 49,170, 52,218, 5,110,132,148,
-152,186,140,228,175,252,196, 97,245, 32,230, 2,113,102,126, 15,159,163,122, 92, 3,222, 76, 56, 87, 66, 76,131, 3, 55,243,123,
- 33,166,206,132, 13,120, 98, 77,248,254,132, 35,125, 50,211, 44,132,240,206,135, 19,128,242, 72, 43, 44, 2, 21, 2,108,131,115,
-114,230,126, 83, 83, 7,123, 38,195,102,103,178, 19,117, 26,222, 57, 57,117,207,221, 52,106,247,153,130, 19, 37, 58,235, 38,216,
- 88,167,200,103,203, 21, 98,166,110, 46,164, 8,145,186,242, 17, 60,245,207,165,255, 93,240, 82,164,144, 33,144,153, 9,140,133,
-192, 9,143,183, 81,189,201,159, 44,218, 43,165,106,202,205, 53,155,228,105,233,240,217,159,121,242,145,247,100,106,176,173,127,
- 62,253,222,191, 71,253,254,243,155,158,120,193,160, 94,127,120, 39,121, 1,179,209,255,244,216,166,155, 65,189,112,100, 36,113,
- 86,211,106,166, 60,240, 43,255, 1,210, 22,189,163, 67, 86,151, 87,124,122, 92, 23,128,165, 44,115,138,178,160,217, 76,168,180,
-225,173, 95,247, 54, 90,221,101, 14, 47, 63,133,176, 45,142,119,246, 88,218, 88, 39, 18, 48,236,245,104, 40, 31,101, 38,113,194,
-242,242, 10, 56,239,193, 91, 99, 41,203, 2, 41, 5,121, 62, 66, 10, 69, 26,135,180,216,112, 68,150,166,140,134, 57,135,123,251,
- 36, 73,202,198,198, 26,253,126, 31,139, 96,191,215,167, 24, 23,126, 24,189,144,116, 91,109, 14, 15, 15,105, 54,253,223,215,105,
-154,245,245, 53,150,150,186, 12,199,158,140,214,110,183, 88, 91, 91, 99, 52, 30, 51,206,139,224, 80, 73, 4,138,141,141,117,118,
-118,123, 24,227, 24,140, 74, 68,154,144, 91, 67,228,212,164, 46, 94,187,125, 74, 8, 63,214, 79,212,159, 99,120, 29, 33,144,210,
- 71,226, 82, 73,164,242, 41, 35, 37, 37,113, 72,187,251,133, 43, 39,112, 39, 85, 20,136,109, 45, 26,205, 14,141,246, 18,173,246,
- 10,205,118,135, 44, 75,137, 26,138, 40,246,192, 32,156,196,213,127,239, 18, 18,151,134,122,178,193,232, 10,163, 43,108, 85,249,
-239,237,148,116, 54,113, 66,221,204,109,101,125,164,235,140,198,234, 18, 29,136,119, 34, 82, 68,161, 76, 32, 84, 13,240, 18,233,
-252,205,118,178, 76, 53,189,153, 66,157,108, 6,156,231, 86,155,112,193, 57,246,219,225,228,111,133,207, 22, 77, 51, 78, 30,228,
- 61,201,172, 94,255,245,177, 91,239, 84,212,117,206,153, 58,253,164,182,104,102,136,115,147,186,188,243,209,189,118, 88,227, 48,
- 85,229,129,191,170, 2,200, 87, 56,163,137,165, 35,139, 5, 89, 18,145, 52, 36,113, 26,121,130,156, 18,224, 44,206,106, 80, 18,
-108, 4,206,151, 10,132, 53,147, 40, 68, 40,135,147, 6,132, 13, 27,158, 5, 39,144,214, 66, 57,226,119, 31,252, 32,159,254,173,
- 7, 57,124,106,155, 97,191,242,159,171, 42,232,180, 82, 70,189,146, 70,220, 4,231, 24, 12, 11, 6, 35, 71,146, 38, 56, 4, 69,
- 89,162,141,165,221,142,105,119, 98, 90,237, 4, 73, 69, 85, 22,156, 93,223,244,196,179, 40, 38, 73, 82,140,181,244, 7, 67,154,
-221, 14, 73, 35,197,226, 56, 58, 62,162,210, 26, 27, 69, 88, 4,123, 7,135, 84,186,228,226,185,155,169,198, 3, 6,210,208,108,
- 47,131,244, 14, 68, 20,167, 24, 4,134, 49, 43,107, 27,104, 25, 19, 69, 9,206, 25,156,201,137,148, 33, 17, 18, 97, 99, 74, 93,
-177,182,190,201, 56,175,104, 54, 27,104,107, 41,138,156, 52,141, 25,230, 37,173,198, 18, 43,221, 14,141,141, 77,132,213, 40,233,
- 73,130,203,221,140,149,229, 46,205, 88,176,181,182, 76,162, 36,229,104, 72, 57, 26,177,181,182,206,112, 56,160,212, 41, 29,145,
- 80,136,152,227, 97,193,234,218, 58, 23,111,186,137,118, 51,195, 85, 57,237, 44, 35,207,199,244,135, 67,178,102, 19, 21, 37, 40,
- 21, 51, 30, 15, 89, 95,105,145,231, 5,221,110,151,126,191, 15,141, 22,206, 90, 84,101, 16,206, 81,141,135, 84,101, 69,167,221,
- 97, 92,106,198,101, 69, 22,199,158, 67,163, 53,159,252,248, 39,120,203,215,127,131,223, 79, 43, 61,225,151, 88, 27,106,212,182,
- 38,161,205,112, 70,102,234,203,215,236,205,156, 66, 40,171, 1,109, 82, 83,247, 0, 44,157, 69,216,249,108,241,228, 62, 10,165,
-190, 41, 96, 6,127, 58, 68,232, 46,160,255,148,215, 51, 3,204,194, 77, 50,102, 82,133, 96,206,186,153,104,123, 38, 5, 96,231,
- 3, 66, 79,144, 11, 64,125,130,228, 61, 11,234,179,239, 55, 91,127,247,100,218,153,140,241, 41,251, 72,141,125,158, 7, 60,253,
- 94, 49, 19,100, 75, 1,115,193,182,156,255,156,164, 15, 80,141, 49,126,143,174, 65,177,206,217, 79,210, 1,147, 52,136, 12, 76,
-102, 55, 97,190,214,185,252,147,192, 62, 33,186, 5,210, 78,164,252,135,101,165,196,104, 61,185, 56,158,128, 97, 61,121, 42,128,
- 59, 76,107, 43,243,142,194,137, 15,242,100,170,223,147, 84, 39,243, 91,235, 69, 54, 95,203,241, 27,171, 68, 18, 73,159,182,145,
- 82, 96,133, 96,109,109,131, 94,111, 68,111,208,103, 41,107,179,191,191, 71,111, 84,113,229,202, 21,159,102,196,161, 77, 5, 8,
-250, 3,205,230,230, 25,198,163, 49, 42,242, 17,222,241,241, 17, 14, 80,237, 22, 27, 43,107, 60,122,233,105,218,235, 29,156,177,
-196,113,194,198,198, 38, 82,216, 64,128,240, 17,133, 53,154,170, 40,105,100, 25, 73, 35,193, 25,141, 36,243, 44, 95,173,185,186,
-179,203,112,148,179,188,220,225,226,133, 11, 36,113, 66, 99,156,227,140, 65, 1,177,148, 44, 45,117, 88, 93, 89, 38,142, 21,113,
- 20,211,202, 50,146,200,131,107, 28, 69, 36, 13,197,112, 84,144, 23, 5,205,102,147,213,149, 85,158,187,178,237, 63, 87,235,136,
-100,228, 29,139, 72,121,114,146, 46,200, 90, 45, 70,113,131,216, 5, 71, 75,169,105,221, 8, 25, 60,197,154,113, 45,103,202, 52,
- 51,145,238, 76,237,135, 57,110,133, 13,233,114, 95,111,143,162,132, 52,109,145,100, 45,178,102,155,172,213, 36,107,101, 36,205,
-152, 56, 81, 40, 37,112,194, 34,172, 7,118,159, 30,183, 8, 23, 60, 88, 55, 45,161, 56, 83, 65, 93,123, 14,117,105, 95,203,244,
-233,233,105, 45,219, 71, 31, 19, 47,218, 25, 42,107,161,114, 84,194,159,111,148,120,112,143,227, 24, 23,121, 22,185, 16, 34,144,
-254,106, 18, 79, 29, 97,204, 78, 14,158, 43, 43,250,223,203,122, 3,115, 51,222,117,104,240, 16, 51, 4, 79, 23,206, 13,129, 20,
-243, 53,185,192, 41,246, 78,129,231, 18, 99,157,103,237,203,217, 58,191,157,166,252,172,213, 33, 93,234,192,248, 77,217,232,192,
-166, 47, 13, 90,123,112,116,182, 34,141, 4,205, 68,145,165, 49,113, 38,145,137,242,124, 5,225,176,206,224,116,133,211, 62, 93,
-111,173, 70, 88, 27,178, 10,102, 26,117,137, 58, 39, 42,113, 50, 6,103,137,116,201,227,159,252, 44,191,243,193, 7,184,250,197,
-231,168, 14, 75,140, 16,136,200,209,106, 71,148, 69, 73, 68, 66, 81,248,200,169, 55,208, 68, 42,194, 24, 71, 81, 85, 56,103,105,
- 54, 35, 90,205,132, 78, 59,195,154, 10,135, 38,141, 99,202,178, 10,155,180, 39,236, 29, 29, 30,160,226,136, 40,142, 41,170,138,
-102,179,201,209,254, 1,105,171,205, 81,127,128,136, 99,138,124,204,217,115,103,136,149,100,121,101, 21,235, 96,239,224,144,229,
-229, 85, 70,195, 33,165, 54, 24, 11,155, 91,103, 41,141, 1, 98,156, 19, 52,179, 6,197,240, 24,165,192, 84, 37, 10, 69,154, 52,
- 40, 10, 77,171,221,101, 52, 42, 60,233,174,211, 0, 12,157,118, 43,240,111, 42, 76,169,105, 53, 18,182, 54,214, 25,151, 62, 93,
- 63, 30, 14, 72,227,152, 36,203,232, 29, 31, 33,173,231,110, 12,250,125,210, 52,163,179,180,194,179, 87,118,104,116, 91, 92,221,
- 59,228,232,120,192,213,171,154, 44,137,232, 54, 19,202,110, 23,231, 4, 7,123,251,140,138, 43, 40, 37, 89, 95, 91,167,153, 37,
-228,121,132, 49,150, 65,127,196,104, 92, 18,167, 13,116, 89,176,113,211, 69,158,248,253, 93,186, 89,155, 60, 31,145, 32, 89, 91,
- 94, 97,123,111,207,175, 45, 43,208,214,160,171,146, 47,124,238,115,220,249,230,183, 34, 69, 68,105,170, 73,198, 7, 12, 56,129,
-195,206,144,211, 44,117,134,221,221, 16,212,103,156,235,122,221,123, 18,138,191,183,172,155,212,211,231, 82,240, 33,194,157,173,
-113,123, 44,112,152, 26, 87,231, 0,183, 6, 86,166,105,115, 59,173,145, 79, 66,198,144,145,147, 51,169, 54,231, 60,176,206,166,
- 24, 92,248,185,229, 90,231,197,157, 60,215,154,180,231,184,134, 80, 59, 9,120,103,238,121,230, 64, 61,212,215, 5,212,228,245,
- 58, 16,242,191,147,160,152,225, 30,120,160,175, 51,129, 1,188,125, 77,221, 90, 27,218, 18,108,128,107,231,235, 15,194,249,200,
-107,174,205, 96,190, 45,232,100,202,101,194, 50, 55,161,206,233, 44, 6, 9,210,120, 6,173,242,155,163, 54, 51,109, 65,174,118,
- 42,148, 39,163, 41,144,210, 77, 60,150,250,125,167,224, 48,243,182, 62,223,129, 10,193,129, 4,180,144, 8,107, 67,132,233,194,
-249, 4,172,145, 18, 37, 20, 17, 2, 37,189, 39, 80, 9,201, 96,172,217,188,112, 27,231,110,190,157,188,178,180, 90, 93,154, 43,
- 77,190,235, 59,191,155, 11, 23,207,243,193, 95,255, 85,180,243, 41,111,165, 18,214,150, 54, 57,123,230, 28,130,138,172, 41, 17,
- 86,225,132, 7,146,181,149, 53,226,100,135,194,129,146,130,210,104,226, 36, 69, 87, 26,147, 23, 52, 26, 41, 81,220, 32,175, 6,
- 36,141,148, 86,187, 9,194, 16, 73, 73, 81, 89,118,143,142,232, 13,135, 28,143,114,132,113,172, 46,175, 50, 26,230,172,173,181,
-104, 68, 17,221, 36, 98,104, 12, 81, 36,232,180, 83, 90,205, 4, 25, 37, 72, 39, 48, 85,129, 41,199,232,178,164,187,188,134, 44,
- 42,242,106,207,183, 97, 89,193,202,234, 58,189,254,136,131,131, 67,226, 56,193, 58,201,104, 8,205,172,141,182, 5, 68, 49,194,
-198, 36,201, 18,137, 40, 61, 97, 35, 92,179,185,245, 60,185,185,236, 52, 95,198,148, 4,226, 9,102,118,146, 23,177, 51,233,181,
- 8,129,144, 49, 82, 38, 68,113,134,138, 27, 36, 73,147, 40,201,136, 26, 9, 50,133, 56,141,124, 43,154,100,194,190,245,209, 95,
-132,196,206, 0, 97, 32,157, 32,144, 54, 70, 98, 67, 10,212,160,181,103,141, 87,149, 70,235, 10,140,158, 16,210,132,155, 73,119,
- 91,231,249, 3,206,131,148,117, 21,165, 22,168, 72, 65,146,160,146, 24, 73, 74, 20,199, 30,232, 66, 4, 47,100, 93, 75,247, 25,
-143,153,140,122,136,108,172,143, 14,228,180,181,211, 9,112,178, 6,119,144,225,239,234,122,254,220,189,228,252,249, 5, 34,242,
-180, 36, 21, 62,103, 89,239, 59, 97,131,171, 9,127,245,247, 74, 38,225, 58, 89, 80,190,174, 45,132,175, 53,226,252, 17, 91,235,
-143,161,217,140,201,178,132, 52,141,136, 26, 17, 68, 10,159, 59,247,209,147, 51, 62,179,129,213, 56, 91,249, 63,180, 33,131, 48,
-195,125,145,148, 96, 35,140, 74,209, 20, 28, 60,254, 5,126,255,193,223,228,242, 35, 79,145,143, 12,214,231,242,233,100, 13, 48,
-126,127,168, 42,223, 85,210, 31, 21,225,115, 20,148,165,111,253,140, 83, 69,150, 42, 90,153,194, 86, 5, 73,171, 73, 62, 46,233,
-116, 59,228, 69, 73,171,217, 36,205, 26, 84, 14,122,131, 17, 75, 43,203,222, 1, 3,122,195, 17, 46, 74, 24,148, 22,153,182, 56,
- 58,220, 99,117,165, 75,167,153, 32,149,100, 84, 24,226, 56,166,217,200,136,163, 8,107, 29, 42,142,176, 66, 5, 98,158, 36,106,
- 54, 89, 94, 89,166,191,119, 5,105, 12,249,120,128,179,142,230,210, 10,227, 81, 65,167,213, 33, 47, 42,156,132,172,149, 1,208,
-206,154, 20,227, 17, 73,148,179,181,186,198,250,242, 42,249,104,196,115,207, 62,141,138, 34,154,237, 22,221,141, 37,202,188, 96,
-255,168,135,174, 12,166,212,140,243,138,181,173, 11,244,122,125,158,123,106, 27, 37, 12,163,227, 67,154, 74, 80, 36, 10, 99, 4,
-177,176,196,194,208, 80,142, 36,202,104,156, 57,207,147,207, 61,135,146,142,245, 86,131,102, 35, 97, 92,105,191, 38, 29,200, 74,
-208, 59,234,209, 89,237, 82, 86, 57, 75,155, 91,152,193,144,102, 20,145,247,250, 44,117,218,228,205, 49,135,131, 62,145,138,104,
-197, 9,189,209,152,252,248,144,203, 79, 94,226,142, 55,188,129, 81, 89, 82,216, 10,165,125,135,137,213, 6, 93,213,109,150,150,
- 50,148,132,132,113,147,246, 51,107,237,196,213,117,206, 33, 13,115, 96, 75,112,118,103,161, 81,214,164, 48, 57,195,236,150, 34,
-236,224,211,250,245, 28, 80,138,217,123,131, 19, 29, 41, 2, 99,231, 9,123,211,192,115,210, 4,118, 77, 97,223,137, 58,136,116,
-115,220, 49, 21,222,204,205, 61, 95, 76,156, 25,231,124,105, 42,240,100,167,164, 58, 55, 79,182,113,194,206,180,122, 79, 83,238,
-190, 51, 40,252, 59,148,177,148,244,153, 79, 31, 4, 73, 16, 46,100, 66,163,153,125,104, 82, 31, 12,159, 65, 84, 71,234,243,233,
-234,185, 30,185, 9,221,254,148, 20,252, 53,160, 30, 72, 83, 82, 32,109,125,113, 66, 43,129,180, 40,229, 38,181, 4, 51,249,176,
- 93,168, 85,219,240,136, 2,152,204,151, 4, 38, 23,228, 68,195,156,147,210,111, 48,194,255,125,228, 57,208, 19, 32,168, 23, 75,
-237,204, 40,225,124,187,139, 16, 56,233,189,189, 60,212,179,210, 70,134, 70, 99,156,229, 96,111,151, 15,126,240, 1,190,240,240,
-103,168,116, 17,178, 10, 49,157,206, 18, 23, 46, 92, 64, 74, 65,146,196,180, 55,215,209,229, 24, 67,131, 86,167,203,153,115,231,
-136, 31,125,130,170, 42,105,180, 91, 68,113, 68, 89,122,214,112, 26,197,181,115,234, 9,214, 74,209,204,154,148,227, 28,227, 4,
- 7,189, 1,159,250,252,163, 24, 28,155,203, 75,188,245,141,119, 18, 75,129,144, 48, 30, 14,104, 52,252,141,107,180,102,235,204,
- 38,221, 78, 11, 37, 5, 90, 27,226, 36,193, 90, 75, 62, 30, 51, 28, 14,112,206,210,233,180,209, 70,115,120,112, 76, 81,150,168,
- 56, 33, 73, 18, 90,173, 22,198, 88,202,188, 32, 82,190,174, 27,199,138,170, 44,161,172, 72, 27, 25,169, 80,147,218,248,201,242,
-137,179,128,177, 88,231, 35,198, 73,198, 38,172, 9,103,197,228, 14,113,225,123, 33,195,239,234, 90,152, 16, 72, 21, 17,199, 9,
- 73,154,146,166, 9,113, 18, 17,199,145, 79,187, 43, 57,195, 75,179,158, 63,237, 0, 33, 39,183,146, 96, 74,228,148,248, 20, 30,
- 66, 16, 57, 71, 20, 0, 59, 14,145,186, 11, 53,101,223,131,106, 38,237, 96,214, 24,164,147, 56,103, 38, 17,125, 77,178,171,202,
- 50,212,168,124,186, 89,186, 4, 71, 52, 77,127, 41,233,183,163, 9,176,214,184,234, 2,123, 55, 84, 31,197,233,192, 61,155,237,
-154,237,246, 8,132, 21,102,182, 30,159,149,152,253,195, 25, 7, 75,212,239,107,167, 41,191, 73, 25,172, 62,207,176, 33,155,170,
-194, 20,154,170,244, 68,195, 52, 81, 40,149, 18,165, 17,178,145, 32, 18, 21,218,212,196, 36, 51, 34,173, 5,155,224,155,119,245,
- 28,243, 89,204,221,141,190, 78,169,132,160,218, 57,228,227, 15,254, 38, 31,251,216, 39, 24,246,199, 20,185, 33,141, 4, 73,146,
-146,196, 49,189,222,104,226,176, 15,199, 85,136,184, 44, 69, 89,161,148, 32,107, 68, 40, 5,205, 44, 69,224,104,181, 50, 70,163,
- 1,105,210,160,172, 52, 74, 68, 12, 71, 5,157,238, 10, 7,135,199, 32, 37,105, 35,101, 52, 30, 17,167, 41,253,193,128, 86,123,
-153,241,200,167,169, 27,105,226,217,210,198,128,243, 90, 17, 90,107, 54, 55,183,120,238,242,101,180, 5,169, 18,116,149, 83,149,
- 37,103,206,158, 67,196, 9,227,193, 49,173, 44,229,224,234, 30, 24, 75,156, 54,232,247, 7,180,187,203, 12,242,156,113, 62,102,
-101,109, 21,131, 33,141, 35,180,201,217, 58,179,206,230,106,135, 42, 31, 51, 26, 13, 25,133, 52,121,171,221,102,101,125,149, 94,
-175, 79, 85, 20,180, 90, 45,122, 71,199, 24,107,200,178, 6, 87,175, 94,197, 90, 75,101, 13,253,241, 0, 33,161, 48, 14, 25,167,
-236, 31,238,162,199, 3,226,141, 46, 35,171, 17,141, 22,141,172,205,215,189,241,117, 60,125,229, 10,165, 19,228,163,156, 40, 75,
-105,100, 41,101,161,137,155, 41,187,219, 59,108,172,173, 81, 13, 70,108,172,109,240,228,193, 33, 75, 89, 70,171,221,166, 63,232,
-179,181,117, 6, 13, 28,244,135,164,157, 6, 73,101, 24, 27,203,238,213,171,116, 86,150,185,233,142,219, 25,228, 99, 74,231,124,
- 39, 70,101, 48,229,180,221, 82, 25, 51,233,248,240, 36,179, 41, 67,220,132,182, 77,135,153,107, 61,115,179, 44,241,128, 33, 86,
-248,123, 24,107,103, 72,100, 33, 32, 56, 65, 76,155, 77,155,207, 70,207,215,166,188,197, 84,199,225,154,186,123,184,103,102,210,
- 12,117,234,124,178,162, 29,115, 61,247,167,150,159,197, 76,231,143,171,157,241,105,247,214,108,249,217,123, 90,114,190, 3, 64,
-136, 73,240, 44, 3, 19,190, 46,255, 73,165,144, 33,168, 82, 74,249, 72, 61,128,122, 13,232, 66,200,185,222,120,231,156,175,169,
-135,112, 43,156,196,148,145,167, 66,191,156, 12,233,199,105,195,187, 56,149,252, 48,249,185,146,126, 99,149, 18,173,124, 45, 89,
- 86,138, 82, 86, 24, 99,253,107,215,139,192,186,169, 83,225,172, 23,251,112, 2, 99,252,137, 68, 33,197, 61, 57,241,186, 95,175,
-246,241,130, 32,135,169,185,142,110, 74,194,112,212, 41,247, 64,170, 17, 14, 37,156,143,212,133, 3, 37,112, 72, 68, 44,120,238,
-153, 39,125, 47, 38,112,238,220, 57, 14, 30,125,130,178,202, 25,141,142, 65, 24,164,138,144, 50, 97,235,204, 89,206,157, 59,203,
-185,179, 91,140,135, 3,180, 29,177,182,186, 66,186,180,137, 72,155,188,230,117,119,242, 75,191,242,107,180, 59, 29,178,102, 19,
-109, 13, 10, 65,171,221, 33, 82,161, 85,196, 58, 84,168, 5, 58, 11, 89,163,137, 53,112, 56, 24,144, 91,131, 18,130,209, 40,167,
- 17, 37,232,106,204,234,234,186, 23, 80, 17,146,115, 7,103, 41,202,146, 51, 91,103,104,196,177,111, 31, 11,139, 81, 69,178,166,
-168,134, 13,221,177,188,188,140, 49, 14,231,250, 84,218,208,108, 54,189,128, 76,168,237, 39,137,160,116, 62, 29,101,156, 69,231,
- 5, 75,141, 38,137, 95,127,147,108,137, 49,230,121, 91, 11, 79,227, 58,184, 19, 29, 16,214,185, 41, 16, 75, 69, 20, 39,196, 65,
-168, 39,138, 36, 81, 92, 47,240, 25, 65,139, 80,139,159,118,113,136, 73,204, 42,102, 87,163,152,222,140,190, 34,229, 80, 54,154,
-128,155, 13,194, 18,147,182,176, 64, 28,115,161,182,172,148,154,128,161, 79,123,227, 1,177,168,208,198,247,160, 41, 27,135,207,
- 58, 10, 45, 92,222,123,151,136, 57,172, 13,121,195,201,207,167,108,213,217, 58,226, 60, 41,111,150,120,106,197, 60,249,116, 34,
-236, 81,111,112, 97,183, 17,110, 74, 84,173,137,116,132, 99,117, 53,243, 93, 87,232,178, 66,235, 10, 83,148,216,178,164, 42,115,
-156, 51,168,180,141,138, 64, 68, 2, 17, 73,156, 82,160, 60,175,192, 10, 91,187, 74,129, 70, 81,103, 76,152,219,248,166,169, 74,
-233, 51, 1,195, 35, 30,251,232,199,248,157, 15,124,144,253,195, 35, 48,144, 8, 73,179, 25,145, 36, 49,251,251, 3,226, 88, 97,
-141, 67,107,131, 20, 2, 19,128, 33,137, 5,113, 34,145,210,146,166, 9, 73, 12,221,165, 54, 85, 85,250,171,238,240, 90, 9,206,
-178,188,188, 66, 94, 26, 70,121, 65,218, 72, 41,181, 38,138, 99, 70,227, 28, 33, 35,142,142,142,200,141,193, 84, 5, 50,105,210,
-233,180, 81, 74,145,101, 25,205,166, 23,183, 25,246,135,180,154, 29,134,227,156, 60,207,145,113,194,202, 74,139,172,149,145, 15,
- 7, 36,174, 98,239,234,101,176,134, 72, 69, 56, 7,141,172,197,112, 56,166, 44, 11, 54, 54,214,200,203,156,173,141,117,148, 20,
-172, 47, 47, 35, 29,129, 19, 19,163,171, 10,109, 12,141, 70,202,185,155, 46,114,120,116, 68, 81,149, 88,173, 57, 58, 58, 98,103,
-123,155, 88, 69,108,135,175,121, 89, 32,226,152,188, 42, 57,238, 29,179,123, 52, 0,213, 64,151, 21,235,221, 54,157,165, 21,110,
-191,233, 28,221,212, 59, 59, 54,141,217,223, 19,228,101,238,249, 7,177,228,169, 39,175,178,185,117,150, 51,103,206,178,187,189,
- 67, 62, 28, 35,181, 23,191, 73,179,140,202,104,116,145, 19, 39, 41, 71,199,199,156, 57,123,142,194, 60,199,113,127,192, 82,119,
-153,170,215, 71, 41,197,147,151, 46,177,186,185, 78,119,109,133,161,246, 89, 21, 83, 25, 76, 84,133,246, 73,131,210,158,112, 57,
-213,100,112,147,108,146,169, 3, 53, 51, 21,110,154,136,191,212,189,228,206, 7, 7,206,217,153, 30,236,192, 99,177,146, 90,210,
-234, 52, 78, 85,184, 67, 39,160,235,219,132,221, 4, 83,166, 68,223,186, 43,198,151,236, 8,130, 56,238, 68,119,212,108,164, 63,
-219,134, 54,193,197, 25,199, 92,156,214,131,206,180,158, 63,185,213,229,124,185, 14,105,167, 89,232, 19,193,179, 82, 83,246,187,
- 8,160, 94,147,230,164, 82, 56, 53, 45, 55,213,156,159,169, 64,207, 52, 48,136,230,210,170, 39, 90, 10,148,148, 19,146,211,105,
-253,236,215,245, 94,194, 71,110,165, 36,114, 62,149, 26,107, 67, 18,122,183, 43,173,209,122,190,197,102,182, 13,192,217,169,130,
-143,181,150, 40,138,230,179, 8,245,113, 58,231, 25,186,110,170,120,197,132,157,233, 38,164, 35, 85,115, 5,132, 35, 22, 46,124,
- 31,180,146,116,137,181, 99, 42,237, 23, 80,220,236,178,182,177, 73,119,123,151,178, 44,124,141,133, 58,171, 96,121,250,233,167,
-248,236,103, 62,205, 31,255,250,187,216,221,121,142,118, 2,113, 18,179,185,118, 30, 11,188,249, 45,111,241, 17,115, 81,128, 32,
-168,173, 89, 42, 99,137,226,120,114,158, 8, 73, 28, 39,147,158, 95,165, 36, 85,169, 39,192,149, 37, 49, 78,107,150,186,109,202,
- 50,103,117,105,147,223,251,212,103,217,217,221,231,246, 91,111,166,217, 72,112,198, 80, 22, 5, 50,106,248, 62,248,224,237,225,
- 44, 69, 62,166,211,234, 32,149, 98,117,117, 21,107,161, 44, 53, 66, 40,242,188,192, 85, 21,113, 18,227,170, 18, 97, 12,121, 49,
-196, 40,137,168, 12, 50,139,161, 10,139,209,213, 92,138,144, 46,226,198, 55,218, 11, 1,251,208,235,132, 84,158,121,174, 98,133,
-138, 37, 50,150, 19,162,157,175, 23,157, 80, 95,154,112, 45,166,137,232,233,205, 87, 31,167,155,130, 13, 65, 96,200,121,132, 85,
- 54, 66,165,177, 7, 60,235, 60,192,107,141,171, 74, 79,182,155,244,121,187,192, 12, 15,206,181,117, 8, 99, 48,149,191,225,141,
-214, 68, 73,130, 50, 17, 50,138,144, 74,226,130, 3, 44,230,116,212,196,233, 98, 76,142, 57,103, 68,156,162,181, 48,219, 66, 39,
-194, 61, 90,215, 23,235,141, 67, 76,196,110, 12, 86,155, 73,219,155,173, 52, 78, 91, 76, 85, 98,170, 10,171, 43,223, 45, 80,149,
-152,178,196,149, 5,186, 42,137, 19,127,127, 42, 50,148,244,217, 46, 33, 3,184, 7,130,164, 19, 39,210,140,245,106,112, 39, 4,
-158, 16, 88,167,176, 46,231,202, 99,143,242,192, 47,254, 27, 46, 63,254, 69,144,130, 40, 82,180, 82, 69,156, 8,142,143,135,196,
-145,240,107, 29,129, 20,202,139, 4,197, 18,107, 45,113, 44,137, 34, 72, 98,104,183, 99,186,221, 22,198,104, 6,253, 62,157,118,
- 23,109, 28,141, 52,165,200, 75,146, 70,139,163,163, 35,132,148,164,141, 12, 25, 69,148, 85, 69, 89, 85,196,105, 70, 53,202, 25,
-143,134, 68,137,162,221,206, 72, 98,197,250,218, 26, 82, 70, 28, 29,245, 16, 82,209,136, 61,207,165,168, 52, 89,171,133,113,222,
-153,232, 29, 31,161,170, 49,123,219, 87,168,202,130,172,145,225,149, 55, 65,107,205,120, 56,100,109,121,137,225,241, 49,183,221,
-118, 43, 70, 87, 52,162,152,241,113, 31, 41, 32, 74, 98,198,165,102,255,224,144,243, 23,206,179,177,185,193,195,143, 93,226,240,
-232,128,141,149, 21,168, 52,135, 7, 7, 12,135, 67,172,241,153, 54, 99, 53,105,150, 50,172, 52, 69, 85,162,226,148,102, 91, 34,
-147, 22,107,203,203,116,211, 8, 18,197,213,195, 49,201,170, 34,139, 44,221, 36,229,117, 55,159,225,112, 48,166,223, 27,251, 54,
-215,245, 53,246, 14,247,232, 53, 27, 32, 97,239,232,144,245,213, 53,142,143, 15, 88,219,218,226,233,199, 30,165, 17, 41,148,144,
-228,101, 73, 83, 27,206,108,108,145, 63,251, 28,174,210,116,155, 77,242, 64,214,252,220,167, 63,205, 55,253,241,111, 38,203, 50,
-164,210,152, 72,163,163, 8,167, 13,166, 50, 68,129,187, 82, 3, 97,205,142,247,117,101, 15,222, 38, 0,127, 53, 17, 85,178, 33,
-210,215, 84,218,139, 91, 77,218,200,172, 13,125,164, 18, 33, 66, 29,159, 27, 72,180,205, 0,187,157, 21,123, 10, 14,224,188, 10,
-222,180,253, 78, 50,163, 39,193,137,182,210, 25, 62,214,105, 45,223,147,125, 39,252,251,121, 21, 79,107, 54,191,172, 3,102, 49,
- 5,238, 89, 80,143,166, 0,238,193, 93, 33,163,128,191, 74, 78,212, 27,253,223,170,186,166, 60,173,186,225,247,132,232,180,254,
-192, 57, 70,222,204,247,167,157,220,245,163, 55, 95, 23,143,128, 72, 69,232,200,215,176,170,178,162,210, 30,216,171,170, 10, 23,
-216, 78,234,235,214, 56,172,152,175, 73,104,173,167, 81, 95,164,124,186,179,174,179, 7,182,175,239,183,242, 23, 74,212,125, 15,
-117, 45, 61,108, 74, 83,224,183, 56,234,243,115, 84, 69,193,184,210,164,173, 38,145,144,228, 69,193,167, 63,243, 89,134,163,161,
-143,172,141,131, 80,231,191,237,150,155,249,214,111,249,102,156, 53,148,149, 65, 54, 51,132,138, 89, 89, 94,198,169,136,165, 78,
-155,172,209, 32,105, 52, 25,141, 75,186,221, 44,244, 87, 74,132,140, 16,210,183,189, 36,113, 74, 18,165, 56,103, 73, 27, 13,198,
-163, 49,210, 24,146, 0, 10, 43,157, 78, 64, 20,223, 91,190,119,120,200,104, 52,162, 50,150,241,120, 76,150,164,164, 73, 76, 20,
-121,181,180, 40,108,158, 2,139, 49,149,103,236, 18, 34, 33, 41,137,227, 24,109, 60, 79, 34, 77, 83,138, 74,123, 30,131,209,147,
-136,174,200, 43, 50,103,209,198,215,190,107,189, 0, 2,184, 19,212,226,156,171, 5,130,100,168, 95,205,170, 27,205,168, 28, 57,
- 78,252,108, 26,181, 34, 36, 66,120,113,154, 40, 82,168, 40,164,251,235, 71, 93,179,158,220, 92,211, 27, 77,206, 68,190, 98,234,
- 74,207, 69,182, 53, 25, 78,204,122,173,210,161,172,244,117,239, 16,109,251,122,113,236, 1, 48,164,231,141,214,152,154,249,235,
- 28,194, 89,207, 84, 15,153, 36,129, 69, 59,139, 53, 10, 25,197,193,163,142, 38, 94,246,172,226,134,112, 39, 19, 91,243, 9,235,
-211,148, 28, 39,100,190,153, 77,104, 2,162, 33,235, 64,232, 65,183,198,224,116, 96,242,107,141,169, 74, 92, 85, 97, 75,207,110,
- 55, 85,137, 51, 30,216,157,174,176, 90,131,169,192, 84,190, 29,172, 82, 72,147,162, 92,138,144,241,244, 50, 9, 78, 85,134,155,
-100, 76,234,207, 87,122, 14,139,179,190,206, 63,218,221,225, 67,191,252,239,248,204, 71, 63,134,172, 28, 73, 35, 70, 70,208,200,
- 18,122,189, 94, 96, 44, 75,226, 64,136,243,145,186,196,106, 67,146, 70,190, 84, 34, 33,203, 50, 54,214, 86,176,206,208,239,245,
-104,102,109,202,210, 32,101,196, 96, 48,164,221,238, 50,206,199,148,149, 38,109, 36, 8,169,168,180,102, 92,150, 20,186,162,114,
- 80, 25, 67, 28, 75,226, 72, 18, 71,138,110,167, 67, 89,148,196,169, 98, 48, 28,177,177,177, 9,214,176,189,179, 71,218,106,161,
-141, 33,207,199,232, 98, 76, 36,161,183,119, 21, 87,230, 68, 97,239, 8,101, 94, 14,246,247,200,210, 20,170,130,115,155, 27,140,
- 7,125,170,178, 98,224,124,105,175,211,238,176,125,116, 76,163,217, 98,235,226,205,244,243,156,222,211,207,144, 68, 9, 23,111,
-186,141,254,225, 33,253,163, 30,149,118, 68, 73, 3,165, 4,189,163, 35,202,170, 96, 52, 26,131, 84,140, 71, 57,237,229,101,110,
-218, 92,193,160, 80,206, 50,234, 29,177, 51, 26, 49, 94, 93, 65,148, 99,110,222,232,226,142, 15, 89,222, 88, 71,218,138,173,246,
- 58, 85,110, 25,149, 37,194,104,196,120, 72,214,200,120,250,202, 51,164,221, 54,237,149,101,178, 52,241,193, 86,156,208,239,247,
-104,119, 58,244,123,125,206, 93,184, 64, 94, 22, 60,119,117,135,238,250, 38, 20, 21,253,178, 68,146,241,216, 23, 30,229,206,175,
-187, 11,149,197,228, 69,137, 84,145,239,199,143,172,175,181,187,121, 80,159, 21, 31,243,130, 73,190,235, 34,214, 1,212,245, 52,
-125, 95, 85,122, 42,207,106, 29,122, 2,240,204, 71,188,136, 19,169,119,230,216,230,211, 20,253, 12,169, 90, 76,245, 97,234, 54,
-235, 73, 95,119,205,114,159,193, 25, 59, 3,236, 19, 69,147, 58,107, 48,231,104,187,235,102,173, 79,118,139,157,116, 10,148,172,
-235,232,211,136,188,230, 45, 9, 41, 17,170,110, 97,243, 64, 46,164,240, 95,149,151, 98, 22, 65,153,147, 32,160, 51,201, 98, 50,
-229, 52, 68,179, 82,115,167,121, 37,190, 53,105, 26,133, 48,219, 99, 87, 23,243, 78,213,128,159,214, 57,132,112, 40, 21, 99, 34,
- 15, 42,177,142,252,133,140,171, 64,100, 10, 23,218, 26,140,176, 84,214, 77,122,207,107,229,181,105,239,174,157,122, 43,245,230,
- 93,247,242, 90, 55,145,244,156,144,141,106, 86, 63, 54,164,225,125,110,212, 9,233,107,194, 88,134,163, 17, 69,165, 80, 89,138,
- 3, 58,157, 46,205,102,147,183,191,237, 27,216,221,189, 66,145, 87, 62,101, 46, 28, 10,199, 82,183, 77,191,223, 39, 47, 43, 14,
- 7,144,117, 52,194, 89, 34, 33,216, 92, 89, 97,115,109,141,195,254,136,195,163, 1,227,194,178,190,210, 69, 41, 77, 28, 69, 24,
-103,136,165, 23,141, 1,129,140, 34,126,231, 19, 31, 39,113,130,209, 81,143, 22, 18, 17, 43, 86,150, 58, 36,169, 87, 64, 67, 69,
-236, 29, 28,210, 93, 89,163,187,188,138, 41,115,159,246,181,150,102, 35, 67,196, 9,197,104,136, 16,241,244, 51,194, 6, 45,105,
- 77, 89,106,164, 16,158, 24,212, 20, 28, 31,247,136,227,120,146, 86,175,170,194,147,166,132, 87,205,243,146,111,207,151,106,159,
- 1,124,230,193,123, 22,204,103,123, 85,189,159, 53,253,189,144, 42,148, 53,234,250, 61,115,252, 7, 49,243,239, 89,101, 42, 49,
- 43, 45,233,174, 45, 51, 79,123,198,197,180,181,210,249,243,115,194, 33,172, 3,139,231,109, 72, 9,177, 66,197,202, 51, 71,141,
- 65,151, 37,186,244, 81,188, 23,105, 17,147, 62,245,186,115,192,225, 83,137, 86, 91,132, 84, 24, 85, 77,110, 80, 41, 37, 40, 57,
-233, 26,153,166,224,174, 21, 80,150,179,106,138,215, 73, 7, 82,235,211,215, 90, 9,218,183,229,153,210,171,235,153,178, 12, 41,
-246,130,170, 44,176,149,255,222, 25, 29, 74, 11,158, 40,136,179, 56,237,201,110,194, 25,172,136,176, 57,216, 34,198,150, 41, 42,
- 81, 16,197,224,162,192,180, 23, 97, 45,137, 57, 66,159,155,187,234,110,178, 9,186,241,128, 71, 62,244, 33, 30,252,133, 95,196,
- 86,150, 72, 70, 40, 11,173, 78,131,225, 96,228,179, 82, 66,129, 83, 20,133,119,232,107, 39, 33, 77, 98, 76,101,137, 19,104,164,
-138,173,141, 13,148, 18,140,122,125,112,146, 36,105, 50, 30,141,124,205,185,170,104,181,219, 28, 31, 31,251,107, 30,148,235,122,
-253, 62,218, 90,210,172,201,104, 92,144,151, 37,221, 86, 74,214, 72,136, 35, 73, 18, 71,244,250, 67, 84,105, 16, 8,170,170,226,
- 96,111, 27, 25,197,236,238,239, 98,140,229,204,153, 45, 14,118,174, 32,108, 69, 62,232,121, 1,156,200, 7, 35,113,170, 56, 58,
- 62,242, 4,189, 36, 38,201, 18,118,246,118, 40,141, 69,197, 49,205,102,139, 98, 60,102,127, 56,230,236,205, 55,163,173,101,183,
- 63,100,121,105,137,118,179,201,149,103,158, 97,251,234, 30,101, 62, 70,231, 99,180,246, 12,255,225,176, 79,163,145,224,156, 69,
- 91,135, 43, 43, 90,205, 22,141,164,193,225,193, 1,163,188, 98,120,184,199,197,245, 37,108, 57, 70,209,161,215, 47, 40, 86, 59,
- 72, 98,142,143,250, 72, 39,232,180,155, 20,137,166, 58, 28,211,141, 5,227, 50,247,179, 18,156,101, 48,232,211,220, 88,199, 58,
-199,230,217, 51, 28,110, 95,197, 90, 15, 92,173, 86,155,170,200, 57,119,102,157,209,120,196,254,225, 1,157,181, 77, 10,227,208,
-121,197,222,206, 1,135,187, 7,172,110,109,208, 72, 82,242,170,244,206,158,180,126,157, 59,119, 90, 19,186,135, 24,107, 61,159,
-165,214, 73, 48,117, 86,201,119,166,232,144, 89, 41,171, 10,173, 13,149,148, 84, 33,208,243,160, 45, 79, 48,205,197, 68, 21,197,
-205, 52, 41,215,100,186, 57, 31,217, 77,163,121,113,162,185, 78, 4, 69, 83, 39,132, 87,200,171,107,224,245,189,232, 2,190,213,
-117,242,185,125,200, 78,121, 50,215, 40,177,138,185,247,152,229, 7, 8, 57, 75,140,147,215,232,224, 83,179,255,107,102,247,204,
-247, 19, 98, 29, 98, 46,213, 63,207,195,247, 55,103, 52,187, 65,158,214, 59, 39,197,172, 54,173,152,219, 84,231, 62,234, 19,233,
- 66, 59, 17,119, 15,100, 1, 2, 65, 32, 14,105,253,200, 98, 76,140,142,125,196, 94,150,254,171,179, 94, 2,180, 38,207,205,138,
-203, 76, 54, 56, 21,104,255, 51,169,151,201, 48,142, 16,165, 79,100,108,157,239,153, 37,212,103,156,244, 68, 58,156, 79, 97,104,
-237, 61, 69,165, 98, 26,205,140, 56, 73, 56,238,245,177,214,241,216,227, 79, 80,228,101, 40,144, 26,150,151,186,220,124,243, 77,
-156, 57,115,134,193,225,161, 23, 15, 17, 10,135,100,112,116,196,168,168, 24,150, 37,171,203,203, 60,125,121,151,164,217,197,138,
-200,147,212, 48, 8,103, 81, 18,218,161,206, 45,157,227,184,127,204,149,157,109, 94,119,225, 38,108, 81,144, 73,201,210, 82, 23,
-163, 75, 6,227, 1,113, 22,211,219, 63, 96,103,247,128,195,222,128,155, 47, 92,228,153,103, 47,179,210,237, 32,156,161,213,106,
- 49,202, 75,242,162,160,106, 68,164,113,132, 53,154,124, 60, 98, 85, 42, 10, 91, 77,116,215,227,216,139,191,164,105, 74, 81,106,
-146, 56, 33,137, 99,156, 0,157,123, 5, 50,240,169, 76, 6,189, 19, 24, 46,107,237,184, 73, 59,226, 73,109,253,121,237,126,119,
-221,148,153,171, 19,249,117, 29, 41,242,233, 38, 15,136, 98,210,222, 49,149, 18,119,115,192, 34,102, 2,126,196,181, 45,150, 98,
- 78, 1,195, 3,187,116,179,169, 98,199, 76,131,105, 96,169,135,190,120,227,136,162, 8,147,248,168, 93,151,165,207,124,216,105,
- 54, 73, 4,178,163, 16,161,239, 93, 24,172, 22,161,155, 98,202, 73, 17,147, 8, 62,212,198,212,108,251, 73, 45,234, 34,166, 17,
- 3,204,245,184, 78,136,137,166,126, 24,116, 85, 97, 42,141,173, 10,127,108, 85, 16,226,169, 10,108, 85, 97,117,137,209, 37,206,
-148,161,204, 80,129,174,112,161, 21,205, 90,141,177, 26,233, 52,202,165,152, 76, 97,242, 12,147, 15, 17, 81,132, 16,145,119,136,
- 34, 95, 82,168, 63,100, 71,125,236,179, 60, 6,129, 51,254,115,215,101,206,213,199, 62,207, 47,253,244,253, 84,123,135,126, 51,
-140, 35,150, 90, 77,198,197,144, 92, 87, 40,231,163,138, 34, 47, 9,229, 79,223, 55, 28, 24,211, 4, 93,249,141,181, 53,112,150,
-241,168,100, 48, 24,209,110,175, 48, 26, 21, 40,233,107,206,237,118,215, 75,232,106,223,178,101,172, 97, 52,214, 24, 99, 17, 74,
-162,181,161,212,190,181, 81, 8,200, 26, 9,173,166,111, 31, 19, 42,102, 56, 28,176,182,126,134,103,159,125,150,110,183,193,168,
- 40, 24,143, 70,156, 61,119,142,203,207, 60, 69,100, 43,170, 98, 68, 34,160,204,115,226,134, 64,169,132, 65,175, 79,150, 36, 68,
-248,249, 15,135,131, 30, 42, 73,104,173, 46, 19, 55, 50,142,142,250,172,159, 57, 75, 20, 37, 20, 14,186,203, 43, 88,103, 57, 26,
-140,120,226,210, 83, 52,148,162,127,112,236,165,169, 27,137,119,168,117, 69,163,221, 69,151, 5, 66, 72,146, 70,147, 76,197, 28,
- 29, 29,209,239, 95, 37,183,240,236,149, 93,206,174,182, 88, 91,110,179, 92, 74, 26,162, 96,115,117,141,225,184,192, 40,201,122,
-119,149, 65,127,128, 25,140,104, 45,101, 44,199,171, 68,251,135, 52, 75,195,176,178,136, 60, 39, 63, 58, 98,144,166,196,113,196,
-202,234, 26,207, 92,122,130, 70,156, 48, 24,141,104, 55, 59, 28,247,142,185,121,245, 2,107,107, 43, 28,244,159, 99, 52, 24,210,
-110,181, 25, 85,134, 72, 37, 92,122,236, 9,150,215,214, 32,176,179,231,242, 78,147, 76,152,152,215, 97, 8,197, 80, 97, 20, 70,
-123, 73, 86,165, 13, 86,134,122,124, 80,132,243,221, 86, 80, 73,233, 37, 93,131, 52,181,159, 99, 32,102,100,150,231,137,114,238,
- 20,254,206,220, 94, 52, 19, 57,219, 19, 76,116, 81,139, 82,213,186, 14,206, 98,141,192, 8,223,230, 92,223,143, 19,172,156, 25,
- 86,131,148,243, 78,254, 9, 65,153,201, 0,150, 19,153,110, 21,244, 42,102, 63, 35,174, 27, 14, 79,247, 2, 17, 30, 88, 91,119,
-212, 79,196,102,166,251,233, 12, 81,238, 70,169, 3,112,161,141, 39,104,237,205, 2,250,204,201,156, 76,145,248, 22,181,144,166,
- 8,195, 31,172,192,171,126, 5,141,191, 64,134, 70, 73,129, 83, 94,141,202, 25,129, 9,253,241, 88,135,211, 38, 16,171, 66, 90,
- 82,121,207, 80, 24,207, 92,159, 12, 17,112, 83,253,223, 90, 34,180,246,180, 68, 24,226,226,228,164,201, 2,171, 82,172,202, 88,
- 63,115, 11,219,143, 95, 66, 68,128, 46,208,229,152, 56,130,139, 55,157,225,241,199, 31,230,201,167,158,192,184, 18,129, 1, 41,
-232,143, 70,164,205, 46, 82,164, 52,162,148,172,211, 33,107,167,180,187, 93, 28,138,221,237,103,233, 44, 47,115,219,197,155,248,
-228,231, 31,163,170, 52, 42, 46, 16, 34,198, 10,129,136, 34, 26,105, 10, 74,121, 39,198,149,116, 91, 75,124,253,155,222,194,209,
-238, 30, 78, 88,218,173,140,179,103, 55, 61, 81,201, 57,180, 21,124,252, 19,191,207,218,218, 6,119,222,122, 43,163,113, 78,146,
-181,184,116,121,155, 52, 77,216, 56, 95, 98,139,130, 8, 24,143,115,210,172,225,153,237,253, 1,105,164, 40,149,130, 88, 49, 46,
- 43,210, 52, 35, 31, 23, 56, 41, 88, 89, 94, 34, 31,143,136,226,148, 82, 91,148,208, 52, 26, 13,164,146,148, 78,146, 32, 16, 78,
- 35,133,195,134, 60,135, 17, 98, 34, 60,115,163, 41,121,167,105,250, 79, 0,181, 78,109, 9,139,148,222,201,137, 20, 33, 5, 47,
-136,148, 67, 5,221,117, 33,221, 36, 17, 52, 59,107, 64,204, 42,186,213,125,175,167,100,139,220,132, 22, 26,234,207,190,138, 18,
-110,134,112, 92,118, 94, 29,177,230,107,212,195, 95,162, 56,154, 68,236, 58, 8,220,216, 32,213,234,163,231,169, 64, 70, 45, 41,
- 59, 81,142,146, 18, 41, 3,167, 36, 73,188, 44,173, 82, 65,200, 69, 76, 68, 51,188, 24,142,241, 29, 5,225,181,117,237,216, 26,
-235, 25,235,101,221, 78,228,133,118,180, 30, 97,170, 10, 93, 21, 1,192, 13, 46,200,184, 98, 43,172,245,145,186, 13,204,127,103,
- 76,232,131, 15,142, 49, 48,150,144,229, 21,201, 96, 76, 34,251,196, 26,168, 52, 52, 50,136,163, 48,176, 69,214, 77,245, 30,228,
-101,136, 84,144,148, 50, 1,145, 32,141,166,216,219,229, 87,127,250,103,120,238, 11,143, 32, 68, 68,156, 8,210, 52,161,168, 52,
-163, 97,133,239, 56, 86,140,243,106, 34,209,233, 73,134,254, 90,107, 12, 73, 36,104,181, 82,154, 89, 66, 85,149,244,122,125,146,
-164, 69,105, 44,227,178,164,153, 53, 49, 78,144,181,219,244, 71, 99, 92,152,180, 40,132,161,215, 31,144,100, 25, 42,142,169,180,
- 97,127,119,159,205,205, 85,218,141, 6,205, 56,193, 86, 6, 41, 85, 96,162,183,232, 29,239, 98,117,133,165,203,246,246, 21,214,
-214, 87, 57,218,187,130, 45,134,228,225,126,234,231, 35,150,151,151,193, 57,138,145, 23,110, 90, 89,219,240,221,205,105, 66, 44,
- 44,203, 43, 43, 20, 85,133, 76, 82, 46,220,178,206, 96,152,211,106,117, 89,107,181, 65, 73,158,188,252, 28, 90, 56, 92, 51, 35,
-215,154,229,243,103, 17, 90, 51, 56, 62, 70,139, 24, 34,133,118,150,180,153,146,143,251,236, 30, 28, 16,225,136,133,244,217, 34,
- 1,218,228,228,227, 8,105, 97,101,125,149, 74, 23, 28,244,142, 88, 95,222, 0,171, 48, 68,100,203,203,236,236, 94,197,198,138,
-172,213, 68, 45, 47, 35,198, 57,241, 96, 76, 55, 85, 68,229,152,225,113,159,164,213,166,153, 89,178,118,155, 72, 74, 6,199, 3,
- 63,199,193, 41,134,163,146, 86, 35,227,236,250, 42,207,108,239,209,108, 55, 49,145,164, 40, 10, 80,146,237,103,159,101,253,220,
- 89,239, 88, 6, 57, 86,103,237,156, 38,121, 77, 0,115, 98,218, 33, 37,156,243,140,110, 87,183,126,250, 44,144, 69,214, 77,174,
- 65, 3, 67, 35,165, 37, 82,214,183, 21, 90, 79,128,158, 37,224,205, 42, 59,217, 73,180,234,230, 2,138, 73, 38,121, 38,133,238,
- 78,200,181,214, 25,205,186,244, 59, 87,235,159, 12, 77,154,200,197, 77, 2, 17,127,142, 97, 98,100,157, 45,228, 90, 80, 23,129,
-224, 43,103, 34,109,159,110,119,215,148,186, 39,228,216,192,145,145,130,160,134, 23,218, 90, 29, 8, 25, 50,212, 42,240, 93,130,
- 24, 77, 13,234,118,102,234,105,116, 93,241,118, 78,100, 85, 79,148, 71,231,164,175,197,137,180,128,240,180,126, 55, 51,130,213,
-111, 88,126, 90,142, 49,198, 19,121,140,157, 68,228,174,142,176, 3,233,166, 38, 49,216, 25,121, 89,105, 45, 24, 95, 95,112,147,
-246, 56, 49, 73, 91,186, 48,124,160,238,123,244,100,115,255, 1, 72,100,208, 44,150,104, 36, 43,235,231,208, 42,163,116, 10, 39,
- 21, 73, 26, 81,149, 37,105,234,199, 71,222,121,231,235,120,234,217, 39,233,245,119,189, 76,169,138,120,221,107, 94,203,219,223,
-246, 54,142,143,142,137,170,130, 84,217,112, 30,128, 76,232,118,186, 40, 41,120,243,155,222,200,175, 60,248, 17,100, 35, 67, 74,
- 73,169, 53, 69, 49, 38,142, 34,207,112, 45, 42, 70,253, 30,253,222, 17, 66, 87,220,113,241, 38,246,246,246,144, 18, 86, 86, 87,
- 88,234,118,112, 66,176,178,182,134, 72, 26,220,116,203,205,140,134, 99, 42,171,121,228,210, 19, 24, 41,201, 15, 11,242,113,193,
-153,141, 45, 46,108,172,209,109,183,201,203, 49,101,208,255, 30,246,123, 20, 65, 3, 62,175, 42,146, 52, 33, 73, 98, 70,195,145,
-175,175,231, 37, 27, 27, 27,196,113, 76, 89,110,211,202, 34,100,236,111,186, 66, 87,164, 74,129,173, 60, 9, 43, 48,155,167, 98,
-135,238, 90,176,190,102, 40,207,141,148, 0,125,125, 82, 73, 71, 20,121, 89,217, 72,133, 62, 77, 85,179,238, 79,146, 85,174, 67,
- 78,153,212,218,221,169, 60,154,201,219,219, 16,225,215, 58, 49,202, 59,142,136, 80,182,113, 83,233, 75,159, 38,155, 97,157,198,
-177, 39,113,233,192, 32, 15, 4, 59,107,140,175,181,219,233,100,183,122, 74,155,255,220, 60, 33,210,196, 49, 70, 87,196,113, 60,
- 33,214,249,238, 29, 49,153, 42,231,140,193, 86, 37,186,244,132, 61,109, 60,247,196,106,141, 46,125,109,220,134, 90,191, 53, 26,
- 99,198, 62,181,110, 53,194,250, 44,144,215,101,215, 56, 91,226,156,158,240, 77, 68,221, 71, 89, 59,186,214, 96, 29, 12,135,218,
-119, 61, 4,209,145,108, 60, 34, 26,117,144, 89,138,140, 19,100, 28,251,169,131, 42,158, 76,101,115, 42, 66, 69, 96, 85,140,136,
- 19, 95,230, 25, 15,249,216,127,254, 85,126,239,193,223,192,228,185,151, 73, 13, 65,192, 81,111,224, 51,119,218,247,181, 87, 6,
- 95, 6, 8,174,130,196, 79, 62, 76, 83, 95,130, 57,115,102,131,162,244, 19,204,242,194,176,214,109,177,179,191, 71,156, 54,176,
- 2,146, 70, 6, 66, 82,150, 37, 42,146, 33,141,107,136, 66,175,121,162, 34,158,126,230, 57, 26,169, 34,142, 20, 73, 28, 81,228,
- 57,105,154,122,173,244,178, 36,107, 54,217,190,122,133,243, 23,111,225,201,103, 46, 35,133,164, 42,114,142, 15,246,200,226,136,
- 72, 66, 62, 24,177,177,190,238,117,224, 7, 3,162,164,201,109,119,188, 6,237, 4, 66, 37, 84,206,178,178,186, 68,146, 36,164,
- 77,193, 56,207,217,221,221,101,235,204, 57,150,150,150, 56, 58, 62,226,234,238, 30,105,203, 75,184, 42,227,216,216,220,192, 22,
- 57,207, 61,251, 12,166,210,180,187, 75, 20,121,142,112,142,131,189,109,242,209, 49,194, 25,136,125,215,143,169, 52,135,251,251,
- 96, 45,113,236,219, 48, 15,143,253,192,151,181,181,101,198,199, 3,150,151,151,216,223,217,102,109,107,147,141,141, 45,170,178,
-160,204, 43,100,146, 80, 84, 37,157,181, 21,162, 70,131,253,253, 67,178, 52, 99, 48, 28, 51,206, 98,214, 55, 54,216,219,221, 37,
- 74, 83,122,163, 17,203, 75, 75, 28, 30, 30,179,181,185, 65,218, 59,102,117,169,197,241,209, 62,173,213, 77,202,188,162, 28,143,
-121,234,137, 47,210,108,183, 41,172,161,170,253, 97, 55,109,129,246,188, 24, 53, 81, 62,171, 37,150,167,109, 98,211,122,242,164,
-220,100, 21, 78, 66,164,124, 29, 93, 8,139,114, 14,105, 12,214,202, 48, 92,134,144, 34,103,206,129,118,167,132,184,117,192, 41,
- 17,215, 14, 63,153,139,236,205, 36,251,102,235, 57, 17,198,143,149,214, 53,207,235,196,224,154,169,122,219, 12,246,204,206, 65,
- 9, 98, 57,114,118, 96,203, 68, 1, 46, 56, 23,115,129,240,181,128,238, 68,125,174, 14, 39,173, 15, 54,164,207, 64, 57, 9,210,
- 4, 65,176,186,254, 30, 90,218,234, 25,215,215,128,250,132, 5, 56, 11,198, 55,152,138, 38,130,194,149,156,103,254, 76, 52,171,
-173,181,126, 76,167,118,104,163,253,112, 9,227, 38, 42, 95,147,209,146, 65,134,112, 10,240,161,191, 28,225, 9, 19,118, 42, 92,
- 96,157,243, 36, 37,235,107,198,184,147, 53,202,186, 31, 61, 92, 84,234,214, 33,159, 66,180, 78,161,146, 14,157,245,179,244,199,
-154,149,245,117,142,118,198, 56,231, 63,172,163,195, 30, 56,193,206,206, 62, 91, 91,231,121,250,233, 39,177, 54, 39,141, 18, 58,
-105,147,118,214,196,152,138, 36,145,140,134, 5, 73,214, 34,138,154,116,151, 87,216,223,189,202,254,246, 54, 23,206,156, 35,146,
-138,188, 40,105,100, 13,142,142,123, 68, 74,160,100,143,170, 44,233,133, 25,225,207, 92,190, 76, 57, 30, 66, 89,145,231, 37, 42,
- 74, 88, 89, 94, 33,142, 18,186, 75, 75, 84,198,240,145,223,249, 93,142,142,123, 56,224,182,102,147,195,241,144,194, 88,140,115,
- 36,192,225,225, 1,183, 95, 60, 79,132,247,246,101,172,130,162, 90,197,241,241, 33,171, 27, 41, 56, 71,150,164, 84, 70, 19, 41,
-201,114,167,205, 80, 12,177, 38,100, 53,148,164,153, 54, 64, 8,246,143, 14, 73,133,165,165,188, 68,106, 61, 11,185, 86, 44,171,
- 3,245,147,128,126, 90,164,126,106, 27, 74,205, 74,175, 71,177,170,186,149, 67,204, 12, 51, 56, 89, 18,154,122,148,179,228,148,
-217, 18,214,245, 8,155, 98, 66, 29, 15,181,124, 41, 38, 53,192,122, 40, 69,200,103, 33,106,112,158, 84, 26, 60, 81,197, 33,188,
- 8, 75, 28,161, 76,234,137, 63, 1, 96, 77,229,107,132, 70,151,216,170, 22,232,240,165,140, 90, 94,210, 68, 17, 85,161,168,194,
-184, 83, 15,234, 94,170,210,104, 67, 21, 64, 91,151, 37,186, 40,124, 27, 84, 85, 82, 85,197,164, 37,205,153, 16,121, 91,239, 0,
- 8,103,188, 24,140, 51,193,155, 15, 63,115, 14, 48,161,100,225,157,107, 27,102,192,215,242,178,218,150, 33,245,107, 57, 28,244,
-201,142,142,105,119,186,180,218, 29,154,237, 46, 89,179, 69,146,101, 68,141, 6, 73,218, 8, 45,173,126, 80,139,136, 18,108,154,
- 32, 26, 41,194, 10,148, 43,121,246, 51,159,230,223,255,255,126,134,209,241, 1,105,170, 2,127, 67, 50,234,143,144, 82,162, 43,
- 79, 76, 45, 43,139,157, 29,230,161, 4,218, 58, 26,169, 66, 56,199,218,234, 50,214, 24,138,178, 98,119,255,136,141, 51, 91, 28,
- 15,135, 62,174, 19, 2, 99, 44,237,118,155, 60, 47,195,166,107,137,227, 38, 69,153,131, 16,164, 73,194,115,207, 93,241, 78,132,
-177,164,177,164, 44,198,172, 46, 47,161,171,138,237,157, 29,206, 94, 56,207,222,206, 14,141, 70,131,227,163, 3, 70,253, 30,235,
- 27,171, 28,236,238, 16, 69, 94,179, 34, 81, 17,205,172, 65, 85,229,228,121,201,210,242, 42,155,103,207,145,107, 67,145, 87, 24,
-109,232, 44,117,201,210, 6, 8,199,246,206, 54,103,207,158,231, 53,183,157,197, 57,201,211, 79, 63, 75,207,228,172,159, 63, 3,
-218,225, 42,203,250,106,151,157,171, 87,121,238,217,167, 57,123,238, 76,168, 99, 23,196, 42, 70,151, 99,150,187, 45,122,102, 68,
-171,217,166,149,101, 60,251,212,211,129, 59, 97,217, 90,107,179,220,105, 81,153, 10,163,225,240,104,196,153,141, 51,180, 54, 19,
- 14,123,187,156, 59,119,129,131,221, 29, 84,156,208, 93, 94,166,221,105,209,239, 31,179,114,254, 2, 59, 79, 62,197,153,243,231,
-201, 29,236,238,237,146,181, 58,236,109,239,114,241,166,243, 28, 28, 28, 18, 37, 17,133, 30, 99, 5,152,170,242, 67,110,178,140,
-188, 44, 25,228, 5,227,193, 49,141, 70,139,126, 81, 80, 73,193,229,167,158, 97,101,107,147,202, 84,190, 21,141,105, 84,170, 66,
-118, 75,213, 68, 47, 57, 25,127, 53,193, 3, 47, 59,108, 38,160, 62, 91,234,141, 34, 63, 21,208,205,212,184,149,155,145,138,197,
-157,168,175,203, 83, 39,114,214, 17,244, 60,184, 50, 23,169, 11,226,185,153, 36, 53,160, 43,165,136,102, 37,151,107, 41,230, 16,
-245, 75, 41,174, 25,170, 50, 87,122,158,145,140,230, 52,210,156,184, 78, 71, 80,157,249,152, 8, 85,249,254,118, 27,178,134,210,
-132, 26,187,146,126, 31, 86, 18,105, 69,224,147, 76,103,152, 60,111,164,238,174, 51,198,116,226,117, 57,252, 70,200,204, 4,155,
-137,136, 12, 83, 50,132, 49,104, 29,254,109,141,215, 99, 14,162, 51, 70,135, 84, 71,168, 87, 26, 51,149,246,116, 97,144, 68,205,
-134,170,103,230, 10, 59,147,230, 23,243, 58,184, 74,212, 64,228, 38,163,252,234,209,160,214, 8, 52, 49, 91,231,110, 99,108, 35,
-142,134,125, 54,182, 54, 56,218,127,134, 39,159,124,134, 91,110,121, 45,189, 94,159,163,195, 30, 89,214,226,201, 47, 62,197,249,
-243, 23,217,222,126, 22, 83, 9,238,184,253,245,126,112, 68, 57,100, 84,121, 86,236, 74, 99, 25,149,173,208, 92, 90, 6, 33,216,
-221,222, 38,110,117, 57,183,185,193,163,207, 92,166,175, 53,107,235,203,116, 58, 29,142, 14,247,113,110,132, 53, 21,155,235,235,
-220,118,199,107,120,226, 11, 15, 51, 28,140,201,139,146,243,103, 54,200,178, 38,145,242,105,194,206,210, 18, 18, 56,234,245,217,
-220,218, 96,255,240,208,215, 10,169,251,202, 29,163, 60, 39,137, 99, 18, 37, 81,177,244, 41,222,224,208,152, 74,227, 76,133, 0,
-198,227, 49,198,122, 38,183,174, 10,170,170,228,224,224,144,209,104, 72, 20,199,244,250, 61,218,221,101,132,140,168,116,137, 85,
- 17, 22, 53, 37, 23, 58, 55, 83,234,224,121, 35,245,235,183,187,185, 9,137, 68, 42, 49, 81,173,139,148,156,214,211, 79, 68,232,
- 39,135,241,156,156,160,114,122,139,229,204, 82,158,220,124, 51, 36,152, 64, 36, 71,214,169,123,133,245,243, 37,145,174,158, 95,
- 16, 20,241,124,195, 32, 72,129,138, 28,210, 70, 68,198, 98, 18, 31, 85, 87,101,133, 27, 91, 42, 29, 24,231, 69, 65, 85,230, 24,
-109, 38, 25, 46,169,124,125,122,174,182,110,189,222,118, 89, 20,232,162,160,156, 1,117,107, 42,175, 16,104,167,242,172, 94,209,
- 77,251, 57, 2,174, 86, 75, 20, 19, 73,103, 41,106, 50, 96, 24,242, 50,113,150,125,134,172,110, 37, 45,141,166,210,154,178,242,
- 17,123,148,106, 90, 67,199,242,178, 98, 89,167, 44,185,140, 78, 28,131,246, 18,185, 88,252,108, 1, 12, 42,117, 72, 27,163,164,
- 36, 83, 80, 28,237,243,159,254,143,159,229,232,169, 39, 72, 34, 48,165, 33, 74, 34,122,189, 17, 74, 40,138, 82,163,132,162,212,
-214, 11,169,128,231,232, 40,133,209,154, 36, 81,168, 56, 34,182,134,229,110,135, 97, 62, 96, 48,204,113, 74, 97,132, 96,144,151,
- 56, 99, 73,211,134,111,197,116, 48, 26,143,253,181, 49,144,231, 57,149,214,164,141, 38,189,254,128,170, 44,209, 85,197,230,250,
- 50,105, 36,105,166, 94,112,105, 48, 24,248, 22, 78,235, 24,141, 70,108,157, 61,203,227,143, 63, 65,214,236, 80, 21, 35,208, 37,
- 56,104,196, 17,186, 44,137,155, 45,146, 40, 34,106, 71,172,175,175,115,220, 31, 48,214, 6,226,152,179,231,206,249, 49,196, 85,
-197,104, 56,224, 53,183,222, 70,187,221,230,104,127,143,178, 52, 56, 93,178,186,178,194,184, 63, 64, 26, 73, 34, 21,191,255,217,
-207, 19,167, 49, 55,221,113, 7,131,225,144,150, 84,180,219,109,174, 62,253, 36,197,240, 24, 97,114, 86,186, 45,198,131, 1, 59,
- 71, 7, 96, 53,163,209,152, 78,179,197,106,183,201,241,254, 62,107,173, 38, 43,235,231,216, 63, 60, 98,239,160,199,214,122,155,
-181, 51, 27, 28, 29, 31,178,212, 89,101, 52,174, 56, 60, 60, 34,203, 50, 95,106, 59,236,113,246,206, 59,217,126,234,105,214, 46,
-156,167, 95, 94,161,170, 74,172,173, 48, 14,100,156, 82,234, 2,149, 52, 40,140,165,153,164, 12,199, 99,210, 68,209,110, 53, 41,
-141,229, 96,144,227,162,152, 88, 42, 76, 85, 49,234, 29,211,233,116,252,100, 63,231,107,222, 62, 66,149, 65,232,200, 96,107, 80,
-175,243,122, 66, 79, 74,111,132, 97, 86, 83, 48,179, 62,219, 38,125,248,165,106, 66,109, 29,205,135,225, 41, 78, 76,189, 65,247,
- 60, 35,184,231, 65,118,158,139, 51,153,150, 22, 28, 92,165, 60, 95, 75,169,144, 49,140,252,124, 14,103,220, 28,175,235, 36,151,
-108, 22,212,231,100, 96,103, 4, 28,156,187, 86,195,197,203, 47,159,228, 29,184,233,118,230,196,108,132, 29,132,220,102,228,109,
- 69, 61,100, 56,200,218, 6,197, 84, 59, 35,143, 62,175, 40, 55, 35,150, 63,105, 1, 8,172,114, 33, 5,206,216,185, 3,169, 61,
-174,217,135, 9,242,129,126,236, 99,152,195, 61,147,214,208,117,154,195,233,201,198,227,220,180,207,176,158,134, 54,209,177,158,
- 83,186,147,147,249,178, 19, 15,111, 50,107, 86,204,203,218, 33, 39,175, 45, 4,152,240,124,167, 26,164,203,155,236,143, 44,221,
-213, 85, 58, 73, 69, 18, 75, 14,143, 14, 89,237,245,216, 58,187, 66,165, 53,111,120,195,215,208,238,118,120,248,209,207,178,187,
-115,133,175,123,219, 31,225, 77,111,253, 70,246, 15,143, 80,102,204,106,183,201,109,183,190,134,245,115,183,209, 94, 94,165,114,
-142, 81, 62, 66, 9,135, 45,114,222,250,166,175,225,115, 79, 60, 65,210,108, 35,133,196, 24, 77,183,219, 69, 58, 67, 89,192,149,
-171, 87,233,118,219,172,172,173, 49, 58, 56,198, 34, 73, 27, 45,132,242,196,186, 70,163,129, 53,134, 55,190,246,117,236,237, 30,
-208, 80, 49,253, 94,111, 50,130,208,134, 13,114,121,101,153,188, 42,177, 26, 82,145,120, 9,209,204, 59, 92,166,204,177,186, 68,
- 8, 69,153,143,184,186,179, 75,145, 87,126,126,111,148,248, 89,218,177, 79,229, 52,178, 22,149,129,179,103, 47, 48,236, 29, 33,
-170, 35,172, 45,176,182, 10,253,254,242, 84,125,231,211,106,234,167, 69,236,179, 99,117,235,255,215, 17,122, 20,213,195, 12,102,
-219, 43, 79,222, 12, 83,125,224,105,132, 46, 38, 45,138, 39,129,125,126,136,207, 20,229,229,204, 77, 35,107, 5,188,144,157,154,
- 48,209,173,239,215,150, 65, 47,161,230,108,212, 13,161, 66,120,178,166, 12, 89, 42,137, 67,216, 8, 87,130,118,154,178, 28, 83,
-141, 71, 20, 65,227,159, 32,170,225,230,102, 71,123,231,211,107,176,151,148,165, 39,190,249,175, 1,208,181, 31,188,226, 92,229,
- 35,113,172,151,111,150,130, 68,122, 1, 10, 17, 41, 63,240,198, 9,180,112,147,161, 22,190, 12, 99, 41, 42,255,181,212, 26, 99,
-125, 43,143, 19, 49, 42,110,160, 90, 13,178, 52,163,213, 89, 34,107,183,105,181,187, 52, 58, 93,100,179, 9,205, 14, 34,203,208,
-224, 29, 23, 93, 34,132, 35,149, 49, 66, 38,196, 78,160,243, 33, 31,254,213, 95,230,227,191,245,235,180, 34,201,120, 88, 96,172,
-101, 56, 28, 33,156, 96, 56, 44,125, 31,186,181, 20,149, 65, 42,129,181, 16, 73,133, 49,102,114,189,171, 66,115,246,220, 10,121,
- 57,194, 2,195,162,164,217,105,147,151,134,188, 42,201,146,196, 43,205, 69,137,119, 68,172, 69, 42, 63, 22,180,172, 42,180,179,
-148,131, 62,136,136,178,168,136, 35,252, 28,246,106, 76,182,220,161, 8, 35, 82,219,205,140, 65,191,207,202,242, 10,219, 87,174,
- 80, 21, 37,203, 75,146,131,157,171, 52, 27, 49, 66, 91,134,163,130, 51, 91,235,164,105,194,168, 63,100,121,109,141,163,227, 99,
- 10, 39, 73, 90,109, 54,182, 54,105,183,219,140,134, 35, 14,118,247,121,237,107,238,192, 58, 67,149,143,113, 85,137,178,176,185,
-178,204,238,209, 17,157,102,135,199, 30,127,156,195,163, 30,103,206, 95, 96,105, 99,149,195, 81,143, 91,110,186,136, 29,141, 25,
- 30,237, 35, 93, 69, 59,145, 20, 35, 77,255,176, 71, 18, 75,148,213, 52, 27, 9,105,154,208,202, 90,236,239,236,147, 40, 65,111,
-208,231,220, 77, 77, 54,227, 6, 15,125,242,243,252,145, 63,242,102, 84,156, 80, 57, 73, 89,105,146, 36, 65, 8,193,206,222, 62,
- 43, 65, 50,183,236, 13, 89,189,120, 19,131,163, 30,103, 47,158,227, 96,231,128,131,227, 3,122,253, 1, 42,138, 81,177, 67, 83,
- 49, 46, 11,150, 59,171,228,163, 1, 75, 89,151,209,184, 64, 73,201, 74,167,205,176, 52,196, 42, 98, 60, 26,147, 53, 50,242, 65,
-159,230,202, 50, 0, 85, 40,165, 16, 82,216, 88,139, 80, 42,148,182,106,249, 84, 51, 25, 0,227,187, 41,230, 57, 54,117, 86, 88,
-214,179, 85,103,116, 16,228,236,224,164, 73,234,125, 86, 18,153, 83,181, 32,102, 9,182,167,237, 13, 46, 68,198,181,172,181,181,
- 98, 18, 84, 56,105,253, 35,146,147, 25, 11, 39, 39, 55,158,246,122,179,243,215, 79,205, 84,214,204,246, 25,117, 84, 41,103,167,
- 73,158,222,226, 58, 17,163, 99,134,242, 31,230, 86,216,144,133, 20, 51, 14, 70, 52,187,241,218, 19,147,102,252,200, 74, 66,234,
-107, 70, 66,243, 68,111, 95,157, 50, 55,115,234, 65, 94, 81, 72,107,141,209,214, 19,127,108,232,173,181,206,171,122, 89, 59,169,
- 37, 76, 37,254,106, 90,206,181,227, 96, 79,246,206,159,172,229, 79,164, 76,231,116, 6,236, 68, 31,220, 57, 88,219, 92,161, 18,
- 41,217,114,198,106, 75,177,115,233, 83,108,109,172,176,190,182,130, 82,130,170, 42, 57, 60,220,231,163, 31,253, 40, 31,253,248,
-199,232,245, 15,200,243,156,103,175,110, 35,227,136,106, 60,194,149, 71, 16, 21,252,246,111, 61,192,205,111,120, 59,111,122,219,
- 31,161,221,240, 67, 72,202,114,204,250,230, 50, 95,247,214, 55,242,171,191,249,155,228,214, 95,173, 44, 77,168,138, 28,109, 53,
-163,209,136,189,189,109,174,110, 27,150,178, 22,103,215, 54,168,242, 17,185,174,200,171,146,229,165, 14, 81,146, 16, 37, 9,103,
- 54,218,124,237, 27,223,196, 83, 87,158,163,170,204, 36,250,148, 66,176,220,237,176,186,182,198,165, 75,151,248,154,215,220,225,
-235,190, 50,166, 44,252, 44,247, 34,207, 41,198, 99,134, 69,193,112, 48, 34,146,112, 60, 26, 32, 17,180, 58, 75,164,105,130,138,
- 98,242,210, 48, 46, 53, 68,138, 70,163, 69,172, 34,228,208,144,231,125, 98, 33,161, 38, 88,185, 25, 41,212,151, 32, 60,115, 93,
-239, 90,184,233,192,147,211,212, 10,165,155, 39,225,207, 23,140, 94,156,210,157,152,233, 29, 23,211, 16, 96,194,226,173,123,238,
-157,195, 74,135,180, 54,136,188, 48,145,150,117, 70,251, 44,146,246,255,182,149,111, 25, 83,206,160,132, 65, 88, 63,251,189, 26,
- 15, 40,203, 28, 99,244,169,250, 15, 94,225,174,244,130, 76, 1,208,125,164,233, 35,126,156,153,108, 80,145, 10,237,126, 74, 76,
- 84,222, 16, 62,125,109,195,189,105,172, 47,109,149,198,131,104,165, 13,214,249,246, 77, 25,181,137, 26, 9,205,172, 77,163,213,
- 37,107,181,105,182, 59,164, 89,147, 70,171, 77,163,217, 36,105, 52, 72, 26, 25,113,154,120, 98, 95,228,219,252,202,188,192,201,
-220, 15,120, 73, 99,226,180, 73,154, 68, 60,249,153, 79,242, 31,255,245, 63, 39,170, 74, 70,253,138,170,116,196,177, 31, 40,146,
-231,190,255,220, 88, 71, 89,121,182,184,113, 22,165,228,100, 46,128,146,120, 6,180,132,118, 39, 99, 48, 30,209, 27,142,144, 73,
- 66,171,221,101,103,119, 31,225, 20, 73,146, 82, 20, 5,221,110,230, 37,151,157,240,154,241,210,159,243,184,204, 73,146,140, 34,
- 47, 49,198,209,105, 38, 36,145, 36,137, 61, 33,179,215, 63, 6, 4,205,216, 51,206,181,113,244,142,123,180, 90, 77,138,241,128,
- 88, 58,132,213, 20,121,193,133,243,231, 24,143, 71, 12, 6,125,150,218,109,142,143,142,137,155, 29,146, 52, 97, 99,109,157,173,
-181, 13,142,142, 14,216,191,122,149, 91,110,190,213,183,178, 2,194, 88,218, 13,159, 77,232,237,239,163,180,229,210, 83, 95, 32,
-207,115, 86, 87,151, 17,210,111,194, 23,206,156,161, 24,245, 73,141, 97,116,180, 79, 51,130,209, 96,128,211, 99, 86,130,208,206,
-114, 51,163, 55, 30,209,104,182,184,250,244, 54,174, 52,108,156, 89,161,151, 15, 65,250,186,235, 77,183,222,206, 67,159,122,130,
-175,127,219,155,217, 90,219,194, 20, 57, 69, 85,226,100,140,115,134,241,120, 76,163,217,164,223,239,179,178,188, 76,115,117, 21,
- 49,214,228,121, 65,127, 52, 96,123,123,151, 78,183, 27, 8,109,126, 96, 73,105,193, 32, 40,130,236,180, 28,121, 96, 79, 19, 69,
- 81, 86, 36,113,204,209,225, 62,105, 43,163,179,186, 76,210,108,162,133, 31,156,226, 42,223,107, 46, 66,203, 87,205,242,150,174,
-198,119, 47,249,138, 80,190,107,164, 14, 2,220,116, 90,154,157, 37,110,201,121, 73,242,217, 98,112,205,127, 21,167,100, 12, 79,
-241,227, 79, 13, 64, 84, 29,228, 9,175,102,103, 67,170, 91, 5, 66,182,181,238, 84, 86,253, 73,101, 57,102,134,202,212, 99, 87,
-173,117,215, 47, 65,202, 19,242,151, 51, 25, 4,203,180, 91,231,164,159, 50,209,191,159,176,242,167,242,153, 94,183,101, 42,229,
- 29, 77, 65,114,186, 89, 91, 99, 48, 82, 80, 57,135, 21, 2,173,245, 28,104, 78,234, 16, 33, 77,105,102, 70, 62,214,145,122, 13,
-224, 58,204,119,214,214,120,205, 12, 83,123,109,102,146,114,135,217, 13, 79, 77, 64,125,238,216,230,100,106,231,107, 17,110,238,
-195, 11,155,134,152,147, 65, 8,159,129, 34,109,181, 33,105,112,241,150, 59, 88,138, 10,158,252,212,111, 50, 62,222,165, 24, 13,
- 73,207, 70, 88,167, 65,104,254,244,247,252, 41,162, 36,225, 51,159,253, 61, 30,125,228,179,188,225,141,175,103, 60, 58, 70,228,
- 61,150, 84,193, 19,191,247, 73,246,199, 21,199, 69,197,219,254,216, 55, 18,103, 49,231, 47,158,227,202, 23, 31,166,149,197,108,
-174, 45,243,166, 55,222,201,199, 62,249,105, 6,253, 99, 36,134,172,145, 98,202,138,225,160,143, 51, 6, 41, 28,195,241,136,125,
-142,144,206,160,117,206, 56, 31,114,203,197,243,108,110,109, 82, 25, 67,162, 4, 87,118,118,232, 13,135, 84,206,248,200, 41,164,
- 48, 81,146, 71, 30,125,132,168, 44,217, 90, 93,241,243,218, 35,133, 85, 38,172, 5,139,148, 80, 22, 94, 18,116,109,101, 5,133,
-164,215,235,211,239, 29,147,181, 59,129,116,225, 16, 17,228,149, 33,138,189,183,239,242, 4, 23,198,179, 58, 99,167,202, 76,238,
-218, 94,234, 23, 3,170,215,136, 53,136,169,176,140, 56, 65,194,100,226,109,207,215,163,132,184,254,235,189, 96, 96,159,233,121,
- 17,115, 58,206,158, 76, 55,171, 41, 45, 3,185, 19,171,125, 71,134,214,129, 45,171,113,101,229,211,229,165,239,158,176, 85, 1,
-182, 68,160,193,149,216,106, 68, 21,230,216,207, 48, 3,252,204, 3,171, 41,203,146,178,238, 55,159, 25, 58,131,117, 83,246,172,
-144,129,211, 39, 60,203,213,129,213, 62, 69,232, 44,104,107,169,180,119,164,173,117, 88,169, 64,165, 68,173,148, 52,107,211,104,
-182,201, 90, 93,210,172,229, 71,219,182,218, 52, 50, 63, 12, 37,206, 26, 68,141, 6,113,154,160, 66,205, 95,169, 40, 8, 98,248,
-180,123,148, 23, 68,105,226,163,133, 40, 70,170,136, 81,239,144,223,253,224,175,209,191,252, 12,162, 95,128,145,164, 73, 66,158,
- 23, 19,193, 35,173, 29,149,113, 40,169, 2,243,222, 51, 91,188,243, 41,136,149,192,104,205,197,155,183,130,214,185, 98, 88,148,
-108,108,109,113,120,220,163, 44, 43, 26, 73, 35,100, 71,252,174, 80, 85,158,112,168, 75, 67, 35,139,233, 15,251,200, 88, 17, 69,
- 49,195, 97, 73, 18,250,197,171, 34,167,219,242, 95,203,178, 32,203,154, 56,107, 73,227,152,171, 59,123, 56,231, 72,226,136,241,
-240,152, 72, 2, 86,179,210,109, 49, 26,248,222,247, 36, 73,168,116,137, 84, 41, 74, 41, 58, 75, 43,108,174,111,209, 59, 60,162,
-127,116,196,205,231, 47,208,204,154, 20,249, 8,165, 64, 40,133,209,134, 98, 52, 66, 23, 57,219, 59, 59,168, 36, 33,145, 41, 43,
- 27,171, 44, 47,175,160,203,138, 70,105,169, 74,205,254,222, 21, 98, 97,176,249,144,149,118, 70, 89,128,197, 82, 90,131,176,134,
-243,231,206,242,212, 51,207,210, 72,253,172,131, 52,138, 81,145, 98, 52,234, 83, 86,130,155,110,125, 13,143, 92,122,138,237,131,
- 17, 81,146,177,177,212, 68,168,146,202, 8,116,105,200,199, 37, 82,197, 88,231, 24, 29, 28,211, 60,123, 22, 43, 74,178,102,198,
-202,218, 26, 7,135, 71, 94, 78, 87, 72, 79,106, 84, 80, 89,104, 52,187, 12, 70, 35,186,157, 14,141, 66, 51, 42, 42, 63, 5,178,
- 30,163,173, 5,101,145, 99,173,165,219,110,161, 85,136,122, 67,103,134,209, 94, 39,196, 89, 55, 33,174, 69,206,215,175,237, 36,
- 45,109,103, 84, 34,235,242,215,236,204,142,122,174, 66,157,206, 22,115, 68,237,137, 82,220, 9,224, 61, 57, 68,101, 50,141,113,
-118,146,225, 68,198,246,196,115, 67, 96, 33,165, 39,176, 10, 41,230,230, 45, 76, 58,195,164,156,116,130,205,242,208,176, 22, 89,
- 15,210,177, 92, 35,145, 61,113, 78,196,124, 58,191,238, 18,240, 66, 78,106,174,157,237,212,173, 83, 76, 70,108,204,232, 1, 76,
- 15, 73, 56,136,252, 5,240,222,148,151,100, 8,128,109,141,239, 43,156,245,148,234,154,121, 29,137, 35, 66,154, 93,207,212,210,
-103,128, 61,252,110,218, 54, 48, 21,170,152,120,114,129, 96, 33, 38,105,117,137,194,205,164,212,197, 28,147,217,205,230, 42,234,
-250,203,236,152, 60,220,252,200, 63, 49,221,156,133, 84, 52,151, 55,104, 52, 91, 92,188,112,129, 71, 31,250, 48,199, 71, 3, 62,
-255,153, 47, 48, 28,149, 52,178, 46,198, 9,122,135,125,206,223,122, 59, 31,250,240,131,236,238, 94,161,221,238,240,198,215,223,
-201,225,206,101,226,252,136,253,209, 33,219,151,159, 97, 48, 30, 65,163, 77, 43,145, 84,197,152, 86,183,195,217,243, 23,233, 29,
- 29,178,220,110,242, 71,222,254,181,124,244,161, 79, 96,113,236,237,237, 32,133, 32,141,163, 9,153,207, 6,105,133,222,104, 64,
- 43, 73, 41,202, 2,167, 50,174,238, 31,144,180,154, 24, 4,135,219,123, 92,122,238, 89,182,206,109, 49, 58,238, 79, 64,200, 58,
-203,225,209, 49,145, 54,220,121,203,205, 92,221,219,163, 50,190,215, 95,103, 37, 75,157, 46,221,205, 13,178,102, 6,199,125,146,
- 36, 69, 9,104,183,154, 68, 42,166, 55, 28, 49, 24,142, 16, 50, 34,109,118,208, 78, 7, 50,134, 66,197, 2,209,108, 35,148,194,
- 86,214, 59,205, 51,173, 35,207,135,163, 47, 20,232,197, 76,155,200,244,101,221,220,168,220,147, 53,115,113,234,235,212,213, 59,
- 59,247,140,249,251,194, 93, 91,217, 23,179,178,173,243,233,250,169,100,177, 65,132,182, 48,107, 42,108,229, 85,219,108, 85, 81,
- 85, 37, 46,244,138, 87, 69,129, 46,198, 84,197, 8, 93,142, 48,122, 12,166, 64,186, 10,233,202, 41, 79,196,214, 35,104,157, 7,
-227,202, 59, 8, 54,100, 4,100, 16,196,112,114,218, 74, 99,194,156,105, 83, 79,195,114, 6, 75,168,105, 58, 25, 24,234, 25,113,
- 35,165,153,101, 36,205, 54,141,102,135,172,217, 34,107,119,167,209,120,214, 36,110, 52,104,100,141, 73,139,157, 74, 98, 79,186,
- 81, 94,146,114,162,104, 21,238,183,200, 70, 68, 73, 68,148,198, 24,227, 80, 68,216,106,196, 51, 79,124,142, 79,125,248, 65,108,
-127,140,170, 28,113, 28,211,235,143, 61,143, 64, 8,156,113,104,235,130, 62,190, 11, 85,177, 25, 49, 34,225,181,255,147, 88, 16,
- 41,112, 66,113, 60, 24,147, 54,154, 56,161, 56,236, 13,105, 38, 73,184, 87, 36,113,146,160, 67, 41,163,172, 74,164, 18, 12, 71,
- 99,170,202,208,106, 54, 61,107,216, 26,146, 88,145, 68, 42, 12,154,139, 57, 62, 62, 14,233,122,133,118,126,198,186,148,146, 72,
- 73,198,195, 30,182, 42, 81,141, 4,137, 7,171, 52,137,177,214,209,110,181, 56,234, 13, 88, 63,179, 74,179,211,101,105,105,137,
-209,104,200,120, 52,226,220,153, 45,146, 40,162, 24, 28, 51, 28, 12,184,120,211, 69,116, 85,113,216, 31, 80, 85, 21,251,135, 7,
-136, 56, 66,166, 9,235,221,101, 86,214, 86, 73,163, 4, 41, 5,131,253, 61,170,188, 79, 83,104,178, 86,140,150, 10,116, 1,174,
- 66, 56,199,234,242, 18,249,120,204,193,238,190,207,146, 73, 73,220,204, 80,145,162,219,108,123,254,133,243,186,246, 95,243,198,
- 55,242,240,227,143,115,225,226,121,142,134, 99, 54,215, 87, 17,185, 38, 47, 10,198, 69,133,147, 99, 86, 55,214, 25,231, 5,163,
-157,109,150,206, 94,160,234, 15, 17,114,192,250,250, 26,219,219,187, 72,169, 40,181, 87,251,204,139,130,245,181, 45,246,183, 71,
-168, 40, 9,211,192, 12,145, 82,100, 8,138,225,144, 52, 75,169,180,102, 56, 24,112,190,121, 11,180, 51, 42,171, 17,198,115, 12,
-170,160,163,224,130,192,204,116, 70,249, 84,144,102,170,200, 38,194, 61,235,203,123,211, 72,124,218,170,229,196,201,136,149,201,
-208,152, 58, 13,109,103,238, 41,234, 72,121,146, 97,243,153, 91, 87,103,133,235, 50, 49,179,229,221,208, 7,111, 79,100, 35,103,
-218,212,152,237, 59,151,110, 78, 8,199, 90,223, 85, 53,217, 51,228,116, 64,204,201, 89,204,147, 96,115, 70, 95,163, 14, 38, 78,
-234,209,207,189,134,152, 33,209,157,140,226,221,124,121, 34, 50, 85,229,123,168, 67, 58,208,204, 40,220, 72,121, 98, 80,189,179,
-126, 0,134,115,190, 54,110,185, 22,204,235,154,121, 72,191, 59, 59,141,230, 20, 98,102,110,187, 59,117, 18,220,220,168, 85,166,
-162,252,245, 28, 9,199, 84,112,255,180,218,131, 21, 53,156, 7,165,108, 59,173,237, 38,205, 46,173,149, 45,162, 52,161, 17, 73,
- 30,123,244, 9, 62,255,240, 23,121,234,202, 17,155, 91,107, 36,141, 37,112,146, 47, 62,246, 4,223,253,103,191,135,183,191,253,
- 46,126,229, 87,254, 35, 95,127,215,215,211,206, 90, 12,243, 29,198,197,144,167,158,122,154,131,157, 61,198,123,251, 36,157, 77,
-170,254,128,161, 30, 34,141,225,194,173,119,240,248,231, 62,205,185,115, 27, 20,186,228,194,153, 53, 30,253,226,115,254, 60,180,
- 38,247,236,194,137,166,182, 11, 35, 90, 13,142,194, 90,244,112,204,241,104,140, 76, 26,172,175, 90,126,239, 11, 95, 32, 55,134,
-178,172,176, 85, 73, 2,196,137,239,255, 85,128, 54,150,195,129,175,151, 27, 99,105,101, 25,214, 89,140, 51,148,213, 24, 33,160,
-221,233, 50, 28,142,189,144, 80,104,179,242, 68, 20, 75,239,232,128,150, 49,196, 89,155, 40, 82, 20, 85, 73,156,164, 72,153,248,
- 72,113, 34,255, 32,103,250,187,195, 34,146, 98,114, 35,156, 70,148, 59, 13,216, 93, 72, 41,207,227,173,156, 43, 84,157, 20, 68,
-154,180,193,185,122,220,233, 41, 16, 47,236,132,210, 54,223,131,201,156, 92,235, 44, 49,197,205, 78,130,169,179, 14,129,228,137,
-177,158, 4,170,189,208,139,209, 26, 91,149,158,167, 80,122, 98,155,169, 10, 76,158, 83,149, 57, 85, 89,160, 75,255,111, 93,228,
-152, 34, 7, 83, 32,108,133,180, 6,229, 44,132, 26,152,157,145,122, 85,147,227,148, 51, 27,149,159, 22,109, 49,129,210,226, 66,
- 31,106, 16,179,137, 34,100,220, 36, 74, 83,210, 70,147, 52,107,121,224,110,250, 40, 60,205, 90,225,107,131,180,217, 36,105,164,
-196,137, 79,169,203, 72, 33,227, 32,244, 51, 59, 90,185,190,182,202, 77, 54, 30, 89,107,255,203,216,215, 29, 43, 11, 6,236,224,
-144,223,248,229,159, 99,231,137,199,105,104,223, 35, 59, 24,141,194, 36, 67,159, 77,208, 38, 72,200, 74,175, 59, 80, 11, 80, 85,
- 97,160, 19, 74, 82, 26,203,230,198, 18,121, 62, 36, 82, 9,163, 97,193,242,214, 22,251,199,125, 12, 80, 26, 77,187,217,164, 40,
- 11, 26, 89, 74, 94,230, 65, 11,192, 18, 41,201,176, 55,164,213,110,163,100,204,112, 56,166,170, 74,226,212,207,105,108,183,186,
- 56, 43, 24, 14,134, 36, 89,230,235,188, 34,162, 52, 6, 93, 22,164,177, 36, 31, 14,189,248, 9, 14,173, 43,210, 36,194, 90,205,
-234,210, 50,199,199,199,180, 86, 54, 72,219, 75,108,156, 59, 75, 89, 89, 70,131, 99,178, 44,193,152, 10,109, 74, 40, 11, 46,108,
-174, 49, 60, 58,162, 63, 26, 81, 89, 71,169, 53,253,209,144,238,218, 38, 89,167,203,210,234, 6,203, 75, 43, 12,123, 71,140, 71,
- 61, 26, 25,168,178, 96,115,185,205,238,222, 85, 34,105,217, 59, 62, 96,107,115,147, 36, 73,185,124,121,155,168,209,162, 24,247,
-145,214,239,151,173,149, 46,227,113,206,198,242, 58,123,251,199,116,214, 54,216,222,185,204, 27,222,250,117, 60,254,197,199,184,
-188,115,149,179, 27,107, 28, 14,114, 54,214,215, 41,181,230,112,111,215,151, 11,139, 18, 41, 44,228, 57,253,203,151,105, 46,173,
-208, 25,143,184,114,229, 42, 27, 27, 43, 60,119,121,135, 56,107,122,114, 32, 21,206, 88,146, 36,165,210,134,180,217,162, 10,163,
-112,187, 73, 66,127, 48,160, 50, 6, 87, 85,228,253, 1,186, 44,105,182, 87, 80, 82,128,118, 68, 70, 19,213,109,151, 85, 5,149,
-231, 82, 57,107, 2, 56,217,233,112,148, 0,114, 54,148, 98, 38,147, 6, 3,147,219, 73, 49, 25,202, 58,155,113,245,105,110, 51,
-105, 33,197, 19,234, 39, 51, 68,106,182,186,181, 33,227, 53,153, 17,226, 39,192,213,101,229,201, 56,165,144, 85, 16, 56,223, 70,
-235,166, 37,131, 73, 13,188,214, 7,158,189, 87,102,102, 59, 72,102, 51, 6, 39, 2, 75, 59, 27, 8,137, 41,225,143,147,229, 5,
- 55,229,171,205, 12,105, 98, 70, 46,122,174,199,254,148, 8,169,158,193, 16, 21,101, 21,134,128, 48, 17,155, 23,115,140,114, 38,
-158,144,179, 46,204, 66,175,163,241,105, 58,222,154, 48,102, 47,212,199,173,152,170,134,205, 74,206,214,206,194, 68,228, 67,206,
-232,101,135, 19, 53, 19,198,161,240,227, 28,237,137,168,107,102,200, 4, 39, 90,156,156,152,140,244, 0, 66,116,131,103, 56, 54,
- 59, 29,140,112,180, 26, 9,203,171, 93,198,213,152, 39,158,121,138, 88, 9, 94,247,250,215,211,233,180, 24,246, 70,236,110, 95,
-229,119, 63,242, 59,220,116,225, 2,107, 43,171,220,126,235,109, 28,236, 31, 32,170,130, 98, 60,230,184,231, 91,204,154,205, 6,
- 74, 10,250,253, 30,207, 93,126, 26, 5,124,227,215,125, 45,203,203,171,140, 6, 67,154,105,194,155,238,124, 29, 15, 63,254, 20,
- 66,168,137,102,182,138, 34,175,154, 23, 72, 35, 82, 72, 42, 93,249,158,104, 96, 84, 22, 60,252,196, 19,116,183,183, 25,140, 71,
- 24, 96,239,224, 32,200,194,166, 94,150,180, 50, 40, 41,136,130,220,107,146, 36,190,198,106, 12, 82,122,110,128,174, 42,202,178,
-164,221,110,179,191,119, 72,214,109,161, 34,133, 27,123, 49, 21,107, 60, 9,238,232, 96,159, 40,205, 73,219, 75, 94,145, 47,170,
-181,135, 35,127,227,217,153, 69, 53,115, 33, 94,174,186,250,139, 74,155,139,235,145,245,228,252,141, 50,199,102,113,147, 6,245,
-169, 56, 93,152,216,132, 8, 35,100,167,164, 80,167,117,144, 88, 13,181,237,170,192, 20, 1,172,203, 49,174, 40,168,138, 17, 85,
-225,127, 94, 21, 5,101,153, 83, 21,121, 24,105, 90, 5, 77,118,131, 10, 3,123,140, 16,104, 39, 48,120,135, 23,132,119, 64,165,
- 5,235,193,222, 56,225,123,100,173, 11,135,226, 35, 22, 21,167,196, 73, 70,210,200,104,100, 77, 26, 89,139, 70,107,153, 70,179,
- 69,150, 53, 73,155,205, 0,234,205, 16,141, 39, 68,169,143,196, 39,189,241, 65,181, 15, 9, 82,137, 27, 23, 29, 79,100, 52, 60,
- 6, 11,172, 4,105, 53,143,126,226, 19, 60,244,129, 15,210,112,120,146,154,214,232,202,162,132, 7,109,231, 44,145, 82, 32, 64,
- 41, 49,233,145,175,115, 41,113, 96,235, 43, 37, 73, 27, 9, 69, 94, 81, 86,154,172,217,164,172, 42,122,199, 61,162, 36, 66, 10,
- 73, 20, 7, 61,248,144,254,173,247,147,178, 44,137,162,136, 44,107, 50, 42, 42,198,163, 2,112,164, 73,140,115,154, 40, 82, 12,
- 6,253, 32, 83, 45, 41,203,138, 82,151,126, 99,181,150,162, 44,145, 66,146,101, 9,163,209,152, 44,139, 16, 82,208,233,116,232,
-245,251, 52,178,140,238,234, 26, 89,171, 69,154,166, 28, 31,239,134,185, 18, 18,140, 99, 56, 30,179,220, 93, 98,239, 96,159,254,
-112,132, 74, 26,140, 10,205,195,143, 60,198,237,119,188, 22,153, 53,105,183,151, 72,147,132, 81,191,135,206,135,232,241,128, 36,
-114,172, 45,117,120,242,210,227, 8, 37,216,217,217,230,206, 59, 95,135,115,240,204,115, 87,105,181, 59, 60,187,125,196,206,229,
- 3, 46,158, 93,165,217,237,114,212, 31, 16, 75, 63,110, 83, 10, 73,255,184, 79,107,101,137,171,151,159,227, 53,119,220,193,231,
- 31,126,152,181,213,111, 34,178,112,208, 59,230,236,133,243,228,227, 49,251,135, 7, 88,107, 56,115,230, 12, 66, 8,226, 72, 50,
- 56,218,167,217,202, 88, 93, 94,226,168,215,167,211,106,114, 60, 24, 19, 41,133,182,134,193,160,207,218,218, 26,219, 87,175,210,
- 93, 90,162, 8,123, 72, 97, 42,162, 36,162, 26,142,137,173, 39,226, 30, 28, 29,178,244,186,155,145, 73,130, 52, 18, 99,189,204,
-178,159, 51,160,113,149,198,150,154,202, 20, 62, 96,212, 26,172, 9,227, 73,235, 25,107,106,118,144,185, 47, 53, 73,233, 65, 93,
- 76, 92,203, 41, 49,219, 90,140, 22,158,101, 31, 50, 1, 78,224,231, 88, 72, 55,217,175,172, 85,147,113,176,218,250,182, 79,105,
-157,223,115,235,145,168,206,103,119, 16,118,162, 49, 97,235, 97, 85,117, 38, 65,202,233, 80,149, 90,240, 69,138,235,138,107, 77,
- 34,230,217,178,240, 76, 26,223,205, 41, 96, 50, 55, 93,141, 83,244, 63,102,247,218, 9, 14,159, 58, 1,211, 78, 30, 81, 89,234,
-137, 14,110,205, 42,159, 75, 13,132,153,180, 53, 96,215,195, 85,140,177,158, 32, 49, 51,132, 94, 78,122, 4,229,140,148,231, 12,
-176, 51,155, 82,119,115,196,187, 57,160, 16,115, 19,235, 39, 26,183,206,205,207, 4,225,132, 50, 79,221,155,120,141, 38,185,243,
-245,249,172,213,162,212, 6,163,125, 31,247,235,223,244, 53,252,194,207,195,205, 55,221,236,107,140, 74,112, 48, 26, 32, 28,124,
-252,119, 63, 74, 43,107,242,173,119,127, 43,105,156, 98,170, 10,170,146,126,191, 79, 20, 69, 52,218, 93, 4,154,179,103, 54,249,
-237, 15,127, 24, 99, 45,111,122,211,155,200,218, 75, 84,214,209, 63, 60,164,208, 21, 55,111,109,208,136, 36,133,177, 88,124, 36,
-211,110,181,168,170,138,193,104, 64,162, 34,150,187, 75, 32, 28,189,209,128, 82, 87, 8, 37,169,132,229,112, 60,160, 8,245,236,
- 74,251,133,185,188,177, 66,154,164, 20, 69,233,103,186,199, 49,121, 89,144,197,209,180,191, 19, 40,203,146,209,112,192,193,254,
- 1, 75,107, 9, 89,214, 96, 52, 26, 33, 85,140,140, 36, 73, 28, 35, 0, 93,249,141,110, 52, 56,198, 56, 16, 81, 10, 73, 4, 66,
-122, 1, 12,107, 39,158,232, 12, 43,100,158,217,254, 18,234,218, 47, 25,216,175,155,202, 23,167, 14, 87, 96,110,238, 50,243, 3,
- 82,220,140, 16,133,243,224,234,116,133,211, 37,174, 42,125,100, 94, 21,216,114,236, 65, 61, 31,163,139, 17,166, 8,218,221, 1,
-196,167,105, 71,175,169, 46,173, 9,105,116,135,149,225, 70, 54, 2,167, 8,189,189,142,202,122, 98, 81, 89, 85,148,218, 98,156,
-196, 32,113, 34, 66,166, 49,105,156,145, 54, 58,196,105, 74,163,217,166,209,234,144, 54,219,164, 89,147,102,171, 77,218,104,145,
-181,154,164,141,148, 40, 73,136, 83, 79,172,140,226, 8, 25,123, 97, 10, 89, 11,232,132,238, 2, 39,110,240,121,206,104, 77,206,
-101, 53,194,166,228, 89,247,150,203, 79, 61,206,191,255,217,159,165, 53, 46,201, 71, 5,133,213,104, 3, 10, 65,165,141,239,233,
-247,170, 34,196,145, 12,164, 40, 48, 2, 42, 61,175,228,189,182,218,241, 34, 50, 74,209, 31,143,201,186,203, 92,221, 63, 12, 89,
- 36,175, 35,160,141,241,142, 40,206,143,157, 20, 2,163,253,231,150, 54, 26, 20,101, 73, 85,129,174, 28,145, 84, 68,145,164,217,
-108,144,164, 49,207, 62,115, 64,146, 38, 84,149, 70, 84, 26, 67,228, 91, 8,203,156, 24,136, 34,129,179, 16, 43, 1,198,176,178,
-182,194, 96, 48,160, 44, 53, 43,235,103,104,181,187,108,157, 59,199,149,203, 87, 88, 94,234,250, 97, 40, 69, 78, 49, 30,209,110,
-101, 12,134, 3,246, 14, 15, 41,181, 35, 63, 28,240,236,149,109,238,120,237,157,104, 39,104, 68, 9,214, 57,242, 65,159, 72, 24,
-142,183,159,227,166, 51,171,152,124,192, 99, 15,127,129, 36, 82, 28, 31, 13,184,253,142,215,178,119,216, 99,239,224,144,229,149,
- 53,158,120,118,135, 71, 46,237,114,235,185, 46, 73,187, 67,229,252,124,243, 52,107,160, 17, 44, 47, 47,241,197,103,158,161,217,
-109,178,191,183,195, 27,222,242,117, 92,222,190,202,167, 62,251,121,238,186,235,235,216,191,186, 77,179,213,102,253,204, 25, 42,
-173,201, 75,205,222,238, 62, 91, 91, 27, 96, 52, 38, 31,210, 94,191,128,206,135,244,251, 61,100, 28,211,206, 28,199,189, 62,173,
-102, 74, 85,105,210, 52,245,193, 66,104,193, 52,206,226,132, 98,109,109,157,254,240, 89,164,177,152,188,228,240,224,128, 11, 88,
-162,102, 19,108,228,197,193,172, 95,255,232, 10, 97, 44, 86, 27, 68, 53,246,130, 73, 85, 21,134, 13,121,208,175, 71, 7,251,241,
- 2, 53,179, 60,168, 79, 69,129, 71, 81, 71,245, 53, 8, 3,194, 10,172,118,160,103,120, 89,245,212,178,122,189, 59,233,131, 67,
- 39, 81, 78, 34,106, 86,122, 29,153,135, 72, 95, 88,137, 13, 42,145,152,217,201,194, 33, 50, 87, 18, 25, 69,147, 18, 85, 61,104,
-101,110,222, 51,243, 53,118, 78, 2,250, 76, 45,127,162, 56, 57, 59,176,169,126, 13,107,152,105, 78,155, 0,253,164, 13,143,105,
-166, 97,118,248,140,157,148, 16,194, 84,211,162,170,230,122,207,231,102, 56,135, 8,102,154, 98,159, 37,183,185,153,217,208,114,
-174,111,143, 80,119,144, 39,167,186,213,100, 11, 33, 64,213, 41, 23, 55, 55,218,145, 48,101,103,210, 78, 56,245,103,166, 35, 43,
-167,217,194, 9,145,168, 30, 67, 39,101, 45,233,167, 2,201,105,186, 91, 73, 25,161, 75, 67, 53, 44,120,228,179,143,240,141,223,
-240, 77,124,247,247,124, 47,227,195,125,108,233,133, 39, 98, 47,113,197,179,207, 62,195,109,175,255, 26, 90,205, 54,163, 81, 78,
-214, 80, 68, 66, 82,228, 5,166,178,220,124,238, 28,141,170,203,197,139,231, 41,139, 17, 50, 74,105,119,150, 17, 81, 74,107,121,
-141,189,237,171,236,237,237,162,172,161,145, 68, 20, 99, 31, 73, 88,231,168,180,246, 25, 17, 7, 90, 87, 28, 28,239,147, 38, 41,
- 74, 74, 26, 89, 74,127,168,189,232,142,153,182,238, 88,231,232,100, 13,112,142,231, 46, 95, 38,137, 19,218,237, 22,205,102, 70,
-148,196,164,145,191,249, 84, 20, 97, 66,171, 79, 25, 24,213,113, 18,177,190,190,198,179,207, 60, 69,187,209, 32,118, 2,198, 57,
- 72, 69, 28,251, 77, 47,137, 35, 70,195, 62,142, 17, 42,138,253,168,197, 40,193,134, 73,108,215,232,166,159, 54, 78,245, 6, 34,
- 48,167, 78, 41, 19,226,212, 66,249,196,177,115,243, 2, 52,238, 68, 73,223,157, 86,103,159, 29, 30, 83,175,117,225, 35,130, 9,
-177, 47, 12,254,169,167,250, 57, 27, 6,158, 88,237,117,210,117,129, 45,115, 76,153, 99,202, 2, 83,140, 40,243, 49, 38,207, 3,
-168,135,159, 87,133,159,122,102, 29,202,216, 32,169, 11, 86,250, 86, 24, 43, 44, 78, 24,180,181,148,198, 80, 24, 63,217, 47, 47,
- 75, 42,237, 48, 70, 97, 69,140,108, 36, 36, 73, 70,212,104,146, 52,154, 52,154, 30,180, 27,141, 38, 73,150,145, 52,154,164,173,
- 38, 73,179, 69,146,102,164, 89, 70,156, 72,226, 36, 38,138,149,215,152,143,130,210,148,154, 14,142,152,235,215,175, 21,109, 39,
- 51,152,220,105,179, 32,230,117,221,167,204, 72, 36, 80, 13,122,252,254,135, 30,224,224,169, 39, 48,189, 62,169, 18,140, 66,197,
-195, 89,135,148, 42,100,198, 32, 75, 61,203,217, 58, 40,141,191,167, 45,144,168, 16,165, 75,207, 47, 49,166, 96, 84,142,137, 50,
- 63,195,160,172,180,111,211,171,179,124,210, 71,107,149,174,136, 34, 21,122,237, 53,149,174, 72, 27, 41, 8, 65,127, 48, 36, 77,
- 83, 18,101,201,210,148, 52,142, 25, 14, 6,228,165,166,217,110, 51,202, 43,136,140,151, 92,173,188, 48,144,136, 36,173, 44,163,
- 24,143,145,192, 82,199, 15, 53, 49,198,146,181, 59,164,173, 22, 75, 75, 75, 60,251,244,211, 52,146,152, 84, 65, 53,236, 49,232,
-251, 33, 47,227,161,102,239,176,207,113,127, 8, 82,241,236,229, 29,110,189,253,181,244,250,158,240,151,180,154, 56, 45, 40,202,
- 17,219, 59,151, 57,187,182, 68,111,255, 42, 79,127,241,113, 34,165,216,221, 31,113,225,194,121, 46, 95,221,101,152, 23,168,180,
-201,115,187,251, 28, 14,198,156,185,176, 74,179,219,130, 36,241, 26,241,169, 31,217,108,227,148,106, 60,102,121,121,137,126,191,
-143, 72, 18,250,189, 67,110,186,233, 38, 62,255,249, 47,176,189,179,203,234,234, 10,159,125,248, 97,190,246,205,111, 38,206,154,
-244, 14, 15,144,101,233,117,226, 71,125,150,150, 58, 12,246,247,104,181,154,108,109,174,115,101,123,159, 86, 51, 99, 56, 26,146,
- 23, 57,173, 86,147,131,163, 35,210, 70, 3,109, 60,192, 39, 73, 66,101, 28,227,241,136,213,149, 85, 14,118, 15,200, 71, 99,196,
-104, 76,255,240,152,213,229, 53,136,146,144,137, 12,105,213,208,222, 38,141,193,234, 24,103, 12,170, 42,113,165,215,113,208, 69,
-238, 65, 94,135,154, 58,245,176, 32,159,122, 71,120, 57, 84, 23,114,110, 66, 4, 98,182, 54,232,210,119,139,216,202,119, 86, 89,
-231,103,122,200,216,139,223,136, 32,130, 67, 36, 67,157,218,131,184,156,104,157,132,180,189,177,211,177,197,181,148,178,141, 38,
-169,112,164,152,142, 63, 13,195,159,234,175,238, 58, 97,134,152, 1,243, 73, 73,207, 77,123,242, 39, 83,225, 78,164,209,235,160,
-130,153,121,238, 39, 91,205,153,144,209,167,196,229,169, 64,206, 52,130,143,138, 74, 79, 53,219,107, 15, 98,166, 30, 48,235,121,
-156, 84, 14,171,101,242,102, 31,115,209,220, 12, 99,126, 62, 82,159,201,165,134, 17,158,117, 75,145, 19,211, 41,170,204,120, 53,
- 83,150,178,152,168,205, 77,132,233, 39, 35,233,100,232,103,158,214, 98,156,156,138, 0,152,170,162, 56, 62,102,100, 99, 30,217,
-190,194,193,206, 10,111,126,227,215,112,233, 51,159,163,234,247, 57,216,219,163,217,104,227,128,170,210,236,238,238,243,103,191,
-247, 94, 62,248,107, 15,160,164,100,220,235, 81, 22, 37,237, 86,139, 56,138,217, 92,217,228,117,175,125, 13,159,124,246,128, 24,
-197,238,206, 14,168,183,176,178,126,134,135, 63,251, 41,242,188,160,145, 36,126, 26, 88,224, 2, 56, 41, 41,202,156, 88, 42,226,
- 64,144,168, 76,133, 43,124,230, 67, 42, 53, 71,244, 19, 14, 34,229, 83,126,205, 44, 35,138, 20, 23, 47, 92, 96,111,255,128,188,
- 44,145,195, 33,203,157,206, 68,183,189,223,239,211,106,164, 24,227, 69, 77,108,200,172,168, 72,209,110,183,252,168,211, 68,209,
- 89, 90,198, 88,208,149, 65, 42, 77, 89,105, 98, 3,163,178,100,111,119,151,173,179,231,145, 50,154,150, 50,196,204,240, 28,119,
-227,244,251,141,164, 98, 39,181,242, 89, 7,112, 70,102,113,218,170,120,173,227, 32,102, 28,187,185,153,222, 98,110, 10, 66,184,
-137,236, 20,192, 1, 35,100, 72,223,233, 64,124,171,194,192, 19, 3, 58, 7,237, 71,148,122, 64,247, 76,118, 83,230,232, 50,159,
-164,216,235,105,104, 46,200,186, 58, 99,153, 29, 84, 24, 74,241,104,227, 38,227, 36, 61,121,209, 80, 26, 71,105, 28,134, 8,178,
- 6,141, 56, 37,138,151, 72,210, 38,105,195, 3,118,220,104,146,100, 45,255,125,163, 65,146,196, 36,141, 6,113, 35, 69,133, 72,
- 92,198,145, 39,184, 41, 27, 68, 92,228, 68,142, 83,136,217,154,221,245, 4,164,174, 43,223, 63, 63, 8,105, 58,103, 17, 37, 5,
-213,184,224,232,242,115, 92,254,236,167, 57,222,126,142,229, 68, 81,148,165, 23,130, 10, 68, 91,240,147, 12, 19,229,147, 61, 78,
- 8, 74,141,223,140, 29, 19, 71, 35,138,164,215,119,215, 37, 90, 23, 24,103,105, 54, 91,108, 63,115,117, 50, 44,196, 24, 75,220,
-204,252, 60,118,169,168,202, 2, 33, 34, 15, 48, 85,229,179, 72,198, 80, 21, 21, 14,135,177, 21, 81, 24,179,154, 53, 82,158,125,
-238, 42,113,156, 96,172, 96, 52, 42,113,178, 36,205, 26, 20, 69, 14,214,210, 72, 27, 30,224,173,207, 40, 72, 41, 24, 12,250,200,
- 56,161,213,237,144,100, 25,135, 7,123, 56,163,137, 16, 84,163, 1,163, 97,159,209, 96,136,104,181,232, 13, 70, 20,149,159,103,
-177,183,183,203,250,218, 42,189,227, 67,132,138, 88, 90, 94,161, 28, 29,145,201, 6,187,207, 62,201,230, 74, 7, 83,244,121,230,
-169, 75, 8, 4, 7,189, 49,183,220,113, 59,135,135,199,244, 6, 99, 58, 43, 43,244, 6, 67,134,101, 69,179,219, 36,105, 36,164,
- 89,131,229,141, 53, 90,221, 54,178,215,163, 24,151,168,102,215,247,249, 27,195,120, 52,164,221,108,242,196, 99,143,113,238,166,
- 91,184,112,225, 2,143, 63,126,137, 59,239,124, 45,101,101,249,194,163,143,115,225,220, 89,122,253, 62,199,131, 33, 74, 69,108,
-110,174,254,255,169,251,207,103, 75,179, 44,189, 15,251,109,251,154,227,174,203,204,178,221, 61,221, 51,156, 1,201,129, 33, 40,
- 58,136, 33,134, 28, 21, 82, 72, 17,252,231,244, 69,255,129,164, 80, 48,100,130, 65, 41,164, 0, 29, 8,130, 67, 12, 49,152,193,
-116, 79,187,170, 46,147,246,154, 99, 95,183,141, 62,172,125,206, 61, 55, 43,187,167, 7, 4, 64,178, 34,110,100, 86,213, 77,115,
-239, 57,239, 94,123,173,245, 60,191,135,113, 12, 52, 77, 67, 8, 9,239,189, 96,102,239, 30, 88, 44,231,188,126,253,154,190,239,
-113,218,178, 92, 46,217, 31,246,104, 43, 78,136,161,239,200, 74,227,171, 90,178,226,187,142,102, 12,236,222,222,114,249,241,167,
-168,218,161,138, 78, 3, 52,152, 66, 2, 77, 17,235, 28, 41, 6,180,157,200,110, 66, 89, 79, 54,150, 60,244,132,126, 40, 81,209,
-169,104,102, 34, 42, 62,178,213,143,145,202, 57,171, 2,252, 9,140,227,196,208,143,140,253,200, 56,142,114,145,212, 10,235, 45,
-174,242,248,202,227,144,172, 13, 93,210, 18,143,157,224,209,122,150, 99, 38,170, 8, 73, 23,209,166,146,177,255,209,201,117, 76,
- 89, 43, 59,245, 92,160, 88,249,177,178,124,248, 28,124,175, 75, 63,213,193, 99,230,124,153,120, 63,109,158,207,132,125,241,241,
-207,127,154,212,120,206,170,143, 79, 70,241, 71, 17,250,113,223,110,199,113,122, 98,158,127,223,147,247,161,221, 1,124,119,102,
-247, 93,211,252,211, 67, 90,107,141, 81,250,201, 14,253, 92, 28,247, 56,106,120, 44,104, 71,111,222,163, 56,193,136, 5,226, 44,
- 9,235, 40,246, 57, 69, 94,150,221,105, 78,234, 44,225, 77, 68,121,211,176,163,123,120,141,234, 59,250, 16,120,243,234,199,164,
-220, 19,246, 27,118,239,238, 48,109,205, 48, 12,204, 86,115,148,173,112,190,102,138,240,209,199,159,241,246,245, 75,246,187, 45,
- 49, 70, 22,139, 5,159,124,242, 17, 55, 85,230,243,207, 63,229, 31,252,236,107,252,204,243,237,203,151,124,245,237, 43,190,247,
-217,247, 88,222, 60,231, 87, 95,255, 10,101, 12, 77, 85,145,183,187,211,247, 44,229, 92, 46, 38,178,167,137, 36, 18, 25,163,133,
-102,100, 10, 30, 87, 6, 26,199,213, 8, 69, 9, 45, 20,246,205,126, 71, 76,137,190,239, 32, 37,174, 86, 75, 98,140, 12,227,192,
- 48,244, 56,171, 73, 37,179,222, 25, 75, 72,177,236, 87, 29, 41,130,111,106,234,122,134, 82,154,183,111,222,160,147,112,216, 61,
-138,125, 63,113,232, 58,102, 74,160, 38, 74,169,239, 40,201,159,236,125,242,123, 89,224,191,177, 91, 87, 79, 45, 34,239, 13,208,
-207, 63,237, 59,208,136,252,244,231, 79,212,165,249,209, 21,145, 79, 56,202,116,202, 14, 16, 97,218, 17,183, 58, 66, 44,105,102,
-101,103,158,199,161,160, 90, 59, 66,233,194,195, 52, 72, 55,113, 28,207, 37,158, 60, 68, 49,113,202, 51,152, 66,100, 74,153, 16,
-115, 97, 52, 40, 82,182, 68, 60,170,178,212,174,162,117, 53,198, 55,152,170,198,215, 51, 92, 53,199, 85, 53, 85, 93,227,234, 6,
- 87, 53,216,170,194,249, 10,235, 44,214, 73,214,188,246,101,252,103,213,137,196, 7,250,140,240,152, 79, 40,204,156,249, 14, 58,
-249,175,106,254, 83,103, 78, 18, 13, 18, 54,147, 35,119, 95,127,197, 55,255,248, 79, 48, 58,178,155, 6,121,189, 67,230,152,109,
- 99,202,134,180,118, 10,239, 52,135, 97, 98,152, 32,160, 9,229,253,165,203,163,220,212,142, 16, 36,110,115,182,156,243,230,221,
- 61,161,168,252,157,183,140, 67,143,175,252, 41, 26, 83,105,141,117,142, 97, 24, 8, 49,210, 52, 53, 93,223, 81, 38,172,104,173,
-184,184, 92, 18,166, 1,173, 13, 15, 15, 7,158,191,184, 96,191, 31,232,250,145,213,101, 85, 2, 72,192, 91,131,247,150,169,235,
-176,198,114,185,154,209, 29,118, 56,107,176, 85,205,108,190, 64, 25, 75,119,216,211,214, 21,196,145,126,127, 28,187,207,216,117,
- 29, 15,235, 45, 57, 89,238, 31, 30,104,154,154,105,232, 81,206,114,177,108, 9,211,158,198, 40,190,249,197, 47,184, 90, 54, 48,
-110,248,230,245, 75,198, 49,144,148,225,249,103,159,242,205,219,119,188,124,245,150, 23, 31,125,202, 16, 97,202,160,189,167,106,
- 43,234,218,114,117,125,193,197,205, 5,179,229,138, 80,123,186, 46,224, 77, 35, 55,164, 12,125, 8,236,118, 59,170,186, 33, 78,
- 35,164, 68,219,212,188,252,230, 91,158,127,244,156,175,190,250,134,229,106,137,173,229, 76,123,216,237, 48,206,113,177, 90, 16,
- 66,135,117,134,118,177,128,253,129,102,222,176, 63,116,180,109,203,225,112,160,174,234,114, 81, 74,132,105, 68,105,133,201,138,
-108, 12, 73,107,162,146, 46, 87, 77,145,135,175, 94,241,226,179,239, 99, 47, 53,182,170,209,222, 75, 39,171,101,106, 68, 6, 83,
-196,162,217,138, 78, 69, 91,143,178, 14,229, 28,202, 88, 18, 7,166, 94, 26, 16,131,150,201, 87,214, 24,132, 31, 47,181, 48, 17,
-167, 72, 63, 78,116, 93,199, 97,191,103,183, 27,232,251,129,148, 34,214, 89,234,166,162,142,169, 64,150, 20,198,103,172,115, 88,
-171, 30,129, 51,103,234,248, 83, 1, 45, 25, 36, 89, 68, 98,242,115, 37,163, 45,109,142,217,234,165,248, 27,243,168,234,127,178,
-190,202,167,240,177,167, 16,183,199,194, 43,113,178,241,169,122,255, 73, 68,109, 81,233,199,115, 14,204,113,228,158, 79, 58,130,
-115, 11,121, 58, 27,199, 83, 68,181,167,162,254, 8,166,127,143, 8,166,120,204, 39, 63,239,212,143, 93,122, 62, 3,215, 31,129,
-253,170,240,188,245, 49,139,189,160, 64,207,246,235,239, 31, 49,249, 36, 94, 72, 37, 93, 75,126, 76,197,175, 43,158, 93,217,209,
- 25,173, 78,191,231,135,129,253, 79,125,130, 41,229, 2,189, 24, 72,211, 26, 99, 53, 38, 6,188,238, 73,140,236,118,183,164,241,
- 64,151, 19,245,245,130,186,153, 49, 96, 8, 49,241,247,255,203,127,128,138,153,113, 18,241,211, 52, 5,154,166,165,174, 27,102,
-173,252,217,187,221, 22,162,102, 82,142,127,240, 71,255, 53, 47, 62,254,223,242,175,252,107,127,155,255,246,143,255,136,237,254,
- 64, 93,251,179, 17,114,225, 12, 23,191,177,177, 6,148, 38, 76,129,182,174,101,100, 30, 35,222, 24,166, 20,177,218, 48, 78,129,
-172, 20,117,219, 16, 67,228,221,235, 87,114, 0,150,211,247,197,139,231, 40,173, 36, 42,180,236,105, 99, 81,130,134, 16, 24,167,
-129,113, 10,204,230, 11,118,251, 3,117,221, 18,179, 35, 38,205,205,243, 23, 88,231,248,230,235,111,133, 9, 62, 76,212, 85,205,
-108, 62,167, 58, 28,136, 90, 67,124,106, 55,251,117, 66,185,223,218,202,246,157, 46,254,108,196,116, 78, 51, 60,253,119, 10, 0,
-231,241, 38,124,122,168,210,163, 72,132,211,136, 43,202,248,175,248,190,137, 1,166, 94,152,236,161,151,110,124,234,136, 83, 87,
-118,230, 19, 57, 68, 33,184,133, 35, 99, 61,150,206, 94, 18,212,132, 53,174, 36,187, 32,166,194, 92,200, 18,186,146,178,164, 86,
- 21,165,184,242,150,218,121,180,173, 49,110,129,175, 27,140,151,130,110,235, 25,198, 75, 17,183,181, 61,129, 94,172,247,167,177,
-161,210,246,140,133, 47, 33, 55,232, 44, 83, 40,117,156,119,235,179,204,122,245,129,233, 69,254,206, 69,232,183, 19, 44,168,179,
-221,251, 35,109,123, 28,122,126,242,199,127,204,246,219,111, 49, 6, 38,167, 8, 83, 34, 6, 48,202, 16, 74,228,143,183, 48,111,
- 43, 98, 78,132,144, 9, 81,166, 36, 49,131, 87, 10,173, 50,179,198,203, 56, 63, 69,140, 49,164, 12,155,237, 30, 20, 88,227,233,
-135, 81,248,225,229,235, 11, 81,186,189,156, 5,241,170,148,162,239, 39, 82, 4,235, 29, 38, 6,170,202, 98,141,194,106,203,102,
-179,193,104, 67, 74,154,237,182, 39,103,209,152,228, 99,222,128, 86,167,116,177,202, 90,186,174, 23, 5,183, 86, 52,109,141,210,
-154,187,187,123,150,109, 13, 97, 66, 27,199,253,221, 59,174,174,174,217,238, 15,172,183,123,166, 49,178, 47, 88,218, 12,216,202,
-211, 84,142,161,219,209,204,106, 94,127,253, 43,158, 93, 44, 88, 84,154,111,126,245, 37,253, 52,162, 93,195,124,117,197,203,119,
-183,188,187,223,176, 88, 93,162,124, 77, 84,138, 49, 70,218,249,156,186, 54, 92,172, 26,102, 11,249,104,151, 51,174,219,134,237,
-110, 96,183, 17,221,129, 55,150, 93,183, 39,171,140,117,154,135,251, 91, 86,171,107,166,113,226,112,232,152,198,192,205,243,103,
-124,243,242, 21, 31, 61,127, 78, 40,207, 89,204,138,135,205,158,166,242, 52,170, 18, 20,245, 98, 65, 55,142,104,163, 89,173, 86,
-236, 54, 91,134, 97, 96, 24, 71,156,115, 76, 49,224,156, 39,233, 81,238, 19, 10,230,171, 37,119,175,223,209,239, 14,212,219,142,
-237,171, 55,180, 90,145,103, 51, 76,108, 81, 85, 6, 83,159,246,227, 71,207, 55, 38,146,205, 36, 13,153,117,104, 95,225, 92,133,
-181, 14,235, 59, 66, 63, 18, 39, 41,174, 33, 4,193, 90,235, 82,200,166,137,161,239,217,172, 55,108, 55, 27, 54,235, 53, 15,155,
-131,164, 78,230, 76, 93,123,230,109,203,124, 62, 39,204, 18, 85,136,216,224,112,206, 97,207,243, 22,242, 35, 88,237,152,235,158,
- 75, 50, 98, 42,142,148,152,226,153,127, 92,147,147, 66, 69,249, 58,116, 41,252, 79,246,231, 71,112,219, 41, 30, 60, 63, 17,202,
- 29,207,124,177,130,135,199, 24,241,179, 51, 84,138,116,105, 18,206,136,170,199,194,206, 25,130, 61,126,168,160,159, 71,175, 38,
-125,158,143, 92, 36,253, 28,195, 47, 52, 41, 63, 38,161,145, 31,163,236,142, 7,128, 42,227,141, 35,187,219,148, 98,123,228,232,
-158, 23,246,115,235,218, 35, 4, 64,157, 21,116,131, 74, 25, 21, 35, 38,171,130,180,204,103,136, 61, 78,226, 9,148,236,232,244,
-241,231, 39,171,194,163,161, 93, 29, 25,222, 58,147, 85,194, 57, 77, 74, 19, 33,118,168,148,209, 49,179,126, 88, 11,220,194, 59,
-158, 61,251,148,213,245, 13,205,114,201,184,239, 24,246, 91,194, 97,143,211, 6,239, 18,135,177,199,207,174, 88,204,175,176,186,
-225,219,187,123,126,167,159, 10,176, 70, 81, 27, 67,191, 94,115,127,187,225,197, 39,223,231,179, 31,252,144, 87,223,126,193,204,
-203,133,102, 74, 74, 70,218, 41, 48,165,112,178, 9, 46,155,150,102,233, 88,212, 53,111,222,188,198, 91, 75, 50,134,221, 40,173,
-133, 42, 95,171,175, 91, 94,190,124, 73, 55, 12, 40, 96, 53,159,161, 82,226,147,143, 94, 48,246, 61, 99,154, 36, 28,228, 72, 29,
-210, 14,149, 51,227,225,192, 48, 69,170,139, 43,156,171, 88,223, 63, 48,132,114,163,141,153,152, 53,151,207, 62,130,251, 13,125,
-216, 18, 83,230,176,125, 64,197,190,128,110,128, 24, 74,146,186, 42, 31, 79, 21,157, 39, 64, 72,193,161, 74,243, 44,208, 20,115,
- 86,196, 37,197, 55,227,180,194, 40, 25,215, 82, 98, 71, 85, 72,100, 23, 33,107,185,181,146, 81, 73,242, 5, 84, 6, 65,239, 80,
-212,226,197,106,151,138, 85, 44, 37,114, 16, 64,140,138, 19,196,145, 28,134, 34,122, 27,136,225,216,129,247,132, 81,254,123,154,
- 4,248,146, 75,142, 60,233,113, 55, 37,157,121, 38, 4,121, 16,195, 20, 9, 25,201, 48,144,103,191, 36, 36,121,140,247, 84,182,
- 66,251, 6, 83, 73, 39,110,172,199, 84, 51,116, 53,127, 20,177, 85, 21,174, 18, 97,155,113, 14,237,100, 95,103,140,121, 18,130,
-161,148, 66,153,115, 28,238,217,182,251,152, 94,252, 36,236, 38, 63,165, 84,157,111,252,206,172, 46,127, 41, 95,224, 20, 99, 43,
-234,100,131, 34, 42,141,214,176,127,251,134,215, 63,251,115,212,184, 69, 79,145, 60, 66, 63, 28, 93, 4,194, 50,168,116,102,222,
- 26,234,214,115,123,183, 35, 20, 1,148,202, 10,103, 52,228,136,181,138,182,245,132, 56, 73, 87,225, 27,222,220,117,146,173, 88,
- 80,196,242,189,181, 12,195,200,229,197,146,126,191,167,170,107,250,161, 39,230,132,245,142,119,111,247, 92, 93,206, 57,236, 58,
-170,166,162,118,142, 48,140, 92, 95, 95,240,171, 47, 95,177, 88,212,236, 15,157,120,176,125,113,133,164, 68,154, 38,218, 85, 75,
- 24,122,116,142,104, 45,122,149,110, 72,124,254,253, 79,217,236, 14, 52, 83, 64,165,137, 60,193,242,242,146,245,118, 45,170,105,
-163,121,119,119,199, 48, 74,214,251,122,187, 21, 8,139,119, 56,173,200, 83, 71, 59,155,115,255,250,107,174, 22, 51, 26,103,249,
-234,235, 95, 49,198, 0,182,198,181, 43,238,183, 3,119,235, 14, 91,205,169,231,151, 4,237, 25,167,137,102,117,137,113,153,249,
-197,156,249,114, 78, 51,111,168,218,138,102,230,176, 73, 16,210,135,195,107,166, 96,112,179, 11,116,125, 79,131,151,128,159,148,
- 24,199, 81,246,191, 74,113,123,119,203, 71,223,255,140,168, 12,235,174,163,158, 45,120,120,123,139,114, 7, 94,124,252, 17, 81,
-107, 54,125,207,194,104,180,142, 92,206,231,228, 49,210,135,200,106,177, 98, 28, 38,250,195,136,111, 42, 25,211, 55, 21, 91,179,
- 39,166,196,184,223, 83, 59, 15, 58,179,239,118, 60,215, 31,241,240,237, 27,108, 93,163,198, 17,230, 19, 58, 76, 80, 71,178,107,
- 80,214,149,179,219,144,180, 5,227, 81,182, 70,133, 17,103, 6,146,177, 40,231, 81, 77,195,216,139, 24,117,234, 7,113,152,140,
- 19, 83, 22, 33, 91, 24, 70,134,126,224, 97,123,224,238, 97,203,221,253,150,135,237,150,125,215,161, 50,180,190, 97,222, 79,172,
- 70, 9, 4,106,199,154,170,242, 56,103,177,101,133,192, 25, 6, 58,103, 69,206,177, 36, 36, 30, 39,122,178,211, 22, 1,120, 44,
-207,161, 41,130, 83,125, 74,152, 59, 21,237,247,246,217,233, 61, 47,252,185, 98,253, 20,235,122,246,249,231,177,174,194,134,225,
- 73,176,217,113,162,240, 72, 93,141,103,127, 94, 58, 5,205,156,184, 96,101, 50, 96, 83, 86,103, 58,113, 25,143,197,163,215, 56,
- 29, 29,223,234, 4,162, 55,103, 93,184, 64, 28, 76, 73,216,209, 24,173,113, 69,180, 99,180,146,209,225,123, 99,114,173,244,147,
-232,206,147, 15, 55, 29,189,239,137, 20, 36, 82, 81,197, 44, 98,163,156,159,160,198,242, 17,208, 81,190, 57, 79,130,102,206,200,
- 58,100,137,132,201, 81,242,137,199, 41,224, 45, 88,103, 8,253,196,188,153, 49,142, 3,135, 16,185, 92, 94,210, 94, 94,145,180,
-136,113, 98, 18,241,132, 67,246, 72,113, 10,140,195, 72, 83, 87, 92, 44,103,188,184,185,226,235,175, 54,104,101, 1, 45,135,116,
-121,209,223,190,125,199,245,205, 21,159,124,250, 25,214,104, 86,179, 86, 60,229, 74, 50,210,205,249,126,186,120,198,239,215,107,
-174,151, 11,174, 46, 47,176,117,197,253,110,207,174,235,249,189, 31,125,159, 28, 51,247,235, 7, 24, 3,141,177,252,225, 95,255,
-235,236,119, 27,166, 41, 48, 13, 35,179,186,166,245,142,222, 40,250,195,254, 17, 76,146, 50,195, 32, 99,210,182,109, 25,198,146,
-110, 85,130,116,246,135,158,174, 23, 17, 77,138, 80, 55, 51,174,157,231,229,203, 55, 60,220,223, 99, 43,225,157,199, 35,199, 89,
- 61, 85, 80,159, 73, 16,159, 36,168,156,208,175, 37,120,192, 40,133, 85,178, 75,117,198,226,189, 19,241,145,213,232, 28, 81,113,
- 36,135,158, 52, 41,208,246,212,140,146,101,207,164, 10, 97, 45,145,196, 71,158,197,251,170,210, 89,182,121,140,164, 88,148,235,
- 97,132,208,147, 38,249, 8, 71,218, 91, 17,195,196, 88,132,113,229, 6,124,196, 19,159,178, 7, 10,134, 52, 68,113, 74,132, 80,
-148,171, 24,178,174,132, 20,230, 60,214,215, 24,223, 98,171,186,252,188,193,214, 13,206, 55,104,231, 49,174,236,194,143,164, 54,
-107, 81,214,136, 66,221,104,148, 61, 43,226,234, 41,221, 46,255,218, 54, 91,255,134,244,196,223,160,115,224,183,119, 41, 60, 38,
-221,150, 73, 64,136,220,126,243, 21,191,252,233,143,233,251,158,126, 72, 36,165,137, 9,108,233,194, 44, 18,195,238, 43,195, 56,
- 6, 81,244,167, 71, 17,144, 60, 27, 80, 87,174, 28,114,129,164, 4, 73,122,232, 71, 82, 6,231,116, 17, 50,201,120,222, 88,185,
-236, 24, 37, 10,245, 30,177,180,237,118, 19,190, 50,116,195,136,177, 14, 69,146,203,122, 48, 76, 49,210, 15, 18, 82,210, 15, 34,
-174,203, 41, 51, 13, 35,243,121, 67,208, 6,163, 52,219,253,200,179,235, 57,195,216, 19, 98,230,243,239,125,206,155,183,183,180,
-237,140,110,127, 96,177, 92, 80,169, 76, 24, 7,222,189,126,197,199,159,126,202,253,237, 29,119,183,119,212,213,140,205,250, 65,
-148,243,206,138, 64, 50,140,204,154,150,245,195, 45,109,235,240, 94,243,238,237, 91,186,126, 68, 91, 75,221,206,217,118, 35,235,
-221,192, 56, 37, 62,122,126,131,171, 26,134, 41,156, 68, 84,215, 87, 87,212,149,161,246, 21,243,249,156,249, 98,129,247, 14,163,
- 44,166,242,204, 47,150, 28,238, 14,116,187, 3,174,174,209, 89, 99, 85, 37, 34,184,148,177,222,209,168,150,110,232,153,250, 9,
- 95,215, 76, 99,196,213, 13,237,229, 53,155,190,103, 54, 70,150,173,103,182, 88,177,126,184, 99,209,214,172, 86, 11,238,239, 30,
-104,155,138,113, 24,193, 25,153,120,149,213, 85, 10, 73,206, 41, 85,196, 90, 49, 49,159,207,216, 29, 36, 88,231,221,235, 55, 76,
-206, 50, 91,205,105, 47, 14,248,197, 28, 59,159, 99,155, 25,214,183,100, 91,161,173,151,179, 82, 31, 21,210,142,172, 43,180, 29,
-208,110, 68, 87, 45,166, 22,253, 74,238, 71,134,195,158,110,119, 32,236, 59,166, 65,112,215,135,253,129,238,112,160,239, 71,250,
-113,162,159, 34,253, 36, 29,119, 8,148,200, 84,201, 41,232,198,154,166,242, 56, 39,133, 93,146, 6,207, 80,226,199,143, 35, 36,
-135,116, 82,198,199, 28, 79,160, 23,173,205,137,173,114,140, 78, 37,229, 15,186,182, 78, 49,174, 39,208,218, 99,225, 21,203,119,
-233,198,207,168,172,167, 78, 61, 75,242,102,204,137, 20, 57,253,222,199, 49,254,185, 81,251, 52,169, 60, 75,137,203,197,245, 20,
- 99,194,166,179,125,104,137,134,150,196,167, 92, 18,179, 52,143,197, 25,100,140,110,101,212, 37, 9, 91, 22, 99,180,236,163,202,
-191, 91,107,165,168, 27,115,218,117, 31, 5, 11, 71,163,125, 62, 67,206,166, 44, 47,136,158, 38, 9,126, 57,122, 22, 83,250,181,
-161, 33, 71,241,221,135,130, 68, 84,126,116, 55, 74,129,209,212,237,130,113,154,240, 5, 59,105,173, 5,173, 88, 44,151,120,107,
-153,215, 51,146,115,244, 65, 46, 23,160, 11, 27, 24,178,213, 56,101,177,218,210,212,150,139,165,103,181,112,132, 23,215,132, 41,
-161,149,103, 28, 38,134, 97, 68, 29, 58, 94,191,122,205, 15,126,240, 57, 87, 23,151,212,214,113,185, 90,224,140, 97,152,242,105,
-170,160,138,194,114, 12, 19, 15,187, 45,149, 82, 28,250, 1,239,107,110,110,158,177,217,127, 73,227, 28,173,181,204,150,115, 8,
- 19,171,229,146,185, 86,124,126,125,141,127,241,156,118, 54,227,207,255,226,103,140,251, 3,117,161,137, 21,215, 39, 83, 76,244,
-163,136,144,170,170, 2,235, 33, 10,246, 87, 89, 3, 83,192,123,201, 9, 55,218,146,208, 28,186,158,166,106,248,228,147, 23,188,
-122,253,134,144,182, 37,151,254, 12,140,242, 33, 95, 20,233, 4,138,144, 53, 76, 46,211, 27,112, 86,227, 75, 62,180,179, 22,103,
- 29, 85,109,169,156, 66, 19,100, 26, 48,236, 72,157,149, 93, 93,174,209,177, 96,126,179, 20,110, 82,144, 93, 87, 16,203, 88,142,
- 65,178,222, 99, 32,199,177,248, 95,167,146, 55, 46,202,244, 28,197,150,150, 99, 25,169,159,118,237,185,100,142, 63,238,168, 36,
-151, 32, 51,133, 68,204, 48, 69, 33,181,137,184,203,161,171, 22,235,252,105,132,110,124,141,171,228, 67,215,115,140,175,176, 78,
-138,189,113,210,185,107,107,203, 51, 33, 99,116, 85,158, 5,101, 10,200,226, 60, 54,246,131, 54,179,127,177, 12,128, 95,183,128,
- 87, 57,147,198,158,215, 95,252,130,119,223,126,131, 41, 98,143, 97, 76, 56,107, 69,225,140,136, 57,141, 77,104,171,217,110, 71,
-166, 40,122,140,148, 31, 17,156,214, 40,170,198,179, 59, 28,164, 49,112,158,245,166, 35, 4, 9,243,176, 86,108,153, 99, 12, 52,
-117, 5, 49,162,201, 52,181,199, 26, 1,201, 24,231,233,186, 14, 95,123, 18, 6,149, 19,206, 73,132,111, 38,179, 89,239, 36,131,
- 97, 72,132, 33, 98,156, 97, 28,133,114,102,181,161,109, 42,118,219,157,248,178, 67, 96, 28, 35,159,125,246, 41, 67,223,179,219,
-238,249,248,227, 23,116,189, 76,114,218,101,203,195,221, 91,172,134,105, 24,120,253,242, 37,109, 85,241,240,240, 64,101,101,109,
- 96,173, 38,199,129,122,177,164,235, 55,132, 52,177, 90, 85,236,119, 59, 54,251, 29,190,170,153, 45,151, 60,236,122,118, 93,100,
-189, 61,240,252,227, 79,241, 77, 67,215, 75,114, 34, 4,110,174,159, 97, 85,100, 86,215,204, 42, 71, 91, 85, 37,236, 67,225,124,
- 77,206,150,122, 54, 99,216, 78, 12, 57, 83,183, 11,118, 15,111,200, 86, 86,147,227, 36, 69,124, 76,129,186,105,216,222, 63,224,
-125,195,226,226, 2,211,204, 64, 59,188,173,121,115,191,149,203,166,177, 44,175,159,179,126,251,138,113, 28, 89, 44, 23,220,222,
-222,161, 80, 52,181,163,239, 7,134, 62,226,171,138, 48, 5, 82,140,212, 77,205,190,235,209, 70,244, 63, 90, 41,250, 67,199,110,
-156, 88,127,249, 21,237,162,101,121,189, 98,113,177, 98,182, 90,210,204,102, 52,179, 5,122,182, 34,251, 6,108, 5,198,145,181,
-149, 24, 95,237, 72,198,160,180,195,184,136,114, 21,218,214,224, 6,185, 4, 24, 95,194,171, 70,134,125, 96,236,123,186, 78, 10,
-251,216, 15,132, 41, 18, 67, 38,133,204, 16, 39,185,248,231, 64,136, 35,253, 56, 80,251,170,236,212, 37, 14,246, 88, 11,227,201,
-197,149, 79,100, 82,142,103,242,147, 93,121,126,106,201, 62, 81,240,212,211,139,193, 25,124, 45,159,129, 96,222,239,226,243, 89,
-248,205,147,216,214,227,248,189, 76,200,211,217,142,252,113, 2,167,201, 5,169,171,206,110,222,143,140,250,199, 11,133,125,178,
-227, 84, 71,187,137, 72,248,157, 81, 88,163,113,214,149,194, 46,255,110, 75, 33, 55, 70,151, 2, 47,130, 30,163, 21,206, 90,249,
-255,214, 96,236,113,159,174,203, 77,233,177,211,142, 79, 8,116, 9, 29,226, 83, 42, 79,126, 68,201,254,186,211,239, 67,137, 54,
- 71,130, 79, 58,225, 84,229,161, 88, 93,220,112, 56, 28,196,190, 53,175,184,156, 47,232,194,200,184,221,156,236,104,126,121,197,
-237,122,203,148,192,107,208,214,148,104, 64, 73,146, 26,186, 30,106,197, 39, 47,174,249,222,103,207,249,236,147,143,249,118,223,
-209,117, 19, 57, 31,176,206, 17,178, 98, 56, 28,232,119,123,186,237, 22,167, 20,243,170,194, 27,141, 10,147,220,183, 78, 44,123,
- 67,204, 2,219, 25, 1,101, 52,243,229, 18,107, 44, 78, 27,129, 37,164,128,243,134,155,103,215,188,123,243,142, 23,207,110,176,
- 90,211, 86, 21,105, 24,249,193, 39,159,130,202, 28,182, 59,170,186,162,174,106,185, 21,198,200, 88, 34, 86, 67, 12, 24, 99,113,
-222, 51, 30,130, 8,240,140,198, 24,135, 86,162, 98, 62,116, 35, 97, 26,217,108, 54,104, 39, 35,226,120,144, 34,110,222, 43, 57,
- 42,203, 8,253, 92,124, 46,175,179,140, 89,173,150,247,144,247, 78, 10,219,217,123,196, 25,141,179, 96,153,196,191, 58,108, 9,
-157, 33,232,132,202, 1, 19,103, 40, 39,131,254,148, 38, 41,232, 81, 58,243, 56,246,168,116,204, 23, 31,203,142,124,144,127, 47,
-182, 52,217,143,201,231, 75,222,120,217, 63, 37,185, 45,231,147,152, 45, 73, 38,122, 17,181, 69, 20, 89, 89,208, 14,188,199, 87,
-173,140,208, 93,141,245, 51,172,175,164, 27,175,164,168,219,170,198,249, 26,237, 60,218, 57,249,126, 58, 43,221,183, 53,178, 19,
- 87, 26, 91, 38, 92,226,161,125, 79,172,175,158,150,239, 99,162, 32,255, 2,125,255,127,217, 63, 58, 67,191,221,240,205,207,127,
-202,184,223,209,148, 11,122, 78, 65, 60,232,229,114,221,212, 26, 99, 18,218, 42, 14, 67, 36, 68, 75, 82,134,148, 70,140, 5,103,
- 21,198,200,196, 96,140,153,182,242, 28,186,145,113,146,117,198,172,178, 69, 3, 18,229, 50,104, 52, 70,101, 20, 17,231, 76,193,
-233,194, 52, 76,104,173, 25,134,192,229,229,140,238,112,144, 75,163,209, 2,254,153, 38,166, 35,218, 24,117, 18,199, 89,163, 25,
-187, 14,171,165, 59,187,185, 89,176,217,110,152,205, 23,196,156,184,187, 91,179, 92, 44, 72, 49,226,172, 38,134,145,177,135,254,
-176, 99,214,206,216, 61,172, 9, 83,120,188,232,196, 9, 87, 85,132, 56,178, 88, 46, 81, 76,196, 60,113,125,179,162,235, 14,108,
- 54, 59, 81,210,175, 46,216,117, 35,235,253,192,195,182,103,182,188, 98,177,186, 96,223, 29, 24, 71,177,185,126,252,241, 51,114,
- 28,152, 53,115,150, 77, 77,227,229, 66,152,115, 70, 91,139,173, 43, 82, 54,204,150, 51, 14,235, 14, 63,155,193,168, 24,110, 51,
-198, 74, 96,207,253,253, 61,207, 62,250,136,168, 18,132, 40, 19,215,113,164,219,119, 84,171,200,110,138, 92, 93,222,176, 93,175,
-121,247,176, 67, 95, 93, 16, 66,192, 54, 51,246,251, 13,227, 52, 81, 55, 13, 41, 4,134,174,163,242, 21, 93, 63, 48,102, 17,157,
- 57,231,196,137, 83, 70,252,162, 89, 72,244,125, 15,104,110,223,221,241,246,221, 59,234, 55, 53,139,139, 5, 87, 87,151, 92, 94,
- 44, 89, 93, 92,226,174,246, 84,179, 5,174,153,161,171, 22, 92, 69, 54,158,172, 13,218, 56,193, 28,167, 68,214, 14,171, 43,178,
- 29, 80,198,163,140,197,106, 9,135, 33, 71,134, 97,192,108,148,188, 54, 67,199, 56, 4, 33, 61, 70,113, 21,185,210,204,116,227,
- 68, 66, 49,142, 9, 99,198,179, 9, 49, 37,120,236,168, 59, 74, 50,189, 43,133, 87,184, 50,143,221,185, 57,213,181,227, 26,185,
-132,192,104,253,216, 65,159,130,208, 78,108,185,199, 41,151, 42,160,177, 39, 65,104,233,241,252,231,177, 41,213,199,162,156, 51,
- 42, 27,244, 73, 90,255,104, 23, 63,218, 78,159,212,189,147, 87, 93, 46,215,164,132,149, 78, 90, 21, 80,229, 49,172, 94,138,138,
-117, 10,239, 13,214,216,210,117, 75,144,189, 43, 93,136,228, 96,155, 83,247, 46,135,186, 20,117,109, 75, 49, 55,230,244,141, 58,
-222, 44, 82, 9,160, 56,174,255,210, 17,211,167,158, 50,187,159,198,103,170,223, 74,116, 37, 37, 72,188,143,185,164, 2,205, 22,
- 43,124, 51, 71, 27,143, 10,129,190, 31,185,188,244, 40,103, 57,244, 35,141,183, 84,245,130,122,126,193, 92,213, 28,134, 73, 4,
- 17, 57, 1,146,184,213,119, 7,193, 31,198,128,213,154,237,102,203,167,159,255,144, 47,246,239, 88,111,214, 56,115,193,216, 29,
-208,218, 17,199,129,219, 87,175, 80,227, 68, 30, 70,210,208,163, 98,196, 25,195,152,142,162,149, 92,246,229, 26,107, 28, 22, 81,
- 77,207,230,115,194, 20, 80, 25,154,186, 65, 91, 67, 55,246,160, 53,247,187, 45,255,242,191,250,215, 48,206,128,211,108, 54,107,
- 86,139,149,216,212,172, 33, 20,246,123, 85,205,100,244,222, 11,222,116,154, 6, 92,221, 66, 78,120,103,104,154,154,156,160, 59,
-244,108, 55, 27,182,187, 61,235,205,142,126, 24,233,134, 17,109, 60,205,226, 74, 86, 5,103,118, 11, 37, 91,242,226,227, 20,202,
-152, 42,158,227, 99,209,182, 90,201, 1,174,205, 99, 33,119,178,166, 49,186,104, 45, 76,150,162, 30, 59, 24,118,196, 78, 17,116,
- 64,229, 9,166, 30,156, 38, 37, 33,222, 81,126,204, 81, 66, 83,114, 20,200, 75,138, 19, 41,140,210,205,159,165,200,229,227,141,
-248,200, 85,136,199,116, 64,185, 93, 75, 65, 47,251,126, 42, 80, 26, 83, 53, 56,223, 74,183, 93,213,104, 95, 97,143, 69,221, 87,
-101,188, 94,126,238, 43,180,117, 24,231,139,221, 71,157,137,218, 10,228,229, 73,132,172,122, 15, 73,203,175,247,184, 42,126,147,
- 3,255, 95, 32,186,239,140, 43,157, 38,182,239,222,240, 15,255,243,191,139,158, 6, 48,150,110, 16,177, 83,152, 34, 6,104, 42,
-141,183,224, 43,199,254, 16, 24, 35, 36,165, 9, 49, 21, 10,154,168, 48, 42,239,233,186,129,170,170,100,146, 52, 5,134, 16,101,
-196,108,140, 76,197, 82,164,246,134, 20, 70, 46, 46,230,228, 48,225,154,154,245,122,139,214,134, 67, 55,145,162, 20,179,190,235,
-105, 42,143, 81,146, 65, 97,173,103, 26, 70, 66, 76, 56,107,168,156, 99, 44,162,198, 20, 19, 97,232, 73, 4,150,139,154,174, 59,
- 80, 85, 53,139,229,146,187,187,123,246,251, 3,223,251,222,167,244,125,135,214,112,121,177,228,176,123, 0, 37,250,138,135,245,
-134,186,170,185,189,219,156,206,168,105, 28,105,230, 21,218, 64, 32,112,113,121,193, 20, 2,235,221, 1,227, 42,218,153,196,150,
-222,239,123,214,219, 14, 95,181,124,254,217,103, 60, 60,108, 24,166, 30, 99, 21,243,213, 28,173, 35,222, 27,230,109,131,115,150,
-182,173,169, 42, 89,215,248,166,198,183, 13, 42, 24,234, 38,201,123,179, 77,140,113,100,177,186,100,183,190,167,169, 43, 82,218,
-129, 70, 28, 59,211, 1,173,164,248, 77,211,200,126,187, 35, 91,203,237,237, 45,151, 23,151,236, 54,107,190,122,245,154, 31,125,
-254, 41,145,196, 97, 10,212,217,226,173,236,144,141, 51, 36, 37,197, 39,132,137,148, 11,157, 77,149,215,176, 36,182,121,231, 25,
-250,158,106,117,201,240,176,102,127, 56, 16, 31,214,216, 55,239, 88, 46,222,112,125,185,226,250,230,154,213, 71, 55, 44,175, 46,
-105,151, 43,234,249, 2,221,204, 48,199,226,174, 29, 90, 89,148, 54, 40,101, 72,202,128, 46,240, 43, 3, 90, 69,218,130, 21, 78,
-192, 24, 35,221, 48,210, 15, 35, 67, 56,144,146, 38,155,130, 79, 46, 83,225,132, 98,152,142, 10,156,233,196, 95, 57, 54,145,211,
- 20,232,167,137, 97,156, 74, 3,144,202, 42, 89, 73,243, 99, 45,222, 57,234,186,166,209,230, 68,102, 60,214, 60,101,236, 89,151,
-252, 52,209,237, 84,123, 50, 31,132,210,164, 52,157,146,217,212,153,115,236,184,138, 62,106,204,158, 4,181, 41,117,226, 60, 60,
- 13,161,225, 9,154, 86,105, 37,227,247,202, 25,241,241, 1, 86,107,204,105, 76, 42,133,219,123,125, 82, 16, 74,151,101, 31, 71,
-240, 71,145,143,209,216,162, 42,181, 86, 46, 1,218, 60,170,211,207,193,247,177,176,191,245,217, 46,241,145, 65,146, 11,107,252,
-187, 89,181,143,118,233,191,164,184, 75, 48,246,163, 95, 16, 69,221,206, 65,121, 22,139, 25,173,211,216, 12,117,211, 48,246, 29,
-179,197,138, 89, 61,227,249,205, 39, 12,174, 37, 87, 17,125,232,217, 31, 14,244,251, 53, 97, 28, 32, 12,188,123,247,134,186,241,
- 56, 91, 49,141,137,135,251, 61,174,186, 21,161,157, 86,164, 56,146,163, 71,167, 64,158, 6,190,253,242,151,196,205, 43,110,191,
-253,134, 23,215,215, 92, 95,174,216,188,187,231,132, 64, 56,238, 73,114, 70,105,209, 21,236,118, 59,222,188,125,139,115,142,245,
-118,203,245,245,141,136,104,154,150,113,138, 88,239,248,241, 79,127,138,183,154, 79, 62,126, 65,158, 2,179, 28,113, 74, 40, 71,
-181,171, 37,132,195, 58,172,177,164, 16,177, 90, 51,116, 61,179, 89, 98, 8, 19,251,253,129,237,110,203,221,221, 3,219,237,158,
- 16, 83, 9,198, 24, 75, 20,102,226,208,237,169,154, 37,139,182, 38,246, 69,204, 70,150, 52, 42,101,200,197,119,175,142,249,224,
- 74,220, 5,214,104,236,233,225, 56, 94,250,244,233, 66, 40,226, 73,117,250,115, 84,236,201,147, 35,245, 48, 81,172,101,110, 67,
-208,138,112,234,200,143,158,112, 25,181, 31,125,164, 18, 65,152,206, 84,241,162,132, 63, 37, 4,150,212, 50, 81,173,103,129,207,
- 40,131, 50, 21,202,123,148,245,120,215, 96,125,133,171,102,210,121, 31,139,186,171,112, 85, 93,196,108,130, 89,181, 78, 80,171,
-198,149, 3,200, 30,181, 34,143,144,165, 83,216,253, 57,242, 81,253,246,137,117,255,131,248,231, 12,163,123, 20,114,254,242, 47,
-126,204,235, 47,126,201,220, 26,246, 83, 20, 23, 64, 17, 70,218,242,250,199, 16,208,106,198,253,122, 15, 74, 19,115, 36,228,132,
- 47, 19, 62,173,100,138,119,232, 7,180, 82,165,168, 71,208,138,170,173, 78, 73,120,186, 36, 16, 42,192, 26,133, 83, 34, 84,218,
-236, 58,148,241,244, 67, 47, 43, 63, 13, 99, 55,112, 49,247,244,253,132, 81,176,156,207,217,109, 14,114,176,231,136,209, 89, 44,
-157, 86,196, 86,174,178,228,160,168,189,229,112, 24,153,173,102,244,195,200,221, 67,207,229, 69,139,181, 26,114,160,178,158,105,
-232,216,237, 55, 34,140, 12,146,183,189,190,223,145,179, 38, 70, 25,235,199, 28,169,106,139,178, 80, 53, 53,202, 24,238,238, 31,
- 48,126,134,245, 53, 67, 86,236,251,129,237, 97,196, 84, 13,223,251,222,247,121,247,246, 29, 97, 26,112,222,160,200,204,106, 71,
- 78,129,155,103,207,105,154,134,118,214,226,188,120,180,125,237, 10, 37,208,131, 49, 84,110,194,215, 21,211, 16,152, 50,204, 86,
-151,188,123,243,134,217,108, 70, 59,159,177,221,108,184,126,254, 17, 15,135,142, 68,194, 87, 2,167,241,243,150,182,185,228,254,
- 97, 67,154,183, 50,121,156, 34, 95,191,122,205,199,215, 43,124, 51, 35,140, 19, 58, 91,136,129,203,171, 27,238,238,110,209,206,
- 48, 13, 1, 84, 98, 26, 39,106,223,162,181,156,223,211, 52, 97,141, 57,217, 70, 21,242,154,238,135,129, 49, 70,222,222,111,121,
-245,246,129,235, 55,107,110,238,238,120,246,252,134,171,155,107, 86,151,151, 52,171, 21,213, 98,137,109, 90,148,111,200,166, 66,
-155, 10,148,197, 88, 71, 54, 70,240,201, 70, 21, 71,132,161,214,134,165,210, 36, 37,132,183,186,169,104,111,239,185,127,216, 50,
- 78, 81,236,206,186,248,210, 93,209, 98, 96, 78,182,217, 84, 82, 67,213, 52, 17,179, 34, 71, 72, 42, 49, 70, 1,216,200, 25, 38,
-231, 83,194,160, 12, 56, 36,224,202, 90,225, 69,212,222,225, 10,114, 89,240,233,233, 9,244,229, 17,215, 26,191,163,110,207,167,
-192,116,251,212,216,171, 30, 21,244,145,167,217,234, 41,229,115,252, 6,233, 55,193,190,202,170, 38,198,128,109,188, 23,177, 14,
-200,184,176,220, 82,188,243, 56,103,240,149,220,120,165,176, 75,151, 46,221,252,163,106,247,216,169, 29,185,238, 70, 63, 10,167,
- 84,177,196, 29, 83,183,142, 31,178,175,120,191, 27,127,234, 81,126, 66,163,251, 53,234,221, 39, 9, 94,231, 8, 90, 93, 84,251,
-198,210,180, 51,156,175,248,193, 15,126,128, 39, 17,250,142,186,169, 81, 85,133, 27, 38, 62,126,254, 41, 77,179,228, 62,122, 73,
-213, 26, 21, 32,185,205, 97, 16, 17,215, 24,122,230,243, 25,151, 87, 87,124,252,209,247, 97,191,230,226,234, 25,195,215,175, 25,
-195, 64,154, 12, 83,127, 32,213, 51, 14,155, 7,198,109,230,245, 47,254, 9, 47,174, 47, 9, 85,197,223,252,195,127,133, 95,253,
- 39,127, 15,149,213, 41,109, 78, 29,195,107,138,178,241,112,232,136,151,137, 56, 12,140, 49, 96,157,229,163,155, 23,180, 77,203,
- 31,255,201,159,136, 53, 3,131,119,158, 24, 18,239,222,221, 98,173,227,217,179,103,104, 5,239,222,189,195, 25, 79,211,100,156,
-147,125,212,212, 15,236, 55, 91,124,213,138,144, 36,136, 69, 75, 14, 79, 69, 8,233,164,105,151, 60,110,177,238, 13, 67,199,204,
- 5,185,216,101, 87,138,167, 58,141,133,142,222,121,113,138,100,180, 81,114, 41, 44,239, 13,173,180,252, 55,163,139, 35, 66,161,
-117, 46,162,185,140, 86, 17,149, 39,226,184,103, 82, 73,198,233,227,129,169, 36,148,137,111, 52, 22,156,163, 76, 10,200,145,115,
-252,124, 44, 74,209,152, 51, 36, 25,181,134,148,136,177, 56,172,181,220,170,181, 54, 50, 58,119, 21,182,106, 68,165,238, 26,180,
-107, 48,190,194,213, 2,212,144,189,185,116,225,198,185, 66,146, 42,132, 42, 35, 42,112, 93, 14, 26,117, 76, 81,211,231,152, 28,
-245,235, 77,226,239,191,111,243,119,133,135,239, 23,215,127,150, 37,255,175, 22,143,251,248,181, 76,125,207, 79,254,201,159,162,
-195,128,211,162,254, 87,202, 16, 67, 46,175,183, 66,169,128,183,154,245,122,132,164,152,114, 36,102, 77, 86,199, 3, 79,209,212,
- 13,195, 48, 74,119, 55, 78,140, 49, 17, 82,102, 54,175,229,251,138, 20, 75, 93,144,213, 85, 37, 20,178,170,169,216,245, 3, 83,
- 86, 80,160, 36,195, 24, 88, 56, 65, 24, 91,149,217,238, 71,154,198, 49, 76,145, 97,140, 84, 78, 46,142, 57, 39, 82, 20, 97, 83,
- 51,119,144, 18,139,182, 98,187,217,114,115,115, 73, 36,115,255,112, 0, 20, 77, 93, 9,140, 38, 4,102, 23, 75,250,161, 43, 64,
- 15,197, 24, 18,218,120,246,135, 29,222, 91, 48,150,126,152,120,254,241, 2,227, 53,182,178, 84,117,205,187,187, 7,124, 61, 67,
- 25,143,169,107, 54,219, 29,235, 67,143,111,230,124,242,241, 39,220,190,121, 75,154, 2,222, 26,194,216,241,226,227,231, 88, 3,
- 87,215,151,212,245,163, 51,194, 85,242,123,214,179, 22, 95,213,194,151, 72,150,198, 79,248,202,179, 97, 79, 86,154, 16, 35,117,
-211,146,146,164,228,189,124,245,138,249,252, 82, 86, 76, 68, 66,154,136, 41,208,109,215,212,174,226,106, 57,231,238,237, 43, 62,
-254,236,123,124,189,219,243,242,213,107, 86,179,134, 74,137,167,124,140, 48,111,103,188,124,253,150,170,178,196, 56,146,114, 42,
-194,225,132,206,176, 88, 44,152, 98,150, 96,151, 98,213,210, 49,162,202,164,113,140,138,110,146,136,220,205, 46,240,176, 30,184,
-187,187,231,238,245, 61, 47, 62,122,224,197,139,103, 92,220, 92,179,184,238,104, 22, 75,220, 98, 46,154, 21,159,200,182, 70,105,
- 39, 36, 55,231,193, 40,114, 89,255, 26,231,241, 85, 69, 93, 85, 44, 23,115,110,174, 47,185,191,123,224,221,187, 59,214, 27,241,
-172,135,194, 75,208,199,245,239,153,219, 42,165, 84, 52, 20, 35,170, 55, 4, 45,171,210, 41,138, 47,252,100, 75, 37,161,116,192,
- 38,251,232,240,209,162, 31,115,222, 81, 85, 21,206, 73,211, 34,103,208, 83,251, 89, 78,194,116,200, 31, 72,105,203, 39,130,234,
-119,185,238, 57,231, 71, 87, 81, 74,146,154, 26,211,153,205,247,136,152,253,240,115,157, 75, 99, 30,162,198, 86,149, 59,117,234,
- 70,107,156,147,162, 94,121, 41,234, 85,117,252,185,123,210,153,107,253,184,123,208,168, 34,234, 40, 34, 54, 30,233,113,153,199,
-220,247, 35, 16, 48, 31,211,159,242,249, 23,247, 52,106,239, 73, 16,215,119, 10,247,111, 62,140, 68, 40, 39, 10,121,180,193,249,
-154,217,108,206,199, 31, 63,103, 86, 89,238,222,109,120,120,120, 0, 18, 55,215, 75, 86,139, 57, 57,215,132, 41, 17,202, 8, 68,
- 41, 85, 88,224, 3,195,254,129, 20, 19,135, 16, 49,117,205,118,189,101, 97, 12,243,143, 63,102,255, 71,127, 68, 30, 7, 70, 11,
-195, 97,135, 85,134, 47,214, 91,110,223,188,230,219, 95,254,148,198, 38,126,244,135,191,207,255,234,127,241, 63,227,199, 95,125,
-203,159,253,252, 11, 2,143, 66, 41,111, 13, 51, 87, 97,180, 98,182,152, 97,157,231,219,111,191,161,246, 21, 77, 85,227,189,231,
-231,191,248, 57,155,237,150,223,255,221, 31,225,171,138,113,232,121,243,238, 22,173, 45,191,250,246, 21,198,215,212, 85, 69, 55,
-140, 80, 41, 33,117, 77, 30,215,204, 25, 6,121, 48, 33,149, 29,143,236,131,140,214, 52, 85,205, 52, 5,172,182,104, 21, 24,194,
-128,179,142,186, 93, 49,101,195, 52, 29,152,121, 67, 21, 31, 61,195,154,120,186,253, 30, 47,106,178, 94,161,236,156,142, 63, 47,
-123,246,227,135,210,133,228,123, 36, 59, 69, 66, 28,201, 99, 38,165,192, 52,149,226,107,212, 41,189,233, 20,205, 90,246,248, 41,
- 75,112, 80, 72, 89,108,101,145,211,200, 10,100,108,167,109,133,174,164, 19, 55,174, 28,148,174, 70,123,233,202,141,171,202, 72,
- 93, 20,234,214, 57, 76,117,212,128, 88,116, 89, 29,157, 56,207,250,200, 94, 56,203, 51, 62, 35,188,228,247,139,121, 86,191,177,
- 11, 63,209, 89,223,203, 55,248,238,187, 56,255, 51,104,185,249,176,237,237, 55,124,122, 49,138,158, 48,187,227,246,129,127,252,
- 15,254, 30,149,210,132, 32, 93, 78, 74,170,116,210,226,157,119,206,144,148,101,183,235,201, 70,186,248,120,140, 79, 46,110, 15,
-109, 12,253, 36,180,185,148, 50,113,138, 56, 3,171, 89, 35,145,195, 41,224,140,236, 4, 43,107, 73, 41, 18,130,194,186, 21,187,
-187,151,104,173, 56, 12, 1,140, 70,133, 8, 49,211, 84, 86,118,237,128,175, 26,198, 73, 46,166, 74,201,175,143, 33, 97,200,180,
-149, 69, 21,136,210,190, 31, 88, 46,103,140,113, 36,161,184,191,223,241,201,199, 51,150,203, 25,187,221,150,202, 57,114,134,195,
-126,207, 56, 36,114,214,244,227, 64,223, 71, 22,179,138,126, 28, 25,251,137,213,101, 77,213, 24,134, 48,113,189,122,198,187,219,
- 7, 40,154,140,170,153,113,183,125, 96,187,221, 49,111,231, 92, 95, 94,243,242,235,111, 75,243,163, 25,134, 3, 47, 62,186,198,
- 87,150,217,188,102, 54,111,105, 27,121,134,189,181, 68, 50,151, 23,151,178,234, 49, 86,132,172, 25,156, 53,180,109,133,210,199,
- 44,248, 61, 85,213,210,119,219,146, 78,151,185,123,245,146,106,209,240,176,223,112,177, 92, 80, 87, 21,135,237,134,172, 20,139,
-229, 37,243,170, 97,251,240, 64, 91,215,196,113,224, 23, 95,124,201,239,255,238, 15,153,166,142,195,102, 75,229, 47,241, 85,133,
- 53, 37,200, 73, 37,180,177,162, 79,209,138,249,124,206,253,122, 83,130,168,228,189,212,117, 18,129, 27,142,113,220, 25, 34, 90,
- 82,235,134,145,105,154,216,247, 19, 15,219, 3,183,119, 27,158, 63,127,224,217,139, 13,151, 87, 87,204,174,150, 84,243, 57,213,
-108,129,105,230,232,234, 40,168, 51,160,197,246, 41,164, 58,135,241, 21,166,170,168, 22,115,218,139, 5,171,103,215, 92,127,244,
-156,237,122,199,250,126,195,102,189,165,239, 39, 66,148, 40, 84, 93, 70,242, 71,194,228, 56, 77,162, 7, 81,144,212, 72, 74,129,
- 24,236, 25, 69,174,164,185, 41, 78,141,231,113,213,136,166, 0,144, 52, 85, 37,147,107, 85,226, 80, 83,153, 26, 30,153, 25,143,
-185,237, 79,225,108, 57, 39, 84, 76,143, 28, 21,138,235,166,252,191, 99, 92,121, 42,150,241,227,164, 57,113, 38,172,227, 17,234,
-118, 30,108,150,180, 8, 38, 49, 6,235,189,199,168,199,184, 85,239, 12,149,247,120,239,169,188,165,170,228,231,206,153, 51,159,
-249, 83, 1, 91, 46,136, 76,165,212, 41,198,245, 24, 44,114,164,145,229, 98,170, 73, 37, 1, 7,245, 94, 82, 84, 65, 92,158, 46,
- 1,167, 47, 73,157, 18, 38,212, 95,218,137,200, 0, 95,147,208, 57,146,148,198,215, 45,206,215,204, 23,115,110,158,173,136,195,
- 64,214,142, 41, 41,230,139, 25, 31, 61,191,164, 50,158,251,135,200,161,235, 36,215, 86, 69,226,180,167, 59, 60, 48,246, 59, 94,
-125,251, 13,203,139,143, 48,179, 57,237,114,201,219,183,111, 81, 23, 11, 58, 13,247,155, 53,244, 61, 67, 14,212,174,162,123,184,
-227,235, 47,190,162,169, 26,200,154,249,229, 71,252,206, 15,127,159, 79, 62,254,148,255,195,191,255,191,228, 39,255,199,255,147,
-216, 15, 68,254, 47,241,157, 90, 51,134,200,103,151,159,241,147,159,252, 4,167, 53,149,181,144, 19,111,238,110,185,219,174,121,
-254,236,154,143, 94, 60,167,239,122,126,250,211,159, 18, 82,228,243,207,191,199,207,126,249, 43,158, 61,255,136,251,135, 53,211,
-216,227,189,163, 27, 14,120,103, 65, 45,241, 85,133,210,229, 6, 88,232,122, 67, 1,102, 40, 45,110,133,152, 6,166,144, 32, 27,
-137,184,140, 90, 70, 84, 68, 42,155,169,149,228, 29,159,119,168,170,136, 42,149,210,216, 83, 34, 95, 89,167,104, 78, 35, 87,163,
- 69, 13,175, 82, 9,246,200,241, 52,137,137, 41, 98,162,216,155, 76,144, 34, 26,202, 8, 45,157,226, 12,207,148,166, 81, 2, 67,
- 82, 22,113,144, 50, 98,149,177, 86,148,233,218,215,210,109, 87, 13,182, 22,155,153,124, 52,104, 91, 97,156, 43, 29,121, 41,220,
- 86,138,185,114,250,145, 80, 88, 84,178,231,171,161,252,158,181, 44,171,247, 24,246,143,104,168, 39,142,140,247,129, 77, 31,170,
-225,234,159,135,202,253,132,123,125,186,181, 87,239,101, 54,192,119,111,254,168,120, 90,128,169, 41,240,250,231, 63,225,246, 87,
- 63,131,105, 64,101, 67,202,129,105, 74, 88, 37,130,199,202,201,161,183,221, 11,110, 58, 38,228, 96, 79, 25,175, 21, 78,139, 46,
- 39,164, 81,246,236, 89,108, 96,125, 63,114,185,154, 97,114,164,117,150, 72, 98, 24, 7,154,202,160,117, 64, 17,209,166,161,159,
-162, 0, 94,210, 72,204,154, 16, 20, 70, 41,166, 33,112,241, 98,193,190,235, 65,121,166,152,136,211,136,210,153,170,182,196, 49,
- 51,246,145,198,195,162,177,236,118, 29,203,231, 43, 98,210,248,186, 98,223,109,217,110, 3,215,151,245,105,119, 27,195,136,178,
- 21, 49,100,118,219,142,118,182,226,246,238,158,113, 8, 96,100, 50,160, 84,166,109, 12,139, 85,195,148, 70,158,191,248,136,119,
-183, 15,116,125,160,153, 47,241,205,140,251,205,154,190, 59,112,181,186, 64,103,203,187,111, 95, 81,107,195, 20, 70,246, 99,207,
-247,190,255, 49,203,139, 57,174,118,204,102, 45,179, 89, 67,229, 29,141,119,120,235,168, 46,102,100, 99, 49, 86, 84,234,249,152,
-128,161, 34,222,105, 42,103, 8, 90, 17, 99,164,105, 26, 54, 15,183,248,166,162,109,106,238,223,190,226,179,203, 31, 97,188, 99,
- 24, 3,207, 47, 86,188,185,125,199,184,127,160,170,103, 88, 83,177, 63,172,249,222,247,127,135,238,176, 99, 76,154, 95,125,251,
-138, 23, 55,151, 52,179,138,119,183,111,249,244,163,103,188,123,245,138, 23, 47, 62, 34,167, 45,187,221, 1,227, 44,251,190,227,
-202,104,198,113, 40, 46,145,137,186,174,138,102, 65, 17, 18,132,210, 77,106,165,136, 90, 50,207, 14, 57, 51, 29, 70,182,195,196,
-253,246,192,187,251, 7,158,189,189,229,249,179, 27,174,110, 46, 88, 93,175, 88, 94, 93, 82,175,150,216,217, 28, 91, 47, 81,190,
-145,231,219,104,208,158, 92,121,146,173,192,213,232,122,134,157, 45,168,167,145,217,117,199,245,225, 64,191,221,114,216,236, 88,
- 63,108,217,110,247,236,187,129, 41,157, 98, 59, 73,197, 95,153, 74,152,146, 13, 19,222, 42,234,202, 97,202,212, 3, 36,107,195,
-151,102,214, 89, 35,234,251,178,210,139,197, 37, 19, 83, 70,151, 73,165,212, 81, 41,168,153, 4,201, 72,227,250,222, 88,254, 8,
-151, 17,251,229,163,199, 61,146, 31,109,112,101, 98,144,138,238, 74,105, 1, 76,157,166,163, 71, 64,237, 49, 52, 77, 63, 78,178,
- 35, 18,222,164, 82,198, 86, 85,117,178,127, 25, 35,123, 47,231,220, 19,211,254,201,150,166, 31,227, 88,139, 42,255, 59, 52,177,
- 39,233, 93,239,253,251, 63,175,168,206,167, 35,248,179, 64,138, 12,117, 93,227,156,149, 78, 79, 24, 39,236,118,123,172,117,212,
-117,133,175,107, 54,247,107,186,222,112, 56, 28,232, 58,201,203,158,186, 13,251,205, 3,247,239,110,105,151, 55,204,231, 43,218,
-229,130, 16, 18,191,124,245,146, 62, 14,252,141,102,198,171,175, 95,114, 88,239, 81,149,194,205,230, 60, 60,108,248,230, 87, 95,
-240,195, 31,253,136, 16, 71,126,239,247,127,151, 23, 47,190,199,188,189,230,111,254,225,223,226,147,155, 27,190,121,243,166,116,
-160,154,218,248,211,233,187, 94,175,185,190,190,102,183, 89,115,243,236, 25,179,182,101,152, 6,250, 67,199,239,255,206,143,216,
-109,119, 44, 23, 11,254,221,127,231,223,161, 31,122,178,210,124,249,229,175, 36,198,117, 26,241,206, 97,141, 17, 53, 40,162, 36,
- 70,169, 18,215,217, 16,147, 98, 24, 71,170,170, 38,231,145,105,234,241, 85,133, 41,226, 37, 95,107,148, 54,140,221,132,138, 35,
-206, 38, 42,163,240, 37,226, 43,159, 88,237,199,238,188,196,233,170, 39,137,184,103,112,162,163,136, 68, 6, 5,137, 76,214, 5,
- 63, 90, 20,169,201,148, 17, 94,161, 79,101, 53,157,250, 69,121,115,203, 24, 61, 43,141,214, 34, 82,179,174, 20,243, 18, 73,106,
-171, 10,235, 91,249,168,188, 88,205,188,199,249, 99, 33,247,162,241,176,226,218, 80, 78,118, 98,202,148, 7,193,232,239,188,135,
-254,135,188,246,254,237,140,230,143,177,142,239,199, 66,190, 31,144,115, 62,108,200, 69,147, 18, 35,216, 20,249,234,103, 63,101,
-216,238,152,105, 75,119, 8, 88,235, 24,134,177,192, 60,228,242,150,146,176,238,181, 21,149, 58,230, 68, 47,192, 90,131,247,158,
-195,208,151,152,224,196, 56, 38,156,179,204,218,134,105, 26,203,206, 83,222, 19, 85, 37,208,153, 41, 4,124, 85,177,222,108,232,
-199,169, 92,182,101, 90,224,196,141, 74, 74,208,247, 19,243,185,199, 25, 75,183,219,209, 84,150, 56,133, 98, 95, 84, 44,231, 45,
-135,253, 64, 59,171,232,199, 61, 23, 87, 11,246,221,129, 24,173, 68,228,234, 64,229, 27,250,190,199, 24,249,187,190,123,247, 64,
-202,208, 15, 3, 49,203,168,185,173, 27,250,253,129,152, 21, 87,207,150, 28,134,129,155,143,111,184,189,223,112, 24, 38,234,102,
- 65,213,204,120, 88,111,136, 41,113,181,188, 38,199,204, 97,119, 16, 93,203,208, 51,133,129, 31,124,255, 51,218, 69,141, 49,112,
-185, 90, 49, 95,205,105,235,154,166,170, 48,206,224,107, 79, 59,159,203,251,220, 75,132, 46, 74, 82,234,156,117,248,202, 51,155,
-181, 28, 30, 54,146,160, 86, 2,185, 98, 9, 95, 81, 10,214,247, 15,204,175, 86,220,189,189,101,217,204,168,235,154, 62, 69,182,
-187, 45, 33,194,242,226,130,219,187, 91,158,191,248,152, 55,111, 95,179,239, 14,116,195,130,198,121,146, 25,217, 30, 6,170,118,
-198,122,189,166,242,158, 93, 14,194,109, 8,242,186,185,178, 75,143, 33,138,173,173,235, 5,149, 92,194,114, 30,155, 91, 69, 42,
-175, 83, 44,244,199, 93,215, 51, 78, 3,219,253,142,187,245,150,235,187, 37, 55, 55, 87,220,124,116,224,226,230,192,108,181,162,
- 89, 78,184,166,197, 85, 13,217,213, 34,112,214, 50, 5, 81,214,130,110,208,110,142, 9, 3,174,238, 73,237, 64, 59, 95,178,184,
- 56,176,184,220,179,221,110,217,172,183,236,247,123,250, 67,207, 56, 6, 66, 22, 59,182,137,182,236,222, 61,202, 4,172, 69, 28,
- 22, 41,161,180,228, 28, 24, 43,246, 74,173, 69,205, 62,197, 64,223, 15, 18,225,157, 51,195, 96,112,174, 88,185,141, 76, 63,101,
-205,168, 30,215,190,229, 2,113,252,241,196,129, 79,170, 48, 89, 10, 19, 35,137,114,253, 49, 15,254, 24, 93,162, 79,147,202, 19,
-208,139,199,108,247, 83, 81, 47, 53,217,106, 35,177,181, 39,245,123,121,162,245,217,248,244, 8, 82, 57,247,232,125, 88,169,251,
-155,131, 60,206,185,242,255,221,138,182,250,173, 62, 39,157, 5,192,128, 98, 54,155,227,156,135,156, 24,135,145,251,183,119,236,
-247,123,230,139, 57,206, 87,188,124,245,134,135,219, 13,155, 93,224,139,219, 13, 57, 38, 60,153,135,119,111,249,250,235,175,216,
-119, 7,254,237,191,243, 63, 37,247, 35, 87,203, 21, 41, 13,244, 10,246, 42,227,173,231,205, 55,175,185,127,251,142, 78, 7,214,
- 70,243,236,250, 6, 69, 96, 28, 15,252,224, 71,223,103, 63, 28,152,178,231,179, 31,252, 1, 23,113,207,191,243,119,254, 45,254,
-175,255,183,255,123, 73,255, 54, 40, 44,253,216, 99,173,102,189, 94,139, 87, 23,184,189,187,197,106, 33,224,125,244,236,154,197,
-172,161,169, 26, 25, 43,150, 96,145, 67,215,243,163,239,127,143, 20, 35, 55, 55,215,172, 22, 11,194, 56, 62,193,209, 30,227,113,
-219,166,101, 8, 17,180,230,250,230,134,253,190,195,186, 3, 15,235, 13,190,146, 98,217, 15,129, 88,222,252, 85,138, 84, 86,225,
-173,194,199,226, 82, 56,223,247, 42,202, 34, 37, 21,107, 70,153,178,164, 92, 8,109,234,244,121,156, 71,231,234,199,254, 80,161,
-209,122, 18, 4,176, 54,100, 45,147, 30,180,160, 82,149,169, 48, 86,172, 99,198, 86,101,247, 86,225,189,236,194,171,186, 41, 2,
- 55, 95,104,110, 21,206, 75,142,184,113,246,148, 35, 46,182, 20,121, 79,115, 98,167,151,137,145, 62,187,140,240,212,125,241, 63,
-202,130,126,190,202,202,249,212,161, 72, 94,194,209, 22,243, 97, 17, 95, 62,253, 90,249, 31,227,126,195, 79,254,248,143, 81,195,
- 68, 10,138,113,202, 76,113,146,101,135, 61,226,125, 13, 93, 23,132, 4, 87,158,187, 41, 36,129, 13,149,131, 73, 0, 70,229,191,
- 25, 75,119, 56,240,236,102, 9, 57,227,172, 37,132, 64,202,137,166, 17, 78,185, 51, 90,178,232,141,248,175, 99,204, 76,147,236,
- 60, 99, 18,127,252,172,113,108,183,157, 4,187,132, 9,173, 36,193,208, 25, 67, 14,129, 20, 50,171,101, 37,129, 69, 42, 81, 85,
- 25, 95, 25, 80,145,217,124,193, 55,223,188, 19, 15,184,147,176,152,148, 50,181,107,152,194,196,221,253,134,155,155, 25, 83, 84,
- 12,195,132,241, 34,240,139, 9, 86, 87,115,134, 48, 82,205, 90,118,135,137,245,174,199,186, 6,215,180,172, 55, 59, 64, 81,187,
-138, 56, 68,194, 36, 2,190,126, 56,224,189,225,243,239,125, 94,118,182,137,171,235,107,150,171, 57,179, 89,139,182, 26,235,197,
- 70, 92,207,100,218,228,219,153, 20,116, 45,148, 70,141,194, 87, 25,231, 3, 85, 83,161,141,162,106, 42,214,187, 45,174, 4,172,
- 88, 45,182,202,187,119,111, 65,195,172,105,120,123,251,150,231, 47, 62,166, 91,175,137,122,100,159,182, 52,243, 57,218, 40,230,
-139, 5,247,235, 7,154,166,229,219, 87,175,249,252,211, 79,208, 85,195,187, 7, 1, 97,237,182,247, 84,222, 81,121, 71,127,232,
- 8, 33,210,247,189, 68,117, 31,195,144,200,116,125, 7,202, 19, 74,154, 36, 5,233,125,132,108,161,149, 64, 85,142,176,177, 41,
- 51,197,145,195,112,203,195,122,203,253,237,154,187,251, 45,207, 94, 92,115,245,236,138,171,235, 45,179,197,156,217, 98,137,106,
-102,152, 74,244, 47,202, 86,100,229,192,120, 48, 94,236,112,174, 66,217, 30,229,156, 0,121,106,143,109, 61,245,204,115, 88, 59,
- 54, 15, 27,233,220,163, 48, 43, 66, 8, 5,123,161,201, 24,140,117, 56, 35, 0, 33,163, 18, 70,139, 62, 72, 23,129,231, 17,181,
-125, 40,226,219, 67,201, 11,112,206,226,172, 76, 77,142,211, 19, 95,196,180, 39,208,218, 17, 80, 83, 80,180,226,101,167, 0,114,
-194, 9, 70,115,114,154,156, 69,205, 42,173,201,156,219,217,164, 9,164,172, 3,143, 69, 93,159, 50, 79,164, 86,199,148,176, 34,
- 82,121, 68, 79, 42,245, 30,147,251,236,160, 83,239, 37,110,124,168,216,127,168,131,254,181,129, 48, 74,253, 83,157,158,239,143,
- 52,159, 30, 75,199, 93,167,116,120,237,124, 46, 41,103, 41, 17,199,137,245,102,131, 47, 15,208,235,183,183,188,121,245, 53,251,
-237,142,187,135, 29,183,253,132, 55,142,121,211,224,156,102,191,219,243,135,127,243,111, 97, 93,141,183,158, 52, 14,194, 47,246,
-150,118,181, 98,220,119,252,236, 39, 63, 33,117, 61,179, 75, 41,168,155,237, 3, 87,207, 46,217,245, 91,126,116,185,160,158, 55,
- 12, 74, 83, 93, 92,113,117,249, 9,255,251,255,224, 63,224, 63,252,127,253, 71,132, 41, 72, 6,117, 10,172,150, 75,198, 48,209,
-206,102,220, 63, 60, 48, 14, 61,147,214, 60,203,153, 31,254,224, 7,242,239,195,200, 71,215,207, 78, 95,229,110,191,227,221,219,
-183,180,109,139,213, 34, 82,211,103,148, 80,163,141, 88,210,180, 99,179,221,113, 51, 78, 24,239, 81, 33,161,181,145,203,142,111,
- 72,104,166, 8,187,125,199, 20, 71,166, 40,225, 36, 38, 5,172, 74, 56,157,112,229,162, 25, 57,203,247, 61,197,181, 41, 25,221,
-151,110, 43, 63, 17,115,156,173,104,142,191, 71, 78,101, 15, 85, 46,157,250,104,137,116, 24, 39, 33, 15,198, 85, 98, 49,171,102,
- 88, 55,195, 85, 13,190,158,161,155,133, 64, 95,188,132,158,248,186, 22,244,170,243, 40,111, 81,174,136,244,140, 57, 61,148,199,
- 17,149, 81,103, 10,245,114,216, 40,245,107, 12,102,234, 95, 68, 51,173,254, 74, 23,221, 15,129,150, 62, 36,184, 57,217, 87,131,
-140,243,136,241, 84,192,141,119,143,201, 83, 57, 63,249, 50,207,233,128, 18, 23,153,216,222,190,225,229, 47,126,138, 75, 48,140,
-129,172,141,188, 55, 12, 88,113,245, 8,223, 61,100,156, 85,116, 49, 17,138, 6,194, 40, 85, 24, 5,186, 48,188, 77,217,193,102,
-234,202,208, 54, 13,227, 40,184,227,113, 24,112, 85, 37, 14,153, 16,101, 18, 83,114,211,149,150,247,215, 20, 33,196,128, 85, 10,
-103,197,101, 49, 77, 17, 91, 57, 17, 38,197, 64, 91,105,114,156,138,120, 47, 83, 57,205,126,123, 96, 57,151,144, 20, 83, 65, 38,
-114,119,127, 79, 72, 80, 89,161,219, 25,227, 49, 74,184, 5,125, 63,224,189,228, 49,108,119, 91,148,145,247,207, 16, 2,190,241,
- 68, 21,203,148,199,114,191,222, 99,172,167,153,205,232,199, 81, 10, 90,148,195,223, 98,136, 99, 96, 26, 15, 92, 95, 95, 48, 95,
-205, 72, 4,154,166,230,226,234,130,229,106, 65,211, 84,248,202, 83,213, 21,198,121,218,182,197,213,173,132,251,180, 77,153, 80,
-153,211, 14, 85, 59,139,175, 28,205,172,198, 24, 77,211,212, 60,228,132,115,158, 93,183, 23,127,187,119,220,175, 31,136,133,221,
- 30,114,162, 27, 58,114,138, 76, 67,143,171, 20,221, 97,203,234,242,134,221,126,207,199, 31,127,194,221,221, 29,205,124,193,195,
-118,199,213,229,138,108, 43, 30,246, 29,206, 56,250, 97, 16,149,123,206, 76,227,200,208,119, 44, 22,115,250,219, 59,180,209,132,
-105,196, 89, 75,156,146,116,194, 42,147,115, 41, 56, 37, 15, 64,144,172,199, 75, 96, 34,230, 72, 76, 48,141,137,105,232, 24,186,
-145,245,174,231,238,254,129,155,119,183,188,120,126,205,245,205, 5,151,215,151, 84,203, 57,245,124, 89, 60,238, 51,178,107,192,
- 8,196, 70, 91,115, 26,105, 43, 5, 88,141,211, 89,228, 53, 78, 26, 18, 99, 37, 59, 33,231, 44,175, 81,156, 8, 97, 44, 86,189,
-132, 53, 6,111,132, 39,225, 76,150,206,219,233, 19,161, 45, 69, 65, 82,135, 73,220, 56,199, 6, 68, 43,133, 47, 96,173,202, 89,
- 89, 85,123,153,114, 11, 65, 82,132,122,199, 70, 39,197, 76, 8,137, 41, 10,220, 44, 28, 73,118,103,171,111, 78, 2,115,125,194,
-175,163,207, 98,205,203,231,105, 35,245, 75,254, 46,146,251, 78,153,124,234, 88,224, 51,143,231,111, 62, 85,133,252, 27,148,118,
- 79, 34, 52,127,157, 95,252, 55, 30, 90,234,159,219,217,121,188, 28,102,228,193,155,205,230, 24,109,137,211,200,253,237, 45,155,
-205, 3, 89, 25,110, 31,238,217,237,118,236,118, 91,214,247,111,217,108,215,100,101,200,245,140,201,104,198, 0,127,237,175,255,
-117,174,158,221, 16, 99,100,189,189,199,140,189,128, 83,230, 21,205,172,229,139,191,248, 11,134,221, 30,235, 45,182,170,184,190,
-122, 78,204, 19, 99, 28,104,231, 11,116,101, 89,221, 92, 49,191, 92,146, 12,100,109,248, 59,255,238,191,199,239,253,193, 31,240,
-167,127,242,167, 40,147, 49, 10, 66, 25, 99,205,102, 51,140, 49,188,123,243,154,139,229,146,139,203, 11,102,179, 25,203, 89, 43,
- 73,107, 33,156, 34, 86,251,193,242,252,230,134,203,203, 11,140,177, 5, 60, 83,177, 99, 71, 74,137,170,192, 81,172,115,120,239,
- 9, 49,178,219,108,216,108,246, 76,163,140,210,250, 97,194, 58, 79,211,182,100,109,137,218,240,250,237, 59, 17,150,196, 81,216,
-236, 26,244, 73,204, 81,248,195, 41, 23, 16,147,122, 84,101, 30,119,223,231, 74,205, 92, 70,238,197,110,150, 74,167,117,124,163,
-203,184,179,162, 54, 66,146,242, 77,139,107, 90,124, 61,195,214, 51, 92,189, 40, 73,102, 45,190,153, 99,219, 89, 33,185,249,194,
- 79, 47, 29,185, 49, 40, 39,188,116,153, 46,157,187, 39,206, 46, 23,234, 3,170,209,252, 63,162,254,251, 55, 60, 83, 79,166, 98,
- 49, 74, 72,205, 24, 72, 33,138,120, 71,107,116, 74,224, 69,205,127,234, 0,206, 60,175, 20,193, 97, 74,153, 28, 3,111,190,250,
-146,245,235,151,216,156, 56,196, 68, 31,101,190,100,173,236,222,173,113,164, 81, 2,150, 36,222, 86,212,196, 90, 43, 42,103, 80,
- 89, 68,116,219, 97,160,106, 28,149,115,236,182, 7, 46, 46,151, 98,145,212,154,105,148,117,139,117,150,110,183,167,174, 42,226,
- 20,168,231, 45,227, 56, 18,146,248,204,141,177,130, 62, 45,209,170, 93,215, 97,173, 76, 9,150, 87, 30,171, 51,202,106,226, 36,
- 88,225,182,118, 76,195,128, 81,138,166,117,212,181, 67, 59,205,237,253,154, 97,202,248,170, 34, 5, 81,162,119,135, 3, 23,171,
- 25, 97, 74,172,215, 91,170,202,113, 56,116, 69, 96, 10,195, 20, 49,214, 96, 43,199, 16, 38, 46, 46, 87,108,182, 82,208,219,217,
-156,144, 97,156, 2, 83,223, 99,181,130,144,232,135,192,106,181,228,234,147, 27,166, 60,145,117, 98,117,113,193,108, 57,103,117,
-185, 98, 62,111,241,206, 83,213,242,140,214, 77, 75, 53,159, 99,235, 10, 93, 85, 40,227, 30,181, 71, 74,132,170, 86,105,234,166,
-162,105, 42,170,198, 23, 96, 76,205,208, 31, 78, 26, 21, 95,121,188,177, 76, 93, 79, 54,154,186,109,185,187,191,227,122,177,162,
-239, 7,162,134, 48,181, 76, 99, 15,123,205,106,185,192, 26,203,245,229, 53, 63,251,249, 79,185,186,188,196,250,150,205,221, 91,
-158, 93,204,217,247, 29,149,149,137,203, 52,142,236,182, 91,230,139, 21,222, 59, 98, 8, 2,132, 49, 53, 83, 55,202,247, 52,101,
- 1,166,100, 69, 34, 17,242, 99, 64, 73, 76,177,248,176,245, 41,125, 44,149,255, 62,196, 61,135,126, 96,189,222,114,119,251,192,
-179,155, 11,158,191,184,230,242,102,201,234, 82, 60,238,213,124,129,105, 22,232,186, 69,185, 74,198,241,136,203, 70, 41, 71,214,
-197,126, 91,198,210, 86, 11, 61,211, 56,139,245, 98, 11, 76,100,134,161, 39,198, 1,210,132, 54, 98,221,110,188,165,169, 13,222,
-138, 24, 14,117, 92, 43, 5,134,113,100, 26,167, 50, 46,143,132, 16,132, 83, 96, 52,195,160,232,140, 46,226,114,135,175, 69,104,
-238,156,112, 6,140,214, 37, 94, 62,150,112,173,227, 94, 62,202,172,242,120,201, 70, 86,159,198, 90, 41,222,198, 22,238,197,145,
-127, 97,206,146, 73, 31,139,189, 58,211,167,201, 52, 46, 98,143,100, 27, 72,239,117,221,249,215, 30, 44, 74,253, 38, 75, 25,191,
-246,208,225, 76, 49,253,244, 47,243, 87,213, 1,229, 15,172, 3,212, 83, 92,151, 82, 88,235,104,154, 25,195, 48, 16,115,228,203,
- 47,127, 73,204,145,151,175,223,240,139, 47,190,230,246,110, 75,219, 52, 76,211,129,119,111,190, 97, 81, 59, 94,124,246, 59,116,
-125,228,217,103,191,195,234,226,138,177,223,147,166, 3, 93,191,193,246, 3,213,172,101,222,212,172,102, 51,254,195,255,243,255,
- 5,163,145,192,131,126,192,245, 61,139, 69,205,162,174,153, 95, 8,195,125, 8, 19, 95,124,249, 83,150, 87, 23,124,244,233,103,
-204,151, 11,254,253,255,249,255,134,127,242, 39,127, 70, 78, 1, 44,236, 14, 59,177,170,236,119,228, 24, 9, 57, 83, 85,190,164,
-194, 13,180,203, 5, 38, 11, 13,169,235,247,196, 40,249,193, 55, 55,215, 40, 5,117, 93, 81,249, 74,138,164,115,194, 44, 47, 29,
-154, 42, 99,182,170,170, 24, 99, 18, 14,129,171,200, 89,227,135,137,144, 50, 73, 89,194, 97,192,249,138,207, 63,255,156,237,102,
-203,246,237,158,170,246,132,176, 71,199, 64, 74, 74,236, 98, 41,156,156, 11, 34,234, 16, 37,186, 4, 28, 29,139,250,249,190,232,
- 49,238,240, 84,208, 51,104, 37,118, 73,237, 12,218, 53, 84,237,146,217, 98, 73, 61, 95,210,206, 87,184,102,134,169,230,152,122,
- 38, 98,199,170, 70, 87, 13,206, 59, 25, 85,150, 81,151, 58,238,118,173, 92, 88, 31, 81,193,234,201,148, 9, 85, 88, 66,239, 69,
-149,242,155, 69,232,127,245,164,179,255, 30, 11,254, 9, 55, 57, 78,196,195,192,120,232, 24,187,158,156, 51,174,242,228, 16,113,
-109, 77,246,162,149, 81,199,111, 24, 39,182, 37,133,223, 76,158, 70,126,241,147, 31,227, 83,102, 59, 6,134, 0,202,123,244, 20,
-176, 54, 98,108,198, 40,205, 20, 38,180, 50,114,104,137, 84, 8,103, 68,204,102,143,225, 77,133, 96, 88,162,169,101,151, 62, 10,
-115,160,235,122,156,183,248,170, 98,191,221, 98,173, 99, 10, 16, 99, 16,140,106,140, 69,180,169, 33, 67, 93, 25,177, 95,134, 76,
- 44,175,153, 51, 6,149, 34,211, 48, 10, 5, 83,131,183,154, 93, 63,114,113,225,168,106,249,196,221,126, 32, 37, 77, 8, 17, 99,
- 19,202, 8, 88,166,170, 77,129,209,204, 64, 69,182,251,158,166,117,140, 83, 0,165, 25, 67,102,177,170, 25,166,145,213,245, 74,
- 18,215,172,161,106, 90,172,117,236,186,142, 97, 28,209, 36,210,148,104,156,227,217,245,115,180, 81, 36, 21,105, 26, 79,179,152,
-209, 46,231, 92, 92, 95, 51, 91,204,169, 43, 71, 93,214, 69,117, 45,186, 16, 83, 85,248,182, 69,251,170, 48,210, 31,113,165, 90,
- 9,216,200, 87,142,186,169, 89,173, 86,220,237,123,102,179, 25,125,183,199, 90, 75, 72, 35,206,104,218,166,102, 56,244,216, 89,
- 67, 63,245, 40,163, 72,161, 32,149,199,200,238, 1, 46, 47, 47, 25,250, 61,155,135,123, 46, 47,150,188,121,243,138,155,155, 43,
-190,125,245,146,231,215, 55,216,170, 97,189, 61, 48,175,100, 90, 48,134,137,186,241,108,183, 91, 22,139, 21, 49,132, 19, 48, 44,
-166,136,117, 6, 29, 74,130,102, 22,222,190, 78,138,172, 18, 42, 69,162, 86,146, 98, 88,154,197,227,229,255,152, 46, 18, 99,102,
-236,133,231,190,239, 70, 30, 54, 59,222,221, 61,240,236,106,201,179,103,215, 92, 63, 47, 0,155, 85,135,155,207,177,117,131,241,
- 13,202,122,180,182, 36,165, 73,198,160,241,101, 52, 45,197, 79, 57,139,118,186,188,199, 28,109, 93, 81, 59,139,189,179,108, 54,
- 59, 82,138, 56,167,241,149,165,105, 60,117,229,241, 94, 46, 4, 41,101,134,105,100, 24, 12,195,104, 37,199,125,156, 4, 35,157,
- 36, 56,102, 40, 71,138,140,228, 61,245, 96, 5,216,102,109, 33,105,218,114,246,148, 40,219, 24,138, 85, 77, 46, 30,198, 9,130,
- 92,107,139,118, 86,132,188,198, 22,152,142,150,196,198,179,176, 39,206, 10,249,209, 93,134,146, 38,234, 88,228,173,156, 5,137,
- 15,180,229,127,169, 39,252, 55,117,234,191,185, 16, 63,205,212,254,103,218,185,228, 76, 70,188,180,190,174,208, 90,115,216,111,
-232, 54,247,124,252,226,138,119,247,239,248,211, 63,253, 51, 94,124,242, 61,254,141,127,243,239, 48, 78,129,221,246,158,111,191,
-185,100,251,230, 21,219,205,150,127,233,111,252, 33,171,103,159,176,221,110, 25,118, 27,214,239,190, 97,187,123,192,199,204,204,
-125,204,205,229, 5, 97, 24,248,211,255,246,143,153,198, 30, 29, 43,118, 41,115,227, 43, 76, 93, 99, 43,203,139,143, 63,193, 86,
- 53,219,195,158, 38, 91,126,245,179,191, 64, 39,197,116,245,140,191,245,175,254,141,211,190,105,156, 38, 64,159, 70, 50,235,135,
-123,102, 77, 83,232,110, 3, 83, 76,108,119, 59,154,170,166,219,237,101,124, 89, 87,204,218, 57,149,115,220,221,222, 22,206,186,
- 97, 28,197, 62, 18, 99,162,170, 43,177, 93,148,113,234, 48, 12, 50,234,155,132,181,127, 56, 12, 82,100,179,132, 9, 56,231,217,
- 30, 54,160, 52,171,213, 5, 75,175,160,255,150, 56, 5,134, 48, 18,147,145, 91,119, 22, 31, 89, 78,249, 44,177, 44,151,196,183,
- 99,214,239, 81,233, 94, 44, 31, 89,226, 74, 99, 42,118, 41, 36,111,219, 84,134,108,156, 16,221,154,150,118,177, 98,113,113,205,
-124,121,129,107,196,191,106,170, 86, 82,207, 92,133,118, 5,197,170,149,224, 88,141, 22,150,250,153, 56, 79,189, 39,252,146, 22,
-146,194,149, 63, 70,156,129, 86,249, 49, 49,176, 36,147,253,211,213,238,252,223,159,170,238,189,191,112, 74,137, 48, 78,164,190,
- 99,220,110,217,222, 63,112,216,110, 81, 25,234, 89, 75,179, 92,208,196, 57,186,174,113,222, 61,166, 79, 41, 85, 40,124, 98,158,
-143, 49,176,185,127, 7,211, 72,154, 2,195, 16,137,165,171, 16,168,137, 69, 49, 49, 14, 35,113,202,160, 53, 33,103,166, 34,198,
-147, 93,186,116,233, 33, 78, 56, 3,206, 90,166,113, 98,181,154, 75,162,152, 82, 12,163,208,181,154,182, 97,183,219,163,148, 98,
- 28, 39,234, 34,150, 83,206, 19,131,136,237,186, 62, 20,181,178,231,208, 77,104, 45,211,162,186,114,228, 16,200, 90,242, 38,180,
- 74, 24,173, 25,199, 64,229, 13, 77,235, 48, 86, 58,238,253,110,164, 31, 3,205, 76, 10,116, 78,137,125, 23,169,219, 22,178, 20,
-206,113,140,100,244,233,226,188,221, 71, 46,175,231,116,195, 72, 61,107,200,192, 24, 3,203,229, 37,206,214,108,247,123, 17,136,
- 77, 17,239, 12,171,217, 18,149, 19,227,216,115,121,125,129,171, 12,214, 91, 22, 23, 75, 46,159,221,208,204,151,204, 22, 45,144,
- 36,187,189, 21, 27,171,173, 42,148,115,104, 39, 69, 73,214, 67,250,148, 93,129,210,130,105, 69, 83,215,158,229,114,206,195,235,
-183,212, 77,131,214,154,186,174,217,239,197,213, 98,148,226, 48,116,144, 46, 8,211,132,213,142, 97, 26, 9,211,128, 85,158,126,
-191,225,238,237, 43,170,118,201,125, 42, 19,147, 97,224,242, 98,201,159,255,248, 39, 60,127,246, 12,109, 45,251,237,134,182,154,
- 49,132, 32,171, 19, 35, 22,194,152, 98, 17, 35,202,190, 25, 43, 30,114,194, 78, 58,211,152,139,107,164, 36, 5,151, 80, 38,125,
- 74, 36, 59,243,125, 40, 93, 44, 92,146, 14, 58, 69, 69, 26, 18, 99,232,216,239,123,182,119, 59,238,222,109,121,126,187,225,250,
-249, 21, 87,207,175, 89, 92, 94, 80,207, 23,248,197, 66,138,123,213, 10,153, 78,107,114, 41,130,162,157,209, 88, 39,144,180,202,
-137,200,176,109, 27,218,121,195,108, 37,162,230,195,254, 32, 43, 31, 35,226, 55, 95,121,218,198,225,141, 52, 46,213,104, 25,188,
- 99, 24, 71,250,126,196, 90,205,161,159, 24,114,146,243,175, 56,114,200, 9,109, 19,253, 32,120,117,115,178,127,155,211,217,116,
-204, 65,231,152,161,226, 29,149, 22,247,141,117, 22,235,107,124,185,232,201,250,208, 60, 34,166,213, 83, 53,114,126, 82,166, 37,
- 41,241,168, 43,179,239, 91,106, 50,144,142,254,242, 39, 29, 54, 31, 40,232,233,131, 7,154, 8, 12,222, 11, 99, 81, 71,147, 90,
- 49,183,169, 72,201,213,148, 68, 47,245,129, 2,175, 74,126,116, 86, 39, 27,213,249,159,117, 20,224, 61, 13,115,209, 39,139,157,
-183,142, 60,245,244,187, 59,140,154,120,123,255,138, 87,175, 95,243,175,254,245,191,134,117, 53,175, 94,253,146,245,102,203,183,
- 47, 95,114,121,117,205,199,191,255,175,115,249,236, 19,178,118, 12,221,129,195,253, 91, 30, 94,126,201,195,183, 95,242,230, 97,
-195,231,223,255, 62, 84,142,121, 93,243,179,127,242,167,124,251,238, 21,159,127,254, 25,202, 90, 76, 85,203,225, 22, 52,151,151,
- 87,212,213,146,126,154,232,251, 1,210,150,215, 47,191, 97, 49, 95,209,206, 26, 62,254,228,134,197,197,130,183,247,235, 2,159,
- 73,104, 20, 99, 8, 24,231,113,117,203,253,122, 77, 54,142,166,157,177,104, 26,192, 9,190,182,236,143, 46, 86, 11, 14,135, 3,
-205,124,134,181,238,148, 80, 52,140, 83, 9,213,241,194,218,142,241,116,179, 27,199,137,172,160,239, 71,161, 66,133, 40, 55,228,
- 65, 84,205,139,197,138,245,102,199,219,183,119,204,204,132, 27, 6,226,216,145, 84,102,159,196,142,164,131,196, 21, 30,115,197,
- 5,187, 42, 31,161, 8, 65,142,201,123, 71,181,166,208,156, 68, 40, 19,143,241,189, 26,114, 54,104,237,112,190,162,110, 91,234,
-249,140,106, 49,163,185, 88,226,103, 75, 76,213,144,173, 43,108,117, 67,182, 71,239,248,209,206, 1, 89,231, 39, 23,196,252, 62,
- 89, 56,137,244,254, 36,224, 75, 69,244,103, 20,217, 9, 76, 70,159, 82,144,180, 92, 10,149,250, 32,206,245,253, 68,192,227,142,
-240,172,159,226, 60,177, 78,157, 90,146,239,250,196,179,202, 69, 98,120,246,108,229,163, 7, 94,149,247,112, 62,165, 13,230,227,
-207,207,110, 31,234,152,145, 80,214, 27, 42, 70,114, 63, 50,237, 59,186,237,134,253,195, 27,182,119,239,136, 83, 79,213,204, 88,
-236,175, 72,221, 21,213,124, 73,174,107,241, 0,107, 83,240,202,114, 41, 35, 74, 18,222,244,250, 37,116, 3,155, 62,210,105, 75,
-208,137, 74,141, 88,151, 81,214,138,216,104, 24,113, 74, 49, 41,216,163,152,200,212, 40,170,148,113, 94, 49, 41,217, 91,206,173,
- 99,102, 28,111,167, 3,243,197, 28,171, 45,253, 56,178,235, 7,234,182,197, 52, 51,186,251, 59,156, 22,177, 80, 68,145,148, 33,
-132, 76, 12, 9,133, 33,134, 64,237, 53,206,104,186, 41,210,182,142, 48, 6, 98,232,241,126, 69,138,195, 41, 49,174,169, 45,235,
-205,192,205,205, 92,224, 44,185,227,126,179, 33, 98,240, 85, 13,122,196,146, 25, 38,176,181,226, 48, 70, 46, 22, 11,214,187, 61,
- 93, 63,177, 88,205, 68,165, 29, 50,237,194,177, 31, 15,204, 86, 11,176,134,253,212,115,249,236, 25, 33,194,110, 24, 65, 27,140,
-142, 44, 86, 45,179,186,166, 63, 28,208, 10,150,215,115, 76, 99, 48,149, 99,117,125,197,242,226,138,217,114,193,108,190, 0,173,
-169,219,154,170,174, 49, 85, 85,200,133, 22,227, 93,129,144, 8,115, 95,165,146,112,103,203,153,166,193,228, 76,101, 20,139,229,
- 28,229, 45,158, 86, 68, 98, 74, 65,215, 49,145,209, 85, 77,222,108,137,125, 39,200,101, 15,219, 16,184,110, 23,108, 31,238,105,
-231, 45,195,230, 29,109,229, 24, 14,145,205,186,166,114,134,113,127,203,213,197,140,215,175, 95,177, 90, 93,136, 24,112,191, 99,
- 94,105, 42, 99,216,236, 59,178, 18,240,149,202,114, 81, 27,178, 98,204,130,175, 34,130,202,233,113,245,150,133,248,152,148, 38,
-169,179,179,191,236, 71, 53, 26,149,227, 41, 94,250,232,122,201, 89,220, 23, 99, 72, 28,198, 61,183,135,158, 55,155, 29, 55,119,
-247,124,116,247,192,243,103,151, 92, 93, 93,208, 94, 45,105, 47, 46,112, 77,139,173,103,224,106,146,113,168,242, 97,180, 34, 89,
- 7,166, 70, 85, 51, 84,181,195,183, 59,170,214,209, 46, 91,110,182, 43, 14,155, 29,227,190,147,241,122,150,125,186,116,248, 14,
- 77,198,107,112,222,224,172,126,212,232,160,229,235, 10, 81,244, 30, 33, 17, 82, 66, 7,232, 85,194,106, 78,197,252, 9, 42,186,
-224,169,197,229,145,105,148,193,121,201, 24,177,206, 82,213, 45,190,105, 11, 47,163, 20,114,163,207, 70,133,250, 12,135,254, 94,
-243,156, 5,134,163,116, 62,219,169,255,230, 38,224, 44,100,229,195,130,157,223, 20,180,242,151,181, 26,138,167,123,129, 99, 1,
- 63,125, 67,242,111,238,214,159, 76, 9,138,170, 58, 43, 9,117, 24, 14, 7,182,235, 7,140,142,220,175,239,249,107,255,242,223,
-164,174, 91,118,251, 3,109,221,208, 54,151,124,246,217,239,209, 52, 45, 65, 65, 63, 78, 76,195,150,221,195, 3,187,251, 55,188,
-126,245, 37,247,111, 95,178,188,184,225, 98,181,224,250,230, 10, 72,252,248, 39, 63,102,177,186,160,154,205, 49,198,226,219,250,
-196, 66,119,206, 1,138,253,238, 64, 63, 78, 56,239,228, 54,159, 18,243,217, 12,215, 58,154,166,129,251,181,228,213, 43, 69, 63,
-141,164,125,241, 47,174,215, 92,174, 46,208, 74,241,229,175,190,228, 71,223,255, 1,206,153,226, 43,215,167,100,187,148, 19,219,
-251, 13,214, 30, 73, 71,238,116,187,139, 5,221,120,204,235, 62,133,177,148, 75, 87,152, 4,146, 48, 77, 19, 33, 6, 50,250, 20,
-218,227,189,103, 60,108,216,237,118, 16, 37,116,226,144, 2, 33,101, 73, 85, 11, 81,194, 53, 98, 42, 35,249,199, 44,224,148,121,
- 34,142, 75, 20,238,118, 46,128,135,130,253,156, 98, 32,171,140, 45,226,159,170,174,168,219,134,102, 62,167,154,205,168,230, 51,
- 65, 72,106, 83,172,103,250,113, 92,172, 16, 50,159, 82,143, 49,173,138, 39,180, 57,206,114, 5, 8,137, 28, 69,132,149,203,220,
- 79, 25,141,201, 74, 98, 38, 53,103,201,105,234,105,132,249, 83,105,104,177,125,157,255, 33,186, 60,115,167,252,164, 82,108, 57,
-129, 43,242,175,153,239, 43,193, 16,157, 63, 96,167,184,227, 82,225, 37,229,172, 60,196, 71,214,180, 28, 14,249,233,175, 41, 66,
-208,190,239,232, 54, 91,246, 15, 15,236,215, 27,186,221,142, 56, 13, 76, 83,144,195, 8, 45, 25,217,117,133,113, 22,138, 32, 45,
-133,169,132, 99, 40,114, 10, 76,219, 13,187,135, 7,134,110,224,208, 5, 92,109,209, 10,234,218, 66,134,113, 8,168, 84,252,200,
- 89, 66, 90,180,146,209,247, 9, 66,100, 13,113, 74, 88,103, 75,119, 98, 11,219,160,168,202,173,163,174, 27, 30,214, 59, 1,212,
- 0,206, 58,134, 49,226,188,149,226,160, 96, 26,165,219,111,234,138,190, 31,241, 94,139, 46,100,140, 56,173,208, 5, 84,148,115,
-166,118,150, 48, 6,218,198,115,115,125,193,225,112, 32,101, 77, 12, 66,195,187,186,110,216,108, 70,246,219, 64, 93, 91, 82,212,
- 84, 85, 37, 66,209,105,194,122,241, 95, 39, 5,202, 41, 34, 9,231, 61,214,203, 62,253,242,242,146,105,156, 48,218, 75,158,131,
-115, 44,102, 45, 41, 70,250,113,196,183,141,176,195,155,138,118, 49, 99,121,113,201,108,177, 96,177, 90,209,180, 51, 50,138,197,
-106,137,243,162,101, 49,174,236,141, 20, 39, 95, 50, 33, 23,121, 83,185,176,197, 92,238,138, 50, 85,210, 70,211,204, 26,102,243,
- 25,227,174,167,170,107, 66,223, 83, 85, 21,195,152, 74, 90,160,227,176,223,227,151,115,166,105, 66, 41,195, 24, 2,174,242,132,
-105, 66,107,197,126,125,143,111, 87, 60,188,125,197,199, 31,191,224,225,118,131, 51,158,111,222,188,225,234,242,146,164, 97,189,
-221, 96,105,104,138, 93,118, 8,137,161, 23, 11, 44,221,129, 88,136,123,147, 42, 9,101, 41, 23,150,133,122, 79,215,242,221,179,
- 63,103,158,240, 18, 84,126,252,241, 36,206,142,153, 97, 10,116,125,207,118,187,225,254,254,129,183,239, 46,120,254,236,154,171,
-231,151, 92, 61, 59, 48, 95, 93, 80,205,123,170,182,197,212, 53,198, 87,194,103, 87, 6,173, 44,217,149, 49, 54,182, 88, 96,231,
-216,182,167, 93,118, 76,151, 29,161, 19,219,112,223,203,123, 64, 44,183,242,181, 24, 37, 96, 23,107, 29,222, 43, 82, 54,196, 8,
- 85,200,132,136, 8, 56,131, 4,203, 12,177, 39,166,240,152,251,240,157, 41,182,156, 17,206, 59, 98,174, 49,214,208,148,104, 86,
- 99, 44,214, 9,119,223,186, 50,109, 48,250,148, 10, 7,249, 73, 28,235,251, 63, 30,121, 48, 74,165, 95, 95,212,207, 85, 68,239,
- 43,225,127,155,189,249, 95,221,132,243, 93,181,252,111, 59,130,127,242,249,249,116,161,193, 24,205,225,176,135,156,120,251,230,
- 21,127,240,251,127,192,191,245,175,255,109,140,245, 76, 33,209, 13,129, 49,100,214,155, 29,235,205,142, 67,183,101, 56,236,232,
-118, 27,222,124,243, 21,239,222,188,226,171,175,190,164,174, 43, 62,249,244, 99, 62,249,232, 57,139,249,140, 87,175, 94,243,171,
- 95,125,141,114,142, 33,102,150,109,131,175, 28,139,249, 12,173, 50,202,192,253,253, 29,187,237, 1,235,107,250, 67,143,213, 53,
-111, 95,191,225,254,254, 14, 92,113,169, 43, 37,254, 77,196,204, 25, 99,196,148, 81,250,106,177,196,104, 77,183,223,178,219,239,
- 9, 97,226,114,185, 32,101,197, 56,142,220, 63,108, 48, 70, 83,213,117, 17,245, 72, 1, 24, 7, 17,172, 48, 72,236,234,113,212,
-115,252, 30, 25, 99,168, 43,131, 70,118,227, 33, 69,116, 84, 76, 33, 18,114,164,174, 43,178, 51,140,131, 98,119,216,147,211, 64,
-138,129, 17, 67, 72,160,162, 4,102, 68,161,183,158, 70,235,199, 27, 54, 37,186,247, 56, 29, 72, 57, 75, 65,207,143,147, 26,165,
-228,193,119,206, 80, 55,158,217,124,198,242, 98,193, 98,185,164,153,205,241, 77,131,182,246,136,165, 43, 32,163,252,152, 92,116,
-124,237, 79,185,235, 69,169,122,182, 31, 87,200, 97, 24,167, 72,154, 2,177, 31,137,211, 36,225, 52,136, 71,221,199, 10,162, 35,
- 59,243,168, 10, 63,231, 47,159,101, 18,156,162,103,149, 58,117,206,167,113,127, 62, 83,103,158,176,142,169, 96, 38,159,198, 45,
- 62,229,188, 76,114,144,157,146, 9,211, 9, 57,169,202,175, 61, 61,118, 39, 63,171,100,203,231, 98,183, 81,199, 63, 47, 37,194,
- 84, 70,226, 99, 64, 41, 67,221,204,197,226, 21, 35,198, 90,172,111, 48,198, 19,167, 76, 31, 7, 82, 62, 48,141, 3, 67,223,209,
-239,247, 12,135,142,169,140, 78,107, 53,241,240,238, 45,219,245, 6,149,193, 27, 77, 74, 17,165, 52, 97, 12,228, 32,151,230, 8,
-132,242,253,247, 10, 76,241,166,135, 24,240, 72,254,131,107,106,182,251, 3,179, 89,131,177,150,177, 31, 25,134,137,122, 38, 68,
-191,253,221, 3,115, 99, 81, 4,177,188,197,128, 43, 94,221,164, 68, 45, 93, 87,178,171,236,186,161,164,168,101, 84,146,244,183,
- 20, 70,156,150, 11, 79, 83, 87,220,223, 13,252,240,119,111,152,198, 1,239, 12,175, 95,239, 9, 65,115,177,242,196, 56,208,119,
-137, 24, 69,240,103,141, 69, 1,251, 67, 79,213, 56,198, 16,176, 78,254,254, 73,129,173, 28,117,219,162,181,230,226,226,242,132,
-186, 5,196, 91,110, 31,243,182,155,249, 76, 46,167, 77,205,108, 46, 69,119,177, 92, 48, 95, 94,224,107,217,151,187,170,194,215,
- 13,237,114,113, 82, 46, 11,171, 62, 63, 25,169,230,152,164,200,103,153,234, 72, 42,162,236, 97,117,229,240, 89, 49, 91,180,140,
- 93,199,124, 49, 99, 51,142,180,179, 25, 73, 73,152,145,173, 60, 93,119,192,229, 92, 92, 4,153, 67,119,224, 98, 49,103,125,127,
-199,124,222,210,237, 54, 24,165, 25,167,196,190,210, 24, 50,222,104,230,149,231,229,215,191,226,114,181, 96,156, 70,134,224,200,
-147, 8, 26,199, 97,100, 28,122,218,182,133,245, 3,195, 24, 72,190,126,196,198,126,231, 2,171,158, 76,186, 30, 89,233,103,119,
- 89, 85, 76,213,103, 36,181,116,124, 22,202, 32,108, 82,153,126, 26,217,247, 19,119,155, 3,111,238,182, 60,123,123,199,139,231,
-107,174,159, 95,115,113,117, 41,121,238, 75,121, 13,108,221,128,159, 73,215, 94, 66, 98, 76,101,136,198, 99, 76, 77,237, 59, 92,
-211,144,230,163, 96,185,187,142,225,176,103, 28, 7,134,174,103, 26, 6, 57, 59,114, 34,197,114,185,214, 18, 57,238,108, 98,242,
- 25, 27, 34,198,136, 54, 35, 19, 79,162,186,120,140,117,125,175, 78,105, 37,184,217, 42, 6,129,220,120, 39,107,157,169, 46,223,
-151, 72, 38,200,126,221, 10, 17, 15,101,202,145,146, 80, 42, 62, 1,218, 28,241,183,231,206, 47,165,126, 77,167,126, 14,161,255,
-144,101, 70,169,255,238,203,192, 95,103,111, 83,239,229,204,254,211,168,223,211, 25, 95,190, 59,236,208, 42, 51,111, 27,126,255,
- 95,250, 30,191,247,187, 47,112,206, 19, 19,244, 99,228,229,203,183, 84,182,162,219,190, 99,216,110,232,183, 27, 94,127,253, 5,
- 63,255,233,143,185, 93,175,153, 82,230,226,250, 25, 23, 23, 23, 92, 44,231,196,113,228, 31,253,183,255,136,140,224, 48,251,125,
- 71, 72,153, 69,172,201, 41,178, 88, 52, 24, 3,251,253,174, 40, 65,101,207,121, 68, 7,190,125,243,134,203,231,215,165,219,206,
-143,180, 28, 45, 5,208, 89,205,106,185, 18, 12,167, 54,124,244,226, 99, 94,191,249,150,183,111,122,118, 23, 43, 52,153, 89, 91,
- 11, 62,210, 40,154, 70,146,220, 66, 74, 28,142, 62,247,210,221, 74,168,137, 40, 54,187,195,129, 41,201, 97, 22, 99,102, 24, 38,
-250, 97, 96, 26, 37,143, 60, 37, 24,134,137,205,118, 47,130,154,251,215, 76, 67, 79, 10,162,130, 31,146,116,243,148,110, 60,161,
-138, 58, 23,180,118, 37,212, 68, 14, 55,123,204, 32,214, 90,188,197, 81, 20,159, 71, 0,138, 53, 70,148,162,133,165, 92, 87, 30,
-239,228,166, 42,219,136, 72, 14, 2,213,224, 56,198, 66, 46, 64,143,182, 15,117, 70, 70, 59, 39, 10,230,199,164,163,152, 72,227,
-200,212, 15,132,253,150,177, 63, 72,151,162, 20,190,174, 32, 54,184,208,160,189, 71, 89, 43, 98,164,227,235, 81,224, 57, 57, 63,
- 29,191,159,156, 33,229, 96, 82, 60,194, 54,114, 41,174,199,220,246,148, 74, 97,207,242,251, 40,173,158,112, 17, 85, 74,103, 58,
- 16, 78,152,201, 84,254, 28,125,142, 92, 56, 27,105,230,156, 37,205,234, 56,174, 63,137, 19,197,133,128,173, 49,141, 19,111,111,
-150, 24,206, 35,195, 94,107, 43,100,193, 24,153,166,145, 62, 76,236,247, 19,235,187, 29,219,135, 7,186,190,195,232,204,210, 43,
-126,249,139, 47,164, 64, 40,249,186, 40,175,113, 28, 3, 68, 57,140, 67,146, 93,186, 82, 10,155,161,114, 86,166, 48, 36,140,210,
- 36, 36, 22, 51,146, 78, 17,188,187,105, 66, 27, 1, 67,117,157, 48, 26,156, 6,173, 44, 49, 36,156, 85, 76, 83, 96,214,182, 60,
-236, 14, 0,180,141,147,233,147,214,164, 40,223, 27,171, 53,181,213, 56, 35,163,208,121,235,233,246, 19,215,215, 13,181,183,220,
-175, 55, 76, 83, 34,132,140, 82,134,170,182,220,173,119, 12, 99,102,182,168,200,102, 98,182,172,185, 93,111,153,207, 43,246,135,
-129,229,213,130,205,161, 35, 25,141,118,138,229,245, 37, 57, 37,170,186,129,172,104,155,150,105,156, 80, 10, 22,139, 57, 33, 69,
-134, 48,113,245,236, 25,245, 76,224, 71,109,219,210,180, 21,203,197,226, 84,196,235,153,116,229, 85, 35,107, 38, 74,218,151, 50,
-250,236, 18, 39, 36, 50,173,146,140,219, 83, 58, 35,105,150,145,143, 22,241,151, 73,138,197,106,206,250,254,158,197,114,206,230,
-254,158,202,214, 76, 72,224,142,245, 21,169, 63, 96,140, 97, 10, 1, 82,230, 48,245, 92, 92,172,164,139,223,237,169,235,138,110,
-183,198, 25,199,246,238, 13, 87, 55,207,136, 49, 80, 27,197,237,195, 29,139, 90, 94,175,205,118,195,220, 26,234,122, 46,211,207,
-190,163,106,196,134,151, 67, 32,100, 89, 29,166,227, 95, 51, 61,238,206,243,185,112, 54, 62, 82,214, 78,239,121,117, 54,229, 58,
- 35, 50, 74,180, 87,241,182,199,199,197,237, 56, 37, 14, 67,199,174, 15,108, 30,182, 60,220,174,185,126,115,199,245,243, 11,174,
-159, 93,113,117,189,100,190,156, 81, 47,230,232,118, 41,185, 14,174, 6,227, 64, 21,122,164,113, 88, 7,218, 89,178,247,164,202,
- 97,107,143,107, 61, 97, 24,152,186,142,225,112,224,176,219,211,231,158, 41, 8, 43, 33, 29,183,119, 39,157,131, 64,177,142, 11,
-184,152, 17, 39, 68,204,223, 9,122,209, 37,127,222, 27,185, 0,219, 97, 44,128, 55, 33,184, 86, 85,133,170, 44, 56,141,177, 6,
-167, 13,199,204,107,165,244, 89, 23,243,235, 53,107,199,127,236, 95,214,117,255,182,157,249,135,192, 51, 31,112,177,125,231,150,
-198,135, 96,149,234, 47,211,224,255, 38, 97,158,140, 34, 41,129, 14, 49, 6,134,254, 64,156,122, 22,115,139,247, 29, 23, 43, 17,
-163, 28, 14, 19,251,135,158,208, 29, 88,213, 35,239,194,158, 47,190,252, 25, 63,251,139, 31,179,217,238,200, 25,174, 86,151,252,
-224,123, 63,164,157,181,100, 18,191,252,226,151,124,243,242, 37,222, 85,160,193,186, 66, 25,154, 34,186,239, 49, 6, 30, 44, 92,
- 94, 92, 17,179, 41, 41, 79, 66, 90,234,246, 7,116,201, 62,206,101,100,120, 60,192,143,135,115,140,145,217,108, 38, 86, 52,231,
-137, 49,112,113,113,201,171,238, 37,155,237, 86, 18,139,154,150,126, 12, 24,173,136,113,143, 49,134,113,156, 4,224,146, 3, 41,
-245, 52, 77,141,214,154,105, 28,121,184, 23, 27, 95,204,226, 33, 13, 33, 49, 78,129,253,161, 99, 24, 39, 14,221,192, 16, 18, 40,
-195,161, 27,136,221,134, 54,236,176, 58, 75, 94,184,134, 6,161,187,229,199, 59,225,137, 88, 38,160, 34,203, 49,198, 87,159, 96,
- 46,138, 16, 51, 99,152,100,196,155,146,228,254, 26,137,104,205,113, 34, 76, 61,227,208,209,119,123,252, 97, 43,204,231,156, 4,
- 56, 17,197,134,162,203,120,242, 8, 99,200,165,128,159,139,136, 52,160,146,122, 4,171,100, 81, 54,135, 97,100, 58,236, 25,183,
-247, 28,118,130,239,132,132,175,106,102,243, 37,205,124,129,169,103, 18,167,122, 18,181,148, 81,215,233,125,149, 31,121,205,249,
-177, 72, 75,161, 13, 20,179, 44,160, 11, 14, 50,159,252,167,191,126, 93, 37,113,138, 71, 91,224, 41,202,241,220,229,159, 31,183,
-245, 39,139,233,241,247, 76,246,113,196, 87,238, 55,218, 40,180, 3, 93, 27,156, 82, 39,210,159, 61, 94,140,202,106, 38,147, 75,
- 81,159,168,198, 1,215,174,176,205, 10,223, 62,176,125,184, 99, 26,247,164,212,179,217, 30,176,214,131,149, 92,122,109,100,236,
-157,198,136,205, 18,188,147,140,248,197, 53, 26,173, 50,104,241,225,122,111, 4,228,100, 45,253, 56,224,154, 26,107,101,164, 62,
- 14, 3,179,118,198,172,109,121,251,213, 75,170,218, 17, 38, 17,200,237,118, 3,243, 69, 37,218, 16,173,137, 33,210, 54, 2,248,
-216,238, 70, 42,103, 48, 74,209,239,122,218,218, 81, 25,217,227, 26, 5,181,151, 84,177,231,207, 47,216,108,118, 56,239,120, 88,
- 63,176, 59,100,174,158,205,232, 67, 96,187, 15,216, 90,131,203,152,218,176, 27, 59,146,201, 76, 42,209, 94,180,116, 97, 4,107,
-112,206,209,206, 27,146, 18, 2, 91,156, 36, 67, 43,133,196,114,177,196, 56,207,238,208, 49, 95, 46,248,222,199, 63,148,245,155,
-115, 52,179, 25,214, 59,116,153,162,205, 22, 11, 50, 10, 91,215,204,151, 75,140,117, 50,129, 50, 22,101,205,227,228,231, 56,122,
- 54, 90,244, 70, 89, 46,253,218,148, 32, 5, 37,187, 87,140, 88,184,114,206,180,203, 22,235, 52,245,106,129,210, 74,162, 90,117,
-203, 56, 5,170,166, 69, 31,182, 69,168,154, 36,158, 86,101, 14,125,135,243,158, 48,142,144, 96,234, 58,148,151,148,178,110,183,
-149,116,194, 28,177, 57, 10, 51, 62, 7,186,253, 30, 87, 87,212, 85, 43,145,199, 57, 48, 77, 35,174,170, 24,246, 19, 67, 10,140,
- 83, 32, 34, 10,239, 84,186,245, 92, 86, 67, 49,199, 15,164,153,229, 39, 92, 8,117, 86,188,148,100,240,148,247,182,172, 30, 82,
- 9,108,138,136,179,101,236, 35, 83, 63,210,117, 35,247,155, 61,183, 15, 15, 92,223,222,243,236,197, 37,215,151, 43, 46,174, 47,
-168, 47,246,180,243, 57, 85, 35, 98, 91,172, 71, 57, 95, 4,162, 50,226, 78,133,105,161,236, 81,125, 46,161, 58,214,251,146,208,
-184, 3,221, 17,247, 3, 99, 31,152,198, 73, 58,242, 41, 48,133,200, 20, 99, 17, 1, 23, 63,190,178,100,149, 31,191, 23,241, 40,
-226,145,245, 84, 74,162,153, 48,102, 56, 9,233,156,235,112,206,130, 45,177,205, 89, 65, 45,231,141, 49, 21, 74,167,147,242,253,
-215,113, 95,206,249, 50,246, 67,133,250, 67, 51,251,191, 74,145,255,205,160, 25,190,211,245,124, 32,146,229,113, 20,255, 87,236,
-212,211, 73, 80, 39,185,218, 49, 8, 48, 33, 77, 3, 99,127,192, 16, 49,106, 18,181,224,184, 37, 29,238,112, 83, 15,221, 45,235,
-111,127,204,183,191,252, 51,118,219, 3,218, 26, 62,121,246,130,223,249,225,239, 49,159,205,113,206,114,183, 94,243, 95,253,215,
-127, 68,211, 52, 12,211,196,172,109,105,170,138, 48,101,124,213,162, 24,185,184,184, 96, 49,175,112, 78,227,148,225,118,191,197,
-251,134, 89,219, 18, 99,100,187,217,178, 27,247,132,130,190, 60, 65,151, 16,118,240,124, 54, 67,105,205, 20, 2,187,253,142,218,
- 90, 42,239,249,244,211, 79,185,187,187, 21,107,206,225,128,117,174,228, 47,123,148, 82,120,175,202, 5, 34, 82, 85, 53,117,213,
-224,172,147,131,161,128, 43, 84,204, 76, 83, 44,187,229, 72,206, 81, 44,106,200,232, 71, 62, 55,147, 85,162, 86,129,224, 53, 6,
- 47,122,245,156,138, 86,193,150,245, 70, 81, 47, 40, 78,126, 76, 93, 82,251, 78,188,255, 66, 99, 50, 58, 51,169,130, 70,204, 98,
-109, 50, 64,156, 70,250,253,142,110,183,229, 80, 73,172,161,202,160,194, 68, 26,123,180,247,143, 99,248,163,234, 83, 61,218,155,
-228,166,124,236,226,143,209, 47,103,158,250, 16, 24,251,129,126,183,163, 91,223,177,223,175, 57,236,183,196, 48,225,170,138,110,
-190,101, 54, 95,137, 46,194,121,121,200,142,163,243, 36, 2, 30,217,241, 61,122,220, 31,227, 22,203,231, 29, 99, 22,181,136,206,
-148,113,104,237,138, 6, 64, 14,237, 99,209, 62,234, 29, 84,217,221, 39,108, 89, 29, 28,197,113,250,164,228, 63, 42,243,181, 42,
-112,137, 99,168, 67, 9,110, 48,216,211,207,133, 64,117,182,242, 0,217, 9, 31,255,191,126, 58,253, 18,222, 64,194,199, 76, 24,
- 39,124, 59,167, 94, 92, 80, 47, 55,204, 46,174,233,247, 15, 60,188,252,130,106,190, 96,202,137,152, 51,149, 53,196,156, 80, 33,
-163,163, 68,237,142, 25,130,214, 12, 57, 82, 23, 22,124, 34,147,140,194,215,178,115,174,173, 99, 72, 9,235, 61,179,217,140,219,
-119,239,138, 47,187,102,179, 61, 72,246, 64,140,184,178,106,153, 98,194, 88, 77,234, 37, 12,164,118, 22,167, 19,222, 56, 82,234,
- 69, 69, 63, 4,172, 86, 24, 21,241, 70, 46,206,179,214,178,221,141, 44, 87, 45, 74,105,198, 24,100,181, 48,129,171, 12,174,129,
-111,223,236, 81, 30,148,201, 84, 11, 75,202,137, 97, 26,169,231, 53,166, 18,223,183,169,229,194, 63,155,175, 80, 58,179, 90, 45,
-217,111,118, 24,109,112,206, 83, 85, 86, 70,244, 90,243,189, 31,254,128,229,229, 5,237,124,142,169, 60, 85,211,144,148,116, 90,
-199,100, 75,101, 45,139,229, 10, 87, 85,242, 12, 42,141,241, 94, 94,167,227,235, 76, 9,143, 58, 53, 70, 25, 76,146, 34,103,117,
- 9, 25,145,245, 80,214,229,125, 98, 21,179,213,156,186,245,152, 73, 51,155,205, 24,198,128,169,106,124, 61, 81,213, 53,117,221,
- 8,190,183,116,193,198, 26,246,221,158,213,108, 94,116, 42,242,254, 20,207,180,144,239, 18, 25,111, 29,179,218, 51,245, 29,214,
-104,166,126,100, 50,242,121, 10, 73, 34,115,222, 97,130,136,217,250, 50,122, 30,163,116,235, 9,117,182, 22,146,201,105, 38, 63,
-153,120,157, 46, 49,200, 26, 69, 25,125,138, 48, 62,229,146,171, 68,210, 71,129,104, 46, 23,148,210, 8,149,174,121, 76, 19,251,
- 49,176, 62,116,220,173,119,188,187,219,240,252,230,146,103,207,246, 92, 93,207,185,184, 90, 49, 95, 46,168,102, 45,182,105, 49,
-117,131,242, 21,232, 90,158, 13,201,147, 46,150, 65,193,199,106,235, 5,212,229,157, 16, 44,171, 3,218,108, 9,113,195,225, 48,
- 49, 76, 19,195, 48,150, 92,247,137,113, 12,146,246,150,213,169,225, 57,159, 36, 30, 57, 29,199, 99, 68,165,200, 88, 70,245,126,
-176, 28,186, 30,107,141,136,103, 99, 34,141,145, 24, 34,174, 10,120, 31,138,112,206, 60,230,170,124,168,198,170, 71,245,172,253,
-181,163,247,239,252,248, 79,207, 99,255,110,199,253,222,239,153, 63,200,166,121, 26,165,250, 87,250,115,143,249,223,138, 20,228,
-112,158,207,103,252,236,167,191,228, 7,223,255, 30, 38, 91,194,112, 96,115,127,207,230,221, 29,111, 95,222,242,245, 95,252, 5,
-253,253, 23, 92,175, 50,217,205,200,126,198, 71,159,124,130,177, 17,235, 34,219,237, 3,255,229,223,255, 7, 56,235, 88, 88, 79,
-206, 9,103, 52, 70, 3,206, 72, 81,207,134,135,135, 7, 46, 47, 62, 33,198,145,113,236, 24,134, 3,206, 85, 76, 33,208, 52, 70,
-196,105,227, 88,132,108, 79,181, 11, 70,105,218,166,197,121,207,187,183,111,217,172,215, 92, 45,151, 92,124,250, 41,135,195, 1,
- 95,213, 60,127,246,156,174,219, 19, 82,194, 58, 79, 34,211, 31, 14, 92,172,174,216,237,247,228,156,105,218,153, 36, 45, 21,126,
-127,221, 52,244,195,116, 42, 72, 49, 4,134,113, 96, 24,122,134, 97, 60, 66,199,176,198, 48,169, 32,156,105, 21, 10,228,192, 96,
-136, 56,140,236,166,140, 59, 33, 98,143, 88,225, 99, 54,128,120,145, 77, 33, 49,165,242, 53,106, 33, 76,101, 9, 71, 8, 81, 14,
- 25,171,181, 88,127,186,142,205,253, 61, 90,101,161, 61,245, 61,227,108,142,173, 91,185, 45, 91,161, 39, 1,232, 2,182,200,199,
-253,125,201, 59,214, 74,147,244,145, 17, 47,212, 58,178, 40,255,227, 56, 49,116, 61,113,136,152,168,113, 8, 24, 67,197, 76, 26,
- 34,131,146,221,153, 49,229,101, 72, 65,108,129,211,200, 52,141, 66, 67,203,143,190,246, 35, 58,249, 4,148, 72,114,136, 25,235,
-177,190,193,213, 51,124, 51,195,249, 26,223,120,148,175, 30, 47,168, 37,154, 88,149, 32, 28,175,207,118,249,103, 5,253, 24, 9,
-167,207,248,206, 89,113,134,139,148,177,255,169, 32,156, 68, 86, 71,187,121,146,235, 77,161,145,157,162,140,243,177,235, 79,146,
- 47,159, 21, 97, 18,112, 81,213, 52, 84, 77,203, 98,117,197,176, 95,211,239, 55, 40,231,233,198,137,218, 72,240, 79,119,232,145,
-235,132, 92, 66,181, 86,140, 49,158,173, 97, 20, 83, 12,132, 50, 53, 48, 73,172, 54,117, 93, 99,171,186, 64, 59,100, 20,217,212,
- 13, 47, 95,127, 69,221,214,132, 40,192,144, 97,154,112, 78, 51, 77,147,140,141,199, 17, 3,180,117,203, 56, 76, 24, 37, 66,178,
- 48, 5, 86,173,197,164, 32, 5,171,220,241,134, 41,242,252,197, 13,111,111,223,162,180,225,176,239, 73,104, 46,111, 4,167,106,
- 28,162, 24,111, 18,217,142,132, 96,168, 47,230,120,231,128,140,247,226, 23,174,154, 86, 80,196, 26,246,219, 61,139,197, 66, 16,
-156, 65,160, 53,151,179,150,118,185,164, 93,173,184,184,186,196, 21, 5,123,214,134,166,174, 69,255,129,162, 93, 44,104,102,237,
- 35, 76, 89,105, 25, 89,159,194, 56,244,233, 53, 69, 41,129, 3, 21, 13, 70, 46, 17,196, 39,177,153,147, 46, 61,171, 82, 0,147,
-198,183, 21,179, 69,139, 11,150,166,109,200,106, 96,202, 89,198,253,109, 75,181,175,233,199, 94, 58,251, 36,235,143, 97, 28, 36,
-188, 36,101,140,243, 36, 14, 5,241,155,137,125,135,177,150,202, 90,156,150,156, 8, 63,159,163,196,155, 74,223,119,242, 99,215,
- 49, 12, 3,227, 20, 25,166,137,160, 52, 83, 12,162,159, 73,114,249,212,249,209,186,246, 29,227,231,241, 61,201, 9,101,142, 57,
-106, 85,143,186, 22, 45,193, 77, 58, 7,130,202, 16,229, 50,127, 12, 67, 73,249, 88,212,193,230, 76,223, 71,134,112, 96,187, 31,
-121, 88,247,220,190,219,240,209,213,156,235,103, 23, 92, 95, 95,176,184, 90,210,172,150,248,249, 28, 63,155, 97,188, 18,142,124,
-137, 87, 70, 25,193,207,218, 4,118, 0,103,168,173,196, 49, 87,174,146,248, 87, 93,236,193, 1,246, 12,210,177, 15, 35,195, 24,
- 24, 67, 58, 57,144,142,123,110,253,132, 3, 33, 95,183, 49,226,252, 73,112,242,173, 79,163,184,164,140, 22,209,109, 24, 35, 99,
- 63, 82, 53, 53, 85, 35, 24,108,227, 29, 88,119, 34,112,254,166, 70,219,190,239,249,126, 42, 58,251,176, 7,247,145,141,157, 63,
-188, 96, 87,156, 14, 27,242,119,119,232,167, 59,219,185, 67,173,136,126, 84, 81, 63,234,227, 45, 78,149, 65,239,169, 88,139, 61,
-226,137,197,238,252, 55,202, 74,252, 32, 90,161,173, 67, 37, 69,232, 3, 49, 79,220,190,123,205,127,250, 95,252, 23,188,125,251,
- 47, 97,115,102, 58,244, 28, 54, 59,190,250,226, 27,110,223,221,130,134, 31,254,224,115,254,229,213, 51,116,179, 98, 72,150,251,
- 77,207,221,118,207, 31,253,195, 63, 65,161,248,104,117,129,241,142, 24, 38,246, 93, 87,176,151, 51, 30, 30,238,240,181,227,122,
-182, 96,223, 5, 22,141,167,219,239, 80, 73,211, 79,154,251, 77,143,173, 86,216,170, 70,119,182,236, 99, 31,133, 33,167,215,160,
-124,135,174,175,175, 25,199,145,166,109, 88,111, 54,229,128,147, 76,233, 69,187,160,239,123,134, 49,240,118,183, 69,145, 73,106,
- 71, 91,213, 34, 0, 60,116,220, 3, 55, 23, 75, 46, 46, 46, 81,198, 48,132, 3,125, 63, 50, 13, 19,251,205,158,109,183,103,215,
-239, 25,199,137,126, 72, 68, 28, 33,102, 12,153,103,115,141, 63,162, 30,181, 65, 41,139,201,148, 61,185, 45,152,209,116, 38, 82,
-204,103, 40,214,116,210, 18,228,116,156, 8,164, 71,143,120, 25, 7,198,148,153, 66, 70,143, 8,205,143,200, 52, 14, 18,202, 49,
-155, 81, 85, 13,198, 10,110,241, 56, 71,214,194,143, 58,185, 37, 36,112,200, 98,172, 71, 57,125, 74,249, 75,177, 8,244, 98,102,
- 12, 73, 46, 46, 99, 98, 10,145, 49,106, 66,178, 48,100, 14,227, 30,181, 57,148,149, 69, 40, 22,149,145, 24, 38,194,208, 51, 77,
- 35,161, 16,217,148,214, 82,184,157,195,215, 13,222,215, 88,235,208,166, 66, 59,143,211, 22,173, 43,178,171, 49,245,140,170,157,
- 11, 72,164,246,103,129, 72,103,142,142, 82, 4, 31, 73,119,103,126,123, 85,196,134,250, 28, 93,171,206, 98, 23, 31,157, 12,223,
- 9,113,201,197,154,247,157,199, 54,191, 55, 9,147,139,137,177,150,228, 16,229,109,101,112,125,131, 54,137,235,203, 21,239, 94,
-191, 36,197, 36,227,240, 33, 34,218,202,132, 50,114,137, 74, 26, 82,200, 56, 5,214, 36,161,190, 77, 34, 94,115, 90,131, 19,161,
- 25, 26,150,173, 8, 58,135, 41,176, 90,174,216,236,118, 56,171, 24,251, 61,171, 69, 11, 41, 49, 14, 9, 99, 5, 61,171,181, 38,
- 78,129,229,108,134, 51,154,135,125, 71, 93,121,166, 41, 81,251, 50, 33, 82, 90,224, 49,149, 38,231,196,103,159, 95, 48,165, 1,
-109,225, 97,115,160, 27, 21,151,215, 23,236,199, 3, 67,140,248,185, 67, 57, 77, 61,243, 12, 83,160,157,173,240, 77, 69,138, 1,
-107, 13, 41, 76, 66, 98,116,142,172, 50,227, 20,184,188,190, 34, 3, 85, 85, 83, 85, 53,202,104,218,102,198,197,213, 21,237,114,
- 33, 99, 91,107,201, 90,163,173, 16,203, 22,139, 5,181,175,201,136, 67,196,121, 47,212, 67,165, 72, 73, 52, 14, 42, 27,217,167,
- 31, 29, 23, 74,203,120, 37,107,114, 18,129,150, 46,171,165, 35, 80,200,228, 36,197, 93,203,175, 85,214, 48, 95,173, 8,219,158,
-171,155, 21,211,235,183,212, 81, 49,141,138,122,190, 64, 63,220,163, 67,196,104,136,113, 34, 17, 73, 68,148, 81,244, 7,193,218,
-122, 95,139,226, 59,139, 88,118,134, 37,103, 77,229, 61,157,222,201, 68,134,204,118, 63, 96,172,167,114, 30, 82, 34,133, 76,194,
- 16,181,101,204,137,196, 35, 8,229,152, 13,206, 19,123,245,177,190, 28, 39, 81, 39, 4, 84, 17,206, 30,155,130,199,180, 71, 82,
- 38,100,205,168, 34, 86, 37, 70, 18,228,120, 42, 66, 18, 22, 35,147,174, 64, 22,173,208, 20,232,167, 29,219, 93,207,250, 97,205,
-229,221,134,155,103, 91,174,111, 86, 92, 92, 45,139, 32,119, 65,189,236,113, 77,131,170, 42, 84, 85, 9,142, 87, 91, 20,146,218,
-166,140, 33,153, 10,109, 42,162,237,197, 86,235, 53,182, 82, 24,175,209, 42, 16,167,137, 97, 63,209,199,200,148, 50,125, 12,101,
- 2, 81,206, 43, 45, 66,204,227, 74, 82,104,112, 5,204,100, 68, 16,125,252,190,196, 50, 69,213, 58, 20, 59, 95,192,245, 61,126,
-239,240,181, 36,165,154, 83, 4,186, 32,114,209,246, 76, 75, 84, 84, 7,239,143,223,127,243,136, 61, 63,201, 62,127,162, 14,250,
- 13,200, 88,222, 75,131,122, 28,189,168,247,236, 71,249, 24, 91,123,178,243, 60, 46, 12,211,249,223,130,247, 51, 37, 5, 30, 82,
- 66,105, 78, 94,199,140, 49,142, 41,137,224,234,225,238, 22,215, 40,246, 63,251,130, 47,127,254, 21, 94,107,102,149,167,114,142,
-105,234,249,248,251,159,210,247,151,252,206, 15,127,196,205, 71, 31,179,235, 3,127,242,147, 47,249,230,213,175,248,111,254,244,
- 39,164,168,184, 92, 45,200,198,138, 47,157,204,172,170, 33,101,246,135,142,136,166,106,150, 52,179, 21,149,179, 92, 94, 92, 48,
-142,153,168, 3, 93,114, 28,214,123, 62,251,221, 21,127,254,139, 95,208, 13, 29,104, 87,114,230,243, 73,224, 37, 55, 57,195,126,
-187,163,109, 91,110,174,175,113, 86, 19,134,145,171,203, 75,188,177,164, 24, 89,239,118, 52,179,150,119,247,107,190,126,249, 82,
- 50,147,187, 81,196,103, 70, 60,189, 99,129, 37,212,117,131, 82,138,170,169,241,117,203, 55, 95,126,205,161,235,232,135,129,190,
-239, 9, 99, 32, 4,141,242, 53,109,227, 89,182,150, 54,239,177, 89, 22, 2,199,194,115,178,219,144, 30, 69,111,167, 14, 86,161,
- 84,122, 50, 37,137, 49, 49, 77, 81,108,111, 65,120,242, 33,196,194, 28, 59,138, 77, 18,132, 72, 30, 36,202,177, 31, 38,170,250,
- 64,181,217,157, 18, 2,181, 54, 98,147, 43,205,172, 68,126, 58, 73,164,115,146,107,108,156,112,223,115, 73, 65, 18, 12,165, 22,
- 1, 79, 70, 86, 14, 73,186,251,132, 33, 25, 91,222,111, 73, 18,238, 66, 18,168,198, 52, 49, 77, 3,227,208, 51,246, 61, 97, 26,
- 5,109,153,133, 93,110, 93,198, 85,138, 88, 80,148, 24,135,181, 53,174,110,241, 77,131,159, 45,168,102,115,252,124,142,107,103,
-216,186,194, 86, 78,104, 91,165, 59,123,100,206,171,211,101,229,187, 89, 9,199, 60,231,223,198,108,250,248,223,213,111,157,165,
-240, 20,247,172,109,233,244,141, 35,233,136,217,193,230,238, 29,235,183,111, 88,181,154,202, 43, 54,219, 32,193, 23, 57, 32,185,
- 86, 89,198,141, 41, 83, 89,168,140, 34,134, 64,142, 48,107,164, 51,116,149,197, 84,114,196,212,222,241,250,245,107, 89, 23,105,
-195, 97,187,151,244,196, 49, 96, 84, 36,198, 64, 12,137,102, 86,147, 74, 68,159, 34,211,120, 75,136, 17,107, 69,132, 57,141, 35,
-243,202, 18,250,137,166, 49,120,109,176, 86, 46,113,207,158,173,120,243,238, 13,219,125,207, 56,101,180,174, 1,195,219,183, 29,
- 87, 47, 42,146,137,248,198,147,181,163,153,205,105,155, 57,253, 56, 98,140,116,100,166,110, 37,109,203,200, 52,102,113,121, 37,
-120, 86,239,176, 5,176,210, 52,173,160,154,173, 37,102,240,133,239,237,189,199,215,197,123,110, 45, 9,129,159, 24, 35,232,207,
- 92, 86, 55,170,112, 26, 82, 86,160, 37, 96, 73, 29, 93, 30, 50,202, 2,101, 48,254, 72,252, 75,232,156,138,231, 59, 31,125,154,
-242, 60, 24, 67, 61,159, 17,209, 44, 46, 22,172, 55,107,212,152, 9,221,128,241, 21,205,124,197, 20, 18,134,196,152, 70,114,204,
- 39,146,224, 20, 3,187,221,158,203,213,101,209,248,104,172,241,140, 65,166, 44,214, 88, 97,186, 3,201, 56,121,248,178,156,206,
-182, 76,136,178,210,100,163, 37,191, 92,235,147, 64,244,253,243,255, 88, 42,206, 27, 71,117,102,177, 61, 50,204,181, 86, 56, 99,
- 48,165,240,101, 50, 54, 41,180, 14, 76, 83, 20,138,212,227, 21,129,233, 92,184,202,145,120,169, 68,172, 22, 34,195, 52,176,233,
- 71, 30,246, 29,183,235, 13,207, 30, 86, 60,187,190,224,234,234,192,178, 27,104, 23,115,220,188,193, 52,179,178,115,175,201,202,
-150,137,154, 67,169, 18, 44, 85,206, 24, 83, 25, 76,101,241,109, 69, 93, 75,247,158,163, 92,220,186,253, 72, 74, 19,100, 45, 83,
- 44, 99, 48, 90, 97,205,113,146, 41,144, 31,171, 13, 86,139,125,216,187, 18, 12,227,164,240,103, 10, 62, 54, 66, 26,132, 7, 50,
- 14, 61,182,151,215,194,121, 65,126, 59, 95,225, 42,217,249,203,104,222,114, 30,252, 97,127,123, 63,249,121, 81,207, 39,207,207,
-249,158,238,183, 87,172, 75,154, 90, 42,108,142, 84, 96, 27, 89, 29,243,214, 31,143,174,124,102, 25,206, 69, 72,161,143, 23,137,
-247, 83,195,212,113,187, 42, 59, 78,111, 29,218,195, 98, 57,231,221, 14,222,188,188,163,106, 87,116,251, 29,155,251, 59,172,201,
-124,250,233, 11, 62,253,252, 99,254,218, 31,252, 30,207, 47,111,120,254,252, 35,190,248,250, 27,190,252,250, 27,254,248, 31,253,
- 19,254,232, 31,255, 5,206,205,184,122,126,205,205,213, 5,222, 42, 82,204,204,154, 57, 77, 85, 67,204,194,233,245, 53, 90,103,
-198,110,135,110, 22,236, 15,123, 46, 63,250,132,215, 95,189,225,143,255,201,207,153, 45, 86, 44,191,254,150,207, 63,255,132,255,
-199,255,231,255,205,126, 28, 74,198,121, 1, 77, 40, 17,186, 12, 67,207,253,254, 64,237, 60, 87,151,151,204,234, 25,139,186,197,
-150,110,111, 24, 70,134, 24,248,230,203, 47, 24,167,192,122,187,165, 31, 60, 15,235,123, 62,125,241, 17,151,171,229, 73,164,145,
-147,168,237, 93,211,144, 80,204,151, 11,126,240,187, 63,226,213, 55, 47, 9,111,223, 97,171,186,236,201, 29, 19,134,105,236,201,
-169, 39,196,158, 41, 74, 24, 3, 49, 22, 49,207,211,139,213, 49, 3, 24,192, 20, 69,250,113, 95,156,144,221, 80,136, 71,234,146,
- 20,246, 35,113, 78,149, 46, 53, 36,152, 98, 96, 8,153,205,126, 40,153,236, 50,130,211,199,215,250, 24, 45,104,205, 9,173,217,
-214, 13,243,118, 70,211, 54, 84, 77, 83,148,211,134, 99,107,155,179, 18,239,188,156,124,114,171, 77, 71,251,144,124, 94, 78, 17,
- 98, 36,197, 64, 86, 26,131, 38,161,203,126, 47,145, 77, 20, 75, 92, 42, 16,141, 36,175,123,158, 18,202, 70,180, 75, 18, 22,133,
- 70, 59,135,173, 27,124,219, 82,181, 45,190,110,177, 85,141,245, 14,231,205, 73, 64,120,234,176, 79,169, 76,234, 47, 41,188,255,
-188,249,180,143,107, 5,101,132, 45,174, 66,192, 58,248,249, 79,255, 28,198,145,103, 23, 13,251,221, 1,180, 92,167, 77, 86,167,
-110, 42, 20, 54,134,181,130,213,204, 33,137, 77,236,116, 0, 57, 98, 76, 52, 77, 75,215, 13,140, 83, 96,117,177, 36,198,162, 89,
- 32,227,156, 35,165, 36,152,216,110,143,209,150, 48, 13,104,148,232, 75,128,113, 28,168,139, 71, 93,229, 68,206, 26,231, 4, 69,
-106, 43, 67,206,145,155,235, 5, 67, 63, 50, 14,145, 20, 50,235, 53,124,244,201,156, 47,126,249,142,122,102, 57, 28, 38,108,171,
- 24,119, 7,230,171, 37, 77,229, 25,131,132,158, 92, 92, 92,144, 82,164,242, 94,236,120, 33, 80,249,178, 98,243, 14, 99, 28,117,
- 41,216,206, 57,148,210,226, 93, 47,185, 3,199,124,133,170,174,203,191,151, 5,133,150,213, 81, 58,166, 23,157,177, 55,142, 78,
-136,227, 78,247,216,218, 37,162, 68, 3,235,199,177,117,202,229, 70, 43, 54,134,211, 5, 65,103,104,218, 25,221, 16,152, 45,151,
-180,243, 57,170,151, 2,120,216,237,229,217,232, 58,226, 52, 8,204,103, 26,113, 78,188,219, 26, 67,136, 9,231,235,178,166,177,
- 24,227,136,217, 8,191, 95,137,144, 51,134,204,106,113, 73,183, 89, 51, 37, 48, 49,209,214,254,177, 41,211,250, 20, 26,244,235,
- 38,190,231,221,250,241,178,250,168,233,207,104, 35,201,104,198,104,121, 47, 89, 93,180, 57, 18,149,173, 77, 89, 81,105,117, 2,
-139,101, 2, 58,138, 32,237,172, 28, 65, 22,161,102,138,114, 63,234, 67,164,155, 2,251,174,103,183, 59,176, 94,239,121,182, 57,
-112,125,232,185,184, 88,178, 92, 45,152, 45, 70,114,219, 98,218, 17,124, 37, 99,120,229,100,205, 81,244, 49, 89, 75,103, 92,107,
-143,178, 53,198,206,176,190,198,121, 75, 53, 51, 84,111,225,118,157, 24,198, 12,148,117,164,149,203,161,181, 22,109,164,107,247,
- 90,227, 74, 28,113, 85, 57,156, 51,184, 18, 9,109, 77, 73, 72, 45,223,195,116, 20, 31, 78,145, 73, 79, 40, 59, 98,237,128,243,
- 61,149,247, 56,239,241,149,116,239, 56,115,154, 6,217,223,182,160,127,183, 83, 56,138,209,206,148,200,252,186,204,202,243,223,
-163,120,119,143,222,220,179,157, 75,254,144, 95, 78,229, 83,118,243, 81, 20,165,201,167, 17,255,249, 67,162,149, 18,251, 13,165,
-139, 50,150,102,233,113,233,192,243,213, 31,240,227, 31,255, 5, 95,252,236,151,180, 77, 37,209,128,206,114,183, 57, 80,109,122,
-214, 93, 70,177,231,239,253,131,255,152,175, 95,189,225,175,255,237,127,147,159,255,234, 91, 72,153,103,207,158,243,209,243,103,
- 16, 69, 84,166, 17,114,221, 56, 69,188,245, 52,237,156,136,194,234, 76,235, 20,179,198,151,212,181, 5,147,219,241,243,175,191,
-229,147, 79, 52,247,155, 29,207,167,204,183, 47, 95,151,125,218,163,127, 57,103, 24,198,129,251,117,192,105,203, 20, 38,241,194,
-214, 13, 6, 24,199,145,168, 53,223,188,122,137,114,134, 77,183,231,208,143, 44, 22, 75, 41, 80, 41,145,141, 38, 42, 24, 66, 96,
-225,101,159, 94, 57, 47, 95,171,214,108,183, 91,170,186, 97,117,125, 77,159,196,115, 58,141, 35, 33, 27, 98,144, 67,214,234, 72,
- 42,120, 90, 78, 42,239,163, 85, 90,124,163, 71, 91, 21,231, 22,150, 34,190,202,197,151, 46, 10,242, 2, 84, 43,220,227,148,206,
-112, 67, 42,158,198,192, 74,105, 33,162,157,198,117,143,183,121, 99,164, 51,175, 43, 25, 99, 55,181,193, 26, 87, 68, 75,141, 36,
- 91, 85, 30,172,125, 36,186,149, 78,125, 76,144,148, 38,102, 41,216,249,104, 67,201, 98,233,202, 41,144,226,132, 14, 19,152,137,
-172, 29, 89, 25,166,148, 81, 5, 88, 67, 86,104, 83,246,132,198,130,245,167,124,247, 92,196, 78,169,248,222, 93, 85,137,150,161,
-146, 28,108,235, 75,215, 97,212,147,247,255, 83,150,237,211, 9,250,191,248,128, 25,121, 14,117, 73, 54, 75,121,228,205,155,111,
-216,220,191,101, 53,179,168, 2, 31,194,136, 16, 83, 23,223, 67,206,130, 8, 54,186,164,178,105,195,148, 35,109,107,209, 26,234,
-202, 23, 59, 95,102,185, 88,242,197,175,190, 98,190, 88, 96,172,101,191,223, 10,175, 58, 38,230, 51, 79, 12, 29, 65,105,225, 29,
-164, 84, 86, 57,138,186,169,152,134, 94,162, 63,135,137, 56, 77,180,181, 37,199,136,247,162,201, 72, 10,156, 86, 60,191,185,225,
-205,187,215,196,168,216,238, 50, 55,207, 46,216, 29,166,211, 8, 56, 37,216,237, 35,186,206,164,237, 22,227, 28,179,197,138,249,
-108, 37, 66,192,170, 46,209,149,153,166, 17,108,108,211,204,228, 32, 46, 7,168,181, 30,173,181,116, 73, 70, 99,180, 48,190,125,
-121,221, 85,113,105,196,148,176,214,160, 74,140,103,228, 49,209, 48,147, 37,171,254,184,111, 61,254,247,148, 78,186,136,168,197,
-235,159,145,177,180, 62, 77, 98,202, 88, 27,133,210,101, 93,105, 52,198, 91,150, 23, 75,154, 89,131,113,226,162, 24,250, 1,109,
- 69,141,127,216, 39, 2, 82,228,156,213,210,232, 27,139,115, 53,253, 48,225, 92,197, 48, 70,230,243,101,201, 45, 87,120,111,113,
-190,166, 15,137,166, 94,114,216,236, 8, 41, 11,159, 2, 45,107,173, 41, 23,125, 0,167, 60,143,239, 22,116,197,147, 80,223,227,
-186,238,116, 14,156, 69,126, 27,117, 42,238,206, 22,247, 72, 44,123,118,173, 65, 77,197, 58, 38,162,180, 40,248, 83,146, 74,101,
-154,251, 24,189,157,148,240, 19,166, 8,105,200, 76, 97,160, 31, 34,219,253,196,110, 63,177,217,239,121,118,181,226,249,213, 5,
-113,181,160, 93,205,241,171, 57,106,214,160,171, 22,237,206,196,132, 50,202,194,104,137,125, 85,214, 11,177,206, 41,234,218,176,
- 88,213, 92, 94,206,121,253,250,142,187,251, 3,135, 94, 80,186,198,185,194,119,183, 39, 22,188,215, 74,194, 95, 42, 79,221, 84,
-212,149, 76, 29,101, 58, 36, 76,121, 82, 62,229,215,167,152,144,254, 35, 19, 99, 96, 28, 3,186, 31,232, 75,167, 95,215, 21,222,
-123,112,246, 4,173,177,223, 69, 96,158,117, 19,234,124,236,158,158,198,105,170,116, 26,131,156, 18, 51,142,197, 61,231, 39,133,
-252, 40,136,200, 80,108, 47,138,104, 10,240,191,252,114, 99, 52, 57,155,178,191,148,177, 94,176,146, 15,171,138,234,249,168, 6,
-214,103, 5,253,120, 46, 30,129, 39, 70, 37, 18, 22, 95, 45,105,170,138, 79, 62,186, 97,186,172, 88, 53,134,155,171, 37,127,247,
-239,254,103,220,222,221,163,181,101, 12,150, 55,247, 29,191,122,219,241,159,255, 87, 63,102,102, 52, 47, 62,190,230,111,253, 79,
-254, 13,126,242,211, 95,242,240,176, 97,214,180, 92, 45, 23,120, 45, 73, 76, 70,105,250,126, 36, 12,145,166,105, 48,141,101,152,
- 70, 22,139, 21,211,112, 16, 81,144,147,206,224,255,249, 31,253,199,252,206,223,252,183,249,215,254,181,191,205,127,245,247,254,
- 62,191,243,233,231,252,141,127,229, 15, 33,100, 76, 22,162, 89, 42, 55,241, 99,125,143, 49, 67, 73,240,121,249,230, 45,222, 88,
- 42,231, 8, 33,176,222,108, 88, 94, 92, 50,164,128,237,123, 98,215,211,245, 61,214, 24,230,109,195, 20, 2,253, 56, 50,107, 26,
- 9,109, 81,138,118, 46, 97, 46,125, 8,244,125,199,254,208,227, 92, 5, 40,140, 17,240, 74, 12,137,148, 3,228, 72, 24,247, 12,
-155,123,116,232, 78,150, 20, 9,111, 17,159,105,140,169, 20,239,116,218,137,105,253, 56,246,149,231, 44,159, 68, 19,234,124, 87,
-140, 18,177,157,210,101,212,116,116,131,229, 39,214,173,163, 69,204, 20,241, 80,204,226,179,150,113,175,116,223,170,116, 68,222,
-123, 81, 22,123, 71, 66,162, 24,115,210, 68, 25,253,200,222, 15, 69,196, 74,254,178,182,167, 72,197, 99, 81, 79, 49,226, 66,100,
- 28, 7,209, 59, 40, 77, 86,197,246, 18,166,211,197, 75, 44, 40, 14, 99, 93, 1,134,192, 52, 77,146, 24, 86,213,212,227, 36, 34,
-172,226,205, 55,101, 21,112,220, 37,158,180, 38,164, 15,203, 71,127,203,130,254, 62, 26,249, 47,115,166,124,104,138,246,212,169,
-146, 36,176, 39, 4, 14,155,123,246,155, 59, 94,125,251, 53, 23,171, 5,253,237, 22,239, 61,241, 48, 65, 78,130, 98,141,153,108,
- 32,134,128,245, 18, 91, 25, 67,128, 12,214,105,170,202,151,181, 5,120, 95,159,118,247,198, 74, 40, 70,136, 9,107, 28,135,126,
-196, 59, 77, 23, 68, 96, 7,210,213, 76,253, 68, 51,111,164, 3,204, 50,233, 81, 37,150,213,212, 86, 46,150, 73,196,141,198,105,
- 9, 91, 9, 3,195,152,233,250,196, 24, 29,207, 23, 51,190,252,241,183,204,151,150,160, 96,156, 18, 81,103, 24, 0, 19,121,119,
-119, 71, 72,153, 16, 34,243,249,130,144, 20,214, 86, 52, 85, 35,116, 47, 99,112, 70,203, 46,211,138,128, 78, 41,133,171, 60,206,
-122,172, 19, 17,167, 41, 93, 86,202, 2,136, 49,214,161,141, 40,153,209,134,120, 54,225, 60, 22, 50, 73, 21,147, 6, 89,198,116,
-185,100,110, 39,116, 73, 8,203,101,237,149,117,126,212, 31, 29, 9,138,229,121, 32, 79, 24, 35,153,240,104,205,114, 53,103,183,
-239, 81,122,193,208,247, 60,172, 31, 48,222,162, 6, 25,209,134,225, 64,202,142,113,156,112,174,102, 10, 17,107, 45, 99,202,120,
- 91,203,106, 42, 36,154,118,134,178,136, 16,119,236,113,190, 38, 99,137, 89, 19,147, 38,161, 8, 57,113, 24, 70,185,216,158, 39,
- 4, 62, 9,238, 82, 69, 84, 90, 46,197, 8,116, 42, 69,177, 84,230,156,158, 92,100, 85,209,146,156,156, 31, 90,227, 84, 70, 23,
-113,108, 76,154,152, 20, 46,105, 82, 82,114,126, 28,127,143, 19,163, 66,115, 50,134,150, 95, 55, 68,161,191,197, 24, 25,166,142,
-174,143,172,119, 27,182, 15, 59,246,119, 91,186,231, 23,172,246, 75,102,253,146,106, 53,199,207, 35,182,206, 66,166,115, 78, 60,
-238, 69, 52,172, 16,135, 79,109, 52,182,210, 84,141,167, 93,180, 92, 92, 92,114,115,125,205,235, 55,107,238,238, 55,108,247, 59,
-166, 16, 1, 45,239,159,178, 78,244,101,244,222,212,158, 89, 91, 75,226, 94,209,221, 24, 43,235,150, 24,196,249, 49, 13, 35,227,
- 16,152,198,145,169, 20,120,225, 69,100,162,134, 73, 43,134,174,147,201,144,145,162,110,140, 8, 89,127,253,216,252,204,151,203,
- 19,241,205, 35, 20,225, 28,231,122,174,246,123, 28, 55,126,216, 50,103, 98, 38,152, 72,138,194, 75, 15, 70, 17,140,194, 25, 57,
- 92,114,130,144,116, 65,143,230,167,163,171,247, 72,114,231,187, 72,173, 53,153,154,217,108,197,124,182,228,250,114,193,226, 69,
-131, 9, 3,159, 60, 91, 49,141, 59,126,252,227,159, 72,108,159,157,241, 15,255,241,207, 25,186,200,197,213, 51,190,247,217, 53,
- 23,151, 23,220,109,246,252,221,255,236,191,100,222, 84, 92, 46,151,248, 52, 96,146,198, 16, 25,135,129,202,213,146, 78, 22, 2,
- 83, 12,248,156,216,239,215,212,117,197,252, 98, 37,221,131,175,248,179, 63,251,199,116,120,254,230,191,254,111,242,159,254,255,
-254,191,252,249,159,253, 41,255,187,255,245,191,143,138, 96,148, 41, 33, 18,234, 4, 47, 80,101,164,149, 65, 44, 34,105,228,219,
- 87,175,184, 88,173,136,177,216, 70,194,196,221,250,129,113, 28, 49, 86,130, 6,130,209, 52,149,231,112,232,136, 33, 72,156,162,
-179,108,246,123,222,222,222,146,141,225,242,230, 25, 97,220,209,143, 35,118,233,169,155,134,221, 86,128, 52, 99,140, 37,223, 92,
-209,237,119, 28,214,107,244,217, 37,238, 20,133,124,150,176, 20,211, 25,230,247,113,186,248,104,227, 56,170, 61, 75,206,239,227,
-251, 68,118,122,185,172, 80,100, 13,119, 76,113, 43,175,117,105,102,163,202,152,242,123,135,148, 9, 83, 98, 42,159,163,148,140,
-155, 76, 9, 97,176, 85, 37, 15,122,185,213,234,178,219, 18, 7,181,193,106,143,113, 94,240,145,104, 66,152,164,168, 7, 75,140,
- 9, 29,166, 83,167,164,138,197,197, 90,203, 56,141,196, 56,149, 21,207, 99, 72, 3, 64,138,161, 92,118,228, 98,112,204,147,215,
- 74, 9,119,218, 40,162,126, 76, 54, 60,250,237, 69,235,251, 47,182, 37,255,117,235,177,156,147,136,150,138,253,115, 58,236,249,
-241,159,252, 9,222, 91,236,229,146,212,223,210,119,129, 48, 69,154, 99,215, 88, 82,161,142,151,116,163, 76, 65,166, 74,236,173,
- 49,146,178,134, 50, 92, 92, 8,170,181,242, 53, 9, 77, 55,244,116, 99, 96, 53,175,177, 90,113,216,247,180,141,227,205,250, 32,
-140,243, 8,222, 90,185, 60, 31, 58,234,198,209,239, 7,180, 50, 88, 45,171, 55,109,149,100, 95,123,131,107, 44,237,188,230,245,
-219, 59,172,175,120,251,245,129,143, 62,187,224,103,191,122,197,197, 71,158, 41, 70,250, 16, 81, 14,180, 21,175,246, 24, 19, 13,
-134,183,239,222,137,190,164, 63,176, 92, 46,153, 42,137, 53,246,197, 57,131, 50, 2,153,138, 25,107,149,236, 85,141,125, 20, 51,
-150, 92,107,153,226,232,242,255,165,144,107,109, 10,187, 63, 63,198, 4,228,140, 53, 6, 91,132,110, 41, 70, 65,132, 30, 19,184,
-120,108, 80,142,246, 92, 74, 7,127,196, 14,107, 10, 8, 72, 41,114, 12,164, 28,112,222, 50, 29, 14,204,151, 45, 57, 37,106,231,
-232,119, 45, 15,109,205,195, 93,135,179,101,156,159,164, 97, 72, 49, 98,181, 37,134, 72,200, 9,231, 13, 83,136,180,182, 98, 24,
- 14, 24,111, 73,121,164,170, 42, 76, 47, 20, 65,249,147, 13,169, 40,249,181, 22,193,222, 20,199, 39,146,205, 39, 57, 28,229,125,
-127,180, 90,230,130, 58, 62,143, 61, 20,171,215,177,185, 59,179,130,161,229, 25,215,242, 61,176,134,242,236, 37,140, 73,104, 45,
- 63,198, 36, 19,140, 99, 17,231, 60,150,225,220,222, 90, 4,186, 99, 84,244, 33,209, 13, 18,106,181,126,216,114,191,221,242,236,
- 97,197,205,238,154,229, 85,207,124, 53,209, 44, 6,170,249, 12,221,212, 40, 87,161,109,133,210, 14,237, 12,201,120,146, 81, 37,
-210,181,197, 86, 51,170, 89,207,108,117,193,234,102,199,250,126,195,221,221, 61, 15,235, 45,251, 67, 79, 78,178, 30, 84, 74,236,
-188, 78,131,209,242, 30,179,206,200,170,170,146,117,142, 42, 94,246,106,154, 24,251,129,225,208, 51, 12, 26, 61,140,228, 49, 22,
-128, 88, 36,132, 2,131,210,234,244,163,214, 50,246,183,231, 33, 21, 71,187,206,241,195, 88,131, 61,125, 28,227, 26,159,114,217,
-229,245,210,143,105, 49,167, 23,245,233,216,254, 59, 56, 59,185, 23,130, 74, 24,149, 37,152,163,124, 40, 43,157,186, 73,250, 20,
-112,112,252,189,245,251, 25,178,156,199,105, 66, 80,153,202,181, 84,245, 12,239, 61, 57, 77, 44,103, 53, 85, 54,140,253,196,223,
-254, 27,127,139,223,249,254, 15, 48,206,243,231, 63,253,130,215,183,107,148,157, 49,191,184,161, 27,122,254,225, 63,254,115,238,
-238,238, 24,186,129,203,229,140,153,215,212,106,194, 41, 39,144,138, 44, 48, 25,107,133,181,238,156,197,121,137,131,108,231, 45,
-182,110,169, 42,195,253,183, 95, 19,187,142,175,254,226,207,120, 88, 63,128, 10,220, 62,220, 50,165, 9,156,193,214, 21,169,123,
-244, 40, 63,170,223,143,135,165,188, 65, 23, 23, 43, 80,154,135,187, 59, 86, 23, 43, 54,219,173, 48,170,157, 99,225,107,134,110,
-196, 26, 77, 93,213,144, 18,109,211,160,179,236,150,199, 20,137,100,246,135, 3,117,215, 19,166, 9,163, 45,219,205, 22,101, 29,
- 99, 16, 92,231, 24, 69,104,146, 82, 98,236, 6,172, 49,197,242,148, 31,135, 48, 69,241,152, 83, 62,243, 95,158, 49,154,203, 98,
-228,216,181, 31, 49,184, 90,149,189, 82, 41,238, 24, 73,102,202, 89,114,218, 99, 82, 66,189,147, 28, 48,193,166,150,189,123, 25,
-108,151,101,153, 62,147, 75,234, 71,250, 20,103,157,129, 6, 93,224, 23,199, 9, 82,206,177,224, 90, 13, 42, 37,140,230, 9,160,
- 38,151, 56,217, 99,230,179, 42, 7,180,247, 98,221, 19, 34,151, 46, 92,116,241,232,166, 50,141,144,124, 38, 69, 14,147,220,170,
-199,137, 48,142,140,227,200,197, 52, 49, 91, 46, 72,185, 70, 41,137,197, 77,233,132,249,126,242,158,253,239,239,159, 92, 70,211,
-194, 41,216, 31,118,220,189,122,205,237,203, 87,252,222,239,253, 46,191,216,191, 37, 25,205,254, 48,224,178,194,101,141, 46,223,
-205, 88,112,187, 57,201, 78,125, 74,129,198, 91, 98, 12,248,170,149, 76,109, 35,196,192,237,182, 35, 3,135,195, 1,165, 36, 28,
- 99,183, 59,176,156, 55, 12,253, 22, 84,195, 24, 34, 77, 85, 51, 78, 19, 55,171, 11, 14,219, 53,139,197,140,135,245, 22,231, 45,
-251, 93, 47, 34, 54, 13,222, 26, 1, 8, 53, 22, 84, 98, 8, 19, 89,107,222,222,109,185,126, 49,103,219,237, 88, 92, 26,116, 5,
-177,216, 24, 51, 50,170, 78, 41,158,198,152,206,106, 14,221,150,204, 68,140, 83,233, 42, 19,179,166, 37,198, 10,211, 46, 81, 37,
- 58, 85, 91, 35, 88,229, 41, 20,123,165,125,236, 76,203,243, 17, 74,252,172,214, 26,101,159, 90,116,116,105, 70,244,153, 80, 82,
- 29,173,136, 39,103,200,177, 50,154, 19,144,234, 56,185, 58,157,167, 89,124,206,228, 76, 24,123,210, 52,146, 67,160,239,247, 24,
-157,208, 4, 81,198, 19,153,207, 26, 54,235, 7,198,105, 40,156, 4,233, 86,167,105,160, 93, 52, 60,236,239,217,108,215, 2,173,
-169,171,178,179,215, 5,166,213,115,177,156,179,217,247, 84,117, 37,207,158,182,197, 50,154, 49, 89,152,255,233, 3,238,166,167,
-245, 65,125,192,214,150, 31,201, 74,101,250,150,146,144,227,162,206,104, 93, 22,105,250,248,245,235,210,197,203, 25, 98,148,172,
- 62, 68,127, 19,197,162,122,106, 64,206,116, 34,133, 49,155, 75,144, 20, 90, 23,189, 81, 36, 78,138, 33,140,236,199,137,221, 52,
-177,237, 7,118,135,137,231,155,129,171,171,158,229,213,129,116,177,196,204, 27,204,108,134,173,103,226,116,177, 85, 97, 80,120,
-148,246,100, 93,227, 76,139,170,122, 76,219, 80,207, 27,150,203,150,203,203, 5,235,245,150,205,122,199,102,189,165,239, 6,153,
-194,158,133, 67,228, 20,202,164, 33,139,150,160,170,132,252, 8,228, 24,100, 95,238, 29,182,115,152,174,199,116, 3,251, 44, 99,
-249, 97, 28, 9,233,236,251,158, 31,191,183, 54,149, 93,166,214,210, 85, 89,103,139,186,216,138, 15,219, 60,138, 22,142,137,105,
-143, 83,239, 71, 8,199, 7,183,132, 79, 68,144,249, 73, 24,134, 42, 94,218,227,176,196,156, 57,210, 68,239, 84, 68, 17,197,143,
-120, 20,229,233,147, 10,251, 3,160, 27, 37, 97, 46,109, 59, 43,177,163, 20,162, 90,199,139,229,140,219,183,239, 56,140,137,159,
-253,252, 75,146, 49,252,249, 95,252,148,205,250, 22,101, 59,190,120,249,138,135,205, 65,118, 33,229,239, 53,246, 3,238, 82,163,
-147, 60,244,227, 40, 30,238,156,160,169, 23, 50,234,112,114,248, 59, 47,170,222,132,101,121,253, 17,221, 48,162, 81,124,118,189,
-228,205, 97, 3, 90,114,211,223,222,223,129, 49,184,186, 18,188,107, 8, 79, 86, 23, 90, 89,249,126, 22,181,116, 66,130, 44, 46,
-174, 46, 25,199,145, 67, 39,169,105,149,246, 18,210, 48, 14, 52,243, 57,222,121,172,214, 52, 85, 77,140, 81, 66, 94,234,154,126,
- 24,104,218, 57,175, 94,189,146, 96,139,146, 41,174, 98,241,195,106,133, 81, 26,157,164,227,218,231, 40, 9, 65,165, 76,171,227,
- 43, 84,198,240, 74,231,114,219, 78,143,100,181, 83, 0,143, 62,113,176,101, 44, 47,239, 31,171,229, 61, 36, 33, 5,242,208,167,
- 44,132, 40, 21, 51, 42,137,117, 39,196,146,229,173, 4, 18,121,124,175,201,133, 67,166, 3, 83,121, 67, 31,134, 30,187,183, 36,
- 18,227, 52,226,187,170,196,134,138,149, 13,101,137,170,228, 44, 43, 75, 50, 25, 27, 19,218, 78, 5,199,153,201, 49, 16,130,216,
-214, 68, 92, 19, 11,223,192,160, 11,140,198, 89,203, 56,106, 70, 53, 50,230,241,228, 67,205, 41, 18, 85,148, 41,132, 17, 97,222,
- 52,142,244, 93, 71,223, 29,152,134,142, 24,158, 51,203,151,162,160,118, 34,194,226, 40, 6, 60, 30,108,127,101,188,210, 63,139,
-139,192,211,231, 71,107,197,110,123, 32, 12, 35, 95,253,252,151,124,239,211,207, 88,249,204,159,253,215, 19, 49,149,247, 65,202,
- 56,107, 48,186,192, 63, 98, 70,233,132,247,150,156, 35, 86,131,243, 48, 77,229, 61, 92,194,122,166, 16,232, 7,121,189,178,134,
-113,236, 81, 90, 19, 66,143,175, 26,134, 78,209, 13, 3,222,138,176,213, 42,205, 52,141, 88,103, 36,132, 70, 69,200,150, 20, 50,
-117, 43, 88, 82, 84, 46,182, 43, 71, 86,145, 97, 28, 81,206, 10,244,102,102, 57,236, 96,182,108,217,142, 61,190,105, 37, 81,204,
- 57, 82,209,196,116,253,158,152, 2, 99, 25,225,135, 24,216, 29, 54, 24,109,177,247, 2, 64, 26,250, 17,176, 44, 22, 11, 66, 12,
-152,104, 33, 71,172,119, 39, 18,156,236,255, 11,183,160, 96,125,143, 54,213,105, 12,197,247,110, 74, 30,186, 58, 77,172,114,206,
-144,164,248,230,194, 76, 79,169,116,237,198, 64,193,140, 30, 93, 16,143,168,226,210,185,199, 40,174,141,174, 99, 60, 28,132,219,
-191,219,145, 67,164,239,186,146,114, 54, 48, 77, 93, 33,194,237, 32, 4,226, 20,132,213,239, 38, 50,178, 74, 27,167,137, 74,105,
-172, 57, 83,146, 43, 77,138,129,126,191, 21,142,186,209,162, 45,209, 22,165, 50, 49, 41,250, 41,208,245,195,169, 27,230,201,101,
- 69,125, 39,117, 51,243,148, 89,126, 50, 97, 41, 93, 58,120, 8, 49,161, 85, 44,208, 36, 32, 42,225, 78, 41,133, 86, 70,214, 45,
- 38,203,143, 58, 75,131,169,181,224,150, 79, 48, 27,117, 98, 53, 64, 58, 61, 98, 34,194, 46, 5, 62, 64, 84,134,160,100, 26,152,
-213, 72,140, 91,166, 62, 50,236, 39,186,253,129,195, 97,203,197,208, 81,119,115,170,161,195,207, 70, 76, 45, 28, 10, 92, 35,147,
- 94,227,208,120,208, 65,124,236,206, 66,229,100, 87, 62,159, 49, 91,205, 89,110,246,108,239, 55,108, 55, 59, 14,187, 3,227, 36,
-194,227,170, 22,209,111,229,236,201,145,112,116, 75,104,173,192, 30, 93, 24, 71, 99, 68, 70,197,196, 52, 26, 6, 45,186,141, 97,
-152,232,167, 73,166,131,165, 88,166,156,176,225,168,110, 70,194, 19,136, 17,109, 52, 58,137,204, 48,199, 92,118,164, 17,210, 49,
-223, 85,127, 32,122,245, 67,148,155,115, 43,122,122,114, 38,165,146,160, 21,131,120, 50, 69, 8,112,228, 91,115, 26,151,156,223,
-212,100,231,156,222,243,204,231,247, 50,165, 53,132, 64, 54, 61,235,135,129,126, 7,119, 38,240,174,185, 67,235,196,127,242,159,
-255,125,254,155,127,244, 51,246,218,252,255,153,251,211,104, 93,211,244,190, 11,251,221,211, 51,188,195,222,251, 76, 53,117,117,
- 85, 87,207,221, 86,183, 37, 89, 45,227,150, 49, 32, 12, 49, 96, 28,219, 64, 0,199, 96, 45, 49,153,149,176,178, 18, 2,193,100,
- 49,100, 97, 12,100,241, 37, 31, 2, 49, 24, 72,156,196, 96, 67, 28, 2, 14, 88,198,150,108, 89,150, 37,203, 18,178,213,221,170,
-174,174,170,238, 26, 78,157,121, 15,239,244, 12,247,148, 15,215,253,188,239,187,207,169,106,203,178,147,160, 94,123,213,169,210,
- 57,251,236,253,238,231,189,175,251,186,174,255,255,247,231,244,180,165, 86, 53,235,205,200,249,110,164, 82, 6, 71,160, 49,153,
-108, 53, 85,227,132,104,228, 28, 40,139,115,134, 24,183,128, 98,183,217,114,235,246, 11,144, 13, 49, 41,124, 31,113, 14,140, 94,
-176, 60,125,137, 7, 79, 46, 49,214,113, 99,214, 50, 59, 59,229,157,247, 31, 19,208,220,189,127,159,197, 98, 73,221,131,186,243,
- 28,247, 30,124, 80,138,137, 42,183,222,132,209,150,152, 5, 78,147, 67, 98,179,222,178, 88, 44, 4, 32,131,194, 26,135,209,226,
-117,191,121,227, 6,179,166,161,157,181,248, 97, 96, 12,158,133,158, 75,218,154,113,244,187,129,116, 2, 67,161, 30,213,237,140,
-172, 20,149,173,233,198, 13, 65,203,158, 78,251,145,208,111, 65,121,116,173,208,217,237,117, 11, 19,187,121, 74, 9, 75,105,186,
- 93,171,103,110,232,186, 8, 22,167, 98, 97,237, 33, 83, 88,105,189,223,151,145,166,145,112, 46, 97, 5,106,175,183,200,165,160,
-147,101, 92,234,115,166,243, 30,227, 29,166,247,104, 59, 8, 79,188, 20,210, 89, 87,203,229, 74,155,130,162, 5,148, 35,105, 41,
-236, 89, 89,178, 25,177, 78, 24,239,106,178,228,164, 44,135,106, 10,101, 15, 16, 15, 42,255, 9,205,169, 20, 86, 24,157, 40, 45,
- 69, 42,132, 32,224,136, 20, 37, 24, 39, 78, 94, 81,225,169,199,113, 36, 13, 35,113, 24,241, 62,144,111,221,166,158, 67,110,107,
-185,220, 20,114,159, 62, 28, 67,135, 95, 29,101,199,230,239,106,107, 51,191,106, 24,212,193, 2, 42,111,225,232, 71,114, 31,217,
- 62,185,194, 15, 3,159,249,226,231,249,206,183,190,129,173, 23,220, 58,185,195,246,222, 22, 69, 68, 91,209, 56,132, 44,241,168,
- 49, 39,180, 1,223, 71, 42, 35,233, 46,203,249,140, 20, 36,158,181,109, 91,174,118, 27,162, 49,140, 62, 82,215, 14, 91, 89, 46,
- 87, 87,180, 78, 16,198, 17, 24, 66,198, 36,197,233, 98, 6, 49, 18,194,200,172,169,184,186,184, 20,175, 47, 22,157,203, 68, 39,
- 39,106, 99,112,214, 16,253,136,115,154, 74, 25, 30, 94,118,204, 78, 78,121,178, 90, 83,207,107,214,125, 32,185, 37,168,134,182,
-170,177,149, 34,134,129,144, 6,102,149, 33, 36, 17,222,165,113, 44,207,117,160,239,197,246,165,163,102, 62, 95,146,213,165,140,
-235,125,195, 60, 37, 78, 78, 78,246, 83,158, 9,138,164, 39,210, 90, 10,226, 85, 79, 22, 16, 69,126,142,144,114, 60,202,202, 53,
- 68,163, 81, 57,200,202, 35,176, 15, 45, 82,170,116,110, 73,147,113,229, 34,157, 4,202,162, 21,196, 72, 14,129, 52,140,248, 93,
- 71,191,222,176, 94,173, 24,250,158, 97,219,209,119,221,222,111,142,210,116,187, 13, 93,183, 22,141,204,238,146, 28, 18,190,243,
-232,164, 72,117,198,135, 32,220, 5,229,104,173,149, 75,234,216, 81, 59, 75,162, 33,143, 25,103, 2,198, 52,132,208,163,140, 37,
- 37, 97,127, 96,106,188,210,140, 64, 34, 21, 10,229, 65,228,122,208,216,148,153,217,241,148, 65, 77, 18,149,137,161, 41,157,127,
-142, 81, 34,184,179, 20,115,241,140,103, 12, 7, 33,180, 20,116,153,214, 24,163, 48, 73, 23,240, 84, 66, 37, 85,154,255,137,119,
- 82,198,250,234, 72, 29,207, 20,150, 36,207,110,206, 10, 21,100,237,219,107,184,234, 3, 81,239,232,136,108,195, 72,231, 19, 55,
-122,207,162, 31,136,203, 1,183,156, 67, 28, 48,205, 9,166,106,201, 38,161, 76,133,209,142,108, 44, 90, 87, 36, 83,161,109,141,
-171, 71,104, 91,204, 98, 78,115, 50,103,113,181,102,183, 94,211,109,122,134, 97,192, 40,141, 51, 96, 85, 70,229, 72,140, 30,227,
- 21, 42,121, 74,204, 93,153,110, 39,225,226, 88, 77,101, 5,136, 51,106, 75,175, 52, 57, 38,226, 24,240, 94,166,136,211,153,100,
- 83,140,130,159, 75,145,148, 53, 73,101,201, 74, 46,249,189, 49,150, 17,163,201,251, 93,206, 20,176, 33,183,200,103,209,127,228,
-131,184, 67, 29,255,179, 8,238,114, 86, 34,104,202,226,103,142, 89, 10,198, 36,194, 74, 37, 5,107, 63,254,205,233, 41, 82,205,
-135,239,233,101, 18,166,121,255,157,183,121,238,185, 23,121,251,205,183,104,219,154, 27,103, 75, 82, 28,113,181, 99,237, 45,237,
-141, 23,120,239,254,125,154, 27, 45,175,124,252,121,118,223,121,143,211,106, 70,171, 28, 51,147,217, 94, 61,224,198,217, 66,124,
-238,125,143,154, 47,196, 59, 91,198,142,243,197, 12,165,102,172,186, 1, 27, 18, 75, 55,163,169, 42,162,247,156, 63,126, 64,248,
-212,199,153,181,210,233, 69,159,121,233,227,207,211,184,175,177,243,137,247,223,123,151,231,239, 60,199,221,247, 54,188,246,202,
- 39,248,224,222, 7, 79, 5,128, 83, 70,181,137,186,170, 25,131, 23, 29, 77,206,204, 22,115,241,100, 43,197,232,125, 65,128, 30,
-108, 19,135, 91,191,116, 16,214, 84,116,125,207,102,187, 67, 91, 39, 20,186, 66,162, 67,107,218,118,198,213,118,139,206, 2, 1,
-201,190,199, 25,131, 54, 14,147,236, 51, 72, 66,233, 82, 39,169,215,179, 73, 68, 83,193,126,118,175,166,158, 77,211,251, 46,137,
- 60, 42,139,125, 69,161, 69, 32,149,133,175,220,247, 67, 1,224, 8,196, 35, 39, 97,100,231,148,168,170, 40,129, 37,106,154,255,
- 72,214,122, 42, 7, 14, 89,139, 7, 91,200, 31,251, 55,206, 65,220,147, 63, 20,145,140,146,221,153, 50, 2, 23,177,133,153, 62,
-125,196, 16,228,235,224, 48,102,140, 41,115,126, 46,250,135, 33, 68,188, 15, 44,111,222,100, 22,151,212,109,131,173, 76,153,140,
- 29,239,217,217, 99, 51, 57, 10,186,248, 40, 27,218,223,200, 78, 93, 29,161, 30,148,130,190,239,209,198,240,240,209, 67, 62,241,
-233, 79,177, 56, 91,210,125, 51,242,249, 47,125,137,111, 93, 93,136,154, 91,131,181, 10,124,177, 12,149, 85,139, 41, 89,217, 37,
- 90,140,182, 54, 12, 62,114,118,118,163,240,247, 19,151,151,151, 2, 99,201,114,232,196,148,208, 70, 68,115, 57, 39, 66,128,182,
-109,176,198,176,235, 59, 26,231,216,108,182, 37,231, 72, 51, 12,129,186,182,101, 29, 34, 90,150,229,162,165,169, 52, 99, 63,226,
- 3,132,206, 50,132,196,122,157, 88, 93,118, 36,103,112,243,138,217,141, 68, 50, 35,163, 50, 68,103,112,246,148, 25,134, 60, 4,
-146,246,140,118,131, 15, 35, 57,121,200, 3,253,208,179,235, 47,241,113, 3,219,138,174, 91,115,118,114,134, 74,145,202, 25,154,
-242,156,167, 24,201,149, 59, 74,210, 43,202,101, 2,218, 76, 2,198, 84, 44,229,133,203,161, 82,193,164,232, 67,150, 64, 40,221,
-166, 86, 24, 50, 57,143,232, 16,246,127, 62,251, 64, 8,158,177,239,217,173, 55, 92, 62,121, 66,223, 73, 48,145, 31,228,249,243,
-195,192, 56,140,194, 25,215,226,202, 24, 6,191,119, 54, 52, 77,203,229,147, 43,134,222,147, 82,166,109, 43,185, 0,164, 36,214,
-192, 44,177,169,193, 15, 52, 85, 45,103, 75,240,140, 67,194,107, 67,221, 46, 68,143,144, 34, 9, 83, 38,146,210,189,203,232,187,
-128,146, 50, 31,234,128,202, 71,162,217, 41, 79, 93,149, 21,173,222,183,134,185, 96,165,101,250, 21, 77,201, 66, 40,118, 89, 83,
-190,175, 84,154,190,152, 51, 62,101,172,145, 6, 33, 41,185,172,230, 50,173,205,228,107, 19,228,107,171,144,242, 94, 53, 74,220,
- 0,109,229,104,107, 75, 93, 89,140,202, 4,239,217,238,192, 26, 37, 5, 55,140,248,224,105,162,120,199,171,121,196,181, 3,166,
-154,131,157, 29,146,224,156, 69,155, 6,109, 20,206,214, 40, 87, 99,171,134,166,106,153,183,115,198,147, 51,118,235, 13,219,245,
- 21, 99, 63,200, 42, 51, 5,114,144,201,103, 72,145, 84,108,183, 19,177,114,250,200, 33, 30,213,213, 50, 5, 45,171, 27,225,146,
-200, 10,113, 12, 1, 27, 66, 56,208,121,162, 96, 29,245,148,162,147, 19,217, 24,185,145, 60,115, 40,171,107, 80,154,227, 52,158,
- 41,141, 43,171,201,198,112, 56,242,212,193,164, 91,108, 80, 69, 32, 85,212,213,178, 5, 73,123,245,116,206, 71, 9, 92,249,186,
-245,231,122, 64,128,252,189, 42,101,116,202, 60,124,255,109,198,221, 21, 23,231, 3,231,235, 83,214,187,129,135, 79, 30,243,202,
-203,175, 50,191,113,135,240,224, 17,209, 84, 60,188,184, 98, 28, 3, 87,187, 43, 86, 17, 94,125,254, 14,159,250,212,167,200,253,
-134,156, 18, 29, 17,173, 36, 5, 77, 59,205,108,177,196,103,197,232, 3,205,108,193, 15,254,134, 31,226,175,254,226,207, 19,250,
- 14,123,162,120,252,240, 46,223,126,107,198, 98, 57, 67, 43,197,114,113,147,229,172,230,246,217,130, 15,206, 87,172, 46, 47,120,
-229,197,143,241,228, 94,205,231, 62,245, 57,126,246, 47,253, 12, 62,199,107,111, 0,107,237,222, 69,208,247, 3,198,136,192, 40,
-165, 68,215,117,123, 79,187, 41, 69,172,235,118,178,111, 84,138,182,169, 37, 31, 61, 39, 22,203, 5, 90, 27, 70, 63,210, 86, 53,
-198, 42,118, 93,143,139, 9,140,165,105, 90,182,221,192,197,227,199,168,126,141, 13, 91, 81,210,170,201,114,115,189, 83, 63,140,
-207,242, 95, 83, 89,125,204, 47,200,249,195,237, 46, 31, 57, 26, 46,130, 18, 38,116,100,158, 60,171,153, 97, 28,203,127, 19,233,
-124,140, 30,239, 71,234,170, 41, 42,101,189, 39,223, 97, 28,202,214, 40,163, 48,217, 94,219,177, 77, 49,167,178, 99,157,166, 69,
-135,224,137,235,225, 67, 74,178,192,181,193, 26,177,111, 25, 45,194,151,137,100, 21, 67, 1,130, 40, 13, 68,124,200,108, 55, 43,
- 17, 90,133, 32,251,246, 16,153,159,156,208,206,103, 88,103,201, 69, 84, 38, 40, 88,246, 29,207,161,112,171,191,105,254,245,143,
-122,221, 99, 74, 24,231,216,108,174, 88,158,156,242,220,157,155,124,235,205,111,242,125,191,225,135,120,235, 47,253, 52,239, 46,
-150,146, 42,165, 21,149, 53, 36,175, 74,119, 6,149, 51,178, 66, 83,147,114, 57,227,172,136, 33, 99, 17,122,142, 33, 81,149,220,
-118,237, 28,171,243, 75,180,209,133, 35,160, 81, 72,204,233,201,114,201, 56,138,111, 92, 70,139, 3, 57,102, 94,186,125,139,119,
-190,243,128,179,179,166, 16, 10, 51,139, 89,131, 51,134, 24, 51,166, 50,188,247,104,164, 62,185,201,119,238,174,232, 3, 98, 41,
- 82,129,100, 71,244,163, 43,230,203,138,179, 89,195,237,147, 83,116,157,208,173,195, 44,102,178, 62,240, 21,253,110,199,176,219,
-225,140, 66, 41,143,143, 61, 62, 70,208, 21, 42, 71, 84,150,188,121,107,229,103,110,157, 36,198,153, 24, 8,193, 96,138,253, 76,
- 28, 33, 81, 82, 11,141,217,235, 66, 52, 19,232, 40, 73,144, 78, 40, 46,160, 40, 90,134, 34, 11, 67, 77, 28,246, 20, 9, 33,208,
-117, 29, 87,231, 23,140,195,192,102,179, 17, 64, 79,121, 86,131, 23,254,188,247, 30, 82, 22, 87,130, 17,178,157, 42,120,224,121,
- 92,176, 89,119, 52,237, 2,165, 59,114, 30,233,251,192,110,215,179, 88,156, 16,162,136, 69, 49,236,191, 46, 87,183, 84, 90,149,
- 12, 13, 41, 44,144,169,107, 71, 24, 61,214,206,246,142,157, 73,251, 99,148,218,235, 69, 14,239,153,124,141,242, 57,157,225,154,
- 76,228,200, 57,117,141,127,168,142,168,233, 7,155,155,181,146,163, 96, 16,187,219,100, 19, 53, 70, 4,147,222,138, 61,242, 80,
- 31,166,166,243,184,158,171,107,107, 66,163,197, 69,229,140,166,173, 29,181,179, 52,149,149,180, 72,163,168, 10, 52,105,232, 7,
- 20, 18, 12, 22, 66, 34,135, 4,193,163,252,128,154, 5, 84, 29,192,138,152, 78,105,139, 50,226,134, 80, 49,201,116, 67, 87,100,
- 83,227, 92,131,171, 7, 92,237,168,103, 53,253,118,139,239,122,252, 56, 8,205,114,136, 36,239,139,158, 66,250,216, 16,165, 33,
-136, 65,126,222, 99,193,201,250,224,203,180,240,104,178, 88,244, 65,164,132, 29, 71, 79,178, 18, 6, 31,149, 42,209,145,121, 63,
- 26,215,230,104, 31,250,116, 71, 69,161,120, 77, 41, 86, 71, 7, 98,154,240,112,165,160,155, 73, 1,188,239,244,229,207,198, 82,
-204, 67,146, 78,112, 42,244,211,184, 38,163,228, 7, 6,215, 85,216, 83, 71,127,244, 65,206, 24, 18,175,189,242,113,238,189,255,
- 62, 90, 65, 59, 95,240,232,114,203,123,143, 46,232,253,200, 87, 95,121,149, 7,247, 30, 17,253,192,251,239,189,207,237, 87, 62,
-206,105, 99, 88,156,156,113,117,217,241,193,131, 7,188,112,243,148,218, 53, 92, 60,122,200,174, 15,204,151,183, 69, 45, 62,236,
-112,179, 25, 79,158,172, 81,174,230,203, 95,250, 94,254,222,223,241, 59,112,109,205,159,251,127,255, 55, 44,230, 13,109,227,176,
- 86,241,203,223,252,101,200,138,139,171, 13, 95,190,115,155,239,255,210, 23,184,247,103,127,138,251,247,222,227,147, 47,191, 76,
-223,109,121,229, 99, 47,211,214, 45,190,219, 92,123, 24, 67, 8,130, 3,116,142, 48,140,104,164,155,234,250,158,166, 0, 48,114,
-241,243, 42,173, 25,123, 57, 0,102, 77,195,124, 62, 99,209,206,152,207,231,197, 38,225,168,171,134,171,203, 43,218,249,130,148,
- 18, 87, 87, 43,140,171,208, 85,141, 82,154,126,183, 97,105, 35, 42, 15,178,159, 82,106, 95, 92,158,233, 92,143,146,194,212, 71,
- 4, 12, 60,109,111,249,149,194,137, 38,232,144, 58, 42,236,122, 82,210,151,203,222, 24, 34, 57, 13, 28, 9,237,201, 41, 51,250,
- 40,202,228,242, 38,118,117,141,171, 90,180,220, 95,246,187,108, 17, 99, 74,145, 17,107, 84,225,225,167,184,255,117,218,199,140,
- 78, 23,201,131,197, 38, 43,161,218, 9, 46,215, 16,140,140,145,189,242,114,211,206,251, 57, 1, 49,120,250,237,166, 36,162, 5,
-194, 56,226,251,145,116,243, 22,205,108,134,171, 5, 19, 89,130,168, 72,154, 61,171, 93, 63, 69, 77,252,168,117, 83,254, 21,250,
-224,158,241, 15, 31, 18, 24,138, 98, 59,241,177, 87, 62,206,197,213, 57,183, 95,126,153,151,158,187,205,246,254, 61,116,211,160,
-140,162, 42,133,105, 44, 41, 83, 40,185,124,134, 24, 8, 17,172,149,174,199, 40, 25,237,102, 31,246,249,239,117, 83,145,179, 97,
-179,219, 48,250, 76,211,218,125,225, 87,100, 78,151, 11,198, 97,160,114,142,232, 61,221,110, 71, 12,137,121,219,208,119, 29,214,
- 22, 84,106, 9,126, 49,186, 36,150,145, 57,191,236,105, 23,115,206,215, 29, 67, 84,116,131, 6,229,208, 74,220, 8, 97, 13,151,
- 87, 35,231,116,188,239,174, 88,158, 56, 94,120,113,201,173,219,167, 44,150, 53,237,172,162,118,150,177,106, 36,205, 49, 12,132,
-180, 35,132,132,173, 18,195,216,179,221, 24,140,178, 92, 93, 94, 10,101,172, 80, 37,109, 85,244, 47, 24, 57, 96,181,248,235,149,
- 53,104,107,139, 46, 36,239,133, 79, 41,136, 7, 57,165, 36,216,229,156,100, 85,152, 2, 67, 63,224,125, 96, 24, 61, 49,142,236,
-118, 59, 54,155, 13,219,237, 22,107, 12, 93, 63, 16, 99, 20, 69,122,161, 70, 98, 12, 41, 70,154,162,255,208,102,178,122,214,212,
- 33, 98,237,192,110, 39,233, 98,237,108,206,118,213, 49,244,137,113, 28,101, 89, 20,188,164,193,197, 68, 74, 26,109,170, 98,109,
- 77,248, 97,192,206,103,248,173, 7,165,104,154,138,203,174, 67, 23, 90,158,113,178,198, 50,185,164,178, 77, 15,113,126, 54, 0,
-204, 42,179,135,237,100,100,213,146,139, 14, 33,229,201,234, 76, 1,176,104,170,202,210,212, 53, 77, 83,224, 44,206, 97, 10,116,
- 39,164,132, 15, 14,239, 3,222, 59,134,177, 34,148,194,151,138, 75,107, 42,232,154,252,204,212,112, 47, 90,212,114,193,176, 70,
- 81, 59, 75,101,181,252,179, 4,241, 24,103,169,140, 66, 35, 23,201, 97, 55,200, 4,123,140,164,209,193, 40,235, 53,211,142,232,
-118,142,174,103, 40, 87,161,140, 32,103,117, 57, 99, 20, 14,180, 35,153, 10,101, 42,180,213,216,166,193,213, 21,195,118,203,176,
-221,208,111, 55,140,125,199, 24, 10,165, 49, 31, 26, 5,239, 99, 33,114,122,198, 32,151, 61, 31, 34, 41,133,114,177, 46, 86, 75,
-235,138, 42, 62, 96, 55,187,129,202,197,162, 44, 45, 62,196, 36, 22, 34,179,231, 85, 31,146,160,246,131,148, 73,205,172, 14,119,
- 46, 74, 65,158,236, 72, 19,112, 72,163,240, 83,199,190, 79,239, 41,160,146,152, 8,101, 95,155,202, 3,191,223, 37,230,105, 92,
-163,143,198, 56,135,169,192,211,193, 51,114,160, 39,208,138, 80,184,196,157, 79,140, 25,182,131,116,120,173, 51, 52,202,115,115,
- 49,227,201,213,134,245,197, 5,121,115,197,237,231,231,140,122,100, 48,240,222,195,199,252,192, 23, 63,203,230,242,138,180, 29,
-216,110,183,196, 33, 96,103, 53,155,109, 79,192, 50,107, 23,252,149,175,189,206, 31,249, 99,255, 15,198,110,205,170,228,149,159,
-181, 75,148,171,120,120,126,137, 87,154,245, 56,242,242,203, 47,226,117,228,199,255,226,207,240,248,241, 67,154,166, 34,134,192,
-217,201,146,219,183,110,178,122,127,115,109,132, 29, 66,216,187, 13,118,193, 83,213,117,121, 45,229,117, 24,135,129,211,211, 83,
-134,113,100,177, 88,144,203,239,175,235, 10, 80,184,170,162,109, 91,108, 85,209,117, 35,202,136, 56,236,254,131,135, 84,117,131,
-143,145,101, 12,152,232,104,234, 25,159,120,229, 85,118,143,191, 77,223, 13,130, 43,204,250, 25, 33,226,181, 55,234,135, 20,150,
-195, 4,230,122, 30,192,135, 5, 15, 28,192, 67, 79, 9,191,166, 27,126, 65,111, 22,170,133, 60,103, 25, 50, 81, 4,117, 41,226,
-163, 24,124,180,117,152, 74, 2, 53, 36,170, 83, 14,200, 97,244, 84, 77,162,170, 51, 85, 35,151, 20,109,100, 4,138,142, 76,233,
- 2, 41,230, 82,152,194, 83,211,136, 67,240, 10,234, 58, 58, 73,105,133, 81,134,140, 59,128, 49,140,129,113, 32,132, 80,118,180,
- 17, 18,104, 60, 67, 17,242,196,113, 20,139, 74,215,115,114,118,147,217,169, 80,241,140, 85,178,163,213,148, 16, 29, 57,229,254,
-102,194,104, 62,242, 66,165, 68,181, 61,155,207, 49, 74,211,198, 5, 47,222,186,133,201,137,122,121,138,173,103,130,200, 85,129,
- 76, 64, 25, 69,142, 16, 83,164,117, 53,163, 79, 69,196,168, 88, 46, 90,250, 93,135, 54,173, 40,204,125, 79,189, 88,160,163, 98,
-179,237,233,134,161,196,134, 38, 42, 87,179, 89,239,120,238,185, 83,249, 92,237,140,205,122, 77,244, 3,126,240,168,156, 89, 46,
-231, 60,184,119,193, 98,225,136,113,196, 40,249, 59,180,213,248,172, 24, 66,226,201, 78,177,184, 85,113,247,242,130,199, 3,164,
-100,138,211, 2, 48, 10,155, 96, 54,175,233,115,160, 27, 71, 62, 56, 31,120,112, 57,112,115,113,197,171, 31,191,205,243, 47, 45,
-152,213, 53,109,219, 50,111, 90, 97, 57,116,142,148,123, 32, 8,118, 52,202, 57,181,235, 71,218, 49, 80,141,129, 42, 8,185,173,
- 74,178, 26, 83, 25, 81,100, 27,185,236,105, 37, 43,150, 20, 66, 9, 22, 26, 33, 70, 84, 70, 52, 23, 49,145,195,128,239,118,140,
-187, 29,155,205,150,152, 20,221, 48,178,235,183,164,156,217,108, 55,197, 26, 39, 19,149,202, 85, 50,178,213,236, 39, 83, 10,104,
-155,102,127,193, 55,214, 97,171, 10, 23, 18, 77,179,100, 28, 19,209,139, 46,105,187,218,144, 83, 68,169,196,110,183, 41,133, 61,
-144,194,136,171,102,120, 63,208,119,134,249, 13, 97,176, 27,165,177, 74, 49,118,163, 4,137, 88, 71, 72, 25, 55,125,143, 90, 81,
- 25, 83,206,244, 74, 86, 98,153,103,139,168,158, 44,106,215, 93, 23, 83,200,209, 4,211,177,165,216, 86,149,163,169, 28,117, 35,
-226, 82,231,220, 62, 68, 41,101,161, 83,134, 16, 8,161,198,123, 95,104,149,225,232,189, 82, 68,199,124, 88, 80,104,113, 33,152,
-146, 92,167,197, 70,237,140, 22, 20,171, 21,241,179,182,194, 41, 80,164,253, 52,111,216,201,179,217,239, 52,155,121, 71, 51,219,
-209, 44,123,234,197,128,157,141,152,186,198, 52,243, 50, 29, 44, 58, 34,163, 65, 87, 50, 53, 52,146, 81,161,156,248,223, 77, 93,
-151,203,145,188, 38,227, 70,116, 17, 49,166, 18,136, 37, 26,178, 24,164,192, 75,172,173,232,142,234,202, 97, 10, 24, 73,206, 45,
-113, 16,248,224,177, 93,239, 9, 49,203,139,103, 77,233,152, 97, 12,162, 46,212,123, 53,225,145, 47,249, 41, 64,128,153,210,166,
-142,216,211, 89,229, 67,170, 85,241,237,170,233, 22, 87,140,206, 49,149, 47, 52,243, 20, 97, 78,237,129, 54,234, 41, 70,252,228,
-254,184, 94,216,143,246,190, 36,108,213,242,206,131,115, 62,247,197, 47,115,190,218,112,255,173,111,227,180,162,173, 29,119,223,
-123,135,212,117,156,204, 42, 46,214, 34,152,104, 12,204, 93,166, 87, 35, 91,163,120,112,126,197,119, 30, 8,156,162,106,106,186,
-190,103, 36,208,106, 67, 42,236,234, 71,143, 46, 88,158, 25,222,120,227, 13,186,237, 21,125, 30,137, 74, 17,149,227,114, 61,240,
-151,254,251, 95,162,207,153,139,110,195,213,213, 21,203,197,140,215, 62,241, 42,127,245,245, 55,121,231,189,239,144, 8,124,235,
-205,215,121,233,197, 23,120,251,253,119,143,246,214, 1,133,166,239,101,220,174,141, 97,219,237,168,156, 67, 43, 69,223,247, 84,
- 85,197,110,183, 35,165,204,213,229, 37,149, 53,212,117,197,108, 54,167,105,106, 78, 78, 78, 48,198,208,117,131,160,103,199, 17,
-148, 97, 54,159,177,217,118,244,195,200,106,181,226,228, 70, 77, 91,207, 48, 54,177,250, 96,135, 86, 30,178,133,108,174,121, 73,
-255,122,181,217, 31,218,221, 63, 83,224,167, 28,105,174, 9,195,246,172, 41, 37, 35, 62,193,197,234,125,122,153, 86, 25,149, 53,
-218, 72,154,214,124,177,100, 57,159, 49,107, 27,156,209,196, 24,217,172,214,172, 54,107,250,174, 35, 36,217,177, 87, 37,128, 70,
-167, 72, 54,177, 8,205,212,254,160, 56, 94, 49, 60, 77,195, 82, 74, 95,219, 13, 30, 46, 96,166,184, 20, 44,198, 4,241,224,171,
-161,216,223, 34,137, 68, 80, 1,157, 35,236, 34, 97, 28, 24,250,158,110,183,165,219,172,153,111,207, 56, 61, 59,165,157,207,168,
-219, 6, 99, 13,198, 77,192, 5,132,100,199,117,222,195,225, 61,150,127,213, 59,245,167,255,251, 4,241,233, 54, 91,110,221,188,
-141,182, 21,228, 68,213, 46,113,237, 28,227, 12,182,132,140, 72,135,149, 14,140,122,216, 99, 99, 23,115,203,250,114, 32, 4,143,
- 82,134,190,239, 89,156,157, 22,206,248, 6, 99,173, 8,130,208,236,250, 1,231, 52, 77, 93,115,126,113, 78,104, 42,172, 54,116,
-163, 71,145, 89, 46,230,248, 49,160,181, 28,170, 66, 23, 84, 84, 77, 77,239, 7,124,231,121,188,246,216, 27,103,252,133,187,151,
-220,235, 34,171,172,132,120, 26,163,136, 63,179,198,144,185,169, 96,225, 42, 22,205, 9,243, 49,178,222,238,120,120,229,185,216,
-220,227,249,135, 53,175,126,236, 54,207,221, 88,176,152, 85,204,102, 18, 36,228,188, 39,229,129, 16, 70,178,178,140, 65, 49, 6,
-193,142, 58, 31,168,134, 64, 85, 75,154,150, 50, 70,108,164, 5, 88, 52,177, 24, 38,187,111, 74, 81,232,119, 49,144, 67, 32,251,
- 72, 24, 70,182, 87, 79,216, 94,158, 19,253,200,102,215, 49,248, 68, 55,120,172,149, 56, 90, 99,180, 8,131,181,132,200,212,109,
- 75, 83,213,212,174,218, 95,250, 67, 8, 7,241, 41,138,224, 35, 33,122, 34,144,179,166,105,107,170,166, 98,113, 58,231,228,100,
-134, 31,101,197,102,157,161, 31, 6, 65,244, 26, 65,238,170,156,202,165, 62, 73, 33, 85, 74, 70,254, 41,225, 92,141, 54, 61, 33,
-137, 21,181,114,150,249,188,193, 90, 77, 72,146,131, 42,104,234,178, 6,213,122, 31,195,172,245,209,104, 93, 79, 53,129,107, 53,
- 99,154,226, 26, 35, 8,224,170, 60,147, 19,141, 77, 31, 17,248,166,142,212, 71,225, 39,200,222,185, 92,200,211,179,210,171,235,
-235,128,163,230,161, 76,144, 11,129,118,207,253, 87,147,238,164,172,145,209, 34, 12,246, 49, 18,251,145,203,117, 66, 61,217,210,
-182, 43,230, 39, 43, 22,167, 43,102,103,103, 52,243, 5,110,214, 99,155, 25,184,154,236, 92, 65,206, 90,193, 1,151, 58,169,141,
- 52, 33, 88,135,182, 22,235, 92,153,156,110,217,110,182,116,187, 30, 79,148,117, 28,154,172,178, 92, 62,178,193, 78, 4,194, 61,
- 51, 36,151,233,160, 52,193, 62, 6,236, 16, 2, 33,101,116,217,209, 8,132, 94,239, 5, 69,234,200, 63, 61,249,209,247, 62,118,
- 35, 2, 45,231, 28, 22,185,225,216, 50, 6,210, 19,120,164, 36,239,168, 44, 42,103,193,222,197, 34, 24, 41,164,184,162,132,159,
-168, 76,135,224,150,162,155, 47,121,191, 19,156, 32, 31,204,211,207,236,213, 33,211,249,196,233,237, 23,121,225,213, 79,241,246,
-207,252, 37,238, 63,122,136, 85,240,210,139,119,232,186,158,133,179,164,148,104,219,134,186,157,195,184, 35, 12, 3, 47,221,113,
-248,149,229,254,189,129,183,238, 62,228,185,214,112,121,177, 97,126,170,185,245,252,199, 25,208,212,205,130,246,198, 41,118,237,
-121,254,133,151,120,252,232, 46,183,110, 46,248,218,195, 15, 24,251, 30,157,224,114,183, 70, 59,203,206, 7, 94, 57, 59,229,201,
-229, 5,159,250,220,103,248,251,127,219,111,227,191,255,198,191,203,215,190,241, 75,124,249, 11, 95,224, 79,253,233, 31, 99,126,
-178,124,106,148, 42,123,164,148, 19,253,208, 23, 24,139,136,131,200,121, 31,255, 23, 67, 64, 27,195,106,181,226,198,233, 41,166,
-236,215, 66,136, 88, 99,168,235,166, 8,238,114,225,118,103,188,247, 52,133, 3,223, 15, 3,249,106,197,201, 92,225, 82,207, 56,
-238,112,185, 20,187,172,158,125, 35,252, 13, 64, 79, 62,108, 68,124,184,196, 29, 11, 34,121, 6,161,154,167, 8, 82,166, 76,233,
- 76,109, 29,139,197,130,229,201, 41,103, 55,206, 56, 93, 46,153,183, 53,206,202, 27,127, 49, 95, 96,159, 56,206,207, 47, 24,251,
-238,224,212,208, 10,147,235, 67, 34, 26,250,200,130,115, 93,224,119,224, 53, 8, 23,251,217,169, 69, 42, 19, 44,133,214, 9,101,
-229,115, 89,109,241,163, 20,246,152, 34, 62, 6, 84,200, 36,173,196, 97, 16,252,190,176,183,155, 53,219,245,154,211,179, 51, 22,
-167, 39,212,109, 75,213,212, 88,107, 73, 86,161, 83,190,150,238,246, 97, 20,229, 95, 77,167,174,174,137, 27, 37, 5, 47,199,196,
-124,185, 40,174, 85, 41, 80,139,229, 9,166,170, 8, 41,210, 90, 1, 29,150,101, 27,214, 41,114,244, 98, 27, 13,153,202,166,178,
-119,135,177, 11,228,236,169,172,176,223, 67, 8, 12, 99,160, 89, 84,164,164, 36,252, 68, 41,218, 90, 19,188,231,228,100,201, 48,
-140,244,155, 29,126,204, 44,231, 21, 77, 83,177, 89,175, 49, 70, 98, 94,189, 15,220, 60,155, 19,162, 39,164, 76, 23, 32,154,138,
- 15,158,236,120,119, 21, 88, 97,240,206, 50,120, 47,135,116, 86,228,168, 65, 37,158,172, 70,170, 60,114, 98, 20,103,198,114,107,
-209,176,136,129,237,102,224,254,131,129,110,117,143,221, 75,115, 94,254,216, 41,179,121, 35,171,155,217, 9, 89,201, 10, 50,122,
- 47,164, 56, 91, 19,162,208,233,134, 49, 80, 13, 94,208,192,101,215,168,116, 33,207, 21,212,106, 74,161,184, 58,196,205,147, 83,
- 32, 71, 79,240,158,177,219,209,109, 54,108,215, 43,252,208,177, 27, 3,253, 24, 65, 59,172, 54,212, 78, 72,118, 40, 67, 91, 34,
- 92,171,186,150,177,110, 33,225,197,152,232,250, 81,114,238, 17,243,198, 56,200,215, 42, 69, 68, 4,125, 74, 75,103, 58,155, 53,
- 60,206,147, 37, 76,147,114,194,143,158,186,149,201,161,177, 51, 66, 12,251,120,222,169, 33,243,227, 72, 61, 63, 67,171,109,201,
- 85, 72,104, 43, 77,130,209,169,156, 81, 98,241, 99, 15, 10, 99, 31, 98,100, 38, 18,168, 81, 7,135,140, 86,135,231,250, 40,134,
-213, 20,199,140, 51,186,184, 85, 74, 61,209, 26, 93, 46,224, 49, 40,188,201,184,160,240, 90,147,146, 41,187,127,181, 7, 64, 77,
-240,158,252,244,138,118, 15, 85,219,231, 61,146,137,135, 24,220,114, 73, 53, 71,113,201,148,169, 69,204, 90,242, 42,198,196,208,
-119,108,214, 91, 86,151, 87,204, 79,102,156,172, 87,156,220,184,201,252,228,132,122,177,192,182, 51,116, 51, 71, 85, 50, 49, 82,
- 90,139,162,223,105,148,145,181,118, 46,171, 69, 7,204,180, 22, 48,150,214, 36,165,201,221, 64,240,146,136,232, 16,118,192, 52,
-122, 80,218, 92, 59,143, 82, 78,251,117,108,136, 17, 43, 86,170,194,244, 78, 1,163, 20, 33, 78,254,116,181,127,177,153, 68,111,
-197, 2,101,237, 97, 60,152, 83, 6,123,216,139, 84,214,236, 81,139,198,136,152, 38,149,157,101,192,163,178, 18,149, 95, 78,251,
-176,123, 10,241, 40, 77, 35, 78,117,224, 34, 79, 22,137, 92,198,241, 83, 17,152, 20,216,249,168, 72, 40,173,121,249,149, 87, 89,
-117,153, 59, 55,111,241,157,183,223,166,210,154,155,103, 11, 78,230, 45, 58,103,162,181,180, 85,203, 39,158, 59, 97,110,192,135,
-154,104, 18,201,104,148,142,104,149,120,178, 94,241,220,173, 79, 48,170,115, 78,195,200,102,125,201,226,249,143,177,238, 54, 60,
-184,123,151,136,230,225,253,183,120,242,248, 33, 74, 69, 82, 28, 81,203, 5, 99, 31, 8,131, 40, 83,157,155, 49,155,223,224,107,
-223,186, 32,180, 3,191,230, 43,127, 59, 63,250,123, 53,127,246,199,255, 20,143, 46, 55,252,208, 87,127, 35,111,188,241, 58, 39,
- 77, 75, 55, 12,242,115, 80, 50,218,228,120,191,140, 8,104,140, 54, 83, 43, 76,219,182,242, 3,142,162, 2,143,222,179,219,110,
- 37, 89, 41, 38,170,170, 69,105, 45,104,205,130,102, 77, 19,103, 93, 27, 30, 93,174,121,169, 94,178,126,252, 0,227, 47, 33,121,
- 34, 90,226, 93, 39, 95,161,202,207, 80,255,247, 55, 68, 33,248,203,255, 84,249,153, 77,137, 0,123,198, 66,222,107, 36,116,193,
- 73, 50,133, 91,112, 0,237, 76,159,227,136, 77,124,164,177,201, 36, 21, 5,207, 88,222,108,117,221,112,114,178,228,230,205,155,
-220,188,117,147,211,147,211,253,168, 78, 17,105,230,115,176,154,144, 50, 23, 23, 87,120,239, 81,218,148, 55,141,197,153, 4,166,
- 20, 75,173, 65, 89,116, 6,163,227,225, 98,165,167,105, 84,137,200, 60, 58, 24,166,142, 94, 14, 49, 17,167,144, 82, 25,249, 26,
- 84, 93, 19,140, 65,133, 32,254,224, 40, 23,103,149, 19, 49,143,232,152, 72, 41, 48,248,145,190,219,177, 93,175, 56, 89,223, 96,
-113,114,202,124,185,164,105,103,184,198, 21,236, 35, 37,240,226, 0,227, 56,214,183, 28,116,117,106, 15,243,120,122,202,242,140,
-144,113,122,170,178,218,175,206,180, 41,207,150, 42, 62,112, 20, 85,219, 82, 55, 14,109, 34,206, 24, 66, 14, 36,149, 4, 32,211,
-192,160, 35,138,150,148,118,204, 27, 69, 74, 3, 90,105,124, 31, 80,133,246, 22,124,207,208, 7,152, 80,170, 49, 17,119, 3,179,
-179, 37,105, 12,212,117,205,182,219,145, 48,172, 59,207,162,133,166, 81,108,118,107,162, 86,248,100, 25,187,145, 23,111,182,100,
- 21,217, 38,207,118, 23, 24,187,154,116,186,228,175, 62,250,128,157, 50, 36,101, 25,125, 46, 0, 35,241,120, 7,162,224,108,147,
- 70,101,195, 85,138,168, 69,195,106, 24, 56, 67,113, 54, 59,161, 31,118,156,119,129,225,238,134, 68,226, 99,119,102,204,150, 51,
-236, 92, 81,185,150,170,174,160,106, 75,254,132,102,244, 1, 55,120, 6, 55,208, 86,174, 0,137,202,202, 42,235,242,156, 9,164,
- 75, 30,165, 68, 86,137,196,193,169,145,188, 64,138, 66,148, 20, 67,159, 52, 41,155, 61,119,190,109,103,216,166, 69,219,138, 69,
-187,160, 54, 14,109, 20,195,232, 89,143, 43,134,173, 39,238, 32,134,200,214,175, 9,106, 68,133,140,209, 21,219,177,103, 86,207,
-168, 75, 76,234, 48,116, 36,239, 25,131,228,168,251, 49,145, 91, 45,151,227, 90,118,232,153,130,138, 54, 10,107, 91, 84, 10, 24,
-109,136, 49, 97,210,200,216,107,154, 51, 11, 5, 7,236,138,182,100, 54,107,168,117,222,231, 61, 29, 50, 33,166, 73,173,218, 71,
- 50,235,169,193, 43,150, 87,233,216,167,115, 96, 58,229,228,204,217, 95,170,201,232, 28,209, 73,166,115,135, 96, 41,185,196,104,
- 45,142, 64, 56, 38,147, 23,118, 74,217,169, 79, 69,111, 58,211,242, 4,204,201,106,175,166, 87, 40, 82,217,160,161, 20,217, 8,
- 13,210, 29, 93, 60, 2, 98, 43, 83, 17, 48, 35,145,204, 48, 4, 86,187,200,197,118, 96,185,241,220,218, 68,110,220,242, 44,207,
-122, 73,128,155,247,152,102, 64,213, 51,178,157,161,116, 45,211, 28,196,201,161,141,134, 90, 2,118, 48, 21,202,181,152,118,129,
- 91,108, 25,250,142,177, 31,165,176, 39, 17, 98, 82, 44,191,135, 11, 72,129,246, 76, 49,215,249, 40,122,245,120,108, 62,117,134,
- 57,202,156, 94,171, 99,213,224, 20,161, 46, 89,191, 89,171, 3,198,245, 72,153,174,148,168, 49,109, 73,221,145,131,104,234,184,
-133,229,173,114, 46, 89,184, 19,204, 38,239,133, 98, 2, 54, 17, 48, 1, 89, 0, 41, 82,255,211,135, 28,174, 7, 36, 96, 46,254,
-226,151, 62,246, 50, 95,123,253, 45,182,155, 21, 97,232, 89, 46,102, 60,255,252,115,178,251, 81, 80, 53, 45,139, 89,203,114,214,
- 18,186, 53, 94, 69,118,157,103,209,182,156, 45, 90,102,149,103,237, 35, 23,157,167,215, 53,151, 81,177,125,114,129, 25, 34,155,
-221,142,245,110,135, 54,134,147,147, 5, 99,236, 80, 57, 9, 82,246,236,148, 11,127, 69,138,129,147,211, 27,204,231, 75,252,144,
-248,230,183,222,230,235,223,122,135,183,238, 62,224, 31,250,159,254, 46,126,207,239,249,199,248, 47,254,179, 63,194, 95,248,137,
- 63,197,247,127,249,215,161, 93,195, 55, 94,255,101, 86,155,181,144,143, 14,219, 7,241,115,154, 18,107, 88,194, 12, 8, 1,148,
- 98,187,221, 80, 91,139,247, 35, 77, 93,149,220,231, 26,107,221,254,245,152,118,114,125,223,147,209,140,163, 8, 46, 98, 82,120,
-239,121,225,198,146,135,239,189, 95, 70, 77,154,156,197, 90, 51, 5, 35,236,237, 86,211,115,241, 17,241, 62, 31,218,137, 31, 95,
- 4,246,184,198, 67,142, 77,254,176, 63,159,159, 30, 49,231, 67,214, 64,150, 8,211,202, 57,150,203, 5,183,110,223,226,214,237,
-219, 18, 20,226, 36,123, 93,229, 64, 61,246,146, 47, 80,128, 50, 93, 55, 20,165,124,192,165,233, 64, 40, 76,102,109,200,218,138,
-127, 87,167,103,216,213,170,136, 6,143, 93, 0,215,148,253,147, 34, 57,165,107,186,136,105,100, 40, 35, 82,179, 23,224, 9,104,
- 35,226,125,143,207, 81,130, 38,118, 27,118,155, 53,179,229,146,197,242,132,147,211, 51,102,203, 19,154,217, 28, 87, 89,140, 21,
-156,164,177,178,115, 60,222,249,127,104,110,146,250,149, 44, 73,142,131, 54,212,145,241, 96,207,241,147, 14,197, 90,102,179,134,
- 60,136, 29,106,175, 30,182,153, 33, 38,114,200,104,101, 56, 89, 24, 70, 31, 72, 89,179,235, 19,139, 90,227,195, 64,163, 28, 41,
- 5,156,149,216, 96,157,179,232, 90, 42,135, 79, 50, 61, 50,218,240,228,209, 10,109,160,105, 28,227, 40, 29,110,215, 5,148,173,
-193, 36,170,182,101,183,221,176, 38, 50,218, 10,218,138,111,127,240, 16,143, 92, 46,198,144,168, 49, 40,149, 24, 21, 4, 45,126,
-115, 21,193,230,204, 92,139,175,250,211,191,238,123,121,255,157,119,184,247,214,187, 68,155,104,201,120, 5,187, 81,241,222,251,
- 59,140, 31,185,121,219,211, 38, 69,110, 37, 82,213, 90,183,119,163,132, 16, 25,134, 17,103, 45, 67,235, 69, 0, 25, 19, 46, 79,
- 26, 16,233,144,149, 78,232, 92, 4,126,229,208, 77, 49,146, 66, 20,198,187, 22, 65,155,117, 13,224,208, 78, 49, 63,169,168, 93,
-195,169,157, 17, 43, 67,111, 96,213,111,232, 55, 91, 46,159, 92,176, 90,173,232, 66, 15,212,216,188, 64,105, 67, 84, 61,218, 4,
-226, 24,105, 76, 77,183, 91,113,165, 53,205,108,198, 98,113,194, 24, 2,219, 97, 96,232, 3,193, 11,120, 69,246,175, 81,224, 56,
- 89,206,235, 24, 2,202,137, 69, 45, 5,143,115,146,145, 96, 84,161, 7,106, 37, 57,222,229,105,177,214,130, 3,171,210,222,159,
- 30,179,218,139,156,211,209, 26, 77,115,189, 59,159,108,169,162,150, 87, 71,116,200,184, 95,171,198,114,113,182, 9, 82,113,179,
- 40, 83,166,117, 70, 48,194, 57,150, 80,168,152, 80,113, 66, 77, 79,168,109,217, 63, 79,157,251,164,217,202,165, 94,229,105,186,
-144,179,104, 7,204, 65, 59,147,141,172,139, 53,130,242, 86, 5,148,149,146, 34,229,178, 90, 49,134,164, 12, 67,140,116,222, 51,
-248, 53,195, 32, 32,164, 97, 56,225,116,244,180,227, 64, 53,247,216,214,163,235,128,114, 51,180,107, 5, 55,173, 53,218,213, 36,
- 99,200, 70,166, 64,214,141,152,122,129,155,117,132,177, 39,140, 30, 63,122,162, 47, 19,110,226,225,236,217,159, 71,165,185,152,
-158,179,252, 17,209,171,251,131, 43,179, 15, 82,121, 90, 69,168,181, 42,129, 21,215,247,220, 41,149, 31,238,180, 35, 85, 28,141,
- 87, 36,221, 76,165, 52, 1, 19,247,168,193,116,244, 98, 79, 36,185,201,103,120,252,131,201, 41, 31, 21,119,174,137, 35,166,180,
-179,148, 18,247,239,221,163,105, 22, 52,117,197, 11,207, 63,135, 41,171, 5,149, 51, 85, 85,115,114,178,192,170,140,223, 73, 39,
-101,180, 56, 0,110, 46,231,220, 92,244,208, 43, 30, 93,156,147,236,140, 43, 31,153,205, 91,114,132, 85,239,247,211,132,172,149,
- 76,171,147, 98, 59,140,220,187,255, 8,223, 13,188,242,242, 43,204, 79,207,176,166,162,117, 13,177,223, 17,147,231,155,127,229,
-231,248,143, 47, 30,243,233,207,127,142,223,245,187,127, 23,191,241,111,253, 13,252,203,255,210,255,134, 47,127,225,211,124,241,
-203,223,195,207,253,220,207,241,205, 55,222,160,235,251,210,217, 38,148,145, 55,129,143,145,148,227,254,114, 53,120, 79, 63,244,
- 88, 51, 35,248, 17,133,162,105, 26,102,243, 57, 73, 73,208,136, 42,158,237,132,198, 71, 97, 72,247,195, 64, 46,225, 36, 67,183,
- 35, 47, 43,194,216, 9,176,225, 87,185,175,253,213,236,117,243,190,170, 31, 9, 31,243, 95,123,182, 60, 37,183,181,179, 25,139,
-147, 19,150, 55,111, 80,207, 90,180,171,229,176,200, 17, 59, 86,228,156,241,253, 64, 28, 70,174, 46, 87,248, 84,102, 11, 73,198,
-226,186,140,177,116, 73,119,155,118,127,199,197,153, 3,180,247,187,106, 4,142,187,247,227, 66, 43, 54, 56,137,180,220, 23,245,
-201, 78, 7,228, 28, 72, 62, 49, 70, 79,240, 61,187,221,154,245,213, 37,235,171, 11, 78, 78,110,176, 56, 57, 99,182, 88,148,136,
-217,154,228,100, 55,167,203,190, 93,235,167, 51, 22,242,209,175,211,119,121, 5,255, 26,145,175,197,174, 84,185, 10, 31,252,126,
-106, 55, 36,136, 30,156, 53, 16, 35,173,181,108,122,143,211,137,121, 91, 49,164,145, 33,106,176,146,215, 93,149, 78, 93,108,111,
- 25, 31, 19,149, 51, 44,230, 51, 82,140,180,173,208, 15,119,219,142,190, 31,184,117, 86,239,215, 23, 40, 73,179, 90,239, 6,110,
- 61,127,194,147,245, 14,188, 34,181,115, 46, 66,226, 98,117,197, 16, 19,119,102,138, 71, 93,166, 82,153, 23, 80,156,213,115,222,
-246, 91, 46,117, 70,231, 26,157, 60, 21,129, 19, 21, 24, 52,252,244, 95,248, 25, 82,202, 60,103, 52, 39,181, 98,211,121, 26,103,
- 33,100,198, 49,241,240,145, 39,171, 29, 39,165,161, 80,204,246,190,102,107,229,184,140, 49, 50,122, 89, 41,140, 62, 18, 82,150,
-236, 70, 99,209,206,237,121, 9, 74, 91, 1,106,133, 8,190,120,141,147, 76, 19,180,113,212,205,140,197, 9, 66,122, 43,195, 49,
-173, 45,235,208,179,186,127,193,253,187,239,115,241,232, 17,195, 48,146,219, 22,123,227, 6,243,122,193,188,189, 65,174, 79, 36,
-112, 36,142, 48,118, 50,178,183,150,238,201, 3, 54,126,203,102,220,242,228,241, 21,214,212,232,236, 72, 3,248,161,120,157, 19,
-248,209,179,108, 91,252,174, 39, 37, 7, 74,149, 56, 89, 71, 12,158,153,209,164,224,101, 95,157, 68,244,105,149,134, 36, 35, 94,
- 89,233, 29,240,181,153,169, 75, 62,226,149, 76,194, 52,109,175, 37, 2,230,156,247, 22, 62,209,204,168,131, 94,170, 20,226, 24,
- 19, 33, 39,188,162,164,221,129,201, 69,225, 95,138,170,193,144,178,196, 39,167,156, 24, 66,192,143,177,184,169, 38, 71, 75,177,
- 75,239, 93, 93,229,215, 19,119, 62,139, 53,179,114,150, 38, 59, 26,101, 81, 41,151,136, 97, 83,104,129, 19,233,178,184,234,203,
-223,143,182,226,166, 65,166,130,219,126, 68, 93,110, 37, 79, 35, 68, 78,188,167, 29, 3,205, 24,168,102, 1,219, 72, 70,132,113,
- 53,202, 58,201, 22,208,166,216,225, 28, 90, 7,156,245,216,102, 70, 10, 35, 49, 68,252, 56,136, 78,194,143, 18, 62,149,226,181,
-115, 40, 37, 41,248,228,131,115,199, 62, 21,194,120,237,237, 46, 69,247,250, 49,176,247, 17, 38, 80, 33,161, 84, 68, 27,201,230,
- 85, 33,236,199, 21,250, 40,131,125,130,212,164, 36,220,244, 24, 34, 62,200, 27, 99,244,161, 28,164,229, 34,176, 39,255,112, 77,
-141,156,179,122, 74,237,206,209,110,253,240, 85,159,221,184,197,207,255,252, 47,160,141,230,254,195, 15,152,205,106,218,166, 46,
-201,110, 98,223, 73,133, 3,157,115, 44,168,214,200,108,230, 80,118,198, 48, 70, 94,184,117,202,227,111, 63, 68,155,154, 77, 31,
-113,243, 51,230, 55,158, 35,165, 72, 55, 6,250,221, 21,214,104,182,235,149,216, 84,202, 8,233,209,249, 99, 94,121,238, 37,110,
-223, 60,163,153, 47,177,182,161,173, 90,154,153, 37,197,192,122,181, 99,251,228, 17, 63,251, 19,119,185,255,222,183,249,125,255,
-250,191,204,191,245,111,253,126,254,217,127,250,159,228,214,173, 91,252, 61,191,229,183,240,155,126,211,111,226,199,127,252,199,
-121,243,205, 55,247, 74,200, 49,196,235, 86, 49, 5, 87,155, 21, 85,137,243,155, 53, 45,198, 57,225, 4, 27, 91, 4,131, 25, 99,
- 69,212,215,143,158,156,161,235,123,114, 86, 2,120,208,134, 28, 61, 15, 31,188, 43,196,168, 41, 16,225,187, 22,132,191,177,189,
-250,245, 68, 49,117,212,169, 31,235, 40,212,119,217, 11,151, 34,155, 51,218, 24,234, 89, 67,179,156,227,218, 86, 66, 23,148, 65,
-101,129,130, 80,138,122,246, 1,167, 12,157, 31,229, 98, 84,172, 84, 94,121, 40, 81,171,101,109,118, 36,136,203, 79, 77, 23, 14,
-194,191,227,103,242,248, 57,124, 90,104,167,202,254, 95, 46, 14, 98,137,218,191, 9,247,191,239,112, 0,166, 16,137,190,199,119,
- 35,221,106,195,250,201, 21,179,197,130,249,201,137, 76,125, 78, 79,139, 13, 78,114,218,173,227, 40,179,185,176,116,212, 36,110,
-213, 60,171,253,253,149, 43, 29,149,130,152,161,110,103, 92, 93, 93,225,172, 67,105,143, 70, 44, 84, 85,173, 9, 62,208,182,142,
-203,208,211,154,204,114, 86,243,120,227, 89,247,137,100, 0,167, 80, 90,144,190, 26, 75, 24, 70, 92, 93,179, 88, 44, 8,222, 83,
-233, 74, 56, 16, 93,207,229,213,150,229,204, 48,111, 27,182,235, 45,203,121,205,229, 85, 15, 70,225,172, 69,101,195,218, 39,220,
-252,132,135,187,129,123,235, 14,231, 52, 55,158,107,184,217, 52,188,247,238, 37,131, 79,204, 73,188, 52, 38,186, 12,107,149, 73,
- 42, 16,108, 38, 69, 56, 33, 81,107,135, 31, 51,157, 50,204,106,197,103, 62,253, 2,231,151,151,188,255,254, 90,136,117,217,176,
-233, 35,230,201,136,182, 91, 42,163, 49,229,113,109,148,172, 12,141, 58, 8, 44, 67, 82,132,172, 73,130,252, 2, 91,161, 93, 37,
-137, 92, 58, 73,222,183, 18, 55, 81, 28, 61,201,199,178,221, 40,192,148, 8,218, 56,134, 81, 44,169,227,224,185,188,186,228,253,
-251,239,242,240,209, 67, 84,138, 52,202, 49,111, 78, 89,204,159,103, 55, 58,250,177,198, 53, 75,186, 92, 51,238, 50,173,170,201,
-235,192, 75, 47, 62,135,214,153, 56,247, 52,106,137,242,107,226,213, 57,221,122,141, 74,154, 52,102, 86, 87, 91, 66,144,177,125,
- 28, 3,237, 89, 67, 30,227,158,205,157,179,160,128,115, 12, 40,149, 48,101, 7,110,140,197,106, 43,228, 52, 13,202, 30, 24,234,
- 50, 17,151, 14, 59, 78,163,224, 82, 40,100,125,165,203,132,167,236,177,245,225,253, 65,209, 27, 8,184,167, 4,149,164, 36,110,
-148, 16,133,146, 86,186,120,227,172,228,108, 56,183,167, 84,230,172, 8, 81, 52, 29,253,152,216,237, 70,186, 97,144,100,179, 16,
- 36,252,164,124,222,169, 67, 79, 81,138,125, 46,161, 68, 6, 69,219, 52, 44,102, 50, 14,175,178, 43,121,232, 69, 35,102,109, 97,
- 42, 36,116, 10,160, 98, 1, 91,153,194,194,144, 52, 62,107, 12,202, 72, 8,217,118, 27,136,113,197, 56,142, 44,251,129,249, 48,
- 72,215, 62,235,209, 51,143,173, 91,140,107,196,223,174, 43,178,178, 96,181, 76,192, 77,144,169,172,243,178,122, 16,152, 12,209,
-143,164, 48, 8,133, 49, 6, 41,238, 69, 47,161, 52,168,164, 32,137, 51,197, 30,119,230,199,163,246,143,220,199,229,137,252, 19,
- 80, 37, 86,114,242,180,135, 32,201, 63,206, 89,162,181, 4, 31,177, 78,132, 23,178,183, 63, 40, 21,253, 24, 15,242,125,142,247,
-226,234, 90,222,250, 94,233,151,143, 40, 96,234,169,168,215,163, 3,172,235, 6,222,124,235,109, 82, 78, 60,122,244,128, 91,183,
-207, 4, 84, 80,254,172,210,162,214, 84,198,162,178,194, 84, 51,130,170, 88, 13,154,176, 81, 52, 77, 77, 82,137,155, 39,115,238,
- 95,108,152,235, 26,223,175,185,122,108,216,245, 35, 57,244,168,148, 8,253, 8, 68, 14, 36,250,140,211,154, 69,237, 80,113,160,
-223, 38,124,184, 98,104,102,216,249,140,170,157,115,187,158,177,189,188,164, 34, 48, 94, 62,226,143,254,161, 63,200, 63,251,191,
-248,231,248,145, 31,249, 17,254,195,255,240, 63,224, 63,255,207,255,115,190,252,165, 47,241,187,254,209,223,197,227, 71,143,248,
-201,159,252, 73,190,241,198, 27,244,125, 15, 74, 4, 42,192,222,199, 62,159, 47, 72, 41, 51,134,136,241, 65,246,206,214, 81, 87,
- 45,193, 11,215, 89,107,232,118, 61,125, 8,152,170,193, 26, 71, 72, 35,206, 24, 20, 35,195,176, 66,169, 80,212,158,166,220,214,
-210, 65,113,174,142, 46, 82, 71,201, 94, 31,230, 67, 63,216, 73,174, 63, 43,211, 14, 56, 95,139,104, 60,248,181, 14,201,123,135,
- 34,249,116,180,232, 52, 6,223,199,152, 66, 73,113,146,248, 75,237,138,141,132, 44,135,175, 15,212,139,158, 56,140, 0, 84,190,
-103,244,137, 49,100,250, 81, 18,239,134,126,160,202,194,101,215,197,130, 50,125,191,215, 32, 52, 71,251,170, 61, 50, 55,198,253,
-200,235, 35,173,127, 41, 99,157,222,243,193,167,116,183,253,231, 79,186, 76,167, 18, 49,196,253, 63,253,232, 25,187,142,245,234,
-130,234, 73,195,226,228,140,197,217, 77, 41,238,203, 19,102,139, 57,174,113, 84,149,236, 90,173,211,104, 43,168, 81,101, 52, 89,
-165, 67, 23,116,228, 92, 57, 22,219,165,148,159, 18,222,237, 61, 70,251, 29,103, 76, 71,121, 13,197, 50, 67, 22,170,155, 15, 1,
-104, 72, 33, 83,181, 26,171, 13, 49, 25, 66,206, 12, 62,113,179,109,232,199, 43,102,243,134,174,135, 28, 21,203,153,116, 32, 57,
- 68, 84,237,128,204,110,187, 67,161, 56, 93,182,108,183, 27, 50,154,222,203,148,207,123, 56,187, 49,231,242,209,154,230,206, 41,
-111,172, 59,222, 63,223,241,210,201, 28,157, 71,110,220, 60,195,205,231,220,190,239,249, 78, 90,115, 47, 69,110,229,145, 87,219,
- 26,223,117,244,217, 19, 48,204,149,226, 76,195, 16,162, 48, 6,178,231,181,215, 94,225,147,159,125,133, 87,195, 72, 91,125,155,
-247,222,126, 76,165,106, 82, 28,232,134,200,176, 25,217, 85,235,162,136, 54, 88, 83, 9, 34,181,232, 15,148,113,132,108, 64, 59,
-208, 21,198,181,216,170,193,184, 10, 91, 57,140,137,228, 33,136, 16,177,144, 46,115, 20, 1, 81, 78,153, 48,122,134,110, 96,189,
-217,176, 90,173, 88,173,175,120,242,232, 49,247,238,221, 37,196, 30,229, 12, 89, 85,108, 83,205,147,171,204,213,147,199,188,115,
-190,225,114, 59,176, 13,145, 45,137,117,231,105,173,225,249,217,156,155,139,150,197,188,225, 51,159,124,133,231, 78, 91, 22,218,
- 50,179, 75, 66,216, 49,140, 59,186,174,151, 20,199, 40,232,111,171, 12,109, 85,211,179,195, 85, 21, 33, 21, 75,103, 18,244,111,
-244, 35,186, 88,230,166,240,166, 76, 70, 89,249, 25,251,148,241, 26, 97,241, 39,137, 81, 22, 48, 78,249,125,170,172, 81, 11, 98,
- 72, 29,233, 84, 4, 42, 35, 35,111,117, 52, 93,157,124,216, 99, 8, 37,143, 65,114,211,181,145,149, 91,211,212, 52, 89, 83, 99,
-200,133, 7,143,130, 68,148,236,244,172,217, 13,137,221,110,160, 31, 6,250, 16, 8, 83, 65,223,219,190,138,149,186,236,217,157,
-145, 73,102,229,236, 53,162,103, 85, 85,184,166, 46, 48,164,140,114, 9,180,223, 35,204,125,204,104,155,209, 81, 86,201,186, 92,
- 58,140, 53, 40, 45,169,193,221,118, 20, 70,197, 48,226,135,129,166,239,169, 66,160,106, 6,108, 61, 67, 59,143,170,102,100, 91,
-147, 85, 89,241, 24, 39, 23,243,108, 73, 41,162,117, 36,235,145,108, 44, 42,200,170, 48,143, 61,113, 28,136, 57, 20,225,121, 32,
- 7,225, 56, 20,161,220,245, 78,253,248,160,253,107, 89, 97, 38, 5,102, 8, 1,239, 61, 85,101,241, 94, 24,233,163,181,184,146,
-161,124, 8, 34, 18,123, 74,138,169, 92, 2, 34, 33,197, 50,238, 83,135,126,237, 41, 98,220,164,198, 86,170,196, 16, 78,234,229,
-233,215, 71, 92,162,110, 24, 75,214,117,162,170, 28,109,219,162,114,198,106, 73, 29, 83, 70,203, 15, 58, 43,208, 53,217,106, 76,
-115,155,155, 55,111,179,139,145, 55, 63,248,128,139,203, 75,249,124,202,210,184,134,231,207,110,179, 75, 22, 63, 6,102, 39, 39,
-108,214,163, 28, 78, 71,175, 71,107, 53, 39,117,197,139,183, 79,217,245, 27, 54,195,200,166,243,116,157,199,163,184,113,227, 22,
-183,111,156,113,231,198, 25, 90, 53, 52,181,227,234,193, 3,254,211,255,228, 63,225, 71,127,228, 71,248, 47,255,248, 31,167,239,
-122,222,250,214,155,188,247,206,187,124,254,243,159,231, 71,127,244, 71,121,253,245, 55,248,147, 63,246, 99,124,251,157,239,112,
-180,145, 38,197,200,106,181, 66,151,177, 96,101, 29,221,208, 11,155, 60, 69,118,187, 29, 85, 85,203,110, 41,139, 53,206, 90,135,
-143,114, 33,170,172,197,230,129, 20,123,108, 46, 86,182,130,101,253, 27, 29,191,127, 24, 67,224,233, 2,125,205,249,157,143,255,
-169,190, 75, 19,153, 15, 11,249,148, 80, 41,147,163, 92, 16,166, 0, 9,165, 53,202, 85,232,166,197,206, 22, 84,222,131,214, 84,
-190, 21, 86,188,143,116,131,103,179, 27,232,123,143,239, 18, 49,120, 76, 93,149,219,255,244, 20,166,189,240, 39, 39,245,140, 64,
-238,250, 56,253, 89, 92,242,244, 21, 79,120,225,125,104,210,228, 95, 85,194, 26,139, 65,216,243, 70,203, 24,214, 16, 11,137, 45,
-224, 7,216,110,215,172,214, 87, 52,231, 79, 88,158,156,113,114,122,131,211,179, 51,218,147, 37,139,197, 66, 2, 55, 42,131,118,
- 66, 54,211,133,143, 45,127, 95,122,230,162,117, 72, 80, 84, 71, 26,152,195, 26, 75, 23,173, 93, 74,224,251,145,126, 16,232,137,
- 37, 99,172,145, 53,134, 14,196,172,240, 94,172,102,179, 89,133, 31,165, 35,210, 40, 17, 82,229,120,184,140,165,204,205,179,133,
-168,229,179,168,135,155,155, 53,171,213,154,161, 79,220,186,189, 20,203,155,145, 96,164,109, 63,224, 19, 44, 79, 22,172,183, 91,
-102,139, 57, 79,186,192, 59, 79,214,212,214,178,219,246,156, 46, 27,118, 99,224,172, 85,124,230,249,231,120,231,189, 13, 23, 38,
-243,110, 74,188, 28, 2,175, 25, 67,149, 44,137,138,160, 51,219, 60,114, 63,121, 46,115,228,244,198,156,239,253,254,239,225,108,
-233, 72,227,192,175,253, 82,205,246,201, 95,102,117, 53,150,187,152, 98,236, 37, 87, 32,132,145, 24, 71, 82,240,164, 88,145,167,
-214, 93, 75, 10, 29,198,161, 77,133,182, 21,166, 48, 19, 92, 93,163,141, 23, 57,233, 96,241,122, 26,224,107,177,136,141,158, 56,
-140,116,219, 45, 87,151,151, 92, 92, 92,240,248,241, 67, 86,151,231, 98,199,139, 53,219, 46,115,239,188,231,114, 28,185,223, 95,
-242, 15,254, 51,191,151, 63,250,135,254, 35,186, 16, 81, 65,168,159, 89,193, 42, 6,214,187, 13,183, 98,135,122, 48,242,203,111,
-190,195,243, 39, 51, 94,125,225, 22, 47,223,156,115, 82,213,228,228, 57,127,114, 65,223,201,243,168,178,198, 25, 57,159,115, 74,
- 50,102,182, 72,115,160, 53, 57, 13, 4,223,163,103, 11, 81,149,187,226,129,119,142, 49, 37,162, 82,172,251,129, 33, 71, 9, 98,
-205, 2,133,153, 40,103,249,154, 79,253,144,214,104, 38, 94,126, 89, 33, 26,163, 75, 14,131,224,200,199,224,241, 62,210, 23, 23,
-143, 15, 18,108,101,140,166,105,148, 20, 54,155, 36,222, 28, 45,244, 60, 20,218,102,148, 13, 68, 60, 62,101,186, 49,176,238, 6,
- 58, 47,228,181,156, 15,141,225, 36,232,155,118,255,141,181,180, 77,216, 83, 35,235,186, 97, 54,107,152,207, 91,234, 89,139,173,
- 44, 33,101,172,143,194, 32, 16,244, 35, 49, 33,252,130, 50,194,183,197,154,102,157,161,178, 10, 91, 98,137, 99,200,108, 55, 35,
-227,152,104,135, 72, 51, 38,102,243,145,122, 54, 98,155, 1, 21, 70,116,189, 64,185, 90, 10,122, 89, 71,100,244, 62,216, 76, 68,
-232,186, 36, 62, 76, 81,216,153, 28,124, 33,205,245,228, 16,101, 2, 19, 2,230,214,114,246,175, 31,118,229, 92,203, 42,207, 74,
-237,111,238,146,135,171,246, 64,144, 3,225,109, 26,149,199,253, 8, 69, 4, 74,197, 48, 31, 11, 49,174,252,133, 33,148, 75, 64,
- 16,224,199, 30, 13,155,143,243,220, 14,249,184,123,112, 96,137,221, 99,207, 23, 47, 29,144,210,251, 28, 89, 83,178,138, 49,114,
-187,115,206,238, 25,185,166, 16,202, 82,201, 58,142,202,160,116, 67, 51,187, 65,204, 53, 15,207,183,220,125,116,129, 87, 21,203,
- 27, 47,130, 59, 1,179,224,244,236,121,154,246,132,171,237, 14, 91, 57,214,235,115,172,133, 56,121, 65,203,193,120,214, 84,204,
- 13,204,156,102,117,117,206,229,250,146,243,203, 11,250,110, 75,238,119,248,237,138,251, 15,222, 39, 19, 89,158,158,178, 88,158,
-114,235,230,115, 60,122,124,206,157, 23,238,176, 92, 44,249,249,191,252,151, 81, 74, 81,213, 53,247,238,223,227,245,111,190,206,
-103, 63,253, 25,126,219,111,253,251,185,115,251, 54,231, 79,158,176, 94,175,247,215,152, 73,109,150, 82,162,170,228, 86, 57,107,
- 91,172,177,184,202, 73,178,145,147,241,145, 46,224,136,126, 28,247, 66, 13,194, 6,252, 5, 86, 5, 84,158, 84,153, 9,133, 40,
- 98,213, 33,142,239,153,145,244, 49, 39,224, 90,228,226, 81, 75,255, 97, 86,177, 67,225, 87,197, 99, 89,118, 91,199,140,232,163,
- 63,167,143, 50,206, 81, 96, 20,204,234,134, 91,103,103,220,186,117,139,118, 62, 71, 91, 39, 74, 82,142, 98, 97, 11,177, 80, 84,
-166, 66,138,170,234, 26, 87,201,135,209,134, 28,101, 31, 55,198, 40,163,249,148,158, 25,177,167,116, 88, 5, 77, 29,250,212,209,
-164,167,149,240,240,148,215, 93,145,149,190,254,253, 79,136, 95,107, 49,206, 96,156,198, 90,208, 58,210,180,154,147,147, 10,133,
- 4,243,132,152,196,254, 52, 14,116,219, 53,221,118, 67,183, 89,211,119, 91,250,126, 32,120,177, 71,165, 16,137, 49, 31,222,115,
-123,144,211,177,214,133,167, 46, 36,211,247,199,181,223,171, 82, 38, 36,136, 81, 49,172, 47,249,169,255,230,143,179,189,255, 62,
-202, 7, 66,200,248,148,152, 47,140,236, 37,149,101,232, 3,183, 78, 27, 44, 9,101, 29, 23, 23, 61,139,121,141, 82,162,240,175,
-234, 10,163, 27,186, 62, 16,131, 47,120,223,136,211,134,190, 31, 57, 57, 89,176,235, 6,148,242, 40,163, 72, 89,179,222,142,184,
-170,194, 56, 45,158,107,219,240,173,199, 43, 60, 48, 87, 6,171, 20,231, 67,143,173, 45,117,202,156,157,148, 53, 83,159,232,124,
-192,231, 76, 54,134, 78,193,144, 35,171, 20,184,159, 19, 79, 72,184,218,242,119,125,245,251,248,129,207,127, 22, 21, 18, 70,107,
- 28, 25, 66,224,205,187,143, 48, 90, 81, 27, 88, 84, 10, 87,101,154,214, 81, 85,117, 17,181, 57,156,171,229,223,171, 6, 91,207,
-153, 47,150,204, 78,150,204, 79,150,212,243,150,122,214, 96,234, 10, 76, 73, 30,143, 1,252, 8,222, 75, 39, 21, 2,190, 27, 24,
-182, 27,214,107,249,216,172, 87,108,174, 46, 25,187, 13, 67, 31,120,180,169,249,250,253,129,175,175, 18,119,189,225, 73, 82,188,
-243,232,156, 71, 23, 23,164,156,113, 25,110,161, 88,238, 89, 11,137,207, 63,127,198,103,150,115,218, 16, 25,188,231,151, 31, 92,
-240,164, 27, 72,202, 48,115, 13,219,135, 87,116, 93,194, 90,205,172, 53, 60,127,251, 38,179,102,198,118,187,195,213, 21,218, 56,
-124,212, 44, 22, 75,226,216, 97,194,142,198, 89,214,157,199,204, 78,105,150, 39,248,152,232,252, 72,172, 42,122, 96,136,194,237,
- 15, 73, 70,224,195, 24, 25,188, 32,146, 67,148,238, 61,164, 44,103,254, 52,254, 46,105,108, 62,202, 10,214,135,136,247,242, 53,
-247, 62,178, 27, 60, 93,239,217, 13,129,110,240, 12, 99,113,142, 40,141, 49, 66,217,108,154,134,186,174,169, 42, 87, 86, 67,154,
-152,193,199,204, 88, 58,253,193, 71,250, 16, 9, 49,239,189,220,185,100,193,103, 14,148, 74,103,141,136,166,231, 45,167,203,150,
-147, 69,203, 98, 62,219,235, 88, 92, 93,236,129,147,198, 44, 22,180,116,136,101,162,144,174,137, 99,173, 81,184, 2,204,169, 92,
-133,214,150,156, 53, 33, 36,161,224, 13,125, 1, 17,133, 50, 1,140,101,242, 25,143, 98,201,203,244,185,156, 29,135, 96,217,130,
-207, 45,138,180, 73,252, 27,199, 81,162,159,251,129,161, 31,158, 18,202,229,103,188,249, 18, 41, 56,117, 86,249, 89,252,244, 36,
-121,203,229, 69,141, 73,198, 38,222, 39,140, 14, 50,146, 40, 28,228,227, 12,235, 84,240,132,185, 32, 6,213,116,248, 21,170, 16,
-133,198,163,212,193, 5, 53,165,134,113,124,224,151,170,170,143, 9, 96,165,163, 19,203,196,129, 99,175,180,248,188, 99, 86, 52,
-205, 9, 89,183,188,241,214,187, 92, 60,185,162,105, 90, 94,253,244, 23,152, 47,207,168,155, 5, 15, 31,159,243,232,254, 3,134,
- 48,178,122,252, 24,159, 70,206,110,157,178,219, 40, 6, 63,200, 69, 68, 29, 46, 33,163, 15,172,125,230,219, 31,220,165, 27, 2,
- 67,206,248, 44,183,254, 6,152, 23,114,210, 7,119,223,101,215,109,249, 53, 95,252, 94, 62,255,185, 95, 67, 55,246,252,223,254,
-207,255, 9, 63,250, 79,252,147,252, 71,127,232, 15,129,214,108,135, 30, 3, 92, 93, 92,240,147,127,246,207,242, 11, 63,255,243,
-252,186,239,251,117,252,115,191,247,127,206, 95,252,217,159,229, 79,255,217, 63,195,213,234,138, 12,146,233,157, 97,187,221,114,
-178, 88, 22,124,162, 7, 52,195,216,147, 21, 56,215, 18, 17,225,157,120, 90, 19,181, 81,196,209, 23, 75,147,154, 20, 20,251,199,
-125, 18, 56,230, 15,149, 82,169, 15,129, 57,124, 8,128,244, 67,186,216,227,124,229,253, 15,247,195,219,253,189,226,120,162, 67,
-229, 41, 14,162, 92, 4,130,247,248,113,192,120, 41, 0,134,170, 64,106, 74, 96, 74, 93,161,212, 66,114,138, 71, 47,111,128,144,
-168,125,192,185, 10,103, 52,171,245,154,180,237,100,202,209,203,104,213, 88,119, 8, 90, 57, 42,234, 19,198,248,248, 35,166,124,
-173, 88, 62,221,169, 79,185,238,234,233,203,143,210, 96, 42,172,138, 24, 34,235, 97,195,147, 71,247,248,228, 39, 95,193,213, 30,
-255,248, 10,163, 90,177,100,197, 68,138,153,174,219, 48,244, 91,186,221,138,250,234,130,171,203, 83, 78, 79,207, 88, 44,207,152,
- 45,230, 52,179,133,240, 9,106, 89, 73, 76,128, 18,173,203,100,107,186, 96,233,227, 11, 23,251,213,155, 42,110,150,168, 12, 41,
- 4,186,205, 6, 83,108,111, 83, 87,162, 13,140, 49, 74, 54,119,153, 48,204, 26, 67, 40,135,146, 86,242,223,107,101,112, 78,112,
-159, 87,125,192, 42,197,144, 18,166, 22, 10, 88,215,111,105, 42, 91,176,168,129,186,118,116,125,130, 44,129, 39,182,105,184,247,
-100,195,233, 89,195, 7, 23,107,250,152,152, 25,168, 83, 68, 59, 73,186,235,214, 43,162,134,106,105,249,225, 47,126, 10,211,156,
-113,190,217,241,228,242,130,135,231,231, 60, 90,173, 9,253,192,166,247,116, 49, 51, 51,138,223,244,189, 95,224,135,191,252, 61,
- 56,239, 75,164,111, 2,149,185,115,235,148,121, 45,137,124,117, 5,174,209,100,147, 14, 36, 48,227, 4, 50,100, 43,172,173,209,
- 86,198,241,202, 58,180,173, 80,211,135, 41, 69,192, 54,228, 28, 80, 69,235, 66,229, 72,157, 34, 42, 8, 57, 16,252, 64, 24, 7,
-188, 31, 25,199,145,222,123,118, 30,222,189,204,252,194,197,150,203, 1, 78,116,195,205,106,206,187,253,138, 55,191,243,237, 66,
- 65,180, 52, 57,240,105,167,153,187,138,183, 6,207,121,204,124,241,213, 87,249,245,175,188,192,155,223,120,139,175,191,251, 62,
-189,202,124,176, 89,115, 53,142,216,143,127,140,113, 43,150, 59, 99, 53, 57, 65,211, 72,192,142,177,166,140,151,165, 17, 8,193,
- 51,175, 29,201, 79, 19,190, 34,104, 78,197,206,156,181, 76, 50,162,184, 6,136,226,148, 26, 99, 96, 44, 1, 71,114,113, 53,251,
-216, 84,165, 64, 79, 28,146, 20,247,186,157,137, 82, 42, 19, 60,133,143, 25, 31,202,135,207,210,169, 23,145, 71,140,144,145,194,
-238,170,154,170,174,105, 42,121,191, 91, 23, 72, 72,247,236,189,103, 24, 2,253,232,233,203,170, 55,149,166,161,120,217,138,195,
-202,236,171,215, 52, 77,216,227,101, 53, 5, 18, 83, 26, 70, 37,175,131,210, 2, 55,154,104, 53,186,156, 75,169,228, 80,168,156,
- 10,136, 73,154, 15,201, 10, 80,228,108, 25, 75, 40,204, 56, 14,244,187,158,221,118,199,124,177,163, 93,118,212,203, 1, 59,155,
-163,219, 30,237, 26,172,109,208,186, 65, 41, 73,252,147,245,157,229, 8,205, 86, 38, 36, 73, 46, 7,209,147, 67, 32, 12, 25, 63,
-246,216,107,138,228, 9,205, 57, 37,193,112, 72, 72, 83,135,150,237,240,235,163,163,107, 58,208, 99, 46,210,255,148,136, 58, 19,
-146,220,134,149,214,215,212,213,249,248, 48,207,249, 32,160,152,178,211, 17, 16,129, 82, 74,210,161,142, 58,157,103,186,159,167,
- 72, 91, 83,225, 80,121,130, 32,136,178, 79,105, 67, 72, 10, 91, 47, 9,121,198, 27,111,188, 75, 86,142, 87, 62,253, 25,154,182,
-165,170,150, 84, 85,139,115, 53, 31,127,105, 9,163,103,123,249, 16,191,217, 18,135, 29, 79, 30,110,241, 97, 32,230,242, 80,228,
- 32,223, 91, 78,244, 49, 19,157,229,162,243, 40, 45,183,215,124, 92,136, 70,207,172,109,100, 36, 51,238,120,243,141, 95,226,165,
-231,111,243,240,241, 3,214,155, 43,134,205,154, 79,188,252, 50, 15,214, 43,208, 2,229, 8, 93,199,253,113,160, 94,205,120,244,
-224, 17, 47,191,244, 10, 95,253,234, 87,249,202, 15,124,133, 63,252, 71,254, 48,175,191,241, 58, 33, 10, 63,123, 12, 61,182,178,
-248,232, 89,111,214,220,188,117,131,221, 48,160,208, 52,213, 9, 73, 67,239,123,124, 18, 55,186, 99, 32,141, 91,114, 50,196, 18,
- 3,170,212, 88, 34, 23,244,179,254,244,167,138,146, 46,151,129,201,177,112, 8,236,249,104, 66,202,222,195, 58,125,254,130,215,
-156,208,209,138, 99,191,187, 56, 21, 72,169,168,218, 51, 58,235,189,142, 35, 70, 9,253, 24,250, 14,211, 88, 17, 85,161,176,100,
-180, 17,173,131, 53,134, 88, 53,162, 54,173,229, 64,209,222, 99,130, 71, 87, 50, 42, 51,174,188, 81,175, 54,236,186,145, 97,240,
- 24, 27,229, 80, 50, 83,166,189, 92,136,210,244, 74,168, 67,154,156, 81, 92,179,152, 9, 4,227,128, 45,222,251,102,143, 52, 4,
-178,159,212, 40, 85, 67, 30,169, 43,131, 55, 1,223, 93,240,230,235, 87,188,252,241, 87, 88, 93, 60,224,115,159,253, 50,247, 30,
- 92, 16,180, 34,165,226,149, 79,129,190, 91, 49,250, 45, 99,119, 69,191,185, 98,179,184, 96,190, 56, 97,177, 60,101, 54, 95, 82,
- 53, 53, 85, 93,225,170,170, 92,170,245, 30, 6, 34, 48,137, 50, 49, 48,122,191,227,220, 99,105,147, 34,102, 77, 10, 35,227,250,
-138, 26,141, 31, 34,214,148,239, 41, 3,186,194,170, 14, 31, 2,149,115,204, 27, 77,231, 7,146,182,120, 15,182,245, 36,163, 48,
-166, 34, 38,143, 1,210,216, 81, 25, 45, 99,213, 8,207,159,205,232,183, 29,235,117,199,236,164,225,106,227,153, 55, 53,187, 93,
-207,217,233,140,135, 87, 27,176,134,213,168, 88,245,145, 86, 89, 76, 14, 56,147,168,108,230,246,178,162,157, 55,100, 50,151,151,
- 87, 12,195,136, 86,134, 27,103, 55,121,229,229,155, 44,190,240, 9, 89,113,216,138,221, 40,170, 99,103, 13, 55,110,156,160,195,
-192, 48,246,132, 97,192,239, 86,164,193, 19,134,158, 59,179,154,126, 24,153, 47, 42, 82,147, 48,243, 57,186, 94,162,170, 57,186,
-154,161,221, 12,227, 90,140,173,247, 93,163,169, 27, 92, 59,195,212, 13,166,170,197,239,175, 53, 73, 75,124, 40,214,128, 21, 8,
-142, 53,137,172, 35,209, 68,114,246,132,236,137, 41, 16,115,164,247,137,123, 87,138,208,222,194, 95, 94,225,116,228, 21,171,185,
- 21, 71,182, 4,206, 85, 70,101, 43, 17,181, 6,190,244, 66,141,223,141,220,237, 61,184,138,143,127,254,115,124,254,139,175,176,
- 60, 89, 82,181, 21,124,243, 77, 76, 24,121, 18, 34, 95,123,239, 62, 47, 36, 69,171,117, 1,192,128,115,150, 20, 7,241,158,163,
-113,182, 66, 69,177,176, 85, 70, 51,168,140,178,146, 67, 97,181,150,247,128,207, 56, 83, 17,202,232, 59,145, 40, 33,105,132,172,
-132, 70,154, 68,173,110,132,120,179, 79,145,212, 66,150, 41,247,248, 40,225, 32,251,251,255,116,150, 76,174, 39, 85,246,223, 98,
-115,211, 81,186,253, 24, 68,244,152, 83, 46,182, 84, 83,194,149,116, 17,193, 69,250,190,161,107,122,250,190,162, 31, 71,129,211,
-228,116, 32,205,165,124,116,202,232, 35,109,150,124,109,102,234,142,167,247, 75, 86, 40, 25,122,179, 47, 38,229,103, 76,153, 76,
-234, 12,166, 56, 60,140,202,101,244, 78, 17, 27,154, 67, 72, 5,138, 97,180,140,253,200, 56,238, 24,186,145,121, 55,208, 14, 3,
-179, 69,135, 93, 46,112, 77, 11, 85,131,113, 51,148,105, 80,182, 45,194, 61, 77,102, 74,161, 44, 95, 95,206,216, 28,104, 72, 98,
-193,211,154, 72,252,112, 75,219,135,169,225,127,101, 9, 91,215,255,236, 52,226,139, 49,238,199,168, 7,112, 70,186, 54,178,205,
-199,221,217, 83,197,250, 24, 75,171,180,136, 36, 62,204, 98,164,148,226,186,182,250,184,123, 20,242,144,117, 51, 80, 53, 95,255,
-198, 55,185,113,251, 5, 78,206,206, 24,125,135,177,146, 66,101,148, 0, 91, 98, 8,116,221,192,163,199, 23, 68, 47, 35, 77,223,
-239, 4,249, 88,210,136,212,209,247,228,163,120,110,173, 53,248, 16,143, 10,161, 92, 66,116, 85,179, 60, 59,227,222,253,251,244,
- 62, 98,171,154,191,248, 51, 63,197,107,175,189,198,233, 98,201, 95,249,133, 95,224,203,223,243, 61,252,177, 63,241, 39,104,150,
- 51, 76, 86, 56, 5,129,132,138,226,229,125,255,131,119,249,115,127,126,224, 31,255, 61,191,135,223,246, 91,127, 43, 15,254,227,
-123, 60, 58,127, 66,202,138,170,105,104,218,134,172, 21,202,106, 86,155, 13,109, 83,177, 9, 91,188,135,213, 48,210,231,136, 49,
-142,106, 81, 17,135, 14, 21, 37,208, 65,105,158, 82,164,171,191,161, 93,250, 71, 17,229,246, 1, 41, 42, 93, 19, 55, 62, 29, 41,
-154, 39, 81,156, 58,190, 84,168, 18,166,162,246, 36,173,174,235, 24,118, 61, 85, 93,161,141, 69, 43, 91, 46,162,230, 80,116,109,
- 85,110,225,114, 24,164, 42,144, 99, 32, 56, 97, 39, 75,183, 85, 58,172,203, 13,113,219,225,199,158, 16, 52,174,114,184,130, 5,
-182,214,124,168, 32,112, 90, 65, 73,142,123,218, 91, 76, 38, 81,227, 52, 66,211,250,105, 95,121,134, 60, 98,109,102, 62,171,113,
-156,241,240,131,154,215,191,249, 58,119,110,191,128, 70, 17,195,200,237, 27,103, 60,120,178,146, 21, 69,202,135,227, 40,102, 24,
- 3, 97,179,165,143, 25,229,131,192,110,198,158,208,180,196,186, 38, 86, 21,177,154,212,194,250, 48, 49,155, 58, 40,107, 37,133,
- 81,151,253,228,228, 55, 78, 25, 98,100,123,249,132,182,174, 36, 34, 83,137,231,218, 90,241,247,199,161,112,186,107, 43,182, 78,
- 47, 80,154, 62,100, 78,202, 14, 86, 44,172, 34,136, 21,118, 75,162, 31, 60,139,121, 67, 74,176, 90,141, 84,141, 33,102,161,216,
- 13,222,115,122,182,148,157,186, 79, 44,206,230, 60,188,218, 96,116,194,184, 76,101, 21,149,211,204,103, 21,205,172,198, 22,118,
-246,172,169,209, 74,120,216, 90, 5,188,223,242,157,239,124,128, 86,154, 27, 55,158,163,157, 45,113,206, 74, 96,240,118, 43, 43,
- 56,165,200,253,192,110,189, 99,187, 94,115,113,126, 69,221, 84,196,148,153,159,157, 81,181, 48,107, 90,154,102, 65,213,204,113,
- 85, 75,221,204, 48,238,128,246,116,174,194, 89, 43,211, 29,109, 48,133, 40, 7,186,156,101, 86,246,238,218, 8,184,164,178,164,
- 81, 94,235,168,197,159,156,180, 56,135,238,190,191,227,228,206, 77,190,252,185,207,241,232,207,253, 21,190,125,177,198,231,142,
- 89,180,124, 81,201, 4,229, 97, 26, 57,211,153, 31,122,174,225, 99, 39, 13,247, 98,194, 40,207, 11, 39, 11,190,231,115,159,227,
-214, 11, 55,228, 50,145, 21, 87,231,107, 62,222, 86,168,155,167,252,228, 79,254, 28,155, 82,143, 78, 77, 13, 57,209,214, 53,155,
-245,138, 24, 19, 86,233, 98,235,117,196,232,177,109,131, 87, 82,208,135, 16, 80,101,237, 20,115, 42, 16, 22,209, 77, 73, 7,158,
- 8, 58, 18, 84,216, 83,221,180, 86,123,210,232,241,185,175,167, 58,158,147,240, 56, 68,117, 38,236,146,132,128,120,202, 46, 61,
-196,201,154, 38, 89, 10, 90, 27,234,202,209,212,142, 93, 39,127,191,179, 14, 83,201,197,161,170, 44, 77, 83, 51,155,181,116,187,
-129,174,239,233,124,197, 48, 6, 98,242, 37, 25,238,163, 49, 14,234,218,180, 87,237, 39, 8, 7, 17,175,218,211, 1,117,249,189,
- 70, 75, 82,156, 66,239,195,104,244, 17,233, 84,190,238, 3, 76,199, 26, 75,182, 9,157, 36, 93,178,239, 7, 98,138, 12,193, 51,
-142, 35,141,247, 84,237, 64,213,206,112, 85,196,212, 1, 83,133, 34,158,115,251,149,115, 54, 70, 56,116, 85, 35,121,236, 74, 99,
-141,163,170, 5, 90,100,127,165, 7,181,250,235,228, 83,170,167,196, 57,147,194,126,234,100,166,162,190,231, 22,151,142,140, 15,
- 73,255,122,166,208,239,147,188,212, 51,216,209,125,118,251,212, 81,237,203,187, 34, 82, 81,213,167,124,235,173,247, 56, 57,187,
-201,237, 59,119,184,184,186, 32,165,129,110,183,162,109, 87,116,221, 64,202,176,221,238,120,244,240, 62,219,113, 93,136,120, 94,
-242,144,243,100, 1,153,244, 4,153,211, 91, 55, 25,134,192,110,183,185, 6,143,145,188,115, 67, 78, 10,165, 29, 63,240,235,191,
-202,127,251, 39,255, 27, 98,240,248,156,184, 92, 95,242,240,225,125, 62,243,169, 79,243, 51,127,225, 47,240, 3, 95,253, 42, 57,
- 5,186,110, 39,152, 72, 99,101, 4,150, 35,187,161, 67,231,158,102, 85,243,198, 27,223,228,215,126,207,151,184,113,227, 6, 15,
- 47,158, 20, 24,136,147,155,169,151, 55,214,242,228, 6,195, 24,209,121,144,236, 99,229,100, 84,150, 51,217,143,140,113,141, 13,
-131, 92, 56,179,222, 51, 9,210, 94, 59,241,215,250,217,170,143, 76,100, 83,223,165, 83,207,101,210, 35, 14,135, 35, 18,205, 84,
-188,149, 58, 26, 92, 79,147, 25,181, 39,206, 37, 68,208,211,117, 29,219,245,150,249,108, 67,229, 36,207, 88, 77, 55,217, 56,141,
-200, 74, 38, 65,137, 73, 85, 6,148,115,226, 37, 50,166,140, 77, 29, 88,139,178, 21,166,106, 48,151,107,182,155, 13,195, 40,106,
-224, 80, 72,126,198,216,189,122,253,195,146,233,142, 71,240,215, 96, 52,249,224, 40,209, 71,157,177, 82, 17,157, 71, 84, 78, 60,
-124,240,152,243,135,239, 50,159,205,185, 56,191,228,221,239,188,207,114,126,194,147, 71,143, 88, 44,111, 48,171, 52,109,101,138,
- 54,197, 72, 40, 71, 4, 77,194, 17,112,105,192, 38,133,246, 10,250, 0,121, 32,135,154, 48, 24,176,134,100,116, 25,135,138, 66,
- 94, 23,246,129,178, 14,237, 44,217, 88, 1,124, 40,133, 46, 99,209, 24, 35,161, 91,145, 67, 39,200, 76,113,238, 96,156,221, 11,
-228, 0, 9,163,209, 16,163, 38, 2, 49,129,115, 21, 49,130, 81, 81,214,119, 38, 99,172, 76, 1,170, 74, 83,213,150,213,106, 3,
- 6,170,218,240,248,178,103,177,168,241, 99,100, 76,129,203,117, 79, 59,171,184,218,236,136, 41, 81,183, 80, 55,138,182,173,169,
-235,154,186,109,104,219,185, 96,127,141,166,118,186, 88,157, 52,179,166, 41, 28,131,219,204,219,153, 0,139, 52,144,131, 16, 46,
-203,186,202, 25,195,242,244, 6,103, 39, 39,108,183,107,118,187, 55, 80,186,231, 51,159,127, 21,211, 26, 76,149,153, 85,194, 90,
-111,103, 51,234,186,162,106, 26,225,224, 87, 21,182,170,208, 78,180, 17,206,186,107,108,242, 28, 68,136,171,162,100, 92, 16,211,
-126,138,165,180, 80, 7,141,107,112,117,196,185,142,171,203, 29,119,110,206,249,216,171, 47, 80,187,138,215, 94,126,158,175,159,
-175,121,168,224, 5,157,248,204,178,229,227, 55, 20, 15,227,192,153,213,124,236,108,193,227,171,158,183,214, 61,151, 17,126,232,
-123, 63,205,243, 47,191, 72,158, 57,236,201,138,249,233,156,231,111,158,240,201,207,127,150, 71,227,150,244,189,175,241,141, 95,
-122,135, 97, 72, 12,195,200,141,153,100,215,163, 4, 40,131,150, 9,138,115,150,202, 90,130, 31, 49,198, 48,198, 40,231, 23,154,
-224,227, 30,225,230,102, 13,181,209, 88,141,132,212, 16,240,153,253,251, 99, 18,132,238, 27, 49,117,160,130,198, 40, 69,219,143,
- 94, 72,164,197, 90,118, 72,234,204,101,223, 46, 65, 75,114, 81,150, 41,226,174,239,169, 58, 71,189,171,228, 57,168, 66,185, 56,
- 20,177,112, 85, 49,111, 27,134, 69,203, 48, 14,244, 62,208, 15, 35, 62, 68,194,148, 56,169,174,175,151,249, 8,144,214,177,174,
- 71, 61,245,239,186, 60,119,214,136,106, 62,234, 84, 72,121, 92,179,237, 30,195,170, 50, 2, 96, 51, 90,163, 42,135, 77, 19,226,
- 43, 49,142,158,120,181,198,247, 35,205,172, 39,206, 7, 98, 59, 98,155, 30,215, 54,216,170, 1,215,144,212, 20, 20,147,203,196,
-192,162,105, 69,255,100, 44, 38, 70,112,245,161,168,255,138,162, 49,159,242, 26,127,183,223,159,203, 14,254,195, 14,192,235,234,
-250,167,161, 24,207, 90,232, 82, 41,248,242, 2, 77,118, 9,253, 84,225, 47,249,208,199, 95, 65, 78, 40,109,247, 98, 33, 87,181,
-188,249,246, 93,234,118,206,233,141,155,124,231,157,111,115,121,245,132, 97,216, 0,137,126,220,162,181,116,130, 62,120, 82, 78,
- 82, 88,147,160, 9, 73, 7,229,118, 46,232, 83, 99, 52, 97, 28, 75,100,109,217,169, 20,161,159, 41,169,116, 70,107,126,224, 7,
-126,144, 87, 95,251, 36,159,251,194, 23,121,235,205, 55, 88,111,183, 44,103, 51, 30, 62,122,196, 75,207,189,128,206, 10,167, 20,
- 42, 6,114, 84,248,236, 81, 70, 44, 36, 49, 12,212,174,162,114,162,112,127,231,157,119,248,205, 63,252,119,178, 92,156,162,148,
-161,174,106,102,243, 57, 49,103,106,231, 88,175, 55,188,190,122,157,229, 98,201,203, 47,190,132,188,237, 34, 74, 55,204,155,134,
- 56,108, 24,243, 10,173, 7, 41,124,198,236,211,200,166, 29,107,230, 89,229,250,254,178,165, 14,124,244,167,119,230, 41, 31, 16,
-191,170, 0,116,166,117,138,222,191,118,233, 96, 71,204, 5, 71,155, 63,132,118,166,158,218,221,167, 76,214, 98,225,232,251,142,
-237,102,205,110,214,208, 56,139,177,210,137, 70,165, 72, 38,162,157, 43, 96, 11,246, 97, 48, 76,221,104, 22, 95,105,178, 30,140,
- 69, 57,139,118, 21,174,174,169,235,134, 77, 83,177, 90,239,232,198,190, 4, 14, 69,192,238,223,148,236, 37, 38, 7, 96, 78,158,
- 48,198, 73,147,172,150, 3, 43, 31, 36, 57,178, 67,151, 91,253,148, 61,110,117,192,170,200,249,234,146,135, 15, 30,114,178,104,
-185,115,235, 57, 30,221,127,200,167, 62,253, 25,186,174, 35,250,142, 48,142, 56,215,208,206,230, 92, 93,174,168,171, 26, 35,222,
- 40,172, 9, 84, 70, 81, 41,141, 83, 26,167, 21, 78,101, 44, 17,147, 53, 38,105,241,239, 7, 85, 40,129,153,172,197,246,151,141,
- 28, 6,114,241, 41,246,165, 24, 64, 21,107,218,250, 2,167,161,114,154,156, 12, 33,141, 88,163, 24,199, 40, 99,249, 16,153,181,
-114, 97, 8, 49, 19, 10, 62,120,244, 9,131, 65, 89, 65, 79,207, 22, 45,231,143, 55,180,109, 77, 24, 53,187, 93,143,202, 9,107,
-145,172, 2, 39,196, 61, 87, 25,158, 92,110, 81,214,224,115,166,247,129,186,209, 52,115, 77,187,176, 52,237,140,186,153, 81, 55,
- 45, 85,177,143, 25,165,105,141, 20,145,202,153,114,208, 58,172,211,210,201,153,105, 76,170,208,197,193,111, 84,233,172,157,197,
- 42, 71, 93, 87,124,229, 7,127,144,205,166,103,219, 7,198,236, 81, 46, 83,169, 10,103, 28,117, 83,227, 42,139,173,202, 74,198,
-217,253,179, 98, 43,153, 18, 89, 87, 73, 39, 86,108,107,199,161, 32,211, 51,104,108,137, 70,181,150,202,213, 52, 85,198,169, 13,
-149,178,188,252,220,130, 42, 27, 24, 3,159,253,204,231,184,253,254, 67,206, 47, 55,188,173, 96,232, 59,206, 86,240,241,179, 22,
- 98,224,189,187, 87, 60, 12,142,183, 54,112,122,235,140,223,254, 63,250,123, 56,107, 90, 82,191, 35,108, 7, 46, 46, 47,248,254,
-175,254, 58, 30, 93, 60,228,252,209,123,188,242,220, 41,246,213, 19, 46, 30, 94,114, 50,215,220,190,125, 34,107,213,172,168,235,
-154,164, 13, 41, 21,228,106,148, 64, 24,171, 37, 55, 34,100, 81, 92, 7,239, 25, 83, 68,207, 23, 96,101,114,101,148,156,183,222,
-100,192, 95, 75,101,123,186, 8, 78,117, 35, 22,110,253,232,139,224,180,120,212, 67, 44, 2,207, 76, 73,238, 60, 80,229, 20,136,
-248,109,144, 34,221, 15, 3,253, 48,210,212, 94, 46, 91,229,194, 45,110,167,154,197,208,210,117, 3,179,126,160,235,164, 91, 15,
- 33, 18, 38,140,114,206,215, 51, 16,242, 71, 64,152,166,142, 61, 63,157, 7, 49,229,185,235,167, 18,232, 14,152,219,227,198,116,
- 95, 91, 21, 88,163, 36, 7,162,156, 71,185,164,192,133, 24, 24,118, 3,177, 15, 12,219, 30,219,108,112,109,203,108,185,160,110,
- 27, 92,179,192, 84, 75,112, 86, 26, 18,177, 15,144,208, 66,190, 51, 34,252,117,182,198,254,245,118,224,127,189, 99,248,143, 10,
-150,216,195,195, 38, 37,125, 74,152,146,231, 62, 5, 89, 28,119, 70, 83, 97, 63,220,254,242, 81, 58,209,225,243,234,124, 64, 94,
-230, 50, 33,208,218,162,148,101,179,235,233,135,129,147,155, 55,120,231,221,111,115,126,249,152,245,234,130, 20,199,242, 14, 52,
-226, 13, 84, 25,171, 68,152,145,130, 88, 62,152,116,147, 5,204,161,202,141,100, 62,107, 48,192, 56,116, 52,102,130, 44, 40,180,
- 21,145,197,201, 98,193,231, 62,253, 5,190,244,107,126, 13, 70, 91, 22,203, 83,154,217,130,121,219,208,109,214,140, 97, 36,101,
-120,241,197, 23, 24,250,142,121, 83,211, 21, 15,101,244, 65,184,196, 41,161, 80,197, 49, 16,121,248,248, 49, 49,102, 78, 79,206,
-112,214, 21,165,165,208,184, 82, 74, 52,117, 77,223,143,108, 54, 3,111,127,231,219,220,188,117, 11,237, 22, 56,151,113, 68,110,
- 54,145, 97,183, 66, 89,121,109, 76,114, 18,154, 80,134,187, 74, 95, 15,204,249,176,184, 78,117,116, 43,157,138,123,140,177,140,
-162, 15,254,244,156,210,126, 77,113, 12,153,157,210,209, 14,111,168, 41, 32, 37,149,173,187, 46,111,166,130, 60,206,236,179,199,
- 83,134,126,232,216,172, 87,204,103, 53, 77,109,112,141,197, 58,139, 51, 10, 93,213,229, 38, 43,204,239,131,111,118, 18, 88, 32,
-212, 47, 99,177,198,162,173, 41,113,153,133, 27,158,130, 92, 78, 58, 69, 55, 72, 90, 30, 49, 72, 60,106,209,151, 40,253,244, 5,
- 84,224, 26, 89, 75, 58, 86, 46, 5,125,202,116,214,133, 16,163,205, 36,124, 81, 24, 45,118,186,166,114,212,149,132,106,220,185,
-117,155,211,147, 27, 92,156,159,163,173, 97,187, 93,113,243,230, 77, 82,130,247,222,123,155, 55,223,250, 14,159,255,252, 23,121,
-238,246,141,146,133, 14,218, 36,148,142, 64, 32,165, 81,246,154, 41,203, 88, 61,201,215,172,179,218,239, 0,115,146,144, 20,144,
- 41,208, 36,108, 72, 41,161,189,240,200, 67, 6,223,109,216, 92, 93, 17,252, 88, 86,136,197, 83,159, 4,190, 97,108, 66, 91,240,
-126, 64, 41,133, 79,105,143, 45,202, 41,161,181,232, 22,182, 91, 79,213, 86,236,134,145, 49, 26, 66, 12, 84, 90, 81, 87,150,205,
- 46,208,214, 14,235, 42, 46, 87, 29, 99,210,212,181,101,219,143, 88, 7,205, 76,211,206, 44,205,172,102,177,152, 51, 95,156,226,
- 92, 67,221,136,203, 67, 43, 69,163,237, 62,101,210,150,115,195, 88,133, 53, 22,156,112,200,141, 18, 47,189, 81, 10,103,220, 53,
-110, 5, 36,188,247, 56, 87, 51,143,138, 49, 71,146, 10,104, 28, 70,203,133, 81, 27, 74,138,158, 41,197, 89,242,178,181,158,242,
- 45,196,186,151,148, 66,169, 36, 40, 88,201,168,221,239,141, 81, 6,231, 26,140,245,180,179, 25, 49, 87,108,103, 61,159,249,212,
-103,121,231,219,239, 48,236, 70,162, 95,179,188,233,248,251,126,224,215,240,231,254,234,155, 92,237, 6, 54, 97,228,172,203, 60,
-222,121,186, 24, 88,145,121,232, 61,205,173, 27,252, 67,191,251, 31,230,229, 79,190,202,229,230,130,205,163, 7,248, 39,151,124,
-226,181,215, 88,173,207,233,245,200,139, 31,187,133,233, 7,134,214,146,230,138,166, 86,156,158, 44, 36,112, 40, 4, 76,211,224,
-163,220, 66,156,209, 88,171,232,183, 61,167, 51, 67,239, 7, 50, 10, 31, 18, 58, 4,250,232,153,181, 53,217,137,203, 72,208, 22,
- 25,165,227,245,206, 86,233,107,103,181,209,215,151,161, 49,231, 98,129, 19, 22,190, 0, 98, 74,223,154,229,124,141, 49, 29,116,
- 44, 18,164, 78, 55,142, 84,189,101,215,245, 52, 77, 77, 93, 85,212,141,100,148, 87, 90, 99,173,161,170, 44,109, 83, 51,111,107,
-118,125,195,110,215,179,235, 71, 6, 45,107, 4,166, 36,208,103,114,141,243, 51, 66,221,195, 92, 50,239,167,147, 90,107, 65,160,
-107,233,212,157,209, 36,157,138,246,171,224, 95,175, 77, 40,244, 94, 52, 36,123,249,178,134, 48,166,196, 45,107,114, 42,204,150,
-126, 96, 28, 71, 54,221,142,152, 51,182,114, 44,150, 39,204,151, 75, 22, 39, 3, 85, 59, 8,104,171,170, 80,206, 21, 10,157,164,
- 2,166,164,193, 68,204,211, 68,185,255, 95,253,223, 51,252,240, 35,174,184, 74, 34,190,208,229,150,118, 28,241, 58,165, 0, 77,
-126,228,169, 91, 86, 90, 31,254, 59, 50, 98, 44,180,203, 98,157, 18,209,195,249,249, 99, 94,120,241, 69,238, 61,184,203,122,189,
- 98,189,122, 66, 78, 30,171,229, 5, 55, 40,218,214,113,186,108, 81, 68,134,193,211, 13,129,222, 7,124, 46,214,187, 36, 10,223,
-202, 90, 42, 87, 49,115, 53, 49,140,156, 84, 6,231, 42,102,141,100, 51,159,158,156,178,152, 47,104,155, 57,167, 39,183,137, 93,
- 7,109,139, 31, 34, 15, 31,157,243,218, 39, 94,197,184, 74, 56,236, 10,174, 86, 87,204, 78,103,156,158,158,176,123,252, 4,109,
- 20,149,105,184,125,231, 69,190,247,251,190,151, 47,125,239,151,121,254,197,231,249, 3,255,230, 31,224,209,147, 11,158, 92,174,
- 56,187,113,139,182,105,168,171, 70, 64, 39,202, 80, 87, 21, 39,243, 37, 77, 21, 72,202,161,212,200,227,243, 71,132,116,201,243,
-207,189,202,220, 69,134,126,131,138, 29, 3, 90,240,184, 25, 76, 78,232,164,176, 86,139, 32,173,236, 6,159, 30,175,239,247,226,
-215,146,190,244, 97,154,146,211, 53, 72,203,241,255,239,169,205,185,188,175, 38,177, 73, 17,195,149,164, 67,140,150, 0,147,227,
-221,149, 53, 37,239,216, 26,154,218,162,141, 40,246,201,137, 28, 61,132, 17, 98,133,194,149,124,130, 92, 60,217,105, 31,237, 58,
- 41, 69, 4,244,160, 80, 88, 12,224, 98, 36,249, 81, 62,191,209, 56, 43,135,132,241, 70, 20,166,193,139, 94, 65, 85,242,198, 85,
-250,218,229,102, 58, 36,142, 95, 27, 77, 42, 22,193,105,199, 92, 14, 57, 35, 66,193,113, 28,249,133,159,255,203,196,208, 51,142,
- 91,186,237,154, 87, 62,246,113, 94,251,196, 43,124,229,249, 23,184,247,232, 33,207,221, 57,195, 25,205,249,147, 11,186,221, 6,
-109, 62, 41,226, 42, 20,179,118, 46, 20,176, 50, 10,214,166, 70,235, 10,109, 26,193,230, 26,185, 68, 24, 35, 2, 41,179,207,174,
-158, 70,241,101, 57,149, 37, 42, 54,231,145,224,199,210,213, 8, 15,156, 28, 73, 41, 22, 37, 47,248, 24, 25, 70,168, 43, 83,116,
- 70,162,138, 15, 9,134, 20,152, 16,232,214,200,229,199,185,138,148,122, 92, 85,211,141,158,237, 16,112, 86,225,156, 35, 71,121,
-109, 78,150, 51, 30, 93,238,232,199, 36,211, 40, 31, 25, 99, 98, 54, 83, 84,141,166,110,106,234,102, 78, 59, 91,202, 71, 59,195,
- 25, 75, 91, 57, 92, 81, 89,239, 15,212,169, 11, 55,154,202, 85,152,218,145,166, 67, 88, 43, 84,146,139,214,180, 23,205,104,180,
- 73,164, 84, 19,131, 0,116, 60,153, 72, 40,193, 68,250, 40, 29, 75,126,142,122,242, 87,107,189,231, 14,176,183, 92,234, 50,121,
- 74,144, 60, 57,142, 98,229, 75,130,128, 53, 54,211, 46, 23, 4, 53,224, 77,226,196,103, 46, 86, 27,218,179, 27, 84,179, 37,186,
-153,209, 52,150,197,252,148,239,249,244, 23, 96,177, 96, 55,118,180,218,146,214, 35,187,221,150, 39,171, 43,124, 14,124,254, 11,
- 95,224,213,215, 62, 69,248,224, 17,102,220,112,203,106,252,205, 91,220,127,240, 1,111,189,253, 58,167,167, 13,183,206, 22,184,
-208,240,120, 97,105,182,138,202, 40,156, 85,132,224,233,187,129,198,181,164, 84,138, 48,137,232, 3,221,110,199,141,197,146, 92,
-192, 76, 99,140,204,148,240, 61,148,179,232,202,161, 48,144,138,155, 70,235,103,173,173, 71, 69,173,220,163, 9, 71,231,194,100,
-107, 75, 69,157, 46, 19, 49,181, 15,139, 10, 19,146,172, 48, 74, 98, 18, 75, 88,215, 15,212,157,163,105,133, 20, 58,142, 13, 85,
-109, 69, 68,166, 53,149,181, 52, 77, 69, 59,171,153, 13, 13,109, 87, 83,117, 61,118,218,173,167, 15,223,170,239, 3, 97,142, 24,
-151,199,117,137,167,210, 73,101,252, 46, 14,143,105,196,110,203,180, 80,240,208, 26, 99,142,181, 96,229,243, 42, 35,219, 91,107,
- 36,175,162, 4, 41,169, 97,196, 43, 45,136,217,174,103,179,221,226,125,192, 85,151,156,158,156,114,227,198, 25,203,179, 5,179,
-147, 37,110,222, 98,218,185,176,228, 77, 45, 83, 68, 37, 97, 85, 90,243,255,159,162,254,145,221,251, 20,153,119,148,188, 54,189,
-144,251,206,111, 18, 52,148,127, 79,229,215,135, 91, 81,186, 22, 90, 37,162, 75,205,122,181, 33,147,185,127,255,125,174,174, 46,
-233,135, 30, 69,196,232,204,107,175,188,204,162,118, 44, 92, 98, 86, 91,140,242,228, 52, 98,173,165, 31, 34,151,171, 29,143,214,
-129,221, 8,221, 48,136,234,213, 88, 22,243, 37,103,167,103,244,235, 43, 82,127,197,124,222,178,152,183, 56,103, 75,177,117,204,
-155,138,198, 25,182,235, 21,239,223,191,207, 55,190,241,117, 98, 76,220,187,255,128,197,172, 97, 28, 61, 79, 46,206,105,172,227,
-133,148,249, 13, 95,249, 65,222,122,239, 93,148,114,228,164,121,245, 19,159,230,185, 59,207,115,126,126,201,143,254, 19, 63,202,
-127,250, 71,254, 40,111,127,235,109, 30,159, 95, 96,172,101,236, 7,140, 50, 4,109, 24,135,158,202, 58,134,126,128,172, 8, 57,
- 80,213,138,209,143,140, 62, 96, 76,102,232, 55,140,118,141,211, 17,159,148,236,140, 35, 88, 35,249,205, 41,179, 31, 43,105,125,
- 61, 17,236, 56, 99, 60,127,200,244, 70,156, 0,170,176,190, 15,209,133,123, 86,128,145, 55,157,240,155, 37,163, 88,216,244,135,
- 49,246, 68,157,178,198, 96,141,197,148, 95, 27,107, 69,237,233, 28,198, 40,121,227,206, 27, 92,109, 49, 78, 75, 1, 39,146,147,
- 39, 69,131, 46,201, 87,162,152, 23, 53, 45,169,136,194,212, 94,110, 49, 5,130, 31,138,159,158, 66, 83, 36,132, 67, 46,123, 50,
-242, 79, 65, 72,186,217,218,162, 72, 61, 88,238,166,225, 85, 58,178,175, 41,149, 81,229, 13,191,191,176,104, 69,223,109, 33,195,
-249,249, 99, 86,151,151,156, 44, 91,206,150, 39,188,246,202,203,220,185,117,155,219,183, 36,125,238,197, 87, 95,102,183,185,160,
-223,109,200, 68,174, 86, 23,124,230, 51, 95, 32,171,138,152, 13,103, 55,110, 98, 10, 85,207,185,170, 8,183, 42,212,228,131, 47,
-135,207,113,215, 68,161, 86,233,146,213,153, 99, 32,135, 1,210, 32, 22,211,164,136, 33,137, 7,215,203,206,210,148, 75,115,206,
-148,174,171, 76,120,140, 4, 52,165, 4, 33, 40, 84, 25, 73,198,148,153, 53, 34,190, 26, 7,168,235,134,221,144,216, 14,123,121,
- 44,198, 88,250, 78, 32, 50, 93,215,209, 15,146, 71,159,178,198, 71, 47,185, 40, 78, 97, 43, 69,221,214,212,245,140,166,153,203,
-248,189,110,105,156,229,100,214,224,172, 18,183,131,214, 24, 45,207,140, 53, 22,109, 28,149,173, 68,145,110,101,117,162,247, 5,
- 93, 28,203,114, 82, 91,148, 10,133, 63, 96, 9,209,136, 46,198, 66, 40,150,209, 92,198,194,233,232,162,106,173, 43,246, 71, 91,
- 46,166, 69, 65,109,109, 97, 71,116,101,250, 52,173,179, 36,201,205,184,154,218, 90,122,165,177, 68,102,217,240,218, 23,191,192,
-139,253,192,118,136, 34,137,200,154,198,107,178, 79,216,126,199,205,220,147,163,167,111, 18, 62, 4,190,255,139,175,176,108, 52,
-138,200,246,253,183,169,171, 22, 69,199,197,176,225,151,223,125,128, 38,240,226,237, 59, 52, 54,114,115, 62,199, 25, 69,125,218,
-162, 30, 67,211,214, 88,103, 73, 65,186,107,231, 42,217,184,104,181,183, 26,215,117, 37, 5, 92,233,194,177,151, 92,247,140, 32,
- 98,181, 53,226, 66, 1, 81,177,255, 53,152, 20,135,198,128,235,225, 42,197, 41, 21,227,148,186,153,247,212,200,235,206,170, 92,
-246,238,145,113,244, 34,130,235,106,118, 77,197,108,104,104,218, 74, 4,104,133, 87,226,156, 52, 55,109,211,208, 54, 53, 77, 45,
- 83, 34,239,195,209,122,246,169,101,113, 33,225, 29,114, 40,174, 3,172,213, 81, 36,179,181, 70, 50,223, 43,187, 15, 21,155,116,
- 4,166, 92,164,247,228,188,146,170, 54, 21,117,140, 37,107, 37,151,240, 18, 40, 85,122, 13,201,250, 24, 61, 73, 27,124,200, 92,
- 93,109, 8, 99,224,234,124,195,250,226,138, 91,183,231,156, 61,119,139,217,233, 41,205,114,196, 52, 1,219, 44,208,166, 69,153,
-170,172,164,121, 58,165,237, 87, 63,130,255,149,124,142, 99,162,216,180,167,216,243, 66, 56,146, 58,151,241,200, 49, 48, 67,107,
-202,205, 71,210,218,142, 11,253, 30,150,147,179, 64, 44,148, 17,152,138, 18,187, 82, 38,243,232,201, 57,209, 52,124,240,232, 33,
-138, 76, 55,116, 24,163,185,177, 88,240,249, 87, 94, 32,109, 47,168,180, 38,122, 79,244, 3, 90,129, 69, 17,187,158,211,182, 18,
- 12, 38,150,213,214, 50, 4,133,171,231,204,231, 55,112,170, 2, 59,146, 93,199,220, 89, 22, 37, 15,123,244,145, 24, 61,235,221,
- 21,231,239,221,227,173,119,222, 97,179,235, 36,139, 88,107,188,223,114,126,177,193,105,205,174,239,120,225,149,231, 24,199,196,
-237, 27,207,241,179, 63,247, 87,137, 74,211,143,158,209, 43,140,117, 52,243,154, 20, 34,175,189,242, 10,175,127,253,107,244,221,
- 37,219,237, 21, 99,244,228, 97,139, 15, 61,182, 50, 84,161, 70,107, 67,240,137,206,123, 26,111, 25, 58,143, 54, 21, 70,121, 78,
- 22,142,188, 11,132,156, 81, 41,224,180, 8, 54, 98,210,164,164, 9,217,160,209, 88, 60,166,108, 33,173, 50, 71, 17,138,101, 23,
-148, 36, 35, 92,248,207, 19, 98, 88, 29,252,105,207, 20,116, 25, 83, 90,119, 84,100,138,181, 77, 21,184,144,202, 98,149,155, 70,
- 88,178, 39,151, 14, 93, 86, 49,169,252,119, 35, 86,170,214, 81, 59,133, 49, 89, 70,158, 57, 32,155,221, 0,121,148, 3, 39, 38,
-178,138,228,236,100,100,202,244,247,150,131, 56,101,200,158,156, 71,185, 20,228, 64,244, 3,126,236,240, 99,199,208,247,164, 16,
-202,243, 29,129,136,205,142, 56,141, 93,143,244, 5, 7,191,247, 1,144, 52, 17,177,236,164, 91, 48,134,245, 16, 57,191,186,226,
-241,189,187,188,252,226, 29,158,187,115,131,229,188, 1,163,152,205,231,232,198,210,143, 61, 97, 37,136,201, 97, 55,160,115,230,
-147,159,124,149,215, 62,249, 50,143,206, 47,216,110,123,198,113,197,124,121,139,211, 27,207, 81, 53, 75,146,118,104,237,112,102,
-154,116,148,110, 82,107,146, 58,252,251,148,126, 24,189, 39,244, 29, 33,193, 56,140, 12, 93,102,236, 21,195, 38,146, 7,207,250,
-106,160,203,154,216, 52,232,113,164, 46,122,130, 74,101,134,228,101,175, 8, 12,222, 66, 26,176,170,196, 39,103,209,177, 84,149,
-129,236, 81, 38,177, 13,154,171, 62,211, 26, 69, 26, 51,163,246,100,101,169,231, 11, 30,221,127, 68, 80, 25,101, 53, 99,113, 14,
-212, 45,184, 10, 92,101,112, 77, 75, 51, 91, 82, 53, 51,154,118,198,172,109,152, 55, 21,179,218, 81, 25,141,211, 34, 66,114, 70,
-112,185,146,125,238,112,174, 65,215, 53,218,200,197,196,150, 96, 17, 17,246,137, 2,192,104, 93, 50,211, 3,218, 86,178,203, 69,
- 73, 2,101, 17,101,198,152,101,100, 60,122,240, 94,222, 7, 10,172, 51,228, 41, 82, 21,201,200, 78, 42,203,165, 42,183,224, 3,
-217, 40, 84, 85,145,250,154, 24,125, 81,202,195, 34, 87,168, 52, 98,212, 64,229, 28,117,223, 50,143,153,109,239, 25,123, 41, 94,
-169, 82,228, 20,139, 83,196,176,208, 6, 67, 98,245,248, 93,137,121, 30, 71,250, 49, 96, 92, 69,221, 88,150,203, 37, 95,248,244,
- 11,172,206,159,112,243,100,193,217,141, 57,198,102,114,244, 44,103, 53,149, 86,204,234,150,156,132, 91,239,154,150, 24, 19,206,
- 58,241,162, 71,104,107, 37, 62,244, 16, 25,146, 42, 60,142,192,102,232,169, 79,150,178,210,152, 4, 3,249, 0, 65, 17,145,168,
-192, 84,148, 50,215,104,133, 83,105,156, 60,221, 41,167,107,133, 52, 33, 29,127,222, 39,133, 30, 64, 84,185, 96,194, 85, 81,200,
-135,160, 24,250,145,110, 55,210, 53,158,174, 31,105,187,145,218, 88,180,147,231, 27, 99,113,117, 69, 85, 85, 82,220, 43, 75, 99,
- 53, 99, 97, 62,236,215,167,229,111,159,130,105,246, 62,172, 61,201,244,192, 43,157,110,237,202, 24, 84,114, 24,151,177, 85,162,
- 82,135,230,115, 18, 7,114,180,127, 87, 79, 93,170,149, 41, 26,166,146,226, 40, 47, 74, 36, 37,133, 9, 19, 72,205,145, 48,140,
-201,176,218,245,156,239,214, 60, 94,119, 92,173, 55, 60,191,245,220,186,221,115,114,107,160, 61,147, 73,144,105,230, 40, 59, 67,
- 23, 34,221,255, 48, 58,245,239,134, 6,125,138,185, 61,165, 82, 77, 47, 98, 62,234,210, 85,241, 6, 78,233,100,114,118,101, 18,
-145,221,118, 75,207, 64,223,247, 24,205,129, 50,167,165, 88,121,223,161,230, 45, 26, 77, 83, 47,216,172, 86,108, 87,107,116, 76,
- 37,101, 9,180,181,124,236,249, 23,232, 67,166, 15,153, 97,220,178,221, 94,200, 27,220, 86,172,134,200,234,209, 57,117,211, 16,
-178, 97, 12, 29, 49,105,162,171, 56,185,253, 49,230, 65,144,126,231, 79,206, 25, 71,121,184,149,131,144, 34,167, 55,111,162,208,
-220,122,254, 5,158, 92, 94, 17,180, 38,228, 76,179, 90,209,143, 35,219, 97,199,251,119, 63, 96,190,156,147,115,164,219,109, 89,
-175,174,246, 98,172,205,118, 83, 10,164, 97, 67, 39, 30, 89,227,168,116,133,107,150,156, 44, 22,180,181,197,233, 68,214,146, 75,
-174, 68,122, 42, 88, 80, 68,169, 43,171,139, 34, 50,116, 14,171, 52,149, 45,133, 73, 43, 81,205, 22,127,231,113,166,219, 97,218,
- 34, 60,244, 41, 32,229, 48,174, 42, 33, 9,230, 48,198,154,200,114, 19, 53, 73, 33,129, 25, 19,111, 91, 84,218, 18,225,171, 11,
- 68,101,186, 17, 59,231,168,107, 71, 93, 25,156,201,104, 37, 59,229, 28, 71, 82, 80,101, 9,159, 72,201, 98, 82, 32,235,128,210,
- 82,237,178, 18,191,187, 42, 54,133, 28, 11, 12, 36,140,114,136, 22, 48, 82,156,246,161, 69,253, 46, 20,177, 26, 87,201,164,198,
- 26,183,143, 88,213, 31,182, 75,211, 6,109, 68,157,107,172,120,117,179, 2, 55,155, 81,183, 21,183, 23,160,179, 28,184, 77,237,
- 64,137, 64, 40,167,196,118,181, 18,145,102,244, 60,122,248, 8,173, 53, 47,189,244, 49,140,115,228,156, 25,135,158,126, 12,172,
-118, 35,187, 49,243,202, 39,207, 56,189,121,179,236,237,237,100,191,144,231,163,160, 57, 39,192, 76, 70,130, 45,146, 46, 93,101,
- 72,120, 53, 50,166,145, 77,128,128, 4,182,156,111,183, 12, 42,211, 23, 5,178,173,172,136,124,148, 0,166,180,149, 28, 2,111,
- 13, 49, 6,180,169,100,197,145, 76,185, 92, 73,150,194,106, 20, 78,121,164,140,173, 99, 34,140,137, 59, 47,220,226,226,242,138,
-174,207,216,214, 16, 60,248, 62,148,247,147,162,174, 43,234,166,161,170,154, 61,112,164,174,107,234,186,194, 57,209,146,180,181,
-163,118, 22,103, 53,149, 45,225, 57,214,146,181, 36,161,233, 66,131, 51,198, 10,170, 84,233,114,136,203, 37, 45,134, 64,142,146,
- 93,129, 50, 56, 50, 1,241, 91, 39, 25,106, 48,140, 1,162, 72,146, 66, 89,171,200,204, 65, 86, 19, 83, 84, 53, 41,203, 68, 70,
- 70, 26, 16,133, 11,160,140,198,182, 51, 50, 3, 41, 5,180,177,184,198,178,180, 13,174,246,244,189,103, 28, 51, 67, 8,204,198,
- 72,223,143,210,145, 14, 35,195,232, 73, 41,160,114, 68,169, 68,213,180,204,231, 51,116, 6, 87,213,220,168, 28,218, 10,105,211,
-213, 21, 41,120, 62,246,226,115,228, 20, 88,156, 46,168,103, 21,201,247,156,158,157, 82, 57,203,172,109,200, 40,134, 97,160,105,
- 22, 37, 37, 83, 84,238,214, 88,250,161,163,117,114,137, 23,225,190, 4,178,100,107,168,107, 89,233,228,105,242, 80,214, 90, 28,
-157,209, 31,222,220,229, 3, 41,244, 67,194,146,114,249, 76,211, 28, 60,229,103,243, 38, 38,114,166, 15,114,225,233,251,158,110,
- 87,209,205, 26,186, 82,188,181, 82, 40, 43, 22, 55, 99, 37, 27,161,174, 43,170,202,137,120,210, 74,168, 83,142,169,172, 86,190,
-139, 10,254, 40, 69,242,218, 68,175, 76,105,246,105,115,165, 6,237, 53, 96, 5,243,170,143,118,230,250,232,252,146,207, 83, 10,
-123, 65,228,230, 56,146,172,101,212,254,218,232, 63,166,140, 79,208,143, 35,235,174, 99,236, 58, 54, 93,207,102,183,229,118,223,
-113, 54,142, 44,110, 6,234,152,176, 46,160,173,104, 64,254, 7, 81,212,127, 37,163,249, 61,111,190,136, 58, 76,177, 15,237,247,
- 28,211, 3,165,147,132,141,170, 84, 68, 65, 9,101,165,224,239, 54, 91,201, 2, 46, 89,218, 85, 85,211,117, 59, 18, 2, 78,240,
- 36,178, 78,212,206,114,227,230, 41,151, 79,206, 89,156, 44,229, 1,219, 68,182,193,176, 94,247,108,198,145,168,160,243, 3,163,
- 31, 64, 25,252, 40, 9, 71,117,229, 48, 57, 97,171,138,246,228, 6, 39,139, 83,170,230,132,186,110,112,214,210,182, 13,203,197,
-156,232, 61,143, 31, 63,230, 47,254,212, 79,240,224,225, 99,206, 47,174,208,202,112,251,121,207,173, 59,119,176,179,150,175,189,
-254, 58,227,112,151,222,123,208,137,223,253,143,253, 30,134,126,203,118,187, 37, 19,217,174,215, 88,165, 72, 62,162,179,162,219,
-245,108,155,142,202,213,164, 44,249,200,195,213,138,198, 90,114, 24,153,153,204, 73,165, 48,166, 69,229, 40, 74,211,164, 9,211,
-248, 43, 5,116, 74,232, 4,198,106, 42,163,105, 42, 75, 93, 89,172,214,194,242,215,250, 67,166, 52,135, 93,123,230, 72,247,160,
- 14,214,150,233,159,122, 42,234,229, 54,127,192,194, 22,142,179, 82,101,124,170,142,148,166,101,148,181,223,191, 43,140,205, 88,
- 19, 81,121, 36, 6, 69, 24, 69, 81, 78,142,152, 56,162,188, 67, 87,101, 20,173, 45, 90, 23,210,215,116, 41, 41,250, 11, 82, 57,
- 82, 98, 64,165, 80, 48,154,115, 78, 78,192,186,150, 49, 36,130,210, 88,231,132,214,102, 93, 1,211,148,241,217,209,247,167,180,
-222,123, 93,165, 43, 54,101,215,101, 80, 70, 99, 84,102,220, 93, 50,174, 31,179,108, 64, 87,167, 5, 37,234,233,187,157,116,143,
- 74,118,175,171,213,134,205,118, 71,219,182,108,119, 59,121,238, 77, 67, 51,215,184,106,198,233,169,161, 27, 60, 24, 9, 66,249,
-218,215,127,145, 31,248,245,191,129, 91,119,238, 16,117, 77,196, 20, 27, 77, 89,159,232, 3,236, 67,229,194,137, 54, 65,126, 14,
- 30,168, 34,201,121,146,115,244, 67, 71,174, 44, 23,221,134,203,245,154,205,174,163, 78,153,214, 56,146,207, 12, 99,198, 85, 74,
-246,230, 90,137,191, 56, 37,170, 36,249,215,209,251,178, 11, 85, 12, 62,224, 3, 92,109, 6,124, 86, 12, 62, 98,181,120,157,189,
- 31,233,123, 79, 86, 20,124,180, 76,223,140, 46,239,165,186,162,174, 90,234,170,166,174,106,172,149, 75,148,177, 22, 87, 85, 52,
-101,188,106,173,162,170, 14,122, 11,235, 28, 49, 43,108,249,249,107, 93,149,169,202, 36,190,205, 88,103, 81, 36,194, 48, 8,231,
-126,148,176,142,172, 20, 86, 75,183, 26,179, 98, 12,158,108, 44,218, 71,250,212, 65, 89, 27, 77,171,217,156, 82,233,163, 65, 69,
- 89,255, 40,171,132, 70,151, 68,252,153,181, 69, 25, 77,180,137,228, 35,174,140,233,173,211,180, 85,194,182,145,161, 15, 88, 31,
-240,163,199,182, 21, 49, 38,154, 81,200,104,193, 75, 74, 87, 46,204,242,138, 76, 10, 1,103, 20,206, 8,106, 24,149,176,206,161,
-245, 12,147, 51,139, 69, 75,179,172,105,230, 13,126,183,225,236,185,219,180,179,133,172, 13,148, 46,147, 20, 71, 55,120,193, 76,
- 91,139,209,153, 77,183,229,230,233, 29,214,155, 29, 89, 85, 50,214,213, 14, 83, 59,170,166,150, 75, 49,135,130, 23,203,100, 37,
- 29,133, 27,125, 55, 75,235, 36,162, 61,176,216,143,226,136,243,209, 57,146,243,145,144, 58,239,185, 49, 57, 75,240, 75, 55,140,
-184, 93, 71,179,169,169, 92, 69, 85,201, 4,193,166,188,143, 11,183, 90, 38,122,117, 85,209,212, 21,245,232,241, 33, 10,196, 50,
-167,239, 46,250, 58, 10, 94,158,152, 20,123,225,246, 52,170,209,170, 92,178,211,126, 10,118,152,206, 73, 76,172, 62, 26,199,171,
- 73, 48, 56, 97,235,202, 27, 50,146, 74,164,114,249,125, 28, 98,204, 69,152, 42, 56,221,115, 31,217,244, 3,155, 93,199,213,122,
-203,115,219,129, 91, 59,207,217, 45,143,173,101,253,102,173,197,170,143,184, 85,253, 74,198,238,127,163, 74,248, 95,201,231,121,
-198, 62,167,228,134, 24, 50,165, 0,201,173, 59, 21,153,191,182,229, 33, 80, 73,110,204, 42,145, 74, 38,116, 12, 30,103, 43,230,
-179,154,197, 98, 73, 93,183, 60,188,247, 30, 99, 8,152,170,146, 23,163,228, 56, 47,230,115,108, 81, 81,239,250,158,110,179, 99,
- 23, 51, 99, 10, 92,108, 59,118,163, 39,107,176, 85,121,147,212,150,128,220,234, 99, 55,162, 76,160, 25,192,174, 59,124,184,135,
- 81, 18,160, 80,215, 78,216,194, 77,195, 11,207, 63,207,139, 47,190,200,213,195,247,121,120,255, 33, 55,111,220,228,226,201, 57,
- 95,248,204,231,248,228, 23, 62,199,106,189,230,203,223,243,125,184,170,226,141,111,125,147,247,222,127,143,221,118, 77,109, 21,
- 63,246, 99, 63,198,111,254,225,191,131,213,250,138, 15, 62,184, 71, 68,222,240,227, 56, 22,213,127, 70, 23,241, 73,179,152, 51,
-175, 26, 94,189,179, 96, 97, 6, 76,106, 8, 73,209, 5,200,218,177,235, 37,155, 93,231,136,201, 1,155, 51, 22,139,213,153,202,
- 40,106,107,168,157, 40,140,181,226, 8,204,112,132, 60,221,147, 2,143,222, 10,215,108, 32,165,224,105,246,255,156,222,192,106,
- 10,232, 41,251, 78,173,165,216,236, 71, 98, 89, 18,150,166,217, 64, 78,138, 20, 34, 62, 71,100,209, 29,138,165, 80, 50,231, 77,
-172,208, 49,200,135,149, 72, 76,180,151,184, 89,145,139,151, 46, 86,214, 64, 18,195, 40, 93,135,181,150,106, 54,227, 76,215, 52,
-179,196,152, 50, 65, 75, 78,182,115, 50,194, 55, 69, 57,175,141, 46,248, 80,189,127, 77,180,146, 95, 75, 87,168,100, 21, 84,196,
- 84, 99,191,102, 8, 35,126,216,144, 66,207,233,201, 2,239, 51, 90, 91, 90, 53,103, 28,122,156,177,108, 55, 27,238,189,255, 62,
-239,222,253,128,249,124,206,141,155,183,169,154,150, 97, 76,140, 99,160,178, 53, 84,144,178, 38, 43, 67,191, 27,184,220, 94,240,
-223,253,169, 63,193,255,248,119,254, 14,176, 51,218,229, 25, 40,197,118,179,161,110, 26, 41, 98,211,129,153,100,237, 97,115, 41,
- 80,106, 71, 54, 14, 85,215,232, 81, 70,151,175,191,241, 77,126,246, 47,253, 28,233,226, 1,126, 16,241,234,102, 24, 49, 88,114,
- 18, 34, 89,206, 1, 50,146,175,173, 52,227,224, 49, 74, 49, 14, 17,165, 42, 70, 31,112,149,146,212,179, 32, 54,186,136, 92, 24,
-235, 90,113,117,185, 38, 43, 85,232,139,150,193,135, 50, 81,200, 7,107, 90,233, 62, 52,101,101, 16, 35, 57,201, 1,235, 42,135,
-173,107,234,198, 81, 87, 86, 10,156, 86, 88, 39,222,235,172, 4,149,171,141, 37,163,100,231,238,196,230, 38,158,229,136, 86, 72,
- 94,117,140,165,139,135,188,247,156,139, 77, 80,153,204, 56,110, 14, 48,169,201,168, 88,158, 31, 93,242,182,147, 47,201,141,218,
-145,181,140,140,179, 86, 66,149,203,242, 61, 40, 39,186, 14,114, 89,215,100,112, 46, 19,213,128,169,106,124,237,169,114, 34,196,
- 76, 21, 18,141,143,178, 11, 30, 61, 41, 30, 82,199, 84,138, 56,131, 88, 3,157,136,243, 92, 83, 50, 14,156,163,153, 85,216, 70,
- 46, 14,138,200,205, 59,119,168, 27,241,247,199, 32, 5,116,244, 94,162, 69, 67, 36,198, 17,101, 43, 82, 12, 24,235,200,218,145,
-162, 97,140, 34,234, 82, 85,133,169, 43,178, 18,106,168, 78, 83,140,105, 46, 40,214,201, 79,254,209,235,216, 41,110,152,163,252,
-136,107,140,145,163, 95, 31,232,147, 71, 73,129, 64, 44, 43,181, 97,244,116,131,103,219, 13,212,117, 71,237,164, 32,214,245, 81,
-247,172,132, 42, 89, 85,242,222,157,154, 18,173,194, 52, 99,120,166,212,237, 53,239, 71,194, 57,181,103,199, 78,126,123, 43, 81,
-187,198, 98, 74,147,169,148,190,238,114, 57, 26,189, 43, 93, 38, 54,147, 43, 75,233,130,252,133,156, 3, 38,219, 2, 47, 50,215,
-240,205,162,217, 41,151, 33,192, 39,133, 79,145,188,238, 24, 70, 79, 63, 4,250,110,100,220,141,204, 22, 21,117,237, 74, 92,172,
- 57, 40,156, 83, 74, 7, 5, 96,230, 25,184, 11, 71,226,181,143, 34,186,253,245, 20,239,107,136,218, 15,161,201,125, 20,124, 6,
-101,202, 62, 70,110,204,170,220,224,180,158,252,208, 34,134,146,215, 87, 30,162,166, 22, 78,112,221,212,180,117,131, 43,183,162,
-249, 98, 65, 55, 12, 60,119,118,147, 87,110,157,162,181, 4,222,247,222,211,220, 94,112,239,209, 35,190,253,224,156,251,143,183,
-172,119,158,144, 20, 85, 51,167,106,151, 84,117, 35,246,245,228,233,251, 53, 62,139, 45,143, 36, 1, 29, 99,191,165,235, 54, 50,
-218, 3, 76, 25,139,174,102, 51,134, 97,224,237,111,183, 44, 42, 71,142,112,254,232,156,237,213,150,205,213,150, 87, 94,123,141,
- 79,191,242, 9,158, 59,187,201,162,169,184,125,231, 57,190,240,185,207,115,235,206,109,126,234,167,126,146, 63,243,167,255, 36,
-255,253, 95,249, 37, 86,171, 13,191,243,183,255, 78,222,125,239,125,126,252,207,254, 57,174,174, 86,104,165, 8,227, 40, 5, 56,
-238,200, 24,172,110,153,217,204, 11,167, 53,117,142,228,164,217,230,134, 39, 15, 87,188,252,242, 11,152,213, 21,249,210, 11, 45,
- 42,169, 34, 78,211, 56,173,169,140,161,178, 7, 15,176,158, 0, 26,215, 68, 49, 71, 55,108,125, 61, 46, 87,113, 72, 21,201,197,
-146,144, 75,241,223,235, 41,178,222,123,210, 35, 71,251,169,146, 85,109,178, 41,152,128,120, 68,123, 74,152, 56,177,215, 41,189,
-146, 8, 39, 93, 86, 18,115,156,132,188,166,146, 70,233, 36, 9, 91, 57,147,116, 33,218,229, 41,253, 72,237, 81,174,202,214,184,
- 22,148, 83,184,100, 72,198, 18,109,181, 79,185,147,125, 88, 9, 91,208,135,128, 33,173,244, 83,182,158, 82,228,139,117,172,223,
-109,121,252,240, 3,102,198,243,226,157, 91,124,251,141,111,176,156,181,180, 77, 3, 40,194, 32, 65, 59,179, 90,172,137, 55,111,
-220,228,241,197, 5,222, 7,182,219,142,217,201, 13,154,186,225,226,241, 19, 54,155,173, 36, 51,161,233,124,226,241,229,138,102,
-177, 96,136,129, 95,252,249,191, 68, 63, 6,126,240,171, 63,196,197,147, 39,188,249,230, 91,216,202,242,183,253,240,223,201,216,
-117,100, 37,113,195, 86,105,146, 10,228,216,243,224,193,123,196,113,160, 54,154,110,125,201,195, 7,247,184,127,239, 46, 23,143,
-159, 48,222,127,196,205, 74,172,122,221,144,113, 90, 70,130,147,211,196, 89, 67, 24,189,136,169,178,224,117,167,117,138, 53,142,
- 20, 36, 95, 32,102, 69,214,154, 49, 6, 57,236,172,101, 12, 3,161,184, 8, 70, 95, 4, 71, 74,149,245, 24, 37,195,219,202, 52,
- 33, 79,133, 51, 18,131,136,243,246,143,208,196,100,119,150,122,138,208, 84, 98, 59,155,152,222, 5,135,112,205,163, 44,143,141,
- 46,133, 85, 34, 54,197,251, 91,158,213,164,192, 32,223, 67,241,114,203, 74, 38,202,229, 38, 70,121,191,147, 75,128,141, 71,233,
- 44, 54, 66,165, 37, 65, 48, 37, 48, 6,165, 44,218, 53,132,161, 35,147, 48,202,202,215, 31,163, 52, 18, 51, 77, 12, 1, 21, 53,
- 54,103,178,178, 84, 49, 49,250, 72,240,161,176, 48, 98,129,182, 36,226, 56,136, 5, 77, 35,133, 91, 67, 51,107,168,106, 41, 94,
-174,182,168, 74,149,166,198,178, 88, 46, 81, 74, 83, 85, 21, 93, 24,246, 22, 84, 91,214, 92, 41, 10,105,177,170, 28,131,143,162,
-187,176,142, 24, 16, 33, 46,128,115, 18,135,170, 20,185,160, 91, 67, 8,251,143,105, 61,122,157,228,249,209,132,151,235,199,252,
-161,152,231,107,139, 61, 14,136,214, 9, 89, 86,212,243,195, 24,216,245, 3,205,174, 47, 46, 8, 17,116,106, 99,196, 34, 87,132,
-174, 50,253, 43,250, 28,107,240,209,160,178, 92, 14, 39, 72, 90,126,202,137,197,177, 9,247, 40,109, 78,208,136, 22,157, 45, 58,
-218, 61,100,106,178,169, 82,168,111,170, 8,228,152, 72,146,250, 16,203,178, 95, 95,148, 45, 78, 84,169,196, 72,235, 35,133,253,
- 52,217,148, 14, 94,165, 44,151,129,156, 25, 66, 18, 46,192,197,154, 20, 51,126, 8,156,156,136, 96,208, 8, 7,193, 94, 47,234,
- 71,192,151, 15,235,150,175,199,103,126, 52,156,230, 56,192,229,111, 70, 55,127,252,156, 92, 83, 94,239,181, 13, 83, 12,103, 65,
- 64,106, 35, 7,123,137,110,173,156,140,144, 69, 88, 99,176,218, 97,148,101,183,235,121,114,177,226,135,190,242, 27,185, 61,111,
-232,250,129,119,223,191,199, 55,190,245, 30,239, 61,186,224,193,229,154,157,151,192,128,170,110,121,233,227, 31, 71,161, 25,135,
-145,208, 15, 12, 93, 7,217,227,140, 28,108, 22,141, 50, 10,173, 2, 93,191,147, 32,123, 50,131, 15,251, 31,238,110,119, 1,218,
-176, 90, 95,112,101, 29,173,210,220,123,242,152,147,118, 46, 29, 67, 85,241,217,213,154, 87, 95,254, 56, 79,238,125,192,110,117,
-197,242,228, 38,171,203, 43,254,145,255,201, 63,202,151,191,231, 75,252,193, 63,248,239,241,237,119,222,229,143,252,103,255, 25,
-223,255,253, 95,225,159,254,167,254, 25,254,252,159,255, 73,190,246,181,175, 51,134, 94, 50,211, 53, 40, 55, 99,219,237,120,241,
-197,207, 48,111, 27, 92, 86, 12, 25,198,161,229,237, 7,239,243,213,191,253,135,233,190,246, 11, 52, 78, 17,209,164,104,247,118,
- 54,138,226, 55,151,241,218,132, 74,206,121,194,189, 22, 1, 76, 9,209,217, 43, 72,211,225, 86, 62, 41, 67,133, 43,160, 14,214,
- 32,165,143,160, 13,135,110, 29,196, 99, 29,211,196,139,201, 68,157, 15,225, 40,123,152, 75, 1, 92, 25, 8, 49,224,227, 64, 21,
- 50,117,200,184, 26, 76,149,112, 21, 84, 85,177, 56,218,114,107,206,134,140,116,235,162, 6, 55,147,100,110,159,125,160,209, 84,
- 56,148,146,104,205, 84, 24,214,202, 88, 74, 74, 69,193,170,170, 61,193,112,159,104,151,143,126, 93,124,245, 42, 70,206,239,127,
-135, 71,239,125,139, 59,103,115, 22, 55,150, 52,117,195,208,245, 92, 93,174,184,188, 90,179,221,118,168,156, 57, 89,206, 89, 46,
-102,220,121,225, 5, 78,111,221,228,253, 15,238,243,232,241, 37,171,171, 21,183,110,220, 32, 7,143,142, 35, 58, 5, 1, 79,164,
- 68,232,119, 60, 92, 93,241,242, 39, 94,225,193,221,247,217,172, 87,252,220,184, 37,198,200,147, 39,231, 60,124,244,144,153,150,
-117,205,110, 24, 73,170,230,133, 23, 95,162,105, 91,174,206, 47,121,252,232,161, 48,243,201,248,110, 75,240, 61,202,100,250, 97,
-160,181,142,202, 26,198, 20,217,165, 72,149,101, 91,238,163,172,185, 84, 22, 43, 98,206,106, 31,173,233,163, 39, 68,141, 65, 17,
- 83, 64,103, 87,252,199, 18,218, 81,213, 21,227, 24, 72, 89,188,237,104, 75,223, 7,241, 62,167, 36, 17,172,198,148, 9,103, 57,
-212,224, 40, 89, 78,124,189,131,247, 52,177, 46, 99, 91, 41,252, 41,150, 40, 81, 35,250, 12,125,244, 60,202, 26, 93, 16,164,130,
-245,206, 68,193, 15,138,197, 40, 79, 79,217,254,182, 64,206,146,224, 23, 66, 40,146, 42,176,101,255,172, 85,145,176, 41,113, 75,
-136,158, 65,131,146, 61, 59, 90, 17,162,228, 16,232,202,129,178, 37, 80, 37,137,245, 54,137,159, 61,133,128, 42,218, 17,179, 79,
-212, 83, 88,101, 48, 37, 36, 37, 86,134,232,125,233,206, 51,169,210, 80,176,189, 85, 83, 73,228,103, 91,225, 42,115, 32,215, 89,
-209,204, 24, 52, 51, 87,201,133, 54,202,217,238,156,219, 7, 93, 89,103, 25,131,103,232,123,218,217, 92, 46, 76, 24,198, 16,193,
- 86,132,156,112,214,146, 20,140, 81, 84, 5, 42,136,183,223,143, 30,239,143,139,250,245,110, 83, 29,219, 96,167,243,225,175,231,
-184,127,170,113,204, 89,228,170, 99, 76, 48,122, 92, 55, 80, 91,131,179, 2, 94,202, 57,203, 68, 77,137, 24, 82,112,222,165, 81,
-209,147,237,241,218, 59,254,163, 39,196,211, 58, 96,143,142, 45, 5,219, 84, 82,103,242, 81,134,201,113,160,152, 50, 7,187,238,
-196,179,184, 70,155, 59, 96,237, 50,250,154,221,245,186, 62, 71,239,129, 87, 70,155,253, 37, 73, 23, 80, 88,200,138,109,239,201,
- 23, 87,140,227, 64, 93, 87,162, 65,146, 23, 64, 93, 19,163, 61, 45,102,248,176,174,252,195,254,253,184,224,127,120,134,246,223,
- 28,143,251,211, 75,130, 92,200,109,211, 27, 82, 44, 40,114,149, 79, 90,210,217, 42, 43,105, 73,163, 31, 25,148,230,198,217, 45,
-140,171,240,222,243,157,247,222,231,191,250,147,127,134,215, 94,125,129, 15, 62,184,207,189,251, 23, 92,109, 6, 66, 82,120, 52,
- 41, 91, 78,110,220,230,133, 23, 63, 70,138,158,110,125, 69, 26,118, 60,119,182,224,149,207,190,200,114,217, 50, 95,204,196,235,
- 27, 37,187,125,183,235,216,238,182, 44, 78,150,248,148,121,247,253, 15,120,235, 59,239,179,237,250, 61,235, 58, 43,195, 54, 68,
-242,172, 37,249,145, 52, 40,174,186, 45,205,233, 41,219,190,227,239,254, 45,127, 55, 31,188,253, 6,119,223,251,128, 71,151,151,
- 12, 99,228,207,252,233,159,224,183,252,189,127, 15,255,194,191,248,251,248,183,255,157,223,207,106,187,225, 39,127,234,207,243,
-237,239,188,195, 63,244, 15,254,131,252,173,191,241, 55,242, 95,255,215,255, 37,119,239,190,203, 48,116, 40, 51, 67, 69,232, 2,
- 60,186, 92,115,182,108, 89,123,197,207,191,254, 30,203, 59,175,210, 46,206,196,159,173, 34, 74,101, 70,101,136,200,206, 45,150,
-219,124,136, 1, 19, 21, 65,139,151, 63,151,157,220,225, 25, 72,207,132,182, 80,216,255,135,203, 96,190,198, 84, 46, 57,134,135,
-212,182, 41, 4, 48, 79,221,127, 56, 2, 2, 31, 84,176,199,183,105, 93,232, 92,117, 93,211, 54,129, 89,155,136, 81, 83,103, 75,
-133, 19,222,182,170, 48, 90,242,174,181,171,228,112, 53, 71,118,146,189,232, 79, 20,207, 89, 75,128,131, 20,251, 98, 19, 49,210,
-153, 83,198,104, 73, 29, 82,236, 14, 72, 98,245,108,111, 34, 39, 11,143,238,189, 71,149,119,220,123,251, 27,220, 79,129,223,252,
-155,255, 46,124,204,188,255,198,155,212, 77,203,174,144,178,172,181,216, 33, 80,213,137,166,117,104,231,120,225,197,151, 88,239,
- 70, 98,244,144, 2, 58,121,108,142,132, 41,178, 49, 8,200,229,124,179,225,209,189,251,156,222,188,193,227,135, 15,184,124,244,
-128,170,174, 81,192,246,242,130,159,250,137, 31,167, 46, 98,179,213,102, 71,238, 55,188,250,234,171,248,237, 57,111,252,210,207,
- 81, 91,205,173,179, 19, 82,202,124,251,238, 61,238, 62,184,199,195,139, 21,207,147, 73,141,101,200,176,141,129, 62, 38,218,146,
-220, 5,224,135, 32, 93,127,140,120,149, 73, 74, 19, 66,201,145, 63,112, 55,112, 6,118, 33, 80, 23,161, 99,191,235,100,111,157,
-196, 37,225, 51,152,114, 67,119, 90, 81, 85,166, 64,167,142,139,114,249, 59,125, 33,132,133, 88,198,209, 73, 98,116, 17, 59,157,
-113,134, 28, 19, 33,121,220,145, 29,143, 44,121,239, 49, 75,146, 88, 82,145, 52,137,102,141, 41,145,181,105,111,171,242,251, 81,
-191,221,239, 58,141,177, 34,200,211,197,169, 81,126,173, 74, 80,142,114, 26, 76,222,143,109, 15,211,197, 50,221,113,149,124,173,
- 5,145, 58, 17,215,178, 31,101,162,100, 28, 57,136,243, 39,149,105, 80,178,134, 96, 32,232,140, 85,145, 28,188,124, 46,228, 18,
- 81,183, 13, 85, 83, 97, 42, 67,214,133,207,160, 21,211, 0, 44, 75, 5,192,104, 75,223, 15,164,148,104,219, 22,239,165,232,165,
-224, 81, 10,134,221,192,114,126, 34, 58,146,148,240, 73,163,156,198,199, 32, 23,187, 24, 8,101, 31,157,125, 96, 28, 70,198, 97,
- 44,185,243,161,236,212,205,181, 6,144,163,105, 94,254,144, 44, 8,173, 37,113, 79,231, 41, 22, 91, 95, 27,183, 63, 19, 28,118,
-141, 76,151, 24,134,192,214, 14,114, 33, 42,180,202,186,174, 69,232, 87,242,198, 39,114,157, 86,106, 31,193, 45,164, 56,245, 93,
-106, 76,222,135,176,236,199,235,186,136, 80,141,189, 86,227,174,223, 66, 14,163,245,195,173,230, 89, 72,139,220, 25,115,193, 24,
- 23,240,213,181,194,126,200,107, 48,214, 96, 1,147, 4,144, 54, 33,106,173, 51,232,202,146,181,161, 31,101, 13,150,201,216,186,
-114,135,104,238,227,130, 94,110,184,233,104, 7, 18, 11, 10, 53, 23, 8, 11, 71,121,219, 40,245, 76,178,215,241,247,163, 10,139,
- 93,237,243, 98,143,198, 30,197,210,150, 21, 79,135,122,126, 36,131, 92,125,200,139, 41, 63, 3,189, 7, 24,164,156, 5,250,144,
-165, 75,108,172,193, 39,133, 81,150,147,229, 41, 85, 91,113,118,227, 20, 63, 26, 30, 92,172, 56,191,188,194, 89, 75, 86,153, 16,
- 69,237,174, 82,197,199, 95,254, 4,203,121,195,184,187,130, 48,240,153, 23,111,241,137,151, 62,199,199, 63,246, 60,143,238,127,
-192,147, 39, 79,184,119,254,136,243,203, 21, 87,235, 29, 40, 75, 24, 7,172,206,124,236,197,231,121,233,227,175,242,210,115,119,
-104,170,138,229,233, 13,238,222,127,200, 59,239,221,101,181,217, 17,149,162, 31, 50,139,166,102,187, 93,241,137,151, 94,230,147,
-175,126,156,247,223,121,135, 95,252,133, 95,228,135,255,142,223,204, 39, 63,253,121,126,246,103,126,138,203,203, 13,231, 31,220,
-229,143,255,177, 63,206, 63,242, 35,255, 56,255,218,255,238,223,230, 95,249,125,255, 2,187,221,134,247,222,123,135,127,255, 15,
-254,251,252,250,175,252, 32,255,252, 63,255, 47,241, 99,127,242,199,248,229, 55,126,153,111,126,243, 45, 84, 54,220,123,231, 46,
-172, 46,168,102, 13,239, 62, 94, 81, 47,159,227, 43, 95,249, 44,111,188,254,117,130,239,167, 0,194, 18,151,150,100,142,158,216,
-131, 34,116,144, 7,198, 24,117,200, 62,191,166, 82, 45,251,244,114, 25, 56,206, 28, 63,236,204, 11,170,180, 20,111, 81,195,170,
-242, 49,189,137, 14, 69, 86,232, 75, 7,204,103, 86, 7,230,191,100, 33, 91,154, 70,192, 42,117,210,100, 44, 74, 87, 24, 83,227,
-234, 6, 87,181,104, 87,163, 92, 13,174, 42, 36,166, 90, 66, 92,140, 69,219,114, 75, 46,163,251,125,194, 92,121,142, 20,182, 28,
-198,121,207,160,103, 74,168, 83,135,160,169, 61, 72,167,188,103,140,202,144, 4, 56,242,238,183,191,141,238,206,121,225,102,203,
- 11,183,207,248,198, 55,190,201,189, 15,238,177,186,184,228, 91,111,125,155,219,207,189, 72, 68, 81,215,141, 48,170,163,167,239,
-119, 52,245,162,168,105,229, 48,218,118, 61,221,110, 71,165, 19, 70, 69, 44, 69,157,159, 50,195, 32,161, 54,235,213,154,118, 54,
- 99,232,122,118,126,196,123, 79, 8,145,245,102,205,108, 54,227,206,157, 59,248,186,226,242,201, 57,239, 40,232,214,151,108, 55,
-107,174,158, 60,228,198,141, 19,110,222,248, 56,174,174, 89, 15, 3,223,122,251,109,134, 97, 36, 87,154,117,231,217, 40,197, 42,
-101, 28,226,156,144, 49,108,137, 69,214, 9, 67,198, 23,207,242,224,161, 31, 18, 78, 37, 17,170, 41, 77,109, 21,102,200,152, 44,
- 49,158, 99,200, 36,157,137,217,208,197,184,143,183,157, 84,198, 19,148, 67,198,168,121,191, 35,165,116,220,130, 36,150,206,127,
- 28, 70, 12, 80, 57,139,114,142, 17, 47, 33, 48,198,146, 40,177,206, 26,114, 10,196, 80,230,240,197,151,157,147,136,218, 38, 37,
-178,116,251,153, 20, 18,193, 75, 81,207, 33,144, 66, 32,199, 67,226,164, 8, 26, 37,196, 69, 89, 43,126,120,103,161,150, 73,221,
- 20, 80,111, 93, 75, 10,126, 2,102,148, 34, 26,166,210, 39, 29,117, 46, 99,221, 44,151, 19, 85, 14,122,148,162,178,197, 71, 30,
-189, 20,127, 43,196,196,233,156, 52,214, 82,183, 45,218, 57,112,138,100, 74,135,169, 21, 36, 15, 99, 79, 26, 71,198,174,195, 76,
- 19, 56, 37,175,161,177,194,136, 8, 94,180, 70, 35, 80,217,134, 49,102,198,177, 71, 89, 75, 8, 81,114, 17,156,149, 49, 59, 74,
-194, 93,124,241,140,143, 35,195, 24, 36, 15, 64,179, 23,187, 29, 9,198,247,240,182, 61, 74, 57,171, 61,169,109, 31,144,178, 47,
-178, 82, 23,210,113, 29,226,217,105, 94,206,194,142,240,163,162,211,194, 79,208, 74,162,109,235, 16,177,133,212, 54,173, 47, 82,
- 76, 71,217, 32, 83,202,228,148,177,126,172,122, 63, 26,243, 31, 97, 95, 49, 90, 66, 85,172, 21,180,178, 50, 69,208,150, 15,106,
-121, 37,171,225,163,132,172,167,102, 1,121,175,238,167,104,143,242,132,205,156,240,211, 28,162,197,173,214, 56, 99,168,140, 61,
-180, 55, 74, 97,157,197, 90, 9,156,170,139, 64,212, 32,221,124,202, 9, 91, 87,118,143,136,204, 89, 61,181, 63, 47,251,132,105,
- 89,159, 19, 49,196,114,208, 7, 98, 25, 33,164,124,204,121, 87, 71,204,176,227,162,126, 56,252,164,176,155,253,218,254, 56, 93,
-141, 15,217,167,231,167, 43,249,135,117,254,234,200,138,160, 14,170, 69, 48,133, 40,151,133,130, 53, 42,206,206,110,113,251,214,
- 29,218,185,163, 31, 94,229,253,123,239,179,219,238,112,201, 99,114,121, 33,109,230,198,157, 23, 88,220,184, 77, 55, 38,116,222,
-241,133,215, 94,224, 75,159,251, 52,227,230,146,111,191,245, 22, 63,254,245, 95,100,181,222,162,141, 37,145,184,220, 14, 60, 90,
-143,104,103,137, 62,112,115, 86, 19,222,189,199,119,222,127,196,249,106,139,210,112,235,198, 41, 57,195, 23, 63,253, 42, 87,151,
- 43, 30,156, 95,241,100,189,193, 84,134, 79,124,226, 69,126,211, 15,253, 16,163,207,252,210, 55,190, 78,192,242,223,254,196, 79,
-243,213,191,229,215,242, 59,255,129,223,193, 31,251,191,255, 95,249,224,254, 99,170,118,198,159,248,127,253,183,252,147,255,212,
-143,242,191,254,231,127, 31,255,251,127,247, 15, 48,250, 45,253, 85,199,127,247,227,127,134,183,190,115,151,255,213,255,242, 95,
-228, 51,159,255,181,252,244, 79,252,105, 30,191,243, 54,231,239,125, 64, 88,159,209,222,186, 77,123,114,135,182, 50, 60,122,247,
-117, 78,218, 36,129, 12, 49,227, 35,132, 36,147,141,132,240,188,149, 79, 48, 89,152,244, 20,206,195, 33,163,248,153,124,241,130,
-121, 76, 71, 8,216,242,198,165,236,158,229,141,165,247,221,203,222,147, 90, 18,220,246,194,187, 28, 65,165,253,159, 73, 69,220,
- 54,125,158, 54, 75, 80, 72, 72,185, 16,165, 42, 73,101,115,226, 83,214,206,161, 92,133,114, 66, 92, 83, 86, 86, 11, 74, 59,180,
-177, 40, 43,243,211,148,101,231,169,212,180, 54, 82,251,175,109,218,245, 75,230, 77, 57,172,138,127, 53, 23, 36,176, 36,199,141,
- 37, 56, 38,179,126,252,144, 86,121, 82,240, 60,126,235,107,196,245, 35,238,124,254,179,124,242, 19,159,228,221, 15,158,240,250,
- 55,191,133,246, 29, 23, 87,107,134, 44,232,208,155, 55, 12,179,198,201,222, 56, 12,140,131,101,182, 88,226,180,102, 49,155,241,
-248,193, 67, 54,171, 43, 78,230, 53,149,211,248, 33,161,115, 34,120,207,118,183, 35,219,154,113, 24,120,244,224, 17,119,239,222,
- 37,133,145,211,179, 83, 22,139, 5,198, 40,174, 86, 87, 60,120, 16,153,207, 37, 52,102, 49, 95,112,229,206,247, 23,250,211,211,
-155,108,186,129,171,123,247,185,247,193, 61, 54,151, 87, 56, 35,135,240,106, 8,108,172, 97,173,160, 81, 80,165,196,152,160,213,
-154,193, 71,234, 70,227,140,162,239,165, 67,206, 25,252,152,137, 85,162, 41,249,226,139,153,231,106, 8, 24,163, 8, 57,227,209,
-100, 29,241,209, 50, 36,193, 52, 43,163,174, 93, 20,149,150,203,214,190,225,136, 7, 11,149,144,193, 52,222, 39, 58, 58,129,252,
-228,102,191, 10, 42, 97,158, 40, 28,198, 30, 8,148, 33,142, 24,103,229,194, 25, 35, 89,137, 29, 47,169,140,182, 78,254, 30,159,
- 8, 99,196,143, 98,129,138, 33,144,252,136,202,177, 60,175, 10,109, 42,249,176, 21,198,214, 96,107,116, 93,201, 51,229,148,132,
- 6,121,128, 81,148,214,169, 76, 86,202, 74, 64,133,120,180, 74,148,192, 39,116, 36,251,176, 7, 23, 77,228, 65,152, 38, 72,138,
- 62, 69,234,217,172,252, 25,133,113, 53,186,170, 68,252, 89, 41,148, 77,228,108,228,232,235,131, 40,242,135,129,237,213,138,218,
- 54, 82,140,116,102, 12, 18,218, 98,180,193,102, 67, 76, 1, 91, 59,161,218, 70,131, 31, 3,201, 56, 98, 62, 52, 97,193,123, 66,
- 66,112,213, 33,209,123,207, 48,122, 6, 47, 29,188, 41, 86, 98,246,105,102, 89,176,202,121,154, 4,151,157,243, 94,229, 61, 69,
- 47,235, 82,248, 15, 11,182, 61,164,102,191,214, 59,106, 30,143,234, 64, 8,145, 97,244,123, 48, 89,204,153,161,138,184,114, 73,
- 10, 69, 84, 23, 98,220, 99,169,247, 21, 42, 23,218,100, 62,164, 64,102,117, 32,158,230,107,236, 83, 25,171,103, 37,107,185,125,
-148,120,190,158,100,122, 56, 51,142,226,151,143,167,217,164,242, 61, 31,160, 85, 73,101,146,202, 34,170, 60, 10,144,153, 58,114,
-103, 77, 25, 20, 30,224, 55,117,229,168, 43, 71, 85,137,128, 89, 21,187,111, 74, 9,235,172,221,147,176,184,118,235, 80,135,208,
-141,163, 66, 31, 66, 40, 35, 89, 83,198,179,105,175,126, 60, 22, 24,236,173, 74,215, 34,113,202,155, 86, 29,190,169,167, 67, 94,
-126,181,169,112,215,235,123, 62,112,195,201,251, 12,248, 12,232,218, 49, 95, 44,202,109,199,136,247, 90,105,116, 78,244,227,134,
-190,207, 96, 22,124,254,139,127, 11,243, 69,203,221, 15,222,230, 83,159,120,142,143,191,252,121,238,190,243, 46,223,120,253,155,
-188,255,157,183, 56,127,114,193,217,141, 37,102,214,114,113,126,197,173,147, 22,103,165, 24,249, 32,123,180,237, 48,210,214,150,
-109, 63, 48,196, 64,242,208, 63,124, 66,202,112,247,209, 57, 31,123,233, 5,190,242,149,175,240,206,187,239,242,238, 59,239,112,
-255,241, 5, 63,253,243,127,153, 7, 23,151,156,175, 59,176, 21, 47,119, 91,214,171,115,116, 50,252,125,191,227,119,243,127,249,
-195,255, 39, 30, 61,124, 27, 99, 45,255,207, 63,246, 95,240,219,255,129,223,206,147,203, 39,252,123,255,254,255,161,196,102, 6,
-190,249,198, 55,248, 87,255,181,255, 45,255,198,239,255, 3,188,242,226,239,226, 79,252,177, 63,202,176,190,228,254,189, 15, 56,
- 83,138,187,111,191,197,103, 63,253, 42, 58,246,244,219,142, 56,110,241, 99, 34, 68,161,104, 9, 89, 53, 18, 16,187,210, 48,193,
- 87,212, 20,176, 80,198,175,249,200,131,122,116, 17, 76, 37,103,125,122,142, 20,234,232, 89,143,251, 8,195,169, 53,218,191,153,
- 39, 62,249, 53, 3,124,161,197, 77,221,214,193,151, 69, 42,185,246,198, 72, 12,102, 93,215,212, 37,126,177,106, 26,234,186,198,
- 85, 98,243, 80, 86,188,229,170, 0,140,148, 78,211,167, 17, 81, 16,177, 28, 24,229,162,161, 10, 44,166, 76, 13,210,244,126,200,
-215,239,224,186,172, 17, 12, 17,162,116, 68,111,252,226,207,240,252,188,226,249,219,183,248,220,171, 47,242,205,191,114,151, 95,
-254,218, 95,229,236,206,139,132,126,199,235,111,191,201, 75,207,221,226,228,236,148, 49, 36, 54,155,181, 60,139,102, 73,240,138,
-104, 29,163,247,204, 81, 84,206,176,152, 53,228, 48,208,109,215,204,108, 36,102, 65, 24,143, 17,214,235, 21,219,245,138,122,190,
- 68, 43,197,110,183,101,189, 94, 3,137,186,109,153,207, 21,179,197,130,140,162,170,107,230, 51, 1,184,156,156,158,144,149,102,
-183,219, 8, 47, 65,107,250, 97,100,181, 94,163, 20,188,252,177,151,185,124,255, 62,179,232,121,252,228,146, 93, 8,140, 17, 42,
-205,190, 67,143, 49,147,124,134,214,144, 20,100,163,165, 11, 53, 10, 31, 50,149,171, 32,139,224,109, 62,111,137, 23,107,146,201,
-248,156,132,236,135, 60, 79, 49, 20,214, 63, 7, 42,223,158, 38, 89,122, 42, 97, 7,132,253, 28, 39, 5,217,171,107,113,177, 98,
-143, 89, 21,216,253,161,157,139, 58, 95,246,253,210, 31, 7,239,139, 13, 43,239,145,210, 86,110, 48,114, 62,165, 36,123,108, 63,
- 50, 12, 3, 33,248,195,249, 22, 39,190, 68, 81,230, 91,183, 39,248, 41,235, 80,206, 8,210, 43,151,120,155,161,180,175, 49,239,
-139, 53, 49, 19,125,220,219,162, 38, 70, 67, 46,236,115,229, 71,121,178,140, 17,166,132, 22,155,103,170, 43, 90, 43,232, 86,241,
-191, 27,148,115,162,166,159, 28, 24, 90,163,188,116,252,132, 72, 30, 70,178,143,172, 47,215,130,230, 45,100,197,113,236,101,103,
- 75,198,217,138,193, 15,178,206,170, 43,238, 63,186, 39, 56, 88, 36,149,210, 56,209, 84, 8,136, 71,240,174,163,143, 12,165,168,
-123,127,136, 71,229, 40, 65,243, 88,103,114, 13, 43,173,132, 90,137,150,122, 99,203,205,114,130,206,100,100, 42, 28, 75,243, 16,
-139,221,109,234, 98, 39,124,172, 42,122,157,148, 50,227,232, 11, 88, 62, 81, 85, 65, 10, 97,105, 86,199, 16, 24, 75,168,203,177,
- 86,108,175, 17,123,134,247,206,179,150,221, 2,221, 58, 38,198,125, 88, 66,229, 71, 69, 87,239,215, 71,251, 73,198, 81,173, 59,
-254,159,150,191,203, 28, 81,233,172,145, 21,160,181,186, 68,218, 90, 41,232,206, 74, 81, 55, 70, 8,140, 5,201,109, 37,103,120,
-130,134, 28,122,235,167, 85,188,211,136, 53, 70, 67,138, 18, 73,233, 75, 65,151, 66,159,246,187,236,105, 15,118, 80,208,231,195,
-245, 71, 29, 5,174,252,127,197, 34, 87,172, 74,228,253,140,120,175,198,173, 28, 89,213, 68,149,209, 70,179,221,174,209, 10,156,
-214,244,187,142,182,210, 44, 78,102,124,242,211,223,135,113, 51, 30,221,191,203,223,246, 27,126,128,231,111,183,252,197,159,253,
- 57, 30, 60,120, 76,101,160,235,119, 84,141, 40,130,183,187,142, 93, 31,104, 77,199,114, 57,199,173, 6, 98,148,120,203,152,224,
-201,213, 22,175, 20, 67, 57, 19,116, 58,224,118,222,189,255,136,199, 23, 43, 42,173,185,121,227, 12, 87,215,188,254,198, 91,244,
- 49, 98,218, 22, 21, 53, 15, 31,220,163,223, 4,254,212, 79,252, 52,187,224,249,135,127,247,143,240,211, 63,249,227,188,243,230,
-123,220,197,240, 19, 63,241,231,248,189,191,247,127,198,232,119,252, 7,127,240,255,184, 31,233,221,123,240, 30,255,202,191,254,
-175,242,239,252, 27,191,159,175,254, 29, 63,204,127,247, 95,253, 87,220,185,243, 2,221,106,205, 15,126,241, 11,204,102,134, 52,
-110,233,194,134,152, 70, 82, 18,238,117,156,214,127,229, 22, 26,163,108,136,212,196, 77,159,158,147,242,179, 84,124,152, 75,226,
-152, 20, 56,133,178, 28, 44,105, 50,190, 62, 8,213,246,123,116,241, 8, 28, 88,210,185,132, 67, 24, 25,195,235,107, 98, 17,133,
-115,226, 81,157,118,197, 85,101, 5, 52, 81,201,131, 47,192,151,242,166, 75,185,140, 54,165, 64, 68, 47,178, 39, 83, 73, 66, 27,
-202, 2,150,164, 4,227,200, 68,154,154,110,240,165,203,216, 43, 51, 73,104, 50,201, 15, 12,219, 43,172,239, 80, 42,114,249,224,
- 33, 15,223,250, 6, 55, 95,121,129,109,220,210,141,129,216,111,121,251,157,247,248,190,211, 91,204,106,203,110,179,230,188,114,
-184,197, 9, 89, 69,250,190,231,234,242,130, 74,103, 76, 14, 56,187,164,138,145, 24, 37,208,103,222, 84, 56,157,217, 94, 93,210,
-154,196,234,234,146,110, 76,140, 49,243,238,221,251,120, 12,237,124, 78,219, 52,116,151, 59,110,223,190,205,124, 33, 92,248,237,
-110, 71, 85, 85,156,156,158,177, 88,204, 9, 33,210,204,230,135,206, 53, 36,140,117,251,176,160, 27,183,110,113,235,185,231,121,
-180, 56, 71, 15, 3,219,199,143, 25,140,226,241,227, 43, 60,169, 36,177,201,138, 37, 23, 84,168,236, 89, 51, 73, 73,230,118,202,
-146,212,150,146,194,232, 92,120,220, 6,159,215, 36, 50,157, 31,139,224, 80,151, 16,160, 61, 70, 30,163, 53,174,146,152, 90, 82,
-198, 76, 36, 67,178,116,202,169,124,228, 76,223,245,144, 18,166, 50,140,218,160,181, 47, 63, 95,201,180,119, 70,239, 19, 8,115,
- 54,168,168, 75,206,125,185,108,202, 76, 94,186,196,164, 24,250,158, 16,179, 4,218,120, 47, 35,119,239,137,126, 36,134,233, 98,
- 32, 89, 1,146,124,105, 37, 95,221, 88,137,241, 53, 14,140, 4,200, 40, 51, 69,252, 78,139,237, 88, 96, 79, 17,178,222,163, 87,
- 21,162,211,152,138,150,214, 78, 6,195,229, 34, 48, 77, 63,149, 86,184,170,194,100, 89, 41,152,178, 78, 18,152,146, 76, 84,115,
- 10,232,193,147, 67,134,232, 81, 33, 16,255, 63,180,253,217,147,101, 87,118,230,137,253,246,112,198, 59,249, 28, 30, 51, 2, 9,
- 36,144, 3,115, 6,147,243, 88, 85,100,145, 44, 14,213, 53, 88, 85,203,164,146,117, 61,182, 76, 50,153,254, 0,246,131, 30,101,
-146,245,131, 76,166,150,153, 36,211,216,234, 50,171, 42,235, 26,154, 85,236, 34,153,153,100, 50,153,137, 4, 18, 51, 16, 0, 34,
- 16,163,207,126,231,123,166,189,183, 30,246, 62,247, 94,143, 8, 36,201, 86, 9, 48, 55,120, 4, 60, 60,220,253,158,115,214, 94,
-107,125,223,239, 43, 74,108,213, 48, 62, 31, 7,159,181, 96, 49,155, 7,104,146, 8, 92, 0, 79,213,139,226,152,218, 25,156,242,
- 16,175,166, 41,177,196,200, 88,209, 24, 95,196,141, 49,126,229, 81,215, 20,101, 77, 89,249,172, 0, 16, 68, 90, 61,181, 30, 93,
- 38, 49, 98,195, 40,219,121, 62,185,246, 32,160,118,101, 42,150, 1, 92, 97,133,103,140,135,175, 24,223,125,218,165,197,109,173,
-151,176,118, 57,219, 55,198, 80,215,254, 9, 83, 55,214,187,127,194,178,175,105,140,231, 37,212, 13,198,154,213,243,107,173,152,
-187, 53, 52,249,147,135,144, 37, 71, 67,138, 39,132,128,226,169,102,244,201,229,240,179,180,101,206, 61,225,232, 18, 23, 67,178,
-124, 71,206,114,167,174,131, 75, 71, 71,146, 36,142,137,219,162, 30,107,226, 72, 7, 70,134,215,166, 88,107, 3, 32, 44,112,137,
-215, 79, 38, 79,170,240, 90,113,147,181, 46,228, 69, 27, 31,228, 16,148,161,198, 88, 76,227,179,164,253,219,202,110,244,228, 1,
- 72, 60,113,124,123,246, 55,238, 62, 85,100,247,227,172,111,254,251, 8,187,144, 86,129, 29,112,164, 82,107,112, 62, 14, 52, 78,
- 34,148,140,232,228, 41,139,197, 28,165, 98, 16, 25,183,158,255, 12,105, 46, 40,203, 51,126,253,111,125,147,217,249, 9,223,254,
-247,223, 99,182,152, 96, 22, 83, 68,150,161,133, 65, 7,149,105, 81,248, 76,114,157,104,170,198, 95,100, 89, 22, 81, 86,126,143,
- 86, 89, 71, 45,188,232,197, 45, 25, 76, 46, 92,227,134,170,153,163,112,204,138, 5,159,255,220,203, 60,127,235,121, 62,248,224,
- 67,206,207,199, 94, 21,171, 34, 38,147, 51,238, 61,254,136,239,255, 80, 51,153,205,120,229, 27,191, 72, 57,254,215, 28,156, 62,
-228,221,183, 51, 58, 29,197,243,183,158,163,223,239, 51, 28,158,135,241,160,230,224,224, 49,255,135,255,234,191,226,127,245, 63,
-255, 95, 48, 58, 27,241,189, 63,249, 35, 18, 21,113,244,201, 61, 58, 29,205,214,165, 46,150, 10, 43, 93, 24, 97,179,220, 7, 53,
- 97,183, 40,132, 69,216, 85,103,106,157, 93,187,160, 87,188,246,165, 34, 93,248, 40, 64,127, 48,144, 23, 2,121,214,116, 51,126,
-220, 45, 85,208, 64,132,155,194,173, 20,166,237, 56,190,253,179, 74,234,181,223,247,187,125, 21, 8, 98, 82, 43,111, 61, 87, 97,
- 76, 31,188, 34,206,134,194,216, 42, 85,195, 3,101, 60, 62,231,232,224, 17, 74, 74,186,189, 14,151,111, 61,231, 81,139, 34, 6,
-153,248,245, 67,232, 80,252,181,161,137,178, 20,129,242, 63, 11,107,113,182,166,174, 23, 60,252,248, 99,206, 31,223,227,250,238,
-128, 84, 43, 30,124,240, 62, 7, 31,223,102, 96,103,140,147, 24,135,226,228,228,156, 71,143, 14,232,124,240, 62, 66, 56,226, 36,
- 97, 56,158,178,219,219, 8, 57,227,150,170,158, 51, 60,247,254, 99, 37,125, 56, 68, 89,204,201,179,140, 60,141,217,217,220,228,
-240,224, 17,216,138,249, 98, 65,103,176, 77, 57, 43, 56, 61, 59, 99,119,255, 10, 73,146, 16,167, 25,231,195, 49,189, 16, 0,145,
-101, 25,163,209,136,197, 98,225,147, 0,175, 92,165,170, 60, 3,123, 62,159,179,189,189,197,254,254, 62,247,238,223,227,202,149,
-171, 44, 22,115,164,194,163, 55,211,148, 36, 75, 57, 19,150,141, 75, 59,236, 40,197,244,193, 49, 38, 64, 64,140,241,211,175,198,
- 16,128, 62, 14,219, 24,159,197, 32,253,255, 47,203, 38,100,141,107,210, 88, 16, 73,144, 74, 80,154, 21,224,200, 88, 23,246,203,
-225,160,164, 60, 72,166,141,246, 80, 82,160, 5,248,144, 73,207,156,104,240,193, 41, 18,129, 17,146, 70, 10,106, 97,144,162, 34,
-144, 69,124,183, 45, 9, 22,159, 8,156, 69, 42, 31,241, 42,148, 71,231,214,117,237,109,166, 65,235, 81,215,181,143,144,109,124,
- 66, 98, 93, 86,152,166,161, 41,107,172,115,193, 71,220,230, 98,251,206, 95, 71,177,199,115, 42,239,148,240,221,183,195,136, 38,
-120,149,181, 47,186,117, 19,106,187, 47,248,182,197, 43, 7, 95,179,223,131,107,144, 33,183,188, 49,190, 33,177, 97,100,219, 54,
- 86, 38,160, 74,149,143,224,116,194,219,242,104,157, 75,117,131,171, 26,132, 53,184,166,194, 25,139, 41, 13,139,233,130, 56,138,
- 40,202, 10, 99, 26, 86, 2,233,128, 78,109, 28,105, 22,161,226,136,218, 54,104,161, 88, 20, 11,154,180,231,161, 92,225, 57, 95,
-214,134,170,241, 59,244, 42, 8, 22,141, 9,216,238, 16,204,180,116,126,180, 55,187,244, 54,223,214, 17,227, 59, 79, 17, 82,225,
- 2,113, 82,171, 48, 8, 89,227,188,215,134,186, 33, 76, 85, 46, 6,129,121,241,164, 13, 28,121,187,124, 43,171, 26, 33, 26, 31,
-145, 27,198,106,141,241,217,236,237,116,198,173,249,228,219,189,253,133,181, 55,159,214,177,203,149, 10, 94,170,139,182, 59,177,
- 22, 55,254, 12,187,246,143,167,165,174,144,186, 79,199,214,134,132,192, 48,134, 79, 34,159, 27,159, 36,109, 97,247,220, 5,161,
-252, 51,216, 90,131, 38, 72,254,151,123,234, 16,204,161,130, 81,191, 61, 45,136, 53,219,146,167, 8,153,229,232,189, 49,205, 18,
-171,233, 95,100,127,202,106,140, 13,191,239,213,158,118,201,212,181, 23,208,162,127, 85,184,205, 95,165,147,111,156, 68,171,246,
-103,189, 28, 23, 96,133,240,157,131,138,200,179,156,110, 55,231,227,143,238,242,224,193, 29,207, 76,126,249, 39, 56, 61,155, 51,
-216,232, 81, 86,167,124,227, 43, 47,112,248,240, 61,222,248,193,155, 12,143,167,164,169, 67, 42, 75,148,167, 36,221, 46, 69, 99,
-121,116, 52,162,177,150,110, 63,103,180,168,153, 22, 37, 72,207,175,182, 97, 80,168,180,246, 41, 77,202, 43,132,215,167, 60,173,
-205,198, 2,206, 52,188,249,246,123,124,230,230, 13,254,206,175,253,109,110,191,247, 1,227,209,132,163,209,156,210, 22,140,199,
-143, 57, 58,233,147, 38,125,110,236, 95,227,103,126,233,151,249,227, 63,250, 99, 30,220,125,159, 63,251,246,127,199,253, 71,159,
- 96,108,179,138,209,116, 22,225, 42,222,120,235, 13,254, 55,255,229,127,201,255,250,191,248, 47, 56, 61, 62,225,224,195,247,112,
-179, 33, 7,143, 14,125, 98,212, 32,193, 42,135,105, 73, 72,237,202,226,194,177,107, 5,152,145,226,217, 39,213,229, 69, 40,130,
-158, 92, 60, 89,212,131,215,179,181,181,137,150,176, 36, 87,163,119,199, 90, 81, 95, 33,100,219,160,132, 86,135, 97,157, 91, 37,
- 37,105,129,210,120,209,155,106,199,252,190, 40, 27, 83,135, 61,125,131,108, 26,132,112,156,157, 30,240,198,107, 63,160, 46,231,
-236,110,111,241,167,239,191,199,111,254,222,239,209,219,189, 68, 62,216, 3, 81, 99,132, 98, 60, 58, 99,115,163, 71,234, 12, 56,
-133,152,207, 65, 72,234,217, 2,217, 52,200, 88,161, 92, 77,206,130,121, 61,165, 60, 93,160,147, 4, 51, 29, 83, 76, 39, 76, 38,
- 51, 54, 58, 57,231,231, 35,110,127,116,151,247, 63,254,132, 90, 68,108,110,109,147,230, 25,103,227, 5,101, 93,123, 46,187,105,
-192, 90,138,197,130, 97, 40, 74, 90, 57,104, 74,154,126,159, 88, 69, 92,190,188,207,100, 50, 38,237,118,216,187,118,147,254,198,
- 46,227,241,132,135, 71, 39,108,109,111,163,226, 24,135, 32,201,114,226,204, 11, 5,187,253, 62, 55,111,221,194, 58,199,240,124,
-200,222,254, 62,198, 24, 30, 62,124, 72,127, 99, 64,148,248, 56, 83, 7,204, 22, 5, 73,146, 82,214, 11,178, 44, 99,120, 52,164,
-172, 74, 26, 28,249,160,207,213, 56,227,232,116,140, 89, 84,126,252,238,189,138, 32,125, 66,155, 13, 1, 32,206,212, 8,225,131,
-129,140,245,129, 41, 58,142,137, 26, 71, 55,209, 56,211, 80, 57,208, 65, 0,232, 39,170,110,137,236,245,226,103,175,215, 81,194,
-250,192, 22, 17,160, 68, 56,156,109,112, 13, 56, 29, 33, 92,236,139,183,113, 52,194,132,161,160, 11,188,138, 16, 16,238, 86,177,
-153,203,107,214,250, 76,121, 0,219, 24, 31,196, 22,132,115, 77,221,248,213, 70,240,195,155,160,228, 23,107,170, 94, 29, 14, 42,
-173,245, 83,170,216, 23, 89,169,188, 51, 68,218,176, 63, 23, 72,169,151,221,157, 23,163,152,149,166, 74, 71, 33, 60,104, 37, 15,
-183,206,171,215, 81, 62,202,117,217,216,132, 6, 80, 69,145,135,212, 90, 31, 22,132, 18, 8,235, 35, 94,133, 53,184,218,224, 26,
-131, 48, 13,212, 53,174,174,153, 79,103,148, 69, 77,154,118,169,235, 41, 90,235,101,186,162, 16,146,249,162,242, 43,172, 56,163,
- 52,150,198, 89,104,252, 10,211, 24,139, 85,202,143,220, 27, 31, 40, 83, 85, 13, 85,109,168,106,191,171, 94,214, 14,215,106,166,
-196, 19,210, 40,187, 28, 76,203,144, 43, 31, 73, 65, 18, 43, 47,244,138,181, 71,175,134,113,185, 9,226,220,170,110,168, 27,111,
- 11,108, 3,101, 86, 63, 39, 15,191,105,107, 79, 21,220, 16, 38, 20,240,186, 17, 75,225,235,122,209,111, 51,219,185, 96,187, 19,
-171,142,189,157,146,184,167,157, 86,171, 16, 40,249,148,246,107, 77,105,247,233, 97,101, 79, 64,118, 62, 85,250,189, 86,224,165,
- 20, 62,131, 67,249,104,225, 40,140,220,147,128,192,141, 34,237, 67,150,194,115,181,105, 28, 58, 44,145,150, 5, 91,138,213, 28,
-191, 45,232, 81,164,151,136,188, 86,165,106,173,183, 61,248,174, 92, 99, 77,176, 63, 93, 40,234,254,253,166,246,176,127, 19, 62,
-198, 88,187, 84, 65,183,177,117,207, 26, 99,252,101, 59,247,167,138, 62,130,235, 55,111,113,116,120,128, 45,231,173, 20, 15,132,
-242,131, 84,161, 72,163,132,221,237, 29,170,170,228,244,244,152,205,173, 13, 54, 55,119, 57, 59,159,177,189,191,139, 53,115, 94,
-184,113,131,135, 31,125,196, 39, 31,125,196,124, 54,161,180,134,142,142,208,145, 64, 38, 49,105,119,147,135,159, 60,228,124,110,
- 80, 81, 68, 83, 72,182,250,187,100, 91, 30, 75,105,165,164, 42, 27, 78,143,143,105,202, 18, 37,189, 93, 70, 9, 25,198, 72, 79,
-104, 34,133, 31, 97, 90, 26, 62,186,119, 15,245,167,127,202,111,255,198,223,230,193,189,123,228, 7,143,185,125,231, 99,170,217,
-156,195, 71,143,201,147, 1,239,124,240, 1, 63,241, 15,127,151,175,124,109,198,244,143,254,144, 89, 63,227,240,145,163,116, 14,
-164,194, 8,175, 48,149, 52,140,199,231,124,239,213, 87,249,103,255,242,223,240,155,255,201,239,241,127,254,223,253,111,145, 38,
-163,107, 44, 90,117,144, 42,162, 17,181,231,148, 35, 80,194,231,201,183,118,152,101,180, 40,235,133,220, 46, 69,143, 23, 47,123,
-185, 28,141,175,198, 72,226, 2, 19,125, 37,156,243,201, 26, 34,116,126,182,245,136,175, 91,222,194, 97, 66, 5,175, 38, 82,249,
-108, 45,103,145, 90,160,180, 39, 8,250,208, 23, 21,114,175,229,114, 42,208,122,154,125, 55, 82,130,173,121,243,213,239,113,122,
-244,144, 44,150,188,123,255, 54,119, 63,190,203,255,254,206,199,252,214,223,253, 93, 26,145,241,252,103,191,192,108,182, 32,141,
- 5, 91,157,203, 8,215, 96, 10, 11, 33,125,171, 25,142,153,156, 28,211,233,230,228, 27, 61, 54, 82, 56,154, 13,185,127,239,144,
-203,151,246,105,202,146, 56, 73,169,209,232,180, 75, 81,157, 81, 89,137,145, 41,231,227, 25,221, 94, 31,169, 34,116, 2,101, 93,
-211,205, 50,143, 90, 45, 42,239, 26, 48, 6,161, 21,146,138,122, 30, 49,155,140,201,146,148, 44,239,113,227,249, 23,184,116,245,
- 42, 42, 74, 16, 66,179,119, 89, 16,165, 57, 31,222,185, 67,237,160,108, 28,157,222, 0, 21,107,106,227,175, 77,161, 52,166,170,
-208,177, 15, 43,153, 47, 22, 1,121,155,160,148, 98, 60,153, 16,197, 49,221,110,215,243,192,243, 12,133, 34,205, 82,159,208, 22,
-107,191,227,243,243, 23,172, 82,158,234, 70,155,121,237,227, 88,189,146,208,162, 21, 52, 70, 34,133,101, 81,213,228, 54, 70, 68,
- 26,109, 27,122,113,204,188, 50, 30,109,236,132, 23,161,181, 57,213, 65, 9, 29,197, 18,169, 67,254,180, 2, 37,195,216,221,121,
-136,143,112,254,184,236, 5, 88,126,199,221,212, 6, 45,188,168,168,181,229, 90, 43,124,214,119, 56, 52, 56,219, 96,156,193, 10,
-136,162,216,143,195,219,221,189,243,123, 89,225, 31,110,222,123, 28,212,245,214, 9, 47,190, 12, 32, 16,144, 88, 39,177, 78,172,
-165,180,121, 93,134, 23, 97,122, 70,134,176,198, 67,149,214, 59, 86,103, 2,156,198, 44,137,117, 75,112, 82,187,219,149,224,180,
-135, 45,201,112,168,109,145,166, 46, 76, 25,150,162,176,166,246,154, 3, 33, 16, 77, 3,193, 86, 22,122,182, 48, 61,105, 24, 14,
- 71, 32,189, 75,164,170, 74, 63,209, 10,139, 48,165, 52,117, 61, 35,203, 58, 68,113,202,162,110,168,173, 35, 86,210, 23, 19,169,
-189,128, 48, 28,245,151,123,238,246,249,111,237, 42,145,113,109, 76,125,113,109,219,102,103,182, 83, 14, 65, 26, 71,228,105, 68,
-146,104,210, 36, 34,142,147, 48, 62,118,222, 5, 98,253, 36,160,106, 68,208,112,153,165,144,187,213, 93, 24,107,105, 26,191,211,
- 87, 85, 67, 89, 86,148,149, 95,173,173,186,114,150, 90,177,101, 87, 46, 68, 16,253,138,165,107,237,130, 24,175,157,166,182,113,
-224,238,217,190,234,103, 53,156,159,214,149, 95,252,204,226, 83,145,232,171,103,238, 90, 97,199,175,163, 86,141, 76, 72,138, 11,
- 49,209,235,248, 89, 41, 37,250, 89, 99,238,117, 56,191, 87,223,233,101,112,197,186,189,173, 9,227, 15, 47,148,243, 39,219,102,
- 57,126, 55,171,110,190,177,193, 87,106,131, 88,193, 81, 47,199, 33,246,130,255,248,175,218,169,127, 90,215,126,243,185, 91,252,
-230,111,252, 38,255,183,255,203,255,137,166, 44,194,139,232, 59, 7, 29,199,108,109,110,177,181,217,231,241,163,251,104,173, 73,
- 59, 29, 70,179, 41, 27,219, 27,204,202, 49, 95,251,252,231,249,209,159,127,135,106,116, 70, 34, 18,138,185,101, 99, 43,161,168,
- 43,180,141, 40,167, 53, 39, 15, 62, 65,165, 29,190,242,147, 95, 98,239,210, 21,210, 56, 97, 49,155,178,119,105,151,131,163, 35,
-246,175, 94, 99, 54, 91,176,217,237, 18, 73,193,163,131,135,124,255,213, 31,112,255,193,125,228,154,104,143,112,177, 11, 90, 84,
- 41,148,214,242,222, 39, 31,115,233,141,215,248,189,223,249, 29,254,240,223,255,183,244,143, 51,142,143,166, 76, 71, 99,234,102,
-202,241,217, 1,255,225, 79,254,130,223,250, 91,191,200,189,219,111,145,198,146,249,124,204,237,187,159,160,162, 8, 83,251,159,
-113, 36, 29,105,156, 80, 84, 37,255,175,255,230,255,205,223,254,181, 95,229,249,151, 95,230,248,195,247,176,165, 33, 75,251, 12,
- 54,251, 28, 14,143,194, 88,221,211,178,252, 8,201,174,217, 4,237, 42, 90,114,205,206, 32, 46, 28,184, 60, 40,102,229,202, 16,
-203,240,157, 11,111,107,176, 66,255,119, 40,255,144, 22, 43, 91,155,148, 43, 23,133, 20,114,217,169,123, 5,112, 0,157,132, 20,
- 55, 29, 70,119, 82,251,189,163, 12, 92,230,213,186,200,171,166, 93, 93, 83, 21, 99,238,125,252, 1,245, 98,196,105,181, 96,123,
-115,147,126, 39,227,124, 54,230,232,224,128, 89, 97,121,235,205,119,232,245,122,124,225,165,231,233,171,133,247,139,167, 57,170,
-147,227,170, 26,187, 24, 50, 63, 63,164, 28, 57, 98,246,113, 70,208,207, 35,152,121,229,122,154, 36,116,187, 3,102, 69,195,104,
- 86, 32,116,204,231,190,240,101, 68,103,155,114, 49,163,177,126, 55,175,227,132,233,116, 70, 55,203,136,162,136,121, 51, 9,164,
- 44, 95, 48,181,141, 81,141, 70, 58, 88,204, 11,242,218, 34,116,194,104,178,160, 59,136, 49,117, 65, 93,215,108,110,109,115,173,
-110,184,247,232, 0, 91,215, 72,173,169,235,134,170, 90,208,235,246,208, 42, 90,174,203,146,216,115, 25,196,218,207,180, 40, 12,
-251,151, 46, 81, 85, 37, 77, 93,161,179,140,114, 81,248,149,133,240, 15, 89,140,197,214, 13, 56, 71,109,131,160,208,249, 93,165,
- 86, 80,215,134, 72,203, 0, 99,241, 86, 28, 83, 53,212,149,193, 56, 71, 81, 85,164, 73, 70, 39,142, 40,171, 2, 99, 3,102,213,
-132,204, 60,173, 72,117,176, 82,134, 21,137, 23, 64, 25, 26, 83,161,173, 70,248,106,226,119,139,218, 95, 51, 46,248,143, 91,165,
-180, 9,197,188,237,152,140, 49,168,160, 29, 48, 97, 74,214,178,186,235,218,250, 17,174,113,136, 56, 10, 93,156, 15,242, 89,185,
- 31, 28, 66, 74, 34,229, 49,163, 44, 83,198,252, 62, 61, 10, 98, 57, 41,181,215,134,132,192, 32, 63,212,212,172,188,194,126, 4,
-109,155, 64,210,112,254,239,182,181, 69,199,169,255,121, 90,127,176, 80, 90, 5, 32, 14, 40,169,112, 77,179,252, 51, 75, 85,181,
- 49, 62,254, 86, 11, 92, 85,249,137, 73,221,128, 49, 97,245, 96,150,197,221, 26, 24,141, 39, 68, 73, 26,126, 38, 13,113,148, 32,
-149,183,168,249,209,190, 36,142, 83,172,105,147,233, 26,186,218,211, 0,163, 56,241,159,223,137,181,206,213, 11, 97,109, 75,127,
-187, 0, 77, 17,203, 67,253,133,157,117,248,147, 82, 18,162,169, 99,242, 44, 33,203,124,254,121,146,100, 1,223,139,183,161, 53,
- 13, 85, 99,150,142, 28, 47,112, 19,203,195,143,175, 59, 13,101, 85, 83, 85, 53, 81, 89,133,209,127, 21, 14, 1,126,165,216, 22,
- 97, 41, 86,212, 55,159,232, 24,166,128,210,173,237,201,185,104,196, 14, 7, 2,177, 62,248,119, 79, 51, 8, 62,141,209,242,236,
-145,251, 90,212,235, 51, 26,188,103, 54,238, 98,181, 18, 87, 33, 84,107, 21,143,189,242,238,183,111,234,197, 27,251,191,191, 84,
-191, 35,150,169, 90,109,244,165, 8,106, 63, 17,102,251, 4,117,158, 84,254,230, 90, 26,225, 67,150,114, 20,112,124,145,246,135,
-129, 72,249,211, 68, 20,233,160,220,243,121,216, 74,137,208,129,249,139,192, 61,195, 72,224,184,120,130,114, 63, 38,131,189,253,
-128,209,120,206,239,252,222,223,227,235, 63,243, 11,188,117,251, 14,147,194, 7, 33,108, 12,186,244,183, 46,147,100, 93,186, 81,
-205,163,123, 31,208,217,216,160,150, 25, 73, 62,160, 88,204,248,249,175,125,145,183,127,248, 67, 62,124,239,109, 16, 11,154,166,
-228,124, 92,115,105,175,203,209,180,225,100, 14, 58,217,226,107,175,252, 44, 95,252,242, 79, 48, 62, 63,225,243, 55,175,179,213,
-233,241,221, 87,223, 96,127,208,197,206,198, 92,218,187,140,138, 58,124,251, 15,255, 61,167,119,222, 35,142, 99,126,242,155, 63,
-197,175,254,226, 47, 51,155, 76, 56, 63, 63,247,157,105,235,141,181, 43, 3, 94, 24,133,112,116,112,140,214, 49,127,231,239,255,
- 19,190,247,173, 63,102,116,126, 72, 19, 41,242,126,143, 65, 22,161,108,205,241,120,198, 47,253,202,111,112,114,231, 14,227,195,
- 71,212,182,228,124, 62,195, 53, 13,145,133,218, 9,154,122,142,165, 96, 54,159, 48, 45, 13,255,228,127,252, 63,225, 79,254,240,
- 63, 96,202,194, 3, 89,146, 46, 70, 41, 74, 59,199, 81, 34,157, 2, 19,121,155, 5,107, 41, 74,206,122, 11, 87,155,121,220,222,
- 41,173, 17, 85,138,181,145,150, 88,203, 31,110,201,112,161, 32, 47,187,120, 21, 14, 9,210,219,108, 2, 39, 29,161,150,251,243,
-118,124,175,117,224,173, 75, 63,218,215, 64,162, 35,242, 36, 33,203,210, 16,236,225,255, 27,167,169,223,115,234,224, 49,247,203,
- 55,207, 88,168,231,124,240,230,247, 57,120,112,155, 98, 62,199,168, 28,213,217,101, 82,103,152,120,192,239,254,227,255, 17, 63,
-255,235,127,147, 47,126,249,101,164,171, 40,206,206,153,142,103,168,188, 79,146,118, 16,206,139,149,100,164, 56, 63, 63, 33,149,
- 17,105,150,144,119, 58, 24, 33, 73,187, 93,242,188,235,149,202, 85,133,177,142,206,246, 14,215,110,222, 32, 78, 61,244, 37,235,
-246, 49, 72,154,186,194,212, 6,103,252,195,123, 81,148,104,173, 48,117,233,163, 68,173, 79,149,139,211, 14, 27, 59, 59,204,202,
-138,225,120, 76,150,165,108,244,123,104, 42,164,169, 41,102, 99, 58, 89, 70, 81,248,191,175,177,142, 72,107,138,249, 28, 37, 4,
- 81,164, 89,204,166, 28, 60,122, 72, 55,203,232,230, 25,199, 71,135,108, 12,122, 12,135,167, 76, 70,231,148,197,140,243,179, 19,
-238,223,187, 11,117, 77,170, 35,102,211, 49,199, 39,199,204,139, 2,219,120, 97,212,241,233, 41,166, 49, 36, 56, 50, 41, 73,148,
- 68, 73,136,148,239,154,173, 84, 52,141,135,199,184, 80, 28,147, 84,209,233,102,228,169,102, 81, 46,120, 60, 90,208,168, 20,156,
- 65,135,177,113,146,106, 58, 93,208,177, 69, 69, 14, 33, 29, 66,106,210, 52, 35, 10,168, 87, 21,210,177,252,184, 81,181, 40,110,
-127,233, 41, 47,102,212, 65,115,161,148, 10, 41,132,126, 93,132, 37, 56,147,253,231, 17,200, 64,158,243, 65, 40,173,210,165,170,
-189,181,179, 50,126,141,215, 56,135, 84, 17, 73,156,147,102, 93,116,228, 11,156,140, 37,105, 39, 35,235,244,233,244, 55, 72, 58,
- 61, 68,154, 67,148,225, 84,140, 17, 26,233, 36,194, 53,184,166,192,214, 37,210,250,152, 95, 97, 42,176,198,119,183,206,173, 89,
-172,196,202,246,107,220, 82,192,135,245,153,245, 66,133,152, 96,239, 45,241, 22, 62, 99,188, 53,206,248,130,238,156,133,218, 34,
-109,133, 48, 53,212, 80, 77, 45, 31,223,254,196,127,127,243, 17, 85, 89, 34, 84, 66,156,118,104,170,154,162, 88, 32,227,136,164,
-219, 67,233,148,209,100,204,168,156,208,143,123,148,165,197,108,110,160, 6, 61,234,166, 93,185, 26,154,208,165, 91,235,188,134,
- 66,136, 0,129,138, 72,211,200,167, 58,182,221,186, 23,141, 96,141,165, 54, 13, 2, 72, 35, 77,150, 70,228,105, 76,150, 39,100,
-121, 74,158,251,112,158, 86,232,170, 35, 29,196,175, 17, 89, 18,135,251, 59, 33,203,114,178, 44, 35,205, 82, 63,130,142, 60, 12,
- 72,133,233,156, 49, 22,131,103, 33, 88,227,213,238, 34, 60,155,180,246, 73,147,145, 2,173,180,175, 75, 74,145,165, 62,143,163,
-147,166,164, 73, 68,154, 68, 68,177,207, 64,208,145,246, 97, 43,170,253,111,155,176, 38, 62,149,115,255,227,114, 76,156,107,252,
-129, 72,172, 42, 93,171,253, 49,117, 69, 85,150,148, 69, 73,177,168, 88, 44, 74, 15, 8, 2,159,236, 23,154,107,173,125,173,245,
- 1, 82,114, 53, 61,119,126,114,174, 94,188,113,233,247,133, 92,169,143, 87, 99,211,213, 40,179,149,215,139,181,253,233,250,239,
- 47,201, 55, 74,173,172, 98,122, 61, 53,201, 91, 62,148, 86,104,165,194,168, 84,133, 67,129, 8,106,231, 21,130,246,201,241,132,
-120,194,130, 32,158,241,195,107,223,175,108, 69,167,223,227,231,126,241,151,248,155,191,254, 91,108,239, 94, 97, 94, 24, 4, 49,
- 81,148,177,183, 61,224,193,221,219, 72, 41,200,250, 27, 8,229, 47,140, 47,125,238, 37, 62,124,247, 61, 62,188,253, 26,147,209,
- 28, 91, 73,174, 95,191, 66, 69,205,209,121, 1, 58,231, 27,223,248, 6, 95,255,242,215,185,119,255, 1, 63,251,115, 63,195,225,
-227, 7, 20,227, 17,111,189,245, 54,181, 20,100,177,160,215,201,249,214,159,125,143,195,211, 51,132,157,243,210,243,151,232,110,
-108,114,231,147,123,252,232,245,215,248,233,159,250, 41,126,230,167,127,150,199,135, 7, 76,103, 51,223, 9,133, 37,155, 91,218,
-253,188, 23,244,228,248,132,221,189,203,252,204, 79,189,194,127,255,237,111, 83, 24, 71, 47,213,244,100,195,120, 52, 70,103,125,
-190,246,245,175,179,152,142, 25, 15,207, 0,193,116, 58, 99, 94, 84,126,151, 36,101,200,123,118, 88, 43,120,124,120,198,223,254,
- 91,127, 27, 44, 60,184,255, 9,105,150,250,196,163, 98, 78,164,125,174,184,112,107,105,107,159, 18,129,251,151,120, 15,214,130,
- 94,196,133,172,241,245, 87,115, 69,156,146,107, 57,236, 33, 0, 37, 16,186,164, 88, 93,127,109,103, 41,133, 23, 57,197, 81, 68,
-150,249, 98,158,101, 62,177, 43, 73, 19,127, 35,198, 17, 66,201, 11, 98, 62, 28, 40, 26, 78, 79, 30,115,255,147,187, 20,149,161,
-180,154,173, 75, 55,184,113,235,121,126,229,111,252, 50,157, 44, 65, 54, 5, 81,164,232, 38, 9,166, 44,120,247,237,119,160,105,
-200,149, 68, 98, 64, 89,146,204,255,191,243,195, 99,162, 56,245,133,218, 9,242,222, 6, 89,183,199,230,214, 54,189,193, 22,183,
- 62,251, 18,187,151,246, 73,178, 14, 82,199, 28, 29,159,144,102, 25, 89,150, 6,175,105,138,115,126, 28,236,130,224, 80, 10, 15,
-210,136,162, 8,227, 32, 78, 50, 46, 95,187, 70,146,230, 28, 30, 30, 97,112,108,239,108,145,199,138,166, 42,177,198, 80,150, 21,
-113,156, 50, 43, 10,111,177, 18, 80,149, 37, 85, 85,145, 36, 49,139,197,130,241,112,136,115,142, 56,138, 56, 27,158, 48,155, 77,
-121,252,248, 49, 90, 41,238,222,185,131, 49,150,241,120,204,108, 58,165, 42, 61,117,108, 94, 86, 44, 22, 5,101, 85, 49, 26,142,
- 56, 25,142,217,218,218,240,108,253,170, 33, 81, 18,141, 67, 75, 15, 2, 42,235, 26,108,120,221,130,151, 60,207, 19, 54,183, 6,
- 24,107,144,113,194, 39, 71, 35,162, 36,193,212, 13, 42,100,100, 39,137, 38,235, 8,164,183,134,248,108,116,173,124, 70, 67,232,
-144,149, 82,171,168, 91, 21, 48,173, 1, 37,235,218, 67,226, 69,184,159, 47,144, 79, 16,204,214, 33, 98,214,249, 21,161,181,126,
- 37, 88,214, 13,101,227,213,221, 77,109,151, 58,129,180,211, 69,197, 41, 34, 8,211,148,146,232, 40, 70, 39, 25,105,183, 75,156,
-117, 16, 81, 12, 90,226, 84, 43,205,181, 8, 91,131,173,176, 77,133,116, 94, 55, 99,234,210,171,212,133, 12, 83,245,182,176, 7,
-212,108, 8, 75, 89, 2,187,172,161, 93,145,186,214, 82,212,238,172,156, 9, 30,248,112, 8,176,190, 64, 8, 26,255,126,229, 56,
-122,124,204, 39,119,238, 18, 73,201,240,228,136, 52,203,105,172, 63, 72,107, 41,153, 76, 38, 36,121,135, 56,237, 97, 12,204, 22,
- 51, 10, 83,209,139, 50,138,202, 16, 95,218, 67,230,121,192, 69,187, 37,120,202, 6, 22,133, 13, 93,107,164, 36, 73, 28, 70,233,
-145,127,198, 47,239,239,118,178,107,188, 56,208,127, 92, 18, 58,245,213, 91,154,132, 67, 91,176, 8,182,107,162, 36, 77, 72,210,
-148, 52, 75, 73,243,140, 44,247, 7,248, 52,246, 69, 95, 7,170,159, 23,209,182, 5,221,219,241, 90,241,158, 82,138, 40,208, 0,
-227,240,185, 35, 29, 17, 69,138, 60, 77,232,118, 50, 58,121, 66,150,196,164, 73,132,142,124,188,179, 10, 69,189, 21, 38,250, 6,
- 87,173,124,234, 63,142,144,246, 84, 81,183,254,117, 92, 71,157,187,139, 69,189,174, 42,202,162,162, 40, 42,138,181,162,238,163,
-113,253,179,111,117,160, 13, 13,177,107,197,193,254, 57,173, 94,184,182,251,251, 75,165,113,107,245, 8,210,253, 54,254,114, 89,
-212,197,197, 7,246,210,119,248, 4,132,222,255, 0, 37, 74,251, 28,105,213, 22,114, 37,195,175, 87,111, 44, 79,212, 92,200,209,
-125, 42, 28,227, 9, 47,225,179, 10,186, 31,103, 87,156,158,159,115,120,124, 74,221, 56,238,221,123,196,124, 90, 49, 28, 21,116,
- 51,205,233,227,187,140,199, 35, 58, 27,155,160,124, 97,184,178,179,201,124,120,194, 15,127,240, 3,112, 53,189, 52, 34, 77, 98,
- 10, 99, 57,153,150,100,219, 87,248,230, 79,190,194,103,159,191,193,243,207,221,228,165,207,190,192,159,126,231,219,236, 95,218,
-195, 84, 53, 73,146,243,133,175,254, 20,145, 72, 72,226, 1,151,174,188, 64,111,176,141,171, 75,104, 10,106, 99, 57, 31,142,216,
-191,180,207,199, 31,127,204,241,241, 49,191,253,219,191, 67,175,223,227,227, 59, 31,211, 88,179,220,167, 5, 61, 34, 82, 10, 22,
-139, 5, 39,135, 71,124,233, 43, 95,165,183,181,207, 59,239,189, 15,179,115,114, 51, 39,201,114, 84, 62,224,224,240,144,175,190,
-242, 13,190,255,253, 31,160,106,203,228,244,156,162,174, 88, 40,135,212, 18, 83, 55,193, 1,172,168,138,134,209,120,206, 63,249,
-167,255,132, 63,248,131, 63,160,223,239,210,235,246, 57, 59, 57,164,155,197, 56,219,248,241,162,112, 63,246, 50,253,113, 98, 69,
-177, 70,126,146,114, 45,193, 77,172, 70,119,203,221,155, 16, 1,216, 34,151, 34,205, 22,186,208,142,238,219,232,213,229,190, 92,
-248, 27, 43,142,180, 63,185,231, 41,121,230, 79,249, 73,154, 16,167, 73,216, 37,171,176,235, 91,141, 13,149,116, 28, 30, 62,194,
- 33, 56, 25, 78,216,190,116,157,221, 75,215,184,126,227, 50,219,253,156, 94, 18, 65, 49, 67,150, 37,182,174, 88, 44, 22,148,101,
- 73,174, 20,253, 65, 15,157, 70, 1,180,231,136, 84, 76, 44, 99, 58,155, 91,232, 44,167,172, 13,243,162, 34,235, 13,136,243, 46,
-155,123,187,136,200,195, 60, 44,254,161, 48,159, 23, 60,124,248,144, 72, 41, 54,250,125,162,216,103,173,139,176, 11, 94,207, 94,
- 78,210, 60,164, 4, 42,242, 78,151,173,173, 45,102,179, 25, 39,167, 39,244,122, 29,118, 6, 93,191,155,181,150,170,174,112, 72,
-234,198,231,177, 11,188, 37,104, 49,159, 19, 71, 17, 77,237,247,142,121, 39,167,170, 74,134,163, 51, 38,147, 49, 85, 85,178, 49,
-216,164, 88,148, 84, 85, 77,183,211,163,147,231, 88,107, 24, 79,103, 12,135, 99,142,143, 79,152,205, 22, 12,199, 99,170,144,162,
-214, 20, 21,177, 80, 68, 64,228, 28,105,164,208, 90, 82,213, 6,107,124, 50,150,195, 11,112,227, 68,209,237,119, 49,214, 18,231,
- 93,142,207,167, 88, 33,169,170, 42,228, 50,224, 5, 83, 29,223,113,131, 37,138,252,161, 45,138,162, 85,194, 86, 20, 7,239,241,
- 90,164,111, 75, 27,108,201,131,142,229, 68,199,219, 17, 87,174,225,213, 53, 38, 47,228, 91,180,206,168,170, 49, 52, 22,154,218,
- 82, 22,126,164, 75,221,120, 56, 75,146,121, 45,129, 16, 33,116, 37,236,135, 35, 77,154,250,172,119, 17,198,238, 43,232,141, 5,
- 87,226,108,137,169,106,164, 19,208, 24,108, 93,161,176, 56,211, 44,133,125,237, 14,223,153,128, 78,198,119,153,206,218, 48, 0,
- 11,227,247,150, 95, 47, 86,227, 95, 97, 45, 52, 77, 88,118, 7,124, 50, 65, 27, 80, 89, 62,120,231, 54,167,199, 39, 72, 28,211,
-209,144, 36,201,145, 58,161, 44,107,210, 36,101, 60,157,209,221,216, 33,202, 58, 44, 22, 37,211,233, 24, 29, 71, 40, 43,104,156,
-160,115,245, 50, 36,217,154,112,108,165,133,106,227, 86,101,176,179, 37,177,239,114, 99,173,131,250, 92,132,159,190,183, 64, 55,
-141, 7,235, 68,218, 23,255, 52, 77, 73,146,136, 36,245, 69, 62, 78,162,144,128, 40,131,179,192,119,236, 81, 28, 17, 39, 49,113,
-146,144,100, 9,113, 18, 19, 37,113,184, 70,252,225, 68,134, 44, 9, 23,248,255, 38,116,233, 88,143,147, 86,202, 43,199,147, 88,
-147,198,145,255,251,226,136, 52,246, 25,243,157, 44,166,147,197,164,177,127,182,168, 16,225,171,180, 90, 22,117, 95,204,219,247,
-255,135, 20,245,149, 72,252,217, 69,189,166, 46, 75,202,178,164, 92,148, 20, 69, 69, 85,251, 68, 57, 17,154, 25, 63,225,190,216,
- 72,175,174,109,255,186,168, 91, 87,182,127,127,153,170, 69, 32, 1, 5, 20,162,210,109,158,181,122,202,146,244,172,194,122,161,
-139, 15,182,156,213, 23,208,190,133,209,187, 10,169, 58,172,162, 60, 87, 22, 3,214, 66, 59, 86,185,218,171,157,199,167,119,234,
- 10,199,116, 60,229,209,253, 7,188,249,163, 55,120,252,240, 1,179,201, 24, 41, 44,195,195,123, 44, 38, 39,168, 36, 33, 31,108,
- 16, 39, 9,105,164, 72,133,225,181,239,127,151,211,179, 83, 82,221, 33,142, 52,121, 79,115,112, 58,167,191,243, 28, 47,125,233,
-203,236,239,109, 82, 78, 70,124,247,219,223,226,198,245,107, 68, 73,194,254,254, 21,223, 85,197,146,141,157, 45,166,227, 17, 73,
-154,176,177,181, 73, 89,142, 73,226,154,110, 23,148,138,105,140,227,229,207,126,150,247,222,123,151,155, 55,111,242,207,255,197,
- 63,231, 87,126,245, 87,249,249,159,255,121, 94,127,227,117,202,208, 93, 95, 40,126,192,116, 60, 98,255,242,117,126,253,119,254,
- 62,175,189,250, 67, 6,162, 64, 21, 19,146, 94,151,162,209,196,113,202,206,149,171,228,157, 62, 31,191,245, 14, 81,211, 48,169,
-230,204,108,237,237, 92, 97, 97, 47,144,222, 87, 44, 53,191,253,247,254, 62, 31,126,252, 49,143, 31, 62, 32, 75, 19,142, 30, 63,
-102,208,237,120,186,154,240, 99,246,214,230,127,225,109,213, 63, 92,184,150,197,234,157,101, 18,145, 20, 23,199,241,207,178, 35,
-182, 60,229, 85,247,190,178, 79,174,135, 27,172, 58,117,181,188, 30,226, 72,147,165, 9,157, 48,186, 75,179,140, 36,203,136,211,
-108, 57,126,111, 45,115,171, 3, 3,140, 70, 99,238,221,127,128, 78, 50, 94,252,236,231,249,252, 23,191,200,243,183,174, 97,171,
- 25, 71, 15,238,241,209,187,239, 99,138,130,254, 96, 16, 66, 56, 36,169,138,125, 71,211,235, 17, 15, 6, 24,231,147,250, 36,177,
- 15,248,136, 82,162, 36,165,104,188, 66, 88,199, 9, 40,205,108, 54,103, 60,154,224, 28, 76,166,115,170,186,226,225,253, 7, 84,
-197,130,141,126,143, 56,214,228,121,238,247,185, 97, 71, 73, 24, 89,198,105, 78,214,233,145, 36, 41,221,110,151,205,141, 13, 6,
-131, 62,117, 85,242,232,225,125,182, 7, 61,242,196, 71,101, 54,193,131, 43,116, 68, 81,122, 8,199, 98,177, 96, 58,157, 4,143,
-250,192,143,237,226, 56, 28,216,253,107,145,231, 29,250,253, 62, 91,155,219,100, 89,135,141,141, 77,122,221,142,143,108,157, 45,
- 24,143, 39, 12,207,199, 88, 7,113, 28,211,235,245, 40, 27,203,100, 58,195, 52, 13,137,144,100, 18,175,221, 72, 53, 69, 97,150,
-121,229, 77, 99,209, 65,100,183,189,189,141,147,146,188,215,103, 52,157, 49,154, 45, 2, 43,220, 5,188, 43, 68,169, 69,105, 95,
-192, 34,173,194, 40, 54, 9, 9, 91,138, 56,100,169,123,108,174,244,157, 96, 8,231, 96, 25,225,203,242, 57,229,159, 43,173, 23,
- 90, 46,133,125, 34, 28, 4,156, 16, 33,229,205,187,116,106,227,130,186,219, 80, 87, 13, 85, 81,210, 76,167,222, 13,162, 53, 70,
-128, 49, 53,166, 88, 32,170,210,219,197, 92, 19,214,135, 22,233,227,144, 16,174, 66, 52, 21,152, 5,216,106,105, 43, 83, 8,104,
-106, 76, 49, 67,186,102,185,106, 19,107,148, 66,130,162,189, 13,129, 18,161,179,195,217,176, 47, 95,123,230, 89, 3, 77,248, 60,
-198, 4, 44,173,245, 69,199,203,195, 89, 76, 22,188,243,198, 59,184,166,161, 42, 22,212,101, 9, 50, 34, 78,186, 30, 30, 83, 86,
-212, 64, 54,216,166, 81,158,166, 55, 25,141,208,105,140,173,106,172,142,200,175, 92,198, 69,113,144,193,174,197, 95,135, 78,221,
-133,239, 65,171, 80,212, 99, 95,104,229,154,237,181,237,210,155,218,107, 1,148, 86,164, 65,189, 29,199,138, 40,214, 75, 50,218,
- 82, 88, 27,132,137, 42,242,153, 29, 58,142,137,211,152, 56, 73,151, 99,241,168, 93,203,169,112, 29, 56, 86, 26,175,160,235,242,
-135,101, 47,246, 78,151,163,252,132, 60,245, 93,121,146, 68,228, 89, 66, 39,243, 59,254, 52,120,191,117,164, 2,135, 64,135,103,
-137,199,195,250, 49,188, 94, 75,169,116,127,253,162,238,214,133,242, 14,231, 76,128, 29,213, 52,107,157,122, 89, 84, 84,149,183,
- 83,182,130, 97,191,202, 86, 79, 21,245,246, 75,176,214,162,110,238,239,252,254, 58,238,115,217, 45,173, 11, 31,150,241,146, 79,
-119,233,159,214,201,121, 27, 10, 97, 68, 22,186, 47,229,191,176, 85,160,252, 42,204, 99,169, 10,119,235,194, 43,177, 20,198, 40,
-185, 58, 88, 60,203, 78,208, 2,102,148,147, 40, 39,188,159,181,156,179,152,143, 24, 15, 15,152,142,143,160,153,161,132,160,179,
-185, 77,167,191, 65,164, 37,123,155, 61,222,248,225,171,220,189,115,111,153, 40,182,181,179,205,241,249,156,205,221,171,124,230,
-179,159,229, 39,190,242, 85,142, 30, 61, 98,122,126,202,243,207, 93,195, 15,157, 34,146, 44,231,252,228,144, 36, 86, 92,187,122,
-147,241,104,202, 55,190,254,147, 44,230, 51, 46, 95,218, 33,209,130,106, 81,208,239,111,114,126,126,206,221,143,239,176,187,189,
-195,171, 63,124,149,237,173, 29,190,243,157,239,240,220,173, 91,252,167,255,248, 31,243,173,111,127,107,249,160, 91, 23,148,251,
- 7,152,102,111,255, 58, 95,251,218,215,120,245,219,255,158,190, 54,116, 6,219,100,157, 13,186,189, 62,181,140,121,229,149,159,
-226, 47,254,228, 91,164,210, 80, 53, 5,231,139,249, 50,154,178, 29,113, 11,225, 40,203,146,159,248,234, 43,188,248,194,103, 56,
-120,244,216,119,163,139, 5, 77,109,200,242,140,198,121,196,200, 50,146,116, 93,223,176,100,252,187, 21,226, 82,172,148,151,235,
-170,142,245,189,250, 18,244,193,186,183, 93, 46, 31,176,171,110, 94,172, 16,146, 97, 13,212,142,221, 85,200, 49,111, 11,123,162,
- 35,178, 44,241,167,236, 78, 70,150,231, 36,105, 70,148, 36,168,120,173, 83, 95,191,222,148, 34,138, 99,254,228, 91,223,230,210,
-222, 37, 34, 29,113,245,242,101,250,189,140, 56, 82,188,255,206,187,220,255,228, 19,170,198,248,252,232, 44, 99,176,181,131, 84,
- 17,198, 88,202,162, 32, 74, 98,162, 44, 7, 17, 33,163,212,143,112, 43, 47, 62, 75,179,140,186,170, 73, 18, 95, 60,135,103,231,
- 60,248,228, 46, 69, 89,146, 36, 9,213,162,224,225,131, 7,140,135, 67,250,189, 14,121,154,144,103, 25, 74, 71,204, 23,139,160,
- 0, 86, 40, 29,209,235,247, 67, 68, 35,244,178,156, 60,139,201,146,136,253, 75, 59, 36,177,230,232,209,131,240,144, 74,168,235,
- 50, 40,209, 37,141,113, 68,113,204,124, 54,243,130, 55, 4,253,141, 1,113, 28, 99,172, 35, 73, 18,186,189, 14,214, 90,118,119,
-119,233,100, 61,156,131,237,237,109,226, 56, 97, 81, 44, 56, 58, 58, 66, 8, 73,183,215,103, 52,158,176,179,179,203,230,214, 22,
-227,233,148,209,116,202,172,242,128,165, 76, 8,122, 90,161,165, 33, 73, 53,101,225, 53, 85, 72, 15, 96,177,214,162,148,162,219,
-237,178,181,179, 71,131,160,172,106,142, 78,206,168,172, 63,184, 74,231, 72, 35, 80,137,243, 60,107,173, 67,113, 72,136, 90,110,
-124,232,210, 85,184, 46,252, 36, 39, 36,110,173,117, 42, 82,170,167, 98, 61,219, 17,229,186,112,217, 6, 50,166,181, 94,184, 91,
- 91, 71,227, 4,149,177, 84,149,161,170, 74,234,162,160, 28,158, 33,108,237,149, 37,166,198, 20, 83,154,233, 8, 59, 31, 99,203,
- 25,213, 98,140,173, 10,168, 23,136,186, 68, 52,115,100, 61, 67,154, 5,110, 49, 69,152, 5,182, 44, 16,141,247,229,139,178,192,
-206, 71,168,118,108,238,188, 15,157,229,155, 23, 3,182, 42,124,137,143,125,109,109,122,166, 42, 49,198, 79, 75,132,245, 97, 62,
-194, 26,191,171,111, 5,184,109,225,168, 26, 30,223, 63,228,227,247, 63, 66, 43,197,108, 50, 34,138, 19,156,136, 64,197, 40,173,
-189,128, 46,239,162,187, 3,140,136, 80,194, 49, 60, 62,246,184,216,170,193, 70, 49,189,171,215,145, 58,241,135,140, 64,118,116,
-203, 84, 79,135,177, 30, 60,211, 22,245, 36,246,105,152, 75,252,119, 16, 91, 54,141,161,110,106,156,243, 62,245, 56,210,196,145,
- 47,182, 81,164, 66,129,110,159, 9, 50, 76, 45,125, 68,175,239,152,253,142, 61,138, 99, 84, 20,249,183, 54,150,116, 45, 17,206,
-219,220, 90, 87,150, 93,138,215,226,200, 79, 95,243, 36, 38,203, 82,127,239,165, 94,147,147,103,137,223,239,167,254, 80,226, 11,
-186, 66, 69, 26, 21,133,206, 60,132, 64, 41, 21,249,176,167,101,252,248,143,159, 92, 94, 92, 91,250,215,213, 94,208,130,133,223,
- 51, 30, 69, 92,151,158, 98, 88,134,241,123, 85,213, 30,137, 28, 58,117,221,174,176, 3, 93, 78,181, 83,138, 53,251,158,186,113,
-105,243,247,215, 49,177,235,233, 57,237, 13, 36,214, 44, 74,207,242,150, 63,235,215,114,173,135, 91,239,190,132, 92,197,201,201,
-117,204, 94,171,166, 12,223,123, 27, 26,175,195,254, 76,135,206, 94,133,189, 70,155,233,126,209,234,230, 3,189,221,146,253,220,
- 32,168, 81,210,248, 55, 33,112, 50, 98,251,242, 85,226, 36, 97,163,147, 97, 22, 83,126,244,250,155, 12,103, 37,137, 84,164,157,
-136,105,209, 16,119,118,185,118,243, 26, 55,110,238,209,137, 82,230,211,146, 27, 55,174, 97, 77, 65,167,211,225,203, 95,254, 6,
-223,127,245, 53,158,191,117,141,217,248,140,233,112, 76, 20, 41, 78,207, 14,169,138, 49,139,241, 41,199, 7, 15, 57, 59, 61,195,
- 56,120,225,133,231,249,240,131,219, 76,199, 83,158,127,254, 51, 60, 58,120,196,214,214, 54,223,253,179,239,210, 31,244,249,167,
-255,244,159,242,111,254,237,191,189,192, 12, 22,194,115,205, 23,147, 49, 27,253, 30,191,242,203,127,139,247,222,126,155,163, 71,
- 15, 89, 20, 53,215, 66, 12,236,162,210,124,225, 11, 95, 38,209,142,215,127,240, 29, 98,233, 83,148,138,198,132,194, 32,189,248,
- 8,239, 68,144, 58,227,239,253,221,191,207, 91,111,189,205,221,123,119, 89, 20, 37,101,109,217,191,188, 79, 85,207, 16,152,101,
-167,254,228,107,188,138, 84,117, 79,228, 4,184,117, 64, 48,235,209, 76, 79, 97,250,215,186,240,118,252,190, 60,157, 47,187,115,
-121, 65,175,177, 18,203,249,235,166,221,169,231,185,199,194,166,121, 78, 20,128, 41, 42, 14,108,247,118,180, 47, 61,198, 84,235,
- 8, 99, 28,111,189,241, 38,177, 86, 28, 63,126,200, 70, 39,101, 99,115,147, 69, 89,115,237,198,115,124,246, 11, 95,196, 42,197,
-131,131, 67, 54,119,246,216,189,245, 60, 66, 43, 38,103,167,212,243, 25,174,170,136,148,246,193, 45,210,143, 8,133,116,184,198,
- 35, 76,243, 94,151, 98, 60,242,106,251,249,140, 59, 31,221,166, 92, 44,112,214, 49, 24,244,105,170,138, 98, 49, 71,224,188, 2,
- 56,205, 16, 65, 40, 23,197, 9, 85,109,145, 90,147,100, 57,101, 85,129, 49,228,113, 68,162, 4, 90, 88, 98, 45, 25,244, 58,108,
- 13,250, 52, 85, 73,177,152,224,172,207,150, 46,203,198, 63,208,156, 39, 26, 42,165,136,130, 23, 58,142, 19,140,177,116, 58, 29,
-250,131,190, 87,220,207, 11, 54, 55,183, 24, 13,135,108,108, 12,136, 34,205,120, 52,102, 60,153,160,148,166,211,233,146,166, 25,
-157, 78, 23,169, 52,227,233,140,143,238, 61,100, 97,173,127, 93,140, 99, 43,142,144,206,144,247, 18,154,178, 13,102,241, 28,119,
-161, 4,117, 99, 25, 12,250, 12,182,183,153,149, 37,157, 78,206,131,135,143, 89,212,222, 50, 22, 9,200, 34,136, 50,252,131, 84,
- 41, 15,215,136, 98, 34, 29,163,132,242,221,246,242,128,167, 66,130, 85,155,110, 21,112,169,225,112,184,124,254,180,186,140,181,
-148, 54,169,218,130,196,210, 19,221, 24,255,117, 52,214,127,173, 69, 89, 82,151, 37,182,170, 40, 71,199, 84,179, 49, 90, 88,108,
- 49,135,249, 20, 22, 35,170,233, 41,245,252,156,122, 54,166,158, 14,169,167, 67, 40, 38,152,217, 16, 51, 59,135,217, 16, 89, 22,
- 80,206,125, 16,139,245,172,119, 55, 27, 35,202,105, 56, 40,176, 20,201,186, 54, 28, 62, 80, 15,125,106, 89,216,175, 59,231, 61,
-231,206, 93,232,230,165,107,255,124,232,210, 91, 47,184,240, 36, 62, 83, 53,188,251,230,187, 12,207, 70,104, 33,153,140,206,201,
-242, 14, 78,198, 76, 22, 5,113,146,113, 54, 26,209,219,222,163,209, 41,149, 16, 68, 56,134,199, 71,100,121,238,239,155,188, 67,
-247,234, 21,164,140,124, 67,167, 88, 78,214,150,108,118, 99,151,154,135,150,112,166,213,202,154,218, 42,213,107,211, 44,147,220,
-124,147, 39, 66,129,146, 75, 64,144,135,251,176,188,103, 91, 82,159,210, 17, 90,199,129,222,231,113,207, 75,193,218,218,170,174,
- 37,154, 26,107,177, 1,132,214,194,178,226,200, 31, 56,178, 52,165,155,167,116, 50, 63,229,203,178,148, 78,150,146,165,254,208,
-236,245, 0,114, 25, 35, 44,149,242, 1, 80, 58, 36, 59,182, 5,190, 69,226,138,191,250,248,125,117,164, 12,177,172, 97, 53, 65,
- 16,184,217,186,166,174, 42,170,178,166, 88, 84, 20, 69, 73, 89, 53, 30, 29, 44,101, 16,159, 43,191,114,208,107,207, 68, 33, 67,
- 36, 70, 0,115, 93,223,243, 69,221,133,249,149, 92, 18,115,188,175,113, 57,142, 23, 23,243,103,127,156,104,106,105,222,183, 43,
-179,125,187, 11,107, 67,228, 87,187, 25,183,196,202,182,116, 32, 23, 50, 99,151, 55,241,218,168,161, 45, 4,237, 88,118,125,236,
-239,132,192, 8,175, 44, 68,174,198,114, 33,245, 24,231, 4,121,111,147,237, 75,251,212,117,197,222, 70,151, 55,127,248, 67, 62,
-188,251, 8, 25, 69,236,110,164, 84, 6, 92,220,227,133,151, 95,230,249, 91,183, 40, 38, 83,180, 45,217,221,187,204,209,201, 25,
- 73, 2,211,233,140,143, 62,126,192,249,249,132, 63,250,195,127,203,241,225,125, 62,254,224,125,238,220,189,205, 98, 49, 98, 49,
- 63,229,241,253,143,176,117,197,213,171, 55,249,224,246, 7,188,253,214,155,252,210, 47,254, 34, 47,191,244, 18, 63,120,245, 85,
-190,244,165, 47,115, 54, 28, 50, 24,108,240,253,239,127,143, 27, 55,110,242,171,191,242, 43,124,231, 79,191,179, 20,252,120, 73,
-175, 70,217,154,205,110,134, 33,225,235, 95,255, 41,190,247,167,223,225,244,124, 72,172, 5, 82,198, 52, 54,101,182,104,248,165,
- 95,254, 89,126,248,253, 63, 65, 22, 51, 54,163,132,227,217,140, 10,159,253,141,240, 73, 90,206, 90, 70,195, 57,191,247,219,191,
-203,100, 58,103, 60, 29,241,201,253,123,212,141,227,234,149, 43,212,213, 4,225,234,224, 59, 22,203,228,162,139,169,108,159, 94,
-212, 47,184, 63,214, 36,143, 75,181,168,115,203, 7,176,191,174,214, 59,115,133, 82,173,194, 83, 95,120,205,245,154,173, 82, 74,
-239,166, 72,211,132,124,109,252, 30,167, 57, 58, 73,208, 81,228, 41,115, 34,236,224,165, 68,104,205,193,193, 33,111,191,245, 22,
-229,124, 78, 93,204,185,178,189,129,107, 10,238, 63, 62, 68,198, 41,151,111,222, 96,235,242,101, 18,191, 51,225,218,245,231,194,
-168,207, 49, 57, 58, 96,114,240, 24, 89, 21,244,123, 25, 81, 18, 97,154,154,114, 62,197, 54, 53,227,225,144,217,104, 68, 51,159,
- 51, 61, 31,178, 24,143, 16,214, 48, 58, 59,101, 60, 30,163,180,242,105, 98, 74, 81, 85, 21, 85, 93,161,173, 65, 56, 88, 20, 37,
-141,131, 52,237, 80, 86, 53,211,217,156, 36, 77, 61,172,168,169,137,133, 35,194, 17, 71,210,219,229,109, 67,172, 20, 89, 28,113,
-124,116,192,249,249, 41,198,194,124, 81, 99,172, 66, 69, 49, 85, 93,163,180,199,123, 70, 81, 68,150,119,232,116,187, 72,169,216,
-220,220,198, 57, 56, 63, 59,103,103,123,155,162, 40, 40, 43,111,255, 44,203, 10, 29, 69,116, 58, 93,178, 44,167, 40, 42,102,139,
- 5,157, 78,151,178,174,249,240,222, 61,230,198, 32,165, 32,119,130,190, 20,164, 49,196,153, 66, 6,132,180,197,135, 84, 32, 60,
-150, 53, 75, 82, 84, 20, 83, 90,203,214,230,128,143, 63,185,207,180,244,161, 48, 49,142, 60, 2,149, 9,146,196,243,251,211, 56,
- 70, 43, 77,164,163,165,224, 74,173, 95, 3,226,162,206,167, 69, 14, 59,215,142,225, 87,249,213, 66,180, 88,226,149, 40,211,186,
-181,103,143,115,212,214, 35,119, 27, 99,105,170,102,217, 53,217,197,144,249,248, 12,170, 26, 55,159, 66, 49, 69,212,115,104,166,
-216,114, 78, 61, 27, 83, 77, 70, 44,134,103, 44,198,103,152,249, 8,170, 9,178,156, 33,234, 26,105, 27, 95,160, 45, 80,150,212,
-147,115,100, 51, 7, 97, 86, 15,245,160, 60,147,109,174,128, 9,153, 4, 1, 84, 19,150,196,161,171, 55,190,168,135,113,189, 11,
-191,246,133,194,174,162, 63,173, 97, 58,154,242,250, 15, 94, 71, 90,137,109, 74,176, 6, 21, 39,136, 40,245, 83,137,186,198, 10,
- 72,250, 3, 42, 17, 97,181, 34,114,134,249,249,144,238,160,199, 98, 81, 16,245,251,228,123,123, 40, 21,163, 36,203,149, 71, 59,
- 93,107, 1, 48,214,177, 92,137,197, 97, 52, 44,214, 92, 97,214,249,241,187,143,122, 13,135,128, 48, 74,246, 90, 43,207,182,247,
-128,169,150, 87,161,150, 49,167, 74, 69,161, 75,142, 67, 65, 15,224, 31,177,246, 58,175,241,227, 61,217,180, 9, 99,120,239,223,
-137,148, 38,137, 34,242, 52,165,219,201,232,118, 82,242, 60, 35,207, 51,178, 52, 38, 77, 19,146,184,237,130,213,138,241,174,159,
- 81,212,165,190, 56,105,254, 49, 69,253,169, 46,222,121, 7,208,122, 78,201,178, 83,111,218,162, 94,122,207,125, 89, 81, 86,158,
- 95,209,174,156,116, 40,232,190,176,175,138,122, 43, 46, 6,124, 81,151, 50, 92, 88,237,200, 83,182,226,182,213,248,221,231,189,
- 94,244,234,185, 79, 25, 51, 56,231,150,209,167,173, 92,197, 4,127,167,107,163,231,240, 96, 7,191, 3,241,197,188,245,187, 59,
-103,150,169, 52,235,187,120, 25,140,246,178, 69,147,182,251, 89,185,194,253, 8, 37, 46, 32,251,220,133,112, 1,205,165,253,203,
- 36, 89, 68,191,147, 81, 77,103,252,232,213,215, 40,171, 26,173,225,198,141, 61, 78, 71, 53,159,255,210,215,217,186,180,207,245,
-155, 55, 73, 84,132,194, 48, 31,141,217,236,119,185,115,231, 35, 14,142, 78,184,125,251, 35, 78,143,143,185,122,105,159,205,254,
- 22,157,238, 38,131,141, 77,182,119,247, 72,226, 1,113,212, 3,161,120,227,205,215,217,220, 24,240,252,115,183,120,248,224, 33,
-183,111,127,196, 55, 94,121,133,211,225,136, 56,203,216,222,221,225,147,187,119,249,254, 95,124,159,127,248, 15,254, 1,145,142,
-184,253,254, 7, 75, 42,155,115,142, 75,253, 62,163,225, 25,189,193, 46, 63,247,171,191, 74, 61,124,192,163,219,183,121,116, 50,
- 69, 39, 93,116,166,168, 22,134,151, 95,250, 9,250, 91, 25,175,189,250,109,154,211, 17, 70, 41,102, 38,208,226, 2,114, 82, 34,
-169,172,230,235,175,252, 44, 55,175, 93,226,240,225, 3,176, 53,179,249,194, 83,198,164,243, 2,191,101, 82,218, 90,198,222,242,
-125,119, 49,123,207,137, 11, 50,185,139, 28,126,247, 12, 52,255, 10,181, 40,132, 88, 34,101, 91, 20,162, 63,133,250, 81, 83,123,
-242,215, 82,250, 83,122,200, 30, 78, 90,161, 92, 59,122,239,100, 68,105, 28, 44,103,209, 74,204, 18,198,238, 14,248,195,127,253,
-175,120,231,213,191, 96, 35,247, 22,150,211,243, 49,163, 73,193,151, 94,121,133,237, 75,151, 24,108,237,120, 65,150,210,164, 74,
- 32,235, 10,105, 26,100,146,145,167, 25,179,241,144,225,232,156, 78,175, 79,214, 31, 96,235,134,233,233, 25,195,227, 83, 14, 15,
- 15, 41,230, 11, 22,211, 9,139,217,140,211,243, 49,198, 89, 6,155, 27,212, 54, 98, 56, 45,136,147,132,205,205, 62, 66, 10,108,
-237,104, 76,141,138, 98,102,101, 67,213, 52, 68,169, 47,198,199,199, 39,244, 58, 61, 76, 83, 98,194,200,210,119, 54,146, 44,139,
-137,181, 66, 88,255,103, 59,131,109,250,155,187,108,239, 92,162,191,177,201,172,172,252, 24, 91, 72,102,211, 25,117, 93, 51, 28,
-142,232,111,108, 32,117, 4, 82, 17,199, 62, 48, 6, 1,113, 18,211,201, 50,154,186, 70, 72, 65,154,231, 30,178, 34, 60, 71,218,
-154,134,166, 44,176,245,130, 60, 77,249,248,254, 67,198,139,130, 72, 75, 98,235, 72, 5,244, 18, 79, 6,115,206, 11,245, 12, 80,
-150,150,110, 55,103, 50,169,232,100, 41, 73,150, 81,184,134,172,215,231,236,209, 9,179, 69,197,185,115,200, 72,208,111, 36, 89,
- 87, 17,167, 26,169,172, 87,191, 71, 49, 90,249,177,187, 12,118, 89, 25, 70,233, 74, 5, 47,116,216,244,202, 16,102,226,156, 93,
-237, 57, 67, 17,151,235,215,102,152, 16,185, 0, 62,114, 2, 12, 80, 91, 23,146, 5, 3, 2, 59,228, 89, 84,139, 25,102, 54,198,
-140, 78, 89,156, 13,185,123,239,152, 15, 31,156,114,190, 48,228,105, 70, 7, 11,213, 28,204, 2,211, 20, 56,103,189,141, 80, 72,
-132, 83, 68, 82,163, 29,136,178,196,204, 38,212,243, 49, 74,121, 63,190, 8, 22, 79,107,252,193,110,125, 65,224,150,124,123, 19,
-246,234, 30,158,131, 51, 97,138, 23, 22, 99, 33,170,149,176,115,245,164,111,131, 51,130,187,183,239,113,239,227, 7,228, 73, 76,
- 93, 46, 80, 74, 80, 56,141, 83, 49, 58,138, 25,143,198,116,187, 3, 92,148, 81, 37, 41, 40,141,157,207,169,230, 19,122,189,140,
-241,162,160,187,123,137,108,115,211,179, 36, 34,137,212,173,234, 59, 68,215, 58,223, 17,251, 96, 28,252,189, 27,169, 37,174,121,
-105,129, 13,161, 58, 77,227,217, 36, 34,112, 41,252, 14, 93, 6, 87,212,106, 58,231,215,180,122,213, 41,183,157,185,246, 10,116,
- 31,123, 42,151,228, 53, 31, 28,214, 98, 95,253, 62,189, 9,147,129,198, 52, 56,227, 9,148,113, 20,121,183, 76,238, 39,124, 89,
-158,145,102, 73,216,213, 71,232, 40,124, 13,218,139, 30,165,146,126, 4,175, 52, 74,135,228, 71,173, 61, 65, 80,168,139,220,142,
- 31,163,243,186, 56, 81,182, 23, 28, 63,109, 22,133,109, 90,161,156, 47,228, 69, 81, 82, 44, 10,170,170,193, 26,191,126,209,203,
- 78,189,117,152,249, 67,136,159, 74,177,212,202,168,231, 46,111,254,190, 23,182,173,198,226,237, 7, 47,149,234, 50, 88,207, 66,
-234, 90,123, 81,217, 39, 54,174, 43, 51,125, 24,165,175,189,176,214,173,129, 34, 92,232,204,141, 91,178,131, 91, 52,160, 23, 55,
-120,228,163, 90,190,208,161,160,175,157,190,151, 49,174, 98,181,159,127, 18,116,178, 92, 2,136, 22, 81,170,201,243, 14, 74,193,
-165,221,109,110,191,251, 62, 7, 15, 15, 73, 34, 65,156,104, 74, 11,187,151,111,112,237,198, 45,190,246,141,111,112,239,206, 71,
- 84,229,140,157,173, 29,142, 30, 61,228,141, 31,254,144,243,225, 24,235, 4,183,158,123,158,253,221, 75,212, 69,195,100,178, 64,
- 39, 49, 22, 67,183, 63, 64,168, 20,235, 34,166,179, 17, 58,169,153, 79,167,220,189,115,143,126,167,203,215,191,254, 13, 62,252,
-232, 35,190,246,141,175,115,247,222, 39,244,123, 93,234,186,164,219,233,240,230,155,111,241,159,255,231,255, 51,254,226, 47,254,
-130,241,100, 18, 38, 22, 2,217, 52, 88,103,232,246,123, 92,187,117,147, 95,250,230,151,248,240, 7,223,101, 56, 42,136, 58, 61,
- 68,226,104, 74, 1, 46,229,107, 63,253, 53,110,191,247, 42,229,241, 1,141,132, 81,213, 96, 90,245,119,136, 6, 52, 40, 54,119,
- 47,243, 27,127,235,215,248,232,237,183, 72,133,163,105, 26, 14, 14, 30,115,253,242, 46,213, 98,238,163, 0,195, 65,201,173, 69,
- 68, 58,177,150,204,182, 60,137,187, 11,239,179, 62,197, 89, 67, 39,138, 16, 33,233, 4,225,128,214,170,189,195,141,172,214,108,
-144,202,171, 90, 35,189, 58, 61,183,145,135, 74,120,128, 69,154,133,162,222,233,144,230, 9, 81, 26,163,147,196,135,107, 72,143,
-237, 20,178, 29,221, 10, 30,126,248, 30, 15,222,127,139, 23,111, 92,102, 54, 29,243,234,107,111,240,187,191,247,247, 65, 74, 78,
- 78,143,145,192,160,215,243, 55,184,146, 52, 77, 73,221, 84, 72, 29, 19,119,187,196,145,166,168, 74,132,148,116,123, 61,198,167,
-103, 76,206,206, 40,138,146, 69, 89,145,229, 25, 91, 27, 3,102,243, 5,247, 14,142,169,157,163,211,239,113, 62, 42, 57, 31, 23,
-116,122, 57, 27,219,125,242, 36, 65, 32,153,204, 39, 24, 39, 49, 66, 51,153,207,168, 77, 77, 81, 20, 84,139,134, 52, 73,176,214,
- 7, 80,216,208,133,197,218, 39,182,101,177, 70,184, 26, 43, 52,113, 54, 64, 70, 41, 8,136,210,148,107,207,221,162,155,119,152,
-142,198,116,187, 29,143,161,117,144,164, 9,123,151, 46,249,174,201, 26, 58,221, 14,131,126, 63,100,183, 39, 68,113,132,177, 13,
- 78,192,249,112, 24,242,197, 3,154,181, 46,104,138, 25,121,146,208, 56,120,116,120,136, 49,142, 8, 72,129,126,170,145, 52,196,
- 73,228,169,117,133, 15,162, 73,210,136,170,108,136,195,132,165,209, 48, 45, 11,236,164,100, 58, 91,112,232, 60, 14,117,208, 40,
-242, 92,144,100,138, 40,150,203,215, 90, 5, 47,113, 59,169,107, 17,196,178, 29,181, 47,187, 58,233, 39, 30,139, 5,139, 98, 65,
-146,196, 75, 26,161, 8, 83, 34, 25, 82,182, 68,112,220, 56, 41,176, 2, 26, 39, 48, 78,248,195, 72, 59, 45, 52,214,239,215,235,
- 6,202, 57,197,217, 33,143,238, 30,240,241,157, 17,143,143, 38,124,124,239,152,131, 79, 14,216,205, 5,219,221, 8,105,203,160,
- 72,151,116,147,140,110,148, 96,206, 39,124,244,198, 7, 20,143, 31,225, 70,231,212,227, 83,242, 44, 90,101, 2,173,217,136, 91,
-176,249, 50, 85, 82,128,179, 62,149, 14,227,247,239,174,221,183,135, 67,139,112, 65, 84,103, 67, 32,202, 82, 32,104, 48,149,228,
-213, 63,255, 17, 77, 81,162, 37,212, 85,129,210,154, 90,166,160, 98,140,105, 40,230, 37,105,167,135,204,187, 20, 1,113,107,167,
- 19, 76,179, 32, 73, 53,227,178,100,243,202, 53,226, 78,207,239,175,117, 91, 96, 69, 56,144,176, 68,134, 91,107, 16,176, 44, 52,
-237,215,232,130, 82,223, 25,150,207,118,107,219,245, 8,203, 46, 61,214,171, 14, 84,173, 61, 11, 68, 59,141, 81, 10,161,253, 91,
-203, 76, 89,214,129,117,103, 84, 88,101,216,160, 38,111, 66, 40,146,181, 54,216, 96,189, 91,161,157,238, 37,185,183,201,249,130,
- 30,173, 33,209, 87,201,108, 42,140,223,219,162,238,227,155,163, 21,250,247,175, 80,204,159,197,144, 95, 6, 98, 57,183,204,134,
- 55, 77,229,133,114,101,237,189,234, 69, 73, 89,122,157,149,144,129, 7, 19,233, 37,243,101, 53, 85, 8,220,134, 96,235, 83,159,
-185,186,253,251, 90,203, 37, 8,102,101, 63,107, 79, 79, 43,139,145, 90, 75,221, 90,239,203,150, 81,167, 23, 60,229,173, 79,148,
- 11,227, 90, 90,191, 99,248,102, 90,174,239, 58,133,206,217,128,171, 21,225, 64, 33,212,218,180, 64, 92,164,154,181,130,172,144,
-100, 36, 3,133, 76, 10, 15,153,104, 71, 51, 2,129,179, 48,155, 77, 25, 12,250,196, 74,242,193, 91,111,115,118,122, 78,150,101,
-136, 56,102, 97, 53,183,110,221,226,133,207, 60,199,199,239,191, 67, 44, 29, 85, 49,231,240,240,144, 60,207, 25,141, 38, 88, 39,
-217,217,218, 35,214, 41, 82, 37,140,102, 5,139,178, 90,250, 7,141,243, 60,239,166,174,144, 88,234,170, 34,203, 58,100,105,198,
-209,225, 17,247,238,125,194, 23,190,240, 57,166,211, 17,159,255,220, 75, 60,184,119,151,217,116, 66,150,166, 60, 62, 56,164, 40,
- 74,126,235,183,127,135, 63,250,163, 63,242,230,152,128,131,140,156, 35,205, 35,166,243, 5,191,241,119,254, 30,119,222,121,139,
-163, 15, 63,160,168,230, 24,153,161,162,140,209, 98,202,207,254,226,207,243,248,238,135,184,217, 33, 70,214,156,205, 42,138,144,
- 61, 45,133,162,211, 25,144,244,122,168, 40,227,119,127,235,215,249,228,189,219,148,163, 49,211,179, 51, 98, 5,123,187, 3,102,
-179,145, 47,234,107, 57,245,235,239, 95,152,206, 60, 49,130,247,137,104,254, 48,247,100,124, 33,237, 88,214, 31,177,214, 40, 84,
-171, 61,105,155,241, 44,130,181, 82,173,237,217, 91,225,158,192,119, 5,105, 26,147,119,114,242,110, 70,146,182,170,216, 36, 4,
-108, 40, 15, 10, 9, 55,168,169, 11,126,240,167,223, 98,118,122, 72,130,229,181, 31,126,159,157,157, 77,182, 55,250, 28, 63,186,
-207,124,116,142,105,106,242, 78, 78,119,208, 67,164, 49, 42,143,137,179,132, 98,116,142, 43,102, 72, 83, 33,157,161,156,207, 72,
-164, 36,209,145,183,222,196, 41,105,183,199,165,203,123,196, 81, 68,156, 36,228,189, 1, 58,142,216,219,221,229,228,116,200,193,
-225, 49, 82, 75,250,189, 14, 74,250,100,186,209,116, 76, 81, 89,146,180,195,124,177, 96, 94, 44,200,210,156,162,168,151, 2,196,
- 80,247,136,148, 36,139, 37,253, 44, 33, 75,180, 79,198, 82, 49, 22, 65,183,155,163,112,152,198,160,117, 76, 39,239, 17, 71, 49,
-231,195,115,226, 52,101,255,242, 62,206, 26, 14, 30, 63, 36,146, 18, 29,172, 71,105, 28, 99,155, 26,165, 37, 89, 26, 83, 21, 5,
- 69, 81, 82, 87, 53, 82, 8,172, 49, 36, 90,161, 4, 84,139, 5,145,132, 65,175,195,209,217, 57,163, 89, 1,214,145, 0,131, 84,
-163, 48, 8, 41,169,140,163, 40,125,148,171,142, 36, 77, 99,137,148, 6, 12, 58,211, 12,199, 19, 34, 20,163,233,148,145,115, 24,
- 43,232, 58, 73,172, 13,113,226,149,189, 58,210, 8,180,239,214,218,135, 87,187, 31, 95,138, 47,229,242,173,237,208, 35,229, 31,
-206,173,240, 82, 0, 66, 9,175, 96,142,244,178, 48,160,100, 64,156, 58,154,144,147,109,240,113,187,126,113,236, 39,136, 69, 99,
-104,154,138,122, 54,101, 49,156, 33, 42, 75,102, 5, 3, 1, 29,105, 41,167, 99,118, 7,154, 88,251,164,199, 60, 74, 81,214,241,
-254,107,175,243,253,255,238, 79,121,252,254, 7,136,242,140, 68,195,214,238, 22, 81, 30,131, 48,136, 40,196,180,134,245,144, 11,
-138,214,214,169,226,237,109, 54,140,224,195,174,125,137,240,246,186,129, 22,238,227,183, 28,225,231, 33,253, 10, 98,120, 58,225,
-237, 55,223, 37,209, 17,206, 53,190,176, 57,129,149, 9, 8,201,108, 50, 37, 78, 51, 92, 20,163,122,125, 22, 18,180,214,204, 79,
-143, 73,252,183,207,162, 54,108, 94,190,138,206, 59,136,128, 9,143,180, 23,144,181,207, 98, 27,216,240,174, 45,212,161, 9, 91,
- 30, 60,194,171, 96, 77,136, 82, 53,198, 43,185, 91, 6,124, 0,144, 69, 97, 63,172,117, 43,126,148, 79,237,205,125, 3,160,195,
-234, 85, 5, 42,167,255,119,197,229, 95,241,219,109,219, 36,134,166,177, 85,232,199, 73, 68,154,121,182, 69, 22,216, 22, 58, 14,
-205,132,148, 75,110,125, 59, 61, 20,218,231,160, 72,237, 17,224, 66, 71, 94, 99,240, 68, 81,255,180,226,254, 36,249, 84,132,125,
-186,187,144, 47, 29,214, 5, 77, 80,191,151, 94, 36,231,133,114, 13,198,186,112,192,144,203, 98,174, 46, 20,244,213, 52,218, 90,
-139,122,249,230,165,223,143, 34,189,156,215,199, 45, 83, 86,235,229, 56, 34, 90,210,223,164,103, 49,183,197, 84,178, 82,196,203,
-117,184, 88,187,203, 90, 21,122, 25, 78,103,173, 74, 81,182, 76,222, 0, 79,112,107, 97, 47, 23, 31,248,114,121, 17,173,212,239,
-110,229, 93,127,226, 7, 6, 23,109, 81,203,194,190,132,234, 40,190,242,165, 47,241,232,222, 93, 62,124,247, 61,234,218,146,117,
-115,230, 70,112,235,165,159, 96,123,107,147, 68, 54,136,106,198,240,228,132,155, 55,110, 80,213, 21,143,143, 14,137,147,148,237,
-205, 29, 92, 35, 40, 22, 13, 22,197,120, 81, 48, 28, 79,160,170,169,235, 18,173, 36,184,134,217,108, 66,177, 40, 89,204, 11, 16,
-146, 40,138,232, 15,122, 56,219,240,224,193, 39, 92,190,180,203,143, 94,253, 62,223,248,250, 87, 24, 14,207,185,117,235,121, 6,
-131, 77, 30, 31, 28,243,202, 79,126,147,131,195, 35, 30, 31, 29, 81,153, 6, 37, 28,159,217,219, 36, 78,165, 31,239,111,222,224,
-197, 27, 87, 57,254,209, 31,209,152,134,243, 34,166,196,161, 83,197,222,254, 13,110, 93,189,202,251,111,126,139,147,179, 99,226,
- 60, 97,178,176, 24,171,137,116, 15,169, 82,162, 36, 3,169,249,197,159,251, 37,170,201,148,225,163,199,236, 12,186,116, 18,197,
-206,238,128,179,225,233, 18,102,240,151, 49, 12,125, 99, 46, 86,169, 71,150, 11,216,154,101, 6,146, 99, 41,132,108, 53, 19,237,
- 30,244,169,152,223,245,155, 20, 31,180,225, 90, 22,119, 24, 77,106, 37, 72,210,152,188,147,145,229, 25,113,154,160,147,196, 71,
- 82,234,208,165,175, 89,217,100,164,216,232,230,124,231, 15,255, 29,183, 63,120,135,155, 55,111,176,185, 57, 32,142, 34,202,217,
-152,186,156, 83, 85, 37, 8, 65,191,223, 35,235,118,253, 13,227, 12,162, 41, 24,158, 28, 98,155,146,106,177,224,236,248,152,106,
- 62,103,115, 99,131,188,191, 65,190,185, 77,127,123,123, 9,201, 72,178,140,172, 59, 64, 72, 69,191,223, 39,207,251,124,120,247,
- 46, 82, 74,246,246,246,232,230, 93, 4,142,243,225,136, 69, 81,163,163, 4,231,240,190,219, 36, 97, 56, 28, 35,133,247,201, 90,
-219,160, 4,116,178,132, 60,213,116,178,152, 68, 71, 84,198, 49, 43,107,170,198,146, 37, 17, 18,131,214, 26,235, 32,138, 19,250,
- 27, 27,116,186, 29,138,178, 96, 58, 29, 35,156,227,236,244, 4, 83,215, 8, 33,200,211,132, 94, 55,247, 95,199,249, 41,155, 27,
- 27, 68,145,166, 40,138,224,113, 95, 32,112,228,177, 87, 9,151,243, 41,166,152,225,170, 5,165,181,220,125,116, 12, 50, 66, 56,
- 75,166,156,207,249,142, 99, 12,154, 69,229,161, 46, 82, 75,172, 53, 20, 69,133,176,150, 56, 85,204,203, 2,140, 99, 58, 47,169,
-164,100, 81, 91, 98, 33, 73,164, 37,138, 64, 69,146, 56,142, 81, 42, 70, 74, 15, 33,105,131,191,218,110,125,201, 55, 8, 15,248,
-246, 89, 34,148, 87, 81, 35, 86,224, 34,161,229,178,195,179, 66, 6,140,171, 14,224, 20,137,145, 26, 39, 21, 86,250, 28, 56, 41,
-117, 64,199,224, 99,120,157,195, 53, 53,182,170,112, 85, 73, 42, 29, 91, 61,201,238,142, 98,239,114, 78,172, 45, 66, 58,148,214,
-222, 58, 40, 28,218, 25,158,123,110,147, 91,159,221,103,247,250, 62,251,183,174,147,108,111, 80, 71, 18,153,103,184,214, 34, 37,
-228,178, 32,250, 41,168, 13, 66, 67,127,141, 59,227,149,240,206,239, 6,194,226,203, 55, 69, 24, 23, 50,204, 91,181,184,196, 73,
- 73, 99, 5,175,191,250, 38,147,243, 9, 73,228, 95,159,186,105,112, 40,162,204,147,225,202,162, 36,206,114, 84,191, 79,147, 36,
-148, 66, 34,129,217,233, 49, 91,131, 46,243, 98, 78, 35, 53,219, 87,174, 35, 18,207,125, 88, 31,251,182,124, 17,236, 42,128,197,
- 5,117,188, 84,242,105,214,185,101,137, 4,111,179, 33,148, 36,144, 71, 67,168, 75,164,137,244, 42,175, 92, 41,189, 26,247,135,
-220, 7,161, 86, 20,202,245,167,139, 92,198,153,134, 6,100, 45,185,205, 7,142, 25,159,107,161,189,152, 47, 77,227,192,182, 88,
-217,227, 86,122,173,213, 20,152, 86, 79,166, 61,255,222, 55, 11,218,199,227, 94,240,169,115,129,115,223,186, 86, 28, 79,200,140,
-214,106,214,170,216,135, 78,221, 54, 75,161,156, 39,202,249, 55, 47,148,115, 23, 68,195,190, 9, 18, 23,242,224,173,245, 34,232,
-186,105,208, 75, 97, 3,171, 0, 14,173, 20, 81, 75,240,106,205,238,237,220, 62, 68, 30, 34,220, 26, 72,100,157, 8,214, 10, 85,
-196, 26, 40,236,201, 96, 22,175,195, 82, 66, 16, 57, 9, 17,222, 38,230, 20,194, 69, 40,185,130,241,183,129, 12,106,121,177, 8,
-148,208, 75,206,179,114, 62,219,217,134,120, 62,107, 89, 42, 51,157, 3, 39, 47, 66,253,187,189, 46,105,146,112,118,114,130, 20,
-142, 36,129, 36,207,153, 23, 48, 24,108,161, 20,228,169,192,204, 27,174, 93,190, 4,198, 50,159, 78,185,114,245, 50,174,182, 28,
- 62, 60,161,152,214, 40,157, 18,117, 34,116,236,125,209,253, 78, 66, 89,205,113, 86, 48,155, 78,177,182, 97, 49,171,112, 70, 96,
-148,247,241, 74, 9,189, 65,143,186,140,248,209,107,175,241, 19, 95,120,137, 65, 39,229,236,244,140,126,127,147, 31,124,255, 7,
- 72,157,241,255,249,175,255, 27,254,209, 63,250, 79,249,225,235,175, 45,113,151,105, 28,163,112,124,248,222, 59,136,238,183,248,
- 95,254, 79,255, 1, 87,174,239,113,124,251, 1,167, 39, 39,104, 91,115,229,185,125,190,251,103,223,227, 63,251, 71,127,151,180,
-191, 73,164, 31,177,153,116,120,116,214, 80,155, 8, 33,187,204, 22,150, 40, 79, 24, 13,167,188,251,254, 7, 60,119,245, 10, 31,
-189,158,208, 85,138, 60,106,232,101, 25,113, 20, 83,215,139, 53,177,155,120, 2,137,124, 49,115,120, 29, 12, 36,240,118, 27, 43,
- 37, 70, 58,148, 20, 88,105,113,202,243,186,149,112, 40, 28,181,108,252,222,118, 13, 17,226,111, 88, 15,226,105,132, 64, 75, 31,
-149, 41,165,244,129, 21,202, 63, 56, 44,142,166,241, 5,163,189, 1,101,235,138, 8, 15, 76,199,170, 91,179,225,100,220,223,218,
- 99,231,242,117, 50, 95, 61, 56, 62, 27,178,123,233, 26, 89,183,195,108, 58, 97, 50, 28,114,247,131, 15,136,133,228,101, 11,121,
-175,131,173, 75,180,114,100, 89,130,107, 28,121,183, 79, 99, 14, 24, 77,103,148,101, 77,156,192,124, 54, 39,235, 15,188,194,218,
- 89, 84, 20,145,197, 17,103,195, 49,179,217,130,141,237, 13,118,247,118,152, 76,231, 76,166, 5, 27,131, 1,121,183,195,238,222,
- 30,167,103, 31, 83, 45, 74,159, 57,158,119,168, 66, 68,103, 85, 87,164, 73, 12, 14,170,170, 66,144, 33,132,194, 24, 71, 81, 53,
-140, 43,195,112, 50,227,210,222, 30, 77,211, 16,139, 54, 33,203, 80,150,115,186,145, 98,103,103, 3, 33, 29,103,103, 25,143, 30,
- 29,112,109,127,223, 39,166,229, 29,159, 67, 46, 4,157, 44, 99, 40,252,195,181,169,161,155,229, 40, 36,211,209,136,166,134,210,
- 57, 6,157,156, 52,142,153,157, 23, 8, 91, 97,231, 11,148,243,113,194, 11, 33, 24,214,142,174,246,152,214,147,241,140, 40, 74,
- 60,239, 93, 8, 84,236, 99,136,139, 69, 69, 63,132,185, 72,229,239,219,190, 84, 76,133,101,138,163, 87, 66, 90, 56,146,220, 7,
-180, 68, 26, 31,216,179, 28,247,138, 11,246,199, 54,217,172, 77,152,244, 60,117,131,179,171,157,110,219,248,214,214,248,215,197,
-249,176, 16,159,166,166,112, 97,250,227, 11,184, 66,106,223, 5, 43, 33,208,206,145, 88,129,232,110,194,118, 73, 86,213,168, 88,
- 99,103, 99,226,216, 18,103,130,100,144, 18,119, 83,162, 88,177,121,105,143,221, 43, 87,232,102, 41, 52, 87, 48,162, 65, 39, 41,
- 82, 71,232, 78, 15,155,230,168, 52,195, 74, 95, 28,156,106, 57, 28, 43,198, 56,206,249,232,212,240, 32,179,214,160,156, 95, 45,
- 88,235,104,156, 3,235,139,184, 53, 22,173,244,170,160,227, 16, 40, 78,142,207, 56,120,124, 12,206,139,207,202,218,129,212, 72,
- 25, 83, 53, 53,117, 93,147,196,254, 96, 97,226,136, 74,123, 1,177,171,189,118, 35,201, 50,206,199,231, 68, 89, 7,180,191,143,
-188, 80,213,175,194,132, 2,101,253,248,216, 24, 75, 82, 69,148,117,132,113,102,205,146,235,150,246, 96,223,206,185,181,251, 52,
- 36, 65, 74,187,108,180,218,105,223,242,208,191,150,170, 38,195,218, 86, 10,235,119,249,126, 95,129, 8, 33, 56,158,204,103,189,
-179, 1,111, 67,211, 73, 76,218,100,212,117,237,189,248, 85,205,130, 18,112, 75, 17, 95,155, 91, 33,228, 69,226,165, 64, 34,157,
- 10,235, 98,187,202,145, 8, 52,194, 39, 27,201, 79, 11, 26, 91,190,255, 36,248, 93,172,108,112,246, 25,122,163,214, 45,246,228,
- 63,214,249,215, 95, 25,135, 50,134,186, 89, 53, 44,198,132, 21,169,243,107, 84,157,198,209,242,116,229, 99,222,220, 26, 36,166,
-245,149, 7,160,204, 90,144,251,106,167,245,236, 24,206,103,165,216, 60,237,223, 99,153, 24, 36,156, 90,138,195, 84,179, 10,105,
- 88,191, 64,252, 73, 76,132,208, 7,133, 67, 47, 63,143,181, 22, 67, 56,193,134, 17,255, 42,165,199,255,125,181,115, 12, 54, 6,
-188,250,234, 15,153,207,166, 36,169,192, 20, 48,173, 74,174,220,124,153,173, 94,135, 88,207,184,125,251, 45,158,191,241, 60,151,
-247,174,113,231,147, 71,244,123,125,186,105,204,220,204,253,206, 10, 75,167,219,193,226,200,243,148,126,175, 3,198,219,150, 58,
-217,128,241,228,148,178, 44,113,206, 16,233, 20,231, 26, 31,167,169, 35,138,166,196, 9, 71,150,199,220,191,127,143,233, 98,206,
-215,191,254, 21,238, 63, 60,225, 23,127,225,151, 57, 60, 58,231,232,241, 1,121, 28,243,217,231,159,231,195,143,222,131, 6,142,
- 78,135, 92, 31, 92, 69, 69, 17,199,143,238,112,247,241, 25, 55,191,250,211, 60, 28,253, 59,204,241, 24,109,107, 70,167,135,116,
-178, 75, 28,159, 13,185,246,194, 23,249,240,221,247,217,232,118,233, 68, 51,230,149,135,107, 88, 23, 51,157, 54,196,166,224,237,
-119, 63,228,167,255,241, 63,196, 36, 41,103,103, 15,216,221, 72, 48,117,141, 86, 17, 84,139, 11, 69,124,233,129,253,180,198,253,
- 2,130, 95, 44, 67, 43,156, 19, 75,129,164, 10,184, 90,171,164,223,214,186, 26,101, 45, 70,250,120, 75,235, 44,177,211, 40,227,
- 79,205, 70, 26,111,103, 90,162, 11,107,127,232, 20, 16,107, 31,101,235, 66,118,186, 88, 45,194,150,162,138,229,105,216,195,147,
- 1,201,205,231, 94,192, 93,218,231,193,131,187, 8,109,201,251, 3, 92, 93,147, 9,197,100, 50, 99, 49, 91,112,247,195,143,144,
-117,195,181,203,251, 12, 54,251,184, 60,162,183,179,143,107, 44, 66, 40,110,216,136,147,163, 35,106, 25,161,133,198,184,154,178,
-170, 81, 18,104,106,132,171,137, 59, 9,157, 78,159,249,108, 66, 66,195,151,190,242, 69, 94,123,237,109, 14, 15, 79,216, 28, 12,
-184,188, 55,160,172, 43,206,142,199, 20, 69, 77,150,103,100,221,140, 69,229,167, 61, 77,101,124,114, 25, 80,213,181,239,118, 7,
- 93, 26, 99, 57,159,204, 56,154,213, 72, 21, 81, 54,126,247,171, 36, 8,229, 35, 69,141, 41, 41, 22,142, 78,183,199,214, 70,151,
-186, 44,248,236, 11,207,243, 71,127,252, 45,226, 52, 37,206,114,250,253, 1, 27,253, 62,105,154,176,127,105, 31,107, 44,113, 20,
- 51,232, 71, 65,141, 13, 85, 83,177,168, 43,108, 49,227,248,240,128,225,233, 57, 69, 85,114,114,120, 66,228, 96, 97, 27, 42,225,
-152, 91,152, 57,137, 43, 42,198,165, 97, 43,213,148,214,139,100,165,244,129, 28, 66, 43,206,143, 70,164,187,125,138,178, 68, 99,
- 73,107, 24, 72,197,185, 49, 84, 86,178, 40, 29, 73, 97,200,114,183,220,211,122,113,152, 12,175,223, 26,135,184, 13,197,104,243,
-186, 3, 72,198,226, 99, 90, 91, 28,103, 11,164,177,107,199,188,218, 88,148,138,252,254, 92,250,125,165,146,106, 25,255, 43,133,
- 32,118, 14,229, 64,139, 30, 8,131,117, 13,113, 30, 65,145, 99, 41,208,218,161, 98,137,234,102,116, 6,125, 6, 87,174,144,239,
-110,123,161,152,173,209,206,249,116, 55,157,160,211, 14, 58,237, 18,176,121, 56,105,112, 81,184,167,172, 89,170,218,145, 4,223,
-186,197,184,102,233, 80,171,202, 38, 60, 3, 37,126,234,238,191,247, 40,246,227,104, 43, 5, 38,172, 23, 63,254,248, 1,141,241,
-247,156,214,154, 2,129, 69,146, 36, 57,101, 99, 40,235, 25, 91,253,109, 22, 74, 81, 71, 49,196, 49,162,242,187,251, 40,210, 30,
-202,131, 36, 74, 82, 92, 43, 52, 13,163,223, 72,251, 73, 71,235,110, 50,141, 37,137,189,226,189,110, 84, 16, 57,175, 28, 79,214,
-134,144, 39, 97,151,108, 10,132, 63,216,107,213,238,134, 35,111, 89,214,173, 77,121, 61,162,123, 61, 45,205,173,136,122,132,105,
-237,218,225,174,181,213,185, 56, 66, 59, 75,236, 12, 89,147,250,162, 94, 55,129,215, 99, 86,128,155,229, 36, 55,208, 47,181, 66,
- 56, 17, 4,222, 22,108, 3,118, 93,164,245, 12,202,233, 51,194,197,126, 44, 70, 91,172, 40,255, 45, 94,215,134,215,205,173,133,
-201,172,146, 49, 87, 59, 79,223,205, 75, 26,107, 80, 70,122,164,178,168,151,113,182, 46,252,220,154,166, 65,235, 40,236, 49, 66,
- 44,158,183,139,172, 83,220, 90,250,219, 10,226, 32, 3, 2,178, 85, 72, 63,235,155, 93,137,166,159,254,102, 69,187, 71,112,107,
-228,176, 54, 54, 78, 10, 42,109,215, 48,132, 43, 98,143, 88,138,177,214,181,162, 50, 28,114, 37, 17, 64,212, 22,115,183,178,200,
- 57,255, 39, 21,146, 56, 75, 56, 63, 57,103, 52, 26,145,166, 17,196,130,163,217,130,207,239, 95, 38,166,228,133,231,246,121,103,
-254,136, 79, 30, 60,224,240,160, 96, 54, 41,120,241,197,235,184,106,129, 45,102, 40,229,200,122, 25, 86, 57,202,106,225, 1, 25,
-166, 98, 58, 57, 69,200,156,119,222,186, 77,146, 41, 54,182, 98,156,105,124,120, 64,156, 80,215, 53,198, 25,148,214, 36, 90,210,
- 84,130,211,227, 83,186, 27,219,232, 40,162,215,237,177,181,181,195,116,234,225, 3,127,240,111,254, 53,191,254, 55,127,133,255,
-227,135,239,162,133,226,108, 86,162, 30,157, 66, 18,243,245,203, 55,120,120,112,194,213,175,253, 18,229, 31,255, 1, 40,184,122,
-117,159, 8, 71,181, 24,243,207,254,197, 63,231, 87,127,234,235,124,114,243,135, 76,138, 9,155,221,136,147,121,137,181, 21,200,
-152,166, 49,184,133,227,222,131,199,212, 90, 82, 40, 69,227, 44,103,195, 51, 46,119,246,233,117, 7, 12, 23,227, 11,202,245, 11,
-187, 33, 39,159, 58, 69,138, 11, 59, 34,231,111, 16,225, 33, 54,202, 73, 79, 77,114, 14, 29,226, 21,173,173, 48,198,162,164, 70,
-107,127, 49,214,141,162, 14,171, 32,185,182, 66, 81,203,194,236, 87, 66,137,214,212,141,166,110,170,165, 16,198,143,189,228, 82,
-229,188,126, 83, 72,124,232,197,135,239,190,131,178,198, 83,206, 54, 55,113,103,142,197,116, 70,183, 59, 64,197, 29,172, 72, 49,
-166,102, 81,149, 28,157, 29,161,116,131,141, 46,179,213,191,142,173, 29,198,105,132,142,217,186,249, 2,253,189,203, 76, 39, 19,
-102, 69, 69,119, 99, 3,148,198, 84, 11, 31,168, 16,212,185, 82, 8,206,135, 35,172,180, 92,191,113,131,201,164,228,221,183,111,
-179, 40, 10,106,219, 97, 58, 26, 17,107,201,193,233, 9,117,217, 33, 73,182,233,247, 58,108,111,246,120,120,255, 17,166,242, 5,
-182, 44, 74,142, 79, 78,201,211,136, 60,221,230,124, 56,162,208, 29, 34,173, 57,159, 44,200,180,192,233, 16, 99, 28,249,200,210,
-122, 49, 65, 56, 67,214,233,145, 37, 9,163,201,156,173,173,109,142,143, 79,184,114,229, 38, 8, 24,157, 13, 89, 36, 49,253,141,
-126,152,166, 74,242,174,103,105, 47, 22, 11, 22,179, 57,194, 26,154, 98, 78,167,147,177, 88,228,156,207, 43,162,184, 67, 39, 51,
- 84, 85,133,113, 48, 53,142, 74,101, 52,101,129, 74, 52,211,178,194, 74,197,162,106,232,198,158, 2,103,173, 67, 90,201,116, 52,
-165,108, 44,177, 82, 52,101, 67, 47, 73, 57,181,134,194, 42,226,170, 65, 78, 26,210,184, 32,146, 10,171, 21, 78, 69, 56, 25,225,
-156,183, 80,137,240,102,132, 37,110,187, 91,225, 81,187, 72,225,139, 33,126,210,216, 34,125,101,240,119, 91, 97, 1,131,116,194,
- 23, 27,185, 54, 74,150, 2, 33,125,120,140,107, 12, 82, 58,210, 72, 16,101, 17,164,154, 56,145, 36,219, 93,116, 51, 67, 80,147,
- 68,150,142,104,200, 19, 77,183,215,165,187,181,131,234,118, 17, 90,160, 92,141, 51, 46, 20,244, 12,153,118, 32,206, 32, 73, 65,
-106,172,169, 16,194,248, 75,213,130,107,108,187,125,198, 41, 16, 86, 32,140,192, 10,143,174,245, 97, 29,128, 10,251,126,240,201,
-112, 82,226,155,102,255,245, 47, 22, 21,167,103, 35,170,202,144,233,152,186,174,124, 62,187,214, 52, 78, 80, 11, 71, 35, 4, 42,
-246, 46,145, 90,107, 76,104,216,156,177, 72,237, 35,162,107, 99,201,226, 4,235, 68,184, 46,220, 18, 36,165,219, 3, 68,164,208,
-117, 8,233,210, 17, 81, 20,194, 94,214, 1, 90,136,149,165, 89,248,162, 43,164,255, 28,113, 44, 61, 34, 54,241, 8, 88,239,118,
- 88,217, 91,125,231,110, 81,238,233,201,224,211,113,165, 98, 21,227,221, 82,232, 26, 67,154, 37,116,234, 28, 99, 12, 2,225, 29,
- 30,130,149,147,234,201,209,121, 27, 7,173, 36,202,170,167, 8,152, 23,243,206,197,179, 35,194, 5, 79,141,222,219,189,192,178,
-150,185,167, 59,122,150, 54,204, 39,243, 49, 86,131, 28, 95,203,252,100,218, 56,139,180,222,178,186, 76,163,116,126,138,167,117,
- 8,144, 0,177,204,186,125,114,159,189, 28,191,183, 39,223, 22,189, 41,197,133,221,182, 12, 99, 50,177,198,147, 93, 21,130, 11,
- 25,107, 56, 28,202, 89,172,242,221,156,210, 38,196,179, 74,116, 43,172,176,110,233,107,124, 82, 76,237,214, 58,199,213,239,133,
- 48, 83,231,130,181,115,101,169,192, 65,131,160,147,231,140,198, 67, 22,139, 5, 91,251, 57,229,204,209,219,216,161,147,119, 24,
-228,150,135,247, 63, 97,115,107,147, 78,190,205,155,175,223,101,111,107,159,243,179,115,178,184, 33,141, 35, 6,155, 61, 26,145,
- 50, 91, 24,100,237,112,117,197,116, 60, 34, 79, 83,230,115, 75,222, 29, 32,132,135,129,224, 20, 69,227, 71,127, 89, 39, 35, 78,
- 98,138,170,192,154,138, 72, 69, 36,121,135,219,183, 63,228,206,195, 3,126,235, 55,127,143,131,131, 17, 87, 46, 95,229,124, 56,
-228,206, 71, 31,241, 59,191,245,107,116,243,156, 98, 90,211, 80,115,116, 50,194, 41,193, 91,175,125,159, 23,191,244,203,124,225,
- 11, 63,205,209,204, 82, 55, 53, 71,135,135,188,248,252,139, 28, 60,120,192,230,214, 46,215,158,255, 28, 14, 56,120,248,104,153,
-147,238, 79,118, 30, 44, 99,106,195,189,123,247, 48, 8, 58,131, 13,138,121,159,179,199,199, 36,233, 57,253,172,179,140, 72,109,
-127,194,171,139,240,105,155,218,133,155, 46, 92,132,194, 6,102,181, 8,168, 70, 11, 66,248,177,188,148, 18,101,195, 40, 73,121,
- 27,145,148,146,186,150, 84, 33, 43, 64,174,173,118,116,139,146, 21,146, 40, 86,216,200, 67, 34,154,186,198,154, 6, 23, 8, 93,
-226,137,149,207,250, 74,160,156,207,120,251,245,215,168,207, 78,208,182,194, 57,131,194,224,234, 10, 41, 36, 81,146,163,163,132,
-162,156, 51, 47, 70,244,183,123,164, 27, 93,140,210,204, 75,131, 41, 43,156, 80, 40, 45, 72, 51, 77,220, 29,208, 79, 50,198, 71,
- 7,156, 29, 29,177,115,253, 38, 74,107, 22,101,227,137, 92,117, 77,222,201,232,117, 59, 76, 38, 99,182,171,130,171,215,174,242,
-240,254, 1,195,209,144, 52,113,204,231, 5,179,233,148,126,175,203,206,206, 22, 90,251,168,205,189,157,109,142, 31, 31, 48, 30,
-158,145, 36, 9,206, 52,156, 12, 71,152,166, 98, 50,157, 17, 39, 49, 87,158,191,225,247,191,117,193,108, 81,161, 83, 77, 39,207,
- 73, 58, 61,226, 88, 98, 77,205,249,240, 28,240, 34,184, 71,143, 15,217,217,222, 2, 33,216, 28,244, 73,210,152,170,170, 56, 31,
-157, 83,149, 11,182,119,183,169,155, 26,225, 26,210, 56,230,250,213,171, 62,212,101, 50, 70,154,134,189,173, 13, 14,143,142,249,
- 76,109,249,137,113,193,172,134, 55,239,124,196,159,124,247,207,105,170,154,243,162,161,167, 5,113,172, 24, 79, 43, 18, 9,243,
-178,166, 19, 71, 62, 69,205,120, 53,180, 86,154,217, 98,129, 70,162,133, 64, 88, 67,170, 36,211,198,144, 26,137, 94, 88, 22,179,
-154, 56,154, 35,149, 67,170, 28, 37,148, 79, 13,108,237, 80,210,139,227,106, 83, 67,227,119,189,106, 73, 51,244,145,169, 86,216,
-112,184, 98, 25,219,105,140,245,169,109,194,163, 75,253,180,111,149,236,214,250,126,157, 54, 64,132,164, 38, 22,146,184, 73,145,
-253,140,180, 28,144,218, 5,145, 2, 73, 73,108, 23, 36, 90,120, 69,114, 27, 38,148,104,112,177,223, 3,235, 8,210, 28,155,102,
-216, 40,133, 56, 6, 29, 33,106,133,172,107,156,105,150,145,170,206, 47,168,189,232, 79,130, 78, 52, 86, 72,108,101,113,202,239,
-175, 17, 2, 29, 69,190, 25,146, 18, 43,220,114,253, 88, 89,203,112, 50,163, 44, 42,159,247,144,166, 68,177,230,244,188, 36,237,
- 14,176, 50, 98, 54,157,208,233,116, 81, 81, 12, 74,161,243,148,210,250,102,199,195,121,116,112, 5, 8,207,179, 95, 71,161, 10,
- 46, 52, 96,254,153,221,120, 69,118,184,103,149, 84, 24, 97, 86, 49,169,173,144, 45,212, 12,132,207, 2, 73, 35, 69,146,104, 79,
-113, 75, 18,178, 52, 33, 77, 98,226, 88, 47, 27, 74,177, 38,122, 19,107, 14, 26,255,133,178, 6,112, 89,153,171,215,131,198, 92,
- 28,225, 76, 74,158,187,144,200, 39,168,170, 10,156, 37,106, 65, 55,114, 77,119,181, 30,183, 43,196, 50,125,174, 21,236,174,249,
-231, 46,194,181, 86, 88,185, 11,224,176,165, 71,168,157, 24,182, 69,187, 85, 68,182,188,142,181,134,245,211,162, 87,219,177,253,
-242,181, 88,130,226, 86, 83,106,107,124,180,121, 85, 87,104, 37,212, 42,228,254, 9,168, 76,123, 90, 18,161,237, 86, 75, 91,147,
- 31,129,135, 71,239, 82,233, 46,151,202, 65,183,150,191, 45,158,254, 74,197, 90,172,106,216,135,105,169, 48, 18, 26, 9, 77, 72,
-120, 50,141,193, 57, 79, 3, 91, 1,239, 86, 63,178, 11,169,171,203,175,217, 46, 25,242, 45, 52,165,229,218, 11, 7, 29, 37,233,
-230,138, 69,100, 40, 22,115, 78, 38,146, 23,191,244, 89,174,239,237, 82, 13,239,211, 73,251, 76,102, 35,100,234,168, 22,167, 40,
-177, 1, 86, 35,101,130, 78, 35, 50,237,252, 94, 44, 50,216,186,160,151,118,217,251,202,215,137,187, 25,200,132,172, 51,160,110,
- 12, 58, 82, 72,105,105,234, 5,182,158,240,209,135,183,201,123, 61,170,179, 35,138,170, 96, 49, 95,160, 68, 66,164, 12, 47,223,
-186, 73, 49, 58,231,225,189,251,188,240,249,175, 49,154, 20,212,229,156,217,120,204, 11,159,251, 60,223,251,193, 27, 52, 86,210,
-139,225,165, 91,151, 56, 58,155,242,224,193,135,116,122,191, 73,190,255,121,212,221, 63,163, 40, 27,238, 31,205,216,234,244, 40,
-103, 51, 70, 11,131,147,138, 65,183, 67,226, 20,234,100, 24, 20,163, 6,215,212, 32, 29,135,143,238, 48, 63, 63,226,242,102,151,
- 15, 63,177,108, 14, 46,115,240,201, 61,174, 61,119,149, 36,206, 88,148, 69,184,200,219,107, 72,134, 61,229, 90, 28,110,155, 33,
-188, 34,206, 44,127,237,239,191, 48,126,111,213,153,120, 74,150,113, 62,172, 66, 26,183,162,203, 9,129,172,253,117,163,194,190,
-172,197,124,202, 80,176,147, 38, 66,164,150,186,246,214, 28, 63,190,180,107,135, 63, 63,113,178, 33,187,221,235, 42, 5,211,179,
- 57,101,105,121,243,157,247,184,190,191, 69, 47,141,112, 77,205,240,228, 8,157, 38,244,227,136, 72,106, 30, 31, 30,112,118,126,
-159,179,131, 59, 60,255,153, 47,178,119, 85, 17, 77, 53,121,167, 67,158,165, 40,233,125,219,157, 60, 39,137, 53, 27,253,140,123,
-159, 28,241,248, 99,195,149,207,188, 76,186,113,137,209,249, 17,167, 39,247,121,238,214,115, 60,247,220,117, 62,190,243, 49,163,
-227, 19,118,247,174,112,237,202, 54,163,201,152, 36,219,192,170, 57, 91,187,151,232,166, 49,229, 98,134,146, 2,131,101,103,163,
-199, 43,175,124,131,127,255,239,254,144,241,112,136, 86,130,217,116,194,217,112,194, 71,143, 79,249,155,127,243,215,112,197,148,
- 78,175, 79,229, 20, 78, 39, 68,189, 77,140,107,168,203,154,170,130, 36, 77,185,188,127,205, 11,222,164,161, 92,140,137,116,196,
-151, 62,255, 34,179,241, 4,179, 88,208,212, 21,202,149,228, 73,138,116, 21, 90, 24, 76, 89, 48,153, 25,100,148, 50,155, 47,168,
- 22, 11,242, 88, 19,199,138,189,237, 30,103,231, 35,140,174, 81,166,225, 87,191,244, 34, 61,187,224, 15,255,252,117, 78,107,135,
- 18,146, 69, 85,179,208,254,181, 50,198,191, 9, 41, 49,141,161,182,144, 16, 19, 43, 69, 85, 89, 76,164,160, 49,108, 72,193, 1,
-150,142,141,233,212,138,106,214,176,200,107,148,145,196,117,130,198, 33,165,239,206,193, 63, 27,132,240,169,103, 90, 27,112,218,
-103,145,203,214, 42, 38,151, 98, 55,156, 64, 58,133,177, 2, 21,172, 91, 46, 52, 32, 86, 72,156,136, 2, 18,217,235,122,148,146,
-232, 88,135,117,163,135,174,120,251, 88, 76,108,115,114,105,136, 92,131,116, 21, 52, 5,218,213, 68,194, 18,197, 18,165, 29, 50,
-137, 33,242, 25,235, 66, 39,136, 56,131, 40,245,197, 92, 71,160, 52, 40, 11,162,128,170,240, 10,119,106, 47, 6, 13,246, 48, 41,
-149,159, 54,134, 46,153,112,111, 88, 7,202,121,193,152, 85, 14,235, 12,174, 6, 21,101, 76, 22, 5,103,211,146,102, 54,195, 84,
- 83,116, 71,251, 46, 95, 70, 24,145, 96,101, 68, 83, 65,222,239,227,164,166, 22, 22, 34, 9,181, 9,137,122,160,162,152,186,177,
- 62,110, 54,201, 66,110,186, 89, 50,213,219,167,124, 43, 32,147, 50,120,215, 3,152, 76, 4,177,148, 53,214,175, 72, 85, 72,123,
- 20,218, 31,208, 4, 36, 90,144,197,138, 60,141,124,252,106, 22,145, 38,146, 56,150,232, 72, 44,227,149,165,192, 51, 6,194,212,
- 85,184,245,198, 80, 92,116,230,184,167,105,149, 74,107, 92, 18, 19, 91, 75,102,253,250, 51,214, 10,103,109, 16,133, 7,251,154,
- 12,142, 7, 15,229,101, 25, 5, 36, 36,200,229,145,228, 2,179,195,139,136,213,242, 47, 94,175,101,109,226,222,211,157, 40,171,
-117, 2, 43,165,186, 8,110, 33,143,250, 93,125, 46,193,211,147, 0,133, 64, 11,129,150, 97,104, 35, 89,186,186, 90,123,120, 89,
- 54,104,228,234, 4,208,126,144, 88,247,172, 45,171,166,127, 80,170,213,208,226,153,249,230, 23,235,247,218,200,189, 61,125,137,
- 39,190,207, 64,124,243, 10,191,240,102,125,124,158, 81,114,181,159,185, 48,206,121,154,102,183,132,205, 44,119, 58,110, 13,138,
-226, 85,217, 18,205, 98,238,247,131, 89,234, 5, 9,181,129,205,141, 45,102,147, 49,123,219, 91,196, 17, 56, 97,121,252,232, 33,
- 87, 47, 95,194,153,154,249,116,142, 18, 41,253,141, 14,149,107,144, 81,196,230,230, 46, 55,175,220,228,227,247, 63,228,224,248,
- 17,189,141, 14,143, 15,142,137, 83,159,187,188, 40,230, 36,137, 36,137, 21,157, 60,102,115, 99,155,173,237,125, 94,126,241, 11,
-188,255,254, 91, 60,184,119, 7, 91,195,198,198, 22,101,105,121,237,181,215,184,254,252, 75, 56,106,174,221,184,202, 39,119,230,
-188,246,218,155,252,204,207,254, 12,223,249,139, 87, 3,255, 89, 49, 24,244, 25, 79, 75,186,121, 66,146, 36, 92,186,126, 19,247,
-189, 63, 99, 86, 44, 16,147, 41,151,119,246, 88, 44, 10,156,147,108,239,238, 50, 57,123, 76, 85, 54,104,225,177,185,142, 42,204,
-252, 28,147,209, 41,247,239,125,194,198, 70,159,114, 49, 35, 17,134,147,163, 35,164, 22,184,140,165, 15,212,173,150, 62, 23, 71,
- 75, 79,210,228,254,178,188,251,240, 66,250, 67,154, 79,131,147,193,123,187, 62, 70,147, 33,136,163,221,123,181, 93, 59,210, 99,
- 52,149,112,212,117, 74, 83,215,152, 48,126,122,230, 9,119,237,197, 63, 59,126,196,230,102,159, 56, 73,249,222, 95,188,206,139,
-207, 93,230,249,155, 87, 56, 57, 61,128,200, 49, 60, 59,165, 44, 26, 78, 78,142, 73,115, 13,141,224,116,188, 96,110, 30,241,220,
- 11, 41, 11,215, 80, 76,199,116, 59, 25, 46, 73,188,240, 74,116, 80, 81, 74,222,223,228,241,163, 35,122,131, 35, 6,187,123,100,
-121, 78,119,176,137,177,160,227,136, 75,151,175,242,209, 71, 31,147,117, 55,248,204,103, 95,192, 57,193,201,201, 41,247,238,223,
- 39, 18, 48,137, 52,189, 60,195, 57,201,233,104, 4, 42, 98,247,242, 21,190,249,211,223,228,238, 71, 31, 97, 77,195,254,213,107,
-140,230, 5,159,121,233,139, 92,189,126,131,242,252, 49,195,209,148,217, 98,193,254,165, 75,140, 39, 99,148,173,137,133,165,105,
-106,210, 44,163, 76, 98, 54, 55, 54, 81,113, 66,175,219, 37,206, 59,244, 55, 54,112, 88,198,163, 49, 27,155, 27,244, 92, 31,165,
-181,183,132, 69,154, 70, 10,202,178,166,113, 21, 91,219, 59,156,159,158, 98,154,146, 56,138,209,194, 5, 74,154,101, 60,158, 82,
- 46,134,124,227,243, 47, 48,156,140,249,243, 55, 62,196,184,136,218,121, 17,211, 2, 75,207, 10, 10,235,200,252,178,216,191,246,
-198, 46,215,115, 74,174, 30,144,153,146, 20,182, 97,129, 36,170, 29,233,194, 98,147,134, 58,106,208,145,241,107, 19,113,241,186,
- 82, 50,196, 89,138,214, 24,212, 74, 46,221, 18,148,229, 19, 74, 77,216, 13,107,164,181,254,192,103, 5, 66, 24,164,169,188,138,
-222, 42, 48, 6, 97, 5, 81,236,119,189,137, 90,233,136, 16, 9,177,130, 68, 57,180, 48,196,194, 32,155, 25,182,156, 35,109,233,
- 69, 97, 58,242, 29,112,146, 32,162, 12,116, 2, 81,130,147,113,248,127,254,255, 47, 31,106,146,176,111,182, 8,219,128,173,150,
- 7,140,229,197, 44, 21,166,170, 49, 38,236,232,157,163,177,198,143,196,157, 47,148,214, 58,238, 63,120,196,124, 81, 97, 76, 29,
- 66, 63, 34,166,179, 25,121,167, 75,237, 44, 85, 85, 16, 7, 11,102, 99, 45, 73, 55,163, 16, 18, 33,108,152,102, 24,191,159,119,
-132,195,143, 92,227, 78,240, 68, 63, 41, 2, 7,190,117, 25,124, 74, 30,136,184, 24,213,173, 37,196,145, 15,235,201,179,196,147,
-220, 66,135,238,127,230,171, 8,238,191, 60,222, 89,112,177,194,112,225,249,225,148, 47,236, 81, 20, 97,147, 20, 44, 24,173,125,
-184,142,148,168,200,187, 75,214, 27, 10,132,244, 37,125,249, 60, 10, 12,128, 31,251,112,249,235,255,115,225, 16,176,242, 7, 45,
-113,233, 23,127,111, 61, 9, 85, 60,161,130,151,216, 37,184, 45, 88,194, 27,131,110, 71,212,254, 40,228,219,155, 22,118, 33,156,
-127,176,218,144, 79, 40,145,152,144,229, 43,165,239,186, 68, 40,166,173,138, 81,224,144, 46,156,220,228,186,167,221, 44,125,149,
-136,139,249, 31,180, 22,183,128,181, 81, 45,101,204, 10, 47,146, 89,126,102,177, 58, 44, 56,119, 33, 31,199, 61,137,168, 93,223,
- 97, 8,129,179,142, 72, 38,204,138,134,249,116, 70,127, 67, 49,156, 85,168,120,131, 36, 77,184,124,105, 7, 45, 22,156,156, 60,
- 34,210, 62,145,169,223, 25,208, 44, 28, 39,211, 49, 73,226, 79, 67, 91,131, 13,122,131, 77, 30, 31,158,114,116,118,196,233,217,
- 57,147,201, 24, 99,231, 36,145, 64,201,134, 60, 73,201,226, 20,235, 26,230,211,115,102, 99,131,112, 49, 31,127,240,144,141,141,
- 77, 46, 95,222,226,214,141,207,240,222,187,239,162,132,162,168,252, 62,243,210,254, 14,175,189,245, 22,184,136, 44,205,121,239,
-253,143,249,207,254,198, 47,121,213,169, 53, 68, 74,112,255,254, 67,138, 26,222,126,253, 53,110,223,190,205, 87, 94,249, 41,254,
-229, 63,255,175,169, 26, 67, 81, 87, 28, 28, 29,177,185,185,205,100, 50,231,243, 95,252, 10,135,247, 62,226,116,116, 68, 36, 64,
- 57,131, 19, 77,216,231, 9, 26, 83,241,232,224,128,207, 93,187,206,233,209, 99,116, 22,129,181, 28, 29,159,208,123,110, 55,140,
- 44, 27,164, 92, 9, 86,120,130, 37,248,164, 15,243,105, 97,164, 88,142,239,159, 42,242,206,121, 5,178,115,207, 72,115, 91, 27,
- 95,133, 49,149, 12, 99, 83, 27,168, 95,118,105,133,252,241, 55,145,181, 13, 15,238,127,196,100, 58,226,234,245, 27,236,109,110,
- 82,204,206,104,108,195,246,206,128,241,249, 1,105,210,101, 50,173,208, 58, 97,103,255, 26,183, 62,251, 50,121,111,143,162, 40,
- 25,158, 28,162,149, 34, 77, 83,108,149, 99,123, 93,172,169, 17, 88,210,110,143,254,230, 54,211,241,132,209,241, 67, 58,137, 36,
-142, 98,118,119,247,176, 14,138,218,208, 56,152, 21, 5,143, 15,143,184,121,243, 57,162, 56, 98, 81, 46,184,113,243, 26,212, 13,
-143,239,223,163,223,237,146,119,187,108,237,238,115,114,126, 70, 85, 20,124,225, 11,159,231,235, 95,253, 10,206, 58,206,134, 67,
- 70,211,130, 40,235, 50, 25, 77, 72,117,198, 98,122, 78, 99, 5, 15, 31, 63,102,103,208, 97,119,144, 99, 77, 73,132, 37,178, 18,
- 87, 53,140,135, 6, 21,103,188,244,242, 75,164,157, 62,139,170, 34,235,166, 24,103, 25, 78,198,108,109,110,146,101, 25,211,201,
-148,218, 84,108,108,109,144,102, 61, 70,211, 57, 81,148,240,153, 23, 63,203,240,248,144,243,227, 3, 34,169,232,118,186, 94,189,
-109, 26,108, 53, 39,239, 68,124,249,179,207,241,193,135,159, 48,171, 12, 40,129, 54,150,210, 58,250, 90, 49,175,106, 58, 82, 1,
- 13,206, 88,154,202, 44,139,185, 18,122, 73,130,235,201,136,185,169,152, 9,136, 13,184, 66,224, 74, 65,149, 55, 40,219,160, 27,
- 25,196, 66,194,167,181, 33,131, 96,204,250,231, 85,171, 36, 15, 83, 36,215,170,149,195,117,100,140,193, 81, 19, 65,176, 72,130,
-182,254,192, 39,181,246, 29, 33, 50,248,154,157,223, 75,122, 74, 18, 42, 10, 32, 46, 9, 66, 59,132, 6, 37, 45,145, 73,176,105,
-234, 9,140,174,198,105, 13, 42, 65,168, 4,151,100, 56, 29, 35,227, 12, 17,165, 56,169,177, 23,185,113, 94,119,111,106,104, 42,
- 47, 4,148,109,246,184,195, 26,135,107, 28,182,177,148, 85, 13, 50, 66, 73,141, 17,190,185,114, 8,111,253,138,115, 30, 60, 62,
- 94, 90,213,108,240,175,235, 56,166, 26,142, 24, 12, 6, 52, 69,205, 98, 54, 35,207, 50,132,148, 20,174, 33, 73, 83,143,104,166,
- 9,107, 50,191,243,174,154, 2,157, 38,160,148, 63, 56,216,112,159,173,177, 69, 60, 66,250, 34, 76, 69, 60, 25,225, 25, 36, 97,
-173, 40, 77, 73,129,142, 36,113,172, 73, 18,143,101, 77, 83,159,146, 22, 71, 62,165,173, 21, 67, 91,203, 19, 79,245, 53,212, 56,
-226,153,129, 94, 79,233,182,218,142, 61,210, 68, 54,246,207,129,200, 23,117, 65,136, 4,143, 60,181,142, 53,235,171,144, 34,104,
- 9, 86,129, 83,255,145,106,249,197,231,222,122,244,229,210,253,176, 54,121, 88, 67,114, 95, 92, 45,200,101, 70,194,210,212, 23,
-174, 25,159, 54,104,208,214,218,101,134,247, 69, 26, 91,136, 41,116, 14, 39,109,240,222,217,144,124, 21,132, 21, 98,101, 99,243,
-234, 76, 95,220,109,216,159,138,181,244, 52,255,193,238,130,112,238,211,204,251,178,253,109,185,138,132, 93,158,224,196,147,160,
-210, 39, 3,102, 46,254,215,135, 60,248,111, 95,203,196,143,182, 11,131, 86, 62, 73,107,123,235, 18, 74, 73, 62,250,224, 29,226,
- 4,170, 98,138,214,254,107,143,181,162,104,230,108,246,123, 84,101, 69,175,219, 67, 42,197,143, 94,125,149,162,178,100,249,192,
-239,254, 17, 68, 73,206, 27,111,189, 69,214,233,114,245,234, 53,164, 20,244,123, 57, 81,156,114,126,248, 0,173, 50,250,157, 93,
- 48, 53, 31,126,240, 62,141, 43,217,216,236,114, 62,156,210,147,187, 76,230,115, 30, 63,126,200,193,193, 67,246,246,159,163,219,
-233,249,204,223, 52,163,223,235, 50, 25, 14,153,205,107,175, 59,176,130,141,243, 51,254,244,219,223,225,103,126,238,167, 49,206,
-171,123,203,186, 36,142, 61,128,101, 54,171,248,226,103,191,202, 31,253,219, 63,160, 90, 28,178,221,223, 96, 50,172,252,248, 91,
- 8,156,240,222,200, 71, 7, 71,252,236,151,191,204,124, 58,164,116, 9,141,105,152,142, 11,210,106,227, 98,142,253, 51,110,179,
-245, 78,253, 73,167,195, 95, 70, 88,106, 19, 1,151,227,251, 11,162,145, 53, 43,221,167,172,154,214, 55, 49, 23,233,117, 23,178,
-129,113,214,122,139, 88, 53,231,209,163, 7,216,133,161,159,229, 92,218,221, 36,137, 42, 22,179, 83,186,105,194,217,217, 33,221,
-141, 75, 24, 17,243,252, 11,159,227,210,149,231, 57,159, 46,152, 21, 67, 14, 63,185,195,124, 54,101,115,176, 65,127, 48,160,215,
-235,178,179,187,139,107, 54,104,154,154,126,175,195, 78, 63,103,120,116,192,226, 44, 38,234,244,169, 85,140,211, 49,139,178, 98,
-231,242, 62, 95,253,122,206,209,225, 17, 74, 75, 62,249,228, 14, 31,223,249,136, 65,183, 75, 81, 54,244, 54, 54, 24, 77, 39, 24,
-235,216,142, 18,174, 93,185,194,157,251, 15,120,248,240, 33,253, 94,207, 11,158, 44, 62,184, 38,203, 56, 59, 57, 33, 78, 52, 58,
- 78,152, 45, 22,148,243, 9,243,209, 49,229,102,135,157,126, 70, 30, 41,138,166, 36, 78, 18,175, 29,136, 34,102,211, 49, 78,106,
-178,110,135,198,150,244, 6, 61,148, 86, 62, 81,206, 57,180, 84,212, 69,197,209,193, 17,121,191,207,246,246, 14, 72,205,104, 52,
-198, 52,134,237,173, 29,250,157,196,223, 19,117, 67,156,229,126,252, 11,124,238,229, 23,217,252,211, 31,114,114,112, 70, 30, 71,
- 84,166, 1, 36,165,146,216,162,162, 78, 52,169, 80,224,188,110, 70,167,241,146,189,174,148,198,214, 53,145, 51, 36, 74, 82, 89,
- 75,109,161,174, 36,182, 22,212,166, 33,113, 13,206,233, 11,147,183, 86,192, 11, 96, 92,131,196, 71,142,218,176, 99, 20,214,199,
-144, 74,214,210, 2,241,250,141, 54,251,196, 52, 22,140, 66, 89,231,215, 64, 58,194, 9, 11,202,128,176,184,196, 65,211, 16, 89,
- 73, 92, 75, 18, 37,145,202,249, 0,159, 52, 2,157,162, 19,141, 83, 37,182,169, 16, 10,164,140,128,144,228,165, 20,104,133, 83,
-222, 67,110,219,180, 68,231,112, 86,130,212,126,204,219, 62, 22,165, 31, 93, 75,169,252,253, 41, 28, 85, 83,179,168,141,143,232,
-149, 18,227,239,224, 0,218,137,169,157,224,209,209, 9,221,193, 54,135, 15,143, 41, 22, 5, 91, 27, 3, 63, 70, 15,140,114,172,
-193,154, 10,103, 35,116,172, 49,141, 37,202,115,132,109,252, 62, 61, 52,117, 50,138, 40,138, 41, 34,142, 16, 90, 97, 28,158, 91,
- 31,156, 68,198,216, 96, 83,107,239,181, 53, 97, 42,226, 41,161,247, 82,232, 42, 61, 18, 54, 10, 41,124, 81,164, 67,162, 91,228,
- 97, 77,193,167, 46, 37,203,140,118,255, 87,216,103,213,246, 31,147, 55,226, 46, 30, 0,132, 8,185,236,145,159, 70, 44,139,122,
-235, 4,108, 51,210,197,138,238,214, 30, 70, 90, 64,140,120,162,202,184, 31,223,204,124,154,152,239, 89,211, 76,231,158, 96,121,
-240,116,247,254,164, 32,112,125,178,224,214,232,157, 38,164,211, 53,141, 65, 87,141, 65,181,254, 98,185,202, 48, 23, 86, 32,164,
-241,234,101,235,133, 3,203,128, 23,107,195, 55, 78,240, 14,138,229,159,105, 71, 49, 82, 6,218, 81,123, 80,112,172,246,239,194,
-219, 78,158,252, 70,151,106,119, 39,158, 56, 9, 62, 1,192, 23,238,194, 8,230,226, 67, 95,114, 49,240,123, 53,146,201,210,140,
-225,135,119,216,232,105,170, 69,133, 82, 25, 89,127, 19,103, 29,253, 78,194,245,155, 87,153, 78,135, 60,126,248, 9, 14, 71, 85,
- 22, 94,220,133,225,115,159,251, 28,143, 31, 61,162, 42, 75,108, 85,147, 72,159, 7,156,119, 58, 68,105, 7,161, 21,253,237,203,
-204,230, 51,230,181,193, 54,134,162,172,153, 77, 71, 84,101,197,238,118,159,199,143, 63, 97, 99, 99,128,115, 21, 59,187, 27, 76,
-167, 83,122,131, 13, 6, 91,219,124,255,135,223,227,234,141, 27, 28, 29,157,240,249,159,120,133,241,232, 46,105,150,241,225, 71,
-119,184,245,220, 45, 62,120,231, 45,138,178,164, 42,253,131,244,253, 15,111,243,252,231,239, 3, 63, 75,158,119,152, 79,103, 84,
-229,140, 69, 53,103, 56, 30, 49,154,206,217,249,210,231,216,189,244, 28,231,103, 83,204,188, 65,210,132,211,151,255,249, 91, 7,
-199,167,103,196, 89,202,230, 70, 31, 97, 22,212, 56,166,181, 31, 81,213,117,181, 2, 36,172, 93,106,226,153, 23,232, 95,109, 4,
-255, 36,101,233, 73,127,167, 88, 79,130, 16,235,211, 22, 46, 40, 76,151,211, 26,231,158,185, 6, 16,194,171, 93, 35,173,113, 13,
- 40, 25,177,152, 45,188,128, 79,119,113,210,103, 1, 68, 81, 70, 36, 28,219, 66, 48,154, 47,120,254,179, 47,177,189,115,153,186,
-241,163,221, 56,246,167,226,195,195, 67, 78,143,142, 73,179,132,110, 64,172,110,108,108,176,185,177,193, 70,191,135,118, 13,143,
- 30, 60, 96,255,242,140,221, 43,207, 97,117,202,227,179, 33, 50, 73,217,217,217, 69, 73,137,105,106,138,197,148, 52,209,116,179,
-132,249,108,206,193,227, 67, 58,105, 70, 81, 84, 40, 89, 48,159, 79,113,174, 33,141, 21, 31,222,185,199,205,155, 55,184,122,245,
- 26,105,154,122,108,166,242, 2, 46,154,154,243,115,199,209,227, 9,135, 7,143,176,213,140,243, 3,248,204,141,203,100, 81, 68,
- 89,150, 60,247,220, 45, 18, 4,102, 50,162,167, 99,166,227, 51,192,144, 37,154,222,181,203, 76, 39, 83, 14, 31, 31,210,237,245,
-217,236,245, 25,143, 39, 28,159,159, 18,105,205,195, 7, 15, 56, 62, 57, 35, 75, 19, 52,150,205, 94,134,116,134,126,127, 64,218,
-233,241,181,111,254, 52, 63,241,141,175,243,195,239,125,151,121,237,109, 97,165,177,100, 6, 42,231,232, 72,205,184,105,216, 20,
-146,133, 49,100, 82,133, 76, 8,223,101,106, 37,131,181, 76,210,246, 28,145,244,244,188,202,192,188,118,228, 13,164,181,161,169,
- 42, 26,180,231, 85,104,237,141,107, 54,232,103, 2, 3, 29, 39, 49,182, 1,137,231, 93, 24,139,148, 22, 43,236,178,192,200,208,
-221, 75, 33,113,198,208,216,134,166, 22, 80,148,129,128,151, 16,197, 21,153,241, 57, 9,117,221,128,105,136,140,163,108, 26,166,
- 69,137, 43,102,216,186, 36,235,196,108, 95,222, 97,103,103,203,187,129,172,163,158, 22, 84,205,196,211,215, 54, 59, 68,221, 30,
-116, 37, 34, 2, 17,123,150,130,107, 59,146,198,248,183,150,173, 97, 5, 77,237, 87, 23,126,207,107, 17,194, 80, 25,139,142, 3,
- 84, 73,105, 44,214,231, 33,160, 80, 34,226,189,219, 31,210, 56,129,116,126, 50,163,164, 36,203,114, 76,211,208,233,246, 60,255,
-188,174,201,226, 24,211,212,204,138, 57,162,147, 35,147, 24, 81, 58,180, 80, 52,172,208,205,141,131, 88, 71, 88, 60, 11, 95,172,
- 77,198, 76, 99,151,112, 49,214,152,250, 79,238,144,151, 58,152, 54,129, 77,249,130, 30,135, 32,146,184,141, 91,141,252,120,220,
-191,175, 86,208,151,165, 54, 76, 92, 20, 59,179, 54, 49, 20,226,137, 49,246,211, 65, 99,109, 17,116,106, 77, 48,169, 91,122,159,
- 11, 63,103,121, 17, 96,182,238, 73, 95,195,208,138, 39, 28, 53,207,226,186,127,218,196,224,199,218,220,220,106,109,108,157,123,
- 66, 54,207,133,110,124, 9,248,122,226,185,231, 1, 64,102,201,215,215, 85,101, 9, 7,222, 0,134,247, 30,184,150,222,230, 5,
- 42, 94,240, 36, 77, 0,208,180,167, 32,105, 47, 72,239, 47,218,224,228, 82, 57,216,238, 94,124, 49,246, 31,171,132, 93,123, 64,
-139,149,240,205,173, 94,208, 86, 56,208, 42, 63,219, 17,188,104,125,201,110,245,199, 5, 23,131, 27, 46,238,127,130,208, 79, 71,
- 44,230,115, 20,158,222, 52, 43, 42,250,121,159, 94,167,203, 64, 11, 18,165, 24,149, 37,243,233,132,126, 55,163,110, 74,146, 52,
-227,198,141,107,124,252,201, 93,164, 20, 76,134,231, 20, 69, 73,156,118,216,222,187, 74,154, 86,156, 28, 28,243,224,225, 67, 94,
-122,249, 37,146, 52, 70, 41, 73, 93,150, 76,134, 67,174, 93,189,201,241,129,100,120, 62,229,165,151, 62,203,123,239,189,133,165,
- 98, 92,140,209, 58,163,187,209,227,209,225, 1, 47,190,240, 89, 38,147, 5, 87,175, 60, 71,146,116,216,191,188,207,189,187, 31,
-145,191,221,231,197,207,188,192,193,221, 59,228,121,202,217,124, 78, 89, 27,172, 53, 12,207,135, 52,139,138, 78,154,114, 58,153,
- 32, 99,133,117, 13, 39,231, 39, 60, 58, 56, 32,202, 94, 33,206,122,236,238, 94,162, 25,142,225,228,204,143, 34,105, 16,141,165,
-211,219, 32, 78,124, 6,249,246,246, 22,103,247, 62,100, 94, 27, 68,150,251, 16,131,198,143,250,108,136,129,108, 49,173,235, 60,
-247,191, 10,235,248,175, 55,153, 90,243, 31,175, 17,230,214, 89,207,127,213,147,123, 20, 69,216,166,225,232,209, 99,222,126,253,
- 61,226, 40, 99, 58, 29,113, 62, 62,163,223,189,132, 64, 97, 26,133,173, 36,131,205, 61,146, 62,236, 93,185, 70, 85, 90,154,106,
- 78, 85,142,137, 35,199,181, 27,207,113,114,114,198, 15, 95,253, 62, 91,155, 3,175,216,142, 35,118,118,182,232,166, 25,155,155,
- 91,244,250,125, 78, 78,135,156,205,224,149,157, 91,104,161,217,223,189,204,224,210,142, 7,176,204, 38, 92,187,114,153, 72, 43,
- 6,121,202,254,246, 38,239,126,112,143, 52,233,146,165, 41,231, 39, 39,216,166, 98,123,103, 19, 37, 29, 91, 91, 27,196,113,206,
-193,193, 99,202,173, 45,122,221,156,188,147, 50,157, 77, 72, 84, 77,154, 40,122,217, 54,253, 94,204,195,251, 61,180, 4,170, 57,
-145,176,108,108,110,241,230, 59,111,179, 53, 47,217,239, 15, 80, 82,178,152,141,233,246, 7, 84,179, 17,206,198,212, 8,186, 89,
- 70,189,209,227,228,248, 4, 37, 21,253,222, 96,169,214,159, 79,253,155,176, 57,166,156,147, 48,240,201, 99, 56,100,149,128,176,
- 92,186,188,199,207,252,234,175,242,157,255,240,109,226, 72,135,112, 20,144,206,119,220, 37, 14, 19,107,230,133, 97, 16,197, 62,
-199,220, 58,104,204, 42,157,209,121,129, 93,229, 44,145,131, 60,210,212,214, 48,169, 29,105,101, 73, 42, 16,113,131, 81, 13, 66,
- 58,255, 12, 10, 15, 90, 99, 26,148,210,152,186, 21,105,249,124,105, 39, 88, 10,207, 28, 38,172, 22, 87, 96, 42,165,212, 50,107,
-219,186,134,186,174,189,207, 89,107,106,165,104, 38, 49,115,165,136,172,197,149, 37,118, 58,167, 25,143,105, 70, 35,204, 98,140,
-116, 13, 73, 39,226,100,183, 75,245,153,231,217,220,218,162,169,107,206, 79, 78, 40,103, 51,159, 9,223,237,208,221,222,166,187,
-123,137,120, 99, 11,213,239, 33,178, 20,161,180,159, 90, 26,227, 71,239, 85,129,171,188, 98, 29, 2, 61, 13,137,210, 30, 18,175,
-163, 4,165, 98, 63,117,136, 34,140,169,145, 82,161, 85,204,163, 71,135,156,158,143,232, 14,182, 25,158,143,160,241,207,237, 60,
-239,112,116,124,204,222,222, 37, 30, 62,120, 72, 28,105, 22,243, 57, 81,154, 49, 91,204,217,220,223,243,133,174,165, 58,138, 80,
- 80,132,247,169,171, 72, 99,132,223,167, 27,227, 2,198,219,239,109,133,116, 75,209,107, 75,195,123,178,155,108, 9,163, 42,164,
- 46,250,188,116, 69, 20,251, 48,161, 54, 97,172,101,197,171,144, 13,208,142, 80,172, 93, 89,188,158,181,144,118,159, 18, 40,182,
-158, 57,225,214,187, 91, 21,162, 73,173, 92,139,181,118, 97,133, 19,194,103,108,224, 6, 60,107, 52,176, 62,130, 23, 60,179, 65,
-121,178,144,255,216, 26,126, 97,159,206, 5,145,241, 69,189, 88,120, 22, 6, 59,230, 42,176, 70,248, 53,120, 88, 43,121,188,186,
-127,141,106, 99,209,117,221, 96,140, 90, 27,151,216, 0,135,183, 33,134,117,181, 23,145,225,102, 90,118,227,235, 24,206, 39, 50,
-215,219,192,251,245,177,193,122,152,189,146,161,195, 95, 55,217, 47,145,162,110,169,116,111, 73, 57,171, 29,188, 11,167,241,149,
- 1,114, 61, 20,246, 89, 3, 99, 33,124,151,208,212,158,168, 52, 30, 85,244,246,188,210, 51,239,244,152,207,231,228,123, 9,194,
- 24,122,157,174, 39, 57, 41,137, 49, 6, 29,105,198,147, 17,231,195,115,110, 92,191, 78, 30,199,140,134, 67, 78,207,199, 20,139,
- 5,121,167,131, 49,135,212,101,197,116, 52, 38,142, 54, 25,143, 71,212,101,193,102,191, 79, 93,148,140,199, 5, 95,254,210, 87,
-120,251,173,215,233,246,186,244, 55, 59, 32, 35, 30, 62, 58,231,254,251, 31,145,100, 17, 91,189, 30,199,199, 67, 94,249,230,207,
-211, 52,142,247,111,127,192, 55,191,254,101,162,110,143, 94, 18, 49, 28,141,168, 5, 20, 65,163,105,157,227,236,236, 12,225, 32,
-138, 34, 63, 90,108, 74,142,142, 15, 80, 58,103, 52,153, 80,154,134,193,214,128,225,105, 68,199, 36,104, 21,148,239,194, 43,108,
-139, 69,193,201,241, 25, 81,164, 48,206,210,219, 28,176, 37, 51, 30, 79, 74,166,211,169,215,244,200, 39, 20,158, 75,188,204,255,
-127,255,121,194, 22,250,148,111,243,153,133,253,201, 27,206, 58,166,147, 49,111,189,241, 22,243, 89,197, 98, 94,210,235,117,216,
-219,217, 68,106,193,100, 58, 67, 52, 18,165,114,202,218,145,247,251, 52,141,225,248,248,152,210, 52, 68, 73, 77,150, 71,232,164,
-203,139, 47,127,142,243,225,144,183,223,120,141,205,126, 23,209, 73,121,120,255, 30, 89,156,114,124,116,198,141, 23, 94, 98,251,
-202,103,232,109,236,114,255,112, 68, 20,151, 36,177,162,172, 23, 92,185,118,149,180,147, 51, 61, 59, 13, 19, 2,127,163,166,105,
- 70,180,155, 81, 22, 5,157,110, 23,211, 44,152,207,167, 72, 12, 82,150, 94,251,209,235,241,248,209, 3,138, 98,202,139,159,253,
- 12, 91,253, 28,209,204,152,143, 70, 44,138,138,141,222, 6,238,242, 30, 90, 72,178, 72, 48, 29, 14, 33,138,249,226,151, 95, 97,
-119,107,128, 86, 2, 83,150,152,166,130,166,164, 42,231,152, 38,246,127, 95, 85,178,189,217,103,107,208,231,224,241, 33,101, 49,
- 39, 75, 99,166,179, 25,166,170,188, 3,193, 25,146, 36, 70, 75, 65, 93,206, 56,126, 60,100,107,111,143, 81,189,192, 22, 99,250,
- 27, 27,220,188,126,133,111,124,245, 39,120,253,222, 1,139,186,102, 32, 19,166,182,194, 58,199, 68,212, 36,214, 81,133,135,110,
-131,207,158, 55,198, 19,232, 26,107,209, 82, 82, 10,207, 8, 23,206, 18, 43, 77,209, 52,140,139,154,222, 2,108, 44,105,116,140,
-144,208, 24,185,180,158,181,235,193, 54,120,166, 69, 74,138,128,178,118,214,250,142, 87,201, 37,162,212,218, 21,171,220, 52, 53,
-166,153,211,148, 37,206, 26, 79,158,195, 49,179,150,217,104, 76,125, 52,161, 30, 78,169,198, 83,220,124, 78,236, 12,145,176,164,
-169, 96, 99, 51,194, 30, 75,212,217, 67, 78,251, 3, 76, 99, 40,231, 11, 98,169, 73,163,152, 70,103, 44,210, 7,156,228, 29,162,
-141, 45,242,221,109,242,173, 45,146, 94, 7,221,233, 64,164, 17,174,193, 84, 5,214, 6,255,180,142,130,198, 32,116,205,149, 35,
-142, 83,207, 79,211, 49, 14,207,237, 23, 8,234, 69,197,189, 59,159, 96, 67, 72,213,232,240,156,249,120, 74,154,102, 88,103,137,
-226, 4, 99,253, 3, 63,137,227, 0,194,242,118,208, 78,191, 79,221,142,113,195,189, 38,149,164,105, 26, 47,154,148, 42,248,161,
- 45, 24, 71,211,248,169,133, 31,189,235, 0, 9,147, 33, 93,243, 98,103, 44,150, 98, 46,175,125,104,209,178,177,110, 59,116, 77,
-164,189, 40, 78,201,150,137, 18,200,114,174, 29, 47,251,151, 82, 60,235,192,143,123,102, 19,192,143, 41,240, 66, 8,159,212, 40,
-236,234,247, 60,248, 98,201, 96,247,211,100,241,169,253, 66, 59,206, 23,252,120,248,204,179,166,143, 79, 47, 48,215, 82, 47,215,
- 58,245, 11, 19,137, 39,186,114,156, 11, 65, 53, 62, 37,207,186, 96,235,172, 13,101, 89, 82, 85,134,186,105,168,235, 6, 93,213,
- 30,180, 64,128,207,172,119,215, 74,136, 37, 81,110,245, 13,177,242, 3,139, 85,113,111,199,246,170, 45,224,178, 45,254,114,217,
-197,175,211,231,228, 90,108,222,122, 55,189,250,161, 60, 61, 18, 89,122,253,172,187,160, 80, 20,235,136, 90,231,150, 54, 44, 17,
-130, 25, 86, 22,130,134, 89, 49, 37,221,212,140,138,134,233, 28,146, 40, 65,201,148,211,225,132,198, 53,136, 72,208,217,216, 12,
- 99, 59, 65, 83,149, 60,126,116,198,205,235, 55,176,174, 97, 81, 45,168,108, 77,217,148,220,189,243, 33,157,222, 22,221, 88,179,
-187,183, 71,109,193,138,152, 89, 97,249,204,173,207,128, 41,153, 14, 79,201,122, 17,175,189,249, 42, 89,156,162,147, 20, 39, 52,
-239,191,119,155,189,205,109, 94,249,210, 23,248,236, 23, 62,207,255,243,255,250,127,231,231,127,250, 23, 40,203, 25,184,154,235,
-151,247,249,179, 63,249, 22,131, 75,251,252,222,239,253, 54, 78, 41,156,105,188,226,213,121,223,103,156,104,206, 71, 99, 68,156,
-251,192,150,208, 41, 77,139,154,186, 42, 73,243,156,253, 65,202,105,172, 25,107,127, 49, 72,106,111,203, 80, 17,210, 57, 78,142,
- 30,162,116, 8,144, 80, 17,163,197, 25,187, 91, 59,212,118, 14, 74, 34,131, 51,225,162,246,245,233,155,237,211,119,232, 65,228,
-184,126,131,173,135, 1, 5,160,197,250,190,168,101,253,171,214,230, 22, 20,182, 74, 11,143, 83, 77, 34, 34,173,151, 93,141,183,
-164,132, 45,156, 16,254,215, 1,217, 58, 58,122,196,191,250,103,255, 15, 54, 58,155,228,221, 28, 65, 67, 81, 84,236,110,238,115,
- 94, 54, 76, 23, 99, 34, 37,216, 76,186, 8, 33, 57, 59,122, 64, 83, 7, 10, 87, 39, 67,187, 62,105, 63,101,107,179,207, 79,126,
-243,155, 36,121,135,199, 15, 31,179,185,179,237, 19,208, 74,131,213,154, 91, 95,253, 38, 55,111,220,162, 56, 27,115,244,232, 33,
-166,154, 18, 13,186, 84, 83,199,248,228,140,238,214, 22,221,205, 75,222, 91,111, 45,211,201,152,110,167,203,116, 50,162,169, 22,
- 12, 71,103, 60,126,252,136, 78,167,195,245,235,215,217,238,119,185,121,181,135,142, 4, 81, 26, 83, 86, 21,103,199, 39, 92,218,
-223,102, 99,163,135,169, 74, 68,221,208,177, 13,143, 70, 67, 14,199, 19,242, 52,229,198,238, 46, 90,123, 59, 87, 89,150,100, 27,
- 3,164,210, 44, 22, 11,198, 69, 69,191,219, 69,162, 40,231, 53,186, 23,133,135,169, 33, 75, 37,231,167, 67,164,204,185,190,191,
-139,180,142,106,190,240,227,211, 72, 82,215, 53,189, 60,166,104,230,184,102,142, 35, 66, 19, 83,205,103,228,177,226, 55,126,229,
-103,121,243,163,143,121,253,221, 59,204,155,146, 26,111,133, 45, 42,152,162, 57,179,134, 65,164,160,110, 16, 66,178,192,162, 35,
-137,171, 33,113,146,153,115,204,241, 88,225, 28,136,132,163, 40, 97, 54, 83, 36,137,194,197,198,211,204,140, 65, 59,208, 2,164,
-112, 72,103,144, 78,130,177, 56,209, 96,141, 8,170,112,233, 31,210,182,241,250, 12,169,124, 66,154, 5,179,124, 70,249,189,105,
-211, 24,154,197,130,114, 52, 97,122,114,194,228,116,200,252,124, 66, 61,171,113,141, 64, 33, 72,132, 32,195,146, 56, 75, 37,160,
- 25, 87,212,155, 2,230, 53,139,238, 25, 66, 7,114, 93,156, 82, 56,137, 54, 49,206, 65, 93, 53,160, 20, 38,150,200,110,138,238,
-229,116, 46, 95,161,179,127,153,205,173, 1, 89, 39, 69,104, 65,156,229,225,235,212, 96,189, 56,185,118,142,134,208,241,106, 63,
- 93,240,170,125,197,221,187,247, 40,107,160, 19, 33,148,196,212, 37,197, 98,198,214,206, 22,211,249,130,110, 39, 99, 49,157,160,
-165,160, 44,203,165,136, 42,221,200,137,178,132, 58,132,225,248, 36, 59,175, 79,104,234, 18, 39, 53, 78,121, 82,167,176,198, 39,
-217,153,136,218, 52,136,198, 55, 89, 42, 52, 74,222, 31, 93, 47,189,245, 82, 58,148, 0, 84, 32,198, 41, 69,172, 34,226, 72,134,
- 98,238, 59,244, 54, 78, 85, 4,182,187, 12, 28, 10,175,199, 90, 5,247, 32, 86,228,184, 37, 47,176,197,183, 94,104,225,196, 74,
- 56,189,156,232,186, 37,183,100,249,220,106,169,132, 75, 55,149, 67,216,246,179,123, 71,129, 13, 30,138, 11,246,115,119, 17,126,
-243,172,117,223,167, 30, 46,158, 60, 28, 56,177,202, 56, 17,225,123, 89, 87,143, 11,183, 22,158, 33,150, 99,121,159,200,215, 96,
-141,164, 9,126,209,198, 88,234,186,161,168, 12,101,109,168,106,235, 69,158,101,213, 32,149, 88,141,223,215, 5, 14, 98, 13,167,
- 23,186,112, 88, 21, 83,183, 86,212,101,136, 30,212,203,152,195,192,213, 13, 85, 87, 46, 19,112,218,206,126, 37,162, 91,177,157,
-151, 92,165,229, 79, 84,240,244, 94, 67, 62,131, 96,183, 44,240,171, 40,229,229,235, 32, 3, 38,180,155,166,161, 51,133, 40,137,
-137,103, 53,157, 52,163,219,233,146,208, 80, 53,134,241,116,206,230,246, 37,134,103, 71,116, 98,197,108, 92,209, 73, 59, 8, 20,
-179,233, 57, 39,103, 39,220,184,121, 19, 35, 20, 90,231,220,249,248, 46,159,251,194,151,153, 55, 13,198,249, 2,179,181,187, 79,
-213, 56,108, 85,113,122,118,138,144,150,126, 63,103,179,183,205,227,195, 71,196,249, 54,207,221,186, 78, 47,206,185,253,193,123,
-188,123,251, 3,126,250,149,111,242,218,155, 63,228,171, 63,249, 83,124,120,239, 35,186,105, 78,167,211, 35,214, 17,113,146, 82,
- 27, 11, 74,162, 26,159,116, 36,133, 96, 62,159, 17, 37, 26,161,162, 48,253, 0,173, 35,156, 19, 52,101,197,233,233, 25,145,107,
-216,236,245, 56, 24, 77,188, 14,194,129, 16,138, 74, 42, 68, 99,168,235, 57, 8,135,214,154,227,163, 49,103,195, 33, 73,218,103,
-115,167, 71, 99, 10, 15,118,129,255,225,166,142,139,231,179,139,197, 93,132,140,224,245,132,182, 96,213,104,109,109,173, 32,170,
- 45,234,137, 82, 36,113, 76,146, 36, 68, 1, 49,185,124, 8,172,188, 55, 97,125,227,104,102, 83,134,199,135, 28, 31, 28,113,227,
-234, 85,122,221, 28, 44, 84, 85,141, 84,154, 94,191,207,104, 60,228,116, 56,102,171,223, 33,150,142, 98,177, 0,169, 41,230, 17,
-231,167, 39,164,221,156,188,211, 71, 38, 29, 94,120,249,139,252,202,175,253,118,176,123,157,113,112,239, 1, 86,194,112, 60,163,
-123,114, 74, 63,138, 16, 52, 76,199, 19,178,216,122,145,105,153, 83, 78, 20,105,127,131,166, 54,164,131, 62, 59,253, 62,213,120,
- 76,175,147,208, 84, 5,219, 91, 27,140, 70, 67, 78,207, 70,108,110,239,211,137,107,164,242, 9, 83, 69, 9,113,146,251,125,105,
-146, 80, 84, 13, 89,183, 67,108, 28,162,174,233,118, 58,124,124,124,138,149,154,178,113, 72, 87,163,180,239,148,202, 98, 65,183,
-215,243,246, 29,173,208, 81,140, 48, 80,153,154, 69, 93,161, 83, 15, 76,217,216,217, 36,205, 99, 78,207,134, 84,197,140,231,111,
- 92,227,242,254, 21,166, 85,193,108, 54,225,248,225, 67,202,178, 36, 78, 83, 36,144,103, 49,166,105, 80,218,145,198, 49, 87, 47,
-237,242,159,252,218,223,224,133, 27, 31,240,167,175,190,193,189,195, 19,132,118, 52, 53,156,227, 21,212,113, 28, 99, 10, 71, 55,
- 86,212,162,193, 56,239, 11,142,129, 72, 41, 10,103,105, 2, 42, 85, 57, 63, 22,158,206, 28, 89,218,160, 50,137, 80, 2, 39, 29,
- 85,227,173, 95, 82,123, 63,177, 31, 81, 46,151,211, 30, 45,107, 27, 84,152,208,217, 0,121,241,246, 55,141, 49, 53,214,249, 67,
-161, 78,123,100, 34,102, 90, 11,106, 59,167,113, 49,184,132, 56,113,244,186, 29,226,164,131,148, 26,211, 52,184, 98,129,173,230,
-148,245, 2, 99,107,202, 97,205,180,170,201,114, 67,148, 4,142,188, 40,136,147, 4, 33, 74, 34, 33,201,117, 76, 55,143, 72,148,
-198, 24,193,238, 96,155,189,235, 55, 73,247,118,200, 58, 25, 66, 11, 42, 83,249,107, 92,233,160, 55,208,212,149, 89, 50,194,189,
- 34,188, 9,207, 96,205,120, 56,229,224,248,148, 56,239,162,123,221, 37,196, 72, 71,154,188,211,165,156, 79,201,211,148,225,201,
- 49, 82, 64,217, 52, 24, 7, 58, 73,200,186, 29, 84, 20, 65,211, 98,119,252,195, 82, 40, 29,236,174, 62,176,196,135, 52,249,206,
-182, 17,146,198, 72, 68,227,191, 71,237, 2, 72,202, 58,207,138,112,118,109,212,237,237,203,126,228, 30, 17, 71, 49, 73, 36,194,
-254,124, 5,248, 89,165, 51,202,101, 67,232,195,184,220,114,237,235,214,129, 47,226, 73, 67,237,133,205,237, 19,138,120,177,246,
-177,114, 53,210, 94, 51, 79, 9,111,129, 95, 29, 11, 90, 38,128,120,106,161,189,110, 50,255,255,249, 31,233, 4,110, 61,178, 92,
- 56,158, 9,128, 95,219,221,183, 49,213, 34, 76,173, 77, 99, 48, 56,234,218, 80, 53, 13, 85,221, 80,215,190, 83,183,214,160,203,
-198,162,108,235, 83, 95, 47,186,171,113,187, 88, 31,183,179,190,223, 92,219,175,135,194, 93,183, 93,248,178,168,203,149, 79, 93,
-172,198, 24,106, 45, 27,253,162, 0, 97, 21,207,249, 36,166,207,127, 93,173,119, 84, 92, 76, 99, 91, 83,226,183, 30, 74,183,214,
-193, 75, 9, 89,146,248, 27, 44, 73,161, 42,137,149, 64, 9,199,253,251,159,176,255,194, 46, 78, 58,158,219,191,194, 71,119, 63,
- 6, 98,132, 86,108,239,108,114,255,225, 9, 89, 83,177,191,191,207,222,165, 61, 38,147, 9,123,187,123,228,221, 77,116,220,225,
-225,227,135,220,188,114,137,199,199,231,148,243, 41, 87,174, 94,103,120,126, 66,181, 88,176,168, 26,166,211, 41,199,135,199, 12,
-186, 39,116,122, 29,246, 46, 93,230,241,227, 7,116, 7,125,162, 88,179,127,249, 26,239,125,124,155,211,225, 57,223,253,222,159,
-177,119,229, 42,121,183,203,116, 60, 99,111,239, 18, 81, 20, 81, 91, 75, 26,107,108, 8,175, 17, 66,146,103, 41,163,243,211,149,
-215,213, 89,172,245,164,170,197,108, 78, 83,123,202,208,108,182,160, 40, 42,154,160,172, 21, 50, 80,183,108, 21,110, 66,111,221,
- 25,141,103, 52,141, 37, 75,115,178, 44, 97, 60, 41, 46,236,119,254, 99,122, 53,219, 98,173,149, 34,142,162,176, 99,211, 23, 10,
-187,146, 42, 68, 52,134,130,175, 5,177, 10, 10,218, 36, 33,138, 19,148, 86,107, 26, 10, 95,200, 5, 62,249,175,156, 78,248,151,
-255,252, 95,112,237,250,117, 62,254,240, 14,111,188,241, 35,190,248,249,151,185,118,101, 63,216,184,198, 76,199, 99,164,138,152,
- 76,198,116,179, 20, 99, 42,178, 52,166,168, 74, 36, 6,219, 72, 70,103, 21,143, 31,159, 48,173, 12,191,240, 43,191,198,214,238,
- 37,206, 71, 19, 22,198, 49,109, 42,138,233,148,108,146,112,119, 58,101,103,119, 27,155, 72, 22,231, 11,202,137,196,106, 75, 53,
-143, 49,182,162, 49, 5,147,249,130,230, 0,118,118,119,104, 74,195,201,241, 49,121,154, 16, 73,193,238, 55,190,193,131,135, 7,
- 28, 28,157,178,211,237, 6,123,169,161,110,106,108,227, 72,211, 20,172, 35,141, 83,154,198,162, 54, 4,103, 71, 39, 84, 77, 67,
-150,117, 88, 44, 10,191, 82,210,130, 88,121, 49,154,146, 80,204,167, 68,113,140,116,254,247, 85, 18,145,200, 4,131,165, 9,226,
-179,218, 24, 68,214, 33,237, 84, 20,211, 57,179,233, 24, 25,165, 36,177, 66,233, 30, 59,131,151,136, 36,204,166, 35,138,249,156,
-249,172,100,111,127,131, 52,239, 82, 25,203,198,214, 54, 63,243,213,175,176,191,177,201,115,251,251,188,243,209, 29,126,244,238,
- 7, 28, 12,199, 52, 66,114, 62, 47, 80,101, 77,220, 30,178,133, 90, 58,104, 44, 22,225,132,199, 39, 24,139,210, 17,166, 49, 62,
-202,184,177, 20,243,138,184,227,208, 74,120, 55, 85, 99, 64,121, 69,252,114,173,219,122,141,195,168,210,227,224,205,154,168,201,
-143,246,173,243,169, 87, 62,153, 55,246, 73,108,202,145,111,108,147,230,125,118,247, 43,234,217,130,197,120,138,182,138, 60,235,
-161,146,132,193,230, 38,105, 28, 17,107,135,107, 74,220,124,134,153, 77,208,210, 97, 77, 65,158,199,104, 29, 17,197, 9, 73,214,
- 65, 71,130, 44,142,176,101,137, 4,202,186, 36, 29,116,216,187,118,133,120,187,139,205,124,128,140,144,130, 40,242, 2, 72,130,
- 58,222, 6, 52,108, 59,150, 22, 64, 93, 87,196,113,194,108, 94,112,239,225, 33, 34, 74,137,210,156, 94,127,147,251,159,124, 66,
-221, 24,146, 36, 37, 73, 18, 48,141, 79,248,115,190,123, 42,234, 5, 66, 43,116,154,146,182,233,131, 33, 40,169,157,178, 42,165,
-252,179, 59,136,219,214, 15,225,198, 24,170, 58,236,216,173,165, 49,106, 57, 90,174, 27,191,207,109,167,117,126, 45, 18,138,120,
-240,159,199,177,159,246,232,245,136,213,240,113, 23,158,223, 75, 90,160,193,218, 16,222, 19,120, 21,159,246,236,105,167,198, 23,
-167,133,173, 35,107,117,224,147, 79,137,118, 87,211,222,118, 50,188,194,197,174,125,172,112, 79,215,221,191,134, 54,232,194,251,
-238,175,246,137,150,202,125, 9, 90,203,112,102,241, 76, 1,107,188,158,170,118,150,170,246,194, 56,143,216,246,207, 9, 39, 28,
-186,110, 12, 54,164,252,248, 83,147, 11,105,108,107,251, 3,187,150,143,190, 38, 96, 82,172,197,174,178, 18,206,181,187,120,191,
- 95,105, 59, 51,123,225,207, 10,231,158,218, 77,136,139,166,245,181,221,234,197, 9,194,147,211,131, 85,130,147,135,227, 8,225,
-150,120,114, 63,118,243, 95,119,222,233,114,229,242, 62,143, 30,222,227,234,206, 54,135,231,231,104, 45,217,216,232, 82, 53, 5,
-221, 94,151,195,131,199, 28, 29,159,242,171,191,240,211,220,126,239, 29,172,115,116, 54,123, 62,222, 51, 74,249,139,239,255, 57,
-253, 65,159, 91,159,121, 25, 21, 37,108,110,111, 49, 28,141, 57, 61,122,196,205, 43,215,121,227,157, 15,121,241,249,231,249,139,
-247,223, 99,103,107,131, 52,203,105,202,130, 47,190,252, 18, 56,120,248,248,128, 31,188,246, 35,110, 61,247, 28,127,241,195,215,
- 25,143, 70,140,171,134,203,123,151,184,121,235, 57,190,255,250,235, 84,101,197,251,183,111, 51,155,205,249,194,151,190,204,217,
-104,136, 20,146,178,172,125,216,129, 16, 52,214,114,255,193,125,222,122,231, 13,127,138,199,123,235,133,107, 72,147,152,186, 42,
-153, 78,231, 44,230,133,255,115,214,195,120,164,240, 2, 28,143,250,130, 56,210,204,139,146,147,211,115,162, 56,241,167, 87,233,
- 99, 10, 89, 63, 81,254, 71, 42,234, 98,169,203,144,203,124,224, 40,210,196,137, 63,213,235,200, 23,247,245,162,190,126,186,111,
-179,181,147, 36, 37,138, 34,148,246,217,198,237, 3, 81, 58,239,206,168,202,130,239,126,251, 91, 60,122,248,136, 76, 71,124,254,
-115,159,227,228,228,136,195,163, 67,146, 72,113,237,234, 85,146, 52,229,244,244, 20, 83,212, 52, 70,144,229, 61, 30,221,251,144,
- 27,215,246, 73, 34, 73, 81, 22, 84, 69, 77, 81, 41,140,147,148,243,146, 78, 18, 51, 30,158, 97,140,161,174, 11,146, 78,202,157,
- 15,222,231, 82,183,143,114, 27,140,243,136, 44, 79,200,210,148,106, 94, 48, 77, 4, 81,167,131, 22,146,133,177, 24,225,175, 67,
-173, 4,181,173,105,202,130,209,249, 57, 73,156,176,177,153,208,205, 50,132, 51,124,120,251, 54, 55,246,183,217,216,204, 81, 1,
- 78, 98,170,154, 98, 62, 71, 71,146, 52, 75, 65, 43,250, 59, 91, 60, 28, 78, 88,204, 23, 44,230, 37, 39,103,103, 36, 91, 57,177,
-138,168, 49, 88,167,168,107,203, 98, 33, 24, 12, 6, 76,166, 37, 82, 40,132,210,116,250,126, 18,100,173, 35,235,118, 61,114,210,
- 84,152,178, 68, 1, 58,150,204,102, 83,166,139, 25,187,253, 1,198, 88,180, 78,200,114, 69, 89, 46, 56, 57, 27,114,115,123,143,
- 94,154,115,118,124,202,246,246, 0,201,117, 18,237,115,223, 95,124,238, 22,127,246,198, 27,220, 63, 58,161,168,106,206, 15, 79,
- 72,240,202,239,174,138,112, 77,133,138, 21,182,105,136,165, 38,106,154,144,228,231,119,173, 6, 79, 37, 91, 20,142,184, 48,196,
-177, 37,210, 30,186,226, 66,129,145,194,210, 88,139,116, 45,142, 52, 12, 95,173, 89, 61, 23, 16,254,123, 22,248,223,119, 96, 76,
-229, 83,254,100,179, 18, 37, 73, 48, 74, 32, 59, 41,145,112, 80, 26, 74, 81,250,207, 93,140,105, 68,202, 70,222,163,211,223, 36,
-222,219, 65, 41, 73,172, 0, 83,147, 36, 26,219, 24,210, 44,195, 57, 80,229,130,178, 88, 80,105, 16, 90,146, 95,218, 97,231,234,
- 62,186,155, 65, 2, 66, 25,132, 86,129, 95,166, 16, 45,213,204, 65,211,184,150, 12,186, 36,143, 73, 9,117, 89,112,255,222, 17,
-139,202, 66,146,208,223,217, 70, 72, 77, 93, 86,126, 18,146,166,104,173,113,113,226,187,183,198, 39, 33,214,181, 33,235,118,137,
-242,156, 56,207,189,139,162,241, 41,125,166,181,115,233,176, 95, 14, 93,187, 93, 22,116, 23,138,172,239,204,155,198, 46, 11,114,
- 91,240,173,241, 83, 18,133, 88,118,223,177,214,164,145, 34,141, 86, 96,153, 56,168,220,149,146,203, 3,203, 5,175, 88,187, 54,
-181,109,122,219, 26,138,252,175,144, 93,254,244, 42, 80,172, 14,124,235,163,114, 46,226,174, 47,114,221,197, 5,107,217, 95,187,
- 59, 15,217, 4,114,237,137,105,255, 90, 15,200, 21,180, 39, 10, 77, 79,235,219, 23, 66, 96, 91,235, 90, 24,189, 55, 77,227,217,
- 29,206, 96,157, 63, 8,235, 85, 15, 38,150, 49,151, 88, 48, 34,112,146,221, 42, 95, 86,172,137, 10,218, 45,132, 20, 65, 21,223,
-194, 31, 96,109,247,206,218,104,148,167,138,248,167,165,186,173,139,215,253,231,145, 79,120, 31, 87,187,147,245,189,253,250,126,
-127,213,188,185,176, 26,128,186,177,108,111,111,179,152,143,152, 79,199, 72,107, 24,142,206,216,222,222,162,108, 38,108,232,132,
-162,154,162,100,195,119,190,251, 93,110, 94,222,166,219, 25,208,221,180,148,115,131,138, 98, 62,255,133, 47,177,189,189,201,120,
- 58,103, 54,155,130, 83, 12, 54,186,188,245,250,187,108,110, 12,136, 48,100,145,230,149,175,125,141,110, 47, 99, 52, 60,229,253,
-201, 24,140,163,170, 11,126,254,231,126, 14,221,217,224,143,191,245,199,116,187, 61,126,234, 39,127,146,239,124,239, 85,142, 79,
- 79,120,120,120,128,150,146,166,170,152, 45, 22, 28,157, 15,249,209, 91,111,177,177,189,129, 84, 10, 99,205,106,106, 35, 37, 39,
-167,103, 60,122,124,196,162, 44,151,115,110, 31, 86,224,136, 98, 63,194,158, 76,166,164,105,234, 89,199,129, 14, 39, 90,191, 44,
-142, 44,207, 41, 42, 75, 99, 29, 78, 10,174, 92,187,202,163,199,143,216,218,187,133,115, 38,224, 41,237, 19, 55,206,143,247, 99,
-186, 39,252,162, 79, 90,216,124, 2, 96, 59,146, 11, 5, 61,140,212,227, 56, 38,142,227,101, 81,215,107,227,120,169, 53, 90, 74,
- 52,130, 56,209, 68,113,236,197, 69, 74,133, 81,154, 95,154, 58,219,240,232,147,187,252,219,127,245,223,178,187,179,205,124, 50,
- 67, 72,184,117,235, 51, 88,211, 80, 44,230,124,112,251, 67, 58,157,156,221, 75,251, 60,124,116, 72,222,219, 64,165, 29, 22,181,
-227,254,163, 35,174, 93,217,131,186,162, 92,204, 41, 10, 75,109, 96,127,239, 50,195,163, 7, 24,161,168,194,205,116, 58, 28,162,
-132, 97, 58, 60,229,133, 23,111, 96, 19, 73,154,104, 58,155, 27,148,147, 49,181, 76, 24, 21, 6,234, 5,221,205,148,221,221, 61,
-164, 20, 20, 85,197,124, 58, 65, 9,139,198, 34,154, 10,217, 84,236,110, 14, 16,226, 6, 15, 31, 60, 34,237,228,196, 73,140,173,
- 75,154,166, 38,235,245,209, 74,209,216, 6, 91, 26,175, 45,200, 83,118,118,119,120,240,248,148,163, 71, 7,220,153,143, 25, 29,
- 75, 46,109,245,169,141, 97,123,123,135, 75,151,247, 25,142,198, 68,113, 74,158,101,104,124, 70,248,244,108,232,173, 80, 90, 82,
- 87, 13,105,158,147,229, 29, 92,175, 98,120, 50,100, 50,155, 49, 94,204,105,156,197,246,123, 40, 33,136,147, 24, 23, 71, 97, 84,
- 41,104,234,134, 56, 19,108,108,111,115,120,124,192,254,205, 43,236,236,109, 35, 36, 12,134, 51,182, 6,191,192,247,223,124,155,
- 59, 7, 7, 52,181, 97,124, 54, 2, 99, 61,234,210, 57, 82, 33, 3, 29,205, 4,173, 72,128,145,106, 65,229,124,108,110,209, 56,
-244, 2,146, 12,162, 4,234,186, 14,226, 80,177,150,110,197, 50,134,213, 79, 95, 13,194,133,140,103,188,104,210, 5, 38,185, 8,
-191,182,182, 6, 87,248,144,148, 48,166,247, 22,174, 6, 29, 57,132,180,152,166,193,218,130,106, 54,131,185, 38, 90,228, 68,189,
- 30, 34,141, 49,145,196, 41, 65, 36, 4,166,150, 68, 81,204, 98, 52,199,212, 6,213,212, 56, 9, 73, 55,167,191,183, 69,103,103,
-128,238,164, 84,202,162,195,132,176,193,174, 70,224,248,175,213,107,176, 77,176,143,201,101, 56,146,169, 45,143, 15,142,168, 27,
- 65,141,162,191,181, 77,212,233, 48, 60, 57, 33, 75, 83,134,206,209,217, 24,224,132,160,211,239, 51, 62, 61,161,110,106,148,246,
- 83,176, 56, 73, 80,105,134,206, 50,132,242, 98, 52, 41, 2, 90, 87, 72, 92,235,171,119, 46, 88,239, 4,198,121, 50,159,119, 10,
-180, 8,102,115,161,195,109,139,125, 91, 69,100, 24,189, 39, 73, 76,146,198, 36,105, 20, 10,185,242,226, 56, 45,130,218,125,237,
- 57,205,122,204,246,106,183,238, 39,136,114,181,119, 23, 23, 39,183, 23, 1, 87, 79, 60,159,130,182, 70, 56,150,135, 64,108, 75,
- 27,196,175, 21, 5, 23, 59,245,150, 88,234,214,246,230,225, 95, 27,236,125,106,205, 70,246,108,149,187, 91,170,248,215,131, 86,
- 86, 93,187,120,182, 61,173,109,153, 91,250, 94,232,212,149,112,104,121,241,179, 90, 99,151, 29,250,242,115, 88,139, 14,137,167,
- 90, 46,247,214,171,174,251, 66, 1,191, 96, 11,251,148,111, 97,121, 58, 94, 59,249,132,125, 16,214, 92, 8, 6, 88,118,222,238,
-211,139, 58,242, 98,122, 77,139,124, 92,165,224, 93,140,128, 21, 98,245,119, 44,157, 10, 98,109, 44,135,247,124,142, 70, 19,198,
-211, 57, 90, 69, 84, 14,242, 78,234,147,166,128,110,191, 75, 39,147,100,177,164, 42, 43,110, 60,127,157,162, 88, 48,153, 28, 50,
-157, 23, 96, 35,102,163, 41,179,233, 8,233, 12,215,111,252,127,121,251,175, 39, 75,183, 51,189, 19,251, 45,243,217,109,211,103,
-150,183,199,225, 28,224, 0, 13,160,209,222,136, 61, 36,155,106, 74, 61, 51, 36,131, 23,163, 11, 94, 40,230, 66,250, 7, 20,138,
- 80,255, 17, 10, 93, 72,186, 80, 40,228, 70,156, 17, 53, 28, 14,217,156,110,160, 27,104,160, 97, 15,204,241,167,124,101, 85, 86,
-165,207,220,254,115,107, 45, 93,172,111,155,204,170, 58, 64,147,138, 57, 39,118,100,102,165,223,185,247,247,174,247,125,159,231,
-247, 92,102,156, 23,196,141, 22,113, 28, 16,134,138,131,189,231, 72, 44,135,187,207,120,188,189,141,142, 20,237,118,202,235,175,
-189,201, 15,254,246,175,185,117,235, 58,113, 18, 99,165, 70,203,136,139,155,107,108, 63,124, 68, 85,148, 44,173, 44, 17, 4,154,
-163,189, 35, 66,169,184,176,121,145,219,111,125,137, 43, 91,155,140,198, 99,138,170,244,118,157, 5, 33,199,219,239,124,137, 55,
-222,122,135,247, 63,252, 25,134,250, 96,163, 4,189,254, 41,101,153,145,229,147,217,131, 42, 12, 67,180,210, 51, 34,155,212, 17,
- 82, 88,218,237,174, 87,177, 10,216,216,220,228,105,239,132, 76, 9,202,178,172, 11,186,241,147,143, 95, 1, 2,241,210,120, 93,
-193,217,216, 86,225, 60, 55,121, 42,146, 11, 20, 65,224,139,122, 28,199,196,113, 60, 47,234, 98,142, 67,244,156,102,141,146,126,
- 26, 19, 4,170,238,210,107,177,143, 84,222,150,226, 28,119, 62,120,159,191,250, 31,254, 61,210, 86, 60,217,126,194,230,250, 38,
-206, 24,242,162,162,209, 72,185,120,249, 10,101, 89,242,224,254, 61,210, 36,161,179,180, 76,167,221,161,114,146,147, 81,193,179,
-189, 83, 42, 39, 8,181,164, 18, 1, 97, 34,105, 68, 9,173,102, 74,239,248, 16,169, 20,121,150, 49, 30,143, 65, 5, 44,119, 27,
-216,108,194,201,233, 62,114,164,168,210, 6, 43,221,101, 70,101,197,222,238, 49,205,182, 33, 74, 83, 90,107,155, 68,113, 66,160,
- 4,163, 65, 73, 89,140, 72, 66, 69,178,210, 37, 31, 79,104, 55, 98,114, 11,215,174, 94, 68,105,201,241,225, 1,105,179, 67,154,
- 68, 28, 29, 30,179,187,251,156, 48, 9, 89,219, 90,167, 40, 75, 44, 6, 25,104, 46, 93,190, 72,179,209,161,127,114,196,189,251,
-119, 56, 18,134, 64,223, 98, 99,115,139,206,202, 26, 65,210,224,210,210, 42, 69, 89,130,148,152,178,182, 69,105,197,104, 48, 32,
-110, 52,104, 52,155,168, 64, 35, 8, 72, 26, 13,168, 96, 50,201,153,148, 57, 79,182,119, 60,120, 39,105,160, 36,152,202,160,180,
- 36, 76, 98,226,102,138, 12, 3,108, 94,144,180,219, 88, 91,177,180,177,194,175,255,230,215,185,243,217, 61, 30, 63,122,198, 55,
-222,249, 2, 73, 24,145,151,158,113, 62, 56,233, 83, 72,136,165,170, 71,163,117,188,103, 32,102,113,204,206,248,122,108,133,160,
-168, 96, 50,176,132,169, 67, 5, 22, 41, 43, 66, 93, 18,168,202,167,158,205, 82, 25,189,210, 93,214, 44, 5, 91,153, 89,145,146,
- 82,227, 68, 13,158,241,246, 25, 48,118,186, 88,245, 1,165,214, 7, 4,137,170,244,215, 45, 4, 81, 32, 17,149,197,230, 5, 85,
-105, 25, 77, 20,140, 19,154,113, 68, 20, 4, 56, 41,169,132,160,148,245,238, 83, 41,162, 56, 38,106, 55,105, 44,117,104, 44,183,
- 9, 59, 77,136, 53, 4,126,178, 80, 19,115,230, 22, 77, 33, 61, 41, 79,105, 42,227, 47,208,206,250, 41,133, 49, 22,172,100, 56,
-200, 24,246,115, 84,220, 33,208,154,116,169,139,140, 52,149,169, 40,243, 9,206, 89,226,102, 74, 16, 70,132,129, 38,219, 45, 17,
- 66, 35,132,242,222,101,165, 81, 81, 68,216,104, 80, 42, 63, 77,213, 18,159,210,166,252, 74, 78,135,161,159,224, 77,157, 74,110,
- 14,127, 49,214, 71,232, 58,103, 22,108, 92,204,162, 63,167,129, 95,170, 70,212, 6,225,162, 31,221, 39,255,105, 37,208,122,250,
-177,231,247,228, 98, 46,168, 93,224,159,136, 51, 2,107,249,202,174,253,165, 29,188, 88, 8,123,161, 94,221,212, 69, 94,188,244,
- 32,176, 72, 58, 21,103, 9,112,181,161,119, 58, 70, 23, 47, 17,205,205,222,119,222, 75,190, 8,233,226,252,161, 68,188, 56,124,
- 23,110,118,253,211,245, 65,171,114, 53,246,188, 22,206, 77, 39, 36,150,169, 45,180,110,106, 4,232, 51, 29,246,130,128,109, 17,
- 4, 48,199,124,206, 95, 78,137,111,179,127, 95, 16, 28,200,185,212,111,238,189,155,243, 66,206, 64, 97,196, 44,243,110, 33,118,
-206,206,199, 32,103,138,254,140, 57,204,194,110,223,158,217,243,159,193,208, 10, 63,126,183,214,120,104, 71, 16,210,106,117,120,
-252,240, 33, 77, 45, 41,141,143, 25,172,156,227,180,223,103, 57,109,211,109, 54,185,122,249, 6,210, 5, 8,165, 41,243, 33, 74,
-107,172,149,148,110,194, 23,191,244, 21, 14,119,119,200,199, 19,126,237,215,190,194, 95,127,247,123, 62, 78, 48, 80,126,239,165,
- 35, 34,173,160, 42,113,178, 98,216, 47,232, 92,232,146, 52, 90,244,135, 61,246, 14,246,105,180, 52,151, 47, 94,229,227,143,222,
- 35,159,244,177, 42,100,127,111,143, 63,248,195, 63,224,161,187,207,246,246, 51, 46,221, 90,225,193,163, 71, 92,217,186,192,201,
-233, 41, 2, 57, 19,174, 56, 33, 81, 82,179,190,121,129,175,254,250,111,243,127,251,127,252, 95,253,154, 65, 88,156,112,148,166,
-224,116,112, 74,191,223, 35,203, 38,140, 70, 67,146, 52,198,216,178,126,178, 76,159,212, 1,215,175, 93,231,248,244, 20,235, 28,
-105, 43,165, 43, 43,150,187, 75, 88,155, 47, 8, 58, 62,127,167,254, 42,184,194,226, 19,255,188,208,206,143,223, 64, 73,191,107,
-155,226, 35,167,157,186, 82,231, 59,245, 41,120,197,255,205,195,122, 63, 55,219,165,214,143,169, 34,207,249,206,183,190,201,253,
-207, 62,101,109,101,149,222,225, 41,167,167, 61,150,150,150, 64, 74, 84, 24,146,180,218, 68,198,176,186,190, 69, 89, 20,132, 81,
-192,202,250, 26, 79,159, 62, 33, 72, 91, 36,173, 22, 31,221,125,192, 82,167, 77,154,198,180,151, 58, 92,188,124,157, 36,241, 46,
-131, 98, 50,198, 20, 5,197,112, 72, 97, 44,151,174, 93,129,229,148,251,119, 62,161, 21, 37,148,165,161,189,190, 70,123,109,139,
-211, 97, 70,218, 89,161, 40, 74,238,125,246, 25,202,148, 44,119,189,152, 9, 87,145,101, 57,177, 80, 56, 83,176,253,232, 62, 23,
-174, 94, 37,141, 3,182, 46,108,114,241,210, 5,180,200,113,197,132,126,127,192,238,222, 33,235,197, 38,227,241,152, 56, 74, 9,
- 59,109,242,201,144,225,201,136, 78, 51,229,159,252,233, 63,230,249,225, 51, 14,118,247,184,114,233, 50,198, 88,242,178,100,148,
-149,148, 66,179,185,185,229, 85,183,166,100, 52, 24, 80, 86, 21,205,118, 27,180,244,227, 87, 5, 84,194,199,225, 42,133,177, 21,
-173,102,139,141,245, 13,142,142, 78,113,109, 67,154,132, 56,103,137,146,136, 48,137,168, 76,129, 18, 49, 81,179,129, 19,154,193,
-233, 17, 34, 8,144,137,230,202,173,107, 8, 29, 32, 31, 62,227,107, 95,124,155,254,104,132, 17, 48, 24,143, 25, 85, 5,177,212,
- 24,107, 80,224,221, 38, 82, 64,101,169, 92,229,249, 8,190,246, 97,149,102, 84, 89,118,142,114,194, 72,160,149, 37,210, 5,186,
- 78,219, 82, 74,215, 8,217,202, 23,111,103,234, 11,171,173,181,115, 10,171,236,172,123,155,131,139,106,182,185,245,159,235,108,
-137, 45,115,132,169,144, 88,164,208, 72,225,208, 26,180, 10, 80,194,239,243, 51, 59,166,156, 76,136,202,192,139,193,116, 64, 20,
- 69,196, 81, 64,179,211,166,209,106,162,154, 41, 65,167,137, 77, 67, 74,109, 81, 84, 40, 35,137,234, 24, 90,175,221,149,179, 98,
-101, 17,179, 32, 43,159,137,173,113,214,224,140,227,244,164,199, 47,126,250, 49,151, 46,221,192, 88, 69,220, 74, 9, 27,113,205,
- 47, 23, 12,250, 61,154,173, 6,105,171, 65, 16,132, 20,227,140,210, 90,194, 36, 98,208, 31, 82,149,126, 10, 18, 38, 9, 58,138,
- 49,182,168,159,123,202, 31,156,181, 68, 26,229, 15, 63, 2, 31, 40, 51, 75, 17,243,205,130, 49,198, 51,231, 23, 58, 79,223,185,
-215, 9,158,106,110, 87, 11, 3,229, 5,190,129, 38,212, 1, 65,232,167, 5, 74,122, 43,179,172,199,239, 44,212, 4, 87,103, 52,
-156,189,182,139, 89, 97,151,126,180,240, 75, 60,224,110,225, 90, 48, 63, 42, 56,177,168,149,175,197,105,246, 28,192, 76,156,231,
-156, 48,207, 16, 57, 83,187,120,165,242,125, 86,192, 61, 16,161,126,125, 97,114, 89, 7,164,185, 58,179,221,205,110,103,113,215,
- 66, 72,127, 31, 41,233,187,111,159, 33,236, 15,123, 53,167,223,152,122, 37,226,188, 22, 46,152, 93, 43, 5,218,123, 58,197, 28,
-224, 34,230, 95,248, 60, 57,103, 58, 74,159,223, 17,211, 61,185,156,167,244, 44,118,246,159, 19, 34, 47,220, 75,252,200,130, 5,
- 19,130,152, 5,201,204, 79, 52,110,102, 97, 19,103,148,206,115,165,188,168,249,245, 66,206, 15, 22,254,180,234, 99, 43,117, 24,
-209,105,119,120,114,255, 57, 65, 51,101,216, 59,225,230,173,107, 60,186,255,148,163,231, 21,237,246, 42,173,230, 42,229,184,224,
-248,232,136, 75, 87,175,208,127,250,156,172, 40, 41,171,138, 15, 62,186,131, 51, 19,126,239,119,190,202,123, 63,253, 91, 78, 14,
-119,209, 65, 68, 24, 53,216,123,126,192,106,119,157,201,104, 72, 24, 41,156,240,233, 64,167,131, 62, 75,171,203,220,188,182,201,
-246,227,231,140,135,240,229, 47,127,149,131,189,199, 20, 69,204,218,198, 69,126,246,225,251,252,229, 95,252, 37, 95,249,226,187,
-168,231,123, 36, 73,196,151,191,248, 54, 97,160,120,250,228, 96,118,178, 11,149,154, 77, 58,132,208, 12, 70, 99,138,194,251,108,
-165,246,227,117, 41,253, 62, 70, 41,205,112, 60,166,127,122,204,131,227, 83,159, 45, 45,165,143,110,180, 14,165, 35, 46, 92,220,
- 66,217,156,246, 82,151,178, 44, 72,180, 34, 73, 90,244,199,249,194, 88,234,124, 66,222,175,188, 94, 58,195, 46,118,245,105,243,
- 76, 72, 65,253,115,106, 29,248, 81,252, 20, 25, 89, 71, 57, 42, 33, 23, 58,117, 47,154,145,136,217, 58, 1, 4,166, 22, 88,149,
- 89,198,207,126,242, 67,178,225,128, 34,155, 48,234,247,248,250,215,191,202,206,211,231,168, 48, 32,142, 98,148, 14, 41,139,138,
- 60,203,209, 58, 68, 34,137,146,136,194, 24,130, 56,101,253,194,101,180, 20,172,174, 95,192, 85, 5, 72, 65,107,169,203,165, 91,
-175,243,217, 71, 31,113,184,183, 71, 35,138, 61, 22,212, 57,242, 73, 65, 20, 38, 28,156, 30, 48, 41, 42,182, 86,219,148, 69, 69,
- 16, 69, 92,184,124,153,180,149,115,114,124,132, 51, 5, 85, 57, 97,247,241, 61,154, 73,200,234,242, 18,171,203,109,112,150, 81,
- 86, 18, 6, 49, 82,107,158,237,238,113, 33,140, 41,138,202,171,197,235,206,110,125, 99,131, 86,187, 75, 24, 40,178,241, 8, 97,
- 33,104,132,132, 81, 76, 16, 87,156,238, 31,145,166, 49, 43,221, 22,141, 56, 66,235,152,194,192,225,193, 51,130, 40,100,171,217,
- 33,203,114,130,154,121,189,124, 97, 11,234, 2,146,149, 5, 78,248,192, 19, 33, 3, 28, 5, 58,140,104,119,150, 56, 29, 14,184,
-124,229, 26, 81,152,128,169, 8,149, 35, 8, 3, 84,168,153, 20,133,207,214,174, 59,227, 36,109, 16,135,161, 15, 38, 65, 96,109,
-201,214,214, 26, 69,150,147,156,142,184,121,101,139,131, 81,143, 86,187, 73,255,224,148, 86, 8,161,177,132, 2, 74, 3, 82,251,
-149,204,148, 67, 46,173,163,172,252,197, 55, 8, 52,187,147, 2,121, 82,112, 43,136,104, 20, 25,149,148,148, 50, 64,169, 10, 99,
-100,221,103,212,249,108,114,118, 53,192,154,202,239,197,149,242,133, 97,250,252,193,147,209, 76, 29,136,129, 53, 56, 83, 33,173,
-169,175,103, 6, 48,126, 20, 45,124,175, 22,196, 65, 93,140, 21, 78, 7, 88, 29,226,194, 24,151,196,184, 36,194,180, 82,138, 70,
- 72,210,136,169, 2,137,243, 51, 52,108,229, 39, 18, 30,194,101, 33,168,215, 97,181, 32, 76, 34,189,181,206, 24,172, 48, 40,161,
- 48,149,160,223,155,112,231,147,123, 76, 70, 19,118, 30, 63, 1, 21,114,225,181,155, 52,194, 16,180,160,168, 74,114, 83,178,186,
-182, 69,146, 54,253,202,173, 63,192, 56, 8,162,136, 98,114,136,169,140,159,170,164, 41, 58, 12,168, 10, 83,115,217,253,104,219,
-107, 87,188, 7,222, 85,114, 22,119,108, 0,171,234,209,187,240, 35,231,178, 44,189,255,189, 46, 92, 82, 42, 2,237,115,232, 3,
-188, 22, 70,235, 41,250, 53,240, 98,185,186, 83,247,152,117,231, 57, 40, 11,226,184,105, 24,151, 56,195,255,158, 23,244, 57,128,
- 74,206,248,239,211, 86,146, 87, 94,151,196, 28, 39,238,196, 25,103,204, 66,250, 41,103,153,101,231, 49,228,245,105,195,250, 78,
- 93, 50, 77,140,115, 51, 77,216,244,237, 69,158,187,123, 1, 50,195,172,120, 91, 55,133,121, 89,255,120,115,182,206,177, 48,126,
- 61,228,230, 36, 60,127, 61, 12,252,180,162, 50, 84, 37,243,144, 34,166,214, 63,135,146,146, 80, 9, 66,237, 15,102,122,186,179,
- 88, 12,213, 88,180,158,137,115,112,152,197, 78, 93, 45,158,168, 16, 47, 13,148, 95,204,184,158,142, 86,206,135,130,156, 63,125,
-201, 51,197,222,157,155, 22,136,179,136, 25,113,230, 79, 80, 95, 96,124, 28,157, 56, 23, 0, 51,152,228,148,198,208,136, 21,105,
- 2, 5,150,193,209, 51,198, 39,151,112, 34, 34, 89, 89,161,127,116,204,143,190,251, 35,190,252,206, 23, 81, 58,166,127,124,192,
-241,193, 46,105, 28,242, 39,255,240, 31,241,139, 95,220,225,238,253, 15,113,161,100, 48, 58, 70,218,138,108, 0, 97,103,137,170,
- 60,160,204, 75,182, 31,223,167,179,190, 68,111, 48, 68, 11, 65,110, 42,174,221,188,201,206,147,123,100,195, 62,195,227, 9,253,
-107,215, 89,191,120,153,229,205,101,222,127,255,125,162,180,129, 53,134,103,123, 7,172,109,108,114,114,124, 64,255,201, 67,190,
-252, 79,254, 25,223,255,219,111,251, 83, 49,176,212, 72,137,131,136,222,160, 32, 77, 26,140,178, 9,227, 81, 15,137,247,176, 98,
- 5, 43, 75,171, 92,216,220,228,240, 96,143,178,172, 48, 69, 78,225,188, 96,199, 73, 1,165,244,204,103,161, 89, 93, 94,102,180,
-247, 12,165, 52,229,120,136,156, 12, 9,211, 37,191,175,153,121, 37,197, 47,237,200,207, 40, 61, 92, 29, 96,120,198,115, 50, 79,
-203, 67,137, 89, 58,223,116,164, 38,229,130, 88, 72,212,209,153,206,191, 95, 10,137,181, 14, 41, 61, 30,212, 63, 33, 61,215,221,
- 90,139, 69, 32, 76,197,179,237,199,236, 63,125, 66, 35,142,216, 88, 95,231,228,248,132,193,160,199,218,198, 26,227,162, 36, 73,
- 83, 86,150,150,209, 74,114, 58, 62,166,200, 38,164, 62,174,143,194, 56,218,157,101,164, 12, 25,143, 71, 44, 45,173,224, 92, 69,
-101, 45, 91, 23,175, 96, 92,128, 49,142, 32,208,244, 6,167,236,238,238,241,165, 47,127,153,214, 74,204,254,209,144, 73,230,248,
-226,151,127,147, 70,179,129, 10,148, 31,139, 22,150,201,100,194,206,147,199,220,186,126, 25,157,180,217,125,182,195, 94,191,207,
-112, 48, 70,218, 18,169, 20,163, 73,201,230,133, 54, 81,220, 0, 33, 24,143, 51,154,173, 22, 81, 28, 18, 4, 13,202,124,194,225,
-254, 46, 85,149, 83,101,150, 78,186, 10,194,145,143, 39,232, 52,165,177,180, 76, 24, 69,140,122, 39, 84,195,156, 70, 20, 83, 88,
- 1, 82, 19,183, 87, 88, 93, 93, 35,144, 37,174,204,124, 40,147,138, 40,203,138, 48, 8, 61,158, 83,105,178,113, 78, 67,199, 96,
-253,223,187,114,128, 82, 52, 26,109,122,163, 12,227, 74,150,151,186, 68,162,194, 58, 8,147, 38, 97, 75,145, 23,185,183, 75, 9,
- 40, 50, 47,176, 19,198,161,141, 36, 63, 29,240,236,217, 14, 81, 28,211,108, 42,214, 86,154,132,166,162, 28,103, 76,172,227, 20,
-139, 22,144,214,118, 25,105, 44,186,126, 8,104, 41,105,200,136,113, 89,160,140,223, 13,143,100,192, 39, 39, 5,141, 68,208, 81,
- 2, 43, 11,170,192, 98,116,133, 81,202, 91,216,170,122, 7,138,245, 83,189,217,174,212,249,145,183, 3, 39, 37,216,250, 96,235,
-188,120,206,217,218, 31, 44, 36, 96,234, 93,118, 9,149,103, 31, 56,225, 53, 39, 82, 56, 4, 26, 29, 40, 47, 6, 75, 19,194, 48,
- 38,138, 35,210,102, 66,156,132,196,145, 38,144, 2, 79,129,119, 4,245, 70,212, 24,131, 12, 66, 68,160,106, 33,175, 4,148,143,
-151,182,126, 79,154, 23, 25, 74,131, 51,138,108, 2,247,239, 60, 5, 35,233, 54,189,216,242,249,246, 99,142,118,159, 80, 86, 35,
- 86,175, 94,246, 95, 51, 12, 73,219, 29,162, 56, 65, 43,141, 80, 39,136, 64,163,170,128,178,168,136, 26, 9,113,187, 73,208, 72,
-252, 69, 95, 5, 40, 25, 96,164, 67, 40,141, 86, 1,129,182,181, 69,145,217,120,220, 89,208, 82, 96,167,241,203,248,200,228,162,
-244, 25, 20,254, 33,226,239,111, 29,120, 4,174,148,222,162, 26,106, 61, 47,236,129,246,211, 0, 33,144, 88, 95,220,229,212, 22,
- 93, 71,123, 59,127,221,246, 53,184,246,208, 79,173, 92,181,143,221,223, 95,117,179,105,229, 12, 21,251,242, 70,194,175,254,166,
- 25,230,110, 97,140, 62, 21,179, 45,238,169,207,162,200,167,242,182,105,100,153,173, 3,109,106,131, 92,173,205,120,217,232,125,
- 6,145, 57,131,118,245, 69,124,246,118, 93,204,253, 36,198,212, 24, 94, 63,149,153,254, 64, 94,115,164,168,194,160,214, 55,128,
- 40,235,201,147,155, 10, 26, 33, 16,130, 64, 73,180,114,115, 82,159,170, 71, 27,174,246, 62,139, 51,133,218,157,139, 59, 60,187,
-115,144,175, 82,175,191,162, 88,191,138,192,243,249, 69,226,101, 74, 71, 94, 80,199,191,138, 74, 54, 63, 72, 56, 6,189, 83, 54,
-215, 55, 56,122,124, 15,107,160,217,142, 57,232, 29, 19, 69, 1, 73,179,129, 52,134, 70,156,178,190,113,129,227,254,136,160, 25,
- 32,117,201,181, 43,151,249,228,227,247,185,119,239, 51,194, 80, 51, 24, 12, 25, 14,114,118,158, 30,146,234, 54,163, 81, 73,208,
-245,126,242, 40,214,228,249,144,229,238, 21, 30,220,255,140, 52, 78,104,139, 22, 61, 42,108,149, 51, 26,158,144, 52, 86, 65, 88,
-226,164, 65, 85,250,145, 91,146, 52,200,198, 19,118, 15, 14, 73,226, 6,227,124, 82,239, 2, 29, 7, 7,187, 8, 33, 8, 85, 64,
- 81, 20,140, 71, 25,105,115,141,164,209,242,208, 92,227,159, 24, 66,105, 58, 75,203,172,172,174,177,178,188,194,201,193, 14,206,
-230,100,249,144,126,127,136, 68, 82, 86, 85, 45,128,116, 40, 37,233, 38, 13,238,125,248, 83,142,159,238, 80, 28,239,209,137, 3,
-186, 27,151, 48,166,250,143,136, 22, 92, 12,122,121, 53,101,233,165,182,143,250,129, 38,157,157,241, 15,172,169,144, 82, 97, 42,
-139, 84,154,162, 50, 68, 74, 83, 89,135,113,240,244,233, 14, 91, 75,109,122,123, 59,116, 26, 17,195,129,240, 92,241,184,201,193,
-176,160, 69, 76,187,213,164,217,110,145,118,154,236, 60,217, 97,144,141, 8, 66,141, 11, 3,194, 70,131, 36,105, 50, 26,142,113,
- 42,100,117,163,131,115,150, 60, 31, 81, 20, 57,119,238, 63,100,117,169,203,155,239,124, 25,225, 42,238,220,249,140,145,145,220,
-254,194,187,236, 62,223,231,238,221,123,220,186,121,139,180,179,194,193,209, 1,151, 47, 95, 98,255,233, 83, 78,250, 57, 87,174,
- 92,167,213,108,240,236,233, 67, 20,150, 11,151,175,176,180,180,132, 16,146, 32, 10, 24,141, 70,152,114,204, 48,243, 4,182,102,
- 20, 32,243,146, 82, 86, 8,215,160,202,188, 30, 98,115,115,139,211,147, 99,142, 14, 15,137,162, 49,205,182, 66, 58,199,100, 48,
-164,177,212, 37, 74, 83, 38,147, 49,165,144,100,163, 17,163,113, 69,127, 92,178,127,220, 35, 77, 98,226,118,140,195,122,197,184,
-149, 20,185,161, 24, 15, 17, 66, 18,167,169, 23,190,230, 99, 36, 62,211,189,118,185, 82, 20, 5,163,225, 0, 29, 70, 20,105, 66,
-101, 10,164, 82, 4,177, 65,105,229,247,232,206, 81,150, 37,133,245, 12,116,237, 12, 65, 18,179,188,186,198,233,201, 9,163,209,
-152, 70,218, 64, 9,216,126,248,152, 80,105,116,160,201, 42, 67,174, 4,185,242, 10,125, 53, 37, 69, 74, 15,138,210, 58,244, 0,
-148,122, 15,218, 80,146,163, 28, 62,221,205,105,197, 13, 54,181,160, 85, 78, 80,129, 99,142,241,246,112, 38,191, 55,149,243,145,
-160,195,143,250, 69, 61,206, 92,232,206,252, 20, 72,248,162, 98, 1, 35,252,129,203, 86,179,200, 44, 33,124,177, 11,180, 32, 12,
- 21, 81, 20, 16, 39, 49, 73, 35, 34,142, 19,162, 56, 34, 74, 35,226,216,119,167, 50,144, 62,179, 91,207, 41,136, 74,123,111,253,
- 52, 27,221,185,169, 63,219, 82,217,138,162,204,189, 88,185, 84,216,202,241,241, 71,159, 50, 26, 78, 88,238, 54, 17,206, 50,232,
- 13,105, 45,181,121,184,243,132,231, 79,158,240,201,157,207,184,126,245, 6,155,171,107,232, 32, 36,106, 52, 16, 72, 76,253, 60,
-234,245,122,132,113,132,142, 66,116, 28, 19,197,201,108,218,170,181,194,168,169,111,188,172, 21,233,243,176,144,233,116, 12, 64,
- 89,111,123, 22,117,103,108,173,163, 42, 61, 47,131, 64,212, 17,217,190, 56,120,235,169, 71,191,234, 32,152,221,148,154,106,158,
- 76, 61,226,247,195,148,153,109, 12,113,198,229, 52,237,204,229, 25,177,156,152,177, 81,196, 52,181,243,115,132, 62,194,113,230,
-154,114,102, 35,124,134, 92,186, 80,128,237,194, 40,221,214,193, 82,114, 90,176,235,110, 90, 24,236,130, 8,248,236,141,121, 33,
-183,110,214,149, 91, 99,234,135, 82, 93,204,173,239,206,109,101,176,198,107, 57,166,197, 94,212, 58,133,243,225, 45,214, 26,191,
- 38,170, 65,113, 76, 1,113,117, 81,159,254, 13,245,204, 90,224,196, 92,132,198, 89,177,220,108,180,189, 48,126, 63,255, 49,175,
-234,210, 95,134,202, 59,111,217,123, 85,125,127,245, 33, 65,252,202,135,130,197, 67, 71, 54, 30,113,249,173,215,121,182,180,196,
-184, 63,164,159,231, 84,121,238,119,113, 90, 19, 80, 34, 84,136, 14,155,108,239,238,115,245,246, 10,101,101, 56,220,125,204,141,
-235,215, 49,166,162,223, 31,242,235, 95,255,117,190,251,237, 31,210,105,109, 50, 62,205, 25, 13,199, 52,172, 87,139,142, 70, 61,
-198,147, 33,249,184,143,194,103,195,223,255,228, 83,154,237,148, 56, 54, 52,218, 41,198,150,124,255,135,127, 67,218,217, 96,243,
-210, 69,214, 86, 55, 56, 81, 39, 68, 81, 66, 24, 68,156,246,251,252,103,255,249, 63,227,191,254,255,252, 75, 78, 79,143, 25, 13,
- 7,132,129,166, 40,115,170,202, 1,154, 56,136,216,188,112,145,231,187,207,176,117,184,142, 84, 33, 66, 5,156,246,250, 88, 83,
- 50,234,239,163,117,137,149, 30, 86, 96, 77,173,120, 81, 14,235, 12,141, 52, 37, 9, 52,131,131,125,204,112, 64,224, 44, 54,155,
-208, 59, 57,193, 44, 64,103,126,105, 40,193, 11, 97,193,245,147, 97, 97,167,126,126,253,114,126, 39,117,230,164,237, 28, 56,131,
-116, 22, 45, 52,141, 70, 66, 24, 70, 12,198,185,231,238,135, 33,149,243, 29,212,233, 73,143, 70,179,193,131, 7,247,113,197,132,
-213,213, 85,150,215, 54, 40, 12,124,122,231, 1, 84, 22, 29,197, 4, 81,194, 36, 43,216,191,251,144,118,183, 75, 51, 8, 73,211,
-132,149,213, 85,210,164,193,112, 48, 98,148, 85,172,108, 46, 81, 22, 5,131, 65, 15, 29, 68,116,210, 38, 69,105, 72, 91, 13, 70,
-165,101,208, 27,176,118,233, 38,239,126,227,247, 64, 72,130,230, 50, 46,136,105,183, 91,228,214,114,225,234,117,198,227,140,149,
-245, 11,244,250, 3, 14,142,143, 89, 91, 89,162,180,130, 7,143, 31,243,149, 47, 47, 51,202, 43,250,189, 62,157,181,117,150, 87,
- 47, 32,195, 30, 75,221, 22,137, 22, 80,140,177,229, 4, 35, 13, 70, 57,208, 33,147,178, 68, 7, 33,205,102,135,251, 15, 30,209,
-234,116, 9,198, 99, 63,242,140, 99, 76,150,161,162,136,238,133,139,196,205, 38,207, 31, 61, 97,124,116,192,120, 52,193,148, 57,
- 31,125,248,115,190,242,165, 47,160, 82, 63, 42, 21,206,119,196,214, 26,202,162, 32,199,144, 54,155,254,226, 37,180,247,144, 11,
-234,216, 93,193,100, 52, 68,151, 37, 89,154,226, 76, 78,179,213,172,197,171, 22,155,103,200,180,129,114, 16, 40, 47,242,170,242,
- 10, 83, 20, 52,151,151, 89, 91,223, 34,234, 13, 8,195,128,213,110,151,181,149, 46,186, 82, 12,141,101, 52, 26,147,105,205, 4,
-137,113,165,143, 22,117, 62, 22,216, 88, 75,172, 5, 97, 32,125, 46,189,148, 36,165,143, 78, 61, 42,225,135, 79, 39,252,206,237,
-132,200, 20,232,210,239,133, 69, 85,235, 52,172, 64,214, 28,243,169,240,118,234,160,153,141, 75, 23,217, 72, 82,162,235,137,144,
-180, 2,225, 36,194, 42,148, 45, 61,200,198,121, 63,125, 24,248, 16,167, 56, 8,136,226,144, 56,209, 68,177, 34,138, 37, 97, 44,
-137, 66, 65, 20,105, 15,243, 82,254,160, 33,213, 84,124,236,167, 78,174,246, 61,171,122,143, 46,240, 56, 86,191, 39, 45, 81, 72,
-164, 9,248,217,123, 31, 49,232,143, 9,180,246,241,161,129, 34, 43, 42, 66, 44, 95,250,202,187,124,114,239, 30,149,117, 60,158,
- 84,220,184,117,155, 40,137,145, 81, 4, 22,132, 86, 4, 97, 72, 81,248,245, 81,144, 36,168, 40, 34,105, 36,160,235,144, 21,173,
- 49,218, 80, 85,245,235,198,160,181, 94,128, 61,205, 93, 75, 65, 93,164,202,202, 7,163,212,126,183,186, 0,214,235, 48,225,187,
-122,173,228,140,231, 62,181,171,170, 64,123, 50,233,108, 10,238,230, 73,160, 44,230, 59,112,102,151, 62, 77,174,155,114, 82,168,
-173,210,179,209,252,185,209,251,171,136,110,231, 27,135, 23,197,110, 62, 24,224, 76,183,109, 23, 82,212,172,245, 29,117,101, 16,
-162,244, 26,136, 5,229,188, 59,167, 51,152,119,231,117, 81, 55,115, 75, 32,245,116,209,152, 10,103, 12,198, 84,190,160, 87, 21,
-166, 42,113, 85,229,175,125,216,154,230, 58,229, 47,216,217, 4, 64, 72, 80,181,214, 65, 9,225, 5,136, 74,212, 98,196,105, 81,
-175,187,242, 41, 11, 88,158,233,190, 95,236,136,231, 99,122, 94,180,162,157,243,148,159,217, 80, 76, 79, 50,128, 19,238,151,198,
-212, 9,241,170,130,206, 47,133,231,159,183, 62, 8, 1,101,145,163,164, 98,125,125,147,201,112, 64,156,229,244,198, 71,236,239,
- 61, 7, 29,243,193, 47,126,192,181, 75, 87, 25, 76, 96,125,235, 34,227, 73,206,201,222, 33, 46,159,208,108,166, 52, 5, 84,197,
-132,189,103,125,222,184,245, 6,151, 54,183,248,206, 95,125,143, 32, 40,125,220,233,120,204,202, 70,135, 36,109,113,120,184,207,
-133,205, 77,142,247, 79, 89,233,118, 48,194,144,196, 9,163,188, 79, 16, 69,196,137, 87,169, 74, 36,207,119,118, 57, 58, 62,226,
- 31,254,195, 63,230, 47,190,249, 77, 42, 99,248,203,111,125,139,102,171,205,243,231,207,168,172,167, 5,205,125, 31,138, 48, 73,
-185,112,105,139,127,253,223,253,171, 90, 83,160, 80,129,143, 93,109,181, 90,180, 91, 9,217,222, 93,130,192,208, 94,110, 83,238,
-142,188,223,209,249,145, 23, 50, 96,237,194, 6,107,107,171, 72,103,104, 53, 35, 42, 49, 33, 10, 52,167,163, 30, 85,104,124,214,
-240, 52,221,232, 87,140, 21,156,133, 23,138,179, 73,247, 47,211, 85, 44,138, 67,166,153,192,181,153, 24,101, 45,167,199, 71,236,
-236, 60,245, 99,193, 32,160, 40,161,179,180,204,214,165, 75,188,241,214,219, 62,255, 57,207,168,138,156,221,131, 19,174, 95,191,
-198,202,214, 5,250,189, 19,150,186, 29,254,249, 63,249, 83,170,202,178,189,189,195, 40,115,132,113,147,166,136, 40, 75, 75, 81,
- 58, 86,214,151,105,117,214,121,246,100,155,211,147, 99, 90,157, 46, 40, 73, 16,199,172, 55, 82,138,124,130,196,178, 20,197,228,
-121,193,147,157,103,172,172,174,145,180,187,244,199, 57, 65,224, 15, 81,183,223,124,139,211,211, 83,150,150,186, 76, 70, 99,130,
- 40,101,169,219,101, 37,203, 57, 62, 62, 66, 6, 1, 95,120,231, 29,154,205, 38, 59,207,247,217,220,218,226,100, 48,100,148,229,
-180, 27, 41,101, 81,208, 27, 14,233, 94,186, 72,162, 59,148,147, 17,227, 81,143,192, 26,132,179, 24, 43, 40,138,146, 40, 86,124,
-241,221, 47,123,244,105, 81, 82, 20,165, 47, 70, 74, 83, 24, 67, 8,132, 73,131,229,245, 77,156,211, 4,199,254,112,230,172,225,
-251,127,251, 93,222,124,253, 38,151, 46,108,208,237, 6, 96,253, 46,174,176, 57,217,184,162, 52, 21,221,181,245, 90,147, 35, 8,
-194,152,178, 40,235,100,185, 17,167,207,159,161,176, 44,117,219,132,129,198,153,146,170,168,144, 74, 99, 6, 6, 25, 68, 68,141,
- 20,146, 8, 59, 26, 99,198, 35,170,210,162,155, 45, 26, 34,192, 85, 37,175,191,246, 26,223,248,250,215,248,151,127,254, 45,159,
-253, 13,100,198, 48,112,142,134,214, 84,194,225,140, 35,116, 94,124,133, 16, 4,129,196, 85,254,241,212,144,142,134, 18,244,173,
- 96, 55,119,252,244,193, 9,191,123,179,141,214, 32, 75,131,148, 37,170, 18, 4, 90,225,106,186,227,153, 53,158,245, 9,133, 98,
-166,243,144,136,160, 46,100, 90,161,132, 67, 82,121,244, 44, 6,237, 74,168, 25, 16, 74,130, 86,138, 56, 10,136, 2, 47,254, 10,
- 67, 73, 24, 10,130,208,161,180, 65, 40,239,123, 23, 74,227,164, 67,105,129,212,210, 11,249,166,231, 11, 37,253,161,193,249,233,
-128,197, 97,156,193, 84, 21,210,249,245,217, 79,127,242, 1,207,118, 14,232,118,150,137,227,144,202,148, 24, 87,146, 52, 35, 90,
-221, 6, 50,208,124,125,233,171,252,224,123, 63, 96,116,210, 35, 31, 79, 72,211, 20, 17,104,202,162, 34,140,252,152,221, 58,139,
- 12, 52,113,179, 65,208,108, 16,165, 49,165,117, 62, 75, 92,213, 25,241,211,155,241,169,105, 8, 47,160,243,156,145,250, 80, 34,
-124,188,173,150, 30,221,172,165,196, 5,218,227,122,181, 34,168,129, 53, 94,220, 42,209,218, 23,118,169, 37, 82,123,205,140, 82,
- 98, 38,138, 22,152,185,152,122,186,176, 63,207,131, 19, 11, 81,219,115, 5,183, 31,199,159, 19, 90,191,106, 10,248,170,105,160,
-155, 42,212,167,187,252,197,127, 59,167, 13,246, 88, 90,129, 16, 85,125, 40,147, 62,177,212,169,133, 32,178, 41, 3,127,225, 96,
- 48, 61, 36,212,226, 66, 99, 13, 24, 55, 27,181, 27, 83,249,110,221,248,195,156,169, 12,148, 37,206,150, 62, 54, 24, 55, 59, 40,
-201, 25, 96,199,206,173,236,210,175, 2, 2,237, 51,234, 67, 45, 9, 3, 93, 3,189,106,161,196,244,162, 43,207,248,201, 95,236,
-162,207,236,221, 95,209, 77,191,204,143,126,102,215, 80,255,209, 94,149,108,243, 50, 47,251, 47, 43,220,191,108,116, 47,234,108,
-237,254,112,128,142, 98, 63, 66, 20,150,245,110,202,195,187,119,249, 71,255,249, 63, 39, 54, 99,170,113,134, 29,143, 89,238, 54,
-185,191,253,132,219, 87, 46,114,255,211, 79,217,218,186, 72,144,196, 40,229, 24,244, 78,120,120,247, 14, 31, 72, 77,153,151, 24,
- 10,164,128,162,200, 57,220, 63, 34, 78, 37,198, 90,222,121,251, 58,249,112,140,138, 82,134, 89,129, 10, 19,214,150,150, 40, 77,
-197,165,203,215,232,247, 74, 46,110,172,115, 55, 73,168,218, 29,172,245, 33, 45,111,189,253, 5,218,173, 14,161,214,220,185,123,
-159,202, 88, 12, 83,251,136, 36,140, 34,190,240,246, 59, 36, 73,196,195,251,159, 81, 7,224,145, 38, 13, 47,252,210,138, 72, 75,
-250,131, 35,132,203, 57, 29, 15,169,240,136, 73,132,195, 42, 65, 37, 4,237,110,155,193,224,148,163,195, 61,180,114, 52,151, 91,
-180,187, 45,118, 75, 73, 89, 12,126,245,238,252,204,201, 88,188,152,170,244, 57,211,152,243,227, 51, 91, 91,121,138,124,196, 47,
-222,251, 33,119,239,124,198,229, 43,151,136,226,132,202, 74,118,247,158, 49,202, 38,164,173, 22,171, 43,171,100,163, 33,163,222,
- 41, 23,182, 46,210, 93,187,192,243,253, 67, 58,205,152, 43, 23, 47, 16, 74, 11,213,152,165, 36, 96,119,247, 0,235,250,188,241,
-214,155, 52, 90, 45,172,117, 68,113,196,209,225, 9, 56, 71,146, 68,196, 81, 72, 24,199, 52, 26, 41,197,100, 76, 26, 74,138, 60,
- 7,103, 72,226,144,235,215,174,121,114, 83,145, 19, 5,138,108,212, 67,235, 0, 97, 43, 4,142, 44,203,232, 46,117,177, 78,240,
-124,255,128, 36,142,184,120,249, 34,195,222, 9, 81,148,178,188,178,130,117,142, 86,167,203,181, 27, 55,249,171,191,248,119,148,
-197,132, 86,187, 77,254,188, 32,203, 11,110, 94,191, 74,103,105,149,160,145, 80,101, 99, 79, 60, 19, 62, 97, 48,136, 82,132,130,
-170,202, 17, 82, 51,232, 15, 72,148, 66,100, 25, 50, 10,177,149, 69, 37, 17, 73, 35,101,121,165, 75, 20, 5, 52,210,152,178, 40,
- 88,238, 52,176, 56, 14, 79, 6,140,243,130,141,181, 53, 2, 21, 34,180, 35,159,140,233,198, 77,156, 21,168, 40, 36,108, 8,168,
- 10,130, 34,163,152, 76, 88,106,183, 24, 13,250, 12, 78, 79, 72, 67,141, 41, 27,200, 88, 82,228, 37, 86,106,164,142, 48, 69, 73,
-160,106,145,106,160,208,173, 38,167,123, 71,148, 90,179,122,229, 42, 54,159,160,142,246,185,120,233, 2,171, 43,203, 60, 59,221,
- 70, 1, 74, 43,242,162, 34,142, 21, 85, 29,233,156, 57, 75, 36, 5,165, 53,232, 64, 81,225,188, 22,160,128, 68, 10,148,147,228,
- 88,246,134,134, 79, 30, 13,248,226,141,200, 59, 35,148, 65, 41, 79,217,242,151,126, 89,139,178,228,220, 98, 59,203, 26,156,107,
-132,130, 40,156, 9,185, 2, 25,162,133, 67, 11,175, 88,199, 85,179,113,168, 18, 16,135,154, 64,123,171,145, 79, 29,147,168, 0,
-148,118, 62,107, 93,129,172,187,107,111,113,211, 80, 3, 89,230,250,158, 26,111, 59, 77, 71, 67, 32,241,194,192,191,249,171,239,
-113,116, 48,161,209,232,250, 36, 59,103,152,100, 19, 15,183, 17,138, 70,171,193,202,198, 58,135, 7, 71,188,254,198,235, 28, 31,
-246,106, 6,187, 69, 7, 33,147,194,160,162,128,172,204,209, 90, 81,148, 37, 73,167, 77,212,105,163,194, 16, 91, 86, 53,217, 77,
- 82, 77, 11,113,253, 50, 8,245, 44,197,110,234, 80,177,245, 30, 70, 27,139,214,138, 56, 8,192, 57,116, 37,107,141,154,156,119,
-136,117,234,154, 84, 26,165,213, 76,193,173,180,242,123,250,217,200,219,205,252,247,240, 43,164, 46, 78, 39,200, 11, 32, 26,225,
-206,174,114, 95, 54,249,155, 9,216,236, 66,136,203,172,171, 92, 24,199,187,249,132,112,234,103,119,214, 97,141, 31,149,207,103,
-246, 94,235, 83,115,123,153, 99,225,235,143,159, 9,224,108,237, 18, 48,184, 90, 4,103,173,127,221, 84,181, 14,200,120,164,171,
- 53,254,117, 83,143,226, 49,149,183, 87,138,249,130, 97,102, 29,159, 77, 4,188,232, 50,208,146, 32,144,196,129, 95, 7,133,245,
- 1, 85,171,250, 1,231,189,110,231,130, 91, 22, 81,180, 51,117,252,124, 76,255,226,251,120,233, 56,229,204,222,194,186,153,183,
-206,185, 95,214,113,139,115, 19,130, 23, 71,239,191,108,143,207,185,132,175,222,160,207,234,198, 6,247, 62,253, 0, 97, 75,150,
-210,136,103, 59,199,156,158, 14, 56, 26,101,184,241,152, 36,214, 28,239, 63, 33, 82,150,195,253, 61, 86,150, 55,216,218,186,130,
- 17,142,131,221, 93,150,151,154,228,227, 1,182, 52,228,249,132,102, 43,198,153,156, 72,107,164, 80,100,147, 18,165, 75,126,254,
-139,159,243,238, 23,223,225,253, 79,238,226, 84, 74,233, 34, 94,187,241, 14,223,249,238, 95,176,188,186,238,125,194,195, 19,254,
-244, 79,254, 49,159,222,187,203,221,187,159,113,243,214, 13,142, 15,143, 16,198,241,181,175,126,149,247,222,251,126,125, 0, 18,
- 8, 97, 48,206,114,237,250, 85, 94,127,253, 54,166, 42,216,125,246,196, 23, 21, 1,227,209, 8, 41, 99, 34,173,104,198, 17,119,
-142,246,161, 97, 57, 25,141, 40, 17, 8, 21, 34,176, 88,109,145, 56,222,184,253, 26,189,195, 67,242,193,128, 73,191,135,106, 4,
- 68,233, 50,102, 80,242, 63,218,127,103, 60,157,162,142,228,180,152, 34,103, 50,236,129,201,201,199, 3, 86, 87,186,180, 91, 75,
-220,123,188,195,127,245,255,254,255,178,186,177,206,210, 82,135,241,176,207,209,222,115, 94,187,253, 26,197,168,143,201,199, 28,
- 12,142,233,247,142,105, 55,155, 68, 58, 32,142, 67,154,169,230,217,179,231,140,122,171,104, 81,177,191,127,232,199,147, 66,144,
- 38, 1, 75,157, 22, 97, 26, 18,198, 33, 91,155,107,216, 34,231,244, 96,159, 65, 85, 80, 20, 5,217,100,140, 14, 34,111,253, 75,
- 98,122, 7,187,132, 90, 18, 53,218, 56,103,104, 70, 33,121,158,209, 59,173,104,180,218, 52,219, 13,162, 32, 64, 58,203,250,234,
- 42,237, 86,147,141,245, 85,126,244,163, 31,115,218,239, 35,181,230,246, 27, 95, 96, 50,158,112,229,218, 85,138,178, 32,155,140,
-120,248,248, 17,113,160,216, 92, 95, 65, 43,137, 51,150, 48, 72,137,210, 6, 58, 12, 60, 88, 40, 9, 65,104, 68, 24, 81, 77, 38,
-152,178,244, 57,227, 85,137, 16, 41, 42,212, 52, 59, 77,162, 72, 83,100, 99, 6,167,199, 76, 38, 57, 78, 64,119,105,141, 70,179,
- 69,220, 88, 34, 76, 26, 68, 74,209,172, 42,191,134,146, 33,194,121,191,178, 19, 80, 85, 21, 75, 75, 93,218,141,148,245,213, 85,
-134,131, 1,163, 81,143,124, 28, 83, 21, 3,116, 16,208,236, 46, 81, 21, 19,164,138,177,147, 9,227,211, 99,100, 28, 17,183, 90,
- 52, 86, 87,232, 92,104, 32,157,162, 28,156,178, 30, 74,222,253,242,187,124,251,135, 63,229,254,147,231,148,214,160, 48,116,219,
- 41,121,158, 97, 45, 4, 90, 83, 9, 5,198, 32,169, 72, 67,141, 82, 6,172, 67, 75, 69,130, 32,197,171,226,157, 20,236, 13, 12,
- 15,183,143,185,125,125,131, 64, 43, 74, 81,162,107,151,132,146, 26, 91, 11,225,165,208,179, 73,228,244,129, 39,149,170, 65, 44,
-114,150,235, 29, 77, 17,187,210,214,241,208,166, 78,127, 51, 4,181,194, 56,168,173, 70, 74, 75,212, 20,129, 26, 42, 84, 52,199,
- 23,187,233, 46, 88,168,218, 70, 55,207, 6,151,106,161,219,172,139,135, 34,228,199, 63,252, 41,159,252,252, 51, 46,223,120, 19,
-173, 67,140, 53,104, 21, 80, 26, 67, 81, 20, 4, 58,194, 58,207, 8, 88,221, 88, 99,231,249, 62, 50, 10,104,116,218, 76,178,156,
-142,246,145,169, 42,140,252,193, 70, 43,168, 12,173,165, 37,226,102,115,182,151,158,238,203,167, 5, 93,107,133, 49, 10,231,206,
- 22,245,169,247, 31, 32,212, 22, 27, 42,112, 26, 33, 29,101, 41,124,138,155,131,160, 70, 55,107,223, 37,122,237,192, 84,228,166,
- 68,173, 13,154, 22, 77,137,116, 11, 45,177,251,149,182,121,231,180, 83, 98,158, 11,242, 42, 1,239, 34, 94,125,241, 99, 22, 10,
-250,226, 78,125,246,117,236,180,203,174, 85,230,214, 46,152,227,170, 90,175, 1, 78,201, 51,121,238,211,251,202,213,170,118,107,
-231, 47,125,241,174, 51,233,205,124,252, 62, 45,254,211, 3,128,173, 42, 31,172,229, 92,205, 8,240,135,186,153,133,109,161, 83,
-151,194,239,208,163, 80, 19,133,190,160,123, 27,164, 69, 75,229,247, 80,194, 45,176,221, 95, 24,193,159,229,175,207, 10,171,112,
- 47,121,255,203,133,115,179, 95, 94,248,157,150,125, 73,170,205,175,134, 2, 20,159,187,199,255,124, 60,169,227,248,228,132,141,
-245, 53,150,150,151, 57, 26,247, 24,244,251,184,178,226,233,211,167, 92,188,113, 19, 57,238,115,180,179, 67, 18, 8,118,119,247,
- 89,187,113,139, 52, 89,226,232,232,152,225,120, 88, 51,152, 53,141, 70, 76,145,229, 8,153,226,180, 38,155, 12,104,164, 41, 17,
-146, 70,107,133,206,114,131,189,131,231,108,239, 60,225,237, 47,189,201,103,247,247, 24, 77, 44, 65,212,226,194,229,155,252,232,
-199,239,113,249,194, 69,108,105,185,119,247, 30,203, 27,235,124,252,201, 71,188,246,250, 27,180, 90, 45,180, 84, 28, 28,236, 49,
- 24,143,177, 66,205, 84,156, 73, 24,114, 97,115,131,245,245, 53,142, 14,247,201,179, 33, 96,105, 53,154, 40, 29,162,133, 36,141,
- 35,178, 81,159, 34,207,232,219,146, 18,225,243,147,157, 66, 56, 9,210, 17,201,144,119,223,122,155, 39,247, 31, 64, 94,160,172,
-165,119,114, 76,107,181, 69, 85,169,255, 17,107,186, 59, 23,147,235, 61, 27, 85, 89, 96,138,140,229, 78,147,241,112,192,221,207,
-238, 16, 4, 17,221,181, 13,222,184,125,145, 91, 55,174,114,122,116, 72, 43,142,184,245,181, 95,163, 28,157,112,120,124,204,112,
- 52,162,179,212, 37,138, 66,186,203,171,140, 70, 19, 6,217,144, 70, 34,104, 54, 36,167,199,207,201,198, 94,188, 37,144, 44, 45,
- 45, 17, 71,138, 36,242, 17,187, 23, 46,110,250,241,160,176,116,154, 41,154,138,209,200,213, 99,232, 33,253, 94,143,178,213,160,
-202, 39,148, 74, 98,138, 28, 99, 32,105, 52, 88,219,220,100,239,240,128,113, 54,161,217,110, 1,117,231, 34, 5,101,145,209,110,
- 54,121,231,157,183,249,203,111,126, 11, 7,108, 93,184,194,165,102,147, 50,159,208, 78, 26, 44,119, 90, 44,183, 19,132,205,137,
-146,148,188,168,216, 63, 56,226,194,133, 54, 82, 5, 53,198, 83, 80,148, 57, 89, 89, 16, 42, 77,163,219,229,232,249, 14,227,241,
-152,102,183,227,225, 19,105, 2,161, 66,137,136,245,181,101, 26, 73,130,177,130,135,219, 79,107,205, 72, 74, 86, 90,140,203, 16,
- 66, 33, 3, 77,216,236, 80, 21, 69,141,133,246,150,174, 48, 12,200,179, 9, 85, 94, 96, 77, 69,187,149, 34,241,135, 15, 29, 8,
- 4,113,205, 54, 87,184, 42,247, 52, 44, 99,137,163, 16, 25,197,158,103,174, 67,108,233,208,205, 38,101, 57,225,181, 55, 94,231,
-143,255,254,127,194,227,103,207,153, 20, 57,217, 96,136,150,146,147,145, 37,210,202,199, 10,215,158,237, 73, 81, 17, 42,233, 5,
-110,206,163, 94, 35, 33,104, 82, 50,169, 28,198, 73, 10, 17,112,114,154,243,248,241, 1,183,111,111,160,165,166, 50, 22, 37, 42,
-180,170,230,129, 82,138, 89,118, 4,117,242,159, 80,218,119,213,117,140,171, 20,222, 70,148, 68, 1, 97, 32,102, 22, 44, 91,149,
-216,170, 32, 84,130, 40,208,190, 43, 85, 18, 33,157, 47,234,161, 70, 69, 33, 50, 8, 9,227, 8,165, 3,175,115,145,129, 15,131,
- 49,245, 10, 75, 56,132,174,169,138,178,206,195,168,167, 5,223,251,206,119,217,254,236, 9, 43,157, 53,191,105,214,146, 64, 11,
-138, 34, 35,138, 21,166, 42,145,194, 34,177,228,121,134,142, 19, 54, 46,109,209, 27,222,247, 59,116,173, 9,164, 36, 74, 82,138,
- 40,242,142, 38, 28, 42,208,164,205, 38,141, 78, 27,165,213, 12,160, 98, 42,223,177, 7,129,158,121,158,167,215,233,233, 30,119,
-218, 25, 2,136,208,250,162,239,141,110, 72, 41,252, 72,185,182, 27, 6,129,158, 69,171,106,173,231, 35,254, 26, 7, 45,101,125,
-128,177,158,243,143,112, 51,110,191,120,229,220,238, 92,193, 22,231,220, 86,191,132,147,113,102,135,254,194, 40,158,179,227,251,
-105,188,233, 66,109,242,138,116, 59,223, 18,224,237,104,194,152,179, 2, 54,103,107, 66,225, 52, 80,104, 94,224,103, 35,246,170,
-238,198,157,183,223,250, 32,156,233, 1,162,222,151, 91, 51,155, 44, 76,187,123, 83, 25,202,178,162, 44, 61,234, 91,214,194, 56,
-165, 60,220, 39,172,221, 5,186,190,175, 45,248,157,186, 82,117, 84,229,185, 52,180,105,152,188, 88,160,206,157, 9,116, 65,156,
-217,113,139,115,129, 47,139, 59,245,133,251,205,175,134,237, 43,196, 87,231,146,217,120, 9, 32,224,243,199,237,226,115, 14, 5,
-150, 44, 27, 99,170,138,141,205, 75,140,135, 3,134,123,143,145, 85,197,253,247,127,206,141,127,254, 95,240,248,199,223, 69,217,
-146,201,160,226,242,230, 21,158, 29,157,242,251,191,243, 5, 6,123, 59, 24,161,176, 74, 82,149, 21,191,241, 27, 95,229,199,127,
-251,183, 20,165, 38,140,187, 60,127,254,140,180,153, 66, 81, 50,113, 6, 55, 24,243,133,119,191,198,183,255,230,219,228, 54,224,
-214,213, 27, 60,124,178,199,247,190,253,151,124,229,203, 95,230,218,230, 22,191,248,233, 79,249,254,253, 31, 48, 44, 11, 38, 31,
- 58,214,183, 46,210, 94, 90, 38, 27, 13,121,253,141, 91,124,231,187,127, 67, 97, 42,156, 12,144,194, 17,227,184,208,214,132,118,
- 66,163,217,224, 47,191,245, 77,160, 68, 41,197,106, 51, 38, 10, 91, 44, 95,121,147,183,222,126,135,163,199, 63, 33,112,134, 97,
-169, 57, 24, 89,223, 57,184,137, 23, 5,161,105, 54, 86,184,178,117,137,111,125,247,187,140,178,138, 50, 47, 56,234,245,105,244,
-115, 8,194, 87, 90, 14,207,167,172,189,188, 76,251, 7,166, 16,226,172, 40, 67,204,189,163, 78,204, 87,105, 30, 50,226,234, 68,
- 56, 67, 41, 36,147,170, 64,138,130, 86, 8,187, 39, 37, 59, 7, 19,108,163,100,101,228,248, 79,255,201, 63,102,127,239,144,205,
-110,151,110,224,120,244,240, 83,170,162,226,163, 15, 62,228,245, 47,125,137,214,114, 23,161, 3,138,170,226,249,147, 39,236,237,
- 60,165,172,134, 52,147, 38,101, 54,164,223,239, 49,153,100, 68,113, 64,105, 70,116,219, 93,148,150, 52, 26, 77, 66, 29, 80,102,
- 57,161,116, 88, 81, 34,165, 33, 73, 19,116, 20,114,114,122,194,209,209,152,103,207, 78, 88, 89, 90, 66, 10,193,225,241,177,191,
-167, 78, 14,168,170, 9,203,171,235,148,198, 17, 41, 77, 49,201, 24, 22, 5,194,149, 52,211,136, 64, 24, 54, 55,214,120,243,157,
-183,105,180,187, 4, 74,248,209,120,183, 77, 40, 21, 39, 71,123, 28, 29,101,172,175, 47, 17,167, 77,116, 36, 8,123, 19,146,102,
-138, 19,206,223, 71,214,121, 79,191, 41, 40,198, 67,172,131,102,218,100,111,255, 57, 81, 18,250, 46,169,118,213,234, 32, 36,105,
- 47, 97,117,202,157,187, 15, 24,151, 22,113, 58, 32, 31,246, 88, 95, 95,161,213,110,249, 61,106, 33,169,202, 33, 65, 20, 67,145,
-205, 46, 46, 90, 75, 38,101,238,247,250,166,100,146, 21, 68, 73,131, 70,163,225, 71,214,129,166, 48, 37,142, 18, 33,193,102, 37,
- 70,104,143,113, 45,114,100,172, 16,174,162,154,140,253, 78, 85,105, 26,145,228,183,191,242, 69,182,239,127,131,239,252,228,167,
- 28, 71, 13,238, 62,126,142,171, 28, 65, 40,176,174,196, 73, 65,133,100, 82,130,116,190,219,141,235,136,222,208, 65, 44, 36, 90,
- 24, 63,213,145, 96,156,228,228, 56,231,254,103,123,188,254,198,229,217,184,183, 40, 74, 63,221,192,161,148,239,126, 28, 21, 74,
-106, 28, 83, 69,181,158,221,148,210,132,113, 76, 16,121, 59,150,214,194, 19,230,130, 8,103, 42,148,112,168, 58,164, 68, 43,233,
-139,172,242,221,186,212,254,254, 86, 58, 64, 41,141, 12, 66,111,205,180,162, 86, 77, 27,112, 22, 77,224,239, 43,107,124,234, 89,
-169,249,214,191,249, 75,158,109, 63,163, 42, 43,111, 75,139, 99,132,130, 48,116, 4,202,122, 70, 62,126,228,235,108, 70,158,157,
- 82,212,161, 45, 91,151, 47,251,180,180,201, 24, 81,228,126,191,173, 21, 42,138, 16,194, 55, 31, 81,146, 16, 52, 18,207, 33,176,
- 32,148,243,170,244,170,196, 24, 73, 16, 8,140,149,216,186, 83,159, 42,175,167, 93,171,176,142, 50,112, 4,198,167, 6,218, 0,
- 16, 21,202,213,121, 12, 90, 17,199,154, 32,210,168, 80, 35,181,242,254,117,165,208, 82,207,133,110,202, 59, 18, 28,198, 63,249,
-235, 28, 10, 87,139, 5,221,180,177,156, 1, 92, 22, 65, 50,115,197,187,199, 65,251,245,197, 92,144,187,192, 63,153,142,210, 63,
- 71,232,235, 22, 97, 94,204,196, 70, 94,241,110,124, 81,157,171,225,109,221, 57,251,238, 27,165,230,215,190,105, 30,186,173, 11,
-120, 93,212,167,227,120,103,189, 78,196,204,186,246,106,238, 75,159,213,197,233, 46,222,107,104,166, 24,227,178,244,220,130,162,
- 44,168, 42,131, 53,254,194,169,132, 32,144,117,184,149,146, 53, 90,121,154,154,103,209,211, 4,172,105, 16,139, 60,211, 9,187,
-217, 73,242,124, 55,254,170,226,122,230, 64, 48,165,243,188,160, 12,116, 24,241,162,192,225,151, 41,233,207,203,229, 95,222,217,
-203,207,107,215,177,206,210,239,247,216,220,218,226,206,103, 31,209,233,164, 28, 29,159, 34, 38, 67,142,159,239,178,178,117,137,
-222,211,156,178, 24,242,224,209, 93,190,254,141,223,224,223,254,187,127,203,229,213, 54,175,191,241, 22,185,117,252,248,189,247,
- 48,227, 83,146, 52,101,103,127,192,229,173, 46,110,251, 33,215,111,221,224,227,207, 62,101, 69, 71, 60,122,246,140, 48, 10,249,
-173,223,248, 45,190,255,227,247, 72,219, 75, 4,161, 96, 99, 99,137, 15, 63,126,159, 48,138,120,227, 75, 95,226,234,228, 54,255,
-250,207,255, 45, 34,140,144, 74,113,249,242, 21,170,108,194,112, 52,228,241,211,109,255,112, 51,149,239, 10, 2, 72,219, 29, 54,
-183, 46,210, 59,220,227,195,247,126,232,189,182, 65, 64, 86,248,189,239,218,202, 26, 23,183,214,249,222, 15, 31,211,108,182, 56,
- 58,238, 51, 41,188,151, 91, 42,229,195, 23,132,230,242,214, 37, 92, 89,242,116,251, 49,206, 24,142,123,167,132,105,130, 83,129,
- 63,113,202, 23, 73, 77,127,215, 29,251,223, 57,236, 5,137, 53, 26,167, 3, 90,237, 85, 86,215, 55, 24, 31, 62, 71, 9, 63,134,
-106,183,219,252,175,254,203,255, 5, 7, 39, 71,236,237,237,161, 75,195, 68,150,172, 92,190,232, 61,248, 31,191, 79, 26,133,168,
-178,226,100,255,136,157,103, 59,228,121, 65,137, 97,255,176,199,104,180,207, 91,239,124, 25,169, 29, 90,197, 60,120,120,151, 94,
-239,152, 27, 55,110,176, 62,206,184,114,237, 58,227,193,169, 23,230, 37, 49,101, 85, 49,201, 11,130, 48, 37,212,154,238,242, 18,
-131,225,128,143,159,125,204, 27,111,190,197,201,225, 17,130,146, 60,243,225, 29,206, 20,140, 71, 67,210,102,155,170, 44, 9,116,
- 64,101,124,135, 55, 49, 25,205, 36, 70, 40,205,213,203, 87,216, 61, 60,166,202,114, 2, 41,209,210,210,109, 55,217, 92,189,205,
-227,237, 71,236, 31,157,130,142, 41, 10,195,112, 60,102,146,101,180, 91, 13,239, 41,119, 37,224,136,181, 36,136, 3,202, 73,142,
- 84,138,110,167, 67, 62,153,248,145, 92,146, 82,230, 57,147,241, 24, 99,125,108,107,167,219,225,227, 79, 62, 37,137, 3, 86, 91,
- 9,161, 22, 52,210,168, 22,116,105, 63, 10,204,199,148,166, 36, 12, 67,172, 49, 68, 65,200, 68, 7, 12, 70,125, 78,143, 79,102,
-196,191, 34,175,232,245,188, 37,112,101,181,203, 36,203,144, 74, 32,195,168,102,248,199, 84,101,142, 49,134, 32, 44,145,166, 36,
- 27, 78,136,116,200,120,216,167,219, 72,248,189,223,248, 42,159,222,187,203, 94,111,215,167,166,105, 77,110, 44,129,246,187,103,
- 21, 4, 12, 70, 5, 50, 47, 73,147,128,202, 81, 79, 20, 65, 11,133, 42,203,218,210,104,189,167, 94, 8,134,131,156, 59,119, 30,
-115,235,245,139,168, 78,138,196, 33,170,186, 43, 52, 10, 53,219, 41,218,218,255,124, 14, 67, 42, 61,110, 88,232, 0,166, 59, 97,
- 41, 61,181,218,122, 92,114, 16, 42,130,200, 31,158, 4,198,135, 86,105,233, 19,215,116, 0,210,239,208,125,196,149,170, 3,178,
- 36, 86, 75,191, 57,151,245, 58,210, 56,242,113,193,119,190,249, 61, 30,124,246,128,165,165,101, 78, 38, 39,116,155, 77,164, 82,
- 32, 28,113, 18, 19, 7,138,209, 48,163,172, 74,162, 72, 80,153,130,170,200, 17,132,228,185, 97,115,115,195,187, 28, 76,197,201,
-225, 1, 54,109, 16, 8, 8,194, 16, 35, 36, 75,107, 27,132,113, 74, 18,167, 62,143, 93,131,118, 14, 91, 85,232, 64,215, 66, 45,
- 77, 96,173, 95,111,219,243, 69,125,174, 61,176,198, 98,172, 47,129, 74,121, 29,150, 87,185, 75,162, 56, 36,140,130, 89, 32,211,
-153, 40,229,250,235,205,174, 35,117, 77,152, 22,233, 69,102,165,157,238,219,103,188,254,179,234,181,122,142, 92,167,112, 58,102,
-108,153, 90, 51,229,234, 3,193,249, 14,253,252,203,105,227, 56, 21,203,205,225, 49,117, 71,111,234, 34,237,103,240,224,132,183,
-177,213,157,185, 96,161,168, 79,109,112,214,226,168,139,117, 77,128,243,205,123, 45,144,155,146, 11,207,216,191, 22,166,221,162,
-190, 63, 42, 63,197, 48,198,213,177,170,149,135, 18,213, 63,231,212, 94, 57, 69,243,158,229,223,131,122,243,230,133, 63,155, 70,
-240,169, 26,166, 47,165, 64, 77,233, 93, 11,190,197, 23,111,204, 62,254,252, 77,212, 24,208,249,219, 83,116,171, 59, 35,196,155,
-130,253, 95,245,117, 94,122,171,127, 41, 89,139, 34,149, 60,247,115, 75,249,138,207,245, 15, 70, 91, 26,110,222,184,198,100,212,
-167, 42, 38, 20,227, 49, 85, 97,121,178,179,195, 63,250,167,255,132,163,163, 62,150, 10, 25, 57,250,187,187,188,245,214,219,244,
-250,167,188,113,235, 38,131,254,128,195,253,125,191,187, 8, 34, 6,147,130,168,145, 34, 48,108,110,172,147,229, 19,168, 12, 73,
- 18, 51, 30,141, 25, 14, 71, 92,121,227, 77,190,253,183,223,103, 56, 30,177,187,183,203,179,221,231, 4,113,204, 32, 47, 40,138,
-138,253,103, 79, 89, 89, 93,227,247,127,239, 15,216,126,244,152,229,165, 46, 63,250,201,143,216, 63, 58,172, 31,222, 62, 72,192,
- 57,201,149,155,111,241,238,151,191,198,221,247,127,198,253, 79, 63,172,179,181, 59, 44,173,108,209, 93,222,228,250,245, 27,164,
- 50, 99,231,206,207,112, 2,182,247, 78, 56, 26,229, 84, 40,148, 10, 60,119,221, 41,254,248,143,254, 1,235,237, 22,191,248,209,
-247,232, 31,237,209, 72, 99, 54,175, 94,160, 16, 14, 35,167, 84,191, 87,163, 24,127, 85, 6,243,203, 14,123, 82,202, 25,243, 61,
-168, 73,114, 62,146, 49, 68,171,132, 80, 37,104,169,232, 52, 99,122,167,135,228, 85,198,112,148,241,238, 59,111,242,246, 27,215,
- 57, 62, 62,102, 52,169,232, 52, 27,188,253,133,215, 81,105,155, 94, 54, 33,203, 38,252,252,199, 63,227,224,201, 30, 79,238,111,
-115,124,124,196,254,233, 9, 63,250,249, 7,124,240,201, 35,194,184,197,181,171, 55,216,222,126,194,100, 52,166,221,106,147,198,
- 9, 58, 12,177,166,164,119,124, 72, 39,137, 48,197, 4,172,101, 82,148, 20,149,143,171,117,245,147,108, 48, 24,179,186,178,202,
-234,202,106, 61,217,242,163, 89, 83,228,100,147, 17,166, 42, 57,216,219,101,121,169,131,198, 32,108,129, 51, 5,189,147, 99,198,
-163, 9,167, 39, 3, 70,227, 9,161, 10, 81, 86,144,143,135, 30, 33, 42, 43,130, 64,209, 93, 94,162, 40, 13,214,121, 81,206,227,
-199,219,148,121, 81,163, 55,149, 15, 66, 81, 2, 41, 44, 90,122,223,111, 62,201, 16,206, 81,228, 5,195,225,152, 80,107,146, 36,
-161, 42, 75, 78, 79, 78, 24, 14, 6,116, 90, 77, 6,253, 30,119, 62,249,152,110,171, 53,139,193, 76,210,184,190, 64,123, 60,104,
- 89,100,184,170, 68, 74, 73, 81, 20,196, 81,138, 67,178,253,228, 41,205,102,131, 80, 9,108,229,161, 25, 30,215, 6,113, 24, 35,
-145, 32, 52, 73,167, 51, 27, 65,122, 75,167, 65, 84, 21,186,102, 83, 7, 58,100,116,124, 76,163, 17,115,229,218,101,126,241,139,
- 15, 72,162, 8, 33, 4,163,225,164, 30,107,107,162,200,199,140, 22,198, 17,134,186,198,180, 8, 10,107, 40,149,100,108, 45,133,
-241,240,152,166, 0,141, 35,210, 14,132,161, 55,236,147,164, 1, 73, 20,214,141,138,143,147,152, 61, 6, 37,245,158, 87,121,109,
- 66, 93, 44,148, 86, 4,181,216,107,102,197, 82,218,171,210,103,163,105,129,172,223,175,117,128, 10, 2,132,146, 62, 56, 37,136,
-144, 58,192, 9, 89,103,146,187, 25, 53,108,166, 51,114, 2, 87, 9, 6,253,140,127,251,175,255, 45, 71,123, 39,152,202, 17,167,
- 77, 42,231, 72, 27, 13,100, 16, 32, 48, 52, 27, 1,221,110,147,178,200, 40,202,140, 32, 84, 68, 73,236,109,106, 81,204,104,156,
-147, 54,218,180, 90,109,112,142,126,175, 71,149, 77, 8,149,100,208,239,209, 27, 14,217,184,124,149,205,107,215,136, 91,157,250,
- 0,195, 76,173,205,180,147,156, 22,195,218, 23,174, 85,157,138, 40,228, 66, 64,150, 56, 67, 76,147,210, 79, 4,124,110, 67, 64,
- 28,249, 64,166,121, 40, 83, 80,167, 40,250,251, 80,200, 5,255,182, 57,227, 23,171,193, 44,246, 44,164,170,126, 60, 82, 11,239,
-164,242,180,180, 89,120, 87, 93,232, 93,109, 57,116,181, 45,208, 57,139, 39,162,219, 58,179,194,206, 59,113,225, 22, 90,249,154,
- 20,231,252, 4,197, 85, 21,182,242,246, 50, 83, 21, 24, 83,249, 48, 31, 83,205,187,254,122,154,232,191, 76,253,115,215, 36, 66,
-166,163,115,103,112,174,154,117,238, 56,131,168,247,235,206, 26,172, 55, 23,215,117,208,205,114, 74,196, 2,201,206, 24, 40, 75,
- 67,158, 87,140,179,156, 73, 94, 80, 84,134,178,242, 95, 83, 74, 49,187,223,163, 48, 34, 8, 2, 63, 29, 81, 26,132,168, 59,117,
- 41, 17,142,153,144,100,126, 1,118,204,115,234,231, 34,186,197,208,122,113,174,115, 94, 28,157,191,176, 83,151,206,143,221, 61,
- 97,246,156,117,109,126,210, 16,139, 10,188, 23, 44,115,188, 52,153,231,151, 9,229,234, 24, 39,172,117,228,101, 73,111, 48,224,
-214,237,155, 28,239, 63,103,107,179,205,157,207,142,152,100,123,252,205, 95,125,155,215,222,122,135,159,253,100,159,173,205,117,
-118,239, 63,162,215,235,241,149, 95,251, 26,219, 79,182,249,228,147,187, 36, 81,200, 59, 95,252, 18,223,250,171,191, 97,121,125,
-139,201,100,194,175,255,238,239,241,173,111,126,139,110,156, 50,210, 57,178, 84,196,237, 22,187, 7, 7,116,175,104, 58, 75, 43,
-252,233,159,252, 3,222,255,233,123, 12,122, 61,134, 69, 70, 20,199,252,224,111,191, 79,138,228,205,155,175,241,239,255,221,159,
-115,249,210,101,242, 44,227,209,227,199, 51,239,130,178, 22,229,192, 56, 65,165, 82,158, 60,219,231,238, 71, 63, 39, 31, 13, 17,
- 66, 33, 80,100,149, 36, 76,219,164,129,100,231,222, 71,228,147, 17,174,217,101,156, 59, 74, 35,137,226,200,147,176, 84, 64,148,
-180,248,202,187, 95,226,206,251,191,192, 20, 25, 97, 20,176,117,121,139,220, 21,160, 37,214,189,156,233,240, 31,210,169,255, 50,
-208,208,153, 39, 50, 6, 39, 11, 63, 6, 68,209,236, 94,160,187,113,141,231,251, 71,188,245,198, 5, 26,137,162,127,124,204, 74,
-167,139, 8, 74, 78, 15,159,240, 23,255,230,125,210,181, 11,220,127,126,204,251, 31,126,200,241,193, 49,163, 65,129,181,158, 87,
-221,207,114,194, 56, 98,148, 87,188,245,238, 87,217,188,180,197,104,120,204,206,227,135, 72,155, 82,230, 25,207,247,119,137, 34,
-205,214,234, 18,189,131,103, 68,113,236, 45, 91, 50,196,212,207, 50,169, 3,170,202, 80,228, 5, 27, 27,107, 20,121,134,192,146,
-132, 1, 97,183,141, 45, 51,158,237, 28,112,176,191, 75,150,231,104, 5,171, 43, 43, 28, 31, 30,242,108,103,135, 40,136, 88, 90,
- 93,167,189,180, 66, 94, 9,174, 94,187, 73,183,217,196,149, 21,249,120,200, 36,180,132,161,162, 25, 46,211,108,117,233, 44,175,
- 32,165,226,228,232,136, 7,247,238, 50, 25,246, 88, 91,233,210,105, 37,190,192, 7,190,179,212, 82, 98,157, 79,239, 75,226, 4,
- 55,158, 48, 25, 13, 81, 74, 16,169,128,149, 78,155,202, 24,130, 72,241,165,183,223,224,224,249, 14,219, 79,119,136,211,152,188,
-240, 99,189, 48,244,207,125,107, 12,178, 22,238, 20,165, 69, 72, 69, 86, 11,216, 42, 43,208, 97, 68,212, 8,235, 52,192, 0, 81,
-227, 69,199,185,247,238, 98, 11,170,163, 67,226, 52,241,177, 67, 14,162, 40,194,150, 21,121, 94,161,162,148,236,100, 56, 75, 78,
-188,121,229, 2,255,252, 79,255, 17,255,135,255,243,255,157, 72, 9,100,160, 25,100, 21, 86, 24,116, 85, 98, 37, 84, 22,198,149,
- 87, 32, 43,169, 61,174,213, 26,130, 58,182,179,172,163, 54,168,119,141,129, 6, 41, 45, 79,158, 62,199,150, 5,155,171, 43, 30,
-121,106, 12, 66, 58,164,116,216, 74,160,116,133,160, 66,184,170,110, 4, 37,206, 84, 20,121,129,214,194, 31, 36, 42,227,187,230,
-133, 0, 19,107, 61,239,161, 50,118,238,111, 87,178, 46, 58, 1, 66,250, 29,181, 43,202, 5,145, 85,221, 12, 90,143, 55,222,223,
- 57,224, 7,223,253, 49,195,147, 9,101,105,145, 50, 96,146,231,232, 48,194, 8,137,194, 18,134, 1,163,201,132,110, 55,246,143,
-223,113,189,218,178, 21, 56,141,173, 74, 58,173,148,253,253,103,220,190,253, 22,105,154, 50,122, 56, 32,114, 21, 89,239,148, 56,
- 12, 81,105, 74, 99,109,133,180,187, 68, 24,198,148,166,168,119,217, 22, 93, 25,156,209, 88,109, 48, 65, 80,219, 73, 61, 80,102,
- 54,173,181,182, 94, 31,248, 78, 52, 8,106, 49,157,172,119,198,181,123, 65, 43, 53,235,208, 61, 18,118,158,153,238,167,192,243,
- 48,146,233, 56,123,122,144, 16, 47,185,166, 76,213,241,214, 58,168, 12, 86, 25,132,177,160,106,225,162,240,149,103,198, 81,183,
-231,186,243, 26, 97,107,207, 67,173, 22,246,231,114,166,211,171, 5,109,166,170, 33, 48, 37,212, 93,186, 47,214,211,172,120, 47,
-204,196, 10,132,171, 94, 16, 2, 76,149,246, 82,184,249, 4, 1, 87, 31, 50,168, 29, 20, 83,138,157,123,193, 6,108,107, 98,157,
-169,124, 30, 73, 94, 26,138,178, 34, 47, 74, 95,204,167,171, 8, 41,106,119,129,246,135,158, 89,114,155,255,122,149,113,168,119,
-110, 93,252, 51,175,128,175,187,241,197,174, 92,248,174, 96,222,181, 79,187, 97, 81,171, 75,229, 12,232, 63,253,220,197,156,115,
-185,192,238, 21,117,136,200,226,215,153,125,173,233,235, 11, 57,187, 74,202, 51, 31,179,248, 62,113,238,227, 85,157,144,228,191,
-167,247, 74,122, 62,243,185,201,130,192,159, 26, 61,141,153,171,151, 47,113,176,255,156,195,253, 3,172,113,196, 73,200,147,237,
-103,124,245, 15,126, 15,107, 42, 78,158,238,240, 71,255,240,239,243,253, 31,254, 24, 37,180,167,139,125,122,143,215,110,223,228,
-240,168,207,133,107, 55,248,249,135, 31,113,220, 59,229,209,179,231, 92,191,113,147,193,104,194,205,215,223,228,189,247,223,231,
- 43,191,254,155, 52,218,203,116,151, 87, 57, 62, 60,100,116,114,204,224,244,132,175,127,229,215, 8,195,144,251,247, 31, 18,171,
-136,215,111,222, 98,105,109,141,222,176,207, 55,126,227, 27,252,187, 63,255,239, 25, 78,198, 51, 86,123,168,188,157,198,201,144,
-225,184,224,249,211,109,220,100, 64,127, 56,194, 74, 13, 42,160,176,154,165,118,135, 43, 43, 41, 31,255,228, 59, 72,105, 25, 91,
-205,246,254, 41,153,161, 78,101,147,132, 65,202,229,203, 55,248,227, 63,252, 67,190,253,231,255,134,227, 3,223, 85, 46, 45, 47,
-145, 59, 67,238,124,230,183, 64,254,210,162,252, 42, 59,227,231,233, 26,166,143, 47, 29,212,226,158, 96,126,170, 15, 66, 65, 16,
-120,149,179, 16, 10, 33, 21,173, 86,155,123,119,238,211,109,182,104, 45, 45,145, 70, 33,205,214, 18,107,235,235, 52, 84,201,238,
-163, 79,185,255,224, 17,255,254,175,127,206,195,231,167,216,180,201,195,163, 62, 71,121,193,216, 56,176,130, 86,146, 50,170, 74,
- 94,187,125,157,175,124,233,117, 92, 49,228,248,224, 57,195,225, 41,227,209,136,222,233, 41, 90, 10,134,189, 19,150,218, 77, 86,
-151,150,112,206, 50,153,100, 72, 44,113,160, 8,181,164,200,114, 78,143, 14,105, 38, 9,249,176,207,120,112, 90, 91,217, 38,140,
-198, 99,239,171, 14, 67,170,162,100,123,251, 17,143, 31, 61,226,112,239,128, 86,171,205,218,198, 38,198, 66, 89, 57,172, 19,252,
-226, 23,191,160,219,106,146,196, 1,214,249,139,109,218,104, 80, 25,232, 15, 38,116,218,109,170,124, 66, 18,133, 92,220,218, 98,
-127,127,151,124, 60,166,213,104, 32,149,223,167, 89,107, 41,138,114, 78,223, 18, 18,231,224,228,228, 4,132,160,172, 10,175,109,
-168, 59,162, 52,137,185,114,229, 50, 31,124,240, 49, 39, 39, 39,180,219, 77,186,157, 54,129, 14,208, 74,131, 3, 29,106, 38,131,
-190, 39, 15, 74,143, 47,213,161, 38, 77, 83, 90,173, 6, 97,172, 80,161, 34,105,196,126, 12, 29, 4, 80, 11,116, 26,205, 70, 61,
-158,207,145, 14,148, 0, 83,148,216,178,228,180,119,202,225,193, 17,166,178,100,227, 9, 65,232, 35,100,187,157, 37,126,246,179,
-143, 57, 60,233, 81, 56,193,160,240,227,201, 40, 84,228,149,161,172,179,181, 99,237,193, 39, 86,120,169, 86,233, 32, 51,254,114,
-217, 18,130, 72, 66,164, 5, 58, 0, 25,128,212,142,188,204, 49,149, 33, 73, 18, 2,173,106, 10,230, 20, 47, 90, 35,135,241,169,
- 86, 2, 63, 34,245, 96, 30, 57,215, 23,213,120,102, 95,224,204, 76, 82, 45, 22, 68, 86,162,190, 6, 89,231,144, 78,248, 90, 80,
-121,255,241,116,108,237,172,196,217,128, 59,119, 31,241,237,111,125,143,108, 82, 1,138,178,112, 88, 36,133, 49,180,187,203, 20,
- 85, 69, 28,105,154,173,148,178,204,208,218,107,129,180,242,247,103, 16,249, 24, 85, 33, 37, 81,156, 98,173, 32, 74,155,180,187,
- 75,152,170, 98,220, 59, 98, 60, 28,145, 87,150, 66, 72, 46,220,188,201,210,198, 70,237,157,159,239,111,125,135,238,139,150,152,
-118,208,178, 14,122, 82,178, 22, 99,201,133, 36, 53,113,102, 76, 44,132,168,237,106,154, 32,244,222,253,197,248,100,143,134, 85,
-245, 42, 65,212,123,103, 63,225,153,130, 89, 48,182, 30,190,219, 51, 1, 98,243, 68, 54,191, 14,145,114,138,140, 21, 11,194, 44,
- 59, 27,121, 51,227,166,251,174,216,213,246,177,233,239,231, 63,102,218, 85,219,250,230, 81,194,174,238,160,157,245, 0, 24, 87,
-249,194,110,109,181,240,241,117,218, 95, 93,203,212,116,226, 88, 95,207,212,130,213, 78, 10,255,120, 16, 44,140,242,103,106,122,
-127,208,176,118, 58, 45,153,255, 56,206, 58,140, 1, 83, 89,223,165, 23, 21,227, 73,193, 56, 47, 40, 42, 75,101,234,248,215, 41,
- 83, 65,201, 89,135,111,141,165,172, 12, 69,229,247,239,234,157,215, 46,253,153, 84,226,236, 24, 91, 76, 9,101, 98, 94,236,229,
-139, 24,193,249,120, 93,190, 80,148,117, 93,244,117, 93, 76,103, 95,179,126,125, 42,158,152,127,158, 90, 64, 21, 78,227, 54, 23,
-255, 93,204,254,205,167,119,249,226,173,228,252, 99,212,194,207,177, 88,240,167, 55, 61, 85,100, 42,141, 49,150, 70, 35,161,221,
-110,240,217,167,119,252, 88,222, 58, 26, 65,200, 47, 62,254,132,127,240,247,255, 33,207,158,236, 82, 74,193,229, 75, 23,184,123,
-127,155, 79,238,220,227,181, 27, 87, 57, 62, 62,225,233,254, 49,119, 31,110, 99,172,229,127,246, 63,255, 19,238,221,127, 64, 28,
-198,136, 80,147, 4, 49,207, 78,142,233,245, 7, 4,113,196, 79,126,242, 99,110, 92,185,204,195,123,119,185,117,235, 54,159,125,
-118,135, 79, 62,187,195,133,205, 13,222,253,210,151,184,121,235, 53,142,135, 61, 90, 75, 29, 62,249,236, 19, 30, 63,126, 92,167,
-239,120,209, 83, 20,196,232, 32,225,198,245,155,148,227, 33,161, 52, 28, 29, 31,145, 89, 7, 65,136, 14, 20, 42, 72,184,118,113,
-139, 85,157,243,244,254,135,140, 42,195,209,168,224,104,152,225,116,140,148,138, 56,140,137,194,148,223,249,157, 63,228,194,202,
- 18, 63,253,254,119, 72,162,136, 86,171,193,164,200, 16, 74, 81,214,223,247,151,133,183,252, 42,227,247,151,233, 45,206, 20,245,
- 32,152,141,145,130, 96,186,143,147,117, 88,139,196, 74,229,199,155,166,162, 21, 37,172,111,173,209,110,182, 8,162, 22,151,174,
-223,226, 23, 63,255, 17,207,158, 61,229,147, 71, 7,124,186, 51, 32, 19,146,147, 73, 78,102, 28,102, 26, 92, 3, 4, 97,194,164,
- 44,176,197,132, 47,189,113, 3, 81,142,216,219,121,194,163, 7,143,217,219, 63, 97,101,101,137,165, 78,155,118,187, 69, 85, 85,
-220,127,240,128,231,207,118,200,134, 61,170,108,132,173, 50,182, 31, 62,228,195,247,127,193,222,179,103,116, 26, 49,197,100,192,
-224,228,144,113,150,131, 10,216,220,186,192,107,111,126,129,205,205, 45, 58,221, 14, 91, 27, 27,172,174,174,177,186,190,133, 19,
-138,193, 56, 99,105,117,157,102,103,137, 48,142, 57, 58, 62,230, 39,239,253,128,188,152,144, 23, 5, 66, 40,154,173, 46, 78, 72,
- 30,111, 63,225,217,211,109, 30, 61,184,203,253,187,119, 25, 14, 6,116,219,109,174, 94,185, 66,156,196, 52, 26, 13,194, 32,164,
- 52,134,147, 94,223, 11,220,234,156,101,103, 45,141, 86,139, 48,138,121,250,116,135,193,176, 79,167,211, 66, 41,137,169, 10,223,
-213,200,144,209,104, 76, 24, 6, 36,113, 76, 24, 6,254,185, 36,132, 15, 6,170, 59,161,180,145,122,202,152, 20, 52,146,216, 71,
- 21,103, 99,194, 58,160, 99, 58, 54,157, 30, 26, 68,221,209, 4, 82,122,223,180, 14,209, 81,140, 51,142,180,217, 70, 69, 41,207,
-182,119,188,119,186,225, 35,111,145, 1, 74, 5,124,239,199, 63,198,133, 49,167,227, 28,128, 68,251, 68,198, 97, 97, 9,148, 38,
- 9,148, 31,125,214, 30, 94,131,100, 82, 57, 74,235,104, 1,177,148,132,210,213, 69,221, 33,180, 64,105, 73,101, 28,227, 73, 78,
-156,196, 68, 97, 88, 31,232,235,105,160,181, 94,233,239,124,177,169,202,130,170, 44,102,160, 25,137,155, 93,212, 93,229, 9,135,
-202,219, 51,188, 56,169,238, 8,197,212,155,108,124,151,235,140, 47, 20,170,198,155, 90, 3,101, 33,248,230, 95,126,151,159,254,
-228, 99,156, 11,169, 74,139, 19,138, 44, 43,144, 58, 32,175, 42, 90,237, 14,167,189, 30,113,172,105,119,155, 68,113, 64, 94,140,
-233,118, 91, 8, 12, 85,145,225,156,245, 99,127,237,197,125,141,118,135, 81, 86,208,104,119, 72, 27, 13,246,158, 63,161, 42, 13,
-195, 97, 70,123,109,157,245,107, 87,105,173,174,248, 48, 27,124,138,163, 88,240, 85,139, 51,227,247,186, 41,154,238,194,229, 66,
-212,169, 91, 20,188,214,227,119,229, 11,122, 24,132, 68, 97,176, 80,208, 3, 47,216,156, 34,200,103,246,184, 26,139, 90, 23,201,
-185, 76,214,157, 3,150,213, 10, 27, 89, 7,240,212,217, 0,211, 40, 85, 55,251,187,204,249,233,204,248,233, 21,118, 22,206,179,
-112,179,139, 5,221,212, 34, 54,255,249,182,126,191,171, 45,101,166,254, 26,211,189,186,172,215, 13, 98, 90,195, 88,160,226,213,
-169,151, 78,184, 90,103, 87,119,221,117,170,175,183,232,214, 58, 50,231,124,218,175,117, 51,150,252,116, 21, 98,140, 23,185,149,
-165, 37, 47, 42,178,172,168, 71,239, 21,165,113, 84,117,168,140,146,126, 69, 52,173,149, 2,127, 32,168,172, 63, 52, 84,149, 69,
-125,241,245,203,127,166,106, 74,207,244,143,160,234,144,141,121, 23,237, 79, 77,234,133,253,186,127, 16,204,119,240,243,155, 58,
-119, 0, 56, 3,165,153,125,238,217, 61,248,226,247, 83,139, 7,138,115, 63,203,217,151,103, 15, 19,243,195,128,172,247,245,231,
- 52, 0, 74,123,255,170,115, 20,101,198,213,171, 87,217,222,126,202,254,222, 33,166,172, 24, 79, 50, 38, 39,125, 14,143,122,124,
-245,119,255, 39,252,224,251, 63, 32,160,224,181, 47,188,131, 69,243,248,193,125,178, 44,163,189,178,193,202,198, 22,237, 78,147,
-227,131,231, 12, 6, 3, 2, 37,217,121,242,132, 36,137,232,116, 59, 52, 59, 77, 30, 61,121, 72, 40, 36, 56,203,214,165,203, 28,
-158,158,242,112,251, 9,221,229, 46,127,244,247,126, 31, 83, 85,252,236,253,143,232,141, 71,200, 64,243,195, 31,254,112,118,250,
-215, 58, 32,196, 33,100, 72,148,118,105, 37, 9,121,127, 31,103,114, 78,199, 25,185, 10,188, 15, 20, 75,210,104,242,246,173, 27,
-244,159,124,198,184,119, 68, 25, 52,216, 31,140,201,140, 32, 72, 26, 68, 81, 66, 18, 39,164,105,139, 63,253,211,127,198,243, 71,
-247,249,236,131,159,215,105,110,245,190, 74,107,170,202,204,236, 48,191,220,247, 47, 94, 10, 28, 58, 63, 81,251,149,139,186,142,
-208, 42, 38,144,190,171, 48, 18,178, 98,204,163, 59,159,208, 80,130, 11,151,215, 41,242,146,181, 11, 55, 24, 84,146,143,238,124,
-198,223,190,247, 17,191,120, 60,164,143,162, 16, 22, 99,252,138, 71,214, 74, 90, 35, 28, 85,189,251, 85,182, 36,116, 5,235,157,
- 6, 71,187,123,124,246,217, 99,246, 14,198,116,218, 49,157, 78,139,139,151,174,176,186,190,201,105,239,148,157,237, 7,148,227,
- 30,143,239,127,202, 71, 31,188,207,100, 56, 68, 90, 88, 95, 89, 70, 99, 56,220,219, 33,159, 12, 72, 58,203, 92,187,249, 58,183,
- 94,127,147,253,163, 99,142, 79, 78,125,154, 94, 16, 50, 24,142,177, 78,209,238, 46,211, 94, 90, 97,117, 99,147,180,213, 38, 73,
- 27, 92,191,121,157, 27, 55,175,176,177,185, 65,154, 52, 73, 27, 93,198,163,156,253,131, 67,214,214,215, 88, 89,106,209,109,166,
- 92,188,120,145,131,253, 3,126,254,179,159, 51, 26,143,235,204,249, 4,156,224,201,211,103,148,198,146, 52, 26, 40,169,106, 65,
-152, 97,146, 23, 84,149, 37,140,162, 89,147,229,247,186, 94, 57, 95, 84,158, 11,222,237,180, 57, 62, 62,162,217,104,176,212,233,
- 32,133,164, 40,114, 78, 79, 78,234,195,149,164, 50, 37,214, 20,128, 33, 84,146,124, 48, 36, 27,141, 80, 24,108, 89,224,170,138,
- 36,246, 86,202, 60,207,200,198, 99,164, 80, 56,227, 24, 14, 70, 76,198, 25, 50, 8, 40, 75,131,214, 33,141, 86,155, 86,103,137,
-245,203,151,136,210, 6,157,165, 21,110,191,249, 14,223,255,225,247,249,244,209, 51, 50,227,109, 87,177,242, 69,103, 88,122, 39,
- 65, 36,220,172,195,210, 82, 97,145,100,214, 81, 24, 75, 3, 65, 34, 64, 11, 75, 24, 8,100, 32, 16,218,211,219,116, 16, 83, 57,
-193,112, 56, 36, 14, 67,226, 40,240,201,127,194, 91,172, 36,118,118,225,183,149, 47,236,214,122, 14,253, 52, 73,203, 23,245,122,
- 52, 91,243,191,125, 33,177,245,219, 85, 13, 35,113, 84,101, 85,135, 14,249,107, 86, 85, 25,202,210,241,175,254,213,127,207,119,
-255,230, 39,116, 90, 27, 12, 71,185,183,237, 25, 63,105, 17,245,245, 53, 73, 82, 14,142, 14,105,181, 34,132,180,116,151, 58, 12,
-134, 61,194,192, 91, 46,173, 41,168, 76, 69, 16, 70,104, 29,225,132, 34,140, 18,140, 80, 32, 21,221,181, 85,202, 98,204,100,232,
-181, 27, 27, 87,174,178,121,227, 58,186,153,214, 53,217,206, 83,196,166,123,109, 59,183,114,249, 66,186,224, 99,159,197, 26,207,
-226,206,102, 91,209,169,234, 61, 8,207, 63,135,235,209,176,154, 95,251,103, 22,177,170,242,171, 9,107,102, 99,119, 95, 28, 23,
-147,219, 22, 3,194,252,253, 50, 29,183, 51,109,212,107,251,152,179,190,219,247,252,116, 59, 47,196,179,151,182, 30,165,207,133,
-111,211,223,247,172,183,220, 64, 85,157, 59, 20,248,191,189,172, 5,125,242, 37, 48, 54,183, 88,208,167, 7,151,154,144, 55,179,
-198, 89, 48,214,214,233,108,174,254,246,238,108, 58,107,173, 90,175,140,165,168, 42,138,188,100,146,229,140,198, 57,121, 81, 11,
-228,132, 68,235,105, 60,117, 52, 79,190, 83,114,142,211, 21, 10,135, 64,203,169,103, 83,190, 24,210, 34,167, 41, 71,139,119,246,
-212,235, 57,243,178,191, 60, 80,101,113,148,114, 94, 61,253,178,221,236, 98,145,112,231,236,112, 11, 25,171,243,127,249, 37, 94,
-245,151, 22,163,122,255,236,207,170,146,178,178, 60,217,217,229, 27,191,249, 59, 28, 31,246, 56, 58,216,243, 42,115, 35,185,247,
-209,135,196,203, 43,252,254, 31,252, 1,223,249,246,191,227,198, 23, 90, 8, 41, 89,218,188,192,189, 59,247,201,212, 49, 95,189,
-113,139,189,231,219,180,147, 24,181,181,206,227, 39,207,216, 88, 89,225,195, 79, 62, 70, 7, 33, 27,151, 47,147,164, 13, 46,174,
-174,242,232,225, 67,158, 60,127,198,104, 52,228,141,215, 95, 99,115,125,141,159,127,240, 1, 82, 6,172, 93,216,162,112,134,127,
-255,205,191,240, 86, 23, 4,113, 16, 81, 90,139,208, 17,101, 94,210, 93, 15, 25,103, 61,150,149,226,116, 56,164,130,217,254, 59,
-140,154,172,116, 58, 44, 37, 1,119, 14,119,145, 58, 32, 43, 13,167,163,140, 48,237, 16, 68, 1, 50,148, 20,165,229,234,250, 69,
-174, 92,218,224,131,239,254,247, 40, 12,163,222, 9,221,230, 38,141, 78,147,147,241,192,159,232,221,252,201, 59, 85,138,186, 87,
- 24, 7,207,253,133,120,249,218,125, 1, 17,251,146,109,186, 91, 80,158, 10, 59,101, 98, 11,134,131, 33,255,250,191,249,151, 68,
-249, 49,205, 27, 91,216,108,131, 60, 87, 4, 73,202,199,247, 31,241,227, 15,238,241,254,246,128,161, 85, 24, 29, 34, 92, 78, 36,
- 33,148,130,118,179, 65,171,211, 98, 82, 85, 92,187,117,139,189, 39,123,156,238, 61,227, 91,127,243, 51,170, 94, 31, 81, 12, 72,
- 34,197,250,122, 66,175,215,103, 50, 89,153,193, 27,150,150,150,176,217, 58, 75,237,148,108,220,224,147,207,238,112,113,115,131,
- 43, 87,174,147,151, 21,198, 85, 4, 67,205,197,205, 75,172, 92,185,197,209,201, 49,221,229,101, 6,189, 94,157,117, 30,208,235,
- 15, 89,219,188, 64,171,179, 68, 20, 39,140, 38, 25, 75,203, 43,179, 11, 84, 35,141,105,221,184, 72, 18, 37,164, 73,155,214,242,
- 26,123, 79,159,210,106, 55,176, 46, 67,218, 18,147, 79, 72,155, 77,218,205, 38,215,175, 95, 99, 52, 24,249,195, 99, 32, 73,194,
- 6, 71,135,167, 44,175,174, 80,230, 21, 34,168, 59,103, 1, 42,212,164,141,148, 52, 77,192, 89, 38,227,145,135, 93, 8,239,104,
-185,125,253, 18,131,147, 67, 30, 60,184, 79,146, 38, 60,124,240,136, 52,142, 89,238,118, 61,207, 62, 74,144, 58,164, 52,214,243,
-168,173,183,110, 13,250, 67,172,149,228,227,146,124,156,209,110, 53, 73,210,132, 42,155, 80, 84, 37,206, 73, 70,163, 17,206, 10,
-116, 16,179,191,127,200, 96, 56,160,217,238,144,196, 17,161, 10, 24, 79,252, 72,218,228, 61, 26,237, 54, 81,179, 67,148, 54,248,
-223,252,239,254,183,124,248, 47,254,215,244,119,142, 48, 14, 38,149,207,138,182, 66, 50,113,160, 10, 67,170, 36, 74,248,139,163,
- 22, 16,212,249, 43,185,112, 84,194,191, 33, 23,140, 27,190,139, 49, 4,161, 70, 32,120,190,119, 72, 89, 84,108,109,108,120, 76,
-174,112,168,250,176, 99,141,193, 88,111, 5,204,134, 21,167,166,192, 52, 83,170, 48,172,189,233,222,183,110, 43,137, 14,180,207,
-113, 83, 10, 66,141, 43, 53,132, 33,166,168, 80, 65,132,140, 20, 86, 72, 74,107, 40,141,165, 44, 37,251,251,167,228,149,224,184,
- 63, 70, 74,139, 10, 36,121,101,233,143,198, 44,135, 49, 81, 28,211, 31,143,200,243, 49,198,142,193,133,148,197,132,102,154,112,
-112,176,207,218,146, 15,206,169, 76,137,181,165, 79,241,138, 34,191,199,150,138, 44,159, 96, 77, 73,107,105,157,195,103, 39,132,
- 97,128, 43, 43, 26,113,130,147, 1, 78,218,185,206,220,129, 11,234,238, 84, 87, 88,163,209,182,222, 85, 59, 53,215, 85, 77,175,
-223, 51, 34,168,245, 33,118,213,252, 57,175,106,165,123,160,188, 87, 90, 46,160,160,157,115, 84,198,167,185, 97,167, 94,237,250,
- 0, 52, 21,223, 97,231,170,246,105,226,166, 59,187,255,198, 90,132,169,252,110, 90,152, 57,199,127,234, 68,179,115,176,217, 76,
-252,119,142,243, 62,157, 68, 44,106,192, 92,173,227,169, 91,106,127, 64,112,103, 87, 0, 78,184,153, 16,207, 15, 21,166,233,114,
- 53,123,222, 67, 93,234,251,135, 90,131, 0,214,201,250, 12,106,177, 78,213, 47, 69,237,128, 19, 51, 6,142, 1,156,243, 33, 60,
-101,173,101,201, 42,203, 36, 55,228,165,245,225, 60,245, 74, 36, 8, 52,113, 20,250,117,153,174,155, 89,193,252,123, 59,129, 52,
- 18, 45,197,180,139,118, 83,188, 46, 82,190,100, 28, 34,206,101,206,214, 74,206, 51,197,216,189, 60, 31,253,124, 97,255, 60,180,
- 44,224, 5, 9,175,234, 16, 95,129,136,125, 89, 2,220,121, 75,156,227, 44, 34,207, 26, 75, 54, 41,105,173,116,248,226,187, 95,
-228,163, 15,126,204,225,193,200,199,154, 42,195,251,127,251,151, 72, 55,226,107,191,253,123,252,213,183,190, 69, 26,134,252,206,
- 31,254, 61,122, 89,197,209,254, 1,127,249,205,255,129,165, 36,230,107,239,190,197,205, 75, 27,252,198,151,191,200,113,111,204,
-205, 27,215,216, 61, 60,230,240,228,148,201,112,192,123,143, 30,162,132,160,213,238,240,187,191,245, 13,180, 80, 60,126,252,152,
- 59,247,238,241, 27,191,245, 91,140,170,156,191,254,235,191,166, 42,203,249,131, 9,136,194, 8,235, 52, 23, 54, 59,244,199,135,
-184,178,100, 43,104,114, 88,148, 8, 37,136, 67,141, 34,164,221,222,228,221,215,223,166,232, 31,146,155,156,220, 58, 14,142, 79,
- 16, 65,125,186, 11, 37, 81, 43, 36,155,196,252,246,111,253, 62,178,234, 19,139, 49, 49,134,188, 42, 88, 91,234, 48, 9,192, 40,
-111,103,161,178,179,100,162, 57, 30,102, 65, 1, 60,221,175, 77,209,155,139, 92,247,133,221,216,203, 69,113,231, 99, 92, 23,252,
-240, 88,160,196,214,211,158, 70,148,114,101,109,131,167,159, 62, 33,210,150,221,167, 79,217,186,241, 22,143,159, 60,224,241,163,
-135,124,118,255, 9,185, 3, 43, 5,210, 89, 2, 17,178,218, 77, 9,156,225,221,183,223,228,187, 63,124,143, 73, 89,113,122,210,
-103,101,117,157,227,172,194,104,201, 95,255,228, 19, 94,223, 74,185,253,198, 77, 46,222,126,131,221,221,125,198,253, 62,135,135,
-135,172,173, 45, 99,109,133, 17,146, 94,102,200, 10, 71,115,121, 13, 41, 67,170,202, 48, 24, 13,233, 13, 7, 8, 39,201, 10, 71,
- 89,228, 8, 83,114,188,247,156, 42, 31,211,110, 54,232, 46, 47,147, 54, 90,108,108, 93,152, 93, 16,165,214,156,158, 28,115,114,
-114, 66, 81,148,124,227, 27,223,192, 25, 71,158,151, 24, 59, 70,199, 99,142, 79, 78,136,211,192,231,129, 35, 25, 12,199, 12, 71,
- 3,172, 49,108,109,109, 16,223,104,146, 13, 79,233,247, 79,217,125,182,207,160, 63, 36,109, 52,104,164, 9, 73, 24,214, 36, 56,
-127, 1,139, 98,141,146,126,226, 3,102, 22,178, 33, 5,216, 98,200,187,239,188, 65,187,213,228,253, 15, 62, 66,169, 8, 33, 21,
- 78, 56,162, 36, 37,136,188,114, 94, 43, 79, 15,203,199, 19,138,162,240,151,223, 48,161,185,148,120, 37,122, 62,198,140, 10,132,
-246, 86, 41,164, 70,202,128,225,104, 66,171, 25,114, 97, 99,147,125, 37,233, 15,251,108,173, 93,129,170, 98,212,235, 99,170,138,
-138, 24,153, 56,116,216, 64, 52,224,173,219, 87,249, 63,253, 31,255,247,252,211,255,226,191,228,232,228, 4,131,164, 44,253, 85,
-123,104, 10, 80, 26, 87,214,113,148,182,162, 29,134,232,172,194, 10,200,128,170,206, 72,151,206, 33,172, 15,188, 80, 78,160,176,
- 72, 87,161, 3,255, 59, 30,246, 6,228,165, 97,107, 99,141, 86, 18,130, 43,235,149,131, 64, 9,135, 49,134, 42, 47,153,152, 18,
- 81,230, 20, 51, 90,151, 7,207, 68, 81,128,214,158,160,102,165,196,150, 1, 65, 24, 33,156, 39,202,137,208, 55, 13,149,169,175,
-167, 72,140, 21, 12, 70, 5,198, 66, 86, 77, 56,220,123,206,230,198, 58, 78, 6,148, 66, 51,177, 80, 21, 5,170,168, 88, 91,239,
-176,188, 20,146, 38, 14, 87,141, 48,101,197,230,250, 6,187,207,159,176,180,212,241, 1, 59,227, 33,113,218, 38,172,159, 53,170,
- 6,136, 25, 83, 17, 69, 13,162, 36, 69, 5, 18,103,114,100,229, 16, 66, 97,165,159,158,120,229, 63, 72,229,185,253, 66,107,164,
- 53, 40,171,253,117,231,197, 49, 27,106,225, 26,106,140,153,217,217,168,199,210,114,186, 6,157, 22, 9,231, 41,121,117,164, 27,
-162, 78, 41,155,117,197,206,249,231,172,152,142,176,125, 39,186,120, 13,169,229, 99,245,106,131,121,144,184,144,115,190, 69,157,
-162, 86, 7,140,207, 10,184,125, 73,192,202, 98,113, 18,179, 48, 24, 55,123, 57,181,206, 57, 59,167,182, 33, 60, 8,105, 90,128,
-231, 58,138,121, 45,241,123,126,102, 5,123,218,145,251,141,140,168, 63, 86,204,149, 24,210,130, 85, 32,109, 61,193, 0, 43,235,
-209,187,129,188,116, 76, 10,203,164, 52,254, 49, 45, 21, 82, 11,194, 64,147,198, 33,113, 18,215, 66, 68,253, 66, 96,218,148, 78,
-167,222,125,227,234,159,249,241, 56,179,113,248,249,113,234,226, 46,125,246,246, 57,187,195, 76,196,182,240, 49,175,122,249, 42,
-155,220,236,227,166,251,242,250,228, 55, 35, 19,189,228,243, 62,239,237, 23,222,247,130,213, 77,122,235,210,100,204,237, 91,183,
- 56, 57, 62,101, 56, 24,131,169, 8,180, 99,117,181,195, 71, 31,125,202,104,144,241,123,191,253,219,220,187,119,151, 52,109,177,
-117,225, 2,101,145,243,229, 47,126,145, 56, 84, 60,186,255,144,163,131, 61, 6,131, 17,143, 31,111,179,251,124,159, 79, 62,185,
-203,100, 50,162,145,164,172, 47,175,178,177,186,206,165,205, 11,108,110,108,210,239, 15,216,222,126,194,215,190,246, 53, 6,163,
- 49,127,253,189,239, 82,213,148,162, 41, 19,177,170, 42,146, 36,225,194,218, 5,116, 26,208,223,123,206,107,221, 14, 39,253, 62,
-135, 85, 69, 37, 52,206, 42,194, 32,101,185,213,225,237,219,215, 56,222,125,136,115, 5, 71,195, 49,123,253,140, 40, 13, 64, 4,
-168, 40,162,114,146,118,123,149,127,254,159,254,103,156, 62,187,207,193,246, 3,132,117,172,175,175,161,227,144, 97,145, 81,213,
-132, 40, 49,205, 34,158,247,217,231,200,124,175,166, 7,186, 95, 97,175,174,166,163,187,115,150,182, 80,251,241,157,208,126,167,
-174,165,226,210,198, 10,195,147,103, 92,189,188,137,173,224,244,232,128, 79, 63,254,144,191,250,219,159,241,228,104, 64, 41, 66,
-148, 12,105, 37, 49, 27,203,109, 46,109,172,210,140, 67,142, 15,246,107, 60,107,135,229,229, 85,238, 63,124,136,147,138, 73,149,
-131,128,113, 94,241, 47,254,151,255,130,102,119,153,165,149, 53, 54, 47, 92,196, 58,199,157,123,247,216,219,219,103,117,109, 13,
-161, 36,155, 23, 46,176,177,121,137, 39, 59,207, 41, 74,195,113,175,207,218,230, 22, 72,201,193,222, 1, 97, 20, 17,198, 49,199,
-199,199, 52, 27, 45,174, 94,191,142,144, 62, 22, 54, 73, 18,202,178, 96, 52, 26, 81, 86, 37,205,102,147,229,229,101,170,170,196,
- 90, 67,160,235, 76,120,227, 40,178, 9,187,187, 59,228,217,136,147,163, 3,138,201,132,229,110,151, 52,137,124,178, 26,146, 60,
-203, 24,142, 6,117, 66, 88, 66, 94,102,244,251,167,180, 90, 13,226, 56, 38, 10, 52,113,160, 73, 35,141, 45,115,156,241, 12,244,
-209,112, 76, 54,201,201,139,210,123,149, 5, 40, 29,210,106,119,105,182, 58,124,240,193, 7,132, 97,200,234,250,154, 87,248, 23,
- 69, 13,159, 81, 53,213,170,194,152,106,182, 58,211, 81, 72,123,115, 29,162,136,254,112,224, 15, 4, 86,224, 80, 68, 81,204,112,
- 56, 66, 41, 77,158,231,132, 81,192,242, 82,135, 86, 51, 65,107,201,202,198, 6, 74, 11,154,205,148,168,153, 16, 44,119, 65, 43,
-156, 82, 92,186,120,141, 27,183,110,243,239,191,245, 23,104,107,136, 43, 67, 43, 14,201,157, 69, 24,127, 51,245,101, 54, 14, 66,
- 50, 11,131,170, 34,112,208, 20,130,134,115,132, 90,160, 35,137, 14,167, 22, 86,137, 80,170,222, 67, 7, 72,229,247,253,131, 65,
- 31,173, 20, 81, 24,213, 86, 79,233,161, 62, 90,251, 14, 8, 31,213, 90, 25,207,146, 47,203, 90,133,108, 37,198,128, 80, 33, 78,
- 40,156,208, 40,237,105,114, 50, 8,176,194, 71,215,250,108,115,137,181,134,170,114,252,226,231, 31,113,112,120,236,191, 78, 81,
- 32,157,100,146,149,232, 32,246,209,171,197, 24, 45, 13,166, 26,209,110, 10, 54, 55,215,188,149,173,200,232,180, 91,104, 45, 57,
- 58, 60, 32,142, 52, 97, 24, 33,164, 38, 78,154, 8, 29,146, 54,155, 76,242, 98, 38,156,171,170,130,209,112, 72,163,213, 66,197,
- 33,237,149, 21,172,231,180,214,142,174,122,159,238,166, 74,116, 55,155,200,157,191,126, 46, 10, 92,207,215,132,233,222,125,250,
-186, 23,182, 77,139,140,157,227,193,141,169, 81,169,213,108,159, 62,231,159,184, 51, 22,106,199,153, 30,178,254, 25,188, 45,109,
-106,137,243,216,212,106, 38,134,155,237,196,167,249,228, 83,225,155,181,184, 58, 13,205,218, 69, 81,156, 89,192,179,206, 45,117,
-118,102, 67,115,179,183,173,179,179,157,248,140,243,238,196,244, 28,225,253,228,214,205, 10,180, 91,160,207, 81, 31, 0, 22,225,
-105, 78, 44,164,204, 77,179,226,133,160,172, 42,242,194,115, 49, 38,147,140,178,168,252, 40, 93, 43,162, 40,162,145,198, 52,154,
- 62,151, 34, 77, 19,175, 17,137,194,217,181, 51, 8,194, 89,177,215,103,194, 91,102,133,240,229,193, 44,231,255, 77,184, 87,195,
-104, 88,132,137, 77, 67, 61,156,152,157,195,188,175,117,126, 34, 58, 59,226,159,219,230,156, 59,155,202,230,156,120, 65,141, 41,
- 94,176,191,137,133, 60,245,179, 9,111, 44,172,136,102, 39, 54, 7, 79,119,158,241,214, 23,190, 76,149, 11, 2,181,237,199, 89,
-197, 0, 81, 90,158,223,191,199,127,119,124,194,239,254,193,239,241,100,231, 25,199,199,167, 28, 29,159,112, 97,125,157,102,167,
-203,215,190,246, 53,158, 60,221,161,209,236,208,153,148,156,244, 71,116, 55,111,250, 88,207,102,147,231,219,143, 56, 60,220,103,
-109,125,147,135,143,159,176,180,178,204,215,126,227,183,248,241, 79,127,204,253, 71,143,106,181,185,168,115,142,245,236,193,148,
-101, 19,130, 48,224,233,222, 54, 75, 8, 26, 66,112,223,228, 20, 90,160, 8,208, 97, 3,137,230,250,197, 11, 60,188,243, 33,123,
- 59,119, 25, 23, 35,158, 28,101,184, 36, 32, 12, 21, 78, 8,130, 40,165, 18,154, 55,223,124,131, 88,149, 60,188,255, 41, 39,187,
-207,176,214,209,236, 44, 51,174, 74,202,178,242,251, 47,107, 17, 74,176, 24,162, 39,206,119,216,130,255, 63,254,119, 54, 6,179,
- 14,210,154,205,242,211, 52,229, 11,239,124,145,205,149,132,254,233,152,254,225, 51, 78,159, 63,196,100, 57,113,179,195, 23,223,
-254, 58,221, 56, 33, 27, 30, 96,237,132, 50, 27,115,124,120,204, 31,252,246,111,114,241,242, 85, 12,154,131,227, 30,198, 56, 62,
-125,248,136, 74, 72,134, 56, 66, 37,113, 81,139, 72, 22,100,147,130, 81, 57,193, 42,197,198,133, 75, 28,237,239, 81,213, 42,102,
-100, 72,110, 37,199,195,156,175,124,237, 13,134,147, 33, 43,107, 43,236,238,236,160,162,140,237,237,109,150, 86,150,233, 44,173,
-160, 2, 77,127, 48, 64,168,128,178, 50, 28, 28, 30,112,114,124,136, 82,154,139, 23, 47, 18,199, 33,113,156, 48, 26, 53,249,248,
-163, 15,233,180, 98,207,253,214, 33,215,174, 93, 35, 13, 3, 98, 37,232, 46,173,178,243,116, 7, 87, 25,154,173,136, 36,137, 81,
- 74,178,191,191,135,210,130, 36, 13, 65, 57,190,244,238, 23,121,252,232, 33, 71,199, 7,148,249,216, 11,104,164,164, 17, 7, 4,
- 74, 82, 26,203,112,146,177,186,182, 65,160, 67,111, 91, 2,132, 12,144,202,103, 92, 95,185,126,149, 73, 49, 97,103,231, 9, 87,
-135, 87,233,118,218,245,225,210,119, 90, 90,107, 84,236,195,138,172,169, 80, 65,136, 12, 3, 42, 9,201,214, 58,203, 74,146,245,
-250,222,114, 4,190,179, 80, 83, 59, 86,151,170,204,137,130, 0,227, 12,165,112, 20,166, 98,229,230, 13, 6, 7,207, 25,155, 18,
-237, 42,100,144,160, 2,133,235,245,249,199,255,248,239,241,175,254,252, 15,249, 55,255,207,127,205,141, 40,100,236, 44,167,214,
- 11,140, 42, 4, 85,233, 71,164, 73,225,213,249,126, 14, 49,237,144, 4,198, 76,241,163, 94,212, 36,100, 13, 46,147, 2,161,133,
- 7,194,212, 69,103,239,248,132, 34, 47, 88, 95, 93, 37, 10, 67,172, 53, 40, 1, 74,122,148,242,244, 48,107,235,177,188,176,130,
-210, 74, 20, 33,165, 85, 56, 2,164,140, 48, 50,192, 72, 69, 85, 25,210, 56,162,189,212, 70,160, 41,138, 9, 14, 75,168, 53,141,
- 52,193,148, 5, 96,189, 74,125, 60, 65,168, 16,203, 0,173,154,244,135,135, 4,203, 41, 58,118, 12, 7, 5, 82, 94,162,170, 38,
- 36,113, 72,191,119, 66, 28, 39, 52, 27, 45,242,124, 66,156,164,158, 41, 80,149,184,202,127,205,178,200, 41,139, 2,227, 20, 73,
-171, 69,179,219, 5, 97,169,242, 33,152, 12, 33, 99,164, 86,179, 76,111, 41, 53, 66, 91, 76,165,145,218,160,140,242,158,160, 5,
- 52,236,249,195,250, 98, 65,159, 22,197,197,169,172,115, 22, 91, 89,159, 62,231,132, 63, 52,212, 44,243,105, 81,247,196, 58, 63,
-193, 16, 98, 10,102,159, 79, 8,196,249,213,156,173, 22,192, 44,102,118, 53,154,225,102, 29,103,104,114,231,225, 51,231, 81,177,
- 51, 88,205,185,108, 17,231,220,204, 51, 63,175,206,139,227, 97, 89,231,150,248, 7,149,117,110,150,145,226,206,212, 21,129, 91,
-216, 87,250, 62, 77,248, 9, 82,253,184,163,118, 84, 56, 87, 79,174, 43,131,144,101, 93, 48, 61, 45, 79,233, 0, 45, 37, 65,160,
- 8,195,128, 70, 51, 38,109,132,196,113,228, 15,168,181, 85,208, 24,139, 49, 6, 83,185, 89,237,211,211, 46,251, 87, 98,167,191,
-112,171,199,244,184,249, 62,132,133,144,151,115,121,236, 44,142, 49, 94,117, 80,168, 79, 51, 47,140,206, 63,199, 35,253, 42,242,
-220, 75, 95,175,105,128,179,144, 0,239,138, 97,146,229, 4, 65,202,181, 91, 55,233,245, 14, 8,116, 73, 16, 54, 56, 62,174,252,
-126,247,244,132,255,234,191,254,111,248,202, 87,126,141,219,183,111,209,109,183,177,192,103,159,222, 65, 43,197, 74,167, 73, 49,
-238, 19,234, 16, 81,142, 89, 95,106, 51,232, 29,242,252,201, 3,198,101,197,216, 24, 78,243,140,238,198, 38,143,119,158,240,254,
- 71, 31, 50, 28, 13,207,140,162,149, 80, 84,166,154, 77, 21, 74, 83,113,127,251, 30, 50,159,176,222,108,242,236,248,132,147,202,
-103, 67,135, 65, 76,144, 54,120,243,250, 13, 26,145,228,103, 63,251, 5, 42, 40, 57,205, 11, 38,206,143,238, 13,150,110,167, 67,
-216, 88,194, 16,242,229,119,222,230,100,255, 1,247, 62,120,143,157,135, 15, 88,217,220,164,176, 5, 89, 89, 32,165, 66, 11, 75,
- 37, 44, 78,120,161,153, 93, 28, 69, 33,206,250, 50, 95,178,238, 88, 60, 72,189,154,191,127,222,147,186,200,104,166, 54,138,248,
- 39,152, 64, 81, 20, 37, 65,156, 50, 24, 79,176, 66,163, 67,175,244, 54, 22,126,243,183,126,135,229,141,235, 28, 61,122, 0, 85,
- 78,163, 17,243,243, 79, 62,225, 55,190,242, 46,105,163,193,246,163,199,200, 48, 37, 12, 99, 86,154, 45,150, 26, 41, 71,163, 33,
- 89, 89, 50,204, 12, 89,110,216,106,166,100,163, 1, 39, 85,206,254,222, 46,155, 27, 27, 92,190,114, 5, 83, 85, 60,122,244,144,
-231,251, 71,180,186, 43,252,225,223,251, 79,216,220,216, 96, 92, 76,152,228, 19, 84, 16,179,178,190, 73,167,149,146,164, 9, 78,
- 40,223,133,149, 5,167, 71, 39, 12,199, 19,210, 36,166,219,110, 97, 42,195,209,193, 62,141, 70,211,199,181, 58,203, 87,190,244,
- 37,180, 18,180, 90, 45,142, 78,142, 9, 67, 69, 28,106,178,241,144, 92, 11,122, 39,167, 20,121,129,117, 13,172, 53, 28, 28, 28,
-227, 42, 71,154,164, 72,225,128,138,202,228, 92,186,180,197,198,218, 50, 90, 74,122,199, 39, 12,135,125, 40, 39,117,124,165,194,
-201,128,209, 56, 39, 78, 18, 2,165,253,133,192, 90,111,125, 9, 67,140,173,184,113,243, 6,215,111, 92,197, 85,198, 35, 94, 67,
- 77, 85, 24,223,229, 74,225, 39,103, 74, 50, 26, 13,105,133, 1, 74, 11,191,215, 53, 21,113,183, 77, 49,206,113,166, 68,106, 9,
- 82,178,121,233, 50, 71, 71,135,132, 73,140, 14, 36,214,228,148, 54, 32, 94, 91, 35, 76, 90,136, 64,147,232, 75,100,189, 35, 31,
- 21, 26,131, 12, 5,163,147,125,154,205, 6,255,244,159,254, 9,223,249,111,255,156,150,142,145,182, 64, 87, 6,161, 20, 10,197,
-184,202,113, 6, 6,121, 65, 16, 37,179, 3,255,116, 76,106,166, 20, 50,108,173,226, 22,245,234,193,119, 70, 74,250, 60,121,225,
-252,116,114,144,149, 84,251,135, 44,119, 59,116,154, 13, 31, 55, 92, 23,247,233, 5, 28, 28, 66,106, 80, 26,131,196, 72,141,145,
- 26,165, 35, 8, 60,185,173,180,208,238,180,232, 46,119,144, 90, 96, 10, 15, 25, 17, 88,132, 48, 68, 97,128,146, 14, 37, 43, 38,
-101, 70,238, 4, 58,196, 39, 14, 38,138,201,184,207, 64,143,232, 54,187,164,113, 76, 62, 25, 32,169,176, 22,210, 70,155,201,120,
- 68,150,101, 52, 26, 49, 32,169,170,138, 44, 27,147,132, 49,206, 84,196, 81,128,169, 10,242, 74, 16, 39, 41,221,213, 85,178,193,
- 9,145,168,176,147, 1, 58,136, 49, 72,172,170,139,186, 86, 88,231, 69,109,214, 24, 92, 96,177,194,204, 56, 34, 83,141,203,116,
- 39, 59, 93,171,121, 72,140, 31, 43,203,154,142,183, 24,111,235,189,231,178, 86,212,155,121, 48, 76, 85,121,158,194,148,125, 34,
-167,182,217, 23, 19,214,102,241,168,245, 95,214,205, 50, 65,207, 38,170, 77, 11,231,226, 40,221, 89, 55,179,233,213,136,188, 25,
-241,237,204, 14, 87, 44,224,203,103, 32, 26,183, 80,212, 23, 14, 4, 83, 53,194, 52, 99, 94,170, 26,205, 42,102, 81,211,179,175,
-185,112, 42,153,133,155,213,247,151, 47,239,213, 60,153, 78,212,212,188,188, 64, 7, 1, 66, 22,254,159,165,167,127,250,213,169,
- 38, 78, 34,146, 56, 38,142,189,195, 96, 74,128,181, 53, 7, 97, 22,201, 90, 55,184,250,124,230,249,231, 69,168,190,248,114,118,
-133, 63,251,249,127,135,232,212,151,221,102,254,246,151, 1,254,207, 81,104, 94, 44, 42,226,213,241,171,245, 29, 54, 99,143, 59,
- 87,199,150,250, 24,206,131,227, 3,186,173, 54, 55,110,222,226,228,232, 57,121, 54, 33,137, 4,121,233,106, 8,146,227, 71, 63,
-254, 17,205,180,193, 27,111,188,201,230,230, 38, 95,255,141,223,100, 60,236,179,179,183,199, 96, 48,100,255,224,152,245,245, 11,
-244,198, 19,174, 92,187, 70, 37, 29,151,182, 46,144, 87,134,135,143, 30,113,247,222, 61,142, 79,142,231,163,152,233, 78,168, 30,
-247, 77,149,232,206,248, 39, 64,158,141, 88,215,154,113, 89,177, 91,148,148, 66, 16, 90,127,226,110, 52, 98,174, 94,218,224,167,
-223,251,107, 84,168,153,152,138, 94,102, 17, 65,224,119,121, 78,161,130,136,102,218, 98,107,235, 10,111,220,188,196,119,254,219,
-255, 11, 39,135, 59,104, 12,217,100, 68,137,193, 40, 1, 6,175, 24,175, 51,158,177,243, 19,249, 11,165,248, 60, 71,249,115, 2,
- 21,206,255, 45,220,231,125,157, 25,176,193,205,232, 76, 85, 85,113,114,218, 35, 32, 3, 17, 34,100,194, 73, 17,162,226,132,110,
-171,205,225,243, 39,196,202, 80,133, 1, 63,248,209,123,220,184,114,137,171, 55,110,240,224,254, 3,150,151, 87,136, 66, 77,171,
-221,228,245,215,110,177,253,116,155,188, 8,232, 27, 75,150, 85, 60,184,119,159,245,215, 47, 49, 56,122, 78,214,239,179,212, 74,
- 9,164, 35, 8,189, 5,240,250,141,155, 28, 28, 28,144, 52, 98, 86,150, 58,140, 71, 67,140,128,193,112,194, 96, 60, 33, 81, 1,
-141, 86,135,227,227, 35, 78,251,125,210,102,155,195,163, 99, 28, 2, 21,132,148,185, 35, 27,121,157, 68, 85, 25,198,163, 17,198,
- 24, 86,150, 87, 57,156,140, 49,149, 65,202, 61,132,132, 48,212,180, 26, 41, 38,207, 24,245, 78, 25, 14,134,244, 7, 67,210,198,
- 37,198,227, 49,135,123, 71, 92,190,116,217, 91,175,242, 28, 45, 4,101,158, 97, 42,131, 18, 2, 99, 61,178,179,209,108, 19, 72,
- 24, 14, 7, 76,242,146,246,114, 23,131, 36, 47, 61,203, 58,137, 67, 92,101,200,198, 35, 58, 73,204,104, 60, 65, 8, 65,168, 3,
- 68,164, 40,203, 28, 99, 75,180, 84, 56,231,163, 34, 21,130, 48, 10,253, 8,222, 25,108,145, 17,198, 1,100, 35,164,142,105, 52,
- 27,140,203, 1, 78, 42,207,203,178,142,149,205, 13,180, 18,104,145, 80,142,135,216, 80, 17, 54,155,136, 36,133,202, 18, 36, 41,
-102, 50,130,162,194, 77, 50,164, 11,177,147, 1,213,201, 30,175, 95,218, 98,169,211, 38, 82, 9,131,147, 35, 84,125, 1, 44,140,
-161,170,197,113,227,202,210,138,196,188,115,171, 5, 72,126,207,202, 44,112,106,250, 17, 98,161,248, 40,165,235, 78,201,239,155,
-141,144,156, 12, 71,228,101, 65,187,209,160,213, 72, 16,202,179,203,103, 33, 87,210, 19,187,194, 48, 66, 5, 33, 34, 80, 30,194,
- 34, 45, 65, 18,211,238,248,100, 62,148,168,135,197, 83,171,150,191,173,173, 54,113,102,140, 10, 35,160,196, 88, 65, 26, 53,177,
- 24,172,201,145, 20,152,202, 97,109, 76, 18, 46, 99,242,194,239,161,171, 18,155, 36, 52, 26, 9,195,225,144,189,221,125,214, 55,
-215,136,145, 4, 73, 74, 85,102,152,170, 36, 10, 2,138, 60, 71,232, 24, 29, 70,116,151,150,217,237, 31,144,157, 30, 48, 72, 82,
- 58,141,101,108,160,253,232, 91,122,106,159, 80, 22,161, 21,210, 4, 40,107, 17, 14,172, 16,103, 11,171,173,247,198, 82,122,207,
-254, 12,247, 58,151,201, 78, 33, 43,211,103,186,177,213, 25,168,204,140,246,134,173, 19,206,196, 28,197, 90,139,222,108, 29, 18,
-227,236, 60, 80, 69,212,121, 29, 76,187,223, 41, 86,118, 38, 74,155,238,210,235,162,110, 23,179,205,125,177, 61,147,115,190, 24,
-241, 60,141,222, 93,200, 77,247, 77,244,249, 46,127, 26,249,190,192,130,168,121,246,139,130,187, 89, 65, 95,108,100,235,207,153,
-234, 12, 28,212,201,127,211,107,159,215,117, 85,198,214,235,139,233, 99, 77,214,170,251,186,217,171,215, 72,231,215, 34,103, 86,
-221,204,115, 87,244,121, 17,218,171, 68, 78,191, 10, 18,244, 85,138,231,179,175,139, 51,111, 47, 76,219,235,137,193,124,231,125,
-166,104, 44, 70,184, 46,204,134,167, 31,247, 74, 53,252,130, 52, 91,214, 98, 26,123, 46, 60,198, 58,135,181, 21,141, 78,131,221,
-221, 93,186,205, 54, 81, 20,112,116,120,192,242,106,206,163,237, 35, 8, 35,138,188,192, 57, 65, 18, 71,188,247,222,123,252,228,
- 39, 63, 97,117,121,133,141,205, 77,186,203, 93,218, 91,107,172, 92,123,203, 43, 95,141,225,222,225, 9, 71, 71,167,188,119,247,
- 30,199,199,135,100, 89,118,230, 48,228,156,123, 73,158,248, 60,142, 79, 73, 65, 83,123, 1,217,147,201,152,177, 16, 72,161,113,
- 65, 72,212, 72,120,237,234, 37, 62,122,255,199,140,199, 61,130, 56,228,116, 84,146, 57, 65,170, 67,180, 80,196,173, 21,132,142,
-192, 56,126,253, 75, 95, 38,239, 31,208, 59,218, 38, 9, 21,153, 53,116,187, 45, 38,197, 4, 43, 67, 15,137, 48,126,191,229,166,
-112, 90,203,108,207,239,167, 90,246,151,142,223, 29, 47,142,187,206, 31, 8,102, 46,136, 89,103, 63,127, 2,217, 41, 24, 67, 88,
- 64, 17,198, 17, 81,156,112,255,206, 93,174,223,122,157,103,135, 25,101,122,129,183,111, 92,231,104,119,143,173,173, 53,238,124,
-124,151,143,239,220,165,217,108,113,227,214,109,122,163, 9, 59,123, 7, 60,121,190,203,107,175,191,206,233,104,200,157,251, 15,
- 80,161,196,148,121,253,132,145,124,243, 91,223,164, 89,188,197,147,199, 15, 24, 78,114, 54,183, 46,146,132,146, 52, 14,201,138,
-156,110,183, 75, 28, 39, 28,238,238,240,209,207,127, 74, 28,167, 36,237, 22, 34,138,136,227, 4,147,151,244, 71, 19,210, 86,135,
- 10, 15, 60, 90, 93, 91,101,127,127, 31, 76, 65,145, 85, 94,232, 53, 28,146,101, 57,167, 39,167,148,101,201,197,139,151,189,181,
-172, 52, 32, 36,105, 35,194,148, 57,237, 86,147,120, 26,161,170, 2,186, 43,203, 44,175,172, 80,149, 57,221, 78, 7,140, 97, 60,
- 26,226, 74, 77, 86, 84,180,154, 77,194, 48,164, 42, 75, 80,154,188, 40, 57, 61, 61,165, 42, 75,198, 89, 70, 97, 5, 43,151,110,
- 16,134, 33, 74, 9, 40, 11,242, 44, 35,137, 35, 6,195, 49,206,180,169,138,137,223,163, 11, 77, 28, 69, 8, 69,157,208, 85,225,
-156, 64, 7, 33, 56, 71, 16, 6,148,101, 78,239,244,152, 86,187, 77,172, 37, 78, 74, 42,211,199, 57, 77, 24, 41, 10,167,136,163,
-152, 32,137,144,218,147,183,132, 41, 8,226, 16,145, 6,136,192, 65,237,183,150, 85,137,178, 21, 34,203,161,172,112, 81, 68, 57,
- 25, 48, 60, 48,148,131,138,210,193,206, 96,232,175, 7, 14, 10, 83, 97,240,223,211, 72, 75, 85,249,199,138, 16,222, 62,228, 9,
- 99, 83, 53,181, 92,200,245,157, 70, 89,122,138,165, 14,165, 23, 0, 58,188,117, 73, 9, 31,163, 41, 37,133,115,140,202, 2, 59,
- 17,196, 97, 68, 28, 9,194,122, 87,169,180,223,203, 75, 29, 16, 68, 1,113, 26,145, 54, 19,154,141,148, 56, 12, 9, 67, 13,194,
-206,248,229, 62,243,218,243,105,133,131,110,167, 81,135,116, 76, 72, 18,191, 67,149,170, 66, 41,139, 49, 25, 74,218, 25,225,110,
- 50,202,176,109, 75, 80,139, 23,171, 34,199, 41, 72,146,148,241,120,204,120,156,209, 89, 94,161,145, 38, 84,206, 95,244,165,210,
- 94, 77, 93, 79,187,194, 40,162,211, 72, 56,221,127, 70,144,180, 73, 71, 99,212, 82,130,145, 14,225, 20, 82, 25,176, 62,208, 70,
-105,139,181,218, 71,162,158,139, 92,253,220,137,234, 66,242,166, 91,216,215, 79, 75,230,244, 50,109,169,109,128,211, 11,137,168,
- 67, 83,156,172, 21,245, 2, 39,253,223,192, 45, 8,221,132,152,254, 37,231, 13,144,117,243,233,222,153, 44,118, 55,247,125,207,
- 89,236,211, 3,197,252, 90,235,156, 59,215, 88,156,189, 38,249, 14,219,214, 56, 87,175, 76, 23, 83, 17,223, 52,205, 79,107,159,
- 17,160, 22, 2, 50,164, 56, 43, 34, 23,162,118, 91,205,249,242, 14,176,210, 46, 68,188, 66, 69, 9, 82,214,215, 62,127, 63,248,
-233,144,153, 77, 59,230,117, 66,250, 53,192,116,141,237,166, 28,124,255, 41,182,118, 40,232, 87,103,152,243, 43, 51,190, 95,149,
- 93,254,242,238,249,252, 62,252,229,183,197,255, 22, 79,135,142,186,147,124, 69,103,254,194,231, 47,252, 46,114, 97, 63,239,106,
-107,140,144,126, 8,228,172, 37, 47, 39,172,109,174,179,187,253,140,155,215,174,162,116, 68,127,100, 24,103,142, 79,158,236,227,
-148,164,170, 12,199, 39, 39, 84,149,223, 15,157,246,122, 28, 28,236, 19, 5,146,202, 66, 97,157,127, 98, 9, 65,229, 60,233,231,
-252,253,234,220, 44,107, 8, 33,164,207, 37,126, 89,135,235, 32,145, 48, 46, 12,125, 41,145, 68,196, 34,196, 68, 1,151,175, 94,
-166,234,159,176,183,187,237, 89,207,227, 49,131,204,160,226, 20,173, 99,226, 48, 34,136, 27, 24, 39, 88, 89, 90,230,246,213,203,
-252,240,187,255, 47,170,172, 71, 28, 73,154,173,150,191, 31,133, 64,168,218, 14, 36,197, 25, 70,181,148,126, 4, 47,167, 91, 10,
-241,106, 30,252,203, 34, 15, 63,239,113, 51, 11,246, 49, 62, 43,184,170, 42,170,170,244,196, 63, 63, 71, 35,208,126,151, 91,150,
- 37, 81,156,144,151, 57,159, 60,120, 74, 17,172,241,100,183,199,114, 55,165,154,244,216,220, 90,102,235,242,239,243,189,239,191,
- 71, 94, 24, 94,127,237, 18,123,123,123,124,239, 7, 63,228,100,216, 39, 47, 13, 7,253, 62,113,160,105, 54, 18,242,158,167,245,
-221,223,222, 97,251, 89, 3,108, 65, 32, 44, 39,135,123, 28, 31, 31,179,117,241, 10, 81,218, 36, 12, 52,101, 62,198,148, 25,223,
-249,235,191,102,107,107,131,219,111,190, 69,212,238,128,144,244, 70, 35,214,229, 38, 22,191, 3, 91, 93, 89, 97, 52, 30,162,132,
-160,215, 59, 97,121,105,133,254, 96,136,169, 74, 46,108,109,178,181,185,137, 49,142,123,247,239, 1,130,119,190,248,107,172,172,
-174,114,231,238,167, 60,218,126,130, 45, 11,150, 59,109,110, 93,191,206,133, 11, 23,144,145,166,172, 42,142, 14,143, 80, 86,162,
- 28, 40,225,152,140,198, 60,219,221,231,202,149, 43,180,181,247,128, 7, 97,204,202,218, 26,237,110,151,195,195, 99, 70,135, 7,
- 76, 70, 19,198, 69, 73,107,105,153, 64, 90, 2,145, 80,140,135,148,121, 78, 18, 69,244, 78,143, 9, 34, 47,184,137,195, 24, 83,
- 26, 42,235,125,186, 73, 28,205,159, 75,129, 6, 43, 49,214,135, 33,197,129,194,133, 26,161, 36,163,254, 16, 25, 38, 4,113,131,
-180,213, 65, 69, 30,192,132, 48,216,162,172, 33,222,222,135, 92,245,143, 40, 42,129,176, 16, 33,168, 78,143, 24, 31,157,208,110,
- 47, 49, 50,138,157,237,199,180,150, 87, 25,143, 5,121, 81,113,216, 31, 16, 3,101,173,122, 6, 31,119,234,156,165, 2,138,170,
-170,245, 58,110,158,187,237,106,190,186,181,243,161,173, 93, 8,216,174, 31,170, 90, 41, 60,174,205,175,179,132,146,117, 58,156,
-191,149,128,182, 14,237,220,124, 93,167, 36, 73, 18,146, 54, 27,164,205,152, 36, 13,137,131,192,219,221,116, 77,169,115,204,194,
- 70,100, 61, 98,182,206,177,177,177,234, 11,191,242, 96, 91, 36, 56,231, 69,155, 69,225,234,125,115,229,131,112,106, 28,113,187,
-211, 34, 47, 10,140,181,148, 85, 70, 85,131, 81,122,189, 62, 43,235,107, 88, 99,234,136,223,105,238, 54, 68,137,207, 82,111,196,
- 1, 73, 28,113,106, 13,189,147, 35,210,225,128,230,210,178,255,123,206, 68,195,202,243, 13,148, 23, 42,250,169, 28, 47,168,199,
- 95, 22,200, 53, 45,190, 30, 23,187, 80,176,103,153,223,117,145, 23, 11, 7, 5, 83,213,244, 55,137,181,117, 34,155,162,254, 89,
-228,236, 58, 63, 31,191,139,217,152,155,218, 17,180, 32,118,127,113,120, 56, 19,180,217, 25,252,101,241,128,114,230,107,215,126,
-242,105,199, 34, 22, 28, 61, 78,120, 54,187,155,122,209,241, 28,122,165, 3,148, 14,113,218,179,232, 61,211,126,177, 51,167, 22,
-194,185,121,170,220, 66, 3,227,157, 67,115,113,162, 53, 22,170,106,166,216,175,234,107,161, 88, 16, 20, 71, 81, 72, 20,134,158,
-199, 47,181,103, 64, 56,191, 75,119,211,223,161,142,178,157,254,157,212, 87,222,186, 62, 87,191,207,216,239,191, 66,177,172,215,
- 45,175, 4,145,204,162, 92,197,108,196,193,153,127,155, 27,250,103, 74,122,196,130, 95,241,243, 1, 39, 51,228,236, 66,254,187,
-156,126,205,197,183,153,127,204,162,250,112,254,115, 45, 62,232, 28,227,241,152,213,245, 85, 62,254,228, 19,110,221,126, 13,235,
- 12,205,102,194, 96, 52,161,215, 31, 35,129,188,172,102, 39,207, 40,128, 52, 82, 40,229, 24,142, 75, 10, 99,169,156,163,114,130,
-106,106,147, 88,176, 69,156,241, 41,178, 8,106, 17, 47,245,239, 77, 42, 71, 6, 88,167,145, 42, 32,142, 35,110, 95,218, 98,171,
-147,114,255,179, 95, 80, 81, 50,182,134,222,184, 68,138,128, 36,136,209, 58, 68, 68, 17,205, 72, 32, 84,194,239,254,238,239, 19,
-152, 62,159,252,205,191,243, 23,210,124,130,106, 47,161,210, 14, 81, 28,123,175,227,212,141, 34, 4, 74,168, 41, 40,105,129, 69,
- 48,127,162, 77,199, 97,110,150,116,196,108, 28, 53, 67, 74,184,197,212,188,133, 0, 31,225, 59,139, 64, 7, 40,225, 89,216,178,
-254,223, 31,182,132,135,199, 88, 3,213,132,227,253,199,236, 61,125,204,100, 48, 34, 31, 79,120,242,100,151, 86,187,139, 83,240,
- 96,251, 1,131,209,144,175,125,229,235, 72, 39,137,164, 96,181,157,114,101,107,141, 75, 23, 55,121,182,183,199,195,157, 61, 78,
- 39,185,255,153, 42,131, 40, 42, 4,142, 92, 8,172, 18,252,225,175,127,157, 91,183,222,100,229,242, 13,156,140, 57, 56,236, 51,
- 25, 14, 17,229,152,231, 15, 63,161, 24,247, 41, 69,196,250,250, 26,215,174, 93, 37,142, 35,226, 36, 97, 48,202,113, 42, 98,169,
-211,228, 96,239, 57,171,203,203,100,147, 49,195,126,143, 73, 54,228,225,195,251, 96, 75,180, 51,188,249,250,109, 2, 29, 82, 89,
- 71,175, 63,230,218,205,215,249,250, 55,126,155, 27,151, 86,185,116, 97,147,183,191,248, 14,105,163, 77,146, 54,249,163, 63,250,
- 35,190,244,206,219, 44, 45,181, 57, 61, 60, 96,112,210,227,228,224,216, 31,172,108,197,210,210, 50, 82,135, 52,151, 86,137,147,
- 20, 33, 4,141, 36,193, 86, 21,194, 73,164, 80,116,151,150, 9,226,136,167,207,158,211,104, 52, 89,233,116, 73,211, 24, 21, 5,
- 76,202, 49,213,120,132, 14, 98,114, 35,217, 63,234,209,104,117, 80, 74,162,181, 67, 58,203,179,167, 59, 4, 90, 34,149, 47, 0,
- 40,141, 74, 27, 68, 73,196,160,183,135, 41,115,198,131, 30,227,222, 0,165, 3, 12,146,194, 58,194,164,141, 10, 4,194,142,113,
-147, 19,164,153, 32,109,133, 48, 14,161, 2,138, 94,159,225,254, 51,196,104, 64,104, 5, 39,123, 39,228,227,140, 48, 12,184,243,
-233, 67,118,159, 62, 37, 9, 66,150,215, 47,240,183, 63,253,136,187, 59,123,100, 8, 10,111,141,198,212,220,114, 89, 23, 74, 35,
- 37, 85, 29, 28,211,144,130, 20, 8,177,196,145, 32,136, 4, 42, 0, 33, 53, 82,251, 92,115, 85, 3,174,230,164, 74,133, 22,158,
-164,167, 23,108, 89, 82, 80, 7,203, 40,132, 82, 53, 14,213, 39,145, 37,105, 72,146, 4, 36,145, 23, 35,106,165,234,224,151, 26,
-118, 5, 53,164,198,135,236,248,127,241,163,213, 31,252,248,199, 32, 13,105,172,144,206, 96, 41,144, 74, 16, 71, 33,163,193, 8,
-173, 44,157, 86, 64,218,140, 80,129, 70, 74,201, 56,203, 22,246,203, 32,180,194, 10, 75,101, 42, 86,215, 86,105,180,154, 12, 39,
- 57, 82,133, 32, 3,156,138, 16,182,242,250, 24, 83, 50,169, 12,195,209,136,165, 86, 74, 99,105, 13, 84,224,249,249,128,176, 22,
-105,166,236,115,127, 40,168,147,189,253, 36, 99,198, 63,119, 24,103, 48,206,212,120, 93, 59,243,110, 79, 35,101,167, 0, 30,234,
-152,210,217,248,184, 86,148,155,202,103,131, 87,149, 7, 68,205,148,229, 51, 45,141,152,209,215,102, 96,150,154, 39, 98,107,181,
-185,127, 41,102,215,205,133,245,247, 44,173,117,106, 41, 51,142, 51,202,117,235,188,150,196,213, 7, 17, 31, 53, 59,133,204,185,
-217, 53,203, 78, 15,136,245,251,164, 20,179,224, 26, 21,134,232, 48, 66, 69,145,143, 30, 14, 3,164,214,200, 32, 64, 6,254,250,
- 44,180, 94,232,228,107,168,215,140,140,167,144, 4, 11, 62,123,131, 41, 43,138, 44,103, 50, 26, 51, 30,101,245, 52,216, 32,165,
- 35,136, 20,141, 52,245,215,156, 56, 34,136, 60,212,103, 74,214,155, 89, 4, 22, 88,242,214,190,180, 83,255, 15, 11,235,248,229,
-193, 29,175,136, 74,253, 15,144, 82,203, 87,236,204, 63,247,251,212,177,118,159,247,243, 76,199, 55,135,135,135, 92,185,122,149,
-239,255,224,251,152,202,210,105,119,249,253,223,249,117,126,248,147,159, 51, 24,103,236,236,157,208,104,132,228,121, 73, 26,135,
-140, 71, 25,205,134,166,213,212,244,199,134,204,250,113,254,116,244, 50, 61, 64,184,151,237,149, 23,100,150,139, 58,139,133,180,
-122, 2,169,145, 50, 34, 12, 18,214, 59, 93, 46, 46,175,240,224,211, 15,177, 78,211, 47, 44,163,162, 68, 7, 9,145, 14,125,192,
- 71, 85, 16, 71, 13,130, 32,100,105,117,141, 75,155,235,124,250,131,111,162,170,146, 98,148, 99,131,152, 50, 43,105,175,198, 51,
- 61,196,212,199, 63, 61,232,136,217, 40,108,170,242,116,243,184,195,133, 95,230,151,133,188,156, 5, 15,205,127, 65,255,196,178,
-190, 59,159,158,210,165, 63,116,185,202, 98, 5, 84, 98,194,120, 60,228,248,244,148,227,253, 67,146,102,147,181,181,117,162, 70,
-202,147,135,219,132,129,228,194,214, 38, 0, 43,221, 54,225,205, 43,252,224, 71, 63,224,163,143, 63,228,181,183,222, 98,125,115,
-139,143,238, 63, 70, 66,125,241,118, 52,227,144, 40,110,241,240,228,104,198, 97,119,245,250,165,217,108,112,237,234, 37,218,141,
-132,167, 15,239, 17,134, 1,135, 7,251,136,164,226,143,255,248,127,202,163,199,143, 56, 58, 29,112,177,189,194,214,214, 50, 89,
- 94, 16,104,191,119, 29,141, 70, 88,107, 56, 57, 57, 33,155,140,248,194,155, 95,160,170, 74,194, 32,100,239,240,132, 40, 74,185,
-127,255, 17,121,101,248,226,151,127,141,103,207,118,168, 58, 33,173, 78,135, 34,207,185,116,233, 34,171, 43, 93,202,124,194,206,
-206,128,209,224,196,175, 95,218, 13,180, 22,156,158,156,178,178,113,153,184,213, 32, 77, 83,156, 84, 28, 31, 30,128, 21,228,101,
-233, 5,120,194, 99,117,173,113, 36,113,147,110,123,137,254,209, 49,131, 86,155,200,116,168,108, 6,182, 64, 83,225, 76, 70, 62,
-156,112,122,112, 72,167,145,144, 73, 75, 18, 72,146, 56, 37, 12, 2, 4, 80,149, 37,133, 49, 36, 74,227,202,138,102,103,153, 75,
-151,111, 83,142, 70, 80, 86,228, 89, 73,152, 44, 65,146,210, 31,103,236, 61,127, 76, 26, 41,218,141, 0,107, 10,100,160,144, 81,
-138, 11, 19, 2, 52, 74,104, 76, 86, 48,177, 32, 74,141,112,138,113,110,184,247,222,251,156, 14, 74,210, 32,226,224,176, 71,145,
-244,104,181,154, 72, 41, 48,204, 5, 69, 98, 81,225,140, 32,175,170, 25,182, 83, 46, 60,179,220,172, 56,212, 13, 0,194,103,169,
- 27, 11,202,183,122, 66,250, 80, 15,185,144, 30,168,132,207, 88,240, 97, 34,211,242, 54,199,152, 74, 89,235,198,102, 42,233, 57,
-176,107,234,117,246,235,170, 69,198,131,159,115, 53,155, 13, 58,157,132,227,211,156, 40, 14,145,194, 96,132,164,178, 22, 89,239,
- 89,157, 5, 29,104,194, 40, 4, 28,147,108, 76,229,115,101,209, 73,128, 20,130,102,154,208, 72, 35,132,242, 22,199,209,104, 12,
- 50,102,156,229,158,143,110,125, 94, 64,145,151, 68,113, 76,179,213,230,232,228,132,221,157, 39, 52, 46,222, 66,117, 34,144, 96,
-133,239, 62,167,182, 42,127,171,234,177,112,173, 86,183,102, 6,116,153, 93,155,220, 66,218,218, 2, 71,126,206,173,224,140,247,
-219, 88, 75,105, 43, 42, 99,235, 76,112,127,223,123,148,183, 79,203,243, 59, 99,102, 4,208,185, 2, 78,128,176, 11,187,233, 5,
- 21,246,204, 19,255,178,107,233,220,101, 53,229, 54,156,209,126,205,214,185, 51,122, 12,118,186, 18,119,211,221,116, 77,186,155,
- 98,115,235, 98,173,130, 0, 57, 45,230, 82, 46,236,213,231, 63,147, 19,188, 32,254, 19, 83,167,128,153, 78, 16,252,164,215,212,
-246,188,178, 40,168,202,114, 54, 85,208, 90,215,214,181,136, 40,142, 8,194, 96,102, 33,180,214,250,239, 61, 19,203,177,144, 34,
- 40,255,227,138,250,226, 69,253, 87, 45,232,175,202, 96,255, 15,249,158,159, 71,146,251,187,124,205,121,247,239, 69,115, 85, 85,
-113,112,112,192,213,107, 55,217,126,244,136,131,131, 3,222, 88, 93,225, 79,254,193, 31,242,139, 15, 62,102,216, 31,209,106,198,
-244,156, 33, 14, 52,185,112,140, 71, 37, 6,203, 82, 39,102, 48, 41, 25,101,211,196, 35,102, 10, 73,193, 89,167,196, 25,251,223,
- 34, 88,199,205,134, 65, 88,169, 64,249,136,199,164,145,210, 94,238,240,225,167, 31,225,138, 49,253,172,100, 92, 9,156, 12, 17,
- 65, 92,243,157, 61,250,210,228, 25,101,220,228,107,239,190, 75,126,114,192,254,195,251,216,211, 1, 69,238, 80, 97, 76,179,213,
- 69, 7,122, 78,134, 2, 76,189, 18, 88,100,200,201, 26,174,224,147,132,188,112, 69, 44, 60, 41,126,149,195,220,252, 99,220,236,
- 52,108,140, 57,147,252, 55,101, 35, 91,235, 48,202, 80, 97,193, 12, 57, 62,237, 97,156,224,205,119,222,101,255,228,148,103,123,
- 61, 78,203, 67,110,222,184,198,241,233, 17,131,222, 49,163, 65,143, 73,239,132,241,224, 4,107, 13,247,158,236,242,217,206, 62,
-173, 78,147, 48,212, 20,121, 73, 35,142,184,118,101,147,209,225, 17, 43,203, 43, 60, 27,156, 82, 86, 5, 15, 30, 62, 97,173, 25,
- 48,204,134,100,147,130,131,131, 67,138,118,155,253,195, 35, 94,187,121, 5, 25, 68, 8,157,250,117, 64,148,178,179,127,194,187,
- 27, 91,116,187, 29,222,255,249,207,216, 27, 58, 90,205, 22,159,125,246, 25,214, 86, 76, 38, 19, 54, 55,215,105,181,219,236,237,
- 31, 97,149,230,198,229,235, 4, 58, 66,132, 41,173,118,135,225,176,135,192, 50,206,115, 30, 62,122, 68, 86, 20, 8, 41,137, 3,
-133, 80, 14,147,141, 49,197, 24, 25,104,202,210, 39, 73,201, 64, 51,204, 38,112,122,204,178,116, 4, 65,224,173, 83,206, 71,195,
-234, 32,194, 9, 73, 81, 26,132,146, 68, 82,243,218,235,111,208, 59,220,231,224,217, 83,242,227,125,146, 36, 32, 74, 52, 74, 24,
-132,132, 52,212, 8, 91, 49,236,247, 89, 93,233,210,104,166, 20, 89, 49,243,164,107,165,200,202,194,235, 16,148,194, 88, 72,146,
- 46, 38,243,182,215, 32,145, 4,141, 54,193,242, 50,205, 36,226,224,209, 39,220,127,255,231, 92,189,184, 73, 24, 40,162,118,155,
-184, 25,161, 90, 93, 48,150,114,239, 25,157,118,151,225, 96,200, 73,127,200,160, 95,176,253,244, 57,207,119,119,113, 68,236,229,
- 99, 58,221, 46,147, 96,159, 75,155,155, 72,103, 49, 82,188, 18,126, 48,189, 40,215,129,194,117,188,170, 91, 24,169,158, 21, 99,
- 10,177,112,120,150, 32,164,171, 9,155, 83,142, 6,179, 12,117,191, 14,247,108,244, 25,155,124,154,186, 85,115,195,103,250, 24,
-103,193,201, 89, 69,147,181, 5, 10,225, 15, 14, 86, 64,154,198,172,173,109,114,218,239,163,181,255,126,121,105, 65, 24,202, 98,
-136,192, 18, 6,126,122, 96,141,171,133, 83, 10,165,124, 65,213,218,143, 93,139,124,226,243,203,163,148,201,100, 76,220,234,146,
- 52, 27, 88,153, 48,201,124,103, 61, 25,143,104, 38, 33, 97,160, 25, 13, 6,172, 46, 45,131, 51,156,238,239,177,210,104,249,131,
- 31,202,107, 0,132,244,226, 56,177,144, 15,238,230, 33, 40,212,209,166,130,233,235,102, 30, 87, 90, 23,118,129, 15,178,169, 21,
-101,115,143,183, 49, 84,166, 34, 55,198, 23,175,202, 31,150, 68, 29, 20,166,181, 68,217,169,112, 78,212, 33, 37,246,108, 77,145,
-212, 89, 32,139,123,107, 57, 91, 17,138,151, 58,105,236,124,219,226,230, 96, 25, 49,157,156,202, 41, 57,110, 58, 73,117,245,225,
-112, 58, 81,173,127,223, 26, 46, 51, 61,244,248,226,174,124, 65,215, 26, 37,213, 89, 1,223, 20,190,229,206,234,139,112,130,105,
- 22, 13,194, 79, 72,168,168,173,104, 21,121, 94, 80,148,229, 52, 54, 21,132, 36,138, 3, 26, 13,239,172,137,162,144, 32, 12,234,
- 76,142, 57, 75, 96, 90,196,173,181, 24,231,127, 39, 45, 4,234, 43,111, 94,251, 51,177,208,173, 73,241,226,248,253,101,187,238,
-105, 52,235, 43,247,226, 47, 41,224,191,140, 36,119,198,167,254,119, 12, 13,249,101, 69, 93, 44,128, 13, 94,246,223, 20, 78,224,
-247,187,150, 60,207, 25, 12,134,108, 93,184, 8, 66,242,209, 7,239,227,140,225,237,183, 94,227,250,213, 11, 44, 45,117,120,244,
-104,135, 40, 20, 40, 5, 81, 44,177,206,162,148,156,243,144,234,199,150,173,255,232,103, 18,131,197,130, 74,112,190, 97,175,199,
-208,211,222, 94, 98,165,223,229,133,113, 68, 26,135,156,158, 28, 96, 77,129, 16,142, 78,154,208, 8, 34, 42, 83,160, 2, 69, 24,
-132, 40, 37,137,226,216,195, 79,226, 54,191,245,181,175,242,217,143,191,207,224,217, 99,108, 54,162,114, 2, 17,183, 89,185,176,
- 85, 63, 73,168,187,242,179, 20,191,179,194, 70,177,240, 0,125,113,218,240,178,191,211,249,195,222, 89, 77, 5,103, 68,147,182,
-182,148, 88,252, 94,201, 86, 53, 87,220, 22, 30,145,185,177,201,234,250, 22,143,118,118,217, 61, 56,229,176, 55,224,181,219,215,
-185,124,105,147, 34, 27,147,141,199,108,173,118,217,121,242,152,251,219,207,200,157, 32,171, 44,227, 44, 99,115,109, 9, 76,133,
- 53,150,219,183,175,211, 74, 18,118,182,159, 50,204,115,140,115, 44, 37, 33, 87,214,155,148,217,128,211,147, 99,182,183,159,211,
-235,245,201,178,220, 67, 99,242,146,102,146,162,195, 24,161, 67, 94,123,227,109,150,150, 58, 28,237,239, 50,238,159,210, 72, 18,
- 26,141, 6, 65,160,152, 76, 38,164,105,138,177,176,191,127,196,164,116,220,120,253, 11, 76,242,146,241,100, 66,210,104, 80, 85,
- 37,227,225, 0, 37,125,138,218,120, 50, 97, 60, 30,251,168,214,110,155, 36, 84,196,181, 13, 12, 87, 17, 69, 17, 89, 89, 18,196,
- 17,173,118,139, 70,171, 65,220,136, 9, 2, 69,158,141,145, 66, 50, 26,101,196, 73,138,142, 99,226,110,151,168,219, 37, 76, 83,
-194, 52, 34,141, 2,170,201,152,227,253,231, 12,251, 61,242, 34, 99,156,229,232, 40,197, 10, 77,179,189,196,165,203, 87,232, 13,
-250, 76,242,156, 70,146,210,235,157, 50, 25, 15,105, 52,210,153, 2, 92,214, 65, 74, 85, 89,113,116,112,136, 84,202,231, 39,216,
-202, 31,244,176,164,237, 38,174,170,184,243,225,135,104, 1,166,170, 72, 58, 45,100, 26, 49,216,221,165,236,251,125,254,233,201,
- 41,187,187,199,140, 39, 21,219, 79,159, 49, 24,141, 41, 42,199, 36, 43, 40, 12,232, 56,101,253,226, 69,190,253,253, 31, 50,169,
-217,221,226, 37,207,105, 41,188, 34, 59, 5, 90, 66,146, 58, 71, 32, 28, 97, 44, 8, 34,252, 8, 94,249,189,177,174,113,166,126,
-205, 16,204, 66, 75,180,244,209,161,179, 0, 40, 37, 9,234,192,168,249, 77, 17, 6,154,112,154, 44,168,124,158,250,148,191, 61,
- 87, 33, 79,187, 77,234, 24,206,233,229,222, 23,164,147,211, 30,159,124,114,151, 40, 22, 4,129, 15,204, 18,206,145, 77, 74,180,
-128, 78, 59,160,145, 70,196, 81, 68, 16,120, 4,172,172, 69, 84, 74, 43,159, 83, 30, 40,138, 44, 35, 77, 83,242,162,162,217,234,
-208,232,172, 48,202, 42, 31,234, 97, 44,152,138,241,224,148, 64,250,131, 76,239,244,132, 70,154,226,100,136,147, 1, 81,163,225,
- 53, 69,198,131, 97,140,173,176, 85, 89,115,207,167, 72,212,233,104,221,205, 96, 53,206,212, 42,118, 83,199,219,205, 84,107,204,
-198,218,214, 24,170,178,162,170, 12,121,145, 83, 20, 37, 69,101,234,125,177,155,141,222,221, 57,176,213,220,250,181, 48,232,168,
- 73,115,178, 30, 93, 11,181, 48,210,174, 51,214,133,170, 71,221,211,247,207,166, 15,117, 14,187,156,142,192, 61,132, 72,214, 31,
- 43,245, 52,163,125, 26, 32,230, 31, 15, 98,118, 77,156,186,215,124, 49,215, 65,128, 10, 3,180, 14,145, 97,136,210,122,246,253,
- 56, 51,241,152,130,101,196,188, 8,203,179, 84, 86,172,197,150, 37,101,150, 51, 25, 79, 24, 14,134,140,199,153, 7, 67,213, 89,
-233,141, 70, 99, 6,154, 9, 34, 31,146, 51, 75, 60,149,114,150, 47, 63,251,221,102,135, 15,241,119,235,212, 95, 68, 8,126,206,
-216,253, 87, 96,179,191,236,243, 22, 11,199,171,124,234,159,215,157,159,231,204,159, 69,233,189, 98, 44,239, 94, 20,222, 9,169,
- 41,178, 9, 15, 31,109,179,190,177,193,173,215,110,115,255,222, 93,238,222,253,148,203, 87,174,240,214, 23,222,161,119,114,130,
-113,208, 27, 14,121,250,124, 31, 29, 4,228, 69,229,193, 11,211, 81,224,212, 50, 40,230,209,129, 66, 74, 92,101,102,234,123,137,
- 34,212, 1, 81,168, 73,227,152,205,245, 53, 90,205, 38,205,102,131, 88, 7,132,202,119,155, 85, 62,193, 86, 57,137, 22, 72, 42,
-170,201,152,147,222, 0,179, 59, 96, 76,137,146, 33, 82, 70, 32, 67,180, 84,124,229,157,183,201, 79,143, 48,163, 30,161,150,156,
- 76, 10,140, 82, 92, 88, 91, 67, 6, 1,142,170, 22,159,212, 97, 14,245,207,123,126,154, 32,241, 86, 23, 41, 36,182, 6, 64,136,
-255, 80, 0,205,194,254,171,114, 53, 76,194, 85, 88,235,247,185, 66, 20, 20, 40, 86, 90, 13, 58,157, 14,250,198, 13,164, 12, 56,
-233,143, 73,218, 29, 84,120,194, 86,171,193,238,147,135, 92,186,188,193,181,139,235,188,255,243,143, 56,221,221, 38,203,198, 30,
-124, 97, 45,129,242,118, 17,229, 44, 95,126,251, 13,222,255,232, 62,119,239, 63,224,205, 27,215,144, 74,146, 4, 17,216,146,167,
-251, 71,244,250,125, 98,237,187, 28,225, 42, 70,195,138,215,110, 93,227,254,189, 7,196,161, 38,137, 18,198,253, 30, 78,231,132,
- 23,182,216,127,246,132, 34, 27, 83,149, 19, 70,253,130,165, 78,139,141,181, 21, 76, 85, 48, 24, 78, 56, 29,140,184,125,251, 45,
-110,220,126,131,195,126,143,162,202,201, 38, 99, 70,227, 49,221, 78,147,102,171,225, 35, 91, 11,203,104, 56,100, 50, 26,210,109,
- 94, 66, 73,136, 2,237, 17,159,213,132, 34,207,193, 66, 85, 25, 86,214, 87, 89, 89, 93,165,211,109, 16, 54, 83,156, 53,104, 37,
-232,159,244,121,178,189, 77, 81, 22,172,172,173,211,136, 52, 40, 80,177, 36,141, 83,146, 84,161, 92,142, 20,190, 35,159, 88,135,
- 54, 10,167, 99,134,195,156,113, 86,176,113, 41,164,213, 93,225,228,248,144,172, 40,217,216,220, 96,216,239, 81,230, 57, 81, 28,
-121, 15,186, 9,252, 20,171, 24, 81, 85, 99,156,211, 88, 39,252,110,184, 20,136,202,129,141,184,120,245, 6,249, 96,128, 43, 38,
- 4,129,226,224,193, 29, 86,243, 33,249,201,136, 88, 69, 28, 30,159,114,116,112,196,233,241,136,225,216,208,105,119,184,118,253,
- 42,237,165,117, 14, 14,142,216,217,217, 99,127,239,128,139, 55,110,114,109,107,131,147,135,219,152, 26,126,240,130, 45,201, 89,
- 2,152,119,234, 51, 97,149, 23,169, 77, 53, 54, 74,121,136,135,146, 83, 50, 37,179,177,253,153,116,199, 89,168, 20,103, 83, 30,
-235,232, 99,191,225,117,179,215, 93, 29,238, 98,235,189,128,143,117,102, 30, 70, 82,119,129, 8,223,229,126,225,173,155,252,197,
- 95, 42,170, 58, 60, 68,105, 95,132, 3,237,136, 18, 77,146,250, 61,173,115,194,243, 2,234, 56,211,162, 40, 25, 14,135, 4, 65,
- 64, 26,199, 52,146,148,210, 89, 66, 29,242,124,119, 23,226, 14,113,107,133,124,144,213,227,115,195,120, 52, 32,148,150, 64, 75,
-132,173,168,138,140,234,244, 24,157, 54,105,173, 45,123, 75,219, 76,192,101,235, 14,211,205, 58,242,105,122,218,180, 83,199,214,
- 29, 58,211,174,125,225, 99,157,243,251,242,169,232,213,152, 26,138, 82,249, 21,219,153, 16,147,186,229,153,142,213, 49, 88, 33,
-234, 14,254,108,147, 39,153,194,208,234, 2,166,117,173,145,168, 11,153, 80, 47, 88, 99,231,161, 42,204,220, 52,152,133,152,214,
-233,238,121,193,244,238,106,208,146,135,239,212, 52, 58, 83, 97,169,167,137,114,161, 99, 87,211, 72, 88,127,112,152,206, 96,167,
-186,128, 41, 88,118, 38,140,147,202,139, 54,133,156,221,167,198,121, 96, 76, 85, 86,228, 89, 70,158, 23, 84,198,103,126, 4, 90,
- 19, 39, 33,141, 52, 33, 77, 19,162, 36,170, 19,249,228, 75,189,252,174,158, 44,251,169,176,197, 34,254,227,199,239, 47,219,173,
- 47,178,115,255, 46,176,152,207,251,122,159, 87,132,207,115,229,127,149,145,240, 75,119,245,103, 50,225,189, 77,164,172, 10,182,
-159, 60,101,121,185,203,151,191,250, 53,118,158,108, 51,232,247,249,214,183,254, 2,165, 34,110,189,241, 22,151,116,192, 59, 95,
-137,217,219,223,103,111,239,144,131,227, 19, 38,165, 99, 48, 46, 25,229, 5, 69, 81,224,156, 35,144,138, 40, 8,137,163,136,102,
-210,160,211,110,179,190,178,194,114,203,147,162, 54, 86, 87,112,182, 32, 14, 3,194, 64, 49, 26,244, 49,167, 99,154, 74,163, 27,
- 41, 46, 14, 72,211,152, 40,148,140, 70,125,246,158, 63, 35, 90,238,178, 55, 30, 48, 25,231,181, 53, 66, 2,154, 86,218,226,107,
-239,188,197,163,143,126,129,166, 98, 48, 24,114, 50,201, 88,187,176, 69,123,185,141,169, 31,176, 47,216, 4,234,251,206, 56,247,
- 82,154,212,116, 66,227,220,231, 41,223, 95,181, 83,159, 27, 51,172,243,214,163,178,242, 79,124, 89, 85,136,210,219,194,172, 19,
-164, 27, 43,148, 69,238,187,222,195, 99,242,194,177,178,182, 65,150, 25,168, 12,199,135, 59,244, 14, 12,169,190, 64,255,232,144,
-163,211, 17, 73, 51,225,234,149,203,228, 15,158, 98,113,148,206,146, 15, 70, 92,187,116,137, 94,191,224,209,222, 99, 84, 24, 34,
-148, 98, 99, 99,139,251,207,183, 57, 26,100,236, 30, 28,177,218, 12, 56, 61, 61, 69, 74,199,107,183,175, 98,138,138,102,218, 96,
-125,117, 5, 37, 65,216, 10,105, 39, 28, 60,185, 79,220,104,208,239,247,216,126,178, 77, 43,138,113,101,206, 96, 50, 98,152,229,
-116, 87, 54,248,181,175,255, 38,235, 27, 87,113, 2,214, 87,215, 25, 14,250, 76,226,144, 97,191, 71,167,211, 38,137, 2,156,181,
- 76,198, 19,180,128,201,160,135, 18, 80,140, 39, 36,237, 38, 42, 8,105,164, 45, 34, 29, 82, 10, 77,117, 60,164, 42, 12,249,100,
- 66,166, 29, 26,131,108, 36,196,141,148,163,231,251, 8,107,201,134,125,250,210, 34, 69, 65,212,108, 33,226,168,134,159, 56, 26,
-203, 93, 92,101,185,116,243,150, 39,179,229,254, 62, 95, 14, 27, 60,250,233,207, 88, 90,238,178,178,186, 76,187,213,244, 83, 4,
- 97,233,180,219,117, 58, 89,133, 41,189,111, 93,106,197,184,127, 66,153,143, 40,148,240,116, 43,101, 9,173, 68, 25, 65, 89,121,
- 31,242,149,235, 87, 9,147, 16,161,160, 56, 57, 98,114,218,163, 28, 21,156,244, 15, 41,138, 17, 59, 79,182,105, 52,150,104,196,
- 1,221,213, 37,214,183,214,137, 27, 75,220,126,253, 13, 62,252,232, 14,159,126,252, 49,189,131,125,110, 92,190,200, 47, 30, 62,
-193,204,184,113, 47,245,234, 16, 8,208, 78, 32,103,125,223,220, 93, 50,141,127,214,117, 74,163, 18,178,190,205, 35,153,103,201,
-100, 51, 33,157,239,222,245, 20, 94, 83,167, 70, 6, 74,249,143, 95, 16, 39, 77,199,201, 30,143,106,103, 22, 41, 37,228, 28,182,
-226, 44, 72,207,239, 95, 89,233,112,114,210, 99, 48, 46,104,183,197,255,143,182, 63, 15,178, 45,203,206,251,176,223,222,251,140,
-119,204,155,227,155,199,154,187,186,170,171, 27, 13,160,187,209, 13, 98,224, 4,146,160, 56, 25, 33,202,142,160, 21,146,172,160,
-100,202, 22, 35, 36, 51,108, 82,176,101,138,182,131,182, 34,172,160,109, 42,108,146, 22, 67, 38, 77, 75, 34, 65, 0,196,208, 0,
-129,102, 99,238, 70,117, 87,215,248,230, 57,231,204,155,119, 56,243,217,123,251,143,125,238,205,155,111,170,106, 0,124, 21, 25,
- 47,235,189,204,151,153,247,158,123,214, 94,107,125,223,239,195,247, 32,244,125,218,173, 54, 97,168,156,195,221, 44,218, 66,221,
-247,150,101, 25,135,135,135, 76,253,128, 94,183,231,242,212,219, 17,203,253,101,242,100,138, 23,180,169,138,124, 94,152, 77, 93,
- 49, 25, 13, 49,186, 34, 12,124,242, 52,193,215,138,122,122,132,201, 83,108, 16, 53, 66, 51,237,114,200,173,118,249,226,118, 6,
- 52,105,210,233,230,130,184,102,204, 62, 35,178,105,219,196,205,186, 34, 94,206,132,112, 70, 83,107, 51, 79, 30,211,198, 56, 32,
-144, 93, 88,103, 75,144, 86,206,199,232,139,214,230, 69, 31,182, 83,196, 59,161,163,242,124,188, 32,152,143,190,101, 99, 47,123,
- 42,188,198, 28,123,231, 49, 11,150, 54, 99, 79, 22,245,230,227, 22,243,217,141,214, 24,221, 56,172,230,195,203,133,245,196, 76,
-237,219,160, 10,197,252,106, 99, 65, 67, 65,179,162,108,126,110, 33,230,158, 45,219, 28,146,140,174,169,170,146, 60,207, 93,174,
- 66,147,236,231, 41, 73,232,187, 92,122,223,247,241, 2, 31, 79, 57,107, 35, 70, 52, 7,150,153,248,207,233, 20,234,186,162,174,
-106,167,160,175,170,223,191, 80,238,241, 66,251,188, 98,250,113,201,106,207,251,183,159,215,217, 63,175,208,127,215,163,251,249,
- 40, 77, 97, 76,137,244, 20,121, 90,241,112,107,135,131,209,136, 23,175, 92, 38,242,165,219,181,239, 30,242,187,223,252, 38,227,
-180,192,250,145,243,244, 10,151,134, 54,157,230, 24, 25,208,237, 14, 88,234,117, 88, 93, 30, 16, 72,111,206,176, 54, 85,205,232,
- 96, 72,103,176,140, 30,238, 67,153, 51,206, 71, 96, 74, 90,107, 3,130, 56,160, 72, 71,248,158,143,148, 5,158, 39, 88, 90,237,
- 35,149,160, 40,114,186, 43, 61, 42, 33, 25,151,134,112,146, 83, 23,123,120,210, 39, 80, 46, 45,234,139,159,255, 60,217,112,143,
-195,237,135,228,195, 3,210,170, 66,181, 58,156,123,225, 42,149,117,214, 49, 99, 23, 3,114,142,145,186,207,154,118, 44,198, 34,
-242, 60, 47,250,115,175,141,217, 94,157,185,253,197, 24,115,130,251,236, 71, 49, 82, 8,138,188, 36,203, 10,242,170, 34,205, 45,
-249,193, 33,111,189,245, 22, 38, 79,185,117,173,198,146,243,224,206,117,150,151, 34, 14,199, 57, 59,195,156,149, 13,201, 43, 47,
- 92,230,254,189, 59,120, 81, 68, 93,187,189,213,198,218, 6,219,163, 29, 90,189, 14,231,206,157,231, 32,169,168, 42, 67,107,208,
-102,227,244,121,182,110,189,199,238,254, 24, 63,136, 48,218,242,240,254, 67,246,118, 19,170,188,164,211,141, 57,181,177, 6,166,
- 66,231, 99, 70, 7, 30,155,123, 7,116, 7,203,140, 14, 15,209, 69,206, 40, 73,120,253,173,207,145,214, 32, 84, 72,105, 36,107,
-171,203,100,211, 67,164,176, 40, 33,104,181, 34,130,192,169,176,181, 53, 40, 41,177, 85, 77, 54, 77,200,166, 41,129,144,174,131,
-147, 18,169, 11, 60, 9,165,209,164,211, 12, 63,156,128,169,169, 83, 69, 62,242,232, 44, 47, 17, 69, 29,132, 53,120, 66, 96,171,
-130,108, 82, 35,109, 65,175, 46,240,219, 45, 84, 28,161,171,146,233,112,130,244, 66,132, 31, 35,140, 69,167, 71,110,204,170, 53,
-159,123,243,117,118,119,183,217,223,188,195,153, 51,167, 81, 66, 80,100, 57,251, 89, 66,183,221,162,174, 43,198,147, 9, 23, 46,
- 94, 66, 96,168,139,156, 42,203,169, 93,182, 41, 74, 10,200, 50,116, 93, 96,152, 98, 4, 20, 85, 73,105, 2,124,229,113,176, 63,
- 34,159,166, 20,121, 5, 8,222,126,251,119, 57,181,190,206,229, 75, 23,152, 76,114, 52, 6,105, 75,246, 15,182,201,106,203, 27,
-111,126, 26, 15,203, 71,215,175,241,202,213, 75,120,191,246, 59, 84,181,125,102, 65, 87,178,217,169,219, 38,231, 90,112, 34,154,
-121,177,104,251,190,239,186,245,217,232,189, 97,101,203, 38, 75, 94, 45,100, 78,120,158,114,241,192,158, 71,224,121, 46, 67,126,
- 30, 71, 58,147, 87,193,226, 92,107,190,207,229,120,173,230,104,116,238,127,195, 40,228,149,151, 95,230, 87,127,245,215,240, 61,
- 9, 86,224,123,174, 59,243,125,247,245,132,176, 84,117, 69,150,229,148,101,133,148, 19,103, 57,140, 34,124,223, 35, 47, 74, 44,
- 9,126,224,211, 89, 90,113,235,145, 32, 32, 79,166, 28,238, 29,208,110,119,208,101, 78,158, 78,241,132,161, 44, 50,186,221, 46,
-121, 81, 48,240, 98,210,163, 3, 70, 7,187,116, 54,206,186, 14,118, 22, 39, 59,239,206,205,137, 14,214, 46,136,254, 26,105,185,
-203, 28,159,241,240,171,138, 74,215, 20,245,140,149,110,169,141,105, 38,113,238,181, 62,195, 19, 99,229,241,218, 68, 41,231,249,
-247,132,131, 20, 53,207,195, 19,124,121,207,195,107, 10,186, 23,132, 72,207,137, 65,133,242,142,197,115,246, 56,118,138, 70,245,
-238, 14, 88,141,215,123,238, 91, 55,115, 81,159, 69,206,145,185,243,159,215,104,106,217,116,219, 86, 65,109,231,121,233,199,201,
-117, 11, 5,125, 70,212,107,196,113, 98,150, 13, 43,142, 31,178,185, 54,207,184,207,213,141,141,183,174,107,234,210, 21, 99,221,
- 8, 59,177, 26,235,201,147,252,150,198, 53,111,180,157,179, 66,102,150, 67, 99, 12, 85, 93,185, 67, 65, 85,163,107,167,233,241,
- 62,238,198,252,180,142,121,150,204, 53, 59,161,184,166,107,129,185,142,192, 10,251, 68,162,218,227,239, 63,171,240,138, 5, 93,
-252,252,125,251,201, 5,111,207,252,251,103, 6,136, 90,119,163, 53,218,141,229,132,131,100,120,190,196, 22,110,167,109,140,100,
- 60,205,120,247,131,143, 88, 91, 30,112,233,210,139,172,174,166,220,187,123, 15,187,179,203, 81, 86,145,233, 18, 63,104, 17,199,
- 93,150, 86, 78,145, 23,181, 67,193, 22, 83,134,155, 5, 82, 11, 76, 61,101,125,176,140,206, 45,171,237, 14,170, 44,145,182,226,
-194,198, 58, 73, 58, 69,170,144, 78,167,139, 12, 44,101,230, 65,123,133,178,244,216,122,180, 73,125,176, 71, 81,104,100, 9,147,
-236, 16,107,107,176, 33, 73, 97,209, 90, 56,101,169,134,183, 94,121,157,207,189,246, 2,111,127,253,231,136, 67, 77,233,149, 32,
- 42, 78,157, 62,139, 84, 1,194,211, 77,135, 33, 23, 16,176,226,177,117,202,252,217, 61,126,238,231, 88, 96,158,185, 67,159, 79,
-195,236, 66,151,143,120, 2, 54, 35,158, 66, 6,164, 81, 18,123,148, 84,233, 33,101, 54, 70,104, 75, 39,142, 40,138,156,100,120,
- 64, 57,218,225,197,139,231,233,183,223,226,103,190,250,203,236, 31,142, 57,189,182,204, 11, 47,116,184,251,104,151,123,247,238,
-243,153, 55, 62,197,198,218, 26, 69, 81,176,182,182, 70, 16,132, 92,188, 48,224,238,195,219,124,231, 91, 31, 81,214,240,112,103,
- 7,133,229,220,234, 50,167,214, 87, 89, 31,124, 31,185,134,163,131, 67, 62,248,246,123, 76,143, 18,148, 23,178,113,238, 37,242,
- 98,194,230,246, 14,203, 75, 1,217, 56,101,148,150,188,248,234,103, 88, 26,108,240,192,222, 39, 43,114,190,248,163, 63,196, 36,
- 45, 81, 69, 77,232, 7,136, 50, 97,180,147,128, 45,144,166,164,204, 39, 76,167, 19,150,218, 1, 50,244, 41,210,140,113,146,242,
-225,135,239,177,179,189, 73,232, 27,210,165, 37,150,151, 6,116, 90, 29,116,145, 18,248,146,189,225,152, 59,183,238,114, 54, 75,
-241, 79,175,225,229, 30, 90, 26,166, 71,251, 68, 81,151,189,189, 49,214, 72,170, 92, 99, 77,133, 53, 25, 82, 23,116,203, 62,245,
- 52, 36, 43, 53,211,164,116,200,221, 90,211,233,116, 8, 90, 49,217,116, 74,224, 11,202,124,194,114,223, 71,170,128,155,183,110,
-113,246,204,121,124, 47,112, 97, 68,184,238,124,121, 53,118,104, 76, 21, 98,133,199,254,222, 30,182, 87, 18, 80, 83, 78,221,168,
- 50, 8, 3,188,168, 67,220, 13, 9,100, 77,114,120,196, 48,133,233,184,162,204,107,134,147, 17, 55,111,188,195,122, 91,210,245,
- 2,198,251, 83, 76,145,241,237,111,127,131,238,249, 53,118,139,138,187,143,106, 62,255,185, 47,241,249, 79,191, 66,119,107,155,
- 94,110,241, 44, 72,229,138,132,156, 53,194,174, 30,162,180, 37, 68, 16, 2, 82, 24,172,180,120, 65, 83, 36,154,252,105, 23,210,
-226,130, 90, 66,223,119,248, 77,165,240, 61,183, 55,119,232, 86, 80, 82,224,121, 14, 41,235, 73, 87, 96, 67, 79, 17,249, 77,193,
-245,154,177,189,180,141,192, 78, 35,208, 11,118,220,153,120, 76,185, 53,149,173,221,168, 90,204, 60,233, 6, 91,151,188,249,153,
- 79,243,213,175,254, 26,158, 39,145, 94, 72,220,242,177, 86, 99, 76,141,196, 39,244, 34,148,116, 32,153,162, 44, 9,131,192, 89,
-253,165,219,221, 71, 81,136,231,123,172,172,172, 48,158,140,105,247, 6,120,190, 99,208,143, 71, 35, 66, 21,144, 36, 83,210,100,
- 66, 24,184, 67,201,206,238, 1, 81, 24,145,249, 5, 86, 79,241, 14,246,104, 15, 6, 88, 33, 48,214,217,115,197,140,170, 54, 63,
-164, 24,230,230,219, 70, 16,103, 76, 77, 93, 53, 5,169,210, 84,181,113,111,186,177,172,205,172, 99,218,162, 77, 35,124,117,225,
-242,243,123,141,148,238, 49, 14,124,223, 29,148, 60,199, 94, 56, 25, 8,118, 76,251,148,205,115,163,148,155,226,121,190, 83,160,
-179,208,169,243,216,228, 80, 44, 20,233,249,216,125, 70,170,107,132, 78,179, 53,175, 69,206, 15, 5, 86, 75, 60, 44,218, 72,132,
-145, 14, 74,100,205,220,102,109,197,227, 52, 85,215,181,219, 5,225,253, 92,119, 47,142,189,233, 13, 82, 13,107, 53,162,174, 48,
- 85, 69, 89,148,100, 69, 73, 89,214,232,218,173, 42,228,204, 97,161,196,252, 92,104,153, 97,110,157, 6, 66,155,227,201,137,174,
- 53, 85, 81, 82,230, 5,117, 89, 82, 20, 37, 73,154,207, 58,117,203, 83,179, 83,159,163,110,183, 11, 65, 45,179, 88, 60, 33,143,
-177,141,226, 25,251,246, 79,212, 65,219,199, 33, 53, 39,179,187, 63, 9,142,244,169, 66, 57,123,210,212, 38, 22,172, 7, 74,186,
-109,136,108,152,246,206, 14,232, 46,172,249,248, 89, 42,180,134,131,225,152,233,244, 58, 27,171,107, 92,188,116, 25,164, 34, 30,
-103,228,149,165,208,150, 52,175,152, 78, 15, 16,214, 52,169, 89, 62,186, 12,176, 70,208,237,247,233, 44,245,200, 18,139,242, 3,
- 82, 37, 64,196,220, 62,156,242,112,115,135, 90, 73, 90,123, 9, 90,104,180, 82,156, 94,221,231,149, 83,151,121,245, 83, 47, 18,
- 44,135, 68, 81, 15,175,244, 40,139, 67,134,201, 62, 55,111, 29,114,120,235, 33,190, 20,212,182,166,211,235,242,149, 47,126, 31,
- 55,223,255, 6,117,145, 18,132, 6, 43,107,218,157,136,245,181, 85, 36, 2,109,155, 29,255,130,115,196, 46, 68,168,186,199,115,
- 70, 44,122,172, 27,193, 60, 25,246,112,162, 43,159,101, 35,219,167,131,135,132, 61, 49,176, 58, 41,146,148, 72, 97, 80, 82,147,
- 77, 15, 48, 85, 73, 94,104,130,238, 26,155, 15,239, 99,170,156, 95,219,121,200,206, 11,151, 57,125,241, 42,185, 86,236, 30,229,
-148,213, 62, 47,190,112,149, 87, 94,238,130,144,236,238,237,242,234,235,175,115,255,222, 3,178,178, 36, 73, 82,206,174, 12,232,
-181,218,124,235,131, 27,212, 65, 64, 73, 69,128, 37,148,146,241,209, 33,126,232,145,107, 15, 47,110,115,230,204, 41,246,212, 30,
-175,189,249, 5,240, 91,148,197,136,124,188,205,189,251,219, 88, 33,185,242,202,167,105,119,150,201,243,130,238,234, 6,203, 81,
-155,222,234, 89, 70, 15, 55,137,162,128, 98, 58,226,240,193, 77,148,208,244,250, 29, 74,237,180, 3,117,150,112,235,163, 15, 92,
-212,237,116,194,112,154, 99,107, 77,224, 73,238,220,185,193, 78, 24,208,107,117, 24,116,251,116, 91, 49, 86, 90, 30,110,238,112,
-227,214, 29,246,119,183,216,223, 90,229,252,198, 26,237,216,167,150, 22,233,197,236, 29, 36,156, 61,127,153,254,160,135, 31, 24,
-194, 16,148, 46, 40, 39, 99,180, 10,217,220, 61, 66, 5, 49, 97, 20,129,174,240, 76, 13,190,135,173, 42,106, 93, 32,117, 14,182,
-102,208,235,178,189,115, 68,154,230,156, 57,125, 26,165,124,132,231, 59, 46, 67,153, 83,150, 53,126, 20, 51, 88, 93,163,211,237,
-146,229, 19, 54, 55,135,180,195,160, 57, 12, 10, 58, 75, 78,164, 38, 84, 69, 54, 26,115,176, 95, 98, 76, 72,150,103,220,184,246,
- 17,235,203, 29,206, 14, 58,236,236, 76,184,113,247, 1,247,223,255, 22,210, 76,121,248,155, 21, 63,252, 19,127,138,247,174,125,
-139, 95,252, 87,223,226,223,255,159,254,121, 94, 58,123, 17,243,112,151,192, 19,140, 43, 59,183,119,206,189, 36,214,226, 3,109,
- 43, 8, 48,168,230,192,233,249, 2, 95, 57, 22,130, 43,222,222,188,128,184, 78, 93, 54,157,177,239,138,250, 66,119,174,148,112,
-161, 56, 74,225,251,146,208,243, 8, 2,255,248, 0,224, 9,100, 19,115,234,186,239,153,250,219, 28, 19,173,172,152,251,136,133,
-112,194, 50, 7,189,114, 74,233, 75,151, 47,178,188,178,194,193,225,161,251, 88, 41, 9, 61,133,174,116, 83, 59,221,194, 63,140,
- 34,172, 53,132,161, 19,206,185,216, 83,195,210, 82,215,169,165,203, 28, 79,133,132, 97, 76,109, 96,154, 37,148, 85, 69,154,164,
- 76,198, 83,234,170,164, 44, 44, 81, 20,114,247,222, 3, 46, 95,186,194,209,120, 10, 65, 1,251, 17,131,245, 85,252,184,229,198,
-232,186, 65,182,218,227,159, 71, 10, 48,194,117,143,218, 84,232,202,165,247, 85,101, 77, 85,105,106,109,155, 4,187,153,239,156,
- 38, 76,199, 21,115,151, 92,214, 8,221,154,201,136,106,220, 5,158,146, 4,158,215, 60,174, 22,185, 80,212, 23, 39,122,199,177,
-172,199,188,120,169,164,131,101, 53,246,183,199,239, 65, 39,128, 57, 66, 52, 60, 17,231, 68, 16, 13,113,205,206,199,237,179, 90,
- 44,221,250,193, 26,164,146, 88,237, 78, 19,194,136,199, 16, 34,143, 37,174,205, 19, 91, 30, 11,148, 17, 11, 46,167,230,123,192,
- 2,181,198,150, 5,117, 81,144,101, 5,105, 90,144, 23,181,195, 69,131, 19, 99,134, 1,126,232, 8,134,110, 16,177,144, 0,103,
-155,188, 89, 26, 81,119, 93, 83, 21, 37, 69, 86,144,167, 25, 89, 94, 50, 57, 46,234,207, 31,123, 63,107,156,122, 50, 1,109,241,
- 99,142,207, 7,207,218,137,127,220,232,253,187,241,191,127, 55,251,250,231,126,238,194,110,253,216,230, 38, 23, 10,211, 73,140,
-226,222,222, 30, 31,237,237, 53,113,150, 33, 74,122,116,130,136,186,212, 88, 33,241,195,144,192,119, 59,220,202, 10, 42, 11, 73,
-154,178,157,108, 81,105,159, 86, 43,198,107,251, 12, 86, 79,113,106,101,153, 55,175, 92,165, 29, 69, 88, 91, 35,108,129,169,198,
- 80,142,201, 39,143, 56, 74, 70,136,251, 9,168, 8,107,125, 98,175,162, 18,138, 23,174,190, 69, 86, 73,246,222,223, 71, 82,209,
-137, 21,173,208,240,246,237, 15, 48,133,225,254,104,159,100, 50,226,226,197,203, 4,113,212, 4,182,240,196,228, 99, 14,231,121,
- 26, 6, 86, 60,182, 50,121,202,116,231,120,100, 38,156,112,136, 5,134,191, 56, 38,234,205,195, 7, 22,174,157,217, 62, 83, 72,
-231, 37, 71,212,140, 38, 19,103,183, 74, 75,178, 97,142,231,121, 76,211,154,131,105,206,230,239,126, 68,231,163,123,180,219, 45,
-122,145, 36,140, 98,190,245,238, 45, 94,255,244,139, 92,188,112,145, 48,106, 83,215, 53,203, 43, 43,188,247,254,251,220,125,176,
-197,133,157, 11,228, 70, 99,164,160,170,171,102,250,162, 57, 76,166,236,236, 31, 48,232, 68, 20, 86,145,166, 41,248,146,206,242,
- 50,126,187,197,225,100,194,160,235,211, 10,214,152, 30, 37, 8, 17,179,182,118,133,241,100, 72,187,165, 8, 60, 15,105, 75,198,
- 7,219,216, 98, 76, 93, 21, 12, 19,205,193,246, 67, 6,253, 14, 58, 11,153,100, 25,203,107, 27, 8,157,241,240,238, 29,238, 92,
- 75, 49,149,166,213,221,160,191,212, 71, 88,197,214,214, 67, 36,134,126,167,197, 67, 1,173, 40, 38,108,181, 25, 79, 19,188,208,
- 67,219,154, 71,219,155,152, 42,231,252,185, 51,200,184, 79, 59,236,178,185,123,135,163, 36,225, 13,255, 83,156, 57,179,238,216,
-212, 66,243,112,107,155,238,202, 6,163,241, 8, 99,198, 44, 45, 45, 17, 72,137,205,115,231,139,174, 12,105, 54,193,247, 44, 81,
-219,197,184, 10,109,185,126,237, 58,105,146,160, 60,201,250,218, 26,221, 78, 11,223,247,208, 85, 73,145, 36,128,229,197,151, 95,
- 66,232,146,108, 50,162, 46,114,210, 36, 97,117,109,141, 78,111,137,209,116,196,209,209,144,163, 97, 66, 93, 7, 36,233,148,143,
-174,125,135,182, 15, 23, 87, 95,226, 40,183,252,194,219,239,243,222,239, 94,163, 91, 22, 44,183, 20,253, 65,135,127,241,143,126,
-153,191,240, 19, 63,198,127,241,119,255, 41,255,240,167,126,134,255,227, 95,253,143, 56,191,210,167,213,246, 16,163,227,160, 17,
- 23,220, 97,144, 22, 98, 32, 22, 2,223,184,189,122,160,104,160, 57, 77,151,231, 9, 60, 95, 17, 4, 30, 97,224, 19, 6, 46,218,
-215, 87,238,166,169,164,131,202, 72,233, 20,238, 82, 54,163,112,207,141,223,125,213, 64,101,212,177,178,125,214, 77, 46,198, 76,
- 63,254, 26,112,100, 54,211,160,118, 77, 19,126,162,176,182, 70,121, 1, 95,254,242,231,249,167,255,236,231,169,170, 28,140,194,
-243, 66,124,229,227, 9,213,120,228,157, 71, 60, 12, 67, 60,165,208, 90, 55,130,185,146,209,104,140,239,249, 60,122,180,201,210,
-242, 58,211,201,148,184, 31, 50, 60, 60,164, 44, 74,114,149, 82, 20, 57,117,149,163,148,224,232,112, 31, 41,160,170, 10,178,188,
- 32,104,197, 4,195, 33, 59, 55,111,209, 91, 93,163,183,188, 66, 86, 85,243, 17,180, 20,179,215,175,251,127,173,221,152,189, 40,
-106,202,162,162,168, 42,234, 74,163, 13,110, 95,174,143,129, 49,179,218, 5,242, 68,188,245,204,117, 48, 91,113, 72, 41,240,149,
- 68, 41, 15,165, 44, 82,152,231, 78, 89, 79,174,255, 22,132,106, 31, 87,212,103, 45,136,104,216, 4,246,216,105, 51,235, 47,236,
- 76,204,108,164, 11,162,177, 10, 43, 21,182, 97,103, 24,183,236, 62,150, 28,137,197, 49,252,115,162,166,143,185, 48,205,222, 95,
- 55, 0, 30, 67, 89, 86, 20, 89, 78,158,231, 78,228,214,248,206,131, 48, 32,140, 34, 55,245,242,221,122,235,132, 85,111,222,190,
- 59, 24, 79, 85,107,202,178, 34, 75, 11,178,204,185, 90,146, 52, 67,189,245,234,165,159,148,143,161,238, 22, 49,177,207,235,124,
-197, 51,199,223, 98,193, 19, 42,158,171,124,127,158,111,125,177,184, 62, 15, 42,243,120,222,251, 39, 45,238,143,255,185,209,199,
-182,140,153,181,173,172,221,152,169, 94,224, 17, 43,233,108, 62,190,239,147,164, 9,202,243,232,117,150,156,133,194,243,209, 22,
-210, 60, 35, 47,107,151, 8, 86,148, 72,191,133,140, 66,186, 43, 61,194,110,159,118,119,141,238,160, 75,153,143, 72,143,246, 56,
-120,116,159,195,251, 31,113,248,232, 22,117,153, 51,232,250,136,241, 22,175,188,249, 5,222,250, 67,127,148,239,251,210, 23,185,
-241,225,135,252,187,127,229,175,242, 23,255,189,255,144, 56,140, 40,146,146,191,254,191,255, 47, 57,216, 63,226,215,127,243, 55,
- 64,192,155,175,189,129, 87,103, 12, 90,150, 60,211,248, 94, 64,171,213, 98,227,244, 25,144, 18, 35, 45, 86,186, 23,239,113,167,
- 46,142, 19,136,102,235,147, 89,156,221, 9, 15,232, 12, 33,185,200, 95,126,242, 69,167,102, 54,144,102,103, 57,219, 81,158,200,
- 95,110,126,247, 60,239,184,115,242, 60,162, 48, 64, 73,192,106,146, 52, 99,176,186, 78,171,219,231,229,151, 95,101,154,166,140,
-106,193,254,180,164,170, 42,150, 90,110, 10,210, 94, 90,101,237,204, 25,199, 99,215,134,118,187,227,240,187,198,112,239,254, 3,
-210,162,226,193,214,142,243,188,207, 22, 93,205,139, 92,104, 77,104, 10,166,251, 7, 28, 30,142,184,123,111,139,209,100, 74,119,
-176, 14, 94,132, 23,120, 88, 61, 69, 1,145, 31,146, 21, 37,103,206,157,231,104, 60, 68, 9,131,169, 75, 38, 71, 7,248,210, 80,
- 76,143,152, 28,238,160,116,194,112,239, 17,163,131, 29, 38,227, 17,101,145, 83,149, 57,233,116, 76,183,219,118,171,148,186,166,
-221,234, 50,157, 78, 80, 74, 56,208,205,238, 30,113, 28,163,107, 67, 20,181, 64,121, 8, 21,224,251, 1,218, 64,167,211,163,221,
-238,226,135, 49,119, 31,238, 16, 4, 33,151, 46,159, 39, 77, 71,124,248,193,187, 28,238,237, 81,103, 37, 82, 73,250,131, 37, 86,
- 79,157, 97,237,204, 25,190,243,246,219,152,170,162, 72,166,148,233,132, 98, 58,164,152, 78,169,242, 20, 99,107, 38, 73, 66,146,
- 87,132,173, 30, 27, 27, 27, 8, 33,216,218,124, 68,187, 21,209,239,118, 26, 59,151,231, 80,175, 70,147,231, 46, 18,212,247,125,
-150,215,214,157,237, 10, 40,138, 18,173, 45, 55,110,220,163, 21, 15, 48, 6,222,121,231,155, 8, 81,242,242, 11, 23,104,121, 45,
-126,235,198, 62,255,175,175,254, 22, 85, 97, 8, 13, 76, 10,141, 95, 9,122, 49, 28, 30, 37,156,126,245, 28,191,243,254, 29,126,
-224,205,215,232, 32,249,149,119,222,103, 63, 45,155,162,126, 92,112, 2,160, 39,160, 43, 4, 93, 4,161,178, 68, 1,180, 90, 10,
- 63,132, 32, 86,142,254, 22,197,196, 97, 76, 28,133, 4,129, 79, 20, 6, 4,161, 71, 16,184, 93,185,231,201,121, 33,247, 61, 53,
-247,138, 59,235,219,236,205,141,223, 61,223,155,255,191,106, 48,161,178, 9,226, 16, 18,103,113,154,113,105, 77, 53,143,175, 85,
-194,117,151,198,214,104, 93,113,234,204, 89,222,249,214,219,120,202, 52, 19, 49, 67, 20, 70,243,123,207, 60,251,161, 73,227,170,
-171, 10, 41, 21, 88,168,181,158,211,214,122,253,101,218,221, 30, 65,212,230,230,237, 59,206,179,239, 41,166,211, 49, 90,151, 72,
- 44,155, 91, 15, 57,119,238, 44, 85, 85,145,151, 25, 81, 20, 33,180,161,156, 38, 76, 71, 19,124,165, 26,197,189,158,143,217,235,
-170,158,231,190, 23,165, 27, 21,231,121, 77, 81, 86,212,181, 67, 95, 59,117,251,140, 12,199,220, 18, 59,183,140, 41,133, 31, 4,
- 4,129,187, 78,252, 89,214,183,175,154,105,137,187, 79,200,185,175,255, 41,247,255,134,234,167, 26,232,139,242, 60,119,143,117,
-164,154, 70, 17, 46, 62,118, 74,187,176,120, 95,104, 50,237, 19,218,135,121,226,153,117,221,240,204,122,231, 82,211,124,164,239,
-187,232, 97,207,119, 76,144, 5,161,223, 60, 45,206, 30,195,185,108,163, 27,114,193, 72,206,129, 80, 21, 25,211,241,148,201,100,
- 74,150,185,162, 14,182,137, 87,109,211,238,180,136,226,216, 89,232,124,207,197,188,206,181,249,199, 99,107,163, 93, 65, 79,211,
-156, 52,205, 72,179,140, 44, 47,152, 38,153,235,212,173, 93,160, 49, 61, 54,228,254,100, 15,216, 83,246,170,198,206,119,180, 79,
- 43,230, 31,215,129, 63, 45,122,245,241,204, 93,196,226,174,221,206, 79, 79,207,234,252, 63,201,116, 64, 45, 32,104,133,116,169,
- 60,162,217,233, 47,118,183, 82, 57, 59, 67,187,219,193, 34,152,102, 5, 7,195, 35,140,144, 68,189, 30, 27,231,206, 98,149, 71,
- 89,105,198,211, 41, 89,145, 51,222,219,193,238,151, 72, 19,210,107,173,209,239, 41, 34, 79,242,165, 31,254,179,188,242,210,139,
-252,242, 63,255,199,188,254,198,167,248,183,255,151,255, 43,160,228,239,252,111,255, 42,237,245,151,248,220, 87,126,156,149,142,
-226,239,255,221,191,207,112,100,104, 13, 46, 66,120,138,223,248,237,247,249,247,135, 19, 60, 17,224,171, 8, 33, 32,240, 34, 46,
-156,187,200,141,119,110, 49,157, 76,232,116,122, 28, 30,142, 88, 74, 75, 58,125,223,217,107, 16, 79,213, 55,156, 56,237, 62,197,
-109, 96,159,209,161, 31, 43, 85,221,233,121,241,144, 53, 19, 37, 45, 78, 56,172, 53,142,242,181,112, 32,155, 11,148,148, 36,144,
- 62, 54,240, 8,219, 93,234,202,176,178,178,198,185,243,231, 89, 94, 91,229,149,113,193, 55,190,253, 30, 55,223,127,135,218,192,
- 43, 47,189,202,168,146, 44,111,156, 37, 12, 20,123,219, 91,220,189,119,159,189,189, 3,242,178,100, 52, 77, 81,158, 71,228,249,
-148,198,193, 68, 66, 41,241,164, 79,169, 11,231,239,173,125,118, 15,247, 25, 78,106, 50, 3,231,206, 47,227,249,109,124, 63, 38,
-157, 30, 33, 67, 67,161, 19,202,122, 76,101, 70,228,197, 14,129, 50,232,172, 96, 58, 57,100, 60, 25, 81,167, 71,164,211,132, 34,
-155,178,190,188,132, 48, 21,123,123,251,140,167, 5,253,229, 37,194,131, 3, 90,157, 30, 23, 46, 92,160,174, 13,147,201,148,131,
-225,152,149,213, 53, 38, 73,130, 82,138,115,231,175,242,232,193, 67,122,237, 14,239, 62,184,199,234,250,128,186,214, 84,218, 16,
-199, 45,142, 14,167,220, 44,238,113,233,226, 5, 86, 87, 86,121,251,155,223,160, 63,104,241,210, 11,151,233, 93, 58,135,143,135,
-212,134,233, 36,229,198,157,187,188,254,105,197,233, 51,103,249,236,155,111,112,255,206, 29,210,233,132, 97,154,144,101, 35, 48,
-130,110,167, 75,171,235, 66,106,142,210,148,164, 24,114,233,252, 69,206,157, 61, 77, 93, 23, 78, 40, 87,149, 14,134, 18, 6, 24,
-109, 9,124,159, 97,158, 83,229, 25, 97, 16, 16, 26,139, 21,146,195,225, 17,121,150, 50,158, 20,172, 44,159, 37,203,107,190,243,
-238,183, 57, 26,237,115,254,236, 42, 8,193,158, 81,252,131,159,255, 26,187, 89,205,196,106,144,130,101, 33,153,102, 53, 81, 0,
-123, 55,238,243,250,155, 63,128,146, 30, 59,187, 71, 44,175,157, 37,246, 98,148, 25,185, 14,182, 65,100, 98, 4,190,181, 68, 82,
-224, 97,240,172,192,151,182,129,186,152,121,220,170,167, 92,225,142, 67,103, 23, 13, 67, 55, 74,247,253,227,131,230, 44,225, 74,
- 53,221,152,148,174,219,247,125,213,116,154,238,207, 60,239,228,193, 84, 44,224,147, 17,246, 24,144, 34, 26,214,248, 76, 45,222,
-120,184, 49,110,247,142,180,244, 58, 1, 95,252,194,231,248,173,223,250, 77,148,148, 84,101, 73, 38, 19,176, 46,108,166, 29,196,
-142,111, 95, 59,194,152, 39, 21,166,185, 6,178, 60,167,172, 28,153,109,134, 85, 61, 26, 14,121,244,240, 17,131,193, 10,210,104,
-146,201,152,229, 65,143,253,131, 93,116, 93, 49, 88,234,179,191,191, 79,173, 75,132,213, 36,163, 35,238,239, 15, 89, 61,117, 6,
-164, 96, 80,157,166,183,186,140,105,178,185,171,178,162, 42,107,215, 81, 22, 21,101, 89, 83, 86,150, 74, 67, 93,187,181,220,108,
-127,110, 27, 57,187, 43,230,205, 10,173,137, 14,149,158, 90, 16, 44, 54,218, 3,217, 76, 4,100,179,202,104, 8,125, 79,211,110,
-205,217,112,115,209,222,236,222,212, 84,169,199,166,193, 79,212, 22, 97,177, 82, 52, 99,113,225,248, 64, 52, 49,127,200,249,191,
-101,103,157, 55, 98, 33, 93, 77,156, 76, 90,155, 59, 30,204,177,237, 90, 60, 57,189, 62, 73,195,113,206, 8, 99,106,172,169,168,
-171,146, 34, 43,201,211,156,170,168, 92,222,134, 16, 72, 79, 57,251, 90, 43,196, 11,220,225, 69,121,206,151,110,102,107,167,230,
-176, 40,172,179,196,205,172,210,198, 58,242,254, 76,160, 88,107,253, 52,245,187,125,166, 47, 93,124, 12,158,245, 15,130, 56,247,
-221,118,217,243,223,155, 34, 97,191,139,177,251,227, 63,159, 60, 97,219, 18,115, 53,173,120,140,248,102,155, 29,143,242, 61,130,
- 40,226,238,189,135,180,122, 3, 46,188,112,137,170,214,108,237, 28,240,112,251, 22,147,220, 49,153,123,189, 14,131,213, 13, 46,
- 92, 58,203,237, 59,215,249,195, 95,249, 19,124,239, 27, 95, 98,116,120,151,159,253,197, 95,224,251,126,232,223,228,212,153, 13,
-126,245, 87,254, 21,239,124,112,151,189,169,192,234,154, 78,220,226,155,191,243,219,124,233, 7,126,132,101,213,229,236,169, 21,
- 54,239,222,134,105, 70, 91,133, 28,236,237, 51, 25, 30,130,177, 72,161,192, 90,238, 63,216,226,194,159,254, 49,110,190,247,117,
- 4, 21, 69,154,210,105,117,201,178,156,238, 82,220,220,104,228, 51,227, 84,231,197, 93,216, 19,118,145,231, 21,244,185, 82,117,
-177, 19, 87, 51,160,131,156,199, 10, 46,198, 32,206,198,239,243,241,156,156,117, 64,146,192,147, 72, 17,115,176,183,203,237,219,
-119,225,214, 61,190,245,237,119,249,226, 15,254, 32, 85,158,178,182,212,101,240, 61,159,229,214, 71, 31, 48, 41,225,244,185,139,
-164,101,205,240,104,202,230,246, 46, 55,175, 93, 35,136, 2,164, 23, 96,165,203,186, 14, 60, 31, 81, 85, 14,217, 25,132,248, 66,
- 50,170, 43,170, 90,179, 59, 76,121,237,204, 89,244,131, 7,108,116,123,248, 97,140, 49,134,228,232,128,233,209, 33, 58, 50,180,
-195, 10, 41,114,172, 78, 56, 58,120, 72,236,119,209,149,165, 76, 71, 28,108, 63,160,215,186,140,178, 53,186, 42, 25, 14,199, 46,
- 13,173,179, 66,103,165,195,135,215,110,240,214,231, 46, 96, 45,108,110,237, 51, 73, 75,162,246, 18,149,174,184,126,251, 1, 65,
- 24,147, 76, 18,140,217,195, 23,150,209, 97, 65, 85, 21, 28, 28,222,163,219,109, 51, 26, 37, 84,149,192,243, 5,186, 54,220,190,
-179,205,234,160,205, 96,185, 77, 85,245,121,112,247, 1,151, 47,156, 39,157, 36, 92,185,120, 5, 25,121,100,186,226,131,247,222,
-103,127,103,135,149,165, 1,103, 78,173, 83,100, 41, 73, 58,229,112, 40,168, 43, 75, 82,212,156,221, 56,195,133,171, 87,248,214,
-123, 31,113,243,163,247,177,218,162,155,209,173,203,113,223, 37,244, 4, 81,232,211,106,183, 40, 11,137,169, 74,226, 78, 23, 33,
-132,227, 36,104,195,131,135, 15,241,165, 66,121, 29, 62,186,118,147,189,131,125, 38,227, 61,206,156,217, 96,169,215,163,182, 45,
-254,254, 47,254, 38, 31,236, 30,209,246, 66, 86,207,157,101,247,209, 35,214,145, 84,166,162, 46,160,221,181, 28,221, 29,242,218,
-249, 85,146, 73, 78,112,169, 79,191, 29,211,178, 6,131, 37,109,108, 65, 18, 75, 4, 68, 64,128, 69, 42,139, 31, 73,252, 8,164,
-103, 81,190,179,159, 5,202,173,191,130, 38, 69, 45,240,189, 6, 26,115, 12,157, 17,243,188,139, 25, 76, 11, 36, 6, 37, 20, 82,
-205, 4, 90, 52,104, 83,209,116,240,222,137,107,125, 70,163, 59, 46, 60,110,231,233,240,177,210,137,252,180, 65,250,142,215,168,
- 77,197,151,190,248,121,222,253,206,183, 27, 92,168, 96, 50,153, 16,248, 33,198,119, 0, 26,229, 5,212,117,141, 82,174,241,247,
-188, 0,207, 11, 8, 2,193, 36, 77, 8,252,144,178, 44, 9,252,128, 7,247, 54, 41,139,130,170, 44,144, 90, 83,228, 41, 66,118,
-121,244,232, 1, 75,253, 30,202,147,148, 85,137,167,156,187, 98, 60, 25, 83, 27, 77,146, 78, 49, 91,219,104, 11, 85, 85,209,234,
-245, 26, 69,123, 77, 93,215,205,200,189,166,172, 12, 85,109,155,253,185,105, 2,168,236, 44,199,214, 77, 46,213,226, 99, 34, 78,
- 68,133, 50, 27,195,207, 24,178,214, 52,123,116,199,218, 63,153,218,189,160,177, 89,144, 54, 47, 54,158,159,168,169,108, 42,190,
-152, 99, 56, 26, 46,127, 67,169, 19,230,184,224,207,254,110, 86,196,109,243, 38, 22,111,252,143,241, 59,236,162,145,237, 25,129,
- 86,110, 50,224,184,250,186, 44,169,202,130, 34,205, 40,178,156,186,170,231, 56, 88,229, 73,194, 56, 36,140, 34,252,176,225,254,
-123,106, 46, 28,158,147,112,140,179, 43,138, 74, 56, 34,167, 84, 72,233,185, 87,132,144,104, 3,149,214, 46, 79,253, 88,224,244,
-252,189,250, 39,165,183,125,183,191,158, 53,130,127,252,228,245,188,169,129, 88,124, 18,158,211,133,126, 28,110, 86, 44,236,123,
- 31,255,239,241, 52, 27, 99, 12,173, 86, 76,167,219,226,254,230, 54,183,110,223,227,212,198, 6, 97, 24,241,202, 11, 47,240,214,
-247,124,129,247, 63,188, 70, 85, 85,156,191,112,133,238,160,205,183,190,245, 54, 15, 54,247,184,112,102,132,169, 43, 70,195, 29,
-246,239,189,131,170,206,176,214,130, 95,123,231, 61, 62,124,255, 26,166, 46, 49,133, 97,243,254,109, 70,247,111,179, 42,214, 56,
-123,102,192, 71,239,191,205,214, 71, 31,160,140,102,125, 99,137,107,215,190, 69,150, 14,137, 34,159, 44,203, 56, 56, 58, 36,108,
-117, 80, 65, 64, 59, 14,216,221, 25,114,230,220, 37, 52, 21,179,140, 59, 97,213,252,194,156, 63, 22,143, 77, 67,172, 93, 44,244,
- 79, 90,137, 30, 79,242,123,188,168, 31,143,221,189, 19,222,211,227,148,164,147, 69,221,107, 58,167, 40, 10,231, 55,200,205,157,
-125,138,134, 96,134,177,236, 28, 13,121,235,141,215,185,122,106,153,183,223,221,226,165, 55, 63,207, 36, 41,104,103, 37,183,110,
-221,226,230,157, 59,156, 90, 29, 32, 61,143,188,168,232,132, 49, 66, 42,170,218,160,171, 10,163, 28, 90, 50, 47, 50,132, 23, 96,
- 17, 84, 66,114,148,101, 28,140,224,165,151, 78, 19, 68, 17,219, 71, 41,227,225, 46,173,229, 62, 58,217, 99, 56, 42,160,227,130,
- 60,178, 35,216,123,116,128, 47,246, 8,164,165,168, 82,148,168,153, 30, 29, 2,138, 48,104,147,100, 37,105,234, 14, 15, 69,106,
-185,183,157,210,187,183, 67,158,101,196,113,139, 36,183,220,188,123,207,117, 62, 26,194,208, 82, 22, 5,117,169,169, 43,195,160,
-237,209,110,249,156, 59,191,206,218,202, 10, 74,121,206,182, 98, 33,138, 98, 30,237, 12,185,127,127,147, 7,187, 35,150,250, 7,
- 4,126,192,230,118,130,180,150,237,253,132,254, 82,139,201,116,196,107,175,188,204,209,254, 62,129, 39,185,116,233, 2, 90,215,
-244,250, 61,226,184,197,210,210, 58, 31,126,116,141,251, 15,182, 81, 81,155, 75, 23, 46,243,254,251,119,184,126,253, 6,117,145,
- 50,232,119, 41,146, 41,189,118,204, 36,205, 57,200, 51,122,253, 30,158,231, 83,213,154,233, 36, 97,105,121,149,118, 28, 97,132,
-228,149,151, 95,165, 46, 42,182,247, 70,220,188,113, 11,235,105,124,207,146,231, 41,189,179, 23,184,185,155,240,179,191,254, 46,
-214,192,171, 47, 93,224, 31,253,211,255, 47,127,237,127,253,147, 92,251,185,127,193,107,107, 17,161, 41,144,161,199,209,157,123,
-124,230,133,179, 12,143,246, 40,124,201, 90,183,205, 25, 95,144, 25, 65,165, 53,149,128,200, 10, 58, 66,208, 50, 16, 73,139, 84,
-224,133, 2, 63,146,168, 16,148,175,240,252, 0,223, 11, 9,188,144,192,115,112,167,192,247, 9,125, 15,207, 63, 46, 60, 2, 57,
- 31,255, 42, 41,143, 57,231,194, 52,150,170, 99, 16,205,227, 43, 65,113, 34,236,200,237,206,103,217,225,206,120,236, 97,133, 11,
-217, 17, 2,180,174, 29,246, 20, 75,191,215,226, 71,127,248, 43,252,226, 87,191,234,198,179,218, 32, 35,167, 1, 72,211,148,118,
- 91,224,123, 97, 51,169,169,209,218, 41,185,103, 17,176, 8, 65, 20,197,248,190,207,246,230,102, 19,150,162,121,112,231, 54,131,
- 65,143,219,183,111, 49, 28, 30,112,250,212, 26,117, 93, 48,153,140, 16, 66, 33, 85,192,189,205,135, 46, 82,180, 21,115,239,250,
- 53,214,142,142,184, 92,191,200,217,176,213, 8,225,106,138,170,162,170, 52, 85,101,209,181,235,208,107, 61,163,100, 10,247,115,
- 41,183,186,152,145,217,102,135,242,121,103, 62,211, 29, 52,202,125,119,200,153,121,222, 77,115,128, 18, 96,229, 83, 11,227, 19,
-187,191,231,212,141, 39,118,234, 79,104,130,152,123,254,141, 49,238, 48,103,236, 92,255, 99,133,108,214, 15, 98,230, 85,108, 66,
-174, 30, 47,230, 60,145, 92,119, 12, 77, 19,141,184,120,193, 53,212,120,210,235,178,164,204, 50,178,212, 65,165,172,118,226, 56,
-225,249,196,173,144, 86,187, 69, 20, 71, 4,161,235,214,165,242, 26,197,253,241,189, 19,227, 84,242,212,117, 99, 21,212,148, 85,
- 73, 94, 20,110,162, 82, 85, 20,101,125,220,169,159, 44,160, 79, 25, 77, 63,102, 65,146, 79, 20, 97,158, 67, 25, 19,223, 85,113,
-127,218,232,253, 89, 66,187,199, 15, 1,150,231,140,245,159, 2,149,155, 37,143, 45, 46, 29, 78, 20,248,199, 39, 24, 11,197, 76,
-249, 46,126,178,219,235,242,169,254, 42,157, 86,155, 47,125,225,139,220,191,255,136,111,126,251, 93, 66,169,136,148,207,193,214,
- 30,213,106,206, 65,149,209,138, 58,236,236,238,177, 59, 60, 32,240,115, 14,139,156,143, 30, 62, 32,247, 20, 50,140, 24, 30, 29,
-114,235,189,111,209,243, 37, 42,153,176,185,121,159,189,221, 45, 86,122,130, 83, 23, 47,112,243,222, 14, 97,167,203,224,212, 6,
- 97,183, 77,146, 77, 72,243, 49,210,171,209,178, 98,255,232,128, 66,151, 36, 69,225, 44,111,186,230,225,189,123,180,123,109,150,
- 87, 58, 39, 25,244,226, 57,167,220, 39,222,127, 54,197, 79, 46,140,220,149, 60, 86,187,250,190,127,162,208, 47, 62,142,162,137,
-193, 61, 89,212, 37,190,239,225,249, 1, 7,195, 33,211,172,224, 51,159,251, 30,238,220,188,197, 71, 31,125,196,246,221, 45,170,
-116,202,235,175,190,204,103, 62,243, 38,119,247, 38,172,116, 87,216,220,188,199, 59,239,190,131,242, 3, 70,163, 17,113, 24, 82,
-149, 25, 85,158,225,121, 30,105, 93, 80,105,237,132, 48, 13, 12,163, 40, 50, 12, 2, 63, 12,185,120,105, 3, 38,187, 76,142,134,
- 24, 43,120,112,144,210,235, 7,244,130, 26,207, 20,140,134, 19, 38,123,208,107,199, 28, 14, 43,108,125,200,250, 90, 72, 86,142,
-144,161, 15, 66, 58,196,105,105, 40,202, 9,181, 81,236, 31,100,156,111,175,176,115, 56, 34,205, 45, 7, 71, 57, 82,194, 36, 27,
-113,106,125,131,157,157, 17, 86, 57,235, 88,150, 78, 17,158, 96,109,169,197,213, 75, 27, 92, 62,127,154,149, 65,151,229,193, 18,
- 81, 28, 59,212,102, 81, 33,164,199,229,171, 87, 41,138,146, 71,247,239,241,246,123, 31,241,206,187, 55,184,183, 61,114,190,115,
-160,253,240,144,165,150,194,199,112,184,125,192,197,139, 27,140, 39, 71,124,248,209, 50,173, 86,196,247,126,207,247,162, 75, 67,
- 58,173,240,189,128, 7,247,238,208,233, 45,193,254,152, 51,235,167,216,195, 16,199, 17, 89,158,179,187,179,205, 75, 47, 92,225,
-165, 23,175,224, 53, 20,182,186,214, 76,146,148,189,253, 67,118,183,119, 56,115,230, 12, 69,158,209, 10, 91, 76,166, 67,170, 90,
-208, 27, 44, 83,218, 12, 91, 31, 82, 87, 25,147,180,230,191,253,217,175, 51, 45, 28,253,237,253, 91, 55,249, 27,255,233, 95,227,
-230,237,123,108,151, 21, 43,189, 24, 41, 42,170, 90, 98,199, 41, 43,129,225,214,225, 35, 14,166, 67,214,150, 6, 44,121,130, 88,
-250, 12,167, 25,194, 66, 91, 72, 58, 72, 98,171,241, 45, 40, 31,164, 15, 42,144, 4,145, 71, 24, 5, 4, 65,216, 88,217,220,117,
-232, 55,157,122, 16,184,189,184,179, 74,169,249,157,204, 21, 24, 11,168,230, 90,181,141,157,169,233,222, 23,196,113, 79, 22,149,
-230,198,210,132,159, 96,108,227, 43,174,157,139,198, 19, 88,131, 83,109, 55, 66, 83,173,107, 94,127,243,117, 62,248,224,125,238,
-220,185, 79,183,219, 33,138, 98,130, 32,160, 46,114,151, 87,208,234, 97, 13,206,206,153, 78,233,118,187,232,218,221,175,166,211,
- 4,207, 31,178,180, 60,101,111,127,159,188,112, 80, 19,229, 75,194, 40,228,222,189, 59,244,123, 61,122,189, 30,251,251,251, 84,
- 69,137, 84, 62,251,251,251,236, 13,135, 20, 53,200, 86,159, 86,187, 75,167,187,196, 52,201,121,240, 96,139,181,181,117,170,202,
-184, 34, 94, 27,106,237, 32, 50,198,186, 25,137, 35,171,113,236,245,111, 18,234,132, 20,115, 45,130,131,120, 53,200,220, 6, 32,
- 51,211, 96,205, 82,222,176,245,113, 60,235,124,186, 97, 23, 58,243,133,194, 57, 47,166, 79,169, 40,207, 88, 15,158,200, 91,183,
- 44, 24,198,143,213,245,243, 14,125, 30,196,178,216,192, 29, 55,114, 39,114, 57, 30, 31,104, 47,150,133,197,204,246,230,125, 71,
-142,171, 40,203,130, 60,115,111,186,110, 30, 79, 33, 8, 66,159, 86, 59,166,213,110, 17,182, 98,188, 48,112,235, 74, 33,209,179,
-245,124,243,195, 27,227,118,243,101, 81,144,103, 57,105,146,146, 36, 41, 69, 89,186,233, 74,229, 14,126,222, 44,141,102,182, 38,
-144,139, 39,131, 5,182,187,108, 44, 80,199,211, 8, 49, 15, 79, 56, 81, 4, 79, 20,247,199, 31, 14,113,194,166,246, 73, 59,252,
- 69, 68,222,199,141, 95,212, 99, 31,251, 56,118,118,254, 92,136, 25,113,221,141,217,177, 46,222,241, 36,154,125, 97,246, 46,103,
-118, 2,220,137,183, 65, 70, 10,107,217, 88, 95,231,104,148,208,138, 67,222,254,230,239,176,188,178,202,214,246, 22,121,153, 98,
-148,101,127,188,205,169,100, 21,240, 80, 86, 33,171,140,241,193, 45, 34, 95,226, 35, 57,220,185,206, 75,231, 6,132,237, 1, 37,
- 17, 34, 59,228,220,198, 57,166, 47,189, 73,245,219,223,164,127,170, 77,119, 99,137,157, 95, 29,178,253, 96,135,159,253,153,255,
- 31,215, 63,122,143,155, 55,239,240,127,249,191,253, 61,246, 15, 39, 28, 36, 71,152,192,163,172, 42,166, 73, 69, 59, 92, 97, 88,
-111, 99,180, 97,124,116, 0, 86, 99,244, 5,172,106, 50,125, 79,244,233, 79,203, 39,150,199,238,126,123, 18, 28, 59, 95, 37, 46,
- 68,232, 42, 49,139,173,148,243, 23,252, 98,167, 62,239,112, 56,190,102, 28,173,203,107,246,107, 78, 60, 19, 4, 62,105,105,121,
-180,185,195,238,206, 62, 55,131, 27, 92,121,225, 10,185, 16, 76,222,189,201,157,221, 41, 71,249, 13, 94, 46, 60, 46, 94,185,204,
-189,251,119,249,157,111,126,131, 32,246,233,117, 58, 4,128,153,230, 44,251, 10,163, 36,217,180,196, 8, 65, 13,248,141,143,191,
- 18, 2,227, 11,148, 54,156, 13, 67,162,170,166, 28,215,236,238,214,224, 9, 6, 27, 49,120,112,255,238, 30, 93, 43, 49, 9, 24,
-165, 56, 40, 50,172, 82,172,172, 13, 40,117, 74, 85,123,120, 97,155, 73,233, 68,102, 43,107, 29, 70,163, 3, 70,147, 20,229, 89,
-210,209, 33,245, 56, 97,117,169, 71, 43, 94, 97, 60, 61,164, 42, 75,134,251,251,244, 58, 29,242, 36, 39,240, 5,161, 18,156, 63,
-183,202,139,175, 92,225,234, 11, 23,104, 69, 1, 82,107,252,198,214, 82,107,205,112, 50,225,112, 56, 34, 41, 43,242, 52,163, 99,
- 51,222,124,101,131,239,253,204, 37,110,222,216,226,231,126,243, 67,110,237,143, 24,213,138, 60, 13, 88, 82, 21,173,113,202,189,
- 59,247, 41,173,100,227,236, 69,118,247, 14,249,218,175,252, 26,167,214,150,233, 45, 13, 24, 37, 41, 15, 54,183, 57, 24, 79, 89,
-219, 56,227,212,182,182, 34,157,140,185,250,226, 75,180, 95,122,153,195,225, 1, 90,120,120, 18,170,218,165,109, 21, 69, 73,153,
-231, 32, 20, 66,122,224,183,152,214,130, 68,123,136,160, 69,111,229, 20,123,195, 45,116,150,131, 47,249,234,219,215,120,231,222,
- 8, 3,228,210, 80,151,146,255,246,159,255, 60, 90,192,154,182,212,129, 97,185, 35,169,166, 5,195,137, 34, 86, 45,250, 75, 49,
-113, 16,210, 9, 91, 40,171,168,107,237,144,176, 82,208,177, 16, 91,131, 47, 12, 97, 0, 97, 27,130, 16, 66, 95, 46,216,215, 60,
-188, 64, 33, 61,217, 56,199,164, 27,107, 42,209,216,211,100,115,175, 88,136, 9,158,145,232,230,240, 26, 55,181, 83,184,235,219,
-221, 14,154,244,174,102,127, 62,179, 74, 27,235,178,221,133,177, 72, 93, 53,200, 16,235, 82,194,132,117,119, 25,161,154,172,119,
-144, 70,226, 99,248,145, 31,249, 17,254,233,127,255, 63,224, 7, 49, 82, 40, 52, 16,117, 20, 82, 4,196, 97, 11, 33, 44,157, 78,
-136, 49,154,170,206,168, 74, 67, 85,228,160, 13, 71, 71, 99,118,118,247,248,190, 47,124,129,225,100, 76,187,221,225,229, 87,175,
-160,139,154,135, 15, 30,226,123,224,121,146,173,237, 45,192,199,232,154, 59,247,239,147,217,128,176,189, 76, 86, 7,248, 58,226,
-254,238, 17,253, 82, 48, 48, 49,163,201, 35,148, 18,172,174,175,128, 54,104, 42,116,179,138,243, 60,217,132,177, 40,152,233, 22,
-230,175,111, 23, 81, 58, 91,181, 33, 22, 1, 64, 52,130,175,102,143,109, 42,208, 22,137,158,131, 2,231,137,106,179,251,248, 44,
- 63,164,153,156, 32, 5, 86, 10,140, 20,120, 56,102,190,155, 72,219, 39, 90, 14, 97,143,109,209,243,134,116,161,217,159, 39,118,
-202, 5,202,221,220, 89,193,201,251,221,220,247,214, 8,107,141, 65, 24,215, 32, 8, 43,155,175, 47,142,113,179,243,189,191,155,
-216, 56,129, 92, 73,157, 87,148,105, 73, 94,214,148, 90, 99,133,117, 44,132,200,195,143, 3,100,224, 33,131, 0,225,185, 38,193,
- 52,185,176, 51, 18,158,214, 53,198, 84, 84, 89, 78,149, 37, 20, 73, 58,135, 58, 85, 53, 84, 13, 87,223, 87,222,239,141, 40,247,
-113,227,242,143, 3,195, 28,143,173,126,111,163,251,103,145,233,158,183, 38,248,184,136, 80,241,148,166,222, 46, 62,169, 79,227,
- 89, 9, 71, 66,210,117,205,100, 60, 98,185,215,231,238,195, 77,150, 87,215, 72,146, 41,135,135,251,148, 69, 70,150,165,236, 31,
- 28, 80, 86,238,137, 78,178, 41, 85,149,211,235, 46,209,110,183,153, 76,134,236, 31,108,227,133, 10, 21, 72,190,250,203, 63,199,
-222, 43, 87, 73, 15,247,105,213, 21,127,247,111,253, 77, 90,173,144,189,237,125, 36, 62, 63,251,143,255, 9,167, 78,173,243,198,
- 11, 87,217,158, 20,100, 81,140,151,250, 84, 70,162,100,200,131,205, 93,206, 92,188,202,245,247,190,205,210,210, 10,147, 81,234,
- 70,106,101, 69,216, 14, 92, 44,172,144,159,140,239,255,180,238,253, 57,207,199,211, 86, 36,179,110, 92, 52,184,196,217, 65,205,
- 83, 2, 79, 53, 84, 47, 37,137,148, 68, 9,197,187, 31,125,192,193,246, 46,129, 80,220,248,240, 6,143, 30, 62,226,236,229, 43,
-252,208, 31,249, 81,174, 93,191,129,180, 22,207,243,121,112,231, 46, 15,239,220,101,173,211, 33,175, 28,128, 65, 40, 15, 21,182,
- 48,190,162, 52, 53,147, 60,161,106,190,174,215,172, 13,102,168, 69, 37, 64, 97, 56,218, 57,160, 40,106, 14, 74,203,122,183,197,
- 82, 38, 8,234,154, 42, 55, 28, 86, 21,177,144,196,177,135,150,138, 51, 23,207, 98,172,179, 7, 69, 97, 72,183,219,161,219, 83,
-180,194, 54,113,224, 19, 69, 43, 40,207,137,208,246,183, 15, 81, 6, 46, 94, 57, 71,110, 44,129,167, 24,111,103, 76, 68, 70, 29,
-134,236, 15,167,180,164,224,202,133, 85, 94,122,241, 42,203,107,171,136,176,205,238, 40, 97,247,112,200,157,251,143,216,220,222,
-103, 56, 74, 73,139, 10, 83,107,206,158, 63,199, 75, 47, 92,102,235,250, 71,156,107, 75,190,244,217, 23,249,222, 79, 95,228,213,
-151, 46,241,139,191,241, 14, 63,255,141,143,120, 56, 45, 56,144,112, 88, 8,186, 67,193,114, 55,228,237,183,175, 19,196, 1,123,
- 7,251,124,234,234, 25, 46,156,215, 92,186,122,149,254,218,105,118,246, 14, 48, 70,227,251, 30, 73,158,147, 74,120,248,224, 62,
-103,206,158, 33, 80,138,107, 31,125, 72,232, 73,166,147, 49, 75,253, 37,234,170, 98, 58, 30, 83, 27, 88, 90, 62, 98,237,212, 89,
-202,218,146, 79, 71,248,109, 31, 91, 79, 81,229,148, 52,133,180,213,225, 95,190,123,147, 68,231, 40,161, 29, 93, 84,216, 70,180,
- 20, 33,100, 65,220,175,185,176,226,145, 71,134, 97, 10,165,182,220,184,191,205, 31,106,119,233,174,109, 32,252,128,122,154,208,
-145, 2, 79, 64, 91, 24, 66, 1,190, 15, 81, 87, 17,183, 92,170, 85, 16, 52, 94,244,198,138,230, 55, 59,244, 89, 39,233, 41, 57,
-183,171, 73,197,220, 70, 57, 19,246,138,121, 76,178, 99,125, 31, 23,119,121,194,194,182,248,126,227, 48,114, 93,166,177,160, 27,
-152,203, 28,188,232,196,103,110, 55,238,138,157,169,103,153,228,150, 51,167, 78,241,253, 95,248, 2,191,249,155,191, 77,191, 55,
-160, 44, 43,252,192, 67,226, 99,180,193, 83,150, 86, 20, 82,213, 53,121, 94,224, 7, 45,164,231, 64, 54, 65, 16,144,102, 41,167,
-206,158,225,204,153, 13,146, 52, 65, 42, 15, 97, 37,127,241, 47,254, 69,110,221,186,206,237,187, 55,168,140, 37,207, 11,164,240,
-217,217,155, 64,220,161,165, 74,194,184,164, 28,142, 48, 2,140, 12, 49,140,136,194, 16,165, 36, 69,181,205,217,179,103, 8,130,
-144, 60,207,209, 74, 59, 29,145, 82, 78, 80,232,169, 5,109,129,152,119,234,114, 22,108, 34,196,177, 88, 86, 90,172,148,110, 58,
-103, 13, 70, 55,170,245, 38, 31,221, 88, 57, 27,112, 44,236,171, 79,180,192,243,195,212,140,169, 97,165,108,120, 89,226, 41, 99,
-240,231,235,128,236,227, 45,255, 49, 91,235,233, 28,148,134,166, 55,119,252,204, 80,216,115,142, 61,115, 11, 29, 11,226, 62,163,
-107,234,170,164, 42, 29, 33, 48,205,114,106,173, 27, 41,130,154,147, 2,163, 40, 34, 8, 92,135, 46, 16,205,181,100,230,212,199,
-186,118, 26,135,170,202,201,211,140,116,154, 48, 25, 79,153, 76,147,198,113,226,166, 52, 78, 40,234,127,119, 69,253,147, 20,230,
- 79, 82,220,127,175, 62,242,223, 11,114,246,169,186,128,217,190,228, 99, 10, 61,243,209,207,211, 66,102,142,167, 8,101, 85,128,
- 53,140, 39, 35,134,163, 33,201, 52, 33,138, 2,166,147, 17, 82, 24,119,115,240, 20,182,212, 88, 12,163,209,136, 91,183,110,113,
-235,134, 19, 34,221,123,120,143,239,124,243, 27, 84, 89, 70, 89,229,220,189, 59,162,156,110,115,249,212, 41,126,224,251,191,159,
-213,149, 1,189, 65, 15, 35, 60,242,218, 69, 42,164,197,148,221,237,219,172, 3,163, 81,129, 41, 53, 34,240,144,194,227,218,173,
-219,252,153, 63,250, 3,252,234,207,255, 52,201, 36,165,213,238, 80, 25, 77, 94,148, 4,237,176, 81,141, 62,198,104,127, 82, 51,
-247, 68, 31,255,201, 10,190,125, 34,112,224,196,227, 54,139,181,156,189, 40, 23,118,242, 66, 56, 33,216,157, 91,183, 57,125,250,
- 44, 75,237, 22,183,110,126, 68, 86, 86,188,251,157,247,185,244,154,224,205, 55,223,164, 46, 11,118, 30, 62, 98,103,107,139, 58,
-207,137,253, 0, 79, 26, 38,101,193, 97, 90,224,251, 33, 71,121,198, 52, 77, 41,154, 49, 91, 32, 5, 45, 47,192, 52, 62, 81,217,
- 64,179,242,178, 68, 99,153,214,150, 3, 41, 24, 31,101,188,214,238,225,215,154, 90, 67,237, 73, 10,109,232,198, 62,203,203, 3,
- 52,150,209,100, 2,198,178,186, 54,192,154,154,229, 65,143,100,146, 80,226, 83,150, 41,158, 50, 36,147,148,118, 43,102, 50, 77,
- 88, 90, 93,226,222,163, 77,146,209, 4, 99, 4,195,170,230, 40,157,210,247, 5, 87, 78,111,240,210,139, 87,232,118,186, 76,179,
-138,155,239,222,228,219,239, 95,231,206,246,144, 73, 89,207,111,116,224,198,113, 47,156,123,137,255,224, 63,251, 91,252,187,127,
-254,127,196,240,254,125,210,163, 33,159,253,226,139,188,254,234,171,252,248, 15,188,201,114, 71,242, 75,223,186,201,189,189,156,
-157, 28,242,160,197,120,191, 32, 28,142, 89,234,123,224,133,228,132,132,189,101, 14,198, 46,234, 84, 91,195,246,206, 54,175,190,
-242, 10,254,242,128,163,195,125, 38,147, 49,123, 59, 91,156, 59,119,150,208, 87, 4,189,142, 11,120,241, 61,146,241, 8, 33,192,
-247, 61,234,170,100, 50, 30, 35,188,128,218,122,140,234,146, 73,145, 16,162,201, 85,151, 27, 59,154,135,195, 9, 66, 25,151, 19,
- 2, 88,105,177, 40, 60, 13,171, 29,203,133,243, 33, 81, 54,193,250, 18,225, 1,190, 96,146,164,228,149, 6, 63,192, 11, 99,194,
- 73, 66,208,168,221, 35, 1,113, 4,113, 91,208,234, 5, 78,221, 30, 6,132,190, 34, 10,125,194,208, 39,108,172, 84,158,239, 17,
- 6, 65,131,121,149,120, 13, 29, 78, 52,194,216,217, 88,214,217,171, 26,109,145,181, 39,136,150,162,185,227,203, 5,128,146, 56,
-110, 7,143, 25, 15,194,204,239, 57,198,104,102,203,122, 93, 59, 27,154, 39, 29, 5, 77, 42,209,228,139,215, 88, 97,121,227,141,
- 55,216,221,217, 99,123,107, 23,169, 36, 85,165,137,252,160,201,243, 22, 84,101,137, 31,198,236, 29,140,233,175,244,240, 98,119,
-112,146, 94, 64,158, 23,236,237,108,211, 95,234,210,235,245,208, 6,138,188,196, 8,201,167, 62,253,105,240, 36,191,248,203,191,
-138,242, 58,236,110,237,179, 63, 44, 81, 85,142,106, 27,142, 38, 83, 36, 62, 94, 16,145, 63,218,102, 60,205, 24, 44, 13,232,118,
-218, 76,146, 20,172,164,213,138,105,119, 58,116,151, 92, 51, 80,235,186,177,154,185,157,186, 84, 51,151,192,241,154,237, 56, 77,
-108, 65,119, 32, 92,232, 14, 6,215,177, 35, 26,184,139,104, 72,173,226,177,130,107,231,108, 11, 33,154, 3,151,176,115,251,173,
-157,233,116,236, 39, 95, 33,158,172, 5,226,100, 70,137,253,152, 58,240,148,183, 89, 33,159, 21,120,187,192,221,182,198,161,192,
-117, 89, 83,230, 37, 89,154, 81, 85,174, 0,207,234,134,187, 62,253,121,195, 99, 27, 78,253,220, 86,221, 8, 22, 29,193,175,162,
- 44, 10,178, 52,101, 58, 73, 24, 79,166, 36, 73, 78, 85,187,207,145,194,101, 8, 40,165, 62,174,168,139,223, 87,167,254,180,200,
- 86,219,216, 25, 30, 47,198, 79,132,202, 63, 39,153,237,187, 21,232, 61,213,114,240,172, 2,181, 40,186, 56, 49,190,127,242,123,
-154,139,194,148,162,170, 10,170,170, 66, 73,193,185,243,231,121,225,234, 85,146,233,148,218, 24, 60, 37,185,125,235, 38, 8,197,
-100, 60, 69,107,195,181,235, 35,167, 40,142, 3, 46,156,190, 64, 63,140,216, 88, 89,102,105,208, 35, 12,125,202,116,138,210,154,
-237,241, 1, 91,163, 45,234, 50,163,229, 7,212,121,201,248,240,128,181,213,152,218,100,212,182,205,246,163, 45,231,157,164,198,
-243, 12,119, 30,222,101,249,236, 95,224,252,197,171, 20,163, 9,211,163, 49,247, 30,221,115,254, 82,227, 86, 44,198,216,103,218,
-255,158,167,129, 56,126, 60,196, 83, 21,159,207, 42,232,243,142, 93, 46, 30, 6, 23, 56, 3,205,233,219,143, 2,250, 43, 43,252,
-198, 55,127,135,229,126,143,165,165, 37,142,118,246,104,245,150, 16, 69, 69, 58, 28, 18,199, 17,198,104,142,198, 71,238,243, 76,
-133, 31, 40,168, 4,133,214,140,138, 4, 97,181,251, 90, 82, 16, 69, 17,212, 21, 26, 73, 13,152,230, 64, 97,177, 76,171,138,229,
- 48,112,127, 14,248,113,139,173, 44,193,139, 3, 70,149,225,194,185, 21,234,209,152,149, 83, 27,132,173,152,251,143, 30,146,231,
- 21,237, 56,162,214, 2,101, 53,201,100,132,209,150,201, 36, 33, 73, 38, 72, 41, 73,167, 57, 65, 52,224,236,229, 11, 36, 7, 7,
-120, 85, 77,169,107, 50,223, 35, 43,106,148,144,116, 98,159,139, 23,207, 18,197, 49,219, 7,135,252,238,141, 91,220,222, 25, 49,
- 46, 52, 37,130, 90,136,121, 78,183, 16,110,227,251,171,191,246, 27,252,241, 63,253,231,152, 28,236,176, 82,215,248,155, 21,245,
- 47,125,132, 30, 11, 46, 92,189,192,231,222,120,145,203,231,214,249,103,191,248, 13,222,125, 48, 33,177, 26, 25,134,180,253,154,
- 51,103,214, 88, 94,238,179,127,184,207,251,215,111, 19,199, 46, 17,112, 48, 24,224,121, 62,105,150, 98,235, 26,165, 20, 89,154,
- 18,250,138, 60, 77, 8,123, 29, 60,207,195, 88, 75,150,229,132, 97, 4,184,200,201, 78,167,139,239,251,164, 69,141,106, 47,179,
-187,255,128, 81,154, 19,166, 25, 94,107,141,239,188,253, 62,153,177,232,121,119,165,193, 42,164, 9,104,219,146,243, 29, 75, 71,
- 25, 42, 27, 51,169,106, 50,235,225, 71,109, 94,125,225, 37,206,172,174, 83,158, 75,233,182, 91,100,135,194,141,219, 21,132, 33,
-180,219,130,168,235, 19,181,124, 90, 97,139, 40, 8, 9,124,233,114,220, 67,159, 40, 10, 9,195,160, 9,101,113, 30,244,153,218,
-218, 83,202, 89, 87,165,116,168, 84,173,143,193, 83,130,199, 66, 70,196, 44,254,227, 9,161, 41,243,206,241,120, 93,103,165,179,
- 76, 41,229,205, 25,224,198, 58, 17,155, 80,198,249,172,133, 68, 74,237,190,190, 54, 32, 44, 95,249,202,151,249,229,175,254, 50,
-123,251,135, 46,193, 44,112,118,175, 32,244, 49,104, 10, 3,211,220,112,243,189,107, 68,113,135, 65,127,137,184, 19,210,239,119,
-233,117,123,212, 69,198,214,163, 17,103,207,157,199,139, 35, 39,152,242,125,222,248,204, 91,228, 90,240, 79,254,187,159,227,225,
-131, 49, 70, 74, 58, 94, 76, 90,104,172,173,232,181, 91,104, 43,168, 43,195,206,222, 33,251, 7, 71,196,113, 72,183,221,161, 42,
-107,214, 86, 87,209,181, 5, 90, 44, 45,117, 9,130,128,188,200, 93,183,222, 68,149, 74,117,108,101, 21, 51,253, 76,211, 81,207,
-139,251, 44,235, 65, 58,206,175,197,121,176,157, 48,177,201, 5,183, 46,107,220, 90,129, 53, 26,225,205,214,128,170,177, 22, 51,
- 79, 64,155,239,190,197,147,162,186,231, 21,244,199, 91,244,249,138,213,206, 18, 53,237, 2, 60,220,158,152,192, 31,239,248, 23,
-212,237, 98,241,235, 52,133, 94, 27,108, 93,161,171,138,186,104,104,111, 89, 65,217, 20,105, 48,243,200,222,217,184, 94, 27,141,
-173, 29, 39, 95,215, 78, 24, 57,139,177,213,117, 77, 85, 86,205, 30, 61,103,154,100, 76,166,206,151, 62,183, 19, 54, 66,227, 48,
- 8, 29,251,253,153, 62,191,231,128,102, 62,174,184, 62,175, 99,183, 11, 69,242, 89, 93,251,243,146,216,158,182,103,127, 90, 8,
-201, 83, 11,251,204,131,253,216,148,193, 26,243, 84,139,215,252, 52,198,211, 97, 43, 0, 97, 24,114,254,220, 89,172,149,124,207,
-231, 63,207,191,252,149,175, 81, 27,205,181, 27,183, 17, 82,144,107,131, 31, 69,132, 97,200,250,218,128, 94,183,139, 39, 20, 81,
- 16, 64, 93, 18,216,154,100,111,155,123,187,155, 76,215, 6,180,218, 45, 20,146, 80,120, 4, 97,204,218,250, 26,117,153, 17, 5,
- 1, 86, 27,178, 94,151,178, 58,162, 29,120, 28,165, 16,183, 99,146,170, 66,138, 18, 93,167,236,238,237, 16,180, 59,200, 32,198,
-243, 53,210, 43,136,219, 61,116, 51,252, 22, 11, 48,134,103, 58, 10,236,239,113,132, 98,159,173, 76,117, 47,122,154,142,200,206,
-133,114, 44, 32, 21, 63,188,121,139,107,183,111, 50,201, 51, 38,105,198,214,158,194, 42, 65,128, 71,251,240,136,177,242,121,127,
-103,139,110,183, 67, 16,135,164, 69,206, 56,207, 32, 53, 72,161, 28, 45, 14,129, 39, 29, 46, 52,244, 60, 23, 5, 89, 89, 10, 91,
-185, 24, 72,225, 49, 83,161,100,214,144, 40,193,210,114,159,124, 56, 69, 26,131,215,246, 57,164, 70,251,146,241,116, 74, 47,240,
- 28, 29, 48,138,121,180, 51,162, 29,194,202,160,207,209,112,204, 96, 41, 32, 75, 11,198,227,132,213,181,101,146,244,128,110, 43,
- 70, 32,153,228, 5,189,158,199,100,123, 23,207, 15, 25,231, 5, 59, 89,133, 4, 6,158,228,234,185, 13,226,200,231,131,235, 55,
-185,187,187,207,131, 81,202,176,178, 24, 33,209, 77, 1,153,221, 90,108,131,172,172,171,154,253,189, 7, 88, 79, 51, 2,138, 74,
- 98,134, 30,191,250, 75, 31,176,177, 59,228,135,190,252,105, 46,117,187,252,232, 43, 23,145,250, 46,239,239, 37, 28,165, 22,218,
-146,164,200,233, 21, 33,151,175,188, 64, 16, 4,100, 73, 66, 86,106,228,100, 74,224,249,140, 70, 35,250,109,103,171, 57,215,239,
- 83,150, 57, 97,224, 97,173,101,119,111, 31, 33, 61,198,211,196,133,102, 24,219, 40,181,115,186, 97,135, 56,110,225, 85, 6,145,
- 14,201,143,246, 8,131,128,195,188,230,254,225, 17,181,138,155,241,152, 70, 89,141,176,130,208,194,197,174,229,135, 63,219, 37,
- 27,105,240,207,146,249, 37,137,153,114,245,202, 43,188,246,185, 43,156, 91, 30, 48,221,223,227,252,217,117, 70, 91, 15,136, 36,
-116, 91, 18, 47,132,168, 27, 16,119, 29, 66, 53, 84,161, 27, 99,206,109,107,178, 25,197,187,162, 46,155,113,174, 20, 52, 49,170,
-199,162, 46,139,117, 4, 49,115,220,125, 49,119,102,204,155,237,133,224,143,217,238,221, 62,134, 51, 21,200, 6, 5, 43,140,117,
- 69, 92,184,165,173,231, 5,199, 5, 66,219,249,142,223,243,148,219,187, 26,135,147,254,202, 15,252, 0,191,240,139, 95, 37, 43,
- 11, 20,224, 43,143, 90, 27,178,170,162,146, 1,239, 92,127,128,198,227,226,229, 85, 10,235,145, 22, 6, 47, 41, 89, 89,245, 16,
- 42,196,152,130,189,221, 29, 86, 87, 78,161, 4,142,239,223,142,248,220, 91,111,177,183,159,241,247,255,155,159, 33,110, 71, 24,
- 36,227, 73, 74,233, 91,116, 9, 89, 89,178,180,178,236, 20,248,141, 74, 95, 73,197,112,164,152, 76, 83, 58,237, 22,253, 81,196,
-232,168, 75, 16, 6,172,175,175, 17,183,226,102,117, 97, 93,113,247,212,194, 52,206,137,206, 84,211, 77,155, 70,123,228,138,184,
- 69,122, 62,101, 45,208, 86, 35, 2,133, 41, 43,180,133,178, 46, 81,248,110,244, 46,132, 83,232,203, 0,132,135,182,224,207,252,
-226,226,164, 30,104,102, 67, 19, 79,177,190, 61,123,130,123,162, 8, 60,166,123, 59,190, 7, 90,219,140,215, 57, 46,230,214,204,
-246,231,118,206,121,159,239,233, 27,230,188,235,210, 43,202,204,137,218,138,162,164,104,132,108,178,201, 76,119,171,162,227,137,
-131, 53, 6,211,164,221, 25, 61, 35,208,185,224,151,178, 40,201,210,156, 36, 73, 25, 79, 82,166,105,142,174,181, 3,250, 40,133,
- 31,184,131,108, 16, 4,199,157,250,211, 20,238,255,186,127,125, 82, 15,251, 31,244, 47, 49,139,207, 59,230, 26, 62, 93,113, 57,
- 59, 0, 60, 38,189, 92, 28, 25,207,198, 40, 2,248,214,183,223,229,209,230, 33,158,239,211,237,247,249,212,107, 47, 19,134, 62,
- 73, 81, 49,154, 78,201,242,156, 52,157,178, 59, 61, 66,152,134, 76,103, 52,175,191,112,137, 23, 95,121, 1, 95, 88, 58,189, 14,
- 66,121,148,185,198,179, 62, 75,189, 54, 65,168, 24, 38, 41,187, 59,123, 84, 69, 73,232, 89, 44,154, 73, 61,101,100, 98,114,163,
-208,194, 96,109,134, 39, 67,242,188,192,138,144,165,229, 13,174,223,223, 97, 58, 73,233,246,150, 8,162,150, 75,159,211,245,220,
-189,240,123,141,169,125,222,112,231, 89,135,189,185,211, 96, 14,172, 57,249,247,117, 93,115,227,250,117,190,248,133, 47,178,181,
-187, 77,150, 36,220,191,255,136,172,172, 9,163, 22, 86, 8,142, 38, 99,246, 15, 15, 81,161, 59,233, 6,161, 79,141,102,120,152,
-226,251,238,223, 12,176,172,244, 98,170,162, 98,146, 22,115,206,189,187,175,168,249,129,114,105,169,207,104,116,196,118,146,179,
- 46, 61,122,173, 54, 85, 93,208, 10, 66,116, 85, 51,232,199, 20, 73,193, 97, 81,210,233, 78, 88, 81, 17,145,175,232,118,218, 12,
- 15, 71,116, 99, 31,163, 35,198,227, 9,190, 31,145,166, 53,121, 1,161, 15, 71,135, 21,167, 47,159, 71,120, 62,133,177,108, 62,
-216,102, 98,156,152, 37, 86,240,217, 23,207,114,250,204, 10,105,158,242,104,127,200,163, 81,206,176,130, 90,138, 19, 98,196,153,
-120,231,196,141,202, 10,188, 10,150, 61,133,213,112,246,211,159,226,236,167,174,242,247,254,201, 63, 33,166,226,181,179,103,137,
- 91, 1, 95,121,227, 2,217, 55,174,115,109, 88,179,151, 24,190,125,115,143,228,116,206,121, 35,217,216, 88, 39, 73, 50,170,170,
- 70,174,173,146,154, 28,107, 12,237, 40,166,215, 95,230, 96,111,135, 86,228,147,164, 25,105,150, 83, 25, 67, 50, 77,231, 49,161,
-198, 88,188, 32, 4, 47,198,111, 45, 17, 68, 1, 70, 87,248,249,132,190,167,136, 58, 45,118,239,110, 17,232,156, 0, 69, 5, 40,
- 99,136, 45, 72, 81, 51,136, 5, 63,246,133,243,124,250,165, 46,195, 29,184,240,218,151,104, 15,119,185,244,217, 37,218, 81, 72,
-232, 73,100, 93,184,157,241,153,117,110,198,130, 94,232, 19,134, 22,191,227, 19,116, 34, 90, 97, 76,203,143, 8, 2, 71,139, 11,
-155,209,186,239, 57, 52,172,211,188,200,121,178,218, 12, 42,229, 82, 1,157, 26,189,169, 51,115, 91,175,105,178,183, 93,103, 40,
-143, 59,204, 57, 0, 69, 55,221,227, 44,244, 68,156, 88,204, 30,239,220,221, 13, 92,235, 6,138, 35, 36, 22,229,172, 72,118, 38,
-200, 83,184, 69, 4,212,117, 73, 28,249,252,240, 31,250, 65,190,254,235,191, 65, 58, 77,157,143,222,243,168,240,120,247,250, 93,
- 70,133, 96,117,109, 29, 47, 90, 34,234,244,137,218, 29,162,110, 11,225,181, 17, 50, 32,201, 15,155, 96,144, 3, 4, 10,233, 9,
-218,180,241,195, 14,127,236, 71,191,140,231,133,252,131,127,252,207, 41,178,148,180, 16,244, 91,146, 34, 41, 8, 91, 30, 71, 71,
- 7,120,210,119,235,196,162,192, 90,203, 52, 73,208, 90, 19,199, 17,235,131, 62,182, 54, 40, 79,146,231, 37, 43, 43,203,172,172,
-174, 16,197,145, 43,122,114, 97,189, 38, 23,225, 30, 2,213,132,162,204, 80,167, 6,139, 17, 30,211, 50,231,254,195, 77,110,223,
-190,199,225,254, 8,180,165,215,233,209,138, 66, 86, 6, 61,206,159, 63, 77, 47,140, 49, 66,225, 9,151,170,166,236,241, 98,228,
- 68, 19,119, 76,100,253, 68, 26,170,239,190, 86,125,204,250,113,102,213, 53,110, 15,174,235,138, 42,111,186,244, 36,165, 40, 10,
-234, 90, 35,133,211, 3,205, 72,123,243,209,187,157,141,221,205,156, 66,103, 27,107,100, 93, 85,228, 89, 70,158, 21, 76,167, 41,
- 73,146, 81,150,122,174, 99, 8,131,128, 40,242,137, 35,231,117, 63,209,169,219, 79,108, 62,251,131, 41,232,207,203, 76,255,215,
- 86,204,231, 8,212,199,246,228,143, 55,168,139,227,148,199,148,226, 79,250,179, 37,126, 43,230,181,215, 94,161,211,221,162,215,
- 95,102,154,164,236,239,239,185, 48,140,218,146,228, 5,189,126, 7, 79,106,144,146,126,183, 15,218,146, 76, 70, 68,157,144,118,
-183, 69,168, 4,126, 24,112, 52,201,200, 18,205, 82, 55,198,168,154, 66,151, 84, 10,252,149, 85,138,180, 70,245,123, 4, 45,197,
-178,172,121, 33, 94,102,245,101,195,219, 55,190,195,205,187,239, 34,144, 4,170,205,205, 27,155,156, 62,115,129,235,223,249,160,
-137, 44,116,207,110, 85,107, 60,121, 60,181,152,191, 0,254,128, 31,243,167, 21,116, 99, 12, 86,202,103, 30, 36,124,225, 17, 74,
-143,223,250,245,223, 66,249,138,239,255,222,207,241,210,229, 43, 76,178,154, 73, 86, 97,109,201, 7, 31,188, 71,133,225,224,240,
-112,238,192, 48, 89,233,196, 61,218,208, 10, 3,190,255, 51,159,226,223,249,183,254, 2,119,110,220,224,191,249, 71,255,140,131,
- 73, 70,220,142,217, 62, 26,147,214,213,220,201,161,139, 20, 97,106, 42, 1, 91,147,132,141, 94, 15, 81, 11,116,161, 57,183,188,
-132, 68,241,104, 47,161,163, 4,183,239, 60, 66, 5, 33, 86, 43,198,163,148,186, 40, 81,198,176, 87,215, 28, 14,115,206, 94,108,
-211,237,175,176,179,239,108, 93, 82, 73, 90,126,196,254,120,202, 65,150, 51,198, 82,214,208,149,138,171, 27,109, 94,122, 97, 29,
-131,225, 59, 31,220, 96,148, 25, 38,181,161,146, 46, 55, 89, 88,221,136,118,196,211,237,132, 86, 33,172,166, 47, 20, 75,194, 16,
-116, 44,127,234,223,252, 83,252,212,207,255, 20,211, 2,126,225,253, 27,172,246,125,206, 71,150, 23,150, 67,118,199,150,163,218,
-103,168,107,238,236, 78, 41,178,187,140,142,198,156, 57,125,138,170,168,184,117,243, 14, 47,188,112,149, 86, 39,102,239,240,136,
- 48, 90, 7,169,216,217,221,199, 83,146,168, 21, 19,197,109,186,189, 37, 76,173,241,252, 16,223, 15, 8,227, 54,210,115,191, 91,
- 25,240,112,154,179, 61, 44,208, 38, 64, 91,193, 70,175,224,207,127,190,195,214,161,224,163,131, 2, 35,219, 92, 30,156,161,215,
- 83, 92, 62,223,227,205, 11, 33,121, 49, 66,245,206,242, 96,235, 16, 47, 20,232,108,138,167, 13,173,206, 26,195,163,125,218, 43,
- 3,186,171, 75, 68,177, 34,142, 60,226,174,135,106, 7,248, 81, 72,228,181,105,121, 33, 94,232, 53,193, 45,178,137,182,117,251,
-254, 32, 8,230,249,232, 82, 58,129,151, 53, 6,164, 90, 88,253, 52, 80, 18, 99,154,238,218,145,206,142, 41,150, 6,107,196, 60,
-238,114,230,153, 54,198, 32,156, 79,237,100,114,151,153,173,230, 84, 51, 26, 93,160, 95,206, 70,254,179, 2,176, 48,169, 50, 66,
- 80, 27, 77,167,221,230, 7,190,244, 37,126,247,155,111, 51, 26,141, 17,192, 71,119,183,185,118,231,144,160,183, 65,105, 61, 14,
-134, 19, 44, 30,101,105,217,221, 59,228,250,245,155,188,242,210, 21, 58,221, 21,170,108,159,201,100,130, 20,138, 40,246,169, 14,
- 50,226,118, 69,212,178,124,229, 43,159,103, 82,215,252,215,255,240,103, 72,178,138, 42,169, 24, 44,117, 64,149,216, 50, 69, 88,
-151, 98,183,180,180, 68,146,166,136,102,119, 94,153,154, 64, 56,173,193,233, 51,167, 57, 26,142,157, 61, 43, 47, 88, 89, 89,165,
-183,220,195,247,220,186,193, 44,218,139, 23, 89, 22, 77, 81,215,192,209,209,136, 95,254, 87,191,197, 79,255,220,175,112,227,222,
- 3,166,121,141, 48,138,192, 11,232,180,218, 92, 58,127,142,183,222,124,157,219,219, 67,206,174,118,121,237,149, 23, 88, 93,233,
- 32,133,231,184, 2, 11, 80,149,121, 13, 89,152, 38,219,167,172, 74,159, 63, 88,180,159,224,131, 78,234,138, 26, 52,215, 99,159,
-122,108, 59,171,203,146, 34,203,201,146,148,178, 40,209,250, 88, 32, 28, 4,129,243,163,123, 30,202,243,230, 86,236,121,116,239,
-236, 96,160,157,125, 45,203, 82,210, 36, 97, 58,201, 72,167, 41, 69, 81, 97, 44, 4, 82,225,249, 14,125,220,138, 66,162, 56, 36,
- 12, 67,212,231, 94,187,240,147,178,241,110, 44,176, 91,142, 79,182, 60, 37, 79,123,126, 17,219, 57, 59,119,150,253,250,180,241,
-244,211,118,235,143, 63,144,139, 31,251, 56,108,230, 89,123,251, 79,162,188,127,226,207,197, 99,102, 59,187,248,188, 53,123,140,
-185,218, 80, 83, 84, 53,101, 93,163,181,105, 78,244, 13,175,188,185,105, 56, 28,165,154,251, 97,183,182,182,184,113,243, 54,135,
-135,251,152,170,164, 29, 69,132, 81, 15,109, 21, 90, 10,164,239, 44, 32,121, 94, 48,205, 10,146,170, 38,110,247, 89, 93, 59, 67,
-127,176, 78,167,191, 78,216, 89, 33,236,175,209, 90, 59, 69,171,211,103,146, 85, 24,169,240,162, 16, 21,121,200, 64,145,151, 5,
-105, 82,112,243,198, 61,172,242, 57, 28, 79,152,166, 21,120, 45,218,189,101, 46, 93,186,200,155,159,186,202, 7,239,188,131,173,
- 42,130,208, 39,136, 67,164,239,200, 78,199,193, 45, 98,145,206,112, 98, 63, 36,143,165,111,199,234,207,121,204,161,120,234,212,
-194, 29,114, 92,102,248,140,218,165, 22,224, 51,204,197, 72, 13,134, 81,186,157,144,106,132, 54, 59, 59,123,188,251,209,117,138,
-186,230,209,195, 7,236,108,111, 83, 22, 37, 74,121,220,122,116,151,189,221,125,222,124,229,101,166,163, 49,121, 89,147,213,154,
- 73, 94, 35, 53,188,241,210, 21,254,242,191,253, 63,225,223,250,243, 63,206,203, 87, 47,240,198, 27,159,230, 75, 95,254, 34,223,
-247,125,223,195,159,254,211,127,130,105,146,114,237,246, 29, 76, 35,106,242,173,165, 43, 36,149,177, 84, 8,210,170, 38, 8,125,
-186,145, 79, 91, 57,107, 82, 89, 84,164,165,166, 86,150,210,104, 58, 97, 72, 53,206,241,149,219,199,230,121,197,169,139,103, 88,
- 62,181, 76, 8,196,161,199,242,169, 13,202, 60,103,165,187,196, 4,203,245,173, 61, 34,223,199, 22, 53,129, 39,248,212,165, 37,
-150,187, 17,191,253,206, 29, 30,238, 38, 76, 75, 77,102,172,251,190, 0,105,155, 65,146,120,204, 9, 58,123,147, 22,139,100,201,
-214,188,226, 73,178,173,109,110,252,210,215, 25, 31, 78,153,234,148, 47,127,254, 20,239, 92,223,231, 48, 43,233, 4,154, 0,203,
-118,102, 24,225, 58,199, 58, 55,244,186, 17, 81, 32, 88, 90,234, 17,197, 81,195, 26, 7,141, 37, 77, 11,162,184,135,144, 33,221,
-238, 82,179,115, 23,180,226,152, 78,183,143,192,162,117, 73, 93, 87,148,101,197,100,154,178,178,178, 78,212, 25,176,191,191,207,
-157,187,247,176, 6,146,163, 35,206,174,172,178,214,233,176, 28, 24, 94,218,232,112,101, 57,102, 41,204, 81,213, 24,116, 77, 94,
- 10, 14,199, 25,198, 86,180, 34,133,194, 58, 53,112,220, 70, 70,109, 14,167, 57,147,195, 29,246, 54,111,211,237,119,136,219, 49,
- 81, 20,209,142, 98,226, 32, 34, 12,124,130,224, 56,180, 37,240, 61,134, 7,251, 68, 65, 64,167,221,198, 83,162,225,142,207,162,
- 86,103, 72,226,198,117,225, 29, 99, 95,143, 85,237,114,158, 7, 39,132,117,100,185,230,240, 46,103, 62,108, 37, 17,141, 69, 14,
-121,236,170,152, 99, 71,109,243,118,108,252, 4,219,136,243,148, 56,246, 93, 53,207,169, 49,134,178,114,187,212,208,247, 25,172,
- 44,147,106,203,183, 62,124,192,239,188,179, 3,126,140, 10, 2,164,112,252,248,180,168, 25,167, 5, 42,136,169,234,146,118, 59,
-160,223,239,178,180,188,198,180, 48, 8, 63,166,170,220, 56,247,232,112, 68, 93,129,181, 5, 87, 47,159,227,202,149, 75,220,184,
-187,201,246,112, 66, 94,185,194,145, 78, 19,146, 36, 35,244, 61, 66, 79,129,173, 73,178,132,162, 44,230, 56,210,162,118,118, 44,
- 4,140,142, 70, 20,121, 65,149,231,152,162,194,179, 78, 71,224,135, 33, 40,137,109, 2,112,220,218,195, 96,165, 34,183,138,175,
-253,214,183,248, 91,255,229,255,131,255,254,103,127,133,173,253, 67,178,202, 98, 16, 24, 33,208,214,144,150, 5,219, 7,123, 92,
-187,125, 27,233, 7, 96, 21, 71,227,148,131,225,132, 86,111,224,174, 63,233, 14,243, 46, 2,183, 41,175,198,130,149,115, 75,218,
- 19,173,152, 61,134,160,139, 70,177,110,102, 30,167, 38,100, 10,163,155,195,155, 70,204, 57,252,238,160, 39,148, 66, 41, 7,133,
-177,205,189,202, 34, 23,130,190,154,177,123, 93, 82,231, 25, 69, 90, 48, 29, 79,152, 78, 82,138,188, 68, 91,103,109,140, 67,143,
- 86, 59, 34,142, 35,130, 40,112, 78,135, 6,136, 99,106,131,169, 12,186,121, 78,234,178,162,200, 10,210, 52, 39, 73, 75,146,164,
- 36,205, 75,140, 53,115,237, 72, 28, 7, 14, 92,211, 10, 8, 91,238,223, 84,159,125,245,194, 79,206,118,230, 39, 11,102,131, 77,
-125, 28,159,186, 88, 64, 23,212,203, 98, 1,213,250,180, 98,251,100, 65,126,190, 37,234,227,138,250,199, 5,189, 60,149, 58,244,
- 4,155,247,241,231,220,160,103,145,118,149,166,172,106,202,230,119,173,221,232, 72, 10,231,207,156, 21,245, 57, 75, 90, 10,124,
- 63, 68,121, 30, 91, 59,219,110, 52,236,251,116,218,109,202, 74, 32,195,136,202,130,244, 98, 6,189, 13, 58,173, 13,186,189, 51,
-156,189,252, 18, 65, 39, 2,169,152, 36, 9,195,209, 17,183,110, 93,227,240,104,151, 52, 29,113, 52, 28,241,246,183,191,197,165,
-139,231, 56,125,122,149, 86,164,216,222,122,200, 15,255,161, 31,226,242,197,211,124,248,254, 55,249, 19,127,230,199, 88, 89, 91,
-227,218,205, 7,248,241, 18,126,208, 97,125,253, 12,127,248,143,126,133, 91, 55,111,130, 54,196,237, 22,185,201,233,246, 90,212,
- 85,190,104,218,124,198, 20,221,156, 68,239,216,227, 64,132,103, 21,245, 69,127,250,226,255, 47,170,219,141,117,188,234,185,111,
- 84, 48,103,236, 23, 69,193,123, 31,124,192,193,104, 76, 16, 4,116,219,109, 90,113, 68, 81,148,236, 30, 28,242,104,119, 7,105,
- 32, 80,138,188, 40, 73,203,146,172,172, 17, 82,241,249, 79,191,206, 95,249,119,254, 18,159,126,245, 5,150,122, 45, 71, 13,243,
- 61, 78,157, 57,195, 75, 47,191,196,229, 43, 23,121,241,197,151,249,234,191,252, 26,163,233, 20, 33, 32, 22,138,181, 86,135,188,
- 40,230, 66,185,178, 44,137,125,143, 78,164,176,182, 98,169,215, 99,146,228, 72, 95,144,164, 37,171,189, 46,201,120,130, 23, 8,
- 58,203, 61,140, 54,108, 92, 56,133,161, 32,182, 37,189,110,196,164, 72,152,140, 38,180,194,136,123,195, 49, 71,147, 28,145, 87,
-244,162, 24, 60,205,217, 21,159,195,225,152,111, 61, 24, 51,205, 45, 93, 41,136,141,160,237,249, 84,214, 82, 9, 87,180,149,145,
- 14,233,107,143,139, 4,246, 24,135,220,182,134,215, 37,108, 68,208, 33, 71, 11,143,137, 41,249,193,207,173,241,242,167,222,226,
- 23,126,243, 22,158, 16,132, 6,118, 19,205,212, 66,109, 21,161,178, 40,107,136,164,164,200, 11, 14,135, 99,166, 89,198,112, 56,
-100,121,109,141,165,165,101,132, 84, 20, 89,129,174, 43, 60, 97,193, 58,126,117,153,166,248, 74, 80,151,110,202,225, 41,137,174,
-107,140,214,172,111,172, 83,228, 25,183,111,223, 64, 88,203,189,219,247, 24,141,142,220, 1, 55, 75,241,171, 49,117,121, 8, 85,
- 74,167, 21, 17, 4, 17,202,143,104,119, 98,250, 75,109,150, 7, 75,172, 46, 47, 19,183,219,180,186, 3,114, 13,126,212,102,239,
-209, 93,146,163, 29,226, 56, 38,142, 34, 90, 81, 76,236, 7, 68, 65,224,172,108,179,124,238,192, 35,244, 3, 58,157, 22,157,118,
-219,121,213,103,248, 97,217, 36,175,121,202,253,153, 82, 40,207,145,208,102,225, 44,243,107,117,126, 77, 51,183,181, 9, 41,231,
- 62,108,165,142, 67, 75,102,217, 16, 82, 28,143,132,221,245,236, 49,203,249,126, 28, 47,106,173, 89, 92,231,206,167,134, 85,229,
- 64, 37,194, 90, 60,223, 35,106,119,201, 42,143,223,125,247, 17,219,195,140, 78, 55,160, 27,121,132, 18,166,211, 12,107,160,221,
-106,209,239,182, 9, 26,198, 67,220,233,145, 20,154,168,213, 65, 24, 67, 50, 30,115,116, 56, 36,207,115,210,100,140, 68,211,142,
- 67,190,239, 11, 95,224,189, 27,119,216, 59, 58,114, 89,235, 69, 77,213, 76,186, 90,113, 72,154, 78, 27, 54,187, 43,148,181,214,
- 20,101, 73, 94,228, 36,105, 74, 50,157,162,171, 18, 83,214,100, 73, 66, 50,157, 82, 20, 5,194, 83,132,113,212,208,249,220,190,
-221, 8,197, 48, 41,248,191,255,189,127,196,255,245,239,254, 67,238,108,238, 82, 91, 49,111, 27,230, 69,209, 13,230,177, 88,202,
-186, 98,115,107,135,201, 40,165,221, 29, 96, 9,248,232,198,109,162,184, 67,171,221, 37, 10, 34,119,232,106,130,110, 88, 80,205,
- 47,138,162,237,226,182,124,129, 57,107,230,222,114, 59,247,160, 31,115,221, 45, 86,187,107,218,217, 19,221,170, 68,121, 30, 66,
- 45,132,202,136, 38,211,221, 90, 96,134,131, 45, 40,210,148,116,154, 50, 29, 39,228, 89, 78, 85,107, 44, 22,233, 9,226, 56, 32,
-138, 99,130, 48, 64,121,142, 26,103,140,161,170,106,170, 82, 83, 21, 21,117, 89,185,110,191,170, 41,202,146,178,212,228, 69, 69,
- 86,214,110,189,162,164,115,120,132, 62,113, 28,210,106,199, 4, 81,232, 14, 10,193, 66, 81,127,154,194, 92, 46, 20,251,167, 21,
-117,113,162,168, 31,191, 24,158, 87,136, 31,175,168,207,235,194,255, 32,138,250,227, 93,186,125, 92, 67,192, 73, 0,191,110, 20,
-135,117,237, 10,122, 81,214,148,181,203, 15,158,125,173, 89, 81,119,182, 25, 15,223,243,241,154,128,151,178,172,185,127,255, 33,
-173,184, 69,191,215,103, 48, 88,166,191,180, 70,216,234,224,199, 17,173,118, 12,104,246, 14,182,152,230, 99,202,116,140, 29,143,
-185,119,235, 54,103,207,158, 71,133, 49,147,194,112, 56, 46, 89,217,184,192,103, 63,247, 38,105, 62,225,251,191,248, 5,254,216,
-143,255, 41,214, 78,159,225,253,143,174,241, 71,254,204,159,161,211,139,185,118,227,125,150,214, 79, 49, 46,106,174,223,126,136,
- 10, 58,196,173, 30, 82,250,252,241, 63,254,135, 26, 36, 35,104, 83,113, 56,218,231,194,249, 83, 76,199,135,243, 19,238,227,202,
-208, 19, 65, 21,199,146,186,121, 49,127, 90, 81, 95, 68,195, 46,226, 98, 23, 11,252,172,168,219,199, 56,251,238,198,225,222,223,
-219,219,229,237,111,189,141,242, 2, 94,127,233, 21,206,174,175, 19,122, 62,126, 24,115, 56, 73,232,246,250,120,210, 99, 52,157,
-226,183, 90, 76,139, 2,163,107,206, 46, 47,243, 31,255,229,255, 25,167,215, 87,136,163,128, 48,244, 8, 66, 31,233, 7, 13, 71,
-217, 67, 72,201,202, 96,133,157, 71,219,188,251,206,187,206, 39, 92, 27,218, 81,192,218,114,159, 34,207,145,214,208,142,124,234,
-188,192,148, 37,189, 94,139,188, 41,198,105, 90, 16, 7, 46, 26, 54,138, 37, 37, 21,253,245, 37,138,162, 66,120, 80,102, 71, 12,
- 34, 69, 50, 25,178,189,123,192,209, 97, 65,111,208,231,168,132,195,253, 17,129,180, 24, 5,190, 39,232, 8,184,179, 59, 97, 55,
-119,193, 36,171, 74,178,100, 33,246, 20, 19, 93,147, 75,199,165,158,171,107,155, 81,166, 93,196, 87, 90, 67, 23,120, 93, 8,214,
- 58,150,238,138, 37,209,150, 67, 99,121,237,149, 30, 63,242, 71,190,204,111,189,183,201,253,237,148,110,183,141, 46, 10,166,165,
-164, 16, 10,101, 13,190, 49,148,147,140,100,146, 33,148, 15,202,227,202,203,175, 32,172, 96, 58,153,160,235,156,178, 24, 99,170,
- 4, 83,103, 84, 89, 70, 58, 25, 51, 26,238, 49,220,219,162, 72, 39, 14,185, 42,192, 19,141, 90,217,143,185,112,233, 18,219,155,
- 15,233,117, 35,164, 40,192, 36,108,172,182, 88, 91,109,177,180,212,163,219,237,186,155, 82, 20, 53,157,143, 34, 10, 67, 58,157,
- 86,211,105,135,132, 81,139,168,221, 67, 6, 49, 65,220, 97,124,176,197,112,119,147, 40, 12,136,195,208, 21,243, 70,104, 20, 53,
-221,121, 16, 6, 4, 77,118,122,187, 21, 59, 66,161,114,163,120,207,115,172,119,169,148, 75, 37,155, 5,179,204, 72,104, 11,252,
-246,197,123, 26,182, 97,205, 47,164, 10,206,175,103,213,100,110, 47,222, 19, 79, 76, 24,197, 60, 91,220, 24,230, 4, 49, 26, 23,
- 3, 51,226, 26,199,212, 48,107, 44,117,165,155,200,108,131, 18,130, 56,104, 83,100, 5, 31,221,217, 33,205, 43, 20,134,170, 40,
-201,147,140, 65,183, 67,160, 28,107, 33, 10, 34,124, 63,160,213,138,177, 22,246,247,118,233,196, 62,189, 78,196,116, 60, 36, 43,
-115,202,170,196,234,154,253,221, 29,178, 44,103,227,236, 89, 62,184,121,143,229,245, 85,130, 40, 96, 50, 73, 9,226,134,104,102,
- 45,186, 40,240, 4,136,134, 99, 31,248, 94,147, 96, 89,187,191,175, 53,181, 54, 24,171,201,203, 12, 99, 12,217, 52, 65, 90,104,
-183,218,120,158,143, 70,114,127,111,194,255,230, 63,255,219,252,244, 47,126,157,164,168, 92,135, 43,101,179, 8,125,250,196,214,
- 54,129, 49,227,113,194,131,135,155,212,198,178, 50, 88, 99, 60, 74,184,115,251, 33,129,223, 97, 48, 88,113,160, 22,171, 49,212,
-174, 17,105,238, 79,243,164,201,167,221,235, 27, 97,154,104, 14, 83,114,214,180,104,237, 58,126, 99,176, 13,111,192, 54, 97, 51,
- 66, 74,119, 31,105,138,186,104,138,250,172,168, 88,107, 78,168,221,167,147, 41,201, 52, 37, 47, 74, 55,249, 53, 6,207,147,132,
-126,128, 31, 56,150,130, 83,252,219,102, 42, 92, 53,201,119,117,115, 29,185,111, 85, 55, 57,245,174, 22, 85, 24, 83, 55,249, 3,
-174, 83,111,181, 35, 23, 6, 19,185,209,187,231,121,127,176, 69,253, 89, 99,247, 79, 26,206,242,113,135,129,223,111, 81, 63,105,
- 63,120, 10,112,198, 52, 23,106,229,248,199,174, 75,119, 35,120,109, 78, 22,117,207,243, 8,195,208,117, 3,205,137, 95, 8,199,
-156,110,181,218,156, 61,123, 30, 33,157,122, 58,205,199, 76,178, 33,123,195,237, 6, 52, 16, 82, 87, 22,229,135,108,172,159,231,
-133,203,111,176,181, 63,230,207,254,196,255,152,203, 47,190, 74, 85, 9,148,240,249,129,239,255, 1,226,118,196,163,205, 45,110,
-223,189,207,181,235, 55,121,240, 96,155,180,208,188,243,157,143,248,246,187, 55, 89,217,120,145,180,242,153,102,134,173,237, 61,
- 38,163, 3,138,228,144, 59, 55,223,225, 95,252,119,255,136, 95,252,231,255, 3, 55, 62,120,151,213,229, 30,161, 39, 72,167, 99,
-183,102,176,134,197,216,194,197,149,199,241, 72,233,147, 23,245,197, 46,125, 49,157,237,241,162, 62,155,238, 28,163,101,155,143,
-149,138,186, 46,185,117,231, 54, 7,251, 99,116,154,225, 91, 75, 24, 4,168, 40,100,152, 36,244,123, 3,214,215, 79,177,189,191,
-207, 97, 50,166,172, 43, 66, 33,249,247,254,226, 79,240,169, 23,175, 16, 5, 30, 81,228,198, 80, 94,224, 35,253,230, 69,232,121,
- 40,169,216,186,255,128,150,231,179,253,112,147, 42, 47,121,233,133,203,188,246,202, 85,190,240,153,151,105,139,154,149,126,139,
- 55, 95,125,129, 87, 47,109,208,111,121, 76, 38, 83,118, 15, 18,162, 86,140, 82,130,100, 90,224,251,146,179,103, 6,196,237,128,
-184, 21, 50, 28, 38,140,134, 19, 98, 95,176,220,239,146,166, 41,211,105,225, 4, 43,173, 14, 15,246,198, 12,194, 22, 71, 73, 74,
- 41, 13,189, 86, 7, 95, 27, 30,140, 42, 66, 63,198, 55,134,182,181,180,125,201,160, 31, 51,202, 75,114, 51,147, 96, 53,126,232,
- 25,120, 99,230,145,198, 34, 13,172, 11,197, 43, 50, 64,149, 26,124,193,126,110,153,248,240,185,207, 15,120,241,213,211, 76, 68,
-143,159,249,218, 7,132, 49, 12, 2,205, 81,106, 24, 11,139,178,150,192, 90,214,122, 29,206,156, 58, 77,127,101,149,243, 87, 46,
- 81, 91,215, 41,182,162,144,186, 74,240,188,138, 64, 89, 2, 9, 65,163,212, 61,125,250, 20, 97, 24,176,190,190,222, 36,134, 85,
-128, 91, 39,137,160,195,217,115, 23,136, 91, 45,246,246,118,240,164, 70, 87, 83, 48, 41, 43,131, 37, 46, 94,188,204,250,250, 58,
-221,110, 15,111,118,115, 4, 60,229, 0, 78,182,214, 20,101, 65, 85, 25,144, 62, 65,220,161,172, 53,233,104,159,253,173, 7,180,
-227,102,220,238,249, 78,245, 30, 52,133, 60,240,231,239,251,158, 55,143, 69,150,194, 1,103, 92, 81,110,174, 69,142, 89,238, 51,
-187,213,252,239,164, 88, 24,209,186,195,237, 44,181,145,197,226, 47,165, 67,166, 10,117,236,102,183, 98, 94, 80,102,230, 43,151,
- 98, 38, 30,195,151, 31,175, 46,101,115, 16, 56,254, 0,225, 14, 0,238, 78,142,168, 52,186,172,240,253,136,131,225,136, 91,155,
- 99,198,121,197,254, 56, 39, 43, 13, 27,167, 86, 81,194, 16, 71, 1, 81, 20, 16,199, 33,237, 56, 34,110,119,152, 76,198, 72, 97,
-232,182, 92, 54,247,238,193, 33,181,182, 76,134, 71, 72,171,217, 63,216, 35,173, 53,155,135, 35,222,191,245,144, 81,154, 55, 17,
-211, 26,139, 98,125,101,153, 65,187, 75,153,165, 4,190, 34, 10, 35,132,176,120, 74,146, 23,121,115,127,108,162, 88, 77, 9, 82,
-163,132,196,228, 21,101,150, 83,100, 57,210,243, 24,142,167,252,229,255,228, 39,121,251,189,107,212, 72,199,243, 21, 14,215, 44,
-229, 83,114, 37, 30,171, 5,149,169,201,138,140,173,237,109,246, 15, 14, 88, 93,221,192,247, 90,220,191,191,205,222,193, 33,203,
- 43,203,132,145,143,165, 70, 10, 61,191,209, 47, 38,118,206,168,108,115,253,152, 49, 46,172,178,217, 95, 99,220,232,220, 54,145,
-183, 24, 39, 82, 51,141, 96,109, 38, 0,124,178,168,203,249,164, 69, 24,247, 92, 21, 89, 78, 50, 77, 25,143,167,100,105, 78, 85,
- 85,212,198, 77,102,102, 86,203, 32, 60,222,169,207,121, 29,205,117,229, 86,185,199, 35,249,178,170,201,138,146, 36,203,201,178,
-140,186,174, 17,205, 65, 53,138, 3,218,237,118,163,122,119,202,119, 33,196,211,125,234, 31, 7,144,121,106,145, 22,207, 87,180,
- 63,110,113,250,110,116, 89,143,139,234, 30, 23,216, 61, 77,120,245,248,199, 60,237,231, 89,180,193, 61,238, 77, 63, 30, 17, 47,
- 20,183, 5, 65,217, 19, 95,175, 25,211,221,190,118,131, 7, 15,119,168,106,203,249, 11,231,169, 12,248,126,151, 83,171, 3,180,
- 58,160,223, 63,205, 27,175,189,197,221,219,247, 41,234,154, 75,151, 46, 49, 30, 30,144,235,130, 95,248,149,159,103, 56, 60,224,
-212,234, 26,113, 16,242,246,183,126,135,254, 96,137, 23, 95,124, 3, 97, 45,166,170,168,107, 77, 93,249,212, 53,156, 59,125,150,
- 94, 43,166,221,110, 17,248, 30, 95,120,249, 50, 59,155,247,249,232,253,239,144,167, 19,214, 7,203,116,123,125,164,242, 88, 90,
- 90,230,224,112,159, 7,155, 15, 26,159,246,243, 19,134,158,182, 30, 89,140,100,125,246,227,234, 16,154, 66,186,100, 43,132, 89,
-152,144, 44,200,100, 23, 14, 4,179,235,173,219,235,211,110,119, 88, 25, 88,162, 48,162, 42, 11,118,182, 70,140,235,138,237,189,
- 35, 30,153, 45,148,231,163, 34,159,184, 21,147,165, 41, 63,248,253,223,203,231,223,120,221, 17,198,102, 89,215,158, 43,228,136,
-102, 95,106, 32,203, 51,222,255,206,183,185,119,243, 54, 63,248,189,159,227,203, 95,252, 18,251,195,125, 14,247,238, 67, 54,100,
- 37,212,100, 71, 35,178,157,130, 86,191,195,114,203, 35,241, 44,221, 94,200,221,209,136,211,131, 46,203, 65,151, 44,201, 28,232,
- 36,244,217,124,176,199,229, 75, 87,120,112,247, 33, 59,155, 35,172,241, 88, 95, 93,166,172, 74,234,218, 98, 38, 57,190, 31, 56,
-161,140,128,164,180,216,225, 4, 43, 44, 90,131, 53, 57, 45,165,144, 72,214, 7, 93,254,216, 31,253, 33,142,126,234,231, 24, 30,
-165,104,100, 19, 16, 97,231,251,221,185,224,170, 41,246, 3,169, 72,132, 65,214, 1,229, 81,192,118, 85, 16,158,173,240,163, 8,
- 21,180,121,225,106, 23, 29, 70,220,221,203,184,218,182, 4, 82,160, 12, 4,158,160,219,246, 9,219, 1,211, 50,229,202,197, 87,
-169,209, 32, 12,166,174,216,223, 31,177,178,220,162, 44, 11,140,213, 8, 63, 68,160,232,116,123, 88, 21, 18,246, 66, 76,232,115,
-229, 83, 87, 8,188,128, 86,220,161, 44, 53,227, 2, 62,122,255, 35, 94,127,235, 45, 66, 63,226,253,239,252, 22,107,203, 75,132,
- 34,199,151,224, 53, 60,246,193, 96,141,162, 40,153,102, 25,101,161, 27,239,174,160,168,106,164, 23, 96,144,212,198, 98,180, 38,
- 77, 50, 76, 93, 57,176,140,239,187,195,180,239, 17,120,126,147,211,173,240, 61,183, 15,247,154,209,186,148,224, 9,217,240,218,
-105,174,199,227,235,110, 22, 89, 42,173,125, 98, 15, 55, 7,147, 8, 39,118, 51,166,129,133,204,212,219,198, 98,106,141, 82, 94,
- 67, 13,179, 78, 48, 39,103,175, 11, 3, 10, 4, 10,107, 68,147,165,173, 49, 22,188, 89, 4,177,105, 14,212,178,129, 38, 27,219,
-192, 87,220, 4,208,177,209, 29, 59, 94,152,138,216,215,188,118,229, 12,143,118,199,124,112,152,145, 11,193,186, 31,144, 10, 31,
-105, 13,113,153,177, 44, 90, 24,157, 97,234, 18, 37, 90, 4,126, 64,167,219, 98,253,204, 6,185,129,237,195, 9, 82,248,212, 89,
- 66, 28, 10, 54,247, 71,236,235, 3, 70,211, 41, 37,206,130,231, 1,195,188, 98,156, 31,178,119, 48,228,194, 82,151, 83,107, 75,
- 20,186,134, 60,197,243, 67, 87,220,154,233, 69,150,185,112,146,209,196,112, 48, 12, 24,117,143, 56,127,234, 12,166,214,206, 70,
-106, 13, 81,127,137, 83,203, 43,220,188,117, 15,172,165, 50,218,133,193, 72,133, 69,159,136, 78,125,252,126,100,140,193, 10,235,
-108,127, 69,197,141, 59,215, 25,143, 71,252,217, 31,255,179,244,186, 61,174,221,124, 64, 82, 20,124,229,203,159,165,215,245,156,
-101,146,153,195, 97, 70,101,211,115,122, 31, 77,247,143,177,206, 90, 56, 27,183, 55, 95,203,145,113,204, 28, 7,126,194,241,244,
-248, 84,102,134, 9, 23, 18,211,228,165,235,170,164, 46, 42,178, 52, 37,203,114,178,178,116,205,160, 0,223, 83,196,161,179, 53,
-135, 97, 83,128,229,108, 86,225,244, 57, 8, 11,210,125,125,151, 91, 95,187,176,150,188, 36,203,220, 1,129,166, 97,242,125,159,
- 40,140, 92,156,112, 51,181,154,137, 46,159,218,169, 63,109,164,254,212, 78, 93, 62,185, 83,255,228,152, 86,251,137,246,239,223,
- 45,161,238, 89,202,234,197, 4,183,199,119,234,115, 88, 74, 67,121,170,203,106,222,169,207,198,239,110,167,238,254, 9,247,160,
-186,157,250,140, 51,173, 60, 5, 6,178,172,100, 56, 28,209,238,116, 89, 59,125,134, 78,175,207, 96,229, 12, 47,188,250,105,182,
-246, 14,169,106,205,195,123,247, 56, 58,218, 35, 43, 70, 28,236,111,163,179,140, 79,191,250, 42,177, 31,114,106,245, 20,157,214,
-128, 32,232,209,234,172,208,107,183,105, 5, 49,129,244, 25,116,251,244, 90, 93,234,188, 96,208,237,115,229, 84,143, 79, 93,234,
-177, 18, 75, 90,182,164, 30,237, 19,214, 37, 47,159, 63, 71,212,196,244, 73,207,195, 11, 67,231,137,173,106,142,142, 70,160,220,
-133,248,180,135,245,132,146,119,225, 1, 51,230, 24,188, 96,236,201,206,254,137,184, 85, 79, 62,217,161, 31,191, 58,230,227,119,
- 55,198, 20,243,221,164, 31,134, 72,229,179,189,119, 64, 24,132,116, 58, 49, 78, 84,107, 73,210,148,179,103,207,144, 38,137, 27,
-253,153,154, 64,193, 79,252, 27,127,146,203,167, 55, 28, 71,191,229, 19,181, 98,194, 56,198,247, 93,218,145, 64, 32, 12,124,248,
-157,107,220,188,246, 62,191,251,219,191, 73, 93,106,231, 41,174,114,198,251, 15,209,211, 67, 90,161,162,221,106,225, 9,203,209,
-254, 30, 27, 43, 3, 14, 14,198,140, 43,195,195,164,164, 21, 5,116,124,133, 41,115, 86,215, 86,137,131,152,100,156, 32, 61,159,
-195,221, 33, 73,166,121, 48, 42, 17, 65,155,225,222, 20, 63,106,131, 39, 73, 42,205, 97,146, 51,169,107, 74, 4,133,182,244, 2,
-197,165,203,103, 81, 29,159,182, 31, 33,210,146,126,109, 16,121, 66,216,241,217,154,166,140,140,160, 34,196, 72, 15,221,136,114,
-204,124, 62,108, 89, 18,150,203,161, 36, 80, 6,188,128,212, 74,118, 49, 92,125,101,192,235,175,191, 70,171,125,137,221, 3,248,
-234,191,250, 22, 73, 90,162, 11, 87,154,106,171, 88,237,120,244, 98,159,193,160,199, 96,109,149,176,221,118,209,164,210, 21, 40,
- 95, 9,116, 93, 19, 5, 49,117,109,248,212,235,175,115,241,202, 21, 46, 92,188,204,185,203, 87, 56,117,238, 60,221,165, 21,214,
- 79,159,165,183, 52,160,210, 22, 33, 37,203,131, 21,150,151, 87, 56, 26, 39,172,174,159, 65, 55, 9,157, 23,207, 95, 96,101,121,
-133,186, 9, 10,193, 42,130,208,197,162,250,158,114, 49,165, 42, 68, 27,199, 16,232,244, 7,180,186, 75, 8, 63,194, 90,193,209,
-254, 38,217,248,176, 73, 89,115,157,122,232, 53,212, 56,175, 65,194,122, 46, 59,221, 83, 30,126, 35,206,156, 89,216,132,116, 69,
-121,118, 63,147, 66, 28,103, 84, 72,123, 2, 36,117, 2, 7,203,113, 42,155, 20,174,163, 23, 51,203,161,144, 77,225,158,225, 97,
-155, 44, 9,225, 80,199,194,226, 60,199, 85, 77, 85,214,152, 90,187,136,228,217,247, 49,203, 23, 95,176, 41,206,196,116,162, 9,
-150,209,218, 5,232,140, 39, 19, 38,211, 20, 83, 90,198, 73, 77, 90,186, 48,148,181,149,101,124, 15,150,251, 45,150, 58, 33,177,
- 47, 48,117,141, 23, 68,140, 39, 9,131,229, 21,162, 86, 23,235,197, 68,253,117,100,208, 37,201, 74,182,247, 15,121,116, 56,230,
-219, 55,183,121,116, 88, 80, 90,136,162, 8,107, 44,169,117, 8,223, 64, 74,164,182, 76,243,156,164, 42,161,214,120, 77, 55, 89,
-215, 46,168, 6, 99,168,203, 98,254,250, 54,198,146,101, 5, 73,154,204, 71,253,232,154, 31,251, 99, 63, 74, 43, 12,184,115,251,
- 46,101, 85, 29,143,197,191, 27,195, 77,179, 18,156,166, 83, 30,110, 62, 98,109,109,131, 40,238,144,229, 37,155,155,155,156, 63,
-123,142,192,247, 27,129, 91,141,105,240,172,117, 89, 81, 87, 21,117,179,171,174, 11, 87,120,171,162,164, 42,221,155,174,102,251,
-243, 70, 40,103, 12, 88,189, 48,126,111,200,121, 77,135, 46, 61, 23, 82, 35,165, 59,120,155,218,253,187, 69,214, 32, 92, 71, 83,
-166, 73, 74,150,149, 84,181, 27,167,135,190, 34,142, 34, 7, 68,106,172,108,179,157,255, 9,134, 94, 83,195,170,162, 36, 77,156,
- 31,125,154,100,164,153, 91,111,168, 70, 59,209,110,187, 85,110,171, 21, 19,134,110,164, 47,149,194, 24,243, 49, 68, 57,241,252,
-206,253,105,132,158,103, 21,241,167,209,225,158, 70,251,249,184,247,159,101, 85, 16,143,165,245,124,210, 73,195,226,231,204, 78,
-240,166,121,161, 90, 51, 67, 0,138, 99,248,140, 56,249,115,206,212,178,179,177, 92,167,221,230,202,165,203,244, 87,214, 57, 24,
- 29, 49,201, 82,146,124,151,247,239,188,207,210,218,105,170,220,178,212, 95,165, 21,196,248, 65, 64,165, 45, 81,212, 97,208,237,
-208,243, 21,171,221, 46,129,167, 40,242, 2, 43, 32, 23, 22, 97,106,138, 52, 67,228, 25,121, 50,129,116, 66,232, 89,202, 68, 50,
- 60,212,104, 35, 73,210,146,178,246,160, 53, 96, 98, 52,217, 96,131, 58,205, 33, 10,152,232,138,105, 86, 34,181, 70,120,146,218,
- 86,104, 52,202,202,103, 62, 30,207,125,248, 62, 38,230,240,105,148,185, 39,236,139,226,164, 77,196,117, 65,112,247,254, 35,110,
- 63,216, 68, 9,193, 82,236,115,102,181, 71, 43,138,232, 6,146,213,149, 37, 70,195, 67,180,129, 64, 72,250,253, 1,103, 79,173,
- 59,142,119,208, 32, 64, 3,223,165,231,121, 18, 79, 72, 48,150, 27,215,174,115,237,253,235,236,239,238,209,110,199, 32, 52, 89,
- 50,197, 86, 25, 58, 25,145, 7,208,238,172,227, 73,205,193,209,136, 36,171,120,255,195,187,180,123, 3,250,129, 66, 28,109, 49,
- 60, 72, 56,119,113,131,210,207, 24,101, 37, 81,167, 79, 33, 36,249,225, 46,166,174, 16,190,207,168,172,249,224,209, 1, 87,250,
-203,236, 28,236,177, 34,218, 68,113,135,145,153, 82, 56,222, 31, 53, 26,237, 11,250,161,207,198,233, 21,234,210,195, 63, 3,193,
-248,144,205,131, 61,252, 65,196,165, 65,155,228, 48,167, 16, 53, 82,128,175, 4,161, 39,233,181, 91,116, 90, 17,203,253, 22, 23,
-219, 45,206,183, 98, 58,162, 38, 14, 67,182, 38, 7,172,234, 14, 66, 30,241,207,254,217,215, 24, 13,191,134, 8, 35, 62,119,169,
-195,173,135,154,116,148, 18,251,150,115,202,227,204,250, 41,194, 80, 80, 91,205,242,233,179,132,173, 14,182,200, 8,189, 0,227,
-213,164,101,202,242,202, 26,237,184,205,133,115,103, 88,234,183, 89, 89,233,187,131,108, 24,209,237,245,153, 38, 83,252, 32,194,
-214,110,167, 90, 87, 5,195,244, 1, 97,103,153,245,139, 47, 33,148,226,252,149,151,169,139,156,202,102,196,113,155, 32, 44,200,
-178, 97,131,211, 52, 13,227, 65,161, 77, 77, 86,104, 64, 81,155,154,188,168, 9,202, 26, 79, 22,212, 86, 54, 78, 10, 87,184, 93,
-241,118, 29,251,172,160, 43,213,248,209, 27,125,134, 39, 29,141,173, 9, 95,127,194,105, 51,123,173,107,109, 65, 59,145,230,236,
- 26,116, 28,115,133,197, 52,187, 86,131,105,240,164, 2, 7,150, 17,158,116,171, 58, 91, 99,204, 44,156, 72, 34,240, 28,250, 66,
- 59,254, 69, 61, 27, 79, 87, 37, 70, 27,180,242,176,129, 19,193, 9,137, 35,236, 89,135, 72,157,237, 81,133,144, 8, 5,182,150,
- 24, 25, 98,189,138,184, 21, 17,123,150,229, 80,240,169,165,144, 78,153, 50,174, 74,246,239,221,101,237,181, 43,244,218, 93, 34,
- 63, 32, 84,138, 86,232,130, 91, 70,227, 41,225,193,152,160,181,132, 12,150, 8,123,138,171, 27, 87,121,245,141,207,241,175,190,
-246, 47,249,206,195,175,115,144, 24,202,230,222,166,155,172,116,163, 4,133,181, 76, 53, 8, 93, 17, 26, 67,158,106,170, 48, 71,
- 8, 73,171,219,165,221,105, 81,215, 21,117,153,227,171, 38,155, 92, 11,138, 82,131,202, 41,109, 77, 90,164,148,217,148,108, 52,
- 36, 59,218,227,207,253,240,247,241,214,167, 94,225,111,254, 87,255, 79,238,238,236,146,107,139, 80,158, 43,252,207,187, 71, 91,
- 57, 15,129,154,173,164,182,119,119,249,169,127,241,211,252,241, 63,250, 39,185,114,241, 50, 69,161,249,245,223,248, 54, 95,249,
-226,103,241, 69,133,174,167,152,186, 66, 87,204, 65, 46, 70,155,249,120,221,189,239,132,121,226, 68,100,244,236, 16,103,155,196,
-190, 69, 24,215, 66, 2,155,177, 32, 27,139,174,209,115,132,235,204,147,158,103, 5, 85,169,155,245, 68, 77,224, 43,180,241,154,
-181,110,229, 64, 61,139, 24, 93,117,172,233, 48,198, 64,221,124,159,198, 77,121,156,208, 78, 52,177,187,174, 75, 15,103,196, 68,
-207, 59, 30,227, 55,215,182,247,113,129, 39,207, 31, 91, 47,168, 10,197, 98,177,158, 39, 12, 62,118,227,230,132, 5,224,121,133,
-247,113,113,246,179,208,177,139,127,254,228,136, 95, 60,181, 51,127,218,207,227,132, 25,102,254,187,123, 59,238, 74,159, 23, 18,
-224,108, 90, 2,169, 60,148,239,243,224,209, 35, 42, 60,226,126,159,246,210, 42,210,239, 83, 91, 69, 85,107,150,251,203,248, 86,
-144,142,143,216, 59,216, 5,155, 19,213, 7, 28,141,129,184,195,114,120,137,131,163,140,160,213,162,208,154, 32,106, 17, 71, 62,
-194,104,202,162,160,180,134,168,215,165,180, 53,247,118,199,124,180,121,200,225,209,144,113,154, 48, 74, 18,146,178, 96,156, 78,
- 73,146, 12,146, 2, 47, 80,108,156, 90, 99,173,223,166, 23,122, 40, 91, 99,168, 27,181,238,179,215, 28,207, 60,188,217,143,225,
- 12,204, 93, 34,246, 24,225,104, 23, 56,250,141,149,206, 88,211, 36, 86, 25,199,114,110,178,135,151,250, 61,247, 28, 8,200,171,
-138, 44, 47,232, 4, 1,253,200, 39,157, 30,129,112, 10,117,109, 13,221,211,107,180,226,134,108,229,169, 38,233,200, 71,121, 65,
- 35,146, 18,220,189,117,131,221, 71,247,217,121,120, 31,101, 5,253,254, 18, 73, 90,160,203, 41, 59, 15,238,177,183,117,192,203,
-175, 92,160,168, 42,146, 60,229,204,169,117, 14,176,212,181, 96,227,252, 5,138,221, 17,177, 20, 4, 66,176,187, 63,228,165, 43,
-231,240, 3, 24, 77, 70,248,173,152,233,184, 68,123,146,172, 50, 4,221, 30, 66, 72,198,117,141,241, 60, 90,157, 30,126,187, 67,
-107,148, 81,212, 6, 93, 57,107, 76,166, 13,121,146,210,107,135,132,113,128,234,132,172,157,191,196, 32, 56,135,180,134,139, 50,
-228,139,181, 65, 6, 18, 83, 23, 4, 30,132,202, 34,155,113,172, 53,154,201, 40, 33,201, 39, 72, 95, 48,214, 57,155,233, 30,213,
-200, 67, 84, 6,227,213,196, 65,132,242, 11, 60,149,115,245, 84, 68,182, 26,146, 78, 39, 44,247, 87, 80, 97, 11, 63, 80,244, 6,
- 61,206, 95,184, 0, 6,234, 52,193,164, 83,172,244,104,181,251,156, 59,119,137, 86, 20, 51, 30,143, 16, 88,210,116,202,185,115,
-103,200,203, 18, 63, 8, 89, 89, 93,195, 98,169,203,146, 60,241, 17, 85, 65, 39, 12,200,117,194,104,239, 17,253,181,243, 12, 86,
-151, 41,175, 92,101,114,184, 71, 93, 36,164, 89,197, 52,201, 56,123,102, 3,223, 23, 84, 85, 69,154, 89,144, 62,227,100, 74,173,
- 33,136, 44, 97, 90, 16,245, 45,121,150, 51,158,186, 28,247, 93, 95, 17, 6,190,179, 73,122,199, 98, 55, 79, 74,148, 39, 92, 23,
- 57,119,253, 29,239,203,143,239, 53, 51,127,121, 35, 94,179,110,114, 33, 27,194, 91, 93, 55,196, 56, 37,155, 68,182,102, 60,110,
-102, 49,193,141,199,188,185,134,235,218,156,196,201,206,243, 90,220,205,222, 83, 18,163, 45,101,211, 13, 90,235, 10,231, 60, 44,
- 70, 55, 72,217,197,215, 12, 78,188, 37,155,175, 45,149,219,227, 6,113,140, 31, 6, 88, 91,209, 22, 25,167, 60, 75,207, 19, 88,
- 93,179,222,239,163,243, 18,219,118,253, 89, 16,120,228, 85,205,131,205, 29,240, 34,106, 43, 57,119,241, 10,190, 23,184, 3, 82,
- 16,241,133, 31,249, 49,202,104,153,107,255,224,255,131,173, 82,132,192,117,214, 66, 56, 20,142,128,194, 88,124, 41, 49, 82, 49,
-206, 43, 68,101, 16,114,138,145,146,179,167, 87,137,227, 0,172,239,210,212, 68,128,182, 10,161, 36,149,174,201,243,148, 72, 9,
- 90,190,123, 27, 85, 83,140,174, 56,123,254, 10,127,235,175,253,207,249,235,127,251,239,112,237,254, 22,149, 54, 88, 36, 82,216,
-147,170,245, 19, 34,168,197, 40, 53, 87, 88,106,171, 25, 77,199,252,210,175,124,149, 63,255,167,255, 28,231, 78,157,102, 50, 41,
-184,118,227, 1,231, 79,247,160,204, 48,101,147,104, 87, 85, 96, 27,206,190,177,141, 24,205,204,239, 67,190,167,240, 27,193,179,
-242, 84, 99,121, 4, 37,103,209,169,141, 88, 18,129, 21, 53,210, 54, 14, 30,221,220,183,106, 67,145, 23,228,137,115, 4, 76,167,
- 41,105,150,147, 23, 5,121, 81,160,155,112,159,178,170,201,202, 18,148,179,239, 25, 99,221,215,243, 21, 74, 58,116,177,109, 44,
-128,122,126, 13, 55,147, 79,229,116, 35, 88,219, 8,228,130,227,108, 3,207,111, 14,161,199,117,204,123, 46,234,149,103,243,215,
-143, 31,116, 49,223,151, 26,251,100, 97, 63,142, 54, 60, 86,133,218,103, 6,222,139,167, 56,173,196, 83,196, 20, 60, 55,133,231,
-217,133, 73,204,127,174, 39,219, 75,225, 94,236, 52,123, 28, 23,158,215, 92, 72,174,179, 56, 22,186,200,121,202,217, 28, 98, 33,
-124,148,244,136,194,144, 23, 95,126, 17, 47,232, 64,208, 34, 47,157,146,114,124,180, 79,149, 85,232,209, 17, 74, 8,166,147, 17,
-117, 85,208,110,133,196, 94,151,192, 15,168,165, 98, 47, 41, 40,181, 38,221,217,166, 40, 10, 48,150,162,172, 56,154, 78, 25,142,
- 71, 76, 19,103, 29, 73,210, 41, 85,145, 34,132, 70, 96, 49,186, 34, 8, 66,132,133,208,143,104,133, 45,252,216,195, 23,134, 83,
-145, 36,246, 52, 70,184,200, 63,165,157,176,103,177, 81,127,218,243,252,184,222,224,241,147,209, 83,119, 97, 51,139,200,236,125,
- 99, 49, 86, 59, 15,105,163,126,119, 68, 63,179, 32, 48, 50,115, 33,209,139, 87,206,115,227,194,105, 30,110,238, 98, 52, 24, 45,
- 72, 39, 19,218, 10,142, 38, 41, 42,136, 48, 86, 81,151, 5,237,118,203,133, 68, 8,133,240,125,100, 16,184,130,238,249,248,210,
- 99,111,235, 1,223,254,230,111,163,139,156, 7,183,222,163,179,180,130,198,146,140,143,208, 89,202,206,230, 35,174, 92,121,129,
-195,195, 67,242,124,204,234, 90,159,110,216, 97,100,106,192,103, 60, 62,162, 21, 74,186, 74,162, 17,100,198, 80,150, 57, 45,105,
-153, 38, 41,173, 86,151,163, 36, 96,191, 46, 56,119,229, 69,206,182,186, 60,124,244,136,135,123, 59,172,118, 99,214,207, 94, 32,
-155,140,217, 8, 36,133,180,148, 66, 19, 8,159,170,182, 12,211,156,190,174,137,170, 17,211,163, 9,165,178,236, 42, 65, 24,250,
- 24,235, 40, 38, 97, 32,169,171,140,192,179, 20,202,130,169, 8, 60, 15, 93,213, 76, 39, 5, 74, 42,210, 86,136, 65, 51,240,218,
- 76,252, 20,171, 12, 81,171, 69,187,221, 33, 43, 74,138, 81,130, 87, 39,172,246, 86,176, 43,203,180,122,107,104,235,145,101, 41,
-231,206,159, 35, 27,143,156,135,222,148, 36, 85,193,218,250, 25,250, 75, 61, 52,154,178, 72, 89, 91,238,145, 76, 70,196,126,155,
- 34,203,233,244,251,212,117,221,248,145, 5, 94,168,136,166, 1,170, 84,232, 60,193, 51, 32,178, 35, 14, 55, 43,162,165,117, 86,
- 79,157,161, 53, 88, 37, 27,238,179, 82,150,140,146, 20,141, 64, 89,139,242, 3, 76, 90, 82, 86, 2, 99, 27,241,145, 12, 8,226,
- 46, 94, 24,179,127, 52,114,152,210,158, 91,119,121, 74, 18,122, 30,158,175,240,149,196,151,194, 21,116, 65,147, 41, 48, 43,230,
-199, 59,116,105,221, 74, 97,174, 19, 49,205,117,111, 4, 88,133,213, 18,109, 45, 18,131, 49, 18,101,105,174, 77,139,149,118, 30,
- 64, 4,242,248, 62,166,155,123,146, 60,134,201, 24,109,209,104,132,116, 34, 48,109,192,212,198,141,125,171,122,254,122,210, 82,
-162, 61,183,162,178,218,209, 13,153, 57,220,140,105,226, 61, 37,138, 26, 95, 26, 60, 37,200, 11, 77, 86, 11,188, 94, 15, 81,106,
- 84, 82, 35, 70, 21,235, 23,151,233,118, 98, 98,229, 64, 56,194,151,132,237,136, 71, 91, 9,223,252,206,117,106, 25,146,231, 83,
-166, 71,187, 92,185,252, 2, 71, 69,136,245, 54,176, 42,228, 7,127,248,143,208, 31, 12,248,233,159,251, 5,238,111,110,177,123,
- 56, 36, 45,220,138,160,153, 81,144,152,154,105, 86, 99,164,199,161,213,100,147,130,196, 30, 17,182,125, 6, 58, 68, 97,209, 22,
-194,200, 35, 8, 66,183,154,171, 53,182,214, 40, 63, 32, 43, 10,166, 69,129,242,187,148, 69,206,116,231, 62,189,165,101,254,179,
-255,240, 47,241, 95,252,157,255, 55,239,223,219,162,178, 51,191,183, 70, 41,137,209,122,161,182, 88, 12,181, 11,127,121,236,158,
- 95,155,138,221,195, 45,190,246,107,191,196, 79,252, 27, 63, 65, 24,132,220,122,176,131,181,154,174, 41, 17,101, 74, 90,231,212,
-186,154, 7,163,104, 99,209,198, 96,172,115, 35,120, 74, 18,248, 30, 97, 24, 16, 7,126, 19,250,163,240,125,137,239,187,123, 85,
- 93, 55,223,143, 52,120,181, 65,170, 10,252, 38,113, 82, 42,116,109,200,146,140, 52, 73, 25,143, 38,140,166, 41,147,172, 32, 73,
-115,178,172,108,170,141, 66,200, 26, 67,137, 54, 80,107, 75, 21,106,162, 40, 32,192,161,140,133, 53,200, 6,104,236,174,205,102,
-180,111,108,163,215,114,215,138,239,121,196,161,115,127, 4,202, 57,175,164,240,220, 68,201, 26, 12, 60,157,253,254, 73, 68,107,
-207, 27,133, 63,173,243,123, 82,200,246,251, 67,198,254,129,227, 77,127, 31,191,164,176, 4,162,230,104,127,159,221,189, 3,132,
- 23, 50, 78, 50,210,210,162, 81,244,186,203,212, 73,226,186, 74,161, 49, 82,144,219, 2, 25, 24,198,117,206,214,253,187,205,133,
-145, 80,150, 37,101,153, 99,180,179, 47, 8, 93, 55, 79,181,123,169,245, 59, 62,107,253, 54,151,214, 61,250,209,128,141,193,128,
-188,168,209, 40, 52, 62,155,219, 7,212,181, 96,101,125,131,229,245, 1,197,116, 66,167, 21, 80,154, 10,107,220, 13, 72, 26,225,
-174,155, 63,112,148,226,241,184,221, 44,176,244,229, 2, 69,206,206,181, 20,178,249,115, 78,164, 30,245, 58, 29, 58,173, 24, 9,
- 46, 46, 54, 77, 25, 44,181,240,165, 98,111,107, 31, 29,182, 24,172,172, 51, 30, 29,178,178,188,140,167,188, 6, 96, 19,224,171,
-208,121,144,165,165,204,166,124,253,107,191, 74,145, 22,124,248,222,251, 76,179,148,193,198,105,116, 85, 16,248,138,225,193,132,
-151,174,158,163, 40,115,178, 82,112,243, 81, 70, 29,244,241, 66,201,157,173,156, 80,149,172, 40, 31, 35, 96,181,167, 56,152, 84,
-108,108,172,115,231,225, 14, 47,156, 93,166,178, 62,104, 69,161, 21,221,238, 18,171,131, 1,211, 36,165, 35, 45,178,219,166,223,
-138, 72, 70, 19, 2,105,241,173,166, 37, 12, 5, 6,116,129, 52, 80,166, 83,242,105, 4,181,194, 19, 80, 22,110,119,233,251, 62,
-121, 89, 98,140,166, 29, 7, 40,105,104, 69, 30,113,224,209,138, 98,194, 32,196, 40, 77,224, 57,245,108, 81,102, 20,121, 9, 56,
- 56, 74,127,121,153,149,213, 85, 44,130,157,189, 67, 90,177,162, 61,232, 82,171,152,168,187,140, 85, 49,251, 71, 9,167,207,158,
- 39, 47, 42, 36,150,178, 40, 9,124,159,193,202, 42,113, 43, 70, 97, 41,242,148,184, 21,162,164,165,211,142,168,203, 2, 76,133,
-169, 51,242,105,206,232,208,163,183,182,140,182, 37, 66,213,248,177, 4,237,145,231, 21,166, 40, 24,141, 82,218, 6,194, 56,164,
-215, 27,176,212,191, 66,111,101, 29,217, 91,229,250,251,191, 75, 39,128, 80,105,202,202, 48, 29, 79,241,149,207,249, 75,151, 24,
- 77, 18,150, 7,125, 38,163, 33,221, 86,155,118, 28, 51,221,189,235,110,186,202,197,245,134, 13,250,213, 83,141, 58, 93, 54,126,
-234, 5, 75,218,137,236, 6,187,232, 17,159, 5,119,208,140, 55,155,238, 92, 58,124,169,110,178,207, 79, 34,140,197, 9,135,140,
-157, 11, 22, 57,161, 37,178,141,138, 90,107, 77,109,204, 19,247, 52,207,243, 48,198,144,231, 57, 66,137, 6, 70,211, 28, 26, 22,
-217,243,205,228,111, 6, 35,202,179, 18, 37,125,226,184, 77,187,107,208, 3, 77, 81, 12, 89, 89, 91,193, 10,139, 31,120,132,161,
-243, 60,203,160,197,222,193, 22,247,182, 14,121,241,197,148,206,133, 53,108,149,146,140, 14, 88,187,252, 42, 15,135, 71,136,176,
- 75,165, 53,159,125,227,117,222,124,249, 60, 70,151, 28, 29,236,179,187,185,201,141, 59,247,185,126,119,139,237,195, 49,219,251,
-135, 28, 77, 10, 74, 83,147, 43, 73,106, 45,219,147, 18,245, 96,143,151,207,159,130,162, 36, 79, 82, 78,157,241,144,109, 65,212,
-106, 97, 76, 72, 41, 61, 84, 16, 82, 34, 57, 76, 74, 16,153,115, 53,148, 5,181, 53, 12,214,207,241,159,255,181,255,136,255,244,
-127,247,127,230,230,230, 30,229, 66, 66,155,157, 89, 3,159, 24,177, 62,121,175, 55,192,181,155,215,249,250,215,127,133, 31,255,
-147,127,138, 78,111,137,205,173, 29, 46,109,172, 49, 25,151, 28,141, 15,169,117,233,154, 35,235, 10,250,226,191,231, 44,102,206,
-235,157, 71,225,188,176, 7, 77, 81, 7,129, 54, 77, 51,215,120,213,101,147, 37, 79,195, 39,168,107, 67,154, 53, 76,246,241,148,
-163, 73,194,120,154,145,165, 57,101, 89, 35,165, 68, 27,199, 63,169,117,141, 53,181, 19,232, 97,231,145,181, 82,186,137,165,240,
- 36, 90, 27,202,178,116, 92,129, 52,165,200,115,116, 93, 97,173,153,107,185,194, 48, 32, 8,188,121,190, 61,194,204,149,252,194,
- 24, 87,212,191, 91, 21,250, 83,119,215,207, 65,141, 62, 77,249,254,244, 56,188, 79, 86,172,159, 53,114,255,189,226, 75,127,223,
- 72, 84,107,144,166, 66,218,154, 60,155, 16,181,221, 9, 78, 53, 68,181,186, 76,169,202,140, 36, 29,147, 21, 5,135,163, 35,210,
- 60, 33,207, 83,202,186,166,172, 29, 7, 30,163, 9,149, 36, 84,130, 94, 39,102, 99,109,157,165,150,135, 48, 21, 85,145,210, 14,
- 61,214,250, 45, 62,245,226, 37,178,201, 33,201,100, 76, 85,164,196, 94, 68,187,191,198,222, 81,134,239, 11,198,201,152,190,233,
-208,139,215, 81, 65, 31, 99,106,108,165,169,140,113, 35,182,127, 13, 60,224,197, 21,134, 49, 98, 65, 4,226, 20,167,179,157,209,
- 92, 96, 39, 45, 82,207, 70, 81,141, 39, 83,131,239,121,124,207, 91,159,101,111,103, 31, 83,150, 8, 83, 49,157, 78, 89, 95, 89,
- 98, 99,165, 71,233,119,200,234,138,201,104, 66,224,135,115,134,188, 39, 61, 36, 78, 44,165,108,205,175,124,237, 95,242,254,187,
-239, 18,201,144, 7,247,182,216, 56,189,129,177,134, 44,157, 82,100, 9,189, 78,140, 39, 44, 15,182,183, 56, 24,215, 8, 60,222,
-185,190,195,173,251,135, 4,181, 37, 48, 37,173, 56, 33,108,121, 68,182, 98, 16, 67,175, 19,113,116, 0,155,163,148,193, 96,157,
- 44,211,236, 12,167,244, 58, 93,170, 60, 35, 48, 53,103, 87,150, 24, 7,146,225,225, 17,215,110,222, 38,192,176,178, 54,160,149,
-164, 24, 36,121, 94,207,215, 17,163,225, 1, 83,233,158,235,170, 42,221, 90,192,166, 40, 79,208,235,181, 92, 54,188,130,118,187,
-195, 96,169,199, 82,183,131,175, 20,166,174,201,166,123, 12,143, 14, 73,178, 4,109,192,247, 35, 78,159, 59,195,218,234, 41,172,
-149,140, 38, 83, 54, 78, 95,224,124,171, 79, 77,192,206, 48,229, 96,156,226, 69,150,229,193, 10, 85,161,201,146, 28, 93, 21,172,
-173, 12, 8, 67,133, 54,150,118, 43,162, 19, 7, 20,162, 34, 8, 20, 82,184, 49,225, 40, 25,179,183,179,205, 57,255, 20,237, 94,
-159,108,114,196,210,250, 50, 65,232,209,234,180,168,173,139, 86, 21, 53,120,190,207,169,254, 50, 70, 42, 34,169,169,147, 67,188,
-238, 42,209, 96,131,179, 47, 42, 74,173,217,125,112,139, 48, 14, 24, 30, 78, 25, 44,175, 49,154,140,233,117, 98,210, 52, 37, 79,
- 39,232,202, 32,194,128, 51, 27,103,184,189,115, 27, 95, 10,124,233,246,229,202, 81,212,241,154, 8, 7, 49,115, 37,219,227,130,
- 62,179, 34,205, 67, 54,102, 25,221,139, 66, 80,123, 28,218, 97,140, 65,227,212,234, 70, 59, 37,189,242,229,137,233,159,174,205,
-124,165, 40,149, 60,161, 23, 17, 11, 7, 5, 99,204,124,175,142, 21, 40,233, 70,187, 66, 8,151,125, 93,107,242, 52, 71,251,190,
-211, 9,248,254, 28, 95,109,102,235, 42,225, 33,132,161,174,114,124, 63,164,211,237,177,127,148,225,133, 33, 81,175, 75,191,178,
- 72, 95,114,235,246, 77, 86, 90, 30,233,114,155,115,151,207,147,150,154,251,155,251, 40, 4,105,150,113,116,116,200,217,149, 62,
-131, 94,155,229,142, 79,166, 45,239,223,121, 68, 16,119,145, 43, 93,122,158,135,180, 25,103,206, 12,248,252, 70,132,248,158, 23,
-168,241,153,148,176, 59, 74,217, 60, 24,115,243,222, 35,222,187,179,197,195, 71,155,236,239,186, 44,137, 91,247,118,176, 18,178,
- 66, 35,251, 25,203, 24, 12,146,168,213, 37,108, 53,254,127,207,105, 13, 38,105, 78, 38, 13, 81,232,147,167, 41,226, 96,135,149,
-211,231,249,175,255, 79,127,157,191,244,191,248, 27,220, 63, 56,162,178, 51,162,162, 56,206, 80,255, 24,130,171,181, 80, 99,249,
-141,111,252, 38,127,228, 15,127,133,151,207, 92,226,104,120,128,106, 15, 16,121, 77,100, 44, 55,110, 94, 39,203, 82,140,173, 1,
-139, 18,238,185, 83, 56,139, 98, 24, 6,116,202,152,170,172, 40,130,192,113, 15, 2, 73,224,185,239, 69,107, 61,183, 38,202, 38,
-225, 71, 10,217,192,107, 4,165,214,100,121, 65,146,102, 76,147,148,113,146, 48,158, 56,148,171,174, 13, 74,121,212,214, 82, 91,
- 77,101,106, 7,181, 49,199, 59,243,186,174,168,202,210,165,182, 73,137, 54,150, 44,205,153, 78, 18,166, 73, 66,150,229, 13,141,
- 14,103,153,246, 92,190,193, 12,156,132, 56,222,237, 91,109, 78, 10,229,158, 86, 32,221, 11, 65, 60,183, 67, 62,238,192,158, 12,
- 61,249,253,134,183,124, 55,159,243,123,233,240,159,202,156,127, 86, 54,252,220, 74,244,244,209,189,149,138,176,221,161,213, 27,
- 32,253,136,200,135,221,189, 33,247, 30,220,100, 52, 73,169,106, 77,217,144,133,132, 16, 8,107, 27, 15,172, 83,154, 6,202,208,
-110, 71,172,245,123,116, 99,159,181,229, 30, 75,189, 22,201,104,155, 48,244,105,183, 54, 8, 60, 73, 43,244,136,219, 49, 89, 34,
-233,245,150,216,219, 25,113,250,244, 57,150,215,206,114,106, 29, 46, 95,188,204,141,219, 55,201,138,140,233,116, 76,145, 38,156,
- 61,115,154,196, 20, 46,161, 12,176, 74, 44, 56,208,159,167,105,176,223,125, 97,119, 77, 7,152,227,108,117, 33,205, 60,234, 85,
-138,198, 6, 98,102,116, 57,195,108,226,134,116,143,203, 82,175,235,132, 42, 74,145, 21, 5,113,224, 51, 28, 39,172,172,172,241,
-222,237, 77,108,216,198,147,138,193,210, 82,195, 7,112, 47, 56,223,243,145, 64,150, 36,124,244,254,187,152,178, 38,183,130,207,
-124,230,115,180,186, 17,119,238,221, 99, 50, 26, 98,139, 4,107,106, 30,109,237, 83,215,138,216, 90,162,192,217,141, 38,121,141,
- 80, 62,157, 56,102,127,152,112,174, 53, 96,165, 31, 35, 39, 37,202,212,180, 58, 29,118,135, 9, 37, 83,150,151,215,248,210,151,
-191,194,119,190,243, 14,187,251,123, 44,247, 90,232,170, 64, 72,200,141,229,197,171,151,184,125,243, 54,125,235, 58, 47,154, 67,
-149, 81, 10,227,133, 24, 83, 97,138,154,189,233, 8, 79, 9, 42, 13, 42,112,215, 71, 93, 87,248,126,200,202,202, 18,203,253, 54,
-113,224, 83,155,146, 60, 47, 40,179,156, 60, 61,164,172,114,252,192,167, 29,196, 44, 45,175,209,237, 46,227,251, 49,163,113,130,
-144, 1,113,103,137,218,250, 36, 89, 77,187,187,196, 81, 82,227, 55,235,137,209,120,130, 31, 6,156, 59,123,214, 69, 0,135, 30,
- 43,131, 62,189,182,135, 39, 52,135,219, 35, 14,118,198,244,218, 17,237, 40, 34,240, 21, 2,152, 78, 18,162,160, 69,103,105,137,
- 42, 45,144,190, 66,202, 0,161, 66,188, 72, 50, 8, 91,180,186, 75,100,121, 65, 94,150, 84,233, 16,223,243, 81,113, 76,105,192,
-163,166,221,106,113,233,242,139,216,170,192,243, 34, 76, 93,178,187,121, 7, 93, 87,108,172,175, 32, 61, 71, 9,147, 86, 83,151,
-185, 59, 48, 73,133,191,160,104, 87,114,166,100,127, 76, 65,108, 31,103,116,207,151,213, 79,218,214, 16,243, 53,154, 49,141,255,
-191,201, 60,183,243,188, 22, 55,250,181,122,102,115,117,215,175, 53,156,200, 79,159,195,149, 22, 68,159, 90,235,185,144,238, 24,
- 19,171, 26, 11,148,118,247, 86,123,172,122,158,189,238,116,109,155,233,147,243, 69,207, 0, 56,113, 28, 51,173, 45, 81,203,249,
-172,247,134,123, 36,117, 74,215,239,241,240,225,144, 81, 54, 69, 70,203,220,127,180,141,231,123, 76, 39, 9,195,195, 33,253, 80,
- 48, 62, 58,100,105,125,153,115,171, 27,124,116,103, 27,233, 71,236,142, 10,212,160, 69,145, 66,167,213, 33,240, 36,170, 78,177,
- 54, 37,240, 60,186,171, 45,206, 47,183,120,235,226, 10,127,230,251,223,226,240,104,194,163,189, 61, 62,188,115,151, 95,123,231,
- 67,110, 60,220,103, 82, 25,174, 61,220,227,197,211,107, 44, 7, 93, 20,138,216,243,104,135, 18,207, 86, 8, 83,146, 91,103,239,
-155,230, 5,117, 93,209,173, 74,140,174, 88, 94, 89,227,191,250,155,127,141,191,242,159,253,109,238,109,239, 80, 90,176,162, 17,
- 15, 10,187,248,148, 61,165,249, 18, 32,156,218, 59, 55, 5, 63,245,211, 63,197, 11, 87, 47,115,245,234, 85,210,194,176,118,238,
- 50,155,119, 43, 94,254,244,103,249,246, 59,223,230, 96,111, 7, 41, 52,158,176,120,202,162,132, 3, 18,149, 77,214,189, 54,150,
-168,210, 20, 69,229, 58,117,207, 61, 55,149,174,169,155,143,153,129,160,132,105, 10,190,133,178, 33,237, 57, 31,121, 78,146, 23,
-142,223, 80, 58,144,141, 16,181, 75,221, 83, 2, 79, 9, 38,158,164, 29, 59,213,122, 28, 7,206,150, 22,249,238, 53,162, 20,218,
- 24,178, 44,103, 58, 77,157,130, 62,119,152, 94, 23,173,234,205, 15,142,117,237, 32, 52,218, 88,180,117,120, 89,163, 13,198, 56,
-107,226,179, 85,227,246,233, 65, 38,207,235,144,159,214, 69, 63,203, 71, 46,254, 53,133,136, 60, 45, 58,246, 89,105, 59, 79, 0,
-114, 56,153, 2,180,136,141,124, 12, 75,180, 16, 38, 32,209,194,195,143, 3,186, 75, 53,135,163, 9,211, 36,229,250,141, 27,100,
-121,137,193,141,200,132, 39, 49, 6, 90, 81, 27,105, 45, 85, 86, 52,234, 93, 55,130,107, 43, 73, 44, 44, 27, 75, 93, 34, 79,144,
- 28,238, 81,213, 41,173,184,239,118,132, 42,100,176,113,150,222,250, 89,198, 57,140,134, 71,168, 94, 72,229, 69, 36,149, 97,146,
- 37,148, 69, 65, 50, 25,177,187,191,143, 14,198,212,101, 73, 82,228,196, 75, 29,108,232,110, 16,152, 69,183,248, 39,123, 92,103,
-157,207,227,165,254,137,155,168,177,104, 92, 71, 35,173,116,217,208,230,248,177, 52,104,164,180,184,193,132,235,212,103,193, 22,
-198, 24, 12, 53,158,239, 17,183,218, 60,216,220,102,169,211,193,132, 30,163, 52, 67,166, 41,157,118,204, 81, 97,232,118,186,148,
-101, 69,173, 53,202,147,110,156, 41, 44,158, 82,108,239, 30,208,105,247,233, 95, 93, 70,224,145, 76, 19,110,221,188,206,100, 50,
- 65, 88, 75,160, 20,117,145,177, 60, 88, 98,111, 63,165, 21, 66, 86,106, 58, 81, 64,174, 43,194, 56, 98, 63,153,240,218,149, 13,
-142,166, 71, 12,186, 45, 66,207,112,184,127,132, 81, 1,211,210,208, 69, 17, 72,193,189,155, 31,146,140, 15, 9,122,109,174,223,
-218, 1, 33,168,140,227,151,223,186,247,128,110,183, 67,146,166,244,250, 61,138,163, 4, 83, 87,120,113,139,131,188, 32,212,150,
- 72, 42,116,101,241,164,194, 87,142, 58, 83,102,150, 48, 48, 8,105,177,166, 34, 73, 70,164,147, 26,163, 75, 55,249, 51, 22,173,
- 43,167, 70,143, 90,116,187, 75,180,187, 75, 8,225, 83,148,134, 44,175, 64,122,148,149,133,192, 3, 79,146,229, 37,113,220, 66,
- 42,137,169, 75,186,157,152,213,181, 13,130,208,167,221, 10, 56,189,182,194,234,114,143,110,203,167,223,137,248,204,167, 95, 37,
-155, 30,177,187,189,137, 41, 75,103,233,145, 2, 95,121,120, 42,196,247, 34,176, 30,202, 11,209,165,198,160,192, 86,128,165,170,
-114,172,173, 65,151,232, 82, 83, 38, 37, 82, 8,114, 27, 18,183,122,248, 66,160,189,128, 36,203,105,245, 7, 20, 89, 66,183,223,
- 35, 73, 18, 86,215,214, 17, 42,192,243, 5, 97,171,131, 20, 78,140, 23, 46,192,140,230,201, 86,141, 36, 67,201,197,113,185, 93,
-120,157, 54, 64,151,198,190,249,248,107,221, 54, 83, 37, 39,130, 58,190, 55, 24, 99,154,131,167,105, 26, 22, 53,247, 61,195, 76,
-177,174, 65,136,249, 72,119,102, 81, 43,202,146, 60,203,136,194,214,252,243,103,223,239,241, 84, 83,160,141, 43,248,181, 49,160,
-205,188,161,176, 51,132,105,173,231,196,186, 48, 10,105,181, 32,142,114,188, 52, 71, 69, 33,158, 49,100, 85,194,233, 51, 27,156,
- 94, 94,226,244,234,128, 92, 23,236, 62,218, 36, 27, 13,209,117, 69, 81, 20,228, 69, 73,146, 21,236, 30, 14, 89, 62,220,167,237,
-197,132,158, 96,146,102,172,174,109,144, 90, 73,180,114,145,247,183,238, 19, 92, 92,166,101, 44, 45, 81,224, 55,230,187,192,186,
-215,106, 29, 20,116, 67,159,193,210, 58,231,206, 46,243,198,167, 95,229,206,230, 33,215,239, 62,224,195,107,183,184,191,185, 79,
- 45, 2,132, 10, 16, 54, 32, 18,138,149,126, 68,149, 85,164,181,161,210, 53, 71, 19,232,183, 35, 68,154,225,123, 30,137, 18, 12,
-206,246,248,155,255,201,127,192,127,252, 55,254, 15,236, 38, 57,249,124,140, 40, 62,166,169,104, 32, 50, 74, 80, 27,248,214, 7,
- 31,242,224,225, 38,175,189,250, 58, 55,110, 95, 99,249,211,159,102,227,244, 89, 30,110,110, 98, 68,192,151,255,208, 31,230, 27,
-191,253,235, 20,217, 24, 99, 44,190,106,158, 79, 81,163,148, 19, 50, 86,149,110, 28, 22, 18, 37, 93,119, 94,213, 85,179,143,111,
-168,128,214,137,231, 12, 2,173, 13,149,214,148,117, 77, 81,212, 20, 85, 69, 94, 22,212, 90, 83,215, 78, 97,111, 26,149,189,139,
-106,117, 26,137,184, 33, 40,182, 98,151, 97, 16,197, 1,129, 31,160,164, 19, 83,231,101, 65,146,185,188,244,170,170, 80,210, 35,
-240, 29, 75,160,170,106,138,162,116,171, 75,227,214, 21,149,214,232,133,162,174,222,122,229,252, 79, 62,147,244,246,156,155,252,
- 83, 41,112,207,241,143,159,124,123,140, 70,247,137,121,241, 79, 39,207, 61,219,107,253,248,199,136,103, 66,108,142,163,239,154,
-157, 88,131, 64,172,106, 7, 2,208,198, 1, 36, 28,251,189,161, 88,133,206,163,238, 80,177,142, 52, 20,197, 49,237, 86,204,246,
-230, 67,168, 51, 54,150, 91,248, 88, 86,151,122,132,126,128,244,124,180, 21, 40, 21,224,135, 49,161, 31,186,156,103, 41,105,183,
-219,180, 90, 45,218,157, 14,211, 44,113,153,196,190,143, 70, 81,105, 73, 94, 24, 38,211,156,187,247, 30,113,253,250, 45,238, 62,
-216,100,235,224,144,164,206,185,187,249,128, 97, 54,101,119, 60,194, 6, 1,147, 82, 19,134, 29,210, 36,163,221,110, 19,183,219,
- 78,109,219, 48, 14, 62,238,185, 21,139,110,134,185, 79,125,134,111,228, 68,110,250,113, 32,134,156,219, 52,102, 90,151,227, 8,
- 91, 39, 62,156,125,222,140,169, 61,219,133,130,219,143, 10, 64, 42,143,193,234, 42, 15, 55, 55, 9,219, 29, 30,236, 13, 25,103,
- 37,161,173,144, 74,161,241, 88, 30, 44,163,203,156,183,222,252, 20,237, 86, 72,208, 14,137, 91, 17, 74,122,124,253, 87,190, 78,
-145, 85, 8,225,177,181,189, 73,145,167,164,211, 49, 81, 24,210, 10,125,202, 52, 33, 25,141, 25,141, 10, 70, 73, 77, 90,106,142,
- 42,195,168,212, 20,198,210,233,196,232,178,160,211, 13,168,117,197,116,152,211,138, 35, 74, 35, 32,108, 17,182,122,172, 47, 15,
- 56,216,188,143, 40,166, 8, 93,131, 21,164,101, 77,169, 33,106,197, 24, 43,232,119, 99, 94,121,225, 2,187, 91,155,244,186, 45,
- 14,142, 18, 74, 44,163,188,160,210,134, 88, 91,148, 85,232,218,193, 48,148,148,196, 97, 64, 20, 41, 90,237, 16, 93,215, 76,199,
- 99,178,116, 10,166, 70, 87, 5, 86, 87, 88, 91,227, 43,233, 34, 28,195,136, 48,238, 98,172, 71, 93, 75,106, 45, 41, 43,205,193,
-112,200, 52,171,156,141,206, 42,106, 35, 40,203, 18, 79, 74, 34, 95, 17, 70, 62, 66, 10,206,159, 63,135,146,150, 44, 57, 34, 79,
- 70,148,101,142,239, 41, 90,113, 68,191,215,101,125, 99,157,149,229, 21, 6,131,101,150, 87, 87, 8,162,176,193, 13, 40,138,186,
- 2, 41, 48,218, 80,102, 5,186,206,169,170,146,170, 42, 16, 2,170, 34,199, 19, 22,223, 19, 40, 63,230,119,190,241, 30, 85,101,
- 56,117,238, 2, 69, 94, 82,100, 41,253,126,135,100,114, 68, 85, 38, 92,184,112, 17, 33, 21,113,187, 67, 89,105, 58,157, 46, 82,
-249, 36,135,123,248,194, 52, 54, 54, 7,218,240,148, 63,183,243,204, 17,174,179,208, 21,129,227, 31,204, 57, 9, 51,114,161,187,
-222,102,161, 44, 51,154,156,108,118,234,199,231, 2,251,216,225, 93,158, 32,149,205,236,109,182, 1,201, 44, 2, 76,102,172,112,
-107, 4, 39,163,163, 22,179, 16,102,240, 39, 7, 97,145, 98, 70, 39,147,205,148, 96,150,211,109,169,181, 97,154, 22,238,192,214,
- 80,220,168, 42,116, 85,146,219,138,184, 19, 17, 74,197, 82,175, 79,167,219, 65,231, 5,211,180,102,115,103,232,188,204,177,143,
-231,123, 88, 20,190, 39, 89,221, 56,195,205, 7,123, 72, 63, 38,203, 50,242, 50,103,237,212, 41, 76, 19,187,170, 76,129,103, 43,
-144, 10,173, 2,132,148,248,210, 66, 40,241, 98,151, 91,223,109,183, 89,237,245, 57,181,212,227,210,202,128,171,231,207, 16,183,
- 66, 30, 62,122,228, 14, 52, 81,136, 39,192, 84, 37,113, 43,102, 90, 84, 88,160, 40, 74,132,146, 14,200, 84, 22, 78,127, 80,228,
-156, 90, 93, 38,140, 90,188,253,238, 53, 74,251, 20, 86,251, 51,126,121,194, 97, 86,173,116, 24, 85,105, 4,111,125,250, 77,172,
-209,140, 70, 67,122,157, 14,113,167,203,215,190,254,107, 92,188,116,133,211,167, 78,177,191,183, 3, 77, 56,151, 21, 78,220,109,
-141, 91,123,104,173,169,170,202, 41,213,243,146,255, 63,109,255,245, 36, 89,150,231,119, 98,159,115,206, 61, 87,185, 10,153,145,
- 58,171, 42, 75,181,168, 22, 51, 61, 2,211, 24,204,130, 24, 0, 3,177,182,160, 88, 26,215, 8, 35, 31,200, 63,128,102,124, 32,
- 31, 97,198, 71, 62,242,129, 15, 52,174,237, 3,105,220, 93,236,114,185, 32,176, 52, 18, 3, 16,192,204, 96, 48,221, 35, 90, 76,
-139,234, 82, 89, 85, 41, 66,135,203, 43,143,224,195,185,215,221, 35, 43,179,186,122, 6,180, 50,183,136,140,242,240,136,112,191,
-126,126,191,223,247,247, 21, 69, 85,179, 44, 42, 86, 69,205,170,172, 89,149, 21,203,162, 98, 90,148,204, 87, 5,243,101,193, 98,
- 85,176, 88,149, 20, 69, 96,187,215,157, 65, 88,240,176, 9,123,124,219,249,159,180,198,210, 90, 71, 99, 28,214,121,140,243,225,
-107, 77,112, 45,173,170,134,197,162, 96,182, 92, 49, 91,172, 88,150,193,229,207,123,144, 34,234,200,160,193,139,223, 57,135,105,
-205, 26,250, 47,171,134,178,170, 41,171,230, 58, 81,238,179,189,144,224,101,129,243,159,153,134, 63, 71, 43,254, 34,232,228,243,
-140, 79,254, 50,112,250,139, 72,124,155,251,108,150,201, 61,121,235, 69,242,180,235,150,183,219, 70, 44, 47,213,196, 33,113,200,
-142, 51,175, 48,152, 98,202,222, 32,194,212, 21,123,145, 98, 60, 24, 50, 85, 6,235,106,116,146, 96, 68, 96,140, 70, 30,170,197,
- 28, 99, 12, 87,171,154,101,219,242,233,249, 25,166,173, 73, 18,137, 38, 48,123,243, 44,103,144,164,140,242,148, 27,187,187,188,
-118,247, 21,118, 6, 25,183,110,220, 32, 25, 36, 44,138, 21, 50, 78,105, 93,132,210, 3, 62,125,124, 74, 93, 25, 30,127,252, 8,
-107,234, 32,197,232, 33,198, 62, 63,250,255, 31,123,245,110, 82,151, 82, 6,171,203,231,154, 52,215, 51,159,251, 56, 75,233,240,
- 62, 76, 69,173,113, 72, 29,225, 60,140,119, 38,164,195, 33, 31,124,252, 4,219, 53, 17,101, 99, 24,166, 67,218,162, 98, 62,155,
-161,104,105,219, 54, 92,244, 18, 60,150, 79, 62,249,132,249,178, 36, 77, 6, 84, 85, 25,154, 0,223, 50, 25, 14, 89,173,150,124,
-242,201, 35,154, 85, 65, 91, 52, 44, 11, 65, 97, 60, 37, 17, 51,103,131, 36, 71, 88, 46,151, 11, 52,142,170,109,144,120,150,203,
- 22, 47,106, 38, 55,246,248,217,179, 75,142,238,189,202,135,239,253,140,119, 94,185,201, 64, 52,156, 94, 76,105,100,196,170, 50,
- 36,113, 30, 28,199, 4,164,145,100,118,121,140,150,150, 73, 22,113,251, 96,192, 39,231, 11, 26, 75,151,122, 5,177, 3,213,255,
-253,206, 6,195,147,198, 5,104,222,123, 98, 13,210, 74, 26,105, 80,194,226, 59,158,142,215, 18,165,193,137,134, 56,181, 68,222,
-135,192, 9,116,208,143, 11,197,170, 44, 73,198,158, 36, 73, 72, 7, 41,198, 26, 76,219, 80, 46,167,232, 52,227,237,251,247, 56,
- 59,125, 70, 91,175, 24,101,154,166, 48, 44, 23, 83, 76, 91, 17, 43, 65, 36,198, 93, 19, 17,206, 8,165, 37,173,111,240, 88,124,
- 91,226,156, 36,202, 84,231,207,175,176,149,195, 59, 67,219, 58,116, 20, 97, 76,133, 76, 6, 36, 73,194, 31,253,241,247,248,167,
-191,251, 93,190,245, 75,191, 66,148, 77,184,115,235, 54,131, 60,225,252,217,199, 28,236,141,152, 95, 62, 69, 39, 9, 22, 65,109,
-108, 8,215, 49, 54,152,156, 0, 73,156,172,243, 5, 84, 20,109, 10,114,183, 22,147, 29,225,104,123, 90,239,217,238,129,135,102,
-113,174, 13, 16,120,231,221,174,122, 67, 25,209, 59, 40,218,224, 0,231,122,137,149, 64, 74,191,150, 85, 5,215,183,205, 98,210,
-123,183,142,212,220,232,223, 67,145, 55,173,217,138, 90, 13,231,135,181,157, 66, 72,138,224, 72,183,101,200,212,155, 55, 33, 5,
-194, 89,156, 13,201,144,105,150,145,102, 37, 8, 24, 13, 51, 86,117, 70,101, 29,205,106, 25, 76, 86, 76,104, 34,150,203, 2,165,
- 37,131, 84,243,165, 55, 94,227,147,227, 25,109,211, 34, 85,140, 33, 98,186,170,120,118, 54, 99,255,106,201,124, 58,229,206,238,
-109,206,175,166, 12,227, 29,158, 62,250,128,219,247,238,115, 53, 59, 35,145, 6, 95,175, 80,113,140,211,161, 65,210,214,116, 46,
-141, 26, 8,206,141, 89, 22, 49,153, 36,220,186, 49,224,214,116,194,205,163, 29,222,122,245, 46,223,253,193,143, 57,126,246, 12,
-125,239, 14, 66,106, 62,248,243,247,120,240,250,195,192, 88, 23,146,101, 25,178,218,119, 71, 3,150,101,203, 48, 41, 88,158, 60,
-230,119,126,235,215,248,253,239,253,136,127,251,195,159, 97,191, 32,225, 71,116,198, 48,189, 35,219, 31,126,231,143,249, 27,191,
-249, 91,124,227,107, 95,229, 7, 63,250, 33, 59,227, 33,203,162,226,183,255,230,223,228, 63,255,207,255, 11,126,249,235,239,176,
-183,119,131,203,147,167,107,164,196,117,153,229,214, 90,148,220,248, 5,248,206,230,215, 88, 27, 52,252, 62,172, 16,157,247,180,
-216,110, 39, 30,214, 44, 97, 66,238,206, 62, 31, 86,172,206,133,137, 38,172, 24,109,199, 78,183,120, 39, 49,214, 0, 53,173,113,
- 84, 85,203, 50, 42,131,140, 18, 73,107, 12,181,105,105, 76,139,245, 14, 29,105, 76,228, 17,168, 46, 9,206, 5,111,139, 56, 32,
-103,214,121, 90,107,105,109,135, 32, 56,135,250,230,219, 15,254, 81,232, 68,197,214,174,169, 51, 68,232, 40, 40,108,193,209,107,
- 88, 26,185,214,103,126,145, 73,187, 23,199,191, 40, 56, 97,219,117,108,123,114,127,254,235, 47,131,214,175, 55, 0, 47,147,180,
-125, 22,123,216, 46,250,190,183, 7,180, 97,223,101, 91, 75,107, 76,103,215,103, 3, 11,178,219,177,125,102, 82,143, 21,145,238,
- 15,152,240, 98,206,175, 46, 41,138,101, 23, 17, 24, 28,155,138,178, 96,182, 44,176, 34,188,161,235,213,156,114,181, 96,182,152,
- 83, 86, 5,117, 93,210,212, 13,222, 90,198,131,156,131,253, 67, 30,190,242, 37, 30,190,242, 22,175,221,127,157,215, 94,125,155,
-219,119, 94,227,254,189,215,184,117,243, 54,123, 59, 19,226, 72, 32,124, 19, 38, 57, 15,231, 87, 83,140, 51,188,247,222,143, 56,
- 63,159,242,233,227,143, 81,145,103, 52,206,194,239,226, 35,240,186,211,164,246, 76, 96,185, 9, 37, 20,155,169,123,205, 50,237,
-236, 74,195, 69,221,105,208,183,159,255,222, 15,187, 35,186,244,123,117,191,109,187,219,221,250,176, 5, 41,100,183, 55,188,110,
-191,216, 55, 6, 18,197,209,209, 77, 26, 99, 56,187,186,162,113,129,120,180, 40,107, 18, 45,195,155, 81,192, 87,223,121,135,155,
- 71,135,164, 73,132,117,142,223,255,215,191, 79, 26, 39,204,102, 83, 22,179, 43,172, 41,241,214, 96,171,146, 85,121,193,114,117,
-197,114, 89,115, 57,133, 74, 38,156, 25,199,212,121, 10, 1,153, 84, 8, 37,168,189, 9,186,231, 88,115,152,197, 88,215, 48, 57,
- 58, 96, 94, 54,212,171, 6, 89, 22, 20,171,146, 69,213,114,103,119,135,123, 7, 67,198,153, 37,141, 64, 16,177, 88,150, 40, 5,
-117, 85, 50,189,156, 35, 85,196,197,249,156, 44,209,100,145, 68,227, 17,214,227,157, 32,137, 34,188, 15,111,122,175, 36, 94,122,
- 84,228,137, 36,248, 86,224,170, 48,197,183, 6,202, 66, 81,173, 28,202, 11, 26, 39,168, 26, 79, 20,103, 68,113,138,144, 26,231,
- 21,117,235,105,156,224,244,114,134,206, 71, 28,221,186, 67, 20, 39,172, 86, 75,140,169,169,234, 21,214, 91, 30,190,250, 42,203,
-233, 21,171,217,148, 88,194,124, 62,197, 24, 67,181, 90, 81,175,230,184,186, 64,218, 18, 45, 45, 66, 56,100, 36, 88,204,103, 68,
- 8, 76,219,226,189,197,217, 22, 45, 21,113,148, 32,165,166,110, 42,164,109, 16,214,163,148, 70,185, 26,237, 27, 42,171,249, 79,
-255,235,127,197, 31,252,225,159,177,155, 73,142,246, 6,164,195, 33,251,183,110, 99,125,139,107, 86,236,223,126,149,186,117, 72,
-149,128,206, 17,201, 78, 40,132,171, 41,205,242,138, 36, 78,136,226, 4, 21,233,224,146,168, 55,159,171, 78,207, 45, 35,141,140,
- 52, 74,107,148,142, 59,159,238,192, 88, 14, 1, 26, 42,124, 77,202,117,140,102,159,184, 21,166,231, 64,128,114, 62, 56,186,225,
- 55,122, 97,223,235,164,101, 23,125,219, 77,118,214,118, 7,118,119,192,123,231,105, 58, 7,185,170, 40, 49,214, 32,149, 10, 81,
-159,157,135, 60, 42,236,202,149, 14, 13, 10, 74,225,133, 32,210,113,208, 37,235, 32,205, 84, 42, 9,200,158, 13,133, 66,105,152,
- 76, 70,212,214,241,209,211,243,192,255, 0,116,228, 25, 38,138, 36,130, 52,141,209,217,144, 85,105, 88,150, 45,247,238,191, 22,
- 32,222, 72, 34,109, 48, 77,186, 88,182, 44,219,240,123,156, 60,123,134,232, 26,153, 69, 81,176, 51, 72,193, 25, 70,195, 17, 90,
-107,148, 80,129,144,230, 93,183,238,114,212,157,139, 92, 93, 55, 56, 15, 73,146, 48, 24, 12, 24, 13,115, 14,118,199,152,182,225,
-244,236, 28,175, 18, 62,121,118,206,253,123,247,209, 66,145,116,153,235,198, 54, 1, 85,241,130,193, 48, 71, 43, 79,170, 28, 95,
-122,227, 13,254,213, 31,126,143,210,118,113,204,222,246,241,244,155,168,236,231,112,228, 30,209, 0,168,219, 32, 33,251,202, 87,
-190, 74,146,100, 44,139,146,162, 40, 24, 15, 7, 52, 85,193,233,233, 41,217, 96,196,254,205,219, 92, 94, 93, 2,193,222, 21,239,
- 48,206,208,154,224, 30, 90, 27, 71,211, 77,207,109,231, 38,106,187,162,105,187, 41,219,217, 78, 30,103,131, 68, 46, 76,228, 30,
-227,108,215, 48, 4,182,187,117, 6,231, 76,199,175,216,248,204,219, 46,226,187,110, 2, 79,166,168,106,150,101,201,170, 44, 40,
-235, 58, 24,215,244,166, 57,157,175, 71,176,143,237, 33,120, 67, 81, 53, 44, 87, 21,171, 85,197,170,108, 40,203,134,162,168, 80,
-223,124, 59,216,196,250,107,148,232,141, 77,236,245,194,185, 85,248,187,201,247,243,130, 85, 62, 47,121,237,249,148, 54, 62, 39,
- 56,230,243,166,248,207,203, 88,255,188,157,251,139,100, 88, 88,183, 9,185, 55,129, 32,209,154,176, 55,177,221,139, 39,248,108,
- 81,143,116, 32, 49,200, 14,166, 51,173, 97,185, 90, 50,155, 77, 73,210, 4,135,167, 44, 43,102,243, 21, 6,193,229,188,160, 40,
- 42,176, 6,213,161, 0,163,209,136,241,112,200,141,253, 61,222,122,253, 53,238,221,190,205,112, 48, 96, 52, 30, 98, 77,201,124,
-122,206,108,113,197,179,211, 99,102,243, 75,138,229,101, 48,182,104, 45,182,173,217, 59,220,229,236,234,138, 69,217, 50, 28,238,
- 49, 30,236,114, 99,255, 6,123,187,187,104, 29,100, 95,190, 11, 84, 93,103, 13,139,151,191,102,219, 67,143,191,230,250,230,159,
- 67, 64, 36, 66,201,181, 76,141,173,116,164,235,132,165, 78, 32,209, 27,101,110, 93, 83, 61, 91,185, 55,251,113, 93,196,113, 28,
-199, 24,107,120,255,163, 71,225,160,141, 18,118,119, 38,196,145, 66, 41,201,120, 60,225,230,205, 3, 94,123,112,155, 81,158,242,
-222, 79,223,227,248,233, 51,210, 56,102, 62,189,162,169, 75, 22,179, 75,202,170, 96, 86, 76,241,179, 57, 73,229, 57,191,172, 57,
-182,240,180,181,212,128, 13,249, 28,196,214,145, 72,137,115,158,253, 81,198,249,180,228,112,152,128,111, 25,237,238,114,117,181,
- 64, 57,129,244,142,186, 53,120,173,144,110, 73, 22,195,238,206,132,189,221, 9,195, 81,130,146,142,197,116, 69, 26, 39, 76,139,
-166,139,149,117,148,101,203,254, 48,167, 89,148,196,120, 74, 5, 42, 2, 73,216,165, 71, 34, 34, 38, 4,180,180,181,167,106, 4,
-198, 72, 90, 33,153, 85,158,139,169,163,174, 5,203,165,161, 40,130, 83, 86, 8,154,208,120,169,113, 94, 82, 55,150,211,139, 41,
- 34,138, 25,141,119, 17, 42, 98, 54, 95,208,182, 13, 87, 87,151, 44, 22, 11,222,120,237,117, 98, 37,168,139, 57,174, 89,210,148,
- 75,164, 55,156,157, 28,243,241,227, 99,222,123,255, 35,202,213, 18,233, 44,105,172,201, 59, 57,153,180,142,139,243, 11, 76,219,
-128,179,212,117,133,115,142, 52,201, 80, 82,225, 92,131, 45,150,196, 74, 99, 60, 8,215, 32,156, 97, 86,194, 63,254,239,254,128,
- 91, 55,239,242,149,135,247,216,223, 25,145, 12,135,129, 88,154,106,158, 61,126, 68,146, 79,130, 76, 77,199,160, 18, 26,235,208,
-194, 83, 79, 79, 81,222, 6,232, 93, 7,146, 95,159,133,222,127,140,226,104,221, 88,174,139,120, 20, 33, 58,227,142,254,235, 66,
- 6, 39, 47,157,132, 98, 25,233,120,157, 19,160,250,108,117, 21, 33,149,238,180,209,157,140, 41, 10,246,176,206,249,181,124,206,
-119,137,142,206,185,173, 93,252,150, 35,101,119,232,247,239, 15,217, 71,189,234,168,107, 58, 54,183,158, 0,181,206, 44, 80, 17,
- 73,150,161,180, 70, 72, 73, 28,199, 44,150, 51,118,247,118, 56, 60, 60,228,244,252,130,203,249,138, 79,159,158, 80,172,230,236,
-140, 18, 30,190,122,151, 36,146,232, 44, 67,198, 57,211,162,161, 54,112,112,176, 79, 30, 11, 98,217,146,105,193,120,239,128, 71,
-207, 46, 89,212,142,225,104, 18,208, 15, 29, 81, 86, 53, 42,210,212,171, 5,247,111,221,192, 52, 37,145, 12,186,241, 40,214, 88,
-103,200, 7, 57,113,156,116,206,102, 49,113, 28,175,205,124,172, 13, 41,100,177,142,201,135, 3,170,166,225,253,143, 62,225,228,
-252,138, 7,119,239, 16, 43,133, 18, 16,105,133,177,109,112, 3,116, 30, 29,107, 98, 45, 72,132,229,245, 55,222,164,242,154, 63,
-249,209,123,244,218, 5,255,162, 93,225, 86,133,247,207,125,253,242,242,146,183,223,124,155,251,247, 31,240,238,123,239,241,229,
-183,191,196,249,217, 41,187, 59, 19, 62,248,232, 67,140,117,196, 89,206,238,100,196,229,229, 69,199, 30,183, 29, 84,238, 49,222,
-135,253,185,221,114,158,235, 94,219,141,194,199,175, 33,251,254,245,182,221,180,239, 58,115, 27,219,125,127,120, 12,214, 14,165,
-235,235,195, 19,118,242,157, 99,156,233, 87,190,198,225,108,215, 52,154, 45, 52, 96,221,120,132,102,163,172, 55,140,251,229,170,
-160, 40,107,138, 50,124,237,165,240,123,207,100,126,145, 22, 93,108, 89,165,190,200,210,245,231,195,229, 47,215,178,255,101,201,
-115,207, 67,239,207,175, 12, 94,202,166,124,225,138, 64,126,161,223,105,141,103,116,247,211, 58, 98,119,119,151,147,147,103,156,
-156,157,227, 12, 40,161,200,178, 24,233, 53,122, 48,160,113,146, 97, 22, 82,222, 46, 46,167,104, 29,209, 84, 37,103,103,103, 84,
-203, 37, 81,167,201,189,123,255, 46, 89,172,184,119,251, 22,195,201, 14,113, 58,228, 96,103,194, 40,145,140,178,140, 68, 74,198,
- 3,144,218,227,117,206, 96,110,105, 91, 77, 45, 64,170,146,200, 91,124,235,144, 81, 26,156,138,164,197, 9,211, 73,125,228,139,
-149, 10,207,169, 26,182, 27,159, 23,189,194,107, 66, 81,111,165,248, 2, 91,206,107,178,159, 78,250,102,157, 67, 56,219,125,175,
-236, 76, 67, 4, 10,135,236,126,214,171,247,238,241,215,126,253, 91,124,240,232, 99,164, 30,113,126,242,140,182, 44,152,140, 6,
- 92,205,102,252,147,127,250, 79,249,229,111,188, 77, 44,225,207,255,236, 7, 12,243, 33,143, 63,126,196, 32,203, 88,181, 53, 31,
-127,252, 49, 77,181, 2, 91,177, 55,156,112,190,178, 92, 22, 32,149, 6,233, 40,164,101,132,100, 79, 72,246,156, 96,172,135, 44,
-149,229,201,124,193,101,236,249,209,178,228, 77,173, 41,230, 75, 70, 89,198,188, 90, 48,153, 28, 80, 57, 88,186,150,201,193, 8,
-145, 36,252,240, 39,159,242,240,225,109,242,168,225,225,173,148,189,244, 6,143,143,151, 12, 99, 13, 14,134, 89, 74, 93, 86, 40,
- 39, 56,204, 19,164,112,220, 61, 28,243,228,211,115,226, 8,140,129,198,130,119, 18,229, 99,132,104,105, 61,180, 94, 81,183,134,
-133,119,120,175,200, 74,203,209, 72,112,123, 71, 97,157,229,242,114, 69,101,192,171, 5, 73, 58,225,224,240, 22,113,150, 97,125,
-208,249,151, 69, 77, 81,150,148,101,137,181,150, 7,119,239, 49, 72, 50,150,243, 75,202, 98,134,179, 13,214, 57, 62,249,240,152,
-119,223,123,202, 69, 13,173,131,227,203,160,183,157,205, 23,252,242, 87,223, 98,127,156, 49, 24,142, 72,148, 98,186,152, 81,170,
-176, 87,111,155,150, 52, 73,201,178, 28, 45,192, 10, 40,203, 2,146, 28,223,180,160, 4, 85, 19,156,212,126,245, 91,223,226, 27,
- 95,121,133,233,229, 49,137,214,180, 77,201,104,156, 17,233, 4,156, 65,235,136,213,170,192,122,139,198, 99,171, 21,229,114, 70,
- 26, 73, 34,181,177,195,236,209,157, 77,124,234,117,203,226, 62,251,188, 31, 66,250,224, 14,133, 39, 81, 97,247,110,173,237,242,
- 7,130,226, 2, 17, 58,201, 78,130,220, 65,178, 13,116,166, 46,161,142, 4, 66, 85,200, 91, 17, 72, 84,135, 74,117,102, 51,214,
- 6,212,171, 51,112,137,116, 28,188,194,149, 70,233, 4,157, 36, 68, 73, 76, 20,199,161,201, 96,147,213, 30, 37, 91, 3, 73, 36,
- 58,155,227, 8, 21,107,226, 44,225,134, 61, 34,203, 50,206,207, 46,121,248,218, 3, 86,149,225,143,254,228, 93,238,220,206,249,
-213, 95,249, 6,187,131, 44, 40, 40, 84,204,213,101,197,170,243, 25,176,182, 10,154,108,101, 25, 12,134, 8,103,137, 35,133, 83,
- 2,103, 13,198,180, 8, 41, 41,234,146,221,253, 67, 46, 79, 46,152,151,134,195,193, 8,233,106,156,179,228,121,142, 82,146,166,
-105,214, 78,162,190,155, 62,131,163,153,196, 56,135,117,130,201,120,132, 19, 18,132, 70,234, 4,248, 49,143, 30, 61,226,225,131,
- 7,100,105, 28,200,150, 73,138,113, 14, 61,200,185,156,205,144, 34, 39,145,142,217,249, 51,254,167,255,195,191,203,255,237,159,
-253,115,206,139, 22,107,229,115, 85,187,127,157, 94,206,157,155, 47,230,252,127,254,249, 63,231,245,215,223,224,230,205, 91,252,
-238,191,248, 93,254,246,223,250,109,222,127,255, 61,190,244,165, 47, 83, 86, 13,255,252,119,127,151,255,205,255,250,127,197,227,
- 79, 63,161,169,203,238,241,252, 86, 25,176,155, 48,175, 45, 39,204,254,124,235, 11,124,144,239,134, 9,221,185,237, 38,207, 95,
-251,184, 93, 79, 59, 79, 29,236,250,220,235,234,159,227,133,245, 84, 56,129,113,142,214, 70, 52,205, 38,155,192, 19,174, 55,211,
-161, 69, 61,145,111,109, 19,251, 82,121,215,203,164,110,235,169,254,197,123,115,241,115, 44, 72,183,229, 82,127, 81,189,249, 95,
- 70,182, 38,186, 96,250,107, 18,148,231,168,221, 27,213,139,216,146,186,189,216, 89,173,135,233,250,239,243,120, 70,227, 9,111,
-189,253,101,236,143,127, 68,154, 68, 68,120,218,214,115,124, 81, 82,172, 22,212, 70, 98,202, 18, 37, 5,141, 49,100,113, 76, 58,
- 24,113,243,181,215, 24, 15,114,210, 56, 14,161, 13, 55,110,146,198, 17,163, 44, 39,138, 83,140, 19, 84, 5, 40,227,192,204,184,
-106, 47, 57,121,214,146,165, 67,158,156,205,249,244,217, 21, 63,125,247, 61, 48, 53, 71,123,138,139,203, 25, 94, 13, 57,188,245,
- 10,174,179,189,116,210, 93, 35, 0,125, 33,123,216,109, 69,196, 75,154,192, 94, 15,236,241, 47, 68, 95,164,220, 76,233, 61, 52,
-239,172,195,120,137,148, 1,154, 18,194, 99,145,200,142,148,232,132,231,157,183,223,226,246,209, 13,254,213,239,125, 23, 87,149,
- 72,239, 88, 21, 5,201, 96,192,217,179, 25,127,248,189,159,242,245,215, 30,112,252,233, 83, 70,163, 33, 2, 79, 50, 30,178, 59,
-153,176,183,179, 67, 91,106,104, 75,126,242,209, 25,211, 74,208, 68,154,149, 9, 7,120,100, 33,151,144, 8, 79, 19, 75,206, 92,
-193,188, 10,251,236, 73, 29,209,150, 53,245,110,134,181, 37,119,110,223,102, 53, 43, 56,189,184, 96, 81,215, 52,120,158,124, 50,
- 71,221,144,236,236,238,240,147, 31,127,194,221,219, 3, 84, 36,136,163,156,183,223,184,195,199,207,158,114,113,177, 66,120,203,
- 32,139,152,205,102,140, 82, 13,206, 34,102, 5,247,198, 25,131,124,192,233, 85,193,233,162,162,113, 21,145, 18, 76,164, 71,155,
-208, 50,182,128,147, 2,107, 37,141,112, 76, 14, 50,146,212,211,182, 48, 95, 57, 6,187, 25, 7, 71, 55,104, 93,132, 65,176,187,
-119,192,211,147, 19, 70,121, 68,107,195,225,139,119,124,237,171, 95,193, 52, 45, 87,231,231,204, 23,151, 92, 45, 46,184,152,205,
-120,122,177,228,241, 73, 73,101, 5,181, 16, 56, 28,243, 39, 83, 46,202,154,218, 25, 70,195,156, 87, 15, 71, 12,243, 43,134, 7,
- 71,212,197, 10, 25, 69, 29, 81, 12,150,179, 25,137,142, 80,145, 39, 75,227, 48, 97, 8, 1,145,198,123,199,197,229, 28,231, 28,
- 73, 28, 49, 26,239, 32, 58, 41, 24, 38, 64,211, 8, 69, 83, 87, 16,103, 8,165,195,106,162,173, 56,125,250,136, 84,208,105,114,
-195,196,188,205,126, 95,239,161, 59, 14,135,115,193, 85,171,143, 82, 21, 82,224,188,192,185,176,165, 21, 82,160,163, 40, 56,115,
- 37,201,154,240,102, 76,208, 14, 11, 92,167, 7, 14, 16,123, 20, 43,240,225,177,149,128, 40,210,180,117,189,206,216, 14,107,206,
-205,174,189,255,121, 72, 80, 50,130,110, 10,142,146,152, 56, 77, 72,179,140, 56, 73, 80,177, 94, 51,221, 5,225,239,235, 11,128,
-148, 10,226, 94,206,214,189, 63, 91,195,206,193, 62,206, 88,132, 18,236,237,141,249,230, 55,190,138,243, 45,227, 73,198,141,195,
- 9,195, 56,166,105, 44,142,132,214, 52, 84,141, 67,170,152,249,124, 65, 66, 68, 54,144, 88,211,118,171,136,176, 66,177,166, 97,
- 60, 30,113,124,122, 65,150, 13, 56, 59, 57, 99,152, 14,120,122,177, 32, 83, 57, 59,153, 96,103, 48, 34,201,114,132,168,201,178,
-156,162, 88, 5, 51, 23, 44, 82, 70,196,137, 14, 18, 76,107,192, 71,104, 36,142, 60, 32,110,226,117,134,121,206,119,255,228,123,
-124,250,233, 99, 94,121,112,143, 76,167,157, 2,163, 98, 85,149, 68, 50, 40, 8,146, 56, 69,152,154,216, 21,220,221, 31,113,177,
- 56, 14,121,229,126, 59, 8,106,125,106,188,148,225,228,129,239,253,249, 15,248,254, 15,127,192,183,126,233,151,249,227,239,126,
-135, 63,254,147, 63,229, 55,126,253,175, 16, 39, 25,127,250,103,223,103, 48, 24,241,224,149,135,188,245,229,119,248,222,159,124,
-167,103, 2,175, 79,174, 53,176,255,220, 89,183, 65, 40, 89, 95,107,155, 2,239,215, 86,232,206,250, 53,218,232,185,142,130,175,
-173,178, 61, 91,214,184,215, 19, 66,183, 11,187, 16,162,115,161,115,212, 98, 99,122,180, 38,118,247,190, 8, 94,172,127, 7,245,
-245, 55,239,254,163,151, 77,182,207,231,169,191,128, 83,246,133, 72,110, 47,102,184,115,157, 53,253, 18, 38, 60, 95,128,129,255,
- 69, 27,130, 23, 69,182,110,119, 85,116,158,190,214,133, 93,186,177,225,214,118, 31,173,117,107,246,251,154,245,174,187,196,182,
- 46,111,186,127, 92,235, 28, 77,219,114,113, 53,165, 40,150, 1, 10,158, 46,137,211, 28, 33, 19, 38,187,123,236, 76, 38,236,239,
- 77,184,113,120, 64,170, 99,156,109, 57,216,223, 39,142, 34,150,139, 37, 82, 10, 78, 78,159, 98,155,146,186, 92,112,122,246,140,
-217,124, 74, 93, 46,168, 86, 87,164,113, 65, 85, 60,197, 54,134,197,172, 33, 73,246, 56, 62,187,224,244,244, 17, 7,135,154,253,
- 93, 65, 62, 76, 48, 64,148,228,120, 25,173,119,231,188,100,197,209, 31,116,242,186,178,241, 26,204,248,252, 69,183, 14, 38,232,
-155, 4,252,203,227,112,123, 27,207,117, 66,149,216, 24,128,248, 48,225,120,239, 54,175, 73, 71, 72, 25,230, 25,111,220,187,203,
- 43, 55,247, 81,174, 37,138, 34,206,231, 43,106, 15,127,246,163,119,185,115,112,128,182, 45,121,150,114,176,191, 71, 89,174,194,
-190,218, 24,170,229, 18,191, 50,124, 48, 45,120,108, 61, 75,107,201,101, 68,234, 61,169, 20, 33,254,212,123, 22,206, 97,187, 3,
-196,122,208,232,240, 70,179,134, 60, 17,204,174,174,104, 90,135, 74, 6, 24, 66, 52,102, 92,195,114, 94,114,235,238, 1, 73,226,
- 57, 63, 94, 82, 55, 18, 82,141,165,226,230,126, 70, 26,135, 67, 35, 73,116,216,183,122,130, 23,188,143, 24,141, 71, 44,202, 10,
-163, 52,211,178,162, 21, 14, 41, 29, 89,228, 73,165,199, 11,203,104, 71,163, 83, 69, 85,183, 76, 50,184,117, 24,177, 51, 26,178,
-179,187, 71, 62, 74, 25,237,236,144,100, 35,118, 15,111,132,125,173,148,232, 56,198, 56, 79, 89, 85,164, 89,202,107,175, 60,192,
-152,150,217,213, 37,213,114,193,229,236,146, 71, 79,142,249,201,163, 41, 79,102, 45, 83,167,168, 72,105,165,192, 8, 65,139,103,
- 90, 4,227,159, 72,180,220,216, 29, 17,199, 17, 94, 8, 98, 29,138, 69,164, 52,186, 59,212,165,148,228,121, 74, 44, 69, 48,222,
- 32,194, 54, 53, 77,221,176, 50,154, 89,233,185,113,120, 68, 93,149, 76, 38, 35, 6,131,140, 44,209,104, 45,185,186,188, 8,206,
- 89, 94, 80,182,158, 88,107,206,158,124,140, 41,231,196, 50,200, 20,149,138,214,193, 27,170,211,236,174,213, 22,178, 11,197, 80,
-178,219,155,203, 13,207, 99,157, 3, 44,144,170,219,105, 75, 73, 20, 71, 33,198, 87,134,143,253,245,187,134,234, 59, 20, 64,105,
-141,142, 19, 34, 29, 82,176, 34, 29,246,248,253,125,195,249, 44, 64, 73,100,191,167,143,194,247,232, 56, 76,231,105,158,147,100,
- 25, 81,146,160,226, 56,192,238, 73,152,214, 67,138, 72,248,121,189,218, 69,196, 49, 40, 25, 52,234, 82,132,253,123,164,153, 93,
-205,144, 82, 18,167, 25, 82, 69,220,186,125,196,206,206,128,209, 48, 11,206,138, 34, 97,190,106,185,154,215, 28,159,206, 40,138,
-134,247,222,125,151,197,197, 41,222, 86,100,249,144,120,184,203,201,180, 66, 38, 57,198,122,180, 78,104,140, 35,207, 7,120,231,
-200,242, 33,243,217,148, 91, 7, 19, 82, 97, 48,109,141,247,138, 52, 31,146,143,198, 12,242,160,208, 73,210,132,241,100,180,134,
-194,189,247,129,157,221,241,166,156,245, 84, 93,254,119,146,230, 60,250,232, 17,194, 11,242,193, 32, 52, 49,206, 34,156, 13, 42,
- 14, 37,201,226,168,107,140, 36,217, 96,194, 31,127,255,199, 88, 23, 92, 52, 17,155,148,251,109, 10,247,243, 50,173, 62,152,167,
-109, 91,150,203, 5, 95,253,242, 59,124,237,107, 95,227, 31,255,151,255, 5,247,238,221,229,205,183,222,230,254, 43,175,242,107,
-191,254,235,236,239,237,113,184,191,207,135, 31,188, 79, 89,174,240, 29,169,119, 61,181,139,151,172,131,187,194,109,157, 93,243,
- 42,174,185,104,250,235, 72,130,232, 72,225, 91,174,231,159,153,252,175,173,128,121, 46, 39, 99, 43, 68,198,174,161,254,110,191,
-239, 54, 60, 39,183,245, 24,234, 27,111,221,251, 71, 47, 39,185,189, 56, 78,181,255,127,159,183, 83,127, 17,241,237,249,199,254,
- 60,249,217,207,133,188,191,128,123,221, 47,100,114,227,125, 23,167,187,145,180, 89,107,131, 79,175, 13, 4, 5,235,194, 14, 57,
- 82,138, 56,214,225,214,201,217, 98,173, 3,251,182,243,141, 55, 29, 20, 87, 87, 13,171,197,130, 68,107,118,119,119,208, 58, 33,
-201,134,129, 12,163, 68, 32, 83, 93, 93, 50,159, 77, 3, 51,185, 88,177, 92, 46,104,219, 26,173, 21, 73, 98,240,118,193,225,126,
-206,120,146, 48, 24, 40,134, 3, 79, 18, 21,164, 81, 67,181,152,177,186, 90,112,252,228,140,214,120,172,112,236,238, 15,201,115,
-133,111, 27,110,222,190, 79,235, 35,106, 7, 94,168, 23,216, 9,189, 40,114,151,181,209,142,223,186, 96,214, 23,208, 53, 11, 76,
-185, 85,212,197,122,167,254,252, 99,110, 26,183,109,149,193,214, 27,214, 19,118,115,222,108,117,193,129,117,218,167,137, 71,145,
- 98,119, 50,228,238,173, 35,132,138, 56, 62,191,164,108,130,142, 84,182, 13,223,254,213, 95,198, 58,131,214,130, 79, 30,125,200,
- 40,207,248,209, 15,127,204,116, 54,229,248,170, 96,190,178,232, 40,166,241,193,135, 93, 9,184, 63,220,101, 71, 39,152,214,112,
- 37, 28, 75, 28,141,247,180, 30,116,224, 67,147,167, 17,121, 34,169, 86, 13, 58, 75,153, 87,150, 91,119,110,177, 42,150,236, 68,
- 9,141,181,248, 68,112,112,184, 71, 44, 29,139, 69,201,147,139,130,210, 89,118,118,119,144, 74, 48, 72, 99,148,112,236,237,142,
- 89,174,106,230,165,229,188,177,232, 68, 97,188, 99,190, 44,241, 14,118, 99,201, 94, 12,183, 14,134,232, 84, 17, 43, 56,186,149,
-179, 51,137, 72,163,136, 97, 34,121,112,111, 76,164, 53,181,177, 24, 15,198, 75,170,214, 4, 15,124, 41,105,219, 96,242,209,180,
- 13,163,201,152,225,104,128,105,107,170,114,201,229,229, 9,214, 20, 52,109,203,229,180,228, 98, 22, 76,137,250,226,231, 59,246,
- 46, 66, 98,113, 20,165, 33,166,229,230,254,152, 97,150,226, 92, 64,161,158, 29,159,226,124,136,205, 77,179, 12, 33, 5,163,241,
- 16,229, 29,197,170,198,138, 8,211,148,248,182,197, 71, 67, 38,135,247, 80, 82,146,231, 3,162, 72, 49, 25,230,212,213,146, 56,
-137, 49,214,177, 90, 44,113, 81,140, 37, 98, 49,157,113,252,201, 7, 12,116, 8,106,137,162,144, 70, 37,213,134, 92, 41, 59, 98,
- 38, 66, 4,130,220, 22,233, 77,118,187,243,112, 50,203,110,250,246, 91,169, 88,221,254, 90, 74,148,140,130,247,118,119,247, 40,
-138, 16,157,165,171,140, 84, 96, 32,199, 61,100,222, 49,239, 59, 41, 93,127, 31,165, 2, 49, 47,210, 49, 58, 78,136,147, 4,157,
-164,232, 52, 37,201, 50,146, 52, 67, 39, 41,145,142,137,162, 24,149,132,162,237, 5, 97, 95,175, 20, 34, 82,161, 89,232,136,115,
-200, 8,162, 40, 20,124, 17,225,157,231,242,236, 2, 47, 20,181, 9,112,107,158,103,193,202, 87, 41, 36, 17,166, 5, 45, 19,172,
-151, 28,159, 93,241,241, 39,143,121,245,193, 93,246,198, 25,206, 84, 60,126,118, 70, 52,220,195,197, 67,106, 23,136, 36,195,209,
-136,170,105,187,129,198,144, 14, 39, 84, 85,193, 78, 38, 25,199,161,161,149, 81,204,124, 62,167,173,107, 34,173,209, 73, 76,146,
- 36, 40, 41,137,147,152, 56, 78,200,243,148, 52,137,215, 40,104,120,126, 52,197,114, 21, 28, 51,133,230,227,143, 62,102, 56, 28,
- 50,154,140, 72,147, 8, 76,139,146,132,115, 46, 78, 66,227,134,224, 87,127,229, 87,104,154,138,179,227, 51,202,162,222,148,242,
-190,232, 10,127,125,183,238,183,253, 52,194,121, 62,159,207,121,245,254,171,188,241,198,235, 28,159, 28,243,222,123,239, 17, 39,
- 41,119,238,222, 67,199, 9,206, 88, 62,250,240,125,238,223,189,205,179, 39,159, 34,241, 72, 9,113,151, 49,160,187, 8, 95,221,
-133, 6, 73, 33,215,177,185,215, 98,168,251, 97,199,117,193, 47,221, 74, 39,164,169, 69, 93, 12,117,119,139,212, 70,121,209,173,
-129, 66,147, 26,194,123,162,245,215, 69,248,188,147,105,246,134, 75,108,197, 97,111, 36,154, 27,249,177,232,220,248, 62,191,168,
- 35, 62,103, 42, 22, 47,156,212, 95,154,205,126,237, 49,174, 55, 4,159, 87,208, 95,148,204,246, 69,253,199,159,191,125,238,253,
-187, 14, 41, 76,234,157,182,176,211,169,247,250, 66,119,109, 82, 15, 68,185,245,212, 30,105, 84, 96,189, 5,249,131, 7,235,130,
- 55,112, 85, 20, 68, 66,160,165,164,105, 29,151,243,101, 64, 1, 76,195,213,229, 57,243,217, 28, 65, 8,115,240,206, 34,165,224,
-240, 96,159,253,253, 61, 18, 45,144,206, 16, 73,207,225,193, 1, 73, 28,209, 54, 5,203,233, 41,237,162,102,246,108,206,236,252,
-140, 40,242,164,131,152, 87,223,120, 72,146,142, 80,164, 84,133, 96,119,255, 46,103,151, 11,108,199,236, 21,235,247,132,223,172,
- 22, 94,128,166,108, 19,229,182,187,192,207, 48,223, 63, 51,169,111,138,250,139, 16,152,107, 25,235, 66,210,191, 85,186, 69,230,
-250, 13,187, 22, 43,116, 82, 15,239, 5, 13,129,165,172, 35,201,237, 91,183,185,119,247, 46, 7,187, 59,248,170, 96,122,121,201,
-151,222,122,141,243,139, 83,150,203, 25, 59,227, 17,207, 30, 63,230, 7,223,255,128, 73,158,114,121, 81, 48,119,158,101,107,185,
- 61, 25,177, 35, 66, 44,227,194, 91,158, 85, 5, 53,158, 2,135,118,130,129, 8, 19, 82,229, 12, 75, 25,118,177,123,163, 36, 4,
- 67, 88,137,215, 9,101, 91,115,176, 59, 64, 69,142,105,211,208, 74, 77, 89,148,188,122,123,128,162,162,105, 60, 79,174, 60,143,
-206, 23,236,238,238,177, 51,204, 48,197, 18,219,212,236,236, 12,145, 2, 92, 99,200,148,197,213, 45, 17,144,197,154,129,214,200,
-198,210,122,199,180,178, 52,181,101,152, 27,226,216,115,208, 93, 15,198, 22,212,109,203,254,225, 33,217, 96, 4, 82,177, 90, 21,
- 28, 28,222,160,172,202,206, 44,195,114,243,230, 77,100,164,130,110, 28, 75, 89, 44,152,207, 46, 48,166, 32, 75, 83,198,249, 16,
- 87,149,196,206,242,224,112,200,157,253,148,166,168, 66, 3,235,187,169,214,123, 68, 99, 56, 28, 37,236, 12,243,144,124, 38, 20,
-198,194,116, 54, 95,239,148, 17,130,209,100, 12,198, 82, 44, 43,234,214,226,154, 10,211, 52, 76, 11,203,222,209, 3,188,247,232,
- 36, 38,203, 82,134,131, 24,211, 84, 8, 41, 89,150, 37,182,105,209,217,152,211,203, 25,255,238, 15,126,143,221, 44, 34, 85, 16,
- 71, 97,178,141,244,102, 50, 15, 83,247,182, 55,194, 70, 18,182,109,244, 18,174,101, 7, 88,132, 0,165, 4,206, 25,116,164, 73,
- 98,189, 81,171, 16,138,190,236,208, 67,213,253, 28,191, 38,198,234,112,232,198,122, 93,124,251,247,125, 20,233,176, 43,215, 93,
- 58, 96, 28,119, 83,122, 70,156,164, 68,113,130,142, 99, 84, 28,135,162,173, 20, 68,170,243,183,149, 8,185, 33,177, 6, 72, 95,
-130, 80,120,165,130,132, 76,134, 70,188, 94,149,172,150, 5,113,154, 97,157, 32, 78, 82,148, 14,150,161,193, 56, 5,118,198,187,
-228,105,196,197,229, 21, 79, 78,206,112, 2, 94,127,120,159,135, 15,142,120,251,205, 7,164,163,125, 30, 29, 79, 57,155, 87,236,
- 31,221, 33,207, 7, 88,235, 88,174, 10,132,240,148,197,130,225,238, 33,231,231,167,220,221, 31,177, 63, 80,100,113,130,208, 41,
- 77,211,226,156,165, 44, 75,234,170,194,180,109, 72, 25, 83,225, 57, 22, 34, 88, 60,103,105,194, 32, 31, 16,199,233, 90,119, 63,
-155, 87,184,214,225,173,231,211,199, 79, 56,188,113, 64,158,198,220,186,113,192,108,122,134,214, 26,135, 64, 71, 26,215,182,100,
-113,204, 32,205,185,115,243, 6,171,178,226,242,106, 22,194,182,214,147,224,231, 24,169,116,235, 79,107, 29,182,177,252,210, 47,
-125,147,123,119,239,242,143,255,241,127,197,227, 39, 79,104,109,144, 26,126,248,254,123,124,250,241,135,129,220,154,166,156,157,
- 30,163, 4,221,173,111, 28,187, 92,129, 62,182,204,119,241,173,136,107,131, 71, 95,228, 69,119, 93,134, 34,222,165, 8,110,173,
-140, 34,213,249, 37,200, 77,193,142,148, 90,127,236,111,235,244, 65, 41,215,206,137, 61,178,173,186,226,223,223,119,219, 39, 37,
- 92,143, 42,192,239,189,124,233, 51,112,195,231, 26,202,188,124, 82, 23, 47, 41, 22,215, 27,134,173,136, 68,196,181,207,229, 22,
-100,177,109,108, 35, 94,246, 74,110,237,180,253,103,194, 98,182, 37,121,159,229,196, 93,255,188,123,209,214,147,122, 7,193,111,
- 49,224,133, 8, 19, 99,172, 35,226, 56, 10,209,125, 81, 68,172,187, 3,165, 79,172,179,126,205,126,188,188, 56,167, 44,150, 44,
-230, 11,180,210, 84,181, 9, 69,202, 54, 20,197,138, 52,137,137,227, 12, 80,212,109, 77, 26, 71, 8, 23, 12, 70,166, 87, 51,242,
-124,194,193,193, 29, 6,195, 93,178, 60, 99,181,152,130,169,176,165,163, 89, 90,246,246,115,118,246,115,110,220, 62, 34,206,134,
- 76, 23, 13,171,210, 16,235, 9,163,201, 30, 23,151, 23,212,214,224,187,245,128, 92, 79,210,221,115, 45,215,244, 1,132,112,168,
-126, 2,223, 58,244,228,182,124,177,187, 48,251, 11, 56, 82,146, 40,146,221, 84, 37,187,238, 52, 28, 56,253,243, 19, 58, 87, 21,
- 2, 19,186,207,163,238, 66,143,162, 64, 10, 12, 31,101,184,111,164,214, 23,175,232,166, 72, 39,100, 96,147,118, 77,216,209,225,
- 1, 59,195,140,119,222,126,133,111,127,235,155,156, 95,156,115,117,117, 65, 42, 36,171,233,156,239,253,232,103,204, 86, 13,198,
-194,121,109, 41, 61,164, 42, 34,106, 26, 82, 28,214,195,204, 25,140,135, 88, 40,108,119,144, 87,206, 82,226,176, 74, 96,100,176,
-237, 84,214, 49, 25, 36,204,231, 21,249,120,204,233, 98,137,141, 64,197, 96,156, 97, 94, 24, 82, 5, 89,234,201, 82,141,109, 29,
-138,136,162,114,124,116,124,197,194, 88,238, 62,184, 75,170, 35, 46, 79, 47,144,214,178, 59,208,228, 90, 18,203, 62, 68, 36, 2,
- 4,113, 12, 6, 71,150, 69, 28,238, 13, 2, 51, 89,133,169,106, 50,158,112,227,198, 1,121, 62,160,110, 45,187,251, 7,160, 20,
-141, 13,146,156, 36,209,232, 88,177,179, 51,217,188,158, 2,218,170,164,173, 42,188, 51, 84,229, 42, 28, 20,206,225,218,154,195,
- 73,198,171,119, 14,130, 55,248,172, 64,116,196,159,200,123, 18,224,238,254,144,195, 73,206,206, 56, 39,142,130,157,238,104, 50,
-225,209, 39,143,209,157,255,126, 20,135,169,166,173, 91,102,179, 5, 77,221, 2,142,162, 44,153, 47, 91,226,124,130,140, 99,156,
- 53, 12, 7, 41,216,150, 88, 43, 90,235,168,234, 22,103, 44, 69,235,249,111,254,233,255,155,167, 79,159,113,184,191,199,100,144,
-161, 35,209, 29,134,106, 51,137,116,236,118,213, 49,221,233,246,229,219,230, 71,253,199,222, 9, 81, 42, 21,118,237, 61,217, 78,
-200,245,185, 19,206,177,238, 49,214, 14,112,161,153,149, 29,116, 31,162,124, 59,104, 95,116,166, 49, 82, 33,186, 41, 93, 70, 49,
- 82,107, 84,172, 81, 81, 68,148,164, 1,170,215,157,116, 45,214,235,162, 30, 88,248,155,223,161,255,253, 69,231, 39, 47,149,134,
- 40, 56, 80,246, 97, 34,229, 98,133,107,131, 94,188,172, 27,140, 11,146,168,166,173,241, 30,110,221,190, 19, 12,146,202, 5,103,
- 23,151,156, 95,205,104, 77,195,104,148,144,196, 30,173, 21, 98,116,131, 21, 41,232, 1,113,146,161, 35, 69,211,212,196,113,198,
-124,177, 36,141,195, 20, 94,172, 10,114, 45, 57, 26,165,184,182, 66,165, 89,224,176, 36,193,124,198, 57, 31, 8,141,214, 6,153,
- 91,107,137,227, 56, 68,133, 70,225, 26,150, 74,145,198, 9,177,214, 32, 53,117, 93, 81,215, 13, 87, 23,151,216,186,100,111,111,
- 72,150,107,170,186,130, 14,137,144,162, 95,117,165,188,250,234, 43,224, 28,183,143,110, 16, 9,193,201,233, 69,144,120,193,117,
-247, 44,191, 5,116, 75,209, 7,135, 2,112,121,121,197,235, 15,223,224,173, 55,222,226,252,228,132,147,167,159,208,150,115, 78,
-158,126,196,197,217, 41,121,150, 33,145,236,238,238, 82, 22, 5, 69, 89,116,158, 7, 91,245,198,187,245,227,173, 37,189,157,132,
- 45, 24,214,116, 65, 49, 93,100,110,104, 2,194,153, 26,154,196,222,210,216,175,207,216,222,222,184,175,113,242,154, 33,219, 54,
-200,212,203,132,251,141,169,188,118,102,198,145, 10,105,109,113, 24, 50,251,226,190,222,169, 63,175, 37, 95,135,140,138,151, 77,
-235, 98,187, 18,188,116,127,254, 34,173,185, 20, 34,100, 20,119,255,109,191,193,250,212,162,205,147,202,102, 79,225,251, 2,190,
-185,255,250,141,233,183,229, 87,207,181, 1, 66, 92, 43,238,222,191,200, 55, 47,176, 25,233,204, 2,174, 21,245,206,246,207, 90,
- 11,248, 32,105,211,161,219,143, 34,133,142,163,174,112, 69,244,215,193,134, 61,105,169,170,130,233,236,146,201,120,200,112, 48,
-228,252,244,138,186, 49,136, 72, 34, 53,196, 73,130, 49,193, 53, 46,203, 50, 34,105, 49,117, 65, 44, 61, 69, 93,144, 15, 71,140,
-247, 14,113, 2,148,114, 20,203,115,134, 3, 65, 85, 20, 88, 11, 71,183,111, 32,164, 96, 85,150, 60, 61, 62, 35,202, 71,196,131,
- 9,141,113, 36,137,160, 46, 23, 20,101,129, 23,221, 68,176,214,138,139,117, 71,170,164, 32,146,116, 30,197, 93,167, 41, 67,214,
-111,223, 45,246,176,144,142,228, 86,193, 86, 36,177, 34,214,253, 45,132,170, 36,113,184,197,177,234, 62, 87, 36, 90,145,232,168,
-187, 41,226, 72,174, 63,198, 58, 60, 86, 28, 73,146, 88,145,198,225,190,186,235,100,131,219,156,193, 89,211,173, 17,100, 96,224,
-182, 37,135,187, 35, 92, 85,241,225, 7, 31, 48, 26,231,232,170,229, 39,223,255, 25,159,206,150, 44,188, 96, 86, 58,206,157, 39,
-209, 26,107, 77,152,138, 71, 99,170,142,153, 90,122,207,220, 57,140,135,214,123,172, 12,200,128,235, 94, 71, 39,160,109, 29,177,
- 15,214,176,101,211, 48,216, 25,241,233,197,140,189,221, 29,110,238, 31,176,147,165, 76,167, 43, 22,133, 99,188,187,199, 56, 83,
-228, 84,104,219, 50,173, 28,159, 44, 42,126,118,114,133, 74, 99, 94,123,112, 7,105, 61,173,105, 88, 20, 53, 66, 10, 98, 21,225,
- 45,104,237,176,190,225,246,173,140, 84,123, 60, 45,249, 40,163,168, 13, 66, 4, 19, 22,239, 21, 89,150,113,124,122, 70,213, 90,
- 80, 17,135, 71, 71,196,113,140, 20,158,178, 44,153, 77,167, 68,145,196, 25,131,244, 14, 83,215, 72, 15,137, 78,112, 62,104,140,
-145, 48,222,233,246,162, 82, 49,189, 90, 48,208,146,221, 44,129,178, 97,172, 4,123,105,196,173,131, 1,195, 92, 17,107,201, 48,
-209, 88,111, 73,243,140,167,199,167, 88, 75, 72,145,114, 45,121,170,209, 42, 97,185,172, 16,222, 83,155,150,162,113, 24,227, 89,
- 22, 21,147,221, 61,202,213,156,209, 32,195,152, 22, 47,228, 90, 91,123, 57,157,242,255,252,127,253, 46,171,218, 80, 89,137,245,
-130, 27,251,187, 12, 34, 31,228,116, 34, 92, 7,107,219,213,174,217, 19,114, 35,169, 92, 23,248, 45,203, 85,223,249,185, 43,165,
-214, 73, 91,170,135,209, 59,243,154, 62, 21,173,127, 12,223,125, 45, 76,223,138, 40, 14,136,156, 95, 15, 34,114,227,233,160, 58,
-136, 92, 42,100,191,111,143,162,181, 78, 94, 40,137,212,186,147,182,133, 9,221,211, 57,206,173, 35,194,131, 43,159, 16, 34,152,
- 47, 65, 40,142, 82,133,221,186,144,204, 47, 46, 73,100, 20,224,238, 44, 70, 70,129,245,223, 90,195,141,155, 71, 65,251,220, 54,
-120,231, 56, 59, 95,112,113,185,160, 44, 86, 33,154, 89, 0, 34,230, 95,253,233,123, 28,188,242, 38, 86, 68,140,135, 3, 34, 1,
- 90, 41, 80,193, 94, 56,236,214,106, 84, 28, 51,202,114, 30,222,220, 97,156, 41,166,171,130, 85,177, 98, 50,158, 80, 85, 53,174,
-147,178, 54, 77, 75, 89,213, 24,227,184,186,152, 81,148, 53, 85,211, 6,149,141, 16,224, 2, 65,211,135, 49, 19,165, 35,218,178,
- 98,126,113,206,238,206,128,108,156,112,113, 53, 39, 77, 6, 8,111,209,202,179,183,183, 67,164, 53,123,123,187,236,140,134, 76,
-180,228,230,254, 14,187,163, 17, 79,159,157, 81, 54, 77,112,170,148, 93,202,221, 26,129,239,124, 53,182,248,116, 94, 8, 86,203,
-130, 95,255,214,175,241,218,253,251,252,232,207,190,195, 36,245,236, 14,194,117, 80,150, 21, 81, 20,147,166, 35,134,147, 29, 78,
- 78, 78,240,180,235, 97,213,227,240,210,111,209,243,186,167,200,155, 80,212,157,199, 88,191, 14,200,146,235, 60,130,205,138,104,
-157, 83,208, 87,154,126, 5,185,110, 60,187,234,191,101, 71, 46,186,161,170, 91,130,118,215, 93, 55, 52,169,240, 49,142,194, 64,
- 25,175,207,207,184, 43,234,234,122, 81,255,204,199,159, 59,125, 63,183,103,127, 41, 41,238, 5,147,252,207,209,165,191, 92, 30,
-247,115,224,247,191,128,244,173,103, 45,250, 32, 8,188, 54,169,183,207,105, 9,251, 8,197, 48,169,235,245,238, 68,119,147,195,
- 6,210, 15,146, 3,231, 28,117, 93, 50,157, 94, 48,200, 19,154,186,101, 85, 84,136, 40, 66,167, 49,168, 16,242, 96, 93, 48,231,
- 79, 18, 77,154, 68,184,182, 13, 5, 51, 5, 29,123,246,246, 70,236,239,143,200, 50,197,229,217, 41,229,170, 64,160,136, 68,194,
-251,239, 62,101,185,108,152, 45,174,208,131,132,201,222, 93,156,159,224,172, 65, 43,193,116,122, 73, 89,215, 88,161,240, 94,110,
-144,144,190,179, 84, 98,189,227, 81, 81,208,211,134,207,229, 90, 54,164,186, 29, 78, 20, 5,163, 29, 29, 73,146, 14,173,136,117,
-180, 70, 46,250,206,241, 90, 97,215, 42, 88,147,198, 58, 20,244,245,247,108, 16,143,117, 83,208, 55, 0,235, 70, 73, 5, 56, 12,
- 66,214, 61, 96,141, 33,141, 53,194,135,136,213,178, 40,104,138, 42,168, 4,134, 41, 63,250,211, 63,229,114,186,196,196,146,121,
- 27,214, 32, 18, 23,118,102,137, 98,110, 44,211,170,102,110, 12,165,247,180,157,126, 95, 69, 33,190,210,109,173,107,156,216,200,
- 80, 76,107,208, 82, 97,140, 37,213, 41,177,212, 60, 59,189, 32, 79,115,226, 40,102,144,101,120,111, 40,150, 75,238,221,190,137,
- 19, 37,113,214,144,226, 17, 6, 22,181,227,241, 85,201, 39,151, 51, 38,135,123, 28, 29,236,144, 38, 14,233, 13,174, 14,197,183,
-169, 91,118,247, 82,100,162,185,156,149, 44, 11,195,124,209,176, 90,121,148,116,156,157, 94, 49,155,206,112, 82,112,239,149, 87,
-137,147, 60, 24,191,212, 77,103,218, 35,193,193,217,217, 57,251,187,251,129, 8, 38,163, 53,161,203,121,143, 84,221,138, 68, 10,
-146, 52,197, 58, 71, 81, 20, 20,101,133,146, 14,165,130, 10, 97,255, 96,194,141,131, 17,194,215,196,202,146, 37, 10,233, 3,188,
-217, 24, 67,150, 5, 27,226, 40, 82,184, 62,235,221,121,156, 13,111,211,197, 98, 30, 10, 25, 17,173,151,140, 38, 59,140,242,156,
- 60, 75,104,219, 38, 52,205,206,113,114,122,198, 7,159, 60,230,227,103, 39,172, 42,139, 84, 17,139,233, 37,119,143,246,152,228,
- 9,186, 75,176,146, 82,109,246,234, 29,105, 78, 72,113, 77,122,219, 23,253,254,125,216,195,242,189,131,228,134,104, 23, 2, 52,
-100,151,158,230, 1,209,105,201, 3,209,174,103,208,247,198, 52,172,237, 93,251,251,171,222,221, 78,200,141,193,205,218,159, 62,
-236,224,133,220,216,191, 34,229,122, 24, 90,219, 41, 75,177, 97, 65,119, 13, 10,170,187,111, 71,234,107,234,154,229,213,140, 44,
- 73, 41,203,138, 36, 77, 3, 91, 95, 74,210, 36, 99,114,112,192,167, 31, 61,194,182, 22,124,196, 98, 97,120,244,201, 51, 30,125,
-252, 9,109, 85,161,188,228,211,143, 79,248,238,159,127,196,215,126,233, 87,208,113, 74, 93,148, 12, 6, 25,170,115, 37, 59,187,
-184,100, 52, 24,144,166,225, 53,204, 99, 69, 84, 94, 33, 77, 73,182,179,195,222,222, 62,109,211, 82,108, 77,236, 61,175, 96,144,
- 15, 40,203,154,198, 24,156,247, 76,167, 83, 22,139, 69,231,215,177,226,244,114,198,162,168,152, 47, 11,148,210, 44,231, 75,210,
- 44,231,147, 39, 1,233,201,146,152, 65, 26, 35,156,101, 50, 26,144,101, 57,249, 96,200,238,206,132,157, 76, 48, 76, 20,187,227,
- 33, 7,251, 59, 60,121,118,194,162,108,240,196, 93,193, 19,235, 90, 30, 86,139,190, 27, 70,195, 0,115,122,114,202,195, 87, 95,
-229,205,215, 31, 50,189, 60,229,244,228, 41, 89,170,137,162, 4,169, 52, 77,109,209, 58,230,224, 96,159,229, 98, 70, 89,172,214,
-138,134,126, 54,236,253, 51,172,237, 76,102,140,233, 36,124,110, 29,205,218, 79,224, 61,129,178, 47,216,155, 85, 99,255,120,242,
-185,113,124, 11,250, 94,175, 23, 58,187,224,174,217,236,149, 74, 97, 66,239,208,225,126, 50,143, 59,219,228,174, 6, 69, 74,110,
- 36,109,127, 89,233,216,231, 69,175,254, 34,137,108,219,240,254, 95, 36, 22,213,255,130,236,247, 95,188, 29,248,249,125,198,243,
- 13, 77,150,101, 72, 41, 41,203, 37,163,193, 14, 96,169,170,146,209, 48, 9,161, 39, 70,160,181,166,105, 27, 90,211, 34,243, 12,
-161, 99,116,156, 98,205,156, 68, 75,166,151,207, 88, 46,207, 57,216,223, 71,170,140,182, 81, 20,171, 25,153, 16,220,186,243, 42,
-109,179, 36, 25,120,222,120,243, 75,156, 79, 45,229,170,232,118, 61,253,133, 33,187,195,214,227, 4,215,248, 13, 82,244,126,217,
-161, 11,220,112,144,196,218, 34,215,251,206, 86, 87,136, 64, 58,234, 67, 44, 58,153,154,220, 34,126,244, 23,241,122, 47, 37,122,
-107,206,254,107,106,253,184, 27, 22,252, 6,218,239,191,207, 57,143, 49,158, 6,131,244, 62,216, 71,122, 79, 26, 37,220, 60, 60,
-100, 57,187, 34,114, 57,167,207, 30,243,224,214,109,138,249, 21, 63,248,209,247,241,222,176,127, 52,100, 49,109,168,219, 26, 33,
- 36,147, 46,246,178,150,142, 10, 48,210,227,145,108, 98,223,183,152,172, 91,116,194,126, 81,100,133,167,192,227, 90, 67,174, 34,
-218,233,130,131,253, 67, 46,139, 21, 31, 60, 57, 97,127,144,115,255,246, 77,134,121, 66, 49,191,224,170,178, 12, 70,187,180,118,
-197,157,125,193, 32, 83,184, 83,195,167, 21,156,175, 12,255,250,199,143,120,117, 55,227,245,163, 29, 84,234,137, 92,137,173, 44,
-137, 4, 83,183,148,117, 75, 28,199, 12, 82, 69,154,198, 12, 6, 57, 66, 73,210, 60, 99, 48, 24, 98,132,101,182, 88,160, 84, 72,
-120, 18, 30,164, 8,123, 75, 33, 60,105,154,208, 84,213,186,144, 69, 58, 66,106, 21,156, 7,173, 9,154,106,225, 89, 44,230,157,
-209,143, 38,203, 98,138,217, 28, 33, 60,123,147, 28,169, 21, 10,139,136, 36,117, 89, 82, 44, 83,166, 40,188,240, 52,214, 48, 30,
-237, 83, 87, 37,105, 18, 81,139, 64,164, 44,138,146, 36,202,104,186, 16, 24,215, 57,113, 41, 9, 90, 4,217,152, 86,193, 17, 80,
-197,154,162, 88,241,241,147,167,252,249,207, 62,226,228, 98, 78, 58,156,160, 59, 88,251,211,147, 51,110,238,189,134,246,144, 2,
-198, 89, 4, 10,213, 21,112,107,109,135, 50,200, 46, 87, 32, 88,186,186,174, 97,145, 34,234, 98, 82, 85,183, 46,114, 93,184, 87,
- 55, 89,119,205, 66,104,230, 85,215, 16,136,117,178,155,186, 70, 80,242, 91,228,225,235, 7, 85, 47, 73,235,215, 3,235,207,165,
-236, 52,240, 93,172,106,111,155,172,228, 90,246, 41,232,201,126, 97, 42,239,211, 12, 69,159,207,238,109,112,153, 20, 2,157,198,
-104, 99,104,170, 6,128,166,110,185,115,255, 62,197,108,129,148, 1, 97, 88,213, 13,195,241, 8,173, 35, 30,127,114,204,222,110,
-198, 56, 77,249,233, 15,223, 39,209, 57,182,110, 24,236,236, 83, 10,168,234, 10,111, 13,168,208,136, 15, 70, 67,202,114,202, 96,
-178, 75, 93, 87,232,189, 4,239, 13,151,151,151, 72,169, 24, 15, 71,236,239,239,119, 41,130,102, 61, 16,149,101,201,238,222, 30,
- 23, 87,151, 24,235, 80, 81,140, 20, 4,115,159,198,146,101, 41,205,249, 21,198, 89, 26,107, 65, 68,252,244,167, 31, 49,222, 31,
-243,250, 27,183,144,190,166,105, 42, 90, 87, 51,159,207,145, 82,179,183,223, 32, 5, 12, 6, 49,119,212, 4,173, 32,146,142, 72,
-252, 38,255,247,127,249,239,248,240,116, 70,233,195,107, 29, 38, 89,123,109,106,119, 29,161,206, 11,207,127,251, 79,255, 9, 95,
-255,202,151,248,229, 95,253, 53, 62,120,239,199, 20,149, 97, 55, 19,172, 86, 75,146, 76,208, 52, 21, 85, 85,240,240,225, 67, 78,
- 79,159,134,148, 60,194,115,239,187, 29,125,112,147, 13,200,109, 47, 35,179,107, 73, 89, 71,196, 92,251, 34,116,106, 30, 28,194,
-201,205,235,127, 77,250,214,101, 97,172,125, 59,122,172,161, 27, 42,122,214,123,247,239,174,141, 92,123, 27,244, 10, 16,221, 25,
-113, 73,217, 5, 16,123,241,217, 73,253,250, 78, 93,188,208, 6,246, 69, 12,118, 33, 94,126,223, 23,147,240, 94,190,123,223,232,
-247, 94,180,207,223,182,178,245, 47, 44,234, 47,139,125,221,206, 63,126, 81, 59,176,113,149,219, 4,186, 24,227,104,140,237,118,
-234,225, 77, 25, 69, 17, 73, 28,135, 73,189,155, 54,183, 39,117, 16,215, 67, 98,188,229,226,226, 28,103,234, 46,240, 33,194, 9,
- 73, 54, 24,210, 90,139, 55,130,229,170,198, 58, 72,211,132,189,189, 29,156,113,204,103, 43,156, 49, 28, 30,222,232, 88,198, 57,
-120,197,173,155,247,185,184, 88, 50,159,150,124,245, 43, 95,230,232,104,143, 56, 22, 60,120,240, 10,251,251,183,168,154,208,186,
- 90, 23,236, 70,151,139, 25,243,213, 2,219, 17,206,100,207,210, 84,226, 58,251,178,131,119, 2,228, 30, 72,184, 27,248,189,251,
- 92, 9,226, 72,160, 35,129,238,160,248, 13,116,174, 58, 72, 94, 6, 70,171,222,124,174,181, 90,195,245,122,107,103,174, 35,217,
-133,147,116, 80,126, 47, 19,140, 58,146, 72, 96,234,117,217,201, 65, 26,118,184,187,203,193,206,152,213,108, 74, 91,149,232, 72,
- 82, 21, 43,206,159, 62,229,241,167, 39,120, 37,152,215,150,171, 69, 67,227, 33, 79, 83,110,103, 9, 30, 75,233, 60,133, 3, 35,
- 4,206, 75, 4,221,129, 44,197, 90,110,178, 33,116,208, 65,124, 42,120, 62, 11,104,133,160,116, 14, 39, 5,141,115, 28,221,187,
-205,213,124, 78, 89, 86,228,131, 12,180, 96, 48,158,112,113, 53,103,144, 12, 24, 36, 3, 80, 13,135, 7, 67, 82, 4,170,134,178,
- 53, 84, 30, 46, 11,203,179,171, 2,161,130, 4, 74,105,129, 23, 30,231, 64, 43,141,173, 90, 48, 22,225, 61, 69,177,164,172, 86,
- 88,223,178,172, 22, 44, 86, 11,156,179,116, 52, 66,164,240, 44,230, 87,148,229, 2,227, 90,140,173, 81,194,227,109,141,146,142,
-178, 92,208, 52,101,240, 63,183,129,113,108,141, 9, 28,146, 78, 58,228,157, 69, 11, 21, 98, 67,141,167, 92, 21,172,230, 43,138,
-101,133,105, 44,137,214,100,121, 70,156, 68,221,110, 47,102,181, 12,147,141,245,134, 52, 77, 72,147, 44, 76, 52, 54,120,233,123,
- 33, 25, 12, 39,120, 20, 89,158,133,251, 58, 71, 89,213, 56, 20,211,101,193,191,249,131, 63,228,124, 94,224,164, 38, 78, 51,170,
-186, 66, 71, 18,211,212,220, 60,186, 73,172, 4,105, 28, 93, 35, 94,110, 27,205, 8, 37,215, 40,139,144, 98, 61,197,247,178,164,
-245, 68, 45, 55,251,240, 72,235,110, 39,222, 77,227, 29, 74, 21,166,172,160,113,143,186,199, 9,239,145,237,159,191, 77,198,219,
-178,216, 22, 98, 75,108, 21,236,147, 67, 40,226,150, 4, 84,201,181, 33,231, 38,178,186,155,137,122,187, 90,252, 90, 85, 2, 96,
-234,134,166,170,104,155, 6,103, 60, 85, 85,225,188, 39, 31, 14, 24, 76,118,184, 60, 63, 91,159,105, 42, 82,196,105,198,159,124,
-255,207,105, 91,195, 95,255, 15,126,137,193, 32, 67,107,197,178,178,188,242,198,219,236,221, 56, 2, 33,104,154,154,209,112,208,
-253, 30,125,184,146, 39,138, 19, 18, 5, 95,121,245,136,221, 97, 66, 60,154, 48, 26,141, 72,146, 4,231,108,176,135,117,225,156,
- 76,210,132, 56, 78,214, 62, 2,190,243, 21,216,158, 32,173,247, 68, 58,102,190, 92,118,215, 85,201,147,199, 79,121,245,213,215,
-217,217, 25, 50, 26,196,216,182, 34, 86,132,189,190,142,137,227, 20,157, 36,196, 89, 26,166, 82, 21, 38,246, 97, 18,115, 99, 50,
-102,113,126,193,229,114,137, 17, 33,208,197,111,177,224,221, 86, 38, 59, 8,230,243, 25,247,239,223,227,245,135,175,114,113,118,
-198,114,190,192, 54, 53,131, 65,142,247,130, 56, 13,202,132,253,131, 3,158, 61, 59,166,174,106,132,183, 93, 77,112,157,227, 92,
-128,219,173,181, 97,213,177,150,150,109,138,180,184,230,200, 41,186,179, 51, 12, 76,194,135, 72,171,237,198,111,123, 15,188,217,
-177,247,141,227,117,226,151,128,117, 96, 81,212, 21,244,168,147, 83,171,206,173,175,103,195,191, 20,126,223, 38,202,189, 28, 78,
-231, 11, 23,234,107, 63,227,231,232,223,123,226,202,139,153,245, 98, 93, 52, 95, 56,169, 11,126,174, 77,236,243, 83,123,111, 14,
-240, 60, 81,110,147,212,102, 2,251,189, 51,172,233,119,234,113,172,215, 58,245,235, 69,253,122,140,163,119,142,166, 46, 40, 87,
- 11, 76,219,146,164, 3,134,147, 93, 90, 15,117, 99,104,107,240,196,164,217,136,180,115,153, 59,216, 59,192, 26, 65,156, 12,184,
-121,251, 30, 73, 58,164, 42, 27,210, 56, 67, 71, 49, 31,124,240, 33, 69, 81,243,202, 43,247, 25,141, 19,238,222, 61, 34, 77, 70,
-193, 70,180, 40, 64,118, 46,114,109,205,124,126,197,213,124,134,239, 73, 44,162, 47,210,172, 25,158, 61,219,178,255,183,146,116,
- 23,230,214,126, 72,110,164, 24,129,165,185,197,242,236, 97, 71,169, 66,177, 87, 91,123,119,181,217,191, 71, 29, 99, 55,138,250,
-239,103, 35,249, 80, 1,242,143,162,240,245,190,251, 12, 94,202,208,122,193,100, 52, 65, 1,139,203, 11,202,229,140, 44,137,240,
-166,229,236,228, 41,243,203, 41,139, 85,201, 89,105, 56, 89, 90,148, 23, 40, 31,138, 94,166, 34,166, 85, 67,131,192, 0,134,158,
-215,225,215, 74,128,151,129, 48,253,212,238, 36, 88,225,177,128,145,176,108,106,156, 51, 28,238, 12,105,203,138,229,114, 69,150,
-107,118,247,119, 40,202, 18, 97, 20,203,105,197,248,112,130,243, 5, 67,229, 25, 9, 9,141,193,120,207,194, 43, 26, 39,185, 90,
-213, 76,203, 6,226, 24,149, 38,120, 25, 19,197, 67,172,241, 44, 22, 13, 77,109, 2, 59, 91,121, 60, 6, 99, 27,164, 80, 52, 69,
- 77,177, 88,177,156,205, 40,150, 11,218,182, 10, 50, 73, 83,211, 26,131,242, 30, 83,215, 44,103, 51,202,213,138,186, 42,105,170,
-154,213, 98,133, 20, 18, 37,161,173,235, 16,207,187, 92,134,130,107, 28,179, 89, 69, 85, 25,146, 36,172, 65,156,181, 68,145,194,
-122, 24,140,242,192,187,136, 4, 82, 40,164,140,152,207,103, 24,103,136, 99,205,100,180, 67, 83, 7, 57,157,117, 6,144, 36,201,
- 0,165,131,212, 75, 69, 33, 94,178,108, 13,151,203,130,127,252,255,248, 39, 44,107,131,210,113, 96, 97, 75, 73,146,164,120,103,
-105,155, 22,132,228,254,237, 27,196,194, 6,194,153,138,214, 41,107,125,184,139,236,174,195, 0, 73,234, 77, 52,235, 11,224,119,
-239,253,250,190, 98,171,240,211,187,187,173,253, 51,228,150,118, 93,117, 59,211, 45,232,116, 27, 70,237, 11,122, 47, 57,146, 91,
- 60,159,109,134,253, 26,126, 15,197,194, 91, 27,110,158,181,195,220, 6,249,220, 56, 85, 90,235, 16,214, 17, 9,137, 49, 14, 25,
-105,178,209,136, 56,205, 72,178, 12,235, 28, 85, 29,144,145,193, 48,200, 11,223,122,227, 21,254,202,111,188,195, 91,111, 61,228,
-246,157,219, 32, 20,139,162, 97,184,179,199,104,111,159,214, 89,134,131, 1,182,109,113,214, 19,199, 1, 77,212, 90, 32, 34,141,
-111, 43,190,250,224, 6, 90, 88,230,125, 70,120, 29,162, 64, 71,227, 17,163,221, 29,146, 52, 13, 67,137,119, 84,117, 69,221, 54,
- 33,202,119, 48, 8, 73,109, 90, 17, 71, 81, 72, 32,140, 53, 66,107,230,211, 25,171,249,138,170, 44,113,214,114,116,107,143, 36,
- 17,100,113,216, 13,143, 6,121,119,142, 10,246, 15,143,152, 21, 21,147,157, 29,164, 15,182,193,121, 18, 49, 78, 52, 55, 70, 49,
-103,103, 23, 76, 87, 21,109,103,142,217, 35,146,193, 90, 54,164, 30,122, 66, 19, 57,159,205,248, 43,191,254,235,236, 78,118,248,
-211, 63,253, 83, 38,195,148, 52,209, 68,145, 6, 33, 25, 12,135,161, 57,145,154,213, 98,138, 86, 46,156,137, 91,210, 50, 37,195,
-234,210,173,147, 43, 55,254, 29,120,223, 69, 19, 75, 18,173, 73,147,152, 44, 13,171,133, 36,214,235, 53,101, 18,199,235,218, 17,
-190,166,137,147, 40,220, 71,107, 98, 29,135, 33, 81,111,166,112,181,182,237,238,206,234,109,191,134,238, 28, 70,108,154, 72,245,
-181, 55,238,252,163,237,240,142,235,201,107,226,223, 91, 81,255,108,179,240,121,137,108,254, 11,233,207,191,232,164,254, 69, 18,
-224,124,231, 63, 78, 47,105,187, 86,212,131,164,205,190,180,168,235,206,124, 70,109,180,218,126, 99,161, 26, 32,170, 37,197,114,
-134, 53,142,170, 6, 71, 20,220,179,100,140,105, 5,117, 11, 42,210, 24,107,217,219,221, 99,152,143, 80, 50,165, 50, 30, 84,140,
-115, 1, 42, 30,142,114,210, 76,210,154, 5, 71, 55, 15,201,146, 9,210, 43, 38,195, 93, 46,206, 47,130, 53,104,101,184,113,116,
-135,203,217, 28,124,203,114,113,197,170, 44,176,221, 14, 74,138,142, 1,223, 65,221,253,197, 43,183, 58, 75,185, 38,110,200, 13,
- 99,179, 99, 13,175,239,187, 53,201, 92, 43,250, 91, 59,250,232, 57,137,135,236, 80,129,117,243,176, 70, 11,250,199, 13, 69,189,
-135,233,251, 55, 77,211, 52,164,249, 14,222, 56,154, 98,197,163,247,127,198,238,100,200,199, 31,189,207,217,233, 51,234,170,228,
-228,233, 5,113, 62,228,227, 69,205,210,121,134, 82,147,248,160, 64, 88, 24, 67, 37,160, 21,146,186,151, 48, 10,143, 23,238,243,
-215, 70,253,250,161, 31,222,125,152, 6,113,221, 10,162,106, 72,140,225, 27,111,190, 66, 53,159, 83, 86, 37,137, 86,236,141, 39,
-156,157,156, 49, 30,143,136,227,132, 97, 62, 66,120,131,181, 43, 6,169, 68, 59, 71,217, 58,140, 3,135,166,176,150,243,178,230,
-108,217,114, 85, 26,158, 76, 75,150, 22, 84,150, 5, 91, 82,231,200, 19,141, 22, 2, 87,183,148,133, 5, 43, 41,151, 21,171,121,
- 65, 93, 53, 33, 93, 76,202,160,117,246,130,186,172, 89, 94,206, 88,205,150, 84,203,138,170,172, 41, 87, 85, 88,205, 88,131,240,
-142,213,114,201,106,185, 36, 79,147,142,223,144, 48, 24,164,120, 90,100,231,220, 37,149,196, 57, 65, 89, 89,198,147, 1, 89,170,
-145,157, 36, 80,201,136,198,154,192,191,144,162, 91, 7,164,120, 92,167, 92, 80, 32, 34,116,156,162,162, 8,143,164,106, 90, 42,
-227,249,189,127,247, 93,222,253,240, 99,140, 15,236, 96,211, 6, 27,214, 88,107,218,214, 32,101, 68, 81, 55, 60,188,123,196,120,
- 16,161,132, 92, 23,237, 72,117,140,223, 40, 90, 75,222,122, 72,114,219,113, 46,138,116,103,204,210,249,190, 71,113, 88, 87,116,
-147,105, 88, 5,109, 79,221,126, 51,145,119, 19,251,102,231, 46, 55, 72, 78,103,122,211,189, 89, 58,214,181,216,144,158,164,186,
- 38,165,245,130,245,190, 21,239,176,109,139,183,174,115,167,237, 88,246, 29, 33, 88,116, 86,168,222,134, 16, 35,219,180,212,171,
- 18,211, 26, 16,146,124, 56,162,237,214, 23,113,150,145,164, 9, 73,150, 81, 20, 43,218,166, 14,182,179, 29, 58,230,132, 69,233,
- 4,165, 83, 22,139, 10, 84,194,193,157,187, 44,171,154, 72, 41,156, 9, 73,111, 30, 69,235, 12, 69,177, 12, 49,205, 77,201,151,
-239, 29,176, 55, 74, 25,239, 31,132,248,230, 52, 93, 15, 42,171,229, 18, 41, 4,105,150,145,231, 57,249,206,152,193,104,136,177,
-109,144, 85, 90,195,116,122, 21,164,111,132,220,111,169, 53, 82, 72,180, 16, 68, 66, 50,155, 94,113,231,222, 13,242,129, 38,142,
- 4,206,212,104, 29,118,244,222, 11,134,163, 17,197,170, 64, 9,193,104, 50, 92,203, 13,181,130,131,157, 33,135,131,148,147,227,
- 83,206, 86, 13, 70, 0, 62,234,106,150,223,210,175, 7, 40,123, 54,155,114,239,246, 93,190,250,165,175,240,244,241, 19,102,231,
- 79, 72,226, 64,132, 12,205,234, 24,239, 5, 7, 7, 7, 44,103, 83, 98,229,136, 59, 2,112,239, 67, 18, 69, 29,177, 18,137, 19,
-162,155,220,123,219,216,112,189,103,137, 38, 79,117,200, 74,207, 50,134, 89, 74,158,167, 12,178,148, 44, 77, 72,179,152,180, 43,
-246, 89,150,132, 91,247,239, 60,217,106, 2,180, 70,119, 63, 79,178,221, 60,116,151,153,236, 24,246, 93,237,246, 93,163,105,189,
- 11, 59,245, 23,249,183,255,251,180,109,253, 76, 17,126,206, 26,246,179,197,217, 93, 91, 84,191,200, 74,246,243,246,237, 47,179,
-182,253,188, 44,245,107,237,196,150,117,223, 47,180, 90,127,193,186, 65,118,221,121,154, 13,136,227,140,186,108, 67, 32, 70,212,
- 34,164,198, 52,142,157,201, 62, 66, 85, 44,139,146,157,221, 49, 58,138, 65,104,170,122,133, 65,242,225,199, 79, 25,164, 17, 89,
-236,241,110,137, 16, 3,178,161,231,193,221, 27, 80,167, 44,151,176, 88, 8,134,163, 29, 46,167,167,212,149,229,236,120,198, 98,
-118, 73,158,245, 90, 86,215,217,101,138,142, 61, 42,131,223,250,115,174, 70,235,110,164, 35,138,136, 53,138,209, 65,212,242,229,
- 90,255,235, 22,194,215,205, 32,174, 57,209, 93, 11,124,225, 57,169, 97,120,147,172,191,151, 0,229,230,249, 0,131, 70,196,138,
-103,143, 62,228,232, 96, 31,233, 93,103,168,114,202,124, 90,178, 90, 89,202,133,161,180, 14,131, 32,209, 9, 67, 41,185, 50, 13,
- 75, 1, 13,146,198, 7,120,174,239,230,123,133, 76, 80, 62,189,120, 53,227,164, 71,248, 16, 89, 27, 9, 80, 14,146, 72,113,235,
-112,143,175,191,122,155, 47,191,114,159, 27,187,187,188,127,231,136,223,253,189,239, 80, 92,206,160,108, 57,186,181,139,142,225,
-241,163, 51,238,222, 60, 34, 29,239, 16, 31, 90,226,178,101,148,165,232,203,138,143,206, 27, 46,140,101,129,192, 18,216,247,171,
- 38, 76,149,103,101, 75, 94, 54,220, 27, 15, 80, 74,211, 24,137,240,193,207,189,108, 91, 34, 21, 14,253,166,241, 36, 14,242, 97,
- 66,150,140,113, 2,150,197,146,229,229, 12, 87, 26, 76, 21,252, 5,134,163, 8,148, 67,106,201,106,182,100,126, 57, 71,134,161,
-136,170, 40,177, 86,146, 13,146, 80,124,157, 37, 73, 36,214, 58,188,133,214, 4,111,239,217,116, 65,154, 0, 62, 33,213, 80, 20,
-117,128, 47,163, 64, 18, 91, 46, 23,228,233,168,123, 62, 55, 19,176,119,225, 61,221,180,150, 85,213,114,190, 88,241,231, 63,125,
- 23,165, 19,106, 99, 72,117,152,112, 80,193,206, 84, 72,137, 74, 18, 22,101,205, 79,222,255,144,155,191,252, 38, 82, 71,221,164,
- 18,109,236, 55, 5,200, 40, 48,171,123, 28, 83, 74,185,190,194,164, 80,107, 89,154, 68,173,127, 23,219,187,153,245,122,206,206,
-124,219, 58,177,182,152, 21,235,216, 84,183, 33, 13,111, 37, 56, 95, 31,128, 54,123,208, 94,133,115,205,157,179,135,226,187,201,
-182,143, 63,238, 35, 13,189,181,235, 68, 54,225, 67, 35,133, 11,129, 34, 74, 40,154,170,238, 60, 35, 4,113,102,105, 76, 75, 22,
-141, 66,163, 33, 33, 27, 13,184,157,189, 66, 57, 91, 80, 45, 11, 34, 29,209,182, 21, 85, 45,104,188,192,203,136, 52,141, 57, 95,
- 45, 88, 45,151,236,238,238,129, 53, 84,214,128,147,196,217,128,243,171,115,146, 36, 93,175, 19, 86,101,197, 66,128,107,131,199,
-123,164, 53, 59,187,187, 56,107,169,234, 26,169, 36,199,207,158,145,164, 9,105, 26,147, 13,114,118,118,199,200,104, 31,211,182,
-232, 72,210, 84, 53,210, 0,109, 67,177,152,225,108,141, 84,158,209, 40,101, 60,202,195,107, 97, 45, 58,137,104, 10, 75, 81, 20,
-196, 81,204,104,156,224,141, 97, 24, 71, 44,230, 87, 12, 6, 9,201,112,132, 21,130, 49,129, 80,252, 87,223, 9,147,248,213, 63,
-251,183,188,123, 85, 98,187,213, 34,120,108,119,238,132,233,213, 83,181, 13,255,228,191,251,103,124,243, 43,239,240,237,111,255,
- 53,254,175,255,231, 63,101, 52, 26, 32, 84,132,169, 91, 22,243, 25, 90,167, 32, 20,247, 31, 60, 96,117,169,112,182,197,117,233,
-109,198,134,204,246,162,168, 17, 85, 13,117,219,177,223, 93,231, 36, 39, 58, 94, 74,194, 40, 75, 25, 14, 7, 12,242, 60, 32, 22,
- 81, 88,171, 4,141,187, 95,219,203,186, 46,196,106,157,242,215,203,229, 58,100,184,105, 26,138,178,164,138, 2, 82,212,182,110,
-147, 0,103,196,218, 89,207,246, 10,144, 46,211, 32, 10,184, 69,119, 82,247, 31,187,176, 15,255, 28, 12,254,178, 80,151,237, 41,
-253, 69, 59,244, 23, 21,112,215,127,191,247,207,177,233, 61, 10,217, 29,246, 27,226,193,245, 2,240,242,130, 43,253,117, 1,250,
-243,141,128, 23, 47, 46,252,189,127,238,181,157,120,160, 55,172, 53, 18,215, 27,137, 77,119,191,230, 31,248,231, 67, 1,187, 92,
- 52,233, 72,243, 28,165,115, 68, 84, 49, 26, 4, 95,232,214, 57, 20, 10, 99,194,139,147,196, 17,229,114, 69, 51,217,101,229, 74,
-100, 20,113,180, 55,230,201,227, 39,120, 99, 41,234, 21,220, 72,192, 90, 98,169,153, 62,187,224, 96,148,147,140, 71, 44, 76,197,
- 64, 75,116,154,226, 23,103,192, 5,162, 58, 3, 57, 96,181, 92, 97,141, 71, 70, 97,218,183, 42, 92,252, 17, 91,246,184, 46,120,
- 92, 7,217, 94, 32, 67, 9, 1,194,129,144,221,107,228, 29,253, 96, 27, 26,150, 30,170,116, 72, 25, 24,162, 82, 8,112,129,108,
-231, 44,221,222, 62, 60,134, 20, 30,229,192, 11,187,158,134,214,175, 67, 39, 5,233,137,124, 65,250, 35, 49, 86, 32,163, 1, 55,
- 14,111,241,147, 31,255,148,163,253, 29,246, 39, 41,174, 46,120,242,201, 19, 76, 93, 49,159,149,184, 70, 32, 99,205, 85,217, 34,
-128, 55,246,198,136, 69, 73,107, 60,158,136,185,107,215, 57,205,107, 83,170,245,235,221, 59,144, 57,188,112, 29, 33,185, 47, 26,
- 10,132, 15, 16,190,128,123,147,140,111,189,113,159,119,222,120,149, 27,187,227, 32,129,241, 6,229,167,188,243,230, 33,131,252,
- 87,249,215,223,253, 49,103,211, 2, 61, 76,240, 10,246,239,222,231,221,247, 63, 69,137,154,175,127,237, 30,122, 92,227,210,146,
-175, 14, 18,142, 38, 21,239, 63, 91,240,116, 5, 23, 22, 26,239, 49,194,118, 90, 39,199,194,194,123,211, 2, 45, 4,105, 36,200,
- 19, 69,170, 51,118, 85, 8, 14,169,155, 22,231, 36, 67, 3, 3,167, 48,101, 69,219, 56, 22, 87, 37,203,185,193, 89, 71, 28, 69,
- 32, 45,174, 67, 74,234,170,133, 38,164, 63,201, 36,162,114, 6, 29, 7, 79,148, 98, 86,134,164,168,214,145, 15, 50, 86,109, 73,
-154,107,242, 97,152,214,151,203,130,189,189, 49,158, 24, 39, 20,101, 83, 4,251, 83,165,214,141, 79,181, 92, 17,235, 20,161, 98,
-132,148, 56,223,144,167, 57,202, 75, 86,181,226,227, 89,193,127,246, 95,255,183,140, 4,248,182,162,168, 43, 6,233, 17, 74, 43,
-150,171,130,225, 56,101, 56, 24, 80,215, 53,249,104,200,251,207, 46,121,120, 81,240,214,221, 61,116, 20, 8,104, 50,138,131, 79,
- 11, 97, 53,161, 58,233, 87, 39, 74,223,242,189,160,211,148,111,229, 28,116,230, 30, 30,143, 13,139,152,245,245,168, 59, 29,126,
- 79,150, 12, 38, 52, 98,235,204,146, 32,251,218,238, 63, 67,150,245,190, 35,196,121,186,120,225,112,177,245,208,104,136,250, 36,
-144,248,250,130, 64,167,149, 18, 29, 33,202, 6,217,148, 80, 10, 99,195, 85,107,172, 35,137, 98,180, 80,172,102,115,162, 52, 65,
- 43,181,241,161, 39,172,177,146, 52, 65, 39, 49,222, 24,218, 89,139,214, 57,117, 91,179,179, 51, 97, 60,202,120,116,118,140, 83,
- 17,173, 11,153,230,216, 10,163,131,127,254,206,104,128,115, 26, 91, 89, 82,173, 57, 43, 10,234,170,101,160, 75,146, 44,167,170,
-106,242,225,128, 85, 85,146, 36, 41,163,241,136,187,175,188,130,177, 45,243,171, 43,102,207, 78, 16, 34, 88,193,142,198, 99, 70,
- 59,123, 8,239,152,205,166,140, 35,133,111,198, 84,139,130,103, 10,106, 41, 65, 68, 88, 31, 81, 55, 21,122,144,211, 58, 79, 91,
- 54,228,106, 78,178,179,139, 23, 10,167,192,182,142,101, 81, 33,149,102,144,229, 36,120, 42,233, 73,148,226,219,226, 45,202, 98,
-197,255,225,159,125,135, 39,181,193, 19, 3, 10, 41,236,230, 28,239,182,182,143, 30,127,194, 31,124,247,143,248,157,191,254, 55,
-184,251,202, 87,184,188,248,152, 27,169,100,119,119,159,106,185,160, 25,236, 97, 76,176,202, 29,169, 91, 56, 51,195,183, 21,214,
- 6, 84,109, 89,183, 68, 17, 40,233,145,222,225,173,166,109, 67, 82,102,164, 36, 89,162, 24,100, 49,227,241,144,241,104,192,120,
-152,175,157,246, 88,175,127, 68, 40,238, 91,231,110,127, 51, 46,240,105,172,181,212, 77, 67,209,161, 41, 66,214,225,108,165,164,
- 49,225,122,108,109,200, 87,112,141, 65, 43,133, 48,110,237,230,167,190,254,198,198, 81,238, 69,240,250,139, 12,102, 54,112,189,
-255, 92,146,220,207,131,193, 63, 15,241,252,121,246,179,127,209, 9,154,151,248,213,251, 13, 94, 30, 66, 70,186,232,213,222,120,
-166,237,188,223, 63, 11,191,135,253, 71,188, 5,251, 93, 67, 1,156,199,121,139,247,146,139,243, 75,138,178, 8,251,158, 40,200,
- 94,234,218,178,170, 12,198,181,100,121,202,206,206,152, 68,107, 76,219,146, 37, 49,113, 20, 49,189,188, 34,142, 4,216,138, 65,
-174,144,222,226, 90, 56, 59, 89,112,117,213,112,243,193, 67, 86,101,141,105, 27,164, 16,204,166, 51, 22,203, 5,117, 85,114,126,
-121, 65, 99, 61, 6,137,113,116,242,155, 16, 80, 33, 59,200, 80, 74,185,153, 82,253, 38,213,202, 95,179,135,117,207, 57,244,185,
-107,107,139,107,100,196,160,240,236,186, 82,191, 54,106,112, 29,227,211,246, 18, 17, 31, 90, 38,199,115,174,117,189, 35,159, 21,
- 88, 43,200,210, 17,166,181,156,158,156, 96,154,130,203,243, 99, 30,127,252, 33, 39,199,207,152, 47,106,206, 46,106,132, 21, 40,
-161,168,187, 1, 92,227,104, 90,195, 10,207,212, 57, 42, 33, 94,218, 10, 74, 31,138,118, 39, 26,238,250,223,110,157,128,101, 32,
- 60,175,223,220,227, 63,252,173,111,241,119,191,253, 75,188,117,231,144,161,242,200,182, 4,111,131,231,181, 7,103, 28, 59, 59,
-123, 60,124,237, 21,202,114,206,244, 98, 69, 83, 73,226, 76,178,179, 63,224,217,217, 57,109, 43, 56,186,121, 19,161, 12,222,213,
- 56,215,146, 15, 98,242, 84, 99, 26, 67,219,134,215,196, 57,133,240, 9, 30,129, 21, 22,131,163,114,142,162, 53, 44, 74,195,172,
-106, 89, 89, 71, 41, 21,141,138, 40,156,167, 17, 18,163, 52, 87,101,205,229,170,102, 94, 57,226,124,136,113, 4, 91,217,186,233,
- 26,227,136,114, 97,144, 22,234,218,209, 52, 80,149,142, 68,128,183,129, 60, 24,117,123,186,214, 90,150,149,197, 19,194, 87,202,
-162, 37,137, 37, 89,150, 32, 4,152,182, 97, 54,155,177,191,179,135,183,134, 97,158,163, 85, 68,211,180, 32, 4,249, 96,200,170,
- 40,216,217, 61, 0, 4, 79,159, 29,243,127,252, 63,253,167,188,251,254,199,140,119,119, 73,179,132,209, 48,167,109, 61, 58, 78,
-200, 7, 3,154,182,237,154, 75,168,170, 26, 21,197,204,166, 87,188,253,218,125,146, 40, 88,121,170, 72,175, 9,150, 74,199,107,
-130,154,120,126, 29,180, 37, 43, 90,239,215,183,228,112,162,131,197,165,220,184, 29,174,207, 7,185,165,248,232, 36,102,162,111,
- 70,197, 70,119,124,221, 53,132,235,182,201,235,253,252, 86, 56, 84, 7,185,111, 95,143, 82,201,117,155,176,150,208,245, 9,110,
- 81,212,145, 26,131,193, 73,164, 53,198, 89,144,130,108, 56, 88,191,247,164, 82,172, 86, 43, 78,159, 29, 35,133,100, 60, 26, 19,
- 39, 25, 69, 89, 49,155, 45,184,186,154,113, 54, 45,240,233,132,253,163,219,180, 85,129,169,235,144,190,151,166, 72, 41, 89, 46,
-171, 64,128,139, 61, 55, 15,198,236, 14,115, 50, 25,145,229, 41, 73,158,226,241,232, 56, 34, 73, 98,156,119,204,166, 83,148, 20,
-140,199, 99, 38, 7, 7, 8, 88, 59,206, 77, 47, 47, 89,204,231, 56, 28,227,193,144, 60,205,137,210,140,101, 85, 7,111,130,179,
- 75,178,113,198, 32, 19,100, 17, 20,117,203,106,177, 96, 24, 43, 38,147, 29,178,201, 1,214,219, 78, 19,223,224,189, 39, 75, 19,
- 86,171, 37,249, 32, 71,120, 79, 20, 75, 14,111, 28, 32,154,134,159,126,116, 76, 73, 32,177,110, 56, 13, 91, 13,151,243, 84,171,
-130, 95,250,250, 55,185,123,235, 22,223,249,206,191, 37,207,195,170,167, 88, 53,180, 86, 48,222,221, 69,120,195,120, 16, 51,200,
- 35, 6,185, 38,213,154, 88, 39, 72, 21,246,245,194,247,246,217,116,117,193, 16, 69,138,225, 32, 15,153, 12,147, 49, 59,227, 17,
- 59,147,112, 27,141, 71, 12, 70, 3,242,193,128,193, 32, 15,235,138, 65, 70, 62,200,201,178,140, 52,207,200,243,192,143, 72,211,
-164,115, 42, 85,107,204,218,247, 12,249, 46, 17, 46,216,105,247,126, 40,126, 77,118, 53, 93,100,184,250,218,235, 47,103,191,191,
-136,176,246,124, 38,250, 53, 11,208, 95,208,191,253,139,134,181,252, 34, 69,253,229,172,121, 54,123,175, 95,164,168,219, 23, 23,
-245, 36,214, 36, 73, 16,252,199,113,132, 86,209,214, 78,253,250,239, 99,156, 67,120,193,229,213,148,233,213, 37, 58, 86,193,196,
- 70,105,154,214, 81, 59,199, 96,148,161,227,136, 52, 77, 48, 77,205,106, 49, 35,141, 53,179,171, 5,109, 29, 52,216, 59,147,140,
-201, 48,195,181,158,166,240, 20, 5, 24, 50,188, 76,248,232,209,199, 68, 82, 16, 75,201,249,217, 5, 79,159, 30,131, 20,228,163,
- 9,201, 96,196,108,185,162,237,119,174, 98,195,102,239,167,228,222,216,163,223, 25,186,245,222,153, 53, 11,244,229, 24,201,245,
-204,164,237, 52,190,207,198,186, 94, 15, 60,216, 32,254, 91,200,136,144, 97,122, 70, 33,133,230,234,106, 70, 83, 55,156,159, 62,
-163,169,150, 44,166,103,148,203, 25,243,217,146,227,147, 26,169, 52, 89, 28, 83,148, 13, 86,134,233,165, 53,142, 86,120,230,194,
- 51, 23,159,137,128,120,238,183,239, 34, 21, 67,246,107,176, 6,197, 17, 11,199,131,189, 17,255,224, 55,190,202,223,251,171,191,
-196,173, 97, 76,108, 43,148,173,137, 68,112, 23, 20, 74, 6,211, 41, 23,252,183, 5, 16,107,199,131,123,251,180,171, 21,167,199,
- 51, 78,206, 79,217,191,117, 64, 54, 9, 54,168,243,101,201,238,222, 33,113, 42,240,194,146,197, 17, 90, 88,118,135, 9,137,244,
-120,227,240, 70,224,136,194,206, 95, 58,144, 27,189,188, 71, 82, 75, 88,121, 88, 90,207,210, 56,230,173,229,108, 81,115,177,170,
-104,162,152,165,243,204,107,131,147, 49, 68, 49,198, 67,221, 56, 86,149, 65,199,113, 88,241, 56,137, 78, 18,148, 86,152,214,130,
- 3,219,130, 64, 5,197,135,131, 36,143,209,177, 68, 68,144, 36, 81, 32, 85,105,201,104,148,146,196,154,186, 92,241,236,201,105,
-240, 44,136,100,144,222, 9, 79,221,148,232, 56, 38, 78,114,172,145,232, 56, 99,182,188,228, 95,255,139,255,142,199, 63,253, 8,
- 12,156,172,106, 38, 71,135, 72, 83, 3, 81,120,175,180, 38, 56,135, 57,199, 96, 48,160,110, 26,242,241, 46,103, 23, 87,236,141,
-135,220, 60,220, 35, 18, 30,221, 21,229,224,191,174,215,133, 58,138,244,122, 79,222,107, 51,123, 38,188,236, 12,104,122,109,123,
-176,155,141, 58,253,123,180,214, 61, 59,231, 59,125, 58, 27, 45,185,216,192,239,107,131,171,107,158, 86, 27,139, 48,209, 25,104,
-109,127,237,218,217, 35,174,147,105,233, 88,241,162,107,164,232, 96, 99, 31,112,123,164, 82,152,166,165,109,218,224,145,144,231,
-200, 40,194,225,195,254,123, 43,144, 74, 9,133,105, 13,214, 24,166, 87, 51,132,144,164,249,128, 52, 27,176,152, 23,156, 79, 75,
-106,145,242,214,151,223, 65,250, 16, 63,171,162,152,198, 58, 26, 99, 80,113,130,247, 22, 45, 61, 55, 15, 38,208,148,228, 73,196,
-108,181, 2,160,109, 67,130,161,148, 50,144,126,147, 4, 41, 37,171,213,146,213, 98, 65, 62, 26, 49, 24,141, 40, 86, 43,170,170,
- 34,207,115,108,107, 89,205,151, 52,117,205,213,108,202, 98, 89, 80, 20, 21,198, 56,226, 44, 38, 75, 96,152,105,154,214,162,148,
- 98,146,105, 34,157,144, 79,118,195,207,136, 19,144, 34, 64,254, 81,112,221,180,192,120, 56,192, 75, 79, 28, 9,238,239,238,115,
-242,244,152,143,174,230, 52,107,212,217, 95, 43,234,194,195,106,177,224,222,221,123,188,249,218, 67, 62,250,232, 3,140,105, 88,
- 45, 86, 44,230, 5,198,194,100,103, 23, 4, 36,137, 96,127,111, 72,162,233,148, 58, 81, 87, 30, 58,210,174,117, 52,214, 82, 53,
- 45,117,221,160,164,100, 52, 28,132, 66, 62, 30, 49,233,138,250,100, 60,102, 48, 30,145, 13, 6, 93,176, 79, 74,156, 38,235,143,
-113,154, 4, 5, 65,154,144,164,241,186,160,247,196, 78,235, 66,142, 72,107, 66,150,122,211,134,143,182, 31,158, 58,195, 52,227,
- 58,181,150, 53,168,175,189,113,247, 31,189, 60, 28,101, 91,175, 44,126,110, 81,255, 60, 15,247,151, 73,201, 94,148,228, 37,197,
-203,154,136,191,228,164,254,146,162,126,173, 17,176, 97,199,211,135,186, 60, 95,212,123,214,109, 31,232, 18, 38,117, 77,220,153,
- 89,188,184, 89, 8,172, 85,129,228,252,226,140, 44, 11,100, 8,225, 32,210, 9, 45,130, 56,209,100,105,202, 32,207,169,203,146,
- 44,137,185,113,176,143,244,146, 60, 77, 41,171, 21,163, 97, 26, 96, 70, 23,209,148,146,233,172,194, 43,205,227,167,199,216,166,
-230,254,205, 3,180, 55,152,186,198, 57, 71, 60, 24, 48,217, 59, 96,182, 44,185,154, 47,131,180, 70, 10,164,244, 29,171, 93,173,
-147,173, 16,215, 53,227,207,251, 48,110,199,229,174, 3, 89,174,197,209,190, 36, 12, 81, 60,159,211,190,113,254,195,139, 78,139,
-187,206,211,233, 14, 75,141, 20, 17, 55, 14,111,113,113, 49, 11, 18, 60, 60, 79, 31,189,207,217,179, 79, 80, 52,216,182, 70,250,
-176, 16,118, 46, 98,222, 26, 86, 56, 86,214, 35, 68, 68,237, 29, 13, 80,116, 50,180,207,187,106,188,144,184,206,186, 83, 4, 96,
-153,195, 44,230,183,191,245, 37,254,193,111,253, 50,175, 31,140, 81, 77, 65,134, 71,121,215,201, 1,117,215, 4,132,189,173, 64,
- 7,215, 51, 28, 74, 84, 20,243,199,196, 81,197,112, 28, 51,157,151, 92,205, 91,162, 44,227,214,157,155,156,156, 94,208,212, 17,
-249, 32, 37, 77, 83,132,177, 68,190,229, 96,103,200,120,160, 25,231, 2,229, 29,109, 27,236, 64,125,183,138, 16, 34, 90,123,132,
- 91, 60, 94,132, 74,239, 59,239,112, 11, 52,198, 49, 91,213,204,202,134,202,194,162,110,169,157,199,199, 41, 70,199, 24,165,144,
-177, 70,200,132,218, 88, 86,166,101,217, 24,100,172,145, 42,193,155, 64,248,145,145, 98, 94, 52,140, 38, 25,214,182,228, 73, 68,
-150, 4, 31,243,166, 49, 40,105, 81,194, 81, 44,151,120,219, 34, 33,144,132,178, 12, 25, 9,100, 36, 25, 12, 71,196,113, 78, 81,
- 52, 40, 37,121,250,236, 67,142, 63,253, 9,186,108,168, 11,207,133,241,232, 81, 78,130,197,185,224,177, 30,236, 95,195, 1,106,
-173, 37,210, 17,179, 85,195,238,193, 17, 39,199, 79,153, 12, 50,246,118, 39,168, 14,214,150, 74,135,194,183, 21,226, 34, 35, 5,
-178,119, 68,148, 91,156, 13,127,205,225,146, 45,216,189,247,144,223, 86,230,172, 37, 34, 66, 96,251,221,159, 16,244,237,109,111,
-247,138,216, 50, 24,233, 25,239,221,215, 55,232,230,166,225,239, 19,199,214, 19,125,127, 31,221, 59, 82,186, 77,202,156, 8,112,
-109, 20,105, 78,143, 79,136,147, 52, 72,223,186,124,243,225,206,206, 90, 75,239, 17, 72, 25, 81, 22,171, 64, 46,109, 91,140,241,
- 92, 94, 6,183, 55, 37, 52,151,203,154,167, 87, 43, 86, 85,203,237,163, 27, 28,236,239, 34, 85, 76,146,229,196,137,198, 11, 65,
- 81,150, 12,243,140, 97, 28,113,180, 63, 38,194,224,132, 39, 31, 13,201, 6,249,218,116,198, 57,135, 82,129, 16, 24,199, 26,188,
-103,181, 88, 96,219,150,253,163, 35,246, 14, 14,194, 74, 70, 74,172,179, 88, 31,138,147,105, 12, 23, 87, 83,142,143, 79,137,243,
-132, 97, 22,145, 72, 75,221, 26,164, 20,236,228, 9,145,142,217,187,113,135, 59,119,110, 81, 55, 53, 85,211,160,147,132,217,114,
-193,209,237, 91,124,244,232, 17,187, 7,187,164, 90, 18,123, 67, 38,224,112,127,151, 31,191,255, 9,231,203, 58, 16,231,158,155,
- 57,164, 16, 56,239,168,203,138,175,189,243, 14, 59,147, 9,223,253,195,127,199, 48,203,137,181,166,110, 90,146, 52,103, 56, 28,
- 34,148,231,206,237,125,148, 12, 6, 94, 81, 71, 62,177, 93, 45,104,140,165,106, 13,101,213, 4, 52, 73, 10,198,131,156,221,241,
-136,157,241,128,201, 36, 20,246,193, 56, 60,103,186, 75,232,139,186,155,210,186,251, 92,111,110, 58,234, 72,194, 98, 29,113,109,
-218, 0,197,215,117, 75, 85, 55, 84,117, 19,138,186,219,202,117,119,118,109,132, 99,157,187, 94,212, 63, 11,195,251,207,132,113,
- 60,191, 83, 23,226, 5, 6, 34, 95, 0,134,255,252,148,176,151, 59,205,125, 30, 10,240,153, 72,208, 45, 77,235,118,151,253, 34,
-247,186, 77, 96,137,197,174, 19,218,174,179,223,123, 2,151,238,164, 7,189,129,126, 18,235,181,164,237,249,223, 47, 68,138,186,
- 96,104, 32, 36, 87,211, 11,132,112, 12,242, 12, 44, 33,110,178, 49, 56,231, 73,146, 12,103, 61,197,106,133,179,150,213,114,129,
- 18, 17,145,142,153, 45,151, 24,103,104,154,150,217,108,133,179, 10,215,237,156,188, 11,110, 95,195, 68,160,133, 5,103,153, 46,
- 86,144,100,168, 56,101,190, 44, 40,234, 38,236,231,186, 9,189,135, 27,149,138,214, 83,250, 90,126,243,188, 84,103, 45,249,218,
-112, 31,214,207,161,216, 50, 74,190,166,217,189, 62,169, 32,196, 22, 87,129, 77,250,219, 86,120,139,243,221,132,132, 70,136,152,
-241,104,151, 36, 78, 40,150, 51,126,252,231,223,163,232, 38,116,225, 60,203, 85,197,249,101,193,233,172,101, 89, 55, 92, 88, 75,
- 33, 5, 70,132, 64, 12, 25, 73, 42,107,177,128,245,242,243,209, 29,161, 9,243,169, 39,245,142,175, 63, 56,226, 31,254,206,183,
-249,230, 43,135, 36,109,129,180, 14, 37, 68,231, 3, 45, 16, 74,135, 38, 64, 70,225,220, 23, 50,164,106, 9,129,148, 45, 74,148,
- 44,174, 30,131, 95,160,226,154, 52, 78,152, 78, 11,170,194, 51, 25, 31,176, 51,217,227,252,242,156,214, 56,156, 9,161, 37, 73,
-172,105,235, 21, 82,181, 8, 95,177,191,175,217,223,141, 49,141,165,105, 61,222,107,188, 83, 93, 49,233,184, 40,190,215,176,250,
-206, 73,171, 51,176, 8, 76,200, 16, 60,129,160,180,134,105, 85,113, 89,150, 44,157, 97, 89, 55,168, 52, 69,101, 41,243,182,161,
- 0, 22, 77,139,149, 10,225, 29,198, 91,172,146,120, 45, 72,179,148, 44,137, 72,165,164,173, 91,164,138,209, 17, 40,225,112,182,
- 13,114, 27, 15,145,148,224, 45,163,241,160, 43, 58,154,209,120, 7,132,162, 88, 21,148,197,140,247,222,251, 51, 82,213,146, 3,
-139,171,134,165,133, 69, 93,179,179, 51, 38, 82, 33,137,205, 58, 71, 28, 39, 20, 69,129, 82,138, 36, 73, 67,147,214, 26,188,135,
-249,124,206,195, 87,239,147,165,113, 88, 35, 69, 27,232, 61,142,147,107,222,236, 27,200, 61, 90, 59,122,169,158, 25,184, 37,173,
- 93, 55,169,114,147,221,208,231, 13,248,174, 8,175, 29,225, 58,207,246,245, 84, 46,187,235,122, 75, 82,212,135,181,176,157,161,
- 32,214,105, 23, 29, 73,179, 43,244,221,180, 30, 6,130,126,242,234,245,247,106, 61,185, 75,169,104,235, 38, 64,175,157, 70,220,
- 58,199,104,103,167,123,235,201,245,251, 55, 82,138,197,114, 65,154,100,193, 10, 53, 78, 89, 44,151,184,214,114,124, 62,231,120,
- 86,112,118,121,197,120,144, 33, 37,212,181, 33,203, 7,228,121,198,222,254, 46, 58,142,201,146,148, 81, 22, 19, 43, 75,158, 75,
-136, 21,113,150,130, 82, 65,123,222, 37,177,233, 40,162,109, 67, 20,114, 93,215,157, 44, 78,211,148, 37, 42,138,200, 71, 35,242,
- 60, 99,180, 59, 98,180, 51, 38, 75, 98, 92,107, 88,204, 87,156, 95, 78,137,210,152, 60, 22,196, 88,202,166,193,154,150, 97, 34,
- 73,210,140,124,188,139, 20,150,253,131,125,242,225,144,233,108,218,161, 19, 57,117, 83,227, 20,140,210,148,196,131,163, 37, 27,
-166,164, 66,240,189,159,126,204,202,186,205, 74,102, 91, 3,142, 96, 58,159,241,246, 91,111,241,240,213, 87,249,225,247,191, 79,
-172, 37,251,187, 99, 16,160,227,140,157,221, 3, 26,211,112,243,198, 14,137, 10,129, 78,222, 11,156,181,212,109, 67,221, 24,170,
- 38, 24, 68, 21,101, 69, 89, 85, 72, 33, 24,228, 25, 59,221, 46,125, 60, 26, 48, 24,229,100,121, 78,156,166,161,145,238, 86, 63,
- 33, 38,248,250,231, 66,117,122,246,238,154,180, 38,248,234, 87, 85, 77, 89, 55,148,101, 77, 81,134,162,222,116, 33, 99, 97,181,
- 27,112,248, 32,175, 11,133,254,133, 69,125,155,184,246,249,182,175,219, 83,176,120, 41, 81,238,139, 78,210,219, 69,253,101, 83,
- 60,159, 99, 46,243,115,101,108,226,197,191,219, 53, 6,124,167, 83,183,182,247,126,247,157, 69,172,127,161,164, 45,142, 67, 12,
-235,139,224,247,237, 29,177,237, 94,128,203,203, 75,138, 98,201, 32, 13, 54,163,109,235, 89,150, 45, 66, 40, 60,138,186,106, 89,
- 46,139,238, 32,130,186,174,200,134, 35, 44,146,195, 27,183, 65, 70, 44,150, 5, 81, 20,227,165,196,106, 65, 62, 26, 80,213, 43,
-134,131,132,233,213, 5, 94, 69,156,207,150,120,157,240,232,211,167,148, 77, 75,221,182,120, 92, 87,204, 33,234,108, 48,101,111,
-185, 41,196,245,195,174,243,168, 94, 23,235,181, 95,113,111, 82, 33,182,178, 2, 84, 39,177, 16,235,255,183,125,152,137, 53,195,
-152,107, 1, 62,215,205,132,130, 30,216,122, 65,158,237, 32,124,196,227,199, 79,120,247, 39, 63,230,242,226, 24, 33, 12,159,126,
-242, 9,171,210,240,232,211, 25,211,101,203,101,225,152, 89,104,181, 98,230, 60, 37,158,214, 65, 75, 8,101,105, 58, 71, 38,225,
-163,112,144,190,108,167, 46, 5,202, 27,118,180,228,239,252,202,151,249,251,191,241, 13,118, 35,131,106,139, 78,142,163, 59, 29,
-178,216, 2,235,187,181,133,216,124,238,112, 72,101,169, 86,151,212,229, 12,137,197,154,154, 97,230, 25,229, 9,171, 89,205,197,
-217,156,225, 48, 99,103, 63,163,109, 29, 42, 74,120,242,236,148,221,253, 27,168, 88, 99,109,203, 32,141,136,104, 72,148,229,198,
-206,144,157, 60, 11,236,116, 99,214, 86,185,194,135, 5,133,184,110,199,116,237,249, 12,245, 61,200,137,156, 12, 19,166,241,158,
- 40,137,169,141, 97,182, 92, 82, 11, 71, 35, 5,173,146, 16,135, 32,145,210, 57,174,154,150,133,113,180, 94, 49, 30, 12,184, 58,
-155, 81, 23,150, 85,213, 32,112,220,186,117,136,192, 82, 21, 5,109,109,176,173, 65,210,146,101, 57,145, 78,209,201,128,193, 96,
- 66, 81,172, 48,166,230,217,147, 15,144,174, 68,171,128,187,148, 69, 67,181,106,153,149, 13,141,138,216,223,221, 9, 33, 50, 74,
- 81,148, 21,131,193, 32,196,160, 74, 65,158,196,148,171,130,210,120,146,225,152, 36,137,121,112,239,230, 90, 42, 41,187,137, 89,
-117,230, 45,219, 94,239,107,127,109,177,217,185,139, 45, 19,155,190,152,175, 39,233,109, 11, 79,217,161, 75,157,161,202,186,136,
-247,239, 3,185,109, 11,218, 77, 88,207, 79,253,215, 10,124,103, 1, 26, 76, 32,144,244, 90,122,177,134,222,173,177,235, 92,113,
- 0, 99, 3, 68,238,141, 5, 47,152, 47, 22, 65,151, 94,148, 72, 41, 25,100, 89,152,240,197, 6,253, 82, 42,162,109, 26,154,186,
-161, 40, 74,162, 40,102, 58, 95, 80, 46, 87, 44,234,150,103, 87, 43,222,251,232, 19, 30,220,191,141,105,107, 26, 99, 41,139,138,
- 98, 49, 71, 42,137,214, 49, 89,154, 49,204, 51,246,247, 50,118, 15, 50,198,251,187,164,195, 33,233, 32, 39,138,117,151,100, 23,
-214, 29,233, 96, 16,204,127,122,148,161, 27,124, 86,203, 37,214, 26,210,209, 40,216, 97, 75, 72, 84,132,118,146,114, 89,178, 40,
- 43,106,107, 73,148, 39,139, 60, 78, 10,172, 53, 76,178, 24,173, 99,210,209, 14,174, 45, 41,202, 21,198,182, 28,221,190, 69,211,
-214,216,182, 37,142, 35, 78, 79, 78,217, 25,239,161,163, 8,167, 44,210, 27,246,134, 35, 30, 63, 62,225,227,211, 25,117,207,125,
- 88, 43, 13,194, 25,108,130,223, 43,223,252,218, 55,240,198,240,225,207,126, 76,150, 42,242, 65, 70, 85, 27,146,116,132,214, 9,
-187,147,148, 36, 10,164, 56,107, 61,109,107,168,234,154,162,170, 67, 65,175, 91,138,178,166,172,106,132, 16, 12,178,148,241, 32,
- 99, 60, 76,201,243,140, 52, 75, 73,178,148, 40,209,248,174,177, 20,124,150, 60,222,155,209,120,191, 89,253,214, 85, 77, 89,214,
- 44, 87, 37,171,238, 86, 84, 21,101, 55,169, 27, 99, 55, 60,164,158,100,215,185, 44,254, 66, 69,253,179, 19,243,117,246,251,203,
-138,249, 47, 60,169,123,126,238, 78,253,249, 72,214,151,237,210,175,155,222,124,241,162, 30, 44, 1,251, 61,133,235, 36, 61,215,
-119,234, 61,252,254,178,162,190,153,212,219,110,183,238, 41,170, 21,197,114, 65,158,166, 36, 58,193, 26,129,136, 82, 76, 11, 82,
-165,168, 40, 33, 73, 51,100,164, 25,141,134, 12,134, 41,113, 58, 64,168, 1,113, 54,226,252,242, 18,112,100,105,204,172, 42, 16,
-121,198,178,170,120,118,252, 12,239, 13,101, 85, 82,123,137,204,134,140, 39,251,200,206,201,201, 24,211, 37, 7,133, 20, 34,169,
- 20,146,254, 96,234,139, 53,215, 76,126,158,123, 21,175,113, 39,174,235,123,123, 56,241,185,100,196, 23,185, 3,250,205, 30,221,
-247, 16,146, 11,120,188,113, 30, 68,140,115, 2,137,102, 60, 24,241,228,241, 35,254,224,247,255, 29,195, 97, 68,237, 20,239,126,
-120, 73,227, 35, 22, 70,115,101, 97,137, 96,225, 61,166,155,152,133, 87, 24,160,149, 14,167,232, 92,227,228,231, 22,245,196, 59,
-238, 78, 50,254,147,191,245,109,126,249,213,155,228,182, 64, 57,139,148, 26,131,196,171,142, 84,133, 15,147,105,247,121,159, 92,
-231,188,195, 43,176, 24,156,171, 40, 86, 83,112, 45,194,129,179, 2,218, 22,105, 11,246,119, 98,226,196,241,248,233, 49,159, 60,
-185, 96, 52, 76, 25,142, 39, 60, 62,185, 96, 81, 89, 84,148,178, 51,158,144,233,132,213,229, 2,217,134,195,110,156,123, 14,247,
- 19,172,179, 84, 45, 52, 46,216,246,110, 55, 24,189,145,164,151,157,102, 21,127, 61,119,218,175,135, 62,172,243, 12,242, 28,165,
- 37, 86,120,140, 20, 24, 15,171,170,165,244,224,135, 3, 78,139,154,194,130, 5, 6,217,144,200, 43,170,162,165,105, 29, 89,170,
- 25,143, 51, 36,142,186, 42,104, 27, 67, 93, 25,178, 84, 48,217,217, 65, 69, 3,164,204,201,242, 33,239,189,247, 46,222, 87,152,
-106, 74,222,189, 30,149,247,212,101, 67, 59,109,104,157,228, 89,211, 18, 73,207,100, 52, 98, 48, 24,144,164, 25, 89,150,145, 36,
- 9, 81, 20,177,147,197,140,135, 67,244,112,151,171, 85, 77, 85, 44, 41,230,151,188,241,240, 65, 48,198,233, 34, 46,183,145, 34,
- 47, 8,251,114, 17, 84, 2, 61, 4,190,137,212,220,216, 21,203,126, 42,222, 26, 78,188,115,107, 13,250,118,228,235, 38,110,120,
-195,182, 23,235, 4, 57,185, 5,189,111,116,239,125,197, 21,126,179,170,242,226,250,185,233, 59,147,170,186,109,176,198,172,127,
-158,117, 14,111, 93,247,119, 70, 52,198, 16,197,154,166,170,113,214,173,221, 45,123,157, 78,175,119,143,181,230,242,234, 10,165,
-162,144,130,231,225,242,244,140,202,120,254,205,119,191,199, 79, 62,252,144,251,119,238,176,191, 55,161,170, 91,172,245, 20,139,
- 25,203,213,146,147,179, 83,180, 78, 73,180,226,198,126,206, 96, 32,186,252,247,173, 4, 60, 21, 28, 9,171,162,160,109,106,128,
- 96,136, 19,199,120, 31, 92,239,178, 44, 99, 54,155, 82,153,134,193,120,136, 23, 14, 97, 12,178,113, 76,175, 22, 28,159, 93,178,
-170,107,134,169, 34,143, 5,198,121,154,186,102,119,152, 48, 24,141,184,117,239, 21,246,247,194,164,111,186,216,215,253,189, 61,
-202,213, 18,173, 20,139,171, 41, 58,203,136, 70, 3,148,179,164,194, 33, 34, 73,150,164,252,217, 15,222,231,194,184, 77,155,219,
-123, 13,200,128,148,204,102, 83,190,246,229,119,120,237,238, 93,254,228,143,126, 15,173,109, 87,212, 45,142,132,209, 96, 76,170,
- 61, 55,246, 6, 56,219,224,172,163,110, 29,101, 29,138,120,213, 89, 57, 23, 85, 77, 81, 86, 72,130,115,229,120,152, 49, 26,164,
-228,121, 78,146, 5,195, 37,169,187, 8, 93, 1,146,141, 20,173, 87, 61,244,132,106,239,125,240, 71,105, 91,234,178,102,181, 42,
- 88, 45, 75,138, 85,201,178,168, 88, 85, 53, 85, 93,135,130,238, 54,196,100,231, 58,141,150, 15, 36, 58,245,206,235,119,174, 69,
-175, 94, 15,116, 17,159,137, 47,101,219,156,254,218,156, 32,215,182,250,222,139,173, 13,235,154, 37,242,210, 91, 15,249,246, 42,
- 67,249,115,246,233, 47,211,171,111,119, 63,159,151, 17,223, 67, 49, 82,108, 88, 47, 65,209,228, 67, 81, 95, 79,235,207, 77,234,
-157, 77,172,238,118,234,105, 28,135, 20, 50, 29, 12, 46, 94,180, 83,239, 25,140,166,219,213, 71,145, 98, 58,189, 2, 79,208,119,
- 14, 71,180, 22, 34, 29,129, 80, 12,199, 99,226, 36,166,105,234,110, 93,231,152, 95,205,248,232,201,199,156,159, 60, 98,185, 92,
- 16,105,195,238, 88,241,214,155,111,242,215,126,227, 87,249,181, 95,122,135,191,247,183,254, 58,223,252,198, 87, 24, 14, 51,140,
-128,116, 48,192, 70, 57,101,219, 48, 91, 76,193, 27, 36, 62, 24,132, 8,181, 62,216,182,237,126,251,116,187, 80,112,221, 53,168,
- 28,191,117, 41, 62,247,156,111,103,173,111, 51,227,157,219,252, 63,107, 93,136,163,117, 93,214,113,215, 56,245,187, 33,231,194,
- 68,124,235,214, 3, 46, 47,102, 28, 63,125,198, 31,255,201, 31, 51,159,205,240, 66,240,195,159, 29, 51, 43, 59,200,214, 58, 74,
-231,169,240, 24,194, 20,218, 19, 97, 92, 23,194,210,235,142, 55,235,132,144, 22, 37,144, 33, 34, 50,228,188,145, 8,193, 47,191,
-122,147,255,249,223,251, 45,142,134, 49, 73, 0,236, 1,137,237, 82,184,164,236,104,124,129, 30,209,177, 81, 3,153,176,117, 22,
-227, 4,214,169,224,246,102,166,180,213, 12, 5,120,235,169,170, 6,211,152, 46,115,186, 34, 77, 44, 71,251, 3,238,223,220,231,
-147, 39,167,156, 93, 92,240,198,219, 95,225, 98, 86,114, 57, 47,248,244,217,148, 69,233,120,112,239, 62,213,106,133, 55, 13,131,
- 44, 38, 17,158,221, 97,198,173,189, 29, 34,227, 40,171, 96, 70,225,133, 15,156, 32,185, 53,137,174,189,162,251, 38, 74,108, 49,
- 69,229, 58,156,102,119,188, 19,156,213,144,200, 46,165,172,169, 13,181,245, 44, 26,131,139, 36,181,113,204, 87, 21, 94, 39, 8,
-157,176, 59,152,176, 92, 85,224, 26,118, 38, 9, 90,120, 76,221, 18,233, 24,132, 33,201, 50,188,143, 81, 42,230,238,157, 91,184,
-118,201,236,234, 49,131, 52,236,184, 17,158,178,169,168,235,138,213,178,161, 50, 80, 26,203,210,133,247,198, 32,141, 25,164, 25,
- 66, 72,140,135,124, 52,102, 58,155,162,227,132,166,106,113,214,177,123, 48,225, 63,251,191,252,151,124,227, 43,111,113,239,240,
- 8,105, 93,128,252,117,104, 84, 69,183,110,113,178, 19,149, 90,191, 14,197, 8,201,108, 42,228,152,139,237, 66,189,149, 63,220,
- 29,192, 27, 23,184, 45, 72,191,135,196,165,216, 56,145,110, 69, 59,175,175,183,109, 51,172,222, 11,197,119,187, 82,228,150,187,
-156, 8,137,108,221,227,211, 17,163,188,115, 88,179,113,184,236,211, 35,101,164,120,118,124,130, 71,146,166, 57,109,107,201,243,
- 60, 88,144,122,183, 78,185, 84,221,153,190, 88, 46,113, 22,150,171,130,203,203, 41,171, 85, 9, 14, 62,250,240, 17, 73,146,178,
-183,183, 31, 32,248,170, 0,231,201, 7, 17,214, 54, 92, 94,206,168,171,138, 97, 46, 57, 60,200, 2, 60, 28,233,110,221, 19,172,
-120, 35,173,136,242,152,178, 44,169,150, 5,210,123,116,164,200, 39, 35, 84,162,105,218, 0,199,207,102, 83, 50, 21,119, 46,126,
- 14,215, 84,204, 47,230,124,242,244,156,214, 90, 6,169, 34,214, 2,103, 91,218,186, 98,144, 13, 25, 77,118,120,248,250,235,100,
-131,140, 36,201,208, 58, 97, 50,153,208,214, 53,131, 60, 65, 71, 2,215, 58,202,166,101, 52, 25, 33, 59,194, 88,217,180, 40, 36,
-139,217,146,159,126,114,134, 1,156, 10,207,171,236,207, 8, 9,109, 83, 51,201,199,124,237, 75,239,112,117,118,206,197,197, 9,
-105,154,162,162,152,162,168,217, 63,216, 67,107,201,254,222, 24, 65, 11,174,161, 53,193,216,171,174,107,170,186,161,108, 12,171,
-178,162, 40, 67, 83,147,167, 89,128,222,135, 89, 55,169,119,141,105,172,215,198, 69, 98,107,168,233,189, 64,250,143,222,134,215,
-188,109, 26,170,170,162, 40, 66, 49, 95, 22, 69, 87,212, 27,234,186,193, 88,115,109,167,238,125,112,185,180,107,248,253,245,151,
- 79,234,159, 45,220,215,139,187,120,238,223,235,251,111, 89, 29,246,111,166,141,239,204, 11,138,186,184, 94,224,175,237,108,127,
-142,164,237, 69,208,251,203, 26,130,235, 80,229, 38, 86,118, 19,237,234,215,197,204, 62, 63,169,119,217,232,155,148, 54,221, 37,
-146,169,245,110,233, 58, 9,135,181, 89,191,237,166,163, 16,130, 16,118,243,211,217, 34,236, 98,116,208, 85,206, 87, 5,101, 93,
-113,113,117,201,229,229, 5, 85, 93,178, 92, 46,168,234, 2,233, 96,231,104,143, 91, 7, 57, 55,111,222,227,224,112,192,193,110,
-202,254,222, 77,138,171, 11, 14,246,198,212,245,138,221, 27, 7,236, 29, 30,240,213,111,254, 50,183,110,221,230, 63,254,135,255,
- 75, 94,121,237, 53, 62,254,232,125,102,211,203,144, 84,118,237, 0,219, 72,181,251,104,193,141, 9,141,251,140,105,140,223,126,
-158, 62,115,115,107, 40,168, 47,210,174, 99,111,134,228,174, 80,192,141, 11,171, 13,103,125,247,220,122,188, 11,154,253,131,195,
-187,120, 98,148,138,200, 58,137,199,157,251,175,240,198,151,190,202,183,126,245,215,248,242, 55,127,141,183,191,242, 85,246, 15,
-247,113,120,150,171, 5,198,154,112,224,118,246, 31, 78,110, 77,168,107,242,254,150, 21, 83, 55,197, 70,120, 70,145,226, 55,191,
-254, 38,255,209,111,124,157,180, 45,193, 6,197,131, 35,200,237,124,111,204, 67,104, 72, 60, 2,235,193, 56,176, 34,240, 33, 12,
- 14,235, 34,108,171, 80,180,216,230, 10,225,151, 8, 7,214,122,106, 83,227, 8,127, 59, 40,132,243, 72, 87, 35,221,130,189,189,
- 29,188,181, 28, 63, 61, 14,222,219, 81,204,241,217, 37,109, 71,198,210,145,102,188,123,192,229,197,146,114, 85,147, 73,201, 56,
-106,121,237,214,152,189,221, 29, 48, 53,109, 99, 54, 41,131,221, 11, 26,118,236, 91,174,144, 91, 77,122, 15,211, 59,231, 48,173,
- 97,111, 50, 33,145, 18, 25, 76, 43,240, 54, 88,142, 90, 2,247, 34, 85,193,230,179,245,130,227,217, 28, 23, 41,198,183,142,168,
-156,224,244,120,193,252,170,226,242, 34, 52,189, 81, 44, 25, 14, 7, 56, 39,201,243,148, 36, 22, 60,123,250, 65, 48, 77,242, 30,
-132,198, 59,131, 51, 45,173,113, 20,214, 81, 20, 65, 90,247,204, 58,180,142, 56,220,217, 97,152,101,232, 36, 11,110,105, 73,130,
-206, 82,218,166,229,112, 48, 1,103, 57,157,158,179,106, 27,174, 78, 78,249,141,175,255, 18, 31,254,244,167,100,147, 1, 42, 13,
- 4,203, 8, 29,146,232,226,224,210,168,163,112, 77, 9, 21,133,228,180,238,128, 53,157, 17,140,232,162, 92,233,200,118,190,103,
-163,119,206,250,253,254, 27,217, 5, 34,172,165,106,215,226,188, 59,182,122,199,186,239,249, 61,221,107, 67, 87,208, 55,112, 97,
- 23,131,172, 2,252,207, 86, 68, 56, 29,140,106,140,233,114,186,101,167, 99, 14,242,174,214,132,166,179,105, 44,243,197,138, 72,
- 71, 12,242,180, 99, 80,136, 53,122, 36,149, 12,178,206,162, 66, 8,201,233,217,148,139,139, 75, 22, 87, 51,148,208, 68,233,136,
-100, 48,100,185,156, 82,151, 69, 88, 33,217,138, 72, 43,156, 15, 70, 63, 55,246,134,220,186, 49, 10, 32,136,247, 52, 69, 69,181,
- 92,225,189, 69,106,137, 74, 53,233,112, 64, 83,214, 36, 58,194,180, 45, 50,137,208,195,140, 56,139, 65,120,114, 29, 97, 87, 13,
- 73,150,227,101,139,240, 13,139,139, 57,239,127,114, 78,107, 76,104,248,148,195,182, 21, 88,207,104,178,203,254,225, 33,247, 30,
-220, 69, 8,193,213,197,148,159,189,251, 62,211,171, 41,105,150, 16,199,138, 65,158, 96,140,103, 62,157,178, 55,153, 16,233,136,
-198,122,126,246,238,251,148,171,130,221,201,152,159,188,255,152,105,211, 98,132,196,163,136,186,247,179,235,164,140, 87, 23, 87,
-252,230,111,252, 22,131, 36,227,207,255,252, 7, 76, 38, 99,240,130,170, 44,217, 59, 56, 64,169,136,253,189, 29,180, 52,224,170,
- 32,125,171, 44,117, 21,136,123, 85, 99, 88,149, 53, 69, 89,227,189, 39,207, 50, 70,163, 1,163,225,128, 44,203,200,210,140, 56,
-137, 55,150,196,244, 1, 91,158,107,122,159, 94,175,110, 29,182,181,180,117, 77, 85,133, 9,125,177, 42, 88,116, 69,189,172, 90,
-234,166, 89, 15, 68,126, 27, 13,222,178, 78,127, 97, 81,255, 5, 44,226,190,112, 94,218,207, 99,176, 95,203, 96, 23,159,255,125,
- 95, 4,206,255,162,172,249,231, 19,219,252, 75, 38,245,182,155,212,251,162,174,227, 0,193,111, 34,239,212, 53, 34,225,166,168,
-187,110,215, 17,164, 58,214, 56,156, 19,172,138,138,178,108,153,205,195,126, 60,210, 49,117, 99,113, 94,128, 8,241,158,113,156,
-146,229, 67, 34, 52,175,127,245, 29,108,219,242, 55,255,246,127,200,239,252,253,191,207, 98,190,224,127,251,191,251,223,243,233,
-167,143,249, 91,255,131,255, 17, 71,119, 31,224,100,194,173,135,111,211, 24, 73,217, 10,246, 15,110, 50,187,186,228,221,159,254,
-136,243,211,227,181, 46, 93,108, 21, 55,216,138,170,191,150, 34,180, 41,234,107,215,163,173,143,125,193,118, 61, 17,176,155,186,
-109,183,223,177,207,221,204, 86, 54,125,107,109,144,156,173,111,150,241,120,143, 91,183, 31,144, 12,119, 66, 34, 85,156,114,116,
-235, 54, 22, 73,148,230,232,116,192,104, 56,196, 59,203,100, 56,224,238,157, 59,236,239,238, 51,159, 47, 40,202,114,253, 6,121,
-145,132, 67,118,251,231,144,216, 37,144,222,113, 99, 24,243,119,127,253, 27,124,243,193, 45,100, 83,226,156, 9, 97, 13, 34,120,
-109,123,225,215, 36,168,158,132,226,131, 56, 2,219, 49,246,173,131,214, 90,156,151, 56,235,240,118, 5,110,137,164, 5, 47,105,
- 27, 67, 99,218, 53, 19, 90, 74,137,243, 14, 33, 3,233, 70,216,150, 65, 44,216, 31,167, 68,222, 18,235,136, 52,207, 17, 58,165,
-169, 44,243,105,205,249,180,100,114,112, 68,148,196, 52,109, 77, 26, 89, 82,109, 24, 15, 26,238,221, 24,177,151,231, 68, 54,162,
-105, 77,199,128,119, 29, 20,223,111,220,221,154, 64,215,163, 19,158,144, 64,102,140,193,182, 13, 7,147, 33,137,142,176,117,133,
-213,138,182,107,140, 18, 4,153, 80,104, 4,227,241,136,139,229,146,211,170,226,195,179, 41,199,243,146,218,198, 72, 57,224, 98,
-218,176,170, 37,195,161,102, 56, 28,226,240, 28, 29,237,179,156, 95,160, 68, 96,201, 71,145, 14,178,177,174,169,109,219,160,141,
-175, 43,199,162,114,156, 88, 79, 99, 44, 89,154,113,120,120, 20,214, 3, 2,154,178,164, 88, 44, 40,102, 51,234,162,226,217,201,
- 41,203,186,230,198,209, 1,143,222,251,136,183, 30, 62,228,149,251, 55, 72, 6,113,136, 16,150, 42, 24,187, 8,129,151, 30, 33,
- 20, 74,110,133,189,108,179,202, 59,132,110,163, 39,239, 96,230,206, 66,185, 15, 96, 17, 82,118, 95,223, 36,111,120,191,217,175,
-111,136,118,155,104, 86,177,101,170,116, 77, 35,210, 77,249,190,183,153, 93,107,215,253,166,239,148,162,187,190, 66, 33, 95,203,
- 75, 17, 56, 33,136,227,152,217,116, 78, 20,133,108,123,231, 12,195,209,168, 11,164, 81,235,159,225,156, 67, 71,154,166,105, 89,
- 44,150, 44,203,134,171,249,138,170,117, 60, 62,185, 96,120,120,147,175,253,210,183,120,118,242,140, 31,255,248,199,120, 4,139,
-229,156,198,184, 80, 64,234,154,166, 90,176, 51,202,152,140,114,218,166, 97,122,126,137,109,219,160,217,238,154,148, 72,199, 68,
- 82, 82, 45, 87, 40,165, 48,222,162,226,160,172,137, 98,205,124,122,133, 48, 14,165, 21, 82,123,168, 27, 22,151, 43,126,246,209,
- 83,140,179,228,153, 66, 71, 30,107,130,207,198,112, 56,230,232,230, 13, 14, 15,246, 16, 29,188, 92,148, 21,214, 11,102,243, 37,
- 77,211,160, 84, 68,172, 83, 78,143, 79, 24, 79,198,164, 73, 66, 85, 22,148,171, 10,225, 61,113,146,114,118, 49,231,195,167,231,
-212, 66,225, 93, 63,212,249, 53,116, 82, 85, 53,175,220,123,192,221, 91, 55,249,248,163,247,112,182,237,224,113, 65,217,212, 28,
- 30, 30,146,104,193, 40, 87,224,106,154,214, 82,213,142,166, 9, 59,245, 48,169, 55,235,162,158,165, 41,227, 65,206,104,152,145,
-103, 41, 89,150,146,164,155, 73,221,109,203, 24,217, 10,252,114, 46,188, 47,140,195,152,150,182, 14,251,244,213,178,100,177, 90,
-177,234,224,247,178,110,214,122,125,215, 55,139,215,102,210, 23, 20,245,159, 71,114,187,246,181,151,166,157,125,126,148,233, 23,
-241,101, 23, 47, 48,188,249,133,204,107,254, 2, 82,184, 23, 21,117,179, 93,140,140,187, 94,212,181, 38,214,155,164,156,104, 43,
- 52,226,179, 22,170, 54,216,251,117,143,227,189, 36,207,134,104,157,226, 61,212, 77,203,213, 98,197,120,178,139,113,240, 43,191,
-242, 87, 56,216,191,193, 87,191,250, 53,254,193,127,255, 63,230,233,147, 99,254, 39,255,179,255, 5,113,164,185,113,235, 46,127,
-229,219,127,149,223,251, 87,191,199,127,240,219,127,135,143, 63,254, 16, 21,103,140,118,118,249,244,241, 19,118, 15,239, 48,189,
-154, 81, 27,193,206,104,194,124,122,201,187, 63,249, 17,151, 23,167,155,215, 76,200,235, 42,109,191, 97,166, 59,215,177,210,183,
- 98, 5,221,122,250,118,107, 51,153, 96, 40,211, 21,114,107, 55,249,194,214,127,182,168, 91,183,126, 46, 91, 23,138,122,211, 61,
- 23,206, 9,132,212,188,245,246, 87, 80, 81, 66, 89, 85,100,105,194, 48,207, 41,203,114, 93, 88,151,171, 21,145,148,148,171,144,
- 92,167,149,226, 96,111,159,195,253, 3,116, 20,115,126,113, 30,246,143,207, 71,225,110,101, 20, 71, 64,236,225,141,163, 29,254,
-246,175,125,141,163, 76,162,155, 21,206, 27, 44, 65,182,212, 90,139,237,242,148,122,131, 28,211, 27, 62, 32,214,176,187,113, 62,
- 56, 96,121, 48,206,225,109, 77, 36,106, 34, 89, 35, 9,127, 87,211,218, 48, 49,109, 17,181,220, 58,226,213,161,176,104, 97,145,
-174,102,156, 41,178, 68,177,183,183, 75,219,180, 56,211, 53, 25, 81,194,207, 62,121,198,217,172, 36,201, 50,116, 28,116,173,180,
- 11,148,179,140,146,152,123, 71,135,220,220,223, 37,137, 5, 96,130, 87,124,191,142, 34, 48,167,197,246,254,189,223, 47, 10,104,
- 27, 67,219,180,236,140,134,104, 37,105,156, 9, 57,221, 82,144, 33, 73, 61,236, 77, 38,160, 35,174,230, 75, 60, 17, 86, 4,249,
- 92, 81, 86,104, 45,112, 2,230,141,101,148, 68,228, 89,204,112,152, 48, 28,104,112, 21,194,219, 46, 79,160,139, 57,197,227,189,
-196, 89, 69, 83, 67, 83, 90,202,178,229,204, 9, 26,235,216,219, 63,100,111,111,151,166, 88,113,121,122,194, 39, 31,125,200,163,
- 15, 62,224,217,179,103, 28, 63,125, 70, 89, 55,236,222,184,193,141,155,183,216,223, 61,224,207,254,244,207,248, 7,127,255,191,
-135,212,157,123,161, 80, 72,165,145, 90, 35, 84,184,118,162, 72, 95, 75, 72,243,157,217,139,138,130, 74, 98,173, 15,151,172,237,
-144,215,174, 12,106,243,218,173, 35, 94,251, 32, 24,250,221,122, 39,135,148,114, 75,230,198, 38,216,101,155, 97,175,122, 35, 27,
-185,241,141,247,219,241,218, 33, 27, 1, 41,187,230,215,224, 58, 20,198,110,229,197,199,113,194,108, 58,235,200,106,129, 57,159,
- 15, 6,235, 34,209, 19, 85,141,177, 36,113,140, 49,134,147,139, 57, 69,213, 96, 17, 60, 57,155,113, 81,212,252,143,255,147,127,
-200,223,250,187,191,131,115,150, 63,250,227, 63,230,253, 15,222,231,106, 58,103, 85, 6,242,215,249,201, 51,254,205,191,252,151,
-252,246,223,248,171, 40, 60, 77, 85,162,148, 98,180, 31,248, 58, 77, 85,135,134, 77, 71, 20,179, 25, 89,158,177,106, 74, 84,172,
-187,176,157,144,146,103,139, 26,107, 13, 58,145,248,186,102,113,177,226,167, 31, 60,161,197,145,106,143, 18, 38, 20, 85, 33,153,
- 12, 39, 28, 30,238,179,183,187,139,114, 14,103,161,106, 12,131,193, 8,235, 61,243,249, 18,107, 29,123,187,187, 92, 94,156, 51,
- 24,134, 0,153,213,178,160, 92, 21,220,188,121,147,209, 32,103,185,156,243,227,247, 30,227, 34, 77,217,174,219,162,160,180,233,
-138, 97,177, 92,241,215,126,243,219, 20,139, 57, 31,190,247, 30,131, 36, 97,119,103,194,170,172,184,121,243, 22,182,173,216,219,
-201,145, 88, 76,107,168, 42, 67,213,116, 59,245,237, 73,221,121,178, 36, 9, 59,245, 97,190, 46,234,113, 26,100,160, 72, 21,222,
-115,142,141,166,183, 91, 89,210,241,138,108,107, 48, 77, 67, 93, 85, 84, 69,197,114, 85,176, 88,149, 44, 87, 21,171,162,162,106,
- 26,154, 14,153,235,109,101,183,139,122, 95,111,162,151, 21, 56,239,253,103, 10, 99,159, 82,118,237,176,124,193,196, 43, 68, 23,
-153,249, 5, 9,114,159,181,145,125,225,204,245, 66,111,250,127,191, 94,245,254,165, 9, 93,107,246,247,115, 65, 31, 47, 66, 44,
-158,143,122,237, 45, 39,165,216, 4,222, 11,161,216,217,221,231,238,189, 7, 12,134, 57,171,170,225,149,215,191,204, 31,125,247,
-123,188,246,250,155,204,231, 11,102,179, 5, 81, 52, 98, 85,150, 88,167,200,178, 49, 79,158, 62, 1, 98,154, 86, 80, 55, 45,195,
-241,144,103,199, 79,185,115,231, 22, 77, 93, 48, 28,143,112,117,129, 86,154, 98, 85, 96, 59,251,192,237,125,185,235,157,238, 58,
- 91, 93, 33, 61,162,219,131, 95, 95, 83,132, 93,244,117,169,161,219, 34,195,247,236,226, 77, 12,166, 18,178,131,248,197,139,215,
- 17,194,175,253,245,189, 11, 51,204,151, 30,188,142,142, 18,138,229,130,189,221, 9,243,233,148,179,233, 37, 55,142,142,144, 78,
- 48, 93, 45, 57,152,140,184,156,206,137, 4, 36,121,222, 73, 14, 29,123,227, 49, 95,125,235, 77,226, 88,243,211,247,223,227,114,
- 54, 11, 26,238, 45,102,152, 39, 76,109,210,195, 59,119,110,242, 43, 15,239,145,215,225,144, 41,180, 71,216, 24, 44, 91,161, 52,
-221,245,219, 49,143,187,127,117,186,104,214, 36, 21, 7, 24,161,112,109,141, 50, 75,210,212,134,184,211,174, 65, 82, 74,163, 59,
- 40,213, 99,177,174, 69, 10,133,195,224,186,225, 76, 9, 79, 26, 11,156, 93, 97,219,130,182, 45,185, 59, 30, 82,196,158, 85,233,
-145, 89, 10,201, 33, 23,179,146, 79, 47, 90, 46,230,138, 73,230,120,243,238,125, 6, 89,132, 51, 37,101,125,201,209, 48,102, 50,
- 28,242,229, 87, 15,120,124, 94,112,124,185,226,248,252,138, 85,229, 8, 63, 93, 5, 93,125,183,104,241,128,241,224,112, 92,174,
-106,204,147, 83,246, 39, 67,114, 98, 98,215,160,144, 36,145, 98,156, 15,200,118, 38,188,251,228,113, 64,149,157, 35, 19,154, 44,
-210, 40, 95,144,250,134, 47,191,181,203, 43,247,239,114, 56, 62,228, 75,111,190,202, 71, 31,252,128,182, 89,146, 68, 30,173, 36,
- 74, 4,232,218, 11,143,148, 81, 55,161,118,146, 35,225,209,194,179,171, 37,151, 77,104,254,222,125,239, 3, 98, 87,161,157,103,
-152,229, 28, 29,222, 32,210, 17,251,251, 71,236,220,184,197,206,209, 17, 63,254,233, 79,121,248,165,175,240,179, 31, 52,124,255,
-221,247,121,231, 75,175, 16,171,176, 47, 55,222,161,101, 40,240, 1,105,233,214,102, 34,218,188, 63,215,171, 55,185,198,120,194,
-244,173,186,140,110,143,232,165,112,222, 7,200,190,143,215,148, 98,189,162,147,219,197,187, 63,159,252,214,154,177,227,114,160,
-212,134, 20,231, 55, 52,163, 53, 42,224, 59,200, 94, 10,188, 11,131, 67,158,231,129,231,208, 65,174,189, 13,168,148,146, 44,203,
-216,217,157,112,113,121, 73,219, 10,174,174, 2,239, 96,178, 59,193, 90, 3,182, 69,202, 16, 11,237,140,101, 50, 30,113,184,191,
-199,201,233, 5, 69,177, 98, 48,204,249,244,211, 51,206, 78, 79,121,248,240, 30,127,251,239,252, 29,190,254,245,111,112,113,122,
-202,163, 71, 31,243,228,228,132, 39,143, 31, 35,219, 18, 81,173,184,186, 90,113,235,230, 46,105,158,179,152, 94,113,254,244, 41,
-147,253,125,178,193, 8,188,167, 93, 46,137,148,162, 44, 11,132,132,186,109, 72, 71, 3,132,115,164,131, 12,147, 44,169,170, 10,
-124,220,165,167, 89,154,182, 70, 68,129,231, 17, 69, 10,111, 36, 90,118,217,238,121,190, 38, 15,226, 61,203,229,146, 40,245,148,
-101,197,120, 52, 33,142,162,192,137, 73, 98, 76,211, 2,130, 85, 81, 2, 48, 24,228,156, 29, 63,227,254,173, 61, 94,187, 53,226,
- 86,126,139, 63,248,225,187, 52,221,107,209,111, 65,188,128,247, 63,254,128,227,139, 11, 30, 60,124,139, 63,253,206,119,194,218,
-209,181,224, 90,234,186, 34,209, 49,117,235,136,116,183, 19, 23,254, 51,174,167,225,124,117, 91, 94, 28,215, 87,147,206,187,160,
-162,233,190,223,187,109, 36,180,187,218,156,197,123, 27, 16, 98, 99,105,219,118,157, 20,218,135,137, 57,203,154,171,132,191, 30,
-241,189,253,179,163, 95, 36,140,229, 69,193, 42, 47, 50,150,233, 3,224,123,227, 1,190, 64,129,190,254, 57,215,152,245, 63, 47,
-204,229, 47,107, 78,243,252, 54, 65, 8,241, 25,147, 26,241, 60, 27,252, 57, 51,150,231,131, 97,174, 61, 55,235, 53,175, 8, 49,
-247, 93,131,160,148,226,198,141, 67,230,139, 25,111,191,253, 54,143, 30, 31,179,191,127,192,197,197, 21,247,238,191,194,241,201,
- 15,112, 62, 34, 31,228,156,157,158,179, 51,222,225,123, 63,248, 14,166,170,136,145, 76, 47, 47, 25, 13, 50,190,247,131, 31,241,
-237,111,255, 58,190, 94, 50, 72, 19,202,171, 99,200, 14,120,252,233, 39, 68, 50,152,163,208,133, 95,108, 38, 56, 16,206,175,109,
- 15, 63,155,208,183,213,196,188,128,155,192,115,126,253, 97,130,144, 68, 93,244,234, 70,238, 38,175,175, 34, 16, 97,191,236, 61,
- 2,201,100, 52,224,254,253,123, 40, 33,217, 29, 13, 40,231, 23,180,229,138, 91, 7,187, 44,102,151,212,173, 37,137, 34,188,109,
-152,207,166, 72, 4,109, 93,146,101, 57,141,177,224, 28,210,121, 30,220,190,203,104, 56,230,195,143, 31,241,225, 39,143,104,172,
-217,106,182, 60, 18,193,195,123, 55,121,120,243, 8, 83, 20,148,210,224, 98, 48, 78, 18,137, 22,233,237, 58,155, 56,138, 20,180,
- 33, 79,185, 55,215, 88,251,135, 91,183, 70, 58,188,135,210, 58,164,111, 73,109,133,214, 10, 5,216,110,130,147, 74, 32,108,119,
-104, 3, 66,152, 64,228,235,210,157,172,143,176, 34, 76,141, 66, 88, 34, 97, 16,110,142,171, 10, 38,145, 38, 31, 71,136,180, 97,
- 52,202,185,127,231,128,227,147, 25, 74,197,120,235,248,193,123, 83,178, 20,190,252,214, 17,227, 97,206,108,118, 73,108, 13,185,
- 18,140,110,141,120,245,104,151,233,242,128,199,103, 51, 62, 61,157, 50,171, 90,106,211,239,246, 93, 55,181, 75, 28,138, 22,199,
-180,110, 40,206,174, 24,166,154, 56,209,164,105,136,164,188,164, 97,246,244, 99,166,182,198, 37, 2,221,128,112, 45, 19,223,242,
-218, 97,196,175,188,121,196,183,190,246, 22,175, 61,124, 72, 97, 99,222,251,224,103,180,213,146, 44,238,174, 47, 28, 86,216,144,
- 52, 37, 66, 26,152,151, 10, 25, 39, 68, 73, 66, 54,202, 73, 23, 21,183, 60, 8, 34, 78,143, 79,248,251,127,239,119,120,245,230,
- 46, 67,173, 16,196, 8, 33,153, 47,231, 44, 86, 21, 66, 41,170,162,228,173,215, 95,199, 57,203,175,254,198,111,240,189, 31,255,
-140, 47,191,245, 6,194,139,110,103, 30,209, 26,131,142,130,102, 90,118,175,161,135, 77,163,217, 49,220,189,236,243,209,123, 91,
-152,141, 84, 64, 70, 97,186,234,137,106,219,166, 53,125,184, 81,191, 37,247,107,214,124,119,136,175, 97,125,133,112,226, 51, 10,
-144,254, 12, 88,243, 87, 92, 80,143, 56, 31, 46, 47,239, 29, 82, 69, 36, 89,142, 80, 65, 3,238,125,103,246,226, 66,113,216,217,
-153, 80, 86, 37,206,121,180,142, 57, 62, 62, 33,201, 83, 84, 36,105,171,134, 36, 77, 16, 14,180, 10,215,229,209,193, 14, 23, 7,
-187,124,244,193, 35, 18, 1, 89, 36, 57,126,252, 9, 23, 39,183,241,206, 16, 73, 73,158,102,252,218,175,252, 10, 42,141,209, 73,
-204,201,227,167,252,232,143,191,203,179,227,115,110, 30, 78, 24,236,236, 34, 35,201,124,122,197, 98, 54,131,217, 50,172, 33,177,
-100,105,130, 7, 10, 91,135, 54,216,117, 90,106,103,200,119, 38, 44, 31,207,113,182, 5,103,112,198, 80,214, 37,121, 50, 36, 73,
- 34,188, 11, 77,246, 32,201,145, 82,146,166, 89,144,247, 17, 8,130, 73, 18, 83,181, 13,145,138, 88,206,230, 68,163, 1, 56, 23,
-188,244, 9, 57, 19,117,211,208, 90,139,113, 6, 47, 5, 81,172,184,181, 63,102,120,231, 62,231,243, 25, 63,249,248,113,112,250,
-239,206, 67, 47, 28,149,169,249, 55,127,248,111,249,143,254,230,239,112,243,246, 61,102,231,159,144,229, 17,222, 41, 86,203, 37,
-123,123,183,104, 26, 67,166,123,251,104,183,110,236,232,149, 48, 91, 14,154,155,146,176,149, 23,210,147,227, 88, 51,228, 94, 88,
-248,189,181, 56, 99,177,157,221,107,107,108, 32,105,183,129,179,178,134,220, 63, 11, 71,110,194,132,224,231, 23,245,207,155,132,
- 95, 84,148,175,199,111,109,166,251,231,139,251,243,133,250,218,228, 45,252,181,204,244, 23, 62,254, 47,184,103,255, 34,233,110,
-219, 19,183,248,130, 51,189,223,218,109,188,124, 95, 47,174,117,119,224, 16,210, 81, 54, 5,231,151,167, 12,242,224, 98,116,124,
-252, 3, 94,127,243, 29, 62,126,124,204,120,178, 23,228, 21, 94,178,127,176,199,217,217, 41,111,222, 61,160, 88, 92,112,117,242,
-140, 73, 26,243,244,209, 71,220, 58,188,201,191,184,248,125,226, 36,161, 46,150,120,239, 88,206, 47, 57,216,185,201,217,217,146,
- 97,150, 6,136, 7,137,247,118,141,129, 8,191,209, 54,111,192, 23,255,156, 57,126, 56,228,250, 46,244,133,207,187,236,229, 66,
- 2,239, 21, 72,143,242,138,176,214, 12, 4,182,117, 66,149,151, 24, 47, 17, 74,224,172, 65,122,207,151,222,122, 3,103, 26,116,
- 28,179, 90, 46, 56,216,159,176, 90,206,153, 47,231,193, 29,171, 92,146,143,198,156,159, 95, 48, 24,228, 36,177,198,251, 17,197,
- 98, 73, 18, 39, 24, 91, 17,199, 17,198,122, 38,249,144, 55, 94,125, 13,165, 20,239,125,244, 1,198,154, 16,175,137,231,181,195,
- 67, 14,243,140,243,249, 5, 11,229, 73,116,132,116, 26,209, 42, 18,229,137,132, 33,114,161,240, 6,105, 34,157,124,209,135,192,
-144, 8,164, 11,158,244,190, 99, 72, 89,231,104,156, 70,216,146, 52,181,193, 13,202,248, 80,247, 9,211,136,138, 52,222,128,117,
- 33,133, 11,103,182, 36, 17, 6, 39, 4,109, 7,225,250, 72, 32,173, 71, 88,131,107, 13, 73,156,208,174, 78,209,104, 36,154,251,
-227, 12, 34,207,178, 48, 20,177,227,100,190,226,217,119,150,236, 79, 50,190,252,198, 61, 50, 97, 17,174,166, 88, 94, 16, 11,197,
-158, 20,140,111,229,252,242, 91,247, 57,155,175,120,118,118,201,229,116,201,116, 89,177,106, 44, 69,235, 48, 91, 23,180,195, 83,
-120, 71, 43, 4,133,179, 68,174, 65,182, 33,162, 21,227,209, 30,142, 98,193, 48, 81,188,243,234,136, 95,255,210, 93,222,121,235,
- 45,110,220,124,200,201,101,205, 7, 31,125,159,197,226,140, 60, 81, 8,215, 34,108,159, 8, 72,135, 4, 5, 3, 38, 25, 41, 84,
- 18,145,142, 6,236, 8,141,138, 52,135,171, 21, 89,165,248,254,233,156, 63,255,243, 31,242,224,230, 95, 37, 31, 78, 88,172, 12,
- 79,159,158, 48, 28, 15,112, 58, 34,206, 98,154,186, 32, 75,198, 24, 44,231,151, 51,190,246,229,111, 80,183,130, 60, 82,232, 88,
- 99,165, 12, 57,211,221, 36, 36, 68,180,150,161,209, 5,174,244, 9, 94, 33,178,178,251,189,100,136,174,164, 99,119,179,118,124,
-243,159,145,217,250,237,227, 98,155,167,210, 93, 55,222,153,181, 2,193,175,163, 49, 55, 42,141,254,190,178,147, 84, 72,225,214,
-252, 27,225,253,154,148, 43,132, 88, 75,251,154,166,193, 59, 11, 98, 19, 4,115,116,116,131,211,211,243,176, 30,116,142,199, 79,
-158,112,239,238,109,156,183,180, 77,211, 21, 9,143, 18,144, 72,184,181,191,195,155, 15,238,240,233,227,239,241,214, 43,247,177,
-197,130, 15,127,242, 99,110,223, 62, 34,214, 41,231,199,199, 8,231, 73, 92,198,124, 53, 35, 31, 14,121,229,225, 91,204,167,115,
-156,247, 20,179, 25,131,221, 33, 81,172, 56, 61, 62,167,174, 13,247,111,221,198, 53, 43, 76,221, 18,231, 57,210,134,226, 43,122,
-199, 51,111, 81, 81, 20,194, 79,154, 6,109, 12, 77,219, 4, 68,193, 59,172,109, 81, 42,236,170, 27,221,172, 35,118,173, 13, 69,
-125,177, 92,117,196,216, 37,227,225, 16, 25, 65, 30, 71, 96, 13,109,211,172,207, 44,183,101,227,221, 75, 53,165,179, 36,190,225,
-111,254,230,175,243,254,227,255, 42,172,208, 92,151,117, 65,120,190,255,236,135,223,231,239,254,246,223,225,181,215,223,228,247,
- 63,254, 41,187,109, 78, 20, 15,169,202, 50,168, 65,154, 22,134,241,181,236, 19, 41,122,191, 14,121, 13,145,124, 17,198,188, 46,
-184,130,117,212,174,240,108, 18,250, 58,146,156, 91, 59,153,118, 69,189,237,110,221, 42,206, 90,187, 62,203, 55, 76, 40,177,101,
-209,249, 5, 38,245,151,197,149,126,145,168,211, 53, 60,189,229, 36,246,178,233,252, 51, 19,252,115, 59,251, 23, 53, 0,127,145,
-233,252,101, 5,125, 77, 14,123, 30, 73, 23, 27,239,243,207,112, 4, 60,159,129, 61, 94,244,183,121,191,121, 1, 5,253, 1, 34,
-186, 83,221,178, 88,204,201,210,140,197,124,206,106,177, 32,137, 99, 86,171, 21,101, 89, 34,133,100,181, 92,114,243,198, 17, 79,
- 62,125,196,235, 55,119, 81,190,225,236,217, 39, 76,134, 57, 63,254,225, 15, 57,252,107,223,230,244,244, 18,107, 96, 54,189,194,
-185,166,115, 28,115, 44,103, 51,148, 11,198, 32,219,171, 2,255, 18,155,220, 30, 33, 89, 79,224, 91, 48, 97,255,247,250,173, 11,
- 41, 16,130,122, 33, 98, 32,248,133, 14,182, 43,244,125,174,122, 31,101,137,192,162, 49,214, 65, 20, 49, 30,100,236, 78, 70,204,
-167, 23, 92, 25,195,222,222, 94,216, 67, 35,137,163, 32,149, 73,135,195,224,154, 21,167,156,156,156,177, 90, 45, 24,230, 3,132,
- 16,212,109, 3, 29,113,200, 90,194,238, 84, 73, 30,190,250, 16, 29,107,222,253,217,187, 56,107,120,112,243, 22, 15, 38, 3, 90,
- 87, 83, 43, 71,137, 67,123, 73, 92, 91, 98,111,168,165, 69, 41,223,177, 84,131,214, 55, 4,238, 72,148,181, 8,225,145, 77, 27,
-230, 56,185, 81,121, 24,235,176,222, 16,217,146,209,126, 10,174, 10,111, 97,231,183, 5, 77, 29,138, 17,225, 76,224, 40,244,146,
- 22,101,193, 10, 31,164,126, 74,117, 6, 60,174,203,187,143, 16, 30, 6,145,192,154, 18,100, 77,219, 46,240, 78,162,180,102,252,
-230,109,158,157, 38,172, 86, 48, 24,236,242,123,223,249,144,209, 64,241,229, 55,111, 49, 24,140,112, 85,129, 45, 87,204, 46,159,
-177, 60,125,198, 96, 50,225,141, 93, 77, 51,217,165,176, 17,165,129,243, 89,201,249,108,193,162,172,104,154,150, 36,146,164, 78,
-161,107, 79, 36, 29,185, 18, 12,116,204, 80, 71,136,129,101, 56, 84,188,122,119,196, 43,247,238,113,235,224, 6,183, 14, 15,216,
-191,117,155, 63,251,240, 17, 79,166,115,116, 57, 37, 81, 14,111,204,250,192,235,255,126,185,222,103, 43,148,208,168,200, 19,231,
- 25,101,227, 65, 9,170,203, 57,222,199,196,194,177, 90, 45, 89, 46, 11,236,206, 46,198, 7,121,102, 20, 39,100, 58, 34,201, 18,
-150,243, 25, 46, 15,129, 50,117, 83,115,114, 62,195,189,246, 10,174,147,234,201, 40,184,119,121, 23,166, 93,215,217,110, 6,168,
- 60,236,208,125, 71,138,236, 97,245, 62, 64,197, 91,215,161,224, 98,189, 59,151, 62, 16, 28,165,148, 27,103, 69, 64,250, 14,218,
-127,206,200, 70,136, 45, 34, 84,215,244,175,225,120,239,215, 83,125,223, 89,123,215,201, 45,165, 66,168, 14, 57, 91,115,124, 66,
- 99, 34,163, 8, 45, 4,222,152,245,225,239,187,117,218,141, 27, 55, 56, 62, 57, 37,138, 98,164,144,156,159, 95,112,120,176,191,
- 38,251,246,219,134, 52, 86, 12,243,152, 27,251,187,188,249,250,171,204, 93,204,189,187,119,137,133,103,118,126, 78, 60, 24,178,
-191,179,195,217,201, 49, 35, 59, 97, 48, 25,211,182, 45, 34, 10,141,151,247, 48,222,219,193,123, 67,146,231,220,123,248, 26, 77,
-213, 98,235, 10,239, 97,177, 90,146, 88, 67, 58, 25,132, 21,153, 49,168, 72,161, 85, 4,141, 33, 73, 34,108,211,160,140, 13, 48,
-189, 8,102, 51,206, 74, 44,182, 75,120,244, 84,117, 29,164,125,109,139, 23,130, 69,177,226,106,182,192,186,128,252,214, 77, 13,
- 46, 20, 62, 29, 69,100,113, 28,100,154,198,130,148,129,223,227, 45, 74,107,146, 44,227,232, 96,151,252,198, 17,227, 60,165, 92,
- 53,244,158, 90,253, 81,118,113,113,201,187,239,191,199,131,251,247,137,243,140,186,110,208, 4,228, 96,190, 88, 96, 14,242,206,
- 75, 94,116,150,192,178, 35, 93,138,142, 47,242, 25, 28,119, 99, 7,117,125,225,189, 46,250,219, 81,215,189,106,200,154,237,130,
-110, 3,105,110, 93,212,221,186, 78,189,216,146,123,243,239,232,139, 58,191,109,195,224, 61,124,203, 11, 32,113,177, 69, 76,186,
-166,105,247,108,197,169,242,194,157,253, 54, 61, 63,232,213,197, 90, 63,187,173, 5,253,188,232,213,207, 51,191,241,226,197,223,
-217,203,185,232,211,119,156,219, 42,210,174,139, 78,164, 43,150, 91, 28, 3, 33,122, 48,230,165,127,139, 16, 2,215,191,121,197,
- 38, 30, 86, 10, 9,182,165,169,107,202, 85,193,211,143, 31, 49,201, 19, 86,203, 75,156,111,152,207, 47, 56,216, 25,113,118,242,
- 9, 7,163,155,252,236,131,255, 47, 85,253, 14, 41,158,199,143, 62, 98, 48, 28,112,242,248, 19,174,102,223,162,188,188, 98,249,
-244, 9, 77, 49,133,213,105,144,121,181, 37,170,158,209, 10, 75, 83,214, 33,209, 71,117, 69,187,143,146,220,138,109,124,222,116,
- 72, 73,191, 49,148, 17, 27, 66, 93, 56,168,196,218, 52, 70,116, 65, 25, 10,137, 70, 16, 17, 58, 88, 37, 21, 74, 40,116, 7, 91,
- 43, 41,187,162, 30,220,236,172,243,140, 7, 49,245,252,140,129,214, 76, 43,139,109, 29,151,103,231, 28,221, 56,164, 44, 11,234,
-170, 64, 71,146,197,213, 5,243,229,130, 76,199,164,122, 64,107, 44, 85,211, 96,157, 71,201, 16, 4, 18, 71, 10, 99,131, 72, 93,
-171,132, 7,119, 30,208, 46, 87, 92, 93,158,176, 63,212,172,204,170, 27, 71,195,225, 44,112, 88, 97,176, 17,120, 37,240,145,192,
- 9, 27, 14,116,103, 17,222,160,108,180,158,218,193, 62,151,246,183,185,166,134, 56, 38,145, 68,168,240,220, 40, 17, 97,188,197,
- 71, 96,171,118,157,235,173,132, 70, 58,137,112,193, 96,169,238, 7, 54,239,193,182,161,121,232, 44,195,109,219,160,132,198,137,
- 8, 17, 37, 24,231,186, 92, 97,137,198,227,150,167,220, 31,198,136,113,130,136, 29, 55, 14, 94,227, 71, 31, 61,227,191,249,131,
-159,241,246, 43,135,164,206,176, 59,136,153,236,238,147, 68,193, 53,207, 90, 71, 83,172,216,207, 34,108, 36, 24,103,150, 91, 34,
-194,140, 38,148, 85, 96,233, 71, 64, 18, 57,178,200,145, 68, 53,251, 59, 57,131, 76, 51, 24,230,220,188,117,192,120,146,147,100,
-251, 72,189,131, 31, 30,242,232,233, 25,167,159,126, 8,205,130,178,184, 36,157,140, 66,177,140,100, 8,254, 80,225, 26,178, 62,
-188, 86, 1,100,247,228, 73, 76,107, 20,205, 32,162,172, 64, 69, 51,204,170, 96,146,104,166, 39,103, 92, 29, 79,185,127,120, 27,
-225,107, 4, 21, 24, 24,231, 57,190,109, 72,117,196,106, 89,176,179,191, 79, 18, 55,204,202,150,147,249,146, 52,206,137, 37, 68,
-174, 5, 37,113,113, 26,136,110,184, 96,197,185,245,250, 41, 25,225, 59,221,250,218,104, 70, 8, 84,164, 59, 69, 71,192,116, 69,
-159, 85,237,183,172, 96,251,179,161, 91, 21,246,252,141, 30, 82,239,237,164,125,159,124,232, 2,119,162, 71, 9,144,178,243, 82,
-232,179, 46, 66,211,128, 20,200, 36,134,214,116, 69, 45, 52, 71,189,221,172,148, 2, 21, 71,152,214, 32, 68,248,221, 28, 30,169,
- 20,119,238,221,230,244,236, 28, 37, 34,202,162, 97, 54, 43,200,243,172, 35,246,129,140,163,255, 31,107,231,217, 35, 89,146, 94,
-231, 39,204, 53,233,203,118, 87,251,158,153,229,206, 82, 67,129, 2, 41,174, 0,126, 89,254, 0, 9,144,126,182, 8,154,221, 89,
-106,199,187,158, 54,213,229,211, 93, 27, 70, 31, 34,238,205,204,106, 55, 43,237, 0, 5,244, 20,186,203,100,221,138,120,205, 57,
-207, 33, 69, 50, 28, 85,140,167, 67, 14, 78,142, 57,218,123,132, 28, 14, 40,150,151,248, 85,205,129, 78, 88,173,231, 40,237,104,
-138, 18, 45, 53,214,120,246,166, 99,178,196,209,214, 45, 73,166, 65,196, 66, 69, 75,146, 73, 78, 50, 74,113,237, 0,125, 48,237,
-139,120, 76,139, 18, 18, 95, 53, 65, 29,230, 27,132,111,208, 13,216,198,115,189, 88,178, 46, 86,204,102, 99, 70,217,128,170, 89,
- 96,189, 64,165, 25,251, 7, 7, 97,215,236, 12, 22,201,197,197, 53, 6,133, 74,242, 32, 24,116, 14,169,160,105, 67,129,147, 9,
-135,114,109, 88,109, 38, 41, 94, 10,108, 83, 65, 85,179,242,154, 86, 42,102,153,226,175, 30,158,112,254,213,243,240,123,142, 11,
-241,184, 78, 96,156,225,223, 62,255, 87, 62,249,239,255,131,147,135,159,114,245,243,215,204, 38, 5,215, 55, 23,228,147,156, 85,
- 49, 4, 63,140,182, 70, 13, 50, 32, 94,149, 16,104, 33,208,194,247,206,162,224, 47, 17,193,238,186,109, 43,101, 51,189,243,236,
- 90,133,165,143,171, 42, 31, 18,223,108, 15, 60,139, 34, 93,103, 99,200, 81,231,101,241,111, 52,146,219,247,154,254,165,227,235,
-219, 59,117,239,119, 7, 13,239,203, 78,191,189, 23,247,189,134,233,255, 95,228,246,151,218,167,223, 14, 45,233,157,132, 91,222,
-236,247,141,226,111,119,234,239, 10,200,145,114,183, 0,112,214, 5, 10, 92, 81,113,116,112,196,197,217,107, 38,163, 1,215, 23,
-231,140,135, 3,230, 55,151,220,125,244,132,114,189,228,250,250,156, 44, 81,156,190,122,198,253, 59, 39,156,190,252,137,249,229,
- 37, 26,199,247, 95,126,129,175, 43,174,127,254, 30, 95,175, 16,245,154,166, 42,177,150, 88,213,111, 56,225,155,239,211,191,231,
-245, 20, 59,180,185,174,211,238,172, 92,206,197, 3,138,160,238, 15,220, 30,143, 87,126,131,123,239,244,214,221,222,144, 77,146,
-159, 82, 2, 83,175, 81,126,134,173, 27, 18,160, 92,205,153,237, 77,105,202,146,155,171,107,148, 78, 89,175,214, 24, 27,112,164,
-206, 85, 28,223,185,203,213,245, 77,232,194,132,196,251,224,111, 22, 66, 81, 46,214,225, 82,140, 35,173, 39,143, 31, 99,235, 53,
- 69, 81, 34,124,136, 14, 13,236,116,139, 54,161, 51, 40, 68,131,214,157,189,184,139, 91, 13,157,181, 82, 46, 6,125,185, 29, 26,
-225,142,152, 84, 38, 28,230, 97,111, 41,164,198,118,101,158, 8, 74, 91, 31, 49,111,225, 53,151, 72,153, 32,101,139, 84, 33, 28,
-198,251, 77, 84,157,113,174,127, 70,124,204,212, 14, 95,115, 44,162,226,170, 68, 75,133, 16, 22,111, 75,164,183, 40,175,200, 82,
-201, 63,252,230, 33,147, 92, 34,244,128,155, 69,201,179,159,151,224, 44,199,211,140,163, 81,194,131,253, 17,123,195, 28, 47, 18,
- 28,208, 82,224,189, 5,229,152, 78, 4, 16, 72, 85,169,134, 68, 89,198,131,148,201, 56,101,111, 54,227,254,253,251, 76,166, 51,
- 90,227, 73,210, 9, 94, 40,190,251,241, 75,170,245, 53,216, 37,195,180, 69,232,113,188,124,130,224, 76,117,163,202,142,199,174,
- 18, 16, 10,229, 19,132,213,100,153, 38,111, 37,217,176,101,124,247, 16,245,172, 38,183,142,124, 24,232,121,235,170,164,172,215,
-172,150, 11, 70,119,198,164,105, 74, 85,213,100, 89, 32,206, 57, 23,200,105, 66, 42,126,248,249, 37,247,143,255,154,134,240,179,
-208, 74, 98,125,139,240,250,205,137, 98, 7,143,233, 85,237, 27, 10, 29,221, 51, 42, 4,214,155,254,176, 18, 91,222,243,119,165,
- 73,110,176,195,113, 57,222,235,130, 58,130,162,221,141, 38, 20, 98, 11,231, 33,250,173, 76, 80,234,107,100, 95, 56,135,202, 58,
- 16, 19,227,199,143,193, 82,200, 96, 77, 28,140,134,220,149,119,120,241,243, 43,188,247,188,124,249,138,227,227, 67,246, 15, 14,
- 34, 27,220, 33,132,103, 52, 30,161,179,156,241,116,159,209,221,187, 60,126,252,148,139, 83,137,169,214, 52,206, 51,217,219,227,
-234,250, 18, 33, 4, 55,151, 87, 28, 28, 28,113,115,125,201,157, 7, 67,202,186,100,224, 71,136, 68,134,108,129,173,213,163, 16,
-130, 52,203, 67,224,114, 20,184, 73,209, 77, 50, 60,222, 88,108,107,208, 73, 70,213, 86,156, 95, 92,208, 52, 13,206, 26, 4, 81,
-131,224, 61, 90, 4, 34,156, 49, 13,206,180,148,141,165,181, 6,148, 98,177,152,179,184, 58,103,156, 73, 82,173,169,235, 10,103,
-108, 88, 87, 52, 13, 89,146, 80, 52, 21,137, 82, 76, 6, 67, 26, 19,108,199,179,201, 24, 83, 87,252,227,223,255, 23,254,227,199,
- 83,230, 85, 29, 9,147, 61,144,156, 47,190,250,130,197, 63,253, 19, 39, 39, 39, 60,255,250,143,232,196, 50, 73, 20, 77, 93,115,
-117,125, 67,243,224, 24,239, 69, 23,252, 23,169,154, 50,230,104,108, 66,131,250,181,249,123,118,182,254, 45, 19,223,221,168,235,
- 24,165,106, 67,215,110,141,197,110,197, 91,127,232, 63,253,161, 49,250,251, 20,231,191, 68,161,190, 43, 16,217,126,200,253, 95,
- 72,177,206, 95,236,227,236,196, 33,238,248, 0,253, 95,228,107, 20,183,118, 48, 97,252,100, 41,214, 5,179,241,132, 97,150,240,
-211,203,103, 28,156, 60,228,230,234,146, 71,247,159,242,252,187,239,120,122,231,144,225, 48,163, 88,223,176, 55,155,112,113,241,
-130, 59,251, 83, 92,187,230,250,244, 5,163, 68,115,254,252, 57,162,109,120,249,221,215, 20,151,175,176,179, 67,202,170,192, 20,
- 77,175,118, 15,138, 99,191,133,171,220, 21, 36,190,115,213, 17,167, 38,155, 46, 94, 6,187,151,148,120,103,250, 7,209, 56,131,
-178, 18, 47,193, 57, 17,223,108,188,220,229,142,232, 80, 74, 79, 91,174, 41, 22,151, 20,203, 5,249, 96,130, 18, 83,234, 34,120,
- 81,199,147, 25,243,197, 10, 17, 73,125,121,146, 49,153, 78,169,170,130,182,174, 66, 20,165,177, 8,149,144,102, 57,109, 99, 2,
- 2, 87, 64,150,104, 4,142, 84, 13,152,205,102, 92,158,189, 38, 79, 20,180, 6,161, 4,173,105,144, 74, 4,101,176,119,164, 73,
-160,176, 73, 17,194, 48,148,148,224,235, 48, 86,147, 30, 41, 93,159, 57,191, 1,125,138, 24, 69,105,248,245, 71,247,208, 82, 96,
- 35,173,174, 43,106, 36, 14, 37,125,111, 11,236,236, 85,170,213,241, 99, 5,216, 77,247,172,133,139, 60,142,136,165, 8, 10,225,
-232,201,237, 10, 76, 25,166,213, 33,239, 28,144,210,163,125, 13, 86,144,139,150,223,126,114, 68,105, 20,167, 67,205,252,112,194,
-217,162,228,231,179, 75,150, 45,156, 94,157,115, 48,204, 24,103, 34,250,234,161,109, 29,163, 97,194,120,152, 98,218, 18, 79,232,
-196,108,219,130,202, 64, 15,200,198,251,136,100, 76, 81, 43,132, 72, 89,175, 27,230,203, 83,174,111,206, 80,162, 33,147, 6,172,
- 67,144,224,172, 15,204,118,228, 6,203, 42, 58, 54,122,160, 38,122, 23, 10,198, 60, 79,105,189,166,182, 65, 40,116, 84,214, 52,
-175, 46, 67,100,107,174, 89,212,107,238, 29, 30, 49,191,153,135,142, 84, 6,218, 64, 85,215,148, 77,205,120, 60,101, 54,155, 33,
-181,228,244,234,146,207,191,125,198,103,191,126, 10,137,100,164, 28,137,112,224, 37, 66,167, 17,241, 76,100, 13, 56,164,151, 72,
-173,183,194,135,182, 14,230,174,240, 20,201, 45, 1,172,232, 33,159, 27,135,144,220, 28,206, 91, 80, 43, 47,101, 24,242,137, 46,
-248, 58, 20, 58,222,219,126, 29,215,141,253, 3, 17, 80,246,254,116,175,162,192, 88,138, 80,160, 90,135, 51,166,215, 61, 8,165,
-194, 86,117, 11, 83,223,182, 45, 74,107, 14,143,143,120,249,242, 37, 30,207,233,235,215, 8, 41, 57, 60, 60, 68,225,209,198,209,
-164, 25, 22,197,116,255, 0,148, 38, 31, 14, 24,140, 39, 44,173, 69, 8,205,195,199, 15,131, 86,164,105,194,115, 96, 91,188,179,
- 76,247,246, 25, 78,166, 24, 95,163,253,102, 61,231,108,232, 29,149,212,225, 87,220,250,157,134, 79,106,141,183, 6, 15,100,105,
- 74, 34, 37,171,186,230,230,242, 10, 1,225,242,118, 41,120,195, 40,207, 24, 14, 50,242, 44,165,174, 26,156,183,220, 44, 87,209,
- 50, 40, 16,206,146,231, 41,131, 52, 76, 95,150, 55,107,134,131, 65, 16,152,121, 79,166, 36,149,179,248,186, 70, 9,205,217,217,
- 41,185,148,100, 90,163,128, 7,135,251,252,245,147,251,252,219,215, 63, 80,223, 58,210, 23,203, 21, 95,124,243, 53, 79,143,142,
- 73, 6, 35,140,107, 88, 44,150, 40,157,176,200, 37,243,197,138,201, 40, 3,239,122,160, 83,215, 4,116, 69,235,110,170,229,219,
-111,247,157,145,123, 28,199,191,237, 66,183,182,179, 17,219, 24,218,226,223, 41,198,126,227, 82,191,109, 69,219,254, 71,183, 57,
-235,183,187,116,241,150,209,252, 59,139, 4,255, 97,139,219, 27,159,243,255,225,226,220,254, 58,223,120, 49,197,251, 69,119,111,
-223, 80,248, 91,170,185,219,175, 9, 59,123,146,247,126,125, 93, 7,183,165, 12,247, 24, 90,211,226,173,101,113,115, 5,182, 33,
-213,130,171,139,107,154,163,187,212,213, 10,103, 42,246,166, 51,230, 55,151, 60,152,229,188,124,249, 2,211, 20,248,118, 69, 57,
-191, 64,154,154,243,151, 47, 17,198,177,184,188,128,182,192, 86, 75,240,142,117,177,238,187, 17,231,123,157,100, 47, 23,216,134,
- 92,109, 48,213,193,167,219,117,230, 93,122,144,234,213,238, 49,241, 74,200, 64, 83,179, 29, 41,207,210, 24,135,199,145,110,169,
- 58,117, 28, 85,117,194,186,208,117,120, 52, 13,213,106,142,111,214,180,180, 56,103,200,211,132, 60,145, 72, 28,214,180, 12,178,
-140,245,186, 32, 85,146, 98,185, 64, 40, 73, 34, 65,102, 9,109,162, 89, 23, 53,165, 13,234,208,245,170,160,108, 26,116,154,147,
-104,141,113,146,131,131,163, 16,126,225, 26, 76,219, 96,155, 22,239,131, 55, 91,250, 20,239, 29,117,171,240, 46, 12,206,100,180,
- 30,117,151, 38,120,148, 14,218,128,206,235, 45,162, 14,195, 57, 75, 91,213, 76, 70, 31, 33, 69, 64,199,134, 75, 61,240,106,125,
- 79, 84, 12,235, 22,143,235,125,198,206,219,184,161,234,132,136,225, 96,240, 46, 20, 68, 2,143, 82, 93, 1, 40, 67, 39,227, 92,
- 4, 49,135,177,177,210,138, 84,117, 81,165, 14,231, 42,132,107,201,132,100,239, 40,101,209,122, 30,204, 38,156, 78, 18, 94, 94,
-172, 88,213,130,186, 82,164,171, 5,182,109,201,147,132, 81,150,177,186, 94,115, 57, 47, 80, 2,164, 76,194, 56, 90, 56,100,166,
-217, 31, 28,224,146, 9,175,231,107, 50,221,224,141,227,102,126,142,144, 53, 74, 5,244,176, 21, 97,156,109,241,104, 45,122,251,
-235, 78,170, 99, 12,132, 23, 66,162, 85,130, 80, 26, 33, 82,172,132,214, 11, 74, 60,119,239,223,163, 92,183,168,241,136,162, 42,
- 57, 78, 52, 69, 85,146, 38, 65, 40,102,140, 65, 39, 9, 58,181, 12, 6,195,128,204, 52,150,147, 59, 71, 36,105,202,231, 95,255,
-192,201,195,199,228,195, 1,178, 41, 73, 50,209,163,113,149,146,155,217,148,183, 81,184, 22,198,222, 97,226, 18, 87, 98, 29, 80,
-198,111, 39, 81,110,159, 27,162, 23,252,117,127,238, 45, 82, 81,188,230,133,140,107,187, 77, 48, 12, 46,124, 14,108,252,123, 46,
-174, 26, 69, 32,198, 9,223,237,234,163, 55,222,249, 72,179, 11,197,166,143,188,131,109,171,166,237,192, 37,125,177, 28,136,126,
-143,159, 60,142,204,125,248,241,167,159, 72,210,148,189,189,125,156, 51,212,198,179,172, 45,227,189,187, 52, 50,163,174, 42, 38,
-179,125,234,198, 4, 44,233,186,228,206,201, 9, 87, 23, 23, 12,242, 1,211,201,148, 27, 4,167, 23, 55,220,123,120, 72,154,133,
- 51,171, 11,111,234, 9,146,209, 69,227,227, 58,206,123,143, 55,109,111,117,117,214, 50,200,114, 92, 83,210, 20, 21,151,151,151,
- 56,167,130, 19,195, 91, 18,173, 34,226, 88,160,117, 74,221,180,212,109,205,205,124,201,170,172, 73,179,140, 65,158,161, 49,164,
- 74, 98,234,154,170, 44, 56,216,223,199,182, 13, 94, 73,218,182,162, 42, 10,154,178,162,170, 91,158,189,120,205, 32,207, 24,102,
- 57,197,106,193, 64,122, 62,125,116,194, 87, 63, 62,167,174,154,158,186,232,227,239,243, 31,254,248, 57,159,253,207,255,197,221,
- 7, 15,248,254,219, 47, 72,135, 21,117, 94,114,113,102,121,254,226,140, 79,127,245,164,127, 60,182, 51, 0,164,216,141,247,221,
-209, 90,253, 25,140,182,205,197, 30, 47,243, 91,124,144,247,221, 47,219, 91,118,253, 46,171,218,219,178,198,111, 95,248, 31,186,
-200,223, 45,110,123,123, 2,220,187,198,254,239,178,197,189, 79, 0,247, 86, 17, 94,119, 40,255, 2,193,222,198, 59,176, 27, 5,
-251, 46, 84,237,135,194,101,118, 57,211, 91, 57,206, 66,210,180, 45,197,122,197,252,250,138, 52,203,105,202, 53, 77, 85, 80,174,
- 87,216,182,161,169,215, 12,210, 28, 83,215,152, 90,211, 84, 21,197,170, 32, 85,142, 76,183, 12,114,197,249,249, 57,123,123,146,
-178,106, 73,146,140,211,211, 87, 8,185, 31, 30,134,232,135,237, 66, 77,132,163,127,223,110,221,226,145, 94,198,113,249, 46,198,
- 87,198,162,168, 59,156,164,220, 68, 5,134,157,160,236, 31,190, 16,126,211, 6,116,168,181, 40,173, 66, 52,103,236,208,113, 2,
-173, 60, 10,203,245,229, 37,152, 18,169, 21,249,168, 65,120,199,104,118, 68, 83, 23, 40, 5,203,197, 53, 74, 40,234,170, 33,201,
- 18, 50,157, 83,196, 27, 51, 28,132,129,180, 50, 26, 13,153,207, 23,228,105, 66,107, 27, 90, 27, 32, 42,163,201,148,117, 89,161,
-124, 67,158,165, 36, 89, 66,219, 84,168, 84,163,148,192,154,182,215, 7,180,214,160,108, 80,105,219, 72,246, 18, 2,234,218,199,
- 12,117, 21, 82,144, 98,101,222, 54, 53,153, 20, 28,204,114,164,111, 81, 74, 97,141,136, 5,142,195, 69,165,123,208,105, 4, 16,
-141,139,227,212,144,228,234,251, 50,193,119, 56,208,110, 84, 26,211,187,122, 74, 84,212, 37, 40,161,130,160, 47, 73, 3, 84, 38,
-238,134, 37, 32,125,224,127,163, 66,103, 58, 83, 45,251,153,228,193, 40,229,179, 71,143, 40, 93,206,207,175,175,104, 76,141, 66,
-177,156,175, 72,146,140,225,100,134,109, 91,156,177,180,181,161, 40,215,180,198, 34,179,150,233,186, 65,103, 5, 89, 38, 57, 63,
-127,133,162, 1, 12, 89, 18,214, 28, 66, 37, 32, 19,172,209,160,194,247,215,253,186,134, 58, 94,246, 92,134, 16,160, 34, 17, 90,
-163, 85,134, 64,147,225, 25,142,114, 70, 66,210,150,142,187,143, 31, 50, 60, 60,166, 82, 50,250,185, 37, 69, 85, 49,172,234,144,
- 76, 40, 36, 77,211, 50,153,104,132,212, 44,150, 43,244,133,102,186,127,128, 74, 71,252,233,155,103,148,235, 3,254,234,225, 33,
- 2, 71,150, 6,176,137,142, 89,229,157, 85, 77,244,226, 77,181,217,143,239,172, 4,217,217,153,203,109, 20,246, 54, 41,206,135,
-117, 73,127,176,198,238, 43, 14,102,122, 17,169,144, 91,129, 82,253,199,140,231, 70,180,254,137, 24,244, 18,186,244,216,217, 27,
- 11,194,135,120,223,206,188, 20,207, 38,105, 68, 88,175, 25,211, 39, 46, 90, 60, 58, 85, 60,253,228, 99, 94,190,120, 73, 99, 90,
- 94,189, 62,163,110, 90,246,102, 7,220,172, 27, 26, 82, 70,163, 41,190,117, 44,230,215, 32, 4, 39,247,238,243,195,247,223,113,
-250,250,140, 79, 63,253,132,229, 98,137,115, 33, 55, 60,205, 6,188,124,125,198,175, 42,208, 3, 69,154,110,242, 60,148,210, 72,
-233,113,241, 2,239,194,133,132,214,193,110,102, 29, 74,120, 18,173, 73,210,148,122, 49,103, 57,159,115,254,250, 2,185,119,191,
- 15,183,113,214,162,133, 66, 42, 77,107, 60, 22,199,171,179,115,170,198,177, 88, 44,200, 7, 57,195, 44, 65,227,184,119,112, 66,
- 85,174, 67,252, 46, 14,219,182,120, 31,166,134,235,117,136,116, 45, 91,207,233,213,146, 39, 31,125,138, 49,142,225,112,194,226,
-230,156,167,247,142,153, 12,114,174,171,134, 91,230, 51,126,122,241,156,162,173, 57,188,119,159, 47,190,248, 19,117, 85, 81, 23,
- 37, 2,207,235,243,107, 62,254,248, 81,152,192, 73,185,123,119,137,109,207,248, 27,179,245,173, 80, 43,241,166,183,106, 59,233,
- 52, 22,136,187,232,109,215,123,218, 63,212,132,246,150,182, 55,216,222, 31,176,144,237,236,198,223, 33,164,123, 43,221,109,231,
-255, 63,172,178,127,219,110,254,109, 35,227, 15, 5,186,236,252,123,241,238,170,169,243, 16,238, 92,208, 91, 72,191,119, 1,122,
-186,185,219, 47, 25,141,116, 35,248, 0, 56, 81,125, 23, 38,165,164, 44, 66,122,219,253, 39, 79, 41,150, 55,224, 12,235,197,156,
-193, 32,101,121,115,197,112, 48, 98,113,125,131,244, 67,234,162,101,117, 83, 49, 26,230,204, 23,175,152,206,198, 92, 95,174, 73,
-235,148,239,159,189,230,228,222,148,124, 48,101, 93,102,100,121, 0, 89,236,132,115,138, 55,189,142,221, 51,231,162,143, 57, 48,
-196, 5, 82,111,228,239,178,227,229,139, 78, 64, 24,154, 10, 41, 36, 22,130,133, 41,178,238,187, 12,122,105, 36, 74,134, 28,107,
-165, 84, 44, 44, 36, 9,160, 83, 40,218,154, 73,166,201,178, 12,108, 67,185,190,198,122, 71, 58, 58, 96, 56, 24,160,181, 36, 79,
- 51,112, 3,164, 18,172,203,134,166, 42, 80, 73,142,109, 91, 6, 89, 78, 89,213,220, 92, 95, 49, 26,229, 97, 45, 80, 24, 60,142,
-186,110,201,243, 33,149,243, 92, 92, 47, 72,148,100,152,106, 6,169, 98, 58, 26,162,147, 64, 58, 75, 34,160,196, 89, 29,198,163,
- 34,116,115, 74, 73,156,179, 32, 44, 74,105,180, 22, 49,123, 62, 28,228, 90, 37, 28, 79, 82, 6,105,200, 23,111,157, 3,161,227,
-248,204, 96, 93, 11, 94,245,137,127,155,103,105,115,113,171, 56,194,115,193,114,143, 19, 97, 60,188,161,253,133,169,138,150, 33,
- 16, 69,136,168,184, 85, 10,165, 18,180, 78,251,231,207, 25,131,183, 38, 74,113, 36,194,121,116, 83,129,179, 12, 85, 67,226, 20,
-159,221, 29,208, 38,147,120, 8, 30,147,232, 64,226, 90,175,214, 76, 38, 99,188,131,197,124,206,197,213, 57,143, 31,159, 48, 25,
-229,184,182, 96, 93, 86, 72, 95, 35, 68,141,179, 38,230,199,131, 67, 97, 93, 80,146,135, 61, 35,177,112,233,138,153,205,159, 65,
- 69,248, 76, 20,120, 73, 65,146, 42, 50, 36,114,109,145,249,128, 50, 11,132,191, 59, 7,119, 25,231, 99,202,186, 66,103, 57,117,
-211, 34,171,154, 89,228,124,183,198, 4,128,211,222, 30,147,201,140,253,189,125,206,206, 47,248,246,219, 31,152, 95, 95,130, 23,
- 60,190,127,135, 3, 21, 28, 4,206,249,224, 25,223, 66,179,118,209,194,157, 2,222, 58,183, 51,181,146, 66,246,200,118, 27,139,
-174,254, 32,222, 58, 76, 58, 1,176,148,170,239,180, 2, 59, 62,248,205,195,103,218,196,175,122, 21, 38, 86, 62,242, 26,112,193,
- 50, 8,190,167, 82,246, 22, 60, 37,250,181, 79,167, 83, 9,157,190, 71, 8, 23, 98, 97,189, 38,213, 73,252, 91, 14,161, 82,144,
-146,199, 79,159,112,117,121,205,124,190,224,217,243,231, 92, 47, 74,174, 10, 79, 54, 59, 98, 94, 52, 60,126,112,159,166, 46, 57,
- 61,187,224,227,143, 62, 65, 75, 73,146,167,252,248,253, 15, 76,166, 83, 22,139, 37,199,119,238, 83, 87, 13, 74,231,124,241,229,
- 51,126,247,187,207,240,126,213, 39,147,120,231, 66,216,139, 12,209,180, 97, 20,110,251, 24, 92, 39, 37,182,173, 81, 8, 92,107,
-169,214, 5,231,103,231,180,117, 69, 46,130,213,179,181, 6,225, 58,124,171,162,170, 91,206,111,174,185,188, 89,134,220,112,239,
- 24,141,134, 92,157,157,242,240,238, 17, 82,120,188,181,164, 73,130,183, 21, 78, 56,108, 3, 42,213,212,198,112,122,126,197, 55,
-207, 78,145,195, 25,217,112,128, 74, 51,234,186, 65, 10, 24,106, 73,162,211, 55,218, 92, 47,161,172,107,254,240,199,255,224, 31,
-254,246,111, 25,205,246, 89, 45,151,164, 82, 50, 24,142, 49, 46, 52, 76,233,214,221, 35,227,219,238,157,182, 61, 78,167,231,186,
-227, 92, 95, 60,184, 45, 4,247,155, 59,245,120,137,119, 29,186,219, 85,201,191, 43,200,108,123,236,175,127,145,231,252, 29, 59,
-243,219,234,247,219, 29,240,159, 19,193,250, 54, 81, 93, 63,222,126,163,243,125,119, 71,252,190, 53, 66,191, 54,120,151, 53,111,
-171,186,242, 59,246,131, 15,239,224,111, 95,234,111, 47,110,216,216, 32, 98,231,213,237, 28, 87,171, 21, 90, 4,149,108, 91,149,
-164, 42,167,170, 10,142, 15, 15, 88, 46, 22,220, 59,184,195,233,179,151, 52,163, 49,206, 8,156, 85, 97,164, 53,212, 12, 71,119,
- 40,202,215, 28,222, 57,193,122,195, 71,159, 62, 97,189,170,241, 85,194,104, 10, 69, 85,243,253,179,111, 99,117, 29,191, 47, 47,
-222,254, 2,136,240, 32, 18,253,231,194,196,252, 61,185,177,248,109,132,118,155, 2, 74, 18, 15,199, 14, 59,235, 28,222, 5,212,
-110,107,226,197,216,161, 58,145, 88, 41,144,195, 33,180, 41, 22,207,186,168,152, 76, 70,224, 26,230, 55, 23,136,178,230,240,206,
- 3,172,177, 56, 41,104,234, 10, 15,180,198,145, 38,138,214,182,161,147,104,215, 64,216,131,183, 54,236,247,243, 60,165,172,154,
- 32,216, 65,176,183,119,196,243,235, 27, 42,235, 89,151, 13, 73, 9, 87,203, 50,192, 54,178,132,113,166, 24,164, 58,224, 87,195,
-214, 53,174, 74,194, 84, 66, 73,223,139, 97, 68, 20,231,133, 98,204,115,239,100,136, 32,236,243, 93,228,192, 91,103,113,222,108,
-186, 47,239,240,222, 68,123, 81, 80,222,122,111,227,243,227,122,172,171,144,160,147,104, 28,217, 74,209,235,158,147, 52, 73, 72,
-146, 20,173, 21, 74, 71,229,182,232,216,244, 97,143,235, 44,200,122,137, 3, 26, 20, 75, 47,240,164, 72,227, 72,156, 65,214, 37,
- 42, 90,148,146, 52, 39,145, 13,179,125, 73,122,178, 23,145,169, 32,213, 61, 90,115,140,107, 45,174,109,240,141,192, 9, 69, 93,
-121, 90,239, 17, 54,160,113,133, 22, 52,182, 6, 74, 18,173,208, 62,199,123,221,123,168,119,138,122, 73,191,103, 23, 66, 5, 90,
- 91, 28,183, 6, 86,178,227,244,250,138,102,152, 80,181, 53,199, 22,206, 95,189,198,198,174, 90, 39, 58,144,208, 70, 99,180,210,
-177, 75, 12,151,104, 85, 86, 44,174,111,184,127,247,132,182,108, 40, 43,203, 87, 63,156,114,113, 83,241,217,227, 41, 15, 14, 71,
-164,121,138, 74, 37, 50, 6,180,120,182,216,239, 91,150,219,141, 55, 61,218,151,162, 75,100,251,236,184,109, 95,186,221, 76, 72,
- 69, 4,196, 16, 62,159,143,135,122, 28,151,247, 21,244, 54,106,214,198,247, 59,136,232,174,222, 93,209,243,230,183,153,160,194,
-133, 0, 26, 66,193, 25,156, 6,146, 44, 77, 55,184,100,224,248,248,152,201,120,194,243, 23,175,248,241,217,115,174,234,132,189,
- 7,191, 70,249,132,213,106,201,195,251,119,121,121,250,138, 23, 47,126,230,238,241, 33,175, 78, 95,133,108,240,241,136,214, 58,
- 94,159, 95, 48, 26,206,152,238,221,229,230,250, 25,175,207, 23,220, 57, 74,241, 62,140,224, 93,219, 6, 20,177, 78,194,100, 66,
- 8,124,235,240,198,198, 72, 91,141,183, 45,222,134,223, 15,219, 26, 94,189,120,201,193,225, 1, 23,101,137,101,218, 23, 69,206,
- 5,177,221,243, 87,175,153,175, 87,120, 21, 38, 53,195,225,128,170, 44, 25, 13, 6, 28,236,207,112,198,160,113, 8,103,112,222,
- 96,188,195,122,112, 62,197,120,207,179,103, 63,243,167,111,126,230,240,163,207,112, 72,156,144, 84,198, 50, 30, 12,152, 74,141,
- 78,146,216,180,108,203,133, 67, 36,235,239, 63,255, 3,191,253,251,191,231,233,199,159,240,167,127,253,103,152,132,159,213,124,
-177,226,252,236,130, 71,119,199,187, 23,130,216,118,103,177,181, 23,183, 59, 35,116,209, 77,112,252,230, 57,232,166, 52,221,159,
-157,117, 49,193,210, 97,157,141, 54, 54,215,167, 95,190,237, 50,239,223,196,230,255,181,247,219, 8, 81,113,107,111,252,230,212,
-222,111,117,120,219,250,247, 55,162, 78,125, 64,223,201,237, 76,225, 91, 31,243, 93, 2,188,157, 34, 65, 8, 92, 63, 6,143,196,
- 39,215,133,109,244, 31,181, 55,246,203,173, 69,113,223,144,118,163,227,248, 11,189,179,199,232,188,102, 62,170,127,125,176, 13,
- 56,100,200,172,246,193,143, 42, 98,116,159,187, 29, 2, 19,171,230,136,240,221,161,226,117,163,153, 78,152, 38, 17, 17, 90, 96,
-209, 66, 96, 99,182,179,151, 18,153,104,218,170,160, 92,173,240, 6, 84, 54, 96, 93, 87, 60,202,135,204, 87, 43,134,105,194,157,
-195,125,188, 82,124,244,201,175,201, 71, 3,158,124,244,119, 12, 7, 35, 38,179,187,220,220,120,178,116,192,183,223,125, 73, 81,
-173,152, 30,222,225,186,146, 72,165, 73, 7, 73, 88,211,181,126, 39,200,226,109, 21, 74,119, 41,123, 39,227,229, 19,121,229, 90,
-198,221,169,136, 62,106,177,197, 62, 8,145,174, 68, 4,172, 36, 4, 86, 56, 39, 67,232,139,216,222, 47, 57,132, 15, 41, 83,131,
-193, 8,161,160,117, 13, 82, 67,109,192, 85, 5, 50,205,104,150, 55, 20, 73,202,104,186, 79, 85,149,193,110, 36, 37,121,158,176,
- 46, 43,154,186,198, 24, 79,146,230,172,203,154,182,105,177, 46, 4,135,212,117,217, 99,187,171, 98,197,222,100, 66, 34,101,216,
- 99,199, 3,188,118, 17, 30, 99,106, 46,215,225,199,175, 54, 56,110,116,196,197, 38, 74,144, 42, 72,164, 32,145,138, 68,202, 40,
- 58, 12,202,131,255,116, 50, 70,197,143, 7,193,255,220,122,139,117, 2,225,117,175, 43,232,126,209,125, 23, 93, 25,133, 69, 29,
-111,223,187,208, 9, 74,233, 16, 42,252,158, 41, 29, 98,114,181,146,164,105, 74,154,102, 33,226, 87, 42,148, 20,225,112, 18, 18,
-231,130, 96, 79,120,143,245, 50, 90,226,170, 16, 32,100, 37,206,107,140,113, 33, 81, 80, 73,180, 81, 40,111,113,190,198,218,150,
- 52,211, 72, 26, 82,175,208, 36, 1, 6, 20,231,196, 6,131, 21, 22,164, 11,108,245, 54,184, 31,140, 15,107, 11, 37, 99,138,157,
-143, 59,243, 62, 17, 15,140, 13, 0, 24, 29, 35, 75, 59, 90,130,142, 33, 41,198,122, 26,227, 88, 87, 13,151,101,201,124, 85, 32,
-135, 67,180, 74,162,143, 89, 49,222,155,177, 92,174,163,226, 95,209,180,134,166,109, 25,140,198,212,109,131,175, 29,147,189, 41,
- 66, 75,234,186,225,206,201, 93,206, 47,175, 24,207, 14, 40,141,227,219,179,138,203,210,242, 87,143, 79,152, 8,144,202, 5, 62,
- 59, 46, 70, 68,235, 45, 75, 42,125, 20,102, 47,156, 19,190, 91,137,199, 2,192,111,124,206, 91,183,130, 23,187,205,132,239,246,
-224,116,152,225,221, 24, 99,188, 11,235,139, 40, 34, 12, 77,182,219,156, 87, 91,172, 14,239, 58,156,236, 38,174,213, 69,214,133,
-212, 58,128, 75, 92, 92, 11,233, 36,132,218,160, 17,110,133,118, 53, 90,194,209,157,123,124,115, 90, 51, 62, 60, 98, 56,154,208,
- 24,139, 78, 19,170,166,225,232,232,152,249,245, 53,119,142,142,130,166, 79, 10,174,174,230, 76,166, 51,170,170, 70, 39, 18,148,
- 37,205, 39,252,235,191,127,199,239,126,247,183,228,153, 35,145, 30,169,116,127,174, 58,103,195,121,166, 36,206,152, 16, 63, 28,
-163,102, 49, 53,184,146,245,186,226,114,225,121,250,233,223,241,252, 15,127, 8, 49,162,198,161,132, 32, 27, 12,144,105,202,213,
-197, 57, 66,133,241,125, 85, 55, 36, 2,172,169,248,232,193, 9,218, 6,168,143,151, 32, 48, 56,211, 68, 43,170,199, 91,131, 18,
-154, 31, 95, 94, 97,213, 40,196,202, 42, 29, 92, 64, 77,129,222,159,112,113,117,202,205, 98, 78,174, 4,141,245, 88, 17, 0,174,
-194,133, 2,252,252,234,154, 31,158,189,224,183,255,237, 31,249,252,159,255, 55,131,209,136,225, 48,167, 44, 75,138,162,194,203,
- 67,132,168, 99,213, 70, 95,232, 7, 12,114,247, 99,140, 23,177,117,145,123,224,226, 3, 20,138,187, 96, 31,234,154,199,112,198,
-110,132,113, 49, 47,195,211, 7,101,185, 91,157,250, 91,167,194, 91,119,169,222, 30, 31,221, 6,144,236,198,165,190,125, 92,251,
- 78,159,122, 47, 22,136,106, 65, 41,222,184,208,183,133,109,239, 26,225,187, 45,129,217, 54,101, 78,110,137, 28,250,113,178, 8,
- 29, 98,247,142, 91, 8,144,254, 79, 59,123,245,126, 26,176, 29,133, 71, 15, 9,233, 42,186,109,212,235, 46, 60, 96, 3,116,121,
-171, 27, 96,187, 11,192,199,113, 13,253,232, 70,197,213, 68,162,147,240, 3,173, 91,134,249,132,100, 50,129,100,200,104, 60,102,
- 58, 25,147, 13, 7,204,246,247,184, 60, 59, 99,152,103,220, 20, 75,218,243, 20,127,182, 64,103, 11,134,131, 17, 45,130,123,143,
- 30, 81,123,199,143,167,103,124,247,226,146, 23,207,159, 51,202, 83,108, 71, 50,243,219,131,248,183,241, 18,194,251,109,247,160,
-121,143,242, 2,235, 29,214, 73,148, 10,151,159, 86,162, 47, 82,136, 63,227,110,231, 39, 69, 60,156,148,192, 74,129,243,114, 3,
-247, 17, 18, 97, 3,165,172,105,107, 50,169, 16, 50,163, 53, 13,169,151, 24,235, 16, 85,133,210, 9,166, 92, 83, 74,133,206, 71,
-120, 47,153,207,231, 36, 73, 74, 91,215, 28, 29, 30,240,226,244,140,182, 46, 73,132, 96, 81, 22,232, 36,197, 52, 53, 74, 72,140,
- 51, 36, 82, 35,188, 96, 60,200, 25, 15, 50,138,170,236,213,201, 34,166,183,201, 29, 42,160,136, 86,118, 79,107,160,197, 81,198,
- 87, 68, 9,129,242, 54,136,201,226, 75,165,164,103,144,228, 1, 68,227, 84, 28,177,182,113, 32, 34,241,214, 99,108, 19,148,230,
- 59,207,120, 24,251,123, 97,131,127,221,171,254, 98,113,222, 96, 76,131,140, 84, 52, 45, 53, 90,167, 36, 93, 26,160, 78,194,234,
- 70, 8,116,236,208,132, 4,175, 85,220,211, 59, 26, 15,141,115,216,166,196,183, 14,107, 36, 94,232,160, 52, 23, 30,161, 12,169,
-206, 72,108, 66, 98,147,200, 29, 8, 69,152,183, 81,216, 40,227,239,144, 80,120,229,176, 54, 52,134,218,233, 48, 61,113,129, 4,
-230, 84,152,104, 56, 7,202, 7, 85, 54, 50,142,162,241,125,170, 93,168,120,219, 48,150,118, 33, 32,167,117,146, 85,221,114,185,
- 88,115, 83, 86,228,249, 8,173, 83,198,227, 49,121,158, 7, 63, 48,208, 70,240,207,104, 56, 10,147,152,225,128,203,171, 75, 30,
- 60,120,136,117,150, 85,177, 2, 9,198, 56, 70,227, 9, 15, 7, 15, 67, 76,102, 89, 82, 25,195,245, 10,116, 50,224,233,189, 61,
-246,180, 10, 46,137, 36, 64, 67,136,132,175,238,128,246,110, 51,177, 19, 91, 97,232,242,125, 33, 87,126,119,197,215,189,223,221,
-178,209,245,218, 32,231, 17,214, 69,245,122,156,106,225,251,120, 74,239,216,106, 90,182, 2,152,226, 25,231, 35, 68,199,119,205,
-186, 16, 36, 34, 6,216, 8, 1, 82,163, 51,137,198, 96,188,193,225,248,249,245, 37,201,228,152,195,187,143, 48,166,101, 60, 72,
- 88,175,215,193,125, 33, 36,101, 21, 38, 97,135, 71,199,204,151, 75,214,235,130,217,108,143, 52, 75, 64, 88,170,122, 73, 54, 24,
-176, 88,102,156,190, 94,243,209, 71, 19, 28, 5, 74,201, 30,153,221,227,238,149,138,186,156,216,202, 8,129,240, 6, 91, 21, 92,
- 94,206, 25,239,159, 48,189,255, 49,230,247,191, 15,130, 74, 2,245, 49, 75, 83,172,247, 20, 77, 69, 83, 53, 12,135, 25,185, 86,
-184,166,226,254,157, 3, 6,137,198,182, 13, 65, 70, 27,146, 17,133, 13,197,181,181,150,170, 53, 44, 87, 37,231, 55, 5, 39,143,
-127,205,122,177, 38, 63, 60, 36, 4,175, 58,138,186,165, 50,130,182,110, 56, 24, 15,185, 92, 21, 88,215,177,247,195,143,218,120,
-193,191,252,251,231,252,205,175,126,197,131, 71, 15,177, 66,132,100, 73,211,176, 90, 23, 81, 51,179,157, 81, 34, 98,140,238,174,
-181,217, 89, 27, 59,239,192,115,247,206, 5, 54,129,219,140,215,183, 21,239,125,135,110,108, 79,143, 51,221,191,119,191,220,206,
- 22, 59,117,255, 94,219,218,135,130, 88,222,166, 60,247,209, 30,196, 22, 56,198,251,219, 29,191,127,167,199,253,151,236,166,223,
- 53,174,239,152,243,183, 91, 81,225,119, 29,232,111, 13, 94,121, 75,126,248,135,119,229,187,182,132,183,125,253,226,214, 40,178,
-183, 66,196, 0,148, 4,129, 78, 51,146,209,148, 44, 27,130, 74,193, 11,202,117,193, 15, 47,126,102,111,127,159, 69, 93, 5,196,
-232, 32, 67,143,199, 20,235, 53, 63, 93, 92,114, 61,191,225,242,122,193,229,249, 5, 90, 65, 85, 44, 56,191,153,211, 10, 73,227,
- 4,222, 90,158, 62,188,207,193,116,220,135,113,250, 15,112,112,195,247, 19, 5, 99,182,123,240, 4,214, 10,148, 52,104,165,112,
- 58,172, 15,116,244,245,122,191, 97,197,135, 51,103, 3, 16,234,169,125, 17,216, 35,226, 5, 89,172, 87,168, 44, 97, 52,206, 33,
- 9,123,105,178, 33,109, 83, 69,139,148,199, 53, 21, 78,138,176,215,138, 99,179,253,233,148,117,177, 98, 50, 72,105,141, 99, 93,
-148,172,151,215,100,249, 40,178,191, 85,200, 37,182, 45, 66,104,134,131,140,167, 79, 30,241,249, 23, 95,246, 19, 29, 33,192,198,
-226, 80,197, 61,148,218, 98,252,203, 32, 60, 14,172,250,152,114, 38, 58, 81,148,240,161, 72, 18,158,225,104,208, 79, 52,140, 49,
-155,196, 59, 65, 64,117,182,237, 86,114,150,232, 93, 15, 74,235,168,150, 22, 8,169,163,144, 44, 92,172, 82, 6,177,162,214, 9,
- 90,105, 18,157,144,232, 4,173,117,124, 83,253, 72,222,198, 36, 61, 29, 87, 42,253, 68,192, 89,156, 53,180,141,195,152,144, 21,
-222, 90,131,245, 45, 82,213, 56,149, 98,146,140, 70,102,148, 74,145,103,121,128,149,100,158, 84, 91,146, 52,137, 62,115,133,194,
-225,164,194,235, 12,188, 64,182, 45,109, 27, 62, 79, 39, 28,148, 82,208, 8, 19,199,173, 65,244,212, 37,254, 89, 7,202,121,116,
- 18, 52, 36,141,245,212,222,177,108, 28, 23,139,146,103,167, 87,100,227, 61,172, 23,140, 38, 19,234,186, 9,221,139, 49,104, 29,
-114,189,165,144, 44,151,203,222, 79, 62,157,206,168,235,154,182,109,153,238, 79, 25, 14,198,220,212, 55, 44,151, 75, 14, 15,143,
-112,206, 83, 22, 37, 39, 39, 83,180,146, 60,123,117,201,235,243, 75, 30,221, 63,228,227, 39, 39,100, 64,146, 4,225,166,247, 54,
- 90,205, 84,116, 36,116, 35,250, 93,157,141, 82,234, 23,179, 50,188,140,226,210,109,162,156, 16, 97, 28, 31,117, 56, 98,135, 26,
-231,223, 0, 64,117,105, 98,157, 38,201,197, 17,174,236, 53, 1, 27, 52,170, 80, 93,100, 72,240, 70,106, 9, 36, 41,173, 28,112,
-181,110, 89,154, 20,135,100, 62,191,161,174,107, 70,163, 17,214, 90,150,203, 37,247,238,221, 99, 49,159,243,234,213, 43,158, 60,
-121,194,124,177,192,123,207,245,245,117, 72, 93, 43, 10,238,220, 57,166, 42, 13,195,225,148,203,171, 53,147,137,228,232, 48, 69,
-138,224, 51,199,111,105, 39, 60, 32, 66,245, 47,189, 0,211,224, 45,212,141,229,122,177,228,232,248,136,215,243,171, 48, 1, 49,
-150,170,174, 73, 7, 41, 69, 81,160, 7, 37,139,197,146,233,100,204, 48,203, 48, 85,193,193,254, 30,163,193, 96, 3,232,145, 58,
-156, 97, 86,128,149,224, 4,222,107, 46, 22,107,254,244,205, 15,236, 29, 28, 51, 28,142, 56, 60, 56, 36, 77,115,148,240,164, 73,
-138,244,130,139,179,115,134, 89,198,127,254,205,175,248,253, 87,223,114,186, 88, 99,253, 86,216,148,135,103, 47,158,179, 40,214,
-252,230,179,207,248,241,155,175, 88, 23, 5, 77,211,112,113,113, 25,184,242,183,226,169,251, 6,212,237, 70, 80,119, 23,186, 53,
-129, 55,225,227,212,214,217,205,174,220,185, 16,199,109,141,161,109, 91,218, 72,145, 51,214,246, 73,152,239, 8,149,190,117, 87,
-109,218, 88,253, 33, 96,204,219,118, 71,155,110,188, 63,194,241, 59,157,243, 38,218,113,219,235,221,113, 31,186, 11,227,189,152,
-217, 63,211,155,222, 95,168, 78,188, 49, 98,239,230,254,127,206,165,254,198,238,226, 29, 47,232,109, 29,221,219,191,151,141,162,
-118, 91, 53,217,237, 26,149, 18, 24, 37,105, 16,248, 52,231,193,147,143,184, 46,106,214,203,146,159,207,207,249,227,183,223,176,
- 90, 46, 88, 45,230,148,101, 17,148,202,214,177, 55, 25, 81, 85, 53,101,107,153,142,198, 28,239, 79,208, 89,134, 72, 20,121, 62,
-162, 89, 87, 56,107,169,234, 10, 41, 39, 65,212, 18,181, 64,126, 75,141,251,198,234, 99, 75, 56, 24,183, 29,225,253, 54, 92, 32,
- 97, 84, 20,242,146,141,243,113, 84,173,250, 52, 73,181,245, 58,116, 10,121, 29, 45, 64, 46,124,195,164,194, 97,109, 19,213,187,
-138,253,217, 4,103, 91,202,216,177,180, 85, 9,222,224, 90, 71,109, 26,176, 6, 45,114,234,166,198,122,199,226,230,134,217,254,
- 1,169, 20,180,165,229,206,193,140, 87,103,151, 28, 29, 29,225,240,212,109, 69,219, 88,154,198,227,165,100,111, 56, 96,150,165,
-172,171, 58,216,153,122,225, 74,120, 51,132,108,116, 29, 15,115,189, 85, 12, 42,235,123,100,174,117, 93, 87,226,201,114,205,104,
-152,199,177,142,192,218,184, 31, 99, 35,136,243, 4,225, 80, 63,150,139,110, 14, 41, 33, 17, 73, 0, 90, 8,221, 11,141,132, 82,
- 64,210,115,247,149,212, 81,164,167,118, 46,116,173, 59, 5,174,194, 73,143, 49, 46,136,247,180, 68,182,209,148,232, 67, 29,104,
-234,160,236,111,113, 72, 21,244,201,165,107, 81, 73, 75,150, 91,188, 36, 16,251,202, 1,123,147, 17,195, 65,206, 72, 8, 68,119,
-177, 11, 21,133, 79, 1,235,217,217,150,164, 76,104, 90, 3,214, 0,170,239, 54, 60, 6, 47, 20, 78,132, 85,130,212, 30,229, 2,
-189,203, 90,168,173, 99,101, 44,175,174,214, 44, 74,135, 17, 41,139,139, 75, 30, 63,121,130,144, 10, 99, 12, 82, 74,140, 49, 52,
- 77,195,112, 56,164, 40, 75,246,102,123,140,199, 99, 94,159,159,145,231,195,254,239,172,150, 5,147,241,140,225,112, 72,221, 52,
- 92, 94, 93, 50,157,132,248,206,233,116,140,243,240,227,179,107,148, 82, 92, 44, 95, 50, 47, 26,126,243,241, 3,166, 35, 77,166,
-187,192, 29, 25,215, 8, 81,108,134,220, 4,247,136,110,106,248,238,243, 80, 68,129,155,235,222,215,117,112,241,121,216, 30,163,
-211,175,191,194,104,192,111,249,145,118, 0, 57,125,162, 99,164,221, 69, 90, 29, 66, 32,124, 64,203, 74,165, 17, 46, 92, 30, 66,
- 73,108,208,243, 35,172,199, 24, 88, 84,130, 87,215, 13, 87,107,152,237, 77, 98,112,139,160,109, 42, 4, 97, 7,191, 94,173,152,
- 78, 38,188,122,245,138, 97,204,161, 48,214,161,117,184, 60, 7,131, 1,203,197,146,225,104,194,108,118,192,106,117,195,151, 95,
- 62,231,191,254,246,215, 12,210, 48,153,147,189, 10,208,245, 92,251,141, 10,205, 97, 26,203,205, 77, 73,209, 88, 10, 87, 96, 92,
- 84,235, 91, 71,221,180,216, 84,147,102, 42, 10, 86, 13,166,109, 57,127,189,224,201,189,187, 76, 71, 67,188,179, 84,145, 25,223,
- 56, 75,213,182,225, 59,117, 33, 53, 50, 73,115,190,251,233, 53,167,151, 75,238, 63,189,143, 78, 18,154,186, 70,107, 77, 58, 28,
- 32, 77,131,113,150,239,191,254,154,189, 60,227,233,189, 59,156,157, 95,112, 62, 95, 5,145,175,146,241,103, 15,139, 98,197,255,
-249,242, 43,254,230, 87, 79,249,238,235,175,185,186,158,227,157,225,112,111,188,147,133,238,183, 38, 20,221,125,105, 99,202, 90,
- 72, 88,107, 49,109, 27, 8,128,113, 60, 79,252, 59,206,110,186,116, 99, 44, 77,221,208, 52, 45,117,211,246, 43, 38, 99,108, 88,
- 95, 58,222,107,239,190, 45,148,251,191, 3, 0, 97,118, 36, 17, 24,195, 73,139, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
- 0};
-
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82,
+ 0, 0, 1,245, 0, 0, 1, 26, 8, 6, 0, 0, 0, 8, 90,206, 70, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,116,111,115,104,
+111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222,244, 66, 75,136,
+128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, 69, 69, 4, 27,
+200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,163,136,138,202,251,225,123,163,107,214,188,
+247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,224,131,199,196,
+198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,190, 0, 1,120,
+211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, 20, 0, 64,122,
+142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,230,211, 0,128,
+157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, 0, 88, 48, 0,
+ 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, 81,136,133, 41,
+ 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,178, 60,185, 36,
+ 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, 25, 50,129, 52,
+ 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191, 6,255, 34, 98,
+ 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238, 4,104, 94, 11,
+160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,161,144,185,217,217,229,228,228,216, 74,196,
+ 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,190,226, 36,129, 50, 93,129, 71, 4,248,224,
+194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, 42, 20,227, 81,
+ 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0,176,106, 62, 1,
+123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104,131,225,207,119,
+255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,160,129, 42,176,
+ 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, 28,114, 96, 41,
+172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,112, 15,250, 97,
+ 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,193, 72, 4, 18,
+139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,186,145, 59,200,
+ 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116, 49,154,143, 22,
+160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, 48, 46,198,195,
+ 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18,129, 69,192, 9,
+ 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,194, 39, 34,147,
+168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, 36, 18,137, 67,
+ 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,100,107,178, 7,
+ 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, 40, 82,202,106,
+ 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182, 82,175, 81,135,
+168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,105,175,232,116,186, 17,221,149, 30, 78,151,
+208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,119, 24,175,152,
+ 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,149, 74,149, 38,
+149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,169, 9,212,150,
+171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195, 76,195, 79, 67,
+164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,129, 53,196, 38,177,205,217,124,118, 42,187,
+152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63, 7,227,152,113,248,156,116, 78, 9,231, 40,
+167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,150,151,150, 88,171, 72,171, 81,171, 71,235,
+189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,217, 83,221,167,
+ 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,152,158,190, 94,128,158, 76,111,167,222,121,
+189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,113,111, 60, 29,
+ 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,163,213, 70,141, 70, 15,140,105,198, 92,227,
+ 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,199,205,204,205,
+162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120, 90, 44,182,168,182,184,101, 73,178,228, 90,
+166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,214,187,173,187,167, 17,167,185, 78,147, 78,
+171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,182,125, 97,103, 98, 23,103,183,197,174,195,
+238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,154,206,156,238,
+ 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23,103,185,115,131,
+243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,113, 93,225,122,210,245,157,155,179,155,194,
+237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209, 63, 11,159,149,
+ 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,183,165,119,170,247, 97,239, 23, 62,246, 62,
+114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,111,158, 95,133,223, 67,127, 35,255,100,255,
+122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,191,142, 63, 58,219,101,246,178,217,237, 65,
+140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,231,152,206,145,206,105, 14,133, 80,126,232,
+214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209,220, 67,115,223,
+ 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, 46,102, 89,204,
+213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,226,157,226, 11,227,123, 23,152, 47,200, 93,
+112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, 37,242, 19,119,
+ 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,188, 53,121, 36,
+197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,131,146,145,144,
+113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,110,139,183, 47, 30,149, 7,201,107,179,144,172,
+ 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,137,202, 57,150,171,158, 43,205,237,204,179,
+202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, 60,113,121,219,
+ 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,174,126,189, 38,122, 77,107,129, 94,193,202,
+130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, 62, 21,137,138,
+174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,169,171,196,185,100,207,102,210,102,233,230,
+222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,245,246, 69,219, 47,151,205, 40,219,187,131,
+182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97,215,248,110,209,
+238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251,179,247, 63,174,
+137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210, 61, 84, 82,143,
+214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226, 35,112, 68,121,228,233,247, 9,223,247, 30,
+ 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98, 91,186, 79,204,
+ 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,218,233,130,211,147,103,242,207,140,157,149,
+157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,116,225,210, 69,255,139,231, 59,188, 59,206,
+ 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,254,147,211, 79,199,187,156,187,154,174,185,
+ 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,255,214,213,158, 57, 61,221,189,243,122,111,
+247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217, 67,221,135,213,
+ 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5,143,153,143,203,
+134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,158, 23,254,162,254,203,174, 23, 22, 47,126,
+248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,235, 25,175,219,198,194,198, 30,190,201,120, 51,
+ 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,255,104,249,177,245, 83,208,167,251,147, 25,
+147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 6, 98, 75, 71, 68, 0,255, 0,255, 0,255,160,189,167,147, 0, 0,
+ 0, 9,112, 72, 89,115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0,154,156, 24, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 12, 29, 18,
+ 47, 19,145,242,249, 7, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236,189,121,184, 93,215, 85, 39,248, 91,251,156,123,239, 27, 52,
+203,146, 28,199,142,109,217,113, 70, 98,140,156, 64,101, 66, 16,185,168, 64, 65, 51,201,124,161, 33, 52,147,220,208, 83,168,238,
+216,174, 46,250,131,250,138, 4, 75, 69,117,160, 26, 82,109, 21, 20, 31, 5, 52, 84, 68, 24, 58,253, 1,193, 10, 56, 36, 6, 2,
+113, 37,129,224,140, 86, 28, 39,158, 36,107,126,195,189,247,156,179, 86,255,177,215,222,123,237,115,239,147,158,100, 13, 86,114,
+ 86,190, 23,201, 79,239,157,123,134,125,246, 90,235,183,126,235,183,128,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,
+179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206,
+ 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,187, 36, 86, 92,226,207, 35,253,154, 1,176,
+221, 57,108, 17,193, 18,128, 74,191,223, 89,103,157,117,214, 89,103,157, 93, 1, 70, 0,156,115,116,243,191,218,125,235,239,126,
+252, 23,190,243,240, 39,127,241,187,142,190,243, 7,190,238,143,250,165,219, 97,126,166,179,206, 58,235,172,179,206, 58,123,158,
+103,234, 4,160,255,147,111,126,201, 59,126,225,123, 95,250,214,109,213,242,252,150,117,243,179,111,248,250, 23,191,228,245, 47,
+221,178,235,195,159,122,250,233,227, 11,227,207, 2,144,206,185,119,214, 89,103,157,117,214,217,243,219,169, 59, 0,115,223,120,
+195,236,247,252,211,173,245, 43,151,143, 28, 67,117,252, 40,234,229, 17,110,185,229,250,141,223,251,250,155,190,253, 51, 79, 28,
+ 47, 62,247,228,169, 79, 0, 88,238, 28,123,103,157,117,214, 89,103,157, 61,191, 51,245,193, 71, 30, 59,245,244,230,245,253, 87,
+189,238,166,117, 87, 75, 45,104, 78,159, 66,125,250, 52, 54,110,221, 90,190,229, 77, 47,255,198,134,235, 23,127,248,145,167, 63,
+ 6,224,104,231,216, 59,235,172,179,206, 58,235,236,249,233,212, 1,128, 68,112,250,143, 31, 57,249,241,103,150,155,205,119,188,
+108,195, 45, 51, 69,137,106,121, 25,205,137, 99,192, 96, 14,119,188,238,229, 47,123,213,245,235,119,126,240,147, 79, 62,182, 48,
+172, 15,117,143,168,179,206, 58,235,172,179,206, 86,159, 61, 95,234,207,155, 1,176, 30,192,181,175,191,121,237, 15,253,214, 91,
+182,255,216,245,179,229,204,210, 82, 5, 20, 5,220, 53, 55, 96,230,186,235,240,232,147, 71, 79,221,245,203, 15,254,252, 7, 62,
+254,196,187, 1,156,214,223,151,231,243,205, 20,145, 29, 0, 54,234,127, 30, 34,162,175,232,160,228,171,237,122, 59,235,172,179,
+206, 58,167, 62,221, 28,128,117, 0,182, 93,189,174,252,142,255,242, 67, 55,253,139,215, 95, 61,127,245,112,185, 1,192,160,109,
+215, 98,246, 69, 55, 98, 44,140,255,237,215, 31,250,207,255,215, 31,253,195, 79, 3,248,146,158,239,115,118,236, 34,178, 29,192,
+246, 85,254,248,113, 34,122,120,149,199,125, 0,192, 46,253,207,123,137,104,239, 87,184, 83,255,138,184, 94, 13, 78,118,105,128,
+178,195,252,211,195, 0, 14, 1, 56, 64, 68,199, 47,192,231,180,143,143, 11,189, 6, 39, 62,115,223,206,115, 91,235,119, 63,248,
+ 48, 58,235,172,179, 43,214,202,231,224,148, 25,192,218,205,107,122, 95,179,121,190,220,204, 66,148, 69, 10, 4, 16, 17, 73,248,
+ 14,133,239,199,127, 45, 1,204, 85,141, 44,255,212, 31, 31,254,211, 95,252,206,235,190,243,181, 91,231, 55,140, 43, 1,142, 31,
+197,112,110, 13,122,155,183,225,223,223,181,243,173, 59,110,222,246,146,183,221,255,151,111, 63,177, 48,254,240, 5,114,236,187,
+ 1,220,119, 14,155, 49, 0, 28, 0,112,144,136,246,119,203,230, 43, 6,101,216,173, 95, 43, 57,189, 16,176,220, 47, 34,251, 53,
+112,121, 46,206,125, 7,128, 7,206,227,247, 14, 2,184,227,146,172,245,125, 59,211, 90,191,251,193, 75,182,214,101,223,206, 28,
+245,185,251,193, 14,245,233,172,179, 75,228,212, 9, 0,205, 15,138, 29, 63,247,230,235,223,249,150, 91,183,238, 92, 63,219,235,
+ 51, 57,239,176,157,243, 95, 68,160,178,200,254, 27,206,129,138, 34,253, 55,249,127, 99,144, 84, 66, 92,151, 37,156, 57, 78,221,
+ 84,224,101,194, 15,221,241,202,175,191,237,230, 45,239,253,209,119, 29,252,153,143,126,246,200,175, 3, 24,225,210, 67,241,187,
+ 1,236, 22,145,221, 0,238,188, 16,153, 91,103,151,213, 62,122,142, 63,191, 7,192, 46, 17,185,243,124,179,230, 43,200,252, 90,
+223,183,211,175,245,187, 31,188, 20,107,253, 62, 19, 68,221, 11, 96,111,183, 68, 59,235,236,210,101,234, 91,246,125,251,141,239,
+250,201,215,190,240, 13,227, 37,134, 48,161,112,228, 19,120, 33,255, 5, 7, 98,242,174, 87, 0, 56,242,185, 61, 11, 80, 0, 68,
+228,243,125, 1, 10, 34, 42, 29, 21,154, 17,123,167, 46, 0, 68,192, 68, 24, 45,141,241,170,235,183,110,121,224,157,223,253,203,
+ 63,249,238,191,120,241,239,252,249,103,127, 30,192,145, 11,148,181,135, 76, 8,103,201,214,236,127, 63, 32, 34,119,116,142,253,
+ 43,198, 30,214,236,244, 97, 34, 58,168,153,252, 70,125,214,123,204, 26,216, 14,224, 61, 34,114,251, 5,122,246,251,225,225,253,
+179,217,133, 92,103,231,190,214,247,237,188,227, 18, 57,246,206, 58,235,236,114,100,234,131,158,219,254,207, 95,182,241,213,178,
+ 88,161, 26,142, 0,102,239,164, 35,178, 30,242,121, 74,126,183,112,112,155,183,170,115,103,144, 3,192,138,226, 19, 16, 61,188,
+ 99,239,248,157, 3, 26,120,126, 62, 1,227, 81,133,245,253,190,251,127,238,254,214,159,122,245, 75,174,254,154,127,249,171, 15,
+221, 61,170,154,143, 95, 8,199, 78, 68,103,132, 54, 53, 59,191, 15, 9,166,221,161,155,125,151, 77, 92,217,182, 31,192,254,105,
+153,183, 58,237, 3, 0, 14,136,200,253,250,188,131, 99,191, 80,207,254, 64, 8, 34, 46,149,209,221, 15,158,121,173,251,236,188,
+ 91,235,157,117,118,133,154, 59,143,223, 41,198, 21, 31,253,221,191, 63,242, 17,114, 35,204,247, 27,204,207, 2,115, 51,162, 95,
+156,254, 62, 96,204,184, 49,208, 84,160,193,156,119,242,204, 0, 51, 98, 86, 14, 0, 24, 3, 60, 4,120, 25,144, 33,128,145,255,
+111, 25,235,207, 11, 68, 24, 85,195,168, 71, 13,126,234,123, 94,189,235,129,125,223,243,135, 55,108, 91,247,221,234,246,221,197,
+188, 73, 68,116, 0,190,166,105,179,149,221,221,242,185,162,237, 14, 34,186,107, 53, 80, 58, 17,221,213,202,168,239,249, 74,189,
+ 41,116,247,131,221, 90,239,172,179,175,178, 76, 29, 2, 28,189,231,143, 30,251,153, 63,254,228,179,223,253,178,171,103,175, 39,
+192,177, 8,235,182, 0, 22,239,178,151,198,236,110,123,209,218,151,255,248, 27,111,222, 62, 83,206, 56,102, 6,138,194,231,214,
+204,144,241, 2,168, 32,184,235,110,133,219,114, 51,104,221,213,160,153,117, 64, 61, 2, 47, 30,129,156,126, 10,124,228,179, 64,
+189, 12,208, 44, 4, 13, 26, 1,120, 97,140, 55,188,242, 69, 47,122,255,190,239,249,181,127,118,239,239, 23, 95,120,234,228,123,
+145,200,123, 23,203,177, 31, 18,145, 3, 38, 99,219,113, 33,142, 59,133, 17,253,240, 5, 98, 90, 91,214,243,121,181,155, 93,136,
+ 99, 92,138,235,109,157,231,170,142,119, 30, 25,242,126, 36,194,217, 70, 17,217,241,149, 90, 91,167,187, 31, 60, 36,251,118,158,
+215, 90,151,125, 59, 39,159,239, 37,128,238, 91, 68,187, 75,246,185,157,117,246,149,224,212, 27, 0,139, 0, 62,245,193, 71, 23,
+222,245,193, 71, 23,102, 49, 93,196,102,243,155, 95,181,245, 71,191,251,246, 27, 95, 48,231,250,174,102,241,208,251,112, 8, 25,
+ 45, 2,205, 34,138, 91,222,128,242,246,239, 71,113,227, 55,172, 8, 33,200,177,199, 80, 63,250, 1, 52, 95,124, 8, 84,244, 1,
+ 17, 8, 1,227,165, 49,110,185,102,243,250, 63,252,215,255,205,175,188,233,237,239, 57,246,236,201,225,159,227,194,213,216, 87,
+178, 11,194,200, 85,199,182, 71, 51,160, 29, 83,254,253, 16, 18, 52,124,124,133, 99,220,103,126,247, 0, 17,237, 55,199,221,131,
+ 22,163, 91,143,185,119, 53,236,125, 17,217,163,217,232,246,115, 61,175,139,113,189,103,184,214,123,244,184,118, 51,127, 46, 76,
+241, 51, 89,219,129,111,252, 10,223, 27, 86,189,214,213,145,175,252,124,247,237, 76,207,183,229,104,101,223,206, 7,166, 4, 14,
+123,100,223,206, 93, 43,124,220,189,122,110,187,244,107,199, 74, 65,199,153, 62,183,179,206, 58,167,158,140, 1, 12, 1,212,240,
+162, 48, 90,245,142, 61,239, 66,132,151,239,253,222, 91,126,246,237, 59,111,216,217,140,129,113,211, 64,170, 17,100,184, 4,212,
+ 35,160, 20, 12,190,245, 95,162,188,253, 45,103,207, 26, 54,221,128,222,166, 31,133,187,250, 85,168,255,238, 87, 1,215,120,151,
+ 79,132,241, 82,133, 87,189,248, 5, 87,189,235, 39,118,238,251,193,251,254,244,187, 1, 60,126,145,157,186,221,200,207,107,147,
+ 16,145, 93, 0,222,115, 22,167,176, 93,179,194, 61,103, 96, 91,135,222,106, 0, 56,168, 45, 90,247,159, 33,171,218, 14,223,154,
+181, 67,225,228,149,156,239,253, 88, 25,110, 13,231,181, 91, 68,238,184,132,215, 59,237, 90, 31,248, 42,112,172,151,211, 86,181,
+214,213,249,174,254,249,238,219,121,103,171, 23,126,215, 10, 63,191,253, 12,231,181, 7,171,107,211, 11,159,123,143,146,253,186,
+ 30,252,206, 58,167,190,210,187, 12, 63, 3,189, 10,190, 87,255, 44,174,191,106,230,219,239,127,203, 75,247,126,203, 45, 87,189,
+120,180,204,104,154, 10, 24, 45, 3,117, 5,144,128,122,192,224,187,126, 30,197, 43,191, 45, 30,236,212,242, 8,239,255,248, 99,
+120,255, 39, 30,195,177,133,101,244, 10,194,203,174,217,132,239,184,253,102,124,221, 77, 47,240, 7,190,238,213,160,254, 90, 84,
+ 31,254,119, 64,191,244,167,224, 8,245,194, 8, 63,240,166, 87,222,246, 91, 31,248,244,143,190,255,239, 30,123, 7, 46, 82,187,
+155, 58,188,221,173,140,240, 92,143,177, 91, 55,192,118, 6,120,208,108,156, 54,219,217,142,196,180,127,248, 44, 27,240,123,204,
+ 70,120,192,100,150, 59, 90,231,189, 71, 68, 14,173, 32, 20,115,223, 20,135,110,143,181,219,100, 70,239,185, 76,215,187,177,229,
+208,143,155,243,219,126, 17,223,149, 93,103,201,220,159,203,186,186,224,229,151,231,116, 78, 62,243, 62,235, 90, 87, 82,221,185,
+ 63,223,220,193, 30, 52,235,116,163, 65, 9, 86, 66, 10,142, 79, 65, 20, 14,181,206,113,187, 62,175,237,118,205,200,190,157,183,
+119,253,239,157,117, 78,253,236, 22, 32,239,245,111,126,229,166,159,218,127,231, 75,238,190,118,205,236,236,242, 98, 3,105, 70,
+ 64, 53,210, 79, 42, 64,245, 34,122,175,251,177,204,161,255,205,231,158,194,219,127,251, 67, 56,244,236,105,204, 12,122,232,149,
+ 14, 78,128, 79,124,233, 24,126,239,175, 63,141,111,191,253, 38,252, 31,187,223,128,185, 65, 15,110,219, 75, 81,190,242, 78,212,
+ 31,251,117, 96,237, 54, 0,226,139,232, 66,248,215,111,125,237,143,253,217, 71, 31,251, 61, 17,124, 18,190, 68,112,161, 29,250,
+253, 45,167,177,255, 28,143,177, 93,143, 97, 55,163,187,166,212,118,247,182,178,219,240,217,183,159,225,240,247, 24, 7,124, 87,
+219, 41,232,103,191,199,108,174,247,136, 72, 6,117, 43,228,190,167,181, 57,223,217,170,163,219,115,219,117,153,174,247, 30,115,
+188,123,149,196,216,126, 86, 23,195,118, 95, 4,199, 59, 53,195,213,114,196, 1,248,114,196, 37,117, 66,234,208,207,186,214, 85,
+169,110,242,249,222,253,224,228,243,205,179,249,236,249, 6, 54,190,194,240, 97, 77,237,167,187, 31,220,123, 22,116, 96, 47,128,
+ 3,103,202,190,101,223,206,144,209,219,207,189, 3,157,117,214, 57,245,179, 58,244, 27,223,246,205, 47,252, 55,247,189,249,134,
+255,182,228, 18, 75,163, 10,104,198, 64, 83,251, 58, 58, 1,144, 6,116,213,117, 40, 95,243,214,248,203,159,123,250, 56,222,250,
+ 43,239,199,225,229, 26,115,243,179,168,138, 2,189, 94,129,126, 65, 40,164, 15,106,106,188,247, 35,159, 71,225, 28,126,238,251,
+119,250,140,253,230,111, 66,243,153, 63, 5,154, 5,160,156, 5, 8,168,199, 21,110,187,105,235,213,175,121,217,213,223,242,145,
+ 71,158,254, 20,124,137, 96,213,217,186,136,220,115,150, 12,173,237,192,238, 58, 15,162,213,253,173,236,114,197, 94,103, 34, 58,
+168,240,118,200, 72,119,136,200,158,179,212,195, 15, 18,209,157, 43, 28,239,144,136,220,139,164,102, 22,122,176, 15, 76,113,150,
+ 97,131,158,218,135,111,206,237,163,151,241,122, 15,173,116,188,139,145,229,234,250, 56,239,128,238, 44, 8,203, 52,219,174,207,
+227, 30, 17,185,160,242,187,178,111,231,185,175,245, 73, 71, 61,253,249,174, 80,183,166,187, 31, 60, 40,251,118,230,207,119,223,
+206, 61,231,171, 88,119, 38,135,223,250,185,253, 90, 87, 15,235,126,151,236,219,185,189,203,214, 59,235,156,250,202, 14,157, 54,
+205,151,111,122,247,238,155,126,225,251, 94,117,213,173,163, 33, 48,162, 10, 96, 15,181,163,231,226, 79, 74, 53, 70,121,203, 27,
+ 65,107,174,138, 7,184,247,183, 31,194,231,190,124, 18, 88,191, 6, 39, 23,106,128, 26, 20, 4,204, 21,132,171,230, 75,108,156,
+ 45,177,126,253, 26,252,225,223,126, 14, 59, 95,113, 61,118,221,122, 35, 80,148, 40,182,191, 17,245,199,127, 3,180,229, 6, 64,
+ 24, 76,132,254,108, 31,223,183,243, 37,187, 62,242,200,211,255, 9,192, 49,156, 27, 4,191, 90, 25,205,253, 56,143,222, 98,163,
+ 45, 30, 47,253,108,206,135,136, 30, 86,105,210,123,204,134,123,166, 77,240,174,179, 28,239,160,136, 60,140, 28, 10, 13,231,215,
+150, 74,221,123,166,243, 51,231,182,231, 50, 93,239,222, 75, 5, 81,235,181,220,215,202,210, 47,132, 83, 15,186,242, 54,211,180,
+ 26,244,113,109,138,200,246,149,120, 16,231, 97,231,182,214,167, 56,116,101,154,231,207,247, 44, 68, 52,186,251,193,135,101,223,
+206,115, 89,207, 23,196, 52,160,176,235,126, 55,186,158,251,206,190,130,237,124,250,187, 3, 41,110,205, 27,110, 90,251, 47, 30,
+250, 31, 94,241,123,223,247,178, 77,183, 46, 45, 53,104,208,120,135,238, 0, 20, 4, 42, 8, 84, 18,168,112,160,146,224,174,121,
+101, 60,200, 23,158, 57,129, 63,249,248,227,192,220,172,111,115,115, 14, 40, 10, 52,112, 56, 61,106,240,133, 35, 75, 56,116,120,
+ 9,149, 16,184, 40,240,129,127,248, 98, 58,129,171,110,134, 44,159, 2, 80,235,217, 8, 80, 51, 94,122,237,166,155, 0,188, 0,
+ 23,111, 80,205,110,205, 34,207, 21,226,181, 27,224,241,115,112, 10, 7, 91,159,189,162,131, 88, 37, 76,187, 18, 65,105, 87,203,
+193,174,230,252, 14, 92,166,235, 61,116,169,244,247,181,132, 96,181,218,143,159, 45,120, 58,139, 29,135,103,111,223, 68, 68,183,
+ 19,209,157, 68,180,215,124,221, 73, 68,155,244,103,172,147,220,163,129,215,165,180,221,154, 81,111, 60,235,243, 93,125,198,189,
+218,245,124,161,237,192, 42,208,145,206, 58,251,170,204,212, 3,220,126,205,143,124,195,150,159,125,247,183, 95,255,227, 61, 46,
+176, 52,102,160, 16, 64, 24, 36, 0, 49, 65, 10, 82,232,221,255, 10,149,125,184,141, 47,138, 7,122,236,200, 41, 44, 47, 85,192,
+186, 65,138, 19, 66,110,237, 28, 32,130, 19, 11, 21,170,113,141,107,215,151, 56, 61,172,210, 73,172,221, 6,160, 0, 70, 75,160,
+217,181, 16, 8, 80,215,184,113,219,218,173,131,126,113,245,104,220,124,234, 28,175,235,222, 51,252,155, 37,221,108,132, 97,127,
+159, 67,182,184,107, 5,199,138, 85,100,215, 89,214,184, 2,129,108,181,200,193,161, 51, 92,227, 57, 29,171,125,110,151,240,122,
+ 47, 9,131, 89, 3,183,118,205,251,222,231,210,155,174,191,187, 26,177,155,189, 34,114, 16,121,137,227,190,179, 4, 82, 23,111,
+173, 79,202,196,158,223,243,245, 89,115,150,241, 95, 8, 70,186, 34, 7,103, 98,204,239,106,161, 33,157,117,214, 57,245,144,253,
+174,157, 41, 94,251,111,191,237,218,125,119,237,216,242,186,241, 24, 24,246,188,228,171, 52, 2,170, 24,253,190,195,201,166,225,
+ 89, 56,135,178,136, 29,236, 4, 0, 82,199,131,109, 93, 63,135,162,223, 67,195, 80,189,120, 81,167,174,127, 10, 1,133,195,226,
+ 82,133, 47, 14,135, 24,220,106, 78, 85, 26, 64, 42,160, 30, 2,110, 29, 72, 24,194,140, 77,243,189,185,245,115,253,141,135,199,
+203,231,132, 64,172,166,102,169,117,213,123,144,198,115, 62,128, 51,147,215,176,194, 70,178, 93, 71,150,158,143,109, 60, 67, 6,
+248, 92,236,188, 54,105,253,217, 29,151,248,122, 47,186, 83, 87,135,254, 64,235, 58,238,186,148, 19,250,180, 28,113, 47, 18, 92,
+190, 93, 68,118,183,137,129,231,124,220, 85,212,163,181,238,126,166,181,158, 63,223,212,107,126,161,214,243,106, 28,121,104,109,
+187,167,203,190, 59,235,236,220,156,122,128,178,123, 47,221, 54,243,253,191,253,125, 55,238,253,186,173,115, 91,151,199, 12, 12,
+ 74,239,208, 43, 70, 89, 49,250,179, 5,254,213, 7,158,248,196,245, 27,250, 27,126,124,199,150,235,135, 2, 80,200,214,171, 10,
+252,236,231,225,174,123, 53, 0,224,101, 47,220,140,175,127,241, 86,252,213,167,142, 0,101,233,157,184, 83,135, 30,116,225,216,
+255,238,240,216, 34, 94,124,117,122,111,229,212,147,192,232, 20,100,180, 1,164, 19, 99,132, 67, 80, 0,135,139, 0,191,107,246,
+ 4,179,201,174,134,188, 54,109,243, 58,151,249,214,151,195,142, 95,128,159,189,146,174,119, 53, 14,253,222,203, 52,114,215,170,
+216,225, 82,221, 71,186,251,193,189,154, 81,167,181,158, 19,219, 46,235,243,213,204,188,211, 41,232,172,179,243,112,234, 1,110,
+223,122,231,215,110,122,251, 47,125,235,181,255,243,213, 51,189,254, 18, 19,104,206,167,224, 50,102,204,176, 96,216, 7,254,167,
+247,125,241,125,251, 31, 58,252, 7,191,118,231, 13,119,147, 40,242, 94, 40,251,189,116,144,103, 62, 25, 15,236, 28,225,167,191,
+235,118,124,235, 35,255, 31, 48,172,128, 65, 95,167,187,169, 83,103, 0,194,192,194, 18,110,123,249, 11,241,131,223,248,138,248,
+187,124,248, 83, 16,169, 64,205,216,255,160, 8, 28, 9,142, 45, 12,151, 79, 45,141, 79, 95,196,236,105,175,170,155, 5,219,141,
+115, 39,251,156,169, 7,247, 66, 58,220,231,139, 93,105,215,219,118,232,251, 47, 36,251,252, 28,215,219,241, 22,185, 49,180,114,
+ 93, 42,199,190,154,181,126, 73,159,175,102,232,109,157,130,253,138,224, 28,154, 6,231, 43,242,112, 31, 58,235,236,171,220,169,
+ 19, 0, 42, 11,186,229, 29,255,236,154, 95,122,251, 63,185,250, 91,234, 26, 88, 42, 29,104,224, 32, 44,144,229, 6,243, 37,225,
+177, 81, 61,252,225,223,250,194,175, 62,248,217, 83,191, 13,128, 31, 63, 89, 61, 3,146,151, 74,204,212, 1,204,204,161,121,236,
+195, 40,143, 63, 6,218,120, 3, 0,224,205,183,221,128,253, 63,241, 77,120,219,175,125, 8, 75, 39, 70,192,204, 0, 40,124, 61,
+ 29,227, 10, 88, 90,198,215,189,116, 27,126,239,237,223,134,249,153,158, 63,171,106, 25,205, 35,239, 5,245, 7, 0, 53,128, 48,
+132, 27,192, 57, 60,250,244,137, 35,195,113,115, 4, 23,143, 40, 7,248,154,243, 46,179,201,158,115,246,117,185,156,196,101,178,
+ 43,230,122,117, 26, 91,219,161,223,117,153, 79,235,114, 6,114,171, 89,235,251, 87,219, 98,118,129,108, 79,203,161,119, 74,113,
+157,117,102,204,157,197,169,111,189,239, 91, 95,248, 43,119,191,238,234,111, 25,214, 64, 53, 87,130,102, 11, 8, 3, 88,106, 48,
+ 63, 83,224, 47,158, 92,124,102,231,187, 63,253, 51, 15,126,246,212,127, 0,240, 24,128, 39, 62,243,236,240, 51,112, 4, 52, 74,
+122, 42,156,135,216,235, 5, 84, 31,126, 87,246, 33, 63,254,166, 87,224,175,127,254,123,241,182,127,254, 53,184,113,211, 0, 51,
+ 82, 97,141,107,240,218, 23, 95,133, 95,254,201,111,198, 95,190, 99, 55,110,220,182, 62,254,124,253,119,191, 10, 57,241, 24,208,
+ 27, 64,148,132,135,186, 1, 28,225, 51, 95, 62,254, 69,248, 57,235,252, 60,187,207,103,147,197,188, 82,207,111,215, 21,122,189,
+ 43, 57,244, 61,207, 51,135,254,124,181,203,249,124, 45,107,126,239, 42, 29,250,246,238,145,117,214,101,234, 0,174,219,216,223,
+249,195, 95,179,233, 77,227, 33, 3,107,122,160, 62, 65,198,130, 98, 88, 99, 48, 95,224, 55, 63,113,244,211,255,227,239, 61,246,
+111, 79, 45, 55, 31, 2,112, 20,126,208,203,204, 95, 62,122,250,111,159, 58, 93,253,200, 85,115,189,178, 17, 73, 77,112,179,115,
+224,199,255, 18,245, 67,191,136,242,117,111,139,159,243,170,235,175,194,187,126,228,141,248,249, 31,172,241,244,177, 69,244,123,
+ 37,174,217, 52, 63,113, 62,205, 35,127,132,250,239,127, 19,152,153,243, 81,135, 43, 32, 13,131, 26, 70, 53, 28,225,189, 31,122,
+244, 33,120, 61,250,139,233,212,207,103,131,200, 32, 84, 17,217,120,185,165, 64, 91,118,200,156,223,170,216,193,218,191,125,165,
+ 94,239,149,228,208,207,151,196,120, 49,215,122,254,124,247,237,220,120, 9, 7,166,236, 56,143,251,113, 69, 4,150,157,117,118,
+177, 51,245,242,134, 77,131, 23,111, 28, 20,168,217,179,219,101,169, 65,127,220,128, 6,132,183,191,255, 75, 7,223,250,155,143,
+254,175,167,150,155, 15, 0,120, 6,192, 73, 0, 99, 0,213,147, 39,198,127,251,222, 79, 29,255,120,175, 4,100,216, 0, 16,144,
+131,239, 87,159, 91,139,230,239,255, 51,170,131, 63, 13, 89,122, 54,251,192,153, 94,137, 27,182,173,159,116,232,213, 50,154,143,
+188, 27,245,135,222, 1, 26,244, 65, 69,225,235,245,189, 1, 80,213,232, 57,224,111, 62,243,212,211,127,245,200, 51, 7,225,181,
+223, 47,138, 83,111,141,248, 60,151, 77,165,221, 38,182,231,121,182, 14,236,249,109, 84,217,214,231,178, 81, 62,223,175,247,138,
+112,232, 42,221,219, 14,190, 46,205,103,123, 25,216,149,214,250,149,243,124,189,164,108,151,169,119,214, 57,117, 0,197, 35,207,
+ 44,127,246,203,227,166,158,155, 43, 48, 87, 53,152, 43,128,133,130,229, 7,222,115,232,119,126,225,129,167,126, 22,192, 39, 0,
+ 60,171, 25,186,247,222,126,200,203, 51,191,244,193,103, 14,156,172, 26,148, 85, 3, 84,236, 89,115, 42, 74,131,249,181,224, 71,
+255, 4,227,247,190, 21,205, 63,190, 23,114,234,137,233, 47,228,226, 17,240,163, 7, 49,254,131, 31, 65,253,177,255, 8,204,204,
+ 0, 69,233,197,102,136, 64,174, 7, 26, 86, 64, 33,248,185,223,253,216, 31, 0,248,188,126,254, 5,119,234,166,111,217,218,170,
+218,139,180, 13,201,110,200,247,156, 37,211,189,212,118, 0,121,237,246,158, 85,220,139,123,174,224,235, 93,201,161, 63,140, 51,
+247,113,159, 53,232, 19,145,123,204,215,174,214, 61, 59,215,245,102,201, 93,199,113, 97,250,212, 87,227, 8,207,184,214,233,238,
+ 7, 39,159,175,103,164, 63, 87,180, 8,171, 64,139,142,175, 54, 3,215,235,232, 8,114,157,125, 85,217, 25,225,247,163, 11,245,
+223,125,223,239,124, 97,239,219,222,184,109,247,230,185,114,253,167,158, 29,126,249,255,254,240,225,247,253,227,147, 75,255, 47,
+128,167, 0,156,208,236,220, 58,209, 6,192,242,231,143, 12,255,228, 29,127,254,244,174,125,223,118,221, 29,245, 66, 13,148, 14,
+ 52, 40, 18,133,109,110, 29, 80,159, 68,245,225,119,130,250,107, 64,155, 95, 10,183,233, 38,160,156, 1,184, 2,159,120, 28,114,
+228, 31,129,225, 9,160,215, 3,230,215,155,183, 21, 0, 59,200,136,208, 95,227,240, 27, 7, 63,243,200,159,253,215, 39,126, 7,
+ 30,122,175, 46, 66,118,190, 11,147,243,197, 3,235,118,181,118, 23,114,237,245, 7,116,204,232,193, 85,124,254,110,117,150, 23,
+133,144,164, 44,235,189,102, 3,220, 37, 34,247, 79,203, 88, 77,203,215,198, 43,245,122,207,224,208,239,120,142,101,130,237, 45,
+ 39,114,175,201,106,119,168,214,193,254,179,245,154,155, 49,186,246, 30, 95,116,105, 92,205,206, 87,187,214, 39,159,175, 31,171,
+122,112, 21,159,177, 91,131,131,189, 43, 56,245,221,103, 16,166, 57, 96,158,219, 30,217,183,243,192, 10,140,247,105,173,137,157,
+117,246, 85,237,212, 43, 0,199,254,250,208,233,255,244,215,135, 78, 63, 0, 96, 45,124,221,252,105,120,168,125, 65,127,166, 45,
+ 43, 22,230,173, 63,253,239, 62,240,212,187,110,187,110,238,198,183,220,186,249,230,229, 83, 99,208,186, 62, 48,112, 94,105, 14,
+ 2,244,122,160, 94,207, 51,216,143,126, 2,245,225,135,227,225,200,149, 64,217, 7,230,215,180,222, 86, 0,227, 6,194,179,152,
+ 25,244,241,240,231,158, 57,254,191,252,199,143,236,211, 44,125, 25,231, 49,161, 77,206, 32,141,118, 38,167,117, 46,155,172,170,
+165,221,133, 52,217, 42, 56,186,131,186,241, 63,220,114, 14, 97,131,221, 97, 28,196,197,180,253,200,199,100,238,209, 76,115,191,
+ 57,183, 93, 72,236,227, 67,186,217,239,184,210,174, 87,175,107, 26,100,252,158,115, 88, 10, 7,206,163,119,125,151, 6, 76, 97,
+ 84,232, 52,237,247,246,168, 92,192,203, 0, 95,144, 0, 71,246,237, 60,191,181,222,170,153,171, 58,220,228,243,221,183,243,124,
+159,111,208,133, 15,129,204, 71,117, 24, 75,187,228,144,149,138,244,231,246, 35,141,123, 13,130, 57,150, 37,127, 0,151, 86,150,
+182,179,206,158,151, 78,189, 81,199, 93,171, 19,119,250,189,145,126, 53, 88,121,104, 74, 13, 96,129, 69,254,225,191,255,221, 47,
+252,220,230,249,242, 29,255,244,230,245, 47, 28,158, 28, 3,107,123,160,153, 34,245,175,123, 15, 14,244,103,206,220,135, 38, 0,
+ 88,128, 81, 3, 62, 53,198,236, 11,182,225, 83, 79, 29, 95,184,115,239, 7,247,158, 92,172, 62,100,130,140,139,109, 15,171, 67,
+ 63,103,210, 18, 17,237, 55, 2, 54, 27,237, 70,127,185, 23,130,102,235,119,106,118,179,125,133,204,211,102,110,119,226, 44,208,
+230,243,249,122,167,216,185,102,116, 7,159,195,103,109,199,234,235,208,251, 47, 65, 64,119,230,181,190, 2,195, 92,167,160, 93,
+144,231, 75,119, 63,120, 92,246,237,188, 23,249, 56,215,105,194, 54,123, 21, 37,176, 63,183,231, 12,247,243, 46, 61,183,206,169,
+119,246, 85, 97,238, 44,110,180,134,175,151, 31,135,159,124,118, 2,192,146,126, 95,206,242,187, 35, 0, 39, 79, 45, 55, 15,126,
+215,254,207,254,239,191,249,177,163,159,158,233, 59,244, 78, 85,224,147, 21, 48,228,120, 20, 2,129,104,202,151,254, 15, 13,128,
+ 49, 67, 78,213,160,227, 35,204,110,220,128, 7, 15,157,124,250, 91,126,230,224,207, 28,122,102,225,247,245,220,150,112,241, 88,
+239, 7,117,115,189, 83, 7,113, 60, 23,253,239,253,240,146,155,251,177,186, 30,228, 3,186, 49, 93,252,137, 86,126, 40,204,237,
+103,249,172,131,240, 99, 79, 31,190,210,175,247, 50, 56,200,123,177,122,114,229, 1,248,114,192, 93,151,184,115, 32,173,245,187,
+ 31,188,253,108, 45, 99,170, 50,119, 65,158,175, 30,235,166, 22, 58,180,210,103,222,137, 51, 19, 7,253, 58, 61,207,241,174,157,
+117,118,165, 26, 93,228,227, 23, 0,230, 52, 82,126,197, 15,191,118,235,143,253,155, 55,191,240, 59, 94,184,190, 95,214, 35, 65,
+ 93, 18, 48, 83,128, 74,231, 51,119,103, 78, 71, 4,104, 0,169, 25, 24, 54, 40, 42, 70,175, 71, 56,213, 0,239,252,208,177,191,
+248, 63,223,247,232,253, 85,195,127,135,212, 74, 87, 95,137, 15, 64,161,224,118,150,120, 8,126,186,217,193,203,120, 94, 1, 46,
+181, 66, 31, 7, 87, 57, 13,238,138,187,222,203,244,220,183, 99,146,155,240, 48, 60,220,126,252,138,188, 46,207, 54,159,254,124,
+207, 82,111,191, 64,159,119, 8,192,195,221,204,244,206, 58,167,126,113, 29,251, 12,128,245, 0,174,126,209,166,193, 55,239,121,
+195,214,239,252,161, 29, 87,189,230,218,181,189, 30,132, 32, 34, 96, 34,176, 57, 27, 39,128, 19,241,173,107, 4, 28, 29, 54,252,
+ 95, 62,113,236, 31,238,127,232,240,251,254,254, 75,139,127, 12,224,203,138, 28, 44, 95,169, 14,189,179,206, 58,235,172,179,206,
+174, 52,167, 30, 62,167, 15, 96, 30,192, 58, 0, 87,111, 90, 83,126,237,107,110, 88,243,154,239,189,117,211,171,111,125,225,220,
+ 11, 54, 14,138,249,249,146,250,165, 35, 87, 51,100,169,225,241,201, 49, 47,125,238,240,242,145, 3, 31, 63,246, 95,255,234,208,
+194,223, 62,121, 98,252, 48,128, 39, 0,156,130,175,161, 95,180,158,244,206, 58,235,172,179,206, 58,235,156,250,153, 63,203, 1,
+ 24,192, 67,242,115,240,140,250, 77, 0,182,205, 13,220,230,153,210,173,235, 21,212,175, 89,234, 97, 45,167,151, 70,205, 81, 17,
+ 28,134,135,216, 79,193,215,205, 23,113,118,162, 94,103,157,117,214, 89,103,157,117, 78,253, 18, 58,247,158,102,239,225,171, 68,
+156,190, 14,104, 6, 94,233,215, 88, 29,121,221, 57,243,206, 58,235,172,179,206, 58,123,254, 56,245,246,231, 7, 39, 31,254,180,
+ 78, 93,204,159,157, 35,239,172,179,206, 58,235,172,179,231,177, 83, 63,211,249,116, 78,188,179,206, 58,235,172,179,206, 58,235,
+172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,
+206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,
+235,236,249,103,244, 11,255,254,254, 41,253,224,228, 27,198, 5,128, 19,136, 56, 16, 1, 2,153,104, 36, 23,209,225,106, 2,128,
+226, 31,254, 79,246,202, 49,100,254,125,194,244, 51,130,238, 76,251, 71, 68, 4, 68, 4, 8, 65,136, 0, 97, 64, 4, 76,254,248,
+241, 68, 5, 16, 61,239, 48, 4, 6, 2,255,187,228, 79, 84,116,164,171,136,254, 12,128,147,199, 79,225,243,159,252, 36,164, 26,
+ 97, 60, 30, 97, 60, 30,163,116, 4,112,131, 97,221, 96, 80, 20, 32, 2,170,170,194, 53, 55,223,142, 47,127,225, 31,112,242,228,
+ 81, 44, 46, 47, 98,121,220, 0, 4,148,228,208,239,247,225, 92,137,235,111,188, 17,183,237,248,122,252,205,135, 14,226, 59,238,
+124, 43,126,235,254, 95, 2, 0, 12,199, 21,102, 7,125,140,235, 6, 11,163, 17, 54,174, 89,131, 99, 11,139,232,247,251,168, 26,
+198, 85,235,214, 98,177,170,176,102,102, 22, 71,151, 71,184,106,237, 58, 52,189, 62,182, 93,115, 3,238,120,227, 14,212,117,141,
+162, 40, 32, 16, 52, 13,235,120, 90,125, 46, 2,228,119, 94,255,206,128,232,115, 11,247, 54,253,108,254, 16, 68, 0, 97,255,253,
+162, 40,210, 13,202,127, 49,222,235,186,105, 80,150,101,122,102,162,127,115,254,153, 53,117,131,162,112,128,142,208,133, 0,226,
+116,101,137,254, 28, 51, 8, 2, 17,242,107,139,210, 51,231,134, 81,184, 2,172,139,136, 38,206,133, 32, 4, 52,117,141,178, 40,
+ 1, 71,186, 86,194,234, 37, 16, 73,190, 24,178,251, 3, 64, 8,228,156, 89,107,128, 35, 2,131,179, 75,110,154, 26, 16,160,236,
+149,241, 40, 77,195, 96,105, 80,186, 82, 23, 26,226, 49,195,177, 8,233, 35,133, 4,117,221,160,212,123, 75,250, 84,184, 97,127,
+ 92,241, 63,200,204, 40,138, 2,228, 0, 18,154,120, 33,152,211,125, 32, 2,200,172,107,210,197, 16,214, 74, 81,148, 0, 73, 28,
+ 99, 44,228, 47,200,193,233,187,161,191,235,244,126,137,128, 28, 65, 24,104,152, 81, 56,231,255, 27, 2, 71, 78,239,143,121,209,
+ 29, 0,214,123, 76,173,157, 65,160,191, 75, 19,239,181,152, 71, 9,248,119, 52,220, 87,146,180, 90, 9,126,208, 19,216,175,119,
+127,233, 28,215,147,115,206, 15,103,118,225,227,195,117,232,211, 38,232,181,167,115,142,251, 81, 60, 15,137,207, 11, 96,127,190,
+122,223, 29,153, 61,197,158,187, 72,220, 79,152, 25, 18,206,153, 68, 63,155,210,235, 18, 94, 11,241,255, 46,254,170, 16,207,138,
+243,123, 1, 2, 26,110,224, 92,161,207,197,236,140, 4,115,103, 4, 68, 46,109,161, 83,246, 85,161,120,194, 16, 61, 33,134,232,
+190, 25,254, 91,255,170,215, 42, 77, 3, 16,161, 32,151,164,193,244,254,137,238,167, 68, 64, 93, 55, 40,156,131,211,159,147,169,
+123,183, 95, 99, 0,193,133,125, 56,172,124,241,251, 12, 17,129,196,175, 77, 2,161,214,119,173, 40, 10,148,101, 9,231, 72,215,
+114, 1,231,156,126,207,193, 81, 1, 1, 67,216,191, 51,117,211,160,105,154,248, 60, 24,156, 28, 20, 72,159,145,223, 16, 5,140,
+170,170, 65, 68,254, 93, 41, 11,239, 83, 26, 70, 35, 2,102,127,156,134, 25, 77,237,143,219,176,255, 83,194,179, 55, 15,152,245,
+122,184,105, 80,148,165,127,191,117, 63,101, 22,136,232,121, 10, 64,196, 96, 33,248,213, 76,113,221,133,187, 39, 8,163,200,245,
+247,133,211,125,247, 59,132,174, 79,255,190,138,243, 43,196,238,112, 37,166,250, 89, 73, 47, 30, 3,112,254, 64,102,141,100,110,
+129, 37,238,231,126,169, 10,169,227,165,236, 84, 97, 54,164,108, 5,176, 46,116,231,166,123,127, 65,107,211,208, 69,236,140,175,
+ 33,179,176,201, 94, 9, 38,182, 21, 50,171,238,169, 39, 14,163,239, 8,203, 0, 6,101, 1, 97, 7, 97,160,152, 93,143,254,240,
+ 52, 32,140,153,126, 15,253,153,121,112,189,140, 53,235, 54,161, 39, 35,188,242,214,215,227,200,211,143, 97,225,228, 17, 44, 13,
+135, 56,185,184, 4,160,194,145,103,158,196, 23, 31,255, 2, 78, 29, 59,134,247,189,231, 55, 1, 17,244,251,126,227,175,234, 26,
+131, 94, 15,189,178,192, 51, 39, 78, 98,203,186,181, 24, 51,163,160, 18,133, 35, 12,202,158,127, 1, 0, 44,142,199,152,235,207,
+160,223,235,129, 69,204,213,200, 10,247,136,208,246, 1,105,211, 74, 47,101, 88, 32,103,215,246,145,184,241,132,141,151,153,163,
+143, 36,202,125, 44,181,159, 41, 77, 62,179,176,120,252,239,232, 65, 36,223, 56,226,117, 18, 32, 78,224,196, 65,156,100,139, 78,
+200,165,243,167,116,156,228,208,225,157,188, 58,118, 97, 19,228,153,205, 81,244,228,201,120,223, 44, 62,162,214,245,101,151, 40,
+186, 25,217, 32,152,144, 60,138,185,104, 71,198,147,133,247,200,249, 0, 85, 15,236,156,196,207,201, 30,143,228, 49, 9,145,185,
+110,245, 60,206,158,183,121, 94, 33,168, 9,215,236,224,252,102, 68, 26, 96, 73,242,110,132, 16, 60,135,235, 22,115,205,148,159,
+ 79,188, 93,102, 92,178, 58,173,176,225,132, 95, 38,164,141,213,250, 38,202,246, 26, 74, 14,157,252,250, 23,117,244, 78,210,223,
+ 73,247, 1,127, 89,193,233,132, 99,187, 21,182, 11,153,120,158,200,110, 47,153, 77,117,122, 98, 65,246,121,170, 3, 23, 50, 65,
+ 27,252, 51,208, 80, 16, 52,241, 30, 74,246, 46,248,251,238, 55,118, 10,123,152, 6,100, 89,192,163, 9,141,216,223, 35,228,107,
+ 52,188, 79,230,221, 33, 32, 91,176, 18, 28,188,122,112, 33,154,140,172, 68,131, 40, 17,239,128, 77,224, 27,110, 92, 8,146, 98,
+240, 76,103,214, 46,163,236,157, 78,187,137,176,248,128,140,210,251, 65,240,251, 11,224,131, 65, 87, 56,179,206, 39,118,110, 13,
+160, 82,160,170, 33, 73, 10, 96,194, 5,147, 79, 30, 76, 90, 3,110, 88, 31, 37,195, 57, 31,224,178, 8, 24,234,128,197,223, 7,
+ 97, 6,139,126,177, 63,174, 79,124,196, 4,114,234,235, 88,131,103,129,254,155, 38, 74,254,168,209,163,138, 0, 16,239,216,195,
+222,108,111, 55,169,211,101,166, 24, 56,144,190,247, 44,230, 93,204, 18, 91,134,168, 99, 7, 1,101,246,194,197, 13, 65,204, 99,
+161, 44,178, 75,145,171, 76, 70,134,225,223, 37,253,153,254, 77, 98,140,153,189,117,186, 17,248,147,229, 20,217,211,180, 69,162,
+143,142,252,141,137, 17, 13, 76,118,180,130,191, 18,187, 8, 41,237,147,117, 53,198,184,170, 80, 64,176, 60, 30, 99, 92, 53, 40,
+ 9,232,213,139, 24,143,199, 88, 51,211, 71,191, 44,113,114,113, 1,167,191,124, 8, 60, 94,192,236, 96,128,197, 83,207, 98,184,
+120,194,143,159,235,149,216,186,113, 19, 70,163, 33, 78,159, 60,133,191,254,208, 95, 96,110,118, 22,195,103,158, 66,233, 10, 12,
+ 23,198, 0, 17,122,101, 9, 22,198,210,168,194,160, 44,176,118,110, 22, 79, 30, 63,133,185,193, 0,163,170, 65, 45,130,138,147,
+235,118,174,192,186,181,115,153,123,166, 41,219, 82,184,104, 27, 64,197,101, 20, 82, 70,177,206, 73, 90,142, 54,223, 98,211,254,
+156,175,141,144, 69,218,167,145,118, 74,154,120, 86, 89, 48, 69,249,179, 72,171, 56, 4,129,186, 97,137, 68,132, 37,126,188,232,
+ 86,165,209,124,216,220, 69, 55, 32, 74, 41, 31, 68, 52,115,179,225,156, 58,123,161,224, 64, 18, 90, 67, 54,205,160,228,116, 17,
+ 55, 8,127, 78, 69, 81,168, 67, 36,115, 47, 83, 22, 39, 38, 82, 16,139, 12,133,127, 11,136, 83,116,118,186,129, 58, 93,195, 18,
+ 28,130, 94, 79,184,126,189,110,187,177,198, 13, 74,130,238, 2,159,201, 0, 0, 32, 0, 73, 68, 65, 84, 35,116,209,183,134,205,
+197,103,177,206,103, 64,138,132,216, 64, 43,249, 95, 74,247, 46,124,148, 57, 87,210,119, 55,162, 44,118,149, 81, 30,119,132,189,
+195,111, 48,233, 57, 66,131,245,248,110, 91, 24, 67, 12, 42,168, 14, 61,100, 33,241, 90,201, 32,112, 41, 58, 11,121,121,204,196,
+ 98, 86,110,145, 3,105, 35,144, 33,203, 54,193, 88, 88, 45, 45,112,202,162, 25, 9,122, 73,193,161,207, 46, 91, 1,163, 6,172,
+100,130,128, 44, 7, 51, 31,228, 17,170,228,120, 65,228,209,171,128,186,132,165, 25, 31, 76,218, 87, 77,138, 21, 3, 42,187,231,
+ 74,132,154,194,251, 28,130, 14,196, 48, 38,247, 36,126,237, 4,167, 42, 98,144,162,112,175,188,199, 2,179,119,134,228, 40,189,
+155, 19, 1,159,143,145, 18,218,228,175,159,217,175,121, 71, 41,243, 15,153,175, 40, 2, 89, 56,151, 16, 86,164, 53,106,159, 79,
+112,120,193,129,134,228, 82,162, 31, 10,240, 3,167, 37, 32,226,179,111,230,152,160, 56,231,188, 3,111,127,177,164,239,115,114,
+246, 49, 40, 54, 1, 30,216,255, 12, 21,206,223, 87,201,157,162,255,189,112,206,122, 60, 18, 19, 39,230,153,191,253, 29,210,247,
+142, 69,162, 31,149,108,207, 9,235,202, 39, 8, 2,160,148, 24, 33,183, 50, 14, 19, 9,138,121,242, 36, 98,147,174,184,225,144,
+249,102,150,205,199,183, 3, 16, 19,141,147,125, 73, 72,146,239,177, 16,159,121,225, 66,178, 67, 49, 25,114,105,155,144,201,128,
+ 78, 32,112,146, 67, 86,109,215, 83, 20, 5,184,105, 48,174,198,232, 81, 8, 26, 9,174, 32, 84,117,131, 70, 4, 85,211, 96, 88,
+ 85, 88,191,245,122,148,253, 25, 28,254,210,167, 49,211, 43,177,102,253, 22,156, 58,250, 4,106,241, 11,100,195,250,181,104,154,
+ 10, 87,109, 88,135,225,120,140,211, 75, 75, 96, 1, 28,249, 81,239,133,115, 24, 85, 21,230, 6, 3, 20, 68,232,151, 37,142,157,
+ 94, 64, 89, 56,244,123, 5,198, 77, 3, 1, 97,105, 60, 70,175,215,247,215, 92, 20,216,188,113, 93, 68, 35,200,166,196, 2,144,
+227,184, 81,176, 36,167, 39,146, 94, 66,145,228,132,130,147, 74,112,113, 56,142,152, 23, 61, 5, 91, 33,211,245, 25,140, 36,168,
+212,194, 35,113,191, 49, 25,145, 61, 79,146,137,224, 65,212,153,165, 61, 69,226,231,161,245, 60, 69,131, 78,103,119,139, 86, 73,
+ 37,157,167,191, 22,136, 3,133,204, 23, 33, 88, 48,193,168,102,177,126, 13,165,108,158, 76,176,103, 95,200,152,249,218,108, 40,
+ 56, 68,114,233,126,132,204,137,210,117,133,181,203, 48, 65, 64,112, 58, 44, 30,157,210, 99,123, 39,239, 64,122,204, 0,171,155,
+ 16, 62,194,228,118,151,139, 73,179, 58, 55,167,155,162,144, 34, 29, 36, 38, 72,202,157, 98, 58, 52,133, 16, 94,175,143, 98,137,
+ 35,123,198,230,126,147,125,255, 3,180, 76,249, 51, 20,139,172,165,216,203,196, 81,169,148, 66, 72,193, 26,217, 76, 95,207, 71,
+204,117,251,159,117,241,173,246,159, 31,160, 72, 73,232, 0,181, 49, 72,239,112, 93,200, 96, 37, 21, 8,194,166, 11, 69, 10, 72,
+236, 70,151,103,160,193,217, 50, 9,192,121, 52, 64, 89,150,219, 10,164, 92, 2,207,200, 64,233,193,233, 48, 75, 44,179, 69,152,
+213, 58, 74,139, 18,200, 36, 10, 22,127, 77,225,169, 24,160, 75, 10,138,108, 54,111,177, 76,214,204, 53, 36,101, 9,151, 79,193,
+ 48,139,119,188,142,156, 6,139,122, 92, 70,150, 82,248,243,117,166,172,224, 51,113, 31,132, 23,201,225, 3, 49, 43, 22, 2, 74,
+231,124,233, 97, 21, 72,128, 5, 46, 83, 89, 81,252,181,139, 41, 45,232,147, 15, 48,189, 52,141, 71, 3,156, 3,139, 15,102,188,
+227,214,210, 95,128,189, 21,218,103,227,208, 67, 6, 30,159, 5, 43, 60,238, 92, 12,158, 41,236, 91, 54, 99, 87, 24, 61,193,247,
+105,159,161,214, 50,147,184,111,164,160, 58,250, 83,227,127,205,227, 73,136,144, 0,101, 40, 61,164,104,175, 85,103,178, 17,175,
+197, 33,163, 99,144, 22,208, 45,147,105,153,121, 56, 28, 55,104,139, 12,231,248, 88,138,116,125,168,226, 98,106,148,240,118,239,
+220,237, 77, 52, 79, 16, 4, 18, 55, 1, 7,199,210, 64,200,132, 28,161,169, 70,126,195,224,198,215,137, 11,231, 55,205,114, 22,
+197,184,246,245,225,166,198,210,201,103, 1, 87, 96,221,134,109,168, 22,142,224,248,225,199,209, 52, 90,251, 66,131, 13, 91, 94,
+132, 83, 39,143,163, 95,150, 56,181,176,136,173, 27,214, 99, 97, 56, 66, 85,215, 24, 85, 53, 22,150,135, 40,156,127, 9,230, 7,
+ 51,152,155,157,193,210,104,140,126, 81,120,135,202, 90,207,132,143, 30,157, 43,208,239,207, 96,203, 85, 27,178,136, 92,108,116,
+199, 90, 83, 35, 91, 51, 23,221,168, 40,131,128, 99,230, 26, 2, 40, 78,165, 81,230, 54,222, 27, 16, 19, 74,217,138, 36,120,150,
+140,179,177,209,118,136, 20,197,236, 54, 18,179, 26, 11,191,147, 47,217,180,130, 3,187,168, 73, 11,165,126,195,144,220,177,233,
+ 70,199, 32,205,116, 53,184,136,155,123,168,227, 33, 58,153,176,209,248,123, 22,119, 62, 5,173, 40,135,224, 37,193,215,220, 4,
+ 52, 32,161, 66,194,201,169, 59,146, 86,146,146, 54, 58,177, 85, 8,130, 57,142,158,175,110, 44, 46,148, 11, 26, 68, 39,239,178,
+ 87,199, 77, 64,235, 9,180, 54, 79, 56,220, 38,123, 12, 39,254, 93,208,235,119,234,248,132,140, 99, 23,103, 56, 17,254, 60,156,
+ 75,200, 65, 59,141, 37,180, 29,122,242, 52,206,192,146,146, 83, 94,210, 86, 66,148,161,126, 54, 48,161,248, 28, 9,182,186, 14,
+179,230, 40,192,210, 38, 64, 9, 25, 63,153, 77, 46,162, 30, 34, 38,150,145, 88, 63,246,207,223,105,157, 18, 89,160, 32, 6, 1,
+203, 61,151, 89,203,122, 63,217,137,217, 14, 41, 15,120,219,232, 83, 12, 26, 96,156,131, 63, 79,230, 20,144,101, 91, 36, 89,104,
+ 68,223, 31, 19, 20, 73,142, 45,233,251,165,225, 2,153, 96,198,122, 35, 83, 82,241,107,135, 65,226,159,123, 22,208,144, 45,179,
+250,111, 20,206,212,219,217, 32,174, 33,208,139, 8, 89, 8,162,204, 59,163,176, 59, 73,130,148,153, 27,127,220,194,121, 56, 92,
+ 75, 91,177, 36, 52, 45,118,161,148,185,250,140,218, 58, 94, 24,248, 91,209, 5, 97, 52, 85, 3,230, 70,223, 15,159,161,135,154,
+119,128,216,131, 67, 79,127,230, 95,214, 7, 38,135, 30, 74, 23,138,192,217,108,155, 89, 3, 6,127,236, 88,190,177,153,121,112,
+ 96,198,129,147,115,177, 86, 31,185, 26,250,239, 36, 45, 4, 43,172, 7, 93, 99,101,132, 4, 98, 6,220,130, 75,197, 68,239, 90,
+ 15,136, 16, 56, 44, 12, 68,104, 35, 15, 80,136,129,180,198, 17,106,185, 54,147,132, 93,176, 50, 89, 19,166,108, 25,122,199,199,
+122,215, 36, 56,118, 39,126,179, 18,179,177,145,137,132,244,173, 16, 3,213, 18,128,133,211, 75, 0,215,112, 32, 84,236, 73, 18,
+125, 0,101, 89, 98,204,140,170, 26, 99, 80,206,160,106, 24,163,165,163,152, 91,179, 1,167, 23,142,162, 97, 65,179,124, 24, 47,
+121,197, 63,193, 35,127,255, 16,170,166,193,209,103, 30, 7, 57, 66, 85,141, 49, 63, 55,131,245,235, 55, 99,113,248, 36,214,206,
+206, 98,166,223,192,185, 33, 78, 44, 46, 97, 92,251,104,120,220, 52, 0, 57,172,159,157,197,233,225, 24,253, 94, 15,181,214, 15,
+ 89, 4,189,162, 64,217, 31, 96,110,118,128,170,170,167, 16,123, 36, 67,182,125, 36,154, 46, 94, 20,230,201,235,136,186, 96, 36,
+109,152,162, 89,114,138,200, 53,214,102,130, 35,246,153,168, 6, 29, 22,234,202,156, 9,179,129, 32, 37,174,153,137,218,140, 5,
+ 2, 40, 71,117,242, 90,112,202,140,201, 56,129,172,164,230, 8, 78, 56, 57, 91, 67,246,113,209, 7, 58, 83, 38,114, 62, 12, 8,
+228, 39, 55, 89,175,158,228, 5,234,186,119,166, 10, 44,134, 84,231,200, 67,205,148,103,249, 36, 57,106, 30,126,209, 57, 31, 72,
+134, 32,200, 19,126,210, 3,114,164, 65, 74,150,195,145,169,112, 36,120, 53,119,135, 97,131, 20, 13, 20,148,152,100,160, 91,167,
+142, 92,148, 92,231, 8,137,124, 74,240,129,179,115,250, 60,194,231,135, 19,243, 55, 52, 98, 99,134,148, 24,207,198, 32, 39,193,
+249, 56,161, 84, 12,114, 46,110,136, 46, 43,139, 37,104,155,148, 36, 99,239, 15,166,160,232, 20,235,234, 6, 38, 54, 11,204, 57,
+ 83,131, 15, 59, 7,181,216,104,162,231,167, 72, 20,153,210, 67,172,149,154,117,235, 47,207,133, 45,219,144,156,108, 38, 29,214,
+ 21, 39,162,154,201,212, 99, 1, 82,159, 65,128,175,195,134, 13, 81,228, 70, 4,226, 40, 86,249, 99, 62, 99,136,202,212,218, 27,
+ 39, 74,149,225,182,154,172, 91, 16,156,176,180,238,167,175, 51, 59,253, 76,145,188, 42, 71, 72,245,246, 68,126,157,246, 30,155,
+192,138, 0, 18,231,131, 23,102,125, 46, 69, 66, 92, 53, 86,143,129,130, 58,116, 9, 65, 43,145, 6, 0, 57,218, 17, 75, 39,193,
+ 9,102,208,184,255,118, 72, 24, 34, 68,207,140,186,110, 80, 55,117,250,156,152, 57, 7, 7,158,190, 68,131,132, 72,130, 52, 95,
+ 30,182,119, 38,248, 55,207, 62,242,201, 82, 86, 30,206, 41,108,215,161,118, 79, 34,134, 76, 25, 40,112, 98,170,169,146, 80,134,
+112, 28,189,105, 98, 17, 17, 33,127, 60, 74, 40,104, 41, 1,119, 12, 25, 59, 88,111, 26,101, 14, 35,175, 81,113,142,170,106,172,
+ 32,173,138,141, 39, 50, 48,210,118,144,232, 18, 57, 37,165, 77,102, 17, 91, 45, 51, 78,154,178,168, 59, 6,196, 98,178, 8,151,
+ 7, 1,214,171,133,151, 56, 68,207,167, 79, 45,105,192,193,122,131, 24,163, 90, 80, 56,135,133,133, 83,145, 28, 6, 0, 27,182,
+ 92,135,133,163, 95,198,252,186, 45, 88, 58,117, 4, 27,183, 94,143, 35, 79,127, 17,227,241, 8,253,194,197, 69, 80, 53, 13,138,
+130, 48, 30, 15, 49,211,235,129,133, 49,174, 42,204, 13,122, 24,142,123, 0, 1,199, 23,151,193, 2,244,202, 18,149, 8,202,162,
+244,108, 75, 1, 6, 74, 16,233,247, 6,152,157,157, 67,211,112, 11,102,163,172,214, 11, 75, 52,138, 28, 10,206,160,204, 54,215,
+128, 67,109, 26,169,110, 30,157, 39,139,169,202, 83,172, 9,138,137, 48, 29,185,108, 67, 16, 75,166,162,196,100, 79, 48,170,100,
+203,199,229,151,210, 34,181,135,236,143, 90,165,122,253,190,163,140,242, 72,206,229,196,171,136,244, 36, 70,109,128, 61, 69, 28,
+ 34, 31, 91, 98,186, 16,179,148, 8,196,170, 47, 9, 76,115,223,101,144, 54,120,231, 8,204,137, 57,111, 9, 83,217, 57,183,131,
+ 16,231, 20,166, 51,207,192,249, 99,179,214,228, 18, 19,156, 20,109,208, 13,211,229, 84, 79,154,218,195, 0, 56, 74,140,228, 24,
+ 76,192, 1, 78, 52,153,162, 4,187, 58, 19,180, 59,138, 25,176,103,204,187,228, 36,145, 2, 38,100,132,181,132,206,216,141,215,
+197,178,136,190,131,206,220,119,195, 68,151,144,149, 59, 19, 80, 90,248,221, 44, 92, 39, 38,251,215,243,183,196,216,176,209,134,
+110, 10,187,161,144, 18, 8,132, 0,155,255, 7, 20, 35,150, 31, 99,237,152,226,125, 97,136,249, 92,195,153,176,149, 12, 73,129,
+137,232, 29,167,176,113, 19,153,140,122,210, 17, 64,107,243,204,158, 40,236,239, 5,193,137,180,136,112,138,232, 76,208, 95,167,
+172,131,192,168, 14,205, 66, 54,192,116,146, 81, 72, 96, 28,171, 93,207, 98, 23,178, 32,214,209,157,118,220,132,208, 76, 76,171,
+ 1,153,154, 75,188,207,234, 95,156,162, 71, 33,136, 99, 32,146,206, 60, 50,233,203, 78,148, 0,163,172, 59,130, 76, 9, 76,192,
+ 62, 56,177, 14, 23, 22,126, 23, 52,193,169,139,160,110,188, 67,247,239, 95,145,213,208, 89, 82, 22,237, 29,189,102,229, 83,234,
+236,204,141,105,235,242, 1, 92,224, 6,196,189, 79,226, 42,156, 32, 55,199, 64,137, 13,138,160, 40,137, 47,155,165, 64, 85, 2,
+ 42, 20,192,248,144,140, 25,248, 93, 4, 6,249,161,184,231,151,108, 32,153,184, 93, 50,212, 25,211, 68,218, 28,115, 48,243, 66,
+ 83,116,217,192,212,116, 59, 64, 94,166,197,129, 51,212,221, 7, 2, 34, 46,239,114, 11, 27,134,155,194, 72,142, 59, 56, 39,184,
+136,166,180,230, 73, 98,250, 38,226,151, 63,247,163,135,159, 5, 55, 53,136,128,113, 85,163,223,235, 1, 10,193,207,244, 75, 84,
+ 85,133,185,249, 57,156, 60,113, 2,199, 15, 63,238, 95,188,211, 71, 81,174,217,130,199, 31,123, 4,115,243,235, 80, 55, 13,230,
+215,109,195,169,147, 71, 0, 0,117,195,232,245, 6, 88, 88, 92,192,114, 85,249, 90,122, 93, 99,221, 96,222,215,207,203, 30,202,
+162,193,184,105,208, 8, 97,105, 52,198,220,140,195,104, 56,130,144,195,218,185, 89, 52,228, 80,148, 37,182, 94,181, 33,102,199,
+ 57,208,218, 10,132, 76, 13, 39,188, 84,108, 83, 74,125,183,242, 4, 68, 18,148,221,174,152,136,193,230, 67,203,153,169, 45,163,
+213,222, 67,166, 45, 46,176, 63, 41,237,120, 41,101, 17,202, 9,239, 97, 45, 5, 34,184, 51, 48, 37, 37, 50, 72,246,119, 11, 79,
+ 88, 72, 22,105,211, 70,107,211, 10, 75,208,153,226,174,143, 31, 92,236,201, 36, 11, 69,170,199,145, 80, 63,116,164,108,125, 75,
+ 25,160, 44,123, 22, 75,228,106,247, 51,133, 98,134, 75,215, 11,246,229, 1,103,202, 89,142, 76, 22,164, 4,183,200,246,182,180,
+ 4,106, 55,151,234, 6,169,181,115,184,252,190,180,176,237, 68, 75, 16, 3, 97, 75,186, 56,203, 31,200,136,173, 68, 10,175,107,
+234,152,213,223, 13,243,194,146,195,156,139,132,198, 12,202, 14, 40, 94, 86,195,150, 20,153, 43, 18,231,226,207,155,172, 81,204,
+ 93, 53, 72,176, 24, 66, 32,161,213, 33, 97,106,231,100, 57, 37,148, 53,137,105, 80,144,194, 38,138, 28, 22,221,103,178, 78, 0,
+ 13, 45,204, 26, 79,153,170,114, 38, 90, 84, 66,219,254,203,148,218,227,178,245, 65, 57,185, 50,161, 32,121,113,157, 12,171, 92,
+ 38, 88,231, 48, 92,147,128,180,218, 14,153,244, 51,204, 77, 68, 69, 36,242,166, 40, 33,156,146, 8,108, 49,204, 51, 92,139,248,
+236,132,178,165, 20,118, 33, 71, 46,173,167,224,208, 37, 57,244, 66,225,112,138, 8, 5, 33,246, 41, 82, 43, 66,142,101, 87, 24,
+135,107,225, 5,152,164,212, 7, 75,141,162, 16, 69,225, 82, 59,162,169,111,115,116,230, 98, 88,238,121,150,206, 77, 19, 97,241,
+128, 76,134,224,217,217,210,151,237, 56,136,168, 67,218,139,165,213, 61, 34,194,202,173, 9, 1, 11,181,250,207, 36,102,248,129,
+ 43, 38,246, 90, 45, 74, 20,156,122,134,237,183,234, 45, 49,139, 55,100, 34,177, 45, 21, 72,181,219,108,155, 17,219, 99, 30, 98,
+ 14,210, 7,234,124, 29,210, 48,152, 41, 16,108, 72, 33, 49, 39,166,115,143,160,123, 61, 92,140, 94, 18,123,217, 16, 67,167, 58,
+116, 80, 43, 96, 49,247,180, 26,141, 48,170, 42, 20, 34,232,151,190,182,221, 8, 99, 92,141, 49, 59, 24,160,174,107, 44,156, 62,
+141,170,105,208, 43,123,177,174, 52, 24, 0,189, 94, 15,203,139,167, 80, 22,132,178,236, 69, 88,105,208, 43, 48, 55,232,227,244,
+226, 18, 74,114,232, 21, 14,235,102,102, 80, 42, 36, 58,232,245, 48, 55, 51,131, 97, 85, 97,185,170, 65,174,192,176,170, 65,206,
+161, 44, 29,134, 85,141,193, 76, 15,253,126, 31,215, 94,179, 37, 11,160, 44,119, 65, 76, 73, 36,254, 41,182,231,214, 68,137,220,
+ 38,218,144,121,129, 90,162, 3, 89,245,132,227,155, 59, 45, 35, 72,181, 29, 49,109, 57,137,117, 27, 34,215,180, 1, 7,200,211,
+100, 80,176, 80,110,170, 16,134, 90,114,200,178, 12, 55, 46, 18,207, 28,181,218,243,178,136, 33, 5,132, 36,201, 65,201, 4,249,
+134, 2, 9, 27,224,176,198, 44,199, 41,175,113,134, 87,206,185,212, 27,170,137,112,138,150,115, 90,159, 46,245,148,137,248, 76,
+ 83, 55, 82, 24, 62,128,115,246,166, 78, 4,177,100,153,103, 54, 66,179, 93, 41, 49,147, 82,182,191,194,204,177,253, 83, 82, 11,
+152, 71, 50,108,160,219, 38,253, 89,126, 75,114,186,129,200,135,204,249, 79,182,139, 6,103,234,218, 16,170, 13, 14, 45, 89, 45,
+ 23,152,136,142, 44,107,209, 74, 43, 36,214,108,179,174,157, 72,242, 21,211,241,144, 2, 46,154,210,180, 38, 22, 62, 37,151,101,
+243,129, 32,232,203, 7,156, 65,232,150, 32, 44, 52,217,250,230, 29,128,225, 42, 91,248,223,212,159, 89,127,214,129, 48,173,245,
+103,218,198,221, 70, 35,179, 18, 91, 27, 53,210,114,139,216,223,136, 21, 55, 45, 84,133,154, 85,171,172, 26,218,195,138,178,240,
+136,139,237,138, 16, 49,229, 26,171, 91, 16,229, 68, 18,105,211, 41,242,161,253,218,161, 28, 21, 90,219, 68,252, 61,118,134,108,
+155, 5,206, 19,117, 89,219, 42,150,123,212,208, 57,193, 44,104, 26,127,237, 78,187,118, 36, 43,193, 80,116,144, 9, 46,151, 84,
+ 91,103,109,107,107, 26,189,135,206, 35,183, 1,121,104, 83,195,204,166, 24,223, 65,246, 78,159,201,247,159, 57, 39,218,174,166,
+ 65, 79,188, 71,173,174, 80,180, 24,246, 33,163, 55,140,255, 88, 70, 53,101,160, 84, 83,151,182, 75, 79, 48,152,101,177,134, 15,
+205,107,135,210, 98, 86,231, 53, 36,155, 1,112, 38, 46,145,156,126, 56, 65,168, 67, 87,218,120,106,253,137,235,197, 63,244,208,
+102, 34, 42,164,192,180,178,174, 77,214,127,108, 30,124,225, 28,154,102, 12, 7, 96, 84, 85,168,235, 26, 78, 23,127, 89, 20, 24,
+141,199, 40, 93, 1, 34,191,129,215,117, 13, 71, 2,162, 18, 39,142, 62,139,219,190,225,141,248,200,135, 62,128,158, 43,113,250,
+244, 9,192,149,224,166,194,242,112, 4,114, 5, 70,117, 13, 17,198,218,249, 13, 96, 89,194,104, 92, 97,208,235, 97,208, 47,192,
+ 12,108,152,159, 71,111, 60,198,114, 85,107,173,211,197,252,210,185, 2,253,193, 44,214,175,157,207,200, 47,210, 22, 80, 17,201,
+ 30,124,124,192,129,117,169, 11, 92,164, 21,214,217, 23, 90, 38,117, 67, 34,203,155, 82,230,205,182,197,200, 66, 73, 54, 35,136,
+ 74, 68,148, 50,156,140, 61,237, 29,137,139,153,189, 75,125,189, 68, 74,216,227,172,134, 29,196, 69, 36, 8,142, 80,106, 25,131,
+ 17, 19,130, 35, 16,115,238, 0,132,114, 21, 24, 50, 68, 54,164,168, 48,157,187, 68,241,145, 32,140,147,148, 77,200, 56,141, 38,
+182,106,197,227, 32,177,199,209,226,110,132,214, 53,103,179,195, 40,250,146,132, 90,242,146, 67,130,245,226,102, 65,121, 78,105,
+ 9,136,225, 60, 2,113, 80,196,212,209,205, 70,103,235,242,169,103,222, 20, 69, 66,155, 96, 64,226,168,229,132, 66,103,201, 20,
+102,178, 32, 23, 44, 32, 35, 52, 98,154, 45,180,164,144, 58, 96, 92,187, 65,182,221,194,148,137,211,164, 86, 47, 17,155,117,231,
+ 29, 55,212,234,166, 12,168,132, 76,169, 66, 7, 66,153, 24, 34, 29,216, 16,227, 98, 64,147,103,201,237,243,181,251, 76, 44, 31,
+ 56,164,250,105,222,129, 22,239,189, 39, 92,230, 39,237, 20,177, 16, 66, 78, 76, 14, 37,160,200,214, 55,215, 20,136,144, 98,131,
+201,188,209, 53,235,138, 1, 32,210, 68,104, 60,113, 10, 40, 75,204,162, 72,140,158,167, 4,237, 5,166, 12,170, 39, 9, 98, 65,
+154,221,187,164, 37, 64,162,109, 89, 90,211,138,144,123, 8,248,195,117, 58,202,136,184, 68,212,110, 96,240,213,103,227,132, 5,
+150,112,168,190, 65,133, 99,156, 3, 92,209,203, 90,171, 69, 25,242,142,104,130, 33, 36,166,166, 46,202,150,103, 86,135, 30, 2,
+ 32,227,129,133, 45, 33, 50, 95, 14, 28,215,162,131, 19, 1,107, 73,203,223,127, 86, 46, 1, 77, 32,218,233,164, 84,164, 40, 36,
+199, 76, 9,114,213,146, 72, 44,190, 6, 4,220,215,212,101, 66,111, 43,131, 86,131,102, 12,167, 95, 22,147, 9,137, 97, 85,228,
+209,176,129,121, 34,133,159, 76,155, 28,165,202, 96,128, 83,156,175,135, 16, 28,192, 30,238, 18, 2,136, 29,216,105,101,158, 18,
+ 68,225,197,198, 90,117,204,184,241,176,214,126,173,218, 83,171,199,166,241,108,200,180,129, 11, 26, 22,140, 69, 80,184, 34, 66,
+ 48,117,211,248, 53,220, 8, 42,140,177,249,234,107,241,153,143,125, 20,194,140, 74,106,128, 5, 92,143, 65, 68, 88, 59, 55,171,
+181, 23,198,252,204, 12, 74, 7,212,117,157,181,236, 49, 75, 84,236, 90, 63, 55,139,165,113,141, 6, 64,197,128, 43, 28,250,131,
+ 89,204,207,175, 69,163, 81,161,176,104,164,107, 80,146, 88, 11, 75, 10, 64, 28, 11, 27, 65,165,141, 99,210,148,152,200, 28,137,
+ 7, 17,102, 38,202, 3,187,140,232, 21, 20,189,242, 77,144,208,142,232, 93,204,188,131, 56, 72, 90,232,228,219,230, 66,173,149,
+130,162, 25,103, 81, 51, 41, 12,239,156,135,223,162, 98,154,217,157, 61, 36, 75,104,132,163, 0, 73, 32, 99,178,169,217,145,178,
+139, 44, 99, 90, 12,115, 62,135,243, 16,219,177,156,238,190,181, 18,228,168, 45,160,100,234,174, 25,232,236, 16,157, 40,217, 62,
+101, 18,160,241,228,189,212,130,149, 58, 8,136, 8,172,253,185, 54,227,182,237,160, 19,164, 37,103, 90,235, 36, 5,123, 20, 91,
+215,148,204,150,114,218, 68, 72, 51,237, 99, 4,100,237, 99, 81,219, 42,219,236,114,116,131,162, 82, 28, 90,142,142,140,120, 84,
+ 98,125, 59,228,109,177,142,104,162,252, 34, 19,220, 9, 35,136,226,108,139, 99,128,253,253,198, 72, 83,217, 97, 45, 18,153,237,
+168,176,173, 90, 98,154,234,200,246, 45, 68,175,233,137, 94,194,185, 8, 79,171,165,169,221,188, 17,168,116, 89,195, 0, 77, 19,
+181, 9, 80,191,192, 21,110, 10,142,216,106, 91, 35,180,196,100, 36,181, 50, 74,114, 1,150,255,228, 4, 89, 74,160, 57,163, 65,
+215,196, 40,243, 73, 12, 2, 8,169,111, 61, 40,185, 89, 86,126,162,176,114,150,110,136,238, 21,177,254,174,239,155, 40, 12, 22,
+248, 73,142, 92,114,248,137,206, 30,223,119, 24,135, 62,161,133, 18, 2, 91,225,172,165, 45,181,219, 58, 0,141, 87,221,116, 20,
+ 85, 47, 19,252,237,247, 69, 9, 73, 43,229,119, 92,140, 99,111,154, 6,208,142, 4,239,132,149,188, 25, 74, 4, 28,217,149, 70,
+ 71, 35,173,118, 7, 1,187, 68,122,115,162, 92, 28,176,118,151, 56, 67,122, 14,129, 15,195, 66,128,162,136,134,247,211, 2,166,
+212, 67, 15, 88,180, 36,161,157,165,200, 36,248, 30, 96,187, 80,135, 22,150,152, 33,249,236, 56,151,219, 12,117, 3,201,153, 26,
+121,133, 71,114,193,148,172, 17, 46, 44, 82,237,223, 96, 39, 17,246,242,189,230,236, 29, 59,169,211,146, 40,152,167,205,252, 38,
+139, 50,170, 86,162, 13,116, 73,223,196,188,204,166,255, 48, 58, 62, 17,244, 10,231,137, 21,149,111,113,107,234, 26, 36,130, 65,
+175, 7,144,195,117,183,188, 28,167,143, 31,195,154, 77,155,240,236,137, 99, 40,136, 81,141,135, 88,187,118, 61,150,151,151,176,
+176, 60,196,154,185, 89, 16, 57,148, 69,129,133,229, 33, 64, 14, 71,142,159,192,214,141, 27, 80, 22, 5, 10, 39, 24,244,123, 24,
+ 47, 15, 65,202,214,173, 26,193,186,217, 25,140,169,192,236,220, 60, 94,241,146,235,181, 70,237, 73, 27,209, 41, 69, 8, 38, 64,
+ 20, 6, 66, 50,121,189,135,118, 44, 60,102, 24,148,129, 72,167,145, 50,152, 97, 40,227, 70, 91,192,197,160,142,200, 74,185,154,
+154,135,110,126, 62,219,113,177, 13, 37, 17, 94, 40,170,192, 37,226,154, 36,158, 3,200, 28,103, 74,207,180, 35,191, 57, 88, 49,
+ 28,197,223, 83, 13, 50, 64,130, 28,107,124,118, 23, 32, 50,100,173,184, 33, 58, 11, 34,249,210, 0, 75, 11,218,116, 10,139,230,
+ 29,202,209,217,183, 68, 18,194,182, 41, 46,106,226,234,207, 53, 49,200,129,173,149,154,112, 33,182, 9, 9,101,104, 89, 91,236,
+ 36,235,221, 15, 18,157, 28, 54, 9,189,223, 65, 32, 39,211, 10, 32, 27, 70, 79,122, 36,180,197, 82, 82,157, 58,246,128, 7, 78,
+ 13, 51,224, 82, 91, 85, 12,148, 66,192,152,149,188,172,142, 69,210,168,136,157, 40,210, 18,149,153,162,148,152,183,166,250,245,
+237, 98, 54, 73, 45, 81,152,188,191, 91, 12,131,210,255, 93,139,129,228, 18,178, 69, 17, 66,208,189,141,209, 98,140,153, 18, 65,
+112,140, 52,169,254, 22,203,133,146,117, 8, 73,187,182, 31, 90, 50,117,189, 57,155,168,100,144,110, 46,150, 21,224, 98,178, 52,
+ 9,131,148, 69,245, 61,105,145, 55, 39,216,155,161,195,133,141,252,104,250,100, 34,151,139, 24, 81,206, 12,176, 65,159,223,183,
+253,123,197,234,230, 3,233, 45, 65, 6,236,131,112,223,175,171, 65, 12,165,122, 60,100, 66,187, 38, 10, 29, 25,228,199,175,127,
+110,245,115,231, 32,188, 8,251, 86, 99, 34, 20,101,191,197, 21, 10,244,248,196,147,161,118, 97, 86, 81,206,192,124,247,221, 86,
+234, 15, 67,237, 31, 41, 49,140,201, 42, 75,174,168, 24,249, 54,182, 13, 82,223,139,162,136, 93, 13, 48,196, 78, 95, 42, 51,165,
+173, 86, 66,147,237, 15, 6,117,200,253, 45, 80, 90, 5,177, 88,206,138,208, 91, 18, 75, 14, 14, 34,246,207, 66, 50, 38,168, 8,
+ 90,236,211, 41,145,119,187, 78, 96, 53,227,197,194,195, 28, 55, 69,105, 87, 46, 56, 57,148, 80,126, 20,146,137,190,249, 0,211,
+ 49, 88,123, 30, 77,170, 7, 96,113,113, 25, 77,237,251,208, 11,173,151,129,253,131, 31, 14, 71, 40,139,196,180,119,206, 67,173,
+ 77, 85,227,208,167, 63,137,122,180,140, 23,191,242, 54,204,244, 10,124,231, 91,127, 2, 15,253,197,251,193,227, 33, 22, 30, 95,
+ 64,233, 60, 4,210, 40,131,114,113,121, 25,101,225,107,235,225,107,113, 52, 70, 51, 28,161,110, 24,107,102, 75,212, 34, 24,214,
+ 21,250,189, 30,202,254, 28,214,173,223,132,141, 27,215, 37, 7,174,168, 5, 50,230,163,100, 89, 86,210,118, 78,172,184, 8,206,
+217,150, 49, 14,122,193,126,115,102,109, 29,113, 45, 96,145,130,151,205, 54,150,208,182, 97,220,156,152,168,218,108,142,225,231,
+ 45,209,107, 10,211, 49,219,124, 96,101, 77, 93,139,103, 23,106,236,102,123,138,210, 35,129, 0, 20, 25,208,134, 80, 67,121, 75,
+132, 36, 42,183, 97,225, 43,111,195, 52, 58, 7,231,232,218,250,183,204, 19,109, 54,164, 65,139, 11,252,134, 80,100, 7, 25, 22,
+187, 11,152, 42,164,209,141,221,182,134,181,217,254, 66,104,235, 4,145, 21,251, 33, 43, 6, 19,136,118,148,109,146,148,157,163,
+ 76,203, 3, 77, 63,130,180, 90, 11, 13,207,154,173,142,190,121,223, 91, 2,247, 81, 21, 47, 18,187,173,148,110,144, 64,240, 8,
+ 75,200,242, 89,219,237,218, 27, 83,146, 34,150, 24,160,184,176,192, 93,171,213, 47,239, 84, 75, 37, 15,161,169,202,148, 70,245,
+220,223,151,176,199,177, 76, 84,168,189, 52, 70, 59,176,112, 32,150,172,229, 80, 44,109,205,181,121, 62,148,171,249,217,162,135,
+169, 83, 35, 35,234,101,196,134, 84,115, 13,207, 91,196,160,102,134,120,156,244,252, 76,143,179,161, 1,146,105,107, 11, 74,137,
+ 89,139,154, 18,193, 66,157, 61, 91, 15,146,161, 21,100,102, 24,136,146, 53, 93,152, 73, 17, 85,222, 36, 30, 15,142, 82,155,226,
+ 10,179, 64,114,117,194,182,212, 8,197,253, 38,180,164,229, 28, 46,246, 18,176, 58,167,129, 50, 4, 82,203, 87, 12, 95, 34,176,
+ 62,202,138, 60,181,250,207,195,241, 40, 4, 42, 45,213, 31,106,151, 70,200,200,249, 72, 82, 87, 13, 62, 47,150, 90, 76,112,158,
+136,185,146,169,203,133,236, 92,100,242, 89,138,233,188,176, 4, 97,129,160, 36,153,148, 12, 13,112, 44, 69, 41, 55, 83,157, 38,
+ 67,237, 11,241,170,180, 64,247, 51, 77,111, 16, 73, 89,189, 32,171, 21,167,122, 71,104,155,115, 96, 79,173,243, 17,160,164, 26,
+ 98, 10, 44,208,138,244, 44,249, 43, 72,110, 74, 98, 53, 43,196,115,248,169, 35, 16,110, 98,173,145,156,195,210,120,140, 53,179,
+ 3,148, 5, 97, 92, 85,232, 21, 5,198,149,215,107, 31,143, 70, 0, 8,213,120,140, 65,191,143,199, 63,255, 57, 16, 57,252,254,
+111,252, 7, 20,101,137, 2,192,160,223,195,160,215,195,114,229,135,194, 48, 51,250,189, 18,227,170,130,192, 15,201, 88, 30,141,
+193, 44,232,247, 11, 20, 13,163,110,252, 2,170, 26, 6,185, 2,131,153,121,124,211,235,111,139, 11,171, 45, 35, 24,162, 56,219,
+218, 16, 54, 49, 75,174,200,154, 95,196,212,208, 92,128,152,225,137, 41, 43, 72, 4,231,252, 10, 36,201,207,232, 88,204, 70, 69,
+ 98, 53, 64, 84, 60,196,236,108, 45,169,233,148, 64,166, 38,199,208,178,152,201,190,186,124,216,131,157, 37,146, 45,181,140, 95,
+150,152,190,137,234,175,155,145, 75,114,180, 20, 24,237,177,198,107,106,224, 17,242, 50,173,113,129,212, 20,197, 99,146, 99, 10,
+218,244, 98, 55,225, 76, 56, 36,180,248, 5,228, 67, 97, 60, 73,153, 91,108,141, 49, 25,105, 96,168,115,155,132,102,226,162,144,
+109, 69,216,149,141, 28,172, 65,199,132,166, 75, 47,135, 64,197,147,228, 82,139,132,216, 32,199,180, 44, 10, 56,107, 45,139, 74,
+104,237, 77, 56,110, 17, 28,159,171,180, 2, 80,114, 41,227, 32,194,132,180, 43,183,135, 69, 41,159,134,152, 38,231, 71, 32,175,
+191, 7, 36,207, 77,153,118,146,161, 21, 36,109,212, 91,251,136,141,234, 31, 73,166,188, 6, 35, 96, 67, 70,165, 46,163,173, 77,
+219, 6, 37, 21, 29,131,122,160,115, 46, 83,178,203, 75,244, 18, 73,124, 86, 53,209,119,171,229, 94,145, 88,178, 46,144,201,218,
+ 0,101,199,111, 76,201, 39, 75,226,148, 63,227,138, 34, 31,118,212,234,165, 78, 8, 71, 98,200, 35,244,150, 27,241, 50, 22,142,
+104, 65,100,193, 7, 46,149,213, 26, 32, 76,246,129,154,128, 51, 28,203,133,210,161,149,192, 85, 82, 28, 55,254,252,203,178,244,
+ 3,136, 96,157,108,232, 96, 56,131, 58, 93,144,112, 85, 14,140, 71,223, 85,251,193,206,155,136,100, 95,158, 16,217,154, 92,143,
+ 46,238, 65, 78,239, 79, 36,128,154,225, 79,161, 28, 34,153,180,108,242,135,194,222, 19,122,212, 79,249, 11,241, 81,164,110, 37,
+129,160,228, 73, 80, 38,170, 9,217,250,164,232, 77, 34,141,180,153,166, 79, 73,160,246,180, 23,194,228, 12,146,120,242,148, 35,
+230,129, 68,192, 33, 50, 15,110,158,141, 92,127,254,232, 57,244, 44, 34,181, 68, 65, 55,206, 88, 95, 52,113,111,112,138,207, 30,
+121, 22, 77, 93,129,185, 65, 93, 87,177, 58, 58, 28,141,209, 43, 74,159,109, 43,140,211,159,219,128,122,120, 18,194,130,254,154,
+121, 12, 6, 3, 84, 53,227,244,233,177, 95,108,250,206,204, 13, 6, 94,133, 72, 7, 6, 56, 17,148,206, 97,153, 25,131,178, 64,
+ 85,215,232,245,122, 32, 34, 44, 12,135,152,155, 25,160, 44, 29,158, 61,126, 18,189,178, 7,110,106,140,199,203, 56,122,236, 4,
+ 54,110, 88,155,193, 50, 98,153,183,166,221, 34,146,202, 44, 89, 46, 35, 31,155,118,160, 86,219, 71,116,194, 38,138,148,168,214,
+229, 35,126,223,189, 65, 17, 74, 54,218, 36, 9,208, 13, 18,181, 20,218, 82, 67, 58,153,136,100,148, 45, 6,215,154,166,103, 8,
+ 72,218,203, 45,146,234,108, 48, 16,189,100,221, 0, 70, 6,115, 5, 72, 57,108, 34,162,187,187,173,241, 6,134,106,104,235,116,
+182, 74,164,196, 54,162, 52,128, 67, 76,185, 41,240, 59, 38, 68, 64, 90,189,204,214, 1, 56,106,201,135, 76,244,242,183, 5,110,
+ 66,214, 39, 83, 85,181, 72, 3, 71, 24,165,191, 48, 55,201,137,217,128, 12, 33, 79,166,100,183,150, 36, 20, 56, 20,118,128, 74,
+ 6,189,155,126,157, 24,254,185,244,125,137,140,117, 74, 76,233,216,114,151, 79, 77,228,152, 56,132,172,131,125, 9,135, 90, 98,
+ 86, 20,196, 58, 82, 91, 30,133,247,222, 1,211, 20,106,194, 51,137,142,157,114,150, 58,209, 20, 49,129, 86, 31,125,206, 6, 48,
+192,132,164,250,105, 30, 36, 72,156, 49, 35,237, 12,147,210,115, 16, 73, 19, 1, 67,199,130,216,119, 52, 59, 19, 73, 76,254, 8,
+143,231, 78, 58, 57,115, 3,197, 74, 62, 91,195,102,246, 44, 57, 1,206,180,203, 40, 33, 86,215,190,136,121,126,156,101,238,105,
+ 38, 67,208,140,167, 72,124,211,234,166,135,240, 67,125, 89,167,206, 81,106, 73,137, 98, 67,206, 94,187, 51,106,116, 66,102, 45,
+104,171,174,214,156, 45,244,220, 52,170,231,174,164,191, 32, 98,147, 54, 58, 78,168,174,209,219,144,108,126,134,182,177,197,242,
+ 67, 13,110,252,223, 29, 5, 37, 78, 45, 89, 56,179,159, 5, 52,219, 37, 14, 91,251,221,138,136, 89,224,156,176, 37, 16, 43,111,
+ 4, 70,219, 93, 82,112, 33, 98, 20, 67,163,240, 77, 99,238,145,174, 67, 78,123, 79,222,210,102,225, 93,141, 48, 28, 43,163, 81,
+255,142, 80, 81, 18, 51, 54, 36,111,221,204,175,200,238,186, 50,169,234,100,135, 17,132,151,197,171,130,137, 78,178, 81,125,101,
+109, 43, 9,155, 3, 36,181,137, 8,113,146,187,132, 25,142, 0,196,217,134, 22,210,241,250,198,190, 55,177, 17, 79,142, 27,148,
+ 5,150,133, 49, 28,213,152,233,123,182,100, 81,248,204,170, 30,157, 6, 64,152, 25,148,168, 26,198,226,169, 83,216,176,121, 11,
+150,122, 37, 70,117,227, 55, 65,231,176, 60, 26,250,145,129, 86, 70, 49, 8,182,232,248, 64,102,193,184,174, 48, 59, 24,128, 89,
+ 48, 26,215, 94, 65,174, 44, 80, 53, 13, 92,221,224,216,241, 83, 88,191,118, 62,131,218,131, 90,156,173,205,196,105, 68, 1,253,
+ 16,153,224, 49,144,149,124, 53, 68,198, 80,219,166,224, 72, 39,166,224,185, 56,174,208,143,227,244,120,117, 32,170,177,165,150,
+144,109,183, 10, 89,181,107,101,122,208, 64,193,101,237, 31, 78,235,230,182,236,147,106,136, 97, 35, 55,235,199,229,179, 53,210,
+212, 44, 59, 36, 51,109,177,206,170, 93, 81,202, 62, 41, 40, 28, 42, 27,159,117,163, 17,155,193,144, 83,197, 56,137, 47, 47, 25,
+102,115,123,120,144,149,156, 32,201,191, 99,184,172,153,236, 98,208,106,199,132,206, 87, 56, 14, 77,153,185, 68,177, 55, 61,145,
+209,210,251, 68, 0, 56, 12, 96, 33, 81, 7, 79, 83,138, 97,134,165,107, 72,115,156, 5, 69, 98,160, 68, 78,132, 40, 74,159,107,
+ 7, 93, 56,152, 81,187, 72, 37,162, 0, 27,139, 76, 81, 28, 20,214,126,111,138,217,146,133,171,197, 74,239,134,250,109,144,193,
+ 21,180,102,129,217,174, 56,191,151,196, 32, 71, 50,205,211, 92,156,222,118, 7,147,164, 65, 56, 18, 56, 0,169,163, 36, 79, 38,
+147, 60,110,132, 30,166, 12,134, 1,165, 65, 54, 54, 75,183, 76, 86, 50, 29, 39, 25,215,128,140,138, 12,166,115,147,162, 36,107,
+ 36, 4,114, 36,169, 98, 74, 95,186, 69, 89,178,182,172, 40, 20,227,140,124,190,145,152,109,197, 12,158,100, 76, 81,176, 41, 56,
+244,240,125,192,197,206,143,148, 28,248, 18,158, 35, 81,117,194,124, 56, 82,152, 47,224,242, 9, 46, 58,223,192,197, 17,209,129,
+ 1,206,204,137, 31,224, 40,203,120,227,207, 25,103, 25,127, 39, 53, 11,129, 21, 49,117,228,209, 97, 59,145, 50, 34, 5,250, 61,
+202,160, 50,138, 82,188, 78, 91,250,166, 54,137,155,118, 91,143,150,166,146,128, 51,129,169, 40, 57, 83,208, 18,190, 49,196,218,
+248, 62,137,207,220,197, 36,178,254,189,244, 33,149,175,123, 4, 45,221,116,199, 12,219,154, 99, 86,138, 32,203,135, 36,213, 23,
+245,249,166, 40,241,248, 11, 53, 69,125,219,118, 37,236,251, 22,153, 33, 96,213,199, 77,218,187, 86,211, 55,144, 23, 96,213,128,
+ 56,158,106,186, 25,225, 85, 86, 82,132, 48, 32,236,153,135,162, 89, 61, 87, 99,101,165,123,247, 52,174,198,217, 60,106,168,180,
+160, 48,131,164, 1,161,209,127,171,112,237, 77, 47,195,145,167,158,192,141, 47,255, 90, 16,128,161, 66,242, 75,195,161, 50, 60,
+ 69,219,226, 42,136, 0,101, 81,162, 84,145, 5,209, 72,179,170,107,157, 22,212,160, 87,248,104,112,121, 92,129,133, 81, 87, 85,
+166,104, 4,115,205,217,232,191,144, 49, 81, 94, 55,247,218,238,156, 36, 19, 57,100,233, 14, 73, 46, 55, 17, 81,200, 78,203,108,
+ 73, 90,218,210, 10, 25,184,109,106, 68,106, 90,145, 60, 91, 63,169,195,133,214,142,192,218, 13, 89, 92, 40,163, 56,202,213,163,
+ 34,251, 29,173,172, 79, 12,107, 85,210, 6,220, 18, 80,200,115, 24, 74,157,253,193,225, 18,181, 27,125, 16,219, 71, 60, 36, 10,
+149, 52, 77,187,173, 0,145,181, 43,206,212,182, 96,201, 70,148,205, 80, 16,177, 51,149,146,243,139, 14, 10,100,155,225,162, 79,
+200,199,103, 74,222, 16,171,151,203,146, 90, 94, 60, 25, 87, 51, 39,146,108,150, 52,155,169,125,118,220,170, 95, 86,166, 59,192,
+ 20, 41, 73, 18,209,146,219, 36,166,192,117,224, 0,199,230,211,206,196, 8,122,132, 88, 35,182, 51,217,193, 62, 48,226, 33, 72,
+ 34, 34, 17, 1, 9, 1, 0,251, 47, 49, 74, 92, 4, 85,253, 10,231, 10, 43,201,153,158, 54, 66, 93, 82,153,195,177,211,134,124,
+184,203,196, 96,237,121,134, 89, 31, 96,117, 4,196,233, 86, 50,130,182,169,231, 6, 24, 73,207,164, 51,155, 36,118, 41, 76,159,
+ 12,239,155, 75,181,220, 4,231, 90, 4,131, 98,141, 84,136, 38,152, 16, 20, 59,143, 12, 72, 74,212,154, 1, 96, 42,237,148,214,
+ 84,210,247,144,216, 27,221, 46, 13, 4,105, 94,114, 97, 94, 61,153,245, 69,137,231, 65,148,173, 59, 43,109, 28, 70,139, 6,212,
+213, 75, 35,187, 52,146,137, 2, 1,149, 50,132,201, 41,113, 55,188, 75,206,200, 69,219, 36, 37,188,115, 58, 10,188, 36, 0, 0,
+ 32, 0, 73, 68, 65, 84,161,134,207, 38, 0, 12, 74,151, 81,111, 29,201,199, 72,208,111, 23, 63, 27,157,245,123,193,175, 4,132,
+ 66, 68,208,112,147,246, 34,241,254,195, 78,117,131,109, 73,164,196, 92,247,113,163, 51,252, 62,149,108,142,242,208,136,153,191,
+ 29, 10, 37, 58,180,220, 7, 84, 72, 63,239,204,190, 23,190, 96,255, 68, 82,126,148,212,233,226,242, 9,209, 65, 61, 44,181,170,
+113,246,247, 41, 35,234,210,122,200,123, 7,219,142,189,165,228, 99,213,128,226,203,202,118,244, 29, 71, 93,223,168,193,203, 86,
+218,207,244, 42,178,209,225,209,122, 19,115,146,158, 36,146, 76,252, 97,113,113,217, 7, 14,141,143,114,234,198,183,156, 21,206,
+161, 95, 22, 40,136, 80,150, 69,132,194,250,101,137,178,232,163,152,157,135, 48,112,232,211, 31,199,184,169,241,249, 79,126, 12,
+227,170,194,203, 95,181, 3,227,186,194,134,181,107,245, 77,115,168,234,198, 75,198, 58,160, 44, 11, 12,250, 61,144,136, 23,187,
+209, 40,221, 57,194,241,197, 37,204,246,122,145, 88,151, 74, 19,146, 79, 6,138, 44, 71,142,242,165,105,148, 31,162, 4,104, 24,
+132, 32, 46,159, 96, 21, 54, 1,103,156,142, 29,202, 50, 89, 99, 74, 10, 70, 54,243,112, 83, 69,104,166, 8,186, 8,229, 26, 1,
+ 1, 89, 9, 66, 40,166,219, 33,114, 57, 38,184,149,147, 35, 97,197, 56,202,168,195, 45,148,195,210,102,186, 86,206,140,165,169,
+248, 88,104, 65, 19, 35, 85, 26, 53,229, 51,114,147,133,227, 97, 20,183,140,164,177, 21,179,176,172,233, 48,120,130, 37, 35,228,
+196, 8, 91, 82,237,212,190,131, 18,186, 61, 36, 10,132,167,241,161, 44, 57,201, 52,176,163,197, 8,183, 4,210,164,101,180, 90,
+129, 32,145, 28,249,137, 63, 67,177,191,154, 68, 38,180, 30, 98,214, 26, 39, 80,229,239,123,220,140, 89, 50, 93,124,137,242,169,
+152, 8, 30, 17,218,121, 76, 32, 33,176, 68, 73, 49,245, 85, 35,252, 98,158,141,207,168, 57,237, 5, 52, 89,167,181,161, 74, 10,
+170, 36, 15, 54, 40,149, 33,185, 13,141, 74, 18, 77, 2, 75,150,240, 39, 62, 71,198,203,205, 62, 61, 49,202,105,226, 93, 65,220,
+226, 91, 68,172, 9,173, 13, 67, 80, 36,100,196, 1,123,111,195,181,132,239,179,233,148, 32,228, 60,135, 48,242, 52,116,228,132,
+163,166,161, 73,146,205, 46, 0, 1,133, 43,226,160,162,232, 48,212,171, 57, 87, 68, 97, 21,114,102,158, 67, 0, 50,201,229,142,
+202, 12,244,137,229, 39,201,131,218,144, 64, 74,227, 29,116,200,128,227, 57, 74, 80,144, 53, 3, 89,180,131,136,117,104, 87,211,
+ 48,184,209, 49,172, 77,157,178,114, 32,118, 68, 89, 2, 50,195,195,222, 81, 44, 42, 32, 18, 57,180,153,141,169,181, 51, 8, 97,
+184, 72, 97, 55,178,247,204,197,224, 76,217,245,225,190, 24, 71, 14,195,213,128,209, 52,136,226,109,118,202, 69, 91,116, 62,102,
+185,108,245,197, 57,204, 40, 48, 67, 63, 16,107,189,118,147, 72, 91, 40,219,109,120, 5, 39,159, 34,130,232,192, 17,156,120,138,
+174,194, 20,157,160,205,139,200,168,108, 57,119, 49, 14, 61,147, 73, 53, 21, 54, 2, 78, 28, 59,225, 33, 40,120,249, 63, 2,161,
+225, 6,117, 93,107, 61,165,193,104, 52, 6,115,131,126, 89, 2, 68,168,235, 10, 11, 39,142,162,225, 6, 27,182,222,128,134, 5,
+ 47,189,237, 27, 12,190, 35, 24,142,198, 24, 85, 99,140,171, 58,182, 69, 48,252,139, 52,211,239,163, 17, 86, 38,188,175,217,215,
+117,131,133,209, 40,190,126,161,143,211,207,219,181, 44,247,124, 59, 34,219,218,100, 7,107, 24,173,104,103,128,203,164,146, 45,
+134, 69, 45, 6,178,150, 73, 73, 13, 66, 38,114,146,213, 67,219,210, 29,212,230, 42,133, 12,151,242,108, 27,121,139, 86,166, 23,
+109,163, 11,203, 4, 55,127,177,226, 58, 73, 93, 56,135, 80,217,246,173, 74,171,218, 51, 85, 75, 88,226,191, 37, 93,123,125,233,
+172, 88,106, 32,188,105, 28, 76, 98, 39,138, 33, 23,167,205, 88,226, 73,166,151, 34,113,200, 8,250, 68,213, 50, 78, 65, 26,101,
+218, 95, 25, 76, 30,223,190, 22,196, 40, 33, 40,161,164, 4, 25, 70,242,146,221,180, 76,123, 90, 32, 40,146, 61, 79,194,196,108,
+121,201,158,181,237, 85, 70,134,186, 80,198,189,227, 68,226,212,233, 86, 86,212, 40,238, 27, 20,200,119, 81,245,121, 42, 7, 46,
+194,254,161,198, 14,110, 73,133, 74, 84, 49, 51,110,193,168,119,229,124,177, 40, 50,100,180, 54,108, 41, 50,246, 12, 35,100,237,
+ 12, 59, 37, 38,244, 9,199,251, 41,161,149, 44,105, 21,248,252, 52,100,165,105,221, 83, 32,113,197, 72, 59,188,236,110,146, 44,
+103, 27,180,173,139,151,244,222,230, 51, 1,140, 78,122, 8,244, 97,203, 89,146,222, 99,147,210, 57,231,224,108, 79,186,146,195,
+130,222,187,207, 56, 11,159, 25,234,181,123,135,238, 34,170, 22, 58, 57,156, 74,202, 22,133,255,221, 66, 29,149, 11, 35, 91,173,
+ 35,183, 42,117, 10,213,219, 57, 66,174,165,230,232,249,110,118,176, 10, 18,236, 30,158,101,244, 13, 65, 17,206, 59,239,166,110,
+208, 52,141,255, 59,135,191,115,212,211,136,109,108,234, 44, 89, 19, 75, 7,167, 1,143, 18, 53, 77,247,149,237,112,119, 33, 8,
+ 50,219, 64,108,136,117, 9,225,240,221, 49,138,166, 4, 84, 80,133, 5, 82,128, 99,191,144, 79,162, 20, 35, 8,133, 92, 1,218,
+143, 94,109, 49,207,132,109, 61, 90,157, 2, 27,117,247, 72, 40,230, 76, 73, 40,239,191, 73,176, 23,104, 50,235,130, 89,148,147,
+ 28, 21,214,246, 12, 59,136, 65,219, 54, 72, 7, 83,232, 57, 18,115, 75,228,134,236,123, 97, 90, 30, 82,231,163,136, 96,225,244,
+162,214,147,201,179,212, 65, 24,143,125,125,189,212,197,219, 43,129,186,241,196, 57,144,111,145,224, 10,168,171, 17,158,125,250,
+ 49, 12,102,102,240,248,231, 30, 1, 1,248,252, 35,159, 0, 1,232,247,123,168, 71, 77, 28, 70, 32,194, 56,185,176, 16, 33, 38,
+ 17,160,170,106,172,157,155,135, 84,181, 31,104,239, 28,150,171, 10, 27,230,215,224,116,229,137, 30,253,126, 79, 51, 28,202,231,
+239,138,117,193,212, 98,213, 6,232,135, 12,196, 76,217, 52,159,216,113,102,183,106,163, 75, 60, 65,143, 54, 3, 53,200,144,220,
+178,246,193, 54,241,200,202,123,107,187, 80,222,114,225,107,242,118,236, 99,204,146, 69,114,162,178, 76,225,115,153, 56,173, 61,
+168,102,210, 25,168, 82,129,149, 14, 13, 45,110, 25,231, 35,109,226,169,205, 44,245,213,195,204, 18,143,165, 49,237,237,204, 58,
+ 92,166,192, 24,241, 92, 41,193,241,161, 15, 56, 69,252,172,253,209,173,241,243, 18,102, 48,152,153,105,140, 56, 0, 36,100, 22,
+ 4, 2,113, 11,128, 96, 1, 59, 10, 50,243,217, 72,212, 28,166, 53,109,164,166,181, 85,178,225,174,148,156, 94, 62,201, 41,118,
+ 8,180,159, 81, 18,182, 73, 90,123,249, 12,119, 51, 44, 40, 8,231, 68,213, 62, 76,165,234, 83, 91, 47, 64,245,216,147, 2, 27,
+199,231,149,230,215, 75,116,238,217,244, 0,178,104, 78, 54,217, 52,107,129,202, 90, 0, 67, 16, 73,166,149, 80, 34, 56,103, 54,
+ 90,151,171,203,181,230,149, 59,180,180,173,197,138, 31, 18,236,188, 0, 1,161, 61, 79, 35,146, 11, 57,239, 48,177,179,110, 61,
+175, 34,172, 11, 21, 91, 49,163, 93,237,177,157,115,153,106, 92,204,150, 93, 75,103, 32, 4, 51, 68,190,215, 60, 78,201, 19, 52,
+ 65, 52, 74,133,167,156,107, 41, 43, 82, 62,226,216,103,252,105, 52,107,210,180,160,212, 70, 28, 7, 5, 39,129, 32,230, 38, 14,
+191,137, 18,183,133, 75,101, 73, 50,194, 92,234,152, 27, 69,101, 61,161,206,255, 25,153,229, 68,102,142,186, 29,147,202,113, 63,
+ 72,202,143,169,123, 37,182,232,177,164,246, 27, 55,169, 55, 24,144, 27, 50, 12, 85,201, 36,131, 77,144, 21,249, 59,129, 59,192,
+ 42, 69,226, 64,196,121, 48, 38, 0, 49,197, 86,207,128,162,147, 16,202,188,161, 82, 90,157, 48,126, 55,242, 7,102,211,159,138,
+ 9, 40, 46,141,158,155,218, 20, 58,165, 49, 81,114,134,240,180, 22, 56,246, 83,222, 66,157,201,129,253, 66,182,222,195, 33,155,
+203,237, 29,131, 74,144,186,164,162, 22,115, 78, 2, 78,159, 60,141,113,237,235,215, 2, 65,175, 40,177,204, 67, 52, 77,131,254,
+ 96,128,186,174, 32,240, 80,249, 76,191,143,209,104,140,185,217, 1, 54,109,187, 9, 71,190,244, 8,120, 48,131,151,221,246, 26,
+ 60,253,248, 33,156, 60,113, 12,142, 8,195,209,216,143, 38,212, 23,164,105, 26, 12,202, 18,245,104,236,181,221,105,140,126,191,
+135,162, 40, 48, 28,143, 49,110, 24, 85,195, 88, 55, 59,139, 90,251,218,157,115, 40,203, 30, 54,110, 92, 23,235,137,177,255,156,
+217,108,162, 86, 5, 44,180, 85,153, 94,243,168,180,102,180,187, 44,164, 68,105, 44,166,100, 67, 74,108,168,224,235,255,206, 76,
+168, 10, 42, 82, 97,174,125,222, 56, 39,173,201,126,121,223, 53,199,217,229,158,228, 68, 26,192,145,132,201,112, 45, 18,211, 20,
+190,101,158,151, 80,182,137,197,122,174, 81, 81,131, 76,226, 16,150, 71,156,103,255,105, 2, 93,128,140,109,227,115,248, 94,224,
+ 4,196,106,136,157, 75,206, 98,117, 39,178, 94,110,225,212,182, 66,198, 25, 11,155,156,188,213, 58,101, 59,157,216, 16, 62, 67,
+141,207, 41,113,148,156,146, 73,131,206,187,248, 25,223, 78, 18, 19,158, 29, 69,114,171,125, 95,218,155,181,125, 7, 73,157,184,
+152,110, 5,145,156, 0, 75, 10,115,199,158,121,211,233, 64, 25,137,141, 99,166,159,235,148,103, 19,118,114, 69, 61, 76, 8, 69,
+182, 58, 28, 36, 99,185,219,254,125,138,165,193,228, 40,136,172, 64,147,245,226,148,149, 49,210, 90,111,165,248,148,143, 41,182,
+208,126,186, 75,138,244,132,153,245,122,151,153, 57,102,169, 57,243,145,211, 92,108, 10,124, 0,100,186,237, 54,224,152, 54, 5,
+176,173, 25, 21,118,125, 7,211,150,200,137,241, 30,186, 76,194,181,123,213, 56,202, 97, 95,171,141, 96,113, 35, 93,119,100,160,
+255, 70, 91,192,188, 2, 96,174,139, 62, 57,113,209, 62, 11, 23,201,150, 68,200, 4,154,172,200, 85, 88, 19, 33,147, 46, 92, 17,
+209, 95,231, 92,154,188, 9, 74, 67,138,204, 40,213,144,145, 55, 77, 29,255, 30,123,244,141, 80, 87,252,121,110,180,231, 62,105,
+ 75,216, 32, 83,135, 56, 71,228, 55,170, 37,162, 77, 0,213,142,132, 48, 98, 23,173,115, 13,156, 37, 50, 8,160,238,183,206,121,
+242, 46, 69, 1, 53,153,168,171, 71,158,131,225, 87,121,137,140,118,125,187, 85, 15, 20, 29, 73, 10,133,183,152,181,206,110,136,
+ 45, 97, 81,115,224,146,172,248,229,235, 19,225,207,188,248,152, 71,201,109,146, 92, 32,207,217,241,120, 98, 4, 99,236, 53,112,
+ 24, 61,104, 4,228, 34, 99,217, 17, 10, 48,164,105,188, 4,108,221,168,100,107,129, 94, 89,128,149, 17, 63,211,239,193,145,195,
+250,205, 91, 81,169,254,239,242,242, 49,204,111,220,140,211, 39,142,161, 26, 46,225,213,111,216,229,213,102,185,129, 43, 28,230,
+103,103,209, 48,163, 87,122, 24,107, 92,215, 40,138, 2,133,214,123, 78, 46, 46, 97,118,208,143, 47,224,160, 87, 2,240, 67, 7,
+ 22, 70, 99,175, 66, 87,246, 48, 63, 55,171,114,170,109, 26,109,170,135,199,214, 51,251,242,155,121,213, 46,209,182,180,166,149,
+ 48, 45, 50,138,167,121,123,143,100,217, 64, 96,165,102, 37, 12,161,137,193, 47,177,254,101, 75, 30, 90,190, 97, 93, 63,196,169,
+133, 26, 74, 64, 10,179,128,197, 12,150,144,150, 86, 84,156,108, 36,156, 70, 92,154,246,162,118,247,228,132,212,138,149,234, 52,
+ 67, 12, 68, 18,135, 36, 70,246,150, 36,152, 21, 74, 41,211,207, 15,181, 62,150,198, 16,120,130, 99,160, 68,214,202, 6,236,104,
+ 13, 60,124, 46, 11,218,255, 99,109,243,226, 64, 52, 3,155,169, 76,173,254, 85, 54,255, 29,122,241, 37, 5, 54, 96,210,251,173,
+193,179,133, 36, 3, 4, 30,202, 14,148,106,255,210,170,101,135, 76,172,197,106,136,108, 98,182,147, 22, 37,181, 77,198, 0,165,
+213, 18, 55, 65,101,148,156, 4,152, 56, 19, 50,225,208,167,195,242,100,134,104, 27,213, 48,131,246, 81, 70,152, 82,189,110,201,
+133,142,243,121,164, 48,219,116,104,219,203, 87, 88, 22,236,138,145,155, 13, 29, 30, 46,175,215, 75,187,141, 78,196, 16, 6,242,
+ 0,208,101, 89, 94,154, 56,103, 62, 61,149, 49, 12,172, 67,100,106,187,217,180, 64, 51, 77,143, 18, 73, 47,100,238,147, 95,100,
+198,172,166, 26,175,135,213,139, 52, 34,150,124, 59,168,139,208,121,129,162, 40,227,248,223,144,177, 7,146, 96,132,241,245, 68,
+ 67,223,246,196,231, 26, 52,193,249, 2, 70,230,208, 3,195, 62,252,142, 85,215,203,196, 36, 3, 57,142, 5, 77, 93,163,174, 27,
+ 84, 85,237,137,208,152,206, 35, 98,110, 98,176,224,200,151, 79,146, 14,135, 24,181,196, 0,173,135,243,180,237, 78, 65,207, 90,
+ 75,145, 86,239,194, 64,240,158,187,160,196,193,120,222, 78,255,219,150, 63,146,178, 95,212,197, 55,130, 57,193, 23,184,194,151,
+ 67, 74,180,198,132,144,233,201,204, 96, 40,153, 16,157, 50,208, 12,173,208, 44,211,122, 43,173,112,185,157, 18, 51,201, 87,206,
+179,179,168, 84,197, 16,118, 81, 40,193,139, 83, 72, 28, 66,224, 34,220, 75, 81, 82,214,129,252,239, 56, 54, 12, 73, 15,195, 4,
+120,123, 92,215, 62,219,169,189, 64, 76,207, 17,234,154, 1, 97, 28,121,230, 73,112, 53,194,104,236,176,112,228, 41, 12, 6, 51,
+ 40,202, 30,190,252,249,207,224,137,199, 31,195,168,170,176,118,205, 90, 84,227,177,207,206,123, 37,198, 85,141, 97, 85, 65, 64,
+168,155, 38,146,237,106,102, 44, 44, 15, 65, 68,232,245, 6,168,234, 6, 84, 20,126,254,122,120,193,138, 82,231,117, 91, 49,127,
+ 51, 92, 7,118,214,181, 68,169,195, 12,246, 19, 35,131, 73,169, 79, 55,204,204,134,115,153, 34,244,228, 20, 44,155, 53,234, 94,
+227,236,224, 22,179,155, 68,180,148,147,243, 34,211,111,203,105, 10,154,103, 44,167,169,123, 18,250, 67,109,123,173, 33,107,181,
+ 59,118,227, 16, 26,178, 67, 56, 90,157,226,148, 21, 9,162,212,162, 19,203,206, 78, 45,163, 97,164,102,232, 63,149,168,222, 37,
+ 26,116, 80,236, 7,141,130, 22,198, 65,184,150,246, 66, 28,251, 72,156,177,201,145, 57,121,239,192, 11,177,100,191, 21,212, 81,
+168,213,156,110, 80,155, 80,243, 13,176, 60, 59, 91,190,240,170,140, 76,126,233,199,214,161, 48,140,195,190,139, 54, 72, 20,153,
+144,205, 76, 34,142,100,230,232,217, 88, 79,166,242, 44,237, 32, 22,137,189,221, 70,183,222,204,125,151,172,165, 73, 50,233,145,
+ 51,193,240,217, 24, 85, 73,112,106,212,172,104,135, 1,217,230,150, 15,222,153,210, 56, 17,215, 77,148, 97,166,214, 84,251, 48,
+ 69, 80, 44,145, 9, 57,220,218,216, 50,132, 76,209,185,207,203,148, 97, 70,121,128,217, 61, 69,194, 64,237,220,234, 56,105,151,
+ 17,172, 82,154,178, 15, 98,150, 78, 65, 61, 15, 58,142, 52,192,238, 6, 50, 55, 53,121, 24, 30, 68, 12,214,194,126,194, 9,201,
+115, 10,201,103, 72, 79,166, 84,103,136,166,217,176, 22, 50,138,138,166,110, 76, 73,167,159, 57,101,229,126, 86,130, 68,134,184,
+216,121,246, 45,191, 21,148, 61,155,198, 19,228,170,186,246, 28,170, 68,244,241,218, 17, 66, 25, 79, 34, 76,172, 75, 36,107,219,
+136, 18,208, 38,198, 36, 5,210, 8, 71,233,154,119,128,202, 70,103, 58,133,177,220,148, 20, 32,205,200,229,176,133,168,108,113,
+ 80,252, 76, 3,113,104, 82,217,207,204, 97,119, 44,148,181,123, 69,198, 97, 22, 62, 79, 97,173,179,105, 77,139, 10, 44, 33,171,
+ 15,132, 54,253, 59,244,239, 33,123, 54, 53, 58, 33, 78, 45, 64,132,148,157,104, 54, 79,166,221,133, 77,165, 52,157, 15,199,122,
+ 37, 43, 16, 71,129,212,162,217,138, 85, 4,139, 49,184,246,126, 18,128, 82, 91,202,250,101,225,219,203,156, 67,195, 13,230,103,
+ 6,216,114,205, 45, 24,204,204, 97,203,213,215, 2,101, 31,107, 54,109, 65,175,244, 83,220,142, 61,123, 24, 47,191,237, 53, 88,
+ 92, 90,192,220,204, 0, 77,211, 96, 84,213,202,180,244,109,109,142,128,217,193,192,215,128, 32,168, 89,191,154, 26, 53, 51,150,
+ 70,227,232, 84, 3, 89,197, 75, 19,230,186,190,100,178, 53,203,254, 15, 25, 88,128,122,196,180,240,196, 44, 34,132,240,118, 19,
+110,181, 33, 89,214, 54, 66, 95,188,164,146, 70, 32,240, 49,114,221,255, 64,223, 98,180,178, 89,210,101, 31,251,131, 36, 66,164,
+ 60, 49, 34,217, 8,187,132, 54, 42, 34, 67,185,204, 59, 47,114,246,148,196,129, 9,145, 68, 23,200,147,100, 21, 28, 13,177, 44,
+ 38, 74,170,142, 38,134, 32,195,166,156, 64, 28, 29,122, 26,128, 3, 21,188,104, 98, 61, 92,226,255, 35,102,171,196,100,250,105,
+ 83,125, 79, 32, 42, 78,228,215,107, 28,243, 40,156,190, 56,253,221, 18, 75, 83,135, 8,167, 64, 79,251,158, 67, 86,151, 58, 40,
+212,137,178,168, 42,168,126,166, 81,174, 11,186,213,130, 28, 41,105,223,239,201,247, 62,139,194,210,103,154, 54, 73, 43, 92, 69,
+ 81, 48, 37, 61,191, 88,213, 21, 35, 14,131, 73, 7, 43, 88, 89, 60,110,162,102,151, 77,198, 59, 67,154, 17, 54,114, 90, 33, 98,
+160,182,124, 31,197,169,122,202, 11,211, 44,204,244,173, 83,171,141,156,114, 53, 72,106,117, 81, 96, 66, 74,139, 90,221, 30,198,
+147,184, 86,187,154,107, 49,227,205, 88, 86,202,113,174, 40, 72, 67, 38,211, 11,191,227, 29, 58, 50, 88,215, 33,104, 13,248, 36,
+ 32, 62,203, 56,121,209,153,181, 71,113, 47, 45,202, 66,229, 97, 93,100,118,123, 2,155,194,234, 14,169, 62, 29, 51,207,148,201,
+187,200,138,183,146,185,164,173,202,105,176, 76, 96,170, 23, 81, 28, 42,181,232,218, 54, 82,219, 6,157, 72,113, 77, 84,147,108,
+ 19,130,195, 20,202,162, 40,163,148,173,247, 17, 46,106,110, 8,145,233,232,165,201, 24,144,146, 34,166, 21,220,203,180,236,145,
+ 51,252, 67, 64,235, 5,156, 92, 22,236, 64,149, 78,227, 61, 34,151,142, 31,136,225,132, 72, 96, 12, 51,217, 75,112,254, 66,112,
+107, 60,173,172,192, 90,138,145, 2,135,112, 86, 38,226,104, 17, 51,255, 91,108, 41, 44,133,161, 1,182,117,150,221,141, 41,155,
+ 61,165,193, 47,241,150,138, 85, 78, 50, 58,187, 70,137,201,104,142,102,173, 98,126,212,167,160, 87,150,104,154, 26,243,131, 1,
+ 70,227, 49,170,122,236,135,174,136,160,156,219,128,227, 79,126, 26, 69,217,195,194,210, 50, 94,243,134, 93,216,126,243, 45,248,
+224,159,189, 15, 36,192, 51, 95, 58,132,195, 95,250, 2,250,189, 62,150,199,190,166, 94,150, 61,204, 14,250,168,235, 26,131, 94,
+137,134, 25,101, 81,196, 81,123,131,210,143,101, 45,156,195,145,133, 69,108,219,176, 14, 39,135, 21,138, 94, 15, 69, 81, 98,118,
+118,198,103, 98, 46,205, 44, 14,197, 62,150,233,140,104, 10,178,139,236, 23, 0,135,137,116,176,253,216,200,148,203,108,224, 22,
+ 56, 11,140, 92,217, 40,219,148,178,150,173,148,169, 5,137, 9, 10, 45,121, 81,166, 53,137,150,136,233,105, 98, 74,117,223, 24,
+ 93,147,180, 16,137,244,220,216,170,139,232,132, 59,255,236, 56,109,182,176,227, 34,131, 10, 21, 71,201, 76, 49,122,216,164,208,
+180, 85,147,226,214,231,133,209,138,108,200,149,137, 59,146, 90,184, 66, 95,139,100,163, 63, 13, 98,160,199,229, 88, 71, 87,149,
+190,224,148, 57,241, 69,242,250, 51,226,125,137, 44, 0,201, 21,195, 72,167, 6,186,194,194,143,108,228,118,124, 20,204, 58, 84,
+ 66,140, 70,180,100,105,182, 81,217, 50,138,102, 98,186,223,192, 6,125,137, 66, 40, 73,150,215,151, 83,147, 42,144,114,134, 18,
+ 75,191,157,221,218, 50, 9,193,140,172,157, 14, 86,156, 13, 0,204, 37,116, 8,171,177,188,145,195,134, 14,156,195, 35, 97,202,
+ 24,153,214, 59, 3,106, 83, 28,147,166, 3,131, 56,189,127,209, 39,187,150,242,102,139,219,145,184, 32,110,146,247,145,205, 23,
+183,172, 58,202,185,158, 73,141, 52, 58, 5, 59, 54,171,112, 69,108, 75, 99, 70, 44, 9, 6,168,215,182,208,132,121, 9,206,160,
+118,182, 68,193,204, 41, 73,114, 80, 72,156, 50,193, 28,178,228,195, 88,254, 12,106,129,206,148,170,195,250,119, 25, 71,130,136,
+ 98, 80,235, 91,227,200, 59,101, 29,155, 29, 71,126,235,180,199,208, 53, 97,133,148, 66,128,236,235,233, 77, 36,163, 89, 50, 91,
+ 82,190,243, 14,157,168,137,158,200, 19,209,196, 50,132,162, 44,117,202, 76, 12, 91, 39,102, 17, 46,130, 97,105,248,139,100,157,
+ 63,225,222,164, 89, 42,100,106,234,118, 48,140,164,128,146,243, 82, 41,105, 96, 6,145,172, 75,170, 4,113, 6,173, 39, 69, 31,
+ 51,164, 37,235,103,150,140,167, 22, 82,175, 0,133,100, 68, 76, 59,156,200,234,104, 68, 70, 11,155,177,144,211,129,252,124,240,
+165, 73,241,162, 94,117, 11, 70,206, 98, 88,154, 96, 67,199,222,123, 34,148, 17, 46, 42,252, 20, 33,125,249, 26,205,134,150, 22,
+142,227,170,235,191, 22, 60, 94,192,177, 35, 95,196,167, 63,246, 55,248,228,223,124, 16,235, 55, 95, 5, 1,225,196,201,147,216,
+214,239,163, 87, 56, 85,193, 35,148,206,197,186, 76,165,208, 59, 0, 63,190,213, 17,102,250,125,212, 44, 88, 30, 87, 40, 11,135,
+186, 97, 12,122, 5, 26, 16,138,178, 84,121, 88, 49,154,202, 18, 85,138,194,128,157, 48, 53,203,110,154, 17, 2,247, 51,106,125,
+238,172,218,249, 17,226,146,164,241,237, 95, 26,191, 33,179,102,186, 97,238, 73,156, 2, 7, 50,125,242,134,237,108,170,171, 78,
+ 18,250, 18,235,178,156, 72, 81, 65,226, 19, 58, 14,212, 73,194, 84,108,251, 90,116,128, 97, 58, 17,115,166,227, 13, 51,200,193,
+ 51,211, 3,228,201, 89,192,152, 90,188,210, 12,108, 47, 96, 37, 73, 97, 43, 34, 55, 64, 24, 9, 89, 40,155,214,127,110,153,129,
+153, 81,225, 76,161, 6,110, 56,173, 85,105,203,184, 38, 90,158, 93,155, 2, 21,120, 42, 10,253,188, 34, 5, 9,246,250, 76,201,
+139, 84, 97, 42,228,211, 4, 23,181,180, 35,177, 49,100, 53,113,104, 31,231,141,202,177,158,140, 9,101,177, 72, 40,139,178, 90,
+220,226, 34, 80,171,213, 43,144,138, 16, 21,247, 40, 4, 63, 42,247, 25,131,125,215, 30, 18, 99, 2, 35, 59,121,197,220,171,152,
+113,146, 13,206, 87,204,203,243,242, 92,212,126,225,216, 98,149,139, 17, 37,169,209,192,160, 13, 90,242,137, 8, 53,173, 16, 73,
+ 9,134,119, 48,210,190,237, 18,164,164, 64,144,108,201, 48,239, 81,166, 76, 7, 46, 47, 97, 50,114, 7,146, 53,168,144,157,146,
+150, 35,169,100,122,150,153,217, 19,192,180, 86, 27, 90,191, 66,171, 24, 55, 18,117, 50, 98,155, 20, 81, 38,193,148,207,141, 87,
+209, 42,167, 8, 90,211,100,196,217,162,176, 61,247, 57, 1,218, 73, 88,181,177,196, 28,157, 65, 40,231, 37,161, 75,255, 57,129,
+136,234,153,232,161,110,158, 72,114, 94,110, 22,170, 54,154,200,133, 68,173,210, 93,107, 46, 58,194, 88,101,211,198,203,202,107,
+113, 74, 28, 12,170,116, 65,143,159, 73, 91, 65, 57,181,157,197,202, 39,153,207,182,129, 89,144,221, 38,192, 69,178,182, 41, 67,
+181,231, 8,180, 53,227, 69,172,248,167, 41,253,132, 32, 68, 52,177, 9,247,197,206,201, 86,241, 25,145, 0,185,251, 47,110,101,
+135,137,248, 99,107,104,169,190,153,106,103,134,244,134, 51, 4,205, 52, 33,142,213,170,213,139,165,192,228,108, 80, 3,101,194,
+181,136,176,164,250,222, 36,166, 47,218,136,230,135,105, 70,202,222, 44,200,161, 17,193,112, 60,246,255,173, 26,224,145,128, 87,
+244, 81, 22, 5, 6,179,115, 16, 42,192, 53, 99,241,228,113, 44, 46, 46,224,153, 47, 61,134,222, 96, 6,223,243,223,253, 4,234,
+162,244,181,113,125, 57, 6,253, 1,234,170, 78,217,164, 58,152,165,209, 24,131, 94, 15,195,170,194,184,174,209,176, 96,195,220,
+ 44, 78, 15,199,168,106, 61,167,162,196, 11,182,108,138,189,150,137,188, 20, 72,129,156,228, 14, 37, 13, 95,136,176, 40,155,249,
+246, 22,170, 14,144, 61,146,140,161, 71, 99, 57, 85,134, 2,195,219, 44,120, 59, 37,203,142, 68,146, 76, 95, 32, 65,157,108,234,
+ 90,220, 22, 54,209, 46, 4, 22,195, 3, 8,115, 5,140,144, 17, 49,167, 32, 66,213, 5, 41,178,153, 13,124, 27,127,143, 50,105,
+214, 56, 6, 83,130,214, 66, 18, 72,162, 92, 26, 33,169, 25, 6,229, 53,105,201,111,138,129,230,194,116, 36,150, 76,125, 74, 40,
+ 7,224,115, 18, 25,199,243,138,194, 74,113, 77,152,222,232, 86,105, 43,150,106, 57,215,235, 79,207,133, 18, 82,144,137,210, 24,
+116, 44,148,182,192, 38,112,208, 94,238,160,206,198,162,153, 10,183, 4, 95,194, 62,192,185, 32, 13,172,120, 14,101, 68,218,168,
+ 55, 96,166,136,137,161,109,103, 34,128,182, 93, 78,194,212,202, 40, 87, 25,167,168,145, 33,246, 77,213, 70, 18,163,192,199, 45,
+238,129,180,178, 98, 91,231,117, 98,250,122,157,105,119,181, 12,193,212,226, 16, 55, 99, 73, 45,124, 81,232, 73,200,204, 6, 32,
+ 51, 73,139,205,242, 79, 67,149,162,138, 95, 40,115,218,182,219, 22,105, 88, 72, 75, 58, 38, 88,229,156, 85,232, 51, 92,211, 50,
+ 23, 25,236, 70,183, 59,206,107, 15, 12,106,231, 38, 71,146, 78,169,123, 72, 8,204,213, 43,251,178, 81,202,240,139,162, 0,156,
+ 33,109,121, 41,184,188,175,218, 64,203, 20, 9,114,234,244,200, 32,136, 81,243, 31,255, 63, 97,111,246, 99, 91,114,157,249,125,
+ 43, 98, 15,231,100,230, 29,107, 30, 72,170, 36,138, 20,233,150,186, 5,171,101,116, 75,110,184,219, 48, 32, 24, 48, 26,232,191,
+200,127,134, 31,253,228,126,148, 31,236,110, 64,178,101,169, 53,176, 73,113,144, 72,113, 38,139, 44,214,112,235,142,121, 51,243,
+ 12,123,138,181,252, 16, 17, 43, 86,236,147, 37, 65, 40,136, 53,220,123, 51, 79,238, 29,177,134,239,251,125,102,135, 78,122,113,
+113, 96, 13,132, 17,161, 74,114,185,114, 89,150,181, 29, 71, 46,124,254, 51,172, 80,147,211,174, 29, 82, 83, 37,157, 21,168, 57,
+ 87,196,150, 84, 32,102,214, 17,161,250, 3,171, 76, 87, 47, 58,106,105,163,229,189,171,104,196,184, 42,210, 42, 33,186,190, 44,
+182,195,178, 17,196,184, 21,204,231,174, 68, 63, 65, 99,219,107,170,140,198,183,248,128,233,246,193, 23, 85,152, 68,185, 69,151,
+ 34, 56, 17,114,219,148, 49,183,166,136,153,172,100,103, 3,102,114,221, 71,144, 21,196,135, 20,209,103,224, 29,154, 10,100, 98,
+158,211,142, 39,121,140,208,121, 31, 83,216,230, 9,125,211, 36, 63,227,130,174, 59, 3,201,140,143,127,254,247,120,253,221, 47,
+225,112,220,195,123,135, 87,223,122, 15, 47, 30,255, 10,159,126,248, 11, 44,204,184,115,247, 62,158, 63,121,140,251,237, 5, 60,
+ 17, 30,191,120,142,182,105,177,132, 8,174, 97, 22,220,233, 59, 28,199, 17,222,197,172,246,139,237, 22, 83, 8,152,242, 94, 86,
+ 0,231, 61,218,174,199,221,187, 23, 6, 76,146, 58, 78, 54,151,175,209,169,101,101,122,254,124, 57,237, 47,157,172,108,127,171,
+ 90,171,140,173,236,165, 75, 38,133,207, 68,185,178, 49, 37,173,230,195,134, 60, 91,160, 64,154, 5, 92, 74,169,220, 25, 75, 5,
+196,169, 1, 26,186, 51,206,185,232,160,245,183,160,251,246,245,228, 37,219,174,234, 69,153, 77,181,147, 52,181,168, 59,159, 34,
+134, 49, 83, 17, 50, 83, 38, 49, 8,205, 84,113, 7,230, 58, 83,218,196, 6, 10,173,169,108,150,212, 40,149,199, 53,115, 8,180,
+131,171,200, 45, 37,123,161,138, 19,101,169,246,166, 89,104, 86,167,195, 25, 10,133,165,218, 25, 52, 37, 86,161, 63, 90,192,105,
+128,135, 41,232,237,207, 76,210,152, 57,119,196, 41, 31, 32,238, 32,139,166, 34, 31, 54,206, 48,244,117, 10,153,125,229,142,234,
+ 52, 59,219,153,231,115,135,179,168,179, 30, 67,219,159,177, 24,209,100, 1, 14,165,238,215,173,206,173, 85, 71,170, 32,167,252,
+ 53,221,166,173,163,122,102,239,108,174,196,103, 44, 5, 24,118,172, 26,211,181,170,206, 26,107, 95, 26, 25,177,137, 61,108,165,
+118,221,173,243, 4,168, 76, 82, 99, 51, 66,104, 26, 3,131,225,114,201, 23, 60,172, 79,151,151, 91, 5, 53, 89,231, 71, 45,140,
+132, 32, 9,139,161, 14, 15,215,184, 82, 20,185,245,231, 70, 39, 97, 55, 46,189,116, 46, 7, 61,229,103,137,234,252, 84, 73,106,
+117,239, 75,142, 71, 70,193,146,163, 82, 44,218, 89,141,169,200, 44,145, 52,164, 73,105, 14,146,209, 24, 93,182, 54,193, 66, 32,
+ 84,251, 28,137,138,229,216,221,146,210,178,226, 82,200,106, 38, 44,102,172,238,178,214, 41, 63, 63, 76, 96,199,102,109, 35,230,
+218,151,234,108,205,235, 15,230, 56, 33, 65,154, 84,136,132,146, 87, 79, 82,123, 95, 73,125,234,171,167,120, 69, 40, 3,185,219,
+103, 95,217, 26,161,163,127,151, 20,234, 84,118, 15,246, 27, 94, 21, 5,214, 26,123,178,161,176, 47, 26, 81,149,140,164,158, 80,
+ 19,119,168, 47, 92, 22,193, 81,177,127, 57,114, 70, 53, 13,181, 85,108,218, 6, 33, 32, 2,104, 28,225, 48, 68,175,250,118,123,
+129, 7,239,126, 9,215,143,126, 10,225, 3,120, 62,130,136,208,181, 61,158,126,252, 62,154,182,197,243,203, 23,248, 55,255,243,
+127,192,159,254,241,127,196,187,159,127, 15, 31,127,248, 1,134,113, 68,215,117, 88,198, 17, 23,219, 45,118,199, 1, 77,211,224,
+ 56,198,105,192, 56,205,113,196,156, 60,171, 89,207, 64, 9,120,227,155, 54, 9,212,210, 40,218, 26,188, 88, 84, 41,201,112,202,
+133,224,196,198,206,159,117, 85,121, 27,165,172,152,110, 64, 92,237, 68,144,244, 57,179,139,103,181,208,233,239, 21, 39, 88,108,
+ 16,142,235,137, 78,233, 58,117, 61, 32, 41,153,204,240,202, 93,178, 54, 90,191,173,237,190,215, 42, 94, 41, 61, 80,165,204,102,
+161, 83, 21,244,186, 24, 53,190,110,113,201, 21,203, 37,250, 55, 39,222,229, 84, 39,189,252,184,192,117, 68,145,188,156, 58,216,
+144,226, 31,203, 5, 90,188,174, 5, 32,195, 86, 29, 43,118,236, 12, 5,124,124,214, 24, 75, 47, 27,165,148,145,170,141, 41, 49,
+231,227,193,151,173, 61,235,196, 68, 62, 85,158, 73,113, 26, 84,239, 96,234,220,201,211,106, 92,191,190, 84,202,250, 67,147,180,
+ 32,106, 43, 58, 28,142,120,246,236, 18, 87,215, 55,120,241,226, 18, 87, 87,215,216,221,236, 32,150,163,237,202,179,211,180, 13,
+182,155, 13,206,207,207,113,113,113,142, 55,222,120, 13,175,191,254, 26,238,220,185,208,159, 7, 37, 43,158, 30, 96, 54,113, 81,
+ 80, 81,236, 86,184,143,162,210, 6,140, 47,186, 78,179,179, 77,137,152, 49,180, 78, 52,141,149,172, 20, 17, 41, 8,137,220,103,
+110,253,197, 90,237, 42,160,206,103, 85, 12,178,138,201,229,219,127, 95,178,110,163,245,228, 34, 94,132, 57,218, 51,167, 15,230,
+203, 9,138,167,133, 34, 96,115, 65,155,215,171,122,153,218,226, 80,202,196, 49, 63,191,222, 59,181,122, 21, 84, 3,157, 22, 68,
+233, 35,114, 68, 58, 34,207,211,124, 90, 95, 38, 18, 11,102, 27,112, 4, 32,117,218,146, 68,114, 82,222, 11, 88, 27,118,202, 10,
+ 97,214, 14, 60,187,142, 74, 94, 69,230,213,179, 2,160,136,128, 32, 28, 53, 62,213,142,152, 52,232,202,101, 52,109,158,172,173,
+172, 96,197, 95, 94, 1, 49,211,231,226, 42,175, 63, 37, 77, 81, 57, 55,172, 83,132, 83,136, 22, 23, 56, 80, 58,223, 75,113,226,
+ 98, 14, 9,193, 56, 20, 72,163,146,115, 38, 75,195, 76, 22, 77,187,198,123,192,246,113,197,186, 43, 74,146,163, 10,221,136, 82,
+ 33, 87,241, 73,107,204, 22, 41, 6, 80, 86, 91,115,141, 99, 37,220, 42, 26,145, 10, 34, 65, 85,250, 90, 29, 66, 82,132, 28,182,
+114,202,223,215,176, 44,240, 41,244,100, 55, 12, 8,203, 2,114, 14,188, 44,120,254,242, 18, 51,189,143, 47,254, 55,255, 26, 55,
+ 95,255,191,225, 92,163,163,123, 34,141, 33,194,159,255,241,255,129, 16, 2,174, 94, 60,195, 52, 79,240,141, 71,227, 8,195,204,
+218,225,181, 77,131,253,241,136,182,109,209, 54, 13, 14,227,140,190,107,112,185, 63,224,124,179, 5, 49, 41,176,102,211,117,154,
+160, 36, 43,117,119,252,136,185,216, 60, 80,244,137,146, 4,139,101,124,149, 15, 66, 86,136, 76,124,217, 19,161, 72, 92,202,192,
+142, 59,113,209, 44,101,151,118,191,217,231, 9,133,155,192,236,114,141,169,169,236,169,243, 11,150, 91,250, 52, 62, 97, 46,148,
+164, 76,250,138,191, 29, 85,207,151,142, 22, 45,214,210, 12,198, 84, 63,135,219,233,101,235,230,167,218, 24,144,164,157, 51, 87,
+184, 78, 61, 20,242,136, 60,123,110,201,250,211,217,248,211, 89, 1, 27, 76,166, 99, 22, 49,226,160,248, 25, 75,176,169,222, 72,
+158, 96,210,125,152,200, 45,202,173,170,119, 19,219,176, 37,103,138,232,190,143,140,232,141, 57,166, 26,130, 78,169, 36, 82, 81,
+254,232,100,206, 86, 34, 40, 73,117, 20, 88,129,131,108,241,149, 85,184, 47, 95, 94,227, 23,191,252, 16,159,124,242, 41,246,251,
+ 61,150,101, 65, 88,102, 44,203,140,176,204, 21, 35, 93,149,193,222,163,223,108,224,201, 99, 88,142, 56,238,143,120,250,244, 25,
+136, 8, 63,254,241, 79,209,118, 29,186,126,131, 87, 30, 62,192,111,125,249, 55,240,214, 91,111,160,109, 26,156,226, 80, 87, 22,
+ 89, 59,122, 49,167,107,142,187,181,233,132, 86, 33, 87,237,130,205,207,195, 57,201,206,161,234, 60, 82,192, 86,142,161, 94,229,
+ 74,103,123, 21, 25,160, 23, 83,204, 58, 95,139,236, 44,120,139, 21,108,115,203,142, 21,235, 38,202,102,120,155, 66, 43,105,122,
+ 40, 63,159,166, 75,207, 43,155,252,247,229,145,115,154,103,175,147, 35,251, 60, 74,217, 59,123, 23,181, 32,113,148, 79, 41,202,
+216, 60, 71,150, 44,169,174,153,114,107,145,171,156,169, 38,178,217,250,195, 99,193,160,197, 68, 8, 16,137,250,147,122,251,106,
+ 50, 49,242, 69,158, 46,243, 16, 2,230,121, 86,187, 39, 87, 0,175,220,161,187,212,181,199,127, 23, 82, 35,152,213,247,185, 0,
+137, 73,161,206,226,141,110,105,126, 69,253,229,206,192,169, 36,117, 74,100, 39, 25, 2, 21,202, 34,145, 46, 57,251,137,164, 8,
+228, 36, 53, 8, 89, 35,161, 79, 25,215,250, 33, 13,132,145,212, 84, 36,212,120,131, 74, 57,124,186,247,190,173, 89,135, 25,213,
+202,202,239, 89,149, 6,107,170, 67, 46,235, 42,165,166,110, 51,180,235,119,183,169,238,201,190,199,100, 70,110, 98, 72,107,183,
+244, 61,246,125, 79, 93,250, 56, 77,104, 83, 98,154,176, 36, 15, 99,202, 85,119, 17, 22, 51,236, 95,224,222, 43,111, 33, 8,176,
+187,252, 4,109,215, 98,158, 70,244,155, 11, 44,211, 1,155,174,195, 97, 28,209,180, 45, 60, 1,125,215, 1,130,120, 49,231,106,
+ 51, 85,205,219,205,166,132, 10,136, 96, 14,140,198,121,173, 38, 1, 66,211,180,120,248,240, 94,122, 88,107,101,236,122, 45,130,
+124,209,162, 48,191, 73, 49,164,174,218, 11, 59, 74, 52, 61, 46, 19, 21,209,113,114,124, 20, 92,218,161, 58,225,152, 62,198,146,
+132, 44,201, 62,149, 45, 29,233,115, 47,157, 56,110,237, 86,116, 28,101,124,173, 98,148,177,108, 46, 36, 74,187,252,140, 93,163,
+245, 41,177,234,127, 42,161,146,216, 66,141, 78,173,200, 98, 61,248,198, 76, 68,201, 31,110, 49,166,106, 5, 91, 77, 49,146, 29,
+136,181, 88, 34,141,255,180, 83, 37, 93, 41,172,150,160,154, 47,159, 1,189,218, 41, 21, 75,138, 48,157, 72,223,181,128,201,227,
+ 94, 41,224,138, 76,163, 43,239,101, 22, 72, 74,229,143,206,226, 62, 89,157, 63, 85,162,165, 45, 32, 10, 3, 58, 69,161,150,202,
+200, 57,135,113,156,240,195, 31,189,143, 95,126,240, 33,246,187,151, 24,135, 1,203, 50,167,195, 55, 30,204, 0,193,103, 43, 78,
+218,231,103, 52, 47, 47,130,195,113,151,212,188, 62,249,166,227, 69, 19, 38, 96, 26, 27, 12,135, 3, 14,187, 27, 60,121,252, 4,
+155,179, 51,124,238,221,183,241,149,223,250, 34,238, 92, 92,212,227,247,147, 28, 2,193, 63,101,130,211, 21,131,184,202, 85, 99,
+ 30,145,164,162,118,112,206, 96, 68, 43, 97,240,169, 44,183, 74,249,172, 64,135, 82,177, 62,196, 76,148,196,218, 59, 73, 78,154,
+ 40, 83, 73,105,115,162, 34, 63, 59,125, 72, 23,111, 86,136,103,145,173, 38,177,165,233,150,211, 61,186,232,110,219,106,105, 64,
+208, 11,187, 68,168, 74, 21, 64,147,243,210,201,158,249,146,249, 23,198,205, 64,182,177, 42, 98, 85,152,119, 5, 26,193, 28,247,
+229,172, 10,253,116, 70, 8, 39, 40, 88,154,184, 50,170, 64, 39,145, 24,202,178,182,172,205, 38,225,210, 90, 66,243, 37,239, 12,
+167,158,165,172,150, 56, 89,215, 20,102, 83, 2, 18, 82, 45,229, 78, 49,208, 84,179, 18, 52, 5,145,204,103, 83,141,230,243, 10,
+194, 85, 95,143,234,108,132, 77,212, 54,235,206, 93, 82, 60,120, 1,219, 81, 65,222,144, 81, 89, 36,113, 83, 19,187, 19,209,116,
+ 40, 59,109,163, 91, 46,199,162,134,172, 48,239, 6,221,150, 79, 90, 62,121,240,233, 86, 67,106, 93, 8, 88, 58, 80,101, 30,161,
+213,127, 78,183,188,199,216,104,194, 39, 0, 0, 32, 0, 73, 68, 65, 84, 39,251,170,211, 63, 47,143,216, 54, 93,139,195, 97,194,
+ 28,150, 24,218, 34, 2,145,128,214, 3,221, 43,111, 99,120,241, 24,127,253,127,253,111,120,243, 11,191,141,143,126,254,119,104,
+188,195, 91, 95,252, 93,252,252, 71,223, 68,215,180, 24,151,128,179, 77, 7, 17,193, 56, 69, 27,156, 48, 99, 73,227,198,121, 94,
+176,105, 91,156,111,183,120,122,117,133,179,205, 6, 44, 64,227,125, 10,117,113,152,242, 94, 41,225, 97, 95,127,245,161,238,225,
+ 44,175, 30, 21,238,213,250,108, 75,188,105, 13,180, 46,133, 82, 28,207, 90,235,155,122,203,162,210, 60,109,148, 28, 33,113,210,
+ 51,194,212,169, 16,175, 96, 63,147, 47, 90,121,255,229,116,210,152,251,138, 57, 95,246,181,148, 10, 14, 50,233, 87,178,134,193,
+224,182, 20, 53, 99,225,226, 58,224,225, 51,221, 75, 82, 53, 27,197,217, 72, 37, 2, 53,143,251,156, 9,130, 88,147,245,114, 87,
+224,140,181, 79, 71,131,116,203,243,197,101, 84,206,169, 51, 47,235, 5, 90,253, 25, 84,246,219, 84,191, 47,228, 68,139,154,248,
+147,224, 82, 0, 40, 12, 40, 25,193,242,122,133, 18, 63,222,217,133, 69,178, 70,114, 45, 83,169, 15,218, 88, 25,100, 26, 93,145,
+ 41, 51, 28,199,224,137,199, 79,158,227, 91,223,249, 1,118, 87,151,216,221, 92, 97, 94,102,112,136,100, 46, 2,208,182, 77,220,
+255,133, 5,109,219, 34, 76, 3, 2, 7,140,156,163, 95, 81, 81,177,188, 58, 68,160, 64, 40, 13, 19,241, 13,154,174,199, 60,141,
+152,166, 1,239, 79, 51, 62,249,228, 49, 94,123,237, 33,126,227,215,191,128, 55, 94,127, 85, 67, 69, 40,197, 8,219,195,161,186,
+112,233,150, 59,127,237, 23,167,211, 95, 67,100,138, 51,163,206,214,244,187,213, 42, 81,232,212,234, 86,186,241, 34,178, 92, 81,
+120, 87,179,198,202,147, 80,166, 64, 43, 96,201,250, 79, 41, 74,232,130,242,229, 36, 50, 75,116, 88,245,132,131, 68,227, 73,243,
+ 88, 56, 95, 40,121, 52, 47, 84,172, 89,132, 12, 62,161, 2,222,161,146, 74, 88, 58, 48,229,147,166, 81,246,103,217, 22, 72,215,
+ 38, 89, 0,150,131,127, 98, 56, 12,116,210,152, 71,206,185, 80, 46, 14,142,180, 47, 79, 29,250,178, 68,244,235,178, 44,152, 83,
+148,118, 22,194,229,156,244, 24,165,154,181, 31, 37,190, 58, 23,192,130, 85, 67,104,195,119,242,171,168, 18,151,138,167,173,108,
+247,172,246,202, 46,129,186,129, 16,227,191, 47, 43, 9, 38, 43,222, 21, 19, 39, 91,146,226,136, 69,227,188, 73,168,114, 78, 84,
+198,220, 28, 97,235, 28,154,184, 99,112,122, 42, 9, 92,177,212,125,198,187,113,219,223,211,250,182, 61, 89, 26,114, 90,166,212,
+ 97, 36,100,254,220,245, 93,109,255,135, 13,141, 32,219,201, 25, 65, 7, 73, 78, 31, 51,165,172,177, 54,101,170, 87,211, 52,152,
+ 70, 96, 78, 9,109,115, 8,105,124, 19, 71,207,225,242, 25, 46,206,239, 64, 54, 15,211, 46, 39,160, 63,191,131, 39, 31,254, 16,
+190,109,225,188, 67,195,132,205,230, 28,227,112, 64, 72, 23,251,249,102,131,253, 56, 41,154,146,211, 33,194, 44, 24,231,120,224,
+229, 11,175,241, 13,142,211, 12,223,196, 3,173,105, 59,220,187,123, 81, 58, 45, 35, 70,170, 50,204,171, 28,102, 50,216, 86,170,
+ 40,115, 34, 81,229,235,170, 14,187, 88,199, 74,208,242,170,160,202,138,103,177,219,109,232,133, 14,196,113, 98,221,238,173, 66,
+ 39,196,146,193, 86,107, 27, 69,170, 82,237,156,146,149,171,104,189,174,201,187, 98, 5,233,136,138, 71,229,150,255,252,228,227,
+170, 86, 60, 98, 2, 29,156, 17,178,153, 47, 96,245,155,230, 46,157,140, 32, 12,235,227,152, 74, 82,160,169,225,141,223, 57, 23,
+ 5,171, 37,151, 6, 35,157,228,116, 22,222,122,182,242, 89, 6,180, 72,125,241,192, 50,252,165,162,129,213, 22, 47, 19,174, 33,
+ 37,178,212,118, 95, 32,194,113, 28,240,181,111,124, 15, 79, 62,253, 8,215, 47, 47,209,182, 29,142,199, 61,194, 50,195,123,143,
+174,241,184,217,221, 96, 30, 56, 78,163,230, 17,187,225, 8,248, 6, 8, 75, 44, 34, 37,192, 59, 66, 16,193,110, 92, 82,208,138,
+ 67,227, 72, 71,161,206,121,184,166, 65,211, 52,104, 26,134, 91, 22, 56, 34, 28,247, 30, 55, 87, 47,209,247, 27, 92,189,124,129,
+143, 62,252, 4,119,239,222,193,123,191,254,121,124,241, 55,222, 67,211,120,227, 2,176, 43,184,218,186,231, 84,163,147,198,161,
+176, 13,198, 74,216,155, 30, 24,114,137, 65, 96, 69, 41,196,233,215, 75,117,193, 18, 91, 47, 62,195, 6,178,212, 83, 27, 41,193,
+ 47,235,104, 38, 41, 30,101,178,235, 67,192, 16,215, 78,197,174, 64,108, 20,244,188,203,138,253,100, 93,245, 73,196,104, 45,152,
+ 46, 7, 24,165,145,109,132,208, 56,172, 77,122, 21, 36, 37,157, 39, 53,155, 95, 84,195,148,167, 87, 66,198,194,101, 44,164,102,
+249,174, 83,217,124,241, 70, 91, 92,249,158, 74,206,133,201,116, 48,168,101,123,161,231,203,124,158, 39, 29,175,179,138,118,145,
+138, 3,129,243, 62, 77,228,160,239,104,190, 39, 92,106,199, 53,201,206, 18, 11,104, 53, 56,164, 85,104,139,212,196, 60, 75,134,
+203, 54, 58,169,210, 38,202,100,199, 25, 23, 11,145, 64, 66, 76, 13, 21,150, 8,254,201, 16, 48,157,108, 24,157, 8, 98, 83,150,
+ 51,225, 29,197,252, 15,102, 70, 67, 42, 88, 43,167,170, 21, 33, 41,202,174,162,127, 65,171,127,125, 52,245,144,249,140,235, 63,
+ 9,191,114, 58,154,156, 84,209, 38,189,141, 78, 71, 28, 57, 61,142, 12, 86,178,136, 61, 68,173, 38,178,226, 30, 87,233,157, 57,
+189, 9,132,101,137,130, 39, 70,192,113,156, 32, 18,148, 46,214,117, 61,166,241,128,195,245, 21,134, 38,122,201,119,187, 43,144,
+115,232,125,131,105,158,208,180, 29, 94,127,231,115,248,193,247,190,141,198, 55,152,150, 5,247,219, 22,114, 60, 2, 68, 24,150,
+ 5, 93,219,225, 48,140,177, 8,240, 30,129, 67,132,221,136, 96, 63, 77, 9,164,224,209,117, 61,218,110,147, 2, 58, 66,242,107,
+218,238,184,150, 1, 57,212,223, 84, 25,251,164, 67, 44, 97, 74, 73, 40,118,199, 46,199,139, 58,163, 79,144, 42,159,247,228,136,
+ 35, 84, 59, 81,245,206, 27, 95,185,220,210, 95, 56, 87,215, 24,213, 90,198, 90,130,215, 7,233,109,130,142,236,113, 88,139, 80,
+196, 42,105,111,239,239, 79,159, 33, 67, 17,163, 2,177,201, 21, 48, 75, 73,153,210,148, 50,107, 93, 75,135, 79,125,249,215,242,
+182, 44,104,229,149, 87, 62, 91,182, 42,162,151, 81,244,231,125,173,216,145,222, 26, 63,171, 18,120,209, 8,200,147,239, 58,139,
+193, 56, 95, 90,171,221,159,241,189, 22, 88, 73,233,222,242, 90,197, 57,135,191,249,250,119,241,233,163,143,241,252,201,167, 96,
+102,204,211,136,121, 26, 32,160,136, 68, 6, 35, 68,132, 29, 24,132, 37, 48,166,121,193, 52,141,240,142,176,105, 28,198,121,193,
+245, 48,199,209, 33,226,159,211,248, 6,155,109,143,205,102,139,187, 15, 31,162,109, 58, 44,243,136,105, 28,177, 76, 35,120,153,
+193, 68,112, 77, 11,223,180,240, 77,147, 4, 83, 11,134,227, 30,243, 52, 96,127, 56,226,231,239,255, 10, 95,253,173, 47,226, 11,
+ 95,120, 55, 77,111, 50, 47, 3,229,221, 41,114,237,147,135, 66,108, 70,245,173,149, 36, 76,211, 0,229, 21,144,139,205,137,220,
+ 22, 64,249,153,216, 28,211,127, 75,173,125,112, 89, 56,150,133,125,110,173, 11,202,226,188, 26,180, 20,187,220, 16, 35, 65, 83,
+ 7, 74, 34,122,190,105,247,237,200, 88,175,156,185, 32, 10, 75,221,173,203, 15,170, 69,129, 85, 65, 97,238, 10,139, 97, 46,107,
+137,149, 80,142, 87,107,219,196,169,200, 41,133, 81,229, 94,246,239,156,194, 84,114,162,221,218, 78, 89,128, 50, 5,253, 58,142,
+ 35, 66,242,207, 87, 52,185, 36, 58,115,228, 10, 31, 69, 36,190, 27, 73,235,163,220,117, 50, 5,221,106,175, 66,197,120,111,176,
+212,246,231,111,155,203,213,236, 57,137,216, 92, 18,201,105,201,164,225, 90, 37,172,134,211,148,129,210, 10, 52, 36,246, 67, 14,
+208,170,242, 80,210,196, 66,117, 54,185,241,128,160, 33, 37, 94, 25, 51, 63,173,163, 61,211, 5,225,204,248,210, 94,251,105, 57,
+ 20, 67, 12,160, 96,144,172,244, 91,143,210,179,223,174,136, 66,201,236,236,163,122,190, 80,228,168,140,177,136, 12,123, 9,218,
+ 9, 23,141, 93,188,120,156, 57,120, 35,238,208,192, 74,210,131, 49,165, 10, 15, 16,156,111,123,112, 88,224, 4,113,223,222,109,
+ 48, 28,102,188,254,246,187, 24, 14, 59,188,121,239, 33,158,126,242, 33, 14,135, 35,238,156,109,225,155, 6,194, 1, 63,251,209,
+ 63,224,222,197, 93, 92,222, 92,163,109, 60, 14,195,128, 97,158,241,202,189,251,184, 57, 28,128, 70,176, 44,115, 12,111,233, 58,
+220, 28,143,112, 14,184,220, 31,176,237, 55, 24, 67, 20,110,121,215, 96,179,217, 36,145, 28,170, 96, 22, 80,125, 32,185,218,166,
+ 90,104,220,178,218, 13, 86,142, 1, 42,208, 24, 19,223,172,214,179,147,151,182,198,168, 20, 32, 66, 98,154,151,140,193,149,240,
+162,240,183,109,199, 43,230,199, 84,167,171,213,130, 71, 90,183, 34,116,251, 1,185, 10,246, 58,249, 79,171,177,101,101,167, 66,
+ 37, 64,116, 10, 76,146,202,246,164,190, 86,203, 67, 55,251,172,127,116, 90,101,132, 90, 46,255,161, 11,235,174,177,216,190, 68,
+227, 45,173, 13,205,242, 24,114, 13,194, 65, 20,140,196,194,201,205,129,211,164,190, 53,128, 73, 76, 97,100,187,199,234, 30, 43,
+ 9, 89, 44,140,176, 4,252, 63,127,245, 13,124,242,193,207,177, 44, 51,166,113, 80, 95,243, 60, 28,225,132,209,147, 96, 92, 56,
+165, 11, 6,204,227,132,101,160, 20,100, 68, 56, 28, 7, 60,155, 22,184,132,176, 60,191,184,139,139,187,247,208, 54, 45,100, 30,
+ 48, 29,246,152,110, 46,241,244,230, 69,236,212,155, 78, 17,151,228,163, 11,100, 89, 22, 44,129,225,198, 49,142,128,247, 30,222,
+ 59, 52,109,139,113, 28, 48, 14,103,248,214,183,143,248,197, 7, 31,227,247,127,239,119,112,126,118,102,131,100,203,116,105,181,
+214, 17,147, 93, 64,171,226,184, 38,236,165,247, 37, 1,142,148, 70,166,233,116,164,153, 8,197,115, 72, 37, 37, 17, 53,116,135,
+178,197, 68,156,158,123,206, 21,245,111,214, 48,208,170, 99,210, 36, 51,181,109, 82,149,242,231,114,234, 90,158,130, 50, 27,146,
+157, 43,162,238,236, 12, 74, 38, 59, 17, 20,202,156, 25,119,173,253, 4, 5,223,108, 71,206,100, 46, 73, 87, 57,111,236, 84,158,
+ 51,231, 71, 74,254,131,138,239, 4, 5,254,149,109,121, 33,238,201, 5, 57, 69, 46, 1,161,192,234, 93,183, 10,247,176, 44,154,
+185,145, 71,214, 25,161,205, 57,102,214,217, 80, 29,170,107,188, 4,165,202, 30,122, 5, 57,165,200, 99,202, 66,217,245,164,196,
+164, 81,150,160, 22, 99,183, 21,210,166, 35, 58,128,184,228, 39,172, 0,110,217,165,144, 53, 52,222,187,248, 57, 72, 40, 15, 73,
+133,138, 78,226,190, 16,215, 87, 46, 17,229,114, 86, 8,145, 67, 83,208,147, 84,123, 68,193,160, 36,190,145, 50,125,210,255, 45,
+100, 51,207,139, 88,135,156, 97,197,165,104,211,220,133, 16,213,208, 9,192, 36,188,230,221,101,174, 70,245,197, 19, 5, 7, 84,
+163,138,147,226,186, 0, 46,224,138, 96, 67,119,201,101,113,139, 41, 4,132, 36,144, 3, 4,157,143, 47,235, 34,130,113, 89,208,
+ 30,175, 49, 46, 1, 47,158, 60,194,221,251,111, 98,127,243, 44, 30, 52,124,128, 8, 48, 77, 19,186,182, 69,215,118,184, 62,236,
+177,233, 58, 12,211,132,133, 25,155,174,199, 28, 22,180, 77,131,198, 59,140,243, 28,119,240,243, 4, 17,194, 48,205,104,188,199,
+110,156,112,231,108,139, 5, 14,190,105,240,218, 43,247,235,171, 43,166,213, 20,104, 10, 21,155,147,253,231,150,116,166,160, 15,
+123,180, 81, 29,229,105, 93, 1,118, 39,148,139, 34, 97,209,113,157,100, 65,150,105,120, 42, 81,164,113, 25,137, 40, 40,179, 12,
+157,179,157, 37,253, 60,157,161, 72,229,206,202,213, 86,111, 83,229,186,213,207,246,212,206, 83,241,177,205,222,146, 86,152, 74,
+ 82, 91,164, 84, 40,201,252, 18,171,141,196, 78, 68, 12, 78, 56, 59, 0,170, 3, 29,183,217,169, 12,176, 36,199,144, 74,121,230,
+105, 53,162, 32, 90, 21, 57,102,103, 70, 48,202,228, 36,168, 57, 65,231, 73, 41,160,181, 83, 18, 51,205,160,162,150,163, 21, 91,
+ 28,214, 34,152,214, 49, 31,127,242, 20,223,254,246,247,240,244,211,143,147, 16,105, 1,132, 17,134, 1,227, 60,163, 33,198, 2,
+ 7, 33,143,195,120, 64, 71, 64,235, 8,155,206,225,229,113,194,113, 28, 83,204,176,195, 91,111,189,131, 87,223,120, 27,187,203,
+167,216, 95, 62,199,225,233, 39,241,231,215, 52,113,111,190, 57,131,243,145,170,215,180,125, 28,149,114,208, 41,199, 18, 66,156,
+196, 4, 78,193, 35, 12, 80, 7, 89, 2,248,120,140,239,224,241,136,121,158,240, 39,127,122,133, 47,125,233, 61,124,229,203, 95,
+ 68,227,188, 9, 55, 66,133, 51, 45,127, 47, 6,160,101,167, 66,214,168,110,156, 29,118,139, 77,197,170,132,202,219,111, 93,133,
+ 5, 84, 83,124,180, 84,118,183, 34,134, 63,158,158, 86, 39, 69,176,105,215, 83,218,176, 56,203, 37,131,132, 52, 82, 54,202,126,
+206,127,166, 3,124,226,176,231, 99, 65,156,168, 69, 83, 56, 1,105,140,181, 77,147,219, 36,175,236,214, 78, 19, 49,113,187,245,
+106, 32,255,183, 90, 48,153,137, 34,155, 88, 91,202, 2, 48,237,208,141,120, 54,119,170,185,155, 38, 15,128, 19,127,234,150, 46,
+125,137,162,184,108,131,203,249, 9, 57,193, 83, 89,247, 39, 86,194,186,176,181, 63,133, 28, 3,203,134, 8,168,205,160,141,134,
+149,154,182, 74,134,166,105,177, 3,121,178, 44,236, 76,148,182,153, 90,167,226, 44,243,236, 41,209, 38, 51,137,146, 60, 25,104,
+148,168,149, 53, 36, 97,106,158,176, 49,138, 56,207,129,208,208,138, 8, 71,137, 21, 42,100,164,179, 48, 73, 91, 82, 34, 3,234,
+148, 48,164,100, 42,135,219,211, 24, 86, 68, 50, 35, 36,128, 1,173,192,116, 50, 58,142, 55, 72, 88,231, 76, 26,146,172, 39,187,
+164, 21, 52,204, 1, 71,201, 63, 39,204,112, 77,131,101,142,182,155, 12,111, 9, 33,104, 22,250,118,179, 1,252, 6,141,204,144,
+101,192,225,120,141,144, 58,250,174,105,176,217,244, 88,120, 1, 51, 99, 63, 12, 96,102,180,222, 99,211,247,177,226, 98, 65,215,
+120, 28,151, 0, 67, 32, 7,115,244, 68,118, 77, 83, 44,100,105, 12,211,180, 45,222,124,227,161,201, 16, 70,241,134, 59, 35, 90,
+ 65, 9, 20,112,182,147,174,140, 97,164, 2,143, 34,172,146,122,125,178, 74,214, 42,157, 13, 37,209, 28,213, 24, 96, 3, 87,185,
+237, 34,163, 60, 41,112,117,215,232,212,122,232,204, 62,206, 24, 85, 63, 99,124,126,226, 59,182,135, 9,213,190, 32, 77, 60, 50,
+ 47,238,122,153, 80,245,177, 14, 64,144,202, 43,158, 49,242,178,170, 20,201,172,120,124,134,120,224,150,168, 90,123,248, 87,233,
+ 89,181,168,170,234,212,113,203,104,132,106,255,181,168,191,152, 78, 39, 6, 70,123, 65, 38,104,130,232,118,133,187,220,182,154,
+ 72, 13,161, 35,194,119,127,240, 62,126,240,189,239, 98,191,223, 65,132,177, 76, 35,150,105,192, 52, 47, 32, 4,116,109,135, 97,
+ 94, 16,198, 3, 90, 2,182, 36,104, 60,225, 48,206, 56, 76, 51,188, 44,120,227,243, 95,196,171,175,191,133,171,231,143,241,236,
+163, 95,226, 87,207, 62, 69,187, 61, 71,187, 57, 67,127,247, 1,124,211,160,237,122, 64,128,227,113, 15,223,180, 90, 92,180,222,
+129,231, 25, 28,102, 44,211,152,124,194, 94,117, 35,204, 49,100,201,247, 61,218,174, 69,183,217,160,235,122, 0,130,121,158,240,
+179,247,127,133,199, 79, 46,241, 7,255,234,119,113,182,221, 88, 15,198,186,204,197,237,144,121, 90,189, 69,137,133, 64, 98,252,
+251,145,135, 94,139,242,156,249,179,196,164,120, 73,245,172,146,241,185, 59, 29,111, 59,163,117,129, 42,173,133,169, 94, 95, 81,
+ 61, 9,226,192,202, 7,176,194, 71, 73, 62,238,152, 3, 94,224, 60,218,105, 67, 16,192,229, 66, 55, 49,120,130, 66,226,204,239,
+ 44,170, 11,200,213,202,125,187,124, 35,210, 78,149, 42,145, 53,233, 58,138,170, 29,186, 47, 50,175,212,144,132, 32,230,121, 55,
+192, 33,225, 21,199, 61,169,220, 23,115,161, 75,236,108,115, 78,122, 85,160,211,106,226,168,133, 19, 27,230,124, 14, 23,139,141,
+135,203,252, 15, 58, 13,212,115, 46,175,234, 88, 87,190, 86,243,101,234, 69,227,112,145,202,130,200,233,251, 14, 70, 16,167,141,
+ 68, 22, 46,166, 70,147,164,216,242,178,150, 32,218, 23,157, 10,149,245, 60, 72, 42,253, 70, 43, 63, 22,144,119, 70,178, 38,167,
+ 17,144,121, 36,168,163,220,250,165, 81,213,123, 18, 29, 72,246,220,225,196, 10, 90,211,232, 76,232,131,165,154,229,113,113,254,
+ 40,106,127,175, 24,241, 71,230, 78,219,196, 34, 81,132, 97,166,178,229,183, 39,112,162,185, 9,163, 73, 29,125,231, 27,204, 97,
+134, 39,192, 99,193, 56, 31,227, 3, 48, 29,192, 97, 70,223,245,104,156,139,150, 9, 22,156,111,122,140,243,140,187,119,238,224,
+229,110,135,251,231, 23, 56,142, 3, 26,239,112,121,189,195,118,179,193,113,138,251,196, 56, 21,224,244,208, 56, 52, 4,236,166,
+ 17,178, 44,232, 55,109, 12,129,217,110,234, 66, 40,103,194,179, 91,157, 65, 82,242, 28,146, 53,167,252,125, 81,233, 22,225, 83,
+ 61, 2,175,109, 65,182,194, 54,158,210,226,119, 75, 64, 4,170,186,146, 83,238,192,233,223, 58,227, 88,200,207, 66,137,221, 94,
+145,207,254, 49, 9,123,254, 25,167, 2,167,124, 9, 25, 55, 89, 4, 58, 39, 23,186, 80,125,225,154,116,166, 56,122, 55, 98, 49,
+183, 18,156,113,233,216,179,106, 91,176,178,162,153,247,132,112,170,229,208,231, 84,140, 53, 74, 47,123, 42,130,195,149,163,205,
+ 56,224,226,180,140, 74, 2, 91,149,111, 47, 0, 28, 39, 87,129,117,137,172,169,142, 4, 51,253,173,245, 25, 68,248,206,247,126,
+130,239,127,247,187,152,198, 1,224,128,233,176,195, 56, 47, 8, 97, 65,211,120,128,129,229,184, 7, 66,192, 52, 77,232, 55, 49,
+ 70,248,217,205, 4,226, 5,191,246,155, 95, 69,215,245,248,248,167,223,199,245,147, 79,240,224,245,183,241,234, 23,126, 19,251,
+151,151,104,186, 22,155,237, 57,198,113,192, 60, 79, 24,142, 7, 16, 51,136, 23,176, 4, 44,211,148, 14,108, 96,226,152, 34,151,
+109,110,154,228,229,115, 86,183,199, 48, 79,112,137,251,208, 52, 45,186,174, 67,211,118,232,251, 13,194, 50,227,207,255,203, 55,
+240, 47,255,219,223,198,107,175, 62,172,118,217,194, 2, 78,201, 94,149,160, 71,110,177,192, 86, 97, 80,197,135,172,162, 69,229,
+ 94,184, 52, 83,162,147, 21, 25,175,124,184,162,194, 51, 67, 49, 20,131,158,203,171, 42,146, 42,149, 90, 93, 35, 14,101, 28, 45,
+ 2,223,120, 21,255, 90,148,180,230,157,219,226,147, 10,200, 37,103,157,159,214, 54,117,235, 90,242, 7, 44, 29,242, 84, 16,198,
+ 54,200,196,112,239,101, 85,100,103,226, 93,222,161,231, 66, 60,138,217, 74, 26,162,203, 43, 1, 69, 98,103, 69,120,108,190, 22,
+ 78, 29,186,218, 40,163,192,121, 9, 12, 9, 65, 87, 14,250,250,115,137,225,181, 19, 51,201,171, 88, 23, 93, 35,153,255,144,139,
+ 52,170,210, 12,197, 88,175,211,217,193, 70, 72, 72,117, 64, 81,177,195,186, 74, 56,169,231,122, 66, 51,115,130, 73,145,177,177,
+101,215,140,172, 26,224, 92,212,136, 61, 67,243, 61,153, 3,202, 16,115,150, 27,232,222,218,152,244, 13,201, 45,119, 48, 36, 86,
+204, 83,118,226,213,204, 52,195,234, 89,204, 97,103,100,141, 98,101,254,167,206,102, 39, 28,109, 86,233,254,101,147, 21, 76,228,
+ 18,183,189, 14, 94,176, 98,132, 74,224,162, 39,179, 51,163,119,193,203,203,216,121,139,112, 2,252, 59, 28,167, 57, 93,240,132,
+102,179,193,126,119,131,175,252,222, 31,192, 59,194, 71,239,255, 4,207, 63,253, 4, 77,170, 48,189,119,152,151,128,113, 9,232,
+218, 22,199,113,196,121,223, 39,210, 24,161,105, 26,244,125,252,227,207, 55, 27,236,142, 3,206,182, 27,140,243,130, 97, 94,240,
+242, 48, 20, 62, 51, 69,222,187,247,141, 81,142,214, 94,220, 10, 99,106,216,194,118, 20, 70, 38, 12,196, 73,142,102,180,105, 62,
+174, 88, 82,114, 42, 94,158,200, 56, 73, 86, 40, 67,137,187,205,236, 47,164, 62,232,218, 59, 47,117, 52, 55,173, 2, 12, 80, 86,
+ 40,122,200, 82,109,201,160,207,188,212, 63,203,190,150,191, 94, 66,201,111,175,227, 13,181,235,209,132, 45, 75,162,130,238,211,
+165,218, 99, 80,213,120,103,224,144,247,126,149, 83, 45,102,186,145, 25,217, 88,217,143, 40, 15, 5,210,238,203,149, 11,134, 12,
+ 8,165,154,175,224, 84,121,111, 87,150, 44,186,223, 38,169, 47,236,106,133,150,132, 80,180,118,112, 83,250, 89, 23, 36, 21,254,
+246,219, 63,196, 79,126,244,125, 44,243,132,105, 56, 96, 24, 7, 72, 8,224,176,160,107, 91,204,199,189, 10,146, 58, 79, 56,235,
+ 26,188,220,143, 96, 14,120,240,234,155,216,180, 45,158,254,242,167,184,251,198, 59,184,251,250, 59, 56, 92, 95, 98, 58, 30,224,
+ 57,160,237, 59,236,111,174,112,249,228, 83,180, 93,135,243,179,115, 44,187,107, 76,243,108,112, 30,113, 69,198,153, 89,148, 82,
+223,180,128,115, 37,144, 38,100, 79,118, 98,122, 55, 77,180, 50,249,102,198, 52,141,170, 95,249,219,111,127, 15,191,243,207,126,
+ 11,239,188,245,122, 9, 21,194,201,224,209, 92,170,183,178,177, 76,160,142, 13,126, 73, 58,100, 21, 95,153,159, 61,173, 38,132,
+169, 8, 16, 11,150,169,224, 47,171,169,163,153,192, 40,169,220, 18,184, 73, 18, 1,209,151,139,217,144,215,114, 33, 84, 77,112,
+114,208, 76,162, 88, 22, 90,155,168,109, 53, 70, 29, 71,162, 89, 29,203,156,233,118,118, 10,145, 9,124,164, 95, 99, 17,239,145,
+209, 99,149, 98,192,142,220,157, 51, 43, 63,148,253,186,165, 19,138, 57, 83,214, 93,122,212, 90, 4, 37,173,133, 16,192,203, 82,
+180, 38,118,189,203,156,210, 3,107,241,169,230, 82,144, 17,252, 42,131,130,203,125, 66,162,104,106,177,249, 0, 73, 55, 81, 34,
+179, 45,233, 48,195,132, 88, 75,202, 42,146, 58, 9,218, 52, 14, 23,208, 14,156, 45,221, 50,103,116,152,203, 30,171,117,158, 84,
+164, 68,209,159, 81, 83, 2, 26, 10,245,170, 64, 20,226, 5,157,127,124,146,125,209, 92, 30,230, 18, 77,135,202, 94,150, 65, 14,
+146, 22,241, 69, 60,101,144,167,154,158, 90, 50,192,179,162,146,243, 8, 57,131, 16, 50, 59,155,163,122,145,172,239, 55, 18, 62,
+140, 34,152,170,145,147, 80,217, 15, 63,123,252, 12,211, 52, 96, 94, 2, 58,141, 17,140, 5,205,184,204, 88,194, 2, 97,198,203,
+231,143,241,226,227, 15,176, 59, 78,248, 87,255,238,143,240,103,255,233,255,196,166,239,163,199, 86, 24,103,253, 70,247,206,151,
+187, 29, 60, 59, 76,211,140, 22, 64,215,120, 72, 82, 4,103,192, 64, 96, 81,117,125, 16, 70,215,117,145,211,235, 91,156,157,111,
+ 35,104,129,252, 73, 58,129, 10,114,204,168,150, 20,102,111,139, 24,169, 92, 1, 69,152, 67, 85,236, 31,131,203,203, 78, 57, 58,
+ 52,122,146,243, 3,109,119,202,150,243, 81, 14, 40, 42, 52, 43,219,117,211, 74,161,175,227,246, 91, 64, 68,255, 84,176,102,165,
+ 1,147,244,108,186,106,204,133,196,185,143, 62, 82, 57,157,134,107, 7, 43, 21,104,163,188,180, 89, 77, 94,239,211, 93, 26,141,
+102,245,172, 90, 83, 18,177, 75, 76, 34, 82,106,161, 81,247,199,165,136,145, 44, 92, 90,137, 0,101, 37, 78,188,117,175, 33,181,
+ 56,207, 70, 30,231,125, 71, 25,223,210, 42, 95,193,198,111,202,138, 18, 23,127, 38,223,252,206, 15,241,254,207,126,130, 48,141,
+ 24,135, 35,198,113, 64,152,103,244,219, 51, 44,211, 21,166,227,132, 97, 90, 0, 4, 16, 9, 14,227,140, 97, 94,112,255,222, 3,
+220,189,184, 0,115,128,235, 58, 52,219, 11, 76,135,125,244,160, 55, 13,246,215,151,152, 83, 20,241,171,111,188, 5, 23, 2,142,
+135, 61, 94, 28, 15, 8, 22, 54, 73, 17, 84,227, 82, 1,228,168, 36,218, 45, 92,194, 81,154, 84, 56,121, 20,120, 17, 0, 44, 75,
+236, 96,124, 2,144, 68, 5,254,140,123,247, 31,226,155,223,158,177,252,206, 87,240,107,159,127, 39,117,129,174,112,200, 13,200,
+ 64,216,234, 36, 96,146,226,170, 61, 87, 90, 33,149, 34,206, 24, 51,112, 42,249,150, 42,183,156,224,170,149,136, 10,205,108,224,
+135, 17,146,138,152,200, 68, 64,121,233, 89, 39,225, 82, 42, 36, 76, 70,125,182,234,230,244, 51,103, 46,147, 24, 83, 92,240,184,
+121,103,203, 38,253, 15, 44,113,151, 76,171,181, 65,242,150,179, 75, 19, 9, 17, 67,233, 33,165,230, 57,228, 81,121,162, 27,234,
+133,158, 85,238,105,228,174, 84, 62,210,177,114, 46,152,156, 39,237,202,245,254,144,188, 75, 14,106, 97,203, 23,250, 18, 2,150,
+ 16,195,177, 74,206, 56, 71,194, 34, 21, 11,111,254, 82, 75, 49,145, 11, 92,115,247,144,171, 50,202, 81, 73, 75, 11,190, 58,159,
+ 71, 14,121,122,146,162,100, 29, 41, 59,196, 73, 36,105,102, 21,175, 6,204, 24, 77, 65,198,249, 50,115,244,210,167, 41, 67,222,
+157, 35, 77, 40, 2,135,114,217,155,207,171,214, 60,152,243,221, 33,118,234,162,182, 30, 54,153,221, 48,177,145, 98,252,201, 70,
+255, 46,108,246, 69, 22,198, 80,188,128, 36,133,155,157,237, 57,234, 7, 20, 59,190,103,211,221,217, 40,198,219,146,157,204, 55,
+103,198,210, 10, 58,161,178, 75,113,112, 70,253, 41,184,124,113, 9, 44, 51,132, 3,130, 35, 44, 44,240,105,132,182,164,157,204,
+249,249, 5,238,223,123,128,235,231,207,208,206, 1,191,248,209,143,225, 93, 84,247, 14,195,144,188,235,209, 39, 57, 76,179, 94,
+220, 11, 11,206,124, 28,127, 29,134, 49,141,248,227, 15,179,107, 60,230,137,177,105, 91, 28, 67,192,194,140,174,105,209,118, 45,
+222,124,253,149, 26, 77, 69,229,135, 69, 85, 91, 70,102, 85, 33,153, 51, 82,246, 87, 70,209, 46,206,146, 52,106,165,111, 25,128,
+ 20, 1, 21, 11, 27, 96,202, 74,247, 80, 5,159,100,251,124, 29, 49,170,163,234,138,107,156, 15,143, 60,125, 41, 84,187,127, 42,
+246, 58, 31,124, 26,211,109, 19,137,196,176,209,157,156,220,134,174, 88, 39,160, 24,100, 35,128,115, 84,232, 90, 58, 28,203,226,
+ 20, 72,165, 56,245,206,153, 11, 93,212, 79,190, 30,151,151,144, 26,169, 46,226, 66,130, 51, 40, 72, 99,109,178,123, 95, 73,105,
+232, 5, 0, 83,127,221, 42,190,211, 67,149,193,226, 76, 2,212, 58, 58, 52,171,240,169, 66, 18, 1,132,239,253,224,103,248,224,
+253,247, 49, 15, 7,140,195, 17,211,112, 68, 88, 22,108, 54, 27,236,174, 95, 98, 9, 1, 36, 1,144,120,112, 58,223,224,149,215,
+222,194,205,213, 11, 76,199, 29,252, 43,175,226,250,209,135,232,250, 13, 8,130,241,176,199, 60,141,160,182,195, 60,207, 56, 63,
+187, 64,152, 71, 60,125,252, 40, 49,243,163,181,175,113,132,222, 59, 4, 0,115, 16, 12,204,198,157,224,208, 55, 30,189,247,145,
+221,208, 52,240, 77,171,207,151,107, 26, 77,207,202,222,118, 24, 25,160, 48, 99, 26, 71, 92,189,124,129,101, 89,240,183,223, 28,
+112,125,117,141, 47,127,249, 55,208,119,157,122,177, 19,141,163,176, 7, 80, 67,234,164,114, 9, 38,127,182, 18,211, 82, 98,151,
+208, 45, 98,221,245,254,100,205, 56, 55, 14, 4, 3, 38,114, 54,108,135,236, 36, 46, 99, 40,162,253,138,243,120,157,106,106, 39,
+115,178,166,101,102,190,121, 29, 56, 20,184,140,173,120,173,207,157,115,179, 38,197, 41, 83, 9,254, 40,138,166,153, 56, 22,209,
+ 41,144, 36,251,184,137, 83, 66,166,148, 56,208, 12,193,129, 0,190,241,133,193,110, 2, 92,132, 11,112,201, 37,230,124,200, 93,
+ 44, 10,223,157, 67,134,204,164, 29,122, 10,221, 90,194, 2,201,206,144,164,142,215,120, 92, 5,170, 69,106,168,230,142,195,233,
+215, 16, 47,246,172,181, 49,232, 89, 33, 35,134, 45, 97, 70,122,105,235, 68,194,229, 13,111,130, 40,145,209,232, 24, 10,158, 81,
+237,231,159,133,168,192, 47,130,116,178, 88,208,158,165,250,223, 39,193,119,158, 16,148, 2,159, 75,129,105, 86,122,141,118,180,
+ 82, 7,120,232,135,154,187,131, 12, 4, 0,213, 25,150, 40,157, 75, 57,175,202,152, 81,244, 67, 65, 5, 97,176,236, 24, 89,137,
+142,132,172, 18, 20, 56,217, 18,138, 20, 60, 30, 23,117,124,174,248,236,145,198, 18, 31,196,236, 67, 12,203,144, 60,179,169, 82,
+228, 8,199, 0, 16, 65, 13, 0, 94, 92, 62, 7,253,224,239,113,255,205,119,113,239,213,215, 16,210, 14,135, 57,118,216,158, 8,
+ 75, 86, 88, 58,143,214,121, 92,108,183,241,242,110, 35, 62,214, 57,143,101,154, 19, 54, 54, 22, 75,125,219,226, 48, 45,209,206,
+145, 40, 90, 93,191,137, 99, 66,177,138,126,174,108, 72,197,227,105, 21,153, 6,120,177, 82,109,231,155,208, 33,134,183, 72, 22,
+252,172,186,220,242,247, 82,129,102, 50,193,169,236,132, 11,102, 75,196,197,112, 20,161,138, 75, 15,171,189,226,149,183,213, 74,
+149, 20,109,250,143,229, 92, 73, 90, 35,212, 86,155,124, 49,186,170, 27, 39, 77,128,210, 24,113,163, 80,119, 84, 95,220,209, 18,
+ 71,133,217,158, 86, 51,100, 96, 44, 90, 17,195,140, 48,205, 88,214,173,197,238, 21, 8, 82, 42, 59, 89,241,145,138,201, 44,136,
+ 7, 2,155,223, 75,199,171,167, 90,122,163, 27, 41, 5, 26,107, 39,200,137, 58, 71, 38, 87,186,236, 67, 8, 43, 68, 46, 4, 31,
+125,252, 4, 63,249,241, 79,112,253,242, 57,198,225,136,101,153, 49, 7,198,102,179,193, 97,119, 29, 19,161, 56, 96, 90, 22,244,
+125,143,109,123,129,155,151,151,120,242,232, 67,188,245,185,247,112,245,244, 17, 14,207,226, 72,125,216,221, 32, 72,252, 26, 66,
+ 8,216, 54,130,109,215, 98,183,187,214, 40,215,141,119,240,206, 35, 48,227, 24, 56,118,255,233,235,108,189,195,182,105,209,184,
+180, 67,119, 81, 16, 55, 47, 11,134, 16, 32,227, 8, 2,161, 73,163, 89,151, 46,175,184, 99,143,239, 95,164,209,121, 52,109,116,
+134,132,101,193,254,230, 10,211, 56,224,251,243,130,159,252,236, 23,120,239,215, 62,135,127,241, 59, 95, 69,219, 54,169, 72,229,
+106,181, 98, 26, 95,115,161,145,217, 91,151,236,237,245,127, 79,107, 92,109,189,139,169, 82,221,116,205, 98,243,192,237,207, 41,
+ 55, 51,153,116,150, 46, 42, 73,221,104,158,164,230,175, 49,243, 22,188,203,239,188,121, 15, 76, 96, 84,213,111,170,107,197, 30,
+192,101,242,102, 87, 99,122,162, 74, 14, 66, 98, 93,195, 58,163, 15,136,159, 67,116, 64, 9, 73,180, 97, 38, 75, 35, 25,145,109,
+254,246, 66, 66, 10, 3,156,192, 48,208,166, 42, 98, 84, 11, 14,118, 89, 34, 28, 76, 16, 47,253, 37, 4,204,115,156,168,194, 85,
+ 47, 73, 58, 31, 68, 27,149,220,165,115, 90,179,185, 85, 99,201, 21, 32,174, 64,183,156, 35, 80,138, 64, 45, 18,157,248,193,229,
+252, 44, 42,177,159, 39, 50, 76, 93, 69, 48,148, 79,191,126,175,115,102,124,214, 19,100,219,158,141,162,118,100, 83,175, 87,182,
+ 84, 70, 37,237,204, 98,247, 70, 76, 72, 72,161, 30,145,170, 1,201,132, 81,139, 33, 5, 81,218,127,159,136, 77, 50,140,160,196,
+186, 87,123,218, 60,100, 39, 89,147,185,168,136, 51, 36,255,249,166, 18,204, 86, 55,138,157, 83,109,235,177, 95, 3,167,126,167,
+ 28,244,249,207,185,186,138,251,116, 79,241,144, 24,166, 17, 14,192, 24, 2,186,156, 57, 76,130,179,126,139,166,237,241,252,209,
+199, 24,166, 17,219,205, 6, 23,103,231,104,251, 22,199,195, 17,228, 61,198, 57, 94,216, 93,219, 68,251, 77,250,138,142,227,168,
+149,215,107,247,238, 97, 14, 1,227, 28, 71, 43, 49,152, 32,232,194,173,241, 13,154,166,143,159,119,144, 34,208, 48,215, 96,180,
+ 18,186,146, 11,153,194, 85, 40, 77, 32,156,121, 81, 43, 21,117,201, 54, 51,236,145,244,123,235,100, 72,106, 49, 79,250,156,217,
+ 94,240, 82,160, 42,185, 58,140,121,191,197,182, 6,235,101,117,198, 54,164,193,147,174, 22,197,177, 29, 61,202, 73,103,185,182,
+140, 89,119, 4,161, 88,238, 74, 20,171, 33, 21,138,177,122,229,245, 59,139, 78,127,212,155,190, 18, 54, 89, 31,107,182,154, 56,
+202,128,204, 98, 39, 90,153,202, 74, 49,201,197,135,107,195, 82, 78, 85,162, 54, 44, 61, 33, 84, 43, 79, 48, 21, 27, 94, 69, 35,
+ 77, 19, 4, 69,242,214,218,134, 18, 79, 91,235, 22,204,137, 0,128, 48,140, 19,190,243,247,223,195,203, 23,207,176, 76, 35,166,
+101, 6, 68,224, 73,112,184,185, 6,135, 37,173, 97, 28,206,206, 47,112,184,185,193,205,245, 21,222,120,235,115, 56,220,188,196,
+241,249,167,145,134,120,216, 99, 97,142,128,140,116,194,220,187,123, 15,215, 55,215, 74,203,186,104, 91,176,196,240,164,221, 60,
+235,133,209, 57,135,179,166, 85,148,169, 35,135,153, 25,199,121, 49,145,194,241,103,216,100,229, 63, 11, 22, 65, 76,169,226, 56,
+165,240,236, 65, 46,192,135,120,169, 79, 97,137, 26,149,166,137,151, 53,185, 56,101, 8, 14, 31,124,240, 49, 62,126,244, 4,255,
+230, 15,254, 37,238,223,191,155, 88, 25,245,138, 75, 42, 48,146,171,197,193,100,125,235,174, 46,102, 5, 56,101,192,166,174,222,
+ 57,243, 62,148,130, 91,179, 26,108, 12,236, 42,250,215,145,141, 66,166, 42,236,164, 4,127, 68,113, 25, 12, 31,132,212, 34,102,
+ 69,158, 38, 4, 64,145,183,180,138,174,205,131,123,152, 68,178,162, 93,137,235,187, 50,141, 99,137,239, 54,167,113,116, 94,183,
+ 74, 48,185,237,121,198,202,101,202, 17,210, 89,199,156,104,114, 32,132,176,104,206, 66,190,204, 67,186,188,243,191, 11,204, 8,
+105, 4,175,239,195, 42,118, 52,167, 88, 66,193, 44, 81, 92, 35,169, 9, 83,144,147, 38, 32,202, 41, 13, 21,206, 20,215,229, 51,
+ 32, 42, 14,129,188,150, 35, 71,137, 36, 32, 22,198,161, 77,175,238,195,243,217,146,190, 55, 97, 54,233,111,164,118,188, 16, 88,
+ 5,177, 46,209, 72,117,200, 79, 48, 26,166,178,122, 22, 13,155,202, 43, 73, 78,163, 81,169,253,185,146, 59, 46, 97, 48,101,217,
+ 77, 26, 87,216,124,111, 61, 78, 68,199,153,105, 11, 18, 63, 60,142, 43, 71, 29, 45,164,191,178, 47, 49,163, 10,171, 10,197, 84,
+105,156, 84,144, 72, 99,148, 92,245,136, 90, 29,160,255,173,253,117,202, 11,102,209, 17,204,179,103, 47, 32, 97,142,190,215, 84,
+189,206, 97, 65,147,136,111, 89, 18,226,154, 6,211, 60,162, 61,191,192, 89,215,197, 12,109, 34, 60,184,255, 70, 84,219, 54, 13,
+186,166, 69,227, 61,142,195, 17,141,163, 20,179,234,209, 54, 49,209,237,238,197, 25, 22,102, 28,198, 81,171, 48, 0,184,179,237,
+ 83,215, 17, 69,114,219, 77, 15, 9, 5,139,200, 66, 9, 98, 33, 21, 85,170, 56,107,216, 84,141, 82,232,101, 40,248, 85,210,125,
+184,152,201, 71, 26,163,173, 60,225, 2,169,146,140,128, 98, 35,129,225, 5,104,149,186, 2,240,211,138,122, 67, 44,229,217,224,
+162,220,172,190, 80,181, 42, 22, 91, 90, 62,184, 52,109,221, 36,166, 72,122,162,157,134,113, 20,176,140,133, 37,101,106, 22, 57,
+ 42, 89,241, 34,149,123, 67,253,168, 98,144,185,142, 44, 85,216, 68,200,102, 11, 27,175, 77,104,171,201, 17,110, 9,251,226,146,
+ 3, 77,101,167, 70,245,183,166, 5,119, 84,227,150,142,144,141,125, 40,167, 58,149,149,103, 26,149,234,178, 46,117,240,156,159,
+247,180, 23,102,210, 76,244,124, 89,254,191,255,223,215,240,236,241, 35, 0,130,113, 28,227,179, 18, 34,196, 99, 9, 81,204,185,
+ 57,187, 64, 96,198,225,250, 37, 88, 2, 62,255,235, 95,194,225,242, 41,156, 48,166,105,194,241,176,199,148,224, 23,173, 35,116,
+ 93, 11,231, 28, 94, 94, 95,195, 59,143, 77,219, 97,211,118,184,158, 3,174,199, 9, 1,192,198,123,220,239, 58, 60,232,123,156,
+183, 45,188,143, 95,215, 20, 4,135, 37, 96, 10,113,154,197,202,216,167,204, 61,139, 59, 84,112, 17, 76,165, 17,237,180,204,105,
+ 36, 11,180, 93, 3, 79, 64, 67,130, 6,140, 6,130,105, 28,112,115,245, 18,187,155,235, 4,172, 25,240, 23,127,249, 13,124,244,
+209,227, 40, 44,115, 69, 56, 25,193, 84, 86, 26,194,229, 0,183,244,185,106, 86, 79, 53, 34, 81, 12,195,195,213,123,245,252,107,
+178, 37, 46,171,195, 93,186, 24,200,229, 83,219,196,105,106, 23,204,105, 74,145, 47, 20, 73,227,120,203,114, 79,104,106, 42,116,
+ 50,231, 10,177,161, 36,186,213, 64, 8, 21, 59,167,231, 72, 68,192,224, 52, 58,151, 34, 99, 20,251,238,230,160,167,210, 80,112,
+ 58,249,203,136,217,174, 86,115, 98,121,137,244, 45, 43,121, 50, 32,149,116,118,101,165,251, 74, 20, 23,145,176, 33,141,217, 85,
+217,107, 34,160,243,241,197,224, 16,140, 69, 47,255,112,210, 29,162,239, 79,189,102,164, 21,220,153,140,143, 62, 83, 75,165,130,
+164, 82,181, 30,181,104,182, 8,136,225,164,203, 65,177, 49,138,164, 32, 43, 11, 65,238, 0, 0, 32, 0, 73, 68, 65, 84,154, 66,
+248,206, 95, 83, 8,172, 26, 47,164, 64, 27,214, 2,128,205, 29,154, 11,183,236, 14,200,112,158, 36,182,203, 55, 58,107,252, 94,
+241,203,177, 42,230,226,101, 46,137, 18,167, 29, 64, 76,176, 79, 85, 2,167, 31,116, 26,107,114,124,232,152, 74,197,146, 15, 28,
+145,242, 82,208,106,127, 32,146, 65, 3,171, 11,158,139,106,177,144,131, 68,255,251, 58,149, 7,234, 25,143, 95, 98,252,119,203,
+ 56,193, 19, 48, 47,179, 73, 72, 3,230,101, 73, 31, 70,252, 90,135,253, 13,154,126,131, 39,143, 31,225, 95,255,209,191,199,112,
+220, 99, 9, 11,118, 55,151, 58,234, 90, 66, 12, 18,216,244, 61,188,247,233, 66,111, 49,135,128,243, 77,143,203,235, 29,246,195,
+128,190,237,146,208, 1, 24,151, 5, 11, 71,191, 59,136,208,182, 45, 94,127,237,161,241,252,231, 14, 78,170,233, 93,190,120, 41,
+ 15,146, 51, 36, 70, 44, 55, 67,140, 13, 66, 20,188, 64,149,210, 58,223,180, 57, 39,220,172, 60,140, 26, 84,247,228,234,177,148,
+178, 15, 54, 93, 58,192,170, 32, 39,148,157,185,133,159,104,231, 0,171, 52,207, 62,209,228,228,207,227,255,244,156,229,157, 98,
+ 17,113,202, 9, 61,150,196, 8,192,202,196,178, 78, 28,163, 98,105,212,131, 56,129,137,156, 6,197,216,253,162,232,193, 70, 68,
+198, 45, 0,107, 82,186,157, 12,154,167, 84, 82, 2, 85, 88,194,201,129,193, 22, 94,193, 69, 79, 2, 75,254,226, 36, 70, 69, 41,
+ 94, 65,162,239, 94,190,232,171,255,203, 41,128, 40,226, 40, 6, 39, 98, 84, 60,252,255,228,207,254, 43,158, 63,125, 4,114, 62,
+249,209, 69, 59,159, 41,165, 91,121,231,112,125,117,137,105, 28,112,255,213, 55,112,126,113, 23,215, 79, 31, 65,194,130,225,120,
+196, 28, 2, 56,173,170,130, 48,218,174,199,126, 24, 83, 87, 24,223,129, 67, 0,218,139,187,184,127,126,142, 59, 93,139, 51,231,
+208,186,242, 51, 8, 16, 12, 75,192,176, 4,204, 34,152,153,181, 25,200, 7, 99,144,252,164,150, 34,206,185, 56,150,109,154, 6,
+103, 23, 23,184,123,113, 7,189,143,137,106,211,188, 96, 10, 1,199,105,198,113, 90, 48, 6, 70,219,120, 48, 7,140,195, 17,251,
+253, 13,134,195, 1,195,241,128,111,125,231,123,248,232,195, 79, 43,123,172,152,143,190, 16,177,120, 5,235, 65,157,101, 43, 43,
+243,165, 83, 23,237,233,226, 35, 51,198, 83,145,160,180, 65,117, 8,185, 4,243,178,230, 4, 87,197,170,218,100,181, 28, 10, 66,
+228, 42,215, 68, 14, 4,137,151,125,114, 53, 85,213,116,214, 78,229,166, 42,142,213,203,115, 36,149, 86, 55, 95, 82, 76,108,172,
+203, 40,182, 53, 41,131,167, 16,226,229,239,114,177,196,169, 68, 79,205, 33, 88, 42,204, 41, 17, 21,144,138,115,218, 61,179,100,
+ 63,122,217, 59, 71,190,251, 82,229,141,147,201,248,144, 52,245,202, 13, 36, 57, 82, 31,191,162, 54,210, 61, 64,169,112, 17,219,
+140,164,238, 59,135,216, 84,180,193,138,180, 76, 26,121,234, 12, 68, 32, 94,178,241, 11,200, 2,183, 2,136, 33,157, 82,229,221,
+122,154, 39, 40,254,149, 67,252,124,179,181,150,243,221,202, 5,150, 85, 38,127,165,105,203, 23,125,201,148, 79,108,194,108, 89,
+179, 29, 69,238,248,216, 40,135,237,193,149, 95, 0, 49, 62, 76,205,186, 77, 47, 41,153, 14, 45,143,221, 89, 88, 35, 61,197,236,
+ 55,212,183,201,185,234,227,242,178,217, 14, 60,193,250, 97, 46,118,189,204, 13, 85,168, 68,145,139,126, 24,251,235,107, 72,218,
+215,177, 48,150,144,149,148,241, 80,117, 46,138,229,238, 62,120,136,174,105,240,251,127,248,111,241,183,127,246,159, 0, 56,156,
+157,157,227,234,230, 10,141,247,216, 31,227,101, 45, 64, 60, 96, 54, 27,204, 75,226,186, 51, 99,152,163, 29,104, 89, 66,154, 10,
+196, 29,224,113,154, 49, 45,241,240,241,222,163,235,183,248,220,187,111,172, 8, 77, 84, 35, 62,211,136, 70,125,136,249, 66, 62,
+225,159, 72, 97,166,234,216, 92,180,179,103,243, 50, 86,240,126, 27,244, 98, 87, 36, 34,230, 51,204,248,215,194, 41,135, 77, 77,
+202, 42,219, 28,234,192,214, 82,184,202,205,227, 2,192,203, 51,207,220, 45,169, 67,146,211,215,158,198, 19, 42, 30, 73,128,163,
+ 50,181, 16,131, 95,189,237,150, 53,140,123,148,106, 25,230, 48,208,252,244,172, 86, 79,130, 36,114, 84,225, 63,203,141, 91, 47,
+ 71,226, 58,162, 60,223,101, 85, 37, 74,212, 83, 72,132,157,192, 19,233,170,137,114, 30,114,122,223,242, 40,148,149,135, 45, 58,
+ 5, 81,205,139, 80, 61, 50, 48, 5, 92, 81,208,150, 78,228,107,223,248, 46,158,124,242, 1,230,121,198,241,176,131,132,128,182,
+109, 49,207,115,180,133, 57,135,160,153,232, 11,222,124,231,115, 56,222, 92,129,199, 35,230, 33, 94,230, 89,164, 39, 28,192,169,
+184, 61, 12, 3,188,139,171, 36, 52, 29,250,123,247,113,209,183, 24, 94,190,136, 97, 71,204, 96,223,192,109,206, 32,109,135, 57,
+196,103,162,115, 30,157,247,216, 52, 13, 90,231,224,157,131, 87,194, 95, 28, 39, 54,142,208, 38,212,167,243, 13,182,103,103, 56,
+219,110, 32, 97,193,238,230, 10, 87,215,215,184, 25, 70, 48, 3,203, 56,162,129,195, 89,223,227,124,179,193,249,102,139,190,235,
+113,126,118, 17, 5,116,195, 17,199,227, 30,199,227, 30,227,120,196,119,191,255, 35, 60,123,246, 98, 69, 21, 43,123, 95,150,168,
+ 91,200,150, 46,125,166, 13,250, 64,110, 1,253,104, 33,187, 26,231, 56, 41, 28,247,180,144,133,165,165,171,136,212,228, 49,100,
+245,120,134, 15,145, 41, 21,114,186, 29, 81, 89,217,197, 11, 45,196,103,215,213,111, 67,121,246,216,164, 46, 82,217, 4,169, 11,
+ 89, 84,178, 76,246,204,200,255, 36, 63,235,149, 5, 90,212,229, 17,199,231,133,141, 33, 44,197,111, 46,208,220,115,152,145,123,
+ 14, 59,202,133, 70,214, 47,229,115,108, 73,214, 53,187,158,172,168, 20, 5, 28, 31, 59,244, 84,236,136, 80, 5,105,202, 81,171,
+169, 94, 54,199,128, 17,225,210,109,252,130,136,241,181, 14,133,248,243,112, 37, 14, 57, 29,110,249,235,207,182, 89,123,135,129,
+217,216, 54,169,106, 74, 45,192, 70, 12,179,192, 90,250,226,123,205, 90,184,229, 21, 75, 30,229, 43, 11, 30,159, 65,209, 42, 52,
+ 44, 89, 69,172,154,238, 15, 82,141, 64, 44,228, 50,119, 95, 86, 68,103, 81,159, 86,248, 84,252,209,198,219,158, 5, 42, 54, 49,
+ 76,125,139, 69, 84, 0, 29,221,151, 70,148,101,253,239,226,215, 18,150, 17,135, 97, 68, 8,140,253, 48, 34,112, 76, 87,155, 67,
+192, 52, 47, 8, 34,232,218, 6,199,253, 1,151, 47,158,227,187,223,252, 26,190,252,187,255, 29,218,198,225,221,247,126, 19,195,
+ 56,193, 59,135,182,241, 32, 31,227, 82,135,113,194,126, 28,225,189,195,243,171, 43, 44, 33,224,172,239,113,115, 60,162,239,218,
+232,245,101,198,113,156,112,214,181, 24,230, 5,219,174,141, 60,107,223,192, 27,160,142,172,195, 36, 12, 76, 71,147,211,196,226,
+ 96,165,176,225,171,157,109, 25,185,137, 88,223, 62,173, 58, 13,169,254, 34, 35,248,144,106, 23,155, 70,107,153,230, 32,208, 78,
+ 95, 42, 97, 25, 85,129,187, 57,183,220,162, 56,173,255,180,172,105,160, 63,103,253, 89,243,138, 63,175, 5,129, 73,109, 74, 80,
+ 33,155,166, 4,170, 87, 22,122,121,230,209,252, 74, 37, 79,171, 13,146,176,161,247, 85,197,129, 9,150,176, 9, 51,171,240, 7,
+251, 82,150, 44,116,147, 1,107,119, 31,149,106,134, 84,192, 94,185,218, 88,140,166, 32, 21,182, 40,164,176,147,177, 40,103, 49,
+ 83,249,210,255,230, 27,223,197,207,127,250, 35, 28,142, 71, 44,243,132,113, 56,162,237, 55,184, 73, 49,170,228,188, 30,164,227,
+ 60,227,205,183, 63,135,253,203, 23,144,121,194, 60,141,113,228,157, 56, 18, 99, 88,208,111,182,224,101, 81, 71,138,184, 22, 3,
+ 8, 15, 31,220,199,254,249, 19, 44,211, 17, 65, 4,205,246, 2,226, 28,194, 60, 99, 57, 30,176,140,137, 20, 39,121, 69, 35, 32,
+230, 56,194,247, 30,173,247,232,124, 74,112, 19,192,119, 27,156,221,189,135,182,233, 16,150, 5,187,155, 27,140,195,136, 37,193,
+156, 28,128,251,119, 46,176,233,123,244,141, 7,230, 17,251,221, 14, 87, 87, 47,241,226,197,115, 60,123,250, 4,151,151,207,245,
+193,152,167, 9,211, 56,226,176,223,227,112,216,227,107,223,248, 14,110,118,187,250, 98, 86, 47, 54,116, 37,132, 42,222,248, 51,
+ 28,152,166, 98,147, 28, 14, 66, 6,231,236, 74, 83, 68,134,173, 76,118,173,162, 13, 12,233,132, 49, 95, 80,118,251,123,242,231,
+229,142,143,163,118,231, 4, 46,195,208,125,120,149, 16, 71,229,140, 86,136,149,148,228,199, 50, 85,173, 61,252,146,108,156, 36,
+ 84,133, 13, 81,102, 2, 88, 10, 31, 21,119, 84,190,240, 0, 74,157,108, 33, 47,178, 97,154,151,176,165,216,253,115, 88, 37, 36,
+ 90, 61,132,190, 99,162,182,225,146, 56, 39,122,153, 26,178,217,103, 5, 49,214, 59,180,117,161, 70,162,220,150, 66,247, 19,117,
+171,144,130,112, 66, 37, 30,204,177,228, 34,130, 32, 92, 29, 39,121,100,174,167, 81, 62,223,133,203,207, 34,189,203,246,114,207,
+197,143,242,224, 77, 19,150, 45,185,192,106, 67,174,192, 25,172,124,223,107,216,162,148, 75,164,206,220,206,163,220,184,215,131,
+144,217, 85,202,237,118,100, 49, 23, 68,222,165,165,110,133,243,120,118, 53,130,207, 15,131, 29,201,219,127, 47,105,204, 1, 8,
+174, 47,175, 49, 78, 35, 68, 24,195, 28,213,190,251,113,196, 56, 47,152,142, 71,221,123,180, 77, 3,159,118,227,158, 25, 31,252,
+236,199,184,184,123, 15,111,188,243, 57,156,111,183, 24,166, 49, 2, 69, 24, 88,194, 2,239, 29,166,105,196, 60,207, 49, 58,210,
+ 69, 1,219,221,179, 45,250,182,197,238, 56,164,116, 42,159,186, 20, 96,152,131, 2,104, 56,119,212,246,251, 2, 42,168,122,158,
+ 80,208, 58,104, 7,167, 64,139,181,191,155, 84,189, 27,199,221, 66,230, 98, 68,193, 64, 74, 21,221,122, 90, 48,137, 86,241,208,
+ 5,164,100,173, 4,151,145,175, 85,205,230, 76,106, 34, 46,230,100,152, 28,118, 38, 84,205, 0,213,198, 43, 93, 54,223, 74, 32,
+ 76,149,113,114,102,104,231, 46,102,183, 69, 69, 60, 67,169,171,129, 35,152,184,131,117,136,212, 42,196,133,203, 81, 74,182, 61,
+147, 50,169, 16,138,163, 73,182,188,117,169,145,174, 10, 91, 40, 0,167,147,193, 2,173, 52,109, 98,197,140,229, 67, 34, 99, 97,
+129,161, 77,157,232, 81,210,215,247,221,239,255, 12, 31,188,255, 51,236,118, 59,132,101,193,241,120,192,230,236, 28,135,221, 13,
+ 66, 8,104,115,118,249, 60, 97, 90, 22,188,249,230,219, 56, 94,189,192,124, 60, 32,240,146,222, 63, 6, 9, 99, 22, 65,223,182,
+152,166, 17, 1,192,152,106,135,166,235,176,113, 14,215, 79,159, 64, 64,104,206,238, 64,136, 48,238,111,208,128,112,214,117,216,
+110,207,177,233, 55,232,189, 67,227, 26, 56, 23, 89, 14, 33,143,219,211, 14, 20, 0,154,190, 71,223,181, 88,166, 17,187,171, 75,
+112,152,226, 14,158, 98, 62, 3,165,174,222, 65, 48, 29,143,104,136,208,247,155,168,160, 71,185, 28,200,123,156,157,109,209,182,
+ 29,154,182, 41,105,115,227,128,225,176,199,112, 56,226, 47,255,250, 91, 24,231,229,244, 76, 34,203,146, 41,190,233,178, 97,151,
+210, 80,243,202,169, 78,174,176, 12, 76, 71, 95,235, 46,164,164, 78, 82, 1,125, 41,190,152,138,182,128,200, 14,194, 45,179,162,
+116, 91, 10,151,201, 73, 99, 57, 59, 67,138,146,222, 72,114,138,184, 54, 15,237,180,129, 74,151,138,153, 58,101,173, 65, 12,145,
+177,122,215, 50,137,117,229, 27, 73,143, 42,233, 26, 47,239,233, 3,135, 18,173,154,206,173,188, 54, 18,102,240,194,186,170, 84,
+245,186,148, 73,197,237, 78,159,172,179, 10,177,159, 38,186, 21,195, 44,107,122, 94, 14,178, 89,141, 50,244,231, 69, 98,250,163,
+122, 82,162,209,199,249,116,160, 50, 86,207, 14, 4,170, 80,234, 41,112, 69,162,126,130,171,177, 57,233, 72,255,228, 78,203,250,
+164, 60, 94,207, 83,105,102, 93,111, 75,186, 35,197, 52, 95, 78,231,244, 42,140, 40,129,238, 98,199, 97,102,240, 88,143,106,205,
+ 95,182, 99, 72,157, 69, 76,245,130,178,219, 9,184,229,128,151,117, 54,139,238,230,245, 80,229,248, 96, 16,151,106,141,147, 93,
+224,116,183,158,146,125,236,131, 76, 64, 8,130,253, 16,115,119,243, 38,229, 85, 7, 60,236, 60, 46,175,119, 56,142, 17,152,113,
+ 28, 6,204, 33,224,247,254,240,223,226,249,147, 71,248,194,151,127, 27,255,240,245,191, 68,219, 54, 24,198, 25,227,112, 68,183,
+233,177, 44, 1,111, 60,184, 15, 2,225,226,236, 60,141,217,163,128,227, 56, 78,232,187, 46,121,157, 9,195, 50,163,111, 27, 85,
+163, 70, 58,157, 55,194, 21, 75,222,147, 19, 57, 86,113,247,137, 33, 57,161,130,138, 16,234,108,123,210, 81,112, 57, 72, 68, 87,
+ 27, 48, 15, 80,217,157,155,180, 2, 3, 9,145, 42, 43, 60,238,110,114, 71,207,102,212, 91,214, 36,106,129,225,210,149, 41, 58,
+133,172, 79, 36,137, 47,197, 6, 24,149, 16, 33,155,169, 12, 42, 66, 76,189,208, 83,198,122,222, 61,234, 40,172,194,126,186, 26,
+152,170, 47, 52, 85, 54,150,252,189,228,100,167, 92, 68,158, 52,229,108, 18,226,136, 53,230,189,120,221,227,115,105,115,172, 75,
+ 10, 27,107, 17, 39,171,247, 71,199,246, 96, 48, 37,129,106, 74,137, 98, 42,251,243,172,158,205, 5, 85, 62, 66,242,158, 61,127,
+141, 63,127,255, 67,252,240,251,223,199,213,213, 75,128, 8, 75,152,209, 52,109,244,165, 79, 3,186,205, 89, 28,111, 46, 51,230,
+101,193,195,251, 15,113,188,190,196, 52, 28, 32, 18, 16,183, 82,113,231,237,155, 22, 78, 68,147, 13,145, 46,228,123, 15, 94, 5,
+141, 49, 88,165,191,123, 55, 78,116, 14, 59,108,157,195,214, 57, 56, 48,102, 14, 88,230, 17, 28, 22, 48, 57, 80,219, 70, 43,154,
+243, 49,147, 65, 98,146, 34, 59, 66,211,122, 56, 94,146,200, 40, 62,169,115, 16,204, 75,236,204,183,109,139,109,215,163,107,218,
+ 84, 56, 50,230,241, 24,129, 44, 93,143,195,188, 96, 14, 1,129, 3,134, 97,192,213,203, 43, 12,199, 61,134,195, 1,243, 52, 96,
+154, 38, 76,211,136,105, 28,176,223, 95, 99,191,223,227,219,127,247, 15,177,115,188,141,122,156,215, 47,170, 69, 17,179,124, 97,
+179, 43,173, 79, 68,130, 96, 61,209,173,218, 34, 49,115,126,179, 58,203, 10,235, 12, 2,163,204, 96, 55,190,120, 89,173,201,178,
+144,151,188, 91, 37, 29, 20,153, 90, 70, 13,171, 67,136,139,160,139,145,119,234,146,118,231,102, 13,154,254,191,110,162,148, 10,
+ 96,220,123, 84,254, 60,251,103, 84, 49,168,129, 13, 25, 45,218,236,178,229,140,153,177,240,130,133, 23, 29,155,215, 20, 58, 87,
+ 93,164, 54, 67, 33,239,145,163,177,160,168,225,237,250,144,185,228, 33,219,156,139, 83,229,107,153, 56,147,100, 28, 58, 85,142,
+ 8,170,224,246,233, 66, 79, 98,190,180,127,176, 67,189,244,245,177, 2,134,200,124, 38,150,194, 42, 82,235, 54, 56, 79,220,114,
+144, 77,234,146, 88,127, 30, 89,148, 83,158, 55, 78,162,185, 70, 76,176, 64, 29,228,158, 43, 77,135, 42, 63, 37, 67,240,197, 98,
+ 31,202,161,196, 82, 98, 9, 21,148,146, 98,236,140,213,206,192,100,204,152,223, 0,103, 42,240,140,225,108, 71,156, 97, 13,119,
+200,251,123, 74,182, 10,114, 25,115, 36, 74, 74,186,115,231, 2,104, 26,204,204, 81,185, 11,224, 66, 24,109,223, 34, 4,198,217,
+ 50, 97, 63, 12,184,216,196,196,168,121, 89,240, 15,223,252,155,184, 35,223,239,128,126, 11, 55, 12, 8, 28,240,246,123,191,137,
+182,235,113,125,253, 35, 60,125,121,165,255,125, 16,134, 35,194,211,171,107,108,186, 14,135,113,192,166,111,209,181, 61,134,155,
+ 29,188,243,104,189,128, 41,142,238, 95,127,237,129,126, 10,134,143, 83,162, 83, 13,199,194, 38,220, 73,206, 97, 38,195, 46, 95,
+119,240,148,247,220, 43, 46,201, 42, 99, 85,227, 5,141, 86,148,205,115, 91, 71, 74,167, 36,190,138,111, 92,246,233, 48, 97, 58,
+153, 44, 37, 32, 56, 70,228,110,155,128,137,188,185,203,208, 59,202,187,127, 74,121,240, 72,136, 71, 94, 73,203, 45,141, 45,195,
+144,210,231, 46, 78,177,121,233,243,114,154,138, 37, 84, 91,145,180,235, 49,104, 79, 29,119, 26,181, 56,153, 67, 2,171,144, 8,
+ 73,214, 32,210,194,169,236,239,213,159,110,194,116,212,118, 35,171,235,163,202,156, 55,211, 6, 18, 5, 40,145,208,137,151, 63,
+ 23, 77, 21,229, 46, 85, 67,159, 62,125,134,239,124,231,239,113,121,249, 2, 77,211, 98,158, 71,117,130, 28,246, 55,104, 55, 91,
+ 44,243,132,227, 97,135, 16, 22,220,191,184,131, 48,236,177,204, 83, 58,128,227, 15,127,102, 70,215,246,152,231, 49,122,209, 5,
+224, 16,119,183, 15,239,220,195,112,184,129,107, 59,200, 50, 99,188,190,194,182,237, 33, 68,152,194, 18, 47,238,110, 19,247,237,
+ 68,144, 16,253,233,203, 60, 33,132, 25,194,130,182,245, 24,153,209,251, 6,115, 16, 28, 23, 78, 59,250, 8,115,106, 40, 22, 15,
+ 89,180,187, 44, 11, 28, 17,186,182,129, 75,158,244,101,158,225,198, 17,139, 0,247,239,222,211, 56,202,105,153,177,204, 35, 70,
+ 8,218,174,199, 52,207,104, 27, 96, 89, 22,213, 14,121,127,131,143, 63,121,140,151,151,215,120,248,240,190,126,142,186, 66,215,
+236,136,204,101,119,102,221, 71,154,109, 47,176,172,112, 3,124,164,245, 88,173,198,208,105,114,155,185,134,243,197,226, 50, 97,
+178,132, 31, 40, 1, 79,183,141,102,151,141,213,182,217,194,143, 96,172, 81,180,226, 58, 87,241,197,122, 89,179,218, 64, 53,105,
+147, 36,230, 77, 16, 43,122, 90,181, 29, 46, 59, 85, 5,118, 7,151,237,117, 75,154,196,184,100, 1, 19,182, 14,158, 56,182,206,
+ 99,243, 92, 92,151,247, 39,107, 95,204,121,151, 10,249,194, 67,119, 74,180, 67,230,160,152,152, 47,169, 33, 4,213,148,179,184,
+ 77, 82, 38,125,162, 87,194, 17,136,163, 16,147,217,213,170,120,100,184, 85,178, 14,170,174, 33,138,195,243,212, 89, 9,114, 84,
+138, 40, 72, 89, 93, 32,195,217,108, 1,196,198,125,148, 97, 56,186,206, 54,201,146, 38,125, 82,139, 46, 73, 68,185,234, 56,170,
+ 86,126,178, 2,122,166,165,190, 55,163,119, 75,116,179,207,174,161,141, 17, 78, 3, 20,100,253,123,139, 17, 59,201,169, 3, 87,
+107, 65, 46,161, 20,100,252,197,209,107,201,241,161,171, 70,216,230,235,112, 62, 93,172, 13,102,153,209,119, 45,218,198,193, 59,
+ 70, 35,140,205, 50,227,147,103, 47,176,233, 91,108,208,225, 56, 28, 49, 78, 51,174,175,175,240,232,195, 15,240,250,155,111,129,
+ 14, 7,188,120,242, 8, 55, 55, 55,154,204, 22, 64,232, 8, 24,199, 25,119, 47,206,177, 73,106,205,182,109,227,129,156,190,207,
+155,113, 0,200,195, 55, 14, 93,219,225,221,183,223, 48, 87, 49,157, 70,112,100,223,119,190, 36,115,196, 41, 21, 55,101, 85,127,
+138,156, 64, 47,106, 22, 62, 86,123,185, 34, 82, 33, 34,235,107, 44, 42,123,123,239, 16,213,197, 31,145, 82,185,212,210,200, 46,
+141,207, 56,166, 77,185,168,243,116,204,241, 98,183, 17,186,249,185,179,153,238,217,130,151,138,198, 18, 98,114,139,160, 72, 25,
+220, 98,118,148,168,242,166,244,215,201,105,114, 89,241, 40,151,106, 57, 42,172,147, 31,223, 38,110, 73,253,147, 34, 65, 29,117,
+ 43,197, 76,170,142, 0, 43,194,179, 86,124,161, 91,129, 59,100,113,182,146, 95,220, 60, 58,228,234,215,137,161,110,177,217,161,
+139, 8,118,251, 3,190,246, 95,191,137,203,203,231,104,219, 22,211, 56,160,105,123,112, 8,216,223,220,192, 55, 29,198,253, 62,
+ 10,149,152,113,247,236, 2, 60, 79, 8,201, 34,150,167, 98,222, 55,232, 29, 97,152, 39, 4,137,113,168, 11, 51,238,108,183,232,
+154, 13,130, 48, 66,218,147,195, 55, 32, 71, 24, 57,141, 0,251, 62,102, 93,239,175, 99,167,149, 62,134, 44,134,243, 4, 76, 4,
+ 12, 75,220,177, 78,129,163,104,174,141,130, 82, 9,140,206,185,184, 18, 35,194, 34, 64,238,165,195,178,192, 57,151,236,163, 80,
+117, 52,152,113,156, 70,128, 28,218,182, 69,219,245, 96, 14,152,231, 73, 21,112,145,142,231,128,100,117, 62, 30, 15,232,250, 13,
+254,230,111,255, 14,127,244, 63,254, 33,124,138, 51, 85, 7,134,152, 81,172, 20, 1, 42,173,164, 22,170,171,116,102,236,125,171,
+ 77,162,136, 67,149, 31,110,235, 69, 33,221,141, 87,231, 0,172, 72, 50,254,163,104,219,162, 18,155,106,255, 8,200, 9, 15, 71,
+236,251, 65, 21, 92,164, 74,182,132, 57, 83, 89, 80,135,118,193, 20, 25,153, 67, 65, 46,106, 66,156, 84, 80,168,236,210, 89, 66,
+136,239,102, 74,135, 99, 37,141,218, 85,149,171,214,125,249,146, 86,235, 88, 53,242,134,218,132, 11,250, 54,129, 92,112,155, 64,
+ 41, 51, 0,156,213,205, 37, 91, 96,254,217,165,117,173, 73,111,204,224,159,124,177, 91,238,132,136, 36,182, 72,129,150,101, 85,
+187,181,109,235,133,206,102,255,141, 98,183,206, 36, 79, 54,212, 57, 49,110, 32,107,247, 62,165,107,139, 54,207, 58,117,141,171,
+ 16, 27, 57, 40,213,253, 96, 97,244,213,125, 43, 5,105, 40, 22,194, 97,113,164,100, 69,118,162, 35, 95,219,185, 20,140,222,106,
+252, 72,118, 20, 91,123,109, 21,153,101,118, 2, 42,188, 17,168, 63, 62,219,224, 68,199,168,140,183,223,125, 7, 77,191, 65,215,
+198,195,170,109, 61,218,198,163,111, 60,182,109,131, 77,215,224,129, 44, 56, 28, 7,176, 48,166,100,247,121,244,203,159,197,184,
+ 66,223, 0,105,143,215,119, 93, 36, 35, 5, 70,235, 41,141,219, 91, 44,203,130,190,137,190,221,179,190, 71,219, 54, 56, 78, 19,
+250,182,197,156,186, 16,231, 28,154,182,195,197,217, 54, 41, 40, 81, 41,107,227,223,187, 50,189, 48,170,248,188,111, 34,151,125,
+218, 38, 26,215,236, 0, 53,183,153,196,112,162, 44, 51,106,101,129,195,105,214,183,172, 4,148, 21,151, 88,253,149,150, 94, 37,
+134,247, 92, 84,166, 72,241, 34,196,121,146, 99,132,147, 34,122,224, 84,135,146, 72,253,252, 73,182, 61, 81, 21,162, 69,149, 15,
+ 29,234, 16,168, 45, 72,171,102,127,173, 82,203,153,233,121,127, 38,213, 19, 91,251,230,141,211,128,115,199,198,246,162, 69, 17,
+191,208, 45,127,150, 17, 55, 10,137, 90,142,138,224,208, 8,242,184, 20, 89,101,181,206,234, 32,201, 59, 71, 18,235,147, 22,252,
+249,127,249, 58, 94,188,120, 6,239, 61,230,105,132,247, 13,142,135, 29,246,187,107,144,111, 48,143,199, 56,110,230, 5,103, 93,
+143,160, 23,122,136, 0, 12, 18,244, 93,135,113,158,177,159,102, 52,109,139,192,130,109,223,227,222,102,131,166,237, 48,143, 35,
+198,195, 62,170,176,125,135,237,197, 67, 56,231,112,241,202,107, 88,200, 97,154,166, 56, 10, 36,160, 73, 74,121, 79, 62,118,110,
+ 4, 28, 67,236, 4, 27,231,113,222,123,108,218, 6,227, 18,176, 59, 76, 0, 39,101,183, 58,161, 4,141, 3, 90,239,193,228, 98,
+176, 75, 88,208,122,135,205,102, 3,118, 14, 97,153,113,152,103, 32,137,149,198,113,196, 97,191,195, 52,142,241,251, 10,177, 16,
+200,156,237,248,249, 6,132,101,198,241,176,199, 97,127,192,251,191,248,176, 62, 48, 45,140, 70,202,238,146,236,121,148,247,205,
+185,163,225, 18, 85,115,234,127,172,167, 90,100,206, 86,213,120,104,222,192, 74,116,169, 6,141,244,107, 44,254, 53,235,151, 84,
+157,142, 74, 48,162,251,113, 41, 38, 59,169,208, 69, 84, 92, 45, 66, 6, 58,179,118, 30,213,250,165,162,183, 53,255,220,164, 35,
+ 10, 75,100,181, 39,118,185, 6,198,176,237, 78, 81,206,247,204,243, 80, 61,151, 84,231,143,242,221, 97,166,106,142,170,117, 6,
+103, 77,128,218, 70, 69,207, 14,139,168, 85, 33,109,190,135,132, 79,168,110,121,156,238, 93,122, 30, 93,218,137,167,164,207,252,
+249, 59, 87, 4,184,164,168,216, 84,220,166, 11, 63, 47, 62, 69,106, 8,155, 88,253,151,249, 12,215,221, 59, 86,255, 63, 51,242,
+213,194,109,254,108,151, 83,212,148,144, 99,196, 26,214, 63, 92, 42,166, 90,189, 92,115,124,205,222,221,160, 5,217, 66,245, 69,
+ 84, 64, 37, 85, 70,182,156, 30,126,145,177, 87, 30, 48,174, 49,133,156, 69, 8,186, 3, 90,169,186, 33,166,234, 1,222,126,251,
+117, 52,253, 22,206, 55,184,115,118,134,179,174, 73,254,242,168,186,245, 77,131,179,109,135,123, 33,224,242,102,135, 97,156,227,
+ 1, 34,140,179,205, 6,207,158,124, 10, 2,112,115, 60,226, 48, 12,137, 38,183,164, 11,193, 97,219,247, 0, 57, 76, 75,136,120,
+216,148, 31,124,115, 28, 32, 18,241,153, 65,128,166,105,209,180,157, 78,150, 41, 33,222,234,248,195, 20,216, 97,198,240,122,209,
+186, 21, 71,186,190,126, 87,147, 17, 90,253, 92, 76,193, 39,116, 26, 61,105,197, 36, 73,216,161,120, 87,195,116,135, 72, 77,137,
+ 75, 36,225,124,161, 49, 83,164, 14,102, 24,114,229,163,143,251,226,138,181,105, 29, 12,100, 56,247,122, 17, 22,223, 48,137,172,
+227,203, 77,213,169, 78,109,211,153,203,234,243,170, 52, 70, 38,184,198, 25,204,236, 74,145, 47,165,155, 22, 51, 20, 41,122,146,
+ 58, 24,137,168, 38,226,173, 98, 4, 19,144, 39,175,197,164, 40,201,177,130,208,153, 28,131,248,238, 80, 5, 68,201, 35,122, 72,
+220, 63,254,231, 63,249, 43, 92,190,120,138,174,235,176,204, 51,124,211, 98,127,243, 18,243, 52,198, 78,117, 60, 34, 44, 51, 56,
+ 44,216, 52, 45, 68, 34, 18, 54,132,136,226,108,218, 22, 65, 4,215,199, 1,190,105,240,234, 43, 15,240,214, 59,159,195,253,205,
+ 6, 30, 20,163,132,143, 7, 56, 2,218,166,197,230,252, 1,182,247, 95, 65, 8, 35, 38, 1,174, 46,159, 65,150, 25, 20, 22,244,
+ 77,135,243,243,123,216,158,223, 67,231, 60,218,134,112,224, 0, 22, 66,215,120,156,117, 30,142,128,121, 98,200, 28, 98, 74, 98,
+ 42, 84, 85,159, 66,208,226,201, 3,104,211,106,106, 10,140,113, 26,225, 16, 53, 43,141,115,104,210,103,190,113, 20,125,241,233,
+144,142,104,209, 88, 80,119,109, 27, 61,193,249,176, 15, 65,217,247, 63,252,201,251, 74, 43,139,122, 29, 41,127, 9, 25, 10, 92,
+221,181, 49, 75,201,204,214,206,177,214, 32,213, 97, 63,114,114,176, 23,247, 66,236,246, 51, 95, 60,190, 43, 92, 46, 4, 65,241,
+ 64, 59, 67,106,172,186, 72,134,149, 74, 21,241, 26, 27,162,167, 9,131, 49, 34,228, 24,192,101, 58,206,234,130,225, 19, 65, 51,
+ 86,150,226,114, 55, 36, 94, 59,115, 36,225, 57, 50, 94,119, 49, 22, 91,125, 9,244,215,177,220, 2,196, 90,229, 32,184,212, 28,
+ 57,251, 22, 26,238, 73, 57, 83,216, 72,148,196,196, 76,139,102, 18, 8,193,176, 81,146,109,218,140,227,243, 46,189, 48, 85,130,
+201,163, 72,119, 18, 25, 37,191, 94,232,190,182, 75,174,191, 87, 41,246,180,250, 2,207, 90,134,178, 7,146,180, 66, 97, 29,207,
+179, 41, 6,202,239, 25, 5,147,235, 8, 41,195, 92,149,202,148,111,252,194, 26, 48, 47,167,145,151, 70, 12,194,154,202, 83,132,
+ 5, 82, 29,200,164,223, 36, 89,160,131,148,224, 18,210,221, 72,250,106,152, 34,132,131, 11, 81,139, 88, 13,238,122, 0, 72, 46,
+ 52,148,202, 19, 63,144, 63,252,131,223,135,219,156,193, 35,165, 26,145, 67,239, 61, 26,239,208,182, 13,124,219, 98,187,237,241,
+128, 3,110, 14, 7, 76,243, 2, 1, 97,119, 56,194, 57,194,111,124,229,183, 99,188,106,219,226,122,127, 72, 42, 94,209, 14,124,
+ 14, 11,156, 35, 12,211,140,155, 97,196,179,235, 27, 28,231, 5,125,215,198,128,151, 20,207,122,239,222, 29,189,192,197,137, 58,
+ 4, 50,109, 45,138, 67,228, 20,144, 96, 46, 48,151,213,216, 14,149, 32,171,198, 57,175, 4, 34, 85,215,110,196, 93, 68, 39,150,
+ 14,231,164,138,218,189, 5,155, 86,180, 99, 6, 6, 3, 77, 18,202, 23,123,210, 67,228, 42, 61,147, 9,237, 97,151, 71,217,118,
+ 4,149, 75, 80, 99,185,203, 2, 52,253, 57, 19,157,242,229,181,115,226, 50,170,207,158,206,202,206, 95,166, 1, 98, 61,145, 10,
+ 48,130,225, 34,148, 26, 51,171,133, 43, 1,242, 58,195, 92, 57,237, 53,113,207,242,244, 75, 12,104,205,124,215,175,137,185,116,
+127,149,143, 56, 57, 14,178, 85, 41,137,233,254,243,159,254, 85,228,224,139, 96,216,239,176, 61, 63,199, 97,119, 29,199,230,243,
+168,227,189, 37, 4, 92,244, 61, 66,178,251, 44, 75, 28, 73,187,198,225,102, 24,112,118,182,197, 91,111,188,130,251, 15, 94,197,
+120,152,240,232,163,143,176,159, 38, 72,152,209, 80,212, 47, 52,155, 59,184,247,214,123,184,255,230,155,184,186,126,142,227, 97,
+ 7,199, 1, 88,102,108,218, 22,103,222, 3,203,132,105, 58, 96, 28,174, 48,201,130, 33, 8, 90,223,160,107, 29, 90,239, 48, 46,
+ 64,219,157,161,233,182, 16,231, 13, 5,145,147, 16, 50,126,110,222, 57, 93,193,229,206, 95, 0,132,133, 17,166, 41,158, 67,190,
+129, 39,194, 44,145, 80, 23,210,193, 26, 36,126,191, 97, 89,176, 76, 19,132,227, 40,120, 89, 22, 61, 80, 67,190,216,199, 17,159,
+ 62,126,150, 14,108, 41,171, 30, 5,104,149, 81,120, 1,152, 72, 53, 60,140, 48,165,250,189,163, 91,115, 95, 88, 51,189, 53, 92,
+ 40,239,199, 87, 98, 79, 50, 65, 86,172,248, 83, 87,179, 10,168, 48, 14, 42,113,166, 5,173,176, 29,154,146,253,165, 57, 26, 68,
+ 29, 26, 81,144, 12,176,233, 48,117, 77,165,177,160,108,212,244, 92, 28, 72,249, 51, 15, 1,141,143, 49,177,164,207,170,168, 0,
+ 47,149, 17,122,167,216,130, 32,158,215,168, 4,100,249,247,119, 41, 98,182,236,217, 93,129,240, 72,177,156,102,197,120, 97,162,
+144,117,158,150, 56, 39, 49, 36, 58,150,242, 87,197,225, 79, 23,127,178,228, 89,251, 97,113,241,148,115,196,121,127,114,246,194,
+174,116,164, 88,149,173, 71,191, 16,250, 80,222, 1,172,248, 35,171, 81, 61,219,127, 38, 12,255, 7,255,253,255,240,191, 86, 7,
+ 17,149, 46, 32,143, 77,148,154, 99, 46,230,148, 13,149, 22,245,140,146, 87,203,133,174, 99,246,230, 57, 83,187, 36, 35,145, 86,
+ 56, 88, 65, 2,106,143, 17,105, 85, 84, 46,152,156,221,107,236, 38,102,167, 76,213, 69, 81, 34, 21,243, 7,210,245, 27, 12, 87,
+ 47,209,128,225, 8,216,186,184,191,236, 26,143, 69, 4, 77,194,200, 98,156,112,195,130,105,142,208,152, 16, 24,199,155,235, 20,
+255, 23,127,251,174,241,232,210,168,114,156,102,244, 93,135, 97,154,113,113,118,134,253, 48, 33,136,224,124,179,137,123, 66, 16,
+124,211,226,252,252, 14,190,250, 91, 95,196,102,211,199,164, 31, 67, 63,203,136, 69, 29, 57, 57,167, 23, 90,180,190,230, 17,124,
+ 18,126,145, 1, 40,100,104,154,118,165, 53, 11,190,208,143, 92,241,206,234, 5,238, 42,253, 65,137, 57,205,129, 46, 40,127,191,
+ 26,201,231,110, 62,139,134,138, 13, 36,177,250, 83,113,226,114,150,120,190,140,205, 14, 95, 86,184, 54,235,129,181,130, 25,107,
+231,201,149, 49,197,228,136,149, 29,169,142,172,165,180,123,183,211,138,156, 38,149,179,168,173,118, 64,173,109, 89, 0,229,240,
+ 25,226, 54,152,192, 34, 84, 65, 68,250,190,172,196,142, 48, 97, 60,148, 24,216,164, 57,109, 98, 38, 20,201, 30,117, 75, 88, 12,
+165,125, 38,129,240,209, 71,159,226, 47,254,242, 27,120,246,228, 19,188,120,250, 68,245, 35,211, 56,168, 16, 46, 11,213,230,101,
+193,189,237, 6,227, 18,224, 17, 15,169,166,139, 43, 34, 1,225,225,221, 11,244,103,119,177,219, 29,113,220,221, 96,152, 70,128,
+ 99, 23, 29,213,200, 45,250,187,247, 49, 47, 19, 14, 47, 62,197,245,229, 51,116,109, 11, 10, 75, 4,202,164,104,226,217, 55, 96,
+ 48,182,125,131,227,184, 96, 1,161,111, 26,116, 13,225, 56,205,232,218, 45, 54,109, 11, 98, 70,211,118,170,134,143,103, 75,122,
+ 30,157,143, 7, 55, 74,247,235, 41, 22, 4,217,119,221,166,159,251,229,113,196,200, 1,158, 28, 46,206,206,209,247,125,180,190,
+ 37, 10,157, 13,218, 40, 0, 34, 87, 2, 79,136,208,180, 45,174,119, 71,252,250,175,189,107,154, 26, 3, 48,114,182,184,165, 82,
+ 88,167,159,177,179,106,212,181,242,157,232,116, 24,233,116, 30, 87,240,184,222, 85,252,127,123, 25,228,131,223, 59,111,132, 29,
+165,130, 39,177, 98, 59,172,132,115,229, 12,132,161, 68,102,192, 24,169, 16,217, 50, 50,196, 32,141,141, 10,202,196,102,219,212,
+ 71,123,111,112, 96,248,198,195,147, 47,188, 18, 41,150,183,188,207, 86, 43,168, 90,151,169,154,178,170, 55,155, 67, 34,214, 37,
+158,126,101,113, 19, 59,168, 48, 5, 77,185,207,200,149,136, 91,164,179, 20,213,132,148, 74,240,149,161,198,169,162, 32, 93,248,
+228,140,151,102,165, 89,202,172, 7,205, 68, 23, 3,232, 90,217,133, 51, 96, 41, 95,196,178,182,105,175,120,244,113,109,101, 86,
+ 54,186,234, 43,227,251,204,226,111, 84,240, 36,197,227,103,197, 9,229, 48, 53, 95, 32, 11,196,231,195,155,205,195,207, 5,143,
+111,144,163, 85, 7, 95, 61, 88,117,100,107,125,177, 83, 17,240,145,217, 0,165,189, 57, 73,206,179, 37, 99,224, 79, 13,123, 14,
+ 58, 73,222,205, 74, 20, 69,130,135, 15,238,227,121,202,198,118, 18,133, 27, 77,227,163, 15,183,241, 8,233, 75,190, 56, 19,244,
+195,128, 71, 75, 20,165,197,248, 70,160,239, 58,132,176,160,239, 58,108, 54, 27, 92, 94, 93,193,251, 6,211, 60,225,250,229, 53,
+ 30,222,189,131,109,215, 1,216,227, 48,205,184,179,221, 96, 78,179,246,198, 55,232, 55, 91, 60,124,112,207,120, 50,171,192,180,
+250,129,169, 4, 47,241, 27, 19, 41, 12,232,248,107, 92, 10,143, 40,241,134, 49,240, 37,167, 74,145, 81,200, 83,165,204,177,249,
+234, 21,231,154,204,108,192,225, 22,216, 74,197, 91, 65, 9, 21,141, 5,157,115, 57, 61,172,196,131,114, 94,233, 80, 81,115,154,
+135,162,138,240,101,243, 51,101,115, 9, 59,179, 67,211, 17,100,222, 99,155,231, 71,117, 5,249,171, 99, 54,187, 67,214, 23, 39,
+239,165,156,249,236,236,203, 72, 84, 68, 70,122, 72,172,172, 10,146, 39, 8,102,170, 65,249,185, 43,153, 13, 39,134,101,213,130,
+ 16, 78,160, 63, 5,217,204, 37, 59,153,234,181,215,167,143,159,227,235, 95,255, 22,246, 55, 87,152,199, 1,112, 14,119,238,221,
+199,225,176,199, 60, 69,214,185,181,172, 30,199, 17,247,207,207, 49,204, 51,136, 3,154,174,197,110, 26,177, 28,102,204, 33,224,
+238,249, 22,135, 49,128,111,158, 96,225, 0,225,116, 81,145,195,152,167, 39,203, 0, 63, 79, 58,238,111,200,129,231, 9,103,119,
+ 30, 98, 26,118,216, 79, 19, 54,173,195,157,158,112,121,240,216, 45, 13,200, 51, 46, 26,194, 24, 24,187,113,198,118,179,141,151,
+ 23,199,145,184, 44, 19,154,182,131,235,163, 34, 63, 36,251, 27,133, 37, 70,222,146, 75, 81,159,177,231,244,136,176,154,145, 25,
+ 65, 24, 35, 3,158,128, 59,109, 27, 15,203,241,136,208, 52,104,219, 14,219, 59,119, 1,231,112,216,199,104,216,101,137,170,124,
+181,125, 54, 13, 56, 4, 76,211,132,113, 24,112, 60, 30,177,219,237,113,247,206, 69, 69, 50, 20,145, 24, 12,148,198,250,249,113,
+209,243, 78,202,197, 38,148, 19,245,168, 36,239, 73,241, 60, 11,234,221, 13,131, 77, 3, 85,112,197,249,221,208, 8, 82, 51,114,
+175, 28, 21, 86, 24,167, 78, 15, 27,196, 98,112,177, 86, 44,171, 29,122,217,161,151, 9, 91,205, 77,180, 35,107, 74,177, 46, 26,
+255,201,209, 34,202,136, 97, 46,129, 3,154,166,137,105,107,201,249,148,221, 3, 57,212,132, 53, 87, 61, 93,100, 40, 43, 46,187,
+238,146, 10, 35, 46,122, 97,102, 46,175, 3, 3,206,171, 22, 37,152,119,209,144,239,181, 49,201,162,198,181,174,160, 46,176, 57,
+158, 85,137,186,151, 3,174,242,254, 62,168, 74,190, 64,113,178,133, 47,218,234,120,197,164,119,128,178, 89,105,109,137, 56,225,
+ 75,192, 0,198,178, 80,146,243,255, 54, 12,121,251,107, 45,186,176,209,168, 70,243, 47,117,116,152, 47,117,103,189,186,214, 40,
+111,216,186,213,227, 81,234,220, 42, 66,215,238, 54,243,201,200,180, 74, 89,171,111,141,106,103,108, 96, 55, 98,195, 74,242, 1,
+ 77,164,105, 98, 82, 81,184,168, 98,162,239,111,118,250,117, 58,135,168,132,117, 14,222,124,127, 46, 1, 91, 22,191,193, 23,198,
+ 25,143,164,193, 60, 47, 56, 30, 99,178,213,166,235, 48, 45, 1, 56, 30,113, 24, 39,108,123,194,118,179,209,238,224,233,213, 53,
+ 56,237,209,135, 57, 96, 14,140,182,237,208,118, 29, 54,219,109,133, 65, 36,114, 85,230, 86, 29, 36, 64, 0,130,138, 66,228,132,
+144,145,178,213,205, 68, 34,255, 80,156, 73,213, 3, 25,245,182, 62, 48, 46,185,108,168, 86,135,147,185,166, 75,150,103,113, 52,
+ 0,183, 57,111, 83,193,151,179,137, 83,209,144, 47,114,103, 20,249, 84, 10,128,162,182, 53, 86,188, 4,123,208,184, 66,125,200,
+115,129, 80,252,230,241, 48, 36, 19, 61,103,205, 0,183, 12,199,205, 56,143,178,130,184, 82,177, 75, 69,125,202, 84, 49,192, 68,
+ 43,117, 0, 0, 32, 0, 73, 68, 65, 84, 82, 68, 45,153, 52,180, 58, 92,214,161, 80,164,136, 76, 52,196,109, 48, 50, 85,249,150,
+113,155, 93,124,229, 8, 93,178,234,100, 67,100,252,214,119,126,128, 95,253,234, 3,236,174, 95, 98, 30,199,216, 29, 15, 19,142,
+251,155,106,223, 63,142, 35,186,190,199,126,119,133,187,219, 11,204,209, 88, 11, 34,193,203,155, 29,166,176,224,206,217, 57,206,
+156, 67, 24,135,200,219, 38, 96, 14, 28, 9, 93, 16,108,186,216, 29,231, 60, 5, 74, 43, 36, 1,192,222, 3, 68,184,217,189,192,
+121,223,224, 98,219, 96, 63, 17,194,228,225, 27, 66,135, 25,210,182,184, 62, 30, 65, 0, 90, 34,240, 60,226, 48, 14,112,190,193,
+102,123,134,134, 36,194,100, 28, 1,222,195, 81, 15, 94, 60,166,121, 4, 88,224, 93,201,149,166,212,213, 70, 37,125, 12,132,105,
+ 28,225,254,182,195, 18, 4, 1,130,144,152,246,243,178, 96, 24, 7, 52,253, 6,112, 49,234,152, 37, 82,236, 60, 0,113,177, 40,
+ 32,102, 56, 14,152,166, 1,243, 52,226,167, 63,255, 21,126,247,159,127, 69, 35,110,137, 13,158,148,147,195,193, 4,191,104, 31,
+155, 99,137,129,168,125,160,148,193,183, 42,234,170, 20,191,148,135,174, 69,183,137,179,214,211, 50,243,220, 51, 46,214, 54, 63,
+ 85,111, 36,122,129,174,137,104, 5, 78,105,150, 61,230,108, 46,227,247,100,213,162, 26,178,147,237,108,229,191,141, 93, 60,231,
+201, 96,214, 47, 4,134,111, 92,137, 27, 78, 89, 17,217,209,146, 51, 36,200,138,177,141,248,148,236, 74, 46, 21,238,193,228,144,
+103, 38,186,102,210, 75,116,214, 72,154,230, 57, 17,112,202, 43, 95,107,133, 74, 31, 41,167, 75, 17, 41, 98, 88, 85,214,235, 69,
+ 77,112,228, 43,231, 79,158, 34,144, 17, 36, 58,231,226, 58, 71,114,168, 78,178, 26,178, 65,151,175,148,235, 82,209, 86,197,220,
+231,172, 20,193,138, 60,192, 92,236,140,234, 0,176,110, 51,160,177,163,134,210,249,136,102, 82, 51,135, 2, 71,209, 51, 47, 95,
+246,117, 8,131,109, 77,116,160, 99,207, 89, 46, 5,129,216, 29,178, 13, 62, 88,177,157,236,239, 95, 58,118, 54, 42, 77,210,221,
+135,147,188,155,113, 37, 46,148,163,223, 89,210, 15, 64, 68,176,191,222,193,167, 14,213,147, 3,131,177, 8,161,115, 4,242, 0,
+147,131, 16, 33,136, 71,239, 28,150,174,193,239,189,251,155,248,252,191,248,125,252,241,127,252,223, 33,194,216,244, 93, 2,113,
+ 52,216,164, 36,183,121, 24, 98, 87, 51,207,104,156,195,113,158,241,234,221, 59,152, 57,238,144,157,115,232,250, 13,190,248,222,
+187,182, 57,211,177,172,203,104, 65,147, 11, 85, 63, 6, 89,209,238, 42,133,152, 22, 97,137, 57,112,170,238, 46, 23, 94,177,159,
+185, 21,227,178, 72,181,116, 61,146, 59,125, 87, 14, 38, 50, 35,109, 54,117,133,157, 24,217,175,157, 56, 39, 28,185, 98,193, 99,
+ 90,185, 35,140, 8, 73,202, 56, 91,173,118,217,143,235, 92,196,194,166,125, 90,238,238, 57,249,210,245,106, 22,170,199,143,121,
+114, 81, 9,252,160, 30, 83, 79, 84, 58,135, 84,152, 88,102, 0, 37, 32, 7,165, 44,101,162,181,184, 51,249,128,189,171,114,216,
+ 79, 28, 77,153,115,189, 50,213,229, 73,147,172, 10,108,151,139, 36,162,106,116,247,254, 47, 63,198,135,191,250, 0, 55, 87,151,
+152,166, 17,146, 66, 49,178, 27,195, 37,111,247,113, 56,194, 55, 13,134,227, 1,119,182, 23,152, 69,224,195,132,113, 26,177,112,
+ 28,227, 62,232,207, 99, 87,159, 4, 88,206, 55,154,112, 5, 34,252,243,175,126, 25,125,219, 32, 44, 11,126,249,241,167, 56, 30,
+142, 88, 56,164,116, 67,143, 70, 98,142, 1, 46,238, 99,129, 67,215,159,227,108,220,131,120,192, 60, 7,236,198, 9, 30, 51,238,
+111,123,156,111,207,192, 16, 76,105,234, 21,194,130,221, 97,192,196,192, 22,128,155,167, 56,114,247, 30,174,235,193,132,184, 7,
+ 23,192, 59, 82,245, 57,167,207,200, 17, 97,145, 56,154, 27,230, 72,155,227,180, 0,140, 25,221, 81,224,180, 76, 19,154,182,197,
+102,179,213,221,169,115, 62, 30,144, 33, 9,209, 88,176,204, 11,166,105,194,199,143, 30,227,119,254,217,151,225, 77,176,135, 13,
+ 73, 21,147, 52, 72,150, 86,166, 69, 95,140, 74,214,179,206, 20,155, 98,245,231, 73, 82,196,233,103,145,247,193,165, 81, 33, 21,
+ 70,185,180, 55, 70, 53, 70,135, 33,125,196,119,173,236,128,217,168,226,139,208, 74,170, 6,201,126, 77, 82,172,110, 22, 70, 37,
+ 38,116,134, 68, 51,203,137, 24, 34, 46,249,211, 69,217,227,200, 43, 67,142, 90,161,204,114, 40,174, 17, 19,227, 78, 92,209,151,
+108,162,154,194,148, 2, 39,127,187,139,151,123, 28, 3,166,115, 40, 19, 50, 83,248,169, 13, 25, 75, 23, 44,173, 96,238, 98,108,
+132,229, 5,175, 3,149, 11,220, 44,234, 42,188,243,201, 46, 77, 70,227, 83, 2, 98,226, 90,202,155, 93,119, 60,115,157,147, 85,
+186, 26, 27, 75,222,122,228, 89, 52, 68, 76, 53, 55,148,140,107, 66, 93, 72,134, 25,159, 87,132, 57, 77,178,193,138, 4,151,105,
+107, 98,208,175,217,134, 68, 43,168, 65, 21,203,153, 68,111, 2,210,234, 12,130, 83,240, 6, 12, 55, 60,125,160,164,237,252,202,
+ 87,109,163, 61,197,118, 49,100,196,118,133, 56, 39,148,247, 61,241, 98,231,116, 41,101,236, 97,222,229, 12,199, 67, 74,208, 17,
+120, 8,230,244,133,118,141, 67, 88, 24,147, 56,144, 99,108,186, 54,210,130, 2,240,202,107,175,225,243,239,188,139, 78, 24,187,
+ 16,240,241,179,231,120,253,193,125, 12,227,136,190,239,193, 44,120,124,243, 18,239,190,250, 42, 0,193,163,151, 55, 8, 34, 17,
+ 13,155, 94, 72,239, 27,244,253, 6,175, 60,188, 95,162, 25,242,133,236,110, 91,215,202, 41, 35, 92,119,124, 37,190, 49, 63,220,
+ 36, 5, 82, 97, 91,250, 74, 66,102, 0, 12,170,218, 92, 13,209,201,116,250,121, 97, 38,168, 35, 27, 37,119, 48, 85, 26, 85, 29,
+ 65, 9,170,220,188,105,236,110, 14, 9, 6,114, 84,252, 90,205,110,193, 25,113, 87, 84, 68,114,148, 94,218, 19,167,183,156,194,
+ 62,212,170, 67, 92, 44,111, 25, 78,195,150, 33,205, 41, 90,145, 78,220, 24, 44,133,245, 25,145,183,164, 49,177,234,243,173, 58,
+108, 42, 21,247,202, 15, 92,234, 10,210, 40, 93, 49,140,110,202, 47,175,138, 15, 21,154,167, 44,236, 31,255,248,103,184,185,185,
+198, 52, 77, 88,150, 0,146, 0, 78,194, 36,145, 8, 55,202,201,137,228, 90,116, 68, 24,231, 9, 14,140,221, 56, 97, 10, 11, 94,
+185,123, 15,135,221, 13,134, 49,122,207,137, 8,173,111, 18,187, 26,216,158,109,240,191,252, 79,255, 14,243, 50,227, 79,254,226,
+175,177, 76,179,230,172,119,222, 65,252, 6, 23,247, 94,193,249,221,251,216,108,123, 92,191,188,196,116,184, 6, 79, 87,104, 28,
+112,113,126,129,205,166, 71,215,117, 56, 63,219,226,252,236, 12,119,206,207,209,118, 29,188,111, 48, 14, 71,140,243,140,221,225,
+136, 71,143,159,224,249,229, 75,192, 53,112, 28,192,243, 2,161,152,248,230, 0,132,101,142,248,216, 68, 98, 4,128, 37, 29,246,
+ 44, 64,200,185,216, 4, 44,169,115, 89,230, 25, 2,192,251, 6, 93,215, 65, 66,192, 50, 28,225,219,174,132,249, 52,190, 20,119,
+204, 16, 9, 88,230, 9,243, 52, 99,158,103,184,190,139,227, 90,179,255,214,227,201, 25, 58,150, 29,173, 39, 70,131, 19,210, 11,
+213,166, 36,210,202,109, 18,210,197, 83, 74,202,248,107,243,152, 94, 71,188,142,170,137,150,158, 23, 5,245,102,136,132,230,141,
+ 52,255, 14, 70, 60, 87,197,197,210,122, 5,202, 41,254,217,128,152,170,108,137, 50,159,136,226,100,214,115,163,201,251,100,152,
+196,194,188, 26, 83,199,147, 84,250,157, 92,220, 87, 23,157,148,247,179, 10,108,202, 2,237,156,206, 38, 4,231, 56, 1,185, 98,
+231,174,209,225,170,159, 32,213, 95, 59, 49,159,143,142, 39,235, 36,198, 28, 18, 83, 24,238, 73,224, 75,165,217, 21, 69,189,198,
+200, 88, 65,164,230, 5, 46,121, 19,242,255, 51,246,102, 49,147, 37,217,125,223,255, 68,196,189, 55, 51,191,173,170,186,186,122,
+159,153,158,141, 51,228,112, 56, 36, 77, 82,180,185,136, 20, 53, 92,134,148,105,136,162, 68, 83,134, 8, 25, 22,228, 23,235,197,
+ 50,252,174, 87, 3,178, 97, 64, 15,134, 1, 91, 54, 8,217,178,108, 3, 38, 96,195,162, 65,147,162, 52, 20,101, 15,105,115,155,
+133,156,233,233,158, 94,171,107,249,214,204,188,247, 70,156,227,135,216, 78,220,252, 26,240, 67,205, 84,119, 87,229,151,153,247,
+222,136, 56,231,252,255,191,127,224,198, 10, 88,195,202,180,213, 16,141,243,161,236,234,213,234, 31,187, 43,121,205, 47,226, 56,
+ 86, 2,234,220,205,139,127,206,213, 86, 76, 22,177, 45,120,239,233,100, 96,108,125, 97, 82, 92,222, 40,208,136, 24,194,120, 63,
+100,160, 8,169, 55, 77,109,112, 22,213,249,141,226, 20, 52, 45,200, 6,120,112,155,233, 30,104,124,158, 77,138, 28,234, 33,129,
+ 23,148, 47, 0,240,201,146, 99, 96, 96,133, 17,136, 64,150, 96, 28,197,137,157, 0,134, 5,166,179,120,254,219, 62,139,175,127,
+229,247,113,118,239, 62,166,253, 22,207,110, 58,224,114,198,233,157, 59,120,246,249,151,241,229,175,126, 25,230,102,139, 59,199,
+ 71,248,240,131, 7,120,120,113,137,144,110,170, 77,223,163,239, 58, 60,221,238,225,156,131,117, 14,174, 27,234, 97,132, 76, 83,
+209,229,121,221,129,186,101, 81,241,137,174,206,117,148, 39, 81,107,249, 58, 72,114, 51, 53,108, 65,106, 11,156, 68, 1, 41, 84,
+116,168,126,254,117,235, 74,100,225,157, 93,192, 44,164,137,154, 32, 44,185, 9,121, 86, 92,178,223,179,112, 47, 19, 57, 75,181,
+ 94, 41,105, 69, 39,161,231,235,165, 74,146, 66,158,203,249,234,229,154,243, 50, 33, 37, 61, 0, 12,176,132, 74, 8, 75, 21,121,
+185,111,115,251, 62, 45, 66, 69,148,169, 32, 10, 84,232, 99,212,160, 38,245, 93, 44, 45,162,187, 30, 52,106,135,173,220,251,154,
+189,191, 20, 5,230,143,241,165,255,231, 79,112,115,125, 9, 63, 79, 41,254,215, 67, 56, 64, 56, 83,185, 98, 85, 59,207, 62,126,
+167,243, 24, 17,177,211, 8, 31, 2, 86,235, 53,250,253, 30, 55,215, 87,240, 92,127,150, 35,130,103, 70, 16,193, 39, 94,125, 5,
+ 63,254,195,255, 6,126,237,159,254, 6,158, 60,121, 18, 71, 11, 68, 24, 67,236, 70, 16, 17, 48,143,120,250,240, 91,120,244,238,
+235, 56, 59, 57,194,199, 63,252, 10, 78, 94,124, 5, 67,223, 99,189, 90, 97,179,217,224,232,248, 4,235,245, 10,125, 63,192, 57,
+ 91,220, 11,100, 29,198,113,196,148, 18,226,166,105,198,245,205, 46, 86, 59, 44,112,253, 58, 6,201,248, 0,107, 93,180, 30,205,
+ 35,140,173,156,127, 6, 67,199,243, 76, 41, 58, 57, 32, 66,154,108,170,248, 69, 4,211, 52,167, 24, 78, 66, 24,247, 48,214,162,
+183,209,249, 18, 18,229,142,147,173,111,158, 38,248,121,194, 27,223,122, 7,159,248,248,135,171, 3, 69,170, 78,165,182,166,234,
+120, 49,143, 78, 41, 85,105, 76, 90,252, 72, 85, 17,175,179,149,210,198,145, 29, 52,197, 62,153, 54,231, 58,179, 53,165, 67,154,
+ 31, 68,105,194,175,164,128, 96,170, 88,127, 73,120, 92,136, 82,245, 56, 53,219, 64, 69, 5, 23, 47,136,148, 82,149,118,213, 36,
+ 66, 85, 9, 15,170, 16, 22, 73,142,151,156, 62,168, 11,190, 18,146,147,158, 91,163,109,178,104, 5,100, 57, 57, 51,166,100,107,
+164,148,168, 76, 7,170, 93, 78, 50, 49,199, 94, 12, 40,132,194,101,175,197, 70,205,168, 47,159,180,224,156, 81,112, 94,180,176,
+207, 9, 75,113, 24,229,249,118,182,163, 69,141, 19, 33,248,248,243, 10, 55,128,121,193,151,168,135,116, 13,148, 44,162, 57, 53,
+251,207,164,189,194,155, 74, 95,240, 50, 79, 93, 33,191,212,201,203,192,233, 31, 90, 78, 37,138,238, 85,198,245,140, 82,129, 84,
+ 37,116,158, 9, 82,115,179, 66, 14,150,182, 67, 90, 26,164,153, 75,166, 9, 47, 88,181,167, 22,196, 88,117,162,164, 6,128, 67,
+210, 38, 95,197,174, 80,190, 24, 84, 91, 39,169,138,117,185, 66,229, 88,169,147, 33, 56, 2, 56,196,155,191,235, 29,104,142, 11,
+220,211, 71,239,161,179, 29,238,220,127, 22,219,203, 75,116, 93,135,123,199,107, 92,239,110,240,229, 63,250, 3,152,190,135, 49,
+ 6,151,187, 61,222,122,114,129,211,163, 53,134,174,199,126, 63,161, 3,225, 98,187,139, 65, 11,198,162,239, 7, 60,115,247,172,
+197, 53,146,214, 48, 84,157, 0, 26, 43,160,134,210, 36, 37, 44, 71, 21,124, 21, 73,152, 3,144, 92,117,108,228,160, 11, 46,162,
+ 25, 67, 21,224, 16,231,103, 9,242,152,198, 42,149,235,172,165, 12,149, 54, 79, 9,135,136,102, 84, 0,149,202, 84, 91,223, 70,
+106,134, 0, 14,238,151, 36,188, 81, 21,188, 44,134,133,149,173, 82,134, 47, 37, 34, 50,207,249,164,248, 64,219,214, 57, 20, 44,
+ 36, 47, 56, 7, 36,176, 76,184,106,219, 33,170,205, 73,205,162,216,132,116,136,226,130, 47,139, 32,145, 3,252, 47,160,211,175,
+168, 22, 89, 80, 49,150, 34,109,206,187,234,151, 62,122,244, 4, 31,123,238, 14, 94, 15,123,188,183,223,149,205,136,184, 34, 51,
+ 67,202, 68,176, 68,128, 4,236,166, 17,179, 15, 56,219,172, 49,237,182,240,233,189, 5, 97,220, 57, 61,193,180,221, 97,102,198,
+ 28, 24, 63,254, 67,223,135,147,147, 83,252,215,255,232,127,140, 29, 18, 67,240, 33,138,180, 28,226, 28,219, 88,139,209,207,240,
+129,241,137, 15,191,132,111,255,228,199,112,124,124,130,213,208, 99, 53,244, 24,134, 21, 86,235, 13,134,245, 26,206,185, 88,157,
+ 39,154, 87, 72,139,173, 64,240,171,255,232,127,192,135, 94,121, 25, 63,252,131,223,143,207, 60,125,138,247, 31, 63,197,147,243,
+115, 60,121,122,129,235,212, 98, 29,183, 55, 32, 14,169, 51, 83, 55,212,108,103,138,159, 55,222,179,157, 53, 41, 61, 12, 49, 98,
+ 57, 48,200, 68, 46,132,181, 54,218,249, 68,208, 65, 48,141,187,168,186, 79,238,157, 98,247,243, 51,230,121,194,159,126,227,117,
+188,250,234,203,112, 73,105,221, 32,173,203,161, 58,217,176,114,155, 62,117,144, 72, 98, 8,138,100,130,162, 22,177,169,195,114,
+161, 49,102,113, 26,116,244, 43, 43, 77,141, 44,237, 22,139,110,222, 34, 4, 9,139,206, 23,181,112, 34, 61, 82, 16,105, 7,239,
+148, 7,229, 32,245,220, 29,210,110,129, 74, 84,203,194,208,204, 20, 48,121,142,126,240, 55,165,169, 42,169, 1, 69, 81,177, 4,
+ 70, 45, 13,165, 13, 61, 44,160, 81, 73,185,158, 94,219,164, 53,132,179, 59, 72, 20,107,197, 72, 75, 21, 85,221,202,178,117, 27,
+237,152,145, 3, 18, 96,229, 64,212,194, 69,202,188, 60,109,182, 33,142, 6, 75, 58,158,138, 39,215, 39,250,246,240,114,144,252,
+ 80,191,107,110, 98,123, 22,126,123,141, 71,151,210, 45,201,174, 34, 36,219,103,107,229, 97,110,102, 55,133, 71, 93,132,111,162,
+216, 32,234, 0, 64, 13, 48, 89, 1, 74,104, 33,146,107,137,117, 68,162,120,216, 10, 70,210, 84,232,212,204,162,176,248,223,170,
+118,166,226, 91,103,147,179,159, 1, 50, 21,119,152, 91,173, 62,189,215,206, 18, 70, 99, 64, 44,232, 12, 97, 15,130,181,132, 57,
+ 88, 48, 3,211,245, 19, 56,103,112,247,222,125,188,254,103, 95,131,235, 12,122,244, 88,129,240,178,235,112,206, 4,235, 44,110,
+118, 35,238, 30,109, 48, 50, 99,187,221,161,239, 58, 88, 99, 98,170, 20,197, 25, 95,215, 15,248,200,135, 94, 44,135,167,242,157,
+202, 97,200, 64,182,135, 1,122, 67,225,242,240, 68, 15,166, 41,236,241, 18, 8,145,172, 25,208, 27,114,222, 52,149,213, 38, 91,
+ 73, 12, 81, 17,255,100,125, 49,193,214, 36,180,116,152,171,190,235,252, 48,196,242,145, 18,115,189, 9, 74, 40,254,122,147, 90,
+235,181,138, 86,126,184,122, 3, 27, 29,137,181,236, 2, 52,238,238, 34,138,169,234, 50,110,238, 13,134,142,138,151,170, 30,102,
+253,125,162,164,130,213,243,160,170,108,148,255,157,132,154,247, 82,233,120, 69, 40,162, 16,142, 82, 21,176, 10,121, 27, 23,200,
+ 10, 77, 42,215, 12, 28,171,252,226, 77,149, 69,228,109,230, 45,196, 31,254,222,251,143,225,120,194, 27,239, 94,224,122,187,133,
+ 51, 20,239, 47, 22,120, 14,105,150, 71,176,138,228,184,155, 98,212,240, 73,231, 48,237,247,152,211,131,191,247, 30,159,252,240,
+203,120,248,240, 49,230, 16, 48,134,128,159,251,137, 31,193, 31,126,249, 79,241,238,195,247,225, 57, 10,206,186,116,157, 58, 99,
+208,173,214,128, 8,198,113, 15, 14, 1, 63,242,253,223,133, 79,188,250, 17,108,142,142,177,217,108, 48,116, 29, 58,103,225, 92,
+135,110,232,225,250, 1,214,245, 17, 62, 66, 73, 68, 20, 60,254,193,127,249, 15,241, 61,159,251, 78,252, 59,191,244,139,112,206,
+130,189,199,209,230, 8,247,238, 62,131,235,235, 75, 60,124,255, 49,222,120,251, 93, 92,141,113, 49,243,151, 35,108,186,142,158,
+185,116,224,242, 66,105,147, 35, 36,143,186,120,145,182,231,231, 57,182, 37,187, 30, 86, 42,116, 38,152, 0,235,108, 73, 14, 11,
+222,195,219, 25,251,253, 14,253,118,139,243,243, 11,220,191,119, 47, 29,119,235, 72,137,210,117, 53, 37, 67,179, 42,206,145, 52,
+ 31, 4, 73,153, 7, 2, 35,166, 58, 86,242,146,154,146,202,140,169, 22, 47, 81, 21, 89,244, 58,155, 67, 27,233, 1, 14,154,138,
+170,252,150,150,222,129, 66,147,154, 30, 40,213, 66, 66,239, 91,164, 55, 96, 53,194, 83,234,248,220,122, 46,164, 75,170,135,118,
+ 81,227, 58, 90, 90, 63, 41,138, 8, 13,169, 88,110,181, 41,232,113, 3, 43,177,155, 14, 28, 99,149, 76, 41, 7,208, 45,133,148,
+ 21,106,241,182, 77,121,153, 4,102, 73,193, 91,201,170,241, 66,154, 70, 19, 38, 48, 70, 82,107,159,203,161, 18,217,186, 93,108,
+151,181,131,172,181, 73,205,251,100, 89, 4, 96, 45, 59,152,117, 76,199,105,148,156,225,109,198, 80,202,195, 96, 21,130,166, 85,
+242,241, 31,221,146, 76,204,139, 96,138, 66, 50,187,109,163, 21,110, 16,149,203, 54,121, 54, 84, 45,181,211, 5, 34, 98,106,160,
+192, 97,227,178, 77, 35, 82, 62,162,131,217,107, 45, 76, 19,135,184,144, 26, 19,203, 55, 41, 15, 88,226, 76,133, 69,209,146,136,
+ 64, 33,142, 23, 88, 16,219,132,204,112,214,148,147,156,120,198,233,157,123,184,190,120, 2,103, 45, 68, 12,172,143,190,246,158,
+ 25,179, 15, 48,206,224, 38,169, 88,215,125,143,163,213, 10, 83, 96, 28, 13, 3,246, 44,232,186, 30,171,213, 6,155,205,208, 8,
+192,106, 59,189, 25, 63, 43,107,219, 18,180,151,103,244,181, 13, 85,196, 48, 11,169, 73, 1,164,228, 25, 15, 42,177, 74,255, 16,
+202,226, 66,141,164, 84, 74, 88,168,177, 92,172,226,219, 57,189, 17, 58, 96, 11,144, 66,160, 18, 85,139, 12, 9,221,202, 58,170,
+151,151, 75,162, 95,124,186, 22,239, 41,163,235,146,248,175, 10, 49,147,205, 70,171,221,203, 8, 40,246, 42, 88,205, 1,132,165,
+166, 90,101, 22, 6,113,201, 52, 32, 5,121, 47,175, 37,106,250, 73, 69, 86, 88,208,199,210, 36,122,168,147,125, 99, 81, 82,162,
+ 23,245, 64,230,201,170,182,103,114,153,165, 71, 97,215,151,126,239, 15,113,249,244, 9,246,187, 45,166, 57,206,125,125,240,113,
+131, 74,177,183,206,246,133, 8,191,155, 70, 88, 50, 56,114,132,125,136,157, 39,145,104, 43,251,197,159,254, 49,252,254, 31,126,
+ 57, 50, 24,152,241,179,127,241,207,227,183,190,248,175,176,221,143, 81,248, 67, 4, 75, 84, 54,246,110,181, 70,152, 70,120, 14,
+232,186, 14, 95,248, 11, 63,140, 15,189,244, 34,214,155, 13, 86,253,128,213,106, 64,215, 15,112, 54,134, 21, 89,231,208,117, 3,
+224, 28, 36, 68,178,216,118,183,197,127,245,171,255, 29,254,246,175,252,114,204, 69,176, 54,162, 90,157,139, 35, 0, 67, 88,175,
+ 87,216, 28, 29,227,248,228, 4,223,120,253, 13, 60, 49, 64,223,247,184,122,242, 24,243, 60, 33,176,160, 75, 21,146, 71,134, 4,
+ 9, 6,107,192, 0,124,234, 86, 68,165,120, 28,141,176, 8,224, 3, 68, 70,184,174,139,233,112, 57,127, 60,135, 83,169,106,125,
+158, 39,120, 63,227,203, 95,125, 13,255,250, 15,156,193, 16,197, 34,129, 76,169, 12,151,147,197,102,239, 76, 98, 46,134,202, 28,
+ 87,150, 50, 74,135, 8,147,252,246,186, 51,153,187, 45, 54, 69,174,234,140, 1,210,197,141,104, 17, 40, 45,170,226,229,252,188,
+ 98,111,219,137, 38,171,244,183, 42,206,171,149, 51,107, 28, 90,108, 61,231,141, 23, 53,220, 38,219,204,178,114,157,113,139,216,
+181,104,238,164,118,223,178, 54,133, 52, 43,157, 64,198,168, 89,244,130,214,216, 96,179, 15,117, 71, 58,201,141, 10,149,178,230,
+ 86,148,212,187,252, 76, 82,118,230,228,231,186,221,115,138,173, 55, 59,168, 82,137,158, 15, 51,206,162,201,142, 16, 44, 59, 31,
+109, 40,100, 80,244, 58, 86,137,127,229, 14, 72,135,135,156, 94,201,210, 6, 79,149, 70, 74,190,130, 44,109, 30, 20,242,166, 46,
+ 11, 33,155,232,152, 76,213, 74, 84, 32, 8, 42,179, 65, 41,254, 95, 82, 40,195,146, 9,124,139,174,157, 72, 18,109,174, 86, 50,
+180,240,200,235,147,221, 18,104,214, 10,239,168,240,226,227, 7,230, 70,226, 79, 28,237, 25,229,148,199, 82, 80,162,164,223, 55,
+153,168, 27, 8, 1,206, 70,229,226,148, 63,135, 35,156,222,125, 6,251,155,203, 56,175, 76, 41, 81,100, 9, 52,199, 56,201,141,
+235,224,230,128,145, 5,251,192,184,218,143,113,209,242, 1,253,176,194,233,217, 93,124,238,179,159, 42, 94,107,105, 30,210,154,
+174,165,195, 61,244,120, 93, 68,146,255, 78,138,250,159, 84, 53,202,233, 53, 50,166,178,196,165,232, 8,211, 20, 10,131,230,193,
+136, 51,109, 40,125, 66,180,242, 72,114, 19,164,198,126,253, 15,200,214,245,144, 43,110, 67, 13,174, 53,127, 54,147, 79,175,109,
+202,233, 45,170,112,237,227,171,200, 75,125,127, 29, 90,232,110,209, 91,152, 58,227,166,172,255,208, 9, 44,138,241, 92,215, 69,
+174,214, 55,137,180, 66, 42, 57, 5,117,246, 64,197,179, 46,213,121, 33, 85,112, 71,214, 52, 85,118,115,231,179, 82, 36, 51,213,
+153,127, 22,231, 41,219, 90,211,122, 79,149,188, 33,194,175,255,198, 23,113,113,254, 4,187,253, 14,243, 60, 99,154, 39,124,228,
+193, 61, 60,189,184,196,251,201,205, 33,130,196, 68,183,216,122,143,149,181,160,224,177, 77, 80, 12, 22, 96,102,198,223,249, 27,
+191,136,175,191,254, 45, 60,122,252, 20, 99, 8,248,228, 71, 63,130,223,252,237,223,193,222,251, 40,152, 75,247,147, 79, 54, 42,
+ 99, 44,230,113,143,192,140,251,247,238,226, 39,126,232, 7,240,226,115,207, 98,189,222,160, 31, 6, 12,125,143,190,143, 1, 42,
+174,235, 65,194, 48,206,193,186, 14, 4,130,135,197,126,154,240,235,255,231,111,225,223,255,155,127, 3, 93,223,131,200, 98,156,
+246, 56,127,122, 1,231, 12,120, 26, 33, 32,244,174, 3,109,214,216,221,244,248,182,143,126, 4,231,151, 87,120,235,157,119,177,
+191,122, 10, 4, 3, 17, 95, 58,138, 83,136,173,198,117,103, 49, 37, 37,112, 87, 84,242, 53,190, 20,198,166,152, 90, 6,121, 15,
+114, 93,244,199, 39, 29,130,179, 46, 9,179,226, 63,135,224, 49, 77, 35, 30, 63,126, 10,239,227, 33,134, 68,177, 58, 10,128,132,
+ 14,133,172, 70,101, 33,152,172, 57,227,120,120, 72, 55,117,224, 80,158,209,216, 5, 72,221,135,164,113,176,201, 38,120,152, 91,
+144,215,202,218, 59, 16, 85,131, 54,182,227, 3,130, 68, 43,132, 21,197,124,167,197,128, 52,247,163, 66, 10,150, 41,121, 66,105,
+206,159,131,139,114,240, 12,101,141, 10,213, 81,224,225, 70, 28, 63, 79, 1, 81, 49,169,117, 78,199,147, 82,237, 88,201, 33,169,
+ 81,154,198, 52,169,161,243, 7, 36, 31, 38,102,124,158, 75,214,113, 34,181,176, 53, 65, 89,199, 72, 47,122,186, 32,146,252,122,
+166, 2,112, 82, 44,170, 70,228,234,108,246, 8,186, 49,233, 64,193,241,126, 80, 56,218, 42, 6, 84,107,155, 72, 19,187,156,219,
+250,121,239, 2,161, 53, 64, 55,169,115,146, 54,117, 13, 62, 41,214,182,101,254, 53, 90, 31,221, 2, 88, 80,126,132,105,133, 0,
+203, 80, 11,109, 79, 43,190, 91, 98, 21, 55,169,210,182,136, 22,234,204, 67, 85,120, 41,108, 52, 85,169,156, 4,165,216, 67,178,
+215,114,220,207, 9, 74, 19, 63,199, 4,128,156,137,221,100,207,240,194,113,142, 38,234, 41, 37,131, 97, 88, 97,119,115, 5, 15,
+ 66, 72,138,101,147, 46,152, 33,130, 21, 65, 7,138, 1, 47, 49,109, 5,206,117, 88, 31,157,226,195,175,190,138,207,124,250,227,
+133,210, 86,129, 86,117,220,193,185,157,167, 80,225,186, 93,140,229, 44, 40, 79,202,245,172, 54, 93, 23, 35, 13,191, 71,245,243,
+ 99,123,218,136, 89, 60, 44,170,193,152, 91,196,156,219,234,164,148,239,218, 53,153, 53, 10, 10, 18,148, 55,178,102,147, 87, 75,
+ 8,181, 93,153, 91,159, 86,137,215, 34,228,185,169,180, 11, 84, 99, 56, 69, 89, 95,170,112,146,204, 65, 24, 77, 78,247,211, 17,
+171, 54,145,250, 88,205,244,137,114, 43,149, 26, 81, 93,190,119,144, 68,125,249,117,114,122, 94, 21,214,201, 1, 57, 76, 20, 12,
+164,160, 97, 27,144,135,134,221,168, 77,157,171,192,232,143,190,252, 13,156, 63,125,132,253, 46, 38,171,117, 4,252,220,143,253,
+ 32, 94,123,235, 29,236,247,123, 88,235, 96, 82,198,186, 49, 6,147,247, 88, 27,131, 48, 79, 24, 83, 21,207, 2,244,157,197,223,
+254,171,191,128,253,184,199,111,255,238,239, 99, 10, 1, 71, 71, 71,120,243,205,183, 48,134, 16,171,243, 84,249, 6, 65, 10, 85,
+137,159,110, 10,140,143,125,232, 69,252,216, 15,126, 63,158,189,255, 12,214,171,180,153, 15,171, 56, 55,239, 98,158,129, 37, 2,
+140,131, 75, 66, 52, 78,115,231,175,124,245,107,248,249,159,254,201,216, 1, 19,198,126,158,209, 89,139,251,247,159, 1, 56, 96,
+158,102,236,246,123,236,198, 17, 36,130,231,158,185,135,113,246, 56, 61, 61, 65,223, 57, 56, 8,222,124,243, 93,248,155,109, 57,
+ 28,186,180, 72,239, 2, 99,227, 44,118, 41, 69, 46,150,232,105,166,154, 68,190,185, 21,159,103,180,228, 28,200, 24, 4, 31,146,
+ 93, 44, 5,117, 36, 23, 65,172,214, 61,174,174,174,241,204,189,187, 21,218, 98,180, 70, 35,197, 61,211, 45,206,148,188,113, 41,
+239,179,144,148,128,145,216, 45,200,163,132,124,192,139,162,185, 22,211, 93,219,251, 37, 26, 36, 71, 21,107,104,147,198,169, 8,
+212,251, 83, 37,156, 74, 2, 36,125,152, 92, 8,147, 5,104, 68,122,121, 6, 28,114,235,185,180,198,169,140, 7, 91,139, 22,183,
+ 29, 70,181, 16,113,154,185, 49, 39, 22, 5, 36, 17, 29, 19, 61,145, 80, 44, 91,124, 75,168, 9,229,140,134,236, 43, 47, 12, 7,
+ 44, 51,201,210,123,207,213,191,168,141,143,138,152,184, 20,161,233,143,150, 81,162,180,217,116,249,243, 90,107, 35, 82,185,216,
+124,147, 15,189, 10,237, 85,232,143, 84,181, 19, 37, 64, 24, 81, 19, 98, 86, 42,252, 76, 4, 85,225,100,121, 51, 23,104,235,243,
+ 18, 65,176, 96,115,100, 75, 91, 99, 87, 78, 45,192,154,166, 86, 43,105, 78, 51,160,218,210,105, 51,191,219, 88,202,165,240, 8,
+ 11,118,184,180,226,175,131,230, 59, 62,224,132,134,246, 22,164,197, 33,141, 90,146,118,252,114,211, 28, 86, 8,215, 87,215, 37,
+ 9,201,144, 0,214,130, 38, 15, 79,113, 94,187,234, 45,172, 0,222,196, 22, 36, 57, 2,193,162, 27,122,204,227,174,182,132, 67,
+154,187, 88, 7, 33,130, 19,224, 58,204, 48, 38, 42, 42, 45, 69,216, 69, 63, 12,120,245, 67, 47,197, 27, 54,183,221,200, 64,210,
+134,110,210,194, 23,255,191, 42, 87, 35, 53,175, 58, 14,160,218, 86, 84, 34, 62,147,208,134, 9,208, 48, 42,100, 66,154, 18, 90,
+160,162,125,153,242,152, 66,106,254,188,154,241,171, 4,198,220,254, 72, 39,108,211,210,207,154, 3,109,251,157,171, 78,124,250,
+169,105,113, 48,121,163,230, 54,159, 92,210,236,209, 96,129, 72, 36,149,150, 69, 75, 60,125,180,168, 24, 44, 12,151, 75, 83,160,
+148, 60, 24, 78, 66,185, 74,250, 98, 37, 10,226,131,150, 66, 83,213,235,170,128,210,146,217,132, 71, 84, 53,174,198,104,230,238,
+ 67,150,232,233, 69,151,149,142, 68, 88, 20,119, 33,206,139,246,227,132,215, 94,123, 29,219,155,235, 24,144, 17, 2,158, 57, 94,
+161,115, 14,157,235,176,222, 28,227, 67, 71,103,120,244,240, 33,246,251, 29, 56,197, 0,123, 31, 98,203, 61, 37,233,173,134, 30,
+191,242, 11, 63, 7,103, 13,254,183,223,252, 29,248,224,113,188,217, 32,204, 19, 38,102,244,105, 1, 9, 58,181, 79, 24,176, 14,
+227,236,241, 61,159,249, 36,126,240,123, 62,135,123,119,238, 96, 88,175,209, 91, 27,171,243, 46,254,178, 93, 95,114,134,156,237,
+224,220, 0, 99, 45,188,247,248,147,175,253, 9, 62,245,241,143, 97,216, 28, 1,193,199,107,192,115,140,226, 76,121, 8,214, 18,
+ 86,195,128,190,115,165, 53,233, 66, 64, 55, 77,144, 7, 15,192,204,216,207, 30,227, 91,239,128,103,143, 57, 80, 73,202, 51, 68,
+216,133, 0,103, 44, 30,220, 57,195,245,126,135,203,237,174,156, 85,131,231, 56,114,202,153,215,204, 8, 28,213,243,198, 38, 2,
+154,117,241,238, 73, 45,248,224,163,179,224,155,111,188,131,187,119,239,148, 12, 10,202,112,165, 84, 85,106, 49,100, 93, 63,107,
+151, 17,233,128,156,201,106,156, 53, 75, 66,201,206,153, 70, 8, 28, 17,177,133, 15,161,215, 80,157, 15,112, 27,168, 75,217,173,
+203,154, 75,162,114, 4, 90,112, 84,173,211,129, 67,117,109,181, 77, 69,239,124, 6,192,132,130,176,102,134,106,187, 75, 35,224,
+170,143, 31,181,179,255, 58,197,175,124,115,225,136,126, 69, 28,123, 86,191,187,180,148, 53,169, 85,178,168,194, 2, 77,177, 83,
+ 17,208,249,187,136,115,121, 69,223,215, 7,152, 60,166,205,135,246,188, 14,114,197,143,231,152,104, 14,201,127,159, 52, 14, 57,
+200,133,146,112, 41,254, 57, 3, 15, 95, 84,251,149, 42, 67,117,195, 38, 82, 98, 89, 46, 10,249,186, 95, 86,253, 84,196,131,151,
+ 21,162,238,175,180, 72, 78,189,197, 25,230,154,158,232, 66, 97,157,173, 63,185,141,176, 4,209,100,234,151,136,169,243, 31,105,
+211,192, 14,155,239,210,136,146, 76, 51, 59,150, 38,136,128,110,173,205,177, 80, 83,234,128,220,246,204, 73,202, 10,148,125,200,
+126, 28,163,109, 38,189,204, 20, 4,189, 73,201,106,214, 36,207,174,193, 20, 4, 94,128,142, 25,226, 6, 76,227, 30,227, 52,194,
+ 90, 11, 27,226, 60,140, 12,129, 83, 68,228,110,156, 96,156, 1,205,113,131,203,161, 3,206, 57, 12,171,190, 10,249, 18, 84,193,
+176, 73,118, 8, 78, 27,116, 77,227, 41,240,131,228,139,102, 81,179,232,140,226,205,224,149,124,214,207,175,151,169, 76,138, 29,
+145,191,212,168,102, 54,173, 10, 22, 18,149,244, 74,164, 17, 11, 94, 86,186,246,220,222,151,218, 73,161, 67, 91, 91,163,158,208,
+ 22,198,202,182, 83,215,215, 20,169,110, 20,142,169,196, 41,237,177, 61,224, 20,162,204,181, 69,131, 63,110, 9, 20,210, 99,197,
+114,120,224,140,112,165, 2,210, 80,176, 79, 37,226, 84,179,241, 70, 69,164,176,159, 37, 14, 54, 5,174,137,168,121,150, 70, 27,
+211, 7,110,232, 57,240,134, 20, 92, 34, 11, 64,200, 16,126,251,139, 95,194,213,213, 5,166,105,194,217,224,240,232,122,194, 56,
+205,184,186,185, 41,233,110, 60,141,152,198,177, 44,219, 14,192, 54,112,170,208, 5,103, 71,107,252,219, 63,255, 51,120,253,205,
+183,240,207,127,247,247, 32, 44,145,106, 24,102,204, 44,112,162,102,136, 84,223, 11,136, 16,130,199,231,127,228, 7,240,185,239,
+248,118, 28,173,227, 97,162, 79, 8, 86,235,108,252,127,107, 74, 44,166,201,122,111, 17, 4, 31,240,207,190,248, 59,248,220,103,
+ 63,131,245,102, 5,230, 0,182, 6, 60,206, 69,235, 96,156, 3,207, 19,136, 44,172, 77,174, 21, 50,169,245, 27,223,207, 41, 0,
+121,240,108,225,107,191,253,230, 59, 73, 63, 96, 96, 65,120,233,254, 51,184,115,122,134,247,207, 47,112,179,223, 97, 63, 77, 81,
+164, 26,162, 70,194, 80,194, 74, 83, 92, 96,243, 92, 24, 89, 36, 10,138,160,148,204,234, 8, 41, 97,204,123,188,255,248,105,129,
+195,100,238, 5,197,234,166,118,102,160, 18,253,178,194,131,212, 40,186, 68, 18,231, 0, 24,171,196, 80,241,154,197,128,146,116,
+136,228, 60, 6, 66,193,132, 86,166,199, 66, 25,157,186,158,172, 35,173, 69, 52,193,164, 32, 99,137,234,103,150,130, 54, 93,236,
+143,136, 4,183,200,222,143,207, 75, 37,186,197, 13,189,172, 35,165, 45,143,133,229,169,134,113,201, 66, 44, 87, 14,184, 34,240,
+ 62,164,234,183,198, 58,103, 28,110,224,208,230,139,103,120,203, 2,188,211, 28,190, 69, 61,119,170, 8,101,209,235,194, 34, 75,
+ 62,139, 28,137,138,152, 86,146,128,142, 81,231,252, 25, 68, 84,177,172, 42, 15, 37, 65,177,106, 87,132, 53, 41,191, 20,189, 58,
+ 23, 94,179, 56, 98,128, 13,218, 13, 61,161,178, 13, 87,232, 82, 17, 88,231, 98,143, 4, 11, 93, 45,144,137,114, 7, 10,201,162,
+ 24,174,243, 6, 82,201, 52, 48, 56,240,242, 53,246, 28,186, 77,200,198,202, 41, 68, 74,228, 68,234, 96,169,163, 71,107,180, 36,
+ 14,106,120, 58,100,162,147, 52, 24,198,124,130,172, 66,149, 88, 41,250,253, 14,112, 93,244,167,123, 65, 39, 2,233, 12,100,244,
+240, 36, 56,238, 13, 16, 0, 31,106,181,123,124,247, 30,118, 55, 55,224, 20,203,104,141,193, 92,136,190,241,251,234, 58,135, 57,
+196, 47, 58, 6,178,164, 8, 73,231, 82,168, 4,151, 74, 89,131, 7, 42,114, 84,154,217,152,104,182,248,114,190, 36,146,236, 50,
+202,247,104, 20,106, 50, 43,203, 23, 76, 31,209,225, 20, 77,200,132,180,219, 26,213, 10, 62,222,232, 92,196,111, 69,197,174,125,
+ 90,165,122,169,135,131,246, 65, 78,244, 41,106, 79,236,164,213,248, 25,113, 89, 90,107,104,126,142,102,226,151,197, 66,244,129,
+162,106, 91,235, 97,167,113, 64,150, 10,192, 36, 59, 35, 23, 56,205,225,145,179,144, 96,154,142, 16,169, 3,149,148, 67,130,158,
+153,228,177, 9, 55,147,191,124,208, 34,181,161, 39,181,175,228,246,191, 18,168,166,147,232, 91,111, 63,196,110,123,141,105,220,
+227,185,163, 1, 36,140,158,128,105,158,113,113,121, 5, 14, 30,231, 23,231, 56,191,188, 41, 45,118,103, 18, 19,157, 67,100, 84,
+ 19,208, 91,139,127,252, 63,253,175,145,230,230, 3,108,223,131,194,140, 49,100, 66, 87,253, 92,162, 14, 23, 62, 4,252,245,159,
+255,105,188,250,202, 43, 24, 86, 3,156,117,113, 3, 71, 13, 17, 42, 17,178,226,211, 63,123, 4,182,184,124,242, 20,255,252,119,
+255, 47,124,225,243,159,143,152,233,224,147, 96, 48, 36,109, 72,138,116,242, 51, 96, 44,136, 67,220,208,173, 45,102,165,144, 15,
+ 84,195,128,179,179, 51,144, 49,216,238,118,120,250,244, 2, 39, 67,135,227,227, 99,156,158,156, 96,246, 30, 87,187, 29,220,218,
+225,238,230, 20,182,183,216,237, 39, 92,109,119,240, 9,123, 11, 35, 48,233, 25, 20,163,232,137,200,148,186,180, 97, 35, 69,107,
+ 50,195,135,232,161, 15, 33,110, 98,217, 85, 99,178,125, 77, 7,108,168, 3, 17, 52,152, 37, 7, 28,113, 58, 84,147,173, 7,128,
+124,184, 53,162,196,111, 82,199,153,156, 9,115,169, 19,150,239, 23,147,251,110, 82,181,179,229,182,145, 66, 4, 45,241,202,122,
+157, 20, 52,166,225, 50,110, 78,155, 51, 39, 34, 97, 28, 13, 10, 56,100, 12,169,169,209,158,134,170, 61, 52,139, 96,243,123,103,
+129,205,216,110, 99,128,140,230, 37,106,214,179,224, 3, 24,136,227, 24,170,129, 54,165,237,174,168,105, 57,166,180, 8,223,168,
+182,185,165,153,191,183,254,123, 83, 4,168,138,172,169, 10, 65,214,108, 11,212, 3,165, 41, 65, 50, 89,227,144, 70,122,204,165,
+ 11, 42, 98,235, 56,177, 8, 99,147,131, 40,139, 33, 77, 29, 13,234, 57,126, 85,231, 47,192,118,105, 12, 84, 1, 84, 81,148, 81,
+217, 34, 80,161, 51,181, 61, 83, 14, 78,183,169,223,235, 60, 36,230, 38, 91,211, 2, 59,138, 95, 87,241,123, 11, 31,158, 53, 64,
+131,154, 74,176,145,230,233,246, 76, 78,225,210, 4, 46, 44, 47, 14, 62, 64, 93,213, 46,218, 31,248,135, 73,123, 19, 1,241, 51,
+224,167, 56, 99, 73, 49,142,206, 25, 12,189,133,176,135, 99,137,173,248, 76,166,179,132, 7,207,127, 8, 87,231, 79, 48,172, 86,
+152,246, 91,120, 33,116,198,198,214, 38,153,120,115,100, 1, 4,170,205,131, 40, 86,234,229,166, 51, 82,103, 35, 98, 80, 67,234,
+116, 11,152, 74,164, 97,252,110,121,209,130,170,109, 64, 46,150,140, 84,129,194, 64, 12,199, 22, 97, 22,177,209,162, 10,197, 45,
+113,161, 68,202,158, 82,187,208, 44, 53, 66, 55,107,228, 76, 73, 24, 59, 36,165,149,195, 84, 86,185,107,174, 44,113,177,219, 25,
+253,190, 10,224,133, 26,114, 84,153,231, 45,141,163,202, 42,163, 59,123,229, 52,108,168, 33,176,233, 35, 96, 30,187,232, 32, 14,
+232, 32,152,230,240,184,184, 95, 21,249, 40,120,174,127, 0, 0, 32, 0, 73, 68, 65, 84, 10, 84, 81, 24,121,177,169,172,105, 46,
+ 48,154,226,202, 32,101,239,201,113,138, 82, 83, 13, 57, 43,141, 21, 27, 0, 16,124,237,207,190,137,105, 28,177,182, 17,146,244,
+209, 23,159,197,195,243, 75, 8, 11,254,224,107,175,225,201,213, 77, 2,117,164, 57,113,130,152,140,115, 84,155,119, 68, 56, 29,
+122, 76,187, 61, 66, 78,127,114, 29, 16,102, 76, 62, 64, 66, 2,182,112, 69,153,102,148,242,243, 15,158,193, 47,253,155, 95,192,
+233,241, 6,214,186,216,161,178, 22, 96,198,159,190,254, 6,222,125, 20,211,217, 78, 78,142,113,247,236, 12, 71,235, 13,200, 24,
+188,241,246,219,120,250,244, 2, 63,245, 19, 63,134,159,252,241, 31,137,194,182,146,239, 32, 17,105,235, 3, 32, 28,219,226,206,
+ 1,222, 87,125,100, 18, 2, 85, 91,151,133, 75,106,245,179,227, 35,124,232,229,151, 49,205, 51,238,221,185,131,103,238,221, 69,
+215,117,184,190,190,193,126, 28,113,117,117,141,119, 31,190,143,103,238,221,193,106,181,198,107,111,188,137, 55,223,123, 31,222,
+215,132, 45, 73, 86, 51, 73,155, 86,102,146,199,140,108,155, 4, 96, 57,174, 57, 64,132, 49, 77, 19,156,139,218, 26,147, 49,197,
+141,102,130, 84, 54,120,126,238, 90, 1,108, 38,128, 17,161, 85,161,231,106, 75,229, 33,232,233,166, 64,231,127,167,142, 23, 27,
+192,196, 32, 21,201,130,100,142, 36,184, 40, 18,173,179,124,253, 98,101,164, 42,245, 88, 93,128, 40, 84, 59, 9,214,216,194,155,
+207, 9,142,185,131, 17,249,251,166,218, 69,243, 65,150, 57, 10, 36, 51, 75, 63,169,176,167,174,143,177,186,166, 82, 18,115,218,
+154,117,182,182,239, 11,242,244,182,214,187,178,128,229,124,143,220, 17,166,150,161,174, 69,170, 66,164,233, 29,181,123,144,218,
+252,121,148, 92, 70,108, 89,164, 86,240,232, 21,168, 83,152, 2, 92, 50,203, 35, 44,140, 72, 21,158,212,140, 29, 72,151, 75,233,
+ 0, 72, 90,104,151, 50, 55,248,150,161,179, 73,206, 13,157,136, 23, 95,150, 75,213,206,130, 91, 55, 68,119,200,105,107, 51,108,
+139,135,175,196, 61, 74,170, 16,169, 33, 96,137,105, 48, 11, 13,253,168,156, 50, 22,102,124,160, 37,236, 52,251, 56, 29, 56,232,
+110,165,195, 31,150,133,213,198,212,206,223, 41,157,196,227, 5,169, 68, 50, 1,102,198,198, 1,243, 28, 57,241,227,204, 32,178,
+133,161,251,226, 71, 62,129,135,239,190,141, 87, 62,245, 93,248,202,151,190,136,253,236,177,233, 92, 12,144, 49,241, 38, 15,233,
+117,243,169, 54, 11, 58, 92,215, 23,188,169,158,133,152, 2,154,161, 34, 70,202,236,118,164, 42,210,168,132,176,156, 87, 94,185,
+201,185, 57,193, 42, 86,149, 11,162, 55,187,206,155, 33,147, 82,188,215, 8, 68, 5, 17, 34, 45,226, 93,176,253, 40,139,231,164,
+108,154,101, 94, 95,238, 99, 69,114, 67,245,110,231,128,150,122, 42,174, 25,212, 68,141,196, 78,197,158,162,182,249, 85, 43, 75,
+ 67, 49, 14,206,115,229,200, 77,138,152,167,230,110,130,170,230,213,152,131, 91, 15,139,149, 86, 71,210,222,110, 80,159,155, 37,
+ 2, 89,184, 1,205,228, 57,153,168, 54,129, 36, 79,122, 61,152,213, 96, 55, 46,176,145, 90,173, 17,118,187, 61,152, 3,238, 31,
+175,176, 73, 65, 33,100, 44,166,105,196,110, 63, 70, 59, 88,106, 83, 90,235,162,205, 43, 4, 4, 97,172,157,195,138,128,221, 60,
+167, 12,107, 1,217, 14, 78, 60,118,179,143,204,251,244, 36, 75,105, 1, 19,118,227,140,127,239,151,255, 50, 94,126,225,133, 72,
+102,179, 14, 95,251,198,107,120,247,225, 35,124,228,229,151,240,241,143,124, 24,159,254,196,199,240,153, 79,127,170, 58, 71,210,
+104,167,119, 29, 94,122,225,133, 20,133,155,238,131,224, 17,160, 42,185,226,189,103,136,115,145, 64, 41,177, 10,106, 36,160, 93,
+ 23, 43, 37,102, 24, 8, 92, 23,133,109, 15,238, 59,220,187,123,183,172, 7, 87, 87, 87,112,206, 98,109,214,232,250, 1,167,167,
+167,184,184,186,196,123, 15, 31,225,197, 7,207,226,104,189,198, 87,191,249,173, 20,151, 44, 69,125, 77,186,202, 67,237,132,149,
+ 72,233, 20, 36, 18,188,199,205,205, 22,155,205, 58,165,119, 81,201, 31,168, 52,178,186,171,112, 14,103, 74,144, 7, 73, 68,206,
+120,141, 34,225, 46,115, 10,164,104,232, 43, 89, 81, 22,158,234, 44,198,172,135,103, 66, 52,192, 43, 20,119, 46,181,147,141,151,
+ 85, 48,140,174,146,242, 1, 66,179,200, 42, 77, 52,109,218,201,197, 17, 56, 20,209,107,246,241, 83,178,155, 53, 35,212,116,255,
+146, 68, 0, 18, 49,195, 6, 15,155,186, 89,118,154,176,221, 28,129,225, 98, 59, 59, 9, 21,173,117,202,105, 85, 83, 25, 15, 54,
+116, 72,187, 31, 73,186, 6,217,137,194, 45,252, 73,227,171,244, 65,137,148, 17, 60,207,219, 51, 23,160,174,129,201, 42,153,162,
+152,141,165, 70,140, 86, 62, 53,115,188,206, 90,168,167,100, 64,121,109, 51,141,206,167, 2,188, 40, 23,141, 38,219,173,227,106,
+ 77, 82,231,253,132,136,191,229, 20,208, 83,109,180,250,224, 39, 69,156,206, 42,248,212,233, 45,189,196,245,229,100, 45, 13,210,
+160, 26, 92,177,208,201, 29,170,240,228, 80, 23,167, 55,105,136,106,253, 72,142, 12,149, 91, 29, 9,104,129, 90,139,253,252, 22,
+195,156, 2,164,180, 36, 47, 6, 82,235, 75, 36,122, 93,167, 84,105,135, 32,232, 59,130,243,132, 89, 0, 15, 0, 28, 32, 54,194,
+ 99,158,255,208,171,248,227,223,251, 93,252,232, 79,253, 60,190,242,165,127, 17,147,172,122,130,177, 0, 79, 1,157, 49,152, 80,
+ 1, 55, 69,151, 96, 12,250,174, 43, 98, 30,205,208,215,243,103,110,176, 8, 25, 78, 16,111,156,114, 66, 85, 39, 89,144,170, 4,
+ 73, 42,104, 65,161, 19,161, 0, 28,249,135,144,161, 34,202, 91, 36,176, 22,166, 62, 21,108,105, 58,244,160,206,241,242, 67, 84,
+ 83,250,164, 84, 96,164,230,126,133, 73, 95,240,179, 26,149, 68,202,222,163, 97, 15,210,114,236,137, 14,108, 61,116,251,193, 52,
+ 29,112, 42,227,153,212,232, 65,167, 32,105,160, 15, 85, 89,205, 7, 72, 51,213,127, 49,138,199,172,190,247,100,120, 7, 96, 11,
+ 23,189,161,200, 29,224, 49,164,153,217,171, 40, 14,117, 54,173,119,134,136,160,183, 22, 96,143,103,239,158, 98, 14, 1,103, 43,
+135,119,199,189,138,118,172,239,201, 16, 33, 48, 99,112, 14, 27,241,216, 6,134, 79,255,221, 13, 3, 16, 2,110,198, 25,148, 2,
+ 82,202, 48, 32, 48, 78,142, 54,248,107, 63,255, 51,120,249,197, 23, 96,140,193,195, 71,143,241,245,111,188,134,239,251,220,103,
+241,201,143,190,138,207,126,219, 39,163, 32,206, 57, 56,219,197,254, 77, 94, 31,200,128,200,194, 88,151, 84,217, 86, 29,198, 19,
+ 87, 32,147,210, 82,219,115,183,221,166,120,211,148, 60, 69, 58,216, 38,145,225, 20, 82,215, 80, 74,112,179, 22,142,227,135,242,
+193, 99, 88,173,208,175, 6,204,147,135, 15, 33, 42,230, 79,142,241,252,253,103,240,149, 63,251, 6,206, 47, 47,209, 59, 7,151,
+240,157,227, 56, 71, 59,155, 40,129,151,122,198,108,111, 83, 37,137, 50, 91,191,190,217,226,193,179,119,227, 38,156,170,252,156,
+ 63, 96, 74,151,172, 58,119, 36,163, 10,211, 51, 80, 35,131,171, 23, 90,202, 51, 92,159,131, 86,221,172,132,167,164,233,138,245,
+ 80,173, 53,248, 90, 53, 77,201,157,211, 28,203,149, 22,138, 53,205,147,170,165, 44,103,142,151, 13, 61, 85,137,129,171, 50, 63,
+195,103, 50,229,172,128, 80,210,134,110,252, 12,195, 33, 86,236,233,187,216, 92, 5, 92,158,158, 69,150, 66,226,247,103,136, 76,
+ 51,186,106,102,214,154,186, 6, 37,131,171,154,158,184,230,113, 99,183, 42,169,156, 36, 77, 71,225, 54,230, 61,212,250, 41,101,
+ 68, 23,157, 81,198,152,178,174,112,238, 14,162,102,152,115, 98,180,100,176,144,104,229,253,210, 17,100,242,136, 89,109,130,202,
+ 3,175,199,214,209, 85,149, 63,131,169,215, 82, 42,163, 94,212, 33, 45,127,135, 69,161, 36,128,203, 45,201,106,223, 74, 23,220,
+152,136,191, 83, 54, 29, 42,173,242, 42, 84,208,185,235,208,202,105,125,194, 90,114,117,168,110,188, 26, 26,212,244, 44,151,131,
+206, 3,177,133,162,239,104,165, 7, 85,123,146,118, 24, 73,105, 53,197,197, 98,154, 25,163,247, 32, 17, 12, 54,181,108,173,193,
+236, 35,109,202, 51, 48,216, 14,129,129,103, 30,188,128, 39, 15,223,129, 51,190,156,182,129,168, 80, 37,142,209,180, 76, 9, 87,
+ 73,245,103, 27, 99,176, 26,250, 6, 29, 72,198, 36, 15,235, 66,250, 87,112, 66, 92, 32, 6, 38,137, 52,234, 6,154, 62, 91, 97,
+253,166,224, 7, 82, 80, 31,210,168, 68,211, 88,170,146, 28,162,196, 44,214,176,148,148,141, 44,237, 17,137,139, 88,209,148, 42,
+161,128, 94,170,215, 35, 38,195,105,214,181, 10,250, 17,146, 40, 10,204,222,218,204, 18, 40, 50,119, 69,114, 50, 82,213,244,154,
+190,245, 1, 25,126, 5,136, 83,230,131,185,106,106,179,165,179,162, 60, 82,160,204,162, 47, 47, 31,176,161,223,190,197,235,249,
+132, 52,100,175,250,210, 44, 25, 28, 66,139,191,209, 78,179, 68,221, 23, 53,142,184,230, 20, 88,103,112, 52,116,192,236,225,140,
+193,126,156,112,186,234,241,206,211,184,217,239,167, 9,207,221, 57,198,236, 3, 46,118, 35, 32,136,252,132,113, 15, 15,194,156,
+172, 54,198, 58, 76,211,132,103,238,156,226,187, 94,254, 56, 86,195,128,221,126,143,111,189,253, 46,254,220,231,190, 19, 47, 60,
+255, 92,217, 88,191,249,250, 27, 32,107,241,233, 79,124, 28, 31,121,241, 5,116,174,195, 28, 66,172,164,140, 65,215, 13,241,250,
+ 7,109, 27,138, 31,202,207,115,140, 30, 38,130,181, 3,216,207,176,221, 0, 34, 3,239,103,188,255,248, 49, 68, 24,199, 71,107,
+156, 30, 29,213, 47,194,218,154,124,165, 20,215, 92, 80,172,146, 50,208, 85,150, 57, 7, 56,234,112,116, 20, 23,213,169,139, 29,
+ 9,187,219, 99,183,189,193,213,205, 22,179,247, 56, 90,175,113,247,236, 12, 15, 31, 63, 1,179, 96,232, 28,174,111,246, 69,217,
+156, 15,173,121, 29, 11, 97,134, 49, 93, 17, 6, 51, 7,108,119,251,194, 62,136,113,217, 74,180, 42,153,211,160,138, 18, 67, 21,
+ 64,147,114,192,243, 40, 73,219, 37, 9, 45, 9, 78,234,100,247,150, 14,164, 52,200,227,166,130, 71,182,136,113, 13, 31,202,236,
+169, 50, 70, 95,160,151,163,103, 42, 42,242,115,202, 31,153, 68, 90,172, 34,176, 44, 86,179, 57,189, 51,223,247, 28,215, 73, 9,
+ 33, 30,238,132, 65,193,195,112,172,218,193,161, 0, 84, 72, 60, 78, 46, 24,231,167,103,105, 67,207, 35, 61, 41,110, 4, 93,165,
+ 87,171, 51,165,207, 83,245, 82,185,235,153, 61,220,180, 72,100, 36, 21,154, 30,175,171, 81, 46, 2, 86, 17,180, 42, 33, 82, 69,
+199, 82, 82,185,107, 87, 11,169, 89, 95, 57,184,177, 36, 95,126, 77,255,172,168, 85,180,132, 58,249,128, 5,133,212,156, 93, 20,
+ 43, 68, 89,200,137, 40,206,248,169, 2,123, 34,167, 32, 37, 95,230, 16, 31,170,189, 29, 87,160, 39, 89,215,111, 76,181, 4, 44,
+185,195,105,195,226, 44, 34, 91,116,193,141,105, 83,193,165, 1,111, 44,145, 8, 56,244,230, 30, 24,215,106,112,193, 65,125,166,
+226, 12, 15, 84,253,170,197, 11,174,252,100, 14,140,121,246,152, 38,143,113, 26, 49, 78, 19,198, 45,112,186,114, 16, 27,191,196,
+ 73,128,221,236,177,187, 25,113,239,254, 25, 0,194,159,252,193,151, 34,209,235, 95,254, 75,204, 28, 55,107,171,231,191,170,231,
+ 18,149,213,213,211,120,122,114, 84,231,110,168, 65, 36, 92,236,108,121,182,147, 90, 45, 7,179,186, 42, 20,169, 39, 89,157,185,
+107,148, 45, 43, 71, 65,230, 16,137, 80,125,166, 20,125,179,172,232, 84,156,108, 41,165,122, 87,194,146,114, 24,202,218,130, 18,
+167, 38,229, 65, 19,169, 93, 6, 18, 81,161, 9, 89,224, 24, 57,208,108,162,159,183, 4,205,192, 68, 54,129,242,173, 55, 84,165,
+194, 85,214,247, 96,237,204, 44, 91,234,101,159,230,204,253,175, 15,134, 73, 93,135,188,176,234,180,185, 66,181,210,179,244,131,
+188,229,138,145, 33, 77, 55,100,224,208,225,155, 14,135, 70,101, 62,169,112, 22,249, 32, 55,135, 14,209, 81,202,218,245,106, 5,
+ 43, 19,172, 51,105,230,203, 88,119, 14,175,222, 59, 1,145,224,244,238,203,120,116,126,137, 55, 30, 62, 6,132,240,217, 79,189,
+138,175,254,217, 55, 1, 34,108,231, 25,100, 93,244,128, 7,143,231,238,157,225,123,191,243, 59,112,247,244, 4,255,236,119,255,
+111,252,194,207,124, 30,125,215, 97,221,103,250,155,131,177, 14, 38, 97, 94, 77,226,188,147,177,112, 67, 28, 33, 5,207,152,198,
+ 61,250,190,143,234,111, 6,158,158, 95,193, 58,131,227,163, 13, 32,132,253,110, 15,235, 28, 86,201, 50,196,251, 29,152,128,221,
+126,196,233,209,186,140, 87, 50,213, 81, 74,138, 87,250,189,159,227,197, 55, 38,229,190,155, 98, 1,202,191, 39, 9,181, 50, 54,
+ 22,243, 52,198, 77, 63,193, 99,186,174,195,157,179, 51,188, 48, 77,184,190,121, 29,243, 60,227,187, 63,243,105,188,243,238,123,
+248,198,183,222,198, 48,116,152,102, 95,141, 13,169,154, 42, 64, 22, 83,227,126,153, 25,126,158, 43,232,133, 9,100,106, 78, 58,
+180, 8, 50, 11,218,178, 58, 62,207, 95, 51,238, 85, 14,141, 26, 57,252,170,186, 82, 85,142,182,168,146, 40, 35,100,115, 37,199,
+ 74, 28,154,113,197, 76,101,140,150,109,149,109, 45, 84, 71,114,198,198,231,145, 57, 10, 3,137,226,230, 14,202,103,120,106,115,
+220, 77,230, 61, 48, 16, 82, 42,224, 60,131,189,135,225,144, 60, 46,249, 59, 10,201,174,197, 73,243, 17,159,221,179,235, 27,220,
+220, 57,171, 7, 11,105,243,201, 69, 85,236, 69,159, 36,173, 6,161, 96, 96,203,252,251,208,223, 87,219,233, 21,111, 45,234, 24,
+ 33,168, 5, 79,137, 67, 79,153, 23,198,152,146,139, 94, 54,216,244,251,188, 20,113, 70,118, 75, 20,204, 37, 88,123, 75, 64, 85,
+209,118,149, 72, 89,187,107,104, 62,175, 52, 29, 5, 29,232,164, 71, 4, 49, 74, 56,212,112, 31,109, 13,207, 46, 35, 2,220, 50,
+227, 55, 35, 56, 41,183,131, 4, 42,111,157,203,208, 64,163, 78,179,181,237,160,113,217, 58, 43, 22,237,119, 69, 52, 19,173,170,
+110,115,170, 9,183, 65, 12,104,193,131,199, 1,119,180,182,255,170, 72,201,123,143,253,236, 49, 79, 30, 38,196, 69,234,102,154,
+192,222,161,163, 56,191,155, 16,163,244, 38, 97, 60,122,248, 20,110,232,240, 79,254,139,191, 15,103, 13,188, 68,138,149, 8, 99,
+156,162,224,193, 19,193,165,155, 56,146,197,146,128, 33,241,222,143, 54,171, 98,103, 41, 89,245,101, 46,146,145,168,113, 55, 34,
+163, 9,103,137,124,167,245, 8,188,184,117,114,126,124,153,201, 40, 49, 72,193, 37,114, 57,105,114, 9, 45,168,105, 83, 37,230,
+ 51,189,191,146, 85, 79,154, 73, 78, 48, 57,142,145,178,184, 71,143, 75, 22, 41, 79, 41,217, 44,139,249,226, 26,200,137,118, 87,
+129, 38,217,199, 94,226, 81,155,135, 97, 1,223,148, 54, 25, 89,148,110,163, 40,245,115,194,170,246,220, 18, 32, 65, 34, 27, 64,
+113,119,179, 70,160, 62,134, 92,221, 19,139, 48,134, 18,251,188,196,192,178, 38,113, 82, 59, 10, 80,170,218,219,230,255, 57, 95,
+168,177,233,213,246, 7, 0,194,122, 53, 96, 77, 43, 92,157, 63, 5,164,135, 77,194,206,211,117,220,100,239, 28,111, 48,206, 51,
+230, 0, 60,115,118, 2, 2, 33, 36,116, 44,250, 21,194,126,139, 32,192,122,213,227,135,190,239,123, 65,194,152,198, 17,127,245,
+103,127, 10,155,163, 99, 12,206, 68, 1,156, 49,176,157, 75, 52,184,184,193,229,185, 31,140, 75, 27, 0, 96, 49, 1,100, 49,207,
+ 51,122,215,193,117, 22,247,238,156, 86, 33,149, 8,134, 97,192,126,220, 99,191,149,136,100, 77, 97, 27, 34,128,117, 29,188,159,
+ 83,171,215, 68,108,109,224,106, 0,228, 44, 58, 12, 81, 45, 79, 20,157,243,197,230, 23,138,160,170,246,243, 57,146, 27, 67,192,
+126,154, 74,171,126, 12, 1,155,205, 6,207, 62,115, 15,125,223,225,242,242, 10,247,238,222,193,187,143,158,224,122,187,175,153,
+ 0, 10, 46, 66,134,203,162, 94, 14,210, 82,195, 91, 50,107,208,164,141,189,132,166,106, 4,106,130, 23, 81,178, 19,130,170,189,
+138, 52, 67,114, 49,166, 33,214,248,207, 69,195,146, 22,181,140, 18,194, 73,122,206,114,164,169,136,182,108, 73,237,228,229,172,
+249, 16, 74,122, 93, 16, 65,152,125, 51,138, 35, 74,157, 68, 68,198,129,238,198, 48, 51, 36, 4,240, 60, 35,204, 51,194, 52, 33,
+ 76, 19,192, 30, 14,177,227, 98, 10,176,138,227,181, 74,164, 62, 97, 6,118, 91,244,125,143,121,179,174,150,212, 98, 89,171,129,
+ 37,220, 16,184, 84,161, 46, 75,253, 23, 85,251,110,137, 31, 81, 81,208, 41, 92,135, 77,236, 22,138,214,116, 72, 61,132,103, 17,
+111,241,161,103, 6, 65,238, 34,144,169,243,116, 82, 35, 52,150, 36,114,190, 37,139, 36,109,250, 92, 52, 83,173,186, 95,219,245,
+116,224, 84,177, 71, 82,142,119,102, 69,179, 19, 53,214,100, 53,134, 37, 37,163, 20,168,129, 64, 43, 98,147, 4,250,206,233, 57,
+241, 13,153, 70, 12,220,182, 13,209,154,226, 69,202,243,215,164, 82, 74,211,217,168, 16,123,180,194,185, 18, 25,152, 79,158,203,
+ 95,170,122,211,179, 81,149,178,215,192, 27, 0,193,126,187,131,120,143,144, 54,116, 99, 8, 39,235, 30,119, 55, 3, 54,157,131,
+233, 28, 38, 31,176,219,238,241,177,239,253, 2, 46,175,119,184,124,124,137,207,253,249, 47,224,226,226, 6, 87, 23, 55,120,248,
+228, 2, 79,159, 94,227,201,249, 13,110,118, 99, 2,193,152,106,219,160,106, 9,178, 38, 2, 58,202, 30,144,184,206,209,147,153,
+ 54,111,225,242, 32,182,100, 49, 36, 85,180,138,231,203,104,193,164,142,103,229,251,172,246,142, 28, 0, 16,197, 87,249, 6, 90,
+ 2, 29,242,159, 1,243, 45,144, 7,212,135, 44, 47,185,172,210,211, 88,135, 17,164, 86, 20,215,138, 56,155, 87,139,125,171,104,
+197,234, 98,134,102,150,175,225, 26,162, 68,117, 75, 92,164, 38, 75,137,178,118,168,185, 28,233, 27, 76,119, 54,232,192,207, 89,
+248,244, 36,202,102,201,139, 60,104,129, 52,169,108,234,115,139, 98,187,171, 36,235, 15,128, 43, 52, 39,146, 74,197, 85,153,209,
+186,221, 42,192,170,115,184,127,178,129, 51,113,145,177,214, 70,132, 49,168, 88,216,190,242,250, 59, 32, 97,220, 61, 61,198, 55,
+223,124, 39, 94,127, 55, 96,220,111, 99,216, 11, 4,127,237,103,127, 18, 95,251,198,107,120,229,165, 23,240,109, 31,255, 40,206,
+238,156, 97,179,234,209,247, 61,250,213, 10,253, 16,201,112,113,131,143,158, 92, 71, 38,110,246,153,156,229,103, 88,107,209,117,
+ 14,155,205, 17,108,231, 34, 52,166,235, 98,149,108, 29,140,181,176,214, 96,157, 40,115,211, 56,226,122,187,197,245,205, 14,119,
+ 78,239, 68, 59, 87,178,179,133,212,186,149,196, 96,103,239,147,215, 31,105,156, 67, 57, 43, 37, 89,171, 66, 75,224,202, 57,211,
+121,166,111, 12, 58,107,112,180,138, 0,155,213,208, 23,103,192,253,103,238, 97,179, 30,240,244,226, 18,207,221,191,135, 15,191,
+248, 92,220,184,185, 85,233,198, 52, 69,163, 92, 39, 40,243,102,214,185,215,136,213,167,142, 48, 46, 51, 97,117, 44, 43,129, 73,
+101, 65,227,218,175,164,234,118, 41, 25, 20, 69, 50,186, 8,128, 80,104,149,220, 1,163, 52, 14,173, 27, 6, 41,141, 0,218,123,
+ 83,170, 93, 45, 31,106, 57, 48,252, 52, 71,168, 76,211,233,231, 82,132, 64,146,202, 91, 66,193,236,250,121,198, 60, 77,152,119,
+ 59,236,111,174,177,223,222, 96,191,221, 98,119,115,131,113,183,197, 56,142,152,253,140, 16, 98,248, 78, 8, 81,204, 25,188, 71,
+152,246,232,174, 46, 82,135, 47, 23,137,234,122,230,234,149,185, 25,161, 29,240, 74, 74, 96, 76,222, 27,234,239, 77, 22,105,154,
+132,196, 54, 41,203,141, 84,144, 9, 81, 35,196,203, 30,124,163,208,177,249, 87,142, 82, 37,165,109,160,130,151, 78,107, 95,186,
+ 81, 73, 89,104, 68, 41,102, 26, 69, 63, 51, 56,112, 33, 45,102,210,160,166,124,200,162,235,208,252,106, 0, 92,245, 96, 67, 18,
+169,164,145,193, 82,112,133,104,227, 33, 57, 69,217, 53,190, 99,237,241, 83,105,110, 74,181,220,250,242, 90,159, 63, 26,112,192,
+225,169, 75, 74, 91, 84,233, 51, 75, 74, 86, 78, 70,167,214,163,167, 2, 97, 84, 3,173,158,172,148, 0,121,127,117,137,222, 0,
+182,119,160,142, 64,236,113,103,211,227,120,232, 96, 72,240,242,119,127, 1,127,240,219,255, 4,215,219, 61, 62,252,234, 39,241,
+254,215, 94,193,131,143,126, 22,255,239, 23,127, 3, 63,254, 87,126, 9,255,244, 31,255, 42, 40, 8,182,222, 99,158, 3,246,163,
+199,241,153,133,192, 37, 56,127,222,140, 83, 32,134,115,105,142,155, 34, 9, 81,177,176,146,170, 87, 18, 83,116, 0,139,193, 5,
+218, 90, 66, 74,117, 71,141, 1,189, 85,239,138,250,134,140,180,135, 27,226,116,211, 19, 43,181, 56, 41,135,131,220, 34, 68,147,
+ 3,172,175, 40,225, 89,238, 38,200,130, 1, 84,242,158,243,231, 84,200,198, 42,164,163, 38,144, 34,139, 65,154, 10, 87,106, 24,
+131, 22,210, 9,168,145, 97, 72,251,196,171,189, 62,177,146, 69, 5,177,136, 74,116,210,237, 50,212,107,213,228, 97,180,110,186,
+148, 4,168,186, 77,229, 15, 45,186, 71,244,129,210,250, 70, 89, 67,234, 30, 70,153,155, 17,238, 88,193, 73,223,161,179, 14,150,
+ 8,189,179,152,156,131, 15, 30,228,129,135,143,159, 96,156, 38, 4, 16,118,227,132,155,155, 45,102, 16,246,227, 22,115, 96,156,
+172, 6, 60,119,255, 46, 78, 78,142,241,151, 62,255, 23, 48, 56, 7,103, 13, 58,107, 99, 21,109, 13, 40,189,182,201,153, 1, 9,
+ 78, 68,157,171, 66,157, 84, 13,231,207,231,250, 1,126, 26,203, 92, 53,222, 74, 22, 68, 38, 65, 90,226, 12, 62,134,188,108,208,
+ 13, 67, 92,252,192,176,112,152,167, 9, 28,124, 28, 15,100, 37,188, 8, 40,132,196,130,161,218, 81,201, 11, 47, 25,117,105,171,
+134, 71, 66,106,241,134,184,225, 88,103,203,236,117,154, 3,134,213, 26, 6,192,189,179, 51,172, 86, 43, 92, 92, 94,225,201,197,
+ 21,122,103,177,103, 95, 67, 86, 82, 23,201, 90,151,218,208,106,211, 1,154,131,167, 20,169,177, 52,182,169, 74,110, 85,157,185,
+218,138, 42, 0,152, 24,155,156,186,115,101, 13,227,210,145,184,197,203,179, 64, 16,183,145,162, 80, 66, 81, 44,194, 61,242,189,
+198, 69,236, 22,181, 82, 33, 57, 39,234,166,149,198, 34, 16, 32,117, 35, 77,234, 56, 80,242,103, 11, 11,194, 60, 99,220,237,224,
+119, 91,204,187, 29,252, 60, 1,204,209, 1, 50, 25,240,208,131,251, 30, 93, 17, 17,114,185,190,128,129,236,247, 24,158, 60,193,
+254,238,157, 5,143, 3, 21, 35,155, 70,143,237,140, 93, 74, 84,114,113,164, 44,218,242,173, 93,186,218,116, 13, 73,234, 24, 82,
+ 57,108, 21,193, 31, 98, 23,175, 81,148,235,182,125, 22,237,178, 52, 95,121,238,146,198,179, 26, 45, 2,168,171,187,137,165, 13,
+183,201, 21,122,254, 85,253,120,138,241, 97,110,113,120, 45,192,222, 5, 61,150, 81,181,249,135, 9, 43,245,251,114, 65,167,150,
+168,165,131, 65, 42, 62,182,102,225,150,155, 34, 9,185,116,164,104,253, 17,124,160, 51,206, 95, 88,243,239,100, 97, 75,206,173,
+ 93, 35, 7, 0,208,250,222, 20, 48,231,128, 97, 19,255,236,118, 63, 98,156, 61,216, 7,172,108,252,217,215,251, 25,193,207,112,
+150,240,199,191,243, 63,163, 31,122,156,117, 29, 94,255, 87,255, 61, 30, 60,184,139,163, 1, 56,233, 8,191,255,235,255, 11,238,
+159, 30, 97,211, 59,140,227,140,237, 20, 49,156,110,183,199,126,118, 17,121,105, 34,234, 16,185,205, 76, 53,216,128, 80,231,102,
+140, 36, 78, 75,237,149,242,112,103,239,114, 82,110, 50,171, 54,187,154,235,228,239, 81,164, 37,253,212, 89,187,170, 26, 84, 54,
+123,157,122, 41,129, 93,194, 87, 74, 30,153, 35, 5,199,168,195, 16,149, 76, 97,180, 4, 39, 21,158, 34, 13,237, 38, 55,131,162,
+ 1, 50,174, 95,138,138,103, 20,212, 85, 39, 73,165,185, 22, 41, 84,107,182,204, 52, 60,118,133,119, 44,126,122,109, 77, 82,147,
+129, 40,144, 51,197,195,171,103, 64, 37, 38, 81,116, 68, 45, 26,218, 19, 41, 20, 40,212,225,177, 10, 27,227,207,176,116, 64,112,
+106,192,156, 31, 36,185, 43,207,128,112, 51,199, 15, 33,192, 72, 64, 8,140,222, 70,234, 22,216,192, 25, 74, 63, 75,240,135,175,
+189, 3,102, 65,215, 37, 48,164, 53, 24,247, 51,156,181,248,177,239,255,110,188,243,238, 67,252,149,159,251,105,184,161,135, 51,
+177,202,183, 38,181,220,157, 75, 42, 95, 91, 14,158, 81,201,174,242, 30, 50, 96, 37,137,155, 0, 96, 88,109, 16,230, 57,186, 67,
+114,104, 74,110,231, 6, 15,200, 12, 50, 4, 67, 54, 70,116,122,143, 49,120,184, 97,149,196,116, 83,105,141,138,228, 92,234,196,
+225, 79,213, 56, 41, 84, 41,140, 41, 85,108,134, 85, 21,118, 3,135, 82,221,251, 16, 9,116,113,147,143,118, 52, 63, 79, 56, 59,
+222, 96, 53, 12, 8,214, 70,103, 64,223,163,115, 22,199, 71, 27, 56, 55, 97,187,159,202,194,109, 77, 20,138,137, 2, 69, 17,197,
+239,171,204, 62, 83,252,138,161, 68,210,204,224, 26, 99,212,158,203, 11,136, 87,212,115, 24, 83,147,247,162,142, 46, 65,153, 80,
+ 57,238,162, 3,178,114, 71,146,177, 0, 62, 73,235, 38,106,132, 95, 58, 3,163, 30, 82, 67,182,171,113,188,183, 24,145,146, 71,
+ 41,167, 65, 50,237, 46,117, 69,140,137,216,108,226,248, 61, 91, 14,209, 29,192, 1,126, 26,177,189,185, 1,239,247,152,167, 17,
+ 33,132,232,242,233, 92,217,184,188,115,112, 69, 84,198,165, 26, 15,204,176, 87,151,176,199,199,152,157, 83,207, 44, 39, 24, 76,
+234, 98,240, 98, 12, 43, 58,173, 83,217,134,160, 82,191,165,110,182, 17, 11,108, 84,122,165, 74,108, 52,117,198,157, 43,116,101,
+ 6,168, 21,145,161, 34,168,132, 81,107, 29, 80, 66,193,234,232, 88,121,225,211,124, 59, 19, 0,185,217,208,165,116, 61,218,180,
+ 80,131, 54,194,118, 97, 5,147,195, 1,180,192, 36,139,113, 61,252, 48, 73,252,222,111,245,161,233,243, 64,106,189, 83,179,121,
+212,185,122,179,225, 67,110, 29,160, 23,186,209, 7, 72,141,155,108,118, 28,174,143,153,189, 45, 10,208, 65,137,186, 35,202, 71,
+ 47, 7,114, 59, 46, 85,157,239, 44,156,181,240,126,134, 15,140,113, 63,129, 16, 48, 19,224, 76, 36, 32, 13,171, 14,195,170, 7,
+194,140,121,126,138,243,224, 97, 87, 27,216,224,193,134,113,186,234, 33,129,113,126,185,197,246,106,135,155,113, 70,152, 25,247,
+ 78, 54,224, 4,237,201,202,114,107, 77, 18,202,216,226,111, 20, 99, 10, 11,218,228, 48,136, 36,114, 49,148,211,154,148, 46,160,
+225,252, 82,225,131,231,238, 69, 99, 42, 16,101, 78,204,243,114,169,244,190,104,129, 72, 36, 58, 42, 17,236,113,195,229,116, 20,
+203, 89,207, 74, 69,207,249,160, 84,110,222,108,211,201,254,226,132,170,204,249,234, 36,101, 35, 38, 48,162,248,221, 32, 59,233,
+ 72,114,200, 65, 43,148, 43,235,225, 98, 22,157, 21,255, 77,123, 74,205,220,178,139, 66,207,187, 72, 85,220, 82,240,154,162,112,
+158, 84,200,115, 21, 26, 3, 5, 17, 33, 37,120, 81,109, 86,212, 25,165, 20,101,174, 30, 91, 45,176,179,116,152,106,144,219,129,
+164, 5, 38,121,142,155,254,212, 87,254,244, 53,220,241,113,195, 49,226,225,236, 0, 70,136, 73,130,194,120,114,179, 67, 96, 15,
+ 33,224,222,233, 49, 30,157, 95, 97,156, 38,136, 48,126,238,199,127, 20,255,251,111,254, 11,252,157,127,247,151,209, 15, 3,140,
+115,232, 19,134,212, 90,155, 20,234, 49,149,208, 36,113, 13,153, 72, 90,203,209,182,148,161, 58,101,148, 38,176,198, 69, 81, 90,
+185, 23, 57,241,181, 99,251, 92,146,176,142,147,234,222,218, 14,182,239, 49, 12, 27,132,224, 49,222, 92,131, 83,101, 45, 62, 20,
+171,171,132,172,183, 56,140,203,228, 50,126, 9,106,254, 29, 98,251,182, 36,135,133, 72,166,203,255, 45,112, 9,237, 89, 13, 67,
+238,173,195, 57,135,213,106,192,253,123,119, 49,116, 61, 94,123,235, 29, 24,227,211,134,155, 54,164,212,121, 16, 91,221, 61,171,
+161, 87, 58, 32, 46, 99,201,220,121,106,196,166, 73,124,102,148, 90,220,100,200, 16,199,141, 61,111, 38,249, 53,162, 38, 41,179,
+ 34, 76,169,234, 53,140,168, 50,214,181,207,188,222,105, 85,129,111,212, 51, 19,231,211, 33,132,164, 85,144, 4,212,137, 46, 19,
+ 99, 80,198,111, 4,137, 42,107,102, 88, 0, 86,226, 1,137,216,195,132,232, 65, 55,193,131,102,143, 35, 18, 92,142,123,236,182,
+219, 72,217, 76,154, 42,239, 67, 92, 91,189, 71,239, 44,186,212,169, 20,174,250, 32,239, 3,108, 8, 88, 93, 92,128,238,221, 43,
+ 27,158,118, 44,197, 67, 80, 29,241, 74,201, 62, 95,234, 12,164,153, 55,139,202,178,104,187, 95,148, 18,206, 4,100, 35,197, 47,
+ 11, 0,141, 53,170,141, 93,233,156, 36,212, 16, 44, 83,116, 79,210,226,212,238, 77,252, 46,185,240, 9,168,116,154,165, 92, 3,
+ 82,163, 5, 46,226, 65, 81,107,138,110, 78, 73,189,143,136,234,168,111, 9,202,214,107, 78,118, 77, 81, 92,199, 93,205,176,160,
+ 69, 16,192,161,171,162,100, 98,103,155, 80,230,190, 55, 4,174,202, 93,167, 37, 12,134,128,219, 0,178,185,101,101,104,217,179,
+ 87,191,167,234,149,206,255,138, 85,128, 12, 45,248, 35, 7, 36, 59, 16,206, 54, 71,224,213, 57,176,114,232, 12,224,167, 17, 52,
+143, 48, 18,176,221,123,140,222, 99, 29, 28, 16, 4,179, 48,126,240, 47,253,117,252,206,111,254, 31,184,124,247,155, 8,126,132,
+ 79, 74,234,161,239, 48,108, 86,184, 11,194,205,110,130, 23,193,110,156,209, 13,125,105, 31,147, 49, 88,173,215,141,239, 50, 29,
+247,178, 60,187, 68, 50, 54,214, 59,149,143, 43,106, 92, 17,131, 72, 76, 11, 50,205,202,126,245, 29,229, 36, 48, 74,150, 26, 73,
+ 27, 45,140, 84, 97, 30,167,147,104,170,220, 13,155,194,181, 46, 75,133,212,188,114,189,132,136,106,107, 51,155, 2,129,160, 69,
+ 27, 76,251,176, 99,123,138,219,156, 99, 50, 81,152, 4,197,134, 78,240, 29, 81,224,250, 70, 67,183,104,253,148,214,214,129,147,
+ 34, 30, 94,106, 11, 52,205,189, 20,188,161, 17, 28, 50, 55, 3, 59, 86,228, 45, 81,135, 43,157,103, 32,170, 37, 88,147,175,148,
+ 10, 94,169, 87,231,121,198,229,213, 22, 79,207, 47,113,113,121,141,237,118,143,221,110,135,113,220,194,207, 19, 66,240,144, 60,
+239, 52,177, 21,184,221, 94,227, 39,191,253, 21,240, 76,176, 26, 53,155, 78,249,175, 61,190,138, 85,101,106,157,251, 4,161,249,
+215,190,227,147,248,181, 95,255, 45,252,173, 95,250,183,176, 90,173, 99,182,121, 66,149,154,188,113,154,252, 43, 86,224,100, 13,
+196,184, 4,193,145, 50,163,206,148,187,162,176, 78,222, 93, 9,177, 29, 27, 55,244,180, 81,100, 53,114,240,177,114, 48, 0,147,
+193, 60,238, 19,236,195,196,116,195, 84,209,115,250, 59,162,176,177,162, 43,187, 76,233, 19,129, 88,151, 14, 61,136, 66, 45, 1,
+152,125,137,251, 12,115, 72, 1, 45,113,131, 15,193,199, 77, 94, 4,150, 0,132,144, 26, 80,132,206,117,216,237,246,176,214,224,
+244,120,131,113, 14, 96, 68,158, 39,167, 25,181, 73,215,128, 76, 12,101, 58, 62,222,160,105, 93,161,174,131,154,235, 13, 21, 33,
+ 74, 10, 0,195, 9,118, 66,101, 99,151, 98, 65,163,180,225, 20, 24,141,242,139, 87,166,121, 94, 11,120,225, 96,175, 80,146, 34,
+ 74,205, 7,253,116, 96,141,135, 20, 41, 54, 44, 66,172,182, 13, 81,202,152,175, 7, 94, 8,195,230, 13, 63,228, 3, 48,131, 56,
+ 0,193,131, 66, 0,241, 12,225, 25,247, 54, 3,190,254,248, 73,189,255,133, 97,157,197, 52, 25,204,157,195,208,119,232,156,139,
+221, 0,105, 19,210,140,103,240,205, 53, 86, 39, 39,128,181,106, 19,172, 97, 52,203,182,188,134, 36, 85,129, 91,213,233,228, 32,
+152, 24,170,105, 10,152, 39,239, 83, 4, 13,165, 18, 88, 75,202, 66,170, 84,171,208, 77,179, 28,174,147, 90,227, 37, 84, 75, 17,
+ 52,243, 51, 95,174, 27, 53, 73,164,162, 26,156,101,166,206,172,242,226,165,166, 90, 74, 37,207, 69,200,145,118, 20,201, 65,167,
+176,232,167,178,186,138,227,174,232,114, 43, 88, 7, 80,177, 82,225,105,203, 1,145,105,224, 30,162, 82,172, 32, 10, 38,163,213,
+199,185, 82, 38,220,138,248, 40, 96,147, 92,249,208, 34, 53, 72,104,209,162,165,154,193, 46, 82, 35,245, 14,166,244,130, 54, 30,
+ 22, 56,127,255, 49,142, 57,192,116, 22,182,115, 48, 70,112,247,184,199,204,140,241,209, 37,142,187, 14,199,199, 43,236, 67,180,
+ 13,124,235,181, 63,197,147,119,223,130,247, 19,198,201, 67,152, 49,207, 1, 97, 37,176,235, 1,155,227, 13,186,190,195, 59,231,
+ 91,236,124, 0,108,128,113,174, 88, 16,134,174, 83,177,128, 20, 17,174,168,128,146, 40,184, 86, 85,225,173, 35, 11, 41, 59, 24,
+ 25,105,132,107,249,164, 74,172,133, 92,181, 82, 71, 66, 99,178, 80, 82,160, 75,189, 30, 82,103, 20,185, 26,226,236,173,206, 97,
+ 15,121,214, 70, 7, 56,192,114,210, 21, 53,154,209,149,124,113, 51, 64, 97, 96,147,111, 52,182,198,210,193,193,232,141,126, 41,
+ 9, 79,183, 43, 47, 15,106, 74,101,138, 54,182, 84,138,150, 79,147,168,180, 24, 15,106,126,143,162, 94,133,106,169, 17,161, 16,
+222,106,136, 67,189,191, 69,205,220,243, 40,107,158, 38,236,119, 35,110,174,111,112,113,121,133,235,171,107, 92, 95, 93, 65,252,
+ 8,146,104,161,180, 68,152, 60, 99,246,113,227,217,143, 35,230, 16, 48,205, 30, 34, 2,159, 54, 31, 16,129,131,135,165,151,211,
+108, 51, 91,192,226, 38,119,126,179,195,236,231, 34,236,185,184,217, 3, 0,214, 67,143, 63,254,234, 55,240,249, 31,250,126, 60,
+120,240, 0,142, 24,126,119, 9,244, 43,160,235, 65, 68, 41, 18, 85,141,189,172, 1, 92, 95, 92, 47,113, 14,234,227,102, 27,124,
+ 25, 35, 69,113,149, 7, 89,115, 72,248, 67, 37, 13, 2,177, 93,207, 0,194,184, 7,165,214,188, 0,240,126,142,173, 95, 31, 91,
+220,217,146, 22,237,106,146,170,198,204,105, 72, 8,222,188, 54,132, 0,241,190,180,214, 69,193, 74,188,143,207,102, 72,200,219,
+ 56, 47,142,222,234, 26, 16, 18,255, 30,135, 0,151, 4,125,155,245, 26,195,205,136,209,179,130, 6, 37,193, 85,138,215, 52,100,
+113,180, 94, 23,229,179,136,130,131, 44,245,143,233,222,176, 9,215, 91,121,226, 41, 35,128,146,149, 83, 85,249, 92,170,210,236,
+193, 87,243,219, 50, 41,147, 10, 63,186, 45, 55,156, 43,171,162,232,146,146,133, 55, 35,132, 33,137, 87, 23, 34, 99,159, 56,106,
+ 24,202, 24, 37, 61, 35, 54, 71, 74,167,120, 87,147,132,140,148, 60,251,134, 25, 61, 4, 27, 2,158,187,115,138,215,223,123, 20,
+159,155,212, 1,232, 58,135,185,235, 48,205,115, 76, 18,180,174,140, 38,106, 54,133, 7,247, 3,236,118, 11,115,114,162,198, 95,
+ 74, 25, 37, 10,182,165, 52, 13,101,244, 32,173, 94, 32,127,143, 6,212, 36, 77,230, 52,189, 60, 10, 73, 81, 7, 49,226, 86,109,
+ 55,194,166, 58, 96,138,126, 43,179, 91,148,107,161,100,162, 84,179,107, 9,174,206,224, 54, 13, 82,210,150,189,116,223, 50, 43,
+107, 27,234,158, 70,170,192,105,228,114,234, 11,170, 49, 63, 92,125,244,170,216,102, 80,116, 34,136,198,234, 73,203, 84, 47, 74,
+205,172, 44, 94,144,219, 52,213, 45,103, 18, 55,158,115, 94,134,123,220,142, 5,171,115, 84, 58,216,158,151,132, 46, 58, 96,126,
+181,200, 90, 13,183,105, 66,106,252, 84, 30,120,176,224,164, 39,140,204,120,114,113,131,253, 60, 3, 32,220,236, 13,246,251,152,
+198,246,173, 47,127, 9, 71,142, 32, 39,107, 76, 62,194, 52,246,147,199,229,232,193, 55,123, 28, 29,111,224,250, 14,199,155, 30,
+187,209,195,123, 6, 17,195, 25, 11, 67, 6, 71,199,235,210, 22, 74, 99, 93,176,137, 9,109,217,187,173, 65, 20,114, 11,247,190,
+204,108,160,194, 67,116, 38,123,201,244, 38, 5, 85, 16,160, 48,225,147,253, 70, 76,153,153,115, 43, 37,140, 55, 69,206, 19, 78,
+ 27,123,246,144,235, 13,157,154,188,101, 41,241,169, 34,203,141,252,182,223, 83, 33,186,197,215, 79,173, 72, 36, 22, 50, 41,100,
+236,129,119,173,190,190,166, 76,105,160,145, 72, 75,180, 47, 66,170, 5, 6,180,102, 14, 44,102,231,250, 1,228, 22, 5, 27,231,
+170,132,155,155, 29,118,187, 29, 46,207,207,177,189,190,193,180,191,193,184,219, 97,187,219, 22,213,178,164, 13,100,242, 51,230,
+ 57, 10,145,230,121, 46, 66, 37, 24,139,113,154, 49,207, 51,166, 57,110,114,158,115,120, 4,151,247,203, 92, 95,143,210, 2,157,
+171,169, 55, 30, 61,109, 4,167,227, 60, 39,123,216,140,143,190,242, 2,190,231,187,190, 51,169,228, 3,152,128,153, 3,174,159,
+ 62,130,247, 30, 6,130,245,241, 41,142,207,238,162,239,122,116, 38,161, 90, 65,144,224,251,226,105, 64, 0, 0, 32, 0, 73, 68,
+ 65, 84,163, 32,142, 34,222, 53,182,165,227,166,203,222,195,118,189, 82, 88,115,177,105,129, 40,182,211,133, 65,198,162,239, 87,
+ 48,100, 48,209, 8, 63, 79,152,120,159, 54, 93,174,247, 74,206, 13,151,236,178,145, 58, 10, 33,163,132,178, 57, 12,166,250,219,
+ 37,248,164,209,142,173,127, 9,190,216,162, 56,196, 95,146, 66,109,152, 25,158, 76, 68,190,206, 62, 89,234, 66,218,156, 9,125,
+215, 97, 10, 83, 92,112,173,105, 36, 70,214, 70, 52,237, 48,116, 5,253, 90,168,129,101,241, 70, 25, 43, 21,192,145,169, 41,138,
+ 13,173, 85, 42,180, 40,219,230,160, 54,131, 66,184, 32, 29,230,132,130,128,174, 46, 38,213,144, 45,163, 49, 73,247,173,148, 14,
+ 95, 60, 36,166,214,122,234, 88, 88, 97, 88,174,213,119, 17,178, 17, 42, 7,128, 72, 81, 25, 37,254,217, 84,177,231,103,168,115,
+ 22,119,214, 61,158,172,123, 60,124,242,180,164,185,217,201, 96,236, 28,134,174, 67,223,197,106,221, 89, 91,149,219,233,208,135,
+121, 70, 55,142, 88,109,142,210,216, 71,150,244,112, 53,222,146,134, 89, 82,108,179,217, 17,148,212,235, 84,194,111,170,160,208,
+228,207,149,243,234, 75,124,170,202,232,144,184, 46, 35, 41,200, 27, 45, 76,233,240,181,185,241,213,141, 3,165, 72,143,219,123,
+169,206, 25,141,221,171, 69,223,162,145,117, 83, 10,188,146, 68, 44, 92,174,123,164, 70,123,205,235, 64,197,113, 38,107,158,163,
+228, 87, 54,217,255,216, 16,179, 22, 98, 93, 45,108,203,120,189,124,244, 41, 61, 34, 86, 23,225,131, 97, 58,237,190, 78, 8, 89,
+109,185, 80,249, 29,120, 0,245,182,174,124,237,180, 0,212,232, 19,109,110,103,173,251, 30,188, 31,225, 82,123,122,183,245,184,
+190,188,198,118, 28, 97,141,193,209,209,128,121,102,120, 17, 76,227,132,112, 37,248,143,254,254,127,139,255,228,239,254, 77, 56,
+ 71, 8,214,224,120,189,194,229,195, 11,248, 57, 96,183, 27, 49,172,250, 68, 16, 51,240, 16,176, 15, 56, 89,119, 96, 19, 85,198,
+ 69,144,150,192, 40,104, 54, 74,169,164,177,198, 14, 8,149,161, 44,133,237,156,127, 78,211,162, 95,122,165, 18, 96, 38,231,155,
+ 75,185, 97, 82,187,220,160,156, 45,139,218, 32, 89, 50, 36,101,179,231,248, 86, 13,177,104, 24,233,133,190,148,218,115,106,187,
+215,172,118,110, 78,158, 84,224, 69, 57,143, 56,102,168,167, 22,151,170,216, 69,249,199,151, 41, 63,117,110,222, 38,179, 85, 16,
+ 85,154, 37,114, 76, 87,170,109,115, 89,136, 65, 85, 80,134,206, 66,151,200, 26,152, 71,143,247, 31, 62,194,163,247,222, 3,252,
+132,155,155, 43,176,159, 18,132,197, 99,242, 17,212,209,185,120, 8, 36, 34,140,211, 12, 99,162, 32,139, 0, 88,107,162,160, 40,
+179, 0, 4,152, 67, 92,252,166,105,130, 15, 17,109,202, 57,222, 82,181,248, 61, 51,156, 49,152, 75, 4,101,108, 87,111,167, 25,
+239, 95,239,224,172,197, 28, 98,101,113,119,211, 97, 63, 78,112,206,226, 47,254,232, 15,195, 56, 23, 91,227, 94, 32,102,192,213,
+197, 99, 92, 60,125,138,237,110,143,187,119,238,224,102,191,199, 91,111,191,133,211,211, 51,220,189,255, 0,155,147, 51,244, 93,
+ 7, 67,177, 69, 30, 35, 81,251, 58, 7, 12, 1,174, 95,149,193, 31,243,156, 4,114, 14,214,118,240, 97,134, 88, 65,231,214,232,
+251, 85,108,207, 11, 99,181, 58,194,100, 44,246,187,235, 18, 77, 43,136, 9,131,165, 37, 74, 10, 68, 34, 28, 23,124, 21, 20, 34,
+217, 31,206,161,116, 5, 96,108,220,144,210,123,139,172,238,108,125,243, 8,105,227, 70, 18,208, 89, 17,248,192,152,231, 25,193,
+199, 67, 84, 72,163, 40,231, 28, 32, 99,150,116, 66,115, 64,172,139, 89,241,198,216, 10, 32,162,148,140,144,211,215,164, 85,105,
+103, 81,161,104, 97, 72,230, 40, 72, 22,131,154,131, 81,146, 65,108,185, 26,209,247,183,168,184,229, 42,122,109,245, 67,202,243,
+ 34, 21,164, 18, 66,188,111, 76, 94, 38, 67, 72,248,214,204,104, 15,160,224, 11, 96, 38,139,141,137, 90,148,105,142, 60,205,214,
+ 45,230,172, 14,143,162,205,231,207,142,241,248,233, 57, 46,118,219, 50,122,232,156, 67,215,247, 88,245, 93, 68,244,166, 54,124,
+222, 96, 77, 55,192, 6,198,228, 61, 58,239, 35,231,191, 86, 41,135,145,206, 5, 50,147,186,125,146,181, 20, 42, 64, 75,119,154,
+ 83, 23,209, 38,123, 98, 30,129,100, 6, 1,104, 1,216,146,196,172, 16,237,245, 95, 22,157,218, 51,159, 3,188, 42,174,183,229,
+ 16, 72,233,114, 75,171, 47, 94,172, 63,181, 27,216, 8,140,147,190,130,155,224, 19,197, 16, 1, 55,124, 23, 29,125, 43, 16,184,
+ 34,168, 72, 80,144,165, 62,183,206,214, 51, 31,216,150,155,153, 82,123, 84, 68, 51,138, 91, 60,103,109,197,127, 16,185, 91,117,
+ 4, 4, 13, 42, 19,141,210, 79,207,145, 88, 1,104, 4, 68, 56,192,202, 53,168,146,180, 80, 71,117,174, 20,203,129, 53,132,205,
+102, 5, 22,193,241,241, 10,211, 52, 99,232, 45,142, 79, 78,225, 5,240,129,241, 15,255,179,191, 7,102,198, 56,199, 42,102,154,
+ 2,214,155, 21,230,155, 61,194,236,177, 7,208,187, 24, 73,121, 51,122,244,214,180,136,216,204,244, 33, 46, 98,177, 34,228, 42,
+167,127,190,197,174, 38,153,221,144,218,208, 84,236, 28,249,228, 88, 22,140,132, 96,101,125, 24,144, 42,155, 97,164,205,211,196,
+247, 16,171,242,154,204,149,119,156, 34, 64,228, 52,211, 41,121,223,139,100, 29,169,162,148, 66,156,163, 37,194,181,158, 46,169,
+180,144,114,224, 77,138,143, 44,109,237, 44,196,108,243,134, 15, 0,195,139,217,146, 22, 4,161, 38,150,215,145,128,104,214,186,
+ 52,135, 2,157, 52,104,136,176,219,207,120,244,238,187,120,231,173,183, 17,194,132,203,139,115,136, 4, 4, 31,162,250,215,217,
+130,211,132, 4,204, 1, 88, 15, 29, 66, 0,246,251, 17,206, 86, 47, 39,135, 25,134, 12,118,163, 47,213,227, 52,207,176,174,139,
+109,224, 16,210, 44, 61,192,123, 15,159, 18, 17,125,138,185,100,209,254, 84, 52,128,148,119,159,156, 23,142,128,103,198,247,124,
+219,199,240,245, 55,223, 67, 96,198, 23,126,226,135,176, 62,218,196,247,154,186, 64,126,218, 98, 61, 12,112, 15, 30,224,120,220,
+227,225,251,143,240,222,251,143,113,122,188,129,159,246,216,222, 92,225,238,179, 47,224,206,157,123, 88,173,215, 48, 20, 21,191,
+156, 81,160, 17, 63, 6,144,133, 72, 72,243,243,180, 49, 69, 52, 76,154, 81,118,232,251, 85,228,194, 59,131,121, 26, 49,251, 41,
+225,101, 45, 56,248, 52,230, 73,213, 69, 74,194,201,152, 85,136, 41,172,240,172,216, 46,209,155, 10,185, 26, 21,212, 62,250,218,
+153,193,169,147, 0,201,237,102,174, 88,104, 0,211, 52,163,239, 28,188,143, 29,186,248, 75,181, 64,245, 8, 81,101, 12, 88,235,
+ 18,153,238,100, 57,193, 78, 53, 12,169,245, 45,137,227,236,109,153, 10,121,163,145,170,239, 72,182, 86, 61,170,202,250,144,188,
+177,215, 72, 97, 81,194,208, 84, 53,146, 82,172, 20, 14, 44,151,103, 57,166,210,133,226,106, 16,142,163, 11,147,175, 95,170,188,
+193, 28, 71, 26, 69,178,100,106, 16, 15,171, 1,166,186, 46,145, 1, 20,210, 33, 75,208, 27,194,203,247,239,224,241,197, 5,118,
+251, 41,197,169, 90,244, 62, 96, 14, 1,189,117,232,187,152,242,103,140,129,177, 14, 67,191, 2, 91, 3,207,177,155,208,119,110,
+161, 45, 64,219,169,105, 92, 81, 82,236,117,148,236,132, 21, 5,157, 14,164, 38,253, 44, 83, 61,233,241,223, 81,113, 90,228,206,
+ 1,167, 32, 21,206, 7,198,178,158,153,202,252,201, 22,187, 69, 61, 80, 56,240, 16, 16,155,228,234,145, 74, 26, 72,135, 33,205,
+162,168, 29,139,122,175, 69,254, 77, 20, 30,183,235,123, 93,253, 98, 23,220, 64, 16, 14, 4,228,180,200,176,112, 81,245, 27, 51,
+100,151,229,159, 52,117,111, 58, 33, 10,167, 20,153,122, 74, 42,254,244,180, 43,112,163, 45,110, 69,248,135,116,184,197,230, 79,
+248,255,145,189, 74, 7, 9, 68, 80, 73, 59,173,254,189,114,203, 39, 63, 3,179,135, 97,194,202, 16,134,213,144,102,103,192,197,
+205, 22,251,253, 12, 97, 70,215, 57,172,215, 3,134,147, 83,244,171, 53,152, 5,211, 52,195, 90,134, 79,207,215,170,239, 98,117,
+230, 25,187, 48, 99,232, 58,108,134, 14,222, 11, 70, 22,108,200, 96,232,251,218, 10,202, 10,106,174,246,112, 74,202,243, 40, 24,
+ 74, 40,198,132,139, 53, 70,107,249, 77, 73,245, 42,115,106,169,177, 60,185,162,201, 27,102, 77,156,170,251,112,214,198,113,193,
+ 27,234,110, 10, 87,229,103,230, 83,231, 88, 74, 34, 29, 85,223,182,127, 22,224,141,133,244,161,116, 14,218,168,201,116, 99, 7,
+181,153,155, 28,193,155, 58, 9, 58,209,173,209, 73,202,237,193, 62,121,251, 47,236,252,195, 89,103,158,101,102,229,177, 15, 1,
+231,143,159,226,205, 55,223, 2,249, 61, 30, 63,126,140,222, 1,219,253, 4, 75,128,133,193,197,213, 21,250,126,192,110,191,197,
+201,122,136,155, 92,194,126, 30,245, 14,115,240,152,166, 17,100,128,217,123, 12,125, 95,158, 52,239, 61, 66,152, 17,130,199,236,
+227,133,155,230,136, 64,245,222,167, 57,121,106,107,138,196, 13, 29,132,144, 18,162,124, 8, 81,165,238, 28,156,139,182,179,155,
+121,194,235,239, 63,133, 1, 48, 7,198,179,167, 39,248,250,235,111,131,137,240,137, 15,191,136,151,158,127, 14,214,185, 84,249,
+207,240,115, 0, 66,156,239,205,129,177, 31, 61,214,235, 13, 94,121,177,199, 52,142,120,231,225, 35,248, 16,240,220,197, 57,246,
+ 47,190,130,251, 15,158,199, 48,172,224,172, 45,115, 71, 6,129, 56, 96,246, 99, 28,223,164,185,165, 24, 37,166, 67,164, 39, 90,
+215,163,235,215, 8,243, 12, 65,156,109,207,126, 46, 45,111,206,176,163, 12, 0,225, 56,191, 7, 87, 38,133, 44, 70, 45,133,192,
+ 21, 66,218,135,162, 80, 78,210,123,144, 84,145,150, 88, 79,174, 57,216, 44,130,121,142,218, 3, 31, 66, 12,124,241, 30,211,236,
+ 49,251,144,146,201, 66,179, 94, 80,142,197,164,248,221,191,242,210,115, 77, 14,182,246, 46,231, 57,104, 80,155,132,190, 69, 73,
+ 9, 70, 65,117,126, 94, 34, 60, 36, 81,206,168, 82,203, 74,133, 87,196,151,109,240,143,166, 25,234, 58, 45, 87,178,236, 57,218,
+251,178,114,154, 3,144, 66, 86,114,170, 31, 56, 68,119, 67, 86,113,231,209, 16, 49, 36,227,160, 51,191, 66,171,172, 19, 76,198,
+123, 15, 63, 71,149, 59, 51, 99,176, 22, 47, 61,115, 7,127,248,141,111,197,138,216, 58, 76, 65,224, 25,232,123, 65, 31, 24,150,
+ 8,221,106,133,222, 18, 86, 93,151,226, 88,171,230, 33,111, 78,204,213,202, 35, 44, 77,186, 95,246,176,115, 26,157,196,131,101,
+170, 80, 51, 99,223, 80,105,197,231, 46, 10, 17, 69,203,177, 10, 88,145,138, 58,201,204,182, 34,232,102,133,107,166,133,103,190,
+182,224, 57,101, 79,164,202,190, 36,231,153,186, 6, 73, 13,138,201, 81,210,185, 91, 64,198, 64, 66, 75, 26,173, 14,158,236, 89,
+175,158,121, 73, 34, 78, 42,123, 43, 85, 49, 94,131,169, 20,184,188, 24,178,201,145,128,241,212,140, 66,185,169,155,101,161, 36,
+165,102, 85,108,221,167,236, 97, 21, 10, 18,173, 46, 42,122, 19, 7,198,241,102,163,111,243, 97,111, 83,191, 47,219, 33,139, 41,
+187,246, 23,222,114, 16, 16, 1,206,211, 73, 82,246, 35, 70, 18,248,217, 65,172,195,126, 59,226,250,250, 6,219,253, 88, 64, 22,
+144,152, 27,126,117,125,131,199,239,189, 7,215, 57,116, 46, 42,112, 77,246, 54,154,184,161,175, 7,135,237,205, 8, 54,140,174,
+119,216,250, 0,155, 22, 57,151, 64, 24, 80, 74,106, 83,196,123, 84,178,157, 75,138, 73,237,197,199,141,189,216, 6, 85, 30,183,
+198, 7,228,107,163,162, 4, 69,251, 48,179,231, 61,101, 45,139,212, 74, 66,183,255, 72,205,120, 26,218,154,180,169, 56, 85,204,
+ 39, 85, 81, 94,205,161, 85, 72,170,102,218, 53,122, 85, 74, 75, 50,243, 6,168, 88,105, 12,216,160,201, 85, 39,232,160, 12,106,
+ 19,247, 68,117,133, 22,211,117, 81, 26,142,122,202,143, 7,163,253,110,143,135,239,190,135,247, 31, 62,196,241, 42, 10,198,166,
+235,115, 92, 92, 94,160,119, 61,174,111,182, 32, 16, 38, 63,198, 86,163,159, 48,178, 71,239, 98, 32, 73, 22,105,173, 87, 27,140,
+227, 12, 31, 2,134,190,199,126,191,135,112,192,245, 52,161,239, 99,100,104,144, 56, 99,246,222,195,251, 0, 24, 11,107, 93,108,
+251, 34,182,130,103,239,147,232, 43, 47,243, 92,211,252, 36,110,170,228, 28,142,142,142,176, 94,173,112, 49, 62,194,197,126, 42,
+ 42,246,253,110, 15,227, 6,192, 16, 62,244,226,243,112,233,121,243,179,199,110,191,199,184, 31, 49,123,159, 24,248, 1,236,167,
+ 20,102,228,177, 31,103, 88,235,208,247, 61,200, 58, 92,157, 63,194,246,230, 2,119,159,121, 14,167,167,119,176, 90,111,208, 91,
+ 11,146,100, 37, 11, 33,229,136, 39, 46,123,170, 68,172,237,225,134, 78,109,194,209,194,201, 28, 48, 77,123,248,121, 6, 75,101,
+129, 51,106,204,170, 32, 41,234, 75, 53, 24, 55,202,108,219,204, 62,246, 42,206, 78,121, 3,193, 39,145, 89,136,109,230, 36,232,
+147,228,115,103,213,177,153,189, 71,103,163,205,110,154,230,194,241,102, 70,169,220, 9, 82, 4,129,241,254, 51,232,186, 14,206,
+245,120,238,217,123,229,153,164,156, 91,176,172, 36,179,109,181, 1,149,139, 90,116, 15,117, 66,153, 71,110,140, 41, 44, 6, 20,
+148,113,235, 56,225,166, 69,155, 81,200, 92,240,162,245,251, 9, 37,144,133, 82, 69, 45,243, 28,149,235,194,209,101,145, 54,119,
+ 42,227,206,248,247,114,180,106,233,176,230,136, 85,225,242,153, 56,196,215, 8,126, 78,135, 53,143, 57, 29,216, 54,157,195,253,
+179, 99,124,235,253,243, 88, 60,144,129, 24, 15, 47,192,108, 3,142,214,107,116,214,161,223, 28,193,173, 86,112, 67, 31, 69,197,
+166, 6,153,176,218, 17,152,149, 16,179,140,201,116, 90, 28, 85, 58, 39,183,238,142,210, 81, 72,182,204,130, 35,207,216, 92,221,
+193, 83, 64, 24,225,234,149,207,163, 60, 22,211,206,195,179,246,133, 53, 15, 36,174,227, 68,209,209,164,137,166,113,175,143, 7,
+140,120,224,176,176,150,147,115,133, 27,232,151, 33,179,200, 82, 49, 77,150, 99,137,110,205,137,127,156, 11,109, 82,194, 59,129,
+ 43, 89,217, 74,160,198,186,228, 98,213,230, 76, 49,112, 76,148, 16, 12, 25, 82,161, 96, 30,137, 49, 94, 4, 11,122,162,144, 75,
+212,220,174, 85,167, 37, 81,254, 84,146, 5, 36,254,192,129, 47,139,136, 86,170,158, 96,189, 59, 41,193, 9, 68,176,238, 7,128,
+167, 24,234,226, 61,206, 47,111, 32, 28,112,116,247, 62,246,239,190, 3, 88,160,235,122, 32, 48,238,125,236,219,241, 43,255,193,
+127,140,235,235, 75,252,167,255,225,223,138,167, 74, 23, 49,178,235,245,128,174,235,112,185,189,198, 48,244,216, 12, 61,246, 62,
+ 96,109, 98,123,196, 36, 79,108, 77,239, 41, 38, 87,245,249,100, 1, 78,169, 86,168,226,167, 38, 29,151,152, 67,118, 14, 69,116,
+208, 22,139,114, 71,177,162,244, 49,178,211,187,170,238,165, 52, 56, 68,164,182,182, 53,158, 85,235,156,243, 44, 73, 43,242, 83,
+133,159,191,251,202, 93,206,234,242, 66,195, 81, 41,101,210, 86,243,156, 70, 19, 9,192, 96,154,192, 6, 42,153,247, 36,183, 29,
+ 12, 53,145,170,109, 51, 81, 10,203,121,248,222, 99, 92, 62,125, 2,139,128,243,243,115, 24, 8,252,184,199,205,108, 34, 3, 28,
+130, 59, 39,199,120,252,228, 9,246,211,140,245,208, 99,158, 99,199,230,244,244, 24,215,215, 55, 37,229,122,246, 30, 16,198,110,
+183, 67,191, 58,130, 21,198,126,183,131,129, 96, 78,115,201,113, 26,147,109, 48, 45,162, 18,253,210, 66,136,145,189,160,136,204,
+ 76,243, 78, 1, 48,107,197,191, 73,170,239, 84, 93, 12,195, 10,189, 53,216,237, 71,188,119,113, 25,171,120, 17,172,173,197,204,
+140,239,251,244, 71,241,149,111,190,133, 23, 31,220,135,117, 93,234, 8,120, 92, 95, 95,227,252,252, 2, 79,159, 60,193,118,187,
+ 5, 0,172,134, 30, 71,235, 21,134,213,128,213, 58,226, 97,137,128,139,171, 27, 60,121, 58,131, 67,192,213,229, 53,158,127,225,
+ 37, 28,159,158,225,120,189,130,235, 7, 88,219, 85, 80,143,250,206,251,126, 40,155,200,209,241, 29,128, 5,243, 60, 97,183,191,
+193, 52,141,165, 77,155,197, 76,156, 90,164,146, 24,239,100, 76, 93, 68, 85,186, 33,140, 77,226, 45, 83,109, 59, 65, 83,184, 80,
+ 90,176,101,161, 77, 62,246,104,177, 75,196, 75,137,223,249,110,156,138,152,140, 83,231,159,243,129, 43, 68,173,130, 77, 27, 5,
+153,248,251,174, 95, 97, 24,134, 40,242, 82,155,139, 49,185, 50,203, 85,122, 80,104, 89, 81, 13, 68, 42,145,167,185,178,203,173,
+223,194,227,160,106,187,204, 84,185,124,223, 51,161,193,113,138,182, 92,233, 96,145,252,108, 39,159,120,116, 69, 82, 9,162, 9,
+243, 4,147, 54,115,195, 81, 40, 71, 28,162,109,173, 60,171,185,165,206,149, 92, 87,230,209, 40,185, 22,144,252,154, 89,232, 57,
+ 97,154,226,175, 16, 2,142,134, 30,125,223, 97, 76,118, 56, 10, 28, 55, 46,215,161, 59, 62,198,250,248, 8,195,209, 17, 86, 71,
+ 27,216,174,135,117,182,117, 81,165, 53, 38, 22,221,188,176,239,182, 27,122, 73,108, 99,181,113,155, 90,220,229,251, 36,114, 29,
+164,133,102, 45,214,208,252,217, 89,185, 42,242,193,136, 62, 40,231,189,158, 58,226, 33,132,114, 34, 15, 53, 97,100,100,234,198,
+110,200, 64,136, 75, 81,200, 92,115, 83,140, 49, 77, 91,189,228,170,104,188,122,113, 37,104,116,172,148,110, 64,222,143, 29, 41,
+239, 37, 55,150,103, 83,197, 11, 42,180, 64, 24,117,142,145,127,136,161,114, 51, 20, 4,167,100, 74, 14, 14, 19, 93, 22,115,243,
+204,131, 35,189,176, 21,102,160,106,229, 42,112, 41, 84,130, 92,139, 72,164,106, 3, 80,135,129,190,235,176,234, 9,132, 62,249,
+ 86,165,204,219,174,207, 31, 99,179,234,112,118,122, 92, 60,195,188,189,192, 63,248,123,127, 23,126,142,213,215,245,126, 6, 25,
+193,213,110, 68,240, 1,103,103, 39, 24,214, 61,196,199,118,206, 44,192, 20, 56, 37,184,153, 2,156, 17,106,231, 39,135,204, 81,
+186,229, 43,170, 27,249,173, 50,132, 37,156, 69,101,242, 26,212, 27, 32,135, 21,148, 86,103, 82, 71,178,202, 4, 23, 85,181,211,
+146,106,133,172,165, 88,124,255,185, 13,196,113, 14, 87,247, 91, 86, 20, 75, 81,199, 45,170, 7,137,210,121, 20,128, 13, 36,121,
+213,133, 13,140,225,226,189, 39,196,182,124, 40,247, 94,211, 6, 88, 84,234,181,189,117,179, 29,241,240,237,119,241,232,201, 57,
+194,254, 58,138,210,198, 29, 12, 1,125,239,208, 25,131,253,110,135, 93,250,182, 28, 9, 46, 46,247,232,173,193, 54,120,132,137,
+177, 29, 39,116,150,112,126,126,145, 62, 76,102,174, 39,123,212, 60, 99, 27,174, 32, 32, 76,227,190,108,248,134,128, 32,136,132,
+ 55,196,135,118,246, 30,206,186, 50,115, 13, 44,232,156,131,112,192,148,230,191,157, 53,152, 83,176, 73, 1,133, 36,170,156,136,
+192,179, 32, 8,240,123, 95,253, 38,152, 25, 43,235, 48,135,128,239,254,206, 79, 97,154,103,188,248,236, 93,156,157,156,192, 57,
+155, 22,137,216,106,190,190,217,226,225,163, 39,120,231,225, 35,140,179, 71, 16,193, 81,239,176, 90,173,112,239,236, 4,247,239,
+158,225,248,120,131,174,235, 48,165, 48, 20, 63, 77,248,214, 27,223,196, 48, 12,184,255,236,125,220,125,230, 1, 78,142, 79,163,
+242, 29, 20,171,245, 84, 17,133,100,193,203, 36,186,235,155,167,152,167, 41,217,215,166, 66, 87,100,174,185, 7,140,232,143, 15,
+ 28,202, 12,189,120,188,165,110,116,217, 98, 7,205,126,207, 60,248,212,205, 8, 25,203,156, 3, 89,210,166,158, 84, 32,241,251,
+ 14, 1,215, 55, 55,232,250, 30,157,181, 8, 2, 4,142,225, 78,211, 28,197,138, 70, 5, 83, 1, 17,239,220, 15, 43,124,236, 35,
+ 47, 41, 39, 13, 45, 73,218,101,179, 40,121,217, 74,240, 74, 13,176,186,230, 97, 64,141,171, 76, 17, 30, 74,113,130,228, 82,156,
+160, 2, 7, 84, 17,212,152, 9, 83,107, 56,110,232,169, 35, 99,226,189, 21,188,199, 60, 77,137,197, 49,195, 8,195,130,225,114,
+ 94,120,122, 93, 35, 92,103,195, 33, 65,132, 18,201, 47, 95, 87,201, 65, 46, 28, 53, 38, 33,181,223,167,121,194,126, 76,191,166,
+ 9, 28, 24,103,155, 21, 30, 94,239, 83,183, 42,173, 19,206,161, 95,175,113,124,231, 12,253,176, 66,183, 90, 97, 88,175, 83,110,
+128,169, 48, 22,237,205,134,206,236,137,237,108, 99,109, 97,117,132, 20,237,154, 91,215,180,172,208, 37,129,101,116, 50, 90, 51,
+220, 65,209,110,112, 8, 85,143,145,235, 36,170,164, 57, 81,215,186,208,228,184,218,166, 69, 65,173,178, 87, 29, 84, 91,233, 48,
+ 4,147,233,126,105,180, 99,138, 85, 52, 84,107,176,193,130,245,110,202,225, 38,161, 70,146,248, 88,103,177,235, 54,124,124, 24,
+156, 78,174,170, 21, 95,220,221,205, 2,173, 75, 57, 53,134, 20,179, 58,181,171,152, 3,140,106,179,151,133,255, 86, 63, 27, 45,
+ 90,233,217, 91,205,138,145,172,200, 14, 75, 0,247, 98, 78,159,103, 77, 89,100, 70, 77,178, 75, 52,247,191,255,198, 27,120,114,
+181,197, 6, 30,155, 85, 23, 5, 18,166, 75, 52, 42,139,142, 4, 87, 55,219, 40, 52, 32,224,249,231, 95,194,143,252,204, 95,198,
+245,249, 99,252,218,127,243,159, 99,146, 45,246,115,192,236, 25,163, 4,220,108,247, 56,123,230, 12, 79,159, 94, 69, 59, 17,128,
+217,115,228,106, 91,135,174,235, 21, 82, 55,239, 71,166,108,186, 37, 75,183, 17, 60,232,209,129,105,231,115,205,130,161,174, 87,
+115, 56,168,216,213, 70, 89,156, 78,250, 21,181,153,219, 62,164,102,241, 10, 48,195, 84,160, 50,133, 96,151,171,139, 18,156, 66,
+165,197,105,242,226,141,232,135, 47, 1, 41,162,168, 79,148, 88,239, 89, 85,207, 41, 63, 61,165,186,102, 38, 54, 21,123, 91,136,
+194, 66, 20,181, 95, 62, 69,168, 60, 2,194,236, 25, 15,223,127,138, 39,143, 30, 99,218,221, 96,158,246,113,129, 75,190,238, 92,
+ 93,207,243,132,105, 4, 64, 22,206, 0,211,236, 17,242, 98,234,103,236,167, 9, 97, 26,177,101,151, 54,156,168,226,157,189,143,
+150,177,144,146,198, 72, 64, 93,135,235,155, 27,108,142,142,224,172, 73, 51, 65,198,232, 25,171,161,135,159,125, 17,203,116, 93,
+ 31, 55,242,174, 3,200,194, 88,193,126, 55,197,153,174,106, 3,134,192, 25, 26, 93,132,168,227, 52,195,186, 9,126,246,120,239,
+241, 99,236, 83,174,122,224,128,239,250,246, 79, 96,112, 29,254,232, 27,111,226, 11, 63,250,231,226,236,189, 31, 34, 92, 36,253,
+190,239,123, 28, 31,173,113,247,236, 4,219,221, 14,215,251, 9,204,140,171,235, 45,182,151, 55,120,231,157,247,113,255,153, 51,
+188,248,194,115,184,123,122, 12,207, 1, 83,170, 90,124, 8,144,247, 31,197, 69,124,220,225,248,238,125,244,235,147,184,176,178,
+ 32,120, 15, 16, 99, 24, 54, 88,173, 79,112,254,244, 33,118,219, 43, 56,219, 71,208, 12, 39,213,186, 72, 12, 93,201,135,193, 76,
+ 26,236,186, 68,174, 75, 11,119,190,191,184, 18, 32, 37,169,254, 57,205,225, 57, 39,141,101,175, 47,115,209,245,100,112, 76, 36,
+202,133, 82,145,173,134, 1,227, 52,225,226,242, 26,253,208, 71,145, 22, 71,252,110, 8,105,134, 75,166,116, 14, 12, 25,116, 93,
+ 15,231, 58,124,232,229,231, 43,221,234, 22,129, 47, 11,151, 42,253, 54, 49, 48,137,166, 38,202,193, 18,152,129, 82, 57, 69, 89,
+ 12,167,103, 36,109, 38, 36,139,110,164,148,249, 82,177, 55,165,107, 5, 8,172,117, 73,152, 25,224,167, 41, 86,212,227, 20,121,
+ 1, 28,224, 72,224, 8,209,114,139,100, 85, 99,142,233,119,169,131,198,222, 71,223,127, 34,229, 9, 85,126, 59, 7,159, 44,131,
+161, 88, 50,199,105,198,110,154,176,223, 79, 24,125, 20, 67,174, 87, 3,246,115, 40, 99, 16, 16,129,172,195,122,115,132,213,122,
+133, 97, 88,161,235,187,232, 60,200,173,246, 92, 20, 72, 77,154,203, 72, 85, 32,145, 16, 11, 97, 48,190,114,169,110,213,214,144,
+131, 82,200, 82,219, 54,151,170, 72,103,170, 62,115,225, 26, 63, 91,102,248,121,252,167,162, 80, 69, 17,174, 26,202,167,202,222,
+ 8,196,165,211,168,173,138,148, 90,233, 77, 36,108,227,246, 17, 21,173, 90,123, 40,208, 2,100, 37, 70,151,165,204,172,152,206,
+226, 90,235,154,141, 36,219,132,204,130,199,174, 62, 40, 53,177,171, 85,177,222,108,222,134, 98,220,229, 1, 59,238,131, 60,109,
+202,220,207,213,130, 86,246,133, 76, 25, 19, 52,156, 93,237, 82, 47,143,213,114,192,110, 0,107, 12,198,125,164,120,109,131,199,
+115, 71, 43,220,191,119,252,255,241,245, 38,191,150,101,215,153,223,183,155,211,221,230, 53,209,103, 48,251,100, 39, 82, 37, 22,
+ 37,168, 74,150, 74, 70, 9, 80, 73, 85,240,192,246,180, 70,254, 15,236,145,167,158,248,111,240,208,240,196,128, 1,195, 3, 27,
+ 5, 91, 54, 92, 85,164, 85, 5,149, 26,170, 72, 49,217, 38,201,100, 54,204,140,200,140, 23,175,187,247,158,102, 55,203,131,181,
+246, 62,251,220, 8,138, 64, 34, 82,161,140, 23,239,221,123,238,222,171,249,190,223,135,207,174,247, 8, 46, 96, 24, 29,162,115,
+168,180, 66, 93,105, 84, 77,133,203,207, 62, 65,219,117,248, 63,254,167,255, 5,227,232,208,181, 53, 76, 77,184, 30, 38,248, 24,
+225, 38,143,175,127,243,247,240, 31,254,252, 91,216,247, 83, 46,170,173,164,105,173, 86,237,242,131, 78,203, 78,251,120,188,162,
+212, 82, 85, 89,134, 54,148, 65,180,116,244,231,168,228,189, 38,113,200, 2,205, 75,185,224,153,145,139,170,232,206,177,196, 44,
+102,200,202, 76,198,202, 62,216, 4, 58,200,107,246,152, 71,133, 58, 9, 93, 18, 22, 17, 71,148, 36, 96,161,218, 87, 50,137, 33,
+157, 92, 23, 90,214, 64,197,218, 32,101,174, 71,100, 46,114, 8, 17, 55, 55, 7, 92, 93,239,176,223,221, 98, 26, 14,152,220, 4,
+ 80, 68,240, 14, 20,217,226, 68, 20,209, 84, 21, 42, 99, 68, 50, 24,113,232, 7,128, 28, 66, 82,204, 19, 80,105, 62, 32,186,166,
+134, 51, 6,222,141,232,170, 10, 74, 43, 12,147, 71,144,220,109, 79, 26,135,190,135, 2,176, 89,181,188, 47,119, 83,193,143,214,
+232, 26,238,160,147,250,214,128,149,241,105,111, 74,196, 54,187, 40,135, 20, 73,135,239,124,170,214,185,123, 11,114,184, 28,134,
+158,119,244, 20,241,227, 15,126,149,119,160,186,174,241,189,159,254, 18, 77,221,224,119,127,243, 43,184,119,231, 28,149,224, 96,
+181,214,104,180,197, 58, 68,156,157,109, 49, 13,123, 28,246, 7,124,126,117,141, 87,207,206, 80,213, 13, 2, 20,156, 28,200,183,
+ 55, 3,126,122,243, 62,238,222, 59,197,195,135, 15, 80, 55, 21,124,140,240, 97,146,112, 34,194, 56, 12, 56,155, 38,220,185,247,
+ 0, 88,159,115, 23,163, 53,154,110,139,166,233, 48, 76, 3, 92,240,176, 85,187, 20,173, 5, 63,167,169, 41,205, 80, 27,154, 89,
+241, 52, 63, 49,128, 8,224,178,248, 41,141, 92, 5, 89, 76,208, 25,112,146,127, 77, 65, 37,224,241,188, 11, 62,115,204,211, 33,
+ 13, 0,171,174,131, 82, 6,251,113, 66, 24, 70, 64,241, 62,221,201,229,149, 44, 90, 90,105, 24,107,208,180, 29, 54,235, 53,140,
+209, 11, 41, 15, 33, 53, 54,148,191,246, 66, 8,251,178,222,133, 94, 60, 0,179,205, 84,146,129,242, 52, 79,168,112,137, 58,161,
+168,116,120,136,191, 67, 97, 46, 2, 18,193,142, 8, 90, 25,254, 60, 5,143,224,153,168,231,189,131, 27, 7,140, 67,207, 30,117,
+ 68,182,152,105,166, 20,230, 11, 61,206,137,121, 36, 46, 2,159, 58,246, 50, 50, 84, 58,245, 40,108, 5,231, 28,166,201,161,119,
+ 30,253,228, 56, 6,216, 71,104, 93,193, 86, 42, 59,112,108,205,235, 30, 91, 85, 92, 8, 91, 86,195,163, 72,232, 76,207, 67, 90,
+214,101,171, 93,242,181,167, 84,183,212, 17,103, 16, 90, 9,152,154, 67,107,210,133,174, 18,104, 39,242, 84, 34,221, 24, 94,235,
+226,231,154,139,196,108,217, 45,181,231,165,250,255,104, 92,179,176,110,211,220,144,106, 53, 67,183,102,231, 70,201, 0,152, 59,
+117,165, 69,167,145,146,226,244,139, 46,159,101,218,202,203,127, 51,105,150, 44,189,100, 79,169, 36,212, 35,230,124,207, 57, 86,
+114, 14,184, 40,242,163, 19, 59,122,241, 77,207, 0, 6,168, 95,159, 68,121,188, 40,162,133,209, 30,203,224,146, 18, 80,128,165,
+ 5,101,174, 15,104,166,132,139,136, 0, 80,112, 19,227, 43, 27,173,241,249,245, 30,181,213, 56, 28, 70,182,127,120, 30, 5,218,
+186, 70, 87,107,172,214, 29, 12, 52,254,135,255,238,191, 65,140, 10,135,195, 1,186,174,176, 62, 61,193,221, 19,143,139,203, 61,
+ 78, 31, 60,194, 15,254,242,207,121,220,170, 21, 66,138,170, 20,184,193,122,181, 90,254,204,234,216, 34, 61,239,214,168, 4,228,
+ 20, 3,182,164,228, 95,200,108,104,134,214,164,128, 18, 77, 47,176,124,103, 95,235,226,117, 43,152,212,180, 0,183,205,229,145,
+ 66,225,159, 76,202,245,185, 35, 74,120, 66,254, 51, 50,250,202, 25,230,115, 76, 46,202,143, 69,193,242, 86,229,123,172,211,123,
+157,178,168,129,168,213,236,196, 32, 64, 41,139, 97, 2,110,174,174,224,220,136,195,126, 7, 55,246,240, 33,112, 98,148,115,176,
+ 98, 95,177,149, 69,240,132, 16, 8,198, 24,140,206,131,130,227, 3, 49,120, 14, 63,177, 6,149,226, 67,109,136, 4,163, 12, 40,
+242,104, 58, 70, 15,165, 45, 38,231,114, 48,200,232, 3,186,218,194, 57,143,147,205, 26,227, 56, 97,116, 14,109,211, 96, 63,244,
+ 92,153, 11,239, 92, 73,220, 99,140, 17, 70, 25, 24,107,160, 13, 79, 4,106, 99, 64,164,217,238, 38,175, 37, 43,181,231,127, 87,
+ 74,195, 7,225,130, 3,184,185,221, 99,187, 90, 97,242, 1, 63,254,240, 83, 84, 90,227,149,251,119,176, 90,117,232,186, 14,103,
+ 39, 39,120,251,141,215,242, 33,105,148,146,110,141, 80, 91,139,182,174,217, 75, 94, 89,124,243,157, 55,112,186,217, 98, 36, 3,
+210, 6, 30,192,228, 2,118,251, 29, 62,248,213,175,240,241, 47, 63,197,163,235, 29,222,121,237, 49, 54,155,149,168,247, 7, 12,
+227,136,219,219, 29, 46,111,119,216,247, 3, 94,121, 28,209,181, 29,108,221, 33,128,125,217, 93,211,193,187, 9,251,221, 21,170,
+170,193,126,127, 11,159, 60,180, 82,172,196,100, 19,178, 54, 63, 67, 64,200,225, 71, 68,122,246, 99, 75, 22,121, 12,142, 47,126,
+165,179,149,142,114,194, 85,224, 14, 47, 93,174, 90,129, 60,131,120, 98,140,112,211,148, 49,175, 58, 70,216,202,162,142,132,195,
+ 48,102, 5,119,136, 73, 67,194,148, 67,101, 52,172,229, 24,218,223,252,141,183,231,184,224,100,101,211,243, 78,150, 34, 73, 34,
+156,250,181, 39,219,108,215, 60,154,194,229,144,164, 50,112,115, 46,176,103,176, 38, 45,162, 60,203, 28, 13,146, 88,229, 36,168,
+210, 34,148, 99,251,154, 67,244, 30, 97,154, 56, 38,117,156,224,198, 1,214, 26, 56,231, 97,181, 98, 86, 7,241, 88, 29,210,129,
+ 83, 8,249,239, 74,227,251, 20, 60, 82, 10,202,130, 15,217, 77, 48,249,128,209, 7,244,206, 99,116, 1, 83,100, 71, 75,187, 90,
+ 99,156, 38,180,109,139,205,122, 37,194, 67,182, 9, 26, 99,242,164, 3,165,184, 85, 58,226, 28, 11, 45, 29, 62,251,192,227, 75,
+ 22,146, 69,215, 42,159, 87, 45, 63,151, 34, 53,107, 6, 98, 20,136, 78,204, 1, 60, 78,213,139,253,120, 41,146, 59,190, 99,136,
+232, 69, 19, 86, 44, 89, 34, 88,172, 92,160, 68,228,171,102,246,123, 90, 81,151,226, 93,150, 46,148,148, 86,205,103,123, 44,180,
+ 25, 37, 68, 43, 21,148,116, 36,108, 46,189,241, 60,141, 81,197,201,174,102,183, 84,250,173,217, 8,152, 81,137,177,224, 17,179,
+ 88,106,198,240,149, 9,105,116,148, 82,245,247,119,235,152, 5, 48,197,158,156, 74,158,123, 82,129,235, 66, 42, 89,250,243, 85,
+ 74, 52,210, 71,129, 50, 4,116, 45,234,190, 70,229, 6,236, 66,192, 39, 55, 61,198, 97,128,139, 10, 15,183, 13,206,206,206,208,
+104, 3,173, 34, 2, 17,182,167, 39, 88, 93,183,124, 88,245,138, 25,209,215,183,216,108, 87,232,247, 35,139,151,110, 7,120,101,
+ 96,181, 70, 21,211,158, 76,195, 26,139,237,186, 43,246, 42,101, 48,236,113,213, 94,188, 58,105,167, 88, 92,240, 12,174, 88,218,
+253,162, 42, 56, 13,106,217, 12, 80,230,239, 83,190,236, 19,234, 85, 21, 30,238,121, 51, 33,154,124,162,204,151, 86,208,185, 19,
+167, 56,163, 15, 51,219, 95,138, 46, 93,140, 2,151,132, 58,121,136,244,172,220, 85,165,146,190,192, 12,102, 98, 86,154,248,164,
+ 29,169, 55,140,228,245,183,216,239,118,216,237,110, 49,185, 41,179,198,149, 98, 37,122,101,184, 42,119,142, 69, 79,171,174,133,
+137,188,215,173, 13, 64, 30, 24, 38,135,170,170,177,173,106,120, 55, 34,164, 0, 21, 55,194,118, 29,198,145,197, 78, 85,213, 32,
+ 4, 7, 21, 12,250, 97,132, 81, 60, 74,140,129,109,142,131,139,185, 91, 11,129,215, 77,214, 24, 76, 62,176, 5, 69, 70,199,198,
+ 24,104,163, 36, 84,132,197, 64, 33, 18,180, 34,140,163,131, 11,236, 49,119, 62,202,126, 48,194, 26,141,144, 19,188,248, 3,244,
+244,249, 21,238,223, 57,199,211,231,151,121,255,119,247,252, 20,253,228,112,178, 94,225,209,189,187,104,235, 26,182,178, 66, 13,
+227,162,194,104, 3,219,174,160,234, 3, 86,219, 83,220,153, 70, 60,123,118,137, 87, 30,220,197, 73,189,198,100,106, 40, 83,195,
+ 3,176,207,159,225,231, 31,125, 12,173, 20, 46,174,118,232,251,247,241,250,227, 7,184,127,231, 76,198,186,130, 17, 62,236,241,
+171, 79, 62, 65, 8, 1, 15, 31, 60,194,230,204, 64,245, 59, 84,166, 2, 72,161,105,215,240,206, 97,191,191,206, 69,117, 44, 32,
+ 33, 49, 82,190,100,211,161, 21,131,232,122, 5,201,198, 89,218, 97,166,156, 37, 78, 95,217, 65,137,104,107,214, 22, 82,161, 30,
+ 6, 42,107, 16,130, 66,180, 54,107, 18, 72, 18,232, 82, 65, 59, 78, 14, 62,120,161,218, 69,233,172,184, 83,111,218, 22,198, 84,
+184,123,231, 84, 62,187,201, 82,165,115, 88, 72, 44,197, 89, 11,157,204,203,182,140,234,104,132,175, 22,154,152, 99,234,220, 98,
+ 27, 90,186, 58,138,195, 34, 74,209,147,254, 91, 14, 77,145,181,131,243,136,206,129,164,232,141, 98, 43, 12, 0,220, 48, 66, 3,
+ 48,197,165,142, 24,152, 6, 88,116,234, 41, 24, 39,120,143,113,114, 82, 16,207, 66, 69,239, 3, 2, 69,248,192, 62,243, 41, 68,
+140, 33,178,141,141, 20,200, 70,212, 74,177,142,161,174,176, 90,175, 80, 55, 53,140,181,185,163, 6,138,244,195, 2,123, 29,105,
+142,245,230,184, 95,185,111, 82,204, 40, 10, 55,239, 12, 1, 96, 7, 66,122, 25, 3,229,105,146, 6, 96, 64,208,130,186, 85, 52,
+223, 95,123, 91,101, 75, 93,204,151,250, 81,177,128,121,167,175,142,223, 35,122, 73,226,104,222,185,163, 88, 37, 74,196,118,162,
+130, 22,246, 94,157, 98, 83,161,139, 24,231, 98, 82,155,214, 44, 74, 1, 20,114,225, 67, 11, 74, 93, 34,145,243,239,217,249, 15,
+ 28,245,244,170, 16, 78, 9, 32, 37,143,202, 85,145,127, 93,102,192,198,242,110,154,247,105,115,247,249, 34,224,117, 89,189, 22,
+106,108,141,163, 78,189,240, 47, 34,153,174,145, 19,152, 64,106,145, 31,172,202,233,131, 82,232,162, 7, 25, 66, 99, 42,180,171,
+ 14,113, 26,112, 99, 13,222,188,127,138,237,186,195,211,207, 46,177, 7, 67, 64,140,213, 56,252,242,103,120,253,157,175,192,251,
+ 17,195,207,222,195,211,139, 91, 86,216,172, 91,212,171, 6, 87,159,127,134,117, 91,115,151,238,121,151, 18,133,241,104,140, 65,
+ 93,215, 98, 81, 89,226,115, 94, 32,193,149,173,114, 17,129,163, 74, 86,106, 10,207, 66, 17,234,146, 34,250,104,233,203,159,161,
+ 54,200,121,193,139, 61,123, 30,217,207, 31, 38, 42,136,124, 73,228, 24,197,188,147, 31,141,228, 91, 47, 88,142,121,102, 64, 49,
+ 11, 56,210,129, 77,121, 36, 63,219,114, 80,164, 14,207,196,173, 57, 66,149, 15,104, 78, 19,251,224,231, 63, 65, 99, 13,218,182,
+130,159, 60, 90, 75, 24,199,136, 72,220,101,213, 85,133,166,174,178,101,203,202,142,127, 24, 70,177, 41,113,231,213,118,107, 64,
+ 29,242,129,164,108,131,181,149, 61,120,242, 75, 67,161, 54, 10,164, 45,195, 97, 40, 64,107, 11,144,131,143, 74,162, 74, 53,200,
+ 71,104,163,176, 31, 38,168,192,108,241,195, 56,194,202,136,223,249,128,186,174,133, 71,206,187, 78,147, 71,239,252, 62, 79,206,
+201, 37, 31, 81, 87, 21, 70,199,202,108,166,162,233, 68, 73, 5,160,240,254, 39, 79,241,230, 23, 30,225,233,229, 21,140, 82,216,
+172,120, 31,220,214, 53,238,156,158,160,107,107, 38,158,201,101,174,100,118, 98,219, 21, 44,245,232,214, 91,156,140, 3, 84,152,
+208,212, 29, 62,191, 62,224,213,251, 45,123,236,109,131, 74,235, 60,101, 88,215, 22,181, 86,184,117, 17,239,254,242, 19,188,126,
+187,195,100, 56,134, 71, 0, 0, 32, 0, 73, 68, 65, 84,235,143, 31,162,105,106, 12,211,128, 72, 64, 3,133,155,155, 27, 84,214,
+ 32, 6,135,166,237, 48,142,131,216,240,248,217, 10,130, 96,205, 17,168,105, 12,143, 20, 25, 43,153, 5,162, 8, 78,163,229,153,
+ 93, 93,200, 63,213, 60,165,155, 51,185,231, 3,113,142,176, 76,170,121, 45,157, 94, 88,240, 11, 22,232, 78,241,189,251, 72,208,
+166,130,138, 46, 95, 0, 85, 85,161,237, 86,248,218,151,223,204,137,131, 42,177, 26, 20,167,176,165, 49,170, 49,229,196,235,239,
+ 73,159, 60, 18,182,170,163, 4,203,172,180,166, 37, 37,115, 46,148,151,199, 67, 42,106,116,169,156, 79, 23,174,103,101, 58, 5,
+207,191,230,125,180,133, 23,199, 79, 25,116,163, 33, 69,148,143,179,232, 47,117,251,226, 58,240, 17,232,251,145, 29, 27,129, 93,
+ 27, 33,196,108, 7,244,196,110, 12, 31, 1, 71,128,151,201, 71, 8, 1,155,147, 19, 52, 77,131,182,109,208, 52, 13,195, 96,114,
+162, 98,204,119, 75,137,158,166, 72, 12, 56, 75, 35,116,196,226,242, 79, 67,196, 57,164,132, 4, 27,108,228,123, 79,103,191,150,
+ 17,184,213, 90, 46,117,206,133, 71,140, 48, 49,192, 34, 96,167, 77, 30,187, 39, 93, 76, 78,179, 43,210, 9,203,209,121,121,121,
+207,193, 45,179, 14,173, 76,119, 76,129, 61, 80, 18, 99, 91,172, 64,179,132, 56,167,245,189,152,137, 18,213,114,194, 51,199, 14,
+167,215, 46,206, 95,143,102,162,140,205,106,191,163,222,154, 95, 80, 45,138, 62, 42,130, 84,230, 17,124,146,193, 43, 85,238,103,
+245,156,244, 86,166,204,188,112,159,151, 80, 22,181,176,109,100,124,104,169, 1,167,151,120,220,211,223, 75, 73,216,199,180,180,
+133,162, 27, 96,219,133,115, 24,125,192, 20, 60, 30,158, 87,152,170, 22,231,247,206, 64,209,227,226, 57,199, 86, 70,239,177,178,
+ 6, 94, 18,155,126,241,131,191,195,253,215, 94,195, 59,191,241, 13,252,236, 91,223,134, 85, 10, 67, 63,194, 24,205,170, 89,171,
+ 97, 8,112,177, 36,190,241, 95,106,196, 10,147, 83,211, 8, 47,174, 33,202,187, 60,217,193, 98,178,190, 29,149,239, 49,185, 2,
+232,136,193, 66, 47,192, 98, 11,106, 69,110,229,249,192,156,173, 97,165,216,110, 14, 53,160, 25,252,146,112, 12, 81, 30, 60, 53,
+239, 19, 75,232, 79, 82,202,166, 79, 43,233,249,231, 32, 93,252,183, 58, 85,150, 2, 46,146,244, 35, 20, 86,142, 57, 42, 87,227,
+203, 95,255, 50,254,223,127,243, 23,120,124,106,209, 53, 13,186,213, 6,141, 5,116,181,194, 52,244,232, 71, 57,180, 18, 81, 44,
+175, 7, 88,157,157,232, 81,253, 52,193, 26,131,160, 52,234, 90,193, 59, 47,158,219,128,186,174, 48, 57, 66,101, 43,120, 16, 40,
+ 50,168,100,213, 54,216,199, 30,214,116,136,193, 99,242, 14,209,113,197,122, 24, 6,230,185, 7, 22, 69, 26,205,163,196, 16, 3,
+180,210, 24,167,137,131, 81, 36, 33,175,159, 28,148, 49,168,170,134, 61,211,149,193,213,205, 14, 74, 43, 17,107,197,188,178, 74,
+171,150, 4, 34,250,248,242, 6, 63,126,255, 67,252,248,163, 39, 92,184, 24,141,253, 48,225,241,195, 83,116,109,139,186,170,161,
+ 5, 2,166,137, 59, 21, 83, 55,208,182, 66, 67, 60, 29,136,110, 18, 95,247, 53,118,187, 27,252,252, 87, 79,240,218, 67,143,237,
+221, 26,147,169,228, 57, 37, 24, 16, 26,107, 49,132,136,222, 69,252,242,217, 13,246,131,199,171, 15,207,177,221,172,160,148,198,
+228, 3,118,187, 61, 42,171,177,223,239,177, 94,173,113,178,221,161,109, 59,168,186,131,210,172,250,167,224, 65,178, 82,240,129,
+ 59, 62,165, 52, 7,157, 68, 30,169, 7,154,167, 56,105,132, 76, 98, 65,138, 8, 25, 40,162,140,145, 48,148,152, 39, 68,101,222,
+ 64, 6,131, 40,133, 40,140,140, 88, 66, 66,242,232,152,181, 22,233, 53,231, 29,125,204,246, 71, 45, 54, 54,107,107,188,246,234,
+195,217,122, 89,136,158,146,141, 78,155,130,155,112,212,170,224, 5, 87, 10, 45, 20,243,179, 0, 57, 85,190, 5,104,131,146,208,
+119,137,216, 86,114,164,206,182, 46,157,187,217,212, 73, 70,207,250,143,242,215, 68, 75, 76, 87,130,115, 14,211, 56,242,152, 61,
+145, 54, 19,132, 70, 94, 43,190,248,124,126,125, 3, 20, 38,101,113, 24,123, 4, 9,228,201,151, 58,177, 43, 35, 66, 33,128,241,
+212,164, 52, 52, 49, 74, 89,137,120,175,105, 91, 84, 21, 35,119, 75,189, 14, 10, 7, 78,210, 70,164,253, 50,164,168, 72, 34, 67,
+ 18, 7, 15, 31, 44,179,120,143, 66,132, 38, 17,252, 5,159,127, 54,210,134, 69,167,134, 11, 87, 22, 6,122, 46, 90, 2,119,222,
+ 15,122,194,175, 68, 7,146,180, 9, 20,139,236, 8, 41, 0, 67, 40,246,225,197,202, 84,169, 89,231, 52,219,112,231, 20,191,212,
+224,168, 4,107, 82,234, 72,228,166,160, 72,231,233, 55,137,101, 60, 19,239, 10, 94, 72,206,147, 47,156, 23, 73,244,188,224,201,
+147,130,229, 11,180,240,144,167,184, 15,185,172,149, 46,119, 10,115, 14,116,140,180,232,228, 74, 30,113,170,220,115,151, 39, 97,
+ 38,127,255, 12,158, 22,151, 93,132,240,232, 95, 82, 5,171,130,197,152,247, 86,210, 21, 39, 42, 80,190,254, 53,240,236, 87,159,
+195,141, 35,172,102,229,103,208, 6,171,166,134,155, 38,220,222,236, 48,184,192, 35,155, 64, 8, 42,160, 61,127,140, 71,111,190,
+141,159,252,135,111,163,122,250, 9,126,255,159,255,231,248,223,255,245,191,197,132, 32,213,186,140, 20,229, 67,239, 67,196, 4,
+133,149, 49, 8, 82, 37,205,209,126,197,212,224,104, 53,145, 63,192,169, 48,162, 35,250,158, 90,150,110, 42,206,213,129, 18, 33,
+ 89, 60, 66, 25,206,151,109, 10, 86,157, 3, 96,230, 39, 66, 47,162, 84, 19,142,116, 57, 57, 80,133,109,158,138,226,227,152,177,
+ 95,136,219,146, 53, 73,198,149, 37,237, 79,101,102,180, 28,229, 81,177,234, 93,198,254,154,176,176, 44,126,247,251, 63,131,115,
+ 35,126,240,254,103,240,222,227,149, 59, 91,108,183,107,156,111, 79, 16, 67,196,166,171, 48, 78, 30,189,139,168,173,193,237,126,
+ 15,107,216,122, 70, 20,242,168,207, 90, 11,239, 29,154,186,134,115, 99, 86,161, 54,214, 98,242, 30, 77,165, 16, 13, 63,185,206,
+ 1,125,112, 8, 20, 80,213,236, 87,175,173,201,185,222, 33, 4, 84, 13, 19,211, 2, 17,200, 7, 24, 99, 16,130, 23, 91,158, 64,
+ 72,160, 48,142, 19,160,192,137,108,206, 3, 48, 0, 69, 12,227, 4, 99, 52,134,201,205,220,234,244, 26,145, 90, 4, 20, 2, 10,
+127,243,179, 15, 81, 9, 13,107, 28, 39, 40,165,112,186, 89,195, 86, 22,198, 86,204,212, 78, 73, 84, 0, 16, 61, 12,106,212,117,
+205, 93,200,246, 4,193,141,136, 99,143, 87, 30, 62,132, 11,132,157,155, 48, 61,249, 20,119,238,221,195,166,169,208,117, 29,252,
+225, 22, 10,132,214, 40, 28,180,130,167,136,103,183,123,144,119,120,120,239, 12,103,103, 39,104, 26,158,140, 60,123,126,131,105,
+ 26,113,255,222, 93, 64, 41,220,220,222,226,228,228, 28,117,183, 2, 76,149,133,106, 65,192, 59, 62, 70, 84,117,195,170, 99,205,
+184,221,152,114,179,245, 60,102,133,209, 32,239, 69, 24,133,124,121,229, 21,143, 49,208, 49,240,250, 68,161, 88,225,240,225, 78,
+137, 54, 71,133,213, 77,118,180, 62,178,144,146,113,177,148,173,115,105,204,107,173, 69,215,173,241,149, 47,190, 49, 39,126,229,
+221,127,114,248,204, 0,154, 18,228,153, 21, 40, 47, 21,204,169, 69,114,100,210,173,164,213,102,137,230, 94, 50,182,168,116,112,
+206,182,174,244,154,128,197,113, 9,236,227,157,151, 78,125, 18, 80,146, 36,222, 73,242, 93, 98,193, 79,206, 97, 26,165,208, 43,
+ 8,101,144, 36,188, 20,241,171, 73, 8,128,182,134, 55, 53,156,174, 48,248, 41,227,118, 99,224,105, 71, 76,133, 85,242,182,139,
+240,149,117, 11,220, 57, 55, 77,141,166,105,102,235, 51,205,220,116, 42, 96, 48,252,103,229, 8,138, 66,135,204,103, 76,142, 95,
+156, 47,244, 24,184, 32,241, 76,110, 84,222,137, 93, 57, 2,198, 64, 27,131, 96,152, 12, 40, 41, 69,108,205,147,192, 31, 77,132,
+ 74, 87,232,139, 75, 61, 79,135,114,151, 46, 10,121,201,155, 79,216,235,185,207, 84,197,249,169,138, 48,153,148, 91, 80,100, 74,
+104, 93,176, 68,104, 17, 43, 61, 55,168,148,249,253,106,177,142,153,233,126,116, 20, 40, 3,154, 45,117, 68,128, 77,214,164, 37,
+ 47, 93, 46,153,244, 0,103,102,119,250, 38, 84, 62,236, 33, 82,252, 36,252, 74,187, 48, 86,243, 38,206,174, 46,124,227,244, 82,
+ 76,108,249,123, 60, 35, 72,120, 62,129, 94,168,217, 34, 64, 71, 46,237, 23,132, 10,197, 15,173, 0,184,177,135,169,106, 32, 76,
+176, 74,225,242,106,135, 87,238,157,225,118,183,199, 52,186,140, 29, 92,173, 26,156,223,189,139,103,159, 63,197,119,191,253, 30,
+ 30,126,225, 13, 28,110, 47,176, 62, 57,135, 81, 10,167,175, 60,134, 26, 15, 64,116,156,196, 53,121,168,198, 10,189,137, 96,172,
+194, 40,193, 40, 41,221,170,244,151, 30,225, 81,230,203,242, 5, 56, 79, 41, 36, 64, 65, 56,154,125,252,138,232, 69, 46, 62, 29,
+165,151, 22, 10,120, 69,169,147,197,162,112, 99,152, 6,228,223,145, 45,133, 9,174,177,176,231,208, 75,160,214, 5, 52, 80,209,
+172, 95, 37, 73,177, 80, 71,181, 73,186,204,185,114,230,200,206,121, 42, 51, 79, 23,234,138, 15, 90, 91,241,222,235,201,229, 13,
+ 62,185,184, 2,197,143,241,224,252, 4,167,167, 39, 88,183, 29,148, 98,236,100,119,247, 28,251,253,129, 59,232,186,129,115, 14,
+109, 83, 99,114, 14,214, 86,240,145, 0,109, 1,104,140,227,129,149,206, 98,189,154,124,128, 77,155, 3,173,177,105,106,244,195,
+192,251, 89, 31, 96, 20, 1,158, 59,110, 69, 10, 30, 60, 62,103,196, 50,167,178, 69,240, 72,211, 59, 14,168,224, 67,202,192,104,
+133,186,226, 12,128,131,172, 6, 38,231,143, 12,207,242, 10,201,123,161, 18,176, 68,139,144, 79,180, 38, 55,163,199, 23,187, 22,
+ 77, 93,139, 56,142,167, 67, 58, 91, 24, 8,202, 59,152,202, 3,166, 66, 93, 91,128, 86, 8,238, 4,222, 57,168,190,135,113, 14,
+163, 34, 12,163,199, 79,127,254,115, 60,190,123,134,223,122,237, 1,254,246,167, 7, 12, 62, 96, 93, 89, 52,134, 5,123, 86, 43,
+172,107,139,195,126,143, 97,116, 56, 63,219,162,109,107,180, 2,173,233,251, 30,215, 55,183, 88,117, 29,158, 95, 95, 97,229, 38,
+ 1,138, 88, 40, 99, 17,156,195, 52, 77,136, 74,195, 52, 45,148,182, 32, 9,141,241, 18,141,170, 52,119,118,100,140,156, 72, 53,
+ 98,112,243,250, 78,126, 46,173,140,164,143,114,215,206,128, 26, 63, 11,137, 84,193,219, 70, 26,237,243,123,234, 3, 67, 83, 92,
+129, 54,141, 66,179,211,154, 39, 8, 77,183, 66,221,118,120,227,181, 87,138, 84,137, 34, 33,145, 88,212,104,140, 46,236, 83,130,
+ 74, 79,236, 5,245,107,198,239,153,158,167,150, 44, 46,164,189,101, 49, 35,141,200,152, 40, 18,159, 62,219, 7, 85, 78,118,155,
+ 21,222, 92, 24, 37,108,107,112, 60,118,103, 45,129, 88,219,130,228,203,167,113,185,231,200, 95,182, 93,138,106, 94, 28, 5, 9,
+180,162, 69, 72,186,218,108, 96,155, 6,109,183, 69,255,217,231,240,227,132,201,123,246,250,203,106,133,114, 76, 29,223, 9, 38,
+111, 64, 3, 63,115,210, 0, 38, 1,241,220,161, 98,177, 95, 95,224,193,169, 72,161,203,103,191, 52,151, 9,146, 19,188,176,235,
+153,152, 71,110, 2,188,103,110,190,164,206,193, 90,192, 24, 40,209, 79,168,148, 17,144,116, 25,228,241, 72,143,120, 15, 70, 96,
+ 50, 36, 99,255,153,219, 62,127,143,233,178, 85,249,109, 68,158,196, 38,103, 88, 41,240,158, 45,102, 90, 82,224, 84,196,114,253,
+152,175,231,152, 87,165, 57, 13, 51,119,252,122, 73, 81,165,108,125,152,211, 37,213, 28,161, 5, 82,176, 51,183, 91,191,120, 88,
+167,215,155, 37,189, 11,128,138,202, 34,182,121,185,159,147,189,228,197,209,154,237, 57, 74,158,231, 56,227,234,126,173,176,100,
+105,155, 91, 18,148,242,214,160, 12, 23, 41, 34,242,162,194,139,217,101, 81, 1,206, 97,101, 8, 55, 33,194, 35,162,174, 43,248,
+224, 49, 13, 35, 98,224, 93,217,163,135,119, 80, 27, 13,219, 54, 88,173, 59, 92, 31, 70,108,206,239,224,243,171,103,248,171, 63,
+255,183,232,106,139,139,207,158,224,241,118,141,182,174,112, 59, 56,172, 5,251,106,148,226,128, 24,197,107,247,153,148,164,231,
+ 42, 76,205,254,239,153,158,171,178,253, 43,145,213, 52, 20,254, 94,242,125,222,203,188, 88, 30,169,133,135,242,197,125, 92, 73,
+ 75,226,148, 61, 30,135,231,177,119,212,115,229,249, 50, 3, 69, 65, 46,202, 30,116,210,153,244,200, 9, 92,162,198, 79, 66, 28,
+210,108,121,203,234,118,204,151,184, 76, 42, 98, 17,247, 72, 96,245,251, 59,111,189,138, 87, 31, 63,192, 95,125,231,251, 24,250,
+ 61,134,225,192, 33, 40, 8,120,242,252, 10, 79, 46,158, 67,105,131,123,103, 39,152, 86,107,172,187, 14,155,174,195,224, 35, 52,
+ 8,117,213, 98,156, 60,180,102, 95, 58,127,101,139,209, 57,116,155,187,232,119, 28, 23,169,181,133, 86, 1, 46,120,137, 23,231,
+ 61,121, 93, 85, 50, 46, 87,240,206, 65,215,141,224, 49, 19, 36, 69,195,251, 8,163, 5,248, 65, 17,163,128,139,200, 59, 24, 91,
+243, 62,221, 32, 79,174,120,215,206,254,244, 88,182,117, 89,226, 80,208,252,138, 44,131,244, 33,104,106,139,173, 40,137, 53, 84,
+ 86,243,130, 2, 20, 25, 40,217,207,171,224, 96,109,205,235, 26,163,209, 52, 13,186,110,141, 32,128, 13, 99, 44,234,138, 96,155,
+ 6, 23,187, 9,219,147,115,252,193, 63,104,240,193,167, 79,240,228,226, 10, 86, 43, 52,150,117, 4,251, 64,120,222,143,176,106,
+196,174, 31,112,247,108,139,245,122,133,166,174, 64,116,192, 48,140,172,182,175, 27,108,183,107, 52, 85, 5, 83,213,168, 87, 39,
+146,153, 48,161,233, 86,128, 50, 8,226, 66,240,130,121,173,140,129,173,235, 76,181, 34,137, 81,205,196, 15, 17,234, 41,101,144,
+ 60, 45,164,197,222,228, 61, 72, 25,144,138, 32,242, 11,101, 49, 37, 2,157, 96,125,125,240,217, 58,232,132, 32,167,101,146,163,
+181,134,149, 93,250,215,191,242, 86, 78,248, 34,104, 32, 70,104,104, 68, 86, 65, 22, 29, 89,204, 83,203, 89, 18, 67,153,141,255,
+107,199,239, 89, 0, 43, 82,160,156,212, 53, 23,205, 90,178, 0, 52, 69,144, 54, 24,180,149, 29,190,153, 47, 72,173,179, 51,133,
+ 4, 11,236,189,135, 27, 71, 4,177, 89, 38, 32,141,247, 30,193, 7, 56,239,249,191,115, 65, 94, 11,121,253,162,203,221,124,114,
+ 45, 41, 16,182, 39,167,104, 78,207,176,222,110,209,110, 79,240,228,217, 37, 76,187, 66,116,220,208, 68,197,255,164,112, 25,173,
+151, 19, 63,254,190,184,144,186,124,126,137, 71,143, 30, 8,248,106,118, 48,132,120, 68,181, 92, 16,213,150,145,205, 16,129,108,
+ 12,129,173,171,158, 5,129,138, 34,224,157, 92,238,204,185, 79, 13, 76,172, 2,162, 49,160, 96, 65,214,194,104,197,227,121, 17,
+178, 69, 21,161,131,199,185, 82,184, 16,248, 83, 38,165, 70,201, 28,144, 95,151,194,247, 35, 76,121,193, 5, 41,173,221,185,101,
+227,108, 87, 62, 47,197, 33, 3,154, 93, 5, 60, 94, 79, 54, 58,169, 14, 73,201, 35, 70,197,184,189, 8, 91, 45,243,230, 23,244,
+ 79,192,102,235,153,162,101, 80,202,113,136,134, 82, 69, 12, 40,114,170, 14, 45,146,180, 40,179,171,115, 56, 66, 1,110,208,152,
+115,187,203, 19,107, 73,140,155,187, 63, 85, 16,153,102,213,168,202, 81,134,203, 17, 53,207,179, 82,226, 89,249,115,140,195, 8,
+ 13,194, 89, 87,227,208, 15, 80, 90, 99, 58,140,184,255,214,151,241,228,167, 63,194,253,123, 91,172, 54, 29, 40, 68,236,251, 93,
+142,148,253,194,219, 95,198,147,159,253, 8, 77,219,225,124,213, 96,220,143,248,253,127,241, 95,224,175,255,221,159, 97,127, 17,
+176,158, 28,234,186, 98,223,171,188, 76,218,104,216,166, 41,172,100, 36, 44,121,158, 86,228,215,240, 37, 65, 55, 42,135,162,226,
+ 40,137, 44, 5,169,205, 54, 49, 42,162,233,242,120,234, 72,133, 27,169, 40,196, 50, 64,134,138,130, 88, 65,235, 88,192,126,104,
+150,218,209, 17,123, 64,189,172,247,152,149,188,165,144,133, 52,150, 31,129,200, 7,163, 78, 9,112,201,182, 86, 66, 71, 40, 50,
+164, 36,146,116,242, 64,211, 84,248,195,223,255, 29,104,165,240,157,239,254, 16, 23, 23,207, 48,244,123,184,105,228,172,236, 16,
+240,244,217, 37, 62,195, 5,180,177,184,127,126,138, 59,219, 19, 52,171, 53,182,155, 53, 86, 93,196, 56, 77,152,166, 17, 90, 25,
+132, 8,212, 13,239,201,235,166, 5, 65, 99,232,119,153,185, 77,114, 89, 87, 21,143,246, 83, 80, 78,148,209, 58,137, 8,210,104,
+141,209, 57,104, 99, 49, 8, 81,206,170,249, 53, 54, 18,120,196, 86, 35,126, 79,125, 8, 2,178,241, 37,123,168,176, 42,241,135,
+ 88, 11,129,170,204,149, 78,156,240,117,215, 96,189, 94,113, 17,169, 69,221, 43, 99,123, 21, 35,116, 85, 67,219,138,187,184,232,
+ 97,180,134,142, 30, 22, 17,117,101,208,212, 21,188,115,128,226,110,171,169,107,120, 31,240,193,167,159,162,169, 42,188,245,234,
+ 23,112,186,221,224, 71, 31,124,130,157,243,160, 17,232,125,192, 73,219, 96,187,106,113,232,123, 60,121,118,133,237, 97,228, 11,
+188,174,160,192,192, 29, 59, 76,184,189,189,197,122,181,194,250,244, 28,245, 20,120, 30,100, 43,172,235, 70, 40,114, 49,143,126,
+155,166,129,182, 53,160, 44, 16, 38, 46, 76,160,196,150, 37,234,110, 37, 34,183, 66, 57, 66, 2,175, 33,217,181, 39,133,124, 2,
+149,164,238, 60,138,168, 45,200,197,230, 67,128, 19,224, 16, 41, 61,207, 38,149,146,104, 80,139,135,247,239,200,251,108,114, 55,
+ 4, 45,223, 19, 1,214,178, 2,158,101,214,105,218,165,101,146, 32, 43,173, 20,204,244, 18, 88, 13, 21, 12,108,149,146,198,168,
+248, 7, 4,237, 61, 95,236, 18,143,186, 82, 22,211,106, 13, 8,116,136,147,199,116,161, 6,103,186,218, 56,142,178, 47,247, 34,
+ 8,151, 48, 29,129,196, 36, 88, 76, 42, 94, 3,233,236,229,247,222,101, 45,141, 6, 23,123,213,106,133,122,179,197,250,228, 20,
+ 85,215,161,106, 59, 76,193, 67, 89, 38,114,146, 78,170,238,121,215,156,227,147,229,125, 10,129,189,242,135, 67,207,190,119, 69,
+136, 62,194,249, 32, 62,120,225,211,103,255,248,124, 45, 24,205, 62,118,163, 53, 42,107,217,126, 71, 17,209, 57,248,105,130,155,
+198,188, 71, 87,129, 83,232, 40,122, 32, 68, 24,195, 25, 29, 49, 6, 4,107,249,215, 24, 50,116,103,102,119,104,132,224,112, 90,
+ 25,124, 46,197, 85, 12,106, 46, 12, 23, 93,125,178, 33,234, 25, 18,148,184,252,170,100, 24,148, 93, 27,119,179,145, 56,149, 82,
+ 17,165,220,151,217,115, 47,235,142,164,255, 35,137,217,230, 97,169,102,150, 60, 21,123,244, 88,112, 3, 22, 22, 57,185, 43, 21,
+193,106,165, 16,138,241,231, 75,154, 93,169, 46, 37,207, 21, 71, 65,105, 52, 7,161, 45,188, 82,242,162,169,114,204,252, 82,235,
+199,145,144, 68,198, 24, 49, 18, 72,199,101,123, 72,197, 95, 70,229, 15,162,178,160,111, 65, 25,204,149,120,141,232,118, 8, 20,
+ 48, 58,143,211,179, 13,238, 63,124, 21, 95,251,189, 63,194,255,250,131,239,161, 93,181,217,254,208, 84, 6, 83, 47,249,214,162,
+246,188,255,240, 21,169,144,129,223,254,131, 63,194, 95,255,249,159,229, 23, 24, 57, 24, 33, 98,138,220,185, 85, 85, 93,188, 68,
+154,147,216, 98, 9, 97, 65,230, 66,191,120, 79,150,156,116,181, 88,113, 35,211,224,244,114,119,147,216,234,185,162,156, 19,244,
+ 84,233,111, 20, 75, 98,218, 27, 41,201, 88, 79,254,219,185,139, 40,202,180,151,196,160,190,232,187,159,137,113,124, 88, 97, 65,
+217, 42,247,247, 51,220, 65,229, 44,226,236,222, 16, 52,168,138,144,128, 33,157, 97, 20,223,252,198,111,192,104, 5,135, 21,254,
+253,191,251, 54, 46,158, 61, 1,105, 30,197,165,241,226,211,103,207,241,244,217,115, 84,117,141, 7,119,206,177, 89,175,177, 89,
+175,229,242,138,104, 42,133, 41, 68, 24, 91,207,121,211,166,230, 40, 79,226,110,218,128,177,172,156, 11,109, 16, 2,219, 20,125,
+218, 17, 66,193,104,142,151,116,228, 97, 37,119, 60, 68,207,162, 53,163,243,165, 20, 66,132, 54, 22, 33, 38,214,120, 40,198,174,
+101, 14,178,112,171, 23,185,241, 75,238,127, 36,224,108,187, 70, 43,104, 77, 37, 43, 46,164,188,107, 74,112,142,132, 88, 13,208,
+240,176, 20, 80, 81, 68,173,129,216, 54,249, 48,240,129,227,132, 35, 69,156,157,157, 33,134,128,171,195,132,166,233,240,213, 55,
+190,128,207,174,118, 24,160,240,246,102,139, 70, 43, 92, 95, 95,227, 48, 78, 80,136,184,222, 29,112,232, 7,116,109,131,182,173,
+112,189, 59,192,104,133,243, 45, 11,234,160,175,225,218, 21,148,109,112,231,228, 14,108,211, 65,105,131,105,154, 48,140, 3, 42,
+163,115, 10, 33,162,207,129,227,108, 25, 51, 34,182, 2,188,104, 70,120, 15, 42,170,122,109, 5,233, 73,115,160,139,140,150, 99,
+ 18,224,201, 97, 28,130,135, 23,129, 92,186,216,121, 11, 99,243,243,174,181, 65, 93,183,104,187, 86,166, 24,102, 17,210,146,132,
+104, 90,203,152, 90,146,204, 84, 90, 33, 73,250, 95,148,207, 37,228,255, 46,197, 17,153, 62,145, 68, 80, 34, 78, 83,242,126, 41,
+130,100,157, 75,167, 30, 3, 84, 8, 2, 76, 25,161,252,132,105,115, 10, 85, 85, 50, 69,224,208, 45, 34, 6,151, 68, 2,250, 97,
+196,212,247,121, 85, 25, 83, 17, 57,205,124,118, 39,222,124,126,214,249, 53, 49,182,130,182, 54,115,227,161, 13, 54,167,167,104,
+215, 27, 52, 93, 7,219,180,232,214, 43, 60,122,252, 8,239,191, 63, 64, 91, 3,114,172,129,208, 57,110,116, 38,166,233, 84,188,
+203,133,221,239,247, 88,111,182,216,239, 15,104, 26, 22,139, 78, 19, 7,193,140, 3,171,234,125, 8,115,202,154,226, 28,116,173,
+ 53,154,186, 66, 93,215,168,173, 65,101, 53, 32, 93,186,159, 28,166,113, 64,244,204,124, 32,207, 2, 87,190,228, 3,124,144, 40,
+ 83, 5, 88, 91, 33, 84,172,227, 8,218,192, 26, 46,216,180,156,133, 14, 64,173,109, 26, 10,205, 10,245,210,195,158,243, 42, 84,
+134,217, 36,132,122, 2, 45,189, 16,249,157,137,191,130,123,149,152,204,196, 97, 40,237,131,201, 85, 84,102, 96, 65, 66,214,178,
+141,184, 80,232,167,239, 41,143,255, 23,250, 40,205,152,216, 12, 72,120, 9,147, 61, 7,198, 43,254, 6, 41,169,241,138, 21,145,
+ 42, 70,186,121, 29, 44, 15,151,210,162, 90, 76,123,224,194,130,165,104,110,218,105, 89,206,202, 1,165, 23,115, 95,254,218, 12,
+246, 88,173,214,217,115,104,140, 65, 63,244, 92, 17, 81, 40,210,195,248,143,186,113, 15, 63, 12,152,250, 1,163,243, 88, 87, 6,
+207,222,127, 15,255,231, 47,222,207,157,230, 56, 76,208, 96, 91,200,254, 48,128, 98,196,197,231, 79, 97,172,197,147,143, 63,192,
+ 97,114,184,119,122,142,191,253,139,111, 99, 12,236,119,124,243,107,191,133, 95,253,242, 39, 60,234,138, 17, 83,136,176,182,128,
+ 82,168, 57, 96,101, 30,219,205,194, 53,165, 94,202, 8,122, 49,164, 86, 45, 21,253,179, 58,190,188, 8,230, 63, 89,164, 23, 46,
+148,150, 72,113,128, 57,239,254,248, 98,199, 34, 6,146, 72,101,109, 3, 22, 0, 32,181,200, 90,198, 11, 52,188,163, 65,132,176,
+ 12,142, 12,242,133,117,167, 96, 51, 73, 39,198, 31,130, 40,204, 2,254, 47,246, 97,133,167, 79, 63,199,217,157,251, 88,173, 86,
+120,231,205, 87,241,221,239,255, 16,253, 97,135,105, 24,224,220,148, 69, 65, 79, 47, 46,241,228,217, 5,106,107,113,255,116,139,
+237,102,141,122,123,134, 70, 25, 16,121, 76, 8,194,100, 15, 0, 12,130,182, 44,130,164, 32, 19,142,164,208,230,170, 90, 39, 16,
+144, 98,229, 59,148,102,145, 92,140,176,182, 65,244, 6, 49,112, 23,170,181,129, 74,208, 14,239,225, 35,112,232, 7,217,195,207,
+124, 0, 22,131,206, 98, 21, 74,127, 71,145,200,151,188,179, 4,224,206,201,150,191,182,214,208,194,121,167, 24, 0, 35, 86,171,
+192,227,107,138,150, 47, 6,165, 80, 85, 21, 98, 8,104,196,250, 21,173, 1, 53, 21,251,152,189,199,193, 7,132, 20, 72,161,128,
+253,228, 64, 81,225,181,199,175,160,218,156, 98, 24, 70,244, 55,151,208,220, 1,192, 84, 13,188,245, 24,199, 9, 55,187, 3,134,
+193,160,235, 26,172, 87, 45, 28, 89,116,218, 34,146,134,139,192,249,233, 25,186,237, 41,140,109,224, 34, 97, 24, 71, 68,239,161,
+109,195,223,171,102,180, 48, 36,206, 57,101,174, 83, 82, 85, 43, 45,221,184, 70, 52, 85, 86, 93,199,140, 44,245,121,196,158,225,
+ 40, 33,100, 26, 89, 76,246, 43, 41,200, 66,140, 18,171,202,182, 37, 72,180,173,177, 21,222,121,243, 11,185, 16, 77, 62,116,164,
+ 40,220, 20, 84, 69,188,102, 75,171,170,168, 82, 4,121,161, 30, 87, 69, 46, 83, 41,143,147,245,164,166, 8, 29, 3, 16, 34,239,
+122,197, 59,173,229, 60, 85,224,181, 67, 66,184, 18, 17, 84, 8,168,174, 2,204,230, 4,113,187,153, 87, 93,196, 29,173, 54,188,
+218, 56,244, 35, 20, 5, 88,201, 22,112,110,194, 56, 78, 24,198, 17,147,115,178,250, 65,158, 96, 68,137,247,109,186, 21,226,225,
+ 0, 34,133,211,243, 51,108, 78, 54, 88,109,214,140, 26,238, 90, 24, 99,209,182, 44,118, 59,236,109,110, 40,148, 68, 37,115,108,
+185,206, 52,180, 57, 99, 62,192, 77, 35,246,187, 29, 46, 47,175,177, 90,175,208,247, 35,198,113, 64, 63, 12,152, 70, 39,144, 35,
+166,224, 65, 38,189, 9,202, 82, 87, 21,186,166,194,102,189,198,201,170,229,236,133, 16,224,198,129,227,115,199,129, 57, 16, 20,
+179,192,143,164, 24, 74, 88, 88, 99, 28,154,202,194, 87, 22, 77, 85, 33, 24, 30,195, 43, 2,140, 73,238,157, 9,167,186,198,149,
+143,249, 62,202,106,248, 69, 22,121, 10,180, 70,102,136,144,162, 69, 84, 56,149, 43,181,140,155,157,111,235,236, 47, 47,136,113,
+249,223,149, 90,236,201, 25,198, 52,219, 57, 75, 16, 16, 98,129, 98,207,151, 48,191, 31,118, 78, 11, 34,241, 17,210,139,198, 12,
+ 17, 3,100,159,114, 1,208,103, 37,166,202,177,118, 42,169,253,142, 71,243, 5,180, 36,143, 46,138, 20,184,185, 40, 40,131, 67,
+196, 9, 45,100,180,202, 90,188,253,198, 91,184,186,248, 12, 31,127,244, 33,140, 40,105, 73, 3,103,231,119,121,124,171, 42, 68,
+ 25, 73, 37,207,236,212,247,216,239,123,192, 59, 84,181, 97, 21,115,219, 96,124,242, 12,154, 8,215, 23,151,156, 56, 69,132,113,
+ 26,113, 56, 12,120,227,203, 95,195,251,255,241,175,209,110, 58,252,228,123,127,137,224, 3, 84,244,248,206,191,249, 87,232, 71,
+135, 70, 1, 79,127,254, 19, 76,217,126, 67,217,130, 97,180, 46,188,242,133,119, 31,133, 66, 63,111, 54,116, 57, 92, 92, 84,124,
+217,223, 95,100, 42,167,175,165,147,200,102,161,160, 59, 18, 35, 82,118, 55, 30,221,178, 42,139,114,248, 53,227, 88, 86,149,226,
+ 89, 41,230,103,129, 10,175,255, 66, 43, 71,106,129,187, 93, 86, 35,106,193, 80,200, 29,187, 42,120, 28,145, 80,184, 31,231,241,
+123,177, 81,201,147, 12,197,233, 76,143, 31,189,137, 31,190,251, 46,126,251, 55,223, 2, 41, 3,133,128,127,250, 79,254, 49,172,
+ 53,120,118,113,133,191,253,238,187, 24,243,120,158,217,222,253, 48,226,163,113,128,254,252, 25,186,238,115,156,109,183,120,252,
+240, 62,206,183, 27,244,211,132,113,162, 89, 20,154, 3, 29,180, 40,159, 83,184, 10,255,211,212, 53,250, 97, 90,196,213, 54, 85,
+197, 88, 90,136,126, 68, 78,245, 72, 0,121, 22,172, 57, 31, 5, 93, 59, 79,152,102,145, 85,145,228,135, 66,141, 42, 83,166,210,
+181,176, 89,175,160,141,206,185,204, 57,145,175,240, 43, 51,191,155, 99, 85, 33,202,120,171, 20,243, 20,172, 6,213,149, 96,151,
+ 21,140,173, 96,109,133,195, 48,224, 48, 12,112,126, 20,187, 25,240,236,249,115, 84,187, 61,170,182,131,246, 1,154, 20,218,154,
+187,186, 78, 85,104,235, 10,206,249, 98, 23, 42,175, 89,100, 59,209,230,244, 12,171,205, 41, 11,230, 34, 97,114, 19,198,113, 64,
+165,249,117, 13,110,196, 68, 97, 86,242,104, 43, 9,110, 60, 30,143,133, 85, 43, 66,101,127,116, 12, 78,172, 85,188,147, 13,206,
+193,231,139, 62,100, 34, 89,250,135,228,247,185,131,231,213, 70, 20,125,144,150,209,187, 54, 6, 15,238,157, 23,231, 89,178,216,
+ 69,113, 80, 24,105, 82,230, 2, 56,231,161,231,245,122,217,141,151,241, 14,185, 58, 19,170, 89,128, 14, 30,202,123, 25,149, 71,
+232,151,168,104, 18,203, 62,143,128, 67,128,186, 37, 40,239,129,243,179,124, 94,135,192,108, 4,219, 52,232,157,231, 51,206,176,
+178,221,123,158,140, 76,211, 4, 55,121,132,192,211,162, 20,151,202, 96, 32,254, 25, 55,167,167,208, 74, 97,123,122,130,237,201,
+ 9, 86,171, 21, 54,155, 13, 86,171, 21,250,126, 96,145, 97, 8,176,182,202,180,201,132, 65,213, 74, 38, 47, 2, 91, 73, 46, 85,
+138, 81,198,239, 59, 60,127,126,137, 97, 28,209,247, 61,134, 97,196, 48,140, 12, 1,146,213, 64,140,133, 26, 95,176,203, 77,101,
+177,110, 42,196, 97,128,118, 39,104, 42, 37, 95,211,195, 77, 78,236,146, 12,162, 82,130, 39, 14,110, 2,165,137,152,124,134,156,
+183,104, 67, 5, 10,132,170,226, 49,188, 82,128, 9,252, 57, 10, 4,172,187, 10, 23,113,153,200, 86,242, 2,230,148,203, 34,177,
+146,202, 51,182,216,175,171, 57, 18,155,138,108,122,202, 96, 17,202, 89, 42,139, 40,222,244,153,143,133,166,166,152, 24,196, 66,
+188,151, 98,101, 73, 46,254, 84, 84, 81, 36,216, 57, 84,132,150,105, 93,115, 96,112,129,195,211,197, 37, 81, 8, 3, 10,190,119,
+177, 49, 18,182,183,140, 23, 82,120,188, 8,221, 40,123,178,165,123,207, 49,112,243,100, 32,117,142, 68,192,221, 59,119, 16, 39,
+143,159,254,221,119, 48,122,143,155,203,231, 8, 49,160,170, 44,130, 15,120,254,217,167,208,202, 96,117,114,202, 32,144,105, 68,
+213,112, 26, 16, 85, 22,253, 52,130,166, 9,111, 63,120,128,195,161,135, 85, 10,191,243,207,255, 43,252,205,255,245, 63, 98,191,
+239,197,195, 74, 64,240,248,167,255,229,191,196,207,222,253, 30,154,174,193,201,249, 25,126,249,233, 83,108,181, 2,188,131, 61,
+233,112,241,236, 10,107,165, 96, 12, 97,119,112,104,172,129,138, 1, 46, 40,212,162,234,117,206, 9,128, 38,197,166,242, 56, 72,
+139,173, 97, 12,243, 8,133, 57, 58, 58,155, 99,150,138, 17,202,157,245,140,155, 76, 25,220,180, 80,141, 19,212, 18,111,152,186,
+234,133, 55,130, 22, 59, 19,138,243, 5, 14, 9,236,209, 58, 37,185,169, 69,215, 72, 71,204,219,210,162, 94, 42,248, 23, 25,232,
+121,208,194,187,117, 30,215, 29,173, 29, 82, 8, 79, 14, 76, 80, 89, 16,169,229,226,242,246, 12,255,254,255,251,215,120,231,237,
+183,240,193,147, 29,238,108, 43,108, 55, 77, 78, 72, 59, 61,221,226,143,254,211,223, 3, 0,252,236, 23, 31,224,131, 15,127,133,
+113,216, 99, 28,216, 95, 27,137,176,219,239,112, 56,236,241,236,249, 5, 30,223,191,139,245,246, 12,171,166, 69, 32,177,232,128,
+ 16,157, 67,211,174, 48, 14,123,137,128, 4, 72, 25, 70,200, 2,168, 43,195,169,105,222,229, 66, 39,196, 0,239,216,159, 30, 69,
+116,148,236, 48, 65,194, 67, 48, 75, 92,178,194,184,100, 51,168,100, 23,149, 29, 45, 45, 21, 19,176, 90,163, 22,182,123, 89, 80,
+ 71,163,231, 41,142, 98,246, 55, 11, 22, 53,119,130,162,243,168,234, 70, 82, 19, 21,148,118,236,155,143, 10,119,238, 24,220, 30,
+246,120,246,252, 41,246,251, 3, 14,135, 61, 7,218,104,141,253,110, 7,123,115,139,149,173, 64,154,208, 52, 13,234,186,130, 53,
+ 58,199, 91, 50, 90,213,114, 10, 98,219,162, 91,175,177, 61, 59,199,230,228, 14,172,172,161,134,105,192,112,216, 35,120, 15, 83,
+ 91, 76, 46,194, 71, 7,160,103,165,181,214,208,198,178,149, 77, 27, 4, 63,101,189, 78, 74,120, 99,216, 73, 16, 8,138, 8,166,
+ 10, 24, 74,140, 1, 44,145, 12,121,197,176,240, 82,139, 67, 33, 89, 61, 33,222,116, 91,213,232,218,118,134,217,164,221,185,216,
+178,120, 28, 95, 82,222,162, 8, 94, 85,206, 52,207, 23,125,201,238, 76, 53,119, 68, 22, 51,105,226, 75,153,252, 4,229,125,134,
+165,144,116,186,148,131,176,228,236,148,206, 51, 33,113, 83, 7, 79,109, 3,212,141,184,107, 52,214,155, 53,170,231, 21,162,210,
+ 24,199, 9, 94,115,183, 20,188,199, 52, 58,140, 19,139, 4, 39,231, 49, 77, 35,175,171, 10, 81, 97,240, 30,221,122,131,166,105,
+112,114,122,130,245,102,131,205,102,131,110,181, 66, 85,213,184,186,186,193,225,112,128,159, 38,166, 23,106,157,181, 63, 57,156,
+ 36,113,203,213, 50, 72, 42, 70,130, 27, 29,158, 61,253, 12, 39,231,103,184,185,185,193, 56,242,212,192, 57,135, 16,253,226, 18,
+ 77,103, 36, 8,152, 6, 2,185, 26, 58,122,232, 24,176, 89,183, 72, 88,191, 52,145, 11,222,203,138, 81, 38, 85, 82, 8, 82, 97,
+ 81,179,198,194, 55, 53,124, 19,208,120,139,202, 88, 88, 99,196,161,165, 96,106,192,218, 9,154, 52,227,141,105,110,208, 72,209,
+ 60, 42,213,148, 81,198,243,142, 29, 57,222, 58, 19, 89,211,214, 56, 79,167,139, 11,189,184,240, 75,213,113,246, 13,197, 25,194,
+180,220,112, 82, 49,161,161, 34,179, 67,101,251, 48, 73, 49,104, 75, 74, 78,201, 6, 95, 72,157,148, 90, 80, 14,103, 27, 14,229,
+131, 71, 23,182,173,153,212, 69, 69, 30,123, 38,160, 20,121,225,133,102,142,150,138,171, 25,127,162,112,231,206, 61,140,135, 3,
+158,125,242, 33,194,184,135,170, 90,104, 77, 60,210,235,123, 24,163,224, 2,161,173, 53,110, 46, 62, 23, 31,240,132,187,247, 31,
+ 97,127,117,129,182,171,241,246,215,190,142, 16, 2,206,238, 63,196,212, 31,128,195, 45, 92,127, 9, 43,162,172, 90, 17, 6,205,
+ 35,182,191,250,191,255, 21,226,180,195,189, 7, 15,177, 31, 14,232, 15, 3,182,198,160, 50, 10,207,119,123, 12,227,132,187, 93,
+ 3,163, 57,187,122, 63,121,180, 90, 99,239, 28, 98,220,225, 39, 63,250, 1,126,248,131,119,209,117, 43,124,245, 75,111,227,206,
+186,195,186,173,113,178, 89,161, 91,117,176,166, 66,244, 30,251,126,196,165,167, 12, 47, 64, 44, 37,135, 5, 36, 38,249, 57, 75,
+ 42,157, 8, 42, 23, 87,120, 60, 82,254,151, 22,137, 66,135,203, 95, 39, 37, 68,241,193,169,245, 28,246, 18,101, 50,144, 8,134,
+ 41, 53, 73, 45,214, 6,101, 26,145, 96, 14, 75,160,196, 98, 7, 63,139, 56, 18,106,115, 65,112,200,140,121, 14,243,201,207, 90,
+ 76,176,145,136,254,234, 9,246,183, 87,120,239,246, 26,143, 31,221,195,102,181, 94,168, 66,243,244,136,128,119,222,122, 3, 95,
+122,231, 45,236,118, 59,124,247,251, 63,194,238,246, 26, 99,127,128,247, 14, 33, 6, 12,211,132, 95,124,252, 9, 86,221,115,188,
+246,224, 46,200,116, 48,166,202, 14,129,224, 6, 17,155,113,140,167,214, 90,196, 68,200,185,215,198, 48,134, 52, 18,239, 94,107,
+213, 96,156, 70, 56,231, 57, 90,149,192, 41, 96,154,196, 86, 20, 22, 44,223,184,196, 1,204, 23, 66,138, 92, 4, 45,216,207,149,
+ 53,236,183,149, 73, 66,218, 27, 35, 6, 68, 5,196,168,178,119, 55, 36,107,146,173,160,172, 21,251, 30,161,174,171,156,214,103,
+155, 53,234,230, 4,187,253, 14,187,225, 6,167, 39,103,176,198,160,174, 44,250,234,128,195,225, 0, 34, 66,191,223,227,209,201,
+ 6,126, 23,128,166, 69,109, 45,154,218,114,194,150, 92,200,182,146,221,103,219,161,237, 86,104, 79,206, 80, 53, 29,180, 49,240,
+ 62, 96,232,123, 12,125,207, 7,162,119, 80,193, 1, 97,196,228, 88, 36,213,212, 53,136, 2,218,182,227,253,187,169,100,244, 62,
+ 7,195, 68,225,181, 71, 41,192,162, 92, 70, 41,149, 45,209, 55, 35, 65, 46,250, 48,115,202,165, 16,200,133,143, 36,144, 25, 99,
+ 80, 85, 53,190,252,206,235,185, 35,182,150,247,232, 94,198,193, 74,165, 36, 49,149,115,174, 19,155,127,214,138,146, 76, 94, 72,
+ 46,120,190,242,210, 24, 63,166, 48,145,200,235, 24,229, 29,162,155,102, 79,156, 54,162,122, 22,235,105,138, 67,205,197, 11,123,
+171,161, 20, 84, 8,192,211, 39,160, 71,143, 65,198,192, 90,254,220,221,187,127, 15, 31,127,252, 41,174, 47,175, 48,129,129, 44,
+105,175,238, 3,219, 54,157,155, 68,127, 66,179,123, 84,244, 32,206, 57, 52,109,139,147,211, 83,180, 93,135,213,122,133,213,170,
+131,214, 12, 84,234, 15, 28,136, 85, 53, 53,235, 11, 82,158,189,154,101, 90,153, 23, 41, 19, 17, 72,206,187,155, 70, 28,246, 10,
+117, 83,225,226,226, 2, 10,188,246, 8,126,202,107,132,152,240,192, 90,243, 84, 66, 65,252,229,252, 66,187,224, 49,140, 19,172,
+102,214,133,151,231,193, 77,147, 92,236,113, 46,130,100,213, 64,210,189, 27, 99, 48,140, 53,186,182,193,186,109,209, 86, 21, 42,
+153,190,104, 91,193, 40, 3, 61,177, 99,100,138,179,250,112,167, 29,235, 0, 0, 32, 0, 73, 68, 65, 84, 61,255,100, 20,217,193,
+ 19,197,190, 38,151,117, 44,180, 94,145,138, 0, 43, 61, 35,185, 35,100,215, 95,104,105,230, 27,185,152,220,203, 58, 50,129,190,
+146,160,110,182,198, 45,139,198,116,142,230,245, 56,197, 92, 16,218,236, 5,132,202, 1, 1,234, 24, 27, 43, 31, 6,149, 78,227,
+108, 89,154, 49,177, 40,236, 12, 74,128, 43, 9, 46,129, 72, 34,240, 50, 57,159, 91,145, 98, 91, 79, 18, 2, 40, 20, 21,202, 28,
+154, 0,165,113,239,236, 28,239,190,255, 30,130,119,184,217,247,136,113,199, 95, 23,196, 57,215, 20,208,173, 59,220,238,123, 33,
+ 41, 25, 68,239,240,236,233, 39, 88,173, 90,108,182, 27,238, 18,172,194,238,217,167,168,186, 22,102,213,225,163,143,254, 14,223,
+187,184,193, 63,122,229, 46, 70, 31, 56,252, 65, 27,172, 90,128, 78, 31,192,108,182,184,125,126,129, 78,107, 88,173,224,180,194,
+ 71,159, 93,226,142,181,168,107,139,131, 4, 26,120, 34,222,113, 70, 96,160,136,199,103, 91,156,174, 87, 80, 32,248,221, 37,168,
+209,168,170, 22,117,211,160,105, 90,216,202, 34,122, 3,101, 13,212,190,199,213,224, 65,198,130,180, 46,248,195,200,124,100, 42,
+130, 1, 80,188, 70,170, 36,245, 21,225, 17, 47,104,111,139, 8,192, 57, 66,119,238,165, 21,104,182,232,164, 98, 77,171,229,181,
+ 92,204,206, 85, 1,179,161, 98,233, 63, 83,231,212,146, 99, 67, 69,181, 43,249,218, 90, 99, 81,104,100, 71, 64, 73,162, 43,108,
+137, 93, 99,240,219,191,245,101, 24,163,185,243,165, 37,247,155,150, 94, 59,132, 16,177,234, 90,252, 39,191,251, 77, 64, 1,127,
+247,238,143,241,217,103,159,193,141, 61,119, 43,222,227, 48, 76,248,201,135,159,226,108,205,225, 40,166,238,160,155, 22,211, 36,
+212, 45, 21,178, 79, 56,229, 62, 39, 72, 70, 16,240,204,228,184,122, 79,121,232, 74, 27, 78, 57,243, 5,168, 40, 19,159,104,145,
+114,140, 36,100, 4, 10, 16, 13, 31,112, 25, 31, 41, 5,117, 87, 87, 34,138, 42, 5, 60, 17,177, 72,128,138,242, 44, 90,107,249,
+121, 18,225, 80,202,238, 38,104, 84,182,130, 82,150, 93, 0,228,161, 13,176,106, 91, 0, 3,160, 54,168,141, 70,107, 13,218,186,
+194,161,169, 81, 89,131,247, 47,174,113,182,221,162,109, 27,180,117,133,182,107, 81, 25,158, 26, 88,163, 81, 53, 77,246,121, 87,
+221, 6,166,106, 0, 83,113, 18,154, 27, 48,244, 7, 12,195, 97,246, 20, 7,190,100,167,105, 68,116, 19, 83,240,100,138,177, 90,
+175, 97,171,138,131,105,148,129, 54, 21,251,162,165,128, 74,177,170, 49,178,104, 40,196, 56, 23,119, 50,166,119, 73,237, 61, 57,
+ 76,222,195, 5, 22,203, 69,105,182, 32,123, 95, 91,113,224,205,253,123,231,139,174, 60,237,225, 43, 97, 36, 36, 69,114,202,131,
+228,207,136,150, 76, 6, 90,224,172,243,249,166,226,162,251,103,165,183, 7,220, 52,219,175, 34,207,238, 51,128, 38,145, 61, 41,
+ 10, 68,133,178,239,124,230,143, 43, 96,242, 48,207, 47, 96, 31, 60,204, 9,150, 77, 83,227,213,215, 30,227,201,147,167, 8,147,
+227,189, 61,133, 60,114,247,206, 45, 47,244,226,136,167, 24,225,198, 30,113,189,198,237,237, 1, 15, 30, 62,224,115,202, 90,132,
+192,226, 65,182,119, 90,184, 97,156,167,171, 49, 34,106,128,162,112, 72,180,140,143,149, 20,196, 5, 12,104, 28, 14,184,248,220,
+115, 94, 98, 12,252,172, 58, 55, 23,185, 57,196, 71,132,118, 98,131,157, 38,194,104,148,232, 14, 8,168,108, 94, 27,184,105,196,
+152, 60,247,162,228,143,178,159,247,206,203, 94,156, 59,255,202, 78, 24, 38, 14,157, 89, 55, 44,190,179,182,130,129,129,181, 17,
+202, 7, 68, 29,230,221,119,230,110,164, 44, 18,238,188,117,230,183,199,133,248, 87,189, 16, 43,158, 26,219,152,227,204, 83,120,
+ 90, 86,185,235,227, 22,110,153,242,171,142, 46,116, 42,125, 82,170,240, 24, 23,150, 59, 66,202, 83,199,188, 31, 93,140,224, 23,
+ 41, 33,122,222, 49,164,111, 22,115, 71, 78, 11, 8,154,202, 12,114, 85,164, 26,233, 28,175, 71,243, 24,159,230,108,224, 88,244,
+145,105,243,251,230,235,111,226,227,143, 62,196, 52,236, 81,215, 22,171,174,134,243, 30, 90,105,236,251, 30, 86,107,206, 49,119,
+ 19,172, 6,250, 72,240, 3,255,187,177, 26, 85,197, 0,130,224, 39,104, 16,124,244, 56,220,176,197,237,238,157,187,248,239,255,
+219,255, 26,218, 88,236,111,111,240,217,211,207,112,245,252, 57,198,221, 13, 98,187,193, 7,239,253, 4, 83, 63, 96,211, 84, 56,
+ 57,223,226,175,126,249, 4, 39, 80,104,106, 5, 99, 52, 62,185,222,225,224, 61, 86, 90, 99, 55, 49, 98,118,242, 17, 99,191,199,
+197, 56,160,169, 42,172,238,157,163,171,173, 84,136, 22, 26, 17,228, 38, 80, 96,117,125, 93, 91,172,125,192,181,115,208,214,160,
+192, 8,228,226, 38,141,162, 73,209, 2, 17,180, 64,198,190, 36, 25, 80, 45,131,157,139, 93,223,210, 65,155,133,141, 80, 71,137,
+125,148,139, 53, 90, 68, 65, 34,115,156,179, 56, 68, 29, 57, 25,142,240,254,249,123,202,154,145,121, 42, 49, 91,244,102, 13, 71,
+254, 78, 75,122,141, 28,238,180,192,212, 98,185, 7, 83, 51,188, 33, 11, 84, 34,225, 31,124,237, 43,208,191,249, 85,188,255,193,
+199,248,197,251,191,196, 56, 28, 48,141, 3, 66,136,184, 62, 12,184,222, 31,240,232,124, 11, 84, 29,116,213,202,216,159, 0, 21,
+242,170, 40,241, 23,162, 15,130, 65, 77,163, 50, 13, 99, 8, 33,200,216, 54,242,238,113,114, 14,129,244,204, 45, 79,226,184,130,
+ 90, 5,149,124,171,200,225, 41,243, 48,140,242, 39,189,173,171,124, 88,240,193,165, 16, 37,198,149, 36,223, 92, 19, 65, 43,203,
+130,176, 4, 44, 73,122, 8,109,128,200, 44,122,173, 52,172,214, 76, 23,235,175, 81, 27, 13,212, 21,172, 86,152, 68, 16, 87, 85,
+ 22,117, 93,163,109, 26,156,108,214, 0, 20,234,202,162,105,152, 86, 87, 89, 3,107, 13,170,170, 66,221,180,168,218, 14,117,179,
+130, 93,109,160, 76,197, 60,240,129,119,177,227,192,227,247,169,239,225,166, 17,126,154,248,146, 13, 78,138,152, 91,129,192, 40,
+ 92,223,238,225, 99,196,232, 2,186,182,131,130,240,242,101, 18, 99,173,129, 49, 22,218,104, 6,253, 24, 3,173,173, 8,238, 88,
+240,231,156, 23,149,181,195, 48, 77,152, 38, 15, 31,168, 96, 48, 8,235,189,174,113,178, 93, 35,132,144,157, 31, 73, 96,167,115,
+ 6, 60,191, 39,186, 60,153, 82, 80,211,145, 90, 57, 9, 96, 51,183,161,136, 2, 37, 17,167, 5,231,178,109, 13, 20, 1,121,159,
+ 72,242,220,115, 74,162,116,231,209, 75,148,106, 72, 33, 46,252,233,173,234, 61,116,223, 67,111,214,121,143,219,118, 45, 54,219,
+ 45,158, 95, 76,152,188, 99, 91,151,116,235, 73, 95, 4, 53,119,120, 51, 51,131,215, 73,251,219, 27,220,116, 29,148,210, 60,213,
+145,213,146,209,204,100, 32,168, 60,245, 72,220,125, 21, 0,173,196,106, 39,156,125,228,240, 23,126,246,156,155,178, 21,180,109,
+ 90,236,246, 59, 80,224, 61, 56,167, 19, 38,211,134, 92,148, 90,195, 40,142,161,245,142, 48, 72, 0,205, 52, 14, 44, 2, 21,248,
+147,115, 44,216,156,166,137,189,235, 33, 46,108,140, 49,136, 19, 65, 3,214, 84, 28, 17,235, 3,122, 31,177,110, 27,116,202, 8,
+ 78, 25, 60, 1,201,136, 88,153, 54,166,169,187, 88,211,146,210,157,146, 32,146,104,233, 66,202,217, 61,105, 12, 95,178, 93,100,
+ 31, 19,231, 84,212,180,114, 64, 1,229, 73, 43,199,168,142,226,179,139,198, 37, 63,171, 52,115, 14,202,230,218, 30, 47,248, 89,
+128,161,151,144,145, 52, 98, 80, 98,142, 87, 10, 42, 38,225,192, 76, 55,211,249,146, 47, 96,174,105,254, 47,190,105,157,201, 2,
+ 42,103,233,166,238,127,129, 74, 21,191,251,205,213, 21,227, 13,125,128, 49, 28, 9,216, 90,238,134, 78, 54,107,244,253, 1,221,
+170,101, 1, 81,136, 88,175, 26,140,195,136,126, 56,160, 49, 22, 55, 55, 55,176,214, 48, 30, 86,108, 28,235,213, 10,239,127,248,
+ 43,252,201,159,254, 41, 78, 54, 27, 24,107,113,239,206, 57,222,124,235,173, 66,156, 16, 65,241, 79,224,166, 9,187,253, 1, 87,
+ 87,151, 88,191,251, 67,252,252, 71,239,161,213,132,104, 13, 14,163,135, 33,134,215,168, 24, 49, 6, 25,255,249, 0,109, 57, 54,
+244,238,217, 41,182,235, 21,106, 94, 18, 33, 58,222,156, 7, 33,145, 77,129, 16,253,132,241,106,135,238,254,189,163, 0,102, 85,
+ 80,251, 18, 52,241, 56, 7, 70, 21,180,190, 37, 29,159,202, 8,200,194, 98, 67,133,185, 92, 45, 24,244, 51, 91, 48, 9,212, 23,
+ 93,112, 25,171,187,236, 81,150, 56, 91,168,133,127,114, 97,182, 47, 41,116,122,105,233, 44, 84,115,179,167,151,212,177,123, 46,
+199, 95,150,207,230, 66, 31,152,173, 38, 75, 12,103,140,132,215, 95,123,140, 55,223,120, 21,239,253,236,125,124,244,209, 71, 24,
+135, 1,211, 52,194,121,135,143,158, 93,161,173,118,216,110,182,168,186, 13,180,177, 92,136,106,202,132, 41, 40, 6,151,104,231,
+160,140, 69, 20,161,157, 11, 1, 33,178, 69,200,143, 60,226,103, 26,227, 28,145, 73,229,150, 92, 97, 17,194, 83,134,238,148,226,
+210,244,222, 84,149,157,127,254, 20, 66,129,136,168, 44, 66,240,176,186,202,123, 96,101, 45, 72,115,200, 76, 66, 78, 34, 89,194,
+188,131, 50, 21,140, 82, 8, 83,143,198, 86,104,107, 3, 87, 71,236,251, 61, 99,117,171, 10,245, 52,161,182, 61,186,218, 98,154,
+ 26, 86,251,107, 3,173, 1, 91, 89, 84,214,242,197, 95, 85,168,154, 14,245,106,133,170,219,194, 54, 45,160, 43,168,105,194, 64,
+ 96, 33,212, 52,160,223,237,112,123,203,137,123,125, 47,161, 59, 50,190, 87,154,113,186,117,101,243,180, 78,107, 11,231, 82,196,
+ 42,227, 75,131, 76, 61, 42,201,226,102,219, 33, 95,232, 81,146,243, 20, 56, 46, 55,101,121,135, 16, 49,137,170, 89, 51, 33, 37,
+103, 51, 88, 91,225, 75,111,191,158,173,108,136,132,128,229, 42,135, 10,242, 97, 46, 50,203,152, 68, 36, 42,163,122,225,179, 16,
+197, 22,151, 46,161,232, 3,200, 57, 40, 63,193, 64,177,219, 38,248, 57, 75, 92,235, 89,121, 17,217,147,205,251, 97,122, 97,197,
+ 16,199, 17,166, 63,160,105, 91, 22,152, 2,104,154, 26,119,239,158,227,246,118, 7, 47,177,196,209, 77,136,137,188,167,144, 49,
+174,243,244, 12, 57,187, 96, 26, 7, 92, 93, 94,226,147, 79,158,224, 43, 95,249, 34, 98, 12, 60,237,112,147,232, 12,248,245,240,
+ 18,111, 75, 49, 34,128, 24,234, 66,233, 49,243,226, 92, 98, 36,112,154, 16,240,154,165, 66,191,187, 6,121,158, 68, 25,165, 48,
+121, 87, 76, 20, 35, 95,176,134,157, 5,158,120,109,225, 53,224,173,198, 52, 42, 68, 97,187, 71,129,238, 76,211,132, 65,138,199,
+144, 94, 43,226,181, 75, 66,121,147, 82, 48,218,163,138,132,137, 20, 28, 12, 84,187, 2,193, 34, 70,133, 70, 22,145,201,115, 79,
+ 89,157,172,243,186, 70, 41,157,149,231,138, 94, 18,137, 93,164,108, 82,142,175, 70,129, 96, 79, 66, 56,245, 66,119,175,142, 0,
+162,148,153, 37, 75,160, 82, 14,122, 73, 52, 57, 97,103, 28, 11,219, 45, 94,104,233,139,152,185, 76,136,155,199,235,121, 76,170,
+102, 22,109,218,195,146, 94, 66,100, 18,234, 81, 65, 67, 39, 1, 75,222,161,170,252, 96,209, 66,248, 59,143, 35,141,225, 81,203,
+231,159,124, 8,182, 41, 6,152,170, 66,211, 53,104,149,198,205,205, 13,154,182,197,208, 31,224,124, 64,211, 52, 44,230, 83, 26,
+219,147, 83, 40, 40,132, 0, 4, 23, 96, 26, 3, 47, 35,181,219,219,107,252,103,255,226, 79,112,114,114,194,161, 28,194, 9,214,
+ 64,222,103,242,142, 59,128,218, 22,219,245, 26, 15,239,222,193, 23,223,124, 11,211, 63, 27,112,187,219,225,221,159,190,135, 95,
+252, 63,223,130,118, 17,125, 8,176, 74, 97, 12,129, 15,153, 16, 16,181,194,171, 15,238, 97, 91, 87,168, 41,192, 6, 7,141,128,
+ 72, 42,131, 72, 28, 41,140, 49,226, 48, 49, 56, 97,247,252, 10,171,211,211, 23, 18,158,242, 27, 95, 86,117,233,223,213,139,129,
+ 18,234,133, 70,121,225, 94,151,226,235,216,170,246,178,175,160,230,221,185, 92,176,233, 92,196, 34, 8,104, 41,234,202,135,221,
+ 81,196,100, 57, 49, 72,113,150, 37, 34,115,129,165, 85,115,149, 26, 23,137,128,180,160, 79, 45, 52, 5,105,170, 17, 83, 2, 6,
+229,189, 84, 90, 10, 40, 82,160, 16,241,206, 91,111,224,237,183, 94,199,119,254,246,251,184,189,189,193, 97,191, 3,136, 48, 58,
+ 15,119,249, 28,219,105, 68,221,109, 81, 53, 13,180,151,215,187, 82,153,208,165, 52, 11,134,160, 13,162,159,248, 89,141,132,209,
+ 77,208,218,240, 37, 19,227,130,254,164, 68,252,149, 70,115,105, 50, 22, 41,135,123, 46,114,231,103, 48, 19,171,180, 75,143, 68,
+242,193, 39,246,118, 52, 44,244, 3, 44,180, 92, 2, 80, 90,168, 72,233,121,102,127,183, 53,149, 48, 25, 26,206, 46,112, 14, 93,
+211, 34,146,135, 13, 1,193,104, 56, 5,212, 90,193,133, 36, 76, 19, 81,165, 21,124,175,209,220,169,215,141,140,223, 55,168,186,
+ 14,186,106,120,196, 43,107, 1,231, 38,140,135, 61,110,111,111,241,252,226, 18,215,187, 61, 38, 23,178, 16, 72,139,192, 74, 43,
+133, 94, 79, 34,188,210,128,246, 80,189, 92, 16,145, 15,114,163, 89, 93, 61, 74, 87,104,180,198,160,131,116,233, 12,248,201, 99,
+ 92,185,252,242, 51,108, 44,180,177, 34,198,226,220,116,173, 45, 54,235, 85, 46, 82,131,216, 0, 83,151,158, 82, 17, 83,216,145,
+ 22, 79,184, 86, 84,112, 27, 88, 40,151,248,220, 57,255, 32,210, 34,158, 53, 4,198,185, 70,239, 1, 31,184, 25,144, 78,139, 39,
+ 47,108,241, 75, 3, 95, 18,190,122,246,232, 71,228,103, 37, 40, 5,114, 14,149,115, 48,110,130,105, 26,222,223, 67,161,105, 89,
+ 60,106,170, 26, 67,127, 96,171, 24, 5, 89,169,105,152,108,169, 42,132,180,146,101,225,189, 67,127,216,225,131, 95,126,128,166,
+105,240,232,209,125,140,195,128,195,158,167, 90, 90,216,237, 33,107, 68,248,245,137, 17,240,193, 35, 82, 16, 91, 27,219, 45, 99,
+240, 50,242, 7, 98,100,145,158, 10,142, 47, 44,207,211, 44, 77, 97, 17, 35,107,192, 52, 64,210, 10,129, 2, 60, 44,188, 1,220,
+164,129, 24, 68, 40,138,156,197, 48,142, 35, 95,234,211,140, 0, 38,217,229,231, 34, 40, 65,134,104,130, 83, 6, 78,245, 24, 3,
+225,244,252, 20,103,117,195,147, 9,109, 88,189, 95,218,129,213, 28,137,154,220, 2,165,243,171, 52,247, 18,230,233,101, 42,112,
+180, 34, 68,197,252,147, 40, 72,238, 24, 5, 68,147, 63,231, 69,192,110,161, 91,227,233,126, 44,206, 67, 22, 82,231,139, 62, 77,
+ 86,169,196, 19,211,124,169, 43, 85,140, 68,101, 71,163,210,156,230,200, 11,125,156,145, 62, 75,248,233, 40, 76,117,110,151, 72,
+ 81, 33, 24, 41, 21, 66,106, 25,116,112, 20,127,112,186, 61,193,216,239, 49, 12, 61,180, 6,154,174, 67,116, 14,159, 95, 92,226,
+238,221, 59,128, 82,216, 31, 14, 88,181, 29,148,102, 74,150, 2,161,170, 42, 32,114,110,181,209, 10, 85,101, 16, 35,243,189,181,
+ 6,110,250, 9,175,190,250, 26,108, 85,195, 8,153,203, 8,214, 86, 19,242,168, 82, 25,195, 31, 42, 17, 23,197,232, 65,211,136,
+ 85, 83,227, 31,126,245,171,248,210, 27,111,224,135, 63,253, 41,254,231, 63,251, 22, 90,203,251,184,211,117,203, 64,143,205, 10,
+171,202,162, 82, 64, 77,132, 74,108, 26,253,110,135,201, 9, 20, 35, 18,250, 16,177, 31, 38,236, 70,143,195,112,141, 55,207, 78,
+103, 27, 97, 57,108, 47, 82,231, 40,171,167,227,114,208,174,168,136,241,155, 35, 77,179, 42, 11, 75,135,194,162, 85,135, 62,118,
+199,103,160, 79, 2, 47, 44, 44,108,101, 52,228, 75,160,115, 10, 47,102,210, 44, 26,250, 34, 79,249,216,135,175, 22,223,130, 32,
+128, 41,206, 19, 0, 90,162, 84, 81, 80,250, 18,203, 32,230, 81, 69, 92,228,182,147, 90, 70, 92,255,238,239,124, 3,207, 46, 46,
+241,238, 15,127, 12,189, 55, 24,250, 61,188,119,184,222,239,177,246, 14,181,219,162, 93,173,248,194, 21, 38, 2,137,178,186, 28,
+201,123,231,114,142, 56,101,132,178, 80,187,138,142, 59,185, 31, 74, 85,107,194,108,102,154,160,136, 23,185, 81,224,175,149,132,
+ 61,233, 80,141, 70,129,140, 42, 64, 43,129,181, 36, 6, 51,144, 71,196,134,138, 34,148,169,242,251, 21, 61,211,219,234,186,133,
+115, 35,206,239, 62,194, 56, 13,240, 97,100, 30,190, 86,168, 52, 16,234, 42, 35, 72,115,116,173, 2,180,225, 75,221, 84, 21,108,
+ 93,163,110, 91,212, 77,141,170,102, 74,156, 11,132,216, 15,240,126,194,212,239,177,187,189,197,245,213, 53,174,111,247, 24, 28,
+127, 78,115, 65, 73, 49, 31, 88,105, 10,196, 59, 80, 22,156,113,150,183, 47,193,199,220,225, 27,158, 28, 40, 99,230,241,118,228,
+176, 22, 42, 45,152,152,139, 6, 10,129, 19,187,140, 65, 93, 55,120,244,224,142, 28,210,101,164,170,153, 11, 49, 73, 5,139,242,
+158, 69,138,208, 81, 35,106,198,199,166,221, 23,199, 82,207, 25, 25, 73, 23,163,148,158,113,221, 10,152,124,132,159, 88, 40,200,
+ 81,160, 62,115,215,253,228,216,246,168,103,123,108, 26,235, 83,152,247,183,129, 0, 84, 53, 42, 40,184, 16, 81, 75, 48, 9, 17,
+ 49,250, 85, 28, 65,211, 52, 10,107, 33,102, 32,141,146,168,207,100,203,138, 41,171, 60, 21,192,145,224,198, 1, 55, 87,151,248,
+232,195,143,176,221,174,176,219,237,176,219,237, 48,140, 99,222, 35,207,246, 44,110,200,156,115,136, 1, 34, 60,172, 96,196,106,
+231,189, 3, 72,137,107,193, 33,134, 9, 39,155, 13, 84,116,128,209,176,134,209,199,201, 26,169,149, 66,208,115, 81, 31, 2, 23,
+127,209,107,140,122, 2, 69,147, 73,153, 36,152, 89, 39,249, 2,147, 92,234, 65,116, 88,201, 57, 65,146, 28, 7, 5,184,201, 33,
+104,131,168, 52,130,210,152,158, 95, 99,244, 17,231,119,207,113, 94,215,168,203,168, 92, 53, 59,127, 50, 70, 55,217, 85, 21,165,
+214,136, 5,114,106, 30,137, 39,245,122,226, 26,100, 17,101,186,208, 21,101,221, 16, 95,131,122,225, 38, 75, 49,215,101, 64, 86,
+118,163, 21, 66,232,228,190,152, 33,108,115,184,183,157,183,216, 84,224, 95,185, 82,202, 72,144,252, 13,204, 49,167,185,179,143,
+179,159, 14, 69,199,159,148,212,153,246, 86, 88,120,114, 76,157,136,166, 20, 81,177,203, 85, 9,190,135,186,110,112,243,252, 25,
+136, 8,187,195, 8,231, 38, 52, 77, 13,107, 13,174,174,111,176,106, 27, 52, 33, 64, 33,162,174, 13,156, 15, 18,218,193, 49,172,
+150, 8,251,219, 29,154,174,133,166,136,174,235,240,252,234, 6,127,250,199,127,140,186,174, 97,148,112,219, 5,183,169, 37,131,
+ 91,103,229,126,204, 7, 65,156,122,249,112, 33,211,188,140, 86,120,253,149, 71,248,151,127,252, 79,240,191,125,235, 47,228,193,
+228, 55,123, 85, 87, 48, 32, 24,138,168,180, 66, 91, 55, 24,135, 1,171,174, 67,189, 82,216,141, 19,110, 47,175, 48,141, 35,246,
+251, 1,183,253,132,137,184,251,163,128, 34,251,137, 22, 64, 3, 0, 56, 18,189, 23, 19,142,146,193,187,176,141,191,228,234,165,
+133, 0, 78,149,158,120, 69, 5,103,126, 30, 21,107, 85,148, 95,121,106,115, 60, 15, 56,226,206, 28,193,112,143, 47,249, 99,100,
+170, 42,199,239, 25,210, 80, 48, 17,212,146, 48, 88, 90, 42,169, 68, 29, 23, 42,214,244, 36, 83,226,209,163,200,154, 39,194,157,
+ 59,167,248,195,223,255, 71,248,222,247,127,132,139,139,207,177,223,221,192,185, 9,251,193,193,249, 43,132, 24,208,180, 29, 67,
+ 95, 68, 77,171,141,101,232, 80,152, 47, 60,128,237, 51,147,236,122,147,226,122, 78,107, 42,214, 92, 84, 68, 85, 45,180, 1,152,
+131,232,163, 18,178, 30,242, 40, 49,202,228,130, 47,109,131,160, 21,167,196, 25,126,142,163,247,112, 32, 89,163,133, 76, 31, 84,
+228,229,146, 33, 16, 2,110,175,159, 97,181, 57,199,201,233,125,216,166, 65,244, 14,171,118,141,253,176,131, 86, 22, 86, 1, 65,
+107, 17, 75,201, 40,211, 75, 8,136, 36,171, 25,107, 97,235, 22,117,187, 70, 85,183,168,170, 6,202, 90, 76,126, 64, 12, 1,211,
+ 48,160,223,239,112,123,115,131,219,219, 61, 38, 31,152,255, 94, 78,122, 36, 12, 68,107,141,198, 86,168,171,154, 71,196,218, 72,
+169, 89, 35, 70,159,173,130,147,140, 85, 17, 34, 92, 96, 69, 50,200,207,177,205, 80, 57,143, 62,163,145,147,242, 74,166, 0,214,
+214,168,234, 26, 95,122,231,245,124,222, 49,247,127,110, 84, 98, 78, 14, 76, 1,224, 9, 97, 92, 92,236,177,140, 78,149,174, 53,
+144,100,152,235,204, 81, 39, 89,201, 13,110,130, 27, 71,246,170,199, 8, 4, 39,120, 83,238,198,167,196, 85,207, 4,206,188,156,
+207,140,112,104,131,166,181,136,198,178, 72,178,216,179, 5, 31, 16,124,204,158,111,109,140, 56, 37, 34, 76, 42,152, 84, 65,224,
+ 36,148, 52, 12, 6, 18, 33,224,176,223,225,234,249,115,252,252,189, 95,160,174, 13,110,174,175,113,216,237,120,157, 19, 41,231,
+115,132,192, 44, 16,133,200,142, 15,112,193, 7, 47, 33, 50,162,106,247,110,148, 75, 93,195, 7,254, 94,180, 16,249,234,202,230,
+ 41,131,181,134,245, 19,169, 24,150,247,198, 5, 15,140,201,190, 73,121,167,159, 98, 81, 39,201,138,247, 46, 89,245, 56,209, 47,
+138,130, 92,169, 20, 19, 30, 1,231, 56, 12, 72, 27,144, 50,184,188,217,193, 19,224, 3,225,222,189, 59,140,253, 78,247,149, 82,
+ 5,247,189, 56,221, 82,120, 79, 33, 82,158,133,221, 52,127,172,179, 17, 60, 1,216, 40, 79,189,245, 18, 96, 50,247,103,180,212,
+167, 81, 97, 5, 79, 7,165,154,149,118,243,255,175,248,159,205, 0,139,148,204,166, 41,219,203,230, 48,120, 53, 7,182,148,125,
+ 32, 41, 40, 29, 23, 54, 27,238,236,116,222, 19,106,121, 97,210,225, 82,122,169, 51,172, 95,166, 3, 75,213,183, 66, 63,140, 0,
+ 52, 86, 93, 7, 66,196, 56, 12,188, 95, 51, 6,209,123,244, 0,239,215, 82, 2,146,120,105,251,254, 32,150,136, 10,155,205,138,
+109, 25,206, 97,114, 30,159, 95, 94,226,254,221,251,104,170, 78, 82,174, 68,213,175,117, 14,109,200, 57,203, 90,243,223, 53,141,
+128,177,240, 61, 91,157,198,113, 20,133, 39,171,113,219,182,197,215, 31,158,227, 63,126,114, 1, 66,196,166,173,185,146,148,228,
+ 36, 10, 17, 6,132, 74,222,195,186,235, 64,198,192,133,128,207,158,121,196,201, 99,232, 7,196,122,133,163,129,245,146, 47, 71,
+115, 48,203, 12, 47, 80,121, 79, 72, 71,249,168, 5,187,101,177,123, 81,185, 51, 95, 50,127,231, 24,214, 34, 52, 71,169,163, 14,
+127,182,241,228, 57,252,209, 13, 94,134,204,189, 76, 52,135,151,176,237,211,197,246,194, 54,128, 80, 84,201, 84, 4,225,208, 17,
+ 97,151,178,139, 99,161,136, 47,240, 7, 58, 65, 30, 22,105,132,115, 56,199, 63,252,173,223,192,167, 79,238,226, 71, 63,254, 41,
+ 14,251, 27,140,227,128,201, 71,132,219,107,120, 55, 97,189,222,200, 37, 68, 34,124,114,104,219, 53,134,225, 0,163, 52, 38, 63,
+ 29,189, 23, 51,227,185, 4, 0,137, 59,169,136,182, 61, 10,129,160, 36,112,155, 63,236, 49, 43,132, 69,157, 45,225, 24,209, 24,
+ 22,204, 69, 78, 34, 35,163, 97,149,130, 82, 33,103, 58,104,109,216, 35, 35,227, 82, 35,107,131, 16, 28, 90,187, 69,148,189,183,
+155, 14, 48, 10,188,147, 55, 6, 38,176,149,199, 77, 19, 95,170,146, 62,151,108,175,218, 24, 84,117, 45,130,185,154, 93, 29,138,
+247,168,227,176, 71,191,191,197,205,213, 21,174,175,111, 49, 76, 62,147, 14,141, 82, 80, 70, 21,197, 49, 95, 22, 62, 56,180, 86,
+163,210, 53, 72, 17,118,211, 36, 68, 62,134,137, 24,173, 80, 91, 30,147, 50, 36, 71,240,189,194,231, 86, 90,208,212,242,250, 37,
+186,153,150,113, 48, 71, 34, 27, 52, 77,131,205,122, 45, 73,138,179,205,114, 65, 88,160,101,144, 20,164, 27, 87, 9, 95, 29, 53,
+103, 20,164, 56,228,168, 36, 92,134,132, 91,174,114, 65,157,194, 85,134,126,196,225,208,195, 16,193,128,131, 72,162,155, 56,255,
+ 60,134, 44,254, 10,145, 16,228,130, 76,107, 19,200, 88,187,238, 26,232,166,129,170,106, 40, 91, 1, 90,207, 99,244, 20,121,234,
+ 60,166,105,200,211,130,164, 47,224,207,129,158, 87, 81, 69,147, 86,178,206, 99, 28,112,115,125, 9,107, 13, 86, 93,141,195,238,
+ 22,214, 24, 76,142, 69,123, 9,122,226, 61, 63, 23, 28,104, 21, 97,172,102,165, 61,121,113,111, 0,110, 26,178, 37, 49,198,136,
+221,126,135,237,170,133, 38,105,166, 4,102, 19, 5,235,218, 72,144,146, 22, 20,114, 8, 60, 41, 34,173,224,195, 12,159, 9, 9,
+ 52, 20, 11,123, 91,226,180,167, 21, 74, 42,158, 85, 58, 27, 52,188,247,208, 38, 64, 25,199, 57, 15, 74, 97,183,223,231, 21,192,
+221,187,231,104,219,118,249,217, 45, 14,190,197, 25, 72,201,139, 94,196, 83,211,236, 76, 74,147,198,168,136,179, 63,178, 78,105,
+182, 72,242,136,254,197, 53,169, 78, 25,236,105,143,175,230,117, 78, 18,150,243,217, 32,156,251,226, 36,183, 10, 52, 79, 94, 73,
+ 45,246,153,186, 20, 97,149, 11,222,153, 85, 95,116,145, 84,196,134, 46,139, 24,100,223,189,140, 92,165,178, 69,212, 89,156,135,
+ 18, 64, 35,255,107,234, 26, 79,251, 3,180, 6, 58,107, 48,129,208,247, 3, 78,183,107,198, 93,198,136,195, 52,202,200,140, 64,
+202, 32,236,111, 17, 66,192,174,239,209, 8, 55,152,192, 15,201,228, 38,124,241,139, 95,134,115, 35,118,251,107, 84,214,178, 21,
+ 39, 83,238, 12,127,192, 5,205, 23,101,103, 25,228, 20, 78,161, 30, 36, 62, 86, 63, 77, 25,194,177, 94,175, 81,171,231, 32, 73,
+ 81, 26,199, 17,187, 67,143, 90, 27,212,134, 57,198,155,182,193, 56, 57,168, 16,209, 53, 45,250,113, 68,165, 19,138, 20,115,236,
+223,203, 82,232, 22, 23,187,154,211,127,202, 29,208, 11,227,115,181, 16,184, 81, 22, 47,204, 74, 94, 42,160, 65, 89, 81, 46, 29,
+252,156,186, 68,139,162, 65, 21,251,235,244,190,229, 0,146, 44,148,155,181, 38, 73,112,148,127, 45,133, 98,139,116, 38, 58, 18,
+195,169, 34,156,134,230,224,151, 50,230,135,168,184, 65,243,248,128, 71,225,130,156, 85,148,126, 71, 23,177,154,179, 72, 79, 73,
+240, 13, 69,194,195,135,247,112,126,118,138,191,248,203,191,129, 54, 22,253, 97,135, 16, 3,250,126, 15,138, 1,221,230, 84,118,
+171, 17,198,218,172,236, 13, 2,122,201,135,186, 8,217,230,240,133,114, 34, 85, 12,218, 99, 25,200,163,139,226, 69,205, 23, 63,
+ 20,119, 97, 98,181,138, 90, 33,134,200,163, 68,112,183,162,211, 69, 73, 51,172,133,146,136, 43,122,232, 40, 2, 63,197,254,117,
+238,156, 28,118,215,159,195,185, 17, 33,114,142,121, 37, 36, 58,168, 36,238,114,208,109,155,233,108,229, 56,210,212, 13, 42,107,
+ 80, 55, 29,108, 85, 65,155,138,245, 45,211,128,177, 63, 96,119,117,137,235,203, 75,244,253,144, 9, 88,181,104, 88,210,227,230,
+ 67,192, 73, 83,227,206,118, 3, 85,213, 48,117, 13, 40,131,139,155, 91,196, 67, 15,138, 81,132,111,252, 60,156,214, 6,103,173,
+197,147, 62, 48, 15, 28,132, 16, 21,162, 48,215,117,178, 92, 38,231,180,116,233, 68,220, 61, 87, 85,141,186,110,241,205,111,124,
+ 85, 70,229, 49, 39,193, 49,153,152,145,181,208, 71,218,142, 4,202, 74,157, 57,210,197, 62,243, 30,210,222, 61,179, 74,210,186,
+ 67,246,252, 62, 4,220,236, 14,208, 20,152,127, 31, 2,130, 27,224,199, 73, 86, 28, 4, 31, 3,156,231,226, 77, 85, 53,170,170,
+134,138, 1,182,174,208,182, 29,170,205, 6,118,181,134,169,107,152,202, 10,168, 37,105,152,248,219, 54, 2, 40, 10,222, 99,206,
+242, 42, 88, 18,105, 18,185, 16,154, 74, 42, 25, 69, 80, 32, 12,253, 30,183, 55, 53,134,131,193,238,246, 26, 48, 21, 39,236, 57,
+ 70, 33, 83,240,153, 73, 78,198, 0,218,130,160, 48, 77, 19,175, 51,161, 57,213,208, 77,124,161,203, 69,231,166, 9, 83, 93,115,
+142, 79, 8,168,234, 26,186,105,224,157, 80, 16, 65, 8,251, 61,108, 85,243,159,141, 74, 58,115,169,157, 34, 79, 35,242,132, 44,
+219, 27, 69, 99, 34, 55,103,244,178, 62, 77, 52, 63,205,182,187, 64, 17, 62, 56,104,207, 46,144,116, 81,246,253,128,231,151,215,
+ 80,218,224,206,185, 66, 93, 87,115,188,117, 17,124,206, 29,188,206,107,182, 52, 89,206,207, 68,185,221, 46,220, 96,156,192, 41,
+141,175,172,219,160, 34, 34, 56,231, 32, 43,220,101, 66,199,193,103, 52, 83, 40,115,195,149,180, 56,170,104,188, 0, 45, 21,115,
+ 36, 73,105,163,148, 5,139,162, 3, 12, 49, 43, 62,203,165,186,122, 33,204, 99,198, 5,166,192,151,212, 25, 82,150,242,171, 66,
+ 93, 31,231,240, 10,169,126,147, 0,131,226,194,243,196, 41, 80, 33, 48, 33,142, 8,149,181, 88,119, 13,220,228,228,197,212,216,
+239, 15,232,218, 26,164, 52, 14,253,158,119,109, 74,193, 77,204, 65, 30,135,136,186,110, 81, 91,141,235,219, 61,222,126,231, 43,
+232,251, 30, 90, 1,161,170,152,186, 84,215,204,181,214, 10, 70, 25, 25,193, 27, 24, 93,193, 42,141,145,246,136,129,171, 96, 82,
+ 10, 1,242,112, 58, 38, 90,177, 26,148,240,198,186,198,165,116,239, 14,192,245,237, 30, 20,152,115,101,181,134,193, 9,218,166,
+193, 56, 28, 48, 70,133,174, 93,193, 90,139,105, 28,208,214, 53,130,173,242,238,248, 69, 25, 88, 41, 90,123, 73, 2,148, 18, 12,
+ 45,209, 81,183, 79, 47, 10, 52, 11, 97, 91,105, 65,164,210, 82,166,139,209,183, 56, 19,248,128,140,115, 92,107,169,237, 32, 42,
+144,167,177,176,202,169, 35,139, 36, 95, 88,188,159, 45, 46,227,151, 16,240, 21, 21,163, 44, 73, 75, 75,110,139,133, 88,112,129,
+103, 46, 71,244, 10,170,240,253, 83,218,125,190, 56, 44, 40,138, 41, 66, 85, 89,252,225, 31,252, 99,252,245,119,190,139, 16, 60,
+198,225,128, 16, 3, 14,195, 1, 49,122, 52,221, 86,178,184, 45,172, 37, 68, 55,177,136, 76,105,193, 66, 70,225, 40, 8, 99,188,
+228, 51, 39,210,216,188,241,205,255, 79,202,194, 24,153,116, 73,135, 70, 10,172,100,150,221,185, 87,204,103, 8, 1, 8, 80,208,
+ 42,192, 68,133, 32, 29, 74, 12, 17,128, 3,172,112,235, 53, 79,162,148,248,138,199,126,207,170,236,168,161,224,217, 57, 98,106,
+ 88,219,160,106, 86,240,126,224,131,207,104, 68,211,206, 59,102,165, 16,157, 19, 39, 64,224, 75,178, 93,193, 88, 35,163,255, 9,
+126, 26, 49, 30,246, 56,220,222,224,250,234, 10,187,253, 1, 62, 68,241,180,243,206, 53,215,114, 33,226, 27,111,124, 1, 94, 3,
+104, 90,232,186,133,173,107, 80, 36,236,199,137, 85,234, 10, 88, 89,141,222, 19,238,117, 21,222, 58, 95, 67, 41,141,107, 63, 98,
+240,162,140, 87, 92, 72,199,114,151,147,197,136,210, 33, 25, 22, 27,118,221, 26,143, 31, 63, 96,106,162,120,191,181,209, 25, 0,
+ 68, 73,171,146,169,113,146, 52,153,124,199, 18,156,195,161, 58, 60,138,231,195,185, 68, 4,179,167, 58,102,176, 10,101,202,160,
+243, 1, 49,120, 12, 49, 64, 83, 96,204,237, 56,228,238, 51, 68, 86,249, 7, 2,180, 15,248,255,233,122,147,159, 75,211,244,204,
+235,122,134,119, 58,211,247,125, 17,145, 89, 89,153,206,161,178, 50, 43,171,168,178,221,133,113,155,150,105,172,182,144, 89, 55,
+ 98,193,158, 37, 18, 82,175, 88, 52, 11, 47, 80,139, 5, 43,224, 47, 64, 72,172, 88,128,196, 6, 36,212,136, 70,173,166, 69,117,
+ 75, 46, 87,217, 93,131,115,136,200,200, 24,190,225, 12,239,121,135,103, 98,113,223,207,240,158, 72, 91, 46, 85,102,101, 68,228,
+249,206, 57,239,243,220,195,117,253,174, 78,215, 64,144,184, 89,111,176,190,190, 70,183, 89,163,106, 91, 52,171, 14, 85, 93, 23,
+138,121,206,156, 16,228, 89, 31,199, 10,103,215, 39,173, 64, 72,176, 24,193,112, 27,113,193,180,224,139,221, 57,142,171,117,192,
+225, 1,215, 55, 55, 28,134, 70, 98, 52,239, 44,167, 30,114,126,186, 82,208,154, 94,135,225,252,244,224, 3,172,153, 16,188, 77,
+197, 74, 92,201, 26,235, 48, 12, 3,208, 16,109, 83, 25, 3, 93,213,233,123,161,164, 66,219, 54, 25,171, 28,237, 91,206,231,200,
+214,200,242,119, 46,193,107, 2,103,188,123,214, 66,208, 4, 46,127,110,146,181, 19,224, 98,199, 73,250,206, 10, 41, 33,172,132,
+ 82, 26,243,108,112,119,255,128,224, 29, 30, 61,186, 78, 9,156,184, 60, 37, 5,138,125,123, 40,240,233, 72, 1,102,196,117, 89,
+178, 66,188,240,144, 65, 48, 3,164,100,139, 20,103,100,188,139,189, 95, 16, 57,227,159,155,196,151, 66,164, 14,189,140, 91, 23,
+ 66, 48, 38, 54, 44,237, 53, 0, 87, 10, 33,119,227,162,128,213,135,194,118, 37, 22, 81,171,124,168, 75, 81, 36,182,138,148,180,
+ 37,211, 38,161, 52,221, 39, 29, 44,141, 34, 24,206, 31,173, 27,215,215,143,240,242,235,207,161, 84,133,110,215,192,219, 9,227,
+249, 12,227, 61,141,173, 32, 97,188,192, 56,156, 96,172,131,146,138, 61,194, 22, 90, 73,244,167, 30,186,154, 80, 55, 13, 86,109,
+141,227,233,136,251,251, 10,211,184, 66,211,212,104,234, 6,154,173, 57, 58, 10,230,180,166,189, 41,169, 53, 16, 60, 48,143, 19,
+219,150, 40,206,115,154, 13,198,121,194, 56, 77, 56, 15, 3,121, 65,165, 68, 45, 72, 56, 18,227, 20,125, 32,177, 94, 83, 49, 94,
+ 83, 86,148, 30,228, 13, 94,189, 60,208, 3, 1,129,102,213,225,250,189,119,243,243, 37,197, 98,122, 18, 43,113,136,112, 17,145,
+ 23,191, 52,252,129,197,112,158,146, 96,228, 51, 70, 54,143,121,228, 27,156,255,188, 7,162,223, 35,132, 76,157,165, 7,217, 24,
+165,200,251,195, 82,121, 31, 68,142,175,136, 58, 11,218, 35,135, 36, 40,185, 20, 2,148, 92,243, 98, 17, 85,164,250, 33,117,179,
+209,228,225, 23,149,137,184, 76, 54, 78,138,208,212, 94,197,176,148,168,181, 15,133, 77,110,177, 83, 8,233,159, 1, 1,191,254,
+237,231,152,198,129,187, 83,201,120, 80,135, 97,156, 16,188, 71,187,222, 81,166,116, 0,180,210, 64, 5,204,198,164,174, 64, 1,
+ 48, 98, 78, 94,229,148,208,197,202,214,148,186, 39,114, 68,132, 72,182, 2,158, 42, 20,196, 62, 99, 29,145,233,188,135,117, 1,
+150, 12, 57,176, 0,148,170, 41, 89, 78, 48,108, 70, 8,232, 64, 22, 45, 85,224, 75,131,167,142, 73,105,197,194, 49,218, 47, 34,
+ 4,234,226,149, 4,220,132, 0, 75,100, 53, 89,196, 80, 70,209,146,166,105, 22, 42, 77,151,176,214,168,116, 13, 40, 13,199,158,
+225,105, 28,112,220,239,113,120,120,128, 49,244,103, 73, 41, 81, 55, 53,180,214,240, 33,224,186,235,240,221,221,142, 98,105,219,
+ 6,162,105, 89,196, 86, 65, 0, 88,111, 54,144,175, 94, 33,120,139, 86, 73,108,107, 2, 64, 61,221, 15,152,130,196,209,120, 40,
+ 17, 80, 43, 42,102,173,231, 3,174,232,102,232,208,102, 97,157, 84,104,218, 14,117,211,224,179, 79, 62,202,239,114,182, 89,164,
+169,213, 98, 24, 90, 94,232,204,106,144,124,232, 66, 8, 78,210,242, 60,218,207,205,137, 23, 62,233,138, 2, 2, 89,172, 28, 1,
+174,140, 49, 24,206, 3,132,119,169,251,117,198,192,217,152, 54,199, 79,168, 15,192, 56,224,250,241, 91,144,109,139,213,213, 14,
+237,106,133,110,181, 66,211,182, 76, 92, 43, 34, 56,131,224,231,212, 83,167, 41, 37,117,201,206, 39, 56,140, 16, 28, 19,203,175,
+ 47,226, 84,147, 85, 50, 68,155,157,192, 28, 6, 28,246,200, 1, 57,204,170, 15,222,195, 11, 1, 45,169, 67,167,127, 15, 69,190,
+ 10,165, 24,238, 52, 39,245, 54,233, 13, 25, 10, 37, 8, 15, 75,141, 28,137, 35, 87, 74,163,173,107, 24,235,160,149,194,122,181,
+194,237,253,253, 66, 20,235,203,144,158,152,202, 23, 66,148,206,164, 33,177, 47,178, 48, 68,153, 34, 25, 66,202,124,247,176,112,
+ 86, 38,170, 32,138, 84,191,161,167,160, 32, 0,184,185,190, 70,211, 16, 34, 89, 22, 17,201, 72,107,100,159, 86,213, 65, 98,145,
+147, 33, 22,147, 79, 70, 64,251, 98, 13, 90,176, 15,168,213, 46, 20,101,209,175, 31, 87,226, 16,139,236, 12, 41, 68, 10, 96, 18,
+ 8,133, 11,154,243,212,113, 97, 67,138,250, 12,225,121,132, 42, 50,250, 53, 9,174,131, 88, 8, 5,104,172,224, 33,164,128,119,
+108,202,144, 17,253, 26, 43, 15, 44, 1, 55, 92,237,208, 30,190,176,201, 9,242, 81,122, 79,151,225, 52,158,208, 52, 13,156,165,
+ 80, 2,178,213,212,168, 17,224,165, 66, 5, 10,237, 48,179,193,100, 45,177,138, 79, 3, 78,231, 51, 20, 2, 54,109, 13,105,200,
+ 63,124, 60,245,248,205,111,126,131,243,241,128,237,102,131, 85,215,161,237, 58, 52, 85,133,186,109,233,226,213,228,193, 85, 90,
+ 83,150,175, 82,216,172,111,240,112,251,154, 42,109, 14, 54, 24,198, 17,231, 97,196,158,253,183,211, 60, 83, 70,245, 52, 97,144,
+ 18,168, 3, 66, 69, 15,220,253,177, 71, 87, 87, 20, 12, 1,129,182, 33,133,124, 37,129,227,221, 1,208, 26, 74,215,216,221, 92,
+177,216,226,111,223, 65,199,177,108,202,239, 21,161,208, 59, 4,188,121,205, 97, 89, 49,150, 98,248,111,206,133,171, 34, 0, 0,
+ 32, 0, 73, 68, 65, 84,115,179, 5,176, 78,130,198, 74, 4,137,145,124,153,231,206, 57,238,121, 82, 88, 65,172, 94,131,120, 99,
+196,190, 4,233, 32, 39,245, 21,227,114,148, 29,120,137, 81, 44,214, 54, 8, 40,186,251, 76, 91,202,135,241,197,110, 95, 20, 69,
+140,184,132,228,228,162, 52, 86,205, 49,177,208, 26, 7,173,107,124,239,123, 31,163,109, 53,174,190,251, 99,252, 31,255,235,255,
+128,225,116,128,247, 30,231,145,246,132,235,237, 53,164,212,112,142, 84,211,202,147,175,154, 53,150,124,152,100, 68,164,144, 34,
+ 43,163, 11,207,135,247, 92,195,197,140,110,246, 48,231,196, 27,193,124,115,142,115,133,128, 13, 30, 22, 10, 74,144,202,152,254,
+ 61,154, 5, 76, 30,128,133, 66, 40,195,237, 1,165,232, 32, 9, 30,158,243,203, 69,240, 80, 85, 77,220,117,111, 17,180,134,150,
+ 85,202, 19,143, 35,204, 72,174,115, 34,131, 52,164,174,160,171, 6, 90, 41, 26, 27,155, 9,102, 28, 48, 12, 3,250,254,132,121,
+158,233, 25,170, 42,232, 74,163,235, 58,232,138,172,127,195, 52,227, 87,175,239, 80,105,133,182,170,209, 53, 26, 87,155, 14,187,
+237, 22,168, 90, 96,187,194,203,117,135,219,251, 41,199,100,122,192,137, 0,195, 98,189,171,117, 11, 59, 79, 0, 92, 26, 39, 11,
+ 25,191,171, 76,124, 11, 2, 82, 41, 52, 77,139,110,189,197, 31,255,209, 79, 19, 27, 62, 79,189,200,122, 36, 66, 88,136, 61, 23,
+161, 66,197, 84,203,179,208, 41, 94,138, 75,213, 60, 27,225,162,115,136, 31,214,216,137, 75, 69,221,226,108, 45,230,113,228, 75,
+ 55,243,236, 61, 23, 39,160,142, 11,114,158,112,238,143, 88,237,118,232,152,201,174,249,156, 2,251,223, 19,247,155, 99,102, 71,
+ 99,161, 56,229,108,232,123, 90,197, 20,207,170,146,153,152,224, 3,185, 6,136,254,150,191, 99,129,243,200,113, 14,168,155, 22,
+253,249, 12,201, 32,153,168,109,169,155, 54, 1,105,162, 72,216,154, 9,214,204,176,108, 93, 83, 82, 20,107, 63,240,159,239, 48,
+207, 51,130,167,159,161,170, 27, 90, 25,240,187, 92,107,114, 54,152,216,141,179, 56, 52,218, 20,163,141, 51,112,113, 34, 22,145,
+ 88, 57,225, 51, 78, 88,242,196, 80, 36,159,184,115, 22,202, 41,136,208, 16, 71,192,210, 20, 66,105,141, 48, 2,183,119, 15, 16,
+ 66,224,250,122,135,166,174, 89, 56, 41,242,145,197,226,215, 28, 68,201,209,187, 23, 90,166, 56, 33,204,164,205, 80,248,225,243,
+251, 34, 66,132,181,149, 80,173,144, 1, 99,133,157, 60,196, 9,148,112,153,199, 81, 56,129,116, 57, 94, 23, 69, 66, 84, 73,151,
+ 43,197, 35, 16, 23, 68, 51, 68,101,116, 86, 74,135, 34,246, 51,217,167, 82,172,156, 72,251,181,244, 81,248,101,102,123, 0,240,
+225,239,124,128,215, 47,158,227,116, 60,192, 76, 35,156,157, 81,215, 21,166,153, 19,154,172,133,172, 21, 20,128,154, 51,166,107,
+235,112, 60,143,132,174,212, 84,129,125,125,183,135, 20, 2,179, 7,238, 30,246,208, 8,120,245,242, 21,174,182, 27,108, 55, 27,
+108,214, 43,172, 58, 98,178,119, 45,161, 92,235,186, 70, 83,215, 52, 90,146, 18,175,194,139,196, 38,134, 32, 18, 87,127, 62,227,
+112, 60,226, 97,255,128,135,195, 9,195, 72,121,197,214,122, 92,153, 9,179,148, 84, 81,106, 13,239, 3,110,143, 61,180,174,232,
+ 82,119,244,243,207,179,229,104, 83,197, 35,186,178,137, 14,223, 58,146, 94, 36,178,137,204, 92, 14, 23,163,246, 50,202, 54,148,
+128,161,242,243, 14,249,162, 91, 64,107,120, 55, 73,123, 65,145,130, 11, 68,204,236,246, 98, 25,211, 27, 10,223,166,160,192,139,
+ 60,201,201, 35,246, 80, 68, 24,102, 64, 77,193,161,142, 34,192,194, 73, 17, 15,130, 24, 56, 20,202, 17,215, 34,150,151, 10,194,
+144, 68,104,133, 56,141,167, 81,226,141, 84,131, 76,205, 35,238, 66, 96, 79,177,131, 82, 26,175,238, 30, 48,140, 3,118,183, 35,
+174, 30,191,131,243,241, 33,129, 68,134,105,134,115,119,216,108,175, 32,117, 13,231,124, 58,104,103, 99,217,203, 44, 22,170,246,
+176,152, 28, 96,161,224, 15, 40,131,218,232, 0,147, 5, 99,127, 50, 22,150, 15,127, 37, 36, 44,136,119,160,164,128,116, 62, 77,
+ 50, 0,203,194, 88,153, 34, 40,193,150,175,168,128,246, 60, 73,137, 81,153,206, 76,144, 65, 67, 86, 21, 2, 60,105, 2,216,222,
+ 10, 14,140,137,153,217,152, 29,125,215,116, 5, 85,213,201, 63, 79,107,168, 25,147, 49, 24,134, 51, 6, 22, 31,181, 93,139,170,
+170,208,182, 53,186,182, 75,239,209,141,144,208, 85, 3,231, 61,147,194, 60,246,103,131,135,243, 45, 42, 93,161,171, 53,254,224,
+227,247, 48,205, 79,240,226,118,143,231,247,123,156, 70, 7, 72, 96,221,213,120,114,181, 65, 48, 19,142,115,192,110,189,194,195,
+233,140, 70, 87, 8,130,148,204,105, 93,197,108,250,245,118,135,159,254,238,103, 4, 54, 9, 62, 71,135, 46,138, 84, 62, 48,211,
+ 24, 30, 20,194, 82, 22,135,137, 5, 46,210,243, 32,101, 57, 97, 18, 9,116, 68, 90, 90,159,132,142,214, 24,100,185, 58,125,166,
+102,158,147, 69, 43,174, 3, 80,216,170,180,115,152,231, 17,253,254, 30,207,158, 86,164,249,120,252,152,184, 8,124,177,128,247,
+245,214,146, 24,109,178, 22, 58,120, 10, 45, 17, 72,222,102, 15, 15, 56,201, 94,125,145,232,135,145, 45,239, 56, 60, 38,199,207,
+ 2,214, 9,248,161, 71, 8, 68,249, 35,250,158,132,224,180,192, 72, 87, 19, 66,210, 88,219, 26,132,224, 10,118, 58,219,191, 20,
+ 39,138, 5, 73,194, 70,155,173,127,199,227, 17,206, 89,116, 77, 3, 55,121,200,186,198,102,221, 97, 28,199, 4,185,137,233,100,
+139,115, 80,208,212,201, 39,129, 28,137, 35, 29,123,188,203,145, 53,251, 3,146,150, 37,234,171,105,149, 68,113,195,209,113, 1,
+ 0,211, 52,226,246,238, 62, 93,236,117, 93,167, 70,196,123, 87,190,132, 66,151,196,236,126,228,238, 29, 11,118,103, 78,105, 76,
+223,175,216, 44,135,156, 33,144, 81, 99, 64, 33,155, 74,223, 27,201,180, 61, 18,140,250,136,141, 79,171, 8,189, 8, 14, 73, 62,
+ 37,153,186,162, 28,242,130,197,133, 34,176,180,224, 8, 31,255,155, 47,111, 41,222,200, 4,143, 64,134,224, 75, 43,213,114, 47,
+ 31, 15,194,182,174,240,252,233,231, 88, 85, 21,100,165,161, 59,194,110, 70,225,135, 84, 18,222, 80,120, 69,211, 84,144, 51,160,
+ 37,129, 16,134,217,162,107, 60, 32, 60, 14,189,196,195,169,199,105,152,224,188,195,110,189,198,179, 87,247,184,127, 56, 66, 10,
+218,219,175,186, 22,187,245, 26,235,245,138,198, 91, 93,135,174,237,208,212, 21,234,138,254, 83,213, 85,186, 54,231,137, 50,130,
+247,251, 61, 94,191,190,199,126,127,192,121,140, 1, 21, 1,253,236,176,171, 45,198,160, 97,166,153,190,196,135, 19, 49,148,157,
+ 67, 59, 78,228,109,118, 30,231,201,208,235,173,243, 62, 88,248,204, 5, 94,188,209, 98,137,124, 69, 9,119, 97,187,217, 27, 96,
+ 22, 22, 37,134, 5, 56,150, 99,116,249,162,149,165, 58, 62, 78,153,100,254,231, 75,157, 94, 44, 12, 18, 79,176,248,114,115,130,
+ 85, 49, 2,240,101,108,172,231,106,180, 4, 28,151,202,239, 16,114, 4,176, 16, 69,174,181,207,193, 5, 62,171, 69,195,197, 98,
+ 63, 11,248,196, 5,241, 41, 31,210,223,170, 86, 40, 68,128, 79,191,121,141, 87,175,239, 48,141, 3, 62,253,201, 31, 98, 60,159,
+177, 89,183,248,103,255,244, 87,184,122,235, 61, 60,188,124, 74,223,101,231, 49,206, 19,220,195, 29, 86,219, 43,232,154,166, 47,
+100, 1, 11, 32,243, 86, 60,212, 98, 50, 97, 9,222,225,148,175, 68, 61, 95, 60,133, 69, 38, 2,117, 59, 46, 4, 82, 22, 91, 3,
+ 37, 9, 30, 99,133,132,178,110,153,213, 32, 52, 2, 28, 96, 12, 7,126,144,110, 36,196, 40, 81, 0, 66,208,154, 74,105,133, 96,
+153, 32,233,226, 26, 68, 33, 76, 46,165,166, 9, 7, 8,165, 19, 25,178,226,241,185,168, 52, 84,160, 24, 81,231, 44,156, 11,152,
+231, 9,243, 52, 97, 56, 29, 49, 79, 19,234, 74, 67, 87, 84, 32,183,109,131,182,235, 80, 85, 21, 77, 5,120,210, 98,189,135, 84,
+ 2,227, 52,195, 24, 67, 47,193, 57,244,199, 49,229,101,175,186, 21,126,255,241, 35,212,149,134, 19, 18,134,213,221, 93,179,197,
+105, 48,248,171,175,190, 70, 83, 83,145, 49, 25,139, 0,151, 70,240, 74,107,172, 86, 27,188,245,228, 49,118,219, 77, 18, 31, 73,
+166,210,229, 56,232,194, 24, 20, 21,198, 66, 20, 84,110,222,129,202,204,226, 78,221, 62,127,223,168,230,207,107,198, 20,220,197,
+112, 46,227,124, 18, 84, 66,208, 14,152,224, 62,158, 47,188,165, 15, 89,184,140, 60,157,198, 51,142,247,119, 48,243,132,215, 47,
+ 94,226,157,247,222,195,245,163, 27,238,174, 29,172, 33, 27, 89,165, 21,161, 83,233,141,228,221,127,182,197, 57, 88, 46,186,179,
+101, 52, 2,149, 66,145, 22,226, 41, 77,135,126, 62, 94, 5, 82,151, 78,239,105, 85,213, 52,121,144,130, 35,176, 13,224, 45, 41,
+157,120,245,225, 24, 21,171, 84,200,151,188,240,112, 46, 19,214,194,204,254,127, 94,125,198, 28,244,154, 49,196,179, 49, 5, 93,
+ 50, 39,131, 42,173, 0, 23, 25, 3,188,230,243,101,145, 95, 72,110, 24,250,239,131, 76,201,114,209, 17, 97,237, 12, 9, 7, 93,
+213,116,222,121, 7,231,232, 12, 25,199, 9,183,119,247,144, 82,226,250,250,138, 38,173,222,165,190,235,114, 42,154,117, 75, 33,
+ 79, 7, 18, 51, 62, 44, 2,207,232,242, 95, 34, 53,169,254,139,193, 87, 98,145, 96, 42,147,182, 54,139,217,133, 20, 16, 78,240,
+217,146,153,254, 58,177,106,147,118, 47, 7,179, 80, 94,111, 40, 98, 57, 47,253,206,116,224,203, 32,105, 82,200,123, 61,234, 58,
+ 69,225,120,138,221,144, 79, 85,175, 72,249,235,165,208,137,126,221,135,191,243, 59,120,241,205, 51, 84, 74,224,120, 58, 98,213,
+ 86,128,231,232,201,237,154, 14,183,121,130,117,132, 49, 12,158, 94,187,174, 43,104,235,177, 81, 26,234,250, 10,199,211, 9,143,
+175, 28,246,167, 1,214, 57,212,138,196, 60, 77, 93, 65, 84, 29,134,243, 17,131, 25,113,232, 71,188,124,125,143,221,245, 13,194,
+ 52, 96,181,234,208,117, 29,214,235, 53,186,174,193,118,187,197,106,181,130, 86, 84, 21, 78,227,132,211,233,132,195,126,143,251,
+251, 7,156,250, 1,179,243,233, 24,159,189,199,241, 60, 97,123,221,226, 48, 76, 48,206, 39, 69,235,121,228,127,191, 32, 97,143,
+241,128, 80, 45,174,223,126,178, 36,250, 71,171,140,184,200, 74, 23, 5, 82, 53, 77, 56,194,183,201,226,104,189, 1,207,201, 79,
+ 33,127,225, 2,197, 60, 70,217, 88,120, 51,142, 32,175, 72, 68, 86,209,211,248, 56, 69,247, 1, 5,151,125,105, 89, 15, 75, 40,
+140, 88, 24,234,249,207, 88, 10, 2,211,238,150,171,121,113, 17, 57,136,130,129, 85, 6, 24,228,157,126,206,112,247, 34,188, 25,
+178, 16,190,101,213, 80,252,159,132,192,111,190,252, 26,175,239,238,112, 62,247,216,236,174,241,236,203, 95,195, 78, 35,254,229,
+231,191, 66,183,222,192, 59,143,237,227,119,113,120,253,140,186, 47,231, 49,249, 25,238,225, 22,219,221, 13,100,221, 50, 55,187,
+198, 56, 77,105, 26, 21,149,191, 41,134, 62, 20,197, 85,132,255,134, 69,165,146, 63,118,100,124,115, 34,166,121, 79, 0, 13,239,
+ 97,226,136, 87,133,156,168,192, 23, 87, 21, 11, 37, 6,180, 68, 40,136,148, 10, 94, 51,106, 51,198,130, 70,170,162, 20, 9, 86,
+162,117, 5, 85,209, 26, 74, 85, 53, 93,254,146, 68,164,177, 3, 38,240,206, 4, 59,140, 48,227,128,241,244,128,105, 28,128, 16,
+208,198,201, 87,211, 80, 44,107,211, 16,156, 36,198,197, 10,192, 59,186,216,219,149,199, 48, 78, 24,134,145,166,113,132,148,132,
+ 15, 1,119,199, 19, 94,239,143,228,129, 6,229,177, 91,107,113,158, 38,250, 57,165, 68, 93,105, 46, 14,124, 18, 87, 73, 41,209,
+182, 29,154,182,195,143,127,244, 73,186,136,227,104, 60, 68,234, 91,236,214, 11,171,228, 18,246, 80, 48,185,121, 85, 18,117, 68,
+ 82,150, 26,142,192,249,234,113,108,202, 20, 49, 38,189,197,139,221,115,122, 88,132, 12,185, 34, 35, 59,150,118,212,141,113,194,
+156,165,220,241,121, 26, 1, 33,112,120,152,177,191,191,195,251, 31,127,130,171,155, 43,120,231,210,254,220, 89,139, 74, 9, 12,
+227, 12, 59, 77,252,239,240,208, 82,164,194,193,186, 12,145, 73, 66,186, 4,238, 9, 28, 88,194, 13,152,115,240, 32,167,145, 82,
+154,186, 96, 33,153, 69,239, 33, 36, 97,138,157, 53, 8,158,198,193,154,209,184,224,206, 51, 22,231, 49, 43, 60, 78, 24, 84,136,
+ 1, 86, 1,199,158, 34,127,107,165, 97,157,199,170,166, 53,168, 20,180, 92, 65, 40,194,170, 10, 33,108, 96,235, 49, 92,200,231,
+ 83,202,126,160, 53,178,231, 85,112, 44,235,149,170,120,178, 96,224, 45,160, 80,113, 20,171, 76,233,122, 14,196,228, 31,199, 9,
+119,247,123, 72,169,176,101,123, 52,245, 91, 50,135, 48, 69, 78,134,207,114, 40,148,201,166, 1,188,178, 9,217,141, 19,179,209,
+188,191,212, 60,167, 70,200,243,152,159,126, 63,171,228, 99,105,192, 43,242,236, 40, 75,172, 36,168,127,239,223,255,211, 63, 79,
+237,129,100,225,136,200,157, 95, 26, 57,201, 56,138,141, 85, 66, 22,193, 21,243,131,111, 77,172, 17,225,130,123,186,128, 79, 20,
+249,233,252,151,199,227,128,159,253,236,103,120,247,131,239,225,254,225, 30,179,177,100, 29,226,137,193, 56, 78,240, 34, 71, 44,
+ 66, 80, 55, 97,172,163,138, 93, 41,136,224, 16,156,193, 91,239,188,143,119,223,121, 27,247,251, 61,132,119,104,180, 34,120,199,
+ 60,113, 26, 16,125, 49, 86,219,107,124,244,217,143,241,244,233, 51, 88,235,240,233,223,249, 67,252,229,207,255, 18,170,219,224,
+245, 55,207, 48,156, 7,140,227,132,211,241,132,251,135, 7,220,221,223,225,225,126,143,211,121,192,236, 28,108, 2, 1,137, 36,
+140,128,247, 88,173,215,216,247, 3,172, 15, 24,141,197, 56, 27,156,199, 25,167,113, 66, 63, 91, 88,169, 81,119,107,188,251,209,
+251, 5,241, 44,103,239, 38,190,123, 89,193, 7,177,136, 62,141,227,236, 52,184,241, 33, 89,209,114, 9,149, 19,221, 66, 54,252,
+ 20,157,120,120,179,163, 21, 50,125,140,209, 42, 68, 85,239,155,144,249, 80,114,226,133, 76, 25,191,254, 34,102, 58,158,230,105,
+175,142,176, 72, 91, 43,247,252,113,143, 30,173, 97, 73,179,159,190, 71, 57, 53, 75, 20,123,252,197,106, 32,105,157,194, 2,107,
+187,220, 83, 72, 60,127,121,135, 23, 47, 95,226,116, 58,192, 26,131,243,233,136,135,187,215,232,251, 3, 89,214,108,236, 72, 13,
+170,166,131,153,198,244,158, 89, 23,224,236,140, 77, 91, 1,170,130,210, 26,214, 89, 88,107, 96,166,129,194, 41,202,213,135, 88,
+ 70,226,138, 98,255, 33, 82, 83, 18,210,251,175,148,132,210, 21,174, 55,107,254,126,211,190, 80,240, 24, 85,132, 98,108,155, 18,
+225,150, 72,221,192,176,142, 44,122,114, 9, 87, 60,243,127,198,105,196,241,120,192,241,212, 99,224,206, 89,134, 60,227, 33,232,
+ 14,129,103,116,221, 65,215, 45,156, 35,225,211, 52, 27,156,207, 39, 28, 30, 30,240,240,112, 15,107, 45,234,182, 69,187, 90,161,
+169, 27,202, 98,111, 26, 84,138,130, 84,234,186,130,210,244, 94,169,186,134, 82,116,176,234,138,244, 44, 4, 99,177,152,102,147,
+216,232, 62,120,204,102,198, 56, 17,204,132, 99, 40, 80,119, 45,170,186, 78,185,225, 30, 72,123,244,245,102,135,191,255,247,254,
+ 32, 45,246, 68,220,135,103,129,124, 33,156,204,121,224,169,158, 78,191,168, 64, 31,243,231, 19,189,208,161, 76, 76, 20,185,139,
+ 47, 25,240,117, 85,227,112,236,113, 60,208,168,217,152,153, 58,106,195,113,178,133, 40, 44, 17,224, 4, 21, 13,164, 48,103,251,
+ 26, 71, 1,247,167, 19,250,253, 61, 32, 8,125, 59,142,103,120,231,112,127,119,143,121, 26, 96,172,193, 56,141,112,102,134, 53,
+ 36,112,163, 2,196, 39,232, 82,188, 80, 67, 18,158,249, 20, 66, 82,166, 42,198,247, 65, 10,250, 30, 70, 79,188,140, 74,114, 75,
+ 54, 55, 33,136, 37, 32, 68,164,248,201, 5, 2,246,242, 59,153,182,198, 76,104,140,223, 81,203, 74,247, 74,211,100,211,199, 4,
+182, 52, 29, 41,244, 52, 97,249, 44,199, 95,147,244, 52, 34,159,155, 82,209,132, 65, 74, 69,116, 80, 79,107, 50, 37, 40,109, 80,
+ 73,133, 74,179,205, 58,126,222, 74,193, 57,143,105,154,200, 2,221,212,105, 31,158,250,157,130,175, 33,210, 68,174, 32,122, 22,
+ 13,108,178, 89, 70, 13,145, 40, 18,215, 68,158, 94,251,200,143, 23,249,190,204, 14,101, 81, 36,183,133,197,251, 24, 66,128, 46,
+233, 32,162, 80, 16, 7,254, 2,251,180, 11,151, 69,186, 76,174,148,144,126,117,225,203,227,206, 34, 17,149,226, 89, 22, 71,239,
+ 49,187, 61, 18,174,138, 11,104,183,189, 70,176, 22,181,174,240,179,255,239,103,168, 20,237, 56,165,160,224,128,237,134,198,226,
+222, 7, 76,209,223, 57, 58,218,241, 4, 64, 86, 21,170,186, 1,160,208,180, 45,166,243, 30,206, 88,252,232,195,247,113,245,232,
+ 9,116,211,224,183,191,253, 45, 94,126,253, 44,189,241, 77,221, 64, 4,129, 47,126,253,107, 40, 17,240,103,255,240, 63,193,255,
+246, 63,255, 79, 8, 66,225,237,247, 62,194,207,254,249,223,224,233,139, 59,108,155, 26,117,173,249, 32,163,156, 98,231,163,112,
+ 99,185, 67,117, 1, 48, 62,160,118, 14,117, 93,193,204, 22,115, 16,112,193,162, 10, 2, 77, 83,161,150, 53,174,175,111,240,193,
+247, 62,202,106,237, 80, 40, 29, 11,186, 80, 22, 44, 20, 21, 81, 40, 35,250, 8,233,138,240,109, 36,183,176, 88,111, 36,208,139,
+136, 34, 12, 42, 29,147, 95, 82,138,252,224, 70,190,181, 4, 91, 40, 2, 84, 16,139,184,192, 50, 83,133,196,145,158, 67, 38,178,
+243,129,254, 63,231, 11,196,105,132,143, 25, 2, 5,244, 39,132,162, 27, 47, 38, 12,209, 40,145,166, 8,233, 23, 47, 3,104,162,
+ 60, 47,105, 86, 5, 22,186,127, 92,152, 8, 78,231, 1,207,191,121,137,190, 63,230, 0, 10,142, 87,116,204, 75, 15,240,124, 30,
+210, 95,235,102,133,233,124, 76,132,152,105,158,113,251,240,128,171,237, 21,100,187, 33,145, 18, 87,255,214,249,236,247, 15,101,
+ 49, 38,222,224,251, 39, 33,163,200, 85, 63, 81, 10,105, 68,109,173, 69,168, 43,234, 40, 66,160,174, 43,249,180,233, 64, 83, 62,
+ 64,123,162,206, 57,173, 97,173,165, 66, 55,106, 48,162,208,134, 85,217,228,141,182,232,207,103,188,186,189,199,235,135, 3,222,
+186,190,194,239,254,224,251,104,155, 26,117,224,238,223,121, 72, 45,160,116,141,170,110,137,248, 5,192,250, 64, 49,152,156,155,
+ 62,143, 35,234,186,129,174, 73,159, 82, 87, 21, 5,192, 40,137, 74, 83, 22,187,212,228,135,183,206, 65,121, 64, 74,226,122, 43,
+ 22,170,106, 65,104,220, 97, 28, 49, 78, 6,179, 49,176,134, 50,181,103, 99,211,142,255,234,122,135,170,110,208, 15, 35, 78,227,
+ 76,231,142, 82,208,138,236,107,127,231,119,127, 72,118, 59, 44, 29, 58, 2,223,234, 12, 93,102, 15, 4,177, 96, 26,196, 36,201,
+224,105,253,151,226,165, 19,129, 50,206,101, 56,234, 86,209,164, 51, 10,233, 62,254,248, 67,124,253,236, 27,166,198, 21,117,105,
+ 49,238, 18, 23,196,196,168,204,166,236,112, 66,181,106,237,160,181,198,233,116,194,139,167, 95, 98,189,187,130,119, 6,206,209,
+212, 82, 11,138,234,157,149,128, 9,100, 29,181,222,241,132, 34,164,231, 70,192, 39,225,154, 76,200,216,184, 16,226,124,142,152,
+ 60,167, 36,132,172,232,181,243,168,222, 5,192,219,153,118,204,222, 67,104,149,126,118, 41, 99,174, 60,232, 98,142,109,108, 92,
+ 61, 48,243, 35, 90, 48,117, 16, 24,166,153,237,143, 22,222, 85,204,124,144,217, 97,197, 66,190,146,101,225,217,151, 15, 14,201,
+122, 3,192, 21, 68, 42,140,170,170, 6, 64,118,103,192,211,186, 54, 18, 5,157,131,172, 8,169, 91,105, 1, 25, 40, 84, 38, 71,
+253, 58,188,186,189,131, 82, 18,219,237,122,113,246,138,148,193, 33,151,126,243,146, 29, 18, 39, 65, 9,195,206,107,196, 98,253,
+115, 41, 34, 14,220, 24,166,153, 4, 3,107,226, 68,167, 76,111,163,144, 39,250,159,245,155, 33, 30,209, 63,151, 53, 68, 36,221,
+ 71,142, 28,196, 69, 39, 84,236, 99,147, 80, 9,161, 64,115,139,162,194,112,124,160,184, 52, 54, 77, 99,250, 0, 74, 5, 26,123,
+172, 26,129,177,174,112,236,123,120, 71,157, 64, 83, 41,244,195,128,205,170, 67,219,212,232,135, 25,243, 68,106,203,117, 87, 99,
+187,219,209,248,167,210,168,149,194, 56,156, 1,231,208, 40, 9, 81, 43,216,241,136,105, 56,225,147,239,125,132,235,221, 6, 63,
+255,197, 47,177,170, 52,249, 77,101,128, 51, 61,254,243,127,252, 95,225,191,251, 39,255, 24,206, 11, 52,149,194, 47,126,246, 47,
+ 48,187,128,113, 38,101,228, 97,127, 74, 35,187,212,157, 10,153, 74,127, 1,145,246,167,212, 93, 0, 58,120, 76,117, 75,151,145,
+ 82,184,186,186,193,238,230, 49, 62,253,254,135, 20,192,144,152,191,133,133,193, 23, 19, 89, 81,174,212,233,178,186,148,197, 19,
+ 83, 88,166,200, 64,132,197,148,234,194,151,125,113,237,251,204,120,143,136,213, 32,233,146,247,146,126, 18, 25, 51,147, 67,182,
+204, 93,218,203, 19, 40, 65, 32,249,195,125, 18,194,101,254,121, 8, 75, 0, 76, 82,164,135, 98,156, 31, 66,129, 59, 14,139,208,
+131,242,175, 3,190,165,241, 78,253,111,121, 28,243,248,171,176, 47, 65, 8,152,201,226,183,159, 63,195,241,184,231, 8, 71,155,
+246,148,161,240, 23,151,246,154,224, 29,204, 60, 97, 24, 39,172,186, 22, 50, 4,184, 64, 17,161,199,254,136,173,212, 16, 74,163,
+169, 27,244,170, 2,236,132, 16,149,192,139,215, 20,138,149, 90, 88,124, 62, 33, 82,209, 82,156, 39, 69, 13, 95,239, 86,172,176,
+ 87, 8,146, 19,255, 60, 57, 79,172,247,240,198,195, 9,139, 41,128, 92, 35,156,135, 45,132, 45, 36,175,220,157, 57,143, 97,154,
+208,159, 7,244,227, 8,165, 20, 54, 93,139,235,117,135,143, 62,252, 16, 79, 30, 63, 70,219,180, 16, 74,166, 47,148,170, 42,202,
+ 33,215, 21, 76, 8, 8,170,130,199, 8,203,225, 26,243, 60, 83, 81, 45, 37,170,186, 74, 78, 18,169,152,211, 30,255, 35,104,127,
+ 89,129, 66,158,132, 18, 16, 66, 67, 34, 64, 5, 5,209,214, 80, 74,160,109, 42,204,134, 82,239,134, 97,132,210, 10, 45,103,159,
+ 11, 77, 0, 22,154, 18,156,105, 55, 13, 65,201, 94, 60, 89,249,197, 95,255, 6,159,126,252, 17,158, 60,185, 38, 1, 96,202, 29,
+ 40,204,181,172,136, 22, 33, 92,160, 63, 67,161, 88,142,110,144, 2,121,237,243,163,228,185,112, 77, 26, 36, 33,146,154, 93,200,
+ 44,170,251,236, 71,159,226, 47,255,226, 23,112,145,163, 32, 36,132, 96, 13,128, 44,124,208, 40, 80,165,158,244, 10, 49,238, 69,
+112,218, 90, 8, 1,135,253, 29, 32, 36,166,105,132,157,206,212,252,212, 29,180, 8,232,234, 10,118,162,189,235,236, 57, 61, 82,
+ 21, 25,220,188,238,146,188,167,214, 12,218,138, 73,110,158,153,248, 66, 40, 8,169, 19, 75, 65, 74, 65, 62,113, 30,185, 67,248,
+ 36,188,163, 49,123, 44,230, 37,154, 90, 2,134, 18,102,125,145,129,128,216, 13,243, 62,207, 2, 16, 9, 4, 36,184,152,246,168,
+107,205, 83, 34,230, 75,112,132,172,224,181,135,140,252, 4, 70, 35,251, 40,154,229, 39,140,108,107, 21, 93,232, 66,192, 90, 3,
+239,109, 18,155,121, 47, 18,116,199,123, 7, 21, 28, 42, 89,161, 82, 10,198, 1,198, 59, 10, 20,210, 26,195,121,192,235,219,123,
+212,117,133,150,207,109,186,107,201,127, 30, 16, 33,101, 33,225,129, 33, 98, 78, 7, 23,243,145, 17, 80, 76,190, 67, 2,232,196,
+200, 90,151,210,230,150,194,225,229,122, 60, 20,224,157,156,155,193, 62,245, 75, 24, 89, 68, 14,199,197,188, 8,114, 25, 2, 82,
+200,174, 66, 58, 95, 89,205, 39, 99,117, 20,210, 7, 43, 99, 40, 72,145,163,157, 16,180, 49,180, 66, 0, 33, 72,188,124,245, 10,
+127,245,203, 95, 96,215, 86, 8, 1, 88, 85, 10,119,227,128,182,169, 96, 45, 85,243,149, 82, 56,158, 71,140,195, 64, 57,201, 80,
+176,178,193,233, 76, 81,145, 56,247,144,109,155, 32, 51,231,113,196,186,107, 8,108, 97, 29,220,124,198,223,124,254, 5,164, 82,
+152,230, 25,168, 52,124,240,216,236,174,241,223,254,147,255, 18, 87, 55,143,113,184,189, 67, 37,105,127, 55, 91,143,154,243,155,
+109, 20,115,161, 24,213, 21, 98, 50, 89,118,146, 74, 49,191, 56, 32, 40, 44,160,253, 85,221,160,226,140,236, 40, 72, 75, 22,137,
+ 4,160,201, 93, 69, 10, 80, 16,209,249, 24, 22, 32, 21,196, 14, 25, 69,130,207,133,175, 45, 1, 98,144,129, 40,165, 50, 94, 22,
+ 72, 26,233, 3,188, 20, 68, 23,149, 5, 17, 46,209,217,196, 27,177,168, 84,151,248,148,190, 86, 18,100,163, 72, 38,189,178, 32,
+ 22,200,227,232,183, 85, 82, 36, 63,119,132,199, 4, 92,138, 2, 11,174, 68, 34, 59,133,165,181, 45, 46, 25, 34, 55, 33,254,212,
+ 50, 43,225,157,243,248,205,231,207,240,112,255, 26,243, 52, 21,169, 82, 46, 33, 51,243,101,158, 39, 7,214,242,126, 19, 1,231,
+ 97,196,122,213,194, 27,178,240, 56, 15,156, 78, 71,172, 86, 43, 40, 37, 81, 55,100,187,138,155,139,203,242,106,225,109, 45,109,
+ 35,241,242, 69,206, 78, 62,143, 52, 74,165, 36, 42,254,252, 35, 66,150, 97, 46,129,203,101, 41, 5, 38,222,235,139, 34,217,205,
+123,143,217, 24,178,129, 58,135,182,105,176,217,172,113,117,181, 35, 85,183, 49,184,222,172,241,248,209, 35,108,182, 59, 38,150,
+121, 38,209, 41, 72,201,220,251, 16,224,133,130,115, 51,191, 31, 51,230,113,164, 61,110,160, 68,186,184,151,149, 81,240, 88,164,
+214,197,241,173, 16, 20,162, 36, 60,127, 27, 36, 77,219,148, 20,208, 74,194, 40,137,170, 34,223,117, 83,215,232,186, 22, 54,208,
+ 30,154, 10,137,153, 45,165, 54,243,210,189,135,214, 32, 26,160,243,248,249, 47, 70, 60,122,252, 54, 62,124,255, 59,120,124,115,
+197,176, 16,145,223,155,203, 49,232, 66,128, 41,146,112, 52,230, 17, 8,173, 82,223, 46, 32, 23,128,151,248, 13,116,222, 49, 4,
+ 8,208, 66,147, 87, 28, 1, 79, 30,223,224,157,119,223,197,231,191, 29, 1,113,102, 31,189, 44, 38,252, 52,185,146, 82,112,108,
+171,132,115, 22, 2,142, 62, 3, 73, 5, 94, 85,105, 84, 90,225,116, 26,112,247,250, 27,172, 54,215,112, 30, 48,102, 66,203,126,
+250, 90, 75,172,219, 6,194, 59, 32, 16,145, 48,234, 45,226,231, 17, 53, 1,193,123,104,173,114, 35,192,238, 9, 1, 73, 23,122,
+ 18,164, 9,246,116,211, 68, 11,130,197,209,130,115,198,161,147, 80, 90, 41,250,179,107, 77,206,105, 7, 15, 23, 56,212, 43,230,
+ 25,240,179,233,227,232,194, 58, 46, 26, 60,163,104, 93, 10,161,137,119,155,103, 7, 78, 4, 59, 5,159,233,114, 57,186,153,156,
+ 15, 74,215,168, 52,101,195,219,121, 74,176, 34, 31, 36,113, 38,100,200, 49,178,206,161,210,158,117, 1,146, 39, 3, 30,179, 7,
+ 85, 37, 90,224,120,234,241,226,213, 29,222,127,239, 59,252,249,208,207,239, 69,153,173,158, 11,116, 25,136,193, 18,100,110, 78,
+ 60, 60,130, 37,186, 29,253,187, 93,202, 54,136,151, 57,202,224,170, 16, 46, 89,161, 75, 66,231,197, 5,174,203, 52,175,210, 46,
+ 36, 69,190,172,163,191, 86,198,132, 31,246,127, 94,170,219, 75,194, 87, 26, 51,200, 44, 12, 10, 2,204, 91,166,189, 80,224,224,
+149,217, 81,100,164,112, 22, 47, 94,124,131, 77, 87, 83,114,145, 53,112,222,163,107,106,188,125,181,198, 56,141,168,234, 6, 46,
+ 0,211, 52,193,122,160,173, 4, 28, 52, 94,191,122,137,102,181,195,174, 3,234,138,174,138,166,174,224,204,156,118,250,167, 83,
+143,237,122,141,215,175, 94,225,223,253,183,127, 15,109, 93, 99,154, 72,225,248,229,211,103,216,223,221,162,106, 90,252,167,255,
+217, 63,194,127,253, 95,252, 35,212,237, 99,204,134,210,221, 42, 33, 80,213, 26,222, 4, 88,227,225, 24,166,179,220,127, 21, 41,
+ 82, 90, 65, 85, 42,133, 52,132, 88,228, 4, 79, 42,225,164, 90, 14, 57,237, 9,172,122,228, 74, 46,192, 67, 48,151,124, 17,138,
+ 34,120,148,141,165,125, 16,184,136, 13,140,190, 74,136,165,127, 18, 98,193,181, 73,254,199,216,168,196,124,104, 31, 56, 53,138,
+ 19,129,184, 32, 72, 8,216,111,117,135, 81,113,225,249,160, 18,113,100, 86,236,185, 99,104, 76,230, 42, 23,116,171, 32,150,227,
+ 80, 17,190,117,152,148, 71, 92, 81,120,242, 6, 41,159, 15,238,242,114,151,169, 16,179, 54,224,171,167,207,113,127,247, 10,195,
+112, 78, 35, 56,239, 56, 20,194,187, 69,135,142,130,141,109,205, 12, 51, 79,176,206, 66, 74,133,205,122,135,190, 63,192, 49,176,
+199,121,143,253,254, 1,109,183, 70,215,117,232,143,251, 55,127,150,130,161,159, 39, 22, 60, 95, 8,197,235,142, 81,164, 66, 96,
+156,105, 12,237,156, 47,118,194,108, 23,138, 91,154,120,240, 6,208,212,129,247,165,198, 90, 76,204, 21,175,235, 10,187,171, 45,
+ 86,221, 26,117, 83, 69,120, 40,156,161,209,182,148,180,247,214,117, 77, 42,113,103, 33,188,135, 20,116,169,243, 50,130,200, 94,
+206,194, 90,199, 59,226, 9,134,167, 29, 80, 26, 42,228,206, 50, 85,132,206, 37,213,120,224, 11, 77,202,204, 58,136,239,189, 86,
+ 10,161, 98,246,121,226,141,179, 71,192, 5,120, 67,226,177,211,241,136,113, 24, 83,242, 27,189, 85, 21,197,127, 74,162, 53, 10,
+ 1,188,124,241, 12,231,243, 25,111,191,245, 24, 31,127,248, 93,182,214,133,108,209,205,108,215, 12,253, 72, 43, 42,145, 58, 34,
+ 37, 99,176, 75,126,158, 67, 88,234, 57, 98,224, 8, 0, 82,105,243, 52, 69, 73, 26, 35,255,224,211,143, 48,140, 35,190,252,124,
+134,152, 45,132,244, 60,201,146,156, 69, 17, 67,166, 36,124,112, 8,142,243, 0, 4, 21, 58, 78, 25,210, 85, 0,168, 42,141,115,
+223, 19,120, 75, 85, 16, 1, 56,159,137,237, 33,225, 81,105,137,174,173, 41,103,126,206,249, 1,177, 67, 39,188, 54, 23, 88, 44,
+114,163,239, 23,237,160,165, 18,116, 1,178,234, 59, 4, 79, 1, 45,156, 3, 47, 11, 97, 88,158,184, 33, 57,168, 40, 97, 80,194,
+179,248, 85,120, 70, 62, 7,192, 7, 87,184, 8, 36, 36, 60,172, 7, 20,200,130, 9, 3,158, 52,201,100,133, 14,156,125,144,194,
+204,128, 34,111, 33, 67,120,164,164, 53,145,214, 21,173,169,236, 76,225, 92, 34,135, 57,121, 30, 91, 91, 71,123,252,138, 51, 76,
+130,247, 80,193, 1,138,147, 22, 13, 61, 67,244, 61, 4,246,251, 61,214,171, 22, 79, 30,223,112,148, 56,159,177,126, 97, 78, 79,
+218,132, 0, 66,239,250,224, 19, 3,159,126, 22,159,166,129,233, 18, 47, 96, 57,233,127, 95, 64,116, 80,230, 94, 23, 43,200,156,
+147,170,203,147, 82,198, 11,230, 98,187, 14, 78,138, 41,125,234, 73, 72, 39,138,142, 47,142, 10,185,107,114, 33,164,131, 21,145,
+ 64, 38, 0, 23, 36,164, 4,140,245, 24,141, 32, 14,114,176,176,193,161, 82, 26,187, 71,143,240,205,243,175, 49,155, 57,141, 99,
+ 70, 99,225,132,196,237,253,129,148,156,222,162,174, 27, 12, 99,143,227,249,132,205,246, 26,222, 76,112,168,113, 26, 12,246,253,
+132,235,109, 7, 55, 77,104,155,138,243,217, 9,214,113,253,248, 9, 62,253,228, 19, 74, 22,242, 20,128,240,211,223,251, 9,250,
+190,199,195,233,140,255,241,191,255,111,240,147, 63,252, 35,252,252,151,191,128,132, 64, 45, 4,110, 30, 63,193,185,223, 35, 76,
+ 1,109,173, 48,204, 14, 22,129,130, 9,216,198, 17, 7, 32,148, 51, 77, 22,184, 97,154,168,171,143,149, 21,143,210,250,211, 1,
+207,190,185,199,187,223,185,225,129,200,146,196,150,157, 1,133,152, 10, 23,161, 2,151, 98,140,210,174,118,193,115, 79,251,120,
+ 17, 46,246,224,220,243,133,192,107, 4, 14,184, 72, 22, 57,145,122,198,180,199, 42, 66,245,130, 8,184,248,158,165, 81, 55,124,
+254, 94,128, 85,248,225, 2, 87, 27,109, 94,161,240,222, 47, 73, 56,165, 13,236,226, 66,140,197,136, 36, 69,127, 20,160, 68,191,
+112, 12, 11,114,214,227, 52,206,152, 39, 67, 22, 33, 51, 99, 24,206,248,250,155,231,232,207, 61,137, 45,121, 42,226, 57, 49, 43,
+ 93,232, 40, 47,117,130, 86, 88, 67,197,166,128,192,122,181,134,117, 22,149,174, 0,231, 82,246,178,117, 22,231,126,143,110,189,
+ 35,160,133,115,139, 7, 62,177,247,223,240, 30, 44,209,189, 66,100, 70,181,245, 30,227, 52, 81,196,166,243, 16,113,172,237, 51,
+ 18, 83,200,156,209,238, 3,237, 61,173, 15, 8, 74, 99,187,222,160,107, 91,180, 13, 97, 57,171,170,166, 93, 41,143,137,173, 0,
+204, 52, 99,127,234,113, 58,158,208,174, 55,168,153,170,168,170, 26,186,109,201,222, 38, 20, 21, 13,134,176,176,243, 52, 98, 26,
+ 39, 12,231, 51,250,243,128,113,154, 81, 53, 13, 42,165,224,107,205,158,123,206, 83,176, 22, 80,148,194, 38, 32,224,224,161,130,
+ 98, 33, 22, 49, 39,156,162,160, 22,197,228, 44, 37,178,195,152, 18,207, 12,166, 97,192,233,112,196,249,124,102,154,156, 72,123,
+118,201,148, 48,103,103, 40, 93,193, 90,194,151, 78,227, 25,175,111, 5,102,227,240,163, 31,124, 0,165, 37,196,223,178,190, 73,
+222, 12,254,220, 61, 19,201,178,131, 36,176,141, 45, 36,241, 83, 96, 54,185, 15,217, 81, 64,211,155, 56,158, 22, 73, 26,250,251,
+191,251, 67, 28, 15, 39, 58,224, 79, 7,192,228,203, 85,198,164,200, 20,219, 27,120,205,226, 88, 31, 33,161,148,164,160, 30,126,
+205, 67,127,130,110, 58,194,161, 6, 98,106, 72,149, 27,168, 74, 43, 56,175, 96, 12, 51, 31,124, 88,172,185,226,101,162,164, 76,
+185,238,144,154, 40,117,206, 37, 37,182,139,160,163, 88,176, 73, 89,240, 50,232,125,210, 17,193,203, 69, 8, 2, 21, 11, 33,228,
+162,151, 46,101,153,210, 13, 3,235, 21, 16,120,157, 20, 64,162, 71, 41,104,207, 46,242, 42,202,133,176, 16,206,130,187,114, 26,
+163,211,104, 62, 93,232,220, 28, 70, 74,155, 44,236,211, 81,131,226,147,198, 65,194, 57, 15,131, 25, 90, 9, 84, 85,197,218, 9,
+129,195,192,161, 59,150,158,205, 23, 47, 95,227,122,183,133,210,138,133,174, 49, 84, 37, 25, 26, 17,124,128, 9, 84, 76,164, 78,
+188,108, 20, 82, 54, 68,153, 72,137,194,129,224,243,206,156,215, 19,101,200, 16, 7, 7, 46, 92,206, 52, 25, 42, 5, 85, 81, 89,
+189, 64,216,196, 52,153,188, 51,201,200,196, 11, 32, 77, 42, 10,144,246, 69, 40,186, 40, 74,158, 17,144,193,193,134, 6,214,142,
+ 80,193, 64, 6,250,226,159,199, 51,156,179,120,249,106, 79,177,124, 10, 80, 74, 99, 98, 21,236,105,166,157, 71,211,172,209,247,
+ 22,118,154,176, 89,239,112, 60,191, 36, 15,248, 76,150,145,225,220,227,250,209, 91,216, 31, 79,112,206,226, 48, 58,116,181,130,
+ 12, 1,183,183,175,241, 15,255,163,255, 24,187,237,142,173, 53,244,122,173, 49,116, 64,205, 51, 62,249,240,125,244,125,143,247,
+222,190,198,231, 95, 60,197, 55,207,190, 6,236, 4, 99,201, 26,162,149, 66,183,107,112, 26,103,234,126, 66,156,110, 72, 40, 45,
+161, 43, 13, 33, 36,198,113,132,115, 30,171,171, 43,140,195,148,166, 32,206, 58,152,105,194,221,221, 61,158, 60,218,209,222, 9,
+ 89, 4, 38,138,185,117,194,175,198,207,160,200, 87, 11, 37,214, 55, 45,249,253, 69,202, 91, 88, 32, 84, 47,199, 56,249,129, 18,
+ 81, 31,156, 10,135, 16,242,133,227, 19,183, 61,175, 1,104, 47, 39, 22, 17,147, 9,190, 81, 10, 33, 11,214,116, 88,208, 20, 74,
+192, 81, 72,123, 54,113, 9, 45, 22,101,161,195, 63,167,140, 32,144, 34, 25,137, 15,208,105, 52, 41, 95,217,199,189, 31, 31, 72,
+227, 60,195, 59,143,135,227,137,166, 61,102, 78,135, 77,224,128,138, 88, 69,167, 86,128, 59,132,192,149,182,179,134,200, 77, 90,
+ 99,181, 90,195, 57, 3, 0,168,171,154, 64, 44,236, 69, 54,214, 66, 12, 61, 54,155, 43,156, 14,247,139,105, 67, 94,101, 45, 97,
+ 39, 33,100,111,115,114, 59, 72,153, 10,170,211,121,196,245,149, 77, 36, 49, 41, 40,168, 37,101, 47,120, 14, 94,145,180,246,146,
+ 2,104, 35,107, 65,107, 84,149,134, 82, 26, 90, 41, 40, 30,115, 7, 73,207, 70, 64,128,174,107,220,190,126,141, 47,191,254, 26,
+155,171, 43,168,245,138,186,246,110, 5, 85,183, 41, 81,209, 57, 11,103, 38,216,121,130,153, 39,140,227,128,190,239,113, 56, 28,
+233,208, 5, 96,218, 6,181,243, 8,186, 66,144,146,215, 4,158,198,149,222, 48, 63, 95,193, 5,151,186, 12,239,124, 98,240, 71,
+ 7, 73, 96,209, 31,141,249, 7, 12,231, 17,167, 83,143,227,169,135,241,153,127,157,194, 46, 60, 81, 2,154,166,131, 20, 36,146,
+146,156,156, 54,207, 19, 14,135, 61, 94,188,188,195,123,223,125, 43, 27,114, 46, 82,182,178, 91, 36,227, 76,105,212,158,117, 70,
+ 8,129,125,224, 5, 72,201,243,122,140, 21,224,137,181,144,210,212,232, 3,182,222,225,239,254,225,239,227,255,253,151,255, 26,
+ 66, 72,156,142, 15,240, 12,198,223,152, 0, 0, 32, 0, 73, 68, 65, 84,214,242,168, 89, 20,157, 90, 46, 55, 18,247,220, 57, 40,
+ 99, 33, 85, 38, 22, 26, 99, 48,206, 6, 90, 87,168,148,128,153, 29,154,154, 66, 86, 92, 76,121, 91,232,151, 88,113, 30, 66,177,
+202,138,130, 83, 65,115,200, 66,189, 78,163,112,131,192,177,174,113, 26, 68,216, 82,153, 46, 93, 81,100,222, 75, 33, 40,223,156,
+117, 6,170, 16, 44, 6, 0,149, 2, 12,159, 51, 46,248,130, 30,137, 98,236, 44,179,142,128, 53, 91,190,176,220,162,136, 50,245,
+158,138, 58,173,235, 20, 25,108,236,156,109, 99, 81,180, 93,224,151, 51, 95, 94,240, 68,203, 0, 65, 98,158,185, 57,211, 20, 63,
+108, 93,192,105,178,105, 50, 96,173,192, 87,207,190,198, 71, 31,190,191, 76,101,244, 14, 54, 77,245, 92,254, 94, 68,220,117, 8,
+140,232,205,129, 45,101,167,158, 45,222,197,239, 73,194,185, 28,242, 20,202, 30, 40, 42,252, 89, 88,173, 47, 13,104, 41,205, 51,
+191,157,116, 33, 72, 86,189, 23,200,184, 68,194, 90, 52,132,162, 64,115,135,196, 47,207,174, 55,129,113, 14,240,230,136,166,214,
+ 4,216,247, 62,121, 44,155,182,193,225,222, 64, 6, 79, 7,115, 48,236,181,149, 88, 85, 18,231,179,199,233,120, 68,219,214, 16,
+170,198, 60,157,241,228,209, 99, 60, 60,220,161, 91,109, 49, 79, 35,116, 85,163,239, 79,168,116, 69,227,178,224,112, 56,246,168,
+ 21,176,186,122,140,235,235, 27,116, 93,155, 30, 60, 33, 36,188,227,192, 12,107,225, 12,141, 57,191,243,157,239,224, 7,223,255,
+ 62,198,243, 25,125,223,227,203,167, 79,241,244,155,111,240,242,245, 61,130, 15,216,116, 13,186,182,193,225,116,230, 93, 17, 29,
+120,198, 24, 76, 19, 93, 22,154,201, 91,225, 60,166,107,216,199, 93,205, 60,225,243,175,190,193, 15, 63,121, 63, 85,104,226, 50,
+194,116, 25, 39,198,117, 96,120, 67,238,246,166,124, 49,179,247,243,184, 58,188, 25,112, 94,254, 59,139,204,241, 80, 88,230, 66,
+ 81,112, 32,237,236,249,129, 19,165,169,162,208, 91, 68, 24, 77, 26,247,251,172, 63,192, 27,184,226,236, 25,190,248, 25, 68, 17,
+ 50, 19,167, 5, 66,132,100,177,155,140,197,254, 52,225,124,158, 32,165, 64,173,107,200,224, 32,131,129,150,196, 71, 63,207, 20,
+152, 97,173,133, 49, 6,231,105,194,195,195, 30,243, 60,144,186,149, 83,186,200,222,227, 88,140, 19,237, 62, 25,141,232,157, 39,
+149,177,247,104,154, 14,171,245,150, 58,128,144, 85,248, 93,219,146, 66,157, 95,253, 52, 77,104, 59,149,131,146,194, 18, 52, 35,
+163,125, 69, 92, 14, 41, 66, 26,187,163,184, 52,134,105,198, 60,219,148, 28, 24, 1, 43, 34, 2, 84, 56, 88, 38, 10,116,164, 82,
+ 41,185, 75, 85, 21,164,174,168, 8,136,135,176, 80, 16,149, 34,145,144,215,208,117,131,245,122,131, 23, 95, 63,199,205,245, 53,
+ 62,248,224, 3, 82,171, 43, 77,251, 37, 85,193, 51,255,192,177,199,218, 76, 19,134,211, 9,135,253, 1, 46, 4, 84, 85,141,105,
+158, 81, 13, 35, 42,165, 40,106, 53, 0, 66, 73, 56, 47,144, 2,181,217,186, 20,147,175, 2,219,191, 92, 32, 93,128, 51, 52,241,
+152,199, 9,211, 52,162, 31, 71,244,253,136, 99,127,198,177, 31,200,243,157,103, 77,104,218, 21,132,160,103,174,174, 91,206,244,
+166, 73,134,247, 30,243, 52, 64,235, 10, 82, 8, 60,125,254, 18,235,117,139,235,171, 77,186, 68, 83, 19, 2,118,146, 64,164,125,
+185,228,194, 10, 34, 36, 5,118,132,114,249,144, 5, 94, 30, 62, 57, 72,210, 8, 94, 41,142,134,141,147, 41, 15,120, 26, 43,255,
+225,191,243,251,248, 87,255,250,231,144, 82,226,120,120,224, 61, 46,237,192,203, 40,193, 8, 50,241, 12,164,153, 1, 72, 71, 62,
+126,231, 60,103, 82, 24, 24,235, 96,148, 64,163, 21, 12,211, 53, 99, 70, 59, 65,110,144,196,159,180,154, 89,102, 32, 43, 69,238,
+ 4, 33, 21,139,182,232,210,113,206, 32, 56,114, 29, 40,185,124, 74, 35,153, 48,117,211, 28,163, 26, 47,103,201,162,190,152,254,
+ 29,255,158, 50,207,169,160, 13, 62,147,239,202, 98, 95,150, 65, 81, 33, 34,142, 11, 55, 12, 36,133,183,240,231,161,171, 26, 74,
+105,126,222,185,160,143,207,155, 64,161, 97, 98,177,157,164,169,145,103,145, 54,180,132, 12, 26,179, 48,104, 44,219, 44, 21,176,
+235,106,156, 89,207, 34,156,133, 21, 18,167,254,204, 28,123,153,112,193,129,221, 49,139, 93,120,153,105, 17, 50, 90, 88, 36,140,
+ 52,175, 95,211, 62,212, 47,156,100, 57,122,181,152,227,137,229,164, 37,198,159, 11, 4,134,207,188,177,179,148,121,217, 47, 22,
+250,252,220,173, 95,116,125, 11,245,110,162,197, 73, 62,204,233, 8,179, 94, 96, 26, 45,132,159,209,214,154, 14, 18, 33,208,143,
+ 19, 86,155, 14, 24, 5,250,211, 9, 15,135, 19,182,235, 22, 64,192,245,102,141, 97,162,142,119, 50, 6, 99,204, 30,118, 22, 79,
+ 30, 85,120,245, 48,160,110, 28,106,173, 97,167, 1, 85, 93,193,121,143, 90, 81,183, 60, 79,103,116,155, 45,165, 33,185, 25,127,
+246,167,255, 0,109,219, 82,254,179,162,234,145, 34, 79, 91,218,163, 58, 11,111,105,175, 26,189,188,214, 24, 4,231,240,209, 7,
+239, 99, 28, 6,140,243,140,227,233,132,127,243,219,207,241,151,191,250, 13,218,186,194,200, 76,120,239, 3,148,180, 41,254,241,
+100, 61,110,216,182, 65, 93, 23, 56,101,200, 16, 84, 98,158,113,123,127,196,205,213,186, 96,169, 23, 23,153, 40, 59,106,177,184,
+224,196,197,218,185, 20,143,229,236,117,252,237,225, 37, 89,186,251, 6, 72, 70,148,177, 61, 33, 7,165,100, 28, 33,237,255, 66,
+ 40,180, 23,133, 87, 44, 1, 85, 72, 22,146,217, 51, 16,139, 2, 33,239,217, 3, 39, 78, 33,217,236,202, 80,160,120,233, 77,179,
+197,225, 52, 97,156,136, 62, 86, 85, 26, 34,144,195, 33, 56, 11, 97,251,228,125, 31, 38, 11, 1, 15, 59,143,148,124,101, 45,102,
+ 51,227,112, 56, 36,111, 45,188, 79,217,219, 62, 74,154,131, 39,145, 16, 31,210,129,133, 68, 49,204, 66, 74,133,110,189,165, 81,
+177,157,179,184,144, 15,171,237,102,139,233,118, 76,252,134,113, 28,208,180, 43, 76,211, 88,192,101, 10,167, 64, 40, 55, 40,133,
+229,141, 33, 36, 34,159,144, 24,103,131,105,142, 81,157, 9, 23, 69,221,146,146, 41,123, 62, 93,236, 74,241,222,154,146,218, 28,
+ 4,130,117, 8,186, 2,132,166, 17,190, 53, 4, 74,169, 27, 40,231, 81,117, 43, 84,211,132,167, 95,126,133,171,171, 29,154,134,
+ 52, 46, 66,106, 4, 85,241, 72,214,192, 49,247,123,158,103,244,167, 19,198,105,198,106,181, 70, 0,112,232,207,144,106,100, 63,
+ 58,231,139,123,130,215, 32,120, 64, 42,222,169,139,148,207, 29,189,232,206,121,216, 64, 58,128,121,166,233,202,121,152,208,159,
+122, 28,206, 3,142,231, 1,147,229,139, 9, 2, 74,105, 70,208, 42,238,156, 9, 97,170,171, 26,206,186,116,241,106,161,248, 96,
+165,105,203,151,207, 94,224,106,187, 65,214,117,134,204, 85,242,121, 12, 42,101,198, 92,135,197,133,206, 23, 60,219, 14,125, 73,
+ 68, 12, 76, 74, 99,208, 78, 81,205,101,178,166, 32, 85,247, 79,127,250, 19,252,226,151,191,194,211,175,128,227,254,158,167, 48,
+158,115,185,179,184, 54, 78, 58,232,114,182,132, 4, 6,136, 51, 96, 28,140,117, 8,214,161,210,138, 44, 90, 2,176,134, 38, 25,
+214,186,148, 32,231,125,160, 2,213,131, 61,225,129, 19,210, 36,103, 32, 81, 70,183,227,177,187,181, 6,222,218,180, 70, 80, 74,
+ 34, 39,148,208,101,163,162,134, 70, 0, 80, 98, 65,117,244, 33,115, 55, 74,116,180,224, 63,203,133, 0, 29, 4,179, 62,138,240,
+169, 8, 11, 10,217, 81, 21, 82,212,105,193, 85,231,207, 91,233, 10, 82, 42, 88,107, 96, 45, 33,121, 11,105,110, 42,218, 2,135,
+218,144, 50, 94, 3,160,132,185,224, 5, 36,116, 98,181, 76,179,161, 17,124, 8,232,154, 10,187,182,198,125, 63, 82,190,137, 48,
+112, 86,226,111,190,120,138, 15,222,123, 59, 19,242,130, 91,224,213, 17,150, 33, 27,241, 50,143, 98,190, 32, 46,230,170, 9,202,
+229, 83, 3,157,146,217,252, 34,116, 58, 23,146, 33,134, 71,208,119, 76,127,107,234,101, 9,146,137,158, 78,145, 65, 34, 11, 63,
+112, 17,163,158, 41,115, 5,163,155,223,200,217,122, 88, 99, 33,188, 69,215,104, 34, 30, 89,139,217, 88, 32, 56,104,181, 70,215,
+ 54,232, 86, 29, 32, 4,142,253,128, 90, 2, 47,111,111,209,181, 45, 36, 2,214, 93, 7,169,107, 76, 67,143,217, 24,188,120,249,
+ 26,117,183, 70, 63,156,161,132, 64,219,173,104,183, 84,213, 48,194, 98,154, 71, 82,191, 31, 14,144, 90,225,238, 97,192,147, 39,
+111, 99,183,189,161,241, 95, 32,198,183,144,146,208,149,206, 33,132,138,118, 89,188,211,240,206,209, 30, 48, 16, 78,209,172, 87,
+152,167, 25, 55, 87, 87,120,114,115,131, 31,126,255,123,248,167,255,252, 95,224, 87, 95, 61, 79,160, 20,120, 1,131, 60, 5, 80,
+188,219, 34,131, 38,237, 7, 17, 2,197, 24, 78, 35, 94,221, 62,224,241,205,150, 49,177,229,222,117,249, 70,139,111,179,212,138,
+156, 76, 36,226, 5, 20,138,205,123,250, 13, 62, 37,182,133, 98,164, 29,125,165,192, 5,180, 46,218, 16, 99,215, 81, 2, 35,130,
+128, 16, 30,222, 75, 8,153,133, 80,254, 50, 45, 13,146, 73, 78,254, 50,243,245, 13,106, 90, 26, 31,165,128, 22,122,237,214, 58,
+236,143, 35, 78,253, 72,107,143,118, 69,232,208, 70, 16, 64,200, 77, 8,158, 20,179,129, 9, 77,150,211,164,198,113, 32,171,142,
+146,152,231, 30,198, 90,156,207, 3,166,105,128, 53, 6,194,145,125, 45, 64, 66, 10, 10, 56,145,224,221, 23, 88,196,226,243,107,
+139,175,115,179,187,198,122,179,131,157,198,197,195, 21,138,103,165,109, 59,156,135, 62,119,218,222,101,152, 73,177, 10, 17, 11,
+ 64,214,146, 64, 19, 71,239, 82, 72, 56,111, 9,233,233, 2,134,113, 36,223,182,181, 8, 85,149, 14, 71, 18, 41,210,119, 89,198,
+ 76,119, 22,105,122,235, 16,132, 3,132,133,148, 21, 52, 12,117,250, 90, 3,186,134,240, 22,194,121,218, 69, 54, 13,234,213, 26,
+167,251, 91, 60,127,246, 53, 86,155, 45,170,245, 22, 74, 86, 8,144,240, 66,193, 11,199,197,169,197, 52,142, 56, 30,123,248, 0,
+168,186, 38, 84,236, 52, 67,106,133,102,172, 83,151, 91,235, 10, 96,212,166,151, 68,182,147,162, 24,115, 35,234, 17, 28,140,115,
+ 28,211, 57,226,212,247,212,157,159, 7, 28,251, 9, 99, 76,140,243, 1,117, 93,163, 91,109,104, 69,200, 60,116, 33, 5,140,157,
+211,229,155,156, 29,130, 70,170, 74, 74, 24, 51, 99,191, 63,194, 88, 78,145, 19, 50,225, 74, 3, 11, 59,211,223, 3,185,187, 18,
+153,226, 21,173,134, 66, 82,119,234, 93,198,211, 38, 0, 84, 72, 25,135,144,108,159,138,203,200, 8, 36,144, 82,226,199, 63,250,
+ 1,234,170,194, 95,255,114, 68,127, 52,140, 85, 45,151, 97, 52,237,176,206, 35,192, 38,165,117, 76,141,156, 45, 53, 59,150,215,
+ 47, 94, 73, 84, 58,119,144, 54, 18,224, 68, 94, 57,198, 11,222, 58,151,108,120,113,175,236, 5, 9,210, 34, 45, 46,166,164, 65,
+210,133,175, 8, 98,146, 5,176,233,168,145,201, 1, 20,223,211, 37,112, 38, 36,161, 26, 56,146, 58, 56, 7, 40, 9,199,226,225,
+176, 28, 30,164,208,170,136, 78,205,252, 11, 82,239, 72,169,248, 66,151,169, 89, 10,137,127, 34, 22, 74,164,192,126,114, 33, 21,
+105, 93, 64,168,216, 56, 13, 81, 69,186,223, 48, 17,253, 83,243,180,235,122,213, 96,127,158,184, 91,247,176,194,192,204, 26,102,
+ 54,144,204,249, 15,222, 23, 13, 48,159,133, 60, 13, 72,118,180,144,167,162,178, 56,195, 75,226,165, 44,114, 33,210,164,174,136,
+221, 46,183,152, 82,200, 44,183, 21,128,250,251,127,242, 31,252,185, 64, 78,226, 42,243, 90, 99, 16, 75,206, 92, 71,130,199, 44,
+236, 31, 2, 5,207,236, 82,242,195, 7,209, 48, 2,206,162,213,146,246,112,198,114, 8,193,140,171,171, 43, 8,120, 28,143, 7,
+204,214, 97,127,127, 7,103, 13,102,107,240,104,183,161, 47,156,119,120, 56,244,168,181, 66,211,212,240,206, 97,154,231,228, 79,
+ 21, 2, 56,115,146,144,170,169, 66,119, 60, 6,157,166, 17, 85,221,226,167, 63,254, 12, 79,158, 60,130, 51, 19, 42, 85, 97,181,
+222,177,168,198,167, 4, 31,153, 56,196, 34,141, 45, 35, 76, 65,241,136, 83, 87, 68,173,147, 0,180,214,120,180,219, 33,152, 9,
+207,111,239,201,110, 19, 69, 75,252,158,109, 54,107, 28,251,115, 97, 77, 3,103, 8,215, 9, 4,210,143, 22,215,187, 85, 18,200,
+ 37,213,122, 92,115,132, 12, 33, 89,100, 70, 23,108, 56, 47, 46, 56, 3, 73,200, 24, 10,238,184, 72, 99,156, 80, 8,240,194,226,
+239, 4,222,192,187, 33, 7,242,200, 69, 40,140, 44, 34, 75,151,124,249,165,189,236,130, 24, 23, 68,234, 86,210, 61,198, 26,135,
+195,105,196,171,135, 1,183,247, 39,244,253, 68,201,100, 82, 66, 33,192,142,103, 56,107, 32,188, 69,112, 6,214,140,233,161, 68,
+ 32, 69,180, 49, 51,172,153, 81, 73,240, 24,211, 97,156, 12,198,113,164, 61, 44, 23,146, 8,142, 11,142,216,133,147, 72, 46,122,
+120, 69, 84,167,179, 72, 72, 50,218,119,181,217, 65, 73, 73,209,172, 92,248, 17,108,131,148,220, 73, 97,207,227,229, 88, 52, 41,
+142, 57, 93,236,203,211,131,202, 66,191, 66,141, 45, 5, 65, 84,164,228,139,144,215, 2, 74, 73,108, 86, 29,186,186, 70, 93,211,
+254, 80,113,151, 42,121,199, 43, 10,246,190,153, 38, 24,239,136,124, 23,242,250, 68, 50,254, 85,213, 13,100,213, 16, 60,132, 85,
+243,129,211,230,134,254, 68, 36,184,166, 5,148,130,144, 21,102, 86,186, 79,195,128,211,241,128,151,223, 60,199,151, 95, 62, 77,
+187,196,135,253, 1,195, 76,192,155, 8, 6,137,107, 12,159,144,168,180,115, 44, 99, 52,173,243, 48,198,194, 88,131,201, 88,140,
+227,132,243,249,140, 19,143,219,143,195,136,209, 90,248, 0,180,221, 10,109,219, 49, 33, 76, 50, 38,213,103, 93,138,160,252,244,
+248,223, 74,107, 52,140,169, 61, 28,143,152,102, 2,228,188,251,206,219,156,158, 88, 70,223,138,164, 3,145,201,147,238,211,212,
+ 40,141,149, 89,196, 24, 16,146,248, 75, 42,181, 40, 0, 66,129, 27,139, 49,167, 17, 86,146,113,166,244,108, 94, 95,239,240,240,
+112,196, 56, 14,176,142, 18, 41, 61, 22,190, 83, 22,227,121,120,231, 97,189,195, 56, 77,152,102,131,217, 80,216, 79,236, 24, 69,
+161,129,178,188,126,136,147, 68, 95,236,209,125, 18,149,146,159, 91, 74, 74,220, 35,242, 32,185, 26,146,176, 45,189, 7,249, 88,
+200,163,119,110, 98, 80, 76,150,178,249, 42,163,170, 56,153,179,204, 74, 47,189,255,226,146,119,145, 70,231, 5,185,175, 8, 9,
+ 83, 82, 17,183,157,177,175,142, 11,245, 40,222,147, 23,248,108,178,218,105,104, 69, 69, 64,116,136,160,136, 15, 47,117, 13,154,
+ 25,244, 74, 73,172,218, 6,227,108, 49,218, 60,238,151, 82, 98, 54, 14,171, 70,167,179, 35,151,237,158,149,100, 34,179, 91, 66,
+ 40,240,110, 49, 85,238, 98, 55, 94,216, 92, 47, 83, 43,211, 87,167, 48,153,199, 30, 60,158, 39,186, 60, 96,114, 37,181,196, 99,
+132, 34,120,133,118,168, 28, 65, 83, 18, 20, 67,161,164, 20,249, 69, 82,245,163, 32,189, 37,118,187,240, 56, 77,212,101, 76,204,
+ 38,150,138, 94, 76,219, 52,120, 56,156,240,199,127,252,199,248,127,254,217,255,141,113,180, 24,102,218, 79, 59,239, 81, 85, 21,
+102,235, 16,230, 25,231,113,162,241,145,165, 29,134, 99,166,178,215,192,232,122,212,186, 34,229, 39, 2,174,118, 59, 60, 28,246,
+120,239,221,191,139,105, 28,161,133,128,115, 22,227,216,163,237, 86, 88,111,174, 16,130, 43,198,198, 30, 81, 17,147,188,207, 92,
+133, 7,103, 89,152,196,111,176, 82,104,234, 10,191,243,221,119, 48,143, 35,190,184, 63,226,238,216, 67,241,110,197, 7,137,227,
+233, 68, 7, 50,143,168,100,200,194, 19, 41, 37,230,105,196, 97,239,209, 63,218, 97,221,213,184, 8, 27, 47, 93,224,111,180,187,
+ 73,193, 30,150, 10,138, 56, 81,241,229, 14,157, 15, 18,207,151,254,114,119, 45, 46, 24,116, 69,167, 46,222, 12, 46,200,104, 86,
+191,248,210,189, 49,118, 66, 46, 48, 68,153,227,206, 59, 75, 9,160, 31, 45, 78,103,155, 94, 87,240,150, 20,215,108, 27, 12,188,
+207,115, 60, 18, 15,110,198,232, 61,218,138,108, 73, 21, 2,230,121,128,224,145,173,103,187, 14,237,124,249, 33,243,150, 58,220,
+105,194,108,102,212, 74, 20,184, 73,166, 49, 33,164, 84, 43,197, 83,143,244, 48,113,197, 45, 21, 61,132,214,146, 63, 91, 43,201,
+ 15, 56, 93,170,193, 57,238,252, 5,195, 95,108, 94, 89,149, 4, 64, 33, 22, 94,104, 33, 69,105, 60,161,183, 72,138,116, 73,163,
+ 56,200,198,137, 16,163,198, 90, 56,239, 82,210, 97,144,153,162, 23, 73,100,198, 57,204,150, 80,174, 1, 52,162,175,234, 26, 74,
+173, 16,116, 3, 72,149, 19,216, 20,241,201,181,153, 9,118, 82,215, 24, 78, 35,190,248,226, 11, 56, 8,220, 12, 19,218,237, 21,
+160, 42,114,112, 28, 15,120,253,242, 5,158,126,245, 12,183,247,123,200,186,130, 59,246,232,135, 17, 77,215, 98,182, 22,167, 97,
+132,245, 30,205,108, 48,114,231, 83,197,120, 99, 41,146,208, 44,118,137,214,154, 52,118, 31,198, 17, 39, 30,183, 31,135, 9,227,
+108,225, 5,160,235, 6,186,170,147, 8,151,196,119, 25, 15, 92,158,105, 85, 85, 67, 72, 26,175, 30, 14, 15, 64, 8,168,234, 6,
+235,205, 46,165,140,149,151, 69, 2,156, 0, 80, 42,219,168,226,247,216, 95,140,223,227,136, 62,218,221, 2,119,107, 17, 14, 3,
+142, 71, 22,151,187,249, 82,242,202,196, 66, 33, 4,222,249,238, 59, 56, 29, 15,240,206,192, 26,208, 58,144, 61,238,190, 32, 55,
+ 83,179, 68,144,157,201, 24,190,208, 9,121, 26, 56,193, 79, 8,197,150, 51,201, 88, 83,177, 80,155, 43, 30, 65,107, 65, 9,101,
+ 82, 72,138, 58, 69,192,108, 45, 16,253,223,252,220, 9, 22,190, 57,246,231, 71, 75,156,226,171, 51,138,215,162, 62, 38, 33,139,
+147,131, 4,105, 66,128, 66,132, 27, 79, 23,153,130,116,100, 58,235, 50, 31,163, 20,212, 34, 95,232,186,162, 52, 57, 59,243,107,
+247, 41, 57, 45,175, 43,153, 79,193,171, 26,165, 43,250, 89, 25, 80,196,213, 9, 69,228, 58, 15,105, 35,125, 79, 96, 28,103,180,
+117,205, 14,153,128,155, 77,139,195,121, 78,235, 24,107, 13,230, 89,165,181, 87,250,238, 21, 34, 63,222,157, 20, 16, 86,145,245,
+ 68,101, 38, 69,160,245,236,162,211, 89,206,192, 19,193,114, 41,156,202,246, 87, 4,124,203,165, 94,164,113,165,110,189,216, 76,
+ 8, 22,128,200, 11, 74, 89, 98,110,251,184, 51, 16, 28, 47, 26, 48,156,238,161,149,132,150, 36,126,163,204,234, 9, 82, 73,212,
+117,155,178,134,199,105,198,213,110,139,215,175,111,209,214, 36,120,154,166, 9, 93, 83,195, 6, 82,149,107,173,112, 30, 38,184,
+ 48,144,247, 83, 73,138,123,180, 22,155,182, 73,233, 64,136, 64, 14, 99,112, 30,206,240,214,225,124, 58,161,214, 26,222, 26,116,
+109, 7,107, 29,102,231, 48,142, 35, 89,124,234, 26,149, 82,104, 87, 27,136,224, 49,143,103,216,105,226, 73, 1,167, 33, 89, 75,
+ 95, 26, 22, 8, 57, 75,144, 9,165, 43,192,123,188,115,181,193,167, 31,127,136,191,250,245,231, 56,158, 7, 72, 8, 28, 79, 39,
+ 56, 31, 32,165,231,202,158,193, 11,206,194, 57, 10, 68,240, 83,192, 23, 95, 61,199,143, 63,251,240, 34,100, 85, 20, 89,234, 75,
+245,180,143, 20,172,226,179, 14, 11, 16,204,101, 46,187,200,169,100,223, 26,236, 26,107,203, 98,132, 94,248, 48,211, 67,139,191,
+157,175,153,247,241,178, 16,135,197,111, 47,253,201,214, 1,253,224,177,231,228, 58,165,168,235,173,170,138, 41, 85,220, 57, 59,
+139,217, 59,212, 82,160,214, 2, 62, 56,204,198,208,143,106, 70,140, 86, 98,189,234,210, 14,173,107,106, 56, 79, 2, 44,231, 44,
+ 93, 44,231, 1, 74, 73,156,250,158,232,131,118, 70, 37, 5,249,129, 61,229, 91, 59,235, 96, 66,238,162,232,249,230,253,180,148,
+ 80,220, 73, 72, 93,195, 9, 38,202,121,151, 47,124,238,208,165,100,175,173,181,144, 74,163,214, 53,108,109, 49,205,115,122,112,
+ 21,251,128,133, 88,114, 7,162,205, 77,198,195, 72, 4,134,146,228, 93,101,252,103,198, 57,244,195,132,217, 24, 58,240, 67,145,
+ 19, 16, 28,130,210,180, 3,229,192,163,104,131,115,206, 83,158,121, 32,229,126,109,102, 56,173,224, 0, 26,191,243, 84, 64,234,
+ 6,170,110,128,218,192, 87, 13,190,124,254, 2,251, 83,143,183,223,189,199,230,234, 26, 74, 85, 52,190,190,191,199,211,175,190,
+194, 23, 95, 61,167, 28,131, 97,130, 0, 80, 55, 53,137,216, 2,224,252,132,113,158,105,231, 42, 21,130, 84,201,102,183,105,106,
+220,172, 27,172,219,134, 99,137,163,238, 33,238,209, 71,156,206, 35, 78,227,132,201, 58,184, 16,160,116,133,182,237, 10, 81, 39,
+119,138,188,166, 16,146,214, 93, 49, 62,179, 63, 29,168, 64, 98,126,122,221,116,168,185,195,167,208,153,166, 32,195,229, 11, 90,
+ 74,153,166, 10,177,224,202,103,157, 76,235, 38,193, 83,134, 40, 16,206, 76,134, 34,178, 58, 42,244,227,216, 62,145,197,179, 85,
+ 52, 78, 3,222,255,157,119,112,255,176,135, 49, 51,134,211, 1, 22,128,115,185, 91,134, 15,133, 18,158,186,111, 99,168,112, 84,
+130,118,178, 49, 52,201,123, 1, 40, 13,173,114, 5,111,249, 53,198, 29,125,165, 43, 80,235, 35, 83,164,168, 51,236,240,136, 29,
+111,156, 50, 48, 79,192,249, 28,102, 67,211,221,104, 99,203, 90,157,200,161,136,153, 36,209, 91, 83,202,182,147, 6, 72,128, 25,
+ 15,220, 73,243,225,229, 66, 72,204, 6,138,156,144, 92,120,171,244,121,134, 64,202,255,132,170, 45,176,208, 41,139, 92,114,215,
+ 94, 92,232,164, 73,177,169, 96,137,206, 29,231, 60,172,200,107,148, 97, 54,104,103,186,216,173,117, 88,183, 13,154, 74, 99,118,
+ 81,208,232, 97,140,132,177, 30, 77, 93, 21, 24,107,145,168,154,113, 71, 45,196, 50, 2, 59, 44, 24,223,165,235, 44,135, 61, 69,
+ 45, 19,164,132,140,147,155, 76, 26, 33, 93, 10, 51, 12,226, 12, 64,151,234,232,178, 91, 7,219,219,124, 33,146, 18,241,127, 47,
+198, 84,178,240,200,133, 11,226,205, 60, 91,244,199, 19, 42, 37,208,213, 84, 12, 40,165, 17, 88, 25,222,182, 53,116,173, 19,151,
+122,189,162,188,229, 97, 80,248,193, 39, 31,227,229,139,231,120,216,239, 49,112,178,217,112,238,177,221,108,160,130,197,205,102,
+133, 97, 28, 97,157,165, 93,150, 38,155,206, 48,205,168,180,134,225,131,115,182, 30, 16, 51,186,174,197,126,191, 71,240, 30,211,
+106,133,177, 27, 41, 94,117,154, 82,126,122, 85,105,104, 77, 93, 72,219,174,208, 53, 91,204,144, 60,198, 15,152,199,137,243,145,
+ 41, 88, 34,170, 77,189,247,112, 28, 11, 59,246,103,232,166,193, 79,126,240, 49,180,174,240, 23,255,230,215,120, 56,244, 52, 10,
+132,162,253,102, 8,148, 61, 45, 36,164,210,176,134,190,217,131, 16,248,205, 23, 47,241,253, 15,190,131, 66,228, 94,120,103, 73,
+ 56,140,203,152,200,128,101,194, 91, 88,170,168,151,224, 19,153,196, 45,197, 86, 55,239,103, 80, 98, 22, 69,234, 68,132, 92, 86,
+143,111,162, 94,240, 45, 96, 21,130,129, 88, 7, 28,123,131,113,206,132,168,121,162, 29,249, 52,156,120, 52,235, 49, 13, 39,104,
+165, 96,205, 76,133, 99,112,208, 44,250,241, 94, 99,178, 14,179,153,209,112,252,231,170, 33,240,198,163,235, 45,228, 64,128,137,
+196, 11,224,136,206,113,154,160,217,247,108,230, 17,149,146,140,252, 45,190,239, 82, 64, 5,137, 32,217, 19,204, 15, 22, 93, 14,
+116, 24, 41,169, 97,188,131,212,100, 91,179,102, 78,161, 30,222,199, 44,247, 44, 88,145,140,132,109,154,150,198,253, 96,155, 89,
+ 16, 11,145,224,165,243, 32,235,106,100, 26,239,225, 98,191, 38,165,196,121, 28,169, 91,143, 30,226,228,249, 97, 63, 56, 3, 79,
+ 28, 35,108,199,105,198, 48,144,198,160,174, 42, 12,231, 51,206,167, 35, 54, 93,135,213,106,133,182,107, 81,183, 43,136,170,134,
+106, 26,172,171,183,224,160,209, 15, 35,102,161,240,171, 47,158,225,171,231, 47,209,118, 29, 32, 5,230,201,224,112, 60,225, 56,
+ 76,132, 20,214, 10, 85, 18,116,145,174, 4,186,134,149, 21,117, 80,222, 82,193, 81,124, 39, 79,195,128,111,238,129,109,219,224,
+201,213, 6, 77, 69, 5,174,153,103, 12,227,132,126,156,112,158, 12,102,254, 25,235,182, 67,221,182,169,217,144,197, 28, 56,120,
+ 15, 23, 92,218,225, 74,102,134, 87, 21, 37,114, 73,165,104,228,170,232,210,127,252,232, 6,191,247,147, 31, 20,133, 42, 39,172,
+ 49,114, 55,118,180,146,149,217,203,236, 4,207,131, 60, 22, 41, 65, 16,164,133, 83,202, 34,192, 36,126,182, 62, 68, 94, 60,169,
+224, 61, 95, 94, 73, 67, 83,118,162, 33,224,223,250,209,247,113, 58, 30, 17, 66,192,249, 68,129, 66, 54,102,157,167,213,133,231,
+ 44,116,250,140,227,125, 32, 35,193, 18,180,254,169, 52,171,194, 37, 31, 30, 2, 68,107, 3,125,103,181,214,240,160,231, 3, 66,
+ 32, 88, 75, 78,160,100,227, 19,233,122, 73, 86, 54, 6,182,200,144,215, 19, 50,173,123,202,201,134, 88,232,175, 36, 51,220,165,
+144,233,130, 79,171, 93,126, 61, 10, 62,197,118, 7,231,115,226, 98,188,236,164,132,210,138, 61,232,244,204,123,110, 2,242,249,
+148,213,246, 81,159,147, 84,253,160, 16, 26,235, 44,202, 96,221,184,187,247,209, 39,239, 92,138,130,157, 38, 3,219, 57,122, 63,
+107,137,109, 87,225,245,225,156, 8,149,214, 90, 28, 78, 3,222,122, 84, 21, 32, 35,207, 23,110, 72,124, 2,148, 54, 60,153, 4,
+ 23,185,115,191, 80,179,199, 6,144,252,232,161,160,252, 21,186, 35,228,130, 50, 54,227,234, 79,254,244,207,254,156,118, 34,114,
+177,215,136,123, 93, 25, 82, 76, 87, 6,162, 68, 36, 42, 99, 42,197, 34, 13, 43,127,160,118,114,176,102, 70, 83, 43, 82, 98, 90,
+ 7,107, 38,156, 78, 61,186,174, 69,211, 52,164, 82, 30, 6,130, 67,204,180,171,123,252,232, 17,246,247,247,216,238,182,216,109,
+ 58, 56, 75,164,171, 90, 19,116, 97,211,181,216,178,157,172, 82, 10, 74, 9, 56,235,152,210, 6, 76,206,161,214, 21,169, 64,131,
+ 39, 15,174, 39,165,179, 49,148, 62,101,102, 26,243, 89, 78,222,178,142,132, 63,209,135, 60, 79, 3,134,254, 64, 29,181,181,232,
+218, 45, 14,251, 59,204,150, 70, 93,253,233, 72,225, 18,214,225,212,247,184,127,120,192,253,221, 61,134,113, 66,144,196,200,110,
+154, 26, 31,188,247, 93,124,246,189, 15, 48,142, 35, 14,231, 33,117,104, 66, 18, 66, 52,118,195,113,204,229,188,199,102,187, 65,
+ 93,233, 69,167, 28,177, 6,209,134, 17,237,129,201,146,246,230, 74,155, 6,177,145,107,141,188, 74,200,114,136,203,161,123,217,
+129,231,125, 77,178,127,240, 40, 15,178,220,189,139, 69, 48, 69,156, 32, 12,147,199,253,254,140, 87,183, 7,188,186,219,195, 11,
+133,190, 63,177, 26,188, 39,145,224, 56,192, 89, 3, 51,159,161, 56, 22,215, 26,210, 94,104, 9,104, 25,224,152,155,174,149,128,
+115,134,236, 26, 8,232,106, 13, 19,128,201, 82, 50,151,243, 30,198, 56,172,154, 10,195, 56, 66,202,128,102,213,225,116, 56, 64,
+ 74,137,211,254,128,121,158,201, 61,225, 44,218, 74,167, 93, 95, 74,199, 2, 0,161, 8,197, 89,236,179,148, 84,168,170, 6, 66,
+210, 1, 72, 94, 97, 3,137,156,203,172,152,103, 78,128,146,232,209,245, 88,177,136,107,158,103, 38, 50,138,197, 24, 46, 71,222,
+137,148, 2, 22,127,191, 82, 44,230, 73,158, 87,207,255, 14,122, 94,187,166,198,170,107,211, 94, 93, 10,153,153,209, 25,114,128,
+ 16, 2, 94,221,222,225,249,179,231,100, 73, 19, 18,175,111,111,241,242,171,175, 48,158,142,152,207, 61,236,112,134, 55,172, 77,
+144, 26,147,153,113, 30,135, 68,137, 51,206,225,208,159,113,127, 60, 97,127,236,209, 79, 51, 76, 16, 52,190,103, 45,128,172, 59,
+168,118, 3,168,138, 1, 53, 52,141,138,201, 95,145, 30, 39,165,226,117, 5, 5,222, 56, 72,156,102,139,251,126, 64,127, 30,112,
+ 26,232, 66, 31, 38, 3,227, 61,164,210,104,186, 21,237,205, 11,172,166,139, 4, 64,111,211,206, 27, 34, 91,205,242, 56, 94,162,
+105, 90,116,235, 45,126,242,227, 31,225,247,127,247,135,120,235,201,205, 27,101,105,220,201,167, 75,182,152, 98, 74, 89,172,189,
+226, 5,224, 67,225,173, 14, 75,189, 4, 3,108, 34,160, 70,138,172,101, 41,195,148, 11,253, 24, 19,245,168, 59,219,237,182,184,
+187,219,243,136,151, 58,117,103, 29, 92,240,176,124, 78,184, 66,152, 37,132,128,226, 17,187,146,185, 72,128, 0, 52,159,155,165,
+135, 28,124,209, 73,214, 29, 36,246,128, 53,169, 48, 42,114, 28,211,229, 27,149,225,222,231,109, 95,130,163, 68,145,157,207, 54,
+ 87, 95,228, 61,196,159, 89,177,103,127,153, 54, 89, 88,206, 74,119,149, 40,216, 13, 60,110, 87,170, 74,239, 75, 68,241,198,203,
+188, 8,111,100,130, 36,143,220, 85,197,137,107,140,129, 46,210, 30, 47,215, 0, 73,167, 20,137,141, 82,162,109, 27, 52,117,157,
+ 86, 24, 15,253,152, 68,112, 84,172, 8, 92,239, 86, 75,139, 89,249,105,151, 63,155,100, 64, 13, 79, 46,211, 81, 16, 53,108, 69,
+ 66, 96,116,201,100,141,196, 50, 72,230, 82, 5, 37,132,128,150, 82, 94,176, 99,227,155, 25,138,125,170, 79,149, 82,224,213,191,
+243, 30,144,161,200,189, 46,163,192, 3,230,201,162,239, 79,208, 34, 16, 12,129, 71, 68,195,100,160, 42,141,186,105,240,226,235,
+ 47,177,123,235,187,168,155, 6,227, 56, 96,187, 94, 99, 54,116,217,234,186,193,139,103, 95,192,135,128,171,221,150,172, 5,124,
+169,244,211,132,186,170,209, 74,137, 90, 81,240, 74, 93,213,184, 59, 28, 49, 27,131, 70, 75, 24,142,100,149, 66, 98,127,238,209,
+194,227,139,241, 25,214,171, 22,219,245, 26,187,237, 6,187,237, 22,219,221, 22,235,245, 26,235,142, 50,212,219,174, 67, 83,215,
+168,181,166, 29,254, 60, 3,222,163,239, 79, 24,199,145, 70,230, 16, 56,245, 61,134,121,134,113, 1,167,227,145,254, 57,143, 57,
+ 49,142,152,134, 17,117, 69,228, 46, 89,215,248,233, 79,126,132, 79, 15, 71,252, 95, 63,251, 11, 8,102, 34,211, 56, 63, 79, 62,
+ 66, 32,218,220,151, 79, 95,224, 39, 63,252,104, 65, 77, 18,165,152,141, 23,230, 33, 62, 89, 34,147,106,100, 12,151, 64, 86,127,
+ 74,137,148,185,187, 80,185, 92,236,112, 23, 95,236, 11, 31,123, 73, 63, 75,194,187,100,169, 0, 78,131,197, 48, 57,198, 85,106,
+156,251, 19, 29, 98,206, 65, 43,141,161, 39,122, 86,176, 4, 45, 17, 28, 3, 25,225, 41,176,164, 98,111,180,130,181, 51, 52,191,
+206, 85,219,194, 91, 7,203, 86, 29, 4,178, 1,173, 87, 29,206,195,136,174,238, 18,201,171,174, 42,120,118, 94, 12,147,193, 52,
+223, 99, 50, 22,128,192, 48,207, 16,193,163,130,135,170,170, 66,145, 27,125,163,252, 30,169, 40,113,241,172,110,102,213,116, 85,
+ 67, 4, 73,211, 26,222,115, 74, 14, 58, 81, 41,160,196,243,106, 74,100, 6,191, 16, 88,175,183,152, 38, 66,107,198,241, 34,233,
+208,194, 27,154,196,144,166, 95,113,244,158,101, 62,178, 56, 1,214,235, 14, 62,144,237,198, 90,203, 22, 38,177,136,236, 85, 82,
+ 64,233, 6, 74, 74,236,186, 21,134, 85,135,213,170,195,187,239,127,192,191,214,227,235,175,190,196,223,124,254, 21,174, 86, 13,
+118,219, 45,118,215, 55,216,220, 60, 66,181,189, 38,219, 19,168, 64,109,187, 22, 1,164, 8, 54,214,194, 5, 64, 86, 13,148,170,
+ 25,119,233, 32, 21, 69, 90,210,100, 43,163,110,105,143,236, 51,173,143,189,195, 21, 11,243, 32, 21, 60, 4, 81,248, 56,209, 43,
+149,159,145, 99,193, 78, 6,164,195, 54, 35,102,227, 95,139,216, 49,202, 0, 41, 21,154,182, 67,183,222,226,211, 79, 62,198, 7,
+239,189,147,252,228,201, 87,206,251,238,232, 71,247,161, 20,102, 81,231, 46,101, 60, 80,139,241, 41, 19,217,188, 15, 11,128,149,
+144,226,130,233,127,153, 1,158,173,162,165,213, 41, 62,134,222,211, 57,235,248, 82,253,238,187,239,224,235,231,160,245, 97,152,
+224,226,218, 46,198,231, 70,129, 87,212,162,164,187,140,248, 17, 46,193,106, 72,176,168, 20, 95,122, 78,176,142, 73,165,247,204,
+145, 9,254, 34,215, 35, 64, 92, 56, 90, 22,235, 61,207, 63,143, 8,128,141,121,243, 33, 9,234,104, 29,149,243, 38, 18,192,135,
+185,255, 94, 98,249,250,163,187, 0,130, 2,166, 80,100, 2,128,120, 12, 74, 87,212,120, 57,206, 64, 96,140,239,114, 96, 40,146,
+232,151,118,232,154, 69,113,156,192, 88,252, 44,244,251,121, 62,153,162,184,233,189, 51,142,206, 78,195,129, 94,107,103, 33,172,
+128,150, 84, 56,185, 34, 69,207, 89, 91,232, 6, 66, 1,195,228, 40,234,162,114, 40, 89, 46,151,126,114,177, 88,178,163,204,180,
+206,215,183, 20, 23,144, 50,177,112, 19,169, 63,249,211,255,240,207,203, 92,243,112, 33,173, 15, 69,238,107, 40, 82,218, 66, 81,
+211,248,111, 97, 45,238, 15, 61,188,153,208, 84, 18,109, 93, 99,156,102,246,165, 7,108, 55,107,252,252,151,191,192,191,250,197,
+ 95,227,179, 79, 62,133,117, 22,198, 88,116,109,131,201, 24, 84,186,194,122,213,161, 63,220,163, 82,212,229, 59,231,240,157, 39,
+215,105,100,236, 13,217, 22, 72, 29, 44, 17,156,199, 91,111,191,141,205,246, 26,253,233, 8,165, 20,102, 67,106,207,105,158,160,
+154, 22,163,113, 48,227,132,227,177,199,195,225,128,211,233,132,161,239, 49,141, 35,241,216,217, 38, 68,234,223,156, 59, 29, 51,
+163,199,225, 12,235, 60,134, 97,192,241,120,196,121, 24,112,234,123,188,126,253, 26,119,119,247, 56,157, 78, 9,136, 33,148, 34,
+254,187, 34, 65, 80,165, 53,116,165,112,213,214,120,126,247,192, 17,148,117,178, 44, 9,144, 31, 52, 89,158,100,141,237,186,205,
+ 76,125,228, 14, 46, 94,178, 62,117,151, 34, 91,163, 68, 72,157,121, 73,122, 75, 21,177,200, 16,154, 28, 72, 83, 8,233,138, 86,
+ 94, 20,246,186,228,123,150, 18, 62, 8, 28,207, 51, 30, 78, 6,199,126,198,237,221, 30,135,227, 9,243, 52, 97, 28,206, 24,135,
+ 51,135, 50, 88,162,120, 77, 35,164, 32,235,136,153, 39,194, 93,206, 35,164,164,125,159,119, 51,197, 32,122,218,238,181,117, 5,
+ 17, 2, 92, 16, 8,198,192,121,139,117,219,192, 5,154,202,204,179, 65, 93,213, 24,199, 9,235,174, 3,164, 68,215, 52, 16, 18,
+152,167, 25,211, 60,165,100,191,186,110,112, 56,245,152,250, 35, 11,179,104, 87, 39,101, 12,132, 40,196,144, 41, 51,158,172, 63,
+138,185,160, 82, 74,104, 85,167,236,113,207,157, 34,225, 60,201, 31,171,100, 20,203,132,229, 45, 45, 4,231, 29, 4,204,102, 78,
+ 93,100, 42,208,184, 27,128, 40, 59, 4, 14,163,224, 29,119,180,202,196,109,154,148, 18,111, 63,190,161,142, 23, 30,109,211,162,
+169, 43,254,140,178,130, 94, 41, 77,184,214,170, 66, 35,128, 48,205,184,187,187, 67,183,219,162,110,168,195,223, 93, 95, 97,243,
+232, 17,246,231, 1,199,251, 7,184,105,196, 60,156, 49,205,180,218,154, 83,230,186,199,217, 10,204, 66,195, 75, 69, 29, 58, 31,
+ 86, 74,201,148,170, 21,175, 3, 34,206,145,214,193,154, 9,158, 15, 84,203,126,103, 17, 99, 99, 67,150,253, 68, 53,124,198,105,
+ 94,174, 5,113, 17, 31, 43, 82,241, 35, 37,137,189,170,170,198,122,187,195,213,205, 91,248,123,127,244, 7,248,225,103,223,199,
+110,179, 65, 97,178, 37, 54,184,200,170,235, 50,228, 36, 79, 26,145, 38, 34,212,161,134, 5,219, 60,250,215, 75,251,154, 44,162,
+ 11, 83,159,196,191, 46, 8,113, 17,146, 16,138, 62,120, 17,102,128,217, 24,188,122,253,128, 87,183,183,152,102, 3,169, 20,250,
+254, 72,103, 17, 79, 98, 34, 18, 53,157,210, 50, 98,114,217,177, 35, 99,188,110,158, 52,168, 84, 20, 41, 72,169, 23, 19,134,232,
+175, 46,223,167, 36,224, 92,164,140, 21,192, 43,145,197,208,137, 91, 30,153,234,177, 96, 73,130,185, 34,183, 62, 93,239,133, 42,
+157,215,136,101,202, 91,186,252,132, 34,199,145, 38,187,177,115, 38, 57, 82, 82, 6,121, 26, 76,101, 8, 78, 82,185, 43,149, 47,
+244, 80,138,119, 25,230, 85,186,183,248,217,145,172, 1,209, 85,149, 16,198,109, 83,147, 16, 81, 80,211, 96,109, 88, 20,150,155,
+245,138, 61,252,101,115,196, 98,215,248,108,150,118, 49, 20, 46,160, 18, 37, 18,178,131, 38, 97,137,197, 82, 0,186, 84,199, 47,
+229, 77,122,193,159, 15, 89, 20, 81,130, 71,124,196,113, 94,144,145,131,231, 69,189, 15, 9,237, 24,187,188,105, 24,208,104,129,
+182,166, 24, 84,165, 20, 42,169,160,116,139,255,229,127,255, 63, 49,155, 25,155,245, 26,175, 94,191,194,122,179, 65, 83, 55, 56,
+246, 61,118,219,109,206,183,149, 18,206, 59, 40, 37,113,115,189,131,170,106,172, 58,170,240, 15, 71,207,123, 50,129,113, 2,180,
+ 86,176,231, 35,180,214,248,236, 7,159,225,254,112,196,253,221, 29,110, 5, 30,173,250, 0, 0, 32, 0, 73, 68, 65, 84,247,123,
+ 42, 2,198,145,194, 69,248, 13,180,179,197, 56, 31,240,176, 63,162,123,249, 10,187,205, 26,215,215, 87,184,190,190,198,110,183,
+195,213,110,135, 77,215, 81,167, 45,233,210,117, 51,141,193,134,105,194,254,176,199,121, 32,139,212,203,151, 47,113, 56,156, 48,
+ 91,218,253,121,235, 48,141, 35,198,186, 66,165, 43,178, 69, 84, 26, 74, 72,172,214, 43,172,226, 33,136, 0,233, 61,140,159, 24,
+128, 67,192,135,113, 28,240,205,139, 23,120,251,201, 21,137, 92, 22,126,115,145,190, 44, 34,249, 67,115, 32,134, 8, 36,214, 74,
+141, 78,170,226,243,131, 21, 21,222,203, 54, 49,243,155,115, 94, 57, 61,172,198,121,236,207, 22, 82,181,100, 23, 99, 90,211, 60,
+ 79,112,214,160,169, 91, 16,110,155,190,124,206, 26, 12,134,224, 46, 82,107,130,166, 12,228, 0,112,102, 38,229,178, 55,232,167,
+ 51,228,106, 5,231, 3, 84,240, 88,213, 26,149,148,148,138, 20, 2, 42, 17, 96,121,136,105, 45, 77, 69,102, 99,208,116,148,138,
+182, 94,173, 1, 1, 84, 85,131,190,239,161,224, 49, 50,197,236, 60,140, 88, 55, 13,132,148,120, 61,244,232,218, 6, 54, 8, 40,
+ 4, 24, 55, 39,181,181, 72, 41,100, 5,244, 37, 18,175,248,161,162,100, 50, 5,193,162, 52,199,193, 16,177, 59,147, 82, 37, 54,
+120, 28,181, 34, 81, 78, 29, 52,128,245,122,131,113, 60, 83, 33, 38, 37, 84, 82,246, 22,153,200,177,235, 96,145,156, 20,114, 81,
+ 32, 68,161, 80,165, 21,154,166,133,247, 30,227, 52, 98,158,105,165, 68,246, 75, 69, 93,102,252,189,206, 66, 9, 34,221, 93,173,
+ 59, 28, 15,123,188,126,254, 28,186,170, 32,229, 26,109,211, 65, 74,133, 71,239,188,131,251,170,198,171,151,255, 63, 93,111,246,
+ 99,201,117,165,251,125,107, 15, 17,113,134, 28,170,138, 67,145, 18, 53,180,122,144,219,246,237, 6,218, 54,112, 1, 3, 54, 12,
+ 24,126, 50,252,167,250,193, 79,247,197,126,243,128,107,224, 14,125,123,146, 68, 81,108, 82, 36,107,204,204, 51, 69,196, 30,253,
+176,214, 30, 78,177, 45, 64, 80,145,170,170,204, 60,231,196,222,107,248,190,223,247, 6,199, 72,240,151,136, 57, 19,124,100,193,
+ 98,206,169,250,178, 89, 76,103,235,207, 23,188,151, 53,138,171,105, 89,189, 55,185,140,178, 21, 81,205,199,174,118, 40,106, 67,
+222,194,199,174, 29, 52,125,232,206,104, 93,185,210,170,174,163,148,140,101,183,251, 61,118,251, 59,252,205, 95,255,231,184,185,
+217, 9,107,162, 51, 86, 21, 43, 37,174,187,195,242,126, 50,213, 88,113, 8, 21,116, 85,183,151,157,178, 18, 49, 21,199,141,246,
+217,214, 36,221, 62,201,159, 45,214,173,244,163, 3,183,156,172,148,203, 51,219,167,242, 9,103, 33, 68, 28, 14, 7,156,207, 23,
+158,128, 16, 91, 96,139, 91,168,208,199, 74,167,166,229,236,229, 96, 31,170, 66, 72, 22, 86,241,247, 25, 99, 89,221, 48,148, 43,
+ 37, 22,188,113,136, 84,224,175, 97, 56,145, 45,132,200,177,190,233, 74,156, 35, 89,245,101,103, 95,162,102,219, 37,207,224, 45,
+117, 21,197,172, 74, 76,172, 36, 11,150, 2, 90,149,117, 94,151,131,192,212,180, 54,245, 80,153, 96,138,192, 82,196,109,172, 66,
+151, 59,136,218, 52,132,131,199,218,152,177, 92,232,168, 29,122,172, 69, 80, 15,191,105,141,172,170,194, 58, 8,183, 68,107, 83,
+215,178, 23,202, 88,221, 22,214,112, 4,173, 81, 10, 25, 65, 16,175,220,144,156,231, 5,131,221, 95,143,243,169, 41,251,219,120,
+191, 57,107,168, 59, 43,174,218,237, 62,202,182, 20, 71, 53, 70, 35,255,136, 37, 86,197,117, 68, 12,159, 33, 78, 44,104,203,246,
+ 98, 72,207, 84, 89,189,200, 73,108, 2,168, 7, 79,139,164,164,122, 97,146,216, 25,172, 97,209,131, 86, 10,171,119, 80,148, 96,
+135, 1,255,235,191,249,223,101,143,157,240,201, 71,207,240,226,163,143, 25, 48,113, 57, 3, 25,216,110, 88, 44, 23,252, 10,163,
+ 9,219,105,135,148, 57,122,209,104,133, 32, 2, 10, 99, 24,127,184,186,136,156, 34,134,193, 2, 52,240,161, 50, 31,177,179,132,
+151,127,241, 23,120,122,122,194,251,199, 7,204,199, 3,150,121,150,248, 71, 9,231, 72, 25,107, 72, 88,194,138,167,203,138,247,
+ 79, 39, 76,223,254, 17,119,247,119,120,118,127,143,251,187, 59,108, 55, 27,140,227, 40, 59,110,254, 51,167,227,145, 31,186,203,
+ 5, 15, 15,143,120,122, 58,212, 4,172, 40,209,164,110,117,152, 47,140,165, 52,214,192,104, 22, 4, 58,231,240,108, 63,225,245,
+197, 35,122, 15, 61,136, 29,164, 88,159,132, 80,118, 58, 30,240,183,127,255, 91,252,250,207,126,133,105, 50,173,194, 45, 85,101,
+110,190,116,174, 82,169, 62,232,137,154,130,146,115,210, 91, 64, 12,169,206, 7,170,168,134,236,148,245,138, 15, 25,139, 75, 88,
+ 86,143,224, 60, 95,166,222, 49,173, 74,246,110, 0,193, 12, 27, 56,233,136,151,249, 2,163, 53,188, 99, 68,111, 74, 25,222,243,
+207,145,214,153,225, 18, 57,241, 5, 31, 29,214,224,160, 8,216, 14, 22, 57, 71,108,164,248,241,222, 35,100,135,144, 56,216,103,
+ 28, 12, 98, 96,148,165,210, 6, 27,197,184, 96,141,140,152, 3, 38,210, 56, 62,157,241,252,217, 45,226,122,193,227,249,130, 20,
+ 35,166,205,196,222,228, 97,192,249,124,230,116, 63,137, 95,228,245,128,230,241,244, 48,176,213, 75, 70,110,101, 21,149, 98,100,
+171,148,148,175,144, 41, 74,136,145, 45,100,114,144,147, 92, 82, 90,107,132,130,139, 44, 15,172, 28, 92, 41,177,117,113,179,217,
+ 97,187,217,225,116, 62, 66, 27, 11, 50,109,172, 86, 96, 25,232,186, 71, 18,133, 47, 1, 28,176,145,139, 54, 66,225,254,246,182,
+190,135, 46,102,204,203,138,113, 28,185,163,209, 60, 51,206, 41,212,201, 10,139,197,248,215, 27,107,241,234,225, 1,203,199, 31,
+ 97,183,219,227,237,195, 35,190,127,245, 26,135,211,204,147,149,113,135, 39,159, 0, 63, 87, 93, 70,193,213,150, 67, 52, 70,143,
+176, 6,185,196, 99,205,117, 78, 31,248,163,169,235, 38,140, 82,176,198, 32,136,138, 59, 86,139,151,134, 46,215,110, 37,102, 81,
+149,241,124,216,241,168, 26, 85, 90, 40, 98, 6,155,205, 14, 55,119,207,240,223,252,205,191,194,205,205,174,162, 93,203, 40, 53,
+ 95,169, 71,178,192, 62,168,249,196,235,255,223,186,174, 62,215,190,236, 21, 83, 70,181, 19, 41,177,195,181,177,123,187,221,146,
+ 92,206,117,231, 42,174,146,156,186,113, 54,117, 76,112,180,245, 91, 74, 9,214,104, 28,143, 39, 78,187,203, 17,148, 88, 24,124,
+ 57,159, 42,170, 22,148,161,229,181,110,184,107,153,174, 81, 11, 51,178,138, 4,205, 74, 0,233, 26,164,147, 41, 65, 81, 2, 83,
+242, 25, 38,163, 53, 71,196,106,177,174, 21,209, 91,249,158, 99,138,252,122,232, 12, 31,217, 54,151, 11, 21,183,144,227,114,251,
+252,103, 17,210,165,220,166, 18, 33,242,157, 0, 9,175,169,235,189,220,210,222, 42,196, 70,181, 80, 25, 23, 28, 82, 10,117, 60,
+ 93,113,238,164, 58, 56, 15,143,186,181, 86,124,161,107,133, 36,207, 45, 85, 76,117, 79, 61,165, 22, 97, 44, 46, 7,102,199, 91,
+104,109,228,231,229,215,195, 5, 14, 21,219,200, 52,138,117, 36, 93,222, 20, 50,188, 15, 53, 80,169,153,236,203,123,219,166, 10,
+ 72,226, 41,163,124,141,247,166, 62,150, 92,137,116,170,239,206, 69,128, 74, 29,105, 51,117, 89, 9,130,208, 54,185,132,114,128,
+170,176, 1,181, 83, 43,213,173, 84,124, 37,153,168, 41, 36, 4,235, 87,184,200,169,250,188, 83,230, 15,142,214,154,119,209, 57,
+227,255,254,119,127, 43, 59, 8,254, 33, 95,126,246, 25,206,231, 51, 0,130, 53,140,119, 93,215, 21,195, 48, 86,124, 95, 20, 66,
+152,115, 14,227, 56, 96,178, 10,167,115,100,225, 82, 8,128, 38,100,107,160, 60,143,246, 72, 17,130,143, 0, 41,204,135,247,176,
+ 68,152, 20, 48,222,220, 64,191,120,129,219,103,207, 57,204,194, 88,156, 47, 39,252,230,239,254, 78, 64, 27, 25, 30,132,213, 5,
+188,255,225, 45, 94,189,121,143,251,253, 22,207,238,239,176,223,239, 57,202,144,120,164, 60, 11, 11,254,116, 62,227,114,186,192,
+ 5,134,248,199,106, 35,227,106,123, 93, 87,152,121,230, 11, 70,232, 89,199,211,153, 43, 97, 82, 76, 53, 3, 96,172,229, 88, 64,
+197,202, 76,182,204, 56,156, 78, 79,248,242,235,111,241,249,203, 79,241,252,126,123, 29, 4,210,143,121,149,146, 41, 75,110,208,
+ 26,137,189,189,202,175,167, 70,183, 42, 12,235,101,141, 32, 61,225,112, 60, 54,155,162,240,235,249, 96, 48,240,209,129, 72, 99,
+ 89, 47,149,167, 28, 79, 71,220,220,222, 99, 93, 3,144, 34,134,253, 29, 82,206, 88,215, 25,110, 93, 1, 0,155,205,158, 47,122,
+ 99,129,232, 17, 29,139,222,180, 2, 6, 81, 33,243,104, 35,194, 45, 92, 77,147,214,152, 44, 59, 25,144, 18,118,155, 9,218, 24,
+ 81,205,203,207,166,216,158,114, 88, 22, 40, 67,248,246,245,107,172, 51,143,139,111,182, 91, 92, 46, 11,175,124,230, 11,230,121,
+198,164, 9, 48,150,227, 23,137, 47, 20, 35,221,245, 48,109,170,218, 62, 11,218,179, 8,178, 32,151,182, 17, 5,117,202,108, 33,
+ 43, 83, 21, 37,159,123,170,151, 89, 20,203, 90,172,197, 83,150,130, 56,229,132,205,102,139,144,248,153, 48,195,192, 93,107,125,
+248, 91, 72, 6,132,205,205, 99,123, 84,222, 60, 36,150,116,156,182, 88, 61, 95,166, 33, 19, 14,243,130,172, 20,235, 85,140,174,
+ 74,102,239, 89, 60, 26, 98,194,188, 58, 44,171,195, 18, 13, 48,221,224,159,190,250, 22,233,203,127, 6,122, 37,190, 42,177, 75,
+221, 76,174,168,173, 99,188,206,153,151, 75, 42,229,235,209, 96, 47, 22, 43, 63,154,149,157,102,146,162, 48,229,107, 52, 17,170,
+205, 42,137,165,178,223,223, 82, 27,201, 82, 91, 77, 40,165, 48, 14, 19,110,238,158,225, 87,191,250, 37,126,253,103,191,148,194,
+162,133, 18, 55,170, 24, 90, 58, 18,181, 53,100,150,116, 46,234,216,229,232, 46,154, 98,238,164, 78,217,221, 51,223, 41,247,250,
+ 20,121,190,114,139, 99,213,130,232, 77, 29,150, 57,151, 51,242,202,165,146,107,192, 71, 97,249,179, 86,130,133,161,186,142,213,
+ 9, 65,138, 31,254,236,100,144,204,124,116,101,175,243, 63,199,148, 97,197, 85,164,192, 98, 79, 34, 45, 20,179,162,141,225,117,
+ 23,233, 6, 78, 74,242,191, 33, 38,228,172, 42,173, 18,200,208,137,106,183,171, 84,170,162,177,156,218,247, 95, 47,233, 30,152,
+ 82,113,177, 37,229, 49,129, 34, 42, 38, 88, 93, 53,147,141,192,166,181, 97,120,146,231, 51,167,104,121,138,109,185, 35, 11, 84,
+ 53,184,146,145, 57,137, 15, 61, 20,239, 58,202,215,161,238,227, 80,210, 29,175,201,116,236, 16,240,149,203, 78, 90, 35,196,132,
+197,121,248,216, 96, 82,197,174, 91,238,212,162, 21,225, 34, 79,181,128,172,156,229,220, 85,245, 51,147,145, 68, 47, 32,223,191,
+ 82, 93, 65, 75,221,231,144,186, 56,237,242,223,246,123,107,196,117,197,186, 39,152,194, 17, 71,134,216, 7,168,237,250,115,225,
+143, 83,231,142, 34,224,106,228,148,160,116,190,178,102,248, 16,129,228, 48,140, 86,242,169, 19, 52, 41,188,121,120,172,163,185,
+ 24, 35,246,187,189, 28, 16, 28, 54,112,153,103,140,214,226,235,175,191,194, 79, 62,123,137,113,179,193, 55,223,125,143, 95,253,
+242,231,184, 60,189,199,160, 21,188,243, 24,140, 70, 34,130, 37, 13,231, 51,220,202,135, 50, 25, 11, 74, 9, 17, 1,211, 96,164,
+ 99, 73,248,248,217, 13, 78,231, 25,218,104,204, 79,111, 49, 78, 27,104,165,240,238,205, 59,152, 97,192,254,230, 22,231,195, 35,
+ 11,142, 50, 16, 98,198,147,247,184,132, 19, 94, 61,157,240,108, 55, 97, 55, 13,156, 38, 23, 3,251,154,189,135, 11, 81, 96, 12,
+221, 94,137,138,184,135,253,163,110, 93,177, 88, 83, 8,173, 56, 30,143, 88,214, 21, 80,147,116,102,162, 96, 37,226, 17,106,150,
+113,149,188,198,199,167, 7,124, 19, 35,150,245, 35,252,228,229,179,186,251,174, 19, 19,100,137, 77,149,195, 42,169, 86, 21,118,
+ 98, 37, 31, 18,230,149, 97, 56,222, 59, 1, 77, 56, 40,100, 44,243, 3,214,117, 17,184, 11,143,234, 66,136, 98,215, 72,216,108,
+118, 88,215,153, 11,173,156, 1,173, 49, 88,194,233,240, 0, 31, 2,166,205, 14,143,143,111, 97,148,194, 44, 93,123,244, 43, 78,
+193,139, 69,109,173,186,140,232, 29,180, 53, 18, 24,196,135,252,146, 88,232,181,153, 6, 12, 86, 99, 51,141, 24,140, 97,145, 34,
+145, 16,224, 50,204, 96,225,115,192,168, 13,140, 53,120, 56, 60, 33, 58,135,219, 91,182, 57,206,115,230,159, 35, 38, 92,102,246,
+ 59, 95, 46, 23,182,247,248,200,221, 89,134, 4, 9,161,230, 67, 27,195,190,107, 62,136, 45, 31,222, 82,172,242,237, 92,158,145,
+212, 4, 63, 29,189,167, 4,241, 24, 98,142,117,161,199,149, 8, 73,238,198, 3,148,144,169,202,235, 16, 59, 10, 20, 9,158,148,
+ 58,250, 92, 19, 61,118,104,102, 99,112,154, 93, 23,209,155, 49,123,135,183,199,165,142,188,219,165,155,174,240,156,212, 41,146,
+123, 27, 43,201, 33,145,197,231, 94,198,224, 33,166, 54,186,206,168, 52,179, 70,147,164,106, 33,204,245, 50,197,149,111,158,187,
+ 38, 45,233,117,241, 10,108,213, 2,131,114,253,188, 83,110,223,211,191,204, 66, 96, 87,192,118,123,131,219,251,231,248, 31,254,
+187,127,205,233, 95, 41, 95, 9, 63, 27,165,172, 83,240, 82,141, 33,170, 25, 6, 36, 98,218,246,245,114,195, 36,215,248,225,214,
+133,151, 14,173,183, 36,230,222,149, 46, 41,127,156, 59, 79,245,162,227,207, 91, 39, 25,239,100,221,249,122, 11,134,148, 18,134,
+ 97,192,114, 57,193,167,136,113,212,128, 34,124,246,252, 14, 95,125,255,154,215,135, 49, 97, 99,181, 40,221,249,243,161,169,134,
+155,215,247,133,228,245, 82, 69,123,132,146,165, 30, 1, 5, 40,101,186, 46, 31, 53, 56,164, 8,225,116, 21, 18,102, 40,205,197,
+110, 2, 65,103,134,213,248, 24,185,136, 16,157, 65,136, 77,141,223,219, 48,137, 8,186, 36,195,161, 89,188, 84,135,153, 69, 42,
+204, 7, 22,196, 1, 64, 10,174, 2, 98, 10, 47,160, 16,236,114, 23, 97,193,166, 32,195,103,203, 21, 88,166, 88,178,169,173, 58,
+164,131, 86,181, 97,215,194,203,176, 50,137,138, 87,174,130, 98, 33,244,129,133,192, 45, 70, 54,247, 6, 32,153,110,160, 78,252,
+ 42,171,163, 7, 77,169,220,246,232,170, 11,151, 41, 57,166,189,115,184, 91,191, 85,228,109,129, 84,149, 63, 65,185, 22,147,164,
+ 24,165,107,202, 3,152,170,112, 35,225, 3,194,200,213, 18,191, 48,170,235,231, 82,212,195,189,224,106, 89, 28,159,253, 18,228,
+ 48,141, 35,126,247,213,215,181,210,103, 95,167,174, 60,113, 78,110, 91, 96,140,198,227,211, 19, 62,126,241, 28, 95,253,225, 15,
+120,253,230, 45, 98,240,248,135,223,124,137,237,104,241,124, 63,113, 21,166,100,236, 0,206, 30, 30, 70, 43, 66,164, 8,109, 13,
+110,140,150,145,173, 66, 36,192, 42, 96, 51,106,144, 2,140, 29, 57, 69, 45, 6,220,236,183,248,236,229,199,184,156,207,184,187,
+217, 0,164,241,199,111,191,225,253, 75, 17,190, 32,227,225,178,226,245,105, 65,202, 9, 35, 17, 38,211,248,198, 17, 60,202,139,
+200, 72, 84, 14,204, 22, 3,234, 3,227, 46, 67, 76,240,206, 99,190, 92,216, 9, 48,136,215,213,112,225,147,101, 12,155, 50,143,
+154, 97, 24, 59,184, 44, 23, 24, 59,224,187,239,190,131,243, 1,127,246,139,151,117, 4,151,209,217, 32,228,221,243, 57, 97,117,
+ 25,206, 69, 40,109,225,165,179, 30,172, 69,240,161, 93, 22,158,133,106,222, 47, 32,197,135,228,233,124, 96,132,111,228, 73,135,
+ 95, 28,140,182, 56, 30, 30, 48,109,118,184,156,143,210,225, 68,144,182,204,137,246, 14,171, 82, 8,206,225, 18, 28,166,113,132,
+115, 43,198, 97,224, 74, 25, 9,154, 52, 66,244,114,145, 75, 10, 92,202,200,137,224,157,231,142,189,136,215, 36, 71,155, 58, 37,
+234, 96,249,224,113, 33, 84, 75,215,114,185, 96,171, 21, 22, 5, 44,231, 51, 82,206,216,109, 71,204,235, 10,138,185, 6,196,120,
+239,224, 49, 98,178,132,203,234,175, 16,159, 70, 70,242, 0,152, 60, 86, 68, 91,137,119,210, 37,229,172,144,199, 82, 74, 87, 32,
+100, 18,117, 20,131, 49, 10,122, 55,243,148,161,118, 16, 16,241,211,138, 73,111, 57,106,180, 83,128,247, 49,144,189,165, 39, 41,
+ 35, 2,159, 98,217,202, 87,166,195,156,175,127,221,239,175,211,149, 15,190,227,100,203,216,153,114,139, 95,226, 9, 94,232,188,
+243,130, 14, 77, 93, 66, 88,119,201, 93,225, 60,235,212, 14,117, 63, 93,200, 92, 90, 56,235, 74,166,109,174,168,131,129,171, 93,
+104,233,120,116, 23,144, 82,156, 3,229,115,174,138,239, 88, 1,198, 88,220,222, 62,195,167, 47, 63,195,127,251,175,255,166, 78,
+ 88,122,241, 97,238, 66, 60,174,175, 92, 92, 89,128,218,132, 65,254, 84,231,253,189,146, 38, 75,247, 77,164,218,217, 72, 29, 6,
+ 22,173, 64,172, 2, 74,148, 51, 10, 87,182,165,156,175,180,215, 87, 59,105,116,214,186,105, 26,241, 4,198, 28,171, 76,140, 1,
+206, 6,155,193,226, 60, 47,162, 93, 80, 48,164, 96, 12,137,175,185,124,118,155, 5,175,228,203, 23,235,101, 22, 36,178, 66,230,
+243,185,172, 31,228,125, 83, 96,245,125, 25,229, 23, 7,134, 86,252,124,166,146,140, 87,136,135,129,139, 30,157, 18, 39,156,133,
+ 32, 23,251, 53, 78,188,237,151, 85,247,217,165,182,111, 38,130,214,128,210,182,130,136,130, 64,101,170, 13, 56,179, 40, 91,137,
+ 77, 49, 21, 97, 42, 21,176,140,105,164,184, 20,240, 35,242, 59,201,228, 50, 55,170,163, 34, 30,213,107,163,197, 38, 25,164,184,
+238, 0, 96, 89,112,203,213, 54,221, 69,210,254, 11,154, 36,170,106,247,252, 65,136,244, 7,129, 41,212,220,226,160,174,192,255,
+192,161,148,127, 76, 30,235,180, 79,234, 10,113, 76, 4,190,212,137,186,113,215,143,150,246,197,162,158,155,220, 94, 58, 67, 18,
+ 81, 80, 75,110,227,111,150,129, 44, 12,154,152,166, 9, 74, 41,252,230,235,111, 25, 18, 35,149,227,102, 51, 74,229,206, 54, 46,
+ 99, 12,156,243,248,225,135,239,216,178,180,191,133,126,247,128,197,179,192,109, 89, 86, 24, 69,216, 13, 30, 94, 20,193,209, 7,
+104, 99, 97,245, 0,163,128,172,152, 16, 22, 66,132,210, 60, 81,176,214,212, 46,222,106,194,152, 51,212, 56, 96,118, 1, 63,255,
+229,159, 96,180,204,178, 94,150, 21,243, 60,227,227,251, 27,204,235,130,121, 94,176,174, 43, 14, 79, 7, 44,206, 33, 58,143, 16,
+128, 99, 76,120,183,178, 40,105, 99, 53, 76, 61, 84, 27,253,173, 52,121, 49,201,212, 98, 89,129,101,197,234, 28, 98, 72,240,162,
+138, 13,129, 59,216, 97,156, 56,128, 34, 37,196,228,161,212,202,145,160, 54, 35,103, 11,239, 86, 40,173,241,234,213,119,152,231,
+ 25,127,241,171, 47, 36, 97, 9,136, 73, 97,153, 47,216,223,222, 66, 17,241,158, 51, 6, 22, 76, 37,135,236, 87, 88, 99,240,244,
+240, 14,214, 90,248,156,106,232, 3, 43,238, 57,185,172,200, 31,125,136,176,227,132,243,229, 2, 2,231, 79,231,156, 49, 95, 78,
+136,193, 67, 27,195,213,118,152,161,205,192,169,120,193, 99, 94,102,220,222,222,195,175, 23,164, 24, 48, 47, 81, 98, 46,117,183,
+ 43, 22,177,142, 28,222,171,227,238,216, 42,141,105,156,176,177, 26,183, 55,183,152,215, 21,119,119,207,241,250,205, 27, 28, 47,
+ 11,238,111,118,120,255,248,136,195,249,132, 95,252,244,167, 56,207, 23, 24,165,240,116, 60, 0, 49,194, 14, 35,239,181, 67,196,
+225,112,130,182,236, 85,215, 34,196, 25,117, 81,131, 91, 88, 3,164, 44, 12,108,177,219, 41,173, 1,101,177,204,172, 48, 46,190,
+107,136,159, 58, 19,147,166,234, 30, 75, 14,180,146,134, 86, 46,184,152,178,104, 61, 82,189, 52,148,232, 78,202,234,166,122,183,
+ 5,144, 18, 59,107, 82,111,213, 2, 82,243, 14,199,112,149,183, 92, 44, 85,229, 32, 70,199,225, 14,194,201, 47,185,216,220,213,
+ 69,217,239, 11,113,174, 99,137,167,170, 50,111,223, 79,211,109,168,166, 16,175, 73,100,169,170,117,127, 84,236,131,167, 21, 37,
+ 92, 38,167,140, 53,186,238,146, 45, 25,209, 16,184,143,130, 53, 28, 72, 19, 11, 39,162,254,156,170,122,219,155,144, 74, 97,156,
+ 54,248,228,211,151,248,244,227, 23,248,253, 31,190,193, 96, 7,172,114,126, 40,217,219, 91,107, 56, 29, 78, 55, 34,159,234,192,
+215,232, 56,224,253, 72,254,199, 62, 79,105, 32, 11, 37,173, 67,249, 82, 45,227,168, 37,116, 9, 30,182,168,206,175, 59,241, 92,
+209,202, 92, 60,182,215, 36,167,235,240, 17,231, 89,169,205,169, 98,220,249, 91,226, 21,222,103,207,239,240,219,111,217, 35, 61,
+175, 14,163,157,174, 28, 49, 80,169,158,227, 74, 43, 22, 76,146,174, 59, 89,230,117,112, 5,160,101,207,206,227, 97,158, 10,149,
+228,191,178,118,209,146,131, 81,215, 32,166,209,215,116,230,253, 56,167,198,165,166,244,246,190, 78,157,250, 2,139,241,205,114,
+153,130,174, 82, 33,181, 98, 16, 23, 41,233,150,187,216,212,214,245, 87,186,180, 76, 88,120, 31,174,100,157,170, 32,147,212, 20,
+ 27, 81,187, 47,192,106,119,222,113,227,141,145, 66,155,249, 21,233, 42, 77,174, 21, 4,101,210,228, 67,132, 53,166,138, 8,233,
+106,130,196,175,183,234,196,160, 53, 71,133,154, 8,185,184, 89,250, 30,253, 71, 23, 58, 21,157, 90, 49, 37, 53, 92,123,157,167,
+231, 70,205,235, 9,125,166, 88, 18, 84,247, 5, 82,157, 48,229, 15,106,141,114,124, 41,168,156,144,148, 98,229,123,142, 29,207,
+ 26, 88,151,149, 45, 0,195,128,121, 89, 48, 89, 43, 85,132, 2,233, 12,149, 21,126,254,179,159, 99, 93, 22,108,119, 91,156, 78,
+ 30, 70, 27,108, 54, 19, 62,123,249, 57,230,213, 97, 5,224,220, 10,173, 53,230,117, 69,202, 9,175, 31, 18,238,118, 27,108, 55,
+ 27, 44,206, 75,133, 24,144,117, 68,212, 10,214, 14,146, 85, 46, 85,101,206, 88,125,194, 52,104,140,211,200,130, 7,239, 48,104,
+ 13, 51,106,252,244,139,159,129, 50,123, 57,163, 40,186,189, 99,208,205,186, 58,172,235,140,101, 93,177, 44, 11,220,178, 98,241,
+ 14,222,121, 92,150, 21, 79,167, 51,158, 46, 51, 92, 74,152,221,130, 81, 20,242, 60, 30,146,117, 70, 74, 18, 92,147,170,175, 84,
+105, 38,163, 13,145,133, 76,164, 20,211,232, 68,241,159,137,125,193, 41, 70, 25,137, 71,228, 19, 56, 84, 99, 24,241,254,221, 43,
+252,219,167, 71,252,171, 63,255, 19, 28, 47,174, 86,181,201,205, 88,150, 11,119,189, 68, 56, 94, 14,216,232, 8,239, 35, 46, 33,
+ 96,180,134, 47,252,172,145,194, 10, 23,121,183, 22, 83, 68,202, 10, 33,122,193,214, 70,132,153, 57,234,243, 60,195, 88, 46, 42,
+ 82, 78,176, 90, 33,196,150,244,118, 62,241, 58, 37,132, 0, 59, 76,240,110,198,229,124, 98, 97,150, 80,215, 84,240,128,214, 53,
+ 73, 13,178, 91, 50, 10,176, 90,215, 8,209,209,106, 28, 47, 51, 39,176,109,183, 56, 60, 61, 49, 13,142, 50,110,246,123, 60, 61,
+188,199,221,118, 39,150,195,136,115, 88,112,184, 44, 60, 91,154, 23,236,183, 91,209, 42, 16, 82,140,162,201, 0,236,200, 69,157,
+ 79,132,209, 14, 8,110,129,177,166, 93,130, 57, 66,197, 92,227,118,181,101, 2,154,214,108, 41, 43,197,170, 66, 63,185,107, 15,
+105, 21, 2,101,192,104, 37,234,119,201, 39, 87,132, 32, 42, 99, 45,123, 58, 18,120,200,102,195,130,174,224, 22, 81, 95,183,110,
+139, 68, 8, 69, 36, 89,217,194,254,134,168,116,139, 23, 62,197,212,173, 2, 8,171, 76, 50,234,255, 47, 33, 30, 5,155,154, 36,
+169, 43,119,157, 62, 73,220,169,146, 17,107, 47, 38,202,104,180,181, 10,191,202,215, 23, 96, 57,144,181, 54,242, 53, 25,229,155,
+113,157,230, 88,116,228,170,116,240, 18, 52,226,131, 7,228, 48, 78, 50,242, 84, 74, 33, 33, 86,135, 77,137, 53,245,137, 83,228,
+ 94,189,122,133, 87,175, 95,203,174,157,153,251, 90, 21, 16,144,146, 16, 23,141,113, 28, 25,208,179,221,224,230,102,135,221,118,
+131,113,180,205,134,148,233,218,210, 89,219,160,238, 44, 44, 65, 45,170,199, 53,231,102, 72,169, 19,146, 84, 65, 37, 53,143, 65,
+118,156,101,159, 95, 11,127,116, 65, 65,212,225, 34,101,218, 55, 47, 11,150,101,133, 82, 84,179,208, 67,240, 32, 16,172, 53,248,
+248,126,135, 87, 2,166,185, 44, 14,187,137, 99,164, 51,184,160,139, 49, 66,203,234,168,128, 90,114, 17,120,166,116,117,137,104,
+173, 56,240, 37,112,161, 91,178,217,189,104, 54, 82,206, 80,150, 29, 76, 49,103, 14, 37,146,113,175, 74,157, 5, 51, 43, 36,233,
+232, 81, 29, 5,173,225,227,103, 68, 93,193,108,218, 4, 73, 65,105, 11,107,173,240,236, 93,183, 58,234, 56,241,101,204,156, 59,
+ 49,153, 86,173, 67,143,158,163,118,203,123,210, 45,162,235,222, 89, 92, 36, 90, 10, 1,146,231, 50, 9,215,132,186, 73, 76,134,
+170,147, 28,166,253,178, 19,168, 4, 16,149, 41, 67, 41,170, 10, 1, 82, 27,211,220,242,221, 5, 15, 42, 2,202,171,132,237,171,
+203,191,238, 20,114, 99,194, 36,180,181, 15,149, 63, 95, 45,199,244, 65, 52, 58, 96, 72,246,226,185,236, 9,122,127,122,191, 47,
+ 74,185, 51,245, 39, 94,236,151, 15,119,237,232, 75,112, 0,170, 80, 36,167,136,255,235,223,255, 45, 64,138,233, 69, 18, 7,121,
+127,123, 7, 59, 12,120,120,120,143,219,155, 27,120,183,192,175, 17,251,155, 61, 30, 31, 31, 49,140, 35,158,125,244, 9,222,124,
+255, 93, 7,170, 80, 8, 49,193, 45,172,168,214,118,196,186,206,200,195,136,249,112, 96,116, 96, 78,200,164,160,149,198, 52,142,
+ 80, 57,130,200,194,104,128,180, 97, 91,146, 2,126,250,147, 95,224,230,246, 14,154,248, 64,135, 28, 72, 41, 38,246, 82, 75,230,
+121, 8, 17,193, 57, 4, 65,125,134, 16, 69, 81,237,176,172, 43, 94,189,125,135,255,244,187,223, 99, 17,184,142, 34,130, 17,104,
+ 69, 78,172,210,174, 35, 63, 99, 17,205, 0,138,171,164,173, 36,153,104, 20, 97,150, 88, 90,150,153,163,250, 36, 69,200,131,249,
+243,227, 56, 49, 61, 45, 94,240, 31,127,243, 59,252,197,207,127,134, 20, 46,176,102,128, 74, 14,214, 90,100, 1,163,104,176, 45,
+198, 88,203,163,241, 11,143,149, 24, 11,169,129, 28, 17,200,224,114,153,161,144, 16, 69, 4, 20, 98, 70,138, 11,231, 93,231, 8,
+183, 6,113, 10, 4, 16, 89,104,120,184,149,185,253,202, 12,128, 95, 97, 69,212,118, 56, 29,112,123,255, 12, 97,157,187, 36, 48,
+ 45, 7,104,179,109,113,171, 38,187,125,165, 96, 40, 99, 48,132,155, 79, 94,224,124, 58,227,253,241,137,109,144, 68,120,253,248,
+ 8,163, 53, 30, 78, 23, 40,173,241,195,251, 7,196, 24,113, 60,115, 58, 95, 72, 92, 61, 43,245, 84,167, 70, 57,103,140,150,167,
+ 55,251,201, 66,155, 1, 20, 28, 92,140, 32, 33,107,241,131,167, 59, 26,111,102,241, 37,120,114,162, 72, 55, 27, 96,202, 24,182,
+183, 56, 47,223,179, 72,175, 2, 50, 84, 61,164,203, 65, 74, 74,186, 89,213, 82,240,250,157,241,110,119,139,253,237, 0,165, 53,
+ 46,151, 19,150,101,150,231,152,119,210,177,184, 17, 20,175,103,120, 84,159,234, 37, 25, 83,148,213, 78,172,210, 91,163,217,238,
+ 3, 48, 16,131,100,132, 90,196, 98, 33,116, 30,228,124,237,251, 46,188,249, 30,114,209, 60,201,162,213,232, 68,129,229,231,213,
+226, 3, 46,255,241,222,183,248, 72, 38,202,212, 85, 20,251,252,181, 76, 11, 50, 92,240, 53, 4, 71,139, 45,142, 47, 69,212,215,
+178, 37,248,101,201,191, 38,124,250,249, 47, 96,135,145,211,241,228,213, 45, 99,102,173, 13, 35, 50,181,173,118,167,101, 89,112,
+ 20, 85,119, 33,127, 89, 99,177,221, 50, 29,108,179,153, 48,109, 38,104,165, 48, 12,124,169, 24,201, 34,168,249,221,210,173,246,
+145,165,125,128, 81,150,247,162,240, 3, 10,236,252,195,223,251, 33,231, 41, 21,134, 68,207,138, 23, 17,241,229, 60,179,158,164,
+116,182,162, 83,178,134, 11,167,219,221, 22,143,167, 51,150,213, 99, 94, 61,172, 82, 72, 70,193,104,110,154,216, 43,205,175,127,
+ 22,193, 87, 34, 22,218, 53,158,133,136, 26,115,141, 0,226,172,128, 16, 16, 66,170,159, 25,136, 90,221,106, 17,230,137,168, 80,
+151,162, 82, 16,203,168, 99,106,254, 89, 67,160,142, 91, 80,112,169, 92,168,182,108,151, 12, 69, 70, 16,174,140,125,141,114,161,
+ 55,122,129,172,125,160,234, 10,170, 8, 80,149,230, 21, 26,129, 47,244, 20, 99, 11,152, 98,245,217, 7,250, 13,118,149, 24, 99,
+ 36, 14,155, 21,235, 73,222, 63,212,181, 66,157, 79,203,132,170,189,111, 33,114,218, 97,133,121,149,100,190, 92,166, 13, 90, 66,
+138,114, 21, 41,215, 66,176, 76,197, 20, 65,101,125,245,239,139,174,166,165,222,112,243,144, 68,151, 83,211,250,114,139,225,206,
+153, 58, 39, 5,106,112, 77,141, 27,107,220,234, 46,140,179, 23, 58,168,134,174, 77,189,118, 85,144,119,169, 27,227,167,196, 54,
+128,193, 90,120, 15, 60,205, 1,195,184, 97,200,140,115,136,126,197,110,183,131, 95,103,236,182, 91, 56,183,226,102,191,199,155,
+183,239, 16, 18, 63,208,239,222,190,197,110,191, 71,136, 17,227, 56,178, 82,156,120, 92,124, 10,252,224,196,101,133, 34,197, 93,
+181,243, 24,134, 12, 69,153,133, 79,137,171,202, 97,208,152,151, 5,119,183, 55, 60,234,181, 22, 46,120,252,228,179,151, 24, 44,
+243,128,149, 84,139, 53, 63, 29, 55,200, 49, 34,250, 21, 17,132, 36, 35,237,156,185, 0,112,206,113,226,151,243,184,191,185,193,
+237,102,194,223,253,238,247,120,245,116, 98,219, 20,128, 1,188,103,215, 50,114, 11,118,100,206,251,186,240,235,152, 98, 75, 75,
+206,133,233,156,228, 0, 39,134,117,100,142,118, 45, 89,220,164, 8,214,142,220,209,231,140,175,254,248, 61,126,254,249, 75,104,
+197, 24,210, 28, 29,160, 12,220,186,176,152,112,216,224,178,176,205, 43,197, 0, 23,185, 51, 50,102, 0, 0,204,203,133,125,151,
+ 74,236,100,222, 65, 41,230,170,187,101, 22,126, 53,213, 11,207,173, 11,130, 36, 85,197,156,145,227,202,217,221, 68, 56,157,158,
+176,191,123,134,199,247,239,176, 25, 7, 30,177, 3,136,224,176,135,242, 73, 85, 41, 99,118, 43,211,226,172, 70, 86,132, 81,141,
+120,247,116,196,112, 89,112,186, 92,224, 3,107, 0,222, 61, 60,226,178, 58,188,121,255, 8, 34, 96,176,156,240, 53, 14, 3,246,
+219,109, 29,241,150,163,195,197,128, 16,184, 67, 94, 86, 7,191, 46, 32, 34,248,156,184, 19,200, 30,160, 1, 8, 14,154, 52,204,
+184,133,247, 43, 98, 74,178,123, 52,213, 9,145,145, 43, 86, 82, 41,194,254,230, 5, 94,191,123, 5, 13,238, 2,137,248,162, 34,
+ 1,203,100,185,224,139, 46,149,169, 89,130, 7, 5, 19,215, 62,253,217,159,226, 87,191,254, 43,124,253,251,127, 68,142, 17,135,
+195, 3, 63, 43, 70, 66,125, 74,180, 45,181,207, 69,207,248,103, 1, 95, 27, 33,151,221, 95,185, 36,123,156,100, 25,209,131,174,
+115,253, 42,229,170, 67,158, 50, 36, 68, 60,177, 98, 99,165,254, 12,233, 32, 41,236,228, 80,146,104,197, 32,153,186, 30,164,182,
+ 35, 86,132,122,145,243,133,145,224, 66,148,213,133,170,249,221,101,239, 90, 84,209,229,139, 38,234,108,113, 74, 97,123,115, 15,
+ 45,133, 80, 29,197, 42,141, 24,115, 5,158, 80, 7,177,209, 68,236,191, 86,154,139,118,197, 23,117, 10, 60,129, 3,169, 86,112,
+ 10,146,215,104,141, 97,176, 24,172,197, 56,141,221,255, 26, 12,195, 0,107,116, 75,205, 43,232,110,249,158, 73, 20,241,169, 19,
+ 98, 85,241,112,239, 86, 41,239, 95,234,160, 93, 41, 85,255,118, 8, 65,252,233, 76, 41, 51, 36,226,196,148, 16, 37,195,222,104,
+133,143,238,110,241,237,171,183,200, 57,227,180,172,216,142, 22, 49, 41,232,168, 48, 14,131,136,244,216, 78, 9, 81,184,147,116,
+168, 5, 87,220, 59, 1, 82, 98, 77,146, 11,178, 6, 73,237, 53, 13, 41,179,107, 3, 84, 11, 60, 30,203, 43, 80, 23,247, 90,138,
+ 28, 77, 4,167, 88,224, 90, 20,235, 37, 19,128,100,202, 87, 71,248, 70,226, 94, 99, 96,238,188, 32, 92,123,221,199,191, 20, 34,
+ 94, 38, 52, 4,133, 40, 66,219, 92,248, 28,229,106,170,141,108, 75, 82, 44,227,246,148,120, 58,219,231,152, 87,130,100,241,178,
+103,213,222,191, 18,193,144, 50,162,128,127, 74,248,149,214,188, 14, 86,134, 95,219,171,140, 57,209,167, 20,251, 99, 3,250,116,
+ 51,240,122,153,231,106, 83, 79,226, 78, 66,167,245,160, 78,253,142, 30, 18, 87,158,213, 18,174, 83, 21,156,169, 64, 31, 80,255,
+ 34,244, 98,128,174, 42,104, 26, 0, 25, 95,201,155, 75,242,197,198,209, 34,172, 30, 33, 69,188,125,255, 30,151, 35,167, 14, 21,
+ 18, 87,148, 74,108, 24, 6, 16, 1,203,204,251,219,209,104, 44,222,215,124,227,113, 28,241,211, 47,126,138, 63,252,225,107, 40,
+ 69,204,134,183, 28,163,248,209,253, 61, 82, 88, 16, 51, 71, 15,238,119, 27, 56, 31,177,174, 14,187, 45, 48,142, 76,167,123,247,
+120,128, 85, 92,145,221,223,221,113,245,171, 52,127,240, 99, 4, 52,131, 52,202, 72,144,233,249, 50,122, 10, 19, 82, 78,114, 17,
+103,228,152, 16,188,195, 96, 12,140, 34, 56,249, 59,206,251, 29, 62,187,191, 69,112, 14,143,142,253,234, 62,183, 28,244,164, 8,
+ 8, 30, 90,172, 74, 40,158, 78, 81, 40, 27, 99,176,134,165, 22, 80,193,175,108, 3, 75,177,210,170,188,247, 80,202, 97, 48, 22,
+198, 24,248,224,145,130,195, 63,126,249, 21,254,234,207,127,129,135,199, 71,108, 54, 19,172, 85, 88, 66,146, 92,236, 21,155,113,
+226, 21,136, 86,192,234,132, 43, 0,134,192, 24,141,152, 19, 46,167,115, 77, 72, 35, 75, 8, 98, 33, 9,222,179,239, 60,103,132,
+101, 70,140, 30,118, 24,225,221, 2,109, 44, 98,138,172,248, 6, 48, 78, 27, 60,189,127,131,205,118,207, 58, 9,241, 94, 91,201,
+168,103, 50, 31,175, 25,140,102, 97,212,193,241,133,252, 72,151,202,166, 54,154, 39, 44, 70, 41, 60,191,191,197,167,118,148,140,
+231,124,133,193, 76,162, 50, 46,249,246,107, 8, 48, 94,193, 26, 96,245, 30,195, 48,193,166,128,211, 18,112,187, 27,144,192, 64,
+137,228, 22, 64,113, 34,149,146,241, 36, 17, 91, 95, 20, 1, 89,105,164, 28, 57, 97, 45,133, 42,102, 58, 29,223,193, 24, 3,104,
+194, 40,150, 25,206,235,230,157,162,209,138,181, 12,154,233,134,154, 84, 21,195,105,109,241, 95,253,247,255, 11,220,122,193,111,
+254,254,223,227,179,207,191,192,215,127,248, 13,214,117,198,167,159,255, 28,199,167,247, 64, 78,184, 92,206,149,134,213, 35, 81,
+203, 84, 44, 83,147,227, 37,168,122,104,148,125, 27,186,145,110,198,181, 18, 28, 29,139,160,221,214,125,174,119, 63,201,235, 72,
+ 95,185,112, 39,132, 64,150,128,213,187,254,143,180,179, 86,208,180, 74, 72,124, 25, 25,171, 15,181,184,208, 74, 87, 65, 47,211,
+ 32,181,248,248,155, 93,174, 48,208,249,123, 84, 69, 14,142,205,118,143,243,249, 88, 47, 36,146,152, 80, 72,214, 60, 50,187, 41,
+216,159,223,198,158, 25,145,109,100, 34,198, 99, 97,107,172,118,197,242, 90,123, 57,108,231,165,144,252,248,253, 29,236, 0,165,
+185,195,183,214,182, 75,127,100,167,134, 54,186, 50, 16,202,152, 56,161,243, 47,231,134,120,174, 46,252, 12,225, 25, 52, 59, 84,
+225, 27,172,235,138,167,227, 73,208,163, 30, 86,163,178,238,147,207,117, 13, 51, 13, 6,207,111,183,120,243,112,132,143, 9,171,
+ 7,108,182,200, 70,193,100,137, 33,202,177,134,204,196, 74, 89,227,119, 77, 43, 18,193, 25,234,164, 40,202, 20, 53, 22,184,137,
+ 76, 17,188,247,140, 70, 53, 70, 38, 74,186, 22,102, 74,166, 67,157,167,161,173,172,100, 21, 86, 88,241, 41,147,136,137, 69,116,
+ 36, 54,187, 16, 56, 90, 57,117, 19,142,148, 62, 20, 34,230,214,181,139, 61, 24,160,235, 11, 93, 22,101, 53,179, 66,181, 60, 18,
+173, 76,141,105,141,177, 64,108, 82, 39, 84,149,220,134,186,177, 38,177,186,209, 7, 57, 25,185,174, 68,202, 32, 70, 19, 33,203,
+231,165,172, 93,115,111, 15,207, 29,177, 80, 92, 46,185,195, 63,151,125,255,149,199,191,236,236, 43, 42,186,155,156,119,187,173,
+220, 58,109, 94,245,100,192,212, 25,190, 84,132,197,246, 64,169, 64,101, 62, 84,103, 18, 58, 11,167, 28, 54,101,244,196,223,248,
+104, 6,248,229, 12,163, 13, 12,162,140, 24,211,149, 85, 70, 43,133,101, 94,240,240,244,136, 47,126,250, 5,190,252,221,111, 48,
+142,155, 58,194,218,237,246,248,246,155,111, 48,142, 3, 62,121,249, 18,143,111, 95, 35,102,141,243,188, 98, 26, 44, 94, 63, 60,
+225,229,243, 91, 28,207,103,196, 4, 44, 11,123,116, 9, 96,181,121,136, 24,198, 17,119,251, 13,166,113, 64,240, 14,167,211, 17,
+251,237, 6,251,253, 45,130, 91,225,172,174,226, 14,196, 12,178, 3,195, 25,202, 74,193, 90,164,232,101, 68,152, 68,128,198, 10,
+109, 99, 45, 82, 6,172,181,149,171, 60, 17,112, 99, 53,244, 52,225,233,120,225,106,142,154, 42,153,243,126, 91, 78,118, 28,221,
+121, 20, 0, 0, 32, 0, 73, 68, 65, 84, 97, 2,135, 16, 96,180,230, 40,205,148, 48, 12, 35, 31,114, 49, 32,228, 12, 34,230,107,
+ 47, 0,110,119,219,154, 67,157, 64, 88,151, 25,255,225,159,190,196,175,127,249, 83,120,239,176,204, 71, 56, 31, 17,136, 48,109,
+182, 88,150, 51,180, 34,172,235, 42,163,207, 0,172,171,236, 75,139, 42, 29,152, 47, 39,104,109, 48,207,103, 57,104, 88,100,200,
+214, 60, 14,250, 80,218, 96,157, 47, 0, 8,126,229,247, 52,146, 71,244,236, 75, 31,134, 13,214,117, 65,118, 75,173,242,189, 92,
+200,178,212,101,101,170, 34, 24,163,176, 29, 71, 76,211,196, 22, 25, 73, 81, 82,154,131, 86,204, 96, 96, 4, 82,226, 3,175, 20,
+140, 33,108,199, 9, 65, 70,207, 49, 43, 88,107,176,174, 14, 91,163,112, 9,156, 70, 54,104,133, 85, 70,137,211, 48, 32,102, 96,
+ 48,252, 51, 45,164,225,115,128, 78,132,203,124,168,147, 39,228, 12,239,146,140,215, 53, 66,116, 60, 49, 17,225,220, 50, 31,249,
+ 82,130,146,110,213,192, 14, 60,250, 11,209,195,135, 82,236, 74,215, 47, 74,243, 97,220,226, 23,127,249, 95, 3,209,227,171,223,
+254, 61, 62,255,252, 11,124,247,199, 63,192, 59,143, 63,253,245, 95,227,240,248, 14, 63,255,249,175,240,207,255,252, 37,239, 43,
+235,248,176,219, 39, 94, 41,166, 5,133, 89,216,254, 68,141,197,223, 25,204,175,163, 66, 59,139,150,236,237, 83,205,119,104, 23,
+ 60,195, 81,174, 71,122,197,147,235,188,111, 33, 83,212, 1,168,228,107,112,231,198,170,127, 31,162,128, 72, 88,217,100, 69,231,
+193, 16, 16,192,104,158, 6, 5,121, 30, 26,133,174,233, 22,122,150,194,179,231, 31,195,185,133,207, 38,105,143,130, 36, 39, 34,
+122, 57,240, 68, 79, 81,116, 14,133, 8, 39,187, 94, 2, 31,188, 68,169, 30,148,141, 5,159,121,149, 16, 81,221, 9,188,146, 24,
+106,183, 31,148,135,211, 26, 23, 69, 32,101,170,175,123, 18, 12,239, 52, 14, 24, 71, 11,107,117,131,228,116, 68,177,154, 65, 90,
+ 70,239,185,165,189,101, 89,111,198,148,113, 62, 95, 48, 95,230, 26,174,146,229,251,140,221,110,191,236,249,183,155, 9,227,233,
+130,217, 7,172,158, 19,223, 72, 19,230,213, 99,208,168, 5, 98,206,226, 91, 55, 66, 86, 85, 45, 20,136,136,217,121, 70,107, 24,
+165, 16, 17, 49,144, 98,161,177,176,249,139, 6, 35,102,158, 60,162,123,207,203, 74,245, 58,187, 49,131, 96, 96,117,155, 34,165,
+220,222,231,148, 89,173, 30, 51,113,218, 97, 10,200, 41, 86,184, 89, 11,114,233,186,122,233,152, 11, 76, 41, 20,254,187, 92,232,
+ 21,161, 44, 99,111,116,177,188,101,188,159, 69,255, 83, 10,141,246, 76,168,122,161, 87,132,112,105,100, 85,211,207,160, 23,186,
+149, 75, 93,166, 99,163, 53,176, 98, 89,165, 46,144,173,191, 59,171,141, 79, 53, 75, 95,238,156, 47,213, 62, 41,138, 55, 77,189,
+230,163, 83,182, 41,234,138, 1, 41, 26, 40,115,212,110,206, 48, 21, 57,154,249,165,201,221, 30,228,106,148, 33,197, 64,238,162,
+222,250,240, 15, 82,141,129, 28, 51,119,159,236,239,107,160,135, 78,159,143,101, 93, 17,115,194,243,251,123, 28, 15, 7,124,254,
+249, 79,112, 58,159,241,248,250, 45, 70,137, 87,188,127,246, 12,209, 59,124,243,205, 55,184,127,118, 15,157, 19,242, 49, 85,166,
+248,219,167, 19, 70,163, 56, 86,114,117,216,140, 6,171, 11,208, 74, 97,204, 28,187, 58,142, 35,156,115, 32, 0, 55,155, 1, 79,
+199, 19,126,242,217, 79,177,174, 75, 3, 80,132,128, 56, 88, 88,201, 69,231,240, 24,146,253,144,146, 49, 15,160,192,136, 64,181,
+240,235,165,228,131,146, 42,186, 16,208, 57, 35, 44, 43,158,221,108,241,238,120,169,149, 99,181,104,149,167, 92, 48,177, 73,138,
+138,154,177, 77,140,161, 76,242,247, 71, 25,161,217, 97, 4,114,194,225,116,196, 48,140,184,191,185,129,209, 26, 11, 41, 44,203,
+140,239, 94,191,197,198, 50, 39, 95, 17, 23, 57, 57, 7, 30,147,122, 22, 91, 45,203, 42, 62, 74,131,203,124, 70,130, 70, 78,129,
+199, 71, 49, 32, 56,199, 43, 0, 17,102, 37,137,118, 44,213,107, 92, 56,101,174, 28,206,165,111, 44, 93,150,243, 71,246,178,102,
+ 96,183,217, 2, 41, 66, 41,205, 41, 98,214, 98,148,162,139, 81,139,185,218, 82, 70,197, 85, 40,231,156,139, 99, 33, 71,132,144,
+ 68,112,166,152,131,175, 20, 86,199, 66, 71,154,184,152, 58, 28,142, 48,214,226,116,186, 64, 33,227,102, 51, 97,245, 12,178, 25,
+134, 1,137, 44,182,211,196,185,218,210, 85,251, 8, 28, 87,143,152, 86,254,204,103, 84,181,184,214, 10,251,237, 22, 91,165, 65,
+ 72,188,206,209, 3, 92, 98,155, 38,233,194,131, 39, 65,178, 18, 84, 22, 11, 19, 17,146, 68, 59,150,157,233,199, 95,252, 41, 62,
+249,248, 37,254,223,255,231,255,128, 85,192, 31,190,252, 7,196,156,241,236,197, 75, 32, 5,188,252,244, 51,188,122,245,157, 84,
+232, 81,188,170,213,240,212, 17,165,122, 64, 71,139,175, 42, 33, 61, 84, 32, 82,170,137,108,128,198,142,238, 21,223, 87, 97, 16,
+117,103,153, 59, 97, 81,167,205,238,198,160,170,252, 89, 25,209, 91,165, 49, 88,177, 31, 5, 22,200,213,168,102, 2,180,230, 73,
+149,151,207, 11, 17,115,247,163,119, 18,179,137, 42, 50,227, 85, 66,110,140,116, 97, 56,220,222, 61,135,182, 3, 79, 39, 82, 98,
+241, 97,104,194,169,242, 99,232,210,140, 72,231, 25,130,231,148,198, 68, 80, 70, 35, 69, 94,167, 52, 27, 21,143, 77,179,172, 11,
+229,182, 99,167, 66, 82,200, 68, 88, 83,134,210, 36, 54, 74, 57,176,165, 24, 47,132,200, 40,142,158, 39, 98,214,254, 56,114, 39,
+191,221, 78,108,197, 84,212,241,192,203, 33, 44,184,234, 4,204,243, 82, 87, 47, 41, 38, 28, 79, 39,129,159,176,235, 33,146, 66,
+ 68,170, 23,137,214, 74,190, 38,255,204,207,110,118, 88,222, 61,129,180,170,121,224, 49, 49,148,107, 48, 74, 20,236,162, 54,175,
+ 26,135,102,119, 99,147,135,194,150, 20, 82, 72, 24, 20, 97,208, 26,131, 97,228,112,206,153,249,255, 66, 14, 85, 31, 36,139,149,
+ 80,163, 84,149,229, 60,150, 15, 84,183,210,205,235, 45,133, 94,130, 22,113,175, 7, 74, 92,173, 82,160,174,200,170, 81,223,185,
+ 7,222,176, 8, 77, 43, 37, 52,203, 40, 80,151, 78,200,157, 75, 88, 27, 73, 46, 3,239,236,179, 64,204,120,122,214,207,173, 21,
+148,106,172,244, 10, 96,162, 30,199,219,249,206,202,231, 53, 95, 27,230, 6,195,110,139, 97, 48,149,231,208,243, 94, 74,180,111,
+161,127,170, 92,138,187, 22, 38, 85, 92, 84, 84,214,118,157,181,173, 88,229,170,117,174,144, 21, 37,194, 55, 75,190,123, 76, 9,
+166,224, 96, 81, 87, 64,185,138, 84, 62,140,229,164,235,184,236,102,241,233,114,182,145,129,243,229,130, 65,177, 64,230,213,187,
+247, 87, 21, 87,169,200,207,231, 19,180,182, 8, 41,224,249,199,159,224,116, 60,226,229,167,159,226,124, 62,195,199, 92,199, 70,
+203,186,226,238,102,143,249,116,130, 15, 14,199,243,140,237,200, 17,120, 75,140,208,138,115,208, 99,140, 88, 29, 43,205,125,136,
+240,145, 11, 11, 64, 65,143, 22,163, 81, 32,109,224,206,103,164, 20,113, 57,159,171, 69, 97, 24, 7,120, 63,194, 14, 28, 38,227,
+ 36,242, 82, 73,220, 95,161, 5,229,200, 86,132, 24, 69,213,158,129,117, 89,112,185, 92,164,115,160,234, 79,245,171,195,222, 26,
+ 92,132, 23,206,227, 71, 85, 88,147, 8, 98, 73, 42,158,199, 50, 70, 85,138, 69, 78, 10,128,119,107, 21,204,173,203, 5,118,152,
+176, 96,193,205,118,131,199,227, 9,251,205,132,176,206, 80, 74,225,241,233, 8,251,236, 22,131,213,140,110, 93,206, 80,224,206,
+217,133, 12,173, 9,231,203,140,148, 18,156, 23,165,113,249,218,242, 36,104,226, 61,169,210, 13, 75, 91, 20,224,133, 39,205,196,
+ 37,230,139, 71, 17,103, 89,107,171, 82, 56,202,254,104, 59, 14, 34, 50,226, 3,113,144, 4,175, 65, 19,156, 95, 97,181, 18, 81,
+ 23,139,101, 40, 39,140,195, 84, 89,236,132,140,253,198,226,178,240,195,120, 58,173,184,187,187,129, 53,252,193,118,235, 10, 23,
+ 2,150,203,140,140, 25,187,221,150, 99,111, 9, 80, 70,195,173, 11,180, 68, 88, 62, 61, 62, 96, 24, 55,120, 58,159, 17, 51, 7,
+ 10,109, 4, 98,193,106,222, 92,199, 93, 73, 20,190,196, 32,119,100,240,186, 71,155, 17,201,157,197,162, 86, 32, 25, 53,246, 2,
+ 74,177, 51,160,165,100, 1, 80, 19,126,242,197,159,224,251, 63,126,133,249,244,136, 89, 28, 16, 47,127,254,103,216, 76, 91,156,
+ 78, 7,252,238,219,127,192,180,217,193, 26,141, 21,116, 21,167, 88,187,238,122, 17, 83, 29, 14,182,234,190, 37, 65, 21,243, 87,
+ 46,222,221, 58, 66, 85,173,125,239,141, 91,181,210,199, 21,156,165,159, 9, 52,124,173,208,215, 20,107,101,202,119, 18, 98, 16,
+181,123, 81,239, 83, 85,109,199, 34,240,147,239, 35,228,216,165,172,253, 11, 30,251,202, 76,226,127,247,226,227,207,248, 34, 78,
+ 76,228, 82,213, 62,213,210,209,202, 33,216, 3,127,178,136, 7,203,197,227,157, 32,124, 99,179,228,130,148,116,121, 16, 30, 64,
+100,113, 98,100, 54,129, 86, 37,182,153,199,251,218,104,168,208,212,246, 81, 49,243, 97, 93, 23,217, 83, 43, 33, 31,122, 92,136,
+216, 90,105,184,160,157, 70,203, 93,188, 49, 85,132, 87,184,249,239, 31,158,112,190,156, 89,237,157, 18, 30, 30,222, 35, 70, 86,
+171,167, 24, 16,164, 16, 40, 64,164,152, 74, 0, 77,130, 82,156, 23,191,223,110,176, 6,110, 18,156,103,235,111,204,204,121,135,
+ 92,198, 90,243,179,110,149,170, 54, 53, 34,130,209,138, 59,204, 65, 97,171, 53, 12, 1, 86,115,215,105,140,174, 34,189,217, 57,
+ 92, 92,192, 90,180, 87, 5,126, 82, 2,138,228,235,151, 73,149, 49, 6,148, 51, 38,177, 36,198,106,245,213,194,236, 96,116,184,
+234,206, 64, 74,212,184, 3, 31, 4, 73, 18,105,144, 50,156,242, 86, 98,119,235,158,186,227, 61, 80,123, 30,141,182,252, 94,201,
+184,189, 23, 99,214,191,185, 20,193,164,174,247,220,249,195,130,184,129, 97, 82, 85,166,183,175, 91,116, 54,197,105,194, 52,190,
+150, 90,199,221,109,170,211,168,212,255, 93, 41,212,206,190, 20,244, 81,206, 64,234, 92, 23, 68,169,165,253,137,115,170,159, 32,
+100, 1, 67,153,171, 0,238, 2,144, 64,170,108,220,171,196,161,126,158, 80,195, 39,218, 53, 95,237, 61, 82,181,198, 16,240,205,
+ 15,175,234,136,161, 7, 92,188,122,253, 6,159,125,250, 41,136, 8,175, 95,253, 0,183,174,120,247,246, 13,163, 17,237,132,121,
+225,240,148, 97, 28, 49,141, 35,110, 83,196,251,119,239,176,223,237, 49,207, 11,139,136, 60,103,105,175,206,215,186, 98, 94, 61,
+175, 18,214, 0,173, 61, 92, 72,176,154,224, 92,144, 14, 68,225,241,241, 17,110,101, 94,246, 48, 77,216,108, 54, 24,134,145,253,
+173,118,132, 86, 4, 51,142,188,131, 81, 26,144, 44,246,178,219,114, 33, 96, 94, 22,172, 62,224,233,112,192,225,120,196,229,178,
+180,221, 18, 1,161,172, 47,186, 68,157,218, 96, 21, 31,169,188, 94,170,179,213,164,204, 88,200, 40, 74,245, 16,121,123,106, 44,
+ 23, 50, 33, 68,188, 63, 28, 49,142, 35, 22, 71,216,111, 38,156, 93,192,236, 60,230,213,129, 48, 0,164,176,217, 63,227,157,246,
+198, 2, 98, 87, 25, 54, 26,195, 48,177,178, 86,105,172,203, 12,109,121, 71, 94, 86, 1, 89,246,223,195,184,193, 50,159,229,123,
+ 68,245,142,242, 97,200, 59,104,107, 52, 64,236, 72, 80, 57,177,223, 93, 25, 88, 99,112,120,122,192, 48,140, 80,138,176, 29, 6,
+132,196,159, 15, 31, 2,198,193,242,110, 93,254,110, 77, 92,105,206,203, 2, 82, 44,244,113,193,243,148, 65,194, 24,166,113,128,
+ 19, 76, 99,138, 17,122, 24,120,100,153, 51,182,219, 13, 66, 8,172,147, 32,194,233,114,134, 66,198,110,127,135,243, 60,195, 90,
+139,217,173,172,216, 86,132,232, 87, 62,156,193,123, 65, 51,108,176, 92,142, 48,118,228, 20, 38, 81, 60, 23, 71,192, 48,110,113,
+190, 28,248,123, 85,170,121,130,175,128, 18, 28,201, 24,147,170, 99,213,187,103, 47, 96,172,198,195,195, 59,158,132, 37,198, 27,
+243,154,137,240,195,119, 95,227,197,199, 47,241,209, 71,159,224,183,255,248,183, 53,101, 77, 21, 5,125,119,249, 85,123, 80, 79,
+151,234,242, 31,114,238, 16,167,104,110,131, 22,255,136, 46,202,247,199,160,182,162, 90,207,215,254,174,122,120, 89,107, 97, 37,
+224, 34,165, 40, 28,252,116,229, 33, 46, 73, 97,213,211, 47,207,125,200, 45,145, 14,185, 71, 96, 72,151,129,166, 0,206, 57,225,
+230,238, 57, 54,219,157,164,161,165,230,117, 22,111,175,214, 34,106, 45, 88,213, 10, 91,105, 34, 61,173, 10,179, 63,212,144,170,
+ 88, 68,109, 68,200,138,174,108,186, 9, 2,141, 81, 90,236,103,132, 20, 51,146, 6, 40, 71, 32,136, 16,201,106,201, 50, 96,124,
+111, 18,203,157,182, 26,218,235,122,233,151, 75,222,173, 43, 46,103, 22, 85, 26,107, 49, 12, 28,233, 60, 14, 6, 57, 71, 28, 79,
+ 71, 60, 61, 29, 5,122,146,176, 92,206,197,104, 8, 72,146, 93,209, 34,149, 25,138,146,100, 56, 37, 78,140,219,221, 22, 15,167,
+ 75,245,183, 67,115,151,157,114,134, 41,100, 67,186,198,241,148,169,131,181, 3, 70, 77,184,217,108, 96,192,129, 71,131, 49,146,
+ 34,201, 36,204,152,120,173,117, 90, 22, 60,205, 51, 46, 62, 34,200, 58,181, 36,194,149,220,248, 34, 8, 83,146,108,166, 44,167,
+ 58,106,217,119,103,112, 51, 64, 72, 44,160,181, 90,138, 20,158, 0, 70,121, 55,106,224,116, 89,201,200, 36, 38,137,168, 56,119,
+145,173,117,215, 68,252, 94, 40,161,195, 17,192, 64,175,206,198, 87, 61, 31,153, 47,113,202,101, 15,223, 68,106, 80,249,131,179,
+ 27,215, 16,157,148,171,120,174, 36,191, 23,216, 18,174, 70,237,168, 86,230,194,162,232,161, 81,232, 10, 54, 66,249, 25,115,135,
+215, 37,201,139, 23,207,122, 65, 25, 67,216,247, 49,116,155,254,118, 71, 27,116, 23, 77,181,177,200, 69,147,241, 97,214,115,171,
+ 24,114, 23, 89,135, 14, 72, 95,188,180, 49,113, 82,217,241, 50, 95,157, 31,229,114,127,245,250, 13, 62,255,244, 19, 88, 59,192,
+175, 51,182,219, 13, 14,135, 35, 94,188,120,129,199,195, 17, 55,187, 45,158,142, 39, 14, 10, 89, 87,188,127,255, 14,206, 57,108,
+242, 0, 13, 32, 0, 24, 7,139,105,154, 96, 53, 33, 64,193,175, 11,166,193,224,178,122,164, 12,140, 32,196, 16,113,184, 44,216,
+141, 6,239,143, 23, 12, 57,227,187, 63,126,135,237,134,179,165, 55,219, 45,166,105,194, 36,121,234,195, 48, 98, 24, 71, 24,239,
+ 96,237, 8, 45, 30,123,196, 8,196,136, 24, 28, 46,243,140,203,188,224,116, 58,225,237,187,119,120,122, 58, 96,150,209,118, 44,
+203,138,114,208,117,112,143, 50,173, 80,212, 52, 9, 74, 18,193, 74,110,116, 77, 28, 34,212,140,236, 32, 0, 18,173, 53,236, 56,
+ 33,197, 8,231,248,103,220, 77, 35,214,195, 17,218, 24,156,231,165, 59,212, 84, 69, 50, 34, 51,183, 88, 41,141,227,233,192,226,
+ 20,127,226,209, 99,206, 88,151, 11,239,177, 13,199, 12, 82,138,112, 11,139,182,188, 91,171,247,149, 36,144,198,104, 5, 37,118,
+ 55, 99,172,164,154, 69, 9,106, 0,206,167, 39,236,183, 91,168, 28,101, 68,141,234, 65,214, 4,204,203,204, 30,117,207, 40,218,
+193, 76,204, 5,247, 1,218, 26,104,193,212,134,192,187, 68, 99, 12, 92,136,152,180,173,151,137,150, 72,221,155,155, 29,158,142,
+ 39,108,167, 9,218,104,172,206,215, 41, 82,140, 30,131, 81,152, 93,198,118, 26,240,120, 60,192,106,219,137,202,196,242,229, 29,
+ 79, 32, 50, 91,198,148,176, 55,141, 50,152,131,135, 59, 63,225,197,199, 63,193, 31, 95,125, 47, 32, 25,211, 75,119, 68,147,209,
+ 30,250,226, 82,218,237,247,248,230,235,175,113, 58, 62,177,133, 46,103,124,252,147, 95, 96,191,191,197,111,254,241, 63, 98,154,
+ 38,252,250, 47,255, 26,127,248,242,159,228,117,166, 38,140,169, 23,181,170,153, 11, 77, 44, 67, 53,148,168,145,227,114,167,121,
+201, 87,249,236, 87, 23,124,238,163, 53,187,125,122, 73,249,171, 78, 22, 86,132,219, 34,246, 76, 9,115, 88, 58,123,157, 18, 47,
+116,190,178,245,229,171, 62,168,169,225, 83, 23,109,122,117,189, 84,113, 89,194,238,230, 30,219,221,109,237, 58, 74, 19,160, 72,
+ 85, 91,145, 22, 31,120,193,241, 42,106, 59, 95, 37, 47, 26, 73,172,110,204, 65,104,151,234, 90, 21,196,234,195, 58,226,143,129,
+ 19, 31,145,203,234, 43, 1, 58, 23, 25, 72,221, 99, 43,109, 42,225, 44,248, 22,179, 27, 17, 17, 83,224,168, 91,173,144, 36,246,
+ 54,139,147, 71, 41,133,168, 13, 86,231,112, 62,203, 24, 89,243,127, 31,222,191, 7, 41, 35,254,106,246,146, 47,203,204, 93,189,
+162, 90, 64, 87, 40, 76, 74,213, 26,104,180, 70, 22, 27, 21, 55, 46, 2,148,138, 9,131,209,112, 33,194, 78, 76,245, 75, 57, 99,
+180,230,234, 51,171,133,249,190, 25, 7,220,108, 38, 76,198,192,128,247,195,163,181, 98,253,226,224,172,197, 57,220, 58,135,237,
+233,130,135,243, 5,135,117,197,188,186, 42,106,131,172,225, 10,147,131,121,255,156,178,166,141, 17,235, 95, 18, 55, 73,233,240,
+ 51, 0,141, 36, 2,175, 18, 64,132, 16,234,219, 21, 37,196, 8, 2,111, 42, 43, 74,245, 47,164,200,241,133,206,225, 89,172,221,
+ 42,221,124,115,121, 48,150,181,123, 94,174,226,100, 85,109,222,187,152,203, 46,157, 61,183, 78, 25,169, 66,125, 84,157,188,100,
+153, 36, 65, 68,135,108,145,206,117, 18,139,150, 71,144, 27, 85, 81, 9,236,170,177, 35, 74,238, 75,170,241,217, 16, 18,222, 85,
+210, 92, 17, 88,150,114, 79,160,102,166,167, 34,166,130,168,140, 9, 89,229,142,170,131,138,108,164,234,117,101,224,255, 85, 60,
+ 34,181, 63,159, 84, 70, 10,190,143, 2,175,176, 21,133,140,227,229, 12, 59, 12,112,222, 99,216,236,112,120,122,194,139,231,207,
+ 16, 99,130, 38, 96,218,108,161,181,193,187,135, 71,108,119, 59, 12,199, 39, 16,177, 2, 62,198,136, 16,131,116, 77, 51, 54,214,
+192,110,118,120,251,150, 97, 53,155,145,201,104, 89, 51, 40,225,112, 89,240,252,217,103,248,250,219,111, 97, 1,156, 14, 71, 88,
+171, 49, 90,131,237,110,135,221,126,135,221,126,143,237,110,135,237,118,139, 73, 58,248,146, 57,173, 69,125,156,114,130, 95, 86,
+156, 79, 71,156, 79, 39,188,123,255, 14,111,222,190,195,249, 50, 51, 57, 78, 78,153,162, 26,101,241,146, 0, 53, 4, 76, 66,170,
+216,149, 80, 31,210,222, 75, 73, 29,201, 72,107, 93,131, 61,172, 16,247,120,194, 48,241,190, 58,105,188, 61,156,160,140,169,214,
+150,197,121,188,184,221, 74, 48, 12, 79, 46, 50, 17,252, 42,138,245,152,224,252, 69,188,218, 22,126,185,200,174,145,199,204, 57,
+ 6, 12,155, 29,130, 91,196,166, 97,106,199, 51,136, 0,140,199,209, 22, 57,204, 8,129, 59, 25,173, 13, 8, 9,151, 53, 96, 59,
+ 88,156,206, 23,220, 77,172, 54,205,193,177,184, 72, 84, 89, 86,236, 67,155,113,144, 49, 19, 97,191,219,241,229,237,189,232, 51,
+ 52,140, 36, 37, 89,163,235,235, 81,246,200,243,194, 5,204,101, 89,112,179,219, 33,132,136,211,133,255,157,115,158,107,166, 20,
+225, 97,161, 40,224,120, 62,194,142, 27,228,228,133,210, 88, 94,223, 4, 91,188,195,200, 76,139, 66,230,128, 29,217,159,127,250,
+217,175,112,185, 60, 9, 98, 83,215, 98,172,116,137, 73,242,215,107,138,161,224,101, 31,222,191, 3,153, 19,134,113,130,217,108,
+241,209,103, 95, 0, 41,227,219,111,126, 15, 99, 44,166, 97,139,127,254,250, 43,188,121,243,125, 99,159, 11,158, 54,137, 85, 38,
+198, 80, 87, 98,218,244,235,155,212,226, 48,187, 43,139,174,151, 99, 29, 4,165, 76,138,114, 45, 18,218, 30,178,169,112,141,140,
+103, 99, 98, 97,167,207,249,106,229,166,181,145, 92,106,217, 65,119, 74,224, 30, 85, 75, 93, 83,208, 2, 84,164, 32, 80, 13,183,
+154, 82,194,246,230, 22,155,237, 94,194,158, 98,221,197, 42, 34,118, 17,228, 12,163,153,193,175, 20, 97,245,190, 59,208,181, 20,
+ 96,186,203, 98, 87,136,146, 15, 94,178,236, 11, 96,167, 98,198,229,123, 97, 59, 82,150,231, 48,136,248, 75, 35, 71,209, 7, 40,
+ 43, 29,169,145,241,114, 99, 33,212, 53, 75,183, 54,163,108,170,128,216,201,179,173,181, 66,134,111,207,181, 60, 83, 72, 25,222,
+121,144,226,243, 12, 49,176, 10,220,175, 8, 41,192, 40, 98,110,132,140,155, 51,184,208,175,148, 50,165,249, 96, 15,252,123, 89,
+232,198,221,125, 33, 11,198, 18, 5, 44,239,175,238,156, 1, 74, 68,193,163, 29, 48,216, 1,251,205,132, 81, 2,149, 6, 99,120,
+205, 34, 35, 94, 31,121, 4, 63,141, 35, 51, 67, 14,192, 42, 81,187, 69,167,224,124,128,143,169,193,198,141,129, 29,140, 20, 67,
+ 25, 33,121,153,180,104,121,253, 89,206,168,160,219,199, 85,183,215,151, 74,238,130,192,113,114,138, 44,204,147,103, 55,198, 80,
+ 39,198, 60, 25,177,178,130,137,149, 14, 71, 53, 78,166,233, 48, 42, 24,152,114,109,160,174,241,192,141, 22,152,175, 50,203,133,
+ 30,168, 4,186,132, 70,150, 36, 36, 68, 31, 43,175,129,167, 15, 93,232,153,168,225,169,155,168, 85, 69,124,241,139, 95, 53,191,
+232,130, 90,169,107,160, 43, 1,137,243, 70,202, 84,167,252,153,156, 97,218, 54,191,140,128,115, 29, 3,244,190, 83, 84, 44, 93,
+ 25,171,169,250,114, 21,147, 62,196, 22, 80, 10,157,105, 26,126,220, 29, 16,167,226, 24, 24, 60, 29, 14,216, 10, 70,214, 45, 51,
+ 72,189, 64, 88, 87, 12, 70,227,225,253, 91,124,244,209,199,184,187,189,193, 56,109,240,252,207,255, 2, 95,253,254,183, 24,110,
+119,248,238,213, 27,217,153, 40, 22,192,236, 54,112,206,225,211,151,159,227,225,253,107, 56,199,106,242,152, 9, 55,183,119, 56,
+ 60, 61,226,155,239,190,151, 14, 63, 67,223, 61,195,195,227,123,252, 79,255,227,255,140,255,243,223,252,111,120,247,238, 1,131,
+209,216,108, 55,124,193,239,118,216,238,119,216,108,119,152, 54, 27, 12,210,101,113,110,116,192,178, 44, 56, 28,143,120,243,250,
+ 13, 14,135, 19,214, 16, 17, 65,245, 34,175, 43, 76,202,200, 33, 55, 86, 62,218,165, 93,137, 78, 84, 70, 46,205,248, 18, 18,143,
+115,188,140, 14,145, 18,214,224,235,206, 38,165, 8, 74,188, 43, 42, 19,146, 82, 9,186,148,112,190, 92,160, 69,200,147, 73,195,
+201,222,157,181,138, 12, 73, 9, 76, 54,225,138,118,113, 80,154, 3, 84,236, 48,192, 45, 23,126,199,229, 0,113, 41,137,232, 41,
+215,206, 61,184,165,138, 70,172, 28, 82, 90, 25,220,237, 13,142,151, 21,251,137,109, 63, 69, 5,110,140,130, 38,130,213,141, 42,
+118,154, 23,140,198, 96,201, 17, 86, 8,123,171,247, 48, 74,195, 14, 3,172,225,143,231,227,211, 1,251,221, 22, 49, 6,216,129,
+115,165,207,243,130,232, 3,134,205, 6, 16,126, 60,145, 8,143, 66,192,198, 90,184, 4, 12, 22,200,106,195,254,124,173,176, 4,
+ 73,165,146, 16,143, 28,131,116, 45, 35, 78,243,185,165, 64,229,132, 28,249,112,126,124,248, 30, 49, 9,118, 85,108, 55, 41,101,
+232,148, 5, 22, 67, 53, 24, 36, 22,223,111, 76,240,235, 5, 42,120,232,205, 30,183,207, 62,194,251, 55,175,176, 44,236, 65,214,
+ 90,131,236,132,199,135,119,112,243,153, 63, 23,154, 42, 98, 84, 41,141, 16, 28,119,195,170, 33, 95, 33,194, 24, 45,182, 62,213,
+ 65,163,122,181,123, 33,131,149, 46, 62,117,144,234, 22, 55,201,240, 16, 43,106,244, 44,118, 83,159, 98, 29,109, 22, 94,182, 17,
+152, 78,148,215, 43, 21,112, 82,206, 87,251,247,126,103,153,107, 64, 75,195,241,169, 14,126,179,221,223, 96,152, 54,226, 44,137,
+242, 26,242,215, 53, 74,215, 14,121,178, 67,253, 94,188, 15, 66,198, 3,172,100, 48, 12, 66, 8,140, 49,241, 5, 42,222,249, 82,
+ 4, 2,153,243,175,229, 34,190, 10,229,145,162, 72, 33, 3, 57,242,238, 63,200,235, 27,121, 23,106,141, 22,214, 0,167, 79, 22,
+226, 96, 95,188,151,233,138,207, 94,124,252, 9, 33, 7,238,182,147,174,207, 52, 8, 80, 65,198,218, 33,192, 7, 87, 5,116,148,
+ 2, 20, 18,144, 2, 66, 10, 80,214, 86, 67, 87, 33,101,150,159,177,106,113,196,219,173, 20,199, 93, 39,207,157,188,147,224,145,
+197, 49, 77,178,172, 35,248, 57,105, 44,116, 35,255,108,148,194, 52,142,216, 12, 3, 70,163, 97,149,230,137,156,228, 24,152,200,
+ 59,246, 65, 58,240, 16, 35, 11,148,125, 96, 98, 36, 18, 79,214, 68,240, 7,120, 88,101, 36,234, 21,194,226, 72,141, 83,160, 13,
+178, 15,165,218,227, 12, 15,109, 17, 3,251,240,165, 3, 68, 10,252, 30,164, 28,235,221,170, 84,217, 93,179,243, 65,105,110, 0,
+136, 20,211,225,228,115, 73, 61, 31,160,112,223,175, 2,120,202,104,191,165,166, 16,229,171, 12,129, 86, 38, 55,126, 75,213,161,
+105,177,112, 18, 65, 83,135, 11,239, 98,107,209, 11,224,196, 41,150, 83,172, 29,122,155, 98,118, 60,247, 26, 37, 91, 38,186, 45,
+104, 77, 56,135,204,138,145,115, 1, 89,203, 62, 61, 87, 57,183,220,215,229, 98, 33, 57,136, 59, 5, 98,141, 86,197, 85,130,209,
+213,124,190, 88, 1, 50,163, 12,159,221,108,113, 56,159, 27,118,175, 74,239, 91, 37,246, 31,254,211,223,227,175,254,139,255, 12,
+199,239,191,195,237,243, 23,248,234,171,223,227,254,217,115, 76,227,136,103,207, 70,204,203,130,253,110, 11,231, 28, 14,139,199,
+175,255,242,191,196,229,240,128,243,233,132,243,188, 96,245, 17, 90, 1,135,195, 1, 32, 30,255, 25, 51,112,146,155,101, 66,209,
+124, 62,193, 24,139, 23, 47, 94, 84, 48, 69,112,172,190, 85,198, 98, 73, 18, 80,224, 60,176, 6,216,199, 3, 54, 90, 99, 55, 24,
+ 12,155, 9,211, 52, 97,156,166, 58, 26, 69,206, 88,150, 21,167,211, 9,135,227, 9,139,247,213, 70, 19,168,236,150,168,249,125,
+ 73, 73, 86, 48, 71, 48,146,248,117,139, 32,164, 64, 66, 82,110,185,196, 70,196, 39,170,203,117, 46,249,200,138, 8, 26,169, 38,
+ 23, 25,109, 26,202, 82,170,215,139, 3,172, 78, 98,205, 81,226, 66,200, 80,138, 69,114,229,205, 12,158,119,235,118,152,176,172,
+ 51,148,160,118,215,249, 12,101, 71,238,138,141, 69,188,156, 0,109,144,114,104,251,127, 36,144, 98, 97, 80,150,228, 49, 78, 50,
+226, 3,122, 9, 10,163,229,195,245,102,187, 5, 64, 24, 6, 78, 67, 83, 90, 33,134,136, 73,198,129, 38, 51,168, 34, 4,177, 10,
+198, 8,171, 20, 92, 8,149,220,118, 60,157,249, 32,200, 9, 15, 79, 7,172, 94, 14,178, 49, 35, 81,170,238,129, 40, 31,110, 82,
+ 26, 58, 19,230,101,198, 96, 71,246, 34, 59,119,149,149,205, 54, 39,170, 15,204, 96, 71,246,189, 6, 15,173, 13,124,112, 72, 57,
+227,211,143,127,134,239,191,255,170, 10,141,216,174,212,117,127,162, 76, 85, 42,201,197,206,223, 67,240, 14,201,123,108,136,240,
+195, 55, 95, 34,172, 51,251,190,149, 2, 13, 27,156,206, 71,172,151, 35, 6,173, 36,134, 82,213,177,122, 81, 68,215, 66,162, 4,
+167, 84,129, 18, 33, 38, 92,177, 36, 26,251, 32, 95, 69,160, 10,172,176,250,191, 89,189,142,154,116, 85,194, 86,202, 63, 43, 41,
+188, 99,106,118, 87, 34, 85, 17,151, 94, 4,146,245, 34, 47, 14, 26,186, 90,180,161, 90, 95,186, 67, 42, 3,184,189,125,134,105,
+183,151, 17,123, 18,198, 55,119,219,253, 56,211, 16,129,140,134, 49, 34,142, 10, 28,175, 28, 51, 79,243, 42,119, 95,224, 40,101,
+ 26, 80,242,196, 11,147, 92,107, 45, 43,175, 98,101,147,230, 35, 21,165,244,117, 92,108, 9,114,210,162, 40, 47,207,125,121,111,
+178, 40,241,139,207,153,227, 85, 11, 34, 85, 46, 3,173,153, 51,145,149,136,104, 1,146, 11,212,203, 78,254,124, 57,241, 51, 88,
+109,136, 17, 38,115,215,237, 67,225,131,215,152, 16,153,142, 20,146, 24,137, 80,149,191, 23, 83,244, 33,162,180,247,129, 5,195,
+140, 42,102, 54, 71,148, 11,149,247,224,186, 46,139,147, 8, 86,171,200, 83,105, 64, 43,228, 10, 8,210, 80, 8,208,153,195,149,
+238,182, 91,184, 91,143,211,188, 96, 9, 44, 8, 84,158, 45,105,193, 11,129, 50, 19,131,187, 98,108,175,177, 32,137, 11,168, 39,
+ 75,170, 29, 4, 54,163, 52, 71,191, 90, 99, 17,235, 93, 28, 91,110,125,209,110, 9,227,127, 17,161,171, 22, 23, 82, 12, 45, 66,
+ 25, 18,125,172,184, 66,230, 95, 35,127,176, 42,190,214,149,212, 69, 82,238, 44,219, 31, 76,161,203,243,196,223, 51,175, 19,203,
+197,174,192,231, 14,149,208,210,226,187, 47,211, 52,234,156, 37, 10, 18,198,130,235,128,165,146,244, 41,247,109,121,132,170, 13,
+ 78, 46, 97, 85, 56,251,133, 9,145, 19,114,140,200,117,167, 94,227, 5, 83,219, 35,100,170, 6,254,171,150,191,131,201, 55, 53,
+110,169,107, 84, 83,235,166,140,127,248,237,151, 87,240,128, 92,101,249,185, 34, 45,181, 54,176,195,128, 28, 2,238,239,239,241,
+199,111,190, 1,140,197,159,252,242,231,172,104, 95, 87,236,111,110, 96,150, 21,255,252,245,215,208, 72,194, 57,102, 60,163, 22,
+ 2, 90, 1,148, 12,118,128, 25, 25, 37, 91, 96, 0, 33, 38,188,121,243,154,141,249,214, 96, 26, 71, 60,255,232, 83,252,237,191,
+251,183,248,228, 39, 63,131,214, 26,222, 59,188,123,253, 26,206,175,112, 62,224,193, 69,228,211,130, 73, 1, 91,173,152, 23, 47,
+ 73, 62,206, 71,248, 24,133,102,197, 85,154,151,125, 71, 4, 71,234, 33,101,248, 84,236, 35,185, 90, 17,174,240,145,221,232, 46,
+165,212,197, 96, 2, 65,126,159,209, 13, 39, 88,201,125,245, 13,103,175,166, 18, 68, 38, 41, 13,149, 18,103,254,138, 47, 30, 86,
+213, 52, 57,146, 14, 35,138, 26,211, 90,246,191, 59,191, 86, 11,197,122, 57, 65,141, 27,248,117,134,177, 19,206,167, 35,110,110,
+159, 97,157, 79, 8, 41, 99,210,134,215, 16, 17, 48, 36,160,160,204,194,176, 97,224,109,206,118,183, 3, 69, 15, 31, 34,246,155,
+ 17,243,178, 98,187,153, 48, 89,131, 20,184,224, 90,211, 10,100,224, 36,220,129,105,179,197,121,158, 37,183,216,113, 78, 48, 50,
+ 46,107,192,110, 26,112, 88, 29,148,136, 77,172, 53,112, 62, 98,179,153,176, 58, 7, 61,141,240, 33,192,249,128,197,121,220,109,
+ 70, 12, 90,193, 69,224,238,246, 6,203,194, 46, 2,206, 18, 16,180,171, 36,172,141,102, 15,231, 23,152,114,236,144, 70, 66,132,
+ 15, 14, 25,128, 53, 3,140, 29,224,188,131, 81,165,112,109, 7, 69, 46, 59, 62,105, 37, 89, 5,207, 23,134, 34,238,246,151,249,
+ 36,236,110,222, 9, 7, 31,145, 37,215, 96, 59, 90, 17, 24,201,158,184,236,127,101, 21, 19, 99,106,121,235,130,103,101,223,120,
+108,123,245, 78, 9,143,206,231, 90, 96, 22,138,218,211,217,232,102,185, 97,112,113,149, 4, 42, 99,240,150, 39,159,114,198, 42,
+194,197, 43,145, 15, 82, 23,228,148,127,156,146,170,122,187,125,194,237,253, 11, 76,219,125,169, 64,248, 60,137, 44,124,178, 70,
+215,140,112,107,141,116,123,188, 39, 37,185,248, 93, 8,240,194,183, 55,186,192, 68, 24, 22,131, 20,234,202, 41,198, 70,185, 43,
+ 7,110,202,220, 41,199,196,133,152,210, 12, 94, 42,156,252, 38, 54,226, 21, 75,190, 10,217, 96,173,133, 21, 78, 58,201,206,148,
+192, 19, 40, 66, 66,140,165, 24, 40,100,202,166,112,143, 50,153,225,125,188,170, 93,247,124, 62, 49,238,183,122,172, 19, 12, 37,
+ 9, 12,241, 2, 87,146,206,150,168,218,253,248,124,141, 53, 6, 55,165,140, 80, 35,122,149,144, 12,121, 69, 19,100,162,148,115,
+ 3,186,104, 81,247,247,194,175, 16, 56, 42, 58, 12,137, 47, 66,169,201, 98,230,198,137, 99, 85, 11,209, 78, 99,191,221,226,217,
+110,139,195,204,148, 73,165, 8,227, 56, 9, 66,149,213,234, 92,132, 17, 11,238,100,154, 81, 26, 16,200, 10, 44,134, 36,118, 74,
+ 89,103, 25, 13,157,129,236, 75,146, 97,187,136,179,156,153,204,246,183, 18,198,100, 90,186,154,124,222, 9, 5,247,160,164, 89,
+189, 6,216, 20,107, 49, 41, 89, 69,101,234,226,132,243,255,111,176, 79,139, 25, 46,113,167,242,122,138,239,159,196,218,217, 79,
+ 3,122,114, 31,114,234, 62, 87,168,171,236,230,205,191,246,164,231,110,236,207,176, 26,197,105,208,164,106, 97, 84,139,105,185,
+143, 19, 1,166, 8,100,138,206,254, 71, 65,113, 29,121, 62,119, 75,123, 92,141,230,219,222, 34, 83,198, 48, 12,200, 4,252,240,
+238,125,135,175, 42, 56,196,212, 88,183, 32,252,246,203,223,227,243, 79, 63,198,188, 44, 8,222,227,139, 47,126,130,183, 15, 39,
+252,240,234, 13, 62,122,254, 12,222,123, 28,143, 39, 56,183,226,249,139,143,240,254,205,247,216,110,119, 32,165,177, 11, 91, 9,
+144, 89, 16,101,188,179, 46, 51,140, 86,136,226, 33, 45, 9, 60,101, 28,147, 98,192,233,228,161,213, 5, 79,143,252, 54,155, 98,
+ 79,210, 6,217,185, 43, 40,192, 37, 18, 78, 62, 34,102, 95,247, 40,150,128,231,187, 9, 58,120,132,152,225, 18, 33,228,140, 84,
+130, 14, 4, 21, 91, 5,136,124,140,212, 78,157, 72, 65, 33,117,161, 6,237, 13, 45,226, 38,173,168, 38,120,149,176,143, 98, 25,
+ 73,208,136,209,193, 88, 91,161, 54, 74, 41,184,249,130, 97,154,170, 40, 13, 34,180, 41, 7, 80, 76, 17,118,220, 32,198,192,251,
+183, 24, 5,237,155,171,250, 61, 2, 64,240, 32, 40, 56,183,192,218, 17,235,229, 4,109, 13,146, 91, 17,201,178, 24,133, 12,180,
+116,200,138, 20,144, 3,230,213, 99, 51,104,168, 28,112,246, 17,207,119, 35,114,226, 29,154, 15,124,192,164,156,177, 44, 14,171,
+247,184,217,239, 48, 70, 38,215, 93,230,153,169,112,146,154, 54,207, 11, 62,250,232, 5, 98, 60, 98, 89,153,126,231,156, 67, 72,
+ 73,236, 71,124,225, 77,195,128,195,233, 12,163, 21,230,197, 85,198, 55,217, 45, 84, 94,176, 58, 62,180, 41,103,152, 2,135,144,
+ 7, 33, 5,143, 8, 5,107, 39, 94,101, 40, 45, 27,170, 86,100,101, 9,124, 40, 40,217, 34,206,162,106,165, 34,153,190, 16,114,
+226,247, 77, 19, 33,138,211,130,192,227,226, 50,225, 40,128,167,148,100, 98, 85,118,111, 50,114, 46,130,160,162,250,174,214, 82,
+121,132,130,164,118,149, 81, 33,100, 55,138,210,209,151, 63, 39, 56,207,162, 10,207,200, 53, 24, 38, 95,237,245, 10, 21,171,101,
+ 63,243, 37,168, 68,187,146,170,109,142,208, 67, 47,210, 7, 14, 0, 18, 79, 90,249, 37,255, 34, 33, 97,127,115,199, 2, 56,112,
+ 66,157, 82,141,227,205,150, 70, 96,180,188,171, 31, 44,187,102,148,150,142, 82,188,227,101,188,206,171, 27,131,113, 28,161,181,
+149,194,214,201, 78, 92,210,235,132, 55,223,200, 41,169,250,133, 21, 41, 94, 37,116,185,243,195, 96,225, 99,172, 35,250,166, 16,
+167,234,192, 80,117,165,145,171, 24,210,202,168,191,124,173,156, 24,110, 3, 72,161,219,251,143, 35,147, 1, 67, 10,181, 25,242,
+206,241, 46, 93, 94,219,173, 16, 99,180,192,153,138,117, 74,107, 5,157,116,157,118, 52, 69,117,148,117, 66, 66, 74, 60,209, 42,
+ 69, 59, 7, 90,145,116,235, 10, 86,183,144, 43,165,196,231,140, 70, 37,115, 62, 96, 94, 87,104, 99,144,136, 96, 97,196, 47, 13,
+ 40, 89, 67, 4,207,152,111,102,191, 3,251,221, 22,187,195, 17,143, 2,250, 74,164,235, 62,159,114, 20,111,184,146,188,137, 92,
+ 93, 8, 21,141, 74,138, 27, 16, 2, 84, 74,208, 57,203,228, 49, 3, 8, 40,241,240,138,168,114, 31, 32,153, 34,198, 88,104,189,
+136,136, 56, 94,161,118,155,134,171,203,175,151, 78, 87,245,200, 89,124,112,143, 81,135, 69, 46,147, 46,153,166,150,215,173,137,
+211,155,173,212,200,153,163,144, 17,156,135,182,186,174, 15,138,128,173, 38,253, 81,113,151,245,105,170, 34, 80, 87, 84,127,134,
+ 26, 5,156,113,165,202, 47, 35,132, 74,148,168,163,123, 98,104,125, 74, 48,140,203,149,202,131,250, 49, 95, 91,216, 23, 91, 12,
+165,198,151,189,142,130,235,200, 56,224, 29,151,145, 67,228,202,215, 78,109,132,152,101,124,121, 56, 95,176, 63,157,113,127,123,
+203, 22,182,205, 14,239,191,250,103,220,223,221,227,253,227, 19,126,246,211,207,241,253,247,223, 99,220,236,160,173,197,179, 23,
+ 31, 97,176, 3,222,189,254, 35, 82, 76,152,125,146, 17, 13,199,109,110, 55, 19,179,204,197,182,149, 50, 42,142,146, 10, 92, 83,
+ 94,216,148,178, 28,224,124,208,172, 62,226,102, 51, 98, 93,157, 0,101, 74,166,112,174,193,244, 94,242,163,222, 5,194, 60, 23,
+ 8, 11,255, 62,149, 51, 34, 20,166,205, 6, 58, 72,231,128, 92, 15, 92,234,114,184,155, 61, 74, 93,113,129, 21, 21,159,186,170,
+ 74,223, 44, 29,123,148,221, 76,202, 25,163,209, 72, 50, 66,215,162, 64,215,214, 50,152, 39, 39,172,242,245,140, 29, 68, 72,145,
+161,141,129, 95,103,142, 41,141, 65, 84,162,128, 53, 22, 33,242,207, 57,109,247,112,243, 25, 81,114,173, 65,192, 52,140, 56, 93,
+206,184,189,185,193,188, 44,184,204, 23, 86,249,202,222, 19, 57, 84, 30, 56,100,188,185, 27, 52, 66, 6,118,131,129, 2, 48,140,
+ 3, 23, 23,138, 15,194,209, 26, 60,157, 0,219,254, 44, 0, 0, 32, 0, 73, 68, 65, 84,206,156,208, 54, 88,220,222,220, 64,157,
+103,236,110,182, 88,102,182, 11,158, 78, 71, 4, 9,251,240,129, 49,191,175,223,190,227,181,139, 86, 56, 10, 35,123, 94,121, 98,
+ 16, 82,134, 22, 63,243,124, 62, 96,220,236,225,151, 11, 86,231, 49, 78, 27,204,231, 51,180, 70, 77, 96,227, 41, 79, 64,136,190,
+182,149, 41, 71, 14,232, 80,108, 31, 52, 0,158, 30, 95, 33,229, 4, 67,154, 47, 94,209, 75, 80, 93,149, 48, 68,136,148,226, 61,
+188,226, 20,195, 92, 98, 74, 69,168,149,147, 92,254,221,222, 44, 85, 44,102,170,151,106, 74,205,254,169, 74, 71, 44,255,203,123,
+234,114, 24,137, 31,215, 88, 94,167, 4, 39,187,243, 62,181, 41, 95, 7,184,228,230,213,102,113, 81, 99,179, 3,101,228,158,132,
+110,149,174,182,121, 85, 79,147,210,135, 1,209,210, 26,113,196, 99, 57, 47,166,205, 22,187,219,123,233, 38,163,140, 26,115,139,
+232, 36,192, 71,126,255, 9, 25,211,192, 41, 93,236,249,229,231,195, 24, 13,231, 19,156,243,146,230,165, 27, 94,122,185,112, 23,
+ 89,158, 11,185,204,180,136, 82,181, 92,210,181, 51, 18, 95,118,121,111, 33,227,100, 2, 95,208, 73, 68,101,197,142, 70,196, 35,
+110, 45,107,157,226,253, 7,177,245, 75,137,157,202,139,189, 51,196, 8,107,153,111,177,134, 88, 35,134, 99, 2,160,115,103,251,
+ 2,140, 2,188,155, 17, 98,172, 77,196,126,216,201, 36,202,178,197, 43, 37,113, 82, 16,116,226,244,199, 16,228,243,137,230,102,
+200, 37,130, 51, 37,104,165, 69, 47,146,234,100, 47,196, 84,255,174,162, 84, 87, 53,226, 87, 46,245,192,151, 58,105,133,144, 51,
+236, 96,101, 84, 47, 29, 98,206,136,129, 49,220, 41, 69,206,104, 39,194,237,118,131,211,225, 8, 50, 26, 67, 2, 54,155, 9,206,
+ 7,196,245, 34, 19, 1,213,162,121,139,115, 35,101,144, 92,124, 62,164,154,236, 86, 10,110,254, 30,121,133, 85, 24,243, 41,179,
+215, 93,139, 93,173,128,127, 98,232,128, 71,185, 93,236, 41, 43, 73,204,108,219,226,182, 68,111,221,124,203, 49, 47,171, 43,170,
+187, 42, 42, 69,181, 36,236, 21,243, 99,209,165, 68, 97, 11, 20,246,128,146, 21,176,150,137, 37,170, 79, 61,182,244, 63,185, 67,
+115,191,211,239, 98,214,171,188,170,122, 88,164, 24,168,159,133, 92, 97, 83,170, 49,151,249,110,149,194,206,148, 11,165, 66, 38,
+240, 65,248,251, 85,102,171,232, 26, 83,251, 29, 21,131,216, 25,176,135,193, 98, 71, 93,133,241, 35, 83,108,219,193,167, 24,241,
+240,116,196,199,207,159, 99, 62,159, 96,141,197,221,221, 61, 54,155, 13, 78,231, 19,150,101,197,139,231, 47,240,234,221, 59, 0,
+192, 71,207,238,241,135,175,190, 68,112, 43,238,110,111,240,201,142,224,226, 6,203, 60,227,238,102,135,211,249,130, 36,148, 52,
+ 3,224,178,250,166, 78,141, 12, 87, 41,170,198, 44, 31,148,114, 24, 12,198,224,102,191,195,179,219, 27,196, 20,113,185, 44, 56,
+ 93,102,184, 28, 43, 92,135, 18,119, 63,206, 57,244,105,121, 73, 58,241, 44, 86, 7,165, 50,200, 42, 57, 24, 60, 87,248,146, 54,
+148, 58, 46,124, 57,127,217,218,150,234,138,162, 38,221,137, 66, 53,203, 33, 82,132, 92, 40, 8, 83,146, 76,100, 98, 75, 77,206,
+ 76,197,163,228,121,126,150, 99,205, 69, 46, 65, 48, 33,114,165,184,172, 11,198,113,132,247, 14,218,110, 16,253,130,224,207,200,
+ 68,176,150,131,114,180, 34,204,235, 10, 99,216,215, 30,188,231,196, 38,197, 85,183,210, 22, 17, 4, 3, 94, 55,164, 53,214, 75,
+226,229,102, 18,124,162, 65,146, 32,148, 65, 19,134,113,196,225,112,196, 48, 16,116,206,152,166, 17, 86,139,157, 4, 36, 29,187,
+194,102,218,224,253,211, 19,140,102,251,212,195,211, 19,172,101,123,140, 15, 1,214,176, 40,111, 48,138, 89, 5, 68, 24,149, 66,
+ 8, 17,219,253,158,137,116, 49, 98,119,115,139,199,167, 71, 12,166,113,161,167,105,199, 59,201, 36,163, 84,133,170,190, 46,249,
+222,153,120, 15,106,204, 80,199,100, 41,103, 88,194, 85,245,207,233,119, 90, 62, 31, 90, 98,116,249,194,247, 34,190, 42,162,157,
+ 16, 89,116,216, 86, 94,252,144,150,162,173, 60, 67,124,184,245,105, 13,237, 51,211,128, 28,210,165, 43, 18,144, 74,174, 99,246,
+ 98, 25,138, 41,139, 48,167, 77,130,148,184, 80, 74,183, 26,139, 44, 55,149,130,183, 75,182,202,215,144,232, 90, 20,252,232, 63,
+109, 34, 96,140,197,205,221,243,166, 60,151,239,161, 48,199, 73, 78,212, 20, 66,101, 7, 24,177, 87,169, 24,144, 18, 97, 51,141,
+146,162,229,101,136,168,161,173, 68, 62,135, 85,188,239, 25, 41, 82,133, 55, 21, 37,114, 9,186, 1, 50,143, 43, 37,122,139, 45,
+ 92,237, 61,179, 70,215, 81,191,210,242,204,130,129, 46,137,171,132,106, 97, 83,242, 12, 26, 37, 5,131, 4,163, 68,153, 56,148,
+ 49,190, 22,182,120,146,181, 73, 12, 17, 33,129, 29,224, 49,114, 19, 17, 35,148,102,209, 33,167, 63,138,163, 33,120,140,219, 9,
+227, 56,114,145, 23, 73,128, 63,133, 22, 23,107,164,111,204, 36,121,247,185,122,151,235, 94, 88, 17, 40,181,130, 38, 36, 6,200,
+132, 16,129, 17,114, 22, 93,219, 11, 83,202, 88,156,231, 92, 4, 41, 40,180,228, 97,144,164,172,165,200,107, 71,183, 44,188,190,
+ 72, 9, 70,107, 88, 89,165, 42,226, 8,101, 46,214, 36,222, 84,107, 97, 4, 72,167,173, 24,179,173,165,177,137, 57, 35, 5,118,
+ 91,105,207,231,118,195, 4, 19,136,146,128,115, 80,145,175,144,212,195,152,120,228, 78, 87,147,114,193,196, 42,142,120,174, 11,
+118,228,234,117,167,162,123,168, 12,157, 84, 47,113, 94, 19, 36,212, 13,124,110, 66,228,178, 53, 74, 37, 81, 49,177,110,161, 80,
+ 60,181,208, 84,147,160,113,115, 74,157, 71, 94, 6, 7, 37, 1,224,195,196, 63, 69,232, 31, 45,254, 53, 71,203, 86,160, 84,254,
+144,243,150,175,117, 45,242,186,153,154,200, 68,248,241, 3,140, 54,242,224,106, 48,117,151,247,135,250,251, 92, 99,129,181, 82,
+ 28,137, 90,197, 2,169, 2, 6, 72, 1, 57,166, 43,170,213,188,174, 56,158,207,248,228,147, 79,240, 79,255,248, 15, 48,214,224,
+ 50, 3,203,188,224,135, 55,111,112,179,221,226,114, 58,227,238,246, 30,239, 30, 30,241,236,238, 22,199,227, 1, 57,115,144,193,
+ 15,111, 56,108,227,249,253, 45,140,230,100,183, 67, 10,252, 48,169, 80, 49,124, 33,202, 1,171, 50, 44,177,253,131,247,214,220,
+ 17,236,167, 17, 95,124,254,146,187,246,101,133,243, 30,171,115,112,222, 99,158, 23, 60,157,103, 92, 86,135, 97, 26, 48,159,151,
+ 42,108, 98, 36, 33,191, 35,251,205, 14, 65, 34, 71, 75,146, 84,240, 78, 62, 86,170, 94,222, 68,157,207,175,218,216, 84, 83, 47,
+139, 15,149, 36,119,154,186,220,222,162, 71,168,226,189,178,155,145,135, 56, 6, 95, 15,173,146,120,230, 67,224,160, 17, 73, 4,
+ 99,101,188,149, 76, 98, 3, 77, 25, 89,196,112, 90, 41,248, 16,184,251,245, 78,186,195,146, 73,200,135,112, 42,233,114,209, 67,
+105,139,213,123,220,109, 6, 92, 60,225,197,118,192,251,243,204, 10,242, 12,172,206,195, 90, 43, 2, 70,233,128,164,195,222, 76,
+ 3,199, 71, 26, 30,129,166, 12,134,200,164,140,119, 79, 7, 4, 31,144,146, 97,181,126,193, 92,150,241,121, 12, 32,133, 10,215,
+200, 57, 99, 51, 50,220,227,116, 58, 33,103,194,118,183,199,188, 58,102,192, 23,241, 89, 6, 39,117,169, 38,142,138, 41,202,238,
+ 54, 85, 33, 74, 25,103, 59,183,212,125,117,146,220,236, 50, 58, 55,196,214, 46, 2, 48, 24, 3,159, 25, 57, 26, 35,131,145,202,
+184, 54,150,139,134, 32, 74,104,238,218,147,112,219,181,230, 74, 59, 22,184, 8,250,241, 95,211,179,148,180,187, 44, 92,235,154,
+ 26, 86,214, 72,229,130,136,237,107,215, 96,152, 46, 76, 40,215,196,183, 46,212,163,246, 32,109,199,220,187,218,169,187,212,251,
+157, 97,155, 42, 40,220,220, 63,131, 30, 70, 97,112,167,234, 57, 71, 77,113,228,152, 94,173, 21, 2, 88,193,142,156,177,174, 43,
+110,246, 59, 40,176,141,106, 89, 86, 25,179, 14,204,254, 79, 9,209, 59,104, 81,187, 19,154, 85, 40, 75,215,162, 42,103,163, 77,
+ 60,180,156,184, 53, 85,140,152, 93, 65,226,242, 41, 73, 93,214, 10, 2, 90, 27, 17, 55, 69,172,222, 9, 73, 81,215, 3, 55,201,
+247,174, 74,247,206, 87, 71, 43,152, 20,193,175,190,114, 6, 74,232, 80,142,157,152,145, 0, 23, 50,148,182, 72,171, 19,151, 17,
+225,116,153,241,209,179,251, 26, 13, 42, 88, 66,100, 17, 84,229,148, 96,181,105, 1, 33, 50,237,236,233,128,101,242,163,138,248,
+ 67,154, 57, 31, 51,102, 23, 48,141, 17, 67, 8,136,105, 64, 17,153, 23, 86,134,143, 17, 36,116,192,152, 51,116, 52,242,249,146,
+203, 50,178, 88,209,133,136,236,189,172,166, 2, 70,165,112,242, 14, 74,107,108,236, 0, 90, 86,144,181,213, 7,159,138,206, 67,
+208,208, 44,161, 43,133, 48, 95,165, 62, 70,152,168,174, 1, 73, 96,241,156,206, 26,164, 44,131,167, 4,155,173,212,208,197,143,
+182, 72,225,130, 0,230, 13, 85, 17,121,150,140,131,214,101, 23,113, 12, 21, 91,118,161, 41,202, 56,190,178, 21,169,205,162, 83,
+ 73,214,236, 52,226,171,231,241,127,145,158,105, 98,215, 80,239, 57,191,106,201, 83, 29, 16, 92, 89,211, 84,226,200,240, 26,217,
+218,157,245, 64,211, 81, 81,199,178,104,217, 46, 4,146,181, 37, 17,193,244,152,200,126, 52, 87,243,132,235,162, 33, 73, 8,193,
+255,199,214,187,252,204,118,165,231,125,207,186,238, 75,213,119, 57, 36,155,108,170,213, 45, 89,105,201, 86, 4, 36,182, 0,195,
+179,252, 11,153,100,152, 12, 50,201, 63,145, 81,198, 25, 4,200, 72, 6, 18,195,115, 79, 50, 74, 0, 15, 50, 14,144, 32,114, 44,
+ 7,146, 98,165, 37,183,196,110,178,121,120, 46,223, 87, 85,123,239,117,205,224,125,223,181, 86, 29,167, 1,129, 34,121,120,206,
+ 87, 85,187,214,122, 47,207,243,123,234,125,103, 94,123,150,171,236,230, 75,173,248,225,251,183,237,255,151, 68, 45,129, 86,208,
+ 10,170,220, 65,238,127,253,155,183, 56,173, 43, 52, 10,126,246,179,223,197, 95,252,219,191,194,211,211, 19, 82, 8,240,207, 30,
+191,253, 91, 95,227,251,119, 63, 96, 93, 79, 56, 63, 61, 33, 70,130,160,196, 24,112, 62, 45, 48,198, 34,196,132,215, 27,117,147,
+203, 60, 3, 12,104,209,198,160, 50, 52, 37, 51,252, 95, 66, 70,180, 82,112,134,236, 86, 95,126,245, 21,126,246,179,223,161,232,
+192, 24, 16, 99, 68,140, 17,251,182, 99, 15, 7,182,235,134, 35, 4,202,240,142, 25,223,189,123,143,203,118,112,230, 52,171,142,
+173,135, 30, 8, 78,205, 62,194,145,124,221,127, 73, 15, 73, 26, 4, 70, 10, 34,232,161, 78, 56, 75, 4,232, 40,138,224,106, 81,
+243,254, 30,149, 18,193, 82, 10,240,122,110, 66, 28, 99, 52, 18, 51,182, 19,219,102,168, 42,142,152,252,140,192, 89,230, 33, 70,
+ 56,103, 73,209, 92, 11,239,149,137,121, 94, 43,233, 12, 52, 39, 95,213, 92,218,248, 88,246,200, 70, 43,236,225,192,201, 91,188,
+108, 1, 79,139,195,119, 47, 87,124,249,176,224,117, 11, 4,178,240, 30, 21,192,186,174,164,140,223, 15, 28, 57, 99,157, 60,140,
+ 34, 95,112,174, 25,183, 35,192, 92,175,205,122,131, 66,113,157, 97, 59,168,147,147, 24, 88,107, 17, 34, 90, 24,136,124,150,185,
+ 82, 39, 69,157,183,195,228,200, 54,103,148,106,251,248,105,242,204,161,206,208,213,182,231,179,121,151,107,129, 82,212, 97, 16,
+222,170,224,118,123,105, 5,133, 17, 58, 89,169, 80,186, 0,204,162, 38, 4, 48,237, 47,139,214,116,241, 72,242, 85,171,223,136,
+225, 96,248, 64, 41,140,220, 84, 50,246, 70, 31, 93,171, 38,122, 67,103,181,139,200,135,165,169,142,189,196, 45, 40, 35,151,166,
+152,183,198,192,232,202,192,143,114,151,216, 38,163, 70, 74,101,172, 3, 99,190,242,185, 87,113,111,164, 25,248, 29,186, 43,234,
+164,131, 80,156,210,183,156, 30,155,118,166,240,206, 81,228,187,109,207,205, 81,188, 52, 49, 99, 94, 38,207, 29, 83,138, 4,163,
+138, 9,218, 16,252, 36,231,132,215,235, 21, 41, 83, 82,152, 98, 30, 57,223,176,109, 10, 37, 24,212, 58, 52, 96, 85,245,194,199,
+ 90, 34, 8, 70, 78, 15,148, 78, 42,115, 90, 92,140, 52,249, 17, 61, 3, 29,238,244,221, 82, 3,100,222,218, 14,191, 33,109, 64,
+ 38, 53, 61,239,220,229,115,115,198, 52, 71,134, 81, 64, 76,145, 63, 23,162,203,125,184,109,180, 42, 67,207, 23,223, 66,194,236,
+ 73,249, 77, 5,189,230, 76,109,210, 60,100, 77, 69, 7,152, 5, 79, 13,153,106,147,191, 60,104, 7, 36,248,163,193,102, 20, 93,
+ 64, 71,200,240, 46, 33,198, 8,197,154, 28,197,130,200,148, 9,248,164, 84, 34, 21,181,120,241,229,242, 97,191,124, 46,210, 37,
+179,197, 16,228,149, 39,177, 91, 38,110,252,178, 16,215, 93,194,116,106,234,128, 51,182, 30, 88, 67, 81,168, 57, 69,164, 66,239,
+159,188,150,190, 10, 55,112,142, 52, 30, 33,202, 20,150,214,150,211,180, 64, 27, 10,190, 33,189, 72, 1,138, 38,198,202,192,168,
+175,101, 8, 62,210,125,204, 77,191,160,176, 0,145, 46,248,202,145,171,253, 66, 45, 45,175, 35,229,210, 45,167,124,223, 29, 44,
+206, 61,175,180, 50,208, 10,136,172,235,128,156,219,232, 9,138, 74,163,173,177,251,151,170,182, 76,128,170,208,194,153, 74,237,
+ 88,216,182, 38,168,186,175, 77,208, 57,240, 70,107,102, 54,176,250,189,112, 74,144,234, 57,124,119,226,129,222,140,243,206, 66,
+125,178,179,107,254,187,190, 91,255,213,219,119, 3, 52,170, 54,160, 70,101,161,143,226,136, 83, 73,165,223, 67,192,182,111,248,
+252,203,175,240,246,237, 15,248,234,205, 35, 94,247, 3,199,190,147,128,163, 86,108,215, 43, 78,167, 19, 62,188,188, 98,118, 30,
+175, 31, 63,240,174,178,162,234,202,168, 80,242,166,222, 54, 74, 10,115,198, 32,230,204,182, 22, 13, 88, 52, 66,147,116, 79, 90,
+107, 56,239,241,211,159,124,141, 47, 62,255,188,209,145, 10,231,115,199,112,180,128,133, 24, 34,182,219,134,152, 19,126,250,227,
+ 47,113,185, 94,241,237,219,119, 56, 82,194, 37,100, 78, 4,226,157, 72, 41,136,145, 50,223, 43,227, 23, 35,139,149,104, 44, 40,
+171, 13, 81, 78, 43,158,136,136, 31,179,171, 33, 75, 21,111, 65,183,186,169, 22,111,152, 90, 22,120,105,248,205,222, 61,228, 54,
+254,164, 48,151,131,177,176,181, 20, 24, 77,130, 29,221, 14, 0,193,127, 26, 78,144, 11,196, 80, 70, 65,226, 81, 23, 21,103, 36,
+ 58, 74,165, 98,245, 14,206,210,193,106,173,197,151,143, 22, 11, 99,118,173,247,184,238, 1,111, 30,207,172,226, 4,188,247,120,
+ 90, 23,236,220,129,121,235,105,127,109, 72,200,118,217, 14, 60,157, 60,180, 82, 88, 28, 93,188,222, 89, 98,234,167,140, 61, 68,
+108, 33,144,210, 86,174,158, 90,201,161,192, 25,231, 0, 77,102,140,170,136, 41, 97, 93, 22, 28, 44,130, 84, 13,166,128,198,248,
+ 46,185,171,109,105, 35, 70, 7, 78,140,177,131, 59,140,161,103,166, 20,238,236,152, 44, 5,178,151, 81,250, 83,109,218, 82, 99,
+ 12, 12,239,110,115,173, 77,232, 85, 6, 37,187, 98,166, 58,161, 41,107, 43,232,229, 0,108, 59,119, 40,168, 82, 81, 84,229, 12,
+103,221,254,189,112,173, 59,219,109, 20,164,171, 1,121, 91, 7,176, 5, 90, 28,106, 45, 5, 5,133,158,157, 42,185,117,146,208,
+216,225, 53,141, 8, 57,112,228,141,210, 56, 61, 62,194, 56,127,167,116, 47,165, 52,149,182,209, 36, 78,115,134, 46, 41, 81,102,
+ 79, 19,225,130, 61,127,198,211,180, 50,139,157,248, 1, 41, 6,196,120, 32,178,107, 65,181,241,189,106,163,205, 49,143,125,204,
+141, 23, 1,155,116,240, 66,102,108,111,140,136, 97,115, 70,101, 58, 89, 87, 91,179,203,161, 84, 16,245, 55,179,246,196, 54,107,
+160, 99, 70, 70,225,239,130,140,193, 69, 27,209, 9,138, 21,161,228,246, 93, 52,170,226,186, 31,216,110, 87,154, 22, 13,137,116,
+ 24,168,121,214, 90, 32,203,121,154, 97,140,130,171,150,200,147, 41,195,185,218, 88, 4,138, 5,128, 85, 66,185,196, 98,201,103,
+ 92, 65, 97,252, 49,173, 35,173, 85,228,189, 87, 26, 19,187, 87,172,155, 90,113,152,107,133,202, 5, 85,101, 24, 9,226, 98,157,
+ 71,201,185, 61,203,165,208,153, 27, 35,197, 74,167,156,185,232, 39,188,119,142, 7,120,148, 54,192,122,106, 67,200, 74,126,253,
+ 94, 50,116,233,172,116,173,229,254,161, 41, 34, 37,216,229, 54,249,180,206,195, 53,108,118,108, 12,127,200,232,188,144,189, 20,
+114, 73, 43,197, 2,109,221,136,167, 85, 38,143,237,251,198,109,116,101,204,115,213, 80,186, 48, 78,150, 39,189, 41,195, 24, 73,
+ 68,212, 13,219,189,237,129,152, 34, 90, 67,219,138, 49, 56,101, 44,210, 43,243, 34,148, 82,125,161,143, 49,128, 73, 82,226, 10,
+ 7,223, 0,122,200,102, 17,248, 80,235, 3,121,162, 8,165, 80,184,129, 83, 74,195,118, 47, 41,122,158,113, 27, 23,208, 28,163,
+193,237,121,142, 95,107,253,247, 54,106, 66,139, 82,108, 67,249,254,221,251, 33,162,174, 98,242, 14,233, 72,173, 66, 16,152, 64,
+151,228, 3,191,248,229, 55,248,163,191,255,115,188,188,252,128,159,254,228,107,216, 41,224, 55,251, 13, 47, 47,175, 56, 77, 22,
+147,211,248,245,175,127,141,211,233,132, 56,121,192, 88,220, 46, 23, 30, 93, 22,188,251,248,202,126,245,130,121,158,184, 99, 40,
+109,167,110,184,139,157,173,131,225,177,118, 41, 21,243, 52,195,121,135,223,253,233,207,112, 58,157,185,202,162, 92,237,154,137,
+ 85,156,211, 65,127, 13, 7,194,105,197, 30, 34,246,125,195,236, 29,106,206,248,187, 95,127, 7,143, 10, 93, 2,110,177, 96, 89,
+ 79, 80,214,226,114,121,105, 35, 78,180, 61,150,190, 83, 96,182, 80,132,210, 8,179,204,119, 30,146,177,238, 81, 63, 29, 73, 42,
+176, 19,206,106,215, 76,173,171,114, 97,241, 46, 83,136,128, 68,201, 50,180,143,103, 98,157,216, 98, 70, 92, 48,197, 61, 10, 33,
+ 55,226,147, 24,132,126, 88,106, 82, 9, 47,243,132,148, 18,113,194, 25,167, 73,170, 86, 10, 80, 73,185, 32,239, 59,217,245, 56,
+ 74, 21, 41,163, 24,131,194, 7,131,181, 6, 47,175, 87,154, 28,228,132, 15,215, 91,155, 76, 4, 93,153,137, 95,176,135, 68,164,
+173, 70,106,162,103,242,121,157, 90,184, 70, 81,132, 9,222, 88,232, 20, 99, 24,226, 14,105,132,103, 21, 49, 21, 84,166, 46,167,
+136,192,180,130, 58, 11,173,241,252,230, 43,188,190,126,192,117, 15,140,223,212, 60,181,200,188,202, 32, 20,174,105,221, 54,119,
+198,232, 57, 8, 90,137, 53,180, 7,168, 80, 33,157, 91, 81,129,130, 86,140,148, 1,213, 92, 80, 90,154, 96, 5, 79,113,164, 66,
+231,195, 41,115,145, 42, 19,148, 82, 43, 9, 12, 75, 29, 22,112,156,176, 37,235, 27,158,158, 33,151, 54,110, 84,131, 26,183, 54,
+170, 91,167, 93,181,231,144, 87, 63,222,121, 76,235,153,166, 67, 60,130,148, 81,171,226, 11, 83,196, 86, 90,107, 98,254,243,152,
+119,157, 39, 42, 12, 45,101, 21,156,214, 21, 74,105,236,251, 13,199,113,176,163, 3,120,185,110, 36,234, 99, 37,127,206,165,177,
+183,197,197, 32, 10,115, 98,194, 15,179, 68,165,238,160, 53,125, 84,193,197, 73, 46,173,112, 46, 37, 33,243,174, 60,149,194, 34,
+ 56, 22,162,242,158,217, 72,209,205, 19, 74, 2, 18, 81,145, 72,107, 46,211,105,115,138,137,242,185, 19, 35,107,169, 72, 10,120,
+121,125,193,237,122, 65,201, 52, 57, 74,172,141, 81, 74,227,178,237,120, 56,159, 73, 31,131,210, 46, 51,203,194,189, 82,106, 43,
+ 46,180, 42, 80, 50,234, 85, 10,186,240,103, 37,231, 46, 11,230,192,221,252,228, 28, 66, 74,184,110,224,152, 99,131,117,242,220,
+196, 21,120,239, 88,184,215,227,185,179, 42, 45, 54,185,150,202,197,148, 8, 0, 11, 98,166, 93,125,201, 5, 25, 9, 73, 13,126,
+ 40,121,243,135, 8, 88,165, 36, 97, 12, 48, 26,240,206, 81, 22,133,209,173, 99, 45, 69, 44,110,186,113,239,181, 34, 45, 78,230,
+ 34, 57,198, 3, 33,236,180,106,108,204,133,218,150,215, 52,194, 46,189, 72,173,138, 38,107, 77,212, 41, 38,112,125,103,235, 68,
+243,209, 23,168, 34,152, 88,201, 81,207,195,180, 1, 48,149,206,141,235,126, 96,219, 3, 5, 87, 89, 98, 2,140,214,209,166,201,
+ 43, 3,220,102, 72, 82, 84,195,193, 90, 89, 22,171,197,173,165,134, 92, 6,177,208, 50, 54, 87, 15, 86, 82, 89, 67,148,146, 96,
+171,194,112, 73,247,110, 97,132,241,148,161, 67,187,227, 81,202,238, 74,228,253, 85,181, 42, 86, 65,224,254,117, 80,215,162,219,
+ 25,248,144, 18, 33, 6, 9,204, 52,190,253,238, 55,112,186, 34,164, 12, 93, 51,190,252,242, 71,248,155,191,253, 6, 63,249, 7,
+127,128, 55,159,125,134, 63,253, 87,255, 26,203,186, 34,131, 82,136,222,190,251,128,211,186,192, 57,139,151,203, 21,147,179,216,
+ 66,194,251,151, 11,231, 36, 27, 78, 43,170,200,133,108, 18,203,228, 97,156,198,195, 50,195, 77, 30,251, 30,241,229,231,159, 81,
+228, 43, 42,148, 33, 2,147, 49,142, 31, 98,139, 18, 13, 82,140, 8,168, 48, 80,176,222, 3,149, 85,185,188, 13,207, 49,181, 78,
+238,229,195,206,251,163,202, 59, 61,203,138,242, 1,229, 57,196,235, 81,178,210, 32, 64,108,227, 51,213,190, 32,114,137,107, 53,
+142,135, 84,179,188,167, 24,225,188,130, 42,166,117,126,163,250,218, 25,199,190, 88, 86, 60,151,124,231, 76,248, 36, 80, 23, 26,
+ 5, 69,235, 38,206, 1, 84,187, 40,114,225, 0, 12, 69, 40,202, 16, 34, 38, 71,239,179,229, 4, 45,165, 21,246, 24,240, 52,121,
+124,254,249,103,120,185,220, 80,106,193,219,119, 31,240,163, 55, 15,216, 67, 64, 10, 1,207,167,103,188,253, 72,214, 53,227,200,
+210,162,141,133,225, 93,219,245, 8,152, 11,217,161,212,176,226,105, 33, 65, 44, 32,155, 39, 71,112,143,162, 97,144,232,176, 80,
+160, 48,152,148, 80, 83,230,253,181, 99,120,143,106, 59, 81, 25, 21, 43,214, 60,136,175, 25,149, 92, 3,138, 95,187,102,219, 8,
+ 44,117,184,198, 57, 56,235,233, 89,102, 81,206,164, 20, 66, 10,208,160, 72,219,156,106,235, 34, 4, 27,217,237, 49,181,137,130,
+232,224,207, 84,141,151,130, 52,160, 87, 85, 11,114, 40,220,241,208,123,159,154, 63,183, 54, 17,164,136,197,208, 44, 60, 84, 28,
+228,210,247,232, 90,128, 50, 3, 67,190, 42,213, 38, 15,141,171, 46,133,190,234,217, 16,214,104,248,121,129,243,115, 83, 29,107,
+238,158,141,166, 78, 82,170, 84, 93, 1,163, 12,172, 38, 11, 84,138, 9, 38,165, 46,244,179,142, 17,200, 7,127,159,142,150,210,
+ 23, 66,106, 34, 68,205,193, 65, 70, 49, 54,179, 10,212,139,196,130,164, 68,150,177,124,189, 19, 2, 10, 84, 37,164,220, 18,238,
+100, 77, 65, 56,220,136, 88, 42, 21,102,220,141,122,239,112,219, 14, 56,107, 17, 83,129,213, 64,136, 10, 33, 23, 76,214, 32, 23,
+133,253, 8, 88,151,153,186,225,146, 97,103,143, 16, 2, 9, 48,141,102, 56,150, 2,106, 70,136, 68,138,219, 98, 70, 56, 40,110,
+213, 90,139,135,211, 9,239, 95, 95, 25, 94,100,240,225,122,224,241,225, 1,198, 88, 20, 36,148, 42, 25,244, 12,218,209,160,115,
+ 76, 89, 32,101,122,246,121, 20,111,140,230, 66, 69,183, 73,129, 20,121,212, 32,104,212,148,113,196,140, 61, 36, 56,155, 91,226,
+ 96, 1,224,141, 25,236,181,250, 46, 75, 64,180, 17,133,207,237,130,202, 62,120,234,208,201,250,168,144, 65,162, 98,195, 29, 37,
+198,203,150, 47,117,173, 85,203,192,112, 66,187,171,154, 3, 89,185,243, 44, 64, 77,145,237,119,134,138,156, 92, 17,143,131,149,
+241,190, 61,227, 34,244, 83,236,167, 31,215, 14,131, 46,123,176,103,143,161, 70,212, 73,169, 65,165, 86,229,247,106,147, 45,197,
+220,143,218,128, 67, 77,129, 94, 53,246, 16,113,221, 14,242,216, 91, 15, 56,203,172,151,193,174,220, 26,238,122, 31, 19,123,175,
+ 51, 29, 69,242, 20, 69, 91,129,162, 58,224, 73, 51, 29, 73, 13,186, 55, 93, 53,170, 66,119,120,169,150, 91,219, 93,240,125,220,
+223,187,242, 50,208,148,234, 93, 80,131, 36,208,244,177, 91,142,113,176,112,177, 93, 65, 15,106, 66,185, 52,184, 74,146,145, 13,
+ 0,124,255,238, 3,230,245, 12,109, 12,166,211, 3, 62,126,248,128, 63,250,195,127,128,199,199, 71,252,249,159,255, 57,158,159,
+ 31, 17,182, 43,188,179,120,251,238, 29,148,162,140,237,183,239, 63,160, 2, 56, 98,230,135,140, 42,206,152, 74, 87,229, 26,131,
+211, 60, 13,251, 73,250, 48,231,217,225,203, 47,127,132,227,216,177, 31, 52,238,203,137, 46,104,233,152,180,236, 5,161,200, 66,
+ 86,104, 12,154, 83,194,113, 28,108,145, 1, 85,173,210,101,213,218, 66, 4,140,238,153,202, 93,121, 10, 22, 88, 25, 64, 27,178,
+ 71,213,126,105,139, 24, 66,176,189, 98, 47, 86, 90,181,224,151,230,246,101, 65, 79,145, 64, 10,222,195,202, 1,102,140, 37, 94,
+190,177, 44,170, 82,109, 34, 64, 64, 13, 58, 20, 69,188, 37,148,180,194, 94,127, 97, 94, 75, 49, 33,175,175, 14,236,113,205, 29,
+153,128, 25,196, 54,243,122,189,226, 87,191,249, 30, 0,240,254,229,138, 55,143,103,196,152,154, 21,232,253,199, 23,204,204,153,
+174, 85,225,195,229,138,143,151, 43,142, 20,113, 57, 2,230,121,106, 94,124, 84,178, 11,201,207,152, 10,117,200, 70,107,204,222,
+227,182,237,136,199,141,188,177,133, 4, 80,185,144, 7, 89, 0, 18, 84, 28, 8,227,156, 44,109, 50, 86, 78,114, 24, 73,103,170,
+ 13, 66, 12,112,150, 66, 46,192,207,130, 4,224, 56,235, 80, 75,130, 18, 92, 46,175,124, 38, 86,241, 58,195,130, 76, 33, 52,142,
+174, 16, 37,133, 9,125,111, 34,167, 14, 54, 97,236,224, 35,150,128, 19, 17, 18, 85,174,234,107,201,236, 39,207, 77,213, 12,142,
+188, 53,252,220,228, 82, 59, 17, 82,119, 5,122, 17,226,149,170, 40,255, 63,192, 13,122,140, 88,108, 36, 43, 3,163,177,156, 30,
+225,253,220,242,182,107, 91,217, 81,225,101, 53,101,121,123, 75, 1, 39, 98, 89,204,185,176,155,192, 1,218, 34,131,118,210,168,
+ 9,181, 36,130, 3,233,158, 82, 23, 75, 97,142,119, 38, 78,248,208,241,129,253,193, 21,170, 9, 96, 19, 79, 11, 68, 96, 42,246,
+ 59, 25,157, 82, 56, 10, 61,231, 33, 80,250,223,109,219,144, 74,134,202, 36, 88,139,199, 1,239, 12,110, 71,196,100,105, 69, 21,
+195,142,146, 51,110,251,129,146, 2, 82,140,248,120,185,193, 25,131,112, 4,188, 92,174, 48,156, 75,241,241,245,130, 90, 43,142,
+ 16,177, 31, 7,142,112,144,245,150, 83, 29,183,237, 74, 25, 11, 21,248,234,139, 47,176, 78, 19,145, 34,173,131,245, 19, 66,213,
+168,156,176, 86, 75,225,179, 64,181, 66,142, 80,173,174,209,227,104, 18, 98, 88, 87, 96,216,210,103,154, 67, 70,137,125, 13,132,
+ 96,246,142, 10,160,192, 72,215,170,168, 65,145, 44, 3,111, 45, 44,251,208, 59, 61,178, 83, 23,199, 24,237,204, 23,186,196,236,
+130, 63, 11,161,221,149,114, 63,117,170, 67,113, 10,225,216,131, 58, 91,163, 53,172,163,168,236,156,107,223,147, 11, 4, 45, 39,
+212, 18, 25,229, 91,218, 5, 40, 52,188,145,112,170, 10, 59, 30, 10,218, 93,165, 70, 64, 82, 11,219,234,107,229, 70, 98, 20, 28,
+156,252, 17, 77,140, 9,158, 94,150, 54,177,144, 53, 78, 76, 25,151,125,199,182, 29, 56,142, 3,114, 90,151, 81, 72,174,250,208,
+236,158, 82, 55,200,211,196, 6, 55,174,201,228, 71,226, 9,157,208,249,104,226,168,219,142, 31,114,134, 3,176,181, 73, 97, 74,
+251,225,239,243,227,250,159, 38, 21,189,106, 60,226,254, 11, 75, 79,132,199,175,126,120,215, 70,112,210,255,125,254,252,136,203,
+183,111,161,172, 65,225,177, 6, 1,249, 21, 18,192, 59, 97, 34, 47,253,205,175,190,197,207, 80,177,204, 11,172,159,240,171,111,
+254, 14,223, 64,225,195,203, 11,190,158,103,220,182, 13,219,245,130,175,191,250, 49,158,255,254, 51,254,230,175,254, 18,219,182,
+ 35,230,136,203,117,135, 51, 10,181,234, 86, 13,210,131, 6, 68, 22,231,144, 56,142, 34, 84, 95,174, 55,172,203,130,201, 26,188,
+124,252,128,201,123, 76,243, 2,239, 44,188,139,237, 50, 47, 41, 33,199,192, 99, 75, 18,245,164, 82,177,241,135, 41, 98, 45, 53,
+208,146,180,116,192,170, 7, 72,168, 97,119, 78,211, 80, 9,182,200, 29,236, 49,148,110,210,209,169, 97, 50, 34,140, 0,107, 45,
+119, 41, 25, 19,239, 77, 67, 46,208,186,246,189,186, 82,109, 63,111,180,109,213,251, 8, 47, 24,147,185,164,211,211,138, 68,116,
+ 34,148, 73,220,133, 9,227,188,109,161, 4,197,168,168,160,209, 90, 35, 38,226,101,103, 30, 13,159,215, 5,147,247,248,225,195,
+ 11, 82, 41,120,247,114,161, 74,182, 84, 28, 71, 36, 71,129,181,205, 25, 80,132,101, 80,129,217, 90,196,152,112,154, 28, 98,202,
+ 44, 66,161, 55, 35, 55, 15,114,133, 53,116, 89, 79,222, 67,105,141,237,118, 35,193, 17, 72, 52,150, 88,137,174, 77,199,153,210,
+232,154,133, 81,232, 7, 79, 44,153,105, 97, 6,235,249, 9,111,127,248,182,249,148, 81, 42, 66, 45,152, 45, 21, 94, 33, 28,176,
+126,110,187, 45,111, 13, 98, 74, 48,214, 66,167,132,204,187,126, 26,145,131,225, 32,108, 75, 42, 93, 8,153,219, 23,141,198,124,
+168,104, 96,160,177,211, 25,230, 51,180,207, 76,137,127, 63, 61, 76,188, 4, 92, 84,219,174,182,125, 23, 43,165,138,117, 63,110,
+143, 43,109,176, 47, 53, 68,185,242,159,105,140,193,178, 44,128,182,221,226, 83,105,114,162, 5, 85,170,137,255,175, 80, 27, 12,
+232,225,241,220, 70,163,198, 26, 56,231,113,185,110, 72,145,227,147,181,134,213, 84,180,169, 22, 55,201, 98,202, 84, 48, 57, 71,
+ 96, 26,177,101,138,202,152,211,201,210,113,112,129,101, 73, 36,201, 98,201, 24,201,105,145,249,121,206, 85, 70,198, 9,123, 72,
+ 88,188,197,118, 36,156,103,139,215, 91,192,227,105,198,245, 72, 88,103, 79,188,138,201, 33,196,128,253,136, 56,207, 30, 33, 87,
+226, 49, 88,131, 61, 38, 56, 69, 89, 16, 71,169, 88, 44,137,244, 46,151, 27,188,161,207,229,122, 4, 10,199,169,192, 37, 68,120,
+163,240,114,219,120, 23, 77, 52, 71,103, 12, 38,111, 97,140,133,159,102, 56, 71, 58,148, 61, 74,248,140,186, 67,148,106,254,238,
+217, 22,136, 66,235, 45, 69,227, 11, 24, 13,100, 46, 2,154, 18,190,246, 96,242,156, 51,252, 50, 33, 36,254,142,105, 3,205,127,
+182, 1,211,235, 88,231,129, 70,255,148,243, 93, 67,229,220,110,164,194, 23,106,230,248,227,202,130,194,102,227,226,253,119,225,
+221,187,106,162,179, 46, 30, 43,181,112,192,140,130,174,108,127,227, 8,214,194,218,162,152, 34,117,242,138,238,136, 59, 20,113,
+115, 0,220,143,247,235, 48,106, 86,227,115, 62, 56,188,106,233,209,169,252, 70,210,141, 89, 6,222,122, 37, 96, 16,117,241,165,
+ 53, 79,133,113,123,149, 57, 31,185, 84,220,246, 8,111, 15, 88,231, 48,159,106, 79, 82,227,203, 88, 86,133,247, 98,243, 33,177,
+176, 18,184, 13,172,218, 87,162,232,107,197, 89,109,217,220, 85,201, 12,142,213,210,195,152, 95, 85, 5,171, 84, 33,127,106,187,
+ 4, 10,127,225, 63, 77,141,169,189,122,151,176,146,134,216,171,119, 93,196,235,229,134, 33,191, 30,181, 86,204, 12,140, 40, 60,
+ 90,195,200,174,101,197,119,209,252, 1,161,226,155, 95,127,143,217, 19, 69,108,158, 60, 74, 78,164,142, 55, 22,179, 51,176,206,
+226, 79,255,245,191,194,215, 95,253, 24, 63,249,250,107,252,221, 47,255,154,236, 71, 57, 35, 6,234,204,102, 71,249,198, 25,180,
+ 19,115,154,118, 74,226, 27, 14, 41,227,171,207, 30, 81,114,193, 15,223,191,197,190,109, 88,215, 21,203,178, 99,158,103,120,142,
+ 31,212,108,109, 74, 33, 0,204, 16,223,246, 29,219,190,227,195,135, 23,220,246,157,252,167,106, 56, 16, 7, 63,177,101, 79,167,
+110,151, 9,239, 43,121,196, 37,157,180,224, 35, 49,120,213,101,202,160,161, 33,171,146,204,129, 30,149,253,237, 78,107,196,156,
+250,239, 63,232, 36, 10,143,148, 51,143,234,172,238,184, 70,153, 86,210,196,132,118,171,140,142,110,233,104, 2,175, 48, 90,119,
+245,190, 33, 15,182, 36, 65, 41, 5,196,148, 49, 47, 14, 49, 38, 44,203, 4,203,145,181, 91,136, 52, 61, 41, 7,142, 24,241,163,
+231, 39,236, 97,199, 22, 34,140,211,220,225, 68, 74,126, 74,192, 30, 35,150,201, 99,114, 6,219, 78,233, 80,214,104,220,142, 64,
+106,219,148, 91,199, 64, 9, 84,156, 65,175, 20,121,238,133, 15, 94, 42,140,120,129,121, 28,172, 26, 85,138,222,203,204, 93,174,
+224, 91,101, 47,173, 53, 97, 68,231,121,197,135,119,223,113, 72,132,236,180, 20, 78,203, 76,151,136,210, 28,205,203,169,106,149,
+ 58, 81,239, 44, 82, 56, 48,123,139, 92, 40, 86,179, 42,133, 34, 62,117, 14,180, 49,176, 45,156, 36,151,218,255,140,218, 71,119,
+ 85,152,227,165, 48, 38, 82, 49,141, 75,241, 10, 97,132,172,160, 77, 79,138, 56, 86,134,110,191,160,231, 59,116, 27,208, 56,251,
+171,172,102,239,133,168,209, 26,147,159,136,143,103, 29, 19, 19, 89,108, 84, 50, 52,104,175, 56,115,150,116, 46,153,186, 61,231,
+176,178,184, 48,165,130,231,211, 3,142, 72,218,137,112, 92,169,243, 82, 10, 78, 43,236,219,214, 20,207, 90, 91,164,170,160,236,
+ 4, 93, 35,128,138,144, 43, 20, 10,182,148,219,229,150,148,134,202, 1,161,144,154,254, 8, 1,149,225, 75, 65, 91,120,171, 16,
+ 34, 61, 59,175,219,129,217, 25,220,246,131,146, 25, 61, 61,215,139, 5,182, 88,241,124,154,177,199,136, 89,211, 81,169, 75,134,
+170,116,129, 60,159, 39, 98, 58,196,136,211,228, 1,165, 16,142, 13,126, 93,145, 75,129, 43, 17,214, 44, 56, 66,130,169, 25,235,
+180,226,229,118,224,121,241,120,185,109,136,176,200,199, 14,227, 44,139,186, 72,202,246,229,231,111, 48, 79, 14,206, 26,172,211,
+ 4, 59,209, 58, 67, 27,141,203,145,240,188,122,154, 32, 40, 78,154, 43,125, 82,103,172,129,149,142,185,212, 33,214,185, 54,101,
+184,240,233,179,234,240, 52,210, 90, 84, 56,246,235, 67,105, 76,156, 72,105,137,125,203,142,132,122,215,215,213, 82,161, 12, 11,
+165, 83,109, 54,204,194, 13,109, 46, 5,208,166,165,112, 86, 94, 67, 81, 39, 95, 26,211, 66, 13,164, 70,113,157, 0,164,205,200,
+ 42, 53, 5,127,206,149, 62,207, 22, 84, 67,147, 7,173,249,210, 86, 68,199, 44,220,141,183,100, 93,213,253, 26,205,108, 60,104,
+ 74,100, 63,174, 26, 66,121,104, 59, 11,229, 29,140,247, 59, 64,147, 26, 90, 23,243,157,167, 10,235,237,244,128, 89, 38, 49,238,
+117, 15,176,238,192, 57, 4,152,101,161,247,130,243, 8,218,189,171, 56,140,101,128,216,180,197,119, 81,253,226, 87,146,209,221,
+140,229, 45,159, 69, 53, 29, 86,189,183,158,202, 4, 75, 46,240, 90, 49, 92,210,140, 29, 28, 47,118,137,107,172,221, 8, 79, 23,
+119,225, 15, 25,205,250, 48,207, 83, 19,101,137,159,215,123,199,221, 12,141, 60,107,227, 33,211,135,158,249, 3,148, 57, 97,173,
+ 25, 71, 82,152,188,103, 62,188,131,137, 17, 87,142,108,253,171,191,250,127,145, 82,193, 47,191,249, 6,127,251,205,175,218,184,
+247,113,246,120,158,167,230,103, 6,123,248, 68, 1,110,161,145, 77,133, 50, 6, 70, 43,252,223,191,248, 59,252,211, 63,249,167,
+248,239,254,155,255, 26,167,243, 9,231,135, 7, 78,105, 59, 99,158, 23,204,147,231,221,106, 65, 14, 17,202,104,236,183, 13,215,
+109,195,251,247, 31,240,238,195, 7,236, 49,183, 7, 93,250, 72, 34,209, 17, 3,185, 12, 84, 47, 73,231,209, 74,118,180,106,232,
+124,234,176,111,186, 79, 9,234,251,150,145, 37,204,239, 47, 91,170,246, 16,238, 46,242, 42, 33, 23,124,249, 23,142,203, 76,146,
+254, 54, 40, 41, 32,251,255,198,254, 23, 49, 16, 93,156,198,232,118, 32,149, 82, 16, 7,155,199,236, 72,236,243,122,221,240,197,
+211, 3, 85,222,138, 58,147,199,117,225,232, 76,138, 90, 13, 41, 98, 63, 34, 78,203,132, 82, 50,231, 46,159,145, 82, 66, 58, 2,
+188, 49, 56, 34,229,197, 75,183,153, 21, 29, 14,130,221,140,108, 21,234,143, 60,112, 90,166,246,207, 66,140,176, 28, 71, 91,107,
+197, 17,201, 42,132,193,129,173, 21,241,175,139,132,109, 72,241,165, 74,227, 69,111,251,141, 25,240, 29, 59,170, 0,130,166, 56,
+ 11,173,137, 96, 87,106,133,117, 11, 97, 56,115,228,192, 6,133, 24, 73, 76, 69,192,156, 8, 47,116, 45,222, 3, 75, 64,135, 28,
+112,226,139,111,105,137,106,180,153,245, 73,141,102,231,130,192,132,170,136,222, 24,140, 34,227, 69,201,209,238, 25,206,232, 69,
+139, 22,102,127, 39,147,169, 65, 36,167,248, 51, 83,154, 44, 72,206,186,102,123,166,181, 69,110,207,168,211,180,139,181,236,157,
+ 50, 90,147, 69,204,121,104,237,224,108,193,135,143, 31,225,173,193,117,219, 88, 64,167,224, 29,217, 80,193,171, 49,173, 12, 66,
+ 34,161, 80, 42,133, 70,242, 85,195,148,128, 35,102, 82,201,103,114, 30,164,180,147,127,149, 31,210, 10, 0, 0, 32, 0, 73, 68,
+ 65, 84,187,100,236, 0, 38,107,176,237, 59, 38,103,145, 34,225,140,105,215,236,224, 84, 65, 74,192,121,246,136, 49,194,121,143,
+151,235, 13,211,121,197,137,191, 47,179,115,152, 39,135,215,203, 13,167,117, 70,229, 80, 33,109, 44, 82,140,120, 62, 45, 36,228,
+188,238,120, 58,175,136,185, 32,196,136,167,211,140, 92,129, 20, 54, 60, 63,156, 41,181, 16, 25, 86, 89,156,188,195, 15,175, 55,
+172,206,226,221,245,218,198,209,206, 90,204,206, 81,102,185, 49,248,241,103, 79,120, 23, 0,235, 92,155, 42,228, 10,122,125,181,
+ 12,163, 89, 22,186,114, 90,163, 76,147,169, 24, 76,173, 8,211, 28, 24, 69,186,139, 2,209,207, 17, 15, 32,224,180,204,208,198,
+146,248,204,123,248,105,130, 99, 40, 76, 23,218,149,230,130,170,181,182, 73, 98,169, 29,230, 83,185,137, 17,207,128, 54,150, 41,
+154,188,167, 79,137,214,119, 74,144,221,170, 65,125,122, 8, 17,159, 77, 60,254, 79, 49, 96, 59, 54,134,242,128, 38,126,165,175,
+ 23,219,137,197, 52,183, 34,221,184,174, 32,193,123, 97,109, 87,103,118, 87, 62, 51, 85,237,214,205,182, 82, 82, 60, 77,173,162,
+116,231, 98,160,244,219,189,138,130,121, 92,135, 53,138, 93,109, 13,198, 30, 19,220, 30,112,221,118, 60,174, 75, 71, 4, 15,235,
+ 2, 85, 63, 69,173,247,243, 94, 98,185,101,253, 47, 1, 75,212, 8, 83, 3,172,180,106, 97, 49,237,252,191,211, 69, 1,150, 82,
+194, 36,244, 93,212,196,138,163, 6,201, 10,160,238,193, 86,141,123,219,246,238,124, 8, 20, 30,245,124,254,217, 19,229,107,139,
+161,159,127,216,117,242,184,134, 76, 63, 28,143,131,132, 3, 45,121,227, 26, 68,229,209,138, 30,204, 35,105, 28, 49, 32,199, 13,
+251,113, 96,223,247,187,188,102,137,172,252,217,211,153, 15,137, 60,228,241,178, 56, 68, 84,178,170,194,104,234, 34,254,179,255,
+252,191,194,229,242,138,255,231, 47,254, 28,255,236,127,252,103,120,123,221,241,254,182,227,252,254, 3,150,121,194,249,241, 17,
+ 15,143, 79, 56,157, 78,112,222,209,232,137, 69, 82,151,235, 5, 47, 47, 87,188,253,225, 29,174, 91,160, 46, 75,198,230, 21, 61,
+120, 65,117, 50, 87, 29,246,169, 35, 77, 78, 84,188,134, 49,127,119, 27, 15, 40,124, 26,124,213,212,201, 2,243,104, 35,227,114,
+167, 4,110,252,128,150, 5, 79, 69, 78,228,206,116, 92, 21, 64, 49, 16, 72, 41,164, 34,182, 20,122,152,168, 75,160, 75,214, 26,
+141, 90,128,204,236, 98,241,221, 30, 49,193, 57,131,213,211, 36, 68, 70,175,235, 50,225,118, 28,152,189, 71,204,137,189,176, 21,
+231,117,193,182,111,152,167, 9,251, 65, 35, 78,137, 19, 77, 92,228, 29,252,165,158,188,197, 30, 83, 91, 13, 88,125, 31, 93, 43,
+187,245,135,117,198,118, 4,196, 16, 73, 24, 23,248,231, 8, 17,147, 51, 60,210, 67, 27, 83, 11,112,195, 90, 10,243,209,140,127,
+117,206,145, 23, 55, 23,196, 18,176,174, 79,216,143, 31,136,106,199,187,218, 82, 51,226,177,195,157,206,188, 99,231, 80,143, 68,
+ 23, 78,137, 17, 90, 89, 88, 21, 49, 79, 14,241, 40, 48,172, 44, 78,137, 50,234, 69, 61, 76,252,125,141,217,211,184,183, 98, 24,
+131,183,103,160,119,213, 77,179,144, 41,228, 36,151, 65,140,202,107, 3,136,141, 81,201, 78, 82,194, 74,200,173, 32,250, 23,169,
+241, 75,243,241,150,102,169, 90,150,149, 14,114, 77,177,150,149, 71,142,214, 57,134,160,144,112,212, 59,178, 33, 82, 32, 11,189,
+135,211,188,208,158,151,131,146,114,205,152,189, 7,180,198,156, 61,106,205, 28, 79,155, 57,222, 23, 40,138,118,239,215, 35, 81,
+151,150,104,213,229, 13,133,215,156,103,143, 84, 56,201,139,215, 44, 71, 56,160,181,197,108,136,176,118,158, 39, 92,247, 3,167,
+153,158,171,105,158,112,132,128,101,242, 72, 41, 34,102,131,211, 66, 59,236, 55,231, 21,218,104, 88,109, 48, 77, 52,129,216, 67,
+196, 52, 81,103,174,141,129, 6, 17, 40,189, 51,109,173,116,158, 61, 82, 78,212, 61, 42, 74, 9, 67,206,120, 88,102,172,243,132,
+247,215, 29, 95, 60, 63, 34,166,136,237,168,248,226,188,210,148,230,122,107,252,239,175, 62,251, 12,147, 39,210,226, 50,123, 40,
+173,240,195,118, 33,221, 13, 79,209, 46, 91,192,105,246,200, 37, 33,243,101,147,217, 62, 44,246,202,146, 51, 52, 79, 39, 50,147,
+ 46,149, 50,100,173, 42, 26, 58, 43, 82, 92,215,222, 83,118,165,189,106, 5,128,117,174, 89, 70, 43,135, 61,213, 90,128, 82,155,
+102,170,100, 98,181, 23, 89,123,105,158, 62, 85, 64, 25,139,196, 43,192,194, 57, 26,134,159, 15, 81,179,151,220, 5,152, 45,131,
+189,170, 6,220, 34,189, 67, 66, 56, 2, 82,228,149,210,224,238,168, 82,176, 14,187,239, 34, 29, 48,120,218,172,121, 47, 32,150,
+ 25,213, 5,121, 21,133, 70,218,172,128,215, 85, 13,212, 84,137, 9,238,246, 49,136, 95,157,125,234, 90, 20,245,247,169,230,141,
+168, 42,216,216, 35, 38, 92,182, 13, 15,249,113,252, 6,247, 96,211, 58,240, 95,152,224, 40, 64, 25, 45,150,201, 86,188,117, 38,
+ 4, 77, 42,116, 43,224,169, 63, 54,205,165,161,153,222,167,181,129, 21,164,162,236,253, 1,121, 8,208,240, 55, 69, 13,162,129,
+118, 64,244,101,126,109, 93,124,109,187, 20,109, 44, 83,213,232,141,248,246,251,183,248,234,203, 47,240,139,111,126,211, 42, 12,
+249,144, 69,224, 81, 89, 80, 86,147,228,236, 82,117,104,172,163, 23,236, 22,248,133, 70, 88,198, 90,250,231, 74,195,234,130, 21,
+ 7, 42, 20,156,169,109, 7, 44, 2,183,204,187, 45,217, 42,124,246,197,151,248,135,127,252,143, 81, 43,240,217,163,199,255,240,
+ 39,127, 66, 44,112, 5,132, 82,177, 95, 54,124,255,122,195,242,221,247,120, 60,173, 88, 78,167,246,166, 42,165,176,237, 59, 94,
+ 95,175,184,222, 54,196, 74,157, 69, 22, 85,130,238,156, 99,213,231, 66,173,115,175,181,171, 65, 85,237,226, 57, 25, 83,141,204,
+ 2,121,111, 69, 41,143, 90,239, 30, 42,241, 45,210, 1,164,137,221, 95,251, 94,214,114,113,145, 89,180, 24,115,102,241,148,226,
+ 72,214,220, 5,111, 32,113, 85,206, 93, 43, 81,106,133, 98, 33,140,145,128, 12,213, 69,114,154, 5,142, 34, 56,148,241,102,169,
+ 6, 33, 18,237,205, 26,162,218, 57,107,240,186,109,208,218,224,181,100,172,222,226,114,219,105,199,204,127,214, 17, 35, 61, 59,
+ 74,225, 26, 19,172,162, 17, 42,106,223,233, 11,226, 22,237,231, 6,243,169,121, 50,227,232,153, 48, 77, 1, 12,114, 21, 12,220,
+110,180, 52,188,138, 16, 99, 3, 61, 80,130, 27,216,207, 76, 7, 95, 8,148, 45, 63,207, 19, 65,141,166,137,136, 95,154,172,126,
+214,204, 80,218,162, 64, 83,247,174, 42, 98, 41,112,222,195,164, 0, 99,200,218, 69,147, 7,250,112, 73,123, 64,135,136, 4,211,
+212, 65,116,104, 56, 86, 85,190,176, 49,215, 65,143, 97, 90,250, 87, 25,220, 37,130, 99, 46, 50,238, 99,213,174, 80,178,212, 39,
+216,231, 58, 64,109,154,128,135,191, 47,218, 24,130,165, 24, 75, 59, 79, 69,226, 63,165,250, 68, 45,197, 64,240, 16, 99, 9, 39,
+106, 12,139, 48, 53,180, 50, 56,157, 86, 28,251,134,219,245, 21,235,186, 96,158, 61, 94,175, 27, 61, 19,202,114, 58, 32, 77, 99,
+156,181,152,252, 68, 43,168, 18, 96,107, 66, 42, 25,159,159, 23, 92,182, 3,231,217, 67,107,131, 55,143, 39,188,125,255, 1, 15,
+231, 21, 49, 70,156,150, 5, 53, 39, 34,153,105,141, 35, 85,124,241,120,194,245,136,248,252,249, 1, 31, 94,111, 56, 77, 30,123,
+ 8,248,236,249,169,225,160, 83,164,255,102,154,124,227,188, 91, 80,164,242,228,108, 91,179, 36,134,161, 56,107,113,196,222, 9,
+ 63,156, 86,132,148,225, 45,189,247,126,158,144,115,193, 30, 19,158, 79, 51,165,251, 57, 15,173,118, 84, 20,188,125,221, 26,207,
+ 67,105, 42,128, 28, 63, 67,214,104,156,102,143, 55,179,193, 1,210,167, 40,208, 57,116, 82, 26, 25, 6, 25, 25,170, 20,164, 66,
+151,139,124, 70,198,218, 86,239,147, 71,220, 52,168,137,102,237, 14,165,187, 73,206,108,109, 43,172,197,235, 54,189,212,138,196,
+191, 90,162,217,134, 14, 83, 46,245,156, 50,160, 57,102,186, 84,168,196, 72, 89,110, 28, 98,224,194,220, 80, 16, 76, 75,249, 51,
+150, 71,229, 12,134,105,142, 21,141, 10,141,156,169,136, 67,230,213,132,136,216,208,155, 71,250,145, 74,115,121,168, 97, 85, 38,
+ 23,164,110,145,162,159,108,171,185,241, 84,124,177,107,233,184, 71,140,106, 37,174,126,139, 21, 20,180,172, 64,154,134, 81,126,
+155,102,214,193,144, 54, 8, 69, 83, 38,142, 70,179,159,181,177,191,106,171,229,170, 70, 42, 28,189, 23,154, 53, 34, 18, 64,166,
+ 4, 83,141,123, 13, 80, 5, 37,141, 26, 94,113,105, 99,155,187,131,238, 92,206, 83,239,106,103, 81, 75,143,249,178, 67,165,223,
+ 8,115,244, 34,202,157,136,142,127, 77, 1,148,202,248,195,159,255, 61,252,233,159,253, 27,196, 72,148,161,183, 31, 62,226,241,
+241,177,139,193, 84,109,170,206, 82, 50,140,241,124,152,101, 82,113,231, 2,104,139, 90, 18,127, 86,180, 75, 51,206,163,216,218,
+222, 20,234,242,193,193, 23, 26,206,160,161, 50, 45, 23, 10, 95,124,253,219,248,240,155, 95, 35,101, 42, 88,190,250,241, 79,240,
+211,159,253, 46,126,253,171,191,195, 63,252, 71,127,140,117,158,144,114,129,211, 10, 86, 1,123, 37,161,198,199,152,241,238,221,
+ 11,212,187, 23,156,140,134,103, 11, 87,226,120,211, 80,137, 30, 84, 0,234,212, 89,165,216,212,254,181,131, 81,148,238,149,225,
+ 56,250, 38,232, 75, 31,207, 75,113,166, 6,240,140,102, 26,156, 30,186, 83, 35,122, 4,213,133, 84,210,165, 41,190, 32,146, 6,
+ 20,179,238, 69, 88, 83, 25,172,211,252,147, 3, 81, 48,243,133, 89,134, 47,134,120,173,115, 45,132, 33, 29, 28, 18, 50,250, 19,
+232,132,140,227,143,152, 48, 59,139,143,151, 27,188, 53,152,188,195, 17, 2,188,115,168, 74,195, 26,133,237,160,172,114, 36,234,
+ 12, 73, 81, 90,145, 10, 37,117, 25, 5,132,148,219,207,104,141,198, 30,115, 75, 24,202,181, 14,244, 46,219,160, 50,214,106,132,
+144, 88, 11, 64, 7,114,229,157,191,200, 75,156,181,208, 70, 97,191,221, 26,157, 79, 10, 46, 45,130, 31, 30, 57, 78,126, 65, 41,
+ 87,118, 1,208,151, 48,134, 29,126, 93,144, 99,198,142,128,101,177, 4,231,137, 9,211,178, 16, 23, 59, 70,102,131, 43, 44,147,
+167,209,227,141,216,223,109, 21,100, 8, 40, 67,193, 20,181,143, 82,209,179,205, 1,153, 94,141,249,232,156, 65, 62, 36,138,145,
+ 40, 72, 48,186,242,175, 74, 19, 76, 10,252, 73,252,210,141,237,206,234,104,153, 90, 76,158,186, 91, 41, 98, 41,225,203, 64, 91,
+234,228,228,125,151,168, 84,241,171, 91,231,145, 18,197,228,150,156, 8, 26, 19, 3, 78,235,130,243,105,109,216,227,219, 22, 97,
+103,135, 20, 50, 98,136, 80, 74, 97,101,173,204,118, 4, 76,134,132, 29, 79,235, 12, 40,133,199,211, 2,231, 39,242,184, 3,120,
+ 56,145,136,117,153,102,236,251, 6, 24, 15,203,235, 1, 99, 2,166,105,166, 49,173, 50,120, 88, 39,148, 82,241,252,248,128,201,
+123,196, 68,138,119,205, 23, 15, 61,243, 20,144, 82, 75,101,159, 57,237, 60,215,101,197,245,122, 33,199, 3, 23,207,206,218,198,
+ 89, 55, 80,168,204,172,207, 57, 99, 93,102, 14, 26, 50,176, 90, 97,223,119, 60,174, 51, 50,128,191,253,225, 35, 61,223, 74,225,
+249,180,144, 45, 47, 39,160, 26,254, 43,240, 48, 83,142,193, 50,205,188, 34, 49,136, 89,224, 49, 26,145,185, 17,161, 18,156,197,
+242,231, 67,233, 94, 52, 37,169,182, 55, 2,122,252,108, 21, 69, 47, 75,243, 21, 98,196, 92, 11, 19, 38,115,187,128,181, 54, 80,
+102,128,243,176, 35,134, 8,141,212,153,155, 10,158, 90,154,214, 9,151, 90, 80, 20, 5, 99,249,229,140,196,251,112,210, 75,229,
+158,113, 78,194,150,134,137,142,113, 39, 4,112,206, 13,220, 83,219,153,216,169,105,149, 3,174,132,165, 65,113,182, 24,114,214,
+ 11,255,122,225,189, 15,235,171, 65,176, 61,102,138,246,196, 52,158,134, 22,197, 59,245,218,211,213,138,106, 4,197,170,250, 20,
+ 64, 13,171, 49, 42, 39, 74,107,106, 69,131,148,115,134,182,102, 8, 57,173,237,181, 55,212,171,104,213, 36, 20, 74, 10,149, 90,
+251,101,222,209,240,212,192, 88, 2,108, 73, 81,231,156,135,226,105,106,201, 25,185, 36,194,196,202, 40,151, 68,112,188, 83,175,
+ 84,101, 20, 54,238,183,117,124, 29, 86,243,194, 37,144,241,135,146,124, 90,224,244,248,136,117, 93,113, 28, 59, 50,119,154,223,
+124,251, 29, 71, 70,162, 69, 42,118,240, 74, 65, 98, 79,176,196,235, 37, 17,131,112,101, 45, 44,121,140,208, 9, 5, 76,134,140,
+253,164,164, 52, 45,129,138, 68,130, 26,143,235,138,221, 89, 20,147,145, 50,240,147,159,253, 46,230,105,198,223,254,205, 47,240,
+215,191,248,183,172, 38, 37,177, 30,241, 43, 10,119, 98,157,179,254, 62, 22,212,144,219, 4,252,249,249, 25,251,235, 11,229,126,
+215,218,115,209,107,101, 6,111,151, 91, 54,130,209,184, 35,191, 11,188,225,157,212, 64, 18,211, 80, 72, 53,195,192, 32,183,148,
+174,238, 89, 46,165, 80,212, 95,209, 48,134, 95,247, 56,194, 23,177,149,136, 90,184,203, 32,113, 21, 95, 21,181, 54,229,244,221,
+222, 30,184, 3, 12,169, 97, 31, 43,171,170, 81, 49,159, 11,237,173, 79,243,132, 35, 70, 24,165,240,178,237,236, 3, 46,184,110,
+ 7, 82, 46, 56,175, 10,208, 6, 70,129, 59,247, 29,150, 21,192,215,237,160, 85, 1,128,203,182,243,136, 92,181,144, 19,161,255,
+149, 49, 65,144,255, 58, 25,221,196,133,228, 74, 40, 28,118,131, 6,225,137, 53,183,231,198, 26,138,130,212, 28,114, 67, 99, 61,
+ 98, 82,151,220,125,193,214,159,176,111,215,214,185, 89,165,219,100, 34,196,132,117, 61, 33,198,140, 28,105, 47,255,252,244, 6,
+183,235, 5,161, 84, 60,174, 43,226,126, 67, 44, 26,181, 36, 24,198,241,230, 82,161,106,193,118, 36, 88,230,158, 91,205, 1, 50,
+ 60, 50,180, 28,132, 2, 6,226, 24, 30,171, 10, 19, 60,198, 30, 38,116, 39,123,225,226, 87, 86, 99,170, 3, 78, 71,237, 83,163,
+ 25,130, 59, 1,203,170,116,163, 53,182,125,231,110,139,248,230,203, 76,164,177,154, 41,117, 80, 43,133,144, 51, 60, 91,172,150,
+229,132,201, 79,120,121,253,200,124, 10, 71,202,243,201,163,150,140,201, 79,184, 92,111,188, 59, 87,152,189,109,175,115,246, 30,
+206, 19,124,134,194, 80,136,136,232, 12,117, 45, 4,103,153,225, 24,173,250,241,229, 5,206, 26, 76,211,140,152, 18,230,105,110,
+103,200, 17,104, 87,156, 11, 5, 26,197, 40,182, 69,154, 4, 30, 33,192, 89,141,253,200, 72, 57, 97,241, 19, 66, 32,182,251, 60,
+ 79,208, 86, 53,230,118, 5,112,236, 27,102, 79, 90, 17, 40, 13, 63, 77,168, 57, 99, 89, 87,164, 24, 97,157, 69,136, 36,160,164,
+105, 84,194,105, 89,136, 89, 63,123,104, 40, 92,142, 3,151,253,224,223,147, 14,236,137, 83,225,196,121,146, 82,230, 80, 27,141,
+124, 92,145, 52, 37, 8, 22,165,112, 48,135,157,138, 10,158, 8, 50, 35,221, 14, 88, 97, 99, 20,211, 1,105,124, 47,110, 31,137,
+ 44,197, 40,208,229,152,213, 35, 4,156,214, 21, 49, 6,236,251, 78,201,119,222, 55, 75,161, 42, 36,207,173,154,247,215, 80,172,
+180,231,201, 32,175, 53, 75, 37, 43,166,214,180,226,154,153, 89, 95,161, 7,125, 20,113,238,101, 79,188,239, 59,114,206,136, 28,
+155,122,196,132,117,114,173, 32,117,198,176,171,172, 23,186, 48,181, 43,104,106,109,177,212, 66,170,147, 11,189,123,135,244,253,
+206, 82,186,230,238, 23,101, 93,221, 24,193,170, 58, 26, 22,221, 42, 6,173,201, 38,167,199,220, 3,180, 38, 10, 69,245,169, 42,
+223,167, 33,101, 44,214,245,188,148,150,221, 49,240, 73,196, 17,197,127,165, 63,132, 41,144, 76,252, 19, 2,171,102, 97,116,183,
+197,113,126,122,166, 96,164, 90,114,211, 80,233,202,251,147, 50,140,220, 43, 87,252, 5, 5,170,160,253,181, 14,194,183,210, 70,
+241,165, 51,224, 57,192,163,242,190,252, 15,127,255,247, 49,207, 75, 3,205,239,199,209, 46, 57,185, 45, 36,140,163,121, 43,249,
+ 3,147,236,242, 50,112,171,197,199, 92, 7, 33,135, 82, 10,154,225, 23, 90,107,172,222,176,103,153,124,197,203,100,112,121,251,
+ 43, 44,142,144,136,222, 24,124,249,213,143,241,250,242, 17,255,229,127,241,159,226,247,126,254, 31, 96, 50, 6, 15,243,132,197,
+ 25, 14, 43, 97,203, 12, 39, 72,201, 59,169,249,242,248,131,159,255, 62,172, 49,116, 24, 13, 23,161,225,195, 71, 53,206,175, 30,
+ 20, 78,117, 72, 82,234,227, 82, 61, 80,220,104, 36,213,127,141,248,140,123,114,151,238,224, 2,238, 86,129, 30,226,208, 50, 98,
+198,117, 8, 48, 60,248, 3, 74,147, 61,166, 24,118, 56,133,237, 54, 90,245, 64, 8,163, 21, 83,177, 84, 35,207,201,175,175,165,
+103, 82,107,165,112,217,246,198,111,214, 12, 71, 1, 20,230,201,225,205,211,185,173, 1,106,173,148,196,102, 45,127,201, 15, 44,
+179,103,174, 64,102,191, 43,253, 90,201,176,142,185,116,234, 93,237,206, 89, 98,160, 83,215, 18,142, 3, 49,101,134,223,116,228,
+102,173, 21,147,103, 97,144,179, 0,143,143,115,206,156,222,212,169,134, 80,236,241,182, 6, 95,255,228,231,152,215, 7, 82,167,
+199, 64, 35,105,109,176,172, 11,172,113,109, 85,146, 51,113,243, 67, 12,168, 90,225,179,199,167,246,126,205,211,140,156, 18, 82,
+ 5, 17,216,172,109, 2, 55,203, 84,168,156, 51, 79,149,216,101,145, 18, 93,246,204,149,151, 12,113,103,109, 27, 1,214,129, 32,
+ 39, 29,181, 26, 56,223,149,159,185, 86, 36,170, 10,163,113, 31, 62,162, 20, 38,239,240,252,244,140,121,154,120,228,110,218,175,
+ 95,167,137, 94, 27, 83,205,188,179,240, 70,227,228, 61, 30,206,103,172,203, 10,141,138,151,151,119, 48, 76,141, 52, 90, 99,154,
+ 28,182,219,149,216,244,222, 54,231,135,181, 22,222,251, 70, 9,115,158,198,135,222, 57, 34,254,241,247, 90,210,189,206,231, 19,
+ 81, 10,217,146,104,180,134,247, 83,215,131,112,113,123,221,246, 54,250, 21,152, 85, 8,129, 11,187,202, 19, 5, 77, 10,117, 13,
+ 44,126,226,125,188,198,227,249,132,146, 8,139,236,157,225,132, 66,215,158,241,105,154, 91,206,129,115, 14,183,219,198, 41,126,
+ 5,243,228,185,243,210,221, 30,202,240, 29,109,168, 0,123,127,221, 91,119, 56,123, 7,103,108, 67,252,170, 62,174,131, 82, 26,
+159,175, 14,251,177,163,166, 64,118, 63,118, 55, 80,116, 42,193, 94, 66,174, 56, 82,105, 90, 10,185, 96,132, 56,103,153,143, 32,
+ 23,136,136, 86, 81,187, 82, 58,215,194, 41,147, 10,151,235, 13,251,182, 97,219,136,228, 23, 35, 57, 66,178, 0,141,198,202,158,
+ 71, 90, 5, 4,202, 18,127,186, 60,175,185, 16, 37, 17,218,180,169, 29,253,183,182, 9,116, 99, 56, 56,236,136, 92, 42, 41,103,
+142,185, 70, 15,215,226,128, 45,107,204,144, 75,192,130, 82,190,103,114, 78,125, 53, 89, 74,187,176, 85, 55,123, 53, 33,156, 22,
+228,177,234, 43, 45,225, 46,180,202,191,157, 39, 61, 81, 81,171, 78,158, 27, 93, 77,205,251,175, 59,191, 68,125,226, 18,203,156,
+235,160,181, 97, 40,141,129, 50,166,103,167,243,132, 87,241,180, 75,248, 17,178, 14, 50,140,204,150,245,181,172,218,148,210,212,
+153, 87,130,141,133, 99, 67, 60,118,196, 16, 90,198,138, 45,172,192,165,204,216,210, 3, 31,164, 83,167, 91,189, 3,103,154,226,
+110,200,131, 22, 97, 79,169,119, 49,174,110,158,240,199,255,209, 31,225,127,251, 63,254,207, 86, 16,228,184, 67, 79,107, 59, 68,
+197, 94, 85,101,156,196, 74, 88,169,194,156, 53,119, 72, 72,104,133, 82,248,162,225, 11,221,106, 82, 43, 26,163,113,242, 6, 69,
+209, 62, 89, 88,209, 78, 3,201, 88,160, 38, 36, 85, 49, 47, 39,252,249,191,249,191, 48,185,140,127,254,223,255,183, 76,107,170,
+ 48,208, 72, 85, 65,171,196,151,185,168, 32,196, 51,174,241,251,191,247,115, 92,175, 87,124,120,121,105,187, 93,217,105,180,213,
+132,236,242,115, 25,198,156,154,119,229,195, 30,154,105,124,122, 16,166, 53,200,128, 88, 25,196, 98,196,190,206,134,237,228,110,
+ 94, 72,104, 85,151, 97,172, 63, 42, 60, 7, 61,132,214,208, 92,132,201,142,186, 14, 35, 95,197, 69,202,145, 50,131, 61,128,144,
+ 82,227,216,139,114, 95,254,151,185,130,180,138,226, 82,141,210, 80, 70, 97,103,145,218,188,204,188,251, 37,170, 91, 44, 21,179,
+ 35,112,198,245,122,133, 2,237,159,107, 46, 40, 49, 49,167, 62, 99,241, 14, 71, 72, 56,228,207,230, 7, 76, 43,210, 46,140,175,
+ 11, 10, 28,236,195, 29, 58,123, 55,173,161,216, 66, 12, 25,244, 98,219,172,185,192, 26, 11,216,190,151,163, 61, 93,146, 40, 2,
+ 98, 25,248,149, 18,197,180,134,243, 19,189, 7, 74, 99,223, 54, 22,147, 49,129,144, 53, 36, 45,126, 83, 3, 85, 43, 24,235,249,
+114,155, 32,179,128, 45, 39, 24,171,177, 40,219,213,204,124,241, 90, 46, 64,246, 44,211,147,202, 93,186, 6, 20, 29,114, 33,134,
+230, 3,183, 90, 53, 45, 64, 41,133, 64,119,150,201,107,122, 24,185, 55, 70,186,226,113, 16,125,134,167,211, 9, 79, 79,207,184,
+ 94,175,184, 94,175,252, 94,138, 42,218,161, 86,214,101,176, 54,196, 89,139,196,107, 24, 85, 9, 28, 18, 67, 97,112, 16, 89,143,
+ 46,215, 11,214,117,193,195,233,132,219,182,225, 56, 2, 82, 74,176,142, 70,232,251,190,179,142,134,166, 1,196,195,143,141, 22,
+152, 83,134, 49,142,119,132,156, 39,192,169,123,206, 57,164,152, 72,223,144, 82,179, 85,174,179,135, 53, 20,254, 50, 51,199, 98,
+158, 60, 35,120,235,157,187,196, 57, 15,148,138,201,121,234,176, 67,196, 60,207,216,142, 29,128,131,214, 10,215,219, 13,147,159,
+136, 52, 23, 3, 79, 24, 60,182,237, 70,174, 0, 75,100, 70,202,126, 39, 84,176,227,253,182,117, 14,241, 56, 26, 84,168,217,183,
+ 42,240,230,124,194, 60,121, 76,222, 67,115,152, 9, 77, 20,169,131, 63,207, 14, 31,183, 3,251,158,224,166,153,221, 20,129,206,
+ 59,161,185, 49,124,201, 28, 17,179, 55,112,134,144,202,242,249,202,228,243, 62,229, 11,247, 10,122,129,239,164,136, 35, 40,188,
+190, 94, 90, 1,237,167,137,153, 17,159,242, 28,136, 30, 71, 69, 54, 3,190, 18,193,146, 34,127, 79,157,157, 73,107,225, 87, 4,
+110,248,200,174,201, 89, 27, 41,176, 16, 48, 35,115,151, 30,115,103,198, 39, 46, 72,149, 53, 45, 50,182, 21,222, 74,119,192,153,
+132,103, 85,105,150,244,253,200,106, 88,101, 10,142, 91, 11,174,118,248,251,123,126,102,103, 51,168,187, 12,133,210,157, 65, 13,
+ 6, 87, 59,250, 22, 34,100, 31,109,221, 44, 2,231, 96, 46,185,196,235,167, 26, 24, 53,100,192, 43,116, 32,218,253, 79, 37,196,
+ 18,210, 27,233,158, 72, 35, 43,157,246,121,243,198,205,142,204,247, 49,240, 65,118,114,138, 27,241,130,126,185,143, 65, 45, 93,
+ 51,215,133, 24,117, 72, 75, 58,159,206,248,131,223,253, 41,254,226, 23,255,142, 45, 52,172, 28,158, 23, 6, 38, 24,174,250, 10,
+119, 14,190, 65, 79,100,215,172,148, 68,129,146,114,182,237,160, 91,185,158, 27, 52,161, 84,138,192,180,173,211, 5, 28,143, 46,
+156,161, 44,238,227,118,197,159,253,213, 95,224,127,254, 23,255, 28, 78,170, 45, 85, 97, 81,145, 83, 79,102,210,236, 45,150,221,
+209,195,249, 1,191,121,251, 61, 94, 47,151,174, 13,224, 93,174, 98, 47,169, 16,139, 26,221, 11, 93,164, 37,227, 36, 40,117, 7,
+111, 17, 81, 22, 6,165,178, 28, 6,178,143, 23,210, 92, 95,104,215, 6,105,145, 15, 88,141,200,221,246,153, 42,190, 44, 11, 52,
+ 87,135,226, 87, 47, 35,211,155,197,102,169,244,113,176,252,143,114,130, 89,107, 81,238, 89, 14,122,208,100,200,115, 97,141, 70,
+204,153, 71,160,132,181,124,247,241,149, 20,187,182, 96,219, 35,182,152, 16, 83,196,196, 41, 99, 3, 62, 1, 47,183,131, 73,119,
+ 21, 99,244,240,167,151,185,236,200, 87,223,211,166,214,153, 58,227,194, 95,148, 61, 70,246,211,243,197, 43,116, 42, 20, 26,161,
+ 30, 20,110,163,234, 24, 95, 9,168, 82,241,139,191,252,223, 89, 37,174, 16,142, 3,243, 68,145,162,235,233, 12,176, 40,198, 58,
+ 79, 68,183, 20, 48, 79, 19,188,241,216,119,202,169,175,197, 52,203,162,213,150, 59,122,186, 28, 99, 9, 76,167,226, 12,106, 65,
+247,230, 12,203,130,159, 42,193, 49, 74, 67, 49, 56, 8,181, 79, 83,148,214,176,202,208, 5,103, 12, 28,119, 54, 2, 2, 82,138,
+224, 59, 96, 43, 80,225, 93,221, 52, 57,124,245,213,215, 8, 49, 99,187, 93,113,185,188,146,203, 65,137,112,149, 46,134,217,147,
+ 5,140,130, 72, 56,227,188, 20,164,156,112, 58,173, 80, 90, 99,114, 14, 31, 63,126, 68,201, 9,165, 56, 44,203, 66,206, 21, 78,
+225,218,143,131, 58,102, 91,176,109, 7,230,217,183, 29,107, 46,192,236, 52, 46,151,215, 94,116,240,119,193, 90,219,244, 0,225,
+ 8,124,193,101,134,237, 36,138,234,141, 17,206,106, 78, 87,203,112,252,243, 58, 78,119,203, 76,247, 35, 63, 61, 77, 26, 28, 95,
+194,228,120,240, 56,118,178, 44, 62,156, 86,188,127, 33, 92,235, 58,211,103,250,244,248,132,109,223,201,194,153,232,207, 20,117,
+186, 92,160,198,116,235,164,155, 72, 76,185,158, 86,188,123,251, 14,111, 47, 27, 79,197,152,120,232, 44,102, 79, 23,166,227,162,
+ 76, 60,212, 70, 43, 56, 99,240,197,121,198, 95,127,251, 22, 75,206,168,126, 2, 42,173, 48,174, 77,201, 92, 17, 51,173,187,140,
+ 81, 48,186,163,112,229,188,145,203, 68, 15,107,181,142,251,149,117, 86,198,118, 28,120,115,158,241,238,221, 59, 34,231,165,132,
+121, 89,224,189,231,148, 63,209,240,208, 20, 34,230, 76,113,212, 7, 69, 82, 31, 49, 34, 38,250,103,170, 84, 84, 38, 63, 26, 99,
+161,116, 70,202, 27,114, 12, 76,105,100,226,159,166, 85,103,206, 84, 32, 36, 57, 35,152,195,111,132,195,128,174,237,105, 0, 48,
+246,150,167, 68,244, 65, 17,187, 85, 93, 7,234,154,172,119,235,221, 52, 68,201,101,221,226,178,199, 11,189, 12,123,199, 30, 16,
+ 84, 27, 43, 68,148,239,141,209, 55, 48, 71,198, 51, 29, 67, 28,112,159,154, 22,137,116, 22,193,174, 86, 45,127,160,111, 7, 76,
+107,248, 42,167, 23,138,219, 76,166,103,165,228, 54,185,178,178,230, 16,123,160,104,161,148,130, 45,157,137, 57,248,155,122, 84,
+ 20,221, 51,165,119,227,162,246, 31, 85,240,204,167,237, 81,172,130,146, 85,120,185,237,248, 15,127,254,123,248,238,251,183,248,
+225, 99, 70,201,116, 8,149,148,200, 63, 46,138, 70,165,218,158,202, 48, 59,156,196,113,138, 3, 97, 60,125,185,157, 67, 57,246,
+182,219,168, 6, 77,213,172,181, 70,174,138,113,146,132, 95, 37, 53, 96,133,206,192, 97,105,212,241,246,219,111,240,203,191,252,
+ 51, 92,175, 47, 88, 38,199, 59,113,186,244, 62,230,140,217, 91,246, 66,223,143, 87,174,183,219,221, 58, 96,156,121, 75,101, 62,
+ 22,139,181, 81,188, 36,249, 73,223, 95,162, 74, 19,167,183,118,235, 91,203,234,110,112, 4,116,230,248,176,199,238,127,148,124,
+ 14, 5, 80,230,254,103, 27,195, 45,100, 36,165, 85,103,100, 11,176,130,181, 37, 57, 23,194,154, 14, 23,169, 82, 12,128,209, 61,
+248, 64,196,115,117, 8,240, 32,193, 14,133,173,136, 64,103,143,100,233, 42,165, 66,231,130, 84,129,160, 18,142,152,240,230,188,
+226,215,239, 62,192, 58,139,235, 17, 16,184,168, 75, 57, 99,114, 22,123, 32,154, 95, 30,222,211, 49, 31, 92,236,128,147, 55, 93,
+228,199, 96,160, 61, 68,156,151, 25,183,125,167, 92,121,153,162,176, 72, 80,113,222, 61, 29, 64, 14, 41, 39,164, 74,251, 98,203,
+239,179,115, 51,114,222, 17, 34,141,181, 38,127,194,105, 93,136, 50,182,111, 45, 73, 43,112,130,148, 49, 22,251,177,225, 96, 88,
+ 75,136, 1, 70, 25, 44,235, 9,251,177, 81, 20,110,162,125,110, 74, 17,129,253,188, 34,150, 36,191,184,172,183, 50, 21, 37, 60,
+210,117,206, 2,156,253,109,180,130,230,189,116,230, 80, 25, 26,121,211, 65,188,239, 59,187, 67, 12,114,166,231,204,178, 93,212,
+ 88,139,135,243, 3,214,211, 25,175,175, 23,220,182, 43, 66, 32, 21,123,169, 5, 86, 49,102, 84,129, 11, 59, 78,224,210, 10,126,
+ 89,154, 80,231,136,148,140, 53,113,138,157,117, 14,206, 45, 56,142,128,197, 57,132, 99,135,177, 22,251,113, 80, 74, 27, 19,245,
+140,181,184,222, 54, 58,144,152, 60,119, 28, 59, 63,135, 36, 4, 51,154,132,148,130, 57,165,159, 61, 17,192, 7,149,118,191,138,
+210,223, 98,162, 46, 61,132, 72,150,216,156, 96,180, 65,202,169, 93, 18,165,210, 84,207, 50, 39, 67,162,143,173, 53,212,229,175,
+ 11,187, 69, 88,225,207,197,174,177,150,246,240,206, 33,132,136, 16, 54,120,231,144, 98,196, 52,121,132,152, 48,123, 79, 59,125,
+ 67, 89, 22,165,208, 57,245,242,122, 1,180,193,198,172, 5,160,226,179,243,137, 4,147,252,185, 78,142,227,125,121,226, 85, 42,
+177, 60, 78, 0, 62, 59, 47,248,238,253, 11, 78,167, 19, 44,175, 72,156,170, 8, 50,114,175, 21,123,204, 48,134, 80,188,159, 6,
+108,137,142,132,231, 90,159, 28, 8,164,205,201, 57,227,245,114,129,250,226, 25, 47, 47,175,168, 32,224,203,194,197,171,227,137,
+154, 22,182, 2, 95,202, 33, 70,220,246,141,136,127, 71, 64, 8,129, 86, 94,218,242, 30,154,138, 47, 74,180, 12, 72, 49,240,116,
+181,182,216,214,202,248,223,200,127,111, 52,250,218,143, 67,162,106, 81,237, 98,110, 25, 22, 60,137, 43, 37, 83,122, 98, 29,213,
+ 53,154,197,113,178,233, 28, 47, 97,133, 49, 8, 79,245,251,155,118,247,159,138,116,196, 79, 94, 89,128, 39,151,189, 30, 54, 17,
+218,240, 4, 76,114, 17,106,135,142,181, 6,161,140, 35, 0,154, 16, 12,197, 86,155,188,118, 70, 43,106,166,238,219, 24,221,236,
+178, 93,180, 40, 72,246, 78,211,236, 30,120,213,244, 7, 22, 67, 58,215,248,202,104,212,200,227,129,182, 99, 71, 35,241,212, 79,
+172,109, 52, 98, 24, 99, 97,168,122, 50, 86,227,186, 5,252, 39,255,228, 31,227,127,250,151,255, 43,239, 16, 52, 82,220,225,205,
+153, 14, 27,137,145,100, 4,171,102,161,156,236,114, 41,135, 58,147, 95, 28, 10,176,142, 62,220, 20,104,207,202, 1, 14,172, 23,
+161,131, 89, 3,202, 40, 76,214, 80,124,157, 86, 56, 98,133,174, 5,151,247,111, 17,183, 11, 12,123,151,169,203,167, 75,194, 91,
+202, 86, 14, 60, 10,202,131,120, 45,167,212, 70, 49, 29,163,169,239,166, 22,119, 99,159, 54,169,233,170, 56,233, 72, 20, 20, 63,
+208,170,117,235,194,203,167,177,177, 60,133,212,227,231, 82,134,193,122,223,161, 75,192, 71,174, 5,182,109,147,208, 20,155,146,
+184, 70,156,116,234,220, 36,183,189,193, 88,248,242, 55, 26, 67, 56, 8,191,254, 92,105,111,204,209,175,141,107, 95, 42,171,242,
+123,102,114,204,157,154,151, 88, 81,123,219, 15,172,243,132,237,136,152,188, 39,187,135, 82,248,254,133, 24,217, 37, 49,183,160,
+ 20,178,193,113, 70, 49,170, 28,118, 61, 62,118, 36,161, 9,114,205, 27, 74,200, 18,216,134,115,100, 25, 2, 43,119,181,209, 20,
+139, 90, 73,163, 81, 43,249, 95,115,142,220,101, 49, 38, 55, 23, 84,107, 17, 19,131,107,160,144, 50, 9,169,188,247, 88,214, 25,
+126,154, 27,123, 90,188,252,168, 21,167,101,109, 41,133,154, 59,113,242, 53, 83,130,148, 53, 14,183, 16,144, 57,114, 49,132,132,
+201, 83, 1, 91,107, 65,140,253, 11, 90, 43, 29,141, 70,107,242,188,243,222,114,178, 20, 35, 41, 68, 68,173, 21,156, 35,253,134,
+181, 6,206,208, 52, 43, 38,162,176,105,173, 97, 29, 93, 54,206, 57,104,235, 49,207, 11, 30, 30,158,112,187, 93,177,221, 46,228,
+247,118,132,125,245,108, 37, 44, 60,209,146,103,120,246,158,243,187,169, 24, 74,137, 66, 35,166,105,194,237,118,107,235,152, 90,
+ 43,230,201, 99, 93, 87, 56,235,240,114,121,165,215, 48, 77,120,189, 94, 49,123,199,118, 68, 2,242, 24,100, 90, 21, 20, 18,178,
+161, 22,222, 69,107, 94, 9, 21,148, 28,121,228, 78,151,246, 60, 45, 48, 90,227,182,239,216,142,116, 39, 8, 83,195,228, 76,138,
+167,201,249,142,137,205, 25,110,154, 96,148,194, 30, 2,188,167, 68, 63,197,241,172,137,245, 18,126,242,136, 33, 16, 84, 37,147,
+144,173,148, 66,194, 63, 41,244,141,134,142,149,167, 13,100,249,116,214, 34,134, 3, 17, 10, 31, 95, 95,248, 50,232,174,147,135,
+117,134,247,142,158,151,121,226, 11,147,223,228,196,223,121,246,234,127,254,244,136,239,223,191,224,122,189, 97,246, 22,102, 51,
+ 56,175, 51,106, 0, 66, 42, 13,141,122,196, 4,111,109,227, 11,224,206,181,132, 33, 52,232, 46,218,163,157, 85,219, 30,104,242,
+163, 20,222,189,251,128,112,144,104,110,154,167,214,173,107, 22,223,201,107,141, 41, 97,219,119, 92,111, 55,108,219,142, 35, 68,
+ 84, 69, 60,255,148, 19, 82, 4,178,186, 33, 14, 25, 28,170,168, 78,151,227, 21,139, 40,196,133,216, 38,246, 99,177,225, 25, 13,
+ 24,152, 65, 15,192,201,130,172,151,200, 37,243, 74, 81, 53,129,220, 72,170,215, 13, 33,221, 5,165, 50,141, 4, 83, 9, 75, 29,
+128, 94,172,134,175,195,200,190,214, 30,145,170, 27,196,171,131, 98, 42, 42, 39,175,117,144,171,188,203,198,176, 85,210,154,190,
+ 58, 17,187, 96,227,207,115, 54,186,234,211, 86,113, 33,212, 38,164,251,247, 87, 43,162,148,151,105,157, 88,173, 75,161,251,205,
+ 22,140,163,247,206, 9, 86,226,239,171,227,131, 80,217,186, 62,250,213, 75,167,244, 72,199, 94,208,168, 92,181, 2, 47, 71,196,
+100,129,175, 63,127,131, 95,126,251, 93, 19,114,164, 24,200,162, 86,228,141,112,204,147,230,145, 34, 11,169, 90,200, 61,139, 82,
+ 38, 59,145,208, 9, 22, 85, 27, 40, 21,251, 56,133, 11, 20,175, 72, 65,235, 53, 80, 42,237,125,117, 46, 72, 89,227,118,125,165,
+106,145, 69, 42,210, 21, 71, 62, 44,171, 49,247,114, 97,244,144,122,110,119,219,104, 69, 13,123,114, 12,177,170,106, 32, 2, 73,
+ 39, 50, 22,109, 21,133,189,226,157, 2, 35,251,151, 50,136, 90, 84,173,119, 16,154, 42,137,121,146, 97, 47,105,120,133,245, 15,
+ 93,115,207, 25,236,252,185, 48, 54,149,248, 10,165,239,147,106, 79, 34,106, 1, 9,170, 55,252, 70,141,186,123,122,216,197,214,
+ 84,100,239, 95,250, 62,191,176,208,209, 24,221,120,226,219, 30, 48, 57,139,235,126,176,154, 26, 61, 27,155,149,249,146,226,231,
+ 12, 89,121, 74, 23,169,182, 96, 29,133,218, 3,142,248,113,180, 90,241,254, 79, 44, 62,244,251,236, 49,145, 48, 47, 85, 36,168,
+ 22,113,170,106, 69,213,185,229,133, 31,199, 14,109, 12,137,163, 64,246,160,146, 51,172,177, 80,218, 34,229, 3,167,135, 71,212,
+156,113,236, 27, 41,159, 13,237,184,115, 41,240,222,226,118,187,192,184, 25, 78,233,102, 51,185,109, 23,120,235,112,221, 34,182,
+237,198, 64, 37,133, 80, 20, 30, 30,206,208,149, 14, 37,249,194,203,161, 39,133,237,108, 53,227, 49,233,192, 44,133,198,217,181,
+ 72, 70, 52,229,210, 27,142,107,205, 28,142,163,215, 21,151,235, 13,139,119,180, 16, 83,100, 83,115,126, 6, 20,240,241,253, 59,
+108,183, 87,178,125,241,154,101,178,174, 9,240,104, 36,156, 97,148, 97,113, 89,196,227,249,220,121,221, 57, 97,153, 87, 86,162,
+203, 94,156,246,135,167,211,137, 51, 22, 98,251,142,239,199,193, 35, 87,210, 85,152,117,229,125, 56,112, 28, 71,251,174,132, 68,
+130, 41,199,246,210, 99,223,155, 19, 6, 74, 97,114,228,255,190,110, 59, 91,238, 42, 22,101,184,216, 16,125, 14, 81,204,106, 45,
+ 52, 42, 71,229, 78, 59, 96,241, 51, 61,103,131,238,135,184, 22,150,210, 1,181, 6,144, 16, 99,160, 49,126,136,124, 38,209,238,
+123,219,119, 34, 9, 26,131,125,167,110,118,219, 3, 57, 24,184, 35,252,240,114, 1, 80,177,206, 51,254,250,187,119, 77, 99,244,
+ 48,121,172,243, 76, 35,118,235, 90, 33, 65, 78, 6, 42,114,197,221,115, 62, 81,166,252,215,159, 63,225,111,190,125, 75, 32,161,
+122,195,105,118,120,152, 29, 62,108, 17, 57,211,119, 50,102, 82,178, 43,118,235,160,210,101, 86, 89,176,247,105,151,174,134,229,
+122,195,155,198, 8,235, 61,126,248,225, 29, 66,140, 88,118, 90,145, 56,231,217,109,161,219,238, 88,242,211,247, 16, 41,127,227,
+136, 72, 12,198, 41, 37, 33,133,138,172,129,176,109,119, 35,118, 42,144,104,116, 76,250,230,204, 86,182,210, 98,156,165,225, 33,
+151,142,225,163,166,180, 38, 70, 38, 5,165,130,186,116, 22,162,169,134,233, 84,157,249,166, 6, 77,129,234,142, 33,193, 44,203,
+ 39,166, 89, 72,170,135, 53, 72,101,162, 92, 45,170,131, 99,196, 2,223, 88, 17,159, 68,252,222,161,229,105, 58, 84,235,152,162,
+169, 97,116, 69,102, 58,164, 6,139, 43,181,254,196,222,108,218,138,132,179, 79,219,106, 5,124, 86,246,128, 37,134,156,213,238,
+106, 40,136,161,214,207, 0, 0, 32, 0, 73, 68, 65, 84,124,223,218, 59, 72,123, 11,148,161,174,188,178, 32,161, 42,116, 92,101,
+ 3,243,143,222,253,122,215,177, 11,120,190,200,155,162, 53,140,113,248, 39,255,232, 63,198, 47,255,151,127,201,234, 67,160,164,
+ 0,205, 92,105,169,178, 53,147,131,156,243,180,191,227,174,200,242, 67,111,141,164, 9, 45, 92, 97, 7,232, 76,118, 21, 61, 92,
+ 70, 34,152, 74,150,194, 14,182, 88, 24,121,170,145,227, 65, 23, 65, 81, 20, 4,146, 42, 20, 7,109,180, 12, 12,133, 6, 40, 41,
+178,147,209,186,217,187, 70,244,171,196,241,181,201,197,224, 39, 22,227,185,196, 93,210, 69, 43, 99,118,180,238, 72, 30,104, 53,
+240, 1,186,162,178,220,109,128,234, 40,162,144,255, 30,132,246,149, 44, 95,114,183,162,137,196, 70,101,230,157, 30,226,206, 38,
+ 87,121, 20, 92,216,114,216,121,226, 82,225, 74,212,166, 20, 89, 89,162, 45,135,181,130,225,113,175,116,222,128,198,118,132,230,
+118,240,214, 65,213,130,172,104,253, 98, 45, 41, 61,247, 35,226,224,188,100,217,175,150, 78, 69,186, 43, 62,186, 90,214, 52,214,
+193,228,201,202,100,180,194,190, 71, 78,212, 51, 40,153,163, 56,115,134, 86, 21, 37,115,106, 93, 73,164, 82,182,204,203,206,137,
+211,220, 20,230,229,140, 15, 31,127, 24,248,246, 76, 50, 99, 27, 85,136,113, 16, 59, 25,196, 20,176,204, 79,152,167, 25, 37, 71,
+204,126,110,221,187,113, 30,251,237, 10,171, 21, 38,173,128,146,104,130, 80, 65, 30,254, 35, 16,100,103,176,158,121,231, 72, 92,
+ 24,115, 59,160, 82,138,116, 64, 56,241,211,163,177,223,157,181, 56, 2,165, 5, 46,211,196,130, 83,139,135,135, 39,132, 16, 8,
+242,147, 50, 82,220,121,231, 30,225,140,197,196,248, 92,239,136, 37, 96,180,129,179,134, 46, 92, 99,112, 94, 23, 78, 56,180,184,
+221, 56,253,142,237,129, 90,107,138,183,133,194,204, 44,116,193, 63, 87, 33,220,241,103, 53, 77, 30, 57, 37, 88, 75,163,115,101,
+116, 19, 9,202,119,105, 93, 23,228, 92, 41,196,131,247,134,133,167, 62, 94,107, 92,110, 55, 94, 13, 84, 76,126,193,126,236,112,
+214, 49,149,143,214, 5,198,104,232, 66, 35,120,239, 61, 43,171, 85, 3, 47,101, 70,161, 42, 67,107, 4,239, 61, 91, 11, 11, 59,
+ 0, 82, 39,171, 25, 13,231, 28,174,183,141,154, 16, 0, 37,101, 76,222, 98,219,143,193, 33,163,153,174,103,145, 14, 26, 75,151,
+ 34,193, 60, 21,159, 61,158, 40,184,133, 93, 62,178, 18,145,116, 57,205, 1, 52,148, 44, 72, 63,199,103, 79, 15,120,189,237,120,
+127,217, 80, 74,193,235,182,227,179,179,193,143,158,206,248,246,221, 75,123,254,183,152, 96, 21,224, 13,159, 47,188, 6, 48, 90,
+ 53, 92,240, 61,144,178,222,193, 41,223,189, 92,240,163,231, 71, 40,235,240,225,245,134,237, 8,152, 55,215,115, 47,152,205, 81,
+249,247,206,165, 32,166, 76, 66,214, 24,105,199,171, 65, 98,190,170,104,202, 89, 50, 66, 76,124, 17,167,230,134, 18, 38, 64,183,
+145,130,211, 4,199,100,192,130, 82, 58, 92, 70,206,219, 84, 50, 82, 76, 44,214,203, 44, 74, 30,112,220,124, 46,200, 29, 32, 77,
+213,232, 10, 82, 44,144,107,212,244, 74, 23, 44, 69,155,234,182,210,107,233,154,184, 79, 68, 68, 85,109, 69,218, 38,161,163,113,
+ 84,117,248,141, 82, 64, 56, 40,237,211, 24,211,222, 71, 88,246,148, 14,141,116, 23, 83,102, 40,158,156, 43, 38, 71, 10,222,187,
+178,179,160, 59,165, 36,133, 14,131, 30,133,207, 68, 25,173, 67,245,241,239,168,148, 20, 13,156, 44,245,203, 72, 12,175,232,244,
+185,161,225,175,170, 52, 11,129, 40,229,141,117, 88,157,185, 31,242,171, 94,161, 40,208,195,232,157,231, 81, 42,117,130,222, 10,
+227,152, 46,139,153, 99, 2,101,215,163, 17,161,138,102,143,186,110,252, 91, 81,202, 35, 21,148, 74,132,174, 84,129,201,106,148,
+ 28,219, 27,111,152, 41,128, 70, 81, 99,158,113,233,177,120, 2, 54,185, 87, 45,214,182,159, 83,170,183,143, 34, 78,175,195,229,
+174,196,247, 57, 68,178,202,133, 75, 54, 47,213,169, 71, 77, 44, 87, 63, 97,195,210,159, 85, 74,238,136,220,218,133, 25,253,129,
+234,157,118, 11, 3,169,146,164,213, 31,244, 59,249,132,234,137, 71, 40,181,233, 24,154,160,100, 20,100,148,190, 39,210,198,180,
+252,226, 6,177, 41, 84,145, 42,206,240, 70, 37,244,172, 20, 32,185, 84,216,133,226, 72, 13, 7, 33,228, 82, 8, 21,171, 0,111,
+ 41,135, 90,241,184,173,126, 2,235, 25,127,118,173,129,231,243,138,196, 93,170, 60, 55, 33,208,239,233, 39,135,235, 30, 49, 89,
+ 71,207,182, 70,163, 28, 86,254, 12,100, 60, 6, 85, 96,181, 65, 74,180, 35,158,231, 51, 82,162,136,204,156, 34,204,228,145, 99,
+230,196, 55, 34,198,169,170,216, 70, 23,177,172, 39,228,148,177,151, 27,220,178,242,174,254,192, 52,207, 56, 94, 62, 96, 89, 22,
+236,151,143, 8, 71,192, 52,123,236,123, 64, 72,145,186, 28,246,212,103,198,114, 90,231,241,217,155,103,234, 92, 93, 65, 74,140,
+147,229, 98, 58, 70,250, 89,173,209, 92,180, 36, 0, 6,167,101,109, 97, 47,211, 52, 3,160,137, 87, 74,137, 58,195,154,224,140,
+ 66, 76,180,115,181,150, 96, 43,203, 52, 97, 59, 2, 91,185, 10,114,138,128, 82,120, 88, 23,196,148,176,240, 20, 35,151, 12,175,
+ 29, 67,138, 42,246,227,192,228, 39, 60, 61,145,133, 79, 27,141, 35, 37, 28, 71,104,142,143,156, 51, 30,206, 39, 42,251,156, 67,
+140, 7,129,132,246, 64, 92,111,177,247, 25,131, 99, 63,160,140,134, 53, 22,243, 52,195, 77,212, 49,123, 71, 2, 52, 85,105,253,
+ 96, 56,206, 85,138,253,196,103,133,209, 26,219,193,128, 25, 0, 49, 4, 4, 40, 44,243, 66, 97, 79, 41,192,106,242,148, 23, 0,
+111,158,159, 89,212,165,216, 62,166, 16,183, 29,213, 82, 71,119, 28, 1,147,247,112,206,225,253,203, 43, 38,103,217,213, 37,129,
+ 32,228,162,200,137, 46,175,125, 63,224,141,198,219,215,107, 59, 47,181, 82,148, 59, 80, 43, 1,124, 4,135, 92, 43,142,253,128,
+ 51,166,173,215,102,182,252,237,251,129,211,186,224, 71,207, 15,184,108, 59, 66, 46,120,189,238, 88,172,193, 87, 79, 15,120, 88,
+ 39,188, 92,119, 46,146, 25,129, 10, 26, 89,107,214, 35,149,113, 50,120,239,137,193, 88, 23,191, 92, 54,124,254,120,194,249,124,
+194,109,219,113,221, 14, 28, 33, 18, 45,144, 81,184, 50,130, 23,203,109,202,133, 11, 72,114,185, 84,232,214,144,108, 71, 64, 44,
+138, 52, 35,188,194, 16,251,108,102,173, 3,233,146,232,243, 34,152, 10, 29,154, 66,148, 35,117,124,207,122,168,133, 66,172,100,
+167, 63,134, 99,169,162, 72, 74, 36,118, 53,168,102, 81,213, 74,221,165, 26,106,254,191,118,166,203,229, 95,209,115, 22,164,239,
+209,146,185,208,115, 49,250, 89,212,215,203, 85, 13,231,188, 82, 77, 7,181,172, 11,150,101,230,215, 83, 56,154,155,180, 60, 74,
+139,208,155, 5,172, 37,163,148,140, 1,178,218,104,152, 77, 76, 55,168,235,139, 20,255,186, 83, 50,107, 15,195,232,157,250,200,
+117, 31, 85,146,117, 0,206,244, 70,175,244,253,205,232,136, 71,183, 79, 21, 69,180,172,194, 95,130, 91,200,112, 22, 28, 68,208,
+ 69,121,205,176,175, 20,172, 6, 87,221, 96,251,137,107,120, 82,201, 11,246,222, 13,221, 89, 69,184, 70, 30,191, 2,179,213,136,
+220,149,201,238, 35,229,138, 35,101,164,170, 26, 35, 55,197, 72, 89,197, 80,176, 0, 98, 11, 38, 82,125,148, 62,198,160,138,138,
+114,132,176,104, 61,208,244,186, 44,187,223,229,186,227, 1, 69,232,198,202,198,102,141,108,251,156,218, 10,151, 49, 23,120,204,
+178,134, 26, 71,248,125,199,100,196,175, 94, 42, 10,114, 47, 48, 84,147, 68,210,120, 86, 48,170, 45, 33, 14, 60,185, 80,232,162,
+253,202,124,246,204,239,111,105,216,201, 90, 43,140, 60, 60,131,112,198, 48, 32,166, 61, 92, 2,189,224, 84, 38,169,182, 69,128,
+ 38,212,192,148, 11,246,156,225,216,163,233,157, 69,202, 25, 49,101, 22,200,213, 1,147,219,193, 55,117,208, 12,104,109,144, 74,
+225,142, 54, 82,218, 91,243, 52, 43,228, 64,246,184, 90, 85, 11,142,208,156, 39,175, 42,179,199, 21,225,117,181, 97, 11,162, 34,
+181,105, 25, 70, 90, 20,128, 99, 48, 47, 11,246,237, 70,191, 71, 58, 0,109,144, 98,128,182, 26, 37, 69, 36,109, 80, 97,160, 66,
+ 64,214, 25,202, 24,168,170,225,252,140,154,105,130, 16,114, 70,188, 94, 41,152,196, 18,176,227,224, 12,117,249, 28,190,120,243,
+204, 9, 85,134, 16,180,229, 32, 81, 20,136,119,110,153,156, 87,249, 32, 76,185, 98,157, 28,156,115,176,110,130,113, 14,215,235,
+ 43, 52, 20, 62,190,146,178, 93,163, 96, 15, 7, 21,206,198,194, 79, 30, 86, 43,196,148,200,179, 12, 58, 76,173, 54,216,227,129,
+167,135, 7, 94,121,144, 32,240,227,203, 43, 78,235,138,148, 8,119,235,189,195,237,186,193, 56, 79,228,181,137,118,212,215,203,
+ 5,235,233,220, 14,242,245,116, 38, 40, 80, 46,200, 57,114,151, 68,239,171, 68,210, 90, 67, 99, 71,203, 26, 2, 99, 45,220, 68,
+107,154,144, 42,172, 73,200, 49,182,247,240, 97, 89,219,158, 93, 56,216, 37,209,193, 25, 83,130,174, 21, 33, 23, 40,163, 48,251,
+ 9,251,190, 97,158,103,234,108, 67,192, 58,123,164, 92, 49,205, 11, 82,140,132,237, 5,176,237,219,240, 29,167,117, 1, 53, 19,
+164, 89, 88,230, 9, 57,229,187, 32, 33, 73, 0, 12, 41,115, 35,163,113, 57, 98,123,110, 63,123, 88, 73, 73,110, 12, 23, 4, 26,
+ 33,144,163, 32,196, 72,186,149,162,154,104, 46, 69,226,202,215,226,240,120, 62,225,171, 55, 1,127,251,246, 61,246, 24,241,241,
+186,225,225,182,225,139,231, 51, 98, 76,216, 66,106,197, 96, 42,104,147, 45, 65,171,226,142,162,134, 59,214,185,156,153,123,140,
+184,222,118,120,231,113, 58,173,184,109, 59,142, 24,233,245, 4,213, 34,155,181,181,168, 12,103,162, 98,151, 86,108, 74, 99, 40,
+216, 11,174,251, 1,165, 45,191, 70,201, 85,207, 45,231, 64, 46, 57,203, 83, 79, 35, 83,176,218, 18,194,144, 51,218,212,148,214,
+ 81,153,115,219,115,203,107,151, 52,179, 58,230, 72, 75, 60,173,196,175,136,237,172,212, 33,119,163,235,158,138, 68, 14,179,176,
+ 87, 4,207, 96, 8, 91,213,221,197, 85,170,248,210, 63,213, 80,213, 54,113,237,205,170,194,186,158,112, 58,211,170,233, 56, 14,
+148, 35,240, 61,161, 9,201, 59, 82,228, 50,175, 69,235,160,111, 27, 68,118, 99,152,143,208, 32, 33,222,123,109,208, 22,254, 85,
+ 58,245,118,105, 99,224,242,242, 27, 49, 94,206,195, 31, 52,254, 55,205,198, 38,100, 28,177,165,176,255, 14,252,207,142, 92,241,
+225,227, 11, 38,239,120,124,162, 89,120, 19,224,167,133,241,140,232,249,186,124,145, 86, 22,130, 57,103, 49, 77, 19,163, 26, 9,
+245, 89,106,197,107, 78, 80, 44,174,177,168, 8, 44,240,210, 74,195, 48,103, 87, 62, 65,175,169, 58, 74, 49,180, 67, 59,243,221,
+ 23, 57,141, 76,178,225, 91,222,117,189, 23,189,137,226, 91, 15,151,126, 29, 50,190,165,216,128,162, 87,216, 71,240, 69,150,233,
+252,183,149, 65, 14, 50,142,231, 85, 71,173, 61, 0, 64,141,113,246,221, 3, 57,250,209, 91, 53,203,126, 74,240,133, 44,197, 68,
+ 29,198,247,244,122, 89, 56, 36, 15,202, 39, 95,120, 81,235,138,231, 90,108, 36, 98,139, 27,247, 52, 36, 66, 43,109,250, 32, 94,
+206,116,159, 45, 71, 95,206, 90, 90,246,114,140,212, 89, 59,163,154, 40,206, 90, 67, 85,125, 83,133, 82, 82, 23,173, 3,238,189,
+182, 50, 22,147,231, 32,231,210, 2,103, 14,182, 32, 41, 69, 28,116, 83, 41, 20,230,118, 4, 40,101,187,224,177, 82,161,131, 82,
+ 6,172,171,124,225,108,243,148,230, 82, 48,207, 11,182,253,134,117, 89, 96,157,131,113,116,129, 29,183, 11,230,133,178,226,133,
+ 43, 30, 82,194,228, 93,139, 20, 62, 66,128, 49, 6,225,184,194, 58,143,117, 90, 80,114,132,158, 12, 66, 60,200,178,149,232,217,
+159,253,132,223,249,173, 31,195,106, 80,140,108, 36,221, 71, 41,100,203,202,137,156, 33, 98,169, 49,214,192, 24,143,170,105,196,
+185, 44,167,198,252, 87,165, 34, 85, 96,153, 23,172,147,195,245,118,131, 51, 14, 65, 81,116, 46,237,249, 20,170,233,107, 36,231,
+168,163,156,230,137, 82,255,246, 3,206, 89, 92,174, 87, 76,147, 67, 96,187,152, 49,116,249, 44,235, 66,157,167,161, 85,192, 17,
+ 2,188,247,128,162, 9,204, 52, 77,252,221,245, 80, 41, 1,149, 20,209,114,161, 4,182, 68, 25,173,113,217, 55, 44,243,204, 23,
+159, 97,255,186, 2, 74,192,182, 71,118, 24, 24, 44,214, 34, 4,162, 15, 26, 40, 4, 46, 84,140, 53,216,247,192, 52, 74, 26, 27,
+ 31,129,249,228, 41,225,114,189,226,179, 55, 79, 40,215, 13, 49,102,248,217,227,122,189, 17,244,167, 20, 28,137, 70,241,219,182,
+193, 79, 19,175, 44, 72,232,116,219,118,156,215,181, 29,186,114, 78, 89,203, 78,158, 66,233,103, 70, 1,183, 35, 48, 74,154,192,
+ 49,167,121,106, 28,129,170, 0,205,133, 75, 8,169,113, 9, 4, 52,162,249,217, 71,169, 72, 37, 99,153, 39,188,121, 58,227,229,
+186,225,135,235,134,203, 17,240,246,253, 7,252,236,116,194,103,143, 39,252,230,195,165, 69, 17, 39,254, 34,219,210, 33, 56,194,
+170,184, 35, 69,182,200, 93, 90,255,149,156,241,241,122,195,155, 71, 98,225, 75, 0, 87,138,137,187, 65, 71,176,166, 68,151, 57,
+184,136,162, 11, 93,183, 37,182, 82,192,198,138,120,165, 51,142, 16,105,130,151, 11,195, 98, 10, 7, 14,245, 9,168,213,252, 12,
+ 86, 98, 44, 72,188,172,160,167,133, 88,151,216,202,152, 82,110,218, 37, 1,112,181,203,186,221,235,157,218, 86, 91, 8, 82,231,
+156,244,208, 43,234,114,197,191, 46,151,114,225,233,248,221, 62, 93,118,222, 18,105,203, 4, 85,137,157,174, 18,246, 90,187,188,
+222, 88, 11,109, 44, 28, 23,230,214, 78,205,218, 70,110,142,122, 55, 66,175,220, 76,136, 64, 60,165,216,132,179,181,220,139,176,
+123,227,166,238,199, 47,160,103,204,202, 94, 75, 60,232,170,229, 46,143,227,219, 33,137,237, 46,204,133,225,244,178, 27, 19,193,
+ 23, 43,201,229, 66, 71, 41,120,217, 46, 56,213,140,243,186, 98,219,143,150,119, 91, 90,229, 69, 85, 16,101,143,103,174,126,116,
+ 59,224, 29, 19,181,156, 53,240,204, 99,174,181,210, 1,109, 28,113,195,179,100, 66,163,101,234,130,163,245, 10,168,211,212,214,
+ 32,199, 58,236, 34,200, 74, 4,173, 80, 50,143,100,181,193,145, 98, 79,203,105,234,117,213,124,137,205,166,102, 12,125,200,160,
+125,189,236,138, 68, 33,222, 85, 8, 76, 44, 26,216,238, 50, 2,110,217,234,106,128,211,180,137,129,110,151,114, 67,126, 14, 74,
+248, 94, 37, 48,101,140,237, 32,125, 91, 94,248,247,167,234,253,238, 57,168,149, 56,212,252, 90, 10, 11,220,228,210,206,237,115,
+ 46, 13, 52, 36,140,247,218,168,102,104, 57,239,170,177,226,213, 29,210,183, 86, 18,171,169,182,104,168, 72,169, 34,231,230, 16,
+ 69, 72,169, 81, 13,203,144, 82, 84, 24,176,208,213,165,253,149, 91,205,145,184,124, 0, 72, 96, 70, 77, 25,243,228, 26,251, 93,
+ 4,155, 80, 52,133, 80, 85, 60,220, 20, 3,108,170,226, 80, 28,213,132,127,178,203,215, 74,225,245,242,138,167,135, 71,194,179,
+214, 2, 99, 61,226,118,133,210, 6,235,178, 32,166,120,183,143, 85,198,181,181,148, 41,133, 15,120,141,203,237, 21,198, 59,196,
+237,192,237, 22,144,114,228, 41,128,198,143,222, 60,225,119,126,251,183, 97,173, 33,180,114,162,226,140,198,238,244,236, 89,107,
+225,180, 67, 17,197, 56, 63, 21, 79, 15, 15,252, 76, 22,156,230, 25,219,182,227,241,241, 1,219,182, 97,187, 5,252,230,237, 11,
+214,245, 4,235, 44, 22, 40, 18,251, 89, 18,177,201,202,194, 26,242, 69,248,101,198,113,236,184,222,232,146,245,206,225,182,109,
+ 64, 5,206,167, 83,123,214,172,181,184,220, 54,254,247, 59,172, 37,239,247,227,227, 35,194, 17,240,245,215,191,133, 15, 31, 63,
+192, 26,139,125,223,224,140,129,183,182,173,201, 98, 12, 20, 18,130,138, 61, 4, 44,243, 66,147,139, 2,226, 1, 24,131,253,118,
+193,245,182,193, 89,218,191,159, 61, 89,201,188,115, 40,153,188,249,211, 60,147, 61,235,122,107,128, 40,153, 58,158, 88, 52,248,
+120, 94, 17, 83,198,235,235, 13,214,106, 88,235, 96,141,167,117, 30,175,251, 80, 11, 98,136, 56,159, 78,136, 49,162,148,130,117,
+165, 85, 95, 74,137,154,136,156,219, 56,218, 58,139, 99, 39,200,204,182, 29,152,173,129,113, 22,255,238,251,247,116, 49, 87, 96,
+157,124,163,217,105,246, 95, 11, 52,197, 48,172, 7,181,239,185, 19,199,189,230, 66, 64,173, 92, 20, 30, 79, 39,124,241,188,227,
+101,219,145,114,198, 15, 47, 87, 60,189,188,224,124, 58,227,121,157,241,253,203, 85,238, 6,148, 10, 36,209, 50,141,156,140, 70,
+163, 44,119,241,140,165, 80, 88,210,235,117,199,228, 92, 19, 5, 46,218, 34,121, 22,110,230,212,192, 64,154,149,230,180,182,233,
+ 2, 91,107, 53,142, 35, 96,143, 9, 59, 23, 67,145, 45,155,178, 15, 46,108,219,115, 66, 72,108,234,127,230,113,176, 72, 84,134,
+197, 2,226, 74,124,153, 83,241, 84,218,238, 92,244,230,106, 72,196,236, 46, 8,161, 40,222, 95,244, 90,245, 83,164, 43,227,217,
+ 33, 62, 26,215,203,125,138,102,225, 59, 77,146, 29,155, 99,172,141,196, 27, 98,164, 89,149,193,171, 70,173, 45,148,225,245,107,
+ 76,228,219,103,113,103, 5,189,110,165, 21,252, 52, 99, 89, 79, 60,161,162, 38, 37,236, 27,194,177,163,196,120,151,248,134,113,
+ 93, 32, 99,250, 22, 88,213, 2, 93,208,108, 17, 69,140,239,204,113, 31,123, 46,249,178,180, 14,190, 54,242, 59,249,250, 68, 68,
+214,212,241,247, 29,251,116, 58,227,139,231, 71,252,240,225, 35,121,104, 5,198,207,100, 50, 73,234,242,214, 10,202, 6,222, 57,
+ 22,193, 41,222, 71,249,246, 37, 41,185,224,205,143,126,140,252,225, 45,145,141, 44, 37, 68, 41, 40, 24, 30,207,150, 92, 16, 33,
+227, 38,234,164,115,161, 4, 28,199, 31,140,231, 88, 69,137,198, 43,168,237,242, 30,131, 52,234, 32, 78, 19,197,127,201, 29,215,
+ 88,198,127, 47, 42,114,213,147,137,234,144,137,221, 0, 58,181,222, 49,159,234,157, 40,172, 67,125,198,224, 29, 12, 19,144, 86,
+104,240,191,147, 44,117,213,124,139,224,253,118,175,218, 75,219,247,145, 8, 73, 38, 34,106, 72, 54, 27,193, 66, 98,187,211,194,
+ 97,102,156, 35, 56, 67, 91,114,207,121,212,193,158,107, 6,230,160, 67,114,114, 41,200,133,192, 27,226,146,208,172,200,111,137,
+ 69, 3,148,167,212,202,249,195, 13,219,115,183,233, 81,138,163, 36, 1, 44,206, 98, 15, 7,142,156,145,120, 26, 48, 77, 19,125,
+217,120,146,162,249, 32, 19, 65,166, 6, 48, 59,223,138, 55,249,253,141,155,113,121,253, 1, 80,138,210,214,120, 82,180,111, 55,
+ 76,147,103,149,246,130, 24, 34,246,109,231, 47, 61,113, 22,172,167, 4,177, 82, 11, 22, 63,193, 77, 14, 97,167,241,238,236,103,
+154, 76,249, 25, 74, 39,220, 14,224,241,252,136,243, 60,193,123,202,237,126,189, 94, 8, 29, 91,233,192,164,176, 35, 13,239, 29,
+148,254,255,216,122,147, 93, 89,178, 43, 77,239, 95,187, 51, 51,119, 63,205,237, 35, 72, 38, 65,177, 88,100, 33, 85, 18, 4,168,
+ 25,213, 72,208,176, 94, 66,143, 32, 64, 83, 77,234, 1, 4, 77, 53, 21,160, 55,208, 43,104, 36, 65, 80,170, 50,179,152,100,102,
+101,178, 9, 70, 4, 35,110,115, 26,119, 51,219,221,210, 96,173,189,205,252, 70, 38, 64,220,200,136,123,207, 61,199,221,109,239,
+213,252,255,247,143,184,156,159,213,131, 12, 28, 14, 71,128, 43,238,238, 95, 34,198, 5, 37, 70,124,252,244, 81,198,202, 57,195,
+ 57,143,155,147,145, 75, 80,213,178,151,121, 6,106,134, 53,226,219,182, 62,224,238,238, 70, 34, 47, 75, 65,140, 17,222, 7,212,
+221, 84,106, 28, 7, 16,145, 40,195,149,166,182,198,132,224, 4, 80, 50, 77, 35,214, 24,251,196, 98, 8, 1,143, 15, 15, 56,140,
+242, 90, 12, 10,125,201, 37,139,154, 59,203,197,156,180, 86, 30,198, 17, 4,194,211,188,226,246,120,196, 48, 12,120,122,124,192,
+101,158, 49,141, 3, 8,140,224,196,169,114,119,119,139,135,135, 71, 4, 47,170,255,156, 43,150, 40,200,223, 90, 89, 0, 57, 12,
+161,196,233,110,186,234, 94,247, 48, 77,162,120, 15, 3,166,105,194, 56, 14, 10, 34,146, 78,219,107,129, 82,138,100,193,139,192,
+171,246,152,210,172, 23, 65, 5, 43, 55,190, 98, 93, 19,124,112, 18,236,162,224, 34, 86, 66,227,237, 20, 36,154, 86, 59,221, 22,
+ 14,211, 0, 68,117,103,105,181,155,184, 69, 87, 88, 6, 46, 88, 80, 34,188,186,191,197,101, 89,241,199,247,159, 16, 43,227,207,
+239, 63,193, 58,135, 41, 88, 12,206, 96, 73,109,170, 4,100,189,136,154, 62,170,117,155, 93,103, 68,123,135,141,124,175, 75,202,
+120,186,204, 56, 76,147,172, 60,201, 2, 49, 34,165,139,226, 88,171,128,187, 90,132,243,110,122,102,213, 74,185,198,132, 53,101,
+172, 49, 99,240, 2,136,233, 13, 77,173, 27,238, 90,215,162,182,157, 93,117,195,139,215, 93,243, 32,147, 47, 17,219,166,156,186,
+ 75,228, 58,154,101, 39,138,107,152,100,218,112,176,134, 76,239,194,183,142,158,118, 90,174,205,185,176,133,167,176,168,226,105,
+139,138,105,119, 91,139,134,222,159,141,237, 78,100,146, 17,189,211, 46,125, 58,156,224,148, 99,144, 22,209, 31, 48, 3,110, 24,
+ 16,140,221,196,113, 10, 78, 27,198, 9,195, 56, 41, 74, 22,112,195,132, 97, 60, 32,197, 5,113, 89, 16,151,139,104, 93,118,176,
+ 25,218,237, 19,218, 63, 27, 34,184,158,205,162, 97,243,218,179,105,245, 71,221, 96,223, 35,236, 52,145,172,241,112,183,246,169,
+246,232, 86, 96,131,229,115,213, 48, 3, 16,230, 92,240,246,213, 75,252,230,247, 95,129,106,237, 35,234,166,252, 6,128,209,123,
+ 17, 11,169,237,195, 16, 84, 97, 76, 24,135, 1,206,201, 97,236,173, 69, 86,113, 95, 73, 89, 70, 61, 94, 82,113,188, 37, 20,171,
+ 8, 74, 13, 67, 8,222,194,146,140,149, 88, 71,114,213,180,157,157,130, 5,170, 60,188, 40, 69, 84,247,100,228, 53, 52,251,142,
+ 24, 29,165,187,237,207,181,238,170,165,143,223,155, 2,188, 39,206,239,246,242, 77,105,189, 11,183,214, 67,148,251, 14,168, 33,
+ 38,121,103, 51,216,119,216, 68,155,160,174, 77, 18, 88,133,110, 76,181,243,245,249, 42,153, 27, 27, 88,104,231, 85,223,136,118,
+172, 23,165,120,211,249,202, 35,190,255, 89,183, 93, 98, 43,198,128, 61,163,152,118,234,122,218,118, 71,250,179,230,178, 89, 73,
+184,104,152,133, 90,185,246,150, 35,244, 28, 98,186,174,164,119, 2,191,230,220,156,151, 5, 75,206, 66,104, 83,214,114,227, 60,
+ 71,205, 44, 23,128, 67,233, 7, 43, 41, 17, 44,198, 85, 10, 15, 99,144, 75, 66,122,254,132,183, 95,254, 2,223,255,249, 15,152,
+151, 8, 75,132,239,191,255, 22, 47,238, 95, 74,167,110, 9,235,124,129,243,126, 83,247, 26,131, 26, 25,148, 51,194,120,196,224,
+109,207,140, 31,172, 69, 25, 39, 84, 29,143,113, 92,241,242,254, 14,191,124,245,115, 60, 60, 61,225,249,233, 25,167,211, 45, 30,
+ 30, 62,225,208,246,214,101,227,165, 27, 34,164, 84, 68,249,109, 37,124,165, 84, 25,135, 54,224,140, 49, 2, 39,185,189,189, 67,
+201, 81, 4, 84, 85, 24,219,198, 57, 9,181, 89, 87, 56, 48,194, 56, 34, 43,224,102, 26, 6, 24, 99,197,255,206,140, 81, 59, 95,
+175, 93, 91, 78,185, 63,231,167,227, 17,143,207,231, 62, 57,104, 89, 8, 15,143, 79, 8,222,195,120,139,121, 89,112, 58,157,186,
+186,123, 84, 58, 91, 76, 9, 41, 70, 56, 39, 93, 28, 88, 80,165, 33,120,157, 66, 4,156, 70,194, 16, 28,150,229, 44, 89,231, 94,
+ 92, 18, 49,171,179, 33,174, 98,229,243, 86,223,183, 4, 31,134,190, 10, 28, 66,128,119, 78,194, 99, 88,215, 33, 49,194, 57,139,
+105, 28, 17,115,193,241,120, 82, 79,184, 20,208, 41,101, 25, 53,151,130,218, 44,180, 93, 68,200,136,113,213,132, 56, 82,148,106,
+ 81, 12,175, 92, 76,162, 3, 40,168, 21,248,246,211, 83,159,108, 58, 35,197, 84, 11,139,106, 83, 39, 50,178,230,104,251,101,102,
+ 82,248, 79,139, 58,181, 8,206, 10, 77, 81, 63,242, 55,199, 35, 94,223,175,248,238,225, 9, 49, 87, 60,156,103,248,247,159,240,
+238,213, 61, 78,131, 67, 42, 69,119,234,202, 91,103,153, 58, 58,115,189, 67,222, 84, 67,109,116,200,162,157, 2,176,100,134,205,
+ 12, 80, 1, 33,163, 20, 25,181,183,157, 51,233,186,135,179, 18,235,172,252,185,118,161, 71, 85,196,151, 82,144,116,191,142, 93,
+124,234, 78,177,132, 77,246,195,106, 51,148,253, 57,118,147, 58,174,172,180,186,172, 2,210,109,202,217, 41,108,157,160,167, 93,
+121, 19,200,113, 19,203,237,130,179,176, 27,201,119, 75,155,124,159,198,110,103,115, 67,118,111,218, 29,213, 68,237,132,119,141,
+213,177, 21, 42,186, 87,183, 70,112,200,227, 1, 55,119,119, 72, 41, 34, 43, 36,104, 60, 28,196, 58,235, 36,170,184,205, 12,184,
+227, 91, 5,180, 85, 91,108,171, 2,132,134,233, 0,230,138,220,178, 17, 64, 59,210,234,245,255,218,121,236, 88,131,225, 9,226,
+115, 38,222,114,110, 90, 60, 97,221,107,225,152,119,138,131, 13,115,199,251, 11,164,123,232, 54, 70, 60,161,226,178,204,248,242,
+197,139, 78,152,234,222, 82,222, 46,161,152, 69, 40, 66, 42, 12, 75, 5, 24, 88,242,137, 27,228,196, 88,139, 82, 25,211, 48, 96,
+125,255,103, 12,206,202, 15,172,209,144,213, 72,224,192, 37, 17,130, 55,176, 69,166, 9, 48, 6,169,206, 32,174,178,119, 84,134,
+238,154,100,143, 85,170,140,116,171,102,138, 19,137,234,242,230,120,196,186,196,238,165, 38,218, 51,121,183,143,107, 19, 63,244,
+ 11,189,119,234,181,211,172,164,227,213, 61,110, 41, 87, 52,191,125,113,131,125, 48,203, 78,129,183,239,168,141,142,243, 12, 81,
+135,198, 92,129,131,246,239, 1,227,250,107, 93, 37, 13,113,127,168,122,116,123,221,208,199,109,226,149,149,169,222, 86, 18,172,
+ 59,231, 62, 73,232, 12,249,109,248,144,219, 24, 77, 69,125, 85,243,205,187,253, 70,213,159,133,247,251, 62,234, 15,215, 30, 95,
+188,231, 40, 64,215, 36,198, 26, 60,158, 47,184,153, 38,164,231,103,177,153,105,144, 2,145, 21, 74, 97,169,128,142,247, 26,164,
+194,104,177, 85, 88,108,147, 13, 57,155, 99,196,233,230, 37,214,117, 6,192,152,166,131,124, 94,115,194,186, 46, 56, 12, 35,230,
+121,134,117, 1,165,200,197,100,173, 65,101,215,249,216,211, 65, 66,106,130, 31, 48, 47,171, 10, 9, 9, 41, 39,196,148,101, 20,
+ 29,132, 95, 30,172,193,241, 48,226,195,167, 15,168,165,224,249,124, 70,112, 94, 20, 39,181,194, 56,175,225, 27,140,156, 86, 24,
+235,176,174, 11,194, 48, 72,220,168,147, 24, 81, 3, 35, 89,246, 37, 11,251, 33, 70, 85,225,158, 0,178, 56, 63, 61,138,205,205,
+ 89, 21, 88, 26,140,147, 68,194,198, 20,225,172,195, 52,201,133, 94,139,238,105, 75,145,221,108,173,152,166, 9,231,243, 5,131,
+ 23, 60,171, 49,178, 83, 46, 73,148,245, 41,103,156, 47, 11, 14,135, 17,113, 93,225,125,192, 52, 77,253, 61,245,206,137,149, 77,
+167,111, 41,101, 28, 14, 7, 21, 43,201,110,242,112, 16,160, 77, 74,130, 43,197, 26,145,171, 96,159, 75,206,162,206,215,239, 61,
+169,165,208,232, 57,113,156, 14,168, 37,227, 50, 11,236, 72, 58, 71,209, 0,120, 43,168,221,219,219, 83, 31,167,143,227,136,117,
+ 94,240,124,126, 22, 4,176,242,228, 27,231, 28,204,178, 67,134,136, 9, 83,202,112,206,202,248, 95,155, 12, 99, 12,144, 99,247,
+ 34, 47,185,200, 84,128, 24,247,199, 9,222,203,133, 94,185,226, 56, 14,253, 66, 21,244,174,134, 63, 17,245,100,190, 22,198,194,
+234,244, 41,170,244, 79,185, 96, 24, 60, 94,223,157,240,213,247, 15, 40,165,224,211,243, 51,166, 65,108,143, 71, 71,248,180,228,
+ 45,123, 98,151, 67,222, 30,226, 61,136,133,247, 34, 90,146, 14,121, 89, 22,228, 36,214,224,160,197, 77,247, 79,211,166, 23, 34,
+ 42,253,145,140, 57,107, 39, 93,176,166,132,162,197,122,179,234,109,201,147,188,195,183,210,182,218,101,160,160,162, 20,238, 69,
+ 0,235,249, 37,106,119,189,240,235, 46, 8,156,118, 13,210,110,180,190,183,176, 49,225,138,215, 65, 59,113,210,222, 77, 35, 17,
+175,212,125,242,188, 27,233,243,150,156, 46,180, 81, 99,251,204,116,143, 65,103, 85,177, 91,231,225, 92,232,247,212,243,211, 35,
+226, 50, 35,103,129, 92,249, 97, 20,223,191,247,125, 50, 90,138,208, 8,141,114, 40,202, 42, 25, 8,235, 60,119, 23,142,184,109,
+154, 45,110,148,103,179,110,218, 54, 98,200,120,191, 23, 94, 14,142, 89,187,161,158,200,166, 69, 77, 39,205, 93, 51,244,120, 23,
+177, 65,204,251,254, 17,180,191,234,118, 2,171, 61, 19,189, 42,152,190,143,160, 65,226, 31,118, 70, 95,112,211, 47,136, 65,199,
+ 90,164, 31,148,201, 12, 58, 58,149, 55,245,124, 62,227, 24,130, 84,105, 44, 74,119,231,164, 67,183, 58, 81, 88, 75, 70, 42, 12,
+148,162,232, 76,249,123,159,230, 5,206, 0, 41, 21, 68,197,143,178, 49, 96, 67, 56,167, 36, 65, 3, 85,146,153, 82,204,189,218,
+222,196,106,102,151,131,190,145,135,250, 8,188,141,221,219,174,189, 20, 24, 75, 48,140, 46,228,106, 29, 55,181, 93,205,190, 20,
+109,169, 67,212, 95,237,157,237,173, 93,222, 69,197,109,185,251,202, 27,126,144,120,131,224,112,197, 46,235,232, 42,125, 80, 67,
+142, 54,235,155,221,149,244,117,143, 11, 6,186, 88,174,219,213,246, 99,176,158, 66, 71,221, 27,223,119, 90,187, 66,144,118,224,
+143,150,140, 84,119,147,136, 86, 61,246, 24, 68,162,107, 74, 94, 31,159,201, 37,157, 98, 66,104, 1, 49, 90, 52,132,113,132,247,
+ 30,181,200,225, 22,188,195,154, 46,170, 55,168, 58,134,115, 48,181, 34,115,148,145,112, 18, 49,150,113, 22,119, 47,191,196,167,
+143,127, 86,113, 83, 65, 78, 5, 37,103,172,201, 97,116,226,111, 31,135, 1,214,184,109,101, 65, 44, 15, 33, 24,243,124, 17, 65,
+ 40, 87, 48,228,225,181,214,160, 84,194, 56, 4,124,122,122,196,171,215,175, 81, 65, 24,198,131, 84,233, 90,156,197,148, 0,235,
+ 97,213,161,144, 75, 86,118, 56,129, 96, 59, 28,197, 26, 11,174, 73,179, 10, 2,150, 44, 12,123,230, 36, 62, 85, 34, 28,142, 55,
+ 48,214,137,141,204, 27, 44,115,132,213, 34,161, 26, 66, 94, 86, 28,142, 7, 4,231,165, 64,210, 29,126, 86, 69,122,106, 25,226,
+ 0,158,159,159,251, 97, 89,149,169, 94,139,160, 62, 91,134,116, 24,188,188,247, 85,124,237,207,207,207,112, 26, 33,233,172,196,
+151,206,151,139,178,220, 45, 64,114,209, 87,237, 8,159,158, 46,186, 30,171,200, 49, 98, 26,100,124,185, 46,171,132,160, 24, 35,
+175,143,254,158, 48, 4, 60, 95,102,120,239, 49,175,177,167,241,173, 57,245, 17, 55, 17,193,122, 47,208, 23, 34, 4,239,113,115,
+ 58,194, 89,135,135,101, 70,173, 5,211, 56, 34,101,121,230,187,216, 85,133,191,203,178,118, 72,140, 37,234, 4, 62,163, 17,207,
+ 85,159,155,175, 63,126,218,152, 14,154, 65, 32, 26,155,218,241,176,165, 86,120,227,144,107,133,179, 26,160,212,120, 12, 92, 81,
+ 89,196,189,165, 20,128,208, 69,150,178,126,112,184, 59, 30,240,116, 94,240, 52, 11, 10,249,227,211, 25,119, 58,153, 10,196,152,
+115,217, 58,191, 90, 84,183,211, 84,222, 29, 20,173,121, 32, 77, 31, 5,165,202,137, 38, 41, 37, 66,114, 89,207,221, 45, 69,211,
+ 20,241,214,199, 40,147, 13, 99,128, 84,170,156,159, 89,173,106,157,114, 41,203, 72, 82,152,139,184,155, 54,137,107,115, 63, 20,
+ 29,101,231,230, 91,215,179, 70,214,116,181, 23, 7,251, 73, 67, 35, 93,210,174, 80,160,109,254,160, 5, 59,122,131,213,217, 37,
+ 45,237,172, 17,229,118,112,173, 22,119,138,207, 70,218,181,213, 61, 13, 65,222, 64, 48,237,207,144,133,179, 30,206, 75, 64, 15,
+ 84,216, 87,107,198,229,249,177, 79, 70,139,186, 5,106,221, 10,230,154, 37,174,217,251, 0,203,122, 46,237,109,204,204,200, 49,
+162,168, 38,195,122,175, 26, 8,101,200, 52,126, 71,203,104,215,207,164,177, 22,142,169,202,216,157, 72, 31, 90, 13,110,233, 41,
+ 54,155,178,187,121,192, 25, 27,180,190, 39,108, 84,116,147,126,219,197,179,142,241,183,238, 29,248, 56, 47,176,206, 3, 49,118,
+171, 65, 73,114,216, 52,164, 41, 67,188,163, 57, 23,120, 43, 93,222,168,123,117,171,213, 44, 17,225,230,230, 6,223,198,136,163,
+151,135,215,123,143,224, 36, 24,193, 66, 63,116,133,113,137,194,245,246, 57, 35,233,138,225, 50,175,112, 4, 92,114,221,246, 50,
+214, 98,102,137, 54,180, 0,150, 92, 17,166,208,223,108, 34,193,207,114, 81,145, 73,163, 14,211, 6,237,225,158,159, 46,213, 29,
+107, 28, 94,187, 60,183,212, 54,244,200,198, 22, 26,210,133,101,202, 1,239,150, 58,200,122,128, 43,127, 6,161, 65,247,202,243,
+206, 87,222,212,240, 45, 57,142,177, 49,163,205, 14, 27, 91,181, 99,181, 90,153,150,190,203,218, 4,127, 87, 86,178,157,207,126,
+123,152,208, 21,242, 78, 1, 62,180,201, 88, 58,142,145,186,214,226,218,251, 95,155, 85,142,119,196,190, 61,131,185,131, 29, 72,
+253,246,237,181,150, 34,240, 18,179,230, 17,203, 3,126,163, 59,212,154, 11,150,152, 58, 5,171,150, 2,107,209,179,160, 91,119,
+152,178, 92,216,204, 12,228, 44,159, 77, 48,230,203, 67,159,214,140,227,132,154, 34, 6, 69,191, 30,166,131,112,173,157, 76,120,
+ 14,199, 35,150,117,193,253,205, 17,203, 60, 43, 66, 18,168,121, 65, 76, 2,215,185, 44, 51,134, 48, 96, 94, 22, 4, 43,192,153,
+187,219, 91,217, 87,134,128, 17, 2,171,144,162, 85, 39, 88, 37,139, 64,135, 4,125,106,244,178,168,165,192, 26,214,231,195,163,
+114,193, 48,140,112,206, 98, 89,165,115,180,214,138, 35,192, 9,157, 45,167,164,162, 82,233, 28, 39, 47,123,242,117, 89, 84,212,
+ 89, 80,117, 79,223,232, 95,167,195, 1, 37,103, 60, 45, 11,188,181, 61,108,201, 89,177,226, 17,145,142, 95, 51,140, 49, 56, 78,
+ 83,143, 80,126,124,122, 64,240, 1, 57, 75, 81,235,221,208,195, 40,130,142,252,107, 21,161,230, 60,207,224, 16,144,114,134, 37,
+233,204,155,149,108, 93, 18,172,119,152,215, 21,150, 8,177, 48, 78,135, 17, 40,178,238,243,106,133, 52,109,162, 72, 4,103, 93,
+ 95, 77, 4, 47,194,194,113, 28,229,130,223, 9,156,140,115,240, 93,168,169,187,205, 48, 0, 4, 44,243,210, 69,113,146,221, 30,
+ 20,146,162,133,133, 62, 43,222, 7, 92, 46,179,100, 0,232, 36,239,197,113,234, 97, 40,109,108,157,139,140, 97,207,203, 42,185,
+243,206,116,253, 14, 17, 75,177,207,140,154,228, 53,130,106, 97, 26, 89,143, 0,140,193,227,197,205, 1,231, 53,138,243,231, 50,
+163,148,130,119, 47,110, 49, 57,194,243,146,251,227, 85,101,185,127,213,209, 98,183,115,190,130,140,233,234, 21,202, 34,104,248,
+234,102, 39,110, 66,180,108,118,176, 41, 34, 25,143,103, 25,143, 55,160, 73,229,109,148,221, 0, 88, 64,131,195,232, 62,191, 42,
+121, 84, 11,243,170, 17,206,202, 11, 83,125, 68,237,218, 4,236,186,102,218,163, 59, 62,223,145,239,119, 13,252,195, 17, 53,136,
+ 96, 84, 60, 47,185, 0, 91,232,215,166,115, 50, 59,245, 14,119,156,235, 62,112,202, 90, 3,231, 2,156,243,186, 3,215, 4,210,
+154, 97, 97, 49, 14, 1,147,142,205, 5,119,172, 34,224,146, 81, 85,225,110,131,239, 13, 97,206, 17, 37, 37, 9,169,105, 22, 96,
+239,182, 21, 36,179,134, 65, 65,201,153,186,195, 47,159, 97,253,117,133, 99,154,114,178, 95,198,237, 66,223,165,205, 64,187,169,
+206, 60,231,107, 62, 17, 51,247, 64,151,189,237, 11,187,228,210, 38,206, 90,117,140,102,246,254,196,166,176,175,117,215, 93,106,
+186, 77,231,174, 87, 21,100, 9, 35,188,214,138,101,153,241,241,188, 34, 43,103,120, 85, 54,187,245, 14,214, 59, 12, 67,192, 52,
+ 10, 2,115,244, 22,255,205,127,251,111,145, 75,237, 59,189, 38,254, 66,101, 88,146, 81,118, 44,162, 60,245,214,192, 56,131,117,
+137,240,154, 2, 86, 84,174,221,133, 25, 10,220,231,238,209,222, 87, 90,170,254, 54,248,140,170,191, 79, 77,218,128, 2,212, 84,
+246,106, 17,163,238, 57,221,216,228,216, 33, 19,175,208, 0,122,192, 96,231,237,174,154, 10,212, 69,126, 42, 22, 43,187,228,179,
+ 6,252, 73,250, 16, 65, 5,100,188, 11,229,217,218,251,186,161, 8,177,197,153,214, 30, 86,128,206,226,222,246, 87,188, 93,214,
+ 59,117, 27,245, 56, 79,245,175,235,235,105,212, 7,106,173, 48, 9,172,118,143,198, 88,117, 70, 8,189,173, 93, 28,133, 69, 63,
+193,144, 49,255,168,161, 38, 48, 6,107, 86, 80,139,234, 35, 24, 27,174,114, 15,206,108,213,175,248,211, 69, 25, 77,100,177,174,
+ 23, 17, 92,133, 65,138, 78,239, 80,136,112,115,119, 47,168,209, 42, 75, 0, 0, 32, 0, 73, 68, 65, 84, 17,175,100,241,240,240,
+136,203,124,193,249,124,134,177, 3,158, 46, 51,158, 47, 51, 46,107,132, 15, 99,159, 54,213, 90, 17,188,100,120, 51,137,242,155,
+ 0,140,211, 40,132, 58, 24,185, 76,245,247, 5,231, 36, 30,214, 88, 77, 22,179,253,243, 16,115,134,243,114,233, 57,231, 0, 46,
+125,108,156, 82,198,178, 44,136,107,196,101,158,177,172, 51,210,186,226,252,252, 44,209,141, 10,171, 25,199, 17,227, 24,224,188,
+197,116, 56, 0, 68, 56,158,110,112, 58,158,244, 89,103, 76,135, 35, 82, 46,162,108,183,130,171,141, 41,245,241,113,163,128,149,
+ 82,113,127,115,196,221,233,216,253,216,203,178,160, 86,198,178, 44,152,231, 89,125,215,194,208, 23, 42,151,224, 93,157, 37,172,
+113, 69,169,140,243, 60,235, 56,218, 96, 89, 87,164, 82,240,240,244, 4,231, 37,129, 77, 68,201,202,245, 39,241,140,203, 88,210,
+245,142,210, 40,140,102, 89, 23,140,227, 40, 35,127,178, 87,108,140,152, 68,208, 39,138,124, 73,149,203, 69,108,136,226,243,247,
+122,112, 10,124,134,213, 82,213,158,173,198,112, 72,169,160,178,236,236, 47, 41, 95,173,206, 14,218,153, 55,149,123, 43,198, 59,
+131,163, 79, 36,229, 89, 74, 81, 96, 63, 57,165,158,212, 23,147, 68,214,122,239,250,244, 36,120,135,195, 24,112, 24, 2, 80,229,
+123,185, 44, 43,158,230, 69,156, 61,205, 62,168, 2,176, 92,234, 6,133,218,173,219,218, 62,183,177, 85,122,206,132, 54,110,172,
+ 58,134, 37,102,172,185, 96,205,178,202, 88,163,172,143,214,152,177,164,164, 23,250,214, 48,108, 74,224,107,125,213,142,134,213,
+ 69,112,185, 72, 49,221,186,245,246,239, 83, 46,154,211,126,189,230,109,157, 52,204,118, 65,247,160,150,171,162,133,174,210, 49,
+ 9, 45, 21,205,244,166,225,115, 2, 27,239,156, 71,251,175,209,197,119,166,225, 89, 13, 92, 24, 16,194,164,137,143,220, 1,242,
+141, 99,111, 12,225,197,253,237, 46, 11, 93, 26,137, 97, 24,149,187,178,233,175, 4,198,147,192,165, 72,147,160, 69,189,181,130,
+231,109, 8,104,174, 69,166,217, 70,116, 38,198, 90,144,177, 59,204,108,211, 16, 72, 81,230,234, 46, 63,157,175, 8,182,219,184,
+147,119,153,196, 18, 82,176,203,193,172,251, 63,181,191,182,106,127,147,121,203,154, 7, 81, 85,187,205, 69,236,108,188, 17,154,
+218, 24,186,189, 89, 85, 5, 18,174,103,250,202, 62,178,249, 14,255,195,191,255,107,156,130, 71,174,140, 65,147,146,114, 76, 88,
+ 85,149, 25,188, 69, 45,132,224, 45,198, 48,226,253,119,223,194,112, 85,196,163,238, 94,137, 85,241,236,177,228,132,193,136,160,
+206, 25,131, 88, 24,181, 36, 56, 39,162, 33,222, 93,194,219, 90,250, 58, 57, 76, 62, 20, 22, 21,185, 95,198, 29,196,207,219,150,
+105,195,178,154, 94, 58,183,202,172,118,202, 28,182,204,244, 62,123,178,154, 30,196, 87, 1, 69,125, 76,213,139,164, 93,186,209,
+ 62,207,173,193, 12, 26, 97,206,108, 10, 89, 40,218,147,121,195, 34,182,138,246, 10, 35, 76,219,215, 51, 68,224, 31, 66,242, 59,
+ 48,168,125, 93,163,232, 80,179, 87,107,234, 11,230,157,217,148,173, 87,255,253,186,203,104,170,117,235, 28,156, 17,170,152,177,
+140,129, 12,242,154,100,164,135,166,191,200,136,172,228, 42,146, 67,162, 5,188,144,146,156, 74, 78, 61, 28, 70,148,178,178,199,
+108, 12,229, 82, 11, 62, 62, 62, 96,244, 1, 54,101, 4,239,240,252,244, 40, 15,153,113, 8,222, 97, 24,101, 47,156,210,138,224,
+ 3, 66,112, 72,149,240,225,195,123,132, 97,192,186, 68, 88, 67,154,203,109,176, 92,158, 96,157,199,121, 89, 80, 74,193, 50, 47,
+ 50,246,175,132,233,112,236, 79,223,116,112, 82,189,167,168,221,145,224, 87,125, 24, 97,173,168,139,165,163, 41, 32,178, 72, 36,
+ 98,191,224, 3, 10, 24, 53, 37,161,178,133,128, 3,110,228, 48, 89,132,183,238,125, 64,174, 85, 5, 91, 21, 7,213, 13, 16, 17,
+206,151, 51, 74,173,152, 23, 25,107,251, 33,136,133,205, 26,228, 12,217,155, 79, 3,200, 90, 81,177,135,160,225, 40, 14,133,185,
+ 71,149, 78,227,136,101, 93,225,212,167, 59,142, 3,214,117,237, 2, 62,103, 8, 41, 37, 45, 4,165, 32, 43,165,202, 69,204,226,
+ 97, 15,222,109, 78, 11, 54,136, 57,227,116,152, 64, 96, 60, 95, 86, 28, 15,163,118, 72,165,179, 33, 82,202, 8, 77,127, 99, 4,
+ 34,212,146,216,162, 90,214,230,121,150,130, 47,199,206, 97, 87, 63,144,242,238, 69, 77,239,188, 85,149,191, 83, 39, 6,119,238,
+ 68,102,198, 64,194, 87,184, 68,161,246,129, 8, 55,163,239,159, 83,210, 36,191, 22,183, 25,163, 92,242,205,183,222, 44, 91,214,
+ 24,164,164, 23, 36, 53, 36,182, 52, 53,107, 44, 59,252, 53, 35, 56,143,105, 24,240,188, 72,183, 94,152,241, 60, 71,140, 97, 64,
+176, 14, 75,138, 72, 41,202,103, 84,184,218, 59,191,214, 63, 19,218,166,194,232,186,235,130,197,181, 36, 35,243, 54, 93,108, 62,
+232,174, 57,171,212,243,221,175,108, 41,117, 63,213,219,190, 86,243,247,183,221,121,101, 6,171,138,190,173,245,234, 30, 56, 69,
+215, 26,247, 54,246,110, 28,118,179, 63,123,245,242,222, 38,160,212, 21,239, 77, 44,219,239,169,207,129, 98,109, 29,177,183,200,
+181,169,172, 32,235, 64,100, 97,201,194, 89,167,155, 13, 17, 57, 91,141,226, 45, 37,171,240, 87, 4,169, 47, 94,222,233,180, 75,
+167, 99, 68,114, 81,183, 8,228, 82,174,240,174,114,185, 11, 11,223,122,117, 1,104,161,101,149,236,215,214,180,155,192, 41,119,
+225,220,102, 33,150,149,172,107,153,180, 59,202,137,250, 4,183, 23,128,118,185,177,210,241, 53,216,252,134, 24,229, 29,167,188,
+ 15,236,123, 91,191,137, 54,152, 25,239,222,190,194,135, 15, 31, 59, 55, 26, 68, 40, 41,194,248,161,219,148,156, 33, 61, 56, 10,
+170,145, 10,221, 26, 69,129, 26, 17, 37, 29,157,193,201,123, 81,190, 90,131, 88,212, 91, 57,175, 32,107,145, 87,131, 88, 43, 28,
+128,156, 86,233,208, 65,120,243,163,191,192,167,239,255,172, 9, 87, 27,164,229,224, 29,150, 82,251, 62, 69,196, 60, 19, 46,231,
+229,202,198,209,186,217, 14, 57,145, 0,110,177,112, 25,131, 82,114, 87, 92,122,231,187,117,161,191, 62,170, 11,216, 91,199,106,
+ 23,215,215, 43, 79,118,247,168,183,206,183,150, 93,162, 9,126,144,203,219, 29, 9, 93, 56, 39,104,196,210, 18,221,104,103, 33,
+107, 73, 68,180,131, 8,241, 54,202,170,123,111,251,238, 33,107,126,245, 22, 72, 67,251,241, 85, 35,237, 25,211,227, 3, 91,161,
+182, 61, 48,180, 19,238, 24,181, 12,225,106,239,222,186, 37, 1,128, 56,188,124,113,143, 31,253,232, 75,188,125,243, 74, 30, 46,
+ 48,254,240,251, 63,226,195,183, 95, 99,185, 60,137,114,122, 12,202,120,151,247,194,238,114,236, 91, 17, 82, 42,195, 40, 35,188,
+106,161,216,236, 51, 68, 21,198, 6,188,255,243,239, 55,138,158,245, 8,227,132,117,185, 96, 48, 2, 69, 73, 41,129,144, 49,140,
+199,158, 78,152,185,130,203, 5, 75, 20,207, 58, 57,217, 47, 91,239,145,107, 85,101,176,216,204, 82, 41, 88,150, 5,239,223,191,
+215, 20, 55,181,172, 1, 66, 66, 3,131,184, 34,171, 53,142,245,160, 44, 76, 8,196,178,211,180, 50, 1, 40, 44, 17,195,153,133,
+105,239, 64, 88,215, 85,212,219,168, 40,105, 21, 97, 89, 92, 53,235,222,203,190,148, 89,149,225, 65, 10,103, 67, 72, 49,137,181,
+203, 58, 4,157, 78,249, 65, 34,143, 47,203,170,147, 3,171, 93,177, 69, 86,241,216,101, 94, 49, 29,100, 93, 22,188, 3, 87,163,
+252, 0,137, 39,205, 37, 99, 89, 91, 65, 87,101, 76,105, 61,214,117,149,181, 88, 24,145,138,216,220,114,206,168, 92, 69,113,174,
+ 41,125,139,230, 6, 92,249,185, 21, 49,235,157, 36, 55, 30,166,161,103,130,159, 78, 55, 2, 46, 34, 96, 26, 7, 44,243, 69,173,
+177, 14,214, 90,204,243,140,152, 50,140,147,169, 66, 67, 30, 7,239, 84,168, 39, 32,162, 90,170,162,115,185,175,139, 60, 20, 48,
+ 99, 61,136, 11,190,127, 94,148,115,175,238,157,224, 59, 27,193,247,137,147,233,103, 97, 97, 70,208, 68, 67, 18,254, 54, 18, 23,
+ 56, 69,135, 54, 63,118,243,198, 39, 85,219, 55,209,173,115, 14,131,247, 24,131,195,188, 38, 88,235, 81, 97,113, 89, 11,114, 94,
+197,215,220,196,171,220,166, 7,116, 21, 7,221,206,178,189, 34, 74,242,187, 55,235, 45,209, 54,248,102, 70,207,123,104,169, 89,
+155, 3,103, 7, 14,175,123,105,189, 6, 95,237,245,213,216, 83, 34,165, 27,145, 98, 73,166, 10, 27,118,123, 95, 39,232, 57,213,
+162, 75,185,145,212,112,165,102,167, 70,187,220,159, 53,251,125, 3,181, 2, 96, 31,235,141,190, 90,148, 70,178,246, 44,122,128,
+ 64,214,193,153, 0,134,236,211,155, 85,213,234,196, 16,204,200, 53,117,212,249,198,245,183,253,245,225,182,123,236, 35,242,186,
+101,121,144, 8,115, 99,140, 40, 89,242, 32,132,224,103,181,169,170, 61,168,138, 52,147, 35,231,188,173, 11,245,127, 37,215, 78,
+154,147, 64,151,150,168,214,106, 54, 49,162,139,200,129,175,247,228, 91, 54,215,118,216,243,126,124,222,189,234,181,163, 83,107,
+179, 78, 48,174,216,186, 50, 98,176, 58, 98, 86, 63,174,222, 85,165, 20, 88,114, 40, 57,129,130,236,204,138, 10, 43, 64,128,169,
+ 5, 48, 18,147, 26, 6, 47, 5, 0,196,159,103,117, 44,156, 43,203, 8, 73, 3, 15,156, 53,248,243, 31,126, 15, 59, 12,152, 31,
+222,139, 10, 86,115,194,141,105,130, 8, 35,251,114, 38, 60,171, 2,247,221,187,119,248,201,143,222,225,175,255,246,183,200, 89,
+170, 96,217,157, 81,223, 61, 55, 44,172,112,223, 69,172, 87,213,150,150,203,117,198,186,213,195,184,234, 56,133,119,121,242,189,
+ 64,218,147,227,118, 15, 65,119, 20,104, 39,223, 50,123, 27,205,172,173, 48,228,165, 54, 50, 14,106, 10,219,206, 38,222,222, 15,
+194,246,207,253,129,194,142, 79,111,204, 38,102,100, 6, 25, 25,163,218, 6,131, 97,116,128,132,161, 29,225, 9,162,194,108, 69,
+207, 62, 54,144,204,166,212,236, 19, 12,221,131, 26,221,219,190,124,241, 2, 95,126,241, 14, 47, 95,220,246,175,179,175,217,115,
+ 22,209,225,225,120,196,183, 69,163, 60,117,130,100, 33,101,124,169, 5,177,100, 21, 98,161,239,249, 13, 17, 92, 24, 96, 72,194,
+ 72,184,137, 36,107, 5,233,120,250,246,254, 45,158,159,190, 23,194,157, 41,240,167,123,152,241,136,229,249, 1,143,143, 15,184,
+189,185,209, 49, 32, 16, 83, 22, 87,128, 17,130,157,119,164,121,224, 50, 53, 25,188,131, 45,140,241,197, 11,196,148,241,252,244,
+ 0,148,132,148, 50,158,158,159,133,162,198, 6, 31,222,127,144,139, 84,159,247, 24, 87,181,224,105, 40, 6,244,242, 46,181,195,
+ 61,184, 50,134, 48,160, 84,233, 80,101,244,188, 74, 48, 74,149, 17,170,183, 14,185, 68, 12,170,218,119, 78, 98, 29,159,207, 23,
+156,142, 39, 41, 30, 52,174,181, 20,161,152, 73, 40,139,236,165, 47, 10, 61,105,221,179, 49, 6, 33, 4,148,148,112, 58,157,144,
+162, 8, 13, 83, 76,240, 26, 91,204,234, 40,184, 61,221,244,113, 97, 24, 6, 17, 12, 41,215,251,195,249, 1,183,167, 19,150,101,
+ 65,169,162, 40, 95, 83,130, 85, 64, 80,173, 21, 33,120,156,207,103, 77,239, 51,168, 68,155, 98,152, 12, 78,199, 35, 62, 61, 60,
+200,196, 33,139, 10, 59,232,110,222,107,116,232,249,114,198,241,112, 16, 24,138, 33, 92,150, 69, 4,117, 94, 38, 11,173,120,246,
+206,105, 17,197, 87,137,131,163,179, 40, 89,214,104, 82,228, 25, 84,178,240, 37,129,156,195, 57, 21,213, 59, 24,140,222,118, 28,
+114, 91, 27,201,136,182,246,162,222,146,193,162,186,132, 13,248,100,117,196, 47, 26,129,148, 50,140, 78, 99,154,248,115, 67, 82,
+179,102, 96, 12, 40,176, 48,214,129,107,197,195,243, 19, 12,218,186,110, 67, 87,151, 22,206,212,129, 44, 77, 16, 86,122, 18, 39,
+183,213, 42, 53, 42, 36, 93,133,115, 48,237,130, 96, 42, 64, 70,197,178,188, 15, 89,234,243,191,174,181,225,221,247, 76, 42,187,
+111,118, 45,230, 10, 46,232,154, 28, 13, 93,211, 8, 11,234, 63, 3,117,141, 18,131,216,116,214,122,239,178,251,153,131,206,218,
+239,251,245, 54,102,103,192,192,160,170,198,107, 47,210,238, 46, 46,162,158,226,102,173,133,117, 3,170, 9,200, 41, 41,231, 94,
+108,166,212, 99, 78,203,149,208,153, 84,239,181,229,208, 19, 0, 17,174, 89,181,216, 66,243, 16, 88,249, 38,181,233, 92, 0, 56,
+231,175, 92, 10,198, 24,212,220,154, 14, 93,117,229,172, 57,242,122, 87,235,200, 95, 28,108,220, 39, 12,142,105, 55, 45,215, 55,
+ 68, 46, 98,189,152,155, 96,106,119, 49, 75, 33, 88, 91, 67,216, 61,159,251, 55,145, 53, 57,172,171,150,121, 7, 88,169,140,151,
+ 47,239, 36,202, 82,193,255, 45,139, 58,169, 80, 75,186,106,133,136, 4,177,248, 24,211,136,115,162,212, 31,130,140, 38, 92,139,
+222, 84, 15,187, 81, 97,198,188, 38, 84, 67,240,204,184,121,251, 37,254,251,255,241,223,225,127,254,159,254, 7, 44,113, 69,204,
+ 69, 47,103,217,167, 23, 8, 86,243,156, 50,230, 84,177, 86,198, 77,112,120,120,120,194,143,223,189,197, 95,254,171,127,129,243,
+121,198,239,255,240,149, 88,147,226,170,100, 47,234,123, 48,230, 54, 78,225,141, 59,204,123,213, 60,245,157,110, 35,244,245, 96,
+211,157,205, 67, 46,207,114,157,198,208, 84, 36, 61,187,119,179,127,201, 4, 99,251,144,237,247,246,172,254,107, 83,141,164,107,
+237,162, 94, 43,201,120,127, 75, 18, 16,203, 83, 45,187,209,153, 94,244,141,146,100, 28,233,238, 19,255,236,200,220,104, 34, 17,
+ 51,195, 91,191,219,249, 24,205, 33,150,221,184,181, 22,199,195, 1,111,222,188,194,219, 55,175,113, 60, 76,157, 55,223,187,121,
+230,174, 18,109,235, 13,238,251, 59,131,249, 50, 75, 32, 14, 1,131,238, 67,107, 43, 64, 44,193,177,133,163,128,121, 94,174,242,
+236,157, 27,117, 39,255,116,229,125,183, 74, 38,116,110,216, 86, 13,110,192,253,235, 47,165,240,121, 83,112,186,125,209,199,228,
+ 95,255,238, 55,120,250,254,107, 84,102, 12,131,151, 46,154, 9,117, 93, 49,140, 22,140,140,186, 2,167,105,194,243,249,130,164,
+ 40,219,112,115, 47,211, 28,150, 93, 26, 52, 17, 75,210,159, 74,207, 40,224, 74, 18, 99,170, 15,136,128,104,156,236,179,189,239,
+232,132, 85, 47,137,117, 89,186,213,138,187, 11, 67, 44, 99,226, 37,206,114,105, 70, 25,255, 61, 95,206, 56,140, 35,130, 49,136,
+203,170,227,112, 93,143, 45, 51,136, 12, 46,139, 88,196, 10, 42, 50, 11,243,189,234,222, 51,158, 47, 32, 50, 56, 76, 18, 43, 90,
+149,239,237,188,199,203,219,131,124,158, 84,200, 86, 83,198,195,227, 39,193,154, 50,227,230, 40,216,213,166, 80,103, 34, 12,222,
+227,249, 50,139,189,110, 28,112,190, 92, 58,190,118, 93,163, 70,209,202, 97, 54, 28, 68,116, 40, 62,112,121,205,188,247, 40,149,
+113,152, 6, 88, 99,145,115,196, 56, 4,204,203,162,144,156, 91,153, 98, 88,135, 33, 4, 92, 86,225,232,111,124,127,113, 31, 8,
+190,212,194,248, 13, 74,210,158,177,148, 10, 74,140, 56, 29, 15,248,246,225,121,163, 15, 18,245, 93, 58,169,103,186,109,228,138,
+ 58, 4,192, 34,204, 28, 66,216,209, 21, 53, 78, 89,197,181,185,197,254,106,251, 84,114,222,214,146, 90,108, 59,107, 49, 13, 19,
+ 42, 37, 92,214, 5, 37, 39, 29,227,183, 24,211,221, 37, 91, 25,108, 42,152, 77, 79, 23,219, 86, 95,116,149,245,193,140, 31,128,
+ 93,118,155,230, 77, 69, 85, 91, 60,232, 15,129, 80,125,242, 71,215,251,186,214,252,148,186,105,107,184,110, 99,127,230,186,137,
+165,193, 87, 2, 56,110,106,100, 93, 71,126,102,200,234, 59,229, 70,245,108,143,116,211, 25, 52,125,151,169, 4, 54,187, 81,190,
+106,229,141, 66,201,100,181, 23, 96,173, 7,181, 92,132, 20,251,153,109, 52,183, 34,165, 45,247,188,239,205, 53,155,228,237,219,
+ 87,106,201,147,115,213,123,177,157, 74,247,173,133,135, 78, 74,100, 52, 47,110,157,180,174,200, 73, 38, 17, 89, 11, 80,214,206,
+188,209, 66,155,221,180,253,204,205,198,205,138,236, 54,206,194, 90, 15,215, 83,214,250,126,124,163,151,237, 19,216, 54,136,192,
+142,251,222, 68, 83, 59, 63,228, 86, 85,214,171, 81, 75,163,163,181,247,225,238,246,132,239,190,115,176, 73,131, 78,200,224, 16,
+ 28, 30,230,117,195,254,105, 6,182, 16,172, 34,166,105,232,239,230, 50,207, 61,250,112,240, 22, 73, 33, 38, 86,147,133,108, 97,
+100, 24, 76, 7, 77,215,226,132,255,237,127,249,119,176,117, 69, 24, 2,170,149, 23, 36,232, 12, 38,169,125,194, 21, 11,103, 1,
+231, 54, 90, 91, 67,205,157, 78, 7,252,235,191,252, 37,254,246,239,254, 99,143, 75, 44,185,200,110, 89, 15, 82,176, 92,244, 69,
+ 59,241,189,240,162,116,225,155, 30,188,117, 27,171, 93, 13,195,184,234,212,105,191, 7,170, 29,229,204,125, 4,182, 29, 6,189,
+179,111, 81,185, 10,161,233,128, 24,162,110, 49,105, 62,204,166, 4,134, 33, 88,178,221, 81,103,189, 3, 52,123,122, 79, 42,106,
+202,207,170, 93,189,177, 91,183,221,133,131,170,184,111, 78,133,134,158,188,189,185,197,187,183,175,241,250,213, 11, 33,189,253,
+ 96, 34,161,180,183,182,207,251, 76,199,209,241,195,251, 24,217,202, 56, 78, 35,158,227,172, 64, 17, 73,173, 74, 73, 46,204,154,
+101,119,203, 36,113,159,214, 56, 56,235,113,123,247, 26,195, 48,224,211,199,111,122,246, 59, 85, 29, 23, 15, 71, 28, 78,183, 56,
+ 28,239,113, 89,223, 35,120,139,247, 95,253, 35,254,171,127,243,223,225,235,175,191,194, 79,255,226,167,248,244,233, 35, 46,243,
+130,219, 55, 63,194,225,238, 37,190,254,237,255,139,180, 68,184,233,128,146, 11, 74,205,112,206, 73,152,137, 78, 59, 78,135, 9,
+139, 53,168, 85,113,163, 97, 64, 90, 23,144, 49,152,231, 25,198, 72,182, 65, 8, 78, 70,194, 36, 19, 9,231,253,110,252, 41,123,
+ 59, 99, 29,114, 76, 72,165,192, 89,143, 16, 28,226,178,224, 48,138,181,230,124, 57, 35,231,130,113, 58, 96, 89, 86,153, 34, 40,
+ 16,197,121,135,154, 88,210,214,114,217, 38, 38, 4, 80, 41, 82, 88,171,143,122, 89,150,222, 77, 95,230, 21, 47,238,110, 4,210,
+162,239, 79, 19,101,229,156, 65, 58,150,183,214,192, 91,163,159, 31, 33,212,157, 78, 55, 96, 84, 56,231,113, 58,158, 68,212,186,
+174, 72, 73,118,193,237, 82,205,204, 18,209, 90, 25,159, 30,159,251,115,212,192, 76, 50,173,112,136,169,116, 78,186, 8,223, 6,
+ 73,180,180,174, 59, 74, 82, 92,123,225, 89, 82,194,233, 78, 46,116, 98,225,234, 59,231, 17, 74, 5, 7,177,204, 85,150,201, 0,
+152, 49, 14, 65,224, 74, 36,212, 74,231, 76,191,244, 83, 46, 56, 29, 38,148, 82,240,188,234,212,142, 8,135,224, 58, 97,205, 59,
+135,224,156, 52, 32, 69, 38,155,206, 24,172,186,174,168, 44, 94,123,168,118,167, 48,195, 27, 66, 98,198, 96,157,170,208,185,239,
+230,179, 70,141, 26,165,154, 57, 23,224, 57,195,196, 21,156,147,166,252,201,196, 10,134,213,166,101,186,125,179,157,229, 29,172,
+194,155,103, 93, 18,183,174, 85,188,187, 32,202,171,156,200, 54, 88,223,208,214,216, 5, 78,109,244,181,157, 18,119, 43, 4,104,
+ 99,209, 87,205, 21,105,130,108,222, 11,104,181,203,102,222,156,226, 13,244,213, 21,239,172,176,176, 29, 37,110,155, 66,238,213,
+238,232, 0, 25, 34,177, 56,183, 92,143,118,199, 72,200,148,217, 44, 97, 32,212, 28, 5,101,205, 86, 39,178, 86, 45,182,251,245,
+ 4, 93, 9,127,133,133, 79,120,253,234, 69,119, 16, 65,221, 33,205,162,104,173, 83, 32, 27,250,106,205,251,160, 71,126, 27, 39,
+ 10, 58,182, 79, 33, 32,133, 68,209,224, 33, 77,126,233,107,206,230,152,146,162,196,169, 79,253,179,176,144, 10,254, 44, 78,245,
+179,212,176,157, 32,174,225,253,122, 55,138, 93, 32,201,158, 27,222,126, 79,147,226,233,152,196,104,240, 66,173,242, 3,204,235,
+170, 80,146,140, 90,133,158, 85, 13,193, 14, 1,227, 56,136,234, 54,136, 95,111, 89, 46, 24,181,248, 40, 44,184,209,166,154,150,
+182,191,194,122, 3, 11, 0, 14,248,249,191,254, 47,241,211, 95,254,167,248, 63,254,247,255, 21,156, 43, 12, 85,120, 29,145, 26,
+222,160, 41,201,106, 69, 73, 6,145, 1,231,109,135,234, 19, 73,102,249,175,254,229,207,240,233,225, 9, 95,125,253, 13,138, 17,
+ 69,168, 49,180, 11, 27,208, 52,186,202,221, 10,199,186,227, 99,152,171,224,156,246, 0,180, 55,167, 85,205,212,201, 69,102,211,
+ 41,208,206,111,174,106, 76,236,212,243, 76, 91,119,208,157, 7, 44, 66,143,150,104,213,161, 11,125,109, 64,240,222,169,202, 86,
+ 59, 22,133, 42, 88,221,241,144,142,248,140, 78, 68,108,251,192,153, 13,186, 35,255, 77, 82,244,110,111,110,241,229,187,183,120,
+249,242, 94, 66, 66,218,231, 66, 15, 92, 65,111,238,136,124,188,137,107,184,131,125,168, 11,246,174, 48, 16, 58,210,143, 41, 9,
+ 98, 17, 98, 97,236, 57,244,181,192,178, 76,121, 44, 24,235,154,180,130,111, 33, 57, 22,247, 47,191,192,253,139,123,252,246,239,
+254,159, 62,150, 7,100,151, 23,198, 35, 74, 74,184, 60,125, 64, 74, 17,203, 26,241,227, 55, 63,193,223,255,253,111,240,252,240,
+ 17,191,251,135, 95, 99,125,254,132,159,254,242,191,192,235,119, 63, 70, 14, 35,134,241,128,188,158, 17,215, 21,195, 48, 98, 26,
+ 92,103,107, 91, 99, 16,215, 40,157,131, 53, 96, 22, 0, 75,205, 98, 33,243,134,224,131, 7,193,104, 23, 32,135,142,116,103, 91,
+224, 71,201,172,204,114, 39, 81,175,227,132,192, 21,231,243, 12,176, 40,105,171, 53,240,214, 10, 35,125,149,244,184, 53, 51, 30,
+ 47, 51,156,147, 61,185,100,183,139, 64,109, 28,164, 72, 62,159,207,176,198, 72, 0,139,181, 88, 82,132, 97,201, 91, 88,150, 69,
+186,245,195, 40,175,175,181, 40, 49, 34, 21, 70, 65, 22,239,118,112,152,151,136,224,101,133,146, 74,134, 41, 18,235, 90, 42,227,
+ 89,161, 64,169, 77, 20, 98, 66, 92, 87,233,124, 74, 65, 85, 29,141,113, 30, 65,227, 71, 31,233, 65,195, 85, 2,214,152, 48, 56,
+139,113, 24,100, 68,175,227,234,105,146, 64,153,210, 96, 87, 85,178,228,215,117,133,119, 2, 30, 90,150, 5,211, 52,105,135, 40,
+222,246,102,159, 10, 65, 82,239,194, 16, 48, 12, 3,190,251,254, 59,140, 67, 80, 11, 30,117,132,103,214,184, 99, 73, 23,147,149,
+225, 31, 62, 60,246,226,134, 12, 97, 10, 78,200,148,160, 30,208,210,206, 76,107,141, 88,230,122,199,189,173, 46,101, 21,224, 53,
+ 67,222,116, 14, 68,211,202,212,134,170, 53, 70, 12, 98, 36,182,202,146, 19, 12,196,122,150, 10,235,103, 69,236, 97,198,146,146,
+241,168,251,191,171,130,163,182,149, 33,245,209,126, 35, 94, 54,113,108,195,110, 16,109,180,179,158, 39,222, 46,227,186,209, 30,
+ 55,216, 11,119,190,197, 94, 16,187,233,131, 20,146,133, 77,188,214,126,206,193,251,157,170,125,199, 85,223,127, 79,216, 11,232,
+126,120,121, 91, 67, 59,210, 28,117,177, 48,104, 83,184,147,130,214, 88, 17,178,109,135,223, 38, 39,165,230,173,136,128,219,206,
+ 57,150,166,135,106,197,158,214, 77,186, 82,148, 9,154,147, 92, 18,117,210,228,148,177, 92, 46,178,118,117,174,115, 32,226, 26,
+117,170,102,116,221,156,123,116, 45, 65,180,100,109,172,111,119, 83, 13,168,222,132, 88, 33,100,157,138,105, 65,186,190, 36,244,
+ 64, 23,110,129,170, 93, 69,189, 9,184,218,142,125, 23, 52,182,251,160,244, 34, 79,247,127,220,179,134,209,171,146, 94,103,243,
+ 94,144,197,120,113,127,139,168,225, 21, 68,178, 3,183, 86,242,142,247,137, 58,141, 26, 5, 54,136,235, 42,163,145, 53, 98,178,
+ 70, 19,192,132, 65,110, 27,156,223, 26,148,202, 24, 12,228,129,116, 22,255,244, 55,255, 55,126,251,215,255,151,252,217, 93,117,
+ 8, 2, 44, 8,163, 21, 88, 73, 2, 96, 43, 99, 41,242,193, 60,157, 78,253,195, 85, 89, 3, 96, 64,184,191, 59,225,213,139, 95,
+225,111,126,253, 15,112, 46,203,174,189,170,237, 13, 93,109,214,161, 3, 18,107,106, 59,180,165, 63, 42, 21,125,148, 83,247,150,
+151, 6, 80,216, 35, 97,121,167, 98,223, 17,231,104,127,139,239, 22,248,100,118, 99,113, 99, 97, 76,221,168,113,134,118,170,114,
+129,240, 48,116,140, 99,108,255,154,125, 55,213,119,243,212,197, 28,206, 75,231,213, 59,240, 16, 58,172,162,237,134, 74, 41, 61,
+231, 24,181,106,204,225,118, 85,203, 68,129,175, 14,178,150,198, 46, 15,223,102,116,103, 29, 57,145, 53,248,244,241, 9, 57,174,
+ 24, 28,225, 67,202,240, 54,192,176,160, 49,141, 53,120,190,136, 64,140,172, 1,167, 34,227,108,245, 38, 15,131, 71, 8, 65,139,
+ 10,113, 77, 72,225, 75,178, 71,190, 60,168,221,173,194,250, 1,247, 47,223, 98, 58, 28,241,205, 87,255,132,248,248, 61,156,117,
+120,122,255, 39,252,248,103,255, 18, 92, 43, 92, 24, 48,159, 31, 64,198,131, 74,133, 15, 6, 41, 85, 68,151,225,201,246,196,182,
+167, 57, 98,176,132, 88, 42,152, 53, 41,174,180, 48, 31,131,105,244,106,233, 1,106,138, 42,212,146, 81,109, 8, 3,188,218,174,
+104,145,139,166,251,213, 83,193,241,112, 80, 62,123, 2, 21, 65,119, 6, 0,135,227, 17, 94, 47,249, 24,147,164,167,169,109, 11,
+100, 36,148, 70,153,237, 34, 6,202, 93, 80, 86, 74, 65, 90, 22,220, 28, 15,112, 78,144,184,134, 68, 97,111, 76,197,241,112,144,
+209,111,201, 93,161,203, 61, 32,198, 98, 94,146,144, 4,189,112,230, 7,117,144, 16,100, 44, 89, 25,125,191, 60,142, 19, 64,192,
+ 48,140,210,181,151,130,113,144,247, 40, 56,177,240,192, 24, 12, 62, 96, 94,102, 76,211, 1,207,231, 51, 82,150,226,196,238, 14,
+181,195, 52,244, 98, 40,132, 32, 2,186,148,224, 26,195,192,112,135, 54,141,195,160, 46,132, 11, 44, 9, 77,141,185,246,148, 70,
+ 73,179,147, 98,108, 89, 35,198,193,227, 28,101,253, 80,245,178,189,155, 66,135, 46,181, 73, 33,243,182,254,232,217,221,106,225,
+108,163,104,215,114,202,119, 5,125, 99,171,183,176,155, 90,165,105,177, 26, 95,155, 75, 70,140, 75,183,143,122, 99,144,201, 32,
+117, 71,141,122,197,185, 57,107,164, 17, 97,146,247,215,135, 32,113,211, 57, 43, 11, 67,175,245,122,189,199,110,231, 9, 95,141,
+223, 27,171,132,123, 65,112, 61,174, 55, 59, 29,125, 99,177,213,173,123,223,125,181, 14,150,214,202,222,170,198, 0, 36,234,240,
+206, 52,191,162,200,209,149,203,232,138,219,222, 38,162, 93,175, 67,186,155,111, 32,145,189, 88,144,174,208,177,109,202, 8, 50,
+234, 30, 18, 13, 66, 67,134,183, 53,131, 49,232, 2,202, 46,234, 85, 65,176, 49,132,187,187,155, 46,254,149,203, 91,118,241, 33,
+ 12, 34,170, 75,226,146,136,203, 34, 8, 94,235,182,112,180, 90, 97,189,133,117,109, 77, 34, 29, 58, 87,222,156, 12,204,187,149,
+136, 72,251, 37, 53,210, 43,204, 73, 11, 79,238,135,106, 75, 94,231, 93,164, 42,111,126,102,222, 8,246,181, 37, 11,181,220,245,
+ 10, 84, 18, 25,126, 27, 19,247,241, 61,239, 59,123,116,186, 16, 19,225,229,139, 27,124,248,240, 81, 14, 34,221, 77,149, 34, 32,
+139,105,156, 68,112, 68,132,160,106, 82, 99,100,132,108,141,145, 93,228, 52,192,235,139,192, 32,100, 38,112,169,176, 90,137, 22,
+102,112, 97,248, 32,111, 88, 45, 81, 31,102,116, 42,149, 49, 50,150, 33, 34,233, 22,200,128, 81, 17,107,129, 13, 22,222,187,237,
+ 50, 85,118,115,243, 96,150, 90,241,171, 95,252, 12,159, 30,159,240,205, 55,127,198, 26, 99, 7,191,108,226, 55,131, 90,212,187,
+249, 25,212,128,181,163,111, 89,194,178, 71,173,159,173, 59,180,154, 68,189, 26,147,181, 70,189, 22,238, 74,246, 38,252,232, 54,
+ 15, 77, 13, 18,159,166,235, 12,246, 43,196, 98,219, 85,169, 10,125,179, 90,152,110, 29, 52, 70, 70,232,227, 56,226,213,203, 23,
+120,247,230,149,134, 99, 96,215,121, 80, 23, 84,217,141, 89,209,119,117, 76, 66,211, 99,162, 45,187,158, 55, 75, 73,243,145,247,
+125, 32,147,190,102, 87,146,254, 62, 65,202, 57,129,184,226, 48, 14,184, 61, 29, 65, 69,168, 86,177, 36,137,220,101,198, 82, 74,
+ 15,158, 65,173,176, 78, 42,234, 63,253,225,119,112,254, 0, 50, 14, 40, 9,213,168, 71,128,129, 24,103,164,143,223, 42,150,209,
+ 33, 12, 19, 82, 74,136,159, 62, 96, 61, 63, 32,151,130, 97, 58,192, 56,143,245,114, 65, 74, 43,214,229, 2, 99, 28,142, 83,192,
+156, 34,150,165,136,186, 59, 37, 20, 54, 90, 68,120,156, 12,227, 60, 47,112,198, 98, 94, 35,192, 5, 38,200, 88, 22,100,212,179,
+154,101, 74, 98, 12,160, 24, 92,231,188, 22, 28, 50,138, 46, 32,245,186,171,240, 70, 15,216,154,146,142,195, 11, 96, 12,150, 40,
+168,201,117, 93,113,185, 72,215, 75, 12, 60, 93, 22, 56,103,113, 51,141, 10,136, 73,240, 62, 96, 89, 37,106,181,137, 60,107, 45,
+ 56, 4, 15,104,135,233,140,133,113, 22, 41, 85, 56, 39, 43, 13, 99, 45,156,210,207, 42, 51, 98, 41, 56,141, 83,215,153,172,107,
+196,141, 22, 28,177, 84, 44,243,130,219,211, 13, 74, 45, 34,234,155, 38,245, 62, 39, 28, 14, 7, 20,174,136, 41,169,151, 92, 14,
+ 69,175, 93, 78, 8, 65, 20,251,214, 97, 93, 22,140, 97, 0, 81,194, 16, 6,249,124, 25,210,248,212, 11,130,115,130,225, 13, 1,
+151,203, 69,179,237, 1, 88,211, 93, 53,195, 48,224,227,135,143,176,214,104, 0,206,134,228,100,180, 0, 15, 57, 88,115, 46,152,
+ 6,185,188,191,127,120,236,209,201,110, 87, 28,123,239,228,125, 83, 27, 85,202, 25, 99,240, 87,233,135,185, 84,140, 97, 75,153,
+148, 80,165, 2, 3,131,168,159,215,102,109, 75, 89,172,122,107,170,178, 78,204, 25,231,101,193, 96, 13,230,168,123, 94,107,224,
+157,116,133,237,226,106, 46, 23,153, 62, 25,144,145,134,136,245,156,113,206,195,218,164,241,195, 27,249,141,182,124, 86, 73,220,
+220,117,210, 29,232,210, 57,172,124,229,142, 2, 95,239,225,251,121,223,129,155,123,207,185, 62,223, 58,191,119,164, 23,153,254,
+221,198,218,126, 62,246, 11,123, 3,164,232,217,198,215,110, 26,124,206, 65,111, 93,186,217, 69,177,210,174, 43, 87,141,150, 49,
+ 87,209,172,220,154, 85,227,118,171,136,205, 19,111,140,237, 9,120, 29, 46,100,165, 72,254,242,139, 55,176,222,131,139,144, 46,
+ 99, 92, 55,208, 77, 45,224, 90,144, 98, 18, 23, 76, 8, 50,142,111,122, 44, 0,206, 7, 56,221,231,151,162, 16, 56,109,150, 91,
+ 96,209,150, 66,167, 90, 41,107,251,235, 85,213, 57,225, 58,176,132,182, 42,160, 54,224, 73,207,220,174, 29, 42,211,198, 33, 85,
+ 61,139,181,126,102,121,235, 82,251,141, 32, 38, 23,127,147,126, 16, 80,169, 99, 69,173, 19,163,125, 45,219, 94,196, 90,131,148,
+ 86, 76,225,136,211,233,136,211,225, 0,160, 42, 27, 89,186, 95, 99,229,242,181,198,109, 56, 82, 0,197,144, 80,162, 44,161,194,
+194,146, 86,176, 45,146,177,145,211,180, 99, 48, 76,200, 96, 56, 45, 2, 26, 11, 60, 22,198, 4,224, 48, 14,253,146, 81, 33,171,
+ 86,142, 27, 2,245,254,246,132,151,119,183,248,187,127,248, 29, 82, 92, 17, 83,148,203,188,138,120,206, 24, 97, 43,181,234,185,
+ 2,178, 55,209,139,176, 91,198,120,123,136,154, 0,131,118, 26,185, 45,204,100,227,242, 27,179,181,246, 13, 58,113, 21, 45,216,
+149,184,166, 7, 40,116,200, 12,182,241, 81,251,144, 67, 99, 56,125, 8,184,189,189,193, 23,111,223,224,254,238,102,179,238, 53,
+ 24, 80,135,219,136,188,210,240,198,109,174,100,117,116, 71,219,216,205,112, 15, 35,104, 59, 24,218,239,204,121, 35, 21,210,110,
+220,199, 90, 4, 82,109,252, 43, 61,180,152,181,120, 96,188,184, 61,225,155,111,255, 12,103, 8,161,123, 54, 89,139,194,173,240,
+ 0, 8,203,122,193,143,127,246,159,169,111, 92, 10, 35,177, 81, 74,135,234,108, 59,132, 7,228,252, 4, 83, 42,172,115, 40,181,
+226, 39,255,201,191,194, 87,191,253, 43,252,139,191,252,175, 49, 28,111, 48, 29,142,248,167,191,255,247,152,231, 25, 83,112,168,
+ 12,220,157,238, 64,168, 24,188, 19,191,115, 76,184, 36,139,232, 12, 98,150,145,217, 37,103,220,221,156, 4, 60,146, 98,183, 89,
+101,146, 84,192,118,121, 88,125,184, 75,149, 66,215, 7,217,191, 89, 67,160,224,133, 18, 87,178,138,194, 36,162,210,123, 18, 69,
+126,150,137,201,211,227, 19, 46,203, 2, 31,130,104, 13,200, 96, 26,156, 92,240, 68,120, 58,159, 69,172,102,164,235, 44,181,194,
+ 91, 9,102,105,161, 46,222,139,162,188, 77, 54,172,209,188,251,146, 49,141, 35, 24, 78,194, 94,158,158,112,156, 38, 28,166, 17,
+207,207,103,217, 21,135, 32,112, 28, 72,230,249,253,120,131,203,188,192,184, 0,239, 29,214, 36,151,232,221,221, 9, 62, 4,217,
+123, 15,140,115, 22,190,188,247, 10, 28, 50, 6,235,186, 74, 65,207, 5,163, 31,177, 38,193,205, 94,214, 21, 94,149,199,232, 43,
+ 43, 22, 49,220,178,168, 7,223,232,116,128,187,165, 52,197, 36, 72,210,146, 49, 47, 43, 6,253,239,222, 10,214,153,153, 81, 21,
+153, 91, 85, 20,245,199,247, 15,219, 25,105, 12,142, 99,208, 61,183, 85, 72,143,193,160,129, 45,206,154,238, 42,217,138,248, 13,
+148, 3, 0, 57, 55, 84,106,130,209, 9, 99, 81,107,222,154,244,117,174, 21,231,121,193,224, 84, 60,165, 34,176,172,183,166, 53,
+ 22,134, 36,247,162, 57,112,138,238,117,201,144, 8,196,244,244,173,181, 32,132, 1,195, 48, 96,105,150,220, 70,254,220, 17, 66,
+141,174,224,168,111,207, 89, 70,214,168,187, 8,106,254, 1,107, 93, 10,137,218, 67,175, 54,220, 27, 58,216,140,118,225, 96,204,
+192, 48,134, 29,176,170,238, 68,114,187, 32,171, 29, 10,111, 15,145,185, 98, 99, 52, 97, 47,153, 77, 9,223,214,159,188, 83,255,
+211,214,205,139,237, 22,170,125,145,179,163, 48,119,196, 47,171, 37,176,171,242,245,172,108,231,160, 0,178, 8, 97, 8,184,189,
+187, 1, 23,249, 60,181, 11,221,134,112,229, 64, 98,174,112,222, 99, 28,167,174,113, 72,177,116, 22, 74,251,119, 85,225, 60, 85,
+139,185,170,107,209,253,132,160,117,230,164, 83,157, 82, 4, 82,227,176,235, 0,219, 37,220, 40,115,178, 63,169, 26,197, 90,183,
+192,120,218, 95,236,212, 71, 44, 12, 65,206, 86,186,234, 73, 55, 98, 81, 71, 8, 54,177, 93,197, 23,111, 95,227,119,191, 95, 81,
+ 76, 6,179,233,157,164,247, 30,135,105, 4,231, 12,239, 45, 8, 34, 60, 1, 1,231,115,132,215, 80,151, 92, 55,172,166, 81,209,
+155, 39,185, 92,150,148,224,130,140,215,168,202,168,179,125,146, 90, 44, 95,227,204, 23, 0,133,165,155, 40,117,243,108, 7,239,
+126, 16, 42,242,195,120, 84, 41, 8,126,241,243,159,226,225,225, 17,127,250,230, 59,233,164,244,141, 20,184, 72,149,105, 1, 23,
+ 88, 99, 53,212,132,174,146,140,218,152,214, 24,222,233, 20,176, 85,165,189,215,231,221,120, 74,199, 75,116, 29, 73,104,126,224,
+ 9,151, 46,149,168,108, 42,216,102,223,176, 14,211, 56,226,205,235, 87,120,243,250, 37,188,119,155, 63,180,249,241,247,106,212,
+202, 87, 10,212,134,187,220,242, 36,246, 24,162, 70,199,193,245,184,110,187,219, 55,138,252, 14,181,219,129, 60,187, 67,160,237,
+ 47,159, 47, 75, 87,143,135, 97, 0,101, 96, 77, 25,213, 18, 14,193,227,188,204, 98, 28,225,141,242,151, 75,133,165,138,211,225,
+ 8, 67, 6, 79,143,239,213,237,129,142, 3, 21, 53,105,193,241,230, 53,230,243, 35,106,173,120,124,248,128, 15,223,127,131,251,
+151,111,112,186,125,137,255,252,223,252, 91, 76,135, 35, 94,189,124,135, 15,223,127,141, 90, 11,188,149,130,231, 48, 29,228,146,
+245, 14, 15,151, 25, 99,144,132, 54,107,229,251,115, 4,172,122,192,166, 24,197,142,233, 2,226,186, 34,132, 32, 93,154, 10, 54,
+ 11,164,219, 54, 36,222,231, 48,140,138,212, 44,152,231,185,163, 92, 5, 0,100,193, 69,172, 75,243,188, 34,151,170,216, 88,181,
+ 15,198, 36, 43, 42,239, 20,113, 44,249,225,196, 34, 60,179, 26,224, 49,132,160, 43,147,138, 97, 24,118,164, 33,234, 98, 78, 67,
+ 4, 63, 4,132, 97, 64, 92, 69, 49,127, 58,221,232,216, 93, 68, 93, 89,133, 62,131,247, 34, 14,213,113,178,119, 30,203,178,226,
+230,120,194,154, 34, 82,145,221,117, 83,136,187, 90, 17,215, 85, 55, 53, 82,196, 59,235, 5,203,170,157, 47,156,116,217,205,243,
+159,153, 96, 81,177,198, 54,101,168,189, 69,124,120,122, 22, 96,139,186, 11, 82,138, 50,245, 40, 9,217, 0,243,178,246,209,230,
+233, 48,202,247,168, 65, 59,214,200, 40, 89,254,156,224,131, 31,180, 80,145,100, 47,131,131,119,170,176, 22,193,155,179,118,179,
+202,105,230,124,235, 50,107,143,100,150,238,186, 69, 54,103, 22,212,112, 42, 21, 30,132,152, 19, 86, 77, 64,204, 89,184,232,193,
+ 10,176,167,176,197, 33, 56, 44, 73,148,238,185,182, 80, 18, 17, 39, 86, 46, 87,104,233, 82, 43, 28, 9,248,240, 60, 58, 0, 0,
+ 32, 0, 73, 68, 65, 84,141,177, 74,234,134,168,174,139, 40,240, 99,140,160,156, 59,173,141, 13,131,170,209, 51,191, 17, 30,182,
+139,220,144,238,238,169, 21, 42,155,125, 13, 84,193,117,119,206, 55, 6, 70, 59, 59,169, 49,215, 55,220,184, 88, 9,109,247,179,
+ 95,181,161,170, 79,218,235,179,232, 51,191,249,231, 8,216,205,150, 78,253,123,236,151,181,218,142, 97,168, 39,131,238, 81,190,
+237, 76,108, 69, 85,163,248,113, 45, 42, 58,108, 78,160,173,160, 48,164,194,108, 99,241,197,187, 55,221,221,148, 82,234, 66,233,
+ 86,232, 53, 55,138, 49, 22, 97, 28, 16, 6,229, 42,232,116,183,237,219,183,239,169, 77,198,235,150,143,208,154, 51,157,204,153,
+230,142, 0, 96,116,154,197, 34, 33,219,200, 39,116, 21,199,169, 6, 55,150, 11,157,120, 27,157,108, 60,131,205,178, 85,193,122,
+161,215,206, 17,230,221, 9,126,189, 77,105, 99, 89,194, 52, 6, 56,239,144,146, 3,113, 2,152,112,154, 6, 21, 5, 89,220, 28,
+ 15, 24,148, 16, 5, 72, 28, 31,148, 75,108, 32,149, 38, 90,213, 2, 32,236,240,135, 6, 82,249,146,126, 32,123,101,172,247, 96,
+209,160, 12,195, 45,208, 94,240,162,237,235, 89,163,149,211,142,173,139, 43, 62, 48,174,196,107,204,162,234,127,249,226, 22,255,
+225,183,191, 67,140,179,134,138, 84,176,114,224, 13,153,171,252, 91,171,249,238,253,129, 39,163, 30,129,170, 76,238,218, 31, 84,
+222,249, 51,183,152,160,221, 5, 79,166,119,239,212,243,133,197, 30,101,141, 5,145, 64, 91,156,181,184,185, 57,225,203,183,111,
+112,123,123,218, 32, 9, 74,151,147, 15,151,189, 74,119, 35,252, 16, 80,164,204,138,171,239,129,119, 97, 44,155,196,134,213,157,
+105,208,184, 84, 68,220,120, 61,219,103,131,120,223, 44, 92, 23,145, 90, 60, 90, 54, 88,231, 21,156, 35, 78,135, 9,195, 16,192,
+151,138,227, 52,161, 22,177, 42, 50,203, 4,200, 48,227,146,228,181,117,202, 4,176,222, 99, 26,143,248,227,239,127,141, 33, 28,
+144,150, 71, 37,235,137,173,113, 89,207, 8,227,141, 28, 30,198,192, 84,224,219,223,255, 22, 6,192,221,139, 55,248,242,203, 31,
+ 35,165,136,223,255,227,223,226,253,251,239, 96,211, 5,193, 89, 28, 15,130, 27,205, 57, 33,229, 8,235, 6, 57,244,156, 7, 12,
+ 97, 50, 22,231,203, 5,135,224,192, 24, 52, 96,196,162,228, 5,227, 56, 97,208,177,177, 76,114, 8, 83,240, 0,137,120, 13,198,
+ 72,176,136,119,184,172, 17,105, 93,117,191, 59,180, 17,141,116,226, 57,195, 24,139,201,123, 28,198, 1,231,203,140,243,154, 48,
+232,184, 55,248, 0,242, 50, 42, 79,185,192,216,166,119, 0,124, 8, 8, 33, 72,135, 93,171, 96, 86, 85,148, 87,187, 72, 90,192,
+ 74, 57,138,205,202,168, 2,247,227,167, 79, 58, 85,144, 17,253,167,199, 39, 20,141,108, 45,149, 81, 17,213, 66, 40,221, 94, 46,
+ 18,169,233,189, 71, 76, 81,152,239,198,226,211,167, 71,184,224,144, 98, 20,180,243, 56, 34,197,132,105, 58,224,227,195, 35, 94,
+222,221,226,114,153, 59, 27, 33,132, 1, 69,109,177,119, 55, 55, 96,102,172,235, 34,144, 29, 39,211, 3,231, 44, 82, 20,107, 91,
+138, 81,198,227,128, 88,133,106, 21,199,140,181, 72, 57,117,250, 27, 85,185,168, 83,170,170,115, 33,128, 11, 62,156,151,174, 25,
+177,234,157,111,104, 90,239,172,162, 65,181, 8,239,145,171, 82, 80,122,103,123,132,103, 11, 48,169,202, 18, 16,177, 91,197, 69,
+ 51,234, 99, 18,252,237,232, 8, 79, 41,163, 24,131,227, 40,118, 61,103, 13, 38,242, 72,185, 34,101,238, 5,132,140,146, 91,200,
+181, 34,144,149, 74,103,141,197,134, 97,226,190,150,240, 10,251,225,172,205, 27, 27,185,216,217,232, 58,213,104, 3, 97,118, 16,
+172,246,124,215,173,253, 86, 46, 6, 76,221,173,202,244,247,182,121, 35,235, 5, 77, 27, 84,134, 1,140,195,120,149, 10, 74,109,
+ 93,198,251,248,230,218, 51, 31,176, 67,195,238,228,239,221,197,209,154, 53,130,144, 35,187, 46, 71, 51, 46,154,176,183,163,190,
+141,233,103, 77,209, 75, 61, 87, 6,115,146,207,174, 10,156, 65, 82,236,116, 48, 77,215, 41, 9, 16,232,205,155,215,189, 1,170,
+181,110,147, 1, 5,213,180, 2, 88, 28, 46, 67,191, 79,132, 89, 82,187,229,215,232,175,181, 54,146, 28, 80,138,235, 59,127,163,
+232, 88,168,229,187, 17,243,164,161,149, 36, 57,247, 57, 92, 0, 87,232,188,218,105, 59, 93, 0,161,130,138,214,141,233,111,211,
+ 17,201,214,118,213, 93,129,118, 77, 40,220,189,233,122,104,159,142, 71,164, 24, 69,109,106,196,203,249,147, 47,190, 64,169, 34,
+156,115,198,192,134,128, 20, 19,230,249, 9,191,249,199,223,227,103,175,239,100,180, 77, 74,142,113,170,128, 84,236,168, 33,131,
+ 69, 71, 85, 6, 6, 57, 74,162,213,156, 75, 95, 19,212, 90,193, 70,118,169,185,106,226,210,110,252,109, 20,235, 7,230, 29, 37,
+ 15, 93, 5, 79, 59,166,113, 87,158,107,254,238, 47,127,254, 23, 56,159,103,252,225, 79,223, 32, 39,221, 55,147,120,108,247, 59,
+157, 82, 90,240,139,142,206,154,208, 12,205,102,129,205,126,193, 59,144, 3,209, 21,219,125,219,251,108,164,182, 6,192, 8, 67,
+192,155, 87,175,240,246,245, 75,241, 25,171, 95,189, 21,113,109, 71,212,222,208, 43,235, 88,251,249,169,246,228,184,253,255,181,
+ 24, 86,250, 44, 88,128, 20,231, 72,123,248,144, 81, 97,160,233,185, 65,250, 0,214,173, 96,224, 45,239,239,250, 19, 89,251,235,
+159,115,146,132,189, 44,204,238, 97, 24,240,171, 95,252, 28,255,223,223,252,117, 63,104, 69, 96, 36,100, 54,106,212, 12,107, 81,
+ 75, 70,202, 17, 47, 95,255, 4,235,186, 98,189, 60,192, 90,205, 67,102,233,144, 37, 31, 91,222,151,233, 48, 98, 12, 30,143,223,
+253, 1, 15,223,253, 17,239,255,248, 27, 25,225,146, 65,205, 17,150, 10,136, 28, 82, 17,240,140, 33,131, 87, 47,238,193, 16,192,
+203,164,151,245, 57,202, 30,173,137, 16,141,181, 40, 41,225,230,238, 14, 57,174,120,122,126,214, 88, 91, 25, 57, 39, 13,160, 89,
+150, 21,228,100,199,155,214,136,184,174, 88,214,132, 41, 12, 8,193, 99,154, 14,168, 53,227,233, 60, 35,229,130,233, 48, 97, 84,
+203, 96, 24,138, 92, 46, 58,178, 31, 91,231,236,197, 19,239, 91, 39, 9, 32,198,136,101, 93, 59, 21,174,237,164,155,184,139,212,
+ 67,124,110, 99, 69,211,226, 79, 13, 12, 75, 52,235,178,174,189, 59,205, 74,126, 75,181, 40, 62, 83,138,197,183,111,222,224,233,
+124,193,209,137,175, 94, 40,108, 3, 46,235,138,241, 48,129,107, 70, 56, 76, 88,215, 21,181, 50,198,113, 64,140, 43,110, 79, 71,
+ 44, 49, 34, 4,175, 12,236, 1,151,121, 6,115, 69, 8, 3,226,186, 72,132, 46, 3,199,211, 9,227, 52, 97,157,103, 44,243,130,
+227,241,128,203,101,198,113,154,144, 98,236,232, 91,102,198, 56, 9,199, 59, 63, 63, 1,234,129, 39, 35,147, 55, 48, 35,229,138,
+195, 24,240, 15,223,124,236,227,120,144,193, 20,188, 4,123, 40, 49,206, 89, 11, 75, 34,130,107,158,125, 25,241, 23,132, 96,183,
+ 3, 28,140,152,101,188, 94,245,239,136,185, 98, 10, 78,179, 49,100,253,178,174, 17, 9,132,211, 20, 64,170,160, 63,140,178,106,
+ 44,185,224,137, 51,156, 37, 20, 54,160, 10,185,208,141,233,252,144, 86,140, 75,250, 95, 75,133,108,188, 3,233, 68,155,189, 80,
+ 88,236,215,121, 18,178,227,150, 41,109,109, 15,243,231, 29,187, 6, 97,180,147,130,218, 78,159, 90,128,203, 46, 92,197,236,205,
+236,242,161,155,134,241, 26, 25,173,147,184, 62,161,211,113,188,129,233, 83,181, 13,106,130, 13,252, 2,186,190,224, 21, 34, 35,
+ 1, 92,212,215, 70, 93, 43,100,183,233, 92,251, 89, 37,204,138,145,107, 69, 42,117,135,202,230,205, 75, 15,205,106,215, 63,107,
+ 53, 19,225,221, 59,177,200,182,117,152, 56, 16,172, 22,190, 36,147,153,181,162,164, 4,123, 60,138, 40, 87, 87,153,206, 7,137,
+ 28,143,146, 7, 97, 85,243,225,157, 5, 88,169,142,222,131,194,208,105,120,130,242,174, 59, 67, 0,109,251,118, 99,224,234,149,
+ 11,113,203,244,218,172, 70,154,217,202,205,110,213, 18,197,118,157,251,103,226,198,190, 23,249,220,252,184,255,231,157, 83,225,
+221,155, 23,120,126, 62, 43, 6, 47, 97, 73, 9,223,125,120,143, 55,175, 94,193, 88,135,195, 97, 66,101,198,255,249, 87,127,133,
+ 53,101,156, 70,121, 40,155,234,176,253,253,158, 8,222, 17, 2, 1,133, 90, 48, 13,129,173, 65,140, 73, 80,154,188,137,232, 26,
+ 21, 41,177,228,143,175,169, 96, 10, 30,207, 49, 43,164,196,245, 29,122,219,163,139,154,223,244,157, 54,179,236,229,127, 0, 85,
+ 6,112, 60, 78,248,203, 95,253, 28,127,250,230,123,124,248,248, 73, 82,170,218, 3,175,111, 80,243, 76,178,233,232,228,174,156,
+151,191,201,238,216, 48,215,226, 20,241, 79,242, 21,181,205, 24, 33,109,189,121,253, 10, 47,238, 78, 59,112,133,209, 84,180,150,
+202,167, 90,149, 90,187,157, 69, 38, 45,205, 26, 86,251,243,211, 38, 50,124, 45,245,235,193, 59,162, 95,216,138, 1,214,177,157,
+225, 62,244,147, 95,107, 69, 37,253,247,234, 53,237, 14, 0,208, 21,100, 6,251,201, 14,183, 81, 58, 97,137, 17, 84, 11,198,224,
+113,152, 6, 4,231,145,115, 66,133, 88,123, 14, 65,180, 11, 20,156,198,152, 90,148,101,149, 46,223, 5, 44,203, 69, 62, 99,243,
+ 25, 57,173,125,231,111,117,133, 81,184,224,227,251, 63, 74,178, 82, 45, 48,213,118, 44,107,208,216,205, 18,103,113, 87,120, 43,
+222,119,231,100,167, 14,194, 52, 57, 44,171,100,169, 79,211,160,246, 49, 22, 82, 27, 51, 78,199, 35,106,201, 40,181, 0, 97, 64,
+ 92, 22, 9,142, 25, 3, 74, 46, 56,142, 3,214, 53, 2, 70,212,206, 2,150,145, 0, 19,153, 28,200, 14,246,105,153, 97,149,102,
+150,114, 18,193,164, 49,240,206, 35,165, 34,162, 64,213, 2, 12, 74, 41,139, 41,105,103, 39, 1, 71, 86, 45, 78,162, 99,145,189,
+188,136,207, 36, 43,123,141, 17,222,121, 64,247,122,203,186, 10,127,125, 26, 97,176, 69, 90, 78,195,168,211, 29,131,117,141,154,
+215, 46, 95,115, 36, 96,112,190,219, 77,215,101, 1,106,193, 18, 35,140,178,185,151,101,134,119, 30,165,100, 28,198, 1,203, 50,
+203, 65, 85, 50,170,221, 10,215,227, 52,245,100,180, 54,226,228,146, 37,205, 14,194, 87,152,198, 17, 37,103, 60, 63, 61, 98, 89,
+ 68,136,119, 62,207, 24,134,128,152,229,125,124,255,241, 1,119,183,183,146,115, 29,196, 2, 71,214,130, 75,145, 68, 52, 22,138,
+ 31,140,197,224, 25, 95,189,127, 68,229,138, 84, 10,200, 24, 76,206,246, 20, 51, 67,146, 45,209,116, 38,214, 10,194,154, 73,118,
+165, 70,207, 21, 3, 97, 97,228,156, 81,170,188,190, 2,223,145,231, 51, 22,189,204, 83,134, 1,112, 28, 61,162,138,243,188,145,
+231,203, 54,223,179,126, 94,157, 49,136, 36,141, 16,179,145, 56,215,106, 58, 94,151,171, 38,124, 85,134,109, 54, 55,229,185, 39,
+205,154, 63, 30, 14, 29,142,211,200,141, 27,210,149,180, 1, 39,113, 12,212,237, 98, 39,170,170,212, 85,109, 85, 59,103,118,231,
+ 17,239,115,158,249, 26,101, 99, 44,117,170,222,214,253,154, 43, 72, 89, 3,172, 52,101,125, 55,198,183,254, 95,199,225,253,242,
+ 52, 91, 62,253,246,207, 22,196, 34,128, 54, 86,165,165,116, 61,198,110,226,239, 92, 25,107, 46,221, 89,208, 55, 7,166,121,195,
+140,106,164,204,214,165,123,143,151, 47, 95, 32,165, 40,180,183, 13,181,186,155, 30, 80, 23,222,118,236, 79, 43, 58, 44,245,142,
+ 60, 46, 17, 23,158,113, 60, 28,224,189,219,237,249,155,205,176,104, 17, 86, 58, 22, 22, 32,112, 17,177,151, 76, 13, 60,220, 6,
+ 31,226,207,130, 57,174,119,166,188,247, 72,215,214, 93, 81, 71,112,214, 30,224,114, 13, 43,192,110,156,218,191,228,190,125,215,
+175,253,163, 47,223,226,171, 63,125,171, 29, 98,193,247, 15,207,248,238,227, 99, 95, 7, 52, 70, 48, 17, 33, 88,221,231, 24,183,
+237, 23,172,129,183,132,209, 89, 24, 0,107, 46,152, 83, 69,176, 4,235, 3, 42,150, 93,244,167,154,250, 33,214, 20,163,163, 23,
+168, 8,175, 81,216,164,147,217,249, 52,245, 3,181,161, 97, 63,239, 41,175, 51,229, 27,252,226,139,183,175,240,227, 47, 94,227,
+171,175,191,199,199,135, 7,229, 59,151,107,140, 98, 23,187,109, 59,100, 96,143, 48,220,234, 34,179,179, 97, 12,195,128,187,155,
+ 27,188,122,117,175, 22,160,205,135, 82,153, 97,138,236, 52,219, 39,183,241,229, 59,228,165, 5,199, 84,238, 28,138,158, 96,103,
+169,239,200,171,161, 31,214,103,237,137, 16,118,100, 87,195,115, 37, 80,239,202,101,170, 97,140, 92,228,134,106,183,241,113, 15,
+ 46,160,238,149,109,142,137,207,121,244,173,152,159, 47, 51, 12, 23, 48, 44,158,158,207,120,251,250,149,208,253,152,241,197,155,
+ 55,120,252, 40, 8,224, 20,147,116, 42, 81,173, 59,165,160,164,136,195,237, 29,222,127,247, 39,156,207,143,152,207, 15, 42,150,
+161,110,187, 99,168, 13, 18,208,149, 5,163,112,193,104,157, 98, 96, 13,144, 45, 6, 47, 69,196,141,122,160,157, 31,100,244, 30,
+ 19, 14,199, 35, 82, 21, 70,179, 37, 40, 45,206,226,116, 28,225,188, 69, 6,227,120, 56,162, 84,198,188,138, 32,109, 89, 23,216,
+193, 98,142,171,138, 16,245,144,173, 12,235,165,184,124,124,126,194,211,249,172,135,130,199,228, 3,124, 24,177,150, 2,152,130,
+195, 56,117,108,171, 49, 65,213,243, 14,222,121, 48,147, 10, 56, 55,188,113, 74, 89,161, 55,178, 75,191,187,187,195,170,221,122,
+103, 92, 55,171, 81, 22, 12,172, 68,144, 10,224, 7,202, 50,104, 65, 23,151,101, 70, 97, 73,253,131, 10,215,150,121, 75, 24,243,
+206,225,241, 50,227,241,233, 9,183,135, 3, 98,201,120,158,103, 76,195, 8, 31, 60,114, 41, 56,159,207,138,189, 77, 24,130, 67,
+201, 50, 49,241, 97,192,162, 4,185, 24, 5,220, 81, 75,222,146, 30,201,194, 48, 96,181, 56, 72, 49,195,186,198,226,150,238, 7,
+ 44,137,104,211, 48,106,162,153,235, 66,168,113, 24,176, 46, 11,156,147, 84, 52, 11,249,245,113, 77, 56,175, 73,113,171, 4,111,
+ 36, 27, 94, 82,180,104, 75, 53, 84,111,118, 74,185,167, 84,198,164,187,121,174, 40, 85,198,245,243, 42, 5,221,224, 44, 18, 75,
+119, 59,141, 65, 63,231, 21,199,193,117, 75,217,105, 28, 52, 19, 65,220, 47, 45,181, 82,242,231,229,115, 75,105, 15,109,145, 17,
+177,133,237,151,225,214,173,183,157,190, 17,225,174, 78,163,198, 97, 20,166,121, 41, 72,188,131,198,240,110,205,103, 0,211,196,
+174,181,117,205,250, 61, 25,234, 90, 24, 2,116,242,185,133, 83, 81, 39, 96,162,239,195, 9,132,163, 58, 36,168,167, 92,110, 19,
+ 73,110,233, 95, 45,103, 99, 95, 28,236, 96, 88,109, 5,100,148, 0,216, 59,119, 29,195,183,132,114, 99,173,146,254,244, 61,163,
+237,125, 3, 72,104,162, 69, 4,210,185,148,206, 10, 96,253,123,184, 51, 65,208,133,220, 86,201,153,175, 95,189, 0, 1, 88,230,
+185,151, 44,198,154, 93,231, 42,191, 10, 46,214, 33,198, 4,239, 83,231,196, 27, 3, 9,139, 57, 30, 5, 52,148,178,104, 71,244,
+192,171,106,141,235, 34, 97, 77, 12,132, 58,155,186, 59, 74,217, 35, 57, 39,184,237,114,165, 62, 43,223,160, 3,255,204,197,220,
+137, 65,125,104, 42,191,214,107,255,225,126,212,190, 1,253,119,114,238,174,104,150,223, 63, 14, 3, 94,189,186,199,247,239, 63,
+138, 88, 6,221,213,212,211,129,106,169, 56, 77, 3,110,166, 97,135, 0,148,174,214, 25, 35,169,107, 0,140, 5,226,170, 59, 81,
+219, 64,255,232, 99,226, 13, 26,160, 99,218, 10,100,221,231, 86,141, 38, 53,134, 52, 84, 66,190, 9,106, 43, 9,194, 53, 71,125,
+ 47,161, 83,107,200,213, 26, 67,187,221, 90,129, 47,223,189,194,143,191,124,141,167,243,140,111,191,251,128,203,101,214,135,171,
+108, 66,177,157,182,164,129, 99, 26,204, 38,132,128,155,155, 35, 94,222,221, 98,154,134, 14,168,105,159,245, 82, 85,197,218,188,
+164, 77, 32,162,251,242,174,226, 7, 64,205,174, 66,144,212,183,157,168,172,195,113,216,110, 21, 33,155,107,203,138,218, 63,154,
+ 43, 96,251, 52,160, 91,200,184, 9,242, 64,221, 2,196,220,178,231,154,176, 6,215,235, 28,222,168, 81,124, 5,168,108,139,175,
+138, 49, 56, 16,106,223, 41,223,223,223,225,195,135,143,120,121,127,135,175,191,249, 6, 83, 16,175,113, 76, 25,134,172,118,221,
+ 98,181,123,122,252, 14,228, 2, 46,151, 7,177,106,169, 70,162,212, 10,103,148,216, 53,157,176,204,207,138,133,100, 12, 65,186,
+ 38, 7,224,252,244,136,105, 12, 40, 5,184,191, 57,118,178, 90, 79,254, 11, 35,142,199, 83, 79,116,203,133,213,170,168, 42,234,
+ 82,213,243, 45,130,183, 97, 24, 48, 78,147,162,129, 37, 28, 98,212,206,183,214,138, 37, 9, 23,189,148,138, 24, 19, 14,195,128,
+ 92, 43,134, 97,194,232, 29,214,117,198,105, 58, 32,151,132, 75, 20, 4,234,232, 61,198, 73,162, 30, 47,243,140,117, 89,177,198,
+164,123,117, 15,239,228, 98,108, 9,104,109, 92,252,233,211,167, 78,208, 18, 66,150, 48,209,163, 50,170,201,200,244,138,192, 72,
+ 10,214,201, 21,184,187, 59,225,249,233,185,143, 2,187, 56,168, 50,252, 48, 8, 16, 72, 73,132,222, 57,220, 28, 38,197,130, 58,
+ 28,167, 17, 12,234,128, 30, 89, 31, 49, 14,211,120,181, 70,146,213,156,216, 67, 11, 23, 17,164, 89, 11, 99,183,160,165,224,125,
+135,122, 16,184,227, 86,189,247,152,151, 5,135,113, 68,226,138, 28, 51,178,119,194,210,175, 21,195, 16,250,123,209,220, 59, 45,
+ 87,252,235,143, 79, 87, 13,142,183,102,151, 91,160, 98, 52, 22,251,160,181,114,240, 11,111, 67, 62, 83, 75,202,114,129,231,130,
+156, 27,106,148,144, 43, 99, 10,161,219, 47, 14,222,194, 90, 82, 26,220, 6,139, 17,223,121,149, 46, 93, 3,171,140, 22, 10,114,
+153, 17,114, 69,111,120,100,223,207,144, 76,157,182, 11,215, 85, 84,103,171,203,215,143, 41, 41,107,226, 70,222,227, 90, 81,202,
+142, 98, 73,245,179,134, 76,138,117,170,155, 31,189, 55,132,180,105,143,246, 42,109,190, 26,210,202,249,123,156, 14, 58, 93,160,
+190,211, 54,187,232,218,126,190, 42,254,183,197,216,238, 18,191,119,154, 33,211,167,144, 61,201,140,212, 14,186, 91, 15,218, 93,
+ 84,118, 23,211,113, 75,142,147, 41,164, 68,122,243,213,153,222, 19, 96,117, 53, 64,154,184,102, 72,186,226,195, 97, 68,156, 47,
+112,222,247,213, 39, 80, 85,223, 36,241,189, 38,139,139, 37,168,189, 49,174, 43,134,105,146, 51, 24, 6,214,202,207, 17,194, 0,
+231, 36,158, 56,165,140, 20, 87,204,231,179, 70,242,138, 78, 3, 85, 10, 50,106, 81, 93,138, 71,111,244,194,146, 18, 28,245,230,
+149,175, 81,165,123,152, 9,109, 54,181,238, 63,102,238,162, 9,234,202,231, 29,104,128,104, 7, 73,249,231,152,194,162,162, 52,
+187,161,238,253,237, 13,130,247,248,250,155,239,144, 98, 68,169,121, 19,212, 5,143, 87,247,119,248,230,253, 7, 56,231, 97,172,
+140,163,200, 42, 83,156, 72, 94, 36,102, 36, 24,164, 10, 56,253,208, 85,101,227, 82,169, 8,193, 73,214,118,145, 32,133, 57,173,
+155, 93,139,129,220, 50,123,141,193, 97, 26,122, 1,211,107, 17,189,160,100, 7, 78, 29, 65,136, 93,216,157,217,117,203,104,150,
+ 22,218,118,208,199,105,194,207,254,226, 75,205, 15,151,125,123,140, 18,242, 33,112,127, 57, 20,131,247,125,100, 84, 53,133,139,
+119,145,166, 87, 15, 76,109, 85,174,126,168,106, 27,233, 87, 9, 66,168, 12,152, 93,176,130,190,238,134,119,232, 67,208,149, 86,
+130,119, 49,137,246, 51,174, 60,120, 47,113,163,205,218,216,165, 45,162,206,108,202,183,246,255,139, 40,109,151,240,215,253,248,
+166, 35,112,233, 74, 92,201, 61, 99, 64, 42,232,130,121, 93,240,246,229,189,140, 24, 75,193,229, 89,212,227,185, 84,220,221,221,
+161,172, 23,128, 44,144, 5,184,161, 2, 99, 16, 3,214, 56,204,231,103,121, 48,177,209,235,218,222,153,172, 71, 76,162,172,174,
+ 44,214,196, 24, 87, 77, 55,115, 96, 2, 98,172,152,166, 1, 41,174, 24,199, 65,232,102, 99,128,245, 66,134,147,142,114, 18, 77,
+ 70, 73, 50, 74,131,193, 28, 87, 9, 80, 41,141, 65,239, 81, 75,198,229,124, 22,177,104, 6,106, 37, 92,150, 8,103,101,244,232,
+117,159, 62,199, 21, 62,120,140,206, 33,230, 44,179, 49, 45, 40, 74, 45,240,126,128,179,210, 93,134, 48,224,112, 56, 97, 94,102,
+196,148,122, 39,228,140,196,165,206,203,138, 97, 8, 24,199, 17,206, 7,201,252,214,176,150, 54,138,119, 78, 84,220,207,151, 25,
+ 79,231, 51,130,181,168,153, 49,142, 83,247,142, 51,128,227, 52,118,182,127,235, 46, 70,133, 16,205,107,196, 52, 14, 24,134, 9,
+222, 7,156, 21,237,204,204, 61,226,214, 90, 43,244, 59,107,113, 58, 76,200, 41,194,168, 48,182, 17,240,154,162, 66,200, 89,140,
+ 96, 68,252,118, 60, 76, 72,170, 34, 39, 85,239, 75,224, 69,209,112,141, 0,235,196, 10, 55,120,135, 24, 35,230,203, 69,198,160,
+ 68,221, 91, 95,114,218, 88, 11, 57,247, 36,172,191,255,211,251, 45,228,138, 25,163,119,253, 98, 16,135,130,156,129,115, 76, 48,
+ 68, 88, 98,210,113, 43,176,172,146, 36,103,152,165, 48,179, 86,105, 96, 80,250,156,133,117, 30,193, 25, 56,213,250,218, 29, 86,
+218,144, 60,239,100, 37,100, 42,213, 34,163,121,179, 21,186, 45,124,137,128,254,189, 52,219,150,148, 53, 5,165,154, 62,125,172,
+ 42,196,109, 93, 95, 74, 9, 57, 39, 12, 97,196,233,120,210,252, 10,238, 76,246,158, 50,193,123,125, 44,201, 57, 82,141, 86, 18,
+122, 57,239, 66,167,184,235,115,248,218,145, 99,140, 16,251,218,207, 96, 54,154, 91, 19,251, 53,190, 9, 25,211, 5,110,220, 87,
+181,123, 7, 16,250, 69,110, 84, 44,221, 0, 69, 70, 11, 37,222, 79, 53,205,214,221,183,149, 91,179, 55, 22, 22,240, 89,174, 91,
+178,229,174,199,237,182, 56,217,199, 91,201, 24, 49, 6,239,222,189,193,233,120, 16,236,179,181,155,211,161, 50,188,215,224, 35,
+189,196,185, 20,140,227,168,206,135,210, 95,151,148,146, 20,112,206,193, 24,135,202, 5,165,164, 93, 99,173,231,180, 58,163,196,
+161, 35,231,181,221,217,149, 91, 36, 44,215, 10,215, 59,195,186, 69, 27,118,206, 12,233,238,132,161, 65, 25, 91, 36, 31,239, 46,
+128,158,224,182,201,152, 81,183, 25,240, 62, 98,123, 87,175,109, 22, 15,161,227,200, 7,254,120, 28,241,139,159,255, 20, 31, 62,
+ 61,226,233,241, 9,172,251,158, 48,142,120,253,238, 45, 94,189,121,141,167,239,191, 7,106,234, 33, 35,206, 25, 12,131,195,200,
+ 21,254, 16,112,190, 36, 20,181,220,229, 10,112, 78,253,131, 18, 0, 20, 3, 20, 97,213,118,190,121, 19,189,241,238, 3, 40,190,
+120, 1,239,108,181, 10,245,238, 14, 26,124, 83,153,176,245,177,186,152, 32,249,112, 54, 29, 66,235,228,177, 27, 67, 53, 2,159,
+ 53, 22,227, 40, 62, 90,107,105, 39, 86,145,215,175,104,113,210, 94,195,254,154, 19, 54, 5, 57, 41, 93, 78, 49,136, 85, 59,112,
+249,103, 89, 49,128, 25, 85,125,251,104,184, 65,222, 89, 76,116,236, 14,141,103,229,182, 56,229,207, 50,221,219, 85,168,149,233,
+ 62, 74,176,125,240, 72,195, 89, 36,158,117,247,171,114,200,169, 99, 95, 91,135,177, 37,253,225,179,188,227,198, 68, 62, 63,207,
+120, 62,207,184,155, 12,150, 53,194,145, 76, 88,198, 16, 16, 83,198, 97,154,240, 23, 63,250, 18,127,251,235, 95,235,158,213, 32,
+198,130,202, 25,164,204,109, 34, 96,153, 63, 33,230, 12,103,124,215, 87,248,198,197, 46,187, 36, 65,211,130,104,244, 48,135,208,
+157, 98,173,160,228, 96, 81,144,216,192, 27,131,231, 25,112,113,133,181, 22, 67, 24, 16,147,199,139,251,123,172, 49,226,252,248,
+ 36,226, 23,235,177,172,179,136, 35,201,162,146,140,252,124,240, 88,215,212,139, 41,211,152,229, 10,124, 25, 66,192, 16, 68, 77,
+127, 89, 86,140,211,168,105, 99, 69,241,178,162,230,142,235,138,113,156, 96,173,195,229, 34, 99,250,203,101, 65, 5,112, 28, 71,
+216, 86, 40, 25,129,187,116,116, 51, 3,179,142,221, 13, 25,140,138,139, 37,253,239, 47,111,111, 54,142, 55, 1,222, 5, 25,235,
+170,144,238,249,249, 25,151,121, 22, 86,189,142,188, 5, 84,198, 40, 41, 99,213,136, 91,102,150,231,185, 86,172, 73,192, 44,151,
+121,233,145,202,107, 76, 29,163, 57, 13, 65, 51,213,125,223, 9,151,156, 97, 13,225, 60,175, 50, 46,143, 45, 10,211,194, 59,175,
+ 86, 52,194,211,243,130,160,162,196,134,218, 45,165, 96,141, 9,198,137, 88, 16, 85,240,180,182, 79, 79,228,215, 22,152,241, 31,
+191,126,175,231,158, 92,136,163,138,102,139,194, 42, 4, 51, 33, 32, 25,193, 68, 27,216,198,111,216, 89,146,108, 67,119, 90, 65,
+141, 6,167,201, 93,214, 97, 12,182, 35,162,247, 25, 10, 73,197,188,133, 25, 69, 57,247,251,180,199, 90,107,159, 98, 25,218, 40,
+117,181, 95,162,162,213, 17,251,153, 76,204, 26,114,150,118,122, 39,230,182,230, 24, 49,141, 34,116,228, 42,240,159,109, 13,102,
+118,241,218,188, 81,231, 20,166,213,172,204, 48, 0,177, 81,161, 45,111, 13,157,158,137,206,154,158,156,215,211, 39,119,207, 57,
+119,112, 86,221, 86,153,205,150,219,206,133,189,109,173,237,182,173, 21, 59, 23,217,237,226, 53, 70,157, 54,154, 40,105, 54,172,
+117, 75,172, 43,218,130, 23, 37, 41,198,148,251, 90,176,127,208,177, 39,189, 80, 87,186, 27,178, 56,157, 78,120,253,230,149,186,
+ 42,210,102,165, 52,128, 55, 22, 94,221, 5,166, 72,132,178, 42,158,133, 12, 88,179,196,142,147, 76,168,172,243, 24, 6,200, 94,
+126,141,114, 78, 54, 23, 64, 11,168,169, 13,201, 94,122,254, 59,183,188,140, 88,183,184,109, 34,209,140, 55,229,122, 63, 70,219,
+136, 86, 21,207,157, 32,215,197, 97,132,150,165,131,125,150,247, 94, 68, 85, 63, 19,202, 93,201,241,182,210,239, 10, 52, 64,155,
+143,253,229,253, 45, 94,222,223,110, 57,226,250, 65, 49,214, 72,102,115,204,189,138, 14, 0, 12, 49,130,221,166, 9,193, 89, 73,
+228,169, 64, 42, 85,121,196,216, 0, 42, 6,253, 16, 43,204, 91,250, 79,223,155,216,142, 20,108, 66, 45, 50,159, 37,160,181, 8,
+210,202, 74,165,171, 93,245,185, 29,208,116, 61,194, 34, 22,209,135,214, 59,123,232,207,158,244,182,179,197,247,145, 58,246, 73,
+119,188,179,144,181, 71,167, 9,224,182, 77,121, 71,248, 86, 99,228,129,222,137,210,136,235,213,123,214, 64, 48,196,215,244,182,
+110,153,220,137, 96,246, 69, 64,207,102, 87, 91, 96, 15, 32, 81, 59, 36, 54,249,229,246,117,118,130,193,253,215,217,128, 21,215,
+ 97, 66, 0,225,241,249,140,131,151,215, 60,248,128,154, 35,114, 74,120, 88, 87,220,222,220,162, 48,227,238,246, 22,227,225,132,
+243,211, 39,100,102, 81,224,179, 5, 20, 84,196,181,246,228,179,194, 9, 65,247,109,237,168, 51,134, 96,184,161, 60,197, 18, 9,
+ 75, 24, 45, 16, 75,214,148, 64,173,176,173,129, 73, 17,197, 56,156,134, 17,224,130,183,111,191, 68,205, 17,135,195, 65, 40,100,
+211, 65,108,148,165, 40,128, 69, 2, 88,134, 97, 68, 76,171,186, 62, 42, 64, 86, 2,101,198, 65, 5,136, 5,199,225, 8, 2,225,
+211,211, 51,130,181,152,151,136, 82,197,122,117,152, 14,242,125,151,130,160,132, 53, 31, 6, 81,110,103,153, 14, 92, 86,185,252,
+150,117, 65, 45, 25, 54, 4,112,201,138, 85, 53, 56,221,220, 32,197,132,101, 89,144,179,140,180,155,167,159,139, 76,202, 14,211,
+ 36,246, 47, 34, 85,228,138, 5, 71,114,224,173,136,119, 82, 18,181,125,240, 56, 95,102, 76,227, 0,231, 61,110,156, 67, 84,255,
+120,214, 73,192, 18, 35, 98,146,159,115,153,103, 48,128, 37,174, 56, 29, 14, 50, 86, 52,132, 64,182,123,220,115, 17,159, 57, 17,
+192,106, 47, 29,134,208,237, 99,193, 6,153, 80,168, 79,190,241,229, 67, 16,171,108,140, 17,135,233, 0, 38, 32, 51,131,178,164,
+ 62, 78,135,131,196,219,234,196,173,249,132,141, 49,248,230,187, 15,136,185,244, 17,179,183, 2,128,113, 70,144,194, 34,112,179,
+187,224, 17,105,136,140,102, 56,203,247,229,212, 90, 42, 35,245,152, 11, 6,101, 2, 56,231,224, 45,118,202,106,161, 5, 54,191,
+ 55, 65,208,176, 68, 34,130, 98,189,124,136,196, 25,212, 49,168, 61,140,103,203, 82,104, 69,121, 95, 51, 26,113,210,180,120, 78,
+102, 81, 39, 54,230, 90,140, 9,209,175,248,255, 11,123,179,157,201,146, 44, 59,111,109, 27,206,228,254, 15, 49,100,102, 85,245,
+ 76, 18,132, 64,117, 3, 20, 37,129, 36, 40,241,117,244, 8,122, 2, 93,233, 1,116, 47, 93,233, 94, 47, 32,240, 70,141, 38, 4,
+178,196, 98,163,217,236,234,174, 33,171, 58,199,136,127,112, 63,147,153,109, 93,236,109,195,241,200,146, 10,104,100,103,102, 68,
+254, 30,238,126,204,246,176,214,183,134,113,194,253,157, 6,246,168, 58, 30, 58,214, 54,121, 13,160,255,174, 76, 47,181,216, 38,
+ 86,235,179,222, 17,181,171, 86, 47,183,177,232, 58,215,160,191,107,227,148,207,112,171,172,135,172, 21,106,167,132,101, 37,172,
+151,172,209, 11, 58,103,213,103,209, 90,214,127, 24, 99, 11, 56, 39, 79,113, 77,211,209,231, 14, 61,169,136,112,203,151,114,115,
+ 8, 27, 66,147, 64,169,106,119, 77, 20,116,222,225, 39,191,255, 99,156,239,238, 16,246,173,232,160,242,161,157, 57,239, 65, 59,
+114,223,117, 66,153,219,119,248,174, 67,140, 17,151,203, 21,134,172, 98,153, 19, 98,216,203,165,222,166,109,102,139,156,201, 52,
+190, 84,167,233,212,166,159,230, 53, 44, 67,119,234, 92,227,191, 24,169,230,211,150,238, 60, 85, 64, 62,167,155, 75,230,152,212,
+147, 47,129,212, 66,254,115,246, 54, 29,185,181,109,190, 58,221, 92,255,101, 52,171,255, 50,103,124, 51,203,216,129,141,218, 21,
+ 64, 24, 7, 7, 39,179, 37, 60,173, 17,158, 8, 75,140,240,134, 16, 13,105,168,188,190,174,182,152,224, 84,198, 63, 25,148,159,
+199, 54,222,119,135,162,163,174, 22,204,173, 61,188,116,171,165, 19,135,120, 61,179,239,250,240,231,203,190,255, 92, 47, 39,150,
+209, 81, 30, 39,181,225, 5,135,244,194,116, 16, 23,230,217, 80, 9, 60,128,118,225,217, 51, 74, 77,172,162, 33, 13,173,209,223,
+ 97,168,181,154,235,164, 38, 29, 42,232, 28, 56,145, 51,213,243,120,186, 77, 73, 43, 54,186,204,149, 44, 23, 53,233,152, 61, 63,
+168,250,215,156, 24,213,250,239,179,247, 95, 95, 83, 1, 32,209,173,153,128, 97,137,113, 26, 58,120,103, 17,245, 66, 39, 2, 78,
+167, 51, 0,160,239, 58,172,219,134,127,242,143,255, 17,254,205,255,245,231,229,194,230, 50,226, 67, 9,187, 40,185, 5, 58,241,
+144,201,131,240,147,207,111, 62,199,208, 79,248,254,175,254, 93, 1, 22,205, 91, 94, 17,200,152,151, 83,196,208, 15, 50, 42,177,
+130,119, 76, 97,199,199, 15,223,224,253,251,247, 56,157,207,120,189, 92, 16, 99,194,253,221, 29,150,117,197,229,122,145, 46, 15,
+ 66,128,114,214,227,244, 48, 1,198,129,145,176, 92, 47, 34, 0, 99,130,117,157, 18,207, 4, 20, 50, 95, 23, 48,128,251,251, 7,
+204,203,170,236,122,205,107,208,116,196, 60, 93, 74, 41, 98, 11, 34, 20,138, 41,225,238,116, 46,154, 11,107,157,116, 16,214,224,
+122,189,106,156,105,133, 21,121,223, 73,158, 66, 12,184, 59,159, 17,226, 46,104, 86,231, 96,251, 14,251, 22,117, 44, 42,159,201,
+117, 89, 69,241,174,222,115, 99,228,130,186, 63,159,241,252,242, 34,251,117, 18, 81,154, 37, 25, 61, 90,125,141,206,202,120,122,
+240, 67,217,153,147, 58, 30, 99, 76,240,189,248,249, 13,201, 36,130, 20,244, 65,218, 97,175,235,170, 36, 55, 7,222,119,112, 98,
+201,167,159,148,119,191,109, 56,157, 78,232,251, 30,251, 30, 48,245, 64,180,161,136,233,178,216,200,232,216, 61,166,132,167,215,
+ 11,190,121,122, 45, 9,136,135, 60,112,197,194,166, 28, 72,101,228,220,112,214,160,243,186,195, 53, 89, 87, 32,151, 33,152, 17,
+162,228, 62,100, 64, 8, 33,130,200,234,202, 74, 69, 90, 10, 30,145,103,206, 54,103, 11, 41, 9, 78,104,151, 96,160,243,182,116,
+229,133, 26,169,151, 88, 57,223, 26,241, 28,140, 6,176,164, 84,220, 76,149,237,206, 88,183, 77,178, 5,156,132, 49,137,222, 37,
+ 42, 78,219,170,222, 67,156, 73, 33,236,101,207,127, 64,195, 54,248, 85, 40, 55, 61,139,211,188,119, 7,125, 81, 17,191,149,181,
+105,213, 82,228, 81, 60,233,175, 49, 37, 76,171,237,212,235, 40,221, 58,175,133,135,132,131,145, 2,102, 72,179, 54,164,112,168,
+151,123, 42,229, 76, 82,197,187, 66,102,154, 38, 13,186,239,207, 99,252, 98, 95, 83,128,215,143,126,244,185, 52, 17, 65,196,206,
+166,236,247,173, 58,184,100,186, 76, 74, 75, 44,145,209, 9,136,243,130,176, 71,132, 61,130,140,140,203, 83,220, 97,163,100, 45,
+228,137, 86,107, 83, 54, 6, 13, 84,169, 54,224,133, 21,161,150,195,188, 66,114, 69,248,197, 53,186, 14,169, 94,196,185,179, 76,
+154, 82,150,137, 66, 57,106,149, 8, 57,122,163,168, 20,107,242,149, 30,164,166,233,228,155,196,183,250, 57,201,207, 76,237,125,
+ 70, 55, 57,128,197,122, 32, 52, 44,163, 23,186, 33,130, 53,128, 19, 13, 85, 9, 85, 73, 36, 21,178,188,209,109,132,169,116, 96,
+ 9, 98, 11, 40, 26,209, 70, 43,192, 0,124,231,202,197, 93,168, 70, 45, 89, 78,119,213, 53, 79,184, 17,161, 49,192, 38,195, 27,
+ 90, 5, 28,231,220,194, 26,179,151,114, 65,132, 35, 75,185, 77, 83,160,219,194,167,221, 54,231, 90,161,118,238, 70,121, 1,108,
+168,137,196,173, 41,111, 38,229,139,172,180,224, 42, 70, 81,208,131,169, 29,117, 70, 6, 19,227,144,183, 92,249,202,181,250, 38,
+ 61, 8,139, 21,189, 69, 7,227,150, 40,151,163, 23, 83,211,221,243,205, 68, 39,215, 46,146,182,230,173,193,221,233, 36, 72,213,
+ 36, 23,199, 22, 3,174,243,172,151, 92, 18,212,103, 98,252,209, 31,254, 1,190,253,251,191,199,211,117,133, 49,226, 33,207,159,
+157,179, 70,186,120,164, 50,154, 99, 5, 78,113, 74,216,150,139, 48,152, 21, 14,212, 89, 17,135,229,233,205,117, 93,225,188,100,
+140,131,129,206, 24,132,176, 98,232, 6, 48, 25,177,143,109,171,136,165,246, 29,215,117, 6, 84,121, 27, 73,180, 18,215,235, 5,
+119,119,247, 2,140,177, 10,160, 32, 25,207,173,219,174, 1, 30,114, 48,249,174,211,110,167,199,188, 46,184,187, 59,203, 30, 79,
+255,221,182,174,176,123,192, 30, 34,156,211,176,146,176,161,119, 14, 59, 24,235,182, 22, 48, 81,223,121,221, 55, 59,164, 20,213,
+ 15, 46,182, 55,178,130,109,237,157,131,245, 22,203,124, 69, 74, 9,157,247, 24,134, 65,244, 41, 73,167, 59,214,233, 33, 12,181,
+ 98,137,162, 87, 46,210, 17, 79,207, 79,101,136,103,213, 10,150, 0,144,177,136, 97,151,228, 53,229,206,147,102,161,231, 40, 99,
+249, 51, 43,178, 51,201,104,119, 89, 23, 24,107,241, 48,142,184, 94,175,216,182,185,136,198, 12, 37, 88,103,225,157, 76, 8,194,
+ 46,105, 86,249,121,222,214, 77,118,224, 33,148, 14, 49, 70,205, 90,208, 12,243,125,219,176,133,136,191,253,237,183,101, 28,204,
+204,112,250,156, 56,147,187,114,131,193,171,243,196, 57, 93, 71,216,242,157, 53,144, 80,151,150, 54,105,173,173, 49, 39, 28, 17,
+163,194,177,140,116,142, 65,187,196, 16,245, 89,163, 76,231,147,239,231,190,133, 98, 69,180,186,190,178, 36, 73, 99, 41, 5,109,
+120,116,237,169,185, 19, 45,228,202, 40, 29,143,201, 22,150,184, 88,116,229,187,178,135, 29,219,190, 97,156,206, 24,199, 17, 22,
+ 1,148, 2, 66, 2,182, 68, 8,249,162,221,168,138,122,211,141,198, 6,220,160, 83,179,104,205,150,174, 58, 55,130,185, 57, 43,
+ 93,122, 74, 90,228,165, 98, 67, 43, 14,164, 76,159,107,130,169, 90,251,110, 78,157,171, 97, 62,164, 23,123,142,238, 62,178,224,
+243,235,136,122,198, 75,228,111,172,234,123,174,235, 70, 34,163,234,119, 83, 47,117,107,112,119,119,194, 56, 12, 2, 66,219,214,
+ 50, 53,225, 70,102, 20,246, 29,188,115,121,109, 49, 5, 93, 23, 88,101,186,179,176, 66,178, 31,158, 24, 49,212, 4, 59, 83,130,
+126,178, 88, 58, 23,108, 92,161, 57,121,191, 79, 66, 20, 52, 86,232,118,204,128,203,123,216,210,126,162,129,238,231,253,120,206,
+253, 86,174,111,109, 63, 43,198, 20,208,110, 80,171, 91,186, 81,194,211, 97, 6,207,160,155,222, 28,217,131,251,195,255,182, 92,
+ 99, 81,127,141,209,187,222, 18,131, 67, 66, 36,139,141, 25, 6, 9, 81,129, 24, 41, 37, 80,215,195, 66,246,210,220, 36,186,215,
+226, 34, 21,250, 82, 46, 77, 68,137,216, 29, 45,120,185,203, 52,104,118, 26,168,151,113,225, 13,235,248,171,228,227, 54,110,128,
+ 54,130,173,201, 73,103, 70,137,254, 60, 14, 44,232, 96, 81,131,238,195,115, 69, 73, 13, 63, 74,108,134, 82, 37, 37,170,201,110,
+ 37,235, 40,135,243, 16, 26, 86,243,144, 0, 0, 32, 0, 73, 68, 65, 84,131, 13,151,221, 87, 85,168,234,173,157, 29, 5,229,247,
+ 81,149,190,113,253, 28, 10, 21, 58, 87,108, 57, 69,141,185,112,163,181, 93,151, 81,154,145,204,242,252,247,164,163,204,204,170,
+ 62,100, 4, 83, 59, 86,146, 63,215,235,235, 12, 67, 6,151,101, 5,165, 4,223, 57,192, 24, 76,126,192,187, 55,111, 96,140, 85,
+ 24,138,133, 11, 17,127,242,251,191,135, 95,255,234,215, 56,119, 22,187,177,160, 36, 97, 7,176, 98,199, 25,134, 14,251, 38,194,
+ 45, 89,135,112,209,130,196,176, 97,190, 62,169, 93, 42, 98, 11, 36,161, 33,156, 64, 70,236,108, 70,117, 18,214, 88, 33,200,145,
+197,117, 22,178,217,117, 94, 48, 12, 19,182,109,209,108,110, 81,213,238, 97,199, 52,157, 36,147,251,238, 81, 4,132,138,126,237,
+135, 9,188,202, 33,118,127,238,176,108, 59,182, 93, 46,220,147, 33,220,221,221,107,193, 36,135,223,150,128,121, 93,164,112, 80,
+206,251,216, 43, 37, 44, 69, 72,223, 24,208, 89,135, 61, 10, 61,173, 43, 24, 88,241, 75,147,145,137, 20, 3, 50,205,130,193,221,
+105, 16,113,158,118,167,123, 8, 88,215, 77, 70,240,250,108,120, 47,234,249, 85,133,112, 68, 4,235, 12,174,215, 69,252,224,219,
+ 38,159,185,158, 5,137, 25,157,115,184, 94, 46,197,113, 98,173,193,182,111,229,115,222, 54,249, 25,214,137,114,127,154, 78,242,
+ 51, 89, 20,217,214, 26,244,157, 68,148,102, 95,115,126,157,206, 57,116,125, 15,239, 61,214, 77,108,105,207, 47,207, 2,194, 97,
+ 96, 56, 13,216,183, 13, 33, 64,196,140,214,162,115, 14, 73,149,240,251, 46,156,131,255,252,155,175,203, 90,172, 4, 31, 41, 86,
+ 52, 49, 48, 56,167, 41,134,132,193, 11, 80,199,229, 64, 38, 45, 22,147,102, 99,103, 46,184,228, 59,176, 88,107,161, 73,148,202,
+175, 55,156, 25,243, 80,157, 5,244,215, 39, 88,245,252,112,136,216,118,209, 42, 68,165,219,213,156,138,250,252, 26, 5,230,228,
+ 40,214,132, 38,174,153,197,129, 33, 57,230,170, 19,200,103,179, 54, 60,123, 8, 24, 56, 97,234,123, 12,246, 12,138, 66, 4,100,
+219,227,105,222,117,133, 19,165,248,218, 54,216, 2, 46, 58,222, 29, 53,134,217, 28,173,205,134, 10,157,206,100,204,172,218,205,
+100, 15, 94,207, 59,153,152,113,105, 56,200,210, 33, 95, 60,231,151, 91, 39,218, 4,155, 65, 47,208, 66,162,172,194,169,114, 64,
+138, 99, 41, 39, 80,212,125,122, 73,135,175,190,226, 50, 29,174,144, 25,131,190, 31,240,230,205, 35,134,206, 99, 95,230,166,185,
+145,207, 60, 67,189, 56,101,109,134,164, 91,102, 78,136,117,234,132, 65,210,117, 70,168, 81,216,154,152, 72, 77,106, 27, 43, 8,
+137,140,131,117, 94,192, 90, 57,188, 37, 71,192, 42, 60, 45,227,106, 99, 12,112,114,160, 37, 21, 34,220,204, 83, 26,111, 96,166,
+114, 81, 65,129,214, 56, 62, 98,221, 41, 51, 55,240,130, 99,199,133,155, 36,159, 79,198,210,208,249,124,201, 55,111,141,242, 84,
+182,178, 41,196,131,236,187,119, 6,157, 51,120,141,106, 81,219, 2,216,121,164, 40,137, 76,134, 76, 65,194,202, 87, 80,236, 84,
+114,167,136,146, 60,171,145,153,100,151, 37, 99, 54,219,214,159,229,191, 97,184, 85, 6,168, 0, 13,141,128, 48,135, 32, 80, 22,
+203,125,210,102, 31, 76, 5, 25, 14, 99,136,127,232, 29, 59,162,117,111, 16,177,133,252, 70,199,254,150, 82, 21,151,181,148, 55,
+180,234,210,230, 51,174,171, 4, 42, 23,109,222,117,101,125,138,100,248,178, 6,233,112, 43,238,175,227,242, 50, 30,202,171, 13,
+ 42,164,188,108,171,107,199,240,242,143, 73, 58,252, 44,160,107,114,226,219,119, 34,196, 8,143,132,101, 21, 37,113, 14,189,232,
+252,168, 35, 73,137,247,220, 67,128,119, 22, 31,183, 29, 63,249,189,223,199, 55, 95,127,133, 62, 37,108, 57,109, 42,213,159,109,
+157,211,209,165, 20, 15,214, 57,221,179, 69,124,254,217, 31,226,235,111,191, 2, 37, 9,245,145,112, 14, 97,184,119,157, 71,223,
+141,240,148, 16, 53,195,187, 31, 6,140, 67, 15,107, 8,111,222,190,131,247, 14,219, 54,227,227,199,167, 38,168,200,227,245,245,
+ 10, 16,224,157, 36,183,145,183,152,175, 51,236, 40, 7, 95, 10, 59,158, 46, 11, 88, 99, 64, 65, 70,248,231,235,138, 24, 35,238,
+238,206,248,248,244,132,109, 15, 34, 38,219, 2,174,243, 21,131, 6,180, 24, 18, 92,104, 12, 1,203, 46, 81,171, 12,135,222, 91,
+ 68, 78,224,100,176,135, 85,114,208,135, 94,197, 75, 98,153, 19, 33,163,140,186,141,118,221,121,223,200, 28,117,119, 29, 65,145,
+144, 66, 44,239,183, 49, 6,175,151,171, 88,221,102, 81,181,175,123,192,121, 26,208, 89, 47,126,113,136,117,204,228,239, 6, 58,
+204,203, 6, 67,140,109,223, 10,149,205,123, 17, 34,237, 33,200, 8, 56,138,239,219, 82, 14,191,216, 37,197,173,239, 48,207, 11,
+166,193,151,226,210, 90, 9,228,185, 94, 47, 34, 58,117, 14,222, 24,196, 32,224,157,126, 28,209,245,189, 20, 48,153, 51, 15,241,
+182,255,205, 47,191, 44, 57, 16,164, 63,143,180,145, 49,134,224,213,155,222, 57,219, 56, 89, 32,138,105,197,191,238, 58,229, 26,
+186, 78, 44,148,206, 34,196,132,206,202,217, 25, 84,172,150, 87, 93, 33,197,242,236, 36, 85, 77, 75, 30,187, 92,236,206, 90,108,
+ 49,162,239, 92,193,213, 38, 85,106,231,231, 5, 13, 23, 61, 79, 36,203, 64,209,220, 94,132,164,160, 39,113,141,152,156,238,152,
+ 3, 79, 82,146, 73,142, 39, 12,157, 71, 80, 93,201,188, 61, 99,205,137,146, 50,246,106, 38, 1, 40,133, 89, 94, 87, 84, 84,108,
+237,174, 83,202,232,220, 84,247,230, 77, 6,135, 88,119,107, 3, 67,121,247,127,208, 8,152, 38, 25,205,214, 14, 61,239,212,111,
+246,231, 21,106, 83, 63,175,172, 39,224,156,157,160,239,159,161,170,155, 98,141,151, 54,198,150,162,131,140,197,251,247,111,113,
+ 82,234, 97, 72, 84,149, 63,218, 81,167, 84, 36,228,162, 67, 51, 22,150, 81, 94,167,215,198, 96, 15,187,104, 28, 72, 65, 56, 58,
+ 5, 32, 34,196, 61, 32,170, 70, 69,126,182, 76,232,250,113, 16, 71, 74, 98,172,243, 44,231, 52, 82,209, 30,196, 16, 16, 33,193,
+ 47,174, 93,202,163, 5, 14,208,177,107,111,194,215, 42, 73,236,128, 92,105,116,237, 68,117,216,202,199,189,104,225,214, 85, 63,
+255,161,151, 39,220,164,126,148,116, 27, 46,148, 41,215, 16,236,188,146,136,246, 4, 12,134, 17,242, 76,223,104,193, 97, 10, 96,
+ 84,216,235,134, 74, 34, 28,140, 1,103,129,138, 10,222, 98, 98,144, 97,201,181, 69, 43, 55,168, 10,109, 52,152,214,106,125, 48,
+199, 75, 13, 55, 32,165,155, 63, 82, 6,204,152, 44,152, 99, 52, 19, 18, 42, 0,128,116,168,130,170,197,228,128,163,225,154, 94,
+124,160,237,167,250,186,209, 20, 93,249,205, 47,180,192,156,180,166,131,243,148, 32,157, 40, 87,202, 93, 43, 88, 68,171,108, 45,
+254,114,174, 59, 51,101,193,202, 23,155,203,214, 65, 92, 2, 66,151, 35, 13,250,200,179,250,148, 53, 23,138,125, 44,197, 81,121,
+232, 68, 80, 53,118, 3, 70, 69,133, 90, 99,208,245, 61,156,210,208,242, 65,126,157,103,177,155,117, 29, 34, 19, 56,198,114, 80,
+ 72,222,125,146,136, 83, 22,120, 70, 89, 53,196,160,194, 61, 96,190, 62, 11,108,196, 74,250,218, 56, 12,216, 67,192,249,228,177,
+ 44, 11, 44, 69, 68, 24, 97,207,147,184, 31,122,239,225,187, 14,227, 56,212, 67, 58, 7,145, 24, 3,203, 70,149,174, 30,203,182,
+138, 66,157,128,251,243, 89, 34, 62, 53,178,145,140, 23, 91,139, 21, 47,117, 78,163,235,188,195,211,199,103,137, 72,181, 6, 79,
+ 79, 79,216, 67,130,161,132,117, 89,208, 15, 35,140, 51,176, 48,120,121,189, 0, 36,124,244, 20,119, 57, 88,140, 20, 49,187,126,
+254,222, 90, 77,104,203, 68, 52, 96, 85,174,188,240,226, 73, 16,206,251,166, 74, 91, 57, 0,230,121, 81,145,169, 28,128,251,190,
+ 2, 41,137,172,194, 24,204,203,138,193, 59, 44,203,138,228, 35, 60,123, 61,132,109, 25, 51,167,148, 74, 87, 42,224, 15,198, 52,
+120,248,110,192, 56, 14,178, 34, 9, 59, 94, 46, 27,122,239, 96,141, 20, 25, 41, 70, 56, 45,224, 58,239,145, 32,182,190,174,235,
+177, 44,215,146,142,213,105,118,251, 30, 4,246, 50, 12, 83,241,216, 3, 84,136,106, 12,224,231,191,250, 45,246,144,138,136,182,
+ 4, 31,106, 67,144,247,195,214,200, 36,199,169,128,210, 90,225,221,103,167,132, 33,117,204, 24,171, 93,123, 2, 82,194, 22,163,
+216, 57,245,241,219, 19, 23,222,251,224,157, 16,231, 84,102,148,119,192, 98,119, 10,213,191,173, 1, 42, 41,171,224, 89,162, 89,
+163, 10,136,243, 89, 18, 82,166, 48, 87,112,138, 76, 51,212,114,101,173,142,124, 19, 82, 22,129,145, 20, 45,206, 10,235, 99,244,
+ 61,188, 53,240, 42, 34, 28, 61,225, 89,163, 67,115, 62, 69,182,223,149,100, 53,178, 58,129,203, 81,210, 74,188,212,123,192, 58,
+121,174,114, 98, 94, 17,244, 25,186,241,193, 87, 23, 77,210,139,173,228,109,232,235,181,150,224,180, 67,207,168, 86, 99,242,216,
+ 95,119,232,153,216,166, 99,246, 18, 58,197, 4, 24,139,196,123, 19,204,101,202,207,224,210,229,155, 82, 40, 24, 99,240,238,237,
+ 35,206,231,179, 76,194,182,181, 98, 90, 91,113,157, 49, 5,168,149,163,118, 25,220, 0,159,196,174,150, 98, 40, 97, 56, 2,141,
+137,162,151,200, 64, 46,146, 66,192,169,240,213, 56, 1,215,132, 16,245, 89, 76,213,103,175, 9,109,169,113, 41,184, 70,250, 92,
+133,113,170,112, 63,224,228, 62,233,173,185,146,225,233, 86,221, 77, 34,214,226,198,167, 78, 53, 8,134,192, 53,136,135,234, 37,
+ 88, 46,207,164, 98, 0,174,158,204,172, 78,182,168,187, 22,214,177, 71, 32, 11,102,181,204,144, 21,117,188, 30, 20, 40, 65, 4,
+164,182, 60,110, 20,142, 84,254, 42, 35, 17,245, 24, 58, 83,216,188, 5, 84, 3,153, 70,100,213, 39, 49,142,187,152,166, 4, 34,
+206,226,183, 31, 96,244,105,189,147,138, 86,144,154,148, 54,100,116, 95,177,169,225,118, 15,157,175,246, 38,218, 84, 70,223,169,
+254,252,131,192,143, 15,185,192,242, 53, 75, 5,253,155,223, 67,153, 52,152,114, 97,107,189, 9, 62,204, 10,234,100,128,138,255,
+188,238,227, 81, 23, 24, 69, 63, 80, 46,116, 34, 24,174,169, 79,172, 93,188, 33, 70, 98, 3,211, 60, 33,165,120,160,202,122,239,
+156,195,114, 13,184, 46, 11,122, 37,221,157,166, 73, 14, 60,103,225,173, 19,239, 51, 68,153,252,248,248,136,159,253,231,191,131,
+239, 59,124,243,250,138,187,209,131,172, 50, 6,184,190, 71,249,160,245,190, 87, 6,127, 68, 76, 59,246,109,145,117,128, 42,126,
+159, 47, 50,234, 54,144,236,241, 53, 4, 56,157,243,137,192, 41, 33,194,192, 68, 21,101, 38,193,154, 94, 52,213,107, 28, 39, 60,
+189, 92,112, 62,157, 10,170, 50,169, 32,236,251,143, 31,228, 33, 86,245,249,208,123, 24, 59,224,114,189,106, 52,167,122,205, 59,
+175, 15, 63,176,108,130, 27, 61,159, 70, 24, 0,215, 53, 8, 94, 85, 71,176,227, 56, 33,134, 77, 71,220, 12,198,142,177,151, 73,
+ 66, 50,169, 28,152, 97, 15,176,142,176,133,173,116, 8,111,223,188, 1, 49, 11,162,214, 73,151,184,135,128, 93,237,165,211, 56,
+138, 98, 62, 70,164, 36,212,180, 93, 47,144,144,132, 30,199, 44, 86, 67, 24,131,113, 24,203, 56,244,229,245, 34, 54,181, 16,112,
+217, 22,132, 32,127,182,193,137,128,175,243, 78,133,114, 17,175,151, 43, 66, 8, 2,141, 81, 79,121, 70, 43,135, 16, 37, 46,151,
+ 58,172,219, 42,246,183,206,151, 66,138,201,192, 58, 3,214,201, 74,140, 17,214,121, 24,215, 33,174,175, 74,127,219,241,237,199,
+103, 60,207,235,113,173, 87, 37, 95,101, 36,204,153,158,153, 24, 33,227, 93, 51,171, 27,130, 24,181,170,122, 47,203,169, 24,133,
+174,199,146, 2,153, 52, 1,204,105, 12,175, 33, 96,221,229, 61,229, 66, 87, 83, 77,132,106, 44,160, 36,186,160, 42,232,164,186,
+149,168, 98,172,114, 97,229, 80,174, 28, 58,194,220, 8,174,204,241, 8, 50, 6,136, 25,240, 34, 66, 44, 97,216,147, 22, 23,114,
+209, 16, 0,111, 61, 78,157, 69,216, 55, 5, 34, 5,153, 98, 18,196,150,201,169,224,170,141,230,208,231,110, 57,165,236, 42,162,
+ 70, 28, 93,197,114,173,149,237, 56, 32,150, 63,139,173,193,225, 7,215, 77,123,161,147,145,209,187, 85,146,156,213,179, 60,139,
+ 13, 99,170,251,115,144, 41, 14,138,164,255, 87, 24,239, 2,147,191,225,186,203,197,126,119,119,194,105, 26,113, 58,141,218, 24,
+ 26,201, 46, 47, 59,110, 39,251,108,144, 20, 93,172, 29,116,206, 95, 55,186,102,205, 34, 98,107,193, 65,221, 8, 26,230, 82,236,
+123,186, 74,112,125,175,145,202,187,172,142,182,189,134,234, 40,195,162,146, 77, 77,113, 58,112, 42, 49, 40, 71,148, 31, 43, 25,
+ 77,121,254, 85,200,213,112,114,107,167,154,199,189,140,219, 88,152,172,248,171, 66, 5,249,251,195, 56, 62,127,224, 13, 25,173,
+ 77,118, 67,126, 45,186,247, 79, 33,194,192, 0, 73,118,130,206, 27, 92,247,204, 31,118,176,148,138, 55,212, 2, 37, 45, 74, 68,
+ 18,210, 41,178,134, 23, 56, 67, 88,169, 38,205,101, 21,113, 62, 92, 51,114,141, 75,241,194,229, 86,230, 76,197, 83, 62,114,161,
+ 40,193,128, 56, 22,241, 93,211,100,127,226,237,227,198, 69,145,218, 75,150, 27, 47, 59,223, 14,224,169, 8, 10,203,235,105, 32,
+ 15, 92, 98,109, 81, 82,218,184, 33,182, 85,145, 90, 22,237,181, 72,199,212,136, 18,185, 68, 50,230,191, 55, 89,104,168, 81,170,
+ 92, 18,156,244,243,207, 76, 2,189,180,145, 47,116,229,191,215,189,149, 28,142, 98,245,111,131,114,168,177,222,212, 3,105, 89,
+ 69,200,195, 49,128,147,197,235,229,138, 31,125,254,153,232, 30, 82,196,190,203, 20,102, 26, 39,252,234, 55,191,197, 95,255,226,
+151,216,150, 25,189,179,120,255,120,143,199,113,196,151,223,126, 13,151,253,190,134, 48,248, 14,211,244,136,235,245, 35,156,113,
+ 66, 41,235, 70,132,125,198,186,173,216,183, 25,206, 57, 44,123,238, 42,119,116,110,144,117, 1, 12, 44,137,103,116, 15, 17,253,
+ 52, 96,139, 1,243,229, 5, 60, 78,176,134,112, 93,174,226,219,246, 30, 3,100,197, 50,141,163, 10,157,116, 58, 3,134,247, 22,
+123, 96, 17,174,177,236, 24,147,146, 66,196,186,231,225,188,133, 51, 50,162,243,206, 35,196, 14,235,182, 99,210,233,206,188, 44,
+120,188, 31,113,189, 48,186,190,199,216,119,120,121,121, 21, 16, 11, 8,227, 56,194, 59,131,215,151, 87,116,195,136,187,243,157,
+ 88,191,156,151,238,221, 16,210, 34,208,154, 45, 68,172,235, 2,231, 60, 46,215, 43,184,239,101, 39, 15, 96,236,122, 12,227,128,
+215,215, 87,172,235, 86, 46,234,101,223,208, 57,135, 85, 71,154,222, 90,197,168,154, 34,120,114, 78, 46,223, 94,169, 90,203,178,
+170, 13, 78, 16,169,214,121, 64, 85,214, 49,137, 18, 61,165, 40,233,107, 74,119,115, 86,198,161, 33, 72, 46,124,208,209,255,186,
+202,123, 27,118,137, 17,117, 86,172, 99,156, 36, 58, 85, 10, 24,135,233,116,194, 58,207,114,161,179,100,148,255,246,123,225,186,
+231,120, 97, 99,126, 72,167,171,217,231, 58,233, 51,196,154,152,166, 29, 37, 52, 21,208, 58, 48, 68,132, 23, 57, 98, 11, 65, 17,
+173, 66, 20,203, 57,234, 57,161, 45,162,174,189, 92, 9, 98,162,162,116, 78, 44,123,122,177,246, 37,189,196, 43,207, 29,133,126,
+119, 75,130, 68,141, 83,165, 54,226, 57,143,176, 37,232, 39, 91,123,243,217,226,140, 8,249, 8,242,222, 58, 43, 22,198,193, 59,
+196, 24, 20, 78,147, 47,101, 91,202, 31,180, 56,213,140,171, 45, 54, 44,170,249, 19,250,125, 48,149, 30, 83,214,180,109,203,216,
+134, 84, 21,175, 54,213,252,114,217,165,219,162,254,206, 73,123, 69,155,165,151, 85, 98,189,212,181,153,200,251,250,152, 98,205,
+ 94,207,211, 66,125, 33,249, 66,207,184,217,105, 28,241,112,119,198, 52, 13,136,123,133, 20,145,181, 32,125, 46,200, 88, 24,215,
+ 73,113,135, 93,186,103, 67,232,250, 65, 73,115,208,108,244, 80,244, 98, 70,139,248,164,142,148, 76,200,203,228, 70,107, 93,113,
+ 5, 37,245,186,179,162,155,115,179,155,223,223,234, 41,167,154,220,198, 63,208, 83,102,223,157,252, 7,168, 94,198,133, 34,196,
+141, 62,162, 97,159, 51,223,216,211,143,105, 47,135,162,145,106,156, 41,103, 53,120,137, 9,171,188,239,146,135,155,201, 28, 72,
+ 48,150,208,105, 94,116, 22,102,113, 69,156, 43,151, 89,118,115,217,250,241, 63,252,143,255,147,190,124,177,166, 72, 14,114, 85,
+111,103,181,118,215,121, 56,107,114,241,166,163,122,170,153,230, 76, 69,169,151, 47,244,234, 66, 75,205,133,154,133,116, 12,106,
+ 40, 80,141, 52,173,136,240, 50, 65, 40,255,249,137,235, 4, 69, 74, 13, 46, 57,193,101, 23,146,154, 15, 84, 71,161, 37, 34, 55,
+143,229, 52,185,138,110, 84,120, 66,142,106, 34, 78,243,129,145,242,223,231,239, 68, 42, 32,137,212,172, 41, 50,191, 63,123,218,
+115,231,206,121, 79,158, 80, 99, 86,161, 24,218,124,232, 40,242, 61, 37,212,190, 40,171, 94, 83, 42,227, 37,232, 30,127,213,116,
+ 50, 2, 16,247, 13, 93, 62,216,245,203,111,141, 84,238,219,190,193, 24,194,239,125,246, 30, 63,122,247, 6, 68,130, 31,126,251,
+120, 47, 72, 78, 45,188,156,117,240,253,136,223,251,163,127, 12,107,189,240, 12, 0,132,184,195,184,190, 68, 38,118, 93, 47, 34,
+182,190,131, 51, 86,209,166, 66, 42,187, 59,157, 68,188,226, 28,152, 13, 58,215,163,239,122,188,121,243,128,203,245, 90,196,150,
+146,210, 68, 8, 44,163, 77,107, 13, 78, 39,185,100,239,207,119,176,190, 71,231, 7, 13,145,144,239, 73, 8, 81, 64, 32, 28,101,
+ 21,100,141, 70, 82, 74,103,214, 15, 39,201, 45, 15, 27, 56, 69,188,123,251, 22,211, 56,226,237,187,247, 50,102,205,223, 39, 34,
+220,157, 38,116, 78, 2,141,198,241, 36, 17,160, 49, 98,232, 59,128, 19,214,245,138,109, 93,208,121,135,125, 91,192, 49,192, 59,
+135,101, 93,240,112,119,134,239, 68, 81,110,148,136,246,242,242, 34, 57,228, 96, 17, 75,105,240,209, 22, 35, 58,107, 49, 40, 96,
+196,232,126,223,123,185,236,132,154,184, 97,221, 54,108, 33, 32,164,168,123, 68,131, 97, 24, 49, 77, 19,238, 79, 18,100, 49, 14,
+ 3, 12, 25,188,127,251, 86,126,191,113,234, 71, 54,112, 94, 68,113, 68,170,163, 80, 75,218,182, 74,132,235,160,123,115,231,228,
+240,247, 93, 39,211,133,105,146,239, 16, 17,156,122,224,127,254,219,111, 69, 36,168, 99,102,129,146,212, 85, 33,221,168,167, 69,
+ 22, 66, 37, 78,148, 20, 71, 74,214,195,250, 81,248,255, 49, 33,196,128,151,121, 69,136,154,205,173,233, 95, 70, 61,235, 25, 20,
+ 19, 82,158, 38,114,121, 54, 98,146,203, 59,234,218,107, 15, 17, 91,136,216, 83,157, 36,150, 51,179, 92,232,220,158,176,197,131,
+157, 74,215,192,199,213, 89,179,235,206, 19,136, 44,238, 10,170,195, 8, 81,248,255,162, 81, 49,138,146,214, 46,148,155,165,169,
+118,209,114, 70, 27,157, 54,208, 17,217, 90,136,104,168, 16,152,204,106,207,201,105, 89, 37,159,217,237,249,175,165, 99,150, 49,
+123,190,208,243,229,107,141,173, 28,117, 91, 87, 23, 34, 62,140,242,127,185, 91,135, 41, 66,105,100, 78,188,122,241,115, 8, 76,
+ 78, 87,179,198, 98, 28, 6,188,125,247, 6,247, 15, 15, 10, 41, 10,101,109, 36,175,213,170, 22, 64,120, 17, 12,134,243, 30,174,
+235,209,143, 19,134,105, 66, 63,142, 18,172, 20,130, 80, 82, 85,175, 50,158,207, 24, 38, 57, 67,160,249, 16, 48, 84,210,252,194,
+190, 99, 91, 86,196, 61,138,107,131,160,132, 68,215,248,251, 19, 18,107,140, 47,167,194,243,119, 57, 78, 51,143,115,137, 33,234,
+233,148,169,100,199,189,110, 91, 81,101,213,114,162, 6, 21,139,106,235, 58,240,209, 51,172, 32, 43,165,185, 41, 8,184, 94,152,
+212, 82,134,184,229,161, 23,127,153, 88, 76,136,208, 27,131,141, 9, 61, 81,185,144, 83,202, 68, 51,192,186, 30,113,125,213,177,
+ 63,225,127,253, 95,254,231,162, 56,239,156,197, 28, 36, 23,154, 90,208, 1, 1,221, 48, 20,142,243,173,206,141, 52, 17, 41,175,
+ 16, 14,177,115,121, 44, 79,244, 59,228,128,191, 67,211, 95, 4,111,101,238, 94,179,202,243, 16,132,169, 98,106,115, 4,171,169,
+ 85,121,173,163,210,113, 32, 64, 84,194, 34, 76,227,245, 68, 25, 66,181, 53,214,109,148,158, 81, 33, 91,134, 98,152, 82,120,149,
+ 98,239,134, 28, 69,168,138, 92, 82, 52,173,252,206, 74, 40,226, 92,180,148, 61, 89,182, 42, 54,239,105,202,241,139, 40,164,176,
+109,223,241,238,124,143,247,159,125,134,206, 59, 85, 14,203,184,119, 94,100, 71,154, 98,196, 79,255,234,175,241,238,225, 30,159,
+191,121,128,179, 22,203,178, 96, 28, 70,108, 33, 40,180,132,176, 44, 11,206,247,247,242, 46,236,155,106, 14,162,160,120,137, 48,
+ 95,159,229, 1,113,210,181,216,210,217, 16,194,118, 69,180, 26,149,185,206, 0, 34, 18, 44,134,113, 16, 75,150, 53, 32,235,112,
+157,175, 72, 49,193, 88,135, 1, 9,100,123, 0, 81, 59, 74, 96, 89,103, 24,227, 0, 36,236,123, 44, 1,199,224, 0,103, 29,140,
+ 38,174, 25,147, 48,246, 82,213,175,203, 85, 58,232,196, 24,186, 17, 32, 89, 67,204,203,130,161,239, 17, 99,194,186, 46,146, 88,
+ 55, 12,232,251, 1,204, 17,235,182, 1,156,208,251, 94,186,225,152,176,174, 43, 0,153, 18, 88,223,129,149,129,255,225,227, 51,
+188,179, 8, 90, 20,231,221,226,243,245,162,162, 57,233,186,150,117,171, 16, 20, 34, 68, 78,176,218, 9,177,134, 79,156,250, 14,
+ 49,236, 48,198, 10, 5,110,223,133,125,221, 9,118,215, 24,139, 45, 36, 76,125,135, 24, 3,136,128,203,245, 90, 68,139, 68, 6,
+ 91, 88, 0, 35,250,133,101, 93,225,140,149, 66, 67,129, 49, 49, 38,144,183,101, 10,144, 5,176, 93, 55, 96,143, 1,143,143,111,
+ 20, 74, 35,151,195,203,203, 51,126,246,243, 95,203,152, 91,161, 53,204, 81,108, 71, 68,135,243,199,232,243, 19,184, 34,123,101,
+231,169, 33, 49, 36, 48,153,160, 33, 50, 98, 95,146,159,159, 7,250, 50, 74, 39, 21,199, 37, 89,169,100,213, 81, 98,236, 36,129,
+ 52, 28, 83, 41, 82, 50,185, 46,159,185, 73,139, 3,171,222,119, 98, 65,195,230,209,114,233,220,243,132, 83,132, 49,117,186,215,
+112, 33,178,221,139, 85, 8, 71, 16,216,204,186,111,170,192,207,246, 84,113,121, 88, 43,250,139, 93,227,163,133,119, 47,129, 90,
+104,211, 60,179,240,142,101, 52,207, 57,141, 44, 55,115, 13,159,254,102, 44,123,240,184,163, 36, 56, 82,211,181, 27, 97,227, 27,
+215, 92,232, 85, 28, 7,237,196, 51, 66,149, 19, 11,116, 44,197, 50, 33,200, 83,204, 10,180,169,214, 49, 99,107, 40,140, 49, 6,
+253,208,225,221,187, 55, 56,159, 38, 56,103,193, 28, 85,106,150, 21,252, 14, 48, 73, 4,106,251, 10, 56,135,174, 63,195,247, 61,
+ 98, 22,194,129, 17,118,105, 72, 98,144,169,153,245, 94, 35,152, 69,192, 25,131,124,231, 3,133,122,247, 17, 36,194, 53, 74,108,
+113,177,235,169, 46, 34,133, 84,239,150,212,104,218, 89,214,205, 46,169,196,191, 96,230,114,206,121,246, 58, 83, 77, 16,147,139,
+185,233, 12,111, 8,103, 68,124,136, 96, 61,100,167, 83, 93, 40, 19, 53,150,173,196,101,115, 91, 58, 97,237,252,248,224, 2,171,
+ 18, 70, 1,244, 11, 47,205, 24, 3,116, 14, 70,195, 48, 72,173, 84, 41, 49,252,208,131,232, 2, 6,240,249,143,127,130, 95,253,
+226,239,208,235,206,142, 57, 97,221, 2,172,119, 69,141,157,159,139,168,182,147,146,211,219,224,109,153,154,137, 68,222, 91,183,
+ 59,184, 50,210, 62,170,226, 9,255,223,255,203, 32, 26, 99, 26, 42, 92,177,206,149,100,155, 67,160, 14, 39, 86,190,123, 86,179,
+241, 15,153,218,203,123,223,166, 73, 37, 21,119,165,116,244,231,231, 66,172,236,230, 15,235,184, 84, 58,117, 89,190,105,190,242,
+225,251,145,127,157,209, 48, 25,201, 81, 47, 66, 56, 80, 3, 28, 74, 72, 17, 7,251, 36,103,255,174, 32,242,202,161,136,176,225,
+ 60,246,136,249,191,211,196, 26,166,148, 48,207, 51,254,221,223,254, 2,127,240,197,231,120, 60,159,240, 15,126,255,199, 0, 9,
+135,221, 24,194,233,122,197,199, 23,217,127,145,117, 0, 89,252,223,127,241,127,202,238, 60,119,141, 26,100,146,247,170, 40, 72,
+ 77,130,215,125, 97,220,165, 90, 95, 87,137, 7, 61, 79,103,196, 16,241,248,112,198,164,137,109,247, 15,119,184, 92,103, 76,195,
+136,231,215,139,140, 86,157, 4,118,128,228, 98,155, 78,103,236,235, 12,107, 45,246,224,208,247, 30,137, 13,150,117, 69,138,114,
+201,120,231, 48,175, 43, 34, 11,193, 78, 20,228, 61, 78,206,227,114,185, 32,165,128,126, 24,240,250,250,130,101,219, 75, 30,131,
+115, 14,119,231, 73, 47, 27,185, 88, 62,123,247, 94,212,190, 0,214,101,193, 58,207, 24,134,190,208,236,174,203, 6, 50,130,136,
+133,130, 96,182,176, 99, 89, 55, 12,125,143,190,239,241,238,237, 91, 92,175, 87,233, 58,246, 29, 49,202,120,123, 28, 58,108,123,
+196,190,239, 88,195,174,129, 46,178, 58,128, 58, 60, 50,113, 48,197,168, 42,247,161,228, 87,247,157, 67,208,194,106, 11, 65,124,
+241,125,175, 24,205, 21,222, 90,244,125,175,157,100, 64,127, 18,235, 94, 12,146,104,229,189,199, 56,142, 10,222,145,157,187,243,
+190, 8,182, 86, 85,185,147,247,136, 49,225,223,255,167,159, 23,151, 67, 78,102,204, 90,153,188, 54,202,156,139,188, 8,180, 25,
+111,106,140, 92,102,182,147, 78, 13, 9,215,235, 69,213,207, 9,206,100,180, 41, 10,134, 84, 2, 89, 12,214, 32,194,185,146,108,
+169,126,108,103,197,147,110, 21, 91,237,172,140,175,131, 94,242, 81,199,245,166,116,114,218,209, 35,143,152, 81,198,240, 49, 53,
+169,145, 41,119,233,162,184,205,234,115,106,154, 14, 86,202,230, 22, 3,230,149, 52, 91, 93, 82,228, 50, 87,222,154, 30,189,119,
+152,183,189, 32, 75,115, 16, 77, 14, 71, 49,101,173,103,170,191, 28,237, 90, 50,251,175,155, 53, 64, 89,108,226, 56,110, 55,117,
+172,159, 57, 33,148, 47,114,107,224,140, 41, 90,134, 98,201,229, 10,103, 73,234,228,200, 5,168,156, 87, 42, 5,110, 34,102,203,
+164,160,116,221,226,247,238,251, 30,111, 31, 31, 48, 14, 3, 58,239,148, 22,104, 85, 72,105,116,245, 0, 32,133,230, 62,203,107,
+ 78, 41, 36,194,182, 97,213, 53, 74,107, 7, 5,203, 51,176,238,187, 60,143, 41,202,180, 48, 79,106, 52, 70, 24, 32, 45, 92,109,
+ 89,201, 36,229, 22,148, 8,240, 60,141, 97, 58, 0, 71, 93,139,226,228,236, 91,204,152, 62,170,251, 6, 78,121, 71,174, 42,240,
+198,155,156,247,163,156, 47,247,214,190, 70, 92, 69,119, 13, 2,245,144,246,213,144,231,202,165,149,227,254,138,141, 46,147,223,
+ 42,132, 33,104,101,109, 75,162,145, 28,206, 25,122, 79,174, 87,240, 2,227,205,251, 31,225,183, 95,254, 90, 34, 23, 19, 99,213,
+139,223, 54,170,251,220, 25,164,152,244, 75, 67, 13,251,134,235,254,231,128, 7,110,190,148, 77,218, 30,231, 78,158,141, 38, 27,
+161, 1,190, 52,243,122,206, 89,182, 85,144,211,110,245,152,179, 71, 60,219, 79,212,107,154,181,104, 77, 92, 49,181,155, 64,190,
+ 37,249,112,233,244,179,192,177,133,201,180,251,246, 76,184,171,197, 73, 86,135, 86, 94, 51,184,118,235, 37, 54,209, 52,198, 9,
+164,170,176,215,239,208, 81,118, 87,247,242,100,184, 38,247,193, 52, 90, 4,221,113, 42, 59,158, 40, 97,210,139,104,200,202, 80,
+ 34, 88,103, 49, 2,120,243,240,160, 17,160, 27,150,117, 67,215,249,226,233, 44,170,100,223,233,126, 45,226,143,254,248, 79,241,
+155, 95,255, 28,151,215,239,149,252, 37,187,220, 2,245, 48, 14,214,238, 96,178, 88, 35, 99,244,114, 40,156,167, 17,119,100,176,
+ 71,198,186, 94, 97,199,123,172,203,142,181, 95, 65, 36,234,240,211, 56,225,245,245, 5, 72, 1, 93, 55, 97, 15,123, 65, 77, 14,
+125,135, 61, 72,183,123,157,231, 2,223, 97, 4,120, 75, 88, 35,195,119,131, 36,169,113,132,183, 29,250,190,195,135,167, 39,108,
+187, 84,239,172,224, 39, 81, 72, 27,220,223,221, 97, 86,220, 43,129,225,157, 23, 37,242,182,225,241,254, 36,124,106,157,200,197,
+ 20,209,249, 14,150, 32,129, 47, 20, 36, 81,173,243,130,189, 36, 41, 46,242,168,179,239, 58,128, 25,151,203,165, 68, 86,146,118,
+206, 99,215,193, 58,139, 24, 34, 34,145,124, 62,154, 75,190, 46, 43,186,206, 97, 94, 55,137, 49, 86,216,199, 48, 14,210,237, 88,
+192,145,193,190,111,232, 6, 47, 30,248, 78, 46,231, 18,203, 11, 8, 80, 38, 72, 7,220,121, 95,152, 1, 32,194,249,124, 46,171,
+192,125,223,181, 56,215,196,170, 20, 69, 55,160,107,128, 20, 19,254,252,167,255, 65, 85,227,169, 62,187,212,230, 13,228, 9,145,
+ 30,158, 5,197,106, 0, 35, 19,141,204,128,216,182, 5,123, 8,229, 82, 54, 4,108,145, 75, 24, 79, 46, 42, 72,189,234,217,246,
+196,205,254, 59,135,152, 48,128,125, 23, 84,239, 30, 83, 25, 27,155, 36,214, 55, 67,226, 71,222, 98, 44,226, 78,102,161,209,101,
+178, 96, 42,124, 44,170, 35,247,148, 87, 49, 53,245,177, 29,195,203, 47, 55, 8, 12, 92,183, 93, 21,214, 17,169,247,106,237, 53,
+240, 62, 98,234, 59,124,188, 92,229, 60,167,234, 70,146, 66,163,250,225,179,117,214,220, 64,170,202, 37,170,180, 54, 16, 53,169,
+153, 84, 26,166,220,173, 23, 29,150, 10,251,242,222,220,105, 56, 75,205,132,160, 66,183,203,218, 33, 33,196, 37, 29,137, 55, 0,
+ 49,147,155,217,212,188,126, 91, 33, 61, 86,188,232,217,186, 38,246,181, 88,198,244,217,204,155,239, 3, 99, 12,200,119,122,198,
+ 48,182,249,138,176, 45, 50, 85, 81,156,111,142, 75,205, 8,219,220,129, 67,221, 16, 89, 46, 40, 59,247, 88,138,183, 50, 93,224,
+140,242,210,105,102,224, 90,168,100, 59, 29,177,232,196,178, 62, 3, 74, 85,203,221, 57,183, 93,104, 74, 21, 34, 66, 77,124,102,
+ 66, 25,179,100,155, 84,226, 31,140, 98, 43,151, 71, 74, 98, 69,184,145,115,171,232, 74,146,180,132,210, 73,133,242, 86, 18,180,
+168,185,111, 56, 41, 42,128, 52, 12, 69, 68, 40,150, 9,145,229,103,108,187,216,109, 92,215, 21,223,249,182,109,165, 58,246,206,
+ 98, 94,163,232,197, 57,149,145, 85, 82,101,173,128, 32, 12, 14,177,116,168, 36, 61,210, 98,227,216, 14, 87,123, 91, 17,124,229,
+149,194, 45,250,149,240, 9,137, 9,220, 4,220,228, 91,187,196,248, 85,254,124,155,207, 90, 49,179,199, 88,216,255,223,255,181,
+ 43, 23,170, 67,119,110,249, 4,205, 24,178, 22, 29,199,156,120,161, 36,229,176,133,234, 18,104,167, 52, 68, 56,250,224,179,199,
+ 61, 11, 78, 81,244,117,197, 37,193,104,166, 62, 58, 58,244,106, 89,241,234, 45, 15,251,134,126, 24,224,172,195,245, 58, 99, 94,
+ 22,252,242,203,223,224,110,232,241, 39, 63,249, 76, 46, 34, 0, 41, 69,120,107,112, 62,159, 96,191,127,130,177, 14,251,190,203,
+ 72,122,185,226,243, 31,255, 33,126,254, 87,223,105,101, 47,214, 47,164, 4,178, 22,127,240, 39,255, 37,254,242, 63,254, 91,196,
+196,232, 44,138,119,248,186,238,232,172,218,154,188,216,175,174,251, 6,115, 93,244,123, 96, 48,175, 27, 58,111,209, 15,163, 88,
+138,172, 71, 76,162,142,206, 22, 49, 16,193, 58,177,123,205,235,162,170, 98,131,105,234,225,189, 28,190,243,188,128, 72, 46,255,
+243, 48, 10, 50,148,129,206,122, 37,142, 1,211, 52,136,104, 76,187,203,196, 9,203,178, 96,217, 54,220,223,221, 97, 91, 69,169,
+158,225, 22,167,113, 68,136, 1,151,235, 82, 88,244,114,184, 49,182,101, 17, 34, 91,140, 5,117,250,244,242, 34, 32, 21, 0,155,
+134,174, 12,195, 80,240,178,121, 61, 49, 24,161,233,145,177,152,151, 5, 96,198,117, 17, 66, 92,190, 70, 30, 31, 31,203, 42,131,
+ 1,172,235, 2,239,122,165,187, 65, 98,105,195, 14,195, 70, 19,231, 58, 92, 46,151,162, 17, 25, 70,205,255, 6, 99,232,122,108,
+219, 86,196,115, 89, 29, 47,151,232,142,174,235,117,221, 98,224,188,199, 95,252,244,103, 18,220,129,234,237,174,157, 96, 45,170,
+179,234,186, 40,161,157,215,184, 77,104,119, 21,176,169,128,216, 24,131,117,143, 50, 66, 85, 81,240, 22, 83, 77, 79,203,207,181,
+170,235,161, 68, 51,163, 69, 67, 72,245,249, 54,134,176,134, 40,206, 3,237,220, 73,221, 71,137, 24, 33,164,166,216,231, 82, 32,
+196, 44,188,108, 38,110, 45,190, 83,154, 29, 85,168, 83, 73, 70, 62, 60,203, 89, 9,158,146,164,149,101,237, 84,239, 61,250,232,
+ 48,168,197,145, 90, 44,118, 81,166,215,211,220,182, 65, 23, 45,205,173,201, 75,135, 90, 5,185,129,215,180,127,165,134,187,158,
+ 11, 7,103,108,209, 85,212, 85,109,123,161, 75, 39,155, 97, 78,104, 68,131,108,164,160,162,132, 27,109, 1,149,162,202, 88,139,
+ 97, 24,240,238,221, 91, 81,187,159,207, 50, 5, 84, 81,166,136, 23, 83,225,249, 51, 3,198,249,114, 22,165, 20,228, 28,212, 20,
+172, 76,182, 19, 2, 31,107,140,172,174,154,213,238,150, 5,131, 41, 99,106,153,133,233,160,205, 16,115,130,104,241,162, 54,214,
+210,172,214,112, 29,148,220, 1, 52,105, 31,174,126, 9,242, 46,134, 11,209,171,160,250, 32, 95, 74,210,191,242, 77,202, 14,171,
+120,130,154, 24,210, 35,199, 61,213, 49, 87,179, 39,201,166, 47, 50,226,247,204,197,185,209,139,157,180, 99,207,223,147, 2, 13,
+ 41, 76, 92, 66,103,101,172, 37,194, 19, 86, 57,191,252,255,214,123, 56,231,240, 95,252,217, 63,195,127,248,247,127,161, 34,164,
+132,206,139,157,168,235, 28, 76,115, 57,178, 34, 29,203,151,189,217,239,211,205,126,253, 22,103,123,168,103, 50, 17,141,203, 80,
+ 94, 11,130, 58,108, 42,102, 53, 13,129,169, 5, 3, 55,235, 18,174,225, 46,124,116, 6, 80, 9,193,107, 33,255,116,144,218, 19,
+ 90,148,227,177, 0, 33,224,200,112,207,151, 54,253,208,214,191,238,244,179, 31, 54,131,101,242,196,198, 52,221,255,167,172,223,
+ 58,233,224,134,130, 85,153,186, 50,162,167,140, 32, 46,217,238,245, 0, 51,106, 27,154,215, 13, 33,236,152,198, 1,215,235, 5,
+227, 48,226, 23, 95,126, 9,239, 28, 62,127,247, 14, 95, 60,222,163,235, 59,188,188,188,160,239,122, 61,224,163, 28,236,206, 35,
+197, 93, 30,192,148,224,125,143,126, 58,137,133,196, 88, 21, 70, 18,146,250,217,191,253,250,215, 34, 2, 91, 5,104,228, 12, 97,
+ 11, 12,107, 2, 0, 11,231, 60, 44,203,118,244,225, 52, 97,156, 38,124,246,254, 45,172,115,120,126,126,198, 60,139,232,168,115,
+ 22,195,120,130,247, 86, 2, 36, 20, 28,115,189, 94,209,117, 61,140,113,186,251,223,176,199,128,209, 91, 17,203, 45, 51, 18, 3,
+167,161,199, 64, 61,214, 77,160, 49,222, 0,219, 30,145, 0,140,195,132,125,219,113, 93,132,142,215, 57,135,121, 77, 88,214, 5,
+222,121,241,119,199,128,190,235,225,157, 4,159, 48, 39,172,151, 80,160, 48,219,182,227,117,121,193,121, 28,139, 16,168,239, 58,
+116,189, 36,157, 57,235,144,144,224,157,136,224,214,117, 5,136, 17,246,132,157, 3, 46,151,171,210,234, 8,243,186,105,186,161,
+116, 94, 70,199,220,227, 56,160,239,123, 88,235,196,234,100, 13,194,190,149,176, 24,163, 44,128,204, 27,112,206,149,159, 37,172,
+128, 84, 38, 47,210,129, 75,113, 70,186, 55,142, 57, 28,136, 80,246,234,121,170,231,156,195,191,253,233,207,176,228,105, 69,217,
+157, 27, 69, 90,152, 67,172,130, 41,162, 41, 87,163, 98,227,142, 61,213,152,215, 92,188, 7, 93, 7,154, 44, 41,213, 54, 58, 22,
+163,148, 80, 9,179,133,177,164, 83,230, 72, 87,212,241, 29, 51,149,149,132, 81,110, 64,190, 60, 83,168,172,247, 92, 32,100, 27,
+ 27, 55, 82,100, 99,140,126,198,249,153,205, 77,149,184,130,138, 24, 87,159,195,148, 82, 45,104, 20,195,157,152, 64,219, 94,158,
+241,206, 57,141,131, 38, 93,151, 53,231,134, 90,199, 68,213,126, 92,155,214,243,191,238,197,243,251, 43, 9,174,109, 87,142,131,
+173,149, 90,144,140, 10,230, 72,115,212, 91, 47, 16, 39, 46,161, 39, 41, 69,157,142,180, 10, 96,109,152, 56,171,224,179,125,171,
+254,207, 90,139,105,156,240,246,237, 3,206,119,103,156, 79, 83,105, 98,140,213, 48, 33,142,101,210, 42,234,118, 13,183, 77,177,
+230, 22,232,107,203,250, 47,110, 92, 60, 53, 67, 0,205,218,154,138,207,156, 72,196,176,100,244, 51,210,140,247,226, 40,144,222,
+ 87, 62, 47,174, 18,230,204,138, 48,156,202,245,238, 82,189,189, 85,249,220,194,102,248,144, 24, 83,147,182,210,193, 74,197, 45,
+170,156,110, 5, 91,138, 12, 84, 91,129, 57,146, 82, 11,189, 76, 88, 6, 92, 98, 94,107, 20,106,245,133, 37,229, 22, 59, 91,145,
+136, 65,197, 35,134,129, 0, 70, 12,242,218, 67, 2,124, 55,192,247, 3,254,233, 63,255, 23,248,233,159,255, 27,165, 85,201,168,
+108,217,163, 48,187,117, 20, 19,243,155,167,221, 9, 55, 81,169, 21,206, 1,207, 8, 66, 0, 0, 31, 18, 73, 68, 65, 84, 83,175,
+228, 12, 80,160,223,177, 33, 47,176, 22,131, 31,228,231,213,132,153,102, 44,223,242,220,233,144,116,138,102, 83, 86, 99, 87, 81,
+133, 60,213, 74,118,188, 74, 75, 44,108, 67,151,107,187,243,246, 87,211, 15, 94,198,181,248, 56, 70,204,102,228,133, 24,214,184,
+101, 29,128, 15, 56,161,124,102,230,104, 85,131,106,244,175,126,122, 42,197, 80, 30, 23,230,200, 87,161,137,201,151,127,143, 1,
+167, 97,146,184, 76, 43,162,153,135,187, 59, 73,226,138,223,224,235, 15, 31,241,197,219, 71, 9, 35, 9, 17,195, 56, 2,203, 6,
+ 80,196,232, 45,158, 47, 75,241,154,126,245,213,175,240,230,221,143,139, 54,209,105, 32, 13, 89, 3,195,140,249,242, 36,145,148,
+219, 43, 82, 76,216,148,204, 70, 96,244, 93,143,161,243, 18,184,226,140,226,145, 19,158,158, 94,208,247, 30, 67, 63, 96,221, 86,
+133,168, 4,172,235,130,152,188,116,143,138,242,188,191,127, 68, 74, 65, 46,240,109,195, 30,119,124,241,197,143, 4,162,178,110,
+ 56,223, 61, 96, 15, 81, 64, 42,104,193, 65, 14,140,136,206,146,132,178,120, 91,226, 75, 95, 46, 51, 58, 47,228, 41, 71,178, 23,
+ 31,250, 14, 33, 6,244,125, 15, 38,131,215,151,103, 81,198,159, 79,248,248,244,132, 61,136,160,205, 25,131,192, 22,235,182,192,
+ 91,139,167,231, 23,156,207,103,156, 79,167,242,158,229,227,244,114,157,165, 3, 79, 9,167,105, 44,197,215,216,123,172,219,142,
+ 85,115,162, 9,194, 70, 95,150, 69, 2, 87,166, 19, 98, 20,136,134,115, 22,227, 56,214,206,159,128,113, 28,203,202,109,221, 86,
+ 44,203,138, 24,165, 0,233,124,135,160,140,121,129,144,152,146, 40, 54,244, 3, 66,144,176,152,160, 69,140,243,146,148,246,211,
+191,250,107,172, 10,106, 49,138,110, 45, 97, 39, 55, 93,161, 83,244, 40, 52,217, 76,198,165,161,100, 21,100,115,166,205, 29,158,
+ 66, 78,146, 78,230,168,132,236,112,225,156,147,145, 98,174,245,101,179,254,243, 34, 60,212, 75, 95,238,105, 3, 86,144,137,160,
+ 63, 21,188, 85, 45, 72, 5,222,146, 26,234,103, 22, 41,138,162,187,133, 66,213,194,161, 77, 35,203,141,218,141,178, 22, 9,192,
+ 22, 18,136, 52,125,111, 19, 1, 93,231, 44,150,180, 23,181,119,228,132, 94, 47,179, 84, 38, 17,181,232, 41,244,182,102, 12,111,
+168, 17,196,181, 41,148,205,186, 45, 95, 78,217, 39,110, 26,230, 59,105, 94,134, 40,252,213,171,175,130, 56, 46,233,107,106, 79,
+164,230,250,207,197, 75,179,254,200,152,218,243,249,132,135,251,123,156,207, 19, 78,211, 36,223,135, 4, 36,142,170,170,183,136,
+ 1, 5,252,195,166, 82, 57,147, 6, 3, 25,103, 21, 48,147,138,144, 49,243,248, 73,163,111,141,211,220,243,176, 87, 58,186,134,
+ 72,177, 22, 30,153,118,136,227, 82, 90,254, 91,204,117, 37,106,106,204,183,105,222,123, 6,224,114, 85,147, 82, 53, 70,112,170,
+224,153, 18,197,209,168,213,137, 53,213, 44,239, 86,213,166,129, 28,248, 82,246,168,117,156, 92,118, 46,141, 5, 75, 53, 84,149,
+159,206, 77,196, 94,249,204, 77, 65,207,108,235, 94,170, 47,107, 85, 36, 21, 19, 58,239, 0, 11,120, 24,132, 32,202, 94,178, 14,
+253,120, 66, 63, 78,248, 63,254,247,255,173,238,201,152,177, 51, 43,208,129,203, 56, 51, 95,208, 18, 20,224, 10,250,241,182,219,
+ 68,147,251, 75,191,107,230,221, 96, 83,139,198,128,110, 46,244,230, 61, 74, 21,244,168,117, 13, 29,187,241, 92, 32,229,202, 92,
+211,244,242,195,146, 88, 47,214,131,230,190,197,217, 82,209, 2,148,135,200, 84, 58,221,173, 10,245,214,222,152,242,202, 33,179,
+219, 27,149, 45, 39, 70,178, 57,198, 85,138, 54,250, 36,122,166, 22, 66,109,132,239, 81,111,223,140, 68,111, 74,139, 61, 70,116,
+142,176, 94, 47, 56, 15, 29,190,249,240, 17,211,249, 12,171, 84,184,169,247,248,127,254,211,223, 32,110, 11,222,222,159,177,135,
+160,108,106, 86,154,149,240,207, 7,111,241,210,168,240,215,249, 21,215,203, 83,249,110,167, 40,130,168, 44, 96, 50,214, 96, 24,
+ 79,120,122,185,168,183, 62, 32, 68,194,253,121,144, 80,150,121, 17, 23,197,158,112,238, 12, 98, 4, 76, 39,223,165, 61,132,114,
+240,159,239,238,203,106, 37,196, 36,221,168, 35,108,187, 20,199,203,186,128,140,208,219, 94, 95, 94, 68,176, 54,140,184, 92, 47,
+162,104, 15,162, 94,191,187,187, 23,122, 27,106,156,166,119, 14,190,115, 88,215,103,217,193, 90,139,144, 18,186,126, 64, 63, 12,
+184,155, 70, 24, 67, 88,214, 21, 33,236, 88,183, 13,125,223, 97, 93, 87,124,243,221, 7,133,184, 68, 24, 18, 16,205,188,110, 2,
+211,177, 22,159,127,246,153,128,103,214, 21,175, 87,233,198, 67, 12,146,101,175,164,175,243,249, 36,227,113, 21,133,109,251,142,
+ 45,136, 8,168,115, 78, 99, 82,229, 18,158, 78, 39, 56,107,209,247, 30,251, 30, 48,207, 87, 25,201, 63, 60, 0, 32,108,219, 10,
+132, 32, 29,151,230,154,119,189,199,190, 19,166,105, 44, 88,101, 3,201,153,103,146,117,128,181, 14,235,182,105,106, 30, 97,236,
+188,248,202, 67,196,207,254,230,151,226, 23,215,209,126,182, 80, 81, 35,216,202,227, 82,103,189,140, 70,213, 26,148,195,134,136,
+220,161, 80, 55,250,220, 24, 83,119,241,217,102,196, 96, 5,100,213,148,195, 24,147, 80, 1,203,106,179,249,247, 58, 25,204, 23,
+130,165,154, 88,152, 95, 27,140, 90, 83, 97,138,157,148,218, 32,166,195,142,222, 22, 87,210, 97, 2,219,216,221,140, 54, 89,197,
+ 77,211, 90,104,115,103, 15,198, 22, 19, 8, 1,243, 38, 97, 74,222, 89, 44,123,128,105,210, 20,161,239,167,117, 85,125,222,138,
+225, 36,244,172, 33,142,154, 6,220, 65, 45, 65, 52,223,130,242,123,108, 38,186,153,106, 91,206, 36,211,220,220,101, 49,156, 8,
+227,162, 94,164,124,104,128,154, 68,237, 34, 46, 43, 8, 47, 34,220,223,159,113,119, 62,225,116,154,112, 58,157,165,232, 83,171,
+152, 76,160, 13,194, 46,133, 99, 73,152,211,134, 50, 79, 46, 10,179, 37, 85,155,119,106, 70,228,229,175,170,127, 0, 71, 45, 96,
+ 76, 21, 41,171,128,174, 93, 13, 84,132, 48,202,251, 88,162,186,155,137, 46,163, 21, 24, 2, 46,101,249,115,249,144,142, 97, 26,
+ 92,192, 32, 92,128, 41, 92, 70,173,169, 8,219,228,135,235, 5,147, 95,108,131, 49,229, 50,150, 54, 5,183, 74, 77,151,137,198,
+ 2,126, 68,159, 42, 79,150,228, 15,237, 77, 38, 22,169,158, 46, 11,119,138, 53, 12,136, 0,250,174,199,221,253, 3,190,253, 13,
+225,229,245, 73,196, 55,168, 65, 38,206, 16, 54, 37, 30,229,209, 19,114,145,208,185, 67,165,116, 16,149, 52,209,105, 84,116, 6,
+205,245,213,100,201,114,179,143,166, 6,150, 94, 60,254,249,131,203, 23, 93, 66,217,195,215,168, 88,110,134,233,220,180,238,212,
+212, 7, 85, 92,152, 63, 78,211,190, 98,250, 29,123,252, 3,184,160, 13,215,249, 52, 72,167, 88, 19,243,230,134,107, 0, 12,116,
+114, 96, 90,165,127,238,108,110,168,118,200,255,172,252, 25,171,152,168, 0,104,218, 43, 95,185,212,243,182, 99,236,122,252,246,
+219, 15,120,152, 6, 60, 61, 63,227, 60,141,120,157, 87,124,249,213,215,216,214, 5,255,224, 39,159,171,154, 88,148,170, 49,138,
+221,146, 99,192,208,117,152,198, 17,252,241,169,164, 55,197,148,240,221, 55, 95,138,215,152,160,196, 64, 5,127,232, 30,204,169,
+143, 20, 68, 24,198, 30, 32,139,176, 71,128,119, 33,160,245, 29, 24, 66,162,147,145,188,140,171, 55, 85,183, 62, 60, 62,162, 31,
+ 70, 77, 32, 11,194, 16,167, 14, 33, 70,201, 19, 79,178, 87, 63, 77, 19,150, 69,198,241, 32,194,243,235, 51,238,207,247, 72, 49,
+ 96, 89, 23,156,166, 9,251,190, 98,221, 2,222, 60, 60, 2, 96,188,190,190,168,175,120,135,243, 29, 58,146, 29,222,188, 44,240,
+206, 97,236, 28, 98,140,152,151, 13,214,245, 24,198, 17, 33, 70, 60,191,188,106,230,184,215,252, 10,131,203,124, 45, 69, 87,223,
+143,184,191,191,199,190, 73,196,235,188,109,101,143,234,172,197,148,173,101,206,226,229,229,165,196, 77, 70, 45,134, 88, 89,252,
+167,105, 40, 19,191, 97, 24,208, 26, 31,129, 4,239, 29,188,115, 24,186, 94, 83,214,228, 25, 93,230, 69, 68, 96,170,110, 63, 77,
+ 83, 57,111,146,162, 82,103,157, 6,120,235,132, 47, 96, 12,162, 79,106, 21, 18,145,210, 95,254,237,175, 68, 83, 99, 44, 78,227,
+ 25,159,189,127,123,240,131,103, 71, 72,198,195,198, 36,158,224,148, 12, 16, 67, 19, 48,226, 26, 38, 19,215,240,149, 6,158,117,
+ 76, 18,195,225,124, 51,182, 57, 63, 18,127, 50,150,181,153,169, 79,212,132,142, 80, 89, 45, 24,102, 36, 52, 99, 89,237,216,147,
+ 70,169,150,132, 72,109, 15,179,189, 44,198, 88,196,197,249, 0,202, 41,111, 89,137,157,211, 46,185, 48, 66,170, 11, 42, 38, 96,
+ 69,130, 91, 55,112,231,213, 66,166, 24, 86,189, 12,114,225, 2,189,112,217,164, 2,232,104,157, 75, 69, 8,119, 48, 20,213,248,
+215,156, 99, 97, 85,103, 85, 25,238, 71,221, 81,158,108,164,134,176,151, 50,223,226, 48, 39,204, 1, 83,212,252,243,220,229, 10,
+134,245,225,254, 14,167,105,196,249,124,214,239, 39,151,137, 32,235, 56, 63,134, 80, 3,203, 74,206,123, 22, 61, 82, 61,207,152,
+139,237,173,164, 95,150, 59,178,158,129,164,194,196,124,166, 39, 69,239,230,247,239, 72, 44,107,177,165, 26,212,149, 27, 69,110,
+238, 10, 82,203,176, 54,173, 14, 69, 97,151,133, 94, 55,240,152,102,234, 87,189,109, 64,202,187,224,146, 6, 36,187,221,164,163,
+ 14, 83,236, 14, 56,140, 98,179,127,207, 20,175, 20, 55,133, 1,129,217,192, 24,174,232, 68,237,230, 89,199, 69, 22,212,140,171,
+229,129,204,100,167,252,243, 35, 8,190, 31,113, 58,223,131,163,124, 40, 57, 29,170, 38,159, 81,121, 72, 80, 72,105,242, 26, 69,
+100,101, 10,210,182, 90,215,154, 38, 51,255, 14,194, 81, 71,160, 62,248,131, 31, 15,124,116, 24,228,177, 89,251,225,165,155,112,
+ 4,208,193,113, 94,190,170, 25,100,147, 10, 54,253,208, 82,231,202,142, 27, 75, 58,181,110, 55,166, 67, 5,121,164, 13,209, 39,
+227,247,106,171,227,114, 96, 1,233,112, 40,213, 46, 32,105, 14,114, 37, 16, 86,253, 36, 53, 8, 97,220, 4, 49, 51,142, 63,189,
+ 30, 82,121, 99,232,213,234,247,230, 44,224,149,109, 93,113, 37,194,235,229, 2,195, 9,111,238,196,171,253,238,205,219,114,104,
+ 25, 71,216,230, 43,186,190,195,124,157,209, 43, 41, 48,175, 25,172, 22, 16, 49, 69, 36,178, 7,154, 21,116, 7,183,239,171, 88,
+176,186,161,100,120,247, 67,143,206, 89,236, 81, 42,121,103, 25,123, 74, 24,144, 52,211,187,199,221,195, 27,132,176, 34, 37,224,
+187,239,191,215, 36, 57,136,176,203, 88,164,109,199,105, 58, 99, 89, 23,112,138,248,240,225, 59, 12,195, 40,151,242,188,160,115,
+ 14, 79, 79, 31,224,252, 8,239, 61,182,109,215,206, 64, 59, 92,142,240,206,227,155,143,223, 32, 36, 8, 73,110,144,156,247,222,
+119, 5,141, 26, 56, 98, 26, 78,184,191,191,195,243,243, 19, 94, 95, 47, 66, 90,235, 58,217,117, 15, 35,214,109, 5, 72, 32, 45,
+ 14, 6,251,186,225,227,199, 39, 12,157,199,124,189, 10,100,199,251, 34, 60,154,231, 89, 20,228, 26, 95,154, 18, 99, 24,122,204,
+171,224, 90, 67,148,144, 27,239,124,137,137,140, 12,108,235,138,238,124, 66, 84,192,141, 87,242, 27, 89, 81, 5, 67,187,153,196,
+170, 22, 14, 1,247,231,179, 80,225,116,215, 31,213,150,103,141,193, 52, 12,216,118, 97, 15, 12,253,160,221,178, 8,209,254,242,
+111,127, 13, 64,220, 6,167,233,140,127,253,175,255,165,176,223,213,119,106,116,244,189,173, 11,214,249,130,176,109, 48, 78,212,
+237, 32,194,182, 44,216,214, 89, 20,201, 89,112,197, 92,146,210,184,209,249,228,168,208, 50,215, 76,245,249,168,251, 94, 41, 70,
+ 24, 50, 46,142,186, 54,136,121,116,156,244, 34,141,114,145,228,253, 54,145, 45, 58, 22,209, 51,201, 26,140,179,247,253,112, 54,
+ 49, 96,185, 4,211,216,204, 77,103, 42, 98,189, 10,130,225, 34,158, 19,235,106,157,192,165,188,250, 76, 50,197, 92, 67, 44,183,
+113, 38,226, 25,146,132,185, 2,212, 34, 66,164,170, 24, 38,106,211, 64,142,235, 68,202,175,181,153,202,230, 75, 49, 49,212, 74,
+152, 10,179,131, 27,195, 76,158,160, 36,101, 45, 20, 91, 87,126,143,228,162,104, 48, 95, 92, 26,140,252, 66,198, 97,196,221,221,
+ 25,211, 56,225,124,119, 70,223,139,130, 61, 42,112, 71,238,133,154, 79,144,125,189, 92, 62, 39, 21,222,101,119, 79,203, 14,105,
+ 99,176,185,238,203,141,105, 26, 65,157, 52,212,245,182, 22,129,135,254, 58,239,203,179,195,137,245,123, 88, 93, 70, 6, 57,215,
+252, 56,163,117,169, 81,127, 19,227, 96, 63,251,100,170,156, 36, 8,128, 20, 47,150,178, 2,190,189,196,178,239,188, 0, 28,232,
+208, 19, 26, 21,197,193, 52, 2,173,194, 95,215,139, 79, 71,223,121,196,147,242, 8,167, 73, 51,203,168, 90,178,132,200,154,208,
+ 86,210,216,128,126,156,208,245, 3,182,249,162, 76,248, 92,141, 2, 73,131, 25, 72,119,181,156,211,147,244,245, 12,189, 23,132,
+169,242, 27,152,248, 38, 41,173, 73, 82,205,100, 54,237,198,211,205, 27,124, 96,175, 55,200, 87,106,110,226, 34, 56,212,142,189,
+ 28, 16,196,135,152, 87,202,255,141,118, 50, 64, 53, 49,175, 88, 13,193,213,123,107,142, 14,183, 6, 23,223,216, 9,235,191,224,
+ 6, 32,147,187,124, 58,112,153,169, 68,214,102,117,112,107,196, 43,123,114,115,187,181,168, 12,130, 67, 49,212, 44, 11,202,207,
+206, 2,159, 66, 33,180,184, 46, 11,222, 79, 30,215,109,199,155,251, 19, 66,136, 26,238,209,225,250,244, 2,196, 25, 95, 45,155,
+160, 85,251, 65, 15, 32,198,186,111,101,223, 57,140, 35,188,115,216,131, 90, 71,172,208,208,176,239,101, 98,144,149,250, 25,113,
+186,239,226,211,126,190, 92,225,116,175, 43,193, 25,226, 41,157,151, 25,222, 89,188,185,191,199,233,124,134,243, 22, 47,215, 25,
+221,190, 75,190,185,181,184, 63, 77,184,206, 87, 76,195, 0,168, 72,204, 90,139,121,153, 49, 12,163,176,208, 83, 68, 8, 17,207,
+207, 79,120,184,127, 68,140, 1,157,239, 48, 78, 61,150,121,150,177,122,140,248,236,221,123, 92,231, 43, 98,100, 60,191, 60, 33,
+ 36,224,225,124, 6, 25, 33,229, 69,205,109,207, 34, 50,231, 28, 98,220,241,252,252,132,203,229, 82, 44, 94,155,230,152,131, 19,
+238,166,147, 8, 77,247, 13,219,182, 98, 75,140, 24,118,204, 73, 86, 91, 33,238,216,230, 80,166, 82, 91,136,136, 41, 98,234, 58,
+ 24,245,144,239,251, 46,182, 43, 16,222,220,223,201,251,170,116,198,152,132,113, 29, 53,183, 28, 32,144, 23, 60,237,186,174,194,
+112,119, 30, 49,136,176,208,104, 39, 51,244, 61,144, 61,250,170,178,239,135, 81, 38, 28, 42,102,179, 78,210,208,146,194, 90,158,
+ 47, 87,124,249,237,147, 4,214,116, 61,166,243, 61,254,251,255,238,159, 23, 74, 89, 17,178,133, 29,235,114,197,190, 46, 72,251,
+ 94, 2, 65, 12, 73, 22,189,165,132,113, 24, 74, 58, 88,158,214,148, 14,154,204, 15,235,105,202,161,156, 84, 19,146, 10, 12,134,
+155, 60, 6,153, 8,136,245, 41,239,131,147,210,232,114, 17,192,133, 52,151, 10, 84, 43,177, 92,102, 73, 45,123, 81,109, 80, 81,
+127,111,216,133,211, 47, 88,215,116, 32,208, 65, 29, 14,173, 42,205, 57, 87,132,206,117, 76, 74, 53,139, 66, 69,199, 8, 17, 54,
+ 7,147, 52,207,115,140,226,124, 48,104, 98, 67, 53, 78, 58, 71,208,114, 70,199,222, 32,196,169,109, 24,145,100,215,156, 18,216,
+ 74,126, 67, 50, 0,113,147, 44,169,148, 56,110, 46, 93,106,162,169,185,100,123,100,190,123, 37, 83, 18,100,253,114, 58, 77,184,
+187, 59, 99, 28, 39, 76,211, 8,231, 68, 35, 35,159, 65,210,208, 26, 41, 90,172,174,107, 4,214, 20,170, 70,129,147, 78, 80, 69,
+127,147,199,222,165, 59, 79,169,100, 75, 80, 14,150,201,103,103, 99, 15, 47,241,215,124,140, 37,175, 65, 89, 84,245, 69,249,114,
+ 55, 71, 81, 97, 9,247, 42, 74,110,130, 75,137,111,222,232, 99,252,106, 70,195,150, 8,209,124,153,235, 14,132,155,170, 21, 13,
+107,156,155,145,123,241, 88, 55,194,179, 44, 12,104,129, 39, 69,253,173, 21,144,105,168, 75, 48, 4,167,255,204,144,168, 75, 83,
+ 2, 44, 51,130, 64,184,244, 75, 36,255,108, 28,207, 8, 33, 96,219,150, 34,216,201,130,184,172,248, 55, 5, 56, 83,227, 71,141,
+ 42,136,169,181, 95, 53,251, 95,106,175,228,146, 76,214,140,145,112, 16,180,214, 98, 6, 55, 64,233, 38, 54,177,221,105,151, 2,
+ 1,181, 88, 96,220,128,101, 18, 14, 73,245,100, 18,110,234,226, 34,166,177, 69,151,222,188,190,219,194,162,253, 35, 53,136,224,
+210, 89,163, 82,253,184, 73,123, 43, 92,249,198, 39,223,186,226, 12, 29, 61,249, 69, 60,168,144,157,131,206,128,154, 62,157, 36,
+210,182, 21,250, 36, 38, 60, 45, 59,222,158, 71,124,253,241, 21, 29,201,248, 22, 25,169,186,239,248,226,205, 35,186,206, 99,240,
+ 30,235,190, 97, 95,247,178,171,218, 66,194,182,173,184,159, 38,124,247,252,162,129, 14, 12, 52, 15,171, 51,245,195,203,202,233,
+190, 31, 48,140, 14,215,101, 69,231, 60,198,206, 97, 13, 17,222, 36,236, 33,194, 26,134,115, 3,158,175, 51, 96,128,119,239,222,
+227,205,253, 35,230,121,198, 52,201, 78,254,235,111,191,198,208,245,248,254,195, 71, 88, 3,244,189,116,223,243,124,197, 55,223,
+126,141,251,187, 7,220,157,207,216,211,134,183,111,223,130, 96, 5,178,227, 13,174,215, 11,150,101,193,195,253, 3,246,176,225,
+229,114, 5,167, 8, 99, 44,238,238,238, 48, 12,187,106, 29,212, 3,155, 34,182, 53,192,121, 81,170,115, 74,136,208, 28,110,223,
+ 9,114, 18,140,117, 94,117, 68, 27, 16, 82,194,249, 36, 29, 52,169,204,150, 89,139, 32,239, 49,175,146, 74, 21, 82,230,151, 27,
+ 60,222, 11, 58,115,213,236,244,172,142,238,123,177,227,101, 26,216,188,108,165,251, 25, 7,225, 70,120,239, 97, 20, 87,155, 11,
+202,190,239,241,178,111,205,232, 18,101,138, 34,130, 36, 46,138,248,174,235, 84,181,109,225,141,145,130,194, 27,124,253,225, 9,
+223,191,204, 0, 25, 12,227,132,183,239,223,227,191,250,167,127,170, 5,164,129,194, 47, 36,104,101, 93,176,175,179,118,254, 50,
+242, 77, 41, 34,174, 77,119, 85, 2, 69, 90, 31,117, 62, 72, 83,133, 61,115,235,171,110,226, 67, 73, 87,135, 41,137,125,182,209,
+135,101,212,169,179, 6, 72,174,185,240, 83, 25,177,139,168, 43, 53,107, 80,174,171, 66,189,232,243,232, 57, 54,221,127,142, 20,
+ 77, 77, 71, 24, 53,148, 71,206,196,189, 4,226,196, 24,193,197,187,142, 34,136,164,146, 42, 39, 63, 47,234, 89, 71,198, 20,199,
+144,120,176, 3,194,110, 96,108,106,194, 56,249,216,252,128,144,148, 27,157, 3,175,218,222,132, 33,175, 47,236, 59,156, 77,226,
+240, 96,125,223,178,240, 45,175, 10,178, 93, 77,139, 28, 38, 58,228, 98,180, 77, 72,177,211, 90,131,211, 56,226,116, 62,227, 52,
+ 77, 24,198, 65, 32,100, 86,115, 60, 82, 77,153, 36, 83,243,207,203, 57,172,200,224,156, 61, 95,167,213, 26, 19,174,250, 15,197,
+104,214, 27, 90,161, 75,197,218,215, 98,176,181, 64, 78,229, 44,229, 38, 28, 53, 39,213,165, 98,165, 38, 6,184, 9, 9, 99, 52,
+160, 47,213, 94,136,219, 68,133,114,252, 3, 22,166,118, 12, 92,194, 89,242,126,183, 8,203,234,238,247,208, 13, 38,169,214, 12,
+ 25,189,248,143, 43, 93,163,185,218, 98,179, 48,229,139, 83, 2, 69, 83,106,124,207, 53,100,166,211, 41,129, 81,101, 35, 57,139,
+ 45, 68, 24,141,165,203, 86,171, 4,160, 27, 39,124,252,254, 27,173,100,185,208,205,162,126, 33, 50,127, 25,168,225, 26, 80,113,
+134,181,166, 25, 47, 31, 36,232,229, 2, 71, 27, 65,202, 73, 55, 8,141, 47,189,245,234, 39, 32,153,132, 82,116, 53,136,213,186,
+ 87,175,146,135,164, 84,191,226,255, 71,203,157,111,246,222,233,232,245,172, 69, 72, 14, 87, 48, 85, 31, 65,109,210, 27,181, 73,
+177,109, 42,174,214, 12,121,239, 77,135,194, 68, 88,239, 45,251, 56,231,165,215,221, 4, 19, 29, 11, 4,194, 33, 36,134,155, 66,
+230, 80,248, 28, 88,242,116,128,225,136,207,216,193,242,174,201, 79, 9,123, 98, 60, 95,174,248,234,219,239,225,140, 81,102,129,
+193, 60, 47,216, 66, 64,239,156, 68,149,190, 94, 16,173, 81, 70,188, 45,211,149,236, 26,176,100, 64, 22, 37, 44,195, 20, 43,161,
+252,121,247,109,193, 23, 63,254, 99,124,245,245,215, 24, 58, 25, 25, 51, 51,130,113,146, 49,238, 28,188,101,188,125,184,131,113,
+ 30,142, 12,214,101,193,203,203, 11,186,206,225,195,199,103,225,177, 51,224,156,193,243,243, 11,158, 95, 47,248,252,139, 47, 0,
+ 0,119,167, 59, 12,157, 88,240, 78,231, 51,182, 93, 58,200,138,193, 37, 12,253,136,196, 44, 86, 47, 11, 44,123,192,101,222,225,
+ 44,193, 57,143,215,101, 70,239,133, 51, 63, 47,139, 92,172,234,135,151, 64, 23, 25,197,103,100,174,176,214, 71, 60, 63,191, 40,
+ 58,214, 23,157,129,164,197,117, 96, 85,184,131, 22,249,189,206,226,126,154,176,135, 36, 0,157,174, 71,140, 59, 78, 99, 47,132,
+ 71, 39, 94,241,190, 31,176,237, 91, 1,123, 24, 99, 17,195, 94, 64, 65, 98,255,233,225,140,197,235,117, 70,136, 17,119,227,136,
+101,153,229,188, 48,172,240, 25, 25, 63, 59,231, 16,246, 29,227, 56,104,158,186,144,239,246,109, 7, 16, 75,186,218, 47,190,252,
+ 90,190,175,198,226,116, 58,227, 31,254,163,127,136, 63,250,227, 63,168,106,108,147, 9,103, 6, 91, 92, 17,194,170, 58, 8,148,
+ 29, 46,154, 28,109, 20, 65,167,169,130,224,130, 51,174, 90,151, 2, 76, 57,172,215,184, 81, 44,231,174, 59,199, 15,215,115,180,
+228,110,232,101,142,200,135,121,160, 76,161,169, 73, 70,228,242, 60, 37, 54,176, 36,235,146, 4,192, 23, 34,232,193,202, 82,138,
+232,196, 50,234, 15, 33, 8, 40, 40, 6,237,226,133,239,254,122,157,113,189,206, 18, 2,164,127, 22, 91, 26,141, 84,120,242,100,
+ 12,168,189,212, 83, 66,140,123,181,222, 53, 34,189,234, 80, 51,135,169,108,193,217,114,205,254,200,107, 7,249,229, 17, 73,189,
+220, 54,199,153, 2, 72, 17, 5, 40,147, 9,160, 68, 77, 50,104,179,131, 78, 42,166, 28,199, 30,211,116,194, 52,141,232,251, 94,
+200,131,106,229,204, 60, 10,178,212, 36, 88, 82,249,188,192, 45,153, 46, 85, 36,119,139,231, 78, 21, 72,147, 11, 71,163, 57, 36,
+ 38, 39,251,105,246, 69, 74, 73, 21,233,173, 51,129, 15,179,202,118, 71, 65,173, 96,186, 48, 85,168,252,153, 15, 45, 90,115, 78,
+ 87, 75,219, 45, 1,156,240,201,222, 53,223, 99,133,161,123,155, 31,214, 36,173,101, 49, 3,233,152, 74, 70,119,117, 68,208,138,
+ 84,242,129,210,254,225,152,101, 76,158,187,209,160, 80, 6, 82, 65, 86,254, 2, 5, 16, 58, 69, 36, 18, 1,206, 17, 98, 4,250,
+105,194,215,191,249,149, 96, 16,141, 64, 4,152, 80,210,143,114,186, 18,183,157, 59, 9, 95,247,160,210,191,221, 61,255,208, 14,
+ 90, 31, 62,220, 54,159, 92,147,211,168, 85,153, 31,242,209,155,111,127,106,184,247, 13, 3,192, 28,160, 49, 5,240,118,204,243,
+229,163,255,156, 74,117,101, 74, 84,108, 45, 95,233, 72,241, 69,219,121,215, 12,117,131,163, 38, 34, 63,216, 38, 91,128,184,177,
+175, 81,237, 52, 76,166,202, 48, 29, 64, 52,169,104,235,168,166,192, 29,214, 1, 37, 15, 79, 39,240,242, 25,223,223,159,240,253,
+183, 11,146,113, 66, 89,131,196,154,130, 32, 65, 45, 41,226,195,101,199,203,245,138,199,251, 59, 32, 49,182, 16,241,253,211,139,
+136,197,152,225,201, 96,217, 54, 76,195, 0,198, 19, 72,253, 2, 2,150,136, 13,228,174,218, 23,101, 20, 27,165,179, 36,150, 11,
+205,202,161,242,102,236,113,133,184, 44, 4,245, 26,209, 91,241,132,191,123,124,131,174,239,241,241,227,135,178,199, 93,150, 25,
+ 97,223,132, 82, 5,224,229,227, 71,196, 40,172,132,151,215, 23,196, 16, 21,121,218, 99,232, 59,204,243, 21,206,121,140,195,136,
+125,223, 48,207, 87,244, 93, 7,211, 13,232, 7, 25,223,191, 92,102,204,243, 11,134, 65, 8,107,151, 57,160,243, 61, 12, 89, 92,
+174, 87,204,235,138,135,251, 59,116,125,143,235,117, 6,115, 66,231, 28,190,251,230, 43, 12,195,136,211,105, 66,116, 14, 86,139,
+141,160, 59,210,117, 93, 37,247,125,232,177,204, 11,134,161,211,231,214,160,239,125, 89, 91, 25, 34, 56,239, 48,142,163, 64, 87,
+182,173, 48, 1,122,141, 75,221,247, 13, 93,215,233,190,146,133,207,207,172,123,124, 96, 58, 77, 58,174,148,175, 66,231, 59, 24,
+107, 68,255, 18,165,179, 52,106, 11,204,158,243, 77,109,109,196,140,203,178,226,171,143,146, 29,239,188, 71, 55, 76,248, 87,255,
+234,191, 69,215, 75, 40,140,209, 81, 57,235,103, 29,195,142, 24, 54,181,118, 25,141, 42,181, 26, 28, 98, 75, 54, 68,217,229, 54,
+ 54,173,164, 5, 59, 35, 53, 87,114, 51, 51,107,189,201,121, 21,169, 96,173,140,201,109,215,113,249,204, 44,204,114, 62, 30,234,
+ 7,103, 72,163,137,169, 74,232, 58,186,206,123,227, 79,204,168,186,162, 76, 48,240, 22, 96,223, 21,218,156,136, 73, 69, 88,233,
+172,195,208,247,184, 92, 46,152, 53,138, 54,231,131, 71,212, 61,184,105, 32, 88,116, 72,227,140,106,235, 44, 72,205,106,183, 51,
+169, 62,211,220,118,243, 92, 58,245,140,118, 37,157, 6, 9,172, 69, 49,226,205,253, 20, 82, 27, 38,211, 30,118,185, 73, 18,145,
+102, 55,116,152,198, 9,125,223,193,251, 14, 67, 47, 84, 70,175,206,136,252, 89, 23,141, 1, 26, 10,160, 22, 50, 73, 87, 8,172,
+ 23,113,105,102, 96, 42,244,134,184,161,230,153,218, 44,149, 60,149,218,176, 74,243,151,157, 79,183, 7, 56,234, 90,178, 81,138,
+103,250, 94,227, 13, 44,119, 5, 27, 61,163, 19,192,166,126, 38,142, 63,185,212,219,188,108,194, 77,152,182,118,145, 71,144, 74,
+245, 78,183,163,218, 86, 96, 85, 35,215,228, 80, 79, 37,228, 37,179, 2,200,164,195,133, 36, 76,143, 74, 54,139, 49,192,102,214,
+121,254,198,167, 4,219, 59,236,161, 38,152,177,122, 58,189,235,240,244,221, 87,170, 18,149, 89,176, 88, 70,160,222,244, 28,180,
+118,196, 24,186, 12,104,200, 21, 86,202,128,156,166, 34,167, 74,101, 67,195,253,253,161, 45, 27, 55,190, 13,110, 48,169,124, 99,
+233,162,188, 40,105, 4,143,148,184, 92,156,121,111, 82, 30, 92,226,195, 28,165,157,116,151,169,129, 57, 86,116,212,250,237, 42,
+230, 77, 69, 25,230,104, 87,253, 29,118,245, 92,164,136,106,150, 63,249,181,159,160,255,111,237,238,135,127,220,116,229,204, 37,
+246,165,208,244,117, 76,119,119, 30,241,252,212, 1, 97,198,170, 15,245,103,111, 31,241,229,215,223,224,139, 55,247,248,143,191,
+252, 74,209,190,114, 56,239, 49,130, 82,196,219,251,179, 36,138,177, 8,212,166,113,196, 30, 68,196,181,110, 59, 34,234,184,194,
+ 84, 94,150,106, 57,184,216,172,126,251,229,223,225,241, 65, 70,234, 68, 22, 15,167, 9,175,243, 12,111, 29,140,115,232,188,197,
+249,116, 66, 2, 48, 77,247, 0, 25,124,247,253, 7, 12,189,199,186,172,240,190, 3, 57,194,229,122, 21,232,204,178,192,251, 14,
+ 93,103,113,185,188,200,232,223,245,112,214, 98,232, 59,172,235, 44,162, 53,103,177,109,139,196,156, 2,120,189, 94,241,221,135,
+ 39,188,125,124, 35, 10,115,103,113,217, 25,151,235,130,196,140,135,251, 71,112,218, 1, 36, 76,211,132,243,121,194,186,110,248,
+230,219,239, 50,185, 2, 32,131,211, 52,161, 27,122, 92,231, 89,158,233,141,241,242,242, 10,239, 4,199, 57, 78,131,112,196, 99,
+196,227,195,189, 10,134, 12,156,239,176,110, 27,214,117,145, 72, 88, 13,152,200, 10,232, 60,246,117,206, 73, 1, 14,104, 82, 93,
+237,212,134, 65,125,232,228, 96,173,195, 30, 54,144,245, 8, 49, 34, 6, 9, 12, 73, 33, 98, 24,196, 5,224,125,167, 98, 53, 25,
+ 37,239,121,180,156, 18,126,243,221, 71, 44,187,144,242,250,113,196,227,219,119,248,111,254,217,159, 41, 39,220,169, 64,201,222,
+ 28, 97, 92,198,171,100, 0, 67,174, 76, 20, 64,234,227,230,155, 51, 45,219, 74, 83,157,156,101, 13, 80,246,100, 31, 52,215,153,
+213,157,106,186, 98,166,115,230, 56, 4,232, 52, 50, 79, 53,243,227,159,184,105,144,138, 33,134,138,114,190,148,209, 68, 40,255,
+249, 60,254,252,129,211,231, 40,188,229,226,217,102,181,204, 89, 3,233, 98,187, 14,126, 89, 68, 28, 57,109,152,151, 21,219,182,
+105, 16,142, 45, 62,116,153,202, 80, 67,192,228,134, 2, 87, 27,130,146,184,153, 20, 42, 5, 46, 73,144,196,172, 1,147, 92,138,
+ 39,166,170, 93, 40,175, 52, 49, 18,213,184,238, 98, 33,108,106,135, 66,151, 51, 6,125,231,209,119, 29,166,105,194, 48, 78,186,
+ 10,114,240,153, 99,111,141, 94,224, 92, 32, 99,217,253, 69, 68,122,127, 9,131, 32, 54, 2, 54,206, 86,202, 28,242,197, 77, 81,
+ 71,166, 8, 52,115,211, 40,171, 11,106, 48,174,181, 81, 61,222,154, 40, 83, 24,174,177, 33, 7, 54,138,244, 96, 13, 79,224,102,
+ 13,155,202,197,158, 87, 17, 12,151,133, 35,212,180,151, 53,192,133, 63, 77, 27, 99, 46, 94,192,246, 50,105, 17,130,181,184, 76,
+250,125,206, 12,223, 6, 55, 90,222,180, 36,248, 18,110,131, 62, 26,210,152, 62, 48, 28,211,225,117, 36,107, 48,144,129, 5, 97,
+ 7,171, 15,180,190,102,102,198,250,250,172, 85, 86, 42, 34, 19,226, 58, 73,232,189,197,182,199,242,223,181, 68,152,166,169, 60,
+184,220,142,116,210,113, 28,223,142,153, 11,132,167,233, 62,139,176, 91,149,126,101, 47,206,166, 73, 35,106,119,115,181, 52,207,
+ 90,130,140,127,205, 59, 54, 82,142,124, 5,220,224,152, 87,223,200,244,164, 6,160,134,125,124, 8, 95,195,145,234, 75,159,224,
+241,126, 0, 46,167, 99, 37,170, 73,114,116,168,224,110,214, 21,133,153,123,112,202,113,139,141,188, 37,244,221, 40,240,243, 10,
+ 65, 3,136, 97,173, 69,220, 3, 28, 49,254,254,155,111,145,246,136,191,159,197, 82,245,217,195, 25,145, 25,215, 69, 2, 64,214,
+ 16,144,124, 77,108,234,189,199,117,158,225,157,195,221, 56, 97, 93, 63, 54, 56, 37,106, 48,191, 90,156,153,138, 69, 54,214,224,
+242,252, 44, 17,155,134,240,241,245,130,222, 81, 73,145,251,209, 23, 63,198,120,154, 68, 21,190,205,154, 28,103,149,203, 13,188,
+190,190, 96,143, 1,231,113,192,249,254, 1,206, 95, 96,173,195,211,243, 11,188,235,176,199, 0,230,136,105, 58, 99,158,103,172,
+187,196, 51,238, 33, 8,123,187,115, 88,150, 13,214,120,156, 39,143,231,151,139,166,215,109,136, 73, 34, 99,167,113, 68,138, 34,
+ 50, 27,166, 17,206,202,174,121,217, 3,156, 33, 77, 91, 19, 47,186,181,132,235,199, 43, 98,130,116,235,251,142, 97,236,133,207,
+192, 12,239, 59,244, 58, 46,119, 58,133, 16, 94,250, 2, 75, 6,157,247,120,184,191,135,243, 94,152,234, 73, 56,232, 34,202, 75,
+229, 18,239,251, 30, 41,185,198,175, 29, 36, 36, 71, 15,185,148, 34, 58,223,107, 51,103, 65,185,168, 24,123, 13,102,146,113,247,
+190,111, 34,250, 98, 70, 72, 17,151,235,140,223,126,255,172,107, 36,135, 97, 58,225, 79,255,236,159,224,179,247,239, 84,252, 37,
+197, 93,177,122,106,104,120, 12, 59,246,109, 69, 12, 50,153, 17, 36,167,205,115, 36, 21, 95,241,113,178, 5, 62,160, 87, 77, 83,
+245,102, 59, 45, 84,208, 85, 20,239, 58,149, 40, 76,243, 50,110, 77, 53,100,165, 60,255,220,136,158,202,147, 95,186,189,131,207,
+185,193, 67,203,235,212,238, 17,166, 22,251,217,209, 83,220, 53, 58, 54,215,125, 64, 94,249,137, 69, 57,202,148, 20, 22,182, 51,
+ 10, 74,138,240,126,197, 52, 72,225,187,172,171,252,117, 89,181,184,227, 28,118, 93,254,108,229,124, 81, 81,153,201,158,121,176,
+140,170,139,227,232, 32, 13,110,240,237, 36,121, 12,133,238,103,148, 21, 65, 69, 99, 67, 12, 21, 68,155, 82,148, 73,190,184,197,
+121, 26, 49,158, 70,140,227, 4,239,188, 76,108,244,130,207,169,118, 49,198,122,161,235,247, 51,103,153, 27,141, 85, 46,239, 17,
+231,240, 28,253,115, 26, 40,200, 72, 97, 71, 33,213,236,118, 97, 37,203,231, 82,214,188, 84,113,188,164, 43,203,122,115,225,184,
+ 40,109, 52, 87,183, 46,129,155,184,236,214, 38, 78, 68,141, 38,161,229,200, 16, 92,254,226,148,156,244,163, 3,235,176,108,205,
+176,149, 3, 32,134,169,248,172,185, 17, 62,148,125, 81, 6,202, 20,244, 44,201,197,212, 78, 3,202, 24,254,216, 20, 38, 22,196,
+172,129, 65, 10, 59,114,120, 87, 72, 9, 29, 73,134,110,100,137, 41, 98,107, 64, 26,112, 0,227,196,246, 67, 22,137,131, 62, 12,
+234, 71, 85,112, 13,113,194, 30, 18,182, 24, 11, 77,142,200, 8,200,134,242, 7,196, 13, 61,173, 17, 13,222, 92,119,121,175,198,
+224, 31, 96,209, 72,144, 0,146, 62,248,134, 75,230,121, 21, 68,144, 50,237, 91,171,184, 94,209, 42, 78,201, 86,138,178, 95, 41,
+ 21, 42,110, 12,230,233,134,189,124,243,146, 62,233,150,241,137,118,128, 75,234, 82,139,254, 43,196,253,170,154, 47, 22,185, 84,
+166, 9,141,235,177,153, 74, 16,114, 38, 83,161, 60,105,129, 83,187,127,210,245, 74,187,159,212,231,133,129,135,251, 19, 94,190,
+ 95, 65,206, 97,112, 29,188,149,135,127, 89, 87,188, 57,245,216, 99,196, 72,157,218, 97,228, 66,142, 49,161,235,123,108,235,138,
+151,235, 21,247,119,103, 16, 8, 99,191, 23,184, 12,171,221, 49, 31, 85,198,136,131,130,149,201, 77, 12, 92, 47,175,184,187,127,
+196,247, 31,190,199, 30,118,220,157,206,136, 97, 71, 50,192,224, 58,188, 92, 94,241,244,244, 1,151,121,197,195,155,183,112, 36,
+234,236,105, 58,225,155, 15,207,232,141, 8,255,172,235,240,244,244,132,151,151, 23,156,239, 78, 24, 71,143,176, 71, 56,219,193,
+ 90,135,109, 89,177,111, 43,206,211, 9,206,117,178,127,118, 6, 38, 68,113, 98, 88, 9, 78, 57, 77, 50,158,222,157,197,188,174,
+120,115,186, 71,136, 59,214,117,197,249, 52, 97, 91, 23, 44, 58,157, 72, 49,130, 92,135,126, 56, 97, 15, 9, 93,151,192,113, 71,
+ 76,192, 48, 76,112,214,233, 14, 91, 2, 91, 0, 96, 24, 6, 25,115,111, 59,182,125,195,178, 73,110,251,208,119,112,157,193,221,
+116,130,247, 14,167,243, 25, 41, 37, 92, 46, 87,172,155,144,176,186,190, 23, 14,124,223, 99,219, 86, 24,146,180,180,231,167,143,
+ 24,198, 81,253,225, 50,254,116,222, 23,204,167,248,212, 93, 65,143, 2, 34, 20,164, 20,209,211,128,249, 58,195,146,193,111,191,
+253, 30, 31, 47,179, 36,231,245, 3,166,243, 61,254,229,191,248,175, 75,231,149, 87,121,178,159, 23,126,124,216, 54, 65,210,238,
+ 27,226,190,169,157,203,149, 29,121,241,123,183,221, 45, 83, 81,158,147, 94, 52,141, 10,166, 62,187, 69,217,206, 7,255,116,182,
+141,229, 21, 90, 22, 11,230, 21, 90, 25,211, 82,195, 93, 65,106, 28, 42,141,224, 46,229, 48, 39, 42,226, 99,163, 59,231,210,137,
+167,212,224, 98, 51, 68,172, 88,154,234,101,206, 71,132,107,158, 16,144, 22,205,214, 37,120,133, 12,141,123,144,184, 85, 0,203,
+178, 98,153, 23,204,203,130,117, 89, 75, 3, 37,103, 41,234,197, 77, 0,145, 92,200, 92,206, 80, 17,121,149,220,120,161, 85,201,
+123,108, 80,247,244,196,141,237,171, 49,181, 67,198,203, 45,102,186, 31,122,156, 78, 98,213,236,122, 41, 72, 51,149,208,123, 95,
+138,198,164,151,185, 85,204,172, 81,125, 14, 25, 91,156, 16,114,174,138,107,132, 72, 16, 5,156, 71,200, 44,162, 70,151,169,142,
+169, 78,166,140, 49,101, 93,154,184, 78, 94, 40,107,139, 82, 5,138, 29,214, 40, 55,119,135,249,129,104, 14,195,183, 35, 82, 58,
+124, 39,184,209, 71,181,238, 96, 67,140,255, 23,177, 72,216, 51, 12, 46,249,141, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+};
diff --git a/source/blender/editors/datafiles/startup.blend.c b/source/blender/editors/datafiles/startup.blend.c
index 0a7f5b3ba7b..ef2fd052dea 100644
--- a/source/blender/editors/datafiles/startup.blend.c
+++ b/source/blender/editors/datafiles/startup.blend.c
@@ -1,214 +1,268 @@
/* DataToC output of file <startup_blend> */
-int datatoc_startup_blend_size= 366764;
+int datatoc_startup_blend_size= 409636;
char datatoc_startup_blend[]= {
- 66, 76, 69, 78, 68, 69, 82, 95,118, 50, 53, 51,
- 82, 69, 78, 68, 32, 0, 0, 0,136,108,137,191, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,
-101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 76, 79, 66, 16, 1, 0, 0,160,107,137,191,
-202, 0, 0, 0, 1, 0, 0, 0, 32, 32, 32, 49, 1, 0, 0, 0,250, 0, 0, 0, 1, 0, 0, 1, 24, 81, 88, 10, 16,228, 90, 10,
- 0, 16, 0, 0,128, 32, 4, 0, 47,114,111,111,116, 47, 46, 98,108,101,110,100,101,114, 47, 50, 46, 53, 51, 47, 99,111,110,102,
-105,103, 47,115,116, 97,114,116,117,112, 46, 98,108,101,110,100, 0,108,137,191,224,108,137,191, 0, 0, 0, 0, 1,128,173,251,
-220,117,137,191, 42,230,132, 8,176, 8, 93, 10,136,108,137,191, 32, 0, 0, 0,255,255,255,255,224,108,137,191,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,236,127,188, 8,104,108,137,191,115,232,132, 8,176,100, 64, 10,136,108,137,191,
- 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 14, 45,190, 82, 69, 78, 68, 32, 0, 0, 0,136,108,137,191,
- 0, 0, 0, 0, 1, 0, 0, 0,224,104, 78, 9,220,117,137,191,184,108,137,191, 49,239,132, 8,176,100, 64, 10, 82, 69, 78, 68,
- 32, 0, 0, 0,136,108,137,191,128, 63,168, 8,236,127,188, 8, 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 81, 88, 10, 0, 0, 0, 0, 87, 77, 0, 0,168, 0, 0, 0,
- 0,140, 81, 9,110, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 77, 87,105,
-110, 77, 97,110, 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,
-160,180, 80, 10,160,180, 80, 10,160,180, 80, 10,160,180, 80, 10, 3, 0, 0, 0, 0, 0, 0, 0, 16,163, 79, 9,136,145, 79, 9,
- 0, 0, 0, 0, 0, 0, 0, 0,184,141, 88, 9,184, 35, 81, 10, 16, 0, 0, 0, 2, 0, 0, 0, 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, 8,177, 64, 10,
- 8,177, 64, 10, 8,177, 64, 10,248, 54, 88, 9,248, 54, 88, 9,248, 54, 88, 9, 68, 65, 84, 65,148, 0, 0, 0,160,180, 80, 10,
-111, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 81, 82, 9, 1, 0, 0, 0, 0, 0, 0, 0, 24, 81, 88, 10,
- 0, 0, 0, 0,115, 99,114,101,101,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 5, 5, 56, 0,246, 4,226, 3, 0, 0, 0, 0, 1, 0,238, 3, 0, 0, 1, 0, 0, 0, 0, 0,168, 48, 84, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,232,200, 87, 9,208,185, 87, 9,208,185, 87, 9,112, 55, 88, 9,
-232, 55, 88, 9, 96, 56, 88, 9, 96, 56, 88, 9,216, 56, 88, 9,184, 58, 85, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,
-140, 0, 0, 0, 88,159, 78, 10,196, 0, 0, 0, 1, 0, 0, 0,224,212, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83, 82, 65,110,105,109, 97,116,105,111,110, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,248, 15, 55, 10,192, 37, 85, 10,192,225, 87, 9,136,149, 60, 10,208,149, 60, 10, 0,205, 60, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,248, 15, 55, 10,197, 0, 0, 0, 1, 0, 0, 0, 88,180, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 88,180, 84, 10,197, 0, 0, 0, 1, 0, 0, 0, 40,197, 80, 9,248, 15, 55, 10,
- 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 40,197, 80, 9,197, 0, 0, 0, 1, 0, 0, 0,
- 16,160, 78, 10, 88,180, 84, 10, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 16,160, 78, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 16,228, 79, 9, 40,197, 80, 9, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 16,228, 79, 9,197, 0, 0, 0, 1, 0, 0, 0,184, 29, 79, 9, 16,160, 78, 10, 0, 0, 0, 0, 0, 0, 70, 4,
- 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,184, 29, 79, 9,197, 0, 0, 0, 1, 0, 0, 0, 48,141, 84, 10, 16,228, 79, 9,
- 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 48,141, 84, 10,197, 0, 0, 0, 1, 0, 0, 0,
-240,152, 88, 9,184, 29, 79, 9, 0, 0, 0, 0, 44, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240,152, 88, 9,
-197, 0, 0, 0, 1, 0, 0, 0,240,203, 80, 9, 48,141, 84, 10, 0, 0, 0, 0, 44, 6, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,240,203, 80, 9,197, 0, 0, 0, 1, 0, 0, 0,208,171, 79, 9,240,152, 88, 9, 0, 0, 0, 0, 44, 6,220, 1,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,208,171, 79, 9,197, 0, 0, 0, 1, 0, 0, 0, 96,211, 87, 9,240,203, 80, 9,
- 0, 0, 0, 0,118, 7,220, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,211, 87, 9,197, 0, 0, 0, 1, 0, 0, 0,
- 88, 68, 81, 10,208,171, 79, 9, 0, 0, 0, 0, 0, 0,132, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 88, 68, 81, 10,
-197, 0, 0, 0, 1, 0, 0, 0,160,154, 61, 10, 96,211, 87, 9, 0, 0, 0, 0, 44, 6,132, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,160,154, 61, 10,197, 0, 0, 0, 1, 0, 0, 0,224, 27, 77, 10, 88, 68, 81, 10, 0, 0, 0, 0,160, 2,132, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,224, 27, 77, 10,197, 0, 0, 0, 1, 0, 0, 0,104,177, 80, 9,160,154, 61, 10,
- 0, 0, 0, 0,160, 2, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104,177, 80, 9,197, 0, 0, 0, 1, 0, 0, 0,
-104, 32, 59, 10,224, 27, 77, 10, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104, 32, 59, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 8, 40, 82, 9,104,177, 80, 9, 0, 0, 0, 0,160, 2,140, 1, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 8, 40, 82, 9,197, 0, 0, 0, 1, 0, 0, 0,192, 37, 85, 10,104, 32, 59, 10, 0, 0, 0, 0, 44, 6,100, 3,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,192, 37, 85, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 40, 82, 9,
- 0, 0, 0, 0,118, 7,100, 3, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,192,225, 87, 9,198, 0, 0, 0, 1, 0, 0, 0,
-248,115, 56, 10, 0, 0, 0, 0, 40,197, 80, 9, 88,180, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
-248,115, 56, 10,198, 0, 0, 0, 1, 0, 0, 0,112, 2, 84, 10,192,225, 87, 9, 16,228, 79, 9, 88,180, 84, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112, 2, 84, 10,198, 0, 0, 0, 1, 0, 0, 0,240,180, 81, 10,248,115, 56, 10,
-184, 29, 79, 9, 40,197, 80, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,240,180, 81, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 96,181, 80, 10,112, 2, 84, 10,184, 29, 79, 9, 16,228, 79, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 96,181, 80, 10,198, 0, 0, 0, 1, 0, 0, 0, 16,143, 60, 10,240,180, 81, 10,248, 15, 55, 10, 48,141, 84, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16,143, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 88,143, 60, 10,
- 96,181, 80, 10, 16,160, 78, 10, 48,141, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 88,143, 60, 10,
-198, 0, 0, 0, 1, 0, 0, 0,160,143, 60, 10, 16,143, 60, 10,184, 29, 79, 9,240,152, 88, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,160,143, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,232,143, 60, 10, 88,143, 60, 10,240,203, 80, 9,
- 48,141, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,232,143, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 48,144, 60, 10,160,143, 60, 10,208,171, 79, 9, 16,160, 78, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 48,144, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,120,144, 60, 10,232,143, 60, 10,208,171, 79, 9,240,203, 80, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120,144, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,192,144, 60, 10, 48,144, 60, 10,
- 96,211, 87, 9,248, 15, 55, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,192,144, 60, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 8,145, 60, 10,120,144, 60, 10,240,152, 88, 9, 88, 68, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 8,145, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 80,145, 60, 10,192,144, 60, 10, 88, 68, 81, 10, 48,141, 84, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 80,145, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,152,145, 60, 10,
- 8,145, 60, 10, 96,211, 87, 9, 88, 68, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,152,145, 60, 10,
-198, 0, 0, 0, 1, 0, 0, 0,224,145, 60, 10, 80,145, 60, 10, 96,211, 87, 9,160,154, 61, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,224,145, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 40,146, 60, 10,152,145, 60, 10,160,154, 61, 10,
- 88, 68, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 40,146, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,
-112,146, 60, 10,224,145, 60, 10, 16,228, 79, 9,224, 27, 77, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
-112,146, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,184,146, 60, 10, 40,146, 60, 10,240,152, 88, 9,224, 27, 77, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184,146, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 0,147, 60, 10,112,146, 60, 10,
-160,154, 61, 10,224, 27, 77, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 0,147, 60, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 72,147, 60, 10,184,146, 60, 10,104,177, 80, 9, 96,211, 87, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 72,147, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,144,147, 60, 10, 0,147, 60, 10,104, 32, 59, 10,160,154, 61, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144,147, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,216,147, 60, 10,
- 72,147, 60, 10,104,177, 80, 9,104, 32, 59, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216,147, 60, 10,
-198, 0, 0, 0, 1, 0, 0, 0, 32,148, 60, 10,144,147, 60, 10,240,203, 80, 9, 8, 40, 82, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0, 32,148, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,104,148, 60, 10,216,147, 60, 10, 8, 40, 82, 9,
-240,152, 88, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,104,148, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,
-176,148, 60, 10, 32,148, 60, 10,184, 29, 79, 9,192, 37, 85, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
-176,148, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,248,148, 60, 10,104,148, 60, 10,208,171, 79, 9,192, 37, 85, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,248,148, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 64,149, 60, 10,176,148, 60, 10,
- 8, 40, 82, 9,192, 37, 85, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 64,149, 60, 10,198, 0, 0, 0,
- 1, 0, 0, 0,136,149, 60, 10,248,148, 60, 10, 16,228, 79, 9,104,177, 80, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,136,149, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64,149, 60, 10,104, 32, 59, 10,224, 27, 77, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,208,149, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,176,152, 60, 10,
- 0, 0, 0, 0, 16,228, 79, 9, 88,180, 84, 10, 40,197, 80, 9,184, 29, 79, 9, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,
- 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,128,212, 60, 10,
-128,212, 60, 10, 96,150, 60, 10,136,151, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0, 96,150, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,136,151, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68,
+ 66, 76, 69, 78,
+ 68, 69, 82, 45,118, 50, 53, 54, 82, 69, 78, 68, 32, 0, 0, 0, 16,108,245, 96,255,127, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 71, 76, 79, 66, 32, 1, 0, 0, 32,107,245, 96,255,127, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 32, 32, 32, 48, 0, 0, 0, 0,
+250, 0, 0, 0, 1, 0, 0, 1,104, 15,253, 2, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 16, 0, 0,128, 32, 4, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 47,114,111,111,116, 47,117,110,116,105,116,108,101,100, 46, 98,108,101,110,100, 0, 0, 0, 0,
+168,217,206, 0, 0, 0, 0, 0, 40, 0, 0, 0, 48, 0, 0, 0, 80,108,245, 96, 32, 0, 0, 0, 16,108,245, 96,255,127, 0, 0,
+104, 93,115, 4, 0, 0, 0, 0,240,122,245, 96,255,127, 0, 0, 56,135,206, 4, 0, 0, 0, 0,240,107,245, 96,255,127, 0, 0,
+ 32,220,206, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 16,108,245, 96,255,127, 0, 0, 32, 0, 0, 0, 82, 69, 78, 68,
+104, 93,115, 4, 0, 0, 0, 0, 82, 69, 78, 68, 32, 0, 0, 0, 16,108,245, 96,255,127, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 5, 0, 0, 0, 5, 0, 0, 0, 64,108,245, 96,255,127, 0, 0, 9,235,206, 0, 0, 0, 0, 0,248, 56,252, 2, 0, 0, 0, 0,
+104, 93,115, 4, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+104, 93,115, 4, 0, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,128,108,245, 96,255,127, 0, 0, 87, 77, 0, 0, 24, 1, 0, 0,
+ 24, 61,252, 2, 0, 0, 0, 0,102, 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, 87, 77, 87,105,110, 77, 97,110, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,104, 23,198, 4, 0, 0, 0, 0,120, 62,252, 2, 0, 0, 0, 0,
+120, 62,252, 2, 0, 0, 0, 0,120, 62,252, 2, 0, 0, 0, 0,120, 62,252, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 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, 56,131,240, 2, 0, 0, 0, 0,
+ 56,131,240, 2, 0, 0, 0, 0, 56,131,240, 2, 0, 0, 0, 0, 40,132,240, 2, 0, 0, 0, 0, 40,132,240, 2, 0, 0, 0, 0,
+ 40,132,240, 2, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,120, 62,252, 2, 0, 0, 0, 0,103, 1, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,132,240, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+104, 15,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 99,114,101,101,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129, 7, 28, 0,126, 7, 4, 4, 0, 0, 0, 0, 1, 0,238, 3,
+ 0, 0, 1, 0, 0, 0, 0, 0, 56,238, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 72, 19, 14, 3, 0, 0, 0, 0,216,104,218, 4, 0, 0, 0, 0,216,104,218, 4, 0, 0, 0, 0,
+136,239, 13, 3, 0, 0, 0, 0,136,219, 13, 3, 0, 0, 0, 0, 24,221, 13, 3, 0, 0, 0, 0, 24,221, 13, 3, 0, 0, 0, 0,
+ 88,240, 13, 3, 0, 0, 0, 0,184, 43, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83, 78, 0, 0,208, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,190, 0, 0, 0, 1, 0, 0, 0, 88,163,252, 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, 83, 82, 65,110,105,109, 97,116,
+105,111,110, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+200, 64,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0,168, 72,252, 2, 0, 0, 0, 0,232, 84,252, 2, 0, 0, 0, 0,
+ 88, 85,252, 2, 0, 0, 0, 0,184,153,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232,190,255, 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, 68, 65, 84, 65, 32, 0, 0, 0,200, 64,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 56, 65,252, 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,
+ 68, 65, 84, 65, 32, 0, 0, 0, 56, 65,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,168, 65,252, 2, 0, 0, 0, 0,
+200, 64,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+168, 65,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 24, 66,252, 2, 0, 0, 0, 0, 56, 65,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 24, 66,252, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,136, 66,252, 2, 0, 0, 0, 0,168, 65,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136, 66,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+248, 66,252, 2, 0, 0, 0, 0, 24, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0,
+136, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+104, 67,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,216, 67,252, 2, 0, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,216, 67,252, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0, 72, 68,252, 2, 0, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 44, 6, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72, 68,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+184, 68,252, 2, 0, 0, 0, 0,216, 67,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 6,220, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,184, 68,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 40, 69,252, 2, 0, 0, 0, 0,
+ 72, 68,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7,220, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 40, 69,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0,184, 68,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,132, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0, 8, 70,252, 2, 0, 0, 0, 0, 40, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 44, 6,132, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8, 70,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+120, 70,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 2,132, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0,
+ 8, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 2, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+232, 70,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+160, 2,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 56, 72,252, 2, 0, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 6,100, 3, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+200, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7,100, 3, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+168, 72,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24, 73,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 56, 65,252, 2, 0, 0, 0, 0,168, 65,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 24, 73,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136, 73,252, 2, 0, 0, 0, 0,168, 72,252, 2, 0, 0, 0, 0,
+ 56, 65,252, 2, 0, 0, 0, 0,136, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+136, 73,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248, 73,252, 2, 0, 0, 0, 0, 24, 73,252, 2, 0, 0, 0, 0,
+168, 65,252, 2, 0, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+248, 73,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104, 74,252, 2, 0, 0, 0, 0,136, 73,252, 2, 0, 0, 0, 0,
+136, 66,252, 2, 0, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+104, 74,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216, 74,252, 2, 0, 0, 0, 0,248, 73,252, 2, 0, 0, 0, 0,
+200, 64,252, 2, 0, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+216, 74,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72, 75,252, 2, 0, 0, 0, 0,104, 74,252, 2, 0, 0, 0, 0,
+ 24, 66,252, 2, 0, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 72, 75,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184, 75,252, 2, 0, 0, 0, 0,216, 74,252, 2, 0, 0, 0, 0,
+248, 66,252, 2, 0, 0, 0, 0,216, 67,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+184, 75,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40, 76,252, 2, 0, 0, 0, 0, 72, 75,252, 2, 0, 0, 0, 0,
+104, 67,252, 2, 0, 0, 0, 0, 72, 68,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 40, 76,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152, 76,252, 2, 0, 0, 0, 0,184, 75,252, 2, 0, 0, 0, 0,
+ 24, 66,252, 2, 0, 0, 0, 0,184, 68,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+152, 76,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8, 77,252, 2, 0, 0, 0, 0, 40, 76,252, 2, 0, 0, 0, 0,
+ 72, 68,252, 2, 0, 0, 0, 0,184, 68,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 8, 77,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120, 77,252, 2, 0, 0, 0, 0,152, 76,252, 2, 0, 0, 0, 0,
+200, 64,252, 2, 0, 0, 0, 0, 40, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+120, 77,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232, 77,252, 2, 0, 0, 0, 0, 8, 77,252, 2, 0, 0, 0, 0,
+216, 67,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+232, 77,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88, 78,252, 2, 0, 0, 0, 0,120, 77,252, 2, 0, 0, 0, 0,
+104, 67,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 88, 78,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200, 78,252, 2, 0, 0, 0, 0,232, 77,252, 2, 0, 0, 0, 0,
+ 40, 69,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+200, 78,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56, 79,252, 2, 0, 0, 0, 0, 88, 78,252, 2, 0, 0, 0, 0,
+ 40, 69,252, 2, 0, 0, 0, 0, 8, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 56, 79,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168, 79,252, 2, 0, 0, 0, 0,200, 78,252, 2, 0, 0, 0, 0,
+152, 69,252, 2, 0, 0, 0, 0, 8, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+168, 79,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24, 80,252, 2, 0, 0, 0, 0, 56, 79,252, 2, 0, 0, 0, 0,
+136, 66,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 24, 80,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136, 80,252, 2, 0, 0, 0, 0,168, 79,252, 2, 0, 0, 0, 0,
+216, 67,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+136, 80,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248, 80,252, 2, 0, 0, 0, 0, 24, 80,252, 2, 0, 0, 0, 0,
+ 8, 70,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+248, 80,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104, 81,252, 2, 0, 0, 0, 0,136, 80,252, 2, 0, 0, 0, 0,
+ 40, 69,252, 2, 0, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+104, 81,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216, 81,252, 2, 0, 0, 0, 0,248, 80,252, 2, 0, 0, 0, 0,
+ 8, 70,252, 2, 0, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+216, 81,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72, 82,252, 2, 0, 0, 0, 0,104, 81,252, 2, 0, 0, 0, 0,
+232, 70,252, 2, 0, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 72, 82,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184, 82,252, 2, 0, 0, 0, 0,216, 81,252, 2, 0, 0, 0, 0,
+ 72, 68,252, 2, 0, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+184, 82,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40, 83,252, 2, 0, 0, 0, 0, 72, 82,252, 2, 0, 0, 0, 0,
+216, 67,252, 2, 0, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 40, 83,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152, 83,252, 2, 0, 0, 0, 0,184, 82,252, 2, 0, 0, 0, 0,
+248, 66,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+152, 83,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8, 84,252, 2, 0, 0, 0, 0, 40, 83,252, 2, 0, 0, 0, 0,
+184, 68,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 8, 84,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120, 84,252, 2, 0, 0, 0, 0,152, 83,252, 2, 0, 0, 0, 0,
+200, 71,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+120, 84,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232, 84,252, 2, 0, 0, 0, 0, 8, 84,252, 2, 0, 0, 0, 0,
+136, 66,252, 2, 0, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+232, 84,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 84,252, 2, 0, 0, 0, 0,
+120, 70,252, 2, 0, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+ 88, 85,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 40, 89,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+136, 66,252, 2, 0, 0, 0, 0, 56, 65,252, 2, 0, 0, 0, 0,168, 65,252, 2, 0, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,162,252, 2, 0, 0, 0, 0,200,162,252, 2, 0, 0, 0, 0,
+ 72, 86,252, 2, 0, 0, 0, 0,184, 87,252, 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, 68, 65, 84, 65, 40, 1, 0, 0, 72, 86,252, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,184, 87,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68,
0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,
0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,136,151, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 96,150, 60, 10, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192,
- 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 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, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 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, 2, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 96, 0, 0, 0,176,152, 60, 10,
-200, 0, 0, 0, 1, 0, 0, 0,216,173, 60, 10,208,149, 60, 10, 48,141, 84, 10,240,203, 80, 9,208,171, 79, 9, 16,160, 78, 10,
- 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,219, 1, 0, 0, 4, 4, 74, 1,220, 1, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,208,172, 60, 10,208,172, 60, 10, 64,153, 60, 10,104,154, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 64,153, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,104,154, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,165, 67, 0, 0, 0, 0,
- 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67,
- 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 74, 1, 31, 0, 74, 1,
- 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0,189, 1, 0, 0,219, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 1, 31, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,104,154, 60, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64,153, 60, 10, 0, 0, 0, 0, 0, 0,165, 67, 0,128, 86,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184, 87,252, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 86,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69,
+ 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0,
+ 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0,
+ 18, 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,128, 63, 0, 0,128, 63,
+ 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 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, 97, 4, 0, 0, 97, 4, 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, 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, 68, 65, 84, 65,160, 0, 0, 0, 40, 89,252, 2, 0, 0, 0, 0,
+194, 0, 0, 0, 1, 0, 0, 0,184,113,252, 2, 0, 0, 0, 0, 88, 85,252, 2, 0, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0,
+ 72, 68,252, 2, 0, 0, 0, 0,184, 68,252, 2, 0, 0, 0, 0, 24, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 45, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,219, 1, 0, 0, 4, 4, 74, 1,220, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,120,112,252, 2, 0, 0, 0, 0,120,112,252, 2, 0, 0, 0, 0, 24, 90,252, 2, 0, 0, 0, 0,
+136, 91,252, 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, 68, 65, 84, 65, 40, 1, 0, 0, 24, 90,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+136, 91,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0,165, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0,
+ 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0, 74, 1, 31, 0, 74, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 45, 6, 0, 0,118, 7, 0, 0,189, 1, 0, 0,219, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 74, 1, 31, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136, 91,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 24, 90,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,165, 67, 0,128, 86,196, 0, 0, 0, 0,
0, 0, 0, 0, 1,128,156, 67, 2,128,222,195, 0, 0, 0, 0, 57, 1, 0, 0, 74, 1, 0, 0, 0, 0, 0, 0,188, 1, 0, 0,
0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 0, 0,188, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 4, 6, 0, 74, 1,189, 1, 57, 1,189, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,
-118, 7, 0, 0, 0, 0, 0, 0,188, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 1,189, 1,
+ 18, 0, 0, 4, 6, 0, 74, 1,189, 1, 57, 1,189, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 45, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,188, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 74, 1,189, 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,248, 92,252, 2, 0, 0, 0, 0,
+216,110,252, 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, 68, 65, 84, 65, 88, 1, 0, 0,248, 92,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+152, 94,252, 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,
+ 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,144,155, 60, 10, 96,171, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0,144,155, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 0,157, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,220,255, 57, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,220,255, 57, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+152, 94,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 56, 96,252, 2, 0, 0, 0, 0,248, 92,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 0,157, 60, 10,
-199, 0, 0, 0, 1, 0, 0, 0,112,158, 60, 10,144,155, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 57, 1, 61, 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, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 57, 1, 61, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,112,158, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,224,159, 60, 10,
- 0,157, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56, 96,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+216, 97,252, 2, 0, 0, 0, 0,152, 94,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 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,
+ 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,224,159, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 80,161, 60, 10,112,158, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,111,255, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 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,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+216, 97,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,120, 99,252, 2, 0, 0, 0, 0, 56, 96,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
+105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
+105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,140,254, 57, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, 57, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 80,161, 60, 10,199, 0, 0, 0,
- 1, 0, 0, 0,192,162, 60, 10,224,159, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,
-116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,
-116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, 57, 1, 58, 0, 20, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,120, 99,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 24,101,252, 2, 0, 0, 0, 0,216, 97,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,192,162, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 48,164, 60, 10, 80,161, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0,
+ 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0,
+ 0, 0, 58,254, 57, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+ 24,101,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,184,102,252, 2, 0, 0, 0, 0,120, 99,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110,
+ 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110,
+ 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70,117,108,108, 32, 83, 97,109,112,108,101, 32, 77,111,116,105,
+111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, 57, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 70,117,108,108, 32, 83, 97,109,112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, 57, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,184,102,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 88,104,252, 2, 0, 0, 0, 0, 24,101,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
- 48,164, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,160,165, 60, 10,192,162, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,
-105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,
- 57, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,164,253, 57, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,160,165, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,
- 16,167, 60, 10, 48,164, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+ 88,104,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,248,105,252, 2, 0, 0, 0, 0,184,102,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -218,302 +272,360 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0, 16,167, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,128,168, 60, 10,160,165, 60, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,248,105,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+152,107,252, 2, 0, 0, 0, 0, 88,104,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,242,252, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,242,252, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,128,168, 60, 10,
-199, 0, 0, 0, 1, 0, 0, 0,240,169, 60, 10, 16,167, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111,
- 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252, 57, 1, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+152,107,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 56,109,252, 2, 0, 0, 0, 0,248,105,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,
+114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,
+114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,240,169, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 96,171, 60, 10,
-128,168, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56,109,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+216,110,252, 2, 0, 0, 0, 0,152,107,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252, 57, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0, 96,171, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240,169, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,194,252, 57, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+216,110,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,109,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,170,252, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,208,172, 60, 10,165, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120,112,252, 2, 0, 0, 0, 0,159, 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,
+ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 96, 0, 0, 0,216,173, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,160,177, 60, 10,176,152, 60, 10,248, 15, 55, 10, 96,211, 87, 9,
- 88, 68, 81, 10, 48,141, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0,131, 0, 0, 0, 15, 15, 44, 6,
-132, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,176, 60, 10,184,176, 60, 10,104,174, 60, 10,144,175, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,104,174, 60, 10,201, 0, 0, 0,
- 1, 0, 0, 0,144,175, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,137, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0,128,197, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68,
- 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4,
- 10, 0, 44, 6, 26, 0, 44, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 26, 0, 0, 0, 1, 0,
- 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, 68, 65, 84, 65,
-248, 0, 0, 0,144,175, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,104,174, 60, 10, 0, 0, 64,192, 0, 0,126, 67,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+184,113,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,168,118,252, 2, 0, 0, 0, 0, 40, 89,252, 2, 0, 0, 0, 0,
+200, 64,252, 2, 0, 0, 0, 0, 40, 69,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0,131, 0, 0, 0, 15, 15, 44, 6,132, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,117,252, 2, 0, 0, 0, 0,136,117,252, 2, 0, 0, 0, 0,
+168,114,252, 2, 0, 0, 0, 0, 24,116,252, 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, 68, 65, 84, 65, 40, 1, 0, 0,168,114,252, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 24,116,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,137, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,197, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 44, 6, 26, 0, 44, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0, 24,116,252, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,114,252, 2, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67,
0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0,
18, 0, 0, 0,105, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65,
72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 44, 6,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 26, 0, 0, 0,131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 44, 6,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 26, 0, 0, 0,131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 44, 6,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,188, 0, 0, 0,184,176, 60, 10,176, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,136,117,252, 2, 0, 0, 0, 0,
+170, 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, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,
-160,177, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,128,182, 60, 10,216,173, 60, 10,240,203, 80, 9, 8, 40, 82, 9,192, 37, 85, 10,
-208,171, 79, 9, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0,221, 1, 0, 0, 99, 3, 0, 0, 3, 3, 74, 1,135, 1, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,180, 60, 10,128,180, 60, 10, 48,178, 60, 10, 88,179, 60, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48,178, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 88,179, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,165, 67,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 66, 67, 0, 0,200, 65,
- 0, 0, 66, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 74, 1,
- 26, 0, 74, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0, 74, 3, 0, 0,
- 99, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 1, 26, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
- 88,179, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48,178, 60, 10, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,128,156, 67, 0,128,173,195, 0, 0, 0, 0, 57, 1, 0, 0, 74, 1, 0, 0, 18, 0, 0, 0,
-108, 1, 0, 0, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 56, 1, 0, 0, 18, 0, 0, 0,
-108, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0,
- 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 74, 1,109, 1, 57, 1, 91, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 45, 6, 0, 0,118, 7, 0, 0,221, 1, 0, 0, 73, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 74, 1,109, 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, 68, 65, 84, 65,252, 0, 0, 0,128,180, 60, 10,169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0,168,118,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,104,125,252, 2, 0, 0, 0, 0,
+184,113,252, 2, 0, 0, 0, 0, 72, 68,252, 2, 0, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0,
+184, 68,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0,221, 1, 0, 0, 99, 3, 0, 0,
+ 3, 3, 74, 1,135, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,122,252, 2, 0, 0, 0, 0,
+120,122,252, 2, 0, 0, 0, 0,152,119,252, 2, 0, 0, 0, 0, 8,121,252, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+152,119,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 8,121,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,165, 67, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 66, 67, 0, 0,200, 65, 0, 0, 66, 67, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 74, 1, 26, 0, 74, 1, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0, 74, 3, 0, 0, 99, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 1, 26, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+ 8,121,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,119,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,156, 67, 0,128,173,195, 0, 0, 0, 0,
+ 57, 1, 0, 0, 74, 1, 0, 0, 18, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0, 56, 1, 0, 0, 18, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 74, 1,109, 1, 57, 1, 91, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0,221, 1, 0, 0, 73, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 1,109, 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, 68, 65, 84, 65, 24, 1, 0, 0,
+120,122,252, 2, 0, 0, 0, 0,163, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 41, 82, 9, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 12, 0, 0, 0,152, 41, 82, 9,
-224, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,168,181, 60, 10, 68, 65, 84, 65,168, 0, 0, 0,168,181, 60, 10,
-223, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16,228, 90, 10, 19, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10,
- 20, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 21, 0, 1, 0, 1, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,
-224,243, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,152,250, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,240, 74, 92, 10, 0, 0, 0, 0,
- 1, 0, 1, 0, 40, 4, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,168, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0, 96,255, 90, 10,
- 0, 0, 0, 0, 1, 0, 1, 0,112,240, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,208,245, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,
-216,239, 90, 10, 21, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 68, 65, 84, 65, 96, 0, 0, 0,128,182, 60, 10,200, 0, 0, 0,
- 1, 0, 0, 0,120,193, 60, 10,160,177, 60, 10,160,154, 61, 10,224, 27, 77, 10,240,152, 88, 9, 88, 68, 81, 10, 0, 0, 0, 0,
-161, 2, 0, 0, 43, 6, 0, 0,133, 0, 0, 0, 69, 4, 0, 0, 1, 1,139, 3,193, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 80,192, 60, 10, 80,192, 60, 10, 16,183, 60, 10,176,187, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 16,183, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 56,184, 60, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,117, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 98, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0,216,123,252, 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,138, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,139, 3, 26, 0,139, 3, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0, 43, 6, 0, 0,133, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,216,123,252, 2, 0, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0,
+ 14, 0, 0, 0, 14, 0, 0, 0, 56,124,252, 2, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, 56,124,252, 2, 0, 0, 0, 0,
+216, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0,
+232,190,255, 2, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 21, 0, 1, 0, 1, 0, 0, 0,
+232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,168,211,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+ 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,152, 49, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+232,232,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,200,142, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+232,226,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 40,207,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+ 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 88,206,255, 2, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 1, 0,
+232,190,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,104,125,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
+200,138,252, 2, 0, 0, 0, 0,168,118,252, 2, 0, 0, 0, 0, 8, 70,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0,
+216, 67,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0, 43, 6, 0, 0,
+133, 0, 0, 0, 69, 4, 0, 0, 1, 1,139, 3,193, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 56,137,252, 2, 0, 0, 0, 0, 56,137,252, 2, 0, 0, 0, 0, 88,126,252, 2, 0, 0, 0, 0, 24,132,252, 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, 68, 65, 84, 65,248, 0, 0, 0, 56,184, 60, 10,201, 0, 0, 0,
- 1, 0, 0, 0, 96,185, 60, 10, 16,183, 60, 10, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,
-142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0,
- 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0,161, 2, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0, 88,126,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,200,127,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 98, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,138, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65,
+ 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,139, 3,
+ 26, 0,139, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0, 43, 6, 0, 0,
+133, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139, 3, 26, 0, 0, 0, 1, 0,
+ 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,
+ 68, 65, 84, 65, 40, 1, 0, 0,200,127,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 56,129,252, 2, 0, 0, 0, 0,
+ 88,126,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,
+255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0,
+ 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0,161, 2, 0, 0,
159, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,167, 3, 0, 0, 5, 0,
3, 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, 68, 65, 84, 65,
-248, 0, 0, 0, 96,185, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,136,186, 60, 10, 56,184, 60, 10, 0, 0, 0, 0, 0, 0, 16, 67,
- 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0,
- 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
- 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,161, 2, 0, 0, 43, 6, 0, 0,159, 0, 0, 0,159, 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, 6, 0, 34, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,136,186, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,176,187, 60, 10,
- 96,185, 60, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 96,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 96,196,
- 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,147, 3, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,147, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,148, 3,163, 0,
-130, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 43, 6, 0, 0,159, 0, 0, 0, 69, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 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, 68, 65, 84, 65,248, 0, 0, 0,176,187, 60, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136,186, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0, 56,129,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,168,130,252, 2, 0, 0, 0, 0,
+200,127,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67,
+ 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,
+120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0, 43, 6, 0, 0,
+159, 0, 0, 0,159, 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, 6, 0,
+ 34, 0, 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,
+ 68, 65, 84, 65, 40, 1, 0, 0,168,130,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 24,132,252, 2, 0, 0, 0, 0,
+ 56,129,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 96,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67,
+ 0,128, 96,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,147, 3, 0, 0, 0, 0, 0, 0,162, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,147, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,
+148, 3,163, 0,130, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 43, 6, 0, 0,
+159, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0,
+ 4, 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,161, 2, 0, 0,
- 43, 6, 0, 0,159, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139, 3,167, 3,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,188, 60, 10,
- 68, 65, 84, 65, 72, 3, 0, 0,216,188, 60, 10,159, 0, 0, 0, 1, 0, 0, 0,107, 82,144, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 13,128,191,
- 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 74,215, 76,190, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63,
- 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188,
- 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62,
- 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, 0, 0,128, 63, 89,180,236, 62,209,249,224,190, 48,180, 81,191,
-184,158, 81,191, 65,158,131, 63,142,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62, 38, 11,117,188,207,156,122, 63,138, 84,228,190,
- 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65,214,211,111, 65,211, 48,186, 62, 11, 16, 79, 63,144,199, 64,188,
- 0, 0,135,180,163, 15,188,190,102, 75, 53, 62,223,125, 81, 63, 0, 0,104, 51,207,107,117,194, 81,204,216, 65, 40,156, 5,194,
-136,247,159,192,121, 62,114, 66,214,253,213,193, 94,225, 3, 66,236, 7,160, 64, 68,239,209, 62, 51,177,205,190,184,158, 81, 63,
- 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 89,180,236, 62,209,249,224,190, 48,180, 81,191,
-184,158, 81,191, 65,158,131, 63,142,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62, 38, 11,117,188,207,156,122, 63,138, 84,228,190,
- 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65,214,211,111, 65, 99,181, 12, 64, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 99,181, 12, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99,181, 12, 64,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190,237,203,148,190,
- 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 14, 43, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0, 24,132,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+168,130,252, 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,161, 2, 0, 0, 43, 6, 0, 0,
+159, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139, 3,167, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,133,252, 2, 0, 0, 0, 0,
+ 68, 65, 84, 65,104, 3, 0, 0,136,133,252, 2, 0, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0,107, 82,144, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 28, 13,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 74,215, 76,190, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,
+184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63,
+ 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,
+176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190,
+ 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, 0, 0,128, 63, 89,180,236, 62,209,249,224,190,
+ 48,180, 81,191,184,158, 81,191, 65,158,131, 63,142,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62, 38, 11,117,188,207,156,122, 63,
+138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65,214,211,111, 65,211, 48,186, 62, 11, 16, 79, 63,
+144,199, 64,188, 0, 0,135,180,163, 15,188,190,102, 75, 53, 62,223,125, 81, 63, 0, 0,104, 51,207,107,117,194, 81,204,216, 65,
+ 40,156, 5,194,136,247,159,192,121, 62,114, 66,214,253,213,193, 94,225, 3, 66,236, 7,160, 64, 68,239,209, 62, 51,177,205,190,
+184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63,
+ 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 89,180,236, 62,209,249,224,190,
+ 48,180, 81,191,184,158, 81,191, 65,158,131, 63,142,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62, 38, 11,117,188,207,156,122, 63,
+138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65,214,211,111, 65, 99,181, 12, 64, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99,181, 12, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 99,181, 12, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190,
+237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 14, 43, 0, 59, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 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,128, 63, 30, 33, 12, 66, 85,152,137, 66,116, 27,126, 66, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0, 80,192, 60, 10,160, 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, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,208,245, 90, 10, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0,
- 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 3, 0,255,255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,120,193, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,240,199, 60, 10,
-128,182, 60, 10, 96,211, 87, 9,104,177, 80, 9,104, 32, 59, 10,160,154, 61, 10, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,
-133, 0, 0, 0,139, 1, 0, 0, 2, 2,160, 2, 7, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,198, 60, 10,
-168,198, 60, 10, 8,194, 60, 10,128,197, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0, 8,194, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 48,195, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,100, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 40, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65, 0,192,103, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,160, 2, 26, 0,160, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,133, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,160, 2, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0, 48,195, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 88,196, 60, 10,
- 8,194, 60, 10, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0, 91,195,
- 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,217, 0,237, 0,200, 0,
-219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0,159, 0, 0, 0,139, 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,128, 63, 30, 33, 12, 66, 85,152,137, 66,116, 27,126, 66, 0, 0, 0, 0,
+ 68, 65, 84, 65, 72, 1, 0, 0, 56,137,252, 2, 0, 0, 0, 0,154, 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, 1, 0, 0, 0, 51, 51, 51, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 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,
+ 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63,
+ 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0,200,138,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 40,147,252, 2, 0, 0, 0, 0,
+104,125,252, 2, 0, 0, 0, 0, 40, 69,252, 2, 0, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0,
+ 8, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,133, 0, 0, 0,139, 1, 0, 0,
+ 2, 2,160, 2, 7, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,145,252, 2, 0, 0, 0, 0,
+120,145,252, 2, 0, 0, 0, 0,184,139,252, 2, 0, 0, 0, 0, 8,144,252, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+184,139,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 40,141,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128,100, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 40, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,159, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65, 0,192,103, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,160, 2, 26, 0,160, 2, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,133, 0, 0, 0,158, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 2, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+ 40,141,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,152,142,252, 2, 0, 0, 0, 0,184,139,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0, 91,195, 0, 0, 0, 0,
+200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,217, 0,237, 0,200, 0,219, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0,159, 0, 0, 0,139, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0,237, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88,196, 60, 10,
-201, 0, 0, 0, 1, 0, 0, 0,128,197, 60, 10, 48,195, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+152,142,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 8,144,252, 2, 0, 0, 0, 0, 40,141,252, 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,159, 2, 0, 0,
-159, 2, 0, 0,159, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
- 0, 0, 4, 0, 4, 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,
- 68, 65, 84, 65,248, 0, 0, 0,128,197, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88,196, 60, 10, 0, 0, 16,193,
- 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 16,193, 0, 0, 32, 65, 0, 0, 0, 0,
- 17, 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 18, 0, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,
-198, 1, 0, 0, 18, 0, 0, 0,236, 0, 0, 0,111, 18,131, 58,111, 18,131, 58, 0,124,146, 72, 0, 80, 67, 71, 0, 0, 0, 0,
- 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,199, 1,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0,159, 2, 0, 0,159, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,199, 1,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,159, 2, 0, 0,159, 0, 0, 0,139, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+ 8,144,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,142,252, 2, 0, 0, 0, 0,
+ 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 16,193, 0, 0, 32, 65,
+ 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 18, 0, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 18, 0, 0, 0,198, 1, 0, 0, 18, 0, 0, 0,236, 0, 0, 0,111, 18,131, 58,111, 18,131, 58, 0,124,146, 72, 0, 80, 67, 71,
+ 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,199, 1,237, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0,159, 2, 0, 0,159, 0, 0, 0,139, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 1,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0,168,198, 60, 10,164, 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, 68, 65, 84, 65,240, 0, 0, 0,
+120,145,252, 2, 0, 0, 0, 0,158, 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, 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,168,199, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,168,199, 60, 10, 23, 1, 0, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 96, 0, 0, 0,240,199, 60, 10,200, 0, 0, 0, 1, 0, 0, 0, 0,205, 60, 10,120,193, 60, 10,104,177, 80, 9, 16,228, 79, 9,
-224, 27, 77, 10,104, 32, 59, 10, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,141, 1, 0, 0, 69, 4, 0, 0, 12, 12,160, 2,
-185, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,203, 60, 10,248,203, 60, 10,128,200, 60, 10,208,202, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128,200, 60, 10,201, 0, 0, 0,
- 1, 0, 0, 0,168,201, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,106, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0, 0, 40, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68,
- 0, 0,200, 65, 0,192,103, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4,
- 10, 0,160, 2, 26, 0,160, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,
-141, 1, 0, 0,166, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 2, 26, 0, 0, 0, 1, 0,
- 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, 68, 65, 84, 65,
-248, 0, 0, 0,168,201, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,208,202, 60, 10,128,200, 60, 10, 0, 0, 0, 0, 0, 0, 55, 67,
- 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 64, 35,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0,
- 18, 0, 0, 0,158, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 8, 4, 0, 0, 2, 0, 3, 3, 0, 0, 2, 4, 6, 0,200, 0,159, 2,200, 0,141, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0,167, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,200, 0,159, 2, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,208,202, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
-168,201, 60, 10, 0, 0, 32,193, 0, 0,104, 68, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,104, 68, 0, 64, 35,196,
- 0, 0, 0, 0,199, 1, 0, 0,216, 1, 0, 0, 18, 0, 0, 0,158, 2, 0, 0, 0, 0, 0, 0,198, 1, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0,198, 1, 0, 0, 18, 0, 0, 0,158, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,146, 72,
- 0, 64, 28, 70, 10,215, 35, 60, 0, 0, 72, 66, 74, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 4, 4, 0,216, 1,159, 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,184,146,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,184,146,252, 2, 0, 0, 0, 0, 16, 1, 0, 0, 1, 0, 0, 0,232,190,255, 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,
+ 68, 65, 84, 65,160, 0, 0, 0, 40,147,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,184,153,252, 2, 0, 0, 0, 0,
+200,138,252, 2, 0, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0,136, 66,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0,
+ 88, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,141, 1, 0, 0, 69, 4, 0, 0,
+ 12, 12,160, 2,185, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,152,252, 2, 0, 0, 0, 0,
+104,152,252, 2, 0, 0, 0, 0, 24,148,252, 2, 0, 0, 0, 0,248,150,252, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+ 24,148,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,136,149,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,106, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 40, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,159, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65, 0,192,103, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,160, 2, 26, 0,160, 2, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,141, 1, 0, 0,166, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 2, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+136,149,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,248,150,252, 2, 0, 0, 0, 0, 24,148,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 55, 67, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 64, 35,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0,158, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 8, 4, 0, 0, 2, 0, 3, 3, 0, 0, 2, 4, 6, 0,200, 0,159, 2,200, 0,141, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0,167, 1, 0, 0, 69, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 0,159, 2, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+248,150,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,149,252, 2, 0, 0, 0, 0,
+ 0, 0, 32,193, 0, 0,104, 68, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,104, 68, 0, 64, 35,196, 0, 0, 0, 0,
+199, 1, 0, 0,216, 1, 0, 0, 18, 0, 0, 0,158, 2, 0, 0, 0, 0, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,198, 1, 0, 0, 18, 0, 0, 0,158, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,146, 72, 0, 64, 28, 70,
+ 10,215, 35, 60, 0, 0, 72, 66, 74, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 4, 4, 0,216, 1,159, 2, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 0, 0, 0,159, 2, 0, 0,167, 1, 0, 0, 69, 4, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 1,159, 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, 68, 65, 84, 65,216, 0, 0, 0,248,203, 60, 10,
- 24, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 1, 0, 0,
+104,152,252, 2, 0, 0, 0, 0, 17, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 2, 0, 0, 0, 0,
- 68, 65, 84, 65, 96, 0, 0, 0, 0,205, 60, 10,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240,199, 60, 10, 8, 40, 82, 9,
-240,152, 88, 9,184, 29, 79, 9,192, 37, 85, 10, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0,101, 3, 0, 0, 69, 4, 0, 0,
- 1, 1, 74, 1,225, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,211, 60, 10, 88,211, 60, 10,144,205, 60, 10,
-184,206, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,144,205, 60, 10,
-201, 0, 0, 0, 1, 0, 0, 0,184,206, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65,
+232,190,255, 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, 3, 2, 0, 2, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,184,153,252, 2, 0, 0, 0, 0,
+194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,147,252, 2, 0, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0,
+216, 67,252, 2, 0, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 45, 6, 0, 0,118, 7, 0, 0,101, 3, 0, 0, 69, 4, 0, 0, 1, 1, 74, 1,225, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56,161,252, 2, 0, 0, 0, 0, 56,161,252, 2, 0, 0, 0, 0,168,154,252, 2, 0, 0, 0, 0,
+ 24,156,252, 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, 68, 65, 84, 65, 40, 1, 0, 0,168,154,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 24,156,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65,
0, 0, 0, 0, 0, 0,165, 67, 0, 0, 0, 64, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0,
0,128,164, 67, 0, 0,200, 65, 0,128,164, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
- 4, 0, 12, 0, 10, 0, 74, 1, 24, 0, 74, 1, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,
-118, 7, 0, 0,101, 3, 0, 0,101, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
- 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 0, 12, 0, 10, 0, 74, 1, 24, 0, 74, 1, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 45, 6, 0, 0,118, 7, 0, 0,101, 3, 0, 0,101, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,184,206, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,144,205, 60, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,156,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,168,154,252, 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, 45, 6, 0, 0,118, 7, 0, 0,101, 3, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 74, 1,225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 45, 6, 0, 0,118, 7, 0, 0,101, 3, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 74, 1,225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,224,207, 60, 10, 68, 65, 84, 65, 72, 3, 0, 0,224,207, 60, 10,159, 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,
+136,157,252, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0,136,157,252, 2, 0, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0,
24,255, 13, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 66, 80, 64, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,154, 65,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 72, 1, 77,190, 0, 0, 0, 0,
221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,
@@ -539,169 +651,216 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88,211, 60, 10,160, 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, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 7, 0,208,245, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,
- 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,140, 0, 0, 0,224,212, 60, 10,
-196, 0, 0, 0, 1, 0, 0, 0, 24, 81, 88, 10, 88,159, 78, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 67,111,109,112,111,115,
-105,116,105,110,103, 0,103, 46, 48, 48, 49, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,213, 60, 10,
-216,216, 60, 10, 24,217, 60, 10, 0,223, 60, 10, 72,223, 60, 10,200, 43, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,152,213, 60, 10,
-197, 0, 0, 0, 1, 0, 0, 0,216,213, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,216,213, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 24,214, 60, 10,152,213, 60, 10, 0, 0, 0, 0, 0, 0, 97, 4,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 24,214, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 88,214, 60, 10,216,213, 60, 10,
- 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 88,214, 60, 10,197, 0, 0, 0, 1, 0, 0, 0,
-152,214, 60, 10, 24,214, 60, 10, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,152,214, 60, 10,
-197, 0, 0, 0, 1, 0, 0, 0,216,214, 60, 10, 88,214, 60, 10, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,216,214, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 24,215, 60, 10,152,214, 60, 10, 0, 0, 0, 0,118, 7, 70, 4,
- 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 24,215, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 88,215, 60, 10,216,214, 60, 10,
- 0, 0, 0, 0, 24, 6,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 88,215, 60, 10,197, 0, 0, 0, 1, 0, 0, 0,
-152,215, 60, 10, 24,215, 60, 10, 0, 0, 0, 0,118, 7,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,152,215, 60, 10,
-197, 0, 0, 0, 1, 0, 0, 0,216,215, 60, 10, 88,215, 60, 10, 0, 0, 0, 0, 24, 6, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,216,215, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 24,216, 60, 10,152,215, 60, 10, 0, 0, 0, 0, 0, 0,172, 1,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 24,216, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 88,216, 60, 10,216,215, 60, 10,
- 0, 0, 0, 0, 24, 6,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 88,216, 60, 10,197, 0, 0, 0, 1, 0, 0, 0,
-152,216, 60, 10, 24,216, 60, 10, 0, 0, 0, 0, 0, 3,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,152,216, 60, 10,
-197, 0, 0, 0, 1, 0, 0, 0,216,216, 60, 10, 88,216, 60, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,216,216, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,152,216, 60, 10, 0, 0, 0, 0, 24, 6, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 24,217, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 96,217, 60, 10, 0, 0, 0, 0,
-216,213, 60, 10, 24,214, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 96,217, 60, 10,198, 0, 0, 0,
- 1, 0, 0, 0,168,217, 60, 10, 24,217, 60, 10,216,213, 60, 10,152,214, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,168,217, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,240,217, 60, 10, 96,217, 60, 10, 24,214, 60, 10,216,214, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,240,217, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 56,218, 60, 10,
-168,217, 60, 10,152,214, 60, 10,216,214, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56,218, 60, 10,
-198, 0, 0, 0, 1, 0, 0, 0,128,218, 60, 10,240,217, 60, 10, 88,214, 60, 10, 88,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,128,218, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,200,218, 60, 10, 56,218, 60, 10, 24,215, 60, 10,
- 88,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,200,218, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 16,219, 60, 10,128,218, 60, 10,216,214, 60, 10,152,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 16,219, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 88,219, 60, 10,200,218, 60, 10,152,214, 60, 10,152,215, 60, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 88,219, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,160,219, 60, 10, 16,219, 60, 10,
- 24,215, 60, 10,152,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160,219, 60, 10,198, 0, 0, 0,
- 1, 0, 0, 0,232,219, 60, 10, 88,219, 60, 10,216,214, 60, 10, 88,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,232,219, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 48,220, 60, 10,160,219, 60, 10,152,214, 60, 10,216,215, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 48,220, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,120,220, 60, 10,
-232,219, 60, 10,152,215, 60, 10, 24,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120,220, 60, 10,
-198, 0, 0, 0, 1, 0, 0, 0,192,220, 60, 10, 48,220, 60, 10,216,215, 60, 10, 24,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,192,220, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 8,221, 60, 10,120,220, 60, 10,216,215, 60, 10,
- 88,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 8,221, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 80,221, 60, 10,192,220, 60, 10, 24,216, 60, 10, 88,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 80,221, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,152,221, 60, 10, 8,221, 60, 10,152,213, 60, 10,152,216, 60, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,152,221, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,224,221, 60, 10, 80,221, 60, 10,
-152,216, 60, 10,216,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,224,221, 60, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 40,222, 60, 10,152,221, 60, 10, 88,214, 60, 10,216,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 40,222, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,112,222, 60, 10,224,221, 60, 10, 24,215, 60, 10,216,216, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112,222, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,184,222, 60, 10,
- 40,222, 60, 10, 88,216, 60, 10,152,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184,222, 60, 10,
-198, 0, 0, 0, 1, 0, 0, 0, 0,223, 60, 10,112,222, 60, 10, 24,216, 60, 10,216,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0, 0,223, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,184,222, 60, 10,152,213, 60, 10,
-216,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 72,223, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,
- 40,226, 60, 10, 0, 0, 0, 0,152,214, 60, 10,216,213, 60, 10, 24,214, 60, 10,216,214, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
-118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,
-240, 8, 61, 10,240, 8, 61, 10,216,223, 60, 10, 0,225, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,216,223, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0,225, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0, 56,161,252, 2, 0, 0, 0, 0,154, 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, 68, 65, 84, 65,248, 0, 0, 0, 0,225, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,216,223, 60, 10, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69,
- 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 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, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7,
- 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0,
- 97, 4, 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, 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, 68, 65, 84, 65, 96, 0, 0, 0,
- 40,226, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,240,229, 60, 10, 72,223, 60, 10,216,216, 60, 10, 24,215, 60, 10, 88,215, 60, 10,
- 88,214, 60, 10, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 15, 15, 94, 1,100, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8,229, 60, 10, 8,229, 60, 10,184,226, 60, 10,224,227, 60, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,184,226, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,
-224,227, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,110, 68, 0, 0, 0, 0, 0, 0,208, 65, 0,128,161, 67, 0, 64, 40, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65,
- 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 94, 1,
- 26, 0, 94, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,
- 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0,
+ 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 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, 68, 65, 84, 65,248, 0, 0, 0,
-224,227, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,184,226, 60, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0,
- 0, 0, 72, 66, 50, 51, 74,193,154,209,131, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 18, 0, 0, 0,
- 73, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0,
- 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 94, 1, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 25, 6, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 94, 1, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,188, 0, 0, 0, 8,229, 60, 10,176, 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, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 0, 0, 0, 0, 0,
+ 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 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, 83, 78, 0, 0,208, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,190, 0, 0, 0, 1, 0, 0, 0,
+104, 15,253, 2, 0, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83, 82, 67,111,109,112,111,115,105,116,105,110,103, 0,103, 46, 48, 48, 49, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0,152,170,252, 2, 0, 0, 0, 0,
+200,179,252, 2, 0, 0, 0, 0, 56,180,252, 2, 0, 0, 0, 0, 40,232,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 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, 68, 65, 84, 65, 32, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,232,164,252, 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, 68, 65, 84, 65, 32, 0, 0, 0,232,164,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 88,165,252, 2, 0, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0, 88,165,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,200,165,252, 2, 0, 0, 0, 0,
+232,164,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+200,165,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0, 88,165,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0,200,165,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 24,167,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0,
+168,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+136,167,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,118, 7,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 24, 6, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+216,168,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,172, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0,
+104,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 72,169,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,152,170,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8,171,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232,164,252, 2, 0, 0, 0, 0, 88,165,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 8,171,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120,171,252, 2, 0, 0, 0, 0,
+152,170,252, 2, 0, 0, 0, 0,232,164,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,120,171,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232,171,252, 2, 0, 0, 0, 0,
+ 8,171,252, 2, 0, 0, 0, 0, 88,165,252, 2, 0, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,232,171,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88,172,252, 2, 0, 0, 0, 0,
+120,171,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 88,172,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200,172,252, 2, 0, 0, 0, 0,
+232,171,252, 2, 0, 0, 0, 0,200,165,252, 2, 0, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,200,172,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56,173,252, 2, 0, 0, 0, 0,
+ 88,172,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 56,173,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168,173,252, 2, 0, 0, 0, 0,
+200,172,252, 2, 0, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,168,173,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24,174,252, 2, 0, 0, 0, 0,
+ 56,173,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 24,174,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136,174,252, 2, 0, 0, 0, 0,
+168,173,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,136,174,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248,174,252, 2, 0, 0, 0, 0,
+ 24,174,252, 2, 0, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,248,174,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104,175,252, 2, 0, 0, 0, 0,
+136,174,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,104,175,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216,175,252, 2, 0, 0, 0, 0,
+248,174,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,216,175,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72,176,252, 2, 0, 0, 0, 0,
+104,175,252, 2, 0, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 72,176,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184,176,252, 2, 0, 0, 0, 0,
+216,175,252, 2, 0, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,184,176,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40,177,252, 2, 0, 0, 0, 0,
+ 72,176,252, 2, 0, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 40,177,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152,177,252, 2, 0, 0, 0, 0,
+184,176,252, 2, 0, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,152,177,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8,178,252, 2, 0, 0, 0, 0,
+ 40,177,252, 2, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 8,178,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120,178,252, 2, 0, 0, 0, 0,
+152,177,252, 2, 0, 0, 0, 0,200,165,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,120,178,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232,178,252, 2, 0, 0, 0, 0,
+ 8,178,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,232,178,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88,179,252, 2, 0, 0, 0, 0,
+120,178,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 88,179,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200,179,252, 2, 0, 0, 0, 0,
+232,178,252, 2, 0, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,200,179,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 88,179,252, 2, 0, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0, 56,180,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 8,184,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,232,164,252, 2, 0, 0, 0, 0, 88,165,252, 2, 0, 0, 0, 0,
+168,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0,
+ 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 14,253, 2, 0, 0, 0, 0,
+216, 14,253, 2, 0, 0, 0, 0, 40,181,252, 2, 0, 0, 0, 0,152,182,252, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+ 40,181,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,152,182,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+152,182,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,181,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,
+112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,111, 7, 0, 0, 18, 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,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 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, 97, 4, 0, 0, 97, 4, 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, 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, 68, 65, 84, 65,160, 0, 0, 0,
+ 8,184,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,248,188,252, 2, 0, 0, 0, 0, 56,180,252, 2, 0, 0, 0, 0,
+ 40,170,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0,200,165,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 15, 15, 94, 1,100, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,187,252, 2, 0, 0, 0, 0,216,187,252, 2, 0, 0, 0, 0,
+248,184,252, 2, 0, 0, 0, 0,104,186,252, 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, 68, 65, 84, 65, 40, 1, 0, 0,248,184,252, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,104,186,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,110, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0,128,161, 67, 0, 64, 40, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 94, 1, 26, 0, 94, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0,104,186,252, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,184,252, 2, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67,
+ 0, 0, 0, 0, 0, 0, 72, 66, 50, 51, 74,193,154,209,131, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0,
+ 18, 0, 0, 0, 73, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65,
+ 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 94, 1, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,216,187,252, 2, 0, 0, 0, 0,
+170, 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, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,240,229, 60, 10,
-200, 0, 0, 0, 1, 0, 0, 0, 24,251, 60, 10, 40,226, 60, 10, 24,215, 60, 10,152,215, 60, 10,216,214, 60, 10, 88,215, 60, 10,
- 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0,101, 0, 0, 0, 69, 4, 0, 0, 4, 4, 94, 1,225, 3, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 16,250, 60, 10, 16,250, 60, 10,128,230, 60, 10,168,231, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128,230, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,168,231, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,175, 67, 0, 0, 0, 0,
- 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67,
- 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 94, 1, 31, 0, 94, 1,
- 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 39, 4, 0, 0, 69, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0,248,188,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,136,213,252, 2, 0, 0, 0, 0,
+ 8,184,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0,
+136,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0,101, 0, 0, 0, 69, 4, 0, 0,
+ 4, 4, 94, 1,225, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,212,252, 2, 0, 0, 0, 0,
+ 72,212,252, 2, 0, 0, 0, 0,232,189,252, 2, 0, 0, 0, 0, 88,191,252, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+232,189,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 88,191,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,175, 67, 0, 0, 0, 0, 0, 0,248, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 94, 1, 31, 0, 94, 1, 31, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 39, 4, 0, 0, 69, 4, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 31, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168,231, 60, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128,230, 60, 10, 0, 0, 0, 0, 0,128,174, 67, 0, 64,112,196, 0, 0, 0, 0,
- 0, 0, 0, 0,255,127,166, 67,254,127,112,196, 0, 0, 0, 0, 77, 1, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0,193, 3, 0, 0,
- 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0,193, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 4, 6, 0, 94, 1,194, 3, 77, 1,194, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,
-118, 7, 0, 0,101, 0, 0, 0, 38, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1,194, 3,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,208,232, 60, 10,160,248, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0,208,232, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 64,234, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+ 88,191,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,189,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128,174, 67, 0, 64,112,196, 0, 0, 0, 0, 0, 0, 0, 0,255,127,166, 67,254,127,112,196, 0, 0, 0, 0,
+ 77, 1, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0,193, 3, 0, 0, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0,193, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 94, 1,194, 3, 77, 1,194, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0,101, 0, 0, 0, 38, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1,194, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,200,192,252, 2, 0, 0, 0, 0,168,210,252, 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, 68, 65, 84, 65, 88, 1, 0, 0,
+200,192,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104,194,252, 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, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,
+120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,
+120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255, 76, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,220,255, 76, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 64,234, 60, 10,
-199, 0, 0, 0, 1, 0, 0, 0,176,235, 60, 10,208,232, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104,194,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 8,196,252, 2, 0, 0, 0, 0,200,192,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 76, 1, 61, 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,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,176,235, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 32,237, 60, 10,
- 64,234, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0,
+ 0, 0,135,255, 76, 1, 61, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+ 8,196,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168,197,252, 2, 0, 0, 0, 0,104,194,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 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, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0, 32,237, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,144,238, 60, 10,176,235, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 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, 68, 65, 84, 65, 88, 1, 0, 0,168,197,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 72,199,252, 2, 0, 0, 0, 0, 8,196,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -711,82 +870,89 @@ char datatoc_startup_blend[]= {
0, 0,140,254, 76, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,144,238, 60, 10,199, 0, 0, 0,
- 1, 0, 0, 0, 0,240, 60, 10, 32,237, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,
-116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,
-116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, 76, 1, 58, 0, 20, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+ 72,199,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232,200,252, 2, 0, 0, 0, 0,168,197,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,
+105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,
+105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, 76, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 0,240, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,112,241, 60, 10,144,238, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232,200,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+136,202,252, 2, 0, 0, 0, 0, 72,199,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 70,117,108,108, 32, 83, 97,109,112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 34,254, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 70,117,108,108, 32, 83, 97,109,112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+136,202,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40,204,252, 2, 0, 0, 0, 0,232,200,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,
+103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,
+103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253, 76, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-112,241, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,224,242, 60, 10, 0,240, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,
-105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,
- 76, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40,204,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+200,205,252, 2, 0, 0, 0, 0,136,202,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,224,242, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,
- 80,244, 60, 10,112,241, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116,
+ 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 10,253, 76, 1,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,253, 76, 1,130, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+200,205,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104,207,252, 2, 0, 0, 0, 0, 40,204,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,
+109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,
+109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0, 80,244, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,192,245, 60, 10,224,242, 60, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104,207,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 8,209,252, 2, 0, 0, 0, 0,200,205,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,242,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,192,245, 60, 10,
-199, 0, 0, 0, 1, 0, 0, 0, 48,247, 60, 10, 80,244, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111,
- 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252, 76, 1, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,218,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 48,247, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,160,248, 60, 10,
-192,245, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+ 8,209,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168,210,252, 2, 0, 0, 0, 0,104,207,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,160,248, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48,247, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168,210,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8,209,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -796,160 +962,187 @@ char datatoc_startup_blend[]= {
0, 0,170,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 16,250, 60, 10,165, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
+ 72,212,252, 2, 0, 0, 0, 0,159, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 96, 0, 0, 0, 24,251, 60, 10,200, 0, 0, 0, 1, 0, 0, 0, 16, 6, 61, 10,240,229, 60, 10,152,216, 60, 10, 88,216, 60, 10,
- 24,216, 60, 10,216,216, 60, 10, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0,171, 1, 0, 0, 1, 1, 23, 3,
-172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 4, 61, 10,232, 4, 61, 10,168,251, 60, 10, 72, 0, 61, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168,251, 60, 10,201, 0, 0, 0,
- 1, 0, 0, 0,208,252, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0,192, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68,
- 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4,
- 10, 0, 23, 3, 26, 0, 23, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,136,213,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
+232,226,252, 2, 0, 0, 0, 0,248,188,252, 2, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0,
+216,168,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0,
+ 0, 0, 0, 0,171, 1, 0, 0, 1, 1, 23, 3,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 88,225,252, 2, 0, 0, 0, 0, 88,225,252, 2, 0, 0, 0, 0,120,214,252, 2, 0, 0, 0, 0, 56,220,252, 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,
+ 68, 65, 84, 65, 40, 1, 0, 0,120,214,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,232,215,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 69, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65,
+ 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 23, 3,
+ 26, 0, 23, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0,
0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 3, 26, 0, 0, 0, 1, 0,
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, 68, 65, 84, 65,
-248, 0, 0, 0,208,252, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,248,253, 60, 10,168,251, 60, 10, 0, 0, 0, 0, 0, 0, 15, 67,
- 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0,
- 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
- 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 3, 0, 0, 1, 3, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0,146, 1, 0, 0, 5, 0, 3, 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, 68, 65, 84, 65,248, 0, 0, 0,248,253, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 32,255, 60, 10,
-208,252, 60, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194,
- 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,
-102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0, 26, 0, 0, 0, 26, 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, 6, 0, 34, 0, 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, 68, 65, 84, 65,248, 0, 0, 0, 32,255, 60, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 72, 0, 61, 10,248,253, 60, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,108,196, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 35, 67, 0, 0,184,195, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,129, 1, 0, 0,
- 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,129, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 0, 6, 0,180, 0,130, 1,163, 0,112, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,
- 23, 6, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
- 0, 0, 4, 0, 4, 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,
- 68, 65, 84, 65,248, 0, 0, 0, 72, 0, 61, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32,255, 60, 10, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,232,215,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 88,217,252, 2, 0, 0, 0, 0,
+120,214,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,
+255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0,
+ 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 1, 3, 0, 0,
+ 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,146, 1, 0, 0, 5, 0,
+ 3, 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,
+ 68, 65, 84, 65, 40, 1, 0, 0, 88,217,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,200,218,252, 2, 0, 0, 0, 0,
+232,215,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67,
+ 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,
+120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0,
+ 26, 0, 0, 0, 26, 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, 6, 0,
+ 34, 0, 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, 1, 3, 0, 0, 23, 6, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 23, 3,146, 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,112, 1, 61, 10, 68, 65, 84, 65, 72, 3, 0, 0,112, 1, 61, 10,159, 0, 0, 0, 1, 0, 0, 0,
- 36,101,230, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,171, 98, 64, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,154, 65,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 72, 1, 77,190, 0, 0, 0, 0,
-221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,
-191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, 0, 0,128, 63,
-223,149, 47, 63, 55, 70, 58, 63,192, 56, 49,188, 0, 0, 0, 0, 87,126,162,190,228,251,159, 62, 56, 53,101, 63, 0, 0, 0, 0,
- 7,165, 39, 63,150, 84, 28,191, 50,247,227, 62, 0, 0, 0, 0,110,101,239, 64,151, 62,208,192, 77,255,170, 64, 0, 0,128, 63,
- 3, 6,158, 63, 92,224,143,191,244,250, 39,191, 8,165, 39,191,170,164,167, 63,132,167,141, 63,180,164, 28, 63,149, 84, 28, 63,
- 0,127,159,188,126,242, 74, 64, 8,108,228,190, 50,247,227,190,221,212, 27,191, 39,197,170,191,216, 49, 49, 65,152, 9, 52, 65,
- 25, 25,195, 62, 12,250,206, 62, 0,247,196,187, 0, 0,150,180,203,132,183,189, 61,175,180, 61,245,110,129, 62, 0, 0,120, 51,
-211,120, 21,194,144, 5, 2, 66, 9,136,213,193,193,214,159,192,219, 38, 19, 66,196,173,255,193,157,101,210, 65,173, 40,160, 64,
-221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,
-191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, 0, 0,128, 63,
- 3, 6,158, 63, 92,224,143,191,244,250, 39,191, 8,165, 39,191,170,164,167, 63,132,167,141, 63,180,164, 28, 63,149, 84, 28, 63,
- 0,127,159,188,126,242, 74, 64, 8,108,228,190, 50,247,227,190,221,212, 27,191, 39,197,170,191,216, 49, 49, 65,152, 9, 52, 65,
+ 68, 65, 84, 65, 40, 1, 0, 0,200,218,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 56,220,252, 2, 0, 0, 0, 0,
+ 88,217,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,108,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67,
+ 0, 0,184,195, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,129, 1, 0, 0, 0, 0, 0, 0,162, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,129, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,
+130, 1,163, 0,112, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0, 23, 6, 0, 0,
+ 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0,
+ 4, 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,
-241, 22, 72, 63, 78,162,246,190, 44, 8, 90,190, 3, 35,171,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,
-162, 30,184, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0, 56,220,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+200,218,252, 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, 1, 3, 0, 0, 23, 6, 0, 0,
+ 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 3,146, 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,168,221,252, 2, 0, 0, 0, 0,
+ 68, 65, 84, 65,104, 3, 0, 0,168,221,252, 2, 0, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0, 36,101,230, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,171, 98, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+154, 65,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 72, 1, 77,190, 0, 0, 0, 0,221,149, 47, 63, 85,126,162,190,
+ 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,191, 56, 49,188, 54, 53,101, 63,
+ 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, 0, 0,128, 63,223,149, 47, 63, 55, 70, 58, 63,
+192, 56, 49,188, 0, 0, 0, 0, 87,126,162,190,228,251,159, 62, 56, 53,101, 63, 0, 0, 0, 0, 7,165, 39, 63,150, 84, 28,191,
+ 50,247,227, 62, 0, 0, 0, 0,110,101,239, 64,151, 62,208,192, 77,255,170, 64, 0, 0,128, 63, 3, 6,158, 63, 92,224,143,191,
+244,250, 39,191, 8,165, 39,191,170,164,167, 63,132,167,141, 63,180,164, 28, 63,149, 84, 28, 63, 0,127,159,188,126,242, 74, 64,
+ 8,108,228,190, 50,247,227,190,221,212, 27,191, 39,197,170,191,216, 49, 49, 65,152, 9, 52, 65, 25, 25,195, 62, 12,250,206, 62,
+ 0,247,196,187, 0, 0,150,180,203,132,183,189, 61,175,180, 61,245,110,129, 62, 0, 0,120, 51,211,120, 21,194,144, 5, 2, 66,
+ 9,136,213,193,193,214,159,192,219, 38, 19, 66,196,173,255,193,157,101,210, 65,173, 40,160, 64,221,149, 47, 63, 85,126,162,190,
+ 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,191, 56, 49,188, 54, 53,101, 63,
+ 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, 0, 0,128, 63, 3, 6,158, 63, 92,224,143,191,
+244,250, 39,191, 8,165, 39,191,170,164,167, 63,132,167,141, 63,180,164, 28, 63,149, 84, 28, 63, 0,127,159,188,126,242, 74, 64,
+ 8,108,228,190, 50,247,227,190,221,212, 27,191, 39,197,170,191,216, 49, 49, 65,152, 9, 52, 65, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241, 22, 72, 63, 78,162,246,190,
+ 44, 8, 90,190, 3, 35,171,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,162, 30,184, 58, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,232, 4, 61, 10,160, 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, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 7, 0,208,245, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,
- 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 16, 6, 61, 10,
-200, 0, 0, 0, 1, 0, 0, 0,200, 43, 88, 10, 24,251, 60, 10,216,215, 60, 10,152,214, 60, 10,152,215, 60, 10, 24,216, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,173, 1, 0, 0, 69, 4, 0, 0, 16, 16, 24, 6,153, 2, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,168, 42, 88, 10,168, 42, 88, 10,160, 6, 61, 10,200, 7, 61, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,160, 6, 61, 10,201, 0, 0, 0, 1, 0, 0, 0,200, 7, 61, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 41, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,195, 68, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68,
- 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 24, 6, 26, 0, 24, 6,
- 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,173, 1, 0, 0,198, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,
+237,203,148,190, 3,236,234,190, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 72, 1, 0, 0, 88,225,252, 2, 0, 0, 0, 0,154, 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, 1, 0, 0, 0, 51, 51, 51, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 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,
+ 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63,
+ 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 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,
+ 68, 65, 84, 65,160, 0, 0, 0,232,226,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 40,232,252, 2, 0, 0, 0, 0,
+136,213,252, 2, 0, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0,
+216,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,173, 1, 0, 0, 69, 4, 0, 0,
+ 16, 16, 24, 6,153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,230,252, 2, 0, 0, 0, 0,
+184,230,252, 2, 0, 0, 0, 0,216,227,252, 2, 0, 0, 0, 0, 72,229,252, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+216,227,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 72,229,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128, 41, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,195, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 24, 6, 26, 0, 24, 6, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,173, 1, 0, 0,198, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,200, 7, 61, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,160, 6, 61, 10, 0, 0, 32,193, 0, 0, 0, 68, 0, 0, 32,193, 0, 0, 0, 68,
-128,195,217,195,192,225,108, 68,240,130,178,193, 24,148, 5, 68, 7, 6, 0, 0, 24, 6, 0, 0, 18, 0, 0, 0,126, 2, 0, 0,
- 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 18, 0, 0, 0,126, 2, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70,236, 81,184, 61, 10,215, 19, 64, 10, 0, 0, 0, 0, 0, 3, 0,
- 0, 0, 0, 4, 0, 0, 24, 6,127, 2, 7, 6,109, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 23, 6, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6,127, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+ 72,229,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,227,252, 2, 0, 0, 0, 0,
+ 0, 0, 32,193, 0, 0, 0, 68, 0, 0, 32,193, 0, 0, 0, 68,128,195,217,195,192,225,108, 68,240,130,178,193, 24,148, 5, 68,
+ 7, 6, 0, 0, 24, 6, 0, 0, 18, 0, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0, 6, 6, 0, 0, 18, 0, 0, 0,126, 2, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70,
+236, 81,184, 61, 10,215, 19, 64, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 24, 6,127, 2, 7, 6,109, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,199, 1, 0, 0, 69, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6,127, 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,
- 68, 65, 84, 65,244, 0, 0, 0,168, 42, 88, 10,177, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 68, 65, 84, 65, 32, 1, 0, 0,
+184,230,252, 2, 0, 0, 0, 0,171, 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, 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,
- 10,215, 19, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,123,246, 98, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 68, 65, 84, 65, 96, 0, 0, 0,200, 43, 88, 10,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 16, 6, 61, 10,152,213, 60, 10,216,215, 60, 10, 88,216, 60, 10,152,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,255, 2, 0, 0,
- 0, 0, 0, 0,171, 1, 0, 0, 6, 6, 0, 3,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 47, 88, 10,
-208, 47, 88, 10, 88, 44, 88, 10,168, 46, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0, 88, 44, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,128, 45, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 64, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 2, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 63, 68, 0, 0,200, 65, 0,192, 63, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 0, 3, 26, 0, 0, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 3, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,128, 45, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,168, 46, 88, 10,
- 88, 44, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 19, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,123,246, 98, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65,160, 0, 0, 0, 40,232,252, 2, 0, 0, 0, 0,
+194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,226,252, 2, 0, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0,
+104,168,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0,171, 1, 0, 0, 6, 6, 0, 3,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,104,237,252, 2, 0, 0, 0, 0,104,237,252, 2, 0, 0, 0, 0, 24,233,252, 2, 0, 0, 0, 0,
+248,235,252, 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, 68, 65, 84, 65, 40, 1, 0, 0, 24,233,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+136,234,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 64, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0,192, 63, 68, 0, 0,200, 65, 0,192, 63, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0, 0, 3, 26, 0, 0, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0,136,234,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+248,235,252, 2, 0, 0, 0, 0, 24,233,252, 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, 26, 0, 0, 0,171, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 3, 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, 68, 65, 84, 65,248, 0, 0, 0,168, 46, 88, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 45, 88, 10, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 4, 0, 3, 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, 68, 65, 84, 65, 40, 1, 0, 0,248,235,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,136,234,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,
0, 0,128,191, 0, 0, 0, 64, 0, 0,146,190, 0,128,164, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,146, 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,
-255, 2, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,146, 1,
+ 0, 0, 0, 0,255, 2, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3,146, 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,
- 68, 65, 84, 65, 24, 33, 0, 0,208, 47, 88, 10,170, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 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, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65, 0, 0, 0, 0,154,153,153, 62, 0, 0, 0, 0,
-100, 0, 0, 0,154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 33, 0, 0,104,237,252, 2, 0, 0, 0, 0,164, 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,
+ 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,100, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 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,240, 65, 0, 0, 0, 0,154,153,153, 62, 0, 0, 0, 0,100, 0, 0, 0,
+154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -1077,8 +1270,8 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,100, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -1207,1764 +1400,2360 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,140, 0, 0, 0, 24, 81, 88, 10,196, 0, 0, 0, 1, 0, 0, 0,
-168, 85, 89, 10,224,212, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 68,101,102, 97,117,108,116, 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,208, 81, 88, 10,144, 84, 88, 10,208, 84, 88, 10,
-152, 89, 88, 10,224, 89, 88, 10, 24, 35, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 1, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 74, 84, 8, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,208, 81, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,
- 16, 82, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 16, 82, 88, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 80, 82, 88, 10,208, 81, 88, 10, 0, 0, 0, 0, 0, 0,226, 3, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 80, 82, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,144, 82, 88, 10, 16, 82, 88, 10, 0, 0, 0, 0,246, 4,226, 3,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,144, 82, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,208, 82, 88, 10, 80, 82, 88, 10,
- 0, 0, 0, 0,246, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,208, 82, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,
- 16, 83, 88, 10,144, 82, 88, 10, 0, 0, 0, 0, 0, 0,199, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 16, 83, 88, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 80, 83, 88, 10,208, 82, 88, 10, 0, 0, 0, 0,246, 4,199, 3, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 80, 83, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,144, 83, 88, 10, 16, 83, 88, 10, 0, 0, 0, 0, 20, 4, 0, 0,
- 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,144, 83, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,208, 83, 88, 10, 80, 83, 88, 10,
- 0, 0, 0, 0, 20, 4,199, 3, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,208, 83, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,
- 16, 84, 88, 10,144, 83, 88, 10, 0, 0, 0, 0, 20, 4, 24, 3, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 16, 84, 88, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 80, 84, 88, 10,208, 83, 88, 10, 0, 0, 0, 0,246, 4, 24, 3, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 80, 84, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,144, 84, 88, 10, 16, 84, 88, 10, 0, 0, 0, 0, 0, 0, 92, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,144, 84, 88, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80, 84, 88, 10,
- 0, 0, 0, 0, 20, 4, 92, 0, 1, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208, 84, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 24, 85, 88, 10, 0, 0, 0, 0, 16, 82, 88, 10, 80, 82, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 24, 85, 88, 10,198, 0, 0, 0, 1, 0, 0, 0, 96, 85, 88, 10,208, 84, 88, 10, 16, 82, 88, 10,208, 82, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 96, 85, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,168, 85, 88, 10, 24, 85, 88, 10,
- 80, 82, 88, 10, 16, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,168, 85, 88, 10,198, 0, 0, 0,
- 1, 0, 0, 0,240, 85, 88, 10, 96, 85, 88, 10,208, 82, 88, 10, 16, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,240, 85, 88, 10,198, 0, 0, 0, 1, 0, 0, 0, 56, 86, 88, 10,168, 85, 88, 10,208, 81, 88, 10, 80, 83, 88, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56, 86, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,128, 86, 88, 10,
-240, 85, 88, 10,144, 82, 88, 10, 80, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,128, 86, 88, 10,
-198, 0, 0, 0, 1, 0, 0, 0,200, 86, 88, 10, 56, 86, 88, 10,208, 82, 88, 10,144, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,200, 86, 88, 10,198, 0, 0, 0, 1, 0, 0, 0, 16, 87, 88, 10,128, 86, 88, 10, 16, 83, 88, 10,
-144, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16, 87, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 88, 87, 88, 10,200, 86, 88, 10, 80, 83, 88, 10,208, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 88, 87, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,160, 87, 88, 10, 16, 87, 88, 10,144, 83, 88, 10,208, 83, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160, 87, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,232, 87, 88, 10, 88, 87, 88, 10,
- 16, 83, 88, 10, 16, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,232, 87, 88, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 48, 88, 88, 10,160, 87, 88, 10,144, 82, 88, 10, 16, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 48, 88, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,120, 88, 88, 10,232, 87, 88, 10,208, 83, 88, 10, 16, 84, 88, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120, 88, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,192, 88, 88, 10,
- 48, 88, 88, 10,208, 81, 88, 10, 80, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,192, 88, 88, 10,
-198, 0, 0, 0, 1, 0, 0, 0, 8, 89, 88, 10,120, 88, 88, 10,208, 82, 88, 10, 80, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0, 8, 89, 88, 10,198, 0, 0, 0, 1, 0, 0, 0, 80, 89, 88, 10,192, 88, 88, 10,144, 83, 88, 10,
-144, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 80, 89, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,
-152, 89, 88, 10, 8, 89, 88, 10, 80, 83, 88, 10,144, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
-152, 89, 88, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80, 89, 88, 10, 80, 84, 88, 10,144, 84, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,224, 89, 88, 10,200, 0, 0, 0, 1, 0, 0, 0,192, 92, 88, 10, 0, 0, 0, 0,
-208, 82, 88, 10, 16, 82, 88, 10, 80, 82, 88, 10, 16, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,246, 4, 0, 0,200, 3, 0, 0,
-226, 3, 0, 0, 7, 7,247, 4, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 8, 0,160,135, 60, 9, 72, 85, 89, 10, 72, 85, 89, 10,
-112, 90, 88, 10,152, 91, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 32, 57, 88, 9,208, 57, 88, 9, 68, 65, 84, 65,248, 0, 0, 0,
-112, 90, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,152, 91, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0,224,158, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,246, 4, 0, 0, 0, 0, 0, 0,
- 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,247, 4, 26, 0,247, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,246, 4, 0, 0,200, 3, 0, 0,225, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-247, 4, 26, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-224,136, 60, 9, 16,134, 80, 10, 16,134, 80, 10, 0, 0, 0, 0, 0, 0, 0, 0,112, 58, 88, 9,216, 59, 88, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,152, 91, 88, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,112, 90, 88, 10,
- 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,
-112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0,111, 7, 0, 0, 18, 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, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 3, 0, 0,226, 3, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,136, 60, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,192, 92, 88, 10,200, 0, 0, 0,
- 1, 0, 0, 0, 32,149, 88, 10,224, 89, 88, 10, 80, 83, 88, 10,208, 83, 88, 10, 16, 84, 88, 10,144, 82, 88, 10, 0, 0, 0, 0,
- 21, 4, 0, 0,246, 4, 0, 0, 0, 0, 0, 0, 23, 3, 0, 0, 4, 4,226, 0, 24, 3, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0,
-184,132, 60, 9, 16,143, 88, 10,184,148, 88, 10, 80, 93, 88, 10,120, 94, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,200, 97, 81, 10,
- 8,197, 65, 10, 68, 65, 84, 65,248, 0, 0, 0, 80, 93, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,120, 94, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 98, 67, 0, 0, 0, 0, 0, 0,248, 65,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,225, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,226, 0, 31, 0,226, 0, 31, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,246, 4, 0, 0,249, 2, 0, 0, 23, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 0, 31, 0, 3, 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, 24,135, 60, 9, 8, 84, 78, 9, 8, 84, 78, 9, 0, 0, 0, 0, 0, 0, 0, 0,
-200,244, 80, 10, 48,246, 80, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120, 94, 88, 10,201, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 80, 93, 88, 10, 0, 0, 0, 0, 0, 0, 98, 67, 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 81, 67, 0, 64, 62,196, 0, 0, 0, 0,209, 0, 0, 0,226, 0, 0, 0, 0, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0,
- 74, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,208, 0, 0, 0, 0, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4,
- 6, 0,226, 0,249, 2,209, 0,249, 2, 0, 0,216, 14, 82, 9, 11, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,246, 4, 0, 0,
- 0, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 0,249, 2, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,133, 60, 9,224,115, 84, 10,
- 32, 15, 76, 10,160, 95, 88, 10, 8,150, 84, 10,240,246, 80, 10, 88,248, 80, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,160, 95, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 16, 97, 88, 10, 0, 0, 0, 0,248,133, 60, 9, 0, 0, 0, 0,
- 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,190, 0, 0, 0, 1, 0, 0, 0,
+216,160,254, 2, 0, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83, 82, 68,101,102, 97,117,108,116, 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,136, 16,253, 2, 0, 0, 0, 0, 88, 21,253, 2, 0, 0, 0, 0,200, 21,253, 2, 0, 0, 0, 0,
+ 56, 29,253, 2, 0, 0, 0, 0,168, 29,253, 2, 0, 0, 0, 0, 40, 66,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 2, 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, 1, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 48,150, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136, 16,253, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,248, 16,253, 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, 68, 65, 84, 65, 32, 0, 0, 0,248, 16,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+104, 17,253, 2, 0, 0, 0, 0,136, 16,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,104, 17,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,216, 17,253, 2, 0, 0, 0, 0,
+248, 16,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 4, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+216, 17,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,104, 17,253, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0,216, 17,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,232, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 40, 19,253, 2, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7,232, 3, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0,
+184, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+152, 19,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 8, 20,253, 2, 0, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 44, 6,232, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8, 20,253, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,120, 20,253, 2, 0, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 44, 6, 52, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120, 20,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+232, 20,253, 2, 0, 0, 0, 0, 8, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 52, 3, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,232, 20,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 88, 21,253, 2, 0, 0, 0, 0,
+120, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 88, 21,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 20,253, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 96, 0, 1, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200, 21,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0, 56, 22,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 16,253, 2, 0, 0, 0, 0,
+104, 17,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56, 22,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,168, 22,253, 2, 0, 0, 0, 0,200, 21,253, 2, 0, 0, 0, 0,248, 16,253, 2, 0, 0, 0, 0,
+ 72, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168, 22,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0, 24, 23,253, 2, 0, 0, 0, 0, 56, 22,253, 2, 0, 0, 0, 0,104, 17,253, 2, 0, 0, 0, 0,
+184, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24, 23,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,136, 23,253, 2, 0, 0, 0, 0,168, 22,253, 2, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,
+184, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136, 23,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,248, 23,253, 2, 0, 0, 0, 0, 24, 23,253, 2, 0, 0, 0, 0,136, 16,253, 2, 0, 0, 0, 0,
+ 40, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248, 23,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,104, 24,253, 2, 0, 0, 0, 0,136, 23,253, 2, 0, 0, 0, 0,216, 17,253, 2, 0, 0, 0, 0,
+ 40, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104, 24,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,216, 24,253, 2, 0, 0, 0, 0,248, 23,253, 2, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,
+152, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216, 24,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0, 72, 25,253, 2, 0, 0, 0, 0,104, 24,253, 2, 0, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0,
+152, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72, 25,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,184, 25,253, 2, 0, 0, 0, 0,216, 24,253, 2, 0, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0,
+ 8, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184, 25,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0, 40, 26,253, 2, 0, 0, 0, 0, 72, 25,253, 2, 0, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0,
+ 8, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40, 26,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,152, 26,253, 2, 0, 0, 0, 0,184, 25,253, 2, 0, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0,
+120, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152, 26,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0, 8, 27,253, 2, 0, 0, 0, 0, 40, 26,253, 2, 0, 0, 0, 0,216, 17,253, 2, 0, 0, 0, 0,
+120, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8, 27,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,120, 27,253, 2, 0, 0, 0, 0,152, 26,253, 2, 0, 0, 0, 0, 8, 20,253, 2, 0, 0, 0, 0,
+120, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120, 27,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,232, 27,253, 2, 0, 0, 0, 0, 8, 27,253, 2, 0, 0, 0, 0,136, 16,253, 2, 0, 0, 0, 0,
+232, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232, 27,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0, 88, 28,253, 2, 0, 0, 0, 0,120, 27,253, 2, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,
+232, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88, 28,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,200, 28,253, 2, 0, 0, 0, 0,232, 27,253, 2, 0, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0,
+ 88, 21,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200, 28,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0, 56, 29,253, 2, 0, 0, 0, 0, 88, 28,253, 2, 0, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0,
+ 88, 21,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56, 29,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 28,253, 2, 0, 0, 0, 0,232, 20,253, 2, 0, 0, 0, 0,
+ 88, 21,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,168, 29,253, 2, 0, 0, 0, 0,
+194, 0, 0, 0, 1, 0, 0, 0,120, 33,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,
+248, 16,253, 2, 0, 0, 0, 0,104, 17,253, 2, 0, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,126, 7, 0, 0,233, 3, 0, 0, 4, 4, 0, 0, 7, 7,127, 7, 28, 0, 1, 0, 0, 0, 0, 0, 7, 0, 8, 0,
+120, 29,225, 2, 0, 0, 0, 0, 72,160,254, 2, 0, 0, 0, 0, 72,160,254, 2, 0, 0, 0, 0,152, 30,253, 2, 0, 0, 0, 0,
+ 8, 32,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 96, 15, 3, 0, 0, 0, 0,
+120, 98,223, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152, 30,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 8, 32,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0,224,239, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0,127, 7, 26, 0,127, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,126, 7, 0, 0,233, 3, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+127, 7, 26, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+136, 31,225, 2, 0, 0, 0, 0, 8, 59,223, 4, 0, 0, 0, 0, 8, 59,223, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232, 38,157, 4, 0, 0, 0, 0,152,247, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8, 32,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,152, 30,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1,192,237, 68, 0, 0, 0, 0, 0, 0, 0, 64,110, 7, 0, 0,127, 7, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,109, 7, 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,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3,
+ 2, 0, 0, 4, 10, 0,127, 7, 2, 0,110, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,126, 7, 0, 0, 3, 4, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+127, 7, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+152, 30,225, 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,152,146,157, 4, 0, 0, 0, 0, 56,251, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,120, 33,253, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
+184,132,253, 2, 0, 0, 0, 0,168, 29,253, 2, 0, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0, 8, 20,253, 2, 0, 0, 0, 0,
+120, 20,253, 2, 0, 0, 0, 0,216, 17,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0,
+ 0, 0, 0, 0, 51, 3, 0, 0, 4, 4, 82, 1, 52, 3, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, 24, 25,225, 2, 0, 0, 0, 0,
+ 8,125,253, 2, 0, 0, 0, 0, 8,132,253, 2, 0, 0, 0, 0,104, 34,253, 2, 0, 0, 0, 0,216, 35,253, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 83,223, 2, 0, 0, 0, 0,184, 64,159, 4, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,104, 34,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,216, 35,253, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,169, 67,
+ 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65,
+ 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 82, 1,
+ 31, 0, 82, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0,
+ 21, 3, 0, 0, 51, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 1, 31, 0, 4, 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,136, 28,225, 2, 0, 0, 0, 0,
+136,135,101, 4, 0, 0, 0, 0,136,135,101, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+248,143,159, 4, 0, 0, 0, 0,152, 0, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,216, 35,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+104, 34,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,169, 67, 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,160, 67,
+ 0, 64, 69,196, 0, 0, 0, 0, 65, 1, 0, 0, 82, 1, 0, 0, 0, 0, 0, 0, 20, 3, 0, 0, 0, 0, 0, 0, 74, 1, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 20, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 82, 1,
+ 21, 3, 65, 1, 21, 3, 0, 0, 56, 77, 99, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0,
+ 0, 0, 0, 0, 20, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 1, 21, 3, 5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 26,225, 2, 0, 0, 0, 0,
+ 24, 49,115, 4, 0, 0, 0, 0,232,145, 99, 4, 0, 0, 0, 0, 72, 37,253, 2, 0, 0, 0, 0,104,123,253, 2, 0, 0, 0, 0,
+152,150,154, 4, 0, 0, 0, 0,200, 5, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 72, 37,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232, 38,253, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 40, 27,225, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95,
+ 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95,
+ 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255, 65, 1, 36, 0,
+ 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 38,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136, 40,253, 2, 0, 0, 0, 0, 72, 37,253, 2, 0, 0, 0, 0, 24, 48,145, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,220,255,209, 0, 36, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 65, 1, 61, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 43, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 16, 97, 88, 10,199, 0, 0, 0,
- 1, 0, 0, 0,128, 98, 88, 10,160, 95, 88, 10,152,106,165, 9, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,
-110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,
-110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255,209, 0, 61, 0, 0, 0, 0, 0,
- 0, 0, 2, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136, 40,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40, 42,253, 2, 0, 0, 0, 0,
+232, 38,253, 2, 0, 0, 0, 0,120, 51,145, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,128, 98, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,240, 99, 88, 10, 16, 97, 88, 10,
-136,110,165, 9, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, 65, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40, 42,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200, 43,253, 2, 0, 0, 0, 0,136, 40,253, 2, 0, 0, 0, 0, 8, 70,110, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255,209, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 32, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-240, 99, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 96,101, 88, 10,128, 98, 88, 10,168,147,165, 9, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,
-110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254,
-209, 0,203, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, 65, 1,203, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 45, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 96,101, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,
-208,102, 88, 10,240, 99, 88, 10, 32,137,165, 9, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,
-105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,
-105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254,209, 0, 58, 0, 20, 0, 0, 0, 0, 0, 2, 0,
- 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,200, 43,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104, 45,253, 2, 0, 0, 0, 0,
+ 40, 42,253, 2, 0, 0, 0, 0, 56, 68,145, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105,
+ 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, 65, 1, 58, 0,
+ 20, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0,208,102, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 64,104, 88, 10, 96,101, 88, 10,112,141,165, 9,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104, 45,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 8, 47,253, 2, 0, 0, 0, 0,200, 43,253, 2, 0, 0, 0, 0, 24, 71,145, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 97,109,112,108,101,100, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0,108,117,114, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 70,117,108,108, 32, 83, 97,109,112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, 65, 1, 0, 0, 20, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 47, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 34,254,209, 0, 0, 0, 20, 0, 0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 64,104, 88, 10,
-199, 0, 0, 0, 1, 0, 0, 0,176,105, 88, 10,208,102, 88, 10,160,114,165, 9, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 68, 65, 84, 65, 88, 1, 0, 0, 8, 47,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168, 48,253, 2, 0, 0, 0, 0,
+104, 45,253, 2, 0, 0, 0, 0,216, 53,145, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,209, 0,102, 0,
- 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253, 65, 1,102, 0,
+ 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,176,105, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 32,107, 88, 10,
- 64,104, 88, 10,160,126,165, 9, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168, 48,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 72, 50,253, 2, 0, 0, 0, 0, 8, 47,253, 2, 0, 0, 0, 0,120, 62,145, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,253,209, 0,130, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
- 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,253, 65, 1,130, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 49, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0, 32,107, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,144,108, 88, 10,176,105, 88, 10,144,118,165, 9, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 72, 50,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232, 51,253, 2, 0, 0, 0, 0,
+168, 48,253, 2, 0, 0, 0, 0,184, 56,145, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,
+110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,252, 65, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 51,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136, 53,253, 2, 0, 0, 0, 0, 72, 50,253, 2, 0, 0, 0, 0,152, 59,145, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
+103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
+103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,242,252,209, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252, 65, 1, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 51, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,144,108, 88, 10,199, 0, 0, 0,
- 1, 0, 0, 0, 0,110, 88, 10, 32,107, 88, 10,176,122,165, 9, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,
-115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,
-115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,
-105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252,209, 0, 0, 0, 0, 0, 0, 0,
- 4, 0, 2, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136, 53,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40, 55,253, 2, 0, 0, 0, 0,
+232, 51,253, 2, 0, 0, 0, 0, 8, 82,145, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 0,110, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,112,111, 88, 10,144,108, 88, 10,
-192,151,165, 9, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252, 65, 1, 0, 0,
+ 20, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40, 55,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200, 56,253, 2, 0, 0, 0, 0,136, 53,253, 2, 0, 0, 0, 0,232, 84,145, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252,209, 0, 0, 0, 20, 0, 0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 40, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-112,111, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,224,112, 88, 10, 0,110, 88, 10, 40,158,165, 9, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252, 65, 1, 0, 0, 0, 0, 0, 0, 4, 0, 7, 0, 0, 0, 0, 0, 53, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252,
-209, 0, 0, 0, 0, 0, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,224,112, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,
- 80,114, 88, 10,112,111, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,111,110,116,101,
-120,116, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,111,110,116,101,
-120,116, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,200, 56,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104, 58,253, 2, 0, 0, 0, 0,
+ 40, 55,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95, 99,111,110,116,101,120,116, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95, 99,111,110,116,101,120,116, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41,255, 7, 1,179, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41,255, 65, 1,179, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 5, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104, 58,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 8, 60,253, 2, 0, 0, 0, 0,200, 56,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0, 80,114, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,192,115, 88, 10,224,112, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 77, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102,254, 65, 1,171, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,102,254, 7, 1,171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,192,115, 88, 10,
-199, 0, 0, 0, 1, 0, 0, 0, 48,117, 88, 10, 80,114, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 68, 65, 84, 65, 88, 1, 0, 0, 8, 60,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168, 61,253, 2, 0, 0, 0, 0,
+104, 58,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
80, 84, 95,105,110,102,108,117,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
80, 84, 95,105,110,102,108,117,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,110,102,108,117,101,110, 99,
101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,253, 7, 1, 36, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,213,253, 65, 1, 36, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 48,117, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,160,118, 88, 10,
-192,115, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,
-111,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,
-111,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,111,109, 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168, 61,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 72, 63,253, 2, 0, 0, 0, 0, 8, 60,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18,253, 7, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,160,118, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 16,120, 88, 10, 48,117, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,111,109, 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,103,252, 65, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 80,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 87,254, 7, 1,186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 72, 63,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232, 64,253, 2, 0, 0, 0, 0,
+168, 61,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,114,101,118,105,101,119, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 16,120, 88, 10,199, 0, 0, 0,
- 1, 0, 0, 0,128,121, 88, 10,160,118, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,
-109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,
-109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,254, 65, 1,186, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,253, 7, 1, 36, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 64,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136, 66,253, 2, 0, 0, 0, 0, 72, 63,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,128,121, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,240,122, 88, 10, 16,120, 88, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,115, 97,109,112,108,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,115, 97,109,112,108,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,101, 32, 83, 97,109,112,108,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,252, 7, 1,212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,254, 65, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 64, 1, 0, 0,
-240,122, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 96,124, 88, 10,128,121, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84,
- 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84,
- 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,
-101, 32, 77, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251,
- 7, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 96,124, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,
-208,125, 88, 10,240,122, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,111,108,111,114,
-115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,111,108,111,114,
-115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136, 66,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40, 68,253, 2, 0, 0, 0, 0,
+232, 64,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,105,109, 97,103,101, 95,115, 97,109,112,108,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,105,109, 97,103,101, 95,115, 97,109,112,108,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,101, 32, 83, 97,
+109,112,108,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23,253, 65, 1,212, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40, 68,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200, 69,253, 2, 0, 0, 0, 0,136, 66,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,109, 97,112,112,105,110,103,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,109, 97,112,112,105,110,103,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,101, 32, 77, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,211,253, 65, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,200, 69,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104, 71,253, 2, 0, 0, 0, 0,
+ 40, 68,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95, 99,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95, 99,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108,111,114,115, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,254, 65, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,254, 7, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104, 71,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 8, 73,253, 2, 0, 0, 0, 0,200, 69,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0,208,125, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 64,127, 88, 10, 96,124, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 67,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161,253, 7, 1,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,161,253, 7, 1,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 64,127, 88, 10,
-199, 0, 0, 0, 1, 0, 0, 0,176,128, 88, 10,208,125, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 68, 65, 84, 65, 88, 1, 0, 0, 8, 73,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168, 74,253, 2, 0, 0, 0, 0,
+104, 71,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
80, 84, 95,119,111,111,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
80, 84, 95,119,111,111,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,111,111,100, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139,253, 7, 1,180, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,176,128, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 32,130, 88, 10,
- 64,127, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,108,117,103,105,110, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168, 74,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 72, 76,253, 2, 0, 0, 0, 0, 8, 73,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,108,117,103,105,110, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,108,117,103,105,110, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,108,117,103,105,110, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,108,117,103,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80,108,117,103,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,254, 7, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,254, 7, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0, 32,130, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,144,131, 88, 10,176,128, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,118,111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,118,111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 72, 76,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232, 77,253, 2, 0, 0, 0, 0,
+168, 74,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,118,111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,118,111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,111,114,111,110,111,105, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86,111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,123,253, 7, 1,196, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,123,253, 7, 1,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 77,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136, 79,253, 2, 0, 0, 0, 0, 72, 76,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,144,131, 88, 10,199, 0, 0, 0,
- 1, 0, 0, 0, 0,133, 88, 10, 32,130, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,
-111,105,110,116,100,101,110,115,105,116,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,
-111,105,110,116,100,101,110,115,105,116,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,105,110,116, 32, 68,101,110,115,105,116,
-121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,253, 7, 1,179, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80,111,105,110,116, 32, 68,101,110,115,105,116,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 0,133, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,112,134, 88, 10,144,131, 88, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 95,
-116,117,114, 98,117,108,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 95,
-116,117,114, 98,117,108,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84,117,114, 98,117,108,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,253, 7, 1,179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14,253, 7, 1,102, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-112,134, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,224,135, 88, 10, 0,133, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84,
- 85, 82, 69, 95, 80, 84, 95,109,117,115,103,114, 97,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84,
- 85, 82, 69, 95, 80, 84, 95,109,117,115,103,114, 97,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,117,115,103,
-114, 97,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139,253,
- 7, 1,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136, 79,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40, 81,253, 2, 0, 0, 0, 0,
+232, 77,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 95,116,117,114, 98,117,108,101,110, 99,101, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 95,116,117,114, 98,117,108,101,110, 99,101, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,117,114, 98,117,108,101,110,
+ 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14,253, 7, 1,102, 0,
+ 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40, 81,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200, 82,253, 2, 0, 0, 0, 0,136, 79,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109,117,115,103,114, 97,118,101, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109,117,115,103,114, 97,118,101, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77,117,115,103,114, 97,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139,253, 7, 1,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,224,135, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,
- 80,137, 88, 10,112,134, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,114, 98,108,
-101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,114, 98,108,
-101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,114, 98,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,253, 7, 1,183, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,
+ 68, 65, 84, 65, 88, 1, 0, 0,200, 82,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104, 84,253, 2, 0, 0, 0, 0,
+ 40, 81,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,109, 97,114, 98,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,109, 97,114, 98,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,114, 98,108,101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,253, 7, 1,183, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104, 84,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 8, 86,253, 2, 0, 0, 0, 0,200, 82,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0, 80,137, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,192,138, 88, 10,224,135, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 77, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,254, 7, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 27,254, 7, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,192,138, 88, 10,
-199, 0, 0, 0, 1, 0, 0, 0, 48,140, 88, 10, 80,137, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 68, 65, 84, 65, 88, 1, 0, 0, 8, 86,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168, 87,253, 2, 0, 0, 0, 0,
+104, 84,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
80, 84, 95,100,105,115,116,111,114,116,101,100,110,111,105,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
80, 84, 95,100,105,115,116,111,114,116,101,100,110,111,105,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,115,116,111,114,116,101,
100, 32, 78,111,105,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,211,253, 7, 1,108, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 48,140, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,160,141, 88, 10,
-192,138, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 98,108,101,110,100, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168, 87,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 72, 89,253, 2, 0, 0, 0, 0, 8, 86,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 98,108,101,110,100, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 98,108,101,110,100, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 98,108,101,110,100, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,108,101,110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66,108,101,110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,254, 7, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,254, 7, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,160,141, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,216,242, 87, 9, 48,140, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,115,116,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,115,116,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83,116,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 72, 89,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232, 90,253, 2, 0, 0, 0, 0,
+168, 87,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,115,116,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,115,116,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116,117, 99, 99,105, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,183,253, 7, 1,136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,183,253, 7, 1,136, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,216,242, 87, 9,199, 0, 0, 0,
- 1, 0, 0, 0,128, 20, 85, 10,160,141, 88, 10,112,180,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,109,111,100,105,
-102,105,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,109,111,100,105,
-102,105,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,111,100,105,102,105,101,114,115, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 90,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136, 92,253, 2, 0, 0, 0, 0, 72, 89,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,109,111,100,105,102,105,101,114,115, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,255,209, 0, 36, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,109,111,100,105,102,105,101,114,115, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77,111,100,105,102,105,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,128, 20, 85, 10,199, 0, 0, 0, 1, 0, 0, 0, 32,118, 88, 9,216,242, 87, 9,
- 80,127,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109,101,115,104, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,255,209, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109,101,115,104, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136, 92,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40, 94,253, 2, 0, 0, 0, 0,
+232, 90,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+ 99,111,110,116,101,120,116, 95,109,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+ 99,111,110,116,101,120,116, 95,109,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,255,209, 0, 36, 0, 0, 0, 0, 0, 0, 0, 4, 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,184,255,209, 0, 36, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
- 32,118, 88, 9,199, 0, 0, 0, 1, 0, 0, 0,216,168, 85, 10,128, 20, 85, 10, 64,131,163, 9, 0, 0, 0, 0, 68, 65, 84, 65,
- 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 95,109,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 95,109,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,
-111,109, 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,255,
-209, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 88, 1, 0, 0, 40, 94,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200, 95,253, 2, 0, 0, 0, 0,136, 92,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 95,109,101,115,
+104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 95,109,101,115,
+104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,111,109, 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,216,168, 85, 10,199, 0, 0, 0, 1, 0, 0, 0,
- 56,155, 87, 9, 32,118, 88, 9, 48,135,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,110,111,114,109, 97,108,115, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,255,209, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,110,111,114,109, 97,108,115, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78,111,114,109, 97,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78,255,209, 0, 58, 0, 0, 0, 0, 0, 0, 0, 4, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,200, 95,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104, 97,253, 2, 0, 0, 0, 0,
+ 40, 94,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+110,111,114,109, 97,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+110,111,114,109, 97,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78,111,114,109, 97,108,115, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78,255,209, 0, 58, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104, 97,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 8, 99,253, 2, 0, 0, 0, 0,200, 95,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0, 56,155, 87, 9,199, 0, 0, 0, 1, 0, 0, 0,232, 33, 81, 10,216,168, 85, 10, 32,139,163, 9,
- 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 83,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18,255,209, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 18,255,209, 0, 36, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,232, 33, 81, 10,
-199, 0, 0, 0, 1, 0, 0, 0,152,148, 84, 10, 56,155, 87, 9, 64,143,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+ 68, 65, 84, 65, 88, 1, 0, 0, 8, 99,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168,100,253, 2, 0, 0, 0, 0,
+104, 97,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
118,101,114,116,101,120, 95,103,114,111,117,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
118,101,114,116,101,120, 95,103,114,111,117,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,101,114,116,101,120, 32, 71,
114,111,117,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,174,254,209, 0, 76, 0,
- 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 68, 65, 84, 65, 88, 1, 0, 0,168,100,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 72,102,253, 2, 0, 0, 0, 0, 8, 99,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,104, 97,112,101, 95,107,101,121,115, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,152,148, 84, 10,199, 0, 0, 0, 1, 0, 0, 0,232, 43, 84, 10,
-232, 33, 81, 10, 48,147,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,104, 97,112,101, 95,107,101,121,115, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,104, 97,112,101, 95,107,101,121,115, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,104, 97,112,101, 95,107,101,121,115, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,112,101, 32, 75,101,121,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,112,101, 32, 75,101,121,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74,254,209, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 74,254,209, 0, 76, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0,
- 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65,
- 64, 1, 0, 0,232, 43, 84, 10,199, 0, 0, 0, 1, 0, 0, 0, 8,150, 84, 10,152,148, 84, 10, 32,151,163, 9, 0, 0, 0, 0,
- 68, 65, 84, 65, 95, 80, 84, 95,117,118, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 72,102,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232,103,253, 2, 0, 0, 0, 0,
+168,100,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+117,118, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+117,118, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 32, 84,101,120,116,117,
+114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,237,253,209, 0, 69, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,
- 68, 65, 84, 65, 95, 80, 84, 95,117,118, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232,103,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136,105,253, 2, 0, 0, 0, 0, 72,102,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,101,120, 95, 99,111,108,111,114,115, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 85, 86, 32, 84,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,101,120, 95, 99,111,108,111,114,115, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,237,253,209, 0, 69, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 86,101,114,116,101,120, 32, 67,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 8,150, 84, 10,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0,232, 43, 84, 10, 64,155,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,
-101,120, 95, 99,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,
-101,120, 95, 99,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,101,114,116,101,120, 32, 67,111,108,111,114,
-115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,253,209, 0, 69, 0, 0, 0, 0, 0,
- 0, 0, 4, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,253,209, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65,216, 0, 0, 0, 16,143, 88, 10,165, 0, 0, 0, 1, 0, 0, 0,184,148, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136,105,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40,107,253, 2, 0, 0, 0, 0,
+232,103,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109, 97,116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109, 97,116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94,255, 65, 1,126, 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, 2, 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, 68, 65, 84, 65, 88, 1, 0, 0, 40,107,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200,108,253, 2, 0, 0, 0, 0,136,105,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0,
- 96,139, 79, 9,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 24,144, 88, 10,201, 0, 0, 0,
- 1, 0, 0, 0, 64,145, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0, 32,209, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0,209, 68,
- 0, 0,200, 65, 0, 0,209, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4,
- 10, 0,137, 6, 26, 0,137, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 6, 0, 0,
-149, 3, 0, 0,174, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,137, 6, 26, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0, 64,145, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,104,146, 88, 10, 24,144, 88, 10, 0, 0, 0, 0, 0, 0,112, 67,
- 0, 64,101,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 67, 0, 64,101,196, 0, 0, 0, 0,223, 0, 0, 0,240, 0, 0, 0,
- 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 0, 0,
- 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,240, 0,149, 3,223, 0,149, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,240, 0,149, 3, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,104,146, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,144,147, 88, 10,
- 64,145, 88, 10, 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0, 0, 0,112, 66, 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0,
- 0, 0,112, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,152, 5, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0,179, 68, 0, 0,108, 66, 0, 0,179, 68,
- 0, 0,108, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,153, 5, 60, 0,153, 5,
- 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,136, 6, 0, 0, 89, 3, 0, 0,148, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 60, 0, 0, 0, 4, 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, 68, 65, 84, 65,248, 0, 0, 0,144,147, 88, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,104,146, 88, 10, 0, 0, 0, 0, 0,128,175, 68, 0, 0,137,195, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,177, 68, 0, 64, 86,196, 0, 0, 0, 0,136, 5, 0, 0,153, 5, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0,
- 0, 0, 0, 0,135, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,135, 5, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, 2, 0, 3, 3,
- 2, 0, 0, 4, 6, 0,153, 5, 89, 3,136, 5, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,
-136, 6, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 89, 3,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 60, 0, 0, 0,184,148, 88, 10,168, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 16,143, 88, 10, 24,144, 88, 10,
-144,147, 88, 10, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 5, 0,255,255,255,255, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 32,149, 88, 10,200, 0, 0, 0,
- 1, 0, 0, 0,232,152, 88, 10,192, 92, 88, 10,208, 81, 88, 10, 80, 84, 88, 10,144, 84, 88, 10, 80, 83, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 15, 15, 20, 4, 92, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 32,104, 60, 9, 0,152, 88, 10, 0,152, 88, 10,176,149, 88, 10,216,150, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,208,248, 80, 10,
-128,249, 80, 10, 68, 65, 84, 65,248, 0, 0, 0,176,149, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,216,150, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,160,137, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,130, 68, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 4, 26, 0, 20, 4, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 26, 0, 5, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,105, 60, 9, 16, 28, 82, 9, 16, 28, 82, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 32,250, 80, 10,136,251, 80, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,216,150, 88, 10,201, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0,176,149, 88, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,
-246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 19, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 18, 0, 0, 0, 65, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4,
- 8, 0, 20, 4, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0,
- 26, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 66, 0, 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,216,104, 60, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,252, 80, 10, 40,254, 80, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-188, 0, 0, 0, 0,152, 88, 10,176, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,254, 65, 1,136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 31, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,232,152, 88, 10,200, 0, 0, 0, 1, 0, 0, 0,
- 24, 35, 89, 10, 32,149, 88, 10,208, 83, 88, 10,144, 83, 88, 10, 16, 83, 88, 10, 16, 84, 88, 10, 0, 0, 0, 0, 21, 4, 0, 0,
-246, 4, 0, 0, 25, 3, 0, 0,198, 3, 0, 0, 3, 3,226, 0,174, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, 88,102, 60, 9,
-200,155, 88, 10,200,155, 88, 10,120,153, 88, 10,160,154, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,160,254, 80, 10, 80,255, 80, 10,
- 68, 65, 84, 65,248, 0, 0, 0,120,153, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,160,154, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 98, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-225, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 66, 67, 0, 0,200, 65, 0, 0, 66, 67, 0, 0,200, 65, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,226, 0, 26, 0,226, 0, 26, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,246, 4, 0, 0,173, 3, 0, 0,198, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,226, 0, 26, 0, 7, 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,152,103, 60, 9,232,161, 84, 10,232,161, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0,240,255, 80, 10,
- 88, 1, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,160,154, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,120,153, 88, 10, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 67,
- 0, 0, 2,195, 0, 0, 0, 0,209, 0, 0, 0,226, 0, 0, 0, 18, 0, 0, 0,147, 0, 0, 0, 0, 0, 0, 0,208, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,208, 0, 0, 0, 18, 0, 0, 0,147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 2, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,226, 0,
-148, 0,209, 0,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,246, 4, 0, 0, 25, 3, 0, 0,
-172, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 0,148, 0, 8, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,103, 60, 9, 96, 94, 84, 9, 96, 94, 84, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 24, 2, 81, 10, 8, 3, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,252, 0, 0, 0,
-200,155, 88, 10,169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,200,108,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104,110,253, 2, 0, 0, 0, 0,
+ 40,107,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,100,105,102,102,117,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,100,105,102,102,117,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,102,102,117,115,101, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,103,254, 65, 1, 63, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104,110,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 8,112,253, 2, 0, 0, 0, 0,200,108,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,112,101, 99,117,108, 97,114, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-128, 11, 65, 10,128, 11, 65, 10, 0,142, 88, 9, 0,115,101, 32, 83, 99,117,108,112,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0, 0,142, 88, 9,224, 0, 0, 0, 1, 0, 0, 0, 42, 11, 0, 0,
- 42, 11, 0, 0,240,156, 88, 10, 68, 65, 84, 65,248,133, 0, 0,240,156, 88, 10,223, 0, 0, 0, 42, 11, 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 0, 16,228, 90, 10, 19, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 20, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10,
- 21, 0, 1, 0, 1, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,243, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,
-152,250, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,240, 74, 92, 10, 0, 0, 0, 0, 1, 0, 1, 0, 40, 4, 91, 10, 0, 0, 0, 0,
- 1, 0, 1, 0,224,168, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0, 96,255, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,112,240, 90, 10,
- 0, 0, 0, 0, 1, 0, 1, 0,208,245, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,216,239, 90, 10, 21, 0, 0, 0, 1, 0, 1, 0,
- 16,228, 90, 10, 30, 0,255,255, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 1, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 4, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 9, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 11, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 12, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 17, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 19, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 20, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 25, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 26, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 27, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 28, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 29, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 31, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 32, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 33, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 34, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 35, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 36, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 37, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 38, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 39, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 40, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 41, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 42, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 43, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 44, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 45, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 46, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 47, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 48, 0, 1, 0, 0, 0, 16,228, 90, 10, 30, 0,255,255,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 2, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 7, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 10, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 11, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 12, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 15, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 17, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 18, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 19, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 20, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 23, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 25, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 26, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 27, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 28, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 29, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 31, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 32, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 33, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 34, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 35, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 36, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 37, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 38, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 39, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 40, 0, 1, 0, 0, 0, 16,228, 90, 10, 30, 0,255,255, 1, 0, 0, 0,232, 84, 92, 10,
- 30, 0,255,255, 1, 0, 0, 0,168, 90, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 48, 95, 92, 10, 30, 0,255,255, 1, 0, 0, 0,
-184, 99, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 64,104, 92, 10, 30, 0,255,255, 1, 0, 0, 0,200,108, 92, 10, 30, 0,255,255,
- 1, 0, 0, 0, 80,113, 92, 10, 30, 0,255,255, 1, 0, 0, 0,216,117, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 96,122, 92, 10,
- 30, 0,255,255, 1, 0, 0, 0,232,126, 92, 10, 30, 0,255,255, 1, 0, 0, 0,112,131, 92, 10, 30, 0,255,255, 1, 0, 0, 0,
-248,135, 92, 10, 30, 0,255,255, 1, 0, 0, 0,128,140, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 8,145, 92, 10, 30, 0,255,255,
- 1, 0, 0, 0,144,149, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 24,154, 92, 10, 30, 0,255,255, 1, 0, 0, 0,160,158, 92, 10,
- 30, 0,255,255, 1, 0, 0, 0, 40,163, 92, 10, 30, 0,255,255, 1, 0, 0, 0,176,167, 92, 10, 30, 0,255,255, 1, 0, 0, 0,
- 56,172, 92, 10, 30, 0,255,255, 1, 0, 0, 0,192,176, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 72,181, 92, 10, 30, 0,255,255,
- 1, 0, 0, 0,208,185, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 88,190, 92, 10, 30, 0,255,255, 1, 0, 0, 0,224,194, 92, 10,
- 30, 0,255,255, 1, 0, 0, 0,104,199, 92, 10, 30, 0,255,255, 1, 0, 0, 0,240,203, 92, 10, 30, 0,255,255, 1, 0, 0, 0,
-120,208, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 0,213, 92, 10, 30, 0,255,255, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 0, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 3, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 8, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 11, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 16, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 19, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 24, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 27, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 32, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 35, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 40, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 43, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 48, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 51, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 56, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 59, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 64, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 67, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 30, 0,255,255, 1, 0, 0, 0,216,239, 90, 10, 30, 0,255,255, 1, 0, 0, 0,112,240, 90, 10, 30, 0,255,255,
- 1, 0, 0, 0, 40, 4, 91, 10, 30, 0,255,255, 1, 0, 0, 0,240, 74, 92, 10, 30, 0,255,255, 3, 0, 0, 0,208,245, 90, 10,
- 30, 0,255,255, 1, 0, 0, 0,152,250, 90, 10, 30, 0,255,255, 1, 0, 0, 0, 96,255, 90, 10, 30, 0,255,255, 1, 0, 0, 0,
- 88,159, 78, 10, 30, 0,255,255, 1, 0, 0, 0,224,212, 60, 10, 30, 0,255,255, 1, 0, 0, 0, 24, 81, 88, 10, 30, 0,255,255,
- 1, 0, 0, 0,168, 85, 89, 10, 30, 0,255,255, 1, 0, 0, 0,248, 63, 90, 10, 30, 0,255,255, 1, 0, 0, 0, 64,130, 90, 10,
- 30, 0,255,255, 1, 0, 0, 0,232,191, 90, 10, 30, 0,255,255, 1, 0, 0, 0,224,168, 91, 10, 30, 0,255,255, 1, 0, 0, 0,
- 0,140, 81, 9, 30, 0,255,255, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-168, 90, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 12, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
-168, 90, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 17, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 20, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
-168, 90, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 25, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 28, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
-168, 90, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 33, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 36, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
-168, 90, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 41, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 44, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
-168, 90, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 49, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 52, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
-168, 90, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 57, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 60, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
-168, 90, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 65, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 68, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 3, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 6, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 11, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 14, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 19, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 22, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 27, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 30, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 35, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 38, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 43, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 46, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 51, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 54, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 59, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 62, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 67, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 0, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 5, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,184, 99, 92, 10,
- 31, 0, 8, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 13, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,184, 99, 92, 10,
- 31, 0, 16, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 21, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,184, 99, 92, 10,
- 31, 0, 24, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 29, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,184, 99, 92, 10,
- 31, 0, 32, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 37, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,184, 99, 92, 10,
- 31, 0, 40, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 45, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,184, 99, 92, 10,
- 31, 0, 48, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 53, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,184, 99, 92, 10,
- 31, 0, 56, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 61, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,184, 99, 92, 10,
- 31, 0, 64, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 69, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 2, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 7, 0,
- 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 10, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 15, 0,
- 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 18, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 23, 0,
- 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 26, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 31, 0,
- 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 34, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 39, 0,
- 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 42, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 47, 0,
- 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 50, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 55, 0,
- 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 58, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 63, 0,
- 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 66, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-200,108, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 12, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
-200,108, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 17, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 20, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
-200,108, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 25, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 28, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
-200,108, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 33, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 36, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
-200,108, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 41, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 44, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
-200,108, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 49, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 52, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
-200,108, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 57, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 60, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
-200,108, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 65, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 68, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 3, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 6, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 11, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 14, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 19, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 22, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 27, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 30, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 35, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 38, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 43, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 46, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 51, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 54, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 59, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 62, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 67, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 0, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 5, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,216,117, 92, 10,
- 31, 0, 8, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 13, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,216,117, 92, 10,
- 31, 0, 16, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 21, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,216,117, 92, 10,
- 31, 0, 24, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 29, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,216,117, 92, 10,
- 31, 0, 32, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 37, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,216,117, 92, 10,
- 31, 0, 40, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 45, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,216,117, 92, 10,
- 31, 0, 48, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 53, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,216,117, 92, 10,
- 31, 0, 56, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 61, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,216,117, 92, 10,
- 31, 0, 64, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 69, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 2, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 7, 0,
- 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 10, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 15, 0,
- 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 18, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 23, 0,
- 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 26, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 31, 0,
- 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 34, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 39, 0,
- 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 42, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 47, 0,
- 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 50, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 55, 0,
- 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 58, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 63, 0,
- 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 66, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-232,126, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 12, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
-232,126, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 17, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 20, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
-232,126, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 25, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 28, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
-232,126, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 33, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 36, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
-232,126, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 41, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 44, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
-232,126, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 49, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 52, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
-232,126, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 57, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 60, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
-232,126, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 65, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 68, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 3, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 6, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 11, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 14, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 19, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 22, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 27, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 30, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 35, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 38, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 43, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 46, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 51, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 54, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 59, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 62, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 67, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 0, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 5, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,248,135, 92, 10,
- 31, 0, 8, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 13, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,248,135, 92, 10,
- 31, 0, 16, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 21, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,248,135, 92, 10,
- 31, 0, 24, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 29, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,248,135, 92, 10,
- 31, 0, 32, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 37, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,248,135, 92, 10,
- 31, 0, 40, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 45, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,248,135, 92, 10,
- 31, 0, 48, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 53, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,248,135, 92, 10,
- 31, 0, 56, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 61, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,248,135, 92, 10,
- 31, 0, 64, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 69, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 2, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 7, 0,
- 1, 0, 0, 0,128,140, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 10, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 15, 0,
- 1, 0, 0, 0,128,140, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 18, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 23, 0,
- 1, 0, 0, 0,128,140, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 26, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 31, 0,
- 1, 0, 0, 0,128,140, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 34, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 39, 0,
- 1, 0, 0, 0,128,140, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 42, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 47, 0,
- 1, 0, 0, 0,128,140, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 50, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 55, 0,
- 1, 0, 0, 0,128,140, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 58, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 63, 0,
- 1, 0, 0, 0,128,140, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 66, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 1, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 4, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
- 8,145, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 9, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 12, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
- 8,145, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 17, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 20, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
- 8,145, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 25, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 28, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
- 8,145, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 33, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 36, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
- 8,145, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 41, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 44, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
- 8,145, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 49, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 52, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
- 8,145, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 57, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 60, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
- 8,145, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 65, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 68, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 3, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 6, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 11, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 14, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 19, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 22, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 27, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 30, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 35, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 38, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 43, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 46, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 51, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 54, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 59, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 62, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 67, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 0, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 5, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 24,154, 92, 10,
- 31, 0, 8, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 13, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 24,154, 92, 10,
- 31, 0, 16, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 21, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 24,154, 92, 10,
- 31, 0, 24, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 29, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 24,154, 92, 10,
- 31, 0, 32, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 37, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 24,154, 92, 10,
- 31, 0, 40, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 45, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 24,154, 92, 10,
- 31, 0, 48, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 53, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 24,154, 92, 10,
- 31, 0, 56, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 61, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 24,154, 92, 10,
- 31, 0, 64, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 69, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 2, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 7, 0,
- 1, 0, 0, 0,160,158, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 10, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 15, 0,
- 1, 0, 0, 0,160,158, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 18, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 23, 0,
- 1, 0, 0, 0,160,158, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 26, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 31, 0,
- 1, 0, 0, 0,160,158, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 34, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 39, 0,
- 1, 0, 0, 0,160,158, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 42, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 47, 0,
- 1, 0, 0, 0,160,158, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 50, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 55, 0,
- 1, 0, 0, 0,160,158, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 58, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 63, 0,
- 1, 0, 0, 0,160,158, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 66, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 1, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 4, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
- 40,163, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 9, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 12, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
- 40,163, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 17, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 20, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
- 40,163, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 25, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 28, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
- 40,163, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 33, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 36, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
- 40,163, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 41, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 44, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
- 40,163, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 49, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 52, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
- 40,163, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 57, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 60, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
- 40,163, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 65, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 68, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 3, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 6, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 11, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 14, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 19, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 22, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 27, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 30, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 35, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 38, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 43, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 46, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 51, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 54, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 59, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 62, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 67, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 0, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 5, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 56,172, 92, 10,
- 31, 0, 8, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 13, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 56,172, 92, 10,
- 31, 0, 16, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 21, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 56,172, 92, 10,
- 31, 0, 24, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 29, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 56,172, 92, 10,
- 31, 0, 32, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 37, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 56,172, 92, 10,
- 31, 0, 40, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 45, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 56,172, 92, 10,
- 31, 0, 48, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 53, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 56,172, 92, 10,
- 31, 0, 56, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 61, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 56,172, 92, 10,
- 31, 0, 64, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 69, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 2, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 7, 0,
- 1, 0, 0, 0,192,176, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 10, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 15, 0,
- 1, 0, 0, 0,192,176, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 18, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 23, 0,
- 1, 0, 0, 0,192,176, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 26, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 31, 0,
- 1, 0, 0, 0,192,176, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 34, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 39, 0,
- 1, 0, 0, 0,192,176, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 42, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 47, 0,
- 1, 0, 0, 0,192,176, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 50, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 55, 0,
- 1, 0, 0, 0,192,176, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 58, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 63, 0,
- 1, 0, 0, 0,192,176, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 66, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 1, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 4, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
- 72,181, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 9, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 12, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
- 72,181, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 17, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 20, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
- 72,181, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 25, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 28, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
- 72,181, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 33, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 36, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
- 72,181, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 41, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 44, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
- 72,181, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 49, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 52, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
- 72,181, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 57, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 60, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
- 72,181, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 65, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 68, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 3, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 6, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 11, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 14, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 19, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 22, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 27, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 30, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 35, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 38, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 43, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 46, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 51, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 54, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 59, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 62, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 67, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 0, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 5, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 88,190, 92, 10,
- 31, 0, 8, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 13, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 88,190, 92, 10,
- 31, 0, 16, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 21, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 88,190, 92, 10,
- 31, 0, 24, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 29, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 88,190, 92, 10,
- 31, 0, 32, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 37, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 88,190, 92, 10,
- 31, 0, 40, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 45, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 88,190, 92, 10,
- 31, 0, 48, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 53, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 88,190, 92, 10,
- 31, 0, 56, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 61, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 88,190, 92, 10,
- 31, 0, 64, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 69, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 2, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 7, 0,
- 1, 0, 0, 0,224,194, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 10, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 15, 0,
- 1, 0, 0, 0,224,194, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 18, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 23, 0,
- 1, 0, 0, 0,224,194, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 26, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 31, 0,
- 1, 0, 0, 0,224,194, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 34, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 39, 0,
- 1, 0, 0, 0,224,194, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 42, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 47, 0,
- 1, 0, 0, 0,224,194, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 50, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 55, 0,
- 1, 0, 0, 0,224,194, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 58, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 63, 0,
- 1, 0, 0, 0,224,194, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 66, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-104,199, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 12, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
-104,199, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 17, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 20, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
-104,199, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 25, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 28, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
-104,199, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 33, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 36, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
-104,199, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 41, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 44, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
-104,199, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 49, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 52, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
-104,199, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 57, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 60, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
-104,199, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 65, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 68, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 3, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 6, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 11, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 14, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 19, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 22, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 27, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 30, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 35, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 38, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 43, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 46, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 51, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 54, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 59, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 62, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 67, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 0, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 5, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,120,208, 92, 10,
- 31, 0, 8, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 13, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,120,208, 92, 10,
- 31, 0, 16, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 21, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,120,208, 92, 10,
- 31, 0, 24, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 29, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,120,208, 92, 10,
- 31, 0, 32, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 37, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,120,208, 92, 10,
- 31, 0, 40, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 45, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,120,208, 92, 10,
- 31, 0, 48, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 53, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,120,208, 92, 10,
- 31, 0, 56, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 61, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,120,208, 92, 10,
- 31, 0, 64, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 69, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 2, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 7, 0,
- 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 10, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 15, 0,
- 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 18, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 23, 0,
- 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 26, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 31, 0,
- 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 34, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 39, 0,
- 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 42, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 47, 0,
- 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 50, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 55, 0,
- 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 58, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 63, 0,
- 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 66, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-136,217, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 12, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
-136,217, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 17, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 20, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
-136,217, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 25, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 28, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
-136,217, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 33, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 36, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
-136,217, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 41, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 44, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
-136,217, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 49, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 52, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
-136,217, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 57, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 60, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
-136,217, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 65, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 68, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
-216,239, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 3, 0,
- 1, 0, 0, 0,216,239, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,216,239, 90, 10,
- 31, 0, 6, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,
-216,239, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 11, 0,
- 1, 0, 0, 0,216,239, 90, 10, 31, 0, 12, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0,216,239, 90, 10,
- 31, 0, 14, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0,
-216,239, 90, 10, 31, 0, 17, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 19, 0,
- 1, 0, 0, 0,216,239, 90, 10, 31, 0, 20, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0,216,239, 90, 10,
- 31, 0, 22, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0,
-216,239, 90, 10, 31, 0, 25, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,112,240, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0,112,240, 90, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-112,240, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,112,240, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 11, 0, 1, 0, 0, 0,112,240, 90, 10,
- 31, 0, 12, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0,
-112,240, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 17, 0,
- 1, 0, 0, 0,112,240, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 19, 0, 1, 0, 0, 0,112,240, 90, 10,
- 31, 0, 20, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0,
-112,240, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 25, 0,
- 1, 0, 0, 0,112,240, 90, 10, 31, 0, 26, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 27, 0, 1, 0, 0, 0,112,240, 90, 10,
- 31, 0, 28, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 29, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0,
-112,240, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 1, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 2, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 3, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 4, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 5, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 6, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 7, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 8, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 9, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 10, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 11, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 12, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 13, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 14, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 15, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 16, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 17, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 18, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 19, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 20, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 21, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 22, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 23, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 24, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 25, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 26, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 27, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 28, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 29, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 30, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 31, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 32, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 33, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 34, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 35, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 36, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 37, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 38, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 39, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 40, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 41, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 42, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 43, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 44, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 45, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 46, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 47, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 48, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 49, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 50, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 51, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 52, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 53, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 54, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 55, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 56, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 57, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 58, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 59, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 60, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 61, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 62, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 63, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 64, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 65, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 66, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 67, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 68, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 69, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 70, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 71, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 72, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 73, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 74, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 75, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 76, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 77, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 78, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 79, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 80, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 81, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 82, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 83, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 0, 0, 1, 0, 0, 0,240, 74, 92, 10,
- 31, 0, 1, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,
-240, 74, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 6, 0,
- 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,240, 74, 92, 10,
- 31, 0, 9, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,
-240, 74, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 14, 0,
- 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,240, 74, 92, 10,
- 31, 0, 17, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,
-240, 74, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 22, 0,
- 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,240, 74, 92, 10,
- 31, 0, 25, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,
-240, 74, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 30, 0,
- 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,240, 74, 92, 10,
- 31, 0, 33, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,
-240, 74, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 38, 0,
- 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,240, 74, 92, 10,
- 31, 0, 41, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,
-240, 74, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 46, 0,
- 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,240, 74, 92, 10,
- 31, 0, 49, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,
-240, 74, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 2, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 5, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 10, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 11, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 12, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 13, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 17, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 18, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 19, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 20, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 21, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 25, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 26, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 27, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 28, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 29, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 31, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 32, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 33, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 34, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 35, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 36, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 37, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 38, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 39, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 40, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 41, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 42, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 43, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 44, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 45, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 46, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 47, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 48, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 49, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 50, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 51, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 52, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 53, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 54, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 55, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 56, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 57, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 58, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 59, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 60, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 61, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 62, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 63, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 64, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 65, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 66, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 67, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 68, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 69, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 70, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 71, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 72, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 73, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 74, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 75, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 76, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 77, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 78, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 79, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 80, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 81, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 82, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 83, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 84, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 85, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 86, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 87, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 88, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 89, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 90, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 91, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 92, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 93, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 94, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 95, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 96, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 11, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 12, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 17, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 19, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 20, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 25, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 26, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 27, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 28, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 29, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 31, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 32, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 33, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 34, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 35, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 36, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 37, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 38, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 39, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 40, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 41, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 42, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 43, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 44, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 45, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 46, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 47, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 48, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 49, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 50, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 51, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 52, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 53, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 54, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 55, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 56, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 57, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 58, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 59, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 60, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 61, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 62, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 63, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 64, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 65, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 66, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 67, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 68, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 69, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 70, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 71, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 72, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 73, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 74, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 75, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 76, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 77, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 78, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 79, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 80, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 81, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 82, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 83, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 84, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 85, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 86, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 87, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 88, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 89, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 90, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 91, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 92, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 93, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 94, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 95, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 96, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 0, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 3, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 8, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 11, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 12, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 16, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 17, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 19, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 20, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 24, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 25, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 26, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 27, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 28, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 29, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 31, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 32, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 33, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 34, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 35, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 36, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 37, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 38, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 39, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 40, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 41, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 42, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 43, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 44, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 45, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 46, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 47, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 48, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 49, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 50, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 51, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 52, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 53, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 54, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 55, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 56, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 57, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 58, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 59, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 60, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 61, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 62, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 63, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 64, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 65, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 66, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 67, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 68, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 69, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 70, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 71, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 72, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 73, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 74, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 75, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 76, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 77, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 78, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 79, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 80, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 81, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 82, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 83, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 84, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 85, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 86, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 87, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 88, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 89, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 90, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 91, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 92, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 93, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 94, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 95, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 96, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 1, 0, 1, 0, 0, 0, 88,159, 78, 10,
- 31, 0, 2, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 3, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 4, 0, 1, 0, 0, 0,
- 88,159, 78, 10, 31, 0, 5, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 6, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 7, 0,
- 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 8, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 9, 0, 1, 0, 0, 0, 88,159, 78, 10,
- 31, 0, 0, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 1, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 2, 0, 1, 0, 0, 0,
-224,212, 60, 10, 31, 0, 3, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 4, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 5, 0,
- 1, 0, 0, 0,224,212, 60, 10, 31, 0, 6, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 7, 0, 1, 0, 0, 0,224,212, 60, 10,
- 31, 0, 8, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 9, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 0, 0, 1, 0, 0, 0,
- 24, 81, 88, 10, 31, 0, 1, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 2, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 3, 0,
- 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 4, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 5, 0, 1, 0, 0, 0, 24, 81, 88, 10,
- 31, 0, 6, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 7, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 8, 0, 1, 0, 0, 0,
- 24, 81, 88, 10, 31, 0, 9, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 0, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 2, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 3, 0, 1, 0, 0, 0,168, 85, 89, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 5, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-168, 85, 89, 10, 31, 0, 7, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 8, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 0, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0,248, 63, 90, 10,
- 31, 0, 2, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,
-248, 63, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 7, 0,
- 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0,248, 63, 90, 10,
- 31, 0, 0, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,
- 64,130, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 5, 0,
- 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0, 64,130, 90, 10,
- 31, 0, 8, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0,
-232,191, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 3, 0,
- 1, 0, 0, 0,232,191, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,232,191, 90, 10,
- 31, 0, 6, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,
-232,191, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,224,168, 91, 10, 31, 0, 2, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 3, 0, 1, 0, 0, 0,224,168, 91, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 5, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-224,168, 91, 10, 31, 0, 7, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 8, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,224,168, 91, 10, 31, 0, 10, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 11, 0, 1, 0, 0, 0,224,168, 91, 10,
- 31, 0, 12, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 13, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 14, 0, 1, 0, 0, 0,
-224,168, 91, 10, 31, 0, 15, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 16, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 17, 0,
- 1, 0, 0, 0,224,168, 91, 10, 31, 0, 18, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 0, 0, 1, 0, 0, 0, 0,140, 81, 9,
- 31, 0, 1, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 2, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 3, 0, 1, 0, 0, 0,
- 0,140, 81, 9, 31, 0, 4, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 5, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 6, 0,
- 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 7, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 8, 0, 1, 0, 0, 0, 0,140, 81, 9,
- 31, 0, 9, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 10, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 0, 0, 1, 0, 0, 0,
-224,243, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 3, 0,
- 1, 0, 0, 0,224,243, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,224,243, 90, 10,
- 31, 0, 6, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,
-224,243, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 11, 0,
- 1, 0, 0, 0,224,243, 90, 10, 31, 0, 12, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0,224,243, 90, 10,
- 31, 0, 14, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0,
-224,243, 90, 10, 31, 0, 17, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 19, 0,
- 1, 0, 0, 0,224,243, 90, 10, 31, 0, 20, 0, 1, 0, 0, 0,224,243, 90, 10, 68, 65, 84, 65, 96, 0, 0, 0, 24, 35, 89, 10,
-200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,232,152, 88, 10, 80, 84, 88, 10,208, 82, 88, 10,144, 83, 88, 10,144, 84, 88, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 93, 0, 0, 0,198, 3, 0, 0, 1, 1, 20, 4,106, 3, 1, 0, 0, 0, 0, 0,
- 0, 0, 8, 0,232,105, 60, 9,120, 66, 89, 10,224, 84, 89, 10,168, 35, 89, 10,216, 61, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
-128, 3, 81, 10, 56, 5, 81, 10, 68, 65, 84, 65,248, 0, 0, 0,168, 35, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,208, 36, 89, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,113, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,130, 68, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68,
- 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 4, 26, 0, 20, 4,
- 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 93, 0, 0, 0,118, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 26, 0, 9, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,113, 60, 9,192,146, 84, 10,192,146, 84, 10, 0, 0, 0, 0,
- 0, 0, 0, 0,216, 5, 81, 10,184, 7, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,208, 36, 89, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 24, 58, 89, 10,168, 35, 89, 10, 0, 0, 0, 0, 0, 0, 32, 67, 0, 0, 30,196, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 15, 67, 0, 0, 30,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,119, 2, 0, 0,
- 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,119, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 4, 6, 0,160, 0,120, 2,143, 0,120, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-159, 0, 0, 0, 79, 1, 0, 0,198, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,120, 2,
- 10, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0,160, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,111, 60, 9,
- 8, 52, 82, 9, 8, 52, 82, 9,248, 37, 89, 10,168, 56, 89, 10,176, 54, 85, 10, 24, 56, 85, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0,248, 37, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,104, 39, 89, 10, 0, 0, 0, 0,144,184,170, 9,
- 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,100,101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,112,101, 99,117,108, 97,114, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,100,101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83,112,101, 99,117,108, 97,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,253, 65, 1, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 42,254,143, 0,190, 1, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,104, 39, 89, 10,
-199, 0, 0, 0, 1, 0, 0, 0,216, 40, 89, 10,248, 37, 89, 10,224,234,170, 9, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
- 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
- 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,114,117,115,104, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 8,112,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168,113,253, 2, 0, 0, 0, 0,
+104,110,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,211,254,143, 0, 21, 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,148,253, 65, 1, 80, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168,113,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 72,115,253, 2, 0, 0, 0, 0, 8,112,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,116,114, 97,110,115,112, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,216, 40, 89, 10,199, 0, 0, 0, 1, 0, 0, 0, 72, 42, 89, 10,
-104, 39, 89, 10,248,238,170, 9, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,
-104, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,
-104, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,116,114, 97,110,115,112, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,252,143, 0,213, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,112, 97,114,101,110, 99,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0, 72, 42, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,184, 43, 89, 10,216, 40, 89, 10, 0,247,170, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,253, 65, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 72,115,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232,116,253, 2, 0, 0, 0, 0,
+168,113,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,109,105,114,114,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,109,105,114,114,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,105,114,114,111,114, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,253, 65, 1, 0, 0,
+ 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232,116,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136,118,253, 2, 0, 0, 0, 0, 72,115,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,115,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,115,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83,117, 98,115,117,114,102, 97, 99,101, 32, 83, 99, 97,116,116,101,114,105,110,103, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76,253, 65, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136,118,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40,120,253, 2, 0, 0, 0, 0,
+232,116,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,115,116,114, 97,110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,115,116,114, 97,110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116,114, 97,110,100, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52,253, 65, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40,120,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200,121,253, 2, 0, 0, 0, 0,136,118,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76,252, 65, 1,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,200,121,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104,123,253, 2, 0, 0, 0, 0,
+ 40,120,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,115,104, 97,100,111,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,115,104, 97,100,111,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,111,119, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52,252, 65, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104,123,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,121,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,111,109, 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,252, 65, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,248, 0, 0, 0, 8,125,253, 2, 0, 0, 0, 0,159, 0, 0, 0, 1, 0, 0, 0, 8,132,253, 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, 4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 24, 31,101, 4, 0, 0, 0, 0,
+255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72,126,253, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,184,127,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 32,209, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 6, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0, 0,209, 68, 0, 0,200, 65, 0, 0,209, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,137, 6, 26, 0,137, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 6, 0, 0,149, 3, 0, 0,174, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,137, 6, 26, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,127,253, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 40,129,253, 2, 0, 0, 0, 0, 72,126,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 67,
+ 0, 64,101,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 67, 0, 64,101,196, 0, 0, 0, 0,223, 0, 0, 0,240, 0, 0, 0,
+ 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 0, 0,
+ 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
+ 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,240, 0,149, 3,223, 0,149, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,240, 0,149, 3, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,129,253, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,152,130,253, 2, 0, 0, 0, 0,184,127,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,179, 68,
+ 0, 0, 0, 0, 0, 0,112, 66, 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0, 0, 0,112, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 5, 0, 0,
+ 0, 0, 0, 0, 59, 0, 0, 0, 0, 0,179, 68, 0, 0,108, 66, 0, 0,179, 68, 0, 0,108, 66, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,153, 5, 60, 0,153, 5, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,136, 6, 0, 0, 89, 3, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 60, 0, 0, 0, 4, 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, 68, 65, 84, 65, 40, 1, 0, 0,152,130,253, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,129,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,175, 68,
+ 0, 0,137,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177, 68, 0, 64, 86,196, 0, 0, 0, 0,136, 5, 0, 0,153, 5, 0, 0,
+ 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0,135, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,135, 5, 0, 0,
+ 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 2, 2, 0, 0, 2, 0, 3, 3, 2, 0, 0, 4, 6, 0,153, 5, 89, 3,136, 5, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,136, 6, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,104, 0, 0, 0, 8,132,253, 2, 0, 0, 0, 0,
+162, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,125,253, 2, 0, 0, 0, 0, 72,126,253, 2, 0, 0, 0, 0,
+152,130,253, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 5, 0,255,255,255,255, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,184,132,253, 2, 0, 0, 0, 0,
+194, 0, 0, 0, 1, 0, 0, 0,168,137,253, 2, 0, 0, 0, 0,120, 33,253, 2, 0, 0, 0, 0,136, 16,253, 2, 0, 0, 0, 0,
+232, 20,253, 2, 0, 0, 0, 0, 88, 21,253, 2, 0, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 15, 15, 44, 6, 96, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+168,239,224, 2, 0, 0, 0, 0,136,136,253, 2, 0, 0, 0, 0,136,136,253, 2, 0, 0, 0, 0,168,133,253, 2, 0, 0, 0, 0,
+ 24,135,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,240, 13, 3, 0, 0, 0, 0,
+104, 14,160, 4, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,133,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 24,135,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,137, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0,128,197, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0, 44, 6, 26, 0, 44, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 44, 6, 26, 0, 6, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+184,241,224, 2, 0, 0, 0, 0, 40, 61,102, 4, 0, 0, 0, 0, 40, 61,102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 72,235,215, 4, 0, 0, 0, 0, 40, 11, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,135,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,168,133,253, 2, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,
+112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 18, 0, 0, 0, 69, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2,
+ 4, 0, 0, 4, 8, 0, 44, 6, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 43, 6, 0, 0, 26, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 44, 6, 70, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+200,240,224, 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,104, 12, 14, 3, 0, 0, 0, 0,232, 17, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,136,136,253, 2, 0, 0, 0, 0,170, 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,
+ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+168,137,253, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 40, 66,254, 2, 0, 0, 0, 0,184,132,253, 2, 0, 0, 0, 0,
+ 8, 20,253, 2, 0, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0,120, 20,253, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0, 53, 3, 0, 0,231, 3, 0, 0, 3, 3, 82, 1,179, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 8, 0,168,236,224, 2, 0, 0, 0, 0,120,141,253, 2, 0, 0, 0, 0,120,141,253, 2, 0, 0, 0, 0,
+152,138,253, 2, 0, 0, 0, 0, 8,140,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8,252, 13, 3, 0, 0, 0, 0, 8, 75,223, 4, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,138,253, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 8,140,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,169, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 1, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 66, 67, 0, 0,200, 65, 0, 0, 66, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 82, 1, 26, 0, 82, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0,206, 3, 0, 0,231, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 1, 26, 0, 8, 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,184,238,224, 2, 0, 0, 0, 0, 72,244,101, 4, 0, 0, 0, 0, 72,244,101, 4, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,191,216, 4, 0, 0, 0, 0, 72, 23, 14, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8,140,253, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,138,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,131, 67,
+ 0, 0,232,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,160, 67, 0, 0, 7,195, 0, 0, 0, 0, 65, 1, 0, 0, 82, 1, 0, 0,
+ 18, 0, 0, 0,152, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0,
+ 18, 0, 0, 0,152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 82, 1,153, 0, 65, 1,135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0, 53, 3, 0, 0,205, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 1,153, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,200,237,224, 2, 0, 0, 0, 0,216,171,101, 4, 0, 0, 0, 0,216,171,101, 4, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 0,159, 4, 0, 0, 0, 0,232, 26, 14, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 1, 0, 0,120,141,253, 2, 0, 0, 0, 0,
+163, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 83,115, 4, 0, 0, 0, 0, 56, 83,115, 4, 0, 0, 0, 0,
+216,142,253, 2, 0, 0, 0, 0, 0,115,101, 32, 83, 99,117,108,112,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 3, 0,
+ 68, 65, 84, 65, 16, 0, 0, 0,216,142,253, 2, 0, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0, 42, 11, 0, 0, 42, 11, 0, 0,
+ 56,143,253, 2, 0, 0, 0, 0, 68, 65, 84, 65,160,178, 0, 0, 56,143,253, 2, 0, 0, 0, 0,216, 0, 0, 0, 42, 11, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0,
+ 20, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 21, 0, 1, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0,168,211,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0,152, 49, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,232,232,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0,200,142, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,232,226,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0, 40,207,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0, 88,206,255, 2, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 0, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 2, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 4, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 6, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 8, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 10, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 12, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 14, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 16, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 18, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 20, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 22, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 24, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 26, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 28, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 30, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 32, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 34, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 36, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 38, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 40, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 42, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 44, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 46, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 48, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 50, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 52, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 54, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 56, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 58, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 60, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 62, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 64, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 66, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 68, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 3, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 0, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 2, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 4, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 6, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 8, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 10, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 12, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 14, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 16, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 18, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 20, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 22, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 24, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 26, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 28, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 30, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 32, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 34, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 36, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 38, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 40, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 42, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 44, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 46, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 48, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 50, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 52, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 54, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 56, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 58, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 60, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 62, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 64, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 66, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 68, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 70, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 71, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 72, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 73, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 74, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 75, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 76, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 77, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 78, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 79, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 80, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 81, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 82, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 83, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 0, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 2, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 4, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 6, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 8, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 10, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 12, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 14, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 16, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 18, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 20, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 22, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 24, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 26, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 28, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 30, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 32, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 34, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 36, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 38, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 40, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 42, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 44, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 46, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 48, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 50, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 0, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 2, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 4, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 6, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 8, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 10, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 12, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 14, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 16, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 18, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 20, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 22, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 24, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 26, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 28, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 30, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 32, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 34, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 36, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 38, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 40, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 42, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 44, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 46, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 48, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 50, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 52, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 54, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 56, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 58, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 60, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 62, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 64, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 66, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 68, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 70, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 71, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 72, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 73, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 74, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 75, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 76, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 77, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 78, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 79, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 80, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 81, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 82, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 83, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 84, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 85, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 86, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 87, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 88, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 89, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 90, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 91, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 92, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 93, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 94, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 95, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 96, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 70, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 71, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 72, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 73, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 74, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 75, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 76, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 77, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 78, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 79, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 80, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 81, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 82, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 83, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 84, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 85, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 86, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 87, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 88, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 89, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 90, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 91, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 92, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 93, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 94, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 95, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 96, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 0, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 2, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 4, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 6, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 8, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 10, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 12, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 14, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 16, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 18, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 20, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 22, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 24, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 26, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 28, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 30, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 32, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 34, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 36, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 38, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 40, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 42, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 44, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 46, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 48, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 50, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 52, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 54, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 56, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 58, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 60, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 62, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 64, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 66, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 68, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 70, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 71, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 72, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 73, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 74, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 75, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 76, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 77, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 78, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 79, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 80, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 81, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 82, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 83, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 84, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 85, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 86, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 87, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 88, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 89, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 90, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 91, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 92, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 93, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 94, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 95, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 96, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 0, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
+ 31, 0, 2, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
+ 31, 0, 4, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
+ 31, 0, 6, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
+ 31, 0, 8, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
+ 31, 0, 10, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0, 40, 66,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+168,137,253, 2, 0, 0, 0, 0,232, 20,253, 2, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0,
+ 88, 21,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 97, 0, 0, 0,231, 3, 0, 0,
+ 1, 1, 44, 6,135, 3, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0,168,242,224, 2, 0, 0, 0, 0, 88,102,254, 2, 0, 0, 0, 0,
+216,126,254, 2, 0, 0, 0, 0, 24, 67,254, 2, 0, 0, 0, 0, 56, 97,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,184, 18, 14, 3, 0, 0, 0, 0,184, 95,216, 4, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+ 24, 67,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,136, 68,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 64,113, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,197, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 44, 6, 26, 0, 44, 6, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 97, 0, 0, 0,122, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 26, 0, 10, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,253,224, 2, 0, 0, 0, 0, 72,102,101, 4, 0, 0, 0, 0,
+ 72,102,101, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,229,114, 4, 0, 0, 0, 0,
+136, 35, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+136, 68,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,184, 92,254, 2, 0, 0, 0, 0, 24, 67,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 32, 67, 0, 0, 37,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255, 63, 37,196, 0, 0, 0, 0,
+143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,148, 2, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,148, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,149, 2,143, 0,149, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0, 83, 1, 0, 0,231, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,149, 2, 11, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+160, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,249,224, 2, 0, 0, 0, 0,200,132,101, 4, 0, 0, 0, 0,
+200,132,101, 4, 0, 0, 0, 0,248, 69,254, 2, 0, 0, 0, 0, 24, 91,254, 2, 0, 0, 0, 0,136, 53,219, 4, 0, 0, 0, 0,
+ 56, 39, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+248, 69,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,152, 71,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232, 29,149, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 84,111,111,108,115, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22,254,143, 0,210, 1, 0, 0, 0, 0, 0, 0, 39, 0,
+ 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152, 71,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 56, 73,254, 2, 0, 0, 0, 0,248, 69,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,211,254,143, 0, 21, 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, 68, 65, 84, 65, 88, 1, 0, 0,
+ 56, 73,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,216, 74,254, 2, 0, 0, 0, 0,152, 71,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+ 98,114,117,115,104, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+ 98,114,117,115,104, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,252,143, 0,213, 1, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 74,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+120, 76,254, 2, 0, 0, 0, 0, 56, 73,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,115,116,114,111,107,101, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,115,116,114,111,107,101, 0, 0, 0, 0,
@@ -2974,82 +3763,89 @@ char datatoc_startup_blend[]= {
0, 0, 66,254,143, 0,121, 0, 0, 0, 0, 0, 4, 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, 68, 65, 84, 65, 64, 1, 0, 0,184, 43, 89, 10,199, 0, 0, 0,
- 1, 0, 0, 0, 40, 45, 89, 10, 72, 42, 89, 10, 24,251,170, 9, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,
-111,108,115, 95, 98,114,117,115,104, 95, 99,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,
-111,108,115, 95, 98,114,117,115,104, 95, 99,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,117,114,118,101, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+120, 76,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 24, 78,254, 2, 0, 0, 0, 0,216, 74,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+ 98,114,117,115,104, 95, 99,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+ 98,114,117,115,104, 95, 99,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,143, 0,231, 0, 0, 0, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 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,164,253,143, 0,231, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 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, 68, 65, 84, 65, 64, 1, 0, 0, 40, 45, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,152, 46, 89, 10,184, 43, 89, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,
-112,101, 97,114, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,
-112,101, 97,114, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 65,112,112,101, 97,114, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 78,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+184, 79,254, 2, 0, 0, 0, 0,120, 76,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,112,101, 97,114, 97,110, 99,101,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,253,143, 0,133, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,112,101, 97,114, 97,110, 99,101,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 65,112,112,101, 97,114, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-152, 46, 89, 10,199, 0, 0, 0, 1, 0, 0, 0, 8, 48, 89, 10, 40, 45, 89, 10,232,242,170, 9, 0, 0, 0, 0, 86, 73, 69, 87,
- 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87,
- 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,111,111,108,
+ 0, 0, 96,253,143, 0,133, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55,254,
-143, 0, 36, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+184, 79,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 88, 81,254, 2, 0, 0, 0, 0, 24, 78,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+ 98,114,117,115,104, 95,116,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+ 98,114,117,115,104, 95,116,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 8, 48, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,
-120, 49, 89, 10,152, 46, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116,
- 95,115,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116,
- 95,115,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55,254,143, 0, 36, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52,253,143, 0,225, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 88, 81,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+248, 82,254, 2, 0, 0, 0, 0,184, 79,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,115,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,115,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0,120, 49, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,232, 50, 89, 10, 8, 48, 89, 10, 8,255,170, 9,
- 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0,
+ 83,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0,
+ 0, 0, 52,253,143, 0,225, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,145,253,143, 0,132, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+248, 82,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,152, 84,254, 2, 0, 0, 0, 0, 88, 81,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116,
+ 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116,
+ 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,145,253,143, 0,132, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,232, 50, 89, 10,
-199, 0, 0, 0, 1, 0, 0, 0, 88, 52, 89, 10,120, 49, 89, 10, 40, 3,171, 9, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
- 84, 95,116,111,111,108,115, 95,119,101,105,103,104,116,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
- 84, 95,116,111,111,108,115, 95,119,101,105,103,104,116,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,101,105,103,104,116, 32, 84,
-111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39,254,143, 0,124, 0,
- 0, 0, 0, 0, 4, 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, 68, 65, 84, 65, 88, 1, 0, 0,152, 84,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 56, 86,254, 2, 0, 0, 0, 0,248, 82,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,119,101,105,103,104,116,112, 97,105,110,116, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 88, 52, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,200, 53, 89, 10,
-232, 50, 89, 10, 64, 7,171, 9, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,119,101,105,103,
-104,116,112, 97,105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,119,101,105,103,
-104,116,112, 97,105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,119,101,105,103,104,116,112, 97,105,110,116, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,181,253,143, 0,190, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 87,101,105,103,104,116, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,200, 53, 89, 10,199, 0, 0, 0, 1, 0, 0, 0, 56, 55, 89, 10, 88, 52, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 39,254,143, 0,124, 0, 0, 0, 0, 0, 4, 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, 68, 65, 84, 65, 88, 1, 0, 0,
+ 56, 86,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,216, 87,254, 2, 0, 0, 0, 0,152, 84,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+119,101,105,103,104,116,112, 97,105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+119,101,105,103,104,116,112, 97,105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,181,253,143, 0,190, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 87,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+120, 89,254, 2, 0, 0, 0, 0, 56, 86,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,112,114,111,106,101, 99,116,112, 97,105,110,116, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,112,114,111,106,101, 99,116,112, 97,105,110,116, 0, 0, 0, 0,
@@ -3059,201 +3855,278 @@ char datatoc_startup_blend[]= {
0, 0,241,252,143, 0, 9, 1, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 56, 55, 89, 10,199, 0, 0, 0,
- 1, 0, 0, 0,168, 56, 89, 10,200, 53, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,
-111,108,115, 95,118,101,114,116,101,120,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,
-111,108,115, 95,118,101,114,116,101,120,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+120, 89,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 24, 91,254, 2, 0, 0, 0, 0,216, 87,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+118,101,114,116,101,120,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+118,101,114,116,101,120,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197,253,143, 0,146, 0, 0, 0, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197,253,143, 0,146, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,168, 56, 89, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 56, 55, 89, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,105,109, 97,103,101,112, 97,105,110,116, 95,111,112,116,
-105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,105,109, 97,103,101,112, 97,105,110,116, 95,111,112,116,
-105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 91,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,120, 89,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,105,109, 97,103,101,112, 97,105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,146,253,143, 0, 80, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,105,109, 97,103,101,112, 97,105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
- 24, 58, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,176, 60, 89, 10,208, 36, 89, 10, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 90,195,
- 0, 0, 0, 0, 0, 0, 0, 0,227,102, 16, 67, 24, 30, 90,195, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,
-215, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,
-215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0,
- 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,216, 0,143, 0,216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,159, 0, 0, 0,119, 0, 0, 0, 78, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-160, 0,216, 0, 11, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-152,111, 60, 9, 16, 42, 84, 10, 16, 42, 84, 10, 64, 59, 89, 10, 64, 59, 89, 10,216, 56, 85, 10, 64, 58, 85, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 64, 59, 89, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 32,112, 60, 9, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0,
+ 0, 0,146,253,143, 0, 80, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82,101,109,111,118,101, 32, 86,101,114,116,101,120, 32, 67,111,108,111,114, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+184, 92,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,200, 95,254, 2, 0, 0, 0, 0,136, 68,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 90,195, 0, 0, 0, 0, 0, 0, 0, 0,227,102, 16, 67, 24, 30, 90,195, 0, 0, 0, 0,
+143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,216, 0,143, 0,216, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0,123, 0, 0, 0, 82, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,216, 0, 12, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,250,224, 2, 0, 0, 0, 0,232,142,112, 4, 0, 0, 0, 0,
+232,142,112, 4, 0, 0, 0, 0, 40, 94,254, 2, 0, 0, 0, 0, 40, 94,254, 2, 0, 0, 0, 0, 88, 54,219, 4, 0, 0, 0, 0,
+232, 42, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+ 40, 94,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+168,251,224, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,
+112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,
+112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,101,114, 97,116,111,114, 0,114,116,101,120, 32, 67,111,
+108,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,144, 0, 16, 0, 0, 0, 0, 0, 0, 0, 39, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,144, 0, 16, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
-176, 60, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,216, 61, 89, 10, 24, 58, 89, 10, 0, 0, 0, 0, 0, 0, 52, 67, 0,192,115,196,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,115,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0,
-206, 3, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,
-206, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0,
- 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,207, 3,163, 0,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 19, 4, 0, 0, 19, 4, 0, 0,119, 0, 0, 0,198, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200, 95,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 56, 97,254, 2, 0, 0, 0, 0,184, 92,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 67, 0,192,115,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 35, 67, 0,192,115,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0,
+ 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0,
+ 18, 0, 0, 0, 6, 0,180, 0,207, 3,163, 0,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 43, 6, 0, 0, 43, 6, 0, 0,123, 0, 0, 0,231, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 40,107, 60, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,216, 61, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,176, 60, 89, 10,
+184,244,224, 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, 68, 65, 84, 65, 40, 1, 0, 0, 56, 97,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,200, 95,254, 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,160, 0, 0, 0, 19, 4, 0, 0,119, 0, 0, 0,198, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116, 3, 80, 3, 12, 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,160,106, 60, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-240, 68, 85, 10,120, 68, 85, 10, 0, 0, 0, 0, 0, 63, 89, 10, 68, 65, 84, 65, 72, 3, 0, 0, 0, 63, 89, 10,159, 0, 0, 0,
- 1, 0, 0, 0,255,255,139, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,130,241,145, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,218,205, 76,190,
- 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190,
- 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,158,210,111,193,
- 0, 0,128, 63, 68,239,209, 62, 70,119,105, 63,192, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,144, 74, 70, 62,166, 33,101, 63,
- 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 42, 61,228, 62, 0, 0, 0, 0,164, 95, 68, 65,141,120,173,192,225,208,213, 64,
- 0, 0,128, 63,177,157,229, 62,212,134,234,190,222,160, 81,191,184,158, 81,191,115, 90,127, 63,152, 22, 98, 62, 9, 46,185, 62,
- 35, 44,185, 62,143,180,109,188, 56,160,130, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,220,161,108, 65,
-158,210,111, 65,130,240,191, 62,105,116, 85, 63, 64,183, 70,188, 0, 0, 2,180, 25,103,180,190,101,233, 45, 62,215,245, 72, 63,
- 0, 0,128, 50,230,117,117,194, 59,213,216, 65,167,161, 5,194,236,254,159,192,240, 49,114, 66,196,242,213,193,140,218, 3, 66,
-145, 0,160, 64, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190,
- 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,158,210,111,193,
- 0, 0,128, 63,177,157,229, 62,212,134,234,190,222,160, 81,191,184,158, 81,191,115, 90,127, 63,152, 22, 98, 62, 9, 46,185, 62,
- 35, 44,185, 62,143,180,109,188, 56,160,130, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,220,161,108, 65,
-158,210,111, 65,204,210, 20, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,204,210, 20, 64, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,204,210, 20, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,158,210,111, 65,215,134, 91, 65, 0, 0, 0, 0,
- 0, 0, 0, 0, 1,144, 7, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 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,
+160, 0, 0, 0, 43, 6, 0, 0,123, 0, 0, 0,231, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+140, 5,109, 3, 13, 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,
+200,243,224, 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,232, 73, 14, 3, 0, 0, 0, 0, 24, 73, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+168, 98,254, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0,168, 98,254, 2, 0, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,143,174,226, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,218,205, 76,190, 0, 0, 0, 0,
+ 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,
+162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33,210,111,193, 0, 0,128, 63,
+ 68,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 52,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,
+185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0, 62, 95, 68, 65, 51,120,173,192,115,208,213, 64, 0, 0,128, 63,
+178,157,229, 62,176, 34, 54,191,222,160, 81,191,184,158, 81,191,117, 90,127, 63, 8,149,175, 62, 9, 46,185, 62, 35, 44,185, 62,
+145,180,109,188,241,227,202, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,161,108, 65, 33,210,111, 65,
+190,240,191, 62, 90,116, 85, 63, 32,179, 70,188, 0, 0,240, 50,103, 75,104,190,190,239,223, 61, 34, 98, 1, 63, 0, 0,180, 51,
+230,117,117,194, 58,213,216, 65,166,161, 5,194, 64,255,159,192,240, 49,114, 66,195,242,213,193,139,218, 3, 66,228, 0,160, 64,
+ 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,
+162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33,210,111,193, 0, 0,128, 63,
+178,157,229, 62,176, 34, 54,191,222,160, 81,191,184,158, 81,191,117, 90,127, 63, 8,149,175, 62, 9, 46,185, 62, 35, 44,185, 62,
+145,180,109,188,241,227,202, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,161,108, 65, 33,210,111, 65,
+ 78, 75,185, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 75,185, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 78, 75,185, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 33,210,111, 65,160,228,143, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+237,200,168, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 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,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 30, 33, 12, 66,
- 85,152,137, 66,113, 27,126, 66, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120, 66, 89, 10,160, 0, 0, 0, 1, 0, 0, 0,
-240, 69, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0,
- 1, 0, 0, 0, 1, 0, 7, 0,208,245, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 24, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, 0, 64,156, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0,255,255, 25, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
-160, 67, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,200, 68, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 48, 68, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0,198, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, 0, 0, 0, 0,
- 25, 0, 0, 0, 0,224,197, 68, 0, 0,200, 65, 0,224,197, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 48, 6, 26, 0, 48, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 32, 33, 12, 66, 84,152,137, 66,
+113, 27,126, 66, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0, 88,102,254, 2, 0, 0, 0, 0,154, 0, 0, 0, 1, 0, 0, 0,
+168,109,254, 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,
+ 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 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, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 24, 0, 0, 0, 0,
+ 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,205,204,204, 61, 0, 64,156, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0,255,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232,103,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 88,105,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 50, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0,224,239, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0, 0,209, 68, 0, 0,200, 65, 0, 0,209, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0,127, 7, 26, 0,127, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,126, 7, 0, 0,207, 3, 0, 0,232, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+127, 7, 26, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88,105,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+200,106,254, 2, 0, 0, 0, 0,232,103,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 67, 0,128,115,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 95, 67,255,191,115,196, 0, 0, 0, 0,223, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0,
+ 18, 0, 0, 4, 6, 0,240, 0,207, 3,223, 0,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+240, 0,207, 3, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,106,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 56,108,254, 2, 0, 0, 0, 0, 88,105,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0, 0, 0,112, 66,
+ 0, 0, 0, 0, 0,224,209, 68, 0, 0, 0, 0, 0, 0,112, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 6, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0,
+ 0, 0,179, 68, 0, 0,108, 66, 0, 0,179, 68, 0, 0,108, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0,143, 6, 60, 0,143, 6, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+240, 0, 0, 0,126, 7, 0, 0,147, 3, 0, 0,206, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+143, 6, 60, 0, 0, 0, 4, 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, 68, 65, 84, 65, 40, 1, 0, 0, 56,108,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,200,106,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0,104,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,224,209, 68, 0, 64, 96,196, 0, 0, 0, 0,126, 6, 0, 0,143, 6, 0, 0, 0, 0, 0, 0,146, 3, 0, 0,
+ 0, 0, 0, 0,142, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 6, 0, 0, 18, 0, 0, 0,146, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 8, 4, 0, 0, 2, 0, 3, 3,
+ 4, 0, 0, 4, 6, 0,143, 6,147, 3,143, 6,129, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+240, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0,146, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+143, 6,147, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,104, 0, 0, 0,168,109,254, 2, 0, 0, 0, 0,162, 0, 0, 0, 1, 0, 0, 0,
+ 56,113,254, 2, 0, 0, 0, 0, 88,102,254, 2, 0, 0, 0, 0,232,103,254, 2, 0, 0, 0, 0, 56,108,254, 2, 0, 0, 0, 0,
+ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7, 0,255,255, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88,110,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+200,111,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 48, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0,198, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0,224,197, 68, 0, 0,200, 65, 0,224,197, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0, 48, 6, 26, 0, 48, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 47, 6, 0, 0, 93, 0, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
48, 6, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,200, 68, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,160, 67, 89, 10,
- 0, 0, 0, 0, 0,128,241, 67, 0,128, 90,196, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,195, 68, 0, 64,111,196, 0, 0, 0, 0,
- 31, 6, 0, 0, 48, 6, 0, 0, 18, 0, 0, 0,206, 3, 0, 0, 0, 0, 0, 0, 30, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0, 30, 6, 0, 0, 18, 0, 0, 0,206, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 48, 6,207, 3, 31, 6,189, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 6,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,252, 0, 0, 0,240, 69, 89, 10,169, 0, 0, 0,
- 1, 0, 0, 0, 96,241, 89, 10,120, 66, 89, 10,160, 67, 89, 10,200, 68, 89, 10, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,140, 79, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 1, 0, 0, 0,
- 68, 65, 84, 65, 12, 0, 0, 0, 8,140, 79, 9,224, 0, 0, 0, 1, 0, 0, 0, 93, 0, 0, 0, 93, 0, 0, 0, 24, 71, 89, 10,
- 68, 65, 84, 65, 92, 4, 0, 0, 24, 71, 89, 10,223, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10,
- 19, 0, 0, 0, 1, 0, 0, 0, 16,228, 90, 10, 20, 0, 0, 0, 1, 0, 0, 0, 16,228, 90, 10, 21, 0, 0, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,224,243, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,152,250, 90, 10, 0, 0, 0, 0,
- 1, 0, 0, 0,240, 74, 92, 10, 0, 0, 0, 0, 1, 0, 0, 0, 40, 4, 91, 10, 0, 0, 0, 0, 1, 0, 0, 0,224,168, 91, 10,
- 0, 0, 0, 0, 1, 0, 0, 0, 96,255, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,112,240, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,
-208,245, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,216,239, 90, 10, 30, 0,255,255, 0, 0, 1, 0, 0, 0, 0, 0, 31, 0, 0, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 8, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 1, 0, 0, 0, 0, 0,
- 31, 0, 11, 0, 0, 0, 1, 0, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 16, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 1, 0, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 24, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 1, 0, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255,
- 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
- 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255,
- 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 3, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 31, 0, 6, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 11, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 31, 0, 14, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 19, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 31, 0, 22, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 27, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 31, 0, 30, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,160, 75, 89, 10,201, 0, 0, 0,
- 1, 0, 0, 0,200, 76, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0, 0,198, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,197, 68,
- 0, 0,200, 65, 0,224,197, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4,
- 10, 0, 48, 6, 26, 0, 48, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0,
- 93, 0, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 6, 26, 0, 0, 0, 1, 0,
- 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, 68, 65, 84, 65,
-248, 0, 0, 0,200, 76, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,240, 77, 89, 10,160, 75, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,111,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 88,110,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,241, 67, 0,128, 90,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,224,195, 68, 0, 64,111,196, 0, 0, 0, 0, 31, 6, 0, 0, 48, 6, 0, 0, 18, 0, 0, 0,206, 3, 0, 0,
+ 0, 0, 0, 0, 30, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 30, 6, 0, 0, 18, 0, 0, 0,206, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3,
+ 0, 0, 0, 4, 6, 0, 48, 6,207, 3, 31, 6,189, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 6,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 1, 0, 0, 56,113,254, 2, 0, 0, 0, 0,163, 0, 0, 0, 1, 0, 0, 0,
+216,126,254, 2, 0, 0, 0, 0,168,109,254, 2, 0, 0, 0, 0, 88,110,254, 2, 0, 0, 0, 0,200,111,254, 2, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,114,254, 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, 11, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,
+152,114,254, 2, 0, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0, 93, 0, 0, 0, 93, 0, 0, 0,248,114,254, 2, 0, 0, 0, 0,
+ 68, 65, 84, 65,208, 5, 0, 0,248,114,254, 2, 0, 0, 0, 0,216, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232,190,255, 2, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 0, 0,
+232,190,255, 2, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+168,211,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+152, 49, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+200,142, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 40,207,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 88,206,255, 2, 0, 0, 0, 0, 30, 0,255,255, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 11, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,121,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+136,122,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0,198, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0,224,197, 68, 0, 0,200, 65, 0,224,197, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0, 48, 6, 26, 0, 48, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 47, 6, 0, 0, 93, 0, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 6, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0,136,122,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+248,123,254, 2, 0, 0, 0, 0, 24,121,254, 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,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 4, 0, 3, 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,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 3, 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, 68, 65, 84, 65,248, 0, 0, 0,240, 77, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 24, 79, 89, 10,
-200, 76, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248,123,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+104,125,254, 2, 0, 0, 0, 0,136,122,254, 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, 47, 6, 0, 0, 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 7, 0, 4, 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, 68, 65, 84, 65,248, 0, 0, 0, 24, 79, 89, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240, 77, 89, 10, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,
+ 47, 6, 0, 0, 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 7, 0, 4, 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, 68, 65, 84, 65, 40, 1, 0, 0,104,125,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,248,123,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,
0, 0, 38,192, 0, 0,102, 64, 0,192,179,191, 0,224, 25, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 6, 0, 0, 0, 0, 0, 0,207, 3, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 6,207, 3,
+ 0, 0, 0, 0, 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 6,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 33, 0, 0, 96,241, 89, 10,170, 0, 0, 0, 1, 0, 0, 0,224, 84, 89, 10,240, 69, 89, 10,160, 75, 89, 10,
- 24, 79, 89, 10, 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,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 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, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65, 0, 0, 0, 0,154,153,153, 62, 0, 0, 0, 0,
-100, 0, 0, 0,154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 33, 0, 0,216,126,254, 2, 0, 0, 0, 0,164, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56,113,254, 2, 0, 0, 0, 0, 24,121,254, 2, 0, 0, 0, 0,104,125,254, 2, 0, 0, 0, 0,
+ 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,100, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 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,240, 65, 0, 0, 0, 0,154,153,153, 62, 0, 0, 0, 0,100, 0, 0, 0,
+154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -3382,7 +4255,7 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,100, 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,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -3512,189 +4385,193 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 64, 80, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,
-104, 81, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 32,209, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0,209, 68, 0, 0,200, 65,
- 0, 0,209, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,137, 6,
- 26, 0,137, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 6, 0, 0,149, 3, 0, 0,
-174, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,137, 6, 26, 0, 0, 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,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,190, 0, 0, 0, 1, 0, 0, 0,
+120,240,254, 2, 0, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83, 82, 71, 97,109,101, 32, 76,111,103,105, 99, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0, 24,168,254, 2, 0, 0, 0, 0,
+216,176,254, 2, 0, 0, 0, 0, 72,177,254, 2, 0, 0, 0, 0, 40,233,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 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, 68, 65, 84, 65, 32, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,104,162,254, 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, 68, 65, 84, 65, 32, 0, 0, 0,104,162,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+216,162,254, 2, 0, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,216,162,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 72,163,254, 2, 0, 0, 0, 0,
+104,162,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 72,163,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,216,162,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0, 72,163,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+152,164,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0,
+ 40,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 8,165,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 24, 6,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 24, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 88,166,254, 2, 0, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7,172, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0,
+232,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 5,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+200,166,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56, 5, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 64, 1,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 70, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 24,168,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136,168,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,104,162,254, 2, 0, 0, 0, 0,216,162,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,136,168,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248,168,254, 2, 0, 0, 0, 0,
+ 24,168,254, 2, 0, 0, 0, 0,104,162,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,248,168,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104,169,254, 2, 0, 0, 0, 0,
+136,168,254, 2, 0, 0, 0, 0,216,162,254, 2, 0, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,104,169,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216,169,254, 2, 0, 0, 0, 0,
+248,168,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,216,169,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72,170,254, 2, 0, 0, 0, 0,
+104,169,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 72,170,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184,170,254, 2, 0, 0, 0, 0,
+216,169,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,184,170,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40,171,254, 2, 0, 0, 0, 0,
+ 72,170,254, 2, 0, 0, 0, 0, 72,163,254, 2, 0, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 40,171,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152,171,254, 2, 0, 0, 0, 0,
+184,170,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,152,171,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8,172,254, 2, 0, 0, 0, 0,
+ 40,171,254, 2, 0, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 8,172,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120,172,254, 2, 0, 0, 0, 0,
+152,171,254, 2, 0, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,120,172,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232,172,254, 2, 0, 0, 0, 0,
+ 8,172,254, 2, 0, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,232,172,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88,173,254, 2, 0, 0, 0, 0,
+120,172,254, 2, 0, 0, 0, 0, 72,163,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 88,173,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200,173,254, 2, 0, 0, 0, 0,
+232,172,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,200,173,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56,174,254, 2, 0, 0, 0, 0,
+ 88,173,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 56,174,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168,174,254, 2, 0, 0, 0, 0,
+200,173,254, 2, 0, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,168,174,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24,175,254, 2, 0, 0, 0, 0,
+ 56,174,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 24,175,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136,175,254, 2, 0, 0, 0, 0,
+168,174,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,136,175,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248,175,254, 2, 0, 0, 0, 0,
+ 24,175,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,248,175,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104,176,254, 2, 0, 0, 0, 0,
+136,175,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,104,176,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216,176,254, 2, 0, 0, 0, 0,
+248,175,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,216,176,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+104,176,254, 2, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0, 72,177,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 24,181,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,104,162,254, 2, 0, 0, 0, 0,216,162,254, 2, 0, 0, 0, 0,
+ 40,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0,
+ 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,239,254, 2, 0, 0, 0, 0,
+232,239,254, 2, 0, 0, 0, 0, 56,178,254, 2, 0, 0, 0, 0,168,179,254, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+ 56,178,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,168,179,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,
-104, 81, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,144, 82, 89, 10, 64, 80, 89, 10, 0, 0, 0, 0, 0, 0,112, 67, 0, 64,101,196,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 67, 0, 64,101,196, 0, 0, 0, 0,223, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0,
-148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 0,
-148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0,
- 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,240, 0,149, 3,223, 0,149, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-240, 0,149, 3, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,144, 82, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,184, 83, 89, 10,104, 81, 89, 10,
- 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0, 0, 0,112, 66, 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0, 0, 0,112, 66,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,152, 5, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0,179, 68, 0, 0,108, 66, 0, 0,179, 68, 0, 0,108, 66,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,153, 5, 60, 0,153, 5, 60, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,136, 6, 0, 0, 89, 3, 0, 0,148, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 60, 0, 0, 0, 4, 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, 68, 65, 84, 65,248, 0, 0, 0,184, 83, 89, 10,201, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0,144, 82, 89, 10, 0, 0, 0, 0, 0,128,175, 68, 0, 0,137,195, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,177, 68, 0, 64, 86,196, 0, 0, 0, 0,136, 5, 0, 0,153, 5, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0,
-135, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,135, 5, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, 2, 0, 3, 3, 2, 0, 0, 4,
- 6, 0,153, 5, 89, 3,136, 5, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,136, 6, 0, 0,
- 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 89, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 60, 0, 0, 0,224, 84, 89, 10,168, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96,241, 89, 10, 64, 80, 89, 10,184, 83, 89, 10,
- 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 5, 0,255,255,255,255, 0, 0, 83, 78, 0, 0,140, 0, 0, 0,168, 85, 89, 10,196, 0, 0, 0, 1, 0, 0, 0,
-248, 63, 90, 10, 24, 81, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 71, 97,109,101, 32, 76,111,103,105, 99, 0, 46, 48, 48,
- 49, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 86, 89, 10,160, 89, 89, 10,224, 89, 89, 10,
-128, 95, 89, 10,200, 95, 89, 10,184, 58, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96, 86, 89, 10,197, 0, 0, 0, 1, 0, 0, 0,
-160, 86, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160, 86, 89, 10,
-197, 0, 0, 0, 1, 0, 0, 0,224, 86, 89, 10, 96, 86, 89, 10, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,224, 86, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 32, 87, 89, 10,160, 86, 89, 10, 0, 0, 0, 0,118, 7, 97, 4,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 32, 87, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 96, 87, 89, 10,224, 86, 89, 10,
- 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96, 87, 89, 10,197, 0, 0, 0, 1, 0, 0, 0,
-160, 87, 89, 10, 32, 87, 89, 10, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160, 87, 89, 10,
-197, 0, 0, 0, 1, 0, 0, 0,224, 87, 89, 10, 96, 87, 89, 10, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,224, 87, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 32, 88, 89, 10,160, 87, 89, 10, 0, 0, 0, 0, 0, 0,172, 1,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 32, 88, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 96, 88, 89, 10,224, 87, 89, 10,
- 0, 0, 0, 0, 24, 6,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96, 88, 89, 10,197, 0, 0, 0, 1, 0, 0, 0,
-160, 88, 89, 10, 32, 88, 89, 10, 0, 0, 0, 0, 24, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160, 88, 89, 10,
-197, 0, 0, 0, 1, 0, 0, 0,224, 88, 89, 10, 96, 88, 89, 10, 0, 0, 0, 0,118, 7,172, 1, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,224, 88, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 32, 89, 89, 10,160, 88, 89, 10, 0, 0, 0, 0, 56, 5,172, 1,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 32, 89, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 96, 89, 89, 10,224, 88, 89, 10,
- 0, 0, 0, 0, 56, 5, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96, 89, 89, 10,197, 0, 0, 0, 1, 0, 0, 0,
-160, 89, 89, 10, 32, 89, 89, 10, 0, 0, 0, 0, 64, 1,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160, 89, 89, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96, 89, 89, 10, 0, 0, 0, 0, 64, 1, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,224, 89, 89, 10,198, 0, 0, 0, 1, 0, 0, 0, 40, 90, 89, 10, 0, 0, 0, 0,160, 86, 89, 10,224, 86, 89, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 40, 90, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,112, 90, 89, 10,
-224, 89, 89, 10,160, 86, 89, 10, 96, 87, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112, 90, 89, 10,
-198, 0, 0, 0, 1, 0, 0, 0,184, 90, 89, 10, 40, 90, 89, 10,224, 86, 89, 10,160, 87, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,184, 90, 89, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 91, 89, 10,112, 90, 89, 10, 96, 87, 89, 10,
-160, 87, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 0, 91, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 72, 91, 89, 10,184, 90, 89, 10, 96, 87, 89, 10,224, 87, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 72, 91, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,144, 91, 89, 10, 0, 91, 89, 10,224, 87, 89, 10, 32, 88, 89, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144, 91, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,216, 91, 89, 10, 72, 91, 89, 10,
- 32, 87, 89, 10, 96, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216, 91, 89, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 32, 92, 89, 10,144, 91, 89, 10, 32, 88, 89, 10, 96, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 32, 92, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,104, 92, 89, 10,216, 91, 89, 10, 96, 86, 89, 10,224, 87, 89, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,104, 92, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,176, 92, 89, 10,
- 32, 92, 89, 10, 96, 86, 89, 10, 96, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,176, 92, 89, 10,
-198, 0, 0, 0, 1, 0, 0, 0,248, 92, 89, 10,104, 92, 89, 10,160, 87, 89, 10,160, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,248, 92, 89, 10,198, 0, 0, 0, 1, 0, 0, 0, 64, 93, 89, 10,176, 92, 89, 10, 32, 87, 89, 10,
-160, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 64, 93, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,
-136, 93, 89, 10,248, 92, 89, 10, 32, 88, 89, 10,160, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
-136, 93, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,208, 93, 89, 10, 64, 93, 89, 10,224, 88, 89, 10, 32, 89, 89, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208, 93, 89, 10,198, 0, 0, 0, 1, 0, 0, 0, 24, 94, 89, 10,136, 93, 89, 10,
-160, 87, 89, 10, 32, 89, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 24, 94, 89, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 96, 94, 89, 10,208, 93, 89, 10,160, 88, 89, 10,224, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 96, 94, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,168, 94, 89, 10, 24, 94, 89, 10,224, 87, 89, 10, 96, 89, 89, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,168, 94, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,240, 94, 89, 10,
- 96, 94, 89, 10,224, 88, 89, 10, 96, 89, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,240, 94, 89, 10,
-198, 0, 0, 0, 1, 0, 0, 0, 56, 95, 89, 10,168, 94, 89, 10, 96, 87, 89, 10,160, 89, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0, 56, 95, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,128, 95, 89, 10,240, 94, 89, 10, 32, 89, 89, 10,
-160, 89, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,128, 95, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 56, 95, 89, 10, 96, 89, 89, 10,160, 89, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,
-200, 95, 89, 10,200, 0, 0, 0, 1, 0, 0, 0,168, 98, 89, 10, 0, 0, 0, 0, 96, 87, 89, 10,160, 86, 89, 10,224, 86, 89, 10,
-160, 87, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0,
- 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,152, 63, 90, 10,152, 63, 90, 10, 88, 96, 89, 10,128, 97, 89, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88, 96, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,
-128, 97, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65,
- 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7,
- 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0,
- 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+168,179,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,178,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,
+112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,111, 7, 0, 0, 18, 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,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 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, 97, 4, 0, 0, 97, 4, 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, 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, 68, 65, 84, 65,248, 0, 0, 0,
-128, 97, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88, 96, 89, 10, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 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, 63, 0, 0, 0, 64, 10, 0, 0, 0,
- 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 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, 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, 68, 65, 84, 65, 96, 0, 0, 0,168, 98, 89, 10,200, 0, 0, 0, 1, 0, 0, 0,240, 36, 90, 10,200, 95, 89, 10,
- 96, 88, 89, 10, 32, 88, 89, 10,160, 88, 89, 10, 32, 87, 89, 10, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,
-171, 1, 0, 0, 4, 4, 94, 1,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 35, 90, 10,232, 35, 90, 10,
- 56, 99, 89, 10, 96,100, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
- 56, 99, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 96,100, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0,175, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0,
- 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 94, 1, 31, 0, 94, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 25, 6, 0, 0,118, 7, 0, 0,141, 1, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 94, 1, 31, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 96,100, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 56, 99, 89, 10,
- 0, 0, 0, 0, 0,128,174, 67, 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0,255,127,166, 67,255,127,198,195, 0, 0, 0, 0,
- 77, 1, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 94, 1,141, 1, 77, 1,141, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1,141, 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,168, 18, 90, 10,120, 34, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,168, 18, 90, 10,199, 0, 0, 0,
- 1, 0, 0, 0, 24, 20, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,
-111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,
-111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255, 76, 1, 36, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 24, 20, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,136, 21, 90, 10,168, 18, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+ 24,181,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,168,205,254, 2, 0, 0, 0, 0, 72,177,254, 2, 0, 0, 0, 0,
+120,165,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 72,163,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,171, 1, 0, 0, 4, 4, 94, 1,172, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,204,254, 2, 0, 0, 0, 0,104,204,254, 2, 0, 0, 0, 0,
+ 8,182,254, 2, 0, 0, 0, 0,120,183,254, 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, 68, 65, 84, 65, 40, 1, 0, 0, 8,182,254, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,120,183,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,175, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0,
+ 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 94, 1, 31, 0, 94, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0,141, 1, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 31, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 76, 1, 61, 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, 68, 65, 84, 65, 40, 1, 0, 0,120,183,254, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,182,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,174, 67,
+ 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0,255,127,166, 67,255,127,198,195, 0, 0, 0, 0, 77, 1, 0, 0, 94, 1, 0, 0,
+ 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 76, 1, 0, 0,
+ 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
+ 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 94, 1,141, 1, 77, 1,141, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 94, 1,141, 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,
+232,184,254, 2, 0, 0, 0, 0,200,202,254, 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, 68, 65, 84, 65, 88, 1, 0, 0,232,184,254, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136,186,254, 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, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-136, 21, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,248, 22, 90, 10, 24, 20, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,
-114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255,
- 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,248, 22, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,
-104, 24, 90, 10,136, 21, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
-105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
-105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255, 76, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, 76, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0,104, 24, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,216, 25, 90, 10,248, 22, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136,186,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40,188,254, 2, 0, 0, 0, 0,
+232,184,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 76, 1, 61, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40,188,254, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200,189,254, 2, 0, 0, 0, 0,136,186,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 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,
+ 68, 65, 84, 65, 88, 1, 0, 0,200,189,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104,191,254, 2, 0, 0, 0, 0,
+ 40,188,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,
+110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, 76, 1,203, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104,191,254, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 8,193,254, 2, 0, 0, 0, 0,200,189,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 58,254, 76, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, 76, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,216, 25, 90, 10,
-199, 0, 0, 0, 1, 0, 0, 0, 72, 27, 90, 10,104, 24, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 8,193,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168,194,254, 2, 0, 0, 0, 0,
+104,191,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -3704,206 +4581,238 @@ char datatoc_startup_blend[]= {
20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 72, 27, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,184, 28, 90, 10,
-216, 25, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168,194,254, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 72,196,254, 2, 0, 0, 0, 0, 8,193,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253, 76, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 0, 0, 0, 0, 0,164,253, 76, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,184, 28, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 40, 30, 90, 10, 72, 27, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 72,196,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232,197,254, 2, 0, 0, 0, 0,
+168,194,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 10,253, 76, 1,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,253, 76, 1,130, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 40, 30, 90, 10,199, 0, 0, 0,
- 1, 0, 0, 0,152, 31, 90, 10,184, 28, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,
-114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,
-114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232,197,254, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136,199,254, 2, 0, 0, 0, 0, 72,196,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,252, 76, 1, 0, 0, 0, 0, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,152, 31, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 8, 33, 90, 10, 40, 30, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
- 8, 33, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,120, 34, 90, 10,152, 31, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,
-112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252,
- 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136,199,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40,201,254, 2, 0, 0, 0, 0,
+232,197,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111,
+ 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252, 76, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,120, 34, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 8, 33, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40,201,254, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200,202,254, 2, 0, 0, 0, 0,136,199,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,216, 0, 0, 0,232, 35, 90, 10,165, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,200,202,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 40,201,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252, 76, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,240, 36, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,
-200, 42, 90, 10,168, 98, 89, 10, 96, 86, 89, 10,224, 87, 89, 10, 32, 88, 89, 10, 96, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 23, 6, 0, 0, 0, 0, 0, 0,171, 1, 0, 0, 17, 17, 24, 6,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-104, 42, 90, 10,104, 42, 90, 10,128, 37, 90, 10, 64, 41, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,128, 37, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,168, 38, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,151, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,195, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 63, 68, 0, 0,200, 65, 0,192, 63, 68, 0, 0,200, 65, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 24, 6, 26, 0, 24, 6, 26, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 24, 6, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,168, 38, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 64, 41, 90, 10,128, 37, 90, 10, 0, 0, 0, 0, 0, 0, 92, 67, 0, 0,201,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 67,
- 0, 0,201,195, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,145, 1, 0, 0, 0, 0, 0, 0,202, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0,
-146, 1,203, 0,146, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0,
-171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0,146, 1, 0, 0, 4, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-208, 39, 90, 10,208, 39, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-208, 39, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 79, 71, 73,
- 67, 95, 80, 84, 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 79, 71, 73,
- 67, 95, 80, 84, 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,114,111,112,
-101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196,255,
-203, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 64, 41, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,168, 38, 90, 10, 0, 0, 0, 0, 0, 0,160, 68, 0, 0, 0, 0, 0, 0,112, 67, 0, 80, 31,195, 0,234,179, 68,
- 1, 0,224,194, 0, 0,176, 67, 43, 5, 0, 0, 60, 5, 0, 0, 18, 0, 0, 0,145, 1, 0, 0, 0, 0, 0, 0, 42, 5, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 42, 5, 0, 0, 18, 0, 0, 0,145, 1, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,250, 70, 0, 0,250, 70, 0, 0, 0, 63, 72,225,154, 63, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 60, 5,
-146, 1, 43, 5,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0, 23, 6, 0, 0, 26, 0, 0, 0,
-171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 5,146, 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, 68, 65, 84, 65, 52, 0, 0, 0,
-104, 42, 90, 10,178, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 7, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 96, 0, 0, 0,200, 42, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,136,101, 89, 10,240, 36, 90, 10,224, 88, 89, 10,
- 32, 89, 89, 10,160, 87, 89, 10,160, 88, 89, 10, 0, 0, 0, 0, 57, 5, 0, 0,118, 7, 0, 0,173, 1, 0, 0, 69, 4, 0, 0,
- 9, 9, 62, 2,153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 45, 90, 10,168, 45, 90, 10, 88, 43, 90, 10,
-128, 44, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88, 43, 90, 10,
-201, 0, 0, 0, 1, 0, 0, 0,128, 44, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,210, 67, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0,128, 15, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
- 0,128,181, 67, 0, 0,200, 65, 0,128,181, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
- 4, 0, 12, 4, 10, 0, 62, 2, 26, 0, 62, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 5, 0, 0,
-118, 7, 0, 0,173, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 2, 26, 0,
- 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,104,204,254, 2, 0, 0, 0, 0,
+159, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,128, 44, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88, 43, 90, 10, 0, 0, 0, 0,
- 0,128,181, 67, 0, 0, 0, 0, 0,128,218, 67, 0, 0, 0, 0,131,248, 1, 68, 0, 0, 0, 0, 78,176, 16, 68, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 61, 2, 0, 0, 0, 0, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60,
- 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 4, 10, 0, 62, 2,127, 2, 62, 2,127, 2, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 57, 5, 0, 0,118, 7, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 2,127, 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, 68, 65, 84, 65,124, 2, 0, 0,168, 45, 90, 10,172, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0,168,205,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 24,213,254, 2, 0, 0, 0, 0,
+ 24,181,254, 2, 0, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0,
+120,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0,171, 1, 0, 0,
+ 17, 17, 24, 6,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,212,254, 2, 0, 0, 0, 0,
+136,212,254, 2, 0, 0, 0, 0,152,206,254, 2, 0, 0, 0, 0, 24,211,254, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+152,206,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 8,208,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,151, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,195, 68, 0, 0, 0, 0, 0, 0,208, 65,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 63, 68, 0, 0,200, 65, 0,192, 63, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 24, 6, 26, 0, 24, 6, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+ 8,208,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 24,211,254, 2, 0, 0, 0, 0,152,206,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 92, 67, 0, 0,201,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 67, 0, 0,201,195, 0, 0, 0, 0,
+203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,145, 1, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0,146, 1,203, 0,146, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0,171, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0,146, 1, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,120,209,254, 2, 0, 0, 0, 0,120,209,254, 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, 68, 65, 84, 65, 88, 1, 0, 0,
+120,209,254, 2, 0, 0, 0, 0,193, 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, 76, 79, 71, 73, 67, 95, 80, 84, 95,112,114,111,112,101,114,116,
+105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 79, 71, 73, 67, 95, 80, 84, 95,112,114,111,112,101,114,116,
+105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196,255,203, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,211,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8,208,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 68, 0, 0, 0, 0, 0, 0,112, 67,
+ 0, 80, 31,195, 0,234,179, 68, 1, 0,224,194, 0, 0,176, 67, 43, 5, 0, 0, 60, 5, 0, 0, 18, 0, 0, 0,145, 1, 0, 0,
+ 0, 0, 0, 0, 42, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 42, 5, 0, 0, 18, 0, 0, 0,145, 1, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70, 0, 0, 0, 63, 72,225,154, 63, 10, 0, 0, 0, 0, 0, 3, 0,
+ 0, 0, 0, 4, 0, 0, 60, 5,146, 1, 43, 5,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+220, 0, 0, 0, 23, 6, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 60, 5,146, 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, 68, 65, 84, 65, 72, 0, 0, 0,136,212,254, 2, 0, 0, 0, 0,172, 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,
+ 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 24,213,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
+200,219,254, 2, 0, 0, 0, 0,168,205,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0,
+ 40,164,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 5, 0, 0,118, 7, 0, 0,
+173, 1, 0, 0, 69, 4, 0, 0, 9, 9, 62, 2,153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232,216,254, 2, 0, 0, 0, 0,232,216,254, 2, 0, 0, 0, 0, 8,214,254, 2, 0, 0, 0, 0,120,215,254, 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,
+ 68, 65, 84, 65, 40, 1, 0, 0, 8,214,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,120,215,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,210, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128, 15, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,181, 67, 0, 0,200, 65,
+ 0,128,181, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 62, 2,
+ 26, 0, 62, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 5, 0, 0,118, 7, 0, 0,
+173, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 2, 26, 0, 0, 0, 1, 0,
+ 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, 68, 65, 84, 65,
- 96, 0, 0, 0,136,101, 89, 10,200, 0, 0, 0, 1, 0, 0, 0,184, 58, 90, 10,200, 42, 90, 10, 96, 89, 89, 10,160, 89, 89, 10,
- 32, 89, 89, 10,224, 88, 89, 10, 0, 0, 0, 0, 65, 1, 0, 0, 55, 5, 0, 0,173, 1, 0, 0, 69, 4, 0, 0, 1, 1,247, 3,
-153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 57, 90, 10,144, 57, 90, 10, 80, 48, 90, 10,240, 52, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 80, 48, 90, 10,201, 0, 0, 0,
- 1, 0, 0, 0,120, 49, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0,192,125, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,246, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68,
- 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4,
- 10, 0,247, 3, 26, 0,247, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 1, 0, 0, 55, 5, 0, 0,
-173, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 3, 26, 0, 0, 0, 1, 0,
- 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, 68, 65, 84, 65,
-248, 0, 0, 0,120, 49, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,160, 50, 90, 10, 80, 48, 90, 10, 0, 0, 0, 0, 0, 0, 15, 67,
- 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0,
- 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
- 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 65, 1, 0, 0, 65, 1, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0,127, 2, 0, 0, 5, 0, 3, 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, 68, 65, 84, 65,248, 0, 0, 0,160, 50, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,200, 51, 90, 10,
-120, 49, 90, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194,
- 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,
-102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 1, 0, 0, 55, 5, 0, 0,199, 1, 0, 0,199, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,200, 51, 90, 10,
-201, 0, 0, 0, 1, 0, 0, 0,240, 52, 90, 10,160, 50, 90, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,108,196, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,120,215,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8,214,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,181, 67, 0, 0, 0, 0, 0,128,218, 67, 0, 0, 0, 0,131,248, 1, 68,
+ 0, 0, 0, 0, 78,176, 16, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 2, 0, 0, 0, 0, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 4, 10, 0, 62, 2,
+127, 2, 62, 2,127, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 5, 0, 0,118, 7, 0, 0,
+199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 2,127, 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,
+ 68, 65, 84, 65,152, 2, 0, 0,232,216,254, 2, 0, 0, 0, 0,166, 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, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,200,219,254, 2, 0, 0, 0, 0,
+194, 0, 0, 0, 1, 0, 0, 0, 40,233,254, 2, 0, 0, 0, 0, 24,213,254, 2, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0,
+168,167,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 65, 1, 0, 0, 55, 5, 0, 0,173, 1, 0, 0, 69, 4, 0, 0, 1, 1,247, 3,153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,152,231,254, 2, 0, 0, 0, 0,152,231,254, 2, 0, 0, 0, 0,184,220,254, 2, 0, 0, 0, 0,
+120,226,254, 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, 68, 65, 84, 65, 40, 1, 0, 0,184,220,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 40,222,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0,192,125, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,246, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0,247, 3, 26, 0,247, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 65, 1, 0, 0, 55, 5, 0, 0,173, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+247, 3, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0, 40,222,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+152,223,254, 2, 0, 0, 0, 0,184,220,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0,
+ 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0,
+ 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 65, 1, 0, 0, 65, 1, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0,127, 2, 0, 0, 5, 0, 3, 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, 68, 65, 84, 65, 40, 1, 0, 0,152,223,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 8,225,254, 2, 0, 0, 0, 0, 40,222,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0,
+ 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0,
+ 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0,
+ 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 65, 1, 0, 0, 55, 5, 0, 0,199, 1, 0, 0,199, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0, 8,225,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+120,226,254, 2, 0, 0, 0, 0,152,223,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,108,196, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 35, 67, 0,128, 23,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,111, 2, 0, 0,
0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,111, 2, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 0, 6, 0,180, 0,112, 2,163, 0, 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 5, 0, 0,
- 55, 5, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
- 0, 0, 4, 0, 4, 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,
+ 18, 0, 0, 0, 6, 0,180, 0,112, 2,163, 0, 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 55, 5, 0, 0, 55, 5, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 4, 0, 4, 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, 68, 65, 84, 65, 40, 1, 0, 0,120,226,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8,225,254, 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,
- 68, 65, 84, 65,248, 0, 0, 0,240, 52, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,200, 51, 90, 10, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 65, 1, 0, 0, 55, 5, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+247, 3,127, 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, 65, 1, 0, 0, 55, 5, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,247, 3,127, 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, 24, 54, 90, 10, 68, 65, 84, 65, 72, 3, 0, 0, 24, 54, 90, 10,159, 0, 0, 0, 1, 0, 0, 0,
+232,227,254, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0,232,227,254, 2, 0, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0,
190, 35, 30, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 49,123, 61, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,111, 18,131,187, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,128, 0, 0,128, 63,
0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -3929,202 +4838,254 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,144, 57, 90, 10,160, 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, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 7, 0,208,245, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,
- 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,184, 58, 90, 10,
-200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136,101, 89, 10,224, 87, 89, 10, 96, 87, 89, 10,160, 89, 89, 10, 96, 89, 89, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0,173, 1, 0, 0, 69, 4, 0, 0, 3, 3, 64, 1,153, 2, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,152, 61, 90, 10,152, 61, 90, 10, 72, 59, 90, 10,112, 60, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 72, 59, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,112, 60, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 83, 67, 0, 0,200, 65, 0, 0, 83, 67,
- 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 64, 1, 26, 0, 64, 1,
- 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0,173, 1, 0, 0,198, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,112, 60, 90, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 72, 59, 90, 10, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,128,151, 67, 0, 64, 27,196, 0, 0, 0, 0, 47, 1, 0, 0, 64, 1, 0, 0, 18, 0, 0, 0,126, 2, 0, 0,
- 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 46, 1, 0, 0, 18, 0, 0, 0,126, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3,
- 0, 0, 0, 4, 6, 0, 64, 1,127, 2, 47, 1,109, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 1, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1,127, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0,152,231,254, 2, 0, 0, 0, 0,154, 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,
+ 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 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,
- 68, 65, 84, 65,252, 0, 0, 0,152, 61, 90, 10,169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0,
+ 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 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, 68, 65, 84, 65,160, 0, 0, 0, 40,233,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,200,219,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,
+168,167,254, 2, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0,
+173, 1, 0, 0, 69, 4, 0, 0, 3, 3, 64, 1,153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+248,236,254, 2, 0, 0, 0, 0,248,236,254, 2, 0, 0, 0, 0, 24,234,254, 2, 0, 0, 0, 0,136,235,254, 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,173, 79, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 12, 0, 0, 0, 0,173, 79, 9,224, 0, 0, 0,
- 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,192, 62, 90, 10, 68, 65, 84, 65,168, 0, 0, 0,192, 62, 90, 10,223, 0, 0, 0,
- 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16,228, 90, 10, 19, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 20, 0, 0, 0,
- 1, 0, 1, 0, 16,228, 90, 10, 21, 0, 1, 0, 1, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,243, 90, 10,
- 0, 0, 0, 0, 1, 0, 1, 0,152,250, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,240, 74, 92, 10, 0, 0, 0, 0, 1, 0, 1, 0,
- 40, 4, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,168, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0, 96,255, 90, 10, 0, 0, 0, 0,
- 1, 0, 1, 0,112,240, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,208,245, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,216,239, 90, 10,
- 21, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 83, 78, 0, 0,140, 0, 0, 0,248, 63, 90, 10,196, 0, 0, 0, 1, 0, 0, 0,
- 64,130, 90, 10,168, 85, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 83, 99,114,105,112,116,105,110,103, 0,103, 46, 48, 48,
- 49, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 64, 90, 10, 48, 68, 90, 10,112, 68, 90, 10,
-160, 74, 90, 10,232, 74, 90, 10, 88,124, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,176, 64, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,
-240, 64, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240, 64, 90, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 48, 65, 90, 10,176, 64, 90, 10, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 48, 65, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,112, 65, 90, 10,240, 64, 90, 10, 0, 0, 0, 0,118, 7, 97, 4,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,112, 65, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,176, 65, 90, 10, 48, 65, 90, 10,
- 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,176, 65, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,
-240, 65, 90, 10,112, 65, 90, 10, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240, 65, 90, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 48, 66, 90, 10,176, 65, 90, 10, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 48, 66, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,112, 66, 90, 10,240, 65, 90, 10, 0, 0, 0, 0,232, 5, 70, 4,
- 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,112, 66, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,176, 66, 90, 10, 48, 66, 90, 10,
- 0, 0, 0, 0,232, 5, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,176, 66, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,
-240, 66, 90, 10,112, 66, 90, 10, 0, 0, 0, 0, 0, 0,184, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240, 66, 90, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 48, 67, 90, 10,176, 66, 90, 10, 0, 0, 0, 0,232, 5,184, 1, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 48, 67, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,112, 67, 90, 10,240, 66, 90, 10, 0, 0, 0, 0,244, 2, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,112, 67, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,176, 67, 90, 10, 48, 67, 90, 10,
- 0, 0, 0, 0,244, 2,184, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,176, 67, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,
-240, 67, 90, 10,112, 67, 90, 10, 0, 0, 0, 0,232, 5, 44, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240, 67, 90, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 48, 68, 90, 10,176, 67, 90, 10, 0, 0, 0, 0,118, 7, 44, 3, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 48, 68, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240, 67, 90, 10, 0, 0, 0, 0,244, 2, 70, 4,
- 1, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112, 68, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,184, 68, 90, 10, 0, 0, 0, 0,
-240, 64, 90, 10, 48, 65, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184, 68, 90, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 0, 69, 90, 10,112, 68, 90, 10,240, 64, 90, 10,176, 65, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 0, 69, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 72, 69, 90, 10,184, 68, 90, 10, 48, 65, 90, 10,240, 65, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 72, 69, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,144, 69, 90, 10,
- 0, 69, 90, 10,176, 65, 90, 10,240, 65, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144, 69, 90, 10,
-198, 0, 0, 0, 1, 0, 0, 0,216, 69, 90, 10, 72, 69, 90, 10,240, 65, 90, 10, 48, 66, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,216, 69, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 32, 70, 90, 10,144, 69, 90, 10,112, 65, 90, 10,
-112, 66, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 32, 70, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
-104, 70, 90, 10,216, 69, 90, 10,176, 64, 90, 10,176, 66, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
-104, 70, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,176, 70, 90, 10, 32, 70, 90, 10,176, 65, 90, 10,176, 66, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,176, 70, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,248, 70, 90, 10,104, 70, 90, 10,
- 48, 66, 90, 10,240, 66, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,248, 70, 90, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 64, 71, 90, 10,176, 70, 90, 10,112, 66, 90, 10,240, 66, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 64, 71, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,136, 71, 90, 10,248, 70, 90, 10,176, 64, 90, 10, 48, 67, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,136, 71, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,208, 71, 90, 10,
- 64, 71, 90, 10,112, 66, 90, 10, 48, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208, 71, 90, 10,
-198, 0, 0, 0, 1, 0, 0, 0, 24, 72, 90, 10,136, 71, 90, 10,176, 66, 90, 10,112, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0, 24, 72, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 96, 72, 90, 10,208, 71, 90, 10,240, 66, 90, 10,
-112, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 96, 72, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
-168, 72, 90, 10, 24, 72, 90, 10, 48, 67, 90, 10,112, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
-168, 72, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,240, 72, 90, 10, 96, 72, 90, 10,112, 66, 90, 10,176, 67, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,240, 72, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 56, 73, 90, 10,168, 72, 90, 10,
- 48, 66, 90, 10,176, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56, 73, 90, 10,198, 0, 0, 0,
- 1, 0, 0, 0,128, 73, 90, 10,240, 72, 90, 10,240, 65, 90, 10,240, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,128, 73, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,200, 73, 90, 10, 56, 73, 90, 10,112, 65, 90, 10,240, 67, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,200, 73, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 16, 74, 90, 10,
-128, 73, 90, 10,176, 67, 90, 10,240, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16, 74, 90, 10,
-198, 0, 0, 0, 1, 0, 0, 0, 88, 74, 90, 10,200, 73, 90, 10,176, 65, 90, 10, 48, 68, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0, 88, 74, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,160, 74, 90, 10, 16, 74, 90, 10, 48, 66, 90, 10,
- 48, 68, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160, 74, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 88, 74, 90, 10,112, 67, 90, 10, 48, 68, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,
-232, 74, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,200, 77, 90, 10, 0, 0, 0, 0,176, 65, 90, 10,240, 64, 90, 10, 48, 65, 90, 10,
-240, 65, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0,
- 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,224,129, 90, 10,224,129, 90, 10,120, 75, 90, 10,160, 76, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120, 75, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
-160, 76, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68,
+ 68, 65, 84, 65, 40, 1, 0, 0, 24,234,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,136,235,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,160, 67,
0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65,
- 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7,
- 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0,
- 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 83, 67, 0, 0,200, 65,
+ 0, 0, 83, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 64, 1,
+ 26, 0, 64, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0,
+173, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 26, 0, 0, 0, 1, 0,
+ 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, 68, 65, 84, 65,248, 0, 0, 0,
-160, 76, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,120, 75, 90, 10, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 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, 63, 0, 0, 0, 64, 10, 0, 0, 0,
- 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 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, 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, 68, 65, 84, 65, 96, 0, 0, 0,200, 77, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,240, 98, 90, 10,232, 74, 90, 10,
-112, 66, 90, 10,176, 67, 90, 10,240, 67, 90, 10,112, 65, 90, 10, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,
- 43, 3, 0, 0, 4, 4,142, 1, 44, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 97, 90, 10,232, 97, 90, 10,
- 88, 78, 90, 10,128, 79, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
- 88, 78, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,128, 79, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0,199, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,141, 1, 0, 0, 0, 0, 0, 0,
- 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,142, 1, 31, 0,142, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-233, 5, 0, 0,118, 7, 0, 0, 13, 3, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-142, 1, 31, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128, 79, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88, 78, 90, 10,
- 0, 0, 0, 0, 0,128,198, 67, 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0,254,127,190, 67,254, 63, 67,196, 0, 0, 0, 0,
-125, 1, 0, 0,142, 1, 0, 0, 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0,126, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,142, 1, 13, 3,125, 1, 13, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 1, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 80, 90, 10,120, 96, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,168, 80, 90, 10,199, 0, 0, 0,
- 1, 0, 0, 0, 24, 82, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,
-111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,
-111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255,124, 1, 36, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 24, 82, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,136, 83, 90, 10,168, 80, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,136,235,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 24,234,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,151, 67,
+ 0, 64, 27,196, 0, 0, 0, 0, 47, 1, 0, 0, 64, 1, 0, 0, 18, 0, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 46, 1, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 46, 1, 0, 0, 18, 0, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 64, 1,
+127, 2, 47, 1,109, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0,
+199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1,127, 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, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255,124, 1, 61, 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, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 1, 0, 0,248,236,254, 2, 0, 0, 0, 0,163, 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, 3, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-136, 83, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,248, 84, 90, 10, 24, 82, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,
-114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255,
-124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 64, 1, 0, 0,248, 84, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,
-104, 86, 90, 10,136, 83, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
-105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
-105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254,124, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,238,254, 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, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0, 88,238,254, 2, 0, 0, 0, 0,
+217, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,184,238,254, 2, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,
+184,238,254, 2, 0, 0, 0, 0,216, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0,
+ 19, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0,
+ 21, 0, 1, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,168,211,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0, 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0,232,232,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0,232,226,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0, 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 21, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
+190, 0, 0, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 83, 99,114,105,112,116,105,110,103, 0,103, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,241,254, 2, 0, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0,
+ 40,248,254, 2, 0, 0, 0, 0,200, 1,255, 2, 0, 0, 0, 0, 56, 2,255, 2, 0, 0, 0, 0,120, 63,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 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, 68, 65, 84, 65, 32, 0, 0, 0,
+152,241,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 8,242,254, 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, 68, 65, 84, 65, 32, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,120,242,254, 2, 0, 0, 0, 0,152,241,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120,242,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+232,242,254, 2, 0, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,232,242,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0,
+120,242,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 88,243,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0,232,242,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+168,244,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 5, 70, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0,
+ 56,244,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 5, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 24,245,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232, 5,184, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+104,246,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0,
+248,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2,184, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+216,246,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232, 5, 44, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+118, 7, 44, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2, 70, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 40,248,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152,248,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0,120,242,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,152,248,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8,249,254, 2, 0, 0, 0, 0,
+ 40,248,254, 2, 0, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 8,249,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120,249,254, 2, 0, 0, 0, 0,
+152,248,254, 2, 0, 0, 0, 0,120,242,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,120,249,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232,249,254, 2, 0, 0, 0, 0,
+ 8,249,254, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,232,249,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88,250,254, 2, 0, 0, 0, 0,
+120,249,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 88,250,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200,250,254, 2, 0, 0, 0, 0,
+232,249,254, 2, 0, 0, 0, 0,232,242,254, 2, 0, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,200,250,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56,251,254, 2, 0, 0, 0, 0,
+ 88,250,254, 2, 0, 0, 0, 0,152,241,254, 2, 0, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 56,251,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168,251,254, 2, 0, 0, 0, 0,
+200,250,254, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,168,251,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24,252,254, 2, 0, 0, 0, 0,
+ 56,251,254, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 24,252,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136,252,254, 2, 0, 0, 0, 0,
+168,251,254, 2, 0, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,136,252,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248,252,254, 2, 0, 0, 0, 0,
+ 24,252,254, 2, 0, 0, 0, 0,152,241,254, 2, 0, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,248,252,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104,253,254, 2, 0, 0, 0, 0,
+136,252,254, 2, 0, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,104,253,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216,253,254, 2, 0, 0, 0, 0,
+248,252,254, 2, 0, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,216,253,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72,254,254, 2, 0, 0, 0, 0,
+104,253,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 72,254,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184,254,254, 2, 0, 0, 0, 0,
+216,253,254, 2, 0, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,184,254,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40,255,254, 2, 0, 0, 0, 0,
+ 72,254,254, 2, 0, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 40,255,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152,255,254, 2, 0, 0, 0, 0,
+184,254,254, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,152,255,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8, 0,255, 2, 0, 0, 0, 0,
+ 40,255,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 8, 0,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120, 0,255, 2, 0, 0, 0, 0,
+152,255,254, 2, 0, 0, 0, 0,232,242,254, 2, 0, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,120, 0,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232, 0,255, 2, 0, 0, 0, 0,
+ 8, 0,255, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,232, 0,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88, 1,255, 2, 0, 0, 0, 0,
+120, 0,255, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 88, 1,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200, 1,255, 2, 0, 0, 0, 0,
+232, 0,255, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,200, 1,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 88, 1,255, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0, 56, 2,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 8, 6,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0,120,242,254, 2, 0, 0, 0, 0,
+200,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0,
+ 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 70,255, 2, 0, 0, 0, 0,
+ 40, 70,255, 2, 0, 0, 0, 0, 40, 3,255, 2, 0, 0, 0, 0,152, 4,255, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+ 40, 3,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,152, 4,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+152, 4,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 3,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,
+112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,111, 7, 0, 0, 18, 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,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 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, 97, 4, 0, 0, 97, 4, 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, 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, 68, 65, 84, 65,160, 0, 0, 0,
+ 8, 6,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,152, 30,255, 2, 0, 0, 0, 0, 56, 2,255, 2, 0, 0, 0, 0,
+168,244,254, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0,232,242,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 43, 3, 0, 0, 4, 4,142, 1, 44, 3, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 29,255, 2, 0, 0, 0, 0, 88, 29,255, 2, 0, 0, 0, 0,
+248, 6,255, 2, 0, 0, 0, 0,104, 8,255, 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, 68, 65, 84, 65, 40, 1, 0, 0,248, 6,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,104, 8,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,199, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,141, 1, 0, 0,
+ 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,142, 1, 31, 0,142, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 13, 3, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,142, 1, 31, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104, 8,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 6,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,198, 67,
+ 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0,254,127,190, 67,254, 63, 67,196, 0, 0, 0, 0,125, 1, 0, 0,142, 1, 0, 0,
+ 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0,126, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,
+ 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
+ 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,142, 1, 13, 3,125, 1, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,142, 1, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+216, 9,255, 2, 0, 0, 0, 0,184, 27,255, 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, 68, 65, 84, 65, 88, 1, 0, 0,216, 9,255, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,120, 11,255, 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, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0,104, 86, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,216, 87, 90, 10,248, 84, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255,124, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 58,254,124, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,216, 87, 90, 10,
-199, 0, 0, 0, 1, 0, 0, 0, 72, 89, 90, 10,104, 86, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 68, 65, 84, 65, 88, 1, 0, 0,120, 11,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 24, 13,255, 2, 0, 0, 0, 0,
+216, 9,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255,124, 1, 61, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 13,255, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,184, 14,255, 2, 0, 0, 0, 0,120, 11,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 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,
+ 68, 65, 84, 65, 88, 1, 0, 0,184, 14,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 88, 16,255, 2, 0, 0, 0, 0,
+ 24, 13,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,
+110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254,124, 1,203, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 88, 16,255, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,248, 17,255, 2, 0, 0, 0, 0,184, 14,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254,124, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,248, 17,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,152, 19,255, 2, 0, 0, 0, 0,
+ 88, 16,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -4134,285 +5095,334 @@ char datatoc_startup_blend[]= {
20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 72, 89, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,184, 90, 90, 10,
-216, 87, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152, 19,255, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 56, 21,255, 2, 0, 0, 0, 0,248, 17,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,124, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 0, 0, 0, 0, 0,164,253,124, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,184, 90, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 40, 92, 90, 10, 72, 89, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 56, 21,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,216, 22,255, 2, 0, 0, 0, 0,
+152, 19,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 10,253,124, 1,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,253,124, 1,130, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 40, 92, 90, 10,199, 0, 0, 0,
- 1, 0, 0, 0,152, 93, 90, 10,184, 90, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,
-114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,
-114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 22,255, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,120, 24,255, 2, 0, 0, 0, 0, 56, 21,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,252,124, 1, 0, 0, 0, 0, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,152, 93, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 8, 95, 90, 10, 40, 92, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,252,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
- 8, 95, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,120, 96, 90, 10,152, 93, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,
-112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252,
-124, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,120, 24,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 24, 26,255, 2, 0, 0, 0, 0,
+216, 22,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111,
+ 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252,124, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,120, 96, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 8, 95, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 26,255, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,184, 27,255, 2, 0, 0, 0, 0,120, 24,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252,124, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,216, 0, 0, 0,232, 97, 90, 10,165, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,184, 27,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 24, 26,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252,124, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88, 29,255, 2, 0, 0, 0, 0,
+159, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,240, 98, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,
-184,103, 90, 10,200, 77, 90, 10, 48, 67, 90, 10,112, 67, 90, 10,240, 66, 90, 10,112, 66, 90, 10, 0, 0, 0, 0,245, 2, 0, 0,
-231, 5, 0, 0, 0, 0, 0, 0,183, 1, 0, 0, 18, 18,243, 2,184, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 24,102, 90, 10, 24,102, 90, 10,128, 99, 90, 10,168,100, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,128, 99, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,168,100, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0,192, 77, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 60, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-242, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,243, 2, 26, 0,243, 2, 26, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0,152, 30,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,248, 36,255, 2, 0, 0, 0, 0,
+ 8, 6,255, 2, 0, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0,
+168,244,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0, 0, 0, 0, 0,183, 1, 0, 0,
+ 18, 18,243, 2,184, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 35,255, 2, 0, 0, 0, 0,
+ 40, 35,255, 2, 0, 0, 0, 0,136, 31,255, 2, 0, 0, 0, 0,248, 32,255, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+136, 31,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,248, 32,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,192, 77, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 60, 68, 0, 0, 0, 0, 0, 0,208, 65,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168,100, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,128, 99, 90, 10, 0, 0, 0, 0, 0,128, 60, 68, 0, 0, 0, 0, 0, 0, 48, 65, 0, 0, 0, 0, 0,128, 56, 68,
- 0, 0, 0, 0, 0, 0,207, 67,226, 2, 0, 0,243, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,225, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,243, 2,
-158, 1,226, 2,158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0, 26, 0, 0, 0,
-183, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2,158, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,242, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,243, 2, 26, 0,243, 2, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 28, 0, 0, 0,
-208,101, 90, 10,180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,208,142, 85, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,208,142, 85, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,112, 1, 0, 0, 24,102, 90, 10,181, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 18, 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,
- 4, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,101, 90, 10,208,101, 90, 10, 62, 62, 62, 32,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+248, 32,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 31,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128, 60, 68, 0, 0, 0, 0, 0, 0, 48, 65, 0, 0, 0, 0, 0,128, 56, 68, 0, 0, 0, 0, 0, 0,207, 67,
+226, 2, 0, 0,243, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,225, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,243, 2,158, 1,226, 2,158, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0, 26, 0, 0, 0,183, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2,158, 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, 68, 65, 84, 65, 40, 0, 0, 0,
+104, 34,255, 2, 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 64, 0, 0, 0, 0, 0, 0, 0,216, 34,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,
+216, 34,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,136, 1, 0, 0, 40, 35,255, 2,
+ 0, 0, 0, 0,175, 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, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 34,255, 2,
+ 0, 0, 0, 0,104, 34,255, 2, 0, 0, 0, 0, 62, 62, 62, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,184,103, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,176,114, 90, 10,240, 98, 90, 10,
-112, 67, 90, 10, 48, 68, 90, 10, 48, 66, 90, 10,240, 66, 90, 10, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,185, 1, 0, 0,
- 69, 4, 0, 0, 1, 1,243, 2,141, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,113, 90, 10,136,113, 90, 10,
- 72,104, 90, 10,232,108, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
- 72,104, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,112,105, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,248, 36,255, 2,
+ 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 88, 50,255, 2, 0, 0, 0, 0,152, 30,255, 2, 0, 0, 0, 0,104,246,254, 2,
+ 0, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,185, 1, 0, 0, 69, 4, 0, 0, 1, 1,243, 2,141, 2, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 48,255, 2, 0, 0, 0, 0,200, 48,255, 2, 0, 0, 0, 0,232, 37,255, 2,
+ 0, 0, 0, 0,168, 43,255, 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, 68, 65, 84, 65, 40, 1, 0, 0,232, 37,255, 2, 0, 0, 0, 0,195, 0, 0, 0,
+ 1, 0, 0, 0, 88, 39,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0,
0, 0,208, 65, 0, 0, 0, 0, 0,192, 60, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242, 2, 0, 0, 0, 0, 0, 0,
25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
2, 0, 3, 3, 4, 0, 12, 4, 10, 0,243, 2, 26, 0,243, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-245, 2, 0, 0,231, 5, 0, 0,185, 1, 0, 0,210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-243, 2, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,112,105, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,152,106, 90, 10, 72,104, 90, 10,
- 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,
-143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,245, 2, 0, 0,211, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,115, 2, 0, 0, 5, 0, 3, 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, 68, 65, 84, 65,248, 0, 0, 0,152,106, 90, 10,201, 0, 0, 0,
- 1, 0, 0, 0,192,107, 90, 10,112,105, 90, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,
-231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,
-142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4,
- 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,
-211, 1, 0, 0,211, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0,
- 34, 0, 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, 68, 65, 84, 65,
-248, 0, 0, 0,192,107, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,232,108, 90, 10,152,106, 90, 10, 0, 0, 0, 0, 0, 0, 35, 67,
- 0,128,142,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0,
- 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0,
- 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,185, 1, 0, 0,210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,243, 2, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0, 88, 39,255, 2, 0, 0, 0, 0,195, 0, 0, 0,
+ 1, 0, 0, 0,200, 40,255, 2, 0, 0, 0, 0,232, 37,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,
+ 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,
+ 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0,
+ 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,245, 2, 0, 0,245, 2, 0, 0,211, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0,115, 2, 0, 0, 5, 0, 3, 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, 68, 65, 84, 65, 40, 1, 0, 0,200, 40,255, 2, 0, 0, 0, 0,195, 0, 0, 0,
+ 1, 0, 0, 0, 56, 42,255, 2, 0, 0, 0, 0, 88, 39,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194,
+ 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,
+119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,
+119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0,
+ 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,211, 1, 0, 0,211, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0, 56, 42,255, 2, 0, 0, 0, 0,195, 0, 0, 0,
+ 1, 0, 0, 0,168, 43,255, 2, 0, 0, 0, 0,200, 40,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,142,196,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,
+121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,
+121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0,
+ 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,231, 5, 0, 0,231, 5, 0, 0,211, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 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, 68, 65, 84, 65,248, 0, 0, 0,232,108, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
-192,107, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168, 43,255, 2, 0, 0, 0, 0,195, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 42,255, 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,245, 2, 0, 0,231, 5, 0, 0,211, 1, 0, 0, 69, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2,115, 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, 16,110, 90, 10, 68, 65, 84, 65, 72, 3, 0, 0, 16,110, 90, 10,
-159, 0, 0, 0, 1, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159,148,168, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,
-225,215,163,188, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62,
- 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,
-166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,
-248,209,213, 64, 0, 0,128, 63,180,157,229, 62,180,115, 7,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 12,148,130, 62,
- 9, 46,185, 62, 35, 44,185, 62,147,180,109,188, 27,227,150, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,132,111, 65,214,211,111, 65,116,234,191, 62,189,117, 85, 63,128, 32, 71,188, 0, 64,130,182,126, 42,156,190, 75,140, 22, 62,
-123,250, 45, 63, 0, 0, 2, 54,215,104, 25,196,135,132,135, 67, 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68,160, 87,135,195,
-205,209,166, 67,151,254, 71, 66, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62,
- 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-214,211,111,193, 0, 0,128, 63,180,157,229, 62,180,115, 7,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 12,148,130, 62,
- 9, 46,185, 62, 35, 44,185, 62,147,180,109,188, 27,227,150, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,132,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65,
- 0, 0, 0, 0, 0, 0, 0, 0,143,185, 30, 59, 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, 0,245, 2, 0, 0,231, 5, 0, 0,211, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,243, 2,115, 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, 24, 45,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 24, 45,255, 2, 0, 0, 0, 0,153, 0, 0, 0,
+ 1, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159,148,168, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,225,215,163,188,
+ 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190,
+ 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193,
+ 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63,
+ 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64,
+ 0, 0,128, 63,180,157,229, 62,180,115, 7,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 12,148,130, 62, 9, 46,185, 62,
+ 35, 44,185, 62,147,180,109,188, 27,227,150, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,
+214,211,111, 65,116,234,191, 62,189,117, 85, 63,128, 32, 71,188, 0, 64,130,182,126, 42,156,190, 75,140, 22, 62,123,250, 45, 63,
+ 0, 0, 2, 54,215,104, 25,196,135,132,135, 67, 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68,160, 87,135,195,205,209,166, 67,
+151,254, 71, 66, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190,
+ 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193,
+ 0, 0,128, 63,180,157,229, 62,180,115, 7,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 12,148,130, 62, 9, 46,185, 62,
+ 35, 44,185, 62,147,180,109,188, 27,227,150, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,
+214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0,
+ 0, 0, 0, 0,143,185, 30, 59, 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, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,136,113, 90, 10,160, 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, 51, 51, 51, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65,
- 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,208,245, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 96, 0, 0, 0,176,114, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,120,119, 90, 10,184,103, 90, 10,176, 64, 90, 10,176, 66, 90, 10,
-112, 67, 90, 10, 48, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0, 0, 0, 0, 0,183, 1, 0, 0, 18, 18,244, 2,
-184, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,117, 90, 10,216,117, 90, 10, 64,115, 90, 10,104,116, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 64,115, 90, 10,201, 0, 0, 0,
- 1, 0, 0, 0,104,116, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0,200, 48,255, 2, 0, 0, 0, 0,154, 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, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 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, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8,
+ 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 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, 68, 65, 84, 65,160, 0, 0, 0, 88, 50,255, 2, 0, 0, 0, 0,194, 0, 0, 0,
+ 1, 0, 0, 0,184, 56,255, 2, 0, 0, 0, 0,248, 36,255, 2, 0, 0, 0, 0,152,241,254, 2, 0, 0, 0, 0, 24,245,254, 2,
+ 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+243, 2, 0, 0, 0, 0, 0, 0,183, 1, 0, 0, 18, 18,244, 2,184, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,232, 54,255, 2, 0, 0, 0, 0,232, 54,255, 2, 0, 0, 0, 0, 72, 51,255, 2, 0, 0, 0, 0,184, 52,255, 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, 68, 65, 84, 65, 40, 1, 0, 0, 72, 51,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,184, 52,255, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
0, 0, 61, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68,
0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4,
- 10, 0,244, 2, 26, 0,244, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2, 26, 0, 0, 0, 1, 0,
- 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, 68, 65, 84, 65,
-248, 0, 0, 0,104,116, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64,115, 90, 10, 0, 0, 0, 0, 0,192, 60, 68,
- 0, 0, 0, 0, 0, 0, 65, 67, 0, 0, 0, 0, 0,192, 56, 68, 0, 0, 0, 0, 0, 0,207, 67,227, 2, 0, 0,244, 2, 0, 0,
- 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 2, 0, 0,
- 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 2, 2, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,244, 2,158, 1,227, 2,158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0, 26, 0, 0, 0,183, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,244, 2,158, 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,
+ 10, 0,244, 2, 26, 0,244, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+243, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2, 26, 0,
+ 0, 0, 1, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0,184, 52,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 72, 51,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 60, 68, 0, 0, 0, 0, 0, 0, 65, 67, 0, 0, 0, 0,
+ 0,192, 56, 68, 0, 0, 0, 0, 0, 0,207, 67,227, 2, 0, 0,244, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4,
+ 10, 0,244, 2,158, 1,227, 2,158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+243, 2, 0, 0, 26, 0, 0, 0,183, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2,158, 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, 68, 65, 84, 65, 28, 0, 0, 0,144,117, 90, 10,180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,112, 60, 44, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,
-112, 60, 44, 9, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,112, 1, 0, 0,216,117, 90, 10,181, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,144,117, 90, 10,144,117, 90, 10, 62, 62, 62, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40, 54,255, 2, 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,152, 54,255, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,152, 54,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,136, 1, 0, 0,232, 54,255, 2, 0, 0, 0, 0,175, 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, 18, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 40, 54,255, 2, 0, 0, 0, 0, 40, 54,255, 2, 0, 0, 0, 0, 62, 62, 62, 32, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,121,116,104,111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,120,119, 90, 10,
-200, 0, 0, 0, 1, 0, 0, 0, 88,124, 90, 10,176,114, 90, 10,176, 67, 90, 10, 48, 66, 90, 10,240, 65, 90, 10,240, 67, 90, 10,
- 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 45, 3, 0, 0, 69, 4, 0, 0, 3, 3,142, 1, 25, 1, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 88,122, 90, 10, 88,122, 90, 10, 8,120, 90, 10, 48,121, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 8,120, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 48,121, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,199, 67, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,141, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,149, 67, 0, 0,200, 65, 0,128,149, 67,
- 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,142, 1, 26, 0,142, 1,
- 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 45, 3, 0, 0, 70, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,121,116,104,111,110, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0,184, 56,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,120, 63,255, 2, 0, 0, 0, 0,
+ 88, 50,255, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0,
+ 72,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 45, 3, 0, 0, 69, 4, 0, 0,
+ 3, 3,142, 1, 25, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 60,255, 2, 0, 0, 0, 0,
+136, 60,255, 2, 0, 0, 0, 0,168, 57,255, 2, 0, 0, 0, 0, 24, 59,255, 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, 68, 65, 84, 65, 40, 1, 0, 0,
+168, 57,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 24, 59,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,199, 67, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,141, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,149, 67, 0, 0,200, 65, 0,128,149, 67, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,142, 1, 26, 0,142, 1, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 45, 3, 0, 0, 70, 3, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 1, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0, 48,121, 90, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8,120, 90, 10, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,128,190, 67, 0, 0,109,195, 0, 0, 0, 0,125, 1, 0, 0,142, 1, 0, 0, 18, 0, 0, 0,254, 0, 0, 0,
- 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 18, 0, 0, 0,254, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3,
- 0, 0, 0, 4, 6, 0,142, 1,255, 0,125, 1,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,
-118, 7, 0, 0, 71, 3, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 1,255, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+ 24, 59,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 57,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,190, 67, 0, 0,109,195, 0, 0, 0, 0,
+125, 1, 0, 0,142, 1, 0, 0, 18, 0, 0, 0,254, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 18, 0, 0, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,142, 1,255, 0,125, 1,237, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 71, 3, 0, 0, 69, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 1,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,252, 0, 0, 0, 88,122, 90, 10,169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 1, 0, 0,
+136, 60,255, 2, 0, 0, 0, 0,163, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 16, 55, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 12, 0, 0, 0,184, 16, 55, 10,224, 0, 0, 0,
- 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,128,123, 90, 10, 68, 65, 84, 65,168, 0, 0, 0,128,123, 90, 10,223, 0, 0, 0,
- 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16,228, 90, 10, 19, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 20, 0, 0, 0,
- 1, 0, 1, 0, 16,228, 90, 10, 21, 0, 1, 0, 1, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,243, 90, 10,
- 0, 0, 0, 0, 1, 0, 1, 0,152,250, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,240, 74, 92, 10, 0, 0, 0, 0, 1, 0, 1, 0,
- 40, 4, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,168, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0, 96,255, 90, 10, 0, 0, 0, 0,
- 1, 0, 1, 0,112,240, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,208,245, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,216,239, 90, 10,
- 21, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 68, 65, 84, 65, 96, 0, 0, 0, 88,124, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,120,119, 90, 10,176, 66, 90, 10,176, 65, 90, 10, 48, 68, 90, 10,112, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
-243, 2, 0, 0,185, 1, 0, 0, 69, 4, 0, 0, 9, 9,244, 2,141, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 56,127, 90, 10, 56,127, 90, 10,232,124, 90, 10, 16,126, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,232,124, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 16,126, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,210, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 61, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-243, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,244, 2, 26, 0,244, 2, 26, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,185, 1, 0, 0,210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,244, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232, 61,255, 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, 68, 65, 84, 65,248, 0, 0, 0, 16,126, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,232,124, 90, 10, 0, 0, 0, 0, 0,224,189, 68, 0, 0, 0, 0, 0,192, 22, 68,248,150, 23, 68, 8, 41,100, 68,
+ 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,232, 61,255, 2, 0, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0,
+ 14, 0, 0, 0, 14, 0, 0, 0, 72, 62,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, 72, 62,255, 2, 0, 0, 0, 0,
+216, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0,
+232,190,255, 2, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 21, 0, 1, 0, 1, 0, 0, 0,
+232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,168,211,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+ 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,152, 49, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+232,232,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,200,142, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+232,226,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 40,207,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+ 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 88,206,255, 2, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 1, 0,
+232,190,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,120, 63,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,184, 56,255, 2, 0, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0,
+184,247,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,
+185, 1, 0, 0, 69, 4, 0, 0, 9, 9,244, 2,141, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 72, 67,255, 2, 0, 0, 0, 0, 72, 67,255, 2, 0, 0, 0, 0,104, 64,255, 2, 0, 0, 0, 0,216, 65,255, 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,
+ 68, 65, 84, 65, 40, 1, 0, 0,104, 64,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,216, 65,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,210, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 61, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65,
+ 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,244, 2,
+ 26, 0,244, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,
+185, 1, 0, 0,210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2, 26, 0, 0, 0, 1, 0,
+ 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,
+ 68, 65, 84, 65, 40, 1, 0, 0,216, 65,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+104, 64,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,189, 68, 0, 0, 0, 0, 0,192, 22, 68,248,150, 23, 68, 8, 41,100, 68,
120,125, 46, 67, 68, 65,214, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0, 0, 0, 0, 0,114, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 4, 10, 0,244, 2,
-115, 2,244, 2,115, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,211, 1, 0, 0,
- 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2,115, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+115, 2,244, 2,115, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,
+211, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2,115, 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, 68, 65, 84, 65,124, 2, 0, 0,
- 56,127, 90, 10,172, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,152, 2, 0, 0, 72, 67,255, 2, 0, 0, 0, 0,166, 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, 9, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0,
0, 0, 0, 0, 12, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,
231, 1, 0, 0,243, 1, 0, 0,122, 1, 0, 0,124, 1, 0, 0,231, 1, 0, 0,243, 1, 0, 0, 4, 0, 0, 0,124, 1, 0, 0,
@@ -4432,106 +5442,128 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,140, 0, 0, 0, 64,130, 90, 10,196, 0, 0, 0, 1, 0, 0, 0,232,191, 90, 10,
-248, 63, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 85, 86, 32, 69,100,105,116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,130, 90, 10,184,132, 90, 10,248,132, 90, 10,200,135, 90, 10,
- 16,136, 90, 10,176,177, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,248,130, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 56,131, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 56,131, 90, 10,197, 0, 0, 0,
- 1, 0, 0, 0,120,131, 90, 10,248,130, 90, 10, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,
-120,131, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,184,131, 90, 10, 56,131, 90, 10, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0,
- 68, 65, 84, 65, 20, 0, 0, 0,184,131, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,248,131, 90, 10,120,131, 90, 10, 0, 0, 0, 0,
-118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,248,131, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 56,132, 90, 10,
-184,131, 90, 10, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 56,132, 90, 10,197, 0, 0, 0,
- 1, 0, 0, 0,120,132, 90, 10,248,131, 90, 10, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,
-120,132, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,184,132, 90, 10, 56,132, 90, 10, 0, 0, 0, 0,196, 3, 70, 4, 1, 0, 0, 0,
- 68, 65, 84, 65, 20, 0, 0, 0,184,132, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,120,132, 90, 10, 0, 0, 0, 0,
-196, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,248,132, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 64,133, 90, 10,
- 0, 0, 0, 0, 56,131, 90, 10,120,131, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 64,133, 90, 10,
-198, 0, 0, 0, 1, 0, 0, 0,136,133, 90, 10,248,132, 90, 10, 56,131, 90, 10,248,131, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,136,133, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,208,133, 90, 10, 64,133, 90, 10,120,131, 90, 10,
- 56,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208,133, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 24,134, 90, 10,136,133, 90, 10,248,131, 90, 10, 56,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 24,134, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 96,134, 90, 10,208,133, 90, 10,248,131, 90, 10,120,132, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 96,134, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,168,134, 90, 10, 24,134, 90, 10,
-248,130, 90, 10,184,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,168,134, 90, 10,198, 0, 0, 0,
- 1, 0, 0, 0,240,134, 90, 10, 96,134, 90, 10,248,130, 90, 10,248,131, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,240,134, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 56,135, 90, 10,168,134, 90, 10,120,132, 90, 10,184,132, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56,135, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,128,135, 90, 10,
-240,134, 90, 10, 56,132, 90, 10,120,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,128,135, 90, 10,
-198, 0, 0, 0, 1, 0, 0, 0,200,135, 90, 10, 56,135, 90, 10,184,131, 90, 10,184,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,200,135, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128,135, 90, 10,184,131, 90, 10,
- 56,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 16,136, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,
-240,138, 90, 10, 0, 0, 0, 0,248,131, 90, 10, 56,131, 90, 10,120,131, 90, 10, 56,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
-118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,
-136,191, 90, 10,136,191, 90, 10,160,136, 90, 10,200,137, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,160,136, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,200,137, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
+190, 0, 0, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 85, 86, 32, 69,100,105,116,105,110,103, 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,216, 71,255, 2, 0, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0,
+ 88, 75,255, 2, 0, 0, 0, 0,184, 79,255, 2, 0, 0, 0, 0, 40, 80,255, 2, 0, 0, 0, 0, 72,124,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 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,
-118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+216, 71,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 72, 72,255, 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, 68, 65, 84, 65, 32, 0, 0, 0, 72, 72,255, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,184, 72,255, 2, 0, 0, 0, 0,216, 71,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184, 72,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 40, 73,255, 2, 0, 0, 0, 0, 72, 72,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0, 40, 73,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,152, 73,255, 2, 0, 0, 0, 0,
+184, 72,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+152, 73,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 40, 73,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0,152, 73,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+232, 74,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196, 3, 70, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+120, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 88, 75,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200, 75,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 72, 72,255, 2, 0, 0, 0, 0,184, 72,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+200, 75,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56, 76,255, 2, 0, 0, 0, 0, 88, 75,255, 2, 0, 0, 0, 0,
+ 72, 72,255, 2, 0, 0, 0, 0,152, 73,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 56, 76,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168, 76,255, 2, 0, 0, 0, 0,200, 75,255, 2, 0, 0, 0, 0,
+184, 72,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+168, 76,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24, 77,255, 2, 0, 0, 0, 0, 56, 76,255, 2, 0, 0, 0, 0,
+152, 73,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 24, 77,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136, 77,255, 2, 0, 0, 0, 0,168, 76,255, 2, 0, 0, 0, 0,
+152, 73,255, 2, 0, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+136, 77,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248, 77,255, 2, 0, 0, 0, 0, 24, 77,255, 2, 0, 0, 0, 0,
+216, 71,255, 2, 0, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+248, 77,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104, 78,255, 2, 0, 0, 0, 0,136, 77,255, 2, 0, 0, 0, 0,
+216, 71,255, 2, 0, 0, 0, 0,152, 73,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+104, 78,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216, 78,255, 2, 0, 0, 0, 0,248, 77,255, 2, 0, 0, 0, 0,
+120, 74,255, 2, 0, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+216, 78,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72, 79,255, 2, 0, 0, 0, 0,104, 78,255, 2, 0, 0, 0, 0,
+ 8, 74,255, 2, 0, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 72, 79,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184, 79,255, 2, 0, 0, 0, 0,216, 78,255, 2, 0, 0, 0, 0,
+ 40, 73,255, 2, 0, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+184, 79,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 79,255, 2, 0, 0, 0, 0,
+ 40, 73,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+ 40, 80,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,248, 83,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+152, 73,255, 2, 0, 0, 0, 0, 72, 72,255, 2, 0, 0, 0, 0,184, 72,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,140,255, 2, 0, 0, 0, 0,232,140,255, 2, 0, 0, 0, 0,
+ 24, 81,255, 2, 0, 0, 0, 0,136, 82,255, 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, 68, 65, 84, 65, 40, 1, 0, 0, 24, 81,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,136, 82,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,200,137, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,160,136, 90, 10, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69,
- 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 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, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7,
- 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0,
- 97, 4, 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, 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, 68, 65, 84, 65, 96, 0, 0, 0,
-240,138, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,176,177, 90, 10, 16,136, 90, 10,248,130, 90, 10,248,131, 90, 10,120,132, 90, 10,
-184,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,195, 3, 0, 0, 0, 0, 0, 0, 69, 4, 0, 0, 6, 6,196, 3, 70, 4, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,144, 90, 10,104,144, 90, 10,128,139, 90, 10, 64,143, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128,139, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
-168,140, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,113, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 41, 68, 0, 0,200, 65,
- 0,192, 41, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,196, 3,
- 26, 0,196, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 3, 0, 0, 0, 0, 0, 0,
- 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196, 3, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,
-168,140, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 64,143, 90, 10,128,139, 90, 10, 0, 0, 0, 0, 0, 0, 91, 67, 0, 96,133,196,
- 0, 0, 0, 0, 0, 0, 0, 0,254,255, 74, 67,254,127,133,196, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,
- 43, 4, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,
- 43, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0,
- 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0, 44, 4,203, 0, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136, 82,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 81,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69,
+ 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0,
+ 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0,
+ 18, 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,128, 63, 0, 0,128, 63,
+ 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 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, 97, 4, 0, 0, 97, 4, 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, 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, 68, 65, 84, 65,160, 0, 0, 0,248, 83,255, 2, 0, 0, 0, 0,
+194, 0, 0, 0, 1, 0, 0, 0, 72,124,255, 2, 0, 0, 0, 0, 40, 80,255, 2, 0, 0, 0, 0,216, 71,255, 2, 0, 0, 0, 0,
+152, 73,255, 2, 0, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,195, 3, 0, 0, 0, 0, 0, 0, 69, 4, 0, 0, 6, 6,196, 3, 70, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,216, 90,255, 2, 0, 0, 0, 0,216, 90,255, 2, 0, 0, 0, 0,232, 84,255, 2, 0, 0, 0, 0,
+104, 89,255, 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, 68, 65, 84, 65, 40, 1, 0, 0,232, 84,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 88, 86,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0,113, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0,192, 41, 68, 0, 0,200, 65, 0,192, 41, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0,196, 3, 26, 0,196, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,195, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+196, 3, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0, 88, 86,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+104, 89,255, 2, 0, 0, 0, 0,232, 84,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 67, 0, 96,133,196, 0, 0, 0, 0,
+ 0, 0, 0, 0,254,255, 74, 67,254,127,133,196, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, 43, 4, 0, 0,
+ 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 43, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0,
+ 18, 0, 0, 4, 6, 0,220, 0, 44, 4,203, 0, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
220, 0, 44, 4, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,141, 90, 10,208,141, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,208,141, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 73, 77, 65, 71, 69, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 87,255, 2, 0, 0, 0, 0,
+200, 87,255, 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, 68, 65, 84, 65, 88, 1, 0, 0,200, 87,255, 2, 0, 0, 0, 0,193, 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, 73, 77, 65, 71, 69, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0,
+ 73, 77, 65, 71, 69, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 71,114,101, 97,115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 73, 77, 65, 71, 69, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,174,255,202, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 71,114,101, 97,115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,174,255,202, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
- 64,143, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,168,140, 90, 10, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0,
- 0, 0,128, 67,154,153, 41,191,205,204,212, 63,154,153,149,191,205,204, 10, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 2, 0, 0, 0, 0, 0, 0,
- 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-220, 0, 0, 0,195, 3, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-232, 2, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+104, 89,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 86,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,154,153, 41,191,205,204,212, 63,154,153,149,191,205,204, 10, 64,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 33, 0, 0,104,144, 90, 10,170, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 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, 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,160, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65, 0, 0, 0, 0,154,153,153, 62,
- 0, 0, 0, 0,100, 0, 0, 0,154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,232, 2, 0, 0, 0, 0, 0, 0, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0,195, 3, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 2, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 33, 0, 0,
+216, 90,255, 2, 0, 0, 0, 0,164, 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, 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,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 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,240, 65,
+ 0, 0, 0, 0,154,153,153, 62, 0, 0, 0, 0,100, 0, 0, 0,154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -4657,11 +5689,11 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,100, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -4787,92 +5819,110 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,176,177, 90, 10,200, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0,240,138, 90, 10,184,132, 90, 10,120,132, 90, 10, 56,132, 90, 10,184,131, 90, 10, 0, 0, 0, 0,
-197, 3, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 69, 4, 0, 0, 1, 1,178, 3, 70, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 96,190, 90, 10, 96,190, 90, 10, 64,178, 90, 10,192,185, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 64,178, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,104,179, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,108, 68, 0, 0, 0, 0, 0, 0,208, 65,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,177, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,178, 3, 26, 0,178, 3, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,178, 3, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,104,179, 90, 10,201, 0, 0, 0,
- 1, 0, 0, 0, 0,182, 90, 10, 64,178, 90, 10, 0, 0, 0, 0, 0, 0, 32, 67, 0, 0,109,196, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 15, 67, 0, 0,109,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,179, 3, 0, 0, 0, 0, 0, 0,
-142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,179, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4,
- 6, 0,160, 0,180, 3,143, 0,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,100, 4, 0, 0,
-146, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,180, 3, 0, 0, 5, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,144,180, 90, 10,144,180, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,144,180, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 79, 98,106,101, 99,116, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+ 72,124,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 83,255, 2, 0, 0, 0, 0,
+232, 74,255, 2, 0, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 40, 73,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 69, 4, 0, 0, 1, 1,178, 3, 70, 4, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,139,255, 2, 0, 0, 0, 0, 88,139,255, 2, 0, 0, 0, 0,
+ 56,125,255, 2, 0, 0, 0, 0, 56,134,255, 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, 68, 65, 84, 65, 40, 1, 0, 0, 56,125,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,168,126,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,108, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177, 3, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,178, 3, 26, 0,178, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,178, 3, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0,168,126,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,184,129,255, 2, 0, 0, 0, 0, 56,125,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 67,
+ 0, 0,109,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 0,109,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0,
+ 0, 0, 0, 0,179, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
+ 0, 0, 0, 0,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
+ 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,180, 3,143, 0,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,100, 4, 0, 0,146, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,160, 0,180, 3, 0, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 24,128,255, 2, 0, 0, 0, 0, 24,128,255, 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, 68, 65, 84, 65, 88, 1, 0, 0, 24,128,255, 2, 0, 0, 0, 0,
+193, 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, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,
+100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,
+100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,254,143, 0,190, 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,
+ 68, 65, 84, 65, 40, 1, 0, 0,184,129,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,200,132,255, 2, 0, 0, 0, 0,
+168,126,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0,242,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67,
+ 91, 90,242,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,
+120, 0,143, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,100, 4, 0, 0,
+ 26, 0, 0, 0,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,120, 0, 0, 0, 6, 0,
+ 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,131,255, 2, 0, 0, 0, 0, 40,131,255, 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, 42,254,143, 0,190, 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,
+ 68, 65, 84, 65, 88, 1, 0, 0, 40,131,255, 2, 0, 0, 0, 0,193, 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, 86, 73, 69, 87, 51, 68, 95, 80,
+ 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
+ 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,101,114, 97,116,111,114,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,144, 0, 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, 68, 65, 84, 65,248, 0, 0, 0, 0,182, 90, 10,201, 0, 0, 0,
- 1, 0, 0, 0,152,184, 90, 10,104,179, 90, 10, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0,242,194, 0, 0, 0, 0, 0, 0, 0, 0,
-231,102, 16, 67, 91, 90,242,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,
-142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4,
- 6, 0,160, 0,120, 0,143, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,100, 4, 0, 0,
- 26, 0, 0, 0,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,120, 0, 0, 0, 6, 0,
- 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 40,183, 90, 10, 40,183, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0, 40,183, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 79,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,132,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 56,134,255, 2, 0, 0, 0, 0,184,129,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67,
+ 0,128,126,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67,255,191,126,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0,
+ 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0,
+ 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
+ 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0, 13, 4,163, 0,251, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 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,216,255,144, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0, 56,134,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,132,255, 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, 68, 65, 84, 65,248, 0, 0, 0,152,184, 90, 10,201, 0, 0, 0,
- 1, 0, 0, 0,192,185, 90, 10, 0,182, 90, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,126,196, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 35, 67,255,191,126,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0,
-162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0,
- 6, 0,180, 0, 13, 4,163, 0,251, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,118, 7, 0, 0,
- 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0,
- 4, 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, 68, 65, 84, 65,
-248, 0, 0, 0,192,185, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,152,184, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,101, 4, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 18, 3, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,101, 4, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 18, 3, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,232,186, 90, 10, 68, 65, 84, 65, 72, 3, 0, 0,232,186, 90, 10,159, 0, 0, 0, 1, 0, 0, 0,161, 58,190, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 28, 13,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 74,215, 76,190, 0, 0, 0, 0, 68,239,209, 62,
- 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,
-166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 95,192, 0, 0,128, 63, 69,239,209, 62,
- 70,119,105, 63,160, 84, 89,188, 0, 0, 0, 0, 52,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63,
- 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,188,173, 54, 64,136, 95,161,191,147,231,198, 63, 0, 0,128, 63,169,255, 27, 63,
-208,249,224,190, 48,180, 81,191,184,158, 81,191,254,123,173, 63,140,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62,150,126,161,188,
-206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,100, 98, 82, 64, 0, 25, 95, 64, 97, 66,141, 62,
-204, 23, 29, 63,192, 60, 18,188, 0, 0, 96,179,195, 15,188,190,130, 75, 53, 62,216,125, 81, 63, 0, 0,192,179,115, 77,100,193,
- 16,173,201, 64,181,148,248,192,203,247,159,192,233, 74, 87, 65,246, 46,190,192, 88,106,234, 64, 45, 8,160, 64, 68,239,209, 62,
- 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,
-166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 95,192, 0, 0,128, 63,169,255, 27, 63,
-208,249,224,190, 48,180, 81,191,184,158, 81,191,254,123,173, 63,140,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62,150,126,161,188,
-206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,100, 98, 82, 64, 0, 25, 95, 64, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,168,135,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0,168,135,255, 2, 0, 0, 0, 0,
+153, 0, 0, 0, 1, 0, 0, 0,161, 58,190, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 13,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 74,215, 76,190, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62,
+ 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 25, 95,192, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,160, 84, 89,188, 0, 0, 0, 0, 52,177,205,190,142, 74, 70, 62,
+166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,188,173, 54, 64,136, 95,161,191,
+147,231,198, 63, 0, 0,128, 63,169,255, 27, 63,208,249,224,190, 48,180, 81,191,184,158, 81,191,254,123,173, 63,140,225, 88, 62,
+ 26, 63,185, 62, 35, 44,185, 62,150,126,161,188,206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,
+100, 98, 82, 64, 0, 25, 95, 64, 97, 66,141, 62,204, 23, 29, 63,192, 60, 18,188, 0, 0, 96,179,195, 15,188,190,130, 75, 53, 62,
+216,125, 81, 63, 0, 0,192,179,115, 77,100,193, 16,173,201, 64,181,148,248,192,203,247,159,192,233, 74, 87, 65,246, 46,190,192,
+ 88,106,234, 64, 45, 8,160, 64, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62,
+ 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 25, 95,192, 0, 0,128, 63,169,255, 27, 63,208,249,224,190, 48,180, 81,191,184,158, 81,191,254,123,173, 63,140,225, 88, 62,
+ 26, 63,185, 62, 35, 44,185, 62,150,126,161,188,206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,
+100, 98, 82, 64, 0, 25, 95, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63,
- 56,186,224,190,237,203,148,190, 3,236,234,190, 0, 25, 95, 64, 0, 25, 95, 64, 0, 0, 0, 0, 0, 0, 0, 0, 18,106,224, 58,
- 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, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 0, 25, 95, 64, 0, 25, 95, 64,
+ 0, 0, 0, 0, 0, 0, 0, 0, 18,106,224, 58, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -4880,494 +5930,608 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 96,190, 90, 10,160, 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,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0, 88,139,255, 2, 0, 0, 0, 0,
+154, 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, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,
-208,245, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 1, 0, 0, 0,
- 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
-205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,140, 0, 0, 0,232,191, 90, 10,196, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 64,130, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 86,105,100,101,111, 32, 69,100,105,116,
-105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,192, 90, 10, 96,195, 90, 10,
-160,195, 90, 10,104,200, 90, 10,176,200, 90, 10,120,221, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160,192, 90, 10,197, 0, 0, 0,
- 1, 0, 0, 0,224,192, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,
-224,192, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 32,193, 90, 10,160,192, 90, 10, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0,
- 68, 65, 84, 65, 20, 0, 0, 0, 32,193, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 96,193, 90, 10,224,192, 90, 10, 0, 0, 0, 0,
-118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,193, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,160,193, 90, 10,
- 32,193, 90, 10, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160,193, 90, 10,197, 0, 0, 0,
- 1, 0, 0, 0,224,193, 90, 10, 96,193, 90, 10, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,
-224,193, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 32,194, 90, 10,160,193, 90, 10, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0,
- 68, 65, 84, 65, 20, 0, 0, 0, 32,194, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 96,194, 90, 10,224,193, 90, 10, 0, 0, 0, 0,
-118, 7, 16, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,194, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,160,194, 90, 10,
- 32,194, 90, 10, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160,194, 90, 10,197, 0, 0, 0,
- 1, 0, 0, 0,224,194, 90, 10, 96,194, 90, 10, 0, 0, 0, 0, 76, 3, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,
-224,194, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 32,195, 90, 10,160,194, 90, 10, 0, 0, 0, 0, 0, 0, 16, 2, 0, 0, 0, 0,
- 68, 65, 84, 65, 20, 0, 0, 0, 32,195, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 96,195, 90, 10,224,194, 90, 10, 0, 0, 0, 0,
- 76, 3, 16, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,195, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 32,195, 90, 10, 0, 0, 0, 0,118, 7,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160,195, 90, 10,198, 0, 0, 0,
- 1, 0, 0, 0,232,195, 90, 10, 0, 0, 0, 0,224,192, 90, 10, 32,193, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,232,195, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 48,196, 90, 10,160,195, 90, 10,224,192, 90, 10,160,193, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 48,196, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,120,196, 90, 10,
-232,195, 90, 10, 32,193, 90, 10,224,193, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120,196, 90, 10,
-198, 0, 0, 0, 1, 0, 0, 0,192,196, 90, 10, 48,196, 90, 10,160,193, 90, 10,224,193, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,192,196, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 8,197, 90, 10,120,196, 90, 10,224,193, 90, 10,
- 32,194, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 8,197, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 80,197, 90, 10,192,196, 90, 10,160,192, 90, 10, 96,194, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 80,197, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,152,197, 90, 10, 8,197, 90, 10,160,193, 90, 10,160,194, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,152,197, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,224,197, 90, 10, 80,197, 90, 10,
- 96,194, 90, 10,224,194, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,224,197, 90, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 40,198, 90, 10,152,197, 90, 10,224,194, 90, 10, 32,195, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 40,198, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,112,198, 90, 10,224,197, 90, 10,160,194, 90, 10, 32,195, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112,198, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,184,198, 90, 10,
- 40,198, 90, 10, 32,194, 90, 10, 96,195, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184,198, 90, 10,
-198, 0, 0, 0, 1, 0, 0, 0, 0,199, 90, 10,112,198, 90, 10, 96,193, 90, 10, 96,195, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0, 0,199, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 72,199, 90, 10,184,198, 90, 10, 96,194, 90, 10,
- 96,195, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 72,199, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
-144,199, 90, 10, 0,199, 90, 10,160,192, 90, 10, 96,193, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
-144,199, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,216,199, 90, 10, 72,199, 90, 10,224,193, 90, 10,160,194, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216,199, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 32,200, 90, 10,144,199, 90, 10,
- 32,194, 90, 10, 32,195, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 32,200, 90, 10,198, 0, 0, 0,
- 1, 0, 0, 0,104,200, 90, 10,216,199, 90, 10,160,193, 90, 10,224,194, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,104,200, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32,200, 90, 10, 32,194, 90, 10,224,194, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,176,200, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,144,203, 90, 10,
- 0, 0, 0, 0,160,193, 90, 10,224,192, 90, 10, 32,193, 90, 10,224,193, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,
- 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,176,227, 90, 10,
-176,227, 90, 10, 64,201, 90, 10,104,202, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0, 64,201, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,104,202, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68,
+ 72,214,255, 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, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0,
+ 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 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, 83, 78, 0, 0,208, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
+190, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 86,105,100,101,111, 32, 69,100,105,116,105,110,103, 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,152,142,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0,
+216,147,255, 2, 0, 0, 0, 0, 72,155,255, 2, 0, 0, 0, 0,184,155,255, 2, 0, 0, 0, 0,104,182,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 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, 68, 65, 84, 65, 32, 0, 0, 0,
+152,142,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 8,143,255, 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, 68, 65, 84, 65, 32, 0, 0, 0, 8,143,255, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,120,143,255, 2, 0, 0, 0, 0,152,142,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120,143,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+232,143,255, 2, 0, 0, 0, 0, 8,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,232,143,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 88,144,255, 2, 0, 0, 0, 0,
+120,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 88,144,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0,232,143,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0, 56,145,255, 2, 0, 0, 0, 0, 88,144,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,145,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+168,145,255, 2, 0, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 16, 2, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,168,145,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 24,146,255, 2, 0, 0, 0, 0,
+ 56,145,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 24,146,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0,168,145,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 76, 3, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 24,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 16, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+104,147,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 3, 16, 2, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+248,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+216,147,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72,148,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8,143,255, 2, 0, 0, 0, 0,120,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 72,148,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184,148,255, 2, 0, 0, 0, 0,216,147,255, 2, 0, 0, 0, 0,
+ 8,143,255, 2, 0, 0, 0, 0, 88,144,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+184,148,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40,149,255, 2, 0, 0, 0, 0, 72,148,255, 2, 0, 0, 0, 0,
+120,143,255, 2, 0, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 40,149,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152,149,255, 2, 0, 0, 0, 0,184,148,255, 2, 0, 0, 0, 0,
+ 88,144,255, 2, 0, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+152,149,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8,150,255, 2, 0, 0, 0, 0, 40,149,255, 2, 0, 0, 0, 0,
+200,144,255, 2, 0, 0, 0, 0, 56,145,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 8,150,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120,150,255, 2, 0, 0, 0, 0,152,149,255, 2, 0, 0, 0, 0,
+152,142,255, 2, 0, 0, 0, 0,168,145,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+120,150,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232,150,255, 2, 0, 0, 0, 0, 8,150,255, 2, 0, 0, 0, 0,
+ 88,144,255, 2, 0, 0, 0, 0, 24,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+232,150,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88,151,255, 2, 0, 0, 0, 0,120,150,255, 2, 0, 0, 0, 0,
+168,145,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 88,151,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200,151,255, 2, 0, 0, 0, 0,232,150,255, 2, 0, 0, 0, 0,
+136,146,255, 2, 0, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+200,151,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56,152,255, 2, 0, 0, 0, 0, 88,151,255, 2, 0, 0, 0, 0,
+ 24,146,255, 2, 0, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 56,152,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168,152,255, 2, 0, 0, 0, 0,200,151,255, 2, 0, 0, 0, 0,
+ 56,145,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+168,152,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24,153,255, 2, 0, 0, 0, 0, 56,152,255, 2, 0, 0, 0, 0,
+232,143,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 24,153,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136,153,255, 2, 0, 0, 0, 0,168,152,255, 2, 0, 0, 0, 0,
+168,145,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+136,153,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248,153,255, 2, 0, 0, 0, 0, 24,153,255, 2, 0, 0, 0, 0,
+152,142,255, 2, 0, 0, 0, 0,232,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+248,153,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104,154,255, 2, 0, 0, 0, 0,136,153,255, 2, 0, 0, 0, 0,
+200,144,255, 2, 0, 0, 0, 0, 24,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+104,154,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216,154,255, 2, 0, 0, 0, 0,248,153,255, 2, 0, 0, 0, 0,
+ 56,145,255, 2, 0, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+216,154,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72,155,255, 2, 0, 0, 0, 0,104,154,255, 2, 0, 0, 0, 0,
+ 88,144,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 72,155,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,154,255, 2, 0, 0, 0, 0,
+ 56,145,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+184,155,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,136,159,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 88,144,255, 2, 0, 0, 0, 0, 8,143,255, 2, 0, 0, 0, 0,120,143,255, 2, 0, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,190,255, 2, 0, 0, 0, 0, 88,190,255, 2, 0, 0, 0, 0,
+168,156,255, 2, 0, 0, 0, 0, 24,158,255, 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, 68, 65, 84, 65, 40, 1, 0, 0,168,156,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 24,158,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68,
0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,
0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0,104,202, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 64,201, 90, 10, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192,
- 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 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, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 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, 2, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 96, 0, 0, 0,144,203, 90, 10,
-200, 0, 0, 0, 1, 0, 0, 0, 88,207, 90, 10,176,200, 90, 10,160,192, 90, 10, 96,194, 90, 10, 96,195, 90, 10, 96,193, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 15, 15,119, 7,100, 0, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,112,206, 90, 10,112,206, 90, 10, 32,204, 90, 10, 72,205, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 32,204, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 72,205, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,160,137, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68,
- 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7,
- 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0, 72,205, 90, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32,204, 90, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,158,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,156,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69,
+ 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0,
+ 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0,
+ 18, 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,128, 63, 0, 0,128, 63,
+ 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 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, 97, 4, 0, 0, 97, 4, 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, 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, 68, 65, 84, 65,160, 0, 0, 0,136,159,255, 2, 0, 0, 0, 0,
+194, 0, 0, 0, 1, 0, 0, 0,120,164,255, 2, 0, 0, 0, 0,184,155,255, 2, 0, 0, 0, 0,152,142,255, 2, 0, 0, 0, 0,
+168,145,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0,232,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 15, 15,119, 7,100, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 88,163,255, 2, 0, 0, 0, 0, 88,163,255, 2, 0, 0, 0, 0,120,160,255, 2, 0, 0, 0, 0,
+232,161,255, 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, 68, 65, 84, 65, 40, 1, 0, 0,120,160,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+232,161,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,137, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+119, 7, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0,232,161,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,120,160,255, 2, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,
112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 18, 0, 0, 0, 73, 0, 0, 0,
0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2,
4, 0, 0, 4, 8, 0,119, 7, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-118, 7, 0, 0, 26, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 74, 0,
+ 0, 0, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+119, 7, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,188, 0, 0, 0,112,206, 90, 10,176, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 88,163,255, 2, 0, 0, 0, 0,170, 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,
+ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 88,207, 90, 10,200, 0, 0, 0,
- 1, 0, 0, 0, 0,215, 90, 10,144,203, 90, 10, 96,194, 90, 10,224,194, 90, 10, 32,194, 90, 10, 96,195, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0,118, 7, 0, 0,101, 0, 0, 0, 15, 2, 0, 0, 8, 8,119, 7,171, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,248,213, 90, 10,248,213, 90, 10,232,207, 90, 10,208,212, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,232,207, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 16,209, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 28, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 96,191, 68, 0, 0,200, 65, 0, 96,191, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 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, 68, 65, 84, 65,248, 0, 0, 0, 16,209, 90, 10,201, 0, 0, 0,
- 1, 0, 0, 0,168,211, 90, 10,232,207, 90, 10, 0, 0, 0, 0, 0, 0, 92, 67, 0,128,200,195, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 75, 67, 0,128,200,195, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,144, 1, 0, 0, 0, 0, 0, 0,
-202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,144, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4,
- 6, 0,220, 0,145, 1,203, 0,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,155, 6, 0, 0,118, 7, 0, 0,
-127, 0, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0,145, 1, 0, 0, 4, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 56,210, 90, 10, 56,210, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0, 56,210, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83, 69, 81, 85, 69, 78, 67, 69, 82, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+120,164,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 8,174,255, 2, 0, 0, 0, 0,136,159,255, 2, 0, 0, 0, 0,
+168,145,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 56,145,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,101, 0, 0, 0, 15, 2, 0, 0, 8, 8,119, 7,171, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,172,255, 2, 0, 0, 0, 0,200,172,255, 2, 0, 0, 0, 0,
+104,165,255, 2, 0, 0, 0, 0, 88,171,255, 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, 68, 65, 84, 65, 40, 1, 0, 0,104,165,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,216,166,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0, 96,191, 68, 0, 0,200, 65, 0, 96,191, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 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,
- 83, 69, 81, 85, 69, 78, 67, 69, 82, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216,166,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,232,169,255, 2, 0, 0, 0, 0,104,165,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 67,
+ 0,128,200,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 67, 0,128,200,195, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0,
+ 0, 0, 0, 0,144, 1, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0,
+ 0, 0, 0, 0,144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
+ 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0,145, 1,203, 0,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,155, 6, 0, 0,118, 7, 0, 0,127, 0, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,220, 0,145, 1, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83, 99,101,110,101, 32, 80,114,101,118,105,101,119, 47, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 72,168,255, 2, 0, 0, 0, 0, 72,168,255, 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, 68, 65, 84, 65, 88, 1, 0, 0, 72,168,255, 2, 0, 0, 0, 0,
+193, 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, 83, 69, 81, 85, 69, 78, 67, 69, 82, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,171,255,203, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 69, 81, 85, 69, 78, 67, 69, 82, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 99,101,110,101, 32, 80,114,101,118,105,101,119, 47, 82,101,110,100,101,114, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168,211, 90, 10,201, 0, 0, 0,
- 1, 0, 0, 0,208,212, 90, 10, 16,209, 90, 10, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196,
- 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,171,255,203, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 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, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,232,169,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 88,171,255, 2, 0, 0, 0, 0,
+216,166,255, 2, 0, 0, 0, 0, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68,
+ 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 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, 0,154, 6, 0, 0,
15, 2, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 7, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0,208,212, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,168,211, 90, 10, 0, 0, 0, 0, 0, 0,122, 67,
- 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0,
- 18, 0, 0, 0,144, 1, 0, 0, 18, 0, 0, 0,154, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,154, 6, 0, 0,
- 18, 0, 0, 0,144, 1, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,
-105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 0,155, 6,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,154, 6, 0, 0,127, 0, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,155, 6,145, 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, 68, 65, 84, 65,216, 0, 0, 0,248,213, 90, 10,166, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0, 88,171,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232,169,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67,
+ 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,144, 1, 0, 0, 18, 0, 0, 0,154, 6, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,154, 6, 0, 0, 18, 0, 0, 0,144, 1, 0, 0, 0, 0, 32, 65, 0, 0,128, 64,
+ 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 0,155, 6,
+145, 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,154, 6, 0, 0,
+127, 0, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,155, 6,145, 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, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 0,215, 90, 10,
-200, 0, 0, 0, 1, 0, 0, 0,120,221, 90, 10, 88,207, 90, 10,224,194, 90, 10,160,193, 90, 10,160,194, 90, 10, 32,195, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0, 17, 2, 0, 0, 69, 4, 0, 0, 2, 2, 76, 3, 53, 2, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 48,220, 90, 10, 48,220, 90, 10,144,215, 90, 10, 8,219, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,144,215, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,184,216, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,128,100, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 83, 68, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65, 0,192,103, 68,
- 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 76, 3, 26, 0, 76, 3,
- 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0, 17, 2, 0, 0, 42, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,240, 0, 0, 0,200,172,255, 2, 0, 0, 0, 0,160, 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, 8, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,184,216, 90, 10,
-201, 0, 0, 0, 1, 0, 0, 0,224,217, 90, 10,144,215, 90, 10, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 72, 67, 0, 64, 2,196, 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0, 26, 2, 0, 0,
- 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0, 26, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3,
- 0, 0, 0, 4, 6, 0,217, 0, 27, 2,200, 0, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-216, 0, 0, 0, 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 27, 2,
- 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,224,217, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 8,219, 90, 10,184,216, 90, 10, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 64, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 8,174,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
+104,182,255, 2, 0, 0, 0, 0,120,164,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 88,144,255, 2, 0, 0, 0, 0,
+ 24,146,255, 2, 0, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0,
+ 17, 2, 0, 0, 69, 4, 0, 0, 2, 2, 76, 3, 53, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+184,180,255, 2, 0, 0, 0, 0,184,180,255, 2, 0, 0, 0, 0,248,174,255, 2, 0, 0, 0, 0, 72,179,255, 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, 75, 3, 0, 0, 75, 3, 0, 0, 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,248,174,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,104,176,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,100, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 83, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65,
+ 0,192,103, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 76, 3,
+ 26, 0, 76, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0,
+ 17, 2, 0, 0, 42, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 3, 26, 0, 0, 0, 1, 0,
+ 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,
+ 68, 65, 84, 65, 40, 1, 0, 0,104,176,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,216,177,255, 2, 0, 0, 0, 0,
+248,174,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67,
+ 0, 64, 2,196, 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0, 26, 2, 0, 0, 0, 0, 0, 0,199, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0, 26, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,217, 0,
+ 27, 2,200, 0, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0,
+ 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 27, 2, 0, 0, 2, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,216,177,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 72,179,255, 2, 0, 0, 0, 0,
+104,176,255, 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, 75, 3, 0, 0, 75, 3, 0, 0,
+ 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0,
+ 4, 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, 68, 65, 84, 65,248, 0, 0, 0, 8,219, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,224,217, 90, 10, 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 0, 0,122, 67,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0, 72,179,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+216,177,255, 2, 0, 0, 0, 0, 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 0, 0,122, 67,
0, 0, 16,193, 0, 0, 32, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 26, 2, 0, 0, 18, 0, 0, 0,114, 2, 0, 0,
0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,114, 2, 0, 0, 18, 0, 0, 0, 26, 2, 0, 0,111, 18,131, 58,111, 18,131, 58,
0,124,146, 72, 0, 80, 67, 71, 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,115, 2,
- 27, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0, 75, 3, 0, 0, 43, 2, 0, 0,
- 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 2, 27, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 27, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0, 75, 3, 0, 0,
+ 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 2, 27, 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, 68, 65, 84, 65,208, 0, 0, 0,
- 48,220, 90, 10,164, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+ 68, 65, 84, 65,240, 0, 0, 0,184,180,255, 2, 0, 0, 0, 0,158, 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, 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,
- 48,221, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 48,221, 90, 10, 23, 1, 0, 0, 1, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,120,221, 90, 10,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0,215, 90, 10, 32,195, 90, 10,160,194, 90, 10,224,193, 90, 10, 32,194, 90, 10, 0, 0, 0, 0, 77, 3, 0, 0,118, 7, 0, 0,
- 17, 2, 0, 0, 69, 4, 0, 0, 8, 8, 42, 4, 53, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,226, 90, 10,
-168,226, 90, 10, 8,222, 90, 10,128,225, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0, 8,222, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 48,223, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 67,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 64,133, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 4, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0, 64, 50, 68, 0, 0,200, 65, 0, 64, 50, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 42, 4, 26, 0, 42, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 77, 3, 0, 0,118, 7, 0, 0, 17, 2, 0, 0, 42, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 42, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48,223, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 88,224, 90, 10,
- 8,222, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+248,181,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248,181,255, 2, 0, 0, 0, 0, 16, 1, 0, 0, 1, 0, 0, 0,
+232,190,255, 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, 68, 65, 84, 65,160, 0, 0, 0,104,182,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8,174,255, 2, 0, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 24,146,255, 2, 0, 0, 0, 0,
+200,144,255, 2, 0, 0, 0, 0, 56,145,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 3, 0, 0,118, 7, 0, 0,
+ 17, 2, 0, 0, 69, 4, 0, 0, 8, 8, 42, 4, 53, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 24,189,255, 2, 0, 0, 0, 0, 24,189,255, 2, 0, 0, 0, 0, 88,183,255, 2, 0, 0, 0, 0,168,187,255, 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,
+ 68, 65, 84, 65, 40, 1, 0, 0, 88,183,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,200,184,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 64,133, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 64, 50, 68, 0, 0,200, 65,
+ 0, 64, 50, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 42, 4,
+ 26, 0, 42, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 3, 0, 0,118, 7, 0, 0,
+ 17, 2, 0, 0, 42, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 4, 26, 0, 0, 0, 1, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,118, 7, 0, 0, 43, 2, 0, 0, 69, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 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, 68, 65, 84, 65,248, 0, 0, 0, 88,224, 90, 10,
-201, 0, 0, 0, 1, 0, 0, 0,128,225, 90, 10, 48,223, 90, 10, 0, 0,240,195, 0, 0,240, 67, 0, 0,135,195, 0, 0,135, 67,
- 96,187,216,196, 96,187,216, 68,244, 43, 91,196,244, 43, 91, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 4, 0, 0, 0, 0, 0, 0, 26, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0,
- 0, 0, 0, 4, 0, 0, 42, 4, 27, 2, 42, 4, 27, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 3, 0, 0,
-118, 7, 0, 0, 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 4, 27, 2,
- 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,200,184,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 56,186,255, 2, 0, 0, 0, 0,
+ 88,183,255, 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,
- 68, 65, 84, 65,248, 0, 0, 0,128,225, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88,224, 90, 10, 0, 0, 0, 0,
- 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0,
- 17, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 18, 0, 0, 0,201, 2, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,
-201, 2, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60,
- 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0,202, 2, 76, 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, 1, 0, 1, 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, 68, 65, 84, 65,216, 0, 0, 0,168,226, 90, 10,166, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,118, 7, 0, 0,
+ 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0,
+ 4, 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,
+ 68, 65, 84, 65, 40, 1, 0, 0, 56,186,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,168,187,255, 2, 0, 0, 0, 0,
+200,184,255, 2, 0, 0, 0, 0, 0, 0,240,195, 0, 0,240, 67, 0, 0,135,195, 0, 0,135, 67, 96,187,216,196, 96,187,216, 68,
+244, 43, 91,196,244, 43, 91, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 4, 0, 0, 0, 0, 0, 0, 26, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 4, 0, 0, 42, 4,
+ 27, 2, 42, 4, 27, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 3, 0, 0,118, 7, 0, 0,
+ 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 4, 27, 2, 0, 0, 7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,168,187,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 56,186,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67,
+ 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 18, 0, 0, 0,201, 2, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,201, 2, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 0, 0, 32, 65, 0, 0,128, 64,
+ 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0,202, 2,
+ 76, 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, 1, 0, 1, 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,
+ 68, 65, 84, 65,240, 0, 0, 0, 24,189,255, 2, 0, 0, 0, 0,160, 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, 8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,128, 64, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 0, 0,120, 5, 0, 0,
- 16,228, 90, 10,157, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 83, 99,
-101,110,101, 0,116, 97,103,101, 0, 97,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,184,233, 90, 10,
- 0, 0, 0, 0,208,245, 90, 10,224,243, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,152,235, 90, 10, 40,236, 90, 10,152,235, 90, 10,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,236, 90, 10,240, 64, 80, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 64, 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 0, 0, 8, 6, 0, 0,232,190,255, 2, 0, 0, 0, 0,151, 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, 68,172, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83, 67, 83, 99,101,110,101, 0,116, 97,103,101, 0, 97,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 56,197,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 88,200,255, 2, 0, 0, 0, 0, 56,201,255, 2, 0, 0, 0, 0, 88,200,255, 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, 1, 0, 0, 0, 1, 0, 0, 0,
+ 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,201,255, 2, 0, 0, 0, 0,
+ 56, 40,160, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,172, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
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, 1, 0, 0, 0,
250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0,100, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 1, 0, 0, 0,
1, 0, 0, 0, 6, 0, 50, 0,141, 0,128, 7, 56, 4, 8, 0, 8, 0, 0, 0, 24, 0, 17, 0, 0, 0, 0, 0, 90, 0, 1, 0,
0, 0, 0, 0, 81, 0, 0, 0, 23, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 8, 0, 24, 0, 10, 0,
0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,239, 90, 10, 96,239, 90, 10, 0, 0, 1, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 5, 0, 2, 0, 1, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 98, 97, 99,107, 98,117,
-102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,205,255, 2, 0, 0, 0, 0,104,205,255, 2, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 5, 0, 2, 0, 1, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 47, 47, 98, 97, 99,107, 98,117,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47,116,109,112, 47, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 31, 5, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 5, 0, 0, 12, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 16, 0, 0, 0,128, 63, 0, 0,128, 63,
+173, 2, 95, 0,154,153,217, 63, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 76, 69, 78, 68, 69, 82, 95, 82, 69, 78, 68, 69, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68,172, 0, 0, 0, 0,128, 63,102,166,171, 67, 0, 0,128, 63, 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,
+208,205,255, 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,
+120,233,222, 2, 0, 0, 0, 0, 1, 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,205,204, 28, 65, 0, 0, 0, 0,
+ 32, 0, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 0, 5, 0, 60, 0, 5, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0,128, 7, 56, 4,205,204,204, 61, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195,245, 28,193, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 56,197,255, 2, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 16, 0, 0, 0,128, 63, 0, 0,128, 63,173, 2, 95, 0,154,153,217, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 76, 69, 78,
- 68, 69, 82, 95, 82, 69, 78, 68, 69, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,172, 0, 0,
- 0, 0,128, 63,102,166,171, 67, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,176,203, 64, 10, 0, 0, 0, 0, 0, 0, 0, 0,144, 10, 85, 10, 1, 0, 0, 0, 1, 0, 10, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 28, 65,
- 0, 0, 0, 0, 32, 0, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 0, 5, 0, 60, 0, 5, 0, 1, 0, 5, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,
-180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0,128, 7, 56, 4,205,204,204, 61, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195,245, 28,193, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 76, 0, 0, 0,184,233, 90, 10, 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 0, 0, 0, 0, 0, 0, 0, 48,234, 90, 10, 32,235, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 76, 0, 0, 0, 48,234, 90, 10, 16, 0, 0, 0, 1, 0, 0, 0, 32,235, 90, 10, 0, 0, 0, 0,
- 6, 0, 0, 0,110,101,116,119,111,114,107, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,234, 90, 10,168,234, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 76, 0, 0, 0,168,234, 90, 10, 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232,197,255, 2, 0, 0, 0, 0,168,199,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 96, 0, 0, 0,232,197,255, 2, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0,168,199,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,110,101,116,119,111,114,107, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,198,255, 2, 0, 0, 0, 0,
+152,198,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,
+152,198,255, 2, 0, 0, 0, 0, 8, 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,115,101,114,118,101,114, 95, 97,100,100,114,101,115,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,152, 39, 59, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 10, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0,152, 39, 59, 10, 0, 0, 0, 0, 1, 0, 0, 0, 91,100,101,102, 97,117,108,116,
- 93, 0, 0, 0, 68, 65, 84, 65, 76, 0, 0, 0, 32,235, 90, 10, 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48,234, 90, 10,
- 6, 0, 0, 0,112,111,115,101, 95,116,101,109,112,108, 97,116,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 28, 0, 0, 0,152,235, 90, 10,133, 0, 0, 0, 1, 0, 0, 0,224,235, 90, 10, 0, 0, 0, 0,
- 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,186, 1,168, 1,152,250, 90, 10, 68, 65, 84, 65, 28, 0, 0, 0,224,235, 90, 10,
-133, 0, 0, 0, 1, 0, 0, 0, 40,236, 90, 10,152,235, 90, 10, 1, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 59, 2,109, 2,
- 96,255, 90, 10, 68, 65, 84, 65, 28, 0, 0, 0, 40,236, 90, 10,133, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,224,235, 90, 10,
- 1, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 97, 0,228, 1,208,245, 90, 10, 68, 65, 84, 65,152, 1, 0, 0,112,236, 90, 10,
-153, 0, 0, 0, 1, 0, 0, 0, 56,238, 90, 10,136,238, 90, 10,216,238, 90, 10, 0, 0,128, 63, 1, 0, 1, 0,205,204, 76, 63,
- 0, 0,180, 66, 9, 0, 1, 0, 0, 0,128, 63,111, 18,131, 58,205,204,204, 61, 0, 0, 1, 0, 32, 0, 32, 0, 32, 0, 1, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,120,208, 92, 10,
- 0, 0, 0, 0,255,255,255,128, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 80, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
- 7, 0, 5, 0, 5, 0,255,255, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,200, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0,128, 62,
- 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,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 72,199,255, 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, 10, 0, 0, 0, 10, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0, 72,199,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 91,100,101,102, 97,117,108,116, 93, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,168,199,255, 2,
+ 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,197,255, 2, 0, 0, 0, 0, 6, 0, 0, 0,
+112,111,115,101, 95,116,101,109,112,108, 97,116,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88,200,255, 2, 0, 0, 0, 0,127, 0, 0, 0,
+ 1, 0, 0, 0,200,200,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+198, 2,182, 1, 72,220,255, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200,200,255, 2, 0, 0, 0, 0,127, 0, 0, 0,
+ 1, 0, 0, 0, 56,201,255, 2, 0, 0, 0, 0, 88,200,255, 2, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0,
+149, 3,243, 2,232,226,255, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56,201,255, 2, 0, 0, 0, 0,127, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,200,255, 2, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,
+157, 0, 23, 2, 72,214,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,192, 1, 0, 0,168,201,255, 2, 0, 0, 0, 0,147, 0, 0, 0,
+ 1, 0, 0, 0,184,203,255, 2, 0, 0, 0, 0, 56,204,255, 2, 0, 0, 0, 0,184,204,255, 2, 0, 0, 0, 0, 0, 0,128, 63,
+ 1, 0, 1, 0,205,204, 76, 63, 0, 0,180, 66, 9, 0, 1, 0, 0, 0,128, 63,111, 18,131, 58,205,204,204, 61, 0, 0, 1, 0,
+ 32, 0, 32, 0, 32, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 80, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 5, 0, 5, 0,255,255, 50, 0, 10, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 50, 0, 10, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 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,128, 63,
10,215, 35, 60,205,204,204, 61, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 0,205,204,204, 61,205,204,204, 61,102,102,166, 63,
0, 0,192, 63, 0, 0,240, 65, 72,225,122, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 67, 2, 0, 3,
- 2, 0, 1, 0, 0, 0, 0, 0, 0, 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, 17, 0, 0, 0, 35, 0, 0, 0,204,197,121, 63, 0, 0, 0, 63,
- 68, 65, 84, 65, 36, 0, 0, 0, 56,238, 90, 10,152, 0, 0, 0, 1, 0, 0, 0, 96,122, 92, 10,152, 75, 85, 10,255,255,255,128,
- 1, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 36, 0, 0, 0,
-136,238, 90, 10,152, 0, 0, 0, 1, 0, 0, 0, 96,122, 92, 10,248,175, 88, 9,200,200,255,128, 1, 0, 0, 0, 2, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 0, 0, 0,216,238, 90, 10,151, 0, 0, 0,
- 1, 0, 0, 0, 72,181, 92, 10,216,191, 75, 10,255,100,100,128, 1, 0, 0, 0,128, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+ 2, 0, 1, 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, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 35, 0, 0, 0,204,197,121, 63,
+ 0, 0, 0, 63, 68, 65, 84, 65, 56, 0, 0, 0,184,203,255, 2, 0, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0,136,103, 1, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 1, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 0, 0, 0, 56,204,255, 2,
+ 0, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,200,255,128,
+ 1, 0, 0, 0, 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, 68, 65, 84, 65, 96, 0, 0, 0,184,204,255, 2, 0, 0, 0, 0,145, 0, 0, 0, 1, 0, 0, 0,152,172, 1, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,100,100,128, 1, 0, 0, 0,128, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
1, 0, 0, 0,124, 7,231, 65,255, 74, 20, 65, 54, 86,123, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 72, 0, 0, 0, 96,239, 90, 10,139, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 76, 97,
-121,101,114, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255,255, 15, 0, 0, 0, 0, 0,255,127, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 67, 65, 0, 0,104, 0, 0, 0,
-216,239, 90, 10, 29, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 67, 97,
-109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 63,205,204,204, 61, 0, 0,200, 66, 0, 0, 12, 66,161, 14,234, 64, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0,108, 1, 0, 0,112,240, 90, 10,
- 41, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 76, 97,109,112, 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, 32, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,247,255,239, 65, 0, 0,150, 66,154,153, 25, 62, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 8,242, 90, 10, 2, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63,
- 0, 0, 64, 64,205,204, 76, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 11, 3, 0, 1, 0, 0, 0, 0, 2, 1, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,111, 18,131, 58, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 64,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 88, 0, 0, 0,104,205,255, 2, 0, 0, 0, 0,133, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 82,101,110,100,101,114, 76, 97,121,101,114, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 15, 0, 0, 0, 0, 0,255,127, 0, 0,
+ 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 67, 65, 0, 0,136, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 21, 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, 67, 65, 67, 97,109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, 48, 49, 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, 4, 0, 0, 0, 0, 63,205,204,204, 61,
+ 0, 0,200, 66, 0, 0, 12, 66,161, 14,234, 64, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0,216, 1, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 33, 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, 76, 65, 76, 97,109,112, 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, 32, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63,247,255,239, 65, 0, 0,150, 66,154,153, 25, 62, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 72,209,255, 2,
+ 0, 0, 0, 0, 2, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64,205,204, 76, 61,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 11, 3, 0, 1, 0, 0, 0, 0, 2, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,111, 18,131, 58, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,243, 90, 10, 68, 65, 84, 65, 16, 1, 0, 0, 8,242, 90, 10,
- 82, 1, 0, 0, 1, 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,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 1, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,243, 4, 53,191,242, 4, 53, 63,242, 4, 53,191,243, 4, 53, 63, 72,243, 90, 10, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,211,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,
+ 64, 1, 0, 0, 72,209,255, 2, 0, 0, 0, 0, 75, 1, 0, 0, 1, 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,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 63, 2, 0, 1, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,243, 4, 53,191,242, 4, 53, 63,242, 4, 53,191,
+243, 4, 53, 63,216,210,255, 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,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 72,243, 90, 10, 80, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,144,243, 90, 10, 19, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 79, 0, 0,112, 1, 0, 0,
-224,243, 90, 10,132, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 79, 87,111,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216,210,255, 2,
+ 0, 0, 0, 0, 73, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56,211,255, 2, 0, 0, 0, 0, 11, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 87, 79, 0, 0,224, 1, 0, 0,168,211,255, 2, 0, 0, 0, 0,126, 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, 87, 79, 87,111,
114,108,100, 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,114, 99, 80, 61,114, 99, 80, 61,114, 99, 80, 61,199, 54, 36, 60,199, 54, 36, 60,
-199, 54, 36, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 28, 65, 0, 0, 0, 0, 0, 0, 32, 0,128, 0, 5, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 64, 0, 0,200, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0,112, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65,
- 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 61, 0, 0, 5, 0, 0, 0, 0, 0, 10,215,163, 59, 0, 0, 0, 0, 0, 0,128, 62,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 0, 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,128,245, 90, 10, 68, 65, 84, 65,
- 32, 0, 0, 0,128,245, 90, 10, 19, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0,220, 3, 0, 0,208,245, 90, 10,121, 0, 0, 0,
- 1, 0, 0, 0,152,250, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67, 97,109,101,114, 97, 0, 97,109,101,
-114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114, 99, 80, 61,114, 99, 80, 61,114, 99, 80, 61,
+199, 54, 36, 60,199, 54, 36, 60,199, 54, 36, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 28, 65, 0, 0, 0, 0, 0, 0, 32, 0,
+128, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 64, 0, 0,200, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0,112, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 61, 0, 0, 5, 0, 0, 0, 0, 0, 10,215,163, 59,
+ 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 0, 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,216,239, 90, 10,
- 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,
- 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110,101,239, 64,150, 62,208,192,
- 78,255,170, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,254,141, 63,192, 57, 49, 60, 34,159, 80, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222,149, 47, 63, 53, 70, 58, 63,222, 56, 49,188, 0, 0, 0, 0, 86,126,162,190,
-227,251,159, 62, 55, 53,101, 63, 0, 0, 0, 0, 7,165, 39, 63,149, 84, 28,191, 51,247,227, 62, 0, 0, 0, 0,110,101,239, 64,
-150, 62,208,192, 78,255,170, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,125,103,133, 51,176,219,194,178, 0, 0, 0, 0,190, 32, 66, 51,
- 1, 0,128, 63,168,200,153, 51, 0, 0, 0, 0, 32,206, 18,179,126,126,149, 50, 1, 0,128, 63, 0, 0, 0, 0,241,251,133, 52,
-172,182, 27,180,174,236,252, 51, 0, 0,128, 63, 0, 0,128, 63,157,190,215, 49,167,170, 4, 52, 0, 0, 0,128,129,116,157,178,
- 1, 0,128, 63, 33, 69, 15, 51, 0, 0, 0,128, 73,254, 67, 51,243, 97,106, 49, 0, 0,128, 63, 0, 0, 0,128, 3, 0, 64, 52,
-183,164,157, 39, 0, 0,128, 53, 0, 0,128, 63, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 0,
- 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201,
- 0, 0,128, 63,187,225, 16, 63, 0, 0,128, 63,205,204,204, 62,237, 54, 32, 63, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,249, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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, 0,
- 68, 65, 84, 65,144, 0, 0, 0,216,249, 90, 10,124, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,213,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,
+ 40, 0, 0, 0,216,213,255, 2, 0, 0, 0, 0, 11, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0,
+208, 4, 0, 0, 72,214,255, 2, 0, 0, 0, 0,114, 0, 0, 0, 1, 0, 0, 0, 72,220,255, 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, 79, 66, 67, 97,109,101,114, 97, 0, 97,109,101,
+114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 79, 66, 0, 0,220, 3, 0, 0,152,250, 90, 10,121, 0, 0, 0, 1, 0, 0, 0, 96,255, 90, 10,208,245, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-112, 83, 78, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 74, 92, 10, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0,
- 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0,
- 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 32, 60, 9,
-192, 93, 44, 9, 1, 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,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 42,254,141, 63,192, 57, 49, 60, 34,159, 80, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+222,149, 47, 63, 53, 70, 58, 63,222, 56, 49,188, 0, 0, 0, 0, 86,126,162,190,227,251,159, 62, 55, 53,101, 63, 0, 0, 0, 0,
+ 7,165, 39, 63,149, 84, 28,191, 51,247,227, 62, 0, 0, 0, 0,110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0,128, 63,
0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
-222,149, 47, 63, 52, 70, 58, 63,179, 56, 49,188, 0, 0, 0,128, 86,126,162,190,227,251,159, 62, 56, 53,101, 63, 0, 0, 0,128,
- 7,165, 39, 63,149, 84, 28,191, 50,247,227, 62, 0, 0, 0,128,110,101,239, 64,151, 62,208,192, 77,255,170, 64, 0, 0,128, 63,
- 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 68, 0, 79, 66, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63,
-205,204,204, 62,229,208, 34, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0,
+ 1, 0,128, 63, 1, 0,128, 51, 1, 0, 0,179, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0,128, 63, 1, 0,128, 51, 0, 0, 0, 0,
+ 2, 0, 0,179, 2, 0, 0,167, 1, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 53, 1, 0, 0, 41, 1, 0,128,168, 0, 0,128, 63,
+221,149, 47, 63, 86,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,
+192, 56, 49,188, 55, 53,101, 63, 52,247,227, 62, 0, 0, 0, 0, 90, 38,173,190, 0,222,192,190,152, 9, 52,193, 0, 0,128, 63,
+ 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,187,225, 16, 63, 0, 0,128, 63,
+205,204,204, 62,237, 54, 32, 63, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0,
1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,160,254, 90, 10, 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,232,178, 61, 10, 40, 53, 85, 10, 25, 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, 68, 65, 84, 65, 4, 0, 0, 0, 24, 32, 60, 9,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,192, 93, 44, 9, 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,144, 0, 0, 0,160,254, 90, 10,124, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 72, 0, 0, 0, 79, 66, 0, 0,220, 3, 0, 0, 96,255, 90, 10,121, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
-152,250, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 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,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,219,255, 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, 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, 68, 65, 84, 65,152, 0, 0, 0,104,219,255, 2, 0, 0, 0, 0,117, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, 10,215,163, 60,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 79, 66, 0, 0,208, 4, 0, 0, 72,220,255, 2,
+ 0, 0, 0, 0,114, 0, 0, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,240, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 97,223, 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,152, 49, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0,
250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154,112,130, 64,183,178,128, 63,112,236,188, 64, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,225,255, 2, 0, 0, 0, 0,184,225,255, 2, 0, 0, 0, 0, 1, 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,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 1, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 68, 0, 79, 66, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63,205,204,204, 62,229,208, 34, 62,
+ 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 1, 0, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229,123, 38, 63, 87, 43, 98, 61,229,229,238, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 54,236,148,190, 25,134,116, 63,236, 13, 98,189, 0, 0, 0, 0,221,102, 69,191, 57,174, 76,190, 34,194, 26, 63,
- 0, 0, 0, 0, 37,255, 16, 63,241,161, 95, 62,164,111, 75, 63, 0, 0, 0, 0,154,112,130, 64,183,178,128, 63,112,236,188, 64,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 8,226,255, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,124, 99, 4, 0, 0, 0, 0, 24,132, 99, 4,
+ 0, 0, 0, 0, 25, 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, 68, 65, 84, 65,
+ 8, 0, 0, 0,104,225,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 4, 0, 0, 0,184,225,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,152, 0, 0, 0,
+ 8,226,255, 2, 0, 0, 0, 0,117, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 72, 0, 0, 0, 79, 66, 0, 0,208, 4, 0, 0,232,226,255, 2, 0, 0, 0, 0,114, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 79, 66, 76, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 40,207,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154,112,130, 64,183,178,128, 63,
+112,236,188, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229,123, 38, 63, 87, 43, 98, 61,229,229,238, 63,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 35,233,134, 49,251,110, 17,179, 0, 0, 0, 0, 49,158,141, 50, 1, 0,128, 63,126,214,237, 50,
- 0, 0, 0, 0,155,248, 28,178,199,139, 96,177,254,255,127, 63, 0, 0, 0, 0, 80,136,159,178,192, 4,158,178,209,114,143,179,
- 0, 0,128, 63, 53,236,148,190,222,102, 69,191, 37,255, 16, 63, 0, 0, 0,128, 24,134,116, 63, 57,174, 76,190,240,161, 95, 62,
- 0, 0, 0,128,235, 13, 98,189, 34,194, 26, 63,166,111, 75, 63, 0, 0, 0,128,208, 19, 13, 63,234, 65,102,190, 10, 10,231,192,
- 0, 0,128, 63, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 68, 0, 79, 66, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,169, 19,208, 60,
- 0, 0,128, 63,205,204,204, 62,229,208, 34, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 5, 0, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 3, 91, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 0, 68, 65, 84, 65,144, 0, 0, 0,
-104, 3, 91, 10,124, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 77, 65, 0, 0,
-160, 2, 0, 0, 40, 4, 91, 10, 43, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 77, 65, 77, 97,116,101,114,105, 97,108, 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,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54,236,148,190, 25,134,116, 63,236, 13, 98,189, 0, 0, 0, 0,221,102, 69,191,
+ 57,174, 76,190, 34,194, 26, 63, 0, 0, 0, 0, 37,255, 16, 63,241,161, 95, 62,164,111, 75, 63, 0, 0, 0, 0,154,112,130, 64,
+183,178,128, 63,112,236,188, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 1, 0,128, 50, 0, 0, 0,179, 0, 0, 0, 0, 1, 0,128, 50,
+ 1, 0,128, 63, 1, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 39,
+ 1, 0, 0, 52, 1, 0,128, 39, 0, 0,128, 63, 54,236,148,190,221,102, 69,191, 38,255, 16, 63, 0, 0, 0, 0, 24,134,116, 63,
+ 57,174, 76,190,239,161, 95, 62, 0, 0, 0, 0,237, 13, 98,189, 35,194, 26, 63,166,111, 75, 63, 0, 0, 0, 0,209, 19, 13, 63,
+241, 65,102,190, 10, 10,231,192, 0, 0,128, 63, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 68, 0,
+ 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201,
+ 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63,205,204,204, 62,229,208, 34, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,232,255, 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, 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, 68, 65, 84, 65,152, 0, 0, 0, 8,232,255, 2, 0, 0, 0, 0,
+117, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 77, 65, 0, 0, 32, 3, 0, 0,232,232,255, 2, 0, 0, 0, 0, 35, 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, 77, 65, 77, 97,116,101,114,105,
+ 97,108, 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, 1, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 63, 0, 0, 0, 63, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
@@ -5380,24 +6544,28 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
0, 0,128, 64, 0, 0, 0, 63,205,204,204, 61, 0, 0, 0, 63,205,204,204, 61,205,204,204, 61, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,248, 6, 91, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 88,236,255, 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, 48, 8, 91, 10, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,184,237,255, 2, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,111,148, 26, 63,111,148, 26, 63,111,148, 26, 63,
205,204, 76, 61,205,204,204, 61,102,102,166, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,248, 6, 91, 10, 32, 0, 0, 0,
- 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,168, 91, 10, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+ 88,236,255, 2, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+200,142, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 32, 0, 0, 0, 48, 8, 91, 10, 19, 0, 0, 0, 1, 0, 0, 0,
- 32, 0, 0, 0, 96, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 1, 0, 1, 0, 49, 0, 49, 0,128, 8, 91, 10,176, 24, 91, 10,
- 68, 65, 84, 65, 0, 16, 0, 0,128, 8, 91, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,184,237,255, 2, 0, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0,
+ 32, 0, 0, 0, 96, 0, 0, 0, 0, 0, 1, 0, 51, 0, 51, 0, 40,238,255, 2, 0, 0, 0, 0,120,254,255, 2, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 16, 0, 0, 40,238,255, 2, 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, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -5525,8 +6693,61 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0,144, 0, 0,176, 24, 91, 10,
- 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, 68, 65, 84, 65, 0,144, 0, 0,
+120,254,255, 2, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -6625,6 +7846,64 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 0, 0,112, 1, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 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, 84, 69, 84,101,120, 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,128, 62, 0, 0,160, 64,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 1, 0,
+ 3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204,204, 60, 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, 2, 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,136,144, 0, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+136,144, 0, 3, 0, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0,
+ 0, 0, 1, 0, 16, 0, 15, 0,248,144, 0, 3, 0, 0, 0, 0, 72,161, 0, 3, 0, 0, 0, 0, 68, 65, 84, 65, 0, 16, 0, 0,
+248,144, 0, 3, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -6678,1313 +7957,41 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 0, 0, 48, 1, 0, 0,224,168, 91, 10, 39, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 84,101,120, 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,128, 62, 0, 0,160, 64, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 64, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 1, 0, 3, 0, 2, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204,204, 60, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 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, 64,170, 91, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 64,170, 91, 10, 19, 0, 0, 0, 1, 0, 0, 0,
- 32, 0, 0, 0, 96, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 0, 0, 1, 0, 14, 0, 13, 0,144,170, 91, 10,192,186, 91, 10,
- 68, 65, 84, 65, 0, 16, 0, 0,144,170, 91, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 68, 65, 84, 65, 0,144, 0, 0,192,186, 91, 10,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 77, 69, 0, 0, 40, 1, 0, 0,240, 74, 92, 10, 54, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0,144, 0, 0, 72,161, 0, 3, 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,128,233, 80, 9,120, 82, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0,200, 77, 92, 10, 56, 80, 92, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 76, 92, 10, 1, 0, 0, 0,
- 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 78, 92, 10, 1, 0, 0, 0, 5, 0, 0, 0,
- 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 80, 92, 10, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0,128, 51, 0, 0, 0,180, 0, 0, 0, 0, 4, 0,128, 63, 4, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 6, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,128,233, 80, 9, 0, 0, 0, 0, 1, 0, 0, 0, 40, 4, 91, 10, 68, 65, 84, 65,
- 84, 1, 0, 0, 72, 76, 92, 10, 87, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 77, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -7993,16 +8000,7 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,192, 0, 0, 0,200, 77, 92, 10, 60, 0, 0, 0, 8, 0, 0, 0, 0, 0,128, 63,255,255,127, 63,
- 0, 0,128,191,230, 73,230, 73, 26,182,255,127, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128,191, 0, 0,128,191,230, 73, 26,182,
- 26,182,255,127, 1, 0, 0, 0, 1, 0,128,191,253,255,127,191, 0, 0,128,191, 26,182, 26,182, 26,182,255,127, 1, 0, 0, 0,
-250,255,127,191, 3, 0,128, 63, 0, 0,128,191, 26,182,230, 73, 26,182,255,127, 1, 0, 0, 0, 4, 0,128, 63,247,255,127, 63,
- 0, 0,128, 63,230, 73,230, 73,230, 73,255,127, 1, 0, 0, 0,245,255,127, 63, 5, 0,128,191, 0, 0,128, 63,230, 73, 26,182,
-230, 73,255,127, 1, 0, 0, 0, 3, 0,128,191,250,255,127,191, 0, 0,128, 63, 26,182, 26,182,230, 73,255,127, 1, 0, 0, 0,
-255,255,127,191, 0, 0,128, 63, 0, 0,128, 63, 26,182,230, 73,230, 73,255,127, 1, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,
-184, 78, 92, 10, 87, 1, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 80, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8011,38 +8009,1220 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,144, 0, 0, 0, 56, 80, 92, 10, 57, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 2, 0, 0, 0,
- 0, 0, 35, 0, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0,
- 6, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0,
- 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0,
- 0, 0, 35, 0, 68, 65, 84, 65, 84, 1, 0, 0,248, 80, 92, 10, 87, 1, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 82, 92, 10, 6, 0, 0, 0,
- 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 84, 92, 10,
- 6, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 67,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 88, 84, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,120, 0, 0, 0,120, 82, 92, 10, 56, 0, 0, 0, 6, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0,
- 5, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0,
- 5, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 2, 66, 82, 0, 0,188, 2, 0, 0,
-232, 84, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,168, 90, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 65,100,
-100, 0,104, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 12, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 8, 89, 92, 10, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 0, 0,176, 1, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 46, 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,
+ 77, 69, 67,117, 98,101, 0,112,104,101,114,101, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 51, 1, 3, 0, 0, 0, 0,
+232, 58, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 53, 1, 3, 0, 0, 0, 0,
+ 88, 56, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 51, 1, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+168, 54, 1, 3, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56, 57, 1, 3, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,128, 51, 0, 0, 0,180, 0, 0, 0, 0, 4, 0,128, 63, 4, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 6, 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, 68, 65, 84, 65, 8, 0, 0, 0,152, 51, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 1, 0, 0,232, 51, 1, 3, 0, 0, 0, 0,
+ 80, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,152, 53, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,192, 0, 0, 0,152, 53, 1, 3, 0, 0, 0, 0,
+ 52, 0, 0, 0, 8, 0, 0, 0, 0, 0,128, 63,255,255,127, 63, 0, 0,128,191,230, 73,230, 73, 26,182,255,127, 1, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128,191, 0, 0,128,191,230, 73, 26,182, 26,182,255,127, 1, 0, 0, 0, 1, 0,128,191,253,255,127,191,
+ 0, 0,128,191, 26,182, 26,182, 26,182,255,127, 1, 0, 0, 0,250,255,127,191, 3, 0,128, 63, 0, 0,128,191, 26,182,230, 73,
+ 26,182,255,127, 1, 0, 0, 0, 4, 0,128, 63,247,255,127, 63, 0, 0,128, 63,230, 73,230, 73,230, 73,255,127, 1, 0, 0, 0,
+245,255,127, 63, 5, 0,128,191, 0, 0,128, 63,230, 73, 26,182,230, 73,255,127, 1, 0, 0, 0, 3, 0,128,191,250,255,127,191,
+ 0, 0,128, 63, 26,182, 26,182,230, 73,255,127, 1, 0, 0, 0,255,255,127,191, 0, 0,128, 63, 0, 0,128, 63, 26,182,230, 73,
+230, 73,255,127, 1, 0, 0, 0, 68, 65, 84, 65,104, 1, 0, 0,168, 54, 1, 3, 0, 0, 0, 0, 80, 1, 0, 0, 5, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 88, 56, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,144, 0, 0, 0, 88, 56, 1, 3, 0, 0, 0, 0, 49, 0, 0, 0, 12, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 35, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0,
+ 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 6, 0, 0, 0,
+ 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65,104, 1, 0, 0, 56, 57, 1, 3, 0, 0, 0, 0,
+ 80, 1, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232, 58, 1, 3, 0, 0, 0, 0, 6, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 84, 92, 10, 0, 0, 0, 0, 6, 0, 0, 0, 64, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 84, 92, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,120, 0, 0, 0,232, 58, 1, 3, 0, 0, 0, 0,
+ 48, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0,
+ 7, 0, 0, 0, 6, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 2, 1, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 6, 0, 0, 0,
+ 7, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 2,
+ 66, 82, 0, 0,240, 2, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 65,100,100, 0,104, 46,
+ 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 63, 0, 0, 0, 0, 72, 64, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8054,38 +9234,41 @@ char datatoc_startup_blend[]= {
35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 52, 85, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 16, 60, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 8, 89, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61,
- 14,215,126,191, 46,189,194, 61, 72, 90, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 72, 64, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,216, 65, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 72, 90, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,168, 90, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,
- 48, 95, 92, 10,232, 84, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,108,111, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0,144, 93, 92, 10, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,216, 65, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,108,111, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0,152, 69, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8093,42 +9276,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0,
- 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,
- 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65,
- 8, 1, 0, 0,244, 90, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
- 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
-128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
+192, 66, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
-144, 93, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0,
- 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,208, 94, 92, 10,
+ 68, 65, 84, 65, 64, 1, 0, 0,152, 69, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186, 40, 71, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 48, 0, 0, 0,208, 94, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+ 40, 71, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,188, 2, 0, 0, 48, 95, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,184, 99, 92, 10,168, 90, 92, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 82, 66,108,117,114, 0, 46, 48, 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2,
- 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 24, 98, 92, 10,
+ 66, 82, 0, 0,240, 2, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 88, 66, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,108,117,114, 0, 46,
+ 48, 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 63, 0, 0, 0, 0,232, 74, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 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, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8136,41 +9323,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 12, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,
-205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,124, 95, 92, 10, 32, 0, 0, 0,
- 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+ 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 16, 72, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 24, 98, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,
- 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 88, 99, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,232, 74, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,120, 76, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 88, 99, 92, 10, 80, 1, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63,
- 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,184, 99, 92, 10,
- 86, 1, 0, 0, 1, 0, 0, 0, 64,104, 92, 10, 48, 95, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,114,117,115,104, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 30, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,160,102, 92, 10, 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, 0,
- 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,120, 76, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 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, 63, 0, 0, 0, 0, 56, 80, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8178,11 +9370,11 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 35, 0, 0, 0,
- 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62,
- 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0, 4,100, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
+ 96, 77, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
@@ -8191,21 +9383,24 @@ char datatoc_startup_blend[]= {
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 16, 1, 0, 0,160,102, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,
-114, 97,255,186,224,103, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0, 56, 80, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186,200, 81, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,224,103, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 64,104, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,200,108, 92, 10,
-184, 99, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108, 97,121, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 3, 15, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 0, 40,107, 92, 10, 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, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+200, 81, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+248, 76, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108, 97,121, 0, 48,
+ 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,136, 85, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
@@ -8221,42 +9416,45 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 8, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,
-140,104, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+ 35, 0, 0, 0, 4, 4, 4, 8, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62,
+ 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,176, 82, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 40,107, 92, 10,
- 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,136, 85, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,104,108, 92, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 24, 87, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
-104,108, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63,
- 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,
-188, 2, 0, 0,200,108, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 80,113, 92, 10, 64,104, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 67,108,111,110,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,176,111, 92, 10, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 24, 87, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108,111,110,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 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, 63, 0, 0, 0, 0,216, 90, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8264,84 +9462,92 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 16, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 20,109, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+ 0, 88, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,176,111, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191,
- 54,189,194, 61, 14,215,126,191, 46,189,194, 61,240,112, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0,216, 90, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61,
+ 14,215,126,191, 46,189,194, 61,104, 92, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,240,112, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 80,113, 92, 10, 86, 1, 0, 0,
- 1, 0, 0, 0,216,117, 92, 10,200,108, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,114,101, 97,115,101, 0, 48, 48, 49,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 17, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 56,116, 92, 10, 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, 0, 0, 0, 0, 0,
- 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
-128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+104, 92, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+ 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+152, 87, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,114,101, 97,115,101,
+ 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 40, 96, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 6, 4, 0,
- 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63,
- 68, 65, 84, 65, 8, 1, 0, 0,156,113, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0,
- 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+ 35, 0, 0, 0, 4, 6, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62,
+ 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 80, 93, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65,
- 16, 1, 0, 0, 56,116, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,228, 97,175,190, 50,131,112, 63,218,243,127,191, 10,183,157,188,
-120,117, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 40, 96, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63,228, 97,175,190, 50,131,112, 63,218,243,127,191, 10,183,157,188,184, 97, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 48, 0, 0, 0,120,117, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 62, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215, 35, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,216,117, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 96,122, 92, 10, 80,113, 92, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,184, 97, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215, 35, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 68, 97,114,107,101,110, 0, 48, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 2, 18, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,
-192,120, 92, 10, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 1, 0, 0, 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, 63, 0, 0, 0, 0,120,101, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8349,41 +9555,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,
-102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 36,118, 92, 10,
- 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+160, 98, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,192,120, 92, 10, 82, 1, 0, 0,
- 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0,
- 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 0,122, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0,120,101, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61,
+ 14,215,126,191, 46,189,194, 61, 8,103, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 0,122, 92, 10,
- 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0,
- 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,
- 96,122, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,232,126, 92, 10,216,117, 92, 10, 5, 0,109, 0, 0, 0, 0, 0, 66, 82, 68,114,
- 97,119, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 30, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 72,125, 92, 10, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+ 8,103, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+ 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 56, 98, 1, 3, 0, 0, 0, 0, 5, 0,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 68,114, 97,119, 0, 46,
+ 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 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, 63, 0, 0, 0, 0,200,106, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8395,38 +9606,41 @@ char datatoc_startup_blend[]= {
35, 0, 0, 0, 0, 4, 0, 8, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62,
- 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,172,122, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,240,103, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 72,125, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
-224,255,127,191,114, 97,255,186,136,126, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,200,106, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 88,108, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,136,126, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,232,126, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,
-112,131, 92, 10, 96,122, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,105,108,108, 47, 68,101,101,112,101,110, 0, 48, 48,
- 49, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 19, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0,208,129, 92, 10, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 88,108, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,105,108,108, 47, 68,101,101,112,101,110, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0, 24,112, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8434,42 +9648,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0,
- 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,
- 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65,
- 8, 1, 0, 0, 52,127, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
- 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
-128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
+ 64,109, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
-208,129, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0,
- 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 16,131, 92, 10,
+ 68, 65, 84, 65, 64, 1, 0, 0, 24,112, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186,168,113, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 48, 0, 0, 0, 16,131, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+168,113, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,188, 2, 0, 0,112,131, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,248,135, 92, 10,232,126, 92, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 82, 70,108, 97,116,116,101,110, 47, 67,111,110,116,114, 97,115,116, 0, 48, 48, 49, 0, 0, 1, 0, 0, 3,
- 20, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 88,134, 92, 10,
+ 66, 82, 0, 0,240, 2, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+216,108, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,108, 97,116,116,101,
+110, 47, 67,111,110,116,114, 97,115,116, 0, 48, 48, 49, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,104,117, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 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, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8477,41 +9695,45 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,
-205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63,
- 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,188,131, 92, 10, 32, 0, 0, 0,
- 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+ 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,144,114, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 88,134, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,
-224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,152,135, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,104,117, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,248,118, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,152,135, 92, 10, 80, 1, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,
-143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,248,135, 92, 10,
- 86, 1, 0, 0, 1, 0, 0, 0,128,140, 92, 10,112,131, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 71,114, 97, 98, 0, 48,
- 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 21, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,224,138, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,248,118, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 71,114, 97, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0,184,122, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8519,11 +9741,12 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 75, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 68,136, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+224,119, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
@@ -8532,21 +9755,24 @@ char datatoc_startup_blend[]= {
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 16, 1, 0, 0,224,138, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,
-114, 97,255,186, 32,140, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0,184,122, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186, 72,124, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 32,140, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,128,140, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 8,145, 92, 10,
-248,135, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 73,110,102,108, 97,116,101, 47, 68,101,102,108, 97,116,101, 0, 48, 48,
- 49, 0, 0, 0, 1, 0, 0, 3, 22, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 0,104,143, 92, 10, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+ 72,124, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+120,119, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 73,110,102,108, 97,116,
+101, 47, 68,101,102,108, 97,116,101, 0, 48, 48, 49, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 8,128, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
@@ -8562,42 +9788,45 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0,128, 62, 0, 0,128, 62, 0, 0,128, 62, 68, 65, 84, 65, 8, 1, 0, 0,
-204,140, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+ 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0,128, 62,
+ 0, 0,128, 62, 0, 0,128, 62, 68, 65, 84, 65, 16, 1, 0, 0, 48,125, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,104,143, 92, 10,
- 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 8,128, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,168,144, 92, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,152,129, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
-168,144, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63,
- 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,
-188, 2, 0, 0, 8,145, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,144,149, 92, 10,128,140, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 76, 97,121,101,114, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 23, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,240,147, 92, 10, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,152,129, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76, 97,121,101,114, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0, 88,133, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8605,84 +9834,92 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 84,145, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+128,130, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,240,147, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191,
- 46, 95,255,186,224,255,127,191,114, 97,255,186, 48,149, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0, 88,133, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186,232,134, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 48,149, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,144,149, 92, 10, 86, 1, 0, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 8,145, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76,105,103,104,116,101,110, 0, 53, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 24, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,120,152, 92, 10, 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, 0, 0, 0, 0, 0,
- 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
-128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+232,134, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 24,130, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76,105,103,104,116,101,
+110, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 63, 0, 0, 0, 0,168,138, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 35, 0, 0, 0, 4, 4, 0, 0,
- 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 8, 1, 0, 0,220,149, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0,
- 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+ 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,208,135, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65,
- 16, 1, 0, 0,120,152, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,
-184,153, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,138, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 56,140, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 48, 0, 0, 0,184,153, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 24,154, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,160,158, 92, 10,144,149, 92, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,140, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 77,105,120, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 2, 25, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,
- 0,157, 92, 10, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 1, 0, 0, 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, 63, 0, 0, 0, 0,248,143, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8690,41 +9927,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,
-102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,100,154, 92, 10,
- 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+ 32,141, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 0,157, 92, 10, 82, 1, 0, 0,
- 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0,
- 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 64,158, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0,248,143, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61,
+ 14,215,126,191, 46,189,194, 61,136,145, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 64,158, 92, 10,
- 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0,
- 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,
-160,158, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 40,163, 92, 10, 24,154, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 77,117,
-108,116,105,112,108,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 26, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,136,161, 92, 10, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+136,145, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+ 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+184,140, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 77,117,108,116,105,112,
+108,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 63, 0, 0, 0, 0, 72,149, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8736,38 +9978,41 @@ char datatoc_startup_blend[]= {
35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,236,158, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,112,146, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,136,161, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61,
- 14,215,126,191, 46,189,194, 61,200,162, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 72,149, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,216,150, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,200,162, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 40,163, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,
-176,167, 92, 10,160,158, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 78,117,100,103,101, 0, 48, 48, 49, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 27, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0, 16,166, 92, 10, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,216,150, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 78,117,100,103,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0,152,154, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8775,42 +10020,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0,
- 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,
- 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 8, 1, 0, 0,116,163, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
- 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
-128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+192,151, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
- 16,166, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0,
- 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 80,167, 92, 10,
+ 68, 65, 84, 65, 64, 1, 0, 0,152,154, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186, 40,156, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 48, 0, 0, 0, 80,167, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+ 40,156, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,188, 2, 0, 0,176,167, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 56,172, 92, 10, 40,163, 92, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 82, 80,105,110, 99,104, 47, 77, 97,103,110,105,102,121, 0, 48, 48, 49, 0, 0, 0, 0, 0, 1, 0, 0, 3,
- 28, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,152,170, 92, 10,
+ 66, 82, 0, 0,240, 2, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 88,151, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 80,105,110, 99,104, 47,
+ 77, 97,103,110,105,102,121, 0, 48, 48, 49, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,232,159, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 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, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8818,41 +10067,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 6, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,
-205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0, 64, 63, 0, 0, 64, 63,
- 0, 0, 64, 63, 0, 0,128, 62, 0, 0,128, 62, 0, 0,128, 62, 68, 65, 84, 65, 8, 1, 0, 0,252,167, 92, 10, 32, 0, 0, 0,
- 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0,
+ 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0,128, 62,
+ 0, 0,128, 62, 0, 0,128, 62, 68, 65, 84, 65, 16, 1, 0, 0, 16,157, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,152,170, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,
-224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,216,171, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,232,159, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,120,161, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,216,171, 92, 10, 80, 1, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,
-143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 56,172, 92, 10,
- 86, 1, 0, 0, 1, 0, 0, 0,192,176, 92, 10,176,167, 92, 10, 65,119, 13, 0, 0, 0, 0, 0, 66, 82, 80,111,108,105,115,104,
- 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 20, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 32,175, 92, 10, 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, 0,
- 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,120,161, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 65,119, 13, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 80,111,108,105,115,104, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0, 56,165, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8860,11 +10114,11 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0,
- 4, 4, 4, 1, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63,
- 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,132,172, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 1, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
+ 96,162, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
@@ -8873,21 +10127,24 @@ char datatoc_startup_blend[]= {
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 16, 1, 0, 0, 32,175, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,
-114, 97,255,186, 96,176, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0, 56,165, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186,200,166, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 96,176, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,192,176, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 56,172, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83, 99,114, 97,112,101, 47, 80,101, 97,107,115, 0, 48, 48, 49, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 3, 29, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 0,168,179, 92, 10, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+200,166, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+248,161, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83, 99,114, 97,112,101,
+ 47, 80,101, 97,107,115, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,136,170, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
@@ -8903,42 +10160,45 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,
- 12,177, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+ 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,176,167, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,168,179, 92, 10,
- 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,136,170, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,232,180, 92, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 24,172, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
-232,180, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63,
- 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,
-188, 2, 0, 0, 72,181, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,208,185, 92, 10,192,176, 92, 10, 52,195, 13, 0, 0, 0, 0, 0,
- 66, 82, 83, 99,117,108,112,116, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 30, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 48,184, 92, 10, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 24,172, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 52,195, 13, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83, 99,117,108,112,116, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0,216,175, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8946,84 +10206,92 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,160,119, 78, 63, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62,
- 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,148,181, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,160,119, 78, 63,
+ 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
+ 0,173, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 48,184, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191,
- 46, 95,255,186,224,255,127,191,114, 97,255,186,112,185, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0,216,175, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186,104,177, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,112,185, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,208,185, 92, 10, 86, 1, 0, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 72,181, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,101, 97,114, 0, 48, 48, 49, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,184,188, 92, 10, 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, 0, 0, 0, 0, 0,
- 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
-128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+104,177, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+152,172, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,101, 97,114, 0,
+ 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 63, 0, 0, 0, 0, 40,181, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 35, 0, 0, 0, 4, 4, 0, 0,
- 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 8, 1, 0, 0, 28,186, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0,
- 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0,
+ 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 80,178, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65,
- 16, 1, 0, 0,184,188, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,
-248,189, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 40,181, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,184,182, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 48, 0, 0, 0,248,189, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 88,190, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,224,194, 92, 10,208,185, 92, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,184,182, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,111,111,116,104, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 3, 32, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,
- 64,193, 92, 10, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0,120,186, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9031,41 +10299,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 75, 0, 0, 0,
-102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0, 64, 63,
- 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,164,190, 92, 10,
- 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+160,183, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 64,193, 92, 10, 82, 1, 0, 0,
- 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0,
- 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,128,194, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0,120,186, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186, 8,188, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,128,194, 92, 10,
- 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0,
- 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,
-224,194, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,104,199, 92, 10, 88,190, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,110,
- 97,107,101, 32, 72,111,111,107, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 33, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,200,197, 92, 10, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+ 8,188, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 56,183, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,110, 97,107,101, 32,
+ 72,111,111,107, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,200,191, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9077,38 +10350,41 @@ char datatoc_startup_blend[]= {
75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 44,195, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,240,188, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,200,197, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
-224,255,127,191,114, 97,255,186, 8,199, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,200,191, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 88,193, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 8,199, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,104,199, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,
-240,203, 92, 10,224,194, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,111,102,116,101,110, 0, 48, 49, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0, 80,202, 92, 10, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 88,193, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,111,102,116,101,110, 0, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 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, 63, 0, 0, 0, 0, 24,197, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9116,42 +10392,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0,
- 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,
- 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 8, 1, 0, 0,180,199, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
- 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
-128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+ 64,194, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
- 80,202, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0,
- 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,144,203, 92, 10,
+ 68, 65, 84, 65, 64, 1, 0, 0, 24,197, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61,
+ 14,215,126,191, 46,189,194, 61,168,198, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 48, 0, 0, 0,144,203, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+168,198, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,188, 2, 0, 0,240,203, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,120,208, 92, 10,104,199, 92, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 82, 83,117, 98,116,114, 97, 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2,
- 35, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,216,206, 92, 10,
+ 66, 82, 0, 0,240, 2, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+216,193, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,117, 98,116,114, 97,
+ 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 63, 0, 0, 0, 0,104,202, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 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, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9159,41 +10439,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 12, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,
-205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 60,204, 92, 10, 32, 0, 0, 0,
- 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+ 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,144,199, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,216,206, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,
- 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 24,208, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,104,202, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,248,203, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 24,208, 92, 10, 80, 1, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63,
- 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,120,208, 92, 10,
- 86, 1, 0, 0, 1, 0, 0, 0, 0,213, 92, 10,240,203, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,101,120, 68,114, 97,
-119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 96,211, 92, 10, 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, 0,
- 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,248,203, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,101,120, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0,184,207, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9201,11 +10486,11 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 35, 0, 0, 0,
- 4, 4, 0, 8, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62,
- 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,196,208, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 35, 0, 0, 0, 4, 4, 0, 8, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
+224,204, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
@@ -9214,21 +10499,24 @@ char datatoc_startup_blend[]= {
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 16, 1, 0, 0, 96,211, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,
-114, 97,255,186,160,212, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0,184,207, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186, 72,209, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,160,212, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 0,213, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,136,217, 92, 10,
-120,208, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,104,117,109, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 3, 37, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 0,232,215, 92, 10, 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, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+ 72,209, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+120,204, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,104,117,109, 98, 0,
+ 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 8,213, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
@@ -9244,42 +10532,45 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 75, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,
- 76,213, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+ 75, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 48,210, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,232,215, 92, 10,
- 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 8,213, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 40,217, 92, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,152,214, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
- 40,217, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63,
- 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,
-188, 2, 0, 0,136,217, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,213, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 84,119,105,115,116, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 38, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,112,220, 92, 10, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,152,214, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,119,105,115,116, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0, 88,218, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9287,47 +10578,50 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2, 0, 75, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,212,217, 92, 10, 32, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 75, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+128,215, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,112,220, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191,
- 46, 95,255,186,224,255,127,191,114, 97,255,186,176,221, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0, 88,218, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186,232,219, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,176,221, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 85, 83, 69, 82,240, 12, 0, 0, 32, 31,246, 8,195, 0, 0, 0,
- 1, 0, 0, 0, 33, 8, 17, 1, 63, 2, 0, 0, 5, 0, 0, 0, 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+232,219, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 85, 83, 69, 82,112, 13, 0, 0, 32,163,141, 1, 0, 0, 0, 0,189, 0, 0, 0, 1, 0, 0, 0, 33, 8, 17, 1, 63, 2, 0, 0,
+ 5, 0, 0, 0, 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 85,115,101,114,115, 47,116,111,110, 47, 68,101,115,
-107,116,111,112, 47, 0, 45,112,111,119,101,114,112, 99, 47, 98,105,110, 47, 98,108,101,110,100,101,114, 46, 97,112,112, 47, 67,
-111,110,116,101,110,116,115, 47, 82,101,115,111,117,114, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 47, 47, 0, 85,115,101,114,115, 47,116,111,110, 47, 68,101,115,107,116,111,112, 47, 0, 45,112,111,119,101,114,
+112, 99, 47, 98,105,110, 47, 98,108,101,110,100,101,114, 46, 97,112,112, 47, 67,111,110,116,101,110,116,115, 47, 82,101,115,111,
+117,114, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9346,8 +10640,8 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9366,56 +10660,61 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 2, 0, 94, 1, 8, 0, 0, 0,
- 3, 0, 0, 0, 56, 52, 39, 1, 0, 0, 0, 0, 2, 0, 2, 0, 0, 8, 0, 0, 2, 0, 0, 0, 68,172, 0, 0, 36, 0, 0, 0,
- 2, 0, 0, 0,128, 0, 0, 0, 72, 0, 0, 0, 0, 0, 64, 0, 5, 0, 2, 0, 48,235, 92, 10, 48,235, 92, 10,104, 69, 85, 10,
-104, 69, 85, 10,168, 70, 85, 10,168, 70, 85, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0,
- 1, 0, 2, 0, 25, 0, 1, 0, 20, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 30, 90,100,191,154,153,153, 62,102,102,102, 63,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31,250,254, 62, 9, 0, 0, 63,156,153, 25, 63, 0, 0, 0, 0,205,204, 76, 62,
-205,204, 76, 62,205,204, 76, 62, 0, 0,128, 63, 44,135, 22, 63, 32,133,235, 62,184,243,125, 62, 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,195, 73, 76, 63, 42,135, 86, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 43,135, 61, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 16, 47, 93, 62, 58,180,200,190, 24, 47, 93,190, 0, 0, 0, 0, 14, 0, 0, 0, 25, 0, 15, 0,120, 0, 60, 0,
- 3, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,144, 31, 15, 0, 6, 0, 25, 0, 8, 0, 10, 0,200, 0, 0, 0,100, 0,100, 0,
- 0, 0, 0, 0, 2, 0, 1, 0, 10, 0, 50, 0,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 29, 0, 0, 48,235, 92, 10,
-192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,101,102, 97,117,108,116, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 2, 0, 94, 1, 8, 0, 0, 0, 3, 0, 0, 0, 56, 52, 39, 1, 0, 0, 0, 0,
+ 6, 0, 2, 0, 0, 8, 0, 0, 2, 0, 0, 0, 68,172, 0, 0, 36, 0, 0, 0, 2, 0, 0, 0,128, 0, 0, 0, 72, 0, 0, 0,
+ 0, 0, 64, 0, 5, 0, 2, 0, 40,234, 1, 3, 0, 0, 0, 0, 40,234, 1, 3, 0, 0, 0, 0,184, 74, 14, 3, 0, 0, 0, 0,
+184, 74, 14, 3, 0, 0, 0, 0, 56,198, 14, 3, 0, 0, 0, 0, 56,198, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232, 62, 1, 3, 0, 0, 0, 0,232, 52,219, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 2, 0,
+ 25, 0, 1, 0, 20, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 30, 90,100,191,154,153,153, 62,102,102,102, 63, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 31,250,254, 62, 9, 0, 0, 63,156,153, 25, 63, 0, 0, 0, 0,205,204, 76, 62,205,204, 76, 62,
+205,204, 76, 62, 0, 0,128, 63, 44,135, 22, 63, 32,133,235, 62,184,243,125, 62, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+195, 73, 76, 63, 42,135, 86, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 43,135, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 16, 47, 93, 62, 58,180,200,190, 24, 47, 93,190, 0, 0, 0, 0, 14, 0, 0, 0, 25, 0, 15, 0,120, 0, 60, 0, 3, 0, 5, 0,
+128, 0, 0, 0, 0, 0, 0, 0,144, 31, 15, 0, 6, 0, 25, 0, 8, 0, 10, 0,200, 0, 0, 0,100, 0,100, 0, 0, 0, 0, 0,
+ 2, 0, 1, 0, 10, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 30, 0, 0, 40,234, 1, 3, 0, 0, 0, 0,186, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,101,102, 97,117,108,116, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255,
0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255,
0, 0, 0,255,255,255,255,255, 1, 0, 15, 0,241,255, 0, 0, 25, 25, 25,255,153,153,153,255,153,153,153,255, 90, 90, 90,255,
@@ -9441,18 +10740,19 @@ char datatoc_startup_blend[]= {
130,130,130,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255,
0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,
255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
-144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
+255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,
+200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
+240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
+240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,
- 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,
-255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
-204, 0,153,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
+255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255,
+ 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
+255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,204, 0,153,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
+ 32, 0, 0,255, 0, 32, 0,255, 0, 0,128,255, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,
255,255,255,255, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,
240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9463,18 +10763,19 @@ char datatoc_startup_blend[]= {
102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
160,160,160,100,127,112,112,100,255,140, 25,255,250,250,250,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,130,130,130,255,
8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,
-255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,
-200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
-240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
-240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-250,250,250,255,250,250,250,255,250,250,250,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255,
- 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
-255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
+255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
+ 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
+144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250,250,250,255,250,250,250,255,250,250,250,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100,
+ 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,
+255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
+ 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,
128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,
128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0,
@@ -9486,18 +10787,19 @@ char datatoc_startup_blend[]= {
165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255,
0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,
255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
-144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
+255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,
+200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
+240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
+240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100,
- 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,
-255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
- 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
+255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100, 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255,
+ 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
+255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,
0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,
240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9508,18 +10810,19 @@ char datatoc_startup_blend[]= {
102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255,
79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,
-255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,
-200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
-240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
-240,255, 64,255, 64,192, 48,255,240,144,160,255, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255,255,255,128, 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255,
- 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
-255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
+255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255,
+ 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
+144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 82, 96,110,255,
+124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100,
+ 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,
+255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
+ 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, 96,192, 64,255,144,144, 0,255,
128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,
128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0,
@@ -9531,18 +10834,19 @@ char datatoc_startup_blend[]= {
165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255,
0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,
255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
-144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81,105,135,255,109, 88,129,255, 78,152, 62,255, 46,143,143,255,
-169, 84,124,255,126,126, 80,255,162, 95,111,255,109,145,131,255,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 53,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,
- 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,
-255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
- 0, 0, 0, 0,255,255,255, 10,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
+255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,
+200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
+240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
+240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 81,105,135,255,109, 88,129,255, 78,152, 62,255, 46,143,143,255,169, 84,124,255,126,126, 80,255,162, 95,111,255,109,145,131,255,
+255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 53,255, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255,
+ 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
+255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0,255,255,255, 10,255,133, 0, 60,255,133, 0,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,
0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,
240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9553,18 +10857,19 @@ char datatoc_startup_blend[]= {
165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,132,132,132,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
94, 94, 94,255,172,172,172,255, 17, 27, 60,100, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,195,195,195,255,
8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,
-255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,
-200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
-240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
-240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
+ 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
+144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153,153,153,255, 0, 0, 0, 0,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,143,143,143,255,198,119,119,255,255, 0, 0,255, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255,
- 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
-255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,153,153,153,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,143,143,143,255,198,119,119,255,
+255, 0, 0,255, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,
+255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
+ 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,
128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,
128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9576,18 +10881,19 @@ char datatoc_startup_blend[]= {
165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255,
0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,
255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
-144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
+255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,
+200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
+240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
+240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100,
- 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,
-255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
- 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
+255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100, 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255,
+ 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
+255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,
0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,
240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9598,18 +10904,19 @@ char datatoc_startup_blend[]= {
165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255,
8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,255,255,255,219, 37, 18,255,
-255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,
-200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
-240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
-240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0,155,155,155,160,100,100,100,255,108,105,111,255,104,106,117,255,105,117,110,255,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,100,100,255, 0, 0, 0, 0,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255,
- 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
-255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
+255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
+ 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
+144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0,155,155,155,160,
+100,100,100,255,108,105,111,255,104,106,117,255,105,117,110,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,100,100,100,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,
+ 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,
+255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
+ 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,
128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,
128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9621,18 +10928,19 @@ char datatoc_startup_blend[]= {
165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255,
0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,
255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
-144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
+255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,
+200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
+240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
+240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,
- 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,
-255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
- 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
+255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255,
+ 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
+255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,
0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,
240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 96,128,255,255,255,255,255,255, 0,170, 0,255,220, 96, 96,255,220, 96, 96,255,
@@ -9648,9 +10956,35 @@ char datatoc_startup_blend[]= {
131, 67, 38,255,139, 88, 17,255,189,106, 17,255, 0, 0, 0, 0, 8, 49, 14,255, 28, 67, 11,255, 52, 98, 43,255, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 78, 65, 49,192,226, 0, 0,
- 80,179, 85, 10, 0, 0, 0, 0, 1, 0, 0, 0, 83, 68, 78, 65, 78, 65, 77, 69,204, 11, 0, 0, 42,110,101,120,116, 0, 42,112,
-114,101,118, 0, 42,100, 97,116, 97, 0, 42,102,105,114,115,116, 0, 42,108, 97,115,116, 0,120, 0,121, 0,122, 0,119, 0,120,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,
+232, 62, 1, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0,136, 63, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+105,111, 95,115, 99,101,110,101, 95, 51,100,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 80, 0, 0, 0,136, 63, 1, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0,200, 8, 2, 3, 0, 0, 0, 0,
+232, 62, 1, 3, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95,102, 98,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,200, 8, 2, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0,
+104, 9, 2, 3, 0, 0, 0, 0,136, 63, 1, 3, 0, 0, 0, 0,105,111, 95, 97,110,105,109, 95, 98,118,104, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,104, 9, 2, 3, 0, 0, 0, 0,
+187, 0, 0, 0, 1, 0, 0, 0, 8, 10, 2, 3, 0, 0, 0, 0,200, 8, 2, 3, 0, 0, 0, 0,105,111, 95, 97,110,105,109, 95,
+ 99, 97,109,101,114, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,
+ 8, 10, 2, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0,168, 10, 2, 3, 0, 0, 0, 0,104, 9, 2, 3, 0, 0, 0, 0,
+105,111, 95,109,101,115,104, 95,112,108,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 80, 0, 0, 0,168, 10, 2, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0, 72, 11, 2, 3, 0, 0, 0, 0,
+ 8, 10, 2, 3, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95,111, 98,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0, 72, 11, 2, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0,
+232, 52,219, 4, 0, 0, 0, 0,168, 10, 2, 3, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95,120, 51,100, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,232, 52,219, 4, 0, 0, 0, 0,
+187, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 11, 2, 3, 0, 0, 0, 0,105,111, 95,109,101,115,104, 95,
+115,116,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 78, 65, 49,120,227, 0, 0,
+168,160,120, 4, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 83, 68, 78, 65, 78, 65, 77, 69,228, 11, 0, 0, 42,110,101,120,
+116, 0, 42,112,114,101,118, 0, 42,100, 97,116, 97, 0, 42,102,105,114,115,116, 0, 42,108, 97,115,116, 0,120, 0,121, 0,120,
109,105,110, 0,120,109, 97,120, 0,121,109,105,110, 0,121,109, 97,120, 0, 42,112,111,105,110,116,101,114, 0,103,114,111,117,
112, 0,118, 97,108, 0,118, 97,108, 50, 0,116,121,112,101, 0,115,117, 98,116,121,112,101, 0,102,108, 97,103, 0,110, 97,109,
101, 91, 51, 50, 93, 0,115, 97,118,101,100, 0,100, 97,116, 97, 0,108,101,110, 0,116,111,116, 97,108,108,101,110, 0, 42,110,
@@ -9675,1794 +11009,1799 @@ char datatoc_startup_blend[]= {
95,108,101,110, 0, 42, 99,111,109,112,105,108,101,100, 0,109,116,105,109,101, 0,115,105,122,101, 0,115,101,101,107, 0,112,
97,115,115,101,112, 97,114,116, 97,108,112,104, 97, 0, 99,108,105,112,115,116, 97, 0, 99,108,105,112,101,110,100, 0,108,101,
110,115, 0,111,114,116,104,111, 95,115, 99, 97,108,101, 0,100,114, 97,119,115,105,122,101, 0,115,104,105,102,116,120, 0,115,
-104,105,102,116,121, 0, 89, 70, 95,100,111,102,100,105,115,116, 0, 42,100,111,102, 95,111, 98, 0,102,114, 97,109,101,110,114,
- 0,102,114, 97,109,101,115, 0,111,102,102,115,101,116, 0,115,102,114, 97, 0,102,105,101, 95,105,109, 97, 0, 99,121, 99,108,
- 0,111,107, 0,109,117,108,116,105, 95,105,110,100,101,120, 0,108, 97,121,101,114, 0,112, 97,115,115, 0,109,101,110,117,110,
-114, 0, 42,115, 99,101,110,101, 0,105, 98,117,102,115, 0, 42,103,112,117,116,101,120,116,117,114,101, 0, 42, 97,110,105,109,
- 0, 42,114,114, 0, 42,114,101,110,100,101,114,115, 91, 56, 93, 0,114,101,110,100,101,114, 95,115,108,111,116, 0,108, 97,115,
-116, 95,114,101,110,100,101,114, 95,115,108,111,116, 0,115,111,117,114, 99,101, 0,108, 97,115,116,102,114, 97,109,101, 0,116,
-112, 97,103,101,102,108, 97,103, 0,116,111,116, 98,105,110,100, 0,120,114,101,112, 0,121,114,101,112, 0,116,119,115,116, 97,
- 0,116,119,101,110,100, 0, 98,105,110,100, 99,111,100,101, 0, 42,114,101,112, 98,105,110,100, 0, 42,112, 97, 99,107,101,100,
-102,105,108,101, 0, 42,112,114,101,118,105,101,119, 0,108, 97,115,116,117,112,100, 97,116,101, 0,108, 97,115,116,117,115,101,
-100, 0, 97,110,105,109,115,112,101,101,100, 0,103,101,110, 95,120, 0,103,101,110, 95,121, 0,103,101,110, 95,116,121,112,101,
- 0, 97,115,112,120, 0, 97,115,112,121, 0,116,101,120, 99,111, 0,109, 97,112,116,111, 0,109, 97,112,116,111,110,101,103, 0,
- 98,108,101,110,100,116,121,112,101, 0, 42,111, 98,106,101, 99,116, 0, 42,116,101,120, 0,117,118,110, 97,109,101, 91, 51, 50,
- 93, 0,112,114,111,106,120, 0,112,114,111,106,121, 0,112,114,111,106,122, 0,109, 97,112,112,105,110,103, 0,111,102,115, 91,
- 51, 93, 0,115,105,122,101, 91, 51, 93, 0,114,111,116, 0,116,101,120,102,108, 97,103, 0, 99,111,108,111,114,109,111,100,101,
-108, 0,112,109, 97,112,116,111, 0,112,109, 97,112,116,111,110,101,103, 0,110,111,114,109, 97,112,115,112, 97, 99,101, 0,119,
-104,105, 99,104, 95,111,117,116,112,117,116, 0, 98,114,117,115,104, 95,109, 97,112, 95,109,111,100,101, 0,112, 97,100, 91, 55,
- 93, 0,114, 0,103, 0, 98, 0,107, 0,100,101,102, 95,118, 97,114, 0, 99,111,108,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,
-110,111,114,102, 97, 99, 0,100,105,115,112,102, 97, 99, 0,119, 97,114,112,102, 97, 99, 0, 99,111,108,115,112,101, 99,102, 97,
- 99, 0,109,105,114,114,102, 97, 99, 0, 97,108,112,104, 97,102, 97, 99, 0,100,105,102,102,102, 97, 99, 0,115,112,101, 99,102,
- 97, 99, 0,101,109,105,116,102, 97, 99, 0,104, 97,114,100,102, 97, 99, 0,114, 97,121,109,105,114,114,102, 97, 99, 0,116,114,
- 97,110,115,108,102, 97, 99, 0, 97,109, 98,102, 97, 99, 0, 99,111,108,101,109,105,116,102, 97, 99, 0, 99,111,108,114,101,102,
-108,102, 97, 99, 0, 99,111,108,116,114, 97,110,115,102, 97, 99, 0,100,101,110,115,102, 97, 99, 0,115, 99, 97,116,116,101,114,
-102, 97, 99, 0,114,101,102,108,102, 97, 99, 0,116,105,109,101,102, 97, 99, 0,108,101,110,103,116,104,102, 97, 99, 0, 99,108,
-117,109,112,102, 97, 99, 0,107,105,110,107,102, 97, 99, 0,114,111,117,103,104,102, 97, 99, 0,112, 97,100,101,110,115,102, 97,
- 99, 0,108,105,102,101,102, 97, 99, 0,115,105,122,101,102, 97, 99, 0,105,118,101,108,102, 97, 99, 0,112,118,101,108,102, 97,
- 99, 0,115,104, 97,100,111,119,102, 97, 99, 0,122,101,110,117,112,102, 97, 99, 0,122,101,110,100,111,119,110,102, 97, 99, 0,
- 98,108,101,110,100,102, 97, 99, 0,110, 97,109,101, 91, 49, 54, 48, 93, 0, 42,104, 97,110,100,108,101, 0, 42,112,110, 97,109,
-101, 0, 42,115,116,110, 97,109,101,115, 0,115,116,121,112,101,115, 0,118, 97,114,115, 0, 42,118, 97,114,115,116,114, 0, 42,
-114,101,115,117,108,116, 0, 42, 99,102,114, 97, 0,100, 97,116, 97, 91, 51, 50, 93, 0, 40, 42,100,111,105,116, 41, 40, 41, 0,
- 40, 42,105,110,115,116, 97,110, 99,101, 95,105,110,105,116, 41, 40, 41, 0, 40, 42, 99, 97,108,108, 98, 97, 99,107, 41, 40, 41,
- 0,118,101,114,115,105,111,110, 0, 97, 0,105,112,111,116,121,112,101, 0, 42,105,109, 97, 0, 42, 99,117, 98,101, 91, 54, 93,
- 0,105,109, 97,116, 91, 52, 93, 91, 52, 93, 0,111, 98,105,109, 97,116, 91, 51, 93, 91, 51, 93, 0,115,116,121,112,101, 0,118,
-105,101,119,115, 99, 97,108,101, 0,110,111,116,108, 97,121, 0, 99,117, 98,101,114,101,115, 0,100,101,112,116,104, 0,114,101,
- 99, 97,108, 99, 0,108, 97,115,116,115,105,122,101, 0,102, 97,108,108,111,102,102, 95,116,121,112,101, 0,102, 97,108,108,111,
-102,102, 95,115,111,102,116,110,101,115,115, 0,114, 97,100,105,117,115, 0, 99,111,108,111,114, 95,115,111,117,114, 99,101, 0,
-116,111,116,112,111,105,110,116,115, 0,112,100,112, 97,100, 0,112,115,121,115, 0,112,115,121,115, 95, 99, 97, 99,104,101, 95,
-115,112, 97, 99,101, 0,111, 98, 95, 99, 97, 99,104,101, 95,115,112, 97, 99,101, 0, 42,112,111,105,110,116, 95,116,114,101,101,
- 0, 42,112,111,105,110,116, 95,100, 97,116, 97, 0,110,111,105,115,101, 95,115,105,122,101, 0,110,111,105,115,101, 95,100,101,
-112,116,104, 0,110,111,105,115,101, 95,105,110,102,108,117,101,110, 99,101, 0,110,111,105,115,101, 95, 98, 97,115,105,115, 0,
-112,100,112, 97,100, 51, 91, 51, 93, 0,110,111,105,115,101, 95,102, 97, 99, 0,115,112,101,101,100, 95,115, 99, 97,108,101, 0,
- 42, 99,111, 98, 97, 0,114,101,115,111,108, 91, 51, 93, 0,105,110,116,101,114,112, 95,116,121,112,101, 0,102,105,108,101, 95,
-102,111,114,109, 97,116, 0,101,120,116,101,110,100, 0,115,109,111,107,101,100, 95,116,121,112,101, 0,105,110,116, 95,109,117,
-108,116,105,112,108,105,101,114, 0,115,116,105,108,108, 95,102,114, 97,109,101, 0,115,111,117,114, 99,101, 95,112, 97,116,104,
- 91, 50, 52, 48, 93, 0, 42,100, 97,116, 97,115,101,116, 0, 99, 97, 99,104,101,100,102,114, 97,109,101, 0,110,111,105,115,101,
-115,105,122,101, 0,116,117,114, 98,117,108, 0, 98,114,105,103,104,116, 0, 99,111,110,116,114, 97,115,116, 0,115, 97,116,117,
-114, 97,116,105,111,110, 0,114,102, 97, 99, 0,103,102, 97, 99, 0, 98,102, 97, 99, 0,102,105,108,116,101,114,115,105,122,101,
- 0,109,103, 95, 72, 0,109,103, 95,108, 97, 99,117,110, 97,114,105,116,121, 0,109,103, 95,111, 99,116, 97,118,101,115, 0,109,
-103, 95,111,102,102,115,101,116, 0,109,103, 95,103, 97,105,110, 0,100,105,115,116, 95, 97,109,111,117,110,116, 0,110,115, 95,
-111,117,116,115, 99, 97,108,101, 0,118,110, 95,119, 49, 0,118,110, 95,119, 50, 0,118,110, 95,119, 51, 0,118,110, 95,119, 52,
- 0,118,110, 95,109,101,120,112, 0,118,110, 95,100,105,115,116,109, 0,118,110, 95, 99,111,108,116,121,112,101, 0,110,111,105,
-115,101,100,101,112,116,104, 0,110,111,105,115,101,116,121,112,101, 0,110,111,105,115,101, 98, 97,115,105,115, 0,110,111,105,
-115,101, 98, 97,115,105,115, 50, 0,105,109, 97,102,108, 97,103, 0, 99,114,111,112,120,109,105,110, 0, 99,114,111,112,121,109,
-105,110, 0, 99,114,111,112,120,109, 97,120, 0, 99,114,111,112,121,109, 97,120, 0,116,101,120,102,105,108,116,101,114, 0, 97,
-102,109, 97,120, 0,120,114,101,112,101, 97,116, 0,121,114,101,112,101, 97,116, 0, 99,104,101, 99,107,101,114,100,105,115,116,
- 0,110, 97, 98,108, 97, 0,105,117,115,101,114, 0, 42,110,111,100,101,116,114,101,101, 0, 42,112,108,117,103,105,110, 0, 42,
-101,110,118, 0, 42,112,100, 0, 42,118,100, 0,117,115,101, 95,110,111,100,101,115, 0,108,111, 99, 91, 51, 93, 0,114,111,116,
- 91, 51, 93, 0,109, 97,116, 91, 52, 93, 91, 52, 93, 0,109,105,110, 91, 51, 93, 0,109, 97,120, 91, 51, 93, 0,109,111,100,101,
- 0,116,111,116,101,120, 0,115,104,100,119,114, 0,115,104,100,119,103, 0,115,104,100,119, 98, 0,115,104,100,119,112, 97,100,
- 0,101,110,101,114,103,121, 0,100,105,115,116, 0,115,112,111,116,115,105,122,101, 0,115,112,111,116, 98,108,101,110,100, 0,
-104, 97,105,110,116, 0, 97,116,116, 49, 0, 97,116,116, 50, 0, 42, 99,117,114,102, 97,108,108,111,102,102, 0,115,104, 97,100,
-115,112,111,116,115,105,122,101, 0, 98,105, 97,115, 0,115,111,102,116, 0, 99,111,109,112,114,101,115,115,116,104,114,101,115,
-104, 0,112, 97,100, 53, 91, 51, 93, 0, 98,117,102,115,105,122,101, 0,115, 97,109,112, 0, 98,117,102,102,101,114,115, 0,102,
-105,108,116,101,114,116,121,112,101, 0, 98,117,102,102,108, 97,103, 0, 98,117,102,116,121,112,101, 0,114, 97,121, 95,115, 97,
-109,112, 0,114, 97,121, 95,115, 97,109,112,121, 0,114, 97,121, 95,115, 97,109,112,122, 0,114, 97,121, 95,115, 97,109,112, 95,
-116,121,112,101, 0, 97,114,101, 97, 95,115,104, 97,112,101, 0, 97,114,101, 97, 95,115,105,122,101, 0, 97,114,101, 97, 95,115,
-105,122,101,121, 0, 97,114,101, 97, 95,115,105,122,101,122, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0,114, 97,121,
- 95,115, 97,109,112, 95,109,101,116,104,111,100, 0,116,101,120, 97, 99,116, 0,115,104, 97,100,104, 97,108,111,115,116,101,112,
- 0,115,117,110, 95,101,102,102,101, 99,116, 95,116,121,112,101, 0,115,107,121, 98,108,101,110,100,116,121,112,101, 0,104,111,
-114,105,122,111,110, 95, 98,114,105,103,104,116,110,101,115,115, 0,115,112,114,101, 97,100, 0,115,117,110, 95, 98,114,105,103,
-104,116,110,101,115,115, 0,115,117,110, 95,115,105,122,101, 0, 98, 97, 99,107,115, 99, 97,116,116,101,114,101,100, 95,108,105,
-103,104,116, 0,115,117,110, 95,105,110,116,101,110,115,105,116,121, 0, 97,116,109, 95,116,117,114, 98,105,100,105,116,121, 0,
- 97,116,109, 95,105,110,115, 99, 97,116,116,101,114,105,110,103, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,101,120,116,105,
-110, 99,116,105,111,110, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,100,105,115,116, 97,110, 99,101, 95,102, 97, 99,116,111,
-114, 0,115,107,121, 98,108,101,110,100,102, 97, 99, 0,115,107,121, 95,101,120,112,111,115,117,114,101, 0,115,107,121, 95, 99,
-111,108,111,114,115,112, 97, 99,101, 0,112, 97,100, 52, 91, 54, 93, 0, 42,109,116,101,120, 91, 49, 56, 93, 0,112,114, 95,116,
-101,120,116,117,114,101, 0,112, 97,100, 54, 91, 54, 93, 0,100,101,110,115,105,116,121, 0,101,109,105,115,115,105,111,110, 0,
-115, 99, 97,116,116,101,114,105,110,103, 0,114,101,102,108,101, 99,116,105,111,110, 0,101,109,105,115,115,105,111,110, 95, 99,
-111,108, 91, 51, 93, 0,116,114, 97,110,115,109,105,115,115,105,111,110, 95, 99,111,108, 91, 51, 93, 0,114,101,102,108,101, 99,
-116,105,111,110, 95, 99,111,108, 91, 51, 93, 0,100,101,110,115,105,116,121, 95,115, 99, 97,108,101, 0,100,101,112,116,104, 95,
- 99,117,116,111,102,102, 0, 97,115,121,109,109,101,116,114,121, 0,115,116,101,112,115,105,122,101, 95,116,121,112,101, 0,115,
-104, 97,100,101,102,108, 97,103, 0,115,104, 97,100,101, 95,116,121,112,101, 0,112,114,101, 99, 97, 99,104,101, 95,114,101,115,
-111,108,117,116,105,111,110, 0,115,116,101,112,115,105,122,101, 0,109,115, 95,100,105,102,102, 0,109,115, 95,105,110,116,101,
-110,115,105,116,121, 0,109,115, 95,115,112,114,101, 97,100, 0,109, 97,116,101,114,105, 97,108, 95,116,121,112,101, 0,115,112,
-101, 99,114, 0,115,112,101, 99,103, 0,115,112,101, 99, 98, 0,109,105,114,114, 0,109,105,114,103, 0,109,105,114, 98, 0, 97,
-109, 98,114, 0, 97,109, 98, 98, 0, 97,109, 98,103, 0, 97,109, 98, 0,101,109,105,116, 0, 97,110,103, 0,115,112,101, 99,116,
-114, 97, 0,114, 97,121, 95,109,105,114,114,111,114, 0, 97,108,112,104, 97, 0,114,101,102, 0,115,112,101, 99, 0,122,111,102,
-102,115, 0, 97,100,100, 0,116,114, 97,110,115,108,117, 99,101,110, 99,121, 0,118,111,108, 0,102,114,101,115,110,101,108, 95,
-109,105,114, 0,102,114,101,115,110,101,108, 95,109,105,114, 95,105, 0,102,114,101,115,110,101,108, 95,116,114, 97, 0,102,114,
-101,115,110,101,108, 95,116,114, 97, 95,105, 0,102,105,108,116,101,114, 0,116,120, 95,108,105,109,105,116, 0,116,120, 95,102,
- 97,108,108,111,102,102, 0,114, 97,121, 95,100,101,112,116,104, 0,114, 97,121, 95,100,101,112,116,104, 95,116,114, 97, 0,104,
- 97,114, 0,115,101,101,100, 49, 0,115,101,101,100, 50, 0,103,108,111,115,115, 95,109,105,114, 0,103,108,111,115,115, 95,116,
-114, 97, 0,115, 97,109,112, 95,103,108,111,115,115, 95,109,105,114, 0,115, 97,109,112, 95,103,108,111,115,115, 95,116,114, 97,
- 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 95,109,105,114, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 95,116,
-114, 97, 0, 97,110,105,115,111, 95,103,108,111,115,115, 95,109,105,114, 0,100,105,115,116, 95,109,105,114, 0,102, 97,100,101,
-116,111, 95,109,105,114, 0,115,104, 97,100,101, 95,102,108, 97,103, 0,109,111,100,101, 95,108, 0,102,108, 97,114,101, 99, 0,
-115,116, 97,114, 99, 0,108,105,110,101, 99, 0,114,105,110,103, 99, 0,104, 97,115,105,122,101, 0,102,108, 97,114,101,115,105,
-122,101, 0,115,117, 98,115,105,122,101, 0,102,108, 97,114,101, 98,111,111,115,116, 0,115,116,114, 97,110,100, 95,115,116, 97,
- 0,115,116,114, 97,110,100, 95,101,110,100, 0,115,116,114, 97,110,100, 95,101, 97,115,101, 0,115,116,114, 97,110,100, 95,115,
-117,114,102,110,111,114, 0,115,116,114, 97,110,100, 95,109,105,110, 0,115,116,114, 97,110,100, 95,119,105,100,116,104,102, 97,
-100,101, 0,115,116,114, 97,110,100, 95,117,118,110, 97,109,101, 91, 51, 50, 93, 0,115, 98,105, 97,115, 0,108, 98,105, 97,115,
- 0,115,104, 97,100, 95, 97,108,112,104, 97, 0,115,101,112,116,101,120, 0,114,103, 98,115,101,108, 0,112,114, 95,116,121,112,
-101, 0,112,114, 95, 98, 97, 99,107, 0,112,114, 95,108, 97,109,112, 0,109,108, 95,102,108, 97,103, 0,100,105,102,102, 95,115,
-104, 97,100,101,114, 0,115,112,101, 99, 95,115,104, 97,100,101,114, 0,114,111,117,103,104,110,101,115,115, 0,114,101,102,114,
- 97, 99, 0,112, 97,114, 97,109, 91, 52, 93, 0,114,109,115, 0,100, 97,114,107,110,101,115,115, 0, 42,114, 97,109,112, 95, 99,
-111,108, 0, 42,114, 97,109,112, 95,115,112,101, 99, 0,114, 97,109,112,105,110, 95, 99,111,108, 0,114, 97,109,112,105,110, 95,
-115,112,101, 99, 0,114, 97,109,112, 98,108,101,110,100, 95, 99,111,108, 0,114, 97,109,112, 98,108,101,110,100, 95,115,112,101,
- 99, 0,114, 97,109,112, 95,115,104,111,119, 0,112, 97,100, 51, 0,114, 97,109,112,102, 97, 99, 95, 99,111,108, 0,114, 97,109,
-112,102, 97, 99, 95,115,112,101, 99, 0, 42,103,114,111,117,112, 0,102,114,105, 99,116,105,111,110, 0,102,104, 0,114,101,102,
-108,101, 99,116, 0,102,104,100,105,115,116, 0,120,121,102,114,105, 99,116, 0,100,121,110, 97,109,111,100,101, 0,115,115,115,
- 95,114, 97,100,105,117,115, 91, 51, 93, 0,115,115,115, 95, 99,111,108, 91, 51, 93, 0,115,115,115, 95,101,114,114,111,114, 0,
-115,115,115, 95,115, 99, 97,108,101, 0,115,115,115, 95,105,111,114, 0,115,115,115, 95, 99,111,108,102, 97, 99, 0,115,115,115,
- 95,116,101,120,102, 97, 99, 0,115,115,115, 95,102,114,111,110,116, 0,115,115,115, 95, 98, 97, 99,107, 0,115,115,115, 95,102,
-108, 97,103, 0,115,115,115, 95,112,114,101,115,101,116, 0,109, 97,112,116,111, 95,116,101,120,116,117,114,101,100, 0,112, 97,
-100, 52, 0,103,112,117,109, 97,116,101,114,105, 97,108, 0,110, 97,109,101, 91, 50, 53, 54, 93, 0, 42, 98, 98, 0,105, 49, 0,
-106, 49, 0,107, 49, 0,105, 50, 0,106, 50, 0,107, 50, 0,115,101,108, 99,111,108, 49, 0,115,101,108, 99,111,108, 50, 0,113,
-117, 97,116, 91, 52, 93, 0,101,120,112,120, 0,101,120,112,121, 0,101,120,112,122, 0,114, 97,100, 0,114, 97,100, 50, 0,115,
- 0, 42,109, 97,116, 0, 42,105,109, 97,116, 0,101,108,101,109,115, 0,100,105,115,112, 0, 42,101,100,105,116,101,108,101,109,
-115, 0, 42, 42,109, 97,116, 0,102,108, 97,103, 50, 0,116,111,116, 99,111,108, 0,119,105,114,101,115,105,122,101, 0,114,101,
-110,100,101,114,115,105,122,101, 0,116,104,114,101,115,104, 0, 42,108, 97,115,116,101,108,101,109, 0,118,101, 99, 91, 51, 93,
- 91, 51, 93, 0, 97,108,102, 97, 0,119,101,105,103,104,116, 0,104, 49, 0,104, 50, 0,102, 49, 0,102, 50, 0,102, 51, 0,104,
-105,100,101, 0,118,101, 99, 91, 52, 93, 0,109, 97,116, 95,110,114, 0,112,110,116,115,117, 0,112,110,116,115,118, 0,114,101,
-115,111,108,117, 0,114,101,115,111,108,118, 0,111,114,100,101,114,117, 0,111,114,100,101,114,118, 0,102,108, 97,103,117, 0,
-102,108, 97,103,118, 0, 42,107,110,111,116,115,117, 0, 42,107,110,111,116,115,118, 0,116,105,108,116, 95,105,110,116,101,114,
-112, 0,114, 97,100,105,117,115, 95,105,110,116,101,114,112, 0, 99,104, 97,114,105,100,120, 0,107,101,114,110, 0,104, 0,110,
-117,114, 98,115, 0, 42,107,101,121,105,110,100,101,120, 0,110,117,114, 98, 0, 42,101,100,105,116,110,117,114, 98, 0, 42, 98,
-101,118,111, 98,106, 0, 42,116, 97,112,101,114,111, 98,106, 0, 42,116,101,120,116,111,110, 99,117,114,118,101, 0, 42,112, 97,
-116,104, 0, 42,107,101,121, 0, 98,101,118, 0,100,114, 97,119,102,108, 97,103, 0,116,119,105,115,116, 95,109,111,100,101, 0,
-112, 97,100, 91, 50, 93, 0,116,119,105,115,116, 95,115,109,111,111,116,104, 0,115,109, 97,108,108, 99, 97,112,115, 95,115, 99,
- 97,108,101, 0,112, 97,116,104,108,101,110, 0, 98,101,118,114,101,115,111,108, 0,119,105,100,116,104, 0,101,120,116, 49, 0,
-101,120,116, 50, 0,114,101,115,111,108,117, 95,114,101,110, 0,114,101,115,111,108,118, 95,114,101,110, 0, 97, 99,116,110,117,
- 0, 42,108, 97,115,116,115,101,108, 0,115,112, 97, 99,101,109,111,100,101, 0,115,112, 97, 99,105,110,103, 0,108,105,110,101,
-100,105,115,116, 0,115,104,101, 97,114, 0,102,115,105,122,101, 0,119,111,114,100,115,112, 97, 99,101, 0,117,108,112,111,115,
- 0,117,108,104,101,105,103,104,116, 0,120,111,102, 0,121,111,102, 0,108,105,110,101,119,105,100,116,104, 0, 42,115,116,114,
- 0, 42,115,101,108, 98,111,120,101,115, 0, 42,101,100,105,116,102,111,110,116, 0,102, 97,109,105,108,121, 91, 50, 52, 93, 0,
- 42,118,102,111,110,116, 0, 42,118,102,111,110,116, 98, 0, 42,118,102,111,110,116,105, 0, 42,118,102,111,110,116, 98,105, 0,
-115,101,112, 99,104, 97,114, 0, 99,116,105,109,101, 0,116,111,116, 98,111,120, 0, 97, 99,116, 98,111,120, 0, 42,116, 98, 0,
-115,101,108,115,116, 97,114,116, 0,115,101,108,101,110,100, 0, 42,115,116,114,105,110,102,111, 0, 99,117,114,105,110,102,111,
- 0,101,102,102,101, 99,116, 0, 42,109,102, 97, 99,101, 0, 42,109,116,102, 97, 99,101, 0, 42,116,102, 97, 99,101, 0, 42,109,
-118,101,114,116, 0, 42,109,101,100,103,101, 0, 42,100,118,101,114,116, 0, 42,109, 99,111,108, 0, 42,109,115,116,105, 99,107,
-121, 0, 42,116,101,120, 99,111,109,101,115,104, 0, 42,109,115,101,108,101, 99,116, 0, 42,101,100,105,116, 95,109,101,115,104,
- 0,118,100, 97,116, 97, 0,101,100, 97,116, 97, 0,102,100, 97,116, 97, 0,116,111,116,101,100,103,101, 0,116,111,116,102, 97,
- 99,101, 0,116,111,116,115,101,108,101, 99,116, 0, 97, 99,116, 95,102, 97, 99,101, 0,101,100,105,116,102,108, 97,103, 0, 99,
-117, 98,101,109, 97,112,115,105,122,101, 0,115,109,111,111,116,104,114,101,115,104, 0,115,117, 98,100,105,118, 0,115,117, 98,
-100,105,118,114, 0,115,117, 98,115,117,114,102,116,121,112,101, 0, 42,109,114, 0, 42,112,118, 0, 42,116,112, 97,103,101, 0,
-117,118, 91, 52, 93, 91, 50, 93, 0, 99,111,108, 91, 52, 93, 0,116,114, 97,110,115,112, 0,116,105,108,101, 0,117,110,119,114,
- 97,112, 0,118, 49, 0,118, 50, 0,118, 51, 0,118, 52, 0,101,100, 99,111,100,101, 0, 99,114,101, 97,115,101, 0, 98,119,101,
-105,103,104,116, 0,100,101,102, 95,110,114, 0, 42,100,119, 0,116,111,116,119,101,105,103,104,116, 0, 99,111, 91, 51, 93, 0,
-110,111, 91, 51, 93, 0,117,118, 91, 50, 93, 0, 99,111, 91, 50, 93, 0,105,110,100,101,120, 0,102, 0,105, 0,115, 91, 50, 53,
- 54, 93, 0,116,111,116,100,105,115,112, 0, 40, 42,100,105,115,112,115, 41, 40, 41, 0,118, 91, 52, 93, 0,109,105,100, 0,118,
- 91, 50, 93, 0, 42,102, 97, 99,101,115, 0, 42, 99,111,108,102, 97, 99,101,115, 0, 42,101,100,103,101,115, 0, 42,118,101,114,
-116,115, 0,108,101,118,101,108,115, 0,108,101,118,101,108, 95, 99,111,117,110,116, 0, 99,117,114,114,101,110,116, 0,110,101,
-119,108,118,108, 0,101,100,103,101,108,118,108, 0,112,105,110,108,118,108, 0,114,101,110,100,101,114,108,118,108, 0,117,115,
-101, 95, 99,111,108, 0, 42,101,100,103,101, 95,102,108, 97,103,115, 0, 42,101,100,103,101, 95, 99,114,101, 97,115,101,115, 0,
- 42,118,101,114,116, 95,109, 97,112, 0, 42,101,100,103,101, 95,109, 97,112, 0, 42,111,108,100, 95,102, 97, 99,101,115, 0, 42,
-111,108,100, 95,101,100,103,101,115, 0,115,116, 97, 99,107,105,110,100,101,120, 0, 42,101,114,114,111,114, 0,109,111,100,105,
-102,105,101,114, 0,115,117, 98,100,105,118, 84,121,112,101, 0,114,101,110,100,101,114, 76,101,118,101,108,115, 0, 42,101,109,
- 67, 97, 99,104,101, 0, 42,109, 67, 97, 99,104,101, 0,100,101,102, 97,120,105,115, 0,112, 97,100, 91, 54, 93, 0,108,101,110,
-103,116,104, 0,114, 97,110,100,111,109,105,122,101, 0,115,101,101,100, 0, 42,111, 98, 95, 97,114,109, 0, 42,115,116, 97,114,
-116, 95, 99, 97,112, 0, 42,101,110,100, 95, 99, 97,112, 0, 42, 99,117,114,118,101, 95,111, 98, 0, 42,111,102,102,115,101,116,
- 95,111, 98, 0,111,102,102,115,101,116, 91, 51, 93, 0,115, 99, 97,108,101, 91, 51, 93, 0,109,101,114,103,101, 95,100,105,115,
-116, 0,102,105,116, 95,116,121,112,101, 0,111,102,102,115,101,116, 95,116,121,112,101, 0, 99,111,117,110,116, 0, 97,120,105,
-115, 0,116,111,108,101,114, 97,110, 99,101, 0, 42,109,105,114,114,111,114, 95,111, 98, 0,115,112,108,105,116, 95, 97,110,103,
-108,101, 0,118, 97,108,117,101, 0,114,101,115, 0,118, 97,108, 95,102,108, 97,103,115, 0,108,105,109, 95,102,108, 97,103,115,
- 0,101, 95,102,108, 97,103,115, 0, 98,101,118,101,108, 95, 97,110,103,108,101, 0,100,101,102,103,114,112, 95,110, 97,109,101,
- 91, 51, 50, 93, 0, 42,100,111,109, 97,105,110, 0, 42,102,108,111,119, 0, 42, 99,111,108,108, 0,116,105,109,101, 0, 42,116,
-101,120,116,117,114,101, 0,115,116,114,101,110,103,116,104, 0,100,105,114,101, 99,116,105,111,110, 0,109,105,100,108,101,118,
-101,108, 0,116,101,120,109, 97,112,112,105,110,103, 0, 42,109, 97,112, 95,111, 98,106,101, 99,116, 0,117,118,108, 97,121,101,
-114, 95,110, 97,109,101, 91, 51, 50, 93, 0,117,118,108, 97,121,101,114, 95,116,109,112, 0, 42,112,114,111,106,101, 99,116,111,
-114,115, 91, 49, 48, 93, 0, 42,105,109, 97,103,101, 0,110,117,109, 95,112,114,111,106,101, 99,116,111,114,115, 0, 97,115,112,
-101, 99,116,120, 0, 97,115,112,101, 99,116,121, 0,115, 99, 97,108,101,120, 0,115, 99, 97,108,101,121, 0,112,101,114, 99,101,
-110,116, 0,102, 97, 99,101, 67,111,117,110,116, 0,102, 97, 99, 0,114,101,112,101, 97,116, 0, 42,111, 98,106,101, 99,116, 99,
-101,110,116,101,114, 0,115,116, 97,114,116,120, 0,115,116, 97,114,116,121, 0,104,101,105,103,104,116, 0,110, 97,114,114,111,
-119, 0,115,112,101,101,100, 0,100, 97,109,112, 0,102, 97,108,108,111,102,102, 0,116,105,109,101,111,102,102,115, 0,108,105,
-102,101,116,105,109,101, 0,100,101,102,111,114,109,102,108, 97,103, 0,109,117,108,116,105, 0, 42,112,114,101,118, 67,111,115,
- 0,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, 93, 0,112, 97,114,101,110,116,105,110,118, 91, 52, 93, 91, 52, 93, 0, 99,
-101,110,116, 91, 51, 93, 0, 42,105,110,100,101,120, 97,114, 0,116,111,116,105,110,100,101,120, 0,102,111,114, 99,101, 0, 42,
- 99,108,111,116,104, 79, 98,106,101, 99,116, 0, 42,115,105,109, 95,112, 97,114,109,115, 0, 42, 99,111,108,108, 95,112, 97,114,
-109,115, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 0,112,116, 99, 97, 99,104,101,115, 0, 42,120, 0, 42,120,110,101,
-119, 0, 42,120,111,108,100, 0, 42, 99,117,114,114,101,110,116, 95,120,110,101,119, 0, 42, 99,117,114,114,101,110,116, 95,120,
- 0, 42, 99,117,114,114,101,110,116, 95,118, 0, 42,109,102, 97, 99,101,115, 0,110,117,109,118,101,114,116,115, 0,110,117,109,
-102, 97, 99,101,115, 0, 42, 98,118,104,116,114,101,101, 0, 42,118, 0, 42,100,109, 0, 99,102,114, 97, 0,111,112,101,114, 97,
-116,105,111,110, 0,118,101,114,116,101,120, 0,116,111,116,105,110,102,108,117,101,110, 99,101, 0,103,114,105,100,115,105,122,
-101, 0, 42, 98,105,110,100,105,110,102,108,117,101,110, 99,101,115, 0, 42, 98,105,110,100,111,102,102,115,101,116,115, 0, 42,
- 98,105,110,100, 99, 97,103,101, 99,111,115, 0,116,111,116, 99, 97,103,101,118,101,114,116, 0, 42,100,121,110,103,114,105,100,
- 0, 42,100,121,110,105,110,102,108,117,101,110, 99,101,115, 0, 42,100,121,110,118,101,114,116,115, 0, 42,112, 97,100, 50, 0,
-100,121,110,103,114,105,100,115,105,122,101, 0,100,121,110, 99,101,108,108,109,105,110, 91, 51, 93, 0,100,121,110, 99,101,108,
-108,119,105,100,116,104, 0, 98,105,110,100,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42, 98,105,110,100,119,101,105,103,104,116,
-115, 0, 42, 98,105,110,100, 99,111,115, 0, 40, 42, 98,105,110,100,102,117,110, 99, 41, 40, 41, 0, 42,112,115,121,115, 0,116,
-111,116,100,109,118,101,114,116, 0,116,111,116,100,109,101,100,103,101, 0,116,111,116,100,109,102, 97, 99,101, 0,112,111,115,
-105,116,105,111,110, 0,114, 97,110,100,111,109, 95,112,111,115,105,116,105,111,110, 0, 42,102, 97, 99,101,112, 97, 0,118,103,
-114,111,117,112, 0,112,114,111,116,101, 99,116, 0,108,118,108, 0,115, 99,117,108,112,116,108,118,108, 0,116,111,116,108,118,
-108, 0,115,105,109,112,108,101, 0, 42,102,115,115, 0, 42,116, 97,114,103,101,116, 0, 42, 97,117,120, 84, 97,114,103,101,116,
- 0,118,103,114,111,117,112, 95,110, 97,109,101, 91, 51, 50, 93, 0,107,101,101,112, 68,105,115,116, 0,115,104,114,105,110,107,
- 84,121,112,101, 0,115,104,114,105,110,107, 79,112,116,115, 0,112,114,111,106, 65,120,105,115, 0,115,117, 98,115,117,114,102,
- 76,101,118,101,108,115, 0, 42,111,114,105,103,105,110, 0,102, 97, 99,116,111,114, 0,108,105,109,105,116, 91, 50, 93, 0,111,
-114,105,103,105,110, 79,112,116,115, 0,111,102,102,115,101,116, 95,102, 97, 99, 0, 99,114,101, 97,115,101, 95,105,110,110,101,
-114, 0, 99,114,101, 97,115,101, 95,111,117,116,101,114, 0, 99,114,101, 97,115,101, 95,114,105,109, 0, 42,111, 98, 95, 97,120,
-105,115, 0,115,116,101,112,115, 0,114,101,110,100,101,114, 95,115,116,101,112,115, 0,105,116,101,114, 0,115, 99,114,101,119,
- 95,111,102,115, 0, 97,110,103,108,101, 0,112,110,116,115,119, 0,111,112,110,116,115,117, 0,111,112,110,116,115,118, 0,111,
-112,110,116,115,119, 0,116,121,112,101,117, 0,116,121,112,101,118, 0,116,121,112,101,119, 0,102,117, 0,102,118, 0,102,119,
- 0,100,117, 0,100,118, 0,100,119, 0, 42,100,101,102, 0, 42,108, 97,116,116,105, 99,101,100, 97,116, 97, 0,108, 97,116,109,
- 97,116, 91, 52, 93, 91, 52, 93, 0, 42,101,100,105,116,108, 97,116,116, 0,118,101, 99, 91, 56, 93, 91, 51, 93, 0, 42,115, 99,
-117,108,112,116, 0,112, 97,114,116,121,112,101, 0,112, 97,114, 49, 0,112, 97,114, 50, 0,112, 97,114, 51, 0,112, 97,114,115,
-117, 98,115,116,114, 91, 51, 50, 93, 0, 42,116,114, 97, 99,107, 0, 42,112,114,111,120,121, 0, 42,112,114,111,120,121, 95,103,
-114,111,117,112, 0, 42,112,114,111,120,121, 95,102,114,111,109, 0, 42, 97, 99,116,105,111,110, 0, 42,112,111,115,101,108,105,
- 98, 0, 42,112,111,115,101, 0, 42,103,112,100, 0, 97,118,115, 0, 42,109,112, 97,116,104, 0, 99,111,110,115,116,114, 97,105,
-110,116, 67,104, 97,110,110,101,108,115, 0,100,101,102, 98, 97,115,101, 0,109,111,100,105,102,105,101,114,115, 0,114,101,115,
-116,111,114,101, 95,109,111,100,101, 0, 42,109, 97,116, 98,105,116,115, 0, 97, 99,116, 99,111,108, 0,100,108,111, 99, 91, 51,
- 93, 0,111,114,105,103, 91, 51, 93, 0,100,115,105,122,101, 91, 51, 93, 0,100,114,111,116, 91, 51, 93, 0,100,113,117, 97,116,
- 91, 52, 93, 0,114,111,116, 65,120,105,115, 91, 51, 93, 0,100,114,111,116, 65,120,105,115, 91, 51, 93, 0,114,111,116, 65,110,
-103,108,101, 0,100,114,111,116, 65,110,103,108,101, 0,111, 98,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 99,111,110,115,116,105,
-110,118, 91, 52, 93, 91, 52, 93, 0,108, 97,121, 0, 99,111,108, 98,105,116,115, 0,116,114, 97,110,115,102,108, 97,103, 0,112,
-114,111,116,101, 99,116,102,108, 97,103, 0,116,114, 97, 99,107,102,108, 97,103, 0,117,112,102,108, 97,103, 0,110,108, 97,102,
-108, 97,103, 0,105,112,111,102,108, 97,103, 0,105,112,111,119,105,110, 0,115, 99, 97,102,108, 97,103, 0,115, 99, 97,118,105,
-115,102,108, 97,103, 0, 98,111,117,110,100,116,121,112,101, 0,100,117,112,111,110, 0,100,117,112,111,102,102, 0,100,117,112,
-115,116, 97, 0,100,117,112,101,110,100, 0,115,102, 0,109, 97,115,115, 0,100, 97,109,112,105,110,103, 0,105,110,101,114,116,
-105, 97, 0,102,111,114,109,102, 97, 99,116,111,114, 0,114,100, 97,109,112,105,110,103, 0,109, 97,114,103,105,110, 0,109, 97,
-120, 95,118,101,108, 0,109,105,110, 95,118,101,108, 0,109, 95, 99,111,110,116, 97, 99,116, 80,114,111, 99,101,115,115,105,110,
-103, 84,104,114,101,115,104,111,108,100, 0,114,111,116,109,111,100,101, 0,100,116, 0,100,116,120, 0,101,109,112,116,121, 95,
-100,114, 97,119,116,121,112,101, 0,112, 97,100, 49, 91, 51, 93, 0,101,109,112,116,121, 95,100,114, 97,119,115,105,122,101, 0,
-100,117,112,102, 97, 99,101,115, 99, 97, 0,112,114,111,112, 0,115,101,110,115,111,114,115, 0, 99,111,110,116,114,111,108,108,
-101,114,115, 0, 97, 99,116,117, 97,116,111,114,115, 0, 98, 98,115,105,122,101, 91, 51, 93, 0, 97, 99,116,100,101,102, 0,103,
- 97,109,101,102,108, 97,103, 0,103, 97,109,101,102,108, 97,103, 50, 0, 42, 98,115,111,102,116, 0,115,111,102,116,102,108, 97,
-103, 0, 97,110,105,115,111,116,114,111,112,105, 99, 70,114,105, 99,116,105,111,110, 91, 51, 93, 0, 99,111,110,115,116,114, 97,
-105,110,116,115, 0,110,108, 97,115,116,114,105,112,115, 0,104,111,111,107,115, 0,112, 97,114,116,105, 99,108,101,115,121,115,
-116,101,109, 0, 42,115,111,102,116, 0, 42,100,117,112, 95,103,114,111,117,112, 0,102,108,117,105,100,115,105,109, 70,108, 97,
-103, 0,114,101,115,116,114,105, 99,116,102,108, 97,103, 0,115,104, 97,112,101,110,114, 0,115,104, 97,112,101,102,108, 97,103,
- 0,114,101, 99, 97,108, 99,111, 0, 98,111,100,121, 95,116,121,112,101, 0, 42,102,108,117,105,100,115,105,109, 83,101,116,116,
-105,110,103,115, 0, 42,100,101,114,105,118,101,100, 68,101,102,111,114,109, 0, 42,100,101,114,105,118,101,100, 70,105,110, 97,
-108, 0,108, 97,115,116, 68, 97,116, 97, 77, 97,115,107, 0,115,116, 97,116,101, 0,105,110,105,116, 95,115,116, 97,116,101, 0,
-103,112,117,108, 97,109,112, 0,112, 99, 95,105,100,115, 0, 42,100,117,112,108,105,108,105,115,116, 0, 99,117,114,105,110,100,
-101,120, 0, 97, 99,116,105,118,101, 0,111,114,105,103,108, 97,121, 0,110,111, 95,100,114, 97,119, 0, 97,110,105,109, 97,116,
-101,100, 0,111,109, 97,116, 91, 52, 93, 91, 52, 93, 0,111,114, 99,111, 91, 51, 93, 0,100,101,102,108,101, 99,116, 0,102,111,
-114, 99,101,102,105,101,108,100, 0,115,104, 97,112,101, 0,116,101,120, 95,109,111,100,101, 0,107,105,110,107, 0,107,105,110,
-107, 95, 97,120,105,115, 0,122,100,105,114, 0,102, 95,115,116,114,101,110,103,116,104, 0,102, 95,100, 97,109,112, 0,102, 95,
-102,108,111,119, 0,102, 95,115,105,122,101, 0,102, 95,112,111,119,101,114, 0,109, 97,120,100,105,115,116, 0,109,105,110,100,
-105,115,116, 0,102, 95,112,111,119,101,114, 95,114, 0,109, 97,120,114, 97,100, 0,109,105,110,114, 97,100, 0,112,100,101,102,
- 95,100, 97,109,112, 0,112,100,101,102, 95,114,100, 97,109,112, 0,112,100,101,102, 95,112,101,114,109, 0,112,100,101,102, 95,
-102,114,105, 99,116, 0,112,100,101,102, 95,114,102,114,105, 99,116, 0,112,100,101,102, 95,115,116,105, 99,107,110,101,115,115,
- 0, 97, 98,115,111,114,112,116,105,111,110, 0,112,100,101,102, 95,115, 98,100, 97,109,112, 0,112,100,101,102, 95,115, 98,105,
-102,116, 0,112,100,101,102, 95,115, 98,111,102,116, 0, 99,108,117,109,112, 95,102, 97, 99, 0, 99,108,117,109,112, 95,112,111,
-119, 0,107,105,110,107, 95,102,114,101,113, 0,107,105,110,107, 95,115,104, 97,112,101, 0,107,105,110,107, 95, 97,109,112, 0,
-102,114,101,101, 95,101,110,100, 0,116,101,120, 95,110, 97, 98,108, 97, 0, 42,114,110,103, 0,102, 95,110,111,105,115,101, 0,
-119,101,105,103,104,116, 91, 49, 51, 93, 0,103,108,111, 98, 97,108, 95,103,114, 97,118,105,116,121, 0,114,116, 91, 51, 93, 0,
-102,114, 97,109,101, 0,116,111,116,112,111,105,110,116, 0,100, 97,116, 97, 95,116,121,112,101,115, 0, 42,105,110,100,101,120,
- 95, 97,114,114, 97,121, 0, 42,100, 97,116, 97, 91, 56, 93, 0, 42, 99,117,114, 91, 56, 93, 0,115,116,101,112, 0,115,105,109,
-102,114, 97,109,101, 0,115,116, 97,114,116,102,114, 97,109,101, 0,101,110,100,102,114, 97,109,101, 0,101,100,105,116,102,114,
- 97,109,101, 0,108, 97,115,116, 95,101,120, 97, 99,116, 0,110, 97,109,101, 91, 54, 52, 93, 0,112,114,101,118, 95,110, 97,109,
-101, 91, 54, 52, 93, 0,105,110,102,111, 91, 54, 52, 93, 0,112, 97,116,104, 91, 50, 52, 48, 93, 0,109,101,109, 95, 99, 97, 99,
-104,101, 0, 42,101,100,105,116, 0, 40, 42,102,114,101,101, 95,101,100,105,116, 41, 40, 41, 0,108,105,110, 83,116,105,102,102,
- 0, 97,110,103, 83,116,105,102,102, 0,118,111,108,117,109,101, 0,118,105,116,101,114, 97,116,105,111,110,115, 0,112,105,116,
-101,114, 97,116,105,111,110,115, 0,100,105,116,101,114, 97,116,105,111,110,115, 0, 99,105,116,101,114, 97,116,105,111,110,115,
- 0,107, 83, 82, 72, 82, 95, 67, 76, 0,107, 83, 75, 72, 82, 95, 67, 76, 0,107, 83, 83, 72, 82, 95, 67, 76, 0,107, 83, 82, 95,
- 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 75, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 83, 95, 83, 80, 76, 84, 95, 67, 76, 0,
-107, 86, 67, 70, 0,107, 68, 80, 0,107, 68, 71, 0,107, 76, 70, 0,107, 80, 82, 0,107, 86, 67, 0,107, 68, 70, 0,107, 77, 84,
- 0,107, 67, 72, 82, 0,107, 75, 72, 82, 0,107, 83, 72, 82, 0,107, 65, 72, 82, 0, 99,111,108,108,105,115,105,111,110,102,108,
- 97,103,115, 0,110,117,109, 99,108,117,115,116,101,114,105,116,101,114, 97,116,105,111,110,115, 0,119,101,108,100,105,110,103,
- 0,116,111,116,115,112,114,105,110,103, 0, 42, 98,112,111,105,110,116, 0, 42, 98,115,112,114,105,110,103, 0,109,115,103, 95,
-108,111, 99,107, 0,109,115,103, 95,118, 97,108,117,101, 0,110,111,100,101,109, 97,115,115, 0,110, 97,109,101,100, 86, 71, 95,
- 77, 97,115,115, 91, 51, 50, 93, 0,103,114, 97,118, 0,109,101,100,105, 97,102,114,105, 99,116, 0,114,107,108,105,109,105,116,
- 0,112,104,121,115,105, 99,115, 95,115,112,101,101,100, 0,103,111, 97,108,115,112,114,105,110,103, 0,103,111, 97,108,102,114,
-105, 99,116, 0,109,105,110,103,111, 97,108, 0,109, 97,120,103,111, 97,108, 0,100,101,102,103,111, 97,108, 0,118,101,114,116,
-103,114,111,117,112, 0,110, 97,109,101,100, 86, 71, 95, 83,111,102,116,103,111, 97,108, 91, 51, 50, 93, 0,102,117,122,122,121,
-110,101,115,115, 0,105,110,115,112,114,105,110,103, 0,105,110,102,114,105, 99,116, 0,110, 97,109,101,100, 86, 71, 95, 83,112,
-114,105,110,103, 95, 75, 91, 51, 50, 93, 0,101,102,114, 97, 0,105,110,116,101,114,118, 97,108, 0,108,111, 99, 97,108, 0,115,
-111,108,118,101,114,102,108, 97,103,115, 0, 42, 42,107,101,121,115, 0,116,111,116,112,111,105,110,116,107,101,121, 0,115,101,
- 99,111,110,100,115,112,114,105,110,103, 0, 99,111,108, 98, 97,108,108, 0, 98, 97,108,108,100, 97,109,112, 0, 98, 97,108,108,
-115,116,105,102,102, 0,115, 98, 99, 95,109,111,100,101, 0, 97,101,114,111,101,100,103,101, 0,109,105,110,108,111,111,112,115,
- 0,109, 97,120,108,111,111,112,115, 0, 99,104,111,107,101, 0,115,111,108,118,101,114, 95, 73, 68, 0,112,108, 97,115,116,105,
- 99, 0,115,112,114,105,110,103,112,114,101,108,111, 97,100, 0, 42,115, 99,114, 97,116, 99,104, 0,115,104,101, 97,114,115,116,
-105,102,102, 0,105,110,112,117,115,104, 0, 42,112,111,105,110,116, 99, 97, 99,104,101, 0, 42,101,102,102,101, 99,116,111,114,
- 95,119,101,105,103,104,116,115, 0,108, 99,111,109, 91, 51, 93, 0,108,114,111,116, 91, 51, 93, 91, 51, 93, 0,108,115, 99, 97,
-108,101, 91, 51, 93, 91, 51, 93, 0,112, 97,100, 52, 91, 52, 93, 0, 42,102,109,100, 0,115,104,111,119, 95, 97,100,118, 97,110,
- 99,101,100,111,112,116,105,111,110,115, 0,114,101,115,111,108,117,116,105,111,110,120,121,122, 0,112,114,101,118,105,101,119,
-114,101,115,120,121,122, 0,114,101, 97,108,115,105,122,101, 0,103,117,105, 68,105,115,112,108, 97,121, 77,111,100,101, 0,114,
-101,110,100,101,114, 68,105,115,112,108, 97,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 86, 97,108,117,101, 0,
-118,105,115, 99,111,115,105,116,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 69,120,112,111,110,101,110,116, 0,
-103,114, 97,118,120, 0,103,114, 97,118,121, 0,103,114, 97,118,122, 0, 97,110,105,109, 83,116, 97,114,116, 0, 97,110,105,109,
- 69,110,100, 0, 98, 97,107,101, 83,116, 97,114,116, 0, 98, 97,107,101, 69,110,100, 0,103,115,116, 97,114, 0,109, 97,120, 82,
-101,102,105,110,101, 0,105,110,105, 86,101,108,120, 0,105,110,105, 86,101,108,121, 0,105,110,105, 86,101,108,122, 0, 42,111,
-114,103, 77,101,115,104, 0, 42,109,101,115,104, 83,117,114,102, 97, 99,101, 0, 42,109,101,115,104, 66, 66, 0,115,117,114,102,
-100, 97,116, 97, 80, 97,116,104, 91, 50, 52, 48, 93, 0, 98, 98, 83,116, 97,114,116, 91, 51, 93, 0, 98, 98, 83,105,122,101, 91,
- 51, 93, 0,116,121,112,101, 70,108, 97,103,115, 0,100,111,109, 97,105,110, 78,111,118,101, 99,103,101,110, 0,118,111,108,117,
-109,101, 73,110,105,116, 84,121,112,101, 0,112, 97,114,116, 83,108,105,112, 86, 97,108,117,101, 0,103,101,110,101,114, 97,116,
-101, 84,114, 97, 99,101,114,115, 0,103,101,110,101,114, 97,116,101, 80, 97,114,116,105, 99,108,101,115, 0,115,117,114,102, 97,
- 99,101, 83,109,111,111,116,104,105,110,103, 0,115,117,114,102, 97, 99,101, 83,117, 98,100,105,118,115, 0,112, 97,114,116,105,
- 99,108,101, 73,110,102, 83,105,122,101, 0,112, 97,114,116,105, 99,108,101, 73,110,102, 65,108,112,104, 97, 0,102, 97,114, 70,
-105,101,108,100, 83,105,122,101, 0, 42,109,101,115,104, 83,117,114,102, 78,111,114,109, 97,108,115, 0, 99,112,115, 84,105,109,
-101, 83,116, 97,114,116, 0, 99,112,115, 84,105,109,101, 69,110,100, 0, 99,112,115, 81,117, 97,108,105,116,121, 0, 97,116,116,
-114, 97, 99,116,102,111,114, 99,101, 83,116,114,101,110,103,116,104, 0, 97,116,116,114, 97, 99,116,102,111,114, 99,101, 82, 97,
-100,105,117,115, 0,118,101,108,111, 99,105,116,121,102,111,114, 99,101, 83,116,114,101,110,103,116,104, 0,118,101,108,111, 99,
-105,116,121,102,111,114, 99,101, 82, 97,100,105,117,115, 0,108, 97,115,116,103,111,111,100,102,114, 97,109,101, 0,109,105,115,
-116,121,112,101, 0,104,111,114,114, 0,104,111,114,103, 0,104,111,114, 98, 0,122,101,110,114, 0,122,101,110,103, 0,122,101,
-110, 98, 0,102, 97,115,116, 99,111,108, 0,101,120,112,111,115,117,114,101, 0,101,120,112, 0,114, 97,110,103,101, 0,108,105,
-110,102, 97, 99, 0,108,111,103,102, 97, 99, 0,103,114, 97,118,105,116,121, 0, 97, 99,116,105,118,105,116,121, 66,111,120, 82,
- 97,100,105,117,115, 0,115,107,121,116,121,112,101, 0,111, 99, 99,108,117,115,105,111,110, 82,101,115, 0,112,104,121,115,105,
- 99,115, 69,110,103,105,110,101, 0,116,105, 99,114, 97,116,101, 0,109, 97,120,108,111,103,105, 99,115,116,101,112, 0,112,104,
-121,115,117, 98,115,116,101,112, 0,109, 97,120,112,104,121,115,116,101,112, 0,109,105,115,105, 0,109,105,115,116,115,116, 97,
- 0,109,105,115,116,100,105,115,116, 0,109,105,115,116,104,105, 0,115,116, 97,114,114, 0,115,116, 97,114,103, 0,115,116, 97,
-114, 98, 0,115,116, 97,114,107, 0,115,116, 97,114,115,105,122,101, 0,115,116, 97,114,109,105,110,100,105,115,116, 0,115,116,
- 97,114,100,105,115,116, 0,115,116, 97,114, 99,111,108,110,111,105,115,101, 0,100,111,102,115,116, 97, 0,100,111,102,101,110,
-100, 0,100,111,102,109,105,110, 0,100,111,102,109, 97,120, 0, 97,111,100,105,115,116, 0, 97,111,100,105,115,116,102, 97, 99,
- 0, 97,111,101,110,101,114,103,121, 0, 97,111, 98,105, 97,115, 0, 97,111,109,111,100,101, 0, 97,111,115, 97,109,112, 0, 97,
-111,109,105,120, 0, 97,111, 99,111,108,111,114, 0, 97,111, 95, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0, 97,111, 95,
- 97,100, 97,112,116, 95,115,112,101,101,100, 95,102, 97, 99, 0, 97,111, 95, 97,112,112,114,111,120, 95,101,114,114,111,114, 0,
- 97,111, 95, 97,112,112,114,111,120, 95, 99,111,114,114,101, 99,116,105,111,110, 0, 97,111, 95,105,110,100,105,114,101, 99,116,
- 95,101,110,101,114,103,121, 0, 97,111, 95,101,110,118, 95,101,110,101,114,103,121, 0, 97,111, 95,112, 97,100, 50, 0, 97,111,
- 95,105,110,100,105,114,101, 99,116, 95, 98,111,117,110, 99,101,115, 0, 97,111, 95,112, 97,100, 0, 97,111, 95,115, 97,109,112,
- 95,109,101,116,104,111,100, 0, 97,111, 95,103, 97,116,104,101,114, 95,109,101,116,104,111,100, 0, 97,111, 95, 97,112,112,114,
-111,120, 95,112, 97,115,115,101,115, 0, 42, 97,111,115,112,104,101,114,101, 0, 42, 97,111,116, 97, 98,108,101,115, 0,112, 97,
-100, 91, 51, 93, 0,115,101,108, 99,111,108, 0,115,120, 0,115,121, 0, 42,108,112, 70,111,114,109, 97,116, 0, 42,108,112, 80,
- 97,114,109,115, 0, 99, 98, 70,111,114,109, 97,116, 0, 99, 98, 80, 97,114,109,115, 0,102, 99, 99, 84,121,112,101, 0,102, 99,
- 99, 72, 97,110,100,108,101,114, 0,100,119, 75,101,121, 70,114, 97,109,101, 69,118,101,114,121, 0,100,119, 81,117, 97,108,105,
-116,121, 0,100,119, 66,121,116,101,115, 80,101,114, 83,101, 99,111,110,100, 0,100,119, 70,108, 97,103,115, 0,100,119, 73,110,
-116,101,114,108,101, 97,118,101, 69,118,101,114,121, 0, 97,118,105, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50, 56, 93, 0,
- 42, 99,100, 80, 97,114,109,115, 0, 42,112, 97,100, 0, 99,100, 83,105,122,101, 0,113,116, 99,111,100,101, 99,110, 97,109,101,
- 91, 49, 50, 56, 93, 0, 99,111,100,101, 99, 84,121,112,101, 0, 99,111,100,101, 99, 83,112, 97,116,105, 97,108, 81,117, 97,108,
-105,116,121, 0, 99,111,100,101, 99, 0, 99,111,100,101, 99, 70,108, 97,103,115, 0, 99,111,108,111,114, 68,101,112,116,104, 0,
- 99,111,100,101, 99, 84,101,109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0,109,105,110, 83,112, 97,116,105, 97,108, 81,
-117, 97,108,105,116,121, 0,109,105,110, 84,101,109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0,107,101,121, 70,114, 97,
-109,101, 82, 97,116,101, 0, 98,105,116, 82, 97,116,101, 0, 97,117,100,105,111, 99,111,100,101, 99, 84,121,112,101, 0, 97,117,
-100,105,111, 83, 97,109,112,108,101, 82, 97,116,101, 0, 97,117,100,105,111, 66,105,116, 68,101,112,116,104, 0, 97,117,100,105,
-111, 67,104, 97,110,110,101,108,115, 0, 97,117,100,105,111, 67,111,100,101, 99, 70,108, 97,103,115, 0, 97,117,100,105,111, 66,
-105,116, 82, 97,116,101, 0, 97,117,100,105,111, 95, 99,111,100,101, 99, 0,118,105,100,101,111, 95, 98,105,116,114, 97,116,101,
- 0, 97,117,100,105,111, 95, 98,105,116,114, 97,116,101, 0, 97,117,100,105,111, 95,109,105,120,114, 97,116,101, 0, 97,117,100,
-105,111, 95,118,111,108,117,109,101, 0,103,111,112, 95,115,105,122,101, 0,114, 99, 95,109,105,110, 95,114, 97,116,101, 0,114,
- 99, 95,109, 97,120, 95,114, 97,116,101, 0,114, 99, 95, 98,117,102,102,101,114, 95,115,105,122,101, 0,109,117,120, 95,112, 97,
- 99,107,101,116, 95,115,105,122,101, 0,109,117,120, 95,114, 97,116,101, 0,109,105,120,114, 97,116,101, 0,109, 97,105,110, 0,
-115,112,101,101,100, 95,111,102, 95,115,111,117,110,100, 0,100,111,112,112,108,101,114, 95,102, 97, 99,116,111,114, 0,100,105,
-115,116, 97,110, 99,101, 95,109,111,100,101,108, 0, 42,109, 97,116, 95,111,118,101,114,114,105,100,101, 0, 42,108,105,103,104,
-116, 95,111,118,101,114,114,105,100,101, 0,108, 97,121, 95,122,109, 97,115,107, 0,108, 97,121,102,108, 97,103, 0,112, 97,115,
-115,102,108, 97,103, 0,112, 97,115,115, 95,120,111,114, 0, 42, 97,118,105, 99,111,100,101, 99,100, 97,116, 97, 0, 42,113,116,
- 99,111,100,101, 99,100, 97,116, 97, 0,113,116, 99,111,100,101, 99,115,101,116,116,105,110,103,115, 0,102,102, 99,111,100,101,
- 99,100, 97,116, 97, 0,115,117, 98,102,114, 97,109,101, 0,112,115,102,114, 97, 0,112,101,102,114, 97, 0,105,109, 97,103,101,
-115, 0,102,114, 97,109, 97,112,116,111, 0,116,104,114,101, 97,100,115, 0,102,114, 97,109,101,108,101,110, 0, 98,108,117,114,
-102, 97, 99, 0,101,100,103,101, 82, 0,101,100,103,101, 71, 0,101,100,103,101, 66, 0,102,117,108,108,115, 99,114,101,101,110,
- 0,120,112,108, 97,121, 0,121,112,108, 97,121, 0,102,114,101,113,112,108, 97,121, 0, 97,116,116,114,105, 98, 0,114,116, 50,
- 0,102,114, 97,109,101, 95,115,116,101,112, 0,115,116,101,114,101,111,109,111,100,101, 0,100,105,109,101,110,115,105,111,110,
-115,112,114,101,115,101,116, 0,109, 97,120,105,109,115,105,122,101, 0,120,115, 99,104, 0,121,115, 99,104, 0,120,112, 97,114,
-116,115, 0,121,112, 97,114,116,115, 0,119,105,110,112,111,115, 0,112,108, 97,110,101,115, 0,105,109,116,121,112,101, 0,115,
-117, 98,105,109,116,121,112,101, 0,113,117, 97,108,105,116,121, 0,100,105,115,112,108, 97,121,109,111,100,101, 0,114,112, 97,
-100, 49, 0,114,112, 97,100, 50, 0,115, 99,101,109,111,100,101, 0,114, 97,121,116,114, 97, 99,101, 95,111,112,116,105,111,110,
-115, 0,114, 97,121,116,114, 97, 99,101, 95,115,116,114,117, 99,116,117,114,101, 0,114,101,110,100,101,114,101,114, 0,111, 99,
-114,101,115, 0, 97,108,112,104, 97,109,111,100,101, 0,111,115, 97, 0,102,114,115, 95,115,101, 99, 0,101,100,103,101,105,110,
-116, 0,115, 97,102,101,116,121, 0, 98,111,114,100,101,114, 0,100,105,115,112,114,101, 99,116, 0,108, 97,121,101,114,115, 0,
- 97, 99,116,108, 97,121, 0,109, 98,108,117,114, 95,115, 97,109,112,108,101,115, 0,120, 97,115,112, 0,121, 97,115,112, 0,102,
-114,115, 95,115,101, 99, 95, 98, 97,115,101, 0,103, 97,117,115,115, 0, 99,111,108,111,114, 95,109,103,116, 95,102,108, 97,103,
- 0,112,111,115,116,103, 97,109,109, 97, 0,112,111,115,116,104,117,101, 0,112,111,115,116,115, 97,116, 0,100,105,116,104,101,
-114, 95,105,110,116,101,110,115,105,116,121, 0, 98, 97,107,101, 95,111,115, 97, 0, 98, 97,107,101, 95,102,105,108,116,101,114,
- 0, 98, 97,107,101, 95,109,111,100,101, 0, 98, 97,107,101, 95,102,108, 97,103, 0, 98, 97,107,101, 95,110,111,114,109, 97,108,
- 95,115,112, 97, 99,101, 0, 98, 97,107,101, 95,113,117, 97,100, 95,115,112,108,105,116, 0, 98, 97,107,101, 95,109, 97,120,100,
-105,115,116, 0, 98, 97,107,101, 95, 98,105, 97,115,100,105,115,116, 0, 98, 97,107,101, 95,112, 97,100, 0, 98, 97, 99,107, 98,
-117,102, 91, 49, 54, 48, 93, 0,112,105, 99, 91, 49, 54, 48, 93, 0,115,116, 97,109,112, 0,115,116, 97,109,112, 95,102,111,110,
-116, 95,105,100, 0,115,116, 97,109,112, 95,117,100, 97,116, 97, 91, 49, 54, 48, 93, 0,102,103, 95,115,116, 97,109,112, 91, 52,
- 93, 0, 98,103, 95,115,116, 97,109,112, 91, 52, 93, 0,115,101,113, 95,112,114,101,118, 95,116,121,112,101, 0,115,101,113, 95,
-114,101,110,100, 95,116,121,112,101, 0,115,101,113, 95,102,108, 97,103, 0,112, 97,100, 53, 91, 53, 93, 0,115,105,109,112,108,
-105,102,121, 95,102,108, 97,103, 0,115,105,109,112,108,105,102,121, 95,115,117, 98,115,117,114,102, 0,115,105,109,112,108,105,
-102,121, 95,115,104, 97,100,111,119,115, 97,109,112,108,101,115, 0,115,105,109,112,108,105,102,121, 95,112, 97,114,116,105, 99,
-108,101,115, 0,115,105,109,112,108,105,102,121, 95, 97,111,115,115,115, 0, 99,105,110,101,111,110,119,104,105,116,101, 0, 99,
-105,110,101,111,110, 98,108, 97, 99,107, 0, 99,105,110,101,111,110,103, 97,109,109, 97, 0,106,112, 50, 95,112,114,101,115,101,
-116, 0,106,112, 50, 95,100,101,112,116,104, 0,114,112, 97,100, 51, 0,100,111,109,101,114,101,115, 0,100,111,109,101,109,111,
-100,101, 0,100,111,109,101, 97,110,103,108,101, 0,100,111,109,101,116,105,108,116, 0,100,111,109,101,114,101,115, 98,117,102,
- 0, 42,100,111,109,101,116,101,120,116, 0,101,110,103,105,110,101, 91, 51, 50, 93, 0,112, 97,114,116,105, 99,108,101, 95,112,
-101,114, 99, 0,115,117, 98,115,117,114,102, 95,109, 97,120, 0,115,104, 97,100, 98,117,102,115, 97,109,112,108,101, 95,109, 97,
-120, 0, 97,111, 95,101,114,114,111,114, 0,116,105,108,116, 0,114,101,115, 98,117,102, 0, 42,119, 97,114,112,116,101,120,116,
- 0, 99,111,108, 91, 51, 93, 0,109, 97,116,109,111,100,101, 0,102,114, 97,109,105,110,103, 0,114,116, 49, 0,100,111,109,101,
- 0,115,116,101,114,101,111,102,108, 97,103, 0,101,121,101,115,101,112, 97,114, 97,116,105,111,110, 0, 42, 99, 97,109,101,114,
- 97, 0, 42, 98,114,117,115,104, 0, 42,112, 97,105,110,116, 95, 99,117,114,115,111,114, 0,112, 97,105,110,116, 95, 99,117,114,
-115,111,114, 95, 99,111,108, 91, 52, 93, 0,112, 97,105,110,116, 0,115,101, 97,109, 95, 98,108,101,101,100, 0,110,111,114,109,
- 97,108, 95, 97,110,103,108,101, 0,115, 99,114,101,101,110, 95,103,114, 97, 98, 95,115,105,122,101, 91, 50, 93, 0, 42,112, 97,
-105,110,116, 99,117,114,115,111,114, 0,105,110,118,101,114,116, 0,116,111,116,114,101,107,101,121, 0,116,111,116, 97,100,100,
-107,101,121, 0, 98,114,117,115,104,116,121,112,101, 0, 98,114,117,115,104, 91, 55, 93, 0,101,109,105,116,116,101,114,100,105,
-115,116, 0,115,101,108,101, 99,116,109,111,100,101, 0,101,100,105,116,116,121,112,101, 0,100,114, 97,119, 95,115,116,101,112,
- 0,102, 97,100,101, 95,102,114, 97,109,101,115, 0,110, 97,109,101, 91, 51, 54, 93, 0,109, 97,116, 91, 51, 93, 91, 51, 93, 0,
-114, 97,100,105, 97,108, 95,115,121,109,109, 91, 51, 93, 0,108, 97,115,116, 95,120, 0,108, 97,115,116, 95,121, 0,108, 97,115,
-116, 95, 97,110,103,108,101, 0,100,114, 97,119, 95, 97,110, 99,104,111,114,101,100, 0, 97,110, 99,104,111,114,101,100, 95,115,
-105,122,101, 0, 97,110, 99,104,111,114,101,100, 95,108,111, 99, 97,116,105,111,110, 91, 51, 93, 0, 97,110, 99,104,111,114,101,
-100, 95,105,110,105,116,105, 97,108, 95,109,111,117,115,101, 91, 50, 93, 0,100,114, 97,119, 95,112,114,101,115,115,117,114,101,
- 0,112,114,101,115,115,117,114,101, 95,118, 97,108,117,101, 0,115,112,101, 99,105, 97,108, 95,114,111,116, 97,116,105,111,110,
- 0, 42,118,112, 97,105,110,116, 95,112,114,101,118, 0, 42,119,112, 97,105,110,116, 95,112,114,101,118, 0, 42,118,112, 97,105,
-110,116, 0, 42,119,112, 97,105,110,116, 0,118,103,114,111,117,112, 95,119,101,105,103,104,116, 0, 99,111,114,110,101,114,116,
-121,112,101, 0,101,100,105,116, 98,117,116,102,108, 97,103, 0,106,111,105,110,116,114,105,108,105,109,105,116, 0,100,101,103,
-114, 0,116,117,114,110, 0,101,120,116,114, 95,111,102,102,115, 0,100,111,117, 98,108,105,109,105,116, 0,110,111,114,109, 97,
-108,115,105,122,101, 0, 97,117,116,111,109,101,114,103,101, 0,115,101,103,109,101,110,116,115, 0,114,105,110,103,115, 0,118,
-101,114,116,105, 99,101,115, 0,117,110,119,114, 97,112,112,101,114, 0,117,118, 99, 97,108, 99, 95,114, 97,100,105,117,115, 0,
-117,118, 99, 97,108, 99, 95, 99,117, 98,101,115,105,122,101, 0,117,118, 99, 97,108, 99, 95,109, 97,114,103,105,110, 0,117,118,
- 99, 97,108, 99, 95,109, 97,112,100,105,114, 0,117,118, 99, 97,108, 99, 95,109, 97,112, 97,108,105,103,110, 0,117,118, 99, 97,
-108, 99, 95,102,108, 97,103, 0,117,118, 95,102,108, 97,103, 0,117,118, 95,115,101,108,101, 99,116,109,111,100,101, 0,117,118,
- 95,112, 97,100, 91, 50, 93, 0, 97,117,116,111,105,107, 95, 99,104, 97,105,110,108,101,110, 0,105,109, 97,112, 97,105,110,116,
- 0,112, 97,114,116,105, 99,108,101, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 95,115,105,122,101, 0,115,101,108,101,
- 99,116, 95,116,104,114,101,115,104, 0, 99,108,101, 97,110, 95,116,104,114,101,115,104, 0, 97,117,116,111,107,101,121, 95,109,
-111,100,101, 0, 97,117,116,111,107,101,121, 95,102,108, 97,103, 0,114,101,116,111,112,111, 95,109,111,100,101, 0,114,101,116,
-111,112,111, 95,112, 97,105,110,116, 95,116,111,111,108, 0,108,105,110,101, 95,100,105,118, 0,101,108,108,105,112,115,101, 95,
-100,105,118, 0,114,101,116,111,112,111, 95,104,111,116,115,112,111,116, 0,109,117,108,116,105,114,101,115, 95,115,117, 98,100,
-105,118, 95,116,121,112,101, 0,115,107,103,101,110, 95,114,101,115,111,108,117,116,105,111,110, 0,115,107,103,101,110, 95,116,
-104,114,101,115,104,111,108,100, 95,105,110,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,116,104,114,101,115,104,111,108,
-100, 95,101,120,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,108,101,110,103,116,104, 95,114, 97,116,105,111, 0,115,107,
-103,101,110, 95,108,101,110,103,116,104, 95,108,105,109,105,116, 0,115,107,103,101,110, 95, 97,110,103,108,101, 95,108,105,109,
-105,116, 0,115,107,103,101,110, 95, 99,111,114,114,101,108, 97,116,105,111,110, 95,108,105,109,105,116, 0,115,107,103,101,110,
- 95,115,121,109,109,101,116,114,121, 95,108,105,109,105,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95, 97,
-110,103,108,101, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,108,101,110,103,116,
-104, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,100,105,115,116, 97,110, 99,101,
- 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,111,112,116,105,111,110,115, 0,115,107,103,101,110, 95,112,111,115,116,
-112,114,111, 0,115,107,103,101,110, 95,112,111,115,116,112,114,111, 95,112, 97,115,115,101,115, 0,115,107,103,101,110, 95,115,
-117, 98,100,105,118,105,115,105,111,110,115, 91, 51, 93, 0,115,107,103,101,110, 95,109,117,108,116,105, 95,108,101,118,101,108,
- 0, 42,115,107,103,101,110, 95,116,101,109,112,108, 97,116,101, 0, 98,111,110,101, 95,115,107,101,116, 99,104,105,110,103, 0,
- 98,111,110,101, 95,115,107,101,116, 99,104,105,110,103, 95, 99,111,110,118,101,114,116, 0,115,107,103,101,110, 95,115,117, 98,
-100,105,118,105,115,105,111,110, 95,110,117,109, 98,101,114, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,111,
-112,116,105,111,110,115, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,114,111,108,108, 0,115,107,103,101,110,
- 95,115,105,100,101, 95,115,116,114,105,110,103, 91, 56, 93, 0,115,107,103,101,110, 95,110,117,109, 95,115,116,114,105,110,103,
- 91, 56, 93, 0,101,100,103,101, 95,109,111,100,101, 0,115,110, 97,112, 95,109,111,100,101, 0,115,110, 97,112, 95,102,108, 97,
-103, 0,115,110, 97,112, 95,116, 97,114,103,101,116, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 0,112,114,111,112, 95,
-109,111,100,101, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 95,111, 98,106,101, 99,116,115, 0, 97,117,116,111, 95,110,
-111,114,109, 97,108,105,122,101, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,115,101,116,116,105,110,103,115, 0,115,
- 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95,115,105,122,101, 0,115, 99,117,108,112,116, 95,
-112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95,117,110,112,114,111,106,101, 99,116,101,100, 95,114, 97,100,105,117,115,
- 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95, 97,108,112,104, 97, 0,116,111,116,111,
- 98,106, 0,116,111,116,108, 97,109,112, 0,116,111,116,111, 98,106,115,101,108, 0,116,111,116, 99,117,114,118,101, 0,116,111,
-116,109,101,115,104, 0,116,111,116, 97,114,109, 97,116,117,114,101, 0,115, 99, 97,108,101, 95,108,101,110,103,116,104, 0,115,
-121,115,116,101,109, 0,103,114, 97,118,105,116,121, 91, 51, 93, 0,113,117,105, 99,107, 95, 99, 97, 99,104,101, 95,115,116,101,
-112, 0, 42,119,111,114,108,100, 0, 42,115,101,116, 0, 98, 97,115,101, 0, 42, 98, 97,115, 97, 99,116, 0, 42,111, 98,101,100,
-105,116, 0, 99,117,114,115,111,114, 91, 51, 93, 0,116,119, 99,101,110,116, 91, 51, 93, 0,116,119,109,105,110, 91, 51, 93, 0,
-116,119,109, 97,120, 91, 51, 93, 0,108, 97,121, 97, 99,116, 0, 42,101,100, 0, 42,116,111,111,108,115,101,116,116,105,110,103,
-115, 0, 42,115,116, 97,116,115, 0, 97,117,100,105,111, 0,116,114, 97,110,115,102,111,114,109, 95,115,112, 97, 99,101,115, 0,
- 42,115,111,117,110,100, 95,115, 99,101,110,101, 0, 42,115,111,117,110,100, 95,115, 99,101,110,101, 95,104, 97,110,100,108,101,
- 0, 42,102,112,115, 95,105,110,102,111, 0, 42,116,104,101, 68, 97,103, 0,100, 97,103,105,115,118, 97,108,105,100, 0,100, 97,
-103,102,108, 97,103,115, 0,106,117,109,112,102,114, 97,109,101, 0,112, 97,100, 53, 0, 97, 99,116,105,118,101, 95,107,101,121,
-105,110,103,115,101,116, 0,107,101,121,105,110,103,115,101,116,115, 0,103,109, 0,117,110,105,116, 0,112,104,121,115,105, 99,
-115, 95,115,101,116,116,105,110,103,115, 0, 98,108,101,110,100, 0,118,105,101,119, 0,119,105,110,109, 97,116, 91, 52, 93, 91,
- 52, 93, 0,118,105,101,119,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,105,110,118, 91, 52, 93, 91, 52, 93, 0,112,
-101,114,115,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,105,110,118, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109,
- 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,109, 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,116,119,109, 97,116,
- 91, 52, 93, 91, 52, 93, 0,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,122,102, 97, 99, 0, 99, 97,109,100,120, 0, 99, 97,
-109,100,121, 0,112,105,120,115,105,122,101, 0, 99, 97,109,122,111,111,109, 0,118,105,101,119, 98,117,116, 0,116,119,100,114,
- 97,119,102,108, 97,103, 0,114,102,108, 97,103, 0,118,105,101,119,108,111, 99,107, 0,112,101,114,115,112, 0, 99,108,105,112,
- 91, 54, 93, 91, 52, 93, 0, 99,108,105,112, 95,108,111, 99, 97,108, 91, 54, 93, 91, 52, 93, 0, 42, 99,108,105,112, 98, 98, 0,
- 42,108,111, 99, 97,108,118,100, 0, 42,114,105, 0, 42,114,101,116,111,112,111, 95,118,105,101,119, 95,100, 97,116, 97, 0, 42,
-100,101,112,116,104,115, 0, 42,115,109,115, 0, 42,115,109,111,111,116,104, 95,116,105,109,101,114, 0,108,118,105,101,119,113,
-117, 97,116, 91, 52, 93, 0,108,112,101,114,115,112, 0,108,118,105,101,119, 0,103,114,105,100,118,105,101,119, 0,116,119, 97,
-110,103,108,101, 91, 51, 93, 0,112, 97,100,102, 0,114,101,103,105,111,110, 98, 97,115,101, 0,115,112, 97, 99,101,116,121,112,
-101, 0, 98,108,111, 99,107,115, 99, 97,108,101, 0, 98,108,111, 99,107,104, 97,110,100,108,101,114, 91, 56, 93, 0,108, 97,121,
- 95,117,115,101,100, 0, 42,111, 98, 95, 99,101,110,116,114,101, 0, 98,103,112,105, 99, 98, 97,115,101, 0, 42, 98,103,112,105,
- 99, 0,111, 98, 95, 99,101,110,116,114,101, 95, 98,111,110,101, 91, 51, 50, 93, 0,100,114, 97,119,116,121,112,101, 0,115, 99,
-101,110,101,108,111, 99,107, 0, 97,114,111,117,110,100, 0,112,105,118,111,116, 95,108, 97,115,116, 0,103,114,105,100, 0,110,
-101, 97,114, 0,102, 97,114, 0,103,114,105,100,108,105,110,101,115, 0,103,114,105,100,102,108, 97,103, 0,103,114,105,100,115,
-117, 98,100,105,118, 0,109,111,100,101,115,101,108,101, 99,116, 0,107,101,121,102,108, 97,103,115, 0,116,119,116,121,112,101,
- 0,116,119,109,111,100,101, 0,116,119,102,108, 97,103, 0, 99,117,115,116,111,109,100, 97,116, 97, 95,109, 97,115,107, 0, 97,
-102,116,101,114,100,114, 97,119, 0,122, 98,117,102, 0,120,114, 97,121, 0,110,100,111,102,109,111,100,101, 0,110,100,111,102,
-102,105,108,116,101,114, 0, 42,112,114,111,112,101,114,116,105,101,115, 95,115,116,111,114, 97,103,101, 0,118,101,114,116, 0,
-104,111,114, 0,109, 97,115,107, 0,109,105,110, 91, 50, 93, 0,109, 97,120, 91, 50, 93, 0,109,105,110,122,111,111,109, 0,109,
- 97,120,122,111,111,109, 0,115, 99,114,111,108,108, 0,115, 99,114,111,108,108, 95,117,105, 0,107,101,101,112,116,111,116, 0,
-107,101,101,112,122,111,111,109, 0,107,101,101,112,111,102,115, 0, 97,108,105,103,110, 0,119,105,110,120, 0,119,105,110,121,
- 0,111,108,100,119,105,110,120, 0,111,108,100,119,105,110,121, 0, 42,116, 97, 98, 95,111,102,102,115,101,116, 0,116, 97, 98,
- 95,110,117,109, 0,116, 97, 98, 95, 99,117,114, 0, 42,115, 99,114,101,101,110, 0,118, 50,100, 0, 42, 97,100,115, 0,103,104,
-111,115,116, 67,117,114,118,101,115, 0, 97,117,116,111,115,110, 97,112, 0, 99,117,114,115,111,114, 86, 97,108, 0,109, 97,105,
-110, 98, 0,109, 97,105,110, 98,111, 0,109, 97,105,110, 98,117,115,101,114, 0,114,101, 95, 97,108,105,103,110, 0,112,114,101,
-118,105,101,119, 0,112, 97,116,104,102,108, 97,103, 0,100, 97,116, 97,105, 99,111,110, 0, 42,112,105,110,105,100, 0,114,101,
-110,100,101,114, 95,115,105,122,101, 0, 99,104, 97,110,115,104,111,119,110, 0,122,101, 98,114, 97, 0,122,111,111,109, 0,116,
-105,116,108,101, 91, 50, 52, 93, 0,100,105,114, 91, 50, 52, 48, 93, 0,102,105,108,101, 91, 56, 48, 93, 0,114,101,110, 97,109,
-101,102,105,108,101, 91, 56, 48, 93, 0,115,111,114,116, 0,100,105,115,112,108, 97,121, 0, 97, 99,116,105,118,101, 95, 98,111,
-111,107,109, 97,114,107, 0, 97, 99,116,105,118,101, 95,102,105,108,101, 0,115,101,108,115,116, 97,116,101, 0,102, 95,102,112,
- 0,102,112, 95,115,116,114, 91, 56, 93, 0,115, 99,114,111,108,108, 95,111,102,102,115,101,116, 0, 42,112, 97,114, 97,109,115,
- 0, 42,102,105,108,101,115, 0, 42,102,111,108,100,101,114,115, 95,112,114,101,118, 0, 42,102,111,108,100,101,114,115, 95,110,
-101,120,116, 0, 42,111,112, 0, 42,115,109,111,111,116,104,115, 99,114,111,108,108, 95,116,105,109,101,114, 0, 42,108, 97,121,
-111,117,116, 0,114,101, 99,101,110,116,110,114, 0, 98,111,111,107,109, 97,114,107,110,114, 0,115,121,115,116,101,109,110,114,
- 0,116,114,101,101, 0, 42,116,114,101,101,115,116,111,114,101, 0,115,101, 97,114, 99,104, 95,115,116,114,105,110,103, 91, 51,
- 50, 93, 0,115,101, 97,114, 99,104, 95,116,115,101, 0,115,101, 97,114, 99,104, 95,102,108, 97,103,115, 0,100,111, 95, 0,111,
-117,116,108,105,110,101,118,105,115, 0,115,116,111,114,101,102,108, 97,103, 0, 42, 99,117,109, 97,112, 0,105,109, 97,110,114,
- 0, 99,117,114,116,105,108,101, 0,105,109,116,121,112,101,110,114, 0,108,111, 99,107, 0,112,105,110, 0,100,116, 95,117,118,
- 0,115,116,105, 99,107,121, 0,100,116, 95,117,118,115,116,114,101,116, 99,104, 0, 99,117,114,115,111,114, 91, 50, 93, 0, 99,
-101,110,116,120, 0, 99,101,110,116,121, 0,115, 99,111,112,101,115, 0,115, 97,109,112,108,101, 95,108,105,110,101, 95,104,105,
-115,116, 0, 42,116,101,120,116, 0,116,111,112, 0,118,105,101,119,108,105,110,101,115, 0,108,104,101,105,103,104,116, 0, 99,
-119,105,100,116,104, 0,108,105,110,101,110,114,115, 95,116,111,116, 0,108,101,102,116, 0,115,104,111,119,108,105,110,101,110,
-114,115, 0,116, 97, 98,110,117,109, 98,101,114, 0,115,104,111,119,115,121,110,116, 97,120, 0,111,118,101,114,119,114,105,116,
-101, 0,108,105,118,101, 95,101,100,105,116, 0,112,105,120, 95,112,101,114, 95,108,105,110,101, 0,116,120,116,115, 99,114,111,
-108,108, 0,116,120,116, 98, 97,114, 0,119,111,114,100,119,114, 97,112, 0,100,111,112,108,117,103,105,110,115, 0,102,105,110,
-100,115,116,114, 91, 50, 53, 54, 93, 0,114,101,112,108, 97, 99,101,115,116,114, 91, 50, 53, 54, 93, 0, 42,112,121, 95,100,114,
- 97,119, 0, 42,112,121, 95,101,118,101,110,116, 0, 42,112,121, 95, 98,117,116,116,111,110, 0, 42,112,121, 95, 98,114,111,119,
-115,101,114, 99, 97,108,108, 98, 97, 99,107, 0, 42,112,121, 95,103,108,111, 98, 97,108,100,105, 99,116, 0,108, 97,115,116,115,
-112, 97, 99,101, 0,115, 99,114,105,112,116,110, 97,109,101, 91, 50, 53, 54, 93, 0,115, 99,114,105,112,116, 97,114,103, 91, 50,
- 53, 54, 93, 0, 42,115, 99,114,105,112,116, 0, 42, 98,117,116, 95,114,101,102,115, 0, 42, 97,114,114, 97,121, 0, 99, 97, 99,
-104,101,115, 0, 99, 97, 99,104,101, 95,100,105,115,112,108, 97,121, 0,114,101,100,114, 97,119,115, 0, 42,105,100, 0, 97,115,
-112,101, 99,116, 0, 42, 99,117,114,102,111,110,116, 0,109,120, 0,109,121, 0, 42,101,100,105,116,116,114,101,101, 0,116,114,
-101,101,116,121,112,101, 0,116,101,120,102,114,111,109, 0,109,101,110,117, 0,110,117,109,116,105,108,101,115,120, 0,110,117,
-109,116,105,108,101,115,121, 0,118,105,101,119,114,101, 99,116, 0, 98,111,111,107,109, 97,114,107,114,101, 99,116, 0,115, 99,
-114,111,108,108,112,111,115, 0,115, 99,114,111,108,108,104,101,105,103,104,116, 0,115, 99,114,111,108,108, 97,114,101, 97, 0,
-114,101,116,118, 97,108, 0,112,114,118, 95,119, 0,112,114,118, 95,104, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 41,
- 40, 41, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 95,101,118,101,110,116, 41, 40, 41, 0, 40, 42,114,101,116,117,114,
-110,102,117,110, 99, 95, 97,114,103,115, 41, 40, 41, 0, 42, 97,114,103, 49, 0, 42, 97,114,103, 50, 0, 42,109,101,110,117,112,
- 0, 42,112,117,112,109,101,110,117, 0, 42,105,109,103, 0,108,101,110, 95, 97,108,108,111, 99, 0, 99,117,114,115,111,114, 0,
-114,112,116, 95,109, 97,115,107, 0,115, 99,114,111,108,108, 98, 97, 99,107, 0,104,105,115,116,111,114,121, 0,112,114,111,109,
-112,116, 91, 50, 53, 54, 93, 0,108, 97,110,103,117, 97,103,101, 91, 51, 50, 93, 0,115,101,108, 95,115,116, 97,114,116, 0,115,
-101,108, 95,101,110,100, 0,102,105,108,116,101,114, 91, 54, 52, 93, 0, 42, 97,114,101, 97, 0, 42,115,111,117,110,100, 0,115,
-110,100,110,114, 0,102,105,108,101,110, 97,109,101, 91, 50, 53, 54, 93, 0, 98,108,102, 95,105,100, 0,117,105,102,111,110,116,
- 95,105,100, 0,114, 95,116,111, 95,108, 0,112,111,105,110,116,115, 0,107,101,114,110,105,110,103, 0,105,116, 97,108,105, 99,
- 0, 98,111,108,100, 0,115,104, 97,100,111,119, 0,115,104, 97,100,120, 0,115,104, 97,100,121, 0,115,104, 97,100,111,119, 97,
-108,112,104, 97, 0,115,104, 97,100,111,119, 99,111,108,111,114, 0,112, 97,110,101,108,116,105,116,108,101, 0,103,114,111,117,
-112,108, 97, 98,101,108, 0,119,105,100,103,101,116,108, 97, 98,101,108, 0,119,105,100,103,101,116, 0,112, 97,110,101,108,122,
-111,111,109, 0,109,105,110,108, 97, 98,101,108, 99,104, 97,114,115, 0,109,105,110,119,105,100,103,101,116, 99,104, 97,114,115,
- 0, 99,111,108,117,109,110,115,112, 97, 99,101, 0,116,101,109,112,108, 97,116,101,115,112, 97, 99,101, 0, 98,111,120,115,112,
- 97, 99,101, 0, 98,117,116,116,111,110,115,112, 97, 99,101,120, 0, 98,117,116,116,111,110,115,112, 97, 99,101,121, 0,112, 97,
-110,101,108,115,112, 97, 99,101, 0,112, 97,110,101,108,111,117,116,101,114, 0,112, 97,100, 91, 49, 93, 0,111,117,116,108,105,
-110,101, 91, 52, 93, 0,105,110,110,101,114, 91, 52, 93, 0,105,110,110,101,114, 95,115,101,108, 91, 52, 93, 0,105,116,101,109,
- 91, 52, 93, 0,116,101,120,116, 91, 52, 93, 0,116,101,120,116, 95,115,101,108, 91, 52, 93, 0,115,104, 97,100,101,100, 0,115,
-104, 97,100,101,116,111,112, 0,115,104, 97,100,101,100,111,119,110, 0, 97,108,112,104, 97, 95, 99,104,101, 99,107, 0,105,110,
-110,101,114, 95, 97,110,105,109, 91, 52, 93, 0,105,110,110,101,114, 95, 97,110,105,109, 95,115,101,108, 91, 52, 93, 0,105,110,
-110,101,114, 95,107,101,121, 91, 52, 93, 0,105,110,110,101,114, 95,107,101,121, 95,115,101,108, 91, 52, 93, 0,105,110,110,101,
-114, 95,100,114,105,118,101,110, 91, 52, 93, 0,105,110,110,101,114, 95,100,114,105,118,101,110, 95,115,101,108, 91, 52, 93, 0,
-119, 99,111,108, 95,114,101,103,117,108, 97,114, 0,119, 99,111,108, 95,116,111,111,108, 0,119, 99,111,108, 95,116,101,120,116,
- 0,119, 99,111,108, 95,114, 97,100,105,111, 0,119, 99,111,108, 95,111,112,116,105,111,110, 0,119, 99,111,108, 95,116,111,103,
-103,108,101, 0,119, 99,111,108, 95,110,117,109, 0,119, 99,111,108, 95,110,117,109,115,108,105,100,101,114, 0,119, 99,111,108,
- 95,109,101,110,117, 0,119, 99,111,108, 95,112,117,108,108,100,111,119,110, 0,119, 99,111,108, 95,109,101,110,117, 95, 98, 97,
- 99,107, 0,119, 99,111,108, 95,109,101,110,117, 95,105,116,101,109, 0,119, 99,111,108, 95, 98,111,120, 0,119, 99,111,108, 95,
-115, 99,114,111,108,108, 0,119, 99,111,108, 95,112,114,111,103,114,101,115,115, 0,119, 99,111,108, 95,108,105,115,116, 95,105,
-116,101,109, 0,119, 99,111,108, 95,115,116, 97,116,101, 0,105, 99,111,110,102,105,108,101, 91, 56, 48, 93, 0, 98, 97, 99,107,
- 91, 52, 93, 0,116,105,116,108,101, 91, 52, 93, 0,116,101,120,116, 95,104,105, 91, 52, 93, 0,104,101, 97,100,101,114, 91, 52,
- 93, 0,104,101, 97,100,101,114, 95,116,105,116,108,101, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101,120,116, 91, 52, 93,
- 0,104,101, 97,100,101,114, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0, 98,117,116,116,111,110, 91, 52, 93, 0, 98,117,116,
-116,111,110, 95,116,105,116,108,101, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 91, 52, 93, 0, 98,117,116,116,
-111,110, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,108,105,115,116, 91, 52, 93, 0,108,105,115,116, 95,116,105,116,108,101,
- 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116, 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116, 95,104,105, 91, 52, 93,
- 0,112, 97,110,101,108, 91, 52, 93, 0,112, 97,110,101,108, 95,116,105,116,108,101, 91, 52, 93, 0,112, 97,110,101,108, 95,116,
-101,120,116, 91, 52, 93, 0,112, 97,110,101,108, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,115,104, 97,100,101, 49, 91, 52,
- 93, 0,115,104, 97,100,101, 50, 91, 52, 93, 0,104,105,108,105,116,101, 91, 52, 93, 0,103,114,105,100, 91, 52, 93, 0,119,105,
-114,101, 91, 52, 93, 0,115,101,108,101, 99,116, 91, 52, 93, 0,108, 97,109,112, 91, 52, 93, 0, 97, 99,116,105,118,101, 91, 52,
- 93, 0,103,114,111,117,112, 91, 52, 93, 0,103,114,111,117,112, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,116,114, 97,110,115,
-102,111,114,109, 91, 52, 93, 0,118,101,114,116,101,120, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,101,108,101, 99,116, 91,
- 52, 93, 0,101,100,103,101, 91, 52, 93, 0,101,100,103,101, 95,115,101,108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 95,115,
-101, 97,109, 91, 52, 93, 0,101,100,103,101, 95,115,104, 97,114,112, 91, 52, 93, 0,101,100,103,101, 95,102, 97, 99,101,115,101,
-108, 91, 52, 93, 0,101,100,103,101, 95, 99,114,101, 97,115,101, 91, 52, 93, 0,102, 97, 99,101, 91, 52, 93, 0,102, 97, 99,101,
- 95,115,101,108,101, 99,116, 91, 52, 93, 0,102, 97, 99,101, 95,100,111,116, 91, 52, 93, 0,110,111,114,109, 97,108, 91, 52, 93,
- 0,118,101,114,116,101,120, 95,110,111,114,109, 97,108, 91, 52, 93, 0, 98,111,110,101, 95,115,111,108,105,100, 91, 52, 93, 0,
- 98,111,110,101, 95,112,111,115,101, 91, 52, 93, 0,115,116,114,105,112, 91, 52, 93, 0,115,116,114,105,112, 95,115,101,108,101,
- 99,116, 91, 52, 93, 0, 99,102,114, 97,109,101, 91, 52, 93, 0,110,117,114, 98, 95,117,108,105,110,101, 91, 52, 93, 0,110,117,
-114, 98, 95,118,108,105,110,101, 91, 52, 93, 0, 97, 99,116, 95,115,112,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95,115,
-101,108, 95,117,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95,115,101,108, 95,118,108,105,110,101, 91, 52, 93, 0,108, 97,
-115,116,115,101,108, 95,112,111,105,110,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,102,114,101,101, 91, 52, 93, 0,104, 97,
-110,100,108,101, 95, 97,117,116,111, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101, 99,116, 91, 52, 93, 0,104, 97,110,100,
-108,101, 95, 97,108,105,103,110, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95,102,114,101,101, 91, 52, 93, 0,104,
- 97,110,100,108,101, 95,115,101,108, 95, 97,117,116,111, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95,118,101, 99,
-116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95, 97,108,105,103,110, 91, 52, 93, 0,100,115, 95, 99,104, 97,110,
-110,101,108, 91, 52, 93, 0,100,115, 95,115,117, 98, 99,104, 97,110,110,101,108, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,
-111,117,116,112,117,116, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,105,110,112,117,116, 91, 52, 93, 0, 99,111,110,115,111,
-108,101, 95,105,110,102,111, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,101,114,114,111,114, 91, 52, 93, 0, 99,111,110,115,
-111,108,101, 95, 99,117,114,115,111,114, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,105,122,101, 0,102, 97, 99,101,100,111,
-116, 95,115,105,122,101, 0, 98,112, 97,100, 91, 50, 93, 0,115,121,110,116, 97,120,108, 91, 52, 93, 0,115,121,110,116, 97,120,
-110, 91, 52, 93, 0,115,121,110,116, 97,120, 98, 91, 52, 93, 0,115,121,110,116, 97,120,118, 91, 52, 93, 0,115,121,110,116, 97,
-120, 99, 91, 52, 93, 0,109,111,118,105,101, 91, 52, 93, 0,105,109, 97,103,101, 91, 52, 93, 0,115, 99,101,110,101, 91, 52, 93,
- 0, 97,117,100,105,111, 91, 52, 93, 0,101,102,102,101, 99,116, 91, 52, 93, 0,112,108,117,103,105,110, 91, 52, 93, 0,116,114,
- 97,110,115,105,116,105,111,110, 91, 52, 93, 0,109,101,116, 97, 91, 52, 93, 0,101,100,105,116,109,101,115,104, 95, 97, 99,116,
-105,118,101, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,
-101,114,116,101,120, 95,115,101,108,101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 95,115,105,
-122,101, 0,104,112, 97,100, 91, 55, 93, 0,112,114,101,118,105,101,119, 95, 98, 97, 99,107, 91, 52, 93, 0,115,111,108,105,100,
- 91, 52, 93, 0,116,117,105, 0,116, 98,117,116,115, 0,116,118, 51,100, 0,116,102,105,108,101, 0,116,105,112,111, 0,116,105,
-110,102,111, 0,116,115,110,100, 0,116, 97, 99,116, 0,116,110,108, 97, 0,116,115,101,113, 0,116,105,109, 97, 0,116,105,109,
- 97,115,101,108, 0,116,101,120,116, 0,116,111,111,112,115, 0,116,116,105,109,101, 0,116,110,111,100,101, 0,116,108,111,103,
-105, 99, 0,116,117,115,101,114,112,114,101,102, 0,116, 99,111,110,115,111,108,101, 0,116, 97,114,109, 91, 50, 48, 93, 0, 97,
- 99,116,105,118,101, 95,116,104,101,109,101, 95, 97,114,101, 97, 0,109,111,100,117,108,101, 91, 54, 52, 93, 0,115,112,101, 99,
- 91, 52, 93, 0,100,117,112,102,108, 97,103, 0,115, 97,118,101,116,105,109,101, 0,116,101,109,112,100,105,114, 91, 49, 54, 48,
- 93, 0,102,111,110,116,100,105,114, 91, 49, 54, 48, 93, 0,114,101,110,100,101,114,100,105,114, 91, 49, 54, 48, 93, 0,116,101,
-120,116,117,100,105,114, 91, 49, 54, 48, 93, 0,112,108,117,103,116,101,120,100,105,114, 91, 49, 54, 48, 93, 0,112,108,117,103,
-115,101,113,100,105,114, 91, 49, 54, 48, 93, 0,112,121,116,104,111,110,100,105,114, 91, 49, 54, 48, 93, 0,115,111,117,110,100,
-100,105,114, 91, 49, 54, 48, 93, 0,105,109, 97,103,101, 95,101,100,105,116,111,114, 91, 50, 52, 48, 93, 0, 97,110,105,109, 95,
-112,108, 97,121,101,114, 91, 50, 52, 48, 93, 0, 97,110,105,109, 95,112,108, 97,121,101,114, 95,112,114,101,115,101,116, 0,118,
- 50,100, 95,109,105,110, 95,103,114,105,100,115,105,122,101, 0,116,105,109,101, 99,111,100,101, 95,115,116,121,108,101, 0,118,
-101,114,115,105,111,110,115, 0,100, 98,108, 95, 99,108,105, 99,107, 95,116,105,109,101, 0,103, 97,109,101,102,108, 97,103,115,
- 0,119,104,101,101,108,108,105,110,101,115, 99,114,111,108,108, 0,117,105,102,108, 97,103, 0,108, 97,110,103,117, 97,103,101,
- 0,117,115,101,114,112,114,101,102, 0,118,105,101,119,122,111,111,109, 0,109,105,120, 98,117,102,115,105,122,101, 0, 97,117,
-100,105,111,100,101,118,105, 99,101, 0, 97,117,100,105,111,114, 97,116,101, 0, 97,117,100,105,111,102,111,114,109, 97,116, 0,
- 97,117,100,105,111, 99,104, 97,110,110,101,108,115, 0,100,112,105, 0,101,110, 99,111,100,105,110,103, 0,116,114, 97,110,115,
-111,112,116,115, 0,109,101,110,117,116,104,114,101,115,104,111,108,100, 49, 0,109,101,110,117,116,104,114,101,115,104,111,108,
-100, 50, 0,116,104,101,109,101,115, 0,117,105,102,111,110,116,115, 0,117,105,115,116,121,108,101,115, 0,107,101,121,109, 97,
-112,115, 0, 97,100,100,111,110,115, 0,107,101,121, 99,111,110,102,105,103,115,116,114, 91, 54, 52, 93, 0,117,110,100,111,115,
-116,101,112,115, 0,117,110,100,111,109,101,109,111,114,121, 0,103,112, 95,109, 97,110,104, 97,116,116,101,110,100,105,115,116,
- 0,103,112, 95,101,117, 99,108,105,100,101, 97,110,100,105,115,116, 0,103,112, 95,101,114, 97,115,101,114, 0,103,112, 95,115,
-101,116,116,105,110,103,115, 0,116, 98, 95,108,101,102,116,109,111,117,115,101, 0,116, 98, 95,114,105,103,104,116,109,111,117,
-115,101, 0,108,105,103,104,116, 91, 51, 93, 0,116,119, 95,104,111,116,115,112,111,116, 0,116,119, 95,102,108, 97,103, 0,116,
-119, 95,104, 97,110,100,108,101,115,105,122,101, 0,116,119, 95,115,105,122,101, 0,116,101,120,116,105,109,101,111,117,116, 0,
-116,101,120, 99,111,108,108,101, 99,116,114, 97,116,101, 0,119,109,100,114, 97,119,109,101,116,104,111,100, 0,109,101,109, 99,
- 97, 99,104,101,108,105,109,105,116, 0,112,114,101,102,101,116, 99,104,102,114, 97,109,101,115, 0,102,114, 97,109,101,115,101,
-114,118,101,114,112,111,114,116, 0,112, 97,100, 95,114,111,116, 95, 97,110,103,108,101, 0,111, 98, 99,101,110,116,101,114, 95,
-100,105, 97, 0,114,118,105,115,105,122,101, 0,114,118,105, 98,114,105,103,104,116, 0,114,101, 99,101,110,116, 95,102,105,108,
-101,115, 0,115,109,111,111,116,104, 95,118,105,101,119,116,120, 0,103,108,114,101,115,108,105,109,105,116, 0,110,100,111,102,
- 95,112, 97,110, 0,110,100,111,102, 95,114,111,116, 97,116,101, 0, 99,117,114,115,115,105,122,101, 0, 99,111,108,111,114, 95,
-112,105, 99,107,101,114, 95,116,121,112,101, 0,105,112,111, 95,110,101,119, 0,107,101,121,104, 97,110,100,108,101,115, 95,110,
-101,119, 0,115, 99,114, 99, 97,115,116,102,112,115, 0,115, 99,114, 99, 97,115,116,119, 97,105,116, 0,112,114,111,112,119,105,
-100,116,104, 0,118,101,114,115,101,109, 97,115,116,101,114, 91, 49, 54, 48, 93, 0,118,101,114,115,101,117,115,101,114, 91, 49,
- 54, 48, 93, 0,103,108, 97,108,112,104, 97, 99,108,105,112, 0, 99,111, 98, 97, 95,119,101,105,103,104,116, 0,115, 99,117,108,
-112,116, 95,112, 97,105,110,116, 95,111,118,101,114,108, 97,121, 95, 99,111,108, 91, 51, 93, 0,118,101,114,116, 98, 97,115,101,
- 0,101,100,103,101, 98, 97,115,101, 0, 97,114,101, 97, 98, 97,115,101, 0, 42,110,101,119,115, 99,101,110,101, 0,102,117,108,
-108, 0,119,105,110,105,100, 0,100,111, 95,100,114, 97,119, 0,100,111, 95,114,101,102,114,101,115,104, 0,100,111, 95,100,114,
- 97,119, 95,103,101,115,116,117,114,101, 0,100,111, 95,100,114, 97,119, 95,112, 97,105,110,116, 99,117,114,115,111,114, 0,100,
-111, 95,100,114, 97,119, 95,100,114, 97,103, 0,115,119, 97,112, 0,109, 97,105,110,119,105,110, 0,115,117, 98,119,105,110, 97,
- 99,116,105,118,101, 0, 42, 97,110,105,109,116,105,109,101,114, 0, 42, 99,111,110,116,101,120,116, 0,104, 97,110,100,108,101,
-114, 91, 56, 93, 0, 42,110,101,119,118, 0,118,101, 99, 0, 42,118, 49, 0, 42,118, 50, 0, 42,116,121,112,101, 0,112, 97,110,
-101,108,110, 97,109,101, 91, 54, 52, 93, 0,116, 97, 98,110, 97,109,101, 91, 54, 52, 93, 0,100,114, 97,119,110, 97,109,101, 91,
- 54, 52, 93, 0,111,102,115,120, 0,111,102,115,121, 0,115,105,122,101,120, 0,115,105,122,101,121, 0,108, 97, 98,101,108,111,
-102,115, 0,114,117,110,116,105,109,101, 95,102,108, 97,103, 0, 99,111,110,116,114,111,108, 0,115,110, 97,112, 0,115,111,114,
-116,111,114,100,101,114, 0, 42,112, 97,110,101,108,116, 97, 98, 0, 42, 97, 99,116,105,118,101,100, 97,116, 97, 0,108,105,115,
-116, 95,115, 99,114,111,108,108, 0,108,105,115,116, 95,115,105,122,101, 0,108,105,115,116, 95,108, 97,115,116, 95,108,101,110,
- 0,108,105,115,116, 95,103,114,105,112, 95,115,105,122,101, 0,108,105,115,116, 95,115,101, 97,114, 99,104, 91, 54, 52, 93, 0,
- 42,118, 51, 0, 42,118, 52, 0, 42,102,117,108,108, 0, 98,117,116,115,112, 97, 99,101,116,121,112,101, 0,104,101, 97,100,101,
-114,116,121,112,101, 0,115,112, 97, 99,101,100, 97,116, 97, 0,104, 97,110,100,108,101,114,115, 0, 97, 99,116,105,111,110,122,
-111,110,101,115, 0,119,105,110,114, 99,116, 0,100,114, 97,119,114, 99,116, 0,115,119,105,110,105,100, 0,114,101,103,105,111,
-110,116,121,112,101, 0, 97,108,105,103,110,109,101,110,116, 0,100,111, 95,100,114, 97,119, 95,111,118,101,114,108, 97,121, 0,
-117,105, 98,108,111, 99,107,115, 0,112, 97,110,101,108,115, 0, 42,104,101, 97,100,101,114,115,116,114, 0, 42,114,101,103,105,
-111,110,100, 97,116, 97, 0,115,117, 98,118,115,116,114, 91, 52, 93, 0,115,117, 98,118,101,114,115,105,111,110, 0,112, 97,100,
-115, 0,109,105,110,118,101,114,115,105,111,110, 0,109,105,110,115,117, 98,118,101,114,115,105,111,110, 0, 42, 99,117,114,115,
- 99,114,101,101,110, 0, 42, 99,117,114,115, 99,101,110,101, 0,102,105,108,101,102,108, 97,103,115, 0,103,108,111, 98, 97,108,
-102, 0,102,105,108,101,110, 97,109,101, 91, 50, 52, 48, 93, 0,110, 97,109,101, 91, 56, 48, 93, 0, 42,105, 98,117,102, 0, 42,
-105, 98,117,102, 95, 99,111,109,112, 0, 42,115,101, 49, 0, 42,115,101, 50, 0, 42,115,101, 51, 0,110,114, 0, 98,111,116,116,
-111,109, 0,114,105,103,104,116, 0,120,111,102,115, 0,121,111,102,115, 0,108,105,102,116, 91, 51, 93, 0,103, 97,109,109, 97,
- 91, 51, 93, 0,103, 97,105,110, 91, 51, 93, 0,100,105,114, 91, 49, 54, 48, 93, 0,100,111,110,101, 0,115,116, 97,114,116,115,
-116,105,108,108, 0,101,110,100,115,116,105,108,108, 0, 42,115,116,114,105,112,100, 97,116, 97, 0,111,114,120, 0,111,114,121,
- 0, 42, 99,114,111,112, 0, 42,116,114, 97,110,115,102,111,114,109, 0, 42, 99,111,108,111,114, 95, 98, 97,108, 97,110, 99,101,
- 0, 42,116,115,116,114,105,112,100, 97,116, 97, 0, 42,116,115,116,114,105,112,100, 97,116, 97, 95,115,116, 97,114,116,115,116,
-105,108,108, 0, 42,116,115,116,114,105,112,100, 97,116, 97, 95,101,110,100,115,116,105,108,108, 0, 42,105, 98,117,102, 95,115,
-116, 97,114,116,115,116,105,108,108, 0, 42,105, 98,117,102, 95,101,110,100,115,116,105,108,108, 0, 42,105,110,115,116, 97,110,
- 99,101, 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, 0, 42, 42, 99,117,114,114,101,110,116, 95,112,114,105,118, 97,116,
-101, 95,100, 97,116, 97, 0, 42,116,109,112, 0,115,116, 97,114,116,111,102,115, 0,101,110,100,111,102,115, 0,109, 97, 99,104,
-105,110,101, 0,115,116, 97,114,116,100,105,115,112, 0,101,110,100,100,105,115,112, 0,115, 97,116, 0,109,117,108, 0,104, 97,
-110,100,115,105,122,101, 0, 97,110,105,109, 95,112,114,101,115,101,101,107, 0, 42,115,116,114,105,112, 0, 42,115, 99,101,110,
-101, 95, 99, 97,109,101,114, 97, 0,101,102,102,101, 99,116, 95,102, 97,100,101,114, 0,115,112,101,101,100, 95,102, 97,100,101,
-114, 0, 42,115,101,113, 49, 0, 42,115,101,113, 50, 0, 42,115,101,113, 51, 0,115,101,113, 98, 97,115,101, 0, 42,115, 99,101,
-110,101, 95,115,111,117,110,100, 0,108,101,118,101,108, 0,112, 97,110, 0,115, 99,101,110,101,110,114, 0,109,117,108,116,105,
- 99, 97,109, 95,115,111,117,114, 99,101, 0,115,116,114,111, 98,101, 0, 42,101,102,102,101, 99,116,100, 97,116, 97, 0, 97,110,
-105,109, 95,115,116, 97,114,116,111,102,115, 0, 97,110,105,109, 95,101,110,100,111,102,115, 0, 98,108,101,110,100, 95,109,111,
-100,101, 0, 98,108,101,110,100, 95,111,112, 97, 99,105,116,121, 0, 42,111,108,100, 98, 97,115,101,112, 0, 42,112, 97,114,115,
-101,113, 0, 42,115,101,113, 98, 97,115,101,112, 0,109,101,116, 97,115,116, 97, 99,107, 0, 42, 97, 99,116, 95,115,101,113, 0,
- 97, 99,116, 95,105,109, 97,103,101,100,105,114, 91, 50, 53, 54, 93, 0, 97, 99,116, 95,115,111,117,110,100,100,105,114, 91, 50,
- 53, 54, 93, 0,111,118,101,114, 95,111,102,115, 0,111,118,101,114, 95, 99,102,114, 97, 0,111,118,101,114, 95,102,108, 97,103,
- 0,111,118,101,114, 95, 98,111,114,100,101,114, 0,101,100,103,101, 87,105,100,116,104, 0,102,111,114,119, 97,114,100, 0,119,
-105,112,101,116,121,112,101, 0,102, 77,105,110,105, 0,102, 67,108, 97,109,112, 0,102, 66,111,111,115,116, 0,100, 68,105,115,
-116, 0,100, 81,117, 97,108,105,116,121, 0, 98, 78,111, 67,111,109,112, 0, 83, 99, 97,108,101,120, 73,110,105, 0, 83, 99, 97,
-108,101,121, 73,110,105, 0, 83, 99, 97,108,101,120, 70,105,110, 0, 83, 99, 97,108,101,121, 70,105,110, 0,120, 73,110,105, 0,
-120, 70,105,110, 0,121, 73,110,105, 0,121, 70,105,110, 0,114,111,116, 73,110,105, 0,114,111,116, 70,105,110, 0,105,110,116,
-101,114,112,111,108, 97,116,105,111,110, 0,117,110,105,102,111,114,109, 95,115, 99, 97,108,101, 0, 42,102,114, 97,109,101, 77,
- 97,112, 0,103,108,111, 98, 97,108, 83,112,101,101,100, 0,108, 97,115,116, 86, 97,108,105,100, 70,114, 97,109,101, 0, 98,117,
-116,116,121,112,101, 0,117,115,101,114,106,105,116, 0,115,116, 97, 0,116,111,116,112, 97,114,116, 0,110,111,114,109,102, 97,
- 99, 0,111, 98,102, 97, 99, 0,114, 97,110,100,102, 97, 99, 0,116,101,120,102, 97, 99, 0,114, 97,110,100,108,105,102,101, 0,
-102,111,114, 99,101, 91, 51, 93, 0,118,101, 99,116,115,105,122,101, 0,109, 97,120,108,101,110, 0,100,101,102,118,101, 99, 91,
- 51, 93, 0,109,117,108,116, 91, 52, 93, 0,108,105,102,101, 91, 52, 93, 0, 99,104,105,108,100, 91, 52, 93, 0,109, 97,116, 91,
- 52, 93, 0,116,101,120,109, 97,112, 0, 99,117,114,109,117,108,116, 0,115,116, 97,116,105, 99,115,116,101,112, 0,111,109, 97,
-116, 0,116,105,109,101,116,101,120, 0,115,112,101,101,100,116,101,120, 0,102,108, 97,103, 50,110,101,103, 0,118,101,114,116,
-103,114,111,117,112, 95,118, 0,118,103,114,111,117,112,110, 97,109,101, 91, 51, 50, 93, 0,118,103,114,111,117,112,110, 97,109,
-101, 95,118, 91, 51, 50, 93, 0, 42,107,101,121,115, 0,109,105,110,102, 97, 99, 0,117,115,101,100, 0,117,115,101,100,101,108,
-101,109, 0, 42,112,111,105,110, 0,114,101,115,101,116,100,105,115,116, 0,108, 97,115,116,118, 97,108, 0, 42,109, 97, 0,107,
-101,121, 0,113,117, 97,108, 0,113,117, 97,108, 50, 0,116, 97,114,103,101,116, 78, 97,109,101, 91, 51, 50, 93, 0,116,111,103,
-103,108,101, 78, 97,109,101, 91, 51, 50, 93, 0,118, 97,108,117,101, 91, 51, 50, 93, 0,109, 97,120,118, 97,108,117,101, 91, 51,
- 50, 93, 0,100,101,108, 97,121, 0,100,117,114, 97,116,105,111,110, 0,109, 97,116,101,114,105, 97,108, 78, 97,109,101, 91, 51,
- 50, 93, 0,100, 97,109,112,116,105,109,101,114, 0,112,114,111,112,110, 97,109,101, 91, 51, 50, 93, 0,109, 97,116,110, 97,109,
-101, 91, 51, 50, 93, 0, 97,120,105,115,102,108, 97,103, 0,112,111,115,101, 99,104, 97,110,110,101,108, 91, 51, 50, 93, 0, 99,
-111,110,115,116,114, 97,105,110,116, 91, 51, 50, 93, 0, 42,102,114,111,109, 79, 98,106,101, 99,116, 0,115,117, 98,106,101, 99,
-116, 91, 51, 50, 93, 0, 98,111,100,121, 91, 51, 50, 93, 0,111,116,121,112,101, 0,112,117,108,115,101, 0,102,114,101,113, 0,
-116,111,116,108,105,110,107,115, 0, 42, 42,108,105,110,107,115, 0,116, 97,112, 0,106,111,121,105,110,100,101,120, 0, 97,120,
-105,115, 95,115,105,110,103,108,101, 0, 97,120,105,115,102, 0, 98,117,116,116,111,110, 0,104, 97,116, 0,104, 97,116,102, 0,
-112,114,101, 99,105,115,105,111,110, 0,115,116,114, 91, 49, 50, 56, 93, 0, 42,109,121,110,101,119, 0,105,110,112,117,116,115,
- 0,116,111,116,115,108,105,110,107,115, 0, 42, 42,115,108,105,110,107,115, 0,118, 97,108,111, 0,115,116, 97,116,101, 95,109,
- 97,115,107, 0, 42, 97, 99,116, 0,102,114, 97,109,101, 80,114,111,112, 91, 51, 50, 93, 0, 98,108,101,110,100,105,110, 0,112,
-114,105,111,114,105,116,121, 0,101,110,100, 95,114,101,115,101,116, 0,115,116,114,105,100,101, 97,120,105,115, 0,115,116,114,
-105,100,101,108,101,110,103,116,104, 0,109,105,110, 95,103, 97,105,110, 0,109, 97,120, 95,103, 97,105,110, 0,114,101,102,101,
-114,101,110, 99,101, 95,100,105,115,116, 97,110, 99,101, 0,109, 97,120, 95,100,105,115,116, 97,110, 99,101, 0,114,111,108,108,
-111,102,102, 95,102, 97, 99,116,111,114, 0, 99,111,110,101, 95,105,110,110,101,114, 95, 97,110,103,108,101, 0, 99,111,110,101,
- 95,111,117,116,101,114, 95, 97,110,103,108,101, 0, 99,111,110,101, 95,111,117,116,101,114, 95,103, 97,105,110, 0,112, 97,100,
- 51, 91, 50, 93, 0,112,105,116, 99,104, 0,115,111,117,110,100, 51, 68, 0,112, 97,100, 54, 91, 49, 93, 0, 42,109,101, 0,108,
-105,110, 86,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,110,103, 86,101,108,111, 99,105,116,121, 91, 51, 93, 0,108,111, 99,
- 97,108,102,108, 97,103, 0,100,121,110, 95,111,112,101,114, 97,116,105,111,110, 0,102,111,114, 99,101,108,111, 99, 91, 51, 93,
- 0,102,111,114, 99,101,114,111,116, 91, 51, 93, 0,108,105,110,101, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,
-110,103,117,108, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 42,114,101,102,101,114,101,110, 99,101, 0,109,105,110,
- 0,109, 97,120, 0,114,111,116,100, 97,109,112, 0,109,105,110,108,111, 99, 91, 51, 93, 0,109, 97,120,108,111, 99, 91, 51, 93,
- 0,109,105,110,114,111,116, 91, 51, 93, 0,109, 97,120,114,111,116, 91, 51, 93, 0,109, 97,116,112,114,111,112, 91, 51, 50, 93,
- 0, 98,117,116,115,116, 97, 0, 98,117,116,101,110,100, 0,100,105,115,116,114,105, 98,117,116,105,111,110, 0,105,110,116, 95,
- 97,114,103, 95, 49, 0,105,110,116, 95, 97,114,103, 95, 50, 0,102,108,111, 97,116, 95, 97,114,103, 95, 49, 0,102,108,111, 97,
-116, 95, 97,114,103, 95, 50, 0,116,111, 80,114,111,112, 78, 97,109,101, 91, 51, 50, 93, 0, 42,116,111, 79, 98,106,101, 99,116,
- 0, 98,111,100,121, 84,121,112,101, 0,102,105,108,101,110, 97,109,101, 91, 54, 52, 93, 0,108,111, 97,100, 97,110,105,110, 97,
-109,101, 91, 54, 52, 93, 0,105,110,116, 95, 97,114,103, 0,102,108,111, 97,116, 95, 97,114,103, 0, 42,115,117, 98,116, 97,114,
-103,101,116, 0,103,111, 0, 42,110,101,119,112, 97, 99,107,101,100,102,105,108,101, 0, 97,116,116,101,110,117, 97,116,105,111,
-110, 0,100,105,115,116, 97,110, 99,101, 0, 42, 99, 97, 99,104,101, 0, 42,112,108, 97,121, 98, 97, 99,107, 95,104, 97,110,100,
-108,101, 0, 42,108, 97,109,112,114,101,110, 0,103,111, 98,106,101, 99,116, 0,100,117,112,108,105, 95,111,102,115, 91, 51, 93,
- 0, 42,112,114,111,112, 0, 99,104,105,108,100, 98, 97,115,101, 0,114,111,108,108, 0,104,101, 97,100, 91, 51, 93, 0,116, 97,
-105,108, 91, 51, 93, 0, 98,111,110,101, 95,109, 97,116, 91, 51, 93, 91, 51, 93, 0, 97,114,109, 95,104,101, 97,100, 91, 51, 93,
- 0, 97,114,109, 95,116, 97,105,108, 91, 51, 93, 0, 97,114,109, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,120,119,105,100,116,
-104, 0,122,119,105,100,116,104, 0,101, 97,115,101, 49, 0,101, 97,115,101, 50, 0,114, 97,100, 95,104,101, 97,100, 0,114, 97,
-100, 95,116, 97,105,108, 0, 98,111,110,101, 98, 97,115,101, 0, 99,104, 97,105,110, 98, 97,115,101, 0, 42,101,100, 98,111, 0,
- 42, 97, 99,116, 95, 98,111,110,101, 0, 42, 97, 99,116, 95,101,100, 98,111,110,101, 0, 42,115,107,101,116, 99,104, 0,108, 97,
-121,101,114, 95,112,114,111,116,101, 99,116,101,100, 0,103,104,111,115,116,101,112, 0,103,104,111,115,116,115,105,122,101, 0,
-103,104,111,115,116,116,121,112,101, 0,112, 97,116,104,115,105,122,101, 0,103,104,111,115,116,115,102, 0,103,104,111,115,116,
-101,102, 0,112, 97,116,104,115,102, 0,112, 97,116,104,101,102, 0,112, 97,116,104, 98, 99, 0,112, 97,116,104, 97, 99, 0, 42,
-112,111,105,110,116,115, 0,115,116, 97,114,116, 95,102,114, 97,109,101, 0,101,110,100, 95,102,114, 97,109,101, 0,103,104,111,
-115,116, 95,115,102, 0,103,104,111,115,116, 95,101,102, 0,103,104,111,115,116, 95, 98, 99, 0,103,104,111,115,116, 95, 97, 99,
- 0,103,104,111,115,116, 95,116,121,112,101, 0,103,104,111,115,116, 95,115,116,101,112, 0,103,104,111,115,116, 95,102,108, 97,
-103, 0,112, 97,116,104, 95,116,121,112,101, 0,112, 97,116,104, 95,115,116,101,112, 0,112, 97,116,104, 95,118,105,101,119,102,
-108, 97,103, 0,112, 97,116,104, 95, 98, 97,107,101,102,108, 97,103, 0,112, 97,116,104, 95,115,102, 0,112, 97,116,104, 95,101,
-102, 0,112, 97,116,104, 95, 98, 99, 0,112, 97,116,104, 95, 97, 99, 0, 99,111,110,115,116,102,108, 97,103, 0,105,107,102,108,
- 97,103, 0,115,101,108,101, 99,116,102,108, 97,103, 0, 97,103,114,112, 95,105,110,100,101,120, 0, 42, 98,111,110,101, 0, 42,
- 99,104,105,108,100, 0,105,107,116,114,101,101, 0, 42, 98, 95, 98,111,110,101, 95,109, 97,116,115, 0, 42,100,117, 97,108, 95,
-113,117, 97,116, 0, 42, 98, 95, 98,111,110,101, 95,100,117, 97,108, 95,113,117, 97,116,115, 0,101,117,108, 91, 51, 93, 0, 99,
-104, 97,110, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,
-101, 95,104,101, 97,100, 91, 51, 93, 0,112,111,115,101, 95,116, 97,105,108, 91, 51, 93, 0,108,105,109,105,116,109,105,110, 91,
- 51, 93, 0,108,105,109,105,116,109, 97,120, 91, 51, 93, 0,115,116,105,102,102,110,101,115,115, 91, 51, 93, 0,105,107,115,116,
-114,101,116, 99,104, 0,105,107,114,111,116,119,101,105,103,104,116, 0,105,107,108,105,110,119,101,105,103,104,116, 0, 42, 99,
-117,115,116,111,109, 0, 42, 99,117,115,116,111,109, 95,116,120, 0, 99,104, 97,110, 98, 97,115,101, 0, 42, 99,104, 97,110,104,
- 97,115,104, 0,112,114,111,120,121, 95,108, 97,121,101,114, 0,115,116,114,105,100,101, 95,111,102,102,115,101,116, 91, 51, 93,
- 0, 99,121, 99,108,105, 99, 95,111,102,102,115,101,116, 91, 51, 93, 0, 97,103,114,111,117,112,115, 0, 97, 99,116,105,118,101,
- 95,103,114,111,117,112, 0,105,107,115,111,108,118,101,114, 0, 42,105,107,100, 97,116, 97, 0, 42,105,107,112, 97,114, 97,109,
- 0,112,114,111,120,121, 95, 97, 99,116, 95, 98,111,110,101, 91, 51, 50, 93, 0,110,117,109,105,116,101,114, 0,110,117,109,115,
-116,101,112, 0,109,105,110,115,116,101,112, 0,109, 97,120,115,116,101,112, 0,115,111,108,118,101,114, 0,102,101,101,100, 98,
- 97, 99,107, 0,109, 97,120,118,101,108, 0,100, 97,109,112,109, 97,120, 0,100, 97,109,112,101,112,115, 0, 99,104, 97,110,110,
-101,108,115, 0, 99,117,115,116,111,109, 67,111,108, 0, 99,115, 0, 99,117,114,118,101,115, 0,103,114,111,117,112,115, 0, 97,
- 99,116,105,118,101, 95,109, 97,114,107,101,114, 0, 42,115,111,117,114, 99,101, 0, 42,102,105,108,116,101,114, 95,103,114,112,
- 0,102,105,108,116,101,114,102,108, 97,103, 0, 97,100,115, 0,116,105,109,101,115,108,105,100,101, 0, 42,103,114,112, 0,116,
-101,109,112, 0,110, 97,109,101, 91, 51, 48, 93, 0,111,119,110,115,112, 97, 99,101, 0,116, 97,114,115,112, 97, 99,101, 0,101,
-110,102,111,114, 99,101, 0,104,101, 97,100,116, 97,105,108, 0,108,105,110, 95,101,114,114,111,114, 0,114,111,116, 95,101,114,
-114,111,114, 0, 42,116, 97,114, 0,109, 97,116,114,105,120, 91, 52, 93, 91, 52, 93, 0,115,112, 97, 99,101, 0,114,111,116, 79,
-114,100,101,114, 0,116, 97,114,110,117,109, 0,116, 97,114,103,101,116,115, 0,105,116,101,114, 97,116,105,111,110,115, 0,114,
-111,111,116, 98,111,110,101, 0,109, 97,120, 95,114,111,111,116, 98,111,110,101, 0, 42,112,111,108,101,116, 97,114, 0,112,111,
-108,101,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, 93, 0,112,111,108,101, 97,110,103,108,101, 0,111,114,105,101,110,116,
-119,101,105,103,104,116, 0,103,114, 97, 98,116, 97,114,103,101,116, 91, 51, 93, 0,110,117,109,112,111,105,110,116,115, 0, 99,
-104, 97,105,110,108,101,110, 0,120,122, 83, 99, 97,108,101, 77,111,100,101, 0,114,101,115,101,114,118,101,100, 49, 0,114,101,
-115,101,114,118,101,100, 50, 0,109,105,110,109, 97,120,102,108, 97,103, 0,115,116,117, 99,107, 0, 99, 97, 99,104,101, 91, 51,
- 93, 0,108,111, 99,107,102,108, 97,103, 0,102,111,108,108,111,119,102,108, 97,103, 0,118,111,108,109,111,100,101, 0,112,108,
- 97,110,101, 0,111,114,103,108,101,110,103,116,104, 0, 98,117,108,103,101, 0,112,105,118, 88, 0,112,105,118, 89, 0,112,105,
-118, 90, 0, 97,120, 88, 0, 97,120, 89, 0, 97,120, 90, 0,109,105,110, 76,105,109,105,116, 91, 54, 93, 0,109, 97,120, 76,105,
-109,105,116, 91, 54, 93, 0,101,120,116,114, 97, 70,122, 0,105,110,118,109, 97,116, 91, 52, 93, 91, 52, 93, 0,102,114,111,109,
- 0,116,111, 0,109, 97,112, 91, 51, 93, 0,101,120,112,111, 0,102,114,111,109, 95,109,105,110, 91, 51, 93, 0,102,114,111,109,
- 95,109, 97,120, 91, 51, 93, 0,116,111, 95,109,105,110, 91, 51, 93, 0,116,111, 95,109, 97,120, 91, 51, 93, 0,114,111,116, 65,
-120,105,115, 0,122,109,105,110, 0,122,109, 97,120, 0,112, 97,100, 91, 57, 93, 0, 99,104, 97,110,110,101,108, 91, 51, 50, 93,
- 0,110,111, 95,114,111,116, 95, 97,120,105,115, 0,115,116,114,105,100,101, 95, 97,120,105,115, 0, 99,117,114,109,111,100, 0,
- 97, 99,116,115,116, 97,114,116, 0, 97, 99,116,101,110,100, 0, 97, 99,116,111,102,102,115, 0,115,116,114,105,100,101,108,101,
-110, 0,115, 99, 97,108,101, 0, 98,108,101,110,100,111,117,116, 0,115,116,114,105,100,101, 99,104, 97,110,110,101,108, 91, 51,
- 50, 93, 0,111,102,102,115, 95, 98,111,110,101, 91, 51, 50, 93, 0,104, 97,115,105,110,112,117,116, 0,104, 97,115,111,117,116,
-112,117,116, 0,100, 97,116, 97,116,121,112,101, 0,115,111, 99,107,101,116,116,121,112,101, 0, 42,110,101,119, 95,115,111, 99,
-107, 0,110,115, 0,108,105,109,105,116, 0,115,116, 97, 99,107, 95,105,110,100,101,120, 0,105,110,116,101,114,110, 0,115,116,
- 97, 99,107, 95,105,110,100,101,120, 95,101,120,116, 0,108,111, 99,120, 0,108,111, 99,121, 0,111,119,110, 95,105,110,100,101,
-120, 0,116,111, 95,105,110,100,101,120, 0, 42,116,111,115,111, 99,107, 0, 42,108,105,110,107, 0, 42,110,101,119, 95,110,111,
-100,101, 0,108, 97,115,116,121, 0,111,117,116,112,117,116,115, 0, 42,115,116,111,114, 97,103,101, 0,109,105,110,105,119,105,
-100,116,104, 0, 99,117,115,116,111,109, 49, 0, 99,117,115,116,111,109, 50, 0, 99,117,115,116,111,109, 51, 0, 99,117,115,116,
-111,109, 52, 0,110,101,101,100, 95,101,120,101, 99, 0,101,120,101, 99, 0, 42,116,104,114,101, 97,100,100, 97,116, 97, 0,116,
-111,116,114, 0, 98,117,116,114, 0,112,114,118,114, 0, 42, 98,108,111, 99,107, 0, 42,116,121,112,101,105,110,102,111, 0, 42,
-102,114,111,109,110,111,100,101, 0, 42,116,111,110,111,100,101, 0, 42,102,114,111,109,115,111, 99,107, 0,110,111,100,101,115,
- 0,108,105,110,107,115, 0, 42,115,116, 97, 99,107, 0, 42,116,104,114,101, 97,100,115,116, 97, 99,107, 0,105,110,105,116, 0,
-115,116, 97, 99,107,115,105,122,101, 0, 99,117,114, 95,105,110,100,101,120, 0, 97,108,108,116,121,112,101,115, 0, 42,111,119,
-110,116,121,112,101, 0,112, 97,100, 50, 91, 50, 93, 0, 40, 42,112,114,111,103,114,101,115,115, 41, 40, 41, 0, 40, 42,115,116,
- 97,116,115, 95,100,114, 97,119, 41, 40, 41, 0, 40, 42,116,101,115,116, 95, 98,114,101, 97,107, 41, 40, 41, 0, 42,116, 98,104,
- 0, 42,112,114,104, 0, 42,115,100,104, 0, 99,121, 99,108,105, 99, 0,109,111,118,105,101, 0,115, 97,109,112,108,101,115, 0,
-109, 97,120,115,112,101,101,100, 0,109,105,110,115,112,101,101,100, 0,112,101,114, 99,101,110,116,120, 0,112,101,114, 99,101,
-110,116,121, 0, 98,111,107,101,104, 0,103, 97,109,109, 97, 0, 99,117,114,118,101,100, 0,105,109, 97,103,101, 95,105,110, 95,
-119,105,100,116,104, 0,105,109, 97,103,101, 95,105,110, 95,104,101,105,103,104,116, 0, 99,101,110,116,101,114, 95,120, 0, 99,
-101,110,116,101,114, 95,121, 0,115,112,105,110, 0,119,114, 97,112, 0,115,105,103,109, 97, 95, 99,111,108,111,114, 0,115,105,
-103,109, 97, 95,115,112, 97, 99,101, 0,104,117,101, 0,116, 49, 0,116, 50, 0,116, 51, 0,102,115,116,114,101,110,103,116,104,
- 0,102, 97,108,112,104, 97, 0,107,101,121, 91, 52, 93, 0, 97,108,103,111,114,105,116,104,109, 0, 99,104, 97,110,110,101,108,
- 0,120, 49, 0,120, 50, 0,121, 49, 0,121, 50, 0, 99,111,108,110, 97,109,101, 91, 51, 50, 93, 0, 98,107,116,121,112,101, 0,
-114,111,116, 97,116,105,111,110, 0,103, 97,109, 99,111, 0,110,111, 95,122, 98,117,102, 0,102,115,116,111,112, 0,109, 97,120,
- 98,108,117,114, 0, 98,116,104,114,101,115,104, 0, 42,100,105, 99,116, 0, 42,110,111,100,101, 0, 97,110,103,108,101, 95,111,
-102,115, 0, 99,111,108,109,111,100, 0,109,105,120, 0,116,104,114,101,115,104,111,108,100, 0,102, 97,100,101, 0,109, 0, 99,
- 0,106,105,116, 0,112,114,111,106, 0,102,105,116, 0,115,108,111,112,101, 91, 51, 93, 0,112,111,119,101,114, 91, 51, 93, 0,
-108,105,102,116, 95,108,103,103, 91, 51, 93, 0,103, 97,109,109, 97, 95,105,110,118, 91, 51, 93, 0,108,105,109, 99,104, 97,110,
- 0,117,110,115,112,105,108,108, 0,108,105,109,115, 99, 97,108,101, 0,117,115,112,105,108,108,114, 0,117,115,112,105,108,108,
-103, 0,117,115,112,105,108,108, 98, 0,115,104,111,114,116,121, 0,109,105,110,116, 97, 98,108,101, 0,109, 97,120,116, 97, 98,
-108,101, 0,101,120,116, 95,105,110, 91, 50, 93, 0,101,120,116, 95,111,117,116, 91, 50, 93, 0, 42, 99,117,114,118,101, 0, 42,
-116, 97, 98,108,101, 0, 42,112,114,101,109,117,108,116, 97, 98,108,101, 0,112,114,101,115,101,116, 0, 99,104, 97,110,103,101,
-100, 95,116,105,109,101,115,116, 97,109,112, 0, 99,117,114,114, 0, 99,108,105,112,114, 0, 99,109, 91, 52, 93, 0, 98,108, 97,
- 99,107, 91, 51, 93, 0,119,104,105,116,101, 91, 51, 93, 0, 98,119,109,117,108, 91, 51, 93, 0,115, 97,109,112,108,101, 91, 51,
- 93, 0,120, 95,114,101,115,111,108,117,116,105,111,110, 0,100, 97,116, 97, 95,114, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,
-103, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95, 98, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,108,117,109, 97, 91, 50, 53, 54,
- 93, 0,115, 97,109,112,108,101, 95,102,117,108,108, 0,115, 97,109,112,108,101, 95,108,105,110,101,115, 0, 97, 99, 99,117,114,
- 97, 99,121, 0,119, 97,118,101,102,114,109, 95,109,111,100,101, 0,119, 97,118,101,102,114,109, 95, 97,108,112,104, 97, 0,119,
- 97,118,101,102,114,109, 95,121,102, 97, 99, 0,119, 97,118,101,102,114,109, 95,104,101,105,103,104,116, 0,118,101, 99,115, 99,
-111,112,101, 95, 97,108,112,104, 97, 0,118,101, 99,115, 99,111,112,101, 95,104,101,105,103,104,116, 0,109,105,110,109, 97,120,
- 91, 51, 93, 91, 50, 93, 0,104,105,115,116, 0, 42,119, 97,118,101,102,111,114,109, 95, 49, 0, 42,119, 97,118,101,102,111,114,
-109, 95, 50, 0, 42,119, 97,118,101,102,111,114,109, 95, 51, 0, 42,118,101, 99,115, 99,111,112,101, 0,119, 97,118,101,102,111,
-114,109, 95,116,111,116, 0,111,102,102,115,101,116, 91, 50, 93, 0, 99,108,111,110,101, 0,109,116,101,120, 0, 42,105, 99,111,
-110, 95,105,109, 98,117,102, 0,105, 99,111,110, 95,102,105,108,101,112, 97,116,104, 91, 50, 52, 48, 93, 0,110,111,114,109, 97,
-108, 95,119,101,105,103,104,116, 0,111, 98, 95,109,111,100,101, 0,106,105,116,116,101,114, 0,115,109,111,111,116,104, 95,115,
-116,114,111,107,101, 95,114, 97,100,105,117,115, 0,115,109,111,111,116,104, 95,115,116,114,111,107,101, 95,102, 97, 99,116,111,
-114, 0,114, 97,116,101, 0,114,103, 98, 91, 51, 93, 0,115, 99,117,108,112,116, 95,112,108, 97,110,101, 0,112,108, 97,110,101,
- 95,111,102,102,115,101,116, 0,115, 99,117,108,112,116, 95,116,111,111,108, 0,118,101,114,116,101,120,112, 97,105,110,116, 95,
-116,111,111,108, 0,105,109, 97,103,101,112, 97,105,110,116, 95,116,111,111,108, 0, 97,117,116,111,115,109,111,111,116,104, 95,
-102, 97, 99,116,111,114, 0, 99,114,101, 97,115,101, 95,112,105,110, 99,104, 95,102, 97, 99,116,111,114, 0,112,108, 97,110,101,
- 95,116,114,105,109, 0,116,101,120,116,117,114,101, 95,115, 97,109,112,108,101, 95, 98,105, 97,115, 0,116,101,120,116,117,114,
-101, 95,111,118,101,114,108, 97,121, 95, 97,108,112,104, 97, 0,117,110,112,114,111,106,101, 99,116,101,100, 95,114, 97,100,105,
-117,115, 0, 97,100,100, 95, 99,111,108, 91, 51, 93, 0,115,117, 98, 95, 99,111,108, 91, 51, 93, 0, 97, 99,116,105,118,101, 95,
-114,110,100, 0, 97, 99,116,105,118,101, 95, 99,108,111,110,101, 0, 97, 99,116,105,118,101, 95,109, 97,115,107, 0, 42,108, 97,
-121,101,114,115, 0,116,111,116,108, 97,121,101,114, 0,109, 97,120,108, 97,121,101,114, 0,116,111,116,115,105,122,101, 0, 42,
-112,111,111,108, 0, 42,101,120,116,101,114,110, 97,108, 0,118,101,108, 91, 51, 93, 0,114,111,116, 91, 52, 93, 0, 97,118,101,
- 91, 51, 93, 0, 42,103,114,111,117,110,100, 0,119, 97,110,100,101,114, 91, 51, 93, 0,110,117,109, 0,112, 97,114,101,110,116,
- 0,112, 97, 91, 52, 93, 0,119, 91, 52, 93, 0,102,117,118, 91, 52, 93, 0,102,111,102,102,115,101,116, 0,114,116, 91, 50, 93,
- 0,112,114,101,118, 95,115,116, 97,116,101, 0, 42,104, 97,105,114, 0, 42, 98,111,105,100, 0,100,105,101,116,105,109,101, 0,
-110,117,109, 95,100,109, 99, 97, 99,104,101, 0,104, 97,105,114, 95,105,110,100,101,120, 0, 97,108,105,118,101, 0,115,112,114,
-105,110,103, 95,107, 0,114,101,115,116, 95,108,101,110,103,116,104, 0,118,105,115, 99,111,115,105,116,121, 95,111,109,101,103,
- 97, 0,118,105,115, 99,111,115,105,116,121, 95, 98,101,116, 97, 0,115,116,105,102,102,110,101,115,115, 95,107, 0,115,116,105,
-102,102,110,101,115,115, 95,107,110,101, 97,114, 0,114,101,115,116, 95,100,101,110,115,105,116,121, 0, 98,117,111,121, 97,110,
- 99,121, 0, 42, 98,111,105,100,115, 0, 42,102,108,117,105,100, 0,100,105,115,116,114, 0,112,104,121,115,116,121,112,101, 0,
- 97,118,101,109,111,100,101, 0,114,101, 97, 99,116,101,118,101,110,116, 0,100,114, 97,119, 0,100,114, 97,119, 95, 97,115, 0,
-100,114, 97,119, 95,115,105,122,101, 0, 99,104,105,108,100,116,121,112,101, 0,114,101,110, 95, 97,115, 0,115,117, 98,102,114,
- 97,109,101,115, 0,114,101,110, 95,115,116,101,112, 0,104, 97,105,114, 95,115,116,101,112, 0,107,101,121,115, 95,115,116,101,
-112, 0, 97,100, 97,112,116, 95, 97,110,103,108,101, 0, 97,100, 97,112,116, 95,112,105,120, 0,114,111,116,102,114,111,109, 0,
-105,110,116,101,103,114, 97,116,111,114, 0, 98, 98, 95, 97,108,105,103,110, 0, 98, 98, 95,117,118, 95,115,112,108,105,116, 0,
- 98, 98, 95, 97,110,105,109, 0, 98, 98, 95,115,112,108,105,116, 95,111,102,102,115,101,116, 0, 98, 98, 95,116,105,108,116, 0,
- 98, 98, 95,114, 97,110,100, 95,116,105,108,116, 0, 98, 98, 95,111,102,102,115,101,116, 91, 50, 93, 0,115,105,109,112,108,105,
-102,121, 95,114,101,102,115,105,122,101, 0,115,105,109,112,108,105,102,121, 95,114, 97,116,101, 0,115,105,109,112,108,105,102,
-121, 95,116,114, 97,110,115,105,116,105,111,110, 0,115,105,109,112,108,105,102,121, 95,118,105,101,119,112,111,114,116, 0,116,
-105,109,101,116,119,101, 97,107, 0,106,105,116,102, 97, 99, 0,101,102,102, 95,104, 97,105,114, 0,103,114,105,100, 95,114,101,
-115, 0,112, 97,114,116,102, 97, 99, 0,116, 97,110,102, 97, 99, 0,116, 97,110,112,104, 97,115,101, 0,114,101, 97, 99,116,102,
- 97, 99, 0,111, 98, 95,118,101,108, 91, 51, 93, 0, 97,118,101,102, 97, 99, 0,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,
-100,114,111,116,102, 97, 99, 0,114, 97,110,100,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,100,115,105,122,101, 0,114,101,
- 97, 99,116,115,104, 97,112,101, 0, 97, 99, 99, 91, 51, 93, 0,100,114, 97,103,102, 97, 99, 0, 98,114,111,119,110,102, 97, 99,
- 0,100, 97,109,112,102, 97, 99, 0,114, 97,110,100,108,101,110,103,116,104, 0, 99,104,105,108,100, 95,110, 98,114, 0,114,101,
-110, 95, 99,104,105,108,100, 95,110, 98,114, 0,112, 97,114,101,110,116,115, 0, 99,104,105,108,100,115,105,122,101, 0, 99,104,
-105,108,100,114, 97,110,100,115,105,122,101, 0, 99,104,105,108,100,114, 97,100, 0, 99,104,105,108,100,102,108, 97,116, 0, 99,
-108,117,109,112,112,111,119, 0,114,111,117,103,104, 49, 0,114,111,117,103,104, 49, 95,115,105,122,101, 0,114,111,117,103,104,
- 50, 0,114,111,117,103,104, 50, 95,115,105,122,101, 0,114,111,117,103,104, 50, 95,116,104,114,101,115, 0,114,111,117,103,104,
- 95,101,110,100, 0,114,111,117,103,104, 95,101,110,100, 95,115,104, 97,112,101, 0, 99,108,101,110,103,116,104, 0, 99,108,101,
-110,103,116,104, 95,116,104,114,101,115, 0, 98,114, 97,110, 99,104, 95,116,104,114,101,115, 0,100,114, 97,119, 95,108,105,110,
-101, 91, 50, 93, 0,112, 97,116,104, 95,115,116, 97,114,116, 0,112, 97,116,104, 95,101,110,100, 0,116,114, 97,105,108, 95, 99,
-111,117,110,116, 0,107,101,121,101,100, 95,108,111,111,112,115, 0,100,117,112,108,105,119,101,105,103,104,116,115, 0, 42,101,
-102,102, 95,103,114,111,117,112, 0, 42,100,117,112, 95,111, 98, 0, 42, 98, 98, 95,111, 98, 0, 42,112,100, 50, 0, 42,112, 97,
-114,116, 0, 42,112, 97,114,116,105, 99,108,101,115, 0, 42, 42,112, 97,116,104, 99, 97, 99,104,101, 0, 42, 42, 99,104,105,108,
-100, 99, 97, 99,104,101, 0,112, 97,116,104, 99, 97, 99,104,101, 98,117,102,115, 0, 99,104,105,108,100, 99, 97, 99,104,101, 98,
-117,102,115, 0, 42, 99,108,109,100, 0, 42,104, 97,105,114, 95,105,110, 95,100,109, 0, 42,104, 97,105,114, 95,111,117,116, 95,
-100,109, 0, 42,116, 97,114,103,101,116, 95,111, 98, 0, 42,108, 97,116,116,105, 99,101, 0,116,114,101,101, 95,102,114, 97,109,
-101, 0,116,111,116, 99,104,105,108,100, 0,116,111,116, 99, 97, 99,104,101,100, 0,116,111,116, 99,104,105,108,100, 99, 97, 99,
-104,101, 0,116, 97,114,103,101,116, 95,112,115,121,115, 0,116,111,116,107,101,121,101,100, 0, 98, 97,107,101,115,112, 97, 99,
-101, 0, 98, 98, 95,117,118,110, 97,109,101, 91, 51, 93, 91, 51, 50, 93, 0,118,103,114,111,117,112, 91, 49, 50, 93, 0,118,103,
- 95,110,101,103, 0,114,116, 51, 0, 42,114,101,110,100,101,114,100, 97,116, 97, 0, 42,101,102,102,101, 99,116,111,114,115, 0,
- 42,116,114,101,101, 0, 42,112,100,100, 0, 42,102,114, 97,110,100, 0, 67,100,105,115, 0, 67,118,105, 0,115,116,114,117, 99,
-116,117,114, 97,108, 0, 98,101,110,100,105,110,103, 0,109, 97,120, 95, 98,101,110,100, 0,109, 97,120, 95,115,116,114,117, 99,
-116, 0,109, 97,120, 95,115,104,101, 97,114, 0, 97,118,103, 95,115,112,114,105,110,103, 95,108,101,110, 0,116,105,109,101,115,
- 99, 97,108,101, 0,101,102,102, 95,102,111,114, 99,101, 95,115, 99, 97,108,101, 0,101,102,102, 95,119,105,110,100, 95,115, 99,
- 97,108,101, 0,115,105,109, 95,116,105,109,101, 95,111,108,100, 0,118,101,108,111, 99,105,116,121, 95,115,109,111,111,116,104,
- 0, 99,111,108,108,105,100,101,114, 95,102,114,105, 99,116,105,111,110, 0,115,116,101,112,115, 80,101,114, 70,114, 97,109,101,
- 0,112,114,101,114,111,108,108, 0,109, 97,120,115,112,114,105,110,103,108,101,110, 0,115,111,108,118,101,114, 95,116,121,112,
-101, 0,118,103,114,111,117,112, 95, 98,101,110,100, 0,118,103,114,111,117,112, 95,109, 97,115,115, 0,118,103,114,111,117,112,
- 95,115,116,114,117, 99,116, 0,115,104, 97,112,101,107,101,121, 95,114,101,115,116, 0,112,114,101,115,101,116,115, 0,114,101,
-115,101,116, 0, 42, 99,111,108,108,105,115,105,111,110, 95,108,105,115,116, 0,101,112,115,105,108,111,110, 0,115,101,108,102,
- 95,102,114,105, 99,116,105,111,110, 0,115,101,108,102,101,112,115,105,108,111,110, 0,115,101,108,102, 95,108,111,111,112, 95,
- 99,111,117,110,116, 0,108,111,111,112, 95, 99,111,117,110,116, 0,112,114,101,115,115,117,114,101, 0,116,104,105, 99,107,110,
-101,115,115, 0,115,116,114,111,107,101,115, 0,102,114, 97,109,101,110,117,109, 0, 42, 97, 99,116,102,114, 97,109,101, 0,103,
-115,116,101,112, 0,105,110,102,111, 91, 49, 50, 56, 93, 0,115, 98,117,102,102,101,114, 95,115,105,122,101, 0,115, 98,117,102,
-102,101,114, 95,115,102,108, 97,103, 0, 42,115, 98,117,102,102,101,114, 0, 42,116,121,112,101,115,116,114, 0, 42,109,101,115,
-115, 97,103,101, 0,108,105,115,116, 0,112,114,105,110,116,108,101,118,101,108, 0,115,116,111,114,101,108,101,118,101,108, 0,
- 42,114,101,112,111,114,116,116,105,109,101,114, 0,103,114,101,121,115, 99, 97,108,101, 0,119,105,100,116,104,102, 97, 99, 0,
- 42,119,105,110,100,114, 97,119, 97, 98,108,101, 0, 42,119,105,110, 97, 99,116,105,118,101, 0,119,105,110,100,111,119,115, 0,
-105,110,105,116,105, 97,108,105,122,101,100, 0,102,105,108,101, 95,115, 97,118,101,100, 0,111,112, 95,117,110,100,111, 95,100,
-101,112,116,104, 0,111,112,101,114, 97,116,111,114,115, 0,113,117,101,117,101, 0,114,101,112,111,114,116,115, 0,106,111, 98,
-115, 0,112, 97,105,110,116, 99,117,114,115,111,114,115, 0,100,114, 97,103,115, 0,107,101,121, 99,111,110,102,105,103,115, 0,
- 42,100,101,102, 97,117,108,116, 99,111,110,102, 0,116,105,109,101,114,115, 0, 42, 97,117,116,111,115, 97,118,101,116,105,109,
-101,114, 0, 42,103,104,111,115,116,119,105,110, 0,103,114, 97, 98, 99,117,114,115,111,114, 0, 42,110,101,119,115, 99,114,101,
-101,110, 0,115, 99,114,101,101,110,110, 97,109,101, 91, 51, 50, 93, 0,112,111,115,120, 0,112,111,115,121, 0,119,105,110,100,
-111,119,115,116, 97,116,101, 0,109,111,110,105,116,111,114, 0,108, 97,115,116, 99,117,114,115,111,114, 0, 97,100,100,109,111,
-117,115,101,109,111,118,101, 0, 42,101,118,101,110,116,115,116, 97,116,101, 0, 42, 99,117,114,115,119,105,110, 0, 42,116,119,
-101, 97,107, 0,100,114, 97,119,109,101,116,104,111,100, 0,100,114, 97,119,102, 97,105,108, 0, 42,100,114, 97,119,100, 97,116,
- 97, 0,109,111,100, 97,108,104, 97,110,100,108,101,114,115, 0,115,117, 98,119,105,110,100,111,119,115, 0,103,101,115,116,117,
-114,101, 0,105,100,110, 97,109,101, 91, 54, 52, 93, 0,112,114,111,112,118, 97,108,117,101, 0,115,104,105,102,116, 0, 99,116,
-114,108, 0, 97,108,116, 0,111,115,107,101,121, 0,107,101,121,109,111,100,105,102,105,101,114, 0,109, 97,112,116,121,112,101,
- 0, 42,112,116,114, 0,105,116,101,109,115, 0,115,112, 97, 99,101,105,100, 0,114,101,103,105,111,110,105,100, 0,107,109,105,
- 95,105,100, 0, 40, 42,112,111,108,108, 41, 40, 41, 0, 42,109,111,100, 97,108, 95,105,116,101,109,115, 0, 98, 97,115,101,110,
- 97,109,101, 91, 54, 52, 93, 0, 97, 99,116,107,101,121,109, 97,112, 0, 42, 99,117,115,116,111,109,100, 97,116, 97, 0, 42,112,
-121, 95,105,110,115,116, 97,110, 99,101, 0, 42,114,101,112,111,114,116,115, 0,109, 97, 99,114,111, 0, 42,111,112,109, 0, 42,
-101,100, 97,116, 97, 0,105,110,102,108,117,101,110, 99,101, 0, 42, 99,111,101,102,102,105, 99,105,101,110,116,115, 0, 97,114,
-114, 97,121,115,105,122,101, 0,112,111,108,121, 95,111,114,100,101,114, 0, 97,109,112,108,105,116,117,100,101, 0,112,104, 97,
-115,101, 95,109,117,108,116,105,112,108,105,101,114, 0,112,104, 97,115,101, 95,111,102,102,115,101,116, 0,118, 97,108,117,101,
- 95,111,102,102,115,101,116, 0,109,105,100,118, 97,108, 0, 98,101,102,111,114,101, 95,109,111,100,101, 0, 97,102,116,101,114,
- 95,109,111,100,101, 0, 98,101,102,111,114,101, 95, 99,121, 99,108,101,115, 0, 97,102,116,101,114, 95, 99,121, 99,108,101,115,
- 0,114,101, 99,116, 0,112,104, 97,115,101, 0,109,111,100,105,102,105, 99, 97,116,105,111,110, 0,115,116,101,112, 95,115,105,
-122,101, 0, 42,114,110, 97, 95,112, 97,116,104, 0,112, 99,104, 97,110, 95,110, 97,109,101, 91, 51, 50, 93, 0,116,114, 97,110,
-115, 67,104, 97,110, 0,105,100,116,121,112,101, 0,116, 97,114,103,101,116,115, 91, 56, 93, 0,110,117,109, 95,116, 97,114,103,
-101,116,115, 0,118, 97,114,105, 97, 98,108,101,115, 0,101,120,112,114,101,115,115,105,111,110, 91, 50, 53, 54, 93, 0, 42,101,
-120,112,114, 95, 99,111,109,112, 0,118,101, 99, 91, 50, 93, 0, 42,102,112,116, 0, 97,114,114, 97,121, 95,105,110,100,101,120,
- 0, 99,111,108,111,114, 95,109,111,100,101, 0, 99,111,108,111,114, 91, 51, 93, 0,102,114,111,109, 91, 49, 50, 56, 93, 0,116,
-111, 91, 49, 50, 56, 93, 0,109, 97,112,112,105,110,103,115, 0,115,116,114,105,112,115, 0, 42,114,101,109, 97,112, 0,102, 99,
-117,114,118,101,115, 0,115,116,114,105,112, 95,116,105,109,101, 0, 98,108,101,110,100,109,111,100,101, 0,101,120,116,101,110,
-100,109,111,100,101, 0,103,114,111,117,112, 91, 54, 52, 93, 0,103,114,111,117,112,109,111,100,101, 0,107,101,121,105,110,103,
-102,108, 97,103, 0,112, 97,116,104,115, 0,116,121,112,101,105,110,102,111, 91, 54, 52, 93, 0, 97, 99,116,105,118,101, 95,112,
- 97,116,104, 0, 42,116,109,112, 97, 99,116, 0,110,108, 97, 95,116,114, 97, 99,107,115, 0, 42, 97, 99,116,115,116,114,105,112,
- 0,100,114,105,118,101,114,115, 0,111,118,101,114,114,105,100,101,115, 0, 97, 99,116, 95, 98,108,101,110,100,109,111,100,101,
- 0, 97, 99,116, 95,101,120,116,101,110,100,109,111,100,101, 0, 97, 99,116, 95,105,110,102,108,117,101,110, 99,101, 0,114,117,
-108,101, 0,111,112,116,105,111,110,115, 0,102,101, 97,114, 95,102, 97, 99,116,111,114, 0,115,105,103,110, 97,108, 95,105,100,
- 0,108,111,111,107, 95, 97,104,101, 97,100, 0,111,108,111, 99, 91, 51, 93, 0,113,117,101,117,101, 95,115,105,122,101, 0,119,
- 97,110,100,101,114, 0,102,108,101,101, 95,100,105,115,116, 97,110, 99,101, 0,104,101, 97,108,116,104, 0,115,116, 97,116,101,
- 95,105,100, 0,114,117,108,101,115, 0, 99,111,110,100,105,116,105,111,110,115, 0, 97, 99,116,105,111,110,115, 0,114,117,108,
-101,115,101,116, 95,116,121,112,101, 0,114,117,108,101, 95,102,117,122,122,105,110,101,115,115, 0,108, 97,115,116, 95,115,116,
- 97,116,101, 95,105,100, 0,108, 97,110,100,105,110,103, 95,115,109,111,111,116,104,110,101,115,115, 0, 98, 97,110,107,105,110,
-103, 0, 97,103,103,114,101,115,115,105,111,110, 0, 97,105,114, 95,109,105,110, 95,115,112,101,101,100, 0, 97,105,114, 95,109,
- 97,120, 95,115,112,101,101,100, 0, 97,105,114, 95,109, 97,120, 95, 97, 99, 99, 0, 97,105,114, 95,109, 97,120, 95, 97,118,101,
- 0, 97,105,114, 95,112,101,114,115,111,110, 97,108, 95,115,112, 97, 99,101, 0,108, 97,110,100, 95,106,117,109,112, 95,115,112,
-101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95,115,112,101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95, 97, 99, 99, 0,
-108, 97,110,100, 95,109, 97,120, 95, 97,118,101, 0,108, 97,110,100, 95,112,101,114,115,111,110, 97,108, 95,115,112, 97, 99,101,
- 0,108, 97,110,100, 95,115,116,105, 99,107, 95,102,111,114, 99,101, 0,115,116, 97,116,101,115, 0, 42,115,109,100, 0, 42,102,
-108,117,105,100, 95,103,114,111,117,112, 0, 42, 99,111,108,108, 95,103,114,111,117,112, 0, 42,119,116, 0, 42,116,101,120, 95,
-119,116, 0, 42,116,101,120, 95,115,104, 97,100,111,119, 0, 42,115,104, 97,100,111,119, 0,112, 48, 91, 51, 93, 0,112, 49, 91,
- 51, 93, 0,100,120, 0,111,109,101,103, 97, 0,116,101,109,112, 65,109, 98, 0, 98,101,116, 97, 0,114,101,115, 91, 51, 93, 0,
- 97,109,112,108,105,102,121, 0,109, 97,120,114,101,115, 0,118,105,101,119,115,101,116,116,105,110,103,115, 0,110,111,105,115,
-101, 0,100,105,115,115, 95,112,101,114, 99,101,110,116, 0,100,105,115,115, 95,115,112,101,101,100, 0,114,101,115, 95,119,116,
- 91, 51, 93, 0,100,120, 95,119,116, 0,118, 51,100,110,117,109, 0, 99, 97, 99,104,101, 95, 99,111,109,112, 0, 99, 97, 99,104,
-101, 95,104,105,103,104, 95, 99,111,109,112, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 91, 50, 93, 0,112,116, 99, 97,
- 99,104,101,115, 91, 50, 93, 0, 98,111,114,100,101,114, 95, 99,111,108,108,105,115,105,111,110,115, 0,116,105,109,101, 95,115,
- 99, 97,108,101, 0,118,111,114,116,105, 99,105,116,121, 0,118,101,108,111, 99,105,116,121, 91, 50, 93, 0,118,101,108, 95,109,
-117,108,116,105, 0,118,103,114,112, 95,104,101, 97,116, 95,115, 99, 97,108,101, 91, 50, 93, 0,118,103,114,111,117,112, 95,102,
-108,111,119, 0,118,103,114,111,117,112, 95,100,101,110,115,105,116,121, 0,118,103,114,111,117,112, 95,104,101, 97,116, 0, 42,
-112,111,105,110,116,115, 95,111,108,100, 0, 42,118,101,108, 0,109, 97,116, 95,111,108,100, 91, 52, 93, 91, 52, 93, 0, 0, 0,
- 84, 89, 80, 69,211, 1, 0, 0, 99,104, 97,114, 0,117, 99,104, 97,114, 0,115,104,111,114,116, 0,117,115,104,111,114,116, 0,
-105,110,116, 0,108,111,110,103, 0,117,108,111,110,103, 0,102,108,111, 97,116, 0,100,111,117, 98,108,101, 0,118,111,105,100,
- 0, 76,105,110,107, 0, 76,105,110,107, 68, 97,116, 97, 0, 76,105,115,116, 66, 97,115,101, 0,118,101, 99, 50,115, 0,118,101,
- 99, 50,102, 0,118,101, 99, 50,105, 0,118,101, 99, 50,100, 0,118,101, 99, 51,105, 0,118,101, 99, 51,102, 0,118,101, 99, 51,
-100, 0,118,101, 99, 52,105, 0,118,101, 99, 52,102, 0,118,101, 99, 52,100, 0,114, 99,116,105, 0,114, 99,116,102, 0, 73, 68,
- 80,114,111,112,101,114,116,121, 68, 97,116, 97, 0, 73, 68, 80,114,111,112,101,114,116,121, 0, 73, 68, 0, 76,105, 98,114, 97,
-114,121, 0, 70,105,108,101, 68, 97,116, 97, 0, 80,114,101,118,105,101,119, 73,109, 97,103,101, 0, 73,112,111, 68,114,105,118,
-101,114, 0, 79, 98,106,101, 99,116, 0, 73,112,111, 67,117,114,118,101, 0, 66, 80,111,105,110,116, 0, 66,101,122, 84,114,105,
-112,108,101, 0, 73,112,111, 0, 75,101,121, 66,108,111, 99,107, 0, 75,101,121, 0, 65,110,105,109, 68, 97,116, 97, 0, 84,101,
-120,116, 76,105,110,101, 0, 84,101,120,116, 77, 97,114,107,101,114, 0, 84,101,120,116, 0, 80, 97, 99,107,101,100, 70,105,108,
-101, 0, 67, 97,109,101,114, 97, 0, 73,109, 97,103,101, 85,115,101,114, 0, 83, 99,101,110,101, 0, 73,109, 97,103,101, 0, 71,
- 80, 85, 84,101,120,116,117,114,101, 0, 97,110,105,109, 0, 82,101,110,100,101,114, 82,101,115,117,108,116, 0, 77, 84,101,120,
- 0, 84,101,120, 0, 80,108,117,103,105,110, 84,101,120, 0, 67, 66, 68, 97,116, 97, 0, 67,111,108,111,114, 66, 97,110,100, 0,
- 69,110,118, 77, 97,112, 0, 73,109, 66,117,102, 0, 80,111,105,110,116, 68,101,110,115,105,116,121, 0, 86,111,120,101,108, 68,
- 97,116, 97, 0, 98, 78,111,100,101, 84,114,101,101, 0, 84,101,120, 77, 97,112,112,105,110,103, 0, 76, 97,109,112, 0, 67,117,
-114,118,101, 77, 97,112,112,105,110,103, 0, 86,111,108,117,109,101, 83,101,116,116,105,110,103,115, 0, 77, 97,116,101,114,105,
- 97,108, 0, 71,114,111,117,112, 0, 86, 70,111,110,116, 0, 86, 70,111,110,116, 68, 97,116, 97, 0, 77,101,116, 97, 69,108,101,
-109, 0, 66,111,117,110,100, 66,111,120, 0, 77,101,116, 97, 66, 97,108,108, 0, 78,117,114, 98, 0, 67,104, 97,114, 73,110,102,
-111, 0, 84,101,120,116, 66,111,120, 0, 69,100,105,116, 78,117,114, 98, 0, 71, 72, 97,115,104, 0, 67,117,114,118,101, 0, 80,
- 97,116,104, 0, 83,101,108, 66,111,120, 0, 69,100,105,116, 70,111,110,116, 0, 77,101,115,104, 0, 77, 70, 97, 99,101, 0, 77,
- 84, 70, 97, 99,101, 0, 84, 70, 97, 99,101, 0, 77, 86,101,114,116, 0, 77, 69,100,103,101, 0, 77, 68,101,102,111,114,109, 86,
-101,114,116, 0, 77, 67,111,108, 0, 77, 83,116,105, 99,107,121, 0, 77, 83,101,108,101, 99,116, 0, 69,100,105,116, 77,101,115,
-104, 0, 67,117,115,116,111,109, 68, 97,116, 97, 0, 77,117,108,116,105,114,101,115, 0, 80, 97,114,116,105, 97,108, 86,105,115,
-105, 98,105,108,105,116,121, 0, 77, 68,101,102,111,114,109, 87,101,105,103,104,116, 0, 77, 84,101,120, 80,111,108,121, 0, 77,
- 76,111,111,112, 85, 86, 0, 77, 76,111,111,112, 67,111,108, 0, 77, 70,108,111, 97,116, 80,114,111,112,101,114,116,121, 0, 77,
- 73,110,116, 80,114,111,112,101,114,116,121, 0, 77, 83,116,114,105,110,103, 80,114,111,112,101,114,116,121, 0, 79,114,105,103,
- 83,112, 97, 99,101, 70, 97, 99,101, 0, 77, 68,105,115,112,115, 0, 77,117,108,116,105,114,101,115, 67,111,108, 0, 77,117,108,
-116,105,114,101,115, 67,111,108, 70, 97, 99,101, 0, 77,117,108,116,105,114,101,115, 70, 97, 99,101, 0, 77,117,108,116,105,114,
-101,115, 69,100,103,101, 0, 77,117,108,116,105,114,101,115, 76,101,118,101,108, 0, 77,111,100,105,102,105,101,114, 68, 97,116,
- 97, 0, 83,117, 98,115,117,114,102, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 76, 97,116,116,105, 99,101, 77,111,100,
-105,102,105,101,114, 68, 97,116, 97, 0, 67,117,114,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66,117,105,108,
-100, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, 97,115,107, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,
-114,114, 97,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77,105,114,114,111,114, 77,111,100,105,102,105,101,114, 68,
- 97,116, 97, 0, 69,100,103,101, 83,112,108,105,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66,101,118,101,108, 77,
-111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66, 77,101,115,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,
-111,107,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,107,101, 68,111,109, 97,105,110, 83,101,116,116,105,
-110,103,115, 0, 83,109,111,107,101, 70,108,111,119, 83,101,116,116,105,110,103,115, 0, 83,109,111,107,101, 67,111,108,108, 83,
-101,116,116,105,110,103,115, 0, 68,105,115,112,108, 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 85, 86, 80,
-114,111,106,101, 99,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 68,101, 99,105,109, 97,116,101, 77,111,100,105,102,
-105,101,114, 68, 97,116, 97, 0, 83,109,111,111,116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67, 97,115,116, 77,
-111,100,105,102,105,101,114, 68, 97,116, 97, 0, 87, 97,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,109,
- 97,116,117,114,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 72,111,111,107, 77,111,100,105,102,105,101,114, 68, 97,
-116, 97, 0, 83,111,102,116, 98,111,100,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111,116,104, 77,111,100,
-105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111,116,104, 0, 67,108,111,116,104, 83,105,109, 83,101,116,116,105,110,103,115,
- 0, 67,108,111,116,104, 67,111,108,108, 83,101,116,116,105,110,103,115, 0, 80,111,105,110,116, 67, 97, 99,104,101, 0, 67,111,
-108,108,105,115,105,111,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66, 86, 72, 84,114,101,101, 0, 83,117,114,102,
- 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 68,101,114,105,118,101,100, 77,101,115,104, 0, 66, 86, 72, 84,
-114,101,101, 70,114,111,109, 77,101,115,104, 0, 66,111,111,108,101, 97,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0,
- 77, 68,101,102, 73,110,102,108,117,101,110, 99,101, 0, 77, 68,101,102, 67,101,108,108, 0, 77,101,115,104, 68,101,102,111,114,
-109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 77,111,100,105,
-102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 0, 80, 97,114,116,105, 99,108,101,
- 73,110,115,116, 97,110, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 69,120,112,108,111,100,101, 77,111,100,105,
-102,105,101,114, 68, 97,116, 97, 0, 77,117,108,116,105,114,101,115, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 70,108,
-117,105,100,115,105,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105,109, 83,101,116,116,105,
-110,103,115, 0, 83,104,114,105,110,107,119,114, 97,112, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,105,109,112,108,
-101, 68,101,102,111,114,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,104, 97,112,101, 75,101,121, 77,111,100,105,
-102,105,101,114, 68, 97,116, 97, 0, 83,111,108,105,100,105,102,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83, 99,
-114,101,119, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 76, 97,116,116,105, 99,101, 0, 98, 68,101,102,111,114,109, 71,
-114,111,117,112, 0, 83, 99,117,108,112,116, 83,101,115,115,105,111,110, 0, 98, 65, 99,116,105,111,110, 0, 98, 80,111,115,101,
- 0, 98, 71, 80,100, 97,116, 97, 0, 98, 65,110,105,109, 86,105,122, 83,101,116,116,105,110,103,115, 0, 98, 77,111,116,105,111,
-110, 80, 97,116,104, 0, 66,117,108,108,101,116, 83,111,102,116, 66,111,100,121, 0, 80, 97,114,116, 68,101,102,108,101, 99,116,
- 0, 83,111,102,116, 66,111,100,121, 0, 79, 98, 72,111,111,107, 0, 68,117,112,108,105, 79, 98,106,101, 99,116, 0, 82, 78, 71,
- 0, 69,102,102,101, 99,116,111,114, 87,101,105,103,104,116,115, 0, 80, 84, 67, 97, 99,104,101, 77,101,109, 0, 80, 84, 67, 97,
- 99,104,101, 69,100,105,116, 0, 83, 66, 86,101,114,116,101,120, 0, 66,111,100,121, 80,111,105,110,116, 0, 66,111,100,121, 83,
-112,114,105,110,103, 0, 83, 66, 83, 99,114, 97,116, 99,104, 0, 87,111,114,108,100, 0, 66, 97,115,101, 0, 65,118,105, 67,111,
-100,101, 99, 68, 97,116, 97, 0, 81,117,105, 99,107,116,105,109,101, 67,111,100,101, 99, 68, 97,116, 97, 0, 81,117,105, 99,107,
-116,105,109,101, 67,111,100,101, 99, 83,101,116,116,105,110,103,115, 0, 70, 70, 77,112,101,103, 67,111,100,101, 99, 68, 97,116,
- 97, 0, 65,117,100,105,111, 68, 97,116, 97, 0, 83, 99,101,110,101, 82,101,110,100,101,114, 76, 97,121,101,114, 0, 82,101,110,
-100,101,114, 68, 97,116, 97, 0, 82,101,110,100,101,114, 80,114,111,102,105,108,101, 0, 71, 97,109,101, 68,111,109,101, 0, 71,
- 97,109,101, 70,114, 97,109,105,110,103, 0, 71, 97,109,101, 68, 97,116, 97, 0, 84,105,109,101, 77, 97,114,107,101,114, 0, 80,
- 97,105,110,116, 0, 66,114,117,115,104, 0, 73,109, 97,103,101, 80, 97,105,110,116, 83,101,116,116,105,110,103,115, 0, 80, 97,
-114,116,105, 99,108,101, 66,114,117,115,104, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 69,100,105,116, 83,101,116,116,
-105,110,103,115, 0, 84,114, 97,110,115,102,111,114,109, 79,114,105,101,110,116, 97,116,105,111,110, 0, 83, 99,117,108,112,116,
- 0, 86, 80, 97,105,110,116, 0, 84,111,111,108, 83,101,116,116,105,110,103,115, 0, 98, 83,116, 97,116,115, 0, 85,110,105,116,
- 83,101,116,116,105,110,103,115, 0, 80,104,121,115,105, 99,115, 83,101,116,116,105,110,103,115, 0, 69,100,105,116,105,110,103,
- 0, 83, 99,101,110,101, 83,116, 97,116,115, 0, 68, 97,103, 70,111,114,101,115,116, 0, 66, 71,112,105, 99, 0, 82,101,103,105,
-111,110, 86,105,101,119, 51, 68, 0, 82,101,110,100,101,114, 73,110,102,111, 0, 82,101,116,111,112,111, 86,105,101,119, 68, 97,
-116, 97, 0, 86,105,101,119, 68,101,112,116,104,115, 0, 83,109,111,111,116,104, 86,105,101,119, 83,116,111,114,101, 0,119,109,
- 84,105,109,101,114, 0, 86,105,101,119, 51, 68, 0, 83,112, 97, 99,101, 76,105,110,107, 0, 86,105,101,119, 50, 68, 0, 83,112,
- 97, 99,101, 73,110,102,111, 0, 98, 83, 99,114,101,101,110, 0, 83,112, 97, 99,101, 73,112,111, 0, 98, 68,111,112,101, 83,104,
-101,101,116, 0, 83,112, 97, 99,101, 66,117,116,115, 0, 83,112, 97, 99,101, 83,101,113, 0, 70,105,108,101, 83,101,108,101, 99,
-116, 80, 97,114, 97,109,115, 0, 83,112, 97, 99,101, 70,105,108,101, 0, 70,105,108,101, 76,105,115,116, 0,119,109, 79,112,101,
-114, 97,116,111,114, 0, 70,105,108,101, 76, 97,121,111,117,116, 0, 83,112, 97, 99,101, 79,111,112,115, 0, 84,114,101,101, 83,
-116,111,114,101, 0, 84,114,101,101, 83,116,111,114,101, 69,108,101,109, 0, 83,112, 97, 99,101, 73,109, 97,103,101, 0, 83, 99,
-111,112,101,115, 0, 72,105,115,116,111,103,114, 97,109, 0, 83,112, 97, 99,101, 78,108, 97, 0, 83,112, 97, 99,101, 84,101,120,
-116, 0, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 84,105,109,101, 67, 97,
- 99,104,101, 0, 83,112, 97, 99,101, 84,105,109,101, 0, 83,112, 97, 99,101, 78,111,100,101, 0, 83,112, 97, 99,101, 76,111,103,
-105, 99, 0, 83,112, 97, 99,101, 73,109, 97, 83,101,108, 0, 67,111,110,115,111,108,101, 76,105,110,101, 0, 83,112, 97, 99,101,
- 67,111,110,115,111,108,101, 0, 83,112, 97, 99,101, 85,115,101,114, 80,114,101,102, 0, 83,112, 97, 99,101, 83,111,117,110,100,
- 0, 83, 99,114, 65,114,101, 97, 0, 98, 83,111,117,110,100, 0,117,105, 70,111,110,116, 0,117,105, 70,111,110,116, 83,116,121,
-108,101, 0,117,105, 83,116,121,108,101, 0,117,105, 87,105,100,103,101,116, 67,111,108,111,114,115, 0,117,105, 87,105,100,103,
-101,116, 83,116, 97,116,101, 67,111,108,111,114,115, 0, 84,104,101,109,101, 85, 73, 0, 84,104,101,109,101, 83,112, 97, 99,101,
- 0, 84,104,101,109,101, 87,105,114,101, 67,111,108,111,114, 0, 98, 84,104,101,109,101, 0, 98, 65,100,100,111,110, 0, 83,111,
-108,105,100, 76,105,103,104,116, 0, 85,115,101,114, 68,101,102, 0, 83, 99,114, 86,101,114,116, 0, 83, 99,114, 69,100,103,101,
- 0, 80, 97,110,101,108, 0, 80, 97,110,101,108, 84,121,112,101, 0,117,105, 76, 97,121,111,117,116, 0, 83,112, 97, 99,101, 84,
-121,112,101, 0, 65, 82,101,103,105,111,110, 0, 65, 82,101,103,105,111,110, 84,121,112,101, 0, 70,105,108,101, 71,108,111, 98,
- 97,108, 0, 83,116,114,105,112, 69,108,101,109, 0, 84, 83,116,114,105,112, 69,108,101,109, 0, 83,116,114,105,112, 67,114,111,
-112, 0, 83,116,114,105,112, 84,114, 97,110,115,102,111,114,109, 0, 83,116,114,105,112, 67,111,108,111,114, 66, 97,108, 97,110,
- 99,101, 0, 83,116,114,105,112, 80,114,111,120,121, 0, 83,116,114,105,112, 0, 80,108,117,103,105,110, 83,101,113, 0, 83,101,
-113,117,101,110, 99,101, 0, 77,101,116, 97, 83,116, 97, 99,107, 0, 87,105,112,101, 86, 97,114,115, 0, 71,108,111,119, 86, 97,
-114,115, 0, 84,114, 97,110,115,102,111,114,109, 86, 97,114,115, 0, 83,111,108,105,100, 67,111,108,111,114, 86, 97,114,115, 0,
- 83,112,101,101,100, 67,111,110,116,114,111,108, 86, 97,114,115, 0, 69,102,102,101, 99,116, 0, 66,117,105,108,100, 69,102,102,
- 0, 80, 97,114,116, 69,102,102, 0, 80, 97,114,116,105, 99,108,101, 0, 87, 97,118,101, 69,102,102, 0, 98, 80,114,111,112,101,
-114,116,121, 0, 98, 78,101, 97,114, 83,101,110,115,111,114, 0, 98, 77,111,117,115,101, 83,101,110,115,111,114, 0, 98, 84,111,
-117, 99,104, 83,101,110,115,111,114, 0, 98, 75,101,121, 98,111, 97,114,100, 83,101,110,115,111,114, 0, 98, 80,114,111,112,101,
-114,116,121, 83,101,110,115,111,114, 0, 98, 65, 99,116,117, 97,116,111,114, 83,101,110,115,111,114, 0, 98, 68,101,108, 97,121,
- 83,101,110,115,111,114, 0, 98, 67,111,108,108,105,115,105,111,110, 83,101,110,115,111,114, 0, 98, 82, 97,100, 97,114, 83,101,
-110,115,111,114, 0, 98, 82, 97,110,100,111,109, 83,101,110,115,111,114, 0, 98, 82, 97,121, 83,101,110,115,111,114, 0, 98, 65,
-114,109, 97,116,117,114,101, 83,101,110,115,111,114, 0, 98, 77,101,115,115, 97,103,101, 83,101,110,115,111,114, 0, 98, 83,101,
-110,115,111,114, 0, 98, 67,111,110,116,114,111,108,108,101,114, 0, 98, 74,111,121,115,116,105, 99,107, 83,101,110,115,111,114,
- 0, 98, 69,120,112,114,101,115,115,105,111,110, 67,111,110,116, 0, 98, 80,121,116,104,111,110, 67,111,110,116, 0, 98, 65, 99,
-116,117, 97,116,111,114, 0, 98, 65,100,100, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 65, 99,116,105,111,
-110, 65, 99,116,117, 97,116,111,114, 0, 83,111,117,110,100, 51, 68, 0, 98, 83,111,117,110,100, 65, 99,116,117, 97,116,111,114,
- 0, 98, 69,100,105,116, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 83, 99,101,110,101, 65, 99,116,117, 97,
-116,111,114, 0, 98, 80,114,111,112,101,114,116,121, 65, 99,116,117, 97,116,111,114, 0, 98, 79, 98,106,101, 99,116, 65, 99,116,
-117, 97,116,111,114, 0, 98, 73,112,111, 65, 99,116,117, 97,116,111,114, 0, 98, 67, 97,109,101,114, 97, 65, 99,116,117, 97,116,
-111,114, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 71,114,111,117,112, 65, 99,116,
-117, 97,116,111,114, 0, 98, 82, 97,110,100,111,109, 65, 99,116,117, 97,116,111,114, 0, 98, 77,101,115,115, 97,103,101, 65, 99,
-116,117, 97,116,111,114, 0, 98, 71, 97,109,101, 65, 99,116,117, 97,116,111,114, 0, 98, 86,105,115,105, 98,105,108,105,116,121,
- 65, 99,116,117, 97,116,111,114, 0, 98, 84,119,111, 68, 70,105,108,116,101,114, 65, 99,116,117, 97,116,111,114, 0, 98, 80, 97,
-114,101,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 83,116, 97,116,101, 65, 99,116,117, 97,116,111,114, 0, 98, 65,114,109,
- 97,116,117,114,101, 65, 99,116,117, 97,116,111,114, 0, 71,114,111,117,112, 79, 98,106,101, 99,116, 0, 66,111,110,101, 0, 98,
- 65,114,109, 97,116,117,114,101, 0, 98, 77,111,116,105,111,110, 80, 97,116,104, 86,101,114,116, 0, 98, 80,111,115,101, 67,104,
- 97,110,110,101,108, 0, 98, 73, 75, 80, 97,114, 97,109, 0, 98, 73,116, 97,115, 99, 0, 98, 65, 99,116,105,111,110, 71,114,111,
-117,112, 0, 83,112, 97, 99,101, 65, 99,116,105,111,110, 0, 98, 65, 99,116,105,111,110, 67,104, 97,110,110,101,108, 0, 98, 67,
-111,110,115,116,114, 97,105,110,116, 67,104, 97,110,110,101,108, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,111,
-110,115,116,114, 97,105,110,116, 84, 97,114,103,101,116, 0, 98, 80,121,116,104,111,110, 67,111,110,115,116,114, 97,105,110,116,
- 0, 98, 75,105,110,101,109, 97,116,105, 99, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,112,108,105,110,101, 73, 75, 67,
-111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97, 99,107, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,
-116, 97,116,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 97,116,101, 76,105,107,101, 67,111,
-110,115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83, 97,
-109,101, 86,111,108,117,109,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97,110,115, 76,105,107,101, 67,111,110,
-115,116,114, 97,105,110,116, 0, 98, 77,105,110, 77, 97,120, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,
-110, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99,107, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116,
- 0, 98, 68, 97,109,112, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 70,111,108,108,111,119, 80, 97,116,
-104, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,116,114,101,116, 99,104, 84,111, 67,111,110,115,116,114, 97,105,110,116,
- 0, 98, 82,105,103,105,100, 66,111,100,121, 74,111,105,110,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,108, 97,109,
-112, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,104,105,108,100, 79,102, 67,111,110,115,116,114, 97,105,110,116,
- 0, 98, 84,114, 97,110,115,102,111,114,109, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 80,105,118,111,116, 67,111,110,115,
-116,114, 97,105,110,116, 0, 98, 76,111, 99, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,116, 76,
-105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,109,105,116, 67,111,110,115,116,114, 97,
-105,110,116, 0, 98, 68,105,115,116, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,104,114,105,110,107,
-119,114, 97,112, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,110, 77,111,100,105,102,105,101,114, 0, 98,
- 65, 99,116,105,111,110, 83,116,114,105,112, 0, 98, 78,111,100,101, 83,116, 97, 99,107, 0, 98, 78,111,100,101, 83,111, 99,107,
-101,116, 0, 98, 78,111,100,101, 76,105,110,107, 0, 98, 78,111,100,101, 0, 98, 78,111,100,101, 80,114,101,118,105,101,119, 0,
-117,105, 66,108,111, 99,107, 0, 98, 78,111,100,101, 84,121,112,101, 0, 78,111,100,101, 73,109, 97,103,101, 65,110,105,109, 0,
- 78,111,100,101, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 68, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 66,
-105,108, 97,116,101,114, 97,108, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 72,117,101, 83, 97,116, 0, 78,111,100,101,
- 73,109, 97,103,101, 70,105,108,101, 0, 78,111,100,101, 67,104,114,111,109, 97, 0, 78,111,100,101, 84,119,111, 88, 89,115, 0,
- 78,111,100,101, 84,119,111, 70,108,111, 97,116,115, 0, 78,111,100,101, 71,101,111,109,101,116,114,121, 0, 78,111,100,101, 86,
-101,114,116,101,120, 67,111,108, 0, 78,111,100,101, 68,101,102,111, 99,117,115, 0, 78,111,100,101, 83, 99,114,105,112,116, 68,
-105, 99,116, 0, 78,111,100,101, 71,108, 97,114,101, 0, 78,111,100,101, 84,111,110,101,109, 97,112, 0, 78,111,100,101, 76,101,
-110,115, 68,105,115,116, 0, 78,111,100,101, 67,111,108,111,114, 66, 97,108, 97,110, 99,101, 0, 78,111,100,101, 67,111,108,111,
-114,115,112,105,108,108, 0, 84,101,120, 78,111,100,101, 79,117,116,112,117,116, 0, 67,117,114,118,101, 77, 97,112, 80,111,105,
-110,116, 0, 67,117,114,118,101, 77, 97,112, 0, 66,114,117,115,104, 67,108,111,110,101, 0, 67,117,115,116,111,109, 68, 97,116,
- 97, 76, 97,121,101,114, 0, 67,117,115,116,111,109, 68, 97,116, 97, 69,120,116,101,114,110, 97,108, 0, 72, 97,105,114, 75,101,
-121, 0, 80, 97,114,116,105, 99,108,101, 75,101,121, 0, 66,111,105,100, 80, 97,114,116,105, 99,108,101, 0, 66,111,105,100, 68,
- 97,116, 97, 0, 67,104,105,108,100, 80, 97,114,116,105, 99,108,101, 0, 80, 97,114,116,105, 99,108,101, 84, 97,114,103,101,116,
- 0, 80, 97,114,116,105, 99,108,101, 68,117,112,108,105, 87,101,105,103,104,116, 0, 80, 97,114,116,105, 99,108,101, 68, 97,116,
- 97, 0, 83, 80, 72, 70,108,117,105,100, 83,101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 83,101,116,116,105,
-110,103,115, 0, 66,111,105,100, 83,101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 67, 97, 99,104,101, 75,101,
-121, 0, 75, 68, 84,114,101,101, 0, 80, 97,114,116,105, 99,108,101, 68,114, 97,119, 68, 97,116, 97, 0, 76,105,110,107, 78,111,
-100,101, 0, 98, 71, 80, 68,115,112,111,105,110,116, 0, 98, 71, 80, 68,115,116,114,111,107,101, 0, 98, 71, 80, 68,102,114, 97,
-109,101, 0, 98, 71, 80, 68,108, 97,121,101,114, 0, 82,101,112,111,114,116, 0, 82,101,112,111,114,116, 76,105,115,116, 0, 82,
-101,112,111,114,116, 84,105,109,101,114, 73,110,102,111, 0,119,109, 87,105,110,100,111,119, 77, 97,110, 97,103,101,114, 0,119,
-109, 87,105,110,100,111,119, 0,119,109, 75,101,121, 67,111,110,102,105,103, 0,119,109, 69,118,101,110,116, 0,119,109, 83,117,
- 98, 87,105,110,100,111,119, 0,119,109, 71,101,115,116,117,114,101, 0,119,109, 75,101,121, 77, 97,112, 73,116,101,109, 0, 80,
-111,105,110,116,101,114, 82, 78, 65, 0,119,109, 75,101,121, 77, 97,112, 0,119,109, 79,112,101,114, 97,116,111,114, 84,121,112,
-101, 0, 70, 77,111,100,105,102,105,101,114, 0, 70, 77,111,100, 95, 71,101,110,101,114, 97,116,111,114, 0, 70, 77,111,100, 95,
- 70,117,110, 99,116,105,111,110, 71,101,110,101,114, 97,116,111,114, 0, 70, 67, 77, 95, 69,110,118,101,108,111,112,101, 68, 97,
-116, 97, 0, 70, 77,111,100, 95, 69,110,118,101,108,111,112,101, 0, 70, 77,111,100, 95, 67,121, 99,108,101,115, 0, 70, 77,111,
-100, 95, 80,121,116,104,111,110, 0, 70, 77,111,100, 95, 76,105,109,105,116,115, 0, 70, 77,111,100, 95, 78,111,105,115,101, 0,
- 70, 77,111,100, 95, 83,116,101,112,112,101,100, 0, 68,114,105,118,101,114, 84, 97,114,103,101,116, 0, 68,114,105,118,101,114,
- 86, 97,114, 0, 67,104, 97,110,110,101,108, 68,114,105,118,101,114, 0, 70, 80,111,105,110,116, 0, 70, 67,117,114,118,101, 0,
- 65,110,105,109, 77, 97,112, 80, 97,105,114, 0, 65,110,105,109, 77, 97,112,112,101,114, 0, 78,108, 97, 83,116,114,105,112, 0,
- 78,108, 97, 84,114, 97, 99,107, 0, 75, 83, 95, 80, 97,116,104, 0, 75,101,121,105,110,103, 83,101,116, 0, 65,110,105,109, 79,
-118,101,114,114,105,100,101, 0, 73,100, 65,100,116, 84,101,109,112,108, 97,116,101, 0, 66,111,105,100, 82,117,108,101, 0, 66,
-111,105,100, 82,117,108,101, 71,111, 97,108, 65,118,111,105,100, 0, 66,111,105,100, 82,117,108,101, 65,118,111,105,100, 67,111,
-108,108,105,115,105,111,110, 0, 66,111,105,100, 82,117,108,101, 70,111,108,108,111,119, 76,101, 97,100,101,114, 0, 66,111,105,
-100, 82,117,108,101, 65,118,101,114, 97,103,101, 83,112,101,101,100, 0, 66,111,105,100, 82,117,108,101, 70,105,103,104,116, 0,
- 66,111,105,100, 83,116, 97,116,101, 0, 70, 76, 85, 73, 68, 95, 51, 68, 0, 87, 84, 85, 82, 66, 85, 76, 69, 78, 67, 69, 0, 0,
- 84, 76, 69, 78, 1, 0, 1, 0, 2, 0, 2, 0, 4, 0, 4, 0, 4, 0, 4, 0, 8, 0, 0, 0, 8, 0, 12, 0, 8, 0, 4, 0,
- 8, 0, 8, 0, 16, 0, 12, 0, 12, 0, 24, 0, 16, 0, 16, 0, 32, 0, 16, 0, 16, 0, 20, 0, 76, 0, 52, 0, 40, 2, 0, 0,
- 32, 0,140, 0,220, 3, 92, 0, 36, 0, 56, 0, 84, 0,112, 0,124, 0, 56, 0, 24, 0, 40, 0,120, 0, 12, 0,104, 0, 36, 0,
-120, 5,156, 1, 0, 0, 0, 0, 0, 0, 8, 1, 48, 1, 84, 1, 24, 0, 8, 3,168, 0, 0, 0, 72, 0, 32, 1,152, 0,132, 0,
-108, 1, 16, 1, 88, 0,160, 2, 76, 0, 60, 1, 0, 0,108, 0,104, 0,148, 0, 56, 0, 8, 0, 16, 0, 12, 0, 0, 0, 92, 1,
- 0, 0, 0, 0, 0, 0, 40, 1, 20, 0, 44, 0, 60, 0, 24, 0, 12, 0, 12, 0, 4, 0, 8, 0, 8, 0, 0, 0, 28, 0, 84, 0,
- 32, 0, 8, 0, 12, 0, 8, 0, 8, 0, 4, 0, 4, 0, 0, 1, 32, 0, 12, 0, 16, 0, 64, 0, 24, 0, 12, 0, 40, 0, 64, 0,
- 80, 0,100, 0,108, 0, 80, 0,108, 0,128, 0, 76, 0, 72, 0,120, 0, 72, 0, 84, 0,204, 0, 48, 0,168, 0,160, 0,172, 0,
- 72, 0,104, 0,116, 0,196, 0,112, 0,224, 0, 64, 0, 92, 0, 0, 0,144, 0, 32, 0,240, 1,112, 0, 0, 0, 88, 0, 0, 0,
- 0, 0, 76, 0, 8, 0, 8, 0,244, 0, 88, 0,124, 1, 84, 0, 76, 0, 72, 0, 72, 0,176, 1,120, 0,116, 0, 64, 0,120, 0,
- 92, 0,220, 0, 40, 0, 0, 0, 92, 0,148, 0, 72, 0, 48, 0, 20, 0,120, 0,144, 0, 88, 1,208, 0,180, 0, 0, 0, 68, 0,
- 92, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,112, 1, 28, 0,176, 0,144, 0, 64, 0, 60, 0, 24, 0, 72, 0,232, 3, 56, 0,
- 20, 0, 16, 0,100, 0, 84, 0, 16, 0,188, 2, 36, 0, 16, 0,156, 0, 80, 0, 88, 0, 36, 0,152, 1, 32, 0, 8, 0, 24, 0,
- 56, 2, 0, 0, 0, 0, 72, 0, 72, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 0, 40, 0,140, 0, 48, 0,140, 0,208, 0,
- 24, 0,216, 0,216, 0,200, 1, 60, 0, 0, 0,120, 0, 0, 0,252, 0, 12, 0, 12, 0, 24, 33,112, 16, 24, 16,192, 0,124, 2,
- 80, 2, 40, 0, 36, 0,188, 0,244, 0, 52, 0,140, 2, 28, 0,112, 1, 88, 0,188, 0, 96, 0, 92, 1, 16, 1, 32, 0,224, 0,
- 32, 0, 32, 0,112, 2,104, 1, 16, 0, 48, 29, 72, 0, 56, 0,240, 12, 20, 0, 24, 0, 64, 1, 0, 0, 0, 0, 0, 0,248, 0,
- 0, 0, 16, 1, 80, 0, 28, 0, 16, 0, 8, 0, 44, 0,252, 0,240, 0,168, 1,216, 0, 16, 0, 12, 0, 24, 0, 52, 0, 16, 0,
- 20, 0, 16, 0, 24, 0, 56, 1, 0, 0, 56, 0, 52, 0, 48, 0, 8, 0, 44, 0, 72, 0,104, 0, 40, 0, 8, 0, 72, 0, 44, 0,
- 40, 0,108, 0, 72, 0, 68, 0, 76, 0, 80, 0, 60, 0,128, 0, 76, 0, 60, 0, 12, 0, 92, 0, 32, 0, 68, 0, 80, 0, 16, 0,
- 76, 0,108, 0, 84, 0, 28, 0, 96, 0, 56, 0, 56, 0,108, 0,140, 0, 4, 0, 20, 0, 12, 0, 8, 0, 80, 0, 24, 0, 16, 1,
-144, 0, 16, 0,204, 1, 4, 0, 40, 0,104, 0,216, 0, 64, 0, 44, 0, 72, 0,116, 0, 60, 0,112, 0, 16, 0, 52, 0, 44, 0,
- 44, 0, 44, 0, 8, 0, 36, 0, 68, 0, 64, 0, 44, 0, 44, 0, 20, 0, 52, 0, 96, 0, 12, 0,108, 0, 92, 0, 52, 0, 28, 0,
- 28, 0, 28, 0, 52, 0, 20, 0, 60, 0,140, 0, 36, 0,120, 0, 32, 0,180, 0, 0, 0, 0, 0, 0, 0, 16, 0, 40, 0, 28, 0,
- 12, 0, 12, 0, 16, 1, 44, 0, 8, 0, 8, 0, 64, 0, 32, 0, 24, 0, 8, 0, 24, 0, 32, 0, 8, 0, 96, 0, 20, 0, 32, 0,
- 12, 0, 44, 0, 20, 0, 68, 0,240, 0, 24, 0, 56, 0, 52, 0, 20, 0, 64, 0, 28, 0, 20, 0,180, 0, 36, 0,200, 1, 96, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 20, 0, 24, 0,172, 0, 24, 0, 28, 0, 20, 0,168, 0,148, 0,152, 0, 0, 0, 0, 0,
- 0, 0,104, 0, 0, 0, 96, 0, 0, 0, 88, 0, 20, 0, 24, 0, 16, 0, 20, 0, 8, 0, 8, 0, 24, 0, 20, 0, 20, 0, 48, 0,
-208, 1, 28, 1, 16, 0, 68, 0, 0, 1, 20, 0,160, 0, 88, 0, 96, 0,152, 0, 20, 0, 56, 0, 48, 0, 68, 0, 56, 0, 92, 0,
- 64, 0, 56, 0, 96, 0, 0, 0, 0, 0, 0, 0, 83, 84, 82, 67,152, 1, 0, 0, 10, 0, 2, 0, 10, 0, 0, 0, 10, 0, 1, 0,
- 11, 0, 3, 0, 11, 0, 0, 0, 11, 0, 1, 0, 9, 0, 2, 0, 12, 0, 2, 0, 9, 0, 3, 0, 9, 0, 4, 0, 13, 0, 2, 0,
- 2, 0, 5, 0, 2, 0, 6, 0, 14, 0, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0, 15, 0, 2, 0, 4, 0, 5, 0, 4, 0, 6, 0,
- 16, 0, 2, 0, 8, 0, 5, 0, 8, 0, 6, 0, 17, 0, 3, 0, 4, 0, 5, 0, 4, 0, 6, 0, 4, 0, 7, 0, 18, 0, 3, 0,
- 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 19, 0, 3, 0, 8, 0, 5, 0, 8, 0, 6, 0, 8, 0, 7, 0, 20, 0, 4, 0,
- 4, 0, 5, 0, 4, 0, 6, 0, 4, 0, 7, 0, 4, 0, 8, 0, 21, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0,
- 7, 0, 8, 0, 22, 0, 4, 0, 8, 0, 5, 0, 8, 0, 6, 0, 8, 0, 7, 0, 8, 0, 8, 0, 23, 0, 4, 0, 4, 0, 9, 0,
- 4, 0, 10, 0, 4, 0, 11, 0, 4, 0, 12, 0, 24, 0, 4, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0,
- 25, 0, 4, 0, 9, 0, 13, 0, 12, 0, 14, 0, 4, 0, 15, 0, 4, 0, 16, 0, 26, 0, 10, 0, 26, 0, 0, 0, 26, 0, 1, 0,
- 0, 0, 17, 0, 0, 0, 18, 0, 2, 0, 19, 0, 0, 0, 20, 0, 4, 0, 21, 0, 25, 0, 22, 0, 4, 0, 23, 0, 4, 0, 24, 0,
- 27, 0, 9, 0, 9, 0, 0, 0, 9, 0, 1, 0, 27, 0, 25, 0, 28, 0, 26, 0, 0, 0, 27, 0, 2, 0, 28, 0, 2, 0, 19, 0,
- 4, 0, 29, 0, 26, 0, 30, 0, 28, 0, 8, 0, 27, 0, 31, 0, 27, 0, 32, 0, 29, 0, 33, 0, 0, 0, 34, 0, 0, 0, 35, 0,
- 4, 0, 36, 0, 4, 0, 37, 0, 28, 0, 38, 0, 30, 0, 5, 0, 4, 0, 39, 0, 4, 0, 40, 0, 2, 0, 41, 0, 2, 0, 42, 0,
- 4, 0, 43, 0, 31, 0, 6, 0, 32, 0, 44, 0, 2, 0, 45, 0, 2, 0, 46, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0, 47, 0,
- 33, 0, 21, 0, 33, 0, 0, 0, 33, 0, 1, 0, 34, 0, 48, 0, 35, 0, 49, 0, 24, 0, 50, 0, 24, 0, 51, 0, 2, 0, 45, 0,
- 2, 0, 46, 0, 2, 0, 52, 0, 2, 0, 53, 0, 2, 0, 54, 0, 2, 0, 55, 0, 2, 0, 19, 0, 2, 0, 56, 0, 7, 0, 11, 0,
- 7, 0, 12, 0, 4, 0, 57, 0, 7, 0, 58, 0, 7, 0, 59, 0, 7, 0, 60, 0, 31, 0, 61, 0, 36, 0, 7, 0, 27, 0, 31, 0,
- 12, 0, 62, 0, 24, 0, 63, 0, 2, 0, 45, 0, 2, 0, 64, 0, 2, 0, 65, 0, 2, 0, 37, 0, 37, 0, 16, 0, 37, 0, 0, 0,
- 37, 0, 1, 0, 7, 0, 66, 0, 7, 0, 60, 0, 2, 0, 17, 0, 2, 0, 46, 0, 2, 0, 67, 0, 2, 0, 19, 0, 4, 0, 68, 0,
- 4, 0, 69, 0, 9, 0, 2, 0, 7, 0, 70, 0, 0, 0, 20, 0, 0, 0, 71, 0, 7, 0, 72, 0, 7, 0, 73, 0, 38, 0, 13, 0,
- 27, 0, 31, 0, 39, 0, 74, 0, 37, 0, 75, 0, 0, 0, 76, 0, 4, 0, 77, 0, 7, 0, 60, 0, 12, 0, 78, 0, 36, 0, 79, 0,
- 27, 0, 80, 0, 2, 0, 17, 0, 2, 0, 81, 0, 2, 0, 82, 0, 2, 0, 19, 0, 40, 0, 6, 0, 40, 0, 0, 0, 40, 0, 1, 0,
- 0, 0, 83, 0, 0, 0, 84, 0, 4, 0, 23, 0, 4, 0, 85, 0, 41, 0, 10, 0, 41, 0, 0, 0, 41, 0, 1, 0, 4, 0, 86, 0,
- 4, 0, 87, 0, 4, 0, 88, 0, 4, 0, 89, 0, 4, 0, 14, 0, 4, 0, 90, 0, 0, 0, 91, 0, 0, 0, 92, 0, 42, 0, 15, 0,
- 27, 0, 31, 0, 0, 0, 93, 0, 4, 0, 90, 0, 4, 0, 94, 0, 12, 0, 95, 0, 40, 0, 96, 0, 40, 0, 97, 0, 4, 0, 98, 0,
- 4, 0, 99, 0, 12, 0,100, 0, 0, 0,101, 0, 4, 0,102, 0, 4, 0,103, 0, 9, 0,104, 0, 8, 0,105, 0, 43, 0, 3, 0,
- 4, 0,106, 0, 4, 0,107, 0, 9, 0, 2, 0, 44, 0, 15, 0, 27, 0, 31, 0, 39, 0, 74, 0, 2, 0, 17, 0, 2, 0, 19, 0,
- 7, 0,108, 0, 7, 0,109, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0,112, 0, 7, 0,113, 0, 7, 0,114, 0, 7, 0,115, 0,
- 7, 0,116, 0, 36, 0, 79, 0, 32, 0,117, 0, 45, 0, 13, 0, 4, 0,118, 0, 4, 0,119, 0, 4, 0,120, 0, 4, 0,121, 0,
- 2, 0,122, 0, 2, 0,123, 0, 2, 0, 19, 0, 2, 0,124, 0, 2, 0,125, 0, 2, 0,126, 0, 2, 0,127, 0, 2, 0,128, 0,
- 46, 0,129, 0, 47, 0, 32, 0, 27, 0, 31, 0, 0, 0, 34, 0, 12, 0,130, 0, 48, 0,131, 0, 49, 0,132, 0, 50, 0,133, 0,
- 50, 0,134, 0, 2, 0,135, 0, 2, 0,136, 0, 2, 0,124, 0, 2, 0, 19, 0, 2, 0,137, 0, 2, 0, 17, 0, 4, 0,138, 0,
- 2, 0,139, 0, 2, 0,140, 0, 2, 0,141, 0, 2, 0,142, 0, 2, 0,143, 0, 2, 0,144, 0, 4, 0,145, 0, 4, 0,146, 0,
- 43, 0,147, 0, 30, 0,148, 0, 7, 0,149, 0, 4, 0,150, 0, 2, 0,151, 0, 2, 0,152, 0, 2, 0,153, 0, 2, 0,154, 0,
- 7, 0,155, 0, 7, 0,156, 0, 51, 0, 63, 0, 2, 0,157, 0, 2, 0,158, 0, 2, 0,159, 0, 2, 0,160, 0, 32, 0,161, 0,
- 52, 0,162, 0, 0, 0,163, 0, 0, 0,164, 0, 0, 0,165, 0, 0, 0,166, 0, 0, 0,167, 0, 7, 0,168, 0, 7, 0,169, 0,
- 7, 0,170, 0, 2, 0,171, 0, 2, 0,172, 0, 2, 0,173, 0, 2, 0,174, 0, 2, 0,175, 0, 2, 0,176, 0, 0, 0,177, 0,
- 0, 0,178, 0, 7, 0,179, 0, 7, 0,180, 0, 7, 0,181, 0, 7, 0,182, 0, 7, 0,183, 0, 7, 0, 56, 0, 7, 0,184, 0,
- 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0, 7, 0,188, 0, 7, 0,189, 0, 7, 0,190, 0, 7, 0,191, 0, 7, 0,192, 0,
- 7, 0,193, 0, 7, 0,194, 0, 7, 0,195, 0, 7, 0,196, 0, 7, 0,197, 0, 7, 0,198, 0, 7, 0,199, 0, 7, 0,200, 0,
- 7, 0,201, 0, 7, 0,202, 0, 7, 0,203, 0, 7, 0,204, 0, 7, 0,205, 0, 7, 0,206, 0, 7, 0,207, 0, 7, 0,208, 0,
- 7, 0,209, 0, 7, 0,210, 0, 7, 0,211, 0, 7, 0,212, 0, 7, 0,213, 0, 7, 0,214, 0, 7, 0,215, 0, 7, 0,216, 0,
- 7, 0,217, 0, 7, 0,218, 0, 53, 0, 15, 0, 0, 0,219, 0, 9, 0,220, 0, 0, 0,221, 0, 0, 0,222, 0, 4, 0,223, 0,
- 4, 0,224, 0, 9, 0,225, 0, 7, 0,226, 0, 7, 0,227, 0, 7, 0,228, 0, 4, 0,229, 0, 9, 0,230, 0, 9, 0,231, 0,
- 4, 0,232, 0, 4, 0, 37, 0, 54, 0, 6, 0, 7, 0,179, 0, 7, 0,180, 0, 7, 0,181, 0, 7, 0,233, 0, 7, 0, 66, 0,
- 4, 0, 63, 0, 55, 0, 5, 0, 2, 0, 19, 0, 2, 0, 36, 0, 2, 0, 63, 0, 2, 0,234, 0, 54, 0,228, 0, 56, 0, 17, 0,
- 32, 0,161, 0, 47, 0,235, 0, 57, 0,236, 0, 7, 0,237, 0, 7, 0,238, 0, 2, 0, 17, 0, 2, 0,239, 0, 7, 0,109, 0,
- 7, 0,110, 0, 7, 0,240, 0, 4, 0,241, 0, 2, 0,242, 0, 2, 0,243, 0, 4, 0,124, 0, 4, 0,138, 0, 2, 0,244, 0,
- 2, 0,245, 0, 58, 0, 22, 0, 2, 0, 19, 0, 2, 0,246, 0, 7, 0,247, 0, 7, 0,248, 0, 2, 0,137, 0, 2, 0,249, 0,
- 4, 0,250, 0, 4, 0,251, 0, 32, 0,161, 0, 4, 0,252, 0, 2, 0,253, 0, 2, 0,254, 0, 9, 0,255, 0, 7, 0, 0, 1,
- 7, 0, 1, 1, 2, 0, 2, 1, 2, 0, 3, 1, 2, 0, 4, 1, 2, 0, 5, 1, 7, 0, 6, 1, 7, 0, 7, 1, 55, 0, 8, 1,
- 59, 0, 13, 0, 4, 0, 9, 1, 4, 0, 10, 1, 2, 0, 11, 1, 2, 0, 19, 0, 2, 0, 12, 1, 2, 0, 13, 1, 32, 0,161, 0,
- 7, 0, 14, 1, 4, 0, 15, 1, 0, 0, 16, 1, 7, 0, 17, 1, 4, 0, 18, 1, 4, 0,124, 0, 52, 0, 63, 0, 27, 0, 31, 0,
- 39, 0, 74, 0, 7, 0, 19, 1, 7, 0, 20, 1, 7, 0, 21, 1, 7, 0, 22, 1, 7, 0, 23, 1, 7, 0, 24, 1, 7, 0, 25, 1,
- 7, 0, 26, 1, 7, 0, 27, 1, 7, 0, 69, 0, 7, 0, 28, 1, 7, 0, 29, 1, 7, 0, 30, 1, 7, 0, 31, 1, 7, 0, 32, 1,
- 7, 0, 33, 1, 7, 0, 34, 1, 7, 0, 35, 1, 7, 0, 36, 1, 7, 0, 37, 1, 7, 0, 38, 1, 7, 0, 39, 1, 2, 0, 40, 1,
- 2, 0, 41, 1, 2, 0, 42, 1, 2, 0, 43, 1, 2, 0, 44, 1, 2, 0, 45, 1, 2, 0, 46, 1, 2, 0, 19, 0, 2, 0, 17, 0,
- 2, 0,239, 0, 7, 0, 47, 1, 7, 0, 48, 1, 7, 0, 49, 1, 7, 0, 50, 1, 4, 0, 51, 1, 4, 0, 52, 1, 2, 0, 53, 1,
- 2, 0, 54, 1, 2, 0, 12, 1, 2, 0,122, 0, 4, 0, 23, 0, 4, 0,119, 0, 4, 0,120, 0, 4, 0,121, 0, 7, 0, 55, 1,
- 7, 0, 56, 1, 7, 0, 89, 0, 45, 0, 57, 1, 60, 0, 58, 1, 36, 0, 79, 0, 47, 0,235, 0, 53, 0, 59, 1, 55, 0, 8, 1,
- 56, 0, 60, 1, 30, 0,148, 0, 58, 0, 61, 1, 59, 0, 62, 1, 0, 0, 63, 1, 0, 0,178, 0, 61, 0, 8, 0, 7, 0, 64, 1,
- 7, 0, 65, 1, 7, 0,169, 0, 4, 0, 19, 0, 7, 0, 66, 1, 7, 0, 67, 1, 7, 0, 68, 1, 32, 0, 44, 0, 62, 0, 72, 0,
- 27, 0, 31, 0, 39, 0, 74, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 69, 1, 2, 0,172, 0, 2, 0, 70, 1, 7, 0,179, 0,
- 7, 0,180, 0, 7, 0,181, 0, 7, 0,182, 0, 7, 0, 71, 1, 7, 0, 72, 1, 7, 0, 73, 1, 7, 0, 74, 1, 7, 0, 75, 1,
- 7, 0, 76, 1, 7, 0, 77, 1, 7, 0, 78, 1, 7, 0, 79, 1, 7, 0, 80, 1, 7, 0, 81, 1, 63, 0, 82, 1, 2, 0,246, 0,
- 2, 0, 69, 0, 7, 0,109, 0, 7, 0,110, 0, 7, 0, 83, 1, 7, 0, 84, 1, 7, 0, 85, 1, 7, 0, 86, 1, 7, 0, 87, 1,
- 2, 0, 88, 1, 2, 0, 89, 1, 2, 0, 90, 1, 2, 0, 91, 1, 0, 0, 92, 1, 0, 0, 93, 1, 2, 0, 94, 1, 2, 0, 95, 1,
- 2, 0, 96, 1, 2, 0, 97, 1, 2, 0, 98, 1, 7, 0, 99, 1, 7, 0,100, 1, 7, 0,101, 1, 7, 0,102, 1, 2, 0,103, 1,
- 2, 0, 89, 0, 2, 0,104, 1, 2, 0,105, 1, 2, 0,106, 1, 2, 0,107, 1, 7, 0,108, 1, 7, 0,109, 1, 7, 0,110, 1,
- 7, 0,111, 1, 7, 0,112, 1, 7, 0,113, 1, 7, 0,114, 1, 7, 0,115, 1, 7, 0,116, 1, 7, 0,117, 1, 7, 0,118, 1,
- 7, 0,119, 1, 2, 0,120, 1, 0, 0,121, 1, 36, 0, 79, 0, 51, 0,122, 1, 2, 0,123, 1, 0, 0,124, 1, 30, 0,148, 0,
- 64, 0, 18, 0, 7, 0,125, 1, 7, 0,126, 1, 7, 0,127, 1, 7, 0,128, 1, 7, 0,129, 1, 7, 0,130, 1, 7, 0,131, 1,
- 7, 0,132, 1, 7, 0,133, 1, 7, 0,134, 1, 2, 0,135, 1, 2, 0,136, 1, 2, 0,137, 1, 2, 0,138, 1, 7, 0,139, 1,
- 7, 0,140, 1, 7, 0,141, 1, 7, 0,142, 1, 65, 0,124, 0, 27, 0, 31, 0, 39, 0, 74, 0, 2, 0,143, 1, 2, 0, 19, 0,
- 7, 0,179, 0, 7, 0,180, 0, 7, 0,181, 0, 7, 0,144, 1, 7, 0,145, 1, 7, 0,146, 1, 7, 0,147, 1, 7, 0,148, 1,
- 7, 0,149, 1, 7, 0,150, 1, 7, 0,151, 1, 7, 0,152, 1, 7, 0,153, 1, 7, 0,154, 1, 7, 0,155, 1, 7, 0,156, 1,
- 7, 0,157, 1, 7, 0,158, 1, 7, 0,159, 1, 7, 0,160, 1, 7, 0,161, 1, 7, 0,162, 1, 7, 0,163, 1, 64, 0,164, 1,
- 7, 0,165, 1, 7, 0,166, 1, 7, 0,167, 1, 7, 0,168, 1, 7, 0,169, 1, 7, 0,170, 1, 7, 0,171, 1, 2, 0,172, 1,
- 2, 0,173, 1, 2, 0,174, 1, 0, 0,175, 1, 0, 0,176, 1, 7, 0,177, 1, 7, 0,178, 1, 2, 0,179, 1, 2, 0,180, 1,
- 7, 0,181, 1, 7, 0,182, 1, 7, 0,183, 1, 7, 0,184, 1, 2, 0,185, 1, 2, 0,186, 1, 4, 0, 69, 1, 4, 0,187, 1,
- 2, 0,188, 1, 2, 0,189, 1, 2, 0,190, 1, 2, 0,191, 1, 7, 0,192, 1, 7, 0,193, 1, 7, 0,194, 1, 7, 0,195, 1,
- 7, 0,196, 1, 7, 0,197, 1, 7, 0,198, 1, 7, 0,199, 1, 7, 0,200, 1, 7, 0,201, 1, 0, 0,202, 1, 7, 0,203, 1,
- 7, 0,204, 1, 7, 0,205, 1, 4, 0,206, 1, 0, 0,207, 1, 0, 0,104, 1, 0, 0,208, 1, 0, 0, 63, 1, 2, 0,209, 1,
- 2, 0,210, 1, 2, 0,123, 1, 2, 0,211, 1, 2, 0,212, 1, 2, 0,213, 1, 7, 0,214, 1, 7, 0,215, 1, 7, 0,216, 1,
- 7, 0,217, 1, 7, 0,218, 1, 2, 0,157, 0, 2, 0,158, 0, 55, 0,219, 1, 55, 0,220, 1, 0, 0,221, 1, 0, 0,222, 1,
- 0, 0,223, 1, 0, 0,224, 1, 2, 0,225, 1, 2, 0,226, 1, 7, 0,227, 1, 7, 0,228, 1, 51, 0,122, 1, 60, 0, 58, 1,
- 36, 0, 79, 0, 66, 0,229, 1, 30, 0,148, 0, 7, 0,230, 1, 7, 0,231, 1, 7, 0,232, 1, 7, 0,233, 1, 7, 0,234, 1,
- 2, 0,235, 1, 2, 0, 69, 0, 7, 0,236, 1, 7, 0,237, 1, 7, 0,238, 1, 7, 0,239, 1, 7, 0,240, 1, 7, 0,241, 1,
- 7, 0,242, 1, 7, 0,243, 1, 7, 0,244, 1, 2, 0,245, 1, 2, 0,246, 1, 4, 0,247, 1, 4, 0,248, 1, 12, 0,249, 1,
- 67, 0, 4, 0, 27, 0, 31, 0, 0, 0,250, 1, 68, 0, 2, 0, 43, 0,147, 0, 69, 0, 26, 0, 69, 0, 0, 0, 69, 0, 1, 0,
- 70, 0,251, 1, 4, 0,252, 1, 4, 0,253, 1, 4, 0,254, 1, 4, 0,255, 1, 4, 0, 0, 2, 4, 0, 1, 2, 2, 0, 17, 0,
- 2, 0, 19, 0, 2, 0, 2, 2, 2, 0, 3, 2, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 0, 4, 2, 7, 0, 5, 2,
- 7, 0, 6, 2, 7, 0, 7, 2, 7, 0, 8, 2, 7, 0, 9, 2, 7, 0, 10, 2, 7, 0, 23, 0, 7, 0, 11, 2, 7, 0, 12, 2,
- 71, 0, 20, 0, 27, 0, 31, 0, 39, 0, 74, 0, 70, 0,251, 1, 12, 0, 13, 2, 12, 0, 14, 2, 12, 0, 15, 2, 36, 0, 79, 0,
- 65, 0, 16, 2, 0, 0, 19, 0, 0, 0, 17, 2, 2, 0, 18, 2, 2, 0,171, 0, 2, 0, 37, 0, 7, 0, 64, 1, 7, 0,169, 0,
- 7, 0, 65, 1, 7, 0, 19, 2, 7, 0, 20, 2, 7, 0, 21, 2, 69, 0, 22, 2, 35, 0, 11, 0, 7, 0, 23, 2, 7, 0, 24, 2,
- 7, 0, 25, 2, 7, 0,248, 0, 2, 0, 54, 0, 0, 0, 26, 2, 0, 0, 27, 2, 0, 0, 28, 2, 0, 0, 29, 2, 0, 0, 30, 2,
- 0, 0, 31, 2, 34, 0, 7, 0, 7, 0, 32, 2, 7, 0, 24, 2, 7, 0, 25, 2, 2, 0, 28, 2, 2, 0, 31, 2, 7, 0,248, 0,
- 7, 0, 37, 0, 72, 0, 21, 0, 72, 0, 0, 0, 72, 0, 1, 0, 2, 0, 17, 0, 2, 0, 33, 2, 2, 0, 31, 2, 2, 0, 19, 0,
- 2, 0, 34, 2, 2, 0, 35, 2, 2, 0, 36, 2, 2, 0, 37, 2, 2, 0, 38, 2, 2, 0, 39, 2, 2, 0, 40, 2, 2, 0, 41, 2,
- 7, 0, 42, 2, 7, 0, 43, 2, 34, 0, 48, 0, 35, 0, 49, 0, 2, 0, 44, 2, 2, 0, 45, 2, 4, 0, 46, 2, 73, 0, 5, 0,
- 2, 0, 47, 2, 2, 0, 33, 2, 0, 0, 19, 0, 0, 0, 37, 0, 2, 0, 69, 0, 74, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0,
- 7, 0, 8, 0, 7, 0, 48, 2, 75, 0, 2, 0, 12, 0, 49, 2, 76, 0, 50, 2, 77, 0, 68, 0, 27, 0, 31, 0, 39, 0, 74, 0,
- 70, 0,251, 1, 12, 0, 51, 2, 12, 0, 14, 2, 75, 0, 52, 2, 32, 0, 53, 2, 32, 0, 54, 2, 32, 0, 55, 2, 36, 0, 79, 0,
- 78, 0, 56, 2, 38, 0, 57, 2, 65, 0, 16, 2, 12, 0, 58, 2, 7, 0, 64, 1, 7, 0,169, 0, 7, 0, 65, 1, 2, 0,171, 0,
- 2, 0, 89, 0, 2, 0, 59, 2, 2, 0, 60, 2, 2, 0, 61, 2, 7, 0, 62, 2, 7, 0, 63, 2, 2, 0, 64, 2, 2, 0, 18, 2,
- 2, 0, 19, 0, 2, 0, 65, 2, 7, 0, 66, 2, 7, 0, 67, 2, 7, 0, 68, 2, 2, 0, 36, 2, 2, 0, 37, 2, 2, 0, 69, 2,
- 2, 0, 70, 2, 4, 0, 71, 2, 9, 0, 72, 2, 2, 0, 23, 0, 2, 0, 95, 0, 2, 0, 66, 0, 2, 0, 73, 2, 7, 0, 74, 2,
- 7, 0, 75, 2, 7, 0, 76, 2, 7, 0, 77, 2, 7, 0, 78, 2, 7, 0, 79, 2, 7, 0, 80, 2, 7, 0, 81, 2, 7, 0, 82, 2,
- 7, 0, 83, 2, 0, 0, 84, 2, 79, 0, 85, 2, 80, 0, 86, 2, 0, 0, 87, 2, 67, 0, 88, 2, 67, 0, 89, 2, 67, 0, 90, 2,
- 67, 0, 91, 2, 4, 0, 92, 2, 7, 0, 93, 2, 4, 0, 94, 2, 4, 0, 95, 2, 74, 0, 96, 2, 4, 0, 97, 2, 4, 0, 98, 2,
- 73, 0, 99, 2, 73, 0,100, 2, 81, 0, 41, 0, 27, 0, 31, 0, 39, 0, 74, 0, 70, 0,251, 1, 12, 0,101, 2, 36, 0, 79, 0,
- 38, 0, 57, 2, 65, 0, 16, 2, 82, 0,102, 2, 83, 0,103, 2, 84, 0,104, 2, 85, 0,105, 2, 86, 0,106, 2, 87, 0,107, 2,
- 88, 0,108, 2, 89, 0,109, 2, 81, 0,110, 2, 90, 0,111, 2, 91, 0,112, 2, 92, 0,113, 2, 92, 0,114, 2, 92, 0,115, 2,
- 4, 0, 53, 0, 4, 0,116, 2, 4, 0,117, 2, 4, 0,118, 2, 4, 0,119, 2, 2, 0,171, 0, 2, 0,120, 2, 7, 0, 64, 1,
- 7, 0,169, 0, 7, 0, 65, 1, 7, 0,121, 2, 4, 0, 59, 2, 2, 0,122, 2, 2, 0, 19, 0, 2, 0,123, 2, 2, 0,124, 2,
- 2, 0, 18, 2, 2, 0,125, 2, 93, 0,126, 2, 94, 0,127, 2, 84, 0, 8, 0, 9, 0,128, 2, 7, 0,129, 2, 4, 0,130, 2,
- 0, 0, 19, 0, 0, 0,131, 2, 2, 0, 69, 1, 2, 0,132, 2, 2, 0,133, 2, 82, 0, 7, 0, 4, 0,134, 2, 4, 0,135, 2,
- 4, 0,136, 2, 4, 0,137, 2, 2, 0, 33, 2, 0, 0,138, 2, 0, 0, 19, 0, 86, 0, 5, 0, 4, 0,134, 2, 4, 0,135, 2,
- 0, 0,139, 2, 0, 0,140, 2, 2, 0, 19, 0, 95, 0, 2, 0, 4, 0,141, 2, 7, 0, 25, 2, 87, 0, 3, 0, 95, 0,142, 2,
- 4, 0,143, 2, 4, 0, 19, 0, 85, 0, 6, 0, 7, 0,144, 2, 2, 0,145, 2, 2, 0, 33, 2, 0, 0, 19, 0, 0, 0,140, 2,
- 0, 0, 61, 2, 88, 0, 4, 0, 0, 0,233, 0, 0, 0,179, 0, 0, 0,180, 0, 0, 0,181, 0, 96, 0, 6, 0, 47, 0,128, 2,
- 0, 0, 19, 0, 0, 0,131, 2, 2, 0, 69, 1, 2, 0,132, 2, 2, 0,133, 2, 97, 0, 1, 0, 7, 0,146, 2, 98, 0, 5, 0,
- 0, 0,233, 0, 0, 0,179, 0, 0, 0,180, 0, 0, 0,181, 0, 4, 0, 37, 0, 89, 0, 1, 0, 7, 0,147, 2, 90, 0, 2, 0,
- 4, 0,148, 2, 4, 0, 17, 0, 83, 0, 7, 0, 7, 0,129, 2, 47, 0,128, 2, 0, 0, 19, 0, 0, 0,131, 2, 2, 0, 69, 1,
- 2, 0,132, 2, 2, 0,133, 2, 99, 0, 1, 0, 7, 0,149, 2,100, 0, 1, 0, 4, 0,150, 2,101, 0, 1, 0, 0, 0,151, 2,
-102, 0, 1, 0, 7, 0,129, 2,103, 0, 3, 0, 4, 0,152, 2, 0, 0, 92, 0, 7, 0,153, 2,104, 0, 4, 0, 7, 0,233, 0,
- 7, 0,179, 0, 7, 0,180, 0, 7, 0,181, 0,105, 0, 1, 0,104, 0,130, 2,106, 0, 5, 0, 4, 0,154, 2, 4, 0,155, 2,
- 0, 0, 19, 0, 0, 0, 33, 2, 0, 0, 61, 2,107, 0, 2, 0, 4, 0,156, 2, 4, 0,155, 2,108, 0, 10, 0,108, 0, 0, 0,
-108, 0, 1, 0,106, 0,157, 2,105, 0,158, 2,107, 0,159, 2, 4, 0, 53, 0, 4, 0,117, 2, 4, 0,116, 2, 4, 0, 37, 0,
- 85, 0,160, 2, 93, 0, 14, 0, 12, 0,161, 2, 85, 0,160, 2, 0, 0,162, 2, 0, 0,163, 2, 0, 0,164, 2, 0, 0,165, 2,
- 0, 0,166, 2, 0, 0,167, 2, 0, 0,168, 2, 0, 0, 19, 0, 92, 0,113, 2, 92, 0,115, 2, 2, 0,169, 2, 0, 0,170, 2,
- 94, 0, 8, 0, 4, 0,171, 2, 4, 0,172, 2, 82, 0,173, 2, 86, 0,174, 2, 4, 0,117, 2, 4, 0,116, 2, 4, 0, 53, 0,
- 4, 0, 37, 0,109, 0, 9, 0,109, 0, 0, 0,109, 0, 1, 0, 4, 0, 17, 0, 4, 0, 69, 1, 4, 0,175, 2, 4, 0, 37, 0,
- 0, 0, 20, 0, 46, 0,129, 0, 0, 0,176, 2,110, 0, 7, 0,109, 0,177, 2, 2, 0,178, 2, 2, 0,161, 2, 2, 0,179, 2,
- 2, 0, 90, 0, 9, 0,180, 2, 9, 0,181, 2,111, 0, 3, 0,109, 0,177, 2, 32, 0,161, 0, 0, 0, 20, 0,112, 0, 5, 0,
-109, 0,177, 2, 32, 0,161, 0, 0, 0, 20, 0, 2, 0,182, 2, 0, 0,183, 2,113, 0, 5, 0,109, 0,177, 2, 7, 0, 87, 0,
- 7, 0,184, 2, 4, 0,185, 2, 4, 0,186, 2,114, 0, 5, 0,109, 0,177, 2, 32, 0,187, 2, 0, 0, 71, 0, 4, 0, 69, 1,
- 4, 0, 19, 0,115, 0, 13, 0,109, 0,177, 2, 32, 0,188, 2, 32, 0,189, 2, 32, 0,190, 2, 32, 0,191, 2, 7, 0,192, 2,
- 7, 0,193, 2, 7, 0,184, 2, 7, 0,194, 2, 4, 0,195, 2, 4, 0,196, 2, 4, 0, 90, 0, 4, 0,197, 2,116, 0, 5, 0,
-109, 0,177, 2, 2, 0,198, 2, 2, 0, 19, 0, 7, 0,199, 2, 32, 0,200, 2,117, 0, 3, 0,109, 0,177, 2, 7, 0,201, 2,
- 4, 0, 90, 0,118, 0, 10, 0,109, 0,177, 2, 7, 0,202, 2, 4, 0,203, 2, 4, 0, 37, 0, 2, 0, 90, 0, 2, 0,204, 2,
- 2, 0,205, 2, 2, 0,206, 2, 7, 0,207, 2, 0, 0,208, 2,119, 0, 3, 0,109, 0,177, 2, 7, 0, 37, 0, 4, 0, 17, 0,
-120, 0, 6, 0,109, 0,177, 2,121, 0,209, 2,122, 0,210, 2,123, 0,211, 2, 7, 0,212, 2, 4, 0, 17, 0,124, 0, 11, 0,
-109, 0,177, 2, 52, 0,213, 2, 7, 0,214, 2, 4, 0,215, 2, 0, 0,208, 2, 7, 0,216, 2, 4, 0,217, 2, 32, 0,218, 2,
- 0, 0,219, 2, 4, 0,220, 2, 4, 0, 37, 0,125, 0, 12, 0,109, 0,177, 2, 32, 0,221, 2, 47, 0,222, 2, 4, 0, 90, 0,
- 4, 0,223, 2, 7, 0,224, 2, 7, 0,225, 2, 7, 0,226, 2, 7, 0,227, 2, 0, 0,219, 2, 4, 0,220, 2, 4, 0, 37, 0,
-126, 0, 3, 0,109, 0,177, 2, 7, 0,228, 2, 4, 0,229, 2,127, 0, 5, 0,109, 0,177, 2, 7, 0,230, 2, 0, 0,208, 2,
- 2, 0, 19, 0, 2, 0,231, 2,128, 0, 8, 0,109, 0,177, 2, 32, 0,161, 0, 7, 0,230, 2, 7, 0,248, 0, 7, 0,106, 0,
- 0, 0,208, 2, 2, 0, 19, 0, 2, 0, 17, 0,129, 0, 21, 0,109, 0,177, 2, 32, 0,232, 2, 0, 0,208, 2, 52, 0,213, 2,
- 32, 0,218, 2, 2, 0, 19, 0, 2, 0, 37, 0, 7, 0,233, 2, 7, 0,234, 2, 7, 0,235, 2, 7, 0, 66, 2, 7, 0,236, 2,
- 7, 0,237, 2, 7, 0,238, 2, 7, 0,239, 2, 4, 0,217, 2, 4, 0,220, 2, 0, 0,219, 2, 7, 0,240, 2, 7, 0,241, 2,
- 7, 0, 89, 0,130, 0, 7, 0,109, 0,177, 2, 2, 0,242, 2, 2, 0,243, 2, 4, 0, 69, 0, 32, 0,161, 0, 7, 0,244, 2,
- 0, 0,208, 2,131, 0, 10, 0,109, 0,177, 2, 32, 0,161, 0, 0, 0,245, 2, 7, 0,246, 2, 7, 0,247, 2, 7, 0,239, 2,
- 4, 0,248, 2, 4, 0,249, 2, 7, 0,250, 2, 0, 0, 20, 0,132, 0, 1, 0,109, 0,177, 2,133, 0, 7, 0,109, 0,177, 2,
- 46, 0,129, 0,134, 0,251, 2,135, 0,252, 2,136, 0,253, 2,137, 0,254, 2, 12, 0,255, 2,138, 0, 13, 0,109, 0,177, 2,
- 85, 0, 0, 3, 85, 0, 1, 3, 85, 0, 2, 3, 85, 0, 3, 3, 85, 0, 4, 3, 85, 0, 5, 3, 82, 0, 6, 3, 4, 0, 7, 3,
- 4, 0, 8, 3, 7, 0,212, 2, 7, 0, 37, 0,139, 0, 9, 3,140, 0, 7, 0,109, 0,177, 2, 85, 0, 0, 3, 85, 0, 10, 3,
-141, 0, 11, 3,142, 0, 9, 3, 4, 0, 12, 3, 4, 0, 7, 3,143, 0, 4, 0,109, 0,177, 2, 32, 0,161, 0, 4, 0, 13, 3,
- 4, 0, 37, 0,144, 0, 2, 0, 4, 0, 14, 3, 7, 0, 25, 2,145, 0, 2, 0, 4, 0,120, 0, 4, 0, 15, 3,146, 0, 24, 0,
-109, 0,177, 2, 32, 0,161, 0, 0, 0,208, 2, 2, 0, 16, 3, 2, 0, 19, 0, 2, 0, 69, 1, 2, 0, 37, 0,144, 0, 17, 3,
- 4, 0, 18, 3, 7, 0, 19, 3, 4, 0, 53, 0, 4, 0, 20, 3,145, 0, 21, 3,144, 0, 22, 3, 4, 0, 23, 3, 4, 0, 24, 3,
- 4, 0, 25, 3, 4, 0, 15, 3, 7, 0, 26, 3, 7, 0, 27, 3, 7, 0, 28, 3, 7, 0, 29, 3, 7, 0, 30, 3, 9, 0, 31, 3,
-147, 0, 8, 0,109, 0,177, 2,148, 0, 32, 3,141, 0, 11, 3, 4, 0, 33, 3, 4, 0, 34, 3, 4, 0, 35, 3, 2, 0, 19, 0,
- 2, 0, 56, 0,149, 0, 8, 0,109, 0,177, 2, 32, 0, 44, 0, 2, 0,252, 0, 2, 0, 19, 0, 2, 0,198, 2, 2, 0, 56, 0,
- 7, 0, 36, 3, 7, 0, 37, 3,150, 0, 5, 0,109, 0,177, 2, 4, 0, 38, 3, 2, 0, 19, 0, 2, 0, 39, 3, 7, 0, 40, 3,
-151, 0, 8, 0,109, 0,177, 2, 0, 0, 41, 3, 0, 0, 42, 3, 0, 0,167, 2, 0, 0, 43, 3, 0, 0, 44, 3, 0, 0, 90, 0,
- 0, 0, 61, 2,152, 0, 3, 0,109, 0,177, 2,153, 0, 45, 3,137, 0,254, 2,154, 0, 10, 0,109, 0,177, 2, 32, 0, 46, 3,
- 32, 0, 47, 3, 0, 0, 48, 3, 7, 0, 49, 3, 2, 0, 50, 3, 2, 0, 51, 3, 0, 0, 52, 3, 0, 0, 53, 3, 0, 0,183, 2,
-155, 0, 9, 0,109, 0,177, 2, 32, 0, 54, 3, 0, 0, 48, 3, 7, 0, 55, 3, 7, 0, 56, 3, 0, 0, 69, 1, 0, 0,198, 2,
- 0, 0, 57, 3, 0, 0, 37, 0,156, 0, 1, 0,109, 0,177, 2,157, 0, 8, 0,109, 0,177, 2, 0, 0,208, 2, 7, 0,120, 0,
- 7, 0, 58, 3, 7, 0, 59, 3, 7, 0, 60, 3, 7, 0, 61, 3, 4, 0, 19, 0,158, 0, 9, 0,109, 0,177, 2, 32, 0, 62, 3,
- 4, 0, 63, 3, 4, 0, 64, 3, 4, 0, 65, 3, 7, 0, 66, 3, 7, 0, 67, 3, 2, 0,198, 2, 2, 0, 19, 0,159, 0, 28, 0,
- 27, 0, 31, 0, 2, 0, 34, 2, 2, 0, 35, 2, 2, 0, 68, 3, 2, 0, 19, 0, 2, 0, 69, 3, 2, 0, 70, 3, 2, 0, 71, 3,
- 2, 0, 69, 0, 0, 0, 72, 3, 0, 0, 73, 3, 0, 0, 74, 3, 0, 0, 17, 0, 4, 0, 37, 0, 7, 0, 75, 3, 7, 0, 76, 3,
- 7, 0, 77, 3, 7, 0, 78, 3, 7, 0, 79, 3, 7, 0, 80, 3, 34, 0, 81, 3, 36, 0, 79, 0, 38, 0, 57, 2, 87, 0,107, 2,
- 0, 0, 71, 0, 7, 0, 82, 3, 7, 0, 83, 3,159, 0, 84, 3,160, 0, 3, 0,160, 0, 0, 0,160, 0, 1, 0, 0, 0, 20, 0,
- 70, 0, 3, 0, 7, 0, 85, 3, 4, 0, 19, 0, 4, 0, 37, 0, 32, 0,126, 0, 27, 0, 31, 0, 39, 0, 74, 0,161, 0, 86, 3,
- 2, 0, 17, 0, 2, 0, 87, 3, 4, 0, 88, 3, 4, 0, 89, 3, 4, 0, 90, 3, 0, 0, 91, 3, 32, 0, 38, 0, 32, 0, 92, 3,
- 32, 0, 93, 3, 32, 0, 94, 3, 32, 0, 95, 3, 36, 0, 79, 0, 78, 0, 56, 2, 70, 0,251, 1,162, 0, 96, 3,162, 0, 97, 3,
-163, 0, 98, 3, 9, 0, 2, 0,164, 0, 99, 3,165, 0,100, 3,166, 0,101, 3, 12, 0,102, 3, 12, 0,101, 2, 12, 0, 14, 2,
- 12, 0,103, 3, 12, 0,104, 3, 4, 0, 69, 1, 4, 0,105, 3, 65, 0, 16, 2, 0, 0,106, 3, 4, 0, 18, 2, 4, 0,107, 3,
- 7, 0, 64, 1, 7, 0,108, 3, 7, 0,109, 3, 7, 0,169, 0, 7, 0,110, 3, 7, 0, 65, 1, 7, 0,111, 3, 7, 0, 4, 2,
- 7, 0,112, 3, 7, 0,113, 3, 7, 0,114, 3, 7, 0,115, 3, 7, 0,116, 3, 7, 0,117, 3, 7, 0,246, 2, 7, 0,118, 3,
- 7, 0,237, 0, 4, 0,119, 3, 2, 0, 19, 0, 2, 0,120, 3, 2, 0,121, 3, 2, 0,122, 3, 2, 0,123, 3, 2, 0,124, 3,
- 2, 0,125, 3, 2, 0,126, 3, 2, 0,127, 3, 2, 0,128, 3, 2, 0,129, 3, 2, 0,130, 3, 4, 0,131, 3, 4, 0,132, 3,
- 4, 0,133, 3, 4, 0,134, 3, 7, 0,135, 3, 7, 0, 93, 2, 7, 0,136, 3, 7, 0,137, 3, 7, 0,138, 3, 7, 0,139, 3,
- 7, 0,140, 3, 7, 0,212, 0, 7, 0,141, 3, 7, 0,142, 3, 7, 0,143, 3, 7, 0,144, 3, 2, 0,145, 3, 0, 0,146, 3,
- 0, 0,147, 3, 0, 0,148, 3, 0, 0,149, 3, 7, 0,150, 3, 7, 0,151, 3, 12, 0,152, 3, 12, 0,153, 3, 12, 0,154, 3,
- 12, 0,155, 3, 7, 0,156, 3, 2, 0,148, 2, 2, 0,157, 3, 7, 0,130, 2, 4, 0,158, 3, 4, 0,159, 3,167, 0,160, 3,
- 2, 0,161, 3, 2, 0,244, 0, 7, 0,162, 3, 12, 0,163, 3, 12, 0,164, 3, 12, 0,165, 3, 12, 0,166, 3,168, 0, 61, 1,
-169, 0,167, 3, 66, 0,168, 3, 2, 0,169, 3, 2, 0,170, 3, 2, 0,171, 3, 2, 0,172, 3, 7, 0,122, 2, 2, 0,173, 3,
- 2, 0,174, 3,153, 0,175, 3,141, 0,176, 3,141, 0,177, 3, 4, 0,178, 3, 4, 0,179, 3, 4, 0,180, 3, 4, 0, 69, 0,
- 12, 0,181, 3, 12, 0,182, 3, 12, 0,183, 3,170, 0, 14, 0,170, 0, 0, 0,170, 0, 1, 0, 32, 0, 38, 0, 7, 0,246, 2,
- 7, 0, 66, 1, 7, 0,247, 2, 7, 0,239, 2, 0, 0, 20, 0, 4, 0,248, 2, 4, 0,249, 2, 4, 0,184, 3, 2, 0, 17, 0,
- 2, 0,185, 3, 7, 0,250, 2,171, 0, 12, 0,171, 0, 0, 0,171, 0, 1, 0, 32, 0, 44, 0, 4, 0,186, 3, 4, 0,148, 2,
- 4, 0,187, 3, 4, 0, 17, 0, 4, 0,188, 3, 7, 0, 66, 1, 7, 0,189, 3, 7, 0,190, 3, 7, 0,146, 2,168, 0, 40, 0,
- 4, 0, 19, 0, 2, 0,191, 3, 2, 0,192, 3, 2, 0,239, 2, 2, 0,193, 3, 2, 0,194, 3, 2, 0,195, 3, 2, 0,196, 3,
- 2, 0,197, 3, 7, 0,198, 3, 7, 0,199, 3, 7, 0,200, 3, 7, 0,201, 3, 7, 0,202, 3, 7, 0,203, 3, 7, 0,204, 3,
- 7, 0,205, 3, 7, 0,206, 3, 7, 0,207, 3, 7, 0,208, 3, 7, 0,209, 3, 7, 0,210, 3, 7, 0,211, 3, 7, 0,212, 3,
- 7, 0,213, 3, 7, 0,214, 3, 7, 0,215, 3, 7, 0,216, 3, 7, 0,217, 3, 7, 0,218, 3, 7, 0,219, 3, 7, 0,220, 3,
- 7, 0,221, 3, 7, 0,222, 3, 7, 0,223, 3, 7, 0,224, 3, 52, 0,162, 0,172, 0,225, 3, 7, 0,226, 3, 4, 0,186, 2,
-173, 0, 5, 0, 66, 0,229, 1, 7, 0,227, 3, 7, 0,228, 3, 2, 0, 19, 0, 2, 0,229, 3,174, 0, 9, 0,174, 0, 0, 0,
-174, 0, 1, 0, 4, 0,230, 3, 4, 0,231, 3, 4, 0,232, 3, 4, 0, 19, 0, 4, 0,233, 3, 9, 0,234, 3, 9, 0,235, 3,
-137, 0, 19, 0,137, 0, 0, 0,137, 0, 1, 0, 4, 0, 19, 0, 4, 0,236, 3, 4, 0,237, 3, 4, 0,238, 3, 4, 0,239, 3,
- 4, 0,240, 3, 4, 0,241, 3, 4, 0,231, 3, 4, 0,148, 2, 4, 0, 56, 0, 0, 0,242, 3, 0, 0,243, 3, 0, 0,244, 3,
- 0, 0,245, 3, 12, 0,246, 3,175, 0,247, 3, 9, 0,248, 3,176, 0, 1, 0, 7, 0, 32, 2,167, 0, 30, 0, 4, 0, 19, 0,
- 7, 0,249, 3, 7, 0,250, 3, 7, 0,251, 3, 4, 0,252, 3, 4, 0,253, 3, 4, 0,254, 3, 4, 0,255, 3, 7, 0, 0, 4,
- 7, 0, 1, 4, 7, 0, 2, 4, 7, 0, 3, 4, 7, 0, 4, 4, 7, 0, 5, 4, 7, 0, 6, 4, 7, 0, 7, 4, 7, 0, 8, 4,
- 7, 0, 9, 4, 7, 0, 10, 4, 7, 0, 11, 4, 7, 0, 12, 4, 7, 0, 13, 4, 7, 0, 14, 4, 7, 0, 15, 4, 7, 0, 16, 4,
- 7, 0, 17, 4, 4, 0, 18, 4, 4, 0, 19, 4, 7, 0, 20, 4, 7, 0,141, 3,169, 0, 54, 0, 4, 0,231, 3, 4, 0, 21, 4,
-177, 0, 22, 4,178, 0, 23, 4, 0, 0, 37, 0, 0, 0, 24, 4, 2, 0, 25, 4, 7, 0, 26, 4, 0, 0, 27, 4, 7, 0, 28, 4,
- 7, 0, 29, 4, 7, 0, 30, 4, 7, 0, 31, 4, 7, 0, 32, 4, 7, 0, 33, 4, 7, 0, 34, 4, 7, 0, 35, 4, 7, 0, 36, 4,
- 2, 0, 37, 4, 0, 0, 38, 4, 2, 0, 39, 4, 7, 0, 40, 4, 7, 0, 41, 4, 0, 0, 42, 4, 4, 0,121, 0, 4, 0, 43, 4,
- 4, 0, 44, 4, 2, 0, 45, 4, 2, 0, 46, 4,176, 0, 47, 4, 4, 0, 48, 4, 4, 0, 81, 0, 7, 0, 49, 4, 7, 0, 50, 4,
- 7, 0, 51, 4, 7, 0, 52, 4, 2, 0, 53, 4, 2, 0, 54, 4, 2, 0, 55, 4, 2, 0, 56, 4, 2, 0, 57, 4, 2, 0, 58, 4,
- 2, 0, 59, 4, 2, 0, 60, 4,179, 0, 61, 4, 7, 0, 62, 4, 7, 0, 63, 4,137, 0, 64, 4, 12, 0,255, 2,173, 0, 65, 4,
- 7, 0, 66, 4, 7, 0, 67, 4, 7, 0, 68, 4, 0, 0, 69, 4,153, 0, 51, 0,152, 0, 70, 4, 2, 0, 17, 0, 2, 0, 71, 4,
- 2, 0, 72, 4, 2, 0, 73, 4, 7, 0, 74, 4, 2, 0, 75, 4, 2, 0, 76, 4, 7, 0, 77, 4, 2, 0, 78, 4, 2, 0, 79, 4,
- 7, 0, 80, 4, 7, 0, 81, 4, 7, 0, 82, 4, 7, 0, 83, 4, 7, 0, 84, 4, 4, 0, 85, 4, 4, 0, 86, 4, 7, 0, 87, 4,
- 4, 0, 88, 4, 7, 0, 89, 4, 7, 0, 90, 4, 7, 0, 91, 4, 81, 0, 92, 4, 81, 0, 93, 4, 81, 0, 94, 4, 0, 0, 95, 4,
- 7, 0, 96, 4, 7, 0, 97, 4, 36, 0, 79, 0, 2, 0, 98, 4, 0, 0, 99, 4, 0, 0,100, 4, 7, 0,101, 4, 4, 0,102, 4,
- 7, 0,103, 4, 7, 0,104, 4, 4, 0,105, 4, 4, 0, 19, 0, 7, 0,106, 4, 7, 0,107, 4, 7, 0,108, 4, 85, 0,109, 4,
- 7, 0,110, 4, 7, 0,111, 4, 7, 0,112, 4, 7, 0,113, 4, 7, 0,114, 4, 7, 0,115, 4, 7, 0,116, 4, 4, 0,117, 4,
-180, 0, 76, 0, 27, 0, 31, 0, 39, 0, 74, 0, 2, 0,172, 0, 2, 0, 70, 1, 2, 0,104, 1, 2, 0,118, 4, 7, 0,119, 4,
- 7, 0,120, 4, 7, 0,121, 4, 7, 0,122, 4, 7, 0,123, 4, 7, 0,124, 4, 7, 0,150, 1, 7, 0,152, 1, 7, 0,151, 1,
- 7, 0, 69, 0, 4, 0,125, 4, 7, 0,126, 4, 7, 0,127, 4, 7, 0,128, 4, 7, 0,129, 4, 7, 0,130, 4, 7, 0,131, 4,
- 7, 0,132, 4, 2, 0,133, 4, 2, 0, 69, 1, 2, 0,134, 4, 2, 0,135, 4, 2, 0,136, 4, 2, 0,137, 4, 2, 0,138, 4,
- 2, 0,139, 4, 7, 0,140, 4, 7, 0,141, 4, 7, 0,142, 4, 7, 0,143, 4, 7, 0,144, 4, 7, 0,145, 4, 7, 0,146, 4,
- 7, 0,147, 4, 7, 0,148, 4, 7, 0,149, 4, 7, 0,150, 4, 7, 0,151, 4, 2, 0,152, 4, 2, 0,153, 4, 2, 0,154, 4,
- 2, 0,155, 4, 7, 0,156, 4, 7, 0,157, 4, 7, 0,158, 4, 7, 0,159, 4, 2, 0,160, 4, 2, 0,161, 4, 2, 0,162, 4,
- 2, 0,163, 4, 7, 0,164, 4, 7, 0,165, 4, 7, 0,166, 4, 7, 0,167, 4, 7, 0,168, 4, 7, 0,169, 4, 7, 0,170, 4,
- 2, 0,171, 4, 2, 0,172, 4, 2, 0,173, 4, 2, 0,174, 4, 2, 0,175, 4, 2, 0, 19, 0, 7, 0,176, 4, 7, 0,177, 4,
- 36, 0, 79, 0, 51, 0,122, 1, 2, 0,123, 1, 2, 0,178, 4, 30, 0,148, 0,181, 0, 8, 0,181, 0, 0, 0,181, 0, 1, 0,
- 4, 0,119, 3, 4, 0,179, 4, 4, 0, 19, 0, 2, 0,180, 4, 2, 0,181, 4, 32, 0,161, 0,182, 0, 13, 0, 9, 0,182, 4,
- 9, 0,183, 4, 4, 0,184, 4, 4, 0,185, 4, 4, 0,186, 4, 4, 0,187, 4, 4, 0,188, 4, 4, 0,189, 4, 4, 0,190, 4,
- 4, 0,191, 4, 4, 0,192, 4, 4, 0, 37, 0, 0, 0,193, 4,183, 0, 5, 0, 9, 0,194, 4, 9, 0,195, 4, 4, 0,196, 4,
- 4, 0, 69, 0, 0, 0,197, 4,184, 0, 17, 0, 4, 0,198, 4, 4, 0,199, 4, 4, 0,200, 4, 4, 0,201, 4, 4, 0,202, 4,
- 4, 0,203, 4, 4, 0,204, 4, 4, 0,205, 4, 4, 0,206, 4, 4, 0,207, 4, 4, 0,208, 4, 4, 0,209, 4, 2, 0,210, 4,
- 2, 0,211, 4, 4, 0,212, 4, 4, 0,213, 4, 4, 0, 89, 0,185, 0, 15, 0, 4, 0, 17, 0, 4, 0,200, 4, 4, 0,214, 4,
- 4, 0,215, 4, 4, 0,216, 4, 4, 0,217, 4, 7, 0,218, 4, 4, 0,219, 4, 4, 0, 90, 0, 4, 0,220, 4, 4, 0,221, 4,
- 4, 0,222, 4, 4, 0,223, 4, 4, 0,224, 4, 26, 0, 30, 0,186, 0, 7, 0, 4, 0,225, 4, 7, 0,226, 4, 7, 0,227, 4,
- 7, 0,228, 4, 4, 0,229, 4, 2, 0, 19, 0, 2, 0, 37, 0,187, 0, 11, 0,187, 0, 0, 0,187, 0, 1, 0, 0, 0, 20, 0,
- 65, 0,230, 4, 66, 0,231, 4, 4, 0,119, 3, 4, 0,232, 4, 4, 0,233, 4, 4, 0, 37, 0, 4, 0,234, 4, 4, 0,235, 4,
-188, 0,111, 0,182, 0,236, 4,183, 0,237, 4,184, 0,238, 4,185, 0,239, 4, 4, 0, 12, 3, 4, 0,121, 0, 4, 0, 43, 4,
- 7, 0,240, 4, 4, 0,241, 4, 4, 0,242, 4, 4, 0,243, 4, 4, 0,244, 4, 2, 0, 19, 0, 2, 0,245, 4, 7, 0,246, 4,
- 7, 0,247, 4, 7, 0,248, 4, 7, 0,249, 4, 7, 0,250, 4, 2, 0,251, 4, 2, 0,252, 4, 2, 0,253, 4, 2, 0,254, 4,
- 2, 0,243, 0, 2, 0,255, 4, 2, 0, 0, 5, 2, 0, 1, 5, 2, 0, 2, 5, 2, 0, 3, 5, 2, 0, 91, 1, 2, 0,106, 0,
- 2, 0, 4, 5, 2, 0, 5, 5, 2, 0, 6, 5, 2, 0, 7, 5, 2, 0, 8, 5, 2, 0, 9, 5, 2, 0, 10, 5, 2, 0, 11, 5,
- 2, 0, 12, 5, 2, 0, 92, 1, 2, 0, 13, 5, 2, 0, 14, 5, 2, 0, 15, 5, 2, 0, 16, 5, 4, 0, 17, 5, 4, 0, 69, 1,
- 4, 0, 18, 5, 2, 0, 19, 5, 2, 0, 20, 5, 2, 0, 21, 5, 2, 0,248, 1, 2, 0, 22, 5, 2, 0, 23, 5, 2, 0, 24, 5,
- 2, 0, 25, 5, 24, 0, 26, 5, 24, 0, 27, 5, 23, 0, 28, 5, 12, 0, 29, 5, 2, 0, 30, 5, 2, 0, 31, 5, 7, 0, 32, 5,
- 7, 0, 33, 5, 7, 0, 34, 5, 7, 0, 35, 5, 4, 0, 36, 5, 7, 0, 37, 5, 7, 0, 38, 5, 7, 0, 39, 5, 7, 0, 40, 5,
- 2, 0, 41, 5, 2, 0, 42, 5, 2, 0, 43, 5, 2, 0, 44, 5, 2, 0, 45, 5, 2, 0, 46, 5, 7, 0, 47, 5, 7, 0, 48, 5,
- 7, 0, 49, 5, 0, 0, 50, 5, 0, 0, 51, 5, 4, 0, 52, 5, 2, 0, 53, 5, 2, 0,226, 1, 0, 0, 54, 5, 7, 0, 55, 5,
- 7, 0, 56, 5, 0, 0, 57, 5, 0, 0, 58, 5, 0, 0, 59, 5, 0, 0, 60, 5, 4, 0, 61, 5, 2, 0, 62, 5, 2, 0, 63, 5,
- 7, 0, 64, 5, 7, 0, 65, 5, 2, 0, 66, 5, 2, 0, 67, 5, 7, 0, 68, 5, 2, 0, 69, 5, 2, 0, 70, 5, 4, 0, 71, 5,
- 2, 0, 72, 5, 2, 0, 73, 5, 2, 0, 74, 5, 2, 0, 75, 5, 7, 0, 76, 5, 7, 0, 69, 0, 42, 0, 77, 5, 0, 0, 78, 5,
-189, 0, 9, 0,189, 0, 0, 0,189, 0, 1, 0, 0, 0, 20, 0, 2, 0, 79, 5, 2, 0, 80, 5, 2, 0, 81, 5, 2, 0, 89, 0,
- 7, 0, 82, 5, 7, 0, 69, 0,190, 0, 7, 0, 2, 0,203, 2, 2, 0, 69, 1, 2, 0, 67, 3, 2, 0, 83, 5, 7, 0, 84, 5,
- 7, 0, 69, 0, 42, 0, 85, 5,191, 0, 5, 0, 7, 0, 86, 5, 0, 0, 17, 0, 0, 0, 89, 0, 0, 0, 69, 0, 0, 0,226, 1,
-192, 0, 28, 0, 7, 0,131, 4, 7, 0,132, 4, 2, 0, 69, 1, 2, 0, 19, 0, 2, 0, 87, 5, 2, 0,178, 4, 2, 0,134, 4,
- 2, 0,135, 4, 2, 0,136, 4, 2, 0,137, 4, 2, 0,138, 4, 2, 0,139, 4,191, 0, 88, 5, 2, 0,251, 4, 2, 0,252, 4,
- 2, 0,253, 4, 2, 0,254, 4, 2, 0,243, 0, 2, 0,255, 4, 2, 0, 89, 5, 2, 0, 0, 5,190, 0, 90, 5, 2, 0, 91, 5,
- 2, 0, 2, 5, 2, 0, 5, 5, 2, 0, 6, 5, 7, 0, 92, 5, 7, 0, 89, 0,193, 0, 6, 0,193, 0, 0, 0,193, 0, 1, 0,
- 4, 0,230, 3, 0, 0,242, 3, 4, 0, 19, 0, 32, 0, 93, 5,194, 0, 4, 0,195, 0, 94, 5, 9, 0, 95, 5, 0, 0, 96, 5,
- 4, 0, 90, 0,196, 0, 8, 0,194, 0, 97, 5, 2, 0, 19, 0, 2, 0, 37, 0, 2, 0, 98, 5, 2, 0, 99, 5, 2, 0,100, 5,
- 4, 0, 89, 0, 9, 0,101, 5,197, 0, 6, 0, 2, 0,106, 0, 2, 0,236, 3, 2, 0,102, 5, 2, 0,197, 2, 4, 0, 19, 0,
- 7, 0,214, 2,198, 0, 14, 0, 2, 0, 19, 0, 2, 0,103, 5, 2, 0,104, 5, 2, 0,105, 5,197, 0,106, 5, 9, 0,101, 5,
- 7, 0,107, 5, 7, 0, 56, 0, 4, 0,108, 5, 4, 0,109, 5, 4, 0,110, 5, 4, 0,111, 5, 46, 0,129, 0, 32, 0,161, 0,
-199, 0, 4, 0,199, 0, 0, 0,199, 0, 1, 0, 0, 0,112, 5, 7, 0,113, 5,200, 0, 14, 0,194, 0, 97, 5, 4, 0, 90, 0,
- 4, 0,114, 5, 7, 0,115, 5, 7, 0,116, 5, 7, 0,117, 5, 4, 0,118, 5, 4, 0,119, 5, 7, 0,120, 5, 7, 0,121, 5,
- 4, 0,122, 5, 7, 0,123, 5, 7, 0,124, 5, 4, 0, 37, 0,201, 0, 7, 0,194, 0, 97, 5, 2, 0, 19, 0, 2, 0, 37, 0,
- 4, 0, 36, 0, 4, 0,125, 5, 87, 0,126, 5, 9, 0,101, 5,202, 0, 80, 0,201, 0,127, 5,201, 0,128, 5,200, 0, 86, 3,
- 7, 0,129, 5, 2, 0,130, 5, 2, 0,131, 5, 7, 0,132, 5, 7, 0,133, 5, 2, 0,236, 3, 2, 0,134, 5, 7, 0,135, 5,
- 7, 0,136, 5, 7, 0,137, 5, 2, 0,138, 5, 2, 0,108, 5, 2, 0,139, 5, 2, 0,140, 5, 2, 0,141, 5, 2, 0,142, 5,
- 7, 0,143, 5, 7, 0,144, 5, 7, 0,145, 5, 2, 0,146, 5, 2, 0,147, 5, 2, 0,148, 5, 2, 0,149, 5, 2, 0,150, 5,
- 2, 0,151, 5, 2, 0,152, 5,196, 0,153, 5,198, 0,154, 5, 7, 0,155, 5, 7, 0,156, 5, 7, 0,157, 5, 2, 0,158, 5,
- 2, 0,159, 5, 0, 0,160, 5, 0, 0,161, 5, 0, 0,162, 5, 0, 0,163, 5, 0, 0,164, 5, 0, 0,165, 5, 2, 0,166, 5,
- 7, 0,167, 5, 7, 0,168, 5, 7, 0,169, 5, 7, 0,170, 5, 7, 0,171, 5, 7, 0,172, 5, 7, 0,173, 5, 7, 0,174, 5,
- 7, 0,175, 5, 7, 0,176, 5, 2, 0,177, 5, 0, 0,178, 5, 0, 0,179, 5, 0, 0,180, 5, 0, 0,181, 5, 32, 0,182, 5,
- 0, 0,183, 5, 0, 0,184, 5, 0, 0,185, 5, 0, 0,186, 5, 0, 0,187, 5, 0, 0,188, 5, 0, 0,189, 5, 0, 0,190, 5,
- 2, 0,191, 5, 2, 0,192, 5, 2, 0,193, 5, 2, 0,194, 5, 2, 0,195, 5, 0, 0,196, 5, 0, 0,178, 4, 4, 0,197, 5,
- 2, 0,198, 5, 2, 0, 89, 0, 4, 0,199, 5, 7, 0,200, 5, 7, 0,201, 5,203, 0, 8, 0, 4, 0,202, 5, 4, 0,203, 5,
- 4, 0,204, 5, 4, 0,205, 5, 4, 0,206, 5, 4, 0,207, 5, 4, 0, 53, 0, 4, 0,117, 2,204, 0, 3, 0, 7, 0,208, 5,
- 2, 0,209, 5, 2, 0, 19, 0,205, 0, 4, 0, 7, 0,210, 5, 4, 0, 19, 0, 4, 0,211, 5, 4, 0, 56, 0, 46, 0, 42, 0,
- 27, 0, 31, 0, 39, 0, 74, 0, 32, 0, 93, 5,180, 0,212, 5, 46, 0,213, 5, 47, 0,235, 0, 12, 0,214, 5,181, 0,215, 5,
- 32, 0,216, 5, 7, 0,217, 5, 7, 0,218, 5, 7, 0,219, 5, 7, 0,220, 5, 4, 0,119, 3, 4, 0,221, 5, 4, 0, 89, 0,
- 2, 0, 19, 0, 2, 0, 63, 1, 60, 0, 58, 1,206, 0,222, 5,202, 0,223, 5,207, 0,224, 5,188, 0,179, 0,186, 0,225, 5,
- 12, 0,100, 0, 12, 0,226, 5, 9, 0,227, 5, 9, 0,228, 5, 9, 0,229, 5,208, 0,230, 5, 2, 0,231, 5, 2, 0,232, 5,
- 2, 0,244, 0, 2, 0,233, 5, 4, 0,234, 5, 4, 0,235, 5, 12, 0,236, 5,191, 0, 88, 5,192, 0,237, 5,204, 0,238, 5,
-164, 0, 99, 3,205, 0,239, 5,209, 0, 11, 0,209, 0, 0, 0,209, 0, 1, 0, 47, 0,235, 0, 45, 0, 57, 1, 7, 0, 81, 2,
- 7, 0, 82, 2, 7, 0,106, 0, 7, 0,240, 5, 2, 0,241, 5, 2, 0, 19, 0, 7, 0, 69, 0,210, 0, 39, 0, 7, 0,242, 5,
- 7, 0,243, 5, 7, 0,244, 5, 7, 0,245, 5, 7, 0,246, 5, 7, 0,247, 5, 7, 0,248, 5, 7, 0,249, 5, 7, 0,250, 5,
- 7, 0, 76, 1, 7, 0,251, 5, 7, 0,252, 5, 7, 0,253, 5, 7, 0,254, 5, 7, 0,168, 0, 2, 0,255, 5, 2, 0, 0, 6,
- 2, 0, 1, 6, 2, 0, 37, 0, 2, 0, 2, 6, 2, 0, 3, 6, 2, 0, 4, 6, 2, 0,241, 5, 7, 0, 5, 6, 7, 0, 6, 6,
- 70, 0, 7, 6,164, 0, 99, 3,210, 0, 8, 6,211, 0, 9, 6,212, 0, 10, 6,213, 0, 11, 6,214, 0, 12, 6,215, 0, 13, 6,
- 7, 0, 14, 6, 2, 0, 15, 6, 2, 0, 16, 6, 7, 0, 17, 6, 7, 0, 18, 6, 7, 0, 19, 6,216, 0, 55, 0,217, 0, 0, 0,
-217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6, 7, 0,250, 5, 7, 0, 76, 1, 7, 0, 89, 0,
- 4, 0, 24, 6, 2, 0, 4, 6, 2, 0,241, 5, 32, 0, 93, 5, 32, 0, 25, 6, 12, 0, 26, 6,209, 0, 27, 6,216, 0, 8, 6,
- 0, 0, 28, 6, 4, 0,119, 3, 4, 0,221, 5, 2, 0, 29, 6, 2, 0, 69, 0, 2, 0, 30, 6, 2, 0, 31, 6, 2, 0,226, 1,
- 2, 0, 19, 0, 2, 0, 17, 2, 2, 0, 32, 6, 7, 0,111, 0, 7, 0, 33, 6, 7, 0, 17, 6, 7, 0, 19, 6, 7, 0, 34, 6,
- 7, 0, 35, 6, 7, 0,168, 0, 7, 0,217, 5, 2, 0, 36, 6, 2, 0,248, 1, 2, 0, 37, 6, 2, 0, 38, 6, 2, 0, 39, 6,
- 2, 0, 40, 6, 2, 0, 41, 6, 2, 0, 42, 6, 2, 0, 43, 6, 2, 0, 1, 6, 4, 0, 44, 6, 12, 0, 45, 6, 2, 0, 46, 6,
- 2, 0,131, 2, 2, 0, 47, 6, 0, 0, 48, 6, 0, 0, 49, 6, 9, 0, 50, 6,164, 0, 99, 3,218, 0, 24, 0, 24, 0, 36, 0,
- 24, 0, 63, 0, 23, 0, 51, 6, 23, 0, 52, 6, 23, 0, 53, 6, 7, 0, 54, 6, 7, 0, 55, 6, 7, 0, 56, 6, 7, 0, 57, 6,
- 2, 0, 58, 6, 2, 0, 59, 6, 2, 0, 60, 6, 2, 0, 61, 6, 2, 0, 62, 6, 2, 0, 19, 0, 2, 0, 63, 6, 2, 0, 64, 6,
- 2, 0, 65, 6, 2, 0, 66, 6, 2, 0, 67, 6, 2, 0, 31, 6, 7, 0, 68, 6, 4, 0, 69, 6, 4, 0, 70, 6,217, 0, 6, 0,
-217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,219, 0, 8, 0,217, 0, 0, 0,
-217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,220, 0, 71, 6, 46, 0,129, 0,221, 0, 14, 0,
-217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,218, 0, 72, 6,222, 0, 73, 6,
- 12, 0, 74, 6, 2, 0, 69, 1, 2, 0, 75, 6, 4, 0, 19, 0, 7, 0, 76, 6, 4, 0, 31, 6,223, 0, 20, 0,217, 0, 0, 0,
-217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,211, 0, 9, 6,218, 0, 72, 6, 2, 0, 77, 6,
- 2, 0, 78, 6, 2, 0, 79, 6, 2, 0, 80, 6, 2, 0, 63, 6, 2, 0, 81, 6, 0, 0, 19, 0, 0, 0,178, 4, 9, 0, 56, 2,
- 4, 0, 82, 6, 4, 0, 83, 6, 27, 0, 84, 6,224, 0, 18, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6,
- 7, 0, 22, 6, 2, 0, 23, 6,218, 0, 72, 6, 7, 0, 81, 2, 7, 0, 82, 2, 2, 0, 77, 6, 2, 0, 85, 6, 2, 0, 86, 6,
- 2, 0, 87, 6, 4, 0, 19, 0, 7, 0, 88, 6, 4, 0,241, 5, 4, 0, 37, 0,164, 0, 99, 3,225, 0, 15, 0, 0, 0, 89, 6,
- 0, 0, 90, 6, 0, 0, 91, 6, 0, 0, 92, 6, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 93, 6, 2, 0, 94, 6, 2, 0,169, 1,
- 2, 0, 95, 6, 4, 0, 96, 6, 4, 0, 97, 6, 2, 0, 98, 6, 2, 0, 37, 0, 0, 0, 99, 6,226, 0, 16, 0,217, 0, 0, 0,
-217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 4, 0,100, 6,225, 0,101, 6,227, 0,102, 6, 12, 0,103, 6, 12, 0,104, 6,
-228, 0,105, 6,215, 0,106, 6,229, 0,107, 6, 2, 0,108, 6, 2, 0,109, 6, 2, 0,110, 6, 2, 0, 69, 0,230, 0, 17, 0,
-217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,218, 0, 72, 6, 12, 0,111, 6,
-231, 0,112, 6, 0, 0,113, 6,232, 0,114, 6, 4, 0,115, 6, 4, 0,116, 6, 2, 0, 19, 0, 2, 0,117, 6, 2, 0,118, 6,
- 2, 0, 37, 0,233, 0, 32, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,
- 47, 0,222, 2, 45, 0, 57, 1, 63, 0,119, 6, 2, 0,128, 0, 2, 0,120, 6, 2, 0, 69, 0, 2, 0,121, 6, 4, 0, 19, 0,
- 2, 0,122, 6, 2, 0,123, 6, 2, 0,124, 6, 2, 0,226, 1, 0, 0,125, 6, 0, 0,126, 6, 0, 0,127, 6, 0, 0, 31, 6,
- 7, 0,128, 6, 7, 0, 81, 2, 7, 0, 82, 2, 7, 0, 88, 6, 7, 0,248, 1, 7, 0,129, 6, 7, 0,130, 6,164, 0, 99, 3,
-234, 0,131, 6,235, 0,132, 6,236, 0, 11, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6,
- 2, 0, 23, 6, 2, 0, 75, 6, 2, 0, 19, 0, 4, 0, 37, 0,222, 0, 73, 6,218, 0, 72, 6,237, 0, 27, 0,217, 0, 0, 0,
-217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6, 42, 0,133, 6, 4, 0,134, 6, 4, 0,135, 6,
- 2, 0, 90, 0, 2, 0,128, 0, 2, 0,136, 6, 0, 0,137, 6, 0, 0,138, 6, 4, 0,139, 6, 4, 0,140, 6, 4, 0,141, 6,
- 4, 0,142, 6, 2, 0,143, 6, 2, 0,144, 6, 7, 0,145, 6, 23, 0,146, 6, 23, 0,147, 6, 4, 0,148, 6, 4, 0,149, 6,
- 0, 0,150, 6, 0, 0,151, 6,238, 0, 10, 0, 27, 0, 31, 0, 9, 0,152, 6, 9, 0,153, 6, 9, 0,154, 6, 9, 0,155, 6,
- 9, 0,156, 6, 4, 0, 90, 0, 4, 0,157, 6, 0, 0,158, 6, 0, 0,159, 6,239, 0, 10, 0,217, 0, 0, 0,217, 0, 1, 0,
- 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6,238, 0,160, 6, 2, 0, 90, 0, 2, 0,128, 0, 4, 0, 89, 0, 9, 0,161, 6,
-240, 0, 9, 0,240, 0, 0, 0,240, 0, 1, 0, 4, 0, 17, 0, 4, 0, 19, 0, 7, 0,162, 6, 4, 0, 23, 0, 4, 0,238, 3,
- 4, 0,239, 3, 4, 0,124, 0,241, 0, 11, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6,
-218, 0, 72, 6, 12, 0,163, 6, 4, 0,164, 6, 4, 0, 37, 0, 4, 0, 19, 0, 4, 0,165, 6,242, 0, 25, 0,217, 0, 0, 0,
-217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,218, 0, 72, 6, 27, 0,166, 6, 27, 0, 80, 0,
- 2, 0, 19, 0, 2, 0,128, 0, 7, 0,167, 6, 9, 0,168, 6, 7, 0, 81, 2, 7, 0, 82, 2, 7, 0, 88, 6, 7, 0, 19, 6,
- 7, 0,169, 6, 7, 0,170, 6, 60, 0, 58, 1, 60, 0,171, 6, 4, 0,172, 6, 2, 0,173, 6, 2, 0, 37, 0,164, 0, 99, 3,
-243, 0, 10, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6, 2, 0, 19, 0,
- 2, 0,128, 3, 4, 0, 37, 0,164, 0, 99, 3,244, 0, 42, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6,
- 7, 0, 22, 6, 2, 0, 23, 6,218, 0, 72, 6,227, 0,102, 6, 0, 0, 89, 6, 0, 0, 90, 6, 0, 0, 91, 6, 2, 0, 17, 0,
- 2, 0,174, 6, 2, 0, 19, 0, 2, 0, 93, 6, 9, 0,168, 6, 4, 0, 96, 6, 4, 0,175, 6, 4, 0,176, 6, 4, 0, 97, 6,
- 23, 0,177, 6, 23, 0,178, 6, 7, 0,179, 6, 7, 0,180, 6, 7, 0,181, 6, 7, 0,167, 6, 2, 0,182, 6, 2, 0,234, 0,
- 2, 0,169, 1, 2, 0, 95, 6, 2, 0, 37, 0, 2, 0, 89, 0, 2, 0,183, 6, 2, 0,184, 6, 9, 0,185, 6, 9, 0,186, 6,
- 9, 0,187, 6, 9, 0,188, 6, 9, 0,189, 6, 2, 0,190, 6, 0, 0,191, 6, 57, 0,192, 6,245, 0, 7, 0,245, 0, 0, 0,
-245, 0, 1, 0, 4, 0,193, 6, 4, 0, 23, 0, 0, 0, 83, 0, 4, 0,194, 6, 4, 0, 17, 0,246, 0, 16, 0,217, 0, 0, 0,
-217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6, 4, 0, 17, 0, 4, 0,195, 6, 4, 0, 19, 0,
- 4, 0,136, 6, 12, 0,196, 6, 12, 0,197, 6, 0, 0,198, 6, 0, 0,199, 6, 4, 0,200, 6, 4, 0,201, 6,247, 0, 6, 0,
-217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 4, 0, 37, 0, 0, 0,202, 6,248, 0, 15, 0,217, 0, 0, 0,
-217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6,249, 0,203, 6,218, 0, 72, 6,250, 0,204, 6, 2, 0, 69, 1,
- 2, 0,205, 6, 2, 0, 81, 2, 2, 0, 82, 2, 2, 0, 19, 0, 2, 0,123, 6, 4, 0, 69, 0,251, 0, 7, 0,251, 0, 0, 0,
-251, 0, 1, 0, 0, 0,206, 6, 2, 0,207, 6, 2, 0,208, 6, 2, 0,209, 6, 2, 0, 37, 0,252, 0, 12, 0, 2, 0,208, 6,
- 2, 0,210, 6, 2, 0,211, 6, 0, 0,183, 2, 2, 0,212, 6, 2, 0,213, 6, 2, 0,214, 6, 2, 0,215, 6, 2, 0,216, 6,
- 2, 0, 63, 6, 7, 0,217, 6, 7, 0,218, 6,253, 0, 18, 0,253, 0, 0, 0,253, 0, 1, 0, 0, 0,242, 3,252, 0,219, 6,
-252, 0,220, 6,252, 0,221, 6,252, 0,222, 6, 7, 0,223, 6, 2, 0,224, 6, 2, 0,225, 6, 2, 0,226, 6, 2, 0,227, 6,
- 2, 0,228, 6, 2, 0,229, 6, 2, 0,230, 6, 2, 0,231, 6, 2, 0,232, 6, 2, 0,233, 6,254, 0, 10, 0, 0, 0,234, 6,
- 0, 0,235, 6, 0, 0,236, 6, 0, 0,237, 6, 0, 0,238, 6, 0, 0,239, 6, 2, 0,240, 6, 2, 0,241, 6, 2, 0,242, 6,
- 2, 0,243, 6,255, 0, 8, 0, 0, 0,244, 6, 0, 0,245, 6, 0, 0,246, 6, 0, 0,247, 6, 0, 0,248, 6, 0, 0,249, 6,
- 7, 0,240, 5, 7, 0, 37, 0, 0, 1, 18, 0,254, 0,250, 6,254, 0,251, 6,254, 0,252, 6,254, 0,253, 6,254, 0,254, 6,
-254, 0,255, 6,254, 0, 0, 7,254, 0, 1, 7,254, 0, 2, 7,254, 0, 3, 7,254, 0, 4, 7,254, 0, 5, 7,254, 0, 6, 7,
-254, 0, 7, 7,254, 0, 8, 7,254, 0, 9, 7,255, 0, 10, 7, 0, 0, 11, 7, 1, 1, 92, 0, 0, 0, 12, 7, 0, 0, 13, 7,
- 0, 0,238, 6, 0, 0, 14, 7, 0, 0, 15, 7, 0, 0, 16, 7, 0, 0, 17, 7, 0, 0, 18, 7, 0, 0, 19, 7, 0, 0, 20, 7,
- 0, 0, 21, 7, 0, 0, 22, 7, 0, 0, 23, 7, 0, 0, 24, 7, 0, 0, 25, 7, 0, 0, 26, 7, 0, 0, 27, 7, 0, 0, 28, 7,
- 0, 0, 29, 7, 0, 0, 30, 7, 0, 0, 31, 7, 0, 0, 32, 7, 0, 0, 33, 7, 0, 0, 34, 7, 0, 0, 35, 7, 0, 0, 36, 7,
- 0, 0, 37, 7, 0, 0, 38, 7, 0, 0, 39, 7, 0, 0, 40, 7, 0, 0, 41, 7, 0, 0, 42, 7, 0, 0, 43, 7, 0, 0, 44, 7,
- 0, 0, 45, 7, 0, 0, 46, 7, 0, 0, 47, 7, 0, 0, 48, 7, 0, 0, 49, 7, 0, 0, 50, 7, 0, 0, 51, 7, 0, 0, 52, 7,
- 0, 0, 53, 7, 0, 0, 54, 7, 0, 0, 55, 7, 0, 0, 56, 7, 0, 0, 57, 7, 0, 0, 58, 7, 0, 0, 59, 7, 0, 0, 60, 7,
- 0, 0, 61, 7, 0, 0, 62, 7, 0, 0, 63, 7, 0, 0, 64, 7, 0, 0, 65, 7, 0, 0, 66, 7, 0, 0, 67, 7, 0, 0, 68, 7,
- 0, 0, 69, 7, 0, 0, 70, 7, 0, 0, 71, 7, 0, 0, 72, 7, 0, 0, 73, 7, 0, 0, 74, 7, 0, 0, 75, 7, 0, 0, 76, 7,
- 0, 0, 77, 7, 0, 0, 78, 7, 0, 0, 79, 7, 0, 0, 80, 7, 0, 0, 81, 7, 0, 0, 82, 7, 0, 0, 83, 7, 0, 0, 84, 7,
- 0, 0, 85, 7, 0, 0, 86, 7, 0, 0, 87, 7, 0, 0, 88, 7, 0, 0, 89, 7, 0, 0, 90, 7, 0, 0, 91, 7, 0, 0, 92, 7,
- 0, 0, 93, 7, 0, 0, 94, 7, 0, 0, 95, 7, 0, 0, 96, 7, 0, 0, 97, 7, 0, 0, 98, 7, 0, 0, 99, 7, 0, 0,100, 7,
- 0, 0,101, 7, 0, 0,102, 7, 2, 1, 5, 0, 0, 0,103, 7, 0, 0, 36, 7, 0, 0, 38, 7, 2, 0, 19, 0, 2, 0, 37, 0,
- 3, 1, 25, 0, 3, 1, 0, 0, 3, 1, 1, 0, 0, 0, 20, 0, 0, 1,104, 7, 1, 1,105, 7, 1, 1,106, 7, 1, 1,107, 7,
- 1, 1,108, 7, 1, 1,109, 7, 1, 1,110, 7, 1, 1,111, 7, 1, 1,112, 7, 1, 1,113, 7, 1, 1,114, 7, 1, 1,115, 7,
- 1, 1,116, 7, 1, 1,117, 7, 1, 1,118, 7, 1, 1,119, 7, 1, 1,120, 7, 1, 1,121, 7, 1, 1,122, 7, 2, 1,123, 7,
- 4, 0,124, 7, 4, 0, 37, 0, 4, 1, 3, 0, 4, 1, 0, 0, 4, 1, 1, 0, 0, 0,125, 7, 5, 1, 5, 0, 4, 0, 19, 0,
- 4, 0, 37, 0, 7, 0,130, 2, 7, 0,126, 7, 7, 0, 32, 2, 6, 1, 86, 0, 4, 0, 19, 0, 4, 0,127, 7, 4, 0,128, 7,
- 0, 0,129, 7, 0, 0,130, 7, 0, 0,131, 7, 0, 0,132, 7, 0, 0,133, 7, 0, 0,134, 7, 0, 0,135, 7, 0, 0,136, 7,
- 0, 0,137, 7, 0, 0,138, 7, 4, 0,139, 7, 2, 0,140, 7, 2, 0,141, 7, 2, 0,142, 7, 2, 0,143, 7, 4, 0,144, 7,
- 4, 0,145, 7, 4, 0,146, 7, 4, 0,147, 7, 2, 0,148, 7, 2, 0,149, 7, 4, 0,150, 7, 4, 0,151, 7, 4, 0,152, 7,
- 4, 0,153, 7, 4, 0,154, 7, 4, 0,196, 6, 4, 0,155, 7, 2, 0,156, 7, 2, 0,157, 7, 2, 0,158, 7, 2, 0,159, 7,
- 12, 0,160, 7, 12, 0,161, 7, 12, 0,162, 7, 12, 0,163, 7, 12, 0,164, 7, 0, 0,165, 7, 2, 0,166, 7, 2, 0,167, 7,
- 2, 0,168, 7, 2, 0,169, 7, 2, 0,170, 7, 2, 0,171, 7, 2, 0,172, 7, 2, 0,173, 7, 5, 1,174, 7, 2, 0,175, 7,
- 2, 0,176, 7, 2, 0,177, 7, 2, 0,178, 7, 2, 0,179, 7, 2, 0,180, 7, 2, 0,181, 7, 2, 0, 69, 0, 4, 0,182, 7,
- 4, 0,183, 7, 2, 0,184, 7, 2, 0,185, 7, 2, 0,186, 7, 2, 0,187, 7, 2, 0,188, 7, 2, 0,189, 7, 2, 0,190, 7,
- 2, 0,191, 7, 2, 0,192, 7, 2, 0,193, 7, 2, 0,194, 7, 2, 0,195, 7, 2, 0,196, 7, 2, 0,197, 7, 2, 0,198, 7,
- 2, 0,199, 7, 2, 0,200, 7, 2, 0,178, 4, 0, 0,201, 7, 0, 0,202, 7, 7, 0,203, 7, 2, 0,158, 5, 2, 0,159, 5,
- 55, 0,204, 7, 7, 0,205, 7, 4, 0,226, 1,220, 0, 21, 0, 27, 0, 31, 0, 12, 0,206, 7, 12, 0,207, 7, 12, 0,208, 7,
- 12, 0, 20, 6, 46, 0,129, 0, 46, 0,209, 7, 2, 0,210, 7, 2, 0,211, 7, 2, 0,212, 7, 2, 0,213, 7, 2, 0,214, 7,
- 2, 0,215, 7, 2, 0,216, 7, 2, 0,217, 7, 2, 0,218, 7, 2, 0,219, 7, 4, 0, 69, 0,215, 0,220, 7, 9, 0,221, 7,
- 2, 0,222, 7, 7, 1, 5, 0, 7, 1, 0, 0, 7, 1, 1, 0, 7, 1,223, 7, 13, 0,224, 7, 4, 0, 19, 0, 8, 1, 7, 0,
- 8, 1, 0, 0, 8, 1, 1, 0, 7, 1,225, 7, 7, 1,226, 7, 2, 0, 27, 5, 2, 0, 19, 0, 4, 0, 37, 0, 9, 1, 25, 0,
- 9, 1, 0, 0, 9, 1, 1, 0, 10, 1,227, 7, 11, 1,107, 6, 0, 0,228, 7, 0, 0,229, 7, 0, 0,230, 7, 2, 0,231, 7,
- 2, 0,232, 7, 2, 0,233, 7, 2, 0,234, 7, 2, 0,235, 7, 2, 0, 37, 0, 2, 0, 19, 0, 2, 0,236, 7, 2, 0,237, 7,
- 2, 0,238, 7, 4, 0,239, 7, 9, 1,240, 7, 9, 0,241, 7, 4, 0,242, 7, 4, 0,243, 7, 4, 0,244, 7, 4, 0,245, 7,
- 0, 0,246, 7,249, 0, 22, 0,249, 0, 0, 0,249, 0, 1, 0, 7, 1,225, 7, 7, 1,226, 7, 7, 1,247, 7, 7, 1,248, 7,
-220, 0,249, 7, 23, 0, 51, 0, 0, 0, 21, 6, 0, 0,250, 7, 2, 0, 64, 6, 2, 0, 65, 6, 2, 0,251, 7, 2, 0, 37, 0,
- 2, 0,213, 7, 2, 0,194, 6, 2, 0, 19, 0, 12, 1,227, 7, 12, 0,252, 7, 12, 0, 20, 6, 12, 0,253, 7, 12, 0,254, 7,
- 13, 1, 24, 0, 13, 1, 0, 0, 13, 1, 1, 0,218, 0, 72, 6, 23, 0,255, 7, 23, 0, 0, 8, 2, 0, 64, 6, 2, 0, 65, 6,
- 2, 0, 1, 8, 2, 0, 2, 8, 2, 0, 3, 8, 2, 0, 19, 0, 7, 0, 77, 2, 2, 0,233, 7, 2, 0,234, 7, 2, 0,212, 7,
- 2, 0, 4, 8, 2, 0,217, 7, 2, 0,178, 4, 14, 1,227, 7, 12, 0, 5, 8, 12, 0, 6, 8, 12, 0,253, 7, 0, 0, 7, 8,
- 9, 0, 8, 8, 15, 1, 12, 0, 0, 0, 9, 8, 2, 0, 10, 8, 2, 0, 11, 8, 2, 0, 12, 8, 2, 0, 13, 8, 2, 0, 14, 5,
- 2, 0, 9, 5,220, 0, 14, 8, 46, 0, 15, 8, 4, 0, 16, 8, 4, 0, 17, 8, 0, 0, 18, 8, 16, 1, 1, 0, 0, 0, 19, 8,
- 17, 1, 8, 0, 57, 0, 20, 8, 57, 0, 21, 8, 17, 1, 22, 8, 17, 1, 23, 8, 17, 1, 24, 8, 2, 0,124, 0, 2, 0, 19, 0,
- 4, 0, 25, 8, 18, 1, 4, 0, 4, 0,134, 6, 4, 0, 26, 8, 4, 0,139, 6, 4, 0, 27, 8, 19, 1, 2, 0, 4, 0, 28, 8,
- 4, 0, 29, 8, 20, 1, 5, 0, 7, 0, 30, 8, 7, 0, 31, 8, 7, 0, 32, 8, 4, 0, 19, 0, 4, 0, 37, 0, 21, 1, 6, 0,
- 0, 0, 33, 8, 0, 0, 91, 6, 49, 0,132, 0, 2, 0,106, 0, 2, 0, 13, 5, 4, 0, 37, 0, 22, 1, 21, 0, 22, 1, 0, 0,
- 22, 1, 1, 0, 4, 0, 56, 0, 4, 0, 23, 0, 4, 0, 28, 0, 4, 0, 34, 8, 4, 0, 35, 8, 4, 0, 36, 8, 16, 1, 37, 8,
- 0, 0, 33, 8, 4, 0, 38, 8, 4, 0, 39, 8, 21, 1, 93, 3, 18, 1, 40, 8, 19, 1, 41, 8, 20, 1, 42, 8, 17, 1, 43, 8,
- 17, 1, 44, 8, 17, 1, 45, 8, 57, 0, 46, 8, 57, 0, 47, 8, 23, 1, 12, 0, 0, 0,250, 1, 9, 0,220, 0, 0, 0,221, 0,
- 4, 0,224, 0, 4, 0,232, 0, 9, 0,225, 0, 7, 0,227, 0, 7, 0,228, 0, 9, 0, 48, 8, 9, 0, 49, 8, 9, 0,229, 0,
- 9, 0,231, 0, 24, 1, 48, 0, 24, 1, 0, 0, 24, 1, 1, 0, 9, 0, 50, 8, 9, 0, 26, 0, 0, 0, 27, 0, 4, 0, 19, 0,
- 4, 0, 17, 0, 4, 0, 23, 0, 4, 0, 87, 0, 4, 0, 51, 8, 4, 0, 52, 8, 4, 0, 35, 8, 4, 0, 36, 8, 4, 0, 53, 8,
- 4, 0,243, 0, 4, 0, 54, 8, 4, 0, 55, 8, 7, 0, 56, 8, 7, 0, 37, 0, 7, 0, 57, 8, 7, 0, 58, 8, 4, 0,121, 0,
- 4, 0, 59, 8, 22, 1, 60, 8, 36, 0, 79, 0, 46, 0,129, 0, 32, 0, 61, 8, 49, 0,132, 0, 7, 0, 62, 8, 7, 0, 63, 8,
- 23, 1, 59, 1, 24, 1, 64, 8, 24, 1, 65, 8, 24, 1, 66, 8, 12, 0, 67, 8,250, 0,204, 6, 9, 0, 68, 8, 7, 0,251, 3,
- 7, 0, 69, 8, 7, 0, 70, 8, 4, 0, 71, 8, 4, 0, 72, 8, 7, 0, 73, 8, 9, 0, 74, 8, 4, 0, 75, 8, 4, 0, 76, 8,
- 4, 0, 77, 8, 7, 0, 78, 8, 25, 1, 4, 0, 25, 1, 0, 0, 25, 1, 1, 0, 12, 0, 79, 8, 24, 1, 80, 8,206, 0, 11, 0,
- 12, 0, 81, 8, 12, 0, 67, 8, 12, 0, 82, 8, 24, 1, 83, 8, 0, 0, 84, 8, 0, 0, 85, 8, 4, 0, 86, 8, 4, 0, 87, 8,
- 4, 0, 88, 8, 4, 0, 37, 0, 24, 0, 89, 8, 26, 1, 4, 0, 7, 0, 90, 8, 7, 0, 67, 3, 2, 0, 91, 8, 2, 0, 92, 8,
- 27, 1, 6, 0, 7, 0, 93, 8, 7, 0, 94, 8, 7, 0, 95, 8, 7, 0, 96, 8, 4, 0, 97, 8, 4, 0, 98, 8, 28, 1, 13, 0,
- 7, 0, 99, 8, 7, 0,100, 8, 7, 0,101, 8, 7, 0,102, 8, 7, 0,103, 8, 7, 0,104, 8, 7, 0,105, 8, 7, 0,106, 8,
- 7, 0,107, 8, 7, 0,108, 8, 4, 0,228, 2, 4, 0,109, 8, 4, 0,110, 8, 29, 1, 2, 0, 7, 0, 86, 5, 7, 0, 37, 0,
- 30, 1, 5, 0, 7, 0,111, 8, 7, 0,112, 8, 4, 0, 90, 0, 4, 0,184, 2, 4, 0,113, 8, 31, 1, 6, 0, 31, 1, 0, 0,
- 31, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,114, 8, 2, 0, 56, 0, 32, 1, 8, 0, 32, 1, 0, 0, 32, 1, 1, 0,
- 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,114, 8, 2, 0, 56, 0, 7, 0, 23, 0, 7, 0,121, 0, 33, 1, 45, 0, 33, 1, 0, 0,
- 33, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,114, 8, 2, 0,239, 0, 2, 0, 37, 4, 2, 0,115, 8, 7, 0,116, 8,
- 7, 0, 88, 0, 7, 0,241, 2, 4, 0,117, 8, 4, 0, 81, 0, 4, 0,186, 2, 7, 0,118, 8, 7, 0,119, 8, 7, 0,120, 8,
- 7, 0,121, 8, 7, 0,122, 8, 7, 0,123, 8, 7, 0,238, 2, 7, 0, 56, 1, 7, 0,124, 8, 7, 0,125, 8, 7, 0, 37, 0,
- 7, 0,126, 8, 7, 0,127, 8, 7, 0,128, 8, 2, 0,129, 8, 2, 0,130, 8, 2, 0,131, 8, 2, 0,132, 8, 2, 0,133, 8,
- 2, 0,134, 8, 2, 0,135, 8, 2, 0,136, 8, 2, 0, 17, 2, 2, 0,137, 8, 2, 0, 14, 2, 2, 0,138, 8, 0, 0,139, 8,
- 0, 0,140, 8, 7, 0,237, 0, 34, 1,141, 8, 66, 0,229, 1, 35, 1, 16, 0, 35, 1, 0, 0, 35, 1, 1, 0, 2, 0, 17, 0,
- 2, 0, 19, 0, 2, 0,114, 8, 2, 0,239, 0, 7, 0,233, 2, 7, 0,234, 2, 7, 0,235, 2, 7, 0, 66, 2, 7, 0,236, 2,
- 7, 0,237, 2, 7, 0,142, 8, 7, 0,238, 2, 7, 0,240, 2, 7, 0,241, 2,232, 0, 5, 0, 2, 0, 17, 0, 2, 0, 25, 8,
- 2, 0, 19, 0, 2, 0,143, 8, 27, 0,166, 6,231, 0, 3, 0, 4, 0, 68, 0, 4, 0,144, 8,232, 0, 2, 0, 36, 1, 7, 0,
- 36, 1, 0, 0, 36, 1, 1, 0, 0, 0, 20, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 22, 0, 9, 0,145, 8, 37, 1, 5, 0,
- 0, 0, 20, 0, 7, 0, 76, 1, 7, 0,146, 8, 4, 0,147, 8, 4, 0, 37, 0, 38, 1, 4, 0, 2, 0, 17, 0, 2, 0, 19, 0,
- 2, 0, 89, 0, 2, 0, 69, 0, 39, 1, 4, 0, 0, 0, 20, 0, 65, 0,148, 8, 7, 0, 76, 1, 7, 0, 37, 0, 40, 1, 6, 0,
- 2, 0,149, 8, 2, 0,150, 8, 2, 0, 17, 0, 2, 0,151, 8, 0, 0,152, 8, 0, 0,153, 8, 41, 1, 5, 0, 4, 0, 17, 0,
- 4, 0, 37, 0, 0, 0, 20, 0, 0, 0,154, 8, 0, 0,155, 8, 42, 1, 3, 0, 4, 0, 17, 0, 4, 0, 37, 0, 0, 0, 20, 0,
- 43, 1, 4, 0, 2, 0,156, 8, 2, 0,157, 8, 2, 0, 19, 0, 2, 0, 37, 0, 44, 1, 6, 0, 0, 0, 20, 0, 0, 0,158, 8,
- 2, 0,159, 8, 2, 0,238, 2, 2, 0, 69, 1, 2, 0, 69, 0, 45, 1, 5, 0, 0, 0, 20, 0, 7, 0, 67, 3, 7, 0,128, 4,
- 2, 0, 19, 0, 2, 0,198, 2, 46, 1, 3, 0, 0, 0, 20, 0, 4, 0,186, 2, 4, 0,156, 8, 47, 1, 7, 0, 0, 0, 20, 0,
- 7, 0,128, 4, 0, 0,160, 8, 0, 0,161, 8, 2, 0, 69, 1, 2, 0, 89, 0, 4, 0,162, 8, 48, 1, 4, 0, 0, 0,163, 8,
- 0, 0,164, 8, 4, 0, 17, 0, 7, 0,202, 2, 49, 1, 3, 0, 32, 0,165, 8, 0, 0,166, 8, 0, 0,167, 8, 50, 1, 18, 0,
- 50, 1, 0, 0, 50, 1, 1, 0, 2, 0, 17, 0, 2, 0,168, 8, 2, 0, 19, 0, 2, 0,169, 8, 2, 0,170, 8, 2, 0,171, 8,
- 2, 0, 89, 0, 2, 0, 69, 0, 0, 0, 20, 0, 9, 0, 2, 0, 51, 1,172, 8, 32, 0, 44, 0, 2, 0,102, 5, 2, 0, 69, 8,
- 2, 0,173, 8, 2, 0, 37, 0, 52, 1, 11, 0, 0, 0, 20, 0, 0, 0, 17, 0, 0, 0,174, 8, 2, 0, 19, 0, 2, 0,198, 2,
- 2, 0,175, 8, 4, 0,176, 8, 4, 0,177, 8, 4, 0,178, 8, 4, 0,179, 8, 4, 0,180, 8, 53, 1, 1, 0, 0, 0,181, 8,
- 54, 1, 4, 0, 42, 0,133, 6, 0, 0,125, 7, 4, 0, 69, 1, 4, 0, 19, 0, 51, 1, 18, 0, 51, 1, 0, 0, 51, 1, 1, 0,
- 51, 1,182, 8, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,183, 8, 2, 0,171, 8, 2, 0,168, 8, 2, 0,184, 8, 2, 0, 69, 0,
- 2, 0,226, 1, 0, 0, 20, 0, 9, 0, 2, 0, 55, 1,172, 8, 50, 1,185, 8, 2, 0, 15, 0, 2, 0,186, 8, 4, 0,187, 8,
- 56, 1, 3, 0, 4, 0,212, 2, 4, 0, 37, 0, 32, 0, 44, 0, 57, 1, 12, 0,162, 0,188, 8, 2, 0, 17, 0, 2, 0, 19, 0,
- 4, 0,116, 8, 4, 0, 88, 0, 0, 0, 20, 0, 0, 0,189, 8, 2, 0,190, 8, 2, 0,191, 8, 2, 0,192, 8, 2, 0,193, 8,
- 7, 0,194, 8, 58, 1, 8, 0, 7, 0,195, 8, 7, 0,196, 8, 7, 0,197, 8, 7, 0,198, 8, 7, 0,199, 8, 7, 0,200, 8,
- 7, 0,201, 8, 7, 0,202, 8, 59, 1, 13, 0, 2, 0, 19, 0, 2, 0,205, 6, 4, 0, 89, 0, 4, 0, 69, 0, 2, 0,203, 8,
- 7, 0,251, 3, 7, 0,204, 8,250, 0,204, 6, 58, 1,205, 8, 2, 0, 17, 0, 2, 0,248, 1, 2, 0,234, 5, 2, 0,206, 8,
- 60, 1, 11, 0, 4, 0,212, 2, 2, 0, 17, 0, 2, 0, 19, 0, 32, 0, 44, 0, 81, 0,207, 8, 0, 0, 20, 0, 7, 0,208, 8,
- 7, 0,209, 8, 7, 0,136, 3, 2, 0,210, 8, 2, 0,211, 8, 61, 1, 5, 0, 2, 0, 17, 0, 2, 0, 89, 0, 4, 0, 37, 0,
- 46, 0,129, 0, 32, 0, 93, 5, 62, 1, 5, 0, 4, 0, 37, 0, 4, 0, 17, 0, 0, 0, 20, 0, 0, 0,154, 8, 32, 0, 44, 0,
- 63, 1, 13, 0, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,168, 8, 2, 0,137, 3, 7, 0,212, 8, 7, 0,213, 8, 7, 0,178, 4,
- 7, 0,149, 3, 7, 0,108, 3, 7, 0,111, 3, 7, 0,214, 8, 7, 0,215, 8, 32, 0,216, 8, 64, 1, 10, 0, 2, 0, 19, 0,
- 2, 0, 17, 0, 4, 0,116, 8, 4, 0, 88, 0, 0, 0, 20, 0, 0, 0,189, 8, 2, 0, 89, 0, 2, 0, 69, 0, 2, 0,226, 1,
- 2, 0,248, 1, 65, 1, 8, 0, 32, 0, 44, 0, 7, 0,235, 2, 7, 0,217, 8, 7, 0,218, 8, 7, 0, 37, 0, 2, 0, 89, 0,
- 2, 0,198, 2, 7, 0, 69, 0, 66, 1, 12, 0, 2, 0, 17, 0, 2, 0, 69, 1, 2, 0, 19, 0, 2, 0,238, 2, 2, 0,212, 2,
- 2, 0,219, 8, 4, 0, 37, 0, 7, 0,220, 8, 7, 0,221, 8, 7, 0,222, 8, 7, 0,223, 8, 0, 0,224, 8, 67, 1, 9, 0,
- 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,116, 8, 4, 0, 88, 0, 0, 0, 20, 0, 2, 0,178, 4, 2, 0, 63, 0, 2, 0,225, 8,
- 2, 0,226, 8, 68, 1, 7, 0, 4, 0,186, 2, 4, 0,227, 8, 4, 0,228, 8, 4, 0,229, 8, 7, 0,230, 8, 7, 0,231, 8,
- 0, 0,160, 8, 69, 1, 7, 0, 0, 0,232, 8, 32, 0,233, 8, 0, 0,166, 8, 2, 0,234, 8, 2, 0, 89, 0, 4, 0, 69, 0,
- 0, 0,167, 8, 70, 1, 6, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,116, 8, 4, 0, 88, 0, 0, 0,235, 8, 0, 0,236, 8,
- 71, 1, 1, 0, 4, 0, 19, 0, 72, 1, 6, 0, 0, 0, 92, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0,237, 8, 7, 0,238, 8,
- 42, 0,133, 6, 73, 1, 4, 0, 0, 0, 61, 2, 2, 0, 19, 0, 4, 0, 17, 0, 32, 0, 44, 0, 74, 1, 2, 0, 4, 0, 17, 0,
- 4, 0, 53, 6, 75, 1, 6, 0, 0, 0,163, 8, 0, 0,164, 8, 4, 0, 17, 0, 7, 0, 25, 2, 32, 0, 46, 3, 32, 0,239, 8,
- 55, 1, 10, 0, 55, 1, 0, 0, 55, 1, 1, 0, 55, 1,182, 8, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,168, 8, 2, 0,240, 8,
- 0, 0, 20, 0, 9, 0, 2, 0, 32, 0, 44, 0,250, 0, 16, 0, 27, 0, 31, 0, 0, 0, 34, 0, 43, 0,147, 0, 9, 0,220, 0,
- 43, 0,241, 8, 36, 0, 79, 0, 7, 0,251, 3, 7, 0,242, 8, 7, 0,204, 8, 7, 0,195, 8, 7, 0,196, 8, 7, 0,243, 8,
- 4, 0, 90, 0, 4, 0, 37, 0, 9, 0,244, 8, 9, 0,245, 8, 76, 1, 6, 0, 76, 1, 0, 0, 76, 1, 1, 0, 32, 0, 44, 0,
- 9, 0,246, 8, 4, 0,244, 0, 4, 0, 37, 0, 66, 0, 4, 0, 27, 0, 31, 0, 12, 0,247, 8, 4, 0,126, 0, 7, 0,248, 8,
- 77, 1, 27, 0, 77, 1, 0, 0, 77, 1, 1, 0, 26, 0,249, 8, 77, 1, 38, 0, 12, 0,250, 8, 0, 0, 20, 0, 7, 0,251, 8,
- 7, 0,252, 8, 7, 0,253, 8, 7, 0,254, 8, 4, 0, 19, 0, 7, 0,255, 8, 7, 0, 0, 9, 7, 0, 1, 9, 7, 0, 76, 1,
- 7, 0, 25, 2, 7, 0, 2, 9, 7, 0,184, 2, 7, 0, 3, 9, 7, 0, 4, 9, 7, 0, 5, 9, 7, 0, 6, 9, 7, 0, 7, 9,
- 7, 0,169, 0, 4, 0,126, 0, 2, 0,139, 5, 2, 0,178, 4, 78, 1, 25, 0, 27, 0, 31, 0, 39, 0, 74, 0, 12, 0, 8, 9,
- 12, 0, 9, 9, 12, 0, 10, 9, 77, 1, 11, 9, 9, 0, 12, 9, 9, 0, 13, 9, 4, 0, 19, 0, 4, 0, 29, 6, 2, 0,242, 2,
- 2, 0, 82, 6, 4, 0, 37, 0, 4, 0,126, 0, 4, 0, 14, 9, 2, 0, 15, 9, 2, 0, 16, 9, 2, 0, 17, 9, 2, 0, 18, 9,
- 4, 0, 19, 9, 4, 0, 20, 9, 4, 0, 21, 9, 4, 0, 22, 9, 4, 0, 23, 9, 4, 0, 24, 9, 79, 1, 2, 0, 7, 0,144, 2,
- 4, 0, 19, 0,166, 0, 5, 0, 79, 1, 25, 9, 4, 0,184, 2, 4, 0, 26, 9, 4, 0, 27, 9, 4, 0, 19, 0,165, 0, 16, 0,
- 4, 0, 28, 9, 4, 0, 29, 9, 4, 0, 30, 9, 4, 0, 31, 9, 2, 0, 32, 9, 2, 0, 33, 9, 2, 0, 34, 9, 2, 0,244, 0,
- 2, 0, 35, 9, 2, 0, 36, 9, 2, 0, 37, 9, 2, 0, 38, 9, 4, 0, 39, 9, 4, 0, 40, 9, 4, 0, 41, 9, 4, 0, 42, 9,
- 80, 1, 44, 0, 80, 1, 0, 0, 80, 1, 1, 0, 26, 0,249, 8, 12, 0,163, 3, 0, 0, 20, 0, 2, 0, 19, 0, 2, 0, 43, 9,
- 2, 0, 44, 9, 2, 0, 45, 9, 2, 0,122, 3, 2, 0, 46, 9, 4, 0, 64, 2, 4, 0, 21, 9, 4, 0, 22, 9, 77, 1, 47, 9,
- 80, 1, 38, 0, 80, 1, 48, 9, 12, 0, 49, 9, 9, 0, 50, 9, 9, 0, 51, 9, 9, 0, 52, 9, 7, 0, 64, 1, 7, 0,169, 0,
- 7, 0, 53, 9, 7, 0, 4, 2, 7, 0,113, 3, 7, 0,115, 3, 2, 0,145, 3, 2, 0, 37, 0, 7, 0, 54, 9, 7, 0, 55, 9,
- 7, 0,118, 3, 7, 0, 56, 9, 7, 0, 57, 9, 7, 0, 58, 9, 7, 0, 59, 9, 7, 0, 60, 9, 7, 0, 61, 9, 7, 0, 62, 9,
- 7, 0, 63, 9, 7, 0, 56, 2,166, 0,101, 3, 32, 0, 64, 9, 80, 1, 65, 9,163, 0, 14, 0, 12, 0, 66, 9, 76, 0, 67, 9,
- 2, 0, 19, 0, 2, 0, 68, 9, 7, 0, 93, 2, 7, 0, 69, 9, 7, 0, 70, 9, 12, 0, 71, 9, 4, 0, 72, 9, 4, 0, 73, 9,
- 9, 0, 74, 9, 9, 0, 75, 9,165, 0,100, 3, 0, 0, 76, 9, 81, 1, 1, 0, 4, 0, 73, 9, 82, 1, 12, 0, 4, 0, 73, 9,
- 7, 0,180, 8, 2, 0, 77, 9, 2, 0, 78, 9, 7, 0, 79, 9, 7, 0, 80, 9, 2, 0, 81, 9, 2, 0, 19, 0, 7, 0, 82, 9,
- 7, 0, 83, 9, 7, 0, 84, 9, 7, 0, 85, 9, 83, 1, 7, 0, 83, 1, 0, 0, 83, 1, 1, 0, 12, 0, 86, 9, 4, 0, 19, 0,
- 4, 0, 87, 9, 0, 0,242, 3, 2, 1, 88, 9,162, 0, 7, 0, 27, 0, 31, 0, 12, 0, 89, 9, 12, 0, 66, 9, 12, 0, 90, 9,
- 12, 0,100, 0, 4, 0, 19, 0, 4, 0, 91, 9,222, 0, 5, 0, 27, 0, 92, 9, 12, 0, 66, 9, 66, 0, 93, 9, 4, 0, 94, 9,
- 4, 0, 19, 0, 84, 1, 13, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,
-218, 0, 72, 6,162, 0, 96, 3,222, 0, 95, 9, 0, 0, 69, 1, 0, 0, 75, 6, 2, 0, 19, 0, 7, 0, 96, 9, 85, 1, 8, 0,
- 85, 1, 0, 0, 85, 1, 1, 0, 83, 1, 97, 9, 36, 0, 79, 0, 12, 0,102, 3, 4, 0, 19, 0, 0, 0, 20, 0, 4, 0, 98, 9,
- 86, 1, 5, 0, 86, 1, 0, 0, 86, 1, 1, 0, 36, 0, 79, 0, 2, 0, 19, 0, 0, 0, 99, 9, 87, 1, 14, 0, 87, 1, 0, 0,
- 87, 1, 1, 0, 9, 0, 2, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,100, 9, 0, 0,101, 9, 0, 0, 99, 9, 7, 0,102, 9,
- 7, 0,103, 9, 4, 0, 37, 0, 36, 0, 79, 0, 7, 0,104, 9, 7, 0,105, 9, 88, 1, 9, 0, 88, 1, 0, 0, 88, 1, 1, 0,
- 32, 0,106, 9, 0, 0,245, 2, 7, 0,107, 9, 2, 0,108, 9, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,109, 9, 89, 1, 7, 0,
- 42, 0,133, 6, 26, 0,249, 8, 4, 0, 19, 0, 4, 0,110, 9, 12, 0,111, 9, 32, 0,106, 9, 0, 0,245, 2, 90, 1, 15, 0,
- 32, 0,106, 9, 2, 0,112, 9, 2, 0, 19, 0, 2, 0,113, 9, 2, 0,114, 9, 0, 0,245, 2, 32, 0,115, 9, 0, 0,116, 9,
- 7, 0,117, 9, 7, 0, 25, 2, 7, 0,118, 9, 7, 0,119, 9, 2, 0, 17, 0, 2, 0, 69, 1, 7, 0, 76, 1, 91, 1, 6, 0,
- 32, 0,106, 9, 7, 0, 25, 9, 2, 0,120, 9, 2, 0,121, 9, 2, 0, 19, 0, 2, 0,122, 9, 92, 1, 6, 0, 32, 0,106, 9,
- 4, 0,123, 9, 4, 0,124, 9, 4, 0, 90, 0, 4, 0, 37, 0, 0, 0,245, 2, 93, 1, 4, 0, 32, 0,106, 9, 4, 0, 19, 0,
- 4, 0,123, 9, 0, 0,245, 2, 94, 1, 4, 0, 32, 0,106, 9, 4, 0, 19, 0, 4, 0,123, 9, 0, 0,245, 2, 95, 1, 4, 0,
- 32, 0,106, 9, 4, 0, 19, 0, 4, 0,123, 9, 0, 0,245, 2, 96, 1, 2, 0, 4, 0, 19, 0, 7, 0,251, 3, 97, 1, 2, 0,
- 32, 0,106, 9, 0, 0,245, 2, 98, 1, 10, 0, 32, 0,106, 9, 4, 0,125, 9, 7, 0,120, 0, 4, 0, 19, 0, 2, 0,126, 6,
- 2, 0,126, 9, 2, 0, 89, 0, 2, 0, 69, 0, 7, 0,127, 9, 0, 0,245, 2, 99, 1, 10, 0, 32, 0,106, 9, 2, 0, 17, 0,
- 2, 0, 45, 4, 4, 0, 87, 0, 4, 0, 88, 0, 7, 0,217, 8, 7, 0,218, 8, 4, 0, 37, 0,162, 0,188, 8, 0, 0,245, 2,
-100, 1, 4, 0, 32, 0,106, 9, 4, 0,123, 3, 4, 0,128, 9, 0, 0,245, 2,101, 1, 4, 0, 32, 0,106, 9, 4, 0,123, 3,
- 4, 0, 37, 0, 0, 0,245, 2,102, 1, 6, 0, 32, 0,106, 9, 7, 0,120, 0, 7, 0, 58, 3, 4, 0,129, 9, 2, 0,123, 3,
- 2, 0,124, 3,103, 1, 6, 0, 32, 0,106, 9, 4, 0,130, 9, 4, 0,131, 9, 7, 0,132, 9, 7, 0,133, 9, 0, 0,245, 2,
-104, 1, 16, 0, 32, 0,106, 9, 32, 0, 48, 9, 4, 0, 17, 0, 7, 0,134, 9, 7, 0,135, 9, 7, 0,136, 9, 7, 0,137, 9,
- 7, 0,138, 9, 7, 0,139, 9, 7, 0,140, 9, 7, 0,141, 9, 7, 0,142, 9, 2, 0, 19, 0, 2, 0, 37, 0, 2, 0, 89, 0,
- 2, 0, 69, 0,105, 1, 3, 0, 32, 0,106, 9, 4, 0, 19, 0, 4, 0, 17, 2,106, 1, 5, 0, 32, 0,106, 9, 4, 0, 19, 0,
- 4, 0, 37, 0, 7, 0,143, 9, 0, 0,245, 2,107, 1, 10, 0, 32, 0,106, 9, 0, 0,245, 2, 2, 0,144, 9, 2, 0,145, 9,
- 0, 0,146, 9, 0, 0,147, 9, 7, 0,148, 9, 7, 0,149, 9, 7, 0,150, 9, 7, 0,151, 9,108, 1, 5, 0, 32, 0,106, 9,
- 0, 0,245, 2, 7, 0,192, 2, 2, 0,152, 9, 2, 0, 19, 0,109, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0,
- 7, 0, 12, 0, 7, 0,153, 9, 7, 0,154, 9, 2, 0, 19, 0, 2, 0, 17, 2,110, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0,
- 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,153, 9, 7, 0,154, 9, 2, 0, 19, 0, 2, 0, 17, 2,111, 1, 8, 0, 7, 0, 9, 0,
- 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,153, 9, 7, 0,154, 9, 2, 0, 19, 0, 2, 0, 17, 2,112, 1, 7, 0,
- 32, 0,106, 9, 0, 0,245, 2, 7, 0, 76, 1, 7, 0, 85, 1, 2, 0, 19, 0, 2, 0, 69, 1, 4, 0, 37, 0,113, 1, 5, 0,
- 32, 0, 46, 3, 7, 0, 76, 1, 2, 0, 50, 3, 0, 0, 52, 3, 0, 0,155, 9,114, 1, 10, 0,114, 1, 0, 0,114, 1, 1, 0,
- 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,156, 9, 7, 0, 19, 1, 7, 0, 20, 1, 2, 0, 86, 9, 2, 0,157, 9, 32, 0, 44, 0,
-115, 1, 22, 0,115, 1, 0, 0,115, 1, 1, 0, 2, 0, 19, 0, 2, 0, 69, 1, 2, 0,158, 9, 2, 0,159, 9, 36, 0, 79, 0,
-162, 0,188, 8, 32, 0,161, 0, 7, 0, 87, 0, 7, 0, 88, 0, 7, 0,160, 9, 7, 0,161, 9, 7, 0,162, 9, 7, 0,163, 9,
- 7, 0,231, 2, 7, 0,164, 9, 7, 0,190, 8, 7, 0,165, 9, 0, 0,166, 9, 0, 0,167, 9, 12, 0,104, 3,116, 1, 8, 0,
- 7, 0, 32, 2, 7, 0,217, 8, 7, 0,218, 8, 9, 0, 2, 0, 2, 0,168, 9, 2, 0,169, 9, 2, 0,170, 9, 2, 0,171, 9,
-117, 1, 18, 0,117, 1, 0, 0,117, 1, 1, 0,117, 1,172, 9, 0, 0, 20, 0,116, 1,173, 9, 2, 0, 17, 0, 2, 0, 19, 0,
- 2, 0,174, 9, 2, 0,175, 9, 2, 0,176, 9, 2, 0,177, 9, 4, 0, 89, 0, 7, 0,178, 9, 7, 0,179, 9, 4, 0,180, 9,
- 4, 0,181, 9,117, 1,182, 9,118, 1,183, 9,119, 1, 33, 0,119, 1, 0, 0,119, 1, 1, 0,119, 1,184, 9, 0, 0, 20, 0,
- 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 34, 8, 2, 0, 69, 8, 2, 0,185, 9, 2, 0,128, 0, 2, 0,175, 9, 2, 0, 25, 8,
- 12, 0,183, 8, 12, 0,186, 9, 27, 0,166, 6, 9, 0,187, 9, 7, 0,178, 9, 7, 0,179, 9, 7, 0, 66, 2, 7, 0,188, 9,
- 2, 0,189, 9, 2, 0,190, 9, 7, 0,191, 9, 7, 0,192, 9, 2, 0,193, 9, 2, 0,194, 9, 9, 0,195, 9, 24, 0,196, 9,
- 24, 0,197, 9, 24, 0,198, 9,120, 1,148, 0,121, 1,199, 9,122, 1,200, 9,118, 1, 8, 0,118, 1, 0, 0,118, 1, 1, 0,
-119, 1,201, 9,119, 1,202, 9,117, 1,203, 9,117, 1,182, 9, 4, 0, 19, 0, 4, 0, 37, 0, 60, 0, 22, 0, 27, 0, 31, 0,
- 39, 0, 74, 0,164, 0, 99, 3, 12, 0,204, 9, 12, 0,205, 9,116, 1,206, 9, 12, 0,207, 9, 4, 0, 17, 0, 4, 0,208, 9,
- 4, 0,209, 9, 4, 0,210, 9, 4, 0, 19, 0, 4, 0, 37, 0, 12, 0,211, 9,122, 1,212, 9, 4, 0,213, 9, 9, 0,214, 9,
- 9, 0,215, 9, 4, 0,216, 9, 9, 0,217, 9, 9, 0,218, 9, 9, 0,219, 9,123, 1, 6, 0, 4, 0,119, 0, 4, 0,121, 0,
- 4, 0, 25, 8, 0, 0,220, 9, 0, 0,221, 9, 2, 0, 37, 0,124, 1, 16, 0, 2, 0,233, 7, 2, 0,234, 7, 2, 0,222, 9,
- 2, 0,223, 9, 2, 0,224, 9, 2, 0, 67, 0, 7, 0,230, 2, 7, 0,225, 9, 7, 0,226, 9, 2, 0, 91, 1, 0, 0,227, 9,
- 0, 0,228, 9, 2, 0,229, 9, 2, 0, 37, 0, 4, 0,230, 9, 4, 0,231, 9,125, 1, 9, 0, 7, 0,232, 9, 7, 0,233, 9,
- 7, 0,243, 8, 7, 0, 67, 3, 7, 0,234, 9, 7, 0, 88, 6, 2, 0, 65, 3, 0, 0,235, 9, 0, 0, 37, 0,126, 1, 4, 0,
- 7, 0,236, 9, 7, 0,237, 9, 2, 0, 65, 3, 2, 0, 37, 0,127, 1, 3, 0, 7, 0,238, 9, 7, 0, 56, 8, 7, 0, 15, 0,
-128, 1, 7, 0, 0, 0,250, 1, 2, 0, 11, 5, 2, 0, 12, 5, 2, 0, 13, 5, 2, 0,200, 4, 4, 0,121, 0, 4, 0, 43, 4,
-129, 1, 9, 0, 7, 0,239, 9, 7, 0,240, 9, 7, 0,241, 9, 7, 0, 77, 2, 7, 0,242, 9, 7, 0,243, 9, 7, 0,244, 9,
- 2, 0,245, 9, 2, 0,246, 9,130, 1, 4, 0, 2, 0,247, 9, 2, 0,248, 9, 2, 0,249, 9, 2, 0,250, 9,131, 1, 2, 0,
- 7, 0, 5, 0, 7, 0, 6, 0,132, 1, 2, 0, 0, 0,163, 0, 0, 0,251, 9,133, 1, 1, 0, 0, 0, 20, 0,134, 1, 10, 0,
- 0, 0,252, 9, 0, 0,253, 9, 0, 0, 81, 6, 0, 0,254, 9, 2, 0,222, 9, 2, 0,255, 9, 7, 0, 0, 10, 7, 0, 1, 10,
- 7, 0, 2, 10, 7, 0,164, 9,135, 1, 2, 0, 9, 0, 3, 10, 9, 0, 4, 10,136, 1, 11, 0, 0, 0, 13, 5, 0, 0, 17, 0,
- 0, 0, 65, 3, 0, 0, 67, 3, 0, 0, 5, 10, 0, 0,106, 0, 0, 0, 61, 2, 7, 0, 6, 10, 7, 0, 7, 10, 7, 0, 8, 10,
- 7, 0, 9, 10,137, 1, 8, 0, 7, 0,149, 8, 7, 0,120, 0, 7, 0,228, 9, 7, 0,149, 2, 7, 0, 10, 10, 7, 0,233, 0,
- 7, 0, 11, 10, 4, 0, 17, 0,138, 1, 4, 0, 2, 0, 12, 10, 2, 0, 13, 10, 2, 0, 14, 10, 2, 0, 37, 0,139, 1, 8, 0,
- 7, 0, 15, 10, 7, 0,192, 2, 7, 0, 16, 10, 7, 0, 30, 8, 7, 0, 31, 8, 7, 0, 32, 8, 7, 0, 17, 10, 7, 0, 18, 10,
-140, 1, 6, 0, 2, 0, 19, 10, 2, 0, 20, 10, 7, 0, 21, 10, 7, 0, 22, 10, 7, 0, 23, 10, 7, 0, 24, 10,141, 1, 1, 0,
- 0, 0, 20, 0,142, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 2, 0, 19, 0, 2, 0, 25, 10,143, 1, 10, 0, 2, 0,231, 3,
- 2, 0, 19, 0, 7, 0,128, 4, 7, 0, 26, 10, 7, 0, 27, 10, 7, 0, 28, 10, 7, 0, 29, 10,142, 1, 30, 10,142, 1, 31, 10,
-142, 1, 32, 10, 63, 0, 11, 0, 4, 0, 19, 0, 4, 0, 63, 0, 4, 0, 33, 10, 4, 0, 34, 10, 24, 0, 35, 10, 24, 0, 36, 10,
-143, 1, 37, 10, 7, 0, 38, 10, 7, 0, 39, 10, 7, 0, 40, 10, 7, 0, 41, 10,235, 0, 10, 0, 4, 0, 86, 9, 4, 0, 42, 10,
- 7, 0, 43, 10, 7, 0, 44, 10, 7, 0, 45, 10, 7, 0, 46, 10, 7, 0, 10, 0, 7, 0, 12, 0, 4, 0, 69, 1, 4, 0,235, 2,
-234, 0, 18, 0, 4, 0,124, 0, 4, 0, 47, 10, 4, 0, 48, 10, 7, 0, 49, 10, 4, 0, 50, 10, 7, 0, 51, 10, 7, 0, 52, 10,
- 4, 0, 53, 10, 7, 0, 54, 10, 4, 0, 55, 10, 7, 0, 56, 10,235, 0, 57, 10, 7, 0, 58, 10, 7, 0, 59, 10, 7, 0, 60, 10,
- 7, 0, 61, 10, 4, 0, 62, 10, 4, 0, 37, 0,144, 1, 4, 0, 47, 0,222, 2, 7, 0, 63, 10, 7, 0,158, 1, 7, 0, 37, 0,
-195, 0, 33, 0, 27, 0, 31, 0,144, 1, 64, 10, 63, 0, 30, 10, 51, 0, 65, 10, 57, 0, 66, 10, 30, 0,148, 0, 0, 0, 67, 10,
- 7, 0, 68, 10, 2, 0,240, 5, 2, 0, 69, 10, 4, 0,106, 0, 4, 0, 19, 0, 7, 0, 70, 10, 4, 0, 74, 2, 4, 0, 71, 10,
- 7, 0, 72, 10, 7, 0, 73, 10, 7, 0, 74, 10, 7, 0,158, 1, 4, 0, 75, 10, 7, 0, 76, 10, 0, 0, 77, 10, 0, 0, 78, 10,
- 0, 0, 79, 10, 0, 0,226, 1, 7, 0, 80, 10, 7, 0, 81, 10, 7, 0, 82, 10, 7, 0, 83, 10, 4, 0, 84, 10, 7, 0, 85, 10,
- 7, 0, 86, 10, 7, 0, 87, 10,145, 1, 10, 0, 4, 0, 17, 0, 4, 0,120, 0, 4, 0, 19, 0, 4, 0,185, 3, 4, 0, 88, 10,
- 4, 0, 89, 10, 4, 0, 90, 10, 0, 0, 92, 0, 0, 0, 20, 0, 9, 0, 2, 0,146, 1, 1, 0, 0, 0, 18, 8, 92, 0, 7, 0,
-145, 1, 91, 10, 4, 0, 92, 10, 4, 0, 93, 10, 4, 0, 94, 10, 4, 0, 37, 0, 9, 0, 95, 10,146, 1, 96, 10,147, 1, 5, 0,
- 7, 0,144, 2, 7, 0,212, 2, 7, 0, 25, 2, 2, 0,120, 2, 2, 0, 37, 0,148, 1, 5, 0, 7, 0,144, 2, 7, 0, 97, 10,
- 7, 0, 98, 10, 7, 0, 99, 10, 7, 0,212, 2,149, 1, 5, 0, 32, 0,100, 10,150, 1, 22, 0, 7, 0,210, 5, 7, 0,101, 10,
- 7, 0, 56, 0,151, 1, 7, 0, 4, 0,102, 10, 4, 0,103, 10, 4, 0,104, 10, 7, 0,105, 10, 7, 0,106, 10, 7, 0,107, 10,
- 7, 0, 56, 0,152, 1, 8, 0,152, 1, 0, 0,152, 1, 1, 0, 32, 0, 44, 0, 4, 0,252, 0, 2, 0, 19, 0, 2, 0, 69, 1,
- 7, 0,212, 2, 7, 0,157, 8,153, 1, 6, 0,153, 1, 0, 0,153, 1, 1, 0, 32, 0, 44, 0, 2, 0,197, 2, 2, 0, 19, 0,
- 2, 0,108, 10,154, 1, 17, 0,148, 1,179, 3,148, 1,109, 10,147, 1,110, 10,148, 1,141, 8,149, 1,111, 10, 4, 0, 81, 0,
- 7, 0,212, 2, 7, 0,241, 2, 7, 0,112, 10, 4, 0,102, 10, 4, 0,113, 10, 7, 0,106, 10, 7, 0,107, 10, 7, 0,106, 0,
- 4, 0,114, 10, 2, 0, 19, 0, 2, 0,115, 10,155, 1, 9, 0, 7, 0,116, 10, 7, 0,248, 0, 7, 0,117, 10, 7, 0,118, 10,
- 7, 0,119, 10, 7, 0,120, 10, 7, 0,121, 10, 7, 0,122, 10, 7, 0,123, 10,156, 1,111, 0, 27, 0, 31, 0, 39, 0, 74, 0,
-157, 1,124, 10,155, 1,125, 10,173, 0, 65, 4, 4, 0, 19, 0, 2, 0, 17, 0, 2, 0,144, 9, 2, 0,126, 10, 2, 0,127, 10,
- 2, 0,145, 3, 2, 0,128, 10, 2, 0,129, 10, 2, 0,130, 10, 2, 0,131, 10, 2, 0,132, 10, 2, 0,133, 10, 2, 0,134, 10,
- 2, 0,135, 10, 2, 0,110, 5, 2, 0,136, 10, 2, 0,137, 10, 2, 0,138, 10, 2, 0,139, 10, 2, 0,140, 10, 2, 0, 14, 2,
- 2, 0,134, 8, 2, 0,109, 8, 2, 0,141, 10, 2, 0,142, 10, 2, 0,195, 3, 2, 0,196, 3, 2, 0,143, 10, 2, 0,144, 10,
- 2, 0,145, 10, 2, 0,146, 10, 7, 0,147, 10, 7, 0,148, 10, 7, 0,149, 10, 2, 0, 61, 5, 2, 0,150, 10, 7, 0,151, 10,
- 7, 0,152, 10, 7, 0,153, 10, 7, 0,116, 8, 7, 0, 88, 0, 7, 0,241, 2, 7, 0,122, 8, 7, 0,154, 10, 7, 0,155, 10,
- 7, 0,156, 10, 4, 0,117, 8, 4, 0,115, 8, 4, 0,157, 10, 7, 0,118, 8, 7, 0,119, 8, 7, 0,120, 8, 7, 0,158, 10,
- 7, 0,159, 10, 7, 0,160, 10, 7, 0,161, 10, 7, 0,162, 10, 7, 0, 56, 0, 7, 0,163, 10, 7, 0,164, 10, 7, 0,165, 10,
- 7, 0,166, 10, 7, 0,136, 3, 7, 0,106, 0, 7, 0,167, 10, 7, 0,168, 10, 7, 0,169, 10, 7, 0,170, 10, 7, 0,171, 10,
- 7, 0,172, 10, 7, 0,173, 10, 4, 0,174, 10, 4, 0,175, 10, 7, 0,176, 10, 7, 0,177, 10, 7, 0,178, 10, 7, 0,179, 10,
- 7, 0,180, 10, 7, 0,207, 0, 7, 0,181, 10, 7, 0,222, 3, 7, 0,220, 3, 7, 0,221, 3, 7, 0,182, 10, 7, 0,183, 10,
- 7, 0,184, 10, 7, 0,185, 10, 7, 0,186, 10, 7, 0,187, 10, 7, 0,188, 10, 7, 0,189, 10, 7, 0,190, 10, 7, 0,191, 10,
- 7, 0,192, 10, 7, 0,193, 10, 7, 0,194, 10, 4, 0,195, 10, 4, 0,196, 10, 66, 0,168, 3, 12, 0,197, 10, 66, 0,198, 10,
- 32, 0,199, 10, 32, 0,200, 10, 36, 0, 79, 0,168, 0, 61, 1,168, 0,201, 10,148, 0, 44, 0,148, 0, 0, 0,148, 0, 1, 0,
-156, 1,202, 10,154, 1,203, 10,151, 1, 48, 9,175, 0,247, 3, 9, 0,248, 3,158, 1,204, 10,158, 1,205, 10, 12, 0,206, 10,
- 12, 0,207, 10,133, 0,208, 10,141, 0,209, 10,141, 0,210, 10, 32, 0,211, 10, 32, 0,212, 10, 32, 0, 38, 0, 12, 0,111, 9,
- 0, 0, 20, 0, 7, 0,237, 0, 7, 0, 12, 3, 7, 0,213, 10, 4, 0,186, 2, 4, 0, 56, 0, 4, 0, 19, 0, 4, 0,117, 8,
- 4, 0,214, 10, 4, 0,215, 10, 4, 0,216, 10, 2, 0,244, 0, 2, 0,217, 10, 2, 0,218, 10, 2, 0,219, 10, 0, 0,220, 10,
- 2, 0,221, 10, 2, 0,222, 10, 2, 0,223, 10, 9, 0,224, 10,137, 0, 64, 4, 12, 0,255, 2, 12, 0,225, 10,159, 1,226, 10,
-160, 1,227, 10, 7, 0,228, 10,135, 0, 37, 0,161, 1,244, 8, 7, 0, 34, 4, 7, 0,229, 10, 7, 0,230, 10, 7, 0,210, 5,
- 7, 0,146, 3, 7, 0,136, 3, 7, 0,231, 10, 7, 0, 76, 2, 7, 0,232, 10, 7, 0,233, 10, 7, 0,234, 10, 7, 0,235, 10,
- 7, 0,236, 10, 7, 0,237, 10, 7, 0, 35, 4, 7, 0,238, 10, 7, 0,239, 10, 7, 0,240, 10, 7, 0, 36, 4, 7, 0, 32, 4,
- 7, 0, 33, 4, 7, 0,241, 10, 7, 0,242, 10, 4, 0,243, 10, 4, 0, 90, 0, 4, 0,244, 10, 4, 0,245, 10, 2, 0,246, 10,
- 2, 0,247, 10, 2, 0,248, 10, 2, 0,249, 10, 2, 0,250, 10, 2, 0,251, 10, 2, 0,252, 10, 2, 0,178, 4,173, 0, 65, 4,
-136, 0, 9, 0,161, 1,253, 10, 7, 0,254, 10, 7, 0,255, 10, 7, 0,230, 1, 7, 0, 0, 11, 4, 0, 90, 0, 2, 0, 1, 11,
- 2, 0, 2, 11, 66, 0,229, 1,162, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 0, 3, 11,163, 1, 6, 0,
-163, 1, 0, 0,163, 1, 1, 0,162, 1, 25, 9, 4, 0,250, 0, 2, 0, 4, 11, 2, 0, 19, 0,164, 1, 5, 0,164, 1, 0, 0,
-164, 1, 1, 0, 12, 0, 5, 11, 4, 0, 6, 11, 4, 0, 19, 0,165, 1, 9, 0,165, 1, 0, 0,165, 1, 1, 0, 12, 0,119, 0,
-164, 1, 7, 11, 4, 0, 19, 0, 2, 0, 4, 11, 2, 0, 8, 11, 7, 0, 91, 0, 0, 0, 9, 11,164, 0, 6, 0, 27, 0, 31, 0,
- 12, 0, 29, 5, 4, 0, 19, 0, 2, 0, 10, 11, 2, 0, 11, 11, 9, 0, 12, 11,166, 1, 7, 0,166, 1, 0, 0,166, 1, 1, 0,
- 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 23, 0, 0, 0, 13, 11, 0, 0, 14, 11,167, 1, 6, 0, 12, 0, 15, 11, 4, 0, 16, 11,
- 4, 0, 17, 11, 4, 0, 19, 0, 4, 0, 37, 0,215, 0, 18, 11,168, 1, 3, 0, 7, 0, 86, 5, 7, 0, 19, 11, 7, 0, 20, 11,
-169, 1, 17, 0, 27, 0, 31, 0,170, 1, 21, 11,170, 1, 22, 11, 12, 0, 23, 11, 4, 0, 24, 11, 2, 0, 25, 11, 2, 0, 26, 11,
- 12, 0, 27, 11, 12, 0, 28, 11,167, 1, 29, 11, 12, 0, 30, 11, 12, 0, 31, 11, 12, 0, 32, 11, 12, 0, 33, 11,171, 1, 34, 11,
- 12, 0, 35, 11,215, 0, 36, 11,170, 1, 31, 0,170, 1, 0, 0,170, 1, 1, 0, 9, 0, 37, 11, 4, 0,211, 7, 2, 0, 38, 11,
- 2, 0, 37, 0,220, 0, 71, 6,220, 0, 39, 11, 0, 0, 40, 11, 2, 0, 41, 11, 2, 0, 42, 11, 2, 0,233, 7, 2, 0,234, 7,
- 2, 0, 43, 11, 2, 0, 44, 11, 2, 0,185, 3, 2, 0,194, 6, 2, 0, 45, 11, 2, 0, 46, 11, 2, 0,213, 9,172, 1, 47, 11,
-173, 1, 48, 11,174, 1, 49, 11, 4, 0, 50, 11, 4, 0, 51, 11, 9, 0, 52, 11, 12, 0, 28, 11, 12, 0,253, 7, 12, 0, 53, 11,
- 12, 0, 54, 11, 12, 0, 55, 11,175, 1, 17, 0,175, 1, 0, 0,175, 1, 1, 0, 0, 0, 56, 11, 26, 0, 30, 0, 2, 0, 57, 11,
- 2, 0, 17, 0, 2, 0, 15, 0, 2, 0, 58, 11, 2, 0, 59, 11, 2, 0, 60, 11, 2, 0, 61, 11, 2, 0, 62, 11, 2, 0, 19, 0,
- 2, 0, 63, 11, 2, 0, 31, 0, 2, 0, 37, 0,176, 1, 64, 11,177, 1, 10, 0,177, 1, 0, 0,177, 1, 1, 0, 12, 0, 65, 11,
- 0, 0, 56, 11, 2, 0, 66, 11, 2, 0, 67, 11, 2, 0, 19, 0, 2, 0, 68, 11, 4, 0, 69, 11, 9, 0, 70, 11,171, 1, 7, 0,
-171, 1, 0, 0,171, 1, 1, 0, 0, 0, 56, 11, 0, 0, 71, 11, 12, 0,163, 7, 4, 0, 72, 11, 4, 0, 19, 0,228, 0, 14, 0,
-228, 0, 0, 0,228, 0, 1, 0, 0, 0, 56, 11, 26, 0, 30, 0,178, 1,227, 7, 9, 0, 73, 11, 9, 0, 74, 11,176, 1, 64, 11,
-167, 1, 75, 11, 12, 0, 76, 11,228, 0, 77, 11, 11, 1,107, 6, 2, 0, 19, 0, 2, 0,178, 4,179, 1, 8, 0,179, 1, 0, 0,
-179, 1, 1, 0, 9, 0, 2, 0, 9, 0, 78, 11, 0, 0,242, 3, 2, 0, 17, 0, 2, 0, 19, 0, 7, 0, 79, 11,180, 1, 5, 0,
- 7, 0, 80, 11, 4, 0, 81, 11, 4, 0, 82, 11, 4, 0, 69, 1, 4, 0, 19, 0,181, 1, 6, 0, 7, 0, 83, 11, 7, 0, 84, 11,
- 7, 0, 85, 11, 7, 0, 86, 11, 4, 0, 17, 0, 4, 0, 19, 0,182, 1, 5, 0, 7, 0,217, 8, 7, 0,218, 8, 7, 0,212, 2,
- 2, 0, 28, 2, 2, 0, 29, 2,183, 1, 5, 0,182, 1, 2, 0, 4, 0, 53, 0, 7, 0, 87, 11, 7, 0,217, 8, 7, 0,218, 8,
-184, 1, 4, 0, 2, 0, 88, 11, 2, 0, 89, 11, 2, 0, 90, 11, 2, 0, 91, 11,185, 1, 2, 0, 42, 0,160, 6, 26, 0,249, 8,
-186, 1, 3, 0, 24, 0, 92, 11, 4, 0, 19, 0, 4, 0, 37, 0,187, 1, 6, 0, 7, 0,106, 0, 7, 0,214, 2, 7, 0, 93, 11,
- 7, 0, 37, 0, 2, 0,243, 0, 2, 0, 94, 11,188, 1, 5, 0, 7, 0, 95, 11, 7, 0,120, 0, 7, 0, 26, 9, 7, 0, 27, 9,
- 4, 0, 19, 0,189, 1, 6, 0, 27, 0,166, 6, 0, 0, 96, 11, 0, 0, 97, 11, 2, 0, 98, 11, 2, 0, 19, 0, 4, 0, 99, 11,
-190, 1, 7, 0,190, 1, 0, 0,190, 1, 1, 0, 0, 0,242, 3,189, 1,100, 11, 2, 0,101, 11, 2, 0, 17, 0, 7, 0, 60, 0,
-191, 1, 7, 0, 12, 0,102, 11, 0, 0,103, 11, 9, 0,104, 11, 7, 0, 60, 0, 7, 0, 79, 11, 4, 0, 17, 0, 4, 0, 19, 0,
-192, 1, 3, 0, 7, 0,105, 11, 4, 0, 19, 0, 4, 0, 37, 0,193, 1, 15, 0,193, 1, 0, 0,193, 1, 1, 0, 83, 1, 97, 9,
-191, 1, 61, 0, 12, 0,104, 3, 35, 0, 49, 0,192, 1,106, 11, 4, 0, 53, 0, 7, 0, 60, 0, 2, 0, 19, 0, 2, 0, 12, 1,
- 4, 0,107, 11, 0, 0, 96, 11, 4, 0,108, 11, 7, 0,109, 11,194, 1, 2, 0, 0, 0,110, 11, 0, 0,111, 11,195, 1, 4, 0,
-195, 1, 0, 0,195, 1, 1, 0,162, 0, 46, 3, 12, 0,112, 11,196, 1, 24, 0,196, 1, 0, 0,196, 1, 1, 0, 12, 0,113, 11,
-162, 0,188, 8,195, 1,114, 11, 12, 0,115, 11, 12, 0,104, 3, 0, 0,242, 3, 7, 0, 79, 11, 7, 0,116, 11, 7, 0, 87, 0,
- 7, 0, 88, 0, 7, 0,160, 9, 7, 0,161, 9, 7, 0,231, 2, 7, 0,164, 9, 7, 0,190, 8, 7, 0,165, 9, 2, 0,117, 11,
- 2, 0,118, 11, 2, 0, 89, 0, 2, 0, 17, 0, 4, 0, 19, 0, 4, 0, 69, 0,197, 1, 6, 0,197, 1, 0, 0,197, 1, 1, 0,
- 12, 0,113, 11, 4, 0, 19, 0, 4, 0,148, 2, 0, 0,242, 3,198, 1, 11, 0,198, 1, 0, 0,198, 1, 1, 0, 27, 0,166, 6,
- 0, 0,119, 11, 4, 0, 99, 11, 2, 0,120, 11, 2, 0, 37, 0, 0, 0, 96, 11, 4, 0,107, 11, 2, 0, 19, 0, 2, 0,121, 11,
-199, 1, 8, 0,199, 1, 0, 0,199, 1, 1, 0, 12, 0,122, 11, 0, 0,242, 3, 0, 0,123, 11, 2, 0, 19, 0, 2, 0,121, 11,
- 4, 0,124, 11,200, 1, 5, 0,200, 1, 0, 0,200, 1, 1, 0, 0, 0, 96, 11, 4, 0,107, 11, 7, 0,202, 2, 39, 0, 12, 0,
-162, 0, 96, 3,162, 0,125, 11,195, 1,114, 11, 12, 0,126, 11,196, 1,127, 11, 12, 0,128, 11, 12, 0,129, 11, 4, 0, 19, 0,
- 4, 0,244, 0, 2, 0,130, 11, 2, 0,131, 11, 7, 0,132, 11,201, 1, 2, 0, 27, 0, 31, 0, 39, 0, 74, 0,202, 1, 5, 0,
-202, 1, 0, 0,202, 1, 1, 0, 4, 0, 17, 0, 4, 0, 19, 0, 0, 0, 20, 0,203, 1, 6, 0,202, 1,133, 11, 32, 0, 44, 0,
- 4, 0,134, 11, 7, 0,135, 11, 4, 0,136, 11, 4, 0, 86, 9,204, 1, 3, 0,202, 1,133, 11, 4, 0,134, 11, 7, 0,137, 11,
-205, 1, 8, 0,202, 1,133, 11, 32, 0, 44, 0, 7, 0, 64, 1, 7, 0,138, 11, 7, 0, 12, 3, 7, 0,243, 8, 4, 0,134, 11,
- 4, 0,139, 11,206, 1, 5, 0,202, 1,133, 11, 7, 0,140, 11, 7, 0, 69, 8, 7, 0,237, 2, 7, 0, 56, 0,207, 1, 3, 0,
-202, 1,133, 11, 7, 0,243, 8, 7, 0,141, 11,150, 1, 4, 0, 7, 0,142, 11, 7, 0,169, 10, 2, 0,143, 11, 2, 0, 69, 1,
-208, 1, 14, 0,208, 1, 0, 0,208, 1, 1, 0, 12, 0,144, 11, 12, 0,145, 11, 12, 0,146, 11, 0, 0, 20, 0, 4, 0, 31, 0,
- 4, 0, 19, 0, 4, 0,147, 11, 7, 0,148, 11, 4, 0,136, 11, 4, 0, 86, 9, 7, 0,251, 3, 7, 0,239, 2,157, 1, 23, 0,
- 4, 0,134, 11, 4, 0,149, 11, 7, 0,150, 11, 7, 0, 56, 0, 7, 0,151, 11, 7, 0,235, 2, 7, 0,142, 11, 7, 0,152, 11,
- 7, 0,214, 2, 7, 0, 49, 10, 7, 0,128, 4, 7, 0,153, 11, 7, 0,154, 11, 7, 0,155, 11, 7, 0,156, 11, 7, 0,157, 11,
- 7, 0,158, 11, 7, 0,159, 11, 7, 0,160, 11, 7, 0,161, 11, 7, 0,162, 11, 7, 0,163, 11, 12, 0,164, 11,121, 0, 40, 0,
-120, 0,165, 11,209, 1,125, 10, 66, 0,166, 11, 66, 0,198, 10, 66, 0,167, 11,210, 1,168, 11, 48, 0,162, 0, 48, 0,169, 11,
- 48, 0,170, 11, 7, 0,171, 11, 7, 0,172, 11, 7, 0,173, 11, 7, 0,174, 11, 7, 0,175, 11, 7, 0, 98, 9, 7, 0,176, 11,
- 7, 0,158, 1, 7, 0,177, 11, 4, 0,178, 11, 4, 0,179, 11, 4, 0,180, 11, 4, 0, 90, 0, 4, 0, 37, 0, 4, 0,181, 11,
- 2, 0,182, 11, 2, 0,183, 11, 4, 0,184, 11, 7, 0,214, 2, 4, 0,185, 11, 7, 0,186, 11, 4, 0,187, 11, 4, 0,188, 11,
- 4, 0,189, 11,137, 0,190, 11, 12, 0,191, 11,173, 0, 65, 4, 4, 0,192, 11, 7, 0,193, 11, 7, 0,194, 11, 4, 0, 69, 0,
-122, 0, 12, 0,120, 0,165, 11,148, 0, 32, 3, 7, 0,125, 1, 7, 0, 98, 9, 7, 0,195, 11, 7, 0,196, 11, 7, 0,197, 11,
- 2, 0,198, 11, 2, 0,199, 11, 2, 0,200, 11, 2, 0, 17, 0, 4, 0, 90, 0,123, 0, 13, 0,120, 0,165, 11,139, 0, 9, 3,
-141, 0, 11, 3, 7, 0, 25, 9, 7, 0,201, 11, 7, 0,202, 11, 7, 0, 66, 1, 7, 0,203, 11, 4, 0,120, 9, 4, 0, 7, 3,
- 2, 0, 17, 0, 2, 0, 37, 0, 4, 0, 69, 0, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+104,105,102,116,121, 0, 89, 70, 95,100,111,102,100,105,115,116, 0, 42,100,111,102, 95,111, 98, 0, 42,115, 99,101,110,101, 0,
+102,114, 97,109,101,110,114, 0,102,114, 97,109,101,115, 0,111,102,102,115,101,116, 0,115,102,114, 97, 0,102,105,101, 95,105,
+109, 97, 0, 99,121, 99,108, 0,111,107, 0,109,117,108,116,105, 95,105,110,100,101,120, 0,108, 97,121,101,114, 0,112, 97,115,
+115, 0,105, 98,117,102,115, 0, 42,103,112,117,116,101,120,116,117,114,101, 0, 42, 97,110,105,109, 0, 42,114,114, 0, 42,114,
+101,110,100,101,114,115, 91, 56, 93, 0,114,101,110,100,101,114, 95,115,108,111,116, 0,108, 97,115,116, 95,114,101,110,100,101,
+114, 95,115,108,111,116, 0,115,111,117,114, 99,101, 0,108, 97,115,116,102,114, 97,109,101, 0,116,112, 97,103,101,102,108, 97,
+103, 0,116,111,116, 98,105,110,100, 0,120,114,101,112, 0,121,114,101,112, 0,116,119,115,116, 97, 0,116,119,101,110,100, 0,
+ 98,105,110,100, 99,111,100,101, 0, 42,114,101,112, 98,105,110,100, 0, 42,112, 97, 99,107,101,100,102,105,108,101, 0, 42,112,
+114,101,118,105,101,119, 0,108, 97,115,116,117,112,100, 97,116,101, 0,108, 97,115,116,117,115,101,100, 0, 97,110,105,109,115,
+112,101,101,100, 0,103,101,110, 95,120, 0,103,101,110, 95,121, 0,103,101,110, 95,116,121,112,101, 0, 97,115,112,120, 0, 97,
+115,112,121, 0,116,101,120, 99,111, 0,109, 97,112,116,111, 0,109, 97,112,116,111,110,101,103, 0, 98,108,101,110,100,116,121,
+112,101, 0, 42,111, 98,106,101, 99,116, 0, 42,116,101,120, 0,117,118,110, 97,109,101, 91, 51, 50, 93, 0,112,114,111,106,120,
+ 0,112,114,111,106,121, 0,112,114,111,106,122, 0,109, 97,112,112,105,110,103, 0,111,102,115, 91, 51, 93, 0,115,105,122,101,
+ 91, 51, 93, 0,114,111,116, 0,116,101,120,102,108, 97,103, 0, 99,111,108,111,114,109,111,100,101,108, 0,112,109, 97,112,116,
+111, 0,112,109, 97,112,116,111,110,101,103, 0,110,111,114,109, 97,112,115,112, 97, 99,101, 0,119,104,105, 99,104, 95,111,117,
+116,112,117,116, 0, 98,114,117,115,104, 95,109, 97,112, 95,109,111,100,101, 0,112, 97,100, 91, 55, 93, 0,114, 0,103, 0, 98,
+ 0,107, 0,100,101,102, 95,118, 97,114, 0, 99,111,108,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,110,111,114,102, 97, 99, 0,
+100,105,115,112,102, 97, 99, 0,119, 97,114,112,102, 97, 99, 0, 99,111,108,115,112,101, 99,102, 97, 99, 0,109,105,114,114,102,
+ 97, 99, 0, 97,108,112,104, 97,102, 97, 99, 0,100,105,102,102,102, 97, 99, 0,115,112,101, 99,102, 97, 99, 0,101,109,105,116,
+102, 97, 99, 0,104, 97,114,100,102, 97, 99, 0,114, 97,121,109,105,114,114,102, 97, 99, 0,116,114, 97,110,115,108,102, 97, 99,
+ 0, 97,109, 98,102, 97, 99, 0, 99,111,108,101,109,105,116,102, 97, 99, 0, 99,111,108,114,101,102,108,102, 97, 99, 0, 99,111,
+108,116,114, 97,110,115,102, 97, 99, 0,100,101,110,115,102, 97, 99, 0,115, 99, 97,116,116,101,114,102, 97, 99, 0,114,101,102,
+108,102, 97, 99, 0,116,105,109,101,102, 97, 99, 0,108,101,110,103,116,104,102, 97, 99, 0, 99,108,117,109,112,102, 97, 99, 0,
+107,105,110,107,102, 97, 99, 0,114,111,117,103,104,102, 97, 99, 0,112, 97,100,101,110,115,102, 97, 99, 0,108,105,102,101,102,
+ 97, 99, 0,115,105,122,101,102, 97, 99, 0,105,118,101,108,102, 97, 99, 0,112,118,101,108,102, 97, 99, 0,115,104, 97,100,111,
+119,102, 97, 99, 0,122,101,110,117,112,102, 97, 99, 0,122,101,110,100,111,119,110,102, 97, 99, 0, 98,108,101,110,100,102, 97,
+ 99, 0,110, 97,109,101, 91, 49, 54, 48, 93, 0, 42,104, 97,110,100,108,101, 0, 42,112,110, 97,109,101, 0, 42,115,116,110, 97,
+109,101,115, 0,115,116,121,112,101,115, 0,118, 97,114,115, 0, 42,118, 97,114,115,116,114, 0, 42,114,101,115,117,108,116, 0,
+ 42, 99,102,114, 97, 0,100, 97,116, 97, 91, 51, 50, 93, 0, 40, 42,100,111,105,116, 41, 40, 41, 0, 40, 42,105,110,115,116, 97,
+110, 99,101, 95,105,110,105,116, 41, 40, 41, 0, 40, 42, 99, 97,108,108, 98, 97, 99,107, 41, 40, 41, 0,118,101,114,115,105,111,
+110, 0, 97, 0,105,112,111,116,121,112,101, 0, 42,105,109, 97, 0, 42, 99,117, 98,101, 91, 54, 93, 0,105,109, 97,116, 91, 52,
+ 93, 91, 52, 93, 0,111, 98,105,109, 97,116, 91, 51, 93, 91, 51, 93, 0,115,116,121,112,101, 0,118,105,101,119,115, 99, 97,108,
+101, 0,110,111,116,108, 97,121, 0, 99,117, 98,101,114,101,115, 0,100,101,112,116,104, 0,114,101, 99, 97,108, 99, 0,108, 97,
+115,116,115,105,122,101, 0,102, 97,108,108,111,102,102, 95,116,121,112,101, 0,102, 97,108,108,111,102,102, 95,115,111,102,116,
+110,101,115,115, 0,114, 97,100,105,117,115, 0, 99,111,108,111,114, 95,115,111,117,114, 99,101, 0,116,111,116,112,111,105,110,
+116,115, 0,112,100,112, 97,100, 0,112,115,121,115, 0,112,115,121,115, 95, 99, 97, 99,104,101, 95,115,112, 97, 99,101, 0,111,
+ 98, 95, 99, 97, 99,104,101, 95,115,112, 97, 99,101, 0, 42,112,111,105,110,116, 95,116,114,101,101, 0, 42,112,111,105,110,116,
+ 95,100, 97,116, 97, 0,110,111,105,115,101, 95,115,105,122,101, 0,110,111,105,115,101, 95,100,101,112,116,104, 0,110,111,105,
+115,101, 95,105,110,102,108,117,101,110, 99,101, 0,110,111,105,115,101, 95, 98, 97,115,105,115, 0,112,100,112, 97,100, 51, 91,
+ 51, 93, 0,110,111,105,115,101, 95,102, 97, 99, 0,115,112,101,101,100, 95,115, 99, 97,108,101, 0, 42, 99,111, 98, 97, 0,114,
+101,115,111,108, 91, 51, 93, 0,105,110,116,101,114,112, 95,116,121,112,101, 0,102,105,108,101, 95,102,111,114,109, 97,116, 0,
+101,120,116,101,110,100, 0,115,109,111,107,101,100, 95,116,121,112,101, 0,105,110,116, 95,109,117,108,116,105,112,108,105,101,
+114, 0,115,116,105,108,108, 95,102,114, 97,109,101, 0,115,111,117,114, 99,101, 95,112, 97,116,104, 91, 50, 52, 48, 93, 0, 42,
+100, 97,116, 97,115,101,116, 0, 99, 97, 99,104,101,100,102,114, 97,109,101, 0,110,111,105,115,101,115,105,122,101, 0,116,117,
+114, 98,117,108, 0, 98,114,105,103,104,116, 0, 99,111,110,116,114, 97,115,116, 0,115, 97,116,117,114, 97,116,105,111,110, 0,
+114,102, 97, 99, 0,103,102, 97, 99, 0, 98,102, 97, 99, 0,102,105,108,116,101,114,115,105,122,101, 0,109,103, 95, 72, 0,109,
+103, 95,108, 97, 99,117,110, 97,114,105,116,121, 0,109,103, 95,111, 99,116, 97,118,101,115, 0,109,103, 95,111,102,102,115,101,
+116, 0,109,103, 95,103, 97,105,110, 0,100,105,115,116, 95, 97,109,111,117,110,116, 0,110,115, 95,111,117,116,115, 99, 97,108,
+101, 0,118,110, 95,119, 49, 0,118,110, 95,119, 50, 0,118,110, 95,119, 51, 0,118,110, 95,119, 52, 0,118,110, 95,109,101,120,
+112, 0,118,110, 95,100,105,115,116,109, 0,118,110, 95, 99,111,108,116,121,112,101, 0,110,111,105,115,101,100,101,112,116,104,
+ 0,110,111,105,115,101,116,121,112,101, 0,110,111,105,115,101, 98, 97,115,105,115, 0,110,111,105,115,101, 98, 97,115,105,115,
+ 50, 0,105,109, 97,102,108, 97,103, 0, 99,114,111,112,120,109,105,110, 0, 99,114,111,112,121,109,105,110, 0, 99,114,111,112,
+120,109, 97,120, 0, 99,114,111,112,121,109, 97,120, 0,116,101,120,102,105,108,116,101,114, 0, 97,102,109, 97,120, 0,120,114,
+101,112,101, 97,116, 0,121,114,101,112,101, 97,116, 0, 99,104,101, 99,107,101,114,100,105,115,116, 0,110, 97, 98,108, 97, 0,
+105,117,115,101,114, 0, 42,110,111,100,101,116,114,101,101, 0, 42,112,108,117,103,105,110, 0, 42,101,110,118, 0, 42,112,100,
+ 0, 42,118,100, 0,117,115,101, 95,110,111,100,101,115, 0,108,111, 99, 91, 51, 93, 0,114,111,116, 91, 51, 93, 0,109, 97,116,
+ 91, 52, 93, 91, 52, 93, 0,109,105,110, 91, 51, 93, 0,109, 97,120, 91, 51, 93, 0,109,111,100,101, 0,116,111,116,101,120, 0,
+115,104,100,119,114, 0,115,104,100,119,103, 0,115,104,100,119, 98, 0,115,104,100,119,112, 97,100, 0,101,110,101,114,103,121,
+ 0,100,105,115,116, 0,115,112,111,116,115,105,122,101, 0,115,112,111,116, 98,108,101,110,100, 0,104, 97,105,110,116, 0, 97,
+116,116, 49, 0, 97,116,116, 50, 0, 42, 99,117,114,102, 97,108,108,111,102,102, 0,115,104, 97,100,115,112,111,116,115,105,122,
+101, 0, 98,105, 97,115, 0,115,111,102,116, 0, 99,111,109,112,114,101,115,115,116,104,114,101,115,104, 0,112, 97,100, 53, 91,
+ 51, 93, 0, 98,117,102,115,105,122,101, 0,115, 97,109,112, 0, 98,117,102,102,101,114,115, 0,102,105,108,116,101,114,116,121,
+112,101, 0, 98,117,102,102,108, 97,103, 0, 98,117,102,116,121,112,101, 0,114, 97,121, 95,115, 97,109,112, 0,114, 97,121, 95,
+115, 97,109,112,121, 0,114, 97,121, 95,115, 97,109,112,122, 0,114, 97,121, 95,115, 97,109,112, 95,116,121,112,101, 0, 97,114,
+101, 97, 95,115,104, 97,112,101, 0, 97,114,101, 97, 95,115,105,122,101, 0, 97,114,101, 97, 95,115,105,122,101,121, 0, 97,114,
+101, 97, 95,115,105,122,101,122, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0,114, 97,121, 95,115, 97,109,112, 95,109,
+101,116,104,111,100, 0,116,101,120, 97, 99,116, 0,115,104, 97,100,104, 97,108,111,115,116,101,112, 0,115,117,110, 95,101,102,
+102,101, 99,116, 95,116,121,112,101, 0,115,107,121, 98,108,101,110,100,116,121,112,101, 0,104,111,114,105,122,111,110, 95, 98,
+114,105,103,104,116,110,101,115,115, 0,115,112,114,101, 97,100, 0,115,117,110, 95, 98,114,105,103,104,116,110,101,115,115, 0,
+115,117,110, 95,115,105,122,101, 0, 98, 97, 99,107,115, 99, 97,116,116,101,114,101,100, 95,108,105,103,104,116, 0,115,117,110,
+ 95,105,110,116,101,110,115,105,116,121, 0, 97,116,109, 95,116,117,114, 98,105,100,105,116,121, 0, 97,116,109, 95,105,110,115,
+ 99, 97,116,116,101,114,105,110,103, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,101,120,116,105,110, 99,116,105,111,110, 95,
+102, 97, 99,116,111,114, 0, 97,116,109, 95,100,105,115,116, 97,110, 99,101, 95,102, 97, 99,116,111,114, 0,115,107,121, 98,108,
+101,110,100,102, 97, 99, 0,115,107,121, 95,101,120,112,111,115,117,114,101, 0,115,107,121, 95, 99,111,108,111,114,115,112, 97,
+ 99,101, 0,112, 97,100, 52, 91, 54, 93, 0, 42,109,116,101,120, 91, 49, 56, 93, 0,112,114, 95,116,101,120,116,117,114,101, 0,
+112, 97,100, 54, 91, 54, 93, 0,100,101,110,115,105,116,121, 0,101,109,105,115,115,105,111,110, 0,115, 99, 97,116,116,101,114,
+105,110,103, 0,114,101,102,108,101, 99,116,105,111,110, 0,101,109,105,115,115,105,111,110, 95, 99,111,108, 91, 51, 93, 0,116,
+114, 97,110,115,109,105,115,115,105,111,110, 95, 99,111,108, 91, 51, 93, 0,114,101,102,108,101, 99,116,105,111,110, 95, 99,111,
+108, 91, 51, 93, 0,100,101,110,115,105,116,121, 95,115, 99, 97,108,101, 0,100,101,112,116,104, 95, 99,117,116,111,102,102, 0,
+ 97,115,121,109,109,101,116,114,121, 0,115,116,101,112,115,105,122,101, 95,116,121,112,101, 0,115,104, 97,100,101,102,108, 97,
+103, 0,115,104, 97,100,101, 95,116,121,112,101, 0,112,114,101, 99, 97, 99,104,101, 95,114,101,115,111,108,117,116,105,111,110,
+ 0,115,116,101,112,115,105,122,101, 0,109,115, 95,100,105,102,102, 0,109,115, 95,105,110,116,101,110,115,105,116,121, 0,109,
+115, 95,115,112,114,101, 97,100, 0,109, 97,116,101,114,105, 97,108, 95,116,121,112,101, 0,115,112,101, 99,114, 0,115,112,101,
+ 99,103, 0,115,112,101, 99, 98, 0,109,105,114,114, 0,109,105,114,103, 0,109,105,114, 98, 0, 97,109, 98,114, 0, 97,109, 98,
+ 98, 0, 97,109, 98,103, 0, 97,109, 98, 0,101,109,105,116, 0, 97,110,103, 0,115,112,101, 99,116,114, 97, 0,114, 97,121, 95,
+109,105,114,114,111,114, 0, 97,108,112,104, 97, 0,114,101,102, 0,115,112,101, 99, 0,122,111,102,102,115, 0, 97,100,100, 0,
+116,114, 97,110,115,108,117, 99,101,110, 99,121, 0,118,111,108, 0,102,114,101,115,110,101,108, 95,109,105,114, 0,102,114,101,
+115,110,101,108, 95,109,105,114, 95,105, 0,102,114,101,115,110,101,108, 95,116,114, 97, 0,102,114,101,115,110,101,108, 95,116,
+114, 97, 95,105, 0,102,105,108,116,101,114, 0,116,120, 95,108,105,109,105,116, 0,116,120, 95,102, 97,108,108,111,102,102, 0,
+114, 97,121, 95,100,101,112,116,104, 0,114, 97,121, 95,100,101,112,116,104, 95,116,114, 97, 0,104, 97,114, 0,115,101,101,100,
+ 49, 0,115,101,101,100, 50, 0,103,108,111,115,115, 95,109,105,114, 0,103,108,111,115,115, 95,116,114, 97, 0,115, 97,109,112,
+ 95,103,108,111,115,115, 95,109,105,114, 0,115, 97,109,112, 95,103,108,111,115,115, 95,116,114, 97, 0, 97,100, 97,112,116, 95,
+116,104,114,101,115,104, 95,109,105,114, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 95,116,114, 97, 0, 97,110,105,115,
+111, 95,103,108,111,115,115, 95,109,105,114, 0,100,105,115,116, 95,109,105,114, 0,102, 97,100,101,116,111, 95,109,105,114, 0,
+115,104, 97,100,101, 95,102,108, 97,103, 0,109,111,100,101, 95,108, 0,102,108, 97,114,101, 99, 0,115,116, 97,114, 99, 0,108,
+105,110,101, 99, 0,114,105,110,103, 99, 0,104, 97,115,105,122,101, 0,102,108, 97,114,101,115,105,122,101, 0,115,117, 98,115,
+105,122,101, 0,102,108, 97,114,101, 98,111,111,115,116, 0,115,116,114, 97,110,100, 95,115,116, 97, 0,115,116,114, 97,110,100,
+ 95,101,110,100, 0,115,116,114, 97,110,100, 95,101, 97,115,101, 0,115,116,114, 97,110,100, 95,115,117,114,102,110,111,114, 0,
+115,116,114, 97,110,100, 95,109,105,110, 0,115,116,114, 97,110,100, 95,119,105,100,116,104,102, 97,100,101, 0,115,116,114, 97,
+110,100, 95,117,118,110, 97,109,101, 91, 51, 50, 93, 0,115, 98,105, 97,115, 0,108, 98,105, 97,115, 0,115,104, 97,100, 95, 97,
+108,112,104, 97, 0,115,101,112,116,101,120, 0,114,103, 98,115,101,108, 0,112,114, 95,116,121,112,101, 0,112,114, 95, 98, 97,
+ 99,107, 0,112,114, 95,108, 97,109,112, 0,109,108, 95,102,108, 97,103, 0,100,105,102,102, 95,115,104, 97,100,101,114, 0,115,
+112,101, 99, 95,115,104, 97,100,101,114, 0,114,111,117,103,104,110,101,115,115, 0,114,101,102,114, 97, 99, 0,112, 97,114, 97,
+109, 91, 52, 93, 0,114,109,115, 0,100, 97,114,107,110,101,115,115, 0, 42,114, 97,109,112, 95, 99,111,108, 0, 42,114, 97,109,
+112, 95,115,112,101, 99, 0,114, 97,109,112,105,110, 95, 99,111,108, 0,114, 97,109,112,105,110, 95,115,112,101, 99, 0,114, 97,
+109,112, 98,108,101,110,100, 95, 99,111,108, 0,114, 97,109,112, 98,108,101,110,100, 95,115,112,101, 99, 0,114, 97,109,112, 95,
+115,104,111,119, 0,112, 97,100, 51, 0,114, 97,109,112,102, 97, 99, 95, 99,111,108, 0,114, 97,109,112,102, 97, 99, 95,115,112,
+101, 99, 0, 42,103,114,111,117,112, 0,102,114,105, 99,116,105,111,110, 0,102,104, 0,114,101,102,108,101, 99,116, 0,102,104,
+100,105,115,116, 0,120,121,102,114,105, 99,116, 0,100,121,110, 97,109,111,100,101, 0,115,115,115, 95,114, 97,100,105,117,115,
+ 91, 51, 93, 0,115,115,115, 95, 99,111,108, 91, 51, 93, 0,115,115,115, 95,101,114,114,111,114, 0,115,115,115, 95,115, 99, 97,
+108,101, 0,115,115,115, 95,105,111,114, 0,115,115,115, 95, 99,111,108,102, 97, 99, 0,115,115,115, 95,116,101,120,102, 97, 99,
+ 0,115,115,115, 95,102,114,111,110,116, 0,115,115,115, 95, 98, 97, 99,107, 0,115,115,115, 95,102,108, 97,103, 0,115,115,115,
+ 95,112,114,101,115,101,116, 0,109, 97,112,116,111, 95,116,101,120,116,117,114,101,100, 0,112, 97,100, 52, 0,103,112,117,109,
+ 97,116,101,114,105, 97,108, 0,110, 97,109,101, 91, 50, 53, 54, 93, 0, 42, 98, 98, 0,105, 49, 0,106, 49, 0,107, 49, 0,105,
+ 50, 0,106, 50, 0,107, 50, 0,115,101,108, 99,111,108, 49, 0,115,101,108, 99,111,108, 50, 0,122, 0,113,117, 97,116, 91, 52,
+ 93, 0,101,120,112,120, 0,101,120,112,121, 0,101,120,112,122, 0,114, 97,100, 0,114, 97,100, 50, 0,115, 0, 42,109, 97,116,
+ 0, 42,105,109, 97,116, 0,101,108,101,109,115, 0,100,105,115,112, 0, 42,101,100,105,116,101,108,101,109,115, 0, 42, 42,109,
+ 97,116, 0,102,108, 97,103, 50, 0,116,111,116, 99,111,108, 0,119,105,114,101,115,105,122,101, 0,114,101,110,100,101,114,115,
+105,122,101, 0,116,104,114,101,115,104, 0, 42,108, 97,115,116,101,108,101,109, 0,118,101, 99, 91, 51, 93, 91, 51, 93, 0, 97,
+108,102, 97, 0,119,101,105,103,104,116, 0,104, 49, 0,104, 50, 0,102, 49, 0,102, 50, 0,102, 51, 0,104,105,100,101, 0,118,
+101, 99, 91, 52, 93, 0,109, 97,116, 95,110,114, 0,112,110,116,115,117, 0,112,110,116,115,118, 0,114,101,115,111,108,117, 0,
+114,101,115,111,108,118, 0,111,114,100,101,114,117, 0,111,114,100,101,114,118, 0,102,108, 97,103,117, 0,102,108, 97,103,118,
+ 0, 42,107,110,111,116,115,117, 0, 42,107,110,111,116,115,118, 0,116,105,108,116, 95,105,110,116,101,114,112, 0,114, 97,100,
+105,117,115, 95,105,110,116,101,114,112, 0, 99,104, 97,114,105,100,120, 0,107,101,114,110, 0,119, 0,104, 0,110,117,114, 98,
+115, 0, 42,107,101,121,105,110,100,101,120, 0,115,104, 97,112,101,110,114, 0,110,117,114, 98, 0, 42,101,100,105,116,110,117,
+114, 98, 0, 42, 98,101,118,111, 98,106, 0, 42,116, 97,112,101,114,111, 98,106, 0, 42,116,101,120,116,111,110, 99,117,114,118,
+101, 0, 42,112, 97,116,104, 0, 42,107,101,121, 0, 98,101,118, 0,100,114, 97,119,102,108, 97,103, 0,116,119,105,115,116, 95,
+109,111,100,101, 0,116,119,105,115,116, 95,115,109,111,111,116,104, 0,115,109, 97,108,108, 99, 97,112,115, 95,115, 99, 97,108,
+101, 0,112, 97,116,104,108,101,110, 0, 98,101,118,114,101,115,111,108, 0,119,105,100,116,104, 0,101,120,116, 49, 0,101,120,
+116, 50, 0,114,101,115,111,108,117, 95,114,101,110, 0,114,101,115,111,108,118, 95,114,101,110, 0, 97, 99,116,110,117, 0, 42,
+108, 97,115,116,115,101,108, 0,115,112, 97, 99,101,109,111,100,101, 0,115,112, 97, 99,105,110,103, 0,108,105,110,101,100,105,
+115,116, 0,115,104,101, 97,114, 0,102,115,105,122,101, 0,119,111,114,100,115,112, 97, 99,101, 0,117,108,112,111,115, 0,117,
+108,104,101,105,103,104,116, 0,120,111,102, 0,121,111,102, 0,108,105,110,101,119,105,100,116,104, 0, 42,115,116,114, 0, 42,
+115,101,108, 98,111,120,101,115, 0, 42,101,100,105,116,102,111,110,116, 0,102, 97,109,105,108,121, 91, 50, 52, 93, 0, 42,118,
+102,111,110,116, 0, 42,118,102,111,110,116, 98, 0, 42,118,102,111,110,116,105, 0, 42,118,102,111,110,116, 98,105, 0,115,101,
+112, 99,104, 97,114, 0, 99,116,105,109,101, 0,116,111,116, 98,111,120, 0, 97, 99,116, 98,111,120, 0, 42,116, 98, 0,115,101,
+108,115,116, 97,114,116, 0,115,101,108,101,110,100, 0, 42,115,116,114,105,110,102,111, 0, 99,117,114,105,110,102,111, 0,101,
+102,102,101, 99,116, 0, 42,109,102, 97, 99,101, 0, 42,109,116,102, 97, 99,101, 0, 42,116,102, 97, 99,101, 0, 42,109,118,101,
+114,116, 0, 42,109,101,100,103,101, 0, 42,100,118,101,114,116, 0, 42,109, 99,111,108, 0, 42,109,115,116,105, 99,107,121, 0,
+ 42,116,101,120, 99,111,109,101,115,104, 0, 42,109,115,101,108,101, 99,116, 0, 42,101,100,105,116, 95,109,101,115,104, 0,118,
+100, 97,116, 97, 0,101,100, 97,116, 97, 0,102,100, 97,116, 97, 0,116,111,116,101,100,103,101, 0,116,111,116,102, 97, 99,101,
+ 0,116,111,116,115,101,108,101, 99,116, 0, 97, 99,116, 95,102, 97, 99,101, 0,101,100,105,116,102,108, 97,103, 0, 99,117, 98,
+101,109, 97,112,115,105,122,101, 0,115,109,111,111,116,104,114,101,115,104, 0,115,117, 98,100,105,118, 0,115,117, 98,100,105,
+118,114, 0,115,117, 98,115,117,114,102,116,121,112,101, 0, 42,109,114, 0, 42,112,118, 0, 42,116,112, 97,103,101, 0,117,118,
+ 91, 52, 93, 91, 50, 93, 0, 99,111,108, 91, 52, 93, 0,116,114, 97,110,115,112, 0,116,105,108,101, 0,117,110,119,114, 97,112,
+ 0,118, 49, 0,118, 50, 0,118, 51, 0,118, 52, 0,101,100, 99,111,100,101, 0, 99,114,101, 97,115,101, 0, 98,119,101,105,103,
+104,116, 0,100,101,102, 95,110,114, 0, 42,100,119, 0,116,111,116,119,101,105,103,104,116, 0, 99,111, 91, 51, 93, 0,110,111,
+ 91, 51, 93, 0,112, 97,100, 91, 50, 93, 0,117,118, 91, 50, 93, 0, 99,111, 91, 50, 93, 0,105,110,100,101,120, 0,102, 0,105,
+ 0,115, 91, 50, 53, 54, 93, 0,116,111,116,100,105,115,112, 0, 40, 42,100,105,115,112,115, 41, 40, 41, 0,118, 91, 52, 93, 0,
+109,105,100, 0,118, 91, 50, 93, 0, 42,102, 97, 99,101,115, 0, 42, 99,111,108,102, 97, 99,101,115, 0, 42,101,100,103,101,115,
+ 0, 42,118,101,114,116,115, 0,108,101,118,101,108,115, 0,108,101,118,101,108, 95, 99,111,117,110,116, 0, 99,117,114,114,101,
+110,116, 0,110,101,119,108,118,108, 0,101,100,103,101,108,118,108, 0,112,105,110,108,118,108, 0,114,101,110,100,101,114,108,
+118,108, 0,117,115,101, 95, 99,111,108, 0, 42,101,100,103,101, 95,102,108, 97,103,115, 0, 42,101,100,103,101, 95, 99,114,101,
+ 97,115,101,115, 0, 42,118,101,114,116, 95,109, 97,112, 0, 42,101,100,103,101, 95,109, 97,112, 0, 42,111,108,100, 95,102, 97,
+ 99,101,115, 0, 42,111,108,100, 95,101,100,103,101,115, 0,115,116, 97, 99,107,105,110,100,101,120, 0, 42,101,114,114,111,114,
+ 0,109,111,100,105,102,105,101,114, 0,115,117, 98,100,105,118, 84,121,112,101, 0,114,101,110,100,101,114, 76,101,118,101,108,
+115, 0, 42,101,109, 67, 97, 99,104,101, 0, 42,109, 67, 97, 99,104,101, 0,100,101,102, 97,120,105,115, 0,112, 97,100, 91, 54,
+ 93, 0,108,101,110,103,116,104, 0,114, 97,110,100,111,109,105,122,101, 0,115,101,101,100, 0, 42,111, 98, 95, 97,114,109, 0,
+ 42,115,116, 97,114,116, 95, 99, 97,112, 0, 42,101,110,100, 95, 99, 97,112, 0, 42, 99,117,114,118,101, 95,111, 98, 0, 42,111,
+102,102,115,101,116, 95,111, 98, 0,111,102,102,115,101,116, 91, 51, 93, 0,115, 99, 97,108,101, 91, 51, 93, 0,109,101,114,103,
+101, 95,100,105,115,116, 0,102,105,116, 95,116,121,112,101, 0,111,102,102,115,101,116, 95,116,121,112,101, 0, 99,111,117,110,
+116, 0, 97,120,105,115, 0,116,111,108,101,114, 97,110, 99,101, 0, 42,109,105,114,114,111,114, 95,111, 98, 0,115,112,108,105,
+116, 95, 97,110,103,108,101, 0,118, 97,108,117,101, 0,114,101,115, 0,118, 97,108, 95,102,108, 97,103,115, 0,108,105,109, 95,
+102,108, 97,103,115, 0,101, 95,102,108, 97,103,115, 0, 98,101,118,101,108, 95, 97,110,103,108,101, 0,100,101,102,103,114,112,
+ 95,110, 97,109,101, 91, 51, 50, 93, 0, 42,100,111,109, 97,105,110, 0, 42,102,108,111,119, 0, 42, 99,111,108,108, 0,116,105,
+109,101, 0, 42,116,101,120,116,117,114,101, 0,115,116,114,101,110,103,116,104, 0,100,105,114,101, 99,116,105,111,110, 0,109,
+105,100,108,101,118,101,108, 0,116,101,120,109, 97,112,112,105,110,103, 0, 42,109, 97,112, 95,111, 98,106,101, 99,116, 0,117,
+118,108, 97,121,101,114, 95,110, 97,109,101, 91, 51, 50, 93, 0,117,118,108, 97,121,101,114, 95,116,109,112, 0, 42,112,114,111,
+106,101, 99,116,111,114,115, 91, 49, 48, 93, 0, 42,105,109, 97,103,101, 0,110,117,109, 95,112,114,111,106,101, 99,116,111,114,
+115, 0, 97,115,112,101, 99,116,120, 0, 97,115,112,101, 99,116,121, 0,115, 99, 97,108,101,120, 0,115, 99, 97,108,101,121, 0,
+112,101,114, 99,101,110,116, 0,102, 97, 99,101, 67,111,117,110,116, 0,102, 97, 99, 0,114,101,112,101, 97,116, 0, 42,111, 98,
+106,101, 99,116, 99,101,110,116,101,114, 0,115,116, 97,114,116,120, 0,115,116, 97,114,116,121, 0,104,101,105,103,104,116, 0,
+110, 97,114,114,111,119, 0,115,112,101,101,100, 0,100, 97,109,112, 0,102, 97,108,108,111,102,102, 0,116,105,109,101,111,102,
+102,115, 0,108,105,102,101,116,105,109,101, 0,100,101,102,111,114,109,102,108, 97,103, 0,109,117,108,116,105, 0, 42,112,114,
+101,118, 67,111,115, 0,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, 93, 0,112, 97,114,101,110,116,105,110,118, 91, 52, 93,
+ 91, 52, 93, 0, 99,101,110,116, 91, 51, 93, 0, 42,105,110,100,101,120, 97,114, 0,116,111,116,105,110,100,101,120, 0,102,111,
+114, 99,101, 0, 42, 99,108,111,116,104, 79, 98,106,101, 99,116, 0, 42,115,105,109, 95,112, 97,114,109,115, 0, 42, 99,111,108,
+108, 95,112, 97,114,109,115, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 0,112,116, 99, 97, 99,104,101,115, 0, 42,120,
+ 0, 42,120,110,101,119, 0, 42,120,111,108,100, 0, 42, 99,117,114,114,101,110,116, 95,120,110,101,119, 0, 42, 99,117,114,114,
+101,110,116, 95,120, 0, 42, 99,117,114,114,101,110,116, 95,118, 0, 42,109,102, 97, 99,101,115, 0,110,117,109,118,101,114,116,
+115, 0,110,117,109,102, 97, 99,101,115, 0, 42, 98,118,104,116,114,101,101, 0, 42,118, 0, 42,100,109, 0, 99,102,114, 97, 0,
+111,112,101,114, 97,116,105,111,110, 0,118,101,114,116,101,120, 0,116,111,116,105,110,102,108,117,101,110, 99,101, 0,103,114,
+105,100,115,105,122,101, 0, 42, 98,105,110,100,105,110,102,108,117,101,110, 99,101,115, 0, 42, 98,105,110,100,111,102,102,115,
+101,116,115, 0, 42, 98,105,110,100, 99, 97,103,101, 99,111,115, 0,116,111,116, 99, 97,103,101,118,101,114,116, 0, 42,100,121,
+110,103,114,105,100, 0, 42,100,121,110,105,110,102,108,117,101,110, 99,101,115, 0, 42,100,121,110,118,101,114,116,115, 0, 42,
+112, 97,100, 50, 0,100,121,110,103,114,105,100,115,105,122,101, 0,100,121,110, 99,101,108,108,109,105,110, 91, 51, 93, 0,100,
+121,110, 99,101,108,108,119,105,100,116,104, 0, 98,105,110,100,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42, 98,105,110,100,119,
+101,105,103,104,116,115, 0, 42, 98,105,110,100, 99,111,115, 0, 40, 42, 98,105,110,100,102,117,110, 99, 41, 40, 41, 0, 42,112,
+115,121,115, 0,116,111,116,100,109,118,101,114,116, 0,116,111,116,100,109,101,100,103,101, 0,116,111,116,100,109,102, 97, 99,
+101, 0,112,111,115,105,116,105,111,110, 0,114, 97,110,100,111,109, 95,112,111,115,105,116,105,111,110, 0, 42,102, 97, 99,101,
+112, 97, 0,118,103,114,111,117,112, 0,112,114,111,116,101, 99,116, 0,108,118,108, 0,115, 99,117,108,112,116,108,118,108, 0,
+116,111,116,108,118,108, 0,115,105,109,112,108,101, 0, 42,102,115,115, 0, 42,116, 97,114,103,101,116, 0, 42, 97,117,120, 84,
+ 97,114,103,101,116, 0,118,103,114,111,117,112, 95,110, 97,109,101, 91, 51, 50, 93, 0,107,101,101,112, 68,105,115,116, 0,115,
+104,114,105,110,107, 84,121,112,101, 0,115,104,114,105,110,107, 79,112,116,115, 0,112,114,111,106, 65,120,105,115, 0,115,117,
+ 98,115,117,114,102, 76,101,118,101,108,115, 0, 42,111,114,105,103,105,110, 0,102, 97, 99,116,111,114, 0,108,105,109,105,116,
+ 91, 50, 93, 0,111,114,105,103,105,110, 79,112,116,115, 0,111,102,102,115,101,116, 95,102, 97, 99, 0, 99,114,101, 97,115,101,
+ 95,105,110,110,101,114, 0, 99,114,101, 97,115,101, 95,111,117,116,101,114, 0, 99,114,101, 97,115,101, 95,114,105,109, 0, 42,
+111, 98, 95, 97,120,105,115, 0,115,116,101,112,115, 0,114,101,110,100,101,114, 95,115,116,101,112,115, 0,105,116,101,114, 0,
+115, 99,114,101,119, 95,111,102,115, 0, 97,110,103,108,101, 0, 42,108, 97,116,116, 0,112,110,116,115,119, 0,111,112,110,116,
+115,117, 0,111,112,110,116,115,118, 0,111,112,110,116,115,119, 0,116,121,112,101,117, 0,116,121,112,101,118, 0,116,121,112,
+101,119, 0,102,117, 0,102,118, 0,102,119, 0,100,117, 0,100,118, 0,100,119, 0, 42,100,101,102, 0, 42,108, 97,116,116,105,
+ 99,101,100, 97,116, 97, 0,108, 97,116,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42,101,100,105,116,108, 97,116,116, 0,118,101,
+ 99, 91, 56, 93, 91, 51, 93, 0, 42,115, 99,117,108,112,116, 0,112, 97,114,116,121,112,101, 0,112, 97,114, 49, 0,112, 97,114,
+ 50, 0,112, 97,114, 51, 0,112, 97,114,115,117, 98,115,116,114, 91, 51, 50, 93, 0, 42,116,114, 97, 99,107, 0, 42,112,114,111,
+120,121, 0, 42,112,114,111,120,121, 95,103,114,111,117,112, 0, 42,112,114,111,120,121, 95,102,114,111,109, 0, 42, 97, 99,116,
+105,111,110, 0, 42,112,111,115,101,108,105, 98, 0, 42,112,111,115,101, 0, 42,103,112,100, 0, 97,118,115, 0, 42,109,112, 97,
+116,104, 0, 99,111,110,115,116,114, 97,105,110,116, 67,104, 97,110,110,101,108,115, 0,100,101,102, 98, 97,115,101, 0,109,111,
+100,105,102,105,101,114,115, 0,114,101,115,116,111,114,101, 95,109,111,100,101, 0, 42,109, 97,116, 98,105,116,115, 0, 97, 99,
+116, 99,111,108, 0,100,108,111, 99, 91, 51, 93, 0,111,114,105,103, 91, 51, 93, 0,100,115,105,122,101, 91, 51, 93, 0,100,114,
+111,116, 91, 51, 93, 0,100,113,117, 97,116, 91, 52, 93, 0,114,111,116, 65,120,105,115, 91, 51, 93, 0,100,114,111,116, 65,120,
+105,115, 91, 51, 93, 0,114,111,116, 65,110,103,108,101, 0,100,114,111,116, 65,110,103,108,101, 0,111, 98,109, 97,116, 91, 52,
+ 93, 91, 52, 93, 0, 99,111,110,115,116,105,110,118, 91, 52, 93, 91, 52, 93, 0,108, 97,121, 0, 99,111,108, 98,105,116,115, 0,
+116,114, 97,110,115,102,108, 97,103, 0,112,114,111,116,101, 99,116,102,108, 97,103, 0,116,114, 97, 99,107,102,108, 97,103, 0,
+117,112,102,108, 97,103, 0,110,108, 97,102,108, 97,103, 0,105,112,111,102,108, 97,103, 0,105,112,111,119,105,110, 0,115, 99,
+ 97,102,108, 97,103, 0,115, 99, 97,118,105,115,102,108, 97,103, 0, 98,111,117,110,100,116,121,112,101, 0,100,117,112,111,110,
+ 0,100,117,112,111,102,102, 0,100,117,112,115,116, 97, 0,100,117,112,101,110,100, 0,115,102, 0,109, 97,115,115, 0,100, 97,
+109,112,105,110,103, 0,105,110,101,114,116,105, 97, 0,102,111,114,109,102, 97, 99,116,111,114, 0,114,100, 97,109,112,105,110,
+103, 0,109, 97,114,103,105,110, 0,109, 97,120, 95,118,101,108, 0,109,105,110, 95,118,101,108, 0,109, 95, 99,111,110,116, 97,
+ 99,116, 80,114,111, 99,101,115,115,105,110,103, 84,104,114,101,115,104,111,108,100, 0,114,111,116,109,111,100,101, 0,100,116,
+ 0,100,116,120, 0,101,109,112,116,121, 95,100,114, 97,119,116,121,112,101, 0,112, 97,100, 49, 91, 51, 93, 0,101,109,112,116,
+121, 95,100,114, 97,119,115,105,122,101, 0,100,117,112,102, 97, 99,101,115, 99, 97, 0,112,114,111,112, 0,115,101,110,115,111,
+114,115, 0, 99,111,110,116,114,111,108,108,101,114,115, 0, 97, 99,116,117, 97,116,111,114,115, 0, 98, 98,115,105,122,101, 91,
+ 51, 93, 0, 97, 99,116,100,101,102, 0,103, 97,109,101,102,108, 97,103, 0,103, 97,109,101,102,108, 97,103, 50, 0, 42, 98,115,
+111,102,116, 0,115,111,102,116,102,108, 97,103, 0, 97,110,105,115,111,116,114,111,112,105, 99, 70,114,105, 99,116,105,111,110,
+ 91, 51, 93, 0, 99,111,110,115,116,114, 97,105,110,116,115, 0,110,108, 97,115,116,114,105,112,115, 0,104,111,111,107,115, 0,
+112, 97,114,116,105, 99,108,101,115,121,115,116,101,109, 0, 42,115,111,102,116, 0, 42,100,117,112, 95,103,114,111,117,112, 0,
+102,108,117,105,100,115,105,109, 70,108, 97,103, 0,114,101,115,116,114,105, 99,116,102,108, 97,103, 0,115,104, 97,112,101,102,
+108, 97,103, 0,114,101, 99, 97,108, 99,111, 0, 98,111,100,121, 95,116,121,112,101, 0, 42,102,108,117,105,100,115,105,109, 83,
+101,116,116,105,110,103,115, 0, 42,100,101,114,105,118,101,100, 68,101,102,111,114,109, 0, 42,100,101,114,105,118,101,100, 70,
+105,110, 97,108, 0,108, 97,115,116, 68, 97,116, 97, 77, 97,115,107, 0,115,116, 97,116,101, 0,105,110,105,116, 95,115,116, 97,
+116,101, 0,103,112,117,108, 97,109,112, 0,112, 99, 95,105,100,115, 0, 42,100,117,112,108,105,108,105,115,116, 0, 99,117,114,
+105,110,100,101,120, 0, 97, 99,116,105,118,101, 0,111,114,105,103,108, 97,121, 0,110,111, 95,100,114, 97,119, 0, 97,110,105,
+109, 97,116,101,100, 0,111,109, 97,116, 91, 52, 93, 91, 52, 93, 0,111,114, 99,111, 91, 51, 93, 0,100,101,102,108,101, 99,116,
+ 0,102,111,114, 99,101,102,105,101,108,100, 0,115,104, 97,112,101, 0,116,101,120, 95,109,111,100,101, 0,107,105,110,107, 0,
+107,105,110,107, 95, 97,120,105,115, 0,122,100,105,114, 0,102, 95,115,116,114,101,110,103,116,104, 0,102, 95,100, 97,109,112,
+ 0,102, 95,102,108,111,119, 0,102, 95,115,105,122,101, 0,102, 95,112,111,119,101,114, 0,109, 97,120,100,105,115,116, 0,109,
+105,110,100,105,115,116, 0,102, 95,112,111,119,101,114, 95,114, 0,109, 97,120,114, 97,100, 0,109,105,110,114, 97,100, 0,112,
+100,101,102, 95,100, 97,109,112, 0,112,100,101,102, 95,114,100, 97,109,112, 0,112,100,101,102, 95,112,101,114,109, 0,112,100,
+101,102, 95,102,114,105, 99,116, 0,112,100,101,102, 95,114,102,114,105, 99,116, 0,112,100,101,102, 95,115,116,105, 99,107,110,
+101,115,115, 0, 97, 98,115,111,114,112,116,105,111,110, 0,112,100,101,102, 95,115, 98,100, 97,109,112, 0,112,100,101,102, 95,
+115, 98,105,102,116, 0,112,100,101,102, 95,115, 98,111,102,116, 0, 99,108,117,109,112, 95,102, 97, 99, 0, 99,108,117,109,112,
+ 95,112,111,119, 0,107,105,110,107, 95,102,114,101,113, 0,107,105,110,107, 95,115,104, 97,112,101, 0,107,105,110,107, 95, 97,
+109,112, 0,102,114,101,101, 95,101,110,100, 0,116,101,120, 95,110, 97, 98,108, 97, 0, 42,114,110,103, 0,102, 95,110,111,105,
+115,101, 0,119,101,105,103,104,116, 91, 49, 51, 93, 0,103,108,111, 98, 97,108, 95,103,114, 97,118,105,116,121, 0,114,116, 91,
+ 51, 93, 0,116,111,116,100, 97,116, 97, 0,102,114, 97,109,101, 0,116,111,116,112,111,105,110,116, 0,100, 97,116, 97, 95,116,
+121,112,101,115, 0, 42,100, 97,116, 97, 91, 56, 93, 0, 42, 99,117,114, 91, 56, 93, 0,101,120,116,114, 97,100, 97,116, 97, 0,
+115,116,101,112, 0,115,105,109,102,114, 97,109,101, 0,115,116, 97,114,116,102,114, 97,109,101, 0,101,110,100,102,114, 97,109,
+101, 0,101,100,105,116,102,114, 97,109,101, 0,108, 97,115,116, 95,101,120, 97, 99,116, 0, 99,111,109,112,114,101,115,115,105,
+111,110, 0,110, 97,109,101, 91, 54, 52, 93, 0,112,114,101,118, 95,110, 97,109,101, 91, 54, 52, 93, 0,105,110,102,111, 91, 54,
+ 52, 93, 0,112, 97,116,104, 91, 50, 52, 48, 93, 0, 42, 99, 97, 99,104,101,100, 95,102,114, 97,109,101,115, 0,109,101,109, 95,
+ 99, 97, 99,104,101, 0, 42,101,100,105,116, 0, 40, 42,102,114,101,101, 95,101,100,105,116, 41, 40, 41, 0,108,105,110, 83,116,
+105,102,102, 0, 97,110,103, 83,116,105,102,102, 0,118,111,108,117,109,101, 0,118,105,116,101,114, 97,116,105,111,110,115, 0,
+112,105,116,101,114, 97,116,105,111,110,115, 0,100,105,116,101,114, 97,116,105,111,110,115, 0, 99,105,116,101,114, 97,116,105,
+111,110,115, 0,107, 83, 82, 72, 82, 95, 67, 76, 0,107, 83, 75, 72, 82, 95, 67, 76, 0,107, 83, 83, 72, 82, 95, 67, 76, 0,107,
+ 83, 82, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 75, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 83, 95, 83, 80, 76, 84, 95,
+ 67, 76, 0,107, 86, 67, 70, 0,107, 68, 80, 0,107, 68, 71, 0,107, 76, 70, 0,107, 80, 82, 0,107, 86, 67, 0,107, 68, 70, 0,
+107, 77, 84, 0,107, 67, 72, 82, 0,107, 75, 72, 82, 0,107, 83, 72, 82, 0,107, 65, 72, 82, 0, 99,111,108,108,105,115,105,111,
+110,102,108, 97,103,115, 0,110,117,109, 99,108,117,115,116,101,114,105,116,101,114, 97,116,105,111,110,115, 0,119,101,108,100,
+105,110,103, 0,116,111,116,115,112,114,105,110,103, 0, 42, 98,112,111,105,110,116, 0, 42, 98,115,112,114,105,110,103, 0,109,
+115,103, 95,108,111, 99,107, 0,109,115,103, 95,118, 97,108,117,101, 0,110,111,100,101,109, 97,115,115, 0,110, 97,109,101,100,
+ 86, 71, 95, 77, 97,115,115, 91, 51, 50, 93, 0,103,114, 97,118, 0,109,101,100,105, 97,102,114,105, 99,116, 0,114,107,108,105,
+109,105,116, 0,112,104,121,115,105, 99,115, 95,115,112,101,101,100, 0,103,111, 97,108,115,112,114,105,110,103, 0,103,111, 97,
+108,102,114,105, 99,116, 0,109,105,110,103,111, 97,108, 0,109, 97,120,103,111, 97,108, 0,100,101,102,103,111, 97,108, 0,118,
+101,114,116,103,114,111,117,112, 0,110, 97,109,101,100, 86, 71, 95, 83,111,102,116,103,111, 97,108, 91, 51, 50, 93, 0,102,117,
+122,122,121,110,101,115,115, 0,105,110,115,112,114,105,110,103, 0,105,110,102,114,105, 99,116, 0,110, 97,109,101,100, 86, 71,
+ 95, 83,112,114,105,110,103, 95, 75, 91, 51, 50, 93, 0,101,102,114, 97, 0,105,110,116,101,114,118, 97,108, 0,108,111, 99, 97,
+108, 0,115,111,108,118,101,114,102,108, 97,103,115, 0, 42, 42,107,101,121,115, 0,116,111,116,112,111,105,110,116,107,101,121,
+ 0,115,101, 99,111,110,100,115,112,114,105,110,103, 0, 99,111,108, 98, 97,108,108, 0, 98, 97,108,108,100, 97,109,112, 0, 98,
+ 97,108,108,115,116,105,102,102, 0,115, 98, 99, 95,109,111,100,101, 0, 97,101,114,111,101,100,103,101, 0,109,105,110,108,111,
+111,112,115, 0,109, 97,120,108,111,111,112,115, 0, 99,104,111,107,101, 0,115,111,108,118,101,114, 95, 73, 68, 0,112,108, 97,
+115,116,105, 99, 0,115,112,114,105,110,103,112,114,101,108,111, 97,100, 0, 42,115, 99,114, 97,116, 99,104, 0,115,104,101, 97,
+114,115,116,105,102,102, 0,105,110,112,117,115,104, 0, 42,112,111,105,110,116, 99, 97, 99,104,101, 0, 42,101,102,102,101, 99,
+116,111,114, 95,119,101,105,103,104,116,115, 0,108, 99,111,109, 91, 51, 93, 0,108,114,111,116, 91, 51, 93, 91, 51, 93, 0,108,
+115, 99, 97,108,101, 91, 51, 93, 91, 51, 93, 0,112, 97,100, 52, 91, 52, 93, 0, 42,102,109,100, 0,115,104,111,119, 95, 97,100,
+118, 97,110, 99,101,100,111,112,116,105,111,110,115, 0,114,101,115,111,108,117,116,105,111,110,120,121,122, 0,112,114,101,118,
+105,101,119,114,101,115,120,121,122, 0,114,101, 97,108,115,105,122,101, 0,103,117,105, 68,105,115,112,108, 97,121, 77,111,100,
+101, 0,114,101,110,100,101,114, 68,105,115,112,108, 97,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 86, 97,108,
+117,101, 0,118,105,115, 99,111,115,105,116,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 69,120,112,111,110,101,
+110,116, 0,103,114, 97,118,120, 0,103,114, 97,118,121, 0,103,114, 97,118,122, 0, 97,110,105,109, 83,116, 97,114,116, 0, 97,
+110,105,109, 69,110,100, 0, 98, 97,107,101, 83,116, 97,114,116, 0, 98, 97,107,101, 69,110,100, 0,103,115,116, 97,114, 0,109,
+ 97,120, 82,101,102,105,110,101, 0,105,110,105, 86,101,108,120, 0,105,110,105, 86,101,108,121, 0,105,110,105, 86,101,108,122,
+ 0, 42,111,114,103, 77,101,115,104, 0, 42,109,101,115,104, 83,117,114,102, 97, 99,101, 0, 42,109,101,115,104, 66, 66, 0,115,
+117,114,102,100, 97,116, 97, 80, 97,116,104, 91, 50, 52, 48, 93, 0, 98, 98, 83,116, 97,114,116, 91, 51, 93, 0, 98, 98, 83,105,
+122,101, 91, 51, 93, 0,116,121,112,101, 70,108, 97,103,115, 0,100,111,109, 97,105,110, 78,111,118,101, 99,103,101,110, 0,118,
+111,108,117,109,101, 73,110,105,116, 84,121,112,101, 0,112, 97,114,116, 83,108,105,112, 86, 97,108,117,101, 0,103,101,110,101,
+114, 97,116,101, 84,114, 97, 99,101,114,115, 0,103,101,110,101,114, 97,116,101, 80, 97,114,116,105, 99,108,101,115, 0,115,117,
+114,102, 97, 99,101, 83,109,111,111,116,104,105,110,103, 0,115,117,114,102, 97, 99,101, 83,117, 98,100,105,118,115, 0,112, 97,
+114,116,105, 99,108,101, 73,110,102, 83,105,122,101, 0,112, 97,114,116,105, 99,108,101, 73,110,102, 65,108,112,104, 97, 0,102,
+ 97,114, 70,105,101,108,100, 83,105,122,101, 0, 42,109,101,115,104, 83,117,114,102, 78,111,114,109, 97,108,115, 0, 99,112,115,
+ 84,105,109,101, 83,116, 97,114,116, 0, 99,112,115, 84,105,109,101, 69,110,100, 0, 99,112,115, 81,117, 97,108,105,116,121, 0,
+ 97,116,116,114, 97, 99,116,102,111,114, 99,101, 83,116,114,101,110,103,116,104, 0, 97,116,116,114, 97, 99,116,102,111,114, 99,
+101, 82, 97,100,105,117,115, 0,118,101,108,111, 99,105,116,121,102,111,114, 99,101, 83,116,114,101,110,103,116,104, 0,118,101,
+108,111, 99,105,116,121,102,111,114, 99,101, 82, 97,100,105,117,115, 0,108, 97,115,116,103,111,111,100,102,114, 97,109,101, 0,
+109,105,115,116,121,112,101, 0,104,111,114,114, 0,104,111,114,103, 0,104,111,114, 98, 0,122,101,110,114, 0,122,101,110,103,
+ 0,122,101,110, 98, 0,102, 97,115,116, 99,111,108, 0,101,120,112,111,115,117,114,101, 0,101,120,112, 0,114, 97,110,103,101,
+ 0,108,105,110,102, 97, 99, 0,108,111,103,102, 97, 99, 0,103,114, 97,118,105,116,121, 0, 97, 99,116,105,118,105,116,121, 66,
+111,120, 82, 97,100,105,117,115, 0,115,107,121,116,121,112,101, 0,111, 99, 99,108,117,115,105,111,110, 82,101,115, 0,112,104,
+121,115,105, 99,115, 69,110,103,105,110,101, 0,116,105, 99,114, 97,116,101, 0,109, 97,120,108,111,103,105, 99,115,116,101,112,
+ 0,112,104,121,115,117, 98,115,116,101,112, 0,109, 97,120,112,104,121,115,116,101,112, 0,109,105,115,105, 0,109,105,115,116,
+115,116, 97, 0,109,105,115,116,100,105,115,116, 0,109,105,115,116,104,105, 0,115,116, 97,114,114, 0,115,116, 97,114,103, 0,
+115,116, 97,114, 98, 0,115,116, 97,114,107, 0,115,116, 97,114,115,105,122,101, 0,115,116, 97,114,109,105,110,100,105,115,116,
+ 0,115,116, 97,114,100,105,115,116, 0,115,116, 97,114, 99,111,108,110,111,105,115,101, 0,100,111,102,115,116, 97, 0,100,111,
+102,101,110,100, 0,100,111,102,109,105,110, 0,100,111,102,109, 97,120, 0, 97,111,100,105,115,116, 0, 97,111,100,105,115,116,
+102, 97, 99, 0, 97,111,101,110,101,114,103,121, 0, 97,111, 98,105, 97,115, 0, 97,111,109,111,100,101, 0, 97,111,115, 97,109,
+112, 0, 97,111,109,105,120, 0, 97,111, 99,111,108,111,114, 0, 97,111, 95, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0,
+ 97,111, 95, 97,100, 97,112,116, 95,115,112,101,101,100, 95,102, 97, 99, 0, 97,111, 95, 97,112,112,114,111,120, 95,101,114,114,
+111,114, 0, 97,111, 95, 97,112,112,114,111,120, 95, 99,111,114,114,101, 99,116,105,111,110, 0, 97,111, 95,105,110,100,105,114,
+101, 99,116, 95,101,110,101,114,103,121, 0, 97,111, 95,101,110,118, 95,101,110,101,114,103,121, 0, 97,111, 95,112, 97,100, 50,
+ 0, 97,111, 95,105,110,100,105,114,101, 99,116, 95, 98,111,117,110, 99,101,115, 0, 97,111, 95,112, 97,100, 0, 97,111, 95,115,
+ 97,109,112, 95,109,101,116,104,111,100, 0, 97,111, 95,103, 97,116,104,101,114, 95,109,101,116,104,111,100, 0, 97,111, 95, 97,
+112,112,114,111,120, 95,112, 97,115,115,101,115, 0, 42, 97,111,115,112,104,101,114,101, 0, 42, 97,111,116, 97, 98,108,101,115,
+ 0,112, 97,100, 91, 51, 93, 0,115,101,108, 99,111,108, 0,115,120, 0,115,121, 0, 42,108,112, 70,111,114,109, 97,116, 0, 42,
+108,112, 80, 97,114,109,115, 0, 99, 98, 70,111,114,109, 97,116, 0, 99, 98, 80, 97,114,109,115, 0,102, 99, 99, 84,121,112,101,
+ 0,102, 99, 99, 72, 97,110,100,108,101,114, 0,100,119, 75,101,121, 70,114, 97,109,101, 69,118,101,114,121, 0,100,119, 81,117,
+ 97,108,105,116,121, 0,100,119, 66,121,116,101,115, 80,101,114, 83,101, 99,111,110,100, 0,100,119, 70,108, 97,103,115, 0,100,
+119, 73,110,116,101,114,108,101, 97,118,101, 69,118,101,114,121, 0, 97,118,105, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50,
+ 56, 93, 0, 42, 99,100, 80, 97,114,109,115, 0, 42,112, 97,100, 0, 99,100, 83,105,122,101, 0,113,116, 99,111,100,101, 99,110,
+ 97,109,101, 91, 49, 50, 56, 93, 0, 99,111,100,101, 99, 84,121,112,101, 0, 99,111,100,101, 99, 83,112, 97,116,105, 97,108, 81,
+117, 97,108,105,116,121, 0, 99,111,100,101, 99, 0, 99,111,100,101, 99, 70,108, 97,103,115, 0, 99,111,108,111,114, 68,101,112,
+116,104, 0, 99,111,100,101, 99, 84,101,109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0,109,105,110, 83,112, 97,116,105,
+ 97,108, 81,117, 97,108,105,116,121, 0,109,105,110, 84,101,109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0,107,101,121,
+ 70,114, 97,109,101, 82, 97,116,101, 0, 98,105,116, 82, 97,116,101, 0, 97,117,100,105,111, 99,111,100,101, 99, 84,121,112,101,
+ 0, 97,117,100,105,111, 83, 97,109,112,108,101, 82, 97,116,101, 0, 97,117,100,105,111, 66,105,116, 68,101,112,116,104, 0, 97,
+117,100,105,111, 67,104, 97,110,110,101,108,115, 0, 97,117,100,105,111, 67,111,100,101, 99, 70,108, 97,103,115, 0, 97,117,100,
+105,111, 66,105,116, 82, 97,116,101, 0, 97,117,100,105,111, 95, 99,111,100,101, 99, 0,118,105,100,101,111, 95, 98,105,116,114,
+ 97,116,101, 0, 97,117,100,105,111, 95, 98,105,116,114, 97,116,101, 0, 97,117,100,105,111, 95,109,105,120,114, 97,116,101, 0,
+ 97,117,100,105,111, 95,118,111,108,117,109,101, 0,103,111,112, 95,115,105,122,101, 0,114, 99, 95,109,105,110, 95,114, 97,116,
+101, 0,114, 99, 95,109, 97,120, 95,114, 97,116,101, 0,114, 99, 95, 98,117,102,102,101,114, 95,115,105,122,101, 0,109,117,120,
+ 95,112, 97, 99,107,101,116, 95,115,105,122,101, 0,109,117,120, 95,114, 97,116,101, 0,109,105,120,114, 97,116,101, 0,109, 97,
+105,110, 0,115,112,101,101,100, 95,111,102, 95,115,111,117,110,100, 0,100,111,112,112,108,101,114, 95,102, 97, 99,116,111,114,
+ 0,100,105,115,116, 97,110, 99,101, 95,109,111,100,101,108, 0, 42,109, 97,116, 95,111,118,101,114,114,105,100,101, 0, 42,108,
+105,103,104,116, 95,111,118,101,114,114,105,100,101, 0,108, 97,121, 95,122,109, 97,115,107, 0,108, 97,121,102,108, 97,103, 0,
+112, 97,115,115,102,108, 97,103, 0,112, 97,115,115, 95,120,111,114, 0, 42, 97,118,105, 99,111,100,101, 99,100, 97,116, 97, 0,
+ 42,113,116, 99,111,100,101, 99,100, 97,116, 97, 0,113,116, 99,111,100,101, 99,115,101,116,116,105,110,103,115, 0,102,102, 99,
+111,100,101, 99,100, 97,116, 97, 0,115,117, 98,102,114, 97,109,101, 0,112,115,102,114, 97, 0,112,101,102,114, 97, 0,105,109,
+ 97,103,101,115, 0,102,114, 97,109, 97,112,116,111, 0,116,104,114,101, 97,100,115, 0,102,114, 97,109,101,108,101,110, 0, 98,
+108,117,114,102, 97, 99, 0,101,100,103,101, 82, 0,101,100,103,101, 71, 0,101,100,103,101, 66, 0,102,117,108,108,115, 99,114,
+101,101,110, 0,120,112,108, 97,121, 0,121,112,108, 97,121, 0,102,114,101,113,112,108, 97,121, 0, 97,116,116,114,105, 98, 0,
+102,114, 97,109,101, 95,115,116,101,112, 0,115,116,101,114,101,111,109,111,100,101, 0,100,105,109,101,110,115,105,111,110,115,
+112,114,101,115,101,116, 0,109, 97,120,105,109,115,105,122,101, 0,120,115, 99,104, 0,121,115, 99,104, 0,120,112, 97,114,116,
+115, 0,121,112, 97,114,116,115, 0,119,105,110,112,111,115, 0,112,108, 97,110,101,115, 0,105,109,116,121,112,101, 0,115,117,
+ 98,105,109,116,121,112,101, 0,113,117, 97,108,105,116,121, 0,100,105,115,112,108, 97,121,109,111,100,101, 0,114,112, 97,100,
+ 49, 0,114,112, 97,100, 50, 0,115, 99,101,109,111,100,101, 0,114, 97,121,116,114, 97, 99,101, 95,111,112,116,105,111,110,115,
+ 0,114, 97,121,116,114, 97, 99,101, 95,115,116,114,117, 99,116,117,114,101, 0,114,101,110,100,101,114,101,114, 0,111, 99,114,
+101,115, 0, 97,108,112,104, 97,109,111,100,101, 0,111,115, 97, 0,102,114,115, 95,115,101, 99, 0,101,100,103,101,105,110,116,
+ 0,115, 97,102,101,116,121, 0, 98,111,114,100,101,114, 0,100,105,115,112,114,101, 99,116, 0,108, 97,121,101,114,115, 0, 97,
+ 99,116,108, 97,121, 0,109, 98,108,117,114, 95,115, 97,109,112,108,101,115, 0,120, 97,115,112, 0,121, 97,115,112, 0,102,114,
+115, 95,115,101, 99, 95, 98, 97,115,101, 0,103, 97,117,115,115, 0, 99,111,108,111,114, 95,109,103,116, 95,102,108, 97,103, 0,
+112,111,115,116,103, 97,109,109, 97, 0,112,111,115,116,104,117,101, 0,112,111,115,116,115, 97,116, 0,100,105,116,104,101,114,
+ 95,105,110,116,101,110,115,105,116,121, 0, 98, 97,107,101, 95,111,115, 97, 0, 98, 97,107,101, 95,102,105,108,116,101,114, 0,
+ 98, 97,107,101, 95,109,111,100,101, 0, 98, 97,107,101, 95,102,108, 97,103, 0, 98, 97,107,101, 95,110,111,114,109, 97,108, 95,
+115,112, 97, 99,101, 0, 98, 97,107,101, 95,113,117, 97,100, 95,115,112,108,105,116, 0, 98, 97,107,101, 95,109, 97,120,100,105,
+115,116, 0, 98, 97,107,101, 95, 98,105, 97,115,100,105,115,116, 0, 98, 97,107,101, 95,112, 97,100, 0, 98, 97, 99,107, 98,117,
+102, 91, 49, 54, 48, 93, 0,112,105, 99, 91, 49, 54, 48, 93, 0,115,116, 97,109,112, 0,115,116, 97,109,112, 95,102,111,110,116,
+ 95,105,100, 0,115,116, 97,109,112, 95,117,100, 97,116, 97, 91, 49, 54, 48, 93, 0,102,103, 95,115,116, 97,109,112, 91, 52, 93,
+ 0, 98,103, 95,115,116, 97,109,112, 91, 52, 93, 0,115,101,113, 95,112,114,101,118, 95,116,121,112,101, 0,115,101,113, 95,114,
+101,110,100, 95,116,121,112,101, 0,115,101,113, 95,102,108, 97,103, 0,112, 97,100, 53, 91, 53, 93, 0,115,105,109,112,108,105,
+102,121, 95,102,108, 97,103, 0,115,105,109,112,108,105,102,121, 95,115,117, 98,115,117,114,102, 0,115,105,109,112,108,105,102,
+121, 95,115,104, 97,100,111,119,115, 97,109,112,108,101,115, 0,115,105,109,112,108,105,102,121, 95,112, 97,114,116,105, 99,108,
+101,115, 0,115,105,109,112,108,105,102,121, 95, 97,111,115,115,115, 0, 99,105,110,101,111,110,119,104,105,116,101, 0, 99,105,
+110,101,111,110, 98,108, 97, 99,107, 0, 99,105,110,101,111,110,103, 97,109,109, 97, 0,106,112, 50, 95,112,114,101,115,101,116,
+ 0,106,112, 50, 95,100,101,112,116,104, 0,114,112, 97,100, 51, 0,100,111,109,101,114,101,115, 0,100,111,109,101,109,111,100,
+101, 0,100,111,109,101, 97,110,103,108,101, 0,100,111,109,101,116,105,108,116, 0,100,111,109,101,114,101,115, 98,117,102, 0,
+ 42,100,111,109,101,116,101,120,116, 0,101,110,103,105,110,101, 91, 51, 50, 93, 0,112, 97,114,116,105, 99,108,101, 95,112,101,
+114, 99, 0,115,117, 98,115,117,114,102, 95,109, 97,120, 0,115,104, 97,100, 98,117,102,115, 97,109,112,108,101, 95,109, 97,120,
+ 0, 97,111, 95,101,114,114,111,114, 0,116,105,108,116, 0,114,101,115, 98,117,102, 0, 42,119, 97,114,112,116,101,120,116, 0,
+ 99,111,108, 91, 51, 93, 0,109, 97,116,109,111,100,101, 0,102,114, 97,109,105,110,103, 0,114,116, 49, 0,114,116, 50, 0,100,
+111,109,101, 0,115,116,101,114,101,111,102,108, 97,103, 0,101,121,101,115,101,112, 97,114, 97,116,105,111,110, 0, 42, 99, 97,
+109,101,114, 97, 0, 42, 98,114,117,115,104, 0, 42,112, 97,105,110,116, 95, 99,117,114,115,111,114, 0,112, 97,105,110,116, 95,
+ 99,117,114,115,111,114, 95, 99,111,108, 91, 52, 93, 0,112, 97,105,110,116, 0,115,101, 97,109, 95, 98,108,101,101,100, 0,110,
+111,114,109, 97,108, 95, 97,110,103,108,101, 0,115, 99,114,101,101,110, 95,103,114, 97, 98, 95,115,105,122,101, 91, 50, 93, 0,
+ 42,112, 97,105,110,116, 99,117,114,115,111,114, 0,105,110,118,101,114,116, 0,116,111,116,114,101,107,101,121, 0,116,111,116,
+ 97,100,100,107,101,121, 0, 98,114,117,115,104,116,121,112,101, 0, 98,114,117,115,104, 91, 55, 93, 0,101,109,105,116,116,101,
+114,100,105,115,116, 0,115,101,108,101, 99,116,109,111,100,101, 0,101,100,105,116,116,121,112,101, 0,100,114, 97,119, 95,115,
+116,101,112, 0,102, 97,100,101, 95,102,114, 97,109,101,115, 0,110, 97,109,101, 91, 51, 54, 93, 0,109, 97,116, 91, 51, 93, 91,
+ 51, 93, 0,114, 97,100,105, 97,108, 95,115,121,109,109, 91, 51, 93, 0,108, 97,115,116, 95,120, 0,108, 97,115,116, 95,121, 0,
+108, 97,115,116, 95, 97,110,103,108,101, 0,100,114, 97,119, 95, 97,110, 99,104,111,114,101,100, 0, 97,110, 99,104,111,114,101,
+100, 95,115,105,122,101, 0, 97,110, 99,104,111,114,101,100, 95,108,111, 99, 97,116,105,111,110, 91, 51, 93, 0, 97,110, 99,104,
+111,114,101,100, 95,105,110,105,116,105, 97,108, 95,109,111,117,115,101, 91, 50, 93, 0,100,114, 97,119, 95,112,114,101,115,115,
+117,114,101, 0,112,114,101,115,115,117,114,101, 95,118, 97,108,117,101, 0,115,112,101, 99,105, 97,108, 95,114,111,116, 97,116,
+105,111,110, 0, 42,118,112, 97,105,110,116, 95,112,114,101,118, 0, 42,119,112, 97,105,110,116, 95,112,114,101,118, 0, 42,118,
+112, 97,105,110,116, 0, 42,119,112, 97,105,110,116, 0,118,103,114,111,117,112, 95,119,101,105,103,104,116, 0, 99,111,114,110,
+101,114,116,121,112,101, 0,101,100,105,116, 98,117,116,102,108, 97,103, 0,106,111,105,110,116,114,105,108,105,109,105,116, 0,
+100,101,103,114, 0,116,117,114,110, 0,101,120,116,114, 95,111,102,102,115, 0,100,111,117, 98,108,105,109,105,116, 0,110,111,
+114,109, 97,108,115,105,122,101, 0, 97,117,116,111,109,101,114,103,101, 0,115,101,103,109,101,110,116,115, 0,114,105,110,103,
+115, 0,118,101,114,116,105, 99,101,115, 0,117,110,119,114, 97,112,112,101,114, 0,117,118, 99, 97,108, 99, 95,114, 97,100,105,
+117,115, 0,117,118, 99, 97,108, 99, 95, 99,117, 98,101,115,105,122,101, 0,117,118, 99, 97,108, 99, 95,109, 97,114,103,105,110,
+ 0,117,118, 99, 97,108, 99, 95,109, 97,112,100,105,114, 0,117,118, 99, 97,108, 99, 95,109, 97,112, 97,108,105,103,110, 0,117,
+118, 99, 97,108, 99, 95,102,108, 97,103, 0,117,118, 95,102,108, 97,103, 0,117,118, 95,115,101,108,101, 99,116,109,111,100,101,
+ 0,117,118, 95,112, 97,100, 0,103,112,101,110, 99,105,108, 95,102,108, 97,103,115, 0, 97,117,116,111,105,107, 95, 99,104, 97,
+105,110,108,101,110, 0,105,109, 97,112, 97,105,110,116, 0,112, 97,114,116,105, 99,108,101, 0,112,114,111,112,111,114,116,105,
+111,110, 97,108, 95,115,105,122,101, 0,115,101,108,101, 99,116, 95,116,104,114,101,115,104, 0, 99,108,101, 97,110, 95,116,104,
+114,101,115,104, 0, 97,117,116,111,107,101,121, 95,109,111,100,101, 0, 97,117,116,111,107,101,121, 95,102,108, 97,103, 0,114,
+101,116,111,112,111, 95,109,111,100,101, 0,114,101,116,111,112,111, 95,112, 97,105,110,116, 95,116,111,111,108, 0,108,105,110,
+101, 95,100,105,118, 0,101,108,108,105,112,115,101, 95,100,105,118, 0,114,101,116,111,112,111, 95,104,111,116,115,112,111,116,
+ 0,109,117,108,116,105,114,101,115, 95,115,117, 98,100,105,118, 95,116,121,112,101, 0,115,107,103,101,110, 95,114,101,115,111,
+108,117,116,105,111,110, 0,115,107,103,101,110, 95,116,104,114,101,115,104,111,108,100, 95,105,110,116,101,114,110, 97,108, 0,
+115,107,103,101,110, 95,116,104,114,101,115,104,111,108,100, 95,101,120,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,108,
+101,110,103,116,104, 95,114, 97,116,105,111, 0,115,107,103,101,110, 95,108,101,110,103,116,104, 95,108,105,109,105,116, 0,115,
+107,103,101,110, 95, 97,110,103,108,101, 95,108,105,109,105,116, 0,115,107,103,101,110, 95, 99,111,114,114,101,108, 97,116,105,
+111,110, 95,108,105,109,105,116, 0,115,107,103,101,110, 95,115,121,109,109,101,116,114,121, 95,108,105,109,105,116, 0,115,107,
+103,101,110, 95,114,101,116, 97,114,103,101,116, 95, 97,110,103,108,101, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,
+114,101,116, 97,114,103,101,116, 95,108,101,110,103,116,104, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,114,101,116,
+ 97,114,103,101,116, 95,100,105,115,116, 97,110, 99,101, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,111,112,116,105,
+111,110,115, 0,115,107,103,101,110, 95,112,111,115,116,112,114,111, 0,115,107,103,101,110, 95,112,111,115,116,112,114,111, 95,
+112, 97,115,115,101,115, 0,115,107,103,101,110, 95,115,117, 98,100,105,118,105,115,105,111,110,115, 91, 51, 93, 0,115,107,103,
+101,110, 95,109,117,108,116,105, 95,108,101,118,101,108, 0, 42,115,107,103,101,110, 95,116,101,109,112,108, 97,116,101, 0, 98,
+111,110,101, 95,115,107,101,116, 99,104,105,110,103, 0, 98,111,110,101, 95,115,107,101,116, 99,104,105,110,103, 95, 99,111,110,
+118,101,114,116, 0,115,107,103,101,110, 95,115,117, 98,100,105,118,105,115,105,111,110, 95,110,117,109, 98,101,114, 0,115,107,
+103,101,110, 95,114,101,116, 97,114,103,101,116, 95,111,112,116,105,111,110,115, 0,115,107,103,101,110, 95,114,101,116, 97,114,
+103,101,116, 95,114,111,108,108, 0,115,107,103,101,110, 95,115,105,100,101, 95,115,116,114,105,110,103, 91, 56, 93, 0,115,107,
+103,101,110, 95,110,117,109, 95,115,116,114,105,110,103, 91, 56, 93, 0,101,100,103,101, 95,109,111,100,101, 0,115,110, 97,112,
+ 95,109,111,100,101, 0,115,110, 97,112, 95,102,108, 97,103, 0,115,110, 97,112, 95,116, 97,114,103,101,116, 0,112,114,111,112,
+111,114,116,105,111,110, 97,108, 0,112,114,111,112, 95,109,111,100,101, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 95,
+111, 98,106,101, 99,116,115, 0, 97,117,116,111, 95,110,111,114,109, 97,108,105,122,101, 0,115, 99,117,108,112,116, 95,112, 97,
+105,110,116, 95,115,101,116,116,105,110,103,115, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,
+100, 95,115,105,122,101, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95,117,110,112,114,
+111,106,101, 99,116,101,100, 95,114, 97,100,105,117,115, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,
+105,101,100, 95, 97,108,112,104, 97, 0,116,111,116,111, 98,106, 0,116,111,116,108, 97,109,112, 0,116,111,116,111, 98,106,115,
+101,108, 0,116,111,116, 99,117,114,118,101, 0,116,111,116,109,101,115,104, 0,116,111,116, 97,114,109, 97,116,117,114,101, 0,
+115, 99, 97,108,101, 95,108,101,110,103,116,104, 0,115,121,115,116,101,109, 0,115,121,115,116,101,109, 95,114,111,116, 97,116,
+105,111,110, 0,103,114, 97,118,105,116,121, 91, 51, 93, 0,113,117,105, 99,107, 95, 99, 97, 99,104,101, 95,115,116,101,112, 0,
+ 42,119,111,114,108,100, 0, 42,115,101,116, 0, 98, 97,115,101, 0, 42, 98, 97,115, 97, 99,116, 0, 42,111, 98,101,100,105,116,
+ 0, 99,117,114,115,111,114, 91, 51, 93, 0,116,119, 99,101,110,116, 91, 51, 93, 0,116,119,109,105,110, 91, 51, 93, 0,116,119,
+109, 97,120, 91, 51, 93, 0,108, 97,121, 97, 99,116, 0, 99,117,115,116,111,109,100, 97,116, 97, 95,109, 97,115,107, 0, 42,101,
+100, 0, 42,116,111,111,108,115,101,116,116,105,110,103,115, 0, 42,115,116, 97,116,115, 0, 97,117,100,105,111, 0,116,114, 97,
+110,115,102,111,114,109, 95,115,112, 97, 99,101,115, 0, 42,115,111,117,110,100, 95,115, 99,101,110,101, 0, 42,115,111,117,110,
+100, 95,115, 99,101,110,101, 95,104, 97,110,100,108,101, 0, 42,115,111,117,110,100, 95,115, 99,114,117, 98, 95,104, 97,110,100,
+108,101, 0, 42,102,112,115, 95,105,110,102,111, 0, 42,116,104,101, 68, 97,103, 0,100, 97,103,105,115,118, 97,108,105,100, 0,
+100, 97,103,102,108, 97,103,115, 0,112, 97,100, 54, 0,112, 97,100, 53, 0, 97, 99,116,105,118,101, 95,107,101,121,105,110,103,
+115,101,116, 0,107,101,121,105,110,103,115,101,116,115, 0,103,109, 0,117,110,105,116, 0,112,104,121,115,105, 99,115, 95,115,
+101,116,116,105,110,103,115, 0, 98,108,101,110,100, 0,118,105,101,119, 0,119,105,110,109, 97,116, 91, 52, 93, 91, 52, 93, 0,
+118,105,101,119,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,105,110,118, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,
+109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,105,110,118, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, 97,116,111,
+ 98, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,109, 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,116,119,109, 97,116, 91, 52, 93,
+ 91, 52, 93, 0,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,122,102, 97, 99, 0, 99, 97,109,100,120, 0, 99, 97,109,100,121,
+ 0,112,105,120,115,105,122,101, 0, 99, 97,109,122,111,111,109, 0,116,119,100,114, 97,119,102,108, 97,103, 0,114,102,108, 97,
+103, 0,118,105,101,119,108,111, 99,107, 0,112,101,114,115,112, 0, 99,108,105,112, 91, 54, 93, 91, 52, 93, 0, 99,108,105,112,
+ 95,108,111, 99, 97,108, 91, 54, 93, 91, 52, 93, 0, 42, 99,108,105,112, 98, 98, 0, 42,108,111, 99, 97,108,118,100, 0, 42,114,
+105, 0, 42,114,101,116,111,112,111, 95,118,105,101,119, 95,100, 97,116, 97, 0, 42,100,101,112,116,104,115, 0, 42,115,109,115,
+ 0, 42,115,109,111,111,116,104, 95,116,105,109,101,114, 0,108,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,108,112,101,114,
+115,112, 0,108,118,105,101,119, 0,103,114,105,100,118,105,101,119, 0,116,119, 97,110,103,108,101, 91, 51, 93, 0,112, 97,100,
+102, 0,114,101,103,105,111,110, 98, 97,115,101, 0,115,112, 97, 99,101,116,121,112,101, 0, 98,108,111, 99,107,115, 99, 97,108,
+101, 0, 98,108,111, 99,107,104, 97,110,100,108,101,114, 91, 56, 93, 0,108, 97,121, 95,117,115,101,100, 0, 42,111, 98, 95, 99,
+101,110,116,114,101, 0, 98,103,112,105, 99, 98, 97,115,101, 0, 42, 98,103,112,105, 99, 0,111, 98, 95, 99,101,110,116,114,101,
+ 95, 98,111,110,101, 91, 51, 50, 93, 0,100,114, 97,119,116,121,112,101, 0,111, 98, 95, 99,101,110,116,114,101, 95, 99,117,114,
+115,111,114, 0,115, 99,101,110,101,108,111, 99,107, 0, 97,114,111,117,110,100, 0,112,105,118,111,116, 95,108, 97,115,116, 0,
+103,114,105,100, 0,110,101, 97,114, 0,102, 97,114, 0,103,114,105,100,108,105,110,101,115, 0,103,114,105,100,102,108, 97,103,
+ 0,103,114,105,100,115,117, 98,100,105,118, 0,109,111,100,101,115,101,108,101, 99,116, 0,107,101,121,102,108, 97,103,115, 0,
+116,119,116,121,112,101, 0,116,119,109,111,100,101, 0,116,119,102,108, 97,103, 0, 97,102,116,101,114,100,114, 97,119, 95,116,
+114, 97,110,115,112, 0, 97,102,116,101,114,100,114, 97,119, 95,120,114, 97,121, 0, 97,102,116,101,114,100,114, 97,119, 95,120,
+114, 97,121,116,114, 97,110,115,112, 0,122, 98,117,102, 0,120,114, 97,121, 0,110,100,111,102,109,111,100,101, 0,110,100,111,
+102,102,105,108,116,101,114, 0, 42,112,114,111,112,101,114,116,105,101,115, 95,115,116,111,114, 97,103,101, 0,118,101,114,116,
+ 0,104,111,114, 0,109, 97,115,107, 0,109,105,110, 91, 50, 93, 0,109, 97,120, 91, 50, 93, 0,109,105,110,122,111,111,109, 0,
+109, 97,120,122,111,111,109, 0,115, 99,114,111,108,108, 0,115, 99,114,111,108,108, 95,117,105, 0,107,101,101,112,116,111,116,
+ 0,107,101,101,112,122,111,111,109, 0,107,101,101,112,111,102,115, 0, 97,108,105,103,110, 0,119,105,110,120, 0,119,105,110,
+121, 0,111,108,100,119,105,110,120, 0,111,108,100,119,105,110,121, 0, 42,116, 97, 98, 95,111,102,102,115,101,116, 0,116, 97,
+ 98, 95,110,117,109, 0,116, 97, 98, 95, 99,117,114, 0,114,112,116, 95,109, 97,115,107, 0,118, 50,100, 0, 42, 97,100,115, 0,
+103,104,111,115,116, 67,117,114,118,101,115, 0, 97,117,116,111,115,110, 97,112, 0, 99,117,114,115,111,114, 86, 97,108, 0,109,
+ 97,105,110, 98, 0,109, 97,105,110, 98,111, 0,109, 97,105,110, 98,117,115,101,114, 0,114,101, 95, 97,108,105,103,110, 0,112,
+114,101,118,105,101,119, 0,112, 97,116,104,102,108, 97,103, 0,100, 97,116, 97,105, 99,111,110, 0, 42,112,105,110,105,100, 0,
+114,101,110,100,101,114, 95,115,105,122,101, 0, 99,104, 97,110,115,104,111,119,110, 0,122,101, 98,114, 97, 0,122,111,111,109,
+ 0,116,105,116,108,101, 91, 51, 50, 93, 0,100,105,114, 91, 50, 52, 48, 93, 0,102,105,108,101, 91, 56, 48, 93, 0,114,101,110,
+ 97,109,101,102,105,108,101, 91, 56, 48, 93, 0,114,101,110, 97,109,101,101,100,105,116, 91, 56, 48, 93, 0,102,105,108,116,101,
+114, 95,103,108,111, 98, 91, 54, 52, 93, 0,115,111,114,116, 0,100,105,115,112,108, 97,121, 0, 97, 99,116,105,118,101, 95, 98,
+111,111,107,109, 97,114,107, 0, 97, 99,116,105,118,101, 95,102,105,108,101, 0,115,101,108,115,116, 97,116,101, 0,102, 95,102,
+112, 0,102,112, 95,115,116,114, 91, 56, 93, 0,115, 99,114,111,108,108, 95,111,102,102,115,101,116, 0, 42,112, 97,114, 97,109,
+115, 0, 42,102,105,108,101,115, 0, 42,102,111,108,100,101,114,115, 95,112,114,101,118, 0, 42,102,111,108,100,101,114,115, 95,
+110,101,120,116, 0, 42,111,112, 0, 42,115,109,111,111,116,104,115, 99,114,111,108,108, 95,116,105,109,101,114, 0, 42,108, 97,
+121,111,117,116, 0,114,101, 99,101,110,116,110,114, 0, 98,111,111,107,109, 97,114,107,110,114, 0,115,121,115,116,101,109,110,
+114, 0,116,114,101,101, 0, 42,116,114,101,101,115,116,111,114,101, 0,115,101, 97,114, 99,104, 95,115,116,114,105,110,103, 91,
+ 51, 50, 93, 0,115,101, 97,114, 99,104, 95,116,115,101, 0,111,117,116,108,105,110,101,118,105,115, 0,115,116,111,114,101,102,
+108, 97,103, 0,115,101, 97,114, 99,104, 95,102,108, 97,103,115, 0, 42, 99,117,109, 97,112, 0,115, 99,111,112,101,115, 0,115,
+ 97,109,112,108,101, 95,108,105,110,101, 95,104,105,115,116, 0, 99,117,114,115,111,114, 91, 50, 93, 0, 99,101,110,116,120, 0,
+ 99,101,110,116,121, 0, 99,117,114,116,105,108,101, 0,105,109,116,121,112,101,110,114, 0,108,111, 99,107, 0,112,105,110, 0,
+100,116, 95,117,118, 0,115,116,105, 99,107,121, 0,100,116, 95,117,118,115,116,114,101,116, 99,104, 0, 42,116,101,120,116, 0,
+116,111,112, 0,118,105,101,119,108,105,110,101,115, 0,109,101,110,117,110,114, 0,108,104,101,105,103,104,116, 0, 99,119,105,
+100,116,104, 0,108,105,110,101,110,114,115, 95,116,111,116, 0,108,101,102,116, 0,115,104,111,119,108,105,110,101,110,114,115,
+ 0,116, 97, 98,110,117,109, 98,101,114, 0,115,104,111,119,115,121,110,116, 97,120, 0,108,105,110,101, 95,104,108,105,103,104,
+116, 0,111,118,101,114,119,114,105,116,101, 0,108,105,118,101, 95,101,100,105,116, 0,112,105,120, 95,112,101,114, 95,108,105,
+110,101, 0,116,120,116,115, 99,114,111,108,108, 0,116,120,116, 98, 97,114, 0,119,111,114,100,119,114, 97,112, 0,100,111,112,
+108,117,103,105,110,115, 0,102,105,110,100,115,116,114, 91, 50, 53, 54, 93, 0,114,101,112,108, 97, 99,101,115,116,114, 91, 50,
+ 53, 54, 93, 0, 42,100,114, 97,119, 99, 97, 99,104,101, 0, 42,112,121, 95,100,114, 97,119, 0, 42,112,121, 95,101,118,101,110,
+116, 0, 42,112,121, 95, 98,117,116,116,111,110, 0, 42,112,121, 95, 98,114,111,119,115,101,114, 99, 97,108,108, 98, 97, 99,107,
+ 0, 42,112,121, 95,103,108,111, 98, 97,108,100,105, 99,116, 0,108, 97,115,116,115,112, 97, 99,101, 0,115, 99,114,105,112,116,
+110, 97,109,101, 91, 50, 53, 54, 93, 0,115, 99,114,105,112,116, 97,114,103, 91, 50, 53, 54, 93, 0, 42,115, 99,114,105,112,116,
+ 0, 42, 98,117,116, 95,114,101,102,115, 0, 42, 97,114,114, 97,121, 0, 99, 97, 99,104,101,115, 0, 99, 97, 99,104,101, 95,100,
+105,115,112,108, 97,121, 0,114,101,100,114, 97,119,115, 0, 42,105,100, 0, 97,115,112,101, 99,116, 0, 42, 99,117,114,102,111,
+110,116, 0,109,120, 0,109,121, 0, 42,101,100,105,116,116,114,101,101, 0,116,114,101,101,116,121,112,101, 0,116,101,120,102,
+114,111,109, 0,116,105,116,108,101, 91, 50, 52, 93, 0,109,101,110,117, 0,110,117,109,116,105,108,101,115,120, 0,110,117,109,
+116,105,108,101,115,121, 0,118,105,101,119,114,101, 99,116, 0, 98,111,111,107,109, 97,114,107,114,101, 99,116, 0,115, 99,114,
+111,108,108,112,111,115, 0,115, 99,114,111,108,108,104,101,105,103,104,116, 0,115, 99,114,111,108,108, 97,114,101, 97, 0,114,
+101,116,118, 97,108, 0,112,114,118, 95,119, 0,112,114,118, 95,104, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 41, 40,
+ 41, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 95,101,118,101,110,116, 41, 40, 41, 0, 40, 42,114,101,116,117,114,110,
+102,117,110, 99, 95, 97,114,103,115, 41, 40, 41, 0, 42, 97,114,103, 49, 0, 42, 97,114,103, 50, 0, 42,109,101,110,117,112, 0,
+ 42,112,117,112,109,101,110,117, 0, 42,105,109,103, 0,108,101,110, 95, 97,108,108,111, 99, 0, 99,117,114,115,111,114, 0,115,
+ 99,114,111,108,108, 98, 97, 99,107, 0,104,105,115,116,111,114,121, 0,112,114,111,109,112,116, 91, 50, 53, 54, 93, 0,108, 97,
+110,103,117, 97,103,101, 91, 51, 50, 93, 0,115,101,108, 95,115,116, 97,114,116, 0,115,101,108, 95,101,110,100, 0,102,105,108,
+116,101,114, 91, 54, 52, 93, 0, 42, 97,114,101, 97, 0, 42,115,111,117,110,100, 0,115,110,100,110,114, 0,102,105,108,101,110,
+ 97,109,101, 91, 50, 53, 54, 93, 0, 98,108,102, 95,105,100, 0,117,105,102,111,110,116, 95,105,100, 0,114, 95,116,111, 95,108,
+ 0,112,111,105,110,116,115, 0,107,101,114,110,105,110,103, 0,105,116, 97,108,105, 99, 0, 98,111,108,100, 0,115,104, 97,100,
+111,119, 0,115,104, 97,100,120, 0,115,104, 97,100,121, 0,115,104, 97,100,111,119, 97,108,112,104, 97, 0,115,104, 97,100,111,
+119, 99,111,108,111,114, 0,112, 97,110,101,108,116,105,116,108,101, 0,103,114,111,117,112,108, 97, 98,101,108, 0,119,105,100,
+103,101,116,108, 97, 98,101,108, 0,119,105,100,103,101,116, 0,112, 97,110,101,108,122,111,111,109, 0,109,105,110,108, 97, 98,
+101,108, 99,104, 97,114,115, 0,109,105,110,119,105,100,103,101,116, 99,104, 97,114,115, 0, 99,111,108,117,109,110,115,112, 97,
+ 99,101, 0,116,101,109,112,108, 97,116,101,115,112, 97, 99,101, 0, 98,111,120,115,112, 97, 99,101, 0, 98,117,116,116,111,110,
+115,112, 97, 99,101,120, 0, 98,117,116,116,111,110,115,112, 97, 99,101,121, 0,112, 97,110,101,108,115,112, 97, 99,101, 0,112,
+ 97,110,101,108,111,117,116,101,114, 0,112, 97,100, 91, 49, 93, 0,111,117,116,108,105,110,101, 91, 52, 93, 0,105,110,110,101,
+114, 91, 52, 93, 0,105,110,110,101,114, 95,115,101,108, 91, 52, 93, 0,105,116,101,109, 91, 52, 93, 0,116,101,120,116, 91, 52,
+ 93, 0,116,101,120,116, 95,115,101,108, 91, 52, 93, 0,115,104, 97,100,101,100, 0,115,104, 97,100,101,116,111,112, 0,115,104,
+ 97,100,101,100,111,119,110, 0, 97,108,112,104, 97, 95, 99,104,101, 99,107, 0,105,110,110,101,114, 95, 97,110,105,109, 91, 52,
+ 93, 0,105,110,110,101,114, 95, 97,110,105,109, 95,115,101,108, 91, 52, 93, 0,105,110,110,101,114, 95,107,101,121, 91, 52, 93,
+ 0,105,110,110,101,114, 95,107,101,121, 95,115,101,108, 91, 52, 93, 0,105,110,110,101,114, 95,100,114,105,118,101,110, 91, 52,
+ 93, 0,105,110,110,101,114, 95,100,114,105,118,101,110, 95,115,101,108, 91, 52, 93, 0,119, 99,111,108, 95,114,101,103,117,108,
+ 97,114, 0,119, 99,111,108, 95,116,111,111,108, 0,119, 99,111,108, 95,116,101,120,116, 0,119, 99,111,108, 95,114, 97,100,105,
+111, 0,119, 99,111,108, 95,111,112,116,105,111,110, 0,119, 99,111,108, 95,116,111,103,103,108,101, 0,119, 99,111,108, 95,110,
+117,109, 0,119, 99,111,108, 95,110,117,109,115,108,105,100,101,114, 0,119, 99,111,108, 95,109,101,110,117, 0,119, 99,111,108,
+ 95,112,117,108,108,100,111,119,110, 0,119, 99,111,108, 95,109,101,110,117, 95, 98, 97, 99,107, 0,119, 99,111,108, 95,109,101,
+110,117, 95,105,116,101,109, 0,119, 99,111,108, 95, 98,111,120, 0,119, 99,111,108, 95,115, 99,114,111,108,108, 0,119, 99,111,
+108, 95,112,114,111,103,114,101,115,115, 0,119, 99,111,108, 95,108,105,115,116, 95,105,116,101,109, 0,119, 99,111,108, 95,115,
+116, 97,116,101, 0,105, 99,111,110,102,105,108,101, 91, 56, 48, 93, 0, 98, 97, 99,107, 91, 52, 93, 0,116,105,116,108,101, 91,
+ 52, 93, 0,116,101,120,116, 95,104,105, 91, 52, 93, 0,104,101, 97,100,101,114, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,
+105,116,108,101, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101,120,116, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101,
+120,116, 95,104,105, 91, 52, 93, 0, 98,117,116,116,111,110, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,105,116,108,101, 91,
+ 52, 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 95,104,105,
+ 91, 52, 93, 0,108,105,115,116, 91, 52, 93, 0,108,105,115,116, 95,116,105,116,108,101, 91, 52, 93, 0,108,105,115,116, 95,116,
+101,120,116, 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,112, 97,110,101,108, 91, 52, 93, 0,
+112, 97,110,101,108, 95,116,105,116,108,101, 91, 52, 93, 0,112, 97,110,101,108, 95,116,101,120,116, 91, 52, 93, 0,112, 97,110,
+101,108, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,115,104, 97,100,101, 49, 91, 52, 93, 0,115,104, 97,100,101, 50, 91, 52,
+ 93, 0,104,105,108,105,116,101, 91, 52, 93, 0,103,114,105,100, 91, 52, 93, 0,119,105,114,101, 91, 52, 93, 0,115,101,108,101,
+ 99,116, 91, 52, 93, 0,108, 97,109,112, 91, 52, 93, 0, 97, 99,116,105,118,101, 91, 52, 93, 0,103,114,111,117,112, 91, 52, 93,
+ 0,103,114,111,117,112, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,116,114, 97,110,115,102,111,114,109, 91, 52, 93, 0,118,101,
+114,116,101,120, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,101,108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 91, 52, 93,
+ 0,101,100,103,101, 95,115,101,108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 95,115,101, 97,109, 91, 52, 93, 0,101,100,103,
+101, 95,115,104, 97,114,112, 91, 52, 93, 0,101,100,103,101, 95,102, 97, 99,101,115,101,108, 91, 52, 93, 0,101,100,103,101, 95,
+ 99,114,101, 97,115,101, 91, 52, 93, 0,102, 97, 99,101, 91, 52, 93, 0,102, 97, 99,101, 95,115,101,108,101, 99,116, 91, 52, 93,
+ 0,102, 97, 99,101, 95,100,111,116, 91, 52, 93, 0,101,120,116,114, 97, 95,101,100,103,101, 95,108,101,110, 91, 52, 93, 0,101,
+120,116,114, 97, 95,102, 97, 99,101, 95, 97,110,103,108,101, 91, 52, 93, 0,101,120,116,114, 97, 95,102, 97, 99,101, 95, 97,114,
+101, 97, 91, 52, 93, 0,112, 97,100, 51, 91, 52, 93, 0,110,111,114,109, 97,108, 91, 52, 93, 0,118,101,114,116,101,120, 95,110,
+111,114,109, 97,108, 91, 52, 93, 0, 98,111,110,101, 95,115,111,108,105,100, 91, 52, 93, 0, 98,111,110,101, 95,112,111,115,101,
+ 91, 52, 93, 0,115,116,114,105,112, 91, 52, 93, 0,115,116,114,105,112, 95,115,101,108,101, 99,116, 91, 52, 93, 0, 99,102,114,
+ 97,109,101, 91, 52, 93, 0,110,117,114, 98, 95,117,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95,118,108,105,110,101, 91,
+ 52, 93, 0, 97, 99,116, 95,115,112,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95,115,101,108, 95,117,108,105,110,101, 91,
+ 52, 93, 0,110,117,114, 98, 95,115,101,108, 95,118,108,105,110,101, 91, 52, 93, 0,108, 97,115,116,115,101,108, 95,112,111,105,
+110,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,102,114,101,101, 91, 52, 93, 0,104, 97,110,100,108,101, 95, 97,117,116,111,
+ 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95, 97,108,105,103,110, 91,
+ 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95,102,114,101,101, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108,
+ 95, 97,117,116,111, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95,118,101, 99,116, 91, 52, 93, 0,104, 97,110,100,
+108,101, 95,115,101,108, 95, 97,108,105,103,110, 91, 52, 93, 0,100,115, 95, 99,104, 97,110,110,101,108, 91, 52, 93, 0,100,115,
+ 95,115,117, 98, 99,104, 97,110,110,101,108, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,111,117,116,112,117,116, 91, 52, 93,
+ 0, 99,111,110,115,111,108,101, 95,105,110,112,117,116, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,105,110,102,111, 91, 52,
+ 93, 0, 99,111,110,115,111,108,101, 95,101,114,114,111,114, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95, 99,117,114,115,111,
+114, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,105,122,101, 0,102, 97, 99,101,100,111,116, 95,115,105,122,101, 0, 98,112,
+ 97,100, 91, 50, 93, 0,115,121,110,116, 97,120,108, 91, 52, 93, 0,115,121,110,116, 97,120,110, 91, 52, 93, 0,115,121,110,116,
+ 97,120, 98, 91, 52, 93, 0,115,121,110,116, 97,120,118, 91, 52, 93, 0,115,121,110,116, 97,120, 99, 91, 52, 93, 0,109,111,118,
+105,101, 91, 52, 93, 0,105,109, 97,103,101, 91, 52, 93, 0,115, 99,101,110,101, 91, 52, 93, 0, 97,117,100,105,111, 91, 52, 93,
+ 0,101,102,102,101, 99,116, 91, 52, 93, 0,112,108,117,103,105,110, 91, 52, 93, 0,116,114, 97,110,115,105,116,105,111,110, 91,
+ 52, 93, 0,109,101,116, 97, 91, 52, 93, 0,101,100,105,116,109,101,115,104, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,104, 97,
+110,100,108,101, 95,118,101,114,116,101,120, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 95,115,101,108,
+101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 95,115,105,122,101, 0,104,112, 97,100, 91, 55,
+ 93, 0,112,114,101,118,105,101,119, 95, 98, 97, 99,107, 91, 52, 93, 0,115,111,108,105,100, 91, 52, 93, 0,116,117,105, 0,116,
+ 98,117,116,115, 0,116,118, 51,100, 0,116,102,105,108,101, 0,116,105,112,111, 0,116,105,110,102,111, 0,116,115,110,100, 0,
+116, 97, 99,116, 0,116,110,108, 97, 0,116,115,101,113, 0,116,105,109, 97, 0,116,105,109, 97,115,101,108, 0,116,101,120,116,
+ 0,116,111,111,112,115, 0,116,116,105,109,101, 0,116,110,111,100,101, 0,116,108,111,103,105, 99, 0,116,117,115,101,114,112,
+114,101,102, 0,116, 99,111,110,115,111,108,101, 0,116, 97,114,109, 91, 50, 48, 93, 0, 97, 99,116,105,118,101, 95,116,104,101,
+109,101, 95, 97,114,101, 97, 0,109,111,100,117,108,101, 91, 54, 52, 93, 0,115,112,101, 99, 91, 52, 93, 0,100,117,112,102,108,
+ 97,103, 0,115, 97,118,101,116,105,109,101, 0,116,101,109,112,100,105,114, 91, 49, 54, 48, 93, 0,102,111,110,116,100,105,114,
+ 91, 49, 54, 48, 93, 0,114,101,110,100,101,114,100,105,114, 91, 49, 54, 48, 93, 0,116,101,120,116,117,100,105,114, 91, 49, 54,
+ 48, 93, 0,112,108,117,103,116,101,120,100,105,114, 91, 49, 54, 48, 93, 0,112,108,117,103,115,101,113,100,105,114, 91, 49, 54,
+ 48, 93, 0,112,121,116,104,111,110,100,105,114, 91, 49, 54, 48, 93, 0,115,111,117,110,100,100,105,114, 91, 49, 54, 48, 93, 0,
+105,109, 97,103,101, 95,101,100,105,116,111,114, 91, 50, 52, 48, 93, 0, 97,110,105,109, 95,112,108, 97,121,101,114, 91, 50, 52,
+ 48, 93, 0, 97,110,105,109, 95,112,108, 97,121,101,114, 95,112,114,101,115,101,116, 0,118, 50,100, 95,109,105,110, 95,103,114,
+105,100,115,105,122,101, 0,116,105,109,101, 99,111,100,101, 95,115,116,121,108,101, 0,118,101,114,115,105,111,110,115, 0,100,
+ 98,108, 95, 99,108,105, 99,107, 95,116,105,109,101, 0,103, 97,109,101,102,108, 97,103,115, 0,119,104,101,101,108,108,105,110,
+101,115, 99,114,111,108,108, 0,117,105,102,108, 97,103, 0,108, 97,110,103,117, 97,103,101, 0,117,115,101,114,112,114,101,102,
+ 0,118,105,101,119,122,111,111,109, 0,109,105,120, 98,117,102,115,105,122,101, 0, 97,117,100,105,111,100,101,118,105, 99,101,
+ 0, 97,117,100,105,111,114, 97,116,101, 0, 97,117,100,105,111,102,111,114,109, 97,116, 0, 97,117,100,105,111, 99,104, 97,110,
+110,101,108,115, 0,100,112,105, 0,101,110, 99,111,100,105,110,103, 0,116,114, 97,110,115,111,112,116,115, 0,109,101,110,117,
+116,104,114,101,115,104,111,108,100, 49, 0,109,101,110,117,116,104,114,101,115,104,111,108,100, 50, 0,116,104,101,109,101,115,
+ 0,117,105,102,111,110,116,115, 0,117,105,115,116,121,108,101,115, 0,107,101,121,109, 97,112,115, 0, 97,100,100,111,110,115,
+ 0,107,101,121, 99,111,110,102,105,103,115,116,114, 91, 54, 52, 93, 0,117,110,100,111,115,116,101,112,115, 0,117,110,100,111,
+109,101,109,111,114,121, 0,103,112, 95,109, 97,110,104, 97,116,116,101,110,100,105,115,116, 0,103,112, 95,101,117, 99,108,105,
+100,101, 97,110,100,105,115,116, 0,103,112, 95,101,114, 97,115,101,114, 0,103,112, 95,115,101,116,116,105,110,103,115, 0,116,
+ 98, 95,108,101,102,116,109,111,117,115,101, 0,116, 98, 95,114,105,103,104,116,109,111,117,115,101, 0,108,105,103,104,116, 91,
+ 51, 93, 0,116,119, 95,104,111,116,115,112,111,116, 0,116,119, 95,102,108, 97,103, 0,116,119, 95,104, 97,110,100,108,101,115,
+105,122,101, 0,116,119, 95,115,105,122,101, 0,116,101,120,116,105,109,101,111,117,116, 0,116,101,120, 99,111,108,108,101, 99,
+116,114, 97,116,101, 0,119,109,100,114, 97,119,109,101,116,104,111,100, 0,100,114, 97,103,116,104,114,101,115,104,111,108,100,
+ 0,109,101,109, 99, 97, 99,104,101,108,105,109,105,116, 0,112,114,101,102,101,116, 99,104,102,114, 97,109,101,115, 0,102,114,
+ 97,109,101,115,101,114,118,101,114,112,111,114,116, 0,112, 97,100, 95,114,111,116, 95, 97,110,103,108,101, 0,111, 98, 99,101,
+110,116,101,114, 95,100,105, 97, 0,114,118,105,115,105,122,101, 0,114,118,105, 98,114,105,103,104,116, 0,114,101, 99,101,110,
+116, 95,102,105,108,101,115, 0,115,109,111,111,116,104, 95,118,105,101,119,116,120, 0,103,108,114,101,115,108,105,109,105,116,
+ 0,110,100,111,102, 95,112, 97,110, 0,110,100,111,102, 95,114,111,116, 97,116,101, 0, 99,117,114,115,115,105,122,101, 0, 99,
+111,108,111,114, 95,112,105, 99,107,101,114, 95,116,121,112,101, 0,105,112,111, 95,110,101,119, 0,107,101,121,104, 97,110,100,
+108,101,115, 95,110,101,119, 0,115, 99,114, 99, 97,115,116,102,112,115, 0,115, 99,114, 99, 97,115,116,119, 97,105,116, 0,112,
+ 97,100, 56, 0,118,101,114,115,101,109, 97,115,116,101,114, 91, 49, 54, 48, 93, 0,118,101,114,115,101,117,115,101,114, 91, 49,
+ 54, 48, 93, 0,103,108, 97,108,112,104, 97, 99,108,105,112, 0,116,101,120,116, 95,114,101,110,100,101,114, 0,112, 97,100, 57,
+ 0,112, 97,100, 49, 48, 0, 99,111, 98, 97, 95,119,101,105,103,104,116, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,
+111,118,101,114,108, 97,121, 95, 99,111,108, 91, 51, 93, 0, 97,117,116,104,111,114, 91, 56, 48, 93, 0,118,101,114,116, 98, 97,
+115,101, 0,101,100,103,101, 98, 97,115,101, 0, 97,114,101, 97, 98, 97,115,101, 0, 42,110,101,119,115, 99,101,110,101, 0,102,
+117,108,108, 0,116,101,109,112, 0,119,105,110,105,100, 0,100,111, 95,100,114, 97,119, 0,100,111, 95,114,101,102,114,101,115,
+104, 0,100,111, 95,100,114, 97,119, 95,103,101,115,116,117,114,101, 0,100,111, 95,100,114, 97,119, 95,112, 97,105,110,116, 99,
+117,114,115,111,114, 0,100,111, 95,100,114, 97,119, 95,100,114, 97,103, 0,115,119, 97,112, 0,109, 97,105,110,119,105,110, 0,
+115,117, 98,119,105,110, 97, 99,116,105,118,101, 0, 42, 97,110,105,109,116,105,109,101,114, 0, 42, 99,111,110,116,101,120,116,
+ 0,104, 97,110,100,108,101,114, 91, 56, 93, 0, 42,110,101,119,118, 0,118,101, 99, 0, 42,118, 49, 0, 42,118, 50, 0, 42,116,
+121,112,101, 0,112, 97,110,101,108,110, 97,109,101, 91, 54, 52, 93, 0,116, 97, 98,110, 97,109,101, 91, 54, 52, 93, 0,100,114,
+ 97,119,110, 97,109,101, 91, 54, 52, 93, 0,111,102,115,120, 0,111,102,115,121, 0,115,105,122,101,120, 0,115,105,122,101,121,
+ 0,108, 97, 98,101,108,111,102,115, 0,114,117,110,116,105,109,101, 95,102,108, 97,103, 0, 99,111,110,116,114,111,108, 0,115,
+110, 97,112, 0,115,111,114,116,111,114,100,101,114, 0, 42,112, 97,110,101,108,116, 97, 98, 0, 42, 97, 99,116,105,118,101,100,
+ 97,116, 97, 0,108,105,115,116, 95,115, 99,114,111,108,108, 0,108,105,115,116, 95,115,105,122,101, 0,108,105,115,116, 95,108,
+ 97,115,116, 95,108,101,110, 0,108,105,115,116, 95,103,114,105,112, 95,115,105,122,101, 0,108,105,115,116, 95,115,101, 97,114,
+ 99,104, 91, 54, 52, 93, 0, 42,118, 51, 0, 42,118, 52, 0, 42,102,117,108,108, 0, 98,117,116,115,112, 97, 99,101,116,121,112,
+101, 0,104,101, 97,100,101,114,116,121,112,101, 0,115,112, 97, 99,101,100, 97,116, 97, 0,104, 97,110,100,108,101,114,115, 0,
+ 97, 99,116,105,111,110,122,111,110,101,115, 0,119,105,110,114, 99,116, 0,100,114, 97,119,114, 99,116, 0,115,119,105,110,105,
+100, 0,114,101,103,105,111,110,116,121,112,101, 0, 97,108,105,103,110,109,101,110,116, 0,100,111, 95,100,114, 97,119, 95,111,
+118,101,114,108, 97,121, 0,117,105, 98,108,111, 99,107,115, 0,112, 97,110,101,108,115, 0, 42,104,101, 97,100,101,114,115,116,
+114, 0, 42,114,101,103,105,111,110,100, 97,116, 97, 0,115,117, 98,118,115,116,114, 91, 52, 93, 0,115,117, 98,118,101,114,115,
+105,111,110, 0,112, 97,100,115, 0,109,105,110,118,101,114,115,105,111,110, 0,109,105,110,115,117, 98,118,101,114,115,105,111,
+110, 0, 42, 99,117,114,115, 99,114,101,101,110, 0, 42, 99,117,114,115, 99,101,110,101, 0,102,105,108,101,102,108, 97,103,115,
+ 0,103,108,111, 98, 97,108,102, 0,114,101,118,105,115,105,111,110, 0,102,105,108,101,110, 97,109,101, 91, 50, 52, 48, 93, 0,
+110, 97,109,101, 91, 56, 48, 93, 0,111,114,105,103, 95,119,105,100,116,104, 0,111,114,105,103, 95,104,101,105,103,104,116, 0,
+ 98,111,116,116,111,109, 0,114,105,103,104,116, 0,120,111,102,115, 0,121,111,102,115, 0,108,105,102,116, 91, 51, 93, 0,103,
+ 97,109,109, 97, 91, 51, 93, 0,103, 97,105,110, 91, 51, 93, 0,100,105,114, 91, 49, 54, 48, 93, 0,100,111,110,101, 0,115,116,
+ 97,114,116,115,116,105,108,108, 0,101,110,100,115,116,105,108,108, 0, 42,115,116,114,105,112,100, 97,116, 97, 0, 42, 99,114,
+111,112, 0, 42,116,114, 97,110,115,102,111,114,109, 0, 42, 99,111,108,111,114, 95, 98, 97,108, 97,110, 99,101, 0, 42,105,110,
+115,116, 97,110, 99,101, 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, 0, 42, 42, 99,117,114,114,101,110,116, 95,112,114,
+105,118, 97,116,101, 95,100, 97,116, 97, 0, 42,116,109,112, 0,115,116, 97,114,116,111,102,115, 0,101,110,100,111,102,115, 0,
+109, 97, 99,104,105,110,101, 0,115,116, 97,114,116,100,105,115,112, 0,101,110,100,100,105,115,112, 0,115, 97,116, 0,109,117,
+108, 0,104, 97,110,100,115,105,122,101, 0, 97,110,105,109, 95,112,114,101,115,101,101,107, 0, 42,115,116,114,105,112, 0, 42,
+115, 99,101,110,101, 95, 99, 97,109,101,114, 97, 0,101,102,102,101, 99,116, 95,102, 97,100,101,114, 0,115,112,101,101,100, 95,
+102, 97,100,101,114, 0, 42,115,101,113, 49, 0, 42,115,101,113, 50, 0, 42,115,101,113, 51, 0,115,101,113, 98, 97,115,101, 0,
+ 42,115, 99,101,110,101, 95,115,111,117,110,100, 0,108,101,118,101,108, 0,112, 97,110, 0,115, 99,101,110,101,110,114, 0,109,
+117,108,116,105, 99, 97,109, 95,115,111,117,114, 99,101, 0,115,116,114,111, 98,101, 0, 42,101,102,102,101, 99,116,100, 97,116,
+ 97, 0, 97,110,105,109, 95,115,116, 97,114,116,111,102,115, 0, 97,110,105,109, 95,101,110,100,111,102,115, 0, 98,108,101,110,
+100, 95,109,111,100,101, 0, 98,108,101,110,100, 95,111,112, 97, 99,105,116,121, 0, 42,111,108,100, 98, 97,115,101,112, 0, 42,
+112, 97,114,115,101,113, 0, 42,115,101,113, 98, 97,115,101,112, 0,109,101,116, 97,115,116, 97, 99,107, 0, 42, 97, 99,116, 95,
+115,101,113, 0, 97, 99,116, 95,105,109, 97,103,101,100,105,114, 91, 50, 53, 54, 93, 0, 97, 99,116, 95,115,111,117,110,100,100,
+105,114, 91, 50, 53, 54, 93, 0,111,118,101,114, 95,111,102,115, 0,111,118,101,114, 95, 99,102,114, 97, 0,111,118,101,114, 95,
+102,108, 97,103, 0,111,118,101,114, 95, 98,111,114,100,101,114, 0,101,100,103,101, 87,105,100,116,104, 0,102,111,114,119, 97,
+114,100, 0,119,105,112,101,116,121,112,101, 0,102, 77,105,110,105, 0,102, 67,108, 97,109,112, 0,102, 66,111,111,115,116, 0,
+100, 68,105,115,116, 0,100, 81,117, 97,108,105,116,121, 0, 98, 78,111, 67,111,109,112, 0, 83, 99, 97,108,101,120, 73,110,105,
+ 0, 83, 99, 97,108,101,121, 73,110,105, 0, 83, 99, 97,108,101,120, 70,105,110, 0, 83, 99, 97,108,101,121, 70,105,110, 0,120,
+ 73,110,105, 0,120, 70,105,110, 0,121, 73,110,105, 0,121, 70,105,110, 0,114,111,116, 73,110,105, 0,114,111,116, 70,105,110,
+ 0,105,110,116,101,114,112,111,108, 97,116,105,111,110, 0,117,110,105,102,111,114,109, 95,115, 99, 97,108,101, 0, 42,102,114,
+ 97,109,101, 77, 97,112, 0,103,108,111, 98, 97,108, 83,112,101,101,100, 0,108, 97,115,116, 86, 97,108,105,100, 70,114, 97,109,
+101, 0, 98,117,116,116,121,112,101, 0,117,115,101,114,106,105,116, 0,115,116, 97, 0,116,111,116,112, 97,114,116, 0,110,111,
+114,109,102, 97, 99, 0,111, 98,102, 97, 99, 0,114, 97,110,100,102, 97, 99, 0,116,101,120,102, 97, 99, 0,114, 97,110,100,108,
+105,102,101, 0,102,111,114, 99,101, 91, 51, 93, 0,118,101, 99,116,115,105,122,101, 0,109, 97,120,108,101,110, 0,100,101,102,
+118,101, 99, 91, 51, 93, 0,109,117,108,116, 91, 52, 93, 0,108,105,102,101, 91, 52, 93, 0, 99,104,105,108,100, 91, 52, 93, 0,
+109, 97,116, 91, 52, 93, 0,116,101,120,109, 97,112, 0, 99,117,114,109,117,108,116, 0,115,116, 97,116,105, 99,115,116,101,112,
+ 0,111,109, 97,116, 0,116,105,109,101,116,101,120, 0,115,112,101,101,100,116,101,120, 0,102,108, 97,103, 50,110,101,103, 0,
+118,101,114,116,103,114,111,117,112, 95,118, 0,118,103,114,111,117,112,110, 97,109,101, 91, 51, 50, 93, 0,118,103,114,111,117,
+112,110, 97,109,101, 95,118, 91, 51, 50, 93, 0, 42,107,101,121,115, 0,109,105,110,102, 97, 99, 0,110,114, 0,117,115,101,100,
+ 0,117,115,101,100,101,108,101,109, 0, 42,112,111,105,110, 0,114,101,115,101,116,100,105,115,116, 0,108, 97,115,116,118, 97,
+108, 0, 42,109, 97, 0,107,101,121, 0,113,117, 97,108, 0,113,117, 97,108, 50, 0,116, 97,114,103,101,116, 78, 97,109,101, 91,
+ 51, 50, 93, 0,116,111,103,103,108,101, 78, 97,109,101, 91, 51, 50, 93, 0,118, 97,108,117,101, 91, 51, 50, 93, 0,109, 97,120,
+118, 97,108,117,101, 91, 51, 50, 93, 0,100,101,108, 97,121, 0,100,117,114, 97,116,105,111,110, 0,109, 97,116,101,114,105, 97,
+108, 78, 97,109,101, 91, 51, 50, 93, 0,100, 97,109,112,116,105,109,101,114, 0,112,114,111,112,110, 97,109,101, 91, 51, 50, 93,
+ 0,109, 97,116,110, 97,109,101, 91, 51, 50, 93, 0, 97,120,105,115,102,108, 97,103, 0,112,111,115,101, 99,104, 97,110,110,101,
+108, 91, 51, 50, 93, 0, 99,111,110,115,116,114, 97,105,110,116, 91, 51, 50, 93, 0, 42,102,114,111,109, 79, 98,106,101, 99,116,
+ 0,115,117, 98,106,101, 99,116, 91, 51, 50, 93, 0, 98,111,100,121, 91, 51, 50, 93, 0,111,116,121,112,101, 0,112,117,108,115,
+101, 0,102,114,101,113, 0,116,111,116,108,105,110,107,115, 0, 42, 42,108,105,110,107,115, 0,116, 97,112, 0,106,111,121,105,
+110,100,101,120, 0, 97,120,105,115, 95,115,105,110,103,108,101, 0, 97,120,105,115,102, 0, 98,117,116,116,111,110, 0,104, 97,
+116, 0,104, 97,116,102, 0,112,114,101, 99,105,115,105,111,110, 0,115,116,114, 91, 49, 50, 56, 93, 0, 42,109,121,110,101,119,
+ 0,105,110,112,117,116,115, 0,116,111,116,115,108,105,110,107,115, 0, 42, 42,115,108,105,110,107,115, 0,118, 97,108,111, 0,
+115,116, 97,116,101, 95,109, 97,115,107, 0, 42, 97, 99,116, 0,102,114, 97,109,101, 80,114,111,112, 91, 51, 50, 93, 0, 98,108,
+101,110,100,105,110, 0,112,114,105,111,114,105,116,121, 0,101,110,100, 95,114,101,115,101,116, 0,115,116,114,105,100,101, 97,
+120,105,115, 0,115,116,114,105,100,101,108,101,110,103,116,104, 0,109,105,110, 95,103, 97,105,110, 0,109, 97,120, 95,103, 97,
+105,110, 0,114,101,102,101,114,101,110, 99,101, 95,100,105,115,116, 97,110, 99,101, 0,109, 97,120, 95,100,105,115,116, 97,110,
+ 99,101, 0,114,111,108,108,111,102,102, 95,102, 97, 99,116,111,114, 0, 99,111,110,101, 95,105,110,110,101,114, 95, 97,110,103,
+108,101, 0, 99,111,110,101, 95,111,117,116,101,114, 95, 97,110,103,108,101, 0, 99,111,110,101, 95,111,117,116,101,114, 95,103,
+ 97,105,110, 0,112, 97,100, 51, 91, 50, 93, 0,112,105,116, 99,104, 0,115,111,117,110,100, 51, 68, 0,112, 97,100, 54, 91, 49,
+ 93, 0, 42,109,101, 0,108,105,110, 86,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,110,103, 86,101,108,111, 99,105,116,121,
+ 91, 51, 93, 0,108,111, 99, 97,108,102,108, 97,103, 0,100,121,110, 95,111,112,101,114, 97,116,105,111,110, 0,102,111,114, 99,
+101,108,111, 99, 91, 51, 93, 0,102,111,114, 99,101,114,111,116, 91, 51, 93, 0,108,105,110,101, 97,114,118,101,108,111, 99,105,
+116,121, 91, 51, 93, 0, 97,110,103,117,108, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 42,114,101,102,101,114,101,
+110, 99,101, 0,109,105,110, 0,109, 97,120, 0,114,111,116,100, 97,109,112, 0,109,105,110,108,111, 99, 91, 51, 93, 0,109, 97,
+120,108,111, 99, 91, 51, 93, 0,109,105,110,114,111,116, 91, 51, 93, 0,109, 97,120,114,111,116, 91, 51, 93, 0,109, 97,116,112,
+114,111,112, 91, 51, 50, 93, 0, 98,117,116,115,116, 97, 0, 98,117,116,101,110,100, 0,100,105,115,116,114,105, 98,117,116,105,
+111,110, 0,105,110,116, 95, 97,114,103, 95, 49, 0,105,110,116, 95, 97,114,103, 95, 50, 0,102,108,111, 97,116, 95, 97,114,103,
+ 95, 49, 0,102,108,111, 97,116, 95, 97,114,103, 95, 50, 0,116,111, 80,114,111,112, 78, 97,109,101, 91, 51, 50, 93, 0, 42,116,
+111, 79, 98,106,101, 99,116, 0, 98,111,100,121, 84,121,112,101, 0,102,105,108,101,110, 97,109,101, 91, 54, 52, 93, 0,108,111,
+ 97,100, 97,110,105,110, 97,109,101, 91, 54, 52, 93, 0,105,110,116, 95, 97,114,103, 0,102,108,111, 97,116, 95, 97,114,103, 0,
+ 42,115,117, 98,116, 97,114,103,101,116, 0,103,111, 0, 42,110,101,119,112, 97, 99,107,101,100,102,105,108,101, 0, 97,116,116,
+101,110,117, 97,116,105,111,110, 0,100,105,115,116, 97,110, 99,101, 0, 42, 99, 97, 99,104,101, 0, 42,112,108, 97,121, 98, 97,
+ 99,107, 95,104, 97,110,100,108,101, 0, 42,108, 97,109,112,114,101,110, 0,103,111, 98,106,101, 99,116, 0,100,117,112,108,105,
+ 95,111,102,115, 91, 51, 93, 0, 42,112,114,111,112, 0, 99,104,105,108,100, 98, 97,115,101, 0,114,111,108,108, 0,104,101, 97,
+100, 91, 51, 93, 0,116, 97,105,108, 91, 51, 93, 0, 98,111,110,101, 95,109, 97,116, 91, 51, 93, 91, 51, 93, 0, 97,114,109, 95,
+104,101, 97,100, 91, 51, 93, 0, 97,114,109, 95,116, 97,105,108, 91, 51, 93, 0, 97,114,109, 95,109, 97,116, 91, 52, 93, 91, 52,
+ 93, 0,120,119,105,100,116,104, 0,122,119,105,100,116,104, 0,101, 97,115,101, 49, 0,101, 97,115,101, 50, 0,114, 97,100, 95,
+104,101, 97,100, 0,114, 97,100, 95,116, 97,105,108, 0, 98,111,110,101, 98, 97,115,101, 0, 99,104, 97,105,110, 98, 97,115,101,
+ 0, 42,101,100, 98,111, 0, 42, 97, 99,116, 95, 98,111,110,101, 0, 42, 97, 99,116, 95,101,100, 98,111,110,101, 0, 42,115,107,
+101,116, 99,104, 0,108, 97,121,101,114, 95,117,115,101,100, 0,108, 97,121,101,114, 95,112,114,111,116,101, 99,116,101,100, 0,
+103,104,111,115,116,101,112, 0,103,104,111,115,116,115,105,122,101, 0,103,104,111,115,116,116,121,112,101, 0,112, 97,116,104,
+115,105,122,101, 0,103,104,111,115,116,115,102, 0,103,104,111,115,116,101,102, 0,112, 97,116,104,115,102, 0,112, 97,116,104,
+101,102, 0,112, 97,116,104, 98, 99, 0,112, 97,116,104, 97, 99, 0, 42,112,111,105,110,116,115, 0,115,116, 97,114,116, 95,102,
+114, 97,109,101, 0,101,110,100, 95,102,114, 97,109,101, 0,103,104,111,115,116, 95,115,102, 0,103,104,111,115,116, 95,101,102,
+ 0,103,104,111,115,116, 95, 98, 99, 0,103,104,111,115,116, 95, 97, 99, 0,103,104,111,115,116, 95,116,121,112,101, 0,103,104,
+111,115,116, 95,115,116,101,112, 0,103,104,111,115,116, 95,102,108, 97,103, 0,112, 97,116,104, 95,116,121,112,101, 0,112, 97,
+116,104, 95,115,116,101,112, 0,112, 97,116,104, 95,118,105,101,119,102,108, 97,103, 0,112, 97,116,104, 95, 98, 97,107,101,102,
+108, 97,103, 0,112, 97,116,104, 95,115,102, 0,112, 97,116,104, 95,101,102, 0,112, 97,116,104, 95, 98, 99, 0,112, 97,116,104,
+ 95, 97, 99, 0, 99,111,110,115,116,102,108, 97,103, 0,105,107,102,108, 97,103, 0,115,101,108,101, 99,116,102,108, 97,103, 0,
+ 97,103,114,112, 95,105,110,100,101,120, 0, 42, 98,111,110,101, 0, 42, 99,104,105,108,100, 0,105,107,116,114,101,101, 0, 42,
+ 99,117,115,116,111,109, 0, 42, 99,117,115,116,111,109, 95,116,120, 0,101,117,108, 91, 51, 93, 0, 99,104, 97,110, 95,109, 97,
+116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,104,101, 97,100,
+ 91, 51, 93, 0,112,111,115,101, 95,116, 97,105,108, 91, 51, 93, 0,108,105,109,105,116,109,105,110, 91, 51, 93, 0,108,105,109,
+105,116,109, 97,120, 91, 51, 93, 0,115,116,105,102,102,110,101,115,115, 91, 51, 93, 0,105,107,115,116,114,101,116, 99,104, 0,
+105,107,114,111,116,119,101,105,103,104,116, 0,105,107,108,105,110,119,101,105,103,104,116, 0, 99,104, 97,110, 98, 97,115,101,
+ 0, 42, 99,104, 97,110,104, 97,115,104, 0,112,114,111,120,121, 95,108, 97,121,101,114, 0,115,116,114,105,100,101, 95,111,102,
+102,115,101,116, 91, 51, 93, 0, 99,121, 99,108,105, 99, 95,111,102,102,115,101,116, 91, 51, 93, 0, 97,103,114,111,117,112,115,
+ 0, 97, 99,116,105,118,101, 95,103,114,111,117,112, 0,105,107,115,111,108,118,101,114, 0, 42,105,107,100, 97,116, 97, 0, 42,
+105,107,112, 97,114, 97,109, 0,112,114,111,120,121, 95, 97, 99,116, 95, 98,111,110,101, 91, 51, 50, 93, 0,110,117,109,105,116,
+101,114, 0,110,117,109,115,116,101,112, 0,109,105,110,115,116,101,112, 0,109, 97,120,115,116,101,112, 0,115,111,108,118,101,
+114, 0,102,101,101,100, 98, 97, 99,107, 0,109, 97,120,118,101,108, 0,100, 97,109,112,109, 97,120, 0,100, 97,109,112,101,112,
+115, 0, 99,104, 97,110,110,101,108,115, 0, 99,117,115,116,111,109, 67,111,108, 0, 99,115, 0, 99,117,114,118,101,115, 0,103,
+114,111,117,112,115, 0, 97, 99,116,105,118,101, 95,109, 97,114,107,101,114, 0, 42,115,111,117,114, 99,101, 0, 42,102,105,108,
+116,101,114, 95,103,114,112, 0,102,105,108,116,101,114,102,108, 97,103, 0, 97,100,115, 0,116,105,109,101,115,108,105,100,101,
+ 0, 42,103,114,112, 0,110, 97,109,101, 91, 51, 48, 93, 0,111,119,110,115,112, 97, 99,101, 0,116, 97,114,115,112, 97, 99,101,
+ 0,101,110,102,111,114, 99,101, 0,104,101, 97,100,116, 97,105,108, 0,108,105,110, 95,101,114,114,111,114, 0,114,111,116, 95,
+101,114,114,111,114, 0, 42,116, 97,114, 0,109, 97,116,114,105,120, 91, 52, 93, 91, 52, 93, 0,115,112, 97, 99,101, 0,114,111,
+116, 79,114,100,101,114, 0,116, 97,114,110,117,109, 0,116, 97,114,103,101,116,115, 0,105,116,101,114, 97,116,105,111,110,115,
+ 0,114,111,111,116, 98,111,110,101, 0,109, 97,120, 95,114,111,111,116, 98,111,110,101, 0, 42,112,111,108,101,116, 97,114, 0,
+112,111,108,101,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, 93, 0,112,111,108,101, 97,110,103,108,101, 0,111,114,105,101,
+110,116,119,101,105,103,104,116, 0,103,114, 97, 98,116, 97,114,103,101,116, 91, 51, 93, 0,110,117,109,112,111,105,110,116,115,
+ 0, 99,104, 97,105,110,108,101,110, 0,120,122, 83, 99, 97,108,101, 77,111,100,101, 0,114,101,115,101,114,118,101,100, 49, 0,
+114,101,115,101,114,118,101,100, 50, 0,109,105,110,109, 97,120,102,108, 97,103, 0,115,116,117, 99,107, 0, 99, 97, 99,104,101,
+ 91, 51, 93, 0,108,111, 99,107,102,108, 97,103, 0,102,111,108,108,111,119,102,108, 97,103, 0,118,111,108,109,111,100,101, 0,
+112,108, 97,110,101, 0,111,114,103,108,101,110,103,116,104, 0, 98,117,108,103,101, 0,112,105,118, 88, 0,112,105,118, 89, 0,
+112,105,118, 90, 0, 97,120, 88, 0, 97,120, 89, 0, 97,120, 90, 0,109,105,110, 76,105,109,105,116, 91, 54, 93, 0,109, 97,120,
+ 76,105,109,105,116, 91, 54, 93, 0,101,120,116,114, 97, 70,122, 0,105,110,118,109, 97,116, 91, 52, 93, 91, 52, 93, 0,102,114,
+111,109, 0,116,111, 0,109, 97,112, 91, 51, 93, 0,101,120,112,111, 0,102,114,111,109, 95,109,105,110, 91, 51, 93, 0,102,114,
+111,109, 95,109, 97,120, 91, 51, 93, 0,116,111, 95,109,105,110, 91, 51, 93, 0,116,111, 95,109, 97,120, 91, 51, 93, 0,114,111,
+116, 65,120,105,115, 0,122,109,105,110, 0,122,109, 97,120, 0,112, 97,100, 91, 57, 93, 0, 99,104, 97,110,110,101,108, 91, 51,
+ 50, 93, 0,110,111, 95,114,111,116, 95, 97,120,105,115, 0,115,116,114,105,100,101, 95, 97,120,105,115, 0, 99,117,114,109,111,
+100, 0, 97, 99,116,115,116, 97,114,116, 0, 97, 99,116,101,110,100, 0, 97, 99,116,111,102,102,115, 0,115,116,114,105,100,101,
+108,101,110, 0,115, 99, 97,108,101, 0, 98,108,101,110,100,111,117,116, 0,115,116,114,105,100,101, 99,104, 97,110,110,101,108,
+ 91, 51, 50, 93, 0,111,102,102,115, 95, 98,111,110,101, 91, 51, 50, 93, 0,104, 97,115,105,110,112,117,116, 0,104, 97,115,111,
+117,116,112,117,116, 0,100, 97,116, 97,116,121,112,101, 0,115,111, 99,107,101,116,116,121,112,101, 0, 42,110,101,119, 95,115,
+111, 99,107, 0,110,115, 0,108,105,109,105,116, 0,115,116, 97, 99,107, 95,105,110,100,101,120, 0,105,110,116,101,114,110, 0,
+115,116, 97, 99,107, 95,105,110,100,101,120, 95,101,120,116, 0,108,111, 99,120, 0,108,111, 99,121, 0,111,119,110, 95,105,110,
+100,101,120, 0,116,111, 95,105,110,100,101,120, 0, 42,116,111,115,111, 99,107, 0, 42,108,105,110,107, 0, 42,110,101,119, 95,
+110,111,100,101, 0,108, 97,115,116,121, 0,111,117,116,112,117,116,115, 0, 42,115,116,111,114, 97,103,101, 0,109,105,110,105,
+119,105,100,116,104, 0, 99,117,115,116,111,109, 49, 0, 99,117,115,116,111,109, 50, 0, 99,117,115,116,111,109, 51, 0, 99,117,
+115,116,111,109, 52, 0,110,101,101,100, 95,101,120,101, 99, 0,101,120,101, 99, 0, 42,116,104,114,101, 97,100,100, 97,116, 97,
+ 0,116,111,116,114, 0, 98,117,116,114, 0,112,114,118,114, 0, 42, 98,108,111, 99,107, 0, 42,116,121,112,101,105,110,102,111,
+ 0, 42,102,114,111,109,110,111,100,101, 0, 42,116,111,110,111,100,101, 0, 42,102,114,111,109,115,111, 99,107, 0,110,111,100,
+101,115, 0,108,105,110,107,115, 0, 42,115,116, 97, 99,107, 0, 42,116,104,114,101, 97,100,115,116, 97, 99,107, 0,105,110,105,
+116, 0,115,116, 97, 99,107,115,105,122,101, 0, 99,117,114, 95,105,110,100,101,120, 0, 97,108,108,116,121,112,101,115, 0, 42,
+111,119,110,116,121,112,101, 0,112, 97,100, 50, 91, 50, 93, 0, 40, 42,112,114,111,103,114,101,115,115, 41, 40, 41, 0, 40, 42,
+115,116, 97,116,115, 95,100,114, 97,119, 41, 40, 41, 0, 40, 42,116,101,115,116, 95, 98,114,101, 97,107, 41, 40, 41, 0, 42,116,
+ 98,104, 0, 42,112,114,104, 0, 42,115,100,104, 0, 99,121, 99,108,105, 99, 0,109,111,118,105,101, 0,115, 97,109,112,108,101,
+115, 0,109, 97,120,115,112,101,101,100, 0,109,105,110,115,112,101,101,100, 0,112,101,114, 99,101,110,116,120, 0,112,101,114,
+ 99,101,110,116,121, 0, 98,111,107,101,104, 0,103, 97,109,109, 97, 0, 99,117,114,118,101,100, 0,105,109, 97,103,101, 95,105,
+110, 95,119,105,100,116,104, 0,105,109, 97,103,101, 95,105,110, 95,104,101,105,103,104,116, 0, 99,101,110,116,101,114, 95,120,
+ 0, 99,101,110,116,101,114, 95,121, 0,115,112,105,110, 0,119,114, 97,112, 0,115,105,103,109, 97, 95, 99,111,108,111,114, 0,
+115,105,103,109, 97, 95,115,112, 97, 99,101, 0,104,117,101, 0,116, 49, 0,116, 50, 0,116, 51, 0,102,115,116,114,101,110,103,
+116,104, 0,102, 97,108,112,104, 97, 0,107,101,121, 91, 52, 93, 0, 97,108,103,111,114,105,116,104,109, 0, 99,104, 97,110,110,
+101,108, 0,120, 49, 0,120, 50, 0,121, 49, 0,121, 50, 0,102, 97, 99, 95,120, 49, 0,102, 97, 99, 95,120, 50, 0,102, 97, 99,
+ 95,121, 49, 0,102, 97, 99, 95,121, 50, 0, 99,111,108,110, 97,109,101, 91, 51, 50, 93, 0, 98,107,116,121,112,101, 0,114,111,
+116, 97,116,105,111,110, 0,103, 97,109, 99,111, 0,110,111, 95,122, 98,117,102, 0,102,115,116,111,112, 0,109, 97,120, 98,108,
+117,114, 0, 98,116,104,114,101,115,104, 0, 42,100,105, 99,116, 0, 42,110,111,100,101, 0, 97,110,103,108,101, 95,111,102,115,
+ 0, 99,111,108,109,111,100, 0,109,105,120, 0,116,104,114,101,115,104,111,108,100, 0,102, 97,100,101, 0,109, 0, 99, 0,106,
+105,116, 0,112,114,111,106, 0,102,105,116, 0,115,108,111,112,101, 91, 51, 93, 0,112,111,119,101,114, 91, 51, 93, 0,108,105,
+102,116, 95,108,103,103, 91, 51, 93, 0,103, 97,109,109, 97, 95,105,110,118, 91, 51, 93, 0,108,105,109, 99,104, 97,110, 0,117,
+110,115,112,105,108,108, 0,108,105,109,115, 99, 97,108,101, 0,117,115,112,105,108,108,114, 0,117,115,112,105,108,108,103, 0,
+117,115,112,105,108,108, 98, 0,115,104,111,114,116,121, 0,109,105,110,116, 97, 98,108,101, 0,109, 97,120,116, 97, 98,108,101,
+ 0,101,120,116, 95,105,110, 91, 50, 93, 0,101,120,116, 95,111,117,116, 91, 50, 93, 0, 42, 99,117,114,118,101, 0, 42,116, 97,
+ 98,108,101, 0, 42,112,114,101,109,117,108,116, 97, 98,108,101, 0,112,114,101,115,101,116, 0, 99,104, 97,110,103,101,100, 95,
+116,105,109,101,115,116, 97,109,112, 0, 99,117,114,114, 0, 99,108,105,112,114, 0, 99,109, 91, 52, 93, 0, 98,108, 97, 99,107,
+ 91, 51, 93, 0,119,104,105,116,101, 91, 51, 93, 0, 98,119,109,117,108, 91, 51, 93, 0,115, 97,109,112,108,101, 91, 51, 93, 0,
+120, 95,114,101,115,111,108,117,116,105,111,110, 0,100, 97,116, 97, 95,114, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,103, 91,
+ 50, 53, 54, 93, 0,100, 97,116, 97, 95, 98, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,108,117,109, 97, 91, 50, 53, 54, 93, 0,
+115, 97,109,112,108,101, 95,102,117,108,108, 0,115, 97,109,112,108,101, 95,108,105,110,101,115, 0, 97, 99, 99,117,114, 97, 99,
+121, 0,119, 97,118,101,102,114,109, 95,109,111,100,101, 0,119, 97,118,101,102,114,109, 95, 97,108,112,104, 97, 0,119, 97,118,
+101,102,114,109, 95,121,102, 97, 99, 0,119, 97,118,101,102,114,109, 95,104,101,105,103,104,116, 0,118,101, 99,115, 99,111,112,
+101, 95, 97,108,112,104, 97, 0,118,101, 99,115, 99,111,112,101, 95,104,101,105,103,104,116, 0,109,105,110,109, 97,120, 91, 51,
+ 93, 91, 50, 93, 0,104,105,115,116, 0, 42,119, 97,118,101,102,111,114,109, 95, 49, 0, 42,119, 97,118,101,102,111,114,109, 95,
+ 50, 0, 42,119, 97,118,101,102,111,114,109, 95, 51, 0, 42,118,101, 99,115, 99,111,112,101, 0,119, 97,118,101,102,111,114,109,
+ 95,116,111,116, 0,111,102,102,115,101,116, 91, 50, 93, 0, 99,108,111,110,101, 0,109,116,101,120, 0, 42,105, 99,111,110, 95,
+105,109, 98,117,102, 0,105, 99,111,110, 95,102,105,108,101,112, 97,116,104, 91, 50, 52, 48, 93, 0,105, 99,111,110, 95,109,111,
+100,101, 0,110,111,114,109, 97,108, 95,119,101,105,103,104,116, 0,111, 98, 95,109,111,100,101, 0,106,105,116,116,101,114, 0,
+115,109,111,111,116,104, 95,115,116,114,111,107,101, 95,114, 97,100,105,117,115, 0,115,109,111,111,116,104, 95,115,116,114,111,
+107,101, 95,102, 97, 99,116,111,114, 0,114, 97,116,101, 0,114,103, 98, 91, 51, 93, 0,115, 99,117,108,112,116, 95,112,108, 97,
+110,101, 0,112,108, 97,110,101, 95,111,102,102,115,101,116, 0,115, 99,117,108,112,116, 95,116,111,111,108, 0,118,101,114,116,
+101,120,112, 97,105,110,116, 95,116,111,111,108, 0,105,109, 97,103,101,112, 97,105,110,116, 95,116,111,111,108, 0, 97,117,116,
+111,115,109,111,111,116,104, 95,102, 97, 99,116,111,114, 0, 99,114,101, 97,115,101, 95,112,105,110, 99,104, 95,102, 97, 99,116,
+111,114, 0,112,108, 97,110,101, 95,116,114,105,109, 0,116,101,120,116,117,114,101, 95,115, 97,109,112,108,101, 95, 98,105, 97,
+115, 0,116,101,120,116,117,114,101, 95,111,118,101,114,108, 97,121, 95, 97,108,112,104, 97, 0,117,110,112,114,111,106,101, 99,
+116,101,100, 95,114, 97,100,105,117,115, 0, 97,100,100, 95, 99,111,108, 91, 51, 93, 0,115,117, 98, 95, 99,111,108, 91, 51, 93,
+ 0, 97, 99,116,105,118,101, 95,114,110,100, 0, 97, 99,116,105,118,101, 95, 99,108,111,110,101, 0, 97, 99,116,105,118,101, 95,
+109, 97,115,107, 0, 42,108, 97,121,101,114,115, 0,116,111,116,108, 97,121,101,114, 0,109, 97,120,108, 97,121,101,114, 0,116,
+111,116,115,105,122,101, 0, 42,112,111,111,108, 0, 42,101,120,116,101,114,110, 97,108, 0,118,101,108, 91, 51, 93, 0,114,111,
+116, 91, 52, 93, 0, 97,118,101, 91, 51, 93, 0, 42,103,114,111,117,110,100, 0,119, 97,110,100,101,114, 91, 51, 93, 0,114,101,
+115,116, 95,108,101,110,103,116,104, 0,112, 97,114,116,105, 99,108,101, 95,105,110,100,101,120, 91, 50, 93, 0,100,101,108,101,
+116,101, 95,102,108, 97,103, 0,110,117,109, 0,112, 97,114,101,110,116, 0,112, 97, 91, 52, 93, 0,119, 91, 52, 93, 0,102,117,
+118, 91, 52, 93, 0,102,111,102,102,115,101,116, 0,114,116, 91, 50, 93, 0,112,114,101,118, 95,115,116, 97,116,101, 0, 42,104,
+ 97,105,114, 0, 42, 98,111,105,100, 0,100,105,101,116,105,109,101, 0,110,117,109, 95,100,109, 99, 97, 99,104,101, 0,104, 97,
+105,114, 95,105,110,100,101,120, 0, 97,108,105,118,101, 0,115,112,114,105,110,103, 95,107, 0,112,108, 97,115,116,105, 99,105,
+116,121, 95, 99,111,110,115,116, 97,110,116, 0,121,105,101,108,100, 95,114, 97,116,105,111, 0,118,105,115, 99,111,115,105,116,
+121, 95,111,109,101,103, 97, 0,118,105,115, 99,111,115,105,116,121, 95, 98,101,116, 97, 0,115,116,105,102,102,110,101,115,115,
+ 95,107, 0,115,116,105,102,102,110,101,115,115, 95,107,110,101, 97,114, 0,114,101,115,116, 95,100,101,110,115,105,116,121, 0,
+ 98,117,111,121, 97,110, 99,121, 0, 42, 98,111,105,100,115, 0, 42,102,108,117,105,100, 0,100,105,115,116,114, 0,112,104,121,
+115,116,121,112,101, 0, 97,118,101,109,111,100,101, 0,114,101, 97, 99,116,101,118,101,110,116, 0,100,114, 97,119, 0,100,114,
+ 97,119, 95, 97,115, 0,100,114, 97,119, 95,115,105,122,101, 0, 99,104,105,108,100,116,121,112,101, 0,114,101,110, 95, 97,115,
+ 0,115,117, 98,102,114, 97,109,101,115, 0,114,101,110, 95,115,116,101,112, 0,104, 97,105,114, 95,115,116,101,112, 0,107,101,
+121,115, 95,115,116,101,112, 0, 97,100, 97,112,116, 95, 97,110,103,108,101, 0, 97,100, 97,112,116, 95,112,105,120, 0,114,111,
+116,102,114,111,109, 0,105,110,116,101,103,114, 97,116,111,114, 0, 98, 98, 95, 97,108,105,103,110, 0, 98, 98, 95,117,118, 95,
+115,112,108,105,116, 0, 98, 98, 95, 97,110,105,109, 0, 98, 98, 95,115,112,108,105,116, 95,111,102,102,115,101,116, 0, 98, 98,
+ 95,116,105,108,116, 0, 98, 98, 95,114, 97,110,100, 95,116,105,108,116, 0, 98, 98, 95,111,102,102,115,101,116, 91, 50, 93, 0,
+115,105,109,112,108,105,102,121, 95,114,101,102,115,105,122,101, 0,115,105,109,112,108,105,102,121, 95,114, 97,116,101, 0,115,
+105,109,112,108,105,102,121, 95,116,114, 97,110,115,105,116,105,111,110, 0,115,105,109,112,108,105,102,121, 95,118,105,101,119,
+112,111,114,116, 0,116,105,109,101,116,119,101, 97,107, 0,106,105,116,102, 97, 99, 0,101,102,102, 95,104, 97,105,114, 0,103,
+114,105,100, 95,114,101,115, 0,112, 97,114,116,102, 97, 99, 0,116, 97,110,102, 97, 99, 0,116, 97,110,112,104, 97,115,101, 0,
+114,101, 97, 99,116,102, 97, 99, 0,111, 98, 95,118,101,108, 91, 51, 93, 0, 97,118,101,102, 97, 99, 0,112,104, 97,115,101,102,
+ 97, 99, 0,114, 97,110,100,114,111,116,102, 97, 99, 0,114, 97,110,100,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,100,115,
+105,122,101, 0,114,101, 97, 99,116,115,104, 97,112,101, 0, 97, 99, 99, 91, 51, 93, 0,100,114, 97,103,102, 97, 99, 0, 98,114,
+111,119,110,102, 97, 99, 0,100, 97,109,112,102, 97, 99, 0,114, 97,110,100,108,101,110,103,116,104, 0, 99,104,105,108,100, 95,
+110, 98,114, 0,114,101,110, 95, 99,104,105,108,100, 95,110, 98,114, 0,112, 97,114,101,110,116,115, 0, 99,104,105,108,100,115,
+105,122,101, 0, 99,104,105,108,100,114, 97,110,100,115,105,122,101, 0, 99,104,105,108,100,114, 97,100, 0, 99,104,105,108,100,
+102,108, 97,116, 0, 99,108,117,109,112,112,111,119, 0,107,105,110,107, 95,102,108, 97,116, 0,107,105,110,107, 95, 97,109,112,
+ 95, 99,108,117,109,112, 0,114,111,117,103,104, 49, 0,114,111,117,103,104, 49, 95,115,105,122,101, 0,114,111,117,103,104, 50,
+ 0,114,111,117,103,104, 50, 95,115,105,122,101, 0,114,111,117,103,104, 50, 95,116,104,114,101,115, 0,114,111,117,103,104, 95,
+101,110,100, 0,114,111,117,103,104, 95,101,110,100, 95,115,104, 97,112,101, 0, 99,108,101,110,103,116,104, 0, 99,108,101,110,
+103,116,104, 95,116,104,114,101,115, 0,112, 97,114,116,105,110,103, 95,102, 97, 99, 0,112, 97,114,116,105,110,103, 95,109,105,
+110, 0,112, 97,114,116,105,110,103, 95,109, 97,120, 0, 98,114, 97,110, 99,104, 95,116,104,114,101,115, 0,100,114, 97,119, 95,
+108,105,110,101, 91, 50, 93, 0,112, 97,116,104, 95,115,116, 97,114,116, 0,112, 97,116,104, 95,101,110,100, 0,116,114, 97,105,
+108, 95, 99,111,117,110,116, 0,107,101,121,101,100, 95,108,111,111,112,115, 0,100,117,112,108,105,119,101,105,103,104,116,115,
+ 0, 42,101,102,102, 95,103,114,111,117,112, 0, 42,100,117,112, 95,111, 98, 0, 42, 98, 98, 95,111, 98, 0, 42,112,100, 50, 0,
+ 42,112, 97,114,116, 0, 42,112, 97,114,116,105, 99,108,101,115, 0, 42, 42,112, 97,116,104, 99, 97, 99,104,101, 0, 42, 42, 99,
+104,105,108,100, 99, 97, 99,104,101, 0,112, 97,116,104, 99, 97, 99,104,101, 98,117,102,115, 0, 99,104,105,108,100, 99, 97, 99,
+104,101, 98,117,102,115, 0, 42, 99,108,109,100, 0, 42,104, 97,105,114, 95,105,110, 95,100,109, 0, 42,104, 97,105,114, 95,111,
+117,116, 95,100,109, 0, 42,116, 97,114,103,101,116, 95,111, 98, 0, 42,108, 97,116,116,105, 99,101, 0,116,114,101,101, 95,102,
+114, 97,109,101, 0, 99,104,105,108,100, 95,115,101,101,100, 0,116,111,116, 99,104,105,108,100, 0,116,111,116, 99, 97, 99,104,
+101,100, 0,116,111,116, 99,104,105,108,100, 99, 97, 99,104,101, 0,116, 97,114,103,101,116, 95,112,115,121,115, 0,116,111,116,
+107,101,121,101,100, 0, 98, 97,107,101,115,112, 97, 99,101, 0, 98, 98, 95,117,118,110, 97,109,101, 91, 51, 93, 91, 51, 50, 93,
+ 0,118,103,114,111,117,112, 91, 49, 50, 93, 0,118,103, 95,110,101,103, 0,114,116, 51, 0, 42,114,101,110,100,101,114,100, 97,
+116, 97, 0, 42,101,102,102,101, 99,116,111,114,115, 0, 42,102,108,117,105,100, 95,115,112,114,105,110,103,115, 0,116,111,116,
+ 95,102,108,117,105,100,115,112,114,105,110,103,115, 0, 97,108,108,111, 99, 95,102,108,117,105,100,115,112,114,105,110,103,115,
+ 0, 42,116,114,101,101, 0, 42,112,100,100, 0, 42,102,114, 97,110,100, 0, 67,100,105,115, 0, 67,118,105, 0,115,116,114,117,
+ 99,116,117,114, 97,108, 0, 98,101,110,100,105,110,103, 0,109, 97,120, 95, 98,101,110,100, 0,109, 97,120, 95,115,116,114,117,
+ 99,116, 0,109, 97,120, 95,115,104,101, 97,114, 0, 97,118,103, 95,115,112,114,105,110,103, 95,108,101,110, 0,116,105,109,101,
+115, 99, 97,108,101, 0,101,102,102, 95,102,111,114, 99,101, 95,115, 99, 97,108,101, 0,101,102,102, 95,119,105,110,100, 95,115,
+ 99, 97,108,101, 0,115,105,109, 95,116,105,109,101, 95,111,108,100, 0,118,101,108,111, 99,105,116,121, 95,115,109,111,111,116,
+104, 0, 99,111,108,108,105,100,101,114, 95,102,114,105, 99,116,105,111,110, 0,115,116,101,112,115, 80,101,114, 70,114, 97,109,
+101, 0,112,114,101,114,111,108,108, 0,109, 97,120,115,112,114,105,110,103,108,101,110, 0,115,111,108,118,101,114, 95,116,121,
+112,101, 0,118,103,114,111,117,112, 95, 98,101,110,100, 0,118,103,114,111,117,112, 95,109, 97,115,115, 0,118,103,114,111,117,
+112, 95,115,116,114,117, 99,116, 0,115,104, 97,112,101,107,101,121, 95,114,101,115,116, 0,112,114,101,115,101,116,115, 0,114,
+101,115,101,116, 0, 42, 99,111,108,108,105,115,105,111,110, 95,108,105,115,116, 0,101,112,115,105,108,111,110, 0,115,101,108,
+102, 95,102,114,105, 99,116,105,111,110, 0,115,101,108,102,101,112,115,105,108,111,110, 0,115,101,108,102, 95,108,111,111,112,
+ 95, 99,111,117,110,116, 0,108,111,111,112, 95, 99,111,117,110,116, 0,112,114,101,115,115,117,114,101, 0,116,104,105, 99,107,
+110,101,115,115, 0,115,116,114,111,107,101,115, 0,102,114, 97,109,101,110,117,109, 0, 42, 97, 99,116,102,114, 97,109,101, 0,
+103,115,116,101,112, 0,105,110,102,111, 91, 49, 50, 56, 93, 0,115, 98,117,102,102,101,114, 95,115,105,122,101, 0,115, 98,117,
+102,102,101,114, 95,115,102,108, 97,103, 0, 42,115, 98,117,102,102,101,114, 0,108,105,115,116, 0,112,114,105,110,116,108,101,
+118,101,108, 0,115,116,111,114,101,108,101,118,101,108, 0, 42,114,101,112,111,114,116,116,105,109,101,114, 0, 42,119,105,110,
+100,114, 97,119, 97, 98,108,101, 0, 42,119,105,110, 97, 99,116,105,118,101, 0,119,105,110,100,111,119,115, 0,105,110,105,116,
+105, 97,108,105,122,101,100, 0,102,105,108,101, 95,115, 97,118,101,100, 0,111,112, 95,117,110,100,111, 95,100,101,112,116,104,
+ 0,111,112,101,114, 97,116,111,114,115, 0,113,117,101,117,101, 0,114,101,112,111,114,116,115, 0,106,111, 98,115, 0,112, 97,
+105,110,116, 99,117,114,115,111,114,115, 0,100,114, 97,103,115, 0,107,101,121, 99,111,110,102,105,103,115, 0, 42,100,101,102,
+ 97,117,108,116, 99,111,110,102, 0,116,105,109,101,114,115, 0, 42, 97,117,116,111,115, 97,118,101,116,105,109,101,114, 0, 42,
+103,104,111,115,116,119,105,110, 0,103,114, 97, 98, 99,117,114,115,111,114, 0, 42,115, 99,114,101,101,110, 0, 42,110,101,119,
+115, 99,114,101,101,110, 0,115, 99,114,101,101,110,110, 97,109,101, 91, 51, 50, 93, 0,112,111,115,120, 0,112,111,115,121, 0,
+119,105,110,100,111,119,115,116, 97,116,101, 0,109,111,110,105,116,111,114, 0,108, 97,115,116, 99,117,114,115,111,114, 0, 97,
+100,100,109,111,117,115,101,109,111,118,101, 0, 42,101,118,101,110,116,115,116, 97,116,101, 0, 42, 99,117,114,115,119,105,110,
+ 0, 42,116,119,101, 97,107, 0,100,114, 97,119,109,101,116,104,111,100, 0,100,114, 97,119,102, 97,105,108, 0, 42,100,114, 97,
+119,100, 97,116, 97, 0,109,111,100, 97,108,104, 97,110,100,108,101,114,115, 0,115,117, 98,119,105,110,100,111,119,115, 0,103,
+101,115,116,117,114,101, 0,105,100,110, 97,109,101, 91, 54, 52, 93, 0,112,114,111,112,118, 97,108,117,101, 0,115,104,105,102,
+116, 0, 99,116,114,108, 0, 97,108,116, 0,111,115,107,101,121, 0,107,101,121,109,111,100,105,102,105,101,114, 0,109, 97,112,
+116,121,112,101, 0, 42,112,116,114, 0,105,116,101,109,115, 0,115,112, 97, 99,101,105,100, 0,114,101,103,105,111,110,105,100,
+ 0,107,109,105, 95,105,100, 0, 40, 42,112,111,108,108, 41, 40, 41, 0, 42,109,111,100, 97,108, 95,105,116,101,109,115, 0, 98,
+ 97,115,101,110, 97,109,101, 91, 54, 52, 93, 0, 97, 99,116,107,101,121,109, 97,112, 0, 42, 99,117,115,116,111,109,100, 97,116,
+ 97, 0, 42,112,121, 95,105,110,115,116, 97,110, 99,101, 0, 42,114,101,112,111,114,116,115, 0,109, 97, 99,114,111, 0, 42,111,
+112,109, 0, 42,101,100, 97,116, 97, 0,105,110,102,108,117,101,110, 99,101, 0, 42, 99,111,101,102,102,105, 99,105,101,110,116,
+115, 0, 97,114,114, 97,121,115,105,122,101, 0,112,111,108,121, 95,111,114,100,101,114, 0, 97,109,112,108,105,116,117,100,101,
+ 0,112,104, 97,115,101, 95,109,117,108,116,105,112,108,105,101,114, 0,112,104, 97,115,101, 95,111,102,102,115,101,116, 0,118,
+ 97,108,117,101, 95,111,102,102,115,101,116, 0,109,105,100,118, 97,108, 0, 98,101,102,111,114,101, 95,109,111,100,101, 0, 97,
+102,116,101,114, 95,109,111,100,101, 0, 98,101,102,111,114,101, 95, 99,121, 99,108,101,115, 0, 97,102,116,101,114, 95, 99,121,
+ 99,108,101,115, 0,114,101, 99,116, 0,112,104, 97,115,101, 0,109,111,100,105,102,105, 99, 97,116,105,111,110, 0,115,116,101,
+112, 95,115,105,122,101, 0, 42,114,110, 97, 95,112, 97,116,104, 0,112, 99,104, 97,110, 95,110, 97,109,101, 91, 51, 50, 93, 0,
+116,114, 97,110,115, 67,104, 97,110, 0,105,100,116,121,112,101, 0,116, 97,114,103,101,116,115, 91, 56, 93, 0,110,117,109, 95,
+116, 97,114,103,101,116,115, 0,118, 97,114,105, 97, 98,108,101,115, 0,101,120,112,114,101,115,115,105,111,110, 91, 50, 53, 54,
+ 93, 0, 42,101,120,112,114, 95, 99,111,109,112, 0,118,101, 99, 91, 50, 93, 0, 42,102,112,116, 0, 97,114,114, 97,121, 95,105,
+110,100,101,120, 0, 99,111,108,111,114, 95,109,111,100,101, 0, 99,111,108,111,114, 91, 51, 93, 0,102,114,111,109, 91, 49, 50,
+ 56, 93, 0,116,111, 91, 49, 50, 56, 93, 0,109, 97,112,112,105,110,103,115, 0,115,116,114,105,112,115, 0, 42,114,101,109, 97,
+112, 0,102, 99,117,114,118,101,115, 0,115,116,114,105,112, 95,116,105,109,101, 0, 98,108,101,110,100,109,111,100,101, 0,101,
+120,116,101,110,100,109,111,100,101, 0,103,114,111,117,112, 91, 54, 52, 93, 0,103,114,111,117,112,109,111,100,101, 0,107,101,
+121,105,110,103,102,108, 97,103, 0,112, 97,116,104,115, 0,116,121,112,101,105,110,102,111, 91, 54, 52, 93, 0, 97, 99,116,105,
+118,101, 95,112, 97,116,104, 0, 42,116,109,112, 97, 99,116, 0,110,108, 97, 95,116,114, 97, 99,107,115, 0, 42, 97, 99,116,115,
+116,114,105,112, 0,100,114,105,118,101,114,115, 0,111,118,101,114,114,105,100,101,115, 0, 97, 99,116, 95, 98,108,101,110,100,
+109,111,100,101, 0, 97, 99,116, 95,101,120,116,101,110,100,109,111,100,101, 0, 97, 99,116, 95,105,110,102,108,117,101,110, 99,
+101, 0,114,117,108,101, 0,111,112,116,105,111,110,115, 0,102,101, 97,114, 95,102, 97, 99,116,111,114, 0,115,105,103,110, 97,
+108, 95,105,100, 0,108,111,111,107, 95, 97,104,101, 97,100, 0,111,108,111, 99, 91, 51, 93, 0,113,117,101,117,101, 95,115,105,
+122,101, 0,119, 97,110,100,101,114, 0,102,108,101,101, 95,100,105,115,116, 97,110, 99,101, 0,104,101, 97,108,116,104, 0,115,
+116, 97,116,101, 95,105,100, 0,114,117,108,101,115, 0, 99,111,110,100,105,116,105,111,110,115, 0, 97, 99,116,105,111,110,115,
+ 0,114,117,108,101,115,101,116, 95,116,121,112,101, 0,114,117,108,101, 95,102,117,122,122,105,110,101,115,115, 0,108, 97,115,
+116, 95,115,116, 97,116,101, 95,105,100, 0,108, 97,110,100,105,110,103, 95,115,109,111,111,116,104,110,101,115,115, 0, 98, 97,
+110,107,105,110,103, 0, 97,103,103,114,101,115,115,105,111,110, 0, 97,105,114, 95,109,105,110, 95,115,112,101,101,100, 0, 97,
+105,114, 95,109, 97,120, 95,115,112,101,101,100, 0, 97,105,114, 95,109, 97,120, 95, 97, 99, 99, 0, 97,105,114, 95,109, 97,120,
+ 95, 97,118,101, 0, 97,105,114, 95,112,101,114,115,111,110, 97,108, 95,115,112, 97, 99,101, 0,108, 97,110,100, 95,106,117,109,
+112, 95,115,112,101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95,115,112,101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95,
+ 97, 99, 99, 0,108, 97,110,100, 95,109, 97,120, 95, 97,118,101, 0,108, 97,110,100, 95,112,101,114,115,111,110, 97,108, 95,115,
+112, 97, 99,101, 0,108, 97,110,100, 95,115,116,105, 99,107, 95,102,111,114, 99,101, 0,115,116, 97,116,101,115, 0, 42,115,109,
+100, 0, 42,102,108,117,105,100, 95,103,114,111,117,112, 0, 42, 99,111,108,108, 95,103,114,111,117,112, 0, 42,119,116, 0, 42,
+116,101,120, 95,119,116, 0, 42,116,101,120, 95,115,104, 97,100,111,119, 0, 42,115,104, 97,100,111,119, 0,112, 48, 91, 51, 93,
+ 0,112, 49, 91, 51, 93, 0,100,120, 0,111,109,101,103, 97, 0,116,101,109,112, 65,109, 98, 0, 98,101,116, 97, 0,114,101,115,
+ 91, 51, 93, 0, 97,109,112,108,105,102,121, 0,109, 97,120,114,101,115, 0,118,105,101,119,115,101,116,116,105,110,103,115, 0,
+110,111,105,115,101, 0,100,105,115,115, 95,112,101,114, 99,101,110,116, 0,100,105,115,115, 95,115,112,101,101,100, 0,114,101,
+115, 95,119,116, 91, 51, 93, 0,100,120, 95,119,116, 0,118, 51,100,110,117,109, 0, 99, 97, 99,104,101, 95, 99,111,109,112, 0,
+ 99, 97, 99,104,101, 95,104,105,103,104, 95, 99,111,109,112, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 91, 50, 93, 0,
+112,116, 99, 97, 99,104,101,115, 91, 50, 93, 0, 98,111,114,100,101,114, 95, 99,111,108,108,105,115,105,111,110,115, 0,116,105,
+109,101, 95,115, 99, 97,108,101, 0,118,111,114,116,105, 99,105,116,121, 0,118,101,108,111, 99,105,116,121, 91, 50, 93, 0,118,
+101,108, 95,109,117,108,116,105, 0,118,103,114,112, 95,104,101, 97,116, 95,115, 99, 97,108,101, 91, 50, 93, 0,118,103,114,111,
+117,112, 95,102,108,111,119, 0,118,103,114,111,117,112, 95,100,101,110,115,105,116,121, 0,118,103,114,111,117,112, 95,104,101,
+ 97,116, 0, 42,112,111,105,110,116,115, 95,111,108,100, 0, 42,118,101,108, 0,109, 97,116, 95,111,108,100, 91, 52, 93, 91, 52,
+ 93, 0, 0, 0, 84, 89, 80, 69,203, 1, 0, 0, 99,104, 97,114, 0,117, 99,104, 97,114, 0,115,104,111,114,116, 0,117,115,104,
+111,114,116, 0,105,110,116, 0,108,111,110,103, 0,117,108,111,110,103, 0,102,108,111, 97,116, 0,100,111,117, 98,108,101, 0,
+118,111,105,100, 0, 76,105,110,107, 0, 76,105,110,107, 68, 97,116, 97, 0, 76,105,115,116, 66, 97,115,101, 0,118,101, 99, 50,
+115, 0,118,101, 99, 50,102, 0,114, 99,116,105, 0,114, 99,116,102, 0, 73, 68, 80,114,111,112,101,114,116,121, 68, 97,116, 97,
+ 0, 73, 68, 80,114,111,112,101,114,116,121, 0, 73, 68, 0, 76,105, 98,114, 97,114,121, 0, 70,105,108,101, 68, 97,116, 97, 0,
+ 80,114,101,118,105,101,119, 73,109, 97,103,101, 0, 73,112,111, 68,114,105,118,101,114, 0, 79, 98,106,101, 99,116, 0, 73,112,
+111, 67,117,114,118,101, 0, 66, 80,111,105,110,116, 0, 66,101,122, 84,114,105,112,108,101, 0, 73,112,111, 0, 75,101,121, 66,
+108,111, 99,107, 0, 75,101,121, 0, 65,110,105,109, 68, 97,116, 97, 0, 84,101,120,116, 76,105,110,101, 0, 84,101,120,116, 77,
+ 97,114,107,101,114, 0, 84,101,120,116, 0, 80, 97, 99,107,101,100, 70,105,108,101, 0, 67, 97,109,101,114, 97, 0, 73,109, 97,
+103,101, 85,115,101,114, 0, 83, 99,101,110,101, 0, 73,109, 97,103,101, 0, 71, 80, 85, 84,101,120,116,117,114,101, 0, 97,110,
+105,109, 0, 82,101,110,100,101,114, 82,101,115,117,108,116, 0, 77, 84,101,120, 0, 84,101,120, 0, 80,108,117,103,105,110, 84,
+101,120, 0, 67, 66, 68, 97,116, 97, 0, 67,111,108,111,114, 66, 97,110,100, 0, 69,110,118, 77, 97,112, 0, 73,109, 66,117,102,
+ 0, 80,111,105,110,116, 68,101,110,115,105,116,121, 0, 86,111,120,101,108, 68, 97,116, 97, 0, 98, 78,111,100,101, 84,114,101,
+101, 0, 84,101,120, 77, 97,112,112,105,110,103, 0, 76, 97,109,112, 0, 67,117,114,118,101, 77, 97,112,112,105,110,103, 0, 86,
+111,108,117,109,101, 83,101,116,116,105,110,103,115, 0, 77, 97,116,101,114,105, 97,108, 0, 71,114,111,117,112, 0, 86, 70,111,
+110,116, 0, 86, 70,111,110,116, 68, 97,116, 97, 0, 77,101,116, 97, 69,108,101,109, 0, 66,111,117,110,100, 66,111,120, 0, 77,
+101,116, 97, 66, 97,108,108, 0, 78,117,114, 98, 0, 67,104, 97,114, 73,110,102,111, 0, 84,101,120,116, 66,111,120, 0, 69,100,
+105,116, 78,117,114, 98, 0, 71, 72, 97,115,104, 0, 67,117,114,118,101, 0, 80, 97,116,104, 0, 83,101,108, 66,111,120, 0, 69,
+100,105,116, 70,111,110,116, 0, 77,101,115,104, 0, 77, 70, 97, 99,101, 0, 77, 84, 70, 97, 99,101, 0, 84, 70, 97, 99,101, 0,
+ 77, 86,101,114,116, 0, 77, 69,100,103,101, 0, 77, 68,101,102,111,114,109, 86,101,114,116, 0, 77, 67,111,108, 0, 77, 83,116,
+105, 99,107,121, 0, 77, 83,101,108,101, 99,116, 0, 69,100,105,116, 77,101,115,104, 0, 67,117,115,116,111,109, 68, 97,116, 97,
+ 0, 77,117,108,116,105,114,101,115, 0, 80, 97,114,116,105, 97,108, 86,105,115,105, 98,105,108,105,116,121, 0, 77, 68,101,102,
+111,114,109, 87,101,105,103,104,116, 0, 77, 84,101,120, 80,111,108,121, 0, 77, 76,111,111,112, 85, 86, 0, 77, 76,111,111,112,
+ 67,111,108, 0, 77, 70,108,111, 97,116, 80,114,111,112,101,114,116,121, 0, 77, 73,110,116, 80,114,111,112,101,114,116,121, 0,
+ 77, 83,116,114,105,110,103, 80,114,111,112,101,114,116,121, 0, 79,114,105,103, 83,112, 97, 99,101, 70, 97, 99,101, 0, 77, 68,
+105,115,112,115, 0, 77,117,108,116,105,114,101,115, 67,111,108, 0, 77,117,108,116,105,114,101,115, 67,111,108, 70, 97, 99,101,
+ 0, 77,117,108,116,105,114,101,115, 70, 97, 99,101, 0, 77,117,108,116,105,114,101,115, 69,100,103,101, 0, 77,117,108,116,105,
+114,101,115, 76,101,118,101,108, 0, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,117, 98,115,117,114,102, 77,111,100,
+105,102,105,101,114, 68, 97,116, 97, 0, 76, 97,116,116,105, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,117,
+114,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66,117,105,108,100, 77,111,100,105,102,105,101,114, 68, 97,116,
+ 97, 0, 77, 97,115,107, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,114, 97,121, 77,111,100,105,102,105,101,114,
+ 68, 97,116, 97, 0, 77,105,114,114,111,114, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 69,100,103,101, 83,112,108,105,
+116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66,101,118,101,108, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0,
+ 66, 77,101,115,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,107,101, 77,111,100,105,102,105,101,114, 68,
+ 97,116, 97, 0, 83,109,111,107,101, 68,111,109, 97,105,110, 83,101,116,116,105,110,103,115, 0, 83,109,111,107,101, 70,108,111,
+119, 83,101,116,116,105,110,103,115, 0, 83,109,111,107,101, 67,111,108,108, 83,101,116,116,105,110,103,115, 0, 68,105,115,112,
+108, 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 85, 86, 80,114,111,106,101, 99,116, 77,111,100,105,102,105,
+101,114, 68, 97,116, 97, 0, 68,101, 99,105,109, 97,116,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,111,
+116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67, 97,115,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0,
+ 87, 97,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,109, 97,116,117,114,101, 77,111,100,105,102,105,101,
+114, 68, 97,116, 97, 0, 72,111,111,107, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,111,102,116, 98,111,100,121, 77,
+111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111,116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108,
+111,116,104, 0, 67,108,111,116,104, 83,105,109, 83,101,116,116,105,110,103,115, 0, 67,108,111,116,104, 67,111,108,108, 83,101,
+116,116,105,110,103,115, 0, 80,111,105,110,116, 67, 97, 99,104,101, 0, 67,111,108,108,105,115,105,111,110, 77,111,100,105,102,
+105,101,114, 68, 97,116, 97, 0, 66, 86, 72, 84,114,101,101, 0, 83,117,114,102, 97, 99,101, 77,111,100,105,102,105,101,114, 68,
+ 97,116, 97, 0, 68,101,114,105,118,101,100, 77,101,115,104, 0, 66, 86, 72, 84,114,101,101, 70,114,111,109, 77,101,115,104, 0,
+ 66,111,111,108,101, 97,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, 68,101,102, 73,110,102,108,117,101,110, 99,
+101, 0, 77, 68,101,102, 67,101,108,108, 0, 77,101,115,104, 68,101,102,111,114,109, 77,111,100,105,102,105,101,114, 68, 97,116,
+ 97, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,
+116,105, 99,108,101, 83,121,115,116,101,109, 0, 80, 97,114,116,105, 99,108,101, 73,110,115,116, 97,110, 99,101, 77,111,100,105,
+102,105,101,114, 68, 97,116, 97, 0, 69,120,112,108,111,100,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77,117,108,
+116,105,114,101,115, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105,109, 77,111,100,105,102,105,
+101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105,109, 83,101,116,116,105,110,103,115, 0, 83,104,114,105,110,107,119,114,
+ 97,112, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,105,109,112,108,101, 68,101,102,111,114,109, 77,111,100,105,102,
+105,101,114, 68, 97,116, 97, 0, 83,104, 97,112,101, 75,101,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,111,108,
+105,100,105,102,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83, 99,114,101,119, 77,111,100,105,102,105,101,114, 68,
+ 97,116, 97, 0, 69,100,105,116, 76, 97,116,116, 0, 76, 97,116,116,105, 99,101, 0, 98, 68,101,102,111,114,109, 71,114,111,117,
+112, 0, 83, 99,117,108,112,116, 83,101,115,115,105,111,110, 0, 98, 65, 99,116,105,111,110, 0, 98, 80,111,115,101, 0, 98, 71,
+ 80,100, 97,116, 97, 0, 98, 65,110,105,109, 86,105,122, 83,101,116,116,105,110,103,115, 0, 98, 77,111,116,105,111,110, 80, 97,
+116,104, 0, 66,117,108,108,101,116, 83,111,102,116, 66,111,100,121, 0, 80, 97,114,116, 68,101,102,108,101, 99,116, 0, 83,111,
+102,116, 66,111,100,121, 0, 79, 98, 72,111,111,107, 0, 68,117,112,108,105, 79, 98,106,101, 99,116, 0, 82, 78, 71, 0, 69,102,
+102,101, 99,116,111,114, 87,101,105,103,104,116,115, 0, 80, 84, 67, 97, 99,104,101, 69,120,116,114, 97, 0, 80, 84, 67, 97, 99,
+104,101, 77,101,109, 0, 80, 84, 67, 97, 99,104,101, 69,100,105,116, 0, 83, 66, 86,101,114,116,101,120, 0, 66,111,100,121, 80,
+111,105,110,116, 0, 66,111,100,121, 83,112,114,105,110,103, 0, 83, 66, 83, 99,114, 97,116, 99,104, 0, 87,111,114,108,100, 0,
+ 66, 97,115,101, 0, 65,118,105, 67,111,100,101, 99, 68, 97,116, 97, 0, 81,117,105, 99,107,116,105,109,101, 67,111,100,101, 99,
+ 68, 97,116, 97, 0, 81,117,105, 99,107,116,105,109,101, 67,111,100,101, 99, 83,101,116,116,105,110,103,115, 0, 70, 70, 77,112,
+101,103, 67,111,100,101, 99, 68, 97,116, 97, 0, 65,117,100,105,111, 68, 97,116, 97, 0, 83, 99,101,110,101, 82,101,110,100,101,
+114, 76, 97,121,101,114, 0, 82,101,110,100,101,114, 68, 97,116, 97, 0, 82,101,110,100,101,114, 80,114,111,102,105,108,101, 0,
+ 71, 97,109,101, 68,111,109,101, 0, 71, 97,109,101, 70,114, 97,109,105,110,103, 0, 71, 97,109,101, 68, 97,116, 97, 0, 84,105,
+109,101, 77, 97,114,107,101,114, 0, 80, 97,105,110,116, 0, 66,114,117,115,104, 0, 73,109, 97,103,101, 80, 97,105,110,116, 83,
+101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 66,114,117,115,104, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,
+108,101, 69,100,105,116, 83,101,116,116,105,110,103,115, 0, 84,114, 97,110,115,102,111,114,109, 79,114,105,101,110,116, 97,116,
+105,111,110, 0, 83, 99,117,108,112,116, 0, 86, 80, 97,105,110,116, 0, 84,111,111,108, 83,101,116,116,105,110,103,115, 0, 98,
+ 83,116, 97,116,115, 0, 85,110,105,116, 83,101,116,116,105,110,103,115, 0, 80,104,121,115,105, 99,115, 83,101,116,116,105,110,
+103,115, 0, 69,100,105,116,105,110,103, 0, 83, 99,101,110,101, 83,116, 97,116,115, 0, 68, 97,103, 70,111,114,101,115,116, 0,
+ 66, 71,112,105, 99, 0, 82,101,103,105,111,110, 86,105,101,119, 51, 68, 0, 82,101,110,100,101,114, 73,110,102,111, 0, 82,101,
+116,111,112,111, 86,105,101,119, 68, 97,116, 97, 0, 86,105,101,119, 68,101,112,116,104,115, 0, 83,109,111,111,116,104, 86,105,
+101,119, 83,116,111,114,101, 0,119,109, 84,105,109,101,114, 0, 86,105,101,119, 51, 68, 0, 83,112, 97, 99,101, 76,105,110,107,
+ 0, 86,105,101,119, 50, 68, 0, 83,112, 97, 99,101, 73,110,102,111, 0, 83,112, 97, 99,101, 73,112,111, 0, 98, 68,111,112,101,
+ 83,104,101,101,116, 0, 83,112, 97, 99,101, 66,117,116,115, 0, 83,112, 97, 99,101, 83,101,113, 0, 70,105,108,101, 83,101,108,
+101, 99,116, 80, 97,114, 97,109,115, 0, 83,112, 97, 99,101, 70,105,108,101, 0, 70,105,108,101, 76,105,115,116, 0,119,109, 79,
+112,101,114, 97,116,111,114, 0, 70,105,108,101, 76, 97,121,111,117,116, 0, 83,112, 97, 99,101, 79,111,112,115, 0, 84,114,101,
+101, 83,116,111,114,101, 0, 84,114,101,101, 83,116,111,114,101, 69,108,101,109, 0, 83,112, 97, 99,101, 73,109, 97,103,101, 0,
+ 83, 99,111,112,101,115, 0, 72,105,115,116,111,103,114, 97,109, 0, 83,112, 97, 99,101, 78,108, 97, 0, 83,112, 97, 99,101, 84,
+101,120,116, 0, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 84,105,109,101,
+ 67, 97, 99,104,101, 0, 83,112, 97, 99,101, 84,105,109,101, 0, 83,112, 97, 99,101, 78,111,100,101, 0, 83,112, 97, 99,101, 76,
+111,103,105, 99, 0, 83,112, 97, 99,101, 73,109, 97, 83,101,108, 0, 67,111,110,115,111,108,101, 76,105,110,101, 0, 83,112, 97,
+ 99,101, 67,111,110,115,111,108,101, 0, 83,112, 97, 99,101, 85,115,101,114, 80,114,101,102, 0, 83,112, 97, 99,101, 83,111,117,
+110,100, 0, 83, 99,114, 65,114,101, 97, 0, 98, 83,111,117,110,100, 0,117,105, 70,111,110,116, 0,117,105, 70,111,110,116, 83,
+116,121,108,101, 0,117,105, 83,116,121,108,101, 0,117,105, 87,105,100,103,101,116, 67,111,108,111,114,115, 0,117,105, 87,105,
+100,103,101,116, 83,116, 97,116,101, 67,111,108,111,114,115, 0, 84,104,101,109,101, 85, 73, 0, 84,104,101,109,101, 83,112, 97,
+ 99,101, 0, 84,104,101,109,101, 87,105,114,101, 67,111,108,111,114, 0, 98, 84,104,101,109,101, 0, 98, 65,100,100,111,110, 0,
+ 83,111,108,105,100, 76,105,103,104,116, 0, 85,115,101,114, 68,101,102, 0, 98, 83, 99,114,101,101,110, 0, 83, 99,114, 86,101,
+114,116, 0, 83, 99,114, 69,100,103,101, 0, 80, 97,110,101,108, 0, 80, 97,110,101,108, 84,121,112,101, 0,117,105, 76, 97,121,
+111,117,116, 0, 83,112, 97, 99,101, 84,121,112,101, 0, 65, 82,101,103,105,111,110, 0, 65, 82,101,103,105,111,110, 84,121,112,
+101, 0, 70,105,108,101, 71,108,111, 98, 97,108, 0, 83,116,114,105,112, 69,108,101,109, 0, 83,116,114,105,112, 67,114,111,112,
+ 0, 83,116,114,105,112, 84,114, 97,110,115,102,111,114,109, 0, 83,116,114,105,112, 67,111,108,111,114, 66, 97,108, 97,110, 99,
+101, 0, 83,116,114,105,112, 80,114,111,120,121, 0, 83,116,114,105,112, 0, 80,108,117,103,105,110, 83,101,113, 0, 83,101,113,
+117,101,110, 99,101, 0, 77,101,116, 97, 83,116, 97, 99,107, 0, 87,105,112,101, 86, 97,114,115, 0, 71,108,111,119, 86, 97,114,
+115, 0, 84,114, 97,110,115,102,111,114,109, 86, 97,114,115, 0, 83,111,108,105,100, 67,111,108,111,114, 86, 97,114,115, 0, 83,
+112,101,101,100, 67,111,110,116,114,111,108, 86, 97,114,115, 0, 69,102,102,101, 99,116, 0, 66,117,105,108,100, 69,102,102, 0,
+ 80, 97,114,116, 69,102,102, 0, 80, 97,114,116,105, 99,108,101, 0, 87, 97,118,101, 69,102,102, 0, 98, 80,114,111,112,101,114,
+116,121, 0, 98, 78,101, 97,114, 83,101,110,115,111,114, 0, 98, 77,111,117,115,101, 83,101,110,115,111,114, 0, 98, 84,111,117,
+ 99,104, 83,101,110,115,111,114, 0, 98, 75,101,121, 98,111, 97,114,100, 83,101,110,115,111,114, 0, 98, 80,114,111,112,101,114,
+116,121, 83,101,110,115,111,114, 0, 98, 65, 99,116,117, 97,116,111,114, 83,101,110,115,111,114, 0, 98, 68,101,108, 97,121, 83,
+101,110,115,111,114, 0, 98, 67,111,108,108,105,115,105,111,110, 83,101,110,115,111,114, 0, 98, 82, 97,100, 97,114, 83,101,110,
+115,111,114, 0, 98, 82, 97,110,100,111,109, 83,101,110,115,111,114, 0, 98, 82, 97,121, 83,101,110,115,111,114, 0, 98, 65,114,
+109, 97,116,117,114,101, 83,101,110,115,111,114, 0, 98, 77,101,115,115, 97,103,101, 83,101,110,115,111,114, 0, 98, 83,101,110,
+115,111,114, 0, 98, 67,111,110,116,114,111,108,108,101,114, 0, 98, 74,111,121,115,116,105, 99,107, 83,101,110,115,111,114, 0,
+ 98, 69,120,112,114,101,115,115,105,111,110, 67,111,110,116, 0, 98, 80,121,116,104,111,110, 67,111,110,116, 0, 98, 65, 99,116,
+117, 97,116,111,114, 0, 98, 65,100,100, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 65, 99,116,105,111,110,
+ 65, 99,116,117, 97,116,111,114, 0, 83,111,117,110,100, 51, 68, 0, 98, 83,111,117,110,100, 65, 99,116,117, 97,116,111,114, 0,
+ 98, 69,100,105,116, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 83, 99,101,110,101, 65, 99,116,117, 97,116,
+111,114, 0, 98, 80,114,111,112,101,114,116,121, 65, 99,116,117, 97,116,111,114, 0, 98, 79, 98,106,101, 99,116, 65, 99,116,117,
+ 97,116,111,114, 0, 98, 73,112,111, 65, 99,116,117, 97,116,111,114, 0, 98, 67, 97,109,101,114, 97, 65, 99,116,117, 97,116,111,
+114, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 71,114,111,117,112, 65, 99,116,117,
+ 97,116,111,114, 0, 98, 82, 97,110,100,111,109, 65, 99,116,117, 97,116,111,114, 0, 98, 77,101,115,115, 97,103,101, 65, 99,116,
+117, 97,116,111,114, 0, 98, 71, 97,109,101, 65, 99,116,117, 97,116,111,114, 0, 98, 86,105,115,105, 98,105,108,105,116,121, 65,
+ 99,116,117, 97,116,111,114, 0, 98, 84,119,111, 68, 70,105,108,116,101,114, 65, 99,116,117, 97,116,111,114, 0, 98, 80, 97,114,
+101,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 83,116, 97,116,101, 65, 99,116,117, 97,116,111,114, 0, 98, 65,114,109, 97,
+116,117,114,101, 65, 99,116,117, 97,116,111,114, 0, 71,114,111,117,112, 79, 98,106,101, 99,116, 0, 66,111,110,101, 0, 98, 65,
+114,109, 97,116,117,114,101, 0, 98, 77,111,116,105,111,110, 80, 97,116,104, 86,101,114,116, 0, 98, 80,111,115,101, 67,104, 97,
+110,110,101,108, 0, 98, 73, 75, 80, 97,114, 97,109, 0, 98, 73,116, 97,115, 99, 0, 98, 65, 99,116,105,111,110, 71,114,111,117,
+112, 0, 83,112, 97, 99,101, 65, 99,116,105,111,110, 0, 98, 65, 99,116,105,111,110, 67,104, 97,110,110,101,108, 0, 98, 67,111,
+110,115,116,114, 97,105,110,116, 67,104, 97,110,110,101,108, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,111,110,
+115,116,114, 97,105,110,116, 84, 97,114,103,101,116, 0, 98, 80,121,116,104,111,110, 67,111,110,115,116,114, 97,105,110,116, 0,
+ 98, 75,105,110,101,109, 97,116,105, 99, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,112,108,105,110,101, 73, 75, 67,111,
+110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97, 99,107, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,116,
+ 97,116,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 97,116,101, 76,105,107,101, 67,111,110,
+115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83, 97,109,
+101, 86,111,108,117,109,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97,110,115, 76,105,107,101, 67,111,110,115,
+116,114, 97,105,110,116, 0, 98, 77,105,110, 77, 97,120, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,110,
+ 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99,107, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116, 0,
+ 98, 68, 97,109,112, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 70,111,108,108,111,119, 80, 97,116,104,
+ 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,116,114,101,116, 99,104, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0,
+ 98, 82,105,103,105,100, 66,111,100,121, 74,111,105,110,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,108, 97,109,112,
+ 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,104,105,108,100, 79,102, 67,111,110,115,116,114, 97,105,110,116, 0,
+ 98, 84,114, 97,110,115,102,111,114,109, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 80,105,118,111,116, 67,111,110,115,116,
+114, 97,105,110,116, 0, 98, 76,111, 99, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,116, 76,105,
+109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,
+110,116, 0, 98, 68,105,115,116, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,104,114,105,110,107,119,
+114, 97,112, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,110, 77,111,100,105,102,105,101,114, 0, 98, 65,
+ 99,116,105,111,110, 83,116,114,105,112, 0, 98, 78,111,100,101, 83,116, 97, 99,107, 0, 98, 78,111,100,101, 83,111, 99,107,101,
+116, 0, 98, 78,111,100,101, 76,105,110,107, 0, 98, 78,111,100,101, 0, 98, 78,111,100,101, 80,114,101,118,105,101,119, 0,117,
+105, 66,108,111, 99,107, 0, 98, 78,111,100,101, 84,121,112,101, 0, 78,111,100,101, 73,109, 97,103,101, 65,110,105,109, 0, 78,
+111,100,101, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 68, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 66,105,
+108, 97,116,101,114, 97,108, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 72,117,101, 83, 97,116, 0, 78,111,100,101, 73,
+109, 97,103,101, 70,105,108,101, 0, 78,111,100,101, 67,104,114,111,109, 97, 0, 78,111,100,101, 84,119,111, 88, 89,115, 0, 78,
+111,100,101, 84,119,111, 70,108,111, 97,116,115, 0, 78,111,100,101, 71,101,111,109,101,116,114,121, 0, 78,111,100,101, 86,101,
+114,116,101,120, 67,111,108, 0, 78,111,100,101, 68,101,102,111, 99,117,115, 0, 78,111,100,101, 83, 99,114,105,112,116, 68,105,
+ 99,116, 0, 78,111,100,101, 71,108, 97,114,101, 0, 78,111,100,101, 84,111,110,101,109, 97,112, 0, 78,111,100,101, 76,101,110,
+115, 68,105,115,116, 0, 78,111,100,101, 67,111,108,111,114, 66, 97,108, 97,110, 99,101, 0, 78,111,100,101, 67,111,108,111,114,
+115,112,105,108,108, 0, 84,101,120, 78,111,100,101, 79,117,116,112,117,116, 0, 67,117,114,118,101, 77, 97,112, 80,111,105,110,
+116, 0, 67,117,114,118,101, 77, 97,112, 0, 66,114,117,115,104, 67,108,111,110,101, 0, 67,117,115,116,111,109, 68, 97,116, 97,
+ 76, 97,121,101,114, 0, 67,117,115,116,111,109, 68, 97,116, 97, 69,120,116,101,114,110, 97,108, 0, 72, 97,105,114, 75,101,121,
+ 0, 80, 97,114,116,105, 99,108,101, 75,101,121, 0, 66,111,105,100, 80, 97,114,116,105, 99,108,101, 0, 66,111,105,100, 68, 97,
+116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,112,114,105,110,103, 0, 67,104,105,108,100, 80, 97,114,116,105, 99,108,101, 0,
+ 80, 97,114,116,105, 99,108,101, 84, 97,114,103,101,116, 0, 80, 97,114,116,105, 99,108,101, 68,117,112,108,105, 87,101,105,103,
+104,116, 0, 80, 97,114,116,105, 99,108,101, 68, 97,116, 97, 0, 83, 80, 72, 70,108,117,105,100, 83,101,116,116,105,110,103,115,
+ 0, 80, 97,114,116,105, 99,108,101, 83,101,116,116,105,110,103,115, 0, 66,111,105,100, 83,101,116,116,105,110,103,115, 0, 80,
+ 97,114,116,105, 99,108,101, 67, 97, 99,104,101, 75,101,121, 0, 75, 68, 84,114,101,101, 0, 80, 97,114,116,105, 99,108,101, 68,
+114, 97,119, 68, 97,116, 97, 0, 76,105,110,107, 78,111,100,101, 0, 98, 71, 80, 68,115,112,111,105,110,116, 0, 98, 71, 80, 68,
+115,116,114,111,107,101, 0, 98, 71, 80, 68,102,114, 97,109,101, 0, 98, 71, 80, 68,108, 97,121,101,114, 0, 82,101,112,111,114,
+116, 76,105,115,116, 0,119,109, 87,105,110,100,111,119, 77, 97,110, 97,103,101,114, 0,119,109, 87,105,110,100,111,119, 0,119,
+109, 75,101,121, 67,111,110,102,105,103, 0,119,109, 69,118,101,110,116, 0,119,109, 83,117, 98, 87,105,110,100,111,119, 0,119,
+109, 71,101,115,116,117,114,101, 0,119,109, 75,101,121, 77, 97,112, 73,116,101,109, 0, 80,111,105,110,116,101,114, 82, 78, 65,
+ 0,119,109, 75,101,121, 77, 97,112, 0,119,109, 79,112,101,114, 97,116,111,114, 84,121,112,101, 0, 70, 77,111,100,105,102,105,
+101,114, 0, 70, 77,111,100, 95, 71,101,110,101,114, 97,116,111,114, 0, 70, 77,111,100, 95, 70,117,110, 99,116,105,111,110, 71,
+101,110,101,114, 97,116,111,114, 0, 70, 67, 77, 95, 69,110,118,101,108,111,112,101, 68, 97,116, 97, 0, 70, 77,111,100, 95, 69,
+110,118,101,108,111,112,101, 0, 70, 77,111,100, 95, 67,121, 99,108,101,115, 0, 70, 77,111,100, 95, 80,121,116,104,111,110, 0,
+ 70, 77,111,100, 95, 76,105,109,105,116,115, 0, 70, 77,111,100, 95, 78,111,105,115,101, 0, 70, 77,111,100, 95, 83,116,101,112,
+112,101,100, 0, 68,114,105,118,101,114, 84, 97,114,103,101,116, 0, 68,114,105,118,101,114, 86, 97,114, 0, 67,104, 97,110,110,
+101,108, 68,114,105,118,101,114, 0, 70, 80,111,105,110,116, 0, 70, 67,117,114,118,101, 0, 65,110,105,109, 77, 97,112, 80, 97,
+105,114, 0, 65,110,105,109, 77, 97,112,112,101,114, 0, 78,108, 97, 83,116,114,105,112, 0, 78,108, 97, 84,114, 97, 99,107, 0,
+ 75, 83, 95, 80, 97,116,104, 0, 75,101,121,105,110,103, 83,101,116, 0, 65,110,105,109, 79,118,101,114,114,105,100,101, 0, 73,
+100, 65,100,116, 84,101,109,112,108, 97,116,101, 0, 66,111,105,100, 82,117,108,101, 0, 66,111,105,100, 82,117,108,101, 71,111,
+ 97,108, 65,118,111,105,100, 0, 66,111,105,100, 82,117,108,101, 65,118,111,105,100, 67,111,108,108,105,115,105,111,110, 0, 66,
+111,105,100, 82,117,108,101, 70,111,108,108,111,119, 76,101, 97,100,101,114, 0, 66,111,105,100, 82,117,108,101, 65,118,101,114,
+ 97,103,101, 83,112,101,101,100, 0, 66,111,105,100, 82,117,108,101, 70,105,103,104,116, 0, 66,111,105,100, 83,116, 97,116,101,
+ 0, 70, 76, 85, 73, 68, 95, 51, 68, 0, 87, 84, 85, 82, 66, 85, 76, 69, 78, 67, 69, 0, 0, 0, 84, 76, 69, 78, 1, 0, 1, 0,
+ 2, 0, 2, 0, 4, 0, 4, 0, 4, 0, 4, 0, 8, 0, 0, 0, 16, 0, 24, 0, 16, 0, 4, 0, 8, 0, 16, 0, 16, 0, 32, 0,
+ 96, 0, 72, 0, 72, 2, 0, 0, 40, 0,144, 0,208, 4,112, 0, 36, 0, 56, 0,112, 0,128, 0,168, 0, 96, 0, 40, 0, 48, 0,
+176, 0, 16, 0,136, 0, 40, 0, 8, 6,240, 1, 0, 0, 0, 0, 0, 0, 16, 1,112, 1,120, 1, 24, 0, 8, 3,200, 0, 0, 0,
+ 88, 0, 40, 1,240, 0,136, 0,216, 1, 64, 1, 88, 0, 32, 3,104, 0, 88, 1, 0, 0,128, 0,104, 0,208, 0, 80, 0, 8, 0,
+ 16, 0, 32, 0, 0, 0,216, 1, 0, 0, 0, 0, 0, 0,176, 1, 20, 0, 48, 0, 64, 0, 24, 0, 12, 0, 16, 0, 4, 0, 8, 0,
+ 8, 0, 0, 0, 40, 0,128, 0, 48, 0, 8, 0, 16, 0, 8, 0, 8, 0, 4, 0, 4, 0, 0, 1, 32, 0, 16, 0, 16, 0, 64, 0,
+ 24, 0, 12, 0, 64, 0, 80, 0,104, 0,120, 0,128, 0, 96, 0,128, 0,160, 0, 96, 0, 88, 0,136, 0, 88, 0,112, 0, 16, 1,
+ 56, 0,192, 0,184, 0,232, 0, 88, 0,120, 0,136, 0,224, 0,136, 0,248, 0, 80, 0,136, 0, 0, 0,152, 0, 40, 0, 16, 2,
+160, 0, 0, 0,120, 0, 0, 0, 0, 0, 96, 0, 8, 0, 8, 0, 48, 1,112, 0, 0, 2,104, 0, 96, 0, 88, 0, 96, 0,200, 1,
+144, 0,136, 0, 80, 0,136, 0,112, 0, 16, 0, 16, 1, 48, 0, 0, 0,144, 0,176, 0,104, 0, 48, 0, 24, 0,120, 0,152, 0,
+120, 1,224, 0,192, 0, 0, 0, 72, 0, 32, 0,176, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,224, 1, 40, 0,184, 0,152, 0,
+ 64, 0, 64, 0, 24, 0, 88, 0, 0, 4, 64, 0, 24, 0, 16, 0,104, 0, 96, 0, 24, 0,240, 2, 48, 0, 16, 0,168, 0, 88, 0,
+ 96, 0, 56, 0,192, 1, 32, 0, 8, 0, 24, 0, 80, 2, 0, 0, 0, 0, 88, 0,104, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 72, 1, 56, 0,144, 0, 64, 0,240, 0, 40, 0,248, 0,240, 0, 96, 2,104, 0, 0, 0,168, 0, 0, 0, 24, 1, 16, 0, 16, 0,
+ 40, 33,128, 16, 24, 16,216, 0,152, 2,120, 2, 64, 0, 24, 0,216, 0, 32, 1, 72, 0,200, 2, 40, 0,136, 1,104, 0,216, 0,
+160, 0,136, 1, 24, 1, 32, 0,232, 0, 32, 0, 32, 0,112, 2,120, 1, 16, 0, 88, 30, 80, 0, 56, 0,112, 13,208, 0, 32, 0,
+ 40, 0, 88, 1, 0, 0, 0, 0, 0, 0, 40, 1, 0, 0, 32, 1, 88, 0, 16, 0, 8, 0, 44, 0, 0, 1,240, 0,200, 1, 32, 1,
+ 32, 0, 12, 0, 24, 0, 52, 0, 16, 0, 24, 0, 24, 0, 32, 0, 72, 1, 0, 0, 64, 0, 64, 0, 48, 0, 8, 0, 48, 0, 72, 0,
+104, 0, 40, 0, 8, 0, 72, 0, 44, 0, 40, 0,108, 0, 72, 0, 72, 0, 96, 0,104, 0, 60, 0,128, 0, 80, 0, 80, 0, 16, 0,
+ 96, 0, 32, 0, 72, 0, 88, 0, 24, 0, 80, 0,112, 0, 84, 0, 32, 0, 96, 0, 56, 0, 56, 0,112, 0,140, 0, 4, 0, 24, 0,
+ 16, 0, 8, 0, 88, 0, 40, 0, 40, 1,200, 0, 16, 0,248, 1, 4, 0, 40, 0,120, 0, 0, 1, 88, 0, 56, 0, 88, 0,128, 0,
+ 80, 0,120, 0, 24, 0, 56, 0, 48, 0, 48, 0, 48, 0, 8, 0, 40, 0, 72, 0, 72, 0, 48, 0, 48, 0, 24, 0, 56, 0,104, 0,
+ 16, 0,112, 0, 96, 0, 56, 0, 28, 0, 28, 0, 28, 0, 56, 0, 24, 0, 72, 0,168, 0, 40, 0,144, 0, 56, 0,232, 0, 0, 0,
+ 0, 0, 0, 0, 16, 0, 40, 0, 28, 0, 12, 0, 12, 0, 16, 1, 44, 0, 24, 0, 8, 0, 64, 0, 32, 0, 24, 0, 16, 0, 24, 0,
+ 32, 0, 8, 0, 96, 0, 20, 0, 32, 0, 12, 0, 56, 0, 24, 0, 72, 0,240, 0, 24, 0, 56, 0, 56, 0, 20, 0, 16, 0, 64, 0,
+ 40, 0, 32, 0,192, 0, 52, 0, 32, 2,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 32, 0, 40, 0,192, 0, 40, 0, 24, 1,
+224, 0,168, 0, 0, 0, 0, 0, 0, 0,120, 0, 0, 0,120, 0, 0, 0,104, 0, 24, 0, 24, 0, 16, 0, 24, 0, 8, 0, 16, 0,
+ 24, 0, 20, 0, 20, 0, 56, 0, 24, 2, 40, 1, 16, 0,104, 0, 0, 1, 40, 0,200, 0,104, 0,112, 0,168, 0, 32, 0, 80, 0,
+ 56, 0, 80, 0, 64, 0,104, 0, 72, 0, 64, 0,128, 0, 0, 0, 0, 0, 0, 0, 83, 84, 82, 67,144, 1, 0, 0, 10, 0, 2, 0,
+ 10, 0, 0, 0, 10, 0, 1, 0, 11, 0, 3, 0, 11, 0, 0, 0, 11, 0, 1, 0, 9, 0, 2, 0, 12, 0, 2, 0, 9, 0, 3, 0,
+ 9, 0, 4, 0, 13, 0, 2, 0, 2, 0, 5, 0, 2, 0, 6, 0, 14, 0, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0, 15, 0, 4, 0,
+ 4, 0, 7, 0, 4, 0, 8, 0, 4, 0, 9, 0, 4, 0, 10, 0, 16, 0, 4, 0, 7, 0, 7, 0, 7, 0, 8, 0, 7, 0, 9, 0,
+ 7, 0, 10, 0, 17, 0, 4, 0, 9, 0, 11, 0, 12, 0, 12, 0, 4, 0, 13, 0, 4, 0, 14, 0, 18, 0, 10, 0, 18, 0, 0, 0,
+ 18, 0, 1, 0, 0, 0, 15, 0, 0, 0, 16, 0, 2, 0, 17, 0, 0, 0, 18, 0, 4, 0, 19, 0, 17, 0, 20, 0, 4, 0, 21, 0,
+ 4, 0, 22, 0, 19, 0, 9, 0, 9, 0, 0, 0, 9, 0, 1, 0, 19, 0, 23, 0, 20, 0, 24, 0, 0, 0, 25, 0, 2, 0, 26, 0,
+ 2, 0, 17, 0, 4, 0, 27, 0, 18, 0, 28, 0, 20, 0, 8, 0, 19, 0, 29, 0, 19, 0, 30, 0, 21, 0, 31, 0, 0, 0, 32, 0,
+ 0, 0, 33, 0, 4, 0, 34, 0, 4, 0, 35, 0, 20, 0, 36, 0, 22, 0, 5, 0, 4, 0, 37, 0, 4, 0, 38, 0, 2, 0, 39, 0,
+ 2, 0, 40, 0, 4, 0, 41, 0, 23, 0, 6, 0, 24, 0, 42, 0, 2, 0, 43, 0, 2, 0, 44, 0, 2, 0, 15, 0, 2, 0, 17, 0,
+ 0, 0, 45, 0, 25, 0, 21, 0, 25, 0, 0, 0, 25, 0, 1, 0, 26, 0, 46, 0, 27, 0, 47, 0, 16, 0, 48, 0, 16, 0, 49, 0,
+ 2, 0, 43, 0, 2, 0, 44, 0, 2, 0, 50, 0, 2, 0, 51, 0, 2, 0, 52, 0, 2, 0, 53, 0, 2, 0, 17, 0, 2, 0, 54, 0,
+ 7, 0, 9, 0, 7, 0, 10, 0, 4, 0, 55, 0, 7, 0, 56, 0, 7, 0, 57, 0, 7, 0, 58, 0, 23, 0, 59, 0, 28, 0, 7, 0,
+ 19, 0, 29, 0, 12, 0, 60, 0, 16, 0, 61, 0, 2, 0, 43, 0, 2, 0, 62, 0, 2, 0, 63, 0, 2, 0, 35, 0, 29, 0, 16, 0,
+ 29, 0, 0, 0, 29, 0, 1, 0, 7, 0, 64, 0, 7, 0, 58, 0, 2, 0, 15, 0, 2, 0, 44, 0, 2, 0, 65, 0, 2, 0, 17, 0,
+ 4, 0, 66, 0, 4, 0, 67, 0, 9, 0, 2, 0, 7, 0, 68, 0, 0, 0, 18, 0, 0, 0, 69, 0, 7, 0, 70, 0, 7, 0, 71, 0,
+ 30, 0, 13, 0, 19, 0, 29, 0, 31, 0, 72, 0, 29, 0, 73, 0, 0, 0, 74, 0, 4, 0, 75, 0, 7, 0, 58, 0, 12, 0, 76, 0,
+ 28, 0, 77, 0, 19, 0, 78, 0, 2, 0, 15, 0, 2, 0, 79, 0, 2, 0, 80, 0, 2, 0, 17, 0, 32, 0, 6, 0, 32, 0, 0, 0,
+ 32, 0, 1, 0, 0, 0, 81, 0, 0, 0, 82, 0, 4, 0, 21, 0, 4, 0, 83, 0, 33, 0, 10, 0, 33, 0, 0, 0, 33, 0, 1, 0,
+ 4, 0, 84, 0, 4, 0, 85, 0, 4, 0, 86, 0, 4, 0, 87, 0, 4, 0, 12, 0, 4, 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, 0,
+ 34, 0, 15, 0, 19, 0, 29, 0, 0, 0, 91, 0, 4, 0, 88, 0, 4, 0, 92, 0, 12, 0, 93, 0, 32, 0, 94, 0, 32, 0, 95, 0,
+ 4, 0, 96, 0, 4, 0, 97, 0, 12, 0, 98, 0, 0, 0, 99, 0, 4, 0,100, 0, 4, 0,101, 0, 9, 0,102, 0, 8, 0,103, 0,
+ 35, 0, 3, 0, 4, 0,104, 0, 4, 0,105, 0, 9, 0, 2, 0, 36, 0, 15, 0, 19, 0, 29, 0, 31, 0, 72, 0, 2, 0, 15, 0,
+ 2, 0, 17, 0, 7, 0,106, 0, 7, 0,107, 0, 7, 0,108, 0, 7, 0,109, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0,112, 0,
+ 7, 0,113, 0, 7, 0,114, 0, 28, 0, 77, 0, 24, 0,115, 0, 37, 0, 14, 0, 38, 0,116, 0, 4, 0,117, 0, 4, 0,118, 0,
+ 4, 0,119, 0, 4, 0,120, 0, 0, 0,121, 0, 0, 0,122, 0, 0, 0,123, 0, 0, 0, 35, 0, 2, 0,124, 0, 2, 0,125, 0,
+ 2, 0,126, 0, 2, 0, 17, 0, 4, 0, 67, 0, 39, 0, 32, 0, 19, 0, 29, 0, 0, 0, 32, 0, 12, 0,127, 0, 40, 0,128, 0,
+ 41, 0,129, 0, 42, 0,130, 0, 42, 0,131, 0, 2, 0,132, 0, 2, 0,133, 0, 2, 0,123, 0, 2, 0, 17, 0, 2, 0,134, 0,
+ 2, 0, 15, 0, 4, 0,135, 0, 2, 0,136, 0, 2, 0,137, 0, 2, 0,138, 0, 2, 0,139, 0, 2, 0,140, 0, 2, 0,141, 0,
+ 4, 0,142, 0, 4, 0,143, 0, 35, 0,144, 0, 22, 0,145, 0, 7, 0,146, 0, 4, 0,147, 0, 2, 0,148, 0, 2, 0,149, 0,
+ 2, 0,150, 0, 2, 0,151, 0, 7, 0,152, 0, 7, 0,153, 0, 43, 0, 63, 0, 2, 0,154, 0, 2, 0,155, 0, 2, 0,156, 0,
+ 2, 0,157, 0, 24, 0,158, 0, 44, 0,159, 0, 0, 0,160, 0, 0, 0,161, 0, 0, 0,162, 0, 0, 0,163, 0, 0, 0,164, 0,
+ 7, 0,165, 0, 7, 0,166, 0, 7, 0,167, 0, 2, 0,168, 0, 2, 0,169, 0, 2, 0,170, 0, 2, 0,171, 0, 2, 0,172, 0,
+ 2, 0,173, 0, 0, 0,174, 0, 0, 0,175, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 7, 0,179, 0, 7, 0,180, 0,
+ 7, 0, 54, 0, 7, 0,181, 0, 7, 0,182, 0, 7, 0,183, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0,
+ 7, 0,188, 0, 7, 0,189, 0, 7, 0,190, 0, 7, 0,191, 0, 7, 0,192, 0, 7, 0,193, 0, 7, 0,194, 0, 7, 0,195, 0,
+ 7, 0,196, 0, 7, 0,197, 0, 7, 0,198, 0, 7, 0,199, 0, 7, 0,200, 0, 7, 0,201, 0, 7, 0,202, 0, 7, 0,203, 0,
+ 7, 0,204, 0, 7, 0,205, 0, 7, 0,206, 0, 7, 0,207, 0, 7, 0,208, 0, 7, 0,209, 0, 7, 0,210, 0, 7, 0,211, 0,
+ 7, 0,212, 0, 7, 0,213, 0, 7, 0,214, 0, 7, 0,215, 0, 45, 0, 15, 0, 0, 0,216, 0, 9, 0,217, 0, 0, 0,218, 0,
+ 0, 0,219, 0, 4, 0,220, 0, 4, 0,221, 0, 9, 0,222, 0, 7, 0,223, 0, 7, 0,224, 0, 7, 0,225, 0, 4, 0,226, 0,
+ 9, 0,227, 0, 9, 0,228, 0, 4, 0,229, 0, 4, 0, 35, 0, 46, 0, 6, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0,
+ 7, 0,230, 0, 7, 0, 64, 0, 4, 0, 61, 0, 47, 0, 5, 0, 2, 0, 17, 0, 2, 0, 34, 0, 2, 0, 61, 0, 2, 0,231, 0,
+ 46, 0,225, 0, 48, 0, 17, 0, 24, 0,158, 0, 39, 0,232, 0, 49, 0,233, 0, 7, 0,234, 0, 7, 0,235, 0, 2, 0, 15, 0,
+ 2, 0,236, 0, 7, 0,107, 0, 7, 0,108, 0, 7, 0,237, 0, 4, 0,238, 0, 2, 0,239, 0, 2, 0,240, 0, 4, 0,123, 0,
+ 4, 0,135, 0, 2, 0,241, 0, 2, 0,242, 0, 50, 0, 22, 0, 2, 0, 17, 0, 2, 0,243, 0, 7, 0,244, 0, 7, 0,245, 0,
+ 2, 0,134, 0, 2, 0,246, 0, 4, 0,247, 0, 4, 0,248, 0, 24, 0,158, 0, 4, 0,249, 0, 2, 0,250, 0, 2, 0,251, 0,
+ 9, 0,252, 0, 7, 0,253, 0, 7, 0,254, 0, 2, 0,255, 0, 2, 0, 0, 1, 2, 0, 1, 1, 2, 0, 2, 1, 7, 0, 3, 1,
+ 7, 0, 4, 1, 47, 0, 5, 1, 51, 0, 13, 0, 4, 0, 6, 1, 4, 0, 7, 1, 2, 0, 8, 1, 2, 0, 17, 0, 2, 0, 9, 1,
+ 2, 0, 10, 1, 24, 0,158, 0, 7, 0, 11, 1, 4, 0, 12, 1, 0, 0, 13, 1, 7, 0, 14, 1, 4, 0, 15, 1, 4, 0,123, 0,
+ 44, 0, 63, 0, 19, 0, 29, 0, 31, 0, 72, 0, 7, 0, 16, 1, 7, 0, 17, 1, 7, 0, 18, 1, 7, 0, 19, 1, 7, 0, 20, 1,
+ 7, 0, 21, 1, 7, 0, 22, 1, 7, 0, 23, 1, 7, 0, 24, 1, 7, 0, 67, 0, 7, 0, 25, 1, 7, 0, 26, 1, 7, 0, 27, 1,
+ 7, 0, 28, 1, 7, 0, 29, 1, 7, 0, 30, 1, 7, 0, 31, 1, 7, 0, 32, 1, 7, 0, 33, 1, 7, 0, 34, 1, 7, 0, 35, 1,
+ 7, 0, 36, 1, 2, 0, 37, 1, 2, 0, 38, 1, 2, 0, 39, 1, 2, 0, 40, 1, 2, 0, 41, 1, 2, 0, 42, 1, 2, 0, 43, 1,
+ 2, 0, 17, 0, 2, 0, 15, 0, 2, 0,236, 0, 7, 0, 44, 1, 7, 0, 45, 1, 7, 0, 46, 1, 7, 0, 47, 1, 4, 0, 48, 1,
+ 4, 0, 49, 1, 2, 0, 50, 1, 2, 0, 51, 1, 2, 0, 9, 1, 2, 0,121, 0, 4, 0, 21, 0, 4, 0,118, 0, 4, 0,119, 0,
+ 4, 0,120, 0, 7, 0, 52, 1, 7, 0, 53, 1, 7, 0, 87, 0, 37, 0, 54, 1, 52, 0, 55, 1, 28, 0, 77, 0, 39, 0,232, 0,
+ 45, 0, 56, 1, 47, 0, 5, 1, 48, 0, 57, 1, 22, 0,145, 0, 50, 0, 58, 1, 51, 0, 59, 1, 0, 0, 60, 1, 0, 0,175, 0,
+ 53, 0, 8, 0, 7, 0, 61, 1, 7, 0, 62, 1, 7, 0,166, 0, 4, 0, 17, 0, 7, 0, 63, 1, 7, 0, 64, 1, 7, 0, 65, 1,
+ 24, 0, 42, 0, 54, 0, 72, 0, 19, 0, 29, 0, 31, 0, 72, 0, 2, 0, 15, 0, 2, 0, 17, 0, 4, 0, 66, 1, 2, 0,169, 0,
+ 2, 0, 67, 1, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 7, 0,179, 0, 7, 0, 68, 1, 7, 0, 69, 1, 7, 0, 70, 1,
+ 7, 0, 71, 1, 7, 0, 72, 1, 7, 0, 73, 1, 7, 0, 74, 1, 7, 0, 75, 1, 7, 0, 76, 1, 7, 0, 77, 1, 7, 0, 78, 1,
+ 55, 0, 79, 1, 2, 0,243, 0, 2, 0, 67, 0, 7, 0,107, 0, 7, 0,108, 0, 7, 0, 80, 1, 7, 0, 81, 1, 7, 0, 82, 1,
+ 7, 0, 83, 1, 7, 0, 84, 1, 2, 0, 85, 1, 2, 0, 86, 1, 2, 0, 87, 1, 2, 0, 88, 1, 0, 0, 89, 1, 0, 0, 90, 1,
+ 2, 0, 91, 1, 2, 0, 92, 1, 2, 0, 93, 1, 2, 0, 94, 1, 2, 0, 95, 1, 7, 0, 96, 1, 7, 0, 97, 1, 7, 0, 98, 1,
+ 7, 0, 99, 1, 2, 0,100, 1, 2, 0, 87, 0, 2, 0,101, 1, 2, 0,102, 1, 2, 0,103, 1, 2, 0,104, 1, 7, 0,105, 1,
+ 7, 0,106, 1, 7, 0,107, 1, 7, 0,108, 1, 7, 0,109, 1, 7, 0,110, 1, 7, 0,111, 1, 7, 0,112, 1, 7, 0,113, 1,
+ 7, 0,114, 1, 7, 0,115, 1, 7, 0,116, 1, 2, 0,117, 1, 0, 0,118, 1, 28, 0, 77, 0, 43, 0,119, 1, 2, 0,120, 1,
+ 0, 0,121, 1, 22, 0,145, 0, 56, 0, 18, 0, 7, 0,122, 1, 7, 0,123, 1, 7, 0,124, 1, 7, 0,125, 1, 7, 0,126, 1,
+ 7, 0,127, 1, 7, 0,128, 1, 7, 0,129, 1, 7, 0,130, 1, 7, 0,131, 1, 2, 0,132, 1, 2, 0,133, 1, 2, 0,134, 1,
+ 2, 0,135, 1, 7, 0,136, 1, 7, 0,137, 1, 7, 0,138, 1, 7, 0,139, 1, 57, 0,124, 0, 19, 0, 29, 0, 31, 0, 72, 0,
+ 2, 0,140, 1, 2, 0, 17, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 7, 0,141, 1, 7, 0,142, 1, 7, 0,143, 1,
+ 7, 0,144, 1, 7, 0,145, 1, 7, 0,146, 1, 7, 0,147, 1, 7, 0,148, 1, 7, 0,149, 1, 7, 0,150, 1, 7, 0,151, 1,
+ 7, 0,152, 1, 7, 0,153, 1, 7, 0,154, 1, 7, 0,155, 1, 7, 0,156, 1, 7, 0,157, 1, 7, 0,158, 1, 7, 0,159, 1,
+ 7, 0,160, 1, 56, 0,161, 1, 7, 0,162, 1, 7, 0,163, 1, 7, 0,164, 1, 7, 0,165, 1, 7, 0,166, 1, 7, 0,167, 1,
+ 7, 0,168, 1, 2, 0,169, 1, 2, 0,170, 1, 2, 0,171, 1, 0, 0,172, 1, 0, 0,173, 1, 7, 0,174, 1, 7, 0,175, 1,
+ 2, 0,176, 1, 2, 0,177, 1, 7, 0,178, 1, 7, 0,179, 1, 7, 0,180, 1, 7, 0,181, 1, 2, 0,182, 1, 2, 0,183, 1,
+ 4, 0, 66, 1, 4, 0,184, 1, 2, 0,185, 1, 2, 0,186, 1, 2, 0,187, 1, 2, 0,188, 1, 7, 0,189, 1, 7, 0,190, 1,
+ 7, 0,191, 1, 7, 0,192, 1, 7, 0,193, 1, 7, 0,194, 1, 7, 0,195, 1, 7, 0,196, 1, 7, 0,197, 1, 7, 0,198, 1,
+ 0, 0,199, 1, 7, 0,200, 1, 7, 0,201, 1, 7, 0,202, 1, 4, 0,203, 1, 0, 0,204, 1, 0, 0,101, 1, 0, 0,205, 1,
+ 0, 0, 60, 1, 2, 0,206, 1, 2, 0,207, 1, 2, 0,120, 1, 2, 0,208, 1, 2, 0,209, 1, 2, 0,210, 1, 7, 0,211, 1,
+ 7, 0,212, 1, 7, 0,213, 1, 7, 0,214, 1, 7, 0,215, 1, 2, 0,154, 0, 2, 0,155, 0, 47, 0,216, 1, 47, 0,217, 1,
+ 0, 0,218, 1, 0, 0,219, 1, 0, 0,220, 1, 0, 0,221, 1, 2, 0,222, 1, 2, 0,223, 1, 7, 0,224, 1, 7, 0,225, 1,
+ 43, 0,119, 1, 52, 0, 55, 1, 28, 0, 77, 0, 58, 0,226, 1, 22, 0,145, 0, 7, 0,227, 1, 7, 0,228, 1, 7, 0,229, 1,
+ 7, 0,230, 1, 7, 0,231, 1, 2, 0,232, 1, 2, 0, 67, 0, 7, 0,233, 1, 7, 0,234, 1, 7, 0,235, 1, 7, 0,236, 1,
+ 7, 0,237, 1, 7, 0,238, 1, 7, 0,239, 1, 7, 0,240, 1, 7, 0,241, 1, 2, 0,242, 1, 2, 0,243, 1, 4, 0,244, 1,
+ 4, 0,245, 1, 12, 0,246, 1, 59, 0, 4, 0, 19, 0, 29, 0, 0, 0,247, 1, 60, 0, 2, 0, 35, 0,144, 0, 61, 0, 26, 0,
+ 61, 0, 0, 0, 61, 0, 1, 0, 62, 0,248, 1, 4, 0,249, 1, 4, 0,250, 1, 4, 0,251, 1, 4, 0,252, 1, 4, 0,253, 1,
+ 4, 0,254, 1, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,255, 1, 2, 0, 0, 2, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 1, 2,
+ 7, 0, 2, 2, 7, 0, 3, 2, 7, 0, 4, 2, 7, 0, 5, 2, 7, 0, 6, 2, 7, 0, 7, 2, 7, 0, 8, 2, 7, 0, 21, 0,
+ 7, 0, 9, 2, 7, 0, 10, 2, 63, 0, 20, 0, 19, 0, 29, 0, 31, 0, 72, 0, 62, 0,248, 1, 12, 0, 11, 2, 12, 0, 12, 2,
+ 12, 0, 13, 2, 28, 0, 77, 0, 57, 0, 14, 2, 0, 0, 17, 0, 0, 0, 15, 2, 2, 0, 16, 2, 2, 0,168, 0, 2, 0, 35, 0,
+ 7, 0, 61, 1, 7, 0,166, 0, 7, 0, 62, 1, 7, 0, 17, 2, 7, 0, 18, 2, 7, 0, 19, 2, 61, 0, 20, 2, 27, 0, 11, 0,
+ 7, 0, 21, 2, 7, 0, 22, 2, 7, 0, 23, 2, 7, 0,245, 0, 2, 0, 52, 0, 0, 0, 24, 2, 0, 0, 25, 2, 0, 0, 26, 2,
+ 0, 0, 27, 2, 0, 0, 28, 2, 0, 0, 29, 2, 26, 0, 7, 0, 7, 0, 30, 2, 7, 0, 22, 2, 7, 0, 23, 2, 2, 0, 26, 2,
+ 2, 0, 29, 2, 7, 0,245, 0, 7, 0, 35, 0, 64, 0, 21, 0, 64, 0, 0, 0, 64, 0, 1, 0, 2, 0, 15, 0, 2, 0, 31, 2,
+ 2, 0, 29, 2, 2, 0, 17, 0, 2, 0, 32, 2, 2, 0, 33, 2, 2, 0, 34, 2, 2, 0, 35, 2, 2, 0, 36, 2, 2, 0, 37, 2,
+ 2, 0, 38, 2, 2, 0, 39, 2, 7, 0, 40, 2, 7, 0, 41, 2, 26, 0, 46, 0, 27, 0, 47, 0, 2, 0, 42, 2, 2, 0, 43, 2,
+ 4, 0, 44, 2, 65, 0, 5, 0, 2, 0, 45, 2, 2, 0, 31, 2, 0, 0, 17, 0, 0, 0, 35, 0, 2, 0, 67, 0, 66, 0, 4, 0,
+ 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 46, 2, 7, 0, 47, 2, 67, 0, 4, 0, 12, 0, 48, 2, 68, 0, 49, 2, 4, 0, 50, 2,
+ 0, 0, 90, 0, 69, 0, 68, 0, 19, 0, 29, 0, 31, 0, 72, 0, 62, 0,248, 1, 12, 0, 51, 2, 12, 0, 12, 2, 67, 0, 52, 2,
+ 24, 0, 53, 2, 24, 0, 54, 2, 24, 0, 55, 2, 28, 0, 77, 0, 70, 0, 56, 2, 30, 0, 57, 2, 57, 0, 14, 2, 12, 0, 58, 2,
+ 7, 0, 61, 1, 7, 0,166, 0, 7, 0, 62, 1, 2, 0,168, 0, 2, 0, 87, 0, 2, 0, 59, 2, 2, 0, 60, 2, 7, 0, 61, 2,
+ 7, 0, 62, 2, 4, 0, 63, 2, 2, 0, 35, 0, 2, 0, 16, 2, 2, 0, 17, 0, 2, 0, 64, 2, 7, 0, 65, 2, 7, 0, 66, 2,
+ 7, 0, 67, 2, 2, 0, 34, 2, 2, 0, 35, 2, 2, 0, 68, 2, 2, 0, 69, 2, 4, 0, 70, 2, 9, 0, 71, 2, 2, 0, 21, 0,
+ 2, 0, 93, 0, 2, 0, 64, 0, 2, 0, 72, 2, 7, 0, 73, 2, 7, 0, 74, 2, 7, 0, 75, 2, 7, 0, 76, 2, 7, 0, 77, 2,
+ 7, 0, 78, 2, 7, 0, 79, 2, 7, 0, 80, 2, 7, 0, 81, 2, 7, 0, 82, 2, 0, 0, 83, 2, 71, 0, 84, 2, 72, 0, 85, 2,
+ 0, 0, 86, 2, 59, 0, 87, 2, 59, 0, 88, 2, 59, 0, 89, 2, 59, 0, 90, 2, 4, 0, 91, 2, 7, 0, 92, 2, 4, 0, 93, 2,
+ 4, 0, 94, 2, 66, 0, 95, 2, 4, 0, 96, 2, 4, 0, 97, 2, 65, 0, 98, 2, 65, 0, 99, 2, 73, 0, 41, 0, 19, 0, 29, 0,
+ 31, 0, 72, 0, 62, 0,248, 1, 12, 0,100, 2, 28, 0, 77, 0, 30, 0, 57, 2, 57, 0, 14, 2, 74, 0,101, 2, 75, 0,102, 2,
+ 76, 0,103, 2, 77, 0,104, 2, 78, 0,105, 2, 79, 0,106, 2, 80, 0,107, 2, 81, 0,108, 2, 73, 0,109, 2, 82, 0,110, 2,
+ 83, 0,111, 2, 84, 0,112, 2, 84, 0,113, 2, 84, 0,114, 2, 4, 0, 51, 0, 4, 0,115, 2, 4, 0,116, 2, 4, 0,117, 2,
+ 4, 0,118, 2, 2, 0,168, 0, 2, 0,119, 2, 7, 0, 61, 1, 7, 0,166, 0, 7, 0, 62, 1, 7, 0,120, 2, 4, 0, 59, 2,
+ 2, 0,121, 2, 2, 0, 17, 0, 2, 0,122, 2, 2, 0,123, 2, 2, 0, 16, 2, 2, 0,124, 2, 85, 0,125, 2, 86, 0,126, 2,
+ 76, 0, 8, 0, 9, 0,127, 2, 7, 0,128, 2, 4, 0,129, 2, 0, 0, 17, 0, 0, 0,130, 2, 2, 0, 66, 1, 2, 0,131, 2,
+ 2, 0,132, 2, 74, 0, 7, 0, 4, 0,133, 2, 4, 0,134, 2, 4, 0,135, 2, 4, 0,136, 2, 2, 0, 31, 2, 0, 0,137, 2,
+ 0, 0, 17, 0, 78, 0, 5, 0, 4, 0,133, 2, 4, 0,134, 2, 0, 0,138, 2, 0, 0,139, 2, 2, 0, 17, 0, 87, 0, 2, 0,
+ 4, 0,140, 2, 7, 0, 23, 2, 79, 0, 3, 0, 87, 0,141, 2, 4, 0,142, 2, 4, 0, 17, 0, 77, 0, 6, 0, 7, 0,143, 2,
+ 2, 0,144, 2, 2, 0, 31, 2, 0, 0, 17, 0, 0, 0,139, 2, 0, 0,145, 2, 80, 0, 4, 0, 0, 0,230, 0, 0, 0,176, 0,
+ 0, 0,177, 0, 0, 0,178, 0, 88, 0, 6, 0, 39, 0,127, 2, 0, 0, 17, 0, 0, 0,130, 2, 2, 0, 66, 1, 2, 0,131, 2,
+ 2, 0,132, 2, 89, 0, 1, 0, 7, 0,146, 2, 90, 0, 5, 0, 0, 0,230, 0, 0, 0,176, 0, 0, 0,177, 0, 0, 0,178, 0,
+ 4, 0, 35, 0, 81, 0, 1, 0, 7, 0,147, 2, 82, 0, 2, 0, 4, 0,148, 2, 4, 0, 15, 0, 75, 0, 7, 0, 7, 0,128, 2,
+ 39, 0,127, 2, 0, 0, 17, 0, 0, 0,130, 2, 2, 0, 66, 1, 2, 0,131, 2, 2, 0,132, 2, 91, 0, 1, 0, 7, 0,149, 2,
+ 92, 0, 1, 0, 4, 0,150, 2, 93, 0, 1, 0, 0, 0,151, 2, 94, 0, 1, 0, 7, 0,128, 2, 95, 0, 3, 0, 4, 0,152, 2,
+ 0, 0, 90, 0, 7, 0,153, 2, 96, 0, 4, 0, 7, 0,230, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 97, 0, 1, 0,
+ 96, 0,129, 2, 98, 0, 5, 0, 4, 0,154, 2, 4, 0,155, 2, 0, 0, 17, 0, 0, 0, 31, 2, 0, 0,145, 2, 99, 0, 2, 0,
+ 4, 0,156, 2, 4, 0,155, 2,100, 0, 10, 0,100, 0, 0, 0,100, 0, 1, 0, 98, 0,157, 2, 97, 0,158, 2, 99, 0,159, 2,
+ 4, 0, 51, 0, 4, 0,116, 2, 4, 0,115, 2, 4, 0, 35, 0, 77, 0,160, 2, 85, 0, 14, 0, 12, 0,161, 2, 77, 0,160, 2,
+ 0, 0,162, 2, 0, 0,163, 2, 0, 0,164, 2, 0, 0,165, 2, 0, 0,166, 2, 0, 0,167, 2, 0, 0,168, 2, 0, 0, 17, 0,
+ 84, 0,112, 2, 84, 0,114, 2, 2, 0,169, 2, 0, 0,170, 2, 86, 0, 8, 0, 4, 0,171, 2, 4, 0,172, 2, 74, 0,173, 2,
+ 78, 0,174, 2, 4, 0,116, 2, 4, 0,115, 2, 4, 0, 51, 0, 4, 0, 35, 0,101, 0, 9, 0,101, 0, 0, 0,101, 0, 1, 0,
+ 4, 0, 15, 0, 4, 0, 66, 1, 4, 0,175, 2, 4, 0, 35, 0, 0, 0, 18, 0, 38, 0,116, 0, 0, 0,176, 2,102, 0, 7, 0,
+101, 0,177, 2, 2, 0,178, 2, 2, 0,161, 2, 2, 0,179, 2, 2, 0, 88, 0, 9, 0,180, 2, 9, 0,181, 2,103, 0, 3, 0,
+101, 0,177, 2, 24, 0,158, 0, 0, 0, 18, 0,104, 0, 5, 0,101, 0,177, 2, 24, 0,158, 0, 0, 0, 18, 0, 2, 0,182, 2,
+ 0, 0,183, 2,105, 0, 5, 0,101, 0,177, 2, 7, 0, 85, 0, 7, 0,184, 2, 4, 0,185, 2, 4, 0,186, 2,106, 0, 5, 0,
+101, 0,177, 2, 24, 0,187, 2, 0, 0, 69, 0, 4, 0, 66, 1, 4, 0, 17, 0,107, 0, 13, 0,101, 0,177, 2, 24, 0,188, 2,
+ 24, 0,189, 2, 24, 0,190, 2, 24, 0,191, 2, 7, 0,192, 2, 7, 0,193, 2, 7, 0,184, 2, 7, 0,194, 2, 4, 0,195, 2,
+ 4, 0,196, 2, 4, 0, 88, 0, 4, 0,197, 2,108, 0, 5, 0,101, 0,177, 2, 2, 0,198, 2, 2, 0, 17, 0, 7, 0,199, 2,
+ 24, 0,200, 2,109, 0, 3, 0,101, 0,177, 2, 7, 0,201, 2, 4, 0, 88, 0,110, 0, 10, 0,101, 0,177, 2, 7, 0,202, 2,
+ 4, 0,203, 2, 4, 0, 35, 0, 2, 0, 88, 0, 2, 0,204, 2, 2, 0,205, 2, 2, 0,206, 2, 7, 0,207, 2, 0, 0,208, 2,
+111, 0, 3, 0,101, 0,177, 2, 7, 0, 35, 0, 4, 0, 15, 0,112, 0, 6, 0,101, 0,177, 2,113, 0,209, 2,114, 0,210, 2,
+115, 0,211, 2, 7, 0,212, 2, 4, 0, 15, 0,116, 0, 11, 0,101, 0,177, 2, 44, 0,213, 2, 7, 0,214, 2, 4, 0,215, 2,
+ 0, 0,208, 2, 7, 0,216, 2, 4, 0,217, 2, 24, 0,218, 2, 0, 0,219, 2, 4, 0,220, 2, 4, 0, 35, 0,117, 0, 12, 0,
+101, 0,177, 2, 24, 0,221, 2, 39, 0,222, 2, 4, 0, 88, 0, 4, 0,223, 2, 7, 0,224, 2, 7, 0,225, 2, 7, 0,226, 2,
+ 7, 0,227, 2, 0, 0,219, 2, 4, 0,220, 2, 4, 0, 35, 0,118, 0, 3, 0,101, 0,177, 2, 7, 0,228, 2, 4, 0,229, 2,
+119, 0, 5, 0,101, 0,177, 2, 7, 0,230, 2, 0, 0,208, 2, 2, 0, 17, 0, 2, 0,231, 2,120, 0, 8, 0,101, 0,177, 2,
+ 24, 0,158, 0, 7, 0,230, 2, 7, 0,245, 0, 7, 0,104, 0, 0, 0,208, 2, 2, 0, 17, 0, 2, 0, 15, 0,121, 0, 21, 0,
+101, 0,177, 2, 24, 0,232, 2, 0, 0,208, 2, 44, 0,213, 2, 24, 0,218, 2, 2, 0, 17, 0, 2, 0, 35, 0, 7, 0,233, 2,
+ 7, 0,234, 2, 7, 0,235, 2, 7, 0, 65, 2, 7, 0,236, 2, 7, 0,237, 2, 7, 0,238, 2, 7, 0,239, 2, 4, 0,217, 2,
+ 4, 0,220, 2, 0, 0,219, 2, 7, 0,240, 2, 7, 0,241, 2, 7, 0, 87, 0,122, 0, 7, 0,101, 0,177, 2, 2, 0,242, 2,
+ 2, 0,243, 2, 4, 0, 67, 0, 24, 0,158, 0, 7, 0,244, 2, 0, 0,208, 2,123, 0, 10, 0,101, 0,177, 2, 24, 0,158, 0,
+ 0, 0,245, 2, 7, 0,246, 2, 7, 0,247, 2, 7, 0,239, 2, 4, 0,248, 2, 4, 0,249, 2, 7, 0,250, 2, 0, 0, 18, 0,
+124, 0, 1, 0,101, 0,177, 2,125, 0, 7, 0,101, 0,177, 2, 38, 0,116, 0,126, 0,251, 2,127, 0,252, 2,128, 0,253, 2,
+129, 0,254, 2, 12, 0,255, 2,130, 0, 13, 0,101, 0,177, 2, 77, 0, 0, 3, 77, 0, 1, 3, 77, 0, 2, 3, 77, 0, 3, 3,
+ 77, 0, 4, 3, 77, 0, 5, 3, 74, 0, 6, 3, 4, 0, 7, 3, 4, 0, 8, 3, 7, 0,212, 2, 7, 0, 35, 0,131, 0, 9, 3,
+132, 0, 7, 0,101, 0,177, 2, 77, 0, 0, 3, 77, 0, 10, 3,133, 0, 11, 3,134, 0, 9, 3, 4, 0, 12, 3, 4, 0, 7, 3,
+135, 0, 4, 0,101, 0,177, 2, 24, 0,158, 0, 4, 0, 13, 3, 4, 0, 35, 0,136, 0, 2, 0, 4, 0, 14, 3, 7, 0, 23, 2,
+137, 0, 2, 0, 4, 0,119, 0, 4, 0, 15, 3,138, 0, 24, 0,101, 0,177, 2, 24, 0,158, 0, 0, 0,208, 2, 2, 0, 16, 3,
+ 2, 0, 17, 0, 2, 0, 66, 1, 2, 0, 35, 0,136, 0, 17, 3, 4, 0, 18, 3, 7, 0, 19, 3, 4, 0, 51, 0, 4, 0, 20, 3,
+137, 0, 21, 3,136, 0, 22, 3, 4, 0, 23, 3, 4, 0, 24, 3, 4, 0, 25, 3, 4, 0, 15, 3, 7, 0, 26, 3, 7, 0, 27, 3,
+ 7, 0, 28, 3, 7, 0, 29, 3, 7, 0, 30, 3, 9, 0, 31, 3,139, 0, 8, 0,101, 0,177, 2,140, 0, 32, 3,133, 0, 11, 3,
+ 4, 0, 33, 3, 4, 0, 34, 3, 4, 0, 35, 3, 2, 0, 17, 0, 2, 0, 54, 0,141, 0, 8, 0,101, 0,177, 2, 24, 0, 42, 0,
+ 2, 0,249, 0, 2, 0, 17, 0, 2, 0,198, 2, 2, 0, 54, 0, 7, 0, 36, 3, 7, 0, 37, 3,142, 0, 5, 0,101, 0,177, 2,
+ 4, 0, 38, 3, 2, 0, 17, 0, 2, 0, 39, 3, 7, 0, 40, 3,143, 0, 8, 0,101, 0,177, 2, 0, 0, 41, 3, 0, 0, 42, 3,
+ 0, 0,167, 2, 0, 0, 43, 3, 0, 0, 44, 3, 0, 0, 88, 0, 0, 0,145, 2,144, 0, 3, 0,101, 0,177, 2,145, 0, 45, 3,
+129, 0,254, 2,146, 0, 10, 0,101, 0,177, 2, 24, 0, 46, 3, 24, 0, 47, 3, 0, 0, 48, 3, 7, 0, 49, 3, 2, 0, 50, 3,
+ 2, 0, 51, 3, 0, 0, 52, 3, 0, 0, 53, 3, 0, 0,183, 2,147, 0, 9, 0,101, 0,177, 2, 24, 0, 54, 3, 0, 0, 48, 3,
+ 7, 0, 55, 3, 7, 0, 56, 3, 0, 0, 66, 1, 0, 0,198, 2, 0, 0, 57, 3, 0, 0, 35, 0,148, 0, 1, 0,101, 0,177, 2,
+149, 0, 8, 0,101, 0,177, 2, 0, 0,208, 2, 7, 0,119, 0, 7, 0, 58, 3, 7, 0, 59, 3, 7, 0, 60, 3, 7, 0, 61, 3,
+ 4, 0, 17, 0,150, 0, 9, 0,101, 0,177, 2, 24, 0, 62, 3, 4, 0, 63, 3, 4, 0, 64, 3, 4, 0, 65, 3, 7, 0, 66, 3,
+ 7, 0, 67, 3, 2, 0,198, 2, 2, 0, 17, 0,151, 0, 3, 0,152, 0, 68, 3, 4, 0, 50, 2, 0, 0, 90, 0,152, 0, 29, 0,
+ 19, 0, 29, 0, 31, 0, 72, 0, 2, 0, 32, 2, 2, 0, 33, 2, 2, 0, 69, 3, 2, 0, 17, 0, 2, 0, 70, 3, 2, 0, 71, 3,
+ 2, 0, 72, 3, 2, 0, 67, 0, 0, 0, 73, 3, 0, 0, 74, 3, 0, 0, 75, 3, 0, 0,223, 1, 4, 0, 35, 0, 7, 0, 76, 3,
+ 7, 0, 77, 3, 7, 0, 78, 3, 7, 0, 79, 3, 7, 0, 80, 3, 7, 0, 81, 3, 26, 0, 82, 3, 28, 0, 77, 0, 30, 0, 57, 2,
+ 79, 0,106, 2, 0, 0, 69, 0, 7, 0, 83, 3, 7, 0, 84, 3,151, 0, 85, 3,153, 0, 3, 0,153, 0, 0, 0,153, 0, 1, 0,
+ 0, 0, 18, 0, 62, 0, 3, 0, 7, 0, 86, 3, 4, 0, 17, 0, 4, 0, 35, 0, 24, 0,126, 0, 19, 0, 29, 0, 31, 0, 72, 0,
+154, 0, 87, 3, 2, 0, 15, 0, 2, 0, 88, 3, 4, 0, 89, 3, 4, 0, 90, 3, 4, 0, 91, 3, 0, 0, 92, 3, 24, 0, 36, 0,
+ 24, 0, 93, 3, 24, 0, 94, 3, 24, 0, 95, 3, 24, 0, 96, 3, 28, 0, 77, 0, 70, 0, 56, 2, 62, 0,248, 1,155, 0, 97, 3,
+155, 0, 98, 3,156, 0, 99, 3, 9, 0, 2, 0,157, 0,100, 3,158, 0,101, 3,159, 0,102, 3, 12, 0,103, 3, 12, 0,100, 2,
+ 12, 0, 12, 2, 12, 0,104, 3, 12, 0,105, 3, 4, 0, 66, 1, 4, 0,106, 3, 57, 0, 14, 2, 0, 0,107, 3, 4, 0, 16, 2,
+ 4, 0,108, 3, 7, 0, 61, 1, 7, 0,109, 3, 7, 0,110, 3, 7, 0,166, 0, 7, 0,111, 3, 7, 0, 62, 1, 7, 0,112, 3,
+ 7, 0, 2, 2, 7, 0,113, 3, 7, 0,114, 3, 7, 0,115, 3, 7, 0,116, 3, 7, 0,117, 3, 7, 0,118, 3, 7, 0,246, 2,
+ 7, 0,119, 3, 7, 0,234, 0, 4, 0,120, 3, 2, 0, 17, 0, 2, 0,121, 3, 2, 0,122, 3, 2, 0,123, 3, 2, 0,124, 3,
+ 2, 0,125, 3, 2, 0,126, 3, 2, 0,127, 3, 2, 0,128, 3, 2, 0,129, 3, 2, 0,130, 3, 2, 0,131, 3, 4, 0,132, 3,
+ 4, 0,133, 3, 4, 0,134, 3, 4, 0,135, 3, 7, 0,136, 3, 7, 0, 92, 2, 7, 0,137, 3, 7, 0,138, 3, 7, 0,139, 3,
+ 7, 0,140, 3, 7, 0,141, 3, 7, 0,209, 0, 7, 0,142, 3, 7, 0,143, 3, 7, 0,144, 3, 7, 0,145, 3, 2, 0,146, 3,
+ 0, 0,147, 3, 0, 0,148, 3, 0, 0,149, 3, 0, 0,150, 3, 7, 0,151, 3, 7, 0,152, 3, 12, 0,153, 3, 12, 0,154, 3,
+ 12, 0,155, 3, 12, 0,156, 3, 7, 0,157, 3, 2, 0,148, 2, 2, 0,158, 3, 7, 0,129, 2, 4, 0,159, 3, 4, 0,160, 3,
+160, 0,161, 3, 2, 0,162, 3, 2, 0,241, 0, 7, 0,163, 3, 12, 0,164, 3, 12, 0,165, 3, 12, 0,166, 3, 12, 0,167, 3,
+161, 0, 58, 1,162, 0,168, 3, 58, 0,169, 3, 2, 0,170, 3, 2, 0,171, 3, 2, 0, 50, 2, 2, 0,172, 3, 7, 0,121, 2,
+ 2, 0,173, 3, 2, 0,174, 3,145, 0,175, 3,133, 0,176, 3,133, 0,177, 3, 4, 0,178, 3, 4, 0,179, 3, 4, 0,180, 3,
+ 4, 0, 67, 0, 12, 0,181, 3, 12, 0,182, 3, 12, 0,183, 3,163, 0, 14, 0,163, 0, 0, 0,163, 0, 1, 0, 24, 0, 36, 0,
+ 7, 0,246, 2, 7, 0, 63, 1, 7, 0,247, 2, 7, 0,239, 2, 0, 0, 18, 0, 4, 0,248, 2, 4, 0,249, 2, 4, 0,184, 3,
+ 2, 0, 15, 0, 2, 0,185, 3, 7, 0,250, 2,164, 0, 12, 0,164, 0, 0, 0,164, 0, 1, 0, 24, 0, 42, 0, 4, 0,186, 3,
+ 4, 0,148, 2, 4, 0,187, 3, 4, 0, 15, 0, 4, 0,188, 3, 7, 0, 63, 1, 7, 0,189, 3, 7, 0,190, 3, 7, 0,146, 2,
+161, 0, 40, 0, 4, 0, 17, 0, 2, 0,191, 3, 2, 0,192, 3, 2, 0,239, 2, 2, 0,193, 3, 2, 0,194, 3, 2, 0,195, 3,
+ 2, 0,196, 3, 2, 0,197, 3, 7, 0,198, 3, 7, 0,199, 3, 7, 0,200, 3, 7, 0,201, 3, 7, 0,202, 3, 7, 0,203, 3,
+ 7, 0,204, 3, 7, 0,205, 3, 7, 0,206, 3, 7, 0,207, 3, 7, 0,208, 3, 7, 0,209, 3, 7, 0,210, 3, 7, 0,211, 3,
+ 7, 0,212, 3, 7, 0,213, 3, 7, 0,214, 3, 7, 0,215, 3, 7, 0,216, 3, 7, 0,217, 3, 7, 0,218, 3, 7, 0,219, 3,
+ 7, 0,220, 3, 7, 0,221, 3, 7, 0,222, 3, 7, 0,223, 3, 7, 0,224, 3, 44, 0,159, 0,165, 0,225, 3, 7, 0,226, 3,
+ 4, 0,186, 2,166, 0, 5, 0, 58, 0,226, 1, 7, 0,227, 3, 7, 0,228, 3, 2, 0, 17, 0, 2, 0,229, 3,167, 0, 5, 0,
+167, 0, 0, 0,167, 0, 1, 0, 4, 0, 15, 0, 4, 0,230, 3, 9, 0, 2, 0,168, 0, 9, 0,168, 0, 0, 0,168, 0, 1, 0,
+ 4, 0,231, 3, 4, 0,232, 3, 4, 0,233, 3, 4, 0, 17, 0, 9, 0,234, 3, 9, 0,235, 3, 12, 0,236, 3,129, 0, 21, 0,
+129, 0, 0, 0,129, 0, 1, 0, 4, 0, 17, 0, 4, 0,237, 3, 4, 0,238, 3, 4, 0,239, 3, 4, 0,240, 3, 4, 0,241, 3,
+ 4, 0,242, 3, 4, 0,232, 3, 4, 0,148, 2, 2, 0,243, 3, 2, 0, 54, 0, 0, 0,244, 3, 0, 0,245, 3, 0, 0,246, 3,
+ 0, 0,247, 3, 0, 0,248, 3, 12, 0,249, 3,169, 0,250, 3, 9, 0,251, 3,170, 0, 1, 0, 7, 0, 30, 2,160, 0, 30, 0,
+ 4, 0, 17, 0, 7, 0,252, 3, 7, 0,253, 3, 7, 0,254, 3, 4, 0,255, 3, 4, 0, 0, 4, 4, 0, 1, 4, 4, 0, 2, 4,
+ 7, 0, 3, 4, 7, 0, 4, 4, 7, 0, 5, 4, 7, 0, 6, 4, 7, 0, 7, 4, 7, 0, 8, 4, 7, 0, 9, 4, 7, 0, 10, 4,
+ 7, 0, 11, 4, 7, 0, 12, 4, 7, 0, 13, 4, 7, 0, 14, 4, 7, 0, 15, 4, 7, 0, 16, 4, 7, 0, 17, 4, 7, 0, 18, 4,
+ 7, 0, 19, 4, 7, 0, 20, 4, 4, 0, 21, 4, 4, 0, 22, 4, 7, 0, 23, 4, 7, 0,142, 3,162, 0, 54, 0, 4, 0,232, 3,
+ 4, 0, 24, 4,171, 0, 25, 4,172, 0, 26, 4, 0, 0, 35, 0, 0, 0, 27, 4, 2, 0, 28, 4, 7, 0, 29, 4, 0, 0, 30, 4,
+ 7, 0, 31, 4, 7, 0, 32, 4, 7, 0, 33, 4, 7, 0, 34, 4, 7, 0, 35, 4, 7, 0, 36, 4, 7, 0, 37, 4, 7, 0, 38, 4,
+ 7, 0, 39, 4, 2, 0, 40, 4, 0, 0, 41, 4, 2, 0, 42, 4, 7, 0, 43, 4, 7, 0, 44, 4, 0, 0, 45, 4, 4, 0,120, 0,
+ 4, 0, 46, 4, 4, 0, 47, 4, 2, 0, 48, 4, 2, 0, 49, 4,170, 0, 50, 4, 4, 0, 51, 4, 4, 0, 79, 0, 7, 0, 52, 4,
+ 7, 0, 53, 4, 7, 0, 54, 4, 7, 0, 55, 4, 2, 0, 56, 4, 2, 0, 57, 4, 2, 0, 58, 4, 2, 0, 59, 4, 2, 0, 60, 4,
+ 2, 0, 61, 4, 2, 0, 62, 4, 2, 0, 63, 4,173, 0, 64, 4, 7, 0, 65, 4, 7, 0, 66, 4,129, 0, 67, 4, 12, 0,255, 2,
+166, 0, 68, 4, 7, 0, 69, 4, 7, 0, 70, 4, 7, 0, 71, 4, 0, 0, 72, 4,145, 0, 51, 0,144, 0, 73, 4, 2, 0, 15, 0,
+ 2, 0, 74, 4, 2, 0, 75, 4, 2, 0, 76, 4, 7, 0, 77, 4, 2, 0, 78, 4, 2, 0, 79, 4, 7, 0, 80, 4, 2, 0, 81, 4,
+ 2, 0, 82, 4, 7, 0, 83, 4, 7, 0, 84, 4, 7, 0, 85, 4, 7, 0, 86, 4, 7, 0, 87, 4, 4, 0, 88, 4, 4, 0, 89, 4,
+ 7, 0, 90, 4, 4, 0, 91, 4, 7, 0, 92, 4, 7, 0, 93, 4, 7, 0, 94, 4, 73, 0, 95, 4, 73, 0, 96, 4, 73, 0, 97, 4,
+ 0, 0, 98, 4, 7, 0, 99, 4, 7, 0,100, 4, 28, 0, 77, 0, 2, 0,101, 4, 0, 0,102, 4, 0, 0,103, 4, 7, 0,104, 4,
+ 4, 0,105, 4, 7, 0,106, 4, 7, 0,107, 4, 4, 0,108, 4, 4, 0, 17, 0, 7, 0,109, 4, 7, 0,110, 4, 7, 0,111, 4,
+ 77, 0,112, 4, 7, 0,113, 4, 7, 0,114, 4, 7, 0,115, 4, 7, 0,116, 4, 7, 0,117, 4, 7, 0,118, 4, 7, 0,119, 4,
+ 4, 0,120, 4,174, 0, 76, 0, 19, 0, 29, 0, 31, 0, 72, 0, 2, 0,169, 0, 2, 0, 67, 1, 2, 0,101, 1, 2, 0,121, 4,
+ 7, 0,122, 4, 7, 0,123, 4, 7, 0,124, 4, 7, 0,125, 4, 7, 0,126, 4, 7, 0,127, 4, 7, 0,147, 1, 7, 0,149, 1,
+ 7, 0,148, 1, 7, 0, 67, 0, 4, 0,128, 4, 7, 0,129, 4, 7, 0,130, 4, 7, 0,131, 4, 7, 0,132, 4, 7, 0,133, 4,
+ 7, 0,134, 4, 7, 0,135, 4, 2, 0,136, 4, 2, 0, 66, 1, 2, 0,137, 4, 2, 0,138, 4, 2, 0,139, 4, 2, 0,140, 4,
+ 2, 0,141, 4, 2, 0,142, 4, 7, 0,143, 4, 7, 0,144, 4, 7, 0,145, 4, 7, 0,146, 4, 7, 0,147, 4, 7, 0,148, 4,
+ 7, 0,149, 4, 7, 0,150, 4, 7, 0,151, 4, 7, 0,152, 4, 7, 0,153, 4, 7, 0,154, 4, 2, 0,155, 4, 2, 0,156, 4,
+ 2, 0,157, 4, 2, 0,158, 4, 7, 0,159, 4, 7, 0,160, 4, 7, 0,161, 4, 7, 0,162, 4, 2, 0,163, 4, 2, 0,164, 4,
+ 2, 0,165, 4, 2, 0,166, 4, 7, 0,167, 4, 7, 0,168, 4, 7, 0,169, 4, 7, 0,170, 4, 7, 0,171, 4, 7, 0,172, 4,
+ 7, 0,173, 4, 2, 0,174, 4, 2, 0,175, 4, 2, 0,176, 4, 2, 0,177, 4, 2, 0,178, 4, 2, 0, 17, 0, 7, 0,179, 4,
+ 7, 0,180, 4, 28, 0, 77, 0, 43, 0,119, 1, 2, 0,120, 1, 2, 0,181, 4, 22, 0,145, 0,175, 0, 8, 0,175, 0, 0, 0,
+175, 0, 1, 0, 4, 0,120, 3, 4, 0,182, 4, 4, 0, 17, 0, 2, 0,183, 4, 2, 0,184, 4, 24, 0,158, 0,176, 0, 13, 0,
+ 9, 0,185, 4, 9, 0,186, 4, 4, 0,187, 4, 4, 0,188, 4, 4, 0,189, 4, 4, 0,190, 4, 4, 0,191, 4, 4, 0,192, 4,
+ 4, 0,193, 4, 4, 0,194, 4, 4, 0,195, 4, 4, 0, 35, 0, 0, 0,196, 4,177, 0, 5, 0, 9, 0,197, 4, 9, 0,198, 4,
+ 4, 0,199, 4, 4, 0, 67, 0, 0, 0,200, 4,178, 0, 17, 0, 4, 0,201, 4, 4, 0,202, 4, 4, 0,203, 4, 4, 0,204, 4,
+ 4, 0,205, 4, 4, 0,206, 4, 4, 0,207, 4, 4, 0,208, 4, 4, 0,209, 4, 4, 0,210, 4, 4, 0,211, 4, 4, 0,212, 4,
+ 2, 0,213, 4, 2, 0,214, 4, 4, 0,215, 4, 4, 0,216, 4, 4, 0, 87, 0,179, 0, 15, 0, 4, 0, 15, 0, 4, 0,203, 4,
+ 4, 0,217, 4, 4, 0,218, 4, 4, 0,219, 4, 4, 0,220, 4, 7, 0,221, 4, 4, 0,222, 4, 4, 0, 88, 0, 4, 0,223, 4,
+ 4, 0,224, 4, 4, 0,225, 4, 4, 0,226, 4, 4, 0,227, 4, 18, 0, 28, 0,180, 0, 7, 0, 4, 0,228, 4, 7, 0,229, 4,
+ 7, 0,230, 4, 7, 0,231, 4, 4, 0,232, 4, 2, 0, 17, 0, 2, 0, 35, 0,181, 0, 11, 0,181, 0, 0, 0,181, 0, 1, 0,
+ 0, 0, 18, 0, 57, 0,233, 4, 58, 0,234, 4, 4, 0,120, 3, 4, 0,235, 4, 4, 0,236, 4, 4, 0, 35, 0, 4, 0,237, 4,
+ 4, 0,238, 4,182, 0,110, 0,176, 0,239, 4,177, 0,240, 4,178, 0,241, 4,179, 0,242, 4, 4, 0, 12, 3, 4, 0,120, 0,
+ 4, 0, 46, 4, 7, 0,243, 4, 4, 0,244, 4, 4, 0,245, 4, 4, 0,246, 4, 4, 0,247, 4, 2, 0, 17, 0, 2, 0,248, 4,
+ 7, 0,249, 4, 7, 0,250, 4, 7, 0,251, 4, 7, 0,252, 4, 7, 0,253, 4, 2, 0,254, 4, 2, 0,255, 4, 2, 0, 0, 5,
+ 2, 0, 1, 5, 2, 0,240, 0, 2, 0, 2, 5, 4, 0, 3, 5, 2, 0, 4, 5, 2, 0, 5, 5, 2, 0, 88, 1, 2, 0,104, 0,
+ 2, 0, 6, 5, 2, 0, 7, 5, 2, 0, 8, 5, 2, 0, 9, 5, 2, 0, 10, 5, 2, 0, 11, 5, 2, 0, 12, 5, 2, 0, 13, 5,
+ 2, 0, 14, 5, 2, 0, 89, 1, 2, 0, 15, 5, 2, 0, 16, 5, 2, 0, 17, 5, 2, 0, 18, 5, 4, 0, 19, 5, 4, 0, 66, 1,
+ 4, 0, 20, 5, 2, 0, 21, 5, 2, 0, 22, 5, 2, 0, 23, 5, 2, 0,245, 1, 2, 0, 24, 5, 2, 0, 25, 5, 2, 0, 26, 5,
+ 2, 0, 27, 5, 16, 0, 28, 5, 16, 0, 29, 5, 15, 0, 30, 5, 12, 0, 31, 5, 2, 0, 32, 5, 2, 0, 33, 5, 7, 0, 34, 5,
+ 7, 0, 35, 5, 7, 0, 36, 5, 7, 0, 37, 5, 4, 0, 38, 5, 7, 0, 39, 5, 7, 0, 40, 5, 7, 0, 41, 5, 7, 0, 42, 5,
+ 2, 0, 43, 5, 2, 0, 44, 5, 2, 0, 45, 5, 2, 0, 46, 5, 2, 0, 47, 5, 2, 0, 48, 5, 7, 0, 49, 5, 7, 0, 50, 5,
+ 7, 0, 51, 5, 0, 0, 52, 5, 0, 0, 53, 5, 4, 0, 54, 5, 2, 0, 55, 5, 2, 0,223, 1, 0, 0, 56, 5, 7, 0, 57, 5,
+ 7, 0, 58, 5, 0, 0, 59, 5, 0, 0, 60, 5, 0, 0, 61, 5, 0, 0, 62, 5, 4, 0, 63, 5, 2, 0, 64, 5, 2, 0, 65, 5,
+ 7, 0, 66, 5, 7, 0, 67, 5, 2, 0, 68, 5, 2, 0, 69, 5, 7, 0, 70, 5, 2, 0, 71, 5, 2, 0, 72, 5, 4, 0, 73, 5,
+ 2, 0, 74, 5, 2, 0, 75, 5, 2, 0, 76, 5, 2, 0, 77, 5, 7, 0, 78, 5, 7, 0, 67, 0, 34, 0, 79, 5, 0, 0, 80, 5,
+183, 0, 9, 0,183, 0, 0, 0,183, 0, 1, 0, 0, 0, 18, 0, 2, 0, 81, 5, 2, 0, 82, 5, 2, 0, 83, 5, 2, 0, 87, 0,
+ 7, 0, 84, 5, 7, 0, 67, 0,184, 0, 7, 0, 2, 0,203, 2, 2, 0, 66, 1, 2, 0, 67, 3, 2, 0, 85, 5, 7, 0, 86, 5,
+ 7, 0, 67, 0, 34, 0, 87, 5,185, 0, 5, 0, 7, 0, 88, 5, 0, 0, 15, 0, 0, 0, 87, 0, 0, 0, 67, 0, 0, 0,223, 1,
+186, 0, 28, 0, 7, 0,134, 4, 7, 0,135, 4, 2, 0, 66, 1, 2, 0, 17, 0, 2, 0, 89, 5, 2, 0,181, 4, 2, 0,137, 4,
+ 2, 0,138, 4, 2, 0,139, 4, 2, 0,140, 4, 2, 0,141, 4, 2, 0,142, 4,185, 0, 90, 5, 2, 0,254, 4, 2, 0,255, 4,
+ 2, 0, 0, 5, 2, 0, 1, 5, 2, 0,240, 0, 2, 0, 2, 5, 2, 0, 91, 5, 2, 0, 92, 5,184, 0, 93, 5, 2, 0, 94, 5,
+ 2, 0, 4, 5, 2, 0, 7, 5, 2, 0, 8, 5, 7, 0, 95, 5, 7, 0, 87, 0,187, 0, 6, 0,187, 0, 0, 0,187, 0, 1, 0,
+ 4, 0,231, 3, 0, 0,244, 3, 4, 0, 17, 0, 24, 0, 96, 5,188, 0, 4, 0,189, 0, 97, 5, 9, 0, 98, 5, 0, 0, 99, 5,
+ 4, 0, 88, 0,190, 0, 8, 0,188, 0,100, 5, 2, 0, 17, 0, 2, 0, 35, 0, 2, 0,101, 5, 2, 0,102, 5, 2, 0,103, 5,
+ 4, 0, 87, 0, 9, 0,104, 5,191, 0, 6, 0, 2, 0,104, 0, 2, 0,237, 3, 2, 0,105, 5, 2, 0,197, 2, 4, 0, 17, 0,
+ 7, 0,214, 2,192, 0, 14, 0, 2, 0, 17, 0, 2, 0,106, 5, 2, 0,107, 5, 2, 0,108, 5,191, 0,109, 5, 9, 0,104, 5,
+ 7, 0,110, 5, 7, 0, 54, 0, 4, 0,111, 5, 4, 0,112, 5, 4, 0,113, 5, 4, 0,114, 5, 38, 0,116, 0, 24, 0,158, 0,
+193, 0, 4, 0,193, 0, 0, 0,193, 0, 1, 0, 0, 0,115, 5, 7, 0,116, 5,194, 0, 14, 0,188, 0,100, 5, 4, 0, 88, 0,
+ 4, 0,117, 5, 7, 0,118, 5, 7, 0,119, 5, 7, 0,120, 5, 4, 0,121, 5, 4, 0,122, 5, 7, 0,123, 5, 7, 0,124, 5,
+ 4, 0,125, 5, 7, 0,126, 5, 7, 0,127, 5, 4, 0, 35, 0,195, 0, 7, 0,188, 0,100, 5, 2, 0, 17, 0, 2, 0, 35, 0,
+ 4, 0, 34, 0, 4, 0,128, 5, 79, 0,129, 5, 9, 0,104, 5,196, 0, 81, 0,195, 0,130, 5,195, 0,131, 5,194, 0, 87, 3,
+ 7, 0,132, 5, 2, 0,133, 5, 2, 0,134, 5, 7, 0,135, 5, 7, 0,136, 5, 2, 0,237, 3, 2, 0,137, 5, 7, 0,138, 5,
+ 7, 0,139, 5, 7, 0,140, 5, 2, 0,141, 5, 2, 0,111, 5, 2, 0,142, 5, 2, 0,143, 5, 2, 0,144, 5, 2, 0,145, 5,
+ 7, 0,146, 5, 7, 0,147, 5, 7, 0,148, 5, 2, 0,149, 5, 2, 0,150, 5, 2, 0,151, 5, 2, 0,152, 5, 2, 0,153, 5,
+ 2, 0,154, 5, 2, 0,155, 5, 2, 0,156, 5,190, 0,157, 5,192, 0,158, 5, 7, 0,159, 5, 7, 0,160, 5, 7, 0,161, 5,
+ 2, 0,162, 5, 2, 0,163, 5, 0, 0,164, 5, 0, 0,165, 5, 0, 0,166, 5, 0, 0,167, 5, 0, 0,168, 5, 0, 0,169, 5,
+ 2, 0,170, 5, 7, 0,171, 5, 7, 0,172, 5, 7, 0,173, 5, 7, 0,174, 5, 7, 0,175, 5, 7, 0,176, 5, 7, 0,177, 5,
+ 7, 0,178, 5, 7, 0,179, 5, 7, 0,180, 5, 2, 0,181, 5, 0, 0,182, 5, 0, 0,183, 5, 0, 0,184, 5, 0, 0,185, 5,
+ 24, 0,186, 5, 0, 0,187, 5, 0, 0,188, 5, 0, 0,189, 5, 0, 0,190, 5, 0, 0,191, 5, 0, 0,192, 5, 0, 0,193, 5,
+ 0, 0,194, 5, 2, 0,195, 5, 2, 0,196, 5, 2, 0,197, 5, 2, 0,198, 5, 2, 0,199, 5, 0, 0,200, 5, 0, 0,181, 4,
+ 4, 0,201, 5, 2, 0,202, 5, 2, 0, 87, 0, 4, 0,203, 5, 7, 0,204, 5, 7, 0,205, 5,197, 0, 8, 0, 4, 0,206, 5,
+ 4, 0,207, 5, 4, 0,208, 5, 4, 0,209, 5, 4, 0,210, 5, 4, 0,211, 5, 4, 0, 51, 0, 4, 0,116, 2,198, 0, 4, 0,
+ 7, 0,212, 5, 0, 0,213, 5, 0, 0,214, 5, 2, 0, 17, 0,199, 0, 4, 0, 7, 0,215, 5, 4, 0, 17, 0, 4, 0,216, 5,
+ 4, 0, 54, 0, 38, 0, 42, 0, 19, 0, 29, 0, 31, 0, 72, 0, 24, 0, 96, 5,174, 0,217, 5, 38, 0,218, 5, 12, 0,219, 5,
+175, 0,220, 5, 24, 0,221, 5, 7, 0,222, 5, 7, 0,223, 5, 7, 0,224, 5, 7, 0,225, 5, 4, 0,120, 3, 4, 0,226, 5,
+ 4, 0,227, 5, 2, 0, 17, 0, 2, 0, 60, 1, 52, 0, 55, 1,200, 0,228, 5,196, 0,229, 5,201, 0,230, 5,182, 0,176, 0,
+180, 0,231, 5, 12, 0, 98, 0, 12, 0,232, 5, 9, 0,233, 5, 9, 0,234, 5, 9, 0,235, 5, 9, 0,236, 5,202, 0,237, 5,
+ 2, 0,238, 5, 2, 0,239, 5, 2, 0,241, 0, 2, 0,240, 5, 4, 0,241, 5, 4, 0,242, 5, 12, 0,243, 5,185, 0, 90, 5,
+186, 0,244, 5,198, 0,245, 5,157, 0,100, 3,199, 0,246, 5,203, 0, 11, 0,203, 0, 0, 0,203, 0, 1, 0, 39, 0,232, 0,
+ 37, 0, 54, 1, 7, 0, 80, 2, 7, 0, 81, 2, 7, 0,104, 0, 7, 0,247, 5, 2, 0,248, 5, 2, 0, 17, 0, 7, 0, 67, 0,
+204, 0, 38, 0, 7, 0,249, 5, 7, 0,250, 5, 7, 0,251, 5, 7, 0,252, 5, 7, 0,253, 5, 7, 0,254, 5, 7, 0,255, 5,
+ 7, 0, 0, 6, 7, 0, 1, 6, 7, 0, 73, 1, 7, 0, 2, 6, 7, 0, 3, 6, 7, 0, 4, 6, 7, 0, 5, 6, 7, 0,165, 0,
+ 2, 0, 6, 6, 2, 0, 7, 6, 4, 0, 35, 0, 2, 0, 8, 6, 2, 0, 9, 6, 2, 0, 10, 6, 2, 0,248, 5, 7, 0, 11, 6,
+ 7, 0, 12, 6, 62, 0, 13, 6,157, 0,100, 3,204, 0, 14, 6,205, 0, 15, 6,206, 0, 16, 6,207, 0, 17, 6,208, 0, 18, 6,
+209, 0, 19, 6, 7, 0, 20, 6, 2, 0, 21, 6, 2, 0, 22, 6, 7, 0, 23, 6, 7, 0, 24, 6, 7, 0, 25, 6,210, 0, 55, 0,
+211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 7, 0, 1, 6, 7, 0, 73, 1,
+ 7, 0, 87, 0, 4, 0, 30, 6, 2, 0, 10, 6, 2, 0,248, 5, 24, 0, 96, 5, 24, 0, 31, 6, 12, 0, 32, 6,203, 0, 33, 6,
+210, 0, 14, 6, 0, 0, 34, 6, 4, 0,120, 3, 4, 0,226, 5, 2, 0, 35, 6, 2, 0, 36, 6, 2, 0, 37, 6, 2, 0, 38, 6,
+ 2, 0,223, 1, 2, 0, 17, 0, 2, 0, 15, 2, 2, 0, 39, 6, 7, 0,109, 0, 7, 0, 40, 6, 7, 0, 23, 6, 7, 0, 41, 6,
+ 7, 0, 42, 6, 7, 0,165, 0, 7, 0,222, 5, 2, 0, 43, 6, 2, 0,245, 1, 2, 0, 44, 6, 2, 0, 45, 6, 2, 0, 46, 6,
+ 2, 0, 47, 6, 2, 0, 48, 6, 2, 0, 49, 6, 2, 0, 50, 6, 2, 0, 7, 6, 12, 0, 51, 6, 12, 0, 52, 6, 12, 0, 53, 6,
+ 2, 0, 54, 6, 2, 0,130, 2, 2, 0, 55, 6, 0, 0, 56, 6, 0, 0, 57, 6, 9, 0, 58, 6,157, 0,100, 3,212, 0, 24, 0,
+ 16, 0, 34, 0, 16, 0, 61, 0, 15, 0, 59, 6, 15, 0, 60, 6, 15, 0, 61, 6, 7, 0, 62, 6, 7, 0, 63, 6, 7, 0, 64, 6,
+ 7, 0, 65, 6, 2, 0, 66, 6, 2, 0, 67, 6, 2, 0, 68, 6, 2, 0, 69, 6, 2, 0, 70, 6, 2, 0, 17, 0, 2, 0, 71, 6,
+ 2, 0, 72, 6, 2, 0, 73, 6, 2, 0, 74, 6, 2, 0, 75, 6, 2, 0, 38, 6, 7, 0, 76, 6, 4, 0, 77, 6, 4, 0, 78, 6,
+211, 0, 6, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,213, 0, 8, 0,
+211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 0, 0, 79, 6, 0, 0,175, 0,
+214, 0, 14, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,212, 0, 80, 6,
+215, 0, 81, 6, 12, 0, 82, 6, 2, 0, 66, 1, 2, 0, 83, 6, 4, 0, 17, 0, 7, 0, 84, 6, 4, 0, 38, 6,216, 0, 20, 0,
+211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,205, 0, 15, 6,212, 0, 80, 6,
+ 2, 0, 85, 6, 2, 0, 86, 6, 2, 0, 87, 6, 2, 0, 88, 6, 2, 0, 71, 6, 2, 0, 89, 6, 0, 0, 17, 0, 0, 0,181, 4,
+ 9, 0, 56, 2, 4, 0, 90, 6, 4, 0, 91, 6, 19, 0, 92, 6,217, 0, 18, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6,
+ 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,212, 0, 80, 6, 7, 0, 80, 2, 7, 0, 81, 2, 2, 0, 85, 6, 2, 0, 93, 6,
+ 2, 0, 94, 6, 2, 0, 95, 6, 4, 0, 17, 0, 7, 0, 96, 6, 4, 0,248, 5, 4, 0, 35, 0,157, 0,100, 3,218, 0, 17, 0,
+ 0, 0, 97, 6, 0, 0, 98, 6, 0, 0, 99, 6, 0, 0,100, 6, 0, 0,101, 6, 0, 0,102, 6, 2, 0, 15, 0, 2, 0, 17, 0,
+ 2, 0,103, 6, 2, 0,104, 6, 2, 0,166, 1, 2, 0,105, 6, 4, 0,106, 6, 4, 0,107, 6, 2, 0,108, 6, 2, 0, 35, 0,
+ 0, 0,109, 6,219, 0, 16, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 4, 0,110, 6,218, 0,111, 6,
+220, 0,112, 6, 12, 0,113, 6, 12, 0,114, 6,221, 0,115, 6,209, 0,116, 6,222, 0,117, 6, 2, 0,118, 6, 2, 0,119, 6,
+ 2, 0,120, 6, 2, 0, 67, 0,223, 0, 15, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6,
+ 2, 0, 29, 6,212, 0, 80, 6, 12, 0,121, 6,224, 0,122, 6, 0, 0,123, 6,225, 0,124, 6, 2, 0, 17, 0, 2, 0,125, 6,
+ 2, 0,126, 6, 2, 0,127, 6,226, 0, 25, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 4, 0, 17, 0,
+ 39, 0,222, 2, 37, 0, 54, 1, 55, 0,128, 6,227, 0,129, 6,228, 0,130, 6,157, 0,100, 3, 7, 0,131, 6, 7, 0, 80, 2,
+ 7, 0, 81, 2, 7, 0, 96, 6, 7, 0,132, 6, 7, 0,133, 6, 2, 0,134, 6, 2, 0,135, 6, 2, 0,136, 6, 2, 0,137, 6,
+ 0, 0,138, 6, 0, 0,139, 6, 0, 0,140, 6, 0, 0, 38, 6,229, 0, 11, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6,
+ 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 2, 0, 83, 6, 2, 0, 17, 0, 4, 0, 35, 0,215, 0, 81, 6,212, 0, 80, 6,
+230, 0, 29, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 34, 0,141, 6,
+ 4, 0,142, 6, 4, 0,143, 6, 2, 0, 88, 0, 2, 0,144, 6, 2, 0,145, 6, 0, 0,146, 6, 0, 0,147, 6, 4, 0,148, 6,
+ 4, 0,149, 6, 4, 0,150, 6, 2, 0,151, 6, 2, 0,152, 6, 2, 0,153, 6, 2, 0,154, 6, 7, 0,155, 6, 15, 0,156, 6,
+ 15, 0,157, 6, 4, 0,158, 6, 4, 0,159, 6, 0, 0,160, 6, 0, 0,161, 6, 9, 0,162, 6,231, 0, 10, 0, 19, 0, 29, 0,
+ 9, 0,163, 6, 9, 0,164, 6, 9, 0,165, 6, 9, 0,166, 6, 9, 0,167, 6, 4, 0, 88, 0, 4, 0,168, 6, 0, 0,169, 6,
+ 0, 0,170, 6,232, 0, 10, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6,231, 0,171, 6,
+ 2, 0, 88, 0, 2, 0,144, 6, 4, 0, 87, 0, 9, 0,172, 6,233, 0, 3, 0,233, 0, 0, 0,233, 0, 1, 0, 7, 0,173, 6,
+234, 0, 11, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6,212, 0, 80, 6, 12, 0,174, 6,
+ 4, 0,175, 6, 4, 0, 35, 0, 4, 0, 17, 0, 4, 0,176, 6,235, 0, 25, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6,
+ 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,212, 0, 80, 6, 19, 0,177, 6, 19, 0, 78, 0, 2, 0, 17, 0, 2, 0,144, 6,
+ 7, 0,178, 6, 9, 0,179, 6, 7, 0, 80, 2, 7, 0, 81, 2, 7, 0, 96, 6, 7, 0, 25, 6, 7, 0,180, 6, 7, 0,181, 6,
+ 52, 0, 55, 1, 52, 0,182, 6, 4, 0,183, 6, 2, 0,184, 6, 2, 0, 35, 0,157, 0,100, 3,236, 0, 10, 0,211, 0, 0, 0,
+211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 2, 0, 17, 0, 2, 0,129, 3, 4, 0, 35, 0,
+157, 0,100, 3,237, 0, 42, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,
+212, 0, 80, 6,220, 0,112, 6, 0, 0,185, 6, 0, 0, 98, 6, 0, 0, 99, 6, 2, 0, 15, 0, 2, 0,186, 6, 2, 0, 17, 0,
+ 2, 0,103, 6, 9, 0,179, 6, 4, 0,106, 6, 4, 0,187, 6, 4, 0,188, 6, 4, 0,107, 6, 15, 0,189, 6, 15, 0,190, 6,
+ 7, 0,191, 6, 7, 0,192, 6, 7, 0,193, 6, 7, 0,178, 6, 2, 0,194, 6, 2, 0,231, 0, 2, 0,166, 1, 2, 0,105, 6,
+ 2, 0, 35, 0, 2, 0, 87, 0, 2, 0,195, 6, 2, 0,196, 6, 9, 0,197, 6, 9, 0,198, 6, 9, 0,199, 6, 9, 0,200, 6,
+ 9, 0,201, 6, 2, 0,202, 6, 0, 0,203, 6, 49, 0,204, 6,238, 0, 7, 0,238, 0, 0, 0,238, 0, 1, 0, 4, 0,205, 6,
+ 4, 0, 21, 0, 0, 0, 81, 0, 4, 0,206, 6, 4, 0, 15, 0,239, 0, 14, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6,
+ 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 4, 0,145, 6, 4, 0, 35, 0, 12, 0,207, 6, 12, 0,208, 6, 0, 0,209, 6,
+ 0, 0,210, 6, 4, 0,211, 6, 4, 0,212, 6,240, 0, 6, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6,
+ 4, 0, 35, 0, 0, 0,213, 6,241, 0, 15, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6,
+242, 0,214, 6,212, 0, 80, 6,243, 0,215, 6, 2, 0, 66, 1, 2, 0,216, 6, 2, 0, 80, 2, 2, 0, 81, 2, 2, 0, 17, 0,
+ 2, 0,136, 6, 4, 0, 67, 0,244, 0, 7, 0,244, 0, 0, 0,244, 0, 1, 0, 0, 0,217, 6, 2, 0,218, 6, 2, 0,219, 6,
+ 2, 0,220, 6, 2, 0, 35, 0,245, 0, 12, 0, 2, 0,219, 6, 2, 0,221, 6, 2, 0,222, 6, 0, 0,183, 2, 2, 0,223, 6,
+ 2, 0,224, 6, 2, 0,225, 6, 2, 0,226, 6, 2, 0,227, 6, 2, 0, 71, 6, 7, 0,228, 6, 7, 0,229, 6,246, 0, 18, 0,
+246, 0, 0, 0,246, 0, 1, 0, 0, 0,244, 3,245, 0,230, 6,245, 0,231, 6,245, 0,232, 6,245, 0,233, 6, 7, 0,234, 6,
+ 2, 0,235, 6, 2, 0,236, 6, 2, 0,237, 6, 2, 0,238, 6, 2, 0,239, 6, 2, 0,240, 6, 2, 0,241, 6, 2, 0,242, 6,
+ 2, 0,243, 6, 2, 0,244, 6,247, 0, 10, 0, 0, 0,245, 6, 0, 0,246, 6, 0, 0,247, 6, 0, 0,248, 6, 0, 0,249, 6,
+ 0, 0,250, 6, 2, 0,251, 6, 2, 0,252, 6, 2, 0,253, 6, 2, 0,254, 6,248, 0, 8, 0, 0, 0,255, 6, 0, 0, 0, 7,
+ 0, 0, 1, 7, 0, 0, 2, 7, 0, 0, 3, 7, 0, 0, 4, 7, 7, 0,247, 5, 7, 0, 35, 0,249, 0, 18, 0,247, 0, 5, 7,
+247, 0, 6, 7,247, 0, 7, 7,247, 0, 8, 7,247, 0, 9, 7,247, 0, 10, 7,247, 0, 11, 7,247, 0, 12, 7,247, 0, 13, 7,
+247, 0, 14, 7,247, 0, 15, 7,247, 0, 16, 7,247, 0, 17, 7,247, 0, 18, 7,247, 0, 19, 7,247, 0, 20, 7,248, 0, 21, 7,
+ 0, 0, 22, 7,250, 0, 96, 0, 0, 0, 23, 7, 0, 0, 24, 7, 0, 0,249, 6, 0, 0, 25, 7, 0, 0, 26, 7, 0, 0, 27, 7,
+ 0, 0, 28, 7, 0, 0, 29, 7, 0, 0, 30, 7, 0, 0, 31, 7, 0, 0, 32, 7, 0, 0, 33, 7, 0, 0, 34, 7, 0, 0, 35, 7,
+ 0, 0, 36, 7, 0, 0, 37, 7, 0, 0, 38, 7, 0, 0, 39, 7, 0, 0, 40, 7, 0, 0, 41, 7, 0, 0, 42, 7, 0, 0, 43, 7,
+ 0, 0, 44, 7, 0, 0, 45, 7, 0, 0, 46, 7, 0, 0, 47, 7, 0, 0, 48, 7, 0, 0, 49, 7, 0, 0, 50, 7, 0, 0, 51, 7,
+ 0, 0, 52, 7, 0, 0, 53, 7, 0, 0, 54, 7, 0, 0, 55, 7, 0, 0, 56, 7, 0, 0, 57, 7, 0, 0, 58, 7, 0, 0, 59, 7,
+ 0, 0, 60, 7, 0, 0, 61, 7, 0, 0, 62, 7, 0, 0, 63, 7, 0, 0, 64, 7, 0, 0, 65, 7, 0, 0, 66, 7, 0, 0, 67, 7,
+ 0, 0, 68, 7, 0, 0, 69, 7, 0, 0, 70, 7, 0, 0, 71, 7, 0, 0, 72, 7, 0, 0, 73, 7, 0, 0, 74, 7, 0, 0, 75, 7,
+ 0, 0, 76, 7, 0, 0, 77, 7, 0, 0, 78, 7, 0, 0, 79, 7, 0, 0, 80, 7, 0, 0, 81, 7, 0, 0, 82, 7, 0, 0, 83, 7,
+ 0, 0, 84, 7, 0, 0, 85, 7, 0, 0, 86, 7, 0, 0, 87, 7, 0, 0, 88, 7, 0, 0, 89, 7, 0, 0, 90, 7, 0, 0, 91, 7,
+ 0, 0, 92, 7, 0, 0, 93, 7, 0, 0, 94, 7, 0, 0, 95, 7, 0, 0, 96, 7, 0, 0, 97, 7, 0, 0, 98, 7, 0, 0, 99, 7,
+ 0, 0,100, 7, 0, 0,101, 7, 0, 0,102, 7, 0, 0,103, 7, 0, 0,104, 7, 0, 0,105, 7, 0, 0,106, 7, 0, 0,107, 7,
+ 0, 0,108, 7, 0, 0,109, 7, 0, 0,110, 7, 0, 0,111, 7, 0, 0,112, 7, 0, 0,113, 7, 0, 0,114, 7, 0, 0,115, 7,
+ 0, 0,116, 7, 0, 0,117, 7,251, 0, 5, 0, 0, 0,118, 7, 0, 0, 47, 7, 0, 0, 49, 7, 2, 0, 17, 0, 2, 0, 35, 0,
+252, 0, 25, 0,252, 0, 0, 0,252, 0, 1, 0, 0, 0, 18, 0,249, 0,119, 7,250, 0,120, 7,250, 0,121, 7,250, 0,122, 7,
+250, 0,123, 7,250, 0,124, 7,250, 0,125, 7,250, 0,126, 7,250, 0,127, 7,250, 0,128, 7,250, 0,129, 7,250, 0,130, 7,
+250, 0,131, 7,250, 0,132, 7,250, 0,133, 7,250, 0,134, 7,250, 0,135, 7,250, 0,136, 7,250, 0,137, 7,251, 0,138, 7,
+ 4, 0,139, 7, 4, 0, 35, 0,253, 0, 3, 0,253, 0, 0, 0,253, 0, 1, 0, 0, 0,140, 7,254, 0, 5, 0, 4, 0, 17, 0,
+ 4, 0, 35, 0, 7, 0,129, 2, 7, 0,141, 7, 7, 0, 30, 2,255, 0, 90, 0, 4, 0, 17, 0, 4, 0,142, 7, 4, 0,143, 7,
+ 0, 0,144, 7, 0, 0,145, 7, 0, 0,146, 7, 0, 0,147, 7, 0, 0,148, 7, 0, 0,149, 7, 0, 0,150, 7, 0, 0,151, 7,
+ 0, 0,152, 7, 0, 0,153, 7, 4, 0,154, 7, 2, 0,155, 7, 2, 0,156, 7, 2, 0,157, 7, 2, 0,158, 7, 4, 0,159, 7,
+ 4, 0,160, 7, 4, 0,161, 7, 4, 0,162, 7, 2, 0,163, 7, 2, 0,164, 7, 4, 0,165, 7, 4, 0,166, 7, 4, 0,167, 7,
+ 4, 0,168, 7, 4, 0,169, 7, 4, 0,207, 6, 4, 0,170, 7, 2, 0,171, 7, 2, 0,172, 7, 2, 0,173, 7, 2, 0,174, 7,
+ 12, 0,175, 7, 12, 0,176, 7, 12, 0,177, 7, 12, 0,178, 7, 12, 0,179, 7, 0, 0,180, 7, 2, 0,181, 7, 2, 0,182, 7,
+ 2, 0,183, 7, 2, 0,184, 7, 2, 0,185, 7, 2, 0,186, 7, 2, 0,187, 7, 2, 0,188, 7,254, 0,189, 7, 2, 0,190, 7,
+ 2, 0,191, 7, 2, 0,192, 7, 2, 0,193, 7, 2, 0,194, 7, 2, 0,195, 7, 2, 0,196, 7, 2, 0,197, 7, 4, 0,198, 7,
+ 4, 0,199, 7, 2, 0,200, 7, 2, 0,201, 7, 2, 0,202, 7, 2, 0,203, 7, 2, 0,204, 7, 2, 0,205, 7, 2, 0,206, 7,
+ 2, 0,207, 7, 2, 0,208, 7, 2, 0,209, 7, 2, 0,210, 7, 2, 0,211, 7, 2, 0,212, 7, 2, 0,213, 7, 2, 0,214, 7,
+ 2, 0,215, 7, 2, 0,216, 7, 2, 0,181, 4, 0, 0,217, 7, 0, 0,218, 7, 7, 0,219, 7, 2, 0,162, 5, 2, 0,163, 5,
+ 2, 0,220, 7, 2, 0,221, 7, 7, 0,222, 7, 47, 0,223, 7, 7, 0,224, 7, 4, 0,223, 1, 0, 0,225, 7, 0, 1, 22, 0,
+ 19, 0, 29, 0, 12, 0,226, 7, 12, 0,227, 7, 12, 0,228, 7, 12, 0, 26, 6, 38, 0,116, 0, 38, 0,229, 7, 2, 0,230, 7,
+ 2, 0,231, 7, 2, 0,232, 7, 2, 0,233, 7, 2, 0,234, 7, 2, 0,235, 7, 2, 0,236, 7, 2, 0,237, 7, 2, 0,238, 7,
+ 2, 0,239, 7, 2, 0,240, 7, 2, 0, 35, 0,209, 0,241, 7, 9, 0,242, 7, 2, 0,243, 7, 1, 1, 5, 0, 1, 1, 0, 0,
+ 1, 1, 1, 0, 1, 1,244, 7, 13, 0,245, 7, 4, 0, 17, 0, 2, 1, 7, 0, 2, 1, 0, 0, 2, 1, 1, 0, 1, 1,246, 7,
+ 1, 1,247, 7, 2, 0, 29, 5, 2, 0, 17, 0, 4, 0, 35, 0, 3, 1, 25, 0, 3, 1, 0, 0, 3, 1, 1, 0, 4, 1,248, 7,
+ 5, 1,117, 6, 0, 0,249, 7, 0, 0,250, 7, 0, 0,251, 7, 2, 0,252, 7, 2, 0,253, 7, 2, 0,254, 7, 2, 0,255, 7,
+ 2, 0, 0, 8, 2, 0, 35, 0, 2, 0, 17, 0, 2, 0, 1, 8, 2, 0, 2, 8, 2, 0, 3, 8, 4, 0, 4, 8, 3, 1, 5, 8,
+ 9, 0, 6, 8, 4, 0, 7, 8, 4, 0, 8, 8, 4, 0, 9, 8, 4, 0, 10, 8, 0, 0, 11, 8,242, 0, 22, 0,242, 0, 0, 0,
+242, 0, 1, 0, 1, 1,246, 7, 1, 1,247, 7, 1, 1, 12, 8, 1, 1, 13, 8, 0, 1, 14, 8, 15, 0, 49, 0, 0, 0, 27, 6,
+ 0, 0, 15, 8, 2, 0, 72, 6, 2, 0, 73, 6, 2, 0, 16, 8, 2, 0, 35, 0, 2, 0,234, 7, 2, 0,206, 6, 2, 0, 17, 0,
+ 6, 1,248, 7, 12, 0, 17, 8, 12, 0, 26, 6, 12, 0, 18, 8, 12, 0, 19, 8, 7, 1, 24, 0, 7, 1, 0, 0, 7, 1, 1, 0,
+212, 0, 80, 6, 15, 0, 20, 8, 15, 0, 21, 8, 2, 0, 72, 6, 2, 0, 73, 6, 2, 0, 22, 8, 2, 0, 23, 8, 2, 0, 24, 8,
+ 2, 0, 17, 0, 7, 0, 76, 2, 2, 0,254, 7, 2, 0,255, 7, 2, 0,233, 7, 2, 0, 25, 8, 2, 0,238, 7, 2, 0,181, 4,
+ 8, 1,248, 7, 12, 0, 26, 8, 12, 0, 27, 8, 12, 0, 18, 8, 0, 0, 28, 8, 9, 0, 29, 8, 9, 1, 14, 0, 0, 0, 30, 8,
+ 2, 0, 31, 8, 2, 0, 32, 8, 2, 0, 33, 8, 2, 0, 34, 8, 2, 0, 16, 5, 2, 0, 11, 5, 0, 1, 35, 8, 38, 0, 36, 8,
+ 4, 0, 37, 8, 4, 0, 38, 8, 4, 0, 39, 8, 4, 0, 35, 0, 0, 0, 40, 8, 10, 1, 3, 0, 0, 0, 41, 8, 4, 0, 42, 8,
+ 4, 0, 43, 8, 11, 1, 4, 0, 4, 0,142, 6, 4, 0, 44, 8, 4, 0,148, 6, 4, 0, 45, 8, 12, 1, 2, 0, 4, 0, 46, 8,
+ 4, 0, 47, 8, 13, 1, 5, 0, 7, 0, 48, 8, 7, 0, 49, 8, 7, 0, 50, 8, 4, 0, 17, 0, 4, 0, 35, 0, 14, 1, 6, 0,
+ 0, 0, 51, 8, 0, 0, 99, 6, 41, 0,129, 0, 2, 0,104, 0, 2, 0, 15, 5, 4, 0, 35, 0, 15, 1, 14, 0, 15, 1, 0, 0,
+ 15, 1, 1, 0, 4, 0, 54, 0, 4, 0, 21, 0, 4, 0, 26, 0, 4, 0, 52, 8, 4, 0, 53, 8, 4, 0, 54, 8, 10, 1, 55, 8,
+ 0, 0, 51, 8, 14, 1, 94, 3, 11, 1, 56, 8, 12, 1, 57, 8, 13, 1, 58, 8, 16, 1, 12, 0, 0, 0,247, 1, 9, 0,217, 0,
+ 0, 0,218, 0, 4, 0,221, 0, 4, 0,229, 0, 9, 0,222, 0, 7, 0,224, 0, 7, 0,225, 0, 9, 0, 59, 8, 9, 0, 60, 8,
+ 9, 0,226, 0, 9, 0,228, 0, 17, 1, 48, 0, 17, 1, 0, 0, 17, 1, 1, 0, 9, 0, 61, 8, 9, 0, 24, 0, 0, 0, 25, 0,
+ 4, 0, 17, 0, 4, 0, 15, 0, 4, 0, 21, 0, 4, 0, 85, 0, 4, 0, 62, 8, 4, 0, 63, 8, 4, 0, 53, 8, 4, 0, 54, 8,
+ 4, 0, 64, 8, 4, 0,240, 0, 4, 0, 65, 8, 4, 0, 66, 8, 7, 0, 67, 8, 7, 0, 35, 0, 7, 0, 68, 8, 7, 0, 69, 8,
+ 4, 0,120, 0, 4, 0, 70, 8, 15, 1, 71, 8, 28, 0, 77, 0, 38, 0,116, 0, 24, 0, 72, 8, 41, 0,129, 0, 7, 0, 73, 8,
+ 7, 0, 74, 8, 16, 1, 56, 1, 17, 1, 75, 8, 17, 1, 76, 8, 17, 1, 77, 8, 12, 0, 78, 8,243, 0,215, 6, 9, 0, 79, 8,
+ 7, 0,254, 3, 7, 0, 80, 8, 7, 0, 81, 8, 4, 0, 82, 8, 4, 0, 83, 8, 7, 0, 84, 8, 9, 0, 85, 8, 4, 0, 86, 8,
+ 4, 0, 87, 8, 4, 0, 88, 8, 7, 0, 89, 8, 18, 1, 4, 0, 18, 1, 0, 0, 18, 1, 1, 0, 12, 0, 90, 8, 17, 1, 91, 8,
+200, 0, 11, 0, 12, 0, 92, 8, 12, 0, 78, 8, 12, 0, 93, 8, 17, 1, 94, 8, 0, 0, 95, 8, 0, 0, 96, 8, 4, 0, 97, 8,
+ 4, 0, 98, 8, 4, 0, 99, 8, 4, 0, 35, 0, 16, 0,100, 8, 19, 1, 4, 0, 7, 0,101, 8, 7, 0, 67, 3, 2, 0,102, 8,
+ 2, 0,103, 8, 20, 1, 6, 0, 7, 0,104, 8, 7, 0,105, 8, 7, 0,106, 8, 7, 0,107, 8, 4, 0,108, 8, 4, 0,109, 8,
+ 21, 1, 13, 0, 7, 0,110, 8, 7, 0,111, 8, 7, 0,112, 8, 7, 0,113, 8, 7, 0,114, 8, 7, 0,115, 8, 7, 0,116, 8,
+ 7, 0,117, 8, 7, 0,118, 8, 7, 0,119, 8, 4, 0,228, 2, 4, 0,120, 8, 4, 0,121, 8, 22, 1, 2, 0, 7, 0, 88, 5,
+ 7, 0, 35, 0, 23, 1, 5, 0, 7, 0,122, 8, 7, 0,123, 8, 4, 0, 88, 0, 4, 0,184, 2, 4, 0,124, 8, 24, 1, 6, 0,
+ 24, 1, 0, 0, 24, 1, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,125, 8, 2, 0, 54, 0, 25, 1, 8, 0, 25, 1, 0, 0,
+ 25, 1, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,125, 8, 2, 0, 54, 0, 7, 0, 21, 0, 7, 0,120, 0, 26, 1, 45, 0,
+ 26, 1, 0, 0, 26, 1, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,125, 8, 2, 0,236, 0, 2, 0, 40, 4, 2, 0,126, 8,
+ 7, 0,127, 8, 7, 0, 86, 0, 7, 0,241, 2, 4, 0,128, 8, 4, 0, 79, 0, 4, 0,186, 2, 7, 0,129, 8, 7, 0,130, 8,
+ 7, 0,131, 8, 7, 0,132, 8, 7, 0,133, 8, 7, 0,134, 8, 7, 0,238, 2, 7, 0, 53, 1, 7, 0,135, 8, 7, 0,136, 8,
+ 7, 0, 35, 0, 7, 0,137, 8, 7, 0,138, 8, 7, 0,139, 8, 2, 0,140, 8, 2, 0,141, 8, 2, 0,142, 8, 2, 0,143, 8,
+ 2, 0,144, 8, 2, 0,145, 8, 2, 0,146, 8, 2, 0,147, 8, 2, 0, 15, 2, 2, 0,148, 8, 2, 0, 12, 2, 2, 0,149, 8,
+ 0, 0,150, 8, 0, 0,151, 8, 7, 0,234, 0, 27, 1,152, 8, 58, 0,226, 1, 28, 1, 16, 0, 28, 1, 0, 0, 28, 1, 1, 0,
+ 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,125, 8, 2, 0,236, 0, 7, 0,233, 2, 7, 0,234, 2, 7, 0,235, 2, 7, 0, 65, 2,
+ 7, 0,236, 2, 7, 0,237, 2, 7, 0,153, 8, 7, 0,238, 2, 7, 0,240, 2, 7, 0,241, 2,225, 0, 5, 0, 2, 0, 15, 0,
+ 2, 0,154, 8, 2, 0, 17, 0, 2, 0,155, 8, 19, 0,177, 6,224, 0, 3, 0, 4, 0, 66, 0, 4, 0,156, 8,225, 0, 2, 0,
+ 29, 1, 7, 0, 29, 1, 0, 0, 29, 1, 1, 0, 0, 0, 18, 0, 2, 0, 15, 0, 2, 0, 17, 0, 4, 0, 20, 0, 9, 0,157, 8,
+ 30, 1, 5, 0, 0, 0, 18, 0, 7, 0, 73, 1, 7, 0,158, 8, 4, 0,159, 8, 4, 0, 35, 0, 31, 1, 4, 0, 2, 0, 15, 0,
+ 2, 0, 17, 0, 2, 0, 87, 0, 2, 0, 67, 0, 32, 1, 4, 0, 0, 0, 18, 0, 57, 0,160, 8, 7, 0, 73, 1, 7, 0, 35, 0,
+ 33, 1, 6, 0, 2, 0,161, 8, 2, 0,162, 8, 2, 0, 15, 0, 2, 0,163, 8, 0, 0,164, 8, 0, 0,165, 8, 34, 1, 5, 0,
+ 4, 0, 15, 0, 4, 0, 35, 0, 0, 0, 18, 0, 0, 0,166, 8, 0, 0,167, 8, 35, 1, 3, 0, 4, 0, 15, 0, 4, 0, 35, 0,
+ 0, 0, 18, 0, 36, 1, 4, 0, 2, 0,168, 8, 2, 0,169, 8, 2, 0, 17, 0, 2, 0, 35, 0, 37, 1, 6, 0, 0, 0, 18, 0,
+ 0, 0,170, 8, 2, 0,171, 8, 2, 0,238, 2, 2, 0, 66, 1, 2, 0, 67, 0, 38, 1, 5, 0, 0, 0, 18, 0, 7, 0, 67, 3,
+ 7, 0,131, 4, 2, 0, 17, 0, 2, 0,198, 2, 39, 1, 3, 0, 0, 0, 18, 0, 4, 0,186, 2, 4, 0,168, 8, 40, 1, 7, 0,
+ 0, 0, 18, 0, 7, 0,131, 4, 0, 0,172, 8, 0, 0,173, 8, 2, 0, 66, 1, 2, 0, 87, 0, 4, 0,174, 8, 41, 1, 4, 0,
+ 0, 0,175, 8, 0, 0,176, 8, 4, 0, 15, 0, 7, 0,202, 2, 42, 1, 3, 0, 24, 0,177, 8, 0, 0,178, 8, 0, 0,179, 8,
+ 43, 1, 18, 0, 43, 1, 0, 0, 43, 1, 1, 0, 2, 0, 15, 0, 2, 0,180, 8, 2, 0, 17, 0, 2, 0,181, 8, 2, 0,182, 8,
+ 2, 0,183, 8, 2, 0, 87, 0, 2, 0, 67, 0, 0, 0, 18, 0, 9, 0, 2, 0, 44, 1,184, 8, 24, 0, 42, 0, 2, 0,105, 5,
+ 2, 0, 80, 8, 2, 0,185, 8, 2, 0, 35, 0, 45, 1, 11, 0, 0, 0, 18, 0, 0, 0, 15, 0, 0, 0,186, 8, 2, 0, 17, 0,
+ 2, 0,198, 2, 2, 0,187, 8, 4, 0,188, 8, 4, 0,189, 8, 4, 0,190, 8, 4, 0,191, 8, 4, 0,192, 8, 46, 1, 1, 0,
+ 0, 0,193, 8, 47, 1, 4, 0, 34, 0,141, 6, 0, 0,140, 7, 4, 0, 66, 1, 4, 0, 17, 0, 44, 1, 18, 0, 44, 1, 0, 0,
+ 44, 1, 1, 0, 44, 1,194, 8, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,195, 8, 2, 0,183, 8, 2, 0,180, 8, 2, 0,196, 8,
+ 2, 0, 67, 0, 2, 0,223, 1, 0, 0, 18, 0, 9, 0, 2, 0, 48, 1,184, 8, 43, 1,197, 8, 2, 0, 13, 0, 2, 0,198, 8,
+ 4, 0,199, 8, 49, 1, 3, 0, 4, 0,212, 2, 4, 0, 35, 0, 24, 0, 42, 0, 50, 1, 12, 0,155, 0,200, 8, 2, 0, 15, 0,
+ 2, 0, 17, 0, 4, 0,127, 8, 4, 0, 86, 0, 0, 0, 18, 0, 0, 0,201, 8, 2, 0,202, 8, 2, 0,203, 8, 2, 0,204, 8,
+ 2, 0,205, 8, 7, 0,206, 8, 51, 1, 8, 0, 7, 0,207, 8, 7, 0,208, 8, 7, 0,209, 8, 7, 0,210, 8, 7, 0,211, 8,
+ 7, 0,212, 8, 7, 0,213, 8, 7, 0,214, 8, 52, 1, 13, 0, 2, 0, 17, 0, 2, 0,216, 6, 4, 0, 87, 0, 4, 0, 67, 0,
+ 2, 0,215, 8, 7, 0,254, 3, 7, 0,216, 8,243, 0,215, 6, 51, 1,217, 8, 2, 0, 15, 0, 2, 0,245, 1, 2, 0,241, 5,
+ 2, 0,218, 8, 53, 1, 11, 0, 4, 0,212, 2, 2, 0, 15, 0, 2, 0, 17, 0, 24, 0, 42, 0, 73, 0,219, 8, 0, 0, 18, 0,
+ 7, 0,220, 8, 7, 0,221, 8, 7, 0,137, 3, 2, 0,222, 8, 2, 0,223, 8, 54, 1, 5, 0, 2, 0, 15, 0, 2, 0, 87, 0,
+ 4, 0, 35, 0, 38, 0,116, 0, 24, 0, 96, 5, 55, 1, 5, 0, 4, 0, 35, 0, 4, 0, 15, 0, 0, 0, 18, 0, 0, 0,166, 8,
+ 24, 0, 42, 0, 56, 1, 13, 0, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0,180, 8, 2, 0,138, 3, 7, 0,224, 8, 7, 0,225, 8,
+ 7, 0,181, 4, 7, 0,150, 3, 7, 0,109, 3, 7, 0,112, 3, 7, 0,226, 8, 7, 0,227, 8, 24, 0,228, 8, 57, 1, 10, 0,
+ 2, 0, 17, 0, 2, 0, 15, 0, 4, 0,127, 8, 4, 0, 86, 0, 0, 0, 18, 0, 0, 0,201, 8, 2, 0, 87, 0, 2, 0, 67, 0,
+ 2, 0,223, 1, 2, 0,245, 1, 58, 1, 8, 0, 24, 0, 42, 0, 7, 0,235, 2, 7, 0,229, 8, 7, 0,230, 8, 7, 0, 35, 0,
+ 2, 0, 87, 0, 2, 0,198, 2, 7, 0, 67, 0, 59, 1, 12, 0, 2, 0, 15, 0, 2, 0, 66, 1, 2, 0, 17, 0, 2, 0,238, 2,
+ 2, 0,212, 2, 2, 0,231, 8, 4, 0, 35, 0, 7, 0,232, 8, 7, 0,233, 8, 7, 0,234, 8, 7, 0,235, 8, 0, 0,236, 8,
+ 60, 1, 9, 0, 2, 0, 17, 0, 2, 0, 15, 0, 4, 0,127, 8, 4, 0, 86, 0, 0, 0, 18, 0, 2, 0,181, 4, 2, 0, 61, 0,
+ 2, 0,237, 8, 2, 0,238, 8, 61, 1, 7, 0, 4, 0,186, 2, 4, 0,239, 8, 4, 0,240, 8, 4, 0,241, 8, 7, 0,242, 8,
+ 7, 0,243, 8, 0, 0,172, 8, 62, 1, 7, 0, 0, 0,244, 8, 24, 0,245, 8, 0, 0,178, 8, 2, 0,246, 8, 2, 0, 87, 0,
+ 4, 0, 67, 0, 0, 0,179, 8, 63, 1, 6, 0, 2, 0, 17, 0, 2, 0, 15, 0, 4, 0,127, 8, 4, 0, 86, 0, 0, 0,247, 8,
+ 0, 0,248, 8, 64, 1, 1, 0, 4, 0, 17, 0, 65, 1, 6, 0, 0, 0, 90, 0, 2, 0, 15, 0, 2, 0, 17, 0, 4, 0,249, 8,
+ 7, 0,250, 8, 34, 0,141, 6, 66, 1, 4, 0, 0, 0,145, 2, 2, 0, 17, 0, 4, 0, 15, 0, 24, 0, 42, 0, 67, 1, 2, 0,
+ 4, 0, 15, 0, 4, 0, 61, 6, 68, 1, 6, 0, 0, 0,175, 8, 0, 0,176, 8, 4, 0, 15, 0, 7, 0, 23, 2, 24, 0, 46, 3,
+ 24, 0,251, 8, 48, 1, 10, 0, 48, 1, 0, 0, 48, 1, 1, 0, 48, 1,194, 8, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,180, 8,
+ 2, 0,252, 8, 0, 0, 18, 0, 9, 0, 2, 0, 24, 0, 42, 0,243, 0, 16, 0, 19, 0, 29, 0, 0, 0, 32, 0, 35, 0,144, 0,
+ 9, 0,217, 0, 35, 0,253, 8, 28, 0, 77, 0, 7, 0,254, 3, 7, 0,254, 8, 7, 0,216, 8, 7, 0,207, 8, 7, 0,208, 8,
+ 7, 0,255, 8, 4, 0, 88, 0, 4, 0, 35, 0, 9, 0, 0, 9, 9, 0, 1, 9, 69, 1, 6, 0, 69, 1, 0, 0, 69, 1, 1, 0,
+ 24, 0, 42, 0, 9, 0, 2, 9, 2, 0,241, 0, 0, 0,183, 2, 58, 0, 4, 0, 19, 0, 29, 0, 12, 0, 3, 9, 4, 0,125, 0,
+ 7, 0, 4, 9, 70, 1, 27, 0, 70, 1, 0, 0, 70, 1, 1, 0, 18, 0, 5, 9, 70, 1, 36, 0, 12, 0, 6, 9, 0, 0, 18, 0,
+ 7, 0, 7, 9, 7, 0, 8, 9, 7, 0, 9, 9, 7, 0, 10, 9, 4, 0, 17, 0, 7, 0, 11, 9, 7, 0, 12, 9, 7, 0, 13, 9,
+ 7, 0, 73, 1, 7, 0, 23, 2, 7, 0, 14, 9, 7, 0,184, 2, 7, 0, 15, 9, 7, 0, 16, 9, 7, 0, 17, 9, 7, 0, 18, 9,
+ 7, 0, 19, 9, 7, 0,166, 0, 4, 0,125, 0, 2, 0,142, 5, 2, 0,181, 4, 71, 1, 25, 0, 19, 0, 29, 0, 31, 0, 72, 0,
+ 12, 0, 20, 9, 12, 0, 21, 9, 12, 0, 22, 9, 70, 1, 23, 9, 9, 0, 24, 9, 9, 0, 25, 9, 4, 0, 17, 0, 4, 0, 35, 6,
+ 2, 0,242, 2, 2, 0, 90, 6, 4, 0, 26, 9, 4, 0,125, 0, 4, 0, 27, 9, 2, 0, 28, 9, 2, 0, 29, 9, 2, 0, 30, 9,
+ 2, 0, 31, 9, 4, 0, 32, 9, 4, 0, 33, 9, 4, 0, 34, 9, 4, 0, 35, 9, 4, 0, 36, 9, 4, 0, 37, 9, 72, 1, 2, 0,
+ 7, 0,143, 2, 4, 0, 17, 0,159, 0, 5, 0, 72, 1, 38, 9, 4, 0,184, 2, 4, 0, 39, 9, 4, 0, 40, 9, 4, 0, 17, 0,
+158, 0, 16, 0, 4, 0, 41, 9, 4, 0, 42, 9, 4, 0, 43, 9, 4, 0, 44, 9, 2, 0, 45, 9, 2, 0, 46, 9, 2, 0, 47, 9,
+ 2, 0,241, 0, 2, 0, 48, 9, 2, 0, 49, 9, 2, 0, 50, 9, 2, 0, 51, 9, 4, 0, 52, 9, 4, 0, 53, 9, 4, 0, 54, 9,
+ 4, 0, 55, 9, 73, 1, 41, 0, 73, 1, 0, 0, 73, 1, 1, 0, 18, 0, 5, 9, 12, 0,164, 3, 0, 0, 18, 0, 2, 0, 17, 0,
+ 2, 0, 56, 9, 2, 0, 57, 9, 2, 0, 58, 9, 2, 0,123, 3, 2, 0, 59, 9, 4, 0, 63, 2, 4, 0, 34, 9, 4, 0, 35, 9,
+ 70, 1, 60, 9, 73, 1, 36, 0, 73, 1, 61, 9, 12, 0, 62, 9,159, 0,102, 3, 24, 0, 63, 9, 73, 1, 64, 9, 7, 0, 61, 1,
+ 7, 0,166, 0, 7, 0, 65, 9, 7, 0, 2, 2, 7, 0,114, 3, 7, 0,116, 3, 2, 0,146, 3, 2, 0, 35, 0, 7, 0, 66, 9,
+ 7, 0, 67, 9, 7, 0,119, 3, 7, 0, 68, 9, 7, 0, 69, 9, 7, 0, 70, 9, 7, 0, 71, 9, 7, 0, 72, 9, 7, 0, 73, 9,
+ 7, 0, 74, 9, 7, 0, 75, 9, 7, 0, 56, 2,156, 0, 14, 0, 12, 0, 76, 9, 68, 0, 77, 9, 2, 0, 17, 0, 2, 0, 78, 9,
+ 7, 0, 92, 2, 7, 0, 79, 9, 7, 0, 80, 9, 12, 0, 81, 9, 4, 0, 82, 9, 4, 0, 83, 9, 9, 0, 84, 9, 9, 0, 85, 9,
+158, 0,101, 3, 0, 0, 86, 9, 74, 1, 1, 0, 4, 0, 83, 9, 75, 1, 12, 0, 4, 0, 83, 9, 7, 0,192, 8, 2, 0, 87, 9,
+ 2, 0, 88, 9, 7, 0, 89, 9, 7, 0, 90, 9, 2, 0, 91, 9, 2, 0, 17, 0, 7, 0, 92, 9, 7, 0, 93, 9, 7, 0, 94, 9,
+ 7, 0, 95, 9, 76, 1, 7, 0, 76, 1, 0, 0, 76, 1, 1, 0, 12, 0, 96, 9, 4, 0, 17, 0, 4, 0, 97, 9, 0, 0,244, 3,
+251, 0, 98, 9,155, 0, 7, 0, 19, 0, 29, 0, 12, 0, 99, 9, 12, 0, 76, 9, 12, 0,100, 9, 12, 0, 98, 0, 4, 0, 17, 0,
+ 4, 0,101, 9,215, 0, 5, 0, 19, 0,102, 9, 12, 0, 76, 9, 58, 0,103, 9, 4, 0,104, 9, 4, 0, 17, 0, 77, 1, 13, 0,
+211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,212, 0, 80, 6,155, 0, 97, 3,
+215, 0,105, 9, 0, 0, 66, 1, 0, 0, 83, 6, 2, 0, 17, 0, 7, 0,106, 9, 78, 1, 8, 0, 78, 1, 0, 0, 78, 1, 1, 0,
+ 76, 1,107, 9, 28, 0, 77, 0, 12, 0,103, 3, 4, 0, 17, 0, 0, 0, 18, 0, 4, 0,231, 7, 79, 1, 5, 0, 79, 1, 0, 0,
+ 79, 1, 1, 0, 28, 0, 77, 0, 2, 0, 17, 0, 0, 0,108, 9, 80, 1, 14, 0, 80, 1, 0, 0, 80, 1, 1, 0, 9, 0, 2, 0,
+ 2, 0, 15, 0, 2, 0, 17, 0, 0, 0,109, 9, 0, 0,110, 9, 0, 0,108, 9, 7, 0,111, 9, 7, 0,112, 9, 4, 0, 35, 0,
+ 28, 0, 77, 0, 7, 0,113, 9, 7, 0,114, 9, 81, 1, 9, 0, 81, 1, 0, 0, 81, 1, 1, 0, 24, 0,115, 9, 0, 0,245, 2,
+ 7, 0,116, 9, 2, 0,117, 9, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0,118, 9, 82, 1, 7, 0, 34, 0,141, 6, 18, 0, 5, 9,
+ 4, 0, 17, 0, 4, 0,119, 9, 12, 0,120, 9, 24, 0,115, 9, 0, 0,245, 2, 83, 1, 15, 0, 24, 0,115, 9, 2, 0,121, 9,
+ 2, 0, 17, 0, 2, 0,122, 9, 2, 0,123, 9, 0, 0,245, 2, 24, 0,124, 9, 0, 0,125, 9, 7, 0,126, 9, 7, 0, 23, 2,
+ 7, 0,127, 9, 7, 0,128, 9, 2, 0, 15, 0, 2, 0, 66, 1, 7, 0, 73, 1, 84, 1, 6, 0, 24, 0,115, 9, 7, 0, 38, 9,
+ 2, 0,129, 9, 2, 0,130, 9, 2, 0, 17, 0, 2, 0,131, 9, 85, 1, 6, 0, 24, 0,115, 9, 4, 0,132, 9, 4, 0,133, 9,
+ 4, 0, 88, 0, 4, 0, 35, 0, 0, 0,245, 2, 86, 1, 4, 0, 24, 0,115, 9, 4, 0, 17, 0, 4, 0,132, 9, 0, 0,245, 2,
+ 87, 1, 4, 0, 24, 0,115, 9, 4, 0, 17, 0, 4, 0,132, 9, 0, 0,245, 2, 88, 1, 4, 0, 24, 0,115, 9, 4, 0, 17, 0,
+ 4, 0,132, 9, 0, 0,245, 2, 89, 1, 2, 0, 4, 0, 17, 0, 7, 0,254, 3, 90, 1, 2, 0, 24, 0,115, 9, 0, 0,245, 2,
+ 91, 1, 10, 0, 24, 0,115, 9, 4, 0,134, 9, 7, 0,119, 0, 4, 0, 17, 0, 2, 0,139, 6, 2, 0,135, 9, 2, 0, 87, 0,
+ 2, 0, 67, 0, 7, 0,136, 9, 0, 0,245, 2, 92, 1, 10, 0, 24, 0,115, 9, 2, 0, 15, 0, 2, 0, 48, 4, 4, 0, 85, 0,
+ 4, 0, 86, 0, 7, 0,229, 8, 7, 0,230, 8, 4, 0, 35, 0,155, 0,200, 8, 0, 0,245, 2, 93, 1, 4, 0, 24, 0,115, 9,
+ 4, 0,124, 3, 4, 0,137, 9, 0, 0,245, 2, 94, 1, 4, 0, 24, 0,115, 9, 4, 0,124, 3, 4, 0, 35, 0, 0, 0,245, 2,
+ 95, 1, 6, 0, 24, 0,115, 9, 7, 0,119, 0, 7, 0, 58, 3, 4, 0,138, 9, 2, 0,124, 3, 2, 0,125, 3, 96, 1, 6, 0,
+ 24, 0,115, 9, 4, 0,139, 9, 4, 0,140, 9, 7, 0,141, 9, 7, 0,142, 9, 0, 0,245, 2, 97, 1, 16, 0, 24, 0,115, 9,
+ 24, 0, 61, 9, 4, 0, 15, 0, 7, 0,143, 9, 7, 0,144, 9, 7, 0,145, 9, 7, 0,146, 9, 7, 0,147, 9, 7, 0,148, 9,
+ 7, 0,149, 9, 7, 0,150, 9, 7, 0,151, 9, 2, 0, 17, 0, 2, 0, 35, 0, 2, 0, 87, 0, 2, 0, 67, 0, 98, 1, 3, 0,
+ 24, 0,115, 9, 4, 0, 17, 0, 4, 0, 15, 2, 99, 1, 5, 0, 24, 0,115, 9, 4, 0, 17, 0, 4, 0, 35, 0, 7, 0,152, 9,
+ 0, 0,245, 2,100, 1, 10, 0, 24, 0,115, 9, 0, 0,245, 2, 2, 0,153, 9, 2, 0,154, 9, 0, 0,155, 9, 0, 0,156, 9,
+ 7, 0,157, 9, 7, 0,158, 9, 7, 0,159, 9, 7, 0,160, 9,101, 1, 5, 0, 24, 0,115, 9, 0, 0,245, 2, 7, 0,192, 2,
+ 2, 0,161, 9, 2, 0, 17, 0,102, 1, 8, 0, 7, 0, 7, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0,162, 9,
+ 7, 0,163, 9, 2, 0, 17, 0, 2, 0, 15, 2,103, 1, 8, 0, 7, 0, 7, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0,
+ 7, 0,162, 9, 7, 0,163, 9, 2, 0, 17, 0, 2, 0, 15, 2,104, 1, 8, 0, 7, 0, 7, 0, 7, 0, 8, 0, 7, 0, 9, 0,
+ 7, 0, 10, 0, 7, 0,162, 9, 7, 0,163, 9, 2, 0, 17, 0, 2, 0, 15, 2,105, 1, 7, 0, 24, 0,115, 9, 0, 0,245, 2,
+ 7, 0, 73, 1, 7, 0, 82, 1, 2, 0, 17, 0, 2, 0, 66, 1, 4, 0, 35, 0,106, 1, 5, 0, 24, 0, 46, 3, 7, 0, 73, 1,
+ 2, 0, 50, 3, 0, 0, 52, 3, 0, 0,164, 9,107, 1, 10, 0,107, 1, 0, 0,107, 1, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0,
+ 0, 0,165, 9, 7, 0, 16, 1, 7, 0, 17, 1, 2, 0, 96, 9, 2, 0,166, 9, 24, 0, 42, 0,108, 1, 22, 0,108, 1, 0, 0,
+108, 1, 1, 0, 2, 0, 17, 0, 2, 0, 66, 1, 2, 0,167, 9, 2, 0,168, 9, 28, 0, 77, 0,155, 0,200, 8, 24, 0,158, 0,
+ 7, 0, 85, 0, 7, 0, 86, 0, 7, 0,169, 9, 7, 0,170, 9, 7, 0,171, 9, 7, 0,172, 9, 7, 0,231, 2, 7, 0,173, 9,
+ 7, 0,202, 8, 7, 0,174, 9, 0, 0,175, 9, 0, 0,176, 9, 12, 0,105, 3,109, 1, 8, 0, 7, 0, 30, 2, 7, 0,229, 8,
+ 7, 0,230, 8, 9, 0, 2, 0, 2, 0,177, 9, 2, 0,178, 9, 2, 0,179, 9, 2, 0,180, 9,110, 1, 18, 0,110, 1, 0, 0,
+110, 1, 1, 0,110, 1,181, 9, 0, 0, 18, 0,109, 1,182, 9, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,183, 9, 2, 0,184, 9,
+ 2, 0,185, 9, 2, 0,186, 9, 4, 0, 87, 0, 7, 0,187, 9, 7, 0,188, 9, 4, 0,189, 9, 4, 0,190, 9,110, 1,191, 9,
+111, 1,192, 9,112, 1, 33, 0,112, 1, 0, 0,112, 1, 1, 0,112, 1,193, 9, 0, 0, 18, 0, 2, 0, 15, 0, 2, 0, 17, 0,
+ 2, 0, 52, 8, 2, 0, 80, 8, 2, 0,194, 9, 2, 0,144, 6, 2, 0,184, 9, 2, 0,154, 8, 12, 0,195, 8, 12, 0,195, 9,
+ 19, 0,177, 6, 9, 0,196, 9, 7, 0,187, 9, 7, 0,188, 9, 7, 0, 65, 2, 7, 0,197, 9, 2, 0,198, 9, 2, 0,199, 9,
+ 7, 0,200, 9, 7, 0,201, 9, 2, 0,202, 9, 2, 0,203, 9, 9, 0,204, 9, 16, 0,205, 9, 16, 0,206, 9, 16, 0,207, 9,
+113, 1,145, 0,114, 1,208, 9,115, 1,209, 9,111, 1, 8, 0,111, 1, 0, 0,111, 1, 1, 0,112, 1,210, 9,112, 1,211, 9,
+110, 1,212, 9,110, 1,191, 9, 4, 0, 17, 0, 4, 0, 35, 0, 52, 0, 22, 0, 19, 0, 29, 0, 31, 0, 72, 0,157, 0,100, 3,
+ 12, 0,213, 9, 12, 0,214, 9,109, 1,215, 9, 12, 0,216, 9, 4, 0, 15, 0, 4, 0,217, 9, 4, 0,218, 9, 4, 0,219, 9,
+ 4, 0, 17, 0, 4, 0, 35, 0, 12, 0,220, 9,115, 1,221, 9, 4, 0,222, 9, 9, 0,223, 9, 9, 0,224, 9, 4, 0,225, 9,
+ 9, 0,226, 9, 9, 0,227, 9, 9, 0,228, 9,116, 1, 6, 0, 4, 0,118, 0, 4, 0,120, 0, 4, 0,154, 8, 0, 0,229, 9,
+ 0, 0,230, 9, 2, 0, 35, 0,117, 1, 16, 0, 2, 0,254, 7, 2, 0,255, 7, 2, 0,231, 9, 2, 0,232, 9, 2, 0,233, 9,
+ 2, 0, 65, 0, 7, 0,230, 2, 7, 0,234, 9, 7, 0,235, 9, 2, 0, 88, 1, 0, 0,236, 9, 0, 0,237, 9, 2, 0,238, 9,
+ 2, 0, 35, 0, 4, 0,239, 9, 4, 0,240, 9,118, 1, 9, 0, 7, 0,241, 9, 7, 0,242, 9, 7, 0,255, 8, 7, 0, 67, 3,
+ 7, 0,243, 9, 7, 0, 96, 6, 2, 0, 65, 3, 0, 0,244, 9, 0, 0, 35, 0,119, 1, 4, 0, 7, 0,245, 9, 7, 0,246, 9,
+ 2, 0, 65, 3, 2, 0, 35, 0,120, 1, 3, 0, 7, 0,247, 9, 7, 0, 67, 8, 7, 0, 13, 0,121, 1, 7, 0, 0, 0,247, 1,
+ 2, 0, 13, 5, 2, 0, 14, 5, 2, 0, 15, 5, 2, 0,203, 4, 4, 0,120, 0, 4, 0, 46, 4,122, 1, 9, 0, 7, 0,248, 9,
+ 7, 0,249, 9, 7, 0,250, 9, 7, 0, 76, 2, 7, 0,251, 9, 7, 0,252, 9, 7, 0,253, 9, 2, 0,254, 9, 2, 0,255, 9,
+123, 1, 8, 0, 2, 0, 0, 10, 2, 0, 1, 10, 2, 0, 2, 10, 2, 0, 3, 10, 7, 0, 4, 10, 7, 0, 5, 10, 7, 0, 6, 10,
+ 7, 0, 7, 10,124, 1, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0,125, 1, 2, 0, 0, 0,160, 0, 0, 0, 8, 10,126, 1, 1, 0,
+ 0, 0, 18, 0,127, 1, 10, 0, 0, 0, 9, 10, 0, 0, 10, 10, 0, 0, 89, 6, 0, 0, 11, 10, 2, 0,231, 9, 2, 0, 12, 10,
+ 7, 0, 13, 10, 7, 0, 14, 10, 7, 0, 15, 10, 7, 0,173, 9,128, 1, 2, 0, 9, 0, 16, 10, 9, 0, 17, 10,129, 1, 11, 0,
+ 0, 0, 15, 5, 0, 0, 15, 0, 0, 0, 65, 3, 0, 0, 67, 3, 0, 0, 18, 10, 0, 0,104, 0, 0, 0,145, 2, 7, 0, 19, 10,
+ 7, 0, 20, 10, 7, 0, 21, 10, 7, 0, 22, 10,130, 1, 8, 0, 7, 0,161, 8, 7, 0,119, 0, 7, 0,237, 9, 7, 0,149, 2,
+ 7, 0, 23, 10, 7, 0,230, 0, 7, 0, 24, 10, 4, 0, 15, 0,131, 1, 4, 0, 2, 0, 25, 10, 2, 0, 26, 10, 2, 0, 27, 10,
+ 2, 0, 35, 0,132, 1, 8, 0, 7, 0, 28, 10, 7, 0,192, 2, 7, 0, 29, 10, 7, 0, 48, 8, 7, 0, 49, 8, 7, 0, 50, 8,
+ 7, 0, 30, 10, 7, 0, 31, 10,133, 1, 6, 0, 2, 0, 32, 10, 2, 0, 33, 10, 7, 0, 34, 10, 7, 0, 35, 10, 7, 0, 36, 10,
+ 7, 0, 37, 10,134, 1, 1, 0, 0, 0, 18, 0,135, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 2, 0, 17, 0, 2, 0, 38, 10,
+136, 1, 10, 0, 2, 0,232, 3, 2, 0, 17, 0, 7, 0,131, 4, 7, 0, 39, 10, 7, 0, 40, 10, 7, 0, 41, 10, 7, 0, 42, 10,
+135, 1, 43, 10,135, 1, 44, 10,135, 1, 45, 10, 55, 0, 11, 0, 4, 0, 17, 0, 4, 0, 61, 0, 4, 0, 46, 10, 4, 0, 47, 10,
+ 16, 0, 48, 10, 16, 0, 49, 10,136, 1, 50, 10, 7, 0, 51, 10, 7, 0, 52, 10, 7, 0, 53, 10, 7, 0, 54, 10,228, 0, 10, 0,
+ 4, 0, 96, 9, 4, 0, 55, 10, 7, 0, 56, 10, 7, 0, 57, 10, 7, 0, 58, 10, 7, 0, 59, 10, 7, 0, 8, 0, 7, 0, 10, 0,
+ 4, 0, 66, 1, 4, 0,235, 2,227, 0, 18, 0, 4, 0,123, 0, 4, 0, 60, 10, 4, 0, 61, 10, 7, 0, 62, 10, 4, 0, 63, 10,
+ 7, 0, 64, 10, 7, 0, 65, 10, 4, 0, 66, 10, 7, 0, 67, 10, 4, 0, 68, 10, 7, 0, 69, 10,228, 0, 70, 10, 7, 0, 71, 10,
+ 7, 0, 72, 10, 7, 0, 73, 10, 7, 0, 74, 10, 4, 0, 75, 10, 4, 0, 35, 0,137, 1, 4, 0, 39, 0,222, 2, 7, 0, 76, 10,
+ 7, 0,155, 1, 7, 0, 35, 0,189, 0, 35, 0, 19, 0, 29, 0,137, 1, 77, 10, 55, 0, 43, 10, 43, 0, 78, 10, 49, 0, 79, 10,
+ 22, 0,145, 0, 0, 0, 80, 10, 4, 0, 81, 10, 4, 0, 35, 0, 7, 0, 82, 10, 2, 0,247, 5, 2, 0, 83, 10, 4, 0,104, 0,
+ 4, 0, 17, 0, 7, 0, 84, 10, 4, 0, 73, 2, 4, 0, 85, 10, 7, 0, 86, 10, 7, 0, 87, 10, 7, 0, 88, 10, 7, 0,155, 1,
+ 4, 0, 89, 10, 7, 0, 90, 10, 0, 0, 91, 10, 0, 0, 92, 10, 0, 0, 93, 10, 0, 0,223, 1, 7, 0, 94, 10, 7, 0, 95, 10,
+ 7, 0, 96, 10, 7, 0, 97, 10, 4, 0, 98, 10, 7, 0, 99, 10, 7, 0,100, 10, 7, 0,101, 10,138, 1, 10, 0, 4, 0, 15, 0,
+ 4, 0,119, 0, 4, 0, 17, 0, 4, 0,185, 3, 4, 0,102, 10, 4, 0,103, 10, 4, 0,104, 10, 0, 0, 90, 0, 0, 0, 18, 0,
+ 9, 0, 2, 0,139, 1, 1, 0, 0, 0, 40, 8, 84, 0, 7, 0,138, 1,105, 10, 4, 0,106, 10, 4, 0,107, 10, 4, 0,108, 10,
+ 4, 0, 35, 0, 9, 0,109, 10,139, 1,110, 10,140, 1, 5, 0, 7, 0,143, 2, 7, 0,212, 2, 7, 0, 23, 2, 2, 0,119, 2,
+ 2, 0, 35, 0,141, 1, 5, 0, 7, 0,143, 2, 7, 0,111, 10, 7, 0,112, 10, 7, 0,113, 10, 7, 0,212, 2,142, 1, 5, 0,
+ 24, 0,114, 10,143, 1, 20, 0, 7, 0,215, 5, 7, 0,115, 10, 7, 0, 54, 0,144, 1, 3, 0, 7, 0,116, 10, 4, 0,117, 10,
+ 4, 0,118, 10,145, 1, 7, 0, 4, 0,119, 10, 4, 0,120, 10, 4, 0,121, 10, 7, 0,122, 10, 7, 0,123, 10, 7, 0,124, 10,
+ 7, 0, 54, 0,146, 1, 8, 0,146, 1, 0, 0,146, 1, 1, 0, 24, 0, 42, 0, 4, 0,249, 0, 2, 0, 17, 0, 2, 0, 66, 1,
+ 7, 0,212, 2, 7, 0,169, 8,147, 1, 6, 0,147, 1, 0, 0,147, 1, 1, 0, 24, 0, 42, 0, 2, 0,197, 2, 2, 0, 17, 0,
+ 2, 0,125, 10,148, 1, 17, 0,141, 1,179, 3,141, 1,126, 10,140, 1,127, 10,141, 1,152, 8,142, 1,128, 10, 4, 0, 79, 0,
+ 7, 0,212, 2, 7, 0,241, 2, 7, 0,129, 10, 4, 0,119, 10, 4, 0,130, 10, 7, 0,123, 10, 7, 0,124, 10, 7, 0,104, 0,
+ 4, 0,131, 10, 2, 0, 17, 0, 2, 0,132, 10,149, 1, 13, 0, 7, 0,133, 10, 7, 0,245, 0, 7, 0,116, 10, 7, 0,134, 10,
+ 7, 0,135, 10, 7, 0,136, 10, 7, 0,137, 10, 7, 0,138, 10, 7, 0,139, 10, 7, 0,140, 10, 7, 0,141, 10, 4, 0, 17, 0,
+ 4, 0, 35, 0,150, 1,115, 0, 19, 0, 29, 0, 31, 0, 72, 0,151, 1,142, 10,149, 1,143, 10,166, 0, 68, 4, 4, 0, 17, 0,
+ 2, 0, 15, 0, 2, 0,153, 9, 2, 0,144, 10, 2, 0,145, 10, 2, 0,146, 3, 2, 0,146, 10, 2, 0,147, 10, 2, 0,148, 10,
+ 2, 0,149, 10, 2, 0,150, 10, 2, 0,151, 10, 2, 0,152, 10, 2, 0,153, 10, 2, 0,113, 5, 2, 0,154, 10, 2, 0,155, 10,
+ 2, 0,156, 10, 2, 0,157, 10, 2, 0,158, 10, 2, 0, 12, 2, 2, 0,145, 8, 2, 0,120, 8, 2, 0,159, 10, 2, 0,160, 10,
+ 2, 0,195, 3, 2, 0,196, 3, 2, 0,161, 10, 2, 0,162, 10, 2, 0,163, 10, 2, 0,164, 10, 7, 0,165, 10, 7, 0,166, 10,
+ 7, 0,167, 10, 2, 0, 63, 5, 2, 0,168, 10, 7, 0,169, 10, 7, 0,170, 10, 7, 0,171, 10, 7, 0,127, 8, 7, 0, 86, 0,
+ 7, 0,241, 2, 7, 0,133, 8, 7, 0,172, 10, 7, 0,173, 10, 7, 0,174, 10, 4, 0,128, 8, 4, 0,126, 8, 4, 0,175, 10,
+ 7, 0,129, 8, 7, 0,130, 8, 7, 0,131, 8, 7, 0,176, 10, 7, 0,177, 10, 7, 0,178, 10, 7, 0,179, 10, 7, 0,180, 10,
+ 7, 0,181, 10, 7, 0,182, 10, 7, 0,183, 10, 7, 0,184, 10, 7, 0,137, 3, 7, 0,104, 0, 7, 0,185, 10, 7, 0,186, 10,
+ 7, 0,187, 10, 7, 0,188, 10, 7, 0,189, 10, 7, 0,190, 10, 7, 0,191, 10, 4, 0,192, 10, 4, 0,193, 10, 7, 0,194, 10,
+ 7, 0,195, 10, 7, 0,196, 10, 7, 0,197, 10, 7, 0,198, 10, 7, 0,204, 0, 7, 0,199, 10, 7, 0,222, 3, 7, 0,220, 3,
+ 7, 0,221, 3, 7, 0,200, 10, 7, 0,201, 10, 7, 0,202, 10, 7, 0,203, 10, 7, 0,204, 10, 7, 0,205, 10, 7, 0,206, 10,
+ 7, 0,207, 10, 7, 0,208, 10, 7, 0,209, 10, 7, 0,210, 10, 7, 0,211, 10, 7, 0,212, 10, 7, 0,213, 10, 7, 0,214, 10,
+ 7, 0,215, 10, 7, 0,216, 10, 7, 0,217, 10, 4, 0,218, 10, 4, 0,219, 10, 58, 0,169, 3, 12, 0,220, 10, 58, 0,221, 10,
+ 24, 0,222, 10, 24, 0,223, 10, 28, 0, 77, 0,161, 0, 58, 1,161, 0,224, 10,140, 0, 47, 0,140, 0, 0, 0,140, 0, 1, 0,
+150, 1,225, 10,148, 1,226, 10,145, 1, 61, 9,169, 0,250, 3, 9, 0,251, 3,152, 1,227, 10,152, 1,228, 10, 12, 0,229, 10,
+ 12, 0,230, 10,125, 0,231, 10,133, 0,232, 10,133, 0,233, 10, 24, 0,234, 10, 24, 0,235, 10, 24, 0, 36, 0, 12, 0,120, 9,
+ 0, 0, 18, 0, 7, 0,234, 0, 7, 0, 12, 3, 7, 0,236, 10, 4, 0,186, 2, 4, 0,237, 10, 4, 0, 17, 0, 4, 0,128, 8,
+ 4, 0,238, 10, 4, 0,239, 10, 4, 0,240, 10, 2, 0,241, 0, 2, 0,241, 10, 2, 0,242, 10, 2, 0,243, 10, 0, 0,244, 10,
+ 2, 0,245, 10, 2, 0,246, 10, 2, 0,247, 10, 9, 0,248, 10,129, 0, 67, 4, 12, 0,255, 2, 12, 0,249, 10,144, 1,250, 10,
+ 4, 0,251, 10, 4, 0,252, 10,153, 1,253, 10,154, 1,254, 10, 7, 0,255, 10,127, 0, 37, 0,155, 1, 0, 9, 7, 0, 37, 4,
+ 7, 0, 0, 11, 7, 0, 1, 11, 7, 0,215, 5, 7, 0,147, 3, 7, 0,137, 3, 7, 0, 2, 11, 7, 0, 75, 2, 7, 0, 3, 11,
+ 7, 0, 4, 11, 7, 0, 5, 11, 7, 0, 6, 11, 7, 0, 7, 11, 7, 0, 8, 11, 7, 0, 38, 4, 7, 0, 9, 11, 7, 0, 10, 11,
+ 7, 0, 11, 11, 7, 0, 39, 4, 7, 0, 35, 4, 7, 0, 36, 4, 7, 0, 12, 11, 7, 0, 13, 11, 4, 0, 14, 11, 4, 0, 88, 0,
+ 4, 0, 15, 11, 4, 0, 16, 11, 2, 0, 17, 11, 2, 0, 18, 11, 2, 0, 19, 11, 2, 0, 20, 11, 2, 0, 21, 11, 2, 0, 22, 11,
+ 2, 0, 23, 11, 2, 0,181, 4,166, 0, 68, 4,128, 0, 9, 0,155, 1, 24, 11, 7, 0, 25, 11, 7, 0, 26, 11, 7, 0,227, 1,
+ 7, 0, 27, 11, 4, 0, 88, 0, 2, 0, 28, 11, 2, 0, 29, 11, 58, 0,226, 1,156, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0,
+ 7, 0, 1, 2, 7, 0, 30, 11,157, 1, 6, 0,157, 1, 0, 0,157, 1, 1, 0,156, 1, 38, 9, 4, 0,247, 0, 2, 0, 31, 11,
+ 2, 0, 17, 0,158, 1, 5, 0,158, 1, 0, 0,158, 1, 1, 0, 12, 0, 32, 11, 4, 0, 33, 11, 4, 0, 17, 0,159, 1, 9, 0,
+159, 1, 0, 0,159, 1, 1, 0, 12, 0,118, 0,158, 1, 34, 11, 4, 0, 17, 0, 2, 0, 31, 11, 2, 0, 35, 11, 7, 0, 89, 0,
+ 0, 0, 36, 11,157, 0, 6, 0, 19, 0, 29, 0, 12, 0, 31, 5, 4, 0, 17, 0, 2, 0, 37, 11, 2, 0, 38, 11, 9, 0, 39, 11,
+160, 1, 6, 0, 12, 0, 40, 11, 4, 0, 41, 11, 4, 0, 42, 11, 4, 0, 17, 0, 4, 0, 35, 0,209, 0, 43, 11,161, 1, 17, 0,
+ 19, 0, 29, 0,162, 1, 44, 11,162, 1, 45, 11, 12, 0, 46, 11, 4, 0, 47, 11, 2, 0, 48, 11, 2, 0, 49, 11, 12, 0, 50, 11,
+ 12, 0, 51, 11,160, 1, 52, 11, 12, 0, 53, 11, 12, 0, 54, 11, 12, 0, 55, 11, 12, 0, 56, 11,163, 1, 57, 11, 12, 0, 58, 11,
+209, 0, 59, 11,162, 1, 31, 0,162, 1, 0, 0,162, 1, 1, 0, 9, 0, 60, 11, 4, 0,232, 7, 2, 0, 61, 11, 2, 0, 35, 0,
+ 0, 1, 62, 11, 0, 1, 63, 11, 0, 0, 64, 11, 2, 0, 65, 11, 2, 0, 66, 11, 2, 0,254, 7, 2, 0,255, 7, 2, 0, 67, 11,
+ 2, 0, 68, 11, 2, 0,185, 3, 2, 0,206, 6, 2, 0, 69, 11, 2, 0, 70, 11, 2, 0,222, 9,164, 1, 71, 11,165, 1, 72, 11,
+166, 1, 73, 11, 4, 0, 74, 11, 4, 0, 75, 11, 9, 0, 76, 11, 12, 0, 51, 11, 12, 0, 18, 8, 12, 0, 77, 11, 12, 0, 78, 11,
+ 12, 0, 79, 11,167, 1, 17, 0,167, 1, 0, 0,167, 1, 1, 0, 0, 0, 80, 11, 18, 0, 28, 0, 2, 0, 81, 11, 2, 0, 15, 0,
+ 2, 0, 13, 0, 2, 0, 82, 11, 2, 0, 83, 11, 2, 0, 84, 11, 2, 0, 85, 11, 2, 0, 86, 11, 2, 0, 17, 0, 2, 0, 87, 11,
+ 2, 0, 29, 0, 2, 0, 35, 0,168, 1, 88, 11,169, 1, 10, 0,169, 1, 0, 0,169, 1, 1, 0, 12, 0, 89, 11, 0, 0, 80, 11,
+ 2, 0, 90, 11, 2, 0, 91, 11, 2, 0, 17, 0, 2, 0, 92, 11, 4, 0, 93, 11, 9, 0, 94, 11,163, 1, 7, 0,163, 1, 0, 0,
+163, 1, 1, 0, 0, 0, 80, 11, 0, 0, 95, 11, 12, 0,178, 7, 4, 0, 96, 11, 4, 0, 17, 0,221, 0, 14, 0,221, 0, 0, 0,
+221, 0, 1, 0, 0, 0, 80, 11, 18, 0, 28, 0,170, 1,248, 7, 9, 0, 97, 11, 9, 0, 98, 11,168, 1, 88, 11,160, 1, 99, 11,
+ 12, 0,100, 11,221, 0,101, 11, 5, 1,117, 6, 2, 0, 17, 0, 2, 0,181, 4,171, 1, 8, 0,171, 1, 0, 0,171, 1, 1, 0,
+ 9, 0, 2, 0, 9, 0,102, 11, 0, 0,244, 3, 2, 0, 15, 0, 2, 0, 17, 0, 7, 0,103, 11,172, 1, 5, 0, 7, 0,104, 11,
+ 4, 0,105, 11, 4, 0,106, 11, 4, 0, 66, 1, 4, 0, 17, 0,173, 1, 6, 0, 7, 0,107, 11, 7, 0,108, 11, 7, 0,109, 11,
+ 7, 0,110, 11, 4, 0, 15, 0, 4, 0, 17, 0,174, 1, 5, 0, 7, 0,229, 8, 7, 0,230, 8, 7, 0,212, 2, 2, 0, 26, 2,
+ 2, 0, 27, 2,175, 1, 5, 0,174, 1, 2, 0, 4, 0, 51, 0, 7, 0,111, 11, 7, 0,229, 8, 7, 0,230, 8,176, 1, 4, 0,
+ 2, 0,112, 11, 2, 0,113, 11, 2, 0,114, 11, 2, 0,115, 11,177, 1, 2, 0, 34, 0,171, 6, 18, 0, 5, 9,178, 1, 3, 0,
+ 16, 0,116, 11, 4, 0, 17, 0, 4, 0, 35, 0,179, 1, 6, 0, 7, 0,104, 0, 7, 0,214, 2, 7, 0,117, 11, 7, 0, 35, 0,
+ 2, 0,240, 0, 2, 0,118, 11,180, 1, 5, 0, 7, 0,119, 11, 7, 0,119, 0, 7, 0, 39, 9, 7, 0, 40, 9, 4, 0, 17, 0,
+181, 1, 6, 0, 19, 0,177, 6, 0, 0,120, 11, 0, 0,121, 11, 2, 0,122, 11, 2, 0, 17, 0, 4, 0,123, 11,182, 1, 7, 0,
+182, 1, 0, 0,182, 1, 1, 0, 0, 0,244, 3,181, 1,124, 11, 2, 0,125, 11, 2, 0, 15, 0, 7, 0, 58, 0,183, 1, 7, 0,
+ 12, 0,126, 11, 0, 0,127, 11, 9, 0,128, 11, 7, 0, 58, 0, 7, 0,103, 11, 4, 0, 15, 0, 4, 0, 17, 0,184, 1, 3, 0,
+ 7, 0,129, 11, 4, 0, 17, 0, 4, 0, 35, 0,185, 1, 15, 0,185, 1, 0, 0,185, 1, 1, 0, 76, 1,107, 9,183, 1, 59, 0,
+ 12, 0,105, 3, 27, 0, 47, 0,184, 1,130, 11, 4, 0, 51, 0, 7, 0, 58, 0, 2, 0, 17, 0, 2, 0, 9, 1, 4, 0,131, 11,
+ 0, 0,120, 11, 4, 0,132, 11, 7, 0,133, 11,186, 1, 2, 0, 0, 0,134, 11, 0, 0,135, 11,187, 1, 4, 0,187, 1, 0, 0,
+187, 1, 1, 0,155, 0, 46, 3, 12, 0,136, 11,188, 1, 24, 0,188, 1, 0, 0,188, 1, 1, 0, 12, 0,137, 11,155, 0,200, 8,
+187, 1,138, 11, 12, 0,139, 11, 12, 0,105, 3, 0, 0,244, 3, 7, 0,103, 11, 7, 0,140, 11, 7, 0, 85, 0, 7, 0, 86, 0,
+ 7, 0,169, 9, 7, 0,170, 9, 7, 0,231, 2, 7, 0,173, 9, 7, 0,202, 8, 7, 0,174, 9, 2, 0,141, 11, 2, 0,142, 11,
+ 2, 0, 87, 0, 2, 0, 15, 0, 4, 0, 17, 0, 4, 0, 67, 0,189, 1, 6, 0,189, 1, 0, 0,189, 1, 1, 0, 12, 0,137, 11,
+ 4, 0, 17, 0, 4, 0,148, 2, 0, 0,244, 3,190, 1, 11, 0,190, 1, 0, 0,190, 1, 1, 0, 19, 0,177, 6, 0, 0,143, 11,
+ 4, 0,123, 11, 2, 0,144, 11, 2, 0, 35, 0, 0, 0,120, 11, 4, 0,131, 11, 2, 0, 17, 0, 2, 0,145, 11,191, 1, 8, 0,
+191, 1, 0, 0,191, 1, 1, 0, 12, 0,146, 11, 0, 0,244, 3, 0, 0,147, 11, 2, 0, 17, 0, 2, 0,145, 11, 4, 0,148, 11,
+192, 1, 5, 0,192, 1, 0, 0,192, 1, 1, 0, 0, 0,120, 11, 4, 0,131, 11, 7, 0,202, 2, 31, 0, 12, 0,155, 0, 97, 3,
+155, 0,149, 11,187, 1,138, 11, 12, 0,150, 11,188, 1,151, 11, 12, 0,152, 11, 12, 0,153, 11, 4, 0, 17, 0, 4, 0,241, 0,
+ 2, 0,154, 11, 2, 0,155, 11, 7, 0,156, 11,193, 1, 2, 0, 19, 0, 29, 0, 31, 0, 72, 0,194, 1, 5, 0,194, 1, 0, 0,
+194, 1, 1, 0, 4, 0, 15, 0, 4, 0, 17, 0, 0, 0, 18, 0,195, 1, 6, 0,194, 1,157, 11, 24, 0, 42, 0, 4, 0,158, 11,
+ 7, 0,159, 11, 4, 0,160, 11, 4, 0, 96, 9,196, 1, 3, 0,194, 1,157, 11, 4, 0,158, 11, 7, 0,161, 11,197, 1, 8, 0,
+194, 1,157, 11, 24, 0, 42, 0, 7, 0, 61, 1, 7, 0,162, 11, 7, 0, 12, 3, 7, 0,255, 8, 4, 0,158, 11, 4, 0,163, 11,
+198, 1, 5, 0,194, 1,157, 11, 7, 0,164, 11, 7, 0, 80, 8, 7, 0,237, 2, 7, 0, 54, 0,199, 1, 3, 0,194, 1,157, 11,
+ 7, 0,255, 8, 7, 0,165, 11,143, 1, 4, 0, 7, 0,166, 11, 7, 0,187, 10, 2, 0,167, 11, 2, 0, 66, 1,200, 1, 14, 0,
+200, 1, 0, 0,200, 1, 1, 0, 12, 0,168, 11, 12, 0,169, 11, 12, 0,170, 11, 0, 0, 18, 0, 4, 0, 29, 0, 4, 0, 17, 0,
+ 4, 0,171, 11, 7, 0,172, 11, 4, 0,160, 11, 4, 0, 96, 9, 7, 0,254, 3, 7, 0,239, 2,151, 1, 23, 0, 4, 0,158, 11,
+ 4, 0,173, 11, 7, 0,174, 11, 7, 0,235, 2, 7, 0,175, 11, 7, 0,216, 8, 7, 0,166, 11, 7, 0,176, 11, 7, 0,214, 2,
+ 7, 0, 62, 10, 7, 0,131, 4, 7, 0,177, 11, 7, 0,178, 11, 7, 0,179, 11, 7, 0,180, 11, 7, 0,181, 11, 7, 0,182, 11,
+ 7, 0,183, 11, 7, 0,184, 11, 7, 0,185, 11, 7, 0,186, 11, 7, 0,187, 11, 12, 0,188, 11,113, 0, 40, 0,112, 0,189, 11,
+201, 1,143, 10, 58, 0,190, 11, 58, 0,221, 10, 58, 0,191, 11,202, 1,192, 11, 40, 0,159, 0, 40, 0,193, 11, 40, 0,194, 11,
+ 7, 0,195, 11, 7, 0,196, 11, 7, 0,197, 11, 7, 0,198, 11, 7, 0,199, 11, 7, 0,231, 7, 7, 0,200, 11, 7, 0,155, 1,
+ 7, 0,201, 11, 4, 0,202, 11, 4, 0,203, 11, 4, 0,204, 11, 4, 0, 88, 0, 4, 0, 35, 0, 4, 0,205, 11, 2, 0,206, 11,
+ 2, 0,207, 11, 4, 0,208, 11, 7, 0,214, 2, 4, 0,209, 11, 7, 0,210, 11, 4, 0,211, 11, 4, 0,212, 11, 4, 0,213, 11,
+129, 0,214, 11, 12, 0,215, 11,166, 0, 68, 4, 4, 0,216, 11, 7, 0,217, 11, 7, 0,218, 11, 4, 0, 67, 0,114, 0, 12, 0,
+112, 0,189, 11,140, 0, 32, 3, 7, 0,122, 1, 7, 0,231, 7, 7, 0,219, 11, 7, 0,220, 11, 7, 0,221, 11, 2, 0,222, 11,
+ 2, 0,223, 11, 2, 0,224, 11, 2, 0, 15, 0, 4, 0, 88, 0,115, 0, 13, 0,112, 0,189, 11,131, 0, 9, 3,133, 0, 11, 3,
+ 7, 0, 38, 9, 7, 0,225, 11, 7, 0,226, 11, 7, 0, 63, 1, 7, 0,227, 11, 4, 0,129, 9, 4, 0, 7, 3, 2, 0, 15, 0,
+ 2, 0, 35, 0, 4, 0, 67, 0, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0};
-
diff --git a/source/blender/editors/gpencil/CMakeLists.txt b/source/blender/editors/gpencil/CMakeLists.txt
index 394418b5688..7b22a5a3171 100644
--- a/source/blender/editors/gpencil/CMakeLists.txt
+++ b/source/blender/editors/gpencil/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -32,4 +30,15 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_gpencil "${SRC}" "${INC}")
+set(SRC
+ drawgpencil.c
+ editaction_gpencil.c
+ gpencil_buttons.c
+ gpencil_edit.c
+ gpencil_ops.c
+ gpencil_paint.c
+
+ gpencil_intern.h
+)
+
+blender_add_lib(bf_editor_gpencil "${SRC}" "${INC}")
diff --git a/source/blender/editors/gpencil/Makefile b/source/blender/editors/gpencil/Makefile
deleted file mode 100644
index f3e781a0369..00000000000
--- a/source/blender/editors/gpencil/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_gpencil
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index 4b8c58a5308..901542ea2de 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -38,6 +38,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_gpencil_types.h"
#include "DNA_scene_types.h"
@@ -48,7 +49,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_gpencil.h"
-#include "BKE_utildefines.h"
+
#include "WM_api.h"
@@ -199,7 +200,7 @@ static void gp_draw_stroke_point (bGPDspoint *points, short thickness, short sfl
}
/* draw a given stroke in 3d (i.e. in 3d-space), using simple ogl lines */
-static void gp_draw_stroke_3d (bGPDspoint *points, int totpoints, short thickness, short dflag, short sflag, short debug, int winx, int winy)
+static void gp_draw_stroke_3d (bGPDspoint *points, int totpoints, short thickness, short debug)
{
bGPDspoint *pt;
float oldpressure = 0.0f;
@@ -244,9 +245,12 @@ static void gp_draw_stroke_3d (bGPDspoint *points, int totpoints, short thicknes
/* ----- Fancy 2D-Stroke Drawing ------ */
/* draw a given stroke in 2d */
-static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness, short dflag, short sflag,
+static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness_s, short dflag, short sflag,
short debug, int offsx, int offsy, int winx, int winy)
{
+ /* otherwise thickness is twice that of the 3D view */
+ float thickness= (float)thickness_s * 0.5f;
+
/* if thickness is less than GP_DRAWTHICKNESS_SPECIAL, 'smooth' opengl lines look better
* - 'smooth' opengl lines are also required if Image Editor 'image-based' stroke
*/
@@ -498,7 +502,7 @@ static void gp_draw_strokes (bGPDframe *gpf, int offsx, int offsy, int winx, int
if (gps->totpoints == 1)
gp_draw_stroke_point(gps->points, lthick, gps->flag, offsx, offsy, winx, winy);
else if (dflag & GP_DRAWDATA_ONLY3D)
- gp_draw_stroke_3d(gps->points, gps->totpoints, lthick, dflag, gps->flag, debug, winx, winy);
+ gp_draw_stroke_3d(gps->points, gps->totpoints, lthick, debug);
else if (gps->totpoints > 1)
gp_draw_stroke(gps->points, gps->totpoints, lthick, dflag, gps->flag, debug, offsx, offsy, winx, winy);
}
@@ -751,7 +755,7 @@ void draw_gpencil_view3d_ext (Scene *scene, View3D *v3d, ARegion *ar, short only
* deal with the camera border, otherwise map the coords to the camera border. */
if(rv3d->persp == RV3D_CAMOB && !(G.f & G_RENDER_OGL)) {
rctf rectf;
- view3d_calc_camera_border(scene, ar, rv3d, v3d, &rectf);
+ view3d_calc_camera_border(scene, ar, rv3d, v3d, &rectf, -1); /* negative shift */
BLI_copy_rcti_rctf(&rect, &rectf);
}
else {
diff --git a/source/blender/editors/gpencil/editaction_gpencil.c b/source/blender/editors/gpencil/editaction_gpencil.c
index d76e5fcf17c..643b6c7082f 100644
--- a/source/blender/editors/gpencil/editaction_gpencil.c
+++ b/source/blender/editors/gpencil/editaction_gpencil.c
@@ -31,20 +31,23 @@
#include <stddef.h>
#include <math.h>
-#include "BLI_math.h"
+#include "MEM_guardedalloc.h"
+
#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
-#include "gpencil_intern.h"
+#include "DNA_gpencil_types.h"
+#include "DNA_scene_types.h"
-#if 0 // XXX disabled until grease pencil code stabilises again
+#include "BKE_fcurve.h"
+#include "BKE_gpencil.h"
-/* XXX */
-static void actdata_filter() {} // is now ANIM_animdata_filter()
-static void BIF_undo_push() {}
-static void error() {}
-static void *get_action_context() {return NULL;} // is now ANIM_animdata_get_context()
-/* XXX */
+#include "ED_anim_api.h"
+#include "ED_gpencil.h"
+#include "ED_keyframes_edit.h"
+#include "gpencil_intern.h"
/* ***************************************** */
/* NOTE ABOUT THIS FILE:
@@ -126,6 +129,9 @@ short is_gplayer_frame_selected (bGPDlayer *gpl)
/* helper function - select gp-frame based on SELECT_* mode */
static void gpframe_select (bGPDframe *gpf, short select_mode)
{
+ if (gpf == NULL)
+ return;
+
switch (select_mode) {
case SELECT_ADD:
gpf->flag |= GP_FRAME_SELECT;
@@ -160,31 +166,19 @@ void set_gplayer_frame_selection (bGPDlayer *gpl, short mode)
/* error checking */
if (gpl == NULL)
return;
-
- /* convert mode to select_mode */
- switch (mode) {
- case 2:
- mode= SELECT_INVERT;
- break;
- case 1:
- mode= SELECT_ADD;
- break;
- case 0:
- mode= SELECT_SUBTRACT;
- break;
- default:
- return;
- }
/* now call the standard function */
- select_gpencil_frames (gpl, mode);
+ select_gpencil_frames(gpl, mode);
}
/* select the frame in this layer that occurs on this frame (there should only be one at most) */
void select_gpencil_frame (bGPDlayer *gpl, int selx, short select_mode)
{
bGPDframe *gpf;
-
+
+ if (gpl == NULL)
+ return;
+
/* search through frames for a match */
for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
/* there should only be one frame with this frame-number */
@@ -200,6 +194,9 @@ void borderselect_gplayer_frames (bGPDlayer *gpl, float min, float max, short se
{
bGPDframe *gpf;
+ if (gpl == NULL)
+ return;
+
/* only select those frames which are in bounds */
for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
if (IN_RANGE(gpf->framenum, min, max))
@@ -207,6 +204,7 @@ void borderselect_gplayer_frames (bGPDlayer *gpl, float min, float max, short se
}
}
+#if 0 // XXX disabled until grease pencil code stabilises again
/* De-selects or inverts the selection of Layers for a grease-pencil block
* mode: 0 = default behaviour (select all), 1 = test if (de)select all, 2 = invert all
@@ -252,9 +250,12 @@ void deselect_gpencil_layers (void *data, short mode)
BLI_freelistN(&act_data);
}
+#endif // XXX disabled until Grease Pencil code stabilises again...
+
/* ***************************************** */
/* Frame Editing Tools */
+#if 0 // XXX disabled until grease pencil code stabilises again
/* Delete selected grease-pencil layers */
void delete_gpencil_layers (void)
{
@@ -291,6 +292,7 @@ void delete_gpencil_layers (void)
BIF_undo_push("Delete GPencil Layers");
}
+#endif // XXX disabled until Grease Pencil code stabilises again...
/* Delete selected frames */
void delete_gplayer_frames (bGPDlayer *gpl)
@@ -336,6 +338,7 @@ void duplicate_gplayer_frames (bGPDlayer *gpl)
}
}
+#if 0 // XXX disabled until grease pencil code stabilises again
/* -------------------------------------- */
/* Copy and Paste Tools */
/* - The copy/paste buffer currently stores a set of GP_Layers, with temporary
@@ -668,15 +671,10 @@ static short mirror_gpf_marker (bGPDframe *gpf, Scene *scene)
}
else {
/* try to find a marker */
- for (marker= scene->markers.first; marker; marker=marker->next) {
- if (marker->flag & SELECT) {
- initialised = 1;
- break;
- }
+ marker= ED_markers_get_first_selected(&scene->markers);
+ if(marker) {
+ initialised= 1;
}
-
- if (initialised == 0)
- marker = NULL;
}
}
diff --git a/source/blender/editors/gpencil/gpencil_buttons.c b/source/blender/editors/gpencil/gpencil_buttons.c
index 87a9c3cd52f..96bc4259661 100644
--- a/source/blender/editors/gpencil/gpencil_buttons.c
+++ b/source/blender/editors/gpencil/gpencil_buttons.c
@@ -138,7 +138,7 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
sprintf(name, "%s (Hidden)", gpl->info);
else
sprintf(name, "%s (Locked)", gpl->info);
- uiItemL(subrow, name, 0);
+ uiItemL(subrow, name, ICON_NULL);
/* delete button (only if hidden but not locked!) */
if ((gpl->flag & GP_LAYER_HIDE) & !(gpl->flag & GP_LAYER_LOCKED)) {
@@ -165,7 +165,7 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
uiBlockSetEmboss(block, UI_EMBOSS);
/* name */
- uiItemR(subrow, &ptr, "info", 0, "", 0);
+ uiItemR(subrow, &ptr, "info", 0, "", ICON_NULL);
/* delete 'button' */
uiBlockSetEmboss(block, UI_EMBOSSN);
@@ -189,17 +189,17 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
/* color */
subcol= uiLayoutColumn(col, 1);
- uiItemR(subcol, &ptr, "color", 0, "", 0);
- uiItemR(subcol, &ptr, "alpha", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(subcol, &ptr, "color", 0, "", ICON_NULL);
+ uiItemR(subcol, &ptr, "alpha", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
/* stroke thickness */
subcol= uiLayoutColumn(col, 1);
- uiItemR(subcol, &ptr, "line_width", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(subcol, &ptr, "line_width", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
/* debugging options */
if (G.f & G_DEBUG) {
subcol= uiLayoutColumn(col, 1);
- uiItemR(subcol, &ptr, "show_points", 0, NULL, 0);
+ uiItemR(subcol, &ptr, "show_points", 0, NULL, ICON_NULL);
}
/* right column ................... */
@@ -207,13 +207,9 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
/* onion-skinning */
subcol= uiLayoutColumn(col, 1);
- uiItemR(subcol, &ptr, "use_onion_skinning", 0, "Onion Skinning", 0);
- uiItemR(subcol, &ptr, "ghost_range_max", 0, "Frames", 0); // XXX shorter name here? i.e. GStep
+ uiItemR(subcol, &ptr, "use_onion_skinning", 0, "Onion Skinning", ICON_NULL);
+ uiItemR(subcol, &ptr, "ghost_range_max", 0, "Frames", ICON_NULL); // XXX shorter name here? i.e. GStep
- /* additional options... */
- subcol= uiLayoutColumn(col, 1);
- uiItemO(subcol, "Delete Frame", 0, "GPENCIL_OT_active_frame_delete");
- uiItemO(subcol, "Convert...", 0, "GPENCIL_OT_convert");
}
}
@@ -242,8 +238,11 @@ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, Poi
uiTemplateID(col, C, ctx_ptr, "grease_pencil", "GPENCIL_OT_data_add", NULL, "GPENCIL_OT_data_unlink");
/* add new layer button - can be used even when no data, since it can add a new block too */
- uiItemO(col, NULL, 0, "GPENCIL_OT_layer_add");
-
+ uiItemO(col, "New Layer", ICON_NULL, "GPENCIL_OT_layer_add");
+ row= uiLayoutRow(col, 1);
+ uiItemO(row, "Delete Frame", ICON_NULL, "GPENCIL_OT_active_frame_delete");
+ uiItemO(row, "Convert", ICON_NULL, "GPENCIL_OT_convert");
+
/* sanity checks... */
if (gpd == NULL)
return;
@@ -257,7 +256,7 @@ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, Poi
/* draw gpd drawing settings first ------------------------------------- */
col= uiLayoutColumn(layout, 1);
/* label */
- uiItemL(col, "Drawing Settings:", 0);
+ uiItemL(col, "Drawing Settings:", ICON_NULL);
/* check whether advanced 3D-View drawing space options can be used */
if (CTX_wm_view3d(C)) {
@@ -269,16 +268,16 @@ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, Poi
/* drawing space options */
row= uiLayoutRow(col, 1);
- uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "VIEW", NULL, 0);
- uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "CURSOR", NULL, 0);
+ uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "VIEW", NULL, ICON_NULL);
+ uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "CURSOR", NULL, ICON_NULL);
row= uiLayoutRow(col, 1);
uiLayoutSetActive(row, v3d_stroke_opts);
- uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "SURFACE", NULL, 0);
- uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "STROKE", NULL, 0);
+ uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "SURFACE", NULL, ICON_NULL);
+ uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "STROKE", NULL, ICON_NULL);
row= uiLayoutRow(col, 0);
uiLayoutSetActive(row, v3d_stroke_opts==STROKE_OPTS_V3D_ON);
- uiItemR(row, &gpd_ptr, "use_stroke_endpoints", 0, NULL, 0);
+ uiItemR(row, &gpd_ptr, "use_stroke_endpoints", 0, NULL, ICON_NULL);
}
diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index e0d257ca3bf..b7f13ebe0b7 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -37,6 +37,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_curve_types.h"
#include "DNA_object_types.h"
@@ -542,9 +543,9 @@ static int gp_convert_poll (bContext *C)
{
bGPdata *gpd= gpencil_data_get_active(C);
ScrArea *sa= CTX_wm_area(C);
-
+
/* only if there's valid data, and the current view is 3D View */
- return ((sa->spacetype == SPACE_VIEW3D) && gpencil_layer_getactive(gpd));
+ return ((sa && sa->spacetype == SPACE_VIEW3D) && gpencil_layer_getactive(gpd));
}
static int gp_convert_layer_exec (bContext *C, wmOperator *op)
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index 083a90efb25..0ebbe223c3f 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -35,6 +35,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_gpencil.h"
#include "BKE_context.h"
@@ -44,6 +45,7 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_gpencil_types.h"
+#include "DNA_windowmanager_types.h"
#include "UI_view2d.h"
@@ -65,6 +67,8 @@
/* Temporary 'Stroke' Operation data */
typedef struct tGPsdata {
Scene *scene; /* current scene from context */
+
+ wmWindow *win; /* window where painting originated */
ScrArea *sa; /* area where painting originated */
ARegion *ar; /* region where painting originated */
View2D *v2d; /* needed for GP_STROKE_2DSPACE */
@@ -141,15 +145,31 @@ static void gp_session_validatebuffer(tGPsdata *p);
/* check if context is suitable for drawing */
static int gpencil_draw_poll (bContext *C)
{
- /* check if current context can support GPencil data */
- return (gpencil_data_get_pointers(C, NULL) != NULL);
+ if (ED_operator_regionactive(C)) {
+ /* check if current context can support GPencil data */
+ if (gpencil_data_get_pointers(C, NULL) != NULL) {
+ /* check if Grease Pencil isn't already running */
+ if ((G.f & G_GREASEPENCIL) == 0)
+ return 1;
+ else
+ CTX_wm_operator_poll_msg_set(C, "Grease Pencil operator is already active");
+ }
+ else {
+ CTX_wm_operator_poll_msg_set(C, "Failed to find Grease Pencil data to draw into");
+ }
+ }
+ else {
+ CTX_wm_operator_poll_msg_set(C, "Active region not set");
+ }
+
+ return 0;
}
/* check if projecting strokes into 3d-geometry in the 3D-View */
static int gpencil_project_check (tGPsdata *p)
{
bGPdata *gpd= p->gpd;
- return ((gpd->sbuffer_sflag & GP_STROKE_3DSPACE) && (p->gpd->flag & (GP_DATA_DEPTH_VIEW | GP_DATA_DEPTH_STROKE))) ? 1:0;
+ return ((gpd->sbuffer_sflag & GP_STROKE_3DSPACE) && (p->gpd->flag & (GP_DATA_DEPTH_VIEW | GP_DATA_DEPTH_STROKE)));
}
/* ******************************************* */
@@ -164,7 +184,7 @@ static void gp_get_3d_reference (tGPsdata *p, float *vec)
float *fp= give_cursor(p->scene, v3d);
/* the reference point used depends on the owner... */
-#if 0 // XXX: disabled for now, since we can't draw relative ot the owner yet
+#if 0 // XXX: disabled for now, since we can't draw relative to the owner yet
if (p->ownerPtr.type == &RNA_Object)
{
Object *ob= (Object *)p->ownerPtr.data;
@@ -194,13 +214,17 @@ static short gp_stroke_filtermval (tGPsdata *p, int mval[2], int pmval[2])
if (p->gpd->sbuffer_size == 0)
return 1;
- /* check if mouse moved at least certain distance on both axes (best case) */
+ /* check if mouse moved at least certain distance on both axes (best case)
+ * - aims to eliminate some jitter-noise from input when trying to draw straight lines freehand
+ */
else if ((dx > MIN_MANHATTEN_PX) && (dy > MIN_MANHATTEN_PX))
return 1;
- /* check if the distance since the last point is significant enough */
- // future optimisation: sqrt here may be too slow?
- else if (sqrt(dx*dx + dy*dy) > MIN_EUCLIDEAN_PX)
+ /* check if the distance since the last point is significant enough
+ * - prevents points being added too densely
+ * - distance here doesn't use sqrt to prevent slowness... we should still be safe from overflows though
+ */
+ else if ((dx*dx + dy*dy) > MIN_EUCLIDEAN_PX*MIN_EUCLIDEAN_PX)
return 1;
/* mouse 'didn't move' */
@@ -216,7 +240,7 @@ static void gp_stroke_convertcoords (tGPsdata *p, short mval[], float out[], flo
/* in 3d-space - pt->x/y/z are 3 side-by-side floats */
if (gpd->sbuffer_sflag & GP_STROKE_3DSPACE) {
- if(gpencil_project_check(p) && (view_autodist_simple(p->ar, mval, out, 0, depth))) {
+ if (gpencil_project_check(p) && (view_autodist_simple(p->ar, mval, out, 0, depth))) {
/* projecting onto 3D-Geometry
* - nothing more needs to be done here, since view_autodist_simple() has already done it
*/
@@ -274,7 +298,7 @@ static void gp_stroke_convertcoords (tGPsdata *p, short mval[], float out[], flo
/* 2d - relative to screen (viewport area) */
else {
- if(p->subrect == NULL) { /* normal 3D view */
+ if (p->subrect == NULL) { /* normal 3D view */
out[0] = (float)(mval[0]) / (float)(p->ar->winx) * 100;
out[1] = (float)(mval[1]) / (float)(p->ar->winy) * 100;
}
@@ -394,12 +418,12 @@ static void gp_stroke_simplify (tGPsdata *p)
short flag= gpd->sbuffer_sflag;
short i, j;
- /* only simplify if simlification is enabled, and we're not doing a straight line */
+ /* only simplify if simplification is enabled, and we're not doing a straight line */
if (!(U.gp_settings & GP_PAINT_DOSIMPLIFY) || (p->paintmode == GP_PAINTMODE_DRAW_STRAIGHT))
return;
/* don't simplify if less than 4 points in buffer */
- if ((num_points <= 2) || (old_points == NULL))
+ if ((num_points <= 4) || (old_points == NULL))
return;
/* clear buffer (but don't free mem yet) so that we can write to it
@@ -520,60 +544,69 @@ static void gp_stroke_newfrombuffer (tGPsdata *p)
}
else {
float *depth_arr= NULL;
-
+
/* get an array of depths, far depths are blended */
- if(gpencil_project_check(p)) {
- short mval[2];
+ if (gpencil_project_check(p)) {
+ short mval[2], mval_prev[2]= {0};
int interp_depth = 0;
int found_depth = 0;
-
+
depth_arr= MEM_mallocN(sizeof(float) * gpd->sbuffer_size, "depth_points");
for (i=0, ptc=gpd->sbuffer; i < gpd->sbuffer_size; i++, ptc++, pt++) {
mval[0]= ptc->x; mval[1]= ptc->y;
- if(view_autodist_depth(p->ar, mval, depth_margin, depth_arr+i) == 0)
+
+ if ((view_autodist_depth(p->ar, mval, depth_margin, depth_arr+i) == 0) &&
+ (i && (view_autodist_depth_segment(p->ar, mval, mval_prev, depth_margin + 1, depth_arr+i) == 0))
+ ) {
interp_depth= TRUE;
- else
+ }
+ else {
found_depth= TRUE;
- }
+ }
- if(found_depth==FALSE) {
+ VECCOPY2D(mval_prev, mval);
+ }
+
+ if (found_depth == FALSE) {
/* eeh... not much we can do.. :/, ignore depth in this case, use the 3D cursor */
for (i=gpd->sbuffer_size-1; i >= 0; i--)
depth_arr[i] = 0.9999f;
}
else {
- if(p->gpd->flag & GP_DATA_DEPTH_STROKE_ENDPOINTS) {
+ if (p->gpd->flag & GP_DATA_DEPTH_STROKE_ENDPOINTS) {
/* remove all info between the valid endpoints */
int first_valid = 0;
int last_valid = 0;
-
- for (i=0; i < gpd->sbuffer_size; i++)
- if(depth_arr[i] != FLT_MAX)
+
+ for (i=0; i < gpd->sbuffer_size; i++) {
+ if (depth_arr[i] != FLT_MAX)
break;
+ }
first_valid= i;
-
- for (i=gpd->sbuffer_size-1; i >= 0; i--)
- if(depth_arr[i] != FLT_MAX)
+
+ for (i=gpd->sbuffer_size-1; i >= 0; i--) {
+ if (depth_arr[i] != FLT_MAX)
break;
+ }
last_valid= i;
-
+
/* invalidate non-endpoints, so only blend between first and last */
for (i=first_valid+1; i < last_valid; i++)
depth_arr[i]= FLT_MAX;
-
+
interp_depth= TRUE;
}
-
- if(interp_depth) {
+
+ if (interp_depth) {
interp_sparse_array(depth_arr, gpd->sbuffer_size, FLT_MAX);
}
}
}
-
-
+
+
pt= gps->points;
-
+
/* convert all points (normal behaviour) */
for (i=0, ptc=gpd->sbuffer; i < gpd->sbuffer_size && ptc; i++, ptc++, pt++) {
/* convert screen-coordinates to appropriate coordinates (and store them) */
@@ -582,8 +615,8 @@ static void gp_stroke_newfrombuffer (tGPsdata *p)
/* copy pressure */
pt->pressure= ptc->pressure;
}
-
- if(depth_arr)
+
+ if (depth_arr)
MEM_freeN(depth_arr);
}
@@ -662,7 +695,7 @@ static short gp_stroke_eraser_splitdel (bGPDframe *gpf, bGPDstroke *gps, int i)
}
/* eraser tool - check if part of stroke occurs within last segment drawn by eraser */
-static short gp_stroke_eraser_strokeinside (int mval[], int mvalo[], short rad, short x0, short y0, short x1, short y1)
+static short gp_stroke_eraser_strokeinside (int mval[], int UNUSED(mvalo[]), short rad, short x0, short y0, short x1, short y1)
{
/* simple within-radius check for now */
if (edge_inside_circle(mval[0], mval[1], rad, x0, y0, x1, y1))
@@ -713,7 +746,7 @@ static void gp_stroke_eraser_dostroke (tGPsdata *p, int mval[], int mvalo[], sho
}
#endif
else {
- if(p->subrect == NULL) { /* normal 3D view */
+ if (p->subrect == NULL) { /* normal 3D view */
x0= (int)(gps->points->x / 100 * p->ar->winx);
y0= (int)(gps->points->y / 100 * p->ar->winy);
}
@@ -865,15 +898,16 @@ static tGPsdata *gp_session_initpaint (bContext *C)
/* create new context data */
p= MEM_callocN(sizeof(tGPsdata), "GPencil Drawing Data");
- /* pass on current scene */
+ /* pass on current scene and window */
p->scene= CTX_data_scene(C);
+ p->win= CTX_wm_window(C);
switch (curarea->spacetype) {
/* supported views first */
case SPACE_VIEW3D:
{
- View3D *v3d= curarea->spacedata.first;
- RegionView3D *rv3d= ar->regiondata;
+ // View3D *v3d= curarea->spacedata.first;
+ // RegionView3D *rv3d= ar->regiondata;
/* set current area
* - must verify that region data is 3D-view (and not something else)
@@ -887,12 +921,6 @@ static tGPsdata *gp_session_initpaint (bContext *C)
printf("Error: 3D-View active region doesn't have any region data, so cannot be drawable \n");
return p;
}
-
- /* for camera view set the subrect */
- if(rv3d->persp == RV3D_CAMOB) {
- view3d_calc_camera_border(p->scene, p->ar, NULL, v3d, &p->subrect_data);
- p->subrect= &p->subrect_data;
- }
#if 0 // XXX will this sort of antiquated stuff be restored?
/* check that gpencil data is allowed to be drawn */
@@ -1003,9 +1031,6 @@ static tGPsdata *gp_session_initpaint (bContext *C)
/* set edit flags - so that buffer will get drawn */
G.f |= G_GREASEPENCIL;
- /* set initial run flag */
- p->flags |= GP_PAINTFLAG_FIRSTRUN;
-
/* clear out buffer (stored in gp-data), in case something contaminated it */
gp_session_validatebuffer(p);
@@ -1068,15 +1093,26 @@ static void gp_paint_initstroke (tGPsdata *p, short paintmode)
p->paintmode= paintmode;
if (p->paintmode == GP_PAINTMODE_ERASER)
p->gpd->sbuffer_sflag |= GP_STROKE_ERASER;
+
+ /* set 'initial run' flag, which is only used to denote when a new stroke is starting */
+ p->flags |= GP_PAINTFLAG_FIRSTRUN;
/* check if points will need to be made in view-aligned space */
if (p->gpd->flag & GP_DATA_VIEWALIGN) {
switch (p->sa->spacetype) {
case SPACE_VIEW3D:
{
+ View3D *v3d= p->sa->spacedata.first;
RegionView3D *rv3d= p->ar->regiondata;
float rvec[3];
+ /* for camera view set the subrect */
+ if (rv3d->persp == RV3D_CAMOB) {
+ view3d_calc_camera_border(p->scene, p->ar, NULL, v3d, &p->subrect_data, -1); /* negative shift */
+ p->subrect= &p->subrect_data;
+ }
+
+ /* get reference point for 3d space placement */
gp_get_3d_reference(p, rvec);
initgrabz(rv3d, rvec[0], rvec[1], rvec[2]);
@@ -1149,6 +1185,17 @@ static void gp_paint_initstroke (tGPsdata *p, short paintmode)
/* finish off a stroke (clears buffer, but doesn't finish the paint operation) */
static void gp_paint_strokeend (tGPsdata *p)
{
+ /* for surface sketching, need to set the right OpenGL context stuff so that
+ * the conversions will project the values correctly...
+ */
+ if (gpencil_project_check(p)) {
+ View3D *v3d= p->sa->spacedata.first;
+
+ /* need to restore the original projection settings before packing up */
+ view3d_region_operator_needs_opengl(p->win, p->ar);
+ view_autodist_init(p->scene, p->ar, v3d, (p->gpd->flag & GP_DATA_DEPTH_STROKE) ? 1:0);
+ }
+
/* check if doing eraser or not */
if ((p->gpd->sbuffer_sflag & GP_STROKE_ERASER) == 0) {
/* smooth stroke before transferring? */
@@ -1224,14 +1271,6 @@ static void gpencil_draw_exit (bContext *C, wmOperator *op)
}
/* cleanup */
- if(gpencil_project_check(p)) {
- View3D *v3d= p->sa->spacedata.first;
-
- /* need to restore the original projection settings before packing up */
- view3d_operator_needs_opengl(C);
- view_autodist_init(p->scene, p->ar, v3d, (p->gpd->flag & GP_DATA_DEPTH_STROKE) ? 1:0);
- }
-
gp_paint_cleanup(p);
gp_session_cleanup(p);
@@ -1249,8 +1288,48 @@ static int gpencil_draw_cancel (bContext *C, wmOperator *op)
/* ------------------------------- */
+/* update UI indicators of status, including cursor and header prints */
+static void gpencil_draw_status_indicators (tGPsdata *p)
+{
+ /* header prints */
+ switch (p->status) {
+ case GP_STATUS_PAINTING:
+ /* only print this for paint-sessions, otherwise it gets annoying */
+ if (GPENCIL_SKETCH_SESSIONS_ON(p->scene))
+ ED_area_headerprint(p->sa, "Grease Pencil: Drawing/erasing stroke... Release to end stroke");
+ break;
+
+ case GP_STATUS_IDLING:
+ /* print status info */
+ switch (p->paintmode) {
+ case GP_PAINTMODE_ERASER:
+ ED_area_headerprint(p->sa, "Grease Pencil Erase Session: Hold and drag LMB or RMB to erase | ESC/Enter to end");
+ break;
+ case GP_PAINTMODE_DRAW_STRAIGHT:
+ ED_area_headerprint(p->sa, "Grease Pencil Line Session: Hold and drag LMB to draw | ESC/Enter to end");
+ break;
+ case GP_PAINTMODE_DRAW:
+ ED_area_headerprint(p->sa, "Grease Pencil Freehand Session: Hold and drag LMB to draw | ESC/Enter to end");
+ break;
+
+ default: /* unhandled future cases */
+ ED_area_headerprint(p->sa, "Grease Pencil Session: ESC/Enter to end");
+ break;
+ }
+ break;
+
+ case GP_STATUS_ERROR:
+ case GP_STATUS_DONE:
+ /* clear status string */
+ ED_area_headerprint(p->sa, NULL);
+ break;
+ }
+}
+
+/* ------------------------------- */
+
/* create a new stroke point at the point indicated by the painting context */
-static void gpencil_draw_apply (bContext *C, wmOperator *op, tGPsdata *p)
+static void gpencil_draw_apply (wmOperator *op, tGPsdata *p)
{
/* handle drawing/erasing -> test for erasing first */
if (p->paintmode == GP_PAINTMODE_ERASER) {
@@ -1294,7 +1373,7 @@ static void gpencil_draw_apply (bContext *C, wmOperator *op, tGPsdata *p)
}
/* handle draw event */
-static void gpencil_draw_apply_event (bContext *C, wmOperator *op, wmEvent *event)
+static void gpencil_draw_apply_event (wmOperator *op, wmEvent *event)
{
tGPsdata *p= op->customdata;
ARegion *ar= p->ar;
@@ -1313,12 +1392,22 @@ static void gpencil_draw_apply_event (bContext *C, wmOperator *op, wmEvent *even
tablet= (wmtab->Active != EVT_TABLET_NONE);
p->pressure= wmtab->Pressure;
+
//if (wmtab->Active == EVT_TABLET_ERASER)
// TODO... this should get caught by the keymaps which call drawing in the first place
}
else
p->pressure= 1.0f;
+ /* fill in stroke data (not actually used directly by gpencil_draw_apply) */
+ RNA_collection_add(op->ptr, "stroke", &itemptr);
+
+ mousef[0]= p->mval[0];
+ mousef[1]= p->mval[1];
+ RNA_float_set_array(&itemptr, "mouse", mousef);
+ RNA_float_set(&itemptr, "pressure", p->pressure);
+ RNA_boolean_set(&itemptr, "is_start", (p->flags & GP_PAINTFLAG_FIRSTRUN));
+
/* special exception for start of strokes (i.e. maybe for just a dot) */
if (p->flags & GP_PAINTFLAG_FIRSTRUN) {
p->flags &= ~GP_PAINTFLAG_FIRSTRUN;
@@ -1334,16 +1423,8 @@ static void gpencil_draw_apply_event (bContext *C, wmOperator *op, wmEvent *even
return;
}
- /* fill in stroke data (not actually used directly by gpencil_draw_apply) */
- RNA_collection_add(op->ptr, "stroke", &itemptr);
-
- mousef[0]= p->mval[0];
- mousef[1]= p->mval[1];
- RNA_float_set_array(&itemptr, "mouse", mousef);
- RNA_float_set(&itemptr, "pressure", p->pressure);
-
/* apply the current latest drawing point */
- gpencil_draw_apply(C, op, p);
+ gpencil_draw_apply(op, p);
/* force refresh */
ED_region_tag_redraw(p->ar); /* just active area for now, since doing whole screen is too slow */
@@ -1384,6 +1465,17 @@ static int gpencil_draw_exec (bContext *C, wmOperator *op)
p->mval[1] = (short)mousef[1];
p->pressure= RNA_float_get(&itemptr, "pressure");
+ if (RNA_boolean_get(&itemptr, "is_start")) {
+ /* if first-run flag isn't set already (i.e. not true first stroke),
+ * then we must terminate the previous one first before continuing
+ */
+ if ((p->flags & GP_PAINTFLAG_FIRSTRUN) == 0) {
+ // TODO: both of these ops can set error-status, but we probably don't need to worry
+ gp_paint_strokeend(p);
+ gp_paint_initstroke(p, p->paintmode);
+ }
+ }
+
/* if first run, set previous data too */
if (p->flags & GP_PAINTFLAG_FIRSTRUN) {
p->flags &= ~GP_PAINTFLAG_FIRSTRUN;
@@ -1394,7 +1486,7 @@ static int gpencil_draw_exec (bContext *C, wmOperator *op)
}
/* apply this data as necessary now (as per usual) */
- gpencil_draw_apply(C, op, p);
+ gpencil_draw_apply(op, p);
}
RNA_END;
@@ -1435,6 +1527,8 @@ static int gpencil_draw_invoke (bContext *C, wmOperator *op, wmEvent *event)
// TODO: set any additional settings that we can take from the events?
// TODO? if tablet is erasing, force eraser to be on?
+ // TODO: move cursor setting stuff to stroke-start so that paintmode can be changed midway...
+
/* if eraser is on, draw radial aid */
if (p->paintmode == GP_PAINTMODE_ERASER) {
// TODO: this involves mucking around with radial control, so we leave this for now..
@@ -1456,7 +1550,7 @@ static int gpencil_draw_invoke (bContext *C, wmOperator *op, wmEvent *event)
p->status= GP_STATUS_PAINTING;
/* handle the initial drawing - i.e. for just doing a simple dot */
- gpencil_draw_apply_event(C, op, event);
+ gpencil_draw_apply_event(op, event);
}
else {
/* toolbar invoked - don't start drawing yet... */
@@ -1472,67 +1566,136 @@ static int gpencil_draw_invoke (bContext *C, wmOperator *op, wmEvent *event)
static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
{
tGPsdata *p= op->customdata;
+ int estate = OPERATOR_PASS_THROUGH; /* default exit state - not handled, so let others have a share of the pie */
//printf("\tGP - handle modal event...\n");
- switch (event->type) {
- /* end of stroke -> ONLY when a mouse-button release occurs
- * otherwise, carry on to mouse-move...
- */
- case LEFTMOUSE:
- case RIGHTMOUSE:
- /* if painting, end stroke */
- if (p->status == GP_STATUS_PAINTING) {
- /* basically, this should be mouse-button up */
- //printf("\t\tGP - end of stroke \n");
- gpencil_draw_exit(C, op);
-
- /* one last flush before we're done */
- WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX need a nicer one that will work
+ /* exit painting mode (and/or end current stroke) */
+ if (ELEM4(event->type, RETKEY, PADENTER, ESCKEY, SPACEKEY)) {
+ /* exit() ends the current stroke before cleaning up */
+ //printf("\t\tGP - end of paint op + end of stroke\n");
+ gpencil_draw_exit(C, op);
+ p->status= GP_STATUS_DONE;
+ estate = OPERATOR_FINISHED;
+ }
+
+ /* toggle painting mode upon mouse-button movement */
+ if (ELEM(event->type, LEFTMOUSE, RIGHTMOUSE)) {
+ /* if painting, end stroke */
+ if (p->status == GP_STATUS_PAINTING) {
+ /* basically, this should be mouse-button up = end stroke
+ * BUT what happens next depends on whether we 'painting sessions' is enabled
+ */
+ if (GPENCIL_SKETCH_SESSIONS_ON(p->scene)) {
+ /* end stroke only, and then wait to resume painting soon */
+ //printf("\t\tGP - end stroke only\n");
+ gp_paint_cleanup(p);
+ p->status= GP_STATUS_IDLING;
- return OPERATOR_FINISHED;
+ /* we've just entered idling state, so this event was processed (but no others yet) */
+ estate = OPERATOR_RUNNING_MODAL;
+ }
+ else {
+ //printf("\t\tGP - end of stroke + op\n");
+ gpencil_draw_exit(C, op);
+ p->status= GP_STATUS_DONE;
+ estate = OPERATOR_FINISHED;
+ }
+ }
+ else {
+ /* not painting, so start stroke (this should be mouse-button down) */
+
+ /* we must check that we're still within the area that we're set up to work from
+ * otherwise we could crash (see bug #20586)
+ */
+ if (CTX_wm_area(C) != p->sa) {
+ //printf("\t\t\tGP - wrong area execution abort! \n");
+ gpencil_draw_exit(C, op);
+ p->status= GP_STATUS_ERROR;
+ estate = OPERATOR_CANCELLED;
}
else {
- /* not painting, so start stroke (this should be mouse-button down) */
-
- /* we must check that we're still within the area that we're set up to work from
- * otherwise we could crash (see bug #20586)
- */
- if (CTX_wm_area(C) != p->sa) {
- //printf("\t\t\tGP - wrong area execution abort! \n");
- gpencil_draw_exit(C, op);
- return OPERATOR_CANCELLED;
- }
-
//printf("\t\tGP - start stroke \n");
p->status= GP_STATUS_PAINTING;
- /* no break now, since we should immediately start painting */
- }
-
- /* moving mouse - assumed that mouse button is down if in painting status */
- case MOUSEMOVE:
- case INBETWEEN_MOUSEMOVE:
- /* check if we're currently painting */
- if (p->status == GP_STATUS_PAINTING) {
- /* handle drawing event */
- //printf("\t\tGP - add point\n");
- gpencil_draw_apply_event(C, op, event);
- /* finish painting operation if anything went wrong just now */
+ /* we may need to set up paint env again if we're resuming */
+ // XXX: watch it with the paintmode! in future, it'd be nice to allow changing paint-mode when in sketching-sessions
+ // XXX: with tablet events, we may event want to check for eraser here, for nicer tablet support
+ gp_paint_initstroke(p, p->paintmode);
+
if (p->status == GP_STATUS_ERROR) {
- //printf("\t\t\tGP - error done! \n");
gpencil_draw_exit(C, op);
- return OPERATOR_CANCELLED;
+ estate = OPERATOR_CANCELLED;
}
}
+ }
+ }
+
+ /* handle mode-specific events */
+ if (p->status == GP_STATUS_PAINTING) {
+ /* handle painting mouse-movements? */
+ if (ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE) || (p->flags & GP_PAINTFLAG_FIRSTRUN))
+ {
+ /* handle drawing event */
+ //printf("\t\tGP - add point\n");
+ gpencil_draw_apply_event(op, event);
+
+ /* finish painting operation if anything went wrong just now */
+ if (p->status == GP_STATUS_ERROR) {
+ //printf("\t\t\t\tGP - add error done! \n");
+ gpencil_draw_exit(C, op);
+ estate = OPERATOR_CANCELLED;
+ }
+ else {
+ /* event handled, so just tag as running modal */
+ //printf("\t\t\t\tGP - add point handled!\n");
+ estate = OPERATOR_RUNNING_MODAL;
+ }
+ }
+ /* there shouldn't be any other events, but just in case there are, let's swallow them
+ * (i.e. to prevent problems with with undo)
+ */
+ else {
+ /* swallow event to save ourselves trouble */
+ estate = OPERATOR_RUNNING_MODAL;
+ }
+ }
+ else if (p->status == GP_STATUS_IDLING) {
+ /* standard undo/redo shouldn't be allowed to execute or else it causes crashes, so catch it here */
+ // FIXME: this is a hardcoded hotkey that can't be changed
+ // TODO: catch redo as well, but how?
+ if (event->type == ZKEY) {
+ /* oskey = cmd key on macs as they seem to use cmd-z for undo as well? */
+ if ((event->ctrl) || (event->oskey)) {
+ /* just delete last stroke, which will look like undo to the end user */
+ //printf("caught attempted undo event... deleting last stroke \n");
+ gpencil_frame_delete_laststroke(p->gpl, p->gpf);
+
+ /* event handled, so force refresh */
+ ED_region_tag_redraw(p->ar); /* just active area for now, since doing whole screen is too slow */
+ estate = OPERATOR_RUNNING_MODAL;
+ }
+ }
+ }
+
+ /* update status indicators - cursor, header, etc. */
+ gpencil_draw_status_indicators(p);
+
+ /* process last operations before exiting */
+ switch (estate) {
+ case OPERATOR_FINISHED:
+ /* one last flush before we're done */
+ WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX need a nicer one that will work
break;
-
- default:
- //printf("\t\tGP unknown event - %d \n", event->type);
+
+ case OPERATOR_RUNNING_MODAL|OPERATOR_PASS_THROUGH:
+ /* event doesn't need to be handled */
+ //printf("unhandled event -> %d (mmb? = %d | mmv? = %d)\n", event->type, event->type == MIDDLEMOUSE, event->type==MOUSEMOVE);
break;
}
- return OPERATOR_RUNNING_MODAL;
+ /* return status code */
+ return estate;
}
/* ------------------------------- */
@@ -1546,8 +1709,6 @@ static EnumPropertyItem prop_gpencil_drawmodes[] = {
void GPENCIL_OT_draw (wmOperatorType *ot)
{
- PropertyRNA *prop;
-
/* identifiers */
ot->name= "Grease Pencil Draw";
ot->idname= "GPENCIL_OT_draw";
@@ -1564,8 +1725,7 @@ void GPENCIL_OT_draw (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* settings for drawing */
- prop= RNA_def_enum(ot->srna, "mode", prop_gpencil_drawmodes, 0, "Mode", "Way to intepret mouse movements.");
- RNA_def_property_flag(prop, PROP_HIDDEN);
+ RNA_def_enum(ot->srna, "mode", prop_gpencil_drawmodes, 0, "Mode", "Way to intepret mouse movements.");
RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", "");
}
diff --git a/source/blender/editors/include/BIF_glutil.h b/source/blender/editors/include/BIF_glutil.h
index 8f37baf9af1..3fa07da0437 100644
--- a/source/blender/editors/include/BIF_glutil.h
+++ b/source/blender/editors/include/BIF_glutil.h
@@ -197,7 +197,7 @@ void gla2DSetMap(gla2DDrawInfo *di, struct rctf *rect);
/* use this for platform hacks. glPointSize is solved here */
void bglBegin(int mode);
void bglEnd(void);
-int bglPointHack();
+int bglPointHack(void);
void bglVertex3fv(float *vec);
void bglVertex3f(float x, float y, float z);
void bglVertex2fv(float *vec);
diff --git a/source/blender/editors/include/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h
index 5fb7fa41752..22e85857251 100644
--- a/source/blender/editors/include/ED_anim_api.h
+++ b/source/blender/editors/include/ED_anim_api.h
@@ -35,6 +35,7 @@ struct AnimData;
struct bContext;
struct wmKeyConfig;
+struct ReportList;
struct ScrArea;
struct ARegion;
struct View2D;
@@ -73,7 +74,8 @@ typedef struct bAnimContext {
struct Scene *scene; /* active scene */
struct Object *obact; /* active object */
ListBase *markers; /* active set of markers */
- ListBase *reports; /* pointer to current reports list */ // XXX not yet used
+
+ struct ReportList *reports; /* pointer to current reports list */
} bAnimContext;
/* Main Data container types */
@@ -86,7 +88,7 @@ typedef enum eAnimCont_Types {
ANIMCONT_DOPESHEET, /* dopesheet (bDopesheet) */
ANIMCONT_FCURVES, /* animation F-Curves (bDopesheet) */
ANIMCONT_DRIVERS, /* drivers (bDopesheet) */
- ANIMCONT_NLA, /* nla (bDopesheet) */
+ ANIMCONT_NLA /* nla (bDopesheet) */
} eAnimCont_Types;
/* --------------- Channels -------------------- */
@@ -151,6 +153,7 @@ typedef enum eAnim_ChannelType {
ANIMTYPE_DSARM,
ANIMTYPE_DSMESH,
ANIMTYPE_DSTEX,
+ ANIMTYPE_DSLAT,
ANIMTYPE_SHAPEKEY,
@@ -161,7 +164,7 @@ typedef enum eAnim_ChannelType {
ANIMTYPE_NLAACTION,
/* always as last item, the total number of channel types... */
- ANIMTYPE_NUM_TYPES,
+ ANIMTYPE_NUM_TYPES
} eAnim_ChannelType;
/* types of keyframe data in bAnimListElem */
@@ -175,7 +178,7 @@ typedef enum eAnim_KeyType {
ALE_SCE, /* Scene summary */
ALE_OB, /* Object summary */
ALE_ACT, /* Action summary */
- ALE_GROUP, /* Action Group summary */
+ ALE_GROUP /* Action Group summary */
} eAnim_KeyType;
/* ----------------- Filtering -------------------- */
@@ -228,6 +231,8 @@ typedef enum eAnimFilter_Flags {
#define FILTER_MBALL_OBJD(mb) ((mb->flag2 & MB_DS_EXPAND))
#define FILTER_ARM_OBJD(arm) ((arm->flag & ARM_DS_EXPAND))
#define FILTER_MESH_OBJD(me) ((me->flag & ME_DS_EXPAND))
+#define FILTER_LATTICE_OBJD(lt) ((lt->flag & LT_DS_EXPAND))
+
/* 'Sub-object/Action' channels (flags stored in Action) */
#define SEL_ACTC(actc) ((actc->flag & ACT_SELECTED))
#define EXPANDED_ACTC(actc) ((actc->flag & ACT_COLLAPSED)==0)
@@ -325,17 +330,17 @@ typedef enum eAnimChannels_SetFlag {
ACHANNEL_SETFLAG_CLEAR = 0, /* turn off */
ACHANNEL_SETFLAG_ADD, /* turn on */
ACHANNEL_SETFLAG_INVERT, /* on->off, off->on */
- ACHANNEL_SETFLAG_TOGGLE, /* some on -> all off // all on */
+ ACHANNEL_SETFLAG_TOGGLE /* some on -> all off // all on */
} eAnimChannels_SetFlag;
/* types of settings for AnimChannels */
typedef enum eAnimChannel_Settings {
- ACHANNEL_SETTING_SELECT = 0,
+ ACHANNEL_SETTING_SELECT = 0,
ACHANNEL_SETTING_PROTECT, // warning: for drawing UI's, need to check if this is off (maybe inverse this later)
ACHANNEL_SETTING_MUTE,
ACHANNEL_SETTING_EXPAND,
ACHANNEL_SETTING_VISIBLE, /* only for Graph Editor */
- ACHANNEL_SETTING_SOLO, /* only for NLA Tracks */
+ ACHANNEL_SETTING_SOLO /* only for NLA Tracks */
} eAnimChannel_Settings;
@@ -343,7 +348,7 @@ typedef enum eAnimChannel_Settings {
typedef struct bAnimChannelType {
/* type data */
/* name of the channel type, for debugging */
- char *channel_type_name;
+ const char *channel_type_name;
/* drawing */
/* get RGB color that is used to draw the majority of the backdrop */
@@ -442,7 +447,7 @@ enum {
/* time indication in seconds or frames */
DRAWCFRA_UNIT_SECONDS = (1<<1),
/* show time-offset line */
- DRAWCFRA_SHOW_TIMEOFS = (1<<2),
+ DRAWCFRA_SHOW_TIMEOFS = (1<<2)
} eAnimEditDraw_CurrentFrame;
/* main call to draw current-frame indicator in an Animation Editor */
@@ -517,7 +522,7 @@ typedef enum eAnimUnitConv_Flags {
/* only touch selected BezTriples */
ANIM_UNITCONV_ONLYSEL = (1<<2),
/* only touch selected vertices */
- ANIM_UNITCONV_SELVERTS = (1<<3),
+ ANIM_UNITCONV_SELVERTS = (1<<3)
} eAnimUnitConv_Flags;
/* Get unit conversion factor for given ID + F-Curve */
diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h
index 6055b9eecb3..be63b1bf1ce 100644
--- a/source/blender/editors/include/ED_armature.h
+++ b/source/blender/editors/include/ED_armature.h
@@ -27,6 +27,10 @@
#ifndef ED_ARMATURE_H
#define ED_ARMATURE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct bArmature;
struct Base;
struct bContext;
@@ -38,6 +42,7 @@ struct ListBase;
struct MeshDeformModifierData;
struct Object;
struct RegionView3D;
+struct ReportList;
struct Scene;
struct SK_Sketch;
struct View3D;
@@ -86,8 +91,8 @@ typedef struct EditBone
#define BONESEL_NOSEL (1<<31) /* Indicates a negative number */
/* useful macros */
-#define EBONE_VISIBLE(arm, ebone) ((arm->layer & ebone->layer) && !(ebone->flag & BONE_HIDDEN_A))
-#define EBONE_EDITABLE(ebone) ((ebone->flag & BONE_SELECTED) && !(ebone->flag & BONE_EDITMODE_LOCKED))
+#define EBONE_VISIBLE(arm, ebone) (((arm)->layer & (ebone)->layer) && !((ebone)->flag & BONE_HIDDEN_A))
+#define EBONE_EDITABLE(ebone) (((ebone)->flag & BONE_SELECTED) && !((ebone)->flag & BONE_EDITMODE_LOCKED))
/* used in bone_select_hierachy() */
#define BONE_SELECT_PARENT 0
@@ -102,20 +107,21 @@ void ED_keymap_armature(struct wmKeyConfig *keyconf);
void ED_armature_from_edit(struct Object *obedit);
void ED_armature_to_edit(struct Object *ob);
void ED_armature_edit_free(struct Object *ob);
-void ED_armature_deselectall(struct Object *obedit, int toggle);
+void ED_armature_deselect_all(struct Object *obedit, int toggle);
+void ED_armature_deselect_all_visible(struct Object *obedit);
int ED_do_pose_selectbuffer(struct Scene *scene, struct Base *base, unsigned int *buffer,
short hits, short extend);
int mouse_armature(struct bContext *C, short mval[2], int extend);
int join_armature_exec(struct bContext *C, struct wmOperator *op);
struct Bone *get_indexed_bone (struct Object *ob, int index);
-float ED_rollBoneToVector(EditBone *bone, float new_up_axis[3]);
+float ED_rollBoneToVector(EditBone *bone, const float new_up_axis[3], const short axis_only);
EditBone *ED_armature_bone_get_mirrored(struct ListBase *edbo, EditBone *ebo); // XXX this is needed for populating the context iterators
void ED_armature_sync_selection(struct ListBase *edbo);
void ED_armature_validate_active(struct bArmature *arm);
void add_primitive_bone(struct Scene *scene, struct View3D *v3d, struct RegionView3D *rv3d);
-struct EditBone *ED_armature_edit_bone_add(struct bArmature *arm, char *name);
+struct EditBone *ED_armature_edit_bone_add(struct bArmature *arm, const char *name);
void ED_armature_edit_bone_remove(struct bArmature *arm, EditBone *exBone);
void transform_armature_mirror_update(struct Object *obedit);
@@ -128,20 +134,21 @@ void ED_armature_apply_transform(struct Object *ob, float mat[4][4]);
#define ARM_GROUPS_ENVELOPE 2
#define ARM_GROUPS_AUTO 3
-void create_vgroups_from_armature(struct Scene *scene, struct Object *ob, struct Object *par, int mode, int mirror);
+void create_vgroups_from_armature(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct Object *par, int mode, int mirror);
void auto_align_armature(struct Scene *scene, struct View3D *v3d, short mode);
void unique_editbone_name(struct ListBase *ebones, char *name, EditBone *bone); /* if bone is already in list, pass it as param to ignore it */
void ED_armature_bone_rename(struct bArmature *arm, char *oldnamep, char *newnamep);
-void undo_push_armature(struct bContext *C, char *name);
+void undo_push_armature(struct bContext *C, const char *name);
/* poseobject.c */
+struct Object *ED_object_pose_armature(struct Object *ob);
void ED_armature_exit_posemode(struct bContext *C, struct Base *base);
void ED_armature_enter_posemode(struct bContext *C, struct Base *base);
int ED_pose_channel_in_IK_chain(struct Object *ob, struct bPoseChannel *pchan);
void ED_pose_deselectall(struct Object *ob, int test);
-void ED_pose_recalculate_paths(struct bContext *C, struct Scene *scene, struct Object *ob);
+void ED_pose_recalculate_paths(struct Scene *scene, struct Object *ob);
/* sketch */
@@ -159,7 +166,7 @@ int BIF_currentTemplate(const struct bContext *C);
void BIF_freeTemplates(struct bContext *C);
void BIF_setTemplate(struct bContext *C, int index);
int BIF_nbJointsTemplate(const struct bContext *C);
-char * BIF_nameBoneTemplate(const struct bContext *C);
+const char * BIF_nameBoneTemplate(const struct bContext *C);
void BDR_drawSketch(const struct bContext *vc);
int BDR_drawSketchNames(struct ViewContext *vc);
@@ -168,6 +175,10 @@ int BDR_drawSketchNames(struct ViewContext *vc);
void mesh_deform_bind(struct Scene *scene,
struct MeshDeformModifierData *mmd,
float *vertexcos, int totvert, float cagemat[][4]);
+
+#ifdef __cplusplus
+}
+#endif
#endif /* ED_ARMATURE_H */
diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h
index 0ff98b504d0..ec3c5e69830 100644
--- a/source/blender/editors/include/ED_curve.h
+++ b/source/blender/editors/include/ED_curve.h
@@ -52,7 +52,7 @@ void CU_select_all(struct Object *obedit);
void CU_select_swap(struct Object *obedit);
-void undo_push_curve (struct bContext *C, char *name);
+void undo_push_curve (struct bContext *C, const char *name);
ListBase *curve_get_editcurve(struct Object *ob);
void load_editNurb (struct Object *obedit);
@@ -63,14 +63,14 @@ void free_curve_editNurb (struct Curve *cu);
int mouse_nurb (struct bContext *C, short mval[2], int extend);
-struct Nurb *add_nurbs_primitive(struct bContext *C, float mat[4][4], int type, int newname);
+struct Nurb *add_nurbs_primitive(struct bContext *C, float mat[4][4], int type, int newob);
-int isNurbsel (struct Nurb *nu);;
+int isNurbsel (struct Nurb *nu);
int join_curve_exec (struct bContext *C, struct wmOperator *op);
/* editfont.h */
-void undo_push_font (struct bContext *C, char *name);
+void undo_push_font (struct bContext *C, const char *name);
void make_editText (struct Object *obedit);
void load_editText (struct Object *obedit);
void free_editText (struct Object *obedit);
@@ -83,5 +83,7 @@ ListBase *ED_curve_editnurbs(struct Curve *cu);
void ED_curve_beztcpy(struct EditNurb *editnurb, struct BezTriple *dst, struct BezTriple *src, int count);
void ED_curve_bpcpy(struct EditNurb *editnurb, struct BPoint *dst, struct BPoint *src, int count);
+int ED_curve_updateAnimPaths(struct Object *obedit);
+
#endif /* ED_CURVE_H */
diff --git a/source/blender/editors/include/ED_fileselect.h b/source/blender/editors/include/ED_fileselect.h
index 5001323cb61..a7d763ca4c8 100644
--- a/source/blender/editors/include/ED_fileselect.h
+++ b/source/blender/editors/include/ED_fileselect.h
@@ -93,5 +93,7 @@ void ED_fileselect_clear(struct bContext *C, struct SpaceFile *sfile);
void ED_fileselect_exit(struct bContext *C, struct SpaceFile *sfile);
+int ED_file_extension_icon(char *relname);
+
#endif /* ED_FILES_H */
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index 6c5a0cc3bf3..92c090beb8a 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -29,6 +29,7 @@
#define ED_GPENCIL_H
struct ListBase;
+struct bContext;
struct bScreen;
struct ScrArea;
struct ARegion;
@@ -55,6 +56,10 @@ typedef struct tGPspoint {
float pressure; /* pressure of tablet at this point */
} tGPspoint;
+
+/* Check if 'sketching sessions' are enabled */
+#define GPENCIL_SKETCH_SESSIONS_ON(scene) ((scene)->toolsettings->gpencil_flags & GP_TOOL_FLAG_PAINTSESSIONS_ON)
+
/* ----------- Grease Pencil Tools/Context ------------- */
struct bGPdata **gpencil_data_get_pointers(struct bContext *C, struct PointerRNA *ptr);
@@ -76,5 +81,27 @@ void draw_gpencil_view3d_ext(struct Scene *scene, struct View3D *v3d, struct ARe
void gpencil_panel_standard(const struct bContext *C, struct Panel *pa);
+/* ----------- Grease-Pencil AnimEdit API ------------------ */
+
+void gplayer_make_cfra_list(struct bGPDlayer *gpl, ListBase *elems, short onlysel);
+
+void deselect_gpencil_layers(void *data, short select_mode);
+
+short is_gplayer_frame_selected(struct bGPDlayer *gpl);
+void set_gplayer_frame_selection(struct bGPDlayer *gpl, short mode);
+void select_gpencil_frames(struct bGPDlayer *gpl, short select_mode);
+void select_gpencil_frame(struct bGPDlayer *gpl, int selx, short select_mode);
+void borderselect_gplayer_frames(struct bGPDlayer *gpl, float min, float max, short select_mode);
+
+void delete_gpencil_layers(void);
+void delete_gplayer_frames(struct bGPDlayer *gpl);
+void duplicate_gplayer_frames(struct bGPDlayer *gpd);
+
+void free_gpcopybuf(void);
+void copy_gpdata(void);
+void paste_gpdata(void);
+
+void snap_gplayer_frames(struct bGPDlayer *gpl, short mode);
+void mirror_gplayer_frames(struct bGPDlayer *gpl, short mode);
#endif /* ED_GPENCIL_H */
diff --git a/source/blender/editors/include/ED_image.h b/source/blender/editors/include/ED_image.h
index 1d674112b8d..7f507eab276 100644
--- a/source/blender/editors/include/ED_image.h
+++ b/source/blender/editors/include/ED_image.h
@@ -29,10 +29,13 @@
#define ED_IMAGE_H
struct SpaceImage;
+struct Main;
struct bContext;
struct Image;
struct ImageUser;
+struct ToolSettings;
struct uiBlock;
+struct wmWindowManager;
/* space_image.c, exported for transform */
struct Image *ED_space_image(struct SpaceImage *sima);
@@ -47,6 +50,8 @@ void ED_space_image_aspect(struct SpaceImage *sima, float *aspx, float *aspy);
void ED_space_image_zoom(struct SpaceImage *sima, struct ARegion *ar, float *zoomx, float *zoomy);
void ED_space_image_uv_aspect(struct SpaceImage *sima, float *aspx, float *aspy);
+void ED_space_image_paint_update(struct wmWindowManager *wm, struct ToolSettings *settings);
+
void ED_image_size(struct Image *ima, int *width, int *height);
void ED_image_aspect(struct Image *ima, float *aspx, float *aspy);
void ED_image_uv_aspect(struct Image *ima, float *aspx, float *aspy);
@@ -57,7 +62,7 @@ int ED_space_image_show_uvedit(struct SpaceImage *sima, struct Object *obedit);
int ED_space_image_show_uvshadow(struct SpaceImage *sima, struct Object *obedit);
/* UI level image (texture) updating... render calls own stuff (too) */
-void ED_image_update_frame(const struct bContext *C);
+void ED_image_update_frame(const struct Main *mainp, int cfra);
/* image_render.c, export for screen_ops.c, render operator */
void ED_space_image_output(struct bContext *C);
diff --git a/source/blender/editors/include/ED_info.h b/source/blender/editors/include/ED_info.h
index 33b890cea60..ece57d19ace 100644
--- a/source/blender/editors/include/ED_info.h
+++ b/source/blender/editors/include/ED_info.h
@@ -27,6 +27,6 @@
/* info_stats.c */
void ED_info_stats_clear(struct Scene *scene);
-char *ED_info_stats_string(struct Scene *scene);
+const char *ED_info_stats_string(struct Scene *scene);
#endif /* ED_INFO_H */
diff --git a/source/blender/editors/include/ED_keyframes_draw.h b/source/blender/editors/include/ED_keyframes_draw.h
index 78a645d6b50..10ddf6baaeb 100644
--- a/source/blender/editors/include/ED_keyframes_draw.h
+++ b/source/blender/editors/include/ED_keyframes_draw.h
@@ -100,7 +100,7 @@ typedef enum eKeyframeShapeDrawOpts {
} eKeyframeShapeDrawOpts;
/* draw simple diamond-shape keyframe (with OpenGL) */
-void draw_keyframe_shape(float x, float y, float xscale, float hsize, short sel, short key_type, short mode);
+void draw_keyframe_shape(float x, float y, float xscale, float hsize, short sel, short key_type, short mode, float alpha);
/* ******************************* Methods ****************************** */
@@ -136,7 +136,7 @@ void scene_to_keylist(struct bDopeSheet *ads, struct Scene *sce, struct DLRBT_Tr
void summary_to_keylist(struct bAnimContext *ac, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
/* Grease Pencil Layer */
// XXX not restored
-void gpl_to_keylist(struct bDopeSheet *ads, struct bGPDlayer *gpl, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+void gpl_to_keylist(struct bDopeSheet *ads, struct bGPDlayer *gpl, struct DLRBT_Tree *keys);
/* ActKeyColumn API ---------------- */
/* Comparator callback used for ActKeyColumns and cframe float-value pointer */
diff --git a/source/blender/editors/include/ED_keyframes_edit.h b/source/blender/editors/include/ED_keyframes_edit.h
index 60f2526191c..2a7ce9b540b 100644
--- a/source/blender/editors/include/ED_keyframes_edit.h
+++ b/source/blender/editors/include/ED_keyframes_edit.h
@@ -53,7 +53,7 @@ typedef enum eEditKeyframes_Validate {
BEZT_OK_SELECTED,
BEZT_OK_VALUE,
BEZT_OK_VALUERANGE,
- BEZT_OK_REGION,
+ BEZT_OK_REGION
} eEditKeyframes_Validate;
/* ------------ */
@@ -67,13 +67,13 @@ typedef enum eEditKeyframes_Select {
/* remove ok keyframes from selection */
SELECT_SUBTRACT = (1<<2),
/* flip ok status of keyframes based on key status */
- SELECT_INVERT = (1<<3),
+ SELECT_INVERT = (1<<3)
} eEditKeyframes_Select;
/* "selection map" building modes */
typedef enum eEditKeyframes_SelMap {
SELMAP_MORE = 0,
- SELMAP_LESS,
+ SELMAP_LESS
} eEditKeyframes_SelMap;
/* snapping tools */
@@ -83,7 +83,7 @@ typedef enum eEditKeyframes_Snap {
SNAP_KEYS_NEARSEC,
SNAP_KEYS_NEARMARKER,
SNAP_KEYS_HORIZONTAL,
- SNAP_KEYS_VALUE,
+ SNAP_KEYS_VALUE
} eEditKeyframes_Snap;
/* mirroring tools */
@@ -92,7 +92,7 @@ typedef enum eEditKeyframes_Mirror {
MIRROR_KEYS_YAXIS,
MIRROR_KEYS_XAXIS,
MIRROR_KEYS_MARKER,
- MIRROR_KEYS_VALUE,
+ MIRROR_KEYS_VALUE
} eEditKeyframes_Mirror;
/* ************************************************ */
@@ -152,6 +152,29 @@ typedef struct KeyframeEditCD_Remap {
float newMin, newMax; /* new range */
} KeyframeEditCD_Remap;
+/* Paste options */
+typedef enum eKeyPasteOffset {
+ /* paste keys starting at current frame */
+ KEYFRAME_PASTE_OFFSET_CFRA_START,
+ /* paste keys ending at current frame */
+ KEYFRAME_PASTE_OFFSET_CFRA_END,
+ /* paste keys relative to the current frame when copying */
+ KEYFRAME_PASTE_OFFSET_CFRA_RELATIVE,
+ /* paste keys from original time */
+ KEYFRAME_PASTE_OFFSET_NONE
+} eKeyPasteOffset;
+
+typedef enum eKeyMergeMode {
+ /* overlay existing with new keys */
+ KEYFRAME_PASTE_MERGE_MIX,
+ /* replace entire fcurve */
+ KEYFRAME_PASTE_MERGE_OVER,
+ /* overwrite keys in pasted range */
+ KEYFRAME_PASTE_MERGE_OVER_RANGE,
+ /* overwrite keys in pasted range (use all keyframe start & end for range) */
+ KEYFRAME_PASTE_MERGE_OVER_RANGE_ALL
+} eKeyMergeMode;
+
/* ---------------- Looping API --------------------- */
/* functions for looping over keyframes */
@@ -212,6 +235,7 @@ void bezt_remap_times(KeyframeEditData *ked, struct BezTriple *bezt);
void delete_fcurve_key(struct FCurve *fcu, int index, short do_recalc);
void delete_fcurve_keys(struct FCurve *fcu);
+void clear_fcurve_keys(struct FCurve *fcu);
void duplicate_fcurve_keys(struct FCurve *fcu);
void clean_fcurve(struct FCurve *fcu, float thresh);
@@ -222,7 +246,8 @@ void sample_fcurve(struct FCurve *fcu);
void free_anim_copybuf(void);
short copy_animedit_keys(struct bAnimContext *ac, ListBase *anim_data);
-short paste_animedit_keys(struct bAnimContext *ac, ListBase *anim_data);
+short paste_animedit_keys(struct bAnimContext *ac, ListBase *anim_data,
+ const eKeyPasteOffset offset_mode, const eKeyMergeMode merge_mode);
/* ************************************************ */
diff --git a/source/blender/editors/include/ED_keyframing.h b/source/blender/editors/include/ED_keyframing.h
index fc5e3a43a62..3fea3fa03a5 100644
--- a/source/blender/editors/include/ED_keyframing.h
+++ b/source/blender/editors/include/ED_keyframing.h
@@ -28,6 +28,10 @@
#ifndef ED_KEYFRAMING_H
#define ED_KEYFRAMING_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct ListBase;
struct ID;
struct Scene;
@@ -43,9 +47,11 @@ struct bConstraint;
struct bContext;
struct wmOperatorType;
+struct ReportList;
struct PointerRNA;
struct PropertyRNA;
+struct EnumPropertyItem;
#include "RNA_types.h"
@@ -89,7 +95,7 @@ int insert_vert_fcurve(struct FCurve *fcu, float x, float y, short flag);
* Use this to insert a keyframe using the current value being keyframed, in the
* nominated F-Curve (no creation of animation data performed). Returns success.
*/
-short insert_keyframe_direct(struct PointerRNA ptr, struct PropertyRNA *prop, struct FCurve *fcu, float cfra, short flag);
+short insert_keyframe_direct(struct ReportList *reports, struct PointerRNA ptr, struct PropertyRNA *prop, struct FCurve *fcu, float cfra, short flag);
/* -------- */
@@ -97,12 +103,12 @@ short insert_keyframe_direct(struct PointerRNA ptr, struct PropertyRNA *prop, st
* Use this to create any necessary animation data, and then insert a keyframe
* using the current value being keyframed, in the relevant place. Returns success.
*/
-short insert_keyframe(struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag);
+short insert_keyframe(struct ReportList *reports, struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag);
/* Main Keyframing API call:
* Use this to delete keyframe on current frame for relevant channel. Will perform checks just in case.
*/
-short delete_keyframe(struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag);
+short delete_keyframe(struct ReportList *reports, struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag);
/* ************ Keying Sets ********************** */
@@ -179,7 +185,7 @@ struct KeyingSet *ANIM_builtin_keyingset_get_named(struct KeyingSet *prevKS, con
KeyingSetInfo *ANIM_keyingset_info_find_named(const char name[]);
/* for RNA type registrations... */
-void ANIM_keyingset_info_register(const struct bContext *C, KeyingSetInfo *ksi);
+void ANIM_keyingset_info_register(KeyingSetInfo *ksi);
void ANIM_keyingset_info_unregister(const struct bContext *C, KeyingSetInfo *ksi);
/* cleanup on exit */
@@ -193,37 +199,50 @@ struct KeyingSet *ANIM_scene_get_active_keyingset(struct Scene *scene);
/* Get the index of the Keying Set provided, for the given Scene */
int ANIM_scene_get_keyingset_index(struct Scene *scene, struct KeyingSet *ks);
+/* Get Keying Set to use for Auto-Keyframing some transforms */
+struct KeyingSet *ANIM_get_keyingset_for_autokeying(struct Scene *scene, const char *tranformKSName);
+
/* Create (and show) a menu containing all the Keying Sets which can be used in the current context */
-void ANIM_keying_sets_menu_setup(struct bContext *C, char title[], char op_name[]);
+void ANIM_keying_sets_menu_setup(struct bContext *C, const char title[], const char op_name[]);
+
+/* Dynamically populate an enum of Keying Sets */
+struct EnumPropertyItem *ANIM_keying_sets_enum_itemf(struct bContext *C, struct PointerRNA *ptr, int *free);
/* Check if KeyingSet can be used in the current context */
short ANIM_keyingset_context_ok_poll(struct bContext *C, struct KeyingSet *ks);
/* ************ Drivers ********************** */
+/* Flags for use by driver creation calls */
+typedef enum eCreateDriverFlags {
+ CREATEDRIVER_WITH_DEFAULT_DVAR = (1<<0), /* create drivers with a default variable for nicer UI */
+} eCreateDriverFlags;
+
+/* -------- */
+
/* Returns whether there is a driver in the copy/paste buffer to paste */
short ANIM_driver_can_paste(void);
/* Main Driver Management API calls:
* Add a new driver for the specified property on the given ID block
*/
-short ANIM_add_driver(struct ID *id, const char rna_path[], int array_index, short flag, int type);
+short ANIM_add_driver(struct ReportList *reports, struct ID *id, const char rna_path[], int array_index, short flag, int type);
/* Main Driver Management API calls:
* Remove the driver for the specified property on the given ID block (if available)
*/
-short ANIM_remove_driver(struct ID *id, const char rna_path[], int array_index, short flag);
+short ANIM_remove_driver(struct ReportList *reports, struct ID *id, const char rna_path[], int array_index, short flag);
/* Main Driver Management API calls:
* Make a copy of the driver for the specified property on the given ID block
*/
-short ANIM_copy_driver(struct ID *id, const char rna_path[], int array_index, short flag);
+short ANIM_copy_driver(struct ReportList *reports, struct ID *id, const char rna_path[], int array_index, short flag);
/* Main Driver Management API calls:
* Add a new driver for the specified property on the given ID block or replace an existing one
* with the driver + driver-curve data from the buffer
*/
-short ANIM_paste_driver(struct ID *id, const char rna_path[], int array_index, short flag);
+short ANIM_paste_driver(struct ReportList *reports, struct ID *id, const char rna_path[], int array_index, short flag);
/* ************ Auto-Keyframing ********************** */
/* Notes:
@@ -240,8 +259,12 @@ short ANIM_paste_driver(struct ID *id, const char rna_path[], int array_index, s
#define IS_AUTOKEY_ON(scene) ((scene) ? (scene->toolsettings->autokey_mode & AUTOKEY_ON) : (U.autokey_mode & AUTOKEY_ON))
/* check the mode for auto-keyframing (per scene takes presidence) */
#define IS_AUTOKEY_MODE(scene, mode) ((scene) ? (scene->toolsettings->autokey_mode == AUTOKEY_MODE_##mode) : (U.autokey_mode == AUTOKEY_MODE_##mode))
- /* check if a flag is set for auto-keyframing (as userprefs only!) */
-#define IS_AUTOKEY_FLAG(flag) (U.autokey_flag & AUTOKEY_FLAG_##flag)
+ /* check if a flag is set for auto-keyframing (per scene takes presidence) */
+#define IS_AUTOKEY_FLAG(scene, flag) \
+ ((scene)? \
+ ((scene->toolsettings->autokey_flag & AUTOKEY_FLAG_##flag) || (U.autokey_flag & AUTOKEY_FLAG_##flag)) \
+ : \
+ (U.autokey_flag & AUTOKEY_FLAG_##flag))
/* auto-keyframing feature - checks for whether anything should be done for the current frame */
int autokeyframe_cfra_can_key(struct Scene *scene, struct ID *id);
@@ -277,4 +300,8 @@ typedef enum eAnimFilterFlags {
ANIMFILTER_KEYS_NOSKEY = (1<<10), /* don't include shape keys (for geometry) */
} eAnimFilterFlags;
+#ifdef __cplusplus
+}
+#endif
+
#endif /* ED_KEYFRAMING_H */
diff --git a/source/blender/editors/include/ED_markers.h b/source/blender/editors/include/ED_markers.h
index e5e1f3cef10..22c171128bd 100644
--- a/source/blender/editors/include/ED_markers.h
+++ b/source/blender/editors/include/ED_markers.h
@@ -30,6 +30,7 @@
struct wmKeyConfig;
struct bContext;
+struct bAnimContext;
struct TimeMarker;
/* Drawing API ------------------------------ */
@@ -44,6 +45,9 @@ void draw_markers_time(const struct bContext *C, int flag);
/* Backend API ----------------------------- */
+ListBase *ED_context_get_markers(const struct bContext *C);
+ListBase *ED_animcontext_get_markers(const struct bAnimContext *ac);
+
struct TimeMarker *ED_markers_find_nearest_marker(ListBase *markers, float x);
int ED_markers_find_nearest_marker_time(ListBase *markers, float x);
@@ -51,6 +55,8 @@ void ED_markers_get_minmax(ListBase *markers, short sel, float *first, float *la
void ED_markers_make_cfra_list(ListBase *markers, ListBase *lb, short sel);
+struct TimeMarker *ED_markers_get_first_selected(ListBase *markers);
+
/* Operators ------------------------------ */
/* called in screen_ops.c:ED_operatortypes_screen() */
diff --git a/source/blender/editors/include/ED_mball.h b/source/blender/editors/include/ED_mball.h
index 3fd74a9cdaf..f5021fb9570 100644
--- a/source/blender/editors/include/ED_mball.h
+++ b/source/blender/editors/include/ED_mball.h
@@ -41,5 +41,5 @@ void free_editMball(struct Object *obedit);
void make_editMball(struct Object *obedit);
void load_editMball(struct Object *obedit);
-void undo_push_mball(struct bContext *C, char *name);
+void undo_push_mball(struct bContext *C, const char *name);
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index 564fe04ca4d..057e5d3bf88 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -28,6 +28,10 @@
#ifndef ED_MESH_H
#define ED_MESH_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct ID;
struct View3D;
struct ARegion;
@@ -47,6 +51,9 @@ struct MDeformWeight;
struct MDeformVert;
struct Scene;
struct Mesh;
+struct MFace;
+struct MEdge;
+struct MVert;
struct MCol;
struct UvVertMap;
struct UvMapVert;
@@ -94,10 +101,6 @@ void ED_keymap_mesh(struct wmKeyConfig *keyconf);
/* editmesh.c */
-
-void ED_spacetypes_init(void);
-void ED_keymap_mesh(struct wmKeyConfig *keyconf);
-
void make_editMesh(struct Scene *scene, struct Object *ob);
void load_editMesh(struct Scene *scene, struct Object *ob);
void remake_editMesh(struct Scene *scene, struct Object *ob);
@@ -113,7 +116,7 @@ struct EditFace *EM_get_face_for_index(int index);
int EM_texFaceCheck(struct EditMesh *em);
int EM_vertColorCheck(struct EditMesh *em);
-void undo_push_mesh(struct bContext *C, char *name);
+void undo_push_mesh(struct bContext *C, const char *name);
/* editmesh_lib.c */
@@ -155,6 +158,8 @@ void EM_solidify(struct EditMesh *em, float dist);
int EM_deselect_nth(struct EditMesh *em, int nth);
+void EM_project_snap_verts(struct bContext *C, struct ARegion *ar, struct Object *obedit, struct EditMesh *em);
+
/* editmesh_mods.c */
extern unsigned int em_vertoffs, em_solidoffs, em_wireoffs;
@@ -175,12 +180,13 @@ void EM_deselect_by_material(struct EditMesh *em, int index);
void EM_automerge(struct Scene *scene, struct Object *obedit, int update);
/* editface.c */
+void paintface_flush_flags(struct Object *ob);
struct MTFace *EM_get_active_mtface(struct EditMesh *em, struct EditFace **act_efa, struct MCol **mcol, int sloppy);
-int face_select(struct bContext *C, struct Object *ob, short mval[2], int extend);
-void face_borderselect(struct bContext *C, struct Object *ob, struct rcti *rect, int select, int extend);
-void selectall_tface(struct Object *ob, int action);
-void select_linked_tfaces(struct bContext *C, struct Object *ob, short mval[2], int mode);
-int minmax_tface(struct Object *ob, float *min, float *max);
+int paintface_mouse_select(struct bContext *C, struct Object *ob, short mval[2], int extend);
+int do_paintface_box_select(struct ViewContext *vc, struct rcti *rect, int select, int extend);
+void paintface_deselect_all_visible(struct Object *ob, int action, short flush_flags);
+void paintface_select_linked(struct bContext *C, struct Object *ob, short mval[2], int mode);
+int paintface_minmax(struct Object *ob, float *min, float *max);
/* object_vgroup.c */
@@ -189,13 +195,16 @@ int minmax_tface(struct Object *ob, float *min, float *max);
#define WEIGHT_SUBTRACT 3
struct bDeformGroup *ED_vgroup_add(struct Object *ob);
-struct bDeformGroup *ED_vgroup_add_name(struct Object *ob, char *name);
-void ED_vgroup_select_by_name(struct Object *ob, char *name);
+struct bDeformGroup *ED_vgroup_add_name(struct Object *ob, const char *name);
+void ED_vgroup_delete(struct Object *ob, struct bDeformGroup *defgroup);
+void ED_vgroup_select_by_name(struct Object *ob, const char *name);
void ED_vgroup_data_create(struct ID *id);
int ED_vgroup_give_array(struct ID *id, struct MDeformVert **dvert_arr, int *dvert_tot);
int ED_vgroup_copy_array(struct Object *ob, struct Object *ob_from);
void ED_vgroup_mirror(struct Object *ob, int mirror_weights, int flip_vgroups);
+int ED_vgroup_object_is_edit_mode(struct Object *ob);
+
void ED_vgroup_vert_add(struct Object *ob, struct bDeformGroup *dg, int vertnum, float weight, int assignmode);
void ED_vgroup_vert_remove(struct Object *ob, struct bDeformGroup *dg, int vertnum);
float ED_vgroup_vert_weight(struct Object *ob, struct bDeformGroup *dg, int vertnum);
@@ -219,10 +228,14 @@ void ED_mesh_calc_normals(struct Mesh *me);
void ED_mesh_material_link(struct Mesh *me, struct Material *ma);
void ED_mesh_update(struct Mesh *mesh, struct bContext *C, int calc_edges);
-int ED_mesh_uv_texture_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me, const char *name, int active_set);
+int ED_mesh_uv_texture_add(struct bContext *C, struct Mesh *me, const char *name, int active_set);
int ED_mesh_uv_texture_remove(struct bContext *C, struct Object *ob, struct Mesh *me);
int ED_mesh_color_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me, const char *name, int active_set);
int ED_mesh_color_remove(struct bContext *C, struct Object *ob, struct Mesh *me);
+#ifdef __cplusplus
+}
+#endif
+
#endif /* ED_MESH_H */
diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h
index 6e42b772bef..d287066828f 100644
--- a/source/blender/editors/include/ED_node.h
+++ b/source/blender/editors/include/ED_node.h
@@ -40,7 +40,7 @@ void ED_init_node_butfuncs(void);
/* node_draw.c */
void ED_node_changed_update(struct ID *id, struct bNode *node);
-void ED_node_generic_update(struct Main *bmain, struct Scene *scene, struct bNodeTree *ntree, struct bNode *node);
+void ED_node_generic_update(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node);
/* node_edit.c */
void ED_node_shader_default(struct Material *ma);
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 04e70225f41..2f54c242717 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -28,6 +28,10 @@
#ifndef ED_OBJECT_H
#define ED_OBJECT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct Base;
struct bConstraint;
struct bContext;
@@ -100,12 +104,9 @@ struct Object *ED_object_add_type(struct bContext *C, int type, float *loc, floa
void ED_object_single_users(struct Main *bmain, struct Scene *scene, int full);
-/* cleanup */
-int object_is_libdata(struct Object *ob);
-int object_data_is_libdata(struct Object *ob);
/* object motion paths */
-void ED_objects_clear_paths(struct bContext *C, struct Scene *scene);
+void ED_objects_clear_paths(struct bContext *C);
void ED_objects_recalculate_paths(struct bContext *C, struct Scene *scene);
/* constraints */
@@ -121,7 +122,7 @@ void ED_object_constraint_dependency_update(struct Main *bmain, struct Scene *sc
/* object_lattice.c */
int mouse_lattice(struct bContext *C, short mval[2], int extend);
-void undo_push_lattice(struct bContext *C, char *name);
+void undo_push_lattice(struct bContext *C, const char *name);
/* object_lattice.c */
@@ -131,9 +132,9 @@ void ED_setflagsLatt(struct Object *obedit, int flag);
enum {
MODIFIER_APPLY_DATA=1,
MODIFIER_APPLY_SHAPE,
-};//eModifier_Apply_Mode
+} eModifier_Apply_Mode;
-struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, char *name, int type);
+struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, const char *name, int type);
int ED_object_modifier_remove(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, struct ModifierData *md);
int ED_object_modifier_move_down(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
int ED_object_modifier_move_up(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
@@ -141,5 +142,9 @@ int ED_object_modifier_convert(struct ReportList *reports, struct Main *bmain, s
int ED_object_modifier_apply(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct ModifierData *md, int mode);
int ED_object_modifier_copy(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
+#ifdef __cplusplus
+}
+#endif
+
#endif /* ED_OBJECT_H */
diff --git a/source/blender/editors/include/ED_particle.h b/source/blender/editors/include/ED_particle.h
index 87aa7ca9195..77c4b1bbed6 100644
--- a/source/blender/editors/include/ED_particle.h
+++ b/source/blender/editors/include/ED_particle.h
@@ -59,14 +59,16 @@ void PE_update_object(struct Scene *scene, struct Object *ob, int useflag);
int PE_mouse_particles(struct bContext *C, short *mval, int extend);
int PE_border_select(struct bContext *C, struct rcti *rect, int select, int extend);
int PE_circle_select(struct bContext *C, int selecting, short *mval, float rad);
-int PE_lasso_select(struct bContext *C, short mcords[][2], short moves, short select);
+int PE_lasso_select(struct bContext *C, short mcords[][2], short moves, short extend, short select);
+void PE_deselect_all_visible(struct PTCacheEdit *edit);
/* undo */
-void PE_undo_push(struct Scene *scene, char *str);
+void PE_undo_push(struct Scene *scene, const char *str);
void PE_undo_step(struct Scene *scene, int step);
void PE_undo(struct Scene *scene);
void PE_redo(struct Scene *scene);
void PE_undo_menu(struct Scene *scene, struct Object *ob);
+int PE_undo_valid(struct Scene *scene);
#endif /* ED_PARTICLE_H */
diff --git a/source/blender/editors/include/ED_render.h b/source/blender/editors/include/ED_render.h
index f34670da471..44d76b635a1 100644
--- a/source/blender/editors/include/ED_render.h
+++ b/source/blender/editors/include/ED_render.h
@@ -43,8 +43,6 @@ void ED_render_id_flush_update(struct Main *bmain, struct ID *id);
/* render_preview.c */
-#define _RENDERSIZE 140
-
/* stores rendered preview - is also used for icons */
typedef struct RenderInfo {
int pr_rectx;
diff --git a/source/blender/editors/include/ED_retopo.h b/source/blender/editors/include/ED_retopo.h
deleted file mode 100644
index e8d74411871..00000000000
--- a/source/blender/editors/include/ED_retopo.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2006 by Nicholas Bishop
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#ifndef ED_RETOPO_H
-#define ED_RETOPO_H
-
-#include "DNA_vec_types.h"
-
-/* For bglMats */
-#include "BIF_glutil.h"
-
-struct EditVert;
-struct Mesh;
-struct View3D;
-
-typedef struct RetopoViewData {
- bglMats mats;
-
- char queue_matrix_update;
-} RetopoViewData;
-
-typedef struct RetopoPaintPoint {
- struct RetopoPaintPoint *next, *prev;
- vec2s loc;
- short index;
- float co[3];
- struct EditVert *eve;
-} RetopoPaintPoint;
-
-typedef struct RetopoPaintLine {
- struct RetopoPaintLine *next, *prev;
- ListBase points;
- ListBase hitlist; /* RetopoPaintHit */
- RetopoPaintPoint *cyclic;
-} RetopoPaintLine;
-
-typedef struct RetopoPaintSel {
- struct RetopoPaintSel *next, *prev;
- RetopoPaintLine *line;
- char first;
-} RetopoPaintSel;
-
-typedef struct RetopoPaintData {
- char in_drag;
- short sloc[2];
-
- ListBase lines;
- ListBase intersections; /* RetopoPaintPoint */
-
- short seldist;
- RetopoPaintSel nearest;
-
- struct View3D *paint_v3d;
-} RetopoPaintData;
-
-RetopoPaintData *get_retopo_paint_data(void);
-
-char retopo_mesh_check(void);
-char retopo_curve_check(void);
-
-void retopo_end_okee(void);
-
-void retopo_free_paint_data(RetopoPaintData *rpd);
-void retopo_free_paint(void);
-
-char retopo_mesh_paint_check(void);
-void retopo_paint_view_update(struct View3D *v3d);
-void retopo_force_update(void);
-void retopo_paint_toggle(void*,void*);
-char retopo_paint(const unsigned short event);
-void retopo_draw_paint_lines(void);
-RetopoPaintData *retopo_paint_data_copy(RetopoPaintData *rpd);
-
-void retopo_toggle(void*,void*);
-void retopo_do_vert(struct View3D *v3d, float *v);
-void retopo_do_all(void);
-void retopo_do_all_cb(void *, void *);
-void retopo_queue_updates(struct View3D *v3d);
-
-void retopo_matrix_update(struct View3D *v3d);
-
-void retopo_free_view_data(struct View3D *v3d);
-
-#endif
-
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 3478447b058..1ceb2216938 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -57,7 +57,7 @@ void ED_region_tag_redraw(struct ARegion *ar);
void ED_region_tag_redraw_partial(struct ARegion *ar, struct rcti *rct);
void ED_region_tag_redraw_overlay(struct ARegion *ar);
void ED_region_panels_init(struct wmWindowManager *wm, struct ARegion *ar);
-void ED_region_panels(const struct bContext *C, struct ARegion *ar, int vertical, char *context, int contextnr);
+void ED_region_panels(const struct bContext *C, struct ARegion *ar, int vertical, const char *context, int contextnr);
void ED_region_header_init(struct ARegion *ar);
void ED_region_header(const struct bContext *C, struct ARegion *ar);
void ED_region_toggle_hidden(struct bContext *C, struct ARegion *ar);
@@ -69,7 +69,7 @@ void ED_spacetypes_keymap(struct wmKeyConfig *keyconf);
int ED_area_header_switchbutton(const struct bContext *C, struct uiBlock *block, int yco);
int ED_area_header_standardbuttons(const struct bContext *C, struct uiBlock *block, int yco);
void ED_area_overdraw(struct bContext *C);
-void ED_area_overdraw_flush(struct bContext *C, struct ScrArea *sa, struct ARegion *ar);
+void ED_area_overdraw_flush(struct ScrArea *sa, struct ARegion *ar);
/* areas */
@@ -78,6 +78,7 @@ void ED_area_exit(struct bContext *C, struct ScrArea *sa);
int ED_screen_area_active(const struct bContext *C);
void ED_area_do_listen(ScrArea *sa, struct wmNotifier *note);
void ED_area_tag_redraw(ScrArea *sa);
+void ED_area_tag_redraw_regiontype(ScrArea *sa, int type);
void ED_area_tag_refresh(ScrArea *sa);
void ED_area_do_refresh(struct bContext *C, ScrArea *sa);
void ED_area_headerprint(ScrArea *sa, const char *str);
@@ -91,7 +92,7 @@ void ED_screen_draw(struct wmWindow *win);
void ED_screen_refresh(struct wmWindowManager *wm, struct wmWindow *win);
void ED_screen_do_listen(struct wmWindow *win, struct wmNotifier *note);
bScreen *ED_screen_duplicate(struct wmWindow *win, struct bScreen *sc);
-bScreen *ED_screen_add(struct wmWindow *win, struct Scene *scene, char *name);
+bScreen *ED_screen_add(struct wmWindow *win, struct Scene *scene, const char *name);
void ED_screen_set(struct bContext *C, struct bScreen *sc);
void ED_screen_delete(struct bContext *C, struct bScreen *sc);
void ED_screen_set_scene(struct bContext *C, struct Scene *scene);
@@ -108,7 +109,8 @@ struct ScrArea *ED_screen_full_toggle(struct bContext *C, struct wmWindow *win,
void ED_screen_new_window(struct bContext *C, struct rcti *position, int type);
/* anim */
-void ED_update_for_newframe(const struct bContext *C, int mute);
+void ED_update_for_newframe(struct Main *bmain, struct Scene *scene, struct bScreen *screen, int mute);
+
void ED_refresh_viewport_fps(struct bContext *C);
int ED_screen_animation_play(struct bContext *C, int sync, int mode);
@@ -123,28 +125,38 @@ int ED_operator_areaactive(struct bContext *C);
int ED_operator_regionactive(struct bContext *C);
int ED_operator_scene_editable(struct bContext *C);
+int ED_operator_objectmode(struct bContext *C);
int ED_operator_view3d_active(struct bContext *C);
+int ED_operator_region_view3d_active(struct bContext *C);
+int ED_operator_animview_active(struct bContext *C);
int ED_operator_timeline_active(struct bContext *C);
int ED_operator_outliner_active(struct bContext *C);
+int ED_operator_outliner_active_no_editobject(struct bContext *C);
int ED_operator_file_active(struct bContext *C);
int ED_operator_action_active(struct bContext *C);
int ED_operator_buttons_active(struct bContext *C);
int ED_operator_node_active(struct bContext *C);
-int ED_operator_ipo_active(struct bContext *C);
+int ED_operator_graphedit_active(struct bContext *C);
int ED_operator_sequencer_active(struct bContext *C);
int ED_operator_image_active(struct bContext *C);
int ED_operator_nla_active(struct bContext *C);
int ED_operator_logic_active(struct bContext *C);
+int ED_operator_info_active(struct bContext *C);
+int ED_operator_console_active(struct bContext *C);
+
int ED_operator_object_active(struct bContext *C);
int ED_operator_object_active_editable(struct bContext *C);
+int ED_operator_object_active_editable_mesh(struct bContext *C);
int ED_operator_editmesh(struct bContext *C);
int ED_operator_editmesh_view3d(struct bContext *C);
+int ED_operator_editmesh_region_view3d(struct bContext *C);
int ED_operator_editarmature(struct bContext *C);
int ED_operator_editcurve(struct bContext *C);
int ED_operator_editsurf(struct bContext *C);
int ED_operator_editsurfcurve(struct bContext *C);
+int ED_operator_editsurfcurve_region_view3d(struct bContext *C);
int ED_operator_editfont(struct bContext *C);
int ED_operator_editlattice(struct bContext *C);
int ED_operator_editmball(struct bContext *C);
diff --git a/source/blender/editors/include/ED_screen_types.h b/source/blender/editors/include/ED_screen_types.h
index c5abd5465d7..240075565af 100644
--- a/source/blender/editors/include/ED_screen_types.h
+++ b/source/blender/editors/include/ED_screen_types.h
@@ -38,6 +38,7 @@ typedef struct ScreenAnimData {
short refresh;
short flag; /* flags for playback */
int sfra; /* frame that playback was started from */
+ int nextfra; /* next frame to go to (when ANIMPLAY_FLAG_USE_NEXT_FRAME is set) */
} ScreenAnimData;
/* for animplayer */
@@ -50,6 +51,8 @@ enum {
ANIMPLAY_FLAG_SYNC = (1<<2),
/* don't drop frames (and ignore SCE_FRAME_DROP flag) */
ANIMPLAY_FLAG_NO_SYNC = (1<<3),
+ /* use nextfra at next timer update */
+ ANIMPLAY_FLAG_USE_NEXT_FRAME = (1<<4)
};
/* ----------------------------------------------------- */
diff --git a/source/blender/editors/include/ED_sculpt.h b/source/blender/editors/include/ED_sculpt.h
index 506813ce626..cac6a1a2d13 100644
--- a/source/blender/editors/include/ED_sculpt.h
+++ b/source/blender/editors/include/ED_sculpt.h
@@ -40,6 +40,7 @@ void ED_operatortypes_sculpt(void);
void sculpt_get_redraw_planes(float planes[4][4], struct ARegion *ar,
struct RegionView3D *rv3d, struct Object *ob);
void ED_sculpt_force_update(struct bContext *C);
+void ED_sculpt_modifiers_changed(struct Object *ob);
/* paint_ops.c */
void ED_operatortypes_paint(void);
@@ -51,5 +52,6 @@ void ED_keymap_paint(struct wmKeyConfig *keyconf);
int ED_undo_paint_step(struct bContext *C, int type, int step, const char *name);
void ED_undo_paint_free(void);
+int ED_undo_paint_valid(int type, const char *name);
#endif
diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h
index d8954be08c9..5864449a490 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -126,7 +126,7 @@ void BIF_selectTransformOrientationValue(struct bContext *C, int orientation);
void ED_getTransformOrientationMatrix(const struct bContext *C, float orientation_mat[][3], int activeOnly);
struct EnumPropertyItem *BIF_enumTransformOrientation(struct bContext *C);
-char * BIF_menustringTransformOrientation(const struct bContext *C, char *title); /* the returned value was allocated and needs to be freed after use */
+const char * BIF_menustringTransformOrientation(const struct bContext *C, const char *title); /* the returned value was allocated and needs to be freed after use */
int BIF_countTransformOrientation(const struct bContext *C);
void BIF_TransformSetUndo(char *str);
@@ -142,6 +142,7 @@ void BIF_selectOrientation(void);
#define P_GEO_SNAP (P_SNAP|(1 << 4))
#define P_ALIGN_SNAP (P_GEO_SNAP|(1 << 5))
#define P_CONSTRAINT (1 << 6)
+#define P_OPTIONS (1 << 7)
void Transform_Properties(struct wmOperatorType *ot, int flags);
diff --git a/source/blender/editors/include/ED_types.h b/source/blender/editors/include/ED_types.h
index 96a5d5857fa..1887a97e635 100644
--- a/source/blender/editors/include/ED_types.h
+++ b/source/blender/editors/include/ED_types.h
@@ -35,11 +35,6 @@
#define SELECT 1
#define ACTIVE 2
-/* nonstandard define, sometimes in math.h */
-#ifndef MAXFLOAT
-#define MAXFLOAT ((float)3.40282347e+38)
-#endif
-
/* buttons */
#define XIC 20
#define YIC 20
diff --git a/source/blender/editors/include/ED_util.h b/source/blender/editors/include/ED_util.h
index 7bf3ec88a4b..1cbf1d0e998 100644
--- a/source/blender/editors/include/ED_util.h
+++ b/source/blender/editors/include/ED_util.h
@@ -43,7 +43,7 @@ void ED_editors_exit (struct bContext *C);
/* ************** Undo ************************ */
/* undo.c */
-void ED_undo_push (struct bContext *C, char *str);
+void ED_undo_push (struct bContext *C, const char *str);
void ED_undo_push_op (struct bContext *C, struct wmOperator *op);
void ED_undo_pop_op (struct bContext *C, struct wmOperator *op);
void ED_undo_pop (struct bContext *C);
@@ -51,8 +51,15 @@ void ED_undo_redo (struct bContext *C);
void ED_OT_undo (struct wmOperatorType *ot);
void ED_OT_redo (struct wmOperatorType *ot);
+int ED_undo_operator_repeat(struct bContext *C, struct wmOperator *op);
+ /* convenience since UI callbacks use this mostly*/
+void ED_undo_operator_repeat_cb(struct bContext *C, void *arg_op, void *arg_unused);
+void ED_undo_operator_repeat_cb_evt(struct bContext *C, void *arg_op, int arg_unused);
+
+int ED_undo_valid (const struct bContext *C, const char *undoname);
+
/* undo_editmode.c */
-void undo_editmode_push(struct bContext *C, char *name,
+void undo_editmode_push(struct bContext *C, const char *name,
void * (*getdata)(struct bContext *C),
void (*freedata)(void *),
void (*to_editmode)(void *, void *),
@@ -66,11 +73,13 @@ void undo_editmode_menu (struct bContext *C);
void undo_editmode_clear (void);
void undo_editmode_step (struct bContext *C, int step);
-
/* ************** XXX OLD CRUFT WARNING ************* */
void apply_keyb_grid(int shift, int ctrl, float *val, float fac1, float fac2, float fac3, int invert);
-int GetButStringLength(char *str);
+int GetButStringLength(const char *str);
+
+/* where else to go ? */
+void unpack_menu(struct bContext *C, const char *opname, const char *id_name, const char *abs_name, const char *folder, struct PackedFile *pf);
#endif /* ED_UTIL_H */
diff --git a/source/blender/editors/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h
index 1710a8439d1..353f89323e6 100644
--- a/source/blender/editors/include/ED_uvedit.h
+++ b/source/blender/editors/include/ED_uvedit.h
@@ -41,16 +41,24 @@ void ED_operatortypes_uvedit(void);
void ED_keymap_uvedit(struct wmKeyConfig *keyconf);
void ED_uvedit_assign_image(struct Scene *scene, struct Object *obedit, struct Image *ima, struct Image *previma);
-void ED_uvedit_set_tile(struct bContext *C, struct Scene *scene, struct Object *obedit, struct Image *ima, int curtile, int dotile);
int ED_uvedit_minmax(struct Scene *scene, struct Image *ima, struct Object *obedit, float *min, float *max);
int ED_uvedit_test_silent(struct Object *obedit);
int ED_uvedit_test(struct Object *obedit);
-int uvedit_face_visible(struct Scene *scene, struct Image *ima, struct EditFace *efa, struct MTFace *tf);
-int uvedit_face_selected(struct Scene *scene, struct EditFace *efa, struct MTFace *tf);
+/* visibility and selection */
int uvedit_edge_selected(struct Scene *scene, struct EditFace *efa, struct MTFace *tf, int i);
+int uvedit_face_selected(struct Scene *scene, struct EditFace *efa, struct MTFace *tf);
+int uvedit_face_visible_nolocal(struct Scene *scene, struct EditFace *efa);
+int uvedit_face_visible(struct Scene *scene, struct Image *ima, struct EditFace *efa, struct MTFace *tf);
int uvedit_uv_selected(struct Scene *scene, struct EditFace *efa, struct MTFace *tf, int i);
+void uvedit_edge_deselect(struct Scene *scene, struct EditFace *efa, struct MTFace *tf, int i);
+void uvedit_edge_select(struct Scene *scene, struct EditFace *efa, struct MTFace *tf, int i);
+void uvedit_face_deselect(struct Scene *scene, struct EditFace *efa, struct MTFace *tf);
+void uvedit_face_select(struct Scene *scene, struct EditFace *efa, struct MTFace *tf);
+void uvedit_uv_deselect(struct Scene *scene, struct EditFace *efa, struct MTFace *tf, int i);
+void uvedit_uv_select(struct Scene *scene, struct EditFace *efa, struct MTFace *tf, int i);
+
int ED_uvedit_nearest_uv(struct Scene *scene, struct Object *obedit, struct Image *ima, float co[2], float uv[2]);
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index f5a84aa4c19..4afe2ff10a2 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -47,6 +47,7 @@ struct RegionView3D;
struct Scene;
struct View3D;
struct ViewContext;
+struct wmWindow;
/* for derivedmesh drawing callbacks, for view3d_select, .... */
@@ -63,6 +64,7 @@ typedef struct ViewContext {
typedef struct ViewDepths {
unsigned short w, h;
+ short x, y; /* only for temp use for sub-rects, added to ar->winx/y */
float *depths;
double depth_range[2];
@@ -78,6 +80,7 @@ void window_to_3d_delta(struct ARegion *ar, float *vec, short mx, short my);
void view3d_unproject(struct bglMats *mats, float out[3], const short x, const short y, const float z);
/* Depth buffer */
+void view3d_update_depths(struct ARegion *ar);
float read_cached_depth(struct ViewContext *vc, int x, int y);
void request_depth_update(struct RegionView3D *rv3d);
@@ -105,9 +108,9 @@ int get_view3d_viewplane(struct View3D *v3d, struct RegionView3D *rv3d, int winx
int get_view3d_ortho(struct View3D *v3d, struct RegionView3D *rv3d);
void view3d_get_object_project_mat(struct RegionView3D *v3d, struct Object *ob, float pmat[4][4]);
void view3d_project_float(struct ARegion *a, float *vec, float *adr, float mat[4][4]);
-void view3d_calc_camera_border(struct Scene *scene, struct ARegion *ar, struct RegionView3D *rv3d, struct View3D *v3d, struct rctf *viewborder_r);
+void view3d_calc_camera_border(struct Scene *scene, struct ARegion *ar, struct RegionView3D *rv3d, struct View3D *v3d, struct rctf *viewborder_r, short do_shift);
-/* drawobject.c itterators */
+/* drawobject.c iterators */
void mesh_foreachScreenVert(struct ViewContext *vc, void (*func)(void *userData, struct EditVert *eve, int x, int y, int index), void *userData, int clipVerts);
void mesh_foreachScreenEdge(struct ViewContext *vc, void (*func)(void *userData, struct EditEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, int clipVerts);
void mesh_foreachScreenFace(struct ViewContext *vc, void (*func)(void *userData, struct EditFace *efa, int x, int y, int index), void *userData);
@@ -117,8 +120,9 @@ void lattice_foreachScreenVert(struct ViewContext *vc, void (*func)(void *userDa
void ED_view3d_local_clipping(struct RegionView3D *rv3d, float mat[][4]);
int view3d_test_clipping(struct RegionView3D *rv3d, float *vec, int local);
void view3d_align_axis_to_vector(struct View3D *v3d, struct RegionView3D *rv3d, int axisidx, float vec[3]);
+float view3d_pixel_size(struct RegionView3D *rv3d, const float co[3]);
-void drawcircball(int mode, float *cent, float rad, float tmat[][4]);
+void drawcircball(int mode, const float cent[3], float rad, float tmat[][4]);
/* backbuffer select and draw support */
void view3d_validate_backbuf(struct ViewContext *vc);
@@ -132,8 +136,9 @@ int view_autodist(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, s
/* only draw so view_autodist_simple can be called many times after */
int view_autodist_init(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, int mode);
-int view_autodist_simple(struct ARegion *ar, short *mval, float mouse_worldloc[3], int margin, float *force_depth);
-int view_autodist_depth(struct ARegion *ar, short *mval, int margin, float *depth);
+int view_autodist_simple(struct ARegion *ar, short mval[2], float mouse_worldloc[3], int margin, float *force_depth);
+int view_autodist_depth(struct ARegion *ar, short mval[2], int margin, float *depth);
+int view_autodist_depth_segment(struct ARegion *ar, short mval_sta[2], short mval_end[2], int margin, float *depth);
/* select */
#define MAXPICKBUF 10000
@@ -141,6 +146,7 @@ short view3d_opengl_select(struct ViewContext *vc, unsigned int *buffer, unsigne
void view3d_set_viewcontext(struct bContext *C, struct ViewContext *vc);
void view3d_operator_needs_opengl(const struct bContext *C);
+void view3d_region_operator_needs_opengl(struct wmWindow *win, struct ARegion *ar);
void view3d_get_view_aligned_coordinate(struct ViewContext *vc, float *fp, short mval[2]);
void view3d_get_transformation(struct ARegion *ar, struct RegionView3D *rv3d, struct Object *ob, struct bglMats *mats);
@@ -163,10 +169,11 @@ void ED_view3d_draw_offscreen(struct Scene *scene, struct View3D *v3d, struct AR
struct ImBuf *ED_view3d_draw_offscreen_imbuf(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, int sizex, int sizey, unsigned int flag);
struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height, unsigned int flag, int drawtype);
-void view3d_clipping_local(struct RegionView3D *rv3d, float mat[][4]);
Base *ED_view3d_give_base_under_cursor(struct bContext *C, short *mval);
-void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar);
+void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar, short do_clip);
+
+unsigned int ED_viewedit_datamask(struct bScreen *screen);
#endif /* ED_VIEW3D_H */
diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h
index 3e8420df7eb..a145df908b9 100644
--- a/source/blender/editors/include/UI_icons.h
+++ b/source/blender/editors/include/UI_icons.h
@@ -30,886 +30,976 @@
once from UI_resources.h for the internal icon enum and
once for interface_api.c for the definition of the RNA enum for the icons */
-DEF_ICON(ICON_BLENDER)
-DEF_ICON(ICON_QUESTION)
-DEF_ICON(ICON_ERROR)
-DEF_ICON(ICON_CANCEL)
-DEF_ICON(ICON_TRIA_RIGHT)
-DEF_ICON(ICON_TRIA_DOWN)
-DEF_ICON(ICON_TRIA_LEFT)
-DEF_ICON(ICON_TRIA_UP)
-DEF_ICON(ICON_ARROW_LEFTRIGHT)
-DEF_ICON(ICON_PLUS)
-DEF_ICON(ICON_DISCLOSURE_TRI_DOWN)
-DEF_ICON(ICON_DISCLOSURE_TRI_RIGHT)
-DEF_ICON(ICON_RADIOBUT_OFF)
-DEF_ICON(ICON_RADIOBUT_ON)
-DEF_ICON(ICON_MENU_PANEL)
-DEF_ICON(ICON_PYTHON)
-DEF_ICON(ICON_BLANK003)
-DEF_ICON(ICON_DOT)
-DEF_ICON(ICON_BLANK004)
-DEF_ICON(ICON_X)
-DEF_ICON(ICON_BLANK005)
-DEF_ICON(ICON_GO_LEFT)
-DEF_ICON(ICON_PLUG)
-DEF_ICON(ICON_UI)
-DEF_ICON(ICON_NODE)
-DEF_ICON(ICON_NODE_SEL)
+/* ICON_ prefix added */
+DEF_ICON(BLENDER)
+DEF_ICON(QUESTION)
+DEF_ICON(ERROR)
+DEF_ICON(CANCEL)
+DEF_ICON(TRIA_RIGHT)
+DEF_ICON(TRIA_DOWN)
+DEF_ICON(TRIA_LEFT)
+DEF_ICON(TRIA_UP)
+DEF_ICON(ARROW_LEFTRIGHT)
+DEF_ICON(PLUS)
+DEF_ICON(DISCLOSURE_TRI_DOWN)
+DEF_ICON(DISCLOSURE_TRI_RIGHT)
+DEF_ICON(RADIOBUT_OFF)
+DEF_ICON(RADIOBUT_ON)
+DEF_ICON(MENU_PANEL)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK002)
+ DEF_ICON(BLANK003)
+#endif
+DEF_ICON(DOT)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK004)
+#endif
+DEF_ICON(X)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK005)
+#endif
+DEF_ICON(GO_LEFT)
+DEF_ICON(PLUG)
+DEF_ICON(UI)
+DEF_ICON(NODE)
+DEF_ICON(NODE_SEL)
/* ui */
-DEF_ICON(ICON_FULLSCREEN)
-DEF_ICON(ICON_SPLITSCREEN)
-DEF_ICON(ICON_RIGHTARROW_THIN)
-DEF_ICON(ICON_BORDERMOVE)
-DEF_ICON(ICON_VIEWZOOM)
-DEF_ICON(ICON_ZOOMIN)
-DEF_ICON(ICON_ZOOMOUT)
-DEF_ICON(ICON_PANEL_CLOSE)
-DEF_ICON(ICON_COPY_ID) //ICON_BLANK009
-DEF_ICON(ICON_EYEDROPPER)
-DEF_ICON(ICON_LINK_AREA) //ICON_BLANK010
-DEF_ICON(ICON_AUTO)
-DEF_ICON(ICON_CHECKBOX_DEHLT)
-DEF_ICON(ICON_CHECKBOX_HLT)
-DEF_ICON(ICON_UNLOCKED)
-DEF_ICON(ICON_LOCKED)
-DEF_ICON(ICON_UNPINNED)
-DEF_ICON(ICON_PINNED)
-DEF_ICON(ICON_SCREEN_BACK)
-DEF_ICON(ICON_RIGHTARROW)
-DEF_ICON(ICON_DOWNARROW_HLT)
-DEF_ICON(ICON_DOTSUP)
-DEF_ICON(ICON_DOTSDOWN)
-DEF_ICON(ICON_LINK)
-DEF_ICON(ICON_INLINK)
-DEF_ICON(ICON_PLUGIN)
+DEF_ICON(FULLSCREEN)
+DEF_ICON(SPLITSCREEN)
+DEF_ICON(RIGHTARROW_THIN)
+DEF_ICON(BORDERMOVE)
+DEF_ICON(VIEWZOOM)
+DEF_ICON(ZOOMIN)
+DEF_ICON(ZOOMOUT)
+DEF_ICON(PANEL_CLOSE)
+DEF_ICON(COPY_ID) //ICON_BLANK009
+DEF_ICON(EYEDROPPER)
+DEF_ICON(LINK_AREA) //ICON_BLANK010
+DEF_ICON(AUTO)
+DEF_ICON(CHECKBOX_DEHLT)
+DEF_ICON(CHECKBOX_HLT)
+DEF_ICON(UNLOCKED)
+DEF_ICON(LOCKED)
+DEF_ICON(UNPINNED)
+DEF_ICON(PINNED)
+DEF_ICON(SCREEN_BACK)
+DEF_ICON(RIGHTARROW)
+DEF_ICON(DOWNARROW_HLT)
+DEF_ICON(DOTSUP)
+DEF_ICON(DOTSDOWN)
+DEF_ICON(LINK)
+DEF_ICON(INLINK)
+DEF_ICON(PLUGIN)
/* various ui */
-DEF_ICON(ICON_HELP)
-DEF_ICON(ICON_GHOST_ENABLED)
-DEF_ICON(ICON_COLOR)
-DEF_ICON(ICON_LINKED)
-DEF_ICON(ICON_UNLINKED)
-DEF_ICON(ICON_HAND)
-DEF_ICON(ICON_ZOOM_ALL)
-DEF_ICON(ICON_ZOOM_SELECTED)
-DEF_ICON(ICON_ZOOM_PREVIOUS)
-DEF_ICON(ICON_ZOOM_IN)
-DEF_ICON(ICON_ZOOM_OUT)
-DEF_ICON(ICON_RENDER_REGION)
-DEF_ICON(ICON_BORDER_RECT)
-DEF_ICON(ICON_BORDER_LASSO)
-DEF_ICON(ICON_FREEZE)
-DEF_ICON(ICON_STYLUS_PRESSURE)
-DEF_ICON(ICON_GHOST_DISABLED)
-DEF_ICON(ICON_NEW)
-DEF_ICON(ICON_FILE_TICK)
-DEF_ICON(ICON_QUIT)
-DEF_ICON(ICON_URL)
-DEF_ICON(ICON_RECOVER_LAST)
-DEF_ICON(ICON_BLANK038)
-DEF_ICON(ICON_FULLSCREEN_ENTER)
-DEF_ICON(ICON_FULLSCREEN_EXIT)
-DEF_ICON(ICON_BLANK1) // Not actually blank - this is used all over the place
+DEF_ICON(HELP)
+DEF_ICON(GHOST_ENABLED)
+DEF_ICON(COLOR)
+DEF_ICON(LINKED)
+DEF_ICON(UNLINKED)
+DEF_ICON(HAND)
+DEF_ICON(ZOOM_ALL)
+DEF_ICON(ZOOM_SELECTED)
+DEF_ICON(ZOOM_PREVIOUS)
+DEF_ICON(ZOOM_IN)
+DEF_ICON(ZOOM_OUT)
+DEF_ICON(RENDER_REGION)
+DEF_ICON(BORDER_RECT)
+DEF_ICON(BORDER_LASSO)
+DEF_ICON(FREEZE)
+DEF_ICON(STYLUS_PRESSURE)
+DEF_ICON(GHOST_DISABLED)
+DEF_ICON(NEW)
+DEF_ICON(FILE_TICK)
+DEF_ICON(QUIT)
+DEF_ICON(URL)
+DEF_ICON(RECOVER_LAST)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK038)
+#endif
+DEF_ICON(FULLSCREEN_ENTER)
+DEF_ICON(FULLSCREEN_EXIT)
+DEF_ICON(BLANK1) // Not actually blank - this is used all over the place
/* BUTTONS */
-DEF_ICON(ICON_LAMP)
-DEF_ICON(ICON_MATERIAL)
-DEF_ICON(ICON_TEXTURE)
-DEF_ICON(ICON_ANIM)
-DEF_ICON(ICON_WORLD)
-DEF_ICON(ICON_SCENE)
-DEF_ICON(ICON_EDIT)
-DEF_ICON(ICON_GAME)
-DEF_ICON(ICON_RADIO)
-DEF_ICON(ICON_SCRIPT)
-DEF_ICON(ICON_PARTICLES)
-DEF_ICON(ICON_PHYSICS)
-DEF_ICON(ICON_SPEAKER)
-DEF_ICON(ICON_TEXTURE_SHADED) //ICON_BLANK041
-DEF_ICON(ICON_BLANK042)
-DEF_ICON(ICON_BLANK043)
-DEF_ICON(ICON_BLANK044)
-DEF_ICON(ICON_BLANK045)
-DEF_ICON(ICON_BLANK046)
-DEF_ICON(ICON_BLANK047)
-DEF_ICON(ICON_BLANK048)
-DEF_ICON(ICON_BLANK049)
-DEF_ICON(ICON_BLANK050)
-DEF_ICON(ICON_BLANK051)
-DEF_ICON(ICON_BLANK052)
-DEF_ICON(ICON_BLANK052b)
-
+DEF_ICON(LAMP)
+DEF_ICON(MATERIAL)
+DEF_ICON(TEXTURE)
+DEF_ICON(ANIM)
+DEF_ICON(WORLD)
+DEF_ICON(SCENE)
+DEF_ICON(EDIT)
+DEF_ICON(GAME)
+DEF_ICON(RADIO)
+DEF_ICON(SCRIPT)
+DEF_ICON(PARTICLES)
+DEF_ICON(PHYSICS)
+DEF_ICON(SPEAKER)
+DEF_ICON(TEXTURE_SHADED) //ICON_BLANK041
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK042)
+ DEF_ICON(BLANK043)
+ DEF_ICON(BLANK044)
+ DEF_ICON(BLANK045)
+ DEF_ICON(BLANK046)
+ DEF_ICON(BLANK047)
+ DEF_ICON(BLANK048)
+ DEF_ICON(BLANK049)
+ DEF_ICON(BLANK050)
+ DEF_ICON(BLANK051)
+ DEF_ICON(BLANK052)
+ DEF_ICON(BLANK052b)
+#endif
/* EDITORS */
-DEF_ICON(ICON_VIEW3D)
-DEF_ICON(ICON_IPO)
-DEF_ICON(ICON_OOPS)
-DEF_ICON(ICON_BUTS)
-DEF_ICON(ICON_FILESEL)
-DEF_ICON(ICON_IMAGE_COL)
-DEF_ICON(ICON_INFO)
-DEF_ICON(ICON_SEQUENCE)
-DEF_ICON(ICON_TEXT)
-DEF_ICON(ICON_IMASEL)
-DEF_ICON(ICON_SOUND)
-DEF_ICON(ICON_ACTION)
-DEF_ICON(ICON_NLA)
-DEF_ICON(ICON_SCRIPTWIN)
-DEF_ICON(ICON_TIME)
-DEF_ICON(ICON_NODETREE)
-DEF_ICON(ICON_LOGIC)
-DEF_ICON(ICON_CONSOLE)
-DEF_ICON(ICON_PREFERENCES)
-DEF_ICON(ICON_ASSET_MANAGER)
-DEF_ICON(ICON_BLANK057)
-DEF_ICON(ICON_BLANK058)
-DEF_ICON(ICON_BLANK059)
-DEF_ICON(ICON_BLANK060)
-DEF_ICON(ICON_BLANK061)
-DEF_ICON(ICON_BLANK061b)
-
+DEF_ICON(VIEW3D)
+DEF_ICON(IPO)
+DEF_ICON(OOPS)
+DEF_ICON(BUTS)
+DEF_ICON(FILESEL)
+DEF_ICON(IMAGE_COL)
+DEF_ICON(INFO)
+DEF_ICON(SEQUENCE)
+DEF_ICON(TEXT)
+DEF_ICON(IMASEL)
+DEF_ICON(SOUND)
+DEF_ICON(ACTION)
+DEF_ICON(NLA)
+DEF_ICON(SCRIPTWIN)
+DEF_ICON(TIME)
+DEF_ICON(NODETREE)
+DEF_ICON(LOGIC)
+DEF_ICON(CONSOLE)
+DEF_ICON(PREFERENCES)
+DEF_ICON(ASSET_MANAGER)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK057)
+ DEF_ICON(BLANK058)
+ DEF_ICON(BLANK059)
+ DEF_ICON(BLANK060)
+ DEF_ICON(BLANK061)
+ DEF_ICON(BLANK061b)
+#endif
+
/* MODES */
-DEF_ICON(ICON_OBJECT_DATAMODE) // XXX fix this up
-DEF_ICON(ICON_EDITMODE_HLT)
-DEF_ICON(ICON_FACESEL_HLT)
-DEF_ICON(ICON_VPAINT_HLT)
-DEF_ICON(ICON_TPAINT_HLT)
-DEF_ICON(ICON_WPAINT_HLT)
-DEF_ICON(ICON_SCULPTMODE_HLT)
-DEF_ICON(ICON_POSE_HLT)
-DEF_ICON(ICON_PARTICLEMODE)
-DEF_ICON(ICON_LIGHTPAINT)
-DEF_ICON(ICON_BLANK063)
-DEF_ICON(ICON_BLANK064)
-DEF_ICON(ICON_BLANK065)
-DEF_ICON(ICON_BLANK066)
-DEF_ICON(ICON_BLANK067)
-DEF_ICON(ICON_BLANK068)
-DEF_ICON(ICON_BLANK069)
-DEF_ICON(ICON_BLANK070)
-DEF_ICON(ICON_BLANK071)
-DEF_ICON(ICON_BLANK072)
-DEF_ICON(ICON_BLANK073)
-DEF_ICON(ICON_BLANK074)
-DEF_ICON(ICON_BLANK075)
-DEF_ICON(ICON_BLANK076)
-DEF_ICON(ICON_BLANK077)
-DEF_ICON(ICON_BLANK077b)
+DEF_ICON(OBJECT_DATAMODE) // XXX fix this up
+DEF_ICON(EDITMODE_HLT)
+DEF_ICON(FACESEL_HLT)
+DEF_ICON(VPAINT_HLT)
+DEF_ICON(TPAINT_HLT)
+DEF_ICON(WPAINT_HLT)
+DEF_ICON(SCULPTMODE_HLT)
+DEF_ICON(POSE_HLT)
+DEF_ICON(PARTICLEMODE)
+DEF_ICON(LIGHTPAINT)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK063)
+ DEF_ICON(BLANK064)
+ DEF_ICON(BLANK065)
+ DEF_ICON(BLANK066)
+ DEF_ICON(BLANK067)
+ DEF_ICON(BLANK068)
+ DEF_ICON(BLANK069)
+ DEF_ICON(BLANK070)
+ DEF_ICON(BLANK071)
+ DEF_ICON(BLANK072)
+ DEF_ICON(BLANK073)
+ DEF_ICON(BLANK074)
+ DEF_ICON(BLANK075)
+ DEF_ICON(BLANK076)
+ DEF_ICON(BLANK077)
+ DEF_ICON(BLANK077b)
+#endif
/* DATA */
-DEF_ICON(ICON_SCENE_DATA)
-DEF_ICON(ICON_RENDERLAYERS)
-DEF_ICON(ICON_WORLD_DATA)
-DEF_ICON(ICON_OBJECT_DATA)
-DEF_ICON(ICON_MESH_DATA)
-DEF_ICON(ICON_CURVE_DATA)
-DEF_ICON(ICON_META_DATA)
-DEF_ICON(ICON_LATTICE_DATA)
-DEF_ICON(ICON_LAMP_DATA)
-DEF_ICON(ICON_MATERIAL_DATA)
-DEF_ICON(ICON_TEXTURE_DATA)
-DEF_ICON(ICON_ANIM_DATA)
-DEF_ICON(ICON_CAMERA_DATA)
-DEF_ICON(ICON_PARTICLE_DATA)
-DEF_ICON(ICON_LIBRARY_DATA_DIRECT)
-DEF_ICON(ICON_GROUP)
-DEF_ICON(ICON_ARMATURE_DATA)
-DEF_ICON(ICON_POSE_DATA)
-DEF_ICON(ICON_BONE_DATA)
-DEF_ICON(ICON_CONSTRAINT)
-DEF_ICON(ICON_SHAPEKEY_DATA)
-DEF_ICON(ICON_CONSTRAINT_BONE)
-DEF_ICON(ICON_BLANK079)
-DEF_ICON(ICON_PACKAGE)
-DEF_ICON(ICON_UGLYPACKAGE)
-DEF_ICON(ICON_BLANK079b)
+DEF_ICON(SCENE_DATA)
+DEF_ICON(RENDERLAYERS)
+DEF_ICON(WORLD_DATA)
+DEF_ICON(OBJECT_DATA)
+DEF_ICON(MESH_DATA)
+DEF_ICON(CURVE_DATA)
+DEF_ICON(META_DATA)
+DEF_ICON(LATTICE_DATA)
+DEF_ICON(LAMP_DATA)
+DEF_ICON(MATERIAL_DATA)
+DEF_ICON(TEXTURE_DATA)
+DEF_ICON(ANIM_DATA)
+DEF_ICON(CAMERA_DATA)
+DEF_ICON(PARTICLE_DATA)
+DEF_ICON(LIBRARY_DATA_DIRECT)
+DEF_ICON(GROUP)
+DEF_ICON(ARMATURE_DATA)
+DEF_ICON(POSE_DATA)
+DEF_ICON(BONE_DATA)
+DEF_ICON(CONSTRAINT)
+DEF_ICON(SHAPEKEY_DATA)
+DEF_ICON(CONSTRAINT_BONE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK079)
+#endif
+DEF_ICON(PACKAGE)
+DEF_ICON(UGLYPACKAGE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK079b)
+#endif
/* DATA */
-DEF_ICON(ICON_BRUSH_DATA)
-DEF_ICON(ICON_IMAGE_DATA)
-DEF_ICON(ICON_FILE)
-DEF_ICON(ICON_FCURVE)
-DEF_ICON(ICON_FONT_DATA)
-DEF_ICON(ICON_RENDER_RESULT)
-DEF_ICON(ICON_SURFACE_DATA)
-DEF_ICON(ICON_EMPTY_DATA)
-DEF_ICON(ICON_SETTINGS)
-DEF_ICON(ICON_RENDER_ANIMATION)
-DEF_ICON(ICON_RENDER_STILL)
-DEF_ICON(ICON_BLANK080F)
-DEF_ICON(ICON_BOIDS)
-DEF_ICON(ICON_STRANDS)
-DEF_ICON(ICON_LIBRARY_DATA_INDIRECT)
-DEF_ICON(ICON_GREASEPENCIL)
-DEF_ICON(ICON_BLANK083)
-DEF_ICON(ICON_BLANK084)
-DEF_ICON(ICON_GROUP_BONE)
-DEF_ICON(ICON_GROUP_VERTEX)
-DEF_ICON(ICON_GROUP_VCOL)
-DEF_ICON(ICON_GROUP_UVS)
-DEF_ICON(ICON_BLANK089)
-DEF_ICON(ICON_BLANK090)
-DEF_ICON(ICON_RNA)
-DEF_ICON(ICON_RNA_ADD)
+DEF_ICON(BRUSH_DATA)
+DEF_ICON(IMAGE_DATA)
+DEF_ICON(FILE)
+DEF_ICON(FCURVE)
+DEF_ICON(FONT_DATA)
+DEF_ICON(RENDER_RESULT)
+DEF_ICON(SURFACE_DATA)
+DEF_ICON(EMPTY_DATA)
+DEF_ICON(SETTINGS)
+DEF_ICON(RENDER_ANIMATION)
+DEF_ICON(RENDER_STILL)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK080F)
+#endif
+DEF_ICON(BOIDS)
+DEF_ICON(STRANDS)
+DEF_ICON(LIBRARY_DATA_INDIRECT)
+DEF_ICON(GREASEPENCIL)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK083)
+ DEF_ICON(BLANK084)
+#endif
+DEF_ICON(GROUP_BONE)
+DEF_ICON(GROUP_VERTEX)
+DEF_ICON(GROUP_VCOL)
+DEF_ICON(GROUP_UVS)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK089)
+ DEF_ICON(BLANK090)
+#endif
+DEF_ICON(RNA)
+DEF_ICON(RNA_ADD)
/* available */
-DEF_ICON(ICON_BLANK092)
-DEF_ICON(ICON_BLANK093)
-DEF_ICON(ICON_BLANK094)
-DEF_ICON(ICON_BLANK095)
-DEF_ICON(ICON_BLANK096)
-DEF_ICON(ICON_BLANK097)
-DEF_ICON(ICON_BLANK098)
-DEF_ICON(ICON_BLANK099)
-DEF_ICON(ICON_BLANK100)
-DEF_ICON(ICON_BLANK101)
-DEF_ICON(ICON_BLANK102)
-DEF_ICON(ICON_BLANK103)
-DEF_ICON(ICON_BLANK104)
-DEF_ICON(ICON_BLANK105)
-DEF_ICON(ICON_BLANK106)
-DEF_ICON(ICON_BLANK107)
-DEF_ICON(ICON_BLANK108)
-DEF_ICON(ICON_BLANK109)
-DEF_ICON(ICON_BLANK110)
-DEF_ICON(ICON_BLANK111)
-DEF_ICON(ICON_BLANK112)
-DEF_ICON(ICON_BLANK113)
-DEF_ICON(ICON_BLANK114)
-DEF_ICON(ICON_BLANK115)
-DEF_ICON(ICON_BLANK116)
-DEF_ICON(ICON_BLANK116b)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK092)
+ DEF_ICON(BLANK093)
+ DEF_ICON(BLANK094)
+ DEF_ICON(BLANK095)
+ DEF_ICON(BLANK096)
+ DEF_ICON(BLANK097)
+ DEF_ICON(BLANK098)
+ DEF_ICON(BLANK099)
+ DEF_ICON(BLANK100)
+ DEF_ICON(BLANK101)
+ DEF_ICON(BLANK102)
+ DEF_ICON(BLANK103)
+ DEF_ICON(BLANK104)
+ DEF_ICON(BLANK105)
+ DEF_ICON(BLANK106)
+ DEF_ICON(BLANK107)
+ DEF_ICON(BLANK108)
+ DEF_ICON(BLANK109)
+ DEF_ICON(BLANK110)
+ DEF_ICON(BLANK111)
+ DEF_ICON(BLANK112)
+ DEF_ICON(BLANK113)
+ DEF_ICON(BLANK114)
+ DEF_ICON(BLANK115)
+ DEF_ICON(BLANK116)
+ DEF_ICON(BLANK116b)
+#endif
/* OUTLINER */
-DEF_ICON(ICON_OUTLINER_OB_EMPTY)
-DEF_ICON(ICON_OUTLINER_OB_MESH)
-DEF_ICON(ICON_OUTLINER_OB_CURVE)
-DEF_ICON(ICON_OUTLINER_OB_LATTICE)
-DEF_ICON(ICON_OUTLINER_OB_META)
-DEF_ICON(ICON_OUTLINER_OB_LAMP)
-DEF_ICON(ICON_OUTLINER_OB_CAMERA)
-DEF_ICON(ICON_OUTLINER_OB_ARMATURE)
-DEF_ICON(ICON_OUTLINER_OB_FONT)
-DEF_ICON(ICON_OUTLINER_OB_SURFACE)
-DEF_ICON(ICON_BLANK119)
-DEF_ICON(ICON_BLANK120)
-DEF_ICON(ICON_BLANK121)
-DEF_ICON(ICON_BLANK122)
-DEF_ICON(ICON_BLANK123)
-DEF_ICON(ICON_BLANK124)
-DEF_ICON(ICON_BLANK125)
-DEF_ICON(ICON_BLANK126)
-DEF_ICON(ICON_BLANK127)
-DEF_ICON(ICON_RESTRICT_VIEW_OFF)
-DEF_ICON(ICON_RESTRICT_VIEW_ON)
-DEF_ICON(ICON_RESTRICT_SELECT_OFF)
-DEF_ICON(ICON_RESTRICT_SELECT_ON)
-DEF_ICON(ICON_RESTRICT_RENDER_OFF)
-DEF_ICON(ICON_RESTRICT_RENDER_ON)
-DEF_ICON(ICON_BLANK127b)
+DEF_ICON(OUTLINER_OB_EMPTY)
+DEF_ICON(OUTLINER_OB_MESH)
+DEF_ICON(OUTLINER_OB_CURVE)
+DEF_ICON(OUTLINER_OB_LATTICE)
+DEF_ICON(OUTLINER_OB_META)
+DEF_ICON(OUTLINER_OB_LAMP)
+DEF_ICON(OUTLINER_OB_CAMERA)
+DEF_ICON(OUTLINER_OB_ARMATURE)
+DEF_ICON(OUTLINER_OB_FONT)
+DEF_ICON(OUTLINER_OB_SURFACE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK119)
+ DEF_ICON(BLANK120)
+ DEF_ICON(BLANK121)
+ DEF_ICON(BLANK122)
+ DEF_ICON(BLANK123)
+ DEF_ICON(BLANK124)
+ DEF_ICON(BLANK125)
+ DEF_ICON(BLANK126)
+ DEF_ICON(BLANK127)
+#endif
+DEF_ICON(RESTRICT_VIEW_OFF)
+DEF_ICON(RESTRICT_VIEW_ON)
+DEF_ICON(RESTRICT_SELECT_OFF)
+DEF_ICON(RESTRICT_SELECT_ON)
+DEF_ICON(RESTRICT_RENDER_OFF)
+DEF_ICON(RESTRICT_RENDER_ON)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK127b)
+#endif
/* OUTLINER */
-DEF_ICON(ICON_OUTLINER_DATA_EMPTY)
-DEF_ICON(ICON_OUTLINER_DATA_MESH)
-DEF_ICON(ICON_OUTLINER_DATA_CURVE)
-DEF_ICON(ICON_OUTLINER_DATA_LATTICE)
-DEF_ICON(ICON_OUTLINER_DATA_META)
-DEF_ICON(ICON_OUTLINER_DATA_LAMP)
-DEF_ICON(ICON_OUTLINER_DATA_CAMERA)
-DEF_ICON(ICON_OUTLINER_DATA_ARMATURE)
-DEF_ICON(ICON_OUTLINER_DATA_FONT)
-DEF_ICON(ICON_OUTLINER_DATA_SURFACE)
-DEF_ICON(ICON_OUTLINER_DATA_POSE)
-DEF_ICON(ICON_BLANK129)
-DEF_ICON(ICON_BLANK130)
-DEF_ICON(ICON_BLANK131)
-DEF_ICON(ICON_BLANK132)
-DEF_ICON(ICON_BLANK133)
-DEF_ICON(ICON_BLANK134)
-DEF_ICON(ICON_BLANK135)
-DEF_ICON(ICON_BLANK136)
-DEF_ICON(ICON_BLANK137)
-DEF_ICON(ICON_BLANK138)
-DEF_ICON(ICON_BLANK139)
-DEF_ICON(ICON_BLANK140)
-DEF_ICON(ICON_BLANK141)
-DEF_ICON(ICON_BLANK142)
-DEF_ICON(ICON_BLANK142b)
+DEF_ICON(OUTLINER_DATA_EMPTY)
+DEF_ICON(OUTLINER_DATA_MESH)
+DEF_ICON(OUTLINER_DATA_CURVE)
+DEF_ICON(OUTLINER_DATA_LATTICE)
+DEF_ICON(OUTLINER_DATA_META)
+DEF_ICON(OUTLINER_DATA_LAMP)
+DEF_ICON(OUTLINER_DATA_CAMERA)
+DEF_ICON(OUTLINER_DATA_ARMATURE)
+DEF_ICON(OUTLINER_DATA_FONT)
+DEF_ICON(OUTLINER_DATA_SURFACE)
+DEF_ICON(OUTLINER_DATA_POSE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK129)
+ DEF_ICON(BLANK130)
+ DEF_ICON(BLANK131)
+ DEF_ICON(BLANK132)
+ DEF_ICON(BLANK133)
+ DEF_ICON(BLANK134)
+ DEF_ICON(BLANK135)
+ DEF_ICON(BLANK136)
+ DEF_ICON(BLANK137)
+ DEF_ICON(BLANK138)
+ DEF_ICON(BLANK139)
+ DEF_ICON(BLANK140)
+ DEF_ICON(BLANK141)
+ DEF_ICON(BLANK142)
+ DEF_ICON(BLANK142b)
+#endif
/* PRIMITIVES */
-DEF_ICON(ICON_MESH_PLANE)
-DEF_ICON(ICON_MESH_CUBE)
-DEF_ICON(ICON_MESH_CIRCLE)
-DEF_ICON(ICON_MESH_UVSPHERE)
-DEF_ICON(ICON_MESH_ICOSPHERE)
-DEF_ICON(ICON_MESH_GRID)
-DEF_ICON(ICON_MESH_MONKEY)
-DEF_ICON(ICON_MESH_CYLINDER)
-DEF_ICON(ICON_MESH_TORUS)
-DEF_ICON(ICON_MESH_CONE)
-DEF_ICON(ICON_BLANK610)
-DEF_ICON(ICON_BLANK611)
-DEF_ICON(ICON_LAMP_POINT)
-DEF_ICON(ICON_LAMP_SUN)
-DEF_ICON(ICON_LAMP_SPOT)
-DEF_ICON(ICON_LAMP_HEMI)
-DEF_ICON(ICON_LAMP_AREA)
-DEF_ICON(ICON_BLANK617)
-DEF_ICON(ICON_BLANK618)
-DEF_ICON(ICON_BLANK619)
-DEF_ICON(ICON_META_PLANE)
-DEF_ICON(ICON_META_CUBE)
-DEF_ICON(ICON_META_BALL)
-DEF_ICON(ICON_META_ELLIPSOID)
-DEF_ICON(ICON_META_CAPSULE)
-DEF_ICON(ICON_BLANK625)
+DEF_ICON(MESH_PLANE)
+DEF_ICON(MESH_CUBE)
+DEF_ICON(MESH_CIRCLE)
+DEF_ICON(MESH_UVSPHERE)
+DEF_ICON(MESH_ICOSPHERE)
+DEF_ICON(MESH_GRID)
+DEF_ICON(MESH_MONKEY)
+DEF_ICON(MESH_CYLINDER)
+DEF_ICON(MESH_TORUS)
+DEF_ICON(MESH_CONE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK610)
+ DEF_ICON(BLANK611)
+#endif
+DEF_ICON(LAMP_POINT)
+DEF_ICON(LAMP_SUN)
+DEF_ICON(LAMP_SPOT)
+DEF_ICON(LAMP_HEMI)
+DEF_ICON(LAMP_AREA)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK617)
+ DEF_ICON(BLANK618)
+ DEF_ICON(BLANK619)
+#endif
+DEF_ICON(META_PLANE)
+DEF_ICON(META_CUBE)
+DEF_ICON(META_BALL)
+DEF_ICON(META_ELLIPSOID)
+DEF_ICON(META_CAPSULE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK625)
+#endif
/* PRIMITIVES */
-DEF_ICON(ICON_SURFACE_NCURVE)
-DEF_ICON(ICON_SURFACE_NCIRCLE)
-DEF_ICON(ICON_SURFACE_NSURFACE)
-DEF_ICON(ICON_SURFACE_NCYLINDER)
-DEF_ICON(ICON_SURFACE_NSPHERE)
-DEF_ICON(ICON_SURFACE_NTORUS)
-DEF_ICON(ICON_BLANK636)
-DEF_ICON(ICON_BLANK637)
-DEF_ICON(ICON_BLANK638)
-DEF_ICON(ICON_CURVE_BEZCURVE)
-DEF_ICON(ICON_CURVE_BEZCIRCLE)
-DEF_ICON(ICON_CURVE_NCURVE)
-DEF_ICON(ICON_CURVE_NCIRCLE)
-DEF_ICON(ICON_CURVE_PATH)
-DEF_ICON(ICON_BLANK644)
-DEF_ICON(ICON_BLANK645)
-DEF_ICON(ICON_BLANK646)
-DEF_ICON(ICON_BLANK647)
-DEF_ICON(ICON_BLANK648)
-DEF_ICON(ICON_BLANK649)
-DEF_ICON(ICON_BLANK650)
-DEF_ICON(ICON_BLANK651)
-DEF_ICON(ICON_BLANK652)
-DEF_ICON(ICON_BLANK653)
-DEF_ICON(ICON_BLANK654)
-DEF_ICON(ICON_BLANK655)
+DEF_ICON(SURFACE_NCURVE)
+DEF_ICON(SURFACE_NCIRCLE)
+DEF_ICON(SURFACE_NSURFACE)
+DEF_ICON(SURFACE_NCYLINDER)
+DEF_ICON(SURFACE_NSPHERE)
+DEF_ICON(SURFACE_NTORUS)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK636)
+ DEF_ICON(BLANK637)
+ DEF_ICON(BLANK638)
+#endif
+DEF_ICON(CURVE_BEZCURVE)
+DEF_ICON(CURVE_BEZCIRCLE)
+DEF_ICON(CURVE_NCURVE)
+DEF_ICON(CURVE_NCIRCLE)
+DEF_ICON(CURVE_PATH)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK644)
+ DEF_ICON(BLANK645)
+ DEF_ICON(BLANK646)
+ DEF_ICON(BLANK647)
+ DEF_ICON(BLANK648)
+ DEF_ICON(BLANK649)
+ DEF_ICON(BLANK650)
+ DEF_ICON(BLANK651)
+ DEF_ICON(BLANK652)
+ DEF_ICON(BLANK653)
+ DEF_ICON(BLANK654)
+ DEF_ICON(BLANK655)
+#endif
/* EMPTY */
-DEF_ICON(ICON_FORCE_FORCE)
-DEF_ICON(ICON_FORCE_WIND)
-DEF_ICON(ICON_FORCE_VORTEX)
-DEF_ICON(ICON_FORCE_MAGNETIC)
-DEF_ICON(ICON_FORCE_HARMONIC)
-DEF_ICON(ICON_FORCE_CHARGE)
-DEF_ICON(ICON_FORCE_LENNARDJONES)
-DEF_ICON(ICON_FORCE_TEXTURE)
-DEF_ICON(ICON_FORCE_CURVE)
-DEF_ICON(ICON_FORCE_BOID)
-DEF_ICON(ICON_FORCE_TURBULENCE)
-DEF_ICON(ICON_FORCE_DRAG)
-DEF_ICON(ICON_BLANK672)
-DEF_ICON(ICON_BLANK673)
-DEF_ICON(ICON_BLANK674)
-DEF_ICON(ICON_BLANK675)
-DEF_ICON(ICON_BLANK676)
-DEF_ICON(ICON_BLANK677)
-DEF_ICON(ICON_BLANK678)
-DEF_ICON(ICON_BLANK679)
-DEF_ICON(ICON_BLANK680)
-DEF_ICON(ICON_BLANK681)
-DEF_ICON(ICON_BLANK682)
-DEF_ICON(ICON_BLANK683)
-DEF_ICON(ICON_BLANK684)
-DEF_ICON(ICON_BLANK685)
+DEF_ICON(FORCE_FORCE)
+DEF_ICON(FORCE_WIND)
+DEF_ICON(FORCE_VORTEX)
+DEF_ICON(FORCE_MAGNETIC)
+DEF_ICON(FORCE_HARMONIC)
+DEF_ICON(FORCE_CHARGE)
+DEF_ICON(FORCE_LENNARDJONES)
+DEF_ICON(FORCE_TEXTURE)
+DEF_ICON(FORCE_CURVE)
+DEF_ICON(FORCE_BOID)
+DEF_ICON(FORCE_TURBULENCE)
+DEF_ICON(FORCE_DRAG)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK672)
+ DEF_ICON(BLANK673)
+ DEF_ICON(BLANK674)
+ DEF_ICON(BLANK675)
+ DEF_ICON(BLANK676)
+ DEF_ICON(BLANK677)
+ DEF_ICON(BLANK678)
+ DEF_ICON(BLANK679)
+ DEF_ICON(BLANK680)
+ DEF_ICON(BLANK681)
+ DEF_ICON(BLANK682)
+ DEF_ICON(BLANK683)
+ DEF_ICON(BLANK684)
+ DEF_ICON(BLANK685)
/* EMPTY */
-DEF_ICON(ICON_BLANK690)
-DEF_ICON(ICON_BLANK691)
-DEF_ICON(ICON_BLANK692)
-DEF_ICON(ICON_BLANK693)
-DEF_ICON(ICON_BLANK694)
-DEF_ICON(ICON_BLANK695)
-DEF_ICON(ICON_BLANK696)
-DEF_ICON(ICON_BLANK697)
-DEF_ICON(ICON_BLANK698)
-DEF_ICON(ICON_BLANK699)
-DEF_ICON(ICON_BLANK700)
-DEF_ICON(ICON_BLANK701)
-DEF_ICON(ICON_BLANK702)
-DEF_ICON(ICON_BLANK703)
-DEF_ICON(ICON_BLANK704)
-DEF_ICON(ICON_BLANK705)
-DEF_ICON(ICON_BLANK706)
-DEF_ICON(ICON_BLANK707)
-DEF_ICON(ICON_BLANK708)
-DEF_ICON(ICON_BLANK709)
-DEF_ICON(ICON_BLANK710)
-DEF_ICON(ICON_BLANK711)
-DEF_ICON(ICON_BLANK712)
-DEF_ICON(ICON_BLANK713)
-DEF_ICON(ICON_BLANK714)
-DEF_ICON(ICON_BLANK715)
+ DEF_ICON(BLANK690)
+ DEF_ICON(BLANK691)
+ DEF_ICON(BLANK692)
+ DEF_ICON(BLANK693)
+ DEF_ICON(BLANK694)
+ DEF_ICON(BLANK695)
+ DEF_ICON(BLANK696)
+ DEF_ICON(BLANK697)
+ DEF_ICON(BLANK698)
+ DEF_ICON(BLANK699)
+ DEF_ICON(BLANK700)
+ DEF_ICON(BLANK701)
+ DEF_ICON(BLANK702)
+ DEF_ICON(BLANK703)
+ DEF_ICON(BLANK704)
+ DEF_ICON(BLANK705)
+ DEF_ICON(BLANK706)
+ DEF_ICON(BLANK707)
+ DEF_ICON(BLANK708)
+ DEF_ICON(BLANK709)
+ DEF_ICON(BLANK710)
+ DEF_ICON(BLANK711)
+ DEF_ICON(BLANK712)
+ DEF_ICON(BLANK713)
+ DEF_ICON(BLANK714)
+ DEF_ICON(BLANK715)
/* EMPTY */
-DEF_ICON(ICON_BLANK720)
-DEF_ICON(ICON_BLANK721)
-DEF_ICON(ICON_BLANK722)
-DEF_ICON(ICON_BLANK733)
-DEF_ICON(ICON_BLANK734)
-DEF_ICON(ICON_BLANK735)
-DEF_ICON(ICON_BLANK736)
-DEF_ICON(ICON_BLANK737)
-DEF_ICON(ICON_BLANK738)
-DEF_ICON(ICON_BLANK739)
-DEF_ICON(ICON_BLANK740)
-DEF_ICON(ICON_BLANK741)
-DEF_ICON(ICON_BLANK742)
-DEF_ICON(ICON_BLANK743)
-DEF_ICON(ICON_BLANK744)
-DEF_ICON(ICON_BLANK745)
-DEF_ICON(ICON_BLANK746)
-DEF_ICON(ICON_BLANK747)
-DEF_ICON(ICON_BLANK748)
-DEF_ICON(ICON_BLANK749)
-DEF_ICON(ICON_BLANK750)
-DEF_ICON(ICON_BLANK751)
-DEF_ICON(ICON_BLANK752)
-DEF_ICON(ICON_BLANK753)
-DEF_ICON(ICON_BLANK754)
-DEF_ICON(ICON_BLANK755)
+ DEF_ICON(BLANK720)
+ DEF_ICON(BLANK721)
+ DEF_ICON(BLANK722)
+ DEF_ICON(BLANK733)
+ DEF_ICON(BLANK734)
+ DEF_ICON(BLANK735)
+ DEF_ICON(BLANK736)
+ DEF_ICON(BLANK737)
+ DEF_ICON(BLANK738)
+ DEF_ICON(BLANK739)
+ DEF_ICON(BLANK740)
+ DEF_ICON(BLANK741)
+ DEF_ICON(BLANK742)
+ DEF_ICON(BLANK743)
+ DEF_ICON(BLANK744)
+ DEF_ICON(BLANK745)
+ DEF_ICON(BLANK746)
+ DEF_ICON(BLANK747)
+ DEF_ICON(BLANK748)
+ DEF_ICON(BLANK749)
+ DEF_ICON(BLANK750)
+ DEF_ICON(BLANK751)
+ DEF_ICON(BLANK752)
+ DEF_ICON(BLANK753)
+ DEF_ICON(BLANK754)
+ DEF_ICON(BLANK755)
/* EMPTY */
-DEF_ICON(ICON_BLANK760)
-DEF_ICON(ICON_BLANK761)
-DEF_ICON(ICON_BLANK762)
-DEF_ICON(ICON_BLANK763)
-DEF_ICON(ICON_BLANK764)
-DEF_ICON(ICON_BLANK765)
-DEF_ICON(ICON_BLANK766)
-DEF_ICON(ICON_BLANK767)
-DEF_ICON(ICON_BLANK768)
-DEF_ICON(ICON_BLANK769)
-DEF_ICON(ICON_BLANK770)
-DEF_ICON(ICON_BLANK771)
-DEF_ICON(ICON_BLANK772)
-DEF_ICON(ICON_BLANK773)
-DEF_ICON(ICON_BLANK774)
-DEF_ICON(ICON_BLANK775)
-DEF_ICON(ICON_BLANK776)
-DEF_ICON(ICON_BLANK777)
-DEF_ICON(ICON_BLANK778)
-DEF_ICON(ICON_BLANK779)
-DEF_ICON(ICON_BLANK780)
-DEF_ICON(ICON_BLANK781)
-DEF_ICON(ICON_BLANK782)
-DEF_ICON(ICON_BLANK783)
-DEF_ICON(ICON_BLANK784)
-DEF_ICON(ICON_BLANK785)
+ DEF_ICON(BLANK760)
+ DEF_ICON(BLANK761)
+ DEF_ICON(BLANK762)
+ DEF_ICON(BLANK763)
+ DEF_ICON(BLANK764)
+ DEF_ICON(BLANK765)
+ DEF_ICON(BLANK766)
+ DEF_ICON(BLANK767)
+ DEF_ICON(BLANK768)
+ DEF_ICON(BLANK769)
+ DEF_ICON(BLANK770)
+ DEF_ICON(BLANK771)
+ DEF_ICON(BLANK772)
+ DEF_ICON(BLANK773)
+ DEF_ICON(BLANK774)
+ DEF_ICON(BLANK775)
+ DEF_ICON(BLANK776)
+ DEF_ICON(BLANK777)
+ DEF_ICON(BLANK778)
+ DEF_ICON(BLANK779)
+ DEF_ICON(BLANK780)
+ DEF_ICON(BLANK781)
+ DEF_ICON(BLANK782)
+ DEF_ICON(BLANK783)
+ DEF_ICON(BLANK784)
+ DEF_ICON(BLANK785)
+#endif
/* MODIFIERS */
-DEF_ICON(ICON_MODIFIER)
-DEF_ICON(ICON_MOD_WAVE)
-DEF_ICON(ICON_MOD_BUILD)
-DEF_ICON(ICON_MOD_DECIM)
-DEF_ICON(ICON_MOD_MIRROR)
-DEF_ICON(ICON_MOD_SOFT)
-DEF_ICON(ICON_MOD_SUBSURF)
-DEF_ICON(ICON_HOOK)
-DEF_ICON(ICON_MOD_PHYSICS)
-DEF_ICON(ICON_MOD_PARTICLES)
-DEF_ICON(ICON_MOD_BOOLEAN)
-DEF_ICON(ICON_MOD_EDGESPLIT)
-DEF_ICON(ICON_MOD_ARRAY)
-DEF_ICON(ICON_MOD_UVPROJECT)
-DEF_ICON(ICON_MOD_DISPLACE)
-DEF_ICON(ICON_MOD_CURVE)
-DEF_ICON(ICON_MOD_LATTICE)
-DEF_ICON(ICON_CONSTRAINT_DATA)
-DEF_ICON(ICON_MOD_ARMATURE)
-DEF_ICON(ICON_MOD_SHRINKWRAP)
-DEF_ICON(ICON_MOD_CAST)
-DEF_ICON(ICON_MOD_MESHDEFORM)
-DEF_ICON(ICON_MOD_BEVEL)
-DEF_ICON(ICON_MOD_SMOOTH)
-DEF_ICON(ICON_MOD_SIMPLEDEFORM)
-DEF_ICON(ICON_MOD_MASK)
+DEF_ICON(MODIFIER)
+DEF_ICON(MOD_WAVE)
+DEF_ICON(MOD_BUILD)
+DEF_ICON(MOD_DECIM)
+DEF_ICON(MOD_MIRROR)
+DEF_ICON(MOD_SOFT)
+DEF_ICON(MOD_SUBSURF)
+DEF_ICON(HOOK)
+DEF_ICON(MOD_PHYSICS)
+DEF_ICON(MOD_PARTICLES)
+DEF_ICON(MOD_BOOLEAN)
+DEF_ICON(MOD_EDGESPLIT)
+DEF_ICON(MOD_ARRAY)
+DEF_ICON(MOD_UVPROJECT)
+DEF_ICON(MOD_DISPLACE)
+DEF_ICON(MOD_CURVE)
+DEF_ICON(MOD_LATTICE)
+DEF_ICON(CONSTRAINT_DATA)
+DEF_ICON(MOD_ARMATURE)
+DEF_ICON(MOD_SHRINKWRAP)
+DEF_ICON(MOD_CAST)
+DEF_ICON(MOD_MESHDEFORM)
+DEF_ICON(MOD_BEVEL)
+DEF_ICON(MOD_SMOOTH)
+DEF_ICON(MOD_SIMPLEDEFORM)
+DEF_ICON(MOD_MASK)
/* MODIFIERS */
-DEF_ICON(ICON_MOD_CLOTH)
-DEF_ICON(ICON_MOD_EXPLODE)
-DEF_ICON(ICON_MOD_FLUIDSIM)
-DEF_ICON(ICON_MOD_MULTIRES)
-DEF_ICON(ICON_MOD_SMOKE)
-DEF_ICON(ICON_MOD_SOLIDIFY)
-DEF_ICON(ICON_MOD_SCREW)
-DEF_ICON(ICON_BLANK160)
-DEF_ICON(ICON_BLANK161)
-DEF_ICON(ICON_BLANK162)
-DEF_ICON(ICON_BLANK163)
-DEF_ICON(ICON_BLANK164)
-DEF_ICON(ICON_BLANK165)
-DEF_ICON(ICON_BLANK166)
-DEF_ICON(ICON_BLANK167)
-DEF_ICON(ICON_BLANK168)
-DEF_ICON(ICON_BLANK169)
-DEF_ICON(ICON_BLANK170)
-DEF_ICON(ICON_BLANK171)
-DEF_ICON(ICON_BLANK172)
-DEF_ICON(ICON_BLANK173)
-DEF_ICON(ICON_BLANK174)
-DEF_ICON(ICON_BLANK175)
-DEF_ICON(ICON_BLANK176)
-DEF_ICON(ICON_BLANK177)
-DEF_ICON(ICON_BLANK177b)
+DEF_ICON(MOD_CLOTH)
+DEF_ICON(MOD_EXPLODE)
+DEF_ICON(MOD_FLUIDSIM)
+DEF_ICON(MOD_MULTIRES)
+DEF_ICON(MOD_SMOKE)
+DEF_ICON(MOD_SOLIDIFY)
+DEF_ICON(MOD_SCREW)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK160)
+ DEF_ICON(BLANK161)
+ DEF_ICON(BLANK162)
+ DEF_ICON(BLANK163)
+ DEF_ICON(BLANK164)
+ DEF_ICON(BLANK165)
+ DEF_ICON(BLANK166)
+ DEF_ICON(BLANK167)
+ DEF_ICON(BLANK168)
+ DEF_ICON(BLANK169)
+ DEF_ICON(BLANK170)
+ DEF_ICON(BLANK171)
+ DEF_ICON(BLANK172)
+ DEF_ICON(BLANK173)
+ DEF_ICON(BLANK174)
+ DEF_ICON(BLANK175)
+ DEF_ICON(BLANK176)
+ DEF_ICON(BLANK177)
+ DEF_ICON(BLANK177b)
+#endif
/* ANIMATION */
-DEF_ICON(ICON_REC)
-DEF_ICON(ICON_PLAY)
-DEF_ICON(ICON_FF)
-DEF_ICON(ICON_REW)
-DEF_ICON(ICON_PAUSE)
-DEF_ICON(ICON_PREV_KEYFRAME)
-DEF_ICON(ICON_NEXT_KEYFRAME)
-DEF_ICON(ICON_PLAY_AUDIO)
-DEF_ICON(ICON_PLAY_REVERSE)
-DEF_ICON(ICON_PREVIEW_RANGE)
-DEF_ICON(ICON_BLANK180)
-DEF_ICON(ICON_PMARKER_ACT)
-DEF_ICON(ICON_PMARKER_SEL)
-DEF_ICON(ICON_PMARKER)
-DEF_ICON(ICON_MARKER_HLT)
-DEF_ICON(ICON_MARKER)
-DEF_ICON(ICON_SPACE2) // XXX
-DEF_ICON(ICON_SPACE3) // XXX
-DEF_ICON(ICON_BLANK181)
-DEF_ICON(ICON_KEY_DEHLT)
-DEF_ICON(ICON_KEY_HLT)
-DEF_ICON(ICON_MUTE_IPO_OFF)
-DEF_ICON(ICON_MUTE_IPO_ON)
-DEF_ICON(ICON_BLANK182)
-DEF_ICON(ICON_BLANK183)
-DEF_ICON(ICON_BLANK183b)
+DEF_ICON(REC)
+DEF_ICON(PLAY)
+DEF_ICON(FF)
+DEF_ICON(REW)
+DEF_ICON(PAUSE)
+DEF_ICON(PREV_KEYFRAME)
+DEF_ICON(NEXT_KEYFRAME)
+DEF_ICON(PLAY_AUDIO)
+DEF_ICON(PLAY_REVERSE)
+DEF_ICON(PREVIEW_RANGE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK180)
+#endif
+DEF_ICON(PMARKER_ACT)
+DEF_ICON(PMARKER_SEL)
+DEF_ICON(PMARKER)
+DEF_ICON(MARKER_HLT)
+DEF_ICON(MARKER)
+DEF_ICON(SPACE2) // XXX
+DEF_ICON(SPACE3) // XXX
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK181)
+#endif
+DEF_ICON(KEY_DEHLT)
+DEF_ICON(KEY_HLT)
+DEF_ICON(MUTE_IPO_OFF)
+DEF_ICON(MUTE_IPO_ON)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK182)
+ DEF_ICON(BLANK183)
+ DEF_ICON(BLANK183b)
/* available */
-DEF_ICON(ICON_BLANK184)
-DEF_ICON(ICON_BLANK185)
-DEF_ICON(ICON_BLANK186)
-DEF_ICON(ICON_BLANK187)
-DEF_ICON(ICON_BLANK188)
-DEF_ICON(ICON_BLANK189)
-DEF_ICON(ICON_BLANK190)
-DEF_ICON(ICON_BLANK191)
-DEF_ICON(ICON_BLANK192)
-DEF_ICON(ICON_BLANK193)
-DEF_ICON(ICON_BLANK194)
-DEF_ICON(ICON_BLANK195)
-DEF_ICON(ICON_BLANK196)
-DEF_ICON(ICON_BLANK197)
-DEF_ICON(ICON_BLANK198)
-DEF_ICON(ICON_BLANK199)
-DEF_ICON(ICON_BLANK200)
-DEF_ICON(ICON_BLANK201)
-DEF_ICON(ICON_BLANK202)
-DEF_ICON(ICON_BLANK203)
-DEF_ICON(ICON_BLANK204)
-DEF_ICON(ICON_BLANK205)
-DEF_ICON(ICON_BLANK206)
-DEF_ICON(ICON_BLANK207)
-DEF_ICON(ICON_BLANK208)
-DEF_ICON(ICON_BLANK208b)
+ DEF_ICON(BLANK184)
+ DEF_ICON(BLANK185)
+ DEF_ICON(BLANK186)
+ DEF_ICON(BLANK187)
+ DEF_ICON(BLANK188)
+ DEF_ICON(BLANK189)
+ DEF_ICON(BLANK190)
+ DEF_ICON(BLANK191)
+ DEF_ICON(BLANK192)
+ DEF_ICON(BLANK193)
+ DEF_ICON(BLANK194)
+ DEF_ICON(BLANK195)
+ DEF_ICON(BLANK196)
+ DEF_ICON(BLANK197)
+ DEF_ICON(BLANK198)
+ DEF_ICON(BLANK199)
+ DEF_ICON(BLANK200)
+ DEF_ICON(BLANK201)
+ DEF_ICON(BLANK202)
+ DEF_ICON(BLANK203)
+ DEF_ICON(BLANK204)
+ DEF_ICON(BLANK205)
+ DEF_ICON(BLANK206)
+ DEF_ICON(BLANK207)
+ DEF_ICON(BLANK208)
+ DEF_ICON(BLANK208b)
+#endif
/* EDITING */
-DEF_ICON(ICON_VERTEXSEL)
-DEF_ICON(ICON_EDGESEL)
-DEF_ICON(ICON_FACESEL)
-DEF_ICON(ICON_LINKEDSEL)
-DEF_ICON(ICON_BLANK210)
-DEF_ICON(ICON_ROTATE)
-DEF_ICON(ICON_CURSOR)
-DEF_ICON(ICON_ROTATECOLLECTION)
-DEF_ICON(ICON_ROTATECENTER)
-DEF_ICON(ICON_ROTACTIVE)
-DEF_ICON(ICON_ALIGN)
-DEF_ICON(ICON_BLANK211)
-DEF_ICON(ICON_SMOOTHCURVE)
-DEF_ICON(ICON_SPHERECURVE)
-DEF_ICON(ICON_ROOTCURVE)
-DEF_ICON(ICON_SHARPCURVE)
-DEF_ICON(ICON_LINCURVE)
-DEF_ICON(ICON_NOCURVE)
-DEF_ICON(ICON_RNDCURVE)
-DEF_ICON(ICON_PROP_OFF)
-DEF_ICON(ICON_PROP_ON)
-DEF_ICON(ICON_PROP_CON)
-DEF_ICON(ICON_BLANK212)
-DEF_ICON(ICON_PARTICLE_POINT)
-DEF_ICON(ICON_PARTICLE_TIP)
-DEF_ICON(ICON_PARTICLE_PATH)
+DEF_ICON(VERTEXSEL)
+DEF_ICON(EDGESEL)
+DEF_ICON(FACESEL)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK209)
+ DEF_ICON(BLANK210)
+#endif
+DEF_ICON(ROTATE)
+DEF_ICON(CURSOR)
+DEF_ICON(ROTATECOLLECTION)
+DEF_ICON(ROTATECENTER)
+DEF_ICON(ROTACTIVE)
+DEF_ICON(ALIGN)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK211)
+#endif
+DEF_ICON(SMOOTHCURVE)
+DEF_ICON(SPHERECURVE)
+DEF_ICON(ROOTCURVE)
+DEF_ICON(SHARPCURVE)
+DEF_ICON(LINCURVE)
+DEF_ICON(NOCURVE)
+DEF_ICON(RNDCURVE)
+DEF_ICON(PROP_OFF)
+DEF_ICON(PROP_ON)
+DEF_ICON(PROP_CON)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK212)
+#endif
+DEF_ICON(PARTICLE_POINT)
+DEF_ICON(PARTICLE_TIP)
+DEF_ICON(PARTICLE_PATH)
/* EDITING */
-DEF_ICON(ICON_MAN_TRANS)
-DEF_ICON(ICON_MAN_ROT)
-DEF_ICON(ICON_MAN_SCALE)
-DEF_ICON(ICON_MANIPUL)
-DEF_ICON(ICON_SNAP_OFF)
-DEF_ICON(ICON_SNAP_ON)
-DEF_ICON(ICON_SNAP_NORMAL)
-DEF_ICON(ICON_SNAP_INCREMENT)
-DEF_ICON(ICON_SNAP_VERTEX)
-DEF_ICON(ICON_SNAP_EDGE)
-DEF_ICON(ICON_SNAP_FACE)
-DEF_ICON(ICON_SNAP_VOLUME)
-DEF_ICON(ICON_UVS_FACE)
-DEF_ICON(ICON_STICKY_UVS_LOC)
-DEF_ICON(ICON_STICKY_UVS_DISABLE)
-DEF_ICON(ICON_STICKY_UVS_VERT)
-DEF_ICON(ICON_CLIPUV_DEHLT)
-DEF_ICON(ICON_CLIPUV_HLT)
-DEF_ICON(ICON_SNAP_PEEL_OBJECT)
-DEF_ICON(ICON_GRID)
-DEF_ICON(ICON_GEARS)
-DEF_ICON(ICON_BLANK221)
-DEF_ICON(ICON_BLANK224)
-DEF_ICON(ICON_BLANK225)
-DEF_ICON(ICON_BLANK226)
-DEF_ICON(ICON_BLANK226b)
+DEF_ICON(MAN_TRANS)
+DEF_ICON(MAN_ROT)
+DEF_ICON(MAN_SCALE)
+DEF_ICON(MANIPUL)
+DEF_ICON(SNAP_OFF)
+DEF_ICON(SNAP_ON)
+DEF_ICON(SNAP_NORMAL)
+DEF_ICON(SNAP_INCREMENT)
+DEF_ICON(SNAP_VERTEX)
+DEF_ICON(SNAP_EDGE)
+DEF_ICON(SNAP_FACE)
+DEF_ICON(SNAP_VOLUME)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK220)
+#endif
+DEF_ICON(STICKY_UVS_LOC)
+DEF_ICON(STICKY_UVS_DISABLE)
+DEF_ICON(STICKY_UVS_VERT)
+DEF_ICON(CLIPUV_DEHLT)
+DEF_ICON(CLIPUV_HLT)
+DEF_ICON(SNAP_PEEL_OBJECT)
+DEF_ICON(GRID)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK221)
+ DEF_ICON(BLANK222)
+ DEF_ICON(BLANK224)
+ DEF_ICON(BLANK225)
+ DEF_ICON(BLANK226)
+ DEF_ICON(BLANK226b)
+#endif
/* EDITING */
-DEF_ICON(ICON_PASTEDOWN)
-DEF_ICON(ICON_COPYDOWN)
-DEF_ICON(ICON_PASTEFLIPUP)
-DEF_ICON(ICON_PASTEFLIPDOWN)
-DEF_ICON(ICON_BLANK227)
-DEF_ICON(ICON_BLANK228)
-DEF_ICON(ICON_BLANK229)
-DEF_ICON(ICON_BLANK230)
-DEF_ICON(ICON_SNAP_SURFACE)
-DEF_ICON(ICON_BLANK232)
-DEF_ICON(ICON_BLANK233)
-DEF_ICON(ICON_RETOPO)
-DEF_ICON(ICON_UV_VERTEXSEL)
-DEF_ICON(ICON_UV_EDGESEL)
-DEF_ICON(ICON_UV_FACESEL)
-DEF_ICON(ICON_UV_ISLANDSEL)
-DEF_ICON(ICON_UV_SYNC_SELECT)
-DEF_ICON(ICON_BLANK240)
-DEF_ICON(ICON_BLANK241)
-DEF_ICON(ICON_BLANK242)
-DEF_ICON(ICON_BLANK243)
-DEF_ICON(ICON_BLANK244)
-DEF_ICON(ICON_BLANK245)
-DEF_ICON(ICON_BLANK246)
-DEF_ICON(ICON_BLANK247)
-DEF_ICON(ICON_BLANK247b)
+DEF_ICON(PASTEDOWN)
+DEF_ICON(COPYDOWN)
+DEF_ICON(PASTEFLIPUP)
+DEF_ICON(PASTEFLIPDOWN)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK227)
+ DEF_ICON(BLANK228)
+ DEF_ICON(BLANK229)
+ DEF_ICON(BLANK230)
+#endif
+DEF_ICON(SNAP_SURFACE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK232)
+ DEF_ICON(BLANK233)
+#endif
+DEF_ICON(RETOPO)
+DEF_ICON(UV_VERTEXSEL)
+DEF_ICON(UV_EDGESEL)
+DEF_ICON(UV_FACESEL)
+DEF_ICON(UV_ISLANDSEL)
+DEF_ICON(UV_SYNC_SELECT)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK240)
+ DEF_ICON(BLANK241)
+ DEF_ICON(BLANK242)
+ DEF_ICON(BLANK243)
+ DEF_ICON(BLANK244)
+ DEF_ICON(BLANK245)
+ DEF_ICON(BLANK246)
+ DEF_ICON(BLANK247)
+ DEF_ICON(BLANK247b)
+#endif
/* 3D VIEW */
-DEF_ICON(ICON_BBOX)
-DEF_ICON(ICON_WIRE)
-DEF_ICON(ICON_SOLID)
-DEF_ICON(ICON_SMOOTH)
-DEF_ICON(ICON_POTATO)
-DEF_ICON(ICON_BLANK248)
-DEF_ICON(ICON_ORTHO)
-DEF_ICON(ICON_ORTHO_OFF)
-DEF_ICON(ICON_CAMERA)
-DEF_ICON(ICON_LOCKVIEW_OFF)
-DEF_ICON(ICON_LOCKVIEW_ON)
-DEF_ICON(ICON_BLANK250)
-DEF_ICON(ICON_AXIS_SIDE)
-DEF_ICON(ICON_AXIS_FRONT)
-DEF_ICON(ICON_AXIS_TOP)
-DEF_ICON(ICON_NDOF_DOM)
-DEF_ICON(ICON_NDOF_TURN)
-DEF_ICON(ICON_NDOF_FLY)
-DEF_ICON(ICON_NDOF_TRANS)
-DEF_ICON(ICON_LAYER_USED)
-DEF_ICON(ICON_LAYER_ACTIVE)
-DEF_ICON(ICON_BLANK254)
-DEF_ICON(ICON_BLANK255)
-DEF_ICON(ICON_BLANK256)
-DEF_ICON(ICON_BLANK257)
-DEF_ICON(ICON_BLANK257b)
+DEF_ICON(BBOX)
+DEF_ICON(WIRE)
+DEF_ICON(SOLID)
+DEF_ICON(SMOOTH)
+DEF_ICON(POTATO)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK248)
+#endif
+DEF_ICON(ORTHO)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK249)
+ DEF_ICON(BLANK250)
+#endif
+DEF_ICON(LOCKVIEW_OFF)
+DEF_ICON(LOCKVIEW_ON)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK251)
+#endif
+DEF_ICON(AXIS_SIDE)
+DEF_ICON(AXIS_FRONT)
+DEF_ICON(AXIS_TOP)
+DEF_ICON(NDOF_DOM)
+DEF_ICON(NDOF_TURN)
+DEF_ICON(NDOF_FLY)
+DEF_ICON(NDOF_TRANS)
+DEF_ICON(LAYER_USED)
+DEF_ICON(LAYER_ACTIVE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK254)
+ DEF_ICON(BLANK255)
+ DEF_ICON(BLANK256)
+ DEF_ICON(BLANK257)
+ DEF_ICON(BLANK257b)
/* available */
-DEF_ICON(ICON_BLANK258)
-DEF_ICON(ICON_BLANK259)
-DEF_ICON(ICON_BLANK260)
-DEF_ICON(ICON_BLANK261)
-DEF_ICON(ICON_BLANK262)
-DEF_ICON(ICON_BLANK263)
-DEF_ICON(ICON_BLANK264)
-DEF_ICON(ICON_BLANK265)
-DEF_ICON(ICON_BLANK266)
-DEF_ICON(ICON_BLANK267)
-DEF_ICON(ICON_BLANK268)
-DEF_ICON(ICON_BLANK269)
-DEF_ICON(ICON_BLANK270)
-DEF_ICON(ICON_BLANK271)
-DEF_ICON(ICON_BLANK272)
-DEF_ICON(ICON_BLANK273)
-DEF_ICON(ICON_BLANK274)
-DEF_ICON(ICON_BLANK275)
-DEF_ICON(ICON_BLANK276)
-DEF_ICON(ICON_BLANK277)
-DEF_ICON(ICON_BLANK278)
-DEF_ICON(ICON_BLANK279)
-DEF_ICON(ICON_BLANK280)
-DEF_ICON(ICON_BLANK281)
-DEF_ICON(ICON_BLANK282)
-DEF_ICON(ICON_BLANK282b)
+ DEF_ICON(BLANK258)
+ DEF_ICON(BLANK259)
+ DEF_ICON(BLANK260)
+ DEF_ICON(BLANK261)
+ DEF_ICON(BLANK262)
+ DEF_ICON(BLANK263)
+ DEF_ICON(BLANK264)
+ DEF_ICON(BLANK265)
+ DEF_ICON(BLANK266)
+ DEF_ICON(BLANK267)
+ DEF_ICON(BLANK268)
+ DEF_ICON(BLANK269)
+ DEF_ICON(BLANK270)
+ DEF_ICON(BLANK271)
+ DEF_ICON(BLANK272)
+ DEF_ICON(BLANK273)
+ DEF_ICON(BLANK274)
+ DEF_ICON(BLANK275)
+ DEF_ICON(BLANK276)
+ DEF_ICON(BLANK277)
+ DEF_ICON(BLANK278)
+ DEF_ICON(BLANK279)
+ DEF_ICON(BLANK280)
+ DEF_ICON(BLANK281)
+ DEF_ICON(BLANK282)
+ DEF_ICON(BLANK282b)
+#endif
/* FILE SELECT */
-DEF_ICON(ICON_SORTALPHA)
-DEF_ICON(ICON_SORTBYEXT)
-DEF_ICON(ICON_SORTTIME)
-DEF_ICON(ICON_SORTSIZE)
-DEF_ICON(ICON_LONGDISPLAY)
-DEF_ICON(ICON_SHORTDISPLAY)
-DEF_ICON(ICON_GHOST)
-DEF_ICON(ICON_IMGDISPLAY)
-DEF_ICON(ICON_BLANK284)
-DEF_ICON(ICON_BLANK285)
-DEF_ICON(ICON_BOOKMARKS)
-DEF_ICON(ICON_FONTPREVIEW)
-DEF_ICON(ICON_FILTER)
-DEF_ICON(ICON_NEWFOLDER)
-DEF_ICON(ICON_BLANK285F)
-DEF_ICON(ICON_FILE_PARENT)
-DEF_ICON(ICON_FILE_REFRESH)
-DEF_ICON(ICON_FILE_FOLDER)
-DEF_ICON(ICON_FILE_BLANK)
-DEF_ICON(ICON_FILE_BLEND)
-DEF_ICON(ICON_FILE_IMAGE)
-DEF_ICON(ICON_FILE_MOVIE)
-DEF_ICON(ICON_FILE_SCRIPT)
-DEF_ICON(ICON_FILE_SOUND)
-DEF_ICON(ICON_FILE_FONT)
-DEF_ICON(ICON_BLANK291b)
+DEF_ICON(SORTALPHA)
+DEF_ICON(SORTBYEXT)
+DEF_ICON(SORTTIME)
+DEF_ICON(SORTSIZE)
+DEF_ICON(LONGDISPLAY)
+DEF_ICON(SHORTDISPLAY)
+DEF_ICON(GHOST)
+DEF_ICON(IMGDISPLAY)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK284)
+ DEF_ICON(BLANK285)
+#endif
+DEF_ICON(BOOKMARKS)
+DEF_ICON(FONTPREVIEW)
+DEF_ICON(FILTER)
+DEF_ICON(NEWFOLDER)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK285F)
+#endif
+DEF_ICON(FILE_PARENT)
+DEF_ICON(FILE_REFRESH)
+DEF_ICON(FILE_FOLDER)
+DEF_ICON(FILE_BLANK)
+DEF_ICON(FILE_BLEND)
+DEF_ICON(FILE_IMAGE)
+DEF_ICON(FILE_MOVIE)
+DEF_ICON(FILE_SCRIPT)
+DEF_ICON(FILE_SOUND)
+DEF_ICON(FILE_FONT)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK291b)
/* available */
-DEF_ICON(ICON_BLANK292)
-DEF_ICON(ICON_BLANK293)
-DEF_ICON(ICON_BLANK294)
-DEF_ICON(ICON_BLANK295)
-DEF_ICON(ICON_BLANK296)
-DEF_ICON(ICON_BLANK297)
-DEF_ICON(ICON_BLANK298)
-DEF_ICON(ICON_BLANK299)
-DEF_ICON(ICON_BLANK300)
-DEF_ICON(ICON_BLANK301)
-DEF_ICON(ICON_BLANK302)
-DEF_ICON(ICON_BLANK303)
-DEF_ICON(ICON_BLANK304)
-DEF_ICON(ICON_BLANK305)
-DEF_ICON(ICON_BLANK306)
-DEF_ICON(ICON_BACK)
-DEF_ICON(ICON_FORWARD)
-DEF_ICON(ICON_BLANK309)
-DEF_ICON(ICON_BLANK310)
-DEF_ICON(ICON_BLANK311)
-DEF_ICON(ICON_BLANK312)
-DEF_ICON(ICON_BLANK313)
-DEF_ICON(ICON_BLANK314)
-DEF_ICON(ICON_BLANK315)
-DEF_ICON(ICON_BLANK316)
-DEF_ICON(ICON_DISK_DRIVE)
+ DEF_ICON(BLANK292)
+ DEF_ICON(BLANK293)
+ DEF_ICON(BLANK294)
+ DEF_ICON(BLANK295)
+ DEF_ICON(BLANK296)
+ DEF_ICON(BLANK297)
+ DEF_ICON(BLANK298)
+ DEF_ICON(BLANK299)
+ DEF_ICON(BLANK300)
+ DEF_ICON(BLANK301)
+ DEF_ICON(BLANK302)
+ DEF_ICON(BLANK303)
+ DEF_ICON(BLANK304)
+ DEF_ICON(BLANK305)
+ DEF_ICON(BLANK306)
+#endif
+DEF_ICON(BACK)
+DEF_ICON(FORWARD)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK309)
+ DEF_ICON(BLANK310)
+ DEF_ICON(BLANK311)
+ DEF_ICON(BLANK312)
+ DEF_ICON(BLANK313)
+ DEF_ICON(BLANK314)
+ DEF_ICON(BLANK315)
+ DEF_ICON(BLANK316)
+#endif
+DEF_ICON(DISK_DRIVE)
/* SHADING / TEXT */
-DEF_ICON(ICON_MATPLANE)
-DEF_ICON(ICON_MATSPHERE)
-DEF_ICON(ICON_MATCUBE)
-DEF_ICON(ICON_MONKEY)
-DEF_ICON(ICON_HAIR)
-DEF_ICON(ICON_ALIASED)
-DEF_ICON(ICON_ANTIALIASED)
-DEF_ICON(ICON_MAT_SPHERE_SKY)
-DEF_ICON(ICON_BLANK319)
-DEF_ICON(ICON_BLANK320)
-DEF_ICON(ICON_BLANK321)
-DEF_ICON(ICON_BLANK322)
-DEF_ICON(ICON_WORDWRAP_OFF)
-DEF_ICON(ICON_WORDWRAP_ON)
-DEF_ICON(ICON_SYNTAX_OFF)
-DEF_ICON(ICON_SYNTAX_ON)
-DEF_ICON(ICON_LINENUMBERS_OFF)
-DEF_ICON(ICON_LINENUMBERS_ON)
-DEF_ICON(ICON_SCRIPTPLUGINS) // XXX CREATE NEW
-DEF_ICON(ICON_BLANK323)
-DEF_ICON(ICON_BLANK324)
-DEF_ICON(ICON_BLANK325)
-DEF_ICON(ICON_BLANK326)
-DEF_ICON(ICON_BLANK327)
-DEF_ICON(ICON_BLANK328)
-DEF_ICON(ICON_BLANK328b)
+DEF_ICON(MATPLANE)
+DEF_ICON(MATSPHERE)
+DEF_ICON(MATCUBE)
+DEF_ICON(MONKEY)
+DEF_ICON(HAIR)
+DEF_ICON(ALIASED)
+DEF_ICON(ANTIALIASED)
+DEF_ICON(MAT_SPHERE_SKY)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK319)
+ DEF_ICON(BLANK320)
+ DEF_ICON(BLANK321)
+ DEF_ICON(BLANK322)
+#endif
+DEF_ICON(WORDWRAP_OFF)
+DEF_ICON(WORDWRAP_ON)
+DEF_ICON(SYNTAX_OFF)
+DEF_ICON(SYNTAX_ON)
+DEF_ICON(LINENUMBERS_OFF)
+DEF_ICON(LINENUMBERS_ON)
+DEF_ICON(SCRIPTPLUGINS) // XXX CREATE NEW
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK323)
+ DEF_ICON(BLANK324)
+ DEF_ICON(BLANK325)
+ DEF_ICON(BLANK326)
+ DEF_ICON(BLANK327)
+ DEF_ICON(BLANK328)
+ DEF_ICON(BLANK328b)
+#endif
/* SEQUENCE / IMAGE EDITOR */
-DEF_ICON(ICON_SEQ_SEQUENCER)
-DEF_ICON(ICON_SEQ_PREVIEW)
-DEF_ICON(ICON_SEQ_LUMA_WAVEFORM)
-DEF_ICON(ICON_SEQ_CHROMA_SCOPE)
-DEF_ICON(ICON_SEQ_HISTOGRAM)
-DEF_ICON(ICON_SEQ_SPLITVIEW)
-DEF_ICON(ICON_BLANK331)
-DEF_ICON(ICON_BLANK332)
-DEF_ICON(ICON_BLANK333)
-DEF_ICON(ICON_IMAGE_RGB) // XXX CHANGE TO STRAIGHT ALPHA, Z ETC
-DEF_ICON(ICON_IMAGE_RGB_ALPHA)
-DEF_ICON(ICON_IMAGE_ALPHA)
-DEF_ICON(ICON_IMAGE_ZDEPTH)
-DEF_ICON(ICON_IMAGEFILE)
-DEF_ICON(ICON_BLANK336)
-DEF_ICON(ICON_BLANK337)
-DEF_ICON(ICON_BLANK338)
-DEF_ICON(ICON_BLANK339)
-DEF_ICON(ICON_BLANK340)
-DEF_ICON(ICON_BLANK341)
-DEF_ICON(ICON_BLANK342)
-DEF_ICON(ICON_BLANK343)
-DEF_ICON(ICON_BLANK344)
-DEF_ICON(ICON_BLANK345)
-DEF_ICON(ICON_BLANK346)
-DEF_ICON(ICON_BLANK346b)
+DEF_ICON(SEQ_SEQUENCER)
+DEF_ICON(SEQ_PREVIEW)
+DEF_ICON(SEQ_LUMA_WAVEFORM)
+DEF_ICON(SEQ_CHROMA_SCOPE)
+DEF_ICON(SEQ_HISTOGRAM)
+DEF_ICON(SEQ_SPLITVIEW)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK331)
+ DEF_ICON(BLANK332)
+ DEF_ICON(BLANK333)
+#endif
+DEF_ICON(IMAGE_RGB) // XXX CHANGE TO STRAIGHT ALPHA, Z ETC
+DEF_ICON(IMAGE_RGB_ALPHA)
+DEF_ICON(IMAGE_ALPHA)
+DEF_ICON(IMAGE_ZDEPTH)
+DEF_ICON(IMAGEFILE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK336)
+ DEF_ICON(BLANK337)
+ DEF_ICON(BLANK338)
+ DEF_ICON(BLANK339)
+ DEF_ICON(BLANK340)
+ DEF_ICON(BLANK341)
+ DEF_ICON(BLANK342)
+ DEF_ICON(BLANK343)
+ DEF_ICON(BLANK344)
+ DEF_ICON(BLANK345)
+ DEF_ICON(BLANK346)
+ DEF_ICON(BLANK346b)
+#endif
/* brush icons */
-DEF_ICON(ICON_BRUSH_ADD)
-DEF_ICON(ICON_BRUSH_BLOB)
-DEF_ICON(ICON_BRUSH_BLUR)
-DEF_ICON(ICON_BRUSH_CLAY)
-DEF_ICON(ICON_BRUSH_CLONE)
-DEF_ICON(ICON_BRUSH_CREASE)
-DEF_ICON(ICON_BRUSH_DARKEN)
-DEF_ICON(ICON_BRUSH_FILL)
-DEF_ICON(ICON_BRUSH_FLATTEN)
-DEF_ICON(ICON_BRUSH_GRAB)
-DEF_ICON(ICON_BRUSH_INFLATE)
-DEF_ICON(ICON_BRUSH_LAYER)
-DEF_ICON(ICON_BRUSH_LIGHTEN)
-DEF_ICON(ICON_BRUSH_MIX)
-DEF_ICON(ICON_BRUSH_MULTIPLY)
-DEF_ICON(ICON_BRUSH_NUDGE)
-DEF_ICON(ICON_BRUSH_PINCH)
-DEF_ICON(ICON_BRUSH_SCRAPE)
-DEF_ICON(ICON_BRUSH_SCULPT_DRAW)
-DEF_ICON(ICON_BRUSH_SMEAR)
-DEF_ICON(ICON_BRUSH_SMOOTH)
-DEF_ICON(ICON_BRUSH_SNAKE_HOOK)
-DEF_ICON(ICON_BRUSH_SOFTEN)
-DEF_ICON(ICON_BRUSH_SUBTRACT)
-DEF_ICON(ICON_BRUSH_TEXDRAW)
-DEF_ICON(ICON_BRUSH_THUMB)
-DEF_ICON(ICON_BRUSH_ROTATE)
-DEF_ICON(ICON_BRUSH_VERTEXDRAW)
-
- /* vector icons */
-
-DEF_ICON(VICO_VIEW3D_VEC)
-DEF_ICON(VICO_EDIT_VEC)
-DEF_ICON(VICO_EDITMODE_DEHLT)
-DEF_ICON(VICO_EDITMODE_HLT)
-DEF_ICON(VICO_DISCLOSURE_TRI_RIGHT_VEC)
-DEF_ICON(VICO_DISCLOSURE_TRI_DOWN_VEC)
-DEF_ICON(VICO_MOVE_UP_VEC)
-DEF_ICON(VICO_MOVE_DOWN_VEC)
-DEF_ICON(VICO_X_VEC)
-DEF_ICON(VICO_SMALL_TRI_RIGHT_VEC)
+DEF_ICON(BRUSH_ADD)
+DEF_ICON(BRUSH_BLOB)
+DEF_ICON(BRUSH_BLUR)
+DEF_ICON(BRUSH_CLAY)
+DEF_ICON(BRUSH_CLONE)
+DEF_ICON(BRUSH_CREASE)
+DEF_ICON(BRUSH_DARKEN)
+DEF_ICON(BRUSH_FILL)
+DEF_ICON(BRUSH_FLATTEN)
+DEF_ICON(BRUSH_GRAB)
+DEF_ICON(BRUSH_INFLATE)
+DEF_ICON(BRUSH_LAYER)
+DEF_ICON(BRUSH_LIGHTEN)
+DEF_ICON(BRUSH_MIX)
+DEF_ICON(BRUSH_MULTIPLY)
+DEF_ICON(BRUSH_NUDGE)
+DEF_ICON(BRUSH_PINCH)
+DEF_ICON(BRUSH_SCRAPE)
+DEF_ICON(BRUSH_SCULPT_DRAW)
+DEF_ICON(BRUSH_SMEAR)
+DEF_ICON(BRUSH_SMOOTH)
+DEF_ICON(BRUSH_SNAKE_HOOK)
+DEF_ICON(BRUSH_SOFTEN)
+DEF_ICON(BRUSH_SUBTRACT)
+DEF_ICON(BRUSH_TEXDRAW)
+DEF_ICON(BRUSH_THUMB)
+DEF_ICON(BRUSH_ROTATE)
+DEF_ICON(BRUSH_VERTEXDRAW)
+/* vector icons, VICO_ prefix added */
+DEF_VICO(VIEW3D_VEC)
+DEF_VICO(EDIT_VEC)
+DEF_VICO(EDITMODE_DEHLT)
+DEF_VICO(EDITMODE_HLT)
+DEF_VICO(DISCLOSURE_TRI_RIGHT_VEC)
+DEF_VICO(DISCLOSURE_TRI_DOWN_VEC)
+DEF_VICO(MOVE_UP_VEC)
+DEF_VICO(MOVE_DOWN_VEC)
+DEF_VICO(X_VEC)
+DEF_VICO(SMALL_TRI_RIGHT_VEC)
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 54a627da2da..b9ded28b613 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -77,26 +77,27 @@ typedef struct uiLayout uiLayout;
#define UI_EMBOSST 3 /* Table */
/* uiBlock->direction */
+#define UI_DIRECTION (UI_TOP|UI_DOWN|UI_LEFT|UI_RIGHT)
#define UI_TOP 1
#define UI_DOWN 2
#define UI_LEFT 4
#define UI_RIGHT 8
-#define UI_DIRECTION 15
+
#define UI_CENTER 16
#define UI_SHIFT_FLIPPED 32
/* uiBlock->autofill (not yet used) */
-#define UI_BLOCK_COLLUMNS 1
-#define UI_BLOCK_ROWS 2
+// #define UI_BLOCK_COLLUMNS 1
+// #define UI_BLOCK_ROWS 2
/* uiBlock->flag (controls) */
#define UI_BLOCK_LOOP 1
#define UI_BLOCK_REDRAW 2
#define UI_BLOCK_RET_1 4 /* XXX 2.5 not implemented */
#define UI_BLOCK_NUMSELECT 8
-#define UI_BLOCK_ENTER_OK 16
-#define UI_BLOCK_NOSHADOW 32
-#define UI_BLOCK_UNUSED 64
+/*#define UI_BLOCK_ENTER_OK 16*/ /*UNUSED*/
+/*#define UI_BLOCK_NOSHADOW 32*/ /*UNUSED*/
+/*#define UI_BLOCK_UNUSED 64*/ /*UNUSED*/
#define UI_BLOCK_MOVEMOUSE_QUIT 128
#define UI_BLOCK_KEEP_OPEN 256
#define UI_BLOCK_POPUP 512
@@ -113,13 +114,8 @@ typedef struct uiLayout uiLayout;
/* block->flag bits 12-15 are identical to but->flag bits */
/* panel controls */
-#define UI_PNL_TRANSP 1
#define UI_PNL_SOLID 2
-
#define UI_PNL_CLOSE 32
-#define UI_PNL_STOW 64
-#define UI_PNL_TO_MOUSE 128
-#define UI_PNL_UNSTOW 256
#define UI_PNL_SCALE 512
/* warning the first 6 flags are internal */
@@ -171,7 +167,7 @@ typedef struct uiLayout uiLayout;
#define SHO 64
#define INT 96
#define FLO 128
-#define FUN 192
+/*#define FUN 192*/ /*UNUSED*/
#define BIT 256
#define BUTPOIN (128+64+32)
@@ -215,6 +211,7 @@ typedef struct uiLayout uiLayout;
#define TOGBUT (37<<9)
#define OPTION (38<<9)
#define OPTIONN (39<<9)
+ /* buttons with value >= SEARCH_MENU don't get undo pushes */
#define SEARCH_MENU (40<<9)
#define BUT_EXTRA (41<<9)
#define HSVCIRCLE (42<<9)
@@ -270,7 +267,7 @@ typedef void (*uiMenuHandleFunc)(struct bContext *C, void *arg, int event);
*
* Functions used to create popup menus. For more extended menus the
* uiPupMenuBegin/End functions can be used to define own items with
- * the uiItem functions inbetween. If it is a simple confirmation menu
+ * the uiItem functions in between. If it is a simple confirmation menu
* or similar, popups can be created with a single function call. */
typedef struct uiPopupMenu uiPopupMenu;
@@ -279,10 +276,10 @@ uiPopupMenu *uiPupMenuBegin(struct bContext *C, const char *title, int icon);
void uiPupMenuEnd(struct bContext *C, struct uiPopupMenu *head);
struct uiLayout *uiPupMenuLayout(uiPopupMenu *head);
-void uiPupMenuOkee(struct bContext *C, char *opname, char *str, ...);
-void uiPupMenuSaveOver(struct bContext *C, struct wmOperator *op, char *filename);
-void uiPupMenuNotice(struct bContext *C, char *str, ...);
-void uiPupMenuError(struct bContext *C, char *str, ...);
+void uiPupMenuOkee(struct bContext *C, const char *opname, const char *str, ...);
+void uiPupMenuSaveOver(struct bContext *C, struct wmOperator *op, const char *filename);
+void uiPupMenuNotice(struct bContext *C, const char *str, ...);
+void uiPupMenuError(struct bContext *C, const char *str, ...);
void uiPupMenuReports(struct bContext *C, struct ReportList *reports);
void uiPupMenuInvoke(struct bContext *C, const char *idname); /* popup registered menu */
@@ -294,7 +291,7 @@ void uiPupMenuInvoke(struct bContext *C, const char *idname); /* popup registere
typedef uiBlock* (*uiBlockCreateFunc)(struct bContext *C, struct ARegion *ar, void *arg1);
void uiPupBlock(struct bContext *C, uiBlockCreateFunc func, void *arg);
-void uiPupBlockO(struct bContext *C, uiBlockCreateFunc func, void *arg, char *opname, int opcontext);
+void uiPupBlockO(struct bContext *C, uiBlockCreateFunc func, void *arg, const char *opname, int opcontext);
void uiPupBlockOperator(struct bContext *C, uiBlockCreateFunc func, struct wmOperator *op, int opcontext);
void uiPupBlockClose(struct bContext *C, uiBlock *block);
@@ -314,9 +311,9 @@ uiBlock *uiBeginBlock(const struct bContext *C, struct ARegion *region, const ch
void uiEndBlock(const struct bContext *C, uiBlock *block);
void uiDrawBlock(const struct bContext *C, struct uiBlock *block);
-uiBlock *uiGetBlock(char *name, struct ARegion *ar);
+uiBlock *uiGetBlock(const char *name, struct ARegion *ar);
-void uiBlockSetEmboss(uiBlock *block, short dt);
+void uiBlockSetEmboss(uiBlock *block, char dt);
void uiFreeBlock(const struct bContext *C, uiBlock *block);
void uiFreeBlocks(const struct bContext *C, struct ListBase *lb);
@@ -324,7 +321,7 @@ void uiFreeInactiveBlocks(const struct bContext *C, struct ListBase *lb);
void uiBlockSetRegion(uiBlock *block, struct ARegion *region);
-void uiBlockSetButLock(uiBlock *block, int val, char *lockstr);
+void uiBlockSetButLock(uiBlock *block, int val, const char *lockstr);
void uiBlockClearButLock(uiBlock *block);
/* automatic aligning, horiz or verical */
@@ -337,7 +334,7 @@ enum {
UI_BLOCK_BOUNDS_TEXT,
UI_BLOCK_BOUNDS_POPUP_MOUSE,
UI_BLOCK_BOUNDS_POPUP_MENU,
- UI_BLOCK_BOUNDS_POPUP_CENTER,
+ UI_BLOCK_BOUNDS_POPUP_CENTER
} eBlockBoundsCalc;
void uiBoundsBlock(struct uiBlock *block, int addval);
@@ -383,62 +380,66 @@ int uiButActiveOnly (const struct bContext *C, uiBlock *block, uiBut *but);
* - O: operator */
uiBut *uiDefBut(uiBlock *block,
- int type, int retval, char *str,
- short x1, short y1,
+ int type, int retval, const char *str,
+ int x1, int y1,
short x2, short y2,
void *poin,
float min, float max,
- float a1, float a2, char *tip);
-uiBut *uiDefButF(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButBitF(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButI(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButBitI(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButS(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButBitS(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButC(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButBitC(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButR(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButO(uiBlock *block, int type, char *opname, int opcontext, char *str, short x1, short y1, short x2, short y2, char *tip);
+ float a1, float a2, const char *tip);
+uiBut *uiDefButF(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButBitF(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButI(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButBitI(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButS(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButBitS(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButC(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButBitC(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButR(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButO(uiBlock *block, int type, const char *opname, int opcontext, const char *str, int x1, int y1, short x2, short y2, const char *tip);
+uiBut *uiDefButTextO(uiBlock *block, int type, const char *opname, int opcontext, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip);
uiBut *uiDefIconBut(uiBlock *block,
int type, int retval, int icon,
- short x1, short y1,
+ int x1, int y1,
short x2, short y2,
void *poin,
float min, float max,
- float a1, float a2, char *tip);
-uiBut *uiDefIconButF(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButBitF(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButI(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButBitI(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButS(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButBitS(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButC(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButBitC(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButR(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButO(uiBlock *block, int type, char *opname, int opcontext, int icon, short x1, short y1, short x2, short y2, char *tip);
+ float a1, float a2, const char *tip);
+uiBut *uiDefIconButF(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButBitF(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButI(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButBitI(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButS(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButBitS(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButC(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButBitC(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButR(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButO(uiBlock *block, int type, const char *opname, int opcontext, int icon, int x1, int y1, short x2, short y2, const char *tip);
uiBut *uiDefIconTextBut(uiBlock *block,
- int type, int retval, int icon, char *str,
- short x1, short y1,
+ int type, int retval, int icon, const char *str,
+ int x1, int y1,
short x2, short y2,
void *poin,
float min, float max,
- float a1, float a2, char *tip);
-uiBut *uiDefIconTextButF(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButBitF(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButI(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButBitI(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButS(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButBitS(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButC(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButBitC(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButR(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButO(uiBlock *block, int type, char *opname, int opcontext, int icon, char *str, short x1, short y1, short x2, short y2, char *tip);
+ float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButF(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButBitF(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButI(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButBitI(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButS(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButBitS(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButC(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButBitC(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButR(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButO(uiBlock *block, int type, const char *opname, int opcontext, int icon, const char *str, int x1, int y1, short x2, short y2, const char *tip);
/* for passing inputs to ButO buttons */
struct PointerRNA *uiButGetOperatorPtrRNA(uiBut *but);
+void uiButSetUnitType(uiBut *but, const int unit_type);
+int uiButGetUnitType(uiBut *but);
+
/* Special Buttons
*
* Butons with a more specific purpose:
@@ -464,34 +465,34 @@ struct PointerRNA *uiButGetOperatorPtrRNA(uiBut *but);
#define UI_ID_PREVIEWS 2048
#define UI_ID_FULL (UI_ID_RENAME|UI_ID_BROWSE|UI_ID_ADD_NEW|UI_ID_OPEN|UI_ID_ALONE|UI_ID_DELETE|UI_ID_LOCAL)
-typedef void (*uiIDPoinFuncFP)(struct bContext *C, char *str, struct ID **idpp);
+typedef void (*uiIDPoinFuncFP)(struct bContext *C, const char *str, struct ID **idpp);
typedef void (*uiIDPoinFunc)(struct bContext *C, struct ID *id, int event);
-uiBut *uiDefIDPoinBut(uiBlock *block, uiIDPoinFuncFP func, short blocktype, int retval, char *str,
- short x1, short y1, short x2, short y2, void *idpp, char *tip);
+uiBut *uiDefIDPoinBut(uiBlock *block, uiIDPoinFuncFP func, short blocktype, int retval, const char *str,
+ int x1, int y1, short x2, short y2, void *idpp, const char *tip);
int uiIconFromID(struct ID *id);
-uiBut *uiDefPulldownBut(uiBlock *block, uiBlockCreateFunc func, void *arg, char *str, short x1, short y1, short x2, short y2, char *tip);
-uiBut *uiDefMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, char *str, short x1, short y1, short x2, short y2, char *tip);
-uiBut *uiDefIconTextMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, char *str, short x1, short y1, short x2, short y2, char *tip);
-uiBut *uiDefIconMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, short x1, short y1, short x2, short y2, char *tip);
+uiBut *uiDefPulldownBut(uiBlock *block, uiBlockCreateFunc func, void *arg, const char *str, int x1, int y1, short x2, short y2, const char *tip);
+uiBut *uiDefMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, const char *str, int x1, int y1, short x2, short y2, const char *tip);
+uiBut *uiDefIconTextMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, const char *str, int x1, int y1, short x2, short y2, const char *tip);
+uiBut *uiDefIconMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, int x1, int y1, short x2, short y2, const char *tip);
-uiBut *uiDefBlockBut(uiBlock *block, uiBlockCreateFunc func, void *func_arg1, char *str, short x1, short y1, short x2, short y2, char *tip);
-uiBut *uiDefBlockButN(uiBlock *block, uiBlockCreateFunc func, void *argN, char *str, short x1, short y1, short x2, short y2, char *tip);
+uiBut *uiDefBlockBut(uiBlock *block, uiBlockCreateFunc func, void *func_arg1, const char *str, int x1, int y1, short x2, short y2, const char *tip);
+uiBut *uiDefBlockButN(uiBlock *block, uiBlockCreateFunc func, void *argN, const char *str, int x1, int y1, short x2, short y2, const char *tip);
-uiBut *uiDefIconBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int retval, int icon, short x1, short y1, short x2, short y2, char *tip);
-uiBut *uiDefIconTextBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int icon, char *str, short x1, short y1, short x2, short y2, char *tip);
+uiBut *uiDefIconBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int retval, int icon, int x1, int y1, short x2, short y2, const char *tip);
+uiBut *uiDefIconTextBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int icon, const char *str, int x1, int y1, short x2, short y2, const char *tip);
-uiBut *uiDefKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, short x2, short y2, short *spoin, char *tip);
-uiBut *uiDefHotKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, short x2, short y2, short *keypoin, short *modkeypoin, char *tip);
+uiBut *uiDefKeyevtButS(uiBlock *block, int retval, const char *str, int x1, int y1, short x2, short y2, short *spoin, const char *tip);
+uiBut *uiDefHotKeyevtButS(uiBlock *block, int retval, const char *str, int x1, int y1, short x2, short y2, short *keypoin, short *modkeypoin, const char *tip);
-uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, short x1, short y1, short x2, short y2, float a1, float a2, char *tip);
+uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, int x1, int y1, short x2, short y2, float a1, float a2, const char *tip);
void uiBlockPickerButtons(struct uiBlock *block, float *col, float *hsv, float *old, char *hexcol, char mode, short retval);
-uiBut *uiDefAutoButR(uiBlock *block, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, char *name, int icon, int x1, int y1, int x2, int y2);
-void uiDefAutoButsRNA(const struct bContext *C, uiLayout *layout, struct PointerRNA *ptr, int columns);
+uiBut *uiDefAutoButR(uiBlock *block, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, const char *name, int icon, int x1, int y1, int x2, int y2);
+int uiDefAutoButsRNA(uiLayout *layout, struct PointerRNA *ptr, int (*check_prop)(struct PropertyRNA *), const char label_align);
/* Links
*
@@ -524,7 +525,7 @@ typedef void (*uiButHandleFunc)(struct bContext *C, void *arg1, void *arg2);
typedef void (*uiButHandleRenameFunc)(struct bContext *C, void *arg, char *origstr);
typedef void (*uiButHandleNFunc)(struct bContext *C, void *argN, void *arg2);
typedef void (*uiButCompleteFunc)(struct bContext *C, char *str, void *arg);
-typedef void (*uiButSearchFunc)(const struct bContext *C, void *arg, char *str, uiSearchItems *items);
+typedef void (*uiButSearchFunc)(const struct bContext *C, void *arg, const char *str, uiSearchItems *items);
typedef void (*uiBlockHandleFunc)(struct bContext *C, void *arg, int event);
/* use inside searchfunc to add items */
@@ -555,7 +556,7 @@ void uiBlockSetDrawExtraFunc(uiBlock *block, void (*func)(const struct bContext
typedef struct AutoComplete AutoComplete;
-AutoComplete *autocomplete_begin(char *startname, int maxlen);
+AutoComplete *autocomplete_begin(const char *startname, int maxlen);
void autocomplete_do_name(AutoComplete *autocpl, const char *name);
void autocomplete_end(AutoComplete *autocpl, char *autoname);
@@ -628,6 +629,13 @@ void UI_exit(void);
#define UI_ITEM_R_NO_BG 128
#define UI_ITEM_R_IMMEDIATE 256
+/* uiLayoutOperatorButs flags */
+#define UI_LAYOUT_OP_SHOW_TITLE 1
+#define UI_LAYOUT_OP_SHOW_EMPTY 2
+
+/* for more readable function names */
+#define ICON_NULL 0
+
uiLayout *uiBlockLayout(uiBlock *block, int dir, int type, int x, int y, int size, int em, struct uiStyle *style);
void uiBlockSetCurLayout(uiBlock *block, uiLayout *layout);
void uiBlockLayoutResolve(uiBlock *block, int *x, int *y);
@@ -635,8 +643,9 @@ void uiBlockLayoutResolve(uiBlock *block, int *x, int *y);
uiBlock *uiLayoutGetBlock(uiLayout *layout);
void uiLayoutSetFunc(uiLayout *layout, uiMenuHandleFunc handlefunc, void *argv);
-void uiLayoutSetContextPointer(uiLayout *layout, char *name, struct PointerRNA *ptr);
-char *uiLayoutIntrospect(uiLayout *layout); // XXX - testing
+void uiLayoutSetContextPointer(uiLayout *layout, const char *name, struct PointerRNA *ptr);
+const char *uiLayoutIntrospect(uiLayout *layout); // XXX - testing
+void uiLayoutOperatorButs(const struct bContext *C, struct uiLayout *layout, struct wmOperator *op, int (*check_prop)(struct PropertyRNA *), const char label_align, const short flag);
void uiLayoutSetOperatorContext(uiLayout *layout, int opcontext);
void uiLayoutSetActive(uiLayout *layout, int active);
@@ -673,28 +682,28 @@ uiBlock *uiLayoutAbsoluteBlock(uiLayout *layout);
/* templates */
void uiTemplateHeader(uiLayout *layout, struct bContext *C, int menus);
void uiTemplateDopeSheetFilter(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
-void uiTemplateID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname,
- char *newop, char *openop, char *unlinkop);
-void uiTemplateIDBrowse(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname,
- char *newop, char *openop, char *unlinkop);
-void uiTemplateIDPreview(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname,
- char *newop, char *openop, char *unlinkop, int rows, int cols);
-void uiTemplateAnyID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname,
- char *proptypename, char *text);
-void uiTemplatePathBuilder(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname,
- struct PointerRNA *root_ptr, char *text);
+void uiTemplateID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
+ const char *newop, const char *openop, const char *unlinkop);
+void uiTemplateIDBrowse(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
+ const char *newop, const char *openop, const char *unlinkop);
+void uiTemplateIDPreview(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
+ const char *newop, const char *openop, const char *unlinkop, int rows, int cols);
+void uiTemplateAnyID(uiLayout *layout, struct PointerRNA *ptr, const char *propname,
+ const char *proptypename, const char *text);
+void uiTemplatePathBuilder(uiLayout *layout, struct PointerRNA *ptr, const char *propname,
+ struct PointerRNA *root_ptr, const char *text);
uiLayout *uiTemplateModifier(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
uiLayout *uiTemplateConstraint(uiLayout *layout, struct PointerRNA *ptr);
-void uiTemplatePreview(uiLayout *layout, struct ID *id, struct ID *parent, struct MTex *slot);
-void uiTemplateColorRamp(uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand);
-void uiTemplateHistogram(uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand);
-void uiTemplateWaveform(uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand);
-void uiTemplateVectorscope(uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand);
-void uiTemplateCurveMapping(uiLayout *layout, struct PointerRNA *ptr, char *propname, int type, int levels, int brush);
-void uiTemplateColorWheel(uiLayout *layout, struct PointerRNA *ptr, char *propname, int value_slider, int lock, int lock_luminosity, int cubic);
-void uiTemplateLayers(uiLayout *layout, struct PointerRNA *ptr, char *propname,
- PointerRNA *used_ptr, char *used_propname, int active_layer);
-void uiTemplateImage(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, struct PointerRNA *userptr, int compact);
+void uiTemplatePreview(uiLayout *layout, struct ID *id, int show_buttons, struct ID *parent, struct MTex *slot);
+void uiTemplateColorRamp(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int expand);
+void uiTemplateHistogram(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
+void uiTemplateWaveform(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
+void uiTemplateVectorscope(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
+void uiTemplateCurveMapping(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int type, int levels, int brush);
+void uiTemplateColorWheel(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int value_slider, int lock, int lock_luminosity, int cubic);
+void uiTemplateLayers(uiLayout *layout, struct PointerRNA *ptr, const char *propname,
+ PointerRNA *used_ptr, const char *used_propname, int active_layer);
+void uiTemplateImage(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, struct PointerRNA *userptr, int compact);
void uiTemplateImageLayers(uiLayout *layout, struct bContext *C, struct Image *ima, struct ImageUser *iuser);
void uiTemplateRunningJobs(uiLayout *layout, struct bContext *C);
void uiTemplateOperatorSearch(uiLayout *layout);
@@ -702,36 +711,36 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C);
void uiTemplateTextureImage(uiLayout *layout, struct bContext *C, struct Tex *tex);
void uiTemplateReportsBanner(uiLayout *layout, struct bContext *C);
-void uiTemplateList(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, struct PointerRNA *activeptr, char *activeprop, int rows, int maxrows, int type);
+void uiTemplateList(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, struct PointerRNA *activeptr, const char *activeprop, int rows, int maxrows, int type);
/* items */
-void uiItemO(uiLayout *layout, char *name, int icon, char *opname);
-void uiItemEnumO(uiLayout *layout, char *opname, char *name, int icon, char *propname, int value);
-void uiItemEnumO_string(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value);
-void uiItemsEnumO(uiLayout *layout, char *opname, char *propname);
-void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value);
-void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value);
-void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *propname, float value);
-void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value);
-PointerRNA uiItemFullO(uiLayout *layout, char *idname, char *name, int icon, struct IDProperty *properties, int context, int flag);
-
-void uiItemR(uiLayout *layout, struct PointerRNA *ptr, char *propname, int flag, char *name, int icon);
-void uiItemFullR(uiLayout *layout, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, int value, int flag, char *name, int icon);
-void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int value);
-void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *value, char *name, int icon);
-void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname);
-void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, struct PointerRNA *searchptr, char *searchpropname, char *name, int icon);
-void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, struct IDProperty *properties, int context, int flag);
-
-void uiItemL(uiLayout *layout, char *name, int icon); /* label */
-void uiItemLDrag(uiLayout *layout, struct PointerRNA *ptr, char *name, int icon); /* label icon for dragging */
-void uiItemM(uiLayout *layout, struct bContext *C, char *menuname, char *name, int icon); /* menu */
-void uiItemV(uiLayout *layout, char *name, int icon, int argval); /* value */
+void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname);
+void uiItemEnumO(uiLayout *layout, const char *opname, const char *name, int icon, const char *propname, int value);
+void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value);
+void uiItemsEnumO(uiLayout *layout, const char *opname, const char *propname);
+void uiItemBooleanO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value);
+void uiItemIntO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value);
+void uiItemFloatO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, float value);
+void uiItemStringO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value);
+PointerRNA uiItemFullO(uiLayout *layout, const char *idname, const char *name, int icon, struct IDProperty *properties, int context, int flag);
+
+void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon);
+void uiItemFullR(uiLayout *layout, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, int value, int flag, const char *name, int icon);
+void uiItemEnumR(uiLayout *layout, const char *name, int icon, struct PointerRNA *ptr, const char *propname, int value);
+void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *value, const char *name, int icon);
+void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
+void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon);
+void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname, struct IDProperty *properties, int context, int flag);
+
+void uiItemL(uiLayout *layout, const char *name, int icon); /* label */
+void uiItemLDrag(uiLayout *layout, struct PointerRNA *ptr, const char *name, int icon); /* label icon for dragging */
+void uiItemM(uiLayout *layout, struct bContext *C, const char *menuname, const char *name, int icon); /* menu */
+void uiItemV(uiLayout *layout, const char *name, int icon, int argval); /* value */
void uiItemS(uiLayout *layout); /* separator */
-void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func, void *arg);
-void uiItemMenuEnumO(uiLayout *layout, char *opname, char *propname, char *name, int icon);
-void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *name, int icon);
+void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg);
+void uiItemMenuEnumO(uiLayout *layout, const char *opname, const char *propname, const char *name, int icon);
+void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *name, int icon);
/* UI Operators */
void UI_buttons_operatortypes(void);
@@ -744,11 +753,13 @@ void uiIDContextProperty(struct bContext *C, struct PointerRNA *ptr, struct Prop
/* Styled text draw */
void uiStyleFontSet(struct uiFontStyle *fs);
-void uiStyleFontDraw(struct uiFontStyle *fs, struct rcti *rect, char *str);
-void uiStyleFontDrawRotated(struct uiFontStyle *fs, struct rcti *rect, char *str);
+void uiStyleFontDrawExt(struct uiFontStyle *fs, struct rcti *rect, const char *str,
+ float *r_xofs, float *r_yofs);
+void uiStyleFontDraw(struct uiFontStyle *fs, struct rcti *rect, const char *str);
+void uiStyleFontDrawRotated(struct uiFontStyle *fs, struct rcti *rect, const char *str);
-int UI_GetStringWidth(char *str); // XXX temp
-void UI_DrawString(float x, float y, char *str); // XXX temp
+int UI_GetStringWidth(const char *str); // XXX temp
+void UI_DrawString(float x, float y, const char *str); // XXX temp
#endif /* UI_INTERFACE_H */
diff --git a/source/blender/editors/include/UI_interface_icons.h b/source/blender/editors/include/UI_interface_icons.h
index 73fc2d6316d..34a390b250e 100644
--- a/source/blender/editors/include/UI_interface_icons.h
+++ b/source/blender/editors/include/UI_interface_icons.h
@@ -62,11 +62,11 @@ void UI_icon_draw_preview_aspect_size(float x, float y, int icon_id, float aspec
void UI_icon_draw_aspect(float x, float y, int icon_id, float aspect, float alpha);
void UI_icon_draw_aspect_color(float x, float y, int icon_id, float aspect, float *rgb);
void UI_icon_draw_size(float x, float y, int size, int icon_id, float alpha);
-void UI_icons_free();
+void UI_icons_free(void);
void UI_icons_free_drawinfo(void *drawinfo);
struct ListBase *UI_iconfile_list(void);
-int UI_iconfile_get_index(char *filename);
+int UI_iconfile_get_index(const char *filename);
#endif /* UI_INTERFACE_ICONS_H */
diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h
index af3f91f8ba8..5c97da4ebc9 100644
--- a/source/blender/editors/include/UI_resources.h
+++ b/source/blender/editors/include/UI_resources.h
@@ -35,7 +35,8 @@
/* elubie: TODO: move the typedef for icons to UI_interface_icons.h */
/* and add/replace include of UI_resources.h by UI_interface_icons.h */
-#define DEF_ICON(name) name,
+#define DEF_ICON(name) ICON_##name,
+#define DEF_VICO(name) VICO_##name,
typedef enum {
#define BIFICONID_FIRST (ICON_BLENDER)
@@ -45,6 +46,7 @@ typedef enum {
#define BIFNICONIDS (BIFICONID_LAST-BIFICONID_FIRST + 1)
} BIFIconID;
#undef DEF_ICON
+#undef DEF_VICO
typedef enum {
@@ -230,6 +232,10 @@ enum {
TH_PREVIEW_BACK,
TH_EDGE_CREASE,
+
+ TH_DRAWEXTRA_EDGELEN,
+ TH_DRAWEXTRA_FACEAREA,
+ TH_DRAWEXTRA_FACEANG
};
/* XXX WARNING: previous is saved in file, so do not change order! */
@@ -268,17 +274,17 @@ void UI_GetThemeColor3fv(int colorid, float *col);
void UI_GetThemeColorShade3fv(int colorid, int offset, float *col);
// get the 3 or 4 byte values
-void UI_GetThemeColor3ubv(int colorid, char *col);
-void UI_GetThemeColor4ubv(int colorid, char *col);
+void UI_GetThemeColor3ubv(int colorid, unsigned char col[3]);
+void UI_GetThemeColor4ubv(int colorid, unsigned char col[4]);
// get a theme color from specified space type
-void UI_GetThemeColorType4ubv(int colorid, int spacetype, char *col);
+void UI_GetThemeColorType4ubv(int colorid, int spacetype, char col[4]);
// blends and shades between two color pointers
-void UI_ColorPtrBlendShade3ubv(char *cp1, char *cp2, float fac, int offset);
+void UI_ColorPtrBlendShade3ubv(const unsigned char cp1[3], const unsigned char cp2[3], float fac, int offset);
// get a 3 byte color, blended and shaded between two other char color pointers
-void UI_GetColorPtrBlendShade3ubv(char *cp1, char *cp2, char *col, float fac, int offset);
+void UI_GetColorPtrBlendShade3ubv(const unsigned char cp1[3], const unsigned char cp2[3], unsigned char col[3], float fac, int offset);
// clear the openGL ClearColor using the input colorid
void UI_ThemeClearColor(int colorid);
@@ -287,9 +293,8 @@ void UI_ThemeClearColor(int colorid);
void UI_SetTheme(int spacetype, int regionid);
/* only for buttons in theme editor! */
-char *UI_ThemeGetColorPtr(struct bTheme *btheme, int spacetype, int colorid);
-char *UI_ThemeColorsPup(int spacetype);
+const unsigned char *UI_ThemeGetColorPtr(struct bTheme *btheme, int spacetype, int colorid);
-void UI_make_axis_color(char *src_col, char *dst_col, char axis);
+void UI_make_axis_color(const unsigned char *src_col, unsigned char *dst_col, const char axis);
#endif /* UI_ICONS_H */
diff --git a/source/blender/editors/include/UI_view2d.h b/source/blender/editors/include/UI_view2d.h
index bf4a3de9cc6..7cad1d82d50 100644
--- a/source/blender/editors/include/UI_view2d.h
+++ b/source/blender/editors/include/UI_view2d.h
@@ -57,7 +57,7 @@ enum {
/* headers (this is basically the same as listview, but no y-panning) */
V2D_COMMONVIEW_HEADER,
/* ui region containing panels */
- V2D_COMMONVIEW_PANELS_UI,
+ V2D_COMMONVIEW_PANELS_UI
} eView2D_CommonViewTypes;
/* ---- Defines for Scroller/Grid Arguments ----- */
@@ -76,13 +76,13 @@ enum {
V2D_UNIT_VALUES,
V2D_UNIT_DEGREES,
V2D_UNIT_TIME,
- V2D_UNIT_SECONDSSEQ,
+ V2D_UNIT_SECONDSSEQ
} eView2D_Units;
/* clamping of grid values to whole numbers */
enum {
V2D_GRID_NOCLAMP = 0,
- V2D_GRID_CLAMP,
+ V2D_GRID_CLAMP
} eView2D_Clamp;
/* flags for grid-lines to draw */
@@ -156,14 +156,14 @@ void UI_view2d_totRect_set_resize(struct View2D *v2d, int width, int height, int
int UI_view2d_tab_set(struct View2D *v2d, int tab);
/* view matrix operations */
-void UI_view2d_view_ortho(const struct bContext *C, struct View2D *v2d);
-void UI_view2d_view_orthoSpecial(const struct bContext *C, struct View2D *v2d, short xaxis);
+void UI_view2d_view_ortho(struct View2D *v2d);
+void UI_view2d_view_orthoSpecial(struct ARegion *ar, struct View2D *v2d, short xaxis);
void UI_view2d_view_restore(const struct bContext *C);
/* grid drawing */
-View2DGrid *UI_view2d_grid_calc(const struct bContext *C, struct View2D *v2d, short xunits, short xclamp, short yunits, short yclamp, int winx, int winy);
-void UI_view2d_grid_draw(const struct bContext *C, struct View2D *v2d, View2DGrid *grid, int flag);
-void UI_view2d_constant_grid_draw(const struct bContext *C, struct View2D *v2d);
+View2DGrid *UI_view2d_grid_calc(struct Scene *scene, struct View2D *v2d, short xunits, short xclamp, short yunits, short yclamp, int winx, int winy);
+void UI_view2d_grid_draw(struct View2D *v2d, View2DGrid *grid, int flag);
+void UI_view2d_constant_grid_draw(struct View2D *v2d);
void UI_view2d_grid_size(View2DGrid *grid, float *r_dx, float *r_dy);
void UI_view2d_grid_free(View2DGrid *grid);
@@ -191,8 +191,8 @@ void UI_view2d_getscale(struct View2D *v2d, float *x, float *y);
short UI_view2d_mouse_in_scrollers(const struct bContext *C, struct View2D *v2d, int x, int y);
/* cached text drawing in v2d, to allow pixel-aligned draw as post process */
-void UI_view2d_text_cache_add(struct View2D *v2d, float x, float y, char *str);
-void UI_view2d_text_cache_rectf(struct View2D *v2d, struct rctf *rect, char *str);
+void UI_view2d_text_cache_add(struct View2D *v2d, float x, float y, const char *str, const char col[4]);
+void UI_view2d_text_cache_rectf(struct View2D *v2d, struct rctf *rect, const char *str, const char col[4]);
void UI_view2d_text_cache_draw(struct ARegion *ar);
/* operators */
diff --git a/source/blender/editors/interface/CMakeLists.txt b/source/blender/editors/interface/CMakeLists.txt
index 4b4590aeee5..6be7314304f 100644
--- a/source/blender/editors/interface/CMakeLists.txt
+++ b/source/blender/editors/interface/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenfont
../../blenkernel
@@ -35,12 +33,33 @@ SET(INC
../../../../intern/guardedalloc
)
-IF(WITH_INTERNATIONAL)
- ADD_DEFINITIONS(-DINTERNATIONAL)
-ENDIF(WITH_INTERNATIONAL)
+set(SRC
+ interface.c
+ interface_anim.c
+ interface_draw.c
+ interface_handlers.c
+ interface_icons.c
+ interface_layout.c
+ interface_ops.c
+ interface_panel.c
+ interface_regions.c
+ interface_style.c
+ interface_templates.c
+ interface_utils.c
+ interface_widgets.c
+ resources.c
+ view2d.c
+ view2d_ops.c
+
+ interface_intern.h
+)
+
+if(WITH_INTERNATIONAL)
+ add_definitions(-DINTERNATIONAL)
+endif()
-IF(NOT WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(NOT WITH_PYTHON)
+if(WITH_PYTHON)
+ add_definitions(-DWITH_PYTHON)
+endif()
-BLENDERLIB(bf_editor_interface "${SRC}" "${INC}")
+blender_add_lib(bf_editor_interface "${SRC}" "${INC}")
diff --git a/source/blender/editors/interface/Makefile b/source/blender/editors/interface/Makefile
deleted file mode 100644
index 7b5d4e60fbd..00000000000
--- a/source/blender/editors/interface/Makefile
+++ /dev/null
@@ -1,61 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_interface
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../blenfont
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../gpu
-
-# own include
-
-CPPFLAGS += -I../include
-
-ifeq ($(INTERNATIONAL), true)
- CPPFLAGS += -DINTERNATIONAL
-endif
-
diff --git a/source/blender/editors/interface/SConscript b/source/blender/editors/interface/SConscript
index 81964a661a4..639a5268ca2 100644
--- a/source/blender/editors/interface/SConscript
+++ b/source/blender/editors/interface/SConscript
@@ -16,7 +16,7 @@ defs = []
if env['WITH_BF_INTERNATIONAL']:
defs.append('INTERNATIONAL')
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
+if env['WITH_BF_PYTHON']:
+ defs.append('WITH_PYTHON')
env.BlenderLib ( 'bf_editors_interface', sources, Split(incs), defs, libtype=['core'], priority=[110] )
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 4f9393fb862..52e9ae6894e 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -29,6 +29,7 @@
#include <limits.h>
#include <math.h>
#include <string.h>
+#include <ctype.h>
#include "MEM_guardedalloc.h"
@@ -39,10 +40,12 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_library.h"
#include "BKE_unit.h"
+#include "BKE_utildefines.h" /* FILE_MAX */
#include "BIF_gl.h"
@@ -67,7 +70,7 @@
#define MENU_SEP_HEIGHT 6
/*
- * a full doc with API notes can be found in bf-blender/blender/doc/interface_API.txt
+ * a full doc with API notes can be found in bf-blender/trunk/blender/doc/guides/interface_API.txt
*
* uiBlahBlah() external function
* ui_blah_blah() internal function
@@ -441,7 +444,7 @@ void uiCenteredBoundsBlock(uiBlock *block, int addval)
/* link line drawing is not part of buttons or theme.. so we stick with it here */
-static void ui_draw_linkline(uiBut *but, uiLinkLine *line)
+static void ui_draw_linkline(uiLinkLine *line)
{
rcti rect;
@@ -470,7 +473,7 @@ static void ui_draw_links(uiBlock *block)
if(but->type==LINK && but->link) {
line= but->link->lines.first;
while(line) {
- ui_draw_linkline(but, line);
+ ui_draw_linkline(line);
line= line->next;
}
}
@@ -511,9 +514,16 @@ static int ui_but_update_from_old_block(const bContext *C, uiBlock *block, uiBut
for(oldbut=oldblock->buttons.first; oldbut; oldbut=oldbut->next) {
if(ui_but_equals_old(oldbut, but)) {
if(oldbut->active) {
+#if 0
but->flag= oldbut->flag;
+#else
+ /* exception! redalert flag can't be update from old button.
+ * perhaps it should only copy spesific flags rather then all. */
+ but->flag= (oldbut->flag & ~UI_BUT_REDALERT) | (but->flag & UI_BUT_REDALERT);
+#endif
but->active= oldbut->active;
but->pos= oldbut->pos;
+ but->ofs= oldbut->ofs;
but->editstr= oldbut->editstr;
but->editval= oldbut->editval;
but->editvec= oldbut->editvec;
@@ -579,6 +589,77 @@ int uiButActiveOnly(const bContext *C, uiBlock *block, uiBut *but)
return 1;
}
+/* assigns automatic keybindings to menu items for fast access
+ * (underline key in menu) */
+static void ui_menu_block_set_keyaccels(uiBlock *block)
+{
+ uiBut *but;
+
+ unsigned int meny_key_mask= 0;
+ unsigned char menu_key;
+ const char *str_pt;
+ int pass;
+ int tot_missing= 0;
+
+ /* only do it before bounding */
+ if(block->minx != block->maxx)
+ return;
+
+ for(pass=0; pass<2; pass++) {
+ /* 2 Passes, on for first letter only, second for any letter if first fails
+ * fun first pass on all buttons so first word chars always get first priority */
+
+ for(but=block->buttons.first; but; but=but->next) {
+ if(!ELEM4(but->type, BUT, MENU, BLOCK, PULLDOWN) || (but->flag & UI_HIDDEN)) {
+ /* pass */
+ }
+ else if(but->menu_key=='\0') {
+ if(but->str) {
+ for(str_pt= but->str; *str_pt; ) {
+ menu_key= tolower(*str_pt);
+ if((menu_key >= 'a' && menu_key <= 'z') && !(meny_key_mask & 1<<(menu_key-'a'))) {
+ meny_key_mask |= 1<<(menu_key-'a');
+ break;
+ }
+
+ if(pass==0) {
+ /* Skip to next delimeter on first pass (be picky) */
+ while(isalpha(*str_pt))
+ str_pt++;
+
+ if(*str_pt)
+ str_pt++;
+ }
+ else {
+ /* just step over every char second pass and find first usable key */
+ str_pt++;
+ }
+ }
+
+ if(*str_pt) {
+ but->menu_key= menu_key;
+ }
+ else {
+ /* run second pass */
+ tot_missing++;
+ }
+
+ /* if all keys have been used just exit, unlikely */
+ if(meny_key_mask == (1<<26)-1) {
+ return;
+ }
+ }
+ }
+ }
+
+ /* check if second pass is needed */
+ if(!tot_missing) {
+ break;
+ }
+ }
+}
+
+
void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block)
{
uiBut *but;
@@ -629,7 +710,7 @@ void uiEndBlock(const bContext *C, uiBlock *block)
if(but->context)
CTX_store_set((bContext*)C, but->context);
- if(ot == NULL || WM_operator_poll((bContext*)C, ot)==0) {
+ if(ot == NULL || WM_operator_poll_context((bContext*)C, ot, but->opcontext)==0) {
but->flag |= UI_BUT_DISABLED;
but->lock = 1;
}
@@ -652,6 +733,7 @@ void uiEndBlock(const bContext *C, uiBlock *block)
/* handle pending stuff */
if(block->layouts.first) uiBlockLayoutResolve(block, NULL, NULL);
ui_block_do_align(block);
+ if((block->flag & UI_BLOCK_LOOP) && (block->flag & UI_BLOCK_NUMSELECT)) ui_menu_block_set_keyaccels(block); /* could use a different flag to check */
if(block->flag & UI_BLOCK_LOOP) ui_menu_block_set_keymaps(C, block);
/* after keymaps! */
@@ -748,11 +830,12 @@ void uiDrawBlock(const bContext *C, uiBlock *block)
if(block->flag & UI_BLOCK_LOOP)
ui_draw_menu_back(&style, block, &rect);
else if(block->panel)
- ui_draw_aligned_panel(ar, &style, block, &rect);
+ ui_draw_aligned_panel(&style, block, &rect);
/* widgets */
for(but= block->buttons.first; but; but= but->next) {
ui_but_to_pixelrect(&rect, ar, block, but);
+
if(!(but->flag & UI_HIDDEN) &&
/* XXX: figure out why invalid coordinates happen when closing render window */
/* and material preview is redrawn in main window (temp fix for bug #23848) */
@@ -835,7 +918,7 @@ static void ui_is_but_sel(uiBut *but)
/* XXX 2.50 no links supported yet */
-static int uibut_contains_pt(uiBut *but, short *mval)
+static int uibut_contains_pt(uiBut *UNUSED(but), short *UNUSED(mval))
{
return 0;
@@ -934,10 +1017,10 @@ void uiComposeLinks(uiBlock *block)
/* ************************************************ */
-void uiBlockSetButLock(uiBlock *block, int val, char *lockstr)
+void uiBlockSetButLock(uiBlock *block, int val, const char *lockstr)
{
if(val) {
- block->lock |= val;
+ block->lock= val ? 1:0;
block->lockstr= lockstr;
}
}
@@ -1093,12 +1176,12 @@ static void ui_do_active_linklines(uiBlock *block, short *mval)
if(line==act) {
if((line->flag & UI_SELECT)==0) {
line->flag |= UI_SELECT;
- ui_draw_linkline(but, line);
+ ui_draw_linkline(line);
}
}
else if(line->flag & UI_SELECT) {
line->flag &= ~UI_SELECT;
- ui_draw_linkline(but, line);
+ ui_draw_linkline(line);
}
line= line->next;
}
@@ -1239,15 +1322,13 @@ int ui_is_but_float(uiBut *but)
int ui_is_but_unit(uiBut *but)
{
Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
- int unit_type;
-
- if(but->rnaprop==NULL)
- return 0;
+ int unit_type= uiButGetUnitType(but);
- unit_type = RNA_SUBTYPE_UNIT(RNA_property_subtype(but->rnaprop));
+ if(unit_type == PROP_UNIT_NONE)
+ return 0;
-#if 0 // removed so angle buttons get correct snapping
- if (scene->unit.flag & USER_UNIT_ROT_RADIANS && unit_type == PROP_UNIT_ROTATION)
+#if 1 // removed so angle buttons get correct snapping
+ if (scene->unit.system_rotation == USER_UNIT_ROT_RADIANS && unit_type == PROP_UNIT_ROTATION)
return 0;
#endif
@@ -1256,13 +1337,11 @@ int ui_is_but_unit(uiBut *but)
return 0;
if (scene->unit.system == USER_UNIT_NONE) {
- if (unit_type != PROP_UNIT_ROTATION)
+ if (unit_type != PROP_UNIT_ROTATION) {
return 0;
+ }
}
- if(unit_type == PROP_UNIT_NONE)
- return 0;
-
return 1;
}
@@ -1350,9 +1429,9 @@ void ui_set_but_val(uiBut *but, double value)
break;
case PROP_INT:
if(RNA_property_array_length(&but->rnapoin, prop))
- RNA_property_int_set_index(&but->rnapoin, prop, but->rnaindex, value);
+ RNA_property_int_set_index(&but->rnapoin, prop, but->rnaindex, (int)value);
else
- RNA_property_int_set(&but->rnapoin, prop, value);
+ RNA_property_int_set(&but->rnapoin, prop, (int)value);
break;
case PROP_FLOAT:
if(RNA_property_array_length(&but->rnapoin, prop))
@@ -1442,18 +1521,18 @@ int ui_get_but_string_max_length(uiBut *but)
static double ui_get_but_scale_unit(uiBut *but, double value)
{
Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
- int subtype= RNA_SUBTYPE_UNIT(RNA_property_subtype(but->rnaprop));
+ int unit_type= uiButGetUnitType(but);
- if(subtype == PROP_UNIT_LENGTH) {
+ if(unit_type == PROP_UNIT_LENGTH) {
return value * scene->unit.scale_length;
}
- else if(subtype == PROP_UNIT_AREA) {
+ else if(unit_type == PROP_UNIT_AREA) {
return value * pow(scene->unit.scale_length, 2);
}
- else if(subtype == PROP_UNIT_VOLUME) {
+ else if(unit_type == PROP_UNIT_VOLUME) {
return value * pow(scene->unit.scale_length, 3);
}
- else if(subtype == PROP_UNIT_TIME) { /* WARNING - using evil_C :| */
+ else if(unit_type == PROP_UNIT_TIME) { /* WARNING - using evil_C :| */
return FRA2TIME(value);
}
else {
@@ -1465,14 +1544,14 @@ static double ui_get_but_scale_unit(uiBut *but, double value)
void ui_convert_to_unit_alt_name(uiBut *but, char *str, int maxlen)
{
if(ui_is_but_unit(but)) {
- int unit_type= RNA_SUBTYPE_UNIT_VALUE(RNA_property_subtype(but->rnaprop));
+ int unit_type= uiButGetUnitType(but);
char *orig_str;
Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
orig_str= MEM_callocN(sizeof(char)*maxlen + 1, "textedit sub str");
memcpy(orig_str, str, maxlen);
- bUnit_ToUnitAltName(str, maxlen, orig_str, scene->unit.system, unit_type);
+ bUnit_ToUnitAltName(str, maxlen, orig_str, scene->unit.system, unit_type>>16);
MEM_freeN(orig_str);
}
@@ -1482,7 +1561,7 @@ static void ui_get_but_string_unit(uiBut *but, char *str, int len_max, double va
{
Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
int do_split= scene->unit.flag & USER_UNIT_OPT_SPLIT;
- int unit_type= RNA_SUBTYPE_UNIT_VALUE(RNA_property_subtype(but->rnaprop));
+ int unit_type= uiButGetUnitType(but);
int precision= but->a2;
if(scene->unit.scale_length<0.0001) scene->unit.scale_length= 1.0; // XXX do_versions
@@ -1491,13 +1570,13 @@ static void ui_get_but_string_unit(uiBut *but, char *str, int len_max, double va
if(precision>4) precision= 4;
else if(precision==0) precision= 2;
- bUnit_AsString(str, len_max, ui_get_but_scale_unit(but, value), precision, scene->unit.system, unit_type, do_split, pad);
+ bUnit_AsString(str, len_max, ui_get_but_scale_unit(but, value), precision, scene->unit.system, unit_type>>16, do_split, pad);
}
static float ui_get_but_step_unit(uiBut *but, float step_default)
{
Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
- int unit_type= RNA_SUBTYPE_UNIT_VALUE(RNA_property_subtype(but->rnaprop));
+ int unit_type= uiButGetUnitType(but)>>16;
float step;
step = bUnit_ClosestScalar(ui_get_but_scale_unit(but, step_default), scene->unit.system, unit_type);
@@ -1624,7 +1703,7 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str)
}
else if(but->type == IDPOIN) {
/* ID pointer */
- but->idpoin_func(C, (char*)str, but->idpoin_idpp);
+ but->idpoin_func(C, str, but->idpoin_idpp);
return 1;
}
else if(but->type == TEX) {
@@ -1645,25 +1724,20 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str)
/* number editing */
double value;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
{
char str_unit_convert[256];
- int unit_type;
+ int unit_type= uiButGetUnitType(but);
Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
- if(but->rnaprop)
- unit_type= RNA_SUBTYPE_UNIT_VALUE(RNA_property_subtype(but->rnaprop));
- else
- unit_type= 0;
-
BLI_strncpy(str_unit_convert, str, sizeof(str_unit_convert));
if(ui_is_but_unit(but)) {
/* ugly, use the draw string to get the value, this could cause problems if it includes some text which resolves to a unit */
- bUnit_ReplaceString(str_unit_convert, sizeof(str_unit_convert), but->drawstr, ui_get_but_scale_unit(but, 1.0), scene->unit.system, unit_type);
+ bUnit_ReplaceString(str_unit_convert, sizeof(str_unit_convert), but->drawstr, ui_get_but_scale_unit(but, 1.0), scene->unit.system, unit_type>>16);
}
- if(BPY_eval_button(C, str_unit_convert, &value)) {
+ if(BPY_button_exec(C, str_unit_convert, &value)) {
value = ui_get_but_val(but); /* use its original value */
if(str[0])
@@ -1672,7 +1746,7 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str)
}
#else
value= atof(str);
-#endif
+#endif // WITH_PYTHON
if(!ui_is_but_float(but)) value= (int)floor(value + 0.5);
if(but->type==NUMABS) value= fabs(value);
@@ -1728,7 +1802,7 @@ static double soft_range_round_down(double value, double max)
void ui_set_but_soft_range(uiBut *but, double value)
{
PropertyType type;
- double softmin, softmax, step, precision;
+ double softmin, softmax /*, step, precision*/;
if(but->rnaprop) {
type= RNA_property_type(but->rnaprop);
@@ -1741,8 +1815,8 @@ void ui_set_but_soft_range(uiBut *but, double value)
RNA_property_int_ui_range(&but->rnapoin, but->rnaprop, &imin, &imax, &istep);
softmin= (imin == INT_MIN)? -1e4: imin;
softmax= (imin == INT_MAX)? 1e4: imax;
- step= istep;
- precision= 1;
+ /*step= istep;*/ /*UNUSED*/
+ /*precision= 1;*/ /*UNUSED*/
}
else if(type == PROP_FLOAT) {
float fmin, fmax, fstep, fprecision;
@@ -1750,8 +1824,8 @@ void ui_set_but_soft_range(uiBut *but, double value)
RNA_property_float_ui_range(&but->rnapoin, but->rnaprop, &fmin, &fmax, &fstep, &fprecision);
softmin= (fmin == -FLT_MAX)? -1e4: fmin;
softmax= (fmax == FLT_MAX)? 1e4: fmax;
- step= fstep;
- precision= fprecision;
+ /*step= fstep;*/ /*UNUSED*/
+ /*precision= fprecision;*/ /*UNUSED*/
}
else
return;
@@ -1935,7 +2009,7 @@ uiBlock *uiBeginBlock(const bContext *C, ARegion *region, const char *name, shor
return block;
}
-uiBlock *uiGetBlock(char *name, ARegion *ar)
+uiBlock *uiGetBlock(const char *name, ARegion *ar)
{
uiBlock *block= ar->uiblocks.first;
@@ -1947,7 +2021,7 @@ uiBlock *uiGetBlock(char *name, ARegion *ar)
return NULL;
}
-void uiBlockSetEmboss(uiBlock *block, short dt)
+void uiBlockSetEmboss(uiBlock *block, char dt)
{
block->dt= dt;
}
@@ -2136,11 +2210,6 @@ void ui_check_but(uiBut *but)
case HSVCUBE:
case HSVCIRCLE:
- {
- float rgb[3];
- ui_get_but_vectorf(but, rgb);
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], but->hsv, but->hsv+1, but->hsv+2);
- }
break;
default:
strncpy(but->drawstr, but->str, UI_MAX_DRAW_STR);
@@ -2187,7 +2256,7 @@ int ui_but_can_align(uiBut *but)
return !ELEM3(but->type, LABEL, OPTION, OPTIONN);
}
-static void ui_block_do_align_but(uiBlock *block, uiBut *first, int nr)
+static void ui_block_do_align_but(uiBut *first, int nr)
{
uiBut *prev, *but=NULL, *next;
int flag= 0, cols=0, rows=0;
@@ -2211,7 +2280,7 @@ static void ui_block_do_align_but(uiBlock *block, uiBut *first, int nr)
/* clear old flag */
but->flag &= ~UI_BUT_ALIGN;
-
+
if(flag==0) { /* first case */
if(next) {
if(buts_are_horiz(but, next)) {
@@ -2260,11 +2329,21 @@ static void ui_block_do_align_but(uiBlock *block, uiBut *first, int nr)
else { /* next button switches to new row */
if(prev && buts_are_horiz(prev, but))
- flag |= UI_BUT_ALIGN_LEFT;
+ flag |= UI_BUT_ALIGN_LEFT;
+ else {
+ flag &= ~UI_BUT_ALIGN_LEFT;
+ flag |= UI_BUT_ALIGN_TOP;
+ }
if( (flag & UI_BUT_ALIGN_TOP)==0) { /* stil top row */
- if(prev)
- flag= UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_LEFT;
+ if(prev) {
+ if(next && buts_are_horiz(but, next))
+ flag = UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_LEFT|UI_BUT_ALIGN_RIGHT;
+ else {
+ /* last button in top row */
+ flag = UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_LEFT;
+ }
+ }
else
flag |= UI_BUT_ALIGN_DOWN;
}
@@ -2297,6 +2376,10 @@ static void ui_block_do_align_but(uiBlock *block, uiBut *first, int nr)
/* the previous button is a single one in its row */
but->y2= (prev->y1+but->y2)/2.0;
prev->y1= but->y2;
+
+ but->x1= prev->x1;
+ if(next && buts_are_horiz(but, next)==0)
+ but->x2= prev->x2;
}
else {
/* the previous button is not a single one in its row */
@@ -2316,7 +2399,7 @@ void ui_block_do_align(uiBlock *block)
for(but=block->buttons.first; but;) {
if(but->alignnr) {
nr= but->alignnr;
- ui_block_do_align_but(block, but, nr);
+ ui_block_do_align_but(but, nr);
/* skip with same number */
for(; but && but->alignnr == nr; but=but->next);
@@ -2338,10 +2421,10 @@ for float buttons:
all greater values will be clamped to 4.
*/
-static uiBut *ui_def_but(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, char *tip)
+static uiBut *ui_def_but(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but;
- short slen;
+ int slen;
if(type & BUTPOIN) { /* a pointer is required */
if(poin==NULL)
@@ -2358,14 +2441,16 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, char *str, short
but->iconadd=0;
but->retval= retval;
- if( strlen(str)>=UI_MAX_NAME_STR-1 ) {
- but->str= MEM_callocN( strlen(str)+2, "uiDefBut");
- strcpy(but->str, str);
+
+ slen= strlen(str);
+ if(slen >= UI_MAX_NAME_STR-1) {
+ but->str= MEM_mallocN(slen+2, "ui_def_but str"); /* why +2 ? */
}
else {
but->str= but->strdata;
- strcpy(but->str, str);
}
+ memcpy(but->str, str, slen+1);
+
but->x1= x1;
but->y1= y1;
but->x2= (x1+x2);
@@ -2421,8 +2506,10 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, char *str, short
}
}
- if(ELEM8(but->type, BLOCK, BUT, LABEL, PULLDOWN, ROUNDBOX, LISTBOX, SEARCH_MENU, BUTM));
+ /* keep track of UI_interface.h */
+ if(ELEM7(but->type, BLOCK, BUT, LABEL, PULLDOWN, ROUNDBOX, LISTBOX, BUTM));
else if(ELEM5(but->type, SCROLL, SEPR, LINK, INLINK, FTPREVIEW));
+ else if(but->type >= SEARCH_MENU);
else but->flag |= UI_BUT_UNDO;
BLI_addtail(&block->buttons, but);
@@ -2433,7 +2520,7 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, char *str, short
return but;
}
-uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, char *tip)
+static uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but;
PropertyRNA *prop;
@@ -2487,18 +2574,18 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
RNA_property_enum_items(block->evil_C, ptr, prop, &item, &totitem, &free);
for(i=0; i<totitem; i++) {
if(item[i].identifier[0] && item[i].value == (int)max) {
- str= (char*)item[i].name;
+ str= item[i].name;
icon= item[i].icon;
}
}
if(!str)
- str= (char*)RNA_property_ui_name(prop);
+ str= RNA_property_ui_name(prop);
if(free)
MEM_freeN(item);
}
else {
- str= (char*)RNA_property_ui_name(prop);
+ str= RNA_property_ui_name(prop);
icon= RNA_property_ui_icon(prop);
}
}
@@ -2513,7 +2600,7 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
for(i=0; i<totitem; i++) {
if(item[i].identifier[0] && item[i].value == (int)max) {
if(item[i].description[0])
- tip= (char*)item[i].description;
+ tip= item[i].description;
break;
}
}
@@ -2524,7 +2611,7 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
}
if(!tip)
- tip= (char*)RNA_property_ui_description(prop);
+ tip= RNA_property_ui_description(prop);
if(min == max || a1 == -1 || a2 == -1) {
if(proptype == PROP_INT) {
@@ -2567,7 +2654,7 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
}
else {
printf("ui_def_but_rna: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
- str= (char*)propname;
+ str= propname;
}
/* now create button */
@@ -2600,12 +2687,12 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
but->a1= ui_get_but_step_unit(but, but->a1);
if(freestr)
- MEM_freeN(str);
+ MEM_freeN((void *)str);
return but;
}
-uiBut *ui_def_but_operator(uiBlock *block, int type, char *opname, int opcontext, char *str, short x1, short y1, short x2, short y2, char *tip)
+static uiBut *ui_def_but_operator(uiBlock *block, int type, const char *opname, int opcontext, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but;
wmOperatorType *ot;
@@ -2634,7 +2721,36 @@ uiBut *ui_def_but_operator(uiBlock *block, int type, char *opname, int opcontext
return but;
}
-uiBut *uiDefBut(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, char *tip)
+static uiBut *ui_def_but_operator_text(uiBlock *block, int type, const char *opname, int opcontext, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
+{
+ uiBut *but;
+ wmOperatorType *ot;
+
+ ot= WM_operatortype_find(opname, 0);
+
+ if(!str) {
+ if(ot) str= ot->name;
+ else str= opname;
+ }
+
+ if ((!tip || tip[0]=='\0') && ot && ot->description) {
+ tip= ot->description;
+ }
+
+ but= ui_def_but(block, type, -1, str, x1, y1, x2, y2, poin, min, max, a1, a2, tip);
+ but->optype= ot;
+ but->opcontext= opcontext;
+
+ if(!ot) {
+ but->flag |= UI_BUT_DISABLED;
+ but->lock = 1;
+ but->lockstr = "";
+ }
+
+ return but;
+}
+
+uiBut *uiDefBut(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but= ui_def_but(block, type, retval, str, x1, y1, x2, y2, poin, min, max, a1, a2, tip);
@@ -2667,10 +2783,10 @@ static int findBitIndex(unsigned int x) {
struct AutoComplete {
int maxlen;
char *truncate;
- char *startname;
+ const char *startname;
};
-AutoComplete *autocomplete_begin(char *startname, int maxlen)
+AutoComplete *autocomplete_begin(const char *startname, int maxlen)
{
AutoComplete *autocpl;
@@ -2685,7 +2801,7 @@ AutoComplete *autocomplete_begin(char *startname, int maxlen)
void autocomplete_do_name(AutoComplete *autocpl, const char *name)
{
char *truncate= autocpl->truncate;
- char *startname= autocpl->startname;
+ const char *startname= autocpl->startname;
int a;
for(a=0; a<autocpl->maxlen-1; a++) {
@@ -2743,7 +2859,7 @@ static void autocomplete_id(bContext *C, char *str, void *arg_v)
}
}
-static uiBut *uiDefButBit(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, char *tip)
+static uiBut *uiDefButBit(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
{
int bitIdx= findBitIndex(bit);
if (bitIdx==-1) {
@@ -2752,39 +2868,39 @@ static uiBut *uiDefButBit(uiBlock *block, int type, int bit, int retval, char *s
return uiDefBut(block, type|BIT|bitIdx, retval, str, x1, y1, x2, y2, poin, min, max, a1, a2, tip);
}
}
-uiBut *uiDefButF(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButF(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefBut(block, type|FLO, retval, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefButBitF(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButBitF(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefButBit(block, type|FLO, bit, retval, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefButI(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButI(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefBut(block, type|INT, retval, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefButBitI(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButBitI(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefButBit(block, type|INT, bit, retval, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefButS(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButS(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefBut(block, type|SHO, retval, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefButBitS(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButBitS(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefButBit(block, type|SHO, bit, retval, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefButC(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButC(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefBut(block, type|CHA, retval, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefButBitC(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButBitC(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefButBit(block, type|CHA, bit, retval, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefButR(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButR(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but;
@@ -2794,7 +2910,7 @@ uiBut *uiDefButR(uiBlock *block, int type, int retval, char *str, short x1, shor
return but;
}
-uiBut *uiDefButO(uiBlock *block, int type, char *opname, int opcontext, char *str, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefButO(uiBlock *block, int type, const char *opname, int opcontext, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but;
@@ -2805,8 +2921,18 @@ uiBut *uiDefButO(uiBlock *block, int type, char *opname, int opcontext, char *st
return but;
}
+uiBut *uiDefButTextO(uiBlock *block, int type, const char *opname, int opcontext, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
+{
+ uiBut *but= ui_def_but_operator_text(block, type, opname, opcontext, str, x1, y1, x2, y2, poin, min, max, a1, a2, tip);
+
+ if(but)
+ ui_check_but(but);
+
+ return but;
+}
+
/* if a1==1.0 then a2 is an extra icon blending factor (alpha 0.0 - 1.0) */
-uiBut *uiDefIconBut(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconBut(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but= ui_def_but(block, type, retval, "", x1, y1, x2, y2, poin, min, max, a1, a2, tip);
@@ -2817,7 +2943,7 @@ uiBut *uiDefIconBut(uiBlock *block, int type, int retval, int icon, short x1, sh
return but;
}
-static uiBut *uiDefIconButBit(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, char *tip)
+static uiBut *uiDefIconButBit(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
{
int bitIdx= findBitIndex(bit);
if (bitIdx==-1) {
@@ -2827,39 +2953,39 @@ static uiBut *uiDefIconButBit(uiBlock *block, int type, int bit, int retval, int
}
}
-uiBut *uiDefIconButF(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButF(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconBut(block, type|FLO, retval, icon, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconButBitF(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButBitF(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconButBit(block, type|FLO, bit, retval, icon, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconButI(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButI(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconBut(block, type|INT, retval, icon, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconButBitI(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButBitI(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconButBit(block, type|INT, bit, retval, icon, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconButS(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButS(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconBut(block, type|SHO, retval, icon, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconButBitS(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButBitS(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconButBit(block, type|SHO, bit, retval, icon, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconButC(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButC(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconBut(block, type|CHA, retval, icon, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconButBitC(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButBitC(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconButBit(block, type|CHA, bit, retval, icon, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconButR(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButR(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but;
@@ -2874,7 +3000,7 @@ uiBut *uiDefIconButR(uiBlock *block, int type, int retval, int icon, short x1, s
return but;
}
-uiBut *uiDefIconButO(uiBlock *block, int type, char *opname, int opcontext, int icon, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefIconButO(uiBlock *block, int type, const char *opname, int opcontext, int icon, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but;
@@ -2889,7 +3015,7 @@ uiBut *uiDefIconButO(uiBlock *block, int type, char *opname, int opcontext, int
}
/* Button containing both string label and icon */
-uiBut *uiDefIconTextBut(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextBut(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but= ui_def_but(block, type, retval, str, x1, y1, x2, y2, poin, min, max, a1, a2, tip);
@@ -2902,7 +3028,7 @@ uiBut *uiDefIconTextBut(uiBlock *block, int type, int retval, int icon, char *st
return but;
}
-static uiBut *uiDefIconTextButBit(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, char *tip)
+static uiBut *uiDefIconTextButBit(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
{
int bitIdx= findBitIndex(bit);
if (bitIdx==-1) {
@@ -2912,39 +3038,39 @@ static uiBut *uiDefIconTextButBit(uiBlock *block, int type, int bit, int retval,
}
}
-uiBut *uiDefIconTextButF(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButF(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconTextBut(block, type|FLO, retval, icon, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconTextButBitF(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButBitF(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconTextButBit(block, type|FLO, bit, retval, icon, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconTextButI(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButI(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconTextBut(block, type|INT, retval, icon, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconTextButBitI(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButBitI(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconTextButBit(block, type|INT, bit, retval, icon, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconTextButS(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButS(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconTextBut(block, type|SHO, retval, icon, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconTextButBitS(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButBitS(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconTextButBit(block, type|SHO, bit, retval, icon, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconTextButC(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButC(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconTextBut(block, type|CHA, retval, icon, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconTextButBitC(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButBitC(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconTextButBit(block, type|CHA, bit, retval, icon, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconTextButR(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButR(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but;
@@ -2960,7 +3086,7 @@ uiBut *uiDefIconTextButR(uiBlock *block, int type, int retval, int icon, char *s
return but;
}
-uiBut *uiDefIconTextButO(uiBlock *block, int type, char *opname, int opcontext, int icon, char *str, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefIconTextButO(uiBlock *block, int type, const char *opname, int opcontext, int icon, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but;
@@ -3126,6 +3252,21 @@ PointerRNA *uiButGetOperatorPtrRNA(uiBut *but)
return but->opptr;
}
+void uiButSetUnitType(uiBut *but, const int unit_type)
+{
+ but->unit_type= (unsigned char)(unit_type>>16);
+}
+
+int uiButGetUnitType(uiBut *but)
+{
+ if(but->rnaprop) {
+ return RNA_SUBTYPE_UNIT(RNA_property_subtype(but->rnaprop));
+ }
+ else {
+ return ((int)but->unit_type)<<16;
+ }
+}
+
void uiBlockSetHandleFunc(uiBlock *block, uiBlockHandleFunc func, void *arg)
{
block->handle_func= func;
@@ -3191,7 +3332,7 @@ void uiButSetCompleteFunc(uiBut *but, uiButCompleteFunc func, void *arg)
but->autofunc_arg= arg;
}
-uiBut *uiDefIDPoinBut(uiBlock *block, uiIDPoinFuncFP func, short blocktype, int retval, char *str, short x1, short y1, short x2, short y2, void *idpp, char *tip)
+uiBut *uiDefIDPoinBut(uiBlock *block, uiIDPoinFuncFP func, short blocktype, int retval, const char *str, int x1, int y1, short x2, short y2, void *idpp, const char *tip)
{
uiBut *but= ui_def_but(block, IDPOIN, retval, str, x1, y1, x2, y2, NULL, 0.0, 0.0, 0.0, 0.0, tip);
but->idpoin_func= func;
@@ -3204,7 +3345,7 @@ uiBut *uiDefIDPoinBut(uiBlock *block, uiIDPoinFuncFP func, short blocktype, int
return but;
}
-uiBut *uiDefBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, char *str, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but= ui_def_but(block, BLOCK, 0, str, x1, y1, x2, y2, arg, 0.0, 0.0, 0.0, 0.0, tip);
but->block_create_func= func;
@@ -3212,7 +3353,7 @@ uiBut *uiDefBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, char *st
return but;
}
-uiBut *uiDefBlockButN(uiBlock *block, uiBlockCreateFunc func, void *argN, char *str, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefBlockButN(uiBlock *block, uiBlockCreateFunc func, void *argN, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but= ui_def_but(block, BLOCK, 0, str, x1, y1, x2, y2, NULL, 0.0, 0.0, 0.0, 0.0, tip);
but->block_create_func= func;
@@ -3224,7 +3365,7 @@ uiBut *uiDefBlockButN(uiBlock *block, uiBlockCreateFunc func, void *argN, char *
}
-uiBut *uiDefPulldownBut(uiBlock *block, uiBlockCreateFunc func, void *arg, char *str, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefPulldownBut(uiBlock *block, uiBlockCreateFunc func, void *arg, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but= ui_def_but(block, PULLDOWN, 0, str, x1, y1, x2, y2, arg, 0.0, 0.0, 0.0, 0.0, tip);
but->block_create_func= func;
@@ -3232,7 +3373,7 @@ uiBut *uiDefPulldownBut(uiBlock *block, uiBlockCreateFunc func, void *arg, char
return but;
}
-uiBut *uiDefMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, char *str, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but= ui_def_but(block, PULLDOWN, 0, str, x1, y1, x2, y2, arg, 0.0, 0.0, 0.0, 0.0, tip);
but->menu_create_func= func;
@@ -3240,7 +3381,7 @@ uiBut *uiDefMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, char *str,
return but;
}
-uiBut *uiDefIconTextMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, char *str, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefIconTextMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but= ui_def_but(block, PULLDOWN, 0, str, x1, y1, x2, y2, arg, 0.0, 0.0, 0.0, 0.0, tip);
@@ -3256,7 +3397,7 @@ uiBut *uiDefIconTextMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, in
return but;
}
-uiBut *uiDefIconMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefIconMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but= ui_def_but(block, PULLDOWN, 0, "", x1, y1, x2, y2, arg, 0.0, 0.0, 0.0, 0.0, tip);
@@ -3271,7 +3412,7 @@ uiBut *uiDefIconMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int ic
}
/* Block button containing both string label and icon */
-uiBut *uiDefIconTextBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int icon, char *str, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefIconTextBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int icon, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but= ui_def_but(block, BLOCK, 0, str, x1, y1, x2, y2, arg, 0.0, 0.0, 0.0, 0.0, tip);
@@ -3290,7 +3431,7 @@ uiBut *uiDefIconTextBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg,
}
/* Block button containing icon */
-uiBut *uiDefIconBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int retval, int icon, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefIconBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int retval, int icon, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but= ui_def_but(block, BLOCK, retval, "", x1, y1, x2, y2, arg, 0.0, 0.0, 0.0, 0.0, tip);
@@ -3305,7 +3446,7 @@ uiBut *uiDefIconBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int
return but;
}
-uiBut *uiDefKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, short x2, short y2, short *spoin, char *tip)
+uiBut *uiDefKeyevtButS(uiBlock *block, int retval, const char *str, int x1, int y1, short x2, short y2, short *spoin, const char *tip)
{
uiBut *but= ui_def_but(block, KEYEVT|SHO, retval, str, x1, y1, x2, y2, spoin, 0.0, 0.0, 0.0, 0.0, tip);
ui_check_but(but);
@@ -3314,7 +3455,7 @@ uiBut *uiDefKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1
/* short pointers hardcoded */
/* modkeypoin will be set to KM_SHIFT, KM_ALT, KM_CTRL, KM_OSKEY bits */
-uiBut *uiDefHotKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, short x2, short y2, short *keypoin, short *modkeypoin, char *tip)
+uiBut *uiDefHotKeyevtButS(uiBlock *block, int retval, const char *str, int x1, int y1, short x2, short y2, short *keypoin, short *modkeypoin, const char *tip)
{
uiBut *but= ui_def_but(block, HOTKEYEVT|SHO, retval, str, x1, y1, x2, y2, keypoin, 0.0, 0.0, 0.0, 0.0, tip);
but->modifier_key= *modkeypoin;
@@ -3325,7 +3466,7 @@ uiBut *uiDefHotKeyevtButS(uiBlock *block, int retval, char *str, short x1, short
/* arg is pointer to string/name, use uiButSetSearchFunc() below to make this work */
/* here a1 and a2, if set, control thumbnail preview rows/cols */
-uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, short x1, short y1, short x2, short y2, float a1, float a2, char *tip)
+uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, int x1, int y1, short x2, short y2, float a1, float a2, const char *tip)
{
uiBut *but= ui_def_but(block, SEARCH_MENU, retval, "", x1, y1, x2, y2, arg, 0.0, maxlen, a1, a2, tip);
@@ -3339,6 +3480,7 @@ uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxle
return but;
}
+
/* arg is user value, searchfunc and handlefunc both get it as arg */
/* if active set, button opens with this item visible and selected */
void uiButSetSearchFunc(uiBut *but, uiButSearchFunc sfunc, void *arg, uiButHandleFunc bfunc, void *active)
@@ -3347,6 +3489,13 @@ void uiButSetSearchFunc(uiBut *but, uiButSearchFunc sfunc, void *arg, uiButHandl
but->search_arg= arg;
uiButSetFunc(but, bfunc, arg, active);
+
+ /* search buttons show red-alert if item doesn't exist, not for menus */
+ if(0==(but->block->flag & UI_BLOCK_LOOP)) {
+ /* skip empty buttons, not all buttons need input, we only show invalid */
+ if(but->drawstr[0])
+ ui_but_search_test(but);
+ }
}
/* Program Init/Exit */
diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c
index 2a30a36ffe0..0f77b437eeb 100644
--- a/source/blender/editors/interface/interface_anim.c
+++ b/source/blender/editors/interface/interface_anim.c
@@ -84,6 +84,8 @@ int ui_but_anim_expression_set(uiBut *but, const char *str)
if(driver && driver->type == DRIVER_TYPE_PYTHON) {
BLI_strncpy(driver->expression, str, sizeof(driver->expression));
+ driver->flag |= DRIVER_FLAG_RECOMPILE;
+ WM_event_add_notifier(but->block->evil_C, NC_ANIMATION|ND_KEYFRAME, NULL);
return 1;
}
}
@@ -105,10 +107,11 @@ void ui_but_anim_autokey(bContext *C, uiBut *but, Scene *scene, float cfra)
// TODO: this should probably respect the keyingset only option for anim
if(autokeyframe_cfra_can_key(scene, id)) {
+ ReportList *reports = CTX_wm_reports(C);
short flag = ANIM_get_keyframing_flags(scene, 1);
fcu->flag &= ~FCURVE_SELECTED;
- insert_keyframe(id, action, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
+ insert_keyframe(reports, id, action, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
}
}
diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c
index cf6970dc59f..4ea0c01d15c 100644
--- a/source/blender/editors/interface/interface_draw.c
+++ b/source/blender/editors/interface/interface_draw.c
@@ -33,10 +33,12 @@
#include "DNA_screen_types.h"
#include "BLI_math.h"
+#include "BLI_rect.h"
+#include "BLI_utildefines.h"
#include "BKE_colortools.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -385,7 +387,7 @@ void uiRoundRectFakeAA(float minx, float miny, float maxx, float maxy, float rad
float raddiff;
int i, passes=4;
- /* get the colour and divide up the alpha */
+ /* get the color and divide up the alpha */
glGetFloatv(GL_CURRENT_COLOR, color);
alpha = 1; //color[3];
color[3]= 0.5*alpha/(float)passes;
@@ -460,7 +462,7 @@ void uiEmboss(float x1, float y1, float x2, float y2, int sel)
/* ************** SPECIAL BUTTON DRAWING FUNCTIONS ************* */
-void ui_draw_but_IMAGE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect)
+void ui_draw_but_IMAGE(ARegion *UNUSED(ar), uiBut *UNUSED(but), uiWidgetColors *UNUSED(wcol), rcti *rect)
{
extern char datatoc_splash_png[];
extern int datatoc_splash_png_size;
@@ -516,8 +518,8 @@ static void ui_draw_but_CHARTAB(uiBut *but)
int result = 0;
int charmax = G.charmax;
- /* <builtin> font in use. There are TTF <builtin> and non-TTF <builtin> fonts */
- if(!strcmp(G.selfont->name, "<builtin>"))
+ /* FO_BUILTIN_NAME font in use. There are TTF FO_BUILTIN_NAME and non-TTF FO_BUILTIN_NAME fonts */
+ if(!strcmp(G.selfont->name, FO_BUILTIN_NAME))
{
if(G.ui_international == TRUE)
{
@@ -548,8 +550,8 @@ static void ui_draw_but_CHARTAB(uiBut *but)
cs = G.charstart;
- /* Set the font, in case it is not <builtin> font */
- if(G.selfont && strcmp(G.selfont->name, "<builtin>"))
+ /* Set the font, in case it is not FO_BUILTIN_NAME font */
+ if(G.selfont && strcmp(G.selfont->name, FO_BUILTIN_NAME))
{
char tmpStr[256];
@@ -564,7 +566,7 @@ static void ui_draw_but_CHARTAB(uiBut *but)
int err;
strcpy(tmpStr, G.selfont->name);
- BLI_path_abs(tmpStr, G.sce);
+ BLI_path_abs(tmpStr, G.main->name);
err = FTF_SetFont((unsigned char *)tmpStr, 0, 14.0);
}
}
@@ -605,9 +607,9 @@ static void ui_draw_but_CHARTAB(uiBut *but)
memset(wstr, 0, sizeof(wchar_t)*2);
memset(ustr, 0, 16);
- // Set the font to be either unicode or <builtin>
+ // Set the font to be either unicode or FO_BUILTIN_NAME
wstr[0] = cs;
- if(strcmp(G.selfont->name, "<builtin>"))
+ if(strcmp(G.selfont->name, FO_BUILTIN_NAME))
{
wcs2utf8s((char *)ustr, (wchar_t *)wstr);
}
@@ -624,7 +626,7 @@ static void ui_draw_but_CHARTAB(uiBut *but)
}
}
- if((G.selfont && strcmp(G.selfont->name, "<builtin>")) || (G.selfont && !strcmp(G.selfont->name, "<builtin>") && G.ui_international == TRUE))
+ if((G.selfont && strcmp(G.selfont->name, FO_BUILTIN_NAME)) || (G.selfont && !strcmp(G.selfont->name, FO_BUILTIN_NAME) && G.ui_international == TRUE))
{
float wid;
float llx, lly, llz, urx, ury, urz;
@@ -747,7 +749,7 @@ void histogram_draw_one(float r, float g, float b, float alpha, float x, float y
glDisable(GL_LINE_SMOOTH);
}
-void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *recti)
+void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wcol), rcti *recti)
{
Histogram *hist = (Histogram *)but->poin;
int res = hist->x_resolution;
@@ -800,14 +802,14 @@ void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *
draw_scope_end(&rect, scissor);
}
-void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *recti)
+void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wcol), rcti *recti)
{
Scopes *scopes = (Scopes *)but->poin;
rctf rect;
int i, c;
float w, w3, h, alpha, yofs;
GLint scissor[4];
- float colors[3][3] = {{1,0,0},{0,1,0},{0,0,1}};
+ float colors[3][3]= MAT3_UNITY;
float colorsycc[3][3] = {{1,0,1},{1,1,0},{0,1,1}};
float colors_alpha[3][3], colorsycc_alpha[3][3]; /* colors pre multiplied by alpha for speed up */
float min, max;
@@ -855,7 +857,7 @@ void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *r
sprintf(str,"%-3d",i*20);
str[3]='\0';
fdrawline(rect.xmin+22, yofs+(i/5.f)*h, rect.xmax+1, yofs+(i/5.f)*h);
- BLF_draw_default(rect.xmin+1, yofs-5+(i/5.f)*h, 0, str);
+ BLF_draw_default(rect.xmin+1, yofs-5+(i/5.f)*h, 0, str, sizeof(str)-1);
/* in the loop because blf_draw reset it */
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
@@ -1023,7 +1025,7 @@ void vectorscope_draw_target(float centerx, float centery, float diam, float r,
glEnd();
}
-void ui_draw_but_VECTORSCOPE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *recti)
+void ui_draw_but_VECTORSCOPE(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wcol), rcti *recti)
{
Scopes *scopes = (Scopes *)but->poin;
rctf rect;
@@ -1105,7 +1107,7 @@ void ui_draw_but_VECTORSCOPE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti
glDisable(GL_BLEND);
}
-void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *wcol, rcti *rect)
+void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *UNUSED(wcol), rcti *rect)
{
ColorBand *coba;
CBData *cbd;
@@ -1341,7 +1343,7 @@ static void ui_draw_but_curve_grid(rcti *rect, float zoomx, float zoomy, float o
}
-static void glColor3ubvShade(char *col, int shade)
+static void glColor3ubvShade(unsigned char *col, int shade)
{
glColor3ub(col[0]-shade>0?col[0]-shade:0,
col[1]-shade>0?col[1]-shade:0,
@@ -1355,6 +1357,7 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
CurveMapPoint *cmp;
float fx, fy, fac[2], zoomx, zoomy, offsx, offsy;
GLint scissor[4];
+ rcti scissor_new;
int a;
cumap= (CurveMapping *)(but->editcumap? but->editcumap: but->poin);
@@ -1362,7 +1365,12 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
/* need scissor test, curve can draw outside of boundary */
glGetIntegerv(GL_VIEWPORT, scissor);
- glScissor(ar->winrct.xmin + rect->xmin, ar->winrct.ymin+rect->ymin, rect->xmax-rect->xmin, rect->ymax-rect->ymin);
+ scissor_new.xmin= ar->winrct.xmin + rect->xmin;
+ scissor_new.ymin= ar->winrct.ymin + rect->ymin;
+ scissor_new.xmax= ar->winrct.xmin + rect->xmax;
+ scissor_new.ymax= ar->winrct.ymin + rect->ymax;
+ BLI_isect_rcti(&scissor_new, &ar->winrct, &scissor_new);
+ glScissor(scissor_new.xmin, scissor_new.ymin, scissor_new.xmax-scissor_new.xmin, scissor_new.ymax-scissor_new.ymin);
/* calculate offset and zoom */
zoomx= (rect->xmax-rect->xmin-2.0*but->aspect)/(cumap->curr.xmax - cumap->curr.xmin);
@@ -1372,7 +1380,7 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
/* backdrop */
if(cumap->flag & CUMA_DO_CLIP) {
- glColor3ubvShade(wcol->inner, -20);
+ glColor3ubvShade((unsigned char *)wcol->inner, -20);
glRectf(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
glColor3ubv((unsigned char*)wcol->inner);
glRectf(rect->xmin + zoomx*(cumap->clipr.xmin-offsx),
@@ -1386,13 +1394,13 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
}
/* grid, every .25 step */
- glColor3ubvShade(wcol->inner, -16);
+ glColor3ubvShade((unsigned char *)wcol->inner, -16);
ui_draw_but_curve_grid(rect, zoomx, zoomy, offsx, offsy, 0.25f);
/* grid, every 1.0 step */
- glColor3ubvShade(wcol->inner, -24);
+ glColor3ubvShade((unsigned char *)wcol->inner, -24);
ui_draw_but_curve_grid(rect, zoomx, zoomy, offsx, offsy, 1.0f);
/* axes */
- glColor3ubvShade(wcol->inner, -50);
+ glColor3ubvShade((unsigned char *)wcol->inner, -50);
glBegin(GL_LINES);
glVertex2f(rect->xmin, rect->ymin + zoomy*(-offsy));
glVertex2f(rect->xmax, rect->ymin + zoomy*(-offsy));
@@ -1404,7 +1412,7 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
if (but->a1 != -1) {
if (but->a1 == UI_GRAD_H) {
rcti grid;
- float col[3];
+ float col[3]= {0.0f, 0.0f, 0.0f}; /* dummy arg */
grid.xmin = rect->xmin + zoomx*(-offsx);
grid.xmax = rect->xmax + zoomx*(-offsx);
@@ -1568,6 +1576,7 @@ void uiDrawBoxShadow(unsigned char alpha, float minx, float miny, float maxx, fl
void ui_dropshadow(rctf *rct, float radius, float aspect, int select)
{
+ int i;
float rad;
float a;
char alpha= 2;
@@ -1578,9 +1587,10 @@ void ui_dropshadow(rctf *rct, float radius, float aspect, int select)
rad= (rct->ymax-rct->ymin-10.0f)/2.0f;
else
rad= radius;
-
- if(select) a= 12.0f*aspect; else a= 12.0f*aspect;
- for(; a>0.0f; a-=aspect) {
+
+ i= 12;
+ if(select) a= i*aspect; else a= i*aspect;
+ for(; i--; a-=aspect) {
/* alpha ranges from 2 to 20 or so */
glColor4ub(0, 0, 0, alpha);
alpha+= 2;
@@ -1591,7 +1601,7 @@ void ui_dropshadow(rctf *rct, float radius, float aspect, int select)
/* outline emphasis */
glEnable( GL_LINE_SMOOTH );
glColor4ub(0, 0, 0, 100);
- uiDrawBox(GL_LINE_LOOP, rct->xmin-0.5f, rct->ymin-0.5f, rct->xmax+0.5f, rct->ymax+0.5f, radius);
+ uiDrawBox(GL_LINE_LOOP, rct->xmin-0.5f, rct->ymin-0.5f, rct->xmax+0.5f, rct->ymax+0.5f, radius+0.5f);
glDisable( GL_LINE_SMOOTH );
glDisable(GL_BLEND);
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 5bcde844d45..d912610637f 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -29,6 +29,7 @@
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
+#include <assert.h>
#include "MEM_guardedalloc.h"
@@ -37,6 +38,8 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "PIL_time.h"
#include "BKE_colortools.h"
@@ -323,18 +326,22 @@ static void ui_apply_autokey_undo(bContext *C, uiBut *but)
{
Scene *scene= CTX_data_scene(C);
uiAfterFunc *after;
- char *str= NULL;
if(but->flag & UI_BUT_UNDO) {
+ const char *str= NULL;
+
/* define which string to use for undo */
if ELEM(but->type, LINK, INLINK) str= "Add button link";
else if ELEM(but->type, MENU, ICONTEXTROW) str= but->drawstr;
else if(but->drawstr[0]) str= but->drawstr;
else str= but->tip;
- }
- /* delayed, after all other funcs run, popups are closed, etc */
- if(str) {
+ /* fallback, else we dont get an undo! */
+ if(str == NULL || str[0] == '\0') {
+ str= "Unknown Action";
+ }
+
+ /* delayed, after all other funcs run, popups are closed, etc */
after= MEM_callocN(sizeof(uiAfterFunc), "uiAfterFunc");
BLI_strncpy(after->undostr, str, sizeof(after->undostr));
BLI_addtail(&UIAfterFuncs, after);
@@ -429,7 +436,7 @@ static void ui_apply_but_BLOCK(bContext *C, uiBut *but, uiHandleButtonData *data
data->applied= 1;
}
-static void ui_apply_but_TOG(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data)
+static void ui_apply_but_TOG(bContext *C, uiBut *but, uiHandleButtonData *data)
{
double value;
int w, lvalue, push;
@@ -645,13 +652,12 @@ static int ui_but_mouse_inside_icon(uiBut *but, ARegion *ar, wmEvent *event)
return BLI_in_rcti(&rect, x, y);
}
-#define UI_DRAG_THRESHOLD 3
static int ui_but_start_drag(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event)
{
/* prevent other WM gestures to start while we try to drag */
WM_gestures_remove(C);
- if( ABS(data->dragstartx - event->x) + ABS(data->dragstarty - event->y) > UI_DRAG_THRESHOLD ) {
+ if( ABS(data->dragstartx - event->x) + ABS(data->dragstarty - event->y) > U.dragthreshold ) {
wmDrag *drag;
button_activate_state(C, but, BUTTON_STATE_EXIT);
@@ -896,7 +902,7 @@ static void ui_apply_button(bContext *C, uiBlock *block, uiBut *but, uiHandleBut
case BUT_TOGDUAL:
case OPTION:
case OPTIONN:
- ui_apply_but_TOG(C, block, but, data);
+ ui_apply_but_TOG(C, but, data);
break;
case ROW:
case LISTROW:
@@ -1067,19 +1073,19 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
/* text/string and ID data */
else if(ELEM3(but->type, TEX, IDPOIN, SEARCH_MENU)) {
- uiHandleButtonData *data= but->active;
+ uiHandleButtonData *active_data= but->active;
if(but->poin==NULL && but->rnapoin.data==NULL);
else if(mode=='c') {
button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING);
- BLI_strncpy(buf, data->str, UI_MAX_DRAW_STR);
- WM_clipboard_text_set(data->str, 0);
- data->cancel= 1;
+ BLI_strncpy(buf, active_data->str, UI_MAX_DRAW_STR);
+ WM_clipboard_text_set(active_data->str, 0);
+ active_data->cancel= 1;
button_activate_state(C, but, BUTTON_STATE_EXIT);
}
else {
button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING);
- BLI_strncpy(data->str, buf, data->maxlen);
+ BLI_strncpy(active_data->str, buf, active_data->maxlen);
button_activate_state(C, but, BUTTON_STATE_EXIT);
}
}
@@ -1280,7 +1286,7 @@ static int ui_textedit_type_ascii(uiBut *but, uiHandleButtonData *data, char asc
return changed;
}
-void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction, int select, int jump)
+static void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction, int select, int jump)
{
char *str;
int len;
@@ -1315,10 +1321,11 @@ void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction, int s
} else {
if(select) {
/* make a selection, starting from the cursor position */
+ int tlen;
but->selsta = but->pos;
but->pos++;
- if(but->pos>strlen(str)) but->pos= strlen(str);
+ if(but->pos > (tlen= strlen(str))) but->pos= tlen;
but->selend = but->pos;
} else if(jump) {
@@ -1330,8 +1337,9 @@ void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction, int s
if(test_special_char(str[but->pos])) break;
}
} else {
+ int tlen;
but->pos++;
- if(but->pos>strlen(str)) but->pos= strlen(str);
+ if(but->pos > (tlen= strlen(str))) but->pos= tlen;
}
}
}
@@ -1383,7 +1391,7 @@ void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction, int s
}
}
-void ui_textedit_move_end(uiBut *but, uiHandleButtonData *data, int direction, int select)
+static void ui_textedit_move_end(uiBut *but, uiHandleButtonData *data, int direction, int select)
{
char *str;
@@ -1588,7 +1596,7 @@ static void ui_textedit_begin(bContext *C, uiBut *but, uiHandleButtonData *data)
static void ui_textedit_end(bContext *C, uiBut *but, uiHandleButtonData *data)
{
if(but) {
- if(ui_is_utf8_but(but)) {
+ if(!ui_is_utf8_but(but)) {
int strip= BLI_utf8_invalid_strip(but->editstr, strlen(but->editstr));
/* not a file?, strip non utf-8 chars */
if(strip) {
@@ -1816,6 +1824,7 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle
/* only update when typing for TAB key */
if(update && data->interactive) ui_apply_button(C, block, but, data, 1);
else ui_check_but(but);
+ but->changed= TRUE;
if(data->searchbox)
ui_searchbox_update(C, data->searchbox, but, 1); /* 1 = reset */
@@ -2077,6 +2086,12 @@ static int ui_do_but_HOTKEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data
button_activate_state(C, but, BUTTON_STATE_EXIT);
return WM_UI_HANDLER_BREAK;
}
+ else if(event->type == ESCKEY) {
+ data->cancel= 1;
+ data->escapecancel= 1;
+ button_activate_state(C, but, BUTTON_STATE_EXIT);
+ }
+
}
}
@@ -2206,7 +2221,7 @@ static float ui_numedit_apply_snapf(uiBut *but, float tempf, float softmin, floa
if(ui_is_but_unit(but)) {
Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
- int unit_type = RNA_SUBTYPE_UNIT_VALUE(RNA_property_subtype(but->rnaprop));
+ int unit_type= uiButGetUnitType(but)>>16;
if(bUnit_IsValid(scene->unit.system, unit_type)) {
fac= (float)bUnit_BaseScalar(scene->unit.system, unit_type);
@@ -2829,17 +2844,18 @@ static int ui_do_but_BLOCK(bContext *C, uiBut *but, uiHandleButtonData *data, wm
}
else if(but->type==COL) {
if( ELEM(event->type, WHEELDOWNMOUSE, WHEELUPMOUSE) && event->alt) {
+ float *hsv= ui_block_hsv_get(but->block);
float col[3];
ui_get_but_vectorf(but, col);
- rgb_to_hsv(col[0], col[1], col[2], but->hsv, but->hsv+1, but->hsv+2);
+ rgb_to_hsv_compat(col[0], col[1], col[2], hsv, hsv+1, hsv+2);
if(event->type==WHEELDOWNMOUSE)
- but->hsv[2]= CLAMPIS(but->hsv[2]-0.05f, 0.0f, 1.0f);
+ hsv[2]= CLAMPIS(hsv[2]-0.05f, 0.0f, 1.0f);
else
- but->hsv[2]= CLAMPIS(but->hsv[2]+0.05f, 0.0f, 1.0f);
+ hsv[2]= CLAMPIS(hsv[2]+0.05f, 0.0f, 1.0f);
- hsv_to_rgb(but->hsv[0], but->hsv[1], but->hsv[2], data->vec, data->vec+1, data->vec+2);
+ hsv_to_rgb(hsv[0], hsv[1], hsv[2], data->vec, data->vec+1, data->vec+2);
ui_set_but_vectorf(but, data->vec);
button_activate_state(C, but, BUTTON_STATE_EXIT);
@@ -2969,7 +2985,8 @@ static int ui_do_but_NORMAL(bContext *C, uiBlock *block, uiBut *but, uiHandleBut
static int ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, int mx, int my)
{
- float rgb[3], hsv[3];
+ float rgb[3];
+ float *hsv= ui_block_hsv_get(but->block);
float x, y;
int changed= 1;
int color_profile = but->block->color_profile;
@@ -2978,51 +2995,53 @@ static int ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, int mx,
if (RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
color_profile = BLI_PR_NONE;
}
-
+
ui_get_but_vectorf(but, rgb);
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
-
+
+ rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+
/* relative position within box */
x= ((float)mx-but->x1)/(but->x2-but->x1);
y= ((float)my-but->y1)/(but->y2-but->y1);
CLAMP(x, 0.0, 1.0);
CLAMP(y, 0.0, 1.0);
-
- if(but->a1==0) {
- hsv[2]= x;
- hsv[1]= y;
- }
- else if(but->a1==1) {
- hsv[0]= x;
- hsv[2]= y;
- }
- else if(but->a1==2) {
- hsv[0]= x;
- hsv[1]= y;
- }
- else if(but->a1==3) {
- hsv[0]= x;
- }
- else if(but->a1==4) {
- hsv[1]= x;
- }
- else if(but->a1==5) {
- hsv[2]= x;
- }
- else if (but->a1==9){
- float range;
-
- /* vertical 'value' strip */
+ switch((int)but->a1) {
+ case UI_GRAD_SV:
+ hsv[2]= x;
+ hsv[1]= y;
+ break;
+ case UI_GRAD_HV:
+ hsv[0]= x;
+ hsv[2]= y;
+ break;
+ case UI_GRAD_HS:
+ hsv[0]= x;
+ hsv[1]= y;
+ break;
+ case UI_GRAD_H:
+ hsv[0]= x;
+ break;
+ case UI_GRAD_S:
+ hsv[1]= x;
+ break;
+ case UI_GRAD_V:
+ hsv[2]= x;
+ break;
+ case UI_GRAD_V_ALT:
+ /* vertical 'value' strip */
+
/* exception only for value strip - use the range set in but->min/max */
- range = but->softmax - but->softmin;
- hsv[2] = y*range + but->softmin;
+ hsv[2] = y * (but->softmax - but->softmin) + but->softmin;
if (color_profile)
hsv[2] = srgb_to_linearrgb(hsv[2]);
if (hsv[2] > but->softmax)
hsv[2] = but->softmax;
+ break;
+ default:
+ assert(!"invalid hsv type");
}
hsv_to_rgb(hsv[0], hsv[1], hsv[2], rgb, rgb+1, rgb+2);
@@ -3056,23 +3075,25 @@ static int ui_do_but_HSVCUBE(bContext *C, uiBlock *block, uiBut *but, uiHandleBu
return WM_UI_HANDLER_BREAK;
}
- else if (event->type == ZEROKEY && event->val == KM_PRESS) {
- if (but->a1==9){
- float rgb[3], hsv[3], def_hsv[3];
- float *def;
+ /* XXX hardcoded keymap check.... */
+ else if (ELEM(event->type, ZEROKEY, PAD0) && event->val == KM_PRESS) {
+ if (but->a1==UI_GRAD_V_ALT){
int len;
/* reset only value */
len= RNA_property_array_length(&but->rnapoin, but->rnaprop);
if (len >= 3) {
+ float rgb[3], def_hsv[3];
+ float *def;
+ float *hsv= ui_block_hsv_get(but->block);
def= MEM_callocN(sizeof(float)*len, "reset_defaults - float");
RNA_property_float_get_default_array(&but->rnapoin, but->rnaprop, def);
rgb_to_hsv(def[0], def[1], def[2], def_hsv, def_hsv+1, def_hsv+2);
ui_get_but_vectorf(but, rgb);
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+ rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
hsv_to_rgb(hsv[0], hsv[1], def_hsv[2], rgb, rgb+1, rgb+2);
ui_set_but_vectorf(but, rgb);
@@ -3110,13 +3131,15 @@ static int ui_numedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, int mx
{
rcti rect;
int changed= 1;
- float rgb[3], hsv[3];
+ float rgb[3];
+ float hsv[3];
rect.xmin= but->x1; rect.xmax= but->x2;
rect.ymin= but->y1; rect.ymax= but->y2;
ui_get_but_vectorf(but, rgb);
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+ copy_v3_v3(hsv, ui_block_hsv_get(but->block));
+ rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
/* exception, when using color wheel in 'locked' value state:
* allow choosing a hue for black values, by giving a tiny increment */
@@ -3174,22 +3197,24 @@ static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandle
return WM_UI_HANDLER_BREAK;
}
- else if (event->type == ZEROKEY && event->val == KM_PRESS) {
- float rgb[3], hsv[3], def_hsv[3];
- float *def;
+ /* XXX hardcoded keymap check.... */
+ else if (ELEM(event->type, ZEROKEY, PAD0) && event->val == KM_PRESS) {
int len;
/* reset only saturation */
len= RNA_property_array_length(&but->rnapoin, but->rnaprop);
if (len >= 3) {
+ float rgb[3], def_hsv[3];
+ float *def;
+ float *hsv= ui_block_hsv_get(but->block);
def= MEM_callocN(sizeof(float)*len, "reset_defaults - float");
RNA_property_float_get_default_array(&but->rnapoin, but->rnaprop, def);
rgb_to_hsv(def[0], def[1], def[2], def_hsv, def_hsv+1, def_hsv+2);
ui_get_but_vectorf(but, rgb);
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+ rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
hsv_to_rgb(hsv[0], def_hsv[1], hsv[2], rgb, rgb+1, rgb+2);
ui_set_but_vectorf(but, rgb);
@@ -3209,12 +3234,14 @@ static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandle
}
/* XXX hardcoded keymap check.... */
else if(event->type == WHEELDOWNMOUSE) {
- but->hsv[2]= CLAMPIS(but->hsv[2]-0.05f, 0.0f, 1.0f);
+ float *hsv= ui_block_hsv_get(but->block);
+ hsv[2]= CLAMPIS(hsv[2]-0.05f, 0.0f, 1.0f);
ui_set_but_hsv(but); // converts to rgb
ui_numedit_apply(C, block, but, data);
}
else if(event->type == WHEELUPMOUSE) {
- but->hsv[2]= CLAMPIS(but->hsv[2]+0.05f, 0.0f, 1.0f);
+ float *hsv= ui_block_hsv_get(but->block);
+ hsv[2]= CLAMPIS(hsv[2]+0.05f, 0.0f, 1.0f);
ui_set_but_hsv(but); // converts to rgb
ui_numedit_apply(C, block, but, data);
}
@@ -3434,7 +3461,7 @@ static int ui_do_but_CURVE(bContext *C, uiBlock *block, uiBut *but, uiHandleButt
if(event->type==LEFTMOUSE && event->val==KM_PRESS) {
CurveMapping *cumap= (CurveMapping*)but->poin;
CurveMap *cuma= cumap->cm+cumap->cur;
- CurveMapPoint *cmp= cuma->curve;
+ CurveMapPoint *cmp;
float fx, fy, zoomx, zoomy, offsx, offsy;
float dist, mindist= 200.0f; // 14 pixels radius
int sel= -1;
@@ -3557,7 +3584,7 @@ static int ui_do_but_CURVE(bContext *C, uiBlock *block, uiBut *but, uiHandleButt
return WM_UI_HANDLER_CONTINUE;
}
-static int in_scope_resize_zone(uiBut *but, int x, int y)
+static int in_scope_resize_zone(uiBut *but, int UNUSED(x), int y)
{
// bottom corner return (x > but->x2 - SCOPE_RESIZE_PAD) && (y < but->y1 + SCOPE_RESIZE_PAD);
return (y < but->y1 + SCOPE_RESIZE_PAD);
@@ -3616,7 +3643,8 @@ static int ui_do_but_HISTOGRAM(bContext *C, uiBlock *block, uiBut *but, uiHandle
return WM_UI_HANDLER_BREAK;
}
- else if (event->type == ZEROKEY && event->val == KM_PRESS) {
+ /* XXX hardcoded keymap check.... */
+ else if (ELEM(event->type, ZEROKEY, PAD0) && event->val == KM_PRESS) {
Histogram *hist = (Histogram *)but->poin;
hist->ymax = 1.f;
@@ -3698,7 +3726,8 @@ static int ui_do_but_WAVEFORM(bContext *C, uiBlock *block, uiBut *but, uiHandleB
return WM_UI_HANDLER_BREAK;
}
- else if (event->type == ZEROKEY && event->val == KM_PRESS) {
+ /* XXX hardcoded keymap check.... */
+ else if (ELEM(event->type, ZEROKEY, PAD0) && event->val == KM_PRESS) {
Scopes *scopes = (Scopes *)but->poin;
scopes->wavefrm_yfac = 1.f;
@@ -3732,13 +3761,13 @@ static int ui_numedit_but_VECTORSCOPE(uiBut *but, uiHandleButtonData *data, int
Scopes *scopes = (Scopes *)but->poin;
rcti rect;
int changed= 1;
- float dx, dy;
+ /* float dx, dy; */
rect.xmin= but->x1; rect.xmax= but->x2;
rect.ymin= but->y1; rect.ymax= but->y2;
- dx = mx - data->draglastx;
- dy = my - data->draglasty;
+ /* dx = mx - data->draglastx; */
+ /* dy = my - data->draglasty; */
if (in_scope_resize_zone(but, data->dragstartx, data->dragstarty)) {
/* resize vectorscope widget itself */
@@ -3796,7 +3825,7 @@ static int ui_do_but_VECTORSCOPE(bContext *C, uiBlock *block, uiBut *but, uiHand
}
#ifdef INTERNATIONAL
-static int ui_do_but_CHARTAB(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event)
+static int ui_do_but_CHARTAB(bContext *UNUSED(C), uiBlock *UNUSED(block), uiBut *UNUSED(but), uiHandleButtonData *UNUSED(data), wmEvent *UNUSED(event))
{
/* XXX 2.50 bad global and state access */
#if 0
@@ -3934,18 +3963,19 @@ static int ui_do_but_LINK(bContext *C, uiBut *but, uiHandleButtonData *data, wmE
return WM_UI_HANDLER_CONTINUE;
}
-static void but_shortcut_name_func(bContext *C, void *arg1, int event)
+static void but_shortcut_name_func(bContext *C, void *arg1, int UNUSED(event))
{
uiBut *but = (uiBut *)arg1;
-
- char buf[512], *butstr, *cpoin;
-
+
if (but->optype) {
+ char buf[512], *butstr, *cpoin;
+
IDProperty *prop= (but->opptr)? but->opptr->data: NULL;
/* complex code to change name of button */
if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) {
-
+ wmKeyMap *km= NULL;
+
butstr= MEM_mallocN(strlen(but->str)+strlen(buf)+2, "menu_block_set_keymaps");
// XXX but->str changed... should not, remove the hotkey from it
@@ -3961,6 +3991,11 @@ static void but_shortcut_name_func(bContext *C, void *arg1, int event)
MEM_freeN(butstr);
ui_check_but(but);
+
+ /* set the keymap editable else the key wont save */
+ WM_key_event_operator_id(C, but->optype->idname, but->opcontext, prop, 1, &km);
+ WM_keymap_copy_to_user(km);
+
} else {
/* shortcut was removed */
cpoin= strchr(but->str, '|');
@@ -3987,14 +4022,14 @@ static uiBlock *menu_change_shortcut(bContext *C, ARegion *ar, void *arg)
block= uiBeginBlock(C, ar, "_popup", UI_EMBOSS);
uiBlockSetHandleFunc(block, but_shortcut_name_func, but);
- uiBlockSetFlag(block, UI_BLOCK_RET_1|UI_BLOCK_MOVEMOUSE_QUIT);
+ uiBlockSetFlag(block, UI_BLOCK_MOVEMOUSE_QUIT);
uiBlockSetDirection(block, UI_CENTER);
layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 200, 20, style);
- uiItemR(layout, &ptr, "type", UI_ITEM_R_FULL_EVENT|UI_ITEM_R_IMMEDIATE, "", 0);
+ uiItemR(layout, &ptr, "type", UI_ITEM_R_FULL_EVENT|UI_ITEM_R_IMMEDIATE, "", ICON_NULL);
- uiPopupBoundsBlock(block, 6, 100, 10);
+ uiPopupBoundsBlock(block, 6, -50, 26);
uiEndBlock(C, block);
return block;
@@ -4013,35 +4048,39 @@ static uiBlock *menu_add_shortcut(bContext *C, ARegion *ar, void *arg)
km = WM_keymap_guess_opname(C, but->optype->idname);
kmi = WM_keymap_add_item(km, but->optype->idname, AKEY, KM_PRESS, 0, 0);
- MEM_freeN(kmi->properties);
- if (prop)
- kmi->properties= IDP_CopyProperty(prop);
-
+
+ if (prop) {
+ prop= IDP_CopyProperty(prop);
+ }
+
+ /* prop can be NULL */
+ WM_keymap_properties_reset(kmi, prop);
+
RNA_pointer_create(NULL, &RNA_KeyMapItem, kmi, &ptr);
-
+
block= uiBeginBlock(C, ar, "_popup", UI_EMBOSS);
uiBlockSetHandleFunc(block, but_shortcut_name_func, but);
uiBlockSetFlag(block, UI_BLOCK_RET_1);
uiBlockSetDirection(block, UI_CENTER);
-
+
layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 200, 20, style);
- uiItemR(layout, &ptr, "type", UI_ITEM_R_FULL_EVENT|UI_ITEM_R_IMMEDIATE, "", 0);
+ uiItemR(layout, &ptr, "type", UI_ITEM_R_FULL_EVENT|UI_ITEM_R_IMMEDIATE, "", ICON_NULL);
- uiPopupBoundsBlock(block, 6, 100, 10);
+ uiPopupBoundsBlock(block, 6, -50, 26);
uiEndBlock(C, block);
return block;
}
-static void popup_change_shortcut_func(bContext *C, void *arg1, void *arg2)
+static void popup_change_shortcut_func(bContext *C, void *arg1, void *UNUSED(arg2))
{
uiBut *but = (uiBut *)arg1;
button_timers_tooltip_remove(C, but);
uiPupBlock(C, menu_change_shortcut, but);
}
-static void remove_shortcut_func(bContext *C, void *arg1, void *arg2)
+static void remove_shortcut_func(bContext *C, void *arg1, void *UNUSED(arg2))
{
uiBut *but = (uiBut *)arg1;
wmKeyMap *km;
@@ -4055,7 +4094,7 @@ static void remove_shortcut_func(bContext *C, void *arg1, void *arg2)
but_shortcut_name_func(C, but, 0);
}
-static void popup_add_shortcut_func(bContext *C, void *arg1, void *arg2)
+static void popup_add_shortcut_func(bContext *C, void *arg1, void *UNUSED(arg2))
{
uiBut *but = (uiBut *)arg1;
button_timers_tooltip_remove(C, but);
@@ -4068,7 +4107,7 @@ static int ui_but_menu(bContext *C, uiBut *but)
uiPopupMenu *pup;
uiLayout *layout;
int length;
- char *name;
+ const char *name;
if((but->rnapoin.data && but->rnaprop)==0 && but->optype==NULL)
return 0;
@@ -4076,42 +4115,47 @@ static int ui_but_menu(bContext *C, uiBut *but)
button_timers_tooltip_remove(C, but);
if(but->rnaprop)
- name= (char*)RNA_property_ui_name(but->rnaprop);
+ name= RNA_property_ui_name(but->rnaprop);
else if (but->optype)
name= but->optype->name;
else
name= "<needs_name>"; // XXX - should never happen.
- pup= uiPupMenuBegin(C, name, 0);
+ pup= uiPupMenuBegin(C, name, ICON_NULL);
layout= uiPupMenuLayout(pup);
uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT);
if(but->rnapoin.data && but->rnaprop) {
+ short is_anim= RNA_property_animateable(&but->rnapoin, but->rnaprop);
+
+ /* second slower test, saved people finding keyframe items in menus when its not possible */
+ if(is_anim)
+ is_anim= RNA_property_path_from_ID_check(&but->rnapoin, but->rnaprop);
length= RNA_property_array_length(&but->rnapoin, but->rnaprop);
/* Keyframes */
if(but->flag & UI_BUT_ANIMATED_KEY) {
if(length) {
- uiItemBooleanO(layout, "Replace Keyframes", 0, "ANIM_OT_keyframe_insert_button", "all", 1);
- uiItemBooleanO(layout, "Replace Single Keyframe", 0, "ANIM_OT_keyframe_insert_button", "all", 0);
- uiItemBooleanO(layout, "Delete Keyframes", 0, "ANIM_OT_keyframe_delete_button", "all", 1);
- uiItemBooleanO(layout, "Delete Single Keyframe", 0, "ANIM_OT_keyframe_delete_button", "all", 0);
+ uiItemBooleanO(layout, "Replace Keyframes", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 1);
+ uiItemBooleanO(layout, "Replace Single Keyframe", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 0);
+ uiItemBooleanO(layout, "Delete Keyframes", ICON_NULL, "ANIM_OT_keyframe_delete_button", "all", 1);
+ uiItemBooleanO(layout, "Delete Single Keyframe", ICON_NULL, "ANIM_OT_keyframe_delete_button", "all", 0);
}
else {
- uiItemBooleanO(layout, "Replace Keyframe", 0, "ANIM_OT_keyframe_insert_button", "all", 0);
- uiItemBooleanO(layout, "Delete Keyframe", 0, "ANIM_OT_keyframe_delete_button", "all", 0);
+ uiItemBooleanO(layout, "Replace Keyframe", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 0);
+ uiItemBooleanO(layout, "Delete Keyframe", ICON_NULL, "ANIM_OT_keyframe_delete_button", "all", 0);
}
}
else if(but->flag & UI_BUT_DRIVEN);
- else if(RNA_property_animateable(&but->rnapoin, but->rnaprop)) {
+ else if(is_anim) {
if(length) {
- uiItemBooleanO(layout, "Insert Keyframes", 0, "ANIM_OT_keyframe_insert_button", "all", 1);
- uiItemBooleanO(layout, "Insert Single Keyframe", 0, "ANIM_OT_keyframe_insert_button", "all", 0);
+ uiItemBooleanO(layout, "Insert Keyframes", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 1);
+ uiItemBooleanO(layout, "Insert Single Keyframe", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 0);
}
else
- uiItemBooleanO(layout, "Insert Keyframe", 0, "ANIM_OT_keyframe_insert_button", "all", 0);
+ uiItemBooleanO(layout, "Insert Keyframe", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 0);
}
/* Drivers */
@@ -4119,43 +4163,43 @@ static int ui_but_menu(bContext *C, uiBut *but)
uiItemS(layout);
if(length) {
- uiItemBooleanO(layout, "Delete Drivers", 0, "ANIM_OT_driver_button_remove", "all", 1);
- uiItemBooleanO(layout, "Delete Single Driver", 0, "ANIM_OT_driver_button_remove", "all", 0);
+ uiItemBooleanO(layout, "Delete Drivers", ICON_NULL, "ANIM_OT_driver_button_remove", "all", 1);
+ uiItemBooleanO(layout, "Delete Single Driver", ICON_NULL, "ANIM_OT_driver_button_remove", "all", 0);
}
else
- uiItemBooleanO(layout, "Delete Driver", 0, "ANIM_OT_driver_button_remove", "all", 0);
+ uiItemBooleanO(layout, "Delete Driver", ICON_NULL, "ANIM_OT_driver_button_remove", "all", 0);
- uiItemO(layout, "Copy Driver", 0, "ANIM_OT_copy_driver_button");
+ uiItemO(layout, "Copy Driver", ICON_NULL, "ANIM_OT_copy_driver_button");
if (ANIM_driver_can_paste())
- uiItemO(layout, "Paste Driver", 0, "ANIM_OT_paste_driver_button");
+ uiItemO(layout, "Paste Driver", ICON_NULL, "ANIM_OT_paste_driver_button");
}
- else if(but->flag & UI_BUT_ANIMATED_KEY);
- else if(RNA_property_animateable(&but->rnapoin, but->rnaprop)) {
+ else if(but->flag & (UI_BUT_ANIMATED_KEY|UI_BUT_ANIMATED));
+ else if(is_anim) {
uiItemS(layout);
if(length) {
- uiItemBooleanO(layout, "Add Drivers", 0, "ANIM_OT_driver_button_add", "all", 1);
- uiItemBooleanO(layout, "Add Single Driver", 0, "ANIM_OT_driver_button_add", "all", 0);
+ uiItemBooleanO(layout, "Add Drivers", ICON_NULL, "ANIM_OT_driver_button_add", "all", 1);
+ uiItemBooleanO(layout, "Add Single Driver", ICON_NULL, "ANIM_OT_driver_button_add", "all", 0);
}
else
- uiItemBooleanO(layout, "Add Driver", 0, "ANIM_OT_driver_button_add", "all", 0);
+ uiItemBooleanO(layout, "Add Driver", ICON_NULL, "ANIM_OT_driver_button_add", "all", 0);
if (ANIM_driver_can_paste())
- uiItemO(layout, "Paste Driver", 0, "ANIM_OT_paste_driver_button");
+ uiItemO(layout, "Paste Driver", ICON_NULL, "ANIM_OT_paste_driver_button");
}
/* Keying Sets */
- if(RNA_property_animateable(&but->rnapoin, but->rnaprop)) {
+ if(is_anim) {
uiItemS(layout);
if(length) {
- uiItemBooleanO(layout, "Add All to Keying Set", 0, "ANIM_OT_keyingset_button_add", "all", 1);
- uiItemBooleanO(layout, "Add Single to Keying Set", 0, "ANIM_OT_keyingset_button_add", "all", 0);
- uiItemO(layout, "Remove from Keying Set", 0, "ANIM_OT_keyingset_button_remove");
+ uiItemBooleanO(layout, "Add All to Keying Set", ICON_NULL, "ANIM_OT_keyingset_button_add", "all", 1);
+ uiItemBooleanO(layout, "Add Single to Keying Set", ICON_NULL, "ANIM_OT_keyingset_button_add", "all", 0);
+ uiItemO(layout, "Remove from Keying Set", ICON_NULL, "ANIM_OT_keyingset_button_remove");
}
else {
- uiItemBooleanO(layout, "Add to Keying Set", 0, "ANIM_OT_keyingset_button_add", "all", 0);
- uiItemO(layout, "Remove from Keying Set", 0, "ANIM_OT_keyingset_button_remove");
+ uiItemBooleanO(layout, "Add to Keying Set", ICON_NULL, "ANIM_OT_keyingset_button_add", "all", 0);
+ uiItemO(layout, "Remove from Keying Set", ICON_NULL, "ANIM_OT_keyingset_button_remove");
}
}
@@ -4167,14 +4211,14 @@ static int ui_but_menu(bContext *C, uiBut *but)
//Paste Property Value
if(length) {
- uiItemBooleanO(layout, "Reset All to Default Values", 0, "UI_OT_reset_default_button", "all", 1);
- uiItemBooleanO(layout, "Reset Single to Default Value", 0, "UI_OT_reset_default_button", "all", 0);
+ uiItemBooleanO(layout, "Reset All to Default Values", ICON_NULL, "UI_OT_reset_default_button", "all", 1);
+ uiItemBooleanO(layout, "Reset Single to Default Value", ICON_NULL, "UI_OT_reset_default_button", "all", 0);
}
else
- uiItemO(layout, "Reset to Default Value", 0, "UI_OT_reset_default_button");
+ uiItemO(layout, "Reset to Default Value", ICON_NULL, "UI_OT_reset_default_button");
- uiItemO(layout, "Copy Data Path", 0, "UI_OT_copy_data_path_button");
- uiItemO(layout, "Copy To Selected", 0, "UI_OT_copy_to_selected_button");
+ uiItemO(layout, "Copy Data Path", ICON_NULL, "UI_OT_copy_data_path_button");
+ uiItemO(layout, "Copy To Selected", ICON_NULL, "UI_OT_copy_to_selected_button");
uiItemS(layout);
}
@@ -4223,28 +4267,29 @@ static int ui_but_menu(bContext *C, uiBut *but)
WM_operator_properties_create(&ptr_props, "WM_OT_doc_view");
RNA_string_set(&ptr_props, "doc_id", buf);
- uiItemFullO(layout, "WM_OT_doc_view", "View Docs", 0, ptr_props.data, WM_OP_EXEC_DEFAULT, 0);
-
+ uiItemFullO(layout, "WM_OT_doc_view", "View Docs", ICON_NULL, ptr_props.data, WM_OP_EXEC_DEFAULT, 0);
- WM_operator_properties_create(&ptr_props, "WM_OT_doc_edit");
+ /* XXX inactive option, not for public! */
+/* WM_operator_properties_create(&ptr_props, "WM_OT_doc_edit");
RNA_string_set(&ptr_props, "doc_id", buf);
RNA_string_set(&ptr_props, "doc_new", RNA_property_description(but->rnaprop));
- uiItemFullO(layout, "WM_OT_doc_edit", "Submit Description", 0, ptr_props.data, WM_OP_INVOKE_DEFAULT, 0);
+ uiItemFullO(layout, "WM_OT_doc_edit", "Submit Description", ICON_NULL, ptr_props.data, WM_OP_INVOKE_DEFAULT, 0);
+ */
}
else if (but->optype) {
WM_operator_py_idname(buf, but->optype->idname);
WM_operator_properties_create(&ptr_props, "WM_OT_doc_view");
RNA_string_set(&ptr_props, "doc_id", buf);
- uiItemFullO(layout, "WM_OT_doc_view", "View Docs", 0, ptr_props.data, WM_OP_EXEC_DEFAULT, 0);
+ uiItemFullO(layout, "WM_OT_doc_view", "View Docs", ICON_NULL, ptr_props.data, WM_OP_EXEC_DEFAULT, 0);
WM_operator_properties_create(&ptr_props, "WM_OT_doc_edit");
RNA_string_set(&ptr_props, "doc_id", buf);
RNA_string_set(&ptr_props, "doc_new", but->optype->description);
- uiItemFullO(layout, "WM_OT_doc_edit", "Submit Description", 0, ptr_props.data, WM_OP_INVOKE_DEFAULT, 0);
+ uiItemFullO(layout, "WM_OT_doc_edit", "Submit Description", ICON_NULL, ptr_props.data, WM_OP_INVOKE_DEFAULT, 0);
}
}
@@ -4255,7 +4300,7 @@ static int ui_but_menu(bContext *C, uiBut *but)
static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
{
- Scene *scene= CTX_data_scene(C);
+// Scene *scene= CTX_data_scene(C);
uiHandleButtonData *data;
int retval;
@@ -4265,7 +4310,12 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
if(but->flag & UI_BUT_DISABLED)
return WM_UI_HANDLER_CONTINUE;
- if(data->state == BUTTON_STATE_HIGHLIGHT) {
+ if( (data->state == BUTTON_STATE_HIGHLIGHT) &&
+ /* check prevval because of modal operators [#24016],
+ * modifier check is to allow Ctrl+C for copy.
+ * if this causes other problems, remove this check and suffer the bug :) - campbell */
+ (event->prevval != KM_PRESS || ISKEYMODIFIER(event->prevtype))
+ ) {
/* handle copy-paste */
if(ELEM(event->type, CKEY, VKEY) && event->val==KM_PRESS && (event->ctrl || event->oskey)) {
ui_but_copy_paste(C, but, data, (event->type == CKEY)? 'c': 'v');
@@ -4309,7 +4359,8 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
return WM_UI_HANDLER_BREAK;
}
/* reset to default */
- else if(ELEM(event->type, ZEROKEY,PAD0) && event->val == KM_PRESS) {
+ /* XXX hardcoded keymap check.... */
+ else if(ELEM(event->type, ZEROKEY, PAD0) && event->val == KM_PRESS) {
if (!(ELEM3(but->type, HSVCIRCLE, HSVCUBE, HISTOGRAM)))
ui_set_but_default(C, but);
}
@@ -4408,7 +4459,7 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
retval= ui_do_but_BUT(C, but, data, event);
break;
case COL:
- if(but->a1 == 9) // signal to prevent calling up color picker
+ if(but->a1 == UI_GRAD_V_ALT) // signal to prevent calling up color picker
retval= ui_do_but_EXIT(C, but, data, event);
else
retval= ui_do_but_BLOCK(C, but, data, event);
@@ -4563,7 +4614,7 @@ static int ui_mouse_inside_button(ARegion *ar, uiBut *but, int x, int y)
return 1;
}
-static uiBut *ui_but_find_mouse_over(wmWindow *win, ARegion *ar, int x, int y)
+static uiBut *ui_but_find_mouse_over(ARegion *ar, int x, int y)
{
uiBlock *block;
uiBut *but, *butover= NULL;
@@ -4595,7 +4646,7 @@ static uiBut *ui_but_find_mouse_over(wmWindow *win, ARegion *ar, int x, int y)
return butover;
}
-static uiBut *ui_list_find_mouse_over(wmWindow *win, ARegion *ar, int x, int y)
+static uiBut *ui_list_find_mouse_over(ARegion *ar, int x, int y)
{
uiBlock *block;
uiBut *but;
@@ -4633,19 +4684,21 @@ static void button_timers_tooltip_remove(bContext *C, uiBut *but)
uiHandleButtonData *data;
data= but->active;
+ if(data) {
- if(data->tooltiptimer) {
- WM_event_remove_timer(data->wm, data->window, data->tooltiptimer);
- data->tooltiptimer= NULL;
- }
- if(data->tooltip) {
- ui_tooltip_free(C, data->tooltip);
- data->tooltip= NULL;
- }
+ if(data->tooltiptimer) {
+ WM_event_remove_timer(data->wm, data->window, data->tooltiptimer);
+ data->tooltiptimer= NULL;
+ }
+ if(data->tooltip) {
+ ui_tooltip_free(C, data->tooltip);
+ data->tooltip= NULL;
+ }
- if(data->autoopentimer) {
- WM_event_remove_timer(data->wm, data->window, data->autoopentimer);
- data->autoopentimer= NULL;
+ if(data->autoopentimer) {
+ WM_event_remove_timer(data->wm, data->window, data->autoopentimer);
+ data->autoopentimer= NULL;
+ }
}
}
@@ -4784,7 +4837,7 @@ static void button_activate_init(bContext *C, ARegion *ar, uiBut *but, uiButtonA
/* we disable auto_open in the block after a threshold, because we still
* want to allow auto opening adjacent menus even if no button is activated
- * inbetween going over to the other button, but only for a short while */
+ * in between going over to the other button, but only for a short while */
if(type == BUTTON_ACTIVATE_OVER && but->block->auto_open)
if(but->block->auto_open_last+BUTTON_AUTO_OPEN_THRESH < PIL_check_seconds_timer())
but->block->auto_open= 0;
@@ -4911,17 +4964,16 @@ void ui_button_active_free(const bContext *C, uiBut *but)
void uiContextActiveProperty(const bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index)
{
ARegion *ar= CTX_wm_region(C);
- uiBlock *block;
- uiBut *but, *activebut;
memset(ptr, 0, sizeof(*ptr));
*prop= NULL;
*index= 0;
while(ar) {
+ uiBlock *block;
+ uiBut *but, *activebut= NULL;
+
/* find active button */
- activebut= NULL;
-
for(block=ar->uiblocks.first; block; block=block->next) {
for(but=block->buttons.first; but; but= but->next) {
if(but->active)
@@ -4931,21 +4983,20 @@ void uiContextActiveProperty(const bContext *C, struct PointerRNA *ptr, struct P
}
}
- if(activebut) {
- if(activebut->rnapoin.data) {
- /* found RNA button */
- *ptr= activebut->rnapoin;
- *prop= activebut->rnaprop;
- *index= activebut->rnaindex;
- return;
+ if(activebut && activebut->rnapoin.data) {
+ uiHandleButtonData *data= activebut->active;
+
+ /* found RNA button */
+ *ptr= activebut->rnapoin;
+ *prop= activebut->rnaprop;
+ *index= activebut->rnaindex;
+
+ /* recurse into opened menu, like colorpicker case */
+ if(data && data->menu && (ar != data->menu->region)) {
+ ar = data->menu->region;
}
else {
- /* recurse into opened menu */
- uiHandleButtonData *data= activebut->active;
- if(data && data->menu)
- ar = data->menu->region;
- else
- return;
+ return;
}
}
else {
@@ -4970,7 +5021,8 @@ void uiContextAnimUpdate(const bContext *C)
for(block=ar->uiblocks.first; block; block=block->next) {
for(but=block->buttons.first; but; but= but->next) {
ui_but_anim_flag(but, (scene)? scene->r.cfra: 0.0f);
-
+ ED_region_tag_redraw(ar);
+
if(but->active)
activebut= but;
else if(!activebut && (but->flag & UI_BUT_LAST_ACTIVE))
@@ -4979,18 +5031,12 @@ void uiContextAnimUpdate(const bContext *C)
}
if(activebut) {
- if(activebut->rnapoin.data) {
- /* found RNA button */
+ /* always recurse into opened menu, so all buttons update (like colorpicker) */
+ uiHandleButtonData *data= activebut->active;
+ if(data && data->menu)
+ ar = data->menu->region;
+ else
return;
- }
- else {
- /* recurse into opened menu */
- uiHandleButtonData *data= activebut->active;
- if(data && data->menu)
- ar = data->menu->region;
- else
- return;
- }
}
else {
/* no active button */
@@ -5016,11 +5062,10 @@ static uiBut *uit_but_find_open_event(ARegion *ar, wmEvent *event)
static int ui_handle_button_over(bContext *C, wmEvent *event, ARegion *ar)
{
- wmWindow *win= CTX_wm_window(C);
uiBut *but;
if(event->type == MOUSEMOVE) {
- but= ui_but_find_mouse_over(win, ar, event->x, event->y);
+ but= ui_but_find_mouse_over(ar, event->x, event->y);
if(but)
button_activate_init(C, ar, but, BUTTON_ACTIVATE_OVER);
}
@@ -5098,7 +5143,7 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but)
data->cancel= 1;
button_activate_state(C, but, BUTTON_STATE_EXIT);
}
- else if(ui_but_find_mouse_over(data->window, ar, event->x, event->y) != but) {
+ else if(ui_but_find_mouse_over(ar, event->x, event->y) != but) {
data->cancel= 1;
button_activate_state(C, but, BUTTON_STATE_EXIT);
}
@@ -5159,16 +5204,17 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but)
}
else {
/* deselect the button when moving the mouse away */
+ /* also de-activate for buttons that only show higlights */
if(ui_mouse_inside_button(ar, but, event->x, event->y)) {
if(!(but->flag & UI_SELECT)) {
- but->flag |= UI_SELECT;
+ but->flag |= (UI_SELECT|UI_ACTIVE);
data->cancel= 0;
ED_region_tag_redraw(data->region);
}
}
else {
if(but->flag & UI_SELECT) {
- but->flag &= ~UI_SELECT;
+ but->flag &= ~(UI_SELECT|UI_ACTIVE);
data->cancel= 1;
ED_region_tag_redraw(data->region);
}
@@ -5194,9 +5240,16 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but)
retval= WM_UI_HANDLER_CONTINUE;
}
else if(data->state == BUTTON_STATE_MENU_OPEN) {
+ /* check for exit because of mouse-over another button */
switch(event->type) {
- case MOUSEMOVE: {
- uiBut *bt= ui_but_find_mouse_over(data->window, ar, event->x, event->y);
+ case MOUSEMOVE:
+
+ if(data->menu && data->menu->region)
+ if(ui_mouse_inside_region(data->menu->region, event->x, event->y))
+ break;
+
+ {
+ uiBut *bt= ui_but_find_mouse_over(ar, event->x, event->y);
if(bt && bt->active != data) {
if(but->type != COL) /* exception */
@@ -5231,8 +5284,7 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but)
static int ui_handle_list_event(bContext *C, wmEvent *event, ARegion *ar)
{
- wmWindow *win= CTX_wm_window(C);
- uiBut *but= ui_list_find_mouse_over(win, ar, event->x, event->y);
+ uiBut *but= ui_list_find_mouse_over(ar, event->x, event->y);
int retval= WM_UI_HANDLER_CONTINUE;
int value, min, max;
@@ -5419,7 +5471,7 @@ static int ui_mouse_motion_towards_check(uiBlock *block, uiPopupBlockHandle *men
return menu->dotowards;
}
-int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu, int topmenu)
+int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu, int UNUSED(topmenu))
{
ARegion *ar;
uiBlock *block;
@@ -5498,8 +5550,8 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu,
but= ui_but_find_activated(ar);
if(but) {
/* is there a situation where UI_LEFT or UI_RIGHT would also change navigation direction? */
- /* UI_TOP and UI_DOWN are inconsistant - should be UI_UP and UI_DOWN or UI_TOP and UI_BOTTOM */
if( ((ELEM(event->type, DOWNARROWKEY, WHEELDOWNMOUSE)) && (block->direction & UI_DOWN)) ||
+ ((ELEM(event->type, DOWNARROWKEY, WHEELDOWNMOUSE)) && (block->direction & UI_RIGHT)) ||
((ELEM(event->type, UPARROWKEY, WHEELUPMOUSE)) && (block->direction & UI_TOP))
) {
/* the following is just a hack - uiBut->type set to BUT and BUTM have there menus built
@@ -5522,19 +5574,24 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu,
if(!but) {
if( ((ELEM(event->type, UPARROWKEY, WHEELUPMOUSE)) && (block->direction & UI_DOWN)) ||
+ ((ELEM(event->type, UPARROWKEY, WHEELUPMOUSE)) && (block->direction & UI_RIGHT)) ||
((ELEM(event->type, DOWNARROWKEY, WHEELDOWNMOUSE)) && (block->direction & UI_TOP))
) {
- if(ui_but_first(block)->type & BUT)
+ if((bt= ui_but_first(block)) && (bt->type & BUT)) {
bt= ui_but_last(block);
- else
- bt= ui_but_first(block);
+ }
+ else {
+ /* keep ui_but_first() */
+ }
}
else {
- if(ui_but_first(block)->type & BUT)
- bt= ui_but_first(block);
- else
+ if((bt= ui_but_first(block)) && (bt->type & BUT)) {
+ /* keep ui_but_first() */
+ }
+ else {
bt= ui_but_last(block);
- }
+ }
+ }
if(bt)
ui_handle_button_activate(C, ar, bt, BUTTON_ACTIVATE);
@@ -5546,25 +5603,25 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu,
break;
- case ONEKEY: case PAD1:
+ case ONEKEY: case PAD1:
act= 1;
- case TWOKEY: case PAD2:
+ case TWOKEY: case PAD2:
if(act==0) act= 2;
- case THREEKEY: case PAD3:
+ case THREEKEY: case PAD3:
if(act==0) act= 3;
- case FOURKEY: case PAD4:
+ case FOURKEY: case PAD4:
if(act==0) act= 4;
- case FIVEKEY: case PAD5:
+ case FIVEKEY: case PAD5:
if(act==0) act= 5;
- case SIXKEY: case PAD6:
+ case SIXKEY: case PAD6:
if(act==0) act= 6;
- case SEVENKEY: case PAD7:
+ case SEVENKEY: case PAD7:
if(act==0) act= 7;
- case EIGHTKEY: case PAD8:
+ case EIGHTKEY: case PAD8:
if(act==0) act= 8;
- case NINEKEY: case PAD9:
+ case NINEKEY: case PAD9:
if(act==0) act= 9;
- case ZEROKEY: case PAD0:
+ case ZEROKEY: case PAD0:
if(act==0) act= 10;
if((block->flag & UI_BLOCK_NUMSELECT) && event->val==KM_PRESS) {
@@ -5600,8 +5657,68 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu,
retval= WM_UI_HANDLER_BREAK;
}
+ break;
+
+ /* Handle keystrokes on menu items */
+ case AKEY:
+ case BKEY:
+ case CKEY:
+ case DKEY:
+ case EKEY:
+ case FKEY:
+ case GKEY:
+ case HKEY:
+ case IKEY:
+ case JKEY:
+ case KKEY:
+ case LKEY:
+ case MKEY:
+ case NKEY:
+ case OKEY:
+ case PKEY:
+ case QKEY:
+ case RKEY:
+ case SKEY:
+ case TKEY:
+ case UKEY:
+ case VKEY:
+ case WKEY:
+ case XKEY:
+ case YKEY:
+ case ZKEY:
+ {
+ if( (event->val == KM_PRESS) &&
+ (event->shift == FALSE) &&
+ (event->ctrl == FALSE) &&
+ (event->oskey == FALSE)
+ ) {
+ for(but= block->buttons.first; but; but= but->next) {
+ if(but->menu_key==event->type) {
+ if(but->type == BUT) {
+ /* mainly for operator buttons */
+ ui_handle_button_activate(C, ar, but, BUTTON_ACTIVATE_APPLY);
+ }
+ else if(ELEM(but->type, BLOCK, PULLDOWN)) {
+ /* open submenus (like right arrow key) */
+ ui_handle_button_activate(C, ar, but, BUTTON_ACTIVATE_OPEN);
+ }
+ else if (but->type == MENU) {
+ /* activate menu items */
+ ui_handle_button_activate(C, ar, but, BUTTON_ACTIVATE);
+ }
+ else {
+ printf("Error, but->menu_key type: %d\n", but->type);
+ }
+
+ break;
+ }
+ }
+
+ retval= WM_UI_HANDLER_BREAK;
+ }
break;
+ }
}
}
@@ -5614,7 +5731,7 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu,
if(ELEM3(event->type, LEFTMOUSE, MIDDLEMOUSE, RIGHTMOUSE) && event->val==KM_PRESS) {
if(saferct && !BLI_in_rctf(&saferct->parent, event->x, event->y)) {
- if(block->flag & (UI_BLOCK_OUT_1|UI_BLOCK_KEEP_OPEN))
+ if(block->flag & (UI_BLOCK_OUT_1))
menu->menuretval= UI_RETURN_OK;
else
menu->menuretval= UI_RETURN_OUT;
@@ -5628,10 +5745,10 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu,
menu->menuretval= UI_RETURN_CANCEL;
}
else if(ELEM(event->type, RETKEY, PADENTER) && event->val==KM_PRESS) {
- /* enter will always close this block, but we let the event
- * get handled by the button if it is activated */
+ /* enter will always close this block, we let the event
+ * get handled by the button if it is activated, otherwise we cancel */
if(!ui_but_find_activated(ar))
- menu->menuretval= UI_RETURN_OK;
+ menu->menuretval= UI_RETURN_CANCEL;
}
else {
ui_mouse_motion_towards_check(block, menu, mx, my);
@@ -5655,7 +5772,7 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu,
/* strict check, and include the parent rect */
if(!menu->dotowards && !saferct) {
- if(block->flag & (UI_BLOCK_OUT_1|UI_BLOCK_KEEP_OPEN))
+ if(block->flag & (UI_BLOCK_OUT_1))
menu->menuretval= UI_RETURN_OK;
else
menu->menuretval= UI_RETURN_OUT;
@@ -5778,7 +5895,7 @@ static int ui_handle_menus_recursive(bContext *C, wmEvent *event, uiPopupBlockHa
/* *************** UI event handlers **************** */
-static int ui_handler_region(bContext *C, wmEvent *event, void *userdata)
+static int ui_handler_region(bContext *C, wmEvent *event, void *UNUSED(userdata))
{
ARegion *ar;
uiBut *but;
@@ -5816,7 +5933,7 @@ static int ui_handler_region(bContext *C, wmEvent *event, void *userdata)
return retval;
}
-static void ui_handler_remove_region(bContext *C, void *userdata)
+static void ui_handler_remove_region(bContext *C, void *UNUSED(userdata))
{
bScreen *sc;
ARegion *ar;
@@ -5836,7 +5953,7 @@ static void ui_handler_remove_region(bContext *C, void *userdata)
ui_apply_but_funcs_after(C);
}
-static int ui_handler_region_menu(bContext *C, wmEvent *event, void *userdata)
+static int ui_handler_region_menu(bContext *C, wmEvent *event, void *UNUSED(userdata))
{
ARegion *ar;
uiBut *but;
diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c
index 499c676bf6f..788de41202d 100644
--- a/source/blender/editors/interface/interface_icons.c
+++ b/source/blender/editors/interface/interface_icons.c
@@ -43,10 +43,12 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_storage_types.h"
+#include "BLI_utildefines.h"
#include "DNA_brush_types.h"
#include "DNA_object_types.h"
#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
#include "RNA_access.h"
#include "RNA_enum_types.h"
@@ -60,6 +62,7 @@
#include "IMB_imbuf_types.h"
#include "BIF_gl.h"
+#include "BIF_glutil.h"
#include "ED_datafiles.h"
#include "ED_render.h"
@@ -330,7 +333,7 @@ static void vicon_editmode_hlt_draw(int x, int y, int w, int h, float alpha)
viconutil_draw_points(pts, 3, 1);
}
-static void vicon_editmode_dehlt_draw(int x, int y, int w, int h, float alpha)
+static void vicon_editmode_dehlt_draw(int x, int y, int w, int h, float UNUSED(alpha))
{
GLint pts[3][2];
@@ -345,7 +348,7 @@ static void vicon_editmode_dehlt_draw(int x, int y, int w, int h, float alpha)
viconutil_draw_points(pts, 3, 1);
}
-static void vicon_disclosure_tri_right_draw(int x, int y, int w, int h, float alpha)
+static void vicon_disclosure_tri_right_draw(int x, int y, int w, int UNUSED(h), float alpha)
{
GLint pts[3][2];
int cx = x+w/2;
@@ -370,7 +373,7 @@ static void vicon_disclosure_tri_right_draw(int x, int y, int w, int h, float al
viconutil_draw_lineloop_smooth(pts, 3);
}
-static void vicon_small_tri_right_draw(int x, int y, int w, int h, float alpha)
+static void vicon_small_tri_right_draw(int x, int y, int w, int UNUSED(h), float alpha)
{
GLint pts[3][2];
int cx = x+w/2-4;
@@ -392,7 +395,7 @@ static void vicon_small_tri_right_draw(int x, int y, int w, int h, float alpha)
glShadeModel(GL_FLAT);
}
-static void vicon_disclosure_tri_down_draw(int x, int y, int w, int h, float alpha)
+static void vicon_disclosure_tri_down_draw(int x, int y, int w, int UNUSED(h), float alpha)
{
GLint pts[3][2];
int cx = x+w/2;
@@ -417,7 +420,7 @@ static void vicon_disclosure_tri_down_draw(int x, int y, int w, int h, float alp
viconutil_draw_lineloop_smooth(pts, 3);
}
-static void vicon_move_up_draw(int x, int y, int w, int h, float alpha)
+static void vicon_move_up_draw(int x, int y, int w, int h, float UNUSED(alpha))
{
int d=-2;
@@ -435,7 +438,7 @@ static void vicon_move_up_draw(int x, int y, int w, int h, float alpha)
glDisable(GL_LINE_SMOOTH);
}
-static void vicon_move_down_draw(int x, int y, int w, int h, float alpha)
+static void vicon_move_down_draw(int x, int y, int w, int h, float UNUSED(alpha))
{
int d=2;
@@ -453,7 +456,7 @@ static void vicon_move_down_draw(int x, int y, int w, int h, float alpha)
glDisable(GL_LINE_SMOOTH);
}
-static void init_brush_icons()
+static void init_brush_icons(void)
{
#define INIT_BRUSH_ICON(icon_id, name) \
@@ -498,14 +501,14 @@ static void init_brush_icons()
#undef INIT_BRUSH_ICON
}
-static void init_internal_icons()
+static void init_internal_icons(void)
{
bTheme *btheme= U.themes.first;
ImBuf *bbuf= NULL;
int x, y, icontype;
char iconfilestr[FILE_MAXDIR+FILE_MAXFILE];
- if ((btheme!=NULL) && (strlen(btheme->tui.iconfile) > 0)) {
+ if ((btheme!=NULL) && btheme->tui.iconfile[0]) {
char *datadir= BLI_get_folder(BLENDER_DATAFILES, NULL);
if (datadir) {
BLI_make_file_string("/", iconfilestr, datadir, btheme->tui.iconfile);
@@ -621,20 +624,30 @@ static void init_iconfile_list(struct ListBase *list)
char *filename = dir[i].relname;
if(BLI_testextensie(filename, ".png")) {
-
+
/* check to see if the image is the right size, continue if not */
/* copying strings here should go ok, assuming that we never get back
a complete path to file longer than 256 chars */
sprintf(iconfilestr, "%s/%s", icondirstr, filename);
- if(BLI_exists(iconfilestr)) bbuf = IMB_loadiffname(iconfilestr, IB_rect);
-
- ifilex = bbuf->x;
- ifiley = bbuf->y;
- IMB_freeImBuf(bbuf);
+ if(BLI_exists(iconfilestr))
+ bbuf= IMB_loadiffname(iconfilestr, IB_rect);
+ else
+ bbuf= NULL;
+
+
+ if(bbuf) {
+ ifilex = bbuf->x;
+ ifiley = bbuf->y;
+ IMB_freeImBuf(bbuf);
+ }
+ else {
+ ifilex= ifiley= 0;
+ }
+ /* bad size or failed to load */
if ((ifilex != ICON_IMAGE_W) || (ifiley != ICON_IMAGE_H))
continue;
-
+
/* found a potential icon file, so make an entry for it in the cache list */
ifile = MEM_callocN(sizeof(IconFile), "IconFile");
@@ -670,7 +683,7 @@ static void free_iconfile_list(struct ListBase *list)
}
}
-int UI_iconfile_get_index(char *filename)
+int UI_iconfile_get_index(const char *filename)
{
IconFile *ifile;
ListBase *list=&(iconfilelist);
@@ -719,7 +732,7 @@ void UI_icons_free_drawinfo(void *drawinfo)
}
}
-static DrawInfo *icon_create_drawinfo()
+static DrawInfo *icon_create_drawinfo(void)
{
DrawInfo *di = NULL;
@@ -736,7 +749,7 @@ int UI_icon_get_width(int icon_id)
icon = BKE_icon_get(icon_id);
- if (!icon) {
+ if (icon==ICON_NULL) {
if (G.f & G_DEBUG)
printf("UI_icon_get_width: Internal error, no icon for icon ID: %d\n", icon_id);
return 0;
@@ -761,7 +774,7 @@ int UI_icon_get_height(int icon_id)
icon = BKE_icon_get(icon_id);
- if (!icon) {
+ if (icon==ICON_NULL) {
if (G.f & G_DEBUG)
printf("UI_icon_get_height: Internal error, no icon for icon ID: %d\n", icon_id);
return 0;
@@ -832,8 +845,17 @@ static void icon_set_image(bContext *C, ID *id, PreviewImage* prv_img, int miple
prv_img->w[miplevel], prv_img->h[miplevel]);
}
-static void icon_draw_rect(float x, float y, int w, int h, float aspect, int rw, int rh, unsigned int *rect, float alpha, float *rgb)
+static void icon_draw_rect(float x, float y, int w, int h, float UNUSED(aspect), int rw, int rh, unsigned int *rect, float alpha, float *rgb, short is_preview)
{
+ ImBuf *ima= NULL;
+
+ /* sanity check */
+ if(w<=0 || h<=0 || w>2000 || h>2000) {
+ printf("icon_draw_rect: icons are %i x %i pixels?\n", w, h);
+ BLI_assert(!"invalid icon size");
+ return;
+ }
+
/* modulate color */
if(alpha != 1.0f)
glPixelTransferf(GL_ALPHA_SCALE, alpha);
@@ -844,38 +866,26 @@ static void icon_draw_rect(float x, float y, int w, int h, float aspect, int rw,
glPixelTransferf(GL_BLUE_SCALE, rgb[2]);
}
- /* position */
- glRasterPos2f(x, y);
- // XXX ui_rasterpos_safe(x, y, aspect);
-
- /* draw */
- if((w<1 || h<1)) {
- // XXX - TODO 2.5 verify whether this case can happen
- if (G.f & G_DEBUG)
- printf("what the heck! - icons are %i x %i pixels?\n", w, h);
- }
/* rect contains image in 'rendersize', we only scale if needed */
- else if(rw!=w && rh!=h) {
- if(w>2000 || h>2000) { /* something has gone wrong! */
- if (G.f & G_DEBUG)
- printf("insane icon size w=%d h=%d\n",w,h);
- }
- else {
- ImBuf *ima;
+ if(rw!=w && rh!=h) {
+ /* first allocate imbuf for scaling and copy preview into it */
+ ima = IMB_allocImBuf(rw, rh, 32, IB_rect);
+ memcpy(ima->rect, rect, rw*rh*sizeof(unsigned int));
+ IMB_scaleImBuf(ima, w, h); /* scale it */
+ rect= ima->rect;
+ }
- /* first allocate imbuf for scaling and copy preview into it */
- ima = IMB_allocImBuf(rw, rh, 32, IB_rect, 0);
- memcpy(ima->rect, rect, rw*rh*sizeof(unsigned int));
-
- /* scale it */
- IMB_scaleImBuf(ima, w, h);
- glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, ima->rect);
-
- IMB_freeImBuf(ima);
- }
+ /* draw */
+ if(is_preview) {
+ glaDrawPixelsSafe(x, y, w, h, w, GL_RGBA, GL_UNSIGNED_BYTE, rect);
}
- else
+ else {
+ glRasterPos2f(x, y);
glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, rect);
+ }
+
+ if(ima)
+ IMB_freeImBuf(ima);
/* restore color */
if(alpha != 0.0f)
@@ -888,7 +898,7 @@ static void icon_draw_rect(float x, float y, int w, int h, float aspect, int rw,
}
}
-static void icon_draw_texture(float x, float y, float w, float h, int ix, int iy, int iw, int ih, float alpha, float *rgb)
+static void icon_draw_texture(float x, float y, float w, float h, int ix, int iy, int UNUSED(iw), int ih, float alpha, float *rgb)
{
float x1, x2, y1, y2;
@@ -931,7 +941,7 @@ static int preview_size(int miplevel)
return 0;
}
-static void icon_draw_size(float x, float y, int icon_id, float aspect, float alpha, float *rgb, int miplevel, int draw_size, int nocreate)
+static void icon_draw_size(float x, float y, int icon_id, float aspect, float alpha, float *rgb, int miplevel, int draw_size, int UNUSED(nocreate), int is_preview)
{
Icon *icon = NULL;
DrawInfo *di = NULL;
@@ -940,7 +950,7 @@ static void icon_draw_size(float x, float y, int icon_id, float aspect, float al
icon = BKE_icon_get(icon_id);
- if (!icon) {
+ if (icon==ICON_NULL) {
if (G.f & G_DEBUG)
printf("icon_draw_mipmap: Internal error, no icon for icon ID: %d\n", icon_id);
return;
@@ -974,7 +984,7 @@ static void icon_draw_size(float x, float y, int icon_id, float aspect, float al
if(!iimg->rect) return; /* something has gone wrong! */
- icon_draw_rect(x, y, w, h, aspect, iimg->w, iimg->h, iimg->rect, alpha, rgb);
+ icon_draw_rect(x, y, w, h, aspect, iimg->w, iimg->h, iimg->rect, alpha, rgb, is_preview);
}
else if(di->type == ICON_TYPE_PREVIEW) {
PreviewImage* pi = BKE_previewimg_get((ID*)icon->obj);
@@ -985,68 +995,102 @@ static void icon_draw_size(float x, float y, int icon_id, float aspect, float al
/* preview images use premul alpha ... */
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
- icon_draw_rect(x, y, w, h, aspect, pi->w[miplevel], pi->h[miplevel], pi->rect[miplevel], 1.0f, NULL);
+ icon_draw_rect(x, y, w, h, aspect, pi->w[miplevel], pi->h[miplevel], pi->rect[miplevel], 1.0f, NULL, is_preview);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
}
}
-void ui_id_icon_render(bContext *C, ID *id, int preview)
+static void ui_id_icon_render(bContext *C, ID *id, int big)
{
PreviewImage *pi = BKE_previewimg_get(id);
-
+
if (pi) {
if ((pi->changed[0] ||!pi->rect[0])) /* changed only ever set by dynamic icons */
{
- /* create the preview rect if necessary */
+ /* create the rect if necessary */
icon_set_image(C, id, pi, 0); /* icon size */
- if (preview)
- icon_set_image(C, id, pi, 1); /* preview size */
+ if (big)
+ icon_set_image(C, id, pi, 1); /* bigger preview size */
pi->changed[0] = 0;
}
}
}
-static int ui_id_brush_get_icon(bContext *C, ID *id, int preview)
+static void ui_id_brush_render(bContext *C, ID *id)
+{
+ PreviewImage *pi = BKE_previewimg_get(id);
+ int i;
+
+ if(!pi)
+ return;
+
+ for(i = 0; i < PREVIEW_MIPMAPS; i++) {
+ /* check if rect needs to be created; changed
+ only set by dynamic icons */
+ if((pi->changed[i] || !pi->rect[i])) {
+ icon_set_image(C, id, pi, i);
+ pi->changed[i] = 0;
+ }
+ }
+}
+
+
+static int ui_id_brush_get_icon(bContext *C, ID *id)
{
Brush *br = (Brush*)id;
if(br->flag & BRUSH_CUSTOM_ICON) {
BKE_icon_getid(id);
- ui_id_icon_render(C, id, preview);
+ ui_id_brush_render(C, id);
}
- else if(!id->icon_id) {
- /* no icon found, reset it */
-
- /* this is not nice, should probably make
- brushes be strictly in one paint mode only
- to avoid this kind of thing */
+ else {
Object *ob = CTX_data_active_object(C);
- EnumPropertyItem *items;
- int tool;
-
- if(ob && (ob->mode & OB_MODE_SCULPT)) {
+ SpaceImage *sima;
+ EnumPropertyItem *items = NULL;
+ int tool, mode = 0;
+
+ /* XXX: this is not nice, should probably make brushes
+ be strictly in one paint mode only to avoid
+ checking various context stuff here */
+
+ if(CTX_wm_view3d(C) && ob) {
+ if(ob->mode & OB_MODE_SCULPT)
+ mode = OB_MODE_SCULPT;
+ else if(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT))
+ mode = OB_MODE_VERTEX_PAINT;
+ else if(ob->mode & OB_MODE_TEXTURE_PAINT)
+ mode = OB_MODE_TEXTURE_PAINT;
+ }
+ else if((sima = CTX_wm_space_image(C)) &&
+ (sima->flag & SI_DRAWTOOL)) {
+ mode = OB_MODE_TEXTURE_PAINT;
+ }
+
+ /* reset the icon */
+ if(mode == OB_MODE_SCULPT) {
items = brush_sculpt_tool_items;
tool = br->sculpt_tool;
}
- else if(ob && (ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT))) {
+ else if(mode == OB_MODE_VERTEX_PAINT) {
items = brush_vertexpaint_tool_items;
tool = br->vertexpaint_tool;
}
- else {
+ else if(mode == OB_MODE_TEXTURE_PAINT) {
items = brush_imagepaint_tool_items;
tool = br->imagepaint_tool;
}
- RNA_enum_icon_from_value(items, tool, &id->icon_id);
+ if(!items || !RNA_enum_icon_from_value(items, tool, &id->icon_id))
+ id->icon_id = 0;
}
return id->icon_id;
}
-int ui_id_icon_get(bContext *C, ID *id, int preview)
+int ui_id_icon_get(bContext *C, ID *id, int big)
{
int iconid= 0;
@@ -1054,7 +1098,7 @@ int ui_id_icon_get(bContext *C, ID *id, int preview)
switch(GS(id->name))
{
case ID_BR:
- iconid= ui_id_brush_get_icon(C, id, preview);
+ iconid= ui_id_brush_get_icon(C, id);
break;
case ID_MA: /* fall through */
case ID_TE: /* fall through */
@@ -1063,7 +1107,7 @@ int ui_id_icon_get(bContext *C, ID *id, int preview)
case ID_LA: /* fall through */
iconid= BKE_icon_getid(id);
/* checks if not exists, or changed */
- ui_id_icon_render(C, id, preview);
+ ui_id_icon_render(C, id, big);
break;
default:
break;
@@ -1075,7 +1119,7 @@ int ui_id_icon_get(bContext *C, ID *id, int preview)
static void icon_draw_mipmap(float x, float y, int icon_id, float aspect, float alpha, int miplevel, int nocreate)
{
int draw_size = preview_size(miplevel);
- icon_draw_size(x, y, icon_id, aspect, alpha, NULL, miplevel, draw_size, nocreate);
+ icon_draw_size(x, y, icon_id, aspect, alpha, NULL, miplevel, draw_size, nocreate, FALSE);
}
void UI_icon_draw_aspect(float x, float y, int icon_id, float aspect, float alpha)
@@ -1086,7 +1130,7 @@ void UI_icon_draw_aspect(float x, float y, int icon_id, float aspect, float alph
void UI_icon_draw_aspect_color(float x, float y, int icon_id, float aspect, float *rgb)
{
int draw_size = preview_size(PREVIEW_MIPMAP_ZERO);
- icon_draw_size(x, y, icon_id, aspect, 1.0f, rgb, PREVIEW_MIPMAP_ZERO, draw_size, 0);
+ icon_draw_size(x, y, icon_id, aspect, 1.0f, rgb, PREVIEW_MIPMAP_ZERO, draw_size, FALSE, FALSE);
}
void UI_icon_draw(float x, float y, int icon_id)
@@ -1096,7 +1140,7 @@ void UI_icon_draw(float x, float y, int icon_id)
void UI_icon_draw_size(float x, float y, int size, int icon_id, float alpha)
{
- icon_draw_size(x, y, icon_id, 1.0f, alpha, NULL, 0, size, 1);
+ icon_draw_size(x, y, icon_id, 1.0f, alpha, NULL, PREVIEW_MIPMAP_ZERO, size, TRUE, FALSE);
}
void UI_icon_draw_preview(float x, float y, int icon_id)
@@ -1111,6 +1155,6 @@ void UI_icon_draw_preview_aspect(float x, float y, int icon_id, float aspect)
void UI_icon_draw_preview_aspect_size(float x, float y, int icon_id, float aspect, int size)
{
- icon_draw_size(x, y, icon_id, aspect, 1.0f, NULL, PREVIEW_MIPMAP_LARGE, size, 0);
+ icon_draw_size(x, y, icon_id, aspect, 1.0f, NULL, PREVIEW_MIPMAP_LARGE, size, FALSE, TRUE);
}
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 3873c5c9092..154a263cd7b 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -96,7 +96,6 @@ typedef enum {
#define UI_MAX_DRAW_STR 400
#define UI_MAX_NAME_STR 128
-#define UI_ARRAY 29
/* panel limits */
#define UI_PANEL_MINX 100
@@ -104,7 +103,7 @@ typedef enum {
/* uiBut->flag */
#define UI_SELECT 1 /* use when the button is pressed */
-#define UI_MOUSE_OVER 2
+/*#define UI_MOUSE_OVER 2*/ /*UNUSED, free flag*/
#define UI_ACTIVE 4
#define UI_HAS_ICON 8
#define UI_TEXTINPUT 16
@@ -120,7 +119,7 @@ typedef enum {
#define PNL_CLOSEDX 2
#define PNL_CLOSEDY 4
#define PNL_CLOSED 6
-#define PNL_TABBED 8
+/*#define PNL_TABBED 8*/ /*UNUSED*/
#define PNL_OVERLAP 16
/* Button text selection:
@@ -171,8 +170,9 @@ struct uiBut {
char *poin;
float hardmin, hardmax, softmin, softmax;
- float a1, a2, hsv[3]; // hsv is temp memory for hsv buttons
+ float a1, a2;
float aspect;
+ char col[4];
uiButHandleFunc func;
void *func_arg1;
@@ -203,13 +203,15 @@ struct uiBut {
uiLink *link;
short linkto[2];
- char *tip, *lockstr;
+ const char *tip, *lockstr;
BIFIconID icon;
- short but_align; /* aligning buttons, horiz/vertical */
- short lock;
+ char lock;
+ char dt;
+ char changed; /* could be made into a single flag */
+ unsigned char unit_type; /* so buttons can support unit systems which are not RNA */
short modifier_key;
- short iconadd, dt;
+ short iconadd;
/* IDPOIN data */
uiIDPoinFuncFP idpoin_func;
@@ -234,9 +236,10 @@ struct uiBut {
struct IDProperty *opproperties;
struct PointerRNA *opptr;
short opcontext;
-
+ unsigned char menu_key; /* 'a'-'z', always lower case */
+
/* Draggable data, type is WM_DRAG_... */
- short dragtype;
+ char dragtype;
void *dragpoin;
struct ImBuf *imb;
float imb_scale;
@@ -296,32 +299,33 @@ struct uiBlock {
void *drawextra_arg1;
void *drawextra_arg2;
- int afterval, flag;
-
- short direction, dt;
- short auto_open, in_use;
+ int flag;
+ char direction, dt;
+ short auto_open;
double auto_open_last;
- int lock;
- char *lockstr;
+ const char *lockstr;
+
+ char lock;
+ char active; // to keep blocks while drawing and free them afterwards
+ char tooltipdisabled; // to avoid tooltip after click
+ char endblock; // uiEndBlock done?
float xofs, yofs; // offset to parent button
int dobounds, mx, my; // for doing delayed
int bounds, minbounds; // for doing delayed
- int endblock; // uiEndBlock done?
rctf safety; // pulldowns, to detect outside, can differ per case how it is created
ListBase saferct; // uiSafetyRct list
uiPopupBlockHandle *handle; // handle
- int tooltipdisabled; // to avoid tooltip after click
- int active; // to keep blocks while drawing and free them afterwards
int puphash; // popup menu hash for memory
- int color_profile; // color profile for correcting linear colors for display
-
void *evil_C; // XXX hack for dynamic operator enums
+
+ float _hsv[3]; // XXX, only access via ui_block_hsv_get()
+ char color_profile; // color profile for correcting linear colors for display
};
typedef struct uiSafetyRct {
@@ -408,6 +412,8 @@ void ui_tooltip_free(struct bContext *C, struct ARegion *ar);
uiBut *ui_popup_menu_memory(uiBlock *block, uiBut *but);
+float *ui_block_hsv_get(uiBlock *block);
+
/* searchbox for string button */
ARegion *ui_searchbox_create(struct bContext *C, struct ARegion *butregion, uiBut *but);
int ui_searchbox_inside(struct ARegion *ar, int x, int y);
@@ -416,6 +422,7 @@ void ui_searchbox_autocomplete(struct bContext *C, struct ARegion *ar, uiBut *bu
void ui_searchbox_event(struct bContext *C, struct ARegion *ar, uiBut *but, struct wmEvent *event);
void ui_searchbox_apply(uiBut *but, struct ARegion *ar);
void ui_searchbox_free(struct bContext *C, struct ARegion *ar);
+void ui_but_search_test(uiBut *but);
typedef uiBlock* (*uiBlockHandleCreateFunc)(struct bContext *C, struct uiPopupBlockHandle *handle, void *arg1);
@@ -430,18 +437,15 @@ void ui_set_name_menu(uiBut *but, int value);
int ui_step_name_menu(uiBut *but, int step);
struct AutoComplete;
-struct AutoComplete *autocomplete_begin(char *startname, int maxlen);
-void autocomplete_do_name(struct AutoComplete *autocpl, const char *name);
-void autocomplete_end(struct AutoComplete *autocpl, char *autoname);
/* interface_panel.c */
extern int ui_handler_panel_region(struct bContext *C, struct wmEvent *event);
-extern void ui_draw_aligned_panel(struct ARegion *ar, struct uiStyle *style, uiBlock *block, rcti *rect);
+extern void ui_draw_aligned_panel(struct uiStyle *style, uiBlock *block, rcti *rect);
/* interface_draw.c */
extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select);
-void ui_draw_gradient(rcti *rect, float *rgb, int type, float alpha);
+void ui_draw_gradient(rcti *rect, float *hsv, int type, float alpha);
void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rcti *rect);
void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rcti *rect);
@@ -468,14 +472,13 @@ extern void ui_draw_but(const struct bContext *C, ARegion *ar, struct uiStyle *s
struct ThemeUI;
void ui_widget_color_init(struct ThemeUI *tui);
-void ui_draw_menu_item(struct uiFontStyle *fstyle, rcti *rect, char *name, int iconid, int state);
-void ui_draw_preview_item(struct uiFontStyle *fstyle, rcti *rect, char *name, int iconid, int state);
+void ui_draw_menu_item(struct uiFontStyle *fstyle, rcti *rect, const char *name, int iconid, int state);
+void ui_draw_preview_item(struct uiFontStyle *fstyle, rcti *rect, const char *name, int iconid, int state);
/* interface_style.c */
void uiStyleInit(void);
/* interface_icons.c */
-void ui_id_icon_render(struct bContext *C, struct ID *id, int preview);
int ui_id_icon_get(struct bContext *C, struct ID *id, int preview);
/* resources.c */
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index e268120fa07..18bee084f40 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -26,14 +26,17 @@
#include <math.h>
#include <stdlib.h>
#include <string.h>
+#include <assert.h>
#include "MEM_guardedalloc.h"
#include "DNA_screen_types.h"
+#include "DNA_armature_types.h"
#include "DNA_userdef_types.h"
#include "BLI_listbase.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -152,7 +155,7 @@ typedef struct uiLayoutItemRoot {
/************************** Item ***************************/
-static char *ui_item_name_add_colon(char *name, char namestr[UI_MAX_NAME_STR])
+static const char *ui_item_name_add_colon(const char *name, char namestr[UI_MAX_NAME_STR])
{
int len= strlen(name);
@@ -205,7 +208,7 @@ static int ui_layout_vary_direction(uiLayout *layout)
}
/* estimated size of text + icon */
-static int ui_text_icon_width(uiLayout *layout, char *name, int icon, int compact)
+static int ui_text_icon_width(uiLayout *layout, const char *name, int icon, int compact)
{
int variable = ui_layout_vary_direction(layout) == UI_ITEM_VARY_X;
@@ -326,7 +329,7 @@ static void ui_layer_but_cb(bContext *C, void *arg_but, void *arg_index)
}
/* create buttons for an item with an RNA array */
-static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int len, int x, int y, int w, int h, int expand, int slider, int toggle, int icon_only)
+static void ui_item_array(uiLayout *layout, uiBlock *block, const char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int len, int x, int y, int w, int h, int expand, int slider, int toggle, int icon_only)
{
uiStyle *style= layout->root->style;
uiBut *but;
@@ -343,7 +346,7 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon
uiBlockSetCurLayout(block, sub);
/* create label */
- if(strcmp(name, "") != 0)
+ if(name[0])
uiDefBut(block, LABEL, 0, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
/* create buttons */
@@ -352,23 +355,35 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon
int butw, buth, unit;
int cols= (len >= 20)? 2: 1;
int colbuts= len/(2*cols);
+ int layer_used= 0;
uiBlockSetCurLayout(block, uiLayoutAbsolute(layout, 0));
unit= UI_UNIT_X*0.75;
butw= unit;
buth= unit;
+
+ if(ptr->type == &RNA_Armature) {
+ bArmature *arm= (bArmature *)ptr->data;
+ layer_used= arm->layer_used;
+ }
for(b=0; b<cols; b++) {
uiBlockBeginAlign(block);
for(a=0; a<colbuts; a++) {
- but= uiDefAutoButR(block, ptr, prop, a+b*colbuts, "", ICON_BLANK1, x + butw*a, y+buth, butw, buth);
+ if(layer_used & (1<<(a+b*colbuts))) icon= ICON_LAYER_USED;
+ else icon= ICON_BLANK1;
+
+ but= uiDefAutoButR(block, ptr, prop, a+b*colbuts, "", icon, x + butw*a, y+buth, butw, buth);
if(subtype == PROP_LAYER_MEMBER)
uiButSetFunc(but, ui_layer_but_cb, but, SET_INT_IN_POINTER(a+b*colbuts));
}
for(a=0; a<colbuts; a++) {
- but= uiDefAutoButR(block, ptr, prop, a+len/2+b*colbuts, "", ICON_BLANK1, x + butw*a, y, butw, buth);
+ if(layer_used & (1<<(a+len/2+b*colbuts))) icon= ICON_LAYER_USED;
+ else icon= ICON_BLANK1;
+
+ but= uiDefAutoButR(block, ptr, prop, a+len/2+b*colbuts, "", icon, x + butw*a, y, butw, buth);
if(subtype == PROP_LAYER_MEMBER)
uiButSetFunc(but, ui_layer_but_cb, but, SET_INT_IN_POINTER(a+len/2+b*colbuts));
}
@@ -393,14 +408,14 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon
col= a % dim_size[0];
row= a / dim_size[0];
- but= uiDefAutoButR(block, ptr, prop, a, "", 0, x + w*col, y+(dim_size[1]*UI_UNIT_Y)-(row*UI_UNIT_Y), w, UI_UNIT_Y);
+ but= uiDefAutoButR(block, ptr, prop, a, "", ICON_NULL, x + w*col, y+(dim_size[1]*UI_UNIT_Y)-(row*UI_UNIT_Y), w, UI_UNIT_Y);
if(slider && but->type==NUM)
but->type= NUMSLI;
}
}
else {
if(ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA) && !expand)
- uiDefAutoButR(block, ptr, prop, -1, "", 0, 0, 0, w, UI_UNIT_Y);
+ uiDefAutoButR(block, ptr, prop, -1, "", ICON_NULL, 0, 0, w, UI_UNIT_Y);
if(!ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA) || expand) {
/* layout for known array subtypes */
@@ -434,12 +449,12 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon
uiBlockSetCurLayout(block, layout);
}
-static void ui_item_enum_expand(uiLayout *layout, uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, char *uiname, int x, int y, int w, int h, int icon_only)
+static void ui_item_enum_expand(uiLayout *layout, uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, const char *uiname, int h, int icon_only)
{
uiBut *but;
EnumPropertyItem *item;
const char *identifier;
- char *name;
+ const char *name;
int a, totitem, itemw, icon, value, free;
identifier= RNA_property_identifier(prop);
@@ -450,12 +465,12 @@ static void ui_item_enum_expand(uiLayout *layout, uiBlock *block, PointerRNA *pt
if(!item[a].identifier[0])
continue;
- name= (!uiname || uiname[0])? (char*)item[a].name: "";
+ name= (!uiname || uiname[0])? item[a].name: "";
icon= item[a].icon;
value= item[a].value;
itemw= ui_text_icon_width(block->curlayout, name, icon, 0);
- if(icon && strcmp(name, "") != 0 && !icon_only)
+ if(icon && name[0] && !icon_only)
but= uiDefIconTextButR(block, ROW, 0, icon, name, 0, 0, itemw, h, ptr, identifier, -1, 0, value, -1, -1, NULL);
else if(icon)
but= uiDefIconButR(block, ROW, 0, icon, 0, 0, itemw, h, ptr, identifier, -1, 0, value, -1, -1, NULL);
@@ -472,7 +487,7 @@ static void ui_item_enum_expand(uiLayout *layout, uiBlock *block, PointerRNA *pt
}
/* callback for keymap item change button */
-static void ui_keymap_but_cb(bContext *C, void *but_v, void *key_v)
+static void ui_keymap_but_cb(bContext *UNUSED(C), void *but_v, void *UNUSED(key_v))
{
uiBut *but= but_v;
@@ -483,7 +498,7 @@ static void ui_keymap_but_cb(bContext *C, void *but_v, void *key_v)
}
/* create label + button for RNA property */
-static uiBut *ui_item_with_label(uiLayout *layout, uiBlock *block, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int x, int y, int w, int h, int flag)
+static uiBut *ui_item_with_label(uiLayout *layout, uiBlock *block, const char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int x, int y, int w, int h, int flag)
{
uiLayout *sub;
uiBut *but=NULL;
@@ -494,7 +509,7 @@ static uiBut *ui_item_with_label(uiLayout *layout, uiBlock *block, char *name, i
sub= uiLayoutRow(layout, 0);
uiBlockSetCurLayout(block, sub);
- if(strcmp(name, "") != 0) {
+ if(name[0]) {
/* XXX UI_GetStringWidth is not accurate
labelw= UI_GetStringWidth(name);
CLAMP(labelw, w/4, 3*w/4);*/
@@ -569,7 +584,7 @@ void uiFileBrowseContextProperty(const bContext *C, PointerRNA *ptr, PropertyRNA
/********************* Button Items *************************/
/* disabled item */
-static void ui_item_disabled(uiLayout *layout, char *name)
+static void ui_item_disabled(uiLayout *layout, const char *name)
{
uiBlock *block= layout->root->block;
uiBut *but;
@@ -582,14 +597,14 @@ static void ui_item_disabled(uiLayout *layout, char *name)
w= ui_text_icon_width(layout, name, 0, 0);
- but= uiDefBut(block, LABEL, 0, (char*)name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
+ but= uiDefBut(block, LABEL, 0, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
but->flag |= UI_BUT_DISABLED;
but->lock = 1;
but->lockstr = "";
}
/* operator items */
-PointerRNA uiItemFullO(uiLayout *layout, char *idname, char *name, int icon, IDProperty *properties, int context, int flag)
+PointerRNA uiItemFullO(uiLayout *layout, const char *idname, const char *name, int icon, IDProperty *properties, int context, int flag)
{
uiBlock *block= layout->root->block;
wmOperatorType *ot= WM_operatortype_find(idname, 0);
@@ -614,13 +629,15 @@ PointerRNA uiItemFullO(uiLayout *layout, char *idname, char *name, int icon, IDP
if (flag & UI_ITEM_R_NO_BG)
uiBlockSetEmboss(block, UI_EMBOSSN);
- if(icon && strcmp(name, "") != 0)
- but= uiDefIconTextButO(block, BUT, ot->idname, context, icon, (char*)name, 0, 0, w, UI_UNIT_Y, NULL);
+ if(icon && name[0])
+ but= uiDefIconTextButO(block, BUT, ot->idname, context, icon, name, 0, 0, w, UI_UNIT_Y, NULL);
else if(icon)
but= uiDefIconButO(block, BUT, ot->idname, context, icon, 0, 0, w, UI_UNIT_Y, NULL);
else
- but= uiDefButO(block, BUT, ot->idname, context, (char*)name, 0, 0, w, UI_UNIT_Y, NULL);
-
+ but= uiDefButO(block, BUT, ot->idname, context, name, 0, 0, w, UI_UNIT_Y, NULL);
+
+ assert(but->optype != NULL);
+
/* text alignment for toolbar buttons */
if((layout->root->type == UI_LAYOUT_TOOLBAR) && !icon)
but->flag |= UI_TEXT_LEFT;
@@ -646,7 +663,7 @@ PointerRNA uiItemFullO(uiLayout *layout, char *idname, char *name, int icon, IDP
return PointerRNA_NULL;
}
-static char *ui_menu_enumpropname(uiLayout *layout, char *opname, char *propname, int retval)
+static const char *ui_menu_enumpropname(uiLayout *layout, const char *opname, const char *propname, int retval)
{
wmOperatorType *ot= WM_operatortype_find(opname, 0);
PointerRNA ptr;
@@ -666,7 +683,7 @@ static char *ui_menu_enumpropname(uiLayout *layout, char *opname, char *propname
RNA_property_enum_items(layout->root->block->evil_C, &ptr, prop, &item, &totitem, &free);
if(RNA_enum_name(item, retval, &name)) {
if(free) MEM_freeN(item);
- return (char*)name;
+ return name;
}
if(free)
@@ -676,7 +693,7 @@ static char *ui_menu_enumpropname(uiLayout *layout, char *opname, char *propname
return "";
}
-void uiItemEnumO(uiLayout *layout, char *opname, char *name, int icon, char *propname, int value)
+void uiItemEnumO(uiLayout *layout, const char *opname, const char *name, int icon, const char *propname, int value)
{
PointerRNA ptr;
@@ -689,7 +706,7 @@ void uiItemEnumO(uiLayout *layout, char *opname, char *name, int icon, char *pro
uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0);
}
-void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, IDProperty *properties, int context, int flag)
+void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname, IDProperty *properties, int context, int flag)
{
wmOperatorType *ot= WM_operatortype_find(opname, 0);
PointerRNA ptr;
@@ -716,20 +733,20 @@ void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, IDProperty
for(i=0; i<totitem; i++) {
if(item[i].identifier[0]) {
if(properties) {
- PointerRNA ptr;
+ PointerRNA tptr;
- WM_operator_properties_create(&ptr, opname);
- if(ptr.data) {
- IDP_FreeProperty(ptr.data);
- MEM_freeN(ptr.data);
+ WM_operator_properties_create(&tptr, opname);
+ if(tptr.data) {
+ IDP_FreeProperty(tptr.data);
+ MEM_freeN(tptr.data);
}
- ptr.data= IDP_CopyProperty(properties);
- RNA_enum_set(&ptr, propname, item[i].value);
+ tptr.data= IDP_CopyProperty(properties);
+ RNA_enum_set(&tptr, propname, item[i].value);
- uiItemFullO(column, opname, (char*)item[i].name, item[i].icon, ptr.data, context, flag);
+ uiItemFullO(column, opname, item[i].name, item[i].icon, tptr.data, context, flag);
}
else
- uiItemEnumO(column, opname, (char*)item[i].name, item[i].icon, propname, item[i].value);
+ uiItemEnumO(column, opname, item[i].name, item[i].icon, propname, item[i].value);
}
else {
if(item[i].name) {
@@ -739,11 +756,11 @@ void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, IDProperty
block->flag |= UI_BLOCK_NO_FLIP;
}
- uiItemL(column, (char*)item[i].name, 0);
+ uiItemL(column, item[i].name, ICON_NULL);
bt= block->buttons.last;
bt->flag= UI_TEXT_LEFT;
}
- else
+ else /* XXX bug here, collums draw bottom item badly */
uiItemS(column);
}
}
@@ -753,13 +770,13 @@ void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, IDProperty
}
}
-void uiItemsEnumO(uiLayout *layout, char *opname, char *propname)
+void uiItemsEnumO(uiLayout *layout, const char *opname, const char *propname)
{
uiItemsFullEnumO(layout, opname, propname, NULL, layout->root->opcontext, 0);
}
/* for use in cases where we have */
-void uiItemEnumO_string(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value_str)
+void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value_str)
{
PointerRNA ptr;
@@ -796,7 +813,7 @@ void uiItemEnumO_string(uiLayout *layout, char *name, int icon, char *opname, ch
uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0);
}
-void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value)
+void uiItemBooleanO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value)
{
PointerRNA ptr;
@@ -806,7 +823,7 @@ void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char *
uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0);
}
-void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value)
+void uiItemIntO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value)
{
PointerRNA ptr;
@@ -816,7 +833,7 @@ void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *prop
uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0);
}
-void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *propname, float value)
+void uiItemFloatO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, float value)
{
PointerRNA ptr;
@@ -826,7 +843,7 @@ void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *pr
uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0);
}
-void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value)
+void uiItemStringO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value)
{
PointerRNA ptr;
@@ -836,14 +853,14 @@ void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *p
uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0);
}
-void uiItemO(uiLayout *layout, char *name, int icon, char *opname)
+void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname)
{
uiItemFullO(layout, opname, name, icon, NULL, layout->root->opcontext, 0);
}
/* RNA property items */
-static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int icon_only, int *r_w, int *r_h)
+static void ui_item_rna_size(uiLayout *layout, const char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int icon_only, int *r_w, int *r_h)
{
PropertyType type;
PropertySubType subtype;
@@ -864,7 +881,7 @@ static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PointerRNA
/* increase height for arrays */
if(index == RNA_NO_INDEX && len > 0) {
- if(!name[0] && icon == 0)
+ if(!name[0] && icon == ICON_NULL)
h= 0;
if(ELEM(subtype, PROP_LAYER, PROP_LAYER_MEMBER))
@@ -875,7 +892,7 @@ static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PointerRNA
h += len*UI_UNIT_Y;
}
else if(ui_layout_vary_direction(layout) == UI_ITEM_VARY_X) {
- if(type == PROP_BOOLEAN && strcmp(name, "") != 0)
+ if(type == PROP_BOOLEAN && name[0])
w += UI_UNIT_X/5;
else if(type == PROP_ENUM)
w += UI_UNIT_X/4;
@@ -887,7 +904,7 @@ static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PointerRNA
*r_h= h;
}
-void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index, int value, int flag, char *name, int icon)
+void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index, int value, int flag, const char *name, int icon)
{
uiBlock *block= layout->root->block;
uiBut *but;
@@ -903,8 +920,8 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index
/* set name and icon */
if(!name)
- name= (char*)RNA_property_ui_name(prop);
- if(!icon)
+ name= RNA_property_ui_name(prop);
+ if(icon == ICON_NULL)
icon= RNA_property_ui_icon(prop);
if(ELEM4(type, PROP_INT, PROP_FLOAT, PROP_STRING, PROP_POINTER))
@@ -945,9 +962,9 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index
ui_item_array(layout, block, name, icon, ptr, prop, len, 0, 0, w, h, expand, slider, toggle, icon_only);
/* enum item */
else if(type == PROP_ENUM && index == RNA_ENUM_VALUE) {
- char *identifier= (char*)RNA_property_identifier(prop);
+ const char *identifier= RNA_property_identifier(prop);
- if(icon && strcmp(name, "") != 0 && !icon_only)
+ if(icon && name[0] && !icon_only)
uiDefIconTextButR(block, ROW, 0, icon, name, 0, 0, w, h, ptr, identifier, -1, 0, value, -1, -1, NULL);
else if(icon)
uiDefIconButR(block, ROW, 0, icon, 0, 0, w, h, ptr, identifier, -1, 0, value, -1, -1, NULL);
@@ -956,28 +973,34 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index
}
/* expanded enum */
else if(type == PROP_ENUM && (expand || RNA_property_flag(prop) & PROP_ENUM_FLAG))
- ui_item_enum_expand(layout, block, ptr, prop, name, 0, 0, w, h, icon_only);
+ ui_item_enum_expand(layout, block, ptr, prop, name, h, icon_only);
/* property with separate label */
else if(type == PROP_ENUM || type == PROP_STRING || type == PROP_POINTER) {
but= ui_item_with_label(layout, block, name, icon, ptr, prop, index, 0, 0, w, h, flag);
ui_but_add_search(but, ptr, prop, NULL, NULL);
+
+ if(layout->redalert)
+ uiButSetFlag(but, UI_BUT_REDALERT);
}
/* single button */
else {
- but= uiDefAutoButR(block, ptr, prop, index, (char*)name, icon, 0, 0, w, h);
+ but= uiDefAutoButR(block, ptr, prop, index, name, icon, 0, 0, w, h);
if(slider && but->type==NUM)
but->type= NUMSLI;
if(toggle && but->type==OPTION)
but->type= TOG;
+
+ if(layout->redalert)
+ uiButSetFlag(but, UI_BUT_REDALERT);
}
if (no_bg)
uiBlockSetEmboss(block, UI_EMBOSS);
}
-void uiItemR(uiLayout *layout, PointerRNA *ptr, char *propname, int flag, char *name, int icon)
+void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
@@ -990,7 +1013,7 @@ void uiItemR(uiLayout *layout, PointerRNA *ptr, char *propname, int flag, char *
uiItemFullR(layout, ptr, prop, RNA_NO_INDEX, 0, flag, name, icon);
}
-void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int value)
+void uiItemEnumR(uiLayout *layout, const char *name, int icon, struct PointerRNA *ptr, const char *propname, int value)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
@@ -1003,7 +1026,7 @@ void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr,
uiItemFullR(layout, ptr, prop, RNA_ENUM_VALUE, value, 0, name, icon);
}
-void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *value, char *name, int icon)
+void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *value, const char *name, int icon)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
EnumPropertyItem *item;
@@ -1026,7 +1049,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, char *propname
for(a=0; item[a].identifier; a++) {
if(item[a].value == ivalue) {
- uiItemFullR(layout, ptr, prop, RNA_ENUM_VALUE, ivalue, 0, (char*)item[a].name, item[a].icon);
+ uiItemFullR(layout, ptr, prop, RNA_ENUM_VALUE, ivalue, 0, name ? name : item[a].name, icon ? icon : item[a].icon);
break;
}
}
@@ -1035,7 +1058,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, char *propname
MEM_freeN(item);
}
-void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname)
+void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname)
{
PropertyRNA *prop;
uiBlock *block= layout->root->block;
@@ -1058,7 +1081,7 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname)
for(i=0; i<totitem; i++) {
if(item[i].identifier[0]) {
- uiItemEnumR(column, (char*)item[i].name, 0, ptr, propname, item[i].value);
+ uiItemEnumR(column, item[i].name, ICON_NULL, ptr, propname, item[i].value);
}
else {
if(item[i].name) {
@@ -1068,7 +1091,7 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname)
block->flag |= UI_BLOCK_NO_FLIP;
}
- uiItemL(column, (char*)item[i].name, 0);
+ uiItemL(column, item[i].name, ICON_NULL);
bt= block->buttons.last;
bt->flag= UI_TEXT_LEFT;
}
@@ -1102,13 +1125,14 @@ int sort_search_items_list(void *a, void *b)
return 0;
}
-static void rna_search_cb(const struct bContext *C, void *arg_but, char *str, uiSearchItems *items)
+static void rna_search_cb(const struct bContext *C, void *arg_but, const char *str, uiSearchItems *items)
{
uiBut *but= arg_but;
char *name;
int i=0, iconid=0, flag= RNA_property_flag(but->rnaprop);
ListBase *items_list= MEM_callocN(sizeof(ListBase), "items_list");
CollItemSearch *cis;
+ const int skip_filter= !but->changed;
/* build a temporary list of relevant items first */
RNA_PROP_BEGIN(&but->rnasearchpoin, itemptr, but->rnasearchprop) {
@@ -1140,7 +1164,7 @@ static void rna_search_cb(const struct bContext *C, void *arg_but, char *str, ui
}
if(name) {
- if(BLI_strcasestr(name, str)) {
+ if(skip_filter || BLI_strcasestr(name, str)) {
cis = MEM_callocN(sizeof(CollItemSearch), "CollectionItemSearch");
cis->name = MEM_dupallocN(name);
cis->index = i;
@@ -1213,13 +1237,13 @@ void ui_but_add_search(uiBut *but, PointerRNA *ptr, PropertyRNA *prop, PointerRN
but->hardmax= MAX2(but->hardmax, 256);
but->rnasearchpoin= *searchptr;
but->rnasearchprop= searchprop;
- but->flag |= UI_ICON_LEFT|UI_TEXT_LEFT|UI_BUT_UNDO;
+ but->flag |= UI_ICON_LEFT|UI_TEXT_LEFT;
uiButSetSearchFunc(but, rna_search_cb, but, NULL, NULL);
}
}
-void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, struct PointerRNA *searchptr, char *searchpropname, char *name, int icon)
+void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
{
PropertyRNA *prop, *searchprop;
PropertyType type;
@@ -1244,13 +1268,18 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, st
searchprop= RNA_struct_find_property(searchptr, searchpropname);
- if(!searchprop || RNA_property_type(searchprop) != PROP_COLLECTION) {
+
+ if(!searchprop) {
printf("uiItemPointerR: search collection property not found: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname);
return;
}
+ else if (RNA_property_type(searchprop) != PROP_COLLECTION) {
+ printf("uiItemPointerR: search collection property is not a collection type: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname);
+ return;
+ }
/* get icon & name */
- if(!icon) {
+ if(icon==ICON_NULL) {
if(type == PROP_POINTER)
icontype= RNA_property_pointer_type(ptr, prop);
else
@@ -1259,7 +1288,7 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, st
icon= RNA_struct_ui_icon(icontype);
}
if(!name)
- name= (char*)RNA_property_ui_name(prop);
+ name= RNA_property_ui_name(prop);
/* create button */
block= uiLayoutGetBlock(layout);
@@ -1281,7 +1310,7 @@ static void ui_item_menutype_func(bContext *C, uiLayout *layout, void *arg_mt)
mt->draw(C, &menu);
}
-static void ui_item_menu(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func, void *arg, void *argN)
+static void ui_item_menu(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg, void *argN)
{
uiBlock *block= layout->root->block;
uiBut *but;
@@ -1304,11 +1333,11 @@ static void ui_item_menu(uiLayout *layout, char *name, int icon, uiMenuCreateFun
w -= 10;
if(name[0] && icon)
- but= uiDefIconTextMenuBut(block, func, arg, icon, (char*)name, 0, 0, w, h, "");
+ but= uiDefIconTextMenuBut(block, func, arg, icon, name, 0, 0, w, h, "");
else if(icon)
but= uiDefIconMenuBut(block, func, arg, icon, 0, 0, w, h, "");
else
- but= uiDefMenuBut(block, func, arg, (char*)name, 0, 0, w, h, "");
+ but= uiDefMenuBut(block, func, arg, name, 0, 0, w, h, "");
if(argN) { /* ugly .. */
but->poin= (char*)but;
@@ -1323,7 +1352,7 @@ static void ui_item_menu(uiLayout *layout, char *name, int icon, uiMenuCreateFun
}
}
-void uiItemM(uiLayout *layout, bContext *C, char *menuname, char *name, int icon)
+void uiItemM(uiLayout *layout, bContext *UNUSED(C), const char *menuname, const char *name, int icon)
{
MenuType *mt;
@@ -1343,7 +1372,7 @@ void uiItemM(uiLayout *layout, bContext *C, char *menuname, char *name, int icon
}
/* label item */
-static uiBut *uiItemL_(uiLayout *layout, char *name, int icon)
+static uiBut *uiItemL_(uiLayout *layout, const char *name, int icon)
{
uiBlock *block= layout->root->block;
uiBut *but;
@@ -1358,22 +1387,22 @@ static uiBut *uiItemL_(uiLayout *layout, char *name, int icon)
w= ui_text_icon_width(layout, name, icon, 0);
- if(icon && strcmp(name, "") != 0)
- but= uiDefIconTextBut(block, LABEL, 0, icon, (char*)name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
+ if(icon && name[0])
+ but= uiDefIconTextBut(block, LABEL, 0, icon, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
else if(icon)
but= uiDefIconBut(block, LABEL, 0, icon, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
else
- but= uiDefBut(block, LABEL, 0, (char*)name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
+ but= uiDefBut(block, LABEL, 0, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
return but;
}
-void uiItemL(uiLayout *layout, char *name, int icon)
+void uiItemL(uiLayout *layout, const char *name, int icon)
{
uiItemL_(layout, name, icon);
}
-void uiItemLDrag(uiLayout *layout, PointerRNA *ptr, char *name, int icon)
+void uiItemLDrag(uiLayout *layout, PointerRNA *ptr, const char *name, int icon)
{
uiBut *but= uiItemL_(layout, name, icon);
@@ -1384,7 +1413,7 @@ void uiItemLDrag(uiLayout *layout, PointerRNA *ptr, char *name, int icon)
/* value item */
-void uiItemV(uiLayout *layout, char *name, int icon, int argval)
+void uiItemV(uiLayout *layout, const char *name, int icon, int argval)
{
/* label */
uiBlock *block= layout->root->block;
@@ -1400,12 +1429,12 @@ void uiItemV(uiLayout *layout, char *name, int icon, int argval)
w= ui_text_icon_width(layout, name, icon, 0);
- if(icon && strcmp(name, "") != 0)
- uiDefIconTextButF(block, BUTM, 0, icon, (char*)name, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, "");
+ if(icon && name[0])
+ uiDefIconTextButF(block, BUTM, 0, icon, name, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, "");
else if(icon)
uiDefIconButF(block, BUTM, 0, icon, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, "");
else
- uiDefButF(block, BUTM, 0, (char*)name, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, "");
+ uiDefButF(block, BUTM, 0, name, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, "");
}
/* separator item */
@@ -1418,7 +1447,7 @@ void uiItemS(uiLayout *layout)
}
/* level items */
-void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func, void *arg)
+void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg)
{
if(!func)
return;
@@ -1428,12 +1457,12 @@ void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func,
typedef struct MenuItemLevel {
int opcontext;
- char *opname;
- char *propname;
+ const char *opname;
+ const char *propname;
PointerRNA rnapoin;
} MenuItemLevel;
-static void menu_item_enum_opname_menu(bContext *C, uiLayout *layout, void *arg)
+static void menu_item_enum_opname_menu(bContext *UNUSED(C), uiLayout *layout, void *arg)
{
MenuItemLevel *lvl= (MenuItemLevel*)(((uiBut*)arg)->func_argN);
@@ -1441,7 +1470,7 @@ static void menu_item_enum_opname_menu(bContext *C, uiLayout *layout, void *arg)
uiItemsEnumO(layout, lvl->opname, lvl->propname);
}
-void uiItemMenuEnumO(uiLayout *layout, char *opname, char *propname, char *name, int icon)
+void uiItemMenuEnumO(uiLayout *layout, const char *opname, const char *propname, const char *name, int icon)
{
wmOperatorType *ot= WM_operatortype_find(opname, 0);
MenuItemLevel *lvl;
@@ -1464,7 +1493,7 @@ void uiItemMenuEnumO(uiLayout *layout, char *opname, char *propname, char *name,
ui_item_menu(layout, name, icon, menu_item_enum_opname_menu, NULL, lvl);
}
-static void menu_item_enum_rna_menu(bContext *C, uiLayout *layout, void *arg)
+static void menu_item_enum_rna_menu(bContext *UNUSED(C), uiLayout *layout, void *arg)
{
MenuItemLevel *lvl= (MenuItemLevel*)(((uiBut*)arg)->func_argN);
@@ -1472,7 +1501,7 @@ static void menu_item_enum_rna_menu(bContext *C, uiLayout *layout, void *arg)
uiItemsEnumR(layout, &lvl->rnapoin, lvl->propname);
}
-void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *name, int icon)
+void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *name, int icon)
{
MenuItemLevel *lvl;
PropertyRNA *prop;
@@ -1484,7 +1513,7 @@ void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname, c
}
if(!name)
- name= (char*)RNA_property_ui_name(prop);
+ name= RNA_property_ui_name(prop);
if(layout->root->type == UI_LAYOUT_MENU && !icon)
icon= ICON_BLANK1;
@@ -1673,7 +1702,7 @@ static void ui_litem_layout_column(uiLayout *litem)
}
/* root layout */
-static void ui_litem_estimate_root(uiLayout *litem)
+static void ui_litem_estimate_root(uiLayout *UNUSED(litem))
{
/* nothing to do */
}
@@ -2168,6 +2197,7 @@ uiLayout *uiLayoutSplit(uiLayout *layout, float percentage, int align)
split->litem.enabled= 1;
split->litem.context= layout->context;
split->litem.space= layout->root->style->columnspace;
+ split->litem.w= layout->w;
split->percentage= percentage;
BLI_addtail(&layout->items, split);
@@ -2546,12 +2576,12 @@ void uiBlockLayoutResolve(uiBlock *block, int *x, int *y)
/* XXX silly trick, interface_templates.c doesn't get linked
* because it's not used by other files in this module? */
{
- void ui_template_fix_linking();
+ void ui_template_fix_linking(void);
ui_template_fix_linking();
}
}
-void uiLayoutSetContextPointer(uiLayout *layout, char *name, PointerRNA *ptr)
+void uiLayoutSetContextPointer(uiLayout *layout, const char *name, PointerRNA *ptr)
{
uiBlock *block= layout->root->block;
layout->context= CTX_store_add(&block->contexts, name, ptr);
@@ -2629,7 +2659,7 @@ static void ui_intro_uiLayout(DynStr *ds, uiLayout *layout)
}
static char *str = NULL; // XXX, constant re-freeing, far from ideal.
-char *uiLayoutIntrospect(uiLayout *layout)
+const char *uiLayoutIntrospect(uiLayout *layout)
{
DynStr *ds= BLI_dynstr_new();
@@ -2643,3 +2673,72 @@ char *uiLayoutIntrospect(uiLayout *layout)
return str;
}
+
+/* this function does not initialize the layout, functions can be called on the layout before and after */
+void uiLayoutOperatorButs(const bContext *C, uiLayout *layout, wmOperator *op,int (*check_prop)(struct PropertyRNA *), const char label_align, const short flag)
+{
+ if(!op->properties) {
+ IDPropertyTemplate val = {0};
+ op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties");
+ }
+
+ if(flag & UI_LAYOUT_OP_SHOW_TITLE) {
+ uiItemL(layout, op->type->name, ICON_NULL);
+ }
+
+ /* poll() on this operator may still fail, at the moment there is no nice feedback when this happens
+ * just fails silently */
+ if(!WM_operator_repeat_check(C, op)) {
+ uiBlockSetButLock(uiLayoutGetBlock(layout), TRUE, "Operator cannot redo");
+ uiItemL(layout, "* Redo Unsupported *", ICON_NULL); // XXX, could give some nicer feedback or not show redo panel at all?
+ }
+
+ if(op->type->ui) {
+ op->layout= layout;
+ op->type->ui((bContext*)C, op);
+ op->layout= NULL;
+
+ /* UI_LAYOUT_OP_SHOW_EMPTY ignored */
+ }
+ else {
+ wmWindowManager *wm= CTX_wm_manager(C);
+ PointerRNA ptr;
+ int empty;
+
+ RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
+
+ /* menu */
+ if(op->type->flag & OPTYPE_PRESET) {
+ /* XXX, no simple way to get WM_MT_operator_presets.bl_label from python! Label remains the same always! */
+ PointerRNA op_ptr;
+ uiLayout *row;
+
+ row= uiLayoutRow(layout, TRUE);
+ uiItemM(row, (bContext *)C, "WM_MT_operator_presets", NULL, ICON_NULL);
+
+ WM_operator_properties_create(&op_ptr, "WM_OT_operator_preset_add");
+ RNA_string_set(&op_ptr, "operator", op->type->idname);
+ op_ptr= uiItemFullO(row, "WM_OT_operator_preset_add", "", ICON_ZOOMIN, op_ptr.data, WM_OP_INVOKE_DEFAULT, 0);
+
+ WM_operator_properties_create(&op_ptr, "WM_OT_operator_preset_add");
+ RNA_string_set(&op_ptr, "operator", op->type->idname);
+ RNA_boolean_set(&op_ptr, "remove_active", 1);
+ op_ptr= uiItemFullO(row, "WM_OT_operator_preset_add", "", ICON_ZOOMOUT, op_ptr.data, WM_OP_INVOKE_DEFAULT, 0);
+ }
+
+ /* main draw call */
+ empty= uiDefAutoButsRNA(layout, &ptr, check_prop, label_align) == 0;
+
+ if(empty && (flag & UI_LAYOUT_OP_SHOW_EMPTY)) {
+ uiItemL(layout, "No Properties.", ICON_NULL);
+ }
+ }
+
+ /* no undo for buttons for operator redo panels */
+ {
+ uiBut *but;
+
+ for(but= uiLayoutGetBlock(layout)->buttons.first; but; but= but->next)
+ uiButClearFlag(but, UI_BUT_UNDO);
+ }
+}
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
index bcde54f473a..95c52d20c37 100644
--- a/source/blender/editors/interface/interface_ops.c
+++ b/source/blender/editors/interface/interface_ops.c
@@ -29,16 +29,20 @@
#include <math.h>
#include <string.h>
-
#include "MEM_guardedalloc.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "DNA_text_types.h" /* for UI_OT_reports_to_text */
#include "BLI_blenlib.h"
#include "BLI_math_color.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_text.h" /* for UI_OT_reports_to_text */
+#include "BKE_report.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -134,7 +138,7 @@ static int eyedropper_modal(bContext *C, wmOperator *op, wmEvent *event)
}
/* Modal Operator init */
-static int eyedropper_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int eyedropper_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
/* init */
if (eyedropper_init(C, op)) {
@@ -195,7 +199,7 @@ void UI_OT_eyedropper(wmOperatorType *ot)
/* Reset Default Theme ------------------------ */
-static int reset_default_theme_exec(bContext *C, wmOperator *op)
+static int reset_default_theme_exec(bContext *C, wmOperator *UNUSED(op))
{
ui_theme_init_default();
WM_event_add_notifier(C, NC_WINDOW, NULL);
@@ -219,7 +223,7 @@ void UI_OT_reset_default_theme(wmOperatorType *ot)
/* Copy Data Path Operator ------------------------ */
-static int copy_data_path_button_exec(bContext *C, wmOperator *op)
+static int copy_data_path_button_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr;
PropertyRNA *prop;
@@ -402,7 +406,51 @@ void UI_OT_copy_to_selected_button(wmOperatorType *ot)
/* properties */
RNA_def_boolean(ot->srna, "all", 1, "All", "Reset to default values all elements of the array.");
}
-
+
+/* Reports to Textblock Operator ------------------------ */
+
+/* FIXME: this is just a temporary operator so that we can see all the reports somewhere
+ * when there are too many to display...
+ */
+
+static int reports_to_text_poll(bContext *C)
+{
+ return CTX_wm_reports(C) != NULL;
+}
+
+static int reports_to_text_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ ReportList *reports = CTX_wm_reports(C);
+ Text *txt;
+ char *str;
+
+ /* create new text-block to write to */
+ txt = add_empty_text("Recent Reports");
+
+ /* convert entire list to a display string, and add this to the text-block
+ * - if commandline debug option enabled, show debug reports too
+ * - otherwise, up to info (which is what users normally see)
+ */
+ str = BKE_reports_string(reports, (G.f & G_DEBUG)? RPT_DEBUG : RPT_INFO);
+
+ write_text(txt, str);
+ MEM_freeN(str);
+
+ return OPERATOR_FINISHED;
+}
+
+void UI_OT_reports_to_textblock(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Reports to Text Block";
+ ot->idname= "UI_OT_reports_to_textblock";
+ ot->description= "Write the reports ";
+
+ /* callbacks */
+ ot->poll= reports_to_text_poll;
+ ot->exec= reports_to_text_exec;
+}
+
/* ********************************************************* */
/* Registration */
@@ -413,5 +461,6 @@ void UI_buttons_operatortypes(void)
WM_operatortype_append(UI_OT_copy_data_path_button);
WM_operatortype_append(UI_OT_reset_default_button);
WM_operatortype_append(UI_OT_copy_to_selected_button);
+ WM_operatortype_append(UI_OT_reports_to_textblock); // XXX: temp?
}
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index 9d22f3c5212..db4af4c11e5 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -25,7 +25,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/* a full doc with API notes can be found in bf-blender/blender/doc/interface_API.txt */
+/* a full doc with API notes can be found in bf-blender/trunk/blender/doc/guides/interface_API.txt */
#include <math.h>
#include <stdlib.h>
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_userdef_types.h"
@@ -316,19 +317,20 @@ void uiPanelPush(uiBlock *block)
glTranslatef((float)block->panel->ofsx, (float)block->panel->ofsy, 0.0);
}
-void uiPanelPop(uiBlock *block)
+void uiPanelPop(uiBlock *UNUSED(block))
{
glPopMatrix();
}
/* triangle 'icon' for panel header */
+/* NOTE - this seems to be only used for hiding nodes now */
void ui_draw_tria_icon(float x, float y, char dir)
{
if(dir=='h') {
- ui_draw_anti_tria(x-1, y, x-1, y+11.0, x+9, y+6.25);
+ ui_draw_anti_tria( x-3,y-5, x-3,y+5, x+7,y );
}
else {
- ui_draw_anti_tria(x-3, y+10, x+8-1, y+10, x+4.25-2, y);
+ ui_draw_anti_tria( x-5,y+3, x+5,y+3, x,y-7);
}
}
@@ -425,7 +427,7 @@ static void ui_draw_panel_dragwidget(rctf *rect)
}
-static void ui_draw_aligned_panel_header(ARegion *ar, uiStyle *style, uiBlock *block, rcti *rect, char dir)
+static void ui_draw_aligned_panel_header(uiStyle *style, uiBlock *block, rcti *rect, char dir)
{
Panel *panel= block->panel;
rcti hrect;
@@ -468,7 +470,7 @@ static void rectf_scale(rctf *rect, float scale)
}
/* panel integrated in buttonswindow, tool/property lists etc */
-void ui_draw_aligned_panel(ARegion *ar, uiStyle *style, uiBlock *block, rcti *rect)
+void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, rcti *rect)
{
Panel *panel= block->panel;
rcti headrect;
@@ -499,7 +501,7 @@ void ui_draw_aligned_panel(ARegion *ar, uiStyle *style, uiBlock *block, rcti *re
/* horizontal title */
if(!(panel->flag & PNL_CLOSEDX)) {
- ui_draw_aligned_panel_header(ar, style, block, &headrect, 'h');
+ ui_draw_aligned_panel_header(style, block, &headrect, 'h');
/* itemrect smaller */
itemrect.xmax= headrect.xmax - 5.0f/block->aspect;
@@ -518,7 +520,7 @@ void ui_draw_aligned_panel(ARegion *ar, uiStyle *style, uiBlock *block, rcti *re
}
else if(panel->flag & PNL_CLOSEDX) {
/* draw vertical title */
- ui_draw_aligned_panel_header(ar, style, block, &headrect, 'v');
+ ui_draw_aligned_panel_header(style, block, &headrect, 'v');
}
/* an open panel */
else {
@@ -772,7 +774,7 @@ static void ui_do_animate(const bContext *C, Panel *panel)
}
}
-void uiBeginPanels(const bContext *C, ARegion *ar)
+void uiBeginPanels(const bContext *UNUSED(C), ARegion *ar)
{
Panel *pa;
@@ -798,7 +800,7 @@ void uiEndPanels(const bContext *C, ARegion *ar)
if(block->active && block->panel)
ui_offset_panel_block(block);
- /* consistancy; are panels not made, whilst they have tabs */
+ /* consistency; are panels not made, whilst they have tabs */
for(panot= ar->panels.first; panot; panot= panot->next) {
if((panot->runtime_flag & PNL_ACTIVE)==0) { // not made
@@ -953,10 +955,11 @@ static void ui_handle_panel_header(const bContext *C, uiBlock *block, int mx, in
if(my >= block->maxy) button= 1;
}
else if(block->panel->control & UI_PNL_CLOSE) {
- if(mx <= block->minx+10+PNL_ICON-2) button= 2;
- else if(mx <= block->minx+10+2*PNL_ICON+2) button= 1;
+ /* whole of header can be used to collapse panel (except top-right corner) */
+ if(mx <= block->maxx-8-PNL_ICON) button= 2;
+ //else if(mx <= block->minx+10+2*PNL_ICON+2) button= 1;
}
- else if(mx <= block->minx+10+PNL_ICON+2) {
+ else if(mx <= block->maxx-PNL_ICON-12) {
button= 1;
}
@@ -994,10 +997,7 @@ static void ui_handle_panel_header(const bContext *C, uiBlock *block, int mx, in
else
ED_region_tag_redraw(ar);
}
- else if(block->panel->flag & PNL_CLOSED) {
- panel_activate_state(C, block->panel, PANEL_STATE_DRAG);
- }
- else {
+ else if(mx <= (block->maxx-PNL_ICON-12)+PNL_ICON+2) {
panel_activate_state(C, block->panel, PANEL_STATE_DRAG);
}
}
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 50b85360196..e8a383dbe15 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -27,6 +27,7 @@
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
+#include <assert.h>
#include "MEM_guardedalloc.h"
@@ -34,6 +35,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_dynstr.h"
#include "BLI_ghash.h"
@@ -70,7 +72,7 @@
/*********************** Menu Data Parsing ********************* */
typedef struct MenuEntry {
- char *str;
+ const char *str;
int retval;
int icon;
int sepr;
@@ -78,7 +80,7 @@ typedef struct MenuEntry {
typedef struct MenuData {
char *instr;
- char *title;
+ const char *title;
int titleicon;
MenuEntry *items;
@@ -98,7 +100,7 @@ static MenuData *menudata_new(char *instr)
return md;
}
-static void menudata_set_title(MenuData *md, char *title, int titleicon)
+static void menudata_set_title(MenuData *md, const char *title, int titleicon)
{
if (!md->title)
md->title= title;
@@ -106,7 +108,7 @@ static void menudata_set_title(MenuData *md, char *title, int titleicon)
md->titleicon= titleicon;
}
-static void menudata_add_item(MenuData *md, char *str, int retval, int icon, int sepr)
+static void menudata_add_item(MenuData *md, const char *str, int retval, int icon, int sepr)
{
if (md->nitems==md->itemssize) {
int nsize= md->itemssize?(md->itemssize<<1):1;
@@ -153,7 +155,8 @@ MenuData *decompose_menu_string(char *str)
{
char *instr= BLI_strdup(str);
MenuData *md= menudata_new(instr);
- char *nitem= NULL, *s= instr;
+ const char *nitem= NULL;
+ char *s= instr;
int nicon=0, nretval= 1, nitem_is_title= 0, nitem_is_sepr= 0;
while (1) {
@@ -300,12 +303,12 @@ typedef struct uiTooltipData {
rcti bbox;
uiFontStyle fstyle;
char lines[MAX_TOOLTIP_LINES][512];
- int linedark[MAX_TOOLTIP_LINES];
+ unsigned int color[MAX_TOOLTIP_LINES];
int totline;
int toth, spaceh, lineh;
} uiTooltipData;
-static void ui_tooltip_region_draw(const bContext *C, ARegion *ar)
+static void ui_tooltip_region_draw_cb(const bContext *UNUSED(C), ARegion *ar)
{
uiTooltipData *data= ar->regiondata;
rcti bbox= data->bbox;
@@ -320,16 +323,14 @@ static void ui_tooltip_region_draw(const bContext *C, ARegion *ar)
bbox.ymin= bbox.ymax - data->lineh;
for(a=0; a<data->totline; a++) {
- if(!data->linedark[a]) glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- else glColor4f(0.5f, 0.5f, 0.5f, 1.0f);
-
+ cpack(data->color[a]);
uiStyleFontDraw(&data->fstyle, &bbox, data->lines[a]);
bbox.ymin -= data->lineh + data->spaceh;
bbox.ymax -= data->lineh + data->spaceh;
}
}
-static void ui_tooltip_region_free(ARegion *ar)
+static void ui_tooltip_region_free_cb(ARegion *ar)
{
uiTooltipData *data;
@@ -358,6 +359,7 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
if(but->tip && strlen(but->tip)) {
BLI_strncpy(data->lines[data->totline], but->tip, sizeof(data->lines[0]));
+ data->color[data->totline]= 0xFFFFFF;
data->totline++;
}
@@ -367,7 +369,7 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) {
BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Shortcut: %s", buf);
- data->linedark[data->totline]= 1;
+ data->color[data->totline]= 0x888888;
data->totline++;
}
}
@@ -377,18 +379,18 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
ui_get_but_string(but, buf, sizeof(buf));
if(buf[0]) {
BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Value: %s", buf);
- data->linedark[data->totline]= 1;
+ data->color[data->totline]= 0x888888;
data->totline++;
}
}
if(but->rnaprop) {
- int unit_type = RNA_SUBTYPE_UNIT(RNA_property_subtype(but->rnaprop));
+ int unit_type= uiButGetUnitType(but);
if (unit_type == PROP_UNIT_ROTATION) {
if (RNA_property_type(but->rnaprop) == PROP_FLOAT) {
BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Radians: %f", RNA_property_float_get_index(&but->rnapoin, but->rnaprop, but->rnaindex));
- data->linedark[data->totline]= 1;
+ data->color[data->totline]= 0x888888;
data->totline++;
}
}
@@ -397,21 +399,23 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
if(ui_but_anim_expression_get(but, buf, sizeof(buf))) {
/* expression */
BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Expression: %s", buf);
- data->linedark[data->totline]= 1;
+ data->color[data->totline]= 0x888888;
data->totline++;
}
}
/* rna info */
- BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Python: %s.%s", RNA_struct_identifier(but->rnapoin.type), RNA_property_identifier(but->rnaprop));
- data->linedark[data->totline]= 1;
- data->totline++;
+ if ((U.flag & USER_TOOLTIPS_PYTHON) == 0) {
+ BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Python: %s.%s", RNA_struct_identifier(but->rnapoin.type), RNA_property_identifier(but->rnaprop));
+ data->color[data->totline]= 0x888888;
+ data->totline++;
+ }
if(but->rnapoin.id.data) {
ID *id= but->rnapoin.id.data;
if(id->lib && id->lib->name) {
BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Library: %s", id->lib->name);
- data->linedark[data->totline]= 1;
+ data->color[data->totline]= 0x888888;
data->totline++;
}
}
@@ -424,13 +428,30 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
str= WM_operator_pystring(C, but->optype, opptr, 0);
/* operator info */
- BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Python: %s", str);
- data->linedark[data->totline]= 1;
- data->totline++;
+ if ((U.flag & USER_TOOLTIPS_PYTHON) == 0) {
+ BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Python: %s", str);
+ data->color[data->totline]= 0x888888;
+ data->totline++;
+ }
MEM_freeN(str);
+
+ /* second check if we are disabled - why */
+ if(but->flag & UI_BUT_DISABLED) {
+ const char *poll_msg;
+ CTX_wm_operator_poll_msg_set(C, NULL);
+ WM_operator_poll_context(C, but->optype, but->opcontext);
+ poll_msg= CTX_wm_operator_poll_msg_get(C);
+ if(poll_msg) {
+ BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Disabled: %s", poll_msg);
+ data->color[data->totline]= 0x6666ff; /* alert */
+ data->totline++;
+ }
+ }
}
+ assert(data->totline < MAX_TOOLTIP_LINES);
+
if(data->totline == 0) {
MEM_freeN(data);
return NULL;
@@ -440,8 +461,8 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
ar= ui_add_temporary_region(CTX_wm_screen(C));
memset(&type, 0, sizeof(ARegionType));
- type.draw= ui_tooltip_region_draw;
- type.free= ui_tooltip_region_free;
+ type.draw= ui_tooltip_region_draw_cb;
+ type.free= ui_tooltip_region_free_cb;
ar->type= &type;
/* set font, get bb */
@@ -592,9 +613,12 @@ int uiSearchItemAdd(uiSearchItems *items, const char *name, void *poin, int icon
return 1;
}
- BLI_strncpy(items->names[items->totitem], name, items->maxstrlen);
- items->pointers[items->totitem]= poin;
- items->icons[items->totitem]= iconid;
+ if(items->names)
+ BLI_strncpy(items->names[items->totitem], name, items->maxstrlen);
+ if(items->pointers)
+ items->pointers[items->totitem]= poin;
+ if(items->icons)
+ items->icons[items->totitem]= iconid;
items->totitem++;
@@ -817,7 +841,7 @@ void ui_searchbox_autocomplete(bContext *C, ARegion *ar, uiBut *but, char *str)
}
}
-static void ui_searchbox_region_draw(const bContext *C, ARegion *ar)
+static void ui_searchbox_region_draw_cb(const bContext *UNUSED(C), ARegion *ar)
{
uiSearchboxData *data= ar->regiondata;
@@ -825,7 +849,7 @@ static void ui_searchbox_region_draw(const bContext *C, ARegion *ar)
wmOrtho2(-0.01f, ar->winx-0.01f, -0.01f, ar->winy-0.01f);
if(!data->noback)
- ui_draw_search_back(U.uistyles.first, NULL, &data->bbox);
+ ui_draw_search_back(NULL, NULL, &data->bbox); /* style not used yet */
/* draw text */
if(data->items.totitem) {
@@ -884,7 +908,7 @@ static void ui_searchbox_region_draw(const bContext *C, ARegion *ar)
}
}
-static void ui_searchbox_region_free(ARegion *ar)
+static void ui_searchbox_region_free_cb(ARegion *ar)
{
uiSearchboxData *data= ar->regiondata;
int a;
@@ -916,8 +940,8 @@ ARegion *ui_searchbox_create(bContext *C, ARegion *butregion, uiBut *but)
ar= ui_add_temporary_region(CTX_wm_screen(C));
memset(&type, 0, sizeof(ARegionType));
- type.draw= ui_searchbox_region_draw;
- type.free= ui_searchbox_region_free;
+ type.draw= ui_searchbox_region_draw_cb;
+ type.free= ui_searchbox_region_free_cb;
ar->type= &type;
/* create searchbox data */
@@ -1008,7 +1032,7 @@ ARegion *ui_searchbox_create(bContext *C, ARegion *butregion, uiBut *but)
x2= winx;
}
}
- if(y1 < 0) {
+ if(y1 < 0) { /* XXX butregion NULL check?, there is one above */
int newy1;
UI_view2d_to_region_no_clip(&butregion->v2d, 0, but->y2 + ofsy, 0, &newy1);
newy1 += butregion->winrct.ymin;
@@ -1058,6 +1082,39 @@ void ui_searchbox_free(bContext *C, ARegion *ar)
ui_remove_temporary_region(C, CTX_wm_screen(C), ar);
}
+/* sets red alert if button holds a string it can't find */
+/* XXX weak: search_func adds all partial matches... */
+void ui_but_search_test(uiBut *but)
+{
+ uiSearchItems *items= MEM_callocN(sizeof(uiSearchItems), "search items");
+ int x1;
+
+ /* setup search struct */
+ items->maxitem= 10;
+ items->maxstrlen= 256;
+ items->names= MEM_callocN(items->maxitem*sizeof(void *), "search names");
+ for(x1=0; x1<items->maxitem; x1++)
+ items->names[x1]= MEM_callocN(but->hardmax+1, "search names");
+
+ but->search_func(but->block->evil_C, but->search_arg, but->drawstr, items);
+
+ /* only redalert when we are sure of it, this can miss cases when >10 matches */
+ if(items->totitem==0)
+ uiButSetFlag(but, UI_BUT_REDALERT);
+ else if(items->more==0) {
+ for(x1= 0; x1<items->totitem; x1++)
+ if(strcmp(but->drawstr, items->names[x1])==0)
+ break;
+ if(x1==items->totitem)
+ uiButSetFlag(but, UI_BUT_REDALERT);
+ }
+
+ for(x1=0; x1<items->maxitem; x1++)
+ MEM_freeN(items->names[x1]);
+ MEM_freeN(items->names);
+ MEM_freeN(items);
+}
+
/************************* Creating Menu Blocks **********************/
@@ -1116,6 +1173,7 @@ static void ui_block_position(wmWindow *window, ARegion *butregion, uiBut *but,
if(but) {
int left=0, right=0, top=0, down=0;
int winx, winy;
+ int offscreen;
wm_window_get_size(window, &winx, &winy);
@@ -1206,6 +1264,12 @@ static void ui_block_position(wmWindow *window, ARegion *butregion, uiBut *but,
// apply requested offset in the block
xof += block->xofs/block->aspect;
yof += block->yofs/block->aspect;
+
+ /* clamp to window bounds, could be made into an option if its ever annoying */
+ if( (offscreen= (block->miny+yof)) < 0) yof -= offscreen; /* bottom */
+ else if((offscreen= (block->maxy+yof)-winy) > 0) yof -= offscreen; /* top */
+ if( (offscreen= (block->minx+xof)) < 0) xof -= offscreen; /* left */
+ else if((offscreen= (block->maxx+xof)-winx) > 0) xof -= offscreen; /* right */
}
/* apply */
@@ -1396,7 +1460,7 @@ void ui_popup_block_free(bContext *C, uiPopupBlockHandle *handle)
/***************************** Menu Button ***************************/
-static void ui_block_func_MENUSTR(bContext *C, uiLayout *layout, void *arg_str)
+static void ui_block_func_MENUSTR(bContext *UNUSED(C), uiLayout *layout, void *arg_str)
{
uiBlock *block= uiLayoutGetBlock(layout);
uiPopupBlockHandle *handle= block->handle;
@@ -1431,7 +1495,7 @@ static void ui_block_func_MENUSTR(bContext *C, uiLayout *layout, void *arg_str)
uiItemL(layout, md->title, md->titleicon);
}
else {
- uiItemL(layout, md->title, 0);
+ uiItemL(layout, md->title, ICON_NULL);
bt= block->buttons.last;
bt->flag= UI_TEXT_LEFT;
}
@@ -1478,7 +1542,7 @@ static void ui_block_func_MENUSTR(bContext *C, uiLayout *layout, void *arg_str)
menudata_free(md);
}
-void ui_block_func_ICONROW(bContext *C, uiLayout *layout, void *arg_but)
+void ui_block_func_ICONROW(bContext *UNUSED(C), uiLayout *layout, void *arg_but)
{
uiBlock *block= uiLayoutGetBlock(layout);
uiPopupBlockHandle *handle= block->handle;
@@ -1492,7 +1556,7 @@ void ui_block_func_ICONROW(bContext *C, uiLayout *layout, void *arg_but)
&handle->retvalue, (float)a, 0.0, 0, 0, "");
}
-void ui_block_func_ICONTEXTROW(bContext *C, uiLayout *layout, void *arg_but)
+void ui_block_func_ICONTEXTROW(bContext *UNUSED(C), uiLayout *layout, void *arg_but)
{
uiBlock *block= uiLayoutGetBlock(layout);
uiPopupBlockHandle *handle= block->handle;
@@ -1549,27 +1613,22 @@ static void ui_warp_pointer(short x, short y)
void ui_set_but_hsv(uiBut *but)
{
float col[3];
+ float *hsv= ui_block_hsv_get(but->block);
- hsv_to_rgb(but->hsv[0], but->hsv[1], but->hsv[2], col, col+1, col+2);
+ hsv_to_rgb(hsv[0], hsv[1], hsv[2], col, col+1, col+2);
ui_set_but_vectorf(but, col);
}
/* also used by small picker, be careful with name checks below... */
-void ui_update_block_buts_rgb(uiBlock *block, float *rgb, float *rhsv)
+void ui_update_block_buts_rgb(uiBlock *block, float *rgb)
{
uiBut *bt;
- float hsv[3];
+ float *hsv= ui_block_hsv_get(block);
/* this is to keep the H and S value when V is equal to zero
* and we are working in HSV mode, of course!
*/
- if (rhsv) {
- hsv[0]= rhsv[0];
- hsv[1]= rhsv[1];
- hsv[2]= rhsv[2];
- }
- else
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+ rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
// this updates button strings, is hackish... but button pointers are on stack of caller function
for(bt= block->buttons.first; bt; bt= bt->next) {
@@ -1625,7 +1684,7 @@ void ui_update_block_buts_rgb(uiBlock *block, float *rgb, float *rhsv)
}
}
-static void do_picker_rna_cb(bContext *C, void *bt1, void *unused)
+static void do_picker_rna_cb(bContext *UNUSED(C), void *bt1, void *UNUSED(arg))
{
uiBut *but= (uiBut *)bt1;
uiPopupBlockHandle *popup= but->block->handle;
@@ -1635,29 +1694,29 @@ static void do_picker_rna_cb(bContext *C, void *bt1, void *unused)
if (prop) {
RNA_property_float_get_array(&ptr, prop, rgb);
- ui_update_block_buts_rgb(but->block, rgb, NULL);
+ ui_update_block_buts_rgb(but->block, rgb);
}
if(popup)
popup->menuretval= UI_RETURN_UPDATE;
}
-static void do_hsv_rna_cb(bContext *C, void *bt1, void *hsv_arg)
+static void do_hsv_rna_cb(bContext *UNUSED(C), void *bt1, void *UNUSED(arg))
{
uiBut *but= (uiBut *)bt1;
uiPopupBlockHandle *popup= but->block->handle;
- float *hsv = (float *)hsv_arg;
float rgb[3];
+ float *hsv= ui_block_hsv_get(but->block);
hsv_to_rgb(hsv[0], hsv[1], hsv[2], rgb, rgb+1, rgb+2);
- ui_update_block_buts_rgb(but->block, rgb, hsv);
+ ui_update_block_buts_rgb(but->block, rgb);
if(popup)
popup->menuretval= UI_RETURN_UPDATE;
}
-static void do_hex_rna_cb(bContext *C, void *bt1, void *hexcl)
+static void do_hex_rna_cb(bContext *UNUSED(C), void *bt1, void *hexcl)
{
uiBut *but= (uiBut *)bt1;
uiPopupBlockHandle *popup= but->block->handle;
@@ -1672,13 +1731,13 @@ static void do_hex_rna_cb(bContext *C, void *bt1, void *hexcl)
srgb_to_linearrgb_v3_v3(rgb, rgb);
}
- ui_update_block_buts_rgb(but->block, rgb, NULL);
+ ui_update_block_buts_rgb(but->block, rgb);
if(popup)
popup->menuretval= UI_RETURN_UPDATE;
}
-static void close_popup_cb(bContext *C, void *bt1, void *arg)
+static void close_popup_cb(bContext *UNUSED(C), void *bt1, void *UNUSED(arg))
{
uiBut *but= (uiBut *)bt1;
uiPopupBlockHandle *popup= but->block->handle;
@@ -1718,7 +1777,7 @@ static void picker_new_hide_reveal(uiBlock *block, short colormode)
}
}
-static void do_picker_new_mode_cb(bContext *C, void *bt1, void *colv)
+static void do_picker_new_mode_cb(bContext *UNUSED(C), void *bt1, void *UNUSED(arg))
{
uiBut *bt= bt1;
short colormode= ui_get_but_val(bt);
@@ -1772,16 +1831,18 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR
uiBut *bt;
int width, butwidth;
static char tip[50];
- static float hsv[3];
static char hexcol[128];
float rgb_gamma[3];
float min, max, step, precision;
const char *propname = RNA_property_identifier(prop);
+ float *hsv= ui_block_hsv_get(block);
+
+ ui_block_hsv_get(block);
width= PICKER_TOTAL_W;
butwidth = width - UI_UNIT_X - 10;
- /* existence of profile means storage is in linear colour space, with display correction */
+ /* existence of profile means storage is in linear color space, with display correction */
if (block->color_profile == BLI_PR_NONE) {
sprintf(tip, "Value in Display Color Space");
copy_v3_v3(rgb_gamma, rgb);
@@ -1796,7 +1857,6 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR
RNA_property_float_ui_range(ptr, prop, &min, &max, &step, &precision);
RNA_property_float_get_array(ptr, prop, rgb);
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
switch (U.color_picker_type) {
case USER_CP_CIRCLE:
@@ -1816,11 +1876,11 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR
/* mode */
uiBlockBeginAlign(block);
bt= uiDefButS(block, ROW, 0, "RGB", 0, -30, width/3, UI_UNIT_Y, &colormode, 0.0, 0.0, 0, 0, "");
- uiButSetFunc(bt, do_picker_new_mode_cb, bt, rgb);
+ uiButSetFunc(bt, do_picker_new_mode_cb, bt, NULL);
bt= uiDefButS(block, ROW, 0, "HSV", width/3, -30, width/3, UI_UNIT_Y, &colormode, 0.0, 1.0, 0, 0, "");
- uiButSetFunc(bt, do_picker_new_mode_cb, bt, hsv);
+ uiButSetFunc(bt, do_picker_new_mode_cb, bt, NULL);
bt= uiDefButS(block, ROW, 0, "Hex", 2*width/3, -30, width/3, UI_UNIT_Y, &colormode, 0.0, 2.0, 0, 0, "");
- uiButSetFunc(bt, do_picker_new_mode_cb, bt, hexcol);
+ uiButSetFunc(bt, do_picker_new_mode_cb, bt, NULL);
uiBlockEndAlign(block);
bt= uiDefIconButO(block, BUT, "UI_OT_eyedropper", WM_OP_INVOKE_DEFAULT, ICON_EYEDROPPER, butwidth+10, -60, UI_UNIT_X, UI_UNIT_Y, NULL);
@@ -1835,7 +1895,7 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR
bt= uiDefButR(block, NUMSLI, 0, "B ", 0, -100, butwidth, UI_UNIT_Y, ptr, propname, 2, 0.0, 0.0, 0, 3, "Blue");
uiButSetFunc(bt, do_picker_rna_cb, bt, NULL);
- // could use uiItemFullR(col, ptr, prop, -1, 0, UI_ITEM_R_EXPAND|UI_ITEM_R_SLIDER, "", 0);
+ // could use uiItemFullR(col, ptr, prop, -1, 0, UI_ITEM_R_EXPAND|UI_ITEM_R_SLIDER, "", ICON_NULL);
// but need to use uiButSetFunc for updating other fake buttons
/* HSV values */
@@ -1856,19 +1916,19 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR
rgb[3]= 1.0f;
}
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
-
sprintf(hexcol, "%02X%02X%02X", FTOCHAR(rgb_gamma[0]), FTOCHAR(rgb_gamma[1]), FTOCHAR(rgb_gamma[2]));
bt= uiDefBut(block, TEX, 0, "Hex: ", 0, -60, butwidth, UI_UNIT_Y, hexcol, 0, 8, 0, 0, "Hex triplet for color (#RRGGBB)");
uiButSetFunc(bt, do_hex_rna_cb, bt, hexcol);
uiDefBut(block, LABEL, 0, "(Gamma Corrected)", 0, -80, butwidth, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
+ rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+
picker_new_hide_reveal(block, colormode);
}
-static int ui_picker_small_wheel(const bContext *C, uiBlock *block, wmEvent *event)
+static int ui_picker_small_wheel_cb(const bContext *UNUSED(C), uiBlock *block, wmEvent *event)
{
float add= 0.0f;
@@ -1884,16 +1944,17 @@ static int ui_picker_small_wheel(const bContext *C, uiBlock *block, wmEvent *eve
if(but->type==HSVCUBE && but->active==NULL) {
uiPopupBlockHandle *popup= block->handle;
float col[3];
+ float *hsv= ui_block_hsv_get(block);
ui_get_but_vectorf(but, col);
- rgb_to_hsv(col[0], col[1], col[2], but->hsv, but->hsv+1, but->hsv+2);
- but->hsv[2]= CLAMPIS(but->hsv[2]+add, 0.0f, 1.0f);
- hsv_to_rgb(but->hsv[0], but->hsv[1], but->hsv[2], col, col+1, col+2);
+ rgb_to_hsv_compat(col[0], col[1], col[2], hsv, hsv+1, hsv+2);
+ hsv[2]= CLAMPIS(hsv[2]+add, 0.0f, 1.0f);
+ hsv_to_rgb(hsv[0], hsv[1], hsv[2], col, col+1, col+2);
ui_set_but_vectorf(but, col);
- ui_update_block_buts_rgb(block, col, NULL);
+ ui_update_block_buts_rgb(block, col);
if(popup)
popup->menuretval= UI_RETURN_UPDATE;
@@ -1920,12 +1981,13 @@ uiBlock *ui_block_func_COL(bContext *C, uiPopupBlockHandle *handle, void *arg_bu
uiBlockSetFlag(block, UI_BLOCK_MOVEMOUSE_QUIT);
VECCOPY(handle->retvec, but->editvec);
-
+
uiBlockPicker(block, handle->retvec, &but->rnapoin, but->rnaprop);
- block->flag= UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_KEEP_OPEN;
+
+ block->flag= UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_KEEP_OPEN|UI_BLOCK_OUT_1;
uiBoundsBlock(block, 10);
- block->block_event_func= ui_picker_small_wheel;
+ block->block_event_func= ui_picker_small_wheel_cb;
/* and lets go */
block->direction= UI_TOP;
@@ -2169,7 +2231,7 @@ uiPopupMenu *uiPupMenuBegin(bContext *C, const char *title, int icon)
uiDefIconTextBut(pup->block, LABEL, 0, icon, titlestr, 0, 0, 200, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
}
else {
- but= uiDefBut(pup->block, LABEL, 0, (char*)title, 0, 0, 200, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
+ but= uiDefBut(pup->block, LABEL, 0, title, 0, 0, 200, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
but->flag= UI_TEXT_LEFT;
}
}
@@ -2226,7 +2288,7 @@ static void confirm_cancel_operator(void *opv)
WM_operator_free(opv);
}
-static void vconfirm_opname(bContext *C, char *opname, char *title, char *itemfmt, va_list ap)
+static void vconfirm_opname(bContext *C, const char *opname, const char *title, const char *itemfmt, va_list ap)
{
uiPopupBlockHandle *handle;
char *s, buf[512];
@@ -2238,10 +2300,10 @@ static void vconfirm_opname(bContext *C, char *opname, char *title, char *itemfm
handle= ui_popup_menu_create(C, NULL, NULL, NULL, NULL, buf);
handle->popup_func= operator_name_cb;
- handle->popup_arg= opname;
+ handle->popup_arg= (void *)opname;
}
-static void confirm_operator(bContext *C, wmOperator *op, char *title, char *item)
+static void confirm_operator(bContext *C, wmOperator *op, const char *title, const char *item)
{
uiPopupBlockHandle *handle;
char *s, buf[512];
@@ -2256,7 +2318,7 @@ static void confirm_operator(bContext *C, wmOperator *op, char *title, char *ite
handle->cancel_func= confirm_cancel_operator;
}
-void uiPupMenuOkee(bContext *C, char *opname, char *str, ...)
+void uiPupMenuOkee(bContext *C, const char *opname, const char *str, ...)
{
va_list ap;
char titlestr[256];
@@ -2268,7 +2330,7 @@ void uiPupMenuOkee(bContext *C, char *opname, char *str, ...)
va_end(ap);
}
-void uiPupMenuSaveOver(bContext *C, wmOperator *op, char *filename)
+void uiPupMenuSaveOver(bContext *C, wmOperator *op, const char *filename)
{
size_t len= strlen(filename);
@@ -2286,7 +2348,7 @@ void uiPupMenuSaveOver(bContext *C, wmOperator *op, char *filename)
confirm_operator(C, op, "Save Over", filename);
}
-void uiPupMenuNotice(bContext *C, char *str, ...)
+void uiPupMenuNotice(bContext *C, const char *str, ...)
{
va_list ap;
@@ -2295,7 +2357,7 @@ void uiPupMenuNotice(bContext *C, char *str, ...)
va_end(ap);
}
-void uiPupMenuError(bContext *C, char *str, ...)
+void uiPupMenuError(bContext *C, const char *str, ...)
{
va_list ap;
char nfmt[256];
@@ -2357,7 +2419,7 @@ void uiPupMenuInvoke(bContext *C, const char *idname)
if(mt->poll && mt->poll(C, mt)==0)
return;
- pup= uiPupMenuBegin(C, mt->label, 0);
+ pup= uiPupMenuBegin(C, mt->label, ICON_NULL);
layout= uiPupMenuLayout(pup);
menu.layout= layout;
@@ -2371,7 +2433,7 @@ void uiPupMenuInvoke(bContext *C, const char *idname)
/*************************** Popup Block API **************************/
-void uiPupBlockO(bContext *C, uiBlockCreateFunc func, void *arg, char *opname, int opcontext)
+void uiPupBlockO(bContext *C, uiBlockCreateFunc func, void *arg, const char *opname, int opcontext)
{
wmWindow *window= CTX_wm_window(C);
uiPopupBlockHandle *handle;
@@ -2416,3 +2478,7 @@ void uiPupBlockClose(bContext *C, uiBlock *block)
}
}
+float *ui_block_hsv_get(uiBlock *block)
+{
+ return block->_hsv;
+}
diff --git a/source/blender/editors/interface/interface_style.c b/source/blender/editors/interface/interface_style.c
index 03676ae5e06..af0b2189a99 100644
--- a/source/blender/editors/interface/interface_style.c
+++ b/source/blender/editors/interface/interface_style.c
@@ -136,7 +136,9 @@ static uiFont *uifont_to_blfont(int id)
/* *************** draw ************************ */
-void uiStyleFontDraw(uiFontStyle *fs, rcti *rect, char *str)
+
+void uiStyleFontDrawExt(uiFontStyle *fs, rcti *rect, const char *str,
+ float *r_xofs, float *r_yofs)
{
float height;
int xofs=0, yofs;
@@ -165,16 +167,26 @@ void uiStyleFontDraw(uiFontStyle *fs, rcti *rect, char *str)
if (fs->kerning == 1)
BLF_enable(fs->uifont_id, BLF_KERNING_DEFAULT);
- BLF_draw(fs->uifont_id, str);
+ BLF_draw(fs->uifont_id, str, 65535); /* XXX, use real length */
BLF_disable(fs->uifont_id, BLF_CLIPPING);
if (fs->shadow)
BLF_disable(fs->uifont_id, BLF_SHADOW);
if (fs->kerning == 1)
BLF_disable(fs->uifont_id, BLF_KERNING_DEFAULT);
+
+ *r_xofs= xofs;
+ *r_yofs= yofs;
+}
+
+void uiStyleFontDraw(uiFontStyle *fs, rcti *rect, const char *str)
+{
+ float xofs, yofs;
+ uiStyleFontDrawExt(fs, rect, str,
+ &xofs, &yofs);
}
/* drawn same as above, but at 90 degree angle */
-void uiStyleFontDrawRotated(uiFontStyle *fs, rcti *rect, char *str)
+void uiStyleFontDrawRotated(uiFontStyle *fs, rcti *rect, const char *str)
{
float height;
int xofs, yofs;
@@ -218,7 +230,7 @@ void uiStyleFontDrawRotated(uiFontStyle *fs, rcti *rect, char *str)
if (fs->kerning == 1)
BLF_enable(fs->uifont_id, BLF_KERNING_DEFAULT);
- BLF_draw(fs->uifont_id, str);
+ BLF_draw(fs->uifont_id, str, 65535); /* XXX, use real length */
BLF_disable(fs->uifont_id, BLF_ROTATION);
BLF_disable(fs->uifont_id, BLF_CLIPPING);
if (fs->shadow)
@@ -230,7 +242,7 @@ void uiStyleFontDrawRotated(uiFontStyle *fs, rcti *rect, char *str)
/* ************** helpers ************************ */
/* temporarily, does widget font */
-int UI_GetStringWidth(char *str)
+int UI_GetStringWidth(const char *str)
{
uiStyle *style= U.uistyles.first;
uiFontStyle *fstyle= &style->widget;
@@ -249,13 +261,19 @@ int UI_GetStringWidth(char *str)
}
/* temporarily, does widget font */
-void UI_DrawString(float x, float y, char *str)
+void UI_DrawString(float x, float y, const char *str)
{
uiStyle *style= U.uistyles.first;
+ if (style->widget.kerning == 1)
+ BLF_enable(style->widget.uifont_id, BLF_KERNING_DEFAULT);
+
uiStyleFontSet(&style->widget);
BLF_position(style->widget.uifont_id, x, y, 0.0f);
- BLF_draw(style->widget.uifont_id, str);
+ BLF_draw(style->widget.uifont_id, str, 65535); /* XXX, use real length */
+
+ if (style->widget.kerning == 1)
+ BLF_disable(style->widget.uifont_id, BLF_KERNING_DEFAULT);
}
/* ************** init exit ************************ */
@@ -308,6 +326,18 @@ void uiStyleInit(void)
if(style==NULL) {
ui_style_new(&U.uistyles, "Default Style");
}
+
+ // XXX, this should be moved into a style, but for now best only load the monospaced font once.
+ if (blf_mono_font == -1)
+ blf_mono_font= BLF_load_mem_unique("monospace", (unsigned char *)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size);
+
+ BLF_size(blf_mono_font, 12, 72);
+
+ /* second for rendering else we get threading problems */
+ if (blf_mono_font_render == -1)
+ blf_mono_font_render= BLF_load_mem_unique("monospace", (unsigned char *)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size);
+
+ BLF_size(blf_mono_font_render, 12, 72);
}
void uiStyleFontSet(uiFontStyle *fs)
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index e0f57a259b5..14d9773ef14 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -32,14 +32,19 @@
#include "DNA_userdef_types.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
+#include "BKE_animsys.h"
#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_object.h"
+#include "BKE_material.h"
#include "BKE_texture.h"
#include "BKE_report.h"
+#include "BKE_displist.h"
#include "ED_screen.h"
#include "ED_render.h"
@@ -54,7 +59,7 @@
#include "BLF_api.h"
-void ui_template_fix_linking()
+void ui_template_fix_linking(void)
{
}
@@ -95,7 +100,7 @@ static void id_search_call_cb(bContext *C, void *arg_template, void *item)
}
/* ID Search browse menu, do the search */
-static void id_search_cb(const bContext *C, void *arg_template, char *str, uiSearchItems *items)
+static void id_search_cb(const bContext *C, void *arg_template, const char *str, uiSearchItems *items)
{
TemplateID *template= (TemplateID*)arg_template;
ListBase *lb= template->idlb;
@@ -250,8 +255,8 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
break;
case UI_ID_FAKE_USER:
if(id) {
- if(id->flag & LIB_FAKEUSER) id->us++;
- else id->us--;
+ if(id->flag & LIB_FAKEUSER) id_us_plus(id);
+ else id_us_min(id);
}
else return;
break;
@@ -269,6 +274,8 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
if(id) {
/* make copy */
if(id_copy(id, &newid, 0) && newid) {
+ /* copy animation actions too */
+ BKE_copy_animdata_id_action(id);
/* us is 1 by convention, but RNA_property_pointer_set
will also incremement it, so set it to zero */
newid->us= 0;
@@ -287,7 +294,36 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
}
}
-static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, StructRNA *type, int flag, char *newop, char *openop, char *unlinkop)
+static const char *template_id_browse_tip(StructRNA *type)
+{
+ if(type) {
+ switch(RNA_type_to_ID_code(type)) {
+ case ID_SCE: return "Browse Scene to be linked";
+ case ID_OB: return "Browse Object to be linked";
+ case ID_ME: return "Browse Mesh Data to be linked";
+ case ID_CU: return "Browse Curve Data to be linked";
+ case ID_MB: return "Browse MetaBall Data to be linked";
+ case ID_MA: return "Browse Material to be linked";
+ case ID_TE: return "Browse Texture to be linked";
+ case ID_IM: return "Browse Image to be linked";
+ case ID_LA: return "Browse Lattice Data to be linked";
+ case ID_CA: return "Browse Camera Data to be linked";
+ case ID_WO: return "Browse World Settings to be linked";
+ case ID_SCR: return "Choose Screen lay-out";
+ case ID_TXT: return "Browse Text to be linked";
+ case ID_SO: return "Browse Sound to be linked";
+ case ID_AR: return "Browse Armature data to be linked";
+ case ID_AC: return "Browse Action to be linked";
+ case ID_NT: return "Browse Node Tree to be linked";
+ case ID_BR: return "Browse Brush to be linked";
+ case ID_PA: return "Browse Particle System to be linked";
+ case ID_GD: return "Browse Grease Pencil Data to be linked";
+ }
+ }
+ return "Browse ID data to be linked";
+}
+
+static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, StructRNA *type, int flag, const char *newop, const char *openop, const char *unlinkop)
{
uiBut *but;
uiBlock *block;
@@ -308,7 +344,7 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
if(flag & UI_ID_PREVIEWS) {
- but= uiDefBlockButN(block, id_search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X*6, UI_UNIT_Y*6, "Browse ID data");
+ but= uiDefBlockButN(block, id_search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X*6, UI_UNIT_Y*6, template_id_browse_tip(type));
if(type) {
but->icon= RNA_struct_ui_icon(type);
if (id) but->icon = ui_id_icon_get(C, id, 1);
@@ -322,7 +358,7 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
} else
if(flag & UI_ID_BROWSE) {
- but= uiDefBlockButN(block, id_search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X*1.6, UI_UNIT_Y, "Browse ID data");
+ but= uiDefBlockButN(block, id_search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X*1.6, UI_UNIT_Y, template_id_browse_tip(type));
if(type) {
but->icon= RNA_struct_ui_icon(type);
/* default dragging of icon for id browse buttons */
@@ -337,11 +373,13 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
/* text button with name */
if(id) {
char name[UI_MAX_NAME_STR];
+ const short user_alert= (id->us <= 0);
//text_idbutton(id, name);
name[0]= '\0';
but= uiDefButR(block, TEX, 0, name, 0, 0, UI_UNIT_X*6, UI_UNIT_Y, &idptr, "name", -1, 0, 0, -1, -1, NULL);
uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_RENAME));
+ if(user_alert) uiButSetFlag(but, UI_BUT_REDALERT);
if(id->lib) {
if(id->flag & LIB_INDIRECT) {
@@ -373,6 +411,8 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
if(!id_copy(id, NULL, 1 /* test only */) || (idfrom && idfrom->lib))
uiButSetFlag(but, UI_BUT_DISABLED);
}
+
+ if(user_alert) uiButSetFlag(but, UI_BUT_REDALERT);
if(id->lib == NULL && !(ELEM4(GS(id->name), ID_GR, ID_SCE, ID_SCR, ID_TXT))) {
uiDefButR(block, TOG, 0, "F", 0, 0, UI_UNIT_X, UI_UNIT_Y, &idptr, "use_fake_user", -1, 0, 0, -1, -1, NULL);
@@ -412,12 +452,14 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
}
/* delete button */
- if(id && (flag & UI_ID_DELETE)) {
+ if(id && (flag & UI_ID_DELETE) && (RNA_property_flag(template->prop) & PROP_NEVER_UNLINK)==0) {
if(unlinkop) {
but= uiDefIconButO(block, BUT, unlinkop, WM_OP_INVOKE_REGION_WIN, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
+ /* so we can access the template from operators, font unlinking needs this */
+ uiButSetNFunc(but, NULL, MEM_dupallocN(template), 0);
}
else {
- but= uiDefIconBut(block, BUT, 0, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Unlink datablock, Shift + Click to force removal on save");
+ but= uiDefIconBut(block, BUT, 0, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Unlink datablock. Shift + Click to set users to zero, data gets not saved");
uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_DELETE));
if(RNA_property_flag(template->prop) & PROP_NEVER_NULL)
@@ -431,7 +473,7 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
uiBlockEndAlign(block);
}
-static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop, int flag, int prv_rows, int prv_cols)
+static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *propname, const char *newop, const char *openop, const char *unlinkop, int flag, int prv_rows, int prv_cols)
{
TemplateID *template;
PropertyRNA *prop;
@@ -454,7 +496,7 @@ static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, char
flag |= UI_ID_ADD_NEW;
if(openop)
flag |= UI_ID_OPEN;
-
+
type= RNA_property_pointer_type(ptr, prop);
template->idlb= which_libbase(CTX_data_main(C), RNA_type_to_ID_code(type));
@@ -469,17 +511,17 @@ static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, char
MEM_freeN(template);
}
-void uiTemplateID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop)
+void uiTemplateID(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *propname, const char *newop, const char *openop, const char *unlinkop)
{
ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_DELETE, 0, 0);
}
-void uiTemplateIDBrowse(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop)
+void uiTemplateIDBrowse(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *propname, const char *newop, const char *openop, const char *unlinkop)
{
ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, UI_ID_BROWSE|UI_ID_RENAME, 0, 0);
}
-void uiTemplateIDPreview(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop, int rows, int cols)
+void uiTemplateIDPreview(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *propname, const char *newop, const char *openop, const char *unlinkop, int rows, int cols)
{
ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_DELETE|UI_ID_PREVIEWS, rows, cols);
}
@@ -491,7 +533,7 @@ void uiTemplateIDPreview(uiLayout *layout, bContext *C, PointerRNA *ptr, char *p
* - propname: property identifier for property that ID-pointer gets stored to
* - proptypename: property identifier for property used to determine the type of ID-pointer that can be used
*/
-void uiTemplateAnyID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *proptypename, char *text)
+void uiTemplateAnyID(uiLayout *layout, PointerRNA *ptr, const char *propname, const char *proptypename, const char *text)
{
PropertyRNA *propID, *propType;
uiLayout *row;
@@ -514,16 +556,16 @@ void uiTemplateAnyID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
/* Label - either use the provided text, or will become "ID-Block:" */
if (text)
- uiItemL(row, text, 0);
+ uiItemL(row, text, ICON_NULL);
else
- uiItemL(row, "ID-Block:", 0);
+ uiItemL(row, "ID-Block:", ICON_NULL);
/* ID-Type Selector - just have a menu of icons */
// FIXME: the icon-only setting doesn't work when we supply a blank name
- uiItemFullR(row, ptr, propType, 0, 0, UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemFullR(row, ptr, propType, 0, 0, UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
/* ID-Block Selector - just use pointer widget... */
- uiItemFullR(row, ptr, propID, 0, 0, 0, "", 0);
+ uiItemFullR(row, ptr, propID, 0, 0, 0, "", ICON_NULL);
}
/********************* RNA Path Builder Template ********************/
@@ -536,7 +578,7 @@ void uiTemplateAnyID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
* - propname: property identifier for property that path gets stored to
* - root_ptr: struct that path gets built from
*/
-void uiTemplatePathBuilder(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, PointerRNA *root_ptr, char *text)
+void uiTemplatePathBuilder(uiLayout *layout, PointerRNA *ptr, const char *propname, PointerRNA *UNUSED(root_ptr), const char *text)
{
PropertyRNA *propPath;
uiLayout *row;
@@ -595,7 +637,7 @@ static void modifiers_setOnCage(bContext *C, void *ob_v, void *md_v)
}
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
static void modifiers_convertToReal(bContext *C, void *ob_v, void *md_v)
@@ -614,7 +656,7 @@ static void modifiers_convertToReal(bContext *C, void *ob_v, void *md_v)
ob->partype = PAROBJECT;
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
ED_undo_push(C, "Modifier convert to real");
}
@@ -668,14 +710,14 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
uiBlockSetEmboss(block, UI_EMBOSSN);
/* Open/Close ................................. */
- uiItemR(row, &ptr, "show_expanded", 0, "", 0);
+ uiItemR(row, &ptr, "show_expanded", 0, "", ICON_NULL);
/* modifier-type icon */
uiItemL(row, "", RNA_struct_ui_icon(ptr.type));
uiBlockSetEmboss(block, UI_EMBOSS);
/* modifier name */
- uiItemR(row, &ptr, "name", 0, "", 0);
+ uiItemR(row, &ptr, "name", 0, "", ICON_NULL);
/* mode enabling buttons */
uiBlockBeginAlign(block);
@@ -683,11 +725,11 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
if ( ((md->type!=eModifierType_Softbody && md->type!=eModifierType_Collision) || !(ob->pd && ob->pd->deflect))
&& (md->type!=eModifierType_Surface) )
{
- uiItemR(row, &ptr, "show_render", 0, "", 0);
- uiItemR(row, &ptr, "show_viewport", 0, "", 0);
+ uiItemR(row, &ptr, "show_render", 0, "", ICON_NULL);
+ uiItemR(row, &ptr, "show_viewport", 0, "", ICON_NULL);
if (mti->flags & eModifierTypeFlag_SupportsEditmode)
- uiItemR(row, &ptr, "show_in_editmode", 0, "", 0);
+ uiItemR(row, &ptr, "show_in_editmode", 0, "", ICON_NULL);
}
if ((ob->type==OB_MESH) && modifier_couldBeCage(scene, md) && (index <= lastCageIndex))
{
@@ -697,6 +739,23 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
uiButSetFlag(but, UI_BUT_DISABLED);
uiButSetFunc(but, modifiers_setOnCage, ob, md);
}
+
+ /* tesselation point for curve-typed objects */
+ if (ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
+ ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+
+ /* some modifiers could work with pre-tesselated curves only */
+ if (ELEM3(md->type, eModifierType_Hook, eModifierType_Softbody, eModifierType_MeshDeform)) {
+ /* add disabled pre-tesselated button, so users could have
+ message for this modifiers */
+ but = uiDefIconButBitI(block, TOG, eModifierMode_ApplyOnSpline, 0, ICON_SURFACE_DATA, 0, 0, 16, 20, &md->mode, 0.0, 0.0, 0.0, 0.0, "This modifier could be applied on splines' points only");
+ uiButSetFlag(but, UI_BUT_DISABLED);
+ } else if (mti->type != eModifierTypeType_Constructive) {
+ /* constructive modifiers tesselates curve before applying */
+ uiItemR(row, &ptr, "use_apply_on_spline", 0, "", ICON_NULL);
+ }
+ }
+
uiBlockEndAlign(block);
/* Up/Down + Delete ........................... */
@@ -727,9 +786,9 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
if (!(ob->mode & OB_MODE_PARTICLE_EDIT) && psys->pathcache) {
if(ELEM(psys->part->ren_as, PART_DRAW_GR, PART_DRAW_OB))
- uiItemO(row, "Convert", 0, "OBJECT_OT_duplicates_make_real");
+ uiItemO(row, "Convert", ICON_NULL, "OBJECT_OT_duplicates_make_real");
else if(psys->part->ren_as == PART_DRAW_PATH)
- uiItemO(row, "Convert", 0, "OBJECT_OT_modifier_convert");
+ uiItemO(row, "Convert", ICON_NULL, "OBJECT_OT_modifier_convert");
}
}
else {
@@ -744,7 +803,7 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
uiBlockSetButLock(block, ob && ob->id.lib, ERROR_LIBDATA_MESSAGE);
if (!ELEM5(md->type, eModifierType_Fluidsim, eModifierType_Softbody, eModifierType_ParticleSystem, eModifierType_Cloth, eModifierType_Smoke))
- uiItemO(row, "Copy", 0, "OBJECT_OT_modifier_copy");
+ uiItemO(row, "Copy", ICON_NULL, "OBJECT_OT_modifier_copy");
}
/* result is the layout block inside the box, that we return so that modifier settings can be drawn */
@@ -817,17 +876,14 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
#define REMAKEIPO 8
#define B_DIFF 9
-void do_constraint_panels(bContext *C, void *arg, int event)
+void do_constraint_panels(bContext *C, void *ob_pt, int event)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
+ Object *ob= (Object *)ob_pt;
switch(event) {
case B_CONSTRAINT_TEST:
- // XXX allqueue(REDRAWVIEW3D, 0);
- // XXX allqueue(REDRAWBUTSOBJECT, 0);
- // XXX allqueue(REDRAWBUTSEDIT, 0);
break; // no handling
case B_CONSTRAINT_CHANGETARGET:
if (ob->pose) ob->pose->flag |= POSE_RECALC; // checks & sorts pose channels
@@ -843,17 +899,13 @@ void do_constraint_panels(bContext *C, void *arg, int event)
// object_test_constraints(ob);
// if(ob->pose) update_pose_constraint_flags(ob->pose);
- if(ob->type==OB_ARMATURE) DAG_id_flush_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
- else DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ if(ob->type==OB_ARMATURE) DAG_id_tag_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
+ else DAG_id_tag_update(&ob->id, OB_RECALC_OB);
WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
-
- // XXX allqueue(REDRAWVIEW3D, 0);
- // XXX allqueue(REDRAWBUTSOBJECT, 0);
- // XXX allqueue(REDRAWBUTSEDIT, 0);
}
-static void constraint_active_func(bContext *C, void *ob_v, void *con_v)
+static void constraint_active_func(bContext *UNUSED(C), void *ob_v, void *con_v)
{
ED_object_constraint_set_active(ob_v, con_v);
}
@@ -890,7 +942,7 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
/* unless button has own callback, it adds this callback to button */
block= uiLayoutGetBlock(layout);
- uiBlockSetHandleFunc(block, do_constraint_panels, NULL);
+ uiBlockSetHandleFunc(block, do_constraint_panels, ob);
uiBlockSetFunc(block, constraint_active_func, ob, con);
RNA_pointer_create(&ob->id, &RNA_Constraint, con, &ptr);
@@ -909,20 +961,22 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
/* open/close */
uiBlockSetEmboss(block, UI_EMBOSSN);
- uiItemR(row, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(row, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
uiBlockSetEmboss(block, UI_EMBOSS);
- /* XXX if (con->flag & CONSTRAINT_DISABLE)
- uiBlockSetCol(block, TH_REDALERT);*/
-
/* name */
uiDefBut(block, LABEL, B_CONSTRAINT_TEST, typestr, xco+10, yco, 100, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+ if (con->flag & CONSTRAINT_DISABLE)
+ uiLayoutSetRedAlert(row, 1);
+
if(proxy_protected == 0) {
- uiItemR(row, &ptr, "name", 0, "", 0);
+ uiItemR(row, &ptr, "name", 0, "", ICON_NULL);
}
else
- uiItemL(row, con->name, 0);
+ uiItemL(row, con->name, ICON_NULL);
+
+ uiLayoutSetRedAlert(row, 0);
/* proxy-protected constraints cannot be edited, so hide up/down + close buttons */
if (proxy_protected) {
@@ -993,7 +1047,7 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
box= uiLayoutBox(col);
block= uiLayoutAbsoluteBlock(box);
result= box;
- }
+ }
/* clear any locks set up for proxies/lib-linking */
uiBlockClearButLock(block);
@@ -1050,7 +1104,7 @@ static void do_preview_buttons(bContext *C, void *arg, int event)
}
}
-void uiTemplatePreview(uiLayout *layout, ID *id, ID *parent, MTex *slot)
+void uiTemplatePreview(uiLayout *layout, ID *id, int show_buttons, ID *parent, MTex *slot)
{
uiLayout *row, *col;
uiBlock *block;
@@ -1098,7 +1152,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, ID *parent, MTex *slot)
uiBlockSetHandleFunc(block, do_preview_buttons, NULL);
/* add buttons */
- if(pid) {
+ if (pid && show_buttons) {
if(GS(pid->name) == ID_MA || (pparent && GS(pparent->name) == ID_MA)) {
if(GS(pid->name) == ID_MA) ma= (Material*)pid;
else ma= (Material*)pparent;
@@ -1108,7 +1162,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, ID *parent, MTex *slot)
col = uiLayoutColumn(row, 1);
uiLayoutSetScaleX(col, 1.5);
- uiItemR(col, &material_ptr, "preview_render_type", UI_ITEM_R_EXPAND, "", 0);
+ uiItemR(col, &material_ptr, "preview_render_type", UI_ITEM_R_EXPAND, "", ICON_NULL);
}
if(pr_texture) {
@@ -1128,7 +1182,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, ID *parent, MTex *slot)
/* Alpha buton for texture preview */
if(*pr_texture!=TEX_PR_OTHER) {
row = uiLayoutRow(layout, 0);
- uiItemR(row, &texture_ptr, "use_preview_alpha", 0, NULL, 0);
+ uiItemR(row, &texture_ptr, "use_preview_alpha", 0, NULL, ICON_NULL);
}
}
}
@@ -1142,7 +1196,7 @@ typedef struct RNAUpdateCb {
PropertyRNA *prop;
} RNAUpdateCb;
-static void rna_update_cb(bContext *C, void *arg_cb, void *arg_unused)
+static void rna_update_cb(bContext *C, void *arg_cb, void *UNUSED(arg))
{
RNAUpdateCb *cb= (RNAUpdateCb*)arg_cb;
@@ -1243,8 +1297,8 @@ static void colorband_buttons_large(uiLayout *layout, uiBlock *block, ColorBand
PointerRNA ptr;
RNA_pointer_create(cb->ptr.id.data, &RNA_ColorRampElement, cbd, &ptr);
row= uiLayoutRow(layout, 0);
- uiItemR(row, &ptr, "position", 0, "Pos", 0);
- uiItemR(row, &ptr, "color", 0, "", 0);
+ uiItemR(row, &ptr, "position", 0, "Pos", ICON_NULL);
+ uiItemR(row, &ptr, "color", 0, "", ICON_NULL);
}
}
@@ -1268,7 +1322,7 @@ static void colorband_buttons_small(uiLayout *layout, uiBlock *block, ColorBand
CBData *cbd= coba->data + coba->cur;
PointerRNA ptr;
RNA_pointer_create(cb->ptr.id.data, &RNA_ColorRampElement, cbd, &ptr);
- uiItemR(layout, &ptr, "color", 0, "", 0);
+ uiItemR(layout, &ptr, "color", 0, "", ICON_NULL);
}
bt= uiDefButS(block, MENU, 0, "Interpolation %t|Ease %x1|Cardinal %x3|Linear %x0|B-Spline %x2|Constant %x4",
@@ -1289,7 +1343,7 @@ static void colorband_buttons_layout(uiLayout *layout, uiBlock *block, ColorBand
colorband_buttons_large(layout, block, coba, 0, 0, cb);
}
-void uiTemplateColorRamp(uiLayout *layout, PointerRNA *ptr, char *propname, int expand)
+void uiTemplateColorRamp(uiLayout *layout, PointerRNA *ptr, const char *propname, int expand)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
PointerRNA cptr;
@@ -1319,7 +1373,7 @@ void uiTemplateColorRamp(uiLayout *layout, PointerRNA *ptr, char *propname, int
/********************* Histogram Template ************************/
-void uiTemplateHistogram(uiLayout *layout, PointerRNA *ptr, char *propname, int expand)
+void uiTemplateHistogram(uiLayout *layout, PointerRNA *ptr, const char *propname)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
PointerRNA cptr;
@@ -1348,7 +1402,7 @@ void uiTemplateHistogram(uiLayout *layout, PointerRNA *ptr, char *propname, int
hist = (Histogram *)cptr.data;
- hist->height= (hist->height<=0)?100:hist->height;
+ hist->height= (hist->height<=20)?20:hist->height;
bt= uiDefBut(block, HISTOGRAM, 0, "", rect.xmin, rect.ymin, rect.xmax-rect.xmin, hist->height, hist, 0, 0, 0, 0, "");
uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL);
@@ -1358,7 +1412,7 @@ void uiTemplateHistogram(uiLayout *layout, PointerRNA *ptr, char *propname, int
/********************* Waveform Template ************************/
-void uiTemplateWaveform(uiLayout *layout, PointerRNA *ptr, char *propname, int expand)
+void uiTemplateWaveform(uiLayout *layout, PointerRNA *ptr, const char *propname)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
PointerRNA cptr;
@@ -1385,7 +1439,7 @@ void uiTemplateWaveform(uiLayout *layout, PointerRNA *ptr, char *propname, int e
block= uiLayoutAbsoluteBlock(layout);
- scopes->wavefrm_height= (scopes->wavefrm_height<=0)?100:scopes->wavefrm_height;
+ scopes->wavefrm_height= (scopes->wavefrm_height<=20)?20:scopes->wavefrm_height;
bt= uiDefBut(block, WAVEFORM, 0, "", rect.xmin, rect.ymin, rect.xmax-rect.xmin, scopes->wavefrm_height, scopes, 0, 0, 0, 0, "");
@@ -1394,7 +1448,7 @@ void uiTemplateWaveform(uiLayout *layout, PointerRNA *ptr, char *propname, int e
/********************* Vectorscope Template ************************/
-void uiTemplateVectorscope(uiLayout *layout, PointerRNA *ptr, char *propname, int expand)
+void uiTemplateVectorscope(uiLayout *layout, PointerRNA *ptr, const char *propname)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
PointerRNA cptr;
@@ -1421,7 +1475,7 @@ void uiTemplateVectorscope(uiLayout *layout, PointerRNA *ptr, char *propname, in
block= uiLayoutAbsoluteBlock(layout);
- scopes->vecscope_height= (scopes->vecscope_height<=0)?100:scopes->vecscope_height;
+ scopes->vecscope_height= (scopes->vecscope_height<=20)?20:scopes->vecscope_height;
bt= uiDefBut(block, VECTORSCOPE, 0, "", rect.xmin, rect.ymin, rect.xmax-rect.xmin, scopes->vecscope_height, scopes, 0, 0, 0, 0, "");
uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL);
@@ -1432,7 +1486,7 @@ void uiTemplateVectorscope(uiLayout *layout, PointerRNA *ptr, char *propname, in
/********************* CurveMapping Template ************************/
-static void curvemap_buttons_zoom_in(bContext *C, void *cumap_v, void *unused)
+static void curvemap_buttons_zoom_in(bContext *C, void *cumap_v, void *UNUSED(arg))
{
CurveMapping *cumap = cumap_v;
float d;
@@ -1450,7 +1504,7 @@ static void curvemap_buttons_zoom_in(bContext *C, void *cumap_v, void *unused)
ED_region_tag_redraw(CTX_wm_region(C));
}
-static void curvemap_buttons_zoom_out(bContext *C, void *cumap_v, void *unused)
+static void curvemap_buttons_zoom_out(bContext *C, void *cumap_v, void *UNUSED(unused))
{
CurveMapping *cumap = cumap_v;
float d, d1;
@@ -1487,7 +1541,7 @@ static void curvemap_buttons_zoom_out(bContext *C, void *cumap_v, void *unused)
ED_region_tag_redraw(CTX_wm_region(C));
}
-static void curvemap_buttons_setclip(bContext *C, void *cumap_v, void *unused)
+static void curvemap_buttons_setclip(bContext *UNUSED(C), void *cumap_v, void *UNUSED(arg))
{
CurveMapping *cumap = cumap_v;
@@ -1607,7 +1661,7 @@ static uiBlock *curvemap_brush_tools_func(bContext *C, struct ARegion *ar, void
return block;
}
-static void curvemap_buttons_redraw(bContext *C, void *arg1, void *arg2)
+static void curvemap_buttons_redraw(bContext *C, void *UNUSED(arg1), void *UNUSED(arg2))
{
ED_region_tag_redraw(CTX_wm_region(C));
}
@@ -1747,8 +1801,8 @@ static void curvemap_buttons_layout(uiLayout *layout, PointerRNA *ptr, char labe
/* black/white levels */
if(levels) {
split= uiLayoutSplit(layout, 0, 0);
- uiItemR(uiLayoutColumn(split, 0), ptr, "black_level", UI_ITEM_R_EXPAND, NULL, 0);
- uiItemR(uiLayoutColumn(split, 0), ptr, "white_level", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(uiLayoutColumn(split, 0), ptr, "black_level", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(uiLayoutColumn(split, 0), ptr, "white_level", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
uiLayoutRow(layout, 0);
bt=uiDefBut(block, BUT, 0, "Reset", 0, 0, UI_UNIT_X*10, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Reset Black/White point and curves");
@@ -1758,7 +1812,7 @@ static void curvemap_buttons_layout(uiLayout *layout, PointerRNA *ptr, char labe
uiBlockSetNFunc(block, NULL, NULL, NULL);
}
-void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, char *propname, int type, int levels, int brush)
+void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, const char *propname, int type, int levels, int brush)
{
RNAUpdateCb *cb;
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
@@ -1784,7 +1838,7 @@ void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, char *propname, i
#define WHEEL_SIZE 100
-void uiTemplateColorWheel(uiLayout *layout, PointerRNA *ptr, char *propname, int value_slider, int lock, int lock_luminosity, int cubic)
+void uiTemplateColorWheel(uiLayout *layout, PointerRNA *ptr, const char *propname, int value_slider, int lock, int lock_luminosity, int cubic)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
uiBlock *block= uiLayoutGetBlock(layout);
@@ -1821,7 +1875,7 @@ void uiTemplateColorWheel(uiLayout *layout, PointerRNA *ptr, char *propname, int
uiItemS(row);
if (value_slider)
- uiDefButR(block, HSVCUBE, 0, "", WHEEL_SIZE+6, 0, 14, WHEEL_SIZE, ptr, propname, -1, softmin, softmax, 9, 0, "");
+ uiDefButR(block, HSVCUBE, 0, "", WHEEL_SIZE+6, 0, 14, WHEEL_SIZE, ptr, propname, -1, softmin, softmax, UI_GRAD_V_ALT, 0, "");
}
/********************* Layer Buttons Template ************************/
@@ -1849,23 +1903,20 @@ static void handle_layer_buttons(bContext *C, void *arg1, void *arg2)
// - for now, grouping of layers is determined by dividing up the length of
// the array of layer bitflags
-void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, char *propname,
- PointerRNA *used_ptr, char *used_propname, int active_layer)
+void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, const char *propname,
+ PointerRNA *used_ptr, const char *used_propname, int active_layer)
{
uiLayout *uRow, *uCol;
PropertyRNA *prop, *used_prop= NULL;
int groups, cols, layers;
int group, col, layer, row;
int cols_per_group = 5;
- const char *desc;
-
+
prop= RNA_struct_find_property(ptr, propname);
if (!prop) {
printf("uiTemplateLayer: layers property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
-
- desc= RNA_property_description(prop);
/* the number of layers determines the way we group them
* - we want 2 rows only (for now)
@@ -1922,7 +1973,7 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, char *propname,
/************************* List Template **************************/
-static int list_item_icon_get(bContext *C, PointerRNA *itemptr, int rnaicon)
+static int list_item_icon_get(bContext *C, PointerRNA *itemptr, int rnaicon, int big)
{
ID *id= NULL;
int icon;
@@ -1943,7 +1994,7 @@ static int list_item_icon_get(bContext *C, PointerRNA *itemptr, int rnaicon)
/* get icon from ID */
if(id) {
- icon= ui_id_icon_get(C, id, 1);
+ icon= ui_id_icon_get(C, id, big);
if(icon)
return icon;
@@ -1952,13 +2003,13 @@ static int list_item_icon_get(bContext *C, PointerRNA *itemptr, int rnaicon)
return rnaicon;
}
-static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, PointerRNA *itemptr, int i, int rnaicon, PointerRNA *activeptr, char *activepropname)
+static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, PointerRNA *itemptr, int i, int rnaicon, PointerRNA *activeptr, const char *activepropname)
{
- Object *ob;
uiBlock *block= uiLayoutGetBlock(layout);
uiBut *but;
uiLayout *split, *overlap, *sub, *row;
- char *name, *namebuf;
+ char *namebuf;
+ const char *name;
int icon;
overlap= uiLayoutOverlap(layout);
@@ -1972,8 +2023,8 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
sub= uiLayoutRow(overlap, 0);
/* retrieve icon and name */
- icon= list_item_icon_get(C, itemptr, rnaicon);
- if(!icon || icon == ICON_DOT)
+ icon= list_item_icon_get(C, itemptr, rnaicon, 0);
+ if(icon == ICON_NULL || icon == ICON_DOT)
icon= 0;
namebuf= RNA_struct_name_get_alloc(itemptr, NULL, 0);
@@ -1996,8 +2047,30 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
uiBlockSetEmboss(block, UI_EMBOSS);
uiDefButR(block, OPTION, 0, "", 0, 0, UI_UNIT_X, UI_UNIT_Y, itemptr, "use", 0, 0, 0, 0, 0, NULL);
}
+ else if(RNA_struct_is_a(itemptr->type, &RNA_MaterialSlot)) {
+ /* provision to draw active node name */
+ Material *ma, *manode;
+ Object *ob= (Object*)ptr->id.data;
+ int index= (Material**)itemptr->data - ob->mat;
+
+ /* default item with material base name */
+ uiItemL(sub, name, icon);
+
+ ma= give_current_material(ob, index+1);
+ if(ma) {
+ manode= give_node_material(ma);
+ if(manode) {
+ char str[MAX_ID_NAME + 12];
+ sprintf(str, "Node %s", manode->id.name+2);
+ uiItemL(sub, str, ui_id_icon_get(C, &manode->id, 1));
+ }
+ else if(ma->use_nodes) {
+ uiItemL(sub, "Node <none>", ICON_NULL);
+ }
+ }
+ }
else if(itemptr->type == &RNA_ShapeKey) {
- ob= (Object*)activeptr->data;
+ Object *ob= (Object*)activeptr->data;
split= uiLayoutSplit(sub, 0.75f, 0);
@@ -2005,8 +2078,8 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
uiBlockSetEmboss(block, UI_EMBOSSN);
row= uiLayoutRow(split, 1);
- if(i == 0) uiItemL(row, "", 0);
- else uiItemR(row, itemptr, "value", 0, "", 0);
+ if(i == 0) uiItemL(row, "", ICON_NULL);
+ else uiItemR(row, itemptr, "value", 0, "", ICON_NULL);
if(ob->mode == OB_MODE_EDIT && !((ob->shapeflag & OB_SHAPE_EDIT_MODE) && ob->type == OB_MESH))
uiLayoutSetActive(row, 0);
@@ -2021,7 +2094,7 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
MEM_freeN(namebuf);
}
-void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, PointerRNA *activeptr, char *activepropname, int rows, int maxrows, int listtype)
+void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *propname, PointerRNA *activeptr, const char *activepropname, int rows, int maxrows, int listtype)
{
//Scene *scene= CTX_data_scene(C);
PropertyRNA *prop= NULL, *activeprop;
@@ -2095,7 +2168,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propna
if(i == 9)
row= uiLayoutRow(col, 0);
- icon= list_item_icon_get(C, &itemptr, rnaicon);
+ icon= list_item_icon_get(C, &itemptr, rnaicon, 1);
but= uiDefIconButR(block, LISTROW, 0, icon, 0,0,UI_UNIT_X*10,UI_UNIT_Y, activeptr, activepropname, 0, 0, i, 0, 0, "");
uiButSetFlag(but, UI_BUT_NO_TOOLTIP);
@@ -2119,7 +2192,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propna
if(found) {
/* create button */
name= RNA_struct_name_get_alloc(&itemptr, NULL, 0);
- icon= list_item_icon_get(C, &itemptr, rnaicon);
+ icon= list_item_icon_get(C, &itemptr, rnaicon, 0);
uiItemL(row, (name)? name: "", icon);
if(name)
@@ -2133,7 +2206,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propna
/* if not found, add in dummy button */
if(i == 0)
- uiItemL(row, "", 0);
+ uiItemL(row, "", ICON_NULL);
/* next/prev button */
sprintf(str, "%d :", i);
@@ -2186,7 +2259,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propna
/* add dummy buttons to fill space */
while(i < pa->list_scroll+items) {
if(i >= pa->list_scroll)
- uiItemL(col, "", 0);
+ uiItemL(col, "", ICON_NULL);
i++;
}
@@ -2200,7 +2273,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propna
/************************* Operator Search Template **************************/
-static void operator_call_cb(bContext *C, void *arg1, void *arg2)
+static void operator_call_cb(bContext *C, void *UNUSED(arg1), void *arg2)
{
wmOperatorType *ot= arg2;
@@ -2208,7 +2281,7 @@ static void operator_call_cb(bContext *C, void *arg1, void *arg2)
WM_operator_name_call(C, ot->idname, WM_OP_INVOKE_DEFAULT, NULL);
}
-static void operator_search_cb(const bContext *C, void *arg, char *str, uiSearchItems *items)
+static void operator_search_cb(const bContext *C, void *UNUSED(arg), const char *str, uiSearchItems *items)
{
wmOperatorType *ot = WM_operatortype_first();
@@ -2255,7 +2328,7 @@ void uiTemplateOperatorSearch(uiLayout *layout)
#define B_STOPANIM 3
#define B_STOPCOMPO 4
-static void do_running_jobs(bContext *C, void *arg, int event)
+static void do_running_jobs(bContext *C, void *UNUSED(arg), int event)
{
switch(event) {
case B_STOPRENDER:
@@ -2276,11 +2349,10 @@ static void do_running_jobs(bContext *C, void *arg, int event)
void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
{
bScreen *screen= CTX_wm_screen(C);
- Scene *scene= CTX_data_scene(C);
wmWindowManager *wm= CTX_wm_manager(C);
ScrArea *sa= CTX_wm_area(C);
uiBlock *block;
- void *owner;
+ void *owner= NULL;
int handle_event;
block= uiLayoutGetBlock(layout);
@@ -2289,17 +2361,24 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
uiBlockSetHandleFunc(block, do_running_jobs, NULL);
if(sa->spacetype==SPACE_NODE) {
- owner = sa;
+ if(WM_jobs_test(wm, sa))
+ owner = sa;
handle_event= B_STOPCOMPO;
- } else {
+ }
+ else {
+ Scene *scene;
+ /* another scene can be rendering too, for example via compositor */
+ for(scene= CTX_data_main(C)->scene.first; scene; scene= scene->id.next)
+ if(WM_jobs_test(wm, scene))
+ break;
owner = scene;
handle_event= B_STOPRENDER;
}
- if(WM_jobs_test(wm, owner)) {
- uiLayout *abs;
+ if(owner) {
+ uiLayout *ui_abs;
- abs = uiLayoutAbsolute(layout, 0);
+ ui_abs= uiLayoutAbsolute(layout, 0);
uiDefIconBut(block, BUT, handle_event, ICON_PANEL_CLOSE,
0, UI_UNIT_Y*0.1, UI_UNIT_X*0.8, UI_UNIT_Y*0.8, NULL, 0.0f, 0.0f, 0, 0, "Stop this job");
@@ -2322,12 +2401,12 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C)
Report *report= BKE_reports_last_displayable(reports);
ReportTimerInfo *rti;
- uiLayout *abs;
+ uiLayout *ui_abs;
uiBlock *block;
uiBut *but;
uiStyle *style= U.uistyles.first;
int width;
- float hsv[3];
+ int icon=0;
/* if the report display has timed out, don't show */
if (!reports->reporttimer) return;
@@ -2336,10 +2415,8 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C)
if (!rti || rti->widthfac==0.0 || !report) return;
- abs = uiLayoutAbsolute(layout, 0);
- block= uiLayoutGetBlock(abs);
-
- rgb_to_hsv(rti->col[0], rti->col[1], rti->col[2], hsv+0, hsv+1, hsv+2);
+ ui_abs= uiLayoutAbsolute(layout, 0);
+ block= uiLayoutGetBlock(ui_abs);
width = BLF_width(style->widget.uifont_id, report->message);
width = MIN2(rti->widthfac*width, width);
@@ -2348,23 +2425,39 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C)
/* make a box around the report to make it stand out */
uiBlockBeginAlign(block);
but= uiDefBut(block, ROUNDBOX, 0, "", 0, 0, UI_UNIT_X+10, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
- copy_v3_v3(but->hsv, hsv); /* set the report's bg colour in but->hsv - ROUNDBOX feature */
-
+ /* set the report's bg color in but->col - ROUNDBOX feature */
+ but->col[0]= FTOCHAR(rti->col[0]);
+ but->col[1]= FTOCHAR(rti->col[1]);
+ but->col[2]= FTOCHAR(rti->col[2]);
+ but->col[3]= 255;
+
but= uiDefBut(block, ROUNDBOX, 0, "", UI_UNIT_X+10, 0, UI_UNIT_X+width, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
- but->hsv[0] = but->hsv[1] = 0.0; /* set a greyscale bg colour in but->hsv - ROUNDBOX feature */
- but->hsv[2] = rti->greyscale;
+ but->col[0]= but->col[1]= but->col[2]= FTOCHAR(rti->greyscale);
+ but->col[3]= 255;
+
uiBlockEndAlign(block);
/* icon and report message on top */
if(report->type & RPT_ERROR_ALL)
- uiDefIconBut(block, LABEL, 0, ICON_ERROR, 2, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
+ icon = ICON_ERROR;
else if(report->type & RPT_WARNING_ALL)
- uiDefIconBut(block, LABEL, 0, ICON_ERROR, 2, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
+ icon = ICON_ERROR;
else if(report->type & RPT_INFO_ALL)
- uiDefIconBut(block, LABEL, 0, ICON_INFO, 2, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
+ icon = ICON_INFO;
- uiDefBut(block, LABEL, 0, report->message, UI_UNIT_X+10, 0, UI_UNIT_X+width, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
+ /* XXX: temporary operator to dump all reports to a text block, but only if more than 1 report
+ * to be shown instead of icon when appropriate...
+ */
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+ if (reports->list.first != reports->list.last)
+ uiDefIconButO(block, BUT, "UI_OT_reports_to_textblock", WM_OP_INVOKE_REGION_WIN, icon, 2, 0, UI_UNIT_X, UI_UNIT_Y, "Click to see rest of reports in textblock: 'Recent Reports'");
+ else
+ uiDefIconBut(block, LABEL, 0, icon, 2, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
+
+ uiBlockSetEmboss(block, UI_EMBOSS);
+
+ uiDefBut(block, LABEL, 0, report->message, UI_UNIT_X+10, 0, UI_UNIT_X+width, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
}
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c
index 37278340275..842dc40a39f 100644
--- a/source/blender/editors/interface/interface_utils.c
+++ b/source/blender/editors/interface/interface_utils.c
@@ -26,11 +26,14 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <assert.h>
#include "DNA_object_types.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
-#include "BKE_utildefines.h"
+
#include "RNA_access.h"
@@ -40,7 +43,7 @@
/*************************** RNA Utilities ******************************/
-uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int index, char *name, int icon, int x1, int y1, int x2, int y2)
+uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int index, const char *name, int icon, int x1, int y1, int x2, int y2)
{
uiBut *but=NULL;
const char *propname= RNA_property_identifier(prop);
@@ -55,19 +58,11 @@ uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int ind
switch(RNA_property_type(prop)) {
case PROP_BOOLEAN: {
- int value, length;
if(arraylen && index == -1)
return NULL;
-
- length= RNA_property_array_length(ptr, prop);
-
- if(length)
- value= RNA_property_boolean_get_index(ptr, prop, index);
- else
- value= RNA_property_boolean_get(ptr, prop);
- if(icon && name && strcmp(name, "") == 0)
+ if(icon && name && name[0] == '\0')
but= uiDefIconButR(block, ICONTOG, 0, icon, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
else if(icon)
but= uiDefIconTextButR(block, ICONTOG, 0, icon, name, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
@@ -87,7 +82,7 @@ uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int ind
but= uiDefButR(block, NUM, 0, name, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
break;
case PROP_ENUM:
- if(icon && name && strcmp(name, "") == 0)
+ if(icon && name && name[0] == '\0')
but= uiDefIconButR(block, MENU, 0, icon, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
else if(icon)
but= uiDefIconTextButR(block, MENU, 0, icon, NULL, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
@@ -95,7 +90,7 @@ uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int ind
but= uiDefButR(block, MENU, 0, NULL, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
break;
case PROP_STRING:
- if(icon && name && strcmp(name, "") == 0)
+ if(icon && name && name[0] == '\0')
but= uiDefIconButR(block, TEX, 0, icon, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
else if(icon)
but= uiDefIconTextButR(block, TEX, 0, icon, name, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
@@ -131,35 +126,57 @@ uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int ind
return but;
}
-void uiDefAutoButsRNA(const bContext *C, uiLayout *layout, PointerRNA *ptr, int columns)
+int uiDefAutoButsRNA(uiLayout *layout, PointerRNA *ptr, int (*check_prop)(PropertyRNA *), const char label_align)
{
uiLayout *split, *col;
int flag;
- char *name;
+ const char *name;
+ int tot= 0;
+
+ assert(ELEM3(label_align, '\0', 'H', 'V'));
RNA_STRUCT_BEGIN(ptr, prop) {
flag= RNA_property_flag(prop);
- if(flag & PROP_HIDDEN)
+ if(flag & PROP_HIDDEN || (check_prop && check_prop(prop)==FALSE))
continue;
- name= (char*)RNA_property_ui_name(prop);
+ if(label_align != '\0') {
+ name= RNA_property_ui_name(prop);
- if(columns == 1) {
- col= uiLayoutColumn(layout, 1);
- uiItemL(col, name, 0);
- }
- else if(columns == 2) {
- split = uiLayoutSplit(layout, 0.5f, 0);
+ if(label_align=='V') {
+ col= uiLayoutColumn(layout, 1);
+ uiItemL(col, name, ICON_NULL);
+ }
+ else if(label_align=='H') {
+ split = uiLayoutSplit(layout, 0.5f, 0);
- uiItemL(uiLayoutColumn(split, 0), name, 0);
- col= uiLayoutColumn(split, 0);
+ uiItemL(uiLayoutColumn(split, 0), name, ICON_NULL);
+ col= uiLayoutColumn(split, 0);
+ }
+ else {
+ col= NULL;
+ }
+
+ /* may meed to add more cases here.
+ * don't override enum flag names */
+ if(flag & PROP_ENUM_FLAG) {
+ name= NULL;
+ }
+ else {
+ name= ""; /* name is shown above, empty name for button below */
+ }
+ }
+ else {
+ col= layout;
+ name= NULL; /* no smart label alignment, show default name with button */
}
- else
- col= NULL;
- uiItemFullR(col, ptr, prop, -1, 0, 0, "", 0);
+ uiItemFullR(col, ptr, prop, -1, 0, 0, name, ICON_NULL);
+ tot++;
}
RNA_STRUCT_END;
+
+ return tot;
}
/***************************** ID Utilities *******************************/
@@ -171,7 +188,7 @@ int uiIconFromID(ID *id)
short idcode;
if(id==NULL)
- return 0;
+ return ICON_NULL;
idcode= GS(id->name);
@@ -189,5 +206,5 @@ int uiIconFromID(ID *id)
will set the right type, also with subclassing */
RNA_id_pointer_create(id, &ptr);
- return (ptr.type)? RNA_struct_ui_icon(ptr.type): 0;
+ return (ptr.type)? RNA_struct_ui_icon(ptr.type) : ICON_NULL;
}
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 08ce130a300..a431fc300d0 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -24,9 +24,9 @@
*/
#include <limits.h>
-#include <math.h>
#include <stdlib.h>
#include <string.h>
+#include <assert.h>
#include "DNA_screen_types.h"
@@ -35,6 +35,8 @@
#include "BLI_math.h"
#include "BLI_listbase.h"
#include "BLI_rect.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_curve.h"
@@ -284,8 +286,10 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
float facxi= (maxxi!=minxi) ? 1.0f/(maxxi-minxi) : 0.0f; /* for uv, can divide by zero */
float facyi= (maxyi!=minyi) ? 1.0f/(maxyi-minyi) : 0.0f;
int a, tot= 0, minsize;
+ const int hnum= ((roundboxalign & (1|2))==(1|2) || (roundboxalign & (4|8))==(4|8)) ? 1 : 2;
+ const int vnum= ((roundboxalign & (1|8))==(1|8) || (roundboxalign & (2|4))==(2|4)) ? 1 : 2;
- minsize= MIN2(rect->xmax-rect->xmin, rect->ymax-rect->ymin);
+ minsize= MIN2((rect->xmax-rect->xmin)*hnum, (rect->ymax-rect->ymin)*vnum);
if(2.0f*rad > minsize)
rad= 0.5f*minsize;
@@ -552,7 +556,7 @@ static void widget_check_trias(uiWidgetTrias *tria, rcti *rect)
/* prepares shade colors */
-static void shadecolors4(char *coltop, char *coldown, char *color, short shadetop, short shadedown)
+static void shadecolors4(char *coltop, char *coldown, const char *color, short shadetop, short shadedown)
{
coltop[0]= CLAMPIS(color[0]+shadetop, 0, 255);
@@ -566,7 +570,7 @@ static void shadecolors4(char *coltop, char *coldown, char *color, short shadeto
coldown[3]= color[3];
}
-static void round_box_shade_col4(char *col1, char *col2, float fac)
+static void round_box_shade_col4(const char *col1, const char *col2, float fac)
{
int faci, facm;
unsigned char col[4];
@@ -742,22 +746,24 @@ static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol)
#define PREVIEW_PAD 4
-static void widget_draw_preview(BIFIconID icon, float aspect, float alpha, rcti *rect)
+static void widget_draw_preview(BIFIconID icon, float UNUSED(alpha), rcti *rect)
{
- int w, h, x, y, size;
+ int w, h, size;
- if(!icon)
+ if(icon==ICON_NULL)
return;
w = rect->xmax - rect->xmin;
h = rect->ymax - rect->ymin;
size = MIN2(w, h);
size -= PREVIEW_PAD*2; /* padding */
-
- x = rect->xmin + w/2 - size/2;
- y = rect->ymin + h/2 - size/2;
-
- UI_icon_draw_preview_aspect_size(x, y, icon, aspect, size);
+
+ if(size > 0) {
+ int x = rect->xmin + w/2 - size/2;
+ int y = rect->ymin + h/2 - size/2;
+
+ UI_icon_draw_preview_aspect_size(x, y, icon, 1.0f, size);
+ }
}
@@ -770,7 +776,7 @@ static void widget_draw_icon(uiBut *but, BIFIconID icon, float alpha, rcti *rect
float aspect, height;
if (but->flag & UI_ICON_PREVIEW) {
- widget_draw_preview(icon, but->block->aspect, alpha, rect);
+ widget_draw_preview(icon, alpha, rect);
return;
}
@@ -865,28 +871,42 @@ static void ui_text_leftclip(uiFontStyle *fstyle, uiBut *but, rcti *rect)
if (fstyle->kerning==1) /* for BLF_width */
BLF_enable(fstyle->uifont_id, BLF_KERNING_DEFAULT);
- but->strwidth= BLF_width(fstyle->uifont_id, but->drawstr);
- but->ofs= 0;
+ /* if text editing we define ofs dynamically */
+ if(but->editstr && but->pos >= 0) {
+ if(but->ofs > but->pos)
+ but->ofs= but->pos;
+ }
+ else but->ofs= 0;
- while(but->strwidth > okwidth ) {
-
- but->ofs++;
- but->strwidth= BLF_width(fstyle->uifont_id, but->drawstr+but->ofs);
+ but->strwidth= BLF_width(fstyle->uifont_id, but->drawstr + but->ofs);
+
+ while(but->strwidth > okwidth) {
- /* textbut exception */
- if(but->editstr && but->pos != -1) {
- int pos= but->pos+1;
+ /* textbut exception, clip right when... */
+ if(but->editstr && but->pos >= 0) {
+ float width;
+ char buf[256];
- if(pos-1 < but->ofs) {
- pos= but->ofs-pos+1;
- but->ofs -= pos;
- if(but->ofs<0) {
- but->ofs= 0;
- pos--;
- }
- but->drawstr[ strlen(but->drawstr)-pos ]= 0;
+ /* copy draw string */
+ BLI_strncpy(buf, but->drawstr, sizeof(buf));
+ /* string position of cursor */
+ buf[but->pos]= 0;
+ width= BLF_width(fstyle->uifont_id, buf+but->ofs);
+
+ /* if cursor is at 20 pixels of right side button we clip left */
+ if(width > okwidth-20)
+ but->ofs++;
+ else {
+ /* shift string to the left */
+ if(width < 20 && but->ofs > 0)
+ but->ofs--;
+ but->drawstr[ strlen(but->drawstr)-1 ]= 0;
}
}
+ else
+ but->ofs++;
+
+ but->strwidth= BLF_width(fstyle->uifont_id, but->drawstr+but->ofs);
if(but->strwidth < 10) break;
}
@@ -959,6 +979,9 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
// int transopts;
char *cpoin = NULL;
+ /* for underline drawing */
+ float font_xofs, font_yofs;
+
uiStyleFontSet(fstyle);
if(but->editstr || (but->flag & UI_TEXT_LEFT))
@@ -1036,7 +1059,40 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
}
glColor3ubv((unsigned char*)wcol->text);
- uiStyleFontDraw(fstyle, rect, but->drawstr+but->ofs);
+
+ uiStyleFontDrawExt(fstyle, rect, but->drawstr+but->ofs, &font_xofs, &font_yofs);
+
+ if(but->menu_key != '\0') {
+ char fixedbuf[128];
+ char *str;
+
+ BLI_strncpy(fixedbuf, but->drawstr + but->ofs, sizeof(fixedbuf));
+
+ str= strchr(fixedbuf, but->menu_key-32); /* upper case */
+ if(str==NULL)
+ str= strchr(fixedbuf, but->menu_key);
+
+ if(str) {
+ int ul_index= -1;
+ float ul_advance;
+
+ ul_index= (int)(str - fixedbuf);
+
+ if (fstyle->kerning == 1) {
+ BLF_enable(fstyle->uifont_id, BLF_KERNING_DEFAULT);
+ }
+
+ fixedbuf[ul_index]= '\0';
+ ul_advance= BLF_width(fstyle->uifont_id, fixedbuf);
+
+ BLF_position(fstyle->uifont_id, rect->xmin+font_xofs + ul_advance, rect->ymin+font_yofs, 0.0f);
+ BLF_draw(fstyle->uifont_id, "_", 2);
+
+ if (fstyle->kerning == 1) {
+ BLF_disable(fstyle->uifont_id, BLF_KERNING_DEFAULT);
+ }
+ }
+ }
/* part text right aligned */
if(cpoin) {
@@ -1054,7 +1110,10 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
if(but==NULL) return;
/* clip but->drawstr to fit in available space */
- if (ELEM4(but->type, NUM, NUMABS, NUMSLI, SLI)) {
+ if (but->editstr && but->pos >= 0) {
+ ui_text_leftclip(fstyle, but, rect);
+ }
+ else if (ELEM4(but->type, NUM, NUMABS, NUMSLI, SLI)) {
ui_text_label_rightclip(fstyle, but, rect);
}
else if (ELEM(but->type, TEX, SEARCH_MENU)) {
@@ -1117,7 +1176,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
*/
-static struct uiWidgetStateColors wcol_state= {
+static struct uiWidgetStateColors wcol_state_colors= {
{115, 190, 76, 255},
{90, 166, 51, 255},
{240, 235, 100, 255},
@@ -1387,12 +1446,12 @@ void ui_widget_color_init(ThemeUI *tui)
tui->wcol_list_item= wcol_list_item;
tui->wcol_progress= wcol_progress;
- tui->wcol_state= wcol_state;
+ tui->wcol_state= wcol_state_colors;
}
/* ************ button callbacks, state ***************** */
-static void widget_state_blend(char *cp, char *cpstate, float fac)
+static void widget_state_blend(char *cp, const char *cpstate, const float fac)
{
if(fac != 0.0f) {
cp[0]= (int)((1.0f-fac)*cp[0] + fac*cpstate[0]);
@@ -1484,13 +1543,13 @@ static void widget_state_label(uiWidgetType *wt, int state)
widget_state(wt, state);
if(state & UI_SELECT)
- UI_GetThemeColor4ubv(TH_TEXT_HI, wt->wcol.text);
+ UI_GetThemeColor4ubv(TH_TEXT_HI, (unsigned char *)wt->wcol.text);
else
- UI_GetThemeColor4ubv(TH_TEXT, wt->wcol.text);
+ UI_GetThemeColor4ubv(TH_TEXT, (unsigned char *)wt->wcol.text);
}
-static void widget_state_nothing(uiWidgetType *wt, int state)
+static void widget_state_nothing(uiWidgetType *wt, int UNUSED(state))
{
wt->wcol= *(wt->wcol_theme);
}
@@ -1644,7 +1703,7 @@ void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect)
/* gouraud triangle fan */
float radstep, ang= 0.0f;
float centx, centy, radius;
- float rgb[3], hsv[3], hsvo[3], col[3], colcent[3];
+ float rgb[3], hsvo[3], hsv[3], col[3], colcent[3];
int a, tot= 32;
int color_profile = but->block->color_profile;
@@ -1662,7 +1721,8 @@ void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect)
/* color */
ui_get_but_vectorf(but, rgb);
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+ copy_v3_v3(hsv, ui_block_hsv_get(but->block));
+ rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
copy_v3_v3(hsvo, hsv);
/* exception: if 'lock' is set
@@ -1722,16 +1782,14 @@ void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect)
/* ************ custom buttons, old stuff ************** */
/* draws in resolution of 20x4 colors */
-void ui_draw_gradient(rcti *rect, float *rgb, int type, float alpha)
+void ui_draw_gradient(rcti *rect, float *hsv, int type, float alpha)
{
int a;
- float h, s, v;
+ float h= hsv[0], s= hsv[1], v= hsv[2];
float dx, dy, sx1, sx2, sy;
float col0[4][3]; // left half, rect bottom to top
float col1[4][3]; // right half, rect bottom to top
-
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], &h, &s, &v);
-
+
/* draw series of gouraud rects */
glShadeModel(GL_SMOOTH);
@@ -1772,6 +1830,12 @@ void ui_draw_gradient(rcti *rect, float *rgb, int type, float alpha)
VECCOPY(col1[1], col1[2]);
VECCOPY(col1[3], col1[2]);
break;
+ default:
+ assert(!"invalid 'type' argument");
+ hsv_to_rgb(1.0, 1.0, 1.0, &col1[2][0], &col1[2][1], &col1[2][2]);
+ VECCOPY(col1[0], col1[2]);
+ VECCOPY(col1[1], col1[2]);
+ VECCOPY(col1[3], col1[2]);
}
/* old below */
@@ -1856,11 +1920,21 @@ static void ui_draw_but_HSVCUBE(uiBut *but, rcti *rect)
{
float rgb[3], h,s,v;
float x=0.0f, y=0.0f;
+ float *hsv= ui_block_hsv_get(but->block);
+ float hsvn[3];
+
+ h= hsv[0];
+ s= hsv[1];
+ v= hsv[2];
ui_get_but_vectorf(but, rgb);
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], &h, &s, &v);
+ rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], &h, &s, &v);
+
+ hsvn[0]= h;
+ hsvn[1]= s;
+ hsvn[2]= v;
- ui_draw_gradient(rect, rgb, but->a1, 1.f);
+ ui_draw_gradient(rect, hsvn, but->a1, 1.f);
switch((int)but->a1) {
case UI_GRAD_SV:
@@ -1938,7 +2012,7 @@ static void ui_draw_but_HSV_v(uiBut *but, rcti *rect)
/* ************ separator, for menus etc ***************** */
-static void ui_draw_separator(uiBut *but, rcti *rect, uiWidgetColors *wcol)
+static void ui_draw_separator(rcti *rect, uiWidgetColors *wcol)
{
int y = rect->ymin + (rect->ymax - rect->ymin)/2 - 1;
unsigned char col[4];
@@ -2110,7 +2184,7 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat
}
}
-static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int UNUSED(roundboxalign))
{
rcti rect1;
double value;
@@ -2171,7 +2245,7 @@ static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
uiWidgetScrollDraw(wcol, rect, &rect1, state);
}
-static void widget_progressbar(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_progressbar(uiBut *but, uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int UNUSED(roundboxalign))
{
rcti rect_prog = *rect, rect_bar = *rect;
float value = but->a1;
@@ -2197,7 +2271,7 @@ static void widget_progressbar(uiBut *but, uiWidgetColors *wcol, rcti *rect, int
rect->xmin -= 6;
}
-static void widget_link(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_link(uiBut *but, uiWidgetColors *UNUSED(wcol), rcti *rect, int UNUSED(state), int UNUSED(roundboxalign))
{
if(but->flag & UI_SELECT) {
@@ -2219,7 +2293,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
uiWidgetBase wtb, wtb1;
rcti rect1;
double value;
- float offs, fac;
+ float offs, toffs, fac;
char outline[3];
widget_init(&wtb);
@@ -2229,6 +2303,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
/* fully rounded */
offs= 0.5f*(rect->ymax - rect->ymin);
+ toffs = offs*0.75f;
round_box_edges(&wtb, roundboxalign, rect, offs);
wtb.outline= 0;
@@ -2274,10 +2349,13 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
widgetbase_draw(&wtb, wcol);
/* text space */
- rect->xmin += offs*0.75f;
- rect->xmax -= offs*0.75f;
+ rect->xmin += toffs;
+ rect->xmax -= toffs;
}
+/* I think 3 is sufficient border to indicate keyed status */
+#define SWATCH_KEYED_BORDER 3
+
static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
{
uiWidgetBase wtb;
@@ -2302,6 +2380,19 @@ static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
ui_get_but_vectorf(but, col);
+ if(state & (UI_BUT_ANIMATED|UI_BUT_ANIMATED_KEY|UI_BUT_DRIVEN|UI_BUT_REDALERT)) {
+ // draw based on state - color for keyed etc
+ widgetbase_draw(&wtb, wcol);
+
+ // inset to draw swatch color
+ rect->xmin+= SWATCH_KEYED_BORDER;
+ rect->xmax-= SWATCH_KEYED_BORDER;
+ rect->ymin+= SWATCH_KEYED_BORDER;
+ rect->ymax-= SWATCH_KEYED_BORDER;
+
+ round_box_edges(&wtb, roundboxalign, rect, 5.0f);
+ }
+
if (color_profile)
linearrgb_to_srgb_v3_v3(col, col);
@@ -2316,6 +2407,20 @@ static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
}
+static void widget_icon_has_anim(uiBut *UNUSED(but), uiWidgetColors *wcol, rcti *rect, int state, int UNUSED(roundboxalign))
+{
+ if(state & (UI_BUT_ANIMATED|UI_BUT_ANIMATED_KEY|UI_BUT_DRIVEN|UI_BUT_REDALERT)) {
+ uiWidgetBase wtb;
+
+ widget_init(&wtb);
+ wtb.outline= 0;
+
+ /* rounded */
+ round_box_edges(&wtb, 15, rect, 10.0f);
+ widgetbase_draw(&wtb, wcol);
+ }
+}
+
static void widget_textbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
{
@@ -2334,7 +2439,7 @@ static void widget_textbut(uiWidgetColors *wcol, rcti *rect, int state, int roun
}
-static void widget_menubut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_menubut(uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int roundboxalign)
{
uiWidgetBase wtb;
@@ -2352,7 +2457,7 @@ static void widget_menubut(uiWidgetColors *wcol, rcti *rect, int state, int roun
rect->xmax -= (rect->ymax-rect->ymin);
}
-static void widget_menuiconbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_menuiconbut(uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int roundboxalign)
{
uiWidgetBase wtb;
@@ -2365,7 +2470,7 @@ static void widget_menuiconbut(uiWidgetColors *wcol, rcti *rect, int state, int
widgetbase_draw(&wtb, wcol);
}
-static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int UNUSED(roundboxalign))
{
if(state & UI_ACTIVE) {
uiWidgetBase wtb;
@@ -2380,7 +2485,7 @@ static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int
}
}
-static void widget_menu_itembut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_menu_itembut(uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int UNUSED(roundboxalign))
{
uiWidgetBase wtb;
@@ -2393,7 +2498,7 @@ static void widget_menu_itembut(uiWidgetColors *wcol, rcti *rect, int state, int
widgetbase_draw(&wtb, wcol);
}
-static void widget_list_itembut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_list_itembut(uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int UNUSED(roundboxalign))
{
uiWidgetBase wtb;
@@ -2406,7 +2511,7 @@ static void widget_list_itembut(uiWidgetColors *wcol, rcti *rect, int state, int
widgetbase_draw(&wtb, wcol);
}
-static void widget_optionbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_optionbut(uiWidgetColors *wcol, rcti *rect, int state, int UNUSED(roundboxalign))
{
uiWidgetBase wtb;
rcti recttemp= *rect;
@@ -2439,7 +2544,7 @@ static void widget_optionbut(uiWidgetColors *wcol, rcti *rect, int state, int ro
}
-static void widget_radiobut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_radiobut(uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int roundboxalign)
{
uiWidgetBase wtb;
@@ -2452,7 +2557,7 @@ static void widget_radiobut(uiWidgetColors *wcol, rcti *rect, int state, int rou
}
-static void widget_box(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_box(uiBut *but, uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int roundboxalign)
{
uiWidgetBase wtb;
char old_col[3];
@@ -2461,13 +2566,11 @@ static void widget_box(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state,
VECCOPY(old_col, wcol->inner);
- /* abuse but->hsv - if it's non-zero, use this colour as the box's background */
- if ((but->hsv[0] != 0.0) || (but->hsv[1] != 0.0) || (but->hsv[2] != 0.0)) {
- float rgb[3];
- hsv_to_rgb(but->hsv[0], but->hsv[1], but->hsv[2], rgb+0, rgb+1, rgb+2);
- wcol->inner[0] = rgb[0] * 255;
- wcol->inner[1] = rgb[1] * 255;
- wcol->inner[2] = rgb[2] * 255;
+ /* abuse but->hsv - if it's non-zero, use this color as the box's background */
+ if (but->col[3]) {
+ wcol->inner[0] = but->col[0];
+ wcol->inner[1] = but->col[1];
+ wcol->inner[2] = but->col[2];
}
/* half rounded */
@@ -2482,7 +2585,7 @@ static void widget_box(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state,
VECCOPY(wcol->inner, old_col);
}
-static void widget_but(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_but(uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int roundboxalign)
{
uiWidgetBase wtb;
@@ -2495,7 +2598,7 @@ static void widget_but(uiWidgetColors *wcol, rcti *rect, int state, int roundbox
}
-static void widget_roundbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_roundbut(uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int roundboxalign)
{
uiWidgetBase wtb;
float rad= 5.0f; //0.5f*(rect->ymax - rect->ymin);
@@ -2511,7 +2614,7 @@ static void widget_roundbut(uiWidgetColors *wcol, rcti *rect, int state, int rou
static void widget_draw_extra_mask(const bContext *C, uiBut *but, uiWidgetType *wt, rcti *rect)
{
uiWidgetBase wtb;
- char col[4];
+ unsigned char col[4];
/* state copy! */
wt->wcol= *(wt->wcol_theme);
@@ -2524,7 +2627,7 @@ static void widget_draw_extra_mask(const bContext *C, uiBut *but, uiWidgetType *
/* make mask to draw over image */
UI_GetThemeColor3ubv(TH_BACK, col);
- glColor3ubv((unsigned char*)col);
+ glColor3ubv(col);
round_box__edges(&wtb, 15, rect, 0.0f, 4.0);
widgetbase_outline(&wtb);
@@ -2661,7 +2764,7 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type)
/* specials */
case UI_WTYPE_ICON:
- wt.draw= NULL;
+ wt.custom= widget_icon_has_anim;
break;
case UI_WTYPE_SWATCH:
@@ -2760,7 +2863,7 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
widget_draw_text_icon(&style->widgetlabel, &tui->wcol_menu_back, but, rect);
break;
case SEPR:
- ui_draw_separator(but, rect, &tui->wcol_menu_item);
+ ui_draw_separator(rect, &tui->wcol_menu_item);
break;
default:
@@ -2872,7 +2975,7 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
break;
case HSVCUBE:
- if(but->a1==9) // vertical V slider, uses new widget draw now
+ if(but->a1 == UI_GRAD_V_ALT) // vertical V slider, uses new widget draw now
ui_draw_but_HSV_v(but, rect);
else // other HSV pickers...
ui_draw_but_HSVCUBE(but, rect);
@@ -2946,7 +3049,7 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
}
}
-void ui_draw_menu_back(uiStyle *style, uiBlock *block, rcti *rect)
+void ui_draw_menu_back(uiStyle *UNUSED(style), uiBlock *block, rcti *rect)
{
uiWidgetType *wt= widget_type(UI_WTYPE_MENU_BACK);
@@ -2958,7 +3061,7 @@ void ui_draw_menu_back(uiStyle *style, uiBlock *block, rcti *rect)
}
-void ui_draw_search_back(uiStyle *style, uiBlock *block, rcti *rect)
+void ui_draw_search_back(uiStyle *UNUSED(style), uiBlock *block, rcti *rect)
{
uiWidgetType *wt= widget_type(UI_WTYPE_BOX);
@@ -2977,7 +3080,7 @@ void ui_draw_search_back(uiStyle *style, uiBlock *block, rcti *rect)
/* helper call to draw a menu item without button */
/* state: UI_ACTIVE or 0 */
-void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, char *name, int iconid, int state)
+void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, const char *name, int iconid, int state)
{
uiWidgetType *wt= widget_type(UI_WTYPE_MENU_ITEM);
rcti _rect= *rect;
@@ -3023,7 +3126,7 @@ void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, char *name, int iconid,
}
}
-void ui_draw_preview_item(uiFontStyle *fstyle, rcti *rect, char *name, int iconid, int state)
+void ui_draw_preview_item(uiFontStyle *fstyle, rcti *rect, const char *name, int iconid, int state)
{
rcti trect = *rect;
@@ -3032,7 +3135,7 @@ void ui_draw_preview_item(uiFontStyle *fstyle, rcti *rect, char *name, int iconi
wt->state(wt, state);
wt->draw(&wt->wcol, rect, 0, 0);
- widget_draw_preview(iconid, 1.f, 1.f, rect);
+ widget_draw_preview(iconid, 1.0f, rect);
if (state == UI_ACTIVE)
glColor3ubv((unsigned char*)wt->wcol.text);
diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c
index c250cdb1284..52e9a395c4e 100644
--- a/source/blender/editors/interface/resources.c
+++ b/source/blender/editors/interface/resources.c
@@ -36,7 +36,6 @@
#include "MEM_guardedalloc.h"
-
#include "DNA_curve_types.h"
#include "DNA_userdef_types.h"
#include "DNA_screen_types.h"
@@ -44,13 +43,13 @@
#include "DNA_windowmanager_types.h"
#include "BLI_blenlib.h"
-
+#include "BLI_utildefines.h"
#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "BIF_gl.h"
@@ -81,14 +80,14 @@ void ui_resources_free(void)
/* THEMES */
/* ******************************************************** */
-char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
+const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
{
ThemeSpace *ts= NULL;
static char error[4]={240, 0, 240, 255};
static char alert[4]={240, 60, 60, 255};
static char headerdesel[4]={0,0,0,255};
- char *cp= error;
+ const char *cp= error;
if(btheme) {
@@ -285,6 +284,12 @@ char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
cp= ts->face_dot; break;
case TH_FACEDOT_SIZE:
cp= &ts->facedot_size; break;
+ case TH_DRAWEXTRA_EDGELEN:
+ cp= ts->extra_edge_len; break;
+ case TH_DRAWEXTRA_FACEAREA:
+ cp= ts->extra_face_area; break;
+ case TH_DRAWEXTRA_FACEANG:
+ cp= ts->extra_face_angle; break;
case TH_NORMAL:
cp= ts->normal; break;
case TH_VNORMAL:
@@ -402,7 +407,7 @@ char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
}
}
- return cp;
+ return (unsigned char *)cp;
}
#define SETCOLTEST(col, r, g, b, a) if(col[3]==0) {col[0]=r; col[1]=g; col[2]= b; col[3]= a;}
@@ -461,7 +466,7 @@ static void ui_theme_init_new(bTheme *btheme)
*/
void ui_theme_init_default(void)
{
- bTheme *btheme= U.themes.first;
+ bTheme *btheme;
/* we search for the theme with name Default */
for(btheme= U.themes.first; btheme; btheme= btheme->next) {
@@ -515,6 +520,11 @@ void ui_theme_init_default(void)
SETCOL(btheme->tv3d.vertex_normal, 0x23, 0x61, 0xDD, 255);
SETCOL(btheme->tv3d.face_dot, 255, 133, 0, 255);
btheme->tv3d.facedot_size= 4;
+
+ SETCOL(btheme->tv3d.extra_edge_len, 32, 0, 0, 255);
+ SETCOL(btheme->tv3d.extra_face_area, 0, 32, 0, 255);
+ SETCOL(btheme->tv3d.extra_face_angle, 0, 0, 128, 255);
+
SETCOL(btheme->tv3d.cframe, 0x60, 0xc0, 0x40, 255);
SETCOL(btheme->tv3d.nurb_uline, 0x90, 0x90, 0x00, 255);
@@ -709,20 +719,20 @@ void UI_SetTheme(int spacetype, int regionid)
// for space windows only
void UI_ThemeColor(int colorid)
{
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
- glColor3ub(cp[0], cp[1], cp[2]);
+ glColor3ubv(cp);
}
// plus alpha
void UI_ThemeColor4(int colorid)
{
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
- glColor4ub(cp[0], cp[1], cp[2], cp[3]);
+ glColor4ubv(cp);
}
@@ -730,7 +740,7 @@ void UI_ThemeColor4(int colorid)
void UI_ThemeColorShade(int colorid, int offset)
{
int r, g, b;
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
r= offset + (int) cp[0];
@@ -745,7 +755,7 @@ void UI_ThemeColorShade(int colorid, int offset)
void UI_ThemeColorShadeAlpha(int colorid, int coloffset, int alphaoffset)
{
int r, g, b, a;
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
r= coloffset + (int) cp[0];
@@ -763,7 +773,7 @@ void UI_ThemeColorShadeAlpha(int colorid, int coloffset, int alphaoffset)
void UI_ThemeColorBlend(int colorid1, int colorid2, float fac)
{
int r, g, b;
- char *cp1, *cp2;
+ const unsigned char *cp1, *cp2;
cp1= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid1);
cp2= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid2);
@@ -780,7 +790,7 @@ void UI_ThemeColorBlend(int colorid1, int colorid2, float fac)
void UI_ThemeColorBlendShade(int colorid1, int colorid2, float fac, int offset)
{
int r, g, b;
- char *cp1, *cp2;
+ const unsigned char *cp1, *cp2;
cp1= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid1);
cp2= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid2);
@@ -801,7 +811,7 @@ void UI_ThemeColorBlendShade(int colorid1, int colorid2, float fac, int offset)
void UI_ThemeColorBlendShadeAlpha(int colorid1, int colorid2, float fac, int offset, int alphaoffset)
{
int r, g, b, a;
- char *cp1, *cp2;
+ const unsigned char *cp1, *cp2;
cp1= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid1);
cp2= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid2);
@@ -824,7 +834,7 @@ void UI_ThemeColorBlendShadeAlpha(int colorid1, int colorid2, float fac, int off
// get individual values, not scaled
float UI_GetThemeValuef(int colorid)
{
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
return ((float)cp[0]);
@@ -834,7 +844,7 @@ float UI_GetThemeValuef(int colorid)
// get individual values, not scaled
int UI_GetThemeValue(int colorid)
{
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
return ((int) cp[0]);
@@ -845,7 +855,7 @@ int UI_GetThemeValue(int colorid)
// get the color, range 0.0-1.0
void UI_GetThemeColor3fv(int colorid, float *col)
{
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
col[0]= ((float)cp[0])/255.0;
@@ -857,7 +867,7 @@ void UI_GetThemeColor3fv(int colorid, float *col)
void UI_GetThemeColorShade3fv(int colorid, int offset, float *col)
{
int r, g, b;
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
@@ -874,9 +884,9 @@ void UI_GetThemeColorShade3fv(int colorid, int offset, float *col)
}
// get the color, in char pointer
-void UI_GetThemeColor3ubv(int colorid, char *col)
+void UI_GetThemeColor3ubv(int colorid, unsigned char col[3])
{
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
col[0]= cp[0];
@@ -885,9 +895,9 @@ void UI_GetThemeColor3ubv(int colorid, char *col)
}
// get the color, in char pointer
-void UI_GetThemeColor4ubv(int colorid, char *col)
+void UI_GetThemeColor4ubv(int colorid, unsigned char col[4])
{
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
col[0]= cp[0];
@@ -896,9 +906,9 @@ void UI_GetThemeColor4ubv(int colorid, char *col)
col[3]= cp[3];
}
-void UI_GetThemeColorType4ubv(int colorid, int spacetype, char *col)
+void UI_GetThemeColorType4ubv(int colorid, int spacetype, char col[4])
{
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, spacetype, colorid);
col[0]= cp[0];
@@ -908,7 +918,7 @@ void UI_GetThemeColorType4ubv(int colorid, int spacetype, char *col)
}
// blends and shades between two char color pointers
-void UI_ColorPtrBlendShade3ubv(char *cp1, char *cp2, float fac, int offset)
+void UI_ColorPtrBlendShade3ubv(const unsigned char cp1[3], const unsigned char cp2[3], float fac, int offset)
{
int r, g, b;
@@ -925,7 +935,7 @@ void UI_ColorPtrBlendShade3ubv(char *cp1, char *cp2, float fac, int offset)
}
// get a 3 byte color, blended and shaded between two other char color pointers
-void UI_GetColorPtrBlendShade3ubv(char *cp1, char *cp2, char *col, float fac, int offset)
+void UI_GetColorPtrBlendShade3ubv(const unsigned char cp1[3], const unsigned char cp2[3], unsigned char col[3], float fac, int offset)
{
int r, g, b;
@@ -951,26 +961,27 @@ void UI_ThemeClearColor(int colorid)
glClearColor(col[0], col[1], col[2], 0.0);
}
-void UI_make_axis_color(char *src_col, char *dst_col, char axis)
+void UI_make_axis_color(const unsigned char src_col[3], unsigned char dst_col[3], const char axis)
{
switch(axis)
{
- case 'x':
case 'X':
dst_col[0]= src_col[0]>219?255:src_col[0]+36;
dst_col[1]= src_col[1]<26?0:src_col[1]-26;
dst_col[2]= src_col[2]<26?0:src_col[2]-26;
break;
- case 'y':
case 'Y':
dst_col[0]= src_col[0]<46?0:src_col[0]-36;
dst_col[1]= src_col[1]>189?255:src_col[1]+66;
dst_col[2]= src_col[2]<46?0:src_col[2]-36;
break;
- default:
+ case 'Z':
dst_col[0]= src_col[0]<26?0:src_col[0]-26;
dst_col[1]= src_col[1]<26?0:src_col[1]-26;
dst_col[2]= src_col[2]>209?255:src_col[2]+46;
+ break;
+ default:
+ BLI_assert(!"invalid axis arg");
}
}
@@ -1004,7 +1015,7 @@ void init_userdef_do_versions(void)
}
if (U.savetime <= 0) {
U.savetime = 1;
-// XXX error("startup.blend is buggy, please consider removing it.\n");
+// XXX error(STRINGIFY(BLENDER_STARTUP_FILE)" is buggy, please consider removing it.\n");
}
/* transform widget settings */
if(U.tw_hotspot==0) {
@@ -1184,7 +1195,7 @@ void init_userdef_do_versions(void)
if ((bmain->versionfile < 245) || (bmain->versionfile == 245 && bmain->subversionfile < 11)) {
bTheme *btheme;
for (btheme= U.themes.first; btheme; btheme= btheme->next) {
- /* these should all use the same colour */
+ /* these should all use the same color */
SETCOL(btheme->tv3d.cframe, 0x60, 0xc0, 0x40, 255);
SETCOL(btheme->tipo.cframe, 0x60, 0xc0, 0x40, 255);
SETCOL(btheme->tact.cframe, 0x60, 0xc0, 0x40, 255);
@@ -1490,6 +1501,20 @@ void init_userdef_do_versions(void)
btheme->tui.wcol_progress= wcol_progress;
}
}
+
+ if (bmain->versionfile < 255 || (bmain->versionfile == 255 && bmain->subversionfile < 2)) {
+ bTheme *btheme;
+ for(btheme= U.themes.first; btheme; btheme= btheme->next) {
+ SETCOL(btheme->tv3d.extra_edge_len, 32, 0, 0, 255);
+ SETCOL(btheme->tv3d.extra_face_angle, 0, 32, 0, 255);
+ SETCOL(btheme->tv3d.extra_face_area, 0, 0, 128, 255);
+ }
+ }
+
+ if (bmain->versionfile < 257) {
+ /* clear "AUTOKEY_FLAG_ONLYKEYINGSET" flag from userprefs, so that it doesn't linger around from old configs like a ghost */
+ U.autokey_flag &= ~AUTOKEY_FLAG_ONLYKEYINGSET;
+ }
/* GL Texture Garbage Collection (variable abused above!) */
if (U.textimeout == 0) {
@@ -1506,7 +1531,7 @@ void init_userdef_do_versions(void)
U.dbl_click_time = 350;
}
if (U.anim_player_preset == 0) {
- U.anim_player_preset =1 ;
+ U.anim_player_preset = 1 ;
}
if (U.scrcastfps == 0) {
U.scrcastfps = 10;
@@ -1515,6 +1540,8 @@ void init_userdef_do_versions(void)
if (U.v2d_min_gridsize == 0) {
U.v2d_min_gridsize= 35;
}
+ if (U.dragthreshold == 0 )
+ U.dragthreshold= 5;
/* funny name, but it is GE stuff, moves userdef stuff to engine */
// XXX space_set_commmandline_options();
diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c
index 14ec7c6d0d6..245905418ec 100644
--- a/source/blender/editors/interface/view2d.c
+++ b/source/blender/editors/interface/view2d.c
@@ -36,10 +36,11 @@
#include "DNA_userdef_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
+
#include "WM_api.h"
@@ -57,6 +58,9 @@
/* *********************************************************************** */
+/* XXX still unresolved: scrolls hide/unhide vs region mask handling */
+/* XXX there's V2D_SCROLL_HORIZONTAL_HIDE and V2D_SCROLL_HORIZONTAL_FULLR ... */
+
/* helper to allow scrollbars to dynamically hide
* - returns a copy of the scrollbar settings with the flags to display
* horizontal/vertical scrollbars removed
@@ -83,6 +87,7 @@ static void view2d_masks(View2D *v2d)
v2d->mask.ymax= v2d->winy - 1;
#if 0
+ // XXX see above
v2d->scroll &= ~(V2D_SCROLL_HORIZONTAL_HIDE|V2D_SCROLL_VERTICAL_HIDE);
/* check size if: */
if (v2d->scroll & V2D_SCROLL_HORIZONTAL)
@@ -250,8 +255,6 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy)
/* absolutely no scrollers allowed */
v2d->scroll= 0;
- /* pixel offsets need to be applied for smooth UI controls */
- v2d->flag |= (V2D_PIXELOFS_X|V2D_PIXELOFS_Y);
}
break;
@@ -845,7 +848,7 @@ void UI_view2d_totRect_set_resize (View2D *v2d, int width, int height, int resiz
if (ELEM3(0, v2d, width, height)) {
if (G.f & G_DEBUG)
- printf("Error: View2D totRect set exiting: v2d=%p width=%d height=%d \n", v2d, width, height); // XXX temp debug info
+ printf("Error: View2D totRect set exiting: v2d=%p width=%d height=%d \n", (void *)v2d, width, height); // XXX temp debug info
return;
}
@@ -967,7 +970,7 @@ static void view2d_map_cur_using_mask(View2D *v2d, rctf *curmasked)
}
/* Set view matrices to use 'cur' rect as viewing frame for View2D drawing */
-void UI_view2d_view_ortho(const bContext *C, View2D *v2d)
+void UI_view2d_view_ortho(View2D *v2d)
{
rctf curmasked;
float xofs, yofs;
@@ -975,10 +978,6 @@ void UI_view2d_view_ortho(const bContext *C, View2D *v2d)
/* pixel offsets (-0.375f) are needed to get 1:1 correspondance with pixels for smooth UI drawing,
* but only applied where requsted
*/
- /* XXX ton: fix this! */
- xofs= 0.0; // (v2d->flag & V2D_PIXELOFS_X) ? 0.375f : 0.0f;
- yofs= 0.0; // (v2d->flag & V2D_PIXELOFS_Y) ? 0.375f : 0.0f;
-
/* XXX brecht: instead of zero at least use a tiny offset, otherwise
* pixel rounding is effectively random due to float inaccuracy */
xofs= 0.001f*(v2d->cur.xmax - v2d->cur.xmin)/(v2d->mask.xmax - v2d->mask.xmin);
@@ -987,6 +986,19 @@ void UI_view2d_view_ortho(const bContext *C, View2D *v2d)
/* apply mask-based adjustments to cur rect (due to scrollers), to eliminate scaling artifacts */
view2d_map_cur_using_mask(v2d, &curmasked);
+ curmasked.xmin-= xofs; curmasked.xmax-=xofs;
+ curmasked.ymin-= yofs; curmasked.ymax-=yofs;
+
+ /* XXX ton: this flag set by outliner, for icons */
+ if(v2d->flag & V2D_PIXELOFS_X) {
+ curmasked.xmin= floor(curmasked.xmin) - 0.001f;
+ curmasked.xmax= floor(curmasked.xmax) - 0.001f;
+ }
+ if(v2d->flag & V2D_PIXELOFS_Y) {
+ curmasked.ymin= floor(curmasked.ymin) - 0.001f;
+ curmasked.ymax= floor(curmasked.ymax) - 0.001f;
+ }
+
/* set matrix on all appropriate axes */
wmOrtho2(curmasked.xmin-xofs, curmasked.xmax-xofs, curmasked.ymin-yofs, curmasked.ymax-yofs);
@@ -997,9 +1009,8 @@ void UI_view2d_view_ortho(const bContext *C, View2D *v2d)
/* Set view matrices to only use one axis of 'cur' only
* - xaxis = if non-zero, only use cur x-axis, otherwise use cur-yaxis (mostly this will be used for x)
*/
-void UI_view2d_view_orthoSpecial(const bContext *C, View2D *v2d, short xaxis)
+void UI_view2d_view_orthoSpecial(ARegion *ar, View2D *v2d, short xaxis)
{
- ARegion *ar= CTX_wm_region(C);
rctf curmasked;
float xofs, yofs;
@@ -1070,7 +1081,7 @@ static void step_to_grid(float *step, int *power, int unit)
/* for frames, we want 1.0 frame intervals only */
if (unit == V2D_UNIT_FRAMES) {
rem = 1.0f;
- *step = 1.0f;
+ *step = 2.0f; /* use 2 since there are grid lines drawn in between, this way to get 1 line per frane */
}
/* prevents printing 1.0 2.0 3.0 etc */
@@ -1098,15 +1109,14 @@ static void step_to_grid(float *step, int *power, int unit)
*
* - xunits,yunits = V2D_UNIT_* grid steps in seconds or frames
* - xclamp,yclamp = V2D_CLAMP_* only show whole-number intervals
- * - winx = width of region we're drawing to
+ * - winx = width of region we're drawing to, note: not used but keeping for completeness.
* - winy = height of region we're drawing into
*/
-View2DGrid *UI_view2d_grid_calc(const bContext *C, View2D *v2d, short xunits, short xclamp, short yunits, short yclamp, int winx, int winy)
+View2DGrid *UI_view2d_grid_calc(Scene *scene, View2D *v2d, short xunits, short xclamp, short yunits, short yclamp, int UNUSED(winx), int winy)
{
- Scene *scene= CTX_data_scene(C);
+
View2DGrid *grid;
float space, pixels, seconddiv;
- int secondgrid;
/* check that there are at least some workable args */
if (ELEM(V2D_ARG_DUMMY, xunits, xclamp) && ELEM(V2D_ARG_DUMMY, yunits, yclamp))
@@ -1117,11 +1127,9 @@ View2DGrid *UI_view2d_grid_calc(const bContext *C, View2D *v2d, short xunits, sh
/* rule: gridstep is minimal GRIDSTEP pixels */
if (xunits == V2D_UNIT_SECONDS) {
- secondgrid= 1;
seconddiv= (float)(0.01 * FPS);
}
else {
- secondgrid= 0;
seconddiv= 1.0f;
}
@@ -1130,9 +1138,11 @@ View2DGrid *UI_view2d_grid_calc(const bContext *C, View2D *v2d, short xunits, sh
space= v2d->cur.xmax - v2d->cur.xmin;
pixels= (float)(v2d->mask.xmax - v2d->mask.xmin);
- grid->dx= (U.v2d_min_gridsize * space) / (seconddiv * pixels);
- step_to_grid(&grid->dx, &grid->powerx, xunits);
- grid->dx *= seconddiv;
+ if(pixels!=0.0f) {
+ grid->dx= (U.v2d_min_gridsize * space) / (seconddiv * pixels);
+ step_to_grid(&grid->dx, &grid->powerx, xunits);
+ grid->dx *= seconddiv;
+ }
if (xclamp == V2D_GRID_CLAMP) {
if (grid->dx < 0.1f) grid->dx= 0.1f;
@@ -1174,7 +1184,7 @@ View2DGrid *UI_view2d_grid_calc(const bContext *C, View2D *v2d, short xunits, sh
}
/* Draw gridlines in the given 2d-region */
-void UI_view2d_grid_draw(const bContext *C, View2D *v2d, View2DGrid *grid, int flag)
+void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag)
{
float vec1[2], vec2[2];
int a, step;
@@ -1283,7 +1293,7 @@ void UI_view2d_grid_draw(const bContext *C, View2D *v2d, View2DGrid *grid, int f
}
/* Draw a constant grid in given 2d-region */
-void UI_view2d_constant_grid_draw(const bContext *C, View2D *v2d)
+void UI_view2d_constant_grid_draw(View2D *v2d)
{
float start, step= 25.0f;
@@ -1481,7 +1491,7 @@ View2DScrollers *UI_view2d_scrollers_calc(const bContext *C, View2D *v2d, short
scrollers->yclamp= yclamp;
scrollers->yunits= yunits;
- scrollers->grid= UI_view2d_grid_calc(C, v2d, xunits, xclamp, yunits, yclamp, (hor.xmax - hor.xmin), (vert.ymax - vert.ymin));
+ scrollers->grid= UI_view2d_grid_calc(CTX_data_scene(C), v2d, xunits, xclamp, yunits, yclamp, (hor.xmax - hor.xmin), (vert.ymax - vert.ymin));
}
/* return scrollers */
@@ -1489,7 +1499,7 @@ View2DScrollers *UI_view2d_scrollers_calc(const bContext *C, View2D *v2d, short
}
/* Print scale marking along a time scrollbar */
-static void scroll_printstr(View2DScrollers *scrollers, Scene *scene, float x, float y, float val, int power, short unit, char dir)
+static void scroll_printstr(Scene *scene, float x, float y, float val, int power, short unit, char dir)
{
int len;
char str[32];
@@ -1526,7 +1536,7 @@ static void scroll_printstr(View2DScrollers *scrollers, Scene *scene, float x, f
}
/* draw it */
- BLF_draw_default(x, y, 0.0f, str);
+ BLF_draw_default(x, y, 0.0f, str, sizeof(str)-1);
}
/* Draw scrollbars in the given 2d-region */
@@ -1570,6 +1580,9 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v
state |= UI_SCROLL_ARROWS;
}
+ UI_ThemeColor(TH_BACK);
+ glRecti(v2d->hor.xmin, v2d->hor.ymin, v2d->hor.xmax, v2d->hor.ymax);
+
uiWidgetScrollDraw(&wcol, &hor, &slider, state);
}
@@ -1614,16 +1627,16 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v
switch (vs->xunits) {
case V2D_UNIT_FRAMES: /* frames (as whole numbers)*/
- scroll_printstr(vs, scene, fac, h, val, grid->powerx, V2D_UNIT_FRAMES, 'h');
+ scroll_printstr(scene, fac, h, val, grid->powerx, V2D_UNIT_FRAMES, 'h');
break;
case V2D_UNIT_FRAMESCALE: /* frames (not always as whole numbers) */
- scroll_printstr(vs, scene, fac, h, val, grid->powerx, V2D_UNIT_FRAMESCALE, 'h');
+ scroll_printstr(scene, fac, h, val, grid->powerx, V2D_UNIT_FRAMESCALE, 'h');
break;
case V2D_UNIT_SECONDS: /* seconds */
fac2= val/(float)FPS;
- scroll_printstr(vs, scene, fac, h, fac2, grid->powerx, V2D_UNIT_SECONDS, 'h');
+ scroll_printstr(scene, fac, h, fac2, grid->powerx, V2D_UNIT_SECONDS, 'h');
break;
case V2D_UNIT_SECONDSSEQ: /* seconds with special calculations (only used for sequencer only) */
@@ -1634,13 +1647,13 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v
time= (float)floor(fac2);
fac2= fac2-time;
- scroll_printstr(vs, scene, fac, h, time+(float)FPS*fac2/100.0f, grid->powerx, V2D_UNIT_SECONDSSEQ, 'h');
+ scroll_printstr(scene, fac, h, time+(float)FPS*fac2/100.0f, grid->powerx, V2D_UNIT_SECONDSSEQ, 'h');
}
break;
case V2D_UNIT_DEGREES: /* Graph Editor for rotation Drivers */
/* HACK: although we're drawing horizontal, we make this draw as 'vertical', just to get degree signs */
- scroll_printstr(vs, scene, fac, h, val, grid->powerx, V2D_UNIT_DEGREES, 'v');
+ scroll_printstr(scene, fac, h, val, grid->powerx, V2D_UNIT_DEGREES, 'v');
break;
}
}
@@ -1678,6 +1691,9 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v
state |= UI_SCROLL_ARROWS;
}
+ UI_ThemeColor(TH_BACK);
+ glRecti(v2d->vert.xmin, v2d->vert.ymin, v2d->vert.xmax, v2d->vert.ymax);
+
uiWidgetScrollDraw(&wcol, &vert, &slider, state);
}
@@ -1694,10 +1710,10 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v
* NOTE: it's assumed that that scrollbar is there if this is involved!
*/
fac= (grid->starty- v2d->cur.ymin) / (v2d->cur.ymax - v2d->cur.ymin);
- fac= (vert.ymin + V2D_SCROLL_HEIGHT) + fac*(vert.ymax - vert.ymin - V2D_SCROLL_HEIGHT);
+ fac= vert.ymin + fac*(vert.ymax - vert.ymin);
dfac= (grid->dy) / (v2d->cur.ymax - v2d->cur.ymin);
- dfac= dfac * (vert.ymax - vert.ymin - V2D_SCROLL_HEIGHT);
+ dfac= dfac * (vert.ymax - vert.ymin);
/* set starting value, and text color */
UI_ThemeColor(TH_TEXT);
@@ -1719,7 +1735,7 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v
if(fac < vert.ymin+10)
continue;
- scroll_printstr(vs, scene, (float)(vert.xmax)-2.0f, fac, val, grid->powery, vs->yunits, 'v');
+ scroll_printstr(scene, (float)(vert.xmax)-2.0f, fac, val, grid->powery, vs->yunits, 'v');
}
BLF_disable_default(BLF_ROTATION);
@@ -2003,48 +2019,58 @@ static ListBase strings= {NULL, NULL};
typedef struct View2DString {
struct View2DString *next, *prev;
- float col[4];
- char str[128];
+ union {
+ unsigned char ub[4];
+ int pack;
+ } col;
short mval[2];
rcti rect;
} View2DString;
-void UI_view2d_text_cache_add(View2D *v2d, float x, float y, char *str)
+void UI_view2d_text_cache_add(View2D *v2d, float x, float y, const char *str, const char col[4])
{
int mval[2];
UI_view2d_view_to_region(v2d, x, y, mval, mval+1);
if(mval[0]!=V2D_IS_CLIPPED && mval[1]!=V2D_IS_CLIPPED) {
+ int len= strlen(str)+1;
/* use calloc, rect has to be zeroe'd */
- View2DString *v2s= MEM_callocN(sizeof(View2DString), "View2DString");
-
+ View2DString *v2s= MEM_callocN(sizeof(View2DString)+len, "View2DString");
+ char *v2s_str= (char *)(v2s+1);
+ memcpy(v2s_str, str, len);
+
BLI_addtail(&strings, v2s);
- BLI_strncpy(v2s->str, str, 128);
+ v2s->col.pack= *((int *)col);
v2s->mval[0]= mval[0];
v2s->mval[1]= mval[1];
- glGetFloatv(GL_CURRENT_COLOR, v2s->col);
}
}
/* no clip (yet) */
-void UI_view2d_text_cache_rectf(View2D *v2d, rctf *rect, char *str)
+void UI_view2d_text_cache_rectf(View2D *v2d, rctf *rect, const char *str, const char col[4])
{
- View2DString *v2s= MEM_callocN(sizeof(View2DString), "View2DString");
-
+ int len= strlen(str)+1;
+ View2DString *v2s= MEM_callocN(sizeof(View2DString)+len, "View2DString");
+ char *v2s_str= (char *)(v2s+1);
+ memcpy(v2s_str, str, len);
+
UI_view2d_to_region_no_clip(v2d, rect->xmin, rect->ymin, &v2s->rect.xmin, &v2s->rect.ymin);
UI_view2d_to_region_no_clip(v2d, rect->xmax, rect->ymax, &v2s->rect.xmax, &v2s->rect.ymax);
-
+
+ v2s->col.pack= *((int *)col);
+ v2s->mval[0]= v2s->rect.xmin;
+ v2s->mval[1]= v2s->rect.ymin;
+
BLI_addtail(&strings, v2s);
- BLI_strncpy(v2s->str, str, 128);
- glGetFloatv(GL_CURRENT_COLOR, v2s->col);
}
void UI_view2d_text_cache_draw(ARegion *ar)
{
View2DString *v2s;
+ int col_pack_prev= 0;
// glMatrixMode(GL_PROJECTION);
// glPushMatrix();
@@ -2053,18 +2079,23 @@ void UI_view2d_text_cache_draw(ARegion *ar)
ED_region_pixelspace(ar);
for(v2s= strings.first; v2s; v2s= v2s->next) {
- glColor3fv(v2s->col);
- if(v2s->rect.xmin==v2s->rect.xmax)
- BLF_draw_default((float)v2s->mval[0], (float)v2s->mval[1], 0.0, v2s->str);
+ const char *str= (const char *)(v2s+1);
+ int xofs=0, yofs;
+
+ yofs= ceil( 0.5f*(v2s->rect.ymax - v2s->rect.ymin - BLF_height_default("28")));
+ if(yofs<1) yofs= 1;
+
+ if(col_pack_prev != v2s->col.pack) {
+ glColor3ubv(v2s->col.ub);
+ col_pack_prev= v2s->col.pack;
+ }
+
+ if(v2s->rect.xmin >= v2s->rect.xmax)
+ BLF_draw_default((float)v2s->mval[0]+xofs, (float)v2s->mval[1]+yofs, 0.0, str, 65535);
else {
- int xofs=0, yofs;
-
- yofs= ceil( 0.5f*(v2s->rect.ymax - v2s->rect.ymin - BLF_height_default("28")));
- if(yofs<1) yofs= 1;
-
BLF_clipping_default(v2s->rect.xmin-4, v2s->rect.ymin-4, v2s->rect.xmax+4, v2s->rect.ymax+4);
BLF_enable_default(BLF_CLIPPING);
- BLF_draw_default(v2s->rect.xmin+xofs, v2s->rect.ymin+yofs, 0.0f, v2s->str);
+ BLF_draw_default(v2s->rect.xmin+xofs, v2s->rect.ymin+yofs, 0.0f, str, 65535);
BLF_disable_default(BLF_CLIPPING);
}
}
diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c
index de1b26e987b..fcc72cba321 100644
--- a/source/blender/editors/interface/view2d_ops.c
+++ b/source/blender/editors/interface/view2d_ops.c
@@ -32,6 +32,7 @@
#include "DNA_userdef_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
@@ -46,6 +47,8 @@
#include "UI_view2d.h"
+#include "PIL_time.h" /* USER_ZOOM_CONT */
+
static int view2d_poll(bContext *C)
{
ARegion *ar= CTX_wm_region(C);
@@ -119,7 +122,7 @@ static int view_pan_init(bContext *C, wmOperator *op)
}
/* apply transform to view (i.e. adjust 'cur' rect) */
-static void view_pan_apply(bContext *C, wmOperator *op)
+static void view_pan_apply(wmOperator *op)
{
v2dViewPanData *vpd= op->customdata;
View2D *v2d= vpd->v2d;
@@ -146,7 +149,6 @@ static void view_pan_apply(bContext *C, wmOperator *op)
ED_region_tag_redraw(vpd->ar);
UI_view2d_sync(vpd->sc, vpd->sa, v2d, V2D_LOCK_COPY);
- WM_event_add_mousemove(C);
/* exceptions */
if (vpd->sa->spacetype==SPACE_OUTLINER) {
@@ -157,7 +159,7 @@ static void view_pan_apply(bContext *C, wmOperator *op)
}
/* cleanup temp customdata */
-static void view_pan_exit(bContext *C, wmOperator *op)
+static void view_pan_exit(wmOperator *op)
{
if (op->customdata) {
MEM_freeN(op->customdata);
@@ -173,8 +175,8 @@ static int view_pan_exec(bContext *C, wmOperator *op)
if (!view_pan_init(C, op))
return OPERATOR_CANCELLED;
- view_pan_apply(C, op);
- view_pan_exit(C, op);
+ view_pan_apply(op);
+ view_pan_exit(op);
return OPERATOR_FINISHED;
}
@@ -200,8 +202,8 @@ static int view_pan_invoke(bContext *C, wmOperator *op, wmEvent *event)
RNA_int_set(op->ptr, "deltax", event->prevx - event->x);
RNA_int_set(op->ptr, "deltay", event->prevy - event->y);
- view_pan_apply(C, op);
- view_pan_exit(C, op);
+ view_pan_apply(op);
+ view_pan_exit(op);
return OPERATOR_FINISHED;
}
@@ -237,7 +239,7 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event)
vpd->lastx= event->x;
vpd->lasty= event->y;
- view_pan_apply(C, op);
+ view_pan_apply(op);
}
break;
@@ -248,7 +250,7 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event)
RNA_int_set(op->ptr, "deltax", (vpd->startx - vpd->lastx));
RNA_int_set(op->ptr, "deltay", (vpd->starty - vpd->lasty));
- view_pan_exit(C, op);
+ view_pan_exit(op);
WM_cursor_restore(CTX_wm_window(C));
WM_operator_name_call(C, "VIEW2D_OT_zoom", WM_OP_INVOKE_DEFAULT, NULL);
@@ -261,7 +263,7 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event)
RNA_int_set(op->ptr, "deltax", (vpd->startx - vpd->lastx));
RNA_int_set(op->ptr, "deltay", (vpd->starty - vpd->lasty));
- view_pan_exit(C, op);
+ view_pan_exit(op);
WM_cursor_restore(CTX_wm_window(C));
return OPERATOR_FINISHED;
@@ -272,9 +274,9 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
-static int view_pan_cancel(bContext *C, wmOperator *op)
+static int view_pan_cancel(bContext *UNUSED(C), wmOperator *op)
{
- view_pan_exit(C, op);
+ view_pan_exit(op);
return OPERATOR_CANCELLED;
}
@@ -313,7 +315,7 @@ static int view_scrollright_exec(bContext *C, wmOperator *op)
/* also, check if can pan in horizontal axis */
vpd= op->customdata;
if (vpd->v2d->keepofs & V2D_LOCKOFS_X) {
- view_pan_exit(C, op);
+ view_pan_exit(op);
return OPERATOR_PASS_THROUGH;
}
@@ -322,8 +324,8 @@ static int view_scrollright_exec(bContext *C, wmOperator *op)
RNA_int_set(op->ptr, "deltay", 0);
/* apply movement, then we're done */
- view_pan_apply(C, op);
- view_pan_exit(C, op);
+ view_pan_apply(op);
+ view_pan_exit(op);
return OPERATOR_FINISHED;
}
@@ -357,7 +359,7 @@ static int view_scrollleft_exec(bContext *C, wmOperator *op)
/* also, check if can pan in horizontal axis */
vpd= op->customdata;
if (vpd->v2d->keepofs & V2D_LOCKOFS_X) {
- view_pan_exit(C, op);
+ view_pan_exit(op);
return OPERATOR_PASS_THROUGH;
}
@@ -366,8 +368,8 @@ static int view_scrollleft_exec(bContext *C, wmOperator *op)
RNA_int_set(op->ptr, "deltay", 0);
/* apply movement, then we're done */
- view_pan_apply(C, op);
- view_pan_exit(C, op);
+ view_pan_apply(op);
+ view_pan_exit(op);
return OPERATOR_FINISHED;
}
@@ -400,7 +402,7 @@ static int view_scrolldown_exec(bContext *C, wmOperator *op)
/* also, check if can pan in vertical axis */
vpd= op->customdata;
if (vpd->v2d->keepofs & V2D_LOCKOFS_Y) {
- view_pan_exit(C, op);
+ view_pan_exit(op);
return OPERATOR_PASS_THROUGH;
}
@@ -408,9 +410,14 @@ static int view_scrolldown_exec(bContext *C, wmOperator *op)
RNA_int_set(op->ptr, "deltax", 0);
RNA_int_set(op->ptr, "deltay", -40);
+ if(RNA_boolean_get(op->ptr, "page")) {
+ ARegion *ar= CTX_wm_region(C);
+ RNA_int_set(op->ptr, "deltay", ar->v2d.mask.ymin - ar->v2d.mask.ymax);
+ }
+
/* apply movement, then we're done */
- view_pan_apply(C, op);
- view_pan_exit(C, op);
+ view_pan_apply(op);
+ view_pan_exit(op);
return OPERATOR_FINISHED;
}
@@ -428,6 +435,7 @@ void VIEW2D_OT_scroll_down(wmOperatorType *ot)
/* rna - must keep these in sync with the other operators */
RNA_def_int(ot->srna, "deltax", 0, INT_MIN, INT_MAX, "Delta X", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "deltay", 0, INT_MIN, INT_MAX, "Delta Y", "", INT_MIN, INT_MAX);
+ RNA_def_boolean(ot->srna, "page", 0, "Page", "Scroll down one page.");
}
@@ -444,7 +452,7 @@ static int view_scrollup_exec(bContext *C, wmOperator *op)
/* also, check if can pan in vertical axis */
vpd= op->customdata;
if (vpd->v2d->keepofs & V2D_LOCKOFS_Y) {
- view_pan_exit(C, op);
+ view_pan_exit(op);
return OPERATOR_PASS_THROUGH;
}
@@ -452,9 +460,14 @@ static int view_scrollup_exec(bContext *C, wmOperator *op)
RNA_int_set(op->ptr, "deltax", 0);
RNA_int_set(op->ptr, "deltay", 40);
+ if(RNA_boolean_get(op->ptr, "page")) {
+ ARegion *ar= CTX_wm_region(C);
+ RNA_int_set(op->ptr, "deltay", ar->v2d.mask.ymax - ar->v2d.mask.ymin);
+ }
+
/* apply movement, then we're done */
- view_pan_apply(C, op);
- view_pan_exit(C, op);
+ view_pan_apply(op);
+ view_pan_exit(op);
return OPERATOR_FINISHED;
}
@@ -472,6 +485,7 @@ void VIEW2D_OT_scroll_up(wmOperatorType *ot)
/* rna - must keep these in sync with the other operators */
RNA_def_int(ot->srna, "deltax", 0, INT_MIN, INT_MAX, "Delta X", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "deltay", 0, INT_MIN, INT_MAX, "Delta Y", "", INT_MIN, INT_MAX);
+ RNA_def_boolean(ot->srna, "page", 0, "Page", "Scroll up one page.");
}
/* ********************************************************* */
@@ -494,7 +508,11 @@ void VIEW2D_OT_scroll_up(wmOperatorType *ot)
typedef struct v2dViewZoomData {
View2D *v2d; /* view2d we're operating in */
ARegion *ar;
-
+
+ /* needed for continuous zoom */
+ wmTimer *timer;
+ double timer_lastdraw;
+
int lastx, lasty; /* previous x/y values of mouse in window */
float dx, dy; /* running tally of previous delta values (for obtaining final zoom) */
float mx_2d, my_2d; /* initial mouse location in v2d coords */
@@ -628,13 +646,12 @@ static void view_zoomstep_apply(bContext *C, wmOperator *op)
/* request updates to be done... */
ED_region_tag_redraw(vzd->ar);
UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
- WM_event_add_mousemove(C);
}
/* --------------- Individual Operators ------------------- */
/* cleanup temp customdata */
-static void view_zoomstep_exit(bContext *C, wmOperator *op)
+static void view_zoomstep_exit(wmOperator *op)
{
if (op->customdata) {
MEM_freeN(op->customdata);
@@ -656,7 +673,7 @@ static int view_zoomin_exec(bContext *C, wmOperator *op)
/* apply movement, then we're done */
view_zoomstep_apply(C, op);
- view_zoomstep_exit(C, op);
+ view_zoomstep_exit(op);
return OPERATOR_FINISHED;
}
@@ -691,7 +708,7 @@ void VIEW2D_OT_zoom_in(wmOperatorType *ot)
/* api callbacks */
ot->invoke= view_zoomin_invoke;
- ot->exec= view_zoomin_exec;
+// ot->exec= view_zoomin_exec; // XXX, needs view_zoomdrag_init called first.
ot->poll= view_zoom_poll;
/* rna - must keep these in sync with the other operators */
@@ -713,7 +730,7 @@ static int view_zoomout_exec(bContext *C, wmOperator *op)
/* apply movement, then we're done */
view_zoomstep_apply(C, op);
- view_zoomstep_exit(C, op);
+ view_zoomstep_exit(op);
return OPERATOR_FINISHED;
}
@@ -748,7 +765,7 @@ void VIEW2D_OT_zoom_out(wmOperatorType *ot)
/* api callbacks */
ot->invoke= view_zoomout_invoke;
- ot->exec= view_zoomout_exec;
+// ot->exec= view_zoomout_exec; // XXX, needs view_zoomdrag_init called first.
ot->poll= view_zoom_poll;
/* rna - must keep these in sync with the other operators */
@@ -775,7 +792,18 @@ static void view_zoomdrag_apply(bContext *C, wmOperator *op)
/* get amount to move view by */
dx= RNA_float_get(op->ptr, "deltax");
dy= RNA_float_get(op->ptr, "deltay");
-
+
+ /* continous zoom shouldn't move that fast... */
+ if (U.viewzoom == USER_ZOOM_CONT) { // XXX store this setting as RNA prop?
+ double time= PIL_check_seconds_timer();
+ float time_step= (float)(time - vzd->timer_lastdraw);
+
+ dx *= time_step * 0.5f;
+ dy *= time_step * 0.5f;
+
+ vzd->timer_lastdraw= time;
+ }
+
/* only move view on an axis if change is allowed */
if ((v2d->keepzoom & V2D_LOCKZOOM_X)==0) {
if (v2d->keepofs & V2D_LOCKOFS_X) {
@@ -822,13 +850,17 @@ static void view_zoomdrag_apply(bContext *C, wmOperator *op)
/* request updates to be done... */
ED_region_tag_redraw(vzd->ar);
UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
- WM_event_add_mousemove(C);
}
/* cleanup temp customdata */
static void view_zoomdrag_exit(bContext *C, wmOperator *op)
{
if (op->customdata) {
+ v2dViewZoomData *vzd= op->customdata;
+
+ if(vzd->timer)
+ WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), vzd->timer);
+
MEM_freeN(op->customdata);
op->customdata= NULL;
}
@@ -905,6 +937,12 @@ static int view_zoomdrag_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* add temp handler */
WM_event_add_modal_handler(C, op);
+ if (U.viewzoom == USER_ZOOM_CONT) {
+ /* needs a timer to continue redrawing */
+ vzd->timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f);
+ vzd->timer_lastdraw= PIL_check_seconds_timer();
+ }
+
return OPERATOR_RUNNING_MODAL;
}
@@ -915,85 +953,88 @@ static int view_zoomdrag_modal(bContext *C, wmOperator *op, wmEvent *event)
View2D *v2d= vzd->v2d;
/* execute the events */
- switch (event->type) {
- case MOUSEMOVE:
- {
- float dx, dy;
+ if (event->type == TIMER && event->customdata == vzd->timer) {
+ view_zoomdrag_apply(C, op);
+ }
+ else if(event->type == MOUSEMOVE) {
+ float dx, dy;
+
+ /* calculate new delta transform, based on zooming mode */
+ if (U.viewzoom == USER_ZOOM_SCALE) {
+ /* 'scale' zooming */
+ float dist;
- /* calculate new delta transform, based on zooming mode */
- if (U.viewzoom == USER_ZOOM_SCALE) {
- /* 'scale' zooming */
- float dist;
-
- /* x-axis transform */
- dist = (v2d->mask.xmax - v2d->mask.xmin) / 2.0f;
- dx= 1.0f - ((float)fabs(vzd->lastx - dist) + 2.0f) / ((float)fabs(event->x - dist) + 2.0f);
- dx*= 0.5f * (v2d->cur.xmax - v2d->cur.xmin);
+ /* x-axis transform */
+ dist = (v2d->mask.xmax - v2d->mask.xmin) / 2.0f;
+ dx= 1.0f - ((float)fabs(vzd->lastx - dist) + 2.0f) / ((float)fabs(event->x - dist) + 2.0f);
+ dx*= 0.5f * (v2d->cur.xmax - v2d->cur.xmin);
+
+ /* y-axis transform */
+ dist = (v2d->mask.ymax - v2d->mask.ymin) / 2.0f;
+ dy= 1.0f - ((float)fabs(vzd->lasty - dist) + 2.0f) / ((float)fabs(event->y - dist) + 2.0f);
+ dy*= 0.5f * (v2d->cur.ymax - v2d->cur.ymin);
+ }
+ else {
+ /* 'continuous' or 'dolly' */
+ float fac;
+
+ /* x-axis transform */
+ fac= 0.01f * (event->x - vzd->lastx);
+ dx= fac * (v2d->cur.xmax - v2d->cur.xmin);
+
+ /* y-axis transform */
+ fac= 0.01f * (event->y - vzd->lasty);
+ dy= fac * (v2d->cur.ymax - v2d->cur.ymin);
+#if 0
+ /* continous zoom shouldn't move that fast... */
+ if (U.viewzoom == USER_ZOOM_CONT) { // XXX store this setting as RNA prop?
+ double time= PIL_check_seconds_timer();
+ float time_step= (float)(time - vzd->timer_lastdraw);
+
+ dx /= (0.1f / time_step);
+ dy /= (0.1f / time_step);
- /* y-axis transform */
- dist = (v2d->mask.ymax - v2d->mask.ymin) / 2.0f;
- dy= 1.0f - ((float)fabs(vzd->lasty - dist) + 2.0f) / ((float)fabs(event->y - dist) + 2.0f);
- dy*= 0.5f * (v2d->cur.ymax - v2d->cur.ymin);
+ vzd->timer_lastdraw= time;
}
- else {
- /* 'continuous' or 'dolly' */
- float fac;
-
- /* x-axis transform */
- fac= 0.01f * (event->x - vzd->lastx);
- dx= fac * (v2d->cur.xmax - v2d->cur.xmin);
-
- /* y-axis transform */
- fac= 0.01f * (event->y - vzd->lasty);
- dy= fac * (v2d->cur.ymax - v2d->cur.ymin);
+#endif
+ }
+
+ /* set transform amount, and add current deltas to stored total delta (for redo) */
+ RNA_float_set(op->ptr, "deltax", dx);
+ RNA_float_set(op->ptr, "deltay", dy);
+ vzd->dx += dx;
+ vzd->dy += dy;
+
+ /* store mouse coordinates for next time, if not doing continuous zoom
+ * - continuous zoom only depends on distance of mouse to starting point to determine rate of change
+ */
+ if (U.viewzoom != USER_ZOOM_CONT) { // XXX store this setting as RNA prop?
+ vzd->lastx= event->x;
+ vzd->lasty= event->y;
+ }
+
+ /* apply zooming */
+ view_zoomdrag_apply(C, op);
+ }
+ else if (ELEM3(event->type, LEFTMOUSE, MIDDLEMOUSE, RIGHTMOUSE)) { /* XXX needs modal keymap */
+ if (event->val==KM_RELEASE) {
+ /* for redo, store the overall deltas - need to respect zoom-locks here... */
+ if ((v2d->keepzoom & V2D_LOCKZOOM_X)==0)
+ RNA_float_set(op->ptr, "deltax", vzd->dx);
+ else
+ RNA_float_set(op->ptr, "deltax", 0);
- /* continous zoom shouldn't move that fast... */
- if (U.viewzoom == USER_ZOOM_CONT) { // XXX store this setting as RNA prop?
- dx /= 20.0f;
- dy /= 20.0f;
- }
- }
-
- /* set transform amount, and add current deltas to stored total delta (for redo) */
- RNA_float_set(op->ptr, "deltax", dx);
- RNA_float_set(op->ptr, "deltay", dy);
- vzd->dx += dx;
- vzd->dy += dy;
+ if ((v2d->keepzoom & V2D_LOCKZOOM_Y)==0)
+ RNA_float_set(op->ptr, "deltay", vzd->dy);
+ else
+ RNA_float_set(op->ptr, "deltay", 0);
- /* store mouse coordinates for next time, if not doing continuous zoom
- * - continuous zoom only depends on distance of mouse to starting point to determine rate of change
- */
- if (U.viewzoom != USER_ZOOM_CONT) { // XXX store this setting as RNA prop?
- vzd->lastx= event->x;
- vzd->lasty= event->y;
- }
+ /* free customdata */
+ view_zoomdrag_exit(C, op);
+ WM_cursor_restore(CTX_wm_window(C));
- /* apply zooming */
- view_zoomdrag_apply(C, op);
+ return OPERATOR_FINISHED;
}
- break;
-
- case LEFTMOUSE:
- case MIDDLEMOUSE:
- if (event->val==KM_RELEASE) {
- /* for redo, store the overall deltas - need to respect zoom-locks here... */
- if ((v2d->keepzoom & V2D_LOCKZOOM_X)==0)
- RNA_float_set(op->ptr, "deltax", vzd->dx);
- else
- RNA_float_set(op->ptr, "deltax", 0);
-
- if ((v2d->keepzoom & V2D_LOCKZOOM_Y)==0)
- RNA_float_set(op->ptr, "deltay", vzd->dy);
- else
- RNA_float_set(op->ptr, "deltay", 0);
-
- /* free customdata */
- view_zoomdrag_exit(C, op);
- WM_cursor_restore(CTX_wm_window(C));
-
- return OPERATOR_FINISHED;
- }
- break;
}
return OPERATOR_RUNNING_MODAL;
@@ -1095,7 +1136,6 @@ static int view_borderzoom_exec(bContext *C, wmOperator *op)
/* request updates to be done... */
ED_region_tag_redraw(ar);
UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
- WM_event_add_mousemove(C);
return OPERATOR_FINISHED;
}
@@ -1140,7 +1180,7 @@ typedef struct v2dScrollerMove {
ARegion *ar; /* region that the scroller is in */
short scroller; /* scroller that mouse is in ('h' or 'v') */
- short zone; /* -1 is min zoomer, 0 is bar, 1 is max zoomer */ // XXX find some way to provide visual feedback of this (active colour?)
+ short zone; /* -1 is min zoomer, 0 is bar, 1 is max zoomer */ // XXX find some way to provide visual feedback of this (active color?)
float fac; /* view adjustment factor, based on size of region */
float delta; /* amount moved by mouse on axis of interest */
@@ -1355,7 +1395,6 @@ static void scroller_activate_apply(bContext *C, wmOperator *op)
/* request updates to be done... */
ED_region_tag_redraw(vsm->ar);
UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
- WM_event_add_mousemove(C);
}
/* handle user input for scrollers - calculations of mouse-movement need to be done here, not in the apply callback! */
@@ -1477,7 +1516,7 @@ static int scroller_activate_invoke(bContext *C, wmOperator *op, wmEvent *event)
scroller_activate_exit(C, op);
/* can't catch this event for ourselves, so let it go to someone else? */
- // FIXME: still this doesn't fall through to the item_activate callback for the outliner...
+ /* XXX note: if handlers use mask rect to clip input, input will fail for this case */
return OPERATOR_PASS_THROUGH;
}
@@ -1517,7 +1556,7 @@ void VIEW2D_OT_scroller_activate(wmOperatorType *ot)
/* ********************************************************* */
/* RESET */
-static int reset_exec(bContext *C, wmOperator *op)
+static int reset_exec(bContext *C, wmOperator *UNUSED(op))
{
uiStyle *style= U.uistyles.first;
ARegion *ar= CTX_wm_region(C);
@@ -1560,7 +1599,6 @@ static int reset_exec(bContext *C, wmOperator *op)
/* request updates to be done... */
ED_region_tag_redraw(ar);
UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
- WM_event_add_mousemove(C);
return OPERATOR_FINISHED;
}
@@ -1658,8 +1696,10 @@ void UI_view2d_keymap(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "VIEW2D_OT_pan", MOUSEPAN, 0, 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", WHEELDOWNMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", WHEELUPMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", PAGEDOWNKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", PAGEUPKEY, KM_PRESS, 0, 0);
+
+ RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", PAGEDOWNKEY, KM_PRESS, 0, 0)->ptr, "page", 1);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", PAGEUPKEY, KM_PRESS, 0, 0)->ptr, "page", 1);
+
WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MOUSEZOOM, 0, 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_out", PADMINUS, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/mesh/CMakeLists.txt b/source/blender/editors/mesh/CMakeLists.txt
index 4145f251a64..82d1c7430fc 100644
--- a/source/blender/editors/mesh/CMakeLists.txt
+++ b/source/blender/editors/mesh/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -33,8 +31,20 @@ SET(INC
../../../../intern/guardedalloc
)
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ editface.c
+ editmesh.c
+ editmesh_add.c
+ editmesh_lib.c
+ editmesh_loop.c
+ editmesh_mods.c
+ editmesh_tools.c
+ loopcut.c
+ mesh_data.c
+ mesh_ops.c
+ meshtools.c
+
+ mesh_intern.h
+)
-BLENDERLIB(bf_editor_mesh "${SRC}" "${INC}")
+blender_add_lib(bf_editor_mesh "${SRC}" "${INC}")
diff --git a/source/blender/editors/mesh/Makefile b/source/blender/editors/mesh/Makefile
deleted file mode 100644
index be57f72329a..00000000000
--- a/source/blender/editors/mesh/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_mesh
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c
index fc92598591a..2a391f7bbaf 100644
--- a/source/blender/editors/mesh/editface.c
+++ b/source/blender/editors/mesh/editface.c
@@ -36,6 +36,7 @@
#include "BLI_heap.h"
#include "BLI_edgehash.h"
#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -51,12 +52,6 @@
#include "BIF_gl.h"
-
-#ifndef DISABLE_PYTHON
-//#include "BPY_extern.h"
-//#include "BPY_menus.h"
-#endif
-
#include "ED_mesh.h"
#include "ED_screen.h"
#include "ED_view3d.h"
@@ -67,14 +62,9 @@
/* own include */
#include "mesh_intern.h"
-/* ***************** XXX **************** */
-static int pupmenu(const char *dummy) {return 0;}
-/* ***************** XXX **************** */
-
-
/* copy the face flags, most importantly selection from the mesh to the final derived mesh,
* use in object mode when selecting faces (while painting) */
-void object_facesel_flush_dm(Object *ob)
+void paintface_flush_flags(Object *ob)
{
Mesh *me= get_mesh(ob);
DerivedMesh *dm= ob->derivedFinal;
@@ -98,7 +88,7 @@ void object_facesel_flush_dm(Object *ob)
for (i= 0; i<totface; i++, mf++) { /* loop over derived mesh faces */
mf_orig= me->mface + index_array[i];
- mf->flag= mf_orig->flag;;
+ mf->flag= mf_orig->flag;
}
}
@@ -162,7 +152,7 @@ MTFace *EM_get_active_mtface(EditMesh *em, EditFace **act_efa, MCol **mcol, int
return NULL;
}
-void reveal_tface(Scene *scene)
+void paintface_unhide(Scene *scene)
{
Mesh *me;
MFace *mface;
@@ -181,11 +171,10 @@ void reveal_tface(Scene *scene)
mface++;
}
- object_facesel_flush_dm(OBACT);
-// XXX notifier! object_tface_flags_changed(OBACT, 0);
+ paintface_flush_flags(OBACT);
}
-void hide_tface(Scene *scene)
+void paintface_hide(Scene *scene)
{
Mesh *me;
MFace *mface;
@@ -196,7 +185,7 @@ void hide_tface(Scene *scene)
if(me==0 || me->totface==0) return;
if(alt) {
- reveal_tface(scene);
+ paintface_unhide(scene);
return;
}
@@ -217,8 +206,7 @@ void hide_tface(Scene *scene)
mface++;
}
- object_facesel_flush_dm(OBACT);
-// XXX notifier! object_tface_flags_changed(OBACT, 0);
+ paintface_flush_flags(OBACT);
}
/* Set tface seams based on edge data, uses hash table to find seam edges. */
@@ -236,7 +224,7 @@ static void hash_add_face(EdgeHash *ehash, MFace *mf)
}
-void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
+static void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
{
MFace *mf;
int a, doit=1, mark=0;
@@ -338,12 +326,9 @@ void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
}
MEM_freeN(linkflag);
-
- // BIF_undo_push("Select linked UV face");
- // object_tface_flags_changed(OBACT, 0);
}
-void select_linked_tfaces(bContext *C, Object *ob, short mval[2], int mode)
+void paintface_select_linked(bContext *UNUSED(C), Object *ob, short UNUSED(mval[2]), int mode)
{
Mesh *me;
unsigned int index=0;
@@ -361,10 +346,11 @@ void select_linked_tfaces(bContext *C, Object *ob, short mval[2], int mode)
select_linked_tfaces_with_seams(mode, me, index);
- object_facesel_flush_dm(ob);
+ paintface_flush_flags(ob);
}
-void selectall_tface(Object *ob, int action)
+/* note: caller needs to run paintface_flush_flags(ob) after this */
+void paintface_deselect_all_visible(Object *ob, int action, short flush_flags)
{
Mesh *me;
MFace *mface;
@@ -406,11 +392,12 @@ void selectall_tface(Object *ob, int action)
mface++;
}
- object_facesel_flush_dm(ob);
-// XXX notifier! object_tface_flags_changed(OBACT, 0);
+ if(flush_flags) {
+ paintface_flush_flags(ob);
+ }
}
-void selectswap_tface(Scene *scene)
+void paintface_select_swap(Scene *scene)
{
Mesh *me;
MFace *mface;
@@ -430,11 +417,10 @@ void selectswap_tface(Scene *scene)
mface++;
}
- object_facesel_flush_dm(OBACT);
-// XXX notifier! object_tface_flags_changed(OBACT, 0);
+ paintface_flush_flags(OBACT);
}
-int minmax_tface(Object *ob, float *min, float *max)
+int paintface_minmax(Object *ob, float *min, float *max)
{
Mesh *me= get_mesh(ob);
MFace *mf;
@@ -464,7 +450,7 @@ int minmax_tface(Object *ob, float *min, float *max)
#define ME_SEAM_DONE 2 /* reuse this flag */
-static float edgetag_cut_cost(EditMesh *em, int e1, int e2, int vert)
+static float edgetag_cut_cost(int e1, int e2, int vert)
{
EditVert *v = EM_get_vert_for_index(vert);
EditEdge *eed1 = EM_get_edge_for_index(e1), *eed2 = EM_get_edge_for_index(e2);
@@ -483,7 +469,7 @@ static float edgetag_cut_cost(EditMesh *em, int e1, int e2, int vert)
return cost;
}
-static void edgetag_add_adjacent(EditMesh *em, Heap *heap, int mednum, int vertnum, int *nedges, int *edges, int *prevedge, float *cost)
+static void edgetag_add_adjacent(Heap *heap, int mednum, int vertnum, int *nedges, int *edges, int *prevedge, float *cost)
{
int startadj, endadj = nedges[vertnum+1];
@@ -495,7 +481,7 @@ static void edgetag_add_adjacent(EditMesh *em, Heap *heap, int mednum, int vertn
if (eedadj->f2 & ME_SEAM_DONE)
continue;
- newcost = cost[mednum] + edgetag_cut_cost(em, mednum, adjnum, vertnum);
+ newcost = cost[mednum] + edgetag_cut_cost(mednum, adjnum, vertnum);
if (cost[adjnum] > newcost) {
cost[adjnum] = newcost;
@@ -621,8 +607,8 @@ int edgetag_shortest_path(Scene *scene, EditMesh *em, EditEdge *source, EditEdge
eed->f2 |= ME_SEAM_DONE;
- edgetag_add_adjacent(em, heap, mednum, eed->v1->tmp.l, nedges, edges, prevedge, cost);
- edgetag_add_adjacent(em, heap, mednum, eed->v2->tmp.l, nedges, edges, prevedge, cost);
+ edgetag_add_adjacent(heap, mednum, eed->v1->tmp.l, nedges, edges, prevedge, cost);
+ edgetag_add_adjacent(heap, mednum, eed->v2->tmp.l, nedges, edges, prevedge, cost);
}
@@ -672,7 +658,7 @@ int edgetag_shortest_path(Scene *scene, EditMesh *em, EditEdge *source, EditEdge
}
/* *************************************** */
-
+#if 0
static void seam_edgehash_insert_face(EdgeHash *ehash, MFace *mf)
{
BLI_edgehash_insert(ehash, mf->v1, mf->v2, NULL);
@@ -739,11 +725,10 @@ void seam_mark_clear_tface(Scene *scene, short mode)
// unwrap_lscm(1);
me->drawflag |= ME_DRAWSEAMS;
-
-// XXX notifier! object_tface_flags_changed(OBACT, 1);
}
+#endif
-int face_select(struct bContext *C, Object *ob, short mval[2], int extend)
+int paintface_mouse_select(struct bContext *C, Object *ob, short mval[2], int extend)
{
Mesh *me;
MFace *mface, *msel;
@@ -780,48 +765,38 @@ int face_select(struct bContext *C, Object *ob, short mval[2], int extend)
/* image window redraw */
- object_facesel_flush_dm(ob);
-// XXX notifier! object_tface_flags_changed(OBACT, 1);
+ paintface_flush_flags(ob);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, ob->data);
ED_region_tag_redraw(CTX_wm_region(C)); // XXX - should redraw all 3D views
return 1;
}
-void face_borderselect(struct bContext *C, Object *ob, rcti *rect, int select, int extend)
+int do_paintface_box_select(ViewContext *vc, rcti *rect, int select, int extend)
{
Mesh *me;
MFace *mface;
struct ImBuf *ibuf;
unsigned int *rt;
- int a, sx, sy, index;
+ int a, index;
char *selar;
-
- ViewContext vc;
- view3d_set_viewcontext(C, &vc);
+ int sx= rect->xmax-rect->xmin+1;
+ int sy= rect->ymax-rect->ymin+1;
- me= get_mesh(ob);
- if(me==0) return;
- if(me->totface==0) return;
+ me= get_mesh(vc->obact);
- selar= MEM_callocN(me->totface+1, "selar");
+ if(me==NULL || me->totface==0 || sx*sy <= 0)
+ return OPERATOR_CANCELLED;
- sx= (rect->xmax-rect->xmin+1);
- sy= (rect->ymax-rect->ymin+1);
- if(sx*sy<=0) return;
+ selar= MEM_callocN(me->totface+1, "selar");
- if (extend == 0 && select) {
- mface= me->mface;
- for(a=1; a<=me->totface; a++, mface++) {
- if((mface->flag & ME_HIDE) == 0)
- mface->flag &= ~ME_FACE_SEL;
- }
- }
+ if (extend == 0 && select)
+ paintface_deselect_all_visible(vc->obact, SEL_DESELECT, FALSE);
- view3d_validate_backbuf(&vc);
+ view3d_validate_backbuf(vc);
- ibuf = IMB_allocImBuf(sx,sy,32,IB_rect,0);
+ ibuf = IMB_allocImBuf(sx,sy,32,IB_rect);
rt = ibuf->rect;
- glReadPixels(rect->xmin+vc.ar->winrct.xmin, rect->ymin+vc.ar->winrct.ymin, sx, sy, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
+ glReadPixels(rect->xmin+vc->ar->winrct.xmin, rect->ymin+vc->ar->winrct.ymin, sx, sy, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
if(ENDIAN_ORDER==B_ENDIAN) IMB_convert_rgba_to_abgr(ibuf);
a= sx*sy;
@@ -847,11 +822,11 @@ void face_borderselect(struct bContext *C, Object *ob, rcti *rect, int select, i
IMB_freeImBuf(ibuf);
MEM_freeN(selar);
-
-// XXX notifier! object_tface_flags_changed(OBACT, 0);
#ifdef __APPLE__
glReadBuffer(GL_BACK);
#endif
-
- object_facesel_flush_dm(ob);
+
+ paintface_flush_flags(vc->obact);
+
+ return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/mesh/editmesh.c b/source/blender/editors/mesh/editmesh.c
index ff2fad3f551..9376a21b23d 100644
--- a/source/blender/editors/mesh/editmesh.c
+++ b/source/blender/editors/mesh/editmesh.c
@@ -43,6 +43,7 @@
#include "BLI_editVert.h"
#include "BLI_dynstr.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_DerivedMesh.h"
#include "BKE_context.h"
@@ -53,10 +54,11 @@
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_paint.h"
+#include "BKE_report.h"
+#include "BKE_multires.h"
#include "ED_mesh.h"
#include "ED_object.h"
-#include "ED_retopo.h"
#include "ED_screen.h"
#include "ED_util.h"
#include "ED_view3d.h"
@@ -78,8 +80,8 @@ editmesh.c:
*/
/* XXX */
-static void BIF_undo_push(const char *dummy) {}
-static void error(const char *dummy) {}
+static void BIF_undo_push(const char *UNUSED(arg)) {}
+static void error(const char *UNUSED(arg)) {}
/* ***************** HASH ********************* */
@@ -91,7 +93,7 @@ static void error(const char *dummy) {}
/* ************ ADD / REMOVE / FIND ****************** */
-static void *calloc_em(EditMesh *em, size_t size, size_t nr)
+static void *calloc_em(EditMesh *UNUSED(em), size_t size, size_t nr)
{
return calloc(size, nr);
}
@@ -257,7 +259,7 @@ EditEdge *addedgelist(EditMesh *em, EditVert *v1, EditVert *v2, EditEdge *exampl
eed->h |= (example->h & EM_FGON);
}
}
-
+
return eed;
}
@@ -378,6 +380,7 @@ EditFace *addfacelist(EditMesh *em, EditVert *v1, EditVert *v2, EditVert *v3, Ed
efa->mat_nr= example->mat_nr;
efa->flag= example->flag;
CustomData_em_copy_data(&em->fdata, &em->fdata, example->data, &efa->data);
+ CustomData_em_validate_data(&em->fdata, efa->data, efa->v4 ? 4 : 3);
}
else {
efa->mat_nr= em->mat_nr;
@@ -447,19 +450,19 @@ int editface_containsEdge(EditFace *efa, EditEdge *eed)
/* ************************ stuct EditMesh manipulation ***************************** */
/* fake callocs for fastmalloc below */
-static void *calloc_fastvert(EditMesh *em, size_t size, size_t nr)
+static void *calloc_fastvert(EditMesh *em, size_t UNUSED(size), size_t UNUSED(nr))
{
EditVert *eve= em->curvert++;
eve->fast= 1;
return eve;
}
-static void *calloc_fastedge(EditMesh *em, size_t size, size_t nr)
+static void *calloc_fastedge(EditMesh *em, size_t UNUSED(size), size_t UNUSED(nr))
{
EditEdge *eed= em->curedge++;
eed->fast= 1;
return eed;
}
-static void *calloc_fastface(EditMesh *em, size_t size, size_t nr)
+static void *calloc_fastface(EditMesh *em, size_t UNUSED(size), size_t UNUSED(nr))
{
EditFace *efa= em->curface++;
efa->fast= 1;
@@ -737,6 +740,7 @@ void make_editMesh(Scene *scene, Object *ob)
EditSelection *ese;
float *co, (*keyco)[3]= NULL;
int tot, a, eekadoodle= 0;
+ const short is_paint_sel= paint_facesel_test(ob);
if(me->edit_mesh==NULL)
me->edit_mesh= MEM_callocN(sizeof(EditMesh), "editmesh");
@@ -787,7 +791,7 @@ void make_editMesh(Scene *scene, Object *ob)
evlist[a]= eve;
/* face select sets selection in next loop */
- if(!paint_facesel_test(ob))
+ if(!is_paint_sel)
eve->f |= (mvert->flag & 1);
if (mvert->flag & ME_HIDE) eve->h= 1;
@@ -862,7 +866,7 @@ void make_editMesh(Scene *scene, Object *ob)
if(mface->flag & ME_FACE_SEL) {
efa->f |= SELECT;
- if(paint_facesel_test(ob)) {
+ if(is_paint_sel) {
EM_select_face(efa, 1); /* flush down */
}
@@ -915,9 +919,9 @@ void make_editMesh(Scene *scene, Object *ob)
}
/* makes Mesh out of editmesh */
-void load_editMesh(Scene *scene, Object *ob)
+void load_editMesh(Scene *scene, Object *obedit)
{
- Mesh *me= ob->data;
+ Mesh *me= obedit->data;
MVert *mvert, *oldverts;
MEdge *medge;
MFace *mface;
@@ -985,8 +989,6 @@ void load_editMesh(Scene *scene, Object *ob)
while(eve) {
VECCOPY(mvert->co, eve->co);
- mvert->mat_nr= 32767; /* what was this for, halos? */
-
/* vertex normal */
VECCOPY(nor, eve->no);
mul_v3_fl(nor, 32767.0);
@@ -1059,20 +1061,6 @@ void load_editMesh(Scene *scene, Object *ob)
if(efa->f & 1) mface->flag |= ME_FACE_SEL;
else mface->flag &= ~ME_FACE_SEL;
}
-
- /* mat_nr in vertex */
- if(me->totcol>1) {
- mvert= me->mvert+mface->v1;
- if(mvert->mat_nr == (char)32767) mvert->mat_nr= mface->mat_nr;
- mvert= me->mvert+mface->v2;
- if(mvert->mat_nr == (char)32767) mvert->mat_nr= mface->mat_nr;
- mvert= me->mvert+mface->v3;
- if(mvert->mat_nr == (char)32767) mvert->mat_nr= mface->mat_nr;
- if(mface->v4) {
- mvert= me->mvert+mface->v4;
- if(mvert->mat_nr == (char)32767) mvert->mat_nr= mface->mat_nr;
- }
- }
/* watch: efa->e1->f2==0 means loose edge */
@@ -1107,7 +1095,7 @@ void load_editMesh(Scene *scene, Object *ob)
Object *ob;
ModifierData *md;
EditVert **vertMap = NULL;
- int i,j;
+ int j;
for (ob=G.main->object.first; ob; ob=ob->id.next) {
if (ob->parent==ob && ELEM(ob->partype, PARVERT1,PARVERT3)) {
@@ -1193,7 +1181,9 @@ void load_editMesh(Scene *scene, Object *ob)
eve= em->verts.first;
mvert = me->mvert;
while(eve) {
- VECSUB(ofs[i], mvert->co, oldverts[eve->keyindex].co);
+ if(eve->keyindex>=0)
+ VECSUB(ofs[i], mvert->co, oldverts[eve->keyindex].co);
+
eve= eve->next;
i++;
mvert++;
@@ -1305,12 +1295,15 @@ void load_editMesh(Scene *scene, Object *ob)
}
mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+
+ /* topology could be changed, ensure mdisps are ok */
+ multires_topology_changed(scene, obedit);
}
void remake_editMesh(Scene *scene, Object *ob)
{
make_editMesh(scene, ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
BIF_undo_push("Undo all changes");
}
@@ -1324,7 +1317,7 @@ static EnumPropertyItem prop_separate_types[] = {
};
/* return 1: success */
-static int mesh_separate_selected(Main *bmain, Scene *scene, Base *editbase)
+static int mesh_separate_selected(wmOperator *op, Main *bmain, Scene *scene, Base *editbase)
{
EditMesh *em, *emnew;
EditVert *eve, *v1;
@@ -1340,7 +1333,7 @@ static int mesh_separate_selected(Main *bmain, Scene *scene, Base *editbase)
me= obedit->data;
em= BKE_mesh_get_editmesh(me);
if(me->key) {
- error("Can't separate with vertex keys");
+ BKE_report(op->reports, RPT_WARNING, "Can't separate mesh with shape keys.");
BKE_mesh_end_editmesh(me, em);
return 0;
}
@@ -1426,8 +1419,8 @@ static int mesh_separate_selected(Main *bmain, Scene *scene, Base *editbase)
/* hashedges are invalid now, make new! */
editMesh_set_hash(em);
- DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
- DAG_id_flush_update(&basenew->object->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&basenew->object->id, OB_RECALC_DATA);
BKE_mesh_end_editmesh(me, em);
@@ -1435,7 +1428,7 @@ static int mesh_separate_selected(Main *bmain, Scene *scene, Base *editbase)
}
/* return 1: success */
-static int mesh_separate_material(Main *bmain, Scene *scene, Base *editbase)
+static int mesh_separate_material(wmOperator *op, Main *bmain, Scene *scene, Base *editbase)
{
Mesh *me= editbase->object->data;
EditMesh *em= BKE_mesh_get_editmesh(me);
@@ -1447,7 +1440,7 @@ static int mesh_separate_material(Main *bmain, Scene *scene, Base *editbase)
/* select the material */
EM_select_by_material(em, curr_mat);
/* and now separate */
- if(0==mesh_separate_selected(bmain, scene, editbase)) {
+ if(0==mesh_separate_selected(op, bmain, scene, editbase)) {
BKE_mesh_end_editmesh(me, em);
return 0;
}
@@ -1458,7 +1451,7 @@ static int mesh_separate_material(Main *bmain, Scene *scene, Base *editbase)
}
/* return 1: success */
-static int mesh_separate_loose(Main *bmain, Scene *scene, Base *editbase)
+static int mesh_separate_loose(wmOperator *op, Main *bmain, Scene *scene, Base *editbase)
{
Mesh *me;
EditMesh *em;
@@ -1498,7 +1491,7 @@ static int mesh_separate_loose(Main *bmain, Scene *scene, Base *editbase)
tot= BLI_countlist(&em->verts);
/* and now separate */
- doit= mesh_separate_selected(bmain, scene, editbase);
+ doit= mesh_separate_selected(op, bmain, scene, editbase);
/* with hidden verts this can happen */
if(tot == BLI_countlist(&em->verts))
@@ -1518,11 +1511,11 @@ static int mesh_separate_exec(bContext *C, wmOperator *op)
int retval= 0, type= RNA_enum_get(op->ptr, "type");
if(type == 0)
- retval= mesh_separate_selected(bmain, scene, base);
+ retval= mesh_separate_selected(op, bmain, scene, base);
else if(type == 1)
- retval= mesh_separate_material(bmain, scene, base);
+ retval= mesh_separate_material(op, bmain, scene, base);
else if(type == 2)
- retval= mesh_separate_loose(bmain, scene, base);
+ retval= mesh_separate_loose(op, bmain, scene, base);
if(retval) {
WM_event_add_notifier(C, NC_GEOM|ND_DATA, base->object->data);
@@ -1600,7 +1593,6 @@ typedef struct UndoMesh {
EditSelectionC *selected;
int totvert, totedge, totface, totsel;
int selectmode, shapenr;
- RetopoPaintData *retopo_paint_data;
char retopo_mode;
CustomData vdata, edata, fdata;
} UndoMesh;
@@ -1847,7 +1839,7 @@ static void *getEditMesh(bContext *C)
}
/* and this is all the undo system needs to know */
-void undo_push_mesh(bContext *C, char *name)
+void undo_push_mesh(bContext *C, const char *name)
{
undo_editmode_push(C, name, getEditMesh, free_undoMesh, undoMesh_to_editMesh, editMesh_to_undoMesh, NULL);
}
diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c
index 7dac8a465fa..d9db1e99bfa 100644
--- a/source/blender/editors/mesh/editmesh_add.c
+++ b/source/blender/editors/mesh/editmesh_add.c
@@ -44,6 +44,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
@@ -110,57 +111,98 @@ static short icoface[20][3] = {
static int dupli_extrude_cursor(bContext *C, wmOperator *op, wmEvent *event)
{
ViewContext vc;
- EditVert *eve, *v1;
+ EditVert *eve;
float min[3], max[3];
int done= 0;
-
+ short use_proj;
+
em_setup_viewcontext(C, &vc);
+
+ use_proj= (vc.scene->toolsettings->snap_flag & SCE_SNAP) && (vc.scene->toolsettings->snap_mode==SCE_SNAP_MODE_FACE);
+
+ invert_m4_m4(vc.obedit->imat, vc.obedit->obmat);
INIT_MINMAX(min, max);
- for(v1= vc.em->verts.first;v1; v1=v1->next) {
- if(v1->f & SELECT) {
- DO_MINMAX(v1->co, min, max);
+ for(eve= vc.em->verts.first; eve; eve= eve->next) {
+ if(eve->f & SELECT) {
+ DO_MINMAX(eve->co, min, max);
done= 1;
}
}
/* call extrude? */
if(done) {
+ short rot_src= RNA_boolean_get(op->ptr, "rotate_source");
EditEdge *eed;
float vec[3], cent[3], mat[3][3];
float nor[3]= {0.0, 0.0, 0.0};
- /* check for edges that are half selected, use for rotation */
+ /* 2D normal calc */
+ float mval_f[2];
+
+ mval_f[0]= (float)event->mval[0];
+ mval_f[1]= (float)event->mval[1];
+
done= 0;
+
+ /* calculate the normal for selected edges */
for(eed= vc.em->edges.first; eed; eed= eed->next) {
- if( (eed->v1->f & SELECT)+(eed->v2->f & SELECT) == SELECT ) {
- if(eed->v1->f & SELECT) sub_v3_v3v3(vec, eed->v1->co, eed->v2->co);
- else sub_v3_v3v3(vec, eed->v2->co, eed->v1->co);
- add_v3_v3(nor, vec);
+ if(eed->f & SELECT) {
+ float co1[3], co2[3];
+ mul_v3_m4v3(co1, vc.obedit->obmat, eed->v1->co);
+ mul_v3_m4v3(co2, vc.obedit->obmat, eed->v2->co);
+ project_float_noclip(vc.ar, co1, co1);
+ project_float_noclip(vc.ar, co2, co2);
+
+ /* 2D rotate by 90d while adding.
+ * (x, y) = (y, -x)
+ *
+ * accumulate the screenspace normal in 2D,
+ * with screenspace edge length weighting the result. */
+ if(line_point_side_v2(co1, co2, mval_f) >= 0.0f) {
+ nor[0] += (co1[1] - co2[1]);
+ nor[1] += -(co1[0] - co2[0]);
+ }
+ else {
+ nor[0] += (co2[1] - co1[1]);
+ nor[1] += -(co2[0] - co1[0]);
+ }
done= 1;
}
}
- if(done) normalize_v3(nor);
+
+ if(done) {
+ float view_vec[3], cross[3];
+
+ /* convert the 2D nomal into 3D */
+ mul_mat3_m4_v3(vc.rv3d->viewinv, nor); /* worldspace */
+ mul_mat3_m4_v3(vc.obedit->imat, nor); /* local space */
+
+ /* correct the normal to be aligned on the view plane */
+ copy_v3_v3(view_vec, vc.rv3d->viewinv[2]);
+ mul_mat3_m4_v3(vc.obedit->imat, view_vec);
+ cross_v3_v3v3(cross, nor, view_vec);
+ cross_v3_v3v3(nor, view_vec, cross);
+ normalize_v3(nor);
+ }
/* center */
- add_v3_v3v3(cent, min, max);
- mul_v3_fl(cent, 0.5f);
- VECCOPY(min, cent);
+ mid_v3_v3v3(cent, min, max);
+ copy_v3_v3(min, cent);
mul_m4_v3(vc.obedit->obmat, min); // view space
view3d_get_view_aligned_coordinate(&vc, min, event->mval);
- invert_m4_m4(vc.obedit->imat, vc.obedit->obmat);
mul_m4_v3(vc.obedit->imat, min); // back in object space
- sub_v3_v3v3(min, min, cent);
+ sub_v3_v3(min, cent);
/* calculate rotation */
unit_m3(mat);
if(done) {
float dot;
- VECCOPY(vec, min);
+ copy_v3_v3(vec, min);
normalize_v3(vec);
dot= INPR(vec, nor);
@@ -170,27 +212,38 @@ static int dupli_extrude_cursor(bContext *C, wmOperator *op, wmEvent *event)
cross_v3_v3v3(cross, nor, vec);
normalize_v3(cross);
dot= 0.5f*saacos(dot);
+
+ /* halve the rotation if its applied twice */
+ if(rot_src) dot *= 0.5f;
+
si= (float)sin(dot);
q1[0]= (float)cos(dot);
q1[1]= cross[0]*si;
q1[2]= cross[1]*si;
- q1[3]= cross[2]*si;
-
+ q1[3]= cross[2]*si;
quat_to_mat3( mat,q1);
}
}
+ if(rot_src) {
+ rotateflag(vc.em, SELECT, cent, mat);
+ /* also project the source, for retopo workflow */
+ if(use_proj)
+ EM_project_snap_verts(C, vc.ar, vc.obedit, vc.em);
+ }
+
extrudeflag(vc.obedit, vc.em, SELECT, nor, 0);
rotateflag(vc.em, SELECT, cent, mat);
translateflag(vc.em, SELECT, min);
recalc_editnormals(vc.em);
}
- else {
+ else if(vc.em->selectmode & SCE_SELECT_VERTEX) {
+
float mat[3][3],imat[3][3];
float *curs= give_cursor(vc.scene, vc.v3d);
- VECCOPY(min, curs);
+ copy_v3_v3(min, curs);
view3d_get_view_aligned_coordinate(&vc, min, event->mval);
eve= addvertlist(vc.em, 0, NULL);
@@ -198,16 +251,18 @@ static int dupli_extrude_cursor(bContext *C, wmOperator *op, wmEvent *event)
copy_m3_m4(mat, vc.obedit->obmat);
invert_m3_m3(imat, mat);
- VECCOPY(eve->co, min);
+ copy_v3_v3(eve->co, min);
mul_m3_v3(imat, eve->co);
sub_v3_v3v3(eve->co, eve->co, vc.obedit->obmat[3]);
eve->f= SELECT;
}
-
- //retopo_do_all();
+
+ if(use_proj)
+ EM_project_snap_verts(C, vc.ar, vc.obedit, vc.em);
+
WM_event_add_notifier(C, NC_GEOM|ND_DATA, vc.obedit->data);
- DAG_id_flush_update(vc.obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(vc.obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -225,6 +280,8 @@ void MESH_OT_dupli_extrude_cursor(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_boolean(ot->srna, "rotate_source", 1, "Rotate Source", "Rotate initial selection giving better shape");
}
@@ -303,13 +360,13 @@ int make_fgon(EditMesh *em, wmOperator *op, int make)
if(eve->f1==1) break;
}
if(eve) {
- BKE_report(op->reports, RPT_ERROR, "Cannot make a polygon with interior vertices");
+ BKE_report(op->reports, RPT_WARNING, "Cannot make a polygon with interior vertices");
return 0;
}
// check for faces
if(nor==NULL) {
- BKE_report(op->reports, RPT_ERROR, "No faces were selected to make FGon");
+ BKE_report(op->reports, RPT_WARNING, "No faces were selected to make FGon");
return 0;
}
@@ -332,7 +389,7 @@ static int make_fgon_exec(bContext *C, wmOperator *op)
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
if( make_fgon(em, op, 1) ) {
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -364,7 +421,7 @@ static int clear_fgon_exec(bContext *C, wmOperator *op)
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
if( make_fgon(em, op, 0) ) {
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -653,7 +710,7 @@ void addfaces_from_edgenet(EditMesh *em)
EM_select_flush(em);
-// XXX DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+// XXX DAG_id_tag_update(obedit->data, 0);
}
static void addedgeface_mesh(EditMesh *em, wmOperator *op)
@@ -682,7 +739,7 @@ static void addedgeface_mesh(EditMesh *em, wmOperator *op)
eed= addedgelist(em, neweve[0], neweve[1], NULL);
EM_select_edge(eed, 1);
- // XXX DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ // XXX DAG_id_tag_update(obedit->data, 0);
return;
}
else if(amount > 4) {
@@ -690,7 +747,7 @@ static void addedgeface_mesh(EditMesh *em, wmOperator *op)
return;
}
else if(amount<2) {
- BKE_report(op->reports, RPT_ERROR, "More vertices are needed to make an edge/face");
+ BKE_report(op->reports, RPT_WARNING, "More vertices are needed to make an edge/face");
return;
}
@@ -702,7 +759,7 @@ static void addedgeface_mesh(EditMesh *em, wmOperator *op)
efa= addfacelist(em, neweve[0], neweve[1], neweve[2], 0, NULL, NULL);
EM_select_face(efa, 1);
}
- else BKE_report(op->reports, RPT_ERROR, "The selected vertices already form a face");
+ else BKE_report(op->reports, RPT_WARNING, "The selected vertices already form a face");
}
else if(amount==4) {
/* this test survives when theres 2 triangles */
@@ -754,14 +811,14 @@ static void addedgeface_mesh(EditMesh *em, wmOperator *op)
else if( convex(neweve[0]->co, neweve[3]->co, neweve[1]->co, neweve[2]->co) ) {
efa= addfacelist(em, neweve[0], neweve[3], neweve[1], neweve[2], NULL, NULL);
}
- else BKE_report(op->reports, RPT_ERROR, "cannot find nice quad from concave set of vertices");
+ else BKE_report(op->reports, RPT_WARNING, "cannot find nice quad from concave set of vertices");
}
}
}
- else BKE_report(op->reports, RPT_ERROR, "The selected vertices already form a face");
+ else BKE_report(op->reports, RPT_WARNING, "The selected vertices already form a face");
}
- else BKE_report(op->reports, RPT_ERROR, "The selected vertices already form a face");
+ else BKE_report(op->reports, RPT_WARNING, "The selected vertices already form a face");
}
if(efa) {
@@ -780,7 +837,7 @@ static int addedgeface_mesh_exec(bContext *C, wmOperator *op)
addedgeface_mesh(em, op);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -997,15 +1054,13 @@ static void make_prim(Object *obedit, int type, float mat[4][4], int tot, int se
/* one segment first: the X axis */
phi = (2*dia)/(float)(tot-1);
phid = (2*dia)/(float)(seg-1);
- for(a=0;a<tot;a++) {
+ for(a=tot-1;a>=0;a--) {
vec[0] = (phi*a) - dia;
vec[1]= - dia;
vec[2]= 0.0f;
eve= addvertlist(em, vec, NULL);
eve->f= 1+2+4;
- if (a) {
- addedgelist(em, eve->prev, eve, NULL);
- }
+ if(a < tot -1) addedgelist(em, eve->prev, eve, NULL);
}
/* extrude and translate */
vec[0]= vec[2]= 0.0;
@@ -1015,7 +1070,17 @@ static void make_prim(Object *obedit, int type, float mat[4][4], int tot, int se
extrudeflag_vert(obedit, em, 2, nor, 0); // nor unused
translateflag(em, 2, vec);
}
+
+ /* and now do imat */
+ eve= em->verts.first;
+ while(eve) {
+ if(eve->f & SELECT) {
+ mul_m4_v3(mat,eve->co);
+ }
+ eve= eve->next;
+ }
break;
+
case PRIM_UVSPHERE: /* UVsphere */
/* clear all flags */
@@ -1148,7 +1213,10 @@ static void make_prim(Object *obedit, int type, float mat[4][4], int tot, int se
else if(ext==0)
depth= 0.0f;
- /* vertices */
+ /* first vertex at 0° for circular objects */
+ if( ELEM3(type, PRIM_CIRCLE,PRIM_CYLINDER,PRIM_CONE) )
+ phi = 0.0f;
+
vtop= vdown= v1= v2= 0;
for(b=0; b<=ext; b++) {
for(a=0; a<tot; a++) {
@@ -1259,7 +1327,7 @@ static void make_prim(Object *obedit, int type, float mat[4][4], int tot, int se
/* ********* add primitive operators ************* */
-static char *get_mesh_defname(int type)
+static const char *get_mesh_defname(int type)
{
switch (type) {
case PRIM_PLANE: return "Plane";
@@ -1295,7 +1363,7 @@ static void make_prim_ext(bContext *C, float *loc, float *rot, int enter_editmod
ED_object_enter_editmode(C, EM_DO_UNDO|EM_IGNORE_LAYER); /* rare cases the active layer is messed up */
newob = 1;
}
- else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ else DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
scale= ED_object_new_primitive_matrix(C, obedit, loc, rot, mat);
@@ -1304,7 +1372,7 @@ static void make_prim_ext(bContext *C, float *loc, float *rot, int enter_editmod
make_prim(obedit, type, mat, tot, seg, subdiv, dia, depth, ext, fill);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -1499,7 +1567,7 @@ void MESH_OT_primitive_cone_add(wmOperatorType *ot)
RNA_def_int(ot->srna, "vertices", 32, INT_MIN, INT_MAX, "Vertices", "", 2, 500);
RNA_def_float(ot->srna, "radius", 1.0f, 0.0, FLT_MAX, "Radius", "", 0.001, 100.00);
RNA_def_float(ot->srna, "depth", 2.0f, 0.0, FLT_MAX, "Depth", "", 0.001, 100.00);
- RNA_def_boolean(ot->srna, "cap_end", 0, "Cap End", "");
+ RNA_def_boolean(ot->srna, "cap_end", 1, "Cap End", "");
ED_object_add_generic_props(ot, TRUE);
}
@@ -1657,7 +1725,7 @@ void MESH_OT_primitive_ico_sphere_add(wmOperatorType *ot)
/****************** add duplicate operator ***************/
-static int mesh_duplicate_exec(bContext *C, wmOperator *op)
+static int mesh_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh(ob->data);
@@ -1666,13 +1734,13 @@ static int mesh_duplicate_exec(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(ob->data, em);
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
return OPERATOR_FINISHED;
}
-static int mesh_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int mesh_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
WM_cursor_wait(1);
mesh_duplicate_exec(C, op);
diff --git a/source/blender/editors/mesh/editmesh_lib.c b/source/blender/editors/mesh/editmesh_lib.c
index d34cca0d358..9ec50fdd6b3 100644
--- a/source/blender/editors/mesh/editmesh_lib.c
+++ b/source/blender/editors/mesh/editmesh_lib.c
@@ -48,16 +48,18 @@ editmesh_lib: generic (no UI, no menus) operations/evaluators for editmesh data
#include "BLI_math.h"
#include "BLI_editVert.h"
#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
#include "BKE_customdata.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_mesh.h"
-#include "BKE_utildefines.h"
+
#include "ED_mesh.h"
#include "ED_screen.h"
#include "ED_view3d.h"
+#include "ED_transform.h"
#include "mesh_intern.h"
@@ -214,7 +216,7 @@ static int EM_check_selection(EditMesh *em, void *data)
return 0;
}
-void EM_remove_selection(EditMesh *em, void *data, int type)
+void EM_remove_selection(EditMesh *em, void *data, int UNUSED(type))
{
EditSelection *ese;
for(ese=em->selected.first; ese; ese = ese->next){
@@ -358,7 +360,7 @@ void EM_editselection_plane(float *plane, EditSelection *ese)
however selecting different edges can swap the direction of the y axis.
this makes it less likely for the y axis of the manipulator
(running along the edge).. to flip less often.
- at least its more pradictable */
+ at least its more predictable */
if (eed->v2->co[1] > eed->v1->co[1]) /*check which to do first */
sub_v3_v3v3(plane, eed->v2->co, eed->v1->co);
else
@@ -697,7 +699,7 @@ static void check_fgons_selection(EditMesh *em)
if(sel) efa->f |= SELECT;
else efa->f &= ~SELECT;
}
- addlisttolist(&em->faces, &lbar[index]);
+ BLI_movelisttolist(&em->faces, &lbar[index]);
}
MEM_freeN(lbar);
@@ -1050,7 +1052,7 @@ static void set_edge_directions_f2(EditMesh *em, int val)
/* individual face extrude */
/* will use vertex normals for extrusion directions, so *nor is unaffected */
-short extrudeflag_face_indiv(EditMesh *em, short flag, float *nor)
+short extrudeflag_face_indiv(EditMesh *em, short UNUSED(flag), float *UNUSED(nor))
{
EditVert *eve, *v1, *v2, *v3, *v4;
EditEdge *eed;
@@ -1204,7 +1206,7 @@ short extrudeflag_edges_indiv(EditMesh *em, short flag, float *nor)
}
/* extrudes individual vertices */
-short extrudeflag_verts_indiv(EditMesh *em, short flag, float *nor)
+short extrudeflag_verts_indiv(EditMesh *em, short flag, float *UNUSED(nor))
{
EditVert *eve;
@@ -1230,7 +1232,7 @@ short extrudeflag_verts_indiv(EditMesh *em, short flag, float *nor)
/* this is actually a recode of extrudeflag(), using proper edge/face select */
/* hurms, doesnt use 'flag' yet, but its not called by primitive making stuff anyway */
-static short extrudeflag_edge(Object *obedit, EditMesh *em, short flag, float *nor, int all)
+static short extrudeflag_edge(Object *obedit, EditMesh *em, short UNUSED(flag), float *nor, int all)
{
/* all select edges/faces: extrude */
/* old select is cleared, in new ones it is set */
@@ -1390,27 +1392,22 @@ static short extrudeflag_edge(Object *obedit, EditMesh *em, short flag, float *n
if (efa->v4 && (efa->v4->tmp.v == NULL))
efa->v4->tmp.v = addvertlist(em, efa->v4->co, efa->v4);
- if(del_old==0) { // keep old faces means flipping normal
- if(efa->v4)
- efan = addfacelist(em, efa->v4->tmp.v, efa->v3->tmp.v,
- efa->v2->tmp.v, efa->v1->tmp.v, efa, efa);
- else
- efan = addfacelist(em, efa->v3->tmp.v, efa->v2->tmp.v,
- efa->v1->tmp.v, NULL, efa, efa);
- }
- else {
- if(efa->v4)
- efan = addfacelist(em, efa->v1->tmp.v, efa->v2->tmp.v,
- efa->v3->tmp.v, efa->v4->tmp.v, efa, efa);
- else
- efan = addfacelist(em, efa->v1->tmp.v, efa->v2->tmp.v,
- efa->v3->tmp.v, NULL, efa, efa);
+ if(efa->v4)
+ efan = addfacelist(em, efa->v1->tmp.v, efa->v2->tmp.v,
+ efa->v3->tmp.v, efa->v4->tmp.v, efa, efa);
+ else
+ efan = addfacelist(em, efa->v1->tmp.v, efa->v2->tmp.v,
+ efa->v3->tmp.v, NULL, efa, efa);
+
+ /* keep old faces means flipping normal, reverse vertex order gives bad UV's & VCols etc - [#25260] */
+ if(del_old==0) {
+ flipface(em, efan);
}
-
+
if (em->act_face == efa) {
em->act_face = efan;
}
-
+
/* for transform */
add_normal_aligned(nor, efa->n);
}
@@ -1640,10 +1637,10 @@ short extrudeflag_vert(Object *obedit, EditMesh *em, short flag, float *nor, int
VECCOPY(v1->co, eve->co);
VECCOPY(v1->no, eve->no);
v1->f= eve->f;
- eve->f-= flag;
+ eve->f &= ~flag;
eve->tmp.v = v1;
}
- else eve->tmp.v = 0;
+ else eve->tmp.v = NULL;
eve= eve->prev;
}
@@ -1701,17 +1698,7 @@ short extrudeflag_vert(Object *obedit, EditMesh *em, short flag, float *nor, int
eed= nexted;
}
- if(del_old) {
- eed= em->edges.first;
- while(eed) {
- nexted= eed->next;
- if(eed->f2==3 && eed->f1==1) {
- remedge(em, eed);
- free_editedge(em, eed);
- }
- eed= nexted;
- }
- }
+
/* duplicate faces, if necessary remove old ones */
efa= em->faces.first;
while(efa) {
@@ -1724,7 +1711,7 @@ short extrudeflag_vert(Object *obedit, EditMesh *em, short flag, float *nor, int
if(efa->v4)
v4 = efa->v4->tmp.v;
else
- v4= 0;
+ v4= NULL;
/* hmm .. not sure about edges here */
if(del_old==0) // if we keep old, we flip normal
@@ -1742,6 +1729,18 @@ short extrudeflag_vert(Object *obedit, EditMesh *em, short flag, float *nor, int
}
efa= nextvl;
}
+ /* delete edges after copying edges above! */
+ if(del_old) {
+ eed= em->edges.first;
+ while(eed) {
+ nexted= eed->next;
+ if(eed->f2==3 && eed->f1==1) {
+ remedge(em, eed);
+ free_editedge(em, eed);
+ }
+ eed= nexted;
+ }
+ }
normalize_v3(nor); // for grab
@@ -1827,7 +1826,7 @@ static EditVert *adduplicate_vertex(EditMesh *em, EditVert *eve, int flag)
EditVert *v1= addvertlist(em, eve->co, eve);
v1->f= eve->f;
- eve->f-= flag;
+ eve->f &= ~flag;
eve->f|= 128;
eve->tmp.v = v1;
@@ -1866,7 +1865,7 @@ void adduplicateflag(EditMesh *em, int flag)
newed= addedgelist(em, v1, v2, eed);
newed->f= eed->f;
- eed->f -= flag;
+ eed->f &= ~flag;
eed->f |= 128;
}
}
@@ -1893,7 +1892,7 @@ void adduplicateflag(EditMesh *em, int flag)
}
newfa->f= efa->f;
- efa->f -= flag;
+ efa->f &= ~flag;
efa->f |= 128;
}
}
@@ -2443,7 +2442,7 @@ void EM_make_hq_normals(EditMesh *em)
for(edge_iter = BLI_edgehashIterator_new(edge_hash); !BLI_edgehashIterator_isDone(edge_iter); BLI_edgehashIterator_step(edge_iter)) {
- /* Get the edge vert indicies, and edge value (the face indicies that use it)*/
+ /* Get the edge vert indices, and edge value (the face indices that use it)*/
BLI_edgehashIterator_getKey(edge_iter, (int*)&ed_v1, (int*)&ed_v2);
edge_ref = BLI_edgehashIterator_getValue(edge_iter);
@@ -2577,18 +2576,23 @@ void em_deselect_nth_face(EditMesh *em, int nth, EditFace *efa_act)
ok = 0;
for (efa= em->faces.first; efa; efa= efa->next) {
- if(efa->tmp.l==1) { /* initialize */
- tag_face_edges(efa);
+ if(efa->f & SELECT) {
+ if(efa->tmp.l==1) { /* initialize */
+ tag_face_edges(efa);
+ }
+
+ if(efa->tmp.l) {
+ efa->tmp.l++;
+ }
}
-
- if(efa->tmp.l)
- efa->tmp.l++;
}
for (efa= em->faces.first; efa; efa= efa->next) {
- if(efa->tmp.l==0 && tag_face_edges_test(efa)) {
- efa->tmp.l= 1;
- ok = 1; /* keep looping */
+ if(efa->f & SELECT) {
+ if(efa->tmp.l==0 && tag_face_edges_test(efa)) {
+ efa->tmp.l= 1;
+ ok = 1; /* keep looping */
+ }
}
}
}
@@ -2643,18 +2647,23 @@ void em_deselect_nth_edge(EditMesh *em, int nth, EditEdge *eed_act)
ok = 0;
for (eed= em->edges.first; eed; eed= eed->next) {
- if(eed->tmp.l==1) { /* initialize */
- tag_edge_verts(eed);
+ if(eed->f & SELECT) {
+ if(eed->tmp.l==1) { /* initialize */
+ tag_edge_verts(eed);
+ }
+
+ if(eed->tmp.l) {
+ eed->tmp.l++;
+ }
}
-
- if(eed->tmp.l)
- eed->tmp.l++;
}
for (eed= em->edges.first; eed; eed= eed->next) {
- if(eed->tmp.l==0 && tag_edge_verts_test(eed)) {
- eed->tmp.l= 1;
- ok = 1; /* keep looping */
+ if(eed->f & SELECT) {
+ if(eed->tmp.l==0 && tag_edge_verts_test(eed)) {
+ eed->tmp.l= 1;
+ ok = 1; /* keep looping */
+ }
}
}
}
@@ -2710,18 +2719,22 @@ void em_deselect_nth_vert(EditMesh *em, int nth, EditVert *eve_act)
ok = 0;
for (eve= em->verts.first; eve; eve= eve->next) {
- if(eve->tmp.l)
- eve->tmp.l++;
+ if(eve->f & SELECT) {
+ if(eve->tmp.l)
+ eve->tmp.l++;
+ }
}
for (eed= em->edges.first; eed; eed= eed->next) {
- if(eed->v1->tmp.l==2 && eed->v2->tmp.l==0) { /* initialize */
- eed->v2->tmp.l= 1;
- ok = 1; /* keep looping */
- }
- else if(eed->v2->tmp.l==2 && eed->v1->tmp.l==0) { /* initialize */
- eed->v1->tmp.l= 1;
- ok = 1; /* keep looping */
+ if(eed->f & SELECT) {
+ if(eed->v1->tmp.l==2 && eed->v2->tmp.l==0) { /* initialize */
+ eed->v2->tmp.l= 1;
+ ok = 1; /* keep looping */
+ }
+ else if(eed->v2->tmp.l==2 && eed->v1->tmp.l==0) { /* initialize */
+ eed->v1->tmp.l= 1;
+ ok = 1; /* keep looping */
+ }
}
}
}
@@ -2739,29 +2752,91 @@ void em_deselect_nth_vert(EditMesh *em, int nth, EditVert *eve_act)
// EM_nfaces_selected(em); // flush does these
}
-int EM_deselect_nth(EditMesh *em, int nth)
+static void deselect_nth_active(EditMesh *em, EditVert **eve_p, EditEdge **eed_p, EditFace **efa_p)
{
EditSelection *ese;
- ese = ((EditSelection*)em->selected.last);
+
+ *eve_p= NULL;
+ *eed_p= NULL;
+ *efa_p= NULL;
+
+ ese= (EditSelection*)em->selected.last;
+
if(ese) {
- if(ese->type == EDITVERT) {
- em_deselect_nth_vert(em, nth, (EditVert*)ese->data);
- return 1;
+ switch(ese->type) {
+ case EDITVERT:
+ *eve_p= (EditVert *)ese->data;
+ return;
+ case EDITEDGE:
+ *eed_p= (EditEdge *)ese->data;
+ return;
+ case EDITFACE:
+ *efa_p= (EditFace *)ese->data;
+ return;
}
+ }
- if(ese->type == EDITEDGE) {
- em_deselect_nth_edge(em, nth, (EditEdge*)ese->data);
- return 1;
+ if(em->selectmode & SCE_SELECT_VERTEX) {
+ EditVert *eve;
+ for (eve= em->verts.first; eve; eve= eve->next) {
+ if(eve->f & SELECT) {
+ *eve_p= eve;
+ return;
+ }
}
}
- else {
- EditFace *efa_act = EM_get_actFace(em, 0);
- if(efa_act) {
- em_deselect_nth_face(em, nth, efa_act);
- return 1;
+
+ if(em->selectmode & SCE_SELECT_EDGE) {
+ EditEdge *eed;
+ for (eed= em->edges.first; eed; eed= eed->next) {
+ if(eed->f & SELECT) {
+ *eed_p= eed;
+ return;
+ }
}
}
- return 0;
+ if(em->selectmode & SCE_SELECT_FACE) {
+ EditFace *efa= EM_get_actFace(em, 1);
+ if(efa) {
+ *efa_p= efa;
+ return;
+ }
+ }
+}
+
+int EM_deselect_nth(EditMesh *em, int nth)
+{
+ EditVert *eve;
+ EditEdge *eed;
+ EditFace *efa;
+
+ deselect_nth_active(em, &eve, &eed, &efa);
+
+ if(eve)
+ em_deselect_nth_vert(em, nth, eve);
+ else if (eed)
+ em_deselect_nth_edge(em, nth, eed);
+ else if (efa)
+ em_deselect_nth_face(em, nth, efa);
+ else
+ return 0;
+
+ return 1;
}
+void EM_project_snap_verts(bContext *C, ARegion *ar, Object *obedit, EditMesh *em)
+{
+ EditVert *eve;
+ for(eve= em->verts.first;eve; eve=eve->next) {
+ if(eve->f & SELECT) {
+ float mval[2], vec[3], no_dummy[3];
+ int dist_dummy;
+ mul_v3_m4v3(vec, obedit->obmat, eve->co);
+ project_float_noclip(ar, vec, mval);
+ if(snapObjectsContext(C, mval, &dist_dummy, vec, no_dummy, SNAP_NOT_OBEDIT)) {
+ mul_v3_m4v3(eve->co, obedit->imat, vec);
+ }
+ }
+ }
+}
diff --git a/source/blender/editors/mesh/editmesh_loop.c b/source/blender/editors/mesh/editmesh_loop.c
index 682fbca5072..4ffd458d66c 100644
--- a/source/blender/editors/mesh/editmesh_loop.c
+++ b/source/blender/editors/mesh/editmesh_loop.c
@@ -46,12 +46,14 @@ editmesh_loop: tools with own drawing subloops, select, knife, subdiv
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_editVert.h"
#include "BLI_ghash.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_mesh.h"
+#include "BKE_array_mallocn.h"
#include "PIL_time.h"
@@ -69,10 +71,10 @@ editmesh_loop: tools with own drawing subloops, select, knife, subdiv
#include "mesh_intern.h"
/* **** XXX ******** */
-static void BIF_undo_push(const char *dummy) {}
-static void BIF_undo() {}
-static void error(const char *dummy) {}
-static int qtest() {return 0;}
+static void BIF_undo_push(const char *UNUSED(arg)) {}
+static void BIF_undo(void) {}
+static void error(const char *UNUSED(arg)) {}
+static int qtest(void) {return 0;}
/* **** XXX ******** */
@@ -376,7 +378,7 @@ void CutEdgeloop(Object *obedit, wmOperator *op, EditMesh *em, int numcuts)
EM_selectmode_set(em);
}
-// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+// DAG_id_tag_update(obedit->data, 0);
return;
}
@@ -632,7 +634,7 @@ static int knife_cut_exec(bContext *C, wmOperator *op)
if (EM_nvertices_selected(em) < 2) {
error("No edges are selected to operate on");
BKE_mesh_end_editmesh(obedit->data, em);
- return OPERATOR_CANCELLED;;
+ return OPERATOR_CANCELLED;
}
/* get the cut curve */
@@ -696,7 +698,7 @@ static int knife_cut_exec(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c
index 7316e24ce65..6488dc17fb4 100644
--- a/source/blender/editors/mesh/editmesh_mods.c
+++ b/source/blender/editors/mesh/editmesh_mods.c
@@ -35,12 +35,9 @@ editmesh_mods.c, UI level access, no geometry changes
#include <stdlib.h>
#include <string.h>
-#include <math.h>
#include "MEM_guardedalloc.h"
-
-
#include "DNA_material_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
@@ -51,6 +48,7 @@ editmesh_mods.c, UI level access, no geometry changes
#include "BLI_math.h"
#include "BLI_editVert.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_displist.h"
@@ -59,6 +57,7 @@ editmesh_mods.c, UI level access, no geometry changes
#include "BKE_material.h"
#include "BKE_paint.h"
#include "BKE_report.h"
+#include "BKE_texture.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -83,8 +82,8 @@ editmesh_mods.c, UI level access, no geometry changes
#include "BLO_sys_types.h" // for intptr_t support
/* XXX */
-static void waitcursor(int val) {}
-static int pupmenu(const char *dummy) {return 0;}
+static void waitcursor(int UNUSED(val)) {}
+static int pupmenu(const char *UNUSED(arg)) {return 0;}
/* ****************************** MIRROR **************** */
@@ -138,14 +137,13 @@ void EM_automerge(Scene *scene, Object *obedit, int update)
(obedit && obedit->type==OB_MESH && (obedit->mode & OB_MODE_EDIT)) &&
(me->mr==NULL)
) {
- Mesh *me= (Mesh*)obedit->data;
EditMesh *em= me->edit_mesh;
len = removedoublesflag(em, 1, 1, scene->toolsettings->doublimit);
if (len) {
em->totvert -= len; /* saves doing a countall */
if (update) {
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
}
}
}
@@ -258,6 +256,7 @@ int EM_mask_init_backbuf_border(ViewContext *vc, short mcords[][2], short tot, s
unsigned int *dr, *drm;
struct ImBuf *buf, *bufmask;
int a;
+ GLboolean is_cull;
/* method in use for face selecting too */
if(vc->obedit==NULL) {
@@ -276,10 +275,14 @@ int EM_mask_init_backbuf_border(ViewContext *vc, short mcords[][2], short tot, s
glDisable(GL_DEPTH_TEST);
glColor3ub(0, 0, 0);
+
+ /* some opengl drivers have problems with draw direction */
+ glGetBooleanv(GL_CULL_FACE, &is_cull);
+ if(is_cull) glDisable(GL_CULL_FACE);
/* yah, opengl doesn't do concave... tsk! */
ED_region_pixelspace(vc->ar);
- draw_triangulated(mcords, tot);
+ draw_triangulated(mcords, tot);
glBegin(GL_LINE_LOOP); /* for zero sized masks, lines */
for(a=0; a<tot; a++) glVertex2s(mcords[a][0], mcords[a][1]);
@@ -302,6 +305,9 @@ int EM_mask_init_backbuf_border(ViewContext *vc, short mcords[][2], short tot, s
}
IMB_freeImBuf(buf);
IMB_freeImBuf(bufmask);
+
+ if(is_cull) glEnable(GL_CULL_FACE);
+
return 1;
}
@@ -467,7 +473,7 @@ static float labda_PdistVL2Dfl( float *v1, float *v2, float *v3)
}
/* note; uses v3d, so needs active 3d window */
-static void findnearestedge__doClosest(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index)
+static void findnearestedge__doClosest(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int UNUSED(index))
{
struct { ViewContext vc; float mval[2]; int dist; EditEdge *closest; } *data = userData;
float v1[2], v2[2];
@@ -536,7 +542,7 @@ EditEdge *findnearestedge(ViewContext *vc, int *dist)
}
}
-static void findnearestface__getDistance(void *userData, EditFace *efa, int x, int y, int index)
+static void findnearestface__getDistance(void *userData, EditFace *efa, int x, int y, int UNUSED(index))
{
struct { short mval[2]; int dist; EditFace *toFace; } *data = userData;
@@ -725,7 +731,7 @@ static EnumPropertyItem prop_similar_types[] = {
*0.5 so smaller faces arnt ALWAYS selected with a thresh of 1.0 */
#define SCALE_CMP(a,b) ((a+a*thresh >= b) && (a-(a*thresh*0.5) <= b))
-static int similar_face_select__internal(Scene *scene, EditMesh *em, int mode)
+static int similar_face_select__internal(EditMesh *em, int mode, float thresh)
{
EditFace *efa, *base_efa=NULL;
unsigned int selcount=0; /*count how many new faces we select*/
@@ -733,7 +739,6 @@ static int similar_face_select__internal(Scene *scene, EditMesh *em, int mode)
/*deselcount, count how many deselected faces are left, so we can bail out early
also means that if there are no deselected faces, we can avoid a lot of looping */
unsigned int deselcount=0;
- float thresh= scene->toolsettings->select_thresh;
short ok=0;
for(efa= em->faces.first; efa; efa= efa->next) {
@@ -853,12 +858,11 @@ static int similar_face_select__internal(Scene *scene, EditMesh *em, int mode)
static int similar_face_select_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
Mesh *me= obedit->data;
EditMesh *em= BKE_mesh_get_editmesh(me);
- int selcount = similar_face_select__internal(scene, em, RNA_int_get(op->ptr, "type"));
+ int selcount = similar_face_select__internal(em, RNA_int_get(op->ptr, "type"), RNA_float_get(op->ptr, "threshold"));
if (selcount) {
/* here was an edge-mode only select flush case, has to be generalized */
@@ -874,7 +878,7 @@ static int similar_face_select_exec(bContext *C, wmOperator *op)
/* ***************************************************** */
-static int similar_edge_select__internal(ToolSettings *ts, EditMesh *em, int mode)
+static int similar_edge_select__internal(EditMesh *em, int mode, float thresh)
{
EditEdge *eed, *base_eed=NULL;
unsigned int selcount=0; /* count how many new edges we select*/
@@ -884,7 +888,6 @@ static int similar_edge_select__internal(ToolSettings *ts, EditMesh *em, int mod
unsigned int deselcount=0;
short ok=0;
- float thresh= ts->select_thresh;
for(eed= em->edges.first; eed; eed= eed->next) {
if (!eed->h) {
@@ -1074,12 +1077,11 @@ static int similar_edge_select__internal(ToolSettings *ts, EditMesh *em, int mod
/* wrap the above function but do selection flushing edge to face */
static int similar_edge_select_exec(bContext *C, wmOperator *op)
{
- ToolSettings *ts= CTX_data_tool_settings(C);
Object *obedit= CTX_data_edit_object(C);
Mesh *me= obedit->data;
EditMesh *em= BKE_mesh_get_editmesh(me);
- int selcount = similar_edge_select__internal(ts, em, RNA_int_get(op->ptr, "type"));
+ int selcount = similar_edge_select__internal(em, RNA_int_get(op->ptr, "type"), RNA_float_get(op->ptr, "threshold"));
if (selcount) {
/* here was an edge-mode only select flush case, has to be generalized */
@@ -1097,7 +1099,6 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op)
static int similar_vert_select_exec(bContext *C, wmOperator *op)
{
- ToolSettings *ts= CTX_data_tool_settings(C);
Object *obedit= CTX_data_edit_object(C);
Mesh *me= obedit->data;
EditMesh *em= BKE_mesh_get_editmesh(me);
@@ -1108,9 +1109,9 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
so we can return when there are none left */
unsigned int deselcount=0;
int mode= RNA_enum_get(op->ptr, "type");
+ float thresh = RNA_float_get(op->ptr, "threshold");
short ok=0;
- float thresh= ts->select_thresh;
for(eve= em->verts.first; eve; eve= eve->next) {
if (!eve->h) {
@@ -1244,7 +1245,7 @@ static int select_similar_exec(bContext *C, wmOperator *op)
return similar_face_select_exec(C, op);
}
-static EnumPropertyItem *select_similar_type_itemf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *select_similar_type_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
Object *obedit= CTX_data_edit_object(C);
EnumPropertyItem *item= NULL;
@@ -1298,6 +1299,7 @@ void MESH_OT_select_similar(wmOperatorType *ot)
prop= RNA_def_enum(ot->srna, "type", prop_similar_types, SIMVERT_NORMAL, "Type", "");
RNA_def_enum_funcs(prop, select_similar_type_itemf);
ot->prop= prop;
+ RNA_def_float(ot->srna, "threshold", 0.01f, 0.0f, FLT_MAX, "Threshold", "", 0.0f, 100.f);
}
/* ******************************************* */
@@ -1425,7 +1427,7 @@ void EM_mesh_copy_edge(EditMesh *em, short type)
}
if (change) {
-// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+// DAG_id_tag_update(obedit->data, 0);
}
}
@@ -1456,7 +1458,7 @@ void EM_mesh_copy_face(EditMesh *em, wmOperator *op, short type)
break;
case 2: /* copy image */
if (!tf_act) {
- BKE_report(op->reports, RPT_ERROR, "Mesh has no uv/image layers.");
+ BKE_report(op->reports, RPT_WARNING, "Mesh has no uv/image layers.");
return;
}
for(efa=em->faces.first; efa; efa=efa->next) {
@@ -1477,7 +1479,7 @@ void EM_mesh_copy_face(EditMesh *em, wmOperator *op, short type)
case 3: /* copy UV's */
if (!tf_act) {
- BKE_report(op->reports, RPT_ERROR, "Mesh has no uv/image layers.");
+ BKE_report(op->reports, RPT_WARNING, "Mesh has no uv/image layers.");
return;
}
for(efa=em->faces.first; efa; efa=efa->next) {
@@ -1490,7 +1492,7 @@ void EM_mesh_copy_face(EditMesh *em, wmOperator *op, short type)
break;
case 4: /* mode's */
if (!tf_act) {
- BKE_report(op->reports, RPT_ERROR, "Mesh has no uv/image layers.");
+ BKE_report(op->reports, RPT_WARNING, "Mesh has no uv/image layers.");
return;
}
for(efa=em->faces.first; efa; efa=efa->next) {
@@ -1503,7 +1505,7 @@ void EM_mesh_copy_face(EditMesh *em, wmOperator *op, short type)
break;
case 5: /* copy transp's */
if (!tf_act) {
- BKE_report(op->reports, RPT_ERROR, "Mesh has no uv/image layers.");
+ BKE_report(op->reports, RPT_WARNING, "Mesh has no uv/image layers.");
return;
}
for(efa=em->faces.first; efa; efa=efa->next) {
@@ -1517,7 +1519,7 @@ void EM_mesh_copy_face(EditMesh *em, wmOperator *op, short type)
case 6: /* copy vcols's */
if (!mcol_act) {
- BKE_report(op->reports, RPT_ERROR, "Mesh has no color layers.");
+ BKE_report(op->reports, RPT_WARNING, "Mesh has no color layers.");
return;
} else {
/* guess the 4th color if needs be */
@@ -1553,7 +1555,7 @@ void EM_mesh_copy_face(EditMesh *em, wmOperator *op, short type)
}
if (change) {
-// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+// DAG_id_tag_update(obedit->data, 0);
}
}
@@ -1574,7 +1576,7 @@ void EM_mesh_copy_face_layer(EditMesh *em, wmOperator *op, short type)
case 8:
case 9:
if (CustomData_number_of_layers(&em->fdata, CD_MTFACE)<2) {
- BKE_report(op->reports, RPT_ERROR, "mesh does not have multiple uv/image layers");
+ BKE_report(op->reports, RPT_WARNING, "mesh does not have multiple uv/image layers");
return;
} else {
int layer_orig_idx, layer_idx;
@@ -1601,7 +1603,7 @@ void EM_mesh_copy_face_layer(EditMesh *em, wmOperator *op, short type)
case 10: /* select vcol layers - make sure this stays in sync with above code */
if (CustomData_number_of_layers(&em->fdata, CD_MCOL)<2) {
- BKE_report(op->reports, RPT_ERROR, "mesh does not have multiple color layers");
+ BKE_report(op->reports, RPT_WARNING, "mesh does not have multiple color layers");
return;
} else {
int layer_orig_idx, layer_idx;
@@ -1683,7 +1685,7 @@ void EM_mesh_copy_face_layer(EditMesh *em, wmOperator *op, short type)
}
if (change) {
-// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+// DAG_id_tag_update(obedit->data, 0);
}
}
@@ -2076,8 +2078,11 @@ static void mouse_mesh_loop(bContext *C, short mval[2], short extend, short ring
// if (EM_texFaceCheck())
/* sets as active, useful for other tools */
- if(select && em->selectmode & SCE_SELECT_EDGE) {
- EM_store_selection(em, eed, EDITEDGE);
+ if(select) {
+ if(em->selectmode & SCE_SELECT_VERTEX)
+ EM_store_selection(em, eed->v1, EDITVERT);
+ if(em->selectmode & SCE_SELECT_EDGE)
+ EM_store_selection(em, eed, EDITEDGE);
}
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, vc.obedit->data);
@@ -2105,7 +2110,7 @@ void MESH_OT_loop_select(wmOperatorType *ot)
/* api callbacks */
ot->invoke= mesh_select_loop_invoke;
- ot->poll= ED_operator_editmesh_view3d;
+ ot->poll= ED_operator_editmesh_region_view3d;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -2193,13 +2198,13 @@ static void mouse_mesh_shortest_path(bContext *C, short mval[2])
break;
}
- DAG_id_flush_update(vc.obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(vc.obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, vc.obedit->data);
}
}
-static int mesh_shortest_path_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int mesh_shortest_path_select_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
view3d_operator_needs_opengl(C);
@@ -2211,7 +2216,7 @@ static int mesh_shortest_path_select_invoke(bContext *C, wmOperator *op, wmEvent
static int mesh_shortest_path_select_poll(bContext *C)
{
- if(ED_operator_editmesh_view3d(C)) {
+ if(ED_operator_editmesh_region_view3d(C)) {
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh(obedit->data);
return (em->selectmode & SCE_SELECT_EDGE);
@@ -2536,7 +2541,7 @@ void MESH_OT_select_linked_pick(wmOperatorType *ot)
/* api callbacks */
ot->invoke= select_linked_pick_invoke;
- ot->poll= ED_operator_editmesh_view3d;
+ ot->poll= ED_operator_editmesh_region_view3d;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -2610,7 +2615,7 @@ static int select_linked_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int select_linked_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int select_linked_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
linked_limit_default(C, op);
return select_linked_exec(C, op);
@@ -2737,7 +2742,7 @@ void EM_hide_mesh(EditMesh *em, int swap)
em->totedgesel= em->totfacesel= em->totvertsel= 0;
// if(EM_texFaceCheck())
- // DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ // DAG_id_tag_update(obedit->data, 0);
}
static int hide_mesh_exec(bContext *C, wmOperator *op)
@@ -2804,10 +2809,10 @@ void EM_reveal_mesh(EditMesh *em)
EM_selectmode_flush(em);
// if (EM_texFaceCheck())
-// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+// DAG_id_tag_update(obedit->data, 0);
}
-static int reveal_mesh_exec(bContext *C, wmOperator *op)
+static int reveal_mesh_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
@@ -2851,7 +2856,7 @@ int select_by_number_vertices_exec(bContext *C, wmOperator *op)
EM_set_flag_all(em, SELECT);
}
else if(em->selectmode!=SCE_SELECT_FACE) {
- BKE_report(op->reports, RPT_ERROR, "Only works in face selection mode");
+ BKE_report(op->reports, RPT_WARNING, "Only works in face selection mode");
return OPERATOR_CANCELLED;
}
@@ -2947,7 +2952,7 @@ static int select_sharp_edges_exec(bContext *C, wmOperator *op)
/* 'standard' behaviour - check if selected, then apply relevant selection */
if(em->selectmode==SCE_SELECT_FACE) {
- BKE_report(op->reports, RPT_ERROR, "Doesn't work in face selection mode");
+ BKE_report(op->reports, RPT_WARNING, "Doesn't work in face selection mode");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
@@ -3065,7 +3070,7 @@ static void select_linked_flat_faces(EditMesh *em, wmOperator *op, float sharpne
float fsharpness;
if(em->selectmode!=SCE_SELECT_FACE) {
- BKE_report(op->reports, RPT_ERROR, "Only works in face selection mode");
+ BKE_report(op->reports, RPT_WARNING, "Only works in face selection mode");
return;
}
@@ -3215,7 +3220,7 @@ void MESH_OT_faces_select_linked_flat(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
- RNA_def_float(ot->srna, "sharpness", 0.0f, 0.0f, FLT_MAX, "sharpness", "", 0.0f, 180.0f);
+ RNA_def_float(ot->srna, "sharpness", 135.0f, 0.0f, FLT_MAX, "sharpness", "", 0.0f, 180.0f);
}
void select_non_manifold(EditMesh *em, wmOperator *op )
@@ -3229,7 +3234,7 @@ void select_non_manifold(EditMesh *em, wmOperator *op )
*/
if(em->selectmode==SCE_SELECT_FACE) {
- BKE_report(op->reports, RPT_ERROR, "Doesn't work in face selection mode");
+ BKE_report(op->reports, RPT_WARNING, "Doesn't work in face selection mode");
return;
}
@@ -3352,7 +3357,7 @@ void EM_select_swap(EditMesh *em) /* exported for UV */
}
-static int select_inverse_mesh_exec(bContext *C, wmOperator *op)
+static int select_inverse_mesh_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
@@ -3485,7 +3490,7 @@ void EM_select_more(EditMesh *em)
}
}
-static int select_more(bContext *C, wmOperator *op)
+static int select_more(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)) ;
@@ -3576,7 +3581,7 @@ void EM_select_less(EditMesh *em)
}
}
-static int select_less(bContext *C, wmOperator *op)
+static int select_less(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
@@ -3741,7 +3746,7 @@ static int editmesh_mark_seam(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -3793,7 +3798,7 @@ static int editmesh_mark_sharp(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -4019,7 +4024,7 @@ void EM_recalc_normal_direction(EditMesh *em, int inside, int select) /* makes f
recalc_editnormals(em);
-// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+// DAG_id_tag_update(obedit->data, 0);
waitcursor(0);
}
@@ -4037,7 +4042,7 @@ static int normals_make_consistent_exec(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); //TODO is this needed ?
return OPERATOR_FINISHED;
@@ -4127,7 +4132,7 @@ void faceselect_align_view_to_selected(View3D *v3d, RegionView3D *rv3d, Mesh *me
}
if (totselected == 0)
- BKE_report(op->reports, RPT_ERROR, "No faces selected.");
+ BKE_report(op->reports, RPT_WARNING, "No faces selected.");
else
view3d_align_axis_to_vector(v3d, rv3d, axis, norm);
}
@@ -4159,7 +4164,7 @@ void editmesh_align_view_to_selected(Object *obedit, EditMesh *em, wmOperator *o
float norm[3]={0.0, 0.0, 0.0}; /* used for storing the mesh normal */
if (nselverts==0) {
- BKE_report(op->reports, RPT_ERROR, "No faces or vertices selected.");
+ BKE_report(op->reports, RPT_WARNING, "No faces or vertices selected.");
}
else if (EM_nfaces_selected(em)) {
EditFace *efa;
@@ -4377,7 +4382,7 @@ static int smooth_vertex(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -4417,49 +4422,74 @@ void MESH_OT_vertices_smooth(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "zaxis", 1, "Z-Axis", "Smooth along the Z axis.");
}
-void vertexnoise(Object *obedit, EditMesh *em)
+static int mesh_noise_exec(bContext *C, wmOperator *op)
{
+ Object *obedit= CTX_data_edit_object(C);
+ EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
Material *ma;
Tex *tex;
EditVert *eve;
- float b2, ofs, vec[3];
+ float fac= RNA_float_get(op->ptr, "factor");
+
+ if(em==NULL) return OPERATOR_FINISHED;
- if(em==NULL) return;
-
ma= give_current_material(obedit, obedit->actcol);
if(ma==0 || ma->mtex[0]==0 || ma->mtex[0]->tex==0) {
- return;
+ return OPERATOR_FINISHED;
}
- tex= ma->mtex[0]->tex;
-
- ofs= tex->turbul/200.0;
-
- eve= (struct EditVert *)em->verts.first;
- while(eve) {
- if(eve->f & SELECT) {
-
- if(tex->type==TEX_STUCCI) {
-
+ tex= give_current_material_texture(ma);
+
+
+ if(tex->type==TEX_STUCCI) {
+ float b2, vec[3];
+ float ofs= tex->turbul/200.0;
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ if(eve->f & SELECT) {
b2= BLI_hnoise(tex->noisesize, eve->co[0], eve->co[1], eve->co[2]);
if(tex->stype) ofs*=(b2*b2);
- vec[0]= 0.2*(b2-BLI_hnoise(tex->noisesize, eve->co[0]+ofs, eve->co[1], eve->co[2]));
- vec[1]= 0.2*(b2-BLI_hnoise(tex->noisesize, eve->co[0], eve->co[1]+ofs, eve->co[2]));
- vec[2]= 0.2*(b2-BLI_hnoise(tex->noisesize, eve->co[0], eve->co[1], eve->co[2]+ofs));
+ vec[0]= fac*(b2-BLI_hnoise(tex->noisesize, eve->co[0]+ofs, eve->co[1], eve->co[2]));
+ vec[1]= fac*(b2-BLI_hnoise(tex->noisesize, eve->co[0], eve->co[1]+ofs, eve->co[2]));
+ vec[2]= fac*(b2-BLI_hnoise(tex->noisesize, eve->co[0], eve->co[1], eve->co[2]+ofs));
add_v3_v3(eve->co, vec);
}
- else {
+ }
+ }
+ else {
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ if(eve->f & SELECT) {
float tin, dum;
externtex(ma->mtex[0], eve->co, &tin, &dum, &dum, &dum, &dum, 0);
- eve->co[2]+= 0.05*tin;
+ eve->co[2]+= fac*tin;
}
}
- eve= eve->next;
}
recalc_editnormals(em);
-// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ BKE_mesh_end_editmesh(obedit->data, em);
+
+ DAG_id_tag_update(obedit->data, 0);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_noise(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Noise";
+ ot->description= "Use vertex coordinate as texture coordinate";
+ ot->idname= "MESH_OT_noise";
+
+ /* api callbacks */
+ ot->exec= mesh_noise_exec;
+ ot->poll= ED_operator_editmesh;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_float(ot->srna, "factor", 0.1f, -FLT_MAX, FLT_MAX, "Factor", "", 0.0f, 1.0f);
}
void flipface(EditMesh *em, EditFace *efa)
@@ -4482,7 +4512,7 @@ void flipface(EditMesh *em, EditFace *efa)
}
-static int flip_normals(bContext *C, wmOperator *op)
+static int flip_normals(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
@@ -4501,7 +4531,7 @@ static int flip_normals(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -4541,7 +4571,7 @@ static int solidify_exec(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -4573,14 +4603,11 @@ static int mesh_select_nth_exec(bContext *C, wmOperator *op)
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
int nth = RNA_int_get(op->ptr, "nth");
- if(EM_deselect_nth(em, nth) == 0) {
- BKE_report(op->reports, RPT_ERROR, "Mesh has no active vert/edge/face.");
- return OPERATOR_CANCELLED;
- }
+ EM_deselect_nth(em, nth);
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index eadf0ca120f..9e6f8f7f078 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -52,11 +52,13 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_editVert.h"
#include "BLI_rand.h"
#include "BLI_ghash.h"
#include "BLI_linklist.h"
#include "BLI_heap.h"
+#include "BLI_scanfill.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
@@ -80,7 +82,7 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise
#include "mesh_intern.h"
/* XXX */
-static void waitcursor(int val) {}
+static void waitcursor(int UNUSED(val)) {}
#define add_numbut(a, b, c, d, e, f, g) {}
/* XXX */
@@ -482,11 +484,12 @@ static int removedoublesflag_exec(bContext *C, wmOperator *op)
if(count) {
recalc_editnormals(em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
}
- BKE_reportf(op->reports, RPT_INFO, "Removed %d vertices", count);
+ BKE_reportf(op->reports, RPT_INFO, "Removed %d vert%s.", count, (count==1)?"ex":"ices");
+
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -494,6 +497,8 @@ static int removedoublesflag_exec(bContext *C, wmOperator *op)
void MESH_OT_remove_doubles(wmOperatorType *ot)
{
+ PropertyRNA *prop;
+
/* identifiers */
ot->name= "Remove Doubles";
ot->description= "Remove duplicate vertices";
@@ -506,12 +511,13 @@ void MESH_OT_remove_doubles(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- RNA_def_float(ot->srna, "limit", 0.0001f, 0.000001f, 50.0f, "Merge Threshold", "Minimum distance between merged verts", 0.00001f, 2.0f);
+ prop= RNA_def_float(ot->srna, "limit", 0.0001f, 0.000001f, 50.0f, "Merge Threshold", "Minimum distance between merged verts", 0.00001f, 2.0f);
+ RNA_def_property_ui_range(prop, 0.000001f, 50.0f, 0.001, 5);
}
// XXX is this needed?
/* called from buttons */
-static void xsortvert_flag__doSetX(void *userData, EditVert *eve, int x, int y, int index)
+static void xsortvert_flag__doSetX(void *userData, EditVert *UNUSED(eve), int x, int UNUSED(y), int index)
{
xvertsort *sortblock = userData;
@@ -551,7 +557,7 @@ void xsortvert_flag(bContext *C, int flag)
}
}
- addlisttolist(&vc.em->verts, &tbase);
+ BLI_movelisttolist(&vc.em->verts, &tbase);
MEM_freeN(sortblock);
@@ -609,14 +615,14 @@ void hashvert_flag(EditMesh *em, int flag)
sb++;
}
- addlisttolist(&em->verts, &tbase);
+ BLI_movelisttolist(&em->verts, &tbase);
MEM_freeN(sortblock);
}
/* generic extern called extruder */
-void extrude_mesh(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op, short type)
+static void extrude_mesh(Object *obedit, EditMesh *em, wmOperator *op, short type)
{
float nor[3]= {0.0, 0.0, 0.0};
short transmode= 0;
@@ -631,7 +637,7 @@ void extrude_mesh(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op, sh
EM_stats_update(em);
if(transmode==0) {
- BKE_report(op->reports, RPT_ERROR, "Not a valid selection for extrude");
+ BKE_report(op->reports, RPT_WARNING, "Not a valid selection for extrude");
}
else {
EM_fgon_flags(em);
@@ -642,7 +648,7 @@ void extrude_mesh(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op, sh
* This shouldn't be necessary, derived queries should be
* automatically building this data if invalid. Or something.
*/
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
/* individual faces? */
// BIF_TransformSetUndo("Extrude");
@@ -664,17 +670,16 @@ void extrude_mesh(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op, sh
}
// XXX should be a menu item
-static int mesh_extrude_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int mesh_extrude_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
- Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
- extrude_mesh(scene, obedit, em, op, RNA_int_get(op->ptr, "type"));
+ extrude_mesh(obedit, em, op, RNA_int_get(op->ptr, "type"));
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -683,13 +688,12 @@ static int mesh_extrude_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* extrude without transform */
static int mesh_extrude_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh(obedit->data);
- extrude_mesh(scene, obedit, em, op, RNA_int_get(op->ptr, "type"));
+ extrude_mesh(obedit, em, op, RNA_int_get(op->ptr, "type"));
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -704,7 +708,7 @@ EnumPropertyItem extrude_items[] = {
{0, NULL, 0, NULL, NULL}};
-static EnumPropertyItem *extrude_itemf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *extrude_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
EnumPropertyItem *item= NULL;
Object *obedit= CTX_data_edit_object(C);
@@ -796,7 +800,7 @@ void MESH_OT_extrude(wmOperatorType *ot)
ot->prop= prop;
}
-static int split_mesh(bContext *C, wmOperator *op)
+static int split_mesh(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
@@ -811,7 +815,7 @@ static int split_mesh(bContext *C, wmOperator *op)
WM_cursor_wait(0);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -871,7 +875,7 @@ static int extrude_repeat_mesh(bContext *C, wmOperator *op)
EM_fgon_flags(em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -975,7 +979,7 @@ static int spin_mesh(bContext *C, wmOperator *op, float *dvec, int steps, float
EM_fgon_flags(em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
}
BKE_mesh_end_editmesh(obedit->data, em);
@@ -989,18 +993,18 @@ static int spin_mesh_exec(bContext *C, wmOperator *op)
ok= spin_mesh(C, op, NULL, RNA_int_get(op->ptr,"steps"), RNA_float_get(op->ptr,"degrees"), RNA_boolean_get(op->ptr,"dupli"));
if(ok==0) {
- BKE_report(op->reports, RPT_ERROR, "No valid vertices are selected");
+ BKE_report(op->reports, RPT_WARNING, "No valid vertices are selected");
return OPERATOR_CANCELLED;
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
/* get center and axis, in global coords */
-static int spin_mesh_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int spin_mesh_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Scene *scene = CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
@@ -1075,7 +1079,7 @@ static int screw_mesh_exec(bContext *C, wmOperator *op)
}
}
if(v1==NULL || v2==NULL) {
- BKE_report(op->reports, RPT_ERROR, "You have to select a string of connected vertices too");
+ BKE_report(op->reports, RPT_WARNING, "You have to select a string of connected vertices too");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
@@ -1094,21 +1098,21 @@ static int screw_mesh_exec(bContext *C, wmOperator *op)
}
if(spin_mesh(C, op, dvec, turns*steps, 360.0f*turns, 0)) {
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
}
else {
- BKE_report(op->reports, RPT_ERROR, "No valid vertices are selected");
+ BKE_report(op->reports, RPT_WARNING, "No valid vertices are selected");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
}
/* get center and axis, in global coords */
-static int screw_mesh_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int screw_mesh_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Scene *scene = CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
@@ -1189,19 +1193,19 @@ static void erase_vertices(EditMesh *em, ListBase *l)
}
}
-void delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event)
+static void delete_mesh(EditMesh *em, wmOperator *op, int event)
{
EditFace *efa, *nextvl;
EditVert *eve,*nextve;
EditEdge *eed,*nexted;
int count;
- char *str="Erase";
+ /* const char *str="Erase"; */
if(event<1) return;
if(event==10 ) {
- str= "Erase Vertices";
+ /* str= "Erase Vertices"; */
erase_edges(em, &em->edges);
erase_faces(em, &em->faces);
erase_vertices(em, &em->verts);
@@ -1210,10 +1214,10 @@ void delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event)
if(!EdgeLoopDelete(em, op))
return;
- str= "Erase Edge Loop";
+ /* str= "Erase Edge Loop"; */
}
else if(event==4) {
- str= "Erase Edges & Faces";
+ /* str= "Erase Edges & Faces"; */
efa= em->faces.first;
while(efa) {
nextvl= efa->next;
@@ -1255,7 +1259,7 @@ void delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event)
}
}
else if(event==1) {
- str= "Erase Edges";
+ /* str= "Erase Edges"; */
// faces first
efa= em->faces.first;
while(efa) {
@@ -1300,18 +1304,18 @@ void delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event)
}
else if(event==2) {
- str="Erase Faces";
+ /* str="Erase Faces"; */
delfaceflag(em, SELECT);
}
else if(event==3) {
- str= "Erase All";
+ /* str= "Erase All"; */
if(em->verts.first) free_vertlist(em, &em->verts);
if(em->edges.first) free_edgelist(em, &em->edges);
if(em->faces.first) free_facelist(em, &em->faces);
if(em->selected.first) BLI_freelistN(&(em->selected));
}
else if(event==5) {
- str= "Erase Only Faces";
+ /* str= "Erase Only Faces"; */
efa= em->faces.first;
while(efa) {
nextvl= efa->next;
@@ -1347,9 +1351,9 @@ static int delete_mesh_exec(bContext *C, wmOperator *op)
if(type==6)
return WM_operator_name_call(C, "MESH_OT_delete_edgeloop", WM_OP_EXEC_DEFAULT, NULL);
- delete_mesh(obedit, em, op, type);
+ delete_mesh(em, op, type);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -1517,6 +1521,7 @@ static void facecopy(EditMesh *em, EditFace *source, EditFace *target)
if (target->v4)
interp_weights_face_v3( w[3],v1, v2, v3, v4, target->v4->co);
+ CustomData_em_validate_data(&em->fdata, target->data, target->v4 ? 4 : 3);
CustomData_em_interp(&em->fdata, &source->data, NULL, (float*)w, 1, target->data);
}
@@ -1681,7 +1686,7 @@ static void fill_quad_double_op(EditMesh *em, EditFace *efa, struct GHash *gh, i
EditEdge *cedge[2]={NULL, NULL};
EditVert *v[4], **verts[2];
EditFace *hold;
- short start=0, end, left, right, vertsize,i;
+ short start=0, /*end,*/ left, /* right,*/ vertsize,i;
v[0] = efa->v1;
v[1] = efa->v2;
@@ -1702,9 +1707,9 @@ static void fill_quad_double_op(EditMesh *em, EditFace *efa, struct GHash *gh, i
// the array to the correct direction
if(verts[0][0] != v[start]) {flipvertarray(verts[0],numcuts+2);}
- end = (start+1)%4;
+ /* end = (start+1)%4; */ /* UNUSED */
left = (start+2)%4;
- right = (start+3)%4;
+ /* right = (start+3)%4; */ /* UNUSED */
if(verts[1][0] != v[left]) {flipvertarray(verts[1],numcuts+2);}
/*
We should have something like this now
@@ -2757,7 +2762,7 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float smooth, float
}
}
-// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+// DAG_id_tag_update(obedit->data, 0);
// Now for each face in the mesh we need to figure out How many edges were cut
// and which filling method to use for that face
for(ef = em->faces.first;ef;ef = ef->next) {
@@ -3555,7 +3560,7 @@ static const EnumPropertyItem direction_items[]= {
#define AXIS_X 1
#define AXIS_Y 2
-static const EnumPropertyItem axis_items[]= {
+static const EnumPropertyItem axis_items_xy[]= {
{AXIS_X, "X", 0, "X", ""},
{AXIS_Y, "Y", 0, "Y", ""},
{0, NULL, 0, NULL, NULL}};
@@ -3775,7 +3780,7 @@ static int edge_rotate_selected(bContext *C, wmOperator *op)
}
else
{
- BKE_report(op->reports, RPT_ERROR, "Select one edge or two adjacent faces");
+ BKE_report(op->reports, RPT_WARNING, "Select one edge or two adjacent faces");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
@@ -3790,7 +3795,7 @@ static int edge_rotate_selected(bContext *C, wmOperator *op)
}
}
else {
- BKE_report(op->reports, RPT_ERROR, "Select one edge or two adjacent faces");
+ BKE_report(op->reports, RPT_WARNING, "Select one edge or two adjacent faces");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
@@ -3800,7 +3805,7 @@ static int edge_rotate_selected(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -4202,7 +4207,7 @@ useless:
return 0;
}
- if(me->drawflag & ME_DRAW_EDGELEN) {
+ if(me->drawflag & ME_DRAWEXTRA_EDGELEN) {
if(!(tempsv->up->f & SELECT)) {
tempsv->up->f |= SELECT;
tempsv->up->f2 |= 16;
@@ -4651,11 +4656,11 @@ useless:
} else {
draw = 0;
}
-// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+// DAG_id_tag_update(obedit->data, 0);
}
- if(me->drawflag & ME_DRAW_EDGELEN) {
+ if(me->drawflag & ME_DRAWEXTRA_EDGELEN) {
look = vertlist;
while(look) {
tempsv = BLI_ghash_lookup(vertgh,(EditVert*)look->link);
@@ -4671,7 +4676,7 @@ useless:
if(!immediate)
EM_automerge(0);
-// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+// DAG_id_tag_update(obedit->data, 0);
// scrarea_queue_winredraw(curarea);
//BLI_ghash_free(edgesgh, freeGHash, NULL);
@@ -4703,7 +4708,7 @@ useless:
}
#endif // END OF XXX
-int EdgeLoopDelete(EditMesh *em, wmOperator *op)
+int EdgeLoopDelete(EditMesh *UNUSED(em), wmOperator *UNUSED(op))
{
#if 0 //XXX won't work with new edgeslide
@@ -4722,7 +4727,7 @@ int EdgeLoopDelete(EditMesh *em, wmOperator *op)
EM_select_more(em);
removedoublesflag(em, 1,0, 0.001);
EM_select_flush(em);
- // DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ // DAG_id_tag_update(obedit->data, 0);
return 1;
#endif
return 0;
@@ -4876,12 +4881,12 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
if(efa) {
- BKE_report(op->reports, RPT_ERROR, "Can't perform ripping with faces selected this way");
+ BKE_report(op->reports, RPT_WARNING, "Can't perform ripping with faces selected this way");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
if(sefa==NULL) {
- BKE_report(op->reports, RPT_ERROR, "No proper selection or faces included");
+ BKE_report(op->reports, RPT_WARNING, "No proper selection or faces included");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
@@ -4946,7 +4951,7 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
if(seed==NULL) { // never happens?
- BKE_report(op->reports, RPT_ERROR, "No proper edge found to start");
+ BKE_report(op->reports, RPT_WARNING, "No proper edge found to start");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
@@ -5031,7 +5036,7 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -5076,7 +5081,7 @@ static void shape_propagate(Object *obedit, EditMesh *em, wmOperator *op)
if(me->key){
ky = me->key;
} else {
- BKE_report(op->reports, RPT_ERROR, "Object Has No Key");
+ BKE_report(op->reports, RPT_WARNING, "Object Has No Key");
return;
}
@@ -5091,7 +5096,7 @@ static void shape_propagate(Object *obedit, EditMesh *em, wmOperator *op)
}
}
} else {
- BKE_report(op->reports, RPT_ERROR, "Object Has No Blendshapes");
+ BKE_report(op->reports, RPT_WARNING, "Object Has No Blendshapes");
return;
}
@@ -5104,7 +5109,7 @@ static void shape_propagate(Object *obedit, EditMesh *em, wmOperator *op)
}
#endif
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return;
}
@@ -5117,7 +5122,7 @@ static int shape_propagate_to_all_exec(bContext *C, wmOperator *op)
shape_propagate(obedit, em, op);
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return OPERATOR_FINISHED;
@@ -5179,13 +5184,13 @@ static int blend_from_shape_exec(bContext *C, wmOperator *op)
if(!blended)
return OPERATOR_CANCELLED;
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return OPERATOR_FINISHED;
}
-static EnumPropertyItem *shape_itemf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *shape_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
Object *obedit= CTX_data_edit_object(C);
Mesh *me= (obedit) ? obedit->data : NULL;
@@ -5680,7 +5685,7 @@ static int collapseEdges(EditMesh *em)
CollectedEdge *curredge;
Collection *edgecollection;
- int totedges, groupcount, mergecount,vcount;
+ int totedges, mergecount,vcount /*, groupcount*/;
float avgcount[3];
allcollections.first = 0;
@@ -5689,7 +5694,7 @@ static int collapseEdges(EditMesh *em)
mergecount = 0;
build_edgecollection(em, &allcollections);
- groupcount = BLI_countlist(&allcollections);
+ /*groupcount = BLI_countlist(&allcollections);*/ /*UNUSED*/
for(edgecollection = allcollections.first; edgecollection; edgecollection = edgecollection->next){
@@ -5842,6 +5847,7 @@ static int merge_exec(bContext *C, wmOperator *op)
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
int count= 0, uvs= RNA_boolean_get(op->ptr, "uvs");
+ EditSelection *ese;
switch(RNA_enum_get(op->ptr, "type")) {
case 3:
@@ -5851,10 +5857,21 @@ static int merge_exec(bContext *C, wmOperator *op)
count = merge_target(C, em, 1, uvs);
break;
case 1:
- count = merge_firstlast(em, 0, uvs);
+ ese= (EditSelection *)em->selected.last;
+ if(ese && ese->type == EDITVERT) {
+ count = merge_firstlast(em, 0, uvs);
+ } else {
+ BKE_report(op->reports, RPT_WARNING, "no last selected vertex set");
+ }
break;
case 6:
- count = merge_firstlast(em, 1, uvs);
+ ese= (EditSelection *)em->selected.first;
+ if(ese && ese->type == EDITVERT) {
+ count = merge_firstlast(em, 1, uvs);
+ }
+ else {
+ BKE_report(op->reports, RPT_WARNING, "no last selected vertex set");
+ }
break;
case 5:
count = collapseEdges(em);
@@ -5870,7 +5887,7 @@ static int merge_exec(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -5884,7 +5901,7 @@ static EnumPropertyItem merge_type_items[]= {
{5, "COLLAPSE", 0, "Collapse", ""},
{0, NULL, 0, NULL, NULL}};
-static EnumPropertyItem *merge_type_itemf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *merge_type_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
Object *obedit= CTX_data_edit_object(C);
EnumPropertyItem *item= NULL;
@@ -6109,7 +6126,7 @@ static int select_vertex_path_exec(bContext *C, wmOperator *op)
}
else {
BKE_mesh_end_editmesh(obedit->data, em);
- BKE_report(op->reports, RPT_ERROR, "Path Selection requires that exactly two vertices be selected");
+ BKE_report(op->reports, RPT_WARNING, "Path Selection requires that exactly two vertices be selected");
return OPERATOR_CANCELLED;
}
@@ -6144,7 +6161,7 @@ void MESH_OT_select_vertex_path(wmOperatorType *ot)
/********************** Region/Loop Operators *************************/
-static int region_to_loop(bContext *C, wmOperator *op)
+static int region_to_loop(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
@@ -6325,7 +6342,7 @@ static int loop_bisect(EditMesh *em, Collection *edgecollection){
else return(2);
}
-static int loop_to_region(bContext *C, wmOperator *op)
+static int loop_to_region(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
@@ -6394,7 +6411,7 @@ static int mesh_rotate_uvs(bContext *C, wmOperator *op)
int dir= RNA_enum_get(op->ptr, "direction");
if (!EM_texFaceCheck(em)) {
- BKE_report(op->reports, RPT_ERROR, "Mesh has no uv/image layers.");
+ BKE_report(op->reports, RPT_WARNING, "Mesh has no uv/image layers.");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
@@ -6450,7 +6467,7 @@ static int mesh_rotate_uvs(bContext *C, wmOperator *op)
if(!change)
return OPERATOR_CANCELLED;
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -6468,7 +6485,7 @@ static int mesh_mirror_uvs(bContext *C, wmOperator *op)
int axis= RNA_enum_get(op->ptr, "axis");
if (!EM_texFaceCheck(em)) {
- BKE_report(op->reports, RPT_ERROR, "Mesh has no uv/image layers.");
+ BKE_report(op->reports, RPT_WARNING, "Mesh has no uv/image layers.");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
@@ -6539,7 +6556,7 @@ static int mesh_mirror_uvs(bContext *C, wmOperator *op)
if(!change)
return OPERATOR_CANCELLED;
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -6556,7 +6573,7 @@ static int mesh_rotate_colors(bContext *C, wmOperator *op)
int dir= RNA_enum_get(op->ptr, "direction");
if (!EM_vertColorCheck(em)) {
- BKE_report(op->reports, RPT_ERROR, "Mesh has no color layers.");
+ BKE_report(op->reports, RPT_WARNING, "Mesh has no color layers.");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
@@ -6595,7 +6612,7 @@ static int mesh_rotate_colors(bContext *C, wmOperator *op)
if(!change)
return OPERATOR_CANCELLED;
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -6613,7 +6630,7 @@ static int mesh_mirror_colors(bContext *C, wmOperator *op)
int axis= RNA_enum_get(op->ptr, "axis");
if (!EM_vertColorCheck(em)) {
- BKE_report(op->reports, RPT_ERROR, "Mesh has no color layers");
+ BKE_report(op->reports, RPT_WARNING, "Mesh has no color layers");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
@@ -6651,7 +6668,7 @@ static int mesh_mirror_colors(bContext *C, wmOperator *op)
if(!change)
return OPERATOR_CANCELLED;
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -6690,7 +6707,7 @@ void MESH_OT_uvs_mirror(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
- RNA_def_enum(ot->srna, "axis", axis_items, DIRECTION_CW, "Axis", "Axis to mirror UVs around.");
+ RNA_def_enum(ot->srna, "axis", axis_items_xy, DIRECTION_CW, "Axis", "Axis to mirror UVs around.");
}
void MESH_OT_colors_rotate(wmOperatorType *ot)
@@ -6726,7 +6743,7 @@ void MESH_OT_colors_mirror(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
- RNA_def_enum(ot->srna, "axis", axis_items, DIRECTION_CW, "Axis", "Axis to mirror colors around.");
+ RNA_def_enum(ot->srna, "axis", axis_items_xy, DIRECTION_CW, "Axis", "Axis to mirror colors around.");
}
/********************** Subdivide Operator *************************/
@@ -6749,7 +6766,7 @@ static int subdivide_exec(bContext *C, wmOperator *op)
esubdivideflag(obedit, em, 1, smooth, fractal, ts->editbutflag|flag, cuts, corner_cut_pattern, 0);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -6771,7 +6788,7 @@ void MESH_OT_subdivide(wmOperatorType *ot)
/* properties */
RNA_def_int(ot->srna, "number_cuts", 1, 1, INT_MAX, "Number of Cuts", "", 1, 10);
- RNA_def_float(ot->srna, "smoothness", 0.0f, 0.0f, FLT_MAX, "Smoothness", "Smoothness factor.", 0.0f, 1000.0f);
+ RNA_def_float(ot->srna, "smoothness", 0.0f, 0.0f, FLT_MAX, "Smoothness", "Smoothness factor.", 0.0f, 1.0f);
RNA_def_float(ot->srna, "fractal", 0.0, 0.0f, FLT_MAX, "Fractal", "Fractal randomness factor.", 0.0f, 1000.0f);
RNA_def_enum(ot->srna, "corner_cut_pattern", corner_type_items, SUBDIV_CORNER_INNERVERT, "Corner Cut Pattern", "Topology pattern to use to fill a face after cutting across its corner");
}
@@ -7003,7 +7020,7 @@ static void fill_mesh(EditMesh *em)
}
}
- if(BLI_edgefill(0, em->mat_nr)) {
+ if(BLI_edgefill(em->mat_nr)) {
efa= fillfacebase.first;
while(efa) {
/* normals default pointing up */
@@ -7022,7 +7039,7 @@ static void fill_mesh(EditMesh *em)
}
-static int fill_mesh_exec(bContext *C, wmOperator *op)
+static int fill_mesh_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
@@ -7031,7 +7048,7 @@ static int fill_mesh_exec(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -7053,7 +7070,7 @@ void MESH_OT_fill(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int beautify_fill_exec(bContext *C, wmOperator *op)
+static int beautify_fill_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
@@ -7062,7 +7079,7 @@ static int beautify_fill_exec(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -7133,7 +7150,7 @@ static int sort_faces_exec(bContext *C, wmOperator *op)
if (!v3d) return OPERATOR_CANCELLED;
/* This operator work in Object Mode, not in edit mode.
- * After talk with Cambell we agree that there is no point to port this to EditMesh right now.
+ * After talk with Campbell we agree that there is no point to port this to EditMesh right now.
* so for now, we just exit_editmode and enter_editmode at the end of this function.
*/
ED_object_exit_editmode(C, EM_FREEDATA);
@@ -7226,7 +7243,7 @@ static int sort_faces_exec(bContext *C, wmOperator *op)
}
MEM_freeN(index);
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, 0);
/* Return to editmode. */
ED_object_enter_editmode(C, 0);
@@ -7263,14 +7280,14 @@ void MESH_OT_sort_faces(wmOperatorType *ot)
/********************** Quad/Tri Operators *************************/
-static int quads_convert_to_tris_exec(bContext *C, wmOperator *op)
+static int quads_convert_to_tris_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
convert_to_triface(em,0);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -7292,14 +7309,14 @@ void MESH_OT_quads_convert_to_tris(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int tris_convert_to_quads_exec(bContext *C, wmOperator *op)
+static int tris_convert_to_quads_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
join_triangles(em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -7321,14 +7338,14 @@ void MESH_OT_tris_convert_to_quads(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int edge_flip_exec(bContext *C, wmOperator *op)
+static int edge_flip_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
edge_flip(em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -7366,7 +7383,7 @@ static void mesh_set_smooth_faces(EditMesh *em, short smooth)
}
}
-static int mesh_faces_shade_smooth_exec(bContext *C, wmOperator *op)
+static int mesh_faces_shade_smooth_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
@@ -7375,7 +7392,7 @@ static int mesh_faces_shade_smooth_exec(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -7396,14 +7413,14 @@ void MESH_OT_faces_shade_smooth(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int mesh_faces_shade_flat_exec(bContext *C, wmOperator *op)
+static int mesh_faces_shade_flat_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
mesh_set_smooth_faces(em, 0);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -7482,7 +7499,7 @@ void MESH_OT_select_axis(wmOperatorType *ot)
{-1, "ALIGNED", 0, "Aligned Axis", ""},
{0, NULL, 0, NULL, NULL}};
- static EnumPropertyItem axis_items[] = {
+ static EnumPropertyItem axis_items_xyz[] = {
{0, "X_AXIS", 0, "X Axis", ""},
{1, "Y_AXIS", 0, "Y Axis", ""},
{2, "Z_AXIS", 0, "Z Axis", ""},
@@ -7502,6 +7519,6 @@ void MESH_OT_select_axis(wmOperatorType *ot)
/* properties */
RNA_def_enum(ot->srna, "mode", axis_mode_items, 0, "Axis Mode", "Axis side to use when selecting");
- RNA_def_enum(ot->srna, "axis", axis_items, 0, "Axis", "Select the axis to compare each vertex on");
+ RNA_def_enum(ot->srna, "axis", axis_items_xyz, 0, "Axis", "Select the axis to compare each vertex on");
}
diff --git a/source/blender/editors/mesh/loopcut.c b/source/blender/editors/mesh/loopcut.c
index 13538a6f218..933aed0a758 100644
--- a/source/blender/editors/mesh/loopcut.c
+++ b/source/blender/editors/mesh/loopcut.c
@@ -32,11 +32,11 @@
#include <stdio.h>
#include "DNA_ID.h"
+#include "DNA_object_types.h"
#include "DNA_screen_types.h"
#include "DNA_scene_types.h"
#include "DNA_userdef_types.h"
#include "DNA_windowmanager_types.h"
-#include "DNA_object_types.h"
#include "MEM_guardedalloc.h"
@@ -46,12 +46,16 @@
#include "BLI_dynstr.h" /*for WM_operator_pystring */
#include "BLI_editVert.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_blender.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
-#include "BKE_scene.h"
#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_report.h"
+#include "BKE_scene.h"
+#include "BKE_array_mallocn.h"
#include "BIF_gl.h"
#include "BIF_glutil.h" /* for paint cursor */
@@ -94,13 +98,15 @@ typedef struct tringselOpData {
} tringselOpData;
/* modal loop selection drawing callback */
-static void ringsel_draw(const bContext *C, ARegion *ar, void *arg)
+static void ringsel_draw(const bContext *C, ARegion *UNUSED(ar), void *arg)
{
- int i;
+ View3D *v3d = CTX_wm_view3d(C);
tringselOpData *lcd = arg;
+ int i;
if (lcd->totedge > 0) {
- glDisable(GL_DEPTH_TEST);
+ if(v3d && v3d->zbuf)
+ glDisable(GL_DEPTH_TEST);
glPushMatrix();
glMultMatrixf(lcd->ob->obmat);
@@ -114,7 +120,8 @@ static void ringsel_draw(const bContext *C, ARegion *ar, void *arg)
glEnd();
glPopMatrix();
- glEnable(GL_DEPTH_TEST);
+ if(v3d && v3d->zbuf)
+ glEnable(GL_DEPTH_TEST);
}
}
@@ -248,7 +255,7 @@ static void edgering_sel(tringselOpData *lcd, int previewlines, int select)
lcd->totedge = tot;
}
-static void ringsel_find_edge(tringselOpData *lcd, const bContext *C, ARegion *ar, int cuts)
+static void ringsel_find_edge(tringselOpData *lcd, int cuts)
{
if (lcd->eed) {
edgering_sel(lcd, cuts, 0);
@@ -265,9 +272,12 @@ static void ringsel_finish(bContext *C, wmOperator *op)
int cuts= (lcd->do_cut)? RNA_int_get(op->ptr,"number_cuts"): 0;
if (lcd->eed) {
+ EditMesh *em = BKE_mesh_get_editmesh(lcd->ob->data);
+
edgering_sel(lcd, cuts, 1);
+
if (lcd->do_cut) {
- EditMesh *em = BKE_mesh_get_editmesh(lcd->ob->data);
+
esubdivideflag(lcd->ob, em, SELECT, 0.0f, 0.0f, 0, cuts, 0, SUBDIV_SELECT_LOOPCUT);
/* force edge slide to edge select mode in in face select mode */
@@ -282,10 +292,17 @@ static void ringsel_finish(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_SCENE|ND_TOOLSETTINGS, CTX_data_scene(C));
}
- DAG_id_flush_update(lcd->ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(lcd->ob->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, lcd->ob->data);
}
else {
+
+ /* sets as active, useful for other tools */
+ if(em->selectmode & SCE_SELECT_VERTEX)
+ EM_store_selection(em, lcd->eed->v1, EDITVERT);
+ if(em->selectmode & SCE_SELECT_EDGE)
+ EM_store_selection(em, lcd->eed, EDITEDGE);
+
EM_selectmode_flush(lcd->em);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, lcd->ob->data);
}
@@ -293,7 +310,7 @@ static void ringsel_finish(bContext *C, wmOperator *op)
}
/* called when modal loop selection is done... */
-static void ringsel_exit (bContext *C, wmOperator *op)
+static void ringsel_exit(wmOperator *op)
{
tringselOpData *lcd= op->customdata;
@@ -332,10 +349,10 @@ static int ringsel_init (bContext *C, wmOperator *op, int do_cut)
return 1;
}
-static int ringcut_cancel (bContext *C, wmOperator *op)
+static int ringcut_cancel (bContext *UNUSED(C), wmOperator *op)
{
/* this is just a wrapper around exit() */
- ringsel_exit(C, op);
+ ringsel_exit(op);
return OPERATOR_CANCELLED;
}
@@ -353,7 +370,7 @@ static int ringsel_invoke (bContext *C, wmOperator *op, wmEvent *evt)
lcd = op->customdata;
if (lcd->em->selectmode == SCE_SELECT_FACE) {
- ringsel_exit(C, op);
+ ringsel_exit(op);
WM_operator_name_call(C, "MESH_OT_loop_select", WM_OP_INVOKE_REGION_WIN, NULL);
return OPERATOR_CANCELLED;
}
@@ -363,25 +380,29 @@ static int ringsel_invoke (bContext *C, wmOperator *op, wmEvent *evt)
edge = findnearestedge(&lcd->vc, &dist);
if(!edge) {
- ringsel_exit(C, op);
+ ringsel_exit(op);
return OPERATOR_CANCELLED;
}
lcd->eed = edge;
- ringsel_find_edge(lcd, C, lcd->ar, 1);
+ ringsel_find_edge(lcd, 1);
ringsel_finish(C, op);
- ringsel_exit(C, op);
+ ringsel_exit(op);
return OPERATOR_FINISHED;
}
static int ringcut_invoke (bContext *C, wmOperator *op, wmEvent *evt)
{
+ Object *obedit= CTX_data_edit_object(C);
tringselOpData *lcd;
EditEdge *edge;
int dist = 75;
+ if(modifiers_isDeformedByLattice(obedit) || modifiers_isDeformedByArmature(obedit))
+ BKE_report(op->reports, RPT_WARNING, "Loop cut doesn't work well on deformed edit mesh display");
+
view3d_operator_needs_opengl(C);
if (!ringsel_init(C, op, 1))
@@ -397,9 +418,10 @@ static int ringcut_invoke (bContext *C, wmOperator *op, wmEvent *evt)
edge = findnearestedge(&lcd->vc, &dist);
if (edge != lcd->eed) {
lcd->eed = edge;
- ringsel_find_edge(lcd, C, lcd->ar, 1);
+ ringsel_find_edge(lcd, 1);
}
-
+ ED_area_headerprint(CTX_wm_area(C), "Select a ring to be cut, use mouse-wheel or page-up/down for number of cuts");
+
return OPERATOR_RUNNING_MODAL;
}
@@ -418,7 +440,8 @@ static int ringcut_modal (bContext *C, wmOperator *op, wmEvent *event)
ED_region_tag_redraw(lcd->ar);
ringsel_finish(C, op);
- ringsel_exit(C, op);
+ ringsel_exit(op);
+ ED_area_headerprint(CTX_wm_area(C), NULL);
return OPERATOR_FINISHED;
}
@@ -430,6 +453,7 @@ static int ringcut_modal (bContext *C, wmOperator *op, wmEvent *event)
if (event->val == KM_RELEASE) {
/* cancel */
ED_region_tag_redraw(lcd->ar);
+ ED_area_headerprint(CTX_wm_area(C), NULL);
return ringcut_cancel(C, op);
}
@@ -441,7 +465,7 @@ static int ringcut_modal (bContext *C, wmOperator *op, wmEvent *event)
if (event->val == KM_PRESS) {
cuts++;
RNA_int_set(op->ptr, "number_cuts",cuts);
- ringsel_find_edge(lcd, C, lcd->ar, cuts);
+ ringsel_find_edge(lcd, cuts);
ED_region_tag_redraw(lcd->ar);
}
@@ -451,7 +475,7 @@ static int ringcut_modal (bContext *C, wmOperator *op, wmEvent *event)
if (event->val == KM_PRESS) {
cuts=MAX2(cuts-1,1);
RNA_int_set(op->ptr,"number_cuts",cuts);
- ringsel_find_edge(lcd, C, lcd->ar,cuts);
+ ringsel_find_edge(lcd, cuts);
ED_region_tag_redraw(lcd->ar);
}
@@ -466,7 +490,7 @@ static int ringcut_modal (bContext *C, wmOperator *op, wmEvent *event)
if (edge != lcd->eed) {
lcd->eed = edge;
- ringsel_find_edge(lcd, C, lcd->ar, cuts);
+ ringsel_find_edge(lcd, cuts);
}
ED_region_tag_redraw(lcd->ar);
@@ -487,7 +511,7 @@ void MESH_OT_edgering_select (wmOperatorType *ot)
/* callbacks */
ot->invoke= ringsel_invoke;
- ot->poll= ED_operator_editmesh_view3d;
+ ot->poll= ED_operator_editmesh_region_view3d;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -506,7 +530,7 @@ void MESH_OT_loopcut (wmOperatorType *ot)
ot->invoke= ringcut_invoke;
ot->modal= ringcut_modal;
ot->cancel= ringcut_cancel;
- ot->poll= ED_operator_editmesh_view3d;
+ ot->poll= ED_operator_editmesh_region_view3d;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c
index d1c6ff4c4ae..cfd1b006ece 100644
--- a/source/blender/editors/mesh/mesh_data.c
+++ b/source/blender/editors/mesh/mesh_data.c
@@ -38,6 +38,11 @@
#include "DNA_scene_types.h"
#include "DNA_view3d_types.h"
+#include "BLI_math.h"
+#include "BLI_editVert.h"
+#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_displist.h"
@@ -47,10 +52,6 @@
#include "BKE_mesh.h"
#include "BKE_report.h"
-#include "BLI_math.h"
-#include "BLI_editVert.h"
-#include "BLI_edgehash.h"
-
#include "RNA_access.h"
#include "RNA_define.h"
@@ -157,7 +158,7 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la
}
}
-int ED_mesh_uv_texture_add(bContext *C, Scene *scene, Object *ob, Mesh *me, const char *name, int active_set)
+int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_set)
{
EditMesh *em;
int layernum;
@@ -189,7 +190,7 @@ int ED_mesh_uv_texture_add(bContext *C, Scene *scene, Object *ob, Mesh *me, cons
mesh_update_customdata_pointers(me);
}
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return 1;
@@ -208,7 +209,7 @@ int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me)
return 0;
delete_customdata_layer(C, ob, cdl);
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return 1;
@@ -252,7 +253,7 @@ int ED_mesh_color_add(bContext *C, Scene *scene, Object *ob, Mesh *me, const cha
shadeMeshMCol(scene, ob, me);
}
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return 1;
@@ -271,7 +272,7 @@ int ED_mesh_color_remove(bContext *C, Object *ob, Mesh *me)
return 0;
delete_customdata_layer(C, ob, cdl);
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return 1;
@@ -286,13 +287,12 @@ static int layers_poll(bContext *C)
return (ob && !ob->id.lib && ob->type==OB_MESH && data && !data->lib);
}
-static int uv_texture_add_exec(bContext *C, wmOperator *op)
+static int uv_texture_add_exec(bContext *C, wmOperator *UNUSED(op))
{
- Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Mesh *me= ob->data;
- if(!ED_mesh_uv_texture_add(C, scene, ob, me, NULL, TRUE))
+ if(!ED_mesh_uv_texture_add(C, me, NULL, TRUE))
return OPERATOR_CANCELLED;
return OPERATOR_FINISHED;
@@ -316,6 +316,7 @@ void MESH_OT_uv_texture_add(wmOperatorType *ot)
static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
Scene *scene= CTX_data_scene(C);
+ View3D *v3d= CTX_wm_view3d(C);
Base *base= ED_view3d_give_base_under_cursor(C, event->mval);
Image *ima= NULL;
Mesh *me;
@@ -334,8 +335,7 @@ static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event)
char path[FILE_MAX];
RNA_string_get(op->ptr, "filepath", path);
- ima= BKE_add_image_file(path,
- scene ? scene->r.cfra : 1);
+ ima= BKE_add_image_file(path);
}
else {
RNA_string_get(op->ptr, "name", name);
@@ -368,6 +368,10 @@ static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event)
me->edit_mesh= NULL;
}
+ /* dummie drop support; ensure view shows a result :) */
+ if(v3d)
+ v3d->flag2 |= V3D_SOLID_TEX;
+
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -392,7 +396,7 @@ void MESH_OT_drop_named_image(wmOperatorType *ot)
RNA_def_string(ot->srna, "filepath", "Path", FILE_MAX, "Filepath", "Path to image file");
}
-static int uv_texture_remove_exec(bContext *C, wmOperator *op)
+static int uv_texture_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Mesh *me= ob->data;
@@ -420,7 +424,7 @@ void MESH_OT_uv_texture_remove(wmOperatorType *ot)
/*********************** vertex color operators ************************/
-static int vertex_color_add_exec(bContext *C, wmOperator *op)
+static int vertex_color_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
@@ -447,7 +451,7 @@ void MESH_OT_vertex_color_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int vertex_color_remove_exec(bContext *C, wmOperator *op)
+static int vertex_color_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Mesh *me= ob->data;
@@ -475,7 +479,7 @@ void MESH_OT_vertex_color_remove(wmOperatorType *ot)
/*********************** sticky operators ************************/
-static int sticky_add_exec(bContext *C, wmOperator *op)
+static int sticky_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
View3D *v3d= CTX_wm_view3d(C);
@@ -487,7 +491,7 @@ static int sticky_add_exec(bContext *C, wmOperator *op)
RE_make_sticky(scene, v3d);
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return OPERATOR_FINISHED;
@@ -508,7 +512,7 @@ void MESH_OT_sticky_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int sticky_remove_exec(bContext *C, wmOperator *op)
+static int sticky_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Mesh *me= ob->data;
@@ -519,7 +523,7 @@ static int sticky_remove_exec(bContext *C, wmOperator *op)
CustomData_free_layer_active(&me->vdata, CD_MSTICKY, me->totvert);
me->msticky= NULL;
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return OPERATOR_FINISHED;
@@ -542,81 +546,14 @@ void MESH_OT_sticky_remove(wmOperatorType *ot)
/************************** Add Geometry Layers *************************/
-static void mesh_calc_edges(Mesh *mesh, int update)
-{
- CustomData edata;
- EdgeHashIterator *ehi;
- MFace *mf = mesh->mface;
- MEdge *med, *med_orig;
- EdgeHash *eh = BLI_edgehash_new();
- int i, totedge, totface = mesh->totface;
-
- if(mesh->totedge==0)
- update= 0;
-
- if(update) {
- /* assume existing edges are valid
- * useful when adding more faces and generating edges from them */
- med= mesh->medge;
- for(i= 0; i<mesh->totedge; i++, med++)
- BLI_edgehash_insert(eh, med->v1, med->v2, med);
- }
-
- for (i = 0; i < totface; i++, mf++) {
- if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2))
- BLI_edgehash_insert(eh, mf->v1, mf->v2, NULL);
- if (!BLI_edgehash_haskey(eh, mf->v2, mf->v3))
- BLI_edgehash_insert(eh, mf->v2, mf->v3, NULL);
-
- if (mf->v4) {
- if (!BLI_edgehash_haskey(eh, mf->v3, mf->v4))
- BLI_edgehash_insert(eh, mf->v3, mf->v4, NULL);
- if (!BLI_edgehash_haskey(eh, mf->v4, mf->v1))
- BLI_edgehash_insert(eh, mf->v4, mf->v1, NULL);
- } else {
- if (!BLI_edgehash_haskey(eh, mf->v3, mf->v1))
- BLI_edgehash_insert(eh, mf->v3, mf->v1, NULL);
- }
- }
-
- totedge = BLI_edgehash_size(eh);
-
- /* write new edges into a temporary CustomData */
- memset(&edata, 0, sizeof(edata));
- CustomData_add_layer(&edata, CD_MEDGE, CD_CALLOC, NULL, totedge);
-
- ehi = BLI_edgehashIterator_new(eh);
- med = CustomData_get_layer(&edata, CD_MEDGE);
- for(i = 0; !BLI_edgehashIterator_isDone(ehi);
- BLI_edgehashIterator_step(ehi), ++i, ++med) {
-
- if(update && (med_orig=BLI_edgehashIterator_getValue(ehi))) {
- *med= *med_orig; /* copy from the original */
- } else {
- BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2);
- med->flag = ME_EDGEDRAW|ME_EDGERENDER;
- }
- }
- BLI_edgehashIterator_free(ehi);
-
- /* free old CustomData and assign new one */
- CustomData_free(&mesh->edata, mesh->totedge);
- mesh->edata = edata;
- mesh->totedge = totedge;
-
- mesh->medge = CustomData_get_layer(&mesh->edata, CD_MEDGE);
-
- BLI_edgehash_free(eh, NULL);
-}
-
void ED_mesh_update(Mesh *mesh, bContext *C, int calc_edges)
{
if(calc_edges || (mesh->totface && mesh->totedge == 0))
- mesh_calc_edges(mesh, calc_edges);
+ BKE_mesh_calc_edges(mesh, calc_edges);
mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mface, mesh->totface, NULL);
- DAG_id_flush_update(&mesh->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&mesh->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, mesh);
}
diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h
index fcd1eb40a02..1a9fdcea992 100644
--- a/source/blender/editors/mesh/mesh_intern.h
+++ b/source/blender/editors/mesh/mesh_intern.h
@@ -36,9 +36,6 @@ struct bContext;
struct wmOperatorType;
struct wmOperator;
-
-#define UVCOPY(t, s) memcpy(t, s, 2 * sizeof(float));
-
/* ******************** editface.c */
int edgetag_context_check(Scene *scene, EditEdge *eed);
@@ -49,8 +46,7 @@ int edgetag_shortest_path(Scene *scene, EditMesh *em, EditEdge *source, EditEdge
extern void free_editvert(EditMesh *em, EditVert *eve);
extern void free_editedge(EditMesh *em, EditEdge *eed);
-extern void free_editface(EditMesh *em, EditFace *efa);
-void free_editMesh(EditMesh *em);
+extern void free_editface(EditMesh *em, EditFace *efa);;
extern void free_vertlist(EditMesh *em, ListBase *edve);
extern void free_edgelist(EditMesh *em, ListBase *lb);
@@ -137,9 +133,6 @@ extern int EM_view3d_poll(struct bContext *C);
/* ******************* editmesh_loop.c */
-#define LOOP_SELECT 1
-#define LOOP_CUT 2
-
void MESH_OT_knife_cut(struct wmOperatorType *ot);
/* ******************* editmesh_mods.c */
@@ -165,13 +158,13 @@ void MESH_OT_loop_multi_select(struct wmOperatorType *ot);
void MESH_OT_mark_seam(struct wmOperatorType *ot);
void MESH_OT_mark_sharp(struct wmOperatorType *ot);
void MESH_OT_vertices_smooth(struct wmOperatorType *ot);
+void MESH_OT_noise(struct wmOperatorType *ot);
void MESH_OT_flip_normals(struct wmOperatorType *ot);
void MESH_OT_solidify(struct wmOperatorType *ot);
void MESH_OT_select_nth(struct wmOperatorType *ot);
extern EditEdge *findnearestedge(ViewContext *vc, int *dist);
-extern void EM_automerge(Scene *scene, Object *obedit, int update);
void editmesh_select_by_material(EditMesh *em, int index);
void EM_recalc_normal_direction(EditMesh *em, int inside, int select); /* makes faces righthand turning */
void EM_select_more(EditMesh *em);
diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c
index 9e071aa4a21..e0a91048a2c 100644
--- a/source/blender/editors/mesh/mesh_ops.c
+++ b/source/blender/editors/mesh/mesh_ops.c
@@ -123,6 +123,7 @@ void ED_operatortypes_mesh(void)
WM_operatortype_append(MESH_OT_mark_seam);
WM_operatortype_append(MESH_OT_mark_sharp);
WM_operatortype_append(MESH_OT_vertices_smooth);
+ WM_operatortype_append(MESH_OT_noise);
WM_operatortype_append(MESH_OT_flip_normals);
WM_operatortype_append(MESH_OT_knife_cut);
WM_operatortype_append(MESH_OT_rip);
@@ -230,7 +231,7 @@ void ED_keymap_mesh(wmKeyConfig *keyconf)
kmi= WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT, 0);
RNA_boolean_set(kmi->ptr, "extend", 1);
- kmi= WM_keymap_add_item(keymap, "MESH_OT_edgering_select", SELECTMOUSE, KM_PRESS, KM_ALT|KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "MESH_OT_edgering_select", SELECTMOUSE, KM_PRESS, KM_ALT|KM_CTRL, 0);
kmi= WM_keymap_add_item(keymap, "MESH_OT_edgering_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT|KM_CTRL, 0);
RNA_boolean_set(kmi->ptr, "extend", 1);
@@ -246,12 +247,12 @@ void ED_keymap_mesh(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "MESH_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "deselect", 1);
- RNA_float_set(WM_keymap_add_item(keymap, "MESH_OT_faces_select_linked_flat", FKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0)->ptr,"sharpness",135.0);
+ WM_keymap_add_item(keymap, "MESH_OT_faces_select_linked_flat", FKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0);
WM_keymap_add_item(keymap, "MESH_OT_select_similar", GKEY, KM_PRESS, KM_SHIFT, 0);
/* selection mode */
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_selection_mode", TABKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_select_mode", TABKEY, KM_PRESS, KM_CTRL, 0);
/* hide */
WM_keymap_add_item(keymap, "MESH_OT_hide", HKEY, KM_PRESS, 0, 0);
@@ -262,10 +263,11 @@ void ED_keymap_mesh(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_CTRL, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0)->ptr, "inside", 1);
- WM_keymap_add_item(keymap, "view3d.edit_mesh_extrude_move_normal", EKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_edit_mesh_extrude_individual_move", EKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "VIEW3D_OT_edit_mesh_extrude_move_normal", EKEY, KM_PRESS, 0, 0); /* python operator */
WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_extrude", EKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "TRANSFORM_OT_edge_crease", EKEY, KM_PRESS, KM_SHIFT, 0);
+
WM_keymap_add_item(keymap, "MESH_OT_spin", RKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "MESH_OT_fill", FKEY, KM_PRESS, KM_ALT, 0);
@@ -292,7 +294,8 @@ void ED_keymap_mesh(wmKeyConfig *keyconf)
/* use KM_CLICK because same key is used for tweaks */
WM_keymap_add_item(keymap, "MESH_OT_dupli_extrude_cursor", ACTIONMOUSE, KM_CLICK, KM_CTRL, 0);
-
+ RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_dupli_extrude_cursor", ACTIONMOUSE, KM_CLICK, KM_SHIFT|KM_CTRL, 0)->ptr, "rotate_source", 0);
+
WM_keymap_add_item(keymap, "MESH_OT_delete", XKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "MESH_OT_delete", DELKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index 7cef819a795..c4fe5f8fbc1 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -33,7 +33,6 @@
#include <stddef.h>
#include <stdlib.h>
-#include <string.h>
#include <math.h>
#include <float.h>
@@ -47,6 +46,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_editVert.h"
#include "BLI_ghash.h"
#include "BLI_rand.h" /* for randome face sorting */
@@ -63,6 +63,7 @@
#include "BKE_mesh.h"
#include "BKE_material.h"
#include "BKE_report.h"
+#include "BKE_multires.h"
#include "BLO_sys_types.h" // for intptr_t support
@@ -91,9 +92,9 @@ int join_mesh_exec(bContext *C, wmOperator *op)
Object *ob= CTX_data_active_object(C);
Material **matar, *ma;
Mesh *me;
- MVert *mvert, *mv, *mvertmain;
- MEdge *medge = NULL, *medgemain;
- MFace *mface = NULL, *mfacemain;
+ MVert *mvert, *mv;
+ MEdge *medge = NULL;
+ MFace *mface = NULL;
Key *key, *nkey=NULL;
KeyBlock *kb, *okb, *kbn;
float imat[4][4], cmat[4][4], *fp1, *fp2, curpos;
@@ -104,12 +105,16 @@ int join_mesh_exec(bContext *C, wmOperator *op)
MDeformVert *dvert;
CustomData vdata, edata, fdata;
- if(scene->obedit)
+ if(scene->obedit) {
+ BKE_report(op->reports, RPT_WARNING, "Cant join while in editmode");
return OPERATOR_CANCELLED;
+ }
/* ob is the object we are adding geometry to */
- if(!ob || ob->type!=OB_MESH)
+ if(!ob || ob->type!=OB_MESH) {
+ BKE_report(op->reports, RPT_WARNING, "Active object is not a mesh");
return OPERATOR_CANCELLED;
+ }
/* count & check */
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
@@ -132,15 +137,25 @@ int join_mesh_exec(bContext *C, wmOperator *op)
CTX_DATA_END;
/* that way the active object is always selected */
- if(ok==0)
+ if(ok==0) {
+ BKE_report(op->reports, RPT_WARNING, "Active object is not a selected mesh");
return OPERATOR_CANCELLED;
+ }
/* only join meshes if there are verts to join, there aren't too many, and we only had one mesh selected */
me= (Mesh *)ob->data;
key= me->key;
- if(totvert==0 || totvert>MESH_MAX_VERTS || totvert==me->totvert)
+
+ if(totvert==0 || totvert==me->totvert) {
+ BKE_report(op->reports, RPT_WARNING, "No mesh data to join");
return OPERATOR_CANCELLED;
+ }
+ if(totvert > MESH_MAX_VERTS) {
+ BKE_reportf(op->reports, RPT_WARNING, "Joining results in %d vertices, limit is " STRINGIFY(MESH_MAX_VERTS), totvert);
+ return OPERATOR_CANCELLED;
+ }
+
/* new material indices and material array */
matar= MEM_callocN(sizeof(void*)*totmat, "join_mesh matar");
if (totmat) matmap= MEM_callocN(sizeof(int)*totmat, "join_mesh matmap");
@@ -265,11 +280,7 @@ int join_mesh_exec(bContext *C, wmOperator *op)
mvert= CustomData_add_layer(&vdata, CD_MVERT, CD_CALLOC, NULL, totvert);
medge= CustomData_add_layer(&edata, CD_MEDGE, CD_CALLOC, NULL, totedge);
mface= CustomData_add_layer(&fdata, CD_MFACE, CD_CALLOC, NULL, totface);
-
- mvertmain= mvert;
- medgemain= medge;
- mfacemain= mface;
-
+
vertofs= 0;
edgeofs= 0;
faceofs= 0;
@@ -396,6 +407,9 @@ int join_mesh_exec(bContext *C, wmOperator *op)
}
}
+ if(base->object!=ob)
+ multiresModifier_prepare_join(scene, base->object, ob);
+
CustomData_merge(&me->fdata, &fdata, CD_MASK_MESH, CD_DEFAULT, totface);
CustomData_copy_data(&me->fdata, &fdata, 0, faceofs, me->totface);
@@ -504,10 +518,19 @@ int join_mesh_exec(bContext *C, wmOperator *op)
}
DAG_scene_sort(bmain, scene); // removed objects, need to rebuild dag before editmode call
-
+
+#if 0
ED_object_enter_editmode(C, EM_WAITCURSOR);
ED_object_exit_editmode(C, EM_FREEDATA|EM_WAITCURSOR|EM_DO_UNDO);
-
+#else
+ /* toggle editmode using lower level functions so this can be called from python */
+ make_editMesh(scene, ob);
+ load_editMesh(scene, ob);
+ free_editMesh(me->edit_mesh);
+ MEM_freeN(me->edit_mesh);
+ me->edit_mesh= NULL;
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA);
+#endif
WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene);
return OPERATOR_FINISHED;
@@ -545,9 +568,9 @@ int join_mesh_shapes_exec(bContext *C, wmOperator *op)
if (!ok) {
if (nonequal_verts)
- BKE_report(op->reports, RPT_ERROR, "Selected meshes must have equal numbers of vertices.");
+ BKE_report(op->reports, RPT_WARNING, "Selected meshes must have equal numbers of vertices.");
else
- BKE_report(op->reports, RPT_ERROR, "No additional selected meshes with equal vertex count to join.");
+ BKE_report(op->reports, RPT_WARNING, "No additional selected meshes with equal vertex count to join.");
return OPERATOR_CANCELLED;
}
@@ -867,6 +890,7 @@ long mesh_mirrtopo_table(Object *ob, char mode)
Mesh *me= ob->data;
MEdge *medge;
EditMesh *em= me->edit_mesh;
+ void **eve_tmp_back= NULL; /* some of the callers are using eve->tmp so restore after */
/* editmode*/
@@ -889,10 +913,13 @@ long mesh_mirrtopo_table(Object *ob, char mode)
if(em) {
EditVert *eve;
totvert= 0;
+ eve_tmp_back= MEM_callocN( em->totvert * sizeof(void *), "TopoMirr" );
for(eve= em->verts.first; eve; eve= eve->next) {
- eve->hash = totvert++;
+ eve_tmp_back[totvert]= eve->tmp.p;
+ eve->tmp.l = totvert++;
}
- } else {
+ }
+ else {
totvert = me->totvert;
}
@@ -901,8 +928,8 @@ long mesh_mirrtopo_table(Object *ob, char mode)
/* Initialize the vert-edge-user counts used to detect unique topology */
if(em) {
for(eed=em->edges.first; eed; eed= eed->next) {
- MirrTopoHash[eed->v1->hash]++;
- MirrTopoHash[eed->v2->hash]++;
+ MirrTopoHash[eed->v1->tmp.l]++;
+ MirrTopoHash[eed->v2->tmp.l]++;
}
} else {
for(a=0, medge=me->medge; a<me->totedge; a++, medge++) {
@@ -919,8 +946,8 @@ long mesh_mirrtopo_table(Object *ob, char mode)
if(em) {
for(eed=em->edges.first; eed; eed= eed->next) {
- MirrTopoHash[eed->v1->hash] += MirrTopoHash_Prev[eed->v2->hash];
- MirrTopoHash[eed->v2->hash] += MirrTopoHash_Prev[eed->v1->hash];
+ MirrTopoHash[eed->v1->tmp.l] += MirrTopoHash_Prev[eed->v2->tmp.l];
+ MirrTopoHash[eed->v2->tmp.l] += MirrTopoHash_Prev[eed->v1->tmp.l];
}
} else {
for(a=0, medge=me->medge; a<me->totedge; a++, medge++) {
@@ -952,6 +979,19 @@ long mesh_mirrtopo_table(Object *ob, char mode)
memcpy(MirrTopoHash_Prev, MirrTopoHash, sizeof(MIRRHASH_TYPE) * totvert);
}
+ /* restore eve->tmp.* */
+ if(eve_tmp_back) {
+ EditVert *eve;
+ totvert= 0;
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ eve->tmp.p= eve_tmp_back[totvert++];
+ }
+
+ MEM_freeN(eve_tmp_back);
+ eve_tmp_back= NULL;
+ }
+
+
/* Hash/Index pairs are needed for sorting to find index pairs */
MirrTopoPairs= MEM_callocN( sizeof(MirrTopoPair) * totvert, "MirrTopoPairs");
@@ -1074,26 +1114,27 @@ static EditVert *editmesh_get_x_mirror_vert_topo(Object *ob, struct EditMesh *em
if (mesh_mirrtopo_table(ob, 'u')==-1)
return NULL;
- if (index!=-1) {
+ if (index == -1) {
index = BLI_findindex(&em->verts, eve);
- }
- if (index==-1)
- return NULL;
+ if (index == -1) {
+ return NULL;
+ }
+ }
poinval= mesh_topo_lookup[ index ];
if(poinval != -1)
return (EditVert *)(poinval);
return NULL;
-}
+}
EditVert *editmesh_get_x_mirror_vert(Object *ob, struct EditMesh *em, EditVert *eve, float *co, int index)
{
if (((Mesh *)ob->data)->editflag & ME_EDIT_MIRROR_TOPO) {
return editmesh_get_x_mirror_vert_topo(ob, em, eve, index);
} else {
- return editmesh_get_x_mirror_vert_spacial(ob, em, eve->co);
+ return editmesh_get_x_mirror_vert_spacial(ob, em, co);
}
}
@@ -1148,9 +1189,9 @@ float *editmesh_get_mirror_uv(int axis, float *uv, float *mirrCent, float *face_
}
#endif
-static unsigned int mirror_facehash(void *ptr)
+static unsigned int mirror_facehash(const void *ptr)
{
- MFace *mf= ptr;
+ const MFace *mf= ptr;
int v0, v1;
if(mf->v4) {
@@ -1189,7 +1230,7 @@ static int mirror_facerotation(MFace *a, MFace *b)
return -1;
}
-static int mirror_facecmp(void *a, void *b)
+static int mirror_facecmp(const void *a, const void *b)
{
return (mirror_facerotation((MFace*)a, (MFace*)b) == -1);
}
diff --git a/source/blender/editors/metaball/CMakeLists.txt b/source/blender/editors/metaball/CMakeLists.txt
index 5e821a5c1e8..249d9daedef 100644
--- a/source/blender/editors/metaball/CMakeLists.txt
+++ b/source/blender/editors/metaball/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -32,4 +30,11 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_metaball "${SRC}" "${INC}")
+set(SRC
+ mball_edit.c
+ mball_ops.c
+
+ mball_intern.h
+)
+
+blender_add_lib(bf_editor_metaball "${SRC}" "${INC}")
diff --git a/source/blender/editors/metaball/Makefile b/source/blender/editors/metaball/Makefile
deleted file mode 100644
index c28ef59e9db..00000000000
--- a/source/blender/editors/metaball/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_metaball
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c
index 80cea4eea1c..b73f73820c7 100644
--- a/source/blender/editors/metaball/mball_edit.c
+++ b/source/blender/editors/metaball/mball_edit.c
@@ -35,6 +35,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "DNA_meta_types.h"
#include "DNA_object_types.h"
@@ -84,19 +85,17 @@ void make_editMball(Object *obedit)
/* This function is called, when MetaBall Object switched from
* edit mode to object mode. List od MetaElements is copied
* from object->data->edit_elems to object->data->elems. */
-void load_editMball(Object *obedit)
+void load_editMball(Object *UNUSED(obedit))
{
}
/* Add metaelem primitive to metaball object (which is in edit mode) */
-MetaElem *add_metaball_primitive(bContext *C, float mat[4][4], int type, int newname)
+MetaElem *add_metaball_primitive(bContext *C, float mat[4][4], int type, int UNUSED(newname))
{
Object *obedit= CTX_data_edit_object(C);
MetaBall *mball = (MetaBall*)obedit->data;
MetaElem *ml;
- if(!obedit) return NULL;
-
/* Deselect all existing metaelems */
ml= mball->editelems->first;
while(ml) {
@@ -177,7 +176,7 @@ void MBALL_OT_select_all(wmOperatorType *ot)
/***************************** Select inverse operator *****************************/
/* Invert metaball selection */
-static int select_inverse_metaelems_exec(bContext *C, wmOperator *op)
+static int select_inverse_metaelems_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
MetaBall *mb = (MetaBall*)obedit->data;
@@ -266,7 +265,7 @@ void MBALL_OT_select_random_metaelems(struct wmOperatorType *ot)
/***************************** Duplicate operator *****************************/
/* Duplicate selected MetaElements */
-static int duplicate_metaelems_exec(bContext *C, wmOperator *op)
+static int duplicate_metaelems_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
MetaBall *mb = (MetaBall*)obedit->data;
@@ -284,13 +283,13 @@ static int duplicate_metaelems_exec(bContext *C, wmOperator *op)
ml= ml->prev;
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, mb);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
}
return OPERATOR_FINISHED;
}
-static int duplicate_metaelems_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int duplicate_metaelems_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
int retv= duplicate_metaelems_exec(C, op);
@@ -325,7 +324,7 @@ void MBALL_OT_duplicate_metaelems(wmOperatorType *ot)
/***************************** Delete operator *****************************/
/* Delete all selected MetaElems (not MetaBall) */
-static int delete_metaelems_exec(bContext *C, wmOperator *op)
+static int delete_metaelems_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
MetaBall *mb= (MetaBall*)obedit->data;
@@ -343,7 +342,7 @@ static int delete_metaelems_exec(bContext *C, wmOperator *op)
ml= next;
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, mb);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
}
return OPERATOR_FINISHED;
@@ -393,7 +392,7 @@ static int hide_metaelems_exec(bContext *C, wmOperator *op)
}
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, mb);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
}
return OPERATOR_FINISHED;
@@ -420,7 +419,7 @@ void MBALL_OT_hide_metaelems(wmOperatorType *ot)
/***************************** Unhide operator *****************************/
/* Unhide all edited MetaElems */
-static int reveal_metaelems_exec(bContext *C, wmOperator *op)
+static int reveal_metaelems_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
MetaBall *mb= (MetaBall*)obedit->data;
@@ -434,7 +433,7 @@ static int reveal_metaelems_exec(bContext *C, wmOperator *op)
ml= ml->next;
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, mb);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
}
return OPERATOR_FINISHED;
@@ -623,7 +622,7 @@ static void *get_data(bContext *C)
}
/* this is undo system for MetaBalls */
-void undo_push_mball(bContext *C, char *name)
+void undo_push_mball(bContext *C, const char *name)
{
undo_editmode_push(C, name, get_data, free_undoMball, undoMball_to_editMball, editMball_to_undoMball, NULL);
}
diff --git a/source/blender/editors/object/CMakeLists.txt b/source/blender/editors/object/CMakeLists.txt
index b16b50f10ba..5efe5af0842 100644
--- a/source/blender/editors/object/CMakeLists.txt
+++ b/source/blender/editors/object/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c *.cpp)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -37,12 +35,28 @@ SET(INC
../../../../extern/recastnavigation/Recast/Include
)
-IF(NOT WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(NOT WITH_PYTHON)
+set(SRC
+ object_add.c
+ object_bake.c
+ object_constraint.c
+ object_edit.c
+ object_group.c
+ object_hook.c
+ object_lattice.c
+ object_modifier.c
+ object_navmesh.cpp
+ object_ops.c
+ object_relations.c
+ object_select.c
+ object_shapekey.c
+ object_transform.c
+ object_vgroup.c
+
+ object_intern.h
+)
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_PYTHON)
+ add_definitions(-DWITH_PYTHON)
+endif()
-BLENDERLIB(bf_editor_object "${SRC}" "${INC}")
+blender_add_lib(bf_editor_object "${SRC}" "${INC}")
diff --git a/source/blender/editors/object/Makefile b/source/blender/editors/object/Makefile
deleted file mode 100644
index 4694653b115..00000000000
--- a/source/blender/editors/object/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_object
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../ikplugin
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/object/SConscript b/source/blender/editors/object/SConscript
index d4e6cec6986..0b4d82ee5d3 100644
--- a/source/blender/editors/object/SConscript
+++ b/source/blender/editors/object/SConscript
@@ -18,7 +18,7 @@ if env['OURPLATFORM'] == 'linux2':
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
incs += ' ' + env['BF_PTHREADS_INC']
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
+if env['WITH_BF_PYTHON']:
+ defs.append('WITH_PYTHON')
env.BlenderLib ( 'bf_editors_object', sources, Split(incs), defs, libtype=['core'], priority=[35] )
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 40b7df72f1c..08a31923cda 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -43,8 +43,10 @@
#include "BLI_math.h"
#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
#include "BKE_anim.h"
+#include "BKE_animsys.h"
#include "BKE_armature.h"
#include "BKE_constraint.h"
#include "BKE_context.h"
@@ -104,15 +106,16 @@ void ED_object_location_from_view(bContext *C, float *loc)
void ED_object_rotation_from_view(bContext *C, float *rot)
{
- RegionView3D *rv3d= ED_view3d_context_rv3d(C);
-
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
if(rv3d) {
- rv3d->viewquat[0]= -rv3d->viewquat[0];
- quat_to_eul( rot, rv3d->viewquat);
- rv3d->viewquat[0]= -rv3d->viewquat[0];
+ float quat[4];
+ copy_qt_qt(quat, rv3d->viewquat);
+ quat[0]= -quat[0];
+ quat_to_eul(rot, quat);
+ }
+ else {
+ zero_v3(rot);
}
- else
- rot[0] = rot[1] = rot[2] = 0.f;
}
void ED_object_base_init_transform(bContext *C, Base *base, float *loc, float *rot)
@@ -161,11 +164,6 @@ float ED_object_new_primitive_matrix(bContext *C, Object *obedit, float *loc, fl
/********************* Add Object Operator ********************/
-void add_object_draw(Scene *scene, View3D *v3d, int type) /* for toolbox or menus, only non-editmode stuff */
-{
- /* keep here to get things compile, remove later */
-}
-
void ED_object_add_generic_props(wmOperatorType *ot, int do_editmode)
{
PropertyRNA *prop;
@@ -218,7 +216,7 @@ static void object_add_generic_invoke_options(bContext *C, wmOperator *op)
}
}
-int ED_object_add_generic_invoke(bContext *C, wmOperator *op, wmEvent *event)
+int ED_object_add_generic_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
object_add_generic_invoke_options(C, op);
return op->type->exec(C, op);
@@ -260,9 +258,11 @@ int ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, floa
view_align = FALSE;
else if (RNA_property_is_set(op->ptr, "view_align"))
view_align = RNA_boolean_get(op->ptr, "view_align");
- else
+ else {
view_align = U.flag & USER_ADD_VIEWALIGNED;
-
+ RNA_boolean_set(op->ptr, "view_align", view_align);
+ }
+
if (view_align)
ED_object_rotation_from_view(C, rot);
else
@@ -280,6 +280,7 @@ int ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, floa
}
/* for object add primitive operators */
+/* do not call undo push in this function (users of this function have to) */
Object *ED_object_add_type(bContext *C, int type, float *loc, float *rot, int enter_editmode, unsigned int layer)
{
Main *bmain= CTX_data_main(C);
@@ -336,7 +337,7 @@ void OBJECT_OT_add(wmOperatorType *ot)
ot->invoke= ED_object_add_generic_invoke;
ot->exec= object_add_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -363,11 +364,6 @@ static EnumPropertyItem field_type_items[] = {
{PFIELD_DRAG, "DRAG", ICON_FORCE_DRAG, "Drag", ""},
{0, NULL, 0, NULL, NULL}};
-void add_effector_draw(Scene *scene, View3D *v3d, int type) /* for toolbox or menus, only non-editmode stuff */
-{
- /* keep here to get things compile, remove later */
-}
-
/* for effector add primitive operators */
static Object *effector_add_type(bContext *C, wmOperator *op, int type)
{
@@ -408,6 +404,8 @@ static Object *effector_add_type(bContext *C, wmOperator *op, int type)
ob->pd= object_add_collision_fields(type);
+ DAG_scene_sort(CTX_data_main(C), CTX_data_scene(C));
+
return ob;
}
@@ -431,7 +429,7 @@ void OBJECT_OT_effector_add(wmOperatorType *ot)
ot->invoke= WM_menu_invoke;
ot->exec= effector_add_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -482,7 +480,7 @@ void OBJECT_OT_camera_add(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_camera_add_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -492,20 +490,10 @@ void OBJECT_OT_camera_add(wmOperatorType *ot)
/* ***************** add primitives *************** */
-
-static EnumPropertyItem prop_metaball_types[]= {
- {MB_BALL, "MBALL_BALL", ICON_META_BALL, "Meta Ball", ""},
- {MB_TUBE, "MBALL_CAPSULE", ICON_META_CAPSULE, "Meta Capsule", ""},
- {MB_PLANE, "MBALL_PLANE", ICON_META_PLANE, "Meta Plane", ""},
- {MB_CUBE, "MBALL_CUBE", ICON_META_CUBE, "Meta Cube", ""},
- {MB_ELIPSOID, "MBALL_ELLIPSOID", ICON_META_ELLIPSOID, "Meta Ellipsoid", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
static int object_metaball_add_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
- MetaElem *elem;
+ /*MetaElem *elem;*/ /*UNUSED*/
int newob= 0;
int enter_editmode;
unsigned int layer;
@@ -521,11 +509,11 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op)
obedit= ED_object_add_type(C, OB_MBALL, loc, rot, TRUE, layer);
newob = 1;
}
- else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ else DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
ED_object_new_primitive_matrix(C, obedit, loc, rot, mat);
- elem= (MetaElem*)add_metaball_primitive(C, mat, RNA_enum_get(op->ptr, "type"), newob);
+ /* elem= (MetaElem *) */ add_metaball_primitive(C, mat, RNA_enum_get(op->ptr, "type"), newob);
/* userdef */
if (newob && !enter_editmode) {
@@ -537,7 +525,7 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int object_metaball_add_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int object_metaball_add_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Object *obedit= CTX_data_edit_object(C);
uiPopupMenu *pup;
@@ -545,7 +533,7 @@ static int object_metaball_add_invoke(bContext *C, wmOperator *op, wmEvent *even
object_add_generic_invoke_options(C, op);
- pup= uiPupMenuBegin(C, op->type->name, 0);
+ pup= uiPupMenuBegin(C, op->type->name, ICON_NULL);
layout= uiPupMenuLayout(pup);
if(!obedit || obedit->type == OB_MBALL)
uiItemsEnumO(layout, op->type->idname, "type");
@@ -571,7 +559,7 @@ void OBJECT_OT_metaball_add(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- RNA_def_enum(ot->srna, "type", prop_metaball_types, 0, "Primitive", "");
+ RNA_def_enum(ot->srna, "type", metaelem_type_items, 0, "Primitive", "");
ED_object_add_generic_props(ot, TRUE);
}
@@ -606,7 +594,7 @@ void OBJECT_OT_text_add(wmOperatorType *ot)
/* api callbacks */
ot->invoke= ED_object_add_generic_invoke;
ot->exec= object_add_text_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -617,7 +605,7 @@ static int object_armature_add_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
View3D *v3d= CTX_wm_view3d(C);
- RegionView3D *rv3d= NULL;
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
int newob= 0;
int enter_editmode;
unsigned int layer;
@@ -632,16 +620,13 @@ static int object_armature_add_exec(bContext *C, wmOperator *op)
ED_object_enter_editmode(C, 0);
newob = 1;
}
- else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ else DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
if(obedit==NULL) {
BKE_report(op->reports, RPT_ERROR, "Cannot create editmode armature.");
return OPERATOR_CANCELLED;
}
- if(v3d)
- rv3d= CTX_wm_region(C)->regiondata;
-
/* v3d and rv3d are allowed to be NULL */
add_primitive_bone(CTX_data_scene(C), v3d, rv3d);
@@ -664,14 +649,14 @@ void OBJECT_OT_armature_add(wmOperatorType *ot)
/* api callbacks */
ot->invoke= ED_object_add_generic_invoke;
ot->exec= object_armature_add_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
ED_object_add_generic_props(ot, TRUE);
}
-static char *get_lamp_defname(int type)
+static const char *get_lamp_defname(int type)
{
switch (type) {
case LA_LOCAL: return "Point";
@@ -697,9 +682,7 @@ static int object_lamp_add_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
ob= ED_object_add_type(C, OB_LAMP, loc, rot, FALSE, layer);
- if(ob && ob->data)
- ((Lamp*)ob->data)->type= type;
-
+ ((Lamp*)ob->data)->type= type;
rename_id((ID *)ob, get_lamp_defname(type));
rename_id((ID *)ob->data, get_lamp_defname(type));
@@ -724,7 +707,7 @@ void OBJECT_OT_lamp_add(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= object_lamp_add_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -781,7 +764,7 @@ void OBJECT_OT_group_instance_add(wmOperatorType *ot)
ot->invoke= WM_enum_search_invoke;
ot->exec= group_instance_add_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -805,7 +788,7 @@ void ED_base_object_free_and_unlink(Main *bmain, Scene *scene, Base *base)
MEM_freeN(base);
}
-static int object_delete_exec(bContext *C, wmOperator *op)
+static int object_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -817,6 +800,10 @@ static int object_delete_exec(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, Base*, base, selected_bases) {
if(base->object->type==OB_LAMP) islamp= 1;
+
+ /* deselect object -- it could be used in other scenes */
+ base->object->flag &= ~SELECT;
+
/* remove from current scene only */
ED_base_object_free_and_unlink(bmain, scene, base);
}
@@ -843,7 +830,7 @@ void OBJECT_OT_delete(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_operator_confirm;
ot->exec= object_delete_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -851,7 +838,7 @@ void OBJECT_OT_delete(wmOperatorType *ot)
/**************************** Copy Utilities ******************************/
-static void copy_object__forwardModifierLinks(void *userData, Object *ob,
+static void copy_object__forwardModifierLinks(void *UNUSED(userData), Object *UNUSED(ob),
ID **idpoin)
{
/* this is copied from ID_NEW; it might be better to have a macro */
@@ -991,7 +978,7 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base)
ob->lay= base->lay;
copy_m4_m4(ob->obmat, dob->mat);
- object_apply_mat4(ob, ob->obmat);
+ object_apply_mat4(ob, ob->obmat, FALSE, FALSE);
}
copy_object_set_idnew(C, 0);
@@ -1001,7 +988,7 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base)
base->object->transflag &= ~OB_DUPLI;
}
-static int object_duplicates_make_real_exec(bContext *C, wmOperator *op)
+static int object_duplicates_make_real_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -1010,6 +997,9 @@ static int object_duplicates_make_real_exec(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
make_object_duplilist_real(C, scene, base);
+
+ /* dependencies were changed */
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARENT, base->object);
}
CTX_DATA_END;
@@ -1032,7 +1022,7 @@ void OBJECT_OT_duplicates_make_real(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_duplicates_make_real_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1047,9 +1037,7 @@ static EnumPropertyItem convert_target_items[]= {
static void curvetomesh(Scene *scene, Object *ob)
{
- Curve *cu= ob->data;
-
- if(cu->disp.first==0)
+ if(ob->disp.first==0)
makeDispListCurveTypes(scene, ob, 0); /* force creation */
nurbs_to_mesh(ob); /* also does users */
@@ -1077,7 +1065,7 @@ static Base *duplibase_for_convert(Scene *scene, Base *base, Object *ob)
}
obn= copy_object(ob);
- obn->recalc |= OB_RECALC_ALL;
+ obn->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
basen= MEM_mallocN(sizeof(Base), "duplibase");
*basen= *base;
@@ -1102,8 +1090,8 @@ static int convert_exec(bContext *C, wmOperator *op)
Nurb *nu;
MetaBall *mb;
Mesh *me;
- int target= RNA_enum_get(op->ptr, "target");
- int keep_original= RNA_boolean_get(op->ptr, "keep_original");
+ const short target= RNA_enum_get(op->ptr, "target");
+ const short keep_original= RNA_boolean_get(op->ptr, "keep_original");
int a, mballConverted= 0;
/* don't forget multiple users! */
@@ -1112,17 +1100,31 @@ static int convert_exec(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
ob= base->object;
ob->flag &= ~OB_DONE;
+
+ /* flag data thats not been edited (only needed for !keep_original) */
+ if(ob->data) {
+ ((ID *)ob->data)->flag |= LIB_DOIT;
+ }
}
CTX_DATA_END;
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
ob= base->object;
- if(ob->flag & OB_DONE) {
+ if(ob->flag & OB_DONE || !IS_TAGGED(ob->data)) {
if (ob->type != target) {
base->flag &= ~SELECT;
ob->flag &= ~SELECT;
}
+
+ /* obdata already modified */
+ if(!IS_TAGGED(ob->data)) {
+ /* When 2 objects with linked data are selected, converting both
+ * would keep modifiers on all but the converted object [#26003] */
+ if(ob->type == OB_MESH) {
+ object_free_modifiers(ob); /* after derivedmesh calls! */
+ }
+ }
}
else if (ob->type==OB_MESH && target == OB_CURVE) {
ob->flag |= OB_DONE;
@@ -1161,7 +1163,7 @@ static int convert_exec(bContext *C, wmOperator *op)
newob->data= copy_mesh(me);
} else {
newob = ob;
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
/* make new mesh data from the original copy */
@@ -1194,7 +1196,7 @@ static int convert_exec(bContext *C, wmOperator *op)
cu= newob->data;
- if (!cu->disp.first)
+ if (!newob->disp.first)
makeDispListCurveTypes(scene, newob, 0);
newob->type= OB_CURVE;
@@ -1222,7 +1224,7 @@ static int convert_exec(bContext *C, wmOperator *op)
for(ob1= bmain->object.first; ob1; ob1=ob1->id.next) {
if(ob1->data==ob->data) {
ob1->type= OB_CURVE;
- ob1->recalc |= OB_RECALC_ALL;
+ ob1->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
}
}
@@ -1231,8 +1233,12 @@ static int convert_exec(bContext *C, wmOperator *op)
for(nu=cu->nurb.first; nu; nu=nu->next)
nu->charidx= 0;
- if(target == OB_MESH)
+ if(target == OB_MESH) {
curvetomesh(scene, newob);
+
+ /* meshes doesn't use displist */
+ freedisplist(&newob->disp);
+ }
}
else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
ob->flag |= OB_DONE;
@@ -1249,19 +1255,17 @@ static int convert_exec(bContext *C, wmOperator *op)
newob->data= copy_curve(ob->data);
} else {
newob= ob;
+
+ /* meshes doesn't use displist */
+ freedisplist(&newob->disp);
}
curvetomesh(scene, newob);
}
}
- else if(ob->type==OB_MBALL) {
+ else if(ob->type==OB_MBALL && target == OB_MESH) {
Object *baseob;
- if (target != OB_MESH) {
- ob->flag |= OB_DONE;
- continue;
- }
-
base->flag &= ~SELECT;
ob->flag &= ~SELECT;
@@ -1303,11 +1307,12 @@ static int convert_exec(bContext *C, wmOperator *op)
mballConverted= 1;
}
- else
- continue;
}
- else
+ else {
continue;
+ }
+
+ /* tag obdata if it was been changed */
/* If the original object is active then make this object active */
if(basen) {
@@ -1319,8 +1324,9 @@ static int convert_exec(bContext *C, wmOperator *op)
basen= NULL;
}
- if (!keep_original) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ if (!keep_original && (ob->flag & OB_DONE)) {
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ ((ID *)ob->data)->flag &= ~LIB_DOIT; /* flag not to convert this datablock again */
}
/* delete original if needed */
@@ -1359,11 +1365,13 @@ static int convert_exec(bContext *C, wmOperator *op)
ED_base_object_activate(C, basact);
BASACT= basact;
} else if (BASACT->object->flag & OB_DONE) {
- WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER|ND_DATA, BASACT->object);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, BASACT->object);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DATA, BASACT->object);
}
DAG_scene_sort(bmain, scene);
- WM_event_add_notifier(C, NC_SCENE|NC_OBJECT|ND_DRAW, scene); /* is NC_SCENE needed ? */
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, scene);
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
return OPERATOR_FINISHED;
}
@@ -1413,7 +1421,7 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
}
else {
obn= copy_object(ob);
- obn->recalc |= OB_RECALC_ALL;
+ obn->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
basen= MEM_mallocN(sizeof(Base), "duplibase");
*basen= *base;
@@ -1449,17 +1457,12 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
}
}
}
- if(dupflag & USER_DUP_ACT){ /* Not buttons in the UI to modify this, add later? */
- id= (ID *)obn->action;
- if (id){
- ID_NEW_US(obn->action)
- else{
- obn->action= copy_action(obn->action);
- }
- id->us--;
- }
- }
#endif // XXX old animation system
+
+ if(dupflag & USER_DUP_ACT) {
+ BKE_copy_animdata_id_action(&obn->id);
+ }
+
if(dupflag & USER_DUP_MAT) {
for(a=0; a<obn->totcol; a++) {
id= (ID *)obn->mat[a];
@@ -1467,6 +1470,10 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
ID_NEW_US(obn->mat[a])
else obn->mat[a]= copy_material(obn->mat[a]);
id->us--;
+
+ if(dupflag & USER_DUP_ACT) {
+ BKE_copy_animdata_id_action(&obn->mat[a]->id);
+ }
}
}
}
@@ -1477,6 +1484,11 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
if(id) {
ID_NEW_US(psys->part)
else psys->part= psys_copy_settings(psys->part);
+
+ if(dupflag & USER_DUP_ACT) {
+ BKE_copy_animdata_id_action(&psys->part->id);
+ }
+
id->us--;
}
}
@@ -1544,7 +1556,10 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
case OB_LAMP:
if(dupflag & USER_DUP_LAMP) {
ID_NEW_US2(obn->data )
- else obn->data= copy_lamp(obn->data);
+ else {
+ obn->data= copy_lamp(obn->data);
+ didit= 1;
+ }
id->us--;
}
break;
@@ -1568,29 +1583,42 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
case OB_LATTICE:
if(dupflag!=0) {
ID_NEW_US2(obn->data )
- else obn->data= copy_lattice(obn->data);
+ else {
+ obn->data= copy_lattice(obn->data);
+ didit= 1;
+ }
id->us--;
}
break;
case OB_CAMERA:
if(dupflag!=0) {
ID_NEW_US2(obn->data )
- else obn->data= copy_camera(obn->data);
+ else {
+ obn->data= copy_camera(obn->data);
+ didit= 1;
+ }
id->us--;
}
break;
}
-
- if(dupflag & USER_DUP_MAT) {
- matarar= give_matarar(obn);
- if(didit && matarar) {
- for(a=0; a<obn->totcol; a++) {
- id= (ID *)(*matarar)[a];
- if(id) {
- ID_NEW_US( (*matarar)[a] )
- else (*matarar)[a]= copy_material((*matarar)[a]);
-
- id->us--;
+
+ /* check if obdata is copied */
+ if(didit) {
+ if(dupflag & USER_DUP_ACT) {
+ BKE_copy_animdata_id_action((ID *)obn->data);
+ }
+
+ if(dupflag & USER_DUP_MAT) {
+ matarar= give_matarar(obn);
+ if(matarar) {
+ for(a=0; a<obn->totcol; a++) {
+ id= (ID *)(*matarar)[a];
+ if(id) {
+ ID_NEW_US( (*matarar)[a] )
+ else (*matarar)[a]= copy_material((*matarar)[a]);
+
+ id->us--;
+ }
}
}
}
@@ -1647,8 +1675,10 @@ static int duplicate_exec(bContext *C, wmOperator *op)
/* new object becomes active */
if(BASACT==base)
ED_base_object_activate(C, basen);
-
- ED_render_id_flush_update(bmain, basen->object->data);
+
+ if(basen->object->data) {
+ DAG_id_tag_update(basen->object->data, 0);
+ }
}
CTX_DATA_END;
@@ -1673,7 +1703,7 @@ void OBJECT_OT_duplicate(wmOperatorType *ot)
/* api callbacks */
ot->exec= duplicate_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1686,20 +1716,6 @@ void OBJECT_OT_duplicate(wmOperatorType *ot)
/* **************** add named object, for dragdrop ************* */
-/* contextual operator dupli */
-
-static int add_named_poll(bContext *C)
-{
- if(!ED_operator_scene_editable(C)) {
- return 0;
- } else {
- Object *ob= CTX_data_active_object(C);
- if(ob && ob->mode != OB_MODE_OBJECT)
- return 0;
- else
- return 1;
- }
-}
static int add_named_exec(bContext *C, wmOperator *op)
{
@@ -1758,7 +1774,7 @@ void OBJECT_OT_add_named(wmOperatorType *ot)
/* api callbacks */
ot->exec= add_named_exec;
- ot->poll= add_named_poll;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c
index f81e73faf73..0b3e116d266 100644
--- a/source/blender/editors/object/object_bake.c
+++ b/source/blender/editors/object/object_bake.c
@@ -42,6 +42,7 @@
#include "BLI_blenlib.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "BKE_blender.h"
#include "BKE_context.h"
@@ -69,7 +70,7 @@
/* ****************** render BAKING ********************** */
/* threaded break test */
-static int thread_break(void *unused)
+static int thread_break(void *UNUSED(arg))
{
return G.afbreek;
}
@@ -235,13 +236,13 @@ static void bake_freejob(void *bkv)
BakeRender *bkr= bkv;
finish_bake_internal(bkr);
- if(bkr->tot==0) BKE_report(bkr->reports, RPT_ERROR, "No valid images found to bake to");
+ if(bkr->tot==0) BKE_report(bkr->reports, RPT_ERROR, "No objects or images found to bake to");
MEM_freeN(bkr);
G.rendering = 0;
}
/* catch esc */
-static int objects_bake_render_modal(bContext *C, wmOperator *op, wmEvent *event)
+static int objects_bake_render_modal(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
/* no running blender, remove handler and pass through */
if(0==WM_jobs_test(CTX_wm_manager(C), CTX_data_scene(C)))
@@ -256,7 +257,7 @@ static int objects_bake_render_modal(bContext *C, wmOperator *op, wmEvent *event
return OPERATOR_PASS_THROUGH;
}
-static int objects_bake_render_invoke(bContext *C, wmOperator *op, wmEvent *_event)
+static int objects_bake_render_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(_event))
{
Scene *scene= CTX_data_scene(C);
@@ -307,9 +308,7 @@ static int bake_image_exec(bContext *C, wmOperator *op)
}
else {
ListBase threads;
- BakeRender bkr;
-
- memset(&bkr, 0, sizeof(bkr));
+ BakeRender bkr= {0};
init_bake_internal(&bkr, C);
bkr.reports= op->reports;
diff --git a/source/blender/editors/object/object_constraint.c b/source/blender/editors/object/object_constraint.c
index f5d87df10a1..f3346bf200c 100644
--- a/source/blender/editors/object/object_constraint.c
+++ b/source/blender/editors/object/object_constraint.c
@@ -35,6 +35,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "DNA_constraint_types.h"
#include "DNA_curve_types.h"
@@ -53,7 +54,7 @@
#include "BKE_report.h"
#include "BIK_api.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -65,6 +66,7 @@
#include "RNA_enum_types.h"
#include "ED_object.h"
+#include "ED_armature.h"
#include "ED_screen.h"
#include "UI_interface.h"
@@ -153,7 +155,7 @@ void validate_pyconstraint_cb (void *arg1, void *arg2)
data->text = text;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* this returns a string for the list of usable pyconstraint script names */
char *buildmenu_pyconstraints (Text *con_text, int *pyconindex)
{
@@ -194,12 +196,15 @@ char *buildmenu_pyconstraints (Text *con_text, int *pyconindex)
return str;
}
-#endif /* DISABLE_PYTHON */
+#endif /* WITH_PYTHON */
/* this callback gets called when the 'refresh' button of a pyconstraint gets pressed */
void update_pyconstraint_cb (void *arg1, void *arg2)
{
-#ifndef DISABLE_PYTHON
+#ifndef WITH_PYTHON
+ (void)arg1; /* unused */
+ (void)arg2; /* unused */
+#else
Object *owner= (Object *)arg1;
bConstraint *con= (bConstraint *)arg2;
if (owner && con)
@@ -208,7 +213,7 @@ void update_pyconstraint_cb (void *arg1, void *arg2)
}
/* helper function for add_constriant - sets the last target for the active constraint */
-static void set_constraint_nth_target (bConstraint *con, Object *target, char subtarget[], int index)
+static void set_constraint_nth_target (bConstraint *con, Object *target, const char subtarget[], int index)
{
bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
ListBase targets = {NULL, NULL};
@@ -400,11 +405,26 @@ static void test_constraints (Object *owner, bPoseChannel *pchan)
for (ct= targets.first; ct; ct= ct->next) {
/* general validity checks (for those constraints that need this) */
if (exist_object(ct->tar) == 0) {
+ /* object doesn't exist, but constraint requires target */
ct->tar = NULL;
curcon->flag |= CONSTRAINT_DISABLE;
}
else if (ct->tar == owner) {
- if (!get_named_bone(get_armature(owner), ct->subtarget)) {
+ if (type == CONSTRAINT_OBTYPE_BONE) {
+ if (!get_named_bone(get_armature(owner), ct->subtarget)) {
+ /* bone must exist in armature... */
+ // TODO: clear subtarget?
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else if (strcmp(pchan->name, ct->subtarget) == 0) {
+ /* cannot target self */
+ ct->subtarget[0] = '\0';
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ }
+ else {
+ /* cannot use self as target */
+ ct->tar = NULL;
curcon->flag |= CONSTRAINT_DISABLE;
}
}
@@ -464,11 +484,11 @@ static EnumPropertyItem constraint_owner_items[] = {
static int edit_constraint_poll_generic(bContext *C, StructRNA *rna_type)
{
PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", rna_type);
- Object *ob= (ptr.id.data)?ptr.id.data:ED_object_active_context(C);
-
+ Object *ob= (ptr.id.data) ? ptr.id.data : ED_object_active_context(C);
+
if (!ob || ob->id.lib) return 0;
- if (ptr.data && ((ID*)ptr.id.data)->lib) return 0;
-
+ if (ptr.id.data && ((ID*)ptr.id.data)->lib) return 0;
+
return 1;
}
@@ -510,7 +530,7 @@ static int edit_constraint_invoke_properties(bContext *C, wmOperator *op)
return 0;
}
-static bConstraint *edit_constraint_property_get(bContext *C, wmOperator *op, Object *ob, int type)
+static bConstraint *edit_constraint_property_get(wmOperator *op, Object *ob, int type)
{
char constraint_name[32];
int owner = RNA_enum_get(op->ptr, "owner");
@@ -526,11 +546,20 @@ static bConstraint *edit_constraint_property_get(bContext *C, wmOperator *op, Ob
bPoseChannel *pchan= get_active_posechannel(ob);
if (pchan)
list = &pchan->constraints;
- else
+ else {
+ //if (G.f & G_DEBUG)
+ //printf("edit_constraint_property_get: No active bone for object '%s'\n", (ob)? ob->id.name+2 : "<None>");
return NULL;
+ }
+ }
+ else {
+ //if (G.f & G_DEBUG)
+ //printf("edit_constraint_property_get: defaulting to getting list in the standard way\n");
+ list = get_active_constraints(ob);
}
con = constraints_findByName(list, constraint_name);
+ printf("constraint found = %p, %s\n", con, (con)?con->name:"<Not found>");
if (con && (type != 0) && (con->type != type))
con = NULL;
@@ -546,7 +575,7 @@ static bConstraint *edit_constraint_property_get(bContext *C, wmOperator *op, Ob
static int stretchto_reset_exec (bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- bConstraint *con = edit_constraint_property_get(C, op, ob, CONSTRAINT_TYPE_STRETCHTO);
+ bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_STRETCHTO);
bStretchToConstraint *data= (con) ? (bStretchToConstraint *)con->data : NULL;
/* despite 3 layers of checks, we may still not be able to find a constraint */
@@ -561,7 +590,7 @@ static int stretchto_reset_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int stretchto_reset_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int stretchto_reset_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_constraint_invoke_properties(C, op))
return stretchto_reset_exec(C, op);
@@ -589,7 +618,7 @@ void CONSTRAINT_OT_stretchto_reset (wmOperatorType *ot)
static int limitdistance_reset_exec (bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- bConstraint *con = edit_constraint_property_get(C, op, ob, CONSTRAINT_TYPE_DISTLIMIT);
+ bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_DISTLIMIT);
bDistLimitConstraint *data= (con) ? (bDistLimitConstraint *)con->data : NULL;
/* despite 3 layers of checks, we may still not be able to find a constraint */
@@ -604,7 +633,7 @@ static int limitdistance_reset_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int limitdistance_reset_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int limitdistance_reset_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_constraint_invoke_properties(C, op))
return limitdistance_reset_exec(C, op);
@@ -635,13 +664,16 @@ static int childof_set_inverse_exec (bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *ob = ED_object_active_context(C);
- bConstraint *con = edit_constraint_property_get(C, op, ob, CONSTRAINT_TYPE_CHILDOF);
+ bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_CHILDOF);
bChildOfConstraint *data= (con) ? (bChildOfConstraint *)con->data : NULL;
bPoseChannel *pchan= NULL;
/* despite 3 layers of checks, we may still not be able to find a constraint */
- if (data == NULL)
+ if (data == NULL) {
+ printf("DEBUG: Child-Of Set Inverse - object = '%s'\n", (ob)? ob->id.name+2 : "<None>");
+ BKE_report(op->reports, RPT_ERROR, "Couldn't find constraint data for Child-Of Set Inverse");
return OPERATOR_CANCELLED;
+ }
/* try to find a pose channel */
// TODO: get from context instead?
@@ -691,7 +723,7 @@ static int childof_set_inverse_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int childof_set_inverse_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int childof_set_inverse_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_constraint_invoke_properties(C, op))
return childof_set_inverse_exec(C, op);
@@ -719,9 +751,14 @@ void CONSTRAINT_OT_childof_set_inverse (wmOperatorType *ot)
static int childof_clear_inverse_exec (bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- bConstraint *con = edit_constraint_property_get(C, op, ob, CONSTRAINT_TYPE_CHILDOF);
+ bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_CHILDOF);
bChildOfConstraint *data= (con) ? (bChildOfConstraint *)con->data : NULL;
+ if(data==NULL) {
+ BKE_report(op->reports, RPT_ERROR, "Childof constraint not found.");
+ return OPERATOR_CANCELLED;
+ }
+
/* simply clear the matrix */
unit_m4(data->invmat);
@@ -730,7 +767,7 @@ static int childof_clear_inverse_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int childof_clear_inverse_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int childof_clear_inverse_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_constraint_invoke_properties(C, op))
return childof_clear_inverse_exec(C, op);
@@ -775,8 +812,8 @@ void ED_object_constraint_update(Object *ob)
object_test_constraints(ob);
- if(ob->type==OB_ARMATURE) DAG_id_flush_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
- else DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ if(ob->type==OB_ARMATURE) DAG_id_tag_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
+ else DAG_id_tag_update(&ob->id, OB_RECALC_OB);
}
void ED_object_constraint_dependency_update(Main *bmain, Scene *scene, Object *ob)
@@ -793,7 +830,7 @@ static int constraint_poll(bContext *C)
return (ptr.id.data && ptr.data);
}
-static int constraint_delete_exec (bContext *C, wmOperator *op)
+static int constraint_delete_exec (bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_Constraint);
Object *ob= ptr.id.data;
@@ -836,7 +873,7 @@ void CONSTRAINT_OT_delete (wmOperatorType *ot)
static int constraint_move_down_exec (bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- bConstraint *con = edit_constraint_property_get(C, op, ob, 0);
+ bConstraint *con = edit_constraint_property_get(op, ob, 0);
if (con && con->next) {
ListBase *conlist= get_constraint_lb(ob, con, NULL);
@@ -854,7 +891,7 @@ static int constraint_move_down_exec (bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-static int constraint_move_down_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int constraint_move_down_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_constraint_invoke_properties(C, op))
return constraint_move_down_exec(C, op);
@@ -884,7 +921,7 @@ void CONSTRAINT_OT_move_down (wmOperatorType *ot)
static int constraint_move_up_exec (bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- bConstraint *con = edit_constraint_property_get(C, op, ob, 0);
+ bConstraint *con = edit_constraint_property_get(op, ob, 0);
if (con && con->prev) {
ListBase *conlist= get_constraint_lb(ob, con, NULL);
@@ -902,7 +939,7 @@ static int constraint_move_up_exec (bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-static int constraint_move_up_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int constraint_move_up_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_constraint_invoke_properties(C, op))
return constraint_move_up_exec(C, op);
@@ -931,11 +968,11 @@ void CONSTRAINT_OT_move_up (wmOperatorType *ot)
/************************ remove constraint operators *********************/
-static int pose_constraints_clear_exec(bContext *C, wmOperator *op)
+static int pose_constraints_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
/* free constraints for all selected bones */
CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones)
@@ -949,7 +986,7 @@ static int pose_constraints_clear_exec(bContext *C, wmOperator *op)
DAG_scene_sort(bmain, scene); /* sort order of objects */
/* do updates */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
return OPERATOR_FINISHED;
@@ -968,7 +1005,7 @@ void POSE_OT_constraints_clear(wmOperatorType *ot)
}
-static int object_constraints_clear_exec(bContext *C, wmOperator *op)
+static int object_constraints_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -977,7 +1014,7 @@ static int object_constraints_clear_exec(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects)
{
free_constraints(&ob->constraints);
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
}
CTX_DATA_END;
@@ -1020,14 +1057,19 @@ static int pose_constraint_copy_exec(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, bPoseChannel*, chan, selected_pose_bones)
{
/* if we're not handling the object we're copying from, copy all constraints over */
- if (pchan != chan)
+ if (pchan != chan) {
copy_constraints(&chan->constraints, &pchan->constraints, TRUE);
+ /* update flags (need to add here, not just copy) */
+ chan->constflag |= pchan->constflag;
+ }
}
CTX_DATA_END;
/* force depsgraph to get recalculated since new relationships added */
DAG_scene_sort(bmain, scene); /* sort order of objects/bones */
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, NULL);
+
return OPERATOR_FINISHED;
}
@@ -1046,7 +1088,7 @@ void POSE_OT_constraints_copy(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int object_constraint_copy_exec(bContext *C, wmOperator *op)
+static int object_constraint_copy_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
@@ -1230,11 +1272,18 @@ static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase
bPoseChannel *pchan;
bConstraint *con;
- if(list == &ob->constraints)
+ if (list == &ob->constraints) {
pchan= NULL;
- else
+ }
+ else {
pchan= get_active_posechannel(ob);
-
+
+ /* ensure not to confuse object/pose adding */
+ if (pchan == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No active pose bone to add a constraint to.");
+ return OPERATOR_CANCELLED;
+ }
+ }
/* check if constraint to be added is valid for the given constraints stack */
if (type == CONSTRAINT_TYPE_NULL) {
return OPERATOR_CANCELLED;
@@ -1278,22 +1327,10 @@ static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase
}
/* do type-specific tweaking to the constraint settings */
- // TODO: does action constraint need anything here - i.e. spaceonce?
switch (type) {
- case CONSTRAINT_TYPE_CHILDOF:
- {
- /* if this constraint is being added to a posechannel, make sure
- * the constraint gets evaluated in pose-space */
- if (ob->mode & OB_MODE_POSE) {
- con->ownspace = CONSTRAINT_SPACE_POSE;
- con->flag |= CONSTRAINT_SPACEONCE;
- }
- }
- break;
-
case CONSTRAINT_TYPE_PYTHON: // FIXME: this code is not really valid anymore
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
char *menustr;
int scriptint= 0;
/* popup a list of usable scripts */
@@ -1317,20 +1354,20 @@ static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase
/* make sure all settings are valid - similar to above checks, but sometimes can be wrong */
object_test_constraints(ob);
-
- if (ob->pose)
+
+ if (pchan)
update_pose_constraint_flags(ob->pose);
-
-
+
+
/* force depsgraph to get recalculated since new relationships added */
DAG_scene_sort(bmain, scene); /* sort order of objects */
if ((ob->type==OB_ARMATURE) && (pchan)) {
ob->pose->flag |= POSE_RECALC; /* sort pose channels */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
}
else
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* notifiers for updates */
WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT|NA_ADDED, ob);
@@ -1364,7 +1401,7 @@ static int object_constraint_add_exec(bContext *C, wmOperator *op)
/* dummy operator callback */
static int pose_constraint_add_exec(bContext *C, wmOperator *op)
{
- Object *ob= ED_object_active_context(C);
+ Object *ob= ED_object_pose_armature(ED_object_active_context(C));
int type= RNA_enum_get(op->ptr, "type");
short with_targets= 0;
@@ -1465,9 +1502,9 @@ void POSE_OT_constraint_add_with_targets(wmOperatorType *ot)
// TODO: should these be here, or back in editors/armature/poseobject.c again?
/* present menu with options + validation for targets to use */
-static int pose_ik_add_invoke(bContext *C, wmOperator *op, wmEvent *evt)
+static int pose_ik_add_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(evt))
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bPoseChannel *pchan= get_active_posechannel(ob);
bConstraint *con= NULL;
@@ -1492,7 +1529,7 @@ static int pose_ik_add_invoke(bContext *C, wmOperator *op, wmEvent *evt)
}
/* prepare popup menu to choose targetting options */
- pup= uiPupMenuBegin(C, "Add IK", 0);
+ pup= uiPupMenuBegin(C, "Add IK", ICON_NULL);
layout= uiPupMenuLayout(pup);
/* the type of targets we'll set determines the menu entries to show... */
@@ -1501,14 +1538,14 @@ static int pose_ik_add_invoke(bContext *C, wmOperator *op, wmEvent *evt)
* - the only thing that matters is that we want a target...
*/
if (tar_pchan)
- uiItemBooleanO(layout, "To Active Bone", 0, "POSE_OT_ik_add", "with_targets", 1);
+ uiItemBooleanO(layout, "To Active Bone", ICON_NULL, "POSE_OT_ik_add", "with_targets", 1);
else
- uiItemBooleanO(layout, "To Active Object", 0, "POSE_OT_ik_add", "with_targets", 1);
+ uiItemBooleanO(layout, "To Active Object", ICON_NULL, "POSE_OT_ik_add", "with_targets", 1);
}
else {
/* we have a choice of adding to a new empty, or not setting any target (targetless IK) */
- uiItemBooleanO(layout, "To New Empty Object", 0, "POSE_OT_ik_add", "with_targets", 1);
- uiItemBooleanO(layout, "Without Targets", 0, "POSE_OT_ik_add", "with_targets", 0);
+ uiItemBooleanO(layout, "To New Empty Object", ICON_NULL, "POSE_OT_ik_add", "with_targets", 1);
+ uiItemBooleanO(layout, "Without Targets", ICON_NULL, "POSE_OT_ik_add", "with_targets", 0);
}
/* finish building the menu, and process it (should result in calling self again) */
@@ -1549,9 +1586,9 @@ void POSE_OT_ik_add(wmOperatorType *ot)
/* ------------------ */
/* remove IK constraints from selected bones */
-static int pose_ik_clear_exec(bContext *C, wmOperator *op)
+static int pose_ik_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only remove IK Constraints */
CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones)
@@ -1570,7 +1607,7 @@ static int pose_ik_clear_exec(bContext *C, wmOperator *op)
CTX_DATA_END;
/* refresh depsgraph */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT|NA_REMOVED, ob);
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index 78404959dff..93da3592275 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -36,6 +36,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_editVert.h"
#include "BLI_ghash.h"
#include "BLI_rand.h"
@@ -49,6 +50,7 @@
#include "DNA_property_types.h"
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
+#include "DNA_object_force.h"
#include "DNA_meshdata_types.h"
#include "DNA_vfont_types.h"
@@ -58,6 +60,7 @@
#include "BKE_constraint.h"
#include "BKE_context.h"
#include "BKE_curve.h"
+#include "BKE_effect.h"
#include "BKE_depsgraph.h"
#include "BKE_font.h"
#include "BKE_image.h"
@@ -97,13 +100,13 @@
#include "object_intern.h" // own include
/* ************* XXX **************** */
-static void error(const char *dummy) {}
-static void waitcursor(int val) {}
-static int pupmenu(const char *msg) {return 0;}
+static void error(const char *UNUSED(arg)) {}
+static void waitcursor(int UNUSED(val)) {}
+static int pupmenu(const char *UNUSED(msg)) {return 0;}
/* port over here */
-static bContext *C;
-static void error_libdata() {}
+static bContext *evil_C;
+static void error_libdata(void) {}
/* find the correct active object per context
@@ -120,7 +123,7 @@ Object *ED_object_active_context(bContext *C)
/* ********* clear/set restrict view *********/
-static int object_hide_view_clear_exec(bContext *C, wmOperator *op)
+static int object_hide_view_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
ScrArea *sa= CTX_wm_area(C);
@@ -219,7 +222,7 @@ void OBJECT_OT_hide_view_set(wmOperatorType *ot)
}
/* 99% same as above except no need for scene refreshing (TODO, update render preview) */
-static int object_hide_render_clear_exec(bContext *C, wmOperator *op)
+static int object_hide_render_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
short changed= 0;
@@ -371,7 +374,7 @@ void ED_object_exit_editmode(bContext *C, int flag)
BKE_ptcache_object_reset(scene, obedit, PTCACHE_RESET_OUTDATED);
/* also flush ob recalc, doesn't take much overhead, but used for particles */
- DAG_id_flush_update(&obedit->id, OB_RECALC_OB|OB_RECALC_DATA);
+ DAG_id_tag_update(&obedit->id, OB_RECALC_OB|OB_RECALC_DATA);
if(flag & EM_DO_UNDO)
ED_undo_push(C, "Editmode");
@@ -433,7 +436,7 @@ void ED_object_enter_editmode(bContext *C, int flag)
if(ob->type==OB_MESH) {
Mesh *me= ob->data;
- if(me->pv) mesh_pmv_off(ob, me);
+ if(me->pv) mesh_pmv_off(me);
ok= 1;
scene->obedit= ob; // context sees this
@@ -460,7 +463,7 @@ void ED_object_enter_editmode(bContext *C, int flag)
scene->obedit= ob;
ED_armature_to_edit(ob);
/* to ensure all goes in restposition and without striding */
- DAG_id_flush_update(&ob->id, OB_RECALC_ALL); // XXX: should this be OB_RECALC_DATA?
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME); // XXX: should this be OB_RECALC_DATA?
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_ARMATURE, scene);
}
@@ -494,7 +497,7 @@ void ED_object_enter_editmode(bContext *C, int flag)
}
if(ok) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else {
scene->obedit= NULL; // XXX for context
@@ -506,12 +509,12 @@ void ED_object_enter_editmode(bContext *C, int flag)
if(flag & EM_WAITCURSOR) waitcursor(0);
}
-static int editmode_toggle_exec(bContext *C, wmOperator *op)
+static int editmode_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
if(!CTX_data_edit_object(C))
ED_object_enter_editmode(C, EM_WAITCURSOR);
else
- ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR|EM_DO_UNDO);
+ ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* had EM_DO_UNDO but op flag calls undo too [#24685] */
return OPERATOR_FINISHED;
}
@@ -524,7 +527,10 @@ static int editmode_toggle_poll(bContext *C)
if(ELEM(NULL, ob, ob->data) || ((ID *)ob->data)->lib)
return 0;
- return ob && (ob->type == OB_MESH || ob->type == OB_ARMATURE ||
+ if (ob->restrictflag & OB_RESTRICT_VIEW)
+ return 0;
+
+ return (ob->type == OB_MESH || ob->type == OB_ARMATURE ||
ob->type == OB_FONT || ob->type == OB_MBALL ||
ob->type == OB_LATTICE || ob->type == OB_SURF ||
ob->type == OB_CURVE);
@@ -549,7 +555,7 @@ void OBJECT_OT_editmode_toggle(wmOperatorType *ot)
/* *************************** */
-static int posemode_exec(bContext *C, wmOperator *op)
+static int posemode_exec(bContext *C, wmOperator *UNUSED(op))
{
Base *base= CTX_data_active_base(C);
@@ -581,7 +587,7 @@ void OBJECT_OT_posemode_toggle(wmOperatorType *ot)
ot->poll= ED_operator_object_active_editable;
/* flag */
- ot->flag= OPTYPE_REGISTER;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
/* *********************** */
@@ -777,7 +783,7 @@ void special_editmenu(Scene *scene, View3D *v3d)
}
}
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else if(ob->mode & OB_MODE_VERTEX_PAINT) {
Mesh *me= get_mesh(ob);
@@ -789,7 +795,7 @@ void special_editmenu(Scene *scene, View3D *v3d)
// XXX do_shared_vertexcol(me);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
}
else if(ob->mode & OB_MODE_WEIGHT_PAINT) {
@@ -836,7 +842,7 @@ void special_editmenu(Scene *scene, View3D *v3d)
break;
}
- DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
if(nr>0) waitcursor(0);
#endif
@@ -1052,7 +1058,7 @@ static void copymenu_modifiers(Main *bmain, Scene *scene, View3D *v3d, Object *o
Base *base;
int i, event;
char str[512];
- char *errorstr= NULL;
+ const char *errorstr= NULL;
strcpy(str, "Copy Modifiers %t");
@@ -1078,13 +1084,13 @@ static void copymenu_modifiers(Main *bmain, Scene *scene, View3D *v3d, Object *o
for (base= FIRSTBASE; base; base= base->next) {
if(base->object != ob) {
if(TESTBASELIB(v3d, base)) {
- ModifierData *md;
base->object->recalc |= OB_RECALC_OB|OB_RECALC_DATA;
if (base->object->type==ob->type) {
/* copy all */
if (event==NUM_MODIFIER_TYPES) {
+ ModifierData *md;
object_free_modifiers(base->object);
for (md=ob->modifiers.first; md; md=md->next) {
@@ -1235,9 +1241,9 @@ void copy_attr(Main *bmain, Scene *scene, View3D *v3d, short event)
else if(event==2) { /* rot */
VECCOPY(base->object->rot, ob->rot);
VECCOPY(base->object->drot, ob->drot);
- /* Quats arnt used yet */
- /*VECCOPY(base->object->quat, ob->quat);
- VECCOPY(base->object->dquat, ob->dquat);*/
+
+ QUATCOPY(base->object->quat, ob->quat);
+ QUATCOPY(base->object->dquat, ob->dquat);
}
else if(event==3) { /* size */
VECCOPY(base->object->size, ob->size);
@@ -1323,7 +1329,7 @@ void copy_attr(Main *bmain, Scene *scene, View3D *v3d, short event)
BKE_text_to_curve(scene, base->object, 0); /* needed? */
- strcpy(cu1->family, cu->family);
+ BLI_strncpy(cu1->family, cu->family, sizeof(cu1->family));
base->object->recalc |= OB_RECALC_DATA;
}
@@ -1496,6 +1502,39 @@ void copy_attr_menu(Main *bmain, Scene *scene, View3D *v3d)
copy_attr(bmain, scene, v3d, event);
}
+/* ******************* force field toggle operator ***************** */
+
+static int forcefield_toggle_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Object *ob = CTX_data_active_object(C);
+
+ if(ob->pd == NULL)
+ ob->pd = object_add_collision_fields(PFIELD_FORCE);
+
+ if(ob->pd->forcefield == 0)
+ ob->pd->forcefield = PFIELD_FORCE;
+ else
+ ob->pd->forcefield = 0;
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_forcefield_toggle(wmOperatorType *ot)
+{
+
+ /* identifiers */
+ ot->name= "Toggle Force Field";
+ ot->description = "Toggle object's force field";
+ ot->idname= "OBJECT_OT_forcefield_toggle";
+
+ /* api callbacks */
+ ot->exec= forcefield_toggle_exec;
+ ot->poll= ED_operator_object_active_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
/* ********************************************** */
/* Motion Paths */
@@ -1525,7 +1564,7 @@ void ED_objects_recalculate_paths(bContext *C, Scene *scene)
/* For the object with pose/action: create path curves for selected bones
* This recalculates the WHOLE path within the pchan->pathsf and pchan->pathef range
*/
-static int object_calculate_paths_exec (bContext *C, wmOperator *op)
+static int object_calculate_paths_exec (bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
@@ -1565,7 +1604,7 @@ void OBJECT_OT_paths_calculate (wmOperatorType *ot)
/* --------- */
/* for the object with pose/action: clear path curves for selected bones only */
-void ED_objects_clear_paths(bContext *C, Scene *scene)
+void ED_objects_clear_paths(bContext *C)
{
/* loop over objects in scene */
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects)
@@ -1580,12 +1619,10 @@ void ED_objects_clear_paths(bContext *C, Scene *scene)
}
/* operator callback for this */
-static int object_clear_paths_exec (bContext *C, wmOperator *op)
-{
- Scene *scene= CTX_data_scene(C);
-
+static int object_clear_paths_exec (bContext *C, wmOperator *UNUSED(op))
+{
/* use the backend function for this */
- ED_objects_clear_paths(C, scene);
+ ED_objects_clear_paths(C);
/* notifiers for updates */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL);
@@ -1623,7 +1660,7 @@ static int shade_smooth_exec(bContext *C, wmOperator *op)
if(ob->type==OB_MESH) {
mesh_set_smooth_flag(ob, !clear);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
done= 1;
@@ -1636,7 +1673,7 @@ static int shade_smooth_exec(bContext *C, wmOperator *op)
else nu->flag &= ~ME_SMOOTH;
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
done= 1;
@@ -1728,7 +1765,7 @@ void image_aspect(Scene *scene, View3D *v3d)
else ob->size[1]= ob->size[0]*y/x;
done= 1;
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
}
}
if(done) break;
@@ -1807,7 +1844,7 @@ void ofs_timeoffs(Scene *scene, View3D *v3d)
// XXX if(fbutton(&offset, -10000.0f, 10000.0f, 10, 10, "Offset")==0) return;
/* make array of all bases, xco yco (screen) */
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ CTX_DATA_BEGIN(evil_C, Object*, ob, selected_editable_objects) {
ob->sf += offset;
if (ob->sf < -MAXFRAMEF) ob->sf = -MAXFRAMEF;
else if (ob->sf > MAXFRAMEF) ob->sf = MAXFRAMEF;
@@ -1820,17 +1857,17 @@ void ofs_timeoffs(Scene *scene, View3D *v3d)
void rand_timeoffs(Scene *scene, View3D *v3d)
{
Base *base;
- float rand=0.0f;
+ float rand_ofs=0.0f;
if(BASACT==0 || v3d==NULL) return;
-// XXX if(fbutton(&rand, 0.0f, 10000.0f, 10, 10, "Randomize")==0) return;
+// XXX if(fbutton(&rand_ofs, 0.0f, 10000.0f, 10, 10, "Randomize")==0) return;
- rand *= 2;
+ rand_ofs *= 2;
for(base= FIRSTBASE; base; base= base->next) {
if(TESTBASELIB(v3d, base)) {
- base->object->sf += (BLI_drand()-0.5) * rand;
+ base->object->sf += (BLI_drand()-0.5) * rand_ofs;
if (base->object->sf < -MAXFRAMEF) base->object->sf = -MAXFRAMEF;
else if (base->object->sf > MAXFRAMEF) base->object->sf = MAXFRAMEF;
}
@@ -1838,7 +1875,7 @@ void rand_timeoffs(Scene *scene, View3D *v3d)
}
-static EnumPropertyItem *object_mode_set_itemsf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *object_mode_set_itemsf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
EnumPropertyItem *input = object_mode_items;
EnumPropertyItem *item= NULL;
@@ -1890,7 +1927,7 @@ static const char *object_mode_op_string(int mode)
/* checks the mode to be set is compatible with the object
* should be made into a generic function */
-static int object_mode_set_compat(bContext *C, wmOperator *op, Object *ob)
+static int object_mode_set_compat(bContext *UNUSED(C), wmOperator *op, Object *ob)
{
ObjectMode mode = RNA_enum_get(op->ptr, "mode");
@@ -1999,7 +2036,7 @@ void ED_object_toggle_modes(bContext *C, int mode)
/************************ Game Properties ***********************/
-static int game_property_new(bContext *C, wmOperator *op)
+static int game_property_new(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_active_object(C);
bProperty *prop;
@@ -2082,7 +2119,7 @@ static EnumPropertyItem game_properties_copy_operations[] ={
static EnumPropertyItem gameprops_items[]= {
{0, NULL, 0, NULL, NULL}};
-static EnumPropertyItem *gameprops_itemf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *gameprops_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
Object *ob= ED_object_active_context(C);
EnumPropertyItem tmp = {0, "", 0, "", ""};
@@ -2164,7 +2201,7 @@ void OBJECT_OT_game_property_copy(wmOperatorType *ot)
ot->prop=prop;
}
-static int game_property_clear_exec(bContext *C, wmOperator *op)
+static int game_property_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) {
free_properties(&ob_iter->prop);
@@ -2190,35 +2227,34 @@ void OBJECT_OT_game_property_clear(wmOperatorType *ot)
/************************ Copy Logic Bricks ***********************/
-static int logicbricks_copy_exec(bContext *C, wmOperator *op)
+static int logicbricks_copy_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob=ED_object_active_context(C);
CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) {
if(ob != ob_iter) {
- if (ob->data != ob_iter->data){
- /* first: free all logic */
- free_sensors(&ob_iter->sensors);
- unlink_controllers(&ob_iter->controllers);
- free_controllers(&ob_iter->controllers);
- unlink_actuators(&ob_iter->actuators);
- free_actuators(&ob_iter->actuators);
-
- /* now copy it, this also works without logicbricks! */
- clear_sca_new_poins_ob(ob);
- copy_sensors(&ob_iter->sensors, &ob->sensors);
- copy_controllers(&ob_iter->controllers, &ob->controllers);
- copy_actuators(&ob_iter->actuators, &ob->actuators);
- set_sca_new_poins_ob(ob_iter);
-
- /* some menu settings */
- ob_iter->scavisflag= ob->scavisflag;
- ob_iter->scaflag= ob->scaflag;
-
- /* set the initial state */
- ob_iter->state= ob->state;
- ob_iter->init_state= ob->init_state;
- }
+ /* first: free all logic */
+ free_sensors(&ob_iter->sensors);
+ unlink_controllers(&ob_iter->controllers);
+ free_controllers(&ob_iter->controllers);
+ unlink_actuators(&ob_iter->actuators);
+ free_actuators(&ob_iter->actuators);
+
+ /* now copy it, this also works without logicbricks! */
+ clear_sca_new_poins_ob(ob);
+ copy_sensors(&ob_iter->sensors, &ob->sensors);
+ copy_controllers(&ob_iter->controllers, &ob->controllers);
+ copy_actuators(&ob_iter->actuators, &ob->actuators);
+ set_sca_new_poins_ob(ob_iter);
+
+ /* some menu settings */
+ ob_iter->scavisflag= ob->scavisflag;
+ ob_iter->scaflag= ob->scaflag;
+
+ /* set the initial state */
+ ob_iter->state= ob->state;
+ ob_iter->init_state= ob->init_state;
+
if(ob_iter->totcol==ob->totcol) {
ob_iter->actcol= ob->actcol;
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob_iter);
diff --git a/source/blender/editors/object/object_group.c b/source/blender/editors/object/object_group.c
index f000485466f..c26affc24a2 100644
--- a/source/blender/editors/object/object_group.c
+++ b/source/blender/editors/object/object_group.c
@@ -29,8 +29,8 @@
#include <string.h>
-
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_group_types.h"
#include "DNA_object_types.h"
@@ -96,7 +96,7 @@ void GROUP_OT_objects_add_active(wmOperatorType *ot)
/* api callbacks */
ot->exec= objects_add_active_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -143,13 +143,13 @@ void GROUP_OT_objects_remove_active(wmOperatorType *ot)
/* api callbacks */
ot->exec= objects_remove_active_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int group_objects_remove_exec(bContext *C, wmOperator *op)
+static int group_objects_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -177,7 +177,7 @@ void GROUP_OT_objects_remove(wmOperatorType *ot)
/* api callbacks */
ot->exec= group_objects_remove_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -214,7 +214,7 @@ void GROUP_OT_create(wmOperatorType *ot)
/* api callbacks */
ot->exec= group_create_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -224,7 +224,7 @@ void GROUP_OT_create(wmOperatorType *ot)
/****************** properties window operators *********************/
-static int group_add_exec(bContext *C, wmOperator *op)
+static int group_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
@@ -293,7 +293,7 @@ void OBJECT_OT_group_link(wmOperatorType *ot)
ot->prop= prop;
}
-static int group_remove_exec(bContext *C, wmOperator *op)
+static int group_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c
index 75e22d5356f..92a53b834b0 100644
--- a/source/blender/editors/object/object_hook.c
+++ b/source/blender/editors/object/object_hook.c
@@ -34,6 +34,7 @@
#include "BLI_editVert.h"
#include "BLI_listbase.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "DNA_curve_types.h"
#include "DNA_lattice_types.h"
@@ -447,7 +448,7 @@ static void add_hook_object(Main *bmain, Scene *scene, Object *obedit, Object *o
hmd->indexar= indexar;
copy_v3_v3(hmd->cent, cent);
hmd->totindex= tot;
- BLI_strncpy(hmd->name, name, 32);
+ BLI_strncpy(hmd->name, name, sizeof(hmd->name));
/* matrix calculus */
/* vert x (obmat x hook->imat) x hook->obmat x ob->imat */
@@ -504,7 +505,7 @@ void OBJECT_OT_hook_add_selobj(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int object_add_hook_newob_exec(bContext *C, wmOperator *op)
+static int object_add_hook_newob_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -551,13 +552,13 @@ static int object_hook_remove_exec(bContext *C, wmOperator *op)
BLI_remlink(&ob->modifiers, (ModifierData *)hmd);
modifier_free((ModifierData *)hmd);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static EnumPropertyItem *hook_mod_itemf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *hook_mod_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
Object *ob = CTX_data_edit_object(C);
EnumPropertyItem tmp = {0, "", 0, "", ""};
@@ -646,7 +647,7 @@ static int object_hook_reset_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
@@ -702,7 +703,7 @@ static int object_hook_recenter_exec(bContext *C, wmOperator *op)
sub_v3_v3v3(hmd->cent, scene->cursor, ob->obmat[3]);
mul_m3_v3(imat, hmd->cent);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
@@ -765,7 +766,7 @@ static int object_hook_assign_exec(bContext *C, wmOperator *op)
hmd->indexar= indexar;
hmd->totindex= tot;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index 4dc5532e975..d3adb51d53c 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -84,6 +84,7 @@ void OBJECT_OT_shade_smooth(struct wmOperatorType *ot);
void OBJECT_OT_shade_flat(struct wmOperatorType *ot);
void OBJECT_OT_paths_calculate(struct wmOperatorType *ot);
void OBJECT_OT_paths_clear(struct wmOperatorType *ot);
+void OBJECT_OT_forcefield_toggle(struct wmOperatorType *ot);
void OBJECT_OT_game_property_new(struct wmOperatorType *ot);
void OBJECT_OT_game_property_remove(struct wmOperatorType *ot);
@@ -151,6 +152,7 @@ void OBJECT_OT_modifier_copy(struct wmOperatorType *ot);
void OBJECT_OT_multires_subdivide(struct wmOperatorType *ot);
void OBJECT_OT_multires_reshape(struct wmOperatorType *ot);
void OBJECT_OT_multires_higher_levels_delete(struct wmOperatorType *ot);
+void OBJECT_OT_multires_base_apply(struct wmOperatorType *ot);
void OBJECT_OT_multires_external_save(struct wmOperatorType *ot);
void OBJECT_OT_multires_external_pack(struct wmOperatorType *ot);
void OBJECT_OT_meshdeform_bind(struct wmOperatorType *ot);
diff --git a/source/blender/editors/object/object_lattice.c b/source/blender/editors/object/object_lattice.c
index 9f82a1209cf..3647d32c28d 100644
--- a/source/blender/editors/object/object_lattice.c
+++ b/source/blender/editors/object/object_lattice.c
@@ -31,6 +31,9 @@
#include "MEM_guardedalloc.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+
#include "DNA_curve_types.h"
#include "DNA_key_types.h"
#include "DNA_lattice_types.h"
@@ -46,8 +49,6 @@
#include "BKE_lattice.h"
#include "BKE_mesh.h"
-#include "BLI_listbase.h"
-
#include "ED_screen.h"
#include "ED_view3d.h"
#include "ED_util.h"
@@ -85,8 +86,6 @@ void make_editLatt(Object *obedit)
free_editLatt(obedit);
- lt= obedit->data;
-
actkey= ob_get_keyblock(obedit);
if(actkey)
key_to_latt(actkey, lt);
@@ -155,7 +154,7 @@ void load_editLatt(Object *obedit)
}
if(editlt->dvert) {
- int tot= lt->pntsu*lt->pntsv*lt->pntsw;
+ tot= lt->pntsu*lt->pntsv*lt->pntsw;
lt->dvert = MEM_mallocN (sizeof (MDeformVert)*tot, "Lattice MDeformVert");
copy_dverts(lt->dvert, editlt->dvert, tot);
@@ -259,7 +258,7 @@ int make_regular_poll(bContext *C)
return (ob && ob->type==OB_LATTICE);
}
-int make_regular_exec(bContext *C, wmOperator *op)
+int make_regular_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_edit_object(C);
Lattice *lt;
@@ -274,7 +273,7 @@ int make_regular_exec(bContext *C, wmOperator *op)
resizelattice(lt, lt->pntsu, lt->pntsv, lt->pntsw, NULL);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
return OPERATOR_FINISHED;
@@ -414,7 +413,7 @@ static void *get_editlatt(bContext *C)
}
/* and this is all the undo system needs to know */
-void undo_push_lattice(bContext *C, char *name)
+void undo_push_lattice(bContext *C, const char *name)
{
undo_editmode_push(C, name, get_editlatt, free_undoLatt, undoLatt_to_editLatt, editLatt_to_undoLatt, validate_undoLatt);
}
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 7cf24d5d07d..0ea1c00100a 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -42,6 +42,8 @@
#include "BLI_listbase.h"
#include "BLI_string.h"
#include "BLI_path_util.h"
+#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "BKE_curve.h"
#include "BKE_context.h"
@@ -68,6 +70,7 @@
#include "ED_armature.h"
#include "ED_object.h"
#include "ED_screen.h"
+#include "ED_mesh.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -76,18 +79,24 @@
/******************************** API ****************************/
-ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, char *name, int type)
+ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, const char *name, int type)
{
ModifierData *md=NULL, *new_md=NULL;
ModifierTypeInfo *mti = modifierType_getInfo(type);
-
+
+ /* only geometry objects should be able to get modifiers [#25291] */
+ if(!ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_LATTICE)) {
+ BKE_reportf(reports, RPT_WARNING, "Modifiers cannot be added to Object '%s'", ob->id.name+2);
+ return NULL;
+ }
+
if(mti->flags&eModifierTypeFlag_Single) {
if(modifiers_findByType(ob, type)) {
BKE_report(reports, RPT_WARNING, "Only one modifier of this type allowed.");
return NULL;
}
}
-
+
if(type == eModifierType_ParticleSystem) {
/* don't need to worry about the new modifier's name, since that is set to the number
* of particle systems which shouldn't have too many duplicates
@@ -132,9 +141,12 @@ ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *sc
}
else if(type == eModifierType_Surface)
DAG_scene_sort(bmain, scene);
+ else if(type == eModifierType_Multires)
+ /* set totlvl from existing MDISPS layer if object already had it */
+ multiresModifier_set_levels_from_disps((MultiresModifierData *)new_md, ob);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
return new_md;
}
@@ -189,14 +201,27 @@ int ED_object_modifier_remove(ReportList *reports, Main *bmain, Scene *scene, Ob
else if(md->type == eModifierType_Multires) {
Mesh *me= ob->data;
- CustomData_external_remove(&me->fdata, &me->id, CD_MDISPS, me->totface);
- CustomData_free_layer_active(&me->fdata, CD_MDISPS, me->totface);
+ if(me->edit_mesh) {
+ EditMesh *em= me->edit_mesh;
+ /* CustomData_external_remove is used here only to mark layer as non-external
+ for further free-ing, so zero element count looks safer than em->totface */
+ CustomData_external_remove(&em->fdata, &me->id, CD_MDISPS, 0);
+ EM_free_data_layer(em, &em->fdata, CD_MDISPS);
+ } else {
+ CustomData_external_remove(&me->fdata, &me->id, CD_MDISPS, me->totface);
+ CustomData_free_layer_active(&me->fdata, CD_MDISPS, me->totface);
+ }
+ }
+
+ if(ELEM(md->type, eModifierType_Softbody, eModifierType_Cloth) &&
+ ob->particlesystem.first == NULL) {
+ ob->mode &= ~OB_MODE_PARTICLE_EDIT;
}
BLI_remlink(&ob->modifiers, md);
modifier_free(md);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* sorting has to be done after the update so that dynamic systems can react properly */
if(sort_depsgraph)
@@ -247,7 +272,7 @@ int ED_object_modifier_move_down(ReportList *reports, Object *ob, ModifierData *
return 1;
}
-int ED_object_modifier_convert(ReportList *reports, Main *bmain, Scene *scene, Object *ob, ModifierData *md)
+int ED_object_modifier_convert(ReportList *UNUSED(reports), Main *bmain, Scene *scene, Object *ob, ModifierData *md)
{
Object *obn;
ParticleSystem *psys;
@@ -362,7 +387,7 @@ static int modifier_apply_shape(ReportList *reports, Scene *scene, Object *ob, M
BKE_report(reports, RPT_ERROR, "Only deforming modifiers can be applied to Shapes");
return 0;
}
- mesh_pmv_off(ob, me);
+ mesh_pmv_off(me);
dm = mesh_create_derived_for_modifier(scene, ob, md);
if (!dm) {
@@ -410,7 +435,7 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
return 0;
}
- mesh_pmv_off(ob, me);
+ mesh_pmv_off(me);
/* Multires: ensure that recent sculpting is applied */
if(md->type == eModifierType_Multires)
@@ -431,6 +456,11 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
DM_to_mesh(dm, me);
dm->release(dm);
+
+ if(md->type == eModifierType_Multires) {
+ CustomData_external_remove(&me->fdata, &me->id, CD_MDISPS, me->totface);
+ CustomData_free_layer_active(&me->fdata, CD_MDISPS, me->totface);
+ }
}
}
else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
@@ -452,7 +482,7 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
MEM_freeN(vertexCos);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else {
BKE_report(reports, RPT_ERROR, "Cannot apply modifier for this object type");
@@ -503,7 +533,7 @@ int ED_object_modifier_apply(ReportList *reports, Scene *scene, Object *ob, Modi
return 1;
}
-int ED_object_modifier_copy(ReportList *reports, Object *ob, ModifierData *md)
+int ED_object_modifier_copy(ReportList *UNUSED(reports), Object *ob, ModifierData *md)
{
ModifierData *nmd;
@@ -532,7 +562,7 @@ static int modifier_add_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static EnumPropertyItem *modifier_add_itemf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *modifier_add_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
Object *ob= ED_object_active_context(C);
EnumPropertyItem *item= NULL, *md_item;
@@ -590,20 +620,21 @@ void OBJECT_OT_modifier_add(wmOperatorType *ot)
/************************ generic functions for operators using mod names and data context *********************/
-static int edit_modifier_poll_generic(bContext *C, StructRNA *rna_type)
+static int edit_modifier_poll_generic(bContext *C, StructRNA *rna_type, int obtype_flag)
{
PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", rna_type);
Object *ob= (ptr.id.data)?ptr.id.data:ED_object_active_context(C);
if (!ob || ob->id.lib) return 0;
- if (ptr.data && ((ID*)ptr.id.data)->lib) return 0;
+ if (obtype_flag && ((1<<ob->type) & obtype_flag)==0) return 0;
+ if (ptr.id.data && ((ID*)ptr.id.data)->lib) return 0;
return 1;
}
static int edit_modifier_poll(bContext *C)
{
- return edit_modifier_poll_generic(C, &RNA_Modifier);
+ return edit_modifier_poll_generic(C, &RNA_Modifier, 0);
}
static void edit_modifier_properties(wmOperatorType *ot)
@@ -628,7 +659,7 @@ static int edit_modifier_invoke_properties(bContext *C, wmOperator *op)
return 0;
}
-static ModifierData *edit_modifier_property_get(bContext *C, wmOperator *op, Object *ob, int type)
+static ModifierData *edit_modifier_property_get(wmOperator *op, Object *ob, int type)
{
char modifier_name[32];
ModifierData *md;
@@ -649,17 +680,24 @@ static int modifier_remove_exec(bContext *C, wmOperator *op)
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *ob = ED_object_active_context(C);
- ModifierData *md = edit_modifier_property_get(C, op, ob, 0);
+ ModifierData *md = edit_modifier_property_get(op, ob, 0);
+ int mode_orig = ob->mode;
if(!ob || !md || !ED_object_modifier_remove(op->reports, bmain, scene, ob, md))
return OPERATOR_CANCELLED;
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+
+ /* if cloth/softbody was removed, particle mode could be cleared */
+ if(mode_orig & OB_MODE_PARTICLE_EDIT)
+ if((ob->mode & OB_MODE_PARTICLE_EDIT)==0)
+ if(scene->basact && scene->basact->object==ob)
+ WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, NULL);
return OPERATOR_FINISHED;
}
-static int modifier_remove_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int modifier_remove_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return modifier_remove_exec(C, op);
@@ -687,18 +725,18 @@ void OBJECT_OT_modifier_remove(wmOperatorType *ot)
static int modifier_move_up_exec(bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- ModifierData *md = edit_modifier_property_get(C, op, ob, 0);
+ ModifierData *md = edit_modifier_property_get(op, ob, 0);
if(!ob || !md || !ED_object_modifier_move_up(op->reports, ob, md))
return OPERATOR_CANCELLED;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static int modifier_move_up_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int modifier_move_up_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return modifier_move_up_exec(C, op);
@@ -726,18 +764,18 @@ void OBJECT_OT_modifier_move_up(wmOperatorType *ot)
static int modifier_move_down_exec(bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- ModifierData *md = edit_modifier_property_get(C, op, ob, 0);
+ ModifierData *md = edit_modifier_property_get(op, ob, 0);
if(!ob || !md || !ED_object_modifier_move_down(op->reports, ob, md))
return OPERATOR_CANCELLED;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static int modifier_move_down_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int modifier_move_down_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return modifier_move_down_exec(C, op);
@@ -766,20 +804,20 @@ static int modifier_apply_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *ob = ED_object_active_context(C);
- ModifierData *md = edit_modifier_property_get(C, op, ob, 0);
+ ModifierData *md = edit_modifier_property_get(op, ob, 0);
int apply_as= RNA_enum_get(op->ptr, "apply_as");
if(!ob || !md || !ED_object_modifier_apply(op->reports, scene, ob, md, apply_as)) {
return OPERATOR_CANCELLED;
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static int modifier_apply_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int modifier_apply_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return modifier_apply_exec(C, op);
@@ -816,18 +854,18 @@ static int modifier_convert_exec(bContext *C, wmOperator *op)
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *ob = ED_object_active_context(C);
- ModifierData *md = edit_modifier_property_get(C, op, ob, 0);
+ ModifierData *md = edit_modifier_property_get(op, ob, 0);
if(!ob || !md || !ED_object_modifier_convert(op->reports, bmain, scene, ob, md))
return OPERATOR_CANCELLED;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static int modifier_convert_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int modifier_convert_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return modifier_convert_exec(C, op);
@@ -855,18 +893,18 @@ void OBJECT_OT_modifier_convert(wmOperatorType *ot)
static int modifier_copy_exec(bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- ModifierData *md = edit_modifier_property_get(C, op, ob, 0);
+ ModifierData *md = edit_modifier_property_get(op, ob, 0);
if(!ob || !md || !ED_object_modifier_copy(op->reports, ob, md))
return OPERATOR_CANCELLED;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static int modifier_copy_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int modifier_copy_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return modifier_copy_exec(C, op);
@@ -893,13 +931,13 @@ void OBJECT_OT_modifier_copy(wmOperatorType *ot)
static int multires_poll(bContext *C)
{
- return edit_modifier_poll_generic(C, &RNA_MultiresModifier);
+ return edit_modifier_poll_generic(C, &RNA_MultiresModifier, (1<<OB_MESH));
}
static int multires_higher_levels_delete_exec(bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Multires);
+ MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(op, ob, eModifierType_Multires);
if (!mmd)
return OPERATOR_CANCELLED;
@@ -911,7 +949,7 @@ static int multires_higher_levels_delete_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int multires_higher_levels_delete_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int multires_higher_levels_delete_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return multires_higher_levels_delete_exec(C, op);
@@ -938,20 +976,20 @@ void OBJECT_OT_multires_higher_levels_delete(wmOperatorType *ot)
static int multires_subdivide_exec(bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Multires);
+ MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(op, ob, eModifierType_Multires);
if (!mmd)
return OPERATOR_CANCELLED;
multiresModifier_subdivide(mmd, ob, 0, mmd->simple);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static int multires_subdivide_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int multires_subdivide_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return multires_subdivide_exec(C, op);
@@ -980,7 +1018,7 @@ static int multires_reshape_exec(bContext *C, wmOperator *op)
{
Object *ob= ED_object_active_context(C), *secondob= NULL;
Scene *scene= CTX_data_scene(C);
- MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Multires);
+ MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(op, ob, eModifierType_Multires);
if (!mmd)
return OPERATOR_CANCELLED;
@@ -1003,13 +1041,13 @@ static int multires_reshape_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static int multires_reshape_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int multires_reshape_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return multires_reshape_exec(C, op);
@@ -1050,7 +1088,7 @@ static int multires_external_save_exec(bContext *C, wmOperator *op)
RNA_string_get(op->ptr, "filepath", path);
if(relative)
- BLI_path_rel(path, G.sce);
+ BLI_path_rel(path, G.main->name);
CustomData_external_add(&me->fdata, &me->id, CD_MDISPS, me->totface, path);
CustomData_external_write(&me->fdata, &me->id, CD_MASK_MESH, me->totface, 0);
@@ -1058,7 +1096,7 @@ static int multires_external_save_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int multires_external_save_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int multires_external_save_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Object *ob = ED_object_active_context(C);
MultiresModifierData *mmd;
@@ -1068,7 +1106,7 @@ static int multires_external_save_invoke(bContext *C, wmOperator *op, wmEvent *e
if (!edit_modifier_invoke_properties(C, op))
return OPERATOR_CANCELLED;
- mmd = (MultiresModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Multires);
+ mmd = (MultiresModifierData *)edit_modifier_property_get(op, ob, eModifierType_Multires);
if (!mmd)
return OPERATOR_CANCELLED;
@@ -1112,7 +1150,7 @@ void OBJECT_OT_multires_external_save(wmOperatorType *ot)
/****************** multires pack operator *********************/
-static int multires_external_pack_exec(bContext *C, wmOperator *op)
+static int multires_external_pack_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob = ED_object_active_context(C);
Mesh *me= ob->data;
@@ -1139,18 +1177,60 @@ void OBJECT_OT_multires_external_pack(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+/********************* multires apply base ***********************/
+static int multires_base_apply_exec(bContext *C, wmOperator *op)
+{
+ Object *ob = ED_object_active_context(C);
+ MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(op, ob, eModifierType_Multires);
+
+ if (!mmd)
+ return OPERATOR_CANCELLED;
+
+ multiresModifier_base_apply(mmd, ob);
+
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+static int multires_base_apply_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+{
+ if (edit_modifier_invoke_properties(C, op))
+ return multires_base_apply_exec(C, op);
+ else
+ return OPERATOR_CANCELLED;
+}
+
+
+void OBJECT_OT_multires_base_apply(wmOperatorType *ot)
+{
+ ot->name= "Multires Apply Base";
+ ot->description= "Modify the base mesh to conform to the displaced mesh";
+ ot->idname= "OBJECT_OT_multires_base_apply";
+
+ ot->poll= multires_poll;
+ ot->invoke= multires_base_apply_invoke;
+ ot->exec= multires_base_apply_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ edit_modifier_properties(ot);
+}
+
+
/************************ mdef bind operator *********************/
static int meshdeform_poll(bContext *C)
{
- return edit_modifier_poll_generic(C, &RNA_MeshDeformModifier);
+ return edit_modifier_poll_generic(C, &RNA_MeshDeformModifier, (1<<OB_MESH));
}
static int meshdeform_bind_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *ob = ED_object_active_context(C);
- MeshDeformModifierData *mmd = (MeshDeformModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_MeshDeform);
+ MeshDeformModifierData *mmd = (MeshDeformModifierData *)edit_modifier_property_get(op, ob, eModifierType_MeshDeform);
if (!mmd)
return OPERATOR_CANCELLED;
@@ -1170,7 +1250,7 @@ static int meshdeform_bind_exec(bContext *C, wmOperator *op)
mmd->totcagevert= 0;
mmd->totinfluence= 0;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
}
else {
@@ -1202,7 +1282,7 @@ static int meshdeform_bind_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int meshdeform_bind_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int meshdeform_bind_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return meshdeform_bind_exec(C, op);
@@ -1231,26 +1311,26 @@ void OBJECT_OT_meshdeform_bind(wmOperatorType *ot)
static int explode_poll(bContext *C)
{
- return edit_modifier_poll_generic(C, &RNA_ExplodeModifier);
+ return edit_modifier_poll_generic(C, &RNA_ExplodeModifier, 0);
}
static int explode_refresh_exec(bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- ExplodeModifierData *emd = (ExplodeModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Explode);
+ ExplodeModifierData *emd = (ExplodeModifierData *)edit_modifier_property_get(op, ob, eModifierType_Explode);
if (!emd)
return OPERATOR_CANCELLED;
emd->flag |= eExplodeFlag_CalcFaces;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static int explode_refresh_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int explode_refresh_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return explode_refresh_exec(C, op);
diff --git a/source/blender/editors/object/object_navmesh.cpp b/source/blender/editors/object/object_navmesh.cpp
index 95738a05db4..8ee63296c70 100644
--- a/source/blender/editors/object/object_navmesh.cpp
+++ b/source/blender/editors/object/object_navmesh.cpp
@@ -26,6 +26,7 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#include <math.h>
#include "Recast.h"
@@ -49,6 +50,7 @@ extern "C"
#include "BKE_cdderivedmesh.h"
#include "BLI_editVert.h"
#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
#include "ED_object.h"
#include "BLI_math_vector.h"
@@ -411,7 +413,7 @@ static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshD
BKE_mesh_end_editmesh((Mesh*)obedit->data, em);
- DAG_id_flush_update((ID*)obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update((ID*)obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -445,7 +447,14 @@ static int create_navmesh_exec(bContext *C, wmOperator *op)
rcPolyMeshDetail* dmesh;
LinkNode* obs = NULL;
Base* navmeshBase = NULL;
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases)
+ //CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) //expand macros to avoid error in convertion from void*
+ {
+ ListBase ctx_data_list;
+ CollectionPointerLink *ctx_link;
+ CTX_data_selected_editable_bases(C, &ctx_data_list);
+ for(ctx_link = (CollectionPointerLink *)ctx_data_list.first;
+ ctx_link; ctx_link = (CollectionPointerLink *)ctx_link->next) {
+ Base* base= (Base*)ctx_link->ptr.data;
{
if (base->object->body_type==OB_BODY_TYPE_NAVMESH)
{
@@ -454,7 +463,7 @@ static int create_navmesh_exec(bContext *C, wmOperator *op)
}
else
BLI_linklist_append(&obs, (void*)base->object);
- }
+ }
CTX_DATA_END;
createVertsTrisData(C, obs, nverts, verts, ntris, tris);
BLI_linklist_free(obs, NULL);
@@ -518,7 +527,7 @@ static int assign_navpolygon_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update((ID*)obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update((ID*)obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh((Mesh*)obedit->data, em);
@@ -596,7 +605,7 @@ static int assign_new_navpolygon_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update((ID*)obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update((ID*)obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh((Mesh*)obedit->data, em);
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index ef68d5507d3..5c5f42b974f 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -29,12 +29,12 @@
#include <stdlib.h>
#include <math.h>
-
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
@@ -77,6 +77,7 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_shade_flat);
WM_operatortype_append(OBJECT_OT_paths_calculate);
WM_operatortype_append(OBJECT_OT_paths_clear);
+ WM_operatortype_append(OBJECT_OT_forcefield_toggle);
WM_operatortype_append(OBJECT_OT_parent_set);
WM_operatortype_append(OBJECT_OT_parent_no_inverse_set);
@@ -134,6 +135,7 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_multires_subdivide);
WM_operatortype_append(OBJECT_OT_multires_reshape);
WM_operatortype_append(OBJECT_OT_multires_higher_levels_delete);
+ WM_operatortype_append(OBJECT_OT_multires_base_apply);
WM_operatortype_append(OBJECT_OT_multires_external_save);
WM_operatortype_append(OBJECT_OT_multires_external_pack);
WM_operatortype_append(OBJECT_OT_meshdeform_bind);
@@ -382,7 +384,7 @@ void ED_keymap_object(wmKeyConfig *keyconf)
ED_object_generic_keymap(keyconf, keymap, 2);
}
-void ED_object_generic_keymap(struct wmKeyConfig *keyconf, struct wmKeyMap *keymap, int do_pet)
+void ED_object_generic_keymap(struct wmKeyConfig *UNUSED(keyconf), struct wmKeyMap *keymap, int do_pet)
{
wmKeyMapItem *kmi;
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index 2a0289ca8b3..0f8e5cec21b 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -47,6 +47,7 @@
#include "BLI_editVert.h"
#include "BLI_listbase.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BKE_action.h"
#include "BKE_animsys.h"
@@ -57,6 +58,7 @@
#include "BKE_depsgraph.h"
#include "BKE_displist.h"
#include "BKE_global.h"
+#include "BKE_fcurve.h"
#include "BKE_lattice.h"
#include "BKE_library.h"
#include "BKE_main.h"
@@ -82,6 +84,7 @@
#include "ED_armature.h"
#include "ED_curve.h"
+#include "ED_keyframing.h"
#include "ED_object.h"
#include "ED_screen.h"
#include "ED_view3d.h"
@@ -194,7 +197,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
if(ob != obedit) {
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
par= obedit->parent;
while(par) {
@@ -260,7 +263,7 @@ void OBJECT_OT_vertex_parent_set(wmOperatorType *ot)
static int make_proxy_invoke (bContext *C, wmOperator *op, wmEvent *evt)
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_active_context(C);
/* sanity checks */
if (!scene || scene->id.lib || !ob)
@@ -277,10 +280,9 @@ static int make_proxy_invoke (bContext *C, wmOperator *op, wmEvent *evt)
else if (ob->id.lib) {
uiPopupMenu *pup= uiPupMenuBegin(C, "OK?", ICON_QUESTION);
uiLayout *layout= uiPupMenuLayout(pup);
- PointerRNA props_ptr;
/* create operator menu item with relevant properties filled in */
- props_ptr= uiItemFullO(layout, op->idname, op->type->name, 0, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS);
+ uiItemFullO(layout, op->idname, op->type->name, ICON_NULL, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS);
/* present the menu and be done... */
uiPupMenuEnd(C, pup);
@@ -297,7 +299,7 @@ static int make_proxy_invoke (bContext *C, wmOperator *op, wmEvent *evt)
static int make_proxy_exec (bContext *C, wmOperator *op)
{
Main *bmain= CTX_data_main(C);
- Object *ob, *gob= CTX_data_active_object(C);
+ Object *ob, *gob= ED_object_active_context(C);
GroupObject *go;
Scene *scene= CTX_data_scene(C);
@@ -341,7 +343,7 @@ static int make_proxy_exec (bContext *C, wmOperator *op)
/* depsgraph flushes are needed for the new data */
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update(&newob->id, OB_RECALC_ALL);
+ DAG_id_tag_update(&newob->id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, newob);
}
else {
@@ -353,19 +355,17 @@ static int make_proxy_exec (bContext *C, wmOperator *op)
}
/* Generic itemf's for operators that take library args */
-static EnumPropertyItem *proxy_group_object_itemf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *proxy_group_object_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
- EnumPropertyItem *item= NULL, item_tmp;
+ EnumPropertyItem item_tmp= {0}, *item= NULL;
int totitem= 0;
int i= 0;
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_active_context(C);
GroupObject *go;
if(!ob || !ob->dup_group)
return DummyRNA_DEFAULT_items;
- memset(&item_tmp, 0, sizeof(item_tmp));
-
/* find the object to affect */
for (go= ob->dup_group->gobject.first; go; go= go->next) {
item_tmp.identifier= item_tmp.name= go->ob->id.name+2;
@@ -429,12 +429,12 @@ static int parent_clear_exec(bContext *C, wmOperator *op)
}
else if(type == 1) {
ob->parent= NULL;
- object_apply_mat4(ob, ob->obmat);
+ object_apply_mat4(ob, ob->obmat, TRUE, FALSE);
}
else if(type == 2)
unit_m4(ob->parentinv);
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
CTX_DATA_END;
@@ -526,7 +526,7 @@ static int parent_set_exec(bContext *C, wmOperator *op)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- Object *par= CTX_data_active_object(C);
+ Object *par= ED_object_active_context(C);
bPoseChannel *pchan= NULL;
int partype= RNA_enum_get(op->ptr, "type");
int pararm= ELEM4(partype, PAR_ARMATURE, PAR_ARMATURE_NAME, PAR_ARMATURE_ENVELOPE, PAR_ARMATURE_AUTO);
@@ -546,6 +546,17 @@ static int parent_set_exec(bContext *C, wmOperator *op)
}
else cu->flag |= CU_FOLLOW;
+ /* if follow, add F-Curve for ctime (i.e. "eval_time") so that path-follow works */
+ if(partype == PAR_FOLLOW) {
+ /* get or create F-Curve */
+ bAction *act = verify_adt_action(&cu->id, 1);
+ FCurve *fcu = verify_fcurve(act, NULL, "eval_time", 0, 1);
+
+ /* setup dummy 'generator' modifier here to get 1-1 correspondance still working */
+ if (!fcu->bezt && !fcu->fpt && !fcu->modifiers.first)
+ add_fmodifier(&fcu->modifiers, FMODIFIER_TYPE_GENERATOR);
+ }
+
/* fall back on regular parenting now (for follow only) */
if(partype == PAR_FOLLOW)
partype= PAR_OBJECT;
@@ -560,7 +571,7 @@ static int parent_set_exec(bContext *C, wmOperator *op)
}
}
- /* context itterator */
+ /* context iterator */
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
if(ob!=par) {
@@ -641,12 +652,14 @@ static int parent_set_exec(bContext *C, wmOperator *op)
}
else if(pararm && ob->type==OB_MESH && par->type == OB_ARMATURE) {
if(partype == PAR_ARMATURE_NAME)
- create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_NAME, 0);
+ create_vgroups_from_armature(op->reports, scene, ob, par, ARM_GROUPS_NAME, 0);
else if(partype == PAR_ARMATURE_ENVELOPE)
- create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_ENVELOPE, 0);
- else if(partype == PAR_ARMATURE_AUTO)
- create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_AUTO, 0);
-
+ create_vgroups_from_armature(op->reports, scene, ob, par, ARM_GROUPS_ENVELOPE, 0);
+ else if(partype == PAR_ARMATURE_AUTO) {
+ WM_cursor_wait(1);
+ create_vgroups_from_armature(op->reports, scene, ob, par, ARM_GROUPS_AUTO, 0);
+ WM_cursor_wait(0);
+ }
/* get corrected inverse */
ob->partype= PAROBJECT;
what_does_parent(scene, ob, &workob);
@@ -668,14 +681,15 @@ static int parent_set_exec(bContext *C, wmOperator *op)
DAG_scene_sort(bmain, scene);
DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARENT, NULL);
return OPERATOR_FINISHED;
}
-static int parent_set_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int parent_set_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
- Object *ob= CTX_data_active_object(C);
- uiPopupMenu *pup= uiPupMenuBegin(C, "Set Parent To", 0);
+ Object *ob= ED_object_active_context(C);
+ uiPopupMenu *pup= uiPupMenuBegin(C, "Set Parent To", ICON_NULL);
uiLayout *layout= uiPupMenuLayout(pup);
uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
@@ -715,7 +729,7 @@ void OBJECT_OT_parent_set(wmOperatorType *ot)
ot->invoke= parent_set_invoke;
ot->exec= parent_set_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_object_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -728,11 +742,11 @@ void OBJECT_OT_parent_set(wmOperatorType *ot)
static int parent_noinv_set_exec(bContext *C, wmOperator *op)
{
Main *bmain= CTX_data_main(C);
- Object *par= CTX_data_active_object(C);
+ Object *par= ED_object_active_context(C);
par->recalc |= OB_RECALC_OB;
- /* context itterator */
+ /* context iterator */
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
if (ob != par) {
if (test_parent_loop(par, ob)) {
@@ -779,7 +793,7 @@ void OBJECT_OT_parent_no_inverse_set(wmOperatorType *ot)
/************************ Clear Slow Parent Operator *********************/
-static int object_slow_parent_clear_exec(bContext *C, wmOperator *op)
+static int object_slow_parent_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -821,7 +835,7 @@ void OBJECT_OT_slow_parent_clear(wmOperatorType *ot)
/********************** Make Slow Parent Operator *********************/
-static int object_slow_parent_set_exec(bContext *C, wmOperator *op)
+static int object_slow_parent_set_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -882,7 +896,7 @@ static int object_track_clear_exec(bContext *C, wmOperator *op)
/* remove track-object for old track */
ob->track= NULL;
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
/* also remove all tracking constraints */
for (con= ob->constraints.last; con; con= pcon) {
@@ -892,7 +906,7 @@ static int object_track_clear_exec(bContext *C, wmOperator *op)
}
if(type == 1)
- object_apply_mat4(ob, ob->obmat);
+ object_apply_mat4(ob, ob->obmat, TRUE, TRUE);
}
CTX_DATA_END;
@@ -914,7 +928,7 @@ void OBJECT_OT_track_clear(wmOperatorType *ot)
ot->invoke= WM_menu_invoke;
ot->exec= object_track_clear_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -935,7 +949,7 @@ static int track_set_exec(bContext *C, wmOperator *op)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- Object *obact= CTX_data_active_object(C);
+ Object *obact= ED_object_active_context(C);
int type= RNA_enum_get(op->ptr, "type");
@@ -949,7 +963,7 @@ static int track_set_exec(bContext *C, wmOperator *op)
data = con->data;
data->tar = obact;
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
/* Lamp and Camera track differently by default */
if (ob->type == OB_LAMP || ob->type == OB_CAMERA)
@@ -968,7 +982,7 @@ static int track_set_exec(bContext *C, wmOperator *op)
data = con->data;
data->tar = obact;
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
/* Lamp and Camera track differently by default */
if (ob->type == OB_LAMP || ob->type == OB_CAMERA) {
@@ -989,7 +1003,7 @@ static int track_set_exec(bContext *C, wmOperator *op)
data = con->data;
data->tar = obact;
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
/* Lamp and Camera track differently by default */
if (ob->type == OB_LAMP || ob->type == OB_CAMERA) {
@@ -1019,7 +1033,7 @@ void OBJECT_OT_track_set(wmOperatorType *ot)
ot->invoke= WM_menu_invoke;
ot->exec= track_set_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1036,7 +1050,8 @@ static unsigned int move_to_layer_init(bContext *C, wmOperator *op)
unsigned int lay= 0;
if(!RNA_property_is_set(op->ptr, "layers")) {
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ /* note: layers are set in bases, library objects work for this */
+ CTX_DATA_BEGIN(C, Base*, base, selected_bases) {
lay |= base->lay;
}
CTX_DATA_END;
@@ -1084,8 +1099,8 @@ static int move_to_layer_exec(bContext *C, wmOperator *op)
if(v3d && v3d->localvd) {
/* now we can move out of localview. */
- // XXX if (!okee("Move from localview")) return;
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ /* note: layers are set in bases, library objects work for this */
+ CTX_DATA_BEGIN(C, Base*, base, selected_bases) {
lay= base->lay & ~v3d->lay;
base->lay= lay;
base->object->lay= lay;
@@ -1097,7 +1112,8 @@ static int move_to_layer_exec(bContext *C, wmOperator *op)
}
else {
/* normal non localview operation */
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ /* note: layers are set in bases, library objects work for this */
+ CTX_DATA_BEGIN(C, Base*, base, selected_bases) {
/* upper byte is used for local view */
local= base->lay & 0xFF000000;
base->lay= lay + local;
@@ -1111,7 +1127,7 @@ static int move_to_layer_exec(bContext *C, wmOperator *op)
/* warning, active object may be hidden now */
- WM_event_add_notifier(C, NC_SCENE|NC_OBJECT|ND_DRAW, scene); /* is NC_SCENE needed ? */
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, scene);
WM_event_add_notifier(C, NC_SCENE|ND_LAYER_CONTENT, scene);
DAG_scene_sort(bmain, scene);
@@ -1129,7 +1145,7 @@ void OBJECT_OT_move_to_layer(wmOperatorType *ot)
/* api callbacks */
ot->invoke= move_to_layer_invoke;
ot->exec= move_to_layer_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1140,7 +1156,7 @@ void OBJECT_OT_move_to_layer(wmOperatorType *ot)
/************************** Link to Scene Operator *****************************/
-void link_to_scene(Main *bmain, unsigned short nr)
+void link_to_scene(Main *UNUSED(bmain), unsigned short UNUSED(nr))
{
#if 0
Scene *sce= (Scene*) BLI_findlink(&bmain->scene, G.curscreen->scenenr-1);
@@ -1238,7 +1254,7 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
ID *id;
int a;
- ob= CTX_data_active_object(C);
+ ob= ED_object_active_context(C);
CTX_DATA_BEGIN(C, Object*, obt, selected_editable_objects) {
if(ob != obt) {
@@ -1265,8 +1281,8 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
}
break;
case MAKE_LINKS_ANIMDATA:
- BKE_copy_animdata_id((ID *)obt, (ID *)ob);
- BKE_copy_animdata_id((ID *)obt->data, (ID *)ob->data);
+ BKE_copy_animdata_id((ID *)obt, (ID *)ob, FALSE);
+ BKE_copy_animdata_id((ID *)obt->data, (ID *)ob->data, FALSE);
break;
case MAKE_LINKS_DUPLIGROUP:
obt->dup_group= ob->dup_group;
@@ -1277,7 +1293,7 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
break;
case MAKE_LINKS_MODIFIERS:
object_link_modifiers(obt, ob);
- obt->recalc |= OB_RECALC_ALL;
+ obt->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
break;
}
}
@@ -1285,6 +1301,8 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
+ DAG_scene_sort(bmain, CTX_data_scene(C));
+
DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, CTX_wm_view3d(C));
return OPERATOR_FINISHED;
@@ -1301,6 +1319,7 @@ void OBJECT_OT_make_links_scene(wmOperatorType *ot)
ot->idname= "OBJECT_OT_make_links_scene";
/* api callbacks */
+ ot->invoke= WM_enum_search_invoke;
ot->exec= make_links_scene_exec;
/* better not run the poll check */
@@ -1323,8 +1342,6 @@ void OBJECT_OT_make_links_data(wmOperatorType *ot)
{MAKE_LINKS_MODIFIERS, "MODIFIERS", 0, "Modifiers", ""},
{0, NULL, 0, NULL, NULL}};
- PropertyRNA *prop;
-
/* identifiers */
ot->name= "Link Data";
ot->description = "Make links from the active object to other selected objects";
@@ -1332,19 +1349,19 @@ void OBJECT_OT_make_links_data(wmOperatorType *ot)
/* api callbacks */
ot->exec= make_links_data_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- prop= RNA_def_enum(ot->srna, "type", make_links_items, 0, "Type", "");
+ ot->prop= RNA_def_enum(ot->srna, "type", make_links_items, 0, "Type", "");
}
/**************************** Make Single User ********************************/
-static void single_object_users__forwardModifierLinks(void *userData, Object *ob, Object **obpoin)
+static void single_object_users__forwardModifierLinks(void *UNUSED(userData), Object *UNUSED(ob), Object **obpoin)
{
ID_NEW(*obpoin);
}
@@ -1360,6 +1377,11 @@ void single_object_users(Scene *scene, View3D *v3d, int flag)
for(base= FIRSTBASE; base; base= base->next) {
ob= base->object;
+ /* newid may still have some trash from Outliner tree building,
+ * so clear that first to avoid errors [#26002]
+ */
+ ob->id.newid = NULL;
+
if( (base->flag & flag)==flag ) {
if(ob->id.lib==NULL && ob->id.us>1) {
/* base gets copy of object */
@@ -1431,17 +1453,17 @@ void single_obdata_users(Main *bmain, Scene *scene, int flag)
if(ob->id.lib==NULL && (base->flag & flag)==flag ) {
id= ob->data;
- if(id && id->us>1 && id->lib==0) {
+ if(id && id->us>1 && id->lib==NULL) {
ob->recalc= OB_RECALC_DATA;
+ BKE_copy_animdata_id_action(id);
+
switch(ob->type) {
case OB_LAMP:
- if(id && id->us>1 && id->lib==NULL) {
- ob->data= la= copy_lamp(ob->data);
- for(a=0; a<MAX_MTEX; a++) {
- if(la->mtex[a]) {
- ID_NEW(la->mtex[a]->object);
- }
+ ob->data= la= copy_lamp(ob->data);
+ for(a=0; a<MAX_MTEX; a++) {
+ if(la->mtex[a]) {
+ ID_NEW(la->mtex[a]->object);
}
}
break;
@@ -1449,7 +1471,8 @@ void single_obdata_users(Main *bmain, Scene *scene, int flag)
ob->data= copy_camera(ob->data);
break;
case OB_MESH:
- me= ob->data= copy_mesh(ob->data);
+ ob->data= copy_mesh(ob->data);
+ //me= ob->data;
//if(me && me->key)
// ipo_idnew(me->key->ipo); /* drivers */
break;
@@ -1482,52 +1505,6 @@ void single_obdata_users(Main *bmain, Scene *scene, int flag)
}
-#if 0 // XXX old animation system
- id= (ID *)ob->action;
- if (id && id->us>1 && id->lib==NULL){
- if(id->newid){
- ob->action= (bAction *)id->newid;
- id_us_plus(id->newid);
- }
- else {
- ob->action= copy_action(ob->action);
- id->us--;
- id->newid=(ID *)ob->action;
- }
- }
- id= (ID *)ob->ipo;
- if(id && id->us>1 && id->lib==NULL) {
- if(id->newid) {
- ob->ipo= (Ipo *)id->newid;
- id_us_plus(id->newid);
- }
- else {
- ob->ipo= copy_ipo(ob->ipo);
- id->us--;
- id->newid= (ID *)ob->ipo;
- }
- ipo_idnew(ob->ipo); /* drivers */
- }
- /* other ipos */
- switch(ob->type) {
- case OB_LAMP:
- la= ob->data;
- if(la->ipo && la->ipo->id.us>1) {
- la->ipo->id.us--;
- la->ipo= copy_ipo(la->ipo);
- ipo_idnew(la->ipo); /* drivers */
- }
- break;
- case OB_CAMERA:
- cam= ob->data;
- if(cam->ipo && cam->ipo->id.us>1) {
- cam->ipo->id.us--;
- cam->ipo= copy_ipo(cam->ipo);
- ipo_idnew(cam->ipo); /* drivers */
- }
- break;
- }
-#endif // XXX old animation system
}
}
@@ -1538,27 +1515,18 @@ void single_obdata_users(Main *bmain, Scene *scene, int flag)
}
}
-void single_ipo_users(Scene *scene, int flag)
+static void single_object_action_users(Scene *scene, int flag)
{
-#if 0 // XXX old animation system
Object *ob;
Base *base;
- ID *id;
for(base= FIRSTBASE; base; base= base->next) {
ob= base->object;
if(ob->id.lib==NULL && (flag==0 || (base->flag & SELECT)) ) {
ob->recalc= OB_RECALC_DATA;
-
- id= (ID *)ob->ipo;
- if(id && id->us>1 && id->lib==NULL) {
- ob->ipo= copy_ipo(ob->ipo);
- id->us--;
- ipo_idnew(ob->ipo); /* drivers */
- }
+ BKE_copy_animdata_id_action(&ob->id);
}
}
-#endif // XXX old animation system
}
static void single_mat_users(Scene *scene, int flag, int do_textures)
@@ -1580,17 +1548,11 @@ static void single_mat_users(Scene *scene, int flag, int do_textures)
if(ma->id.us>1) {
man= copy_material(ma);
-
+ BKE_copy_animdata_id_action(&man->id);
+
man->id.us= 0;
assign_material(ob, man, a);
-
-#if 0 // XXX old animation system
- if(ma->ipo) {
- man->ipo= copy_ipo(ma->ipo);
- ma->ipo->id.us--;
- ipo_idnew(ma->ipo); /* drivers */
- }
-#endif // XXX old animation system
+
if(do_textures) {
for(b=0; b<MAX_MTEX; b++) {
if(ma->mtex[b] && ma->mtex[b]->tex) {
@@ -1623,6 +1585,7 @@ void do_single_tex_user(Tex **from)
}
else if(tex->id.us>1) {
texn= copy_texture(tex);
+ BKE_copy_animdata_id_action(&texn->id);
tex->id.newid= (ID *)texn;
tex->id.us--;
*from= texn;
@@ -1743,7 +1706,7 @@ static int make_local_exec(bContext *C, wmOperator *op)
Material *ma, ***matarar;
Lamp *la;
ID *id;
- int a, b, mode= RNA_enum_get(op->ptr, "type");;
+ int a, b, mode= RNA_enum_get(op->ptr, "type");
if(mode==3) {
all_local(NULL, 0); /* NULL is all libs */
@@ -1774,6 +1737,16 @@ static int make_local_exec(bContext *C, wmOperator *op)
id_make_local(id, 0);
adt= BKE_animdata_from_id(id);
if(adt) BKE_animdata_make_local(adt);
+
+ /* tag indirect data direct */
+ matarar= (Material ***)give_matarar(ob);
+ if(matarar) {
+ for(a=0; a<ob->totcol; a++) {
+ ma= (*matarar)[a];
+ if(ma)
+ id_lib_extern(&ma->id);
+ }
+ }
}
for(psys=ob->particlesystem.first; psys; psys=psys->next)
@@ -1834,7 +1807,7 @@ void OBJECT_OT_make_local(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= make_local_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1863,7 +1836,7 @@ static int make_single_user_exec(bContext *C, wmOperator *op)
single_mat_users(scene, flag, TRUE);
if(RNA_boolean_get(op->ptr, "animation"))
- single_ipo_users(scene, flag);
+ single_object_action_users(scene, flag);
clear_id_newpoins();
@@ -1886,7 +1859,7 @@ void OBJECT_OT_make_single_user(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= make_single_user_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1898,7 +1871,7 @@ void OBJECT_OT_make_single_user(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "obdata", 0, "Object Data", "Make single user object data");
RNA_def_boolean(ot->srna, "material", 0, "Materials", "Make materials local to each datablock");
RNA_def_boolean(ot->srna, "texture", 0, "Textures", "Make textures local to each material");
- RNA_def_boolean(ot->srna, "animation", 0, "Animation Data", "Make animation data local to each object");
+ RNA_def_boolean(ot->srna, "animation", 0, "Object Animation", "Make animation data local to each object");
}
static int drop_named_material_invoke(bContext *C, wmOperator *op, wmEvent *event)
@@ -1933,7 +1906,7 @@ void OBJECT_OT_drop_named_material(wmOperatorType *ot)
/* api callbacks */
ot->invoke= drop_named_material_invoke;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_UNDO;
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index fa9a97f4e74..3cb20ebbac0 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -42,6 +42,7 @@
#include "BLI_listbase.h"
#include "BLI_rand.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_group.h"
@@ -51,6 +52,7 @@
#include "BKE_property.h"
#include "BKE_report.h"
#include "BKE_scene.h"
+#include "BKE_library.h"
#include "BKE_deform.h"
#include "WM_api.h"
@@ -72,7 +74,8 @@
* this takes into account the 'restrict selection in 3d view' flag.
* deselect works always, the restriction just prevents selection */
-/* Note: send a NC_SCENE|ND_OB_SELECT notifier yourself! */
+/* Note: send a NC_SCENE|ND_OB_SELECT notifier yourself! (or
+ * or a NC_SCENE|ND_OB_VISIBLE in case of visibility toggling */
void ED_base_object_select(Base *base, short mode)
{
@@ -147,7 +150,7 @@ void OBJECT_OT_select_by_type(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= object_select_by_type_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -329,7 +332,7 @@ void OBJECT_OT_select_linked(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= object_select_linked_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -429,7 +432,7 @@ static short select_grouped_group(bContext *C, Object *ob) /* Select objects in
}
/* build the menu. */
- pup= uiPupMenuBegin(C, "Select Group", 0);
+ pup= uiPupMenuBegin(C, "Select Group", ICON_NULL);
layout= uiPupMenuLayout(pup);
for (i=0; i<group_count; i++) {
@@ -617,7 +620,7 @@ void OBJECT_OT_select_grouped(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= object_select_grouped_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -659,14 +662,14 @@ static int object_select_by_layer_exec(bContext *C, wmOperator *op)
void OBJECT_OT_select_by_layer(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "select by layer";
+ ot->name= "Select by Layer";
ot->description = "Select all visible objects on a layer";
ot->idname= "OBJECT_OT_select_by_layer";
/* api callbacks */
/*ot->invoke = XXX - need a int grid popup*/
ot->exec= object_select_by_layer_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -678,7 +681,7 @@ void OBJECT_OT_select_by_layer(wmOperatorType *ot)
/************************** Select Inverse *************************/
-static int object_select_inverse_exec(bContext *C, wmOperator *op)
+static int object_select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
if (base->flag & SELECT)
@@ -704,7 +707,7 @@ void OBJECT_OT_select_inverse(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_inverse_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -765,7 +768,7 @@ void OBJECT_OT_select_all(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_all_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -808,13 +811,13 @@ void OBJECT_OT_select_same_group(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "select same group";
+ ot->name= "Select Same Group";
ot->description = "Select object in the same group";
ot->idname= "OBJECT_OT_select_same_group";
/* api callbacks */
ot->exec= object_select_same_group_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -825,21 +828,26 @@ void OBJECT_OT_select_same_group(wmOperatorType *ot)
/**************************** Select Mirror ****************************/
static int object_select_mirror_exec(bContext *C, wmOperator *op)
{
+ Scene *scene= CTX_data_scene(C);
short extend;
extend= RNA_boolean_get(op->ptr, "extend");
CTX_DATA_BEGIN(C, Base*, primbase, selected_bases) {
-
char tmpname[32];
+
flip_side_name(tmpname, primbase->object->id.name+2, TRUE);
+
+ if(strcmp(tmpname, primbase->object->id.name+2)!=0) { /* names differ */
+ Object *ob= (Object *)find_id("OB", tmpname);
+ if(ob) {
+ Base *secbase= object_in_scene(ob, scene);
- CTX_DATA_BEGIN(C, Base*, secbase, visible_bases) {
- if(!strcmp(secbase->object->id.name+2, tmpname)) {
- ED_base_object_select(secbase, BA_SELECT);
+ if(secbase) {
+ ED_base_object_select(secbase, BA_SELECT);
+ }
}
}
- CTX_DATA_END;
if (extend == 0) ED_base_object_select(primbase, BA_DESELECT);
@@ -862,7 +870,7 @@ void OBJECT_OT_select_mirror(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_mirror_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -878,8 +886,11 @@ static int object_select_name_exec(bContext *C, wmOperator *op)
short changed = 0;
if(!extend) {
- CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
- ED_base_object_select(base, BA_DESELECT);
+ CTX_DATA_BEGIN(C, Base*, base, selectable_bases) {
+ if((base->flag & SELECT) == 0) {
+ ED_base_object_select(base, BA_DESELECT);
+ changed= 1;
+ }
}
CTX_DATA_END;
}
@@ -916,7 +927,7 @@ void OBJECT_OT_select_name(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_name_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -964,7 +975,7 @@ void OBJECT_OT_select_random(wmOperatorType *ot)
/* api callbacks */
/*ot->invoke= object_select_random_invoke XXX - need a number popup ;*/
ot->exec = object_select_random_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
diff --git a/source/blender/editors/object/object_shapekey.c b/source/blender/editors/object/object_shapekey.c
index 7b1ab933e28..d8e54a73500 100644
--- a/source/blender/editors/object/object_shapekey.c
+++ b/source/blender/editors/object/object_shapekey.c
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_curve_types.h"
#include "DNA_key_types.h"
@@ -53,6 +54,7 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_object.h"
+#include "BKE_curve.h"
#include "BLO_sys_types.h" // for intptr_t support
@@ -100,8 +102,25 @@ static int ED_object_shape_key_remove(bContext *C, Object *ob)
BLI_remlink(&key->block, kb);
key->totkey--;
- if(key->refkey== kb)
+ if(key->refkey== kb) {
key->refkey= key->block.first;
+
+ if(key->refkey) {
+ /* apply new basis key on original data */
+ switch(ob->type) {
+ case OB_MESH:
+ key_to_mesh(key->refkey, ob->data);
+ break;
+ case OB_CURVE:
+ case OB_SURF:
+ key_to_curve(key->refkey, ob->data, BKE_curve_nurbs(ob->data));
+ break;
+ case OB_LATTICE:
+ key_to_latt(key->refkey, ob->data);
+ break;
+ }
+ }
+ }
if(kb->data) MEM_freeN(kb->data);
MEM_freeN(kb);
@@ -137,13 +156,13 @@ static int ED_object_shape_key_remove(bContext *C, Object *ob)
free_libblock_us(&(bmain->key), key);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
return 1;
}
-static int ED_object_shape_key_mirror(bContext *C, Scene *scene, Object *ob)
+static int object_shape_key_mirror(bContext *C, Object *ob)
{
KeyBlock *kb;
Key *key;
@@ -198,7 +217,7 @@ static int ED_object_shape_key_mirror(bContext *C, Scene *scene, Object *ob)
MEM_freeN(tag_elem);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
return 1;
@@ -235,8 +254,8 @@ void OBJECT_OT_shape_key_add(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Add Shape Key";
- ot->name= "Add shape key to the object.";
ot->idname= "OBJECT_OT_shape_key_add";
+ ot->description= "Add shape key to the object";
/* api callbacks */
ot->poll= shape_key_mode_poll;
@@ -249,7 +268,7 @@ void OBJECT_OT_shape_key_add(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "from_mix", 1, "From Mix", "Create the new shape key from the existing mix of keys.");
}
-static int shape_key_remove_exec(bContext *C, wmOperator *op)
+static int shape_key_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
@@ -263,8 +282,8 @@ void OBJECT_OT_shape_key_remove(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Remove Shape Key";
- ot->name= "Remove shape key from the object.";
ot->idname= "OBJECT_OT_shape_key_remove";
+ ot->description= "Remove shape key from the object";
/* api callbacks */
ot->poll= shape_key_mode_poll;
@@ -274,7 +293,7 @@ void OBJECT_OT_shape_key_remove(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int shape_key_clear_exec(bContext *C, wmOperator *op)
+static int shape_key_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Key *key= ob_get_key(ob);
@@ -286,7 +305,7 @@ static int shape_key_clear_exec(bContext *C, wmOperator *op)
for(kb=key->block.first; kb; kb=kb->next)
kb->curval= 0.0f;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
return OPERATOR_FINISHED;
@@ -307,12 +326,11 @@ void OBJECT_OT_shape_key_clear(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int shape_key_mirror_exec(bContext *C, wmOperator *op)
+static int shape_key_mirror_exec(bContext *C, wmOperator *UNUSED(op))
{
- Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
- if(!ED_object_shape_key_mirror(C, scene, ob))
+ if(!object_shape_key_mirror(C, ob))
return OPERATOR_CANCELLED;
return OPERATOR_FINISHED;
@@ -375,7 +393,7 @@ static int shape_key_move_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c
index 5214676331c..355f1c153cf 100644
--- a/source/blender/editors/object/object_transform.c
+++ b/source/blender/editors/object/object_transform.c
@@ -39,6 +39,7 @@
#include "BLI_math.h"
#include "BLI_editVert.h"
#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_curve.h"
@@ -47,6 +48,7 @@
#include "BKE_mesh.h"
#include "BKE_object.h"
#include "BKE_report.h"
+#include "BKE_multires.h"
#include "RNA_define.h"
#include "RNA_access.h"
@@ -64,38 +66,171 @@
/*************************** Clear Transformation ****************************/
-static int object_location_clear_exec(bContext *C, wmOperator *op)
+/* clear location of object */
+static void object_clear_loc(Object *ob)
+{
+ /* clear location if not locked */
+ if ((ob->protectflag & OB_LOCK_LOCX)==0)
+ ob->loc[0]= ob->dloc[0]= 0.0f;
+ if ((ob->protectflag & OB_LOCK_LOCY)==0)
+ ob->loc[1]= ob->dloc[1]= 0.0f;
+ if ((ob->protectflag & OB_LOCK_LOCZ)==0)
+ ob->loc[2]= ob->dloc[2]= 0.0f;
+}
+
+/* clear rotation of object */
+static void object_clear_rot(Object *ob)
+{
+ /* clear rotations that aren't locked */
+ if (ob->protectflag & (OB_LOCK_ROTX|OB_LOCK_ROTY|OB_LOCK_ROTZ|OB_LOCK_ROTW)) {
+ if (ob->protectflag & OB_LOCK_ROT4D) {
+ /* perform clamping on a component by component basis */
+ if (ob->rotmode == ROT_MODE_AXISANGLE) {
+ if ((ob->protectflag & OB_LOCK_ROTW) == 0)
+ ob->rotAngle= ob->drotAngle= 0.0f;
+ if ((ob->protectflag & OB_LOCK_ROTX) == 0)
+ ob->rotAxis[0]= ob->drotAxis[0]= 0.0f;
+ if ((ob->protectflag & OB_LOCK_ROTY) == 0)
+ ob->rotAxis[1]= ob->drotAxis[1]= 0.0f;
+ if ((ob->protectflag & OB_LOCK_ROTZ) == 0)
+ ob->rotAxis[2]= ob->drotAxis[2]= 0.0f;
+
+ /* check validity of axis - axis should never be 0,0,0 (if so, then we make it rotate about y) */
+ if (IS_EQ(ob->rotAxis[0], ob->rotAxis[1]) && IS_EQ(ob->rotAxis[1], ob->rotAxis[2]))
+ ob->rotAxis[1] = 1.0f;
+ if (IS_EQ(ob->drotAxis[0], ob->drotAxis[1]) && IS_EQ(ob->drotAxis[1], ob->drotAxis[2]))
+ ob->drotAxis[1]= 1.0f;
+ }
+ else if (ob->rotmode == ROT_MODE_QUAT) {
+ if ((ob->protectflag & OB_LOCK_ROTW) == 0)
+ ob->quat[0]= ob->dquat[0]= 1.0f;
+ if ((ob->protectflag & OB_LOCK_ROTX) == 0)
+ ob->quat[1]= ob->dquat[1]= 0.0f;
+ if ((ob->protectflag & OB_LOCK_ROTY) == 0)
+ ob->quat[2]= ob->dquat[2]= 0.0f;
+ if ((ob->protectflag & OB_LOCK_ROTZ) == 0)
+ ob->quat[3]= ob->dquat[3]= 0.0f;
+
+ // TODO: does this quat need normalising now?
+ }
+ else {
+ /* the flag may have been set for the other modes, so just ignore the extra flag... */
+ if ((ob->protectflag & OB_LOCK_ROTX) == 0)
+ ob->rot[0]= ob->drot[0]= 0.0f;
+ if ((ob->protectflag & OB_LOCK_ROTY) == 0)
+ ob->rot[1]= ob->drot[1]= 0.0f;
+ if ((ob->protectflag & OB_LOCK_ROTZ) == 0)
+ ob->rot[2]= ob->drot[2]= 0.0f;
+ }
+ }
+ else {
+ /* perform clamping using euler form (3-components) */
+ // FIXME: deltas are not handled for these cases yet...
+ float eul[3], oldeul[3], quat1[4] = {0};
+
+ if (ob->rotmode == ROT_MODE_QUAT) {
+ QUATCOPY(quat1, ob->quat);
+ quat_to_eul(oldeul, ob->quat);
+ }
+ else if (ob->rotmode == ROT_MODE_AXISANGLE) {
+ axis_angle_to_eulO(oldeul, EULER_ORDER_DEFAULT, ob->rotAxis, ob->rotAngle);
+ }
+ else {
+ copy_v3_v3(oldeul, ob->rot);
+ }
+
+ eul[0]= eul[1]= eul[2]= 0.0f;
+
+ if (ob->protectflag & OB_LOCK_ROTX)
+ eul[0]= oldeul[0];
+ if (ob->protectflag & OB_LOCK_ROTY)
+ eul[1]= oldeul[1];
+ if (ob->protectflag & OB_LOCK_ROTZ)
+ eul[2]= oldeul[2];
+
+ if (ob->rotmode == ROT_MODE_QUAT) {
+ eul_to_quat(ob->quat, eul);
+ /* quaternions flip w sign to accumulate rotations correctly */
+ if ((quat1[0]<0.0f && ob->quat[0]>0.0f) || (quat1[0]>0.0f && ob->quat[0]<0.0f)) {
+ mul_qt_fl(ob->quat, -1.0f);
+ }
+ }
+ else if (ob->rotmode == ROT_MODE_AXISANGLE) {
+ eulO_to_axis_angle(ob->rotAxis, &ob->rotAngle,eul, EULER_ORDER_DEFAULT);
+ }
+ else {
+ copy_v3_v3(ob->rot, eul);
+ }
+ }
+ } // Duplicated in source/blender/editors/armature/editarmature.c
+ else {
+ if (ob->rotmode == ROT_MODE_QUAT) {
+ unit_qt(ob->quat);
+ unit_qt(ob->dquat);
+ }
+ else if (ob->rotmode == ROT_MODE_AXISANGLE) {
+ unit_axis_angle(ob->rotAxis, &ob->rotAngle);
+ unit_axis_angle(ob->drotAxis, &ob->drotAngle);
+ }
+ else {
+ zero_v3(ob->rot);
+ zero_v3(ob->drot);
+ }
+ }
+}
+
+/* clear scale of object */
+static void object_clear_scale(Object *ob)
+{
+ /* clear scale factors which are not locked */
+ if ((ob->protectflag & OB_LOCK_SCALEX)==0) {
+ ob->dsize[0]= 0.0f;
+ ob->size[0]= 1.0f;
+ }
+ if ((ob->protectflag & OB_LOCK_SCALEY)==0) {
+ ob->dsize[1]= 0.0f;
+ ob->size[1]= 1.0f;
+ }
+ if ((ob->protectflag & OB_LOCK_SCALEZ)==0) {
+ ob->dsize[2]= 0.0f;
+ ob->size[2]= 1.0f;
+ }
+}
+
+/* --------------- */
+
+/* generic exec for clear-transform operators */
+static int object_clear_transform_generic_exec(bContext *C, wmOperator *op,
+ void (*clear_func)(Object*), const char default_ksName[])
{
Main *bmain = CTX_data_main(C);
- Scene *scene = CTX_data_scene(C);
+ Scene *scene= CTX_data_scene(C);
KeyingSet *ks;
- /* get KeyingSet to use
- * - use the active KeyingSet if defined (and user wants to use it for all autokeying),
- * or otherwise key transforms only
- */
- if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (scene->active_keyingset))
- ks = ANIM_scene_get_active_keyingset(scene);
- else
- ks = ANIM_builtin_keyingset_get_named(NULL, "Location");
+ /* sanity checks */
+ if ELEM(NULL, clear_func, default_ksName) {
+ BKE_report(op->reports, RPT_ERROR, "Programming error: missing clear transform func or Keying Set Name");
+ return OPERATOR_CANCELLED;
+ }
- /* clear location of selected objects if not in weight-paint mode */
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ /* get KeyingSet to use */
+ ks = ANIM_get_keyingset_for_autokeying(scene, default_ksName);
+
+ /* operate on selected objects only if they aren't in weight-paint mode
+ * (so that object-transform clearing won't be applied at same time as bone-clearing)
+ */
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects)
+ {
if (!(ob->mode & OB_MODE_WEIGHT_PAINT)) {
- /* clear location if not locked */
- if ((ob->protectflag & OB_LOCK_LOCX)==0)
- ob->loc[0]= ob->dloc[0]= 0.0f;
- if ((ob->protectflag & OB_LOCK_LOCY)==0)
- ob->loc[1]= ob->dloc[1]= 0.0f;
- if ((ob->protectflag & OB_LOCK_LOCZ)==0)
- ob->loc[2]= ob->dloc[2]= 0.0f;
-
+ /* run provided clearing function */
+ clear_func(ob);
+
/* auto keyframing */
if (autokeyframe_cfra_can_key(scene, &ob->id)) {
ListBase dsources = {NULL, NULL};
/* now insert the keyframe(s) using the Keying Set
- * 1) add datasource override for the PoseChannel
+ * 1) add datasource override for the Object
* 2) insert keyframes
* 3) free the extra info
*/
@@ -103,9 +238,10 @@ static int object_location_clear_exec(bContext *C, wmOperator *op)
ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
BLI_freelistN(&dsources);
}
+
+ /* tag for updates */
+ ob->recalc |= OB_RECALC_OB;
}
-
- ob->recalc |= OB_RECALC_OB;
}
CTX_DATA_END;
@@ -117,6 +253,14 @@ static int object_location_clear_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
+/* --------------- */
+
+
+static int object_location_clear_exec(bContext *C, wmOperator *op)
+{
+ return object_clear_transform_generic_exec(C, op, object_clear_loc, "Location");
+}
+
void OBJECT_OT_location_clear(wmOperatorType *ot)
{
/* identifiers */
@@ -126,7 +270,7 @@ void OBJECT_OT_location_clear(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_location_clear_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -134,139 +278,7 @@ void OBJECT_OT_location_clear(wmOperatorType *ot)
static int object_rotation_clear_exec(bContext *C, wmOperator *op)
{
- Main *bmain= CTX_data_main(C);
- Scene *scene= CTX_data_scene(C);
- KeyingSet *ks;
-
- /* get KeyingSet to use
- * - use the active KeyingSet if defined (and user wants to use it for all autokeying),
- * or otherwise key transforms only
- */
- if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (scene->active_keyingset))
- ks = ANIM_scene_get_active_keyingset(scene);
- else
- ks = ANIM_builtin_keyingset_get_named(NULL, "Rotation");
-
- /* clear rotation of selected objects if not in weight-paint mode */
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- if(!(ob->mode & OB_MODE_WEIGHT_PAINT)) {
- /* clear rotations that aren't locked */
- if (ob->protectflag & (OB_LOCK_ROTX|OB_LOCK_ROTY|OB_LOCK_ROTZ|OB_LOCK_ROTW)) {
- if (ob->protectflag & OB_LOCK_ROT4D) {
- /* perform clamping on a component by component basis */
- if (ob->rotmode == ROT_MODE_AXISANGLE) {
- if ((ob->protectflag & OB_LOCK_ROTW) == 0)
- ob->rotAngle= 0.0f;
- if ((ob->protectflag & OB_LOCK_ROTX) == 0)
- ob->rotAxis[0]= 0.0f;
- if ((ob->protectflag & OB_LOCK_ROTY) == 0)
- ob->rotAxis[1]= 0.0f;
- if ((ob->protectflag & OB_LOCK_ROTZ) == 0)
- ob->rotAxis[2]= 0.0f;
-
- /* check validity of axis - axis should never be 0,0,0 (if so, then we make it rotate about y) */
- if (IS_EQ(ob->rotAxis[0], ob->rotAxis[1]) && IS_EQ(ob->rotAxis[1], ob->rotAxis[2]))
- ob->rotAxis[1] = 1.0f;
- }
- else if (ob->rotmode == ROT_MODE_QUAT) {
- if ((ob->protectflag & OB_LOCK_ROTW) == 0)
- ob->quat[0]= 1.0f;
- if ((ob->protectflag & OB_LOCK_ROTX) == 0)
- ob->quat[1]= 0.0f;
- if ((ob->protectflag & OB_LOCK_ROTY) == 0)
- ob->quat[2]= 0.0f;
- if ((ob->protectflag & OB_LOCK_ROTZ) == 0)
- ob->quat[3]= 0.0f;
- }
- else {
- /* the flag may have been set for the other modes, so just ignore the extra flag... */
- if ((ob->protectflag & OB_LOCK_ROTX) == 0)
- ob->rot[0]= 0.0f;
- if ((ob->protectflag & OB_LOCK_ROTY) == 0)
- ob->rot[1]= 0.0f;
- if ((ob->protectflag & OB_LOCK_ROTZ) == 0)
- ob->rot[2]= 0.0f;
- }
- }
- else {
- /* perform clamping using euler form (3-components) */
- float eul[3], oldeul[3], quat1[4] = {0};
-
- if (ob->rotmode == ROT_MODE_QUAT) {
- QUATCOPY(quat1, ob->quat);
- quat_to_eul( oldeul,ob->quat);
- }
- else if (ob->rotmode == ROT_MODE_AXISANGLE) {
- axis_angle_to_eulO( oldeul, EULER_ORDER_DEFAULT,ob->rotAxis, ob->rotAngle);
- }
- else {
- copy_v3_v3(oldeul, ob->rot);
- }
-
- eul[0]= eul[1]= eul[2]= 0.0f;
-
- if (ob->protectflag & OB_LOCK_ROTX)
- eul[0]= oldeul[0];
- if (ob->protectflag & OB_LOCK_ROTY)
- eul[1]= oldeul[1];
- if (ob->protectflag & OB_LOCK_ROTZ)
- eul[2]= oldeul[2];
-
- if (ob->rotmode == ROT_MODE_QUAT) {
- eul_to_quat( ob->quat,eul);
- /* quaternions flip w sign to accumulate rotations correctly */
- if ((quat1[0]<0.0f && ob->quat[0]>0.0f) || (quat1[0]>0.0f && ob->quat[0]<0.0f)) {
- mul_qt_fl(ob->quat, -1.0f);
- }
- }
- else if (ob->rotmode == ROT_MODE_AXISANGLE) {
- eulO_to_axis_angle( ob->rotAxis, &ob->rotAngle,eul, EULER_ORDER_DEFAULT);
- }
- else {
- copy_v3_v3(ob->rot, eul);
- }
- }
- } // Duplicated in source/blender/editors/armature/editarmature.c
- else {
- if (ob->rotmode == ROT_MODE_QUAT) {
- ob->quat[1]=ob->quat[2]=ob->quat[3]= 0.0f;
- ob->quat[0]= 1.0f;
- }
- else if (ob->rotmode == ROT_MODE_AXISANGLE) {
- /* by default, make rotation of 0 radians around y-axis (roll) */
- ob->rotAxis[0]=ob->rotAxis[2]=ob->rotAngle= 0.0f;
- ob->rotAxis[1]= 1.0f;
- }
- else {
- ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0f;
- }
- }
-
- /* auto keyframing */
- if (autokeyframe_cfra_can_key(scene, &ob->id)) {
- ListBase dsources = {NULL, NULL};
-
- /* now insert the keyframe(s) using the Keying Set
- * 1) add datasource override for the PoseChannel
- * 2) insert keyframes
- * 3) free the extra info
- */
- ANIM_relative_keyingset_add_source(&dsources, &ob->id, NULL, NULL);
- ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
- BLI_freelistN(&dsources);
- }
- }
-
- ob->recalc |= OB_RECALC_OB;
- }
- CTX_DATA_END;
-
- /* this is needed so children are also updated */
- DAG_ids_flush_update(bmain, 0);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return OPERATOR_FINISHED;
+ return object_clear_transform_generic_exec(C, op, object_clear_rot, "Rotation");
}
void OBJECT_OT_rotation_clear(wmOperatorType *ot)
@@ -278,7 +290,7 @@ void OBJECT_OT_rotation_clear(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_rotation_clear_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -286,60 +298,7 @@ void OBJECT_OT_rotation_clear(wmOperatorType *ot)
static int object_scale_clear_exec(bContext *C, wmOperator *op)
{
- Main *bmain= CTX_data_main(C);
- Scene *scene= CTX_data_scene(C);
- KeyingSet *ks;
-
- /* get KeyingSet to use
- * - use the active KeyingSet if defined (and user wants to use it for all autokeying),
- * or otherwise key transforms only
- */
- if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (scene->active_keyingset))
- ks = ANIM_scene_get_active_keyingset(scene);
- else
- ks = ANIM_builtin_keyingset_get_named(NULL, "Scaling");
-
- /* clear scales of selected objects if not in weight-paint mode */
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- if(!(ob->mode & OB_MODE_WEIGHT_PAINT)) {
- /* clear scale factors which are not locked */
- if ((ob->protectflag & OB_LOCK_SCALEX)==0) {
- ob->dsize[0]= 0.0f;
- ob->size[0]= 1.0f;
- }
- if ((ob->protectflag & OB_LOCK_SCALEY)==0) {
- ob->dsize[1]= 0.0f;
- ob->size[1]= 1.0f;
- }
- if ((ob->protectflag & OB_LOCK_SCALEZ)==0) {
- ob->dsize[2]= 0.0f;
- ob->size[2]= 1.0f;
- }
-
- /* auto keyframing */
- if (autokeyframe_cfra_can_key(scene, &ob->id)) {
- ListBase dsources = {NULL, NULL};
-
- /* now insert the keyframe(s) using the Keying Set
- * 1) add datasource override for the PoseChannel
- * 2) insert keyframes
- * 3) free the extra info
- */
- ANIM_relative_keyingset_add_source(&dsources, &ob->id, NULL, NULL);
- ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
- BLI_freelistN(&dsources);
- }
- }
- ob->recalc |= OB_RECALC_OB;
- }
- CTX_DATA_END;
-
- /* this is needed so children are also updated */
- DAG_ids_flush_update(bmain, 0);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return OPERATOR_FINISHED;
+ return object_clear_transform_generic_exec(C, op, object_clear_scale, "Scaling");
}
void OBJECT_OT_scale_clear(wmOperatorType *ot)
@@ -351,20 +310,24 @@ void OBJECT_OT_scale_clear(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_scale_clear_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int object_origin_clear_exec(bContext *C, wmOperator *op)
+/* --------------- */
+
+static int object_origin_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
- float *v1, *v3, mat[3][3];
- int armature_clear= 0;
+ float *v1, *v3;
+ float mat[3][3];
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- if(ob->parent) {
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects)
+ {
+ if (ob->parent) {
+ /* vectors pointed to by v1 and v3 will get modified */
v1= ob->loc;
v3= ob->parentinv[3];
@@ -376,8 +339,7 @@ static int object_origin_clear_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- if(armature_clear==0) /* in this case flush was done */
- DAG_ids_flush_update(bmain, 0);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
@@ -393,7 +355,7 @@ void OBJECT_OT_origin_clear(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_origin_clear_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -411,7 +373,7 @@ static void ignore_parent_tx(Main *bmain, Scene *scene, Object *ob )
/* a change was made, adjust the children to compensate */
for(ob_child=bmain->object.first; ob_child; ob_child=ob_child->id.next) {
if(ob_child->parent == ob) {
- object_apply_mat4(ob_child, ob_child->obmat);
+ object_apply_mat4(ob_child, ob_child->obmat, TRUE, FALSE);
what_does_parent(scene, ob_child, &workob);
invert_m4_m4(ob_child->parentinv, workob.obmat);
}
@@ -478,8 +440,18 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo
object_to_mat3(ob, rsmat);
else if(apply_scale)
object_scale_to_mat3(ob, rsmat);
- else if(apply_rot)
+ else if(apply_rot) {
+ float tmat[3][3], timat[3][3];
+
+ /* simple rotation matrix */
object_rot_to_mat3(ob, rsmat);
+
+ /* correct for scale, note mul_m3_m3m3 has swapped args! */
+ object_scale_to_mat3(ob, tmat);
+ invert_m3_m3(timat, tmat);
+ mul_m3_m3m3(rsmat, timat, rsmat);
+ mul_m3_m3m3(rsmat, rsmat, tmat);
+ }
else
unit_m3(rsmat);
@@ -502,6 +474,8 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo
if(ob->type==OB_MESH) {
me= ob->data;
+ multiresModifier_scale_disp(scene, ob);
+
/* adjust data */
mvert= me->mvert;
for(a=0; a<me->totvert; a++, mvert++)
@@ -550,22 +524,19 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo
continue;
if(apply_loc)
- ob->loc[0]= ob->loc[1]= ob->loc[2]= 0.0f;
+ zero_v3(ob->loc);
if(apply_scale)
ob->size[0]= ob->size[1]= ob->size[2]= 1.0f;
if(apply_rot) {
- ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0f;
- ob->quat[1]= ob->quat[2]= ob->quat[3]= 0.0f;
- ob->rotAxis[0]= ob->rotAxis[2]= 0.0f;
- ob->rotAngle= 0.0f;
-
- ob->quat[0]= ob->rotAxis[1]= 1.0f;
+ zero_v3(ob->rot);
+ unit_qt(ob->quat);
+ unit_axis_angle(ob->rotAxis, &ob->rotAngle);
}
where_is_object(scene, ob);
ignore_parent_tx(bmain, scene, ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA);
change = 1;
}
@@ -578,16 +549,19 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo
return OPERATOR_FINISHED;
}
-static int visual_transform_apply_exec(bContext *C, wmOperator *op)
+static int visual_transform_apply_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
int change = 0;
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
where_is_object(scene, ob);
- object_apply_mat4(ob, ob->obmat);
+ object_apply_mat4(ob, ob->obmat, TRUE, TRUE);
where_is_object(scene, ob);
-
+
+ /* update for any children that may get moved */
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
+
change = 1;
}
CTX_DATA_END;
@@ -608,7 +582,7 @@ void OBJECT_OT_visual_transform_apply(wmOperatorType *ot)
/* api callbacks */
ot->exec= visual_transform_apply_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -628,7 +602,7 @@ void OBJECT_OT_location_apply(wmOperatorType *ot)
/* api callbacks */
ot->exec= location_apply_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -648,7 +622,7 @@ void OBJECT_OT_scale_apply(wmOperatorType *ot)
/* api callbacks */
ot->exec= scale_apply_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -668,7 +642,7 @@ void OBJECT_OT_rotation_apply(wmOperatorType *ot)
/* api callbacks */
ot->exec= rotation_apply_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -770,7 +744,9 @@ static int object_origin_set_exec(bContext *C, wmOperator *op)
total++;
add_v3_v3(cent, eve->co);
}
- mul_v3_fl(cent, 1.0f/(float)total);
+ if(total) {
+ mul_v3_fl(cent, 1.0f/(float)total);
+ }
}
else {
for(eve= em->verts.first; eve; eve= eve->next) {
@@ -779,13 +755,15 @@ static int object_origin_set_exec(bContext *C, wmOperator *op)
mid_v3_v3v3(cent, min, max);
}
- for(eve= em->verts.first; eve; eve= eve->next) {
- sub_v3_v3(eve->co, cent);
- }
+ if(!is_zero_v3(cent)) {
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ sub_v3_v3(eve->co, cent);
+ }
- recalc_editnormals(em);
- tot_change++;
- DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ recalc_editnormals(em);
+ tot_change++;
+ DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
+ }
BKE_mesh_end_editmesh(me, em);
}
}
@@ -877,7 +855,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op)
if(obedit) {
if (centermode == GEOMETRY_TO_ORIGIN) {
- DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
}
break;
}
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index 76af8feda82..c673ea0fd2d 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -30,6 +30,7 @@
#include <string.h>
#include <stddef.h>
#include <math.h>
+#include <assert.h>
#include "MEM_guardedalloc.h"
@@ -45,6 +46,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_customdata.h"
@@ -68,6 +70,8 @@
/************************ Exported Functions **********************/
static void vgroup_remap_update_users(Object *ob, int *map);
+static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *defgroup);
+static void vgroup_delete_object_mode(Object *ob, bDeformGroup *dg);
static Lattice *vgroup_edit_lattice(Object *ob)
{
@@ -79,7 +83,17 @@ static Lattice *vgroup_edit_lattice(Object *ob)
return NULL;
}
-bDeformGroup *ED_vgroup_add_name(Object *ob, char *name)
+int ED_vgroup_object_is_edit_mode(Object *ob)
+{
+ if(ob->type == OB_MESH)
+ return (((Mesh*)ob->data)->edit_mesh != NULL);
+ else if(ob->type == OB_LATTICE)
+ return (((Lattice*)ob->data)->editlatt != NULL);
+
+ return 0;
+}
+
+bDeformGroup *ED_vgroup_add_name(Object *ob, const char *name)
{
bDeformGroup *defgroup;
@@ -103,6 +117,25 @@ bDeformGroup *ED_vgroup_add(Object *ob)
return ED_vgroup_add_name(ob, "Group");
}
+void ED_vgroup_delete(Object *ob, bDeformGroup *defgroup)
+{
+ bDeformGroup *dg = (bDeformGroup *)ob->defbase.first;
+
+ while (dg) {
+ if (dg == defgroup)
+ break;
+ dg = dg->next;
+ }
+
+ if (dg == NULL)
+ return;
+
+ if(ED_vgroup_object_is_edit_mode(ob))
+ vgroup_delete_edit_mode(ob, dg);
+ else
+ vgroup_delete_object_mode(ob, dg);
+}
+
void ED_vgroup_data_create(ID *id)
{
/* create deform verts */
@@ -136,8 +169,7 @@ int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_tot)
return 0;
}
- i = 0;
- for (eve=em->verts.first; eve; eve=eve->next) i++;
+ i= BLI_countlist(&em->verts);
*dvert_arr= MEM_mallocN(sizeof(void*)*i, "vgroup parray from me");
*dvert_tot = i;
@@ -460,23 +492,10 @@ void ED_vgroup_vert_remove(Object *ob, bDeformGroup *dg, int vertnum)
/* This routine removes the vertex from the specified
* deform group.
*/
-
- int def_nr;
-
- /* if the object is NULL abort
- */
- if(!ob)
+ const int def_nr= defgroup_find_index(ob, dg);
+ if(def_nr < 0)
return;
- /* get the deform number that cooresponds
- * to this deform group, and abort if it
- * can not be found.
- */
- def_nr = defgroup_find_index(ob, dg);
- if(def_nr < 0) return;
-
- /* call another routine to do the work
- */
ED_vgroup_nr_vert_remove(ob, def_nr, vertnum);
}
@@ -508,7 +527,7 @@ static float get_vert_def_nr(Object *ob, int def_nr, int vertnum)
}
if(dvert==NULL)
- return 0.0f;
+ return -1;
dvert += vertnum;
@@ -516,22 +535,22 @@ static float get_vert_def_nr(Object *ob, int def_nr, int vertnum)
if(dvert->dw[i].def_nr == def_nr)
return dvert->dw[i].weight;
- return 0.0f;
+ return -1;
}
float ED_vgroup_vert_weight(Object *ob, bDeformGroup *dg, int vertnum)
{
int def_nr;
- if(!ob) return 0.0f;
+ if(!ob) return -1;
def_nr = defgroup_find_index(ob, dg);
- if(def_nr < 0) return 0.0f;
+ if(def_nr < 0) return -1;
return get_vert_def_nr(ob, def_nr, vertnum);
}
-void ED_vgroup_select_by_name(Object *ob, char *name)
+void ED_vgroup_select_by_name(Object *ob, const char *name)
{ /* note: ob->actdef==0 signals on painting to create a new one, if a bone in posemode is selected */
ob->actdef= defgroup_name_index(ob, name) + 1;
}
@@ -555,9 +574,10 @@ static void vgroup_select_verts(Object *ob, int select)
if(dvert && dvert->totweight){
for(i=0; i<dvert->totweight; i++){
if(dvert->dw[i].def_nr == (ob->actdef-1)){
- if(select) eve->f |= SELECT;
- else eve->f &= ~SELECT;
-
+ if(!eve->h) {
+ if(select) eve->f |= SELECT;
+ else eve->f &= ~SELECT;
+ }
break;
}
}
@@ -596,7 +616,7 @@ static void vgroup_select_verts(Object *ob, int select)
static void vgroup_duplicate(Object *ob)
{
bDeformGroup *dg, *cdg;
- char name[32], s[32];
+ char name[sizeof(dg->name)];
MDeformWeight *org, *cpy;
MDeformVert *dvert, **dvert_array=NULL;
int i, idg, icdg, dvert_tot=0;
@@ -605,26 +625,17 @@ static void vgroup_duplicate(Object *ob)
if(!dg)
return;
- if(strstr(dg->name, "_copy")) {
- BLI_strncpy(name, dg->name, 32); /* will be renamed _copy.001... etc */
+ if(!strstr(dg->name, "_copy")) {
+ BLI_snprintf(name, sizeof(name), "%s_copy", dg->name);
}
else {
- BLI_snprintf(name, 32, "%s_copy", dg->name);
- while(defgroup_find_name(ob, name)) {
- if((strlen(name) + 6) > 32) {
- if (G.f & G_DEBUG)
- printf("Internal error: the name for the new vertex group is > 32 characters");
- return;
- }
- strcpy(s, name);
- BLI_snprintf(name, 32, "%s_copy", s);
- }
- }
+ BLI_snprintf(name, sizeof(name), "%s", dg->name);
+ }
cdg = defgroup_duplicate(dg);
strcpy(cdg->name, name);
defgroup_unique_name(cdg, ob);
-
+
BLI_addtail(&ob->defbase, cdg);
idg = (ob->actdef-1);
@@ -1102,62 +1113,54 @@ static void vgroup_delete_update_users(Object *ob, int id)
}
-static void vgroup_delete_object_mode(Object *ob)
+static void vgroup_delete_object_mode(Object *ob, bDeformGroup *dg)
{
- bDeformGroup *dg;
- MDeformVert *dvert, *dvert_array=NULL;
+ MDeformVert *dvert_array=NULL;
int i, e, dvert_tot=0;
-
- dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
- if(!dg)
- return;
+ const int dg_index= BLI_findindex(&ob->defbase, dg);
+
+ assert(dg_index > -1);
ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot);
if(dvert_array) {
- for(i = 0; i < dvert_tot; i++) {
- dvert = dvert_array + i;
- if(dvert) {
- if(defvert_find_index(dvert, (ob->actdef-1)))
- ED_vgroup_vert_remove(ob, dg, i);
- }
+ MDeformVert *dvert;
+ for(i= 0, dvert= dvert_array; i < dvert_tot; i++, dvert++) {
+ ED_vgroup_vert_remove(ob, dg, i); /* ok if the dg isnt in this dvert, will continue silently */
}
- for(i = 0; i < dvert_tot; i++) {
- dvert = dvert_array+i;
- if(dvert) {
- for(e = 0; e < dvert->totweight; e++) {
- if(dvert->dw[e].def_nr > (ob->actdef-1))
- dvert->dw[e].def_nr--;
+ for(i= 0, dvert= dvert_array; i < dvert_tot; i++, dvert++) {
+ for(e = 0; e < dvert->totweight; e++) {
+ if(dvert->dw[e].def_nr > dg_index) {
+ dvert->dw[e].def_nr--;
}
}
}
}
- vgroup_delete_update_users(ob, ob->actdef);
+ vgroup_delete_update_users(ob, dg_index + 1);
- /* Update the active deform index if necessary */
- if(ob->actdef == BLI_countlist(&ob->defbase))
- ob->actdef--;
-
/* Remove the group */
BLI_freelinkN(&ob->defbase, dg);
+
+ /* Update the active deform index if necessary */
+ if(ob->actdef > dg_index)
+ ob->actdef--;
+ if(ob->actdef < 1 && ob->defbase.first)
+ ob->actdef= 1;
+
}
/* only in editmode */
/* removes from active defgroup, if allverts==0 only selected vertices */
-static void vgroup_active_remove_verts(Object *ob, int allverts)
+static void vgroup_active_remove_verts(Object *ob, const int allverts, bDeformGroup *dg)
{
EditVert *eve;
MDeformVert *dvert;
MDeformWeight *newdw;
- bDeformGroup *dg, *eg;
+ bDeformGroup *eg;
int i;
- dg=BLI_findlink(&ob->defbase, ob->actdef-1);
- if(!dg)
- return;
-
if(ob->type == OB_MESH) {
Mesh *me= ob->data;
EditMesh *em = BKE_mesh_get_editmesh(me);
@@ -1207,20 +1210,15 @@ static void vgroup_active_remove_verts(Object *ob, int allverts)
}
}
-static void vgroup_delete_edit_mode(Object *ob)
+static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *dg)
{
- bDeformGroup *defgroup;
int i;
+ const int dg_index= BLI_findindex(&ob->defbase, dg);
- if(!ob->actdef)
- return;
-
- defgroup = BLI_findlink(&ob->defbase, ob->actdef-1);
- if(!defgroup)
- return;
+ assert(dg_index > -1);
/* Make sure that no verts are using this group */
- vgroup_active_remove_verts(ob, 1);
+ vgroup_active_remove_verts(ob, TRUE, dg);
/* Make sure that any verts with higher indices are adjusted accordingly */
if(ob->type==OB_MESH) {
@@ -1234,7 +1232,7 @@ static void vgroup_delete_edit_mode(Object *ob)
if(dvert)
for(i=0; i<dvert->totweight; i++)
- if(dvert->dw[i].def_nr > (ob->actdef-1))
+ if(dvert->dw[i].def_nr > dg_index)
dvert->dw[i].def_nr--;
}
BKE_mesh_end_editmesh(me, em);
@@ -1249,24 +1247,26 @@ static void vgroup_delete_edit_mode(Object *ob)
tot= lt->pntsu*lt->pntsv*lt->pntsw;
for(a=0, bp= lt->def; a<tot; a++, bp++, dvert++) {
for(i=0; i<dvert->totweight; i++){
- if(dvert->dw[i].def_nr > (ob->actdef-1))
+ if(dvert->dw[i].def_nr > dg_index)
dvert->dw[i].def_nr--;
}
}
}
}
- vgroup_delete_update_users(ob, ob->actdef);
+ vgroup_delete_update_users(ob, dg_index + 1);
+
+ /* Remove the group */
+ BLI_freelinkN (&ob->defbase, dg);
/* Update the active deform index if necessary */
- if(ob->actdef==BLI_countlist(&ob->defbase))
+ if(ob->actdef > dg_index)
ob->actdef--;
-
- /* Remove the group */
- BLI_freelinkN (&ob->defbase, defgroup);
-
+ if(ob->actdef < 1 && ob->defbase.first)
+ ob->actdef= 1;
+
/* remove all dverts */
- if(ob->actdef==0) {
+ if(ob->defbase.first == NULL) {
if(ob->type==OB_MESH) {
Mesh *me= ob->data;
CustomData_free_layer_active(&me->vdata, CD_MDEFORMVERT, me->totvert);
@@ -1294,10 +1294,14 @@ static int vgroup_object_in_edit_mode(Object *ob)
static void vgroup_delete(Object *ob)
{
+ bDeformGroup *dg = BLI_findlink(&ob->defbase, ob->actdef-1);
+ if(!dg)
+ return;
+
if(vgroup_object_in_edit_mode(ob))
- vgroup_delete_edit_mode(ob);
+ vgroup_delete_edit_mode(ob, dg);
else
- vgroup_delete_object_mode(ob);
+ vgroup_delete_object_mode(ob, dg);
}
static void vgroup_delete_all(Object *ob)
@@ -1348,7 +1352,6 @@ static void vgroup_assign_verts(Object *ob, float weight)
dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
if(dvert && (eve->f & SELECT)){
- done=0;
/* See if this vert already has a reference to this group */
/* If so: Change its weight */
done=0;
@@ -1400,22 +1403,14 @@ static void vgroup_assign_verts(Object *ob, float weight)
/* removes from all defgroup, if allverts==0 only selected vertices */
static void vgroup_remove_verts(Object *ob, int allverts)
{
- int actdef, defCount;
-
- actdef= ob->actdef;
- defCount= BLI_countlist(&ob->defbase);
-
- if(defCount == 0)
- return;
-
/* To prevent code redundancy, we just use vgroup_active_remove_verts, but that
* only operates on the active vgroup. So we iterate through all groups, by changing
* active group index
*/
- for(ob->actdef= 1; ob->actdef <= defCount; ob->actdef++)
- vgroup_active_remove_verts(ob, allverts);
-
- ob->actdef= actdef;
+ bDeformGroup *dg;
+ for(dg= ob->defbase.first; dg; dg= dg->next) {
+ vgroup_active_remove_verts(ob, allverts, dg);
+ }
}
/********************** vertex group operators *********************/
@@ -1438,12 +1433,12 @@ static int vertex_group_poll_edit(bContext *C)
return vgroup_object_in_edit_mode(ob);
}
-static int vertex_group_add_exec(bContext *C, wmOperator *op)
+static int vertex_group_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
ED_vgroup_add(ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
@@ -1473,7 +1468,7 @@ static int vertex_group_remove_exec(bContext *C, wmOperator *op)
else
vgroup_delete(ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
@@ -1506,7 +1501,7 @@ static int vertex_group_assign_exec(bContext *C, wmOperator *op)
ED_vgroup_add(ob);
vgroup_assign_verts(ob, ts->vgroup_weight);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
return OPERATOR_FINISHED;
@@ -1535,10 +1530,17 @@ static int vertex_group_remove_from_exec(bContext *C, wmOperator *op)
if(RNA_boolean_get(op->ptr, "all"))
vgroup_remove_verts(ob, 0);
- else
- vgroup_active_remove_verts(ob, 0);
+ else {
+ bDeformGroup *dg= BLI_findlink(&ob->defbase, ob->actdef - 1);
+
+ if(dg == NULL) {
+ return OPERATOR_CANCELLED;
+ }
+
+ vgroup_active_remove_verts(ob, FALSE, dg);
+ }
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
return OPERATOR_FINISHED;
@@ -1561,7 +1563,7 @@ void OBJECT_OT_vertex_group_remove_from(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "all", 0, "All", "Remove from all vertex groups.");
}
-static int vertex_group_select_exec(bContext *C, wmOperator *op)
+static int vertex_group_select_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_edit_object(C);
@@ -1588,7 +1590,7 @@ void OBJECT_OT_vertex_group_select(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int vertex_group_deselect_exec(bContext *C, wmOperator *op)
+static int vertex_group_deselect_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_edit_object(C);
@@ -1612,12 +1614,12 @@ void OBJECT_OT_vertex_group_deselect(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int vertex_group_copy_exec(bContext *C, wmOperator *op)
+static int vertex_group_copy_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
vgroup_duplicate(ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -1647,7 +1649,7 @@ static int vertex_group_levels_exec(bContext *C, wmOperator *op)
vgroup_levels(ob, offset, gain);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -1671,13 +1673,13 @@ void OBJECT_OT_vertex_group_levels(wmOperatorType *ot)
RNA_def_float(ot->srna, "gain", 1.f, 0.f, FLT_MAX, "Gain", "Value to multiply weights by.", 0.0f, 10.f);
}
-static int vertex_group_normalize_exec(bContext *C, wmOperator *op)
+static int vertex_group_normalize_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
vgroup_normalize(ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -1705,7 +1707,7 @@ static int vertex_group_normalize_all_exec(bContext *C, wmOperator *op)
vgroup_normalize_all(ob, lock_active);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -1735,7 +1737,7 @@ static int vertex_group_invert_exec(bContext *C, wmOperator *op)
int auto_remove= RNA_boolean_get(op->ptr,"auto_remove");
vgroup_invert(ob, auto_assign, auto_remove);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -1760,13 +1762,13 @@ void OBJECT_OT_vertex_group_invert(wmOperatorType *ot)
}
-static int vertex_group_blend_exec(bContext *C, wmOperator *op)
+static int vertex_group_blend_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
vgroup_blend(ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -1800,7 +1802,7 @@ static int vertex_group_clean_exec(bContext *C, wmOperator *op)
if(all_groups) vgroup_clean_all(ob, limit, keep_single);
else vgroup_clean(ob, limit, keep_single);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -1833,7 +1835,7 @@ static int vertex_group_mirror_exec(bContext *C, wmOperator *op)
ED_vgroup_mirror(ob, RNA_boolean_get(op->ptr,"mirror_weights"), RNA_boolean_get(op->ptr,"flip_group_names"));
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -1845,7 +1847,7 @@ void OBJECT_OT_vertex_group_mirror(wmOperatorType *ot)
/* identifiers */
ot->name= "Mirror Vertex Group";
ot->idname= "OBJECT_OT_vertex_group_mirror";
- ot->description= "Mirror weights, and flip vertex group names, copying when only one side is selected";
+ ot->description= "Mirror all vertex groups, flip weights and/or names, editing only selected vertices, flipping when both sides are selected otherwise copy from unselected";
/* api callbacks */
ot->poll= vertex_group_poll_edit;
@@ -1856,11 +1858,11 @@ void OBJECT_OT_vertex_group_mirror(wmOperatorType *ot)
/* properties */
RNA_def_boolean(ot->srna, "mirror_weights", TRUE, "Mirror Weights", "Mirror weights.");
- RNA_def_boolean(ot->srna, "flip_group_names", TRUE, "Flip Groups", "Flip vertex group names while mirroring.");
+ RNA_def_boolean(ot->srna, "flip_group_names", TRUE, "Flip Groups", "Flip vertex group names.");
}
-static int vertex_group_copy_to_linked_exec(bContext *C, wmOperator *op)
+static int vertex_group_copy_to_linked_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
@@ -1874,7 +1876,7 @@ static int vertex_group_copy_to_linked_exec(bContext *C, wmOperator *op)
BLI_duplicatelist(&base->object->defbase, &ob->defbase);
base->object->actdef= ob->actdef;
- DAG_id_flush_update(&base->object->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&base->object->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, base->object);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, base->object->data);
@@ -1901,7 +1903,7 @@ void OBJECT_OT_vertex_group_copy_to_linked(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int vertex_group_copy_to_selected_exec(bContext *C, wmOperator *op)
+static int vertex_group_copy_to_selected_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obact= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
@@ -1921,7 +1923,7 @@ void OBJECT_OT_vertex_group_copy_to_selected(wmOperatorType *ot)
/* identifiers */
ot->name= "Copy Vertex Group to Selected";
ot->idname= "OBJECT_OT_vertex_group_copy_to_selected";
- ot->description= "Copy Vertex Groups to other selected objects with matching indicies";
+ ot->description= "Copy Vertex Groups to other selected objects with matching indices";
/* api callbacks */
ot->poll= vertex_group_poll;
@@ -1941,13 +1943,13 @@ static int set_active_group_exec(bContext *C, wmOperator *op)
ob->actdef= nr+1;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob);
return OPERATOR_FINISHED;
}
-static EnumPropertyItem *vgroup_itemf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *vgroup_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
EnumPropertyItem tmp = {0, "", 0, "", ""};
@@ -2097,7 +2099,7 @@ static int vertex_group_sort_exec(bContext *C, wmOperator *op)
ret = vgroup_do_remap(ob, name_array, op);
if (ret != OPERATOR_CANCELLED) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob);
}
@@ -2151,7 +2153,7 @@ static int vgroup_move_exec(bContext *C, wmOperator *op)
if (name_array) MEM_freeN(name_array);
if (ret != OPERATOR_CANCELLED) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob);
}
diff --git a/source/blender/editors/physics/CMakeLists.txt b/source/blender/editors/physics/CMakeLists.txt
index 49f20bb9ed0..76419dbb505 100644
--- a/source/blender/editors/physics/CMakeLists.txt
+++ b/source/blender/editors/physics/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -32,16 +30,23 @@ SET(INC
../../../../intern/guardedalloc
)
-IF(NOT WITH_FLUID)
- ADD_DEFINITIONS(-DDISABLE_ELBEEM)
-ENDIF(NOT WITH_FLUID)
+set(SRC
+ particle_boids.c
+ particle_edit.c
+ particle_object.c
+ physics_fluid.c
+ physics_ops.c
+ physics_pointcache.c
+
+ physics_intern.h
+)
-IF(WITH_OPENMP)
- ADD_DEFINITIONS(-DPARALLEL=1)
-ENDIF(WITH_OPENMP)
+if(NOT WITH_MOD_FLUID)
+ add_definitions(-DDISABLE_ELBEEM)
+endif()
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_OPENMP)
+ add_definitions(-DPARALLEL=1)
+endif()
-BLENDERLIB(bf_editor_physics "${SRC}" "${INC}")
+blender_add_lib(bf_editor_physics "${SRC}" "${INC}")
diff --git a/source/blender/editors/physics/Makefile b/source/blender/editors/physics/Makefile
deleted file mode 100644
index 9ffc3a5b372..00000000000
--- a/source/blender/editors/physics/Makefile
+++ /dev/null
@@ -1,62 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_physics
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
-
-ifeq ($(OS), darwin)
- ifeq ($(WITH_BF_OPENMP), true)
- CPPFLAGS += -DPARALLEL=1
- endif
-endif
diff --git a/source/blender/editors/physics/particle_boids.c b/source/blender/editors/physics/particle_boids.c
index a18890881a8..90e387a79c2 100644
--- a/source/blender/editors/physics/particle_boids.c
+++ b/source/blender/editors/physics/particle_boids.c
@@ -32,13 +32,15 @@
#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+
#include "BKE_boids.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_main.h"
#include "BKE_particle.h"
-#include "BLI_listbase.h"
#include "RNA_access.h"
#include "RNA_enum_types.h"
#include "RNA_define.h"
@@ -76,7 +78,7 @@ static int rule_add_exec(bContext *C, wmOperator *op)
BLI_addtail(&state->rules, rule);
- DAG_id_flush_update(&part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update(&part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
return OPERATOR_FINISHED;
@@ -98,7 +100,7 @@ void BOID_OT_rule_add(wmOperatorType *ot)
ot->prop= RNA_def_enum(ot->srna, "type", boidrule_type_items, 0, "Type", "");
}
-static int rule_del_exec(bContext *C, wmOperator *op)
+static int rule_del_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
@@ -128,7 +130,7 @@ static int rule_del_exec(bContext *C, wmOperator *op)
rule->flag |= BOIDRULE_CURRENT;
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
@@ -149,7 +151,7 @@ void BOID_OT_rule_del(wmOperatorType *ot)
}
/************************ move up/down boid rule operators *********************/
-static int rule_move_up_exec(bContext *C, wmOperator *op)
+static int rule_move_up_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -166,7 +168,7 @@ static int rule_move_up_exec(bContext *C, wmOperator *op)
BLI_remlink(&state->rules, rule);
BLI_insertlink(&state->rules, rule->prev->prev, rule);
- DAG_id_flush_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
break;
}
@@ -187,7 +189,7 @@ void BOID_OT_rule_move_up(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int rule_move_down_exec(bContext *C, wmOperator *op)
+static int rule_move_down_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -204,7 +206,7 @@ static int rule_move_down_exec(bContext *C, wmOperator *op)
BLI_remlink(&state->rules, rule);
BLI_insertlink(&state->rules, rule->next, rule);
- DAG_id_flush_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
break;
}
@@ -227,7 +229,7 @@ void BOID_OT_rule_move_down(wmOperatorType *ot)
/************************ add/del boid state operators *********************/
-static int state_add_exec(bContext *C, wmOperator *op)
+static int state_add_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -266,7 +268,7 @@ void BOID_OT_state_add(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int state_del_exec(bContext *C, wmOperator *op)
+static int state_del_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
@@ -301,7 +303,7 @@ static int state_del_exec(bContext *C, wmOperator *op)
state->flag |= BOIDSTATE_CURRENT;
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
@@ -322,7 +324,7 @@ void BOID_OT_state_del(wmOperatorType *ot)
}
/************************ move up/down boid state operators *********************/
-static int state_move_up_exec(bContext *C, wmOperator *op)
+static int state_move_up_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -359,7 +361,7 @@ void BOID_OT_state_move_up(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int state_move_down_exec(bContext *C, wmOperator *op)
+static int state_move_down_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -375,7 +377,7 @@ static int state_move_down_exec(bContext *C, wmOperator *op)
if(state->flag & BOIDSTATE_CURRENT && state->next) {
BLI_remlink(&boids->states, state);
BLI_insertlink(&boids->states, state->next, state);
- DAG_id_flush_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
break;
}
}
diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c
index 132533fc123..5cf6864cdc8 100644
--- a/source/blender/editors/physics/particle_edit.c
+++ b/source/blender/editors/physics/particle_edit.c
@@ -30,6 +30,7 @@
#include <stdlib.h>
#include <math.h>
#include <string.h>
+#include <assert.h>
#include "MEM_guardedalloc.h"
@@ -40,6 +41,13 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_dynstr.h"
+#include "BLI_kdtree.h"
+#include "BLI_rand.h"
+#include "BLI_utildefines.h"
+
#include "BKE_DerivedMesh.h"
#include "BKE_depsgraph.h"
@@ -51,15 +59,8 @@
#include "BKE_particle.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
-#include "BKE_pointcache.h"
-
-#include "BLI_math.h"
-#include "BLI_blenlib.h"
-#include "BLI_dynstr.h"
-#include "BLI_kdtree.h"
-#include "BLI_rand.h"
+#include "BKE_pointcache.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -369,8 +370,18 @@ static void PE_set_view3d_data(bContext *C, PEData *data)
/* note, the object argument means the modelview matrix does not account for the objects matrix, use viewmat rather then (obmat * viewmat) */
view3d_get_transformation(data->vc.ar, data->vc.rv3d, NULL, &data->mats);
- if((data->vc.v3d->drawtype>OB_WIRE) && (data->vc.v3d->flag & V3D_ZBUF_SELECT))
- view3d_validate_backbuf(&data->vc);
+ if((data->vc.v3d->drawtype>OB_WIRE) && (data->vc.v3d->flag & V3D_ZBUF_SELECT)) {
+ if(data->vc.v3d->flag & V3D_INVALID_BACKBUF) {
+ /* needed or else the draw matrix can be incorrect */
+ view3d_operator_needs_opengl(C);
+
+ view3d_validate_backbuf(&data->vc);
+ /* we may need to force an update here by setting the rv3d as dirty
+ * for now it seems ok, but take care!:
+ * rv3d->depths->dirty = 1; */
+ view3d_update_depths(data->vc.ar);
+ }
+ }
}
/*************************** selection utilities *******************************/
@@ -397,14 +408,23 @@ static int key_test_depth(PEData *data, float co[3])
x=wco[0];
y=wco[1];
+#if 0 /* works well but too slow on some systems [#23118] */
x+= (short)data->vc.ar->winrct.xmin;
y+= (short)data->vc.ar->winrct.ymin;
/* PE_set_view3d_data calls this. no need to call here */
/* view3d_validate_backbuf(&data->vc); */
glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
+#else /* faster to use depths, these are calculated in PE_set_view3d_data */
+ {
+ ViewDepths *vd = data->vc.rv3d->depths;
+ assert(vd && vd->depths);
+ /* we know its not clipped */
+ depth= vd->depths[y * vd->w + x];
+ }
+#endif
- if((float)uz - 0.0001 > depth)
+ if((float)uz - 0.00001 > depth)
return 0;
else
return 1;
@@ -464,13 +484,10 @@ static int key_inside_test(PEData *data, float co[3])
static int point_is_selected(PTCacheEditPoint *point)
{
KEY_K;
- int sel;
if(point->flag & PEP_HIDE)
return 0;
- sel= 0;
-
LOOP_SELECTED_KEYS {
return 1;
}
@@ -573,7 +590,7 @@ static void foreach_mouse_hit_key(PEData *data, ForKeyMatFunc func, int selected
ParticleSystemModifierData *psmd = NULL;
ParticleEditSettings *pset= PE_settings(data->scene);
POINT_P; KEY_K;
- float mat[4][4], imat[4][4];
+ float mat[4][4]= MAT4_UNITY, imat[4][4]= MAT4_UNITY;
if(edit->psys)
psmd= psys_get_modifier(data->ob, edit->psys);
@@ -582,9 +599,6 @@ static void foreach_mouse_hit_key(PEData *data, ForKeyMatFunc func, int selected
if(pset->selectmode==SCE_SELECT_PATH)
selected= 0;
- unit_m4(imat);
- unit_m4(mat);
-
LOOP_VISIBLE_POINTS {
if(pset->selectmode==SCE_SELECT_END) {
/* only do end keys */
@@ -756,6 +770,9 @@ static void PE_mirror_particle(Object *ob, DerivedMesh *dm, ParticleSystem *psys
if(!mpa) {
if(!edit->mirror_cache)
PE_update_mirror_cache(ob, psys);
+
+ if(!edit->mirror_cache)
+ return; /* something went wrong! */
mi= edit->mirror_cache[i];
if(mi == -1)
@@ -774,6 +791,7 @@ static void PE_mirror_particle(Object *ob, DerivedMesh *dm, ParticleSystem *psys
if(mpoint->keys) MEM_freeN(mpoint->keys);
mpa->hair= MEM_dupallocN(pa->hair);
+ mpa->totkey= pa->totkey;
mpoint->keys= MEM_dupallocN(point->keys);
mpoint->totkey= point->totkey;
@@ -782,7 +800,7 @@ static void PE_mirror_particle(Object *ob, DerivedMesh *dm, ParticleSystem *psys
for(k=0; k<mpa->totkey; k++, mkey++, mhkey++) {
mkey->co= mhkey->co;
mkey->time= &mhkey->time;
- mkey->flag &= PEK_SELECT;
+ mkey->flag &= ~PEK_SELECT;
}
}
@@ -829,6 +847,9 @@ static void PE_apply_mirror(Object *ob, ParticleSystem *psys)
if(!edit->mirror_cache)
PE_update_mirror_cache(ob, psys);
+ if(!edit->mirror_cache)
+ return; /* something went wrong */
+
/* we delay settings the PARS_EDIT_RECALC for mirrored particles
* to avoid doing mirror twice */
LOOP_POINTS {
@@ -1018,10 +1039,8 @@ static void recalc_emitter_field(Object *ob, ParticleSystem *psys)
{
DerivedMesh *dm=psys_get_modifier(ob,psys)->dm;
PTCacheEdit *edit= psys->edit;
- MFace *mface;
- MVert *mvert;
float *vec, *nor;
- int i, totface, totvert;
+ int i, totface /*, totvert*/;
if(!dm)
return;
@@ -1032,7 +1051,7 @@ static void recalc_emitter_field(Object *ob, ParticleSystem *psys)
BLI_kdtree_free(edit->emitter_field);
totface=dm->getNumFaces(dm);
- totvert=dm->getNumVerts(dm);
+ /*totvert=dm->getNumVerts(dm);*/ /*UNSUED*/
edit->emitter_cosnos=MEM_callocN(totface*6*sizeof(float),"emitter cosnos");
@@ -1041,9 +1060,9 @@ static void recalc_emitter_field(Object *ob, ParticleSystem *psys)
vec=edit->emitter_cosnos;
nor=vec+3;
- mvert=dm->getVertDataArray(dm,CD_MVERT);
for(i=0; i<totface; i++, vec+=6, nor+=6) {
- mface=dm->getFaceData(dm,i,CD_MFACE);
+ MFace *mface=dm->getFaceData(dm,i,CD_MFACE);
+ MVert *mvert;
mvert=dm->getVertData(dm,mface->v1,CD_MVERT);
VECCOPY(vec,mvert->co);
@@ -1125,7 +1144,7 @@ static void update_world_cos(Object *ob, PTCacheEdit *edit)
}
}
}
-static void update_velocities(Object *ob, PTCacheEdit *edit)
+static void update_velocities(PTCacheEdit *edit)
{
/*TODO: get frs_sec properly */
float vec1[3], vec2[3], frs_sec, dfra;
@@ -1208,7 +1227,7 @@ void PE_update_object(Scene *scene, Object *ob, int useflag)
if(edit->psys)
update_world_cos(ob, edit);
if(pset->flag & PE_AUTO_VELOCITY)
- update_velocities(ob, edit);
+ update_velocities(edit);
PE_hide_keys_time(scene, edit, CFRA);
/* regenerate path caches */
@@ -1243,7 +1262,7 @@ static void select_key(PEData *data, int point_index, int key_index)
point->flag |= PEP_EDIT_RECALC;
}
-static void select_keys(PEData *data, int point_index, int key_index)
+static void select_keys(PEData *data, int point_index, int UNUSED(key_index))
{
PTCacheEdit *edit = data->edit;
PTCacheEditPoint *point = edit->points + point_index;
@@ -1387,7 +1406,7 @@ static void select_root(PEData *data, int point_index)
data->edit->points[point_index].flag |= PEP_EDIT_RECALC; /* redraw selection only */
}
-static int select_roots_exec(bContext *C, wmOperator *op)
+static int select_roots_exec(bContext *C, wmOperator *UNUSED(op))
{
PEData data;
@@ -1427,7 +1446,7 @@ static void select_tip(PEData *data, int point_index)
point->flag |= PEP_EDIT_RECALC; /* redraw selection only */
}
-static int select_tips_exec(bContext *C, wmOperator *op)
+static int select_tips_exec(bContext *C, wmOperator *UNUSED(op))
{
PEData data;
@@ -1466,8 +1485,6 @@ static int select_linked_exec(bContext *C, wmOperator *op)
mval[0]= location[0];
mval[1]= location[1];
- view3d_operator_needs_opengl(C);
-
PE_set_view3d_data(C, &data);
data.mval= mval;
data.rad=75.0f;
@@ -1512,6 +1529,17 @@ void PARTICLE_OT_select_linked(wmOperatorType *ot)
}
/************************ border select operator ************************/
+void PE_deselect_all_visible(PTCacheEdit *edit)
+{
+ POINT_P; KEY_K;
+
+ LOOP_VISIBLE_POINTS {
+ LOOP_SELECTED_KEYS {
+ key->flag &= ~PEK_SELECT;
+ point->flag |= PEP_EDIT_RECALC;
+ }
+ }
+}
int PE_border_select(bContext *C, rcti *rect, int select, int extend)
{
@@ -1523,16 +1551,8 @@ int PE_border_select(bContext *C, rcti *rect, int select, int extend)
if(!PE_start_edit(edit))
return OPERATOR_CANCELLED;
- if (extend == 0 && select) {
- POINT_P; KEY_K;
-
- LOOP_VISIBLE_POINTS {
- LOOP_SELECTED_KEYS {
- key->flag &= ~PEK_SELECT;
- point->flag |= PEP_EDIT_RECALC;
- }
- }
- }
+ if (extend == 0 && select)
+ PE_deselect_all_visible(edit);
PE_set_view3d_data(C, &data);
data.rect= rect;
@@ -1573,7 +1593,7 @@ int PE_circle_select(bContext *C, int selecting, short *mval, float rad)
/************************ lasso select operator ************************/
-int PE_lasso_select(bContext *C, short mcords[][2], short moves, short select)
+int PE_lasso_select(bContext *C, short mcords[][2], short moves, short extend, short select)
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
@@ -1583,13 +1603,19 @@ int PE_lasso_select(bContext *C, short mcords[][2], short moves, short select)
ParticleSystem *psys = edit->psys;
ParticleSystemModifierData *psmd = psys_get_modifier(ob, psys);
POINT_P; KEY_K;
- float co[3], mat[4][4];
+ float co[3], mat[4][4]= MAT4_UNITY;
short vertco[2];
+ PEData data;
+
if(!PE_start_edit(edit))
return OPERATOR_CANCELLED;
- unit_m4(mat);
+ if (extend == 0 && select)
+ PE_deselect_all_visible(edit);
+
+ /* only for depths */
+ PE_set_view3d_data(C, &data);
LOOP_VISIBLE_POINTS {
if(edit->psys && !(psys->flag & PSYS_GLOBAL_HAIR))
@@ -1600,7 +1626,7 @@ int PE_lasso_select(bContext *C, short mcords[][2], short moves, short select)
VECCOPY(co, key->co);
mul_m4_v3(mat, co);
project_short(ar, co, vertco);
- if((vertco[0] != IS_CLIPPED) && lasso_inside(mcords,moves,vertco[0],vertco[1])) {
+ if((vertco[0] != IS_CLIPPED) && lasso_inside(mcords,moves,vertco[0],vertco[1]) && key_test_depth(&data, co)) {
if(select && !(key->flag & PEK_SELECT)) {
key->flag |= PEK_SELECT;
point->flag |= PEP_EDIT_RECALC;
@@ -1618,7 +1644,7 @@ int PE_lasso_select(bContext *C, short mcords[][2], short moves, short select)
VECCOPY(co, key->co);
mul_m4_v3(mat, co);
project_short(ar, co,vertco);
- if((vertco[0] != IS_CLIPPED) && lasso_inside(mcords,moves,vertco[0],vertco[1])) {
+ if((vertco[0] != IS_CLIPPED) && lasso_inside(mcords,moves,vertco[0],vertco[1]) && key_test_depth(&data, co)) {
if(select && !(key->flag & PEK_SELECT)) {
key->flag |= PEK_SELECT;
point->flag |= PEP_EDIT_RECALC;
@@ -1690,7 +1716,7 @@ void PARTICLE_OT_hide(wmOperatorType *ot)
/*************************** reveal operator **************************/
-static int reveal_exec(bContext *C, wmOperator *op)
+static int reveal_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_active_object(C);
Scene *scene= CTX_data_scene(C);
@@ -1758,7 +1784,7 @@ static void select_less_keys(PEData *data, int point_index)
}
}
-static int select_less_exec(bContext *C, wmOperator *op)
+static int select_less_exec(bContext *C, wmOperator *UNUSED(op))
{
PEData data;
@@ -1819,7 +1845,7 @@ static void select_more_keys(PEData *data, int point_index)
}
}
-static int select_more_exec(bContext *C, wmOperator *op)
+static int select_more_exec(bContext *C, wmOperator *UNUSED(op))
{
PEData data;
@@ -1846,7 +1872,7 @@ void PARTICLE_OT_select_more(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int select_inverse_exec(bContext *C, wmOperator *op)
+static int select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
PEData data;
PTCacheEdit *edit;
@@ -1889,7 +1915,7 @@ static void rekey_particle(PEData *data, int pa_index)
{
PTCacheEdit *edit= data->edit;
ParticleSystem *psys= edit->psys;
- ParticleSimulationData sim = {data->scene, data->ob, edit->psys, NULL};
+ ParticleSimulationData sim= {0};
ParticleData *pa= psys->particles + pa_index;
PTCacheEditPoint *point = edit->points + pa_index;
ParticleKey state;
@@ -1898,6 +1924,10 @@ static void rekey_particle(PEData *data, int pa_index)
float dval, sta, end;
int k;
+ sim.scene= data->scene;
+ sim.ob= data->ob;
+ sim.psys= edit->psys;
+
pa->flag |= PARS_REKEY;
key= new_keys= MEM_callocN(data->totrekey * sizeof(HairKey),"Hair re-key keys");
@@ -1982,7 +2012,7 @@ static void rekey_particle_to_time(Scene *scene, Object *ob, int pa_index, float
{
PTCacheEdit *edit= PE_get_current(scene, ob);
ParticleSystem *psys;
- ParticleSimulationData sim = {scene, ob, edit ? edit->psys : NULL, NULL};
+ ParticleSimulationData sim= {0};
ParticleData *pa;
ParticleKey state;
HairKey *new_keys, *key;
@@ -1993,6 +2023,10 @@ static void rekey_particle_to_time(Scene *scene, Object *ob, int pa_index, float
psys = edit->psys;
+ sim.scene= scene;
+ sim.ob= ob;
+ sim.psys= psys;
+
pa= psys->particles + pa_index;
pa->flag |= PARS_REKEY;
@@ -2022,19 +2056,18 @@ static void rekey_particle_to_time(Scene *scene, Object *ob, int pa_index, float
/************************* utilities **************************/
-static int remove_tagged_particles(Scene *scene, Object *ob, ParticleSystem *psys, int mirror)
+static int remove_tagged_particles(Object *ob, ParticleSystem *psys, int mirror)
{
PTCacheEdit *edit = psys->edit;
ParticleData *pa, *npa=0, *new_pars=0;
POINT_P;
PTCacheEditPoint *npoint=0, *new_points=0;
ParticleSystemModifierData *psmd;
- int i, totpart, new_totpart= psys->totpart, removed= 0;
+ int i, new_totpart= psys->totpart, removed= 0;
if(mirror) {
/* mirror tags */
psmd= psys_get_modifier(ob, psys);
- totpart= psys->totpart;
LOOP_TAGGED_POINTS {
PE_mirror_particle(ob, psmd->dm, psys, psys->particles + p, NULL);
@@ -2050,6 +2083,15 @@ static int remove_tagged_particles(Scene *scene, Object *ob, ParticleSystem *psy
if(new_totpart) {
npa= new_pars= MEM_callocN(new_totpart * sizeof(ParticleData), "ParticleData array");
npoint= new_points= MEM_callocN(new_totpart * sizeof(PTCacheEditPoint), "PTCacheEditKey array");
+
+ if(ELEM(NULL, new_pars, new_points)) {
+ /* allocation error! */
+ if(new_pars)
+ MEM_freeN(new_pars);
+ if(new_points)
+ MEM_freeN(new_points);
+ return 0;
+ }
}
pa= psys->particles;
@@ -2092,7 +2134,7 @@ static int remove_tagged_particles(Scene *scene, Object *ob, ParticleSystem *psy
return removed;
}
-static void remove_tagged_keys(Scene *scene, Object *ob, ParticleSystem *psys)
+static void remove_tagged_keys(Object *ob, ParticleSystem *psys)
{
PTCacheEdit *edit= psys->edit;
ParticleData *pa;
@@ -2123,7 +2165,7 @@ static void remove_tagged_keys(Scene *scene, Object *ob, ParticleSystem *psys)
if(new_totkey < 2)
point->flag |= PEP_TAG;
}
- remove_tagged_particles(scene, ob, psys, pe_x_mirror(ob));
+ remove_tagged_particles(ob, psys, pe_x_mirror(ob));
LOOP_POINTS {
pa = psys->particles + p;
@@ -2187,7 +2229,7 @@ static void subdivide_particle(PEData *data, int pa_index)
{
PTCacheEdit *edit= data->edit;
ParticleSystem *psys= edit->psys;
- ParticleSimulationData sim = {data->scene, data->ob, edit->psys, NULL};
+ ParticleSimulationData sim= {0};
ParticleData *pa= psys->particles + pa_index;
PTCacheEditPoint *point = edit->points + pa_index;
ParticleKey state;
@@ -2198,6 +2240,10 @@ static void subdivide_particle(PEData *data, int pa_index)
short totnewkey=0;
float endtime;
+ sim.scene= data->scene;
+ sim.ob= data->ob;
+ sim.psys= edit->psys;
+
for(k=0, ekey=point->keys; k<pa->totkey-1; k++,ekey++) {
if(ekey->flag&PEK_SELECT && (ekey+1)->flag&PEK_SELECT)
totnewkey++;
@@ -2260,7 +2306,7 @@ static void subdivide_particle(PEData *data, int pa_index)
pa->flag &= ~PARS_REKEY;
}
-static int subdivide_exec(bContext *C, wmOperator *op)
+static int subdivide_exec(bContext *C, wmOperator *UNUSED(op))
{
PEData data;
@@ -2347,7 +2393,7 @@ static int remove_doubles_exec(bContext *C, wmOperator *op)
BLI_kdtree_free(tree);
/* remove tagged particles - don't do mirror here! */
- remove_tagged_particles(scene, ob, psys, 0);
+ remove_tagged_particles(ob, psys, 0);
totremoved += removed;
} while(removed);
@@ -2356,7 +2402,7 @@ static int remove_doubles_exec(bContext *C, wmOperator *op)
BKE_reportf(op->reports, RPT_INFO, "Remove %d double particles.", totremoved);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob);
return OPERATOR_FINISHED;
@@ -2406,7 +2452,7 @@ static int weight_set_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob);
return OPERATOR_FINISHED;
@@ -2430,7 +2476,7 @@ void PARTICLE_OT_weight_set(wmOperatorType *ot)
/************************ cursor drawing *******************************/
-static void brush_drawcursor(bContext *C, int x, int y, void *customdata)
+static void brush_drawcursor(bContext *C, int x, int y, void *UNUSED(customdata))
{
ParticleEditSettings *pset= PE_settings(CTX_data_scene(C));
ParticleBrushData *brush;
@@ -2574,16 +2620,16 @@ static int delete_exec(bContext *C, wmOperator *op)
if(type == DEL_KEY) {
foreach_selected_key(&data, set_delete_particle_key);
- remove_tagged_keys(data.scene, data.ob, data.edit->psys);
+ remove_tagged_keys(data.ob, data.edit->psys);
recalc_lengths(data.edit);
}
else if(type == DEL_PARTICLE) {
foreach_selected_point(&data, set_delete_particle);
- remove_tagged_particles(data.scene, data.ob, data.edit->psys, pe_x_mirror(data.ob));
+ remove_tagged_particles(data.ob, data.edit->psys, pe_x_mirror(data.ob));
recalc_lengths(data.edit);
}
- DAG_id_flush_update(&data.ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&data.ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, data.ob);
return OPERATOR_FINISHED;
@@ -2734,7 +2780,7 @@ static void PE_mirror_x(Scene *scene, Object *ob, int tagged)
MEM_freeN(mirrorfaces);
}
-static int mirror_exec(bContext *C, wmOperator *op)
+static int mirror_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
@@ -2744,7 +2790,7 @@ static int mirror_exec(bContext *C, wmOperator *op)
update_world_cos(ob, edit);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -2765,7 +2811,7 @@ void PARTICLE_OT_mirror(wmOperatorType *ot)
/************************* brush edit callbacks ********************/
-static void brush_comb(PEData *data, float mat[][4], float imat[][4], int point_index, int key_index, PTCacheEditKey *key)
+static void brush_comb(PEData *data, float UNUSED(mat[][4]), float imat[][4], int point_index, int key_index, PTCacheEditKey *key)
{
ParticleEditSettings *pset= PE_settings(data->scene);
float cvec[3], fac;
@@ -3034,7 +3080,7 @@ static void brush_puff(PEData *data, int point_index)
}
-static void brush_weight(PEData *data, float mat[][4], float imat[][4], int point_index, int key_index, PTCacheEditKey *key)
+static void brush_weight(PEData *data, float UNUSED(mat[][4]), float UNUSED(imat[][4]), int point_index, int key_index, PTCacheEditKey *UNUSED(key))
{
/* roots have full weight allways */
if(key_index) {
@@ -3048,7 +3094,7 @@ static void brush_weight(PEData *data, float mat[][4], float imat[][4], int poin
}
}
-static void brush_smooth_get(PEData *data, float mat[][4], float imat[][4], int point_index, int key_index, PTCacheEditKey *key)
+static void brush_smooth_get(PEData *data, float mat[][4], float UNUSED(imat[][4]), int UNUSED(point_index), int key_index, PTCacheEditKey *key)
{
if(key_index) {
float dvec[3];
@@ -3060,7 +3106,7 @@ static void brush_smooth_get(PEData *data, float mat[][4], float imat[][4], int
}
}
-static void brush_smooth_do(PEData *data, float mat[][4], float imat[][4], int point_index, int key_index, PTCacheEditKey *key)
+static void brush_smooth_do(PEData *data, float UNUSED(mat[][4]), float imat[][4], int point_index, int key_index, PTCacheEditKey *key)
{
float vec[3], dvec[3];
@@ -3087,13 +3133,13 @@ static int brush_add(PEData *data, short number)
ParticleSystem *psys= edit->psys;
ParticleData *add_pars= MEM_callocN(number*sizeof(ParticleData),"ParticleData add");
ParticleSystemModifierData *psmd= psys_get_modifier(ob,psys);
- ParticleSimulationData sim = {scene, ob, psys, psmd};
+ ParticleSimulationData sim= {0};
ParticleEditSettings *pset= PE_settings(scene);
int i, k, n= 0, totpart= psys->totpart;
float mco[2];
short dmx= 0, dmy= 0;
float co1[3], co2[3], min_d, imat[4][4];
- float framestep, timestep= psys_get_timestep(&sim);
+ float framestep, timestep;
short size= pset->brush[PE_BRUSH_ADD].size;
short size2= size*size;
DerivedMesh *dm=0;
@@ -3103,7 +3149,14 @@ static int brush_add(PEData *data, short number)
return 0;
BLI_srandom(psys->seed+data->mval[0]+data->mval[1]);
-
+
+ sim.scene= scene;
+ sim.ob= ob;
+ sim.psys= psys;
+ sim.psmd= psmd;
+
+ timestep= psys_get_timestep(&sim);
+
/* painting onto the deformed mesh, could be an option? */
if(psmd->dm->deformedOnly)
dm= psmd->dm;
@@ -3200,18 +3253,17 @@ static int brush_add(PEData *data, short number)
framestep= pa->lifetime/(float)(pset->totaddkey-1);
if(tree) {
- HairKey *hkey;
- ParticleKey key[3];
+ ParticleData *ppa;
+ HairKey *thkey;
+ ParticleKey key3[3];
KDTreeNearest ptn[3];
int w, maxw;
- float maxd, mind, dd, totw=0.0, weight[3];
+ float maxd, totw=0.0, weight[3];
psys_particle_on_dm(psmd->dm,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co1,0,0,0,0,0);
maxw= BLI_kdtree_find_n_nearest(tree,3,co1,NULL,ptn);
maxd= ptn[maxw-1].dist;
- mind= ptn[0].dist;
- dd= maxd - mind;
for(w=0; w<maxw; w++) {
weight[w]= (float)pow(2.0, (double)(-6.0f * ptn[w].dist / maxd));
@@ -3224,40 +3276,46 @@ static int brush_add(PEData *data, short number)
for(w=0; w<maxw; w++)
weight[w] /= totw;
+ ppa= psys->particles+ptn[0].index;
+
for(k=0; k<pset->totaddkey; k++) {
- hkey= (HairKey*)pa->hair + k;
- hkey->time= pa->time + k * framestep;
+ thkey= (HairKey*)pa->hair + k;
+ thkey->time= pa->time + k * framestep;
- key[0].time= hkey->time/ 100.0f;
- psys_get_particle_on_path(&sim, ptn[0].index, key, 0);
- mul_v3_fl(key[0].co, weight[0]);
+ key3[0].time= thkey->time/ 100.0f;
+ psys_get_particle_on_path(&sim, ptn[0].index, key3, 0);
+ mul_v3_fl(key3[0].co, weight[0]);
+
+ /* TODO: interpolatint the weight would be nicer */
+ thkey->weight= (ppa->hair+MIN2(k, ppa->totkey-1))->weight;
if(maxw>1) {
- key[1].time= key[0].time;
- psys_get_particle_on_path(&sim, ptn[1].index, key + 1, 0);
- mul_v3_fl(key[1].co, weight[1]);
- VECADD(key[0].co, key[0].co, key[1].co);
+ key3[1].time= key3[0].time;
+ psys_get_particle_on_path(&sim, ptn[1].index, &key3[1], 0);
+ mul_v3_fl(key3[1].co, weight[1]);
+ VECADD(key3[0].co, key3[0].co, key3[1].co);
if(maxw>2) {
- key[2].time= key[0].time;
- psys_get_particle_on_path(&sim, ptn[2].index, key + 2, 0);
- mul_v3_fl(key[2].co, weight[2]);
- VECADD(key[0].co, key[0].co, key[2].co);
+ key3[2].time= key3[0].time;
+ psys_get_particle_on_path(&sim, ptn[2].index, &key3[2], 0);
+ mul_v3_fl(key3[2].co, weight[2]);
+ VECADD(key3[0].co, key3[0].co, key3[2].co);
}
}
if(k==0)
- VECSUB(co1, pa->state.co, key[0].co);
+ VECSUB(co1, pa->state.co, key3[0].co);
- VECADD(hkey->co, key[0].co, co1);
+ VECADD(thkey->co, key3[0].co, co1);
- hkey->time= key[0].time;
+ thkey->time= key3[0].time;
}
}
else {
for(k=0, hkey=pa->hair; k<pset->totaddkey; k++, hkey++) {
VECADDFAC(hkey->co, pa->state.co, pa->state.vel, k * framestep * timestep);
hkey->time += k * framestep;
+ hkey->weight = 1.f - (float)k/(float)(pset->totaddkey-1);
}
}
for(k=0, hkey=pa->hair; k<pset->totaddkey; k++, hkey++) {
@@ -3288,6 +3346,9 @@ typedef struct BrushEdit {
int first;
int lastmouse[2];
+
+ /* optional cached view settings to avoid setting on every mousemove */
+ PEData data;
} BrushEdit;
static int brush_edit_init(bContext *C, wmOperator *op)
@@ -3312,6 +3373,9 @@ static int brush_edit_init(bContext *C, wmOperator *op)
bedit->ob= ob;
bedit->edit= edit;
+ /* cache view depths and settings for re-use */
+ PE_set_view3d_data(C, &bedit->data);
+
return 1;
}
@@ -3359,6 +3423,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
if(((pset->brushtype == PE_BRUSH_ADD) ?
(sqrt(dx * dx + dy * dy) > pset->brush[PE_BRUSH_ADD].step) : (dx != 0 || dy != 0))
|| bedit->first) {
+ PEData data= bedit->data;
view3d_operator_needs_opengl(C);
selected= (short)count_selected_keys(scene, edit);
@@ -3366,9 +3431,6 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
switch(pset->brushtype) {
case PE_BRUSH_COMB:
{
- PEData data;
-
- PE_set_view3d_data(C, &data);
data.mval= mval;
data.rad= (float)brush->size;
@@ -3388,10 +3450,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
}
case PE_BRUSH_CUT:
{
- PEData data;
-
if(edit->psys && edit->pathcache) {
- PE_set_view3d_data(C, &data);
data.mval= mval;
data.rad= (float)brush->size;
data.cutfac= brush->strength;
@@ -3401,7 +3460,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
else
foreach_point(&data, brush_cut);
- removed= remove_tagged_particles(scene, ob, edit->psys, pe_x_mirror(ob));
+ removed= remove_tagged_particles(ob, edit->psys, pe_x_mirror(ob));
if(pset->flag & PE_KEEP_LENGTHS)
recalc_lengths(edit);
}
@@ -3412,9 +3471,6 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
}
case PE_BRUSH_LENGTH:
{
- PEData data;
-
- PE_set_view3d_data(C, &data);
data.mval= mval;
data.rad= (float)brush->size;
@@ -3433,10 +3489,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
}
case PE_BRUSH_PUFF:
{
- PEData data;
-
if(edit->psys) {
- PE_set_view3d_data(C, &data);
data.dm= psmd->dm;
data.mval= mval;
data.rad= (float)brush->size;
@@ -3457,10 +3510,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
}
case PE_BRUSH_ADD:
{
- PEData data;
-
if(edit->psys && edit->psys->part->from==PART_FROM_FACE) {
- PE_set_view3d_data(C, &data);
data.mval= mval;
added= brush_add(&data, brush->count);
@@ -3474,9 +3524,6 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
}
case PE_BRUSH_SMOOTH:
{
- PEData data;
-
- PE_set_view3d_data(C, &data);
data.mval= mval;
data.rad= (float)brush->size;
@@ -3498,9 +3545,6 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
}
case PE_BRUSH_WEIGHT:
{
- PEData data;
- PE_set_view3d_data(C, &data);
-
if(edit->psys) {
data.dm= psmd->dm;
data.mval= mval;
@@ -3523,7 +3567,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
update_world_cos(ob,edit);
psys_free_path_cache(NULL, edit);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else
PE_update_object(scene, ob, 1);
@@ -3538,7 +3582,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
pset->flag |= lock_root;
}
-static void brush_edit_exit(bContext *C, wmOperator *op)
+static void brush_edit_exit(wmOperator *op)
{
BrushEdit *bedit= op->customdata;
@@ -3555,7 +3599,7 @@ static int brush_edit_exec(bContext *C, wmOperator *op)
}
RNA_END;
- brush_edit_exit(C, op);
+ brush_edit_exit(op);
return OPERATOR_FINISHED;
}
@@ -3597,7 +3641,7 @@ static int brush_edit_modal(bContext *C, wmOperator *op, wmEvent *event)
case LEFTMOUSE:
case MIDDLEMOUSE:
case RIGHTMOUSE: // XXX hardcoded
- brush_edit_exit(C, op);
+ brush_edit_exit(op);
return OPERATOR_FINISHED;
case MOUSEMOVE:
brush_edit_apply_event(C, op, event);
@@ -3607,9 +3651,9 @@ static int brush_edit_modal(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
-static int brush_edit_cancel(bContext *C, wmOperator *op)
+static int brush_edit_cancel(bContext *UNUSED(C), wmOperator *op)
{
- brush_edit_exit(C, op);
+ brush_edit_exit(op);
return OPERATOR_CANCELLED;
}
@@ -3682,8 +3726,6 @@ static void make_PTCacheUndo(PTCacheEdit *edit, PTCacheUndo *undo)
for(; pm; pm=pm->next) {
for(i=0; i<BPHYS_TOT_DATA; i++)
pm->data[i] = MEM_dupallocN(pm->data[i]);
-
- pm->index_array = MEM_dupallocN(pm->index_array);
}
}
@@ -3758,9 +3800,7 @@ static void get_PTCacheUndo(PTCacheEdit *edit, PTCacheUndo *undo)
for(i=0; i<BPHYS_TOT_DATA; i++)
pm->data[i] = MEM_dupallocN(pm->data[i]);
- pm->index_array = MEM_dupallocN(pm->index_array);
-
- BKE_ptcache_mem_init_pointers(pm);
+ BKE_ptcache_mem_pointers_init(pm);
LOOP_POINTS {
LOOP_KEYS {
@@ -3771,13 +3811,13 @@ static void get_PTCacheUndo(PTCacheEdit *edit, PTCacheUndo *undo)
key->time = &key->ftime;
}
}
- BKE_ptcache_mem_incr_pointers(pm);
+ BKE_ptcache_mem_pointers_incr(pm);
}
}
}
}
-void PE_undo_push(Scene *scene, char *str)
+void PE_undo_push(Scene *scene, const char *str)
{
PTCacheEdit *edit= PE_get_current(scene, OBACT);
PTCacheUndo *undo;
@@ -3848,7 +3888,17 @@ void PE_undo_step(Scene *scene, int step)
}
}
- DAG_id_flush_update(&OBACT->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&OBACT->id, OB_RECALC_DATA);
+}
+
+int PE_undo_valid(Scene *scene)
+{
+ PTCacheEdit *edit= PE_get_current(scene, OBACT);
+
+ if(edit) {
+ return (edit->undo.last != edit->undo.first);
+ }
+ return 0;
}
static void PTCacheUndo_number(Scene *scene, PTCacheEdit *edit, int nr)
@@ -3974,6 +4024,9 @@ static void PE_create_particle_edit(Scene *scene, Object *ob, PointCache *cache,
if(cache && cache->flag & PTCACHE_DISK_CACHE)
return;
+ if(psys == NULL && cache->mem_cache.first == NULL)
+ return;
+
if(!edit) {
totpoint = psys ? psys->totpart : ((PTCacheMem*)cache->mem_cache.first)->totpoint;
@@ -4001,12 +4054,16 @@ static void PE_create_particle_edit(Scene *scene, Object *ob, PointCache *cache,
key->co= hkey->co;
key->time= &hkey->time;
key->flag= hkey->editflag;
- if(!(psys->flag & PSYS_GLOBAL_HAIR))
+ if(!(psys->flag & PSYS_GLOBAL_HAIR)) {
key->flag |= PEK_USE_WCO;
+ hkey->editflag |= PEK_USE_WCO;
+ }
+
hkey++;
}
pa++;
}
+ update_world_cos(ob, edit);
}
else {
PTCacheMem *pm;
@@ -4020,25 +4077,9 @@ static void PE_create_particle_edit(Scene *scene, Object *ob, PointCache *cache,
totframe++;
for(pm=cache->mem_cache.first; pm; pm=pm->next) {
- BKE_ptcache_mem_init_pointers(pm);
-
LOOP_POINTS {
- if(psys) {
- if(pm->index_array) {
- if(pm->index_array[p])
- BKE_ptcache_mem_seek_pointers(p, pm);
- else
- continue;
- }
- else {
- pa = psys->particles + p;
- if((pm->next && pm->next->frame < pa->time)
- || (pm->prev && pm->prev->frame >= pa->dietime)) {
- BKE_ptcache_mem_incr_pointers(pm);
- continue;
- }
- }
- }
+ if(BKE_ptcache_mem_pointers_seek(p, pm) == 0)
+ continue;
if(!point->totkey) {
key = point->keys = MEM_callocN(totframe*sizeof(PTCacheEditKey),"ParticleEditKeys");
@@ -4052,7 +4093,7 @@ static void PE_create_particle_edit(Scene *scene, Object *ob, PointCache *cache,
key->rot = pm->cur[BPHYS_DATA_ROTATION];
key->ftime = (float)pm->frame;
key->time = &key->ftime;
- BKE_ptcache_mem_incr_pointers(pm);
+ BKE_ptcache_mem_pointers_incr(pm);
point->totkey++;
}
@@ -4084,7 +4125,7 @@ static int particle_edit_toggle_poll(bContext *C)
return (ob->particlesystem.first || modifiers_findByType(ob, eModifierType_Cloth) || modifiers_findByType(ob, eModifierType_Softbody));
}
-static int particle_edit_toggle_exec(bContext *C, wmOperator *op)
+static int particle_edit_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
@@ -4108,7 +4149,7 @@ static int particle_edit_toggle_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, NULL);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -4130,7 +4171,7 @@ void PARTICLE_OT_particle_edit_toggle(wmOperatorType *ot)
/************************ set editable operator ************************/
-static int clear_edited_exec(bContext *C, wmOperator *op)
+static int clear_edited_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_active_object(C);
ParticleSystem *psys = psys_get_current(ob);
@@ -4148,7 +4189,7 @@ static int clear_edited_exec(bContext *C, wmOperator *op)
psys_reset(psys, PSYS_RESET_DEPSGRAPH);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
}
else { /* some operation might have protected hair from editing so let's clear the flag */
@@ -4156,7 +4197,7 @@ static int clear_edited_exec(bContext *C, wmOperator *op)
psys->flag &= ~PSYS_GLOBAL_HAIR;
psys->flag &= ~PSYS_EDITED;
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/physics/particle_object.c b/source/blender/editors/physics/particle_object.c
index e364a881601..6078f05ebd1 100644
--- a/source/blender/editors/physics/particle_object.c
+++ b/source/blender/editors/physics/particle_object.c
@@ -36,6 +36,7 @@
#include "BLI_math.h"
#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
@@ -45,7 +46,7 @@
#include "BKE_main.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
-#include "BKE_utildefines.h"
+
#include "RNA_access.h"
#include "RNA_define.h"
@@ -60,7 +61,7 @@
/********************** particle system slot operators *********************/
-static int particle_system_add_exec(bContext *C, wmOperator *op)
+static int particle_system_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Scene *scene = CTX_data_scene(C);
@@ -91,7 +92,7 @@ void OBJECT_OT_particle_system_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int particle_system_remove_exec(bContext *C, wmOperator *op)
+static int particle_system_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Scene *scene = CTX_data_scene(C);
@@ -138,7 +139,7 @@ static int psys_poll(bContext *C)
return (ptr.data != NULL);
}
-static int new_particle_settings_exec(bContext *C, wmOperator *op)
+static int new_particle_settings_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene = CTX_data_scene(C);
Main *bmain= CTX_data_main(C);
@@ -167,7 +168,7 @@ static int new_particle_settings_exec(bContext *C, wmOperator *op)
psys_check_boid_data(psys);
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob);
@@ -191,7 +192,7 @@ void PARTICLE_OT_new(wmOperatorType *ot)
/********************** keyed particle target operators *********************/
-static int new_particle_target_exec(bContext *C, wmOperator *op)
+static int new_particle_target_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
@@ -216,7 +217,7 @@ static int new_particle_target_exec(bContext *C, wmOperator *op)
BLI_addtail(&psys->targets, pt);
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob);
@@ -237,7 +238,7 @@ void PARTICLE_OT_new_target(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int remove_particle_target_exec(bContext *C, wmOperator *op)
+static int remove_particle_target_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
@@ -265,7 +266,7 @@ static int remove_particle_target_exec(bContext *C, wmOperator *op)
pt->flag |= PTARGET_CURRENT;
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob);
@@ -288,7 +289,7 @@ void PARTICLE_OT_target_remove(wmOperatorType *ot)
/************************ move up particle target operator *********************/
-static int target_move_up_exec(bContext *C, wmOperator *op)
+static int target_move_up_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -304,7 +305,7 @@ static int target_move_up_exec(bContext *C, wmOperator *op)
BLI_remlink(&psys->targets, pt);
BLI_insertlink(&psys->targets, pt->prev->prev, pt);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob);
break;
}
@@ -327,7 +328,7 @@ void PARTICLE_OT_target_move_up(wmOperatorType *ot)
/************************ move down particle target operator *********************/
-static int target_move_down_exec(bContext *C, wmOperator *op)
+static int target_move_down_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -342,7 +343,7 @@ static int target_move_down_exec(bContext *C, wmOperator *op)
BLI_remlink(&psys->targets, pt);
BLI_insertlink(&psys->targets, pt->next, pt);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob);
break;
}
@@ -365,7 +366,7 @@ void PARTICLE_OT_target_move_down(wmOperatorType *ot)
/************************ move up particle dupliweight operator *********************/
-static int dupliob_move_up_exec(bContext *C, wmOperator *op)
+static int dupliob_move_up_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -403,7 +404,7 @@ void PARTICLE_OT_dupliob_move_up(wmOperatorType *ot)
/********************** particle dupliweight operators *********************/
-static int copy_particle_dupliob_exec(bContext *C, wmOperator *op)
+static int copy_particle_dupliob_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -442,7 +443,7 @@ void PARTICLE_OT_dupliob_copy(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int remove_particle_dupliob_exec(bContext *C, wmOperator *op)
+static int remove_particle_dupliob_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -487,7 +488,7 @@ void PARTICLE_OT_dupliob_remove(wmOperatorType *ot)
/************************ move down particle dupliweight operator *********************/
-static int dupliob_move_down_exec(bContext *C, wmOperator *op)
+static int dupliob_move_down_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -595,7 +596,7 @@ static int disconnect_hair_exec(bContext *C, wmOperator *op)
disconnect_hair(scene, ob, psys);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob);
return OPERATOR_FINISHED;
@@ -623,7 +624,7 @@ static void connect_hair(Scene *scene, Object *ob, ParticleSystem *psys)
PTCacheEditPoint *point;
PTCacheEditKey *ekey = NULL;
HairKey *key;
- BVHTreeFromMesh bvhtree;
+ BVHTreeFromMesh bvhtree= {0};
BVHTreeNearest nearest;
MFace *mface;
DerivedMesh *dm = NULL;
@@ -646,8 +647,6 @@ static void connect_hair(Scene *scene, Object *ob, ParticleSystem *psys)
numverts = dm->getNumVerts (dm);
- memset( &bvhtree, 0, sizeof(bvhtree) );
-
/* convert to global coordinates */
for (i=0; i<numverts; i++)
mul_m4_v3(ob->obmat, CDDM_get_vert(dm, i)->co);
@@ -735,7 +734,7 @@ static int connect_hair_exec(bContext *C, wmOperator *op)
connect_hair(scene, ob, psys);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob);
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c
index f411f92d395..4e08dd49703 100644
--- a/source/blender/editors/physics/physics_fluid.c
+++ b/source/blender/editors/physics/physics_fluid.c
@@ -53,6 +53,7 @@
#include "BLI_blenlib.h"
#include "BLI_threads.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_animsys.h"
#include "BKE_armature.h"
@@ -342,7 +343,7 @@ static void free_all_fluidobject_channels(ListBase *fobjects)
}
}
-static void fluid_init_all_channels(bContext *C, Object *fsDomain, FluidsimSettings *domainSettings, FluidAnimChannels *channels, ListBase *fobjects)
+static void fluid_init_all_channels(bContext *C, Object *UNUSED(fsDomain), FluidsimSettings *domainSettings, FluidAnimChannels *channels, ListBase *fobjects)
{
Scene *scene = CTX_data_scene(C);
Base *base;
@@ -420,7 +421,7 @@ static void fluid_init_all_channels(bContext *C, Object *fsDomain, FluidsimSetti
/* Modifying the global scene isn't nice, but we can do it in
* this part of the process before a threaded job is created */
scene->r.cfra = (int)eval_time;
- ED_update_for_newframe(C, 1);
+ ED_update_for_newframe(CTX_data_main(C), scene, CTX_wm_screen(C), 1);
/* now scene data should be current according to animation system, so we fill the channels */
@@ -633,13 +634,13 @@ static int fluid_init_filepaths(Object *fsDomain, char *targetDir, char *targetF
FILE *fileCfg;
int dirExist = 0;
char newSurfdataPath[FILE_MAXDIR+FILE_MAXFILE]; // modified output settings
- char *suffixConfig = FLUID_SUFFIX_CONFIG;
+ const char *suffixConfig = FLUID_SUFFIX_CONFIG;
int outStringsChanged = 0;
// prepare names...
strncpy(targetDir, domainSettings->surfdataPath, FILE_MAXDIR);
strncpy(newSurfdataPath, domainSettings->surfdataPath, FILE_MAXDIR);
- BLI_path_abs(targetDir, G.sce); // fixed #frame-no
+ BLI_path_abs(targetDir, G.main->name); // fixed #frame-no
strcpy(targetFile, targetDir);
strcat(targetFile, suffixConfig);
@@ -663,9 +664,9 @@ static int fluid_init_filepaths(Object *fsDomain, char *targetDir, char *targetF
char blendFile[FILE_MAXDIR+FILE_MAXFILE];
// invalid dir, reset to current/previous
- strcpy(blendDir, G.sce);
+ strcpy(blendDir, G.main->name);
BLI_splitdirstring(blendDir, blendFile);
- if(strlen(blendFile)>6){
+ if(BLI_strnlen(blendFile, 7) > 6){
int len = strlen(blendFile);
if( (blendFile[len-6]=='.')&& (blendFile[len-5]=='b')&& (blendFile[len-4]=='l')&&
(blendFile[len-3]=='e')&& (blendFile[len-2]=='n')&& (blendFile[len-1]=='d') ){
@@ -694,7 +695,7 @@ static int fluid_init_filepaths(Object *fsDomain, char *targetDir, char *targetF
if(selection<1) return 0; // 0 from menu, or -1 aborted
strcpy(targetDir, newSurfdataPath);
strncpy(domainSettings->surfdataPath, newSurfdataPath, FILE_MAXDIR);
- BLI_path_abs(targetDir, G.sce); // fixed #frame-no
+ BLI_path_abs(targetDir, G.main->name); // fixed #frame-no
}
#endif
return outStringsChanged;
@@ -720,7 +721,7 @@ static void fluidbake_free(void *customdata)
}
/* called by fluidbake, only to check job 'stop' value */
-static int fluidbake_breakjob(void *customdata)
+static int fluidbake_breakjob(void *UNUSED(customdata))
{
//FluidBakeJob *fb= (FluidBakeJob *)customdata;
//return *(fb->stop);
@@ -813,8 +814,8 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain)
int gridlevels = 0;
const char *strEnvName = "BLENDER_ELBEEMDEBUG"; // from blendercall.cpp
- char *suffixConfig = FLUID_SUFFIX_CONFIG;
- char *suffixSurface = FLUID_SUFFIX_SURFACE;
+ const char *suffixConfig = FLUID_SUFFIX_CONFIG;
+ const char *suffixSurface = FLUID_SUFFIX_SURFACE;
char targetDir[FILE_MAXDIR+FILE_MAXFILE]; // store & modify output settings
char targetFile[FILE_MAXDIR+FILE_MAXFILE]; // temp. store filename from targetDir for access
@@ -910,7 +911,7 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain)
/* reset to original current frame */
scene->r.cfra = origFrame;
- ED_update_for_newframe(C, 1);
+ ED_update_for_newframe(CTX_data_main(C), scene, CTX_wm_screen(C), 1);
/* ---- XXX: No Time animation curve for now, leaving this code here for reference
@@ -1047,7 +1048,7 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain)
return 1;
}
-void fluidsimFreeBake(Object *ob)
+void fluidsimFreeBake(Object *UNUSED(ob))
{
/* not implemented yet */
}
@@ -1056,27 +1057,27 @@ void fluidsimFreeBake(Object *ob)
/* compile dummy functions for disabled fluid sim */
-FluidsimSettings *fluidsimSettingsNew(Object *srcob)
+FluidsimSettings *fluidsimSettingsNew(Object *UNUSED(srcob))
{
return NULL;
}
-void fluidsimSettingsFree(FluidsimSettings *fss)
+void fluidsimSettingsFree(FluidsimSettings *UNUSED(fss))
{
}
-FluidsimSettings* fluidsimSettingsCopy(FluidsimSettings *fss)
+FluidsimSettings* fluidsimSettingsCopy(FluidsimSettings *UNUSED(fss))
{
return NULL;
}
/* only compile dummy functions */
-int fluidsimBake(bContext *C, ReportList *reports, Object *ob)
+int fluidsimBake(bContext *UNUSED(C), ReportList *UNUSED(reports), Object *UNUSED(ob))
{
return 0;
}
-void fluidsimFreeBake(Object *ob)
+void fluidsimFreeBake(Object *UNUSED(ob))
{
}
diff --git a/source/blender/editors/physics/physics_pointcache.c b/source/blender/editors/physics/physics_pointcache.c
index 35f86a49aa7..9aa879dad67 100644
--- a/source/blender/editors/physics/physics_pointcache.c
+++ b/source/blender/editors/physics/physics_pointcache.c
@@ -31,6 +31,9 @@
#include "MEM_guardedalloc.h"
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "DNA_scene_types.h"
#include "BKE_context.h"
@@ -41,13 +44,10 @@
#include "BKE_pointcache.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
-
-#include "BLI_blenlib.h"
+
#include "ED_particle.h"
-
#include "WM_api.h"
#include "WM_types.h"
@@ -56,7 +56,7 @@
#include "physics_intern.h"
-static int cache_break_test(void *cbd) {
+static int cache_break_test(void *UNUSED(cbd)) {
return G.afbreek==1;
}
static int ptcache_bake_all_poll(bContext *C)
@@ -75,15 +75,15 @@ static int ptcache_poll(bContext *C)
return (ptr.data && ptr.id.data);
}
-void bake_console_progress(void *arg, int nr)
+void bake_console_progress(void *UNUSED(arg), int nr)
{
printf("\rbake: %3i%%", nr);
fflush(stdout);
}
-void bake_console_progress_end(void *arg)
+void bake_console_progress_end(void *UNUSED(arg))
{
- printf("\n");
+ printf("\rbake: done!\n");
}
static int ptcache_bake_all_exec(bContext *C, wmOperator *op)
@@ -103,6 +103,9 @@ static int ptcache_bake_all_exec(bContext *C, wmOperator *op)
baker.break_test = cache_break_test;
baker.break_data = NULL;
+ /* Disabled for now as this doesn't work properly,
+ * and pointcache baking will be reimplemented with
+ * the job system soon anyways. */
if (win) {
baker.progressbar = (void (*)(void *, int))WM_timecursor;
baker.progressend = (void (*)(void *))WM_cursor_restore;
@@ -113,14 +116,14 @@ static int ptcache_bake_all_exec(bContext *C, wmOperator *op)
baker.progresscontext = NULL;
}
- BKE_ptcache_make_cache(&baker);
+ BKE_ptcache_bake(&baker);
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
WM_event_add_notifier(C, NC_OBJECT|ND_POINTCACHE, NULL);
return OPERATOR_FINISHED;
}
-static int ptcache_free_bake_all_exec(bContext *C, wmOperator *op)
+static int ptcache_free_bake_all_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Base *base;
@@ -201,6 +204,9 @@ static int ptcache_bake_exec(bContext *C, wmOperator *op)
baker.break_test = cache_break_test;
baker.break_data = NULL;
+ /* Disabled for now as this doesn't work properly,
+ * and pointcache baking will be reimplemented with
+ * the job system soon anyways. */
if (win) {
baker.progressbar = (void (*)(void *, int))WM_timecursor;
baker.progressend = (void (*)(void *))WM_cursor_restore;
@@ -212,7 +218,7 @@ static int ptcache_bake_exec(bContext *C, wmOperator *op)
baker.progresscontext = NULL;
}
- BKE_ptcache_make_cache(&baker);
+ BKE_ptcache_bake(&baker);
BLI_freelistN(&pidlist);
@@ -221,7 +227,7 @@ static int ptcache_bake_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int ptcache_free_bake_exec(bContext *C, wmOperator *op)
+static int ptcache_free_bake_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr= CTX_data_pointer_get_type(C, "point_cache", &RNA_PointCache);
PointCache *cache= ptr.data;
@@ -241,7 +247,7 @@ static int ptcache_free_bake_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int ptcache_bake_from_cache_exec(bContext *C, wmOperator *op)
+static int ptcache_bake_from_cache_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr= CTX_data_pointer_get_type(C, "point_cache", &RNA_PointCache);
PointCache *cache= ptr.data;
@@ -295,7 +301,7 @@ void PTCACHE_OT_bake_from_cache(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int ptcache_add_new_exec(bContext *C, wmOperator *op)
+static int ptcache_add_new_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene = CTX_data_scene(C);
PointerRNA ptr= CTX_data_pointer_get_type(C, "point_cache", &RNA_PointCache);
@@ -320,7 +326,7 @@ static int ptcache_add_new_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int ptcache_remove_exec(bContext *C, wmOperator *op)
+static int ptcache_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr= CTX_data_pointer_get_type(C, "point_cache", &RNA_PointCache);
Scene *scene= CTX_data_scene(C);
diff --git a/source/blender/editors/render/CMakeLists.txt b/source/blender/editors/render/CMakeLists.txt
index d494355a1e9..3e3d42e9454 100644
--- a/source/blender/editors/render/CMakeLists.txt
+++ b/source/blender/editors/render/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenfont
../../blenkernel
@@ -37,17 +35,23 @@ SET(INC
../../../../extern/glew/include
)
-IF(WITH_QUICKTIME)
- LIST(APPEND INC ../../quicktime ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+set(SRC
+ render_internal.c
+ render_opengl.c
+ render_ops.c
+ render_preview.c
+ render_shading.c
+
+ render_intern.h
+)
-IF(WITH_OPENMP)
- ADD_DEFINITIONS(-DPARALLEL=1)
-ENDIF(WITH_OPENMP)
+if(WITH_CODEC_QUICKTIME)
+ list(APPEND INC ../../quicktime ${QUICKTIME_INC})
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_OPENMP)
+ add_definitions(-DPARALLEL=1)
+endif()
-BLENDERLIB(bf_editor_render "${SRC}" "${INC}")
+blender_add_lib(bf_editor_render "${SRC}" "${INC}")
diff --git a/source/blender/editors/render/Makefile b/source/blender/editors/render/Makefile
deleted file mode 100644
index 510e5372e22..00000000000
--- a/source/blender/editors/render/Makefile
+++ /dev/null
@@ -1,62 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_render
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
-
-ifeq ($(OS), darwin)
- ifeq ($(WITH_BF_OPENMP), true)
- CPPFLAGS += -DPARALLEL=1
- endif
-endif
diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c
index 083202e5a03..341f56667fa 100644
--- a/source/blender/editors/render/render_internal.c
+++ b/source/blender/editors/render/render_internal.c
@@ -34,6 +34,7 @@
#include "BLI_math.h"
#include "BLI_threads.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "DNA_scene_types.h"
@@ -43,6 +44,7 @@
#include "BKE_image.h"
#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_node.h"
#include "BKE_multires.h"
#include "BKE_report.h"
#include "BKE_sequencer.h"
@@ -347,6 +349,8 @@ static ScrArea *find_area_showing_r_result(bContext *C)
break;
}
}
+ if(sa)
+ break;
}
return sa;
@@ -388,7 +392,7 @@ static ScrArea *find_empty_image_area(bContext *C)
}
#endif // XXX not used
-static void render_error_reports(void *reports, char *str)
+static void render_error_reports(void *reports, const char *str)
{
BKE_report(reports, RPT_ERROR, str);
}
@@ -401,7 +405,14 @@ static int screen_render_exec(bContext *C, wmOperator *op)
Image *ima;
View3D *v3d= CTX_wm_view3d(C);
Main *mainp= CTX_data_main(C);
- int lay= (v3d)? v3d->lay: scene->lay;
+ unsigned int lay= (v3d)? v3d->lay: scene->lay;
+ const short is_animation= RNA_boolean_get(op->ptr, "animation");
+ const short is_write_still= RNA_boolean_get(op->ptr, "write_still");
+
+ if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.imtype)) {
+ BKE_report(op->reports, RPT_ERROR, "Can't write a single file with an animation format selected.");
+ return OPERATOR_CANCELLED;
+ }
if(re==NULL) {
re= RE_NewRender(scene->id.name);
@@ -421,13 +432,13 @@ static int screen_render_exec(bContext *C, wmOperator *op)
since sequence rendering can call that recursively... (peter) */
seq_stripelem_cache_cleanup();
- if(RNA_boolean_get(op->ptr, "animation"))
+ if(is_animation)
RE_BlenderAnim(re, mainp, scene, lay, scene->r.sfra, scene->r.efra, scene->r.frame_step, op->reports);
else
- RE_BlenderFrame(re, mainp, scene, NULL, lay, scene->r.cfra);
+ RE_BlenderFrame(re, mainp, scene, NULL, lay, scene->r.cfra, is_write_still);
// no redraw needed, we leave state as we entered it
- ED_update_for_newframe(C, 1);
+ ED_update_for_newframe(mainp, scene, CTX_wm_screen(C), 1);
WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, scene);
@@ -441,7 +452,7 @@ typedef struct RenderJob {
wmWindow *win;
SceneRenderLayer *srl;
int lay;
- int anim;
+ short anim, write_still;
Image *image;
ImageUser iuser;
short *stop;
@@ -568,16 +579,35 @@ static void render_startjob(void *rjv, short *stop, short *do_update, float *pro
if(rj->anim)
RE_BlenderAnim(rj->re, rj->main, rj->scene, rj->lay, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step, rj->reports);
else
- RE_BlenderFrame(rj->re, rj->main, rj->scene, rj->srl, rj->lay, rj->scene->r.cfra);
+ RE_BlenderFrame(rj->re, rj->main, rj->scene, rj->srl, rj->lay, rj->scene->r.cfra, rj->write_still);
}
static void render_endjob(void *rjv)
{
- RenderJob *rj= rjv;
+ RenderJob *rj= rjv;
+
+ /* this render may be used again by the sequencer without the active 'Render' where the callbacks
+ * would be re-assigned. assign dummy callbacks to avoid referencing freed renderjobs bug [#24508] */
+ RE_InitRenderCB(rj->re);
if(rj->main != G.main)
free_main(rj->main);
+ /* else the frame will not update for the original value */
+ if(!(rj->scene->r.scemode & R_NO_FRAME_UPDATE))
+ ED_update_for_newframe(G.main, rj->scene, rj->win->screen, 1);
+
+ /* XXX above function sets all tags in nodes */
+ ntreeClearTags(rj->scene->nodetree);
+
+ /* potentially set by caller */
+ rj->scene->r.scemode &= ~R_NO_FRAME_UPDATE;
+
+ if(rj->srl) {
+ NodeTagIDChanged(rj->scene->nodetree, &rj->scene->id);
+ WM_main_add_notifier(NC_NODE|NA_EDITED, rj->scene);
+ }
+
/* XXX render stability hack */
G.rendering = 0;
WM_main_add_notifier(NC_WINDOW, NULL);
@@ -596,7 +626,7 @@ static int render_breakjob(void *rjv)
}
/* catch esc */
-static int screen_render_modal(bContext *C, wmOperator *op, wmEvent *event)
+static int screen_render_modal(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
/* no running blender, remove handler and pass through */
if(0==WM_jobs_test(CTX_wm_manager(C), CTX_data_scene(C))) {
@@ -625,11 +655,23 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
wmJob *steve;
RenderJob *rj;
Image *ima;
-
+ int jobflag;
+ const short is_animation= RNA_boolean_get(op->ptr, "animation");
+ const short is_write_still= RNA_boolean_get(op->ptr, "write_still");
+
/* only one render job at a time */
if(WM_jobs_test(CTX_wm_manager(C), scene))
return OPERATOR_CANCELLED;
+ if(!RE_is_rendering_allowed(scene, op->reports, render_error_reports)) {
+ return OPERATOR_CANCELLED;
+ }
+
+ if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.imtype)) {
+ BKE_report(op->reports, RPT_ERROR, "Can't write a single file with an animation format selected.");
+ return OPERATOR_CANCELLED;
+ }
+
/* stop all running jobs, currently previews frustrate Render */
WM_jobs_stop_all(CTX_wm_manager(C));
@@ -667,6 +709,8 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* ensure at least 1 area shows result */
screen_set_image_output(C, event->x, event->y);
+ jobflag= WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY|WM_JOB_PROGRESS;
+
/* single layer re-render */
if(RNA_property_is_set(op->ptr, "layer")) {
SceneRenderLayer *rl;
@@ -678,11 +722,12 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
scn = (Scene *)BLI_findstring(&mainp->scene, scene_name, offsetof(ID, name) + 2);
rl = (SceneRenderLayer *)BLI_findstring(&scene->r.layers, rl_name, offsetof(SceneRenderLayer, name));
-
+
if (scn && rl) {
scene = scn;
srl = rl;
}
+ jobflag |= WM_JOB_SUSPEND;
}
/* job custom data */
@@ -692,13 +737,14 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
rj->win= CTX_wm_window(C);
rj->srl = srl;
rj->lay = (v3d)? v3d->lay: scene->lay;
- rj->anim= RNA_boolean_get(op->ptr, "animation");
+ rj->anim= is_animation;
+ rj->write_still= is_write_still && !is_animation;
rj->iuser.scene= scene;
rj->iuser.ok= 1;
rj->reports= op->reports;
/* setup job */
- steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Render", WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY|WM_JOB_PROGRESS);
+ steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Render", jobflag);
WM_jobs_customdata(steve, rj, render_freejob);
WM_jobs_timer(steve, 0.2, NC_SCENE|ND_RENDER_RESULT, 0);
WM_jobs_callbacks(steve, render_startjob, NULL, NULL, render_endjob);
@@ -753,7 +799,8 @@ void RENDER_OT_render(wmOperatorType *ot)
ot->poll= ED_operator_screenactive;
- RNA_def_boolean(ot->srna, "animation", 0, "Animation", "");
+ RNA_def_boolean(ot->srna, "animation", 0, "Animation", "Render files from the animation range of this scene");
+ RNA_def_boolean(ot->srna, "write_still", 0, "Write Image", "Save rendered the image to the output path (used only when animation is disabled)");
RNA_def_string(ot->srna, "layer", "", RE_MAXNAME, "Render Layer", "Single render layer to re-render");
RNA_def_string(ot->srna, "scene", "", 19, "Scene", "Re-render single layer in this scene");
}
@@ -763,14 +810,14 @@ void RENDER_OT_render(wmOperatorType *ot)
/* *********************** cancel render viewer *************** */
-static int render_view_cancel_exec(bContext *C, wmOperator *unused)
+static int render_view_cancel_exec(bContext *C, wmOperator *UNUSED(unused))
{
wmWindow *win= CTX_wm_window(C);
ScrArea *sa= CTX_wm_area(C);
SpaceImage *sima= sa->spacedata.first;
/* test if we have a temp screen in front */
- if(CTX_wm_window(C)->screen->full==SCREENTEMP) {
+ if(CTX_wm_window(C)->screen->temp) {
wm_window_lower(CTX_wm_window(C));
return OPERATOR_FINISHED;
}
@@ -810,33 +857,53 @@ void RENDER_OT_view_cancel(struct wmOperatorType *ot)
/* *********************** show render viewer *************** */
-static int render_view_show_invoke(bContext *C, wmOperator *unused, wmEvent *event)
+static int render_view_show_invoke(bContext *C, wmOperator *UNUSED(unused), wmEvent *event)
{
ScrArea *sa= find_area_showing_r_result(C);
- /* test if we have a temp screen in front */
- if(CTX_wm_window(C)->screen->full==SCREENTEMP) {
+ /* test if we have a temp screen active */
+ if(CTX_wm_window(C)->screen->temp) {
wm_window_lower(CTX_wm_window(C));
}
- /* determine if render already shows */
- else if(sa) {
- SpaceImage *sima= sa->spacedata.first;
-
- if(sima->flag & SI_PREVSPACE) {
- sima->flag &= ~SI_PREVSPACE;
-
- if(sima->flag & SI_FULLWINDOW) {
- sima->flag &= ~SI_FULLWINDOW;
- ED_screen_full_prevspace(C, sa);
+ else {
+ /* is there another window? */
+ wmWindow *win;
+
+ for(win= CTX_wm_manager(C)->windows.first; win; win= win->next) {
+ if(win->screen->temp) {
+ wm_window_raise(win);
+ return OPERATOR_FINISHED;
}
- else if(sima->next) {
- ED_area_newspace(C, sa, sima->next->spacetype);
- ED_area_tag_redraw(sa);
+ }
+
+ /* determine if render already shows */
+ if(sa) {
+ /* but don't close it when rendering */
+ if(!G.rendering) {
+ SpaceImage *sima= sa->spacedata.first;
+
+ if(sima->flag & SI_PREVSPACE) {
+ sima->flag &= ~SI_PREVSPACE;
+
+ if(sima->flag & SI_FULLWINDOW) {
+ sima->flag &= ~SI_FULLWINDOW;
+ ED_screen_full_prevspace(C, sa);
+ }
+ else if(sima->next) {
+ /* workaround for case of double prevspace, render window
+ with a file browser on top of it (same as in ED_area_prevspace) */
+ if(sima->next->spacetype == SPACE_FILE && sima->next->next)
+ ED_area_newspace(C, sa, sima->next->next->spacetype);
+ else
+ ED_area_newspace(C, sa, sima->next->spacetype);
+ ED_area_tag_redraw(sa);
+ }
+ }
}
}
- }
- else {
- screen_set_image_output(C, event->x, event->y);
+ else {
+ screen_set_image_output(C, event->x, event->y);
+ }
}
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c
index 7833f93b3b5..c2b2a0ad457 100644
--- a/source/blender/editors/render/render_opengl.c
+++ b/source/blender/editors/render/render_opengl.c
@@ -36,6 +36,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
@@ -81,6 +82,7 @@ typedef struct OGLRender {
GPUOffScreen *ofs;
int sizex, sizey;
+ int write_still;
ReportList *reports;
bMovieHandle *mh;
@@ -112,7 +114,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
float winmat[4][4];
int sizex= oglrender->sizex;
int sizey= oglrender->sizey;
- int view_context = (v3d != NULL);
+ const short view_context= (v3d != NULL);
rr= RE_AcquireResultRead(oglrender->re);
@@ -132,14 +134,51 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
/* render 3d view */
if(rv3d->persp==RV3D_CAMOB && v3d->camera) {
+ /*int is_ortho= scene->r.mode & R_ORTHO;*/
RE_GetCameraWindow(oglrender->re, v3d->camera, scene->r.cfra, winmat);
+
+ }
+ else {
+ rctf viewplane;
+ float clipsta, clipend;
+
+ int is_ortho= get_view3d_viewplane(v3d, rv3d, sizex, sizey, &viewplane, &clipsta, &clipend, NULL);
+ if(is_ortho) orthographic_m4(winmat, viewplane.xmin, viewplane.xmax, viewplane.ymin, viewplane.ymax, -clipend, clipend);
+ else perspective_m4(winmat, viewplane.xmin, viewplane.xmax, viewplane.ymin, viewplane.ymax, clipsta, clipend);
+ }
+
+ if((scene->r.mode & R_OSA) == 0) {
ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat);
+ glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, rr->rectf);
}
else {
- ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, NULL);
+ /* simple accumulation, less hassle then FSAA FBO's */
+# define SAMPLES 5 /* fixed, easy to have more but for now this is ok */
+ const float jit_ofs[SAMPLES][2] = {{0, 0}, {0.5f, 0.5f}, {-0.5f,-0.5f}, {-0.5f, 0.5f}, {0.5f, -0.5f}};
+ float winmat_jitter[4][4];
+ float *accum_buffer= MEM_mallocN(sizex * sizey * sizeof(float) * 4, "accum1");
+ float *accum_tmp= MEM_mallocN(sizex * sizey * sizeof(float) * 4, "accum2");
+ int j;
+
+ /* first sample buffer, also initializes 'rv3d->persmat' */
+ ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat);
+ glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, accum_buffer);
+
+ /* skip the first sample */
+ for(j=1; j < SAMPLES; j++) {
+ copy_m4_m4(winmat_jitter, winmat);
+ window_translate_m4(winmat_jitter, rv3d->persmat, jit_ofs[j][0] / sizex, jit_ofs[j][1] / sizey);
+
+ ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat_jitter);
+ glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, accum_tmp);
+ add_vn_vn(accum_buffer, accum_tmp, sizex*sizey*sizeof(float));
+ }
+
+ mul_vn_vn_fl(rr->rectf, accum_buffer, sizex*sizey*sizeof(float), 1.0/SAMPLES);
+
+ MEM_freeN(accum_buffer);
+ MEM_freeN(accum_tmp);
}
-
- glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, rr->rectf);
GPU_offscreen_unbind(oglrender->ofs); /* unbind */
}
@@ -158,7 +197,20 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
/* update byte from float buffer */
ibuf= BKE_image_acquire_ibuf(oglrender->ima, &oglrender->iuser, &lock);
- if(ibuf) image_buffer_rect_update(NULL, rr, ibuf, NULL);
+
+ if(ibuf) {
+ image_buffer_rect_update(NULL, rr, ibuf, NULL);
+
+ if(oglrender->write_still) {
+ char name[FILE_MAX];
+ int ok;
+ BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, FALSE);
+ ok= BKE_write_ibuf(scene, ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality);
+ if(ok) printf("OpenGL Render written to '%s'\n", name);
+ else printf("OpenGL Render failed to write '%s'\n", name);
+ }
+ }
+
BKE_image_release_ibuf(oglrender->ima, lock);
}
@@ -170,24 +222,31 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op)
GPUOffScreen *ofs;
OGLRender *oglrender;
int sizex, sizey;
- int view_context= RNA_boolean_get(op->ptr, "view_context");
+ short is_view_context= RNA_boolean_get(op->ptr, "view_context");
+ const short is_animation= RNA_boolean_get(op->ptr, "animation");
+ const short is_write_still= RNA_boolean_get(op->ptr, "write_still");
/* ensure we have a 3d view */
-
+
if(!ED_view3d_context_activate(C)) {
RNA_boolean_set(op->ptr, "view_context", 0);
- view_context = 0;
+ is_view_context= 0;
}
/* only one render job at a time */
if(WM_jobs_test(CTX_wm_manager(C), scene))
return 0;
- if(!view_context && scene->camera==NULL) {
+ if(!is_view_context && scene->camera==NULL) {
BKE_report(op->reports, RPT_ERROR, "Scene has no camera.");
return 0;
}
+ if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.imtype)) {
+ BKE_report(op->reports, RPT_ERROR, "Can't write a single file with an animation format selected.");
+ return 0;
+ }
+
/* stop all running jobs, currently previews frustrate Render */
WM_jobs_stop_all(CTX_wm_manager(C));
@@ -198,7 +257,8 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op)
sizex= (scene->r.size*scene->r.xsch)/100;
sizey= (scene->r.size*scene->r.ysch)/100;
- ofs= GPU_offscreen_create(sizex, sizey);
+ /* corrects render size with actual size, not every card supports non-power-of-two dimensions */
+ ofs= GPU_offscreen_create(&sizex, &sizey);
if(!ofs) {
BKE_report(op->reports, RPT_ERROR, "Failed to create OpenGL offscreen buffer.");
@@ -214,7 +274,9 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op)
oglrender->sizey= sizey;
oglrender->scene= scene;
- if(view_context) {
+ oglrender->write_still= is_write_still && !is_animation;
+
+ if(is_view_context) {
oglrender->v3d= CTX_wm_view3d(C);
oglrender->ar= CTX_wm_region(C);
oglrender->rv3d= CTX_wm_region_view3d(C);
@@ -305,11 +367,11 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op)
void *lock;
char name[FILE_MAXDIR+FILE_MAXFILE];
int ok= 0;
- int view_context = (oglrender->v3d != NULL);
+ const short view_context= (oglrender->v3d != NULL);
/* update animated image textures for gpu, etc,
* call before scene_update_for_newframe so modifiers with textuers dont lag 1 frame */
- ED_image_update_frame(C);
+ ED_image_update_frame(bmain, scene->r.cfra);
/* go to next frame */
while(CFRA<oglrender->nfra) {
@@ -351,7 +413,7 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op)
}
}
else {
- BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION);
+ BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, TRUE);
ok= BKE_write_ibuf(scene, ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality);
if(ok==0) {
@@ -387,7 +449,7 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op)
static int screen_opengl_render_modal(bContext *C, wmOperator *op, wmEvent *event)
{
OGLRender *oglrender= op->customdata;
-
+ int anim= RNA_boolean_get(op->ptr, "animation");
int ret;
switch(event->type) {
@@ -407,7 +469,13 @@ static int screen_opengl_render_modal(bContext *C, wmOperator *op, wmEvent *even
/* run first because screen_opengl_render_anim_step can free oglrender */
WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, oglrender->scene);
- ret= screen_opengl_render_anim_step(C, op);
+ if(anim == 0) {
+ screen_opengl_render_apply(op->customdata);
+ screen_opengl_render_end(C, op->customdata);
+ return OPERATOR_FINISHED;
+ }
+ else
+ ret= screen_opengl_render_anim_step(C, op);
/* stop at the end or on error */
if(ret == 0) {
@@ -419,43 +487,35 @@ static int screen_opengl_render_modal(bContext *C, wmOperator *op, wmEvent *even
static int screen_opengl_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
+ OGLRender *oglrender;
int anim= RNA_boolean_get(op->ptr, "animation");
if(!screen_opengl_render_init(C, op))
return OPERATOR_CANCELLED;
- if(!anim) {
- /* render image */
- screen_opengl_render_apply(op->customdata);
- screen_opengl_render_end(C, op->customdata);
- screen_set_image_output(C, event->x, event->y);
-
- return OPERATOR_FINISHED;
- }
- else {
- OGLRender *oglrender= op->customdata;
-
+ if(anim) {
if(!screen_opengl_render_anim_initialize(C, op))
return OPERATOR_CANCELLED;
-
- screen_set_image_output(C, event->x, event->y);
-
- WM_event_add_modal_handler(C, op);
- oglrender->timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f);
-
- return OPERATOR_RUNNING_MODAL;
}
+
+ oglrender= op->customdata;
+ screen_set_image_output(C, event->x, event->y);
+
+ WM_event_add_modal_handler(C, op);
+ oglrender->timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f);
+
+ return OPERATOR_RUNNING_MODAL;
}
/* executes blocking render */
static int screen_opengl_render_exec(bContext *C, wmOperator *op)
{
- int anim= RNA_boolean_get(op->ptr, "animation");
+ const short is_animation= RNA_boolean_get(op->ptr, "animation");
if(!screen_opengl_render_init(C, op))
return OPERATOR_CANCELLED;
- if(!anim) { /* same as invoke */
+ if(!is_animation) { /* same as invoke */
/* render image */
screen_opengl_render_apply(op->customdata);
screen_opengl_render_end(C, op->customdata);
@@ -495,7 +555,8 @@ void RENDER_OT_opengl(wmOperatorType *ot)
ot->poll= ED_operator_screenactive;
- RNA_def_boolean(ot->srna, "animation", 0, "Animation", "");
+ RNA_def_boolean(ot->srna, "animation", 0, "Animation", "Render files from the animation range of this scene");
+ RNA_def_boolean(ot->srna, "write_still", 0, "Write Image", "Save rendered the image to the output path (used only when animation is disabled)");
RNA_def_boolean(ot->srna, "view_context", 1, "View Context", "Use the current 3D view for rendering, else use scene settings.");
}
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index 71bee8c5b08..d635a799ec1 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -45,10 +45,12 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "DNA_world_types.h"
#include "DNA_camera_types.h"
#include "DNA_material_types.h"
+#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_lamp_types.h"
#include "DNA_space_types.h"
@@ -94,7 +96,7 @@
#define PR_YMAX 195
/* XXX */
-static int qtest() {return 0;}
+static int qtest(void) {return 0;}
/* XXX */
ImBuf* get_brush_icon(Brush *brush)
@@ -111,7 +113,7 @@ ImBuf* get_brush_icon(Brush *brush)
// first use the path directly to try and load the file
BLI_strncpy(path, brush->icon_filepath, sizeof(brush->icon_filepath));
- BLI_path_abs(path, G.sce);
+ BLI_path_abs(path, G.main->name);
brush->icon_imbuf= IMB_loadiffname(path, flags);
@@ -121,7 +123,7 @@ ImBuf* get_brush_icon(Brush *brush)
path[0]= 0;
- BLI_make_file_string(G.sce, path, folder, brush->icon_filepath);
+ BLI_make_file_string(G.main->name, path, folder, brush->icon_filepath);
if (path[0])
brush->icon_imbuf= IMB_loadiffname(path, flags);
@@ -148,6 +150,10 @@ typedef struct ShaderPreview {
ID *parent;
MTex *slot;
+ /* node materials need full copy during preview render, glsl uses it too */
+ Material *matcopy;
+ float col[4]; /* active object color */
+
int sizex, sizey;
unsigned int *pr_rect;
int pr_method;
@@ -190,7 +196,7 @@ void draw_tex_crop(Tex *tex)
}
/* temporal abuse; if id_code is -1 it only does texture.... solve! */
-void BIF_preview_changed(short id_code)
+void BIF_preview_changed(short UNUSED(id_code))
{
#if 0
ScrArea *sa;
@@ -306,6 +312,32 @@ static Object *find_object(ListBase *lb, const char *name)
return ob;
}
+static int preview_mat_has_sss(Material *mat, bNodeTree *ntree)
+{
+ if(mat) {
+ if(mat->sss_flag & MA_DIFF_SSS)
+ return 1;
+ if(mat->nodetree)
+ if( preview_mat_has_sss(NULL, mat->nodetree))
+ return 1;
+ }
+ else if(ntree) {
+ bNode *node;
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type==NODE_GROUP && node->id) {
+ if( preview_mat_has_sss(NULL, (bNodeTree *)node->id))
+ return 1;
+ }
+ else if(node->id && ELEM(node->type, SH_NODE_MATERIAL, SH_NODE_MATERIAL_EXT)) {
+ mat= (Material *)node->id;
+ if(mat->sss_flag & MA_DIFF_SSS)
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
/* call this with a pointer to initialize preview scene */
/* call this with NULL to restore assigned ID pointers in preview scene */
static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPreview *sp)
@@ -317,6 +349,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
sce= pr_main->scene.first;
if(sce) {
+
/* this flag tells render to not execute depsgraph or ipos etc */
sce->r.scemode |= R_PREVIEWBUTS;
/* set world always back, is used now */
@@ -328,10 +361,18 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
}
sce->r.color_mgt_flag = scene->r.color_mgt_flag;
+
+ /* prevent overhead for small renders and icons (32) */
+ if(id && sp->sizex < 40)
+ sce->r.xparts= sce->r.yparts= 1;
+ else
+ sce->r.xparts= sce->r.yparts= 4;
+
/* exception: don't color manage texture previews or icons */
- if((sp && sp->pr_method==PR_ICON_RENDER) || id_type == ID_TE)
+ if((id && sp->pr_method==PR_ICON_RENDER) || id_type == ID_TE)
sce->r.color_mgt_flag &= ~R_COLOR_MANAGEMENT;
- if((sp && sp->pr_method==PR_ICON_RENDER) && id_type != ID_WO)
+
+ if((id && sp->pr_method==PR_ICON_RENDER) && id_type != ID_WO)
sce->r.alphamode= R_ALPHAPREMUL;
else
sce->r.alphamode= R_ADDSKY;
@@ -340,12 +381,21 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
strcpy(sce->r.engine, scene->r.engine);
if(id_type==ID_MA) {
- Material *mat= (Material *)id;
+ Material *mat= NULL, *origmat= (Material *)id;
if(id) {
+ /* work on a copy */
+ mat= localize_material(origmat);
+ sp->matcopy= mat;
+ BLI_addtail(&pr_main->mat, mat);
+
init_render_material(mat, 0, NULL); /* call that retrieves mode_l */
end_render_material(mat);
+ /* un-useful option */
+ if(sp->pr_method==PR_ICON_RENDER)
+ mat->shade_flag &= ~MA_OBCOLOR;
+
/* turn on raytracing if needed */
if(mat->mode_l & MA_RAYMIRROR)
sce->r.mode |= R_RAYTRACE;
@@ -353,7 +403,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
sce->r.mode |= R_RAYTRACE;
if((mat->mode_l & MA_RAYTRANSP) && (mat->mode_l & MA_TRANSP))
sce->r.mode |= R_RAYTRACE;
- if(mat->sss_flag & MA_DIFF_SSS)
+ if(preview_mat_has_sss(mat, NULL))
sce->r.mode |= R_SSS;
/* turn off fake shadows if needed */
@@ -384,7 +434,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
}
- if(sp && sp->pr_method==PR_ICON_RENDER) {
+ if(sp->pr_method==PR_ICON_RENDER) {
if (mat->material_type == MA_TYPE_HALO) {
sce->lay= 1<<MA_FLAT;
}
@@ -394,16 +444,23 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
}
else {
sce->lay= 1<<mat->pr_type;
- if(mat->nodetree && sp->pr_method==PR_NODE_RENDER)
+ if(mat->nodetree && sp->pr_method==PR_NODE_RENDER) {
+ /* two previews, they get copied by wmJob */
ntreeInitPreview(mat->nodetree, sp->sizex, sp->sizey);
+ ntreeInitPreview(origmat->nodetree, sp->sizex, sp->sizey);
+ }
}
}
else {
sce->r.mode &= ~(R_OSA|R_RAYTRACE|R_SSS);
+
}
for(base= sce->base.first; base; base= base->next) {
if(base->object->id.name[2]=='p') {
+ /* copy over object color, in case material uses it */
+ copy_v4_v4(base->object->col, sp->col);
+
if(ELEM4(base->object->type, OB_MESH, OB_CURVE, OB_SURF, OB_MBALL)) {
/* don't use assign_material, it changed mat->id.us, which shows in the UI */
Material ***matar= give_matarar(base->object);
@@ -428,7 +485,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
if(mat && mat->mtex[0]) {
mat->mtex[0]->tex= tex;
- if(sp && sp->slot)
+ if(tex && sp->slot)
mat->mtex[0]->which_output = sp->slot->which_output;
/* show alpha in this case */
@@ -444,7 +501,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
}
}
- if(tex && tex->nodetree && sp && sp->pr_method==PR_NODE_RENDER)
+ if(tex && tex->nodetree && sp->pr_method==PR_NODE_RENDER)
ntreeInitPreview(tex->nodetree, sp->sizex, sp->sizey);
}
else if(id_type==ID_LA) {
@@ -487,16 +544,16 @@ static int ed_preview_draw_rect(ScrArea *sa, Scene *sce, ID *id, int split, int
Render *re;
RenderResult rres;
char name[32];
- int gamma_correct=0;
+ int do_gamma_correct=0;
int offx=0, newx= rect->xmax-rect->xmin, newy= rect->ymax-rect->ymin;
if (id && GS(id->name) != ID_TE) {
/* exception: don't color manage texture previews - show the raw values */
- if (sce) gamma_correct = sce->r.color_mgt_flag & R_COLOR_MANAGEMENT;
+ if (sce) do_gamma_correct = sce->r.color_mgt_flag & R_COLOR_MANAGEMENT;
}
- if(!split || first) sprintf(name, "Preview %p", sa);
- else sprintf(name, "SecondPreview %p", sa);
+ if(!split || first) sprintf(name, "Preview %p", (void *)sa);
+ else sprintf(name, "SecondPreview %p", (void *)sa);
if(split) {
if(first) {
@@ -518,7 +575,7 @@ static int ed_preview_draw_rect(ScrArea *sa, Scene *sce, ID *id, int split, int
newrect->xmax= MAX2(newrect->xmax, rect->xmin + rres.rectx + offx);
newrect->ymax= MAX2(newrect->ymax, rect->ymin + rres.recty);
- glaDrawPixelsSafe_to32(rect->xmin+offx, rect->ymin, rres.rectx, rres.recty, rres.rectx, rres.rectf, gamma_correct);
+ glaDrawPixelsSafe_to32(rect->xmin+offx, rect->ymin, rres.rectx, rres.recty, rres.rectx, rres.rectf, do_gamma_correct);
RE_ReleaseResultImage(re);
return 1;
@@ -562,7 +619,7 @@ void ED_preview_draw(const bContext *C, void *idp, void *parentp, void *slotp, r
sbuts->preview= 0;
ok= 0;
}
-
+
if(ok==0) {
ED_preview_shader_job(C, sa, id, parent, slot, newx, newy, PR_BUTS_RENDER);
}
@@ -571,7 +628,7 @@ void ED_preview_draw(const bContext *C, void *idp, void *parentp, void *slotp, r
/* ******************************** Icon Preview **************************** */
-void ED_preview_icon_draw(const bContext *C, void *idp, void *arg1, void *arg2, rcti *rect)
+void ED_preview_icon_draw(const bContext *UNUSED(C), void *UNUSED(idp), void *UNUSED(arg1), void *UNUSED(arg2), rcti *UNUSED(rect))
{
}
@@ -603,7 +660,7 @@ void view3d_previewrender_progress(RenderResult *rr, volatile rcti *renrect)
}
-void BIF_view3d_previewrender_signal(ScrArea *sa, short signal)
+void BIF_view3d_previewrender_signal(ScrArea *UNUSED(sa), short UNUSED(signal))
{
#if 0
View3D *v3d= sa->spacedata.first;
@@ -625,7 +682,7 @@ void BIF_view3d_previewrender_signal(ScrArea *sa, short signal)
#endif
}
-void BIF_view3d_previewrender_free(View3D *v3d)
+void BIF_view3d_previewrender_free(View3D *UNUSED(v3d))
{
#if 0
if(v3d->ri) {
@@ -683,7 +740,7 @@ static int view3d_previewrender_get_rects(ScrArea *sa, rctf *viewplane, RenderIn
}
/* called before a panel gets moved/scaled, makes sure we can see through */
-void BIF_view3d_previewrender_clear(ScrArea *sa)
+void BIF_view3d_previewrender_clear(ScrArea *UNUSED(sa))
{
#if 0
View3D *v3d= sa->spacedata.first;
@@ -736,7 +793,7 @@ void BIF_view3d_previewrender(Main *bmain, Scene *scene, ScrArea *sa)
ri->status= 0;
- sprintf(name, "View3dPreview %p", sa);
+ sprintf(name, "View3dPreview %p", (void *)sa);
re= ri->re= RE_NewRender(name);
//RE_display_draw_cb(re, view3d_previewrender_progress);
//RE_stats_draw_cb(re, view3d_previewrender_stats);
@@ -844,7 +901,7 @@ void BIF_view3d_previewrender(Main *bmain, Scene *scene, ScrArea *sa)
}
/* in panel space! */
-static void view3d_previewdraw_rect(ScrArea *sa, uiBlock *block, RenderInfo *ri)
+static void view3d_previewdraw_rect(ScrArea *UNUSED(sa), uiBlock *UNUSED(block), RenderInfo *ri)
{
// rctf dispf;
@@ -887,7 +944,7 @@ void BIF_view3d_previewdraw(struct ScrArea *sa, struct uiBlock *block)
/* **************************** new shader preview system ****************** */
/* inside thread, called by renderer, sets job update value */
-static void shader_preview_draw(void *spv, RenderResult *rr, volatile struct rcti *rect)
+static void shader_preview_draw(void *spv, RenderResult *UNUSED(rr), volatile struct rcti *UNUSED(rect))
{
ShaderPreview *sp= spv;
@@ -898,15 +955,21 @@ static void shader_preview_draw(void *spv, RenderResult *rr, volatile struct rct
static int shader_preview_break(void *spv)
{
ShaderPreview *sp= spv;
-
+
return *(sp->stop);
}
/* outside thread, called before redraw notifiers, it moves finished preview over */
static void shader_preview_updatejob(void *spv)
{
-// ShaderPreview *sp= spv;
+ ShaderPreview *sp= spv;
+ if(sp->id && GS(sp->id->name) == ID_MA) {
+ Material *mat= (Material *)sp->id;
+
+ if(sp->matcopy && mat->nodetree && sp->matcopy->nodetree)
+ ntreeLocalSync(sp->matcopy->nodetree, mat->nodetree);
+ }
}
static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int first)
@@ -917,7 +980,7 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
short idtype= GS(id->name);
char name[32];
int sizex;
-
+
/* get the stuff from the builtin preview dbase */
sce= preview_prepare_scene(sp->scene, id, idtype, sp); // XXX sizex
if(sce==NULL) return;
@@ -941,7 +1004,7 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
else if(sp->pr_method==PR_NODE_RENDER) {
if(idtype == ID_MA) sce->r.scemode |= R_MATNODE_PREVIEW;
else if(idtype == ID_TE) sce->r.scemode |= R_TEXNODE_PREVIEW;
- sce->r.mode |= R_OSA;
+ sce->r.mode &= ~R_OSA;
}
else { /* PR_BUTS_RENDER */
sce->r.mode |= R_OSA;
@@ -970,12 +1033,14 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
((Camera *)sce->camera->data)->lens *= (float)sp->sizey/(float)sizex;
/* entire cycle for render engine */
- RE_PreviewRender(re, G.main, sce);
+ RE_PreviewRender(re, pr_main, sce);
((Camera *)sce->camera->data)->lens= oldlens;
/* handle results */
if(sp->pr_method==PR_ICON_RENDER) {
+ // char *rct= (char *)(sp->pr_rect + 32*16 + 16);
+
if(sp->pr_rect)
RE_ResultGet32(re, sp->pr_rect);
}
@@ -987,7 +1052,7 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
}
/* unassign the pointers, reset vars */
- preview_prepare_scene(sp->scene, NULL, GS(id->name), NULL);
+ preview_prepare_scene(sp->scene, NULL, GS(id->name), sp);
}
/* runs inside thread for material and icons */
@@ -1012,6 +1077,16 @@ static void shader_preview_free(void *customdata)
{
ShaderPreview *sp= customdata;
+ if(sp->matcopy) {
+ /* node previews */
+ shader_preview_updatejob(sp);
+
+ /* get rid of copied material */
+ BLI_remlink(&pr_main->mat, sp->matcopy);
+ free_material(sp->matcopy);
+ MEM_freeN(sp->matcopy);
+ }
+
MEM_freeN(sp);
}
@@ -1085,14 +1160,13 @@ static void icon_preview_startjob(void *customdata, short *stop, short *do_updat
if(idtype == ID_IM) {
Image *ima= (Image*)id;
ImBuf *ibuf= NULL;
- ImageUser iuser;
+ ImageUser iuser= {0};
/* ima->ok is zero when Image cannot load */
if(ima==NULL || ima->ok==0)
return;
/* setup dummy image user */
- memset(&iuser, 0, sizeof(ImageUser));
iuser.ok= iuser.framenr= 1;
iuser.scene= sp->scene;
@@ -1141,7 +1215,7 @@ static void icon_preview_startjob(void *customdata, short *stop, short *do_updat
/* use same function for icon & shader, so the job manager
does not run two of them at the same time. */
-static void common_preview_startjob(void *customdata, short *stop, short *do_update, float *progress)
+static void common_preview_startjob(void *customdata, short *stop, short *do_update, float *UNUSED(progress))
{
ShaderPreview *sp= customdata;
@@ -1165,8 +1239,9 @@ void ED_preview_icon_job(const bContext *C, void *owner, ID *id, unsigned int *r
{
wmJob *steve;
ShaderPreview *sp;
-
- steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, "Icon Preview", WM_JOB_EXCL_RENDER);
+
+ /* suspended start means it starts after 1 timer step, see WM_jobs_timer below */
+ steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, "Icon Preview", WM_JOB_EXCL_RENDER|WM_JOB_SUSPEND);
sp= MEM_callocN(sizeof(ShaderPreview), "shader preview");
/* customdata for preview thread */
@@ -1177,10 +1252,10 @@ void ED_preview_icon_job(const bContext *C, void *owner, ID *id, unsigned int *r
sp->pr_method= PR_ICON_RENDER;
sp->pr_rect= rect;
sp->id = id;
-
+
/* setup job */
WM_jobs_customdata(steve, sp, shader_preview_free);
- WM_jobs_timer(steve, 0.1, NC_MATERIAL, NC_MATERIAL);
+ WM_jobs_timer(steve, 0.25, NC_MATERIAL, NC_MATERIAL);
WM_jobs_callbacks(steve, common_preview_startjob, NULL, NULL, common_preview_endjob);
WM_jobs_start(CTX_wm_manager(C), steve);
@@ -1188,6 +1263,7 @@ void ED_preview_icon_job(const bContext *C, void *owner, ID *id, unsigned int *r
void ED_preview_shader_job(const bContext *C, void *owner, ID *id, ID *parent, MTex *slot, int sizex, int sizey, int method)
{
+ Object *ob= CTX_data_active_object(C);
wmJob *steve;
ShaderPreview *sp;
@@ -1203,6 +1279,8 @@ void ED_preview_shader_job(const bContext *C, void *owner, ID *id, ID *parent, M
sp->id = id;
sp->parent= parent;
sp->slot= slot;
+ if(ob && ob->totcol) copy_v4_v4(sp->col, ob->col);
+ else sp->col[0]= sp->col[1]= sp->col[2]= sp->col[3]= 1.0f;
/* setup job */
WM_jobs_customdata(steve, sp, shader_preview_free);
diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c
index debd13c8d99..df32a0619e3 100644
--- a/source/blender/editors/render/render_shading.c
+++ b/source/blender/editors/render/render_shading.c
@@ -38,6 +38,12 @@
#include "DNA_space_types.h"
#include "DNA_world_types.h"
+#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_editVert.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+
#include "BKE_animsys.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
@@ -57,11 +63,6 @@
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
-#include "BLI_blenlib.h"
-#include "BLI_math.h"
-#include "BLI_editVert.h"
-#include "BLI_listbase.h"
-
#include "GPU_material.h"
#include "RNA_access.h"
@@ -79,7 +80,7 @@
#include "render_intern.h" // own include
/***************************** Updates ***********************************
- * ED_render_id_flush_update gets called from DAG_id_flush_update, to do *
+ * ED_render_id_flush_update gets called from DAG_id_tag_update, to do *
* editor level updates when the ID changes. when these ID blocks are in *
* the dependency graph, we can get rid of the manual dependency checks */
@@ -116,7 +117,7 @@ static int nodes_use_tex(bNodeTree *ntree, Tex *tex)
return 0;
}
-static void material_changed(Main *bmain, Material *ma)
+static void material_changed(Main *UNUSED(bmain), Material *ma)
{
/* icons */
BKE_icon_changed(BKE_icon_getid(&ma->id));
@@ -208,7 +209,7 @@ static void image_changed(Main *bmain, Image *ima)
texture_changed(bmain, tex);
}
-static void scene_changed(Main *bmain, Scene *sce)
+static void scene_changed(Main *bmain, Scene *UNUSED(scene))
{
Object *ob;
Material *ma;
@@ -254,7 +255,7 @@ void ED_render_id_flush_update(Main *bmain, ID *id)
/********************** material slot operators *********************/
-static int material_slot_add_exec(bContext *C, wmOperator *op)
+static int material_slot_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
@@ -263,6 +264,7 @@ static int material_slot_add_exec(bContext *C, wmOperator *op)
object_add_material_slot(ob);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_OB_SHADING, ob);
return OPERATOR_FINISHED;
}
@@ -288,8 +290,16 @@ static int material_slot_remove_exec(bContext *C, wmOperator *op)
if(!ob)
return OPERATOR_CANCELLED;
+ /* Removing material slots in edit mode screws things up, see bug #21822.*/
+ if(ob == CTX_data_edit_object(C)) {
+ BKE_report(op->reports, RPT_ERROR, "Unable to remove material slot in edit mode.");
+ return OPERATOR_CANCELLED;
+ }
+
object_remove_material_slot(ob);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_OB_SHADING, ob);
return OPERATOR_FINISHED;
}
@@ -308,7 +318,7 @@ void OBJECT_OT_material_slot_remove(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int material_slot_assign_exec(bContext *C, wmOperator *op)
+static int material_slot_assign_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
@@ -347,7 +357,7 @@ static int material_slot_assign_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
return OPERATOR_FINISHED;
@@ -391,36 +401,38 @@ static int material_slot_de_select(bContext *C, int select)
BezTriple *bezt;
int a;
- for(nu= nurbs->first; nu; nu=nu->next) {
- if(nu->mat_nr==ob->actcol-1) {
- if(nu->bezt) {
- a= nu->pntsu;
- bezt= nu->bezt;
- while(a--) {
- if(bezt->hide==0) {
- if(select) {
- bezt->f1 |= SELECT;
- bezt->f2 |= SELECT;
- bezt->f3 |= SELECT;
- }
- else {
- bezt->f1 &= ~SELECT;
- bezt->f2 &= ~SELECT;
- bezt->f3 &= ~SELECT;
+ if(nurbs) {
+ for(nu= nurbs->first; nu; nu=nu->next) {
+ if(nu->mat_nr==ob->actcol-1) {
+ if(nu->bezt) {
+ a= nu->pntsu;
+ bezt= nu->bezt;
+ while(a--) {
+ if(bezt->hide==0) {
+ if(select) {
+ bezt->f1 |= SELECT;
+ bezt->f2 |= SELECT;
+ bezt->f3 |= SELECT;
+ }
+ else {
+ bezt->f1 &= ~SELECT;
+ bezt->f2 &= ~SELECT;
+ bezt->f3 &= ~SELECT;
+ }
}
+ bezt++;
}
- bezt++;
}
- }
- else if(nu->bp) {
- a= nu->pntsu*nu->pntsv;
- bp= nu->bp;
- while(a--) {
- if(bp->hide==0) {
- if(select) bp->f1 |= SELECT;
- else bp->f1 &= ~SELECT;
+ else if(nu->bp) {
+ a= nu->pntsu*nu->pntsv;
+ bp= nu->bp;
+ while(a--) {
+ if(bp->hide==0) {
+ if(select) bp->f1 |= SELECT;
+ else bp->f1 &= ~SELECT;
+ }
+ bp++;
}
- bp++;
}
}
}
@@ -432,7 +444,7 @@ static int material_slot_de_select(bContext *C, int select)
return OPERATOR_FINISHED;
}
-static int material_slot_select_exec(bContext *C, wmOperator *op)
+static int material_slot_select_exec(bContext *C, wmOperator *UNUSED(op))
{
return material_slot_de_select(C, 1);
}
@@ -451,7 +463,7 @@ void OBJECT_OT_material_slot_select(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int material_slot_deselect_exec(bContext *C, wmOperator *op)
+static int material_slot_deselect_exec(bContext *C, wmOperator *UNUSED(op))
{
return material_slot_de_select(C, 0);
}
@@ -471,7 +483,7 @@ void OBJECT_OT_material_slot_deselect(wmOperatorType *ot)
}
-static int material_slot_copy_exec(bContext *C, wmOperator *op)
+static int material_slot_copy_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Material ***matar;
@@ -512,7 +524,7 @@ void OBJECT_OT_material_slot_copy(wmOperatorType *ot)
/********************** new material operator *********************/
-static int new_material_exec(bContext *C, wmOperator *op)
+static int new_material_exec(bContext *C, wmOperator *UNUSED(op))
{
Material *ma= CTX_data_pointer_get_type(C, "material", &RNA_Material).data;
PointerRNA ptr, idptr;
@@ -558,7 +570,7 @@ void MATERIAL_OT_new(wmOperatorType *ot)
/********************** new texture operator *********************/
-static int new_texture_exec(bContext *C, wmOperator *op)
+static int new_texture_exec(bContext *C, wmOperator *UNUSED(op))
{
Tex *tex= CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data;
PointerRNA ptr, idptr;
@@ -604,7 +616,7 @@ void TEXTURE_OT_new(wmOperatorType *ot)
/********************** new world operator *********************/
-static int new_world_exec(bContext *C, wmOperator *op)
+static int new_world_exec(bContext *C, wmOperator *UNUSED(op))
{
World *wo= CTX_data_pointer_get_type(C, "world", &RNA_World).data;
PointerRNA ptr, idptr;
@@ -650,7 +662,7 @@ void WORLD_OT_new(wmOperatorType *ot)
/********************** render layer operators *********************/
-static int render_layer_add_exec(bContext *C, wmOperator *op)
+static int render_layer_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
@@ -676,7 +688,7 @@ void SCENE_OT_render_layer_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int render_layer_remove_exec(bContext *C, wmOperator *op)
+static int render_layer_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
SceneRenderLayer *rl;
@@ -725,12 +737,12 @@ void SCENE_OT_render_layer_remove(wmOperatorType *ot)
static int texture_slot_move(bContext *C, wmOperator *op)
{
ID *id= CTX_data_pointer_get_type(C, "texture_slot", &RNA_TextureSlot).id.data;
- Material *ma = (Material *)id;
if(id) {
MTex **mtex_ar, *mtexswap;
short act;
int type= RNA_enum_get(op->ptr, "type");
+ struct AnimData *adt= BKE_animdata_from_id(id);
give_active_mtex(id, &mtex_ar, &act);
@@ -740,9 +752,9 @@ static int texture_slot_move(bContext *C, wmOperator *op)
mtex_ar[act] = mtex_ar[act-1];
mtex_ar[act-1] = mtexswap;
- BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, act-1, -1, 0);
- BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, act, act-1, 0);
- BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, -1, act, 0);
+ BKE_animdata_fix_paths_rename(id, adt, "texture_slots", NULL, NULL, act-1, -1, 0);
+ BKE_animdata_fix_paths_rename(id, adt, "texture_slots", NULL, NULL, act, act-1, 0);
+ BKE_animdata_fix_paths_rename(id, adt, "texture_slots", NULL, NULL, -1, act, 0);
if(GS(id->name)==ID_MA) {
Material *ma= (Material *)id;
@@ -762,9 +774,9 @@ static int texture_slot_move(bContext *C, wmOperator *op)
mtex_ar[act] = mtex_ar[act+1];
mtex_ar[act+1] = mtexswap;
- BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, act+1, -1, 0);
- BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, act, act+1, 0);
- BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, -1, act, 0);
+ BKE_animdata_fix_paths_rename(id, adt, "texture_slots", NULL, NULL, act+1, -1, 0);
+ BKE_animdata_fix_paths_rename(id, adt, "texture_slots", NULL, NULL, act, act+1, 0);
+ BKE_animdata_fix_paths_rename(id, adt, "texture_slots", NULL, NULL, -1, act, 0);
if(GS(id->name)==ID_MA) {
Material *ma= (Material *)id;
@@ -779,6 +791,7 @@ static int texture_slot_move(bContext *C, wmOperator *op)
}
}
+ DAG_id_tag_update(id, 0);
WM_event_add_notifier(C, NC_TEXTURE, CTX_data_scene(C));
}
@@ -826,7 +839,7 @@ static int save_envmap(wmOperator *op, Scene *scene, EnvMap *env, char *str, int
dx= env->cube[1]->x;
if (env->type == ENV_CUBE) {
- ibuf = IMB_allocImBuf(3*dx, 2*dx, 24, IB_rectfloat, 0);
+ ibuf = IMB_allocImBuf(3*dx, 2*dx, 24, IB_rectfloat);
IMB_rectcpy(ibuf, env->cube[0], 0, 0, 0, 0, dx, dx);
IMB_rectcpy(ibuf, env->cube[1], dx, 0, 0, 0, dx, dx);
@@ -836,15 +849,19 @@ static int save_envmap(wmOperator *op, Scene *scene, EnvMap *env, char *str, int
IMB_rectcpy(ibuf, env->cube[5], 2*dx, dx, 0, 0, dx, dx);
}
else if (env->type == ENV_PLANE) {
- ibuf = IMB_allocImBuf(dx, dx, 24, IB_rectfloat, 0);
+ ibuf = IMB_allocImBuf(dx, dx, 24, IB_rectfloat);
IMB_rectcpy(ibuf, env->cube[1], 0, 0, 0, 0, dx, dx);
}
+ else {
+ BKE_report(op->reports, RPT_ERROR, "Invalid environment map type");
+ return OPERATOR_CANCELLED;
+ }
if (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT)
ibuf->profile = IB_PROFILE_LINEAR_RGB;
/* to save, we first get absolute path */
- BLI_path_abs(str, G.sce);
+ BLI_path_abs(str, G.main->name);
if (BKE_write_ibuf(scene, ibuf, str, imtype, scene->r.subimtype, scene->r.quality)) {
retval = OPERATOR_FINISHED;
@@ -855,7 +872,7 @@ static int save_envmap(wmOperator *op, Scene *scene, EnvMap *env, char *str, int
}
/* in case we were saving with relative paths, change back again */
if(relative)
- BLI_path_rel(str, G.sce);
+ BLI_path_rel(str, G.main->name);
IMB_freeImBuf(ibuf);
ibuf = NULL;
@@ -888,7 +905,7 @@ static int envmap_save_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int envmap_save_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int envmap_save_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
//Scene *scene= CTX_data_scene(C);
@@ -900,7 +917,7 @@ static int envmap_save_invoke(bContext *C, wmOperator *op, wmEvent *event)
//RNA_enum_set(op->ptr, "file_type", scene->r.imtype);
- RNA_string_set(op->ptr, "filepath", G.sce);
+ RNA_string_set(op->ptr, "filepath", G.main->name);
WM_event_add_fileselect(C, op);
return OPERATOR_RUNNING_MODAL;
@@ -940,7 +957,7 @@ void TEXTURE_OT_envmap_save(wmOperatorType *ot)
WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE, FILE_SPECIAL, FILE_SAVE, WM_FILESEL_FILEPATH|WM_FILESEL_RELPATH);
}
-static int envmap_clear_exec(bContext *C, wmOperator *op)
+static int envmap_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Tex *tex= CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data;
@@ -980,7 +997,7 @@ void TEXTURE_OT_envmap_clear(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int envmap_clear_all_exec(bContext *C, wmOperator *op)
+static int envmap_clear_all_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain = CTX_data_main(C);
Tex *tex;
@@ -1012,7 +1029,7 @@ void TEXTURE_OT_envmap_clear_all(wmOperatorType *ot)
/********************** material operators *********************/
/* material copy/paste */
-static int copy_material_exec(bContext *C, wmOperator *op)
+static int copy_material_exec(bContext *C, wmOperator *UNUSED(op))
{
Material *ma= CTX_data_pointer_get_type(C, "material", &RNA_Material).data;
@@ -1040,7 +1057,7 @@ void MATERIAL_OT_copy(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int paste_material_exec(bContext *C, wmOperator *op)
+static int paste_material_exec(bContext *C, wmOperator *UNUSED(op))
{
Material *ma= CTX_data_pointer_get_type(C, "material", &RNA_Material).data;
@@ -1140,7 +1157,7 @@ void paste_mtex_copybuf(ID *id)
}
-static int copy_mtex_exec(bContext *C, wmOperator *op)
+static int copy_mtex_exec(bContext *C, wmOperator *UNUSED(op))
{
ID *id= CTX_data_pointer_get_type(C, "texture_slot", &RNA_TextureSlot).id.data;
@@ -1179,7 +1196,7 @@ void TEXTURE_OT_slot_copy(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int paste_mtex_exec(bContext *C, wmOperator *op)
+static int paste_mtex_exec(bContext *C, wmOperator *UNUSED(op))
{
ID *id= CTX_data_pointer_get_type(C, "texture_slot", &RNA_TextureSlot).id.data;
diff --git a/source/blender/editors/screen/CMakeLists.txt b/source/blender/editors/screen/CMakeLists.txt
index f7dfd81dba9..7c43d506a89 100644
--- a/source/blender/editors/screen/CMakeLists.txt
+++ b/source/blender/editors/screen/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenfont
../../blenkernel
@@ -33,8 +31,15 @@ SET(INC
../../../../intern/guardedalloc
)
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ area.c
+ glutil.c
+ screen_context.c
+ screen_edit.c
+ screen_ops.c
+ screendump.c
+
+ screen_intern.h
+)
-BLENDERLIB(bf_editor_screen "${SRC}" "${INC}")
+blender_add_lib(bf_editor_screen "${SRC}" "${INC}")
diff --git a/source/blender/editors/screen/Makefile b/source/blender/editors/screen/Makefile
deleted file mode 100644
index 2ab35a32888..00000000000
--- a/source/blender/editors/screen/Makefile
+++ /dev/null
@@ -1,67 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_screen
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../render/extern/include
-CPPFLAGS += -I../../blenfont
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
-
-ifeq ($(WITH_OPENEXR), true)
- CPPFLAGS += -DWITH_OPENEXR
-endif
-
-ifeq ($(OS), darwin)
- ifeq ($(WITH_BF_OPENMP), true)
- CPPFLAGS += -DPARALLEL=1
- endif
-endif
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index d0361c5fa01..4784f19012e 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -36,6 +36,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -144,7 +145,7 @@ void ED_area_do_refresh(bContext *C, ScrArea *sa)
/* based on screen region draw tags, set draw tags in azones, and future region tabs etc */
/* only exported for WM */
-void ED_area_overdraw_flush(bContext *C, ScrArea *sa, ARegion *ar)
+void ED_area_overdraw_flush(ScrArea *sa, ARegion *ar)
{
AZone *az;
@@ -163,31 +164,26 @@ void ED_area_overdraw_flush(bContext *C, ScrArea *sa, ARegion *ar)
static void area_draw_azone(short x1, short y1, short x2, short y2)
{
- float xmin = x1;
- float xmax = x2-2;
- float ymin = y1-1;
- float ymax = y2-3;
-
- float dx= 0.3f*(xmax-xmin);
- float dy= 0.3f*(ymax-ymin);
+ int dx= floor(0.3f*(x2-x1));
+ int dy= floor(0.3f*(y2-y1));
glColor4ub(255, 255, 255, 180);
- fdrawline(xmin, ymax, xmax, ymin);
+ fdrawline(x1, y2, x2, y1);
glColor4ub(255, 255, 255, 130);
- fdrawline(xmin, ymax-dy, xmax-dx, ymin);
+ fdrawline(x1, y2-dy, x2-dx, y1);
glColor4ub(255, 255, 255, 80);
- fdrawline(xmin, ymax-2*dy, xmax-2*dx, ymin);
+ fdrawline(x1, y2-2*dy, x2-2*dx, y1);
glColor4ub(0, 0, 0, 210);
- fdrawline(xmin, ymax+1, xmax+1, ymin);
+ fdrawline(x1, y2+1, x2+1, y1);
glColor4ub(0, 0, 0, 180);
- fdrawline(xmin, ymax-dy+1, xmax-dx+1, ymin);
+ fdrawline(x1, y2-dy+1, x2-dx+1, y1);
glColor4ub(0, 0, 0, 150);
- fdrawline(xmin, ymax-2*dy+1, xmax-2*dx+1, ymin);
+ fdrawline(x1, y2-2*dy+1, x2-2*dx+1, y1);
}
-static void region_draw_azone(ScrArea *sa, AZone *az)
+static void region_draw_azone(AZone *az)
{
GLUquadricObj *qobj = NULL;
short midx = az->x1 + (az->x2 - az->x1)/2;
@@ -247,7 +243,7 @@ void ED_area_overdraw(bContext *C)
if(az->type==AZONE_AREA) {
area_draw_azone(az->x1, az->y1, az->x2, az->y2);
} else if(az->type==AZONE_REGION) {
- region_draw_azone(sa, az);
+ region_draw_azone(az);
}
az->do_draw= 0;
@@ -338,7 +334,7 @@ void ED_region_do_draw(bContext *C, ARegion *ar)
glClear(GL_COLOR_BUFFER_BIT);
UI_ThemeColor(TH_TEXT);
- BLF_draw_default(20, 8, 0.0f, ar->headerstr);
+ BLF_draw_default(20, 8, 0.0f, ar->headerstr, 65535); /* XXX, use real length */
}
else if(at->draw) {
at->draw(C, ar);
@@ -405,6 +401,19 @@ void ED_area_tag_redraw(ScrArea *sa)
ED_region_tag_redraw(ar);
}
+void ED_area_tag_redraw_regiontype(ScrArea *sa, int regiontype)
+{
+ ARegion *ar;
+
+ if(sa) {
+ for(ar= sa->regionbase.first; ar; ar= ar->next) {
+ if(ar->regiontype == regiontype) {
+ ED_region_tag_redraw(ar);
+ }
+ }
+ }
+}
+
void ED_area_tag_refresh(ScrArea *sa)
{
if(sa)
@@ -437,7 +446,6 @@ void ED_area_headerprint(ScrArea *sa, const char *str)
/* ************************************************************ */
-#define AZONESPOT 12
static void area_azone_initialize(ScrArea *sa)
{
AZone *az;
@@ -451,8 +459,8 @@ static void area_azone_initialize(ScrArea *sa)
az->type= AZONE_AREA;
az->x1= sa->totrct.xmin;
az->y1= sa->totrct.ymin;
- az->x2= sa->totrct.xmin + AZONESPOT-1;
- az->y2= sa->totrct.ymin + AZONESPOT-1;
+ az->x2= sa->totrct.xmin + AZONESPOT;
+ az->y2= sa->totrct.ymin + AZONESPOT;
BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y2);
az= (AZone *)MEM_callocN(sizeof(AZone), "actionzone");
@@ -460,13 +468,13 @@ static void area_azone_initialize(ScrArea *sa)
az->type= AZONE_AREA;
az->x1= sa->totrct.xmax+1;
az->y1= sa->totrct.ymax+1;
- az->x2= sa->totrct.xmax-AZONESPOT+1;
- az->y2= sa->totrct.ymax-AZONESPOT+1;
+ az->x2= sa->totrct.xmax-AZONESPOT;
+ az->y2= sa->totrct.ymax-AZONESPOT;
BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y2);
}
#define AZONEPAD_EDGE 4
-#define AZONEPAD_ICON 8
+#define AZONEPAD_ICON 9
static void region_azone_edge(AZone *az, ARegion *ar)
{
switch(az->edge) {
@@ -817,7 +825,7 @@ static void area_calc_totrct(ScrArea *sa, int sizex, int sizey)
/* used for area initialize below */
-static void region_subwindow(wmWindowManager *wm, wmWindow *win, ARegion *ar)
+static void region_subwindow(wmWindow *win, ARegion *ar)
{
if(ar->flag & (RGN_FLAG_HIDDEN|RGN_FLAG_TOO_SMALL)) {
if(ar->swinid)
@@ -908,7 +916,7 @@ void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
/* region windows, default and own handlers */
for(ar= sa->regionbase.first; ar; ar= ar->next) {
- region_subwindow(wm, win, ar);
+ region_subwindow(win, ar);
if(ar->swinid) {
/* default region handlers */
@@ -931,7 +939,7 @@ void ED_region_init(bContext *C, ARegion *ar)
// ARegionType *at= ar->type;
/* refresh can be called before window opened */
- region_subwindow(CTX_wm_manager(C), CTX_wm_window(C), ar);
+ region_subwindow(CTX_wm_window(C), ar);
ar->winx= ar->winrct.xmax - ar->winrct.xmin + 1;
ar->winy= ar->winrct.ymax - ar->winrct.ymin + 1;
@@ -946,7 +954,6 @@ void ED_region_toggle_hidden(bContext *C, ARegion *ar)
ScrArea *sa= CTX_wm_area(C);
ar->flag ^= RGN_FLAG_HIDDEN;
- ar->v2d.flag &= ~V2D_IS_INITIALISED; /* XXX should become hide/unhide api? */
if(ar->flag & RGN_FLAG_HIDDEN)
WM_event_remove_handlers(C, &ar->handlers);
@@ -1090,10 +1097,12 @@ void ED_area_newspace(bContext *C, ScrArea *sa, int type)
/*send space change notifyer*/
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_CHANGED, sa);
-
- ED_area_tag_redraw(sa);
+
ED_area_tag_refresh(sa);
}
+
+ /* also redraw when re-used */
+ ED_area_tag_redraw(sa);
}
void ED_area_prevspace(bContext *C, ScrArea *sa)
@@ -1117,7 +1126,7 @@ void ED_area_prevspace(bContext *C, ScrArea *sa)
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_CHANGED, sa);
}
-static char *editortype_pup(void)
+static const char *editortype_pup(void)
{
return(
"Editor type:%t"
@@ -1152,11 +1161,11 @@ static char *editortype_pup(void)
"|%l"
- "|Console %x18"
+ "|Python Console %x18"
);
}
-static void spacefunc(struct bContext *C, void *arg1, void *arg2)
+static void spacefunc(struct bContext *C, void *UNUSED(arg1), void *UNUSED(arg2))
{
ED_area_newspace(C, CTX_wm_area(C), CTX_wm_area(C)->butspacetype);
ED_area_tag_redraw(CTX_wm_area(C));
@@ -1214,7 +1223,7 @@ int ED_area_header_standardbuttons(const bContext *C, uiBlock *block, int yco)
/************************ standard UI regions ************************/
-void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *context, int contextnr)
+void ED_region_panels(const bContext *C, ARegion *ar, int vertical, const char *context, int contextnr)
{
ScrArea *sa= CTX_wm_area(C);
uiStyle *style= U.uistyles.first;
@@ -1244,7 +1253,7 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex
uiBeginPanels(C, ar);
/* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
for(pt= ar->type->paneltypes.first; pt; pt= pt->next) {
/* verify context */
@@ -1365,7 +1374,7 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex
UI_view2d_totRect_set(v2d, x+V2D_SCROLL_WIDTH, y+V2D_SCROLL_HEIGHT);
/* set the view */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* this does the actual drawing! */
uiEndPanels(C, ar);
@@ -1414,7 +1423,7 @@ void ED_region_header(const bContext *C, ARegion *ar)
glClear(GL_COLOR_BUFFER_BIT);
/* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(C, &ar->v2d);
+ UI_view2d_view_ortho(&ar->v2d);
xco= maxco= 8;
yco= HEADERY-3;
diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c
index 06da91c3e37..9b3a51805e9 100644
--- a/source/blender/editors/screen/glutil.c
+++ b/source/blender/editors/screen/glutil.c
@@ -26,14 +26,14 @@
*/
#include <stdio.h>
-#include <math.h>
#include <string.h>
#include "MEM_guardedalloc.h"
#include "DNA_vec_types.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
+
#include "BKE_colortools.h"
#include "BLI_math.h"
@@ -527,7 +527,8 @@ void glaDrawPixelsTex(float x, float y, int img_w, int img_h, int format, void *
glaDrawPixelsTexScaled(x, y, img_w, img_h, format, rect, 1.0f, 1.0f);
}
-void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int row_w, float *rectf, int gamma_correct)
+/* row_w is unused but kept for completeness */
+void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int UNUSED(row_w), float *rectf, int do_gamma_correct)
{
unsigned char *rect32;
@@ -536,7 +537,7 @@ void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int row_w,
rect32= MEM_mallocN(img_w*img_h*sizeof(int), "temp 32 bits");
- if (gamma_correct) {
+ if (do_gamma_correct) {
floatbuf_to_srgb_byte(rectf, rect32, 0, img_w, 0, img_h, img_w);
} else {
floatbuf_to_byte(rectf, rect32, 0, img_w, 0, img_h, img_w);
@@ -766,13 +767,13 @@ void bglBegin(int mode)
int bglPointHack() {
float value[4];
- int pointhack;
+ int pointhack_px;
glGetFloatv(GL_POINT_SIZE_RANGE, value);
if(value[1]<2.0) {
glGetFloatv(GL_POINT_SIZE, value);
- pointhack= floor(value[0]+0.5);
- if(pointhack>4) pointhack= 4;
- return pointhack;
+ pointhack_px= floor(value[0]+0.5);
+ if(pointhack_px>4) pointhack_px= 4;
+ return pointhack_px;
}
return 0;
}
diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c
index fbc83b1de65..7374b579cab 100644
--- a/source/blender/editors/screen/screen_context.c
+++ b/source/blender/editors/screen/screen_context.c
@@ -33,9 +33,13 @@
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_context.h"
-#include "BKE_utildefines.h"
+#include "BKE_object.h"
#include "BKE_action.h"
+#include "BKE_armature.h"
#include "BKE_sequencer.h"
#include "RNA_access.h"
@@ -48,6 +52,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
bScreen *sc= CTX_wm_screen(C);
Scene *scene= sc->scene;
Base *base;
+ unsigned int lay = scene->lay;
#if 0 /* Using the context breaks adding objects in the UI. Need to find out why - campbell */
Object *obact= CTX_data_active_object(C);
@@ -61,7 +66,8 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
if(CTX_data_dir(member)) {
static const char *dir[] = {
- "scene", "visible_objects", "visible_bases", "selected_objects", "selected_bases",
+ "scene", "visible_objects", "visible_bases", "selectable_objects", "selectable_bases",
+ "selected_objects", "selected_bases",
"selected_editable_objects", "selected_editable_bases",
"visible_bones", "editable_bones", "selected_bones", "selected_editable_bones",
"visible_pose_bones", "selected_pose_bones", "active_bone", "active_pose_bone",
@@ -92,6 +98,22 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
return 1;
}
+ else if(CTX_data_equals(member, "selectable_objects") || CTX_data_equals(member, "selectable_bases")) {
+ int selectable_objects= CTX_data_equals(member, "selectable_objects");
+
+ for(base=scene->base.first; base; base=base->next) {
+ if(base->lay & lay) {
+ if((base->object->restrictflag & OB_RESTRICT_VIEW)==0 && (base->object->restrictflag & OB_RESTRICT_SELECT)==0) {
+ if(selectable_objects)
+ CTX_data_id_list_add(result, &base->object->id);
+ else
+ CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base);
+ }
+ }
+ }
+ CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
+ return 1;
+ }
else if(CTX_data_equals(member, "selected_objects") || CTX_data_equals(member, "selected_bases")) {
int selected_objects= CTX_data_equals(member, "selected_objects");
@@ -209,14 +231,15 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
}
}
else if(CTX_data_equals(member, "visible_pose_bones")) {
- bArmature *arm= (obact) ? obact->data : NULL;
+ Object *obpose= ED_object_pose_armature(obact);
+ bArmature *arm= (obpose) ? obpose->data : NULL;
bPoseChannel *pchan;
- if (obact && obact->pose && arm) {
- for (pchan= obact->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if (obpose && obpose->pose && arm) {
+ for (pchan= obpose->pose->chanbase.first; pchan; pchan= pchan->next) {
/* ensure that PoseChannel is on visible layer and is not hidden in PoseMode */
- if ((pchan->bone) && (arm->layer & pchan->bone->layer) && !(pchan->bone->flag & BONE_HIDDEN_P)) {
- CTX_data_list_add(result, &obact->id, &RNA_PoseBone, pchan);
+ if (PBONE_VISIBLE(arm, pchan->bone)) {
+ CTX_data_list_add(result, &obpose->id, &RNA_PoseBone, pchan);
}
}
CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
@@ -224,15 +247,16 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
}
}
else if(CTX_data_equals(member, "selected_pose_bones")) {
- bArmature *arm= (obact) ? obact->data : NULL;
+ Object *obpose= ED_object_pose_armature(obact);
+ bArmature *arm= (obpose) ? obpose->data : NULL;
bPoseChannel *pchan;
- if (obact && obact->pose && arm) {
- for (pchan= obact->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if (obpose && obpose->pose && arm) {
+ for (pchan= obpose->pose->chanbase.first; pchan; pchan= pchan->next) {
/* ensure that PoseChannel is on visible layer and is not hidden in PoseMode */
- if ((pchan->bone) && (arm->layer & pchan->bone->layer) && !(pchan->bone->flag & BONE_HIDDEN_P)) {
- if (pchan->bone->flag & BONE_SELECTED || pchan->bone == arm->act_bone)
- CTX_data_list_add(result, &obact->id, &RNA_PoseBone, pchan);
+ if (PBONE_VISIBLE(arm, pchan->bone)) {
+ if (pchan->bone->flag & BONE_SELECTED)
+ CTX_data_list_add(result, &obpose->id, &RNA_PoseBone, pchan);
}
}
CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
@@ -258,10 +282,11 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
}
else if(CTX_data_equals(member, "active_pose_bone")) {
bPoseChannel *pchan;
+ Object *obpose= ED_object_pose_armature(obact);
- pchan= get_active_posechannel(obact);
+ pchan= get_active_posechannel(obpose);
if (pchan) {
- CTX_data_pointer_set(result, &obact->id, &RNA_PoseBone, pchan);
+ CTX_data_pointer_set(result, &obpose->id, &RNA_PoseBone, pchan);
return 1;
}
}
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 05b6e072eac..65ccadacf3c 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -34,6 +34,7 @@
#include "DNA_userdef_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -309,7 +310,7 @@ static void screen_delarea(bContext *C, bScreen *sc, ScrArea *sa)
/* return 0: no split possible */
/* else return (integer) screencoordinate split point */
-static short testsplitpoint(wmWindow *win, ScrArea *sa, char dir, float fac)
+static short testsplitpoint(ScrArea *sa, char dir, float fac)
{
short x, y;
@@ -345,7 +346,7 @@ static short testsplitpoint(wmWindow *win, ScrArea *sa, char dir, float fac)
}
}
-ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac)
+ScrArea *area_split(bScreen *sc, ScrArea *sa, char dir, float fac, int merge)
{
ScrArea *newa=NULL;
ScrVert *sv1, *sv2;
@@ -353,7 +354,7 @@ ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac
if(sa==NULL) return NULL;
- split= testsplitpoint(win, sa, dir, fac);
+ split= testsplitpoint(sa, dir, fac);
if(split==0) return NULL;
if(dir=='h') {
@@ -399,7 +400,8 @@ ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac
}
/* remove double vertices en edges */
- removedouble_scrverts(sc);
+ if(merge)
+ removedouble_scrverts(sc);
removedouble_scredges(sc);
removenotused_scredges(sc);
@@ -408,7 +410,7 @@ ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac
/* empty screen, with 1 dummy area without spacedata */
/* uses window size */
-bScreen *ED_screen_add(wmWindow *win, Scene *scene, char *name)
+bScreen *ED_screen_add(wmWindow *win, Scene *scene, const char *name)
{
bScreen *sc;
ScrVert *sv1, *sv2, *sv3, *sv4;
@@ -416,6 +418,7 @@ bScreen *ED_screen_add(wmWindow *win, Scene *scene, char *name)
sc= alloc_libblock(&G.main->screen, ID_SCR, name);
sc->scene= scene;
sc->do_refresh= 1;
+ sc->redraws_flag= TIME_ALL_3D_WIN|TIME_ALL_ANIM_WIN;
sc->winid= win->winid;
sv1= screen_addvert(sc, 0, 0);
@@ -484,7 +487,7 @@ static void screen_copy(bScreen *to, bScreen *from)
/* with sa as center, sb is located at: 0=W, 1=N, 2=E, 3=S */
/* -1 = not valid check */
/* used with join operator */
-int area_getorientation(bScreen *screen, ScrArea *sa, ScrArea *sb)
+int area_getorientation(ScrArea *sa, ScrArea *sb)
{
ScrVert *sav1, *sav2, *sav3, *sav4;
ScrVert *sbv1, *sbv2, *sbv3, *sbv4;
@@ -523,7 +526,7 @@ int screen_area_join(bContext *C, bScreen* scr, ScrArea *sa1, ScrArea *sa2)
{
int dir;
- dir = area_getorientation(scr, sa1, sa2);
+ dir = area_getorientation(sa1, sa2);
/*printf("dir is : %i \n", dir);*/
if (dir < 0)
@@ -643,18 +646,20 @@ static void screen_test_scale(bScreen *sc, int winsizex, int winsizey)
/* make sure it fits! */
for(sv= sc->vertbase.first; sv; sv= sv->next) {
+ /* FIXME, this resizing logic is no good when resizing the window + redrawing [#24428]
+ * need some way to store these as floats internally and re-apply from there. */
tempf= ((float)sv->vec.x)*facx;
sv->vec.x= (short)(tempf+0.5);
sv->vec.x+= AREAGRID-1;
sv->vec.x-= (sv->vec.x % AREAGRID);
-
+
CLAMP(sv->vec.x, 0, winsizex);
- tempf= ((float)sv->vec.y )*facy;
+ tempf= ((float)sv->vec.y)*facy;
sv->vec.y= (short)(tempf+0.5);
sv->vec.y+= AREAGRID-1;
sv->vec.y-= (sv->vec.y % AREAGRID);
-
+
CLAMP(sv->vec.y, 0, winsizey);
}
}
@@ -861,7 +866,7 @@ static void scrarea_draw_shape_dark(ScrArea *sa, char dir)
}
/* draw screen area ligher with arrow shape ("eraser" of previous dark shape) */
-static void scrarea_draw_shape_light(ScrArea *sa, char dir)
+static void scrarea_draw_shape_light(ScrArea *sa, char UNUSED(dir))
{
glBlendFunc(GL_DST_COLOR, GL_SRC_ALPHA);
glEnable(GL_BLEND);
@@ -993,7 +998,7 @@ void ED_screen_draw(wmWindow *win)
/* blended join arrow */
if (sa1 && sa2) {
- dir = area_getorientation(win->screen, sa1, sa2);
+ dir = area_getorientation(sa1, sa2);
if (dir >= 0) {
switch(dir) {
case 0: /* W */
@@ -1025,27 +1030,35 @@ void ED_screen_draw(wmWindow *win)
/* make this screen usable */
/* for file read and first use, for scaling window, area moves */
void ED_screen_refresh(wmWindowManager *wm, wmWindow *win)
-{
- ScrArea *sa;
- rcti winrct= {0, win->sizex-1, 0, win->sizey-1};
-
- screen_test_scale(win->screen, win->sizex, win->sizey);
+{
+ /* exception for bg mode, we only need the screen context */
+ if (!G.background) {
+ ScrArea *sa;
+ rcti winrct;
- if(win->screen->mainwin==0)
- win->screen->mainwin= wm_subwindow_open(win, &winrct);
- else
- wm_subwindow_position(win, win->screen->mainwin, &winrct);
+ winrct.xmin= 0;
+ winrct.xmax= win->sizex-1;
+ winrct.ymin= 0;
+ winrct.ymax= win->sizey-1;
+
+ screen_test_scale(win->screen, win->sizex, win->sizey);
+
+ if(win->screen->mainwin==0)
+ win->screen->mainwin= wm_subwindow_open(win, &winrct);
+ else
+ wm_subwindow_position(win, win->screen->mainwin, &winrct);
+
+ for(sa= win->screen->areabase.first; sa; sa= sa->next) {
+ /* set spacetype and region callbacks, calls init() */
+ /* sets subwindows for regions, adds handlers */
+ ED_area_initialize(wm, win, sa);
+ }
- for(sa= win->screen->areabase.first; sa; sa= sa->next) {
- /* set spacetype and region callbacks, calls init() */
- /* sets subwindows for regions, adds handlers */
- ED_area_initialize(wm, win, sa);
+ /* wake up animtimer */
+ if(win->screen->animtimer)
+ WM_event_timer_sleep(wm, win, win->screen->animtimer, 0);
}
- /* wake up animtimer */
- if(win->screen->animtimer)
- WM_event_timer_sleep(wm, win, win->screen->animtimer, 0);
-
if(G.f & G_DEBUG) printf("set screen\n");
win->screen->do_refresh= 0;
@@ -1130,8 +1143,7 @@ void ED_screen_exit(bContext *C, wmWindow *window, bScreen *screen)
/* mark it available for use for other windows */
screen->winid= 0;
- /* before deleting the temp screen or we get invalid access */
- if (prevwin->screen->full != SCREENTEMP) {
+ if (prevwin->screen->temp == 0) {
/* use previous window if possible */
CTX_wm_window_set(C, prevwin);
} else {
@@ -1139,11 +1151,6 @@ void ED_screen_exit(bContext *C, wmWindow *window, bScreen *screen)
CTX_wm_window_set(C, NULL);
}
- /* if temp screen, delete it */
- if(screen->full == SCREENTEMP) {
- Main *bmain= CTX_data_main(C);
- free_libblock(&bmain->screen, screen);
- }
}
/* *********************************** */
@@ -1312,6 +1319,7 @@ void ED_screen_set(bContext *C, bScreen *sc)
ED_screen_refresh(CTX_wm_manager(C), CTX_wm_window(C));
WM_event_add_notifier(C, NC_WINDOW, NULL);
+ WM_event_add_notifier(C, NC_SCREEN|ND_SCREENSET, sc);
/* makes button hilites work */
WM_event_add_mousemove(C);
@@ -1431,7 +1439,7 @@ void ED_screen_set_scene(bContext *C, Scene *scene)
CTX_data_scene_set(C, scene);
set_scene_bg(CTX_data_main(C), scene);
- ED_update_for_newframe(C, 1);
+ ED_update_for_newframe(CTX_data_main(C), scene, curscreen, 1);
/* complete redraw */
WM_event_add_notifier(C, NC_WINDOW, NULL);
@@ -1549,46 +1557,39 @@ ScrArea *ED_screen_full_toggle(bContext *C, wmWindow *win, ScrArea *sa)
}
if(sa && sa->full) {
+ ScrArea *old;
short fulltype;
sc= sa->full; /* the old screen to restore */
oldscreen= win->screen; /* the one disappearing */
fulltype = sc->full;
+ sc->full= 0;
- /* refuse to go out of SCREENAUTOPLAY as long as G_FLAGS_AUTOPLAY
- is set */
-
- if (fulltype != SCREENAUTOPLAY || (G.flags & G_FILE_AUTOPLAY) == 0) {
- ScrArea *old;
-
- sc->full= 0;
+ /* removed: SCREENAUTOPLAY exception here */
+
+ /* find old area */
+ for(old= sc->areabase.first; old; old= old->next)
+ if(old->full) break;
+ if(old==NULL) {
+ if (G.f & G_DEBUG)
+ printf("something wrong in areafullscreen\n");
+ return NULL;
+ }
- /* find old area */
- for(old= sc->areabase.first; old; old= old->next)
- if(old->full) break;
- if(old==NULL) {
- if (G.f & G_DEBUG)
- printf("something wrong in areafullscreen\n");
- return NULL;
- }
- // old feature described below (ton)
- // in autoplay screens the headers are disabled by
- // default. So use the old headertype instead
+ area_copy_data(old, sa, 1); /* 1 = swap spacelist */
+ if (sa->flag & AREA_TEMP_INFO) sa->flag &= ~AREA_TEMP_INFO;
+ old->full= NULL;
- area_copy_data(old, sa, 1); /* 1 = swap spacelist */
- if (sa->flag & AREA_TEMP_INFO) sa->flag &= ~AREA_TEMP_INFO;
- old->full= NULL;
+ /* animtimer back */
+ sc->animtimer= oldscreen->animtimer;
+ oldscreen->animtimer= NULL;
- /* animtimer back */
- sc->animtimer= oldscreen->animtimer;
- oldscreen->animtimer= NULL;
+ ED_screen_set(C, sc);
- ED_screen_set(C, sc);
+ free_screen(oldscreen);
+ free_libblock(&CTX_data_main(C)->screen, oldscreen);
- free_screen(oldscreen);
- free_libblock(&CTX_data_main(C)->screen, oldscreen);
- }
}
else {
ScrArea *newa;
@@ -1603,7 +1604,7 @@ ScrArea *ED_screen_full_toggle(bContext *C, wmWindow *win, ScrArea *sa)
*/
oldscreen->full = SCREENFULL;
- BLI_snprintf(newname, sizeof(newname), "%s-%s", oldscreen->id.name+2, "temp");
+ BLI_snprintf(newname, sizeof(newname), "%s-%s", oldscreen->id.name+2, "full");
sc= ED_screen_add(win, oldscreen->scene, newname);
sc->full = SCREENFULL; // XXX
@@ -1612,7 +1613,7 @@ ScrArea *ED_screen_full_toggle(bContext *C, wmWindow *win, ScrArea *sa)
oldscreen->animtimer= NULL;
/* returns the top small area */
- newa= area_split(win, sc, (ScrArea *)sc->areabase.first, 'h', 0.99f);
+ newa= area_split(sc, (ScrArea *)sc->areabase.first, 'h', 0.99f, 1);
ED_area_newspace(C, newa, SPACE_INFO);
/* use random area when we have no active one, e.g. when the
@@ -1737,20 +1738,17 @@ void ED_screen_animation_timer_update(bScreen *screen, int redraws, int refresh)
}
}
-/* results in fully updated anim system */
-void ED_update_for_newframe(const bContext *C, int mute)
-{
- Main *bmain= CTX_data_main(C);
- bScreen *screen= CTX_wm_screen(C);
- Scene *scene= CTX_data_scene(C);
-
+/* results in fully updated anim system
+ * screen can be NULL */
+void ED_update_for_newframe(Main *bmain, Scene *scene, bScreen *screen, int UNUSED(mute))
+{
#ifdef DURIAN_CAMERA_SWITCH
void *camera= scene_camera_switch_find(scene);
if(camera && scene->camera != camera) {
bScreen *sc;
scene->camera= camera;
/* are there cameras in the views that are not in the scene? */
- for(sc= CTX_data_main(C)->screen.first; sc; sc= sc->id.next) {
+ for(sc= bmain->screen.first; sc; sc= sc->id.next) {
BKE_screen_view3d_scene_sync(sc);
}
}
@@ -1760,7 +1758,7 @@ void ED_update_for_newframe(const bContext *C, int mute)
/* update animated image textures for gpu, etc,
* call before scene_update_for_newframe so modifiers with textuers dont lag 1 frame */
- ED_image_update_frame(C);
+ ED_image_update_frame(bmain, scene->r.cfra);
/* this function applies the changes too */
/* XXX future: do all windows */
@@ -1782,7 +1780,7 @@ void ED_update_for_newframe(const bContext *C, int mute)
/* update animated texture nodes */
{
Tex *tex;
- for(tex= CTX_data_main(C)->tex.first; tex; tex= tex->id.next)
+ for(tex= bmain->tex.first; tex; tex= tex->id.next)
if( tex->use_nodes && tex->nodetree ) {
ntreeTexTagAnimated( tex->nodetree );
}
diff --git a/source/blender/editors/screen/screen_intern.h b/source/blender/editors/screen/screen_intern.h
index 79789b1876e..ee448e70779 100644
--- a/source/blender/editors/screen/screen_intern.h
+++ b/source/blender/editors/screen/screen_intern.h
@@ -32,14 +32,16 @@
struct wmWindow;
struct Scene;
+#define AZONESPOT 12
+
/* area.c */
void area_copy_data (ScrArea *sa1, ScrArea *sa2, int swap_space);
/* screen_edit.c */
ScrEdge *screen_findedge(bScreen *sc, ScrVert *v1, ScrVert *v2);
-ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac);
+ScrArea *area_split(bScreen *sc, ScrArea *sa, char dir, float fac, int merge);
int screen_area_join(bContext *C, bScreen* scr, ScrArea *sa1, ScrArea *sa2);
-int area_getorientation(bScreen *screen, ScrArea *sa, ScrArea *sb);
+int area_getorientation(ScrArea *sa, ScrArea *sb);
void select_connected_scredge(bScreen *sc, ScrEdge *edge);
void removenotused_scrverts(bScreen *sc);
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 363e8a2b47c..9267f4d4e80 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -33,6 +33,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "DNA_armature_types.h"
#include "DNA_lattice_types.h"
@@ -54,8 +55,10 @@
#include "WM_types.h"
#include "ED_util.h"
+#include "ED_image.h"
#include "ED_screen.h"
#include "ED_object.h"
+#include "ED_armature.h"
#include "ED_screen_types.h"
#include "ED_keyframes_draw.h"
@@ -63,6 +66,7 @@
#include "RNA_define.h"
#include "UI_interface.h"
+#include "UI_resources.h"
#include "wm_window.h"
@@ -115,6 +119,24 @@ int ED_operator_scene_editable(bContext *C)
return 0;
}
+int ED_operator_objectmode(bContext *C)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *obact= CTX_data_active_object(C);
+
+ if(scene==NULL || scene->id.lib)
+ return 0;
+ if( CTX_data_edit_object(C) )
+ return 0;
+
+ /* add a check for ob->mode too? */
+ if(obact && obact->mode)
+ return 0;
+
+ return 1;
+}
+
+
static int ed_spacetype_test(bContext *C, int type)
{
if(ED_operator_areaactive(C)) {
@@ -129,6 +151,28 @@ int ED_operator_view3d_active(bContext *C)
return ed_spacetype_test(C, SPACE_VIEW3D);
}
+int ED_operator_region_view3d_active(bContext *C)
+{
+ if(CTX_wm_region_view3d(C))
+ return TRUE;
+
+ CTX_wm_operator_poll_msg_set(C, "expected a view3d region");
+ return FALSE;
+}
+
+/* generic for any view2d which uses anim_ops */
+int ED_operator_animview_active(bContext *C)
+{
+ if(ED_operator_areaactive(C)) {
+ SpaceLink *sl= (SpaceLink *)CTX_wm_space_data(C);
+ if (sl && (ELEM6(sl->spacetype, SPACE_SEQ, SPACE_SOUND, SPACE_ACTION, SPACE_NLA, SPACE_IPO, SPACE_TIME)))
+ return TRUE;
+ }
+
+ CTX_wm_operator_poll_msg_set(C, "expected an timeline/animation area to be active");
+ return 0;
+}
+
int ED_operator_timeline_active(bContext *C)
{
return ed_spacetype_test(C, SPACE_TIME);
@@ -139,6 +183,19 @@ int ED_operator_outliner_active(bContext *C)
return ed_spacetype_test(C, SPACE_OUTLINER);
}
+int ED_operator_outliner_active_no_editobject(bContext *C)
+{
+ if(ed_spacetype_test(C, SPACE_OUTLINER)) {
+ Object *ob = ED_object_active_context(C);
+ Object *obedit= CTX_data_edit_object(C);
+ if(ob && ob == obedit)
+ return 0;
+ else
+ return 1;
+ }
+ return 0;
+}
+
int ED_operator_file_active(bContext *C)
{
return ed_spacetype_test(C, SPACE_FILE);
@@ -165,7 +222,7 @@ int ED_operator_node_active(bContext *C)
}
// XXX rename
-int ED_operator_ipo_active(bContext *C)
+int ED_operator_graphedit_active(bContext *C)
{
return ed_spacetype_test(C, SPACE_IPO);
}
@@ -190,6 +247,17 @@ int ED_operator_logic_active(bContext *C)
return ed_spacetype_test(C, SPACE_LOGIC);
}
+int ED_operator_info_active(bContext *C)
+{
+ return ed_spacetype_test(C, SPACE_INFO);
+}
+
+
+int ED_operator_console_active(bContext *C)
+{
+ return ed_spacetype_test(C, SPACE_CONSOLE);
+}
+
int ED_operator_object_active(bContext *C)
{
Object *ob = ED_object_active_context(C);
@@ -202,6 +270,12 @@ int ED_operator_object_active_editable(bContext *C)
return ((ob != NULL) && !(ob->id.lib) && !(ob->restrictflag & OB_RESTRICT_VIEW));
}
+int ED_operator_object_active_editable_mesh(bContext *C)
+{
+ Object *ob = ED_object_active_context(C);
+ return ((ob != NULL) && !(ob->id.lib) && !(ob->restrictflag & OB_RESTRICT_VIEW) && ob->type == OB_MESH);
+}
+
int ED_operator_editmesh(bContext *C)
{
Object *obedit= CTX_data_edit_object(C);
@@ -215,6 +289,15 @@ int ED_operator_editmesh_view3d(bContext *C)
return ED_operator_editmesh(C) && ED_operator_view3d_active(C);
}
+int ED_operator_editmesh_region_view3d(bContext *C)
+{
+ if(ED_operator_editmesh(C) && CTX_wm_region_view3d(C))
+ return 1;
+
+ CTX_wm_operator_poll_msg_set(C, "expected a view3d region & editmesh");
+ return 0;
+}
+
int ED_operator_editarmature(bContext *C)
{
Object *obedit= CTX_data_edit_object(C);
@@ -226,31 +309,25 @@ int ED_operator_editarmature(bContext *C)
int ED_operator_posemode(bContext *C)
{
Object *obact= CTX_data_active_object(C);
- Object *obedit= CTX_data_edit_object(C);
-
- if ((obact != obedit) && (obact) && (obact->type==OB_ARMATURE))
- return (obact->mode & OB_MODE_POSE)!=0;
-
+
+ if (obact && !(obact->mode & OB_MODE_EDIT)) {
+ Object *obpose;
+ if((obpose= ED_object_pose_armature(obact))) {
+ if((obact == obpose) || (obact->mode & OB_MODE_WEIGHT_PAINT)) {
+ return 1;
+ }
+ }
+ }
+
return 0;
}
-
+/* wrapper for ED_space_image_show_uvedit */
int ED_operator_uvedit(bContext *C)
{
+ SpaceImage *sima= CTX_wm_space_image(C);
Object *obedit= CTX_data_edit_object(C);
- EditMesh *em= NULL;
-
- if(obedit && obedit->type==OB_MESH)
- em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
-
- if(em && (em->faces.first) && (CustomData_has_layer(&em->fdata, CD_MTFACE))) {
- BKE_mesh_end_editmesh(obedit->data, em);
- return 1;
- }
-
- if(obedit)
- BKE_mesh_end_editmesh(obedit->data, em);
- return 0;
+ return ED_space_image_show_uvedit(sima, obedit);
}
int ED_operator_uvmap(bContext *C)
@@ -279,6 +356,14 @@ int ED_operator_editsurfcurve(bContext *C)
return 0;
}
+int ED_operator_editsurfcurve_region_view3d(bContext *C)
+{
+ if(ED_operator_editsurfcurve(C) && CTX_wm_region_view3d(C))
+ return 1;
+
+ CTX_wm_operator_poll_msg_set(C, "expected a view3d region & editcurve");
+ return 0;
+}
int ED_operator_editcurve(bContext *C)
{
@@ -389,7 +474,10 @@ AZone *is_in_area_actionzone(ScrArea *sa, int x, int y)
for(az= sa->actionzones.first; az; az= az->next) {
if(BLI_in_rcti(&az->rect, x, y)) {
if(az->type == AZONE_AREA) {
- if(isect_point_tri_v2_int(az->x1, az->y1, az->x2, az->y2, x, y))
+ /* no triangle intersect but a hotspot circle based on corner */
+ int radius= (x-az->x1)*(x-az->x1) + (y-az->y1)*(y-az->y1);
+
+ if(radius <= AZONESPOT*AZONESPOT)
break;
}
else if(az->type == AZONE_REGION) {
@@ -402,7 +490,7 @@ AZone *is_in_area_actionzone(ScrArea *sa, int x, int y)
}
-static void actionzone_exit(bContext *C, wmOperator *op)
+static void actionzone_exit(wmOperator *op)
{
if(op->customdata)
MEM_freeN(op->customdata);
@@ -448,7 +536,7 @@ static int actionzone_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* region azone directly reacts on mouse clicks */
if(sad->az->type==AZONE_REGION) {
actionzone_apply(C, op, AZONE_REGION);
- actionzone_exit(C, op);
+ actionzone_exit(op);
return OPERATOR_FINISHED;
}
else {
@@ -488,16 +576,16 @@ static int actionzone_modal(bContext *C, wmOperator *op, wmEvent *event)
sad->sa2= screen_areahascursor(CTX_wm_screen(C), event->x, event->y);
/* apply sends event */
actionzone_apply(C, op, sad->az->type);
- actionzone_exit(C, op);
+ actionzone_exit(op);
return OPERATOR_FINISHED;
}
break;
case ESCKEY:
- actionzone_exit(C, op);
+ actionzone_exit(op);
return OPERATOR_CANCELLED;
case LEFTMOUSE:
- actionzone_exit(C, op);
+ actionzone_exit(op);
return OPERATOR_CANCELLED;
}
@@ -548,7 +636,7 @@ typedef struct sAreaSwapData {
ScrArea *sa1, *sa2;
} sAreaSwapData;
-static int area_swap_init(bContext *C, wmOperator *op, wmEvent *event)
+static int area_swap_init(wmOperator *op, wmEvent *event)
{
sAreaSwapData *sd= NULL;
sActionzoneData *sad= event->customdata;
@@ -582,7 +670,7 @@ static int area_swap_cancel(bContext *C, wmOperator *op)
static int area_swap_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- if(!area_swap_init(C, op, event))
+ if(!area_swap_init(op, event))
return OPERATOR_PASS_THROUGH;
/* add modal handler */
@@ -668,7 +756,7 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* poll() checks area context, but we don't accept full-area windows */
if(sc->full != SCREENNORMAL) {
if(event->type==EVT_ACTIONZONE_AREA)
- actionzone_exit(C, op);
+ actionzone_exit(op);
return OPERATOR_CANCELLED;
}
@@ -690,7 +778,7 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, wmEvent *event)
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
if(event->type==EVT_ACTIONZONE_AREA)
- actionzone_exit(C, op);
+ actionzone_exit(op);
return OPERATOR_FINISHED;
}
@@ -1084,7 +1172,7 @@ static int area_split_apply(bContext *C, wmOperator *op)
fac= RNA_float_get(op->ptr, "factor");
dir= RNA_enum_get(op->ptr, "direction");
- sd->narea= area_split(CTX_wm_window(C), sc, sd->sarea, dir, fac);
+ sd->narea= area_split(sc, sd->sarea, dir, fac, 0); /* 0 = no merge */
if(sd->narea) {
ScrVert *sv;
@@ -1517,15 +1605,32 @@ static void SCREEN_OT_frame_offset(wmOperatorType *ot)
static int frame_jump_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
-
- if (RNA_boolean_get(op->ptr, "end"))
- CFRA= PEFRA;
- else
- CFRA= PSFRA;
-
- sound_seek_scene(C);
+ wmTimer *animtimer= CTX_wm_screen(C)->animtimer;
+
+ /* Don't change CFRA directly if animtimer is running as this can cause
+ * first/last frame not to be actually shown (bad since for example physics
+ * simulations aren't reset properly).
+ */
+ if(animtimer) {
+ ScreenAnimData *sad = animtimer->customdata;
+
+ sad->flag |= ANIMPLAY_FLAG_USE_NEXT_FRAME;
+
+ if (RNA_boolean_get(op->ptr, "end"))
+ sad->nextfra= PEFRA;
+ else
+ sad->nextfra= PSFRA;
+ }
+ else {
+ if (RNA_boolean_get(op->ptr, "end"))
+ CFRA= PEFRA;
+ else
+ CFRA= PSFRA;
+
+ sound_seek_scene(C);
- WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
+ WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
+ }
return OPERATOR_FINISHED;
}
@@ -1553,6 +1658,7 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
+ bDopeSheet ads= {0};
DLRBT_Tree keys;
ActKeyColumn *ak;
float cfra= (scene)? (float)(CFRA) : 0.0f;
@@ -1567,10 +1673,10 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op)
BLI_dlrbTree_init(&keys);
/* populate tree with keyframe nodes */
- if (scene && scene->adt)
- scene_to_keylist(NULL, scene, &keys, NULL);
- if (ob && ob->adt)
- ob_to_keylist(NULL, ob, &keys, NULL);
+ if (scene)
+ scene_to_keylist(&ads, scene, &keys, NULL);
+ if (ob)
+ ob_to_keylist(&ads, ob, &keys, NULL);
/* build linked-list for searching */
BLI_dlrbTree_linkedlist_sync(&keys);
@@ -1635,6 +1741,10 @@ static int screen_set_exec(bContext *C, wmOperator *op)
int tot= BLI_countlist(&CTX_data_main(C)->screen);
int delta= RNA_int_get(op->ptr, "delta");
+ /* temp screens are for userpref or render display */
+ if(screen->temp)
+ return OPERATOR_CANCELLED;
+
/* return to previous state before switching screens */
if(sa && sa->full)
ED_screen_full_restore(C, sa);
@@ -1683,7 +1793,7 @@ static void SCREEN_OT_screen_set(wmOperatorType *ot)
/* function to be called outside UI context, or for redo */
-static int screen_full_area_exec(bContext *C, wmOperator *op)
+static int screen_full_area_exec(bContext *C, wmOperator *UNUSED(op))
{
ED_screen_full_toggle(C, CTX_wm_window(C), CTX_wm_area(C));
return OPERATOR_FINISHED;
@@ -1890,7 +2000,7 @@ static int area_join_modal(bContext *C, wmOperator *op, wmEvent *event)
if (sa) {
if (jd->sa1 != sa) {
- dir = area_getorientation(sc, jd->sa1, sa);
+ dir = area_getorientation(jd->sa1, sa);
if (dir >= 0) {
if (jd->sa2) jd->sa2->flag &= ~AREA_FLAG_DRAWJOINTO;
jd->sa2 = sa;
@@ -1901,7 +2011,7 @@ static int area_join_modal(bContext *C, wmOperator *op, wmEvent *event)
we check if area has common border with the one marked for removal
in this case we can swap areas.
*/
- dir = area_getorientation(sc, sa, jd->sa2);
+ dir = area_getorientation(sa, jd->sa2);
if (dir >= 0) {
if (jd->sa1) jd->sa1->flag &= ~AREA_FLAG_DRAWJOINFROM;
if (jd->sa2) jd->sa2->flag &= ~AREA_FLAG_DRAWJOINTO;
@@ -1927,13 +2037,13 @@ static int area_join_modal(bContext *C, wmOperator *op, wmEvent *event)
jd->sa2 = sa;
if (jd->sa1) jd->sa1->flag |= AREA_FLAG_DRAWJOINFROM;
if (jd->sa2) jd->sa2->flag |= AREA_FLAG_DRAWJOINTO;
- dir = area_getorientation(sc, jd->sa1, jd->sa2);
+ dir = area_getorientation(jd->sa1, jd->sa2);
if (dir < 0) {
printf("oops, didn't expect that!\n");
}
}
else {
- dir = area_getorientation(sc, jd->sa1, sa);
+ dir = area_getorientation(jd->sa1, sa);
if (dir >= 0) {
if (jd->sa2) jd->sa2->flag &= ~AREA_FLAG_DRAWJOINTO;
jd->sa2 = sa;
@@ -1988,9 +2098,47 @@ static void SCREEN_OT_area_join(wmOperatorType *ot)
RNA_def_int(ot->srna, "max_y", -100, INT_MIN, INT_MAX, "Y 2", "", INT_MIN, INT_MAX);
}
+
+static int spacedata_cleanup(bContext *C, wmOperator *op)
+{
+ Main *bmain= CTX_data_main(C);
+ bScreen *screen;
+ ScrArea *sa;
+ int tot= 0;
+
+ for(screen= bmain->screen.first; screen; screen= screen->id.next) {
+ for(sa= screen->areabase.first; sa; sa= sa->next) {
+ if(sa->spacedata.first != sa->spacedata.last) {
+ SpaceLink *sl= sa->spacedata.first;
+
+ BLI_remlink(&sa->spacedata, sl);
+ tot+= BLI_countlist(&sa->spacedata);
+ BKE_spacedata_freelist(&sa->spacedata);
+ BLI_addtail(&sa->spacedata, sl);
+ }
+ }
+ }
+ BKE_reportf(op->reports, RPT_INFO, "Removed amount of editors: %d", tot);
+
+ return OPERATOR_FINISHED;
+}
+
+static void SCREEN_OT_spacedata_cleanup(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Clean-up space-data";
+ ot->description= "Remove unused settings for invisible editors";
+ ot->idname= "SCREEN_OT_spacedata_cleanup";
+
+ /* api callbacks */
+ ot->exec= spacedata_cleanup;
+ ot->poll= WM_operator_winactive;
+
+}
+
/* ************** repeat last operator ***************************** */
-static int repeat_last_exec(bContext *C, wmOperator *op)
+static int repeat_last_exec(bContext *C, wmOperator *UNUSED(op))
{
wmOperator *lastop= CTX_wm_manager(C)->operators.last;
@@ -2014,7 +2162,7 @@ static void SCREEN_OT_repeat_last(wmOperatorType *ot)
}
-static int repeat_history_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int repeat_history_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
wmWindowManager *wm= CTX_wm_manager(C);
wmOperator *lastop;
@@ -2026,11 +2174,11 @@ static int repeat_history_invoke(bContext *C, wmOperator *op, wmEvent *event)
if(items==0)
return OPERATOR_CANCELLED;
- pup= uiPupMenuBegin(C, op->type->name, 0);
+ pup= uiPupMenuBegin(C, op->type->name, ICON_NULL);
layout= uiPupMenuLayout(pup);
for (i=items-1, lastop= wm->operators.last; lastop; lastop= lastop->prev, i--)
- uiItemIntO(layout, lastop->type->name, 0, op->type->idname, "index", i);
+ uiItemIntO(layout, lastop->type->name, ICON_NULL, op->type->idname, "index", i);
uiPupMenuEnd(C, pup);
@@ -2071,7 +2219,7 @@ static void SCREEN_OT_repeat_history(wmOperatorType *ot)
/* ********************** redo operator ***************************** */
-static int redo_last_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int redo_last_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
wmWindowManager *wm= CTX_wm_manager(C);
wmOperator *lastop;
@@ -2190,7 +2338,7 @@ static void SCREEN_OT_region_quadview(wmOperatorType *ot)
/* api callbacks */
// ot->invoke= WM_operator_confirm;
ot->exec= region_quadview_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_region_view3d_active;
ot->flag= 0;
}
@@ -2199,7 +2347,7 @@ static void SCREEN_OT_region_quadview(wmOperatorType *ot)
/* ************** region flip operator ***************************** */
/* flip a region alignment */
-static int region_flip_exec(bContext *C, wmOperator *op)
+static int region_flip_exec(bContext *C, wmOperator *UNUSED(op))
{
ARegion *ar= CTX_wm_region(C);
@@ -2237,7 +2385,7 @@ static void SCREEN_OT_region_flip(wmOperatorType *ot)
/* ************** header flip operator ***************************** */
/* flip a header region alignment */
-static int header_flip_exec(bContext *C, wmOperator *op)
+static int header_flip_exec(bContext *C, wmOperator *UNUSED(op))
{
ARegion *ar= CTX_wm_region(C);
@@ -2291,30 +2439,30 @@ static void SCREEN_OT_header_flip(wmOperatorType *ot)
/* ************** header tools operator ***************************** */
-static int header_toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int header_toolbox_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C);
uiPopupMenu *pup;
uiLayout *layout;
- pup= uiPupMenuBegin(C, "Header", 0);
+ pup= uiPupMenuBegin(C, "Header", ICON_NULL);
layout= uiPupMenuLayout(pup);
// XXX SCREEN_OT_region_flip doesn't work - gets wrong context for active region, so added custom operator
if (ar->alignment == RGN_ALIGN_TOP)
- uiItemO(layout, "Flip to Bottom", 0, "SCREEN_OT_header_flip");
+ uiItemO(layout, "Flip to Bottom", ICON_NULL, "SCREEN_OT_header_flip");
else
- uiItemO(layout, "Flip to Top", 0, "SCREEN_OT_header_flip");
+ uiItemO(layout, "Flip to Top", ICON_NULL, "SCREEN_OT_header_flip");
uiItemS(layout);
/* file browser should be fullscreen all the time, but other regions can be maximised/restored... */
if (sa->spacetype != SPACE_FILE) {
if (sa->full)
- uiItemO(layout, "Tile Area", 0, "SCREEN_OT_screen_full_area");
+ uiItemO(layout, "Tile Area", ICON_NULL, "SCREEN_OT_screen_full_area");
else
- uiItemO(layout, "Maximize Area", 0, "SCREEN_OT_screen_full_area");
+ uiItemO(layout, "Maximize Area", ICON_NULL, "SCREEN_OT_screen_full_area");
}
uiPupMenuEnd(C, pup);
@@ -2405,7 +2553,7 @@ static int match_region_with_redraws(int spacetype, int regiontype, int redraws)
return 0;
}
-static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event)
+static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
bScreen *screen= CTX_wm_screen(C);
@@ -2477,12 +2625,19 @@ static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event)
}
}
}
+
+ /* next frame overriden by user action (pressed jump to first/last frame) */
+ if(sad->flag & ANIMPLAY_FLAG_USE_NEXT_FRAME) {
+ scene->r.cfra = sad->nextfra;
+ sad->flag &= ~ANIMPLAY_FLAG_USE_NEXT_FRAME;
+ sad->flag |= ANIMPLAY_FLAG_JUMPED;
+ }
if (sad->flag & ANIMPLAY_FLAG_JUMPED)
sound_seek_scene(C);
/* since we follow drawflags, we can't send notifier but tag regions ourselves */
- ED_update_for_newframe(C, 1);
+ ED_update_for_newframe(CTX_data_main(C), scene, screen, 1);
for (sa= screen->areabase.first; sa; sa= sa->next) {
ARegion *ar;
@@ -2543,37 +2698,18 @@ int ED_screen_animation_play(bContext *C, int sync, int mode)
sound_stop_scene(scene);
}
else {
- ScrArea *sa= CTX_wm_area(C);
- int refresh= SPACE_TIME;
+ int refresh= SPACE_TIME; /* these settings are currently only available from a menu in the TimeLine */
if (mode == 1) // XXX only play audio forwards!?
sound_play_scene(scene);
- /* timeline gets special treatment since it has it's own menu for determining redraws */
- if ((sa) && (sa->spacetype == SPACE_TIME)) {
- SpaceTime *stime= (SpaceTime *)sa->spacedata.first;
-
- ED_screen_animation_timer(C, stime->redraws, refresh, sync, mode);
-
- /* update region if TIME_REGION was set, to leftmost 3d window */
- ED_screen_animation_timer_update(screen, stime->redraws, refresh);
- }
- else {
- int redraws = TIME_REGION|TIME_ALL_3D_WIN;
-
- /* XXX - would like a better way to deal with this situation - Campbell */
- if ((!sa) || (sa->spacetype == SPACE_SEQ)) {
- redraws |= TIME_SEQ;
- }
-
- ED_screen_animation_timer(C, redraws, refresh, sync, mode);
+ ED_screen_animation_timer(C, screen->redraws_flag, refresh, sync, mode);
+
+ if (screen->animtimer) {
+ wmTimer *wt= screen->animtimer;
+ ScreenAnimData *sad= wt->customdata;
- if(screen->animtimer) {
- wmTimer *wt= screen->animtimer;
- ScreenAnimData *sad= wt->customdata;
-
- sad->ar= CTX_wm_region(C);
- }
+ sad->ar= CTX_wm_region(C);
}
}
@@ -2607,11 +2743,11 @@ static void SCREEN_OT_animation_play(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "sync", 0, "Sync", "Drop frames to maintain framerate");
}
-static int screen_animation_cancel_exec(bContext *C, wmOperator *op)
+static int screen_animation_cancel_exec(bContext *C, wmOperator *UNUSED(op))
{
bScreen *screen= CTX_wm_screen(C);
- if(screen->animtimer) {
+ if (screen->animtimer) {
ScreenAnimData *sad= screen->animtimer->customdata;
Scene *scene= CTX_data_scene(C);
@@ -2735,9 +2871,8 @@ static void SCREEN_OT_back_to_previous(struct wmOperatorType *ot)
/* *********** show user pref window ****** */
-static int userpref_show_invoke(bContext *C, wmOperator *unused, wmEvent *event)
+static int userpref_show_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
- ScrArea *sa;
rcti rect;
int sizex, sizey;
@@ -2753,9 +2888,6 @@ static int userpref_show_invoke(bContext *C, wmOperator *unused, wmEvent *event)
/* changes context! */
WM_window_open_temp(C, &rect, WM_WINDOW_USERPREFS);
- sa= CTX_wm_area(C);
-
-
return OPERATOR_FINISHED;
}
@@ -2774,7 +2906,7 @@ static void SCREEN_OT_userpref_show(struct wmOperatorType *ot)
/********************* new screen operator *********************/
-static int screen_new_exec(bContext *C, wmOperator *op)
+static int screen_new_exec(bContext *C, wmOperator *UNUSED(op))
{
wmWindow *win= CTX_wm_window(C);
bScreen *sc= CTX_wm_screen(C);
@@ -2801,7 +2933,7 @@ void SCREEN_OT_new(wmOperatorType *ot)
/********************* delete screen operator *********************/
-static int screen_delete_exec(bContext *C, wmOperator *op)
+static int screen_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
bScreen *sc= CTX_wm_screen(C);
@@ -2832,7 +2964,7 @@ static int scene_new_exec(bContext *C, wmOperator *op)
Main *bmain= CTX_data_main(C);
int type= RNA_enum_get(op->ptr, "type");
- newscene= copy_scene(bmain, scene, type);
+ newscene= copy_scene(scene, type);
/* these can't be handled in blenkernel curently, so do them here */
if(type == SCE_COPY_LINK_DATA)
@@ -2872,7 +3004,7 @@ void SCENE_OT_new(wmOperatorType *ot)
/********************* delete scene operator *********************/
-static int scene_delete_exec(bContext *C, wmOperator *op)
+static int scene_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
@@ -2897,6 +3029,7 @@ void SCENE_OT_delete(wmOperatorType *ot)
/* **************** Assigning operatortypes to global list, adding handlers **************** */
+
/* called in spacetypes.c */
void ED_operatortypes_screen(void)
{
@@ -2920,6 +3053,7 @@ void ED_operatortypes_screen(void)
WM_operatortype_append(SCREEN_OT_screen_set);
WM_operatortype_append(SCREEN_OT_screen_full_area);
WM_operatortype_append(SCREEN_OT_back_to_previous);
+ WM_operatortype_append(SCREEN_OT_spacedata_cleanup);
WM_operatortype_append(SCREEN_OT_screenshot);
WM_operatortype_append(SCREEN_OT_screencast);
WM_operatortype_append(SCREEN_OT_userpref_show);
@@ -2970,9 +3104,27 @@ static void keymap_modal_set(wmKeyConfig *keyconf)
}
+static int open_file_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
+{
+ if(drag->type==WM_DRAG_PATH) {
+ if(drag->icon==ICON_FILE_BLEND)
+ return 1;
+ }
+ return 0;
+}
+
+static void open_file_drop_copy(wmDrag *drag, wmDropBox *drop)
+{
+ /* copy drag path to properties */
+ RNA_string_set(drop->ptr, "filepath", drag->path);
+ drop->opcontext= WM_OP_EXEC_DEFAULT;
+}
+
+
/* called in spacetypes.c */
void ED_keymap_screen(wmKeyConfig *keyconf)
{
+ ListBase *lb;
wmKeyMap *keymap;
//wmKeyMapItem *kmi;
@@ -3086,6 +3238,10 @@ void ED_keymap_screen(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", DOWNARROWKEY, KM_PRESS, KM_ALT, 0);
#endif
+ /* dropbox for entire window */
+ lb= WM_dropboxmap_find("Window", 0, 0);
+ WM_dropbox_add(lb, "WM_OT_open_mainfile", open_file_drop_poll, open_file_drop_copy);
+
keymap_modal_set(keyconf);
}
diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c
index 56efa0a5a83..1fbcd7e61fd 100644
--- a/source/blender/editors/screen/screendump.c
+++ b/source/blender/editors/screen/screendump.c
@@ -31,6 +31,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -42,6 +43,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_image.h"
#include "BKE_report.h"
#include "BKE_writeavi.h"
@@ -69,29 +71,31 @@ static int screenshot_exec(bContext *C, wmOperator *op)
{
ScreenshotData *scd= op->customdata;
- if(scd && scd->dumprect) {
- Scene *scene= CTX_data_scene(C);
- ImBuf *ibuf;
- char path[FILE_MAX];
-
- RNA_string_get(op->ptr, "filepath", path);
-
- strcpy(G.ima, path);
- BLI_path_abs(path, G.sce);
+ if(scd) {
+ if(scd->dumprect) {
+ Scene *scene= CTX_data_scene(C);
+ ImBuf *ibuf;
+ char path[FILE_MAX];
- /* BKE_add_image_extension() checks for if extension was already set */
- if(scene->r.scemode & R_EXTENSION)
- if(strlen(path)<FILE_MAXDIR+FILE_MAXFILE-5)
- BKE_add_image_extension(path, scene->r.imtype);
+ RNA_string_get(op->ptr, "filepath", path);
- ibuf= IMB_allocImBuf(scd->dumpsx, scd->dumpsy, 24, 0, 0);
- ibuf->rect= scd->dumprect;
-
- BKE_write_ibuf(scene, ibuf, path, scene->r.imtype, scene->r.subimtype, scene->r.quality);
+ strcpy(G.ima, path);
+ BLI_path_abs(path, G.main->name);
+
+ /* BKE_add_image_extension() checks for if extension was already set */
+ if(scene->r.scemode & R_EXTENSION)
+ if(strlen(path)<FILE_MAXDIR+FILE_MAXFILE-5)
+ BKE_add_image_extension(path, scene->r.imtype);
+
+ ibuf= IMB_allocImBuf(scd->dumpsx, scd->dumpsy, 24, 0);
+ ibuf->rect= scd->dumprect;
+
+ BKE_write_ibuf(scene, ibuf, path, scene->r.imtype, scene->r.subimtype, scene->r.quality);
- IMB_freeImBuf(ibuf);
+ IMB_freeImBuf(ibuf);
- MEM_freeN(scd->dumprect);
+ MEM_freeN(scd->dumprect);
+ }
MEM_freeN(scd);
op->customdata= NULL;
}
@@ -132,7 +136,7 @@ static unsigned int *screenshot(bContext *C, int *dumpsx, int *dumpsy, int fscre
}
-static int screenshot_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int screenshot_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
unsigned int *dumprect;
int dumpsx, dumpsy;
@@ -158,6 +162,18 @@ static int screenshot_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_CANCELLED;
}
+static int screenshot_cancel(bContext *UNUSED(C), wmOperator *op)
+{
+ ScreenshotData *scd= op->customdata;
+
+ if(scd) {
+ if(scd->dumprect)
+ MEM_freeN(scd->dumprect);
+ MEM_freeN(scd);
+ op->customdata= NULL;
+ }
+ return OPERATOR_CANCELLED;
+}
void SCREEN_OT_screenshot(wmOperatorType *ot)
{
@@ -167,6 +183,7 @@ void SCREEN_OT_screenshot(wmOperatorType *ot)
ot->invoke= screenshot_invoke;
ot->exec= screenshot_exec;
ot->poll= WM_operator_winactive;
+ ot->cancel= screenshot_cancel;
ot->flag= 0;
@@ -214,7 +231,7 @@ static void screenshot_updatejob(void *sjv)
/* only this runs inside thread */
-static void screenshot_startjob(void *sjv, short *stop, short *do_update, float *progress)
+static void screenshot_startjob(void *sjv, short *stop, short *do_update, float *UNUSED(progress))
{
ScreenshotJob *sj= sjv;
RenderData rd= sj->scene->r;
@@ -251,11 +268,11 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update, float
break;
}
else {
- ImBuf *ibuf= IMB_allocImBuf(sj->dumpsx, sj->dumpsy, rd.planes, 0, 0);
+ ImBuf *ibuf= IMB_allocImBuf(sj->dumpsx, sj->dumpsy, rd.planes, 0);
char name[FILE_MAXDIR+FILE_MAXFILE];
int ok;
- BKE_makepicstring(name, rd.pic, cfra, rd.imtype, rd.scemode & R_EXTENSION);
+ BKE_makepicstring(name, rd.pic, cfra, rd.imtype, rd.scemode & R_EXTENSION, TRUE);
ibuf->rect= sj->dumprect;
ok= BKE_write_ibuf(sj->scene, ibuf, name, rd.imtype, rd.subimtype, rd.quality);
diff --git a/source/blender/editors/sculpt_paint/CMakeLists.txt b/source/blender/editors/sculpt_paint/CMakeLists.txt
index 3211763b619..fd527dd1ffc 100644
--- a/source/blender/editors/sculpt_paint/CMakeLists.txt
+++ b/source/blender/editors/sculpt_paint/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../imbuf
@@ -34,8 +32,18 @@ SET(INC
../../../../intern/guardedalloc
)
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ paint_image.c
+ paint_ops.c
+ paint_stroke.c
+ paint_undo.c
+ paint_utils.c
+ paint_vertex.c
+ sculpt.c
+ sculpt_undo.c
+
+ paint_intern.h
+ sculpt_intern.h
+)
-BLENDERLIB(bf_editor_sculpt_paint "${SRC}" "${INC}")
+blender_add_lib(bf_editor_sculpt_paint "${SRC}" "${INC}")
diff --git a/source/blender/editors/sculpt_paint/Makefile b/source/blender/editors/sculpt_paint/Makefile
deleted file mode 100644
index f9f39fea7eb..00000000000
--- a/source/blender/editors/sculpt_paint/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_sculpt_paint
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c
index 6e921b57d9d..6a8d5043c43 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -44,8 +44,10 @@
#include "BLI_dynstr.h"
#include "BLI_linklist.h"
#include "BLI_memarena.h"
-#include "PIL_time.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
+
+#include "PIL_time.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -163,17 +165,17 @@ typedef struct ImagePaintRegion {
#define PROJ_DEBUG_WINCLIP 1
/* projectFaceSeamFlags options */
-//#define PROJ_FACE_IGNORE 1<<0 /* When the face is hidden, backfacing or occluded */
-//#define PROJ_FACE_INIT 1<<1 /* When we have initialized the faces data */
-#define PROJ_FACE_SEAM1 1<<0 /* If this face has a seam on any of its edges */
-#define PROJ_FACE_SEAM2 1<<1
-#define PROJ_FACE_SEAM3 1<<2
-#define PROJ_FACE_SEAM4 1<<3
-
-#define PROJ_FACE_NOSEAM1 1<<4
-#define PROJ_FACE_NOSEAM2 1<<5
-#define PROJ_FACE_NOSEAM3 1<<6
-#define PROJ_FACE_NOSEAM4 1<<7
+//#define PROJ_FACE_IGNORE (1<<0) /* When the face is hidden, backfacing or occluded */
+//#define PROJ_FACE_INIT (1<<1) /* When we have initialized the faces data */
+#define PROJ_FACE_SEAM1 (1<<0) /* If this face has a seam on any of its edges */
+#define PROJ_FACE_SEAM2 (1<<1)
+#define PROJ_FACE_SEAM3 (1<<2)
+#define PROJ_FACE_SEAM4 (1<<3)
+
+#define PROJ_FACE_NOSEAM1 (1<<4)
+#define PROJ_FACE_NOSEAM2 (1<<5)
+#define PROJ_FACE_NOSEAM3 (1<<6)
+#define PROJ_FACE_NOSEAM4 (1<<7)
#define PROJ_SRC_VIEW 1
#define PROJ_SRC_IMAGE_CAM 2
@@ -189,8 +191,8 @@ typedef struct ImagePaintRegion {
#define PROJ_FACE_SCALE_SEAM 0.99f
#define PROJ_BUCKET_NULL 0
-#define PROJ_BUCKET_INIT 1<<0
-// #define PROJ_BUCKET_CLONE_INIT 1<<1
+#define PROJ_BUCKET_INIT (1<<0)
+// #define PROJ_BUCKET_CLONE_INIT (1<<1)
/* used for testing doubles, if a point is on a line etc */
#define PROJ_GEOM_TOLERANCE 0.00075f
@@ -383,7 +385,7 @@ static void *image_undo_push_tile(Image *ima, ImBuf *ibuf, ImBuf **tmpibuf, int
return tile->rect;
if (*tmpibuf==NULL)
- *tmpibuf = IMB_allocImBuf(IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE, 32, IB_rectfloat|IB_rect, 0);
+ *tmpibuf = IMB_allocImBuf(IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE, 32, IB_rectfloat|IB_rect);
tile= MEM_callocN(sizeof(UndoImageTile), "UndoImageTile");
strcpy(tile->idname, ima->id.name);
@@ -410,7 +412,7 @@ static void image_undo_restore(bContext *C, ListBase *lb)
UndoImageTile *tile;
tmpibuf= IMB_allocImBuf(IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE, 32,
- IB_rectfloat|IB_rect, 0);
+ IB_rectfloat|IB_rect);
for(tile=lb->first; tile; tile=tile->next) {
/* find image based on name, pointer becomes invalid with global undo */
@@ -430,7 +432,8 @@ static void image_undo_restore(bContext *C, ListBase *lb)
GPU_free_image(ima); /* force OpenGL reload */
if(ibuf->rect_float)
- imb_freerectImBuf(ibuf); /* force recreate of char rect */
+ ibuf->userflags |= IB_RECT_INVALID; /* force recreate of char rect */
+
}
IMB_freeImBuf(tmpibuf);
@@ -473,8 +476,6 @@ static int project_bucket_offset_safe(const ProjPaintState *ps, const float proj
}
}
-#define SIDE_OF_LINE(pa, pb, pp) ((pa[0]-pp[0])*(pb[1]-pp[1]))-((pb[0]-pp[0])*(pa[1]-pp[1]))
-
/* still use 2D X,Y space but this works for verts transformed by a perspective matrix, using their 4th component as a weight */
static void barycentric_weights_v2_persp(float v1[4], float v2[4], float v3[4], float co[2], float w[3])
{
@@ -639,9 +640,8 @@ static int project_paint_PickColor(const ProjPaintState *ps, float pt[2], float
}
}
else {
- xi = (int)((uv[0]*ibuf->x) + 0.5f);
- yi = (int)((uv[1]*ibuf->y) + 0.5f);
-
+ //xi = (int)((uv[0]*ibuf->x) + 0.5f);
+ //yi = (int)((uv[1]*ibuf->y) + 0.5f);
//if (xi<0 || xi>=ibuf->x || yi<0 || yi>=ibuf->y) return 0;
/* wrap */
@@ -936,7 +936,7 @@ static int pixel_bounds_array(float (* uv)[2], rcti *bounds_px, const int ibuf_x
#ifndef PROJ_DEBUG_NOSEAMBLEED
-/* This function returns 1 if this face has a seam along the 2 face-vert indicies
+/* This function returns 1 if this face has a seam along the 2 face-vert indices
* 'orig_i1_fidx' and 'orig_i2_fidx' */
static int check_seam(const ProjPaintState *ps, const int orig_face, const int orig_i1_fidx, const int orig_i2_fidx, int *other_face, int *orig_fidx)
{
@@ -949,7 +949,7 @@ static int check_seam(const ProjPaintState *ps, const int orig_face, const int o
const MFace *orig_mf = ps->dm_mface + orig_face;
const MTFace *orig_tf = ps->dm_mtface + orig_face;
- /* vert indicies from face vert order indicies */
+ /* vert indices from face vert order indices */
i1 = (*(&orig_mf->v1 + orig_i1_fidx));
i2 = (*(&orig_mf->v1 + orig_i2_fidx));
@@ -1013,8 +1013,11 @@ static void uv_image_outset(float (*orig_uv)[2], float (*outset_uv)[2], const fl
float puv[4][2]; /* pixelspace uv's */
float no1[2], no2[2], no3[2], no4[2]; /* normals */
float dir1[2], dir2[2], dir3[2], dir4[2];
- float ibuf_inv[2] = {1.0f / (float)ibuf_x, 1.0f / (float)ibuf_y};
-
+ float ibuf_inv[2];
+
+ ibuf_inv[0]= 1.0f / (float)ibuf_x;
+ ibuf_inv[1]= 1.0f / (float)ibuf_y;
+
/* make UV's in pixel space so we can */
puv[0][0] = orig_uv[0][0] * ibuf_x;
puv[0][1] = orig_uv[0][1] * ibuf_y;
@@ -1139,6 +1142,7 @@ static void project_face_seams_init(const ProjPaintState *ps, const int face_ind
/* TODO - move to arithb.c */
/* little sister we only need to know lambda */
+#ifndef PROJ_DEBUG_NOSEAMBLEED
static float lambda_cp_line2(const float p[2], const float l1[2], const float l2[2])
{
float h[2], u[2];
@@ -1151,6 +1155,7 @@ static float lambda_cp_line2(const float p[2], const float l1[2], const float l2
return(dot_v2v2(u, h)/dot_v2v2(u, u));
}
+#endif // PROJ_DEBUG_NOSEAMBLEED
/* Converts a UV location to a 3D screenspace location
@@ -1623,6 +1628,7 @@ static int line_clip_rect2f(
/* scale the quad & tri about its center
* scaling by PROJ_FACE_SCALE_SEAM (0.99x) is used for getting fake UV pixel coords that are on the
* edge of the face but slightly inside it occlusion tests dont return hits on adjacent faces */
+#ifndef PROJ_DEBUG_NOSEAMBLEED
static void scale_quad(float insetCos[4][3], float *origCos[4], const float inset)
{
float cent[3];
@@ -1666,7 +1672,7 @@ static void scale_tri(float insetCos[4][3], float *origCos[4], const float inset
add_v3_v3(insetCos[1], cent);
add_v3_v3(insetCos[2], cent);
}
-
+#endif //PROJ_DEBUG_NOSEAMBLEED
static float Vec2Lenf_nosqrt(const float *v1, const float *v2)
{
@@ -1689,7 +1695,7 @@ static float Vec2Lenf_nosqrt_other(const float *v1, const float v2_1, const floa
/* note, use a squared value so we can use Vec2Lenf_nosqrt
* be sure that you have done a bounds check first or this may fail */
/* only give bucket_bounds as an arg because we need it elsewhere */
-static int project_bucket_isect_circle(const int bucket_x, const int bucket_y, const float cent[2], const float radius_squared, rctf *bucket_bounds)
+static int project_bucket_isect_circle(const float cent[2], const float radius_squared, rctf *bucket_bounds)
{
/* Would normally to a simple intersection test, however we know the bounds of these 2 already intersect
@@ -1852,7 +1858,7 @@ static void project_bucket_clip_face(
{
int inside_bucket_flag = 0;
int inside_face_flag = 0;
- const int flip = ((SIDE_OF_LINE(v1coSS, v2coSS, v3coSS) > 0.0f) != (SIDE_OF_LINE(uv1co, uv2co, uv3co) > 0.0f));
+ const int flip = ((line_point_side_v2(v1coSS, v2coSS, v3coSS) > 0.0f) != (line_point_side_v2(uv1co, uv2co, uv3co) > 0.0f));
float bucket_bounds_ss[4][2];
@@ -2134,15 +2140,15 @@ if __name__ == '__main__':
/* checks if pt is inside a convex 2D polyline, the polyline must be ordered rotating clockwise
- * otherwise it would have to test for mixed (SIDE_OF_LINE > 0.0f) cases */
+ * otherwise it would have to test for mixed (line_point_side_v2 > 0.0f) cases */
int IsectPoly2Df(const float pt[2], float uv[][2], const int tot)
{
int i;
- if (SIDE_OF_LINE(uv[tot-1], uv[0], pt) < 0.0f)
+ if (line_point_side_v2(uv[tot-1], uv[0], pt) < 0.0f)
return 0;
for (i=1; i<tot; i++) {
- if (SIDE_OF_LINE(uv[i-1], uv[i], pt) < 0.0f)
+ if (line_point_side_v2(uv[i-1], uv[i], pt) < 0.0f)
return 0;
}
@@ -2152,10 +2158,10 @@ int IsectPoly2Df(const float pt[2], float uv[][2], const int tot)
static int IsectPoly2Df_twoside(const float pt[2], float uv[][2], const int tot)
{
int i;
- int side = (SIDE_OF_LINE(uv[tot-1], uv[0], pt) > 0.0f);
+ int side = (line_point_side_v2(uv[tot-1], uv[0], pt) > 0.0f);
for (i=1; i<tot; i++) {
- if ((SIDE_OF_LINE(uv[i-1], uv[i], pt) > 0.0f) != side)
+ if ((line_point_side_v2(uv[i-1], uv[i], pt) > 0.0f) != side)
return 0;
}
@@ -2496,26 +2502,32 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i
/* Only bother calculating the weights if we intersect */
if (ps->do_mask_normal || ps->dm_mtface_clone) {
-#if 0
- /* This is not QUITE correct since UV is not inside the UV's but good enough for seams */
+#if 1
+ /* get the UV on the line since we want to copy the pixels from there for bleeding */
+ float uv_close[2];
+ float fac= closest_to_line_v2(uv_close, uv, tf_uv_pxoffset[fidx1], tf_uv_pxoffset[fidx2]);
+ if (fac < 0.0f) copy_v2_v2(uv_close, tf_uv_pxoffset[fidx1]);
+ else if (fac > 1.0f) copy_v2_v2(uv_close, tf_uv_pxoffset[fidx2]);
+
if (side) {
- barycentric_weights_v2(tf_uv_pxoffset[0], tf_uv_pxoffset[2], tf_uv_pxoffset[3], uv, w);
+ barycentric_weights_v2(tf_uv_pxoffset[0], tf_uv_pxoffset[2], tf_uv_pxoffset[3], uv_close, w);
}
else {
- barycentric_weights_v2(tf_uv_pxoffset[0], tf_uv_pxoffset[1], tf_uv_pxoffset[2], uv, w);
+ barycentric_weights_v2(tf_uv_pxoffset[0], tf_uv_pxoffset[1], tf_uv_pxoffset[2], uv_close, w);
}
-#endif
-#if 1
+#else /* this is buggy with quads, dont use for now */
+
/* Cheat, we know where we are along the edge so work out the weights from that */
fac = fac1 + (fac * (fac2-fac1));
+
w[0]=w[1]=w[2]= 0.0;
if (side) {
- w[fidx1?fidx1-1:0] = fac;
- w[fidx2?fidx2-1:0] = 1.0f-fac;
+ w[fidx1?fidx1-1:0] = 1.0f-fac;
+ w[fidx2?fidx2-1:0] = fac;
}
else {
- w[fidx1] = fac;
- w[fidx2] = 1.0f-fac;
+ w[fidx1] = 1.0f-fac;
+ w[fidx2] = fac;
}
#endif
}
@@ -2565,7 +2577,7 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i
}
-/* takes floating point screenspace min/max and returns int min/max to be used as indicies for ps->bucketRect, ps->bucketFlags */
+/* takes floating point screenspace min/max and returns int min/max to be used as indices for ps->bucketRect, ps->bucketFlags */
static void project_paint_bucket_bounds(const ProjPaintState *ps, const float min[2], const float max[2], int bucketMin[2], int bucketMax[2])
{
/* divide by bucketWidth & bucketHeight so the bounds are offset in bucket grid units */
@@ -2652,7 +2664,7 @@ static void project_bucket_init(const ProjPaintState *ps, const int thread_index
* calculated when it might not be needed later, (at the moment at least)
* obviously it shouldn't have bugs though */
-static int project_bucket_face_isect(ProjPaintState *ps, float min[2], float max[2], int bucket_x, int bucket_y, int bucket_index, const MFace *mf)
+static int project_bucket_face_isect(ProjPaintState *ps, int bucket_x, int bucket_y, const MFace *mf)
{
/* TODO - replace this with a tricker method that uses sideofline for all screenCoords's edges against the closest bucket corner */
rctf bucket_bounds;
@@ -2712,11 +2724,11 @@ static int project_bucket_face_isect(ProjPaintState *ps, float min[2], float max
/* Add faces to the bucket but dont initialize its pixels
* TODO - when painting occluded, sort the faces on their min-Z and only add faces that faces that are not occluded */
-static void project_paint_delayed_face_init(ProjPaintState *ps, const MFace *mf, const MTFace *tf, const int face_index)
+static void project_paint_delayed_face_init(ProjPaintState *ps, const MFace *mf, const int face_index)
{
float min[2], max[2], *vCoSS;
int bucketMin[2], bucketMax[2]; /* for ps->bucketRect indexing */
- int fidx, bucket_x, bucket_y, bucket_index;
+ int fidx, bucket_x, bucket_y;
int has_x_isect = -1, has_isect = 0; /* for early loop exit */
MemArena *arena = ps->arena_mt[0]; /* just use the first thread arena since threading has not started yet */
@@ -2733,10 +2745,8 @@ static void project_paint_delayed_face_init(ProjPaintState *ps, const MFace *mf,
for (bucket_y = bucketMin[1]; bucket_y < bucketMax[1]; bucket_y++) {
has_x_isect = 0;
for (bucket_x = bucketMin[0]; bucket_x < bucketMax[0]; bucket_x++) {
-
- bucket_index = bucket_x + (bucket_y * ps->buckets_x);
-
- if (project_bucket_face_isect(ps, min, max, bucket_x, bucket_y, bucket_index, mf)) {
+ if (project_bucket_face_isect(ps, bucket_x, bucket_y, mf)) {
+ int bucket_index= bucket_x + (bucket_y * ps->buckets_x);
BLI_linklist_prepend_arena(
&ps->bucketFaces[ bucket_index ],
SET_INT_IN_POINTER(face_index), /* cast to a pointer to shut up the compiler */
@@ -2820,7 +2830,7 @@ static void project_paint_begin(ProjPaintState *ps)
/* Workaround for subsurf selection, try the display mesh first */
if (ps->source==PROJ_SRC_IMAGE_CAM) {
/* using render mesh, assume only camera was rendered from */
- ps->dm = mesh_create_derived_render(ps->scene, ps->ob, ps->v3d->customdata_mask | CD_MASK_MTFACE);
+ ps->dm = mesh_create_derived_render(ps->scene, ps->ob, ps->scene->customdata_mask | CD_MASK_MTFACE);
ps->dm_release= TRUE;
}
else if(ps->ob->derivedFinal && CustomData_has_layer( &ps->ob->derivedFinal->faceData, CD_MTFACE)) {
@@ -2828,7 +2838,7 @@ static void project_paint_begin(ProjPaintState *ps)
ps->dm_release= FALSE;
}
else {
- ps->dm = mesh_get_derived_final(ps->scene, ps->ob, ps->v3d->customdata_mask | CD_MASK_MTFACE);
+ ps->dm = mesh_get_derived_final(ps->scene, ps->ob, ps->scene->customdata_mask | CD_MASK_MTFACE);
ps->dm_release= TRUE;
}
@@ -3194,7 +3204,7 @@ static void project_paint_begin(ProjPaintState *ps)
}
}
else {
- if (SIDE_OF_LINE(v1coSS, v2coSS, v3coSS) < 0.0f) {
+ if (line_point_side_v2(v1coSS, v2coSS, v3coSS) < 0.0f) {
continue;
}
@@ -3217,7 +3227,7 @@ static void project_paint_begin(ProjPaintState *ps)
if (image_index != -1) {
/* Initialize the faces screen pixels */
/* Add this to a list to initialize later */
- project_paint_delayed_face_init(ps, mf, tf, face_index);
+ project_paint_delayed_face_init(ps, mf, face_index);
}
}
}
@@ -3500,7 +3510,7 @@ static int project_bucket_iter_next(ProjPaintState *ps, int *bucket_index, rctf
project_bucket_bounds(ps, ps->context_bucket_x, ps->context_bucket_y, bucket_bounds);
if ( (ps->source != PROJ_SRC_VIEW) ||
- project_bucket_isect_circle(ps->context_bucket_x, ps->context_bucket_y, mval, (float)(diameter*diameter), bucket_bounds)
+ project_bucket_isect_circle(mval, (float)(diameter*diameter), bucket_bounds)
) {
*bucket_index = ps->context_bucket_x + (ps->context_bucket_y * ps->buckets_x);
ps->context_bucket_x++;
@@ -3569,7 +3579,7 @@ static void blend_color_mix_accum(unsigned char *cp, const unsigned char *cp1, c
cp[3]= alpha > 255 ? 255 : alpha;
}
-static void do_projectpaint_clone(ProjPaintState *ps, ProjPixel *projPixel, float *rgba, float alpha, float mask)
+static void do_projectpaint_clone(ProjPaintState *ps, ProjPixel *projPixel, float alpha, float mask)
{
if (ps->is_airbrush==0 && mask < 1.0f) {
projPixel->newColor.uint = IMB_blend_color(projPixel->newColor.uint, ((ProjPixelClone*)projPixel)->clonepx.uint, (int)(alpha*255), ps->blend);
@@ -3580,7 +3590,7 @@ static void do_projectpaint_clone(ProjPaintState *ps, ProjPixel *projPixel, floa
}
}
-static void do_projectpaint_clone_f(ProjPaintState *ps, ProjPixel *projPixel, float *rgba, float alpha, float mask)
+static void do_projectpaint_clone_f(ProjPaintState *ps, ProjPixel *projPixel, float alpha, float mask)
{
if (ps->is_airbrush==0 && mask < 1.0f) {
IMB_blend_color_float(projPixel->newColor.f, projPixel->newColor.f, ((ProjPixelClone *)projPixel)->clonepx.f, alpha, ps->blend);
@@ -3597,7 +3607,7 @@ static void do_projectpaint_clone_f(ProjPaintState *ps, ProjPixel *projPixel, fl
* accumulation of color greater then 'projPixel->mask' however in the case of smear its not
* really that important to be correct as it is with clone and painting
*/
-static void do_projectpaint_smear(ProjPaintState *ps, ProjPixel *projPixel, float *rgba, float alpha, float mask, MemArena *smearArena, LinkNode **smearPixels, float co[2])
+static void do_projectpaint_smear(ProjPaintState *ps, ProjPixel *projPixel, float alpha, float mask, MemArena *smearArena, LinkNode **smearPixels, float co[2])
{
unsigned char rgba_ub[4];
@@ -3608,7 +3618,7 @@ static void do_projectpaint_smear(ProjPaintState *ps, ProjPixel *projPixel, floa
BLI_linklist_prepend_arena(smearPixels, (void *)projPixel, smearArena);
}
-static void do_projectpaint_smear_f(ProjPaintState *ps, ProjPixel *projPixel, float *rgba, float alpha, float mask, MemArena *smearArena, LinkNode **smearPixels_f, float co[2])
+static void do_projectpaint_smear_f(ProjPaintState *ps, ProjPixel *projPixel, float alpha, float mask, MemArena *smearArena, LinkNode **smearPixels_f, float co[2])
{
unsigned char rgba_ub[4];
unsigned char rgba_smear[4];
@@ -3757,6 +3767,7 @@ static void *do_projectpaint_thread(void *ph_v)
if (falloff > 0.0f) {
if (ps->is_texbrush) {
+ /* note, for clone and smear, we only use the alpha, could be a special function */
brush_sample_tex(ps->brush, projPixel->projCoSS, rgba, thread_index);
alpha = rgba[3];
} else {
@@ -3808,20 +3819,20 @@ static void *do_projectpaint_thread(void *ph_v)
case PAINT_TOOL_CLONE:
if (is_floatbuf) {
if (((ProjPixelClone *)projPixel)->clonepx.f[3]) {
- do_projectpaint_clone_f(ps, projPixel, rgba, alpha, mask);
+ do_projectpaint_clone_f(ps, projPixel, alpha, mask); /* rgba isnt used for cloning, only alpha */
}
}
else {
if (((ProjPixelClone*)projPixel)->clonepx.ch[3]) {
- do_projectpaint_clone(ps, projPixel, rgba, alpha, mask);
+ do_projectpaint_clone(ps, projPixel, alpha, mask); /* rgba isnt used for cloning, only alpha */
}
}
break;
case PAINT_TOOL_SMEAR:
sub_v2_v2v2(co, projPixel->projCoSS, pos_ofs);
- if (is_floatbuf) do_projectpaint_smear_f(ps, projPixel, rgba, alpha, mask, smearArena, &smearPixels_f, co);
- else do_projectpaint_smear(ps, projPixel, rgba, alpha, mask, smearArena, &smearPixels, co);
+ if (is_floatbuf) do_projectpaint_smear_f(ps, projPixel, alpha, mask, smearArena, &smearPixels_f, co);
+ else do_projectpaint_smear(ps, projPixel, alpha, mask, smearArena, &smearPixels, co);
break;
default:
if (is_floatbuf) do_projectpaint_draw_f(ps, projPixel, rgba, alpha, mask);
@@ -3861,7 +3872,7 @@ static void *do_projectpaint_thread(void *ph_v)
return NULL;
}
-static int project_paint_op(void *state, ImBuf *ibufb, float *lastpos, float *pos)
+static int project_paint_op(void *state, ImBuf *UNUSED(ibufb), float *lastpos, float *pos)
{
/* First unpack args from the struct */
ProjPaintState *ps = (ProjPaintState *)state;
@@ -3928,7 +3939,7 @@ static int project_paint_op(void *state, ImBuf *ibufb, float *lastpos, float *po
}
-static int project_paint_sub_stroke(ProjPaintState *ps, BrushPainter *painter, int *prevmval_i, int *mval_i, double time, float pressure)
+static int project_paint_sub_stroke(ProjPaintState *ps, BrushPainter *painter, int *UNUSED(prevmval_i), int *mval_i, double time, float pressure)
{
/* Use mouse coords as floats for projection painting */
@@ -3964,7 +3975,7 @@ static int project_paint_stroke(ProjPaintState *ps, BrushPainter *painter, int *
/* Imagepaint Partial Redraw & Dirty Region */
-static void imapaint_clear_partial_redraw()
+static void imapaint_clear_partial_redraw(void)
{
memset(&imapaintpartial, 0, sizeof(imapaintpartial));
}
@@ -4012,9 +4023,10 @@ static void imapaint_image_update(SpaceImage *sima, Image *image, ImBuf *ibuf, s
{
if(ibuf->rect_float)
/* TODO - should just update a portion from imapaintpartial! */
- imb_freerectImBuf(ibuf); /* force recreate of char rect */
+ ibuf->userflags |= IB_RECT_INVALID; /* force recreate of char rect */
+
if(ibuf->mipmap[0])
- imb_freemipmapImBuf(ibuf);
+ ibuf->userflags |= IB_MIPMAP_INVALID;
/* todo: should set_tpage create ->rect? */
if(texpaint || (sima && sima->lock)) {
@@ -4181,7 +4193,7 @@ static void imapaint_lift_smear(ImBuf *ibuf, ImBuf *ibufb, int *pos)
int a, tot;
imapaint_set_region(region, 0, 0, pos[0], pos[1], ibufb->x, ibufb->y);
- tot= imapaint_torus_split_region(region, ibuf, ibufb);
+ tot= imapaint_torus_split_region(region, ibufb, ibuf);
for(a=0; a<tot; a++)
IMB_rectblend(ibufb, ibuf, region[a].destx, region[a].desty,
@@ -4194,7 +4206,7 @@ static ImBuf *imapaint_lift_clone(ImBuf *ibuf, ImBuf *ibufb, int *pos)
/* note: allocImbuf returns zero'd memory, so regions outside image will
have zero alpha, and hence not be blended onto the image */
int w=ibufb->x, h=ibufb->y, destx=0, desty=0, srcx=pos[0], srcy=pos[1];
- ImBuf *clonebuf= IMB_allocImBuf(w, h, ibufb->depth, ibufb->flags, 0);
+ ImBuf *clonebuf= IMB_allocImBuf(w, h, ibufb->depth, ibufb->flags);
IMB_rectclip(clonebuf, ibuf, &destx, &desty, &srcx, &srcy, &w, &h);
IMB_rectblend(clonebuf, ibuf, destx, desty, srcx, srcy, w, h,
@@ -4387,7 +4399,7 @@ static int imapaint_paint_stroke(ViewContext *vc, ImagePaintState *s, BrushPaint
ibuf= BKE_image_get_ibuf(newimage, s->sima? &s->sima->iuser: NULL);
if(ibuf && ibuf->rect)
- imapaint_pick_uv(s->scene, s->ob, s->me, newfaceindex, mval, newuv);
+ imapaint_pick_uv(s->scene, s->ob, newfaceindex, mval, newuv);
else {
newimage = NULL;
newuv[0] = newuv[1] = 0.0f;
@@ -4398,8 +4410,8 @@ static int imapaint_paint_stroke(ViewContext *vc, ImagePaintState *s, BrushPaint
/* see if stroke is broken, and if so finish painting in old position */
if (s->image) {
- imapaint_pick_uv(s->scene, s->ob, s->me, s->faceindex, mval, fwuv);
- imapaint_pick_uv(s->scene, s->ob, s->me, newfaceindex, prevmval, bkuv);
+ imapaint_pick_uv(s->scene, s->ob, s->faceindex, mval, fwuv);
+ imapaint_pick_uv(s->scene, s->ob, newfaceindex, prevmval, bkuv);
if (newimage == s->image)
breakstroke= texpaint_break_stroke(s->uv, fwuv, bkuv, newuv);
@@ -4410,7 +4422,7 @@ static int imapaint_paint_stroke(ViewContext *vc, ImagePaintState *s, BrushPaint
fwuv[0]= fwuv[1]= 0.0f;
if (breakstroke) {
- imapaint_pick_uv(s->scene, s->ob, s->me, s->faceindex, mval, fwuv);
+ imapaint_pick_uv(s->scene, s->ob, s->faceindex, mval, fwuv);
redraw |= imapaint_paint_sub_stroke(s, painter, s->image, texpaint,
fwuv, time, 1, pressure);
imapaint_clear_partial_redraw();
@@ -4526,6 +4538,8 @@ typedef struct PaintOperation {
ViewContext vc;
wmTimer *timer;
+
+ short restore_projection;
} PaintOperation;
static void paint_redraw(bContext *C, ImagePaintState *s, int final)
@@ -4611,6 +4625,13 @@ static int texture_paint_init(bContext *C, wmOperator *op)
pop->first= 1;
op->customdata= pop;
+ /* XXX: Soften tool does not support projection painting atm, so just disable
+ projection for this brush */
+ if(brush->imagepaint_tool == PAINT_TOOL_SOFTEN) {
+ settings->imapaint.flag |= IMAGEPAINT_PROJECT_DISABLE;
+ pop->restore_projection = 1;
+ }
+
/* initialize from context */
if(CTX_wm_region_view3d(C)) {
pop->mode= PAINT_MODE_3D;
@@ -4731,6 +4752,9 @@ static void paint_exit(bContext *C, wmOperator *op)
if(pop->timer)
WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), pop->timer);
+ if(pop->restore_projection)
+ settings->imapaint.flag &= ~IMAGEPAINT_PROJECT_DISABLE;
+
settings->imapaint.flag &= ~IMAGEPAINT_DRAWING;
imapaint_canvas_free(&pop->s);
brush_painter_free(pop->painter);
@@ -4923,7 +4947,7 @@ static int get_imapaint_zoom(bContext *C, float *zoomx, float *zoomy)
/************************ cursor drawing *******************************/
-static void brush_drawcursor(bContext *C, int x, int y, void *customdata)
+static void brush_drawcursor(bContext *C, int x, int y, void *UNUSED(customdata))
{
Brush *brush= image_paint_brush(C);
Paint *paint= paint_get_active(CTX_data_scene(C));
@@ -4964,23 +4988,38 @@ static void toggle_paint_cursor(bContext *C, int enable)
settings->imapaint.paintcursor= WM_paint_cursor_activate(CTX_wm_manager(C), image_paint_poll, brush_drawcursor, NULL);
}
+/* enable the paint cursor if it isn't already.
+
+ purpose is to make sure the paint cursor is shown if paint
+ mode is enabled in the image editor. the paint poll will
+ ensure that the cursor is hidden when not in paint mode */
+void ED_space_image_paint_update(wmWindowManager *wm, ToolSettings *settings)
+{
+ ImagePaintSettings *imapaint = &settings->imapaint;
+
+ if(!imapaint->paintcursor) {
+ imapaint->paintcursor =
+ WM_paint_cursor_activate(wm, image_paint_poll,
+ brush_drawcursor, NULL);
+ }
+}
+
/* ************ image paint radial control *************/
static int paint_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
float zoom;
ToolSettings *ts = CTX_data_scene(C)->toolsettings;
get_imapaint_zoom(C, &zoom, &zoom);
- toggle_paint_cursor(C, !ts->imapaint.paintcursor);
+ toggle_paint_cursor(C, 0);
brush_radial_control_invoke(op, paint_brush(&ts->imapaint.paint), zoom);
return WM_radial_control_invoke(C, op, event);
}
static int paint_radial_control_modal(bContext *C, wmOperator *op, wmEvent *event)
{
- ToolSettings *ts = CTX_data_scene(C)->toolsettings;
int ret = WM_radial_control_modal(C, op, event);
if(ret != OPERATOR_RUNNING_MODAL)
- toggle_paint_cursor(C, !ts->imapaint.paintcursor);
+ toggle_paint_cursor(C, 1);
return ret;
}
@@ -4989,10 +5028,10 @@ static int paint_radial_control_exec(bContext *C, wmOperator *op)
Brush *brush = paint_brush(&CTX_data_scene(C)->toolsettings->imapaint.paint);
float zoom;
int ret;
- char str[256];
+ char str[64];
get_imapaint_zoom(C, &zoom, &zoom);
ret = brush_radial_control_exec(op, brush, 1.0f / zoom);
- WM_radial_control_string(op, str, 256);
+ WM_radial_control_string(op, str, sizeof(str));
WM_event_add_notifier(C, NC_BRUSH|NA_EDITED, brush);
@@ -5087,7 +5126,7 @@ static int grab_clone_modal(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
-static int grab_clone_cancel(bContext *C, wmOperator *op)
+static int grab_clone_cancel(bContext *UNUSED(C), wmOperator *op)
{
MEM_freeN(op->customdata);
return OPERATOR_CANCELLED;
@@ -5302,7 +5341,7 @@ static int texture_paint_toggle_exec(bContext *C, wmOperator *op)
toggle_paint_cursor(C, 1);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_SCENE|ND_MODE, scene);
return OPERATOR_FINISHED;
@@ -5336,8 +5375,8 @@ static int texture_paint_radial_control_exec(bContext *C, wmOperator *op)
{
Brush *brush = paint_brush(&CTX_data_scene(C)->toolsettings->imapaint.paint);
int ret = brush_radial_control_exec(op, brush, 1);
- char str[256];
- WM_radial_control_string(op, str, 256);
+ char str[64];
+ WM_radial_control_string(op, str, sizeof(str));
WM_event_add_notifier(C, NC_BRUSH|NA_EDITED, brush);
@@ -5385,13 +5424,11 @@ static int texture_paint_camera_project_exec(bContext *C, wmOperator *op)
{
Image *image= BLI_findlink(&CTX_data_main(C)->image, RNA_enum_get(op->ptr, "image"));
Scene *scene= CTX_data_scene(C);
- ProjPaintState ps;
+ ProjPaintState ps= {0};
int orig_brush_size;
IDProperty *idgroup;
IDProperty *view_data= NULL;
- memset(&ps, 0, sizeof(ps));
-
project_state_init(C, OBACT, &ps);
if(ps.ob==NULL || ps.ob->type != OB_MESH) {
@@ -5415,10 +5452,10 @@ static int texture_paint_camera_project_exec(bContext *C, wmOperator *op)
idgroup= IDP_GetProperties(&image->id, 0);
if(idgroup) {
- view_data= IDP_GetPropertyFromGroup(idgroup, PROJ_VIEW_DATA_ID);
+ view_data= IDP_GetPropertyTypeFromGroup(idgroup, PROJ_VIEW_DATA_ID, IDP_ARRAY);
/* type check to make sure its ok */
- if(view_data->len != PROJ_VIEW_DATA_SIZE || view_data->type != IDP_ARRAY || view_data->subtype != IDP_FLOAT) {
+ if(view_data->len != PROJ_VIEW_DATA_SIZE || view_data->subtype != IDP_FLOAT) {
BKE_report(op->reports, RPT_ERROR, "Image project data invalid.");
return OPERATOR_CANCELLED;
}
@@ -5572,6 +5609,7 @@ void PAINT_OT_image_from_view(wmOperatorType *ot)
/* api callbacks */
ot->exec= texture_paint_image_from_view_exec;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= OPTYPE_REGISTER;
diff --git a/source/blender/editors/sculpt_paint/paint_intern.h b/source/blender/editors/sculpt_paint/paint_intern.h
index 3ed314095ef..d0aa0c29c4d 100644
--- a/source/blender/editors/sculpt_paint/paint_intern.h
+++ b/source/blender/editors/sculpt_paint/paint_intern.h
@@ -29,19 +29,21 @@
#ifndef ED_PAINT_INTERN_H
#define ED_PAINT_INTERN_H
+struct ARegion;
struct bContext;
-struct Scene;
-struct Object;
+struct bglMats;
+struct Brush;
+struct ListBase;
struct Mesh;
+struct Object;
struct PaintStroke;
struct PointerRNA;
+struct Scene;
+struct VPaint;
struct ViewContext;
struct wmEvent;
struct wmOperator;
struct wmOperatorType;
-struct ARegion;
-struct VPaint;
-struct ListBase;
/* paint_stroke.c */
typedef int (*StrokeGetLocation)(struct bContext *C, struct PaintStroke *stroke, float location[3], float mouse[2]);
@@ -54,6 +56,8 @@ struct PaintStroke *paint_stroke_new(struct bContext *C,
StrokeUpdateStep update_step, StrokeDone done);
void paint_stroke_free(struct PaintStroke *stroke);
+int paint_space_stroke_enabled(struct Brush *br);
+
int paint_stroke_modal(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
int paint_stroke_exec(struct bContext *C, struct wmOperator *op);
struct ViewContext *paint_stroke_view_context(struct PaintStroke *stroke);
@@ -98,8 +102,11 @@ void PAINT_OT_image_from_view(struct wmOperatorType *ot);
/* paint_utils.c */
+void projectf(struct bglMats *mats, const float v[3], float p[2]);
+float paint_calc_object_space_radius(struct ViewContext *vc, float center[3], float pixel_radius);
+float paint_get_tex_pixel(struct Brush* br, float u, float v);
int imapaint_pick_face(struct ViewContext *vc, struct Mesh *me, int *mval, unsigned int *index);
-void imapaint_pick_uv(struct Scene *scene, struct Object *ob, struct Mesh *mesh, unsigned int faceindex, int *xy, float *uv);
+void imapaint_pick_uv(struct Scene *scene, struct Object *ob, unsigned int faceindex, int *xy, float *uv);
void paint_sample_color(struct Scene *scene, struct ARegion *ar, int x, int y);
void BRUSH_OT_curve_preset(struct wmOperatorType *ot);
@@ -111,11 +118,11 @@ void PAINT_OT_face_select_all(struct wmOperatorType *ot);
int facemask_paint_poll(struct bContext *C);
/* stroke operator */
-typedef enum wmBrushStrokeMode {
- WM_BRUSHSTROKE_NORMAL,
- WM_BRUSHSTROKE_INVERT,
- WM_BRUSHSTROKE_SMOOTH,
-} wmBrushStrokeMode;
+typedef enum BrushStrokeMode {
+ BRUSH_STROKE_NORMAL,
+ BRUSH_STROKE_INVERT,
+ BRUSH_STROKE_SMOOTH,
+} BrushStrokeMode;
/* paint_undo.c */
typedef void (*UndoRestoreCb)(struct bContext *C, struct ListBase *lb);
diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c
index b5cadb9c484..1ba0891751e 100644
--- a/source/blender/editors/sculpt_paint/paint_ops.c
+++ b/source/blender/editors/sculpt_paint/paint_ops.c
@@ -19,6 +19,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include "BLI_utildefines.h"
+
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -42,7 +44,7 @@
//#include <stdio.h>
/* Brush operators */
-static int brush_add_exec(bContext *C, wmOperator *op)
+static int brush_add_exec(bContext *C, wmOperator *UNUSED(op))
{
/*int type = RNA_enum_get(op->ptr, "type");*/
Paint *paint = paint_get_active(CTX_data_scene(C));
@@ -129,7 +131,7 @@ void BRUSH_OT_scale_size(wmOperatorType *ot)
RNA_def_float(ot->srna, "scalar", 1, 0, 2, "Scalar", "Factor to scale brush size by", 0, 2);
}
-static int vertex_color_set_exec(bContext *C, wmOperator *op)
+static int vertex_color_set_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene = CTX_data_scene(C);
Object *obact = CTX_data_active_object(C);
@@ -154,7 +156,7 @@ void PAINT_OT_vertex_color_set(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int brush_reset_exec(bContext *C, wmOperator *op)
+static int brush_reset_exec(bContext *C, wmOperator *UNUSED(op))
{
Paint *paint = paint_get_active(CTX_data_scene(C));
struct Brush *brush = paint_brush(paint);
@@ -224,73 +226,73 @@ void ED_operatortypes_paint(void)
}
-static void ed_keymap_paint_brush_switch(wmKeyMap *keymap, const char *path)
+static void ed_keymap_paint_brush_switch(wmKeyMap *keymap, const char *mode)
{
wmKeyMapItem *kmi;
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", ONEKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 0);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", TWOKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 1);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", THREEKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 2);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", FOURKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 3);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", FIVEKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 4);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", SIXKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 5);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", SEVENKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 6);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", EIGHTKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 7);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", NINEKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 8);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", ZEROKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 9);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", ONEKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 10);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", TWOKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 11);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", THREEKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 12);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", FOURKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 13);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", FIVEKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 14);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", SIXKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 15);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", SEVENKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 16);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", EIGHTKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 17);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", NINEKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 18);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", ZEROKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 19);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", ONEKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 0);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", TWOKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 1);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", THREEKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 2);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", FOURKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 3);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", FIVEKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 4);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", SIXKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 5);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", SEVENKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 6);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", EIGHTKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 7);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", NINEKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 8);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", ZEROKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 9);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", ONEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 10);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", TWOKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 11);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", THREEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 12);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", FOURKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 13);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", FIVEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 14);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", SIXKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 15);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", SEVENKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 16);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", EIGHTKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 17);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", NINEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 18);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", ZEROKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 19);
}
-static void ed_keymap_paint_brush_size(wmKeyMap *keymap, const char *path)
+static void ed_keymap_paint_brush_size(wmKeyMap *keymap, const char *UNUSED(path))
{
wmKeyMapItem *kmi;
@@ -315,11 +317,9 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", WM_RADIALCONTROL_STRENGTH);
RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_radial_control", FKEY, KM_PRESS, KM_CTRL, 0)->ptr, "mode", WM_RADIALCONTROL_ANGLE);
- RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, 0, 0)->ptr, "mode", WM_BRUSHSTROKE_NORMAL);
- RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "mode", WM_BRUSHSTROKE_INVERT);
- RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", WM_BRUSHSTROKE_SMOOTH);
-
- //stroke_mode_modal_keymap(keyconf);
+ RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, 0, 0)->ptr, "mode", BRUSH_STROKE_NORMAL);
+ RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "mode", BRUSH_STROKE_INVERT);
+ RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", BRUSH_STROKE_SMOOTH);
for(i=0; i<=5; i++)
RNA_int_set(WM_keymap_add_item(keymap, "OBJECT_OT_subdivision_set", ZEROKEY+i, KM_PRESS, KM_CTRL, 0)->ptr, "level", i);
@@ -333,7 +333,7 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
RNA_int_set(kmi->ptr, "level", -1);
RNA_boolean_set(kmi->ptr, "relative", 1);
- ed_keymap_paint_brush_switch(keymap, "tool_settings.sculpt.active_brush_index");
+ ed_keymap_paint_brush_switch(keymap, "sculpt");
ed_keymap_paint_brush_size(keymap, "tool_settings.sculpt.brush.size");
/* */
@@ -349,43 +349,6 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", AKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush.use_airbrush");
- /* brush switching */
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", DKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "SculptDraw");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", SKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "Smooth");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", PKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "Pinch/Magnify");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", GKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "Grab");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", LKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "Layer");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", CKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "Crease");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", CKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "Clay");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", IKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "Inflate/Deflate");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", TKEY, KM_PRESS, KM_SHIFT, 0); // was just T in 2.4x
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "Flatten/Contrast");
-
/* Vertex Paint mode */
keymap= WM_keymap_find(keyconf, "Vertex Paint", 0, 0);
keymap->poll= vertex_paint_mode_poll;
@@ -398,7 +361,7 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap,
"PAINT_OT_vertex_color_set",KKEY, KM_PRESS, KM_SHIFT, 0);
- ed_keymap_paint_brush_switch(keymap, "tool_settings.vertex_paint.active_brush_index");
+ ed_keymap_paint_brush_switch(keymap, "vertex_paint");
ed_keymap_paint_brush_size(keymap, "tool_settings.vertex_paint.brush.size");
kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); /* mask toggle */
@@ -416,7 +379,7 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap,
"PAINT_OT_weight_set", KKEY, KM_PRESS, KM_SHIFT, 0);
- ed_keymap_paint_brush_switch(keymap, "tool_settings.weight_paint.active_brush_index");
+ ed_keymap_paint_brush_switch(keymap, "weight_paint");
ed_keymap_paint_brush_size(keymap, "tool_settings.weight_paint.brush.size");
kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); /* mask toggle */
@@ -428,6 +391,9 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
keymap= WM_keymap_find(keyconf, "Image Paint", 0, 0);
keymap->poll= image_texture_paint_poll;
+ RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_image_paint_radial_control", FKEY, KM_PRESS, 0, 0)->ptr, "mode", WM_RADIALCONTROL_SIZE);
+ RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_image_paint_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", WM_RADIALCONTROL_STRENGTH);
+
RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_texture_paint_radial_control", FKEY, KM_PRESS, 0, 0)->ptr, "mode", WM_RADIALCONTROL_SIZE);
RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_texture_paint_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", WM_RADIALCONTROL_STRENGTH);
@@ -436,7 +402,7 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "PAINT_OT_sample_color", RIGHTMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "PAINT_OT_clone_cursor_set", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
- ed_keymap_paint_brush_switch(keymap, "tool_settings.image_paint.active_brush_index");
+ ed_keymap_paint_brush_switch(keymap, "image_paint");
ed_keymap_paint_brush_size(keymap, "tool_settings.image_paint.brush.size");
kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); /* mask toggle */
diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c
index 6d58731d79c..92b5c541ea2 100644
--- a/source/blender/editors/sculpt_paint/paint_stroke.c
+++ b/source/blender/editors/sculpt_paint/paint_stroke.c
@@ -28,6 +28,9 @@
#include "MEM_guardedalloc.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_brush_types.h"
@@ -41,9 +44,6 @@
#include "WM_api.h"
#include "WM_types.h"
-#include "BLI_math.h"
-
-
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -51,8 +51,9 @@
#include "ED_view3d.h"
#include "paint_intern.h"
-#include "sculpt_intern.h" // XXX, for expedience in getting this working, refactor later (or this just shows that this needs unification)
-
+/* still needed for sculpt_stroke_get_location, should be
+ removed eventually (TODO) */
+#include "sculpt_intern.h"
#include <float.h>
#include <math.h>
@@ -100,109 +101,6 @@ static void paint_draw_smooth_stroke(bContext *C, int x, int y, void *customdata
glDisable(GL_LINE_SMOOTH);
}
-#if 0
-
-// grid texture for testing
-
-#define GRID_WIDTH 8
-#define GRID_LENGTH 8
-
-#define W (0xFFFFFFFF)
-#define G (0x00888888)
-#define E (0xE1E1E1E1)
-#define C (0xC3C3C3C3)
-#define O (0xB4B4B4B4)
-#define Q (0xA9A9A9A9)
-
-static unsigned grid_texture0[256] =
-{
- W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,
-};
-
-static unsigned grid_texture1[64] =
-{
- C,C,C,C,C,C,C,C,
- C,G,G,G,G,G,G,C,
- C,G,G,G,G,G,G,C,
- C,G,G,G,G,G,G,C,
- C,G,G,G,G,G,G,C,
- C,G,G,G,G,G,G,C,
- C,G,G,G,G,G,G,C,
- C,C,C,C,C,C,C,C,
-};
-
-static unsigned grid_texture2[16] =
-{
- O,O,O,O,
- O,G,G,O,
- O,G,G,O,
- O,O,O,O,
-};
-
-static unsigned grid_texture3[4] =
-{
- Q,Q,
- Q,Q,
-};
-
-static unsigned grid_texture4[1] =
-{
- Q,
-};
-
-#undef W
-#undef G
-#undef E
-#undef C
-#undef O
-#undef Q
-
-static void load_grid()
-{
- static GLuint overlay_texture;
-
- if (!overlay_texture) {
- //GLfloat largest_supported_anisotropy;
-
- glGenTextures(1, &overlay_texture);
- glBindTexture(GL_TEXTURE_2D, overlay_texture);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture0);
- glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture1);
- glTexImage2D(GL_TEXTURE_2D, 2, GL_RGB, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture2);
- glTexImage2D(GL_TEXTURE_2D, 3, GL_RGB, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture3);
- glTexImage2D(GL_TEXTURE_2D, 4, GL_RGB, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture4);
- glEnable(GL_TEXTURE_2D);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
-
- //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-
- //glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest_supported_anisotropy);
- //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest_supported_anisotropy);
- }
-}
-
-#endif
-
-extern float get_tex_pixel(Brush* br, float u, float v);
-
typedef struct Snapshot {
float size[3];
float ofs[3];
@@ -253,7 +151,7 @@ static void make_snap(Snapshot* snap, Brush* brush, ViewContext* vc)
snap->winy = vc->ar->winy;
}
-int load_tex(Sculpt *sd, Brush* br, ViewContext* vc)
+static int load_tex(Sculpt *sd, Brush* br, ViewContext* vc)
{
static GLuint overlay_texture = 0;
static int init = 0;
@@ -268,8 +166,12 @@ int load_tex(Sculpt *sd, Brush* br, ViewContext* vc)
int j;
int refresh;
+#ifndef _OPENMP
+ (void)sd; /* quied unused warning */
+#endif
+
if (br->mtex.brush_map_mode == MTEX_MAP_MODE_TILED && !br->mtex.tex) return 0;
-
+
refresh =
!overlay_texture ||
(br->mtex.tex &&
@@ -369,7 +271,7 @@ int load_tex(Sculpt *sd, Brush* br, ViewContext* vc)
x += br->mtex.ofs[0];
y += br->mtex.ofs[1];
- avg = br->mtex.tex ? get_tex_pixel(br, x, y) : 1;
+ avg = br->mtex.tex ? paint_get_tex_pixel(br, x, y) : 1;
avg += br->texture_sample_bias;
@@ -420,18 +322,6 @@ int load_tex(Sculpt *sd, Brush* br, ViewContext* vc)
return 1;
}
-/* Convert a point in model coordinates to 2D screen coordinates. */
-// XXX duplicated from sculpt.c, deal with this later.
-static void projectf(bglMats *mats, const float v[3], float p[2])
-{
- double ux, uy, uz;
-
- gluProject(v[0],v[1],v[2], mats->modelview, mats->projection,
- (GLint *)mats->viewport, &ux, &uy, &uz);
- p[0]= ux;
- p[1]= uy;
-}
-
static int project_brush_radius(RegionView3D* rv3d, float radius, float location[3], bglMats* mats)
{
float view[3], nonortho[3], ortho[3], offset[3], p1[2], p2[2];
@@ -472,7 +362,8 @@ static int project_brush_radius(RegionView3D* rv3d, float radius, float location
return len_v2v2(p1, p2);
}
-int sculpt_get_brush_geometry(bContext* C, int x, int y, int* pixel_radius, float location[3], float modelview[16], float projection[16], int viewport[4])
+int sculpt_get_brush_geometry(bContext* C, int x, int y, int* pixel_radius,
+ float location[3])
{
struct PaintStroke *stroke;
float window[2];
@@ -483,12 +374,11 @@ int sculpt_get_brush_geometry(bContext* C, int x, int y, int* pixel_radius, floa
window[0] = x + stroke->vc.ar->winrct.xmin;
window[1] = y + stroke->vc.ar->winrct.ymin;
- memcpy(modelview, stroke->vc.rv3d->viewmat, sizeof(float[16]));
- memcpy(projection, stroke->vc.rv3d->winmat, sizeof(float[16]));
- memcpy(viewport, stroke->mats.viewport, sizeof(int[4]));
-
- if (stroke->vc.obact->sculpt && stroke->vc.obact->sculpt->pbvh && sculpt_stroke_get_location(C, stroke, location, window)) {
- *pixel_radius = project_brush_radius(stroke->vc.rv3d, brush_unprojected_radius(stroke->brush), location, &stroke->mats);
+ if(stroke->vc.obact->sculpt && stroke->vc.obact->sculpt->pbvh &&
+ sculpt_stroke_get_location(C, stroke, location, window)) {
+ *pixel_radius = project_brush_radius(stroke->vc.rv3d,
+ brush_unprojected_radius(stroke->brush),
+ location, &stroke->mats);
if (*pixel_radius == 0)
*pixel_radius = brush_size(stroke->brush);
@@ -510,58 +400,174 @@ int sculpt_get_brush_geometry(bContext* C, int x, int y, int* pixel_radius, floa
return hit;
}
-// XXX duplicated from sculpt.c
-float unproject_brush_radius(Object *ob, ViewContext *vc, float center[3], float offset)
+/* Draw an overlay that shows what effect the brush's texture will
+ have on brush strength */
+/* TODO: sculpt only for now */
+static void paint_draw_alpha_overlay(Sculpt *sd, Brush *brush,
+ ViewContext *vc, int x, int y)
{
- float delta[3], scale, loc[3];
+ rctf quad;
+
+ /* check for overlay mode */
+ if(!(brush->flag & BRUSH_TEXTURE_OVERLAY) ||
+ !(ELEM(brush->mtex.brush_map_mode, MTEX_MAP_MODE_FIXED, MTEX_MAP_MODE_TILED)))
+ return;
+
+ /* save lots of GL state
+ TODO: check on whether all of these are needed? */
+ glPushAttrib(GL_COLOR_BUFFER_BIT|
+ GL_CURRENT_BIT|
+ GL_DEPTH_BUFFER_BIT|
+ GL_ENABLE_BIT|
+ GL_LINE_BIT|
+ GL_POLYGON_BIT|
+ GL_STENCIL_BUFFER_BIT|
+ GL_TRANSFORM_BIT|
+ GL_VIEWPORT_BIT|
+ GL_TEXTURE_BIT);
+
+ if(load_tex(sd, brush, vc)) {
+ glEnable(GL_BLEND);
- mul_v3_m4v3(loc, ob->obmat, center);
+ glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ glDepthMask(GL_FALSE);
+ glDepthFunc(GL_ALWAYS);
+
+ glMatrixMode(GL_TEXTURE);
+ glPushMatrix();
+ glLoadIdentity();
+
+ if(brush->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) {
+ /* brush rotation */
+ glTranslatef(0.5f, 0.5f, 0);
+ glRotatef(((brush->flag & BRUSH_RAKE) ?
+ sd->last_angle : sd->special_rotation) * (180.0f/M_PI),
+ 0, 0, 1);
+ glTranslatef(-0.5f, -0.5f, 0);
+
+ /* scale based on tablet pressure */
+ if(sd->draw_pressure && brush_use_size_pressure(brush)) {
+ glTranslatef(0.5f, 0.5f, 0);
+ glScalef(1.0f/sd->pressure_value, 1.0f/sd->pressure_value, 1);
+ glTranslatef(-0.5f, -0.5f, 0);
+ }
- initgrabz(vc->rv3d, loc[0], loc[1], loc[2]);
- window_to_3d_delta(vc->ar, delta, offset, 0);
+ if(sd->draw_anchored) {
+ const float *aim = sd->anchored_initial_mouse;
+ const rcti *win = &vc->ar->winrct;
+ quad.xmin = aim[0]-sd->anchored_size - win->xmin;
+ quad.ymin = aim[1]-sd->anchored_size - win->ymin;
+ quad.xmax = aim[0]+sd->anchored_size - win->xmin;
+ quad.ymax = aim[1]+sd->anchored_size - win->ymin;
+ }
+ else {
+ const int radius= brush_size(brush);
+ quad.xmin = x - radius;
+ quad.ymin = y - radius;
+ quad.xmax = x + radius;
+ quad.ymax = y + radius;
+ }
+ }
+ else {
+ quad.xmin = 0;
+ quad.ymin = 0;
+ quad.xmax = vc->ar->winrct.xmax - vc->ar->winrct.xmin;
+ quad.ymax = vc->ar->winrct.ymax - vc->ar->winrct.ymin;
+ }
- scale= fabsf(mat4_to_scale(ob->obmat));
- scale= (scale == 0.0f)? 1.0f: scale;
+ /* set quad color */
+ glColor4f(U.sculpt_paint_overlay_col[0],
+ U.sculpt_paint_overlay_col[1],
+ U.sculpt_paint_overlay_col[2],
+ brush->texture_overlay_alpha / 100.0f);
+
+ /* draw textured quad */
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex2f(quad.xmin, quad.ymin);
+ glTexCoord2f(1, 0);
+ glVertex2f(quad.xmax, quad.ymin);
+ glTexCoord2f(1, 1);
+ glVertex2f(quad.xmax, quad.ymax);
+ glTexCoord2f(0, 1);
+ glVertex2f(quad.xmin, quad.ymax);
+ glEnd();
+
+ glPopMatrix();
+ }
- return len_v3(delta)/scale;
+ glPopAttrib();
}
-// XXX paint cursor now does a lot of the same work that is needed during a sculpt stroke
-// problem: all this stuff was not intended to be used at this point, so things feel a
-// bit hacked. I've put lots of stuff in Brush that probably better goes in Paint
-// Functions should be refactored so that they can be used between sculpt.c and
-// paint_stroke.c clearly and optimally and the lines of communication between the
-// two modules should be more clearly defined.
-static void paint_draw_cursor(bContext *C, int x, int y, void *unused)
+/* Special actions taken when paint cursor goes over mesh */
+/* TODO: sculpt only for now */
+static void paint_cursor_on_hit(Sculpt *sd, Brush *brush, ViewContext *vc,
+ float location[3], float *visual_strength)
{
- ViewContext vc;
-
- (void)unused;
+ float unprojected_radius, projected_radius;
- view3d_set_viewcontext(C, &vc);
-
- if (vc.obact->sculpt) {
- Paint *paint = paint_get_active(CTX_data_scene(C));
- Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
- Brush *brush = paint_brush(paint);
+ /* TODO: check whether this should really only be done when
+ brush is over mesh? */
+ if(sd->draw_pressure && brush_use_alpha_pressure(brush))
+ (*visual_strength) *= sd->pressure_value;
- int pixel_radius, viewport[4];
- float location[3], modelview[16], projection[16];
+ if(sd->draw_anchored)
+ projected_radius = sd->anchored_size;
+ else {
+ if(brush->flag & BRUSH_ANCHORED)
+ projected_radius = 8;
+ else
+ projected_radius = brush_size(brush);
+ }
+ unprojected_radius = paint_calc_object_space_radius(vc, location,
+ projected_radius);
- int hit;
+ if(sd->draw_pressure && brush_use_size_pressure(brush))
+ unprojected_radius *= sd->pressure_value;
- int flip;
- int sign;
+ if(!brush_use_locked_size(brush))
+ brush_set_unprojected_radius(brush, unprojected_radius);
+}
- float* col;
- float alpha;
+static void paint_draw_cursor(bContext *C, int x, int y, void *UNUSED(unused))
+{
+ Paint *paint = paint_get_active(CTX_data_scene(C));
+ Brush *brush = paint_brush(paint);
+ ViewContext vc;
+ float final_radius;
+ float translation[2];
+ float outline_alpha, *outline_col;
+
+ /* set various defaults */
+ translation[0] = x;
+ translation[1] = y;
+ outline_alpha = 0.5;
+ outline_col = brush->add_col;
+ final_radius = brush_size(brush);
+
+ /* check that brush drawing is enabled */
+ if(!(paint->flags & PAINT_SHOW_BRUSH))
+ return;
+
+ /* can't use stroke vc here because this will be called during
+ mouse over too, not just during a stroke */
+ view3d_set_viewcontext(C, &vc);
+ /* TODO: as sculpt and other paint modes are unified, this
+ special mode of drawing will go away */
+ if(vc.obact->sculpt) {
+ Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
+ float location[3];
+ int pixel_radius, hit;
const float root_alpha = brush_alpha(brush);
float visual_strength = root_alpha*root_alpha;
-
const float min_alpha = 0.20f;
const float max_alpha = 0.80f;
+ /* this is probably here so that rake takes into
+ account the brush movements before the stroke
+ starts, but this doesn't really belong in draw code
+ (TODO) */
{
const float u = 0.5f;
const float v = 1 - u;
@@ -570,7 +576,7 @@ static void paint_draw_cursor(bContext *C, int x, int y, void *unused)
const float dx = sd->last_x - x;
const float dy = sd->last_y - y;
- if (dx*dx + dy*dy >= r*r) {
+ if(dx*dx + dy*dy >= r*r) {
sd->last_angle = atan2(dx, dy);
sd->last_x = u*sd->last_x + v*x;
@@ -578,252 +584,106 @@ static void paint_draw_cursor(bContext *C, int x, int y, void *unused)
}
}
- if(!brush_use_locked_size(brush) && !(paint->flags & PAINT_SHOW_BRUSH))
- return;
+ /* test if brush is over the mesh */
+ hit = sculpt_get_brush_geometry(C, x, y, &pixel_radius, location);
- hit = sculpt_get_brush_geometry(C, x, y, &pixel_radius, location, modelview, projection, viewport);
+ /* draw overlay */
+ paint_draw_alpha_overlay(sd, brush, &vc, x, y);
- if (brush_use_locked_size(brush))
+ if(brush_use_locked_size(brush))
brush_set_size(brush, pixel_radius);
- // XXX: no way currently to know state of pen flip or invert key modifier without starting a stroke
- flip = 1;
-
- sign = flip * ((brush->flag & BRUSH_DIR_IN)? -1 : 1);
-
- if (sign < 0 && ELEM4(brush->sculpt_tool, SCULPT_TOOL_DRAW, SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY, SCULPT_TOOL_PINCH))
- col = brush->sub_col;
- else
- col = brush->add_col;
-
- alpha = (paint->flags & PAINT_SHOW_BRUSH_ON_SURFACE) ? min_alpha + (visual_strength*(max_alpha-min_alpha)) : 0.50f;
-
- if (ELEM(brush->mtex.brush_map_mode, MTEX_MAP_MODE_FIXED, MTEX_MAP_MODE_TILED) && brush->flag & BRUSH_TEXTURE_OVERLAY) {
- glPushAttrib(
- GL_COLOR_BUFFER_BIT|
- GL_CURRENT_BIT|
- GL_DEPTH_BUFFER_BIT|
- GL_ENABLE_BIT|
- GL_LINE_BIT|
- GL_POLYGON_BIT|
- GL_STENCIL_BUFFER_BIT|
- GL_TRANSFORM_BIT|
- GL_VIEWPORT_BIT|
- GL_TEXTURE_BIT);
-
- if (load_tex(sd, brush, &vc)) {
- glEnable(GL_BLEND);
-
- glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
- glDepthMask(GL_FALSE);
- glDepthFunc(GL_ALWAYS);
-
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
- glLoadIdentity();
-
- if (brush->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) {
- glTranslatef(0.5f, 0.5f, 0);
-
- if (brush->flag & BRUSH_RAKE) {
- glRotatef(sd->last_angle*(float)(180.0/M_PI), 0, 0, 1);
- }
- else {
- glRotatef(sd->special_rotation*(float)(180.0/M_PI), 0, 0, 1);
- }
-
- glTranslatef(-0.5f, -0.5f, 0);
-
- if (sd->draw_pressure && brush_use_size_pressure(brush)) {
- glTranslatef(0.5f, 0.5f, 0);
- glScalef(1.0f/sd->pressure_value, 1.0f/sd->pressure_value, 1);
- glTranslatef(-0.5f, -0.5f, 0);
- }
- }
-
- glColor4f(
- U.sculpt_paint_overlay_col[0],
- U.sculpt_paint_overlay_col[1],
- U.sculpt_paint_overlay_col[2],
- brush->texture_overlay_alpha / 100.0f);
-
- glBegin(GL_QUADS);
- if (brush->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) {
- if (sd->draw_anchored) {
- glTexCoord2f(0, 0);
- glVertex2f(sd->anchored_initial_mouse[0]-sd->anchored_size - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1]-sd->anchored_size - vc.ar->winrct.ymin);
-
- glTexCoord2f(1, 0);
- glVertex2f(sd->anchored_initial_mouse[0]+sd->anchored_size - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1]-sd->anchored_size - vc.ar->winrct.ymin);
-
- glTexCoord2f(1, 1);
- glVertex2f(sd->anchored_initial_mouse[0]+sd->anchored_size - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1]+sd->anchored_size - vc.ar->winrct.ymin);
-
- glTexCoord2f(0, 1);
- glVertex2f(sd->anchored_initial_mouse[0]-sd->anchored_size - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1]+sd->anchored_size - vc.ar->winrct.ymin);
- }
- else {
- const int radius= brush_size(brush);
-
- glTexCoord2f(0, 0);
- glVertex2f((float)x-radius, (float)y-radius);
-
- glTexCoord2f(1, 0);
- glVertex2f((float)x+radius, (float)y-radius);
-
- glTexCoord2f(1, 1);
- glVertex2f((float)x+radius, (float)y+radius);
-
- glTexCoord2f(0, 1);
- glVertex2f((float)x-radius, (float)y+radius);
- }
- }
- else {
- glTexCoord2f(0, 0);
- glVertex2f(0, 0);
-
- glTexCoord2f(1, 0);
- glVertex2f(viewport[2], 0);
-
- glTexCoord2f(1, 1);
- glVertex2f(viewport[2], viewport[3]);
-
- glTexCoord2f(0, 1);
- glVertex2f(0, viewport[3]);
- }
- glEnd();
-
- glPopMatrix();
- }
-
- glPopAttrib();
+ /* check if brush is subtracting, use different color then */
+ /* TODO: no way currently to know state of pen flip or
+ invert key modifier without starting a stroke */
+ if((!(brush->flag & BRUSH_INVERTED) ^
+ !(brush->flag & BRUSH_DIR_IN)) &&
+ ELEM5(brush->sculpt_tool, SCULPT_TOOL_DRAW,
+ SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY,
+ SCULPT_TOOL_PINCH, SCULPT_TOOL_CREASE))
+ outline_col = brush->sub_col;
+
+ /* only do if brush is over the mesh */
+ if(hit)
+ paint_cursor_on_hit(sd, brush, &vc, location, &visual_strength);
+
+ /* don't show effect of strength past the soft limit */
+ if(visual_strength > 1)
+ visual_strength = 1;
+
+ outline_alpha = ((paint->flags & PAINT_SHOW_BRUSH_ON_SURFACE) ?
+ min_alpha + (visual_strength*(max_alpha-min_alpha)) : 0.50f);
+
+ if(sd->draw_anchored) {
+ final_radius = sd->anchored_size;
+ translation[0] = sd->anchored_initial_mouse[0] - vc.ar->winrct.xmin;
+ translation[1] = sd->anchored_initial_mouse[1] - vc.ar->winrct.ymin;
}
+ }
- if (hit) {
- float unprojected_radius;
-
- // XXX duplicated from brush_strength & paint_stroke_add_step, refactor later
- //wmEvent* event = CTX_wm_window(C)->eventstate;
-
- if (sd->draw_pressure && brush_use_alpha_pressure(brush))
- visual_strength *= sd->pressure_value;
-
- // don't show effect of strength past the soft limit
- if (visual_strength > 1) visual_strength = 1;
-
- if (sd->draw_anchored) {
- unprojected_radius = unproject_brush_radius(CTX_data_active_object(C), &vc, location, sd->anchored_size);
- }
- else {
- if (brush->flag & BRUSH_ANCHORED)
- unprojected_radius = unproject_brush_radius(CTX_data_active_object(C), &vc, location, 8);
- else
- unprojected_radius = unproject_brush_radius(CTX_data_active_object(C), &vc, location, brush_size(brush));
- }
-
- if (sd->draw_pressure && brush_use_size_pressure(brush))
- unprojected_radius *= sd->pressure_value;
-
- if (!brush_use_locked_size(brush))
- brush_set_unprojected_radius(brush, unprojected_radius);
-
- if(!(paint->flags & PAINT_SHOW_BRUSH))
- return;
-
- }
+ /* make lines pretty */
+ glEnable(GL_BLEND);
+ glEnable(GL_LINE_SMOOTH);
- glPushAttrib(
- GL_COLOR_BUFFER_BIT|
- GL_CURRENT_BIT|
- GL_DEPTH_BUFFER_BIT|
- GL_ENABLE_BIT|
- GL_LINE_BIT|
- GL_POLYGON_BIT|
- GL_STENCIL_BUFFER_BIT|
- GL_TRANSFORM_BIT|
- GL_VIEWPORT_BIT|
- GL_TEXTURE_BIT);
+ /* set brush color */
+ glColor4f(outline_col[0], outline_col[1], outline_col[2], outline_alpha);
- glColor4f(col[0], col[1], col[2], alpha);
+ /* draw brush outline */
+ glTranslatef(translation[0], translation[1], 0);
+ glutil_draw_lined_arc(0.0, M_PI*2.0, final_radius, 40);
+ glTranslatef(-translation[0], -translation[1], 0);
- glEnable(GL_BLEND);
+ /* restore GL state */
+ glDisable(GL_BLEND);
+ glDisable(GL_LINE_SMOOTH);
+}
- glEnable(GL_LINE_SMOOTH);
+/* if this is a tablet event, return tablet pressure and set *pen_flip
+ to 1 if the eraser tool is being used, 0 otherwise */
+static float event_tablet_data(wmEvent *event, int *pen_flip)
+{
+ int erasor = 0;
+ float pressure = 1;
- if (sd->draw_anchored) {
- glTranslatef(sd->anchored_initial_mouse[0] - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1] - vc.ar->winrct.ymin, 0.0f);
- glutil_draw_lined_arc(0.0, M_PI*2.0, sd->anchored_size, 40);
- glTranslatef(-sd->anchored_initial_mouse[0] + vc.ar->winrct.xmin, -sd->anchored_initial_mouse[1] + vc.ar->winrct.xmin, 0.0f);
- }
- else {
- glTranslatef((float)x, (float)y, 0.0f);
- glutil_draw_lined_arc(0.0, M_PI*2.0, brush_size(brush), 40);
- glTranslatef(-(float)x, -(float)y, 0.0f);
- }
+ if(event->custom == EVT_DATA_TABLET) {
+ wmTabletData *wmtab= event->customdata;
- glPopAttrib();
+ erasor = (wmtab->Active == EVT_TABLET_ERASER);
+ pressure = (wmtab->Active != EVT_TABLET_NONE) ? wmtab->Pressure : 1;
}
- else {
- Paint *paint = paint_get_active(CTX_data_scene(C));
- Brush *brush = paint_brush(paint);
-
- if(!(paint->flags & PAINT_SHOW_BRUSH))
- return;
-
- glColor4f(brush->add_col[0], brush->add_col[1], brush->add_col[2], 0.5f);
- glEnable(GL_LINE_SMOOTH);
- glEnable(GL_BLEND);
- glTranslatef((float)x, (float)y, 0.0f);
- glutil_draw_lined_arc(0.0, M_PI*2.0, brush_size(brush), 40); // XXX: for now use the brushes size instead of potentially using the unified size because the feature has been enabled for sculpt
- glTranslatef((float)-x, (float)-y, 0.0f);
+ if(pen_flip)
+ (*pen_flip) = erasor;
- glDisable(GL_BLEND);
- glDisable(GL_LINE_SMOOTH);
- }
+ return pressure;
}
/* Put the location of the next stroke dot into the stroke RNA and apply it to the mesh */
static void paint_brush_stroke_add_step(bContext *C, wmOperator *op, wmEvent *event, float mouse_in[2])
{
- Paint *paint = paint_get_active(CTX_data_scene(C)); // XXX
- Brush *brush = paint_brush(paint); // XXX
-
+ Paint *paint = paint_get_active(CTX_data_scene(C));
+ Brush *brush = paint_brush(paint);
+ PaintStroke *stroke = op->customdata;
float mouse[3];
-
PointerRNA itemptr;
-
float location[3];
-
float pressure;
- int pen_flip;
-
- ViewContext vc; // XXX
-
- PaintStroke *stroke = op->customdata;
+ int pen_flip;
- view3d_set_viewcontext(C, &vc); // XXX
+ /* see if tablet affects event */
+ pressure = event_tablet_data(event, &pen_flip);
- /* Tablet */
- if(event->custom == EVT_DATA_TABLET) {
- wmTabletData *wmtab= event->customdata;
-
- pressure = (wmtab->Active != EVT_TABLET_NONE) ? wmtab->Pressure : 1;
- pen_flip = (wmtab->Active == EVT_TABLET_ERASER);
- }
- else {
- pressure = 1;
- pen_flip = 0;
- }
-
- // XXX: temporary check for sculpt mode until things are more unified
- if (vc.obact->sculpt) {
+ /* TODO: as sculpt and other paint modes are unified, this
+ separation will go away */
+ if(stroke->vc.obact->sculpt) {
float delta[3];
brush_jitter_pos(brush, mouse_in, mouse);
- // XXX: meh, this is round about because brush_jitter_pos isn't written in the best way to be reused here
- if (brush->flag & BRUSH_JITTER_PRESSURE) {
+ /* XXX: meh, this is round about because
+ brush_jitter_pos isn't written in the best way to
+ be reused here */
+ if(brush->flag & BRUSH_JITTER_PRESSURE) {
sub_v3_v3v3(delta, mouse, mouse_in);
mul_v3_fl(delta, pressure);
add_v3_v3v3(mouse, mouse_in, delta);
@@ -832,7 +692,7 @@ static void paint_brush_stroke_add_step(bContext *C, wmOperator *op, wmEvent *ev
else
copy_v3_v3(mouse, mouse_in);
- /* XXX: can remove the if statement once all modes have this */
+ /* TODO: can remove the if statement once all modes have this */
if(stroke->get_location)
stroke->get_location(C, stroke, location, mouse);
else
@@ -841,10 +701,10 @@ static void paint_brush_stroke_add_step(bContext *C, wmOperator *op, wmEvent *ev
/* Add to stroke */
RNA_collection_add(op->ptr, "stroke", &itemptr);
- RNA_float_set_array(&itemptr, "location", location);
- RNA_float_set_array(&itemptr, "mouse", mouse);
- RNA_boolean_set (&itemptr, "pen_flip", pen_flip);
- RNA_float_set (&itemptr, "pressure", pressure);
+ RNA_float_set_array(&itemptr, "location", location);
+ RNA_float_set_array(&itemptr, "mouse", mouse);
+ RNA_boolean_set(&itemptr, "pen_flip", pen_flip);
+ RNA_float_set(&itemptr, "pressure", pressure);
stroke->last_mouse_position[0] = mouse[0];
stroke->last_mouse_position[1] = mouse[1];
@@ -878,14 +738,6 @@ static int paint_smooth_stroke(PaintStroke *stroke, float output[2], wmEvent *ev
return 1;
}
-/* Returns zero if the stroke dots should not be spaced, non-zero otherwise */
-static int paint_space_stroke_enabled(Brush *br)
-{
- return (br->flag & BRUSH_SPACE) &&
- !(br->flag & BRUSH_ANCHORED) &&
- !ELEM4(br->sculpt_tool, SCULPT_TOOL_GRAB, SCULPT_TOOL_THUMB, SCULPT_TOOL_ROTATE, SCULPT_TOOL_SNAKE_HOOK);
-}
-
/* For brushes with stroke spacing enabled, moves mouse in steps
towards the final mouse location. */
static int paint_space_stroke(bContext *C, wmOperator *op, wmEvent *event, const float final_mouse[2])
@@ -906,23 +758,24 @@ static int paint_space_stroke(bContext *C, wmOperator *op, wmEvent *event, const
if(length > FLT_EPSILON) {
int steps;
int i;
- float pressure = 1;
-
- // XXX duplicate code
- if(event->custom == EVT_DATA_TABLET) {
- wmTabletData *wmtab= event->customdata;
- if(wmtab->Active != EVT_TABLET_NONE)
- pressure = brush_use_size_pressure(stroke->brush) ? wmtab->Pressure : 1;
- }
-
- scale = (brush_size(stroke->brush)*pressure*stroke->brush->spacing/50.0f) / length;
- mul_v2_fl(vec, scale);
-
- steps = (int)(1.0f / scale);
-
- for(i = 0; i < steps; ++i, ++cnt) {
- add_v2_v2(mouse, vec);
- paint_brush_stroke_add_step(C, op, event, mouse);
+ float pressure= 1.0f;
+
+ /* XXX mysterious :) what has 'use size' do with this here... if you don't check for it, pressure fails */
+ if(brush_use_size_pressure(stroke->brush))
+ pressure = event_tablet_data(event, NULL);
+
+ if(pressure > FLT_EPSILON) {
+ scale = (brush_size(stroke->brush)*pressure*stroke->brush->spacing/50.0f) / length;
+ if(scale > FLT_EPSILON) {
+ mul_v2_fl(vec, scale);
+
+ steps = (int)(1.0f / scale);
+
+ for(i = 0; i < steps; ++i, ++cnt) {
+ add_v2_v2(mouse, vec);
+ paint_brush_stroke_add_step(C, op, event, mouse);
+ }
+ }
}
}
}
@@ -957,6 +810,14 @@ void paint_stroke_free(PaintStroke *stroke)
MEM_freeN(stroke);
}
+/* Returns zero if the stroke dots should not be spaced, non-zero otherwise */
+int paint_space_stroke_enabled(Brush *br)
+{
+ return (br->flag & BRUSH_SPACE) &&
+ !(br->flag & BRUSH_ANCHORED) &&
+ !ELEM4(br->sculpt_tool, SCULPT_TOOL_GRAB, SCULPT_TOOL_THUMB, SCULPT_TOOL_ROTATE, SCULPT_TOOL_SNAKE_HOOK);
+}
+
int paint_stroke_modal(bContext *C, wmOperator *op, wmEvent *event)
{
PaintStroke *stroke = op->customdata;
diff --git a/source/blender/editors/sculpt_paint/paint_undo.c b/source/blender/editors/sculpt_paint/paint_undo.c
index c2f82b8e2e0..6425e2d0494 100644
--- a/source/blender/editors/sculpt_paint/paint_undo.c
+++ b/source/blender/editors/sculpt_paint/paint_undo.c
@@ -27,9 +27,11 @@
#include "MEM_guardedalloc.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+
#include "DNA_userdef_types.h"
-#include "BLI_listbase.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -62,13 +64,13 @@ static UndoStack MeshUndoStack = {UNDO_PAINT_MESH, {NULL, NULL}, NULL};
/* Generic */
-static void undo_restore(bContext *C, UndoStack *stack, UndoElem *uel)
+static void undo_restore(bContext *C, UndoStack *UNUSED(stack), UndoElem *uel)
{
if(uel && uel->restore)
uel->restore(C, &uel->elems);
}
-static void undo_elem_free(UndoStack *stack, UndoElem *uel)
+static void undo_elem_free(UndoStack *UNUSED(stack), UndoElem *uel)
{
if(uel && uel->free) {
uel->free(&uel->elems);
@@ -237,6 +239,27 @@ int ED_undo_paint_step(bContext *C, int type, int step, const char *name)
return 0;
}
+int ED_undo_paint_valid(int type, const char *name)
+{
+ UndoStack *stack;
+
+ if(type == UNDO_PAINT_IMAGE)
+ stack= &ImageUndoStack;
+ else if(type == UNDO_PAINT_MESH)
+ stack= &MeshUndoStack;
+ else
+ return 0;
+
+ if(stack->current==NULL);
+ else {
+ if(name && strcmp(stack->current->name, name) == 0)
+ return 1;
+ else
+ return stack->elems.first != stack->elems.last;
+ }
+ return 0;
+}
+
void ED_undo_paint_free(void)
{
undo_stack_free(&ImageUndoStack);
diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c
index 0098b8ca12c..2962ea7e51b 100644
--- a/source/blender/editors/sculpt_paint/paint_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_utils.c
@@ -9,18 +9,22 @@
#include "DNA_scene_types.h"
#include "DNA_brush_types.h"
-#include "RNA_access.h"
-#include "RNA_define.h"
-
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_brush.h"
#include "BKE_context.h"
#include "BKE_DerivedMesh.h"
#include "BKE_paint.h"
+#include "RNA_access.h"
+#include "RNA_define.h"
#include "BIF_gl.h"
+/* TODO: remove once projectf goes away */
+#include "BIF_glutil.h"
+
+#include "RE_shader_ext.h"
#include "ED_view3d.h"
#include "ED_screen.h"
@@ -33,6 +37,55 @@
#include "paint_intern.h"
+/* convert a point in model coordinates to 2D screen coordinates */
+/* TODO: can be deleted once all calls are replaced with
+ view3d_project_float() */
+void projectf(bglMats *mats, const float v[3], float p[2])
+{
+ double ux, uy, uz;
+
+ gluProject(v[0],v[1],v[2], mats->modelview, mats->projection,
+ (GLint *)mats->viewport, &ux, &uy, &uz);
+ p[0]= ux;
+ p[1]= uy;
+}
+
+float paint_calc_object_space_radius(ViewContext *vc, float center[3],
+ float pixel_radius)
+{
+ Object *ob = vc->obact;
+ float delta[3], scale, loc[3];
+
+ mul_v3_m4v3(loc, ob->obmat, center);
+
+ initgrabz(vc->rv3d, loc[0], loc[1], loc[2]);
+ window_to_3d_delta(vc->ar, delta, pixel_radius, 0);
+
+ scale= fabsf(mat4_to_scale(ob->obmat));
+ scale= (scale == 0.0f)? 1.0f: scale;
+
+ return len_v3(delta)/scale;
+}
+
+float paint_get_tex_pixel(Brush* br, float u, float v)
+{
+ TexResult texres;
+ float co[3];
+ int hasrgb;
+
+ co[0] = u;
+ co[1] = v;
+ co[2] = 0;
+
+ memset(&texres, 0, sizeof(TexResult));
+ hasrgb = multitex_ext(br->mtex.tex, co, NULL, NULL, 0, &texres);
+
+ if (hasrgb & TEX_RGB)
+ texres.tin = (0.35*texres.tr + 0.45*texres.tg + 0.2*texres.tb)*texres.ta;
+
+ return texres.tin;
+}
+
/* 3D Paint */
static void imapaint_project(Object *ob, float *model, float *proj, float *co, float *pco)
@@ -88,7 +141,7 @@ static void imapaint_tri_weights(Object *ob, float *v1, float *v2, float *v3, fl
}
/* compute uv coordinates of mouse in face */
-void imapaint_pick_uv(Scene *scene, Object *ob, Mesh *mesh, unsigned int faceindex, int *xy, float *uv)
+void imapaint_pick_uv(Scene *scene, Object *ob, unsigned int faceindex, int *xy, float *uv)
{
DerivedMesh *dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
int *index = dm->getFaceDataArray(dm, CD_ORIGINDEX);
@@ -233,9 +286,9 @@ void BRUSH_OT_curve_preset(wmOperatorType *ot)
/* face-select ops */
-static int paint_select_linked_exec(bContext *C, wmOperator *op)
+static int paint_select_linked_exec(bContext *C, wmOperator *UNUSED(op))
{
- select_linked_tfaces(C, CTX_data_active_object(C), NULL, 2);
+ paintface_select_linked(C, CTX_data_active_object(C), NULL, 2);
ED_region_tag_redraw(CTX_wm_region(C));
return OPERATOR_FINISHED;
}
@@ -255,7 +308,7 @@ void PAINT_OT_face_select_linked(wmOperatorType *ot)
static int paint_select_linked_pick_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
int mode= RNA_boolean_get(op->ptr, "extend") ? 1:0;
- select_linked_tfaces(C, CTX_data_active_object(C), event->mval, mode);
+ paintface_select_linked(C, CTX_data_active_object(C), event->mval, mode);
ED_region_tag_redraw(CTX_wm_region(C));
return OPERATOR_FINISHED;
}
@@ -277,7 +330,8 @@ void PAINT_OT_face_select_linked_pick(wmOperatorType *ot)
static int face_select_all_exec(bContext *C, wmOperator *op)
{
- selectall_tface(CTX_data_active_object(C), RNA_enum_get(op->ptr, "action"));
+ Object *ob= CTX_data_active_object(C);
+ paintface_deselect_all_visible(ob, RNA_enum_get(op->ptr, "action"), TRUE);
ED_region_tag_redraw(CTX_wm_region(C));
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 399ba535e57..832d657428c 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -40,6 +40,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "IMB_imbuf.h"
@@ -273,7 +274,7 @@ static void make_vertexcol(Object *ob) /* single ob */
memset(me->mcol, 255, 4*sizeof(MCol)*me->totface);
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
}
@@ -334,7 +335,7 @@ void vpaint_fill(Object *ob, unsigned int paintcol)
}
}
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
}
@@ -448,10 +449,10 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
MEM_freeN(indexar);
copy_wpaint_prev(wp, NULL, 0);
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
}
-/* XXX: should be re-implemented as a vertex/weight paint 'colour correct' operator
+/* XXX: should be re-implemented as a vertex/weight paint 'color correct' operator
void vpaint_dogamma(Scene *scene)
{
@@ -852,7 +853,7 @@ static void wpaint_blend(VPaint *wp, MDeformWeight *dw, MDeformWeight *uw, float
/* else */
/* sets wp->weight to the closest weight value to vertex */
/* note: we cant sample frontbuf, weight colors are interpolated too unpredictable */
-void sample_wpaint(Scene *scene, ARegion *ar, View3D *v3d, int mode)
+void sample_wpaint(Scene *scene, ARegion *ar, View3D *UNUSED(v3d), int mode)
{
ViewContext vc;
ToolSettings *ts= scene->toolsettings;
@@ -925,7 +926,7 @@ void sample_wpaint(Scene *scene, ARegion *ar, View3D *v3d, int mode)
val= 0; // XXX pupmenu(str);
if(val>=0) {
ob->actdef= val+1;
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
}
MEM_freeN(str);
}
@@ -1061,7 +1062,7 @@ static void do_weight_paint_vertex(VPaint *wp, Object *ob, int index,
/* *************** set wpaint operator ****************** */
-static int set_wpaint(bContext *C, wmOperator *op) /* toggle */
+static int set_wpaint(bContext *C, wmOperator *UNUSED(op)) /* toggle */
{
Object *ob= CTX_data_active_object(C);
Scene *scene= CTX_data_scene(C);
@@ -1080,7 +1081,7 @@ static int set_wpaint(bContext *C, wmOperator *op) /* toggle */
* exit (exit needs doing regardless because we
* should redeform).
*/
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
if(ob->mode & OB_MODE_WEIGHT_PAINT) {
Object *par;
@@ -1256,7 +1257,7 @@ struct WPaintData {
char *vgroup_validmap; /*stores if vgroups tie to deforming bones or not*/
};
-static char *wpaint_make_validmap(Mesh *me, Object *ob)
+static char *wpaint_make_validmap(Object *ob)
{
bDeformGroup *dg;
ModifierData *md;
@@ -1314,7 +1315,7 @@ static char *wpaint_make_validmap(Mesh *me, Object *ob)
return validmap;
}
-static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *event)
+static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Scene *scene= CTX_data_scene(C);
struct PaintStroke *stroke = op->customdata;
@@ -1331,8 +1332,10 @@ static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *event)
if(me==NULL || me->totface==0) return OPERATOR_PASS_THROUGH;
/* if nothing was added yet, we make dverts and a vertex deform group */
- if (!me->dvert)
+ if (!me->dvert) {
ED_vgroup_data_create(&me->id);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
+ }
/* make mode data storage */
wpd= MEM_callocN(sizeof(struct WPaintData), "WPaintData");
@@ -1344,7 +1347,7 @@ static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *event)
vgroups affect deform bones*/
wpd->auto_normalize = ts->auto_normalize;
if (wpd->auto_normalize)
- wpd->vgroup_validmap = wpaint_make_validmap(me, ob);
+ wpd->vgroup_validmap = wpaint_make_validmap(ob);
// if(qual & LR_CTRLKEY) {
// sample_wpaint(scene, ar, v3d, 0);
@@ -1427,7 +1430,7 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
Object *ob;
Mesh *me;
float mat[4][4];
- float paintweight= ts->vgroup_weight;
+ float paintweight;
int *indexar;
int totindex, index, totw, flip;
float alpha;
@@ -1511,10 +1514,10 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
if(mface->v4) (me->dvert+mface->v4)->flag= 1;
if(brush->vertexpaint_tool==VP_BLUR) {
- MDeformWeight *dw, *(*dw_func)(MDeformVert *, int);
+ MDeformWeight *dw, *(*dw_func)(MDeformVert *, const int);
if(wp->flag & VP_ONLYVGROUP)
- dw_func= (void *)defvert_find_index; /* uses a const, cast to quiet warning */
+ dw_func= (MDeformWeight *(*)(MDeformVert *, const int))defvert_find_index;
else
dw_func= defvert_verify_index;
@@ -1586,7 +1589,7 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
swap_m4m4(vc->rv3d->persmat, mat);
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, 0);
ED_region_tag_redraw(vc->ar);
}
@@ -1625,7 +1628,7 @@ static void wpaint_stroke_done(bContext *C, struct PaintStroke *stroke)
}
}
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, 0);
}
@@ -1663,7 +1666,7 @@ void PAINT_OT_weight_paint(wmOperatorType *ot)
RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", "");
}
-static int weight_paint_set_exec(bContext *C, wmOperator *op)
+static int weight_paint_set_exec(bContext *C, wmOperator *UNUSED(op))
{
struct Scene *scene= CTX_data_scene(C);
Object *obact = CTX_data_active_object(C);
@@ -1727,7 +1730,7 @@ static int set_vpaint(bContext *C, wmOperator *op) /* toggle */
if (me)
/* update modifier stack for mapping requirements */
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_SCENE|ND_MODE, scene);
@@ -1780,7 +1783,7 @@ typedef struct VPaintData {
float vpimat[3][3];
} VPaintData;
-static int vpaint_stroke_test_start(bContext *C, struct wmOperator *op, wmEvent *event)
+static int vpaint_stroke_test_start(bContext *C, struct wmOperator *op, wmEvent *UNUSED(event))
{
ToolSettings *ts= CTX_data_tool_settings(C);
struct PaintStroke *stroke = op->customdata;
@@ -1817,7 +1820,7 @@ static int vpaint_stroke_test_start(bContext *C, struct wmOperator *op, wmEvent
return 1;
}
-static void vpaint_paint_face(VPaint *vp, VPaintData *vpd, Object *ob, int index, float mval[2], float pressure, int flip)
+static void vpaint_paint_face(VPaint *vp, VPaintData *vpd, Object *ob, int index, float mval[2], float pressure, int UNUSED(flip))
{
ViewContext *vc = &vpd->vc;
Brush *brush = paint_brush(&vp->paint);
@@ -1903,7 +1906,7 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
ED_region_tag_redraw(vc->ar);
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, 0);
}
static void vpaint_stroke_done(bContext *C, struct PaintStroke *stroke)
@@ -1971,9 +1974,9 @@ static int weight_from_bones_exec(bContext *C, wmOperator *op)
Mesh *me= ob->data;
int type= RNA_enum_get(op->ptr, "type");
- create_vgroups_from_armature(scene, ob, armob, type, (me->editflag & ME_EDIT_MIRROR_X));
+ create_vgroups_from_armature(op->reports, scene, ob, armob, type, (me->editflag & ME_EDIT_MIRROR_X));
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 2e192a08ca5..0fb3bc34d5b 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -34,6 +34,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_dynstr.h"
#include "BLI_ghash.h"
#include "BLI_pbvh.h"
@@ -57,8 +58,8 @@
#include "BKE_multires.h"
#include "BKE_paint.h"
#include "BKE_report.h"
+#include "BKE_lattice.h" /* for armature_deform_verts */
-#include "BIF_gl.h"
#include "BIF_glutil.h"
#include "WM_api.h"
@@ -71,9 +72,7 @@
#include "RNA_access.h"
#include "RNA_define.h"
-
#include "RE_render_ext.h"
-#include "RE_shader_ext.h"
#include "GPU_buffers.h"
@@ -85,10 +84,6 @@
#include <omp.h>
#endif
-/* ==== FORWARD DEFINITIONS =====
- *
- */
-
void ED_sculpt_force_update(bContext *C)
{
Object *ob= CTX_data_active_object(C);
@@ -97,12 +92,29 @@ void ED_sculpt_force_update(bContext *C)
multires_force_update(ob);
}
+void ED_sculpt_modifiers_changed(Object *ob)
+{
+ SculptSession *ss= ob->sculpt;
+
+ if(!ss->cache) {
+ /* we free pbvh on changes, except during sculpt since it can't deal with
+ changing PVBH node organization, we hope topology does not change in
+ the meantime .. weak */
+ if(ss->pbvh) {
+ BLI_pbvh_free(ss->pbvh);
+ ss->pbvh= NULL;
+ }
+
+ sculpt_free_deformMats(ob->sculpt);
+ }
+}
+
/* Sculpt mode handles multires differently from regular meshes, but only if
it's the last modifier on the stack and it is not on the first level */
struct MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob)
{
Mesh *me= (Mesh*)ob->data;
- ModifierData *md, *nmd;
+ ModifierData *md;
if(!CustomData_get_layer(&me->fdata, CD_MDISPS)) {
/* multires can't work without displacement layer */
@@ -113,48 +125,56 @@ struct MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob)
if(md->type == eModifierType_Multires) {
MultiresModifierData *mmd= (MultiresModifierData*)md;
- /* Check if any of the modifiers after multires are active
- * if not it can use the multires struct */
- for(nmd= md->next; nmd; nmd= nmd->next)
- if(modifier_isEnabled(scene, nmd, eModifierMode_Realtime))
- break;
+ if(!modifier_isEnabled(scene, md, eModifierMode_Realtime))
+ continue;
- if(!nmd && mmd->sculptlvl > 0)
- return mmd;
+ if(mmd->sculptlvl > 0) return mmd;
+ else return NULL;
}
}
return NULL;
}
-/* Checks whether full update mode (slower) needs to be used to work with modifiers */
-int sculpt_modifiers_active(Scene *scene, Object *ob)
+/* Check if there are any active modifiers in stack (used for flushing updates at enter/exit sculpt mode) */
+int sculpt_has_active_modifiers(Scene *scene, Object *ob)
{
ModifierData *md;
- MultiresModifierData *mmd= sculpt_multires_active(scene, ob);
- /* check if there are any modifiers after what we are sculpting,
- for a multires modifier with a deform modifier in front, we
- do no need to recalculate the modifier stack. note that this
- needs to be in sync with ccgDM_use_grid_pbvh! */
- if(mmd)
- md= mmd->modifier.next;
- else
- md= modifiers_getVirtualModifierList(ob);
-
+ md= modifiers_getVirtualModifierList(ob);
+
/* exception for shape keys because we can edit those */
for(; md; md= md->next) {
if(modifier_isEnabled(scene, md, eModifierMode_Realtime))
- if(md->type != eModifierType_ShapeKey)
- return 1;
+ return 1;
}
return 0;
}
-/* ===== STRUCTS =====
- *
- */
+/* Checks if there are any supported deformation modifiers active */
+int sculpt_modifiers_active(Scene *scene, Object *ob)
+{
+ ModifierData *md;
+ MultiresModifierData *mmd= sculpt_multires_active(scene, ob);
+
+ if(mmd) return 0;
+
+ md= modifiers_getVirtualModifierList(ob);
+
+ /* exception for shape keys because we can edit those */
+ for(; md; md= md->next) {
+ ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+
+ if(!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue;
+ if(md->type==eModifierType_ShapeKey) continue;
+
+ if(mti->type==eModifierTypeType_OnlyDeform && mti->deformMatrices)
+ return 1;
+ }
+
+ return 0;
+}
typedef enum StrokeFlags {
CLIP_X = 1,
@@ -226,32 +246,6 @@ typedef struct StrokeCache {
float plane_trim_squared;
} StrokeCache;
-/* ===== OPENGL =====
- *
- * Simple functions to get data from the GL
- */
-
-/* Convert a point in model coordinates to 2D screen coordinates. */
-static void projectf(bglMats *mats, const float v[3], float p[2])
-{
- double ux, uy, uz;
-
- gluProject(v[0],v[1],v[2], mats->modelview, mats->projection,
- (GLint *)mats->viewport, &ux, &uy, &uz);
- p[0]= ux;
- p[1]= uy;
-}
-
-/*XXX: static void project(bglMats *mats, const float v[3], short p[2])
-{
- float f[2];
- projectf(mats, v, f);
-
- p[0]= f[0];
- p[1]= f[1];
-}
-*/
-
/*** BVH Tree ***/
/* Get a screen-space rectangle of the modified area */
@@ -342,6 +336,7 @@ static void sculpt_brush_test_init(SculptSession *ss, SculptBrushTest *test)
{
test->radius_squared= ss->cache->radius_squared;
copy_v3_v3(test->location, ss->cache->location);
+ test->dist= 0.0f; /* just for initialize */
}
static int sculpt_brush_test(SculptBrushTest *test, float co[3])
@@ -411,7 +406,6 @@ static float frontface(Brush *brush, float sculpt_normal[3], short no[3], float
else {
dot= dot_v3v3(fno, sculpt_normal);
}
-
return dot > 0 ? dot : 0;
}
else {
@@ -511,15 +505,15 @@ float calc_overlap(StrokeCache *cache, const char symm, const char axis, const f
{
float mirror[3];
float distsq;
- float mat[4][4];
//flip_coord(mirror, cache->traced_location, symm);
flip_coord(mirror, cache->true_location, symm);
- unit_m4(mat);
- rotate_m4(mat, axis, angle);
-
- mul_m4_v3(mat, mirror);
+ if(axis != 0) {
+ float mat[4][4]= MAT4_UNITY;
+ rotate_m4(mat, axis, angle);
+ mul_m4_v3(mat, mirror);
+ }
//distsq = len_squared_v3v3(mirror, cache->traced_location);
distsq = len_squared_v3v3(mirror, cache->true_location);
@@ -649,66 +643,6 @@ static float brush_strength(Sculpt *sd, StrokeCache *cache, float feather)
}
}
-float get_tex_pixel(Brush* br, float u, float v)
-{
- TexResult texres;
- float co[3];
- int hasrgb;
-
- co[0] = u;
- co[1] = v;
- co[2] = 0;
-
- memset(&texres, 0, sizeof(TexResult));
- hasrgb = multitex_ext(br->mtex.tex, co, NULL, NULL, 1, &texres);
-
- if (hasrgb & TEX_RGB)
- texres.tin = (0.35*texres.tr + 0.45*texres.tg + 0.2*texres.tb)*texres.ta;
-
- return texres.tin;
-}
-
-#if 0
-
-/* Get a pixel from the texcache at (px, py) */
-static unsigned char get_texcache_pixel(const SculptSession *ss, int px, int py)
-{
- unsigned *p;
- p = ss->texcache + py * ss->texcache_side + px;
- return ((unsigned char*)(p))[0];
-}
-
-static float get_texcache_pixel_bilinear(const SculptSession *ss, float u, float v)
-{
- unsigned x, y, x2, y2;
- const int tc_max = ss->texcache_side - 1;
- float urat, vrat, uopp;
-
- if(u < 0) u = 0;
- else if(u >= ss->texcache_side) u = tc_max;
- if(v < 0) v = 0;
- else if(v >= ss->texcache_side) v = tc_max;
-
- x = floor(u);
- y = floor(v);
- x2 = x + 1;
- y2 = y + 1;
-
- if(x2 > ss->texcache_side) x2 = tc_max;
- if(y2 > ss->texcache_side) y2 = tc_max;
-
- urat = u - x;
- vrat = v - y;
- uopp = 1 - urat;
-
- return ((get_texcache_pixel(ss, x, y) * uopp +
- get_texcache_pixel(ss, x2, y) * urat) * (1 - vrat) +
- (get_texcache_pixel(ss, x, y2) * uopp +
- get_texcache_pixel(ss, x2, y2) * urat) * vrat) / 255.0;
-}
-
-#endif
-
/* Return a multiplier for brush strength on a particular vertex. */
static float tex_strength(SculptSession *ss, Brush *br, float *point, const float len)
{
@@ -792,7 +726,7 @@ static float tex_strength(SculptSession *ss, Brush *br, float *point, const floa
x += br->mtex.ofs[0];
y += br->mtex.ofs[1];
- avg = get_tex_pixel(br, x, y);
+ avg = paint_get_tex_pixel(br, x, y);
}
avg += br->texture_sample_bias;
@@ -867,6 +801,8 @@ static void calc_area_normal(Sculpt *sd, SculptSession *ss, float an[3], PBVHNod
float out_flip[3] = {0.0f, 0.0f, 0.0f};
+ (void)sd; /* unused w/o openmp */
+
zero_v3(an);
#pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
@@ -984,7 +920,9 @@ static void neighbor_average(SculptSession *ss, float avg[3], const unsigned ver
/* Don't modify corner vertices */
if(ncount==1) {
- copy_v3_v3(avg, ss->mvert[vert].co);
+ if(ss->deform_cos) copy_v3_v3(avg, ss->deform_cos[vert]);
+ else copy_v3_v3(avg, ss->mvert[vert].co);
+
return;
}
@@ -1000,7 +938,8 @@ static void neighbor_average(SculptSession *ss, float avg[3], const unsigned ver
for(i=0; i<(f->v4?4:3); ++i) {
if(i != skip && (ncount!=2 || BLI_countlist(&ss->fmap[(&f->v1)[i]]) <= 2)) {
- add_v3_v3(avg, ss->mvert[(&f->v1)[i]].co);
+ if(ss->deform_cos) add_v3_v3(avg, ss->deform_cos[(&f->v1)[i]]);
+ else add_v3_v3(avg, ss->mvert[(&f->v1)[i]].co);
++total;
}
}
@@ -1010,8 +949,10 @@ static void neighbor_average(SculptSession *ss, float avg[3], const unsigned ver
if(total>0)
mul_v3_fl(avg, 1.0f / total);
- else
- copy_v3_v3(avg, ss->mvert[vert].co);
+ else {
+ if(ss->deform_cos) copy_v3_v3(avg, ss->deform_cos[vert]);
+ else copy_v3_v3(avg, ss->mvert[vert].co);
+ }
}
static void do_mesh_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *node, float bstrength)
@@ -1329,9 +1270,14 @@ static void do_grab_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int t
int n;
float len;
- if (brush->normal_weight > 0)
+ if (brush->normal_weight > 0 || brush->flag & BRUSH_FRONTFACE) {
+ int cache= 1;
+ /* grab brush requires to test on original data */
+ SWAP(int, ss->cache->original, cache);
calc_sculpt_normal(sd, ss, an, nodes, totnode);
-
+ SWAP(int, ss->cache->original, cache);
+ }
+
copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry);
len = len_v3(grab_delta);
@@ -1421,7 +1367,7 @@ static void do_snake_hook_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes,
int n;
float len;
- if (brush->normal_weight > 0)
+ if (brush->normal_weight > 0 || brush->flag & BRUSH_FRONTFACE)
calc_sculpt_normal(sd, ss, an, nodes, totnode);
copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry);
@@ -1667,6 +1613,8 @@ static void calc_flatten_center(Sculpt *sd, SculptSession *ss, PBVHNode **nodes,
float count = 0;
+ (void)sd; /* unused w/o openmp */
+
zero_v3(fc);
#pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
@@ -1721,6 +1669,8 @@ static void calc_area_normal_and_flatten_center(Sculpt *sd, SculptSession *ss, P
// fc
float count = 0;
+ (void)sd; /* unused w/o openmp */
+
// an
zero_v3(an);
@@ -2283,9 +2233,8 @@ void sculpt_vertcos_to_key(Object *ob, KeyBlock *kb, float (*vertCos)[3])
ofs= key_to_vertcos(ob, kb);
/* calculate key coord offsets (from previous location) */
- for (a= 0; a < me->totvert; a++) {
+ for (a= 0; a < me->totvert; a++)
VECSUB(ofs[a], vertCos[a], ofs[a]);
- }
/* apply offsets on other keys */
currkey = me->key->block.first;
@@ -2315,17 +2264,6 @@ void sculpt_vertcos_to_key(Object *ob, KeyBlock *kb, float (*vertCos)[3])
vertcos_to_key(ob, kb, vertCos);
}
-/* copy the modified vertices from bvh to the active key */
-static void sculpt_update_keyblock(SculptSession *ss)
-{
- float (*vertCos)[3]= BLI_pbvh_get_vertCos(ss->pbvh);
-
- if (vertCos) {
- sculpt_vertcos_to_key(ss->ob, ss->kb, vertCos);
- MEM_freeN(vertCos);
- }
-}
-
static void do_brush_action(Sculpt *sd, SculptSession *ss, Brush *brush)
{
SculptSearchSphereData data;
@@ -2411,15 +2349,6 @@ static void do_brush_action(Sculpt *sd, SculptSession *ss, Brush *brush)
}
}
- /* copy the modified vertices from mesh to the active key */
- if(ss->kb)
- mesh_to_key(ss->ob->data, ss->kb);
-
- /* optimization: we could avoid copying new coords to keyblock at each */
- /* stroke step if there are no modifiers due to pbvh is used for displaying */
- /* so to increase speed we'll copy new coords to keyblock when stroke is done */
- if(ss->kb && ss->modifiers_active) sculpt_update_keyblock(ss);
-
MEM_freeN(nodes);
}
}
@@ -2428,91 +2357,102 @@ static void sculpt_combine_proxies(Sculpt *sd, SculptSession *ss)
{
Brush *brush= paint_brush(&sd->paint);
PBVHNode** nodes;
- int totnode;
- int n;
+ int use_orco, totnode, n;
BLI_pbvh_gather_proxies(ss->pbvh, &nodes, &totnode);
- switch (brush->sculpt_tool) {
- case SCULPT_TOOL_GRAB:
- case SCULPT_TOOL_ROTATE:
- case SCULPT_TOOL_THUMB:
- #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
- for (n= 0; n < totnode; n++) {
- PBVHVertexIter vd;
- PBVHProxyNode* proxies;
- int proxy_count;
- float (*origco)[3];
+ if(!ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_LAYER)) {
+ /* these brushes start from original coordinates */
+ use_orco = (ELEM3(brush->sculpt_tool, SCULPT_TOOL_GRAB,
+ SCULPT_TOOL_ROTATE, SCULPT_TOOL_THUMB));
- origco= sculpt_undo_push_node(ss, nodes[n])->co;
+ #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
+ for (n= 0; n < totnode; n++) {
+ PBVHVertexIter vd;
+ PBVHProxyNode* proxies;
+ int proxy_count;
+ float (*orco)[3];
- BLI_pbvh_node_get_proxies(nodes[n], &proxies, &proxy_count);
+ if(use_orco)
+ orco= sculpt_undo_push_node(ss, nodes[n])->co;
- BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
- float val[3];
- int p;
+ BLI_pbvh_node_get_proxies(nodes[n], &proxies, &proxy_count);
- copy_v3_v3(val, origco[vd.i]);
+ BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
+ float val[3];
+ int p;
- for (p= 0; p < proxy_count; p++)
- add_v3_v3(val, proxies[p].co[vd.i]);
+ if(use_orco)
+ copy_v3_v3(val, orco[vd.i]);
+ else
+ copy_v3_v3(val, vd.co);
- sculpt_clip(sd, ss, vd.co, val);
- }
- BLI_pbvh_vertex_iter_end;
+ for (p= 0; p < proxy_count; p++)
+ add_v3_v3(val, proxies[p].co[vd.i]);
- BLI_pbvh_node_free_proxies(nodes[n]);
+ sculpt_clip(sd, ss, vd.co, val);
}
+ BLI_pbvh_vertex_iter_end;
- break;
+ BLI_pbvh_node_free_proxies(nodes[n]);
+ }
+ }
- case SCULPT_TOOL_DRAW:
- case SCULPT_TOOL_CLAY:
- case SCULPT_TOOL_CLAY_TUBES:
- case SCULPT_TOOL_CREASE:
- case SCULPT_TOOL_BLOB:
- case SCULPT_TOOL_FILL:
- case SCULPT_TOOL_FLATTEN:
- case SCULPT_TOOL_INFLATE:
- case SCULPT_TOOL_NUDGE:
- case SCULPT_TOOL_PINCH:
- case SCULPT_TOOL_SCRAPE:
- case SCULPT_TOOL_SNAKE_HOOK:
- #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
- for (n= 0; n < totnode; n++) {
- PBVHVertexIter vd;
- PBVHProxyNode* proxies;
- int proxy_count;
+ if (nodes)
+ MEM_freeN(nodes);
+}
- BLI_pbvh_node_get_proxies(nodes[n], &proxies, &proxy_count);
+/* copy the modified vertices from bvh to the active key */
+static void sculpt_update_keyblock(SculptSession *ss)
+{
+ float (*vertCos)[3];
- BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
- float val[3];
- int p;
+ /* Keyblock update happens after hadning deformation caused by modifiers,
+ so ss->orig_cos would be updated with new stroke */
+ if(ss->orig_cos) vertCos = ss->orig_cos;
+ else vertCos = BLI_pbvh_get_vertCos(ss->pbvh);
- copy_v3_v3(val, vd.co);
+ if (vertCos) {
+ sculpt_vertcos_to_key(ss->ob, ss->kb, vertCos);
- for (p= 0; p < proxy_count; p++)
- add_v3_v3(val, proxies[p].co[vd.i]);
+ if(vertCos != ss->orig_cos)
+ MEM_freeN(vertCos);
+ }
+}
- sculpt_clip(sd, ss, vd.co, val);
- }
- BLI_pbvh_vertex_iter_end;
+/* flush displacement from deformed PBVH to original layer */
+static void sculpt_flush_deformation(SculptSession *ss)
+{
+ float (*vertCos)[3];
- BLI_pbvh_node_free_proxies(nodes[n]);
+ vertCos= BLI_pbvh_get_vertCos(ss->pbvh);
- }
+ if (vertCos) {
+ Object *ob= ss->ob;
+ Mesh *me= (Mesh*)ob->data;
+ MVert *mvert= me->mvert;
+ int a;
- break;
+ for(a = 0; a < me->totvert; ++a, ++mvert) {
+ float disp[3], newco[3];
+ sub_v3_v3v3(disp, vertCos[a], ss->deform_cos[a]);
+ mul_m3_v3(ss->deform_imats[a], disp);
+ add_v3_v3v3(newco, disp, ss->orig_cos[a]);
- case SCULPT_TOOL_SMOOTH:
- case SCULPT_TOOL_LAYER:
- default:
- break;
- }
+ copy_v3_v3(ss->deform_cos[a], vertCos[a]);
+ copy_v3_v3(ss->orig_cos[a], newco);
- if (nodes)
- MEM_freeN(nodes);
+ if(!ss->kb)
+ copy_v3_v3(mvert->co, newco);
+ }
+
+ if(ss->kb)
+ sculpt_update_keyblock(ss);
+
+ mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+
+ MEM_freeN(vertCos);
+ }
}
//static int max_overlap_count(Sculpt *sd)
@@ -2534,8 +2474,10 @@ static void sculpt_combine_proxies(Sculpt *sd, SculptSession *ss)
/* Flip all the editdata across the axis/axes specified by symm. Used to
calculate multiple modifications to the mesh when symmetry is enabled. */
-static void calc_brushdata_symm(Sculpt *sd, StrokeCache *cache, const char symm, const char axis, const float angle, const float feather)
+static void calc_brushdata_symm(Sculpt *sd, StrokeCache *cache, const char symm, const char axis, const float angle, const float UNUSED(feather))
{
+ (void)sd; /* unused */
+
flip_coord(cache->location, cache->true_location, symm);
flip_coord(cache->grab_delta_symmetry, cache->grab_delta, symm);
flip_coord(cache->view_normal, cache->true_view_normal, symm);
@@ -2554,8 +2496,11 @@ static void calc_brushdata_symm(Sculpt *sd, StrokeCache *cache, const char symm,
unit_m4(cache->symm_rot_mat);
unit_m4(cache->symm_rot_mat_inv);
- rotate_m4(cache->symm_rot_mat, axis, angle);
- rotate_m4(cache->symm_rot_mat_inv, axis, -angle);
+
+ if(axis) { /* expects XYZ */
+ rotate_m4(cache->symm_rot_mat, axis, angle);
+ rotate_m4(cache->symm_rot_mat_inv, axis, -angle);
+ }
mul_m4_v3(cache->symm_rot_mat, cache->location);
mul_m4_v3(cache->symm_rot_mat, cache->grab_delta_symmetry);
@@ -2573,6 +2518,18 @@ static void do_radial_symmetry(Sculpt *sd, SculptSession *ss, Brush *brush, cons
}
}
+/* noise texture gives different values for the same input coord; this
+ can tear a multires mesh during sculpting so do a stitch in this
+ case */
+static void sculpt_fix_noise_tear(Sculpt *sd, SculptSession *ss)
+{
+ Brush *brush = paint_brush(&sd->paint);
+ MTex *mtex = &brush->mtex;
+
+ if(ss->multires && mtex->tex && mtex->tex->type == TEX_NOISE)
+ multires_stitch_grids(ss->ob);
+}
+
static void do_symmetrical_brush_actions(Sculpt *sd, SculptSession *ss)
{
Brush *brush = paint_brush(&sd->paint);
@@ -2603,6 +2560,12 @@ static void do_symmetrical_brush_actions(Sculpt *sd, SculptSession *ss)
sculpt_combine_proxies(sd, ss);
+ /* hack to fix noise texture tearing mesh */
+ sculpt_fix_noise_tear(sd, ss);
+
+ if (ss->modifiers_active)
+ sculpt_flush_deformation(ss);
+
cache->first_time= 0;
}
@@ -2624,6 +2587,17 @@ static void sculpt_update_tex(Sculpt *sd, SculptSession *ss)
}
}
+void sculpt_free_deformMats(SculptSession *ss)
+{
+ if(ss->orig_cos) MEM_freeN(ss->orig_cos);
+ if(ss->deform_cos) MEM_freeN(ss->deform_cos);
+ if(ss->deform_imats) MEM_freeN(ss->deform_imats);
+
+ ss->orig_cos = NULL;
+ ss->deform_cos = NULL;
+ ss->deform_imats = NULL;
+}
+
void sculpt_update_mesh_elements(Scene *scene, Object *ob, int need_fmap)
{
DerivedMesh *dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
@@ -2658,6 +2632,23 @@ void sculpt_update_mesh_elements(Scene *scene, Object *ob, int need_fmap)
ss->pbvh = dm->getPBVH(ob, dm);
ss->fmap = (need_fmap && dm->getFaceMap)? dm->getFaceMap(ob, dm): NULL;
+ if(ss->modifiers_active) {
+ if(!ss->orig_cos) {
+ int a;
+
+ sculpt_free_deformMats(ss);
+
+ if(ss->kb) ss->orig_cos = key_to_vertcos(ob, ss->kb);
+ else ss->orig_cos = mesh_getVertexCos(ob->data, NULL);
+
+ sculpt_get_deform_matrices(scene, ob, &ss->deform_imats, &ss->deform_cos);
+ BLI_pbvh_apply_vertCos(ss->pbvh, ss->deform_cos);
+
+ for(a = 0; a < ((Mesh*)ob->data)->totvert; ++a)
+ invert_m3(ss->deform_imats[a]);
+ }
+ } else sculpt_free_deformMats(ss);
+
/* if pbvh is deformed, key block is already applied to it */
if (ss->kb && !BLI_pbvh_isDeformed(ss->pbvh)) {
float (*vertCos)[3]= key_to_vertcos(ob, ss->kb);
@@ -2681,7 +2672,7 @@ int sculpt_poll(bContext *C)
return sculpt_mode_poll(C) && paint_poll(C);
}
-static char *sculpt_tool_name(Sculpt *sd)
+static const char *sculpt_tool_name(Sculpt *sd)
{
Brush *brush = paint_brush(&sd->paint);
@@ -2783,21 +2774,6 @@ static void SCULPT_OT_radial_control(wmOperatorType *ot)
/**** Operator for applying a stroke (various attributes including mouse path)
using the current brush. ****/
-static float unproject_brush_radius(Object *ob, ViewContext *vc, float center[3], float offset)
-{
- float delta[3], scale, loc[3];
-
- mul_v3_m4v3(loc, ob->obmat, center);
-
- initgrabz(vc->rv3d, loc[0], loc[1], loc[2]);
- window_to_3d_delta(vc->ar, delta, offset, 0);
-
- scale= fabsf(mat4_to_scale(ob->obmat));
- scale= (scale == 0.0f)? 1.0f: scale;
-
- return len_v3(delta)/scale;
-}
-
static void sculpt_cache_free(StrokeCache *cache)
{
if(cache->face_norms)
@@ -2807,6 +2783,36 @@ static void sculpt_cache_free(StrokeCache *cache)
MEM_freeN(cache);
}
+/* Initialize mirror modifier clipping */
+static void sculpt_init_mirror_clipping(Object *ob, SculptSession *ss)
+{
+ ModifierData *md;
+ int i;
+
+ for(md= ob->modifiers.first; md; md= md->next) {
+ if(md->type==eModifierType_Mirror &&
+ (md->mode & eModifierMode_Realtime)) {
+ MirrorModifierData *mmd = (MirrorModifierData*)md;
+
+ if(mmd->flag & MOD_MIR_CLIPPING) {
+ /* check each axis for mirroring */
+ for(i = 0; i < 3; ++i) {
+ if(mmd->flag & (MOD_MIR_AXIS_X << i)) {
+ /* enable sculpt clipping */
+ ss->cache->flag |= CLIP_X << i;
+
+ /* update the clip tolerance */
+ if(mmd->tolerance >
+ ss->cache->clip_tolerance[i])
+ ss->cache->clip_tolerance[i] =
+ mmd->tolerance;
+ }
+ }
+ }
+ }
+ }
+}
+
/* Initialize the stroke cache invariants from operator properties */
static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSession *ss, wmOperator *op, wmEvent *event)
{
@@ -2814,7 +2820,6 @@ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSessio
Brush *brush = paint_brush(&sd->paint);
ViewContext *vc = paint_stroke_view_context(op->customdata);
Object *ob= CTX_data_active_object(C);
- ModifierData *md;
int i;
int mode;
@@ -2827,22 +2832,9 @@ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSessio
ss->cache->plane_trim_squared = brush->plane_trim * brush->plane_trim;
- /* Initialize mirror modifier clipping */
-
ss->cache->flag = 0;
- for(md= ob->modifiers.first; md; md= md->next) {
- if(md->type==eModifierType_Mirror && (md->mode & eModifierMode_Realtime)) {
- const MirrorModifierData *mmd = (MirrorModifierData*) md;
-
- /* Mark each axis that needs clipping along with its tolerance */
- if(mmd->flag & MOD_MIR_CLIPPING) {
- ss->cache->flag |= CLIP_X << mmd->axis;
- if(mmd->tolerance > ss->cache->clip_tolerance[mmd->axis])
- ss->cache->clip_tolerance[mmd->axis] = mmd->tolerance;
- }
- }
- }
+ sculpt_init_mirror_clipping(ob, ss);
/* Initial mouse location */
if (event) {
@@ -2855,8 +2847,13 @@ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSessio
}
mode = RNA_int_get(op->ptr, "mode");
- cache->invert = mode == WM_BRUSHSTROKE_INVERT;
- cache->alt_smooth = mode == WM_BRUSHSTROKE_SMOOTH;
+ cache->invert = mode == BRUSH_STROKE_INVERT;
+ cache->alt_smooth = mode == BRUSH_STROKE_SMOOTH;
+
+ /* not very nice, but with current events system implementation
+ we can't handle brush appearance inversion hotkey separately (sergey) */
+ if(cache->invert) brush->flag |= BRUSH_INVERTED;
+ else brush->flag &= ~BRUSH_INVERTED;
/* Alt-Smooth */
if (ss->cache->alt_smooth) {
@@ -2893,8 +2890,12 @@ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSessio
ss->layer_co= MEM_mallocN(sizeof(float) * 3 * ss->totvert,
"sculpt mesh vertices copy");
- for(i = 0; i < ss->totvert; ++i)
- copy_v3_v3(ss->layer_co[i], ss->mvert[i].co);
+ if(ss->deform_cos) memcpy(ss->layer_co, ss->deform_cos, ss->totvert);
+ else {
+ for(i = 0; i < ss->totvert; ++i) {
+ copy_v3_v3(ss->layer_co[i], ss->mvert[i].co);
+ }
+ }
}
}
@@ -2910,7 +2911,7 @@ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSessio
cache->original = 1;
}
- if(ELEM7(brush->sculpt_tool, SCULPT_TOOL_DRAW, SCULPT_TOOL_CREASE, SCULPT_TOOL_BLOB, SCULPT_TOOL_LAYER, SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY, SCULPT_TOOL_CLAY_TUBES))
+ if(ELEM8(brush->sculpt_tool, SCULPT_TOOL_DRAW, SCULPT_TOOL_CREASE, SCULPT_TOOL_BLOB, SCULPT_TOOL_LAYER, SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY, SCULPT_TOOL_CLAY_TUBES, SCULPT_TOOL_ROTATE))
if(!(brush->flag & BRUSH_ACCUMULATE))
cache->original = 1;
@@ -3017,7 +3018,13 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, SculptSession
cache->pen_flip = RNA_boolean_get(ptr, "pen_flip");
RNA_float_get_array(ptr, "mouse", cache->mouse);
- cache->pressure = RNA_float_get(ptr, "pressure");
+ /* XXX: Use preassure value from first brush step for brushes which don't
+ support strokes (grab, thumb). They depends on initial state and
+ brush coord/pressure/etc.
+ It's more an events design issue, which doesn't split coordinate/pressure/angle
+ changing events. We should avoid this after events system re-design */
+ if(paint_space_stroke_enabled(brush) || cache->first_time)
+ cache->pressure = RNA_float_get(ptr, "pressure");
/* Truly temporary data that isn't stored in properties */
@@ -3029,7 +3036,7 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, SculptSession
if(cache->first_time) {
if (!brush_use_locked_size(brush)) {
- cache->initial_radius= unproject_brush_radius(ss->ob, cache->vc, cache->true_location, brush_size(brush));
+ cache->initial_radius= paint_calc_object_space_radius(cache->vc, cache->true_location, brush_size(brush));
brush_set_unprojected_radius(brush, cache->initial_radius);
}
else {
@@ -3091,7 +3098,7 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, SculptSession
if (!hit)
copy_v2_v2(sd->anchored_initial_mouse, cache->initial_mouse);
- cache->radius= unproject_brush_radius(ss->ob, paint_stroke_view_context(stroke), cache->true_location, cache->pixel_radius);
+ cache->radius= paint_calc_object_space_radius(paint_stroke_view_context(stroke), cache->true_location, cache->pixel_radius);
cache->radius_squared = cache->radius*cache->radius;
copy_v3_v3(sd->anchored_location, cache->true_location);
@@ -3302,14 +3309,13 @@ static void sculpt_flush_update(bContext *C)
GPU_drawobject_free(ob->derivedFinal);
if(ss->modifiers_active) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
ED_region_tag_redraw(ar);
}
else {
rcti r;
BLI_pbvh_update(ss->pbvh, PBVH_UpdateBB, NULL);
-
if (sculpt_get_redraw_rect(ar, CTX_wm_region_view3d(C), ob, &r)) {
//rcti tmp;
@@ -3406,14 +3412,17 @@ static void sculpt_stroke_done(bContext *C, struct PaintStroke *unused)
/* Finished */
if(ss->cache) {
+ Brush *brush= paint_brush(&sd->paint);
+ brush->flag &= ~BRUSH_INVERTED;
+
sculpt_stroke_modifiers_check(C, ss);
/* Alt-Smooth */
if (ss->cache->alt_smooth) {
Paint *p= &sd->paint;
- Brush *br= (Brush *)find_id("BR", ss->cache->saved_active_brush_name);
- if(br) {
- paint_brush_set(p, br);
+ brush= (Brush *)find_id("BR", ss->cache->saved_active_brush_name);
+ if(brush) {
+ paint_brush_set(p, brush);
}
}
@@ -3433,7 +3442,7 @@ static void sculpt_stroke_done(bContext *C, struct PaintStroke *unused)
/* try to avoid calling this, only for e.g. linked duplicates now */
if(((Mesh*)ob->data)->id.us > 1)
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
}
@@ -3495,10 +3504,10 @@ static int sculpt_brush_stroke_exec(bContext *C, wmOperator *op)
static void SCULPT_OT_brush_stroke(wmOperatorType *ot)
{
static EnumPropertyItem stroke_mode_items[] = {
- { WM_BRUSHSTROKE_NORMAL, "NORMAL", 0, "Normal", "Apply brush normally" },
- { WM_BRUSHSTROKE_INVERT, "INVERT", 0, "Invert", "Invert action of brush for duration of stroke" },
- { WM_BRUSHSTROKE_SMOOTH, "SMOOTH", 0, "Smooth", "Switch brush to smooth mode for duration of stroke" },
- { 0 }
+ {BRUSH_STROKE_NORMAL, "NORMAL", 0, "Normal", "Apply brush normally"},
+ {BRUSH_STROKE_INVERT, "INVERT", 0, "Invert", "Invert action of brush for duration of stroke"},
+ {BRUSH_STROKE_SMOOTH, "SMOOTH", 0, "Smooth", "Switch brush to smooth mode for duration of stroke"},
+ {0}
};
/* identifiers */
@@ -3519,7 +3528,7 @@ static void SCULPT_OT_brush_stroke(wmOperatorType *ot)
RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement,
"Stroke", "");
- RNA_def_enum(ot->srna, "mode", stroke_mode_items, WM_BRUSHSTROKE_NORMAL,
+ RNA_def_enum(ot->srna, "mode", stroke_mode_items, BRUSH_STROKE_NORMAL,
"Sculpt Stroke Mode",
"Action taken when a sculpt stroke is made");
@@ -3581,14 +3590,14 @@ static int sculpt_toggle_mode(bContext *C, wmOperator *unused)
/* multires in sculpt mode could have different from object mode subdivision level */
flush_recalc |= mmd && mmd->sculptlvl != mmd->lvl;
/* if object has got active modifiers, it's dm could be different in sculpt mode */
- //flush_recalc |= sculpt_modifiers_active(scene, ob);
+ flush_recalc |= sculpt_has_active_modifiers(scene, ob);
if(ob->mode & OB_MODE_SCULPT) {
if(mmd)
multires_force_update(ob);
if(flush_recalc)
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* Leave sculptmode */
ob->mode &= ~OB_MODE_SCULPT;
@@ -3600,7 +3609,7 @@ static int sculpt_toggle_mode(bContext *C, wmOperator *unused)
ob->mode |= OB_MODE_SCULPT;
if(flush_recalc)
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* Create persistent sculpt mode data */
if(!ts->sculpt) {
@@ -3634,16 +3643,15 @@ static void SCULPT_OT_sculptmode_toggle(wmOperatorType *ot)
/* api callbacks */
ot->exec= sculpt_toggle_mode;
- ot->poll= ED_operator_object_active;
+ ot->poll= ED_operator_object_active_editable_mesh;
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-void ED_operatortypes_sculpt()
+void ED_operatortypes_sculpt(void)
{
WM_operatortype_append(SCULPT_OT_radial_control);
WM_operatortype_append(SCULPT_OT_brush_stroke);
WM_operatortype_append(SCULPT_OT_sculptmode_toggle);
WM_operatortype_append(SCULPT_OT_set_persistent_base);
}
-
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index 254876d9b68..76a7349606c 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -55,13 +55,15 @@ void sculpt_radialcontrol_start(int mode);
struct MultiresModifierData *sculpt_multires_active(struct Scene *scene, struct Object *ob);
struct Brush *sculptmode_brush(void);
-//void do_symmetrical_brush_actions(struct Sculpt *sd, struct wmOperator *wm, struct BrushAction *a, short *, short *);
void sculpt(Sculpt *sd);
int sculpt_poll(struct bContext *C);
void sculpt_update_mesh_elements(struct Scene *scene, struct Object *ob, int need_fmap);
+/* Deformed mesh sculpt */
+void sculpt_free_deformMats(struct SculptSession *ss);
+
/* Stroke */
struct SculptStroke *sculpt_stroke_new(const int max);
void sculpt_stroke_free(struct SculptStroke *);
@@ -70,9 +72,6 @@ void sculpt_stroke_apply(struct Sculpt *sd, struct SculptStroke *);
void sculpt_stroke_apply_all(struct Sculpt *sd, struct SculptStroke *);
int sculpt_stroke_get_location(bContext *C, struct PaintStroke *stroke, float out[3], float mouse[2]);
-/* Partial Mesh Visibility */
-void sculptmode_pmv(int mode);
-
/* Undo */
typedef struct SculptUndoNode {
@@ -82,6 +81,7 @@ typedef struct SculptUndoNode {
void *node; /* only during push, not valid afterwards! */
float (*co)[3];
+ float (*orig_co)[3];
short (*no)[3];
int totvert;
@@ -104,13 +104,10 @@ typedef struct SculptUndoNode {
SculptUndoNode *sculpt_undo_push_node(SculptSession *ss, PBVHNode *node);
SculptUndoNode *sculpt_undo_get_node(PBVHNode *node);
-void sculpt_undo_push_begin(char *name);
+void sculpt_undo_push_begin(const char *name);
void sculpt_undo_push_end(void);
-struct MultiresModifierData *sculpt_multires_active(struct Scene *scene, struct Object *ob);
int sculpt_modifiers_active(Scene *scene, Object *ob);
void sculpt_vertcos_to_key(Object *ob, KeyBlock *kb, float (*vertCos)[3]);
-void brush_jitter_pos(struct Brush *brush, float *pos, float *jitterpos);
-
#endif
diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c
index e92740678fd..d88d7a5ac49 100644
--- a/source/blender/editors/sculpt_paint/sculpt_undo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_undo.c
@@ -33,6 +33,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_threads.h"
@@ -48,10 +49,13 @@
#include "BKE_multires.h"
#include "BKE_paint.h"
#include "BKE_key.h"
+#include "BKE_mesh.h"
#include "WM_api.h"
#include "WM_types.h"
+#include "GPU_buffers.h"
+
#include "ED_sculpt.h"
#include "paint_intern.h"
#include "sculpt_intern.h"
@@ -64,6 +68,12 @@ static void update_cb(PBVHNode *node, void *unused)
BLI_pbvh_node_mark_update(node);
}
+static void sculpt_restore_deformed(SculptSession *ss, SculptUndoNode *unode, int uindex, int oindex, float coord[3])
+{
+ swap_v3_v3(coord, unode->orig_co[uindex]);
+ copy_v3_v3(unode->co[uindex], ss->deform_cos[oindex]);
+}
+
static void sculpt_undo_restore(bContext *C, ListBase *lb)
{
Scene *scene = CTX_data_scene(C);
@@ -114,8 +124,10 @@ static void sculpt_undo_restore(bContext *C, ListBase *lb)
float (*vertCos)[3];
vertCos= key_to_vertcos(ob, ss->kb);
- for(i=0; i<unode->totvert; i++)
- swap_v3_v3(vertCos[index[i]], unode->co[i]);
+ for(i=0; i<unode->totvert; i++) {
+ if(ss->modifiers_active) sculpt_restore_deformed(ss, unode, i, index[i], vertCos[index[i]]);
+ else swap_v3_v3(vertCos[index[i]], unode->co[i]);
+ }
/* propagate new coords to keyblock */
sculpt_vertcos_to_key(ob, ss->kb, vertCos);
@@ -127,7 +139,8 @@ static void sculpt_undo_restore(bContext *C, ListBase *lb)
MEM_freeN(vertCos);
} else {
for(i=0; i<unode->totvert; i++) {
- swap_v3_v3(mvert[index[i]].co, unode->co[i]);
+ if(ss->modifiers_active) sculpt_restore_deformed(ss, unode, i, index[i], mvert[index[i]].co);
+ else swap_v3_v3(mvert[index[i]].co, unode->co[i]);
mvert[index[i]].flag |= ME_VERT_PBVH_UPDATE;
}
}
@@ -159,6 +172,7 @@ static void sculpt_undo_restore(bContext *C, ListBase *lb)
}
if(update) {
+ int tag_update= 0;
/* we update all nodes still, should be more clever, but also
needs to work correct when exiting/entering sculpt mode and
the nodes get recreated, though in that case it could do all */
@@ -168,8 +182,21 @@ static void sculpt_undo_restore(bContext *C, ListBase *lb)
if((mmd=sculpt_multires_active(scene, ob)))
multires_mark_as_modified(ob);
- if(ss->modifiers_active || ((Mesh*)ob->data)->id.us > 1)
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ tag_update= ((Mesh*)ob->data)->id.us > 1;
+
+ if(ss->modifiers_active) {
+ Mesh *me= ob->data;
+ mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+
+ sculpt_free_deformMats(ss);
+ tag_update|= 1;
+ }
+
+ if(tag_update)
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+
+ /* for non-PBVH drawing, need to recreate VBOs */
+ GPU_drawobject_free(ob->derivedFinal);
}
}
@@ -188,6 +215,8 @@ static void sculpt_undo_free(ListBase *lb)
MEM_freeN(unode->grids);
if(unode->layer_disp)
MEM_freeN(unode->layer_disp);
+ if(unode->orig_co)
+ MEM_freeN(unode->orig_co);
}
}
@@ -249,6 +278,9 @@ SculptUndoNode *sculpt_undo_push_node(SculptSession *ss, PBVHNode *node)
unode->index= MEM_mapallocN(sizeof(int)*allvert, "SculptUndoNode.index");
}
+ if(ss->modifiers_active)
+ unode->orig_co= MEM_callocN(allvert*sizeof(*unode->orig_co), "undoSculpt orig_cos");
+
BLI_unlock_thread(LOCK_CUSTOM1);
/* copy threaded, hopefully this is the performance critical part */
@@ -260,6 +292,9 @@ SculptUndoNode *sculpt_undo_push_node(SculptSession *ss, PBVHNode *node)
if(vd.no) VECCOPY(unode->no[vd.i], vd.no)
else normal_float_to_short_v3(unode->no[vd.i], vd.fno);
if(vd.vert_indices) unode->index[vd.i]= vd.vert_indices[vd.i];
+
+ if(ss->modifiers_active)
+ copy_v3_v3(unode->orig_co[vd.i], ss->orig_cos[unode->index[vd.i]]);
}
BLI_pbvh_vertex_iter_end;
}
@@ -274,7 +309,7 @@ SculptUndoNode *sculpt_undo_push_node(SculptSession *ss, PBVHNode *node)
return unode;
}
-void sculpt_undo_push_begin(char *name)
+void sculpt_undo_push_begin(const char *name)
{
undo_paint_push_begin(UNDO_PAINT_MESH, name,
sculpt_undo_restore, sculpt_undo_free);
diff --git a/source/blender/editors/sound/CMakeLists.txt b/source/blender/editors/sound/CMakeLists.txt
index 456c02d947e..c8bad32bc35 100644
--- a/source/blender/editors/sound/CMakeLists.txt
+++ b/source/blender/editors/sound/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -32,4 +30,10 @@ SET(INC
../../../../intern/audaspace/intern
)
-BLENDERLIB(bf_editor_sound "${SRC}" "${INC}")
+set(SRC
+ sound_ops.c
+
+ sound_intern.h
+)
+
+blender_add_lib(bf_editor_sound "${SRC}" "${INC}")
diff --git a/source/blender/editors/sound/Makefile b/source/blender/editors/sound/Makefile
deleted file mode 100644
index f51e15627a2..00000000000
--- a/source/blender/editors/sound/Makefile
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_opsound
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c
index fe1fe3266bc..30edc659fcb 100644
--- a/source/blender/editors/sound/sound_ops.c
+++ b/source/blender/editors/sound/sound_ops.c
@@ -29,9 +29,13 @@
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
+#include <stddef.h>
#include "MEM_guardedalloc.h"
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "DNA_packedFile_types.h"
#include "DNA_scene_types.h"
#include "DNA_space_types.h"
@@ -41,13 +45,11 @@
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_packedFile.h"
#include "BKE_sound.h"
-#include "BLI_blenlib.h"
-
-
#include "RNA_access.h"
#include "RNA_define.h"
#include "RNA_enum_types.h"
@@ -59,6 +61,8 @@
#include "AUD_C-API.h"
+#include "ED_util.h"
+
#include "sound_intern.h"
/******************** open sound operator ********************/
@@ -202,72 +206,17 @@ void SOUND_OT_pack(wmOperatorType *ot)
/********************* unpack operator *********************/
-// XXX this function is in image_ops.c too, exactly the same, should be moved to a generally accessible position
-static void unpack_menu(bContext *C, char *opname, char *abs_name, char *folder, PackedFile *pf)
-{
- uiPopupMenu *pup;
- uiLayout *layout;
- char line[FILE_MAX + 100];
- char local_name[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX];
-
- strcpy(local_name, abs_name);
- BLI_splitdirstring(local_name, fi);
- sprintf(local_name, "//%s/%s", folder, fi);
-
- pup= uiPupMenuBegin(C, "Unpack file", 0);
- layout= uiPupMenuLayout(pup);
-
- uiItemEnumO(layout, opname, "Remove Pack", 0, "method", PF_REMOVE);
-
- if(strcmp(abs_name, local_name)) {
- switch(checkPackedFile(local_name, pf)) {
- case PF_NOFILE:
- sprintf(line, "Create %s", local_name);
- uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_LOCAL);
- break;
- case PF_EQUAL:
- sprintf(line, "Use %s (identical)", local_name);
- uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL);
- break;
- case PF_DIFFERS:
- sprintf(line, "Use %s (differs)", local_name);
- uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL);
- sprintf(line, "Overwrite %s", local_name);
- uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_LOCAL);
- break;
- }
- }
-
- switch(checkPackedFile(abs_name, pf)) {
- case PF_NOFILE:
- sprintf(line, "Create %s", abs_name);
- uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL);
- break;
- case PF_EQUAL:
- sprintf(line, "Use %s (identical)", abs_name);
- uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL);
- break;
- case PF_DIFFERS:
- sprintf(line, "Use %s (differs)", local_name);
- uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL);
- sprintf(line, "Overwrite %s", local_name);
- uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL);
- break;
- }
-
- uiPupMenuEnd(C, pup);
-}
-
-static int unpack_exec(bContext *C, wmOperator *op)
+static int sound_unpack_exec(bContext *C, wmOperator *op)
{
int method= RNA_enum_get(op->ptr, "method");
- Editing* ed = CTX_data_scene(C)->ed;
- bSound* sound;
-
- if(!ed || !ed->act_seq || ed->act_seq->type != SEQ_SOUND)
- return OPERATOR_CANCELLED;
+ bSound* sound= NULL;
- sound = ed->act_seq->sound;
+ /* find the suppplied image by name */
+ if (RNA_property_is_set(op->ptr, "id")) {
+ char sndname[22];
+ RNA_string_get(op->ptr, "id", sndname);
+ sound = BLI_findstring(&CTX_data_main(C)->sound, sndname, offsetof(ID, name) + 2);
+ }
if(!sound || !sound->packedfile)
return OPERATOR_CANCELLED;
@@ -275,16 +224,19 @@ static int unpack_exec(bContext *C, wmOperator *op)
if(G.fileflags & G_AUTOPACK)
BKE_report(op->reports, RPT_WARNING, "AutoPack is enabled, so image will be packed again on file save.");
- unpackSound(op->reports, sound, method);
+ unpackSound(CTX_data_main(C), op->reports, sound, method);
return OPERATOR_FINISHED;
}
-static int unpack_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int sound_unpack_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Editing* ed = CTX_data_scene(C)->ed;
bSound* sound;
+ if(RNA_property_is_set(op->ptr, "id"))
+ return sound_unpack_exec(C, op);
+
if(!ed || !ed->act_seq || ed->act_seq->type != SEQ_SOUND)
return OPERATOR_CANCELLED;
@@ -296,7 +248,7 @@ static int unpack_invoke(bContext *C, wmOperator *op, wmEvent *event)
if(G.fileflags & G_AUTOPACK)
BKE_report(op->reports, RPT_WARNING, "AutoPack is enabled, so image will be packed again on file save.");
- unpack_menu(C, "SOUND_OT_unpack", sound->name, "audio", sound->packedfile);
+ unpack_menu(C, "SOUND_OT_unpack", sound->id.name+2, sound->name, "audio", sound->packedfile);
return OPERATOR_FINISHED;
}
@@ -309,8 +261,8 @@ void SOUND_OT_unpack(wmOperatorType *ot)
ot->idname= "SOUND_OT_unpack";
/* api callbacks */
- ot->exec= unpack_exec;
- ot->invoke= unpack_invoke;
+ ot->exec= sound_unpack_exec;
+ ot->invoke= sound_unpack_invoke;
ot->poll= sound_poll;
/* flags */
@@ -318,6 +270,7 @@ void SOUND_OT_unpack(wmOperatorType *ot)
/* properties */
RNA_def_enum(ot->srna, "method", unpack_method_items, PF_USE_LOCAL, "Method", "How to unpack.");
+ RNA_def_string(ot->srna, "id", "", 21, "Sound Name", "Sound datablock name to unpack."); /* XXX, weark!, will fail with library, name collisions */
}
/* ******************************************************* */
diff --git a/source/blender/editors/space_action/CMakeLists.txt b/source/blender/editors/space_action/CMakeLists.txt
index 3c0585c31ca..e0621a277ae 100644
--- a/source/blender/editors/space_action/CMakeLists.txt
+++ b/source/blender/editors/space_action/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -31,4 +29,14 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_space_action "${SRC}" "${INC}")
+set(SRC
+ action_draw.c
+ action_edit.c
+ action_ops.c
+ action_select.c
+ space_action.c
+
+ action_intern.h
+)
+
+blender_add_lib(bf_editor_space_action "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_action/Makefile b/source/blender/editors/space_action/Makefile
deleted file mode 100644
index 19aeb54cc2f..00000000000
--- a/source/blender/editors/space_action/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_action
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_action/SConscript b/source/blender/editors/space_action/SConscript
index 9ef42882b26..2e9a79db04a 100644
--- a/source/blender/editors/space_action/SConscript
+++ b/source/blender/editors/space_action/SConscript
@@ -6,4 +6,4 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../makesrna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
-env.BlenderLib ( 'bf_editors_space_action', sources, Split(incs), [], libtype=['core'], priority=[80] )
+env.BlenderLib ( 'bf_editors_space_action', sources, Split(incs), [], libtype=['core'], priority=[40] )
diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c
index d2067790b2f..4dc77e13192 100644
--- a/source/blender/editors/space_action/action_draw.c
+++ b/source/blender/editors/space_action/action_draw.c
@@ -34,9 +34,9 @@
#include <string.h>
#include <float.h>
-
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
/* Types --------------------------------------------------------------- */
@@ -45,7 +45,7 @@
#include "BKE_action.h"
#include "BKE_context.h"
-#include "BKE_utildefines.h"
+
/* Everything from source (BIF, BDR, BSE) ------------------------------ */
@@ -63,7 +63,7 @@
/* Channel List */
/* left hand part */
-void draw_channel_names(bContext *C, bAnimContext *ac, SpaceAction *saction, ARegion *ar)
+void draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
@@ -90,8 +90,8 @@ void draw_channel_names(bContext *C, bAnimContext *ac, SpaceAction *saction, ARe
*/
v2d->tot.ymin= (float)(-height);
}
- /* need to do a view-sync here, so that the keys area doesn't jump around */
- UI_view2d_sync(NULL, ac->sa, v2d, V2D_VIEWSYNC_AREA_VERTICAL);
+ /* need to do a view-sync here, so that the keys area doesn't jump around (it must copy this) */
+ UI_view2d_sync(NULL, ac->sa, v2d, V2D_LOCK_COPY);
/* loop through channels, and set up drawing depending on their type */
{ /* first pass: just the standard GL-drawing for backdrop + text */
@@ -162,9 +162,9 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
float act_start, act_end, y;
int height, items;
- char col1[3], col2[3];
- char col1a[3], col2a[3];
- char col1b[3], col2b[3];
+ unsigned char col1[3], col2[3];
+ unsigned char col1a[3], col2a[3];
+ unsigned char col1b[3], col2b[3];
/* get theme colors */
@@ -228,7 +228,7 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
switch (ale->type) {
case ANIMTYPE_SUMMARY:
{
- // FIXME: hardcoded colours - reddish color from NLA
+ // FIXME: hardcoded colors - reddish color from NLA
glColor4f(0.8f, 0.2f, 0.0f, 0.4f);
}
break;
diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c
index 916b0032f17..4719c10e941 100644
--- a/source/blender/editors/space_action/action_edit.c
+++ b/source/blender/editors/space_action/action_edit.c
@@ -35,8 +35,10 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
+#include "DNA_gpencil_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -53,10 +55,12 @@
#include "UI_view2d.h"
#include "ED_anim_api.h"
+#include "ED_gpencil.h"
#include "ED_keyframing.h"
#include "ED_keyframes_edit.h"
#include "ED_screen.h"
#include "ED_transform.h"
+#include "ED_markers.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -70,28 +74,44 @@
/* ******************** New Action Operator *********************** */
-static int act_new_exec(bContext *C, wmOperator *op)
+static int act_new_exec(bContext *C, wmOperator *UNUSED(op))
{
- bAction *action;
PointerRNA ptr, idptr;
PropertyRNA *prop;
- // XXX need to restore behaviour to copy old actions...
- action= add_empty_action("Action");
-
/* hook into UI */
uiIDContextProperty(C, &ptr, &prop);
-
- if(prop) {
- /* when creating new ID blocks, use is already 1, but RNA
- * pointer se also increases user, so this compensates it */
+
+ if (prop) {
+ bAction *action=NULL, *oldact=NULL;
+ PointerRNA oldptr;
+
+ /* create action - the way to do this depends on whether we've got an
+ * existing one there already, in which case we make a copy of it
+ * (which is useful for "versioning" actions within the same file)
+ */
+ oldptr = RNA_property_pointer_get(&ptr, prop);
+ oldact = (bAction *)oldptr.id.data;
+
+ if (oldact && GS(oldact->id.name)==ID_AC) {
+ /* make a copy of the existing action */
+ action= copy_action(oldact);
+ }
+ else {
+ /* just make a new (empty) action */
+ action= add_empty_action("Action");
+ }
+
+ /* when creating new ID blocks, use is already 1 (fake user),
+ * but RNA pointer use also increases user, so this compensates it
+ */
action->id.us--;
-
+
RNA_id_pointer_create(&action->id, &idptr);
RNA_property_pointer_set(&ptr, prop, idptr);
RNA_property_update(C, &ptr, prop);
}
-
+
/* set notifier that keyframes have changed */
WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
@@ -173,7 +193,7 @@ static void get_keyframe_extents (bAnimContext *ac, float *min, float *max)
/* ****************** Automatic Preview-Range Operator ****************** */
-static int actkeys_previewrange_exec(bContext *C, wmOperator *op)
+static int actkeys_previewrange_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
Scene *scene;
@@ -217,7 +237,7 @@ void ACTION_OT_previewrange_set (wmOperatorType *ot)
/* ****************** View-All Operator ****************** */
-static int actkeys_viewall_exec(bContext *C, wmOperator *op)
+static int actkeys_viewall_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
View2D *v2d;
@@ -291,7 +311,8 @@ static short copy_action_keys (bAnimContext *ac)
}
-static short paste_action_keys (bAnimContext *ac)
+static short paste_action_keys (bAnimContext *ac,
+ const eKeyPasteOffset offset_mode, const eKeyMergeMode merge_mode)
{
ListBase anim_data = {NULL, NULL};
int filter, ok=0;
@@ -301,7 +322,7 @@ static short paste_action_keys (bAnimContext *ac)
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* paste keyframes */
- ok= paste_animedit_keys(ac, &anim_data);
+ ok= paste_animedit_keys(ac, &anim_data, offset_mode, merge_mode);
/* clean up */
BLI_freelistN(&anim_data);
@@ -341,29 +362,35 @@ void ACTION_OT_copy (wmOperatorType *ot)
ot->description= "Copy selected keyframes to the copy/paste buffer";
/* api callbacks */
+// ot->invoke= WM_operator_props_popup; // better wait for graph redo panel
ot->exec= actkeys_copy_exec;
ot->poll= ED_operator_action_active;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-
-
static int actkeys_paste_exec(bContext *C, wmOperator *op)
{
bAnimContext ac;
+
+ const eKeyPasteOffset offset_mode= RNA_enum_get(op->ptr, "offset");
+ const eKeyMergeMode merge_mode= RNA_enum_get(op->ptr, "merge");
/* get editor data */
if (ANIM_animdata_get_context(C, &ac) == 0)
return OPERATOR_CANCELLED;
+ if(ac.reports==NULL) {
+ ac.reports= op->reports;
+ }
+
/* paste keyframes */
if (ac.datatype == ANIMCONT_GPENCIL) {
// FIXME...
}
else {
- if (paste_action_keys(&ac)) {
+ if (paste_action_keys(&ac, offset_mode, merge_mode)) {
BKE_report(op->reports, RPT_ERROR, "No keyframes to paste");
return OPERATOR_CANCELLED;
}
@@ -391,6 +418,9 @@ void ACTION_OT_paste (wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "offset", keyframe_paste_offset_items, KEYFRAME_PASTE_OFFSET_CFRA_START, "Offset", "Paste time offset of keys");
+ RNA_def_enum(ot->srna, "merge", keyframe_paste_merge_items, KEYFRAME_PASTE_MERGE_MIX, "Type", "Method of merking pasted keys and existing");
}
/* ******************** Insert Keyframes Operator ************************* */
@@ -410,8 +440,8 @@ static void insert_action_keys(bAnimContext *ac, short mode)
bAnimListElem *ale;
int filter;
+ ReportList *reports = ac->reports;
Scene *scene= ac->scene;
- float cfra= (float)CFRA;
short flag = 0;
/* filter data */
@@ -428,7 +458,8 @@ static void insert_action_keys(bAnimContext *ac, short mode)
for (ale= anim_data.first; ale; ale= ale->next) {
AnimData *adt= ANIM_nla_mapping_get(ac, ale);
FCurve *fcu= (FCurve *)ale->key_data;
-
+ float cfra;
+
/* adjust current frame for NLA-scaling */
if (adt)
cfra= BKE_nla_tweakedit_remap(adt, (float)CFRA, NLATIME_CONVERT_UNMAP);
@@ -437,7 +468,7 @@ static void insert_action_keys(bAnimContext *ac, short mode)
/* if there's an id */
if (ale->id)
- insert_keyframe(ale->id, NULL, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
+ insert_keyframe(reports, ale->id, NULL, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
else
insert_vert_fcurve(fcu, cfra, fcu->curval, 0);
}
@@ -509,10 +540,10 @@ static void duplicate_action_keys (bAnimContext *ac)
/* loop through filtered data and delete selected keys */
for (ale= anim_data.first; ale; ale= ale->next) {
- //if (ale->type == ANIMTYPE_GPLAYER)
- // delete_gplayer_frames((bGPDlayer *)ale->data);
- //else
+ if (ale->type == ANIMTYPE_FCURVE)
duplicate_fcurve_keys((FCurve *)ale->key_data);
+ else
+ duplicate_gplayer_frames((bGPDlayer *)ale->data);
}
/* free filtered list */
@@ -521,7 +552,7 @@ static void duplicate_action_keys (bAnimContext *ac)
/* ------------------- */
-static int actkeys_duplicate_exec(bContext *C, wmOperator *op)
+static int actkeys_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -541,7 +572,7 @@ static int actkeys_duplicate_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED; // xxx - start transform
}
-static int actkeys_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int actkeys_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
actkeys_duplicate_exec(C, op);
@@ -598,8 +629,8 @@ static void delete_action_keys (bAnimContext *ac)
if ((fcu->totvert == 0) && (list_has_suitable_fmodifier(&fcu->modifiers, 0, FMI_TYPE_GENERATE_CURVE) == 0))
ANIM_fcurve_delete_from_animdata(ac, adt, fcu);
}
- //else
- // delete_gplayer_frames((bGPDlayer *)ale->data);
+ else
+ delete_gplayer_frames((bGPDlayer *)ale->data);
}
/* free filtered list */
@@ -608,7 +639,7 @@ static void delete_action_keys (bAnimContext *ac)
/* ------------------- */
-static int actkeys_delete_exec(bContext *C, wmOperator *op)
+static int actkeys_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -734,7 +765,7 @@ static void sample_action_keys (bAnimContext *ac)
/* ------------------- */
-static int actkeys_sample_exec(bContext *C, wmOperator *op)
+static int actkeys_sample_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -791,7 +822,7 @@ static void setexpo_action_keys(bAnimContext *ac, short mode)
int filter;
/* filter data */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* loop through setting mode per F-Curve */
@@ -1096,21 +1127,19 @@ void ACTION_OT_keyframe_type (wmOperatorType *ot)
/* ***************** Jump to Selected Frames Operator *********************** */
/* snap current-frame indicator to 'average time' of selected keyframe */
-static int actkeys_framejump_exec(bContext *C, wmOperator *op)
+static int actkeys_framejump_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
ListBase anim_data= {NULL, NULL};
bAnimListElem *ale;
int filter;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
/* get editor data */
if (ANIM_animdata_get_context(C, &ac) == 0)
return OPERATOR_CANCELLED;
- /* init edit data */
- memset(&ked, 0, sizeof(KeyframeEditData));
-
+ /* init edit data */
/* loop over action data, averaging values */
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
@@ -1174,7 +1203,7 @@ static void snap_action_keys(bAnimContext *ac, short mode)
bAnimListElem *ale;
int filter;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
KeyframeEditFunc edit_cb;
/* filter data */
@@ -1186,8 +1215,7 @@ static void snap_action_keys(bAnimContext *ac, short mode)
/* get beztriple editing callbacks */
edit_cb= ANIM_editkeyframes_snap(mode);
-
- memset(&ked, 0, sizeof(KeyframeEditData));
+
ked.scene= ac->scene;
if (mode == ACTKEYS_SNAP_NEAREST_MARKER) {
ked.list.first= (ac->markers) ? ac->markers->first : NULL;
@@ -1274,13 +1302,12 @@ static void mirror_action_keys(bAnimContext *ac, short mode)
bAnimListElem *ale;
int filter;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
KeyframeEditFunc edit_cb;
/* get beztriple editing callbacks */
edit_cb= ANIM_editkeyframes_mirror(mode);
-
- memset(&ked, 0, sizeof(KeyframeEditData));
+
ked.scene= ac->scene;
/* for 'first selected marker' mode, need to find first selected marker first! */
@@ -1289,13 +1316,7 @@ static void mirror_action_keys(bAnimContext *ac, short mode)
TimeMarker *marker= NULL;
/* find first selected marker */
- if (ac->markers) {
- for (marker= ac->markers->first; marker; marker=marker->next) {
- if (marker->flag & SELECT) {
- break;
- }
- }
- }
+ marker= ED_markers_get_first_selected(ac->markers);
/* store marker's time (if available) */
if (marker)
diff --git a/source/blender/editors/space_action/action_intern.h b/source/blender/editors/space_action/action_intern.h
index b02e95ac138..cc363b76479 100644
--- a/source/blender/editors/space_action/action_intern.h
+++ b/source/blender/editors/space_action/action_intern.h
@@ -41,7 +41,7 @@ struct bAnimListElem;
/* ***************************************** */
/* action_draw.c */
-void draw_channel_names(struct bContext *C, struct bAnimContext *ac, struct SpaceAction *saction, struct ARegion *ar);
+void draw_channel_names(struct bContext *C, struct bAnimContext *ac, struct ARegion *ar);
void draw_channel_strips(struct bAnimContext *ac, struct SpaceAction *saction, struct ARegion *ar);
struct ActKeysInc *init_aki_data(struct bAnimContext *ac, struct bAnimListElem *ale);
diff --git a/source/blender/editors/space_action/action_ops.c b/source/blender/editors/space_action/action_ops.c
index 19dd4512909..ea36ce98ecb 100644
--- a/source/blender/editors/space_action/action_ops.c
+++ b/source/blender/editors/space_action/action_ops.c
@@ -131,7 +131,7 @@ static void action_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap)
WM_keymap_add_item(keymap, "ACTION_OT_mirror", MKEY, KM_PRESS, KM_SHIFT, 0);
/* menu + set setting */
- WM_keymap_add_item(keymap, "ACTION_OT_handle_type", HKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ACTION_OT_handle_type", VKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "ACTION_OT_interpolation_type", TKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "ACTION_OT_extrapolation_type", EKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "ACTION_OT_keyframe_type", RKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c
index b2c47194384..365c17d45c0 100644
--- a/source/blender/editors/space_action/action_select.c
+++ b/source/blender/editors/space_action/action_select.c
@@ -34,8 +34,10 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
+#include "DNA_gpencil_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -49,6 +51,7 @@
#include "UI_view2d.h"
#include "ED_anim_api.h"
+#include "ED_gpencil.h"
#include "ED_keyframes_draw.h"
#include "ED_keyframes_edit.h"
#include "ED_markers.h"
@@ -74,10 +77,7 @@
* - This is called by the deselect all operator, as well as other ones!
*
* - test: check if select or deselect all
- * - sel: how to select keyframes
- * 0 = deselect
- * 1 = select
- * 2 = invert
+ * - sel: how to select keyframes (SELECT_*)
*/
static void deselect_action_keys (bAnimContext *ac, short test, short sel)
{
@@ -85,7 +85,7 @@ static void deselect_action_keys (bAnimContext *ac, short test, short sel)
bAnimListElem *ale;
int filter;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
KeyframeEditFunc test_cb, sel_cb;
/* determine type-based settings */
@@ -98,17 +98,16 @@ static void deselect_action_keys (bAnimContext *ac, short test, short sel)
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* init BezTriple looping data */
- memset(&ked, 0, sizeof(KeyframeEditData));
test_cb= ANIM_editkeyframes_ok(BEZT_OK_SELECTED);
/* See if we should be selecting or deselecting */
if (test) {
for (ale= anim_data.first; ale; ale= ale->next) {
if (ale->type == ANIMTYPE_GPLAYER) {
- //if (is_gplayer_frame_selected(ale->data)) {
- // sel= 0;
- // break;
- //}
+ if (is_gplayer_frame_selected(ale->data)) {
+ sel= SELECT_SUBTRACT;
+ break;
+ }
}
else {
if (ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, test_cb, NULL)) {
@@ -124,10 +123,10 @@ static void deselect_action_keys (bAnimContext *ac, short test, short sel)
/* Now set the flags */
for (ale= anim_data.first; ale; ale= ale->next) {
- //if (ale->type == ACTTYPE_GPLAYER)
- // set_gplayer_frame_selection(ale->data, sel);
- //else
- ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, sel_cb, NULL);
+ if (ale->type == ANIMTYPE_GPLAYER)
+ set_gplayer_frame_selection(ale->data, sel);
+ else
+ ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, sel_cb, NULL);
}
/* Cleanup */
@@ -254,9 +253,9 @@ static void borderselect_action (bAnimContext *ac, rcti rect, short mode, short
!((ymax < rectf.ymin) || (ymin > rectf.ymax)) )
{
/* loop over data selecting */
- //if (ale->type == ANIMTYPE_GPLAYER)
- // borderselect_gplayer_frames(ale->data, rectf.xmin, rectf.xmax, selectmode);
- //else
+ if (ale->type == ANIMTYPE_GPLAYER)
+ borderselect_gplayer_frames(ale->data, rectf.xmin, rectf.xmax, selectmode);
+ else
ANIM_animchannel_keyframes_loop(&ked, ale, ok_cb, select_cb, NULL, filterflag);
}
@@ -367,7 +366,7 @@ static void markers_selectkeys_between (bAnimContext *ac)
int filter;
KeyframeEditFunc ok_cb, select_cb;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
float min, max;
/* get extreme markers */
@@ -378,8 +377,7 @@ static void markers_selectkeys_between (bAnimContext *ac)
/* get editing funcs + data */
ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);
select_cb= ANIM_editkeyframes_select(SELECT_ADD);
-
- memset(&ked, 0, sizeof(KeyframeEditData));
+
ked.f1= min;
ked.f2= max;
@@ -396,6 +394,9 @@ static void markers_selectkeys_between (bAnimContext *ac)
ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
}
+ else if (ale->type == ANIMTYPE_GPLAYER) {
+ borderselect_gplayer_frames(ale->data, min, max, SELECT_ADD);
+ }
else {
ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
}
@@ -416,10 +417,9 @@ static void columnselect_action_keys (bAnimContext *ac, short mode)
Scene *scene= ac->scene;
CfraElem *ce;
KeyframeEditFunc select_cb, ok_cb;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
/* initialise keyframe editing data */
- memset(&ked, 0, sizeof(KeyframeEditData));
/* build list of columns */
switch (mode) {
@@ -428,8 +428,8 @@ static void columnselect_action_keys (bAnimContext *ac, short mode)
filter= (ANIMFILTER_VISIBLE);
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
- //for (ale= anim_data.first; ale; ale= ale->next)
- // gplayer_make_cfra_list(ale->data, &elems, 1);
+ for (ale= anim_data.first; ale; ale= ale->next)
+ gplayer_make_cfra_list(ale->data, &ked.list, 1);
}
else {
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY);
@@ -484,20 +484,10 @@ static void columnselect_action_keys (bAnimContext *ac, short mode)
ked.f1= ce->cfra;
/* select elements with frame number matching cfraelem */
- ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
-
-#if 0 // XXX reenable when Grease Pencil stuff is back
- if (ale->type == ANIMTYPE_GPLAYER) {
- bGPDlayer *gpl= (bGPDlayer *)ale->data;
- bGPDframe *gpf;
-
- for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
- if (ecfra == gpf->framenum)
- gpf->flag |= GP_FRAME_SELECT;
- }
- }
- //else...
-#endif // XXX reenable when Grease Pencil stuff is back
+ if (ale->type == ANIMTYPE_GPLAYER)
+ select_gpencil_frame(ale->data, ce->cfra, SELECT_ADD);
+ else
+ ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
}
}
@@ -551,7 +541,7 @@ void ACTION_OT_select_column (wmOperatorType *ot)
/* ******************** Select Linked Operator *********************** */
-static int actkeys_select_linked_exec (bContext *C, wmOperator *op)
+static int actkeys_select_linked_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -613,13 +603,12 @@ static void select_moreless_action_keys (bAnimContext *ac, short mode)
bAnimListElem *ale;
int filter;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
KeyframeEditFunc build_cb;
/* init selmap building data */
build_cb= ANIM_editkeyframes_buildselmap(mode);
- memset(&ked, 0, sizeof(KeyframeEditData));
/* loop through all of the keys and select additional keyframes based on these */
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
@@ -650,7 +639,7 @@ static void select_moreless_action_keys (bAnimContext *ac, short mode)
/* ----------------- */
-static int actkeys_select_more_exec (bContext *C, wmOperator *op)
+static int actkeys_select_more_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -684,7 +673,7 @@ void ACTION_OT_select_more (wmOperatorType *ot)
/* ----------------- */
-static int actkeys_select_less_exec (bContext *C, wmOperator *op)
+static int actkeys_select_less_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -746,17 +735,19 @@ static void actkeys_mselect_single (bAnimContext *ac, bAnimListElem *ale, short
bDopeSheet *ads= (ac->datatype == ANIMCONT_DOPESHEET) ? ac->data : NULL;
int ds_filter = ((ads) ? (ads->filterflag) : (0));
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
KeyframeEditFunc select_cb, ok_cb;
/* get functions for selecting keyframes */
select_cb= ANIM_editkeyframes_select(select_mode);
ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAME);
- memset(&ked, 0, sizeof(KeyframeEditData));
ked.f1= selx;
/* select the nominated keyframe on the given frame */
- ANIM_animchannel_keyframes_loop(&ked, ale, ok_cb, select_cb, NULL, ds_filter);
+ if (ale->type == ANIMTYPE_GPLAYER)
+ select_gpencil_frame(ale->data, selx, select_mode);
+ else
+ ANIM_animchannel_keyframes_loop(&ked, ale, ok_cb, select_cb, NULL, ds_filter);
}
/* Option 2) Selects all the keyframes on either side of the current frame (depends on which side the mouse is on) */
@@ -767,7 +758,7 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short
int filter;
KeyframeEditFunc ok_cb, select_cb;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
Scene *scene= ac->scene;
/* if select mode is replace, deselect all keyframes (and channels) first */
@@ -782,8 +773,7 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short
/* set callbacks and editing data */
ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);
select_cb= ANIM_editkeyframes_select(select_mode);
-
- memset(&ked, 0, sizeof(KeyframeEditFunc));
+
if (leftright == ACTKEYS_LRSEL_LEFT) {
ked.f1 = MINAFRAMEF;
ked.f2 = (float)(CFRA + FRAME_CLICK_THRESH);
@@ -809,20 +799,21 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short
ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
}
- //else if (ale->type == ANIMTYPE_GPLAYER)
- // borderselect_gplayer_frames(ale->data, min, max, SELECT_ADD);
+ else if (ale->type == ANIMTYPE_GPLAYER)
+ borderselect_gplayer_frames(ale->data, ked.f1, ked.f2, select_mode);
else
ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
}
/* Sync marker support */
- if((select_mode==SELECT_ADD) && (ac->spacetype==SPACE_ACTION) && ELEM(leftright, ACTKEYS_LRSEL_LEFT, ACTKEYS_LRSEL_RIGHT)) {
+ if ((select_mode==SELECT_ADD) && ELEM(leftright, ACTKEYS_LRSEL_LEFT, ACTKEYS_LRSEL_RIGHT)) {
SpaceAction *saction= ac->sa->spacedata.first;
- if (saction && saction->flag & SACTION_MARKERS_MOVE) {
+ if ((saction) && (saction->flag & SACTION_MARKERS_MOVE)) {
+ ListBase *markers = ED_animcontext_get_markers(ac);
TimeMarker *marker;
- for (marker= scene->markers.first; marker; marker= marker->next) {
+ for (marker= markers->first; marker; marker= marker->next) {
if( ((leftright == ACTKEYS_LRSEL_LEFT) && (marker->frame < CFRA)) ||
((leftright == ACTKEYS_LRSEL_RIGHT) && (marker->frame >= CFRA)) )
{
@@ -847,10 +838,9 @@ static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float se
int filter;
KeyframeEditFunc select_cb, ok_cb;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
/* initialise keyframe editing data */
- memset(&ked, 0, sizeof(KeyframeEditData));
/* set up BezTriple edit callbacks */
select_cb= ANIM_editkeyframes_select(select_mode);
@@ -875,20 +865,10 @@ static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float se
ked.f1= selx;
/* select elements with frame number matching cfra */
- ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
-
-#if 0 // XXX reenable when Grease Pencil stuff is back
- if (ale->type == ANIMTYPE_GPLAYER) {
- bGPDlayer *gpl= (bGPDlayer *)ale->data;
- bGPDframe *gpf;
-
- for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
- if (ecfra == gpf->framenum)
- gpf->flag |= GP_FRAME_SELECT;
- }
- }
- //else...
-#endif // XXX reenable when Grease Pencil stuff is back
+ if (ale->type == ANIMTYPE_GPLAYER)
+ select_gpencil_frame(ale->key_data, selx, select_mode);
+ else
+ ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
}
/* free elements */
@@ -943,7 +923,6 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode,
ActKeyColumn *ak, *akn=NULL;
/* make list of keyframes */
- // TODO: it would be great if we didn't have to apply this to all the keyframes to do this...
BLI_dlrbTree_init(&anim_keys);
if (ale->key_data) {
@@ -978,27 +957,22 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode,
/* dopesheet summary covers everything */
summary_to_keylist(ac, &anim_keys, NULL);
}
- else if (ale->type == ANIMTYPE_GROUP) {
+ else if (ale->type == ANIMTYPE_GROUP) {
+ // TODO: why don't we just give groups key_data too?
bActionGroup *agrp= (bActionGroup *)ale->data;
agroup_to_keylist(adt, agrp, &anim_keys, NULL);
}
- else if (ale->type == ANIMTYPE_GPDATABLOCK) {
- /* cleanup */
- // FIXME:...
- BLI_freelistN(&anim_data);
- return;
- }
else if (ale->type == ANIMTYPE_GPLAYER) {
- struct bGPDlayer *gpl= (struct bGPDlayer *)ale->data;
- gpl_to_keylist(ads, gpl, &anim_keys, NULL);
+ // TODO: why don't we just give gplayers key_data too?
+ bGPDlayer *gpl = (bGPDlayer *)ale->data;
+ gpl_to_keylist(ads, gpl, &anim_keys);
}
- /* loop through keyframes, finding one that was within the range clicked on */
- // TODO: replace this with API calls instead of inlining
+ /* start from keyframe at root of BST, traversing until we find one within the range that was clicked on */
for (ak= anim_keys.root; ak; ak= akn) {
if (IN_RANGE(ak->cfra, rectf.xmin, rectf.xmax)) {
/* set the frame to use, and apply inverse-correction for NLA-mapping
- * so that the frame will get selected by the selection functiosn without
+ * so that the frame will get selected by the selection functions without
* requiring to map each frame once again...
*/
selx= BKE_nla_tweakedit_remap(adt, ak->cfra, NLATIME_CONVERT_UNMAP);
@@ -1051,11 +1025,16 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode,
}
}
else if (ac->datatype == ANIMCONT_GPENCIL) {
+ /* deselect all other channels first */
ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
- /* Highlight gpencil layer */
- //gpl->flag |= GP_LAYER_SELECT;
- //gpencil_layer_setactive(gpd, gpl);
+ /* Highlight GPencil Layer */
+ if ((ale && ale->data) && (ale->type == ANIMTYPE_GPLAYER)) {
+ bGPDlayer *gpl = ale->data;
+
+ gpl->flag |= GP_LAYER_SELECT;
+ //gpencil_layer_setactive(gpd, gpl);
+ }
}
}
@@ -1063,11 +1042,7 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode,
if (ale) {
if (found) {
/* apply selection to keyframes */
- if (/*gpl*/0) {
- /* grease pencil */
- //select_gpencil_frame(gpl, (int)selx, selectmode);
- }
- else if (column) {
+ if (column) {
/* select all keyframes in the same frame as the one we hit on the active channel */
actkeys_mselect_column(ac, select_mode, selx);
}
diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c
index 7b96618d923..792f212f638 100644
--- a/source/blender/editors/space_action/space_action.c
+++ b/source/blender/editors/space_action/space_action.c
@@ -37,6 +37,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -101,16 +102,17 @@ static SpaceLink *action_new(const bContext *C)
ar->v2d.cur = ar->v2d.tot;
ar->v2d.min[0]= 0.0f;
- ar->v2d.min[1]= 0.0f;
+ ar->v2d.min[1]= 0.0f;
ar->v2d.max[0]= MAXFRAMEF;
- ar->v2d.max[1]= FLT_MAX;
+ ar->v2d.max[1]= FLT_MAX;
ar->v2d.minzoom= 0.01f;
ar->v2d.maxzoom= 50;
ar->v2d.scroll = (V2D_SCROLL_BOTTOM|V2D_SCROLL_SCALE_HORIZONTAL);
ar->v2d.scroll |= (V2D_SCROLL_RIGHT);
ar->v2d.keepzoom= V2D_LOCKZOOM_Y;
+ ar->v2d.keepofs= V2D_KEEPOFS_Y;
ar->v2d.align= V2D_ALIGN_NO_POS_Y;
ar->v2d.flag = V2D_VIEWSYNC_AREA_VERTICAL;
@@ -118,7 +120,7 @@ static SpaceLink *action_new(const bContext *C)
}
/* not spacelink itself */
-static void action_free(SpaceLink *sl)
+static void action_free(SpaceLink *UNUSED(sl))
{
// SpaceAction *saction= (SpaceAction*) sl;
@@ -126,7 +128,7 @@ static void action_free(SpaceLink *sl)
/* spacetype; init callback */
-static void action_init(struct wmWindowManager *wm, ScrArea *sa)
+static void action_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa)
{
SpaceAction *saction = sa->spacedata.first;
saction->flag |= SACTION_TEMP_NEEDCHANSYNC;
@@ -169,12 +171,12 @@ static void action_main_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* time grid */
unit= (saction->flag & SACTION_DRAWTIME)? V2D_UNIT_SECONDS : V2D_UNIT_FRAMES;
- grid= UI_view2d_grid_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy);
- UI_view2d_grid_draw(C, v2d, grid, V2D_GRIDLINES_ALL);
+ grid= UI_view2d_grid_calc(CTX_data_scene(C), v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy);
+ UI_view2d_grid_draw(v2d, grid, V2D_GRIDLINES_ALL);
UI_view2d_grid_free(grid);
/* data */
@@ -188,11 +190,13 @@ static void action_main_area_draw(const bContext *C, ARegion *ar)
ANIM_draw_cfra(C, v2d, flag);
/* markers */
- UI_view2d_view_orthoSpecial(C, v2d, 1);
- draw_markers_time(C, 0);
+ UI_view2d_view_orthoSpecial(ar, v2d, 1);
+
+ flag = (saction->flag & SACTION_POSEMARKERS_SHOW)? DRAW_MARKERS_LOCAL : 0;
+ draw_markers_time(C, flag);
/* preview range */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
ANIM_draw_previewrange(C, v2d);
/* reset view matrix */
@@ -219,7 +223,6 @@ static void action_channel_area_init(wmWindowManager *wm, ARegion *ar)
static void action_channel_area_draw(const bContext *C, ARegion *ar)
{
/* draw entirely, view changes should be handled here */
- SpaceAction *saction= CTX_wm_space_action(C);
bAnimContext ac;
View2D *v2d= &ar->v2d;
View2DScrollers *scrollers;
@@ -228,11 +231,11 @@ static void action_channel_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* data */
if (ANIM_animdata_get_context(C, &ac)) {
- draw_channel_names((bContext *)C, &ac, saction, ar);
+ draw_channel_names((bContext *)C, &ac, ar);
}
/* reset view matrix */
@@ -246,7 +249,7 @@ static void action_channel_area_draw(const bContext *C, ARegion *ar)
/* add handlers, stuff you only do once or on area/region changes */
-static void action_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void action_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -348,6 +351,13 @@ static void action_listener(ScrArea *sa, wmNotifier *wmn)
/* context changes */
switch (wmn->category) {
+ case NC_SCREEN:
+ if (wmn->data == ND_GPENCIL) {
+ /* only handle this event in GPencil mode for performance considerations */
+ if (saction->mode == SACTCONT_GPENCIL)
+ ED_area_tag_redraw(sa);
+ }
+ break;
case NC_ANIMATION:
/* for selection changes of animation data, we can just redraw... otherwise autocolor might need to be done again */
if (ELEM(wmn->data, ND_KEYFRAME, ND_ANIMCHAN) && (wmn->action == NA_SELECTED))
@@ -417,7 +427,7 @@ static void action_header_area_listener(ARegion *ar, wmNotifier *wmn)
static void action_refresh(const bContext *C, ScrArea *sa)
{
- SpaceAction *saction= CTX_wm_space_action(C);
+ SpaceAction *saction= (SpaceAction *)sa->spacedata.first;
/* update the state of the animchannels in response to changes from the data they represent
* NOTE: the temp flag is used to indicate when this needs to be done, and will be cleared once handled
@@ -425,6 +435,7 @@ static void action_refresh(const bContext *C, ScrArea *sa)
if (saction->flag & SACTION_TEMP_NEEDCHANSYNC) {
ANIM_sync_animchannels_to_data(C);
saction->flag &= ~SACTION_TEMP_NEEDCHANSYNC;
+ ED_area_tag_redraw(sa);
}
/* region updates? */
@@ -455,7 +466,7 @@ void ED_spacetype_action(void)
art->init= action_main_area_init;
art->draw= action_main_area_draw;
art->listener= action_main_area_listener;
- art->keymapflag= ED_KEYMAP_VIEW2D/*|ED_KEYMAP_MARKERS*/|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
+ art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_api/CMakeLists.txt b/source/blender/editors/space_api/CMakeLists.txt
index da140fe0982..93f256cf3da 100644
--- a/source/blender/editors/space_api/CMakeLists.txt
+++ b/source/blender/editors/space_api/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -31,4 +29,9 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_space_api "${SRC}" "${INC}")
+set(SRC
+ space.c
+ spacetypes.c
+)
+
+blender_add_lib(bf_editor_space_api "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_api/Makefile b/source/blender/editors/space_api/Makefile
deleted file mode 100644
index deaa46a9582..00000000000
--- a/source/blender/editors/space_api/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_space
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c
index 2140c59da67..0aac167fed2 100644
--- a/source/blender/editors/space_api/spacetypes.c
+++ b/source/blender/editors/space_api/spacetypes.c
@@ -25,11 +25,14 @@
#include <stdlib.h>
#include "MEM_guardedalloc.h"
+
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_object_types.h"
#include "DNA_windowmanager_types.h"
+
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -224,19 +227,19 @@ void ED_region_draw_cb_draw(const bContext *C, ARegion *ar, int type)
/* ********************* space template *********************** */
/* allocate and init some vars */
-static SpaceLink *xxx_new(const bContext *C)
+static SpaceLink *xxx_new(const bContext *UNUSED(C))
{
return NULL;
}
/* not spacelink itself */
-static void xxx_free(SpaceLink *sl)
+static void xxx_free(SpaceLink *UNUSED(sl))
{
}
/* spacetype; init callback for usage, should be redoable */
-static void xxx_init(wmWindowManager *wm, ScrArea *sa)
+static void xxx_init(wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
/* link area to SpaceXXX struct */
@@ -246,7 +249,7 @@ static void xxx_init(wmWindowManager *wm, ScrArea *sa)
/* add types to regions */
}
-static SpaceLink *xxx_duplicate(SpaceLink *sl)
+static SpaceLink *xxx_duplicate(SpaceLink *UNUSED(sl))
{
return NULL;
@@ -257,7 +260,7 @@ static void xxx_operatortypes(void)
/* register operator types for this space */
}
-static void xxx_keymap(wmKeyConfig *keyconf)
+static void xxx_keymap(wmKeyConfig *UNUSED(keyconf))
{
/* add default items to keymap */
}
diff --git a/source/blender/editors/space_buttons/CMakeLists.txt b/source/blender/editors/space_buttons/CMakeLists.txt
index f8e9536ecf8..8a55567c4c0 100644
--- a/source/blender/editors/space_buttons/CMakeLists.txt
+++ b/source/blender/editors/space_buttons/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -31,4 +29,13 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_space_buttons "${SRC}" "${INC}")
+set(SRC
+ buttons_context.c
+ buttons_header.c
+ buttons_ops.c
+ space_buttons.c
+
+ buttons_intern.h
+)
+
+blender_add_lib(bf_editor_space_buttons "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_buttons/Makefile b/source/blender/editors/space_buttons/Makefile
deleted file mode 100644
index 28758fb168b..00000000000
--- a/source/blender/editors/space_buttons/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_buttons
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c
index 343237dee5e..d075958ffef 100644
--- a/source/blender/editors/space_buttons/buttons_context.c
+++ b/source/blender/editors/space_buttons/buttons_context.c
@@ -30,6 +30,9 @@
#include "MEM_guardedalloc.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+
#include "DNA_armature_types.h"
#include "DNA_lamp_types.h"
#include "DNA_material_types.h"
@@ -38,8 +41,6 @@
#include "DNA_world_types.h"
#include "DNA_brush_types.h"
-#include "BLI_listbase.h"
-
#include "BKE_context.h"
#include "BKE_action.h"
#include "BKE_material.h"
@@ -48,7 +49,7 @@
#include "BKE_particle.h"
#include "BKE_screen.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "RNA_access.h"
@@ -65,6 +66,7 @@ typedef struct ButsContextPath {
PointerRNA ptr[8];
int len;
int flag;
+ int tex_ctx;
} ButsContextPath;
static int set_pointer_type(ButsContextPath *path, bContextDataResult *result, StructRNA *type)
@@ -323,7 +325,7 @@ static int buttons_context_path_particle(ButsContextPath *path)
return 0;
}
-static int buttons_context_path_brush(const bContext *C, ButsContextPath *path)
+static int buttons_context_path_brush(ButsContextPath *path)
{
Scene *scene;
Brush *br= NULL;
@@ -352,7 +354,7 @@ static int buttons_context_path_brush(const bContext *C, ButsContextPath *path)
return 0;
}
-static int buttons_context_path_texture(const bContext *C, ButsContextPath *path)
+static int buttons_context_path_texture(ButsContextPath *path)
{
Material *ma;
Lamp *la;
@@ -367,7 +369,7 @@ static int buttons_context_path_texture(const bContext *C, ButsContextPath *path
return 1;
}
/* try brush */
- if((path->flag & SB_BRUSH_TEX) && buttons_context_path_brush(C, path)) {
+ if((path->tex_ctx == SB_TEXC_BRUSH) && buttons_context_path_brush(path)) {
br= path->ptr[path->len-1].data;
if(br) {
@@ -379,7 +381,7 @@ static int buttons_context_path_texture(const bContext *C, ButsContextPath *path
}
}
/* try world */
- if((path->flag & SB_WORLD_TEX) && buttons_context_path_world(path)) {
+ if((path->tex_ctx == SB_TEXC_WORLD) && buttons_context_path_world(path)) {
wo= path->ptr[path->len-1].data;
if(wo && GS(wo->id.name)==ID_WO) {
@@ -416,7 +418,7 @@ static int buttons_context_path_texture(const bContext *C, ButsContextPath *path
}
/* try brushes again in case of no material, lamp, etc */
path->len = orig_len;
- if(buttons_context_path_brush(C, path)) {
+ if(buttons_context_path_brush(path)) {
br= path->ptr[path->len-1].data;
if(br) {
@@ -441,6 +443,7 @@ static int buttons_context_path(const bContext *C, ButsContextPath *path, int ma
memset(path, 0, sizeof(*path));
path->flag= flag;
+ path->tex_ctx = sbuts->texture_context;
/* if some ID datablock is pinned, set the root pointer */
if(sbuts->pinid) {
@@ -485,7 +488,7 @@ static int buttons_context_path(const bContext *C, ButsContextPath *path, int ma
found= buttons_context_path_material(path);
break;
case BCONTEXT_TEXTURE:
- found= buttons_context_path_texture(C, path);
+ found= buttons_context_path_texture(path);
break;
case BCONTEXT_BONE:
found= buttons_context_path_bone(path);
@@ -515,7 +518,7 @@ static int buttons_shading_context(const bContext *C, int mainb)
return 0;
}
-static int buttons_shading_new_context(const bContext *C, int flag, int mainb)
+static int buttons_shading_new_context(const bContext *C, int flag)
{
Object *ob= CTX_data_active_object(C);
@@ -533,13 +536,12 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
{
ButsContextPath *path;
PointerRNA *ptr;
- int a, pflag, flag= 0;
+ int a, pflag= 0, flag= 0;
if(!sbuts->path)
sbuts->path= MEM_callocN(sizeof(ButsContextPath), "ButsContextPath");
path= sbuts->path;
- pflag= (sbuts->flag & (SB_WORLD_TEX|SB_BRUSH_TEX));
/* for each context, see if we can compute a valid path to it, if
* this is the case, we know we have to display the button */
@@ -568,7 +570,7 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
if((flag & (1 << sbuts->mainb)) == 0) {
if(sbuts->flag & SB_SHADING_CONTEXT) {
/* try to keep showing shading related buttons */
- sbuts->mainb= buttons_shading_new_context(C, flag, sbuts->mainb);
+ sbuts->mainb= buttons_shading_new_context(C, flag);
}
else if(flag & BCONTEXT_OBJECT) {
sbuts->mainb= BCONTEXT_OBJECT;
@@ -821,7 +823,7 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r
/************************* Drawing the Path ************************/
-static void pin_cb(bContext *C, void *arg1, void *arg2)
+static void pin_cb(bContext *C, void *UNUSED(arg1), void *UNUSED(arg2))
{
SpaceButs *sbuts= CTX_wm_space_buts(C);
diff --git a/source/blender/editors/space_buttons/buttons_header.c b/source/blender/editors/space_buttons/buttons_header.c
index ab756b638fa..18882a68e52 100644
--- a/source/blender/editors/space_buttons/buttons_header.c
+++ b/source/blender/editors/space_buttons/buttons_header.c
@@ -29,16 +29,16 @@
#include <string.h>
#include <stdio.h>
-
-
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
#include "ED_screen.h"
#include "ED_types.h"
-
+#include "DNA_object_types.h"
#include "UI_interface.h"
#include "UI_resources.h"
@@ -50,7 +50,26 @@
#define B_CONTEXT_SWITCH 101
#define B_BUTSPREVIEW 102
-static void do_buttons_buttons(bContext *C, void *arg, int event)
+static void set_texture_context(bContext *C, SpaceButs *sbuts)
+{
+ switch(sbuts->mainb) {
+ case BCONTEXT_MATERIAL:
+ sbuts->texture_context = SB_TEXC_MAT_OR_LAMP;
+ break;
+ case BCONTEXT_DATA:
+ {
+ Object *ob = CTX_data_active_object(C);
+ if(ob && ob->type==OB_LAMP)
+ sbuts->texture_context = SB_TEXC_MAT_OR_LAMP;
+ break;
+ }
+ case BCONTEXT_WORLD:
+ sbuts->texture_context = SB_TEXC_WORLD;
+ break;
+ }
+}
+
+static void do_buttons_buttons(bContext *C, void *UNUSED(arg), int event)
{
SpaceButs *sbuts= CTX_wm_space_buts(C);
@@ -62,11 +81,7 @@ static void do_buttons_buttons(bContext *C, void *arg, int event)
case B_BUTSPREVIEW:
ED_area_tag_redraw(CTX_wm_area(C));
- /* silly exception */
- if(sbuts->mainb == BCONTEXT_WORLD)
- sbuts->flag |= SB_WORLD_TEX;
- else if(sbuts->mainb != BCONTEXT_TEXTURE)
- sbuts->flag &= ~SB_WORLD_TEX;
+ set_texture_context(C, sbuts);
sbuts->preview= 1;
break;
diff --git a/source/blender/editors/space_buttons/buttons_ops.c b/source/blender/editors/space_buttons/buttons_ops.c
index c1803dde805..b7c9bdde0e8 100644
--- a/source/blender/editors/space_buttons/buttons_ops.c
+++ b/source/blender/editors/space_buttons/buttons_ops.c
@@ -36,9 +36,11 @@
#include "BLI_path_util.h"
#include "BLI_storage.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -53,7 +55,7 @@
/********************** toolbox operator *********************/
-static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int toolbox_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
bScreen *sc= CTX_wm_screen(C);
SpaceButs *sbuts= CTX_wm_space_buts(C);
@@ -63,7 +65,7 @@ static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
RNA_pointer_create(&sc->id, &RNA_SpaceProperties, sbuts, &ptr);
- pup= uiPupMenuBegin(C, "Align", 0);
+ pup= uiPupMenuBegin(C, "Align", ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemsEnumR(layout, &ptr, "align");
uiPupMenuEnd(C, pup);
@@ -103,16 +105,20 @@ static int file_browse_exec(bContext *C, wmOperator *op)
/* add slash for directories, important for some properties */
if(RNA_property_subtype(fbo->prop) == PROP_DIRPATH) {
+ char name[FILE_MAX];
+
id = fbo->ptr.id.data;
- base = (id && id->lib)? id->lib->filepath: G.sce;
+ base = (id && id->lib)? id->lib->filepath: G.main->name;
BLI_strncpy(path, str, FILE_MAX);
BLI_path_abs(path, base);
-
+
if(BLI_is_dir(path)) {
str = MEM_reallocN(str, strlen(str)+2);
BLI_add_slash(str);
}
+ else
+ BLI_splitdirstring(str, name);
}
RNA_property_string_set(&fbo->ptr, fbo->prop, str);
@@ -123,7 +129,7 @@ static int file_browse_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int file_browse_cancel(bContext *C, wmOperator *op)
+static int file_browse_cancel(bContext *UNUSED(C), wmOperator *op)
{
MEM_freeN(op->customdata);
op->customdata= NULL;
@@ -174,10 +180,12 @@ static int file_browse_invoke(bContext *C, wmOperator *op, wmEvent *event)
RNA_string_set(op->ptr, "filepath", str);
MEM_freeN(str);
- if(RNA_struct_find_property(op->ptr, "relative_path"))
- if(!RNA_property_is_set(op->ptr, "relative_path"))
- RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
-
+ if(RNA_struct_find_property(op->ptr, "relative_path")) {
+ if(!RNA_property_is_set(op->ptr, "relative_path")) {
+ /* annoying exception!, if were dealign with the user prefs, default relative to be off */
+ RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS && (ptr.data != &U));
+ }
+ }
WM_event_add_fileselect(C, op);
return OPERATOR_RUNNING_MODAL;
diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c
index 0b6e752574b..b33231f190c 100644
--- a/source/blender/editors/space_buttons/space_buttons.c
+++ b/source/blender/editors/space_buttons/space_buttons.c
@@ -29,12 +29,12 @@
#include <string.h>
#include <stdio.h>
-
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -55,7 +55,7 @@
/* ******************** default callbacks for buttons space ***************** */
-static SpaceLink *buttons_new(const bContext *C)
+static SpaceLink *buttons_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceButs *sbuts;
@@ -69,7 +69,7 @@ static SpaceLink *buttons_new(const bContext *C)
BLI_addtail(&sbuts->regionbase, ar);
ar->regiontype= RGN_TYPE_HEADER;
- ar->alignment= RGN_ALIGN_BOTTOM;
+ ar->alignment= RGN_ALIGN_TOP;
#if 0
/* context area */
@@ -103,7 +103,7 @@ static void buttons_free(SpaceLink *sl)
}
/* spacetype; init callback */
-static void buttons_init(struct wmWindowManager *wm, ScrArea *sa)
+static void buttons_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa)
{
SpaceButs *sbuts= sa->spacedata.first;
@@ -191,7 +191,7 @@ void buttons_keymap(struct wmKeyConfig *keyconf)
}
/* add handlers, stuff you only do once or on area/region changes */
-static void buttons_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void buttons_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
}
@@ -203,7 +203,7 @@ static void buttons_header_area_draw(const bContext *C, ARegion *ar)
glClear(GL_COLOR_BUFFER_BIT);
/* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(C, &ar->v2d);
+ UI_view2d_view_ortho(&ar->v2d);
buttons_header_buttons(C, ar);
@@ -235,12 +235,8 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
buttons_area_redraw(sa, BCONTEXT_RENDER);
break;
case ND_FRAME:
- buttons_area_redraw(sa, BCONTEXT_RENDER);
- buttons_area_redraw(sa, BCONTEXT_MATERIAL);
- buttons_area_redraw(sa, BCONTEXT_TEXTURE);
- buttons_area_redraw(sa, BCONTEXT_WORLD);
- buttons_area_redraw(sa, BCONTEXT_DATA);
- buttons_area_redraw(sa, BCONTEXT_PHYSICS);
+ /* any buttons area can have animated properties so redraw all */
+ ED_area_tag_redraw(sa);
sbuts->preview= 1;
break;
case ND_OB_ACTIVE:
@@ -263,6 +259,7 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
switch(wmn->data) {
case ND_TRANSFORM:
buttons_area_redraw(sa, BCONTEXT_OBJECT);
+ buttons_area_redraw(sa, BCONTEXT_DATA); /* autotexpace flag */
break;
case ND_POSE:
case ND_BONE_ACTIVE:
@@ -351,6 +348,10 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
break;
}
break;
+ case NC_NODE:
+ if(wmn->action==NA_SELECTED)
+ ED_area_tag_redraw(sa);
+ break;
/* Listener for preview render, when doing an global undo. */
case NC_WINDOW:
ED_area_tag_redraw(sa);
diff --git a/source/blender/editors/space_console/CMakeLists.txt b/source/blender/editors/space_console/CMakeLists.txt
index 59074bcbb79..d1cb716fa84 100644
--- a/source/blender/editors/space_console/CMakeLists.txt
+++ b/source/blender/editors/space_console/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenfont
../../blenkernel
@@ -33,8 +31,16 @@ SET(INC
../../../../intern/guardedalloc
)
-IF(NOT WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(NOT WITH_PYTHON)
+set(SRC
+ console_draw.c
+ console_ops.c
+ space_console.c
+
+ console_intern.h
+)
+
+if(WITH_PYTHON)
+ add_definitions(-DWITH_PYTHON)
+endif()
-BLENDERLIB(bf_editor_space_console "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_console "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_console/Makefile b/source/blender/editors/space_console/Makefile
deleted file mode 100644
index 4ae157507e0..00000000000
--- a/source/blender/editors/space_console/Makefile
+++ /dev/null
@@ -1,53 +0,0 @@
-# -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*-
-# vim: tabstop=8
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2009 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-
-LIBNAME = ed_console
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenfont
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_console/SConscript b/source/blender/editors/space_console/SConscript
index 087090a7740..f246f08d7ac 100644
--- a/source/blender/editors/space_console/SConscript
+++ b/source/blender/editors/space_console/SConscript
@@ -17,7 +17,7 @@ incs = [
'../../blenloader',
]
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
+if env['WITH_BF_PYTHON']:
+ defs.append('WITH_PYTHON')
env.BlenderLib ( 'bf_editors_space_console', sources, incs, defs, libtype=['core'], priority=[95] )
diff --git a/source/blender/editors/space_console/console_draw.c b/source/blender/editors/space_console/console_draw.c
index 74d47ad675d..2d4501e6005 100644
--- a/source/blender/editors/space_console/console_draw.c
+++ b/source/blender/editors/space_console/console_draw.c
@@ -17,11 +17,6 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
* Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
@@ -33,17 +28,18 @@
#include <sys/stat.h>
#include <limits.h>
-
#include "BLF_api.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_space_types.h"
#include "DNA_screen_types.h"
-// #include "BKE_suggestions.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
+
+
+#include "MEM_guardedalloc.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -56,68 +52,26 @@
#include "console_intern.h"
-static int mono= -1; // XXX needs proper storage and change all the BLF_* here!
+#include "../space_info/textview.h"
-static void console_font_begin(SpaceConsole *sc)
-{
- if(mono == -1)
- mono= BLF_load_mem("monospace", (unsigned char*)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size);
-
- BLF_aspect(mono, 1.0);
- BLF_size(mono, sc->lheight-2, 72);
-}
-
-static void console_line_color(unsigned char *fg, int type)
+static void console_line_color(unsigned char fg[3], int type)
{
switch(type) {
case CONSOLE_LINE_OUTPUT:
- UI_GetThemeColor3ubv(TH_CONSOLE_OUTPUT, (char *)fg);
+ UI_GetThemeColor3ubv(TH_CONSOLE_OUTPUT, fg);
break;
case CONSOLE_LINE_INPUT:
- UI_GetThemeColor3ubv(TH_CONSOLE_INPUT, (char *)fg);
+ UI_GetThemeColor3ubv(TH_CONSOLE_INPUT, fg);
break;
case CONSOLE_LINE_INFO:
- UI_GetThemeColor3ubv(TH_CONSOLE_INFO, (char *)fg);
+ UI_GetThemeColor3ubv(TH_CONSOLE_INFO, fg);
break;
case CONSOLE_LINE_ERROR:
- UI_GetThemeColor3ubv(TH_CONSOLE_ERROR, (char *)fg);
+ UI_GetThemeColor3ubv(TH_CONSOLE_ERROR, fg);
break;
}
}
-static void console_report_color(unsigned char *fg, unsigned char *bg, Report *report, int bool)
-{
- /*
- if (type & RPT_ERROR_ALL) { fg[0]=220; fg[1]=0; fg[2]=0; }
- else if (type & RPT_WARNING_ALL) { fg[0]=220; fg[1]=96; fg[2]=96; }
- else if (type & RPT_OPERATOR_ALL) { fg[0]=96; fg[1]=128; fg[2]=255; }
- else if (type & RPT_INFO_ALL) { fg[0]=0; fg[1]=170; fg[2]=0; }
- else if (type & RPT_DEBUG_ALL) { fg[0]=196; fg[1]=196; fg[2]=196; }
- else { fg[0]=196; fg[1]=196; fg[2]=196; }
- */
- if(report->flag & SELECT) {
- fg[0]=255; fg[1]=255; fg[2]=255;
- if(bool) {
- bg[0]=96; bg[1]=128; bg[2]=255;
- }
- else {
- bg[0]=90; bg[1]=122; bg[2]=249;
- }
- }
-
- else {
- fg[0]=0; fg[1]=0; fg[2]=0;
-
- if(bool) {
- bg[0]=120; bg[1]=120; bg[2]=120;
- }
- else {
- bg[0]=114; bg[1]=114; bg[2]=114;
- }
-
- }
-}
-
typedef struct ConsoleDrawContext {
int cwidth;
int lheight;
@@ -126,322 +80,180 @@ typedef struct ConsoleDrawContext {
int ymin, ymax;
int *xy; // [2]
int *sel; // [2]
- int *pos_pick;
+ int *pos_pick; // bottom of view == 0, top of file == combine chars, end of line is lower then start.
int *mval; // [2]
int draw;
} ConsoleDrawContext;
-static void console_draw_sel(int sel[2], int xy[2], int str_len, int cwidth, int console_width, int lheight)
+void console_scrollback_prompt_begin(struct SpaceConsole *sc, ConsoleLine *cl_dummy)
{
- if(sel[0] <= str_len && sel[1] >= 0) {
- int sta = MAX2(sel[0], 0);
- int end = MIN2(sel[1], str_len);
-
- /* highly confusing but draws correctly */
- if(sel[0] < 0 || sel[1] > str_len) {
- if(sel[0] > 0) {
- end= sta;
- sta= 0;
- }
- if (sel[1] <= str_len) {
- sta= end;
- end= str_len;
- }
- }
- /* end confusement */
-
- {
- glEnable(GL_POLYGON_STIPPLE);
- glPolygonStipple(stipple_halftone);
- glEnable( GL_BLEND );
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glColor4ub(255, 255, 255, 96);
- }
- glRecti(xy[0]+(cwidth*sta), xy[1]-2 + lheight, xy[0]+(cwidth*end), xy[1]-2);
- {
- glDisable(GL_POLYGON_STIPPLE);
- glDisable( GL_BLEND );
- }
- }
-
- sel[0] -= str_len + 1;
- sel[1] -= str_len + 1;
+ /* fake the edit line being in the scroll buffer */
+ ConsoleLine *cl= sc->history.last;
+ cl_dummy->type= CONSOLE_LINE_INPUT;
+ cl_dummy->len= cl_dummy->len_alloc= strlen(sc->prompt) + cl->len;
+ cl_dummy->len_alloc= cl_dummy->len + 1;
+ cl_dummy->line= MEM_mallocN(cl_dummy->len_alloc, "cl_dummy");
+ memcpy(cl_dummy->line, sc->prompt, (cl_dummy->len_alloc - cl->len));
+ memcpy(cl_dummy->line + ((cl_dummy->len_alloc - cl->len)) - 1, cl->line, cl->len + 1);
+ BLI_addtail(&sc->scrollback, cl_dummy);
}
-
-
-/* return 0 if the last line is off the screen
- * should be able to use this for any string type */
-
-static int console_draw_string(ConsoleDrawContext *cdc, char *str, int str_len, unsigned char *fg, unsigned char *bg)
+void console_scrollback_prompt_end(struct SpaceConsole *sc, ConsoleLine *cl_dummy)
{
- int rct_ofs= cdc->lheight/4;
- int tot_lines = (str_len/cdc->console_width)+1; /* total number of lines for wrapping */
- int y_next = (str_len > cdc->console_width) ? cdc->xy[1]+cdc->lheight*tot_lines : cdc->xy[1]+cdc->lheight;
-
- /* just advance the height */
- if(cdc->draw==0) {
- if(cdc->pos_pick) {
- if((cdc->mval[1] != INT_MAX) && cdc->xy[1] <= cdc->mval[1]) {
- if((cdc->xy[1]+cdc->lheight >= cdc->mval[1])) {
- int ofs = (int)floor(((float)cdc->mval[0] / (float)cdc->cwidth));
- *cdc->pos_pick += MIN2(ofs, str_len);
- } else
- *cdc->pos_pick += str_len + 1;
- }
+ MEM_freeN(cl_dummy->line);
+ BLI_remlink(&sc->scrollback, cl_dummy);
+}
- }
+#define CONSOLE_DRAW_MARGIN 4
+#define CONSOLE_DRAW_SCROLL 16
- cdc->xy[1]= y_next;
- return 1;
- }
- else if (y_next-cdc->lheight < cdc->ymin) {
- /* have not reached the drawable area so don't break */
- cdc->xy[1]= y_next;
-
- /* adjust selection even if not drawing */
- if(cdc->sel[0] != cdc->sel[1]) {
- cdc->sel[0] -= str_len + 1;
- cdc->sel[1] -= str_len + 1;
- }
- return 1;
- }
- if(str_len > cdc->console_width) { /* wrap? */
- char *line_stride= str + ((tot_lines-1) * cdc->console_width); /* advance to the last line and draw it first */
- char eol; /* baclup the end of wrapping */
-
- if(bg) {
- glColor3ub(bg[0], bg[1], bg[2]);
- glRecti(0, cdc->xy[1]-rct_ofs, cdc->winx, (cdc->xy[1]+(cdc->lheight*tot_lines))+rct_ofs);
- }
+/* console textview callbacks */
+static int console_textview_begin(TextViewContext *tvc)
+{
+ SpaceConsole *sc= (SpaceConsole *)tvc->arg1;
+ tvc->lheight= sc->lheight;
+ tvc->sel_start= sc->sel_start;
+ tvc->sel_end= sc->sel_end;
+
+ /* iterator */
+ tvc->iter= sc->scrollback.last;
+
+ return (tvc->iter != NULL);
+}
- glColor3ub(fg[0], fg[1], fg[2]);
+static void console_textview_end(TextViewContext *tvc)
+{
+ SpaceConsole *sc= (SpaceConsole *)tvc->arg1;
+ (void)sc;
+
+}
- /* last part needs no clipping */
- BLF_position(mono, cdc->xy[0], cdc->xy[1], 0);
- BLF_draw(mono, line_stride);
+static int console_textview_step(TextViewContext *tvc)
+{
+ return ((tvc->iter= (void *)((Link *)tvc->iter)->prev) != NULL);
+}
- if(cdc->sel[0] != cdc->sel[1]) {
- cdc->sel[0] += str_len - (cdc->console_width % str_len);
- cdc->sel[1] += str_len - (cdc->console_width % str_len);
- console_draw_sel(cdc->sel, cdc->xy, cdc->console_width % str_len, cdc->cwidth, cdc->console_width, cdc->lheight);
- glColor3ub(fg[0], fg[1], fg[2]);
- }
+static int console_textview_line_get(struct TextViewContext *tvc, const char **line, int *len)
+{
+ ConsoleLine *cl= (ConsoleLine *)tvc->iter;
+ *line= cl->line;
+ *len= cl->len;
- cdc->xy[1] += cdc->lheight;
-
- line_stride -= cdc->console_width;
-
- for(; line_stride >= str; line_stride -= cdc->console_width) {
- eol = line_stride[cdc->console_width];
- line_stride[cdc->console_width]= '\0';
-
- BLF_position(mono, cdc->xy[0], cdc->xy[1], 0);
- BLF_draw(mono, line_stride);
-
- if(cdc->sel[0] != cdc->sel[1]) {
- console_draw_sel(cdc->sel, cdc->xy, cdc->console_width, cdc->cwidth, cdc->console_width, cdc->lheight);
- glColor3ub(fg[0], fg[1], fg[2]);
- }
-
- cdc->xy[1] += cdc->lheight;
-
- line_stride[cdc->console_width] = eol; /* restore */
-
- /* check if were out of view bounds */
- if(cdc->xy[1] > cdc->ymax)
- return 0;
- }
- }
- else { /* simple, no wrap */
+ return 1;
+}
- if(bg) {
- glColor3ub(bg[0], bg[1], bg[2]);
- glRecti(0, cdc->xy[1]-rct_ofs, cdc->winx, cdc->xy[1]+cdc->lheight-rct_ofs);
+static int console_textview_line_color(struct TextViewContext *tvc, unsigned char fg[3], unsigned char UNUSED(bg[3]))
+{
+ ConsoleLine *cl_iter= (ConsoleLine *)tvc->iter;
+
+ /* annoying hack, to draw the prompt */
+ if(tvc->iter_index == 0) {
+ const SpaceConsole *sc= (SpaceConsole *)tvc->arg1;
+ const ConsoleLine *cl= (ConsoleLine *)sc->history.last;
+ const int prompt_len= strlen(sc->prompt);
+ const int cursor_loc= cl->cursor + prompt_len;
+ int xy[2] = {CONSOLE_DRAW_MARGIN, CONSOLE_DRAW_MARGIN};
+ int pen[2];
+ xy[1] += tvc->lheight/6;
+
+ /* account for wrapping */
+ if(cl->len < tvc->console_width) {
+ /* simple case, no wrapping */
+ pen[0]= tvc->cwidth * cursor_loc;
+ pen[1]= -2;
+ }
+ else {
+ /* wrap */
+ pen[0]= tvc->cwidth * (cursor_loc % tvc->console_width);
+ pen[1]= -2 + (((cl->len / tvc->console_width) - (cursor_loc / tvc->console_width)) * tvc->lheight);
}
- glColor3ub(fg[0], fg[1], fg[2]);
-
- BLF_position(mono, cdc->xy[0], cdc->xy[1], 0);
- BLF_draw(mono, str);
-
- if(cdc->sel[0] != cdc->sel[1])
- console_draw_sel(cdc->sel, cdc->xy, str_len, cdc->cwidth, cdc->console_width, cdc->lheight);
-
- cdc->xy[1] += cdc->lheight;
+ /* cursor */
+ UI_GetThemeColor3ubv(TH_CONSOLE_CURSOR, fg);
+ glColor3ubv(fg);
- if(cdc->xy[1] > cdc->ymax)
- return 0;
+ glRecti( (xy[0] + pen[0]) - 1,
+ (xy[1] + pen[1]),
+ (xy[0] + pen[0]) + 1,
+ (xy[1] + pen[1] + tvc->lheight)
+ );
}
- return 1;
+ console_line_color(fg, cl_iter->type);
+
+ return TVC_LINE_FG;
}
-#define CONSOLE_DRAW_MARGIN 4
-#define CONSOLE_DRAW_SCROLL 16
-static int console_text_main__internal(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports, int draw, int mval[2], void **mouse_pick, int *pos_pick)
+static int console_textview_main__internal(struct SpaceConsole *sc, struct ARegion *ar, int draw, int mval[2], void **mouse_pick, int *pos_pick)
{
+ ConsoleLine cl_dummy= {0};
+ int ret= 0;
+
View2D *v2d= &ar->v2d;
- ConsoleLine *cl= sc->history.last;
- ConsoleDrawContext cdc;
-
- int x_orig=CONSOLE_DRAW_MARGIN, y_orig=CONSOLE_DRAW_MARGIN;
- int xy[2], y_prev;
- int cwidth;
- int console_width; /* number of characters that fit into the width of the console (fixed width) */
- int sel[2]= {-1, -1}; /* defaults disabled */
- unsigned char fg[3];
+ TextViewContext tvc= {0};
- console_font_begin(sc);
- cwidth = BLF_fixed_width(mono);
-
- console_width= (ar->winx - (CONSOLE_DRAW_SCROLL + CONSOLE_DRAW_MARGIN*2) )/cwidth;
- if (console_width < 8) console_width= 8;
-
- xy[0]= x_orig; xy[1]= y_orig;
-
- if(mval[1] != INT_MAX)
- mval[1] += (v2d->cur.ymin + CONSOLE_DRAW_MARGIN);
-
- if(pos_pick)
- *pos_pick = 0;
-
- /* constants for the sequencer context */
- cdc.cwidth= cwidth;
- cdc.lheight= sc->lheight;
- cdc.console_width= console_width;
- cdc.winx= ar->winx-(CONSOLE_DRAW_MARGIN+CONSOLE_DRAW_SCROLL);
- cdc.ymin= v2d->cur.ymin;
- cdc.ymax= v2d->cur.ymax;
- cdc.xy= xy;
- cdc.sel= sel;
- cdc.pos_pick= pos_pick;
- cdc.mval= mval;
- cdc.draw= draw;
-
- if(sc->type==CONSOLE_TYPE_PYTHON) {
- int prompt_len;
-
- if(sc->sel_start != sc->sel_end) {
- sel[0]= sc->sel_start;
- sel[1]= sc->sel_end;
- // printf("%d %d\n", sel[0], sel[1]);
- }
-
- /* text */
- if(draw) {
- prompt_len= strlen(sc->prompt);
- console_line_color(fg, CONSOLE_LINE_INPUT);
- glColor3ub(fg[0], fg[1], fg[2]);
-
- /* command line */
- if(prompt_len) {
- BLF_position(mono, xy[0], xy[1], 0); xy[0] += cwidth * prompt_len;
- BLF_draw(mono, sc->prompt);
- }
- BLF_position(mono, xy[0], xy[1], 0);
- BLF_draw(mono, cl->line);
-
- /* cursor */
- UI_GetThemeColor3ubv(TH_CONSOLE_CURSOR, (char *)fg);
- glColor3ub(fg[0], fg[1], fg[2]);
- glRecti(xy[0]+(cwidth*cl->cursor) -1, xy[1]-2, xy[0]+(cwidth*cl->cursor) +1, xy[1]+sc->lheight-2);
-
- xy[0]= x_orig; /* remove prompt offset */
- }
-
- xy[1] += sc->lheight;
-
- for(cl= sc->scrollback.last; cl; cl= cl->prev) {
- y_prev= xy[1];
-
- if(draw)
- console_line_color(fg, cl->type);
-
- if(!console_draw_string(&cdc, cl->line, cl->len, fg, NULL)) {
- /* when drawing, if we pass v2d->cur.ymax, then quit */
- if(draw) {
- break; /* past the y limits */
- }
- }
-
- if((mval[1] != INT_MAX) && (mval[1] >= y_prev && mval[1] <= xy[1])) {
- *mouse_pick= (void *)cl;
- break;
- }
- }
- }
- else {
- Report *report;
- int report_mask= 0;
- int bool= 0;
- unsigned char bg[3];
-
- if(draw) {
- glClearColor(120.0/255.0, 120.0/255.0, 120.0/255.0, 1.0);
- glClear(GL_COLOR_BUFFER_BIT);
- }
+ tvc.begin= console_textview_begin;
+ tvc.end= console_textview_end;
- /* convert our display toggles into a flag compatible with BKE_report flags */
- report_mask= console_report_mask(sc);
-
- for(report=reports->list.last; report; report=report->prev) {
-
- if(report->type & report_mask) {
- y_prev= xy[1];
-
- if(draw)
- console_report_color(fg, bg, report, bool);
-
- if(!console_draw_string(&cdc, report->message, report->len, fg, bg)) {
- /* when drawing, if we pass v2d->cur.ymax, then quit */
- if(draw) {
- break; /* past the y limits */
- }
- }
- if((mval[1] != INT_MAX) && (mval[1] >= y_prev && mval[1] <= xy[1])) {
- *mouse_pick= (void *)report;
- break;
- }
-
- bool = !(bool);
- }
- }
- }
- xy[1] += sc->lheight*2;
+ tvc.step= console_textview_step;
+ tvc.line_get= console_textview_line_get;
+ tvc.line_color= console_textview_line_color;
-
- return xy[1]-y_orig;
+ tvc.arg1= sc;
+ tvc.arg2= NULL;
+
+ /* view */
+ tvc.sel_start= sc->sel_start;
+ tvc.sel_end= sc->sel_end;
+ tvc.lheight= sc->lheight;
+ tvc.ymin= v2d->cur.ymin;
+ tvc.ymax= v2d->cur.ymax;
+ tvc.winx= ar->winx;
+
+ console_scrollback_prompt_begin(sc, &cl_dummy);
+ ret= textview_draw(&tvc, draw, mval, mouse_pick, pos_pick);
+ console_scrollback_prompt_end(sc, &cl_dummy);
+
+ return ret;
}
-void console_text_main(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports)
+
+void console_textview_main(struct SpaceConsole *sc, struct ARegion *ar)
{
int mval[2] = {INT_MAX, INT_MAX};
- console_text_main__internal(sc, ar, reports, 1, mval, NULL, NULL);
+ console_textview_main__internal(sc, ar, 1, mval, NULL, NULL);
}
-int console_text_height(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports)
+int console_textview_height(struct SpaceConsole *sc, struct ARegion *ar)
{
int mval[2] = {INT_MAX, INT_MAX};
- return console_text_main__internal(sc, ar, reports, 0, mval, NULL, NULL);
+ return console_textview_main__internal(sc, ar, 0, mval, NULL, NULL);
}
-void *console_text_pick(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports, int mouse_y)
+void *console_text_pick(struct SpaceConsole *sc, struct ARegion *ar, int mouse_y)
{
- int mval[2] = {0, mouse_y};
void *mouse_pick= NULL;
- console_text_main__internal(sc, ar, reports, 0, mval, &mouse_pick, NULL);
+ int mval[2];
+
+ mval[0]= 0;
+ mval[1]= mouse_y;
+
+ console_textview_main__internal(sc, ar, 0, mval, &mouse_pick, NULL);
return (void *)mouse_pick;
}
-// XXX - breaks with line wrap
-int console_char_pick(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports, int mval[2])
+int console_char_pick(struct SpaceConsole *sc, struct ARegion *ar, int mval[2])
{
int pos_pick= 0;
void *mouse_pick= NULL;
- console_text_main__internal(sc, ar, reports, 0, mval, &mouse_pick, &pos_pick);
+ int mval_clamp[2];
+
+ mval_clamp[0]= CLAMPIS(mval[0], CONSOLE_DRAW_MARGIN, ar->winx-(CONSOLE_DRAW_SCROLL + CONSOLE_DRAW_MARGIN));
+ mval_clamp[1]= CLAMPIS(mval[1], CONSOLE_DRAW_MARGIN, ar->winy-CONSOLE_DRAW_MARGIN);
+
+ console_textview_main__internal(sc, ar, 0, mval_clamp, &mouse_pick, &pos_pick);
return pos_pick;
}
diff --git a/source/blender/editors/space_console/console_intern.h b/source/blender/editors/space_console/console_intern.h
index c74d39f25e3..72eac14c2ca 100644
--- a/source/blender/editors/space_console/console_intern.h
+++ b/source/blender/editors/space_console/console_intern.h
@@ -17,10 +17,6 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2008 Blender Foundation.
- * All rights reserved.
- *
- *
* Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
@@ -36,16 +32,19 @@ struct ReportList;
struct bContext;
/* console_draw.c */
-void console_text_main(struct SpaceConsole *sc, struct ARegion *ar, struct ReportList *reports);
-int console_text_height(struct SpaceConsole *sc, struct ARegion *ar, struct ReportList *reports); /* needed to calculate the scrollbar */
-void *console_text_pick(struct SpaceConsole *sc, struct ARegion *ar, struct ReportList *reports, int mouse_y); /* needed for selection */
-int console_char_pick(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports, int mval[2]);
+void console_textview_main(struct SpaceConsole *sc, struct ARegion *ar);
+int console_textview_height(struct SpaceConsole *sc, struct ARegion *ar); /* needed to calculate the scrollbar */
+void *console_text_pick(struct SpaceConsole *sc, struct ARegion *ar, int mouse_y); /* needed for selection */
+int console_char_pick(struct SpaceConsole *sc, struct ARegion *ar, int mval[2]);
+
+void console_scrollback_prompt_begin(struct SpaceConsole *sc, ConsoleLine *cl_dummy);
+void console_scrollback_prompt_end(struct SpaceConsole *sc, ConsoleLine *cl_dummy);
/* console_ops.c */
void console_history_free(SpaceConsole *sc, ConsoleLine *cl);
void console_scrollback_free(SpaceConsole *sc, ConsoleLine *cl);
-ConsoleLine *console_history_add_str(const struct bContext *C, char *str, int own);
-ConsoleLine *console_scrollback_add_str(const struct bContext *C, char *str, int own);
+ConsoleLine *console_history_add_str(struct SpaceConsole *sc, char *str, int own);
+ConsoleLine *console_scrollback_add_str(struct SpaceConsole *sc, char *str, int own);
ConsoleLine *console_history_verify(const struct bContext *C);
@@ -65,19 +64,6 @@ void CONSOLE_OT_copy(struct wmOperatorType *ot);
void CONSOLE_OT_paste(struct wmOperatorType *ot);
void CONSOLE_OT_select_set(struct wmOperatorType *ot);
-
-
-/* console_report.c */
-void CONSOLE_OT_select_pick(struct wmOperatorType *ot); /* report selection */
-void CONSOLE_OT_select_all_toggle(struct wmOperatorType *ot);
-void CONSOLE_OT_select_border(struct wmOperatorType *ot);
-
-void CONSOLE_OT_report_replay(struct wmOperatorType *ot);
-void CONSOLE_OT_report_delete(struct wmOperatorType *ot);
-void CONSOLE_OT_report_copy(struct wmOperatorType *ot);
-
-
-
enum { LINE_BEGIN, LINE_END, PREV_CHAR, NEXT_CHAR, PREV_WORD, NEXT_WORD };
enum { DEL_ALL, DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_SELECTION, DEL_NEXT_SEL, DEL_PREV_SEL };
diff --git a/source/blender/editors/space_console/console_ops.c b/source/blender/editors/space_console/console_ops.c
index 9a53531ba73..05c3561d25e 100644
--- a/source/blender/editors/space_console/console_ops.c
+++ b/source/blender/editors/space_console/console_ops.c
@@ -17,11 +17,6 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
* Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
@@ -38,6 +33,7 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_text.h" /* only for character utility funcs */
@@ -45,6 +41,7 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "UI_view2d.h"
#include "ED_screen.h"
#include "RNA_access.h"
@@ -52,6 +49,19 @@
#include "console_intern.h"
+static void console_textview_update_rect(SpaceConsole *sc, ARegion *ar)
+{
+ View2D *v2d= &ar->v2d;
+
+ UI_view2d_totRect_set(v2d, ar->winx-1, console_textview_height(sc, ar));
+}
+
+static void console_select_offset(SpaceConsole *sc, const int offset)
+{
+ sc->sel_start += offset;
+ sc->sel_end += offset;
+}
+
void console_history_free(SpaceConsole *sc, ConsoleLine *cl)
{
BLI_remlink(&sc->history, cl);
@@ -188,7 +198,7 @@ static ConsoleLine *console_scrollback_add(const bContext *C, ConsoleLine *from)
}
#endif
-static ConsoleLine *console_lb_add_str__internal(ListBase *lb, const bContext *C, char *str, int own)
+static ConsoleLine *console_lb_add_str__internal(ListBase *lb, char *str, int own)
{
ConsoleLine *ci= MEM_callocN(sizeof(ConsoleLine), "ConsoleLine Add");
if(own) ci->line= str;
@@ -199,13 +209,15 @@ static ConsoleLine *console_lb_add_str__internal(ListBase *lb, const bContext *C
BLI_addtail(lb, ci);
return ci;
}
-ConsoleLine *console_history_add_str(const bContext *C, char *str, int own)
+ConsoleLine *console_history_add_str(SpaceConsole *sc, char *str, int own)
{
- return console_lb_add_str__internal(&CTX_wm_space_console(C)->history, C, str, own);
+ return console_lb_add_str__internal(&sc->history, str, own);
}
-ConsoleLine *console_scrollback_add_str(const bContext *C, char *str, int own)
+ConsoleLine *console_scrollback_add_str(SpaceConsole *sc, char *str, int own)
{
- return console_lb_add_str__internal(&CTX_wm_space_console(C)->scrollback, C, str, own);
+ ConsoleLine *ci= console_lb_add_str__internal(&sc->scrollback, str, own);
+ console_select_offset(sc, ci->len + 1);
+ return ci;
}
ConsoleLine *console_history_verify(const bContext *C)
@@ -256,22 +268,6 @@ static int console_line_insert(ConsoleLine *ci, char *str)
return len;
}
-static int console_edit_poll(bContext *C)
-{
- SpaceConsole *sc= CTX_wm_space_console(C);
-
- if(!sc || sc->type != CONSOLE_TYPE_PYTHON)
- return 0;
-
- return 1;
-}
-#if 0
-static int console_poll(bContext *C)
-{
- return (CTX_wm_space_console(C) != NULL);
-}
-#endif
-
/* static funcs for text editing */
/* similar to the text editor, with some not used. keep compatible */
@@ -353,25 +349,42 @@ void CONSOLE_OT_move(wmOperatorType *ot)
/* api callbacks */
ot->exec= move_exec;
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
/* properties */
RNA_def_enum(ot->srna, "type", move_type_items, LINE_BEGIN, "Type", "Where to move cursor to.");
}
-
+#define TAB_LENGTH 4
static int insert_exec(bContext *C, wmOperator *op)
{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+ ARegion *ar= CTX_wm_region(C);
ConsoleLine *ci= console_history_verify(C);
char *str= RNA_string_get_alloc(op->ptr, "text", NULL, 0);
-
- int len= console_line_insert(ci, str);
+ int len;
+
+ // XXX, alligned tab key hack
+ if(str[0]=='\t' && str[1]=='\0') {
+ len= TAB_LENGTH - (ci->cursor % TAB_LENGTH);
+ MEM_freeN(str);
+ str= MEM_mallocN(len + 1, "insert_exec");
+ memset(str, ' ', len);
+ str[len]= '\0';
+ }
+
+ len= console_line_insert(ci, str);
MEM_freeN(str);
- if(len==0)
+ if(len==0) {
return OPERATOR_CANCELLED;
-
+ }
+ else {
+ console_select_offset(sc, len);
+ }
+
+ console_textview_update_rect(sc, ar);
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
@@ -379,9 +392,19 @@ static int insert_exec(bContext *C, wmOperator *op)
static int insert_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- if(!RNA_property_is_set(op->ptr, "text")) {
- char str[2] = {event->ascii, '\0'};
- RNA_string_set(op->ptr, "text", str);
+ // if(!RNA_property_is_set(op->ptr, "text")) { /* always set from keymap XXX */
+ if(!RNA_string_length(op->ptr, "text")) {
+ /* if alt/ctrl/super are pressed pass through */
+ if(event->ctrl || event->oskey) {
+ return OPERATOR_PASS_THROUGH;
+ }
+ else {
+ char str[2];
+ str[0]= event->ascii;
+ str[1]= '\0';
+
+ RNA_string_set(op->ptr, "text", str);
+ }
}
return insert_exec(C, op);
}
@@ -396,7 +419,7 @@ void CONSOLE_OT_insert(wmOperatorType *ot)
/* api callbacks */
ot->exec= insert_exec;
ot->invoke= insert_invoke;
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
/* properties */
RNA_def_string(ot->srna, "text", "", 0, "Text", "Text to insert at the cursor position.");
@@ -412,13 +435,12 @@ static EnumPropertyItem delete_type_items[]= {
static int delete_exec(bContext *C, wmOperator *op)
{
-
+ SpaceConsole *sc= CTX_wm_space_console(C);
+ ARegion *ar= CTX_wm_region(C);
ConsoleLine *ci= console_history_verify(C);
-
-
- int done = 0;
- int type= RNA_enum_get(op->ptr, "type");
+ const short type= RNA_enum_get(op->ptr, "type");
+ int done = 0;
if(ci->len==0) {
return OPERATOR_CANCELLED;
@@ -442,9 +464,14 @@ static int delete_exec(bContext *C, wmOperator *op)
break;
}
- if(!done)
+ if(!done) {
return OPERATOR_CANCELLED;
-
+ }
+ else {
+ console_select_offset(sc, -1);
+ }
+
+ console_textview_update_rect(sc, ar);
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
@@ -460,7 +487,7 @@ void CONSOLE_OT_delete(wmOperatorType *ot)
/* api callbacks */
ot->exec= delete_exec;
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
/* properties */
RNA_def_enum(ot->srna, "type", delete_type_items, DEL_NEXT_CHAR, "Type", "Which part of the text to delete.");
@@ -471,6 +498,7 @@ void CONSOLE_OT_delete(wmOperatorType *ot)
static int clear_exec(bContext *C, wmOperator *op)
{
SpaceConsole *sc= CTX_wm_space_console(C);
+ ARegion *ar= CTX_wm_region(C);
short scrollback= RNA_boolean_get(op->ptr, "scrollback");
short history= RNA_boolean_get(op->ptr, "history");
@@ -486,9 +514,10 @@ static int clear_exec(bContext *C, wmOperator *op)
while(sc->history.first)
console_history_free(sc, sc->history.first);
}
-
+
+ console_textview_update_rect(sc, ar);
ED_area_tag_redraw(CTX_wm_area(C));
-
+
return OPERATOR_FINISHED;
}
@@ -501,7 +530,7 @@ void CONSOLE_OT_clear(wmOperatorType *ot)
/* api callbacks */
ot->exec= clear_exec;
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
/* properties */
RNA_def_boolean(ot->srna, "scrollback", 1, "Scrollback", "Clear the scrollback history");
@@ -514,9 +543,11 @@ void CONSOLE_OT_clear(wmOperatorType *ot)
static int history_cycle_exec(bContext *C, wmOperator *op)
{
SpaceConsole *sc= CTX_wm_space_console(C);
+ ARegion *ar= CTX_wm_region(C);
+
ConsoleLine *ci= console_history_verify(C); /* TODO - stupid, just prevernts crashes when no command line */
-
short reverse= RNA_boolean_get(op->ptr, "reverse"); /* assumes down, reverse is up */
+ int prev_len= ci->len;
/* keep a copy of the line above so when history is cycled
* this is the only function that needs to know about the double-up */
@@ -545,7 +576,12 @@ static int history_cycle_exec(bContext *C, wmOperator *op)
console_history_add(C, (ConsoleLine *)sc->history.last);
}
+
+ ci= sc->history.last;
+ console_select_offset(sc, ci->len - prev_len);
+ /* could be wrapped so update scroll rect */
+ console_textview_update_rect(sc, ar);
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
@@ -560,7 +596,7 @@ void CONSOLE_OT_history_cycle(wmOperatorType *ot)
/* api callbacks */
ot->exec= history_cycle_exec;
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
/* properties */
RNA_def_boolean(ot->srna, "reverse", 0, "Reverse", "reverse cycle history");
@@ -570,13 +606,15 @@ void CONSOLE_OT_history_cycle(wmOperatorType *ot)
/* the python exec operator uses this */
static int history_append_exec(bContext *C, wmOperator *op)
{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+ ScrArea *sa= CTX_wm_area(C);
ConsoleLine *ci= console_history_verify(C);
char *str= RNA_string_get_alloc(op->ptr, "text", NULL, 0); /* own this text in the new line, dont free */
int cursor= RNA_int_get(op->ptr, "current_character");
short rem_dupes= RNA_boolean_get(op->ptr, "remove_duplicates");
+ int prev_len= ci->len;
if(rem_dupes) {
- SpaceConsole *sc= CTX_wm_space_console(C);
ConsoleLine *cl;
while((cl= console_history_find(sc, ci->line, ci)))
@@ -588,11 +626,12 @@ static int history_append_exec(bContext *C, wmOperator *op)
}
}
- ci= console_history_add_str(C, str, 1); /* own the string */
+ ci= console_history_add_str(sc, str, 1); /* own the string */
+ console_select_offset(sc, ci->len - prev_len);
console_line_cursor_set(ci, cursor);
-
- ED_area_tag_redraw(CTX_wm_area(C));
-
+
+ ED_area_tag_redraw(sa);
+
return OPERATOR_FINISHED;
}
@@ -605,7 +644,7 @@ void CONSOLE_OT_history_append(wmOperatorType *ot)
/* api callbacks */
ot->exec= history_append_exec;
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
/* properties */
RNA_def_string(ot->srna, "text", "", 0, "Text", "Text to insert at the cursor position.");
@@ -618,16 +657,20 @@ void CONSOLE_OT_history_append(wmOperatorType *ot)
static int scrollback_append_exec(bContext *C, wmOperator *op)
{
SpaceConsole *sc= CTX_wm_space_console(C);
- ConsoleLine *ci= console_history_verify(C);
+ ARegion *ar= CTX_wm_region(C);
+ ConsoleLine *ci;
char *str= RNA_string_get_alloc(op->ptr, "text", NULL, 0); /* own this text in the new line, dont free */
int type= RNA_enum_get(op->ptr, "type");
+
+ console_history_verify(C);
- ci= console_scrollback_add_str(C, str, 1); /* own the string */
+ ci= console_scrollback_add_str(sc, str, 1); /* own the string */
ci->type= type;
console_scrollback_limit(sc);
-
+
+ console_textview_update_rect(sc, ar);
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
@@ -650,7 +693,7 @@ void CONSOLE_OT_scrollback_append(wmOperatorType *ot)
/* api callbacks */
ot->exec= scrollback_append_exec;
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
/* properties */
RNA_def_string(ot->srna, "text", "", 0, "Text", "Text to insert at the cursor position.");
@@ -658,10 +701,9 @@ void CONSOLE_OT_scrollback_append(wmOperatorType *ot)
}
-static int copy_exec(bContext *C, wmOperator *op)
+static int copy_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceConsole *sc= CTX_wm_space_console(C);
- int buf_len;
DynStr *buf_dyn= BLI_dynstr_new();
char *buf_str;
@@ -670,6 +712,8 @@ static int copy_exec(bContext *C, wmOperator *op)
int sel[2];
int offset= 0;
+ ConsoleLine cl_dummy= {0};
+
#if 0
/* copy whole file */
for(cl= sc->scrollback.first; cl; cl= cl->next) {
@@ -681,43 +725,25 @@ static int copy_exec(bContext *C, wmOperator *op)
if(sc->sel_start == sc->sel_end)
return OPERATOR_CANCELLED;
+ console_scrollback_prompt_begin(sc, &cl_dummy);
for(cl= sc->scrollback.first; cl; cl= cl->next) {
offset += cl->len + 1;
}
- if(offset==0)
+ if(offset==0) {
+ console_scrollback_prompt_end(sc, &cl_dummy);
return OPERATOR_CANCELLED;
-
+ }
offset -= 1;
sel[0]= offset - sc->sel_end;
sel[1]= offset - sc->sel_start;
for(cl= sc->scrollback.first; cl; cl= cl->next) {
-
- int sta= MAX2(0, sel[0]);
- int end= MIN2(cl->len, sel[1]);
-
if(sel[0] <= cl->len && sel[1] >= 0) {
- int str_len= cl->len;
-
- /* highly confusing but draws correctly */
- if(sel[0] < 0 || sel[1] > str_len) {
- if(sel[0] > 0) {
- end= sta;
- sta= 0;
- }
- if (sel[1] <= str_len) {
- sta= end;
- end= str_len;
- }
- }
- /* end confusement */
-
- SWAP(int, sta, end);
- end= cl->len - end;
- sta= cl->len - sta;
+ int sta= MAX2(sel[0], 0);
+ int end= MIN2(sel[1], cl->len);
if(BLI_dynstr_get_len(buf_dyn))
BLI_dynstr_append(buf_dyn, "\n");
@@ -730,11 +756,14 @@ static int copy_exec(bContext *C, wmOperator *op)
}
buf_str= BLI_dynstr_get_cstring(buf_dyn);
- buf_len= BLI_dynstr_get_len(buf_dyn);
+
BLI_dynstr_free(buf_dyn);
WM_clipboard_text_set(buf_str, 0);
MEM_freeN(buf_str);
+
+ console_scrollback_prompt_end(sc, &cl_dummy);
+
return OPERATOR_FINISHED;
}
@@ -746,14 +775,16 @@ void CONSOLE_OT_copy(wmOperatorType *ot)
ot->idname= "CONSOLE_OT_copy";
/* api callbacks */
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
ot->exec= copy_exec;
/* properties */
}
-static int paste_exec(bContext *C, wmOperator *op)
+static int paste_exec(bContext *C, wmOperator *UNUSED(op))
{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+ ARegion *ar= CTX_wm_region(C);
ConsoleLine *ci= console_history_verify(C);
char *buf_str= WM_clipboard_text_get(0);
@@ -762,7 +793,6 @@ static int paste_exec(bContext *C, wmOperator *op)
if(buf_str==NULL)
return OPERATOR_CANCELLED;
- buf_next= buf_str;
buf_step= buf_str;
while((buf_next=buf_step) && buf_next[0] != '\0') {
@@ -777,11 +807,12 @@ static int paste_exec(bContext *C, wmOperator *op)
ci= console_history_verify(C);
}
- console_line_insert(ci, buf_next);
+ console_select_offset(sc, console_line_insert(ci, buf_next));
}
MEM_freeN(buf_str);
+ console_textview_update_rect(sc, ar);
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
@@ -795,7 +826,7 @@ void CONSOLE_OT_paste(wmOperatorType *ot)
ot->idname= "CONSOLE_OT_paste";
/* api callbacks */
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
ot->exec= paste_exec;
/* properties */
@@ -806,10 +837,11 @@ typedef struct SetConsoleCursor {
int sel_init;
} SetConsoleCursor;
-static void set_cursor_to_pos(SpaceConsole *sc, ARegion *ar, SetConsoleCursor *scu, int mval[2], int sel)
+// TODO, cursor placement without selection
+static void set_cursor_to_pos(SpaceConsole *sc, ARegion *ar, SetConsoleCursor *scu, int mval[2], int UNUSED(sel))
{
int pos;
- pos= console_char_pick(sc, ar, NULL, mval);
+ pos= console_char_pick(sc, ar, mval);
if(scu->sel_init == INT_MAX) {
scu->sel_init= pos;
@@ -835,13 +867,24 @@ static void console_modal_select_apply(bContext *C, wmOperator *op, wmEvent *eve
SpaceConsole *sc= CTX_wm_space_console(C);
ARegion *ar= CTX_wm_region(C);
SetConsoleCursor *scu= op->customdata;
- int mval[2] = {event->mval[0], event->mval[1]};
+ int mval[2];
+ int sel_prev[2];
+
+ mval[0]= event->mval[0];
+ mval[1]= event->mval[1];
+ sel_prev[0]= sc->sel_start;
+ sel_prev[1]= sc->sel_end;
+
set_cursor_to_pos(sc, ar, scu, mval, TRUE);
- ED_area_tag_redraw(CTX_wm_area(C));
+
+ /* only redraw if the selection changed */
+ if(sel_prev[0] != sc->sel_start || sel_prev[1] != sc->sel_end) {
+ ED_area_tag_redraw(CTX_wm_area(C));
+ }
}
-static void set_cursor_exit(bContext *C, wmOperator *op)
+static void set_cursor_exit(bContext *UNUSED(C), wmOperator *op)
{
// SpaceConsole *sc= CTX_wm_space_console(C);
SetConsoleCursor *scu= op->customdata;
@@ -910,5 +953,5 @@ void CONSOLE_OT_select_set(wmOperatorType *ot)
ot->invoke= console_modal_select_invoke;
ot->modal= console_modal_select;
ot->cancel= console_modal_select_cancel;
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
}
diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c
index 4ee69bbd809..c44d13aa058 100644
--- a/source/blender/editors/space_console/space_console.c
+++ b/source/blender/editors/space_console/space_console.c
@@ -16,10 +16,6 @@
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2008 Blender Foundation.
- * All rights reserved.
- *
*
* Contributor(s): Campbell Barton
*
@@ -37,6 +33,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -46,7 +43,6 @@
#include "BIF_gl.h"
-
#include "RNA_access.h"
#include "WM_api.h"
@@ -57,17 +53,9 @@
#include "console_intern.h" // own include
-static void console_update_rect(const bContext *C, ARegion *ar)
-{
- SpaceConsole *sc= CTX_wm_space_console(C);
- View2D *v2d= &ar->v2d;
-
- UI_view2d_totRect_set(v2d, ar->winx-1, console_text_height(sc, ar, CTX_wm_reports(C)));
-}
-
/* ******************** default callbacks for console space ***************** */
-static SpaceLink *console_new(const bContext *C)
+static SpaceLink *console_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceConsole *sconsole;
@@ -76,8 +64,6 @@ static SpaceLink *console_new(const bContext *C)
sconsole->spacetype= SPACE_CONSOLE;
sconsole->lheight= 14;
- sconsole->type= CONSOLE_TYPE_PYTHON;
- sconsole->rpt_mask= CONSOLE_RPT_OP; /* ? - not sure whats a good default here?*/
/* header */
ar= MEM_callocN(sizeof(ARegion), "header for console");
@@ -93,7 +79,7 @@ static SpaceLink *console_new(const bContext *C)
BLI_addtail(&sconsole->regionbase, ar);
ar->regiontype= RGN_TYPE_WINDOW;
-
+ /* keep in sync with info */
ar->v2d.scroll |= (V2D_SCROLL_RIGHT);
ar->v2d.align |= V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_NEG_Y; /* align bottom left */
ar->v2d.keepofs |= V2D_LOCKOFS_X;
@@ -121,7 +107,7 @@ static void console_free(SpaceLink *sl)
/* spacetype; init callback */
-static void console_init(struct wmWindowManager *wm, ScrArea *sa)
+static void console_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -162,12 +148,11 @@ static void console_main_area_init(wmWindowManager *wm, ARegion *ar)
/* ************* dropboxes ************* */
-static int id_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int id_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
- SpaceConsole *sc= CTX_wm_space_console(C);
- if(sc->type==CONSOLE_TYPE_PYTHON)
- if(drag->type==WM_DRAG_ID)
- return 1;
+// SpaceConsole *sc= CTX_wm_space_console(C);
+ if(drag->type==WM_DRAG_ID)
+ return 1;
return 0;
}
@@ -182,12 +167,11 @@ static void id_drop_copy(wmDrag *drag, wmDropBox *drop)
RNA_string_set(drop->ptr, "text", text);
}
-static int path_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int path_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
- SpaceConsole *sc= CTX_wm_space_console(C);
- if(sc->type==CONSOLE_TYPE_PYTHON)
- if(drag->type==WM_DRAG_PATH)
- return 1;
+// SpaceConsole *sc= CTX_wm_space_console(C);
+ if(drag->type==WM_DRAG_PATH)
+ return 1;
return 0;
}
@@ -216,23 +200,21 @@ static void console_main_area_draw(const bContext *C, ARegion *ar)
SpaceConsole *sc= CTX_wm_space_console(C);
View2D *v2d= &ar->v2d;
View2DScrollers *scrollers;
-
- if((sc->type==CONSOLE_TYPE_PYTHON) && (sc->scrollback.first==NULL))
+
+ if(sc->scrollback.first==NULL)
WM_operator_name_call((bContext *)C, "CONSOLE_OT_banner", WM_OP_EXEC_DEFAULT, NULL);
/* clear and setup matrix */
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- console_update_rect(C, ar);
-
/* worlks best with no view2d matrix set */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* data... */
console_history_verify(C); /* make sure we have some command line */
- console_text_main(sc, ar, CTX_wm_reports(C));
+ console_textview_main(sc, ar);
/* reset view matrix */
UI_view2d_view_restore(C);
@@ -259,15 +241,6 @@ void console_operatortypes(void)
WM_operatortype_append(CONSOLE_OT_copy);
WM_operatortype_append(CONSOLE_OT_paste);
WM_operatortype_append(CONSOLE_OT_select_set);
-
- /* console_report.c */
- WM_operatortype_append(CONSOLE_OT_select_pick);
- WM_operatortype_append(CONSOLE_OT_select_all_toggle);
- WM_operatortype_append(CONSOLE_OT_select_border);
-
- WM_operatortype_append(CONSOLE_OT_report_replay);
- WM_operatortype_append(CONSOLE_OT_report_delete);
- WM_operatortype_append(CONSOLE_OT_report_copy);
}
void console_keymap(struct wmKeyConfig *keyconf)
@@ -327,7 +300,7 @@ void console_keymap(struct wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", DELKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_NEXT_CHAR);
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_PREV_CHAR);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
WM_keymap_add_item(keymap, "CONSOLE_OT_execute", RETKEY, KM_PRESS, 0, 0); /* python operator - space_text.py */
WM_keymap_add_item(keymap, "CONSOLE_OT_execute", PADENTER, KM_PRESS, 0, 0);
@@ -335,16 +308,6 @@ void console_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "CONSOLE_OT_autocomplete", SPACEKEY, KM_PRESS, KM_CTRL, 0); /* python operator - space_text.py */
#endif
- /* report selection */
- WM_keymap_add_item(keymap, "CONSOLE_OT_select_pick", SELECTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CONSOLE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CONSOLE_OT_select_border", BKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "CONSOLE_OT_report_replay", RKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CONSOLE_OT_report_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CONSOLE_OT_report_delete", DELKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CONSOLE_OT_report_copy", CKEY, KM_PRESS, KM_CTRL, 0);
-
WM_keymap_add_item(keymap, "CONSOLE_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "CONSOLE_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0);
#ifdef __APPLE__
@@ -354,14 +317,14 @@ void console_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "CONSOLE_OT_select_set", LEFTMOUSE, KM_PRESS, 0, 0);
- RNA_string_set(WM_keymap_add_item(keymap, "CONSOLE_OT_insert", TABKEY, KM_PRESS, 0, 0)->ptr, "text", " "); /* fake tabs */
+ RNA_string_set(WM_keymap_add_item(keymap, "CONSOLE_OT_insert", TABKEY, KM_PRESS, 0, 0)->ptr, "text", "\t"); /* fake tabs */
WM_keymap_add_item(keymap, "CONSOLE_OT_insert", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); // last!
}
/****************** header region ******************/
/* add handlers, stuff you only do once or on area/region changes */
-static void console_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void console_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -371,19 +334,15 @@ static void console_header_area_draw(const bContext *C, ARegion *ar)
ED_region_header(C, ar);
}
-static void console_main_area_listener(ScrArea *sa, wmNotifier *wmn)
+static void console_main_area_listener(ARegion *ar, wmNotifier *wmn)
{
- SpaceConsole *sc= sa->spacedata.first;
+ // SpaceInfo *sinfo= sa->spacedata.first;
/* context changes */
switch(wmn->category) {
case NC_SPACE:
if(wmn->data == ND_SPACE_CONSOLE) { /* generic redraw request */
- ED_area_tag_redraw(sa);
- }
- else if(wmn->data == ND_SPACE_CONSOLE_REPORT && sc->type==CONSOLE_TYPE_REPORT) {
- /* redraw also but only for report view, could do less redraws by checking the type */
- ED_area_tag_redraw(sa);
+ ED_region_tag_redraw(ar);
}
break;
}
@@ -405,7 +364,6 @@ void ED_spacetype_console(void)
st->operatortypes= console_operatortypes;
st->keymap= console_keymap;
st->dropboxes= console_dropboxes;
- st->listener= console_main_area_listener;
/* regions: main window */
art= MEM_callocN(sizeof(ARegionType), "spacetype console region");
@@ -414,7 +372,7 @@ void ED_spacetype_console(void)
art->init= console_main_area_init;
art->draw= console_main_area_draw;
-
+ art->listener= console_main_area_listener;
diff --git a/source/blender/editors/space_file/CMakeLists.txt b/source/blender/editors/space_file/CMakeLists.txt
index 2a204d67537..d77ed306daf 100644
--- a/source/blender/editors/space_file/CMakeLists.txt
+++ b/source/blender/editors/space_file/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenfont
../../blenkernel
@@ -35,32 +33,42 @@ SET(INC
../../../../intern/guardedalloc
)
-IF(WITH_IMAGE_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_IMAGE_OPENEXR)
+set(SRC
+ file_draw.c
+ file_ops.c
+ file_panels.c
+ filelist.c
+ filesel.c
+ fsmenu.c
+ space_file.c
+
+ file_intern.h
+ filelist.h
+ fsmenu.h
+)
-IF(WITH_IMAGE_TIFF)
- ADD_DEFINITIONS(-DWITH_TIFF)
-ENDIF(WITH_IMAGE_TIFF)
+if(WITH_IMAGE_OPENEXR)
+ add_definitions(-DWITH_OPENEXR)
+endif()
-IF(WITH_IMAGE_OPENJPEG)
- ADD_DEFINITIONS(-DWITH_OPENJPEG)
-ENDIF(WITH_IMAGE_OPENJPEG)
+if(WITH_IMAGE_TIFF)
+ add_definitions(-DWITH_TIFF)
+endif()
-IF(WITH_IMAGE_DDS)
- ADD_DEFINITIONS(-DWITH_DDS)
-ENDIF(WITH_IMAGE_DDS)
+if(WITH_IMAGE_OPENJPEG)
+ add_definitions(-DWITH_OPENJPEG)
+endif()
-IF(WITH_IMAGE_CINEON)
- ADD_DEFINITIONS(-DWITH_CINEON)
-ENDIF(WITH_IMAGE_CINEON)
+if(WITH_IMAGE_DDS)
+ add_definitions(-DWITH_DDS)
+endif()
-IF(WITH_IMAGE_HDR)
- ADD_DEFINITIONS(-DWITH_HDR)
-ENDIF(WITH_IMAGE_HDR)
+if(WITH_IMAGE_CINEON)
+ add_definitions(-DWITH_CINEON)
+endif()
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_IMAGE_HDR)
+ add_definitions(-DWITH_HDR)
+endif()
-BLENDERLIB(bf_editor_space_file "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_file "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_file/Makefile b/source/blender/editors/space_file/Makefile
deleted file mode 100644
index 4597ffa3f6b..00000000000
--- a/source/blender/editors/space_file/Makefile
+++ /dev/null
@@ -1,76 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_file
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../render/extern/include
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../blenfont
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
-
-ifeq ($(WITH_OPENJPEG),true)
- CPPFLAGS += -DWITH_OPENJPEG
-endif
-
-ifeq ($(WITH_OPENEXR), true)
- CPPFLAGS += -DWITH_OPENEXR
-endif
-
-ifeq ($(WITH_TIFF), true)
- CPPFLAGS += -DWITH_TIFF
-endif
-
-ifeq ($(WITH_CINEON), true)
- CPPFLAGS += -DWITH_CINEON
-endif
-
-ifeq ($(WITH_HDR), true)
- CPPFLAGS += -DWITH_HDR
-endif
diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c
index 0f627bda3dc..54a462ad84a 100644
--- a/source/blender/editors/space_file/file_draw.c
+++ b/source/blender/editors/space_file/file_draw.c
@@ -26,9 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <math.h>
#include <string.h>
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_dynstr.h"
#include "BLI_storage_types.h"
#ifdef WIN32
@@ -40,6 +42,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BLF_api.h"
@@ -79,7 +82,7 @@ enum {
} eFile_ButEvents;
-static void do_file_buttons(bContext *C, void *arg, int event)
+static void do_file_buttons(bContext *C, void *UNUSED(arg), int event)
{
switch(event) {
case B_FS_FILENAME:
@@ -134,7 +137,7 @@ void file_draw_buttons(const bContext *C, ARegion *ar)
ARegion* artmp;
/* Initialize UI block. */
- sprintf(name, "win %p", ar);
+ sprintf(name, "win %p", (void *)ar);
block = uiBeginBlock(C, ar, name, UI_EMBOSS);
uiBlockSetHandleFunc(block, do_file_buttons, NULL);
@@ -176,7 +179,7 @@ void file_draw_buttons(const bContext *C, ARegion *ar)
/* callbacks for operator check functions */
uiBlockSetFunc(block, file_draw_check_cb, NULL, NULL);
- but = uiDefBut(block, TEX, B_FS_DIRNAME, "",
+ but = uiDefButTextO(block, TEX, "FILE_OT_directory", 0, "",
min_x, line1_y, line1_w-chan_offs, btn_h,
params->dir, 0.0, (float)FILE_MAX-1, 0, 0,
"File path.");
@@ -239,56 +242,6 @@ static void draw_tile(int sx, int sy, int width, int height, int colorid, int sh
uiRoundBox(sx, sy - height, sx + width, sy, 5);
}
-#define FILE_SHORTEN_END 0
-#define FILE_SHORTEN_FRONT 1
-
-static float shorten_string(char* string, float w, int flag)
-{
- char temp[FILE_MAX];
- short shortened = 0;
- float sw = 0;
- float pad = 0;
-
- if (w <= 0) {
- *string = '\0';
- return 0.0;
- }
-
- sw = file_string_width(string);
- if (flag == FILE_SHORTEN_FRONT) {
- char *s = string;
- BLI_strncpy(temp, "...", 4);
- pad = file_string_width(temp);
- while ((*s) && (sw+pad>w)) {
- s++;
- sw = file_string_width(s);
- shortened = 1;
- }
- if (shortened) {
- int slen = strlen(s);
- BLI_strncpy(temp+3, s, slen+1);
- temp[slen+4] = '\0';
- BLI_strncpy(string, temp, slen+4);
- }
- } else {
- char *s = string;
- while (sw>w) {
- int slen = strlen(string);
- string[slen-1] = '\0';
- sw = file_string_width(s);
- shortened = 1;
- }
-
- if (shortened) {
- int slen = strlen(string);
- if (slen > 3) {
- BLI_strncpy(string+slen-3, "...", 4);
- }
- }
- }
-
- return sw;
-}
static int get_file_icon(struct direntry *file)
{
@@ -303,6 +256,8 @@ static int get_file_icon(struct direntry *file)
}
else if (file->flags & BLENDERFILE)
return ICON_FILE_BLEND;
+ else if (file->flags & BLENDERFILE_BACKUP)
+ return ICON_FILE_BLEND;
else if (file->flags & IMAGEFILE)
return ICON_FILE_IMAGE;
else if (file->flags & MOVIEFILE)
@@ -327,37 +282,37 @@ static void file_draw_icon(uiBlock *block, char *path, int sx, int sy, int icon,
{
uiBut *but;
float x,y;
- float alpha=1.0f;
+ /*float alpha=1.0f;*/
x = (float)(sx);
y = (float)(sy-height);
- if (icon == ICON_FILE_BLANK) alpha = 0.375f;
+ /*if (icon == ICON_FILE_BLANK) alpha = 0.375f;*/
but= uiDefIconBut(block, LABEL, 0, icon, x, y, width, height, NULL, 0.0, 0.0, 0, 0, "");
uiButSetDragPath(but, path);
}
-static void file_draw_string(int sx, int sy, const char* string, float width, int height, int flag)
+static void file_draw_string(int sx, int sy, const char* string, float width, int height, short align)
{
uiStyle *style= U.uistyles.first;
- int soffs;
+ uiFontStyle fs = style->widgetlabel;
+ rcti rect;
char fname[FILE_MAXFILE];
- float sw;
- float x,y;
+ fs.align = align;
BLI_strncpy(fname,string, FILE_MAXFILE);
- sw = shorten_string(fname, width, flag );
+ file_shorten_string(fname, width+1.0, 0);
- soffs = (width - sw) / 2;
- x = (float)(sx);
- y = (float)(sy-height);
-
- uiStyleFontSet(&style->widget);
- BLF_position(style->widget.uifont_id, x, y, 0);
- BLF_draw(style->widget.uifont_id, fname);
+ /* no text clipping needed, uiStyleFontDraw does it but is a bit too strict (for buttons it works) */
+ rect.xmin = sx;
+ rect.xmax = sx + ceil(width+4.0f);
+ rect.ymin = sy - height;
+ rect.ymax = sy;
+
+ uiStyleFontDraw(&fs, &rect, fname);
}
void file_calc_previews(const bContext *C, ARegion *ar)
@@ -433,7 +388,7 @@ static void file_draw_preview(uiBlock *block, struct direntry *file, int sx, int
}
}
-static void renamebutton_cb(bContext *C, void *arg1, char *oldname)
+static void renamebutton_cb(bContext *C, void *UNUSED(arg1), char *oldname)
{
char newname[FILE_MAX+12];
char orgname[FILE_MAX+12];
@@ -445,9 +400,9 @@ static void renamebutton_cb(bContext *C, void *arg1, char *oldname)
struct direntry *file = (struct direntry *)arg1;
#endif
- BLI_make_file_string(G.sce, orgname, sfile->params->dir, oldname);
+ BLI_make_file_string(G.main->name, orgname, sfile->params->dir, oldname);
BLI_strncpy(filename, sfile->params->renameedit, sizeof(filename));
- BLI_make_file_string(G.sce, newname, sfile->params->dir, filename);
+ BLI_make_file_string(G.main->name, newname, sfile->params->dir, filename);
if( strcmp(orgname, newname) != 0 ) {
if (!BLI_exists(newname)) {
@@ -512,9 +467,11 @@ void file_draw_list(const bContext *C, ARegion *ar)
int colorid = 0;
int sx, sy;
int offset;
+ int textwidth, textheight;
int i;
- float sw, spos;
short is_icon;
+ short align;
+
numfiles = filelist_numfiles(files);
@@ -537,6 +494,11 @@ void file_draw_list(const bContext *C, ARegion *ar)
numfiles_layout += layout->columns;
}
+ textwidth =( FILE_IMGDISPLAY == params->display) ? layout->tile_w : layout->column_widths[COLUMN_NAME];
+ textheight = layout->textheight*3.0/2.0 + 0.5;
+
+ align = ( FILE_IMGDISPLAY == params->display) ? UI_STYLE_TEXT_CENTER : UI_STYLE_TEXT_LEFT;
+
for (i=offset; (i < numfiles) && (i<offset+numfiles_layout); ++i)
{
ED_fileselect_layout_tilepos(layout, i, &sx, &sy);
@@ -547,20 +509,6 @@ void file_draw_list(const bContext *C, ARegion *ar)
UI_ThemeColor4(TH_TEXT);
- spos = ( FILE_IMGDISPLAY == params->display ) ? sx : sx + ICON_DEFAULT_WIDTH + 4;
-
- sw = file_string_width(file->relname);
- if (file->flags & EDITING) {
- int but_width = (FILE_IMGDISPLAY == params->display) ? layout->tile_w : layout->column_widths[COLUMN_NAME];
-
- uiBut *but = uiDefBut(block, TEX, 1, "", spos, sy-layout->tile_h-3,
- but_width, layout->textheight*2, sfile->params->renameedit, 1.0f, (float)sizeof(sfile->params->renameedit),0,0,"");
- uiButSetRenameFunc(but, renamebutton_cb, file);
- uiButSetFlag(but, UI_BUT_NO_UTF8); /* allow non utf8 names */
- if ( 0 == uiButActiveOnly(C, block, but)) {
- file->flags &= ~EDITING;
- }
- }
if (!(file->flags & EDITING)) {
if (params->active_file == i) {
@@ -583,58 +531,61 @@ void file_draw_list(const bContext *C, ARegion *ar)
}
file_draw_preview(block, file, sx, sy, imb, layout, !is_icon && (file->flags & IMAGEFILE));
-
} else {
file_draw_icon(block, file->path, sx, sy-3, get_file_icon(file), ICON_DEFAULT_WIDTH, ICON_DEFAULT_WIDTH);
+ sx += ICON_DEFAULT_WIDTH + 4;
}
UI_ThemeColor4(TH_TEXT);
+
+ if (file->flags & EDITING) {
+ uiBut *but = uiDefBut(block, TEX, 1, "", sx , sy-layout->tile_h-3,
+ textwidth, textheight, sfile->params->renameedit, 1.0f, (float)sizeof(sfile->params->renameedit),0,0,"");
+ uiButSetRenameFunc(but, renamebutton_cb, file);
+ uiButSetFlag(but, UI_BUT_NO_UTF8); /* allow non utf8 names */
+ if ( 0 == uiButActiveOnly(C, block, but)) {
+ file->flags &= ~EDITING;
+ }
+ }
+
if (!(file->flags & EDITING)) {
- float name_width = (FILE_IMGDISPLAY == params->display) ? layout->tile_w : sw;
- file_draw_string(spos, sy, file->relname, name_width, layout->tile_h, FILE_SHORTEN_END);
+ int tpos = (FILE_IMGDISPLAY == params->display) ? sy - layout->tile_h + layout->textheight : sy;
+ file_draw_string(sx+1, tpos, file->relname, textwidth, textheight, align);
}
if (params->display == FILE_SHORTDISPLAY) {
- spos += layout->column_widths[COLUMN_NAME] + 12;
+ sx += layout->column_widths[COLUMN_NAME] + 12;
if (!(file->type & S_IFDIR)) {
- sw = file_string_width(file->size);
- file_draw_string(spos, sy, file->size, sw+1, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_SIZE] + 12;
+ file_draw_string(sx, sy, file->size, layout->column_widths[COLUMN_SIZE], layout->tile_h, align);
+ sx += layout->column_widths[COLUMN_SIZE] + 12;
}
} else if (params->display == FILE_LONGDISPLAY) {
- spos += layout->column_widths[COLUMN_NAME] + 12;
+ sx += layout->column_widths[COLUMN_NAME] + 12;
#ifndef WIN32
/* rwx rwx rwx */
- sw = file_string_width(file->mode1);
- file_draw_string(spos, sy, file->mode1, sw, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_MODE1] + 12;
+ file_draw_string(sx, sy, file->mode1, layout->column_widths[COLUMN_MODE1], layout->tile_h, align);
+ sx += layout->column_widths[COLUMN_MODE1] + 12;
- sw = file_string_width(file->mode2);
- file_draw_string(spos, sy, file->mode2, sw, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_MODE2] + 12;
+ file_draw_string(sx, sy, file->mode2, layout->column_widths[COLUMN_MODE2], layout->tile_h, align);
+ sx += layout->column_widths[COLUMN_MODE2] + 12;
- sw = file_string_width(file->mode3);
- file_draw_string(spos, sy, file->mode3, sw, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_MODE3] + 12;
+ file_draw_string(sx, sy, file->mode3, layout->column_widths[COLUMN_MODE3], layout->tile_h, align);
+ sx += layout->column_widths[COLUMN_MODE3] + 12;
- sw = file_string_width(file->owner);
- file_draw_string(spos, sy, file->owner, sw, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_OWNER] + 12;
+ file_draw_string(sx, sy, file->owner, layout->column_widths[COLUMN_OWNER] , layout->tile_h, align);
+ sx += layout->column_widths[COLUMN_OWNER] + 12;
#endif
- sw = file_string_width(file->date);
- file_draw_string(spos, sy, file->date, sw, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_DATE] + 12;
+ file_draw_string(sx, sy, file->date, layout->column_widths[COLUMN_DATE], layout->tile_h, align);
+ sx += layout->column_widths[COLUMN_DATE] + 12;
- sw = file_string_width(file->time);
- file_draw_string(spos, sy, file->time, sw, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_TIME] + 12;
+ file_draw_string(sx, sy, file->time, layout->column_widths[COLUMN_TIME] , layout->tile_h, align);
+ sx += layout->column_widths[COLUMN_TIME] + 12;
if (!(file->type & S_IFDIR)) {
- sw = file_string_width(file->size);
- file_draw_string(spos, sy, file->size, sw, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_SIZE] + 12;
+ file_draw_string(sx, sy, file->size, layout->column_widths[COLUMN_SIZE], layout->tile_h, align);
+ sx += layout->column_widths[COLUMN_SIZE] + 12;
}
}
}
diff --git a/source/blender/editors/space_file/file_intern.h b/source/blender/editors/space_file/file_intern.h
index 07a24454520..692953a18a3 100644
--- a/source/blender/editors/space_file/file_intern.h
+++ b/source/blender/editors/space_file/file_intern.h
@@ -66,6 +66,7 @@ void FILE_OT_cancel(struct wmOperatorType *ot);
void FILE_OT_parent(struct wmOperatorType *ot);
void FILE_OT_directory_new(struct wmOperatorType *ot);
void FILE_OT_filename(struct wmOperatorType *ot);
+void FILE_OT_directory(struct wmOperatorType *ot);
void FILE_OT_previous(struct wmOperatorType *ot);
void FILE_OT_next(struct wmOperatorType *ot);
void FILE_OT_refresh(struct wmOperatorType *ot);
@@ -92,8 +93,10 @@ void file_operator_to_sfile(struct SpaceFile *sfile, struct wmOperator *op);
/* filesel.c */
+float file_shorten_string(char* string, float w, int front);
float file_string_width(const char* str);
-float file_font_pointsize();
+
+float file_font_pointsize(void);
void file_change_dir(bContext *C, int checkdir);
int file_select_match(struct SpaceFile *sfile, const char *pattern);
void autocomplete_directory(struct bContext *C, char *str, void *arg_v);
diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c
index e9764a2d36a..55dc19d9bb9 100644
--- a/source/blender/editors/space_file/file_ops.c
+++ b/source/blender/editors/space_file/file_ops.c
@@ -30,8 +30,10 @@
#include "BKE_screen.h"
#include "BKE_global.h"
#include "BKE_report.h"
+#include "BKE_main.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_storage_types.h"
#ifdef WIN32
#include "BLI_winstuff.h"
@@ -190,7 +192,7 @@ static FileSelect file_select(bContext* C, const rcti* rect, short selecting, sh
/* avoids /../../ */
BLI_parent_dir(params->dir);
} else {
- BLI_cleanup_dir(G.sce, params->dir);
+ BLI_cleanup_dir(G.main->name, params->dir);
strcat(params->dir, file->relname);
BLI_add_slash(params->dir);
}
@@ -259,7 +261,6 @@ static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
ARegion *ar= CTX_wm_region(C);
SpaceFile *sfile= CTX_wm_space_file(C);
- short val;
rcti rect;
int extend = RNA_boolean_get(op->ptr, "extend");
int fill = RNA_boolean_get(op->ptr, "fill");
@@ -269,7 +270,6 @@ static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
rect.xmin = rect.xmax = event->x - ar->winrct.xmin;
rect.ymin = rect.ymax = event->y - ar->winrct.ymin;
- val = event->val;
if(!BLI_in_rcti(&ar->v2d.mask, rect.xmin, rect.ymin))
return OPERATOR_CANCELLED;
@@ -304,7 +304,7 @@ void FILE_OT_select(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "fill", 0, "Fill", "Select everything beginning with the last selection.");
}
-static int file_select_all_exec(bContext *C, wmOperator *op)
+static int file_select_all_exec(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -361,7 +361,7 @@ static int bookmark_select_exec(bContext *C, wmOperator *op)
RNA_string_get(op->ptr, "dir", entry);
BLI_strncpy(params->dir, entry, sizeof(params->dir));
- BLI_cleanup_dir(G.sce, params->dir);
+ BLI_cleanup_dir(G.main->name, params->dir);
file_change_dir(C, 1);
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
@@ -384,7 +384,7 @@ void FILE_OT_select_bookmark(wmOperatorType *ot)
RNA_def_string(ot->srna, "dir", "", 256, "Dir", "");
}
-static int bookmark_add_exec(bContext *C, wmOperator *op)
+static int bookmark_add_exec(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -479,7 +479,7 @@ int file_hilight_set(SpaceFile *sfile, ARegion *ar, int mx, int my)
return (params->active_file != origfile);
}
-static int file_highlight_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int file_highlight_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
ARegion *ar= CTX_wm_region(C);
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -504,7 +504,7 @@ void FILE_OT_highlight(struct wmOperatorType *ot)
ot->poll= ED_operator_file_active;
}
-int file_cancel_exec(bContext *C, wmOperator *unused)
+int file_cancel_exec(bContext *C, wmOperator *UNUSED(unused))
{
SpaceFile *sfile= CTX_wm_space_file(C);
wmOperator *op = sfile->op;
@@ -544,7 +544,7 @@ void file_sfile_to_operator(wmOperator *op, SpaceFile *sfile, char *filepath)
BLI_join_dirfile(filepath, sfile->params->dir, sfile->params->file);
if(RNA_struct_find_property(op->ptr, "relative_path")) {
if(RNA_boolean_get(op->ptr, "relative_path")) {
- BLI_path_rel(filepath, G.sce);
+ BLI_path_rel(filepath, G.main->name);
}
}
@@ -613,7 +613,7 @@ void file_operator_to_sfile(SpaceFile *sfile, wmOperator *op)
/* XXX, files and dirs updates missing, not really so important though */
}
-void file_draw_check_cb(bContext *C, void *dummy1, void *dummy2)
+void file_draw_check_cb(bContext *C, void *UNUSED(arg1), void *UNUSED(arg2))
{
SpaceFile *sfile= CTX_wm_space_file(C);
wmOperator *op= sfile->op;
@@ -680,7 +680,7 @@ int file_exec(bContext *C, wmOperator *exec_op)
file_sfile_to_operator(op, sfile, filepath);
fsmenu_insert_entry(fsmenu_get(), FS_CATEGORY_RECENT, sfile->params->dir,0, 1);
- BLI_make_file_string(G.sce, filepath, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE);
+ BLI_make_file_string(G.main->name, filepath, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE);
fsmenu_write_file(fsmenu_get(), filepath);
WM_event_fileselect_event(C, op, EVT_FILESELECT_EXEC);
@@ -704,14 +704,14 @@ void FILE_OT_execute(struct wmOperatorType *ot)
}
-int file_parent_exec(bContext *C, wmOperator *unused)
+int file_parent_exec(bContext *C, wmOperator *UNUSED(unused))
{
SpaceFile *sfile= CTX_wm_space_file(C);
if(sfile->params) {
if (BLI_has_parent(sfile->params->dir)) {
BLI_parent_dir(sfile->params->dir);
- BLI_cleanup_dir(G.sce, sfile->params->dir);
+ BLI_cleanup_dir(G.main->name, sfile->params->dir);
file_change_dir(C, 0);
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
}
@@ -735,7 +735,7 @@ void FILE_OT_parent(struct wmOperatorType *ot)
}
-int file_refresh_exec(bContext *C, wmOperator *unused)
+int file_refresh_exec(bContext *C, wmOperator *UNUSED(unused))
{
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -759,7 +759,7 @@ void FILE_OT_previous(struct wmOperatorType *ot)
ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
}
-int file_previous_exec(bContext *C, wmOperator *unused)
+int file_previous_exec(bContext *C, wmOperator *UNUSED(unused))
{
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -790,7 +790,7 @@ void FILE_OT_next(struct wmOperatorType *ot)
ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
}
-int file_next_exec(bContext *C, wmOperator *unused)
+int file_next_exec(bContext *C, wmOperator *UNUSED(unused))
{
SpaceFile *sfile= CTX_wm_space_file(C);
if(sfile->params) {
@@ -812,7 +812,7 @@ int file_next_exec(bContext *C, wmOperator *unused)
/* only meant for timer usage */
-static int file_smoothscroll_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int file_smoothscroll_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
ScrArea *sa = CTX_wm_area(C);
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -946,6 +946,8 @@ int file_directory_new_exec(bContext *C, wmOperator *op)
{
char name[FILE_MAXFILE];
char path[FILE_MAX];
+ int generate_name= 1;
+
SpaceFile *sfile= CTX_wm_space_file(C);
if(!sfile->params) {
@@ -953,13 +955,22 @@ int file_directory_new_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- /* create a new, non-existing folder name */
- if (!new_folder_path(sfile->params->dir, path, name)) {
- BKE_report(op->reports,RPT_ERROR, "Couldn't create new folder name.");
- return OPERATOR_CANCELLED;
+ path[0] = '\0';
+
+ if(RNA_struct_find_property(op->ptr, "directory")) {
+ RNA_string_get(op->ptr, "directory", path);
+ if (path[0] != '\0') generate_name= 0;
}
-
- /* rename the file */
+
+ if (generate_name) {
+ /* create a new, non-existing folder name */
+ if (!new_folder_path(sfile->params->dir, path, name)) {
+ BKE_report(op->reports,RPT_ERROR, "Couldn't create new folder name.");
+ return OPERATOR_CANCELLED;
+ }
+ }
+
+ /* create the file */
BLI_recurdir_fileops(path);
if (!BLI_exists(path)) {
@@ -993,9 +1004,13 @@ void FILE_OT_directory_new(struct wmOperatorType *ot)
ot->invoke= WM_operator_confirm;
ot->exec= file_directory_new_exec;
ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
+
+ RNA_def_string_dir_path(ot->srna, "directory", "", FILE_MAX, "Directory", "Name of new directory");
+
}
-int file_directory_exec(bContext *C, wmOperator *unused)
+
+static void file_expand_directory(bContext *C)
{
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -1010,7 +1025,47 @@ int file_directory_exec(bContext *C, wmOperator *unused)
if (sfile->params->dir[0] == '\0')
get_default_root(sfile->params->dir);
#endif
- BLI_cleanup_dir(G.sce, sfile->params->dir);
+ }
+}
+
+int file_directory_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ if(sfile->params) {
+ file_expand_directory(C);
+
+ if (!BLI_exists(sfile->params->dir)) {
+ return WM_operator_confirm_message(C, op, "Create new directory?");
+ }
+
+ return file_directory_exec(C, op);
+ }
+
+ return OPERATOR_CANCELLED;
+}
+
+
+
+int file_directory_exec(bContext *C, wmOperator *UNUSED(unused))
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ if(sfile->params) {
+ file_expand_directory(C);
+
+ if (!BLI_exists(sfile->params->dir)) {
+ BLI_recurdir_fileops(sfile->params->dir);
+ }
+
+ /* special case, user may have pasted a fulepath into the directory */
+ if(BLI_exists(sfile->params->dir) && BLI_is_dir(sfile->params->dir) == 0) {
+ char path[sizeof(sfile->params->dir)];
+ BLI_strncpy(path, sfile->params->dir, sizeof(path));
+ BLI_split_dirfile(path, sfile->params->dir, sfile->params->file);
+ }
+
+ BLI_cleanup_dir(G.main->name, sfile->params->dir);
BLI_add_slash(sfile->params->dir);
file_change_dir(C, 1);
@@ -1021,7 +1076,7 @@ int file_directory_exec(bContext *C, wmOperator *unused)
return OPERATOR_FINISHED;
}
-int file_filename_exec(bContext *C, wmOperator *unused)
+int file_filename_exec(bContext *C, wmOperator *UNUSED(unused))
{
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -1036,6 +1091,18 @@ int file_filename_exec(bContext *C, wmOperator *unused)
return OPERATOR_FINISHED;
}
+void FILE_OT_directory(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Enter Directory Name";
+ ot->description= "Enter a directory name";
+ ot->idname= "FILE_OT_directory";
+
+ /* api callbacks */
+ ot->invoke= file_directory_invoke;
+ ot->exec= file_directory_exec;
+ ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
+}
void FILE_OT_refresh(struct wmOperatorType *ot)
{
@@ -1049,7 +1116,7 @@ void FILE_OT_refresh(struct wmOperatorType *ot)
ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
}
-int file_hidedot_exec(bContext *C, wmOperator *unused)
+int file_hidedot_exec(bContext *C, wmOperator *UNUSED(unused))
{
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -1102,7 +1169,7 @@ struct ARegion *file_buttons_region(struct ScrArea *sa)
return arnew;
}
-int file_bookmark_toggle_exec(bContext *C, wmOperator *unused)
+int file_bookmark_toggle_exec(bContext *C, wmOperator *UNUSED(unused))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= file_buttons_region(sa);
@@ -1158,7 +1225,7 @@ void FILE_OT_filenum(struct wmOperatorType *ot)
RNA_def_int(ot->srna, "increment", 1, 0, 100, "Increment", "", 0,100);
}
-int file_rename_exec(bContext *C, wmOperator *op)
+int file_rename_exec(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
@@ -1232,7 +1299,7 @@ int file_delete_poll(bContext *C)
return poll;
}
-int file_delete_exec(bContext *C, wmOperator *op)
+int file_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
char str[FILE_MAX];
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -1240,7 +1307,7 @@ int file_delete_exec(bContext *C, wmOperator *op)
file = filelist_file(sfile->files, sfile->params->active_file);
- BLI_make_file_string(G.sce, str, sfile->params->dir, file->relname);
+ BLI_make_file_string(G.main->name, str, sfile->params->dir, file->relname);
BLI_delete(str, 0, 0);
ED_fileselect_clear(C, sfile);
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
diff --git a/source/blender/editors/space_file/file_panels.c b/source/blender/editors/space_file/file_panels.c
index 33d740e18a6..f9c467a039d 100644
--- a/source/blender/editors/space_file/file_panels.c
+++ b/source/blender/editors/space_file/file_panels.c
@@ -30,9 +30,11 @@
#include "BKE_screen.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "DNA_userdef_types.h"
#include "MEM_guardedalloc.h"
@@ -49,7 +51,7 @@
#include <string.h>
-static void file_panel_cb(bContext *C, void *arg_entry, void *arg_unused)
+static void file_panel_cb(bContext *C, void *arg_entry, void *UNUSED(arg_v))
{
PointerRNA ptr;
char *entry= (char*)arg_entry;
@@ -67,7 +69,6 @@ static void file_panel_category(const bContext *C, Panel *pa, FSMenuCategory cat
uiBut *but;
uiLayout *box, *col;
struct FSMenu* fsmenu = fsmenu_get();
- char *curdir= (sfile->params)? sfile->params->dir: "";
int i, i_iter, nentries = fsmenu_get_nentries(fsmenu, category);
/* reset each time */
@@ -94,8 +95,11 @@ static void file_panel_category(const bContext *C, Panel *pa, FSMenuCategory cat
entry = fsmenu_get_entry(fsmenu, category, i);
/* set this list item as active if we have a match */
- if(strcmp(curdir, entry) == 0)
- *nr= i;
+ if(sfile->params) {
+ if(strcmp(sfile->params->dir, entry) == 0) {
+ *nr= i;
+ }
+ }
/* create nice bookmark name, shows last directory in the full path currently */
BLI_strncpy(temp, entry, FILE_MAX);
@@ -136,7 +140,7 @@ static void file_panel_bookmarks(const bContext *C, Panel *pa)
if(sfile) {
row= uiLayoutRow(pa->layout, 0);
uiItemO(row, "Add", ICON_ZOOMIN, "file.bookmark_add");
- uiItemL(row, NULL, 0);
+ uiItemL(row, NULL, ICON_NULL);
file_panel_category(C, pa, FS_CATEGORY_BOOKMARKS, &sfile->bookmarknr, ICON_BOOKMARKS, 1, 0);
}
@@ -146,12 +150,15 @@ static void file_panel_recent(const bContext *C, Panel *pa)
{
SpaceFile *sfile= CTX_wm_space_file(C);
- if(sfile)
- file_panel_category(C, pa, FS_CATEGORY_RECENT, &sfile->recentnr, ICON_FILE_FOLDER, 0, 1);
+ if(sfile) {
+ if ( !(U.uiflag & USER_HIDE_RECENT) ) {
+ file_panel_category(C, pa, FS_CATEGORY_RECENT, &sfile->recentnr, ICON_FILE_FOLDER, 0, 1);
+ }
+ }
}
-static int file_panel_operator_poll(const bContext *C, PanelType *pt)
+static int file_panel_operator_poll(const bContext *C, PanelType *UNUSED(pt))
{
SpaceFile *sfile= CTX_wm_space_file(C);
return (sfile && sfile->op);
@@ -165,41 +172,25 @@ static void file_panel_operator_header(const bContext *C, Panel *pa)
BLI_strncpy(pa->drawname, op->type->name, sizeof(pa->drawname));
}
+static int file_panel_check_prop(PropertyRNA *prop)
+{
+ const char *prop_id= RNA_property_identifier(prop);
+ return !( strcmp(prop_id, "filepath") == 0 ||
+ strcmp(prop_id, "directory") == 0 ||
+ strcmp(prop_id, "filename") == 0
+ );
+}
+
static void file_panel_operator(const bContext *C, Panel *pa)
{
SpaceFile *sfile= CTX_wm_space_file(C);
wmOperator *op= sfile->op;
- int empty= 1, flag;
+ // int empty= 1, flag;
uiBlockSetFunc(uiLayoutGetBlock(pa->layout), file_draw_check_cb, NULL, NULL);
-
- if(op->type->ui) {
- op->layout= pa->layout;
- op->type->ui((bContext*)C, op);
- op->layout= NULL;
- }
- else {
- RNA_STRUCT_BEGIN(op->ptr, prop) {
- flag= RNA_property_flag(prop);
-
- if(flag & PROP_HIDDEN)
- continue;
- if(strcmp(RNA_property_identifier(prop), "filepath") == 0)
- continue;
- if(strcmp(RNA_property_identifier(prop), "directory") == 0)
- continue;
- if(strcmp(RNA_property_identifier(prop), "filename") == 0)
- continue;
-
- uiItemFullR(pa->layout, op->ptr, prop, -1, 0, 0, NULL, 0);
- empty= 0;
- }
- RNA_STRUCT_END;
- if(empty)
- uiItemL(pa->layout, "No properties.", 0);
- }
-
+ uiLayoutOperatorButs(C, pa->layout, op, file_panel_check_prop, '\0', UI_LAYOUT_OP_SHOW_EMPTY);
+
uiBlockSetFunc(uiLayoutGetBlock(pa->layout), NULL, NULL, NULL);
}
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index eba0df9f963..ec4733c171c 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -46,6 +46,7 @@
#include "BLI_linklist.h"
#include "BLI_storage_types.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#ifdef WIN32
#include "BLI_winstuff.h"
@@ -69,10 +70,11 @@
#include "PIL_time.h"
-
#include "WM_api.h"
#include "WM_types.h"
+#include "UI_resources.h"
+
#include "filelist.h"
/* max length of library group name within filesel */
@@ -238,8 +240,8 @@ static int compare_size(const void *a1, const void *a2)
static int compare_extension(const void *a1, const void *a2) {
const struct direntry *entry1=a1, *entry2=a2;
- char *sufix1, *sufix2;
- char *nil="";
+ const char *sufix1, *sufix2;
+ const char *nil="";
if (!(sufix1= strstr (entry1->relname, ".blend.gz")))
sufix1= strrchr (entry1->relname, '.');
@@ -295,7 +297,7 @@ static int is_hidden_file(const char* filename, short hide_dot)
return is_hidden;
}
-static int is_filtered_file(struct direntry* file, const char* dir, unsigned int filter, short hide_dot)
+static int is_filtered_file(struct direntry* file, const char* UNUSED(dir), unsigned int filter, short hide_dot)
{
int is_filtered=0;
if (filter) {
@@ -324,7 +326,7 @@ static int is_filtered_lib(struct direntry* file, const char* dir, unsigned int
return is_filtered;
}
-static int is_filtered_main(struct direntry* file, const char* dir, unsigned int filter, short hide_dot)
+static int is_filtered_main(struct direntry* file, const char* UNUSED(dir), unsigned int UNUSED(filter), short hide_dot)
{
return !is_hidden_file(file->relname, hide_dot);
}
@@ -360,7 +362,7 @@ void filelist_filter(FileList* filelist)
}
}
-void filelist_init_icons()
+void filelist_init_icons(void)
{
short x, y, k;
ImBuf *bbuf;
@@ -371,7 +373,7 @@ void filelist_init_icons()
for (x=0; x<SPECIAL_IMG_COLS; x++) {
int tile = SPECIAL_IMG_COLS*y + x;
if (tile < SPECIAL_IMG_MAX) {
- ibuf = IMB_allocImBuf(SPECIAL_IMG_SIZE, SPECIAL_IMG_SIZE, 32, IB_rect, 0);
+ ibuf = IMB_allocImBuf(SPECIAL_IMG_SIZE, SPECIAL_IMG_SIZE, 32, IB_rect);
for (k=0; k<SPECIAL_IMG_SIZE; k++) {
memcpy(&ibuf->rect[k*SPECIAL_IMG_SIZE], &bbuf->rect[(k+y*SPECIAL_IMG_SIZE)*SPECIAL_IMG_SIZE*SPECIAL_IMG_COLS+x*SPECIAL_IMG_SIZE], SPECIAL_IMG_SIZE*sizeof(int));
}
@@ -383,7 +385,7 @@ void filelist_init_icons()
}
}
-void filelist_free_icons()
+void filelist_free_icons(void)
{
int i;
for (i=0; i < SPECIAL_IMG_MAX; ++i) {
@@ -720,6 +722,115 @@ void filelist_setfilter_types(struct FileList* filelist, const char *filter_glob
BLI_strncpy(filelist->filter_glob, filter_glob, sizeof(filelist->filter_glob));
}
+static int file_is_blend_backup(const char *str)
+{
+ short a, b;
+ int retval= 0;
+
+ a= strlen(str);
+ b= 7;
+
+ if(a==0 || b>=a);
+ else {
+ char *loc;
+
+ if(a > b+1)
+ b++;
+
+ /* allow .blend1 .blend2 .blend32 */
+ loc= BLI_strcasestr(str+a-b, ".blend");
+
+ if(loc)
+ retval= 1;
+ }
+
+ return (retval);
+}
+
+
+static int file_extension_type(char *relname)
+{
+ if(BLO_has_bfile_extension(relname)) {
+ return BLENDERFILE;
+ } else if(file_is_blend_backup(relname)) {
+ return BLENDERFILE_BACKUP;
+ } else if(BLI_testextensie(relname, ".py")) {
+ return PYSCRIPTFILE;
+ } else if(BLI_testextensie(relname, ".txt")
+ || BLI_testextensie(relname, ".glsl")
+ || BLI_testextensie(relname, ".data")) {
+ return TEXTFILE;
+ } else if( BLI_testextensie(relname, ".ttf")
+ || BLI_testextensie(relname, ".ttc")
+ || BLI_testextensie(relname, ".pfb")
+ || BLI_testextensie(relname, ".otf")
+ || BLI_testextensie(relname, ".otc")) {
+ return FTFONTFILE;
+ } else if(BLI_testextensie(relname, ".btx")) {
+ return BTXFILE;
+ } else if(BLI_testextensie(relname, ".dae")) {
+ return COLLADAFILE;
+ } else if(BLI_testextensie_array(relname, imb_ext_image)
+ || (G.have_quicktime && BLI_testextensie_array(relname, imb_ext_image_qt))) {
+ return IMAGEFILE;
+ } else if(BLI_testextensie_array(relname, imb_ext_movie)) {
+ return MOVIEFILE;
+ } else if(BLI_testextensie_array(relname, imb_ext_audio)) {
+ return SOUNDFILE;
+ }
+ return 0;
+}
+
+int ED_file_extension_icon(char *relname)
+{
+ int type= file_extension_type(relname);
+
+ if (type == BLENDERFILE || type==BLENDERFILE_BACKUP)
+ return ICON_FILE_BLEND;
+ else if (type == IMAGEFILE)
+ return ICON_FILE_IMAGE;
+ else if (type == MOVIEFILE)
+ return ICON_FILE_MOVIE;
+ else if (type == PYSCRIPTFILE)
+ return ICON_FILE_SCRIPT;
+ else if (type == PYSCRIPTFILE)
+ return ICON_FILE_SCRIPT;
+ else if (type == SOUNDFILE)
+ return ICON_FILE_SOUND;
+ else if (type == FTFONTFILE)
+ return ICON_FILE_FONT;
+ else if (type == BTXFILE)
+ return ICON_FILE_BLANK;
+ else if (type == COLLADAFILE)
+ return ICON_FILE_BLANK;
+
+ return ICON_FILE_BLANK;
+}
+
+void filelist_setfiletypes(struct FileList* filelist)
+{
+ struct direntry *file;
+ int num;
+
+ file= filelist->filelist;
+
+ for(num=0; num<filelist->numfiles; num++, file++) {
+ file->type= file->s.st_mode; /* restore the mess below */
+
+ /* Don't check extensions for directories */
+ if (file->type & S_IFDIR) {
+ continue;
+ }
+ file->flags = file_extension_type(file->relname);
+
+ if(filelist->filter_glob
+ && BLI_testextensie_glob(file->relname, filelist->filter_glob)) {
+ file->flags= OPERATORFILE;
+ }
+
+ }
+}
+
static void filelist_read_dir(struct FileList* filelist)
{
char wdir[FILE_MAX];
@@ -730,11 +841,11 @@ static void filelist_read_dir(struct FileList* filelist)
BLI_getwdN(wdir);
- BLI_cleanup_dir(G.sce, filelist->dir);
+ BLI_cleanup_dir(G.main->name, filelist->dir);
filelist->numfiles = BLI_getdir(filelist->dir, &(filelist->filelist));
if(!chdir(wdir)) {} /* fix warning about not checking return value */
- filelist_setfiletypes(filelist, G.have_quicktime);
+ filelist_setfiletypes(filelist);
filelist_filter(filelist);
}
@@ -747,7 +858,7 @@ static void filelist_read_main(struct FileList* filelist)
static void filelist_read_library(struct FileList* filelist)
{
if (!filelist) return;
- BLI_cleanup_dir(G.sce, filelist->dir);
+ BLI_cleanup_dir(G.main->name, filelist->dir);
filelist_from_library(filelist);
if(!filelist->libfiledata) {
int num;
@@ -790,53 +901,6 @@ void filelist_parent(struct FileList* filelist)
filelist_readdir(filelist);
}
-void filelist_setfiletypes(struct FileList* filelist, short has_quicktime)
-{
- struct direntry *file;
- int num;
-
- file= filelist->filelist;
-
- for(num=0; num<filelist->numfiles; num++, file++) {
- file->flags= 0;
- file->type= file->s.st_mode; /* restore the mess below */
-
- /* Don't check extensions for directories */
- if (file->type & S_IFDIR) {
- continue;
- }
-
- if(BLO_has_bfile_extension(file->relname)) {
- file->flags |= BLENDERFILE;
- } else if(BLI_testextensie(file->relname, ".py")) {
- file->flags |= PYSCRIPTFILE;
- } else if(BLI_testextensie(file->relname, ".txt")
- || BLI_testextensie(file->relname, ".glsl")
- || BLI_testextensie(file->relname, ".data")) {
- file->flags |= TEXTFILE;
- } else if( BLI_testextensie(file->relname, ".ttf")
- || BLI_testextensie(file->relname, ".ttc")
- || BLI_testextensie(file->relname, ".pfb")
- || BLI_testextensie(file->relname, ".otf")
- || BLI_testextensie(file->relname, ".otc")) {
- file->flags |= FTFONTFILE;
- } else if(BLI_testextensie(file->relname, ".btx")) {
- file->flags |= BTXFILE;
- } else if(BLI_testextensie(file->relname, ".dae")) {
- file->flags |= COLLADAFILE;
- } else if(BLI_testextensie_array(file->relname, imb_ext_image)
- || (has_quicktime && BLI_testextensie_array(file->relname, imb_ext_image_qt))) {
- file->flags |= IMAGEFILE;
- } else if(BLI_testextensie_array(file->relname, imb_ext_movie)) {
- file->flags |= MOVIEFILE;
- } else if(BLI_testextensie_array(file->relname, imb_ext_audio)) {
- file->flags |= SOUNDFILE;
- } else if(filelist->filter_glob
- && BLI_testextensie_glob(file->relname, filelist->filter_glob)) {
- file->flags |= OPERATORFILE;
- }
- }
-}
void filelist_swapselect(struct FileList* filelist)
{
@@ -887,7 +951,7 @@ static int groupname_to_code(char *group)
char buf[32];
char *lslash;
- BLI_strncpy(buf, group, 31);
+ BLI_strncpy(buf, group, sizeof(buf));
lslash= BLI_last_slash(buf);
if (lslash)
lslash[0]= '\0';
@@ -912,7 +976,7 @@ void filelist_from_library(struct FileList* filelist)
return;
}
- BLI_strncpy(filename, G.sce, sizeof(filename)); // G.sce = last file loaded, for UI
+ BLI_strncpy(filename, G.main->name, sizeof(filename));
/* there we go */
/* for the time being only read filedata when libfiledata==0 */
@@ -965,7 +1029,7 @@ void filelist_from_library(struct FileList* filelist)
/* first allocate imbuf for copying preview into it */
if (w > 0 && h > 0 && rect) {
- ima = IMB_allocImBuf(w, h, 32, IB_rect, 0);
+ ima = IMB_allocImBuf(w, h, 32, IB_rect);
memcpy(ima->rect, rect, w*h*sizeof(unsigned int));
filelist->filelist[i + 1].image = ima;
filelist->filelist[i + 1].flags = IMAGEFILE;
@@ -979,7 +1043,7 @@ void filelist_from_library(struct FileList* filelist)
filelist_sort(filelist, FILE_SORT_ALPHA);
- BLI_strncpy(G.sce, filename, sizeof(filename)); // prevent G.sce to change
+ BLI_strncpy(G.main->name, filename, sizeof(filename)); // prevent G.main->name to change
filelist->filter = 0;
filelist_filter(filelist);
@@ -1136,16 +1200,15 @@ static void thumbnail_joblist_free(ThumbnailJob *tj)
FileImage* limg = tj->loadimages.first;
/* free the images not yet copied to the filelist -> these will get freed with the filelist */
- while (limg != tj->loadimages.last) {
+ for( ; limg; limg= limg->next) {
if ((limg->img) && (!limg->done)) {
IMB_freeImBuf(limg->img);
}
- limg = limg->next;
}
BLI_freelistN(&tj->loadimages);
}
-static void thumbnails_startjob(void *tjv, short *stop, short *do_update, float *progress)
+static void thumbnails_startjob(void *tjv, short *stop, short *do_update, float *UNUSED(progress))
{
ThumbnailJob *tj= tjv;
FileImage* limg = tj->loadimages.first;
diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h
index 9dd7ab26625..6ea91746b85 100644
--- a/source/blender/editors/space_file/filelist.h
+++ b/source/blender/editors/space_file/filelist.h
@@ -47,8 +47,8 @@ struct rcti;
struct ReportList;
struct FileList * filelist_new(short type);
-void filelist_init_icons();
-void filelist_free_icons();
+void filelist_init_icons(void);
+void filelist_free_icons(void);
int filelist_find(struct FileList* filelist, char *file);
void filelist_free(struct FileList* filelist);
void filelist_sort(struct FileList* filelist, short sort);
@@ -69,7 +69,6 @@ void filelist_readdir(struct FileList* filelist);
int filelist_empty(struct FileList* filelist);
void filelist_parent(struct FileList* filelist);
-void filelist_setfiletypes(struct FileList* filelist, short has_quicktime);
int filelist_islibrary (struct FileList* filelist, char* dir, char* group);
@@ -78,7 +77,7 @@ void filelist_from_library(struct FileList* filelist);
void filelist_freelib(struct FileList* filelist);
void filelist_hideparent(struct FileList* filelist, short hide);
-struct ListBase * folderlist_new();
+struct ListBase * folderlist_new(void);
void folderlist_free(struct ListBase* folderlist);
struct ListBase * folderlist_duplicate(ListBase* folderlist);
void folderlist_popdir(struct ListBase* folderlist, char *dir);
diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c
index 7192870bcc8..939a8450cb6 100644
--- a/source/blender/editors/space_file/filesel.c
+++ b/source/blender/editors/space_file/filesel.c
@@ -59,11 +59,14 @@
#include "BLI_blenlib.h"
#include "BLI_linklist.h"
+#include "BLI_path_util.h"
#include "BLI_storage_types.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BLF_api.h"
@@ -77,6 +80,7 @@
#include "RNA_access.h"
#include "UI_interface.h"
+#include "UI_interface_icons.h"
#include "file_intern.h"
#include "filelist.h"
@@ -104,7 +108,7 @@ short ED_fileselect_set_params(SpaceFile *sfile)
if (!sfile->params) {
sfile->params= MEM_callocN(sizeof(FileSelectParams), "fileselparams");
/* set path to most recently opened .blend */
- BLI_split_dirfile(G.sce, sfile->params->dir, sfile->params->file);
+ BLI_split_dirfile(G.main->name, sfile->params->dir, sfile->params->file);
sfile->params->filter_glob[0] = '\0';
}
@@ -142,8 +146,8 @@ short ED_fileselect_set_params(SpaceFile *sfile)
}
if(params->dir[0]) {
- BLI_cleanup_dir(G.sce, params->dir);
- BLI_path_abs(params->dir, G.sce);
+ BLI_cleanup_dir(G.main->name, params->dir);
+ BLI_path_abs(params->dir, G.main->name);
}
params->filter = 0;
@@ -197,12 +201,16 @@ short ED_fileselect_set_params(SpaceFile *sfile)
params->flag |= RNA_boolean_get(op->ptr, "autoselect") ? FILE_AUTOSELECT : 0;
params->flag |= RNA_boolean_get(op->ptr, "active_layer") ? FILE_ACTIVELAY : 0;
}
-
- if(params->filter & (IMAGEFILE|MOVIEFILE))
- params->display= FILE_IMGDISPLAY;
- else
- params->display= FILE_SHORTDISPLAY;
+ if (U.uiflag & USER_SHOW_THUMBNAILS) {
+ if(params->filter & (IMAGEFILE|MOVIEFILE))
+ params->display= FILE_IMGDISPLAY;
+ else
+ params->display= FILE_SHORTDISPLAY;
+ } else {
+ params->display= FILE_SHORTDISPLAY;
+ }
+
} else {
/* default values, if no operator */
params->type = FILE_UNIX;
@@ -281,21 +289,78 @@ void ED_fileselect_layout_tilepos(FileLayout* layout, int tile, int *x, int *y)
}
}
+/* Shorten a string to a given width w.
+ If front is set, shorten from the front,
+ otherwise shorten from the end. */
+float file_shorten_string(char* string, float w, int front)
+{
+ char temp[FILE_MAX];
+ short shortened = 0;
+ float sw = 0;
+ float pad = 0;
+
+ if (w <= 0) {
+ *string = '\0';
+ return 0.0;
+ }
+
+ sw = file_string_width(string);
+ if (front == 1) {
+ char *s = string;
+ BLI_strncpy(temp, "...", 4);
+ pad = file_string_width(temp);
+ while ((*s) && (sw+pad>w)) {
+ s++;
+ sw = file_string_width(s);
+ shortened = 1;
+ }
+ if (shortened) {
+ int slen = strlen(s);
+ BLI_strncpy(temp+3, s, slen+1);
+ temp[slen+4] = '\0';
+ BLI_strncpy(string, temp, slen+4);
+ }
+ } else {
+ char *s = string;
+ while (sw>w) {
+ int slen = strlen(string);
+ string[slen-1] = '\0';
+ sw = file_string_width(s);
+ shortened = 1;
+ }
+
+ if (shortened) {
+ int slen = strlen(string);
+ if (slen > 3) {
+ BLI_strncpy(string+slen-3, "...", 4);
+ }
+ }
+ }
+
+ return sw;
+}
+
float file_string_width(const char* str)
{
uiStyle *style= U.uistyles.first;
uiStyleFontSet(&style->widget);
- return BLF_width(style->widget.uifont_id, (char *)str);
+ return BLF_width(style->widget.uifont_id, str);
}
float file_font_pointsize()
{
+#if 0
float s;
char tmp[2] = "X";
uiStyle *style= U.uistyles.first;
uiStyleFontSet(&style->widget);
s = BLF_height(style->widget.uifont_id, tmp);
return style->widget.points;
+#else
+ uiStyle *style= U.uistyles.first;
+ uiStyleFontSet(&style->widget);
+ return style->widget.points;
+#endif
}
static void column_widths(struct FileList* files, struct FileLayout* layout)
@@ -313,7 +378,7 @@ static void column_widths(struct FileList* files, struct FileLayout* layout)
if (file) {
int len;
len = file_string_width(file->relname);
- if (len > layout->column_widths[COLUMN_NAME]) layout->column_widths[COLUMN_NAME] = len + 20;
+ if (len > layout->column_widths[COLUMN_NAME]) layout->column_widths[COLUMN_NAME] = len;
len = file_string_width(file->date);
if (len > layout->column_widths[COLUMN_DATE]) layout->column_widths[COLUMN_DATE] = len;
len = file_string_width(file->time);
@@ -385,11 +450,12 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar)
column_widths(sfile->files, layout);
if (params->display == FILE_SHORTDISPLAY) {
- maxlen = layout->column_widths[COLUMN_NAME] + 12 +
- layout->column_widths[COLUMN_SIZE];
- maxlen += 20; // for icon
+ maxlen = ICON_DEFAULT_WIDTH + 4 +
+ layout->column_widths[COLUMN_NAME] + 12 +
+ layout->column_widths[COLUMN_SIZE] + 12;
} else {
- maxlen = layout->column_widths[COLUMN_NAME] + 12 +
+ maxlen = ICON_DEFAULT_WIDTH + 4 +
+ layout->column_widths[COLUMN_NAME] + 12 +
#ifndef WIN32
layout->column_widths[COLUMN_MODE1] + 12 +
layout->column_widths[COLUMN_MODE2] + 12 +
@@ -398,8 +464,8 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar)
#endif
layout->column_widths[COLUMN_DATE] + 12 +
layout->column_widths[COLUMN_TIME] + 12 +
- layout->column_widths[COLUMN_SIZE];
- maxlen += 20; // for icon
+ layout->column_widths[COLUMN_SIZE] + 12;
+
}
layout->tile_w = maxlen;
if(layout->rows > 0)
@@ -463,7 +529,7 @@ int file_select_match(struct SpaceFile *sfile, const char *pattern)
return match;
}
-void autocomplete_directory(struct bContext *C, char *str, void *arg_v)
+void autocomplete_directory(struct bContext *C, char *str, void *UNUSED(arg_v))
{
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -510,7 +576,7 @@ void autocomplete_directory(struct bContext *C, char *str, void *arg_v)
}
}
-void autocomplete_file(struct bContext *C, char *str, void *arg_v)
+void autocomplete_file(struct bContext *C, char *str, void *UNUSED(arg_v))
{
SpaceFile *sfile= CTX_wm_space_file(C);
diff --git a/source/blender/editors/space_file/fsmenu.c b/source/blender/editors/space_file/fsmenu.c
index a043fc8cfd1..2856f0f4fdf 100644
--- a/source/blender/editors/space_file/fsmenu.c
+++ b/source/blender/editors/space_file/fsmenu.c
@@ -157,7 +157,7 @@ short fsmenu_can_save (struct FSMenu* fsmenu, FSMenuCategory category, int idx)
return fsme?fsme->save:0;
}
-void fsmenu_insert_entry(struct FSMenu* fsmenu, FSMenuCategory category, char *path, int sorted, short save)
+void fsmenu_insert_entry(struct FSMenu* fsmenu, FSMenuCategory category, const char *path, int sorted, short save)
{
FSMenuEntry *prev;
FSMenuEntry *fsme;
diff --git a/source/blender/editors/space_file/fsmenu.h b/source/blender/editors/space_file/fsmenu.h
index dcf8d3eb632..d499f439f65 100644
--- a/source/blender/editors/space_file/fsmenu.h
+++ b/source/blender/editors/space_file/fsmenu.h
@@ -56,7 +56,7 @@ char* fsmenu_get_entry (struct FSMenu* fsmenu, FSMenuCategory category, int ind
* Duplicate entries are not added.
* @param sorted Should entry be inserted in sorted order?
*/
-void fsmenu_insert_entry (struct FSMenu* fsmenu, FSMenuCategory category, char *path, int sorted, short save);
+void fsmenu_insert_entry (struct FSMenu* fsmenu, FSMenuCategory category, const char *path, int sorted, short save);
/** Return whether the entry was created by the user and can be saved and deleted */
short fsmenu_can_save (struct FSMenu* fsmenu, FSMenuCategory category, int index);
diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c
index 0cd721964bd..b8ffc73caf0 100644
--- a/source/blender/editors/space_file/space_file.c
+++ b/source/blender/editors/space_file/space_file.c
@@ -42,6 +42,7 @@
#include "BLI_math.h"
#include "BLI_rand.h"
#include "BLI_storage_types.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -66,7 +67,7 @@
/* ******************** default callbacks for file space ***************** */
-static SpaceLink *file_new(const bContext *C)
+static SpaceLink *file_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceFile *sfile;
@@ -143,7 +144,7 @@ static void file_free(SpaceLink *sl)
/* spacetype; init callback, area size changes, screen set, etc */
-static void file_init(struct wmWindowManager *wm, ScrArea *sa)
+static void file_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa)
{
SpaceFile *sfile= (SpaceFile*)sa->spacedata.first;
//printf("file_init\n");
@@ -178,7 +179,7 @@ static SpaceLink *file_duplicate(SpaceLink *sl)
return (SpaceLink *)sfilen;
}
-static void file_refresh(const bContext *C, ScrArea *sa)
+static void file_refresh(const bContext *C, ScrArea *UNUSED(sa))
{
SpaceFile *sfile= CTX_wm_space_file(C);
FileSelectParams *params = ED_fileselect_get_params(sfile);
@@ -327,6 +328,13 @@ static void file_main_area_draw(const bContext *C, ARegion *ar)
v2d->scroll = V2D_SCROLL_BOTTOM;
v2d->keepofs &= ~V2D_LOCKOFS_X;
v2d->keepofs |= V2D_LOCKOFS_Y;
+
+ /* XXX this happens on scaling down Screen (like from startup.blend) */
+ /* view2d has no type specific for filewindow case, which doesnt scroll vertically */
+ if(v2d->cur.ymax < 0) {
+ v2d->cur.ymin -= v2d->cur.ymax;
+ v2d->cur.ymax= 0;
+ }
}
/* v2d has initialized flag, so this call will only set the mask correct */
UI_view2d_region_reinit(v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
@@ -335,7 +343,7 @@ static void file_main_area_draw(const bContext *C, ARegion *ar)
file_calc_previews(C, ar);
/* set view */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* on first read, find active file */
if (params->active_file == -1) {
@@ -377,6 +385,7 @@ void file_operatortypes(void)
WM_operatortype_append(FILE_OT_delete);
WM_operatortype_append(FILE_OT_rename);
WM_operatortype_append(FILE_OT_smoothscroll);
+ WM_operatortype_append(FILE_OT_directory);
}
/* NOTE: do not add .blend file reading on this level */
@@ -457,7 +466,7 @@ static void file_channel_area_draw(const bContext *C, ARegion *ar)
ED_region_panels(C, ar, 1, NULL, -1);
}
-static void file_channel_area_listener(ARegion *ar, wmNotifier *wmn)
+static void file_channel_area_listener(ARegion *UNUSED(ar), wmNotifier *wmn)
{
/* context changes */
switch(wmn->category) {
@@ -505,7 +514,7 @@ static void file_ui_area_draw(const bContext *C, ARegion *ar)
glClear(GL_COLOR_BUFFER_BIT);
/* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(C, &ar->v2d);
+ UI_view2d_view_ortho(&ar->v2d);
file_draw_buttons(C, ar);
diff --git a/source/blender/editors/space_file/writeimage.c b/source/blender/editors/space_file/writeimage.c
deleted file mode 100644
index b69bfdc0231..00000000000
--- a/source/blender/editors/space_file/writeimage.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <string.h>
-
-
-#include "IMB_imbuf.h"
-#include "IMB_imbuf_types.h"
-
-#include "BLI_blenlib.h"
-
-#include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_space_types.h"
-
-#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_image.h"
-
-#include "RE_pipeline.h"
-
-#include "file_intern.h"
-
-/* XXX */
-static void error(const char *dummy) {}
-static void waitcursor(int val) {}
-static void activate_fileselect(int d1, char *d2, char *d3, void *d4) {}
-static int saveover(const char *dummy) {return 0;}
-/* XXX */
-
-
-/* ------------------------------------------------------------------------- */
-
-/* callback for fileselect to save rendered image, renderresult was checked to exist */
-static void save_rendered_image_cb_real(char *name, int confirm)
-{
- Scene *scene= NULL; // XXX
- char str[FILE_MAXDIR+FILE_MAXFILE];
- int overwrite;
-
- if(BLI_testextensie(name,".blend")) {
- error("Wrong filename");
- return;
- }
-
- /* BKE_add_image_extension() checks for if extension was already set */
- if(scene->r.scemode & R_EXTENSION)
- if(strlen(name)<FILE_MAXDIR+FILE_MAXFILE-5)
- BKE_add_image_extension(name, scene->r.imtype);
-
- strcpy(str, name);
- BLI_path_abs(str, G.sce);
-
- if (confirm)
- overwrite = saveover(str);
- else
- overwrite = 1;
-
- if(overwrite) {
- if(scene->r.imtype==R_MULTILAYER) {
- Render *re= RE_GetRender(scene->id.name);
- RenderResult *rr= RE_AcquireResultRead(re);
- if(rr)
- RE_WriteRenderResult(rr, str, scene->r.quality);
- RE_ReleaseResult(re);
- }
- else {
- Render *re= RE_GetRender(scene->id.name);
- RenderResult rres;
- ImBuf *ibuf;
-
- RE_AcquireResultImage(re, &rres);
-
- waitcursor(1); /* from screen.c */
-
- ibuf= IMB_allocImBuf(rres.rectx, rres.recty, scene->r.planes, 0, 0);
- ibuf->rect= (unsigned int *)rres.rect32;
- ibuf->rect_float= rres.rectf;
- ibuf->zbuf_float= rres.rectz;
-
- /* float factor for random dither, imbuf takes care of it */
- ibuf->dither= scene->r.dither_intensity;
-
- BKE_write_ibuf(scene, ibuf, str, scene->r.imtype, scene->r.subimtype, scene->r.quality);
- IMB_freeImBuf(ibuf); /* imbuf knows rects are not part of ibuf */
-
- RE_ReleaseResultImage(re);
- }
-
- strcpy(G.ima, name);
-
- waitcursor(0);
- }
-}
-
-
-void save_image_filesel_str(Scene *scene, char *str)
-{
- switch(scene->r.imtype) {
-#ifdef WITH_HDR
- case R_RADHDR:
- strcpy(str, "Save Radiance HDR");
- break;
-#endif
- case R_FFMPEG:
- case R_H264:
- case R_XVID:
- case R_THEORA:
- case R_PNG:
- strcpy(str, "Save PNG");
- break;
-#ifdef WITH_DDS
- case R_DDS:
- strcpy(str, "Save DDS");
- break;
-#endif
- case R_BMP:
- strcpy(str, "Save BMP");
- break;
-#ifdef WITH_TIFF
- case R_TIFF:
- strcpy(str, "Save TIFF");
- break;
-#endif
-#ifdef WITH_OPENEXR
- case R_OPENEXR:
- strcpy(str, "Save OpenEXR");
- break;
-#endif
-#ifdef WITH_CINEON
- case R_CINEON:
- strcpy(str, "Save Cineon");
- break;
- case R_DPX:
- strcpy(str, "Save DPX");
- break;
-#endif
- case R_RAWTGA:
- strcpy(str, "Save Raw Targa");
- break;
- case R_IRIS:
- strcpy(str, "Save IRIS");
- break;
- case R_IRIZ:
- strcpy(str, "Save IRIS");
- break;
- case R_TARGA:
- strcpy(str, "Save Targa");
- break;
- case R_MULTILAYER:
- strcpy(str, "Save Multi Layer EXR");
- break;
-#ifdef WITH_OPENJPEG
- case R_JP2:
- strcpy(str, "Save JPEG2000");
- break;
-#endif
- /* default we save jpeg, also for all movie formats */
- case R_JPEG90:
- case R_AVICODEC:
- case R_AVIRAW:
- case R_AVIJPEG:
- default:
- strcpy(str, "Save JPEG");
- break;
- }
-}
-
-static void save_rendered_image_cb(char *name)
-{
- save_rendered_image_cb_real(name, 1);
-}
-
-/* no fileselect, no confirm */
-void BIF_save_rendered_image(char *name)
-{
- save_rendered_image_cb_real(name, 0);
-}
-
-/* calls fileselect */
-void BIF_save_rendered_image_fs(Scene *scene)
-{
- Render *re= RE_GetRender(scene->id.name);
- RenderResult rres;
-
- RE_AcquireResultImage(re, &rres);
-
- if(!rres.rectf && !rres.rect32) {
- error("No image rendered");
- }
- else {
- char dir[FILE_MAXDIR * 2], str[FILE_MAXFILE * 2];
-
- if(G.ima[0]==0) {
- strcpy(dir, G.sce);
- BLI_splitdirstring(dir, str);
- strcpy(G.ima, dir);
- }
-
- save_image_filesel_str(scene, str);
- activate_fileselect(FILE_SPECIAL, str, G.ima, save_rendered_image_cb);
- }
-
- RE_ReleaseResultImage(re);
-}
-
-
diff --git a/source/blender/editors/space_graph/CMakeLists.txt b/source/blender/editors/space_graph/CMakeLists.txt
index 33ddbcea019..e57bf83cb12 100644
--- a/source/blender/editors/space_graph/CMakeLists.txt
+++ b/source/blender/editors/space_graph/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -32,4 +30,16 @@ SET(INC
../../../../intern/audaspace/intern
)
-BLENDERLIB(bf_editor_space_graph "${SRC}" "${INC}")
+set(SRC
+ graph_buttons.c
+ graph_draw.c
+ graph_edit.c
+ graph_ops.c
+ graph_select.c
+ graph_utils.c
+ space_graph.c
+
+ graph_intern.h
+)
+
+blender_add_lib(bf_editor_space_graph "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_graph/Makefile b/source/blender/editors/space_graph/Makefile
deleted file mode 100644
index 1ac744af239..00000000000
--- a/source/blender/editors/space_graph/Makefile
+++ /dev/null
@@ -1,58 +0,0 @@
-# -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*-
-# vim: tabstop=8
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_graph
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-
-# own include
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c
index f4567255b91..635044fa795 100644
--- a/source/blender/editors/space_graph/graph_buttons.c
+++ b/source/blender/editors/space_graph/graph_buttons.c
@@ -41,6 +41,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
@@ -76,7 +77,7 @@
/* -------------- */
-static void do_graph_region_buttons(bContext *C, void *arg, int event)
+static void do_graph_region_buttons(bContext *UNUSED(C), void *UNUSED(arg), int event)
{
//Scene *scene= CTX_data_scene(C);
@@ -116,7 +117,7 @@ static int graph_panel_context(const bContext *C, bAnimListElem **ale, FCurve **
return 1;
}
-static int graph_panel_poll(const bContext *C, PanelType *pt)
+static int graph_panel_poll(const bContext *C, PanelType *UNUSED(pt))
{
return graph_panel_context(C, NULL, NULL);
}
@@ -138,19 +139,19 @@ static void graph_panel_view(const bContext *C, Panel *pa)
/* 2D-Cursor */
col= uiLayoutColumn(pa->layout, 0);
- uiItemR(col, &spaceptr, "show_cursor", 0, NULL, 0);
+ uiItemR(col, &spaceptr, "show_cursor", 0, NULL, ICON_NULL);
subcol= uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(&spaceptr, "show_cursor"));
- uiItemO(subcol, "Cursor from Selection", 0, "GRAPH_OT_frame_jump");
+ uiItemO(subcol, "Cursor from Selection", ICON_NULL, "GRAPH_OT_frame_jump");
subcol= uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(&spaceptr, "show_cursor"));
row= uiLayoutSplit(subcol, 0.7, 1);
- uiItemR(row, &sceneptr, "frame_current", 0, "Cursor X", 0);
+ uiItemR(row, &sceneptr, "frame_current", 0, "Cursor X", ICON_NULL);
uiItemEnumO(row, "GRAPH_OT_snap", "To Keys", 0, "type", GRAPHKEYS_SNAP_CFRA);
row= uiLayoutSplit(subcol, 0.7, 1);
- uiItemR(row, &spaceptr, "cursor_position_y", 0, "Cursor Y", 0);
+ uiItemR(row, &spaceptr, "cursor_position_y", 0, "Cursor Y", ICON_NULL);
uiItemEnumO(row, "GRAPH_OT_snap", "To Keys", 0, "type", GRAPHKEYS_SNAP_VALUE);
}
@@ -186,18 +187,18 @@ static void graph_panel_properties(const bContext *C, Panel *pa)
col= uiLayoutColumn(layout, 1);
uiLayoutSetEnabled(col, (fcu->flag & FCURVE_DISABLED)!=0);
uiItemR(col, &fcu_ptr, "data_path", 0, "", ICON_RNA);
- uiItemR(col, &fcu_ptr, "array_index", 0, NULL, 0);
+ uiItemR(col, &fcu_ptr, "array_index", 0, NULL, ICON_NULL);
/* color settings */
col= uiLayoutColumn(layout, 1);
- uiItemL(col, "Display Color:", 0);
+ uiItemL(col, "Display Color:", ICON_NULL);
row= uiLayoutRow(col, 1);
- uiItemR(row, &fcu_ptr, "color_mode", 0, "", 0);
+ uiItemR(row, &fcu_ptr, "color_mode", 0, "", ICON_NULL);
subrow= uiLayoutRow(row, 1);
uiLayoutSetEnabled(subrow, (fcu->color_mode==FCURVE_COLOR_CUSTOM));
- uiItemR(subrow, &fcu_ptr, "color", 0, "", 0);
+ uiItemR(subrow, &fcu_ptr, "color", 0, "", ICON_NULL);
MEM_freeN(ale);
}
@@ -263,23 +264,34 @@ static void graph_panel_key_properties(const bContext *C, Panel *pa)
/* interpolation */
col= uiLayoutColumn(layout, 0);
- uiItemR(col, &bezt_ptr, "interpolation", 0, NULL, 0);
+ uiItemR(col, &bezt_ptr, "interpolation", 0, NULL, ICON_NULL);
/* numerical coordinate editing */
col= uiLayoutColumn(layout, 1);
/* keyframe itself */
- uiItemR(col, &bezt_ptr, "co", 0, "Key", 0);
+ uiItemR(col, &bezt_ptr, "co", 0, "Key", ICON_NULL);
/* previous handle - only if previous was Bezier interpolation */
if ((prevbezt) && (prevbezt->ipo == BEZT_IPO_BEZ))
- uiItemR(col, &bezt_ptr, "handle_left", 0, NULL, 0);
+ uiItemR(col, &bezt_ptr, "handle_left", 0, NULL, ICON_NULL);
/* next handle - only if current is Bezier interpolation */
if (bezt->ipo == BEZT_IPO_BEZ)
- uiItemR(col, &bezt_ptr, "handle_right", 0, NULL, 0);
+ uiItemR(col, &bezt_ptr, "handle_right", 0, NULL, ICON_NULL);
+ }
+ else {
+ if ((fcu->bezt == NULL) && (fcu->modifiers.first)) {
+ /* modifiers only - so no keyframes to be active */
+ uiItemL(layout, "F-Curve only has F-Modifiers", ICON_NULL);
+ uiItemL(layout, "See Modifiers panel below", ICON_INFO);
+ }
+ else if (fcu->fpt) {
+ /* samples only */
+ uiItemL(layout, "F-Curve doesn't have any keyframes as it only contains sampled points", ICON_NULL);
+ }
+ else
+ uiItemL(layout, "No active keyframe on F-Curve", ICON_NULL);
}
- else
- uiItemL(layout, "No active keyframe on F-Curve", 0);
MEM_freeN(ale);
}
@@ -288,7 +300,7 @@ static void graph_panel_key_properties(const bContext *C, Panel *pa)
#define B_IPO_DEPCHANGE 10
-static void do_graph_region_driver_buttons(bContext *C, void *arg, int event)
+static void do_graph_region_driver_buttons(bContext *C, void *UNUSED(arg), int event)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -310,22 +322,23 @@ static void do_graph_region_driver_buttons(bContext *C, void *arg, int event)
}
/* callback to remove the active driver */
-static void driver_remove_cb (bContext *C, void *ale_v, void *dummy_v)
+static void driver_remove_cb (bContext *C, void *ale_v, void *UNUSED(arg))
{
bAnimListElem *ale= (bAnimListElem *)ale_v;
ID *id= ale->id;
FCurve *fcu= ale->data;
+ ReportList *reports = CTX_wm_reports(C);
/* try to get F-Curve that driver lives on, and ID block which has this AnimData */
if (ELEM(NULL, id, fcu))
return;
/* call API method to remove this driver */
- ANIM_remove_driver(id, fcu->rna_path, fcu->array_index, 0);
+ ANIM_remove_driver(reports, id, fcu->rna_path, fcu->array_index, 0);
}
/* callback to add a target variable to the active driver */
-static void driver_add_var_cb (bContext *C, void *driver_v, void *dummy_v)
+static void driver_add_var_cb (bContext *UNUSED(C), void *driver_v, void *UNUSED(arg))
{
ChannelDriver *driver= (ChannelDriver *)driver_v;
@@ -334,7 +347,7 @@ static void driver_add_var_cb (bContext *C, void *driver_v, void *dummy_v)
}
/* callback to remove target variable from active driver */
-static void driver_delete_var_cb (bContext *C, void *driver_v, void *dvar_v)
+static void driver_delete_var_cb (bContext *UNUSED(C), void *driver_v, void *dvar_v)
{
ChannelDriver *driver= (ChannelDriver *)driver_v;
DriverVar *dvar= (DriverVar *)dvar_v;
@@ -344,7 +357,7 @@ static void driver_delete_var_cb (bContext *C, void *driver_v, void *dvar_v)
}
/* callback to reset the driver's flags */
-static void driver_update_flags_cb (bContext *C, void *fcu_v, void *dummy_v)
+static void driver_update_flags_cb (bContext *UNUSED(C), void *fcu_v, void *UNUSED(arg))
{
FCurve *fcu= (FCurve *)fcu_v;
ChannelDriver *driver= fcu->driver;
@@ -355,7 +368,7 @@ static void driver_update_flags_cb (bContext *C, void *fcu_v, void *dummy_v)
}
/* drivers panel poll */
-static int graph_panel_drivers_poll(const bContext *C, PanelType *pt)
+static int graph_panel_drivers_poll(const bContext *C, PanelType *UNUSED(pt))
{
SpaceIpo *sipo= CTX_wm_space_graph(C);
@@ -365,9 +378,8 @@ static int graph_panel_drivers_poll(const bContext *C, PanelType *pt)
return graph_panel_context(C, NULL, NULL);
}
-
/* settings for 'single property' driver variable type */
-static void graph_panel_driverVar__singleProp(const bContext *C, uiLayout *layout, ID *id, DriverVar *dvar)
+static void graph_panel_driverVar__singleProp(uiLayout *layout, ID *id, DriverVar *dvar)
{
DriverTarget *dtar= &dvar->targets[0];
PointerRNA dtar_ptr;
@@ -379,7 +391,7 @@ static void graph_panel_driverVar__singleProp(const bContext *C, uiLayout *layou
/* Target ID */
row= uiLayoutRow(layout, 0);
- uiTemplateAnyID(row, (bContext *)C, &dtar_ptr, "id", "id_type", "Prop:");
+ uiTemplateAnyID(row, &dtar_ptr, "id", "id_type", "Prop:");
/* Target Property */
// TODO: make this less technical...
@@ -392,12 +404,12 @@ static void graph_panel_driverVar__singleProp(const bContext *C, uiLayout *layou
col= uiLayoutColumn(layout, 1);
block= uiLayoutGetBlock(col);
/* rna path */
- uiTemplatePathBuilder(col, (bContext *)C, &dtar_ptr, "data_path", &root_ptr, "Path");
+ uiTemplatePathBuilder(col, &dtar_ptr, "data_path", &root_ptr, "Path");
}
}
/* settings for 'rotation difference' driver variable type */
-static void graph_panel_driverVar__rotDiff(const bContext *C, uiLayout *layout, ID *id, DriverVar *dvar)
+static void graph_panel_driverVar__rotDiff(uiLayout *layout, ID *id, DriverVar *dvar)
{
DriverTarget *dtar= &dvar->targets[0];
DriverTarget *dtar2= &dvar->targets[1];
@@ -412,7 +424,7 @@ static void graph_panel_driverVar__rotDiff(const bContext *C, uiLayout *layout,
/* Bone 1 */
col= uiLayoutColumn(layout, 1);
- uiTemplateAnyID(col, (bContext *)C, &dtar_ptr, "id", "id_type", "Bone 1:");
+ uiTemplateAnyID(col, &dtar_ptr, "id", "id_type", "Bone 1:");
if (dtar->id && ob1->pose) {
PointerRNA tar_ptr;
@@ -422,7 +434,7 @@ static void graph_panel_driverVar__rotDiff(const bContext *C, uiLayout *layout,
}
col= uiLayoutColumn(layout, 1);
- uiTemplateAnyID(col, (bContext *)C, &dtar2_ptr, "id", "id_type", "Bone 2:");
+ uiTemplateAnyID(col, &dtar2_ptr, "id", "id_type", "Bone 2:");
if (dtar2->id && ob2->pose) {
PointerRNA tar_ptr;
@@ -433,7 +445,7 @@ static void graph_panel_driverVar__rotDiff(const bContext *C, uiLayout *layout,
}
/* settings for 'location difference' driver variable type */
-static void graph_panel_driverVar__locDiff(const bContext *C, uiLayout *layout, ID *id, DriverVar *dvar)
+static void graph_panel_driverVar__locDiff(uiLayout *layout, ID *id, DriverVar *dvar)
{
DriverTarget *dtar= &dvar->targets[0];
DriverTarget *dtar2= &dvar->targets[1];
@@ -448,7 +460,7 @@ static void graph_panel_driverVar__locDiff(const bContext *C, uiLayout *layout,
/* Bone 1 */
col= uiLayoutColumn(layout, 1);
- uiTemplateAnyID(col, (bContext *)C, &dtar_ptr, "id", "id_type", "Ob/Bone 1:");
+ uiTemplateAnyID(col, &dtar_ptr, "id", "id_type", "Ob/Bone 1:");
if (dtar->id && ob1->pose) {
PointerRNA tar_ptr;
@@ -457,10 +469,10 @@ static void graph_panel_driverVar__locDiff(const bContext *C, uiLayout *layout,
uiItemPointerR(col, &dtar_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA);
}
- uiItemR(col, &dtar_ptr, "use_local_space_transform", 0, NULL, 0);
+ uiItemR(col, &dtar_ptr, "use_local_space_transform", 0, NULL, ICON_NULL);
col= uiLayoutColumn(layout, 1);
- uiTemplateAnyID(col, (bContext *)C, &dtar2_ptr, "id", "id_type", "Ob/Bone 2:");
+ uiTemplateAnyID(col, &dtar2_ptr, "id", "id_type", "Ob/Bone 2:");
if (dtar2->id && ob2->pose) {
PointerRNA tar_ptr;
@@ -469,11 +481,11 @@ static void graph_panel_driverVar__locDiff(const bContext *C, uiLayout *layout,
uiItemPointerR(col, &dtar2_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA);
}
- uiItemR(col, &dtar2_ptr, "use_local_space_transform", 0, NULL, 0);
+ uiItemR(col, &dtar2_ptr, "use_local_space_transform", 0, NULL, ICON_NULL);
}
/* settings for 'transform channel' driver variable type */
-static void graph_panel_driverVar__transChan(const bContext *C, uiLayout *layout, ID *id, DriverVar *dvar)
+static void graph_panel_driverVar__transChan(uiLayout *layout, ID *id, DriverVar *dvar)
{
DriverTarget *dtar= &dvar->targets[0];
Object *ob = (Object *)dtar->id;
@@ -485,7 +497,7 @@ static void graph_panel_driverVar__transChan(const bContext *C, uiLayout *layout
/* properties */
col= uiLayoutColumn(layout, 1);
- uiTemplateAnyID(col, (bContext *)C, &dtar_ptr, "id", "id_type", "Ob/Bone:");
+ uiTemplateAnyID(col, &dtar_ptr, "id", "id_type", "Ob/Bone:");
if (dtar->id && ob->pose) {
PointerRNA tar_ptr;
@@ -495,8 +507,8 @@ static void graph_panel_driverVar__transChan(const bContext *C, uiLayout *layout
}
row= uiLayoutRow(layout, 1);
- uiItemR(row, &dtar_ptr, "transform_type", 0, "", 0);
- uiItemR(row, &dtar_ptr, "use_local_space_transform", 0, NULL, 0);
+ uiItemR(row, &dtar_ptr, "transform_type", 0, "", ICON_NULL);
+ uiItemR(row, &dtar_ptr, "use_local_space_transform", 0, NULL, ICON_NULL);
}
/* driver settings for active F-Curve (only for 'Drivers' mode) */
@@ -535,12 +547,12 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
col= uiLayoutColumn(pa->layout, 1);
block= uiLayoutGetBlock(col);
- uiItemR(col, &driver_ptr, "type", 0, NULL, 0);
+ uiItemR(col, &driver_ptr, "type", 0, NULL, ICON_NULL);
/* show expression box if doing scripted drivers, and/or error messages when invalid drivers exist */
if (driver->type == DRIVER_TYPE_PYTHON) {
/* expression */
- uiItemR(col, &driver_ptr, "expression", 0, "Expr", 0);
+ uiItemR(col, &driver_ptr, "expression", 0, "Expr", ICON_NULL);
/* errors? */
if (driver->flag & DRIVER_FLAG_INVALID)
@@ -554,17 +566,17 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
col= uiLayoutColumn(pa->layout, 1);
/* debug setting */
- uiItemR(col, &driver_ptr, "show_debug_info", 0, NULL, 0);
+ uiItemR(col, &driver_ptr, "show_debug_info", 0, NULL, ICON_NULL);
/* value of driver */
if (driver->flag & DRIVER_FLAG_SHOWDEBUG) {
uiLayout *row= uiLayoutRow(col, 1);
char valBuf[32];
- uiItemL(row, "Driver Value:", 0);
+ uiItemL(row, "Driver Value:", ICON_NULL);
sprintf(valBuf, "%.3f", driver->curval);
- uiItemL(row, valBuf, 0);
+ uiItemL(row, valBuf, ICON_NULL);
}
/* add driver variables */
@@ -589,7 +601,7 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
row= uiLayoutRow(box, 0);
block= uiLayoutGetBlock(row);
/* variable name */
- uiItemR(row, &dvar_ptr, "name", 0, "", 0);
+ uiItemR(row, &dvar_ptr, "name", 0, "", ICON_NULL);
/* remove button */
uiBlockSetEmboss(block, UI_EMBOSSN);
@@ -599,37 +611,36 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
/* variable type */
row= uiLayoutRow(box, 0);
- uiItemR(row, &dvar_ptr, "type", 0, "", 0);
+ uiItemR(row, &dvar_ptr, "type", 0, "", ICON_NULL);
/* variable type settings */
box= uiLayoutBox(col);
/* controls to draw depends on the type of variable */
switch (dvar->type) {
case DVAR_TYPE_SINGLE_PROP: /* single property */
- graph_panel_driverVar__singleProp(C, box, ale->id, dvar);
+ graph_panel_driverVar__singleProp(box, ale->id, dvar);
break;
case DVAR_TYPE_ROT_DIFF: /* rotational difference */
- graph_panel_driverVar__rotDiff(C, box, ale->id, dvar);
+ graph_panel_driverVar__rotDiff(box, ale->id, dvar);
break;
case DVAR_TYPE_LOC_DIFF: /* location difference */
- graph_panel_driverVar__locDiff(C, box, ale->id, dvar);
+ graph_panel_driverVar__locDiff(box, ale->id, dvar);
break;
case DVAR_TYPE_TRANSFORM_CHAN: /* transform channel */
- graph_panel_driverVar__transChan(C, box, ale->id, dvar);
+ graph_panel_driverVar__transChan(box, ale->id, dvar);
break;
}
/* value of variable */
if (driver->flag & DRIVER_FLAG_SHOWDEBUG) {
- uiLayout *row;
char valBuf[32];
box= uiLayoutBox(col);
row= uiLayoutRow(box, 1);
- uiItemL(row, "Value:", 0);
+ uiItemL(row, "Value:", ICON_NULL);
sprintf(valBuf, "%.3f", dvar->curval);
- uiItemL(row, valBuf, 0);
+ uiItemL(row, valBuf, ICON_NULL);
}
}
@@ -642,7 +653,7 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
#define B_FMODIFIER_REDRAW 20
-static void do_graph_region_modifier_buttons(bContext *C, void *arg, int event)
+static void do_graph_region_modifier_buttons(bContext *C, void *UNUSED(arg), int event)
{
switch (event) {
case B_REDR:
@@ -733,7 +744,7 @@ void graph_buttons_register(ARegionType *art)
BLI_addtail(&art->paneltypes, pt);
}
-static int graph_properties(bContext *C, wmOperator *op)
+static int graph_properties(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= graph_has_buttons_region(sa);
@@ -748,9 +759,10 @@ void GRAPH_OT_properties(wmOperatorType *ot)
{
ot->name= "Properties";
ot->idname= "GRAPH_OT_properties";
+ ot->description= "Toggle display properties panel";
ot->exec= graph_properties;
- ot->poll= ED_operator_ipo_active; // xxx
+ ot->poll= ED_operator_graphedit_active;
/* flags */
ot->flag= 0;
diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c
index f780a6c31ee..901ede9fff7 100644
--- a/source/blender/editors/space_graph/graph_draw.c
+++ b/source/blender/editors/space_graph/graph_draw.c
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_object_types.h"
@@ -48,7 +49,7 @@
#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_fcurve.h"
-#include "BKE_utildefines.h"
+
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -70,7 +71,7 @@
*/
#define drawFCurveFade(fcu) ( ((fcu)->flag & FCURVE_SELECTED)? 1.0f : 0.25f )
-/* set the colour for some point from some value given packed into an int
+/* set the color for some point from some value given packed into an int
* - intV: integer value containing color info packed into an int
* - alpha: float value describing the
*/
@@ -87,7 +88,7 @@
/* Envelope -------------- */
// TODO: draw a shaded poly showing the region of influence too!!!
-static void draw_fcurve_modifier_controls_envelope (FCurve *fcu, FModifier *fcm, View2D *v2d)
+static void draw_fcurve_modifier_controls_envelope (FModifier *fcm, View2D *v2d)
{
FMod_Envelope *env= (FMod_Envelope *)fcm->data;
FCM_EnvelopeData *fed;
@@ -137,7 +138,7 @@ static void draw_fcurve_modifier_controls_envelope (FCurve *fcu, FModifier *fcm,
/* Points ---------------- */
/* helper func - draw keyframe vertices only for an F-Curve */
-static void draw_fcurve_vertices_keyframes (bAnimContext *ac, FCurve *fcu, View2D *v2d, short edit, short sel)
+static void draw_fcurve_vertices_keyframes (FCurve *fcu, SpaceIpo *UNUSED(sipo), View2D *v2d, short edit, short sel)
{
BezTriple *bezt= fcu->bezt;
const float fac= 0.05f * (v2d->cur.xmax - v2d->cur.xmin);
@@ -209,7 +210,7 @@ static void draw_fcurve_handle_control (float x, float y, float xscale, float ys
}
/* helper func - draw handle vertices only for an F-Curve (if it is not protected) */
-static void draw_fcurve_vertices_handles (bAnimContext *ac, SpaceIpo *sipo, FCurve *fcu, View2D *v2d, short sel)
+static void draw_fcurve_vertices_handles (FCurve *fcu, SpaceIpo *sipo, View2D *v2d, short sel, short sel_handle_only)
{
BezTriple *bezt= fcu->bezt;
BezTriple *prevbezt = NULL;
@@ -225,7 +226,7 @@ static void draw_fcurve_vertices_handles (bAnimContext *ac, SpaceIpo *sipo, FCur
else UI_ThemeColor(TH_HANDLE_VERTEX);
/* anti-aliased lines for more consistent appearance */
- glEnable(GL_LINE_SMOOTH);
+ if ((sipo->flag & SIPO_BEAUTYDRAW_OFF)==0) glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
for (i=0; i < fcu->totvert; i++, prevbezt=bezt, bezt++) {
@@ -237,7 +238,7 @@ static void draw_fcurve_vertices_handles (bAnimContext *ac, SpaceIpo *sipo, FCur
* Also, need to take into account whether the keyframe was selected
* if a Graph Editor option to only show handles of selected keys is on.
*/
- if ( !(sipo->flag & SIPO_SELVHANDLESONLY) || BEZSELECTED(bezt) ) {
+ if ( !sel_handle_only || BEZSELECTED(bezt) ) {
if ( (!prevbezt && (bezt->ipo==BEZT_IPO_BEZ)) || (prevbezt && (prevbezt->ipo==BEZT_IPO_BEZ)) ) {
if ((bezt->f1 & SELECT) == sel)/* && v2d->cur.xmin < bezt->vec[0][0] < v2d->cur.xmax)*/
draw_fcurve_handle_control(bezt->vec[0][0], bezt->vec[0][1], xscale, yscale, hsize);
@@ -250,12 +251,12 @@ static void draw_fcurve_vertices_handles (bAnimContext *ac, SpaceIpo *sipo, FCur
}
}
- glDisable(GL_LINE_SMOOTH);
+ if ((sipo->flag & SIPO_BEAUTYDRAW_OFF)==0) glDisable(GL_LINE_SMOOTH);
glDisable(GL_BLEND);
}
/* helper func - set color to draw F-Curve data with */
-static void set_fcurve_vertex_color (SpaceIpo *sipo, FCurve *fcu, short sel)
+static void set_fcurve_vertex_color (FCurve *fcu, short sel)
{
/* Fade the 'intensity' of the vertices based on the selection of the curves too */
int alphaOffset= (int)((drawFCurveFade(fcu) - 1.0f) * 255);
@@ -274,7 +275,7 @@ static void set_fcurve_vertex_color (SpaceIpo *sipo, FCurve *fcu, short sel)
}
-static void draw_fcurve_vertices (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, FCurve *fcu, int do_handles)
+static void draw_fcurve_vertices (SpaceIpo *sipo, ARegion *ar, FCurve *fcu, short do_handles, short sel_handle_only)
{
View2D *v2d= &ar->v2d;
@@ -290,19 +291,19 @@ static void draw_fcurve_vertices (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar,
/* draw the two handles first (if they're shown, the curve doesn't have just a single keyframe, and the curve is being edited) */
if (do_handles)
{
- set_fcurve_vertex_color(sipo, fcu, 0);
- draw_fcurve_vertices_handles(ac, sipo, fcu, v2d, 0);
+ set_fcurve_vertex_color(fcu, 0);
+ draw_fcurve_vertices_handles(fcu, sipo, v2d, 0, sel_handle_only);
- set_fcurve_vertex_color(sipo, fcu, 1);
- draw_fcurve_vertices_handles(ac, sipo, fcu, v2d, 1);
+ set_fcurve_vertex_color(fcu, 1);
+ draw_fcurve_vertices_handles(fcu, sipo, v2d, 1, sel_handle_only);
}
/* draw keyframes over the handles */
- set_fcurve_vertex_color(sipo, fcu, 0);
- draw_fcurve_vertices_keyframes(ac, fcu, v2d, !(fcu->flag & FCURVE_PROTECTED), 0);
+ set_fcurve_vertex_color(fcu, 0);
+ draw_fcurve_vertices_keyframes(fcu, sipo, v2d, !(fcu->flag & FCURVE_PROTECTED), 0);
- set_fcurve_vertex_color(sipo, fcu, 1);
- draw_fcurve_vertices_keyframes(ac, fcu, v2d, !(fcu->flag & FCURVE_PROTECTED), 1);
+ set_fcurve_vertex_color(fcu, 1);
+ draw_fcurve_vertices_keyframes(fcu, sipo, v2d, !(fcu->flag & FCURVE_PROTECTED), 1);
glPointSize(1.0f);
}
@@ -329,7 +330,7 @@ static int draw_fcurve_handles_check(SpaceIpo *sipo, FCurve *fcu)
/* draw lines for F-Curve handles only (this is only done in EditMode)
* note: draw_fcurve_handles_check must be checked before running this. */
-static void draw_fcurve_handles (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, FCurve *fcu)
+static void draw_fcurve_handles (SpaceIpo *sipo, FCurve *fcu)
{
int sel, b;
@@ -346,7 +347,7 @@ static void draw_fcurve_handles (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar,
BezTriple *bezt=fcu->bezt, *prevbezt=NULL;
int basecol= (sel)? TH_HANDLE_SEL_FREE : TH_HANDLE_FREE;
float *fp;
- char col[4];
+ unsigned char col[4];
/* if only selected keyframes have handles shown, skip the first round */
if ((sel == 0) && (sipo->flag & SIPO_SELVHANDLESONLY))
@@ -406,7 +407,7 @@ static void draw_fcurve_handles (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar,
UI_GetThemeColor3ubv(basecol + bezt->h2, col);
col[3]= drawFCurveFade(fcu) * 255;
glColor4ubv((GLubyte *)col);
-
+
glVertex2fv(fp); glVertex2fv(fp+3);
}
}
@@ -455,7 +456,7 @@ static void draw_fcurve_sample_control (float x, float y, float xscale, float ys
}
/* helper func - draw keyframe vertices only for an F-Curve */
-static void draw_fcurve_samples (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, FCurve *fcu)
+static void draw_fcurve_samples (SpaceIpo *sipo, ARegion *ar, FCurve *fcu)
{
FPoint *first, *last;
float hsize, xscale, yscale;
@@ -475,21 +476,21 @@ static void draw_fcurve_samples (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar,
/* draw */
if (first && last) {
/* anti-aliased lines for more consistent appearance */
- glEnable(GL_LINE_SMOOTH);
+ if ((sipo->flag & SIPO_BEAUTYDRAW_OFF)==0) glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
draw_fcurve_sample_control(first->vec[0], first->vec[1], xscale, yscale, hsize);
draw_fcurve_sample_control(last->vec[0], last->vec[1], xscale, yscale, hsize);
glDisable(GL_BLEND);
- glDisable(GL_LINE_SMOOTH);
+ if ((sipo->flag & SIPO_BEAUTYDRAW_OFF)==0) glDisable(GL_LINE_SMOOTH);
}
}
/* Curve ---------------- */
/* helper func - just draw the F-Curve by sampling the visible region (for drawing curves with modifiers) */
-static void draw_fcurve_curve (bAnimContext *ac, ID *id, FCurve *fcu, SpaceIpo *sipo, View2D *v2d, View2DGrid *grid)
+static void draw_fcurve_curve (bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d, View2DGrid *grid)
{
ChannelDriver *driver;
float samplefreq, ctime;
@@ -627,7 +628,7 @@ static void draw_fcurve_curve_samples (bAnimContext *ac, ID *id, FCurve *fcu, Vi
}
/* helper func - draw one repeat of an F-Curve */
-static void draw_fcurve_curve_bezts (bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d, View2DGrid *grid)
+static void draw_fcurve_curve_bezts (bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d)
{
BezTriple *prevbezt= fcu->bezt;
BezTriple *bezt= prevbezt+1;
@@ -784,7 +785,7 @@ static void draw_fcurve_curve_bezts (bAnimContext *ac, ID *id, FCurve *fcu, View
/* Draw the 'ghost' F-Curves (i.e. snapshots of the curve)
* NOTE: unit mapping has already been applied to the values, so do not try and apply again
*/
-void graph_draw_ghost_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGrid *grid)
+void graph_draw_ghost_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar)
{
FCurve *fcu;
@@ -793,7 +794,7 @@ void graph_draw_ghost_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, Vie
glLineWidth(3.0f);
/* anti-aliased lines for less jagged appearance */
- glEnable(GL_LINE_SMOOTH);
+ if ((sipo->flag & SIPO_BEAUTYDRAW_OFF)==0) glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
/* the ghost curves are simply sampled F-Curves stored in sipo->ghostCurves */
@@ -812,7 +813,7 @@ void graph_draw_ghost_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, Vie
setlinestyle(0);
glLineWidth(1.0f);
- glDisable(GL_LINE_SMOOTH);
+ if ((sipo->flag & SIPO_BEAUTYDRAW_OFF)==0) glDisable(GL_LINE_SMOOTH);
glDisable(GL_BLEND);
}
@@ -870,7 +871,7 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri
}
/* anti-aliased lines for less jagged appearance */
- glEnable(GL_LINE_SMOOTH);
+ if ((sipo->flag & SIPO_BEAUTYDRAW_OFF)==0) glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
/* draw F-Curve */
@@ -878,12 +879,12 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri
/* draw a curve affected by modifiers or only allowed to have integer values
* by sampling it at various small-intervals over the visible region
*/
- draw_fcurve_curve(ac, ale->id, fcu, sipo, &ar->v2d, grid);
+ draw_fcurve_curve(ac, ale->id, fcu, &ar->v2d, grid);
}
else if ( ((fcu->bezt) || (fcu->fpt)) && (fcu->totvert) ) {
/* just draw curve based on defined data (i.e. no modifiers) */
if (fcu->bezt)
- draw_fcurve_curve_bezts(ac, ale->id, fcu, &ar->v2d, grid);
+ draw_fcurve_curve_bezts(ac, ale->id, fcu, &ar->v2d);
else if (fcu->fpt)
draw_fcurve_curve_samples(ac, ale->id, fcu, &ar->v2d);
}
@@ -891,7 +892,7 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri
/* restore settings */
setlinestyle(0);
- glDisable(GL_LINE_SMOOTH);
+ if ((sipo->flag & SIPO_BEAUTYDRAW_OFF)==0) glDisable(GL_LINE_SMOOTH);
glDisable(GL_BLEND);
}
@@ -899,12 +900,12 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri
* - if the option to only show controls if the F-Curve is selected is enabled, we must obey this
*/
if (!(sipo->flag & SIPO_SELCUVERTSONLY) || (fcu->flag & FCURVE_SELECTED)) {
- if (fcurve_needs_draw_fmodifier_controls(fcu, fcm)) {
+ if (fcurve_are_keyframes_usable(fcu) == 0) {
/* only draw controls if this is the active modifier */
if ((fcu->flag & FCURVE_ACTIVE) && (fcm)) {
switch (fcm->type) {
case FMODIFIER_TYPE_ENVELOPE: /* envelope */
- draw_fcurve_modifier_controls_envelope(fcu, fcm, &ar->v2d);
+ draw_fcurve_modifier_controls_envelope(fcm, &ar->v2d);
break;
}
}
@@ -919,15 +920,15 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri
if (do_handles) {
/* only draw handles/vertices on keyframes */
glEnable(GL_BLEND);
- draw_fcurve_handles(ac, sipo, ar, fcu);
+ draw_fcurve_handles(sipo, fcu);
glDisable(GL_BLEND);
}
- draw_fcurve_vertices(ac, sipo, ar, fcu, do_handles);
+ draw_fcurve_vertices(sipo, ar, fcu, do_handles, (sipo->flag & SIPO_SELVHANDLESONLY));
}
else {
/* samples: only draw two indicators at either end as indicators */
- draw_fcurve_samples(ac, sipo, ar, fcu);
+ draw_fcurve_samples(sipo, ar, fcu);
}
/* unapply unit mapping */
@@ -948,7 +949,7 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri
/* Channel List */
/* left hand part */
-void graph_draw_channel_names(bContext *C, bAnimContext *ac, SpaceIpo *sipo, ARegion *ar)
+void graph_draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c
index 5c692ba1112..e21dd46140e 100644
--- a/source/blender/editors/space_graph/graph_edit.c
+++ b/source/blender/editors/space_graph/graph_edit.c
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_object_types.h"
@@ -60,6 +61,7 @@
#include "ED_keyframes_edit.h"
#include "ED_screen.h"
#include "ED_transform.h"
+#include "ED_markers.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -119,6 +121,10 @@ void get_graph_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, flo
if ((ymax) && (tymax > *ymax)) *ymax= tymax;
}
+ /* ensure that the extents are not too extreme that view implodes...*/
+ if ((xmin && xmax) && (fabs(*xmax - *xmin) < 0.1)) *xmax += 0.1;
+ if ((ymin && ymax) && (fabs(*ymax - *ymin) < 0.1)) *ymax += 0.1;
+
/* free memory */
BLI_freelistN(&anim_data);
}
@@ -140,7 +146,7 @@ void get_graph_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, flo
/* ****************** Automatic Preview-Range Operator ****************** */
-static int graphkeys_previewrange_exec(bContext *C, wmOperator *op)
+static int graphkeys_previewrange_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
Scene *scene;
@@ -172,10 +178,11 @@ void GRAPH_OT_previewrange_set (wmOperatorType *ot)
/* identifiers */
ot->name= "Auto-Set Preview Range";
ot->idname= "GRAPH_OT_previewrange_set";
+ ot->description= "Automatically set Preview Range based on range of keyframes";
/* api callbacks */
ot->exec= graphkeys_previewrange_exec;
- ot->poll= graphop_visible_keyframes_poll;
+ ot->poll= ED_operator_graphedit_active; // XXX: unchecked poll to get fsamples working too, but makes modifier damage trickier...
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -183,7 +190,7 @@ void GRAPH_OT_previewrange_set (wmOperatorType *ot)
/* ****************** View-All Operator ****************** */
-static int graphkeys_viewall_exec(bContext *C, wmOperator *op)
+static int graphkeys_viewall_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
View2D *v2d;
@@ -223,7 +230,7 @@ void GRAPH_OT_view_all (wmOperatorType *ot)
/* api callbacks */
ot->exec= graphkeys_viewall_exec;
- ot->poll= graphop_visible_keyframes_poll;
+ ot->poll= ED_operator_graphedit_active; // XXX: unchecked poll to get fsamples working too, but makes modifier damage trickier...
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -305,7 +312,7 @@ static void create_ghost_curves (bAnimContext *ac, int start, int end)
/* ------------------- */
-static int graphkeys_create_ghostcurves_exec(bContext *C, wmOperator *op)
+static int graphkeys_create_ghostcurves_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
View2D *v2d;
@@ -349,7 +356,7 @@ void GRAPH_OT_ghost_curves_create (wmOperatorType *ot)
/* ******************** Clear Ghost-Curves Operator *********************** */
/* This operator clears the 'ghost curves' for the active Graph Editor */
-static int graphkeys_clear_ghostcurves_exec(bContext *C, wmOperator *op)
+static int graphkeys_clear_ghostcurves_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
SpaceIpo *sipo;
@@ -381,7 +388,7 @@ void GRAPH_OT_ghost_curves_clear (wmOperatorType *ot)
/* api callbacks */
ot->exec= graphkeys_clear_ghostcurves_exec;
- ot->poll= ED_operator_ipo_active;
+ ot->poll= ED_operator_graphedit_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -406,8 +413,8 @@ static void insert_graph_keys(bAnimContext *ac, short mode)
bAnimListElem *ale;
int filter;
+ ReportList *reports = ac->reports;
Scene *scene= ac->scene;
- float cfra= (float)CFRA;
short flag = 0;
/* filter data */
@@ -423,6 +430,7 @@ static void insert_graph_keys(bAnimContext *ac, short mode)
for (ale= anim_data.first; ale; ale= ale->next) {
AnimData *adt= ANIM_nla_mapping_get(ac, ale);
FCurve *fcu= (FCurve *)ale->key_data;
+ float cfra;
/* adjust current frame for NLA-mapping */
if (adt)
@@ -432,7 +440,7 @@ static void insert_graph_keys(bAnimContext *ac, short mode)
/* if there's an id */
if (ale->id)
- insert_keyframe(ale->id, NULL, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
+ insert_keyframe(reports, ale->id, NULL, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
else
insert_vert_fcurve(fcu, cfra, fcu->curval, 0);
}
@@ -507,19 +515,33 @@ static int graphkeys_click_insert_exec (bContext *C, wmOperator *op)
}
fcu = ale->data;
- /* get frame and value from props */
- frame= RNA_float_get(op->ptr, "frame");
- val= RNA_float_get(op->ptr, "value");
-
- /* apply inverse NLA-mapping to frame to get correct time in un-scaled action */
- adt= ANIM_nla_mapping_get(&ac, ale);
- frame= BKE_nla_tweakedit_remap(adt, frame, NLATIME_CONVERT_UNMAP);
-
- /* apply inverse unit-mapping to value to get correct value for F-Curves */
- val *= ANIM_unit_mapping_get_factor(ac.scene, ale->id, fcu, 1);
-
- /* insert keyframe on the specified frame + value */
- insert_vert_fcurve(fcu, frame, val, 0);
+ /* when there are F-Modifiers on the curve, only allow adding
+ * keyframes if these will be visible after doing so...
+ */
+ if (fcurve_is_keyframable(fcu)) {
+ /* get frame and value from props */
+ frame= RNA_float_get(op->ptr, "frame");
+ val= RNA_float_get(op->ptr, "value");
+
+ /* apply inverse NLA-mapping to frame to get correct time in un-scaled action */
+ adt= ANIM_nla_mapping_get(&ac, ale);
+ frame= BKE_nla_tweakedit_remap(adt, frame, NLATIME_CONVERT_UNMAP);
+
+ /* apply inverse unit-mapping to value to get correct value for F-Curves */
+ val *= ANIM_unit_mapping_get_factor(ac.scene, ale->id, fcu, 1);
+
+ /* insert keyframe on the specified frame + value */
+ insert_vert_fcurve(fcu, frame, val, 0);
+ }
+ else {
+ /* warn about why this can't happen */
+ if (fcu->fpt)
+ BKE_report(op->reports, RPT_ERROR, "Keyframes cannot be added to sampled F-Curves");
+ else if (fcu->flag & FCURVE_PROTECTED)
+ BKE_report(op->reports, RPT_ERROR, "Active F-Curve is not editable");
+ else
+ BKE_report(op->reports, RPT_ERROR, "Remove F-Modifiers from F-Curve to add keyframes");
+ }
/* free temp data */
MEM_freeN(ale);
@@ -603,7 +625,8 @@ static short copy_graph_keys (bAnimContext *ac)
return ok;
}
-static short paste_graph_keys (bAnimContext *ac)
+static short paste_graph_keys (bAnimContext *ac,
+ const eKeyPasteOffset offset_mode, const eKeyMergeMode merge_mode)
{
ListBase anim_data = {NULL, NULL};
int filter, ok=0;
@@ -613,7 +636,7 @@ static short paste_graph_keys (bAnimContext *ac)
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* paste keyframes */
- ok= paste_animedit_keys(ac, &anim_data);
+ ok= paste_animedit_keys(ac, &anim_data, offset_mode, merge_mode);
/* clean up */
BLI_freelistN(&anim_data);
@@ -661,14 +684,20 @@ void GRAPH_OT_copy (wmOperatorType *ot)
static int graphkeys_paste_exec(bContext *C, wmOperator *op)
{
bAnimContext ac;
+
+ const eKeyPasteOffset offset_mode= RNA_enum_get(op->ptr, "offset");
+ const eKeyMergeMode merge_mode= RNA_enum_get(op->ptr, "merge");
/* get editor data */
if (ANIM_animdata_get_context(C, &ac) == 0)
return OPERATOR_CANCELLED;
+ if(ac.reports==NULL) {
+ ac.reports= op->reports;
+ }
+
/* paste keyframes */
- if (paste_graph_keys(&ac)) {
- BKE_report(op->reports, RPT_ERROR, "No keyframes to paste");
+ if (paste_graph_keys(&ac, offset_mode, merge_mode)) {
return OPERATOR_CANCELLED;
}
@@ -689,11 +718,15 @@ void GRAPH_OT_paste (wmOperatorType *ot)
ot->description= "Paste keyframes from copy/paste buffer for the selected channels, starting on the current frame";
/* api callbacks */
+// ot->invoke= WM_operator_props_popup; // better wait for graph redo panel
ot->exec= graphkeys_paste_exec;
ot->poll= graphop_editable_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "offset", keyframe_paste_offset_items, KEYFRAME_PASTE_OFFSET_CFRA_START, "Offset", "Paste time offset of keys");
+ RNA_def_enum(ot->srna, "merge", keyframe_paste_merge_items, KEYFRAME_PASTE_MERGE_MIX, "Type", "Method of merking pasted keys and existing");
}
/* ******************** Duplicate Keyframes Operator ************************* */
@@ -719,7 +752,7 @@ static void duplicate_graph_keys (bAnimContext *ac)
/* ------------------- */
-static int graphkeys_duplicate_exec(bContext *C, wmOperator *op)
+static int graphkeys_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -739,7 +772,7 @@ static int graphkeys_duplicate_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int graphkeys_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int graphkeys_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
graphkeys_duplicate_exec(C, op);
@@ -799,7 +832,7 @@ static void delete_graph_keys (bAnimContext *ac)
/* ------------------- */
-static int graphkeys_delete_exec(bContext *C, wmOperator *op)
+static int graphkeys_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -935,7 +968,7 @@ static void bake_graph_curves (bAnimContext *ac, int start, int end)
/* ------------------- */
-static int graphkeys_bake_exec(bContext *C, wmOperator *op)
+static int graphkeys_bake_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
Scene *scene= NULL;
@@ -1001,7 +1034,7 @@ typedef struct tSoundBakeInfo {
/* Sampling callback used to determine the value from the sound to
* save in the F-Curve at the specified frame
*/
-static float fcurve_samplingcb_sound (FCurve *fcu, void *data, float evaltime)
+static float fcurve_samplingcb_sound (FCurve *UNUSED(fcu), void *data, float evaltime)
{
tSoundBakeInfo *sbi= (tSoundBakeInfo *)data;
@@ -1149,7 +1182,7 @@ static void sample_graph_keys (bAnimContext *ac)
/* ------------------- */
-static int graphkeys_sample_exec(bContext *C, wmOperator *op)
+static int graphkeys_sample_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -1205,7 +1238,7 @@ static void setexpo_graph_keys(bAnimContext *ac, short mode)
int filter;
/* filter data */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* loop through setting mode per F-Curve */
@@ -1334,15 +1367,6 @@ void GRAPH_OT_interpolation_type (wmOperatorType *ot)
/* ******************** Set Handle-Type Operator *********************** */
-EnumPropertyItem graphkeys_handle_type_items[] = {
- {HD_FREE, "FREE", 0, "Free", ""},
- {HD_VECT, "VECTOR", 0, "Vector", ""},
- {HD_ALIGN, "ALIGNED", 0, "Aligned", ""},
- {0, "", 0, "", ""},
- {HD_AUTO, "AUTO", 0, "Auto", "Handles that are automatically adjusted upon moving the keyframe. Whole curve"},
- {HD_AUTO_ANIM, "ANIM_CLAMPED", 0, "Auto Clamped", "Auto handles clamped to not overshoot. Whole curve"},
- {0, NULL, 0, NULL, NULL}};
-
/* ------------------- */
/* this function is responsible for setting handle-type of selected keyframes */
@@ -1409,6 +1433,15 @@ static int graphkeys_handletype_exec(bContext *C, wmOperator *op)
void GRAPH_OT_handle_type (wmOperatorType *ot)
{
+ /* sync with editcurve_handle_type_items */
+ static EnumPropertyItem graphkeys_handle_type_items[] = {
+ {HD_AUTO, "AUTO", 0, "Automatic", "Handles that are automatically adjusted upon moving the keyframe. Whole curve"},
+ {HD_VECT, "VECTOR", 0, "Vector", ""},
+ {HD_ALIGN, "ALIGNED", 0, "Aligned", ""},
+ {HD_FREE, "FREE_ALIGN", 0, "Free", ""},
+ {HD_AUTO_ANIM, "ANIM_CLAMPED", 0, "Auto Clamped", "Auto handles clamped to not overshoot. Whole curve"},
+ {0, NULL, 0, NULL, NULL}};
+
/* identifiers */
ot->name= "Set Keyframe Handle Type";
ot->idname= "GRAPH_OT_handle_type";
@@ -1530,7 +1563,7 @@ void GRAPH_OT_euler_filter (wmOperatorType *ot)
/* ***************** Jump to Selected Frames Operator *********************** */
/* snap current-frame indicator to 'average time' of selected keyframe */
-static int graphkeys_framejump_exec(bContext *C, wmOperator *op)
+static int graphkeys_framejump_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
ListBase anim_data= {NULL, NULL};
@@ -1743,13 +1776,7 @@ static void mirror_graph_keys(bAnimContext *ac, short mode)
TimeMarker *marker= NULL;
/* find first selected marker */
- if (ac->markers) {
- for (marker= ac->markers->first; marker; marker=marker->next) {
- if (marker->flag & SELECT) {
- break;
- }
- }
- }
+ marker= ED_markers_get_first_selected(ac->markers);
/* store marker's time (if available) */
if (marker)
@@ -1835,7 +1862,7 @@ void GRAPH_OT_mirror (wmOperatorType *ot)
/* ******************** Smooth Keyframes Operator *********************** */
-static int graphkeys_smooth_exec(bContext *C, wmOperator *op)
+static int graphkeys_smooth_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
ListBase anim_data = {NULL, NULL};
@@ -1890,13 +1917,13 @@ void GRAPH_OT_smooth (wmOperatorType *ot)
/* ******************** Add F-Modifier Operator *********************** */
/* present a special customised popup menu for this, with some filtering */
-static int graph_fmodifier_add_invoke (bContext *C, wmOperator *op, wmEvent *event)
+static int graph_fmodifier_add_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
uiPopupMenu *pup;
uiLayout *layout;
int i;
- pup= uiPupMenuBegin(C, "Add F-Curve Modifier", 0);
+ pup= uiPupMenuBegin(C, "Add F-Curve Modifier", ICON_NULL);
layout= uiPupMenuLayout(pup);
/* start from 1 to skip the 'Invalid' modifier type */
@@ -1909,7 +1936,7 @@ static int graph_fmodifier_add_invoke (bContext *C, wmOperator *op, wmEvent *eve
continue;
/* create operator menu item with relevant properties filled in */
- props_ptr= uiItemFullO(layout, "GRAPH_OT_fmodifier_add", fmi->name, 0, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS);
+ props_ptr= uiItemFullO(layout, "GRAPH_OT_fmodifier_add", fmi->name, ICON_NULL, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS);
/* the only thing that gets set from the menu is the type of F-Modifier to add */
RNA_enum_set(&props_ptr, "type", i);
/* the following properties are just repeats of existing ones... */
@@ -1940,7 +1967,7 @@ static int graph_fmodifier_add_exec(bContext *C, wmOperator *op)
/* filter data */
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
if (RNA_boolean_get(op->ptr, "only_active"))
- filter |= ANIMFILTER_ACTIVE;
+ filter |= ANIMFILTER_ACTIVE; // FIXME: enforce in this case only a single channel to get handled?
else
filter |= (ANIMFILTER_SEL|ANIMFILTER_CURVEVISIBLE);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
@@ -1954,7 +1981,7 @@ static int graph_fmodifier_add_exec(bContext *C, wmOperator *op)
fcm= add_fmodifier(&fcu->modifiers, type);
if (fcm)
set_active_fmodifier(&fcu->modifiers, fcm);
- else { // TODO: stop when this happens?
+ else {
BKE_report(op->reports, RPT_ERROR, "Modifier couldn't be added. See console for details.");
break;
}
diff --git a/source/blender/editors/space_graph/graph_intern.h b/source/blender/editors/space_graph/graph_intern.h
index a637ed15fcd..560dabbb634 100644
--- a/source/blender/editors/space_graph/graph_intern.h
+++ b/source/blender/editors/space_graph/graph_intern.h
@@ -48,10 +48,10 @@ struct ARegion *graph_has_buttons_region(struct ScrArea *sa);
/* ***************************************** */
/* graph_draw.c */
-void graph_draw_channel_names(struct bContext *C, struct bAnimContext *ac, struct SpaceIpo *sipo, struct ARegion *ar);
+void graph_draw_channel_names(struct bContext *C, struct bAnimContext *ac, struct ARegion *ar);
void graph_draw_curves(struct bAnimContext *ac, struct SpaceIpo *sipo, struct ARegion *ar, struct View2DGrid *grid, short sel);
-void graph_draw_ghost_curves(struct bAnimContext *ac, struct SpaceIpo *sipo, struct ARegion *ar, struct View2DGrid *grid);
+void graph_draw_ghost_curves(struct bAnimContext *ac, struct SpaceIpo *sipo, struct ARegion *ar);
/* ***************************************** */
/* graph_header.c */
diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c
index 0069e6e0675..efec8dc4259 100644
--- a/source/blender/editors/space_graph/graph_ops.c
+++ b/source/blender/editors/space_graph/graph_ops.c
@@ -29,10 +29,11 @@
#include <stdlib.h>
#include <math.h>
-
#include "DNA_scene_types.h"
+#include "DNA_anim_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_sound.h"
@@ -169,7 +170,7 @@ void GRAPH_OT_cursor_set(wmOperatorType *ot)
ot->exec= graphview_cursor_exec;
ot->invoke= graphview_cursor_invoke;
ot->modal= graphview_cursor_modal;
- ot->poll= ED_operator_ipo_active;
+ ot->poll= ED_operator_graphedit_active;
/* flags */
ot->flag= OPTYPE_BLOCKING|OPTYPE_UNDO;
@@ -181,7 +182,7 @@ void GRAPH_OT_cursor_set(wmOperatorType *ot)
/* Toggle Handles ----------------------------------------------------------------- */
-static int view_toggle_handles_exec (bContext *C, wmOperator *op)
+static int view_toggle_handles_exec (bContext *C, wmOperator *UNUSED(op))
{
SpaceIpo *sipo= CTX_wm_space_graph(C);
ARegion *ar= CTX_wm_region(C);
@@ -203,10 +204,11 @@ void GRAPH_OT_view_togglehandles (wmOperatorType *ot)
/* identification */
ot->name= "Show/Hide All Handles";
ot->idname= "GRAPH_OT_handles_view_toggle";
+ ot->description= "Toggle whether handles are drawn on all keyframes that need them";
/* callbacks */
ot->exec= view_toggle_handles_exec;
- ot->poll= ED_operator_ipo_active;
+ ot->poll= ED_operator_graphedit_active;
}
/* ************************** registration - operator types **********************************/
@@ -298,7 +300,7 @@ static void graphedit_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap)
RNA_boolean_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_all_toggle", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "invert", 1);
/* borderselect */
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, 0, 0);
kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, KM_ALT, 0);
RNA_boolean_set(kmi->ptr, "axis_range", 1);
@@ -331,10 +333,9 @@ static void graphedit_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap)
WM_keymap_add_item(keymap, "GRAPH_OT_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "GRAPH_OT_mirror", MKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "GRAPH_OT_handle_type", HKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_handle_type", VKEY, KM_PRESS, 0, 0);
+
WM_keymap_add_item(keymap, "GRAPH_OT_interpolation_type", TKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "GRAPH_OT_extrapolation_type", EKEY, KM_PRESS, KM_SHIFT, 0);
-
/* destructive */
WM_keymap_add_item(keymap, "GRAPH_OT_clean", OKEY, KM_PRESS, 0, 0);
@@ -350,7 +351,7 @@ static void graphedit_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap)
/* insertkey */
WM_keymap_add_item(keymap, "GRAPH_OT_keyframe_insert", IKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "GRAPH_OT_click_insert", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_click_insert", LEFTMOUSE, KM_CLICK, KM_CTRL, 0);
/* copy/paste */
WM_keymap_add_item(keymap, "GRAPH_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0);
@@ -382,6 +383,8 @@ void graphedit_keymap(wmKeyConfig *keyconf)
/* keymap for all regions */
keymap= WM_keymap_find(keyconf, "Graph Editor Generic", SPACE_IPO, 0);
WM_keymap_add_item(keymap, "GRAPH_OT_properties", NKEY, KM_PRESS, 0, 0);
+ /* extrapolation works on channels, not keys */
+ WM_keymap_add_item(keymap, "GRAPH_OT_extrapolation_type", EKEY, KM_PRESS, KM_SHIFT, 0);
/* channels */
/* Channels are not directly handled by the Graph Editor module, but are inherited from the Animation module.
diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c
index cdc8166f2d6..58a5f4b113e 100644
--- a/source/blender/editors/space_graph/graph_select.c
+++ b/source/blender/editors/space_graph/graph_select.c
@@ -33,6 +33,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_object_types.h"
@@ -85,7 +86,7 @@ static void deselect_graph_keys (bAnimContext *ac, short test, short sel)
int filter;
SpaceIpo *sipo= (SpaceIpo *)ac->sa->spacedata.first;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
KeyframeEditFunc test_cb, sel_cb;
/* determine type-based settings */
@@ -95,7 +96,6 @@ static void deselect_graph_keys (bAnimContext *ac, short test, short sel)
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* init BezTriple looping data */
- memset(&ked, 0, sizeof(KeyframeEditData));
test_cb= ANIM_editkeyframes_ok(BEZT_OK_SELECTED);
/* See if we should be selecting or deselecting */
@@ -539,7 +539,7 @@ void GRAPH_OT_select_column (wmOperatorType *ot)
/* ******************** Select Linked Operator *********************** */
-static int graphkeys_select_linked_exec (bContext *C, wmOperator *op)
+static int graphkeys_select_linked_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -638,7 +638,7 @@ static void select_moreless_graph_keys (bAnimContext *ac, short mode)
/* ----------------- */
-static int graphkeys_select_more_exec (bContext *C, wmOperator *op)
+static int graphkeys_select_more_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -672,7 +672,7 @@ void GRAPH_OT_select_more (wmOperatorType *ot)
/* ----------------- */
-static int graphkeys_select_less_exec (bContext *C, wmOperator *op)
+static int graphkeys_select_less_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -886,7 +886,7 @@ static void get_nearest_fcurve_verts_list (bAnimContext *ac, int mval[2], ListBa
}
/* helper for find_nearest_fcurve_vert() - get the best match to use */
-static tNearestVertInfo *get_best_nearest_fcurve_vert (bAnimContext *ac, ListBase *matches)
+static tNearestVertInfo *get_best_nearest_fcurve_vert (ListBase *matches)
{
tNearestVertInfo *nvi = NULL;
short found = 0;
@@ -941,7 +941,7 @@ static tNearestVertInfo *find_nearest_fcurve_vert (bAnimContext *ac, int mval[2]
get_nearest_fcurve_verts_list(ac, mval, &matches);
/* step 2: find the best vert */
- nvi= get_best_nearest_fcurve_vert(ac, &matches);
+ nvi= get_best_nearest_fcurve_vert(&matches);
BLI_freelistN(&matches);
@@ -956,6 +956,7 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s
{
SpaceIpo *sipo= (SpaceIpo *)ac->sa->spacedata.first;
tNearestVertInfo *nvi;
+ BezTriple *bezt= NULL;
/* find the beztriple that we're selecting, and the handle that was clicked on */
nvi = find_nearest_fcurve_vert(ac, mval);
@@ -985,8 +986,7 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s
if ((curves_only == 0) && ((nvi->fcu->flag & FCURVE_PROTECTED)==0)) {
/* only if there's keyframe */
if (nvi->bezt) {
- BezTriple *bezt= nvi->bezt;
-
+ bezt= nvi->bezt; /* used to check bezt seletion is set */
/* depends on selection mode */
if (select_mode == SELECT_INVERT) {
/* keyframe - invert select of all */
@@ -1042,11 +1042,23 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s
/* only change selection of channel when the visibility of keyframes doesn't depend on this */
if ((sipo->flag & SIPO_SELCUVERTSONLY) == 0) {
/* select or deselect curve? */
- if (select_mode == SELECT_INVERT)
- nvi->fcu->flag ^= FCURVE_SELECTED;
- else if (select_mode == SELECT_ADD)
- nvi->fcu->flag |= FCURVE_SELECTED;
-
+
+ /* when a single point is selected then dont toggle channel selection */
+ if(bezt) {
+ if((bezt->f2|bezt->f1|bezt->f3) & SELECT) {
+ nvi->fcu->flag |= FCURVE_SELECTED;
+ }
+ else {
+ nvi->fcu->flag &= ~FCURVE_SELECTED;
+ }
+ }
+ else {
+ if (select_mode == SELECT_INVERT)
+ nvi->fcu->flag ^= FCURVE_SELECTED;
+ else if (select_mode == SELECT_ADD)
+ nvi->fcu->flag |= FCURVE_SELECTED;
+ }
+
/* set active F-Curve (NOTE: sync the filter flags with findnearest_fcurve_vert) */
if (nvi->fcu->flag & FCURVE_SELECTED) {
int filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
diff --git a/source/blender/editors/space_graph/graph_utils.c b/source/blender/editors/space_graph/graph_utils.c
index 927149a268d..31c1394f1ae 100644
--- a/source/blender/editors/space_graph/graph_utils.c
+++ b/source/blender/editors/space_graph/graph_utils.c
@@ -87,57 +87,6 @@ bAnimListElem *get_active_fcurve_channel (bAnimContext *ac)
/* ************************************************************** */
/* Operator Polling Callbacks */
-/* check if any FModifiers to draw controls for - fcm is 'active' modifier
- * used for the polling callbacks + also for drawing
- */
-// TODO: restructure these tests
-// TODO: maybe for now, just allow editing always for now...
-short fcurve_needs_draw_fmodifier_controls (FCurve *fcu, FModifier *fcm)
-{
- /* don't draw if there aren't any modifiers at all */
- if (fcu->modifiers.first == NULL)
- return 0;
-
- /* if only one modifier
- * - don't draw if it is muted or disabled
- * - set it as the active one if no active one is present
- */
- if (fcu->modifiers.first == fcu->modifiers.last) {
- fcm= fcu->modifiers.first;
- if (fcm->flag & (FMODIFIER_FLAG_DISABLED|FMODIFIER_FLAG_MUTED))
- return 0;
- }
-
- /* if there's an active modifier - don't draw if it doesn't drastically
- * alter the curve...
- */
- if (fcm) {
- switch (fcm->type) {
- /* clearly harmless */
- case FMODIFIER_TYPE_CYCLES:
- return 0;
- case FMODIFIER_TYPE_STEPPED:
- return 0;
-
- /* borderline... */
- case FMODIFIER_TYPE_NOISE:
- return 0;
- }
- }
-
- /* if only active modifier - don't draw if it is muted or disabled */
- if (fcm) {
- if (fcm->flag & (FMODIFIER_FLAG_DISABLED|FMODIFIER_FLAG_MUTED))
- return 0;
- }
-
- /* if we're still here, this means that there are modifiers with controls to be drawn */
- // FIXME: what happens if all the modifiers were muted/disabled
- return 1;
-}
-
-/* ------------------- */
-
/* Check if there are any visible keyframes (for selection tools) */
int graphop_visible_keyframes_poll (bContext *C)
{
@@ -167,7 +116,6 @@ int graphop_visible_keyframes_poll (bContext *C)
for (ale = anim_data.first; ale; ale= ale->next) {
FCurve *fcu= (FCurve *)ale->data;
- FModifier *fcm;
/* visible curves for selection must fulfull the following criteria:
* - it has bezier keyframes
@@ -176,10 +124,10 @@ int graphop_visible_keyframes_poll (bContext *C)
*/
if (fcu->bezt == NULL)
continue;
- fcm= find_active_fmodifier(&fcu->modifiers);
-
- found= (fcurve_needs_draw_fmodifier_controls(fcu, fcm) == 0);
- if (found) break;
+ if (fcurve_are_keyframes_usable(fcu)) {
+ found = 1;
+ break;
+ }
}
/* cleanup and return findings */
@@ -216,7 +164,6 @@ int graphop_editable_keyframes_poll (bContext *C)
for (ale = anim_data.first; ale; ale= ale->next) {
FCurve *fcu= (FCurve *)ale->data;
- FModifier *fcm;
/* editable curves must fulfull the following criteria:
* - it has bezier keyframes
@@ -226,10 +173,10 @@ int graphop_editable_keyframes_poll (bContext *C)
*/
if (fcu->bezt == NULL)
continue;
- fcm= find_active_fmodifier(&fcu->modifiers);
-
- found= (fcurve_needs_draw_fmodifier_controls(fcu, fcm) == 0);
- if (found) break;
+ if (fcurve_is_keyframable(fcu)) {
+ found = 1;
+ break;
+ }
}
/* cleanup and return findings */
@@ -261,6 +208,11 @@ int graphop_active_fcurve_poll (bContext *C)
/* free temp data... */
has_fcurve= ((ale->data) && (ale->type == ANIMTYPE_FCURVE));
+ if(has_fcurve) {
+ FCurve *fcu= (FCurve *)ale->data;
+ has_fcurve= (fcu->flag & FCURVE_VISIBLE)!=0;
+ }
+
MEM_freeN(ale);
/* return success */
diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c
index ca372d74da6..37d58e5591b 100644
--- a/source/blender/editors/space_graph/space_graph.c
+++ b/source/blender/editors/space_graph/space_graph.c
@@ -37,6 +37,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -175,7 +176,7 @@ static void graph_free(SpaceLink *sl)
/* spacetype; init callback */
-static void graph_init(struct wmWindowManager *wm, ScrArea *sa)
+static void graph_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa)
{
SpaceIpo *sipo= (SpaceIpo *)sa->spacedata.first;
@@ -229,17 +230,17 @@ static void graph_main_area_draw(const bContext *C, ARegion *ar)
glClearColor(col[0], col[1], col[2], 0.0);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* grid */
unitx= (sipo->flag & SIPO_DRAWTIME)? V2D_UNIT_SECONDS : V2D_UNIT_FRAMESCALE;
- grid= UI_view2d_grid_calc(C, v2d, unitx, V2D_GRID_NOCLAMP, unity, V2D_GRID_NOCLAMP, ar->winx, ar->winy);
- UI_view2d_grid_draw(C, v2d, grid, V2D_GRIDLINES_ALL);
+ grid= UI_view2d_grid_calc(CTX_data_scene(C), v2d, unitx, V2D_GRID_NOCLAMP, unity, V2D_GRID_NOCLAMP, ar->winx, ar->winy);
+ UI_view2d_grid_draw(v2d, grid, V2D_GRIDLINES_ALL);
/* draw data */
if (ANIM_animdata_get_context(C, &ac)) {
/* draw ghost curves */
- graph_draw_ghost_curves(&ac, sipo, ar, grid);
+ graph_draw_ghost_curves(&ac, sipo, ar);
/* draw curves twice - unselected, then selected, so that the are fewer occlusion problems */
graph_draw_curves(&ac, sipo, ar, grid, 0);
@@ -282,11 +283,11 @@ static void graph_main_area_draw(const bContext *C, ARegion *ar)
ANIM_draw_cfra(C, v2d, flag);
/* markers */
- UI_view2d_view_orthoSpecial(C, v2d, 1);
+ UI_view2d_view_orthoSpecial(ar, v2d, 1);
draw_markers_time(C, 0);
/* preview range */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
ANIM_draw_previewrange(C, v2d);
/* reset view matrix */
@@ -314,7 +315,6 @@ static void graph_channel_area_init(wmWindowManager *wm, ARegion *ar)
static void graph_channel_area_draw(const bContext *C, ARegion *ar)
{
- SpaceIpo *sipo= CTX_wm_space_graph(C);
bAnimContext ac;
View2D *v2d= &ar->v2d;
View2DScrollers *scrollers;
@@ -325,11 +325,11 @@ static void graph_channel_area_draw(const bContext *C, ARegion *ar)
glClearColor(col[0], col[1], col[2], 0.0);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* draw channels */
if (ANIM_animdata_get_context(C, &ac)) {
- graph_draw_channel_names((bContext*)C, &ac, sipo, ar);
+ graph_draw_channel_names((bContext*)C, &ac, ar);
}
/* reset view matrix */
@@ -342,7 +342,7 @@ static void graph_channel_area_draw(const bContext *C, ARegion *ar)
}
/* add handlers, stuff you only do once or on area/region changes */
-static void graph_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void graph_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -539,24 +539,22 @@ static void graph_refresh(const bContext *C, ScrArea *sa)
/* F-Curve's array index is automatically mapped to RGB values. This works best of 3-value vectors.
* TODO: find a way to module the hue so that not all curves have same color...
*/
-
- /* standard table of colors to use */
- const float _colorsets[4][3]=
- {
- {1.0f, 0.0f, 0.0f}, /* red */
- {0.0f, 1.0f, 0.0f}, /* green */
- {0.0f, 0.0f, 1.0f}, /* blue */
- {0.3f, 0.8f, 1.0f}, /* 'unknown' color - bluish so as to not conflict with handles */
- };
-
- /* simply copy the relevant color over to the F-Curve */
- if ((fcu->array_index >= 0) && (fcu->array_index < 3)) {
- /* if the index is within safe bounds, use index to access table */
- VECCOPY(fcu->color, _colorsets[fcu->array_index]);
- }
- else {
- /* use the 'unknown' color... */
- VECCOPY(fcu->color, _colorsets[3]);
+ float *col= fcu->color;
+
+ switch(fcu->array_index) {
+ case 0:
+ col[0]= 1.0f; col[1]= 0.0f; col[2]= 0.0f;
+ break;
+ case 1:
+ col[0]= 0.0f; col[1]= 1.0f; col[2]= 0.0f;
+ break;
+ case 2:
+ col[0]= 0.0f; col[1]= 0.0f; col[2]= 1.0f;
+ break;
+ default:
+ /* 'unknown' color - bluish so as to not conflict with handles */
+ col[0]= 0.3f; col[1]= 0.8f; col[2]= 1.0f;
+ break;
}
}
break;
@@ -602,7 +600,7 @@ void ED_spacetype_ipo(void)
art->init= graph_main_area_init;
art->draw= graph_main_area_draw;
art->listener= graph_region_listener;
- art->keymapflag= ED_KEYMAP_VIEW2D/*|ED_KEYMAP_MARKERS*/|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
+ art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_image/CMakeLists.txt b/source/blender/editors/space_image/CMakeLists.txt
index d47f5a9820e..c7b0db8fbbc 100644
--- a/source/blender/editors/space_image/CMakeLists.txt
+++ b/source/blender/editors/space_image/CMakeLists.txt
@@ -19,10 +19,9 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
+ ../../blenfont
../../blenkernel
../../blenlib
../../imbuf
@@ -33,21 +32,36 @@ SET(INC
../../../../intern/guardedalloc
)
-IF(WITH_IMAGE_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_IMAGE_OPENEXR)
+set(SRC
+ image_buttons.c
+ image_draw.c
+ image_header.c
+ image_ops.c
+ image_render.c
+ space_image.c
+
+ image_intern.h
+)
+
+if(WITH_IMAGE_OPENJPEG)
+ add_definitions(-DWITH_OPENJPEG)
+endif()
+
+if(WITH_IMAGE_OPENEXR)
+ add_definitions(-DWITH_OPENEXR)
+endif()
-IF(WITH_IMAGE_TIFF)
- ADD_DEFINITIONS(-DWITH_TIFF)
-ENDIF(WITH_IMAGE_TIFF)
+if(WITH_IMAGE_TIFF)
+ add_definitions(-DWITH_TIFF)
+endif()
-IF(WITH_LCMS)
- SET(INC ${INC} ${LCMS_INCLUDE_DIR})
- ADD_DEFINITIONS(-DWITH_LCMS)
-ENDIF(WITH_LCMS)
+if(WITH_IMAGE_CINEON)
+ add_definitions(-DWITH_CINEON)
+endif()
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_LCMS)
+ set(INC ${INC} ${LCMS_INCLUDE_DIR})
+ add_definitions(-DWITH_LCMS)
+endif()
-BLENDERLIB(bf_editor_space_image "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_image "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_image/Makefile b/source/blender/editors/space_image/Makefile
deleted file mode 100644
index 773a6920961..00000000000
--- a/source/blender/editors/space_image/Makefile
+++ /dev/null
@@ -1,76 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_image
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../render/extern/include
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
-
-ifeq ($(WITH_OPENEXR), true)
- CPPFLAGS += -DWITH_OPENEXR
-endif
-
-ifeq ($(WITH_TIFF), true)
- CPPFLAGS += -DWITH_TIFF
-endif
-
-ifeq ($(WITH_LCMS), true)
- CPPFLAGS += -DWITH_LCMS
- CPPFLAGS += -I$(BF_LCMS_INC)
-endif
-
-ifeq ($(WITH_CINEON), true)
- CPPFLAGS += -DWITH_CINEON
-endif
-
-ifeq ($(WITH_HDR), true)
- CPPFLAGS += -DWITH_HDR
-endif
-
diff --git a/source/blender/editors/space_image/SConscript b/source/blender/editors/space_image/SConscript
index c7c31352185..f51037642c4 100644
--- a/source/blender/editors/space_image/SConscript
+++ b/source/blender/editors/space_image/SConscript
@@ -3,7 +3,7 @@ Import ('env')
sources = env.Glob('*.c')
-incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
+incs = '../include ../../blenfont ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
incs += ' ../../render/extern/include ../../makesrna'
@@ -14,9 +14,13 @@ if env['WITH_BF_LCMS']:
incs += ' ' + env['BF_LCMS_INC']
if env['WITH_BF_OPENEXR']:
defs.append('WITH_OPENEXR')
+if env['WITH_BF_OPENJPEG']:
+ defs.append('WITH_OPENJPEG')
if env['WITH_BF_TIFF']:
defs.append('WITH_TIFF')
-
+if env['WITH_BF_CINEON']:
+ defs.append('WITH_CINEON')
+
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
incs += ' ' + env['BF_PTHREADS_INC']
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index 9871b75fa42..e68d9f66986 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -40,6 +40,7 @@
#include "BLI_math.h"
#include "BLI_editVert.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_colortools.h"
#include "BKE_context.h"
@@ -97,7 +98,7 @@
static void image_editvertex_buts(const bContext *C, uiBlock *block);
-static void do_image_panel_events(bContext *C, void *arg, int event)
+static void do_image_panel_events(bContext *C, void *UNUSED(arg), int event)
{
SpaceImage *sima= CTX_wm_space_image(C);
@@ -137,21 +138,28 @@ static void image_info(Image *ima, ImBuf *ibuf, char *str)
if(ibuf->rect_float) {
if(ibuf->channels!=4) {
- sprintf(str+ofs, "%d float channel(s)", ibuf->channels);
+ ofs+= sprintf(str+ofs, "%d float channel(s)", ibuf->channels);
}
else if(ibuf->depth==32)
- strcat(str, " RGBA float");
+ ofs+= sprintf(str+ofs, " RGBA float");
else
- strcat(str, " RGB float");
+ ofs+= sprintf(str+ofs, " RGB float");
}
else {
if(ibuf->depth==32)
- strcat(str, " RGBA byte");
+ ofs+= sprintf(str+ofs, " RGBA byte");
else
- strcat(str, " RGB byte");
+ ofs+= sprintf(str+ofs, " RGB byte");
}
if(ibuf->zbuf || ibuf->zbuf_float)
- strcat(str, " + Z");
+ ofs+= sprintf(str+ofs, " + Z");
+
+ if(ima->source==IMA_SRC_SEQUENCE) {
+ char *file= BLI_last_slash(ibuf->name);
+ if(file==NULL) file= ibuf->name;
+ else file++;
+ sprintf(str+ofs, ", %s", file);
+ }
}
@@ -300,11 +308,18 @@ static void image_editvertex_buts(const bContext *C, uiBlock *block)
/* is used for both read and write... */
-static int image_panel_poll(const bContext *C, PanelType *pt)
+static int image_panel_poll(const bContext *C, PanelType *UNUSED(pt))
{
SpaceImage *sima= CTX_wm_space_image(C);
+ ImBuf *ibuf;
+ void *lock;
+ int result;
+
+ ibuf= ED_space_image_acquire_buffer(sima, &lock);
+ result= ibuf && ibuf->rect_float;
+ ED_space_image_release_buffer(sima, lock);
- return ED_space_image_has_buffer(sima);
+ return result;
}
static void image_panel_curves(const bContext *C, Panel *pa)
@@ -335,6 +350,8 @@ static void image_panel_curves(const bContext *C, Panel *pa)
#if 0
/* 0: disable preview
otherwise refresh preview
+
+ XXX if you put this back, also check XXX in image_main_area_draw() */
*/
void image_preview_event(int event)
{
@@ -470,7 +487,7 @@ static void image_panel_preview(ScrArea *sa, short cntrl) // IMAGE_HANDLER_PREVI
/* ********************* callbacks for standard image buttons *************** */
-static char *slot_menu()
+static char *slot_menu(void)
{
char *str;
int a, slot;
@@ -486,7 +503,8 @@ static char *slot_menu()
return str;
}
-static char *layer_menu(RenderResult *rr, short *curlay)
+/* TODO, curlay should be removed? */
+static char *layer_menu(RenderResult *rr, short *UNUSED(curlay))
{
RenderLayer *rl;
int len= 64 + 32*BLI_countlist(&rr->layers);
@@ -702,7 +720,7 @@ static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, RenderResult *rr,
if(rr==NULL || iuser==NULL)
return;
if(rr->layers.first==NULL) {
- uiItemL(row, "No Layers in Render Result.", 0);
+ uiItemL(row, "No Layers in Render Result.", ICON_NULL);
return;
}
@@ -732,7 +750,7 @@ typedef struct RNAUpdateCb {
ImageUser *iuser;
} RNAUpdateCb;
-static void rna_update_cb(bContext *C, void *arg_cb, void *arg_unused)
+static void rna_update_cb(bContext *C, void *arg_cb, void *UNUSED(arg))
{
RNAUpdateCb *cb= (RNAUpdateCb*)arg_cb;
@@ -746,7 +764,7 @@ static void rna_update_cb(bContext *C, void *arg_cb, void *arg_unused)
RNA_property_update(C, &cb->ptr, cb->prop);
}
-void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, PointerRNA *userptr, int compact)
+void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *propname, PointerRNA *userptr, int compact)
{
PropertyRNA *prop;
PointerRNA imaptr;
@@ -763,15 +781,21 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
if(!ptr->data)
return;
-
+
prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
printf("uiTemplateImage: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
+ if(RNA_property_type(prop) != PROP_POINTER) {
+ printf("uiTemplateImage: expected pointer property for %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ return;
+ }
+
block= uiLayoutGetBlock(layout);
+
imaptr= RNA_property_pointer_get(ptr, prop);
ima= imaptr.data;
iuser= userptr->data;
@@ -796,8 +820,8 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
image_info(ima, ibuf, str);
BKE_image_release_ibuf(ima, lock);
- uiItemL(layout, ima->id.name+2, 0);
- uiItemL(layout, str, 0);
+ uiItemL(layout, ima->id.name+2, ICON_NULL);
+ uiItemL(layout, str, ICON_NULL);
if(ima->type==IMA_TYPE_COMPOSITE) {
// XXX not working yet
@@ -829,7 +853,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
}
else {
row= uiLayoutRow(layout, 0);
- uiItemR(row, &imaptr, "source", 0, NULL, 0);
+ uiItemR(row, &imaptr, "source", 0, NULL, ICON_NULL);
if(ima->source != IMA_SRC_GENERATED) {
row= uiLayoutRow(layout, 1);
@@ -843,7 +867,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
row= uiLayoutRow(split, 1);
uiLayoutSetEnabled(row, ima->packedfile==NULL);
- uiItemR(row, &imaptr, "filepath", 0, "", 0);
+ uiItemR(row, &imaptr, "filepath", 0, "", ICON_NULL);
uiItemO(row, "", ICON_FILE_REFRESH, "image.reload");
}
@@ -867,7 +891,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
ibuf= BKE_image_acquire_ibuf(ima, iuser, &lock);
image_info(ima, ibuf, str);
BKE_image_release_ibuf(ima, lock);
- uiItemL(layout, str, 0);
+ uiItemL(layout, str, ICON_NULL);
}
}
@@ -878,13 +902,13 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
split= uiLayoutSplit(layout, 0, 0);
col= uiLayoutColumn(split, 0);
- uiItemR(col, &imaptr, "use_fields", 0, NULL, 0);
+ uiItemR(col, &imaptr, "use_fields", 0, NULL, ICON_NULL);
row= uiLayoutRow(col, 0);
- uiItemR(row, &imaptr, "field_order", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &imaptr, "field_order", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
uiLayoutSetActive(row, RNA_boolean_get(&imaptr, "use_fields"));
col= uiLayoutColumn(split, 0);
- uiItemR(col, &imaptr, "use_premultiply", 0, NULL, 0);
+ uiItemR(col, &imaptr, "use_premultiply", 0, NULL, ICON_NULL);
}
}
@@ -897,30 +921,30 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
sprintf(str, "(%d) Frames", iuser->framenr);
row= uiLayoutRow(col, 1);
- uiItemR(col, userptr, "frame_duration", 0, str, 0);
+ uiItemR(col, userptr, "frame_duration", 0, str, ICON_NULL);
if(ima->anim) {
block= uiLayoutGetBlock(row);
but= uiDefBut(block, BUT, 0, "Match Movie Length", 0, 0, UI_UNIT_X*2, UI_UNIT_Y, 0, 0, 0, 0, 0, "Set the number of frames to match the movie or sequence.");
uiButSetFunc(but, set_frames_cb, ima, iuser);
}
- uiItemR(col, userptr, "frame_start", 0, "Start", 0);
- uiItemR(col, userptr, "frame_offset", 0, NULL, 0);
+ uiItemR(col, userptr, "frame_start", 0, "Start", ICON_NULL);
+ uiItemR(col, userptr, "frame_offset", 0, NULL, ICON_NULL);
col= uiLayoutColumn(split, 0);
- uiItemR(col, userptr, "fields_per_frame", 0, "Fields", 0);
- uiItemR(col, userptr, "use_auto_refresh", 0, NULL, 0);
- uiItemR(col, userptr, "use_cyclic", 0, NULL, 0);
+ uiItemR(col, userptr, "fields_per_frame", 0, "Fields", ICON_NULL);
+ uiItemR(col, userptr, "use_auto_refresh", 0, NULL, ICON_NULL);
+ uiItemR(col, userptr, "use_cyclic", 0, NULL, ICON_NULL);
}
else if(ima->source==IMA_SRC_GENERATED) {
split= uiLayoutSplit(layout, 0, 0);
col= uiLayoutColumn(split, 1);
- uiItemR(col, &imaptr, "generated_width", 0, "X", 0);
- uiItemR(col, &imaptr, "generated_height", 0, "Y", 0);
+ uiItemR(col, &imaptr, "generated_width", 0, "X", ICON_NULL);
+ uiItemR(col, &imaptr, "generated_height", 0, "Y", ICON_NULL);
col= uiLayoutColumn(split, 0);
- uiItemR(col, &imaptr, "generated_type", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(col, &imaptr, "generated_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
}
}
@@ -944,7 +968,7 @@ void uiTemplateImageLayers(uiLayout *layout, bContext *C, Image *ima, ImageUser
}
}
-static int image_panel_uv_poll(const bContext *C, PanelType *pt)
+static int image_panel_uv_poll(const bContext *C, PanelType *UNUSED(pt))
{
Object *obedit= CTX_data_edit_object(C);
return ED_uvedit_test(obedit);
@@ -989,7 +1013,7 @@ void image_buttons_register(ARegionType *art)
BLI_addtail(&art->paneltypes, pt);
}
-static int image_properties(bContext *C, wmOperator *op)
+static int image_properties(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= image_has_buttons_region(sa);
@@ -1004,6 +1028,7 @@ void IMAGE_OT_properties(wmOperatorType *ot)
{
ot->name= "Properties";
ot->idname= "IMAGE_OT_properties";
+ ot->description= "Toggle display properties panel";
ot->exec= image_properties;
ot->poll= ED_operator_image_active;
@@ -1012,7 +1037,7 @@ void IMAGE_OT_properties(wmOperatorType *ot)
ot->flag= 0;
}
-static int image_scopes(bContext *C, wmOperator *op)
+static int image_scopes(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= image_has_scope_region(sa);
@@ -1027,6 +1052,7 @@ void IMAGE_OT_scopes(wmOperatorType *ot)
{
ot->name= "Scopes";
ot->idname= "IMAGE_OT_scopes";
+ ot->description= "Toggle display scopes panel";
ot->exec= image_scopes;
ot->poll= ED_operator_image_active;
diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c
index 6a77d4da067..3932caeeba6 100644
--- a/source/blender/editors/space_image/image_draw.c
+++ b/source/blender/editors/space_image/image_draw.c
@@ -39,7 +39,9 @@
#include "DNA_brush_types.h"
#include "PIL_time.h"
+
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -49,9 +51,15 @@
#include "BKE_image.h"
#include "BKE_paint.h"
+#ifdef WITH_LCMS
+#include "BKE_colortools.h"
+#endif
+
#include "BIF_gl.h"
#include "BIF_glutil.h"
+#include "BLF_api.h"
+
#include "ED_gpencil.h"
#include "ED_image.h"
@@ -66,7 +74,7 @@
#define HEADER_HEIGHT 18
-static void image_verify_buffer_float(SpaceImage *sima, Image *ima, ImBuf *ibuf, int color_manage)
+static void image_verify_buffer_float(Image *ima, ImBuf *ibuf, int color_manage)
{
/* detect if we need to redo the curve map.
ibuf->rect is zero for compositor and render results after change
@@ -75,7 +83,7 @@ static void image_verify_buffer_float(SpaceImage *sima, Image *ima, ImBuf *ibuf,
NOTE: if float buffer changes, we have to manually remove the rect
*/
- if(ibuf->rect_float && ibuf->rect==NULL) {
+ if(ibuf->rect_float && (ibuf->rect==NULL || (ibuf->userflags & IB_RECT_INVALID)) ) {
if(color_manage) {
if(ima && ima->source == IMA_SRC_VIEWER)
ibuf->profile = IB_PROFILE_LINEAR_RGB;
@@ -123,9 +131,9 @@ void draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *f
char str[256];
int ofs;
- ofs= sprintf(str, "X: %d Y: %d ", x, y);
+ ofs= sprintf(str, "X: %4d Y: %4d ", x, y);
if(cp)
- ofs+= sprintf(str+ofs, "| R: %d G: %d B: %d A: %d ", cp[0], cp[1], cp[2], cp[3]);
+ ofs+= sprintf(str+ofs, "| R: %3d G: %3d B: %3d A: %3d ", cp[0], cp[1], cp[2], cp[3]);
if(fp) {
if(channels==4)
@@ -145,12 +153,16 @@ void draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *f
glEnable(GL_BLEND);
glColor4f(.0,.0,.0,.25);
- glRectf(0.0, 0.0, ar->winrct.xmax - ar->winrct.xmin + 1, 30.0);
+ glRecti(0.0, 0.0, ar->winrct.xmax - ar->winrct.xmin + 1, 20);
glDisable(GL_BLEND);
glColor3ub(255, 255, 255);
- UI_DrawString(10, 10, str);
+ // UI_DrawString(6, 6, str); // works ok but fixed width is nicer.
+ BLF_size(blf_mono_font, 11, 72);
+ BLF_position(blf_mono_font, 6, 6, 0);
+ BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+
}
/* image drawing */
@@ -363,7 +375,7 @@ static void draw_image_buffer(SpaceImage *sima, ARegion *ar, Scene *scene, Image
}
#ifdef WITH_LCMS
else if(sima->flag & SI_COLOR_CORRECTION) {
- image_verify_buffer_float(sima, ima, ibuf, color_manage);
+ image_verify_buffer_float(ima, ibuf, color_manage);
if(sima_draw_colorcorrected_pixels(x, y, ibuf)==0) {
unsigned char col1[3]= {100, 0, 100}, col2[3]= {160, 0, 160}; /* pink says 'warning' in blender land */
@@ -378,12 +390,12 @@ static void draw_image_buffer(SpaceImage *sima, ARegion *ar, Scene *scene, Image
sima_draw_alpha_backdrop(x, y, ibuf->x, ibuf->y, zoomx, zoomy, col1, col2);
glEnable(GL_BLEND);
- glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
/* we don't draw floats buffers directly but
* convert them, and optionally apply curves */
- image_verify_buffer_float(sima, ima, ibuf, color_manage);
+ image_verify_buffer_float(ima, ibuf, color_manage);
if(ibuf->rect)
glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
@@ -436,7 +448,7 @@ static void draw_image_buffer_tiled(SpaceImage *sima, ARegion *ar, Scene *scene,
sima->curtile = ima->xrep*ima->yrep - 1;
/* create char buffer from float if needed */
- image_verify_buffer_float(sima, ima, ibuf, color_manage);
+ image_verify_buffer_float(ima, ibuf, color_manage);
/* retrieve part of image buffer */
dx= ibuf->x/ima->xrep;
@@ -461,13 +473,18 @@ static void draw_image_buffer_tiled(SpaceImage *sima, ARegion *ar, Scene *scene,
static void draw_image_buffer_repeated(SpaceImage *sima, ARegion *ar, Scene *scene, Image *ima, ImBuf *ibuf, float zoomx, float zoomy)
{
- float x, y;
- double time_current;
-
- time_current = PIL_check_seconds_timer();
+ const double time_current= PIL_check_seconds_timer();
+
+ const int xmax= ceil(ar->v2d.cur.xmax);
+ const int ymax= ceil(ar->v2d.cur.ymax);
+ const int xmin= floor(ar->v2d.cur.xmin);
+ const int ymin= floor(ar->v2d.cur.ymin);
+
+ int x;
- for(x=floor(ar->v2d.cur.xmin); x<ar->v2d.cur.xmax; x += 1.0f) {
- for(y=floor(ar->v2d.cur.ymin); y<ar->v2d.cur.ymax; y += 1.0f) {
+ for(x=xmin; x<xmax; x++) {
+ int y;
+ for(y=ymin; y<ymax; y++) {
if(ima && (ima->tpageflag & IMA_TILES))
draw_image_buffer_tiled(sima, ar, scene, ima, ibuf, x, y, zoomx, zoomy);
else
@@ -575,7 +592,7 @@ static unsigned char *get_alpha_clone_image(Scene *scene, int *width, int *heigh
return rect;
}
-static void draw_image_paint_helpers(SpaceImage *sima, ARegion *ar, Scene *scene, float zoomx, float zoomy)
+static void draw_image_paint_helpers(ARegion *ar, Scene *scene, float zoomx, float zoomy)
{
Brush *brush;
int x, y, w, h;
@@ -654,7 +671,8 @@ void draw_image_main(SpaceImage *sima, ARegion *ar, Scene *scene)
draw_image_buffer(sima, ar, scene, ima, ibuf, 0.0f, 0.0f, zoomx, zoomy);
/* paint helpers */
- draw_image_paint_helpers(sima, ar, scene, zoomx, zoomy);
+ if(sima->flag & SI_DRAWTOOL)
+ draw_image_paint_helpers(ar, scene, zoomx, zoomy);
/* XXX integrate this code */
diff --git a/source/blender/editors/space_image/image_header.c b/source/blender/editors/space_image/image_header.c
index 7ecb2565e72..ceb7cda2316 100644
--- a/source/blender/editors/space_image/image_header.c
+++ b/source/blender/editors/space_image/image_header.c
@@ -33,27 +33,23 @@
#include "DNA_space_types.h"
#include "DNA_windowmanager_types.h"
-
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
-
#include "ED_image.h"
#include "WM_types.h"
-
#include "UI_interface.h"
-
-
#include "image_intern.h"
/********************** toolbox operator *********************/
-static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int toolbox_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
SpaceImage *sima= CTX_wm_space_image(C);
Object *obedit= CTX_data_edit_object(C);
@@ -63,13 +59,13 @@ static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
show_uvedit= ED_space_image_show_uvedit(sima, obedit);
- pup= uiPupMenuBegin(C, "Toolbox", 0);
+ pup= uiPupMenuBegin(C, "Toolbox", ICON_NULL);
layout= uiPupMenuLayout(pup);
- uiItemM(layout, C, "IMAGE_MT_view", NULL, 0);
- if(show_uvedit) uiItemM(layout, C, "IMAGE_MT_select", NULL, 0);
- uiItemM(layout, C, "IMAGE_MT_image", NULL, 0);
- if(show_uvedit) uiItemM(layout, C, "IMAGE_MT_uvs", NULL, 0);
+ uiItemM(layout, C, "IMAGE_MT_view", NULL, ICON_NULL);
+ if(show_uvedit) uiItemM(layout, C, "IMAGE_MT_select", NULL, ICON_NULL);
+ uiItemM(layout, C, "IMAGE_MT_image", NULL, ICON_NULL);
+ if(show_uvedit) uiItemM(layout, C, "IMAGE_MT_uvs", NULL, ICON_NULL);
uiPupMenuEnd(C, pup);
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 5a7e2e6fa1b..a0fda09c92b 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -32,6 +32,10 @@
#include "MEM_guardedalloc.h"
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "DNA_object_types.h"
#include "DNA_node_types.h"
#include "DNA_packedFile_types.h"
@@ -48,9 +52,6 @@
#include "BKE_report.h"
#include "BKE_screen.h"
-#include "BLI_math.h"
-#include "BLI_blenlib.h"
-
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -64,6 +65,7 @@
#include "ED_screen.h"
#include "ED_space_api.h"
#include "ED_uvedit.h"
+#include "ED_util.h"
#include "UI_interface.h"
#include "UI_resources.h"
@@ -124,6 +126,7 @@ static int space_image_buffer_exists_poll(bContext *C)
static int space_image_file_exists_poll(bContext *C)
{
if(space_image_buffer_exists_poll(C)) {
+ Main *bmain= CTX_data_main(C);
SpaceImage *sima= CTX_wm_space_image(C);
ImBuf *ibuf;
void *lock;
@@ -133,7 +136,7 @@ static int space_image_file_exists_poll(bContext *C)
ibuf= ED_space_image_acquire_buffer(sima, &lock);
if(ibuf) {
BLI_strncpy(name, ibuf->name, FILE_MAX);
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, bmain->name);
poll= (BLI_exists(name) && BLI_is_writable(name));
}
ED_space_image_release_buffer(sima, lock);
@@ -432,20 +435,16 @@ void IMAGE_OT_view_zoom(wmOperatorType *ot)
* Default behavior is to reset the position of the image and set the zoom to 1
* If the image will not fit within the window rectangle, the zoom is adjusted */
-static int view_all_exec(bContext *C, wmOperator *op)
+static int view_all_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceImage *sima;
ARegion *ar;
- Scene *scene;
- Object *obedit;
float aspx, aspy, zoomx, zoomy, w, h;
int width, height;
/* retrieve state */
sima= CTX_wm_space_image(C);
ar= CTX_wm_region(C);
- scene= (Scene*)CTX_data_scene(C);
- obedit= CTX_data_edit_object(C);
ED_space_image_size(sima, &width, &height);
ED_space_image_aspect(sima, &aspx, &aspy);
@@ -486,7 +485,7 @@ void IMAGE_OT_view_all(wmOperatorType *ot)
/********************** view selected operator *********************/
-static int view_selected_exec(bContext *C, wmOperator *op)
+static int view_selected_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceImage *sima;
ARegion *ar;
@@ -543,7 +542,7 @@ void IMAGE_OT_view_selected(wmOperatorType *ot)
/********************** view zoom in/out operator *********************/
-static int view_zoom_in_exec(bContext *C, wmOperator *op)
+static int view_zoom_in_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceImage *sima= CTX_wm_space_image(C);
ARegion *ar= CTX_wm_region(C);
@@ -566,7 +565,7 @@ void IMAGE_OT_view_zoom_in(wmOperatorType *ot)
ot->poll= space_image_main_area_poll;
}
-static int view_zoom_out_exec(bContext *C, wmOperator *op)
+static int view_zoom_out_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceImage *sima= CTX_wm_space_image(C);
ARegion *ar= CTX_wm_region(C);
@@ -679,7 +678,7 @@ static void open_init(bContext *C, wmOperator *op)
uiIDContextProperty(C, &pprop->ptr, &pprop->prop);
}
-static int open_cancel(bContext *C, wmOperator *op)
+static int open_cancel(bContext *UNUSED(C), wmOperator *op)
{
MEM_freeN(op->customdata);
op->customdata= NULL;
@@ -688,9 +687,10 @@ static int open_cancel(bContext *C, wmOperator *op)
static int open_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= CTX_wm_space_image(C);
+ SpaceImage *sima= CTX_wm_space_image(C); /* XXX other space types can call */
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
+ ImageUser *iuser= NULL;
PropertyPointerRNA *pprop;
PointerRNA idptr;
Image *ima= NULL;
@@ -701,7 +701,7 @@ static int open_exec(bContext *C, wmOperator *op)
errno= 0;
- ima= BKE_add_image_file(str, scene ? scene->r.cfra : 1);
+ ima= BKE_add_image_file(str);
if(!ima) {
if(op->customdata) MEM_freeN(op->customdata);
@@ -724,11 +724,25 @@ static int open_exec(bContext *C, wmOperator *op)
RNA_property_pointer_set(&pprop->ptr, pprop->prop, idptr);
RNA_property_update(C, &pprop->ptr, pprop->prop);
}
- else if(sima)
+ else if(sima) {
ED_space_image_set(C, sima, scene, obedit, ima);
+ iuser= &sima->iuser;
+ }
+ else {
+ Tex *tex= CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data;
+ if(tex && tex->type==TEX_IMAGE)
+ iuser= &tex->iuser;
+
+ }
+
+ /* initialize because of new image */
+ if(iuser) {
+ iuser->sfra= 1;
+ iuser->offset= 0;
+ iuser->fie_ima= 2;
+ }
- // XXX other users?
- BKE_image_signal(ima, (sima)? &sima->iuser: NULL, IMA_SIGNAL_RELOAD);
+ BKE_image_signal(ima, iuser, IMA_SIGNAL_RELOAD);
WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, ima);
MEM_freeN(op->customdata);
@@ -736,9 +750,9 @@ static int open_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int open_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int open_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
- SpaceImage *sima= CTX_wm_space_image(C);
+ SpaceImage *sima= CTX_wm_space_image(C); /* XXX other space types can call */
char *path=U.textudir;
Image *ima= NULL;
@@ -769,6 +783,7 @@ static int open_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
+/* called by other space types too */
void IMAGE_OT_open(wmOperatorType *ot)
{
/* identifiers */
@@ -798,7 +813,7 @@ static int replace_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
RNA_string_get(op->ptr, "filepath", str);
- BLI_strncpy(sima->image->name, str, sizeof(sima->image->name)-1); /* we cant do much if the str is longer then 240 :/ */
+ BLI_strncpy(sima->image->name, str, sizeof(sima->image->name)); /* we cant do much if the str is longer then 240 :/ */
BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_RELOAD);
WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, sima->image);
@@ -806,7 +821,7 @@ static int replace_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int replace_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int replace_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
SpaceImage *sima= CTX_wm_space_image(C);
@@ -853,50 +868,61 @@ static void save_image_doit(bContext *C, SpaceImage *sima, Scene *scene, wmOpera
ImBuf *ibuf= ED_space_image_acquire_buffer(sima, &lock);
if (ibuf) {
- int relative= (RNA_struct_find_property(op->ptr, "relative_path") && RNA_boolean_get(op->ptr, "relative_path"));
- int save_copy= (RNA_struct_find_property(op->ptr, "copy") && RNA_boolean_get(op->ptr, "copy"));
+ Main *bmain= CTX_data_main(C);
+ const short relative= (RNA_struct_find_property(op->ptr, "relative_path") && RNA_boolean_get(op->ptr, "relative_path"));
+ const short save_copy= (RNA_struct_find_property(op->ptr, "copy") && RNA_boolean_get(op->ptr, "copy"));
+ short ok= FALSE;
+
+ BLI_path_abs(path, bmain->name);
+ /* old global to ensure a 2nd save goes to same dir */
+ BLI_strncpy(G.ima, path, sizeof(G.ima));
+
+ WM_cursor_wait(1);
+
+ if(ima->type == IMA_TYPE_R_RESULT) {
+ /* enforce user setting for RGB or RGBA, but skip BW */
+ if(scene->r.planes==32) {
+ ibuf->depth= 32;
+ }
+ else if(scene->r.planes==24) {
+ ibuf->depth= 24;
+ }
+ }
+ else {
+ /* TODO, better solution, if a 24bit image is painted onto it may contain alpha */
+ if(ibuf->userflags & IB_BITMAPDIRTY) { /* it has been painted onto */
+ /* checks each pixel, not ideal */
+ ibuf->depth= BKE_alphatest_ibuf(ibuf) ? 32 : 24;
+ }
+ }
- BLI_path_abs(path, G.sce);
-
if(scene->r.scemode & R_EXTENSION) {
BKE_add_image_extension(path, sima->imtypenr);
}
- /* enforce user setting for RGB or RGBA, but skip BW */
- if(scene->r.planes==32)
- ibuf->depth= 32;
- else if(scene->r.planes==24)
- ibuf->depth= 24;
-
- WM_cursor_wait(1);
-
if(sima->imtypenr==R_MULTILAYER) {
RenderResult *rr= BKE_image_acquire_renderresult(scene, ima);
if(rr) {
RE_WriteRenderResult(rr, path, scene->r.quality);
-
- if(relative)
- BLI_path_rel(path, G.sce); /* only after saving */
-
- if(!save_copy) {
- if(do_newpath) {
- BLI_strncpy(ima->name, path, sizeof(ima->name));
- BLI_strncpy(ibuf->name, path, sizeof(ibuf->name));
- }
-
- /* should be function? nevertheless, saving only happens here */
- for(ibuf= ima->ibufs.first; ibuf; ibuf= ibuf->next)
- ibuf->userflags &= ~IB_BITMAPDIRTY;
- }
+ ok= TRUE;
}
- else
+ else {
BKE_report(op->reports, RPT_ERROR, "Did not write, no Multilayer Image");
+ }
BKE_image_release_renderresult(scene, ima);
}
else if (BKE_write_ibuf(scene, ibuf, path, sima->imtypenr, scene->r.subimtype, scene->r.quality)) {
+ ok= TRUE;
+ }
+ if(ok) {
if(relative)
- BLI_path_rel(path, G.sce); /* only after saving */
+ BLI_path_rel(path, bmain->name); /* only after saving */
+
+ if(ibuf->name[0]==0) {
+ BLI_strncpy(ibuf->name, path, sizeof(ibuf->name));
+ BLI_strncpy(ima->name, path, sizeof(ima->name));
+ }
if(!save_copy) {
if(do_newpath) {
@@ -926,13 +952,12 @@ static void save_image_doit(bContext *C, SpaceImage *sima, Scene *scene, wmOpera
ima->source= IMA_SRC_FILE;
ima->type= IMA_TYPE_IMAGE;
}
-
- /* name image as how we saved it */
- rename_id(&ima->id, BLI_path_basename(path));
}
- }
- else
+ }
+ else {
BKE_reportf(op->reports, RPT_ERROR, "Couldn't write image: %s", path);
+ }
+
WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, sima->image);
@@ -961,7 +986,7 @@ static int save_as_exec(bContext *C, wmOperator *op)
}
-static int save_as_check(bContext *C, wmOperator *op)
+static int save_as_check(bContext *UNUSED(C), wmOperator *op)
{
char filepath[FILE_MAX];
RNA_string_get(op->ptr, "filepath", filepath);
@@ -972,12 +997,14 @@ static int save_as_check(bContext *C, wmOperator *op)
return FALSE;
}
-static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
SpaceImage *sima= CTX_wm_space_image(C);
Image *ima = ED_space_image(sima);
Scene *scene= CTX_data_scene(C);
ImBuf *ibuf;
+ char filename[FILE_MAX];
+
void *lock;
if(!RNA_property_is_set(op->ptr, "relative_path"))
@@ -1006,15 +1033,21 @@ static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event)
RNA_enum_set(op->ptr, "file_type", sima->imtypenr);
if(ibuf->name[0]==0)
- BLI_strncpy(ibuf->name, G.ima, FILE_MAX);
-
+ if ( (G.ima[0] == '/') && (G.ima[1] == '/') && (G.ima[2] == '\0') ) {
+ BLI_strncpy(filename, "//untitled", FILE_MAX);
+ } else {
+ BLI_strncpy(filename, G.ima, FILE_MAX);
+ }
+ else
+ BLI_strncpy(filename, ibuf->name, FILE_MAX);
+
/* enable save_copy by default for render results */
if(ELEM(ima->type, IMA_TYPE_R_RESULT, IMA_TYPE_COMPOSITE) && !RNA_property_is_set(op->ptr, "copy")) {
RNA_boolean_set(op->ptr, "copy", TRUE);
}
// XXX note: we can give default menu enums to operator for this
- image_filesel(C, op, ibuf->name);
+ image_filesel(C, op, filename);
ED_space_image_release_buffer(sima, lock);
@@ -1052,6 +1085,7 @@ void IMAGE_OT_save_as(wmOperatorType *ot)
static int save_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
SpaceImage *sima= CTX_wm_space_image(C);
Image *ima = ED_space_image(sima);
void *lock;
@@ -1071,7 +1105,7 @@ static int save_exec(bContext *C, wmOperator *op)
if(name[0]==0)
BLI_strncpy(name, G.ima, FILE_MAX);
else
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, bmain->name);
if(BLI_exists(name) && BLI_is_writable(name)) {
rr= BKE_image_acquire_renderresult(scene, ima);
@@ -1114,6 +1148,7 @@ void IMAGE_OT_save(wmOperatorType *ot)
static int save_sequence_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
SpaceImage *sima= CTX_wm_space_image(C);
ImBuf *ibuf;
int tot= 0;
@@ -1157,7 +1192,7 @@ static int save_sequence_exec(bContext *C, wmOperator *op)
char name[FILE_MAX];
BLI_strncpy(name, ibuf->name, sizeof(name));
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, bmain->name);
if(0 == IMB_saveiff(ibuf, name, IB_rect | IB_zbuf | IB_zbuffloat)) {
BKE_reportf(op->reports, RPT_ERROR, "Could not write image %s.", name);
@@ -1188,7 +1223,7 @@ void IMAGE_OT_save_sequence(wmOperatorType *ot)
/******************** reload image operator ********************/
-static int reload_exec(bContext *C, wmOperator *op)
+static int reload_exec(bContext *C, wmOperator *UNUSED(op))
{
Image *ima= CTX_data_edit_image(C);
SpaceImage *sima= CTX_wm_space_image(C);
@@ -1219,7 +1254,7 @@ void IMAGE_OT_reload(wmOperatorType *ot)
/********************** new image operator *********************/
-static int new_exec(bContext *C, wmOperator *op)
+static int image_new_exec(bContext *C, wmOperator *op)
{
SpaceImage *sima;
Scene *scene;
@@ -1276,6 +1311,13 @@ static int new_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
+/* XXX, Ton is not a fan of OK buttons but using this function to avoid undo/redo bug while in mesh-editmode, - campbell */
+static int image_new_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+{
+ return WM_operator_props_dialog_popup(C, op, 300, 100);
+
+}
+
void IMAGE_OT_new(wmOperatorType *ot)
{
PropertyRNA *prop;
@@ -1286,14 +1328,14 @@ void IMAGE_OT_new(wmOperatorType *ot)
ot->idname= "IMAGE_OT_new";
/* api callbacks */
- ot->exec= new_exec;
- ot->invoke= WM_operator_props_popup;
-
+ ot->exec= image_new_exec;
+ ot->invoke= image_new_invoke;
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_string(ot->srna, "name", "Untitled", 21, "Name", "Image datablock name.");
+ RNA_def_string(ot->srna, "name", "untitled", 21, "Name", "Image datablock name.");
RNA_def_int(ot->srna, "width", 1024, 1, INT_MAX, "Width", "Image width.", 1, 16384);
RNA_def_int(ot->srna, "height", 1024, 1, INT_MAX, "Height", "Image height.", 1, 16384);
prop= RNA_def_float_color(ot->srna, "color", 4, NULL, 0.0f, FLT_MAX, "Color", "Default fill color.", 0.0f, 1.0f);
@@ -1347,7 +1389,7 @@ static int pack_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int pack_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int pack_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Image *ima= CTX_data_edit_image(C);
ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
@@ -1361,7 +1403,7 @@ static int pack_invoke(bContext *C, wmOperator *op, wmEvent *event)
if(!as_png && (ibuf && (ibuf->userflags & IB_BITMAPDIRTY))) {
pup= uiPupMenuBegin(C, "OK", ICON_QUESTION);
layout= uiPupMenuLayout(pup);
- uiItemBooleanO(layout, "Can't pack edited image from disk. Pack as internal PNG?", 0, op->idname, "as_png", 1);
+ uiItemBooleanO(layout, "Can't pack edited image from disk. Pack as internal PNG?", ICON_NULL, op->idname, "as_png", 1);
uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
@@ -1390,101 +1432,15 @@ void IMAGE_OT_pack(wmOperatorType *ot)
/********************* unpack operator *********************/
-void unpack_menu(bContext *C, char *opname, Image *ima, char *folder, PackedFile *pf)
-{
- PointerRNA props_ptr;
- uiPopupMenu *pup;
- uiLayout *layout;
- char line[FILE_MAXDIR + FILE_MAXFILE + 100];
- char local_name[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX];
- char *abs_name = ima->name;
-
- strcpy(local_name, abs_name);
- BLI_splitdirstring(local_name, fi);
- sprintf(local_name, "//%s/%s", folder, fi);
-
- pup= uiPupMenuBegin(C, "Unpack file", 0);
- layout= uiPupMenuLayout(pup);
-
- uiItemEnumO(layout, opname, "Remove Pack", 0, "method", PF_REMOVE);
-
- if(strcmp(abs_name, local_name)) {
- switch(checkPackedFile(local_name, pf)) {
- case PF_NOFILE:
- sprintf(line, "Create %s", local_name);
- props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
- RNA_enum_set(&props_ptr, "method", PF_WRITE_LOCAL);
- RNA_string_set(&props_ptr, "image", ima->id.name+2);
-
- break;
- case PF_EQUAL:
- sprintf(line, "Use %s (identical)", local_name);
- //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL);
- props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
- RNA_enum_set(&props_ptr, "method", PF_USE_LOCAL);
- RNA_string_set(&props_ptr, "image", ima->id.name+2);
-
- break;
- case PF_DIFFERS:
- sprintf(line, "Use %s (differs)", local_name);
- //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL);
- props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
- RNA_enum_set(&props_ptr, "method", PF_USE_LOCAL);
- RNA_string_set(&props_ptr, "image", ima->id.name);
-
- sprintf(line, "Overwrite %s", local_name);
- //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_LOCAL);
- props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
- RNA_enum_set(&props_ptr, "method", PF_WRITE_LOCAL);
- RNA_string_set(&props_ptr, "image", ima->id.name+2);
-
-
- break;
- }
- }
-
- switch(checkPackedFile(abs_name, pf)) {
- case PF_NOFILE:
- sprintf(line, "Create %s", abs_name);
- //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL);
- props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
- RNA_enum_set(&props_ptr, "method", PF_WRITE_ORIGINAL);
- RNA_string_set(&props_ptr, "image", ima->id.name+2);
- break;
- case PF_EQUAL:
- sprintf(line, "Use %s (identical)", abs_name);
- //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL);
- props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
- RNA_enum_set(&props_ptr, "method", PF_USE_ORIGINAL);
- RNA_string_set(&props_ptr, "image", ima->id.name+2);
- break;
- case PF_DIFFERS:
- sprintf(line, "Use %s (differs)", local_name);
- //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL);
- props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
- RNA_enum_set(&props_ptr, "method", PF_USE_ORIGINAL);
- RNA_string_set(&props_ptr, "image", ima->id.name+2);
-
- sprintf(line, "Overwrite %s", local_name);
- //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL);
- props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
- RNA_enum_set(&props_ptr, "method", PF_WRITE_ORIGINAL);
- RNA_string_set(&props_ptr, "image", ima->id.name+2);
- break;
- }
-
- uiPupMenuEnd(C, pup);
-}
-
-static int unpack_exec(bContext *C, wmOperator *op)
+static int image_unpack_exec(bContext *C, wmOperator *op)
{
Image *ima= CTX_data_edit_image(C);
int method= RNA_enum_get(op->ptr, "method");
/* find the suppplied image by name */
- if (RNA_property_is_set(op->ptr, "image")) {
+ if (RNA_property_is_set(op->ptr, "id")) {
char imaname[22];
- RNA_string_get(op->ptr, "image", imaname);
+ RNA_string_get(op->ptr, "id", imaname);
ima = BLI_findstring(&CTX_data_main(C)->image, imaname, offsetof(ID, name) + 2);
if (!ima) ima = CTX_data_edit_image(C);
}
@@ -1507,12 +1463,12 @@ static int unpack_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int unpack_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int image_unpack_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Image *ima= CTX_data_edit_image(C);
- if(RNA_property_is_set(op->ptr, "image"))
- return unpack_exec(C, op);
+ if(RNA_property_is_set(op->ptr, "id"))
+ return image_unpack_exec(C, op);
if(!ima || !ima->packedfile)
return OPERATOR_CANCELLED;
@@ -1524,8 +1480,8 @@ static int unpack_invoke(bContext *C, wmOperator *op, wmEvent *event)
if(G.fileflags & G_AUTOPACK)
BKE_report(op->reports, RPT_WARNING, "AutoPack is enabled, so image will be packed again on file save.");
-
- unpack_menu(C, "IMAGE_OT_unpack", ima, "textures", ima->packedfile);
+
+ unpack_menu(C, "IMAGE_OT_unpack", ima->id.name+2, ima->name, "textures", ima->packedfile);
return OPERATOR_FINISHED;
}
@@ -1538,15 +1494,15 @@ void IMAGE_OT_unpack(wmOperatorType *ot)
ot->idname= "IMAGE_OT_unpack";
/* api callbacks */
- ot->exec= unpack_exec;
- ot->invoke= unpack_invoke;
+ ot->exec= image_unpack_exec;
+ ot->invoke= image_unpack_invoke;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
RNA_def_enum(ot->srna, "method", unpack_method_items, PF_USE_LOCAL, "Method", "How to unpack.");
- RNA_def_string(ot->srna, "image", "", 21, "Image Name", "Image datablock name to unpack.");
+ RNA_def_string(ot->srna, "id", "", 21, "Image Name", "Image datablock name to unpack."); /* XXX, weark!, will fail with library, name collisions */
}
/******************** sample image operator ********************/
@@ -1570,7 +1526,7 @@ typedef struct ImageSampleInfo {
int draw;
} ImageSampleInfo;
-static void sample_draw(const bContext *C, ARegion *ar, void *arg_info)
+static void sample_draw(const bContext *UNUSED(C), ARegion *ar, void *arg_info)
{
ImageSampleInfo *info= arg_info;
@@ -1586,16 +1542,16 @@ static void sample_apply(bContext *C, wmOperator *op, wmEvent *event)
ImBuf *ibuf= ED_space_image_acquire_buffer(sima, &lock);
ImageSampleInfo *info= op->customdata;
float fx, fy;
- int x, y;
+ int mx, my;
if(ibuf == NULL) {
ED_space_image_release_buffer(sima, lock);
return;
}
- x= event->x - ar->winrct.xmin;
- y= event->y - ar->winrct.ymin;
- UI_view2d_region_to_view(&ar->v2d, x, y, &fx, &fy);
+ mx= event->x - ar->winrct.xmin;
+ my= event->y - ar->winrct.ymin;
+ UI_view2d_region_to_view(&ar->v2d, mx, my, &fx, &fy);
if(fx>=0.0 && fy>=0.0 && fx<1.0 && fy<1.0) {
float *fp;
@@ -1656,11 +1612,13 @@ static void sample_apply(bContext *C, wmOperator *op, wmEvent *event)
if(point == 1) {
curvemapping_set_black_white(sima->cumap, NULL, info->colfp);
- curvemapping_do_ibuf(sima->cumap, ibuf);
+ if(ibuf->rect_float)
+ curvemapping_do_ibuf(sima->cumap, ibuf);
}
else if(point == 0) {
curvemapping_set_black_white(sima->cumap, info->colfp, NULL);
- curvemapping_do_ibuf(sima->cumap, ibuf);
+ if(ibuf->rect_float)
+ curvemapping_do_ibuf(sima->cumap, ibuf);
}
}
}
@@ -1983,9 +1941,9 @@ static int record_composite_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int record_composite_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int record_composite_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
- RecordCompositeData *rcd= op->customdata;
+ RecordCompositeData *rcd;
if(!record_composite_init(C, op))
return OPERATOR_CANCELLED;
@@ -2054,14 +2012,20 @@ static int cycle_render_slot_exec(bContext *C, wmOperator *op)
{
Image *ima= CTX_data_edit_image(C);
int a, slot, cur= ima->render_slot;
+ const short use_reverse= RNA_boolean_get(op->ptr, "reverse");
for(a=1; a<IMA_MAX_RENDER_SLOT; a++) {
- slot= (cur+a)%IMA_MAX_RENDER_SLOT;
+ slot= (cur + (use_reverse ? -a:a))%IMA_MAX_RENDER_SLOT;
+ if(slot<0) slot+=IMA_MAX_RENDER_SLOT;
if(ima->renders[slot] || slot == ima->last_render_slot) {
ima->render_slot= slot;
break;
}
+ else if((slot - 1) == ima->last_render_slot && slot < IMA_MAX_RENDER_SLOT) {
+ ima->render_slot= slot;
+ break;
+ }
}
if(a == IMA_MAX_RENDER_SLOT)
@@ -2084,6 +2048,8 @@ void IMAGE_OT_cycle_render_slot(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_boolean(ot->srna, "reverse", 0, "Cycle in Reverse", "");
}
/******************** TODO ********************/
@@ -2092,11 +2058,9 @@ void IMAGE_OT_cycle_render_slot(wmOperatorType *ot)
/* goes over all ImageUsers, and sets frame numbers if auto-refresh is set */
-void ED_image_update_frame(const bContext *C)
+void ED_image_update_frame(const Main *mainp, int cfra)
{
- Main *mainp= CTX_data_main(C);
- Scene *scene= CTX_data_scene(C);
- wmWindowManager *wm= CTX_wm_manager(C);
+ wmWindowManager *wm;
wmWindow *win;
Tex *tex;
@@ -2105,13 +2069,13 @@ void ED_image_update_frame(const bContext *C)
if(tex->type==TEX_IMAGE && tex->ima) {
if(ELEM(tex->ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
if(tex->iuser.flag & IMA_ANIM_ALWAYS)
- BKE_image_user_calc_frame(&tex->iuser, scene->r.cfra, 0);
+ BKE_image_user_calc_frame(&tex->iuser, cfra, 0);
}
}
}
/* image window, compo node users */
- if(wm) {
+ for(wm=mainp->wm.first; wm; wm= wm->id.next) { /* only 1 wm */
for(win= wm->windows.first; win; win= win->next) {
ScrArea *sa;
for(sa= win->screen->areabase.first; sa; sa= sa->next) {
@@ -2120,12 +2084,12 @@ void ED_image_update_frame(const bContext *C)
BGpic *bgpic;
for(bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next)
if(bgpic->iuser.flag & IMA_ANIM_ALWAYS)
- BKE_image_user_calc_frame(&bgpic->iuser, scene->r.cfra, 0);
+ BKE_image_user_calc_frame(&bgpic->iuser, cfra, 0);
}
else if(sa->spacetype==SPACE_IMAGE) {
SpaceImage *sima= sa->spacedata.first;
if(sima->iuser.flag & IMA_ANIM_ALWAYS)
- BKE_image_user_calc_frame(&sima->iuser, scene->r.cfra, 0);
+ BKE_image_user_calc_frame(&sima->iuser, cfra, 0);
}
else if(sa->spacetype==SPACE_NODE) {
SpaceNode *snode= sa->spacedata.first;
@@ -2137,7 +2101,7 @@ void ED_image_update_frame(const bContext *C)
ImageUser *iuser= node->storage;
if(ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE))
if(iuser->flag & IMA_ANIM_ALWAYS)
- BKE_image_user_calc_frame(iuser, scene->r.cfra, 0);
+ BKE_image_user_calc_frame(iuser, cfra, 0);
}
}
}
diff --git a/source/blender/editors/space_image/image_render.c b/source/blender/editors/space_image/image_render.c
index be9d60a5adb..d80801f8868 100644
--- a/source/blender/editors/space_image/image_render.c
+++ b/source/blender/editors/space_image/image_render.c
@@ -28,6 +28,8 @@
#include <stdlib.h>
#include <stdio.h>
+#include "BLI_utildefines.h"
+
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
@@ -149,7 +151,7 @@ void imagewindow_toggle_render(bContext *C)
}
/* NOTE: called while render, so no malloc allowed! */
-static void imagewindow_renderinfo_cb(void *handle, RenderStats *rs)
+static void imagewindow_renderinfo_cb(void *UNUSED(handle), RenderStats *UNUSED(rs))
{
if(image_area) {
// XXX BIF_make_render_text(rs);
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index ffa8f6ebb83..af4e496f68a 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -39,6 +39,7 @@
#include "BLI_math.h"
#include "BLI_editVert.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_colortools.h"
#include "BKE_context.h"
@@ -225,9 +226,18 @@ void ED_space_image_uv_aspect(SpaceImage *sima, float *aspx, float *aspy)
ED_space_image_aspect(sima, aspx, aspy);
ED_space_image_size(sima, &w, &h);
+
+ *aspx *= (float)w;
+ *aspy *= (float)h;
- *aspx *= (float)w/256.0f;
- *aspy *= (float)h/256.0f;
+ if(*aspx < *aspy) {
+ *aspy= *aspy / *aspx;
+ *aspx= 1.0f;
+ }
+ else {
+ *aspx= *aspx / *aspy;
+ *aspy= 1.0f;
+ }
}
void ED_image_uv_aspect(Image *ima, float *aspx, float *aspy)
@@ -256,11 +266,9 @@ int ED_space_image_show_paint(SpaceImage *sima)
int ED_space_image_show_uvedit(SpaceImage *sima, Object *obedit)
{
- if(ED_space_image_show_render(sima))
+ if(sima && (ED_space_image_show_render(sima) || ED_space_image_show_paint(sima)))
return 0;
- if(ED_space_image_show_paint(sima))
- return 0;
-
+
if(obedit && obedit->type == OB_MESH) {
EditMesh *em = BKE_mesh_get_editmesh(obedit->data);
int ret;
@@ -369,7 +377,7 @@ ARegion *image_has_scope_region(ScrArea *sa)
/* ******************** default callbacks for image space ***************** */
-static SpaceLink *image_new(const bContext *C)
+static SpaceLink *image_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceImage *simage;
@@ -384,6 +392,7 @@ static SpaceLink *image_new(const bContext *C)
simage->iuser.frames= 100;
scopes_new(&simage->scopes);
+ simage->sample_line_hist.height= 100;
/* header */
ar= MEM_callocN(sizeof(ARegion), "header for image");
@@ -429,7 +438,7 @@ static void image_free(SpaceLink *sl)
/* spacetype; init callback, add handlers */
-static void image_init(struct wmWindowManager *wm, ScrArea *sa)
+static void image_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa)
{
ListBase *lb= WM_dropboxmap_find("Image", SPACE_IMAGE, 0);
@@ -485,6 +494,7 @@ void image_operatortypes(void)
void image_keymap(struct wmKeyConfig *keyconf)
{
wmKeyMap *keymap= WM_keymap_find(keyconf, "Image Generic", SPACE_IMAGE, 0);
+ wmKeyMapItem *kmi;
WM_keymap_add_item(keymap, "IMAGE_OT_new", NKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_open", OKEY, KM_PRESS, KM_ALT, 0);
@@ -495,12 +505,14 @@ void image_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "IMAGE_OT_scopes", PKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_cycle_render_slot", JKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "IMAGE_OT_cycle_render_slot", JKEY, KM_PRESS, KM_ALT, 0)->ptr, "reverse", TRUE);
keymap= WM_keymap_find(keyconf, "Image", SPACE_IMAGE, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_pan", MIDDLEMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "IMAGE_OT_view_pan", MIDDLEMOUSE, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_pan", MOUSEPAN, 0, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_in", WHEELINMOUSE, KM_PRESS, 0, 0);
@@ -523,10 +535,15 @@ void image_keymap(struct wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "IMAGE_OT_curves_point_set", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "point", 1);
WM_keymap_add_item(keymap, "IMAGE_OT_toolbox", SPACEKEY, KM_PRESS, 0, 0);
+
+ /* toggle editmode is handy to have while UV unwrapping */
+ kmi= WM_keymap_add_item(keymap, "OBJECT_OT_mode_set", TABKEY, KM_PRESS, 0, 0);
+ RNA_enum_set(kmi->ptr, "mode", OB_MODE_EDIT);
+ RNA_boolean_set(kmi->ptr, "toggle", 1);
}
/* dropboxes */
-static int image_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int image_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_PATH)
if(ELEM3(drag->icon, 0, ICON_FILE_IMAGE, ICON_FILE_BLANK)) /* rule might not work? */
@@ -550,7 +567,7 @@ static void image_dropboxes(void)
-static void image_refresh(const bContext *C, ScrArea *sa)
+static void image_refresh(const bContext *C, ScrArea *UNUSED(sa))
{
SpaceImage *sima= CTX_wm_space_image(C);
Object *obedit= CTX_data_edit_object(C);
@@ -569,13 +586,13 @@ static void image_refresh(const bContext *C, ScrArea *sa)
MTFace *tf;
if(em && EM_texFaceCheck(em)) {
- sima->image= ima= NULL;
+ sima->image= NULL;
tf = EM_get_active_mtface(em, NULL, NULL, 1); /* partially selected face is ok */
if(tf && (tf->mode & TF_TEX)) {
/* don't need to check for pin here, see above */
- sima->image= ima= tf->tpage;
+ sima->image= tf->tpage;
if(sima->flag & SI_EDITTILE);
else sima->curtile= tf->tile;
@@ -626,19 +643,24 @@ static void image_listener(ScrArea *sa, wmNotifier *wmn)
switch(wmn->data) {
case ND_DATA:
case ND_SELECT:
+ image_scopes_tag_refresh(sa);
ED_area_tag_refresh(sa);
ED_area_tag_redraw(sa);
break;
}
case NC_OBJECT:
+ {
+ Object *ob= (Object *)wmn->reference;
switch(wmn->data) {
case ND_TRANSFORM:
- if(sima->lock && (sima->flag & SI_DRAWSHADOW)) {
+ case ND_MODIFIER:
+ if(ob && (ob->mode & OB_MODE_EDIT) && sima->lock && (sima->flag & SI_DRAWSHADOW)) {
ED_area_tag_refresh(sa);
ED_area_tag_redraw(sa);
}
break;
}
+ }
}
}
@@ -746,6 +768,9 @@ static void image_main_area_draw(const bContext *C, ARegion *ar)
//View2DScrollers *scrollers;
float col[3];
+ /* XXX not supported yet, disabling for now */
+ scene->r.scemode &= ~R_COMP_CROP;
+
/* clear and setup matrix */
UI_GetThemeColor3fv(TH_BACK, col);
glClearColor(col[0], col[1], col[2], 0.0);
@@ -761,7 +786,7 @@ static void image_main_area_draw(const bContext *C, ARegion *ar)
draw_image_main(sima, ar, scene);
/* and uvs in 0.0-1.0 space */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
draw_uvedit_main(sima, ar, scene, obedit);
ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_VIEW);
@@ -877,7 +902,7 @@ static void image_scope_area_listener(ARegion *ar, wmNotifier *wmn)
/************************* header region **************************/
/* add handlers, stuff you only do once or on area/region changes */
-static void image_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void image_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
diff --git a/source/blender/editors/space_info/CMakeLists.txt b/source/blender/editors/space_info/CMakeLists.txt
index 9d439c4ec00..262882e886f 100644
--- a/source/blender/editors/space_info/CMakeLists.txt
+++ b/source/blender/editors/space_info/CMakeLists.txt
@@ -19,10 +19,9 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
+ ../../blenfont
../../blenkernel
../../blenlib
../../imbuf
@@ -32,4 +31,16 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_space_info "${SRC}" "${INC}")
+set(SRC
+ info_ops.c
+ info_stats.c
+ info_draw.c
+ info_report.c
+ textview.c
+ space_info.c
+
+ info_intern.h
+ textview.h
+)
+
+blender_add_lib(bf_editor_space_info "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_info/Makefile b/source/blender/editors/space_info/Makefile
deleted file mode 100644
index 46feeec8613..00000000000
--- a/source/blender/editors/space_info/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_info
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../blenfont
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_info/info_draw.c b/source/blender/editors/space_info/info_draw.c
new file mode 100644
index 00000000000..f828b11fe67
--- /dev/null
+++ b/source/blender/editors/space_info/info_draw.c
@@ -0,0 +1,292 @@
+/**
+ * $Id: info_draw.c 34160 2011-01-07 19:18:31Z campbellbarton $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2010 Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <limits.h>
+
+#include "BLF_api.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_space_types.h"
+#include "DNA_screen_types.h"
+
+// #include "BKE_suggestions.h"
+#include "BKE_report.h"
+
+
+#include "MEM_guardedalloc.h"
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+
+#include "ED_datafiles.h"
+#include "ED_types.h"
+
+#include "UI_resources.h"
+
+#include "info_intern.h"
+#include "../space_info/textview.h"
+
+/* complicates things a bit, so leaving in old simple code */
+#define USE_INFO_NEWLINE
+
+static void info_report_color(unsigned char *fg, unsigned char *bg, Report *report, int bool)
+{
+ /*
+ if (type & RPT_ERROR_ALL) { fg[0]=220; fg[1]=0; fg[2]=0; }
+ else if (type & RPT_WARNING_ALL) { fg[0]=220; fg[1]=96; fg[2]=96; }
+ else if (type & RPT_OPERATOR_ALL) { fg[0]=96; fg[1]=128; fg[2]=255; }
+ else if (type & RPT_INFO_ALL) { fg[0]=0; fg[1]=170; fg[2]=0; }
+ else if (type & RPT_DEBUG_ALL) { fg[0]=196; fg[1]=196; fg[2]=196; }
+ else { fg[0]=196; fg[1]=196; fg[2]=196; }
+ */
+ if(report->flag & SELECT) {
+ fg[0]=255; fg[1]=255; fg[2]=255;
+ if(bool) {
+ bg[0]=96; bg[1]=128; bg[2]=255;
+ }
+ else {
+ bg[0]=90; bg[1]=122; bg[2]=249;
+ }
+ }
+
+ else {
+ fg[0]=0; fg[1]=0; fg[2]=0;
+
+ if(bool) {
+ bg[0]=120; bg[1]=120; bg[2]=120;
+ }
+ else {
+ bg[0]=114; bg[1]=114; bg[2]=114;
+ }
+
+ }
+}
+
+/* reports! */
+#ifdef USE_INFO_NEWLINE
+static void report_textview_init__internal(TextViewContext *tvc)
+{
+ Report *report= (Report *)tvc->iter;
+ const char *str= report->message;
+ const char *next_str= strchr(str + tvc->iter_char, '\n');
+
+ if(next_str) {
+ tvc->iter_char_next= (int)(next_str - str);
+ }
+ else {
+ tvc->iter_char_next= report->len;
+ }
+}
+
+static int report_textview_skip__internal(TextViewContext *tvc)
+{
+ SpaceInfo *sinfo= (SpaceInfo *)tvc->arg1;
+ const int report_mask= info_report_mask(sinfo);
+ while (tvc->iter && (((Report *)tvc->iter)->type & report_mask)==0) {
+ tvc->iter= (void *)((Link *)tvc->iter)->prev;
+ }
+ return (tvc->iter != NULL);
+}
+
+#endif // USE_INFO_NEWLINE
+
+static int report_textview_begin(TextViewContext *tvc)
+{
+ // SpaceConsole *sc= (SpaceConsole *)tvc->arg1;
+ ReportList *reports= (ReportList *)tvc->arg2;
+
+ tvc->lheight= 14; //sc->lheight;
+ tvc->sel_start= 0;
+ tvc->sel_end= 0;
+
+ /* iterator */
+ tvc->iter= reports->list.last;
+
+ glClearColor(120.0/255.0, 120.0/255.0, 120.0/255.0, 1.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+#ifdef USE_INFO_NEWLINE
+ tvc->iter_tmp= 0;
+ if(tvc->iter && report_textview_skip__internal(tvc)) {
+ /* init the newline iterator */
+ tvc->iter_char= 0;
+ report_textview_init__internal(tvc);
+
+ return TRUE;
+ }
+ else {
+ return FALSE;
+ }
+#else
+ return (tvc->iter != NULL);
+#endif
+}
+
+static void report_textview_end(TextViewContext *UNUSED(tvc))
+{
+ /* pass */
+}
+
+#ifdef USE_INFO_NEWLINE
+static int report_textview_step(TextViewContext *tvc)
+{
+ /* simple case, but no newline support */
+ Report *report= (Report *)tvc->iter;
+
+ if(report->len <= tvc->iter_char_next) {
+ tvc->iter= (void *)((Link *)tvc->iter)->prev;
+ if(tvc->iter && report_textview_skip__internal(tvc)) {
+ tvc->iter_tmp++;
+
+ tvc->iter_char= 0; /* reset start */
+ report_textview_init__internal(tvc);
+
+ return TRUE;
+ }
+ else {
+ return FALSE;
+ }
+ }
+ else {
+ /* step to the next newline */
+ tvc->iter_char= tvc->iter_char_next + 1;
+ report_textview_init__internal(tvc);
+
+ return TRUE;
+ }
+}
+
+static int report_textview_line_get(struct TextViewContext *tvc, const char **line, int *len)
+{
+ Report *report= (Report *)tvc->iter;
+ *line= report->message + tvc->iter_char;
+ *len= tvc->iter_char_next - tvc->iter_char;
+ return 1;
+}
+
+static int report_textview_line_color(struct TextViewContext *tvc, unsigned char fg[3], unsigned char bg[3])
+{
+ Report *report= (Report *)tvc->iter;
+ info_report_color(fg, bg, report, tvc->iter_tmp % 2);
+ return TVC_LINE_FG | TVC_LINE_BG;
+}
+
+
+#else // USE_INFO_NEWLINE
+
+static int report_textview_step(TextViewContext *tvc)
+{
+ SpaceInfo *sinfo= (SpaceInfo *)tvc->arg1;
+ const int report_mask= info_report_mask(sinfo);
+ do {
+ tvc->iter= (void *)((Link *)tvc->iter)->prev;
+ } while (tvc->iter && (((Report *)tvc->iter)->type & report_mask)==0);
+
+ return (tvc->iter != NULL);
+}
+
+static int report_textview_line_get(struct TextViewContext *tvc, const char **line, int *len)
+{
+ Report *report= (Report *)tvc->iter;
+ *line= report->message;
+ *len= report->len;
+
+ return 1;
+}
+
+static int report_textview_line_color(struct TextViewContext *tvc, unsigned char fg[3], unsigned char bg[3])
+{
+ Report *report= (Report *)tvc->iter;
+ info_report_color(fg, bg, report, tvc->iter_tmp % 2);
+ return TVC_LINE_FG | TVC_LINE_BG;
+}
+
+#endif // USE_INFO_NEWLINE
+
+#undef USE_INFO_NEWLINE
+
+static int info_textview_main__internal(struct SpaceInfo *sinfo, struct ARegion *ar, ReportList *reports, int draw, int mval[2], void **mouse_pick, int *pos_pick)
+{
+ int ret= 0;
+
+ View2D *v2d= &ar->v2d;
+
+ TextViewContext tvc= {0};
+ tvc.begin= report_textview_begin;
+ tvc.end= report_textview_end;
+
+ tvc.step= report_textview_step;
+ tvc.line_get= report_textview_line_get;
+ tvc.line_color= report_textview_line_color;
+
+ tvc.arg1= sinfo;
+ tvc.arg2= reports;
+
+ /* view */
+ tvc.sel_start= 0;
+ tvc.sel_end= 0;
+ tvc.lheight= 14; //sc->lheight;
+ tvc.ymin= v2d->cur.ymin;
+ tvc.ymax= v2d->cur.ymax;
+ tvc.winx= ar->winx;
+
+ ret= textview_draw(&tvc, draw, mval, mouse_pick, pos_pick);
+
+ return ret;
+}
+
+void *info_text_pick(struct SpaceInfo *sinfo, struct ARegion *ar, ReportList *reports, int mouse_y)
+{
+ void *mouse_pick= NULL;
+ int mval[2];
+
+ mval[0]= 0;
+ mval[1]= mouse_y;
+
+ info_textview_main__internal(sinfo, ar, reports, 0, mval, &mouse_pick, NULL);
+ return (void *)mouse_pick;
+}
+
+
+int info_textview_height(struct SpaceInfo *sinfo, struct ARegion *ar, ReportList *reports)
+{
+ int mval[2] = {INT_MAX, INT_MAX};
+ return info_textview_main__internal(sinfo, ar, reports, 0, mval, NULL, NULL);
+}
+
+void info_textview_main(struct SpaceInfo *sinfo, struct ARegion *ar, ReportList *reports)
+{
+ int mval[2] = {INT_MAX, INT_MAX};
+ info_textview_main__internal(sinfo, ar, reports, 1, mval, NULL, NULL);
+}
diff --git a/source/blender/editors/space_info/info_intern.h b/source/blender/editors/space_info/info_intern.h
index 4053bbf5a1f..abbe37a4fe1 100644
--- a/source/blender/editors/space_info/info_intern.h
+++ b/source/blender/editors/space_info/info_intern.h
@@ -30,7 +30,9 @@
/* internal exports only */
+struct SpaceInfo;
struct wmOperatorType;
+struct ReportList;
void FILE_OT_pack_all(struct wmOperatorType *ot);
void FILE_OT_unpack_all(struct wmOperatorType *ot);
@@ -41,5 +43,19 @@ void FILE_OT_find_missing_files(struct wmOperatorType *ot);
void INFO_OT_reports_display_update(struct wmOperatorType *ot);
-#endif /* ED_INFO_INTERN_H */
+/* info_draw.c */
+void *info_text_pick(struct SpaceInfo *sinfo, struct ARegion *ar, ReportList *reports, int mouse_y);
+int info_textview_height(struct SpaceInfo *sinfo, struct ARegion *ar, struct ReportList *reports);
+void info_textview_main(struct SpaceInfo *sinfo, struct ARegion *ar, struct ReportList *reports);
+
+/* info_report.c */
+int info_report_mask(struct SpaceInfo *sinfo);
+void INFO_OT_select_pick(struct wmOperatorType *ot); /* report selection */
+void INFO_OT_select_all_toggle(struct wmOperatorType *ot);
+void INFO_OT_select_border(struct wmOperatorType *ot);
+void INFO_OT_report_replay(struct wmOperatorType *ot);
+void INFO_OT_report_delete(struct wmOperatorType *ot);
+void INFO_OT_report_copy(struct wmOperatorType *ot);
+
+#endif /* ED_INFO_INTERN_H */
diff --git a/source/blender/editors/space_info/info_ops.c b/source/blender/editors/space_info/info_ops.c
index 51767d3e006..a20d3b961c0 100644
--- a/source/blender/editors/space_info/info_ops.c
+++ b/source/blender/editors/space_info/info_ops.c
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_bpath.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -73,7 +74,7 @@ static int pack_all_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int pack_all_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int pack_all_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Main *bmain= CTX_data_main(C);
Image *ima;
@@ -133,7 +134,7 @@ static int unpack_all_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int unpack_all_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int unpack_all_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Main *bmain= CTX_data_main(C);
uiPopupMenu *pup;
@@ -154,7 +155,7 @@ static int unpack_all_invoke(bContext *C, wmOperator *op, wmEvent *event)
else
sprintf(title, "Unpack %d files", count);
- pup= uiPupMenuBegin(C, title, 0);
+ pup= uiPupMenuBegin(C, title, ICON_NULL);
layout= uiPupMenuLayout(pup);
uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
@@ -186,12 +187,17 @@ void FILE_OT_unpack_all(wmOperatorType *ot)
static int make_paths_relative_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
+
if(!G.relbase_valid) {
BKE_report(op->reports, RPT_WARNING, "Can't set relative paths with an unsaved blend file.");
return OPERATOR_CANCELLED;
}
- makeFilesRelative(G.sce, op->reports);
+ makeFilesRelative(bmain, bmain->name, op->reports);
+
+ /* redraw everything so any changed paths register */
+ WM_main_add_notifier(NC_WINDOW, NULL);
return OPERATOR_FINISHED;
}
@@ -213,12 +219,18 @@ void FILE_OT_make_paths_relative(wmOperatorType *ot)
static int make_paths_absolute_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
+
if(!G.relbase_valid) {
BKE_report(op->reports, RPT_WARNING, "Can't set absolute paths with an unsaved blend file.");
return OPERATOR_CANCELLED;
}
- makeFilesAbsolute(G.sce, op->reports);
+ makeFilesAbsolute(bmain, bmain->name, op->reports);
+
+ /* redraw everything so any changed paths register */
+ WM_main_add_notifier(NC_WINDOW, NULL);
+
return OPERATOR_FINISHED;
}
@@ -237,14 +249,14 @@ void FILE_OT_make_paths_absolute(wmOperatorType *ot)
/********************* report missing files operator *********************/
-static int report_missing_files_exec(bContext *C, wmOperator *op)
+static int report_missing_files_exec(bContext *UNUSED(C), wmOperator *op)
{
char txtname[24]; /* text block name */
txtname[0] = '\0';
/* run the missing file check */
- checkMissingFiles(G.sce, op->reports);
+ checkMissingFiles(G.main, op->reports);
return OPERATOR_FINISHED;
}
@@ -264,18 +276,18 @@ void FILE_OT_report_missing_files(wmOperatorType *ot)
/********************* find missing files operator *********************/
-static int find_missing_files_exec(bContext *C, wmOperator *op)
+static int find_missing_files_exec(bContext *UNUSED(C), wmOperator *op)
{
char *path;
path= RNA_string_get_alloc(op->ptr, "filepath", NULL, 0);
- findMissingFiles(path, G.sce);
+ findMissingFiles(G.main, path);
MEM_freeN(path);
return OPERATOR_FINISHED;
}
-static int find_missing_files_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int find_missing_files_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
/* XXX file open button text "Find Missing Files" */
WM_event_add_fileselect(C, op);
@@ -312,8 +324,8 @@ void FILE_OT_find_missing_files(wmOperatorType *ot)
#define INFO_COLOR_TIMEOUT 3.0
#define ERROR_TIMEOUT 10.0
#define ERROR_COLOR_TIMEOUT 6.0
-#define COLLAPSE_TIMEOUT 0.2
-static int update_reports_display_invoke(bContext *C, wmOperator *op, wmEvent *event)
+#define COLLAPSE_TIMEOUT 0.25
+static int update_reports_display_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
wmWindowManager *wm= CTX_wm_manager(C);
ReportList *reports= CTX_wm_reports(C);
@@ -323,12 +335,16 @@ static int update_reports_display_invoke(bContext *C, wmOperator *op, wmEvent *e
float neutral_col[3] = {0.35, 0.35, 0.35};
float neutral_grey= 0.6;
float timeout=0.0, color_timeout=0.0;
+ int send_note= 0;
/* escape if not our timer */
- if(reports->reporttimer==NULL || reports->reporttimer != event->customdata)
+ if( (reports->reporttimer==NULL) ||
+ (reports->reporttimer != event->customdata) ||
+ ((report= BKE_reports_last_displayable(reports))==NULL) /* may have been deleted */
+ ) {
return OPERATOR_PASS_THROUGH;
-
- report= BKE_reports_last_displayable(reports);
+ }
+
rti = (ReportTimerInfo *)reports->reporttimer->customdata;
timeout = (report->type & RPT_ERROR_ALL)?ERROR_TIMEOUT:INFO_TIMEOUT;
@@ -345,7 +361,7 @@ static int update_reports_display_invoke(bContext *C, wmOperator *op, wmEvent *e
}
if (rti->widthfac == 0.0) {
- /* initialise colours based on report type */
+ /* initialise colors based on report type */
if(report->type & RPT_ERROR_ALL) {
rti->col[0] = 1.0;
rti->col[1] = 0.2;
@@ -366,17 +382,25 @@ static int update_reports_display_invoke(bContext *C, wmOperator *op, wmEvent *e
progress = reports->reporttimer->duration / timeout;
color_progress = reports->reporttimer->duration / color_timeout;
- /* fade colours out sharply according to progress through fade-out duration */
- interp_v3_v3v3(rti->col, rti->col, neutral_col, color_progress);
- rti->greyscale = interpf(neutral_grey, rti->greyscale, color_progress);
+ /* save us from too many draws */
+ if(color_progress <= 1.0f) {
+ send_note= 1;
+
+ /* fade colors out sharply according to progress through fade-out duration */
+ interp_v3_v3v3(rti->col, rti->col, neutral_col, color_progress);
+ rti->greyscale = interpf(neutral_grey, rti->greyscale, color_progress);
+ }
/* collapse report at end of timeout */
if (progress*timeout > timeout - COLLAPSE_TIMEOUT) {
rti->widthfac = (progress*timeout - (timeout - COLLAPSE_TIMEOUT)) / COLLAPSE_TIMEOUT;
rti->widthfac = 1.0 - rti->widthfac;
+ send_note= 1;
}
- WM_event_add_notifier(C, NC_SPACE|ND_SPACE_INFO, NULL);
+ if(send_note) {
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_INFO, NULL);
+ }
return (OPERATOR_FINISHED|OPERATOR_PASS_THROUGH);
}
@@ -395,3 +419,5 @@ void INFO_OT_reports_display_update(wmOperatorType *ot)
/* properties */
}
+
+/* report operators */
diff --git a/source/blender/editors/space_console/console_report.c b/source/blender/editors/space_info/info_report.c
index 51bffa5b981..affdbd995b3 100644
--- a/source/blender/editors/space_console/console_report.c
+++ b/source/blender/editors/space_info/info_report.c
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id: info_report.c 34719 2011-02-08 13:48:06Z ton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -17,11 +17,6 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
* Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
@@ -29,12 +24,13 @@
#include <stdlib.h>
#include <string.h>
+#include <limits.h>
#include "MEM_guardedalloc.h"
-
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
@@ -47,43 +43,39 @@
#include "RNA_access.h"
#include "RNA_define.h"
-#include "console_intern.h"
+#include "info_intern.h"
-int console_report_mask(SpaceConsole *sc)
+int info_report_mask(SpaceInfo *UNUSED(sinfo))
{
+#if 0
int report_mask = 0;
- if(sc->rpt_mask & CONSOLE_RPT_DEBUG) report_mask |= RPT_DEBUG_ALL;
- if(sc->rpt_mask & CONSOLE_RPT_INFO) report_mask |= RPT_INFO_ALL;
- if(sc->rpt_mask & CONSOLE_RPT_OP) report_mask |= RPT_OPERATOR_ALL;
- if(sc->rpt_mask & CONSOLE_RPT_WARN) report_mask |= RPT_WARNING_ALL;
- if(sc->rpt_mask & CONSOLE_RPT_ERR) report_mask |= RPT_ERROR_ALL;
+ if(sinfo->rpt_mask & INFO_RPT_DEBUG) report_mask |= RPT_DEBUG_ALL;
+ if(sinfo->rpt_mask & INFO_RPT_INFO) report_mask |= RPT_INFO_ALL;
+ if(sinfo->rpt_mask & INFO_RPT_OP) report_mask |= RPT_OPERATOR_ALL;
+ if(sinfo->rpt_mask & INFO_RPT_WARN) report_mask |= RPT_WARNING_ALL;
+ if(sinfo->rpt_mask & INFO_RPT_ERR) report_mask |= RPT_ERROR_ALL;
return report_mask;
-}
-
-static int console_report_poll(bContext *C)
-{
- SpaceConsole *sc= CTX_wm_space_console(C);
-
- if(!sc || sc->type != CONSOLE_TYPE_REPORT)
- return 0;
+#endif
- return 1;
+ return RPT_DEBUG_ALL|RPT_INFO_ALL|RPT_OPERATOR_ALL|RPT_WARNING_ALL|RPT_ERROR_ALL;
}
-static int report_replay_exec(bContext *C, wmOperator *op)
+// TODO, get this working again!
+static int report_replay_exec(bContext *C, wmOperator *UNUSED(op))
{
- SpaceConsole *sc= CTX_wm_space_console(C);
- ReportList *reports= CTX_wm_reports(C);
- int report_mask= console_report_mask(sc);
- Report *report;
+// SpaceInfo *sc= CTX_wm_space_info(C);
+// ReportList *reports= CTX_wm_reports(C);
+// int report_mask= info_report_mask(sc);
+// Report *report;
+#if 0
sc->type= CONSOLE_TYPE_PYTHON;
for(report=reports->list.last; report; report=report->prev) {
if((report->type & report_mask) && (report->type & RPT_OPERATOR_ALL) && (report->flag & SELECT)) {
- console_history_add_str(C, report->message, 0);
+ console_history_add_str(sc, report->message, 0);
WM_operator_name_call(C, "CONSOLE_OT_execute", WM_OP_EXEC_DEFAULT, NULL);
ED_area_tag_redraw(CTX_wm_area(C));
@@ -91,21 +83,21 @@ static int report_replay_exec(bContext *C, wmOperator *op)
}
sc->type= CONSOLE_TYPE_REPORT;
-
+#endif
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
}
-void CONSOLE_OT_report_replay(wmOperatorType *ot)
+void INFO_OT_report_replay(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Replay Operators";
ot->description= "Replay selected reports";
- ot->idname= "CONSOLE_OT_report_replay";
+ ot->idname= "INFO_OT_report_replay";
/* api callbacks */
- ot->poll= console_report_poll;
+ ot->poll= ED_operator_info_active;
ot->exec= report_replay_exec;
/* flags */
@@ -131,12 +123,15 @@ static int select_report_pick_exec(bContext *C, wmOperator *op)
static int select_report_pick_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceConsole *sc= CTX_wm_space_console(C);
+ SpaceInfo *sinfo= CTX_wm_space_info(C);
ARegion *ar= CTX_wm_region(C);
ReportList *reports= CTX_wm_reports(C);
Report *report;
- report= console_text_pick(sc, ar, reports, event->mval[1]);
+ /* uses opengl */
+ wmSubWindowSet(CTX_wm_window(C), ar->swinid);
+
+ report= info_text_pick(sinfo, ar, reports, event->mval[1]);
RNA_int_set(op->ptr, "report_index", BLI_findindex(&reports->list, report));
@@ -144,15 +139,15 @@ static int select_report_pick_invoke(bContext *C, wmOperator *op, wmEvent *event
}
-void CONSOLE_OT_select_pick(wmOperatorType *ot)
+void INFO_OT_select_pick(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select report";
ot->description= "Select reports by index";
- ot->idname= "CONSOLE_OT_select_pick";
+ ot->idname= "INFO_OT_select_pick";
/* api callbacks */
- ot->poll= console_report_poll;
+ ot->poll= ED_operator_info_active;
ot->invoke= select_report_pick_invoke;
ot->exec= select_report_pick_exec;
@@ -165,11 +160,11 @@ void CONSOLE_OT_select_pick(wmOperatorType *ot)
-static int report_select_all_toggle_exec(bContext *C, wmOperator *op)
+static int report_select_all_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
- SpaceConsole *sc= CTX_wm_space_console(C);
+ SpaceInfo *sinfo= CTX_wm_space_info(C);
ReportList *reports= CTX_wm_reports(C);
- int report_mask= console_report_mask(sc);
+ int report_mask= info_report_mask(sinfo);
int deselect= 0;
Report *report;
@@ -198,15 +193,15 @@ static int report_select_all_toggle_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void CONSOLE_OT_select_all_toggle(wmOperatorType *ot)
+void INFO_OT_select_all_toggle(wmOperatorType *ot)
{
/* identifiers */
ot->name= "(De)Select All";
ot->description= "(de)select all reports";
- ot->idname= "CONSOLE_OT_select_all_toggle";
+ ot->idname= "INFO_OT_select_all_toggle";
/* api callbacks */
- ot->poll= console_report_poll;
+ ot->poll= ED_operator_info_active;
ot->exec= report_select_all_toggle_exec;
/* flags */
@@ -218,10 +213,10 @@ void CONSOLE_OT_select_all_toggle(wmOperatorType *ot)
/* borderselect operator */
static int borderselect_exec(bContext *C, wmOperator *op)
{
- SpaceConsole *sc= CTX_wm_space_console(C);
+ SpaceInfo *sinfo= CTX_wm_space_info(C);
ARegion *ar= CTX_wm_region(C);
ReportList *reports= CTX_wm_reports(C);
- int report_mask= console_report_mask(sc);
+ int report_mask= info_report_mask(sinfo);
Report *report_min, *report_max, *report;
//View2D *v2d= UI_view2d_fromcontext(C);
@@ -246,8 +241,8 @@ static int borderselect_exec(bContext *C, wmOperator *op)
UI_view2d_region_to_view(v2d, mval[0], mval[1], &rectf.xmax, &rectf.ymax);
*/
- report_min= console_text_pick(sc, ar, reports, rect.ymax);
- report_max= console_text_pick(sc, ar, reports, rect.ymin);
+ report_min= info_text_pick(sinfo, ar, reports, rect.ymax);
+ report_max= info_text_pick(sinfo, ar, reports, rect.ymin);
/* get the first report if none found */
if(report_min==NULL) {
@@ -291,19 +286,19 @@ static int borderselect_exec(bContext *C, wmOperator *op)
/* ****** Border Select ****** */
-void CONSOLE_OT_select_border(wmOperatorType *ot)
+void INFO_OT_select_border(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Border Select";
ot->description= "Toggle border selection";
- ot->idname= "CONSOLE_OT_select_border";
+ ot->idname= "INFO_OT_select_border";
/* api callbacks */
ot->invoke= WM_border_select_invoke;
ot->exec= borderselect_exec;
ot->modal= WM_border_select_modal;
- ot->poll= console_report_poll;
+ ot->poll= ED_operator_info_active;
/* flags */
/* ot->flag= OPTYPE_REGISTER; */
@@ -314,11 +309,11 @@ void CONSOLE_OT_select_border(wmOperatorType *ot)
-static int report_delete_exec(bContext *C, wmOperator *op)
+static int report_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
- SpaceConsole *sc= CTX_wm_space_console(C);
+ SpaceInfo *sinfo= CTX_wm_space_info(C);
ReportList *reports= CTX_wm_reports(C);
- int report_mask= console_report_mask(sc);
+ int report_mask= info_report_mask(sinfo);
Report *report, *report_next;
@@ -329,7 +324,7 @@ static int report_delete_exec(bContext *C, wmOperator *op)
if((report->type & report_mask) && (report->flag & SELECT)) {
BLI_remlink(&reports->list, report);
- MEM_freeN(report->message);
+ MEM_freeN((void *)report->message);
MEM_freeN(report);
}
@@ -341,15 +336,15 @@ static int report_delete_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void CONSOLE_OT_report_delete(wmOperatorType *ot)
+void INFO_OT_report_delete(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Delete Reports";
ot->description= "Delete selected reports";
- ot->idname= "CONSOLE_OT_report_delete";
+ ot->idname= "INFO_OT_report_delete";
/* api callbacks */
- ot->poll= console_report_poll;
+ ot->poll= ED_operator_info_active;
ot->exec= report_delete_exec;
/* flags */
@@ -359,11 +354,11 @@ void CONSOLE_OT_report_delete(wmOperatorType *ot)
}
-static int report_copy_exec(bContext *C, wmOperator *op)
+static int report_copy_exec(bContext *C, wmOperator *UNUSED(op))
{
- SpaceConsole *sc= CTX_wm_space_console(C);
+ SpaceInfo *sinfo= CTX_wm_space_info(C);
ReportList *reports= CTX_wm_reports(C);
- int report_mask= console_report_mask(sc);
+ int report_mask= info_report_mask(sinfo);
Report *report;
@@ -386,15 +381,15 @@ static int report_copy_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void CONSOLE_OT_report_copy(wmOperatorType *ot)
+void INFO_OT_report_copy(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Copy Reports to Clipboard";
ot->description= "Copy selected reports to Clipboard";
- ot->idname= "CONSOLE_OT_report_copy";
+ ot->idname= "INFO_OT_report_copy";
/* api callbacks */
- ot->poll= console_report_poll;
+ ot->poll= ED_operator_info_active;
ot->exec= report_copy_exec;
/* flags */
diff --git a/source/blender/editors/space_info/info_stats.c b/source/blender/editors/space_info/info_stats.c
index 0789114c054..cf3607e8fba 100644
--- a/source/blender/editors/space_info/info_stats.c
+++ b/source/blender/editors/space_info/info_stats.c
@@ -34,13 +34,14 @@
#include "DNA_meta_types.h"
#include "DNA_scene_types.h"
+#include "BLI_utildefines.h"
+
#include "BKE_anim.h"
#include "BKE_displist.h"
#include "BKE_DerivedMesh.h"
#include "BKE_key.h"
#include "BKE_mesh.h"
#include "BKE_particle.h"
-#include "BKE_utildefines.h"
#include "ED_armature.h"
#include "ED_mesh.h"
@@ -91,13 +92,12 @@ static void stats_object(Object *ob, int sel, int totob, SceneStats *stats)
case OB_SURF:
case OB_CURVE:
case OB_FONT: {
- Curve *cu= ob->data;
int tot= 0, totf= 0;
stats->totcurve += totob;
- if(cu->disp.first)
- count_displist(&cu->disp, &tot, &totf);
+ if(ob->disp.first)
+ count_displist(&ob->disp, &tot, &totf);
tot *= totob;
totf *= totob;
@@ -327,12 +327,10 @@ static void stats_dupli_object(Base *base, Object *ob, SceneStats *stats)
/* Statistics displayed in info header. Called regularly on scene changes. */
static void stats_update(Scene *scene)
{
- SceneStats stats;
+ SceneStats stats= {0};
Object *ob= (scene->basact)? scene->basact->object: NULL;
Base *base;
- memset(&stats, 0, sizeof(stats));
-
if(scene->obedit) {
/* Edit Mode */
stats_object_edit(scene->obedit, &stats);
@@ -341,7 +339,7 @@ static void stats_update(Scene *scene)
/* Pose Mode */
stats_object_pose(ob, &stats);
}
- else if(ob && (ob->flag & (OB_MODE_SCULPT|OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))) {
+ else if(ob && (ob->flag & OB_MODE_ALL_PAINT)) {
/* Sculpt and Paint Mode */
stats_object_paint(ob, &stats);
}
diff --git a/source/blender/editors/space_info/space_info.c b/source/blender/editors/space_info/space_info.c
index b47c8e8d189..80040f55a08 100644
--- a/source/blender/editors/space_info/space_info.c
+++ b/source/blender/editors/space_info/space_info.c
@@ -29,12 +29,12 @@
#include <string.h>
#include <stdio.h>
-
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -49,20 +49,23 @@
#include "UI_resources.h"
#include "UI_interface.h"
+#include "UI_view2d.h"
#include "info_intern.h" // own include
/* ******************** default callbacks for info space ***************** */
-static SpaceLink *info_new(const bContext *C)
+static SpaceLink *info_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceInfo *sinfo;
sinfo= MEM_callocN(sizeof(SpaceInfo), "initinfo");
sinfo->spacetype= SPACE_INFO;
-
+
+ sinfo->rpt_mask= INFO_RPT_OP;
+
/* header */
ar= MEM_callocN(sizeof(ARegion), "header for info");
@@ -76,11 +79,22 @@ static SpaceLink *info_new(const bContext *C)
BLI_addtail(&sinfo->regionbase, ar);
ar->regiontype= RGN_TYPE_WINDOW;
+ /* keep in sync with console */
+ ar->v2d.scroll |= (V2D_SCROLL_RIGHT);
+ ar->v2d.align |= V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_NEG_Y; /* align bottom left */
+ ar->v2d.keepofs |= V2D_LOCKOFS_X;
+ ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
+ ar->v2d.keeptot= V2D_KEEPTOT_BOUNDS;
+ ar->v2d.minzoom= ar->v2d.maxzoom= 1.0f;
+
+ /* for now, aspect ratio should be maintained, and zoom is clamped within sane default limits */
+ //ar->v2d.keepzoom= (V2D_KEEPASPECT|V2D_LIMITZOOM);
+
return (SpaceLink *)sinfo;
}
/* not spacelink itself */
-static void info_free(SpaceLink *sl)
+static void info_free(SpaceLink *UNUSED(sl))
{
// SpaceInfo *sinfo= (SpaceInfo*) sl;
@@ -88,7 +102,7 @@ static void info_free(SpaceLink *sl)
/* spacetype; init callback */
-static void info_init(struct wmWindowManager *wm, ScrArea *sa)
+static void info_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -107,14 +121,52 @@ static SpaceLink *info_duplicate(SpaceLink *sl)
/* add handlers, stuff you only do once or on area/region changes */
static void info_main_area_init(wmWindowManager *wm, ARegion *ar)
{
+ wmKeyMap *keymap;
+
+ UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
+
+ /* own keymap */
+ keymap= WM_keymap_find(wm->defaultconf, "Info", SPACE_INFO, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+}
+
+static void info_textview_update_rect(const bContext *C, ARegion *ar)
+{
+ SpaceInfo *sinfo= CTX_wm_space_info(C);
+ View2D *v2d= &ar->v2d;
+
+ UI_view2d_totRect_set(v2d, ar->winx-1, info_textview_height(sinfo, ar, CTX_wm_reports(C)));
}
static void info_main_area_draw(const bContext *C, ARegion *ar)
{
-
+ /* draw entirely, view changes should be handled here */
+ SpaceInfo *sinfo= CTX_wm_space_info(C);
+ View2D *v2d= &ar->v2d;
+ View2DScrollers *scrollers;
+
/* clear and setup matrix */
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
+
+ /* quick way to avoid drawing if not bug enough */
+ if(ar->winy < 16)
+ return;
+
+ info_textview_update_rect(C, ar);
+
+ /* worlks best with no view2d matrix set */
+ UI_view2d_view_ortho(v2d);
+
+ info_textview_main(sinfo, ar, CTX_wm_reports(C));
+
+ /* reset view matrix */
+ UI_view2d_view_restore(C);
+
+ /* scrollers */
+ scrollers= UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_GRID_CLAMP);
+ UI_view2d_scrollers_draw(C, v2d, scrollers);
+ UI_view2d_scrollers_free(scrollers);
}
void info_operatortypes(void)
@@ -125,8 +177,16 @@ void info_operatortypes(void)
WM_operatortype_append(FILE_OT_make_paths_absolute);
WM_operatortype_append(FILE_OT_report_missing_files);
WM_operatortype_append(FILE_OT_find_missing_files);
-
WM_operatortype_append(INFO_OT_reports_display_update);
+
+ /* info_report.c */
+ WM_operatortype_append(INFO_OT_select_pick);
+ WM_operatortype_append(INFO_OT_select_all_toggle);
+ WM_operatortype_append(INFO_OT_select_border);
+
+ WM_operatortype_append(INFO_OT_report_replay);
+ WM_operatortype_append(INFO_OT_report_delete);
+ WM_operatortype_append(INFO_OT_report_copy);
}
void info_keymap(struct wmKeyConfig *keyconf)
@@ -134,10 +194,24 @@ void info_keymap(struct wmKeyConfig *keyconf)
wmKeyMap *keymap= WM_keymap_find(keyconf, "Window", 0, 0);
WM_keymap_verify_item(keymap, "INFO_OT_reports_display_update", TIMER, KM_ANY, KM_ANY, 0);
+
+ /* info space */
+ keymap= WM_keymap_find(keyconf, "Info", SPACE_INFO, 0);
+
+
+ /* report selection */
+ WM_keymap_add_item(keymap, "INFO_OT_select_pick", SELECTMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "INFO_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "INFO_OT_select_border", BKEY, KM_PRESS, 0, 0);
+
+ WM_keymap_add_item(keymap, "INFO_OT_report_replay", RKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "INFO_OT_report_delete", XKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "INFO_OT_report_delete", DELKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "INFO_OT_report_copy", CKEY, KM_PRESS, KM_CTRL, 0);
}
/* add handlers, stuff you only do once or on area/region changes */
-static void info_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void info_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -149,7 +223,17 @@ static void info_header_area_draw(const bContext *C, ARegion *ar)
static void info_main_area_listener(ARegion *ar, wmNotifier *wmn)
{
+ // SpaceInfo *sinfo= sa->spacedata.first;
+
/* context changes */
+ switch(wmn->category) {
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_INFO_REPORT) {
+ /* redraw also but only for report view, could do less redraws by checking the type */
+ ED_region_tag_redraw(ar);
+ }
+ break;
+ }
}
static void info_header_listener(ARegion *ar, wmNotifier *wmn)
@@ -179,7 +263,7 @@ static void info_header_listener(ARegion *ar, wmNotifier *wmn)
}
-static void recent_files_menu(const bContext *C, Menu *menu)
+static void recent_files_menu_draw(const bContext *UNUSED(C), Menu *menu)
{
struct RecentFile *recent;
uiLayout *layout= menu->layout;
@@ -189,18 +273,18 @@ static void recent_files_menu(const bContext *C, Menu *menu)
uiItemStringO(layout, BLI_path_basename(recent->filepath), ICON_FILE_BLEND, "WM_OT_open_mainfile", "filepath", recent->filepath);
}
} else {
- uiItemL(layout, "No Recent Files", 0);
+ uiItemL(layout, "No Recent Files", ICON_NULL);
}
}
-void recent_files_menu_register()
+void recent_files_menu_register(void)
{
MenuType *mt;
mt= MEM_callocN(sizeof(MenuType), "spacetype info menu recent files");
strcpy(mt->idname, "INFO_MT_file_open_recent");
strcpy(mt->label, "Open Recent...");
- mt->draw= recent_files_menu;
+ mt->draw= recent_files_menu_draw;
WM_menutype_add(mt);
}
@@ -223,10 +307,11 @@ void ED_spacetype_info(void)
/* regions: main window */
art= MEM_callocN(sizeof(ARegionType), "spacetype info region");
art->regionid = RGN_TYPE_WINDOW;
+ art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
+
art->init= info_main_area_init;
art->draw= info_main_area_draw;
art->listener= info_main_area_listener;
- art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
BLI_addhead(&st->regiontypes, art);
@@ -246,4 +331,3 @@ void ED_spacetype_info(void)
BKE_spacetype_register(st);
}
-
diff --git a/source/blender/editors/space_info/textview.c b/source/blender/editors/space_info/textview.c
new file mode 100644
index 00000000000..6039ea0a1de
--- /dev/null
+++ b/source/blender/editors/space_info/textview.c
@@ -0,0 +1,298 @@
+/**
+ * $Id: textview.c 34160 2011-01-07 19:18:31Z campbellbarton $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <math.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <limits.h>
+#include <assert.h>
+
+#include "BLF_api.h"
+
+#include "BLI_utildefines.h"
+
+
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+
+#include "ED_datafiles.h"
+
+#include "textview.h"
+
+static void console_font_begin(TextViewContext *sc)
+{
+ BLF_size(blf_mono_font, sc->lheight-2, 72);
+}
+
+typedef struct ConsoleDrawContext {
+ int cwidth;
+ int lheight;
+ int console_width; /* number of characters that fit into the width of the console (fixed width) */
+ int winx;
+ int ymin, ymax;
+ int *xy; // [2]
+ int *sel; // [2]
+ int *pos_pick; // bottom of view == 0, top of file == combine chars, end of line is lower then start.
+ int *mval; // [2]
+ int draw;
+} ConsoleDrawContext;
+
+static void console_draw_sel(int sel[2], int xy[2], int str_len_draw, int cwidth, int lheight)
+{
+ if(sel[0] <= str_len_draw && sel[1] >= 0) {
+ int sta = MAX2(sel[0], 0);
+ int end = MIN2(sel[1], str_len_draw);
+
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(stipple_halftone);
+ glEnable( GL_BLEND );
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glColor4ub(255, 255, 255, 96);
+
+ glRecti(xy[0]+(cwidth*sta), xy[1]-2 + lheight, xy[0]+(cwidth*end), xy[1]-2);
+
+ glDisable(GL_POLYGON_STIPPLE);
+ glDisable( GL_BLEND );
+ }
+}
+
+
+/* return 0 if the last line is off the screen
+ * should be able to use this for any string type */
+
+static int console_draw_string(ConsoleDrawContext *cdc, const char *str, int str_len, unsigned char *fg, unsigned char *bg)
+{
+#define STEP_SEL(value) cdc->sel[0] += (value); cdc->sel[1] += (value)
+ int rct_ofs= cdc->lheight/4;
+ int tot_lines = (str_len/cdc->console_width)+1; /* total number of lines for wrapping */
+ int y_next = (str_len > cdc->console_width) ? cdc->xy[1]+cdc->lheight*tot_lines : cdc->xy[1]+cdc->lheight;
+ const int mono= blf_mono_font;
+
+ /* just advance the height */
+ if(cdc->draw==0) {
+ if(cdc->pos_pick && (cdc->mval[1] != INT_MAX)) {
+ if(cdc->xy[1] <= cdc->mval[1]) {
+ if((y_next >= cdc->mval[1])) {
+ int ofs = (int)floor(((float)cdc->mval[0] / (float)cdc->cwidth));
+
+ /* wrap */
+ if(str_len > cdc->console_width)
+ ofs += (cdc->console_width * ((int)((((float)(y_next - cdc->mval[1]) / (float)(y_next-cdc->xy[1])) * tot_lines))));
+
+ CLAMP(ofs, 0, str_len);
+ *cdc->pos_pick += str_len - ofs;
+ } else
+ *cdc->pos_pick += str_len + 1;
+ }
+ }
+
+ cdc->xy[1]= y_next;
+ return 1;
+ }
+ else if (y_next-cdc->lheight < cdc->ymin) {
+ /* have not reached the drawable area so don't break */
+ cdc->xy[1]= y_next;
+
+ /* adjust selection even if not drawing */
+ if(cdc->sel[0] != cdc->sel[1]) {
+ STEP_SEL(-(str_len + 1));
+ }
+
+ return 1;
+ }
+
+ if(str_len > cdc->console_width) { /* wrap? */
+ const int initial_offset= ((tot_lines-1) * cdc->console_width);
+ const char *line_stride= str + initial_offset; /* advance to the last line and draw it first */
+
+ int sel_orig[2];
+ VECCOPY2D(sel_orig, cdc->sel);
+
+ /* invert and swap for wrapping */
+ cdc->sel[0] = str_len - sel_orig[1];
+ cdc->sel[1] = str_len - sel_orig[0];
+
+ if(bg) {
+ glColor3ubv(bg);
+ glRecti(0, cdc->xy[1]-rct_ofs, cdc->winx, (cdc->xy[1]+(cdc->lheight*tot_lines))+rct_ofs);
+ }
+
+ glColor3ubv(fg);
+
+ /* last part needs no clipping */
+ BLF_position(mono, cdc->xy[0], cdc->xy[1], 0);
+ BLF_draw(mono, line_stride, str_len - initial_offset);
+
+ if(cdc->sel[0] != cdc->sel[1]) {
+ STEP_SEL(-initial_offset);
+ // glColor4ub(255, 0, 0, 96); // debug
+ console_draw_sel(cdc->sel, cdc->xy, str_len % cdc->console_width, cdc->cwidth, cdc->lheight);
+ STEP_SEL(cdc->console_width);
+ glColor3ubv(fg);
+ }
+
+ cdc->xy[1] += cdc->lheight;
+
+ line_stride -= cdc->console_width;
+
+ for(; line_stride >= str; line_stride -= cdc->console_width) {
+ BLF_position(mono, cdc->xy[0], cdc->xy[1], 0);
+ BLF_draw(mono, line_stride, cdc->console_width);
+
+ if(cdc->sel[0] != cdc->sel[1]) {
+ // glColor4ub(0, 255, 0, 96); // debug
+ console_draw_sel(cdc->sel, cdc->xy, cdc->console_width, cdc->cwidth, cdc->lheight);
+ STEP_SEL(cdc->console_width);
+ glColor3ubv(fg);
+ }
+
+ cdc->xy[1] += cdc->lheight;
+
+ /* check if were out of view bounds */
+ if(cdc->xy[1] > cdc->ymax)
+ return 0;
+ }
+
+ VECCOPY2D(cdc->sel, sel_orig);
+ STEP_SEL(-(str_len + 1));
+ }
+ else { /* simple, no wrap */
+
+ if(bg) {
+ glColor3ubv(bg);
+ glRecti(0, cdc->xy[1]-rct_ofs, cdc->winx, cdc->xy[1]+cdc->lheight-rct_ofs);
+ }
+
+ glColor3ubv(fg);
+
+ BLF_position(mono, cdc->xy[0], cdc->xy[1], 0);
+ BLF_draw(mono, str, str_len);
+
+ if(cdc->sel[0] != cdc->sel[1]) {
+ int isel[2];
+
+ isel[0]= str_len - cdc->sel[1];
+ isel[1]= str_len - cdc->sel[0];
+
+ // glColor4ub(255, 255, 0, 96); // debug
+ console_draw_sel(isel, cdc->xy, str_len, cdc->cwidth, cdc->lheight);
+ STEP_SEL(-(str_len + 1));
+ }
+
+ cdc->xy[1] += cdc->lheight;
+
+ if(cdc->xy[1] > cdc->ymax)
+ return 0;
+ }
+
+ return 1;
+#undef STEP_SEL
+}
+
+#define CONSOLE_DRAW_MARGIN 4
+#define CONSOLE_DRAW_SCROLL 16
+
+int textview_draw(TextViewContext *tvc, int draw, int mval[2], void **mouse_pick, int *pos_pick)
+{
+ ConsoleDrawContext cdc= {0};
+
+ int x_orig=CONSOLE_DRAW_MARGIN, y_orig=CONSOLE_DRAW_MARGIN + tvc->lheight/6;
+ int xy[2], y_prev;
+ int sel[2]= {-1, -1}; /* defaults disabled */
+ unsigned char fg[3], bg[3];
+ const int mono= blf_mono_font;
+
+ console_font_begin(tvc);
+
+ xy[0]= x_orig; xy[1]= y_orig;
+
+ if(mval[1] != INT_MAX)
+ mval[1] += (tvc->ymin + CONSOLE_DRAW_MARGIN);
+
+ if(pos_pick)
+ *pos_pick = 0;
+
+ /* constants for the sequencer context */
+ cdc.cwidth= (int)BLF_fixed_width(mono);
+ assert(cdc.cwidth > 0);
+ cdc.lheight= tvc->lheight;
+ cdc.console_width= (tvc->winx - (CONSOLE_DRAW_SCROLL + CONSOLE_DRAW_MARGIN*2) ) / cdc.cwidth;
+ CLAMP(cdc.console_width, 1, INT_MAX); /* avoid divide by zero on small windows */
+ cdc.winx= tvc->winx-(CONSOLE_DRAW_MARGIN+CONSOLE_DRAW_SCROLL);
+ cdc.ymin= tvc->ymin;
+ cdc.ymax= tvc->ymax;
+ cdc.xy= xy;
+ cdc.sel= sel;
+ cdc.pos_pick= pos_pick;
+ cdc.mval= mval;
+ cdc.draw= draw;
+
+ /* shouldnt be needed */
+ tvc->cwidth= cdc.cwidth;
+ tvc->console_width= cdc.console_width;
+ tvc->iter_index= 0;
+
+ if(tvc->sel_start != tvc->sel_end) {
+ sel[0]= tvc->sel_start;
+ sel[1]= tvc->sel_end;
+ }
+
+ if(tvc->begin(tvc)) {
+
+ do {
+ const char *ext_line;
+ int ext_len;
+ int color_flag= 0;
+
+ y_prev= xy[1];
+
+ if(draw)
+ color_flag= tvc->line_color(tvc, fg, bg);
+
+ tvc->line_get(tvc, &ext_line, &ext_len);
+
+ if(!console_draw_string(&cdc, ext_line, ext_len, (color_flag & TVC_LINE_FG) ? fg : NULL, (color_flag & TVC_LINE_BG) ? bg : NULL)) {
+ /* when drawing, if we pass v2d->cur.ymax, then quit */
+ if(draw) {
+ break; /* past the y limits */
+ }
+ }
+
+ if((mval[1] != INT_MAX) && (mval[1] >= y_prev && mval[1] <= xy[1])) {
+ *mouse_pick= (void *)tvc->iter;
+ break;
+ }
+
+ tvc->iter_index++;
+
+ } while(tvc->step(tvc));
+ }
+
+ tvc->end(tvc);
+
+ xy[1] += tvc->lheight * 2;
+
+ return xy[1] - y_orig;
+}
diff --git a/source/blender/editors/space_info/textview.h b/source/blender/editors/space_info/textview.h
new file mode 100644
index 00000000000..2a233f3d852
--- /dev/null
+++ b/source/blender/editors/space_info/textview.h
@@ -0,0 +1,57 @@
+/**
+ * $Id: textview.h 33431 2010-12-02 21:48:46Z campbellbarton $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+typedef struct TextViewContext {
+ int lheight;
+ int sel_start, sel_end;
+
+ /* view settings */
+ int cwidth; /* shouldnt be needed! */
+ int console_width; /* shouldnt be needed! */
+
+ int winx;
+ int ymin, ymax;
+
+ /* callbacks */
+ int (*begin)(struct TextViewContext *tvc);
+ void (*end)(struct TextViewContext *tvc);
+ void *arg1;
+ void *arg2;
+
+ /* iterator */
+ int (*step)(struct TextViewContext *tvc);
+ int (*line_get)(struct TextViewContext *tvc, const char **, int *);
+ int (*line_color)(struct TextViewContext *tvc, unsigned char fg[3], unsigned char bg[3]);
+ void *iter;
+ int iter_index;
+ int iter_char; /* char intex, used for multi-line report display */
+ int iter_char_next; /* same as above, next \n */
+ int iter_tmp; /* internal iterator use */
+
+} TextViewContext;
+
+int textview_draw(struct TextViewContext *tvc, int draw, int mval[2], void **mouse_pick, int *pos_pick);
+
+#define TVC_LINE_FG (1<<0)
+#define TVC_LINE_BG (1<<1)
diff --git a/source/blender/editors/space_logic/CMakeLists.txt b/source/blender/editors/space_logic/CMakeLists.txt
index 6f0a260124d..707f4ab42ed 100644
--- a/source/blender/editors/space_logic/CMakeLists.txt
+++ b/source/blender/editors/space_logic/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -32,8 +30,17 @@ SET(INC
../../../../intern/guardedalloc
)
-IF(WITH_GAMEENGINE)
- ADD_DEFINITIONS(-DGAMEBLENDER)
-ENDIF(WITH_GAMEENGINE)
+set(SRC
+ logic_buttons.c
+ logic_ops.c
+ logic_window.c
+ space_logic.c
+
+ logic_intern.h
+)
+
+if(WITH_GAMEENGINE)
+ add_definitions(-DWITH_GAMEENGINE)
+endif()
-BLENDERLIB(bf_editor_space_logic "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_logic "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_logic/Makefile b/source/blender/editors/space_logic/Makefile
deleted file mode 100644
index 9b72e132be8..00000000000
--- a/source/blender/editors/space_logic/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_logic
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../interface
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_logic/SConscript b/source/blender/editors/space_logic/SConscript
index 0ce2eee575e..4d02363ff90 100644
--- a/source/blender/editors/space_logic/SConscript
+++ b/source/blender/editors/space_logic/SConscript
@@ -10,6 +10,6 @@ incs += ' ../../makesrna ../interface'
defs = []
if env['WITH_BF_GAMEENGINE']:
- defs.append('GAMEBLENDER=1')
+ defs.append('WITH_GAMEENGINE')
env.BlenderLib ( 'bf_editors_space_game', sources, Split(incs), defs, libtype=['core'], priority=[120] )
diff --git a/source/blender/editors/space_logic/logic_buttons.c b/source/blender/editors/space_logic/logic_buttons.c
index d8dfd8cb52d..2148dd289ca 100644
--- a/source/blender/editors/space_logic/logic_buttons.c
+++ b/source/blender/editors/space_logic/logic_buttons.c
@@ -23,21 +23,18 @@
* ***** END GPL LICENSE BLOCK *****
*/
-
#include <string.h>
#include <stdio.h>
-
-
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
#include "ED_screen.h"
-
#include "RNA_access.h"
#include "RNA_define.h"
@@ -83,7 +80,7 @@ static void logic_panel_view_properties(const bContext *C, Panel *pa)
}
#endif
-void logic_buttons_register(ARegionType *art)
+void logic_buttons_register(ARegionType *UNUSED(art))
{
#if 0
PanelType *pt;
@@ -103,7 +100,7 @@ void logic_buttons_register(ARegionType *art)
}
-static int logic_properties(bContext *C, wmOperator *op)
+static int logic_properties(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= logic_has_buttons_region(sa);
@@ -199,6 +196,7 @@ void LOGIC_OT_links_cut(wmOperatorType *ot)
ot->name= "Cut links";
ot->idname= "LOGIC_OT_links_cut";
+ ot->description= "Remove logic brick connections";
ot->invoke= WM_gesture_lines_invoke;
ot->modal= WM_gesture_lines_modal;
diff --git a/source/blender/editors/space_logic/logic_ops.c b/source/blender/editors/space_logic/logic_ops.c
index 4641fd2ce61..cda2aea23fa 100644
--- a/source/blender/editors/space_logic/logic_ops.c
+++ b/source/blender/editors/space_logic/logic_ops.c
@@ -33,6 +33,7 @@
#include "DNA_actuator_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_main.h"
@@ -238,7 +239,7 @@ static int sensor_remove_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
- static int sensor_remove_invoke(bContext *C, wmOperator *op, wmEvent *event)
+ static int sensor_remove_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_sensor_invoke_properties(C, op))
return sensor_remove_exec(C, op);
@@ -341,7 +342,7 @@ static int controller_remove_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
- static int controller_remove_invoke(bContext *C, wmOperator *op, wmEvent *event)
+ static int controller_remove_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_controller_invoke_properties(C, op))
return controller_remove_exec(C, op);
@@ -455,7 +456,7 @@ static int actuator_remove_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int actuator_remove_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int actuator_remove_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_actuator_invoke_properties(C, op))
return actuator_remove_exec(C, op);
@@ -562,7 +563,7 @@ static int sensor_move_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int sensor_move_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int sensor_move_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_sensor_invoke_properties(C, op)) {
return sensor_move_exec(C, op);
@@ -607,7 +608,7 @@ static int controller_move_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int controller_move_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int controller_move_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_controller_invoke_properties(C, op)) {
return controller_move_exec(C, op);
@@ -652,7 +653,7 @@ static int actuator_move_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int actuator_move_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int actuator_move_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_actuator_invoke_properties(C, op)) {
return actuator_move_exec(C, op);
diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c
index e3d2d064987..01c5f962c63 100644
--- a/source/blender/editors/space_logic/logic_window.c
+++ b/source/blender/editors/space_logic/logic_window.c
@@ -45,7 +45,9 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+#include "BKE_action.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_library.h"
@@ -182,7 +184,7 @@ void make_unique_prop_names(bContext *C, char *str)
MEM_freeN(names);
}
-static void make_unique_prop_names_cb(bContext *C, void *strv, void *redraw_view3d_flagv)
+static void make_unique_prop_names_cb(bContext *C, void *strv, void *UNUSED(redraw_view3d_flagv))
{
char *str= strv;
// int redraw_view3d_flag= GET_INT_FROM_POINTER(redraw_view3d_flagv);
@@ -354,7 +356,7 @@ static void old_sca_move_actuator(bContext *C, void *datav, void *move_up)
}
}
-void do_logic_buts(bContext *C, void *arg, int event)
+void do_logic_buts(bContext *C, void *UNUSED(arg), int event)
{
Main *bmain= CTX_data_main(C);
bSensor *sens;
@@ -593,7 +595,7 @@ void do_logic_buts(bContext *C, void *arg, int event)
}
-static char *sensor_name(int type)
+static const char *sensor_name(int type)
{
switch (type) {
case SENS_ALWAYS:
@@ -630,7 +632,7 @@ static char *sensor_name(int type)
return "unknown";
}
-static char *sensor_pup(void)
+static const char *sensor_pup(void)
{
/* the number needs to match defines in DNA_sensor_types.h */
return "Sensors %t|Always %x0|Delay %x13|Keyboard %x3|Mouse %x5|"
@@ -638,7 +640,7 @@ static char *sensor_pup(void)
"Property %x4|Random %x8|Ray %x9|Message %x10|Joystick %x11|Actuator %x12|Armature %x14";
}
-static char *controller_name(int type)
+static const char *controller_name(int type)
{
switch (type) {
case CONT_LOGIC_AND:
@@ -661,12 +663,12 @@ static char *controller_name(int type)
return "unknown";
}
-static char *controller_pup(void)
+static const char *controller_pup(void)
{
return "Controllers %t|AND %x0|OR %x1|XOR %x6|NAND %x4|NOR %x5|XNOR %x7|Expression %x2|Python %x3";
}
-static char *actuator_name(int type)
+static const char *actuator_name(int type)
{
switch (type) {
case ACT_SHAPEACTION:
@@ -720,7 +722,7 @@ static char *actuator_name(int type)
-static char *actuator_pup(Object *owner)
+static const char *actuator_pup(Object *owner)
{
switch (owner->type)
{
@@ -966,7 +968,7 @@ static void set_col_sensor(int type, int medium)
}
-static void verify_logicbutton_func(bContext *C, void *data1, void *data2)
+static void verify_logicbutton_func(bContext *UNUSED(C), void *data1, void *data2)
{
bSensor *sens= (bSensor*)data1;
@@ -978,12 +980,12 @@ static void verify_logicbutton_func(bContext *C, void *data1, void *data2)
}
}
-static void test_scriptpoin_but(struct bContext *C, char *name, ID **idpp)
+static void test_scriptpoin_but(struct bContext *C, const char *name, ID **idpp)
{
*idpp= BLI_findstring(&CTX_data_main(C)->text, name, offsetof(ID, name) + 2);
}
-static void test_actionpoin_but(struct bContext *C, char *name, ID **idpp)
+static void test_actionpoin_but(struct bContext *C, const char *name, ID **idpp)
{
*idpp= BLI_findstring(&CTX_data_main(C)->action, name, offsetof(ID, name) + 2);
if(*idpp)
@@ -991,35 +993,35 @@ static void test_actionpoin_but(struct bContext *C, char *name, ID **idpp)
}
-static void test_obpoin_but(struct bContext *C, char *name, ID **idpp)
+static void test_obpoin_but(struct bContext *C, const char *name, ID **idpp)
{
*idpp= BLI_findstring(&CTX_data_main(C)->object, name, offsetof(ID, name) + 2);
if(*idpp)
id_lib_extern(*idpp); /* checks lib data, sets correct flag for saving then */
}
-static void test_meshpoin_but(struct bContext *C, char *name, ID **idpp)
+static void test_meshpoin_but(struct bContext *C, const char *name, ID **idpp)
{
*idpp= BLI_findstring(&CTX_data_main(C)->mesh, name, offsetof(ID, name) + 2);
if(*idpp)
id_us_plus(*idpp);
}
-static void test_matpoin_but(struct bContext *C, char *name, ID **idpp)
+static void test_matpoin_but(struct bContext *C, const char *name, ID **idpp)
{
*idpp= BLI_findstring(&CTX_data_main(C)->mat, name, offsetof(ID, name) + 2);
if(*idpp)
id_us_plus(*idpp);
}
-static void test_scenepoin_but(struct bContext *C, char *name, ID **idpp)
+static void test_scenepoin_but(struct bContext *C, const char *name, ID **idpp)
{
*idpp= BLI_findstring(&CTX_data_main(C)->scene, name, offsetof(ID, name) + 2);
if(*idpp)
id_us_plus(*idpp);
}
-static void test_keyboard_event(struct bContext *C, void *arg_ks, void *arg_unused)
+static void test_keyboard_event(struct bContext *UNUSED(C), void *arg_ks, void *UNUSED(arg))
{
bKeyboardSensor *ks= (bKeyboardSensor*)arg_ks;
@@ -1080,6 +1082,20 @@ static void draw_default_sensor_header(bSensor *sens,
"Invert the level (output) of this sensor");
}
+static void get_armature_bone_constraint(Object *ob, const char *posechannel, const char *constraint_name, bConstraint **constraint)
+{
+ /* check that bone exist in the active object */
+ if (ob->type == OB_ARMATURE && ob->pose) {
+ bPoseChannel *pchan= get_pose_channel(ob->pose, posechannel);
+ if(pchan) {
+ bConstraint *con= BLI_findstring(&pchan->constraints, constraint_name, offsetof(bConstraint, name));
+ if(con) {
+ *constraint= con;
+ }
+ }
+ }
+ /* didn't find any */
+}
static void check_armature_bone_constraint(Object *ob, char *posechannel, char *constraint)
{
/* check that bone exist in the active object */
@@ -1118,7 +1134,7 @@ static void check_armature_sensor(bContext *C, void *arg1_but, void *arg2_sens)
check_armature_bone_constraint(ob, sens->posechannel, sens->constraint);
}
-static short draw_sensorbuttons(Object *ob, bSensor *sens, uiBlock *block, short xco, short yco, short width,char* objectname)
+static short draw_sensorbuttons(Object *ob, bSensor *sens, uiBlock *block, short xco, short yco, short width)
{
bNearSensor *ns = NULL;
bTouchSensor *ts = NULL;
@@ -1136,7 +1152,7 @@ static short draw_sensorbuttons(Object *ob, bSensor *sens, uiBlock *block, short
bDelaySensor *ds = NULL;
uiBut *but;
short ysize;
- char *str;
+ const char *str;
/* yco is at the top of the rect, draw downwards */
@@ -1736,7 +1752,7 @@ static void set_col_actuator(int item, int medium)
}
-static void change_object_actuator(bContext *C, void *act, void *arg)
+static void change_object_actuator(bContext *UNUSED(C), void *act, void *UNUSED(arg))
{
bObjectActuator *oa = act;
@@ -1760,7 +1776,7 @@ static void change_object_actuator(bContext *C, void *act, void *arg)
}
}
-static void change_ipo_actuator(bContext *C, void *arg1_but, void *arg2_ia)
+static void change_ipo_actuator(bContext *UNUSED(C), void *arg1_but, void *arg2_ia)
{
bIpoActuator *ia = arg2_ia;
uiBut *but = arg1_but;
@@ -1772,7 +1788,7 @@ static void change_ipo_actuator(bContext *C, void *arg1_but, void *arg2_ia)
but->retval = B_REDR;
}
-void update_object_actuator_PID(bContext *C, void *act, void *arg)
+void update_object_actuator_PID(bContext *UNUSED(C), void *act, void *UNUSED(arg))
{
bObjectActuator *oa = act;
oa->forcerot[0] = 60.0f*oa->forcerot[1];
@@ -1841,7 +1857,7 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo
float *fp;
short ysize = 0, wval;
- char *str;
+ const char *str;
int myline, stbit;
uiBut *but;
@@ -2016,8 +2032,8 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo
}
else
{
- uiDefButI(block, NUM, 0, "Sta: ",xco+10, yco-44, (width-20)/2, 19, &aa->sta, 1.0, MAXFRAMEF, 0, 0, "Start frame");
- uiDefButI(block, NUM, 0, "End: ",xco+10+(width-20)/2, yco-44, (width-20)/2, 19, &aa->end, 1.0, MAXFRAMEF, 0, 0, "End frame");
+ uiDefButF(block, NUM, 0, "Sta: ",xco+10, yco-44, (width-20)/2, 19, &aa->sta, 1.0, MAXFRAMEF, 0, 0, "Start frame");
+ uiDefButF(block, NUM, 0, "End: ",xco+10+(width-20)/2, yco-44, (width-20)/2, 19, &aa->end, 1.0, MAXFRAMEF, 0, 0, "End frame");
}
uiDefButS(block, NUM, 0, "Blendin: ", xco+10, yco-64, (width-20)/2, 19, &aa->blendin, 0.0, 32767, 0.0, 0.0, "Number of frames of motion blending");
@@ -2078,11 +2094,11 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo
"Use this property to define the Ipo position");
}
else {
- uiDefButI(block, NUM, 0,
+ uiDefButF(block, NUM, 0,
"Sta", xco+10, yco-44, (width-80)/2, 19,
&ia->sta, 1.0, MAXFRAMEF, 0, 0,
"Start frame");
- uiDefButI(block, NUM, 0,
+ uiDefButF(block, NUM, 0,
"End", xco+10+(width-80)/2, yco-44, (width-80)/2, 19,
&ia->end, 1.0, MAXFRAMEF, 0, 0,
"End frame");
@@ -2169,7 +2185,7 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo
uiDefButF(block, NUM, 0, "Cone Inner Angle: ", xco+wval+10, yco-176, wval, 19, &sa->sound3D.cone_inner_angle, 0.0, 360.0, 0.0, 0.0, "The angle of the inner cone.");
}
}
- MEM_freeN(str);
+ MEM_freeN((void *)str);
}
else {
uiDefButO(block, BUT, "sound.open", 0, "Load Sound", xco+10, yco-22, width-20, 19, "Load a sound file.");
@@ -2208,7 +2224,6 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo
eoa= act->data;
if(eoa->type==ACT_EDOB_ADD_OBJECT) {
- int wval; /* just a temp width */
ysize = 92;
glRects(xco, yco-ysize, xco+width, yco);
uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1);
@@ -2906,6 +2921,7 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo
uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1);
yco-= ysize;
break;
+
default:
ysize= 4;
@@ -2921,7 +2937,7 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo
return yco-4;
}
-static void do_sensor_menu(bContext *C, void *arg, int event)
+static void do_sensor_menu(bContext *C, void *UNUSED(arg), int event)
{
SpaceLogic *slogic= CTX_wm_space_logic(C);
ID **idar;
@@ -2950,7 +2966,7 @@ static void do_sensor_menu(bContext *C, void *arg, int event)
if(idar) MEM_freeN(idar);
}
-static uiBlock *sensor_menu(bContext *C, ARegion *ar, void *arg_unused)
+static uiBlock *sensor_menu(bContext *C, ARegion *ar, void *UNUSED(arg))
{
uiBlock *block;
int yco=0;
@@ -2970,7 +2986,7 @@ static uiBlock *sensor_menu(bContext *C, ARegion *ar, void *arg_unused)
return block;
}
-static void do_controller_menu(bContext *C, void *arg, int event)
+static void do_controller_menu(bContext *C, void *UNUSED(arg), int event)
{
SpaceLogic *slogic= CTX_wm_space_logic(C);
ID **idar;
@@ -2999,7 +3015,7 @@ static void do_controller_menu(bContext *C, void *arg, int event)
if(idar) MEM_freeN(idar);
}
-static uiBlock *controller_menu(bContext *C, ARegion *ar, void *arg_unused)
+static uiBlock *controller_menu(bContext *C, ARegion *ar, void *UNUSED(arg))
{
uiBlock *block;
int yco=0;
@@ -3019,7 +3035,7 @@ static uiBlock *controller_menu(bContext *C, ARegion *ar, void *arg_unused)
return block;
}
-static void do_actuator_menu(bContext *C, void *arg, int event)
+static void do_actuator_menu(bContext *C, void *UNUSED(arg), int event)
{
SpaceLogic *slogic= CTX_wm_space_logic(C);
ID **idar;
@@ -3048,7 +3064,7 @@ static void do_actuator_menu(bContext *C, void *arg, int event)
if(idar) MEM_freeN(idar);
}
-static uiBlock *actuator_menu(bContext *C, ARegion *ar, void *arg_unused)
+static uiBlock *actuator_menu(bContext *C, ARegion *ar, void *UNUSED(arg))
{
uiBlock *block;
int xco=0;
@@ -3070,7 +3086,7 @@ static uiBlock *actuator_menu(bContext *C, ARegion *ar, void *arg_unused)
-static void check_controller_state_mask(bContext *C, void *arg1_but, void *arg2_mask)
+static void check_controller_state_mask(bContext *UNUSED(C), void *arg1_but, void *arg2_mask)
{
unsigned int *cont_mask = arg2_mask;
uiBut *but = arg1_but;
@@ -3123,7 +3139,7 @@ static uiBlock *controller_state_mask_menu(bContext *C, ARegion *ar, void *arg_c
return block;
}
-static void do_object_state_menu(bContext *C, void *arg, int event)
+static void do_object_state_menu(bContext *UNUSED(C), void *arg, int event)
{
Object *ob = arg;
@@ -3184,19 +3200,19 @@ static void draw_sensor_header(uiLayout *layout, PointerRNA *ptr, PointerRNA *lo
box= uiLayoutBox(layout);
row= uiLayoutRow(box, 0);
- uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", 0);
+ uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NULL);
if(RNA_boolean_get(ptr, "show_expanded")) {
- uiItemR(row, ptr, "type", 0, "", 0);
- uiItemR(row, ptr, "name", 0, "", 0);
+ uiItemR(row, ptr, "type", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "name", 0, "", ICON_NULL);
} else {
- uiItemL(row, sensor_name(sens->type), 0);
- uiItemL(row, sens->name, 0);
+ uiItemL(row, sensor_name(sens->type), ICON_NULL);
+ uiItemL(row, sens->name, ICON_NULL);
}
subrow= uiLayoutRow(row, 0);
uiLayoutSetActive(subrow, ((RNA_boolean_get(logic_ptr, "show_sensors_active_states")
&& RNA_boolean_get(ptr, "show_expanded")) || RNA_boolean_get(ptr, "pin")));
- uiItemR(subrow, ptr, "pin", UI_ITEM_R_NO_BG, "", 0);
+ uiItemR(subrow, ptr, "pin", UI_ITEM_R_NO_BG, "", ICON_NULL);
if(RNA_boolean_get(ptr, "show_expanded")==0) {
subrow= uiLayoutRow(row, 1);
@@ -3217,14 +3233,14 @@ static void draw_sensor_internal_header(uiLayout *layout, PointerRNA *ptr)
row= uiLayoutRow(split, 1);
uiItemR(row, ptr, "use_pulse_true_level", 0, "", ICON_DOTSUP);
uiItemR(row, ptr, "use_pulse_false_level", 0, "", ICON_DOTSDOWN);
- uiItemR(row, ptr, "frequency", 0, "Freq", 0);
+ uiItemR(row, ptr, "frequency", 0, "Freq", ICON_NULL);
row= uiLayoutRow(split, 1);
- uiItemR(row, ptr, "use_level", UI_ITEM_R_TOGGLE, NULL, 0);
- uiItemR(row, ptr, "use_tap", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_level", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_tap", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
row= uiLayoutRow(split, 1);
- uiItemR(row, ptr, "invert", UI_ITEM_R_TOGGLE, "Invert", 0);
+ uiItemR(row, ptr, "invert", UI_ITEM_R_TOGGLE, "Invert", ICON_NULL);
}
/* sensors in alphabetical order */
@@ -3247,7 +3263,7 @@ static void draw_sensor_armature(uiLayout *layout, PointerRNA *ptr)
uiLayout *row;
if(ob->type != OB_ARMATURE){
- uiItemL(layout, "Sensor only available for armatures", 0);
+ uiItemL(layout, "Sensor only available for armatures", ICON_NULL);
return;
}
@@ -3263,8 +3279,9 @@ static void draw_sensor_armature(uiLayout *layout, PointerRNA *ptr)
uiItemPointerR(layout, ptr, "constraint", &pchan_ptr, "constraints", NULL, ICON_CONSTRAINT_BONE);
}
row = uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "test_type", 0, NULL, 0);
- uiItemR(row, ptr, "value", 0, NULL, 0);
+ uiItemR(row, ptr, "test_type", 0, NULL, ICON_NULL);
+ if (RNA_enum_get(ptr, "test_type") != SENS_ARM_STATE_CHANGED)
+ uiItemR(row, ptr, "value", 0, NULL, ICON_NULL);
}
static void draw_sensor_collision(uiLayout *layout, PointerRNA *ptr, bContext *C)
@@ -3276,12 +3293,12 @@ static void draw_sensor_collision(uiLayout *layout, PointerRNA *ptr, bContext *C
split = uiLayoutSplit(layout, 0.3, 0);
row = uiLayoutRow(split, 1);
- uiItemR(row, ptr, "use_pulse", UI_ITEM_R_TOGGLE, NULL, 0);
- uiItemR(row, ptr, "use_material", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_pulse", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_material", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "use_material")) {
case SENS_COLLISION_PROPERTY:
- uiItemR(split, ptr, "property", 0, NULL, 0);
+ uiItemR(split, ptr, "property", 0, NULL, ICON_NULL);
break;
case SENS_COLLISION_MATERIAL:
uiItemPointerR(split, ptr, "material", &main_ptr, "materials", NULL, ICON_MATERIAL_DATA);
@@ -3295,48 +3312,48 @@ static void draw_sensor_delay(uiLayout *layout, PointerRNA *ptr)
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "delay", 0, NULL, 0);
- uiItemR(row, ptr, "duration", 0, NULL, 0);
- uiItemR(row, ptr, "use_repeat", 0, NULL, 0);
+ uiItemR(row, ptr, "delay", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "duration", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_repeat", 0, NULL, ICON_NULL);
}
static void draw_sensor_joystick(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *col, *row;
- uiItemR(layout, ptr, "joystick_index", 0, NULL, 0);
- uiItemR(layout, ptr, "event_type", 0, NULL, 0);
+ uiItemR(layout, ptr, "joystick_index", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "event_type", 0, NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "event_type")) {
case SENS_JOY_BUTTON:
- uiItemR(layout, ptr, "use_all_events", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_all_events", 0, NULL, ICON_NULL);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_events")==0);
- uiItemR(col, ptr, "button_number", 0, NULL, 0);
+ uiItemR(col, ptr, "button_number", 0, NULL, ICON_NULL);
break;
case SENS_JOY_AXIS:
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "axis_number", 0, NULL, 0);
- uiItemR(row, ptr, "axis_threshold", 0, NULL, 0);
+ uiItemR(row, ptr, "axis_number", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "axis_threshold", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "use_all_events", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_all_events", 0, NULL, ICON_NULL);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_events")==0);
- uiItemR(col, ptr, "axis_direction", 0, NULL, 0);
+ uiItemR(col, ptr, "axis_direction", 0, NULL, ICON_NULL);
break;
case SENS_JOY_HAT:
- uiItemR(layout, ptr, "hat_number", 0, NULL, 0);
- uiItemR(layout, ptr, "use_all_events", 0, NULL, 0);
+ uiItemR(layout, ptr, "hat_number", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "use_all_events", 0, NULL, ICON_NULL);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_events")==0);
- uiItemR(col, ptr, "hat_direction", 0, NULL, 0);
+ uiItemR(col, ptr, "hat_direction", 0, NULL, ICON_NULL);
break;
case SENS_JOY_AXIS_SINGLE:
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "single_axis_number", 0, NULL, 0);
- uiItemR(row, ptr, "axis_threshold", 0, NULL, 0);
+ uiItemR(row, ptr, "single_axis_number", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "axis_threshold", 0, NULL, ICON_NULL);
break;
}
}
@@ -3348,47 +3365,47 @@ static void draw_sensor_keyboard(uiLayout *layout, PointerRNA *ptr)
uiLayout *row, *col;
row = uiLayoutRow(layout, 0);
- uiItemL(row, "Key:", 0);
+ uiItemL(row, "Key:", ICON_NULL);
col = uiLayoutColumn(row, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_keys")==0);
- uiItemR(col, ptr, "key", UI_ITEM_R_EVENT, "", 0);
+ uiItemR(col, ptr, "key", UI_ITEM_R_EVENT, "", ICON_NULL);
col = uiLayoutColumn(row, 0);
- uiItemR(col, ptr, "use_all_keys", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(col, ptr, "use_all_keys", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_keys")==0);
row = uiLayoutRow(col, 0);
- uiItemL(row, "First Modifier:", 0);
- uiItemR(row, ptr, "modifier_key_1", UI_ITEM_R_EVENT, "", 0);
+ uiItemL(row, "First Modifier:", ICON_NULL);
+ uiItemR(row, ptr, "modifier_key_1", UI_ITEM_R_EVENT, "", ICON_NULL);
row = uiLayoutRow(col, 0);
- uiItemL(row, "Second Modifier:", 0);
- uiItemR(row, ptr, "modifier_key_2", UI_ITEM_R_EVENT, "", 0);
+ uiItemL(row, "Second Modifier:", ICON_NULL);
+ uiItemR(row, ptr, "modifier_key_2", UI_ITEM_R_EVENT, "", ICON_NULL);
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
- uiItemPointerR(layout, ptr, "target", &settings_ptr, "properties", NULL, 0);
- uiItemPointerR(layout, ptr, "log", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(layout, ptr, "log", &settings_ptr, "properties", NULL, ICON_NULL);
+ uiItemPointerR(layout, ptr, "target", &settings_ptr, "properties", NULL, ICON_NULL);
}
static void draw_sensor_message(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "subject", 0, NULL, 0);
+ uiItemR(layout, ptr, "subject", 0, NULL, ICON_NULL);
}
static void draw_sensor_mouse(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "mouse_event", 0, NULL, 0);
+ uiItemR(layout, ptr, "mouse_event", 0, NULL, ICON_NULL);
}
static void draw_sensor_near(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *row;
- uiItemR(layout, ptr, "property", 0, NULL, 0);
+ uiItemR(layout, ptr, "property", 0, NULL, ICON_NULL);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "distance", 0, NULL, 0);
- uiItemR(row, ptr, "reset_distance", 0, NULL, 0);
+ uiItemR(row, ptr, "distance", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "reset_distance", 0, NULL, ICON_NULL);
}
static void draw_sensor_property(uiLayout *layout, PointerRNA *ptr)
@@ -3397,22 +3414,22 @@ static void draw_sensor_property(uiLayout *layout, PointerRNA *ptr)
PointerRNA settings_ptr;
uiLayout *row;
- uiItemR(layout, ptr, "evaluation_type", 0, NULL, 0);
+ uiItemR(layout, ptr, "evaluation_type", 0, NULL, ICON_NULL);
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
- uiItemPointerR(layout, ptr, "property", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(layout, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "evaluation_type")) {
case SENS_PROP_INTERVAL:
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "value_min", 0, NULL, 0);
- uiItemR(row, ptr, "value_max", 0, NULL, 0);
+ uiItemR(row, ptr, "value_min", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "value_max", 0, NULL, ICON_NULL);
break;
case SENS_PROP_EQUAL:
- uiItemR(layout, ptr, "value", 0, NULL, 0);
+ uiItemR(layout, ptr, "value", 0, NULL, ICON_NULL);
break;
case SENS_PROP_NEQUAL:
- uiItemR(layout, ptr, "value", 0, NULL, 0);
+ uiItemR(layout, ptr, "value", 0, NULL, ICON_NULL);
break;
case SENS_PROP_CHANGED:
break;
@@ -3423,17 +3440,17 @@ static void draw_sensor_radar(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *row;
- uiItemR(layout, ptr, "property", 0, NULL, 0);
- uiItemR(layout, ptr, "axis", 0, NULL, 0);
+ uiItemR(layout, ptr, "property", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "axis", 0, NULL, ICON_NULL);
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "angle", 0, NULL, 0);
- uiItemR(row, ptr, "distance", 0, NULL, 0);
+ uiItemR(row, ptr, "angle", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "distance", 0, NULL, ICON_NULL);
}
static void draw_sensor_random(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "seed", 0, NULL, 0);
+ uiItemR(layout, ptr, "seed", 0, NULL, ICON_NULL);
}
static void draw_sensor_ray(uiLayout *layout, PointerRNA *ptr, bContext *C)
@@ -3443,10 +3460,10 @@ static void draw_sensor_ray(uiLayout *layout, PointerRNA *ptr, bContext *C)
RNA_main_pointer_create(CTX_data_main(C), &main_ptr);
split= uiLayoutSplit(layout, 0.3, 0);
- uiItemR(split, ptr, "ray_type", 0, "", 0);
+ uiItemR(split, ptr, "ray_type", 0, "", ICON_NULL);
switch (RNA_enum_get(ptr, "ray_type")) {
case SENS_RAY_PROPERTY:
- uiItemR(split, ptr, "property", 0, "", 0);
+ uiItemR(split, ptr, "property", 0, "", ICON_NULL);
break;
case SENS_RAY_MATERIAL:
uiItemPointerR(split, ptr, "material", &main_ptr, "materials", "", ICON_MATERIAL_DATA);
@@ -3454,15 +3471,15 @@ static void draw_sensor_ray(uiLayout *layout, PointerRNA *ptr, bContext *C)
}
split= uiLayoutSplit(layout, 0.3, 0);
- uiItemR(split, ptr, "axis", 0, "", 0);
+ uiItemR(split, ptr, "axis", 0, "", ICON_NULL);
row= uiLayoutRow(split, 0);
- uiItemR(row, ptr, "range", 0, NULL, 0);
- uiItemR(row, ptr, "use_x_ray", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "range", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_x_ray", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
}
static void draw_sensor_touch(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "material", 0, NULL, 0);
+ uiItemR(layout, ptr, "material", 0, NULL, ICON_NULL);
}
void draw_brick_sensor(uiLayout *layout, PointerRNA *ptr, bContext *C)
@@ -3537,19 +3554,19 @@ static void draw_controller_header(uiLayout *layout, PointerRNA *ptr, int xco, i
box= uiLayoutBox(layout);
row= uiLayoutRow(box, 0);
- uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", 0);
+ uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NULL);
if(RNA_boolean_get(ptr, "show_expanded")) {
- uiItemR(row, ptr, "type", 0, "", 0);
- uiItemR(row, ptr, "name", 0, "", 0);
+ uiItemR(row, ptr, "type", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "name", 0, "", ICON_NULL);
/* XXX provisory for Blender 2.50Beta */
uiDefBlockBut(uiLayoutGetBlock(layout), controller_state_mask_menu, cont, state, (short)(xco+width-44), yco, 22+22, UI_UNIT_Y, "Set controller state index (from 1 to 30)");
} else {
- uiItemL(row, controller_name(cont->type), 0);
- uiItemL(row, cont->name, 0);
- uiItemL(row, state, 0);
+ uiItemL(row, controller_name(cont->type), ICON_NULL);
+ uiItemL(row, cont->name, ICON_NULL);
+ uiItemL(row, state, ICON_NULL);
}
- uiItemR(row, ptr, "use_priority", 0, "", 0);
+ uiItemR(row, ptr, "use_priority", 0, "", ICON_NULL);
if(RNA_boolean_get(ptr, "show_expanded")==0) {
subrow= uiLayoutRow(row, 1);
@@ -3561,7 +3578,7 @@ static void draw_controller_header(uiLayout *layout, PointerRNA *ptr, int xco, i
static void draw_controller_expression(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "expression", 0, "", 0);
+ uiItemR(layout, ptr, "expression", 0, "", ICON_NULL);
}
static void draw_controller_python(uiLayout *layout, PointerRNA *ptr)
@@ -3569,18 +3586,18 @@ static void draw_controller_python(uiLayout *layout, PointerRNA *ptr)
uiLayout *split, *subsplit;
split = uiLayoutSplit(layout, 0.3, 1);
- uiItemR(split, ptr, "mode", 0, "", 0);
+ uiItemR(split, ptr, "mode", 0, "", ICON_NULL);
if (RNA_enum_get(ptr, "mode") == CONT_PY_SCRIPT) {
- uiItemR(split, ptr, "text", 0, "", 0);
+ uiItemR(split, ptr, "text", 0, "", ICON_NULL);
}
else {
subsplit = uiLayoutSplit(split, 0.8, 0);
- uiItemR(subsplit, ptr, "module", 0, "", 0);
- uiItemR(subsplit, ptr, "use_debug", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(subsplit, ptr, "module", 0, "", ICON_NULL);
+ uiItemR(subsplit, ptr, "use_debug", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
}
}
-static void draw_controller_state(uiLayout *layout, PointerRNA *ptr)
+static void draw_controller_state(uiLayout *UNUSED(layout), PointerRNA *UNUSED(ptr))
{
}
@@ -3627,19 +3644,19 @@ static void draw_actuator_header(uiLayout *layout, PointerRNA *ptr, PointerRNA *
box= uiLayoutBox(layout);
row= uiLayoutRow(box, 0);
- uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", 0);
+ uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NULL);
if(RNA_boolean_get(ptr, "show_expanded")) {
- uiItemR(row, ptr, "type", 0, "", 0);
- uiItemR(row, ptr, "name", 0, "", 0);
+ uiItemR(row, ptr, "type", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "name", 0, "", ICON_NULL);
} else {
- uiItemL(row, actuator_name(act->type), 0);
- uiItemL(row, act->name, 0);
+ uiItemL(row, actuator_name(act->type), ICON_NULL);
+ uiItemL(row, act->name, ICON_NULL);
}
subrow= uiLayoutRow(row, 0);
uiLayoutSetActive(subrow, ((RNA_boolean_get(logic_ptr, "show_actuators_active_states")
&& RNA_boolean_get(ptr, "show_expanded")) || RNA_boolean_get(ptr, "pin")));
- uiItemR(subrow, ptr, "pin", UI_ITEM_R_NO_BG, "", 0);
+ uiItemR(subrow, ptr, "pin", UI_ITEM_R_NO_BG, "", ICON_NULL);
if(RNA_boolean_get(ptr, "show_expanded")==0) {
subrow= uiLayoutRow(row, 1);
@@ -3656,34 +3673,34 @@ static void draw_actuator_action(uiLayout *layout, PointerRNA *ptr)
uiLayout *row;
if(ob->type != OB_ARMATURE){
- uiItemL(layout, "Actuator only available for armatures", 0);
+ uiItemL(layout, "Actuator only available for armatures", ICON_NULL);
return;
}
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "play_mode", 0, "", 0);
- uiItemR(row, ptr, "action", 0, NULL, 0);
- uiItemR(row, ptr, "use_continue_last_frame", 0, NULL, 0);
+ uiItemR(row, ptr, "play_mode", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "action", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_continue_last_frame", 0, NULL, ICON_NULL);
row= uiLayoutRow(layout, 0);
if((RNA_enum_get(ptr, "play_mode") == ACT_ACTION_FROM_PROP))
- uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
else {
- uiItemR(row, ptr, "frame_start", 0, NULL, 0);
- uiItemR(row, ptr, "frame_end", 0, NULL, 0);
+ uiItemR(row, ptr, "frame_start", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "frame_end", 0, NULL, ICON_NULL);
}
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "frame_blend_in", 0, NULL, 0);
- uiItemR(row, ptr, "priority", 0, NULL, 0);
+ uiItemR(row, ptr, "frame_blend_in", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "priority", 0, NULL, ICON_NULL);
row= uiLayoutRow(layout, 0);
- uiItemPointerR(layout, ptr, "frame_property", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(layout, ptr, "frame_property", &settings_ptr, "properties", NULL, ICON_NULL);
#ifdef __NLA_ACTION_BY_MOTION_ACTUATOR
- uiItemR(row, "stride_length", 0, NULL, 0);
+ uiItemR(row, "stride_length", 0, NULL, ICON_NULL);
#endif
}
@@ -3692,11 +3709,12 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr)
bActuator *act = (bActuator*)ptr->data;
bArmatureActuator *aa = (bArmatureActuator *) act->data;
Object *ob = (Object *)ptr->id.data;
+ bConstraint *constraint = NULL;
PointerRNA pose_ptr, pchan_ptr;
- PropertyRNA *bones_prop;
+ PropertyRNA *bones_prop = NULL;
if(ob->type != OB_ARMATURE){
- uiItemL(layout, "Actuator only available for armatures", 0);
+ uiItemL(layout, "Actuator only available for armatures", ICON_NULL);
return;
}
@@ -3705,7 +3723,7 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr)
bones_prop = RNA_struct_find_property(&pose_ptr, "bones");
}
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "mode"))
{
@@ -3713,7 +3731,7 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr)
break;
case ACT_ARM_ENABLE:
case ACT_ARM_DISABLE:
- if (&pose_ptr.data) {
+ if (ob->pose) {
uiItemPointerR(layout, ptr, "bone", &pose_ptr, "bones", NULL, ICON_BONE_DATA);
if (RNA_property_collection_lookup_string(&pose_ptr, bones_prop, aa->posechannel, &pchan_ptr))
@@ -3721,25 +3739,30 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr)
}
break;
case ACT_ARM_SETTARGET:
- if (&pose_ptr.data) {
+ if (ob->pose) {
uiItemPointerR(layout, ptr, "bone", &pose_ptr, "bones", NULL, ICON_BONE_DATA);
if (RNA_property_collection_lookup_string(&pose_ptr, bones_prop, aa->posechannel, &pchan_ptr))
uiItemPointerR(layout, ptr, "constraint", &pchan_ptr, "constraints", NULL, ICON_CONSTRAINT_BONE);
}
- uiItemR(layout, ptr, "target", 0, NULL, 0);
- uiItemR(layout, ptr, "secondary_target", 0, NULL, 0);
+ uiItemR(layout, ptr, "target", 0, NULL, ICON_NULL);
+
+ /* show second target only if the constraint supports it */
+ get_armature_bone_constraint(ob, aa->posechannel, aa->constraint, &constraint);
+ if (constraint && constraint->type == CONSTRAINT_TYPE_KINEMATIC) {
+ uiItemR(layout, ptr, "secondary_target", 0, NULL, ICON_NULL);
+ }
break;
case ACT_ARM_SETWEIGHT:
- if (&pose_ptr.data) {
+ if (ob->pose) {
uiItemPointerR(layout, ptr, "bone", &pose_ptr, "bones", NULL, ICON_BONE_DATA);
if (RNA_property_collection_lookup_string(&pose_ptr, bones_prop, aa->posechannel, &pchan_ptr))
uiItemPointerR(layout, ptr, "constraint", &pchan_ptr, "constraints", NULL, ICON_CONSTRAINT_BONE);
}
- uiItemR(layout, ptr, "weight", 0, NULL, 0);
+ uiItemR(layout, ptr, "weight", 0, NULL, ICON_NULL);
break;
}
}
@@ -3747,15 +3770,15 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr)
static void draw_actuator_camera(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *row;
- uiItemR(layout, ptr, "object", 0, NULL, 0);
+ uiItemR(layout, ptr, "object", 0, NULL, ICON_NULL);
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "height", 0, NULL, 0);
- uiItemR(row, ptr, "axis", 0, NULL, 0);
+ uiItemR(row, ptr, "height", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "axis", 0, NULL, ICON_NULL);
- row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "min", 0, NULL, 0);
- uiItemR(row, ptr, "max", 0, NULL, 0);
+ row = uiLayoutRow(layout, 1);
+ uiItemR(row, ptr, "min", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "max", 0, NULL, ICON_NULL);
}
static void draw_actuator_constraint(uiLayout *layout, PointerRNA *ptr, bContext *C)
@@ -3765,96 +3788,96 @@ static void draw_actuator_constraint(uiLayout *layout, PointerRNA *ptr, bContext
RNA_main_pointer_create(CTX_data_main(C), &main_ptr);
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "mode"))
{
case ACT_CONST_TYPE_LOC:
- uiItemR(layout, ptr, "limit", 0, NULL, 0);
+ uiItemR(layout, ptr, "limit", 0, NULL, ICON_NULL);
row = uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "limit_min", 0, NULL, 0);
- uiItemR(row, ptr, "limit_max", 0, NULL, 0);
+ uiItemR(row, ptr, "limit_min", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "limit_max", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "damping", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(layout, ptr, "damping", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
break;
case ACT_CONST_TYPE_DIST:
split = uiLayoutSplit(layout, 0.8, 0);
- uiItemR(split, ptr, "direction", 0, NULL, 0);
+ uiItemR(split, ptr, "direction", 0, NULL, ICON_NULL);
row = uiLayoutRow(split, 1);
- uiItemR(row, ptr, "use_local", UI_ITEM_R_TOGGLE, NULL, 0);
- uiItemR(row, ptr, "use_normal", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_local", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_normal", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
row = uiLayoutRow(layout, 0);
col = uiLayoutColumn(row, 0);
- uiItemL(col, "Range:", 0);
- uiItemR(col, ptr, "range", 0, "", 0);
+ uiItemL(col, "Range:", ICON_NULL);
+ uiItemR(col, ptr, "range", 0, "", ICON_NULL);
col = uiLayoutColumn(row, 1);
- uiItemR(col, ptr, "use_force_distance", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(col, ptr, "use_force_distance", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
subcol = uiLayoutColumn(col, 0);
uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_force_distance")==1);
- uiItemR(subcol, ptr, "distance", 0, "", 0);
+ uiItemR(subcol, ptr, "distance", 0, "", ICON_NULL);
- uiItemR(layout, ptr, "damping", UI_ITEM_R_SLIDER , NULL, 0);
+ uiItemR(layout, ptr, "damping", UI_ITEM_R_SLIDER , NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.15, 0);
- uiItemR(split, ptr, "use_material_detect", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(split, ptr, "use_material_detect", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
if (RNA_boolean_get(ptr, "use_material_detect"))
uiItemPointerR(split, ptr, "material", &main_ptr, "materials", NULL, ICON_MATERIAL_DATA);
else
- uiItemR(split, ptr, "property", 0, NULL, 0);
+ uiItemR(split, ptr, "property", 0, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.15, 0);
- uiItemR(split, ptr, "use_persistent", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(split, ptr, "use_persistent", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
row = uiLayoutRow(split, 1);
- uiItemR(row, ptr, "time", 0, NULL, 0);
- uiItemR(row, ptr, "damping_rotation", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(row, ptr, "time", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "damping_rotation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
break;
case ACT_CONST_TYPE_ORI:
- uiItemR(layout, ptr, "direction_axis", 0, NULL, 0);
+ uiItemR(layout, ptr, "direction_axis_pos", 0, NULL, ICON_NULL);
row=uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "damping", UI_ITEM_R_SLIDER , NULL, 0);
- uiItemR(row, ptr, "time", 0, NULL, 0);
+ uiItemR(row, ptr, "damping", UI_ITEM_R_SLIDER , NULL, ICON_NULL);
+ uiItemR(row, ptr, "time", 0, NULL, ICON_NULL);
row=uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "rotation_max", 0, NULL, 0);
+ uiItemR(row, ptr, "rotation_max", 0, NULL, ICON_NULL);
row=uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "angle_min", 0, NULL, 0);
- uiItemR(row, ptr, "angle_max", 0, NULL, 0);
+ uiItemR(row, ptr, "angle_min", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "angle_max", 0, NULL, ICON_NULL);
break;
case ACT_CONST_TYPE_FH:
split=uiLayoutSplit(layout, 0.75, 0);
row= uiLayoutRow(split, 0);
- uiItemR(row, ptr, "fh_damping", UI_ITEM_R_SLIDER , NULL, 0);
+ uiItemR(row, ptr, "fh_damping", UI_ITEM_R_SLIDER , NULL, ICON_NULL);
- uiItemR(row, ptr, "fh_height", 0, NULL, 0);
- uiItemR(split, ptr, "use_fh_paralel_axis", UI_ITEM_R_TOGGLE , NULL, 0);
+ uiItemR(row, ptr, "fh_height", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_fh_paralel_axis", UI_ITEM_R_TOGGLE , NULL, ICON_NULL);
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "direction_axis", 0, NULL, 0);
+ uiItemR(row, ptr, "direction_axis", 0, NULL, ICON_NULL);
split = uiLayoutSplit(row, 0.9, 0);
- uiItemR(split, ptr, "spring", 0, NULL, 0);
- uiItemR(split, ptr, "use_fh_normal", UI_ITEM_R_TOGGLE , NULL, 0);
+ uiItemR(split, ptr, "spring", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_fh_normal", UI_ITEM_R_TOGGLE , NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.15, 0);
- uiItemR(split, ptr, "use_material_detect", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(split, ptr, "use_material_detect", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
if (RNA_boolean_get(ptr, "use_material_detect"))
uiItemPointerR(split, ptr, "material", &main_ptr, "materials", NULL, ICON_MATERIAL_DATA);
else
- uiItemR(split, ptr, "property", 0, NULL, 0);
+ uiItemR(split, ptr, "property", 0, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.15, 0);
- uiItemR(split, ptr, "use_persistent", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(split, ptr, "use_persistent", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "time", 0, NULL, 0);
- uiItemR(row, ptr, "damping_rotation", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(row, ptr, "time", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "damping_rotation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
break;
}
}
@@ -3863,53 +3886,53 @@ static void draw_actuator_edit_object(uiLayout *layout, PointerRNA *ptr)
{
Object *ob = (Object *)ptr->id.data;
uiLayout *row, *split, *subsplit;
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "mode"))
{
case ACT_EDOB_ADD_OBJECT:
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "object", 0, NULL, 0);
- uiItemR(row, ptr, "time", 0, NULL, 0);
+ uiItemR(row, ptr, "object", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "time", 0, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "linear_velocity", 0, NULL, 0);
- uiItemR(split, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "linear_velocity", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "angular_velocity", 0, NULL, 0);
- uiItemR(split, ptr, "use_local_angular_velocity", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "angular_velocity", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_local_angular_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
break;
case ACT_EDOB_END_OBJECT:
break;
case ACT_EDOB_REPLACE_MESH:
if(ob->type != OB_MESH) {
- uiItemL(layout, "Mode only available for mesh objects", 0);
+ uiItemL(layout, "Mode only available for mesh objects", ICON_NULL);
break;
}
split = uiLayoutSplit(layout, 0.6, 0);
- uiItemR(split, ptr, "mesh", 0, NULL, 0);
+ uiItemR(split, ptr, "mesh", 0, NULL, ICON_NULL);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "use_replace_display_mesh", UI_ITEM_R_TOGGLE, NULL, 0);
- uiItemR(row, ptr, "use_replace_physics_mesh", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_replace_display_mesh", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_replace_physics_mesh", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
break;
case ACT_EDOB_TRACK_TO:
split = uiLayoutSplit(layout, 0.5, 0);
- uiItemR(split, ptr, "track_object", 0, NULL, 0);
+ uiItemR(split, ptr, "track_object", 0, NULL, ICON_NULL);
subsplit = uiLayoutSplit(split, 0.7, 0);
- uiItemR(subsplit, ptr, "time", 0, NULL, 0);
- uiItemR(subsplit, ptr, "use_3d_tracking", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(subsplit, ptr, "time", 0, NULL, ICON_NULL);
+ uiItemR(subsplit, ptr, "use_3d_tracking", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
break;
case ACT_EDOB_DYNAMICS:
if(ob->type != OB_MESH) {
- uiItemL(layout, "Mode only available for mesh objects", 0);
+ uiItemL(layout, "Mode only available for mesh objects", ICON_NULL);
break;
}
- uiItemR(layout, ptr, "dynamic_operation", 0, NULL, 0);
+ uiItemR(layout, ptr, "dynamic_operation", 0, NULL, ICON_NULL);
if (RNA_enum_get(ptr, "dynamic_operation") == ACT_EDOB_SET_MASS)
- uiItemR(layout, ptr, "mass", 0, NULL, 0);
+ uiItemR(layout, ptr, "mass", 0, NULL, ICON_NULL);
break;
}
}
@@ -3918,31 +3941,31 @@ static void draw_actuator_filter_2d(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *row, *split;
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "mode"))
{
case ACT_2DFILTER_CUSTOMFILTER:
- uiItemR(layout, ptr, "filter_pass", 0, NULL, 0);
- uiItemR(layout, ptr, "glsl_shader", 0, NULL, 0);
+ uiItemR(layout, ptr, "filter_pass", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "glsl_shader", 0, NULL, ICON_NULL);
break;
case ACT_2DFILTER_MOTIONBLUR:
split=uiLayoutSplit(layout, 0.75, 1);
row= uiLayoutRow(split, 0);
uiLayoutSetActive(row, RNA_boolean_get(ptr, "use_motion_blur")==1);
- uiItemR(row, ptr, "motion_blur_factor", 0, NULL, 0);
- uiItemR(split, ptr, "use_motion_blur", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "motion_blur_factor", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_motion_blur", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
break;
default: // all other 2D Filters
- uiItemR(layout, ptr, "filter_pass", 0, NULL, 0);
+ uiItemR(layout, ptr, "filter_pass", 0, NULL, ICON_NULL);
break;
}
}
static void draw_actuator_game(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
if (RNA_enum_get(ptr, "mode") == ACT_GAME_LOAD)
- uiItemR(layout, ptr, "filename", 0, NULL, 0);
+ uiItemR(layout, ptr, "filename", 0, NULL, ICON_NULL);
}
static void draw_actuator_ipo(uiLayout *layout, PointerRNA *ptr)
@@ -3955,27 +3978,27 @@ static void draw_actuator_ipo(uiLayout *layout, PointerRNA *ptr)
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "play_type", 0, "", 0);
+ uiItemR(row, ptr, "play_type", 0, "", ICON_NULL);
subrow= uiLayoutRow(row, 1);
- uiItemR(subrow, ptr, "use_force", UI_ITEM_R_TOGGLE, NULL, 0);
- uiItemR(subrow, ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(subrow, ptr, "use_force", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(subrow, ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
col = uiLayoutColumn(subrow, 0);
uiLayoutSetActive(col, (RNA_boolean_get(ptr, "use_additive") || RNA_boolean_get(ptr, "use_force")));
- uiItemR(col, ptr, "use_local", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(col, ptr, "use_local", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
row= uiLayoutRow(layout, 0);
if((RNA_enum_get(ptr, "play_type") == ACT_IPO_FROM_PROP))
- uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
else {
- uiItemR(row, ptr, "frame_start", 0, NULL, 0);
- uiItemR(row, ptr, "frame_end", 0, NULL, 0);
+ uiItemR(row, ptr, "frame_start", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "frame_end", 0, NULL, ICON_NULL);
}
- uiItemR(row, ptr, "apply_to_children", 0, NULL, 0);
+ uiItemR(row, ptr, "apply_to_children", 0, NULL, ICON_NULL);
row= uiLayoutRow(layout, 0);
- uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, ICON_NULL);
}
static void draw_actuator_message(uiLayout *layout, PointerRNA *ptr, bContext *C)
@@ -3990,15 +4013,15 @@ static void draw_actuator_message(uiLayout *layout, PointerRNA *ptr, bContext *C
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
uiItemPointerR(layout, ptr, "to_property", &main_ptr, "objects", NULL, ICON_OBJECT_DATA);
- uiItemR(layout, ptr, "subject", 0, NULL, 0);
+ uiItemR(layout, ptr, "subject", 0, NULL, ICON_NULL);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "body_type", 0, NULL, 0);
+ uiItemR(row, ptr, "body_type", 0, NULL, ICON_NULL);
if(RNA_enum_get(ptr, "body_type") == ACT_MESG_MESG)
- uiItemR(row, ptr, "body_message", 0, "", 0);
+ uiItemR(row, ptr, "body_message", 0, "", ICON_NULL);
else // mode == ACT_MESG_PROP
- uiItemPointerR(row, ptr, "body_property", &settings_ptr, "properties", "", 0);
+ uiItemPointerR(row, ptr, "body_property", &settings_ptr, "properties", "", ICON_NULL);
}
static void draw_actuator_motion(uiLayout *layout, PointerRNA *ptr)
@@ -4012,99 +4035,104 @@ static void draw_actuator_motion(uiLayout *layout, PointerRNA *ptr)
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
physics_type = RNA_enum_get(&settings_ptr, "physics_type");
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "mode")) {
case ACT_OBJECT_NORMAL:
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "offset_location", 0, NULL, 0);
- uiItemR(split, ptr, "use_local_location", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "offset_location", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_local_location", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "offset_rotation", 0, NULL, 0);
- uiItemR(split, ptr, "use_local_rotation", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "offset_rotation", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_local_rotation", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
if (ELEM3(physics_type, OB_BODY_TYPE_DYNAMIC, OB_BODY_TYPE_RIGID, OB_BODY_TYPE_SOFT)) {
- uiItemL(layout, "Dynamic Object Settings:", 0);
+ uiItemL(layout, "Dynamic Object Settings:", ICON_NULL);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "force", 0, NULL, 0);
- uiItemR(split, ptr, "use_local_force", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "force", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_local_force", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "torque", 0, NULL, 0);
- uiItemR(split, ptr, "use_local_torque", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "torque", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_local_torque", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "linear_velocity", 0, NULL, 0);
+ uiItemR(row, ptr, "linear_velocity", 0, NULL, ICON_NULL);
row = uiLayoutRow(split, 1);
- uiItemR(row, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, 0);
- uiItemR(row, ptr, "use_add_linear_velocity", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_add_linear_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "angular_velocity", 0, NULL, 0);
- uiItemR(split, ptr, "use_local_angular_velocity", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "angular_velocity", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_local_angular_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
- uiItemR(layout, ptr, "damping", 0, NULL, 0);
+ uiItemR(layout, ptr, "damping", 0, NULL, ICON_NULL);
}
break;
case ACT_OBJECT_SERVO:
- uiItemR(layout, ptr, "reference_object", 0, NULL, 0);
+ uiItemR(layout, ptr, "reference_object", 0, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "linear_velocity", 0, NULL, 0);
- uiItemR(split, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "linear_velocity", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
row = uiLayoutRow(layout, 0);
col = uiLayoutColumn(row, 0);
- uiItemR(col, ptr, "use_servo_limit_x", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(col, ptr, "use_servo_limit_x", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
subcol = uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_servo_limit_x")==1);
- uiItemR(subcol, ptr, "force_max_x", 0, NULL, 0);
- uiItemR(subcol, ptr, "force_min_x", 0, NULL, 0);
+ uiItemR(subcol, ptr, "force_max_x", 0, NULL, ICON_NULL);
+ uiItemR(subcol, ptr, "force_min_x", 0, NULL, ICON_NULL);
col = uiLayoutColumn(row, 0);
- uiItemR(col, ptr, "use_servo_limit_y", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(col, ptr, "use_servo_limit_y", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
subcol = uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_servo_limit_y")==1);
- uiItemR(subcol, ptr, "force_max_y", 0, NULL, 0);
- uiItemR(subcol, ptr, "force_min_y", 0, NULL, 0);
+ uiItemR(subcol, ptr, "force_max_y", 0, NULL, ICON_NULL);
+ uiItemR(subcol, ptr, "force_min_y", 0, NULL, ICON_NULL);
col = uiLayoutColumn(row, 0);
- uiItemR(col, ptr, "use_servo_limit_z", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(col, ptr, "use_servo_limit_z", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
subcol = uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_servo_limit_z")==1);
- uiItemR(subcol, ptr, "force_max_z", 0, NULL, 0);
- uiItemR(subcol, ptr, "force_min_z", 0, NULL, 0);
+ uiItemR(subcol, ptr, "force_max_z", 0, NULL, ICON_NULL);
+ uiItemR(subcol, ptr, "force_min_z", 0, NULL, ICON_NULL);
//XXXACTUATOR missing labels from original 2.49 ui (e.g. Servo, Min, Max, Fast)
//Layout designers willing to help on that, please compare with 2.49 ui
// (since the old code is going to be deleted ... soon)
col = uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "proportional_coefficient", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "integral_coefficient", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "derivate_coefficient", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "proportional_coefficient", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "integral_coefficient", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "derivate_coefficient", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
break;
}
}
static void draw_actuator_parent(uiLayout *layout, PointerRNA *ptr)
{
- uiLayout *row;
+ uiLayout *row, *subrow;
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
- uiItemR(layout, ptr, "object", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
- row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "use_compound", 0, NULL, 0);
- uiItemR(row, ptr, "use_ghost", 0, NULL, 0);
+ if (RNA_enum_get(ptr, "mode") == ACT_PARENT_SET) {
+ uiItemR(layout, ptr, "object", 0, NULL, ICON_NULL);
+
+ row = uiLayoutRow(layout, 0);
+ uiItemR(row, ptr, "use_compound", 0, NULL, ICON_NULL);
+ subrow= uiLayoutRow(row, 0);
+ uiLayoutSetActive(subrow, RNA_boolean_get(ptr, "use_compound")==1);
+ uiItemR(subrow, ptr, "use_ghost", 0, NULL, ICON_NULL);
+ }
}
static void draw_actuator_property(uiLayout *layout, PointerRNA *ptr)
@@ -4119,30 +4147,30 @@ static void draw_actuator_property(uiLayout *layout, PointerRNA *ptr)
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
- uiItemPointerR(layout, ptr, "property", &settings_ptr, "properties", NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
+ uiItemPointerR(layout, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
switch(RNA_enum_get(ptr, "mode"))
{
case ACT_PROP_TOGGLE:
break;
case ACT_PROP_ADD:
- uiItemR(layout, ptr, "value", 0, NULL, 0);
+ uiItemR(layout, ptr, "value", 0, NULL, ICON_NULL);
break;
case ACT_PROP_ASSIGN:
- uiItemR(layout, ptr, "value", 0, NULL, 0);
+ uiItemR(layout, ptr, "value", 0, NULL, ICON_NULL);
break;
case ACT_PROP_COPY:
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "object", 0, NULL, 0);
+ uiItemR(row, ptr, "object", 0, NULL, ICON_NULL);
if(ob_from){
RNA_pointer_create((ID *)ob_from, &RNA_GameObjectSettings, ob_from, &obj_settings_ptr);
- uiItemPointerR(row, ptr, "object_property", &obj_settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(row, ptr, "object_property", &obj_settings_ptr, "properties", NULL, ICON_NULL);
}else
{
subrow= uiLayoutRow(row, 0);
uiLayoutSetActive(subrow, 0);
- uiItemR(subrow, ptr, "object_property", 0, NULL, 0);
+ uiItemR(subrow, ptr, "object_property", 0, NULL, ICON_NULL);
}
break;
}
@@ -4159,72 +4187,72 @@ static void draw_actuator_random(uiLayout *layout, PointerRNA *ptr)
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "seed", 0, NULL, 0);
- uiItemR(row, ptr, "distribution", 0, NULL, 0);
+ uiItemR(row, ptr, "seed", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "distribution", 0, NULL, ICON_NULL);
row = uiLayoutRow(layout, 0);
- uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
row = uiLayoutRow(layout, 0);
switch (RNA_enum_get(ptr, "distribution")){
case ACT_RANDOM_BOOL_CONST:
- uiItemR(row, ptr, "use_always_true", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_always_true", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
break;
case ACT_RANDOM_BOOL_UNIFORM:
- uiItemL(row, "Choose between true and false, 50% chance each", 0);
+ uiItemL(row, "Choose between true and false, 50% chance each", ICON_NULL);
break;
case ACT_RANDOM_BOOL_BERNOUILLI:
- uiItemR(row, ptr, "chance", 0, NULL, 0);
+ uiItemR(row, ptr, "chance", 0, NULL, ICON_NULL);
break;
case ACT_RANDOM_INT_CONST:
- uiItemR(row, ptr, "int_value", 0, NULL, 0);
+ uiItemR(row, ptr, "int_value", 0, NULL, ICON_NULL);
break;
case ACT_RANDOM_INT_UNIFORM:
- uiItemR(row, ptr, "int_min", 0, NULL, 0);
- uiItemR(row, ptr, "int_max", 0, NULL, 0);
+ uiItemR(row, ptr, "int_min", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "int_max", 0, NULL, ICON_NULL);
break;
case ACT_RANDOM_INT_POISSON:
- uiItemR(row, ptr, "int_mean", 0, NULL, 0);
+ uiItemR(row, ptr, "int_mean", 0, NULL, ICON_NULL);
break;
case ACT_RANDOM_FLOAT_CONST:
- uiItemR(row, ptr, "float_value", 0, NULL, 0);
+ uiItemR(row, ptr, "float_value", 0, NULL, ICON_NULL);
break;
case ACT_RANDOM_FLOAT_UNIFORM:
- uiItemR(row, ptr, "float_min", 0, NULL, 0);
- uiItemR(row, ptr, "float_max", 0, NULL, 0);
+ uiItemR(row, ptr, "float_min", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "float_max", 0, NULL, ICON_NULL);
break;
case ACT_RANDOM_FLOAT_NORMAL:
- uiItemR(row, ptr, "float_mean", 0, NULL, 0);
- uiItemR(row, ptr, "standard_derivation", 0, NULL, 0);
+ uiItemR(row, ptr, "float_mean", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "standard_derivation", 0, NULL, ICON_NULL);
break;
case ACT_RANDOM_FLOAT_NEGATIVE_EXPONENTIAL:
- uiItemR(row, ptr, "half_life_time", 0, NULL, 0);
+ uiItemR(row, ptr, "half_life_time", 0, NULL, ICON_NULL);
break;
}
}
static void draw_actuator_scene(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "mode")) {
case ACT_SCENE_CAMERA:
- uiItemR(layout, ptr, "camera", 0, NULL, 0);
+ uiItemR(layout, ptr, "camera", 0, NULL, ICON_NULL);
break;
case ACT_SCENE_RESTART:
break;
default: // ACT_SCENE_SET|ACT_SCENE_ADD_FRONT|ACT_SCENE_ADD_BACK|ACT_SCENE_REMOVE|ACT_SCENE_SUSPEND|ACT_SCENE_RESUME
- uiItemR(layout, ptr, "scene", 0, NULL, 0);
+ uiItemR(layout, ptr, "scene", 0, NULL, ICON_NULL);
break;
}
}
@@ -4236,35 +4264,35 @@ static void draw_actuator_shape_action(uiLayout *layout, PointerRNA *ptr)
uiLayout *row;
if(ob->type != OB_MESH){
- uiItemL(layout, "Actuator only available for mesh objects", 0);
+ uiItemL(layout, "Actuator only available for mesh objects", ICON_NULL);
return;
}
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "mode", 0, "", 0);
- uiItemR(row, ptr, "action", 0, NULL, 0);
- uiItemR(row, ptr, "use_continue_last_frame", 0, NULL, 0);
+ uiItemR(row, ptr, "mode", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "action", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_continue_last_frame", 0, NULL, ICON_NULL);
row= uiLayoutRow(layout, 0);
if((RNA_enum_get(ptr, "mode") == ACT_ACTION_FROM_PROP))
- uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
else {
- uiItemR(row, ptr, "frame_start", 0, NULL, 0);
- uiItemR(row, ptr, "frame_end", 0, NULL, 0);
+ uiItemR(row, ptr, "frame_start", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "frame_end", 0, NULL, ICON_NULL);
}
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "frame_blend_in", 0, NULL, 0);
- uiItemR(row, ptr, "priority", 0, NULL, 0);
+ uiItemR(row, ptr, "frame_blend_in", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "priority", 0, NULL, ICON_NULL);
row= uiLayoutRow(layout, 0);
- uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, ICON_NULL);
#ifdef __NLA_ACTION_BY_MOTION_ACTUATOR
- uiItemR(row, "stride_length", 0, NULL, 0);
+ uiItemR(row, "stride_length", 0, NULL, ICON_NULL);
#endif
}
@@ -4275,35 +4303,35 @@ static void draw_actuator_sound(uiLayout *layout, PointerRNA *ptr, bContext *C)
uiTemplateID(layout, C, ptr, "sound", NULL, "SOUND_OT_open", NULL);
if (!RNA_pointer_get(ptr, "sound").data)
{
- uiItemL(layout, "Select a sound from the list or load a new one", 0);
+ uiItemL(layout, "Select a sound from the list or load a new one", ICON_NULL);
return;
}
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "volume", 0, NULL, 0);
- uiItemR(row, ptr, "pitch", 0, NULL, 0);
+ uiItemR(row, ptr, "volume", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "pitch", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "use_sound_3d", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_sound_3d", 0, NULL, ICON_NULL);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_sound_3d")==1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "gain_3d_min", 0, NULL, 0);
- uiItemR(row, ptr, "gain_3d_max", 0, NULL, 0);
+ uiItemR(row, ptr, "gain_3d_min", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "gain_3d_max", 0, NULL, ICON_NULL);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "distance_3d_reference", 0, NULL, 0);
- uiItemR(row, ptr, "distance_3d_max", 0, NULL, 0);
+ uiItemR(row, ptr, "distance_3d_reference", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "distance_3d_max", 0, NULL, ICON_NULL);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "rolloff_factor_3d", 0, NULL, 0);
- uiItemR(row, ptr, "cone_outer_gain_3d", 0, NULL, 0);
+ uiItemR(row, ptr, "rolloff_factor_3d", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "cone_outer_gain_3d", 0, NULL, ICON_NULL);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "cone_outer_angle_3d", 0, NULL, 0);
- uiItemR(row, ptr, "cone_inner_angle_3d", 0, NULL, 0);
+ uiItemR(row, ptr, "cone_outer_angle_3d", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "cone_inner_angle_3d", 0, NULL, ICON_NULL);
}
static void draw_actuator_state(uiLayout *layout, PointerRNA *ptr)
@@ -4314,7 +4342,7 @@ static void draw_actuator_state(uiLayout *layout, PointerRNA *ptr)
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
split = uiLayoutSplit(layout, 0.35, 0);
- uiItemR(split, ptr, "operation", 0, NULL, 0);
+ uiItemR(split, ptr, "operation", 0, NULL, ICON_NULL);
uiTemplateLayers(split, ptr, "states", &settings_ptr, "used_states", 0);
}
@@ -4324,9 +4352,9 @@ static void draw_actuator_visibility(uiLayout *layout, PointerRNA *ptr)
uiLayout *row;
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "use_visible", 0, NULL, 0);
- uiItemR(row, ptr, "use_occlusion", 0, NULL, 0);
- uiItemR(row, ptr, "apply_to_children", 0, NULL, 0);
+ uiItemR(row, ptr, "use_visible", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_occlusion", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "apply_to_children", 0, NULL, ICON_NULL);
}
static void draw_actuator_steering(uiLayout *layout, PointerRNA *ptr)
@@ -4344,7 +4372,7 @@ static void draw_actuator_steering(uiLayout *layout, PointerRNA *ptr)
row = uiLayoutRow(layout, 0);
uiItemR(row, ptr, "acceleration", 0, NULL, 0);
uiItemR(row, ptr, "turn_speed", 0, NULL, 0);
-
+
row = uiLayoutRow(layout, 0);
col = uiLayoutColumn(row, 0);
uiItemR(col, ptr, "facing", 0, NULL, 0);
@@ -4371,7 +4399,6 @@ static void draw_actuator_steering(uiLayout *layout, PointerRNA *ptr)
uiItemR(row, ptr, "show_visualization", 0, NULL, 0);
}
-
void draw_brick_actuator(uiLayout *layout, PointerRNA *ptr, bContext *C)
{
uiLayout *box;
@@ -4462,7 +4489,7 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
RNA_pointer_create(NULL, &RNA_SpaceLogicEditor, slogic, &logic_ptr);
idar= get_selected_and_linked_obs(C, &count, slogic->scaflag);
- sprintf(name, "buttonswin %p", ar);
+ sprintf(name, "buttonswin %p", (void *)ar);
block= uiBeginBlock(C, ar, name, UI_EMBOSS);
uiBlockSetHandleFunc(block, do_logic_buts, NULL);
@@ -4515,9 +4542,9 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
uiDefBlockBut(block, controller_menu, NULL, "Controllers", xco-10, yco, 300, UI_UNIT_Y, ""); /* replace this with uiLayout stuff later */
- uiItemR(row, &logic_ptr, "show_controllers_selected_objects", 0, "Sel", 0);
- uiItemR(row, &logic_ptr, "show_controllers_active_object", 0, "Act", 0);
- uiItemR(row, &logic_ptr, "show_controllers_linked_controller", 0, "Link", 0);
+ uiItemR(row, &logic_ptr, "show_controllers_selected_objects", 0, "Sel", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_controllers_active_object", 0, "Act", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_controllers_linked_controller", 0, "Link", ICON_NULL);
for(a=0; a<count; a++) {
bController *cont;
@@ -4540,7 +4567,7 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
row = uiLayoutRow(split, 1);
uiDefButBitS(block, TOG, OB_SHOWCONT, B_REDR, ob->id.name+2,(short)(xco-10), yco, (short)(width-30), UI_UNIT_Y, &ob->scaflag, 0, 31, 0, 0, "Object name, click to show/hide controllers");
if (ob == act_ob)
- uiItemMenuEnumO(row, "LOGIC_OT_controller_add", "type", "Add Controller", 0);
+ uiItemMenuEnumO(row, "LOGIC_OT_controller_add", "type", "Add Controller", ICON_NULL);
if (RNA_boolean_get(&settings_ptr, "show_state_panel")) {
@@ -4548,8 +4575,8 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
split= uiLayoutSplit(box, 0.2, 0);
col= uiLayoutColumn(split, 0);
- uiItemL(col, "Visible", 0);
- uiItemL(col, "Initial", 0);
+ uiItemL(col, "Visible", ICON_NULL);
+ uiItemL(col, "Initial", ICON_NULL);
subsplit= uiLayoutSplit(split, 0.85, 0);
col= uiLayoutColumn(subsplit, 0);
@@ -4560,8 +4587,8 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
uiTemplateLayers(row, &settings_ptr, "states_initial", &settings_ptr, "used_states", 0);
col= uiLayoutColumn(subsplit, 0);
- uiItemR(col, &settings_ptr, "use_all_states", UI_ITEM_R_TOGGLE, NULL, 0);
- uiItemR(col, &settings_ptr, "show_debug_state", 0, "", 0);
+ uiItemR(col, &settings_ptr, "use_all_states", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(col, &settings_ptr, "show_debug_state", 0, "", ICON_NULL);
}
/* End of Drawing the Controller Header common to all Selected Objects */
@@ -4618,10 +4645,10 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
uiDefBlockBut(block, sensor_menu, NULL, "Sensors", xco-10, yco, 300, UI_UNIT_Y, ""); /* replace this with uiLayout stuff later */
- uiItemR(row, &logic_ptr, "show_sensors_selected_objects", 0, "Sel", 0);
- uiItemR(row, &logic_ptr, "show_sensors_active_object", 0, "Act", 0);
- uiItemR(row, &logic_ptr, "show_sensors_linked_controller", 0, "Link", 0);
- uiItemR(row, &logic_ptr, "show_sensors_active_states", 0, "State", 0);
+ uiItemR(row, &logic_ptr, "show_sensors_selected_objects", 0, "Sel", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_sensors_active_object", 0, "Act", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_sensors_linked_controller", 0, "Link", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_sensors_active_states", 0, "State", ICON_NULL);
for(a=0; a<count; a++) {
bSensor *sens;
@@ -4635,7 +4662,7 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
row = uiLayoutRow(layout, 1);
uiDefButBitS(block, TOG, OB_SHOWSENS, B_REDR, ob->id.name+2,(short)(xco-10), yco, (short)(width-30), UI_UNIT_Y, &ob->scaflag, 0, 31, 0, 0, "Object name, click to show/hide sensors");
if (ob == act_ob)
- uiItemMenuEnumO(row, "LOGIC_OT_sensor_add", "type", "Add Sensor", 0);
+ uiItemMenuEnumO(row, "LOGIC_OT_sensor_add", "type", "Add Sensor", ICON_NULL);
if ((ob->scaflag & OB_SHOWSENS) == 0) continue;
@@ -4684,10 +4711,10 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
uiDefBlockBut(block, actuator_menu, NULL, "Actuators", xco-10, yco, 300, UI_UNIT_Y, ""); /* replace this with uiLayout stuff later */
- uiItemR(row, &logic_ptr, "show_actuators_selected_objects", 0, "Sel", 0);
- uiItemR(row, &logic_ptr, "show_actuators_active_object", 0, "Act", 0);
- uiItemR(row, &logic_ptr, "show_actuators_linked_controller", 0, "Link", 0);
- uiItemR(row, &logic_ptr, "show_actuators_active_states", 0, "State", 0);
+ uiItemR(row, &logic_ptr, "show_actuators_selected_objects", 0, "Sel", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_actuators_active_object", 0, "Act", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_actuators_linked_controller", 0, "Link", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_actuators_active_states", 0, "State", ICON_NULL);
for(a=0; a<count; a++) {
bActuator *act;
@@ -4701,7 +4728,7 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
row = uiLayoutRow(layout, 1);
uiDefButBitS(block, TOG, OB_SHOWACT, B_REDR, ob->id.name+2,(short)(xco-10), yco, (short)(width-30), UI_UNIT_Y, &ob->scaflag, 0, 31, 0, 0, "Object name, click to show/hide actuators");
if (ob == act_ob)
- uiItemMenuEnumO(row, "LOGIC_OT_actuator_add", "type", "Add Actuator", 0);
+ uiItemMenuEnumO(row, "LOGIC_OT_actuator_add", "type", "Add Actuator", ICON_NULL);
if ((ob->scaflag & OB_SHOWACT) == 0) continue;
@@ -4780,7 +4807,7 @@ void logic_buttons(bContext *C, ARegion *ar)
if(ob==NULL) return;
// uiSetButLock(object_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
- sprintf(name, "buttonswin %p", ar);
+ sprintf(name, "buttonswin %p", (void *)ar);
block= uiBeginBlock(C, ar, name, UI_EMBOSS);
uiBlockSetHandleFunc(block, do_logic_buts, NULL);
@@ -4817,8 +4844,6 @@ void logic_buttons(bContext *C, ARegion *ar)
uiDefButBitS(block, TOG, BUTS_CONT_LINK, B_REDR, "Link", xco+110+2*(width-100)/3, yco+35, (width-100)/3, UI_UNIT_Y, &slogic->scaflag, 0, 0, 0, 0, "Show linked Objects to Sensor/Actuator");
uiBlockEndAlign(block);
- ob= CTX_data_active_object(C);
-
for(a=0; a<count; a++) {
unsigned int controller_state_mask = 0; /* store a bitmask for states that are used */
@@ -5001,7 +5026,7 @@ void logic_buttons(bContext *C, ARegion *ar)
uiButSetFunc(but, make_unique_prop_names_cb, sens->name, (void*) 0);
sens->otype= sens->type;
- yco= draw_sensorbuttons(ob, sens, block, xco, yco, width,ob->id.name);
+ yco= draw_sensorbuttons(ob, sens, block, xco, yco, width);
if(yco-6 < ycoo) ycoo= (yco+ycoo-20)/2;
}
else {
@@ -5085,9 +5110,9 @@ void logic_buttons(bContext *C, ARegion *ar)
else {
set_col_actuator(act->type, 1);
glRecti((short)(xco+22), yco, (short)(xco+width-22),(short)(yco+19));
- but= uiDefBut(block, LABEL, 0, actuator_name(act->type), (short)(xco+22), yco, 90, UI_UNIT_Y, act, 0, 0, 0, 0, "Actuator type");
+ /* but= */ uiDefBut(block, LABEL, 0, actuator_name(act->type), (short)(xco+22), yco, 90, UI_UNIT_Y, act, 0, 0, 0, 0, "Actuator type");
// uiButSetFunc(but, old_sca_move_actuator, act, NULL);
- but= uiDefBut(block, LABEL, 0, act->name, (short)(xco+112), yco, (short)(width-(pin?156:134)), UI_UNIT_Y, act, 0, 0, 0, 0, "Actuator name");
+ /* but= */ uiDefBut(block, LABEL, 0, act->name, (short)(xco+112), yco, (short)(width-(pin?156:134)), UI_UNIT_Y, act, 0, 0, 0, 0, "Actuator name");
// uiButSetFunc(but, old_sca_move_actuator, act, NULL);
uiBlockBeginAlign(block);
diff --git a/source/blender/editors/space_logic/space_logic.c b/source/blender/editors/space_logic/space_logic.c
index 01af324334b..a945af502a0 100644
--- a/source/blender/editors/space_logic/space_logic.c
+++ b/source/blender/editors/space_logic/space_logic.c
@@ -34,6 +34,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -82,7 +83,7 @@ ARegion *logic_has_buttons_region(ScrArea *sa)
/* ******************** default callbacks for image space ***************** */
-static SpaceLink *logic_new(const bContext *C)
+static SpaceLink *logic_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceLogic *slogic;
@@ -145,7 +146,7 @@ static SpaceLink *logic_new(const bContext *C)
}
/* not spacelink itself */
-static void logic_free(SpaceLink *sl)
+static void logic_free(SpaceLink *UNUSED(sl))
{
// Spacelogic *slogic= (SpaceLogic*) sl;
@@ -156,7 +157,7 @@ static void logic_free(SpaceLink *sl)
/* spacetype; init callback */
-static void logic_init(struct wmWindowManager *wm, ScrArea *sa)
+static void logic_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -183,7 +184,7 @@ void logic_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_menu(keymap, "LOGIC_MT_logicbricks_add", AKEY, KM_PRESS, KM_SHIFT, 0);
}
-static void logic_refresh(const bContext *C, ScrArea *sa)
+static void logic_refresh(const bContext *UNUSED(C), ScrArea *UNUSED(sa))
{
// SpaceLogic *slogic= CTX_wm_space_logic(C);
// Object *obedit= CTX_data_edit_object(C);
@@ -217,11 +218,9 @@ static void logic_listener(ARegion *ar, wmNotifier *wmn)
}
}
-static int logic_context(const bContext *C, const char *member, bContextDataResult *result)
+static int logic_context(const bContext *UNUSED(C), const char *UNUSED(member), bContextDataResult *UNUSED(result))
{
// SpaceLogic *slogic= CTX_wm_space_logic(C);
-
-
return 0;
}
@@ -251,7 +250,7 @@ static void logic_main_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
logic_buttons((bContext *)C, ar);
@@ -287,7 +286,7 @@ static void logic_buttons_area_draw(const bContext *C, ARegion *ar)
/************************* header region **************************/
/* add handlers, stuff you only do once or on area/region changes */
-static void logic_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void logic_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
diff --git a/source/blender/editors/space_nla/CMakeLists.txt b/source/blender/editors/space_nla/CMakeLists.txt
index 6bb656cba8c..3f194bc0438 100644
--- a/source/blender/editors/space_nla/CMakeLists.txt
+++ b/source/blender/editors/space_nla/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -31,4 +29,16 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_space_nla "${SRC}" "${INC}")
+set(SRC
+ nla_buttons.c
+ nla_channels.c
+ nla_draw.c
+ nla_edit.c
+ nla_ops.c
+ nla_select.c
+ space_nla.c
+
+ nla_intern.h
+)
+
+blender_add_lib(bf_editor_space_nla "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_nla/Makefile b/source/blender/editors/space_nla/Makefile
deleted file mode 100644
index fd940081c16..00000000000
--- a/source/blender/editors/space_nla/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_nla
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_nla/nla_buttons.c b/source/blender/editors/space_nla/nla_buttons.c
index a728cc900c2..a7e16d056d1 100644
--- a/source/blender/editors/space_nla/nla_buttons.c
+++ b/source/blender/editors/space_nla/nla_buttons.c
@@ -33,6 +33,8 @@
#include "DNA_anim_types.h"
+#include "BLI_utildefines.h"
+
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
@@ -66,7 +68,7 @@
/* -------------- */
-static void do_nla_region_buttons(bContext *C, void *arg, int event)
+static void do_nla_region_buttons(bContext *C, void *UNUSED(arg), int event)
{
//Scene *scene= CTX_data_scene(C);
@@ -172,25 +174,25 @@ static int nla_panel_poll(const bContext *C, PanelType *pt)
}
#endif
-static int nla_animdata_panel_poll(const bContext *C, PanelType *pt)
+static int nla_animdata_panel_poll(const bContext *C, PanelType *UNUSED(pt))
{
PointerRNA ptr;
return (nla_panel_context(C, &ptr, NULL, NULL) && (ptr.data != NULL));
}
-static int nla_track_panel_poll(const bContext *C, PanelType *pt)
+static int nla_track_panel_poll(const bContext *C, PanelType *UNUSED(pt))
{
PointerRNA ptr;
return (nla_panel_context(C, NULL, &ptr, NULL) && (ptr.data != NULL));
}
-static int nla_strip_panel_poll(const bContext *C, PanelType *pt)
+static int nla_strip_panel_poll(const bContext *C, PanelType *UNUSED(pt))
{
PointerRNA ptr;
return (nla_panel_context(C, NULL, NULL, &ptr) && (ptr.data != NULL));
}
-static int nla_strip_actclip_panel_poll(const bContext *C, PanelType *pt)
+static int nla_strip_actclip_panel_poll(const bContext *C, PanelType *UNUSED(pt))
{
PointerRNA ptr;
NlaStrip *strip;
@@ -210,7 +212,7 @@ static int nla_strip_actclip_panel_poll(const bContext *C, PanelType *pt)
static void nla_panel_animdata (const bContext *C, Panel *pa)
{
PointerRNA adt_ptr;
- AnimData *adt;
+ /* AnimData *adt; */
uiLayout *layout= pa->layout;
uiLayout *row;
uiBlock *block;
@@ -218,7 +220,8 @@ static void nla_panel_animdata (const bContext *C, Panel *pa)
/* check context and also validity of pointer */
if (!nla_panel_context(C, &adt_ptr, NULL, NULL))
return;
- adt= adt_ptr.data;
+
+ /* adt= adt_ptr.data; */
block= uiLayoutGetBlock(layout);
uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL);
@@ -230,15 +233,15 @@ static void nla_panel_animdata (const bContext *C, Panel *pa)
/* extrapolation */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &adt_ptr, "action_extrapolation", 0, NULL, 0);
+ uiItemR(row, &adt_ptr, "action_extrapolation", 0, NULL, ICON_NULL);
/* blending */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &adt_ptr, "action_blend_type", 0, NULL, 0);
+ uiItemR(row, &adt_ptr, "action_blend_type", 0, NULL, ICON_NULL);
/* influence */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &adt_ptr, "action_influence", 0, NULL, 0);
+ uiItemR(row, &adt_ptr, "action_influence", 0, NULL, ICON_NULL);
}
/* active NLA-Track */
@@ -279,40 +282,40 @@ static void nla_panel_properties(const bContext *C, Panel *pa)
/* strip type */
row= uiLayoutColumn(layout, 1);
uiItemR(row, &strip_ptr, "name", 0, NULL, ICON_NLA); // XXX icon?
- uiItemR(row, &strip_ptr, "type", 0, NULL, 0);
+ uiItemR(row, &strip_ptr, "type", 0, NULL, ICON_NULL);
/* strip extents */
column= uiLayoutColumn(layout, 1);
- uiItemL(column, "Strip Extents:", 0);
- uiItemR(column, &strip_ptr, "frame_start", 0, NULL, 0);
- uiItemR(column, &strip_ptr, "frame_end", 0, NULL, 0);
+ uiItemL(column, "Strip Extents:", ICON_NULL);
+ uiItemR(column, &strip_ptr, "frame_start", 0, NULL, ICON_NULL);
+ uiItemR(column, &strip_ptr, "frame_end", 0, NULL, ICON_NULL);
/* extrapolation */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &strip_ptr, "extrapolation", 0, NULL, 0);
+ uiItemR(row, &strip_ptr, "extrapolation", 0, NULL, ICON_NULL);
/* blending */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &strip_ptr, "blend_type", 0, NULL, 0);
+ uiItemR(row, &strip_ptr, "blend_type", 0, NULL, ICON_NULL);
/* blend in/out + autoblending
* - blend in/out can only be set when autoblending is off
*/
column= uiLayoutColumn(layout, 1);
uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "use_animated_influence")==0);
- uiItemR(column, &strip_ptr, "use_auto_blend", 0, NULL, 0); // XXX as toggle?
+ uiItemR(column, &strip_ptr, "use_auto_blend", 0, NULL, ICON_NULL); // XXX as toggle?
subcol= uiLayoutColumn(column, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(&strip_ptr, "use_auto_blend")==0);
- uiItemR(subcol, &strip_ptr, "blend_in", 0, NULL, 0);
- uiItemR(subcol, &strip_ptr, "blend_out", 0, NULL, 0);
+ uiItemR(subcol, &strip_ptr, "blend_in", 0, NULL, ICON_NULL);
+ uiItemR(subcol, &strip_ptr, "blend_out", 0, NULL, ICON_NULL);
/* settings */
column= uiLayoutColumn(layout, 1);
uiLayoutSetActive(column, !(RNA_boolean_get(&strip_ptr, "use_animated_influence") || RNA_boolean_get(&strip_ptr, "use_animated_time")));
- uiItemL(column, "Playback Settings:", 0);
- uiItemR(column, &strip_ptr, "mute", 0, NULL, 0);
- uiItemR(column, &strip_ptr, "use_reverse", 0, NULL, 0);
+ uiItemL(column, "Playback Settings:", ICON_NULL);
+ uiItemR(column, &strip_ptr, "mute", 0, NULL, ICON_NULL);
+ uiItemR(column, &strip_ptr, "use_reverse", 0, NULL, ICON_NULL);
}
@@ -339,17 +342,17 @@ static void nla_panel_actclip(const bContext *C, Panel *pa)
/* action extents */
// XXX custom names were used here (to avoid the prefixes)... probably not necessary in future?
column= uiLayoutColumn(layout, 1);
- uiItemL(column, "Action Extents:", 0);
- uiItemR(column, &strip_ptr, "action_frame_start", 0, "Start Frame", 0);
- uiItemR(column, &strip_ptr, "action_frame_end", 0, "End Frame", 0);
- uiItemO(column, NULL, 0, "NLA_OT_action_sync_length");
+ uiItemL(column, "Action Extents:", ICON_NULL);
+ uiItemR(column, &strip_ptr, "action_frame_start", 0, "Start Frame", ICON_NULL);
+ uiItemR(column, &strip_ptr, "action_frame_end", 0, "End Frame", ICON_NULL);
+ uiItemO(column, NULL, ICON_NULL, "NLA_OT_action_sync_length");
/* action usage */
column= uiLayoutColumn(layout, 1);
uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "use_animated_time")==0);
- uiItemL(column, "Playback Settings:", 0);
- uiItemR(column, &strip_ptr, "scale", 0, NULL, 0);
- uiItemR(column, &strip_ptr, "repeat", 0, NULL, 0);
+ uiItemL(column, "Playback Settings:", ICON_NULL);
+ uiItemR(column, &strip_ptr, "scale", 0, NULL, ICON_NULL);
+ uiItemR(column, &strip_ptr, "repeat", 0, NULL, ICON_NULL);
}
/* evaluation settings for active NLA-Strip */
@@ -368,22 +371,22 @@ static void nla_panel_evaluation(const bContext *C, Panel *pa)
uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL);
column= uiLayoutColumn(layout, 1);
- uiItemR(column, &strip_ptr, "use_animated_influence", 0, NULL, 0);
+ uiItemR(column, &strip_ptr, "use_animated_influence", 0, NULL, ICON_NULL);
subcolumn= uiLayoutColumn(column, 1);
uiLayoutSetEnabled(subcolumn, RNA_boolean_get(&strip_ptr, "use_animated_influence"));
- uiItemR(subcolumn, &strip_ptr, "influence", 0, NULL, 0);
+ uiItemR(subcolumn, &strip_ptr, "influence", 0, NULL, ICON_NULL);
column= uiLayoutColumn(layout, 1);
subrow= uiLayoutRow(column, 0);
- uiItemR(subrow, &strip_ptr, "use_animated_time", 0, NULL, 0);
- uiItemR(subrow, &strip_ptr, "use_animated_time_cyclic", 0, NULL, 0);
+ uiItemR(subrow, &strip_ptr, "use_animated_time", 0, NULL, ICON_NULL);
+ uiItemR(subrow, &strip_ptr, "use_animated_time_cyclic", 0, NULL, ICON_NULL);
subcolumn= uiLayoutColumn(column, 1);
subrow= uiLayoutRow(subcolumn, 0);
uiLayoutSetEnabled(subrow, RNA_boolean_get(&strip_ptr, "use_animated_time"));
- uiItemR(subcolumn, &strip_ptr, "strip_time", 0, NULL, 0);
+ uiItemR(subcolumn, &strip_ptr, "strip_time", 0, NULL, ICON_NULL);
}
/* F-Modifiers for active NLA-Strip */
@@ -477,7 +480,7 @@ void nla_buttons_register(ARegionType *art)
BLI_addtail(&art->paneltypes, pt);
}
-static int nla_properties(bContext *C, wmOperator *op)
+static int nla_properties(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= nla_has_buttons_region(sa);
@@ -492,6 +495,7 @@ void NLA_OT_properties(wmOperatorType *ot)
{
ot->name= "Properties";
ot->idname= "NLA_OT_properties";
+ ot->description= "Toggle display properties panel";
ot->exec= nla_properties;
ot->poll= ED_operator_nla_active;
diff --git a/source/blender/editors/space_nla/nla_channels.c b/source/blender/editors/space_nla/nla_channels.c
index b00cba676d0..006e390be2b 100644
--- a/source/blender/editors/space_nla/nla_channels.c
+++ b/source/blender/editors/space_nla/nla_channels.c
@@ -35,10 +35,10 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_animsys.h"
#include "BKE_nla.h"
@@ -173,6 +173,7 @@ static int mouse_nla_channels (bAnimContext *ac, float x, int channel_index, sho
case ANIMTYPE_DSARM:
case ANIMTYPE_DSMESH:
case ANIMTYPE_DSTEX:
+ case ANIMTYPE_DSLAT:
{
/* sanity checking... */
if (ale->adt) {
@@ -295,7 +296,6 @@ static int mouse_nla_channels (bAnimContext *ac, float x, int channel_index, sho
static int nlachannels_mouseclick_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
bAnimContext ac;
- Scene *scene;
ARegion *ar;
View2D *v2d;
int mval[2], channel_index;
@@ -308,7 +308,6 @@ static int nlachannels_mouseclick_invoke(bContext *C, wmOperator *op, wmEvent *e
return OPERATOR_CANCELLED;
/* get useful pointers from animation context data */
- scene= ac.scene;
ar= ac.ar;
v2d= &ar->v2d;
@@ -342,8 +341,9 @@ static int nlachannels_mouseclick_invoke(bContext *C, wmOperator *op, wmEvent *e
void NLA_OT_channels_click (wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Mouse Click on Channels";
+ ot->name= "Mouse Click on NLA Channels";
ot->idname= "NLA_OT_channels_click";
+ ot->description= "Handle clicks to select NLA channels";
/* api callbacks */
ot->invoke= nlachannels_mouseclick_invoke;
@@ -433,7 +433,7 @@ void NLA_OT_tracks_add (wmOperatorType *ot)
/* ******************** Delete Tracks Operator ***************************** */
/* Delete selected NLA Tracks */
-static int nlaedit_delete_tracks_exec (bContext *C, wmOperator *op)
+static int nlaedit_delete_tracks_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -455,6 +455,12 @@ static int nlaedit_delete_tracks_exec (bContext *C, wmOperator *op)
NlaTrack *nlt= (NlaTrack *)ale->data;
AnimData *adt= ale->adt;
+ /* if track is currently 'solo', then AnimData should have its
+ * 'has solo' flag disabled
+ */
+ if (nlt->flag & NLATRACK_SOLO)
+ adt->flag &= ~ADT_NLA_SOLO_TRACK;
+
/* call delete on this track - deletes all strips too */
free_nlatrack(&adt->nla_tracks, nlt);
}
diff --git a/source/blender/editors/space_nla/nla_draw.c b/source/blender/editors/space_nla/nla_draw.c
index ef9c46c8042..43a64f07de5 100644
--- a/source/blender/editors/space_nla/nla_draw.c
+++ b/source/blender/editors/space_nla/nla_draw.c
@@ -37,11 +37,11 @@
#include "DNA_space_types.h"
#include "DNA_windowmanager_types.h"
-
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "BKE_fcurve.h"
#include "BKE_nla.h"
@@ -141,7 +141,7 @@ static void nla_action_draw_keyframes (AnimData *adt, bAction *act, View2D *v2d,
* - size is 3.0f which is smaller than the editable keyframes, so that there is a distinction
*/
for (ak= keys.first; ak; ak= ak->next)
- draw_keyframe_shape(ak->cfra, y, xscale, 3.0f, 0, ak->key_type, KEYFRAME_SHAPE_FRAME);
+ draw_keyframe_shape(ak->cfra, y, xscale, 3.0f, 0, ak->key_type, KEYFRAME_SHAPE_FRAME, 1.0f);
/* free icons */
BLI_dlrbTree_free(&keys);
@@ -171,7 +171,7 @@ static void nla_strip_get_color_inside (AnimData *adt, NlaStrip *strip, float co
}
else if (strip->type == NLASTRIP_TYPE_META) {
/* Meta Clip */
- // TODO: should temporary metas get different colours too?
+ // TODO: should temporary metas get different colors too?
if (strip->flag & NLASTRIP_FLAG_SELECT) {
/* selected - use a bold purple color */
// FIXME: hardcoded temp-hack colors
@@ -219,7 +219,7 @@ static void nla_strip_get_color_inside (AnimData *adt, NlaStrip *strip, float co
}
/* helper call for drawing influence/time control curves for a given NLA-strip */
-static void nla_draw_strip_curves (NlaStrip *strip, View2D *v2d, float yminc, float ymaxc)
+static void nla_draw_strip_curves (NlaStrip *strip, float yminc, float ymaxc)
{
const float yheight = ymaxc - yminc;
@@ -272,7 +272,7 @@ static void nla_draw_strip_curves (NlaStrip *strip, View2D *v2d, float yminc, fl
}
/* time -------------------------- */
- // XXX do we want to draw this curve? in a different colour too?
+ // XXX do we want to draw this curve? in a different color too?
/* turn off AA'd lines */
glDisable(GL_LINE_SMOOTH);
@@ -280,7 +280,7 @@ static void nla_draw_strip_curves (NlaStrip *strip, View2D *v2d, float yminc, fl
}
/* main call for drawing a single NLA-strip */
-static void nla_draw_strip (SpaceNla *snla, AnimData *adt, NlaTrack *nlt, NlaStrip *strip, View2D *v2d, float yminc, float ymaxc)
+static void nla_draw_strip (SpaceNla *snla, AnimData *adt, NlaTrack *UNUSED(nlt), NlaStrip *strip, View2D *v2d, float yminc, float ymaxc)
{
float color[3];
@@ -351,7 +351,7 @@ static void nla_draw_strip (SpaceNla *snla, AnimData *adt, NlaTrack *nlt, NlaStr
* - only if user hasn't hidden them...
*/
if ((snla->flag & SNLA_NOSTRIPCURVES) == 0)
- nla_draw_strip_curves(strip, v2d, yminc, ymaxc);
+ nla_draw_strip_curves(strip, yminc, ymaxc);
/* draw strip outline
* - color used here is to indicate active vs non-active
@@ -414,9 +414,10 @@ static void nla_draw_strip (SpaceNla *snla, AnimData *adt, NlaTrack *nlt, NlaStr
}
/* add the relevant text to the cache of text-strings to draw in pixelspace */
-static void nla_draw_strip_text (NlaTrack *nlt, NlaStrip *strip, int index, View2D *v2d, float yminc, float ymaxc)
+static void nla_draw_strip_text (NlaTrack *UNUSED(nlt), NlaStrip *strip, int UNUSED(index), View2D *v2d, float yminc, float ymaxc)
{
char str[256], dir[3];
+ char col[4];
rctf rect;
/* 'dir' - direction that strip is played in */
@@ -431,12 +432,15 @@ static void nla_draw_strip_text (NlaTrack *nlt, NlaStrip *strip, int index, View
else
sprintf(str, "%s | %.2f %s %.2f", strip->name, strip->start, dir, strip->end);
- /* set text colour - if colours (see above) are light, draw black text, otherwise draw white */
- if (strip->flag & (NLASTRIP_FLAG_ACTIVE|NLASTRIP_FLAG_SELECT|NLASTRIP_FLAG_TWEAKUSER))
- glColor3f(0.0f, 0.0f, 0.0f);
- else
- glColor3f(1.0f, 1.0f, 1.0f);
-
+ /* set text color - if colors (see above) are light, draw black text, otherwise draw white */
+ if (strip->flag & (NLASTRIP_FLAG_ACTIVE|NLASTRIP_FLAG_SELECT|NLASTRIP_FLAG_TWEAKUSER)) {
+ col[0]= col[1]= col[2]= 0;
+ }
+ else {
+ col[0]= col[1]= col[2]= 255;
+ }
+ col[3]= 1.0;
+
/* set bounding-box for text
* - padding of 2 'units' on either side
*/
@@ -447,7 +451,8 @@ static void nla_draw_strip_text (NlaTrack *nlt, NlaStrip *strip, int index, View
rect.ymax= ymaxc;
/* add this string to the cache of texts to draw*/
- UI_view2d_text_cache_rectf(v2d, &rect, str);
+
+ UI_view2d_text_cache_rectf(v2d, &rect, str, col);
}
/* ---------------------- */
@@ -477,8 +482,6 @@ void draw_nla_main_data (bAnimContext *ac, SpaceNla *snla, ARegion *ar)
* (NOTE: this is ok here, the configuration is pretty straightforward)
*/
v2d->tot.ymin= (float)(-height);
- /* need to do a view-sync here, so that the strips area doesn't jump around */
- UI_view2d_sync(NULL, ac->sa, v2d, V2D_VIEWSYNC_AREA_VERTICAL);
/* loop through channels, and set up drawing depending on their type */
y= (float)(-NLACHANNEL_HEIGHT);
@@ -812,7 +815,7 @@ static void draw_nla_channel_list_gl (bAnimContext *ac, ListBase *anim_data, Vie
}
}
-void draw_nla_channel_list (bContext *C, bAnimContext *ac, SpaceNla *snla, ARegion *ar)
+void draw_nla_channel_list (bContext *C, bAnimContext *ac, ARegion *ar)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
@@ -837,6 +840,8 @@ void draw_nla_channel_list (bContext *C, bAnimContext *ac, SpaceNla *snla, ARegi
* (NOTE: this is ok here, the configuration is pretty straightforward)
*/
v2d->tot.ymin= (float)(-height);
+ /* need to do a view-sync here, so that the keys area doesn't jump around (it must copy this) */
+ UI_view2d_sync(NULL, ac->sa, v2d, V2D_LOCK_COPY);
/* draw channels */
{ /* first pass: backdrops + oldstyle drawing */
diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c
index 247987cda9f..b70a6339fed 100644
--- a/source/blender/editors/space_nla/nla_edit.c
+++ b/source/blender/editors/space_nla/nla_edit.c
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_action.h"
#include "BKE_fcurve.h"
@@ -457,7 +458,7 @@ void NLA_OT_transition_add (wmOperatorType *ot)
/* Add new meta-strips incorporating the selected strips */
/* add the specified action as new strip */
-static int nlaedit_add_meta_exec (bContext *C, wmOperator *op)
+static int nlaedit_add_meta_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -518,7 +519,7 @@ void NLA_OT_meta_add (wmOperatorType *ot)
/* ******************** Remove Meta-Strip Operator ***************************** */
/* Separate out the strips held by the selected meta-strips */
-static int nlaedit_remove_meta_exec (bContext *C, wmOperator *op)
+static int nlaedit_remove_meta_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -572,7 +573,7 @@ void NLA_OT_meta_remove (wmOperatorType *ot)
* the originals were housed in.
*/
-static int nlaedit_duplicate_exec (bContext *C, wmOperator *op)
+static int nlaedit_duplicate_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -620,8 +621,8 @@ static int nlaedit_duplicate_exec (bContext *C, wmOperator *op)
/* deselect the original and the active flag */
strip->flag &= ~(NLASTRIP_FLAG_SELECT|NLASTRIP_FLAG_ACTIVE);
- /* auto-name it */
- BKE_nlastrip_validate_name(adt, strip);
+ /* auto-name newly created strip */
+ BKE_nlastrip_validate_name(adt, nstrip);
done++;
}
@@ -645,11 +646,11 @@ static int nlaedit_duplicate_exec (bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-static int nlaedit_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int nlaedit_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
nlaedit_duplicate_exec(C, op);
- RNA_int_set(op->ptr, "mode", TFM_TIME_TRANSLATE); // XXX
+ RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
WM_operator_name_call(C, "TRANSFORM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
return OPERATOR_FINISHED;
@@ -677,7 +678,7 @@ void NLA_OT_duplicate (wmOperatorType *ot)
/* ******************** Delete Strips Operator ***************************** */
/* Deletes the selected NLA-Strips */
-static int nlaedit_delete_exec (bContext *C, wmOperator *op)
+static int nlaedit_delete_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -810,7 +811,7 @@ static void nlaedit_split_strip_actclip (AnimData *adt, NlaTrack *nlt, NlaStrip
}
/* split a given Meta strip */
-static void nlaedit_split_strip_meta (AnimData *adt, NlaTrack *nlt, NlaStrip *strip)
+static void nlaedit_split_strip_meta (NlaTrack *nlt, NlaStrip *strip)
{
/* simply ungroup it for now... */
BKE_nlastrips_clear_metastrip(&nlt->strips, strip);
@@ -818,7 +819,7 @@ static void nlaedit_split_strip_meta (AnimData *adt, NlaTrack *nlt, NlaStrip *st
/* ----- */
-static int nlaedit_split_exec (bContext *C, wmOperator *op)
+static int nlaedit_split_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -852,7 +853,7 @@ static int nlaedit_split_exec (bContext *C, wmOperator *op)
break;
case NLASTRIP_TYPE_META: /* meta-strips need special handling */
- nlaedit_split_strip_meta(adt, nlt, strip);
+ nlaedit_split_strip_meta(nlt, strip);
break;
default: /* for things like Transitions, do not split! */
@@ -893,7 +894,7 @@ void NLA_OT_split (wmOperatorType *ot)
/* ******************** Bake Strips Operator ***************************** */
/* Bakes the NLA Strips for the active AnimData blocks */
-static int nlaedit_bake_exec (bContext *C, wmOperator *op)
+static int nlaedit_bake_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -949,7 +950,7 @@ void NLA_OT_bake (wmOperatorType *ot)
/* ******************** Toggle Muting Operator ************************** */
/* Toggles whether strips are muted or not */
-static int nlaedit_toggle_mute_exec (bContext *C, wmOperator *op)
+static int nlaedit_toggle_mute_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -1005,10 +1006,168 @@ void NLA_OT_mute_toggle (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+/* ******************** Swap Strips Operator ************************** */
+/* Tries to exchange strips within their owner tracks */
+
+static int nlaedit_swap_exec (bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of the editable tracks being shown in the NLA */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NLATRACKS | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* consider each track in turn */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+
+ NlaStrip *strip, *stripN=NULL;
+ NlaStrip *sa=NULL, *sb=NULL;
+
+ /* make temporary metastrips so that entire islands of selections can be moved around */
+ BKE_nlastrips_make_metas(&nlt->strips, 1);
+
+ /* special case: if there is only 1 island (i.e. temp meta BUT NOT unselected/normal/normal-meta strips) left after this,
+ * and this island has two strips inside it, then we should be able to just swap these still...
+ */
+ if ((nlt->strips.first == nlt->strips.last) && (nlt->strips.first != NULL)) {
+ NlaStrip *mstrip = (NlaStrip *)nlt->strips.first;
+
+ if ((mstrip->flag & NLASTRIP_FLAG_TEMP_META) && (BLI_countlist(&mstrip->strips) == 2))
+ {
+ /* remove this temp meta, so that we can see the strips inside */
+ BKE_nlastrips_clear_metas(&nlt->strips, 0, 1);
+ }
+ }
+
+ /* get two selected strips only (these will be metas due to prev step) to operate on
+ * - only allow swapping 2, as with more the context becomes unclear
+ */
+ for (strip = nlt->strips.first; strip; strip = stripN) {
+ stripN = strip->next;
+
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* first or second strip? */
+ if (sa == NULL) {
+ /* store as first */
+ sa = strip;
+ }
+ else if (sb == NULL) {
+ /* store as second */
+ sb = strip;
+ }
+ else {
+ /* too many selected */
+ break;
+ }
+ }
+ }
+
+ if (strip) {
+ /* too many selected warning */
+ BKE_reportf(op->reports, RPT_WARNING,
+ "Too many clusters of strips selected in NLA Track (%s). Needs exactly 2 to be selected.",
+ nlt->name);
+ }
+ else if (sa == NULL) {
+ /* no warning as this is just a common case, and it may get annoying when doing multiple tracks */
+ }
+ else if (sb == NULL) {
+ /* too few selected warning */
+ BKE_reportf(op->reports, RPT_WARNING,
+ "Too few clusters of strips selected in NLA Track (%s). Needs exactly 2 to be selected.",
+ nlt->name);
+ }
+ else {
+ float nsa[2], nsb[2];
+
+ /* remove these strips from the track, so that we can test if they can fit in the proposed places */
+ BLI_remlink(&nlt->strips, sa);
+ BLI_remlink(&nlt->strips, sb);
+
+ /* calculate new extents for strips */
+ /* a --> b */
+ nsa[0] = sb->start;
+ nsa[1] = sb->start + (sa->end - sa->start);
+ /* b --> a */
+ nsb[0] = sa->start;
+ nsb[1] = sa->start + (sb->end - sb->start);
+
+ /* check if the track has room for the strips to be swapped */
+ if (BKE_nlastrips_has_space(&nlt->strips, nsa[0], nsa[1]) &&
+ BKE_nlastrips_has_space(&nlt->strips, nsb[0], nsb[1]))
+ {
+ /* set new extents for strips then */
+ sa->start = nsa[0];
+ sa->end = nsa[1];
+ BKE_nlameta_flush_transforms(sa);
+
+ sb->start = nsb[0];
+ sb->end = nsb[1];
+ BKE_nlameta_flush_transforms(sb);
+ }
+ else {
+ /* not enough room to swap, so show message */
+ if ((sa->flag & NLASTRIP_FLAG_TEMP_META) || (sb->flag & NLASTRIP_FLAG_TEMP_META)) {
+ BKE_report(op->reports, RPT_WARNING,
+ "Cannot swap selected strips as they will not be able to fit in their new places");
+ }
+ else {
+ BKE_reportf(op->reports, RPT_WARNING,
+ "Cannot swap '%s' and '%s' as one or both will not be able to fit in their new places",
+ sa->name, sb->name);
+ }
+ }
+
+ /* add strips back to track now */
+ BKE_nlatrack_add_strip(nlt, sa);
+ BKE_nlatrack_add_strip(nlt, sb);
+ }
+
+ /* clear (temp) metastrips */
+ BKE_nlastrips_clear_metas(&nlt->strips, 0, 1);
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ /* refresh auto strip properties */
+ ED_nla_postop_refresh(&ac);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_swap (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Swap Strips";
+ ot->idname= "NLA_OT_swap";
+ ot->description= "Swap order of selected strips within tracks";
+
+ /* api callbacks */
+ ot->exec= nlaedit_swap_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
/* ******************** Move Strips Up Operator ************************** */
/* Tries to move the selected strips into the track above if possible. */
-static int nlaedit_move_up_exec (bContext *C, wmOperator *op)
+static int nlaedit_move_up_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -1082,7 +1241,7 @@ void NLA_OT_move_up (wmOperatorType *ot)
/* ******************** Move Strips Down Operator ************************** */
/* Tries to move the selected strips into the track above if possible. */
-static int nlaedit_move_down_exec (bContext *C, wmOperator *op)
+static int nlaedit_move_down_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -1250,7 +1409,7 @@ static short bezt_apply_nlamapping (KeyframeEditData *ked, BezTriple *bezt)
return 0;
}
-static int nlaedit_apply_scale_exec (bContext *C, wmOperator *op)
+static int nlaedit_apply_scale_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -1258,7 +1417,7 @@ static int nlaedit_apply_scale_exec (bContext *C, wmOperator *op)
bAnimListElem *ale;
int filter;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
/* get editor data */
if (ANIM_animdata_get_context(C, &ac) == 0)
@@ -1269,7 +1428,6 @@ static int nlaedit_apply_scale_exec (bContext *C, wmOperator *op)
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
/* init the editing data */
- memset(&ked, 0, sizeof(KeyframeEditData));
/* for each NLA-Track, apply scale of all selected strips */
for (ale= anim_data.first; ale; ale= ale->next) {
@@ -1333,7 +1491,7 @@ void NLA_OT_apply_scale (wmOperatorType *ot)
/* ******************** Clear Scale Operator ***************************** */
/* Reset the scaling of the selected strips to 1.0f */
-static int nlaedit_clear_scale_exec (bContext *C, wmOperator *op)
+static int nlaedit_clear_scale_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -1544,13 +1702,13 @@ void NLA_OT_snap (wmOperatorType *ot)
/* ******************** Add F-Modifier Operator *********************** */
/* present a special customised popup menu for this, with some filtering */
-static int nla_fmodifier_add_invoke (bContext *C, wmOperator *op, wmEvent *event)
+static int nla_fmodifier_add_invoke (bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
uiPopupMenu *pup;
uiLayout *layout;
int i;
- pup= uiPupMenuBegin(C, "Add F-Modifier", 0);
+ pup= uiPupMenuBegin(C, "Add F-Modifier", ICON_NULL);
layout= uiPupMenuLayout(pup);
/* start from 1 to skip the 'Invalid' modifier type */
@@ -1639,6 +1797,7 @@ void NLA_OT_fmodifier_add (wmOperatorType *ot)
/* identifiers */
ot->name= "Add F-Modifier";
ot->idname= "NLA_OT_fmodifier_add";
+ ot->description= "Add F-Modifier of the secified type to the selected NLA-Strips";
/* api callbacks */
ot->invoke= nla_fmodifier_add_invoke;
@@ -1702,7 +1861,7 @@ void NLA_OT_fmodifier_copy (wmOperatorType *ot)
/* identifiers */
ot->name= "Copy F-Modifiers";
ot->idname= "NLA_OT_fmodifier_copy";
- ot->description= "Copy the F-Modifier(s) of the active NLA-Strip.";
+ ot->description= "Copy the F-Modifier(s) of the active NLA-Strip";
/* api callbacks */
ot->exec= nla_fmodifier_copy_exec;
diff --git a/source/blender/editors/space_nla/nla_intern.h b/source/blender/editors/space_nla/nla_intern.h
index 7570969158b..b2ff0e107b3 100644
--- a/source/blender/editors/space_nla/nla_intern.h
+++ b/source/blender/editors/space_nla/nla_intern.h
@@ -45,7 +45,7 @@ void NLA_OT_properties(wmOperatorType *ot);
/* nla_draw.c */
void draw_nla_main_data(bAnimContext *ac, SpaceNla *snla, ARegion *ar);
-void draw_nla_channel_list(bContext *C, bAnimContext *ac, SpaceNla *snla, ARegion *ar);
+void draw_nla_channel_list(bContext *C, bAnimContext *ac, ARegion *ar);
/* **************************************** */
/* nla_header.c */
@@ -60,7 +60,7 @@ enum {
NLAEDIT_LRSEL_TEST = -1,
NLAEDIT_LRSEL_NONE,
NLAEDIT_LRSEL_LEFT,
- NLAEDIT_LRSEL_RIGHT,
+ NLAEDIT_LRSEL_RIGHT
} eNlaEdit_LeftRightSelect_Mode;
/* --- */
@@ -78,7 +78,7 @@ enum {
NLAEDIT_SNAP_CFRA = 1,
NLAEDIT_SNAP_NEAREST_FRAME,
NLAEDIT_SNAP_NEAREST_SECOND,
- NLAEDIT_SNAP_NEAREST_MARKER,
+ NLAEDIT_SNAP_NEAREST_MARKER
} eNlaEdit_Snap_Mode;
/* --- */
@@ -100,6 +100,7 @@ void NLA_OT_split(wmOperatorType *ot);
void NLA_OT_mute_toggle(wmOperatorType *ot);
+void NLA_OT_swap(wmOperatorType *ot);
void NLA_OT_move_up(wmOperatorType *ot);
void NLA_OT_move_down(wmOperatorType *ot);
diff --git a/source/blender/editors/space_nla/nla_ops.c b/source/blender/editors/space_nla/nla_ops.c
index 85a169f2bb0..6a32f02c8ad 100644
--- a/source/blender/editors/space_nla/nla_ops.c
+++ b/source/blender/editors/space_nla/nla_ops.c
@@ -139,6 +139,7 @@ void nla_operatortypes(void)
WM_operatortype_append(NLA_OT_mute_toggle);
+ WM_operatortype_append(NLA_OT_swap);
WM_operatortype_append(NLA_OT_move_up);
WM_operatortype_append(NLA_OT_move_down);
@@ -156,7 +157,7 @@ void nla_operatortypes(void)
/* ************************** registration - keymaps **********************************/
-static void nla_keymap_channels (wmKeyConfig *keyconf, wmKeyMap *keymap)
+static void nla_keymap_channels(wmKeyMap *keymap)
{
/* NLA-specific (different to standard channels keymap) -------------------------- */
/* selection */
@@ -173,30 +174,6 @@ static void nla_keymap_channels (wmKeyConfig *keyconf, wmKeyMap *keymap)
/* delete tracks */
WM_keymap_add_item(keymap, "NLA_OT_delete_tracks", XKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "NLA_OT_delete_tracks", DELKEY, KM_PRESS, 0, 0);
-
- /* General Animation Channels keymap (see anim_channels.c) ----------------------- */
- /* selection */
- /* borderselect - not in tweakmode */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_select_border", BKEY, KM_PRESS, 0, 0);
-
- /* deselect all - not in tweakmode */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_select_all_toggle", AKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_select_all_toggle", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "invert", 1);
-
- /* settings */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_setting_toggle", WKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_channels_setting_enable", WKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_channels_setting_disable", WKEY, KM_PRESS, KM_ALT, 0);
-
- /* settings - specialised hotkeys */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_editable_toggle", TABKEY, KM_PRESS, 0, 0);
-
- /* expand/collapse */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_expand", PADPLUSKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_channels_collapse", PADMINUS, KM_PRESS, 0, 0);
-
- RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_expand", PADPLUSKEY, KM_PRESS, KM_CTRL, 0)->ptr, "all", 1);
- RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_collapse", PADMINUS, KM_PRESS, KM_CTRL, 0)->ptr, "all", 1);
}
static void nla_keymap_main (wmKeyConfig *keyconf, wmKeyMap *keymap)
@@ -249,6 +226,9 @@ static void nla_keymap_main (wmKeyConfig *keyconf, wmKeyMap *keymap)
/* toggles */
WM_keymap_add_item(keymap, "NLA_OT_mute_toggle", HKEY, KM_PRESS, 0, 0);
+ /* swap */
+ WM_keymap_add_item(keymap, "NLA_OT_swap", FKEY, KM_PRESS, KM_ALT, 0);
+
/* move up */
WM_keymap_add_item(keymap, "NLA_OT_move_up", PAGEUPKEY, KM_PRESS, 0, 0);
/* move down */
@@ -287,7 +267,7 @@ void nla_keymap(wmKeyConfig *keyconf)
* However, those operations which involve clicking on channels and/or the placement of them in the view are implemented here instead
*/
keymap= WM_keymap_find(keyconf, "NLA Channels", SPACE_NLA, 0);
- nla_keymap_channels(keyconf, keymap);
+ nla_keymap_channels(keymap);
/* data */
keymap= WM_keymap_find(keyconf, "NLA Editor", SPACE_NLA, 0);
diff --git a/source/blender/editors/space_nla/nla_select.c b/source/blender/editors/space_nla/nla_select.c
index f49897e79fe..032f4984b83 100644
--- a/source/blender/editors/space_nla/nla_select.c
+++ b/source/blender/editors/space_nla/nla_select.c
@@ -182,8 +182,9 @@ static int nlaedit_deselectall_exec(bContext *C, wmOperator *op)
void NLA_OT_select_all_toggle (wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Select All";
+ ot->name= "Select or Deselect All";
ot->idname= "NLA_OT_select_all_toggle";
+ ot->description= "(De)Select all NLA-Strips";
/* api callbacks */
ot->exec= nlaedit_deselectall_exec;
@@ -321,6 +322,7 @@ void NLA_OT_select_border(wmOperatorType *ot)
/* identifiers */
ot->name= "Border Select";
ot->idname= "NLA_OT_select_border";
+ ot->description= "Use box selection to grab NLA-Strips";
/* api callbacks */
ot->invoke= WM_border_select_invoke;
@@ -579,6 +581,7 @@ void NLA_OT_click_select (wmOperatorType *ot)
/* identifiers */
ot->name= "Mouse Select";
ot->idname= "NLA_OT_click_select";
+ ot->description= "Handle clicks to select NLA Strips";
/* api callbacks - absolutely no exec() this yet... */
ot->invoke= nlaedit_clickselect_invoke;
diff --git a/source/blender/editors/space_nla/space_nla.c b/source/blender/editors/space_nla/space_nla.c
index 92c5ef6c410..db9255a867b 100644
--- a/source/blender/editors/space_nla/space_nla.c
+++ b/source/blender/editors/space_nla/space_nla.c
@@ -37,6 +37,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -148,16 +149,17 @@ static SpaceLink *nla_new(const bContext *C)
ar->v2d.cur = ar->v2d.tot;
ar->v2d.min[0]= 0.0f;
- ar->v2d.min[1]= 0.0f;
+ ar->v2d.min[1]= 0.0f;
ar->v2d.max[0]= MAXFRAMEF;
- ar->v2d.max[1]= 10000.0f;
+ ar->v2d.max[1]= 10000.0f;
ar->v2d.minzoom= 0.01f;
ar->v2d.maxzoom= 50;
ar->v2d.scroll = (V2D_SCROLL_BOTTOM|V2D_SCROLL_SCALE_HORIZONTAL);
ar->v2d.scroll |= (V2D_SCROLL_RIGHT);
ar->v2d.keepzoom= V2D_LOCKZOOM_Y;
+ ar->v2d.keepofs= V2D_KEEPOFS_Y;
ar->v2d.align= V2D_ALIGN_NO_POS_Y;
ar->v2d.flag = V2D_VIEWSYNC_AREA_VERTICAL;
@@ -177,7 +179,7 @@ static void nla_free(SpaceLink *sl)
/* spacetype; init callback */
-static void nla_init(struct wmWindowManager *wm, ScrArea *sa)
+static void nla_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa)
{
SpaceNla *snla= (SpaceNla *)sa->spacedata.first;
@@ -208,9 +210,13 @@ static void nla_channel_area_init(wmWindowManager *wm, ARegion *ar)
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
/* own keymap */
- // TODO: cannot use generic copy, need special NLA version
+ /* own channels map first to override some channel keymaps */
keymap= WM_keymap_find(wm->defaultconf, "NLA Channels", SPACE_NLA, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+ /* now generic channels map for everything else that can apply */
+ keymap= WM_keymap_find(wm->defaultconf, "Animation Channels", 0, 0);
+ WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+
keymap= WM_keymap_find(wm->defaultconf, "NLA Generic", SPACE_NLA, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
}
@@ -218,7 +224,6 @@ static void nla_channel_area_init(wmWindowManager *wm, ARegion *ar)
/* draw entirely, view changes should be handled here */
static void nla_channel_area_draw(const bContext *C, ARegion *ar)
{
- SpaceNla *snla= CTX_wm_space_nla(C);
bAnimContext ac;
View2D *v2d= &ar->v2d;
View2DScrollers *scrollers;
@@ -227,11 +232,11 @@ static void nla_channel_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* data */
if (ANIM_animdata_get_context(C, &ac)) {
- draw_nla_channel_list((bContext *)C, &ac, snla, ar);
+ draw_nla_channel_list((bContext *)C, &ac, ar);
}
/* reset view matrix */
@@ -272,12 +277,12 @@ static void nla_main_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* time grid */
unit= (snla->flag & SNLA_DRAWTIME)? V2D_UNIT_SECONDS : V2D_UNIT_FRAMES;
- grid= UI_view2d_grid_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy);
- UI_view2d_grid_draw(C, v2d, grid, V2D_GRIDLINES_ALL);
+ grid= UI_view2d_grid_calc(CTX_data_scene(C), v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy);
+ UI_view2d_grid_draw(v2d, grid, V2D_GRIDLINES_ALL);
UI_view2d_grid_free(grid);
/* data */
@@ -289,7 +294,7 @@ static void nla_main_area_draw(const bContext *C, ARegion *ar)
UI_view2d_text_cache_draw(ar);
}
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* current frame */
if (snla->flag & SNLA_DRAWTIME) flag |= DRAWCFRA_UNIT_SECONDS;
@@ -297,11 +302,11 @@ static void nla_main_area_draw(const bContext *C, ARegion *ar)
ANIM_draw_cfra(C, v2d, flag);
/* markers */
- UI_view2d_view_orthoSpecial(C, v2d, 1);
+ UI_view2d_view_orthoSpecial(ar, v2d, 1);
draw_markers_time(C, 0);
/* preview range */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
ANIM_draw_previewrange(C, v2d);
/* reset view matrix */
@@ -315,7 +320,7 @@ static void nla_main_area_draw(const bContext *C, ARegion *ar)
/* add handlers, stuff you only do once or on area/region changes */
-static void nla_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void nla_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -510,7 +515,7 @@ void ED_spacetype_nla(void)
art->init= nla_main_area_init;
art->draw= nla_main_area_draw;
art->listener= nla_main_area_listener;
- art->keymapflag= ED_KEYMAP_VIEW2D/*|ED_KEYMAP_MARKERS*/|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
+ art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_node/CMakeLists.txt b/source/blender/editors/space_node/CMakeLists.txt
index ae298a611e9..c615f5cc85f 100644
--- a/source/blender/editors/space_node/CMakeLists.txt
+++ b/source/blender/editors/space_node/CMakeLists.txt
@@ -19,10 +19,9 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
+ ../../blenfont
../../blenkernel
../../blenlib
../../imbuf
@@ -35,8 +34,18 @@ SET(INC
../../../../intern/opennl/extern
)
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ drawnode.c
+ node_buttons.c
+ node_draw.c
+ node_edit.c
+ node_header.c
+ node_ops.c
+ node_select.c
+ node_state.c
+ space_node.c
+
+ node_intern.h
+)
-BLENDERLIB(bf_editor_space_node "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_node "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_node/Makefile b/source/blender/editors/space_node/Makefile
deleted file mode 100644
index 6c12149a43f..00000000000
--- a/source/blender/editors/space_node/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_node
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../nodes
-CPPFLAGS += -I../../render/extern/include
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_node/SConscript b/source/blender/editors/space_node/SConscript
index 636b247d44c..1487a68215e 100644
--- a/source/blender/editors/space_node/SConscript
+++ b/source/blender/editors/space_node/SConscript
@@ -3,7 +3,7 @@ Import ('env')
sources = env.Glob('*.c')
-incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../makesrna ../../imbuf'
+incs = '../include ../../blenfont ../../blenlib ../../blenkernel ../../makesdna ../../makesrna ../../imbuf'
incs += ' ../../nodes ../../render/extern/include'
incs += ' ../../windowmanager #intern/guardedalloc #extern/glew/include'
defs = []
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 5e0926da216..e1577309afa 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -33,6 +33,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_node_types.h"
#include "DNA_material_types.h"
@@ -43,6 +44,7 @@
#include "BKE_context.h"
#include "BKE_curve.h"
+#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_library.h"
#include "BKE_main.h"
@@ -53,11 +55,15 @@
#include "BIF_gl.h"
#include "BIF_glutil.h"
+#include "BLF_api.h"
+
#include "MEM_guardedalloc.h"
#include "RNA_access.h"
+#include "ED_node.h"
+
#include "WM_api.h"
#include "WM_types.h"
@@ -72,12 +78,7 @@
/* ****************** BUTTON CALLBACKS FOR ALL TREES ***************** */
-void node_buts_group(uiLayout *layout, bContext *C, PointerRNA *ptr)
-{
- uiTemplateIDBrowse(layout, C, ptr, "node_tree", NULL, NULL, "");
-}
-
-static void node_buts_value(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_value(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
PointerRNA sockptr;
PropertyRNA *prop;
@@ -86,10 +87,10 @@ static void node_buts_value(uiLayout *layout, bContext *C, PointerRNA *ptr)
prop = RNA_struct_find_property(ptr, "outputs");
RNA_property_collection_lookup_int(ptr, prop, 0, &sockptr);
- uiItemR(layout, &sockptr, "default_value", 0, "", 0);
+ uiItemR(layout, &sockptr, "default_value", 0, "", ICON_NULL);
}
-static void node_buts_rgb(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_rgb(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
PointerRNA sockptr;
@@ -101,22 +102,22 @@ static void node_buts_rgb(uiLayout *layout, bContext *C, PointerRNA *ptr)
col = uiLayoutColumn(layout, 0);
uiTemplateColorWheel(col, &sockptr, "default_value", 1, 0, 0, 0);
- uiItemR(col, &sockptr, "default_value", 0, "", 0);
+ uiItemR(col, &sockptr, "default_value", 0, "", ICON_NULL);
}
-static void node_buts_mix_rgb(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_mix_rgb(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *row;
bNodeTree *ntree= (bNodeTree*)ptr->id.data;
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "blend_type", 0, "", 0);
+ uiItemR(row, ptr, "blend_type", 0, "", ICON_NULL);
if(ntree->type == NTREE_COMPOSIT)
uiItemR(row, ptr, "use_alpha", 0, "", ICON_IMAGE_RGB_ALPHA);
}
-static void node_buts_time(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_time(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *row;
#if 0
@@ -134,16 +135,16 @@ static void node_buts_time(uiLayout *layout, bContext *C, PointerRNA *ptr)
uiTemplateCurveMapping(layout, ptr, "curve", 's', 0, 0);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "frame_start", 0, "Sta", 0);
- uiItemR(row, ptr, "frame_end", 0, "End", 0);
+ uiItemR(row, ptr, "frame_start", 0, "Sta", ICON_NULL);
+ uiItemR(row, ptr, "frame_end", 0, "End", ICON_NULL);
}
-static void node_buts_colorramp(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_colorramp(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiTemplateColorRamp(layout, ptr, "color_ramp", 0);
}
-static void node_buts_curvevec(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_curvevec(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiTemplateCurveMapping(layout, ptr, "mapping", 'v', 0, 0);
}
@@ -154,7 +155,7 @@ void node_curvemap_sample(float *col)
_sample_col= col;
}
-static void node_buts_curvecol(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_curvecol(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
bNode *node= ptr->data;
CurveMapping *cumap= node->storage;
@@ -169,16 +170,27 @@ static void node_buts_curvecol(uiLayout *layout, bContext *C, PointerRNA *ptr)
uiTemplateCurveMapping(layout, ptr, "mapping", 'c', 0, 0);
}
-static void node_buts_normal(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_normal_cb(bContext *C, void *ntree_v, void *node_v)
+{
+ Main *bmain = CTX_data_main(C);
+
+ ED_node_generic_update(bmain, ntree_v, node_v);
+ WM_event_add_notifier(C, NC_NODE|NA_EDITED, ntree_v);
+}
+
+static void node_buts_normal(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiBlock *block= uiLayoutAbsoluteBlock(layout);
+ bNodeTree *ntree= ptr->id.data;
bNode *node= ptr->data;
rctf *butr= &node->butr;
bNodeSocket *sock= node->outputs.first; /* first socket stores normal */
+ uiBut *bt;
- uiDefButF(block, BUT_NORMAL, B_NODE_EXEC, "",
+ bt= uiDefButF(block, BUT_NORMAL, B_NODE_EXEC, "",
(short)butr->xmin, (short)butr->xmin, butr->xmax-butr->xmin, butr->xmax-butr->xmin,
sock->ns.vec, 0.0f, 1.0f, 0, 0, "");
+ uiButSetFunc(bt, node_normal_cb, ntree, node);
}
#if 0 // not used in 2.5x yet
static void node_browse_tex_cb(bContext *C, void *ntree_v, void *node_v)
@@ -198,7 +210,7 @@ static void node_browse_tex_cb(bContext *C, void *ntree_v, void *node_v)
node->id= &tex->id;
id_us_plus(node->id);
- BLI_strncpy(node->name, node->id->name+2, 21);
+ BLI_strncpy(node->name, node->id->name+2, sizeof(node->name));
nodeSetActive(ntree, node);
@@ -212,7 +224,7 @@ static void node_browse_tex_cb(bContext *C, void *ntree_v, void *node_v)
node->menunr= 0;
}
#endif
-static void node_dynamic_update_cb(bContext *C, void *ntree_v, void *node_v)
+static void node_dynamic_update_cb(bContext *C, void *UNUSED(ntree_v), void *node_v)
{
Main *bmain= CTX_data_main(C);
Material *ma;
@@ -244,7 +256,7 @@ static void node_dynamic_update_cb(bContext *C, void *ntree_v, void *node_v)
// XXX BIF_preview_changed(ID_MA);
}
-static void node_buts_texture(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_texture(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
bNode *node= ptr->data;
@@ -255,17 +267,17 @@ static void node_buts_texture(uiLayout *layout, bContext *C, PointerRNA *ptr)
(node->type != TEX_NODE_TEXTURE)
);
- uiItemR(layout, ptr, "texture", 0, "", 0);
+ uiItemR(layout, ptr, "texture", 0, "", ICON_NULL);
if(multi) {
/* Number Drawing not optimal here, better have a list*/
- uiItemR(layout, ptr, "node_output", 0, "", 0);
+ uiItemR(layout, ptr, "node_output", 0, "", ICON_NULL);
}
}
-static void node_buts_math(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "operation", 0, "", 0);
+ uiItemR(layout, ptr, "operation", 0, "", ICON_NULL);
}
/* ****************** BUTTON CALLBACKS FOR SHADER NODES ***************** */
@@ -285,7 +297,7 @@ static void node_browse_text_cb(bContext *C, void *ntree_v, void *node_v)
oldid= node->id;
node->id= BLI_findlink(&bmain->text, node->menunr-1);
id_us_plus(node->id);
- BLI_strncpy(node->name, node->id->name+2, 21); /* huh? why 21? */
+ BLI_strncpy(node->name, node->id->name+2, sizeof(node->name));
node->custom1= BSET(node->custom1, NODE_DYNAMIC_NEW);
@@ -307,40 +319,40 @@ static void node_shader_buts_material(uiLayout *layout, bContext *C, PointerRNA
if(!node->id) return;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "use_diffuse", 0, NULL, 0);
- uiItemR(col, ptr, "use_specular", 0, NULL, 0);
- uiItemR(col, ptr, "invert_normal", 0, NULL, 0);
+ uiItemR(col, ptr, "use_diffuse", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_specular", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "invert_normal", 0, NULL, ICON_NULL);
}
-static void node_shader_buts_mapping(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_shader_buts_mapping(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *row;
- uiItemL(layout, "Location:", 0);
+ uiItemL(layout, "Location:", ICON_NULL);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "location", 0, "", 0);
+ uiItemR(row, ptr, "location", 0, "", ICON_NULL);
- uiItemL(layout, "Rotation:", 0);
+ uiItemL(layout, "Rotation:", ICON_NULL);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "rotation", 0, "", 0);
+ uiItemR(row, ptr, "rotation", 0, "", ICON_NULL);
- uiItemL(layout, "Scale:", 0);
+ uiItemL(layout, "Scale:", ICON_NULL);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "scale", 0, "", 0);
+ uiItemR(row, ptr, "scale", 0, "", ICON_NULL);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "use_min", 0, "Min", 0);
- uiItemR(row, ptr, "min", 0, "", 0);
+ uiItemR(row, ptr, "use_min", 0, "Min", ICON_NULL);
+ uiItemR(row, ptr, "min", 0, "", ICON_NULL);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "use_max", 0, "Max", 0);
- uiItemR(row, ptr, "max", 0, "", 0);
+ uiItemR(row, ptr, "use_max", 0, "Max", ICON_NULL);
+ uiItemR(row, ptr, "max", 0, "", ICON_NULL);
}
-static void node_shader_buts_vect_math(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_shader_buts_vect_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "operation", 0, "", 0);
+ uiItemR(layout, ptr, "operation", 0, "", ICON_NULL);
}
static void node_shader_buts_geometry(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -353,12 +365,12 @@ static void node_shader_buts_geometry(uiLayout *layout, bContext *C, PointerRNA
if(obptr.data && RNA_enum_get(&obptr, "type") == OB_MESH) {
PointerRNA dataptr= RNA_pointer_get(&obptr, "data");
- uiItemPointerR(col, ptr, "uv_layer", &dataptr, "uv_textures", "", 0);
- uiItemPointerR(col, ptr, "color_layer", &dataptr, "vertex_colors", "", 0);
+ uiItemPointerR(col, ptr, "uv_layer", &dataptr, "uv_textures", "", ICON_NULL);
+ uiItemPointerR(col, ptr, "color_layer", &dataptr, "vertex_colors", "", ICON_NULL);
}
else {
- uiItemR(col, ptr, "uv_layer", 0, "UV", 0);
- uiItemR(col, ptr, "color_layer", 0, "VCol", 0);
+ uiItemR(col, ptr, "uv_layer", 0, "UV", ICON_NULL);
+ uiItemR(col, ptr, "color_layer", 0, "VCol", ICON_NULL);
}
}
@@ -376,7 +388,7 @@ static void node_shader_buts_dynamic(uiLayout *layout, bContext *C, PointerRNA *
/* B_NODE_EXEC is handled in butspace.c do_node_buts */
if(!node->id) {
- char *strp;
+ const char *strp;
IDnames_to_pupstring(&strp, NULL, "", &(bmain->text), NULL, NULL);
node->menunr= 0;
bt= uiDefButS(block, MENU, B_NODE_EXEC/*+node->nr*/, strp,
@@ -384,7 +396,7 @@ static void node_shader_buts_dynamic(uiLayout *layout, bContext *C, PointerRNA *
&node->menunr, 0, 0, 0, 0, "Browses existing choices");
uiButSetFunc(bt, node_browse_text_cb, ntree, node);
xoff=19;
- if(strp) MEM_freeN(strp);
+ if(strp) MEM_freeN((void *)strp);
}
else {
bt = uiDefBut(block, BUT, B_NOP, "Update",
@@ -474,21 +486,21 @@ static void node_composit_buts_image(uiLayout *layout, bContext *C, PointerRNA *
col= uiLayoutColumn(layout, 0);
- uiItemR(col, &imaptr, "source", 0, NULL, 0);
+ uiItemR(col, &imaptr, "source", 0, NULL, ICON_NULL);
if (ELEM(RNA_enum_get(&imaptr, "source"), IMA_SRC_SEQUENCE, IMA_SRC_MOVIE)) {
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "frame_duration", 0, NULL, 0);
- uiItemR(col, ptr, "frame_start", 0, NULL, 0);
- uiItemR(col, ptr, "frame_offset", 0, NULL, 0);
- uiItemR(col, ptr, "use_cyclic", 0, NULL, 0);
- uiItemR(col, ptr, "use_auto_refresh", UI_ITEM_R_ICON_ONLY, NULL, 0);
+ uiItemR(col, ptr, "frame_duration", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "frame_start", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "frame_offset", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_cyclic", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_auto_refresh", UI_ITEM_R_ICON_ONLY, NULL, ICON_NULL);
}
col= uiLayoutColumn(layout, 0);
if (RNA_enum_get(&imaptr, "type")== IMA_TYPE_MULTILAYER)
- uiItemR(col, ptr, "layer", 0, NULL, 0);
+ uiItemR(col, ptr, "layer", 0, NULL, ICON_NULL);
}
static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -507,7 +519,7 @@ static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, Point
col= uiLayoutColumn(layout, 0);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "layer", 0, "", 0);
+ uiItemR(row, ptr, "layer", 0, "", ICON_NULL);
prop = RNA_struct_find_property(ptr, "layer");
if (!(RNA_property_enum_identifier(C, ptr, prop, RNA_property_enum_get(ptr, prop), &layer_name)))
@@ -524,432 +536,447 @@ static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, Point
}
-static void node_composit_buts_blur(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_blur(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiLayout *col;
+ uiLayout *col, *row;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "filter_type", 0, "", 0);
+ uiItemR(col, ptr, "filter_type", 0, "", ICON_NULL);
if (RNA_enum_get(ptr, "filter_type")!= R_FILTER_FAST_GAUSS) {
- uiItemR(col, ptr, "use_bokeh", 0, NULL, 0);
- uiItemR(col, ptr, "use_gamma_correction", 0, NULL, 0);
+ uiItemR(col, ptr, "use_bokeh", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_gamma_correction", 0, NULL, ICON_NULL);
}
- uiItemR(col, ptr, "use_relative", 0, NULL, 0);
- col= uiLayoutColumn(layout, 1);
+ uiItemR(col, ptr, "use_relative", 0, NULL, ICON_NULL);
+
if (RNA_boolean_get(ptr, "use_relative")) {
- uiItemR(col, ptr, "factor_x", 0, "X", 0);
- uiItemR(col, ptr, "factor_y", 0, "Y", 0);
+ uiItemL(col, "Aspect Correction", 0);
+ row= uiLayoutRow(layout, 1);
+ uiItemR(row, ptr, "aspect_correction", UI_ITEM_R_EXPAND, NULL, 0);
+
+ col= uiLayoutColumn(layout, 1);
+ uiItemR(col, ptr, "factor_x", 0, "X", ICON_NULL);
+ uiItemR(col, ptr, "factor_y", 0, "Y", ICON_NULL);
}
else {
- uiItemR(col, ptr, "size_x", 0, "X", 0);
- uiItemR(col, ptr, "size_y", 0, "Y", 0);
+ col= uiLayoutColumn(layout, 1);
+ uiItemR(col, ptr, "size_x", 0, "X", ICON_NULL);
+ uiItemR(col, ptr, "size_y", 0, "Y", ICON_NULL);
}
}
-static void node_composit_buts_dblur(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_dblur(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
- uiItemR(layout, ptr, "iterations", 0, NULL, 0);
- uiItemR(layout, ptr, "use_wrap", 0, NULL, 0);
+ uiItemR(layout, ptr, "iterations", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "use_wrap", 0, NULL, ICON_NULL);
col= uiLayoutColumn(layout, 1);
- uiItemL(col, "Center:", 0);
- uiItemR(col, ptr, "center_x", 0, "X", 0);
- uiItemR(col, ptr, "center_y", 0, "Y", 0);
+ uiItemL(col, "Center:", ICON_NULL);
+ uiItemR(col, ptr, "center_x", 0, "X", ICON_NULL);
+ uiItemR(col, ptr, "center_y", 0, "Y", ICON_NULL);
uiItemS(layout);
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "distance", 0, NULL, 0);
- uiItemR(col, ptr, "angle", 0, NULL, 0);
+ uiItemR(col, ptr, "distance", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "angle", 0, NULL, ICON_NULL);
uiItemS(layout);
- uiItemR(layout, ptr, "spin", 0, NULL, 0);
- uiItemR(layout, ptr, "zoom", 0, NULL, 0);
+ uiItemR(layout, ptr, "spin", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "zoom", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_bilateralblur(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_bilateralblur(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "iterations", 0, NULL, 0);
- uiItemR(col, ptr, "sigma_color", 0, NULL, 0);
- uiItemR(col, ptr, "sigma_space", 0, NULL, 0);
+ uiItemR(col, ptr, "iterations", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "sigma_color", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "sigma_space", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_defocus(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_defocus(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *sub, *col;
col= uiLayoutColumn(layout, 0);
- uiItemL(col, "Bokeh Type:", 0);
- uiItemR(col, ptr, "bokeh", 0, "", 0);
- uiItemR(col, ptr, "angle", 0, NULL, 0);
+ uiItemL(col, "Bokeh Type:", ICON_NULL);
+ uiItemR(col, ptr, "bokeh", 0, "", ICON_NULL);
+ uiItemR(col, ptr, "angle", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "use_gamma_correction", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_gamma_correction", 0, NULL, ICON_NULL);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_zbuffer")==1);
- uiItemR(col, ptr, "f_stop", 0, NULL, 0);
+ uiItemR(col, ptr, "f_stop", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "blur_max", 0, NULL, 0);
- uiItemR(layout, ptr, "threshold", 0, NULL, 0);
+ uiItemR(layout, ptr, "blur_max", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "threshold", 0, NULL, ICON_NULL);
col = uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "use_preview", 0, NULL, 0);
+ uiItemR(col, ptr, "use_preview", 0, NULL, ICON_NULL);
sub = uiLayoutColumn(col, 0);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_preview"));
- uiItemR(sub, ptr, "samples", 0, NULL, 0);
+ uiItemR(sub, ptr, "samples", 0, NULL, ICON_NULL);
col = uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "use_zbuffer", 0, NULL, 0);
+ uiItemR(col, ptr, "use_zbuffer", 0, NULL, ICON_NULL);
sub = uiLayoutColumn(col, 0);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_zbuffer")==0);
- uiItemR(sub, ptr, "z_scale", 0, NULL, 0);
+ uiItemR(sub, ptr, "z_scale", 0, NULL, ICON_NULL);
}
/* qdn: glare node */
-static void node_composit_buts_glare(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_glare(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "glare_type", 0, "", 0);
- uiItemR(layout, ptr, "quality", 0, "", 0);
+ uiItemR(layout, ptr, "glare_type", 0, "", ICON_NULL);
+ uiItemR(layout, ptr, "quality", 0, "", ICON_NULL);
if (RNA_enum_get(ptr, "glare_type")!= 1) {
- uiItemR(layout, ptr, "iterations", 0, NULL, 0);
+ uiItemR(layout, ptr, "iterations", 0, NULL, ICON_NULL);
if (RNA_enum_get(ptr, "glare_type")!= 0)
- uiItemR(layout, ptr, "color_modulation", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(layout, ptr, "color_modulation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
- uiItemR(layout, ptr, "mix", 0, NULL, 0);
- uiItemR(layout, ptr, "threshold", 0, NULL, 0);
+ uiItemR(layout, ptr, "mix", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "threshold", 0, NULL, ICON_NULL);
if (RNA_enum_get(ptr, "glare_type")== 2) {
- uiItemR(layout, ptr, "streaks", 0, NULL, 0);
- uiItemR(layout, ptr, "angle_offset", 0, NULL, 0);
+ uiItemR(layout, ptr, "streaks", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "angle_offset", 0, NULL, ICON_NULL);
}
if (RNA_enum_get(ptr, "glare_type")== 0 || RNA_enum_get(ptr, "glare_type")== 2) {
- uiItemR(layout, ptr, "fade", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(layout, ptr, "fade", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
if (RNA_enum_get(ptr, "glare_type")== 0)
- uiItemR(layout, ptr, "use_rotate_45", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_rotate_45", 0, NULL, ICON_NULL);
}
if (RNA_enum_get(ptr, "glare_type")== 1) {
- uiItemR(layout, ptr, "size", 0, NULL, 0);
+ uiItemR(layout, ptr, "size", 0, NULL, ICON_NULL);
}
}
-static void node_composit_buts_tonemap(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_tonemap(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col = uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "tonemap_type", 0, "", 0);
+ uiItemR(col, ptr, "tonemap_type", 0, "", ICON_NULL);
if (RNA_enum_get(ptr, "tonemap_type")== 0) {
- uiItemR(col, ptr, "key", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "offset", 0, NULL, 0);
- uiItemR(col, ptr, "gamma", 0, NULL, 0);
+ uiItemR(col, ptr, "key", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "offset", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "gamma", 0, NULL, ICON_NULL);
}
else {
- uiItemR(col, ptr, "intensity", 0, NULL, 0);
- uiItemR(col, ptr, "contrast", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "adaptation", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "correction", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "intensity", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "contrast", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "adaptation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "correction", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
}
-static void node_composit_buts_lensdist(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_lensdist(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "use_projector", 0, NULL, 0);
+ uiItemR(col, ptr, "use_projector", 0, NULL, ICON_NULL);
col = uiLayoutColumn(col, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_projector")==0);
- uiItemR(col, ptr, "use_jitter", 0, NULL, 0);
- uiItemR(col, ptr, "use_fit", 0, NULL, 0);
+ uiItemR(col, ptr, "use_jitter", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_fit", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_vecblur(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_vecblur(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "samples", 0, NULL, 0);
- uiItemR(col, ptr, "factor", 0, "Blur", 0);
+ uiItemR(col, ptr, "samples", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "factor", 0, "Blur", ICON_NULL);
col= uiLayoutColumn(layout, 1);
- uiItemL(col, "Speed:", 0);
- uiItemR(col, ptr, "speed_min", 0, "Min", 0);
- uiItemR(col, ptr, "speed_max", 0, "Max", 0);
+ uiItemL(col, "Speed:", ICON_NULL);
+ uiItemR(col, ptr, "speed_min", 0, "Min", ICON_NULL);
+ uiItemR(col, ptr, "speed_max", 0, "Max", ICON_NULL);
- uiItemR(layout, ptr, "use_curved", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_curved", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_filter(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_filter(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "filter_type", 0, "", 0);
+ uiItemR(layout, ptr, "filter_type", 0, "", ICON_NULL);
}
-static void node_composit_buts_flip(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_flip(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "axis", 0, "", 0);
+ uiItemR(layout, ptr, "axis", 0, "", ICON_NULL);
}
-static void node_composit_buts_crop(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_crop(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
- uiItemR(layout, ptr, "use_crop_size", 0, NULL, 0);
- uiItemR(layout, ptr, "relative", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_crop_size", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "relative", 0, NULL, ICON_NULL);
col= uiLayoutColumn(layout, 1);
if (RNA_boolean_get(ptr, "relative")){
- uiItemR(col, ptr, "rel_min_x", 0, "Left", 0);
- uiItemR(col, ptr, "rel_max_x", 0, "Right", 0);
- uiItemR(col, ptr, "rel_min_y", 0, "Up", 0);
- uiItemR(col, ptr, "rel_max_y", 0, "Down", 0);
+ uiItemR(col, ptr, "rel_min_x", 0, "Left", ICON_NULL);
+ uiItemR(col, ptr, "rel_max_x", 0, "Right", ICON_NULL);
+ uiItemR(col, ptr, "rel_min_y", 0, "Up", ICON_NULL);
+ uiItemR(col, ptr, "rel_max_y", 0, "Down", ICON_NULL);
} else {
- uiItemR(col, ptr, "min_x", 0, "Left", 0);
- uiItemR(col, ptr, "max_x", 0, "Right", 0);
- uiItemR(col, ptr, "min_y", 0, "Up", 0);
- uiItemR(col, ptr, "max_y", 0, "Down", 0);
+ uiItemR(col, ptr, "min_x", 0, "Left", ICON_NULL);
+ uiItemR(col, ptr, "max_x", 0, "Right", ICON_NULL);
+ uiItemR(col, ptr, "min_y", 0, "Up", ICON_NULL);
+ uiItemR(col, ptr, "max_y", 0, "Down", ICON_NULL);
}
}
-static void node_composit_buts_splitviewer(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_splitviewer(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *row, *col;
col= uiLayoutColumn(layout, 0);
row= uiLayoutRow(col, 0);
- uiItemR(row, ptr, "axis", UI_ITEM_R_EXPAND, NULL, 0);
- uiItemR(col, ptr, "factor", 0, NULL, 0);
+ uiItemR(row, ptr, "axis", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(col, ptr, "factor", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_map_value(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_map_value(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *sub, *col;
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "offset", 0, NULL, 0);
- uiItemR(col, ptr, "size", 0, NULL, 0);
+ uiItemR(col, ptr, "offset", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "size", 0, NULL, ICON_NULL);
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "use_min", 0, NULL, 0);
+ uiItemR(col, ptr, "use_min", 0, NULL, ICON_NULL);
sub =uiLayoutColumn(col, 0);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_min"));
- uiItemR(sub, ptr, "min", 0, "", 0);
+ uiItemR(sub, ptr, "min", 0, "", ICON_NULL);
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "use_max", 0, NULL, 0);
+ uiItemR(col, ptr, "use_max", 0, NULL, ICON_NULL);
sub =uiLayoutColumn(col, 0);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_max"));
- uiItemR(sub, ptr, "max", 0, "", 0);
+ uiItemR(sub, ptr, "max", 0, "", ICON_NULL);
}
-static void node_composit_buts_alphaover(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_alphaover(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "use_premultiply", 0, NULL, 0);
- uiItemR(col, ptr, "premul", 0, NULL, 0);
+ uiItemR(col, ptr, "use_premultiply", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "premul", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_hue_sat(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_zcombine(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiLayout *col;
+
+ col =uiLayoutColumn(layout, 1);
+ uiItemR(col, ptr, "use_alpha", 0, NULL, ICON_NULL);
+}
+
+
+static void node_composit_buts_hue_sat(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col =uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "color_hue", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "color_saturation", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "color_value", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "color_hue", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "color_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "color_value", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
-static void node_composit_buts_dilateerode(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_dilateerode(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "distance", 0, NULL, 0);
+ uiItemR(layout, ptr, "distance", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_diff_matte(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_diff_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "tolerance", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "falloff", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "tolerance", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "falloff", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
-static void node_composit_buts_distance_matte(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_distance_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "tolerance", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "falloff", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "tolerance", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "falloff", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
-static void node_composit_buts_color_spill(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_color_spill(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *row, *col;
- uiItemL(layout, "Despill Channel:", 0);
+ uiItemL(layout, "Despill Channel:", ICON_NULL);
row =uiLayoutRow(layout,0);
- uiItemR(row, ptr, "channel", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, ptr, "channel", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "limit_method", 0, NULL, 0);
+ uiItemR(col, ptr, "limit_method", 0, NULL, ICON_NULL);
if(RNA_enum_get(ptr, "limit_method")==0) {
- uiItemL(col, "Limiting Channel:", 0);
+ uiItemL(col, "Limiting Channel:", ICON_NULL);
row=uiLayoutRow(col,0);
- uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
}
- uiItemR(col, ptr, "ratio", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "use_unspill", 0, NULL, 0);
+ uiItemR(col, ptr, "ratio", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_unspill", 0, NULL, ICON_NULL);
if (RNA_enum_get(ptr, "use_unspill")== 1) {
- uiItemR(col, ptr, "unspill_red", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "unspill_green", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "unspill_blue", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "unspill_red", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "unspill_green", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "unspill_blue", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
}
-static void node_composit_buts_chroma_matte(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_chroma_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "tolerance", 0, NULL, 0);
- uiItemR(col, ptr, "threshold", 0, NULL, 0);
+ uiItemR(col, ptr, "tolerance", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "threshold", 0, NULL, ICON_NULL);
col= uiLayoutColumn(layout, 1);
- /*uiItemR(col, ptr, "lift", UI_ITEM_R_SLIDER, NULL, 0); Removed for now */
- uiItemR(col, ptr, "gain", UI_ITEM_R_SLIDER, NULL, 0);
- /*uiItemR(col, ptr, "shadow_adjust", UI_ITEM_R_SLIDER, NULL, 0); Removed for now*/
+ /*uiItemR(col, ptr, "lift", UI_ITEM_R_SLIDER, NULL, ICON_NULL); Removed for now */
+ uiItemR(col, ptr, "gain", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ /*uiItemR(col, ptr, "shadow_adjust", UI_ITEM_R_SLIDER, NULL, ICON_NULL); Removed for now*/
}
-static void node_composit_buts_color_matte(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_color_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "color_hue", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "color_saturation", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "color_value", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "color_hue", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "color_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "color_value", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
-static void node_composit_buts_channel_matte(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_channel_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col, *row;
- uiItemL(layout, "Color Space:", 0);
+ uiItemL(layout, "Color Space:", ICON_NULL);
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "color_space", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, ptr, "color_space", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
col=uiLayoutColumn(layout, 0);
- uiItemL(col, "Key Channel:", 0);
+ uiItemL(col, "Key Channel:", ICON_NULL);
row= uiLayoutRow(col, 0);
- uiItemR(row, ptr, "matte_channel", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, ptr, "matte_channel", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
col =uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "limit_method", 0, NULL, 0);
+ uiItemR(col, ptr, "limit_method", 0, NULL, ICON_NULL);
if(RNA_enum_get(ptr, "limit_method")==0) {
- uiItemL(col, "Limiting Channel:", 0);
+ uiItemL(col, "Limiting Channel:", ICON_NULL);
row=uiLayoutRow(col,0);
- uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
}
- uiItemR(col, ptr, "limit_max", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "limit_min", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "limit_max", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "limit_min", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
-static void node_composit_buts_luma_matte(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_luma_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "limit_max", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "limit_min", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "limit_max", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "limit_min", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
-static void node_composit_buts_map_uv(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_map_uv(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "alpha", 0, NULL, 0);
+ uiItemR(layout, ptr, "alpha", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_id_mask(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_id_mask(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "index", 0, NULL, 0);
+ uiItemR(layout, ptr, "index", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_file_output(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_file_output(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col, *row;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "filepath", 0, "", 0);
- uiItemR(col, ptr, "image_type", 0, "", 0);
+ uiItemR(col, ptr, "filepath", 0, "", ICON_NULL);
+ uiItemR(col, ptr, "image_type", 0, "", ICON_NULL);
row= uiLayoutRow(layout, 0);
if (RNA_enum_get(ptr, "image_type")== R_OPENEXR) {
- uiItemR(row, ptr, "use_exr_half", 0, NULL, 0);
- uiItemR(row, ptr, "exr_codec", 0, "", 0);
+ uiItemR(row, ptr, "use_exr_half", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "exr_codec", 0, "", ICON_NULL);
}
else if (RNA_enum_get(ptr, "image_type")== R_JPEG90) {
- uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, "Quality", 0);
+ uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, "Quality", ICON_NULL);
}
else if (RNA_enum_get(ptr, "image_type")== R_PNG) {
- uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, "Compression", 0);
+ uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, "Compression", ICON_NULL);
}
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "frame_start", 0, "Start", 0);
- uiItemR(row, ptr, "frame_end", 0, "End", 0);
+ uiItemR(row, ptr, "frame_start", 0, "Start", ICON_NULL);
+ uiItemR(row, ptr, "frame_end", 0, "End", ICON_NULL);
}
-static void node_composit_buts_scale(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_scale(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "space", 0, "", 0);
+ uiItemR(layout, ptr, "space", 0, "", ICON_NULL);
}
-static void node_composit_buts_rotate(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_rotate(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "filter_type", 0, "", 0);
+ uiItemR(layout, ptr, "filter_type", 0, "", ICON_NULL);
}
-static void node_composit_buts_invert(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_invert(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "invert_rgb", 0, NULL, 0);
- uiItemR(col, ptr, "invert_alpha", 0, NULL, 0);
+ uiItemR(col, ptr, "invert_rgb", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "invert_alpha", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_premulkey(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_premulkey(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "mapping", 0, "", 0);
+ uiItemR(layout, ptr, "mapping", 0, "", ICON_NULL);
}
-static void node_composit_buts_view_levels(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_view_levels(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "channel", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(layout, ptr, "channel", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
}
-static void node_composit_buts_colorbalance(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_colorbalance(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *split, *col, *row;
- uiItemR(layout, ptr, "correction_method", 0, NULL, 0);
+ uiItemR(layout, ptr, "correction_method", 0, NULL, ICON_NULL);
if (RNA_enum_get(ptr, "correction_method")== 0) {
@@ -957,17 +984,17 @@ static void node_composit_buts_colorbalance(uiLayout *layout, bContext *C, Point
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "lift", 1, 1, 0, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "lift", 0, NULL, 0);
+ uiItemR(row, ptr, "lift", 0, NULL, ICON_NULL);
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "gamma", 1, 1, 1, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "gamma", 0, NULL, 0);
+ uiItemR(row, ptr, "gamma", 0, NULL, ICON_NULL);
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "gain", 1, 1, 1, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "gain", 0, NULL, 0);
+ uiItemR(row, ptr, "gain", 0, NULL, ICON_NULL);
} else {
@@ -975,26 +1002,31 @@ static void node_composit_buts_colorbalance(uiLayout *layout, bContext *C, Point
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "offset", 1, 1, 0, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "offset", 0, NULL, 0);
+ uiItemR(row, ptr, "offset", 0, NULL, ICON_NULL);
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "power", 1, 1, 0, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "power", 0, NULL, 0);
+ uiItemR(row, ptr, "power", 0, NULL, ICON_NULL);
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "slope", 1, 1, 0, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "slope", 0, NULL, 0);
+ uiItemR(row, ptr, "slope", 0, NULL, ICON_NULL);
}
}
-static void node_composit_buts_huecorrect(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_huecorrect(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiTemplateCurveMapping(layout, ptr, "mapping", 'h', 0, 0);
}
+static void node_composit_buts_ycc(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "mode", 0, "", ICON_NULL);
+}
+
/* only once called */
static void node_composit_set_butfunc(bNodeType *ntype)
{
@@ -1136,6 +1168,13 @@ static void node_composit_set_butfunc(bNodeType *ntype)
case CMP_NODE_HUECORRECT:
ntype->uifunc=node_composit_buts_huecorrect;
break;
+ case CMP_NODE_ZCOMBINE:
+ ntype->uifunc=node_composit_buts_zcombine;
+ break;
+ case CMP_NODE_COMBYCCA:
+ case CMP_NODE_SEPYCCA:
+ ntype->uifunc=node_composit_buts_ycc;
+ break;
default:
ntype->uifunc= NULL;
}
@@ -1143,20 +1182,20 @@ static void node_composit_set_butfunc(bNodeType *ntype)
/* ****************** BUTTON CALLBACKS FOR TEXTURE NODES ***************** */
-static void node_texture_buts_bricks(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_texture_buts_bricks(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "offset", 0, "Offset", 0);
- uiItemR(col, ptr, "offset_frequency", 0, "Frequency", 0);
+ uiItemR(col, ptr, "offset", 0, "Offset", ICON_NULL);
+ uiItemR(col, ptr, "offset_frequency", 0, "Frequency", ICON_NULL);
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "squash", 0, "Squash", 0);
- uiItemR(col, ptr, "squash_frequency", 0, "Frequency", 0);
+ uiItemR(col, ptr, "squash", 0, "Squash", ICON_NULL);
+ uiItemR(col, ptr, "squash_frequency", 0, "Frequency", ICON_NULL);
}
-static void node_texture_buts_proc(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_texture_buts_proc(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
PointerRNA tex_ptr;
bNode *node= ptr->data;
@@ -1170,42 +1209,42 @@ static void node_texture_buts_proc(uiLayout *layout, bContext *C, PointerRNA *pt
switch( tex->type ) {
case TEX_BLEND:
- uiItemR(col, &tex_ptr, "progression", 0, "", 0);
+ uiItemR(col, &tex_ptr, "progression", 0, "", ICON_NULL);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "use_flip_axis", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &tex_ptr, "use_flip_axis", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
break;
case TEX_MARBLE:
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "stype", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &tex_ptr, "marble_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "noisebasis_2", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &tex_ptr, "noisebasis_2", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
break;
case TEX_WOOD:
- uiItemR(col, &tex_ptr, "noise_basis", 0, "", 0);
- uiItemR(col, &tex_ptr, "stype", 0, "", 0);
+ uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NULL);
+ uiItemR(col, &tex_ptr, "wood_type", 0, "", ICON_NULL);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "noisebasis_2", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &tex_ptr, "noisebasis_2", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
row= uiLayoutRow(col, 0);
- uiLayoutSetActive(row, !(RNA_enum_get(&tex_ptr, "stype")==TEX_BAND || RNA_enum_get(&tex_ptr, "stype")==TEX_RING));
- uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, 0);
+ uiLayoutSetActive(row, !(RNA_enum_get(&tex_ptr, "wood_type")==TEX_BAND || RNA_enum_get(&tex_ptr, "wood_type")==TEX_RING));
+ uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
break;
case TEX_CLOUDS:
- uiItemR(col, &tex_ptr, "noise_basis", 0, "", 0);
+ uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NULL);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "stype", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &tex_ptr, "cloud_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, 0);
- uiItemR(col, &tex_ptr, "noise_depth", UI_ITEM_R_EXPAND, "Depth", 0);
+ uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(col, &tex_ptr, "noise_depth", UI_ITEM_R_EXPAND, "Depth", ICON_NULL);
break;
case TEX_DISTNOISE:
- uiItemR(col, &tex_ptr, "noise_basis", 0, "", 0);
- uiItemR(col, &tex_ptr, "noise_distortion", 0, "", 0);
+ uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NULL);
+ uiItemR(col, &tex_ptr, "noise_distortion", 0, "", ICON_NULL);
break;
}
}
@@ -1215,9 +1254,9 @@ static void node_texture_buts_image(uiLayout *layout, bContext *C, PointerRNA *p
uiTemplateID(layout, C, ptr, "image", NULL, "IMAGE_OT_open", NULL);
}
-static void node_texture_buts_output(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_texture_buts_output(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "filepath", 0, "", 0);
+ uiItemR(layout, ptr, "filepath", 0, "", ICON_NULL);
}
/* only once called */
@@ -1332,9 +1371,32 @@ void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage)
}
if(ibuf->rect) {
- glPixelZoom(snode->zoom, snode->zoom);
- glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
- glPixelZoom(1.0f, 1.0f);
+ if (snode->flag & SNODE_SHOW_ALPHA) {
+ glPixelZoom(snode->zoom, snode->zoom);
+ /* swap bytes, so alpha is most significant one, then just draw it as luminance int */
+ if(ENDIAN_ORDER == B_ENDIAN)
+ glPixelStorei(GL_UNPACK_SWAP_BYTES, 1);
+
+ glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_LUMINANCE, GL_UNSIGNED_INT, ibuf->rect);
+
+ glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);
+ glPixelZoom(1.0f, 1.0f);
+ } else if (snode->flag & SNODE_USE_ALPHA) {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glPixelZoom(snode->zoom, snode->zoom);
+
+ glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
+
+ glPixelZoom(1.0f, 1.0f);
+ glDisable(GL_BLEND);
+ } else {
+ glPixelZoom(snode->zoom, snode->zoom);
+
+ glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
+
+ glPixelZoom(1.0f, 1.0f);
+ }
}
glMatrixMode(GL_PROJECTION);
@@ -1347,6 +1409,47 @@ void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage)
}
}
+void draw_nodespace_color_info(ARegion *ar, int channels, int x, int y, char *cp, float *fp)
+{
+ char str[256];
+ int ofs;
+
+ ofs= sprintf(str, "X: %4d Y: %4d ", x, y);
+
+ if(channels==4) {
+ if(cp)
+ ofs+= sprintf(str+ofs, "| R: %3d G: %3d B: %3d A: %3d ", cp[0], cp[1], cp[2], cp[3]);
+ if (fp)
+ ofs+= sprintf(str+ofs, "| R: %.3f G: %.3f B: %.3f A: %.3f ", fp[0], fp[1], fp[2], fp[3]);
+ }
+ else if(channels==1) {
+ if(cp)
+ ofs+= sprintf(str+ofs, "| Val: %3d ", cp[0]);
+ if (fp)
+ ofs+= sprintf(str+ofs, "| Val: %.3f ", fp[0]);
+ }
+ else if(channels==3) {
+ if(cp)
+ ofs+= sprintf(str+ofs, "| R: %3d G: %3d B: %3d ", cp[0], cp[1], cp[2]);
+ if (fp)
+ ofs+= sprintf(str+ofs, "| R: %.3f G: %.3f B: %.3f ", fp[0], fp[1], fp[2]);
+ }
+
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+
+ glColor4f(.0,.0,.0,.25);
+ glRecti(0.0, 0.0, ar->winrct.xmax - ar->winrct.xmin + 1, 20);
+ glDisable(GL_BLEND);
+
+ glColor3ub(255, 255, 255);
+
+ // UI_DrawString(6, 6, str); // works ok but fixed width is nicer.
+ BLF_size(blf_mono_font, 11, 72);
+ BLF_position(blf_mono_font, 6, 6, 0);
+ BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+}
+
#if 0
/* note: needs to be userpref or opengl profile option */
static void draw_nodespace_back_tex(ScrArea *sa, SpaceNode *snode)
@@ -1445,7 +1548,7 @@ int node_link_bezier_points(View2D *v2d, SpaceNode *snode, bNodeLink *link, floa
}
#define LINK_RESOL 24
-void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int th_col2, int do_shaded)
+void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 )
{
float coord_array[LINK_RESOL+1][2];
@@ -1453,32 +1556,59 @@ void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int t
float dist, spline_step = 0.0f;
int i;
+ /* store current linewidth */
+ float linew;
+ glGetFloatv(GL_LINE_WIDTH, &linew);
+
/* we can reuse the dist variable here to increment the GL curve eval amount*/
dist = 1.0f/(float)LINK_RESOL;
+ glEnable(GL_LINE_SMOOTH);
+
+ if(do_triple) {
+ UI_ThemeColorShadeAlpha(th_col3, -80, -120);
+ glLineWidth(4.0f);
+
+ glBegin(GL_LINE_STRIP);
+ for(i=0; i<=LINK_RESOL; i++) {
+ glVertex2fv(coord_array[i]);
+ }
+ glEnd();
+ }
+
+ UI_ThemeColor(th_col1);
+ glLineWidth(1.5f);
+
glBegin(GL_LINE_STRIP);
for(i=0; i<=LINK_RESOL; i++) {
if(do_shaded) {
UI_ThemeColorBlend(th_col1, th_col2, spline_step);
spline_step += dist;
- }
+ }
glVertex2fv(coord_array[i]);
}
glEnd();
+
+ glDisable(GL_LINE_SMOOTH);
+
+ /* restore previuos linewidth */
+ glLineWidth(linew);
}
}
/* note; this is used for fake links in groups too */
void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
{
- int do_shaded= 1, th_col1= TH_WIRE, th_col2= TH_WIRE;
+ int do_shaded= 0, th_col1= TH_HEADER, th_col2= TH_HEADER;
+ int do_triple= 0, th_col3= TH_WIRE;
if(link->fromnode==NULL && link->tonode==NULL)
return;
+ /* new connection */
if(link->fromnode==NULL || link->tonode==NULL) {
- UI_ThemeColor(TH_WIRE);
- do_shaded= 0;
+ th_col1 = TH_ACTIVE;
+ do_triple = 1;
}
else {
/* going to give issues once... */
@@ -1489,8 +1619,7 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
/* a bit ugly... but thats how we detect the internal group links */
if(link->fromnode==link->tonode) {
- UI_ThemeColorBlend(TH_BACK, TH_WIRE, 0.25f);
- do_shaded= 0;
+ th_col1 = TH_GRID;
}
else {
/* check cyclic */
@@ -1499,15 +1628,16 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
th_col1= TH_EDGE_SELECT;
if(link->tonode->flag & SELECT)
th_col2= TH_EDGE_SELECT;
+ do_shaded= 1;
+ do_triple= 1;
}
else {
- UI_ThemeColor(TH_REDALERT);
- do_shaded= 0;
+ th_col1 = TH_REDALERT;
}
}
}
- node_draw_link_bezier(v2d, snode, link, th_col1, th_col2, do_shaded);
+ node_draw_link_bezier(v2d, snode, link, th_col1, do_shaded, th_col2, do_triple, th_col3);
}
diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c
index 11319d817c7..69a6029e140 100644
--- a/source/blender/editors/space_node/node_buttons.c
+++ b/source/blender/editors/space_node/node_buttons.c
@@ -31,20 +31,20 @@
#include <math.h>
#include <float.h>
+#include "MEM_guardedalloc.h"
+
#include "DNA_node_types.h"
#include "DNA_scene_types.h"
-#include "MEM_guardedalloc.h"
-
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_node.h"
#include "BKE_screen.h"
-
#include "WM_api.h"
#include "WM_types.h"
@@ -63,7 +63,7 @@
#define B_NOP 1
#define B_REDR 2
-static void do_node_region_buttons(bContext *C, void *arg, int event)
+static void do_node_region_buttons(bContext *C, void *UNUSED(arg), int event)
{
//SpaceNode *snode= CTX_wm_space_node(C);
@@ -75,7 +75,7 @@ static void do_node_region_buttons(bContext *C, void *arg, int event)
}
/* poll callback for active node */
-static int active_node_poll(const bContext *C, PanelType *pt)
+static int active_node_poll(const bContext *C, PanelType *UNUSED(pt))
{
SpaceNode *snode= CTX_wm_space_node(C);
@@ -135,7 +135,7 @@ void node_buttons_register(ARegionType *art)
BLI_addtail(&art->paneltypes, pt);
}
-static int node_properties(bContext *C, wmOperator *op)
+static int node_properties(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= node_has_buttons_region(sa);
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index 0b33196c646..10697f88173 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -40,10 +40,12 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_main.h"
+#include "BKE_node.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -77,8 +79,8 @@ void ED_node_changed_update(ID *id, bNode *node)
node_tree_from_ID(id, &nodetree, &edittree, &treetype);
if(treetype==NTREE_SHADER) {
- DAG_id_flush_update(id, 0);
- WM_main_add_notifier(NC_MATERIAL|ND_SHADING, id);
+ DAG_id_tag_update(id, 0);
+ WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, id);
}
else if(treetype==NTREE_COMPOSIT) {
NodeTagChanged(edittree, node);
@@ -91,7 +93,7 @@ void ED_node_changed_update(ID *id, bNode *node)
WM_main_add_notifier(NC_SCENE|ND_NODES, id);
}
else if(treetype==NTREE_TEXTURE) {
- DAG_id_flush_update(id, 0);
+ DAG_id_tag_update(id, 0);
WM_main_add_notifier(NC_TEXTURE|ND_NODES, id);
}
}
@@ -111,7 +113,7 @@ static int has_nodetree(bNodeTree *ntree, bNodeTree *lookup)
return 0;
}
-void ED_node_generic_update(Main *bmain, Scene *scene, bNodeTree *ntree, bNode *node)
+void ED_node_generic_update(Main *bmain, bNodeTree *ntree, bNode *node)
{
Material *ma;
Tex *tex;
@@ -173,7 +175,7 @@ static void node_uiblocks_init(const bContext *C, bNodeTree *ntree)
if (node->flag & NODE_SELECT) {
/* ui block */
- sprintf(str, "node buttons %p", node);
+ sprintf(str, "node buttons %p", (void *)node);
node->block= uiBeginBlock(C, CTX_wm_region(C), str, UI_EMBOSS);
uiBlockSetHandleFunc(node->block, do_node_internal_buttons, node);
}
@@ -184,7 +186,7 @@ static void node_uiblocks_init(const bContext *C, bNodeTree *ntree)
if (!(node->flag & (NODE_GROUP_EDIT|NODE_SELECT))) {
/* ui block */
- sprintf(str, "node buttons %p", node);
+ sprintf(str, "node buttons %p", (void *)node);
node->block= uiBeginBlock(C, CTX_wm_region(C), str, UI_EMBOSS);
uiBlockSetHandleFunc(node->block, do_node_internal_buttons, node);
}
@@ -263,10 +265,6 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
BLI_unlock_thread(LOCK_PREVIEW);
}
- /* XXX ugly hack, typeinfo for group is generated */
- if(node->type == NODE_GROUP)
- node->typeinfo->uifunc= node_buts_group;
-
/* buttons rect? */
if((node->flag & NODE_OPTIONS) && node->typeinfo->uifunc) {
dy-= NODE_DYS/2;
@@ -309,7 +307,7 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
}
/* based on settings in node, sets drawing rect info. each redraw! */
-static void node_update_hidden(const bContext *C, bNode *node)
+static void node_update_hidden(bNode *node)
{
bNodeSocket *nsock;
float rad, drad, hiddenrad= HIDDEN_RAD;
@@ -392,7 +390,7 @@ static void node_update_group(const bContext *C, bNodeTree *ntree, bNode *gnode)
node->locy+= gnode->locy;
if(node->flag & NODE_HIDDEN)
- node_update_hidden(C, node);
+ node_update_hidden(node);
else
node_update(C, ntree, node);
node->locx-= gnode->locx;
@@ -432,11 +430,9 @@ static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node)
{
bNodeSocket *valsock= NULL, *colsock= NULL, *vecsock= NULL;
bNodeSocket *sock;
- bNodeLink link;
+ bNodeLink link= {0};
int a;
- memset(&link, 0, sizeof(bNodeLink));
-
/* connect the first value buffer in with first value out */
/* connect the first RGBA buffer in with first RGBA out */
@@ -450,7 +446,6 @@ static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node)
}
/* outputs, draw lines */
- UI_ThemeColor(TH_REDALERT);
glEnable(GL_BLEND);
glEnable( GL_LINE_SMOOTH );
@@ -461,17 +456,17 @@ static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node)
if(sock->type==SOCK_VALUE && valsock) {
link.fromsock= valsock;
- node_draw_link_bezier(v2d, snode, &link, TH_WIRE, TH_WIRE, 0);
+ node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
valsock= NULL;
}
if(sock->type==SOCK_VECTOR && vecsock) {
link.fromsock= vecsock;
- node_draw_link_bezier(v2d, snode, &link, TH_WIRE, TH_WIRE, 0);
+ node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
vecsock= NULL;
}
if(sock->type==SOCK_RGBA && colsock) {
link.fromsock= colsock;
- node_draw_link_bezier(v2d, snode, &link, TH_WIRE, TH_WIRE, 0);
+ node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
colsock= NULL;
}
}
@@ -483,7 +478,7 @@ static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node)
/* nice AA filled circle */
/* this might have some more generic use */
-static void circle_draw(float x, float y, float size, int type, int col[3])
+static void circle_draw(float x, float y, float size, int col[3])
{
/* 16 values of sin function */
static float si[16] = {
@@ -538,11 +533,11 @@ static void socket_circle_draw(bNodeSocket *sock, float size)
else {
col[0]= 100; col[1]= 200; col[2]= 100;
}
-
- circle_draw(sock->locx, sock->locy, size, sock->type, col);
+
+ circle_draw(sock->locx, sock->locy, size, col);
}
-static void node_sync_cb(bContext *C, void *snode_v, void *node_v)
+static void node_sync_cb(bContext *UNUSED(C), void *snode_v, void *node_v)
{
SpaceNode *snode= snode_v;
@@ -572,7 +567,7 @@ static uiBlock *socket_vector_menu(bContext *C, ARegion *ar, void *socket_v)
layout= uiLayoutColumn(uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, sock->locx, sock->locy-8, 140, 20, U.uistyles.first), 0);
- uiItemR(layout, &ptr, "default_value", UI_ITEM_R_EXPAND, "", 0);
+ uiItemR(layout, &ptr, "default_value", UI_ITEM_R_EXPAND, "", ICON_NULL);
return block;
}
@@ -618,12 +613,11 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv)
glPixelZoom(xscale, yscale);
glEnable(GL_BLEND);
- glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA ); /* premul graphics */
+ glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); /* premul graphics */
glColor4f(1.0, 1.0, 1.0, 1.0);
glaDrawPixelsTex(prv->xmin, prv->ymin, preview->xsize, preview->ysize, GL_UNSIGNED_BYTE, preview->rect);
- glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glDisable(GL_BLEND);
glPixelZoom(1.0f, 1.0f);
@@ -632,7 +626,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv)
}
-static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bNode *node)
+static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node)
{
bNodeSocket *sock;
uiBut *bt;
@@ -641,7 +635,6 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
int /*ofs,*/ color_id= node_get_colorid(node);
char showname[128]; /* 128 used below */
View2D *v2d = &ar->v2d;
- bNodeTree *ntree = snode->nodetree;
PointerRNA ptr;
/* hurmf... another candidate for callback, have to see how this works first */
@@ -665,6 +658,9 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
UI_ThemeColorShade(color_id, -20);
else
UI_ThemeColor(color_id);
+
+ if(node->flag & NODE_MUTED)
+ UI_ThemeColorBlend(color_id, TH_REDALERT, 0.5f);
uiSetRoundBox(3);
uiRoundBox(rct->xmin, rct->ymax-NODE_DY, rct->xmax, rct->ymax, BASIS_RAD);
@@ -714,18 +710,18 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
UI_ThemeColorBlendShade(TH_TEXT, color_id, 0.4f, 10);
/* open/close entirely? */
- ui_draw_tria_icon(rct->xmin+8.0f, rct->ymax-NODE_DY+4.0f, 'v');
+ ui_draw_tria_icon(rct->xmin+10.0f, rct->ymax-NODE_DY/2.0f, 'v');
+ /* this isn't doing anything for the label, so commenting out
if(node->flag & SELECT)
UI_ThemeColor(TH_TEXT_HI);
else
- UI_ThemeColor(TH_TEXT);
+ UI_ThemeColor(TH_TEXT); */
- if(node->flag & NODE_CUSTOM_NAME)
- BLI_strncpy(showname, node->name, sizeof(showname));
+ if (node->typeinfo->labelfunc)
+ BLI_strncpy(showname, node->typeinfo->labelfunc(node), sizeof(showname));
else
- /* todo: auto name display for node types */
- BLI_strncpy(showname, node->name, sizeof(showname));
+ BLI_strncpy(showname, node->typeinfo->name, sizeof(showname));
//if(node->flag & NODE_MUTED)
// sprintf(showname, "[%s]", showname);
@@ -743,12 +739,19 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
/* scaling indicator */
node_scaling_widget(TH_NODE, snode->aspect, rct->xmax-BASIS_RAD*snode->aspect, rct->ymin, rct->xmax, rct->ymin+BASIS_RAD*snode->aspect);
- /* outline active emphasis */
- if(node->flag & NODE_ACTIVE) {
+ /* outline active and selected emphasis */
+ if( node->flag & (NODE_ACTIVE|SELECT) ) {
glEnable(GL_BLEND);
- glColor4ub(200, 200, 200, 140);
- uiSetRoundBox(15-4);
- uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD);
+ glEnable( GL_LINE_SMOOTH );
+ /* using different shades of TH_TEXT_HI for the empasis, like triangle */
+ if( node->flag & NODE_ACTIVE )
+ UI_ThemeColorShadeAlpha(TH_TEXT_HI, 0, -40);
+ else
+ UI_ThemeColorShadeAlpha(TH_TEXT_HI, -20, -120);
+ uiSetRoundBox(15-4); // round all corners except lower right
+ uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD);
+
+ glDisable( GL_LINE_SMOOTH );
glDisable(GL_BLEND);
}
@@ -849,14 +852,22 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
ui_dropshadow(rct, hiddenrad, snode->aspect, node->flag & SELECT);
/* body */
- UI_ThemeColor(color_id);
+ UI_ThemeColor(color_id);
+ if(node->flag & NODE_MUTED)
+ UI_ThemeColorBlend(color_id, TH_REDALERT, 0.5f);
uiRoundBox(rct->xmin, rct->ymin, rct->xmax, rct->ymax, hiddenrad);
- /* outline active emphasis */
- if(node->flag & NODE_ACTIVE) {
+ /* outline active and selected emphasis */
+ if( node->flag & (NODE_ACTIVE|SELECT) ) {
glEnable(GL_BLEND);
- glColor4ub(200, 200, 200, 140);
- uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, hiddenrad);
+ glEnable( GL_LINE_SMOOTH );
+ /* using different shades of TH_TEXT_HI for the empasis, like triangle */
+ if( node->flag & NODE_ACTIVE )
+ UI_ThemeColorShadeAlpha(TH_TEXT_HI, 0, -40);
+ else
+ UI_ThemeColorShadeAlpha(TH_TEXT_HI, -20, -120);
+ uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, hiddenrad);
+ glDisable( GL_LINE_SMOOTH );
glDisable(GL_BLEND);
}
@@ -867,7 +878,7 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
UI_ThemeColorBlendShade(TH_TEXT, color_id, 0.4f, 10);
/* open entirely icon */
- ui_draw_tria_icon(rct->xmin+9.0f, centy-6.0f, 'h');
+ ui_draw_tria_icon(rct->xmin+10.0f, centy, 'h');
/* disable lines */
if(node->flag & NODE_MUTED)
@@ -879,14 +890,11 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
UI_ThemeColor(TH_TEXT);
if(node->miniwidth>0.0f) {
-
-
- if(node->flag & NODE_CUSTOM_NAME)
- BLI_strncpy(showname, node->name, sizeof(showname));
+ if (node->typeinfo->labelfunc)
+ BLI_strncpy(showname, node->typeinfo->labelfunc(node), sizeof(showname));
else
- /* todo: auto name display */
- BLI_strncpy(showname, node->name, sizeof(showname));
-
+ BLI_strncpy(showname, node->typeinfo->name, sizeof(showname));
+
//if(node->flag & NODE_MUTED)
// sprintf(showname, "[%s]", showname);
@@ -945,7 +953,7 @@ static void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode,
else if(node->flag & NODE_HIDDEN)
node_draw_hidden(C, ar, snode, node);
else
- node_draw_basis(C, ar, snode, node);
+ node_draw_basis(C, ar, snode, ntree, node);
}
}
@@ -956,7 +964,7 @@ static void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode,
else if(node->flag & NODE_HIDDEN)
node_draw_hidden(C, ar, snode, node);
else
- node_draw_basis(C, ar, snode, node);
+ node_draw_basis(C, ar, snode, ntree, node);
}
}
}
@@ -997,18 +1005,19 @@ static void node_draw_group_links(View2D *v2d, SpaceNode *snode, bNode *gnode)
}
/* groups are, on creation, centered around 0,0 */
-static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bNode *gnode)
+static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *gnode)
{
bNodeTree *ngroup= (bNodeTree *)gnode->id;
bNodeSocket *sock;
rctf rect= gnode->totr;
- char showname[128];
+ uiLayout *layout;
+ PointerRNA ptr;
/* backdrop header */
glEnable(GL_BLEND);
uiSetRoundBox(3);
UI_ThemeColorShadeAlpha(TH_NODE_GROUP, 0, -70);
- uiDrawBox(GL_POLYGON, rect.xmin, rect.ymax, rect.xmax, rect.ymax+NODE_DY, BASIS_RAD);
+ uiDrawBox(GL_POLYGON, rect.xmin, rect.ymax, rect.xmax, rect.ymax+26, BASIS_RAD);
/* backdrop body */
UI_ThemeColorShadeAlpha(TH_BACK, -8, -70);
@@ -1019,21 +1028,24 @@ static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bN
uiSetRoundBox(15);
glColor4ub(200, 200, 200, 140);
glEnable( GL_LINE_SMOOTH );
- uiDrawBox(GL_LINE_LOOP, rect.xmin, rect.ymin, rect.xmax, rect.ymax+NODE_DY, BASIS_RAD);
+ uiDrawBox(GL_LINE_LOOP, rect.xmin, rect.ymin, rect.xmax, rect.ymax+26, BASIS_RAD);
glDisable( GL_LINE_SMOOTH );
glDisable(GL_BLEND);
/* backdrop title */
UI_ThemeColor(TH_TEXT_HI);
- if (gnode->flag & NODE_CUSTOM_NAME)
- BLI_strncpy(showname, gnode->name, sizeof(showname));
- else
- BLI_strncpy(showname, ngroup->id.name+2, sizeof(showname));
+ layout = uiBlockLayout(gnode->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, (short)(rect.xmin+15), (short)(rect.ymax+23),
+ MIN2((int)(rect.xmax - rect.xmin-18.0f), 140), 20, U.uistyles.first);
+ RNA_pointer_create(&ntree->id, &RNA_Node, gnode, &ptr);
+ uiTemplateIDBrowse(layout, (bContext*)C, &ptr, "node_tree", NULL, NULL, NULL);
+ uiBlockLayoutResolve(gnode->block, NULL, NULL);
+
+ uiEndBlock(C, gnode->block);
+ uiDrawBlock(C, gnode->block);
+ gnode->block= NULL;
+
- // XXX this shows some scaling artifacts
- UI_DrawString(rect.xmin+8.0f, rect.ymax+5.0f, showname);
-
/* links from groupsockets to the internal nodes */
node_draw_group_links(&ar->v2d, snode, gnode);
@@ -1045,6 +1057,8 @@ static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bN
if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
socket_circle_draw(sock, NODE_SOCKSIZE);
+
+
/* and finally the whole tree */
node_draw_nodetree(C, ar, snode, ngroup);
}
@@ -1059,7 +1073,7 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
//uiFreeBlocksWin(&sa->uiblocks, sa->win);
@@ -1071,7 +1085,7 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
snode->aspect= (v2d->cur.xmax - v2d->cur.xmin)/((float)ar->winx);
// XXX snode->curfont= uiSetCurFont_ext(snode->aspect);
- UI_view2d_constant_grid_draw(C, v2d);
+ UI_view2d_constant_grid_draw(v2d);
/* backdrop */
draw_nodespace_back_pix(ar, snode, color_manage);
@@ -1096,7 +1110,7 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
if(node->flag & NODE_GROUP_EDIT)
node_update_group(C, snode->nodetree, node);
else if(node->flag & NODE_HIDDEN)
- node_update_hidden(C, node);
+ node_update_hidden(node);
else
node_update(C, snode->nodetree, node);
}
@@ -1106,7 +1120,7 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
/* active group */
for(node= snode->nodetree->nodes.first; node; node= node->next) {
if(node->flag & NODE_GROUP_EDIT)
- node_draw_group(C, ar, snode, node);
+ node_draw_group(C, ar, snode, snode->nodetree, node);
}
}
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index b6dc0b4db7c..624630b9846 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -40,6 +40,11 @@
#include "DNA_node_types.h"
#include "DNA_scene_types.h"
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_storage_types.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_image.h"
@@ -48,20 +53,17 @@
#include "BKE_node.h"
#include "BKE_material.h"
#include "BKE_paint.h"
+#include "BKE_screen.h"
#include "BKE_texture.h"
#include "BKE_report.h"
-
-#include "BLI_math.h"
-#include "BLI_blenlib.h"
-#include "BLI_storage_types.h"
-
#include "RE_pipeline.h"
#include "IMB_imbuf_types.h"
#include "ED_node.h"
#include "ED_screen.h"
+#include "ED_space_api.h"
#include "ED_render.h"
#include "RNA_access.h"
@@ -73,6 +75,8 @@
#include "UI_interface.h"
#include "UI_view2d.h"
+#include "IMB_imbuf.h"
+
#include "node_intern.h"
#define SOCK_IN 1
@@ -98,7 +102,7 @@ static int compo_breakjob(void *cjv)
}
/* called by compo, wmJob sends notifier */
-static void compo_redrawjob(void *cjv, char *str)
+static void compo_redrawjob(void *cjv, char *UNUSED(str))
{
CompoJob *cj= cjv;
@@ -194,6 +198,17 @@ void snode_composite_job(const bContext *C, ScrArea *sa)
/* ***************************************** */
+/* operator poll callback */
+static int composite_node_active(bContext *C)
+{
+ if( ED_operator_node_active(C)) {
+ SpaceNode *snode= CTX_wm_space_node(C);
+ if(snode->treetype==NTREE_COMPOSIT)
+ return 1;
+ }
+ return 0;
+}
+
/* also checks for edited groups */
bNode *editnode_get_active(bNodeTree *ntree)
{
@@ -211,6 +226,8 @@ bNode *editnode_get_active(bNodeTree *ntree)
void snode_notify(bContext *C, SpaceNode *snode)
{
+ WM_event_add_notifier(C, NC_NODE|NA_EDITED, NULL);
+
if(snode->treetype==NTREE_SHADER)
WM_event_add_notifier(C, NC_MATERIAL|ND_NODES, snode->id);
else if(snode->treetype==NTREE_COMPOSIT)
@@ -244,7 +261,7 @@ void ED_node_shader_default(Material *ma)
return;
}
- ma->nodetree= ntreeAddTree(NTREE_SHADER);
+ ma->nodetree= ntreeAddTree("Shader Nodetree", NTREE_SHADER, FALSE);
out= nodeAddNodeType(ma->nodetree, SH_NODE_OUTPUT, NULL, NULL);
out->locx= 300.0f; out->locy= 300.0f;
@@ -275,15 +292,17 @@ void ED_node_composit_default(Scene *sce)
return;
}
- sce->nodetree= ntreeAddTree(NTREE_COMPOSIT);
+ sce->nodetree= ntreeAddTree("Compositing Nodetree", NTREE_COMPOSIT, FALSE);
out= nodeAddNodeType(sce->nodetree, CMP_NODE_COMPOSITE, NULL, NULL);
out->locx= 300.0f; out->locy= 400.0f;
out->id= &sce->id;
+ id_us_plus(out->id);
in= nodeAddNodeType(sce->nodetree, CMP_NODE_R_LAYERS, NULL, NULL);
in->locx= 10.0f; in->locy= 400.0f;
in->id= &sce->id;
+ id_us_plus(in->id);
nodeSetActive(sce->nodetree, in);
/* links from color to color */
@@ -310,7 +329,7 @@ void ED_node_texture_default(Tex *tx)
return;
}
- tx->nodetree= ntreeAddTree(NTREE_TEXTURE);
+ tx->nodetree= ntreeAddTree("Texture Nodetree", NTREE_TEXTURE, FALSE);
out= nodeAddNodeType(tx->nodetree, TEX_NODE_OUTPUT, NULL, NULL);
out->locx= 300.0f; out->locy= 300.0f;
@@ -326,6 +345,7 @@ void ED_node_texture_default(Tex *tx)
ntreeSolveOrder(tx->nodetree); /* needed for pointers */
}
+/* id is supposed to contain a node tree */
void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *treetype)
{
bNode *node= NULL;
@@ -343,6 +363,10 @@ void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *tre
*ntree= ((Tex*)id)->nodetree;
if(treetype) *treetype= NTREE_TEXTURE;
}
+ else {
+ if(treetype) *treetype= 0;
+ return;
+ }
/* find editable group */
if(edittree) {
@@ -431,11 +455,25 @@ void node_set_active(SpaceNode *snode, bNode *node)
nodeSetActive(snode->edittree, node);
if(node->type!=NODE_GROUP) {
+ int was_output= (node->flag & NODE_DO_OUTPUT);
+
/* tree specific activate calls */
if(snode->treetype==NTREE_SHADER) {
/* when we select a material, active texture is cleared, for buttons */
if(node->id && GS(node->id->name)==ID_MA)
nodeClearActiveID(snode->edittree, ID_TE);
+
+ if(node->type==SH_NODE_OUTPUT) {
+ bNode *tnode;
+
+ for(tnode= snode->edittree->nodes.first; tnode; tnode= tnode->next)
+ if( tnode->type==SH_NODE_OUTPUT)
+ tnode->flag &= ~NODE_DO_OUTPUT;
+
+ node->flag |= NODE_DO_OUTPUT;
+ if(was_output==0)
+ ED_node_changed_update(snode->id, node);
+ }
// XXX
#if 0
@@ -452,7 +490,7 @@ void node_set_active(SpaceNode *snode, bNode *node)
/* make active viewer, currently only 1 supported... */
if( ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
bNode *tnode;
- int was_output= (node->flag & NODE_DO_OUTPUT);
+
for(tnode= snode->edittree->nodes.first; tnode; tnode= tnode->next)
if( ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))
@@ -480,6 +518,16 @@ void node_set_active(SpaceNode *snode, bNode *node)
scene->r.actlay= node->custom1;
}
}
+ else if(node->type==CMP_NODE_COMPOSITE) {
+ bNode *tnode;
+
+ for(tnode= snode->edittree->nodes.first; tnode; tnode= tnode->next)
+ if( tnode->type==CMP_NODE_COMPOSITE)
+ tnode->flag &= ~NODE_DO_OUTPUT;
+
+ node->flag |= NODE_DO_OUTPUT;
+ ED_node_changed_update(snode->id, node);
+ }
}
else if(snode->treetype==NTREE_TEXTURE) {
// XXX
@@ -541,7 +589,7 @@ void snode_make_group_editable(SpaceNode *snode, bNode *gnode)
ntreeSolveOrder(snode->nodetree);
}
-static int node_group_edit_exec(bContext *C, wmOperator *op)
+static int node_group_edit_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode = CTX_wm_space_node(C);
bNode *gnode;
@@ -556,7 +604,7 @@ static int node_group_edit_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int node_group_edit_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int node_group_edit_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
SpaceNode *snode = CTX_wm_space_node(C);
bNode *gnode;
@@ -605,11 +653,11 @@ static int node_group_ungroup_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
if(gnode->type!=NODE_GROUP) {
- BKE_report(op->reports, RPT_ERROR, "Not a group");
+ BKE_report(op->reports, RPT_WARNING, "Not a group");
return OPERATOR_CANCELLED;
}
else if(!nodeGroupUnGroup(snode->edittree, gnode)) {
- BKE_report(op->reports, RPT_ERROR, "Can't ungroup");
+ BKE_report(op->reports, RPT_WARNING, "Can't ungroup");
return OPERATOR_CANCELLED;
}
@@ -736,6 +784,8 @@ static int snode_bg_viewmove_modal(bContext *C, wmOperator *op, wmEvent *event)
MEM_freeN(nvm);
op->customdata= NULL;
+
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_NODE, NULL);
return OPERATOR_FINISHED;
}
@@ -750,12 +800,15 @@ static int snode_bg_viewmove_invoke(bContext *C, wmOperator *op, wmEvent *event)
Image *ima;
ImBuf *ibuf;
int pad= 10;
+ void *lock;
ima= BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node");
- ibuf= BKE_image_get_ibuf(ima, NULL);
+ ibuf= BKE_image_acquire_ibuf(ima, NULL, &lock);
- if(ibuf == NULL)
+ if(ibuf == NULL) {
+ BKE_image_release_ibuf(ima, lock);
return OPERATOR_CANCELLED;
+ }
nvm= MEM_callocN(sizeof(NodeViewMove), "NodeViewMove struct");
op->customdata= nvm;
@@ -766,6 +819,8 @@ static int snode_bg_viewmove_invoke(bContext *C, wmOperator *op, wmEvent *event)
nvm->xmax = ar->winx/2 + ibuf->x/2 - pad;
nvm->ymin = -(ar->winy/2) - ibuf->y/2 + pad;
nvm->ymax = ar->winy/2 + ibuf->y/2 - pad;
+
+ BKE_image_release_ibuf(ima, lock);
/* add modal handler */
WM_event_add_modal_handler(C, op);
@@ -778,12 +833,13 @@ void NODE_OT_backimage_move(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Background Image Move";
+ ot->description = "Move Node backdrop";
ot->idname= "NODE_OT_backimage_move";
/* api callbacks */
ot->invoke= snode_bg_viewmove_invoke;
ot->modal= snode_bg_viewmove_modal;
- ot->poll= ED_operator_node_active;
+ ot->poll= composite_node_active;
/* flags */
ot->flag= OPTYPE_BLOCKING;
@@ -811,7 +867,7 @@ void NODE_OT_backimage_zoom(wmOperatorType *ot)
/* api callbacks */
ot->exec= backimage_zoom;
- ot->poll= ED_operator_node_active;
+ ot->poll= composite_node_active;
/* flags */
ot->flag= OPTYPE_BLOCKING;
@@ -820,6 +876,169 @@ void NODE_OT_backimage_zoom(wmOperatorType *ot)
RNA_def_float(ot->srna, "factor", 1.2f, 0.0f, 10.0f, "Factor", "", 0.0f, 10.0f);
}
+/******************** sample backdrop operator ********************/
+
+typedef struct ImageSampleInfo {
+ ARegionType *art;
+ void *draw_handle;
+ int x, y;
+ int channels;
+ int color_manage;
+
+ char col[4];
+ float colf[4];
+
+ int draw;
+} ImageSampleInfo;
+
+static void sample_draw(const bContext *UNUSED(C), ARegion *ar, void *arg_info)
+{
+ ImageSampleInfo *info= arg_info;
+
+ draw_nodespace_color_info(ar, info->channels, info->x, info->y, info->col, info->colf);
+}
+
+static void sample_apply(bContext *C, wmOperator *op, wmEvent *event)
+{
+ SpaceNode *snode= CTX_wm_space_node(C);
+ ARegion *ar= CTX_wm_region(C);
+ ImageSampleInfo *info= op->customdata;
+ void *lock;
+ Image *ima;
+ ImBuf *ibuf;
+ float fx, fy, bufx, bufy;
+ int mx, my;
+
+ ima= BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node");
+ ibuf= BKE_image_acquire_ibuf(ima, NULL, &lock);
+ if(!ibuf)
+ return;
+
+ if(!ibuf->rect) {
+ if(info->color_manage)
+ ibuf->profile = IB_PROFILE_LINEAR_RGB;
+ else
+ ibuf->profile = IB_PROFILE_NONE;
+ IMB_rect_from_float(ibuf);
+ }
+
+ mx= event->x - ar->winrct.xmin;
+ my= event->y - ar->winrct.ymin;
+ /* map the mouse coords to the backdrop image space */
+ bufx = ibuf->x * snode->zoom;
+ bufy = ibuf->y * snode->zoom;
+ fx = (bufx > 0.0f ? ((float)mx - 0.5f*ar->winx - snode->xof) / bufx + 0.5f : 0.0f);
+ fy = (bufy > 0.0f ? ((float)my - 0.5f*ar->winy - snode->yof) / bufy + 0.5f : 0.0f);
+
+ if(fx>=0.0 && fy>=0.0 && fx<1.0 && fy<1.0) {
+ float *fp;
+ char *cp;
+ int x= (int)(fx*ibuf->x), y= (int)(fy*ibuf->y);
+
+ CLAMP(x, 0, ibuf->x-1);
+ CLAMP(y, 0, ibuf->y-1);
+
+ info->x= x;
+ info->y= y;
+ info->draw= 1;
+ info->channels= ibuf->channels;
+
+ if(ibuf->rect) {
+ cp= (char *)(ibuf->rect + y*ibuf->x + x);
+
+ info->col[0]= cp[0];
+ info->col[1]= cp[1];
+ info->col[2]= cp[2];
+ info->col[3]= cp[3];
+
+ info->colf[0]= (float)cp[0]/255.0f;
+ info->colf[1]= (float)cp[1]/255.0f;
+ info->colf[2]= (float)cp[2]/255.0f;
+ info->colf[3]= (float)cp[3]/255.0f;
+ }
+ if(ibuf->rect_float) {
+ fp= (ibuf->rect_float + (ibuf->channels)*(y*ibuf->x + x));
+
+ info->colf[0]= fp[0];
+ info->colf[1]= fp[1];
+ info->colf[2]= fp[2];
+ info->colf[3]= fp[3];
+ }
+ }
+ else
+ info->draw= 0;
+
+ BKE_image_release_ibuf(ima, lock);
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+}
+
+static void sample_exit(bContext *C, wmOperator *op)
+{
+ ImageSampleInfo *info= op->customdata;
+
+ ED_region_draw_cb_exit(info->art, info->draw_handle);
+ ED_area_tag_redraw(CTX_wm_area(C));
+ MEM_freeN(info);
+}
+
+static int sample_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ SpaceNode *snode= CTX_wm_space_node(C);
+ ARegion *ar= CTX_wm_region(C);
+ ImageSampleInfo *info;
+
+ if(snode->treetype!=NTREE_COMPOSIT || !(snode->flag & SNODE_BACKDRAW))
+ return OPERATOR_CANCELLED;
+
+ info= MEM_callocN(sizeof(ImageSampleInfo), "ImageSampleInfo");
+ info->art= ar->type;
+ info->draw_handle = ED_region_draw_cb_activate(ar->type, sample_draw, info, REGION_DRAW_POST_PIXEL);
+ op->customdata= info;
+
+ sample_apply(C, op, event);
+
+ WM_event_add_modal_handler(C, op);
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static int sample_modal(bContext *C, wmOperator *op, wmEvent *event)
+{
+ switch(event->type) {
+ case LEFTMOUSE:
+ case RIGHTMOUSE: // XXX hardcoded
+ sample_exit(C, op);
+ return OPERATOR_CANCELLED;
+ case MOUSEMOVE:
+ sample_apply(C, op, event);
+ break;
+ }
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static int sample_cancel(bContext *C, wmOperator *op)
+{
+ sample_exit(C, op);
+ return OPERATOR_CANCELLED;
+}
+
+void NODE_OT_backimage_sample(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Backimage Sample";
+ ot->idname= "NODE_OT_backimage_sample";
+
+ /* api callbacks */
+ ot->invoke= sample_invoke;
+ ot->modal= sample_modal;
+ ot->cancel= sample_cancel;
+ ot->poll= ED_operator_node_active;
+
+ /* flags */
+ ot->flag= OPTYPE_BLOCKING;
+}
/* ********************** size widget operator ******************** */
@@ -1095,7 +1314,7 @@ static void node_link_viewer(SpaceNode *snode, bNode *tonode)
}
-static int node_active_link_viewer(bContext *C, wmOperator *op)
+static int node_active_link_viewer(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
bNode *node;
@@ -1358,7 +1577,7 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace)
ListBase *nodelist = MEM_callocN(sizeof(ListBase), "items_list");
bNodeListItem *nli;
bNode *node;
- int i;
+ int i, numlinks=0;
for(node= snode->edittree->nodes.first; node; node= node->next) {
if(node->flag & NODE_SELECT) {
@@ -1396,11 +1615,15 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace)
nodeRemSocketLinks(snode->edittree, sock_to);
nodeAddLink(snode->edittree, node_fr, sock_fr, node_to, sock_to);
NodeTagChanged(snode->edittree, node_to);
+ ++numlinks;
break;
}
}
- ntreeSolveOrder(snode->edittree);
+ if (numlinks > 0) {
+ node_tree_verify_groups(snode->nodetree);
+ ntreeSolveOrder(snode->edittree);
+ }
BLI_freelistN(nodelist);
MEM_freeN(nodelist);
@@ -1433,7 +1656,7 @@ bNode *node_add_node(SpaceNode *snode, Scene *scene, int type, float locx, float
/* generics */
if(node) {
node->locx= locx;
- node->locy= locy + 60.0f; // arbitrary.. so its visible
+ node->locy= locy + 60.0f; // arbitrary.. so its visible, (0,0) is top of node
node->flag |= SELECT;
gnode= node_tree_get_editgroup(snode->nodetree);
@@ -1467,15 +1690,39 @@ bNode *node_add_node(SpaceNode *snode, Scene *scene, int type, float locx, float
/* ****************** Duplicate *********************** */
-static int node_duplicate_exec(bContext *C, wmOperator *op)
+static int node_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
+ bNodeTree *ntree= snode->edittree;
+ bNode *node, *newnode, *last;
ED_preview_kill_jobs(C);
-
- ntreeCopyTree(snode->edittree, 1); /* 1 == internally selected nodes */
- ntreeSolveOrder(snode->edittree);
+ last = ntree->nodes.last;
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->flag & SELECT) {
+ newnode = nodeCopyNode(ntree, node, 1);
+
+ /* deselect old node, select the copy instead */
+ node->flag &= ~(NODE_SELECT|NODE_ACTIVE);
+ newnode->flag |= NODE_SELECT;
+
+ if(newnode->id) {
+ /* simple id user adjustment, node internal functions dont touch this
+ * but operators and readfile.c do. */
+ id_us_plus(newnode->id);
+ /* to ensure redraws or rerenders happen */
+ ED_node_changed_update(snode->id, newnode);
+ }
+ }
+
+ /* make sure we don't copy new nodes again! */
+ if (node==last)
+ break;
+ }
+
+ ntreeSolveOrder(ntree);
+
node_tree_verify_groups(snode->nodetree);
snode_notify(C, snode);
@@ -1771,7 +2018,7 @@ static int cut_links_intersect(bNodeLink *link, float mcoords[][2], int tot)
if(node_link_bezier_points(NULL, NULL, link, coord_array, LINK_RESOL)) {
for(i=0; i<tot-1; i++)
- for(b=0; b<LINK_RESOL-1; b++)
+ for(b=0; b<LINK_RESOL; b++)
if(isect_line_line_v2(mcoords[i], mcoords[i+1], coord_array[b], coord_array[b+1]) > 0)
return 1;
}
@@ -1845,8 +2092,9 @@ void NODE_OT_links_cut(wmOperatorType *ot)
/* ******************************** */
// XXX some code needing updating to operators...
+
/* goes over all scenes, reads render layers */
-static int node_read_renderlayers_exec(bContext *C, wmOperator *op)
+static int node_read_renderlayers_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
SpaceNode *snode= CTX_wm_space_node(C);
@@ -1882,24 +2130,25 @@ void NODE_OT_read_renderlayers(wmOperatorType *ot)
ot->exec= node_read_renderlayers_exec;
- ot->poll= ED_operator_node_active;
+ ot->poll= composite_node_active;
/* flags */
ot->flag= 0;
}
-static int node_read_fullsamplelayers_exec(bContext *C, wmOperator *op)
+static int node_read_fullsamplelayers_exec(bContext *C, wmOperator *UNUSED(op))
{
+ Main *bmain= CTX_data_main(C);
SpaceNode *snode= CTX_wm_space_node(C);
Scene *curscene= CTX_data_scene(C);
Render *re= RE_NewRender(curscene->id.name);
-// WM_cursor_wait(1);
+ WM_cursor_wait(1);
- RE_MergeFullSample(re, curscene, snode->nodetree);
+ RE_MergeFullSample(re, bmain, curscene, snode->nodetree);
snode_notify(C, snode);
-// WM_cursor_wait(0);
+ WM_cursor_wait(0);
return OPERATOR_FINISHED;
}
@@ -1912,7 +2161,55 @@ void NODE_OT_read_fullsamplelayers(wmOperatorType *ot)
ot->exec= node_read_fullsamplelayers_exec;
- ot->poll= ED_operator_node_active;
+ ot->poll= composite_node_active;
+
+ /* flags */
+ ot->flag= 0;
+}
+
+int node_render_changed_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Scene *sce= CTX_data_scene(C);
+ bNode *node;
+
+ for(node= sce->nodetree->nodes.first; node; node= node->next) {
+ if(node->id==(ID *)sce && node->need_exec) {
+ break;
+ }
+ }
+ if(node) {
+ SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1);
+
+ if(srl) {
+ PointerRNA op_ptr;
+
+ WM_operator_properties_create(&op_ptr, "RENDER_OT_render");
+ RNA_string_set(&op_ptr, "layer", srl->name);
+ RNA_string_set(&op_ptr, "scene", sce->id.name+2);
+
+ /* to keep keypositions */
+ sce->r.scemode |= R_NO_FRAME_UPDATE;
+
+ WM_operator_name_call(C, "RENDER_OT_render", WM_OP_INVOKE_DEFAULT, &op_ptr);
+
+ WM_operator_properties_free(&op_ptr);
+
+ return OPERATOR_FINISHED;
+ }
+
+ }
+ return OPERATOR_CANCELLED;
+}
+
+void NODE_OT_render_changed(wmOperatorType *ot)
+{
+
+ ot->name= "Render Changed Layer";
+ ot->idname= "NODE_OT_render_changed";
+
+ ot->exec= node_render_changed_exec;
+
+ ot->poll= composite_node_active;
/* flags */
ot->flag= 0;
@@ -1927,7 +2224,7 @@ static int node_group_make_exec(bContext *C, wmOperator *op)
bNode *gnode;
if(snode->edittree!=snode->nodetree) {
- BKE_report(op->reports, RPT_ERROR, "Can not add a new Group in a Group");
+ BKE_report(op->reports, RPT_WARNING, "Can not add a new Group in a Group");
return OPERATOR_CANCELLED;
}
@@ -1940,7 +2237,7 @@ static int node_group_make_exec(bContext *C, wmOperator *op)
}
if(gnode) {
- BKE_report(op->reports, RPT_ERROR, "Can not add RenderLayer in a Group");
+ BKE_report(op->reports, RPT_WARNING, "Can not add RenderLayer in a Group");
return OPERATOR_CANCELLED;
}
}
@@ -1949,7 +2246,7 @@ static int node_group_make_exec(bContext *C, wmOperator *op)
gnode= nodeMakeGroupFromSelected(snode->nodetree);
if(gnode==NULL) {
- BKE_report(op->reports, RPT_ERROR, "Can not make Group");
+ BKE_report(op->reports, RPT_WARNING, "Can not make Group");
return OPERATOR_CANCELLED;
}
else {
@@ -2010,7 +2307,7 @@ static void node_flag_toggle_exec(SpaceNode *snode, int toggle_flag)
}
}
-static int node_hide_exec(bContext *C, wmOperator *op)
+static int node_hide_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
@@ -2040,7 +2337,7 @@ void NODE_OT_hide_toggle(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int node_preview_exec(bContext *C, wmOperator *op)
+static int node_preview_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
@@ -2072,7 +2369,7 @@ void NODE_OT_preview_toggle(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int node_socket_toggle_exec(bContext *C, wmOperator *op)
+static int node_socket_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
bNode *node;
@@ -2123,7 +2420,7 @@ void NODE_OT_hide_socket_toggle(wmOperatorType *ot)
/* ****************** Mute operator *********************** */
-static int node_mute_exec(bContext *C, wmOperator *op)
+static int node_mute_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
bNode *node;
@@ -2165,7 +2462,7 @@ void NODE_OT_mute_toggle(wmOperatorType *ot)
/* ****************** Delete operator ******************* */
-static int node_delete_exec(bContext *C, wmOperator *op)
+static int node_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
bNode *node, *next;
@@ -2206,7 +2503,7 @@ void NODE_OT_delete(wmOperatorType *ot)
/* ****************** Show Cyclic Dependencies Operator ******************* */
-static int node_show_cycles_exec(bContext *C, wmOperator *op)
+static int node_show_cycles_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
@@ -2250,7 +2547,7 @@ static int node_add_file_exec(bContext *C, wmOperator *op)
errno= 0;
- ima= BKE_add_image_file(path, scene ? scene->r.cfra : 1);
+ ima= BKE_add_image_file(path);
if(!ima) {
BKE_reportf(op->reports, RPT_ERROR, "Can't read: \"%s\", %s.", path, errno ? strerror(errno) : "Unsupported image format");
@@ -2279,7 +2576,7 @@ static int node_add_file_exec(bContext *C, wmOperator *op)
node = node_add_node(snode, scene, ntype, snode->mx, snode->my);
if (!node) {
- BKE_report(op->reports, RPT_ERROR, "Could not add an image node.");
+ BKE_report(op->reports, RPT_WARNING, "Could not add an image node.");
return OPERATOR_CANCELLED;
}
@@ -2315,7 +2612,7 @@ void NODE_OT_add_file(wmOperatorType *ot)
/* callbacks */
ot->exec= node_add_file_exec;
ot->invoke= node_add_file_invoke;
- ot->poll= ED_operator_node_active;
+ ot->poll= composite_node_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c
index 0711ef66497..147a0825229 100644
--- a/source/blender/editors/space_node/node_header.c
+++ b/source/blender/editors/space_node/node_header.c
@@ -37,13 +37,13 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
#include "BKE_node.h"
#include "BKE_main.h"
-
#include "WM_api.h"
#include "WM_types.h"
@@ -55,11 +55,25 @@
/* ************************ add menu *********************** */
-static void do_node_add(bContext *C, void *arg, int event)
+static void do_node_add(bContext *C, void *UNUSED(arg), int event)
{
SpaceNode *snode= CTX_wm_space_node(C);
+ ScrArea *sa= CTX_wm_area(C);
+ ARegion *ar;
bNode *node;
+ /* get location to add node at mouse */
+ for(ar=sa->regionbase.first; ar; ar=ar->next) {
+ if(ar->regiontype == RGN_TYPE_WINDOW) {
+ wmWindow *win= CTX_wm_window(C);
+ int x= win->eventstate->x - ar->winrct.xmin;
+ int y= win->eventstate->y - ar->winrct.ymin;
+
+ if(y < 60) y+= 60;
+ UI_view2d_region_to_view(&ar->v2d, x, y, &snode->mx, &snode->my);
+ }
+ }
+
/* store selection in temp test flag */
for(node= snode->edittree->nodes.first; node; node= node->next) {
if(node->flag & NODE_SELECT) node->flag |= NODE_TEST;
@@ -126,7 +140,7 @@ static void node_auto_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclas
for(tot=0, a=0; ngroup; ngroup= ngroup->id.next, tot++) {
if(ngroup->type==ntree->type) {
- uiItemV(layout, ngroup->id.name+2, 0, NODE_GROUP_MENU+tot);
+ uiItemV(layout, ngroup->id.name+2, ICON_NULL, NODE_GROUP_MENU+tot);
a++;
}
}
@@ -138,11 +152,11 @@ static void node_auto_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclas
for(a=0, type= ntree->alltypes.first; type; type=type->next) {
if(type->nclass == nodeclass && type->name) {
if(type->type == NODE_DYNAMIC) {
- uiItemV(layout, type->name, 0, NODE_DYNAMIC_MENU+script);
+ uiItemV(layout, type->name, ICON_NULL, NODE_DYNAMIC_MENU+script);
script++;
}
else
- uiItemV(layout, type->name, 0, type->type);
+ uiItemV(layout, type->name, ICON_NULL, type->type);
a++;
}
@@ -152,20 +166,8 @@ static void node_auto_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclas
static void node_menu_add(const bContext *C, Menu *menu)
{
- uiLayout *layout= menu->layout;
SpaceNode *snode= CTX_wm_space_node(C);
- ScrArea *sa= CTX_wm_area(C);
- ARegion *ar;
-
- /* get location to add node at mouse */
- for(ar=sa->regionbase.first; ar; ar=ar->next) {
- if(ar->regiontype == RGN_TYPE_WINDOW) {
- wmWindow *win= CTX_wm_window(C);
- UI_view2d_region_to_view(&ar->v2d,
- win->eventstate->x - ar->winrct.xmin, win->eventstate->y - ar->winrct.ymin,
- &snode->mx, &snode->my);
- }
- }
+ uiLayout *layout= menu->layout;
if(!snode->nodetree)
uiLayoutSetActive(layout, 0);
@@ -202,7 +204,7 @@ static void node_menu_add(const bContext *C, Menu *menu)
}
}
-void node_menus_register(ARegionType *art)
+void node_menus_register(void)
{
MenuType *mt;
diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h
index 77fda0627e7..831e157deef 100644
--- a/source/blender/editors/space_node/node_intern.h
+++ b/source/blender/editors/space_node/node_intern.h
@@ -41,7 +41,7 @@ ARegion *node_has_buttons_region(ScrArea *sa);
/* node_header.c */
void node_header_buttons(const bContext *C, ARegion *ar);
-void node_menus_register(struct ARegionType *art);
+void node_menus_register(void);
/* node_draw.c */
void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d);
@@ -68,11 +68,10 @@ void NODE_OT_select_same_type_prev(wmOperatorType *ot);
/* drawnode.c */
void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link);
-void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int th_col2, int do_shaded);
+void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 );
int node_link_bezier_points(View2D *v2d, SpaceNode *snode, bNodeLink *link, float coord_array[][2], int resol);
void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage);
-
-void node_buts_group(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
+void draw_nodespace_color_info(ARegion *ar, int channels, int x, int y, char *cp, float *fp);
/* node_edit.c */
void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *treetype);
@@ -91,7 +90,7 @@ void node_tree_verify_groups(bNodeTree *nodetree);
void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace);
int node_has_hidden_sockets(bNode *node);
void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set);
-
+int node_render_changed_exec(bContext *, wmOperator *);
void NODE_OT_duplicate(struct wmOperatorType *ot);
void NODE_OT_delete(struct wmOperatorType *ot);
@@ -114,8 +113,11 @@ void NODE_OT_show_cyclic_dependencies(struct wmOperatorType *ot);
void NODE_OT_link_viewer(struct wmOperatorType *ot);
void NODE_OT_read_fullsamplelayers(struct wmOperatorType *ot);
void NODE_OT_read_renderlayers(struct wmOperatorType *ot);
+void NODE_OT_render_changed(struct wmOperatorType *ot);
+
void NODE_OT_backimage_move(struct wmOperatorType *ot);
void NODE_OT_backimage_zoom(struct wmOperatorType *ot);
+void NODE_OT_backimage_sample(wmOperatorType *ot);
void NODE_OT_add_file(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c
index 46cd8515f23..db5c493dcd9 100644
--- a/source/blender/editors/space_node/node_ops.c
+++ b/source/blender/editors/space_node/node_ops.c
@@ -78,9 +78,11 @@ void node_operatortypes(void)
WM_operatortype_append(NODE_OT_read_renderlayers);
WM_operatortype_append(NODE_OT_read_fullsamplelayers);
+ WM_operatortype_append(NODE_OT_render_changed);
WM_operatortype_append(NODE_OT_backimage_move);
WM_operatortype_append(NODE_OT_backimage_zoom);
+ WM_operatortype_append(NODE_OT_backimage_sample);
WM_operatortype_append(NODE_OT_add_file);
}
@@ -136,7 +138,7 @@ void node_keymap(struct wmKeyConfig *keyconf)
RNA_float_set(kmi->ptr, "factor", 0.83333f);
kmi= WM_keymap_add_item(keymap, "NODE_OT_backimage_zoom", VKEY, KM_PRESS, KM_ALT, 0);
RNA_float_set(kmi->ptr, "factor", 1.2f);
-
+ WM_keymap_add_item(keymap, "NODE_OT_backimage_sample", ACTIONMOUSE, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "NODE_OT_link_make", FKEY, KM_PRESS, 0, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "NODE_OT_link_make", FKEY, KM_PRESS, KM_CTRL, 0)->ptr, "replace", 1);
@@ -167,8 +169,10 @@ void node_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "NODE_OT_group_ungroup", GKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "NODE_OT_group_edit", TABKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "NODE_OT_read_renderlayers", RKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "NODE_OT_read_fullsamplelayers", RKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "NODE_OT_read_renderlayers", RKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "NODE_OT_read_fullsamplelayers", RKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "NODE_OT_render_changed", ZKEY, KM_PRESS, 0, 0);
+
transform_keymap_for_space(keyconf, keymap, SPACE_NODE);
}
diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c
index ec08cdf07ac..b53ac07aab3 100644
--- a/source/blender/editors/space_node/node_select.c
+++ b/source/blender/editors/space_node/node_select.c
@@ -34,6 +34,7 @@
#include "BKE_context.h"
#include "BLI_rect.h"
+#include "BLI_utildefines.h"
#include "ED_screen.h"
#include "ED_types.h"
@@ -108,13 +109,6 @@ static int node_select_exec(bContext *C, wmOperator *op)
/* perform the select */
node= node_mouse_select(snode, ar, mval, extend);
-
- /* WATCH THIS, there are a few other ways to change the active material */
- if(node) {
- if (node->id && ELEM(GS(node->id->name), ID_MA, ID_TE)) {
- WM_event_add_notifier(C, NC_MATERIAL|ND_SHADING_DRAW, node->id);
- }
- }
/* send notifiers */
WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
@@ -143,6 +137,7 @@ void NODE_OT_select(wmOperatorType *ot)
/* identifiers */
ot->name= "Select";
ot->idname= "NODE_OT_select";
+ ot->description= "Select node under cursor";
/* api callbacks */
ot->invoke= node_select_invoke;
@@ -223,6 +218,7 @@ void NODE_OT_select_border(wmOperatorType *ot)
/* identifiers */
ot->name= "Border Select";
ot->idname= "NODE_OT_select_border";
+ ot->description= "Use box selection to select nodes";
/* api callbacks */
ot->invoke= node_border_select_invoke;
@@ -241,7 +237,7 @@ void NODE_OT_select_border(wmOperatorType *ot)
/* ****** Select/Deselect All ****** */
-static int node_select_all_exec(bContext *C, wmOperator *op)
+static int node_select_all_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode = CTX_wm_space_node(C);
bNode *first = snode->edittree->nodes.first;
@@ -282,7 +278,7 @@ void NODE_OT_select_all(wmOperatorType *ot)
/* ****** Select Linked To ****** */
-static int node_select_linked_to_exec(bContext *C, wmOperator *op)
+static int node_select_linked_to_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode = CTX_wm_space_node(C);
bNodeLink *link;
@@ -322,7 +318,7 @@ void NODE_OT_select_linked_to(wmOperatorType *ot)
/* ****** Select Linked From ****** */
-static int node_select_linked_from_exec(bContext *C, wmOperator *op)
+static int node_select_linked_from_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode = CTX_wm_space_node(C);
bNodeLink *link;
@@ -362,7 +358,7 @@ void NODE_OT_select_linked_from(wmOperatorType *ot)
/* ****** Select Same Type ****** */
-static int node_select_same_type_exec(bContext *C, wmOperator *op)
+static int node_select_same_type_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode = CTX_wm_space_node(C);
@@ -388,7 +384,7 @@ void NODE_OT_select_same_type(wmOperatorType *ot)
/* ****** Select The Next/Prev Node Of The Same Type ****** */
-static int node_select_same_type_next_exec(bContext *C, wmOperator *op)
+static int node_select_same_type_next_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode = CTX_wm_space_node(C);
@@ -412,7 +408,7 @@ void NODE_OT_select_same_type_next(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int node_select_same_type_prev_exec(bContext *C, wmOperator *op)
+static int node_select_same_type_prev_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode = CTX_wm_space_node(C);
diff --git a/source/blender/editors/space_node/node_state.c b/source/blender/editors/space_node/node_state.c
index b4f09f960d6..4f2f204fbe6 100644
--- a/source/blender/editors/space_node/node_state.c
+++ b/source/blender/editors/space_node/node_state.c
@@ -31,11 +31,12 @@
#include "DNA_node_types.h"
#include "DNA_scene_types.h"
+#include "BLI_rect.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
#include "BKE_node.h"
-#include "BLI_rect.h"
-
#include "ED_screen.h"
#include "RNA_access.h"
@@ -140,7 +141,7 @@ static int do_header_node(SpaceNode *snode, bNode *node, float mx, float my)
return 0;
}
-static int do_header_hidden_node(SpaceNode *snode, bNode *node, float mx, float my)
+static int do_header_hidden_node(bNode *node, float mx, float my)
{
rctf totr= node->totr;
@@ -164,7 +165,7 @@ static int node_toggle_visibility(SpaceNode *snode, ARegion *ar, short *mval)
for(next_node(snode->edittree); (node=next_node(NULL));) {
if(node->flag & NODE_HIDDEN) {
- if(do_header_hidden_node(snode, node, mx, my)) {
+ if(do_header_hidden_node(node, mx, my)) {
ED_region_tag_redraw(ar);
return 1;
}
@@ -227,7 +228,7 @@ void NODE_OT_visibility_toggle(wmOperatorType *ot)
/* **************** View All Operator ************** */
-static void snode_home(ScrArea *sa, ARegion *ar, SpaceNode* snode)
+static void snode_home(ScrArea *UNUSED(sa), ARegion *ar, SpaceNode* snode)
{
bNode *node;
rctf *cur, *tot;
@@ -278,7 +279,7 @@ static void snode_home(ScrArea *sa, ARegion *ar, SpaceNode* snode)
UI_view2d_curRect_validate(&ar->v2d);
}
-static int node_view_all_exec(bContext *C, wmOperator *op)
+static int node_view_all_exec(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C);
@@ -295,6 +296,7 @@ void NODE_OT_view_all(wmOperatorType *ot)
/* identifiers */
ot->name= "View All";
ot->idname= "NODE_OT_view_all";
+ ot->description= "Resize view so you can see all nodes";
/* api callbacks */
ot->exec= node_view_all_exec;
diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index c94fcb52e38..1ac745b8c0e 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -39,6 +39,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -89,7 +90,7 @@ ARegion *node_has_buttons_region(ScrArea *sa)
/* ******************** default callbacks for node space ***************** */
-static SpaceLink *node_new(const bContext *C)
+static SpaceLink *node_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceNode *snode;
@@ -97,6 +98,9 @@ static SpaceLink *node_new(const bContext *C)
snode= MEM_callocN(sizeof(SpaceNode), "initnode");
snode->spacetype= SPACE_NODE;
+ /* backdrop */
+ snode->zoom = 1.0f;
+
/* header */
ar= MEM_callocN(sizeof(ARegion), "header for node");
@@ -118,15 +122,15 @@ static SpaceLink *node_new(const bContext *C)
BLI_addtail(&snode->regionbase, ar);
ar->regiontype= RGN_TYPE_WINDOW;
- ar->v2d.tot.xmin= -10.0f;
- ar->v2d.tot.ymin= -10.0f;
- ar->v2d.tot.xmax= 512.0f;
- ar->v2d.tot.ymax= 512.0f;
+ ar->v2d.tot.xmin= -256.0f;
+ ar->v2d.tot.ymin= -256.0f;
+ ar->v2d.tot.xmax= 768.0f;
+ ar->v2d.tot.ymax= 768.0f;
- ar->v2d.cur.xmin= 0.0f;
- ar->v2d.cur.ymin= 0.0f;
- ar->v2d.cur.xmax= 512.0f;
- ar->v2d.cur.ymax= 512.0f;
+ ar->v2d.cur.xmin= -256.0f;
+ ar->v2d.cur.ymin= -256.0f;
+ ar->v2d.cur.xmax= 768.0f;
+ ar->v2d.cur.ymax= 768.0f;
ar->v2d.min[0]= 1.0f;
ar->v2d.min[1]= 1.0f;
@@ -145,14 +149,14 @@ static SpaceLink *node_new(const bContext *C)
}
/* not spacelink itself */
-static void node_free(SpaceLink *sl)
+static void node_free(SpaceLink *UNUSED(sl))
{
}
/* spacetype; init callback */
-static void node_init(struct wmWindowManager *wm, ScrArea *sa)
+static void node_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -160,9 +164,9 @@ static void node_init(struct wmWindowManager *wm, ScrArea *sa)
static void node_area_listener(ScrArea *sa, wmNotifier *wmn)
{
/* note, ED_area_tag_refresh will re-execute compositor */
- /* XXX, should edit some to check for the nodeTree type, especially NC_NODE|NA_EDITED which refreshes all types */
SpaceNode *snode= sa->spacedata.first;
-
+ int type= snode->treetype;
+
/* preview renders */
switch(wmn->category) {
case NC_SCENE:
@@ -171,23 +175,35 @@ static void node_area_listener(ScrArea *sa, wmNotifier *wmn)
case ND_FRAME:
ED_area_tag_refresh(sa);
break;
+ case ND_TRANSFORM_DONE:
+ if(type==NTREE_COMPOSIT) {
+ if(snode->flag & SNODE_AUTO_RENDER) {
+ snode->recalc= 1;
+ ED_area_tag_refresh(sa);
+ }
+ }
+ break;
}
break;
case NC_WM:
if(wmn->data==ND_FILEREAD)
ED_area_tag_refresh(sa);
break;
-
+
/* future: add ID checks? */
case NC_MATERIAL:
- if(wmn->data==ND_SHADING)
- ED_area_tag_refresh(sa);
- else if(wmn->data==ND_SHADING_DRAW)
- ED_area_tag_refresh(sa);
+ if(type==NTREE_SHADER) {
+ if(wmn->data==ND_SHADING)
+ ED_area_tag_refresh(sa);
+ else if(wmn->data==ND_SHADING_DRAW)
+ ED_area_tag_refresh(sa);
+ }
break;
case NC_TEXTURE:
- if(wmn->data==ND_NODES)
- ED_area_tag_refresh(sa);
+ if(type==NTREE_SHADER || type==NTREE_TEXTURE) {
+ if(wmn->data==ND_NODES)
+ ED_area_tag_refresh(sa);
+ }
break;
case NC_TEXT:
/* pynodes */
@@ -207,7 +223,7 @@ static void node_area_listener(ScrArea *sa, wmNotifier *wmn)
case NC_IMAGE:
if (wmn->action == NA_EDITED) {
- if(snode->treetype==NTREE_COMPOSIT) {
+ if(type==NTREE_COMPOSIT) {
Scene *scene= wmn->window->screen->scene;
/* note that NodeTagIDChanged is alredy called by BKE_image_signal() on all
@@ -236,8 +252,15 @@ static void node_area_refresh(const struct bContext *C, struct ScrArea *sa)
}
else if(snode->treetype==NTREE_COMPOSIT) {
Scene *scene= (Scene *)snode->id;
- if(scene->use_nodes)
- snode_composite_job(C, sa);
+ if(scene->use_nodes) {
+ /* recalc is set on 3d view changes for auto compo */
+ if(snode->recalc) {
+ snode->recalc= 0;
+ node_render_changed_exec((struct bContext*)C, NULL);
+ }
+ else
+ snode_composite_job(C, sa);
+ }
}
else if(snode->treetype==NTREE_TEXTURE) {
Tex *tex= (Tex *)snode->id;
@@ -306,7 +329,7 @@ static void node_main_area_draw(const bContext *C, ARegion *ar)
/* ************* dropboxes ************* */
-static int node_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int node_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_ID) {
ID *id= (ID *)drag->poin;
@@ -345,7 +368,7 @@ static void node_dropboxes(void)
/* add handlers, stuff you only do once or on area/region changes */
-static void node_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void node_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -452,7 +475,7 @@ void ED_spacetype_node(void)
BLI_addhead(&st->regiontypes, art);
- node_menus_register(art);
+ node_menus_register();
/* regions: listview/buttons */
art= MEM_callocN(sizeof(ARegionType), "spacetype node region");
diff --git a/source/blender/editors/space_outliner/CMakeLists.txt b/source/blender/editors/space_outliner/CMakeLists.txt
index 5ebe47f8c5e..6f3cafd81f8 100644
--- a/source/blender/editors/space_outliner/CMakeLists.txt
+++ b/source/blender/editors/space_outliner/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -33,4 +31,12 @@ SET(INC
../../../../intern/opennl/extern
)
-BLENDERLIB(bf_editor_space_outliner "${SRC}" "${INC}")
+set(SRC
+ outliner.c
+ outliner_ops.c
+ space_outliner.c
+
+ outliner_intern.h
+)
+
+blender_add_lib(bf_editor_space_outliner "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_outliner/Makefile b/source/blender/editors/space_outliner/Makefile
deleted file mode 100644
index bd6725c5b71..00000000000
--- a/source/blender/editors/space_outliner/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_outliner
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c
index 175eb8c78ed..3007cfc4cb4 100644
--- a/source/blender/editors/space_outliner/outliner.c
+++ b/source/blender/editors/space_outliner/outliner.c
@@ -51,6 +51,7 @@
#include "DNA_object_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#if defined WIN32 && !defined _LIBC
# include "BLI_fnmatch.h" /* use fnmatch included in blenlib */
@@ -120,7 +121,7 @@
/* ************* XXX **************** */
-static void error(const char *dummy, ...) {}
+static void error(const char *UNUSED(arg), ...) {}
/* ********************************** */
@@ -187,7 +188,7 @@ static void check_persistant(SpaceOops *soops, TreeElement *te, ID *id, short ty
/* case 1; no TreeStore */
if(soops->treestore==NULL) {
- ts= soops->treestore= MEM_callocN(sizeof(TreeStore), "treestore");
+ soops->treestore= MEM_callocN(sizeof(TreeStore), "treestore");
}
ts= soops->treestore;
@@ -240,7 +241,7 @@ void outliner_free_tree(ListBase *lb)
outliner_free_tree(&te->subtree);
BLI_remlink(lb, te);
- if(te->flag & TE_FREE_NAME) MEM_freeN(te->name);
+ if(te->flag & TE_FREE_NAME) MEM_freeN((void *)te->name);
MEM_freeN(te);
}
}
@@ -324,7 +325,7 @@ static ID *outliner_search_back(SpaceOops *soops, TreeElement *te, short idcode)
struct treesort {
TreeElement *te;
ID *id;
- char *name;
+ const char *name;
short idcode;
};
@@ -340,7 +341,7 @@ static int treesort_alpha(const void *v1, const void *v2)
if(comp==1) return 1;
else if(comp==2) return -1;
else if(comp==3) {
- int comp= strcmp(x1->name, x2->name);
+ comp= strcmp(x1->name, x2->name);
if( comp>0 ) return 1;
else if( comp<0) return -1;
@@ -1112,8 +1113,8 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
c= RNA_property_array_item_char(prop, index);
te->name= MEM_callocN(sizeof(char)*20, "OutlinerRNAArrayName");
- if(c) sprintf(te->name, " %c", c);
- else sprintf(te->name, " %d", index+1);
+ if(c) sprintf((char *)te->name, " %c", c);
+ else sprintf((char *)te->name, " %d", index+1);
te->flag |= TE_FREE_NAME;
}
}
@@ -1243,7 +1244,7 @@ void add_seq_dup(SpaceOops *soops, Sequence *seq, TreeElement *te, short index)
}
}
-static int outliner_filter_has_name(TreeElement *te, char *name, int flags)
+static int outliner_filter_has_name(TreeElement *te, const char *name, int flags)
{
#if 0
int found= 0;
@@ -1308,7 +1309,7 @@ static int outliner_filter_tree(SpaceOops *soops, ListBase *lb)
outliner_free_tree(&te->subtree);
BLI_remlink(lb, te);
- if(te->flag & TE_FREE_NAME) MEM_freeN(te->name);
+ if(te->flag & TE_FREE_NAME) MEM_freeN((void *)te->name);
MEM_freeN(te);
}
}
@@ -1408,7 +1409,6 @@ static void outliner_build_tree(Main *mainvar, Scene *scene, SpaceOops *soops)
for(group= mainvar->group.first; group; group= group->id.next) {
if(group->gobject.first) {
te= outliner_add_element(soops, &soops->tree, group, NULL, 0, 0);
- tselem= TREESTORE(te);
for(go= group->gobject.first; go; go= go->next) {
ten= outliner_add_element(soops, &te->subtree, go->ob, te, 0, 0);
@@ -1509,6 +1509,42 @@ static void outliner_build_tree(Main *mainvar, Scene *scene, SpaceOops *soops)
/* **************** INTERACTIVE ************* */
+
+static int outliner_scroll_page_exec(bContext *C, wmOperator *op)
+{
+ ARegion *ar= CTX_wm_region(C);
+ int dy= ar->v2d.mask.ymax - ar->v2d.mask.ymin;
+ int up= 0;
+
+ if(RNA_boolean_get(op->ptr, "up"))
+ up= 1;
+
+ if(up == 0) dy= -dy;
+ ar->v2d.cur.ymin+= dy;
+ ar->v2d.cur.ymax+= dy;
+
+ ED_region_tag_redraw(ar);
+
+ return OPERATOR_FINISHED;
+}
+
+
+void OUTLINER_OT_scroll_page(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Scroll Page";
+ ot->idname= "OUTLINER_OT_scroll_page";
+ ot->description= "Scroll page up or down";
+
+ /* callbacks */
+ ot->exec= outliner_scroll_page_exec;
+ ot->poll= ED_operator_outliner_active;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "up", 0, "Up", "Scroll up one page.");
+}
+
+
static int outliner_count_levels(SpaceOops *soops, ListBase *lb, int curlevel)
{
TreeElement *te;
@@ -1553,17 +1589,44 @@ static void outliner_set_flag(SpaceOops *soops, ListBase *lb, short flag, short
/* --- */
-void object_toggle_visibility_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+/* same check needed for both object operation and restrict column button func
+ * return 0 when in edit mode (cannot restrict view or select)
+ * otherwise return 1 */
+static int common_restrict_check(bContext *C, Object *ob)
+{
+ /* Don't allow hide an object in edit mode,
+ * check the bug #22153 and #21609, #23977
+ */
+ Object *obedit= CTX_data_edit_object(C);
+ if (obedit && obedit == ob) {
+ /* found object is hidden, reset */
+ if (ob->restrictflag & OB_RESTRICT_VIEW)
+ ob->restrictflag &= ~OB_RESTRICT_VIEW;
+ /* found object is unselectable, reset */
+ if (ob->restrictflag & OB_RESTRICT_SELECT)
+ ob->restrictflag &= ~OB_RESTRICT_SELECT;
+ return 0;
+ }
+
+ return 1;
+}
+
+void object_toggle_visibility_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
{
Base *base= (Base *)te->directdata;
- if(base || (base= object_in_scene((Object *)tselem->id, scene))) {
+ Object *ob = (Object *)tselem->id;
+
+ /* add check for edit mode */
+ if(!common_restrict_check(C, ob)) return;
+
+ if(base || (base= object_in_scene(ob, scene))) {
if((base->object->restrictflag ^= OB_RESTRICT_VIEW)) {
ED_base_object_select(base, BA_DESELECT);
}
}
}
-static int outliner_toggle_visibility_exec(bContext *C, wmOperator *op)
+static int outliner_toggle_visibility_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soops= CTX_wm_space_outliner(C);
Scene *scene= CTX_data_scene(C);
@@ -1586,14 +1649,14 @@ void OUTLINER_OT_visibility_toggle(wmOperatorType *ot)
/* callbacks */
ot->exec= outliner_toggle_visibility_exec;
- ot->poll= ED_operator_outliner_active;
+ ot->poll= ED_operator_outliner_active_no_editobject;
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
/* --- */
-static void object_toggle_selectability_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void object_toggle_selectability_cb(bContext *UNUSED(C), Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
{
Base *base= (Base *)te->directdata;
@@ -1603,7 +1666,7 @@ static void object_toggle_selectability_cb(bContext *C, Scene *scene, TreeElemen
}
}
-static int outliner_toggle_selectability_exec(bContext *C, wmOperator *op)
+static int outliner_toggle_selectability_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soops= CTX_wm_space_outliner(C);
Scene *scene= CTX_data_scene(C);
@@ -1626,12 +1689,12 @@ void OUTLINER_OT_selectability_toggle(wmOperatorType *ot)
/* callbacks */
ot->exec= outliner_toggle_selectability_exec;
- ot->poll= ED_operator_outliner_active;
+ ot->poll= ED_operator_outliner_active_no_editobject;
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-void object_toggle_renderability_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+void object_toggle_renderability_cb(bContext *UNUSED(C), Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
{
Base *base= (Base *)te->directdata;
@@ -1641,7 +1704,7 @@ void object_toggle_renderability_cb(bContext *C, Scene *scene, TreeElement *te,
}
}
-static int outliner_toggle_renderability_exec(bContext *C, wmOperator *op)
+static int outliner_toggle_renderability_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soops= CTX_wm_space_outliner(C);
Scene *scene= CTX_data_scene(C);
@@ -1670,7 +1733,7 @@ void OUTLINER_OT_renderability_toggle(wmOperatorType *ot)
/* --- */
-static int outliner_toggle_expanded_exec(bContext *C, wmOperator *op)
+static int outliner_toggle_expanded_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soops= CTX_wm_space_outliner(C);
ARegion *ar= CTX_wm_region(C);
@@ -1701,7 +1764,7 @@ void OUTLINER_OT_expanded_toggle(wmOperatorType *ot)
/* --- */
-static int outliner_toggle_selected_exec(bContext *C, wmOperator *op)
+static int outliner_toggle_selected_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soops= CTX_wm_space_outliner(C);
ARegion *ar= CTX_wm_region(C);
@@ -1782,6 +1845,7 @@ void OUTLINER_OT_show_one_level(wmOperatorType *ot)
/* identifiers */
ot->name= "Show/Hide One Level";
ot->idname= "OUTLINER_OT_show_one_level";
+ ot->description= "Expand/collapse all entries by one level";
/* callbacks */
ot->exec= outliner_one_level_exec;
@@ -1793,6 +1857,8 @@ void OUTLINER_OT_show_one_level(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "open", 1, "Open", "Expand all entries one level deep.");
}
+/* This is not used anywhere at the moment */
+#if 0
/* return 1 when levels were opened */
static int outliner_open_back(SpaceOops *soops, TreeElement *te)
{
@@ -1809,8 +1875,6 @@ static int outliner_open_back(SpaceOops *soops, TreeElement *te)
return retval;
}
-/* This is not used anywhere at the moment */
-#if 0
static void outliner_open_reveal(SpaceOops *soops, ListBase *lb, TreeElement *teFind, int *found)
{
TreeElement *te;
@@ -1836,7 +1900,7 @@ static void outliner_open_reveal(SpaceOops *soops, ListBase *lb, TreeElement *te
#endif
// XXX just use View2D ops for this?
-void outliner_page_up_down(Scene *scene, ARegion *ar, SpaceOops *soops, int up)
+void outliner_page_up_down(Scene *UNUSED(scene), ARegion *ar, SpaceOops *soops, int up)
{
int dy= ar->v2d.mask.ymax-ar->v2d.mask.ymin;
@@ -1904,15 +1968,14 @@ static void tree_element_set_active_object(bContext *C, Scene *scene, SpaceOops
scene_deselect_all(scene);
ED_base_object_select(base, BA_SELECT);
}
- if(C)
+ if(C) {
ED_base_object_activate(C, base); /* adds notifier */
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
+ }
}
if(ob!=scene->obedit)
ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR|EM_DO_UNDO);
-
- WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene);
-
}
static int tree_element_active_material(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set)
@@ -1959,13 +2022,13 @@ static int tree_element_active_material(bContext *C, Scene *scene, SpaceOops *so
static int tree_element_active_texture(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set)
{
TreeElement *tep;
- TreeStoreElem *tselem, *tselemp;
+ TreeStoreElem /* *tselem,*/ *tselemp;
Object *ob=OBACT;
SpaceButs *sbuts=NULL;
if(ob==NULL) return 0; // no active object
- tselem= TREESTORE(te);
+ /*tselem= TREESTORE(te);*/ /*UNUSED*/
/* find buttons area (note, this is undefined really still, needs recode in blender) */
/* XXX removed finding sbuts */
@@ -2023,12 +2086,14 @@ static int tree_element_active_texture(bContext *C, Scene *scene, SpaceOops *soo
}
}
- WM_event_add_notifier(C, NC_TEXTURE, NULL);
+ if(set)
+ WM_event_add_notifier(C, NC_TEXTURE, NULL);
+
return 0;
}
-static int tree_element_active_lamp(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set)
+static int tree_element_active_lamp(bContext *UNUSED(C), Scene *scene, SpaceOops *soops, TreeElement *te, int set)
{
Object *ob;
@@ -2081,7 +2146,7 @@ static int tree_element_active_defgroup(bContext *C, Scene *scene, TreeElement *
ob= (Object *)tselem->id;
if(set) {
ob->actdef= te->index+1;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
}
else {
@@ -2123,8 +2188,6 @@ static int tree_element_active_posechannel(bContext *C, Scene *scene, TreeElemen
if(set==2 && (pchan->bone->flag & BONE_SELECTED)) {
pchan->bone->flag &= ~BONE_SELECTED;
- if(arm->act_bone==pchan->bone)
- arm->act_bone= NULL;
} else {
pchan->bone->flag |= BONE_SELECTED;
arm->act_bone= pchan->bone;
@@ -2154,8 +2217,6 @@ static int tree_element_active_bone(bContext *C, Scene *scene, TreeElement *te,
if(set==2 && (bone->flag & BONE_SELECTED)) {
bone->flag &= ~BONE_SELECTED;
- if(arm->act_bone==bone)
- arm->act_bone= NULL;
} else {
bone->flag |= BONE_SELECTED;
arm->act_bone= bone;
@@ -2176,32 +2237,54 @@ static int tree_element_active_bone(bContext *C, Scene *scene, TreeElement *te,
/* ebones only draw in editmode armature */
-static int tree_element_active_ebone(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
+static void tree_element_active_ebone__sel(bContext *C, Scene *scene, bArmature *arm, EditBone *ebone, short sel)
{
- EditBone *ebone= te->directdata;
-
- if(set) {
- if(!(ebone->flag & BONE_HIDDEN_A)) {
- bArmature *arm= scene->obedit->data;
- if(set==2) ED_armature_deselectall(scene->obedit, 2); // only clear active tag
- else ED_armature_deselectall(scene->obedit, 0); // deselect
+ if(sel) {
+ ebone->flag |= BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL;
+ arm->act_edbone= ebone;
+ // flush to parent?
+ if(ebone->parent && (ebone->flag & BONE_CONNECTED)) ebone->parent->flag |= BONE_TIPSEL;
+ }
+ else {
+ ebone->flag &= ~(BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL);
+ // flush to parent?
+ if(ebone->parent && (ebone->flag & BONE_CONNECTED)) ebone->parent->flag &= ~BONE_TIPSEL;
+ }
- ebone->flag |= BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL;
- arm->act_edbone= ebone;
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_ACTIVE, scene->obedit);
+}
+static int tree_element_active_ebone(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tselem), int set)
+{
+ bArmature *arm= scene->obedit->data;
+ EditBone *ebone= te->directdata;
- // flush to parent?
- if(ebone->parent && (ebone->flag & BONE_CONNECTED)) ebone->parent->flag |= BONE_TIPSEL;
-
- WM_event_add_notifier(C, NC_OBJECT|ND_BONE_ACTIVE, scene->obedit);
+ if(set==1) {
+ if(!(ebone->flag & BONE_HIDDEN_A)) {
+ ED_armature_deselect_all(scene->obedit, 0); // deselect
+ tree_element_active_ebone__sel(C, scene, arm, ebone, TRUE);
+ return 1;
}
}
- else {
- if (ebone->flag & BONE_SELECTED) return 1;
+ else if (set==2) {
+ if(!(ebone->flag & BONE_HIDDEN_A)) {
+ if(!(ebone->flag & BONE_SELECTED)) {
+ tree_element_active_ebone__sel(C, scene, arm, ebone, TRUE);
+ return 1;
+ }
+ else {
+ /* entirely selected, so de-select */
+ tree_element_active_ebone__sel(C, scene, arm, ebone, FALSE);
+ return 0;
+ }
+ }
+ }
+ else if (ebone->flag & BONE_SELECTED) {
+ return 1;
}
return 0;
}
-static int tree_element_active_modifier(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_modifier(bContext *C, TreeElement *UNUSED(te), TreeStoreElem *tselem, int set)
{
if(set) {
Object *ob= (Object *)tselem->id;
@@ -2214,7 +2297,7 @@ static int tree_element_active_modifier(bContext *C, TreeElement *te, TreeStoreE
return 0;
}
-static int tree_element_active_psys(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_psys(bContext *C, Scene *UNUSED(scene), TreeElement *UNUSED(te), TreeStoreElem *tselem, int set)
{
if(set) {
Object *ob= (Object *)tselem->id;
@@ -2227,7 +2310,7 @@ static int tree_element_active_psys(bContext *C, Scene *scene, TreeElement *te,
return 0;
}
-static int tree_element_active_constraint(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_constraint(bContext *C, TreeElement *UNUSED(te), TreeStoreElem *tselem, int set)
{
if(set) {
Object *ob= (Object *)tselem->id;
@@ -2239,7 +2322,7 @@ static int tree_element_active_constraint(bContext *C, TreeElement *te, TreeStor
return 0;
}
-static int tree_element_active_text(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set)
+static int tree_element_active_text(bContext *UNUSED(C), Scene *UNUSED(scene), SpaceOops *UNUSED(soops), TreeElement *UNUSED(te), int UNUSED(set))
{
// XXX removed
return 0;
@@ -2264,7 +2347,7 @@ static int tree_element_active(bContext *C, Scene *scene, SpaceOops *soops, Tree
return 0;
}
-static int tree_element_active_pose(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_pose(bContext *C, Scene *scene, TreeElement *UNUSED(te), TreeStoreElem *tselem, int set)
{
Object *ob= (Object *)tselem->id;
Base *base= object_in_scene(ob, scene);
@@ -2284,7 +2367,7 @@ static int tree_element_active_pose(bContext *C, Scene *scene, TreeElement *te,
return 0;
}
-static int tree_element_active_sequence(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_sequence(TreeElement *te, TreeStoreElem *UNUSED(tselem), int set)
{
Sequence *seq= (Sequence*) te->directdata;
@@ -2298,7 +2381,7 @@ static int tree_element_active_sequence(bContext *C, TreeElement *te, TreeStoreE
return(0);
}
-static int tree_element_active_sequence_dup(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_sequence_dup(Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tselem), int set)
{
Sequence *seq, *p;
Editing *ed= seq_give_editing(scene, FALSE);
@@ -2325,7 +2408,7 @@ static int tree_element_active_sequence_dup(bContext *C, Scene *scene, TreeEleme
return(0);
}
-static int tree_element_active_keymap_item(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_keymap_item(bContext *UNUSED(C), TreeElement *te, TreeStoreElem *UNUSED(tselem), int set)
{
wmKeyMapItem *kmi= te->directdata;
@@ -2370,9 +2453,9 @@ static int tree_element_type_active(bContext *C, Scene *scene, SpaceOops *soops,
case TSE_POSEGRP:
return tree_element_active_posegroup(C, scene, te, tselem, set);
case TSE_SEQUENCE:
- return tree_element_active_sequence(C, te, tselem, set);
+ return tree_element_active_sequence(te, tselem, set);
case TSE_SEQUENCE_DUP:
- return tree_element_active_sequence_dup(C, scene, te, tselem, set);
+ return tree_element_active_sequence_dup(scene, te, tselem, set);
case TSE_KEYMAP_ITEM:
return tree_element_active_keymap_item(C, te, tselem, set);
@@ -2450,19 +2533,7 @@ static int do_outliner_item_activate(bContext *C, Scene *scene, ARegion *ar, Spa
WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
}
else if(ELEM5(te->idcode, ID_ME, ID_CU, ID_MB, ID_LT, ID_AR)) {
- Object *obedit= CTX_data_edit_object(C);
- if(obedit)
- ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR|EM_DO_UNDO);
- else {
- Object *ob= CTX_data_active_object(C);
-
- /* Don't allow edit mode if the object is hide!
- * check the bug #22153 and #21609
- */
- if (ob && (!(ob->restrictflag & OB_RESTRICT_VIEW)))
- ED_object_enter_editmode(C, EM_WAITCURSOR);
- // XXX extern_set_butspace(F9KEY, 0);
- }
+ WM_operator_name_call(C, "OBJECT_OT_editmode_toggle", WM_OP_INVOKE_REGION_WIN, NULL);
} else { // rest of types
tree_element_active(C, scene, soops, te, 1);
}
@@ -2489,9 +2560,12 @@ static int outliner_item_activate(bContext *C, wmOperator *op, wmEvent *event)
TreeElement *te;
float fmval[2];
int extend= RNA_boolean_get(op->ptr, "extend");
-
+
UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, fmval, fmval+1);
-
+
+ if(!ELEM3(soops->outlinevis, SO_DATABLOCKS, SO_USERDEF, SO_KEYMAP) && !(soops->flag & SO_HIDE_RESTRICTCOLS) && fmval[0] > ar->v2d.cur.xmax - OL_TOG_RESTRICT_VIEWX)
+ return OPERATOR_CANCELLED;
+
for(te= soops->tree.first; te; te= te->next) {
if(do_outliner_item_activate(C, scene, ar, soops, te, extend, fmval)) break;
}
@@ -2524,6 +2598,7 @@ void OUTLINER_OT_item_activate(wmOperatorType *ot)
{
ot->name= "Activate Item";
ot->idname= "OUTLINER_OT_item_activate";
+ ot->description= "Handle mouse clicks to activate/select items";
ot->invoke= outliner_item_activate;
@@ -2586,6 +2661,7 @@ void OUTLINER_OT_item_openclose(wmOperatorType *ot)
{
ot->name= "Open/Close Item";
ot->idname= "OUTLINER_OT_item_openclose";
+ ot->description= "Toggle whether item under cursor is enabled or closed";
ot->invoke= outliner_item_openclose;
@@ -2616,9 +2692,11 @@ static int do_outliner_item_rename(bContext *C, ARegion *ar, SpaceOops *soops, T
error("Cannot edit sequence name");
else if(tselem->id->lib) {
// XXX error_libdata();
- } else if(te->idcode == ID_LI && te->parent) {
+ }
+ else if(te->idcode == ID_LI && te->parent) {
error("Cannot edit the path of an indirectly linked library");
- } else {
+ }
+ else {
tselem->flag |= TSE_TEXTBUT;
ED_region_tag_redraw(ar);
}
@@ -2632,7 +2710,7 @@ static int do_outliner_item_rename(bContext *C, ARegion *ar, SpaceOops *soops, T
return 0;
}
-static int outliner_item_rename(bContext *C, wmOperator *op, wmEvent *event)
+static int outliner_item_rename(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
ARegion *ar= CTX_wm_region(C);
SpaceOops *soops= CTX_wm_space_outliner(C);
@@ -2653,45 +2731,13 @@ void OUTLINER_OT_item_rename(wmOperatorType *ot)
{
ot->name= "Rename Item";
ot->idname= "OUTLINER_OT_item_rename";
+ ot->description= "Rename item under cursor";
ot->invoke= outliner_item_rename;
ot->poll= ED_operator_outliner_active;
}
-
-
-/* recursive helper for function below */
-static void outliner_set_coordinates_element(SpaceOops *soops, TreeElement *te, int startx, int *starty)
-{
- TreeStoreElem *tselem= TREESTORE(te);
-
- /* store coord and continue, we need coordinates for elements outside view too */
- te->xs= (float)startx;
- te->ys= (float)(*starty);
- *starty-= OL_H;
-
- if((tselem->flag & TSE_CLOSED)==0) {
- TreeElement *ten;
- for(ten= te->subtree.first; ten; ten= ten->next) {
- outliner_set_coordinates_element(soops, ten, startx+OL_X, starty);
- }
- }
-
-}
-
-/* to retrieve coordinates with redrawing the entire tree */
-static void outliner_set_coordinates(ARegion *ar, SpaceOops *soops)
-{
- TreeElement *te;
- int starty= (int)(ar->v2d.tot.ymax)-OL_H;
- int startx= 0;
-
- for(te= soops->tree.first; te; te= te->next) {
- outliner_set_coordinates_element(soops, te, startx, &starty);
- }
-}
-
static TreeElement *outliner_find_id(SpaceOops *soops, ListBase *lb, ID *id)
{
TreeElement *te, *tes;
@@ -2702,7 +2748,7 @@ static TreeElement *outliner_find_id(SpaceOops *soops, ListBase *lb, ID *id)
if(tselem->type==0) {
if(tselem->id==id) return te;
/* only deeper on scene or object */
- if( te->idcode==ID_OB || te->idcode==ID_SCE) {
+ if( te->idcode==ID_OB || te->idcode==ID_SCE || (soops->outlinevis == SO_GROUPS && te->idcode==ID_GR)) {
tes= outliner_find_id(soops, &te->subtree, id);
if(tes) return tes;
}
@@ -2711,7 +2757,7 @@ static TreeElement *outliner_find_id(SpaceOops *soops, ListBase *lb, ID *id)
return NULL;
}
-static int outliner_show_active_exec(bContext *C, wmOperator *op)
+static int outliner_show_active_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *so= CTX_wm_space_outliner(C);
Scene *scene= CTX_data_scene(C);
@@ -2757,8 +2803,66 @@ void OUTLINER_OT_show_active(wmOperatorType *ot)
/* callbacks */
ot->exec= outliner_show_active_exec;
ot->poll= ED_operator_outliner_active;
+}
+
+/* tse is not in the treestore, we use its contents to find a match */
+static TreeElement *outliner_find_tse(SpaceOops *soops, TreeStoreElem *tse)
+{
+ TreeStore *ts= soops->treestore;
+ TreeStoreElem *tselem;
+ int a;
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ if(tse->id==NULL) return NULL;
+
+ /* check if 'tse' is in treestore */
+ tselem= ts->data;
+ for(a=0; a<ts->usedelem; a++, tselem++) {
+ if((tse->type==0 && tselem->type==0) || (tselem->type==tse->type && tselem->nr==tse->nr)) {
+ if(tselem->id==tse->id) {
+ break;
+ }
+ }
+ }
+ if(tselem)
+ return outliner_find_tree_element(&soops->tree, a);
+
+ return NULL;
+}
+
+
+/* Called to find an item based on name.
+ */
+#if 0
+
+/* recursive helper for function below */
+static void outliner_set_coordinates_element(SpaceOops *soops, TreeElement *te, int startx, int *starty)
+{
+ TreeStoreElem *tselem= TREESTORE(te);
+
+ /* store coord and continue, we need coordinates for elements outside view too */
+ te->xs= (float)startx;
+ te->ys= (float)(*starty);
+ *starty-= OL_H;
+
+ if((tselem->flag & TSE_CLOSED)==0) {
+ TreeElement *ten;
+ for(ten= te->subtree.first; ten; ten= ten->next) {
+ outliner_set_coordinates_element(soops, ten, startx+OL_X, starty);
+ }
+ }
+
+}
+
+/* to retrieve coordinates with redrawing the entire tree */
+static void outliner_set_coordinates(ARegion *ar, SpaceOops *soops)
+{
+ TreeElement *te;
+ int starty= (int)(ar->v2d.tot.ymax)-OL_H;
+ int startx= 0;
+
+ for(te= soops->tree.first; te; te= te->next) {
+ outliner_set_coordinates_element(soops, te, startx, &starty);
+ }
}
/* find next element that has this name */
@@ -2790,34 +2894,7 @@ static TreeElement *outliner_find_named(SpaceOops *soops, ListBase *lb, char *na
return NULL;
}
-/* tse is not in the treestore, we use its contents to find a match */
-static TreeElement *outliner_find_tse(SpaceOops *soops, TreeStoreElem *tse)
-{
- TreeStore *ts= soops->treestore;
- TreeStoreElem *tselem;
- int a;
-
- if(tse->id==NULL) return NULL;
-
- /* check if 'tse' is in treestore */
- tselem= ts->data;
- for(a=0; a<ts->usedelem; a++, tselem++) {
- if((tse->type==0 && tselem->type==0) || (tselem->type==tse->type && tselem->nr==tse->nr)) {
- if(tselem->id==tse->id) {
- break;
- }
- }
- }
- if(tselem)
- return outliner_find_tree_element(&soops->tree, a);
-
- return NULL;
-}
-
-
-/* Called to find an item based on name.
- */
-void outliner_find_panel(Scene *scene, ARegion *ar, SpaceOops *soops, int again, int flags)
+static void outliner_find_panel(Scene *UNUSED(scene), ARegion *ar, SpaceOops *soops, int again, int flags)
{
TreeElement *te= NULL;
TreeElement *last_find;
@@ -2889,6 +2966,7 @@ void outliner_find_panel(Scene *scene, ARegion *ar, SpaceOops *soops, int again,
error("Not found: %s", name);
}
}
+#endif
/* helper function for tree_element_shwo_hierarchy() - recursively checks whether subtrees have any objects*/
static int subtree_has_objects(SpaceOops *soops, ListBase *lb)
@@ -2931,7 +3009,7 @@ static void tree_element_show_hierarchy(Scene *scene, SpaceOops *soops, ListBase
}
/* show entire object level hierarchy */
-static int outliner_show_hierarchy_exec(bContext *C, wmOperator *op)
+static int outliner_show_hierarchy_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soops= CTX_wm_space_outliner(C);
ARegion *ar= CTX_wm_region(C);
@@ -3049,7 +3127,7 @@ static void set_operation_types(SpaceOops *soops, ListBase *lb,
}
}
-static void unlink_material_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void unlink_material_cb(bContext *UNUSED(C), Scene *UNUSED(scene), TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *UNUSED(tselem))
{
Material **matar=NULL;
int a, totcol=0;
@@ -3083,7 +3161,7 @@ static void unlink_material_cb(bContext *C, Scene *scene, TreeElement *te, TreeS
}
}
-static void unlink_texture_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void unlink_texture_cb(bContext *UNUSED(C), Scene *UNUSED(scene), TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *UNUSED(tselem))
{
MTex **mtex= NULL;
int a;
@@ -3112,7 +3190,7 @@ static void unlink_texture_cb(bContext *C, Scene *scene, TreeElement *te, TreeSt
}
}
-static void unlink_group_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void unlink_group_cb(bContext *UNUSED(C), Scene *UNUSED(scene), TreeElement *UNUSED(te), TreeStoreElem *tsep, TreeStoreElem *tselem)
{
Group *group= (Group *)tselem->id;
@@ -3149,7 +3227,7 @@ static void outliner_do_libdata_operation(bContext *C, Scene *scene, SpaceOops *
/* */
-static void object_select_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void object_select_cb(bContext *UNUSED(C), Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
{
Base *base= (Base *)te->directdata;
@@ -3160,7 +3238,7 @@ static void object_select_cb(bContext *C, Scene *scene, TreeElement *te, TreeSto
}
}
-static void object_deselect_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void object_deselect_cb(bContext *UNUSED(C), Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
{
Base *base= (Base *)te->directdata;
@@ -3171,7 +3249,7 @@ static void object_deselect_cb(bContext *C, Scene *scene, TreeElement *te, TreeS
}
}
-static void object_delete_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void object_delete_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
{
Base *base= (Base *)te->directdata;
@@ -3189,7 +3267,7 @@ static void object_delete_cb(bContext *C, Scene *scene, TreeElement *te, TreeSto
}
-static void id_local_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void id_local_cb(bContext *UNUSED(C), Scene *UNUSED(scene), TreeElement *UNUSED(te), TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
{
if(tselem->id->lib && (tselem->id->flag & LIB_EXTERN)) {
tselem->id->lib= NULL;
@@ -3198,7 +3276,7 @@ static void id_local_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreEle
}
}
-static void group_linkobs2scene_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void group_linkobs2scene_cb(bContext *UNUSED(C), Scene *scene, TreeElement *UNUSED(te), TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
{
Group *group= (Group *)tselem->id;
GroupObject *gob;
@@ -3251,7 +3329,7 @@ static void outliner_do_object_operation(bContext *C, Scene *scene_act, SpaceOop
/* ******************************************** */
-static void pchan_cb(int event, TreeElement *te, TreeStoreElem *tselem)
+static void pchan_cb(int event, TreeElement *te, TreeStoreElem *UNUSED(tselem))
{
bPoseChannel *pchan= (bPoseChannel *)te->directdata;
@@ -3267,7 +3345,7 @@ static void pchan_cb(int event, TreeElement *te, TreeStoreElem *tselem)
pchan->bone->flag &= ~BONE_HIDDEN_P;
}
-static void bone_cb(int event, TreeElement *te, TreeStoreElem *tselem)
+static void bone_cb(int event, TreeElement *te, TreeStoreElem *UNUSED(tselem))
{
Bone *bone= (Bone *)te->directdata;
@@ -3283,7 +3361,7 @@ static void bone_cb(int event, TreeElement *te, TreeStoreElem *tselem)
bone->flag &= ~BONE_HIDDEN_P;
}
-static void ebone_cb(int event, TreeElement *te, TreeStoreElem *tselem)
+static void ebone_cb(int event, TreeElement *te, TreeStoreElem *UNUSED(tselem))
{
EditBone *ebone= (EditBone *)te->directdata;
@@ -3299,7 +3377,7 @@ static void ebone_cb(int event, TreeElement *te, TreeStoreElem *tselem)
ebone->flag &= ~BONE_HIDDEN_A;
}
-static void sequence_cb(int event, TreeElement *te, TreeStoreElem *tselem)
+static void sequence_cb(int event, TreeElement *UNUSED(te), TreeStoreElem *UNUSED(tselem))
{
// Sequence *seq= (Sequence*) te->directdata;
if(event==1) {
@@ -3326,7 +3404,7 @@ static void outliner_do_data_operation(SpaceOops *soops, int type, int event, Li
}
}
-void outliner_del(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops)
+void outliner_del(bContext *C, Scene *scene, ARegion *UNUSED(ar), SpaceOops *soops)
{
if(soops->outlinevis==SO_SEQUENCE)
@@ -3357,7 +3435,7 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op)
Scene *scene= CTX_data_scene(C);
SpaceOops *soops= CTX_wm_space_outliner(C);
int event;
- char *str= NULL;
+ const char *str= NULL;
/* check for invalid states */
if (soops == NULL)
@@ -3403,6 +3481,7 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op)
else if(event==8) {
outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_renderability_cb);
str= "Toggle Renderability";
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_RENDER, scene);
}
ED_undo_push(C, str);
@@ -3685,7 +3764,7 @@ static int do_outliner_operation_event(bContext *C, Scene *scene, ARegion *ar, S
}
-static int outliner_operation(bContext *C, wmOperator *op, wmEvent *event)
+static int outliner_operation(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
Scene *scene= CTX_data_scene(C);
ARegion *ar= CTX_wm_region(C);
@@ -3707,6 +3786,7 @@ void OUTLINER_OT_operation(wmOperatorType *ot)
{
ot->name= "Execute Operation";
ot->idname= "OUTLINER_OT_operation";
+ ot->description= "Context menu for item operations";
ot->invoke= outliner_operation;
@@ -3735,7 +3815,7 @@ static int ed_operator_outliner_datablocks_active(bContext *C)
* this function does not do that yet
*/
static void tree_element_to_path(SpaceOops *soops, TreeElement *te, TreeStoreElem *tselem,
- ID **id, char **path, int *array_index, short *flag, short *groupmode)
+ ID **id, char **path, int *array_index, short *flag, short *UNUSED(groupmode))
{
ListBase hierarchy = {NULL, NULL};
LinkData *ld;
@@ -3878,7 +3958,7 @@ enum {
/* Utilities ---------------------------------- */
/* Recursively iterate over tree, finding and working on selected items */
-static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, short mode)
+static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, ReportList *reports, short mode)
{
TreeElement *te;
TreeStoreElem *tselem;
@@ -3903,6 +3983,7 @@ static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, short m
/* only if ID and path were set, should we perform any actions */
if (id && path) {
+ short dflags = CREATEDRIVER_WITH_DEFAULT_DVAR;
int arraylen = 1;
/* array checks */
@@ -3924,13 +4005,13 @@ static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, short m
case DRIVERS_EDITMODE_ADD:
{
/* add a new driver with the information obtained (only if valid) */
- ANIM_add_driver(id, path, array_index, flag, DRIVER_TYPE_PYTHON);
+ ANIM_add_driver(reports, id, path, array_index, dflags, DRIVER_TYPE_PYTHON);
}
break;
case DRIVERS_EDITMODE_REMOVE:
{
/* remove driver matching the information obtained (only if valid) */
- ANIM_remove_driver(id, path, array_index, flag);
+ ANIM_remove_driver(reports, id, path, array_index, dflags);
}
break;
}
@@ -3945,7 +4026,7 @@ static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, short m
/* go over sub-tree */
if ((tselem->flag & TSE_CLOSED)==0)
- do_outliner_drivers_editop(soops, &te->subtree, mode);
+ do_outliner_drivers_editop(soops, &te->subtree, reports, mode);
}
}
@@ -3960,10 +4041,10 @@ static int outliner_drivers_addsel_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
/* recursively go into tree, adding selected items */
- do_outliner_drivers_editop(soutliner, &soutliner->tree, DRIVERS_EDITMODE_ADD);
+ do_outliner_drivers_editop(soutliner, &soutliner->tree, op->reports, DRIVERS_EDITMODE_ADD);
/* send notifiers */
- WM_event_add_notifier(C, ND_KEYS, NULL); // XXX
+ WM_event_add_notifier(C, NC_ANIMATION|ND_FCURVES_ORDER, NULL); // XXX
return OPERATOR_FINISHED;
}
@@ -3980,7 +4061,7 @@ void OUTLINER_OT_drivers_add_selected(wmOperatorType *ot)
ot->poll= ed_operator_outliner_datablocks_active;
/* flags */
- ot->flag = OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
@@ -3995,7 +4076,7 @@ static int outliner_drivers_deletesel_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
/* recursively go into tree, adding selected items */
- do_outliner_drivers_editop(soutliner, &soutliner->tree, DRIVERS_EDITMODE_REMOVE);
+ do_outliner_drivers_editop(soutliner, &soutliner->tree, op->reports, DRIVERS_EDITMODE_REMOVE);
/* send notifiers */
WM_event_add_notifier(C, ND_KEYS, NULL); // XXX
@@ -4015,7 +4096,7 @@ void OUTLINER_OT_drivers_delete_selected(wmOperatorType *ot)
ot->poll= ed_operator_outliner_datablocks_active;
/* flags */
- ot->flag = OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
/* ***************** KEYINGSET OPERATIONS *************** */
@@ -4097,12 +4178,9 @@ static void do_outliner_keyingset_editop(SpaceOops *soops, KeyingSet *ks, ListBa
if (ksp) {
/* free path's data */
- // TODO: we probably need an API method for this
- if (ksp->rna_path) MEM_freeN(ksp->rna_path);
+ BKE_keyingset_free_path(ks, ksp);
+
ks->active_path= 0;
-
- /* remove path from set */
- BLI_freelinkN(&ks->paths, ksp);
}
}
break;
@@ -4148,20 +4226,21 @@ void OUTLINER_OT_keyingset_add_selected(wmOperatorType *ot)
{
/* identifiers */
ot->idname= "OUTLINER_OT_keyingset_add_selected";
- ot->name= "Keyingset Add Selected";
+ ot->name= "Keying Set Add Selected";
+ ot->description= "Add selected items (blue-grey rows) to active Keying Set";
/* api callbacks */
ot->exec= outliner_keyingset_additems_exec;
ot->poll= ed_operator_outliner_datablocks_active;
/* flags */
- ot->flag = OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
/* Remove Operator ---------------------------------- */
-static int outliner_keyingset_removeitems_exec(bContext *C, wmOperator *op)
+static int outliner_keyingset_removeitems_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soutliner= CTX_wm_space_outliner(C);
Scene *scene= CTX_data_scene(C);
@@ -4184,14 +4263,15 @@ void OUTLINER_OT_keyingset_remove_selected(wmOperatorType *ot)
{
/* identifiers */
ot->idname= "OUTLINER_OT_keyingset_remove_selected";
- ot->name= "Keyingset Remove Selected";
+ ot->name= "Keying Set Remove Selected";
+ ot->description = "Remove selected items (blue-grey rows) from active Keying Set";
/* api callbacks */
ot->exec= outliner_keyingset_removeitems_exec;
ot->poll= ed_operator_outliner_datablocks_active;
/* flags */
- ot->flag = OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
/* ***************** DRAW *************** */
@@ -4482,7 +4562,6 @@ static void outliner_draw_iconrow(bContext *C, uiBlock *block, Scene *scene, Spa
if(level<1 || (tselem->type==0 && te->idcode==ID_OB)) {
/* active blocks get white circle */
- active= 0;
if(tselem->type==0) {
if(te->idcode==ID_OB) active= (OBACT==(Object *)tselem->id);
else if(scene->obedit && scene->obedit->data==tselem->id) active= 1; // XXX use context?
@@ -4513,6 +4592,21 @@ static void outliner_draw_iconrow(bContext *C, uiBlock *block, Scene *scene, Spa
}
+/* closed tree element */
+static void outliner_set_coord_tree_element(SpaceOops *soops, TreeElement *te, int startx, int *starty)
+{
+ TreeElement *ten;
+
+ /* store coord and continue, we need coordinates for elements outside view too */
+ te->xs= (float)startx;
+ te->ys= (float)(*starty);
+
+ for(ten= te->subtree.first; ten; ten= ten->next) {
+ outliner_set_coord_tree_element(soops, ten, startx+OL_X, starty);
+ }
+}
+
+
static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, int startx, int *starty)
{
TreeElement *ten;
@@ -4667,13 +4761,18 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene
te->ys= (float)*starty;
te->xend= startx+offsx;
- *starty-= OL_H;
-
if((tselem->flag & TSE_CLOSED)==0) {
- for(ten= te->subtree.first; ten; ten= ten->next) {
+ *starty-= OL_H;
+
+ for(ten= te->subtree.first; ten; ten= ten->next)
outliner_draw_tree_element(C, block, scene, ar, soops, ten, startx+OL_X, starty);
- }
}
+ else {
+ for(ten= te->subtree.first; ten; ten= ten->next)
+ outliner_set_coord_tree_element(soops, te, startx, starty);
+
+ *starty-= OL_H;
+ }
}
static void outliner_draw_hierarchy(SpaceOops *soops, ListBase *lb, int startx, int *starty)
@@ -4787,7 +4886,7 @@ static void outliner_draw_tree(bContext *C, uiBlock *block, Scene *scene, ARegio
}
-static void outliner_back(ARegion *ar, SpaceOops *soops)
+static void outliner_back(ARegion *ar)
{
int ystart;
@@ -4801,7 +4900,7 @@ static void outliner_back(ARegion *ar, SpaceOops *soops)
}
}
-static void outliner_draw_restrictcols(ARegion *ar, SpaceOops *soops)
+static void outliner_draw_restrictcols(ARegion *ar)
{
int ystart;
@@ -4843,16 +4942,8 @@ static void restrictbutton_view_cb(bContext *C, void *poin, void *poin2)
{
Scene *scene = (Scene *)poin;
Object *ob = (Object *)poin2;
- Object *obedit= CTX_data_edit_object(C);
- /* Don't allow hide an objet in edit mode,
- * check the bug #22153 and #21609
- */
- if (obedit && obedit == ob) {
- if (ob->restrictflag & OB_RESTRICT_VIEW)
- ob->restrictflag &= ~OB_RESTRICT_VIEW;
- return;
- }
+ if(!common_restrict_check(C, ob)) return;
/* deselect objects that are invisible */
if (ob->restrictflag & OB_RESTRICT_VIEW) {
@@ -4869,6 +4960,8 @@ static void restrictbutton_sel_cb(bContext *C, void *poin, void *poin2)
Scene *scene = (Scene *)poin;
Object *ob = (Object *)poin2;
+ if(!common_restrict_check(C, ob)) return;
+
/* if select restriction has just been turned on */
if (ob->restrictflag & OB_RESTRICT_SELECT) {
/* Ouch! There is no backwards pointer from Object to Base,
@@ -4879,26 +4972,26 @@ static void restrictbutton_sel_cb(bContext *C, void *poin, void *poin2)
}
-static void restrictbutton_rend_cb(bContext *C, void *poin, void *poin2)
+static void restrictbutton_rend_cb(bContext *C, void *poin, void *UNUSED(poin2))
{
- WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, poin);
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_RENDER, poin);
}
-static void restrictbutton_r_lay_cb(bContext *C, void *poin, void *poin2)
+static void restrictbutton_r_lay_cb(bContext *C, void *poin, void *UNUSED(poin2))
{
WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, poin);
}
-static void restrictbutton_modifier_cb(bContext *C, void *poin, void *poin2)
+static void restrictbutton_modifier_cb(bContext *C, void *UNUSED(poin), void *poin2)
{
Object *ob = (Object *)poin2;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
}
-static void restrictbutton_bone_cb(bContext *C, void *poin, void *poin2)
+static void restrictbutton_bone_cb(bContext *C, void *UNUSED(poin), void *poin2)
{
Bone *bone= (Bone *)poin2;
if(bone && (bone->flag & BONE_HIDDEN_P))
@@ -4906,7 +4999,7 @@ static void restrictbutton_bone_cb(bContext *C, void *poin, void *poin2)
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL);
}
-static void restrictbutton_ebone_cb(bContext *C, void *poin, void *poin2)
+static void restrictbutton_ebone_cb(bContext *C, void *UNUSED(poin), void *poin2)
{
EditBone *ebone= (EditBone *)poin2;
if(ebone && (ebone->flag & BONE_HIDDEN_A))
@@ -4938,7 +5031,7 @@ static int group_select_flag(Group *gr)
return 0;
}
-static void restrictbutton_gr_restrict_flag(bContext *C, void *poin, void *poin2, int flag)
+static void restrictbutton_gr_restrict_flag(void *poin, void *poin2, int flag)
{
Scene *scene = (Scene *)poin;
GroupObject *gob;
@@ -4955,28 +5048,31 @@ static void restrictbutton_gr_restrict_flag(bContext *C, void *poin, void *poin2
}
else {
for(gob= gr->gobject.first; gob; gob= gob->next) {
- gob->ob->restrictflag |= flag;
+ /* not in editmode */
+ if(scene->obedit!=gob->ob) {
+ gob->ob->restrictflag |= flag;
- if(flag==OB_RESTRICT_VIEW)
- if((gob->ob->flag & SELECT) == 0)
- ED_base_object_select(object_in_scene(gob->ob, scene), BA_SELECT);
+ if(flag==OB_RESTRICT_VIEW)
+ if((gob->ob->flag & SELECT) == 0)
+ ED_base_object_select(object_in_scene(gob->ob, scene), BA_SELECT);
+ }
}
}
}
static void restrictbutton_gr_restrict_view(bContext *C, void *poin, void *poin2)
{
- restrictbutton_gr_restrict_flag(C, poin, poin2, OB_RESTRICT_VIEW);
+ restrictbutton_gr_restrict_flag(poin, poin2, OB_RESTRICT_VIEW);
WM_event_add_notifier(C, NC_GROUP, NULL);
}
static void restrictbutton_gr_restrict_select(bContext *C, void *poin, void *poin2)
{
- restrictbutton_gr_restrict_flag(C, poin, poin2, OB_RESTRICT_SELECT);
+ restrictbutton_gr_restrict_flag(poin, poin2, OB_RESTRICT_SELECT);
WM_event_add_notifier(C, NC_GROUP, NULL);
}
static void restrictbutton_gr_restrict_render(bContext *C, void *poin, void *poin2)
{
- restrictbutton_gr_restrict_flag(C, poin, poin2, OB_RESTRICT_RENDER);
+ restrictbutton_gr_restrict_flag(poin, poin2, OB_RESTRICT_RENDER);
WM_event_add_notifier(C, NC_GROUP, NULL);
}
@@ -5011,7 +5107,7 @@ static void namebutton_cb(bContext *C, void *tsep, char *oldname)
if (te->idcode == ID_LI) {
char expanded[FILE_MAXDIR + FILE_MAXFILE];
BLI_strncpy(expanded, ((Library *)tselem->id)->name, FILE_MAXDIR + FILE_MAXFILE);
- BLI_path_abs(expanded, G.sce);
+ BLI_path_abs(expanded, G.main->name);
if (!BLI_exists(expanded)) {
error("This path does not exist, correct this before saving");
}
@@ -5030,11 +5126,11 @@ static void namebutton_cb(bContext *C, void *tsep, char *oldname)
bArmature *arm= (bArmature *)tselem->id;
if(arm->edbo) {
EditBone *ebone= te->directdata;
- char newname[32];
+ char newname[sizeof(ebone->name)];
/* restore bone name */
- BLI_strncpy(newname, ebone->name, 32);
- BLI_strncpy(ebone->name, oldname, 32);
+ BLI_strncpy(newname, ebone->name, sizeof(ebone->name));
+ BLI_strncpy(ebone->name, oldname, sizeof(ebone->name));
ED_armature_bone_rename(obedit->data, oldname, newname);
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, OBACT);
}
@@ -5045,15 +5141,15 @@ static void namebutton_cb(bContext *C, void *tsep, char *oldname)
{
Bone *bone= te->directdata;
Object *ob;
- char newname[32];
+ char newname[sizeof(bone->name)];
// always make current object active
tree_element_set_active_object(C, scene, soops, te, 1);
ob= OBACT;
/* restore bone name */
- BLI_strncpy(newname, bone->name, 32);
- BLI_strncpy(bone->name, oldname, 32);
+ BLI_strncpy(newname, bone->name, sizeof(bone->name));
+ BLI_strncpy(bone->name, oldname, sizeof(bone->name));
ED_armature_bone_rename(ob->data, oldname, newname);
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
}
@@ -5062,15 +5158,15 @@ static void namebutton_cb(bContext *C, void *tsep, char *oldname)
{
bPoseChannel *pchan= te->directdata;
Object *ob;
- char newname[32];
+ char newname[sizeof(pchan->name)];
// always make current object active
tree_element_set_active_object(C, scene, soops, te, 1);
ob= OBACT;
/* restore bone name */
- BLI_strncpy(newname, pchan->name, 32);
- BLI_strncpy(pchan->name, oldname, 32);
+ BLI_strncpy(newname, pchan->name, sizeof(pchan->name));
+ BLI_strncpy(pchan->name, oldname, sizeof(pchan->name));
ED_armature_bone_rename(ob->data, oldname, newname);
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
}
@@ -5112,17 +5208,17 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButR(block, ICONTOG, 0, ICON_RESTRICT_VIEW_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1,
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (int)te->ys, 17, OL_H-1,
&ptr, "hide", -1, 0, 0, -1, -1, NULL);
uiButSetFunc(bt, restrictbutton_view_cb, scene, ob);
bt= uiDefIconButR(block, ICONTOG, 0, ICON_RESTRICT_SELECT_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1,
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (int)te->ys, 17, OL_H-1,
&ptr, "hide_select", -1, 0, 0, -1, -1, NULL);
uiButSetFunc(bt, restrictbutton_sel_cb, scene, ob);
bt= uiDefIconButR(block, ICONTOG, 0, ICON_RESTRICT_RENDER_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (short)te->ys, 17, OL_H-1,
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (int)te->ys, 17, OL_H-1,
&ptr, "hide_render", -1, 0, 0, -1, -1, NULL);
uiButSetFunc(bt, restrictbutton_rend_cb, scene, ob);
@@ -5136,15 +5232,15 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
uiBlockSetEmboss(block, UI_EMBOSSN);
restrict_bool= group_restrict_flag(gr, OB_RESTRICT_VIEW);
- bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_VIEW_ON : ICON_RESTRICT_VIEW_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
+ bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_VIEW_ON : ICON_RESTRICT_VIEW_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (int)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
uiButSetFunc(bt, restrictbutton_gr_restrict_view, scene, gr);
restrict_bool= group_restrict_flag(gr, OB_RESTRICT_SELECT);
- bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_SELECT_ON : ICON_RESTRICT_SELECT_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
+ bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_SELECT_ON : ICON_RESTRICT_SELECT_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (int)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
uiButSetFunc(bt, restrictbutton_gr_restrict_select, scene, gr);
restrict_bool= group_restrict_flag(gr, OB_RESTRICT_RENDER);
- bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_RENDER_ON : ICON_RESTRICT_RENDER_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (short)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow renderability");
+ bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_RENDER_ON : ICON_RESTRICT_RENDER_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (int)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow renderability");
uiButSetFunc(bt, restrictbutton_gr_restrict_render, scene, gr);
uiBlockSetEmboss(block, UI_EMBOSS);
@@ -5154,7 +5250,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButBitI(block, ICONTOGN, SCE_LAY_DISABLE, 0, ICON_CHECKBOX_HLT-1,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, te->directdata, 0, 0, 0, 0, "Render this RenderLayer");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (int)te->ys, 17, OL_H-1, te->directdata, 0, 0, 0, 0, "Render this RenderLayer");
uiButSetFunc(bt, restrictbutton_r_lay_cb, tselem->id, NULL);
uiBlockSetEmboss(block, UI_EMBOSS);
@@ -5167,13 +5263,13 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
bt= uiDefIconButBitI(block, ICONTOG, passflag, 0, ICON_CHECKBOX_HLT-1,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Render this Pass");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (int)te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Render this Pass");
uiButSetFunc(bt, restrictbutton_r_lay_cb, tselem->id, NULL);
layflag++; /* is lay_xor */
if(ELEM8(passflag, SCE_PASS_SPEC, SCE_PASS_SHADOW, SCE_PASS_AO, SCE_PASS_REFLECT, SCE_PASS_REFRACT, SCE_PASS_INDIRECT, SCE_PASS_EMIT, SCE_PASS_ENVIRONMENT))
bt= uiDefIconButBitI(block, TOG, passflag, 0, (*layflag & passflag)?ICON_DOT:ICON_BLANK1,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Exclude this Pass from Combined");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (int)te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Exclude this Pass from Combined");
uiButSetFunc(bt, restrictbutton_r_lay_cb, tselem->id, NULL);
uiBlockSetEmboss(block, UI_EMBOSS);
@@ -5184,11 +5280,11 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButBitI(block, ICONTOGN, eModifierMode_Realtime, 0, ICON_RESTRICT_VIEW_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, &(md->mode), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (int)te->ys, 17, OL_H-1, &(md->mode), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
uiButSetFunc(bt, restrictbutton_modifier_cb, scene, ob);
bt= uiDefIconButBitI(block, ICONTOGN, eModifierMode_Render, 0, ICON_RESTRICT_RENDER_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (short)te->ys, 17, OL_H-1, &(md->mode), 0, 0, 0, 0, "Restrict/Allow renderability");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (int)te->ys, 17, OL_H-1, &(md->mode), 0, 0, 0, 0, "Restrict/Allow renderability");
uiButSetFunc(bt, restrictbutton_modifier_cb, scene, ob);
}
else if(tselem->type==TSE_POSE_CHANNEL) {
@@ -5197,11 +5293,11 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButBitI(block, ICONTOG, BONE_HIDDEN_P, 0, ICON_RESTRICT_VIEW_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, &(bone->flag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (int)te->ys, 17, OL_H-1, &(bone->flag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
uiButSetFunc(bt, restrictbutton_bone_cb, NULL, bone);
bt= uiDefIconButBitI(block, ICONTOG, BONE_UNSELECTABLE, 0, ICON_RESTRICT_SELECT_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, &(bone->flag), 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (int)te->ys, 17, OL_H-1, &(bone->flag), 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
uiButSetFunc(bt, restrictbutton_bone_cb, NULL, NULL);
}
else if(tselem->type==TSE_EBONE) {
@@ -5209,11 +5305,11 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButBitI(block, ICONTOG, BONE_HIDDEN_A, 0, ICON_RESTRICT_VIEW_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, &(ebone->flag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (int)te->ys, 17, OL_H-1, &(ebone->flag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
uiButSetFunc(bt, restrictbutton_ebone_cb, NULL, ebone);
bt= uiDefIconButBitI(block, ICONTOG, BONE_UNSELECTABLE, 0, ICON_RESTRICT_SELECT_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, &(ebone->flag), 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (int)te->ys, 17, OL_H-1, &(ebone->flag), 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
uiButSetFunc(bt, restrictbutton_ebone_cb, NULL, NULL);
}
}
@@ -5222,7 +5318,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
}
}
-static void outliner_draw_rnacols(ARegion *ar, SpaceOops *soops, int sizex)
+static void outliner_draw_rnacols(ARegion *ar, int sizex)
{
View2D *v2d= &ar->v2d;
@@ -5260,13 +5356,13 @@ static void outliner_draw_rnabuts(uiBlock *block, Scene *scene, ARegion *ar, Spa
prop= te->directdata;
if(!(RNA_property_type(prop) == PROP_POINTER && (tselem->flag & TSE_CLOSED)==0))
- uiDefAutoButR(block, ptr, prop, -1, "", 0, sizex, (int)te->ys, OL_RNA_COL_SIZEX, OL_H-1);
+ uiDefAutoButR(block, ptr, prop, -1, "", ICON_NULL, sizex, (int)te->ys, OL_RNA_COL_SIZEX, OL_H-1);
}
else if(tselem->type == TSE_RNA_ARRAY_ELEM) {
ptr= &te->rnaptr;
prop= te->directdata;
- uiDefAutoButR(block, ptr, prop, te->index, "", 0, sizex, (int)te->ys, OL_RNA_COL_SIZEX, OL_H-1);
+ uiDefAutoButR(block, ptr, prop, te->index, "", ICON_NULL, sizex, (int)te->ys, OL_RNA_COL_SIZEX, OL_H-1);
}
}
@@ -5274,7 +5370,7 @@ static void outliner_draw_rnabuts(uiBlock *block, Scene *scene, ARegion *ar, Spa
}
}
-static void operator_call_cb(struct bContext *C, void *arg_kmi, void *arg2)
+static void operator_call_cb(struct bContext *UNUSED(C), void *arg_kmi, void *arg2)
{
wmOperatorType *ot= arg2;
wmKeyMapItem *kmi= arg_kmi;
@@ -5283,7 +5379,7 @@ static void operator_call_cb(struct bContext *C, void *arg_kmi, void *arg2)
BLI_strncpy(kmi->idname, ot->idname, OP_MAX_TYPENAME);
}
-static void operator_search_cb(const struct bContext *C, void *arg_kmi, char *str, uiSearchItems *items)
+static void operator_search_cb(const struct bContext *UNUSED(C), void *UNUSED(arg_kmi), const char *str, uiSearchItems *items)
{
wmOperatorType *ot = WM_operatortype_first();
@@ -5352,89 +5448,79 @@ static short keymap_menu_type(short type)
return 0;
}
-static char *keymap_type_menu(void)
+static const char *keymap_type_menu(void)
{
- static char string[500];
- static char formatstr[] = "|%s %%x%d";
- char *str= string;
-
- str += sprintf(str, "Event Type %%t");
-
- str += sprintf(str, formatstr, "Keyboard", OL_KM_KEYBOARD);
- str += sprintf(str, formatstr, "Mouse", OL_KM_MOUSE);
- str += sprintf(str, formatstr, "Tweak", OL_KM_TWEAK);
-// str += sprintf(str, formatstr, "Specials", OL_KM_SPECIALS);
-
+ static const char string[]=
+ "Event Type%t"
+ "|Keyboard%x" STRINGIFY(OL_KM_KEYBOARD)
+ "|Mouse%x" STRINGIFY(OL_KM_MOUSE)
+ "|Tweak%x" STRINGIFY(OL_KM_TWEAK)
+// "|Specials%x" STRINGIFY(OL_KM_SPECIALS)
+ ;
+
return string;
-}
-
-static char *keymap_mouse_menu(void)
-{
- static char string[500];
- static char formatstr[] = "|%s %%x%d";
- char *str= string;
-
- str += sprintf(str, "Mouse Event %%t");
-
- str += sprintf(str, formatstr, "Left Mouse", LEFTMOUSE);
- str += sprintf(str, formatstr, "Middle Mouse", MIDDLEMOUSE);
- str += sprintf(str, formatstr, "Right Mouse", RIGHTMOUSE);
- str += sprintf(str, formatstr, "Button4 Mouse ", BUTTON4MOUSE);
- str += sprintf(str, formatstr, "Button5 Mouse ", BUTTON5MOUSE);
- str += sprintf(str, formatstr, "Action Mouse", ACTIONMOUSE);
- str += sprintf(str, formatstr, "Select Mouse", SELECTMOUSE);
- str += sprintf(str, formatstr, "Mouse Move", MOUSEMOVE);
- str += sprintf(str, formatstr, "Wheel Up", WHEELUPMOUSE);
- str += sprintf(str, formatstr, "Wheel Down", WHEELDOWNMOUSE);
- str += sprintf(str, formatstr, "Wheel In", WHEELINMOUSE);
- str += sprintf(str, formatstr, "Wheel Out", WHEELOUTMOUSE);
- str += sprintf(str, formatstr, "Mouse/Trackpad Pan", MOUSEPAN);
- str += sprintf(str, formatstr, "Mouse/Trackpad Zoom", MOUSEZOOM);
- str += sprintf(str, formatstr, "Mouse/Trackpad Rotate", MOUSEROTATE);
-
+}
+
+static const char *keymap_mouse_menu(void)
+{
+ static const char string[]=
+ "Mouse Event%t"
+ "|Left Mouse%x" STRINGIFY(LEFTMOUSE)
+ "|Middle Mouse%x" STRINGIFY(MIDDLEMOUSE)
+ "|Right Mouse%x" STRINGIFY(RIGHTMOUSE)
+ "|Middle Mouse%x" STRINGIFY(MIDDLEMOUSE)
+ "|Right Mouse%x" STRINGIFY(RIGHTMOUSE)
+ "|Button4 Mouse%x" STRINGIFY(BUTTON4MOUSE)
+ "|Button5 Mouse%x" STRINGIFY(BUTTON5MOUSE)
+ "|Action Mouse%x" STRINGIFY(ACTIONMOUSE)
+ "|Select Mouse%x" STRINGIFY(SELECTMOUSE)
+ "|Mouse Move%x" STRINGIFY(MOUSEMOVE)
+ "|Wheel Up%x" STRINGIFY(WHEELUPMOUSE)
+ "|Wheel Down%x" STRINGIFY(WHEELDOWNMOUSE)
+ "|Wheel In%x" STRINGIFY(WHEELINMOUSE)
+ "|Wheel Out%x" STRINGIFY(WHEELOUTMOUSE)
+ "|Mouse/Trackpad Pan%x" STRINGIFY(MOUSEPAN)
+ "|Mouse/Trackpad Zoom%x" STRINGIFY(MOUSEZOOM)
+ "|Mouse/Trackpad Rotate%x" STRINGIFY(MOUSEROTATE)
+ ;
+
return string;
}
-static char *keymap_tweak_menu(void)
+static const char *keymap_tweak_menu(void)
{
- static char string[500];
- static char formatstr[] = "|%s %%x%d";
- char *str= string;
-
- str += sprintf(str, "Tweak Event %%t");
-
- str += sprintf(str, formatstr, "Left Mouse", EVT_TWEAK_L);
- str += sprintf(str, formatstr, "Middle Mouse", EVT_TWEAK_M);
- str += sprintf(str, formatstr, "Right Mouse", EVT_TWEAK_R);
- str += sprintf(str, formatstr, "Action Mouse", EVT_TWEAK_A);
- str += sprintf(str, formatstr, "Select Mouse", EVT_TWEAK_S);
-
+ static const char string[]=
+ "Tweak Event%t"
+ "|Left Mouse%x" STRINGIFY(EVT_TWEAK_L)
+ "|Middle Mouse%x" STRINGIFY(EVT_TWEAK_M)
+ "|Right Mouse%x" STRINGIFY(EVT_TWEAK_R)
+ "|Action Mouse%x" STRINGIFY(EVT_TWEAK_A)
+ "|Select Mouse%x" STRINGIFY(EVT_TWEAK_S)
+ ;
+
return string;
}
-static char *keymap_tweak_dir_menu(void)
+static const char *keymap_tweak_dir_menu(void)
{
- static char string[500];
- static char formatstr[] = "|%s %%x%d";
- char *str= string;
-
- str += sprintf(str, "Tweak Direction %%t");
-
- str += sprintf(str, formatstr, "Any", KM_ANY);
- str += sprintf(str, formatstr, "North", EVT_GESTURE_N);
- str += sprintf(str, formatstr, "North-East", EVT_GESTURE_NE);
- str += sprintf(str, formatstr, "East", EVT_GESTURE_E);
- str += sprintf(str, formatstr, "Sout-East", EVT_GESTURE_SE);
- str += sprintf(str, formatstr, "South", EVT_GESTURE_S);
- str += sprintf(str, formatstr, "South-West", EVT_GESTURE_SW);
- str += sprintf(str, formatstr, "West", EVT_GESTURE_W);
- str += sprintf(str, formatstr, "North-West", EVT_GESTURE_NW);
-
+ static const char string[]=
+ "Tweak Direction%t"
+ "|Any%x" STRINGIFY(KM_ANY)
+ "|North%x" STRINGIFY(EVT_GESTURE_N)
+ "|North-East%x" STRINGIFY(EVT_GESTURE_NE)
+ "|East%x" STRINGIFY(EVT_GESTURE_E)
+ "|Sout-East%x" STRINGIFY(EVT_GESTURE_SE)
+ "|South%x" STRINGIFY(EVT_GESTURE_S)
+ "|South-West%x" STRINGIFY(EVT_GESTURE_SW)
+ "|West%x" STRINGIFY(EVT_GESTURE_W)
+ "|North-West%x" STRINGIFY(EVT_GESTURE_NW)
+ ;
+
return string;
}
-static void keymap_type_cb(bContext *C, void *kmi_v, void *unused_v)
+static void keymap_type_cb(bContext *C, void *kmi_v, void *UNUSED(arg_v))
{
wmKeyMapItem *kmi= kmi_v;
short maptype= keymap_menu_type(kmi->type);
@@ -5472,7 +5558,7 @@ static void outliner_draw_keymapbuts(uiBlock *block, ARegion *ar, SpaceOops *soo
tselem= TREESTORE(te);
if(te->ys+2*OL_H >= ar->v2d.cur.ymin && te->ys <= ar->v2d.cur.ymax) {
uiBut *but;
- char *str;
+ const char *str;
int xstart= 240;
int butw1= 20; /* operator */
int butw2= 90; /* event type, menus */
@@ -5521,7 +5607,7 @@ static void outliner_draw_keymapbuts(uiBlock *block, ARegion *ar, SpaceOops *soo
uiDefButS(block, OPTION, 0, "Shift", xstart, (int)te->ys+1, butw3+5, OL_H-1, &kmi->shift, 0, 0, 0, 0, "Modifier"); xstart+= butw3+5;
uiDefButS(block, OPTION, 0, "Ctrl", xstart, (int)te->ys+1, butw3, OL_H-1, &kmi->ctrl, 0, 0, 0, 0, "Modifier"); xstart+= butw3;
uiDefButS(block, OPTION, 0, "Alt", xstart, (int)te->ys+1, butw3, OL_H-1, &kmi->alt, 0, 0, 0, 0, "Modifier"); xstart+= butw3;
- uiDefButS(block, OPTION, 0, "Cmd", xstart, (int)te->ys+1, butw3, OL_H-1, &kmi->oskey, 0, 0, 0, 0, "Modifier"); xstart+= butw3;
+ uiDefButS(block, OPTION, 0, "OS", xstart, (int)te->ys+1, butw3, OL_H-1, &kmi->oskey, 0, 0, 0, 0, "Modifier"); xstart+= butw3;
xstart+= 5;
uiDefKeyevtButS(block, 0, "", xstart, (int)te->ys+1, butw3, OL_H-1, &kmi->keymodifier, "Key Modifier code");
xstart+= butw3+5;
@@ -5568,7 +5654,7 @@ static void outliner_buttons(const bContext *C, uiBlock *block, ARegion *ar, Spa
spx=te->xs+2*OL_X-4;
if(spx+dx+10>ar->v2d.cur.xmax) dx = ar->v2d.cur.xmax-spx-10;
- bt= uiDefBut(block, TEX, OL_NAMEBUTTON, "", spx, (short)te->ys, dx+10, OL_H-1, te->name, 1.0, (float)len-1, 0, 0, "");
+ bt= uiDefBut(block, TEX, OL_NAMEBUTTON, "", spx, (int)te->ys, dx+10, OL_H-1, (void *)te->name, 1.0, (float)len, 0, 0, "");
uiButSetRenameFunc(bt, namebutton_cb, tselem);
/* returns false if button got removed */
@@ -5635,17 +5721,19 @@ void draw_outliner(const bContext *C)
/* update size of tot-rect (extents of data/viewable area) */
UI_view2d_totRect_set(v2d, sizex, sizey);
+ /* force display to pixel coords */
+ v2d->flag |= (V2D_PIXELOFS_X|V2D_PIXELOFS_Y);
/* set matrix for 2d-view controls */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* draw outliner stuff (background, hierachy lines and names) */
- outliner_back(ar, soops);
+ outliner_back(ar);
block= uiBeginBlock(C, ar, "outliner buttons", UI_EMBOSS);
outliner_draw_tree((bContext *)C, block, scene, ar, soops);
if(ELEM(soops->outlinevis, SO_DATABLOCKS, SO_USERDEF)) {
/* draw rna buttons */
- outliner_draw_rnacols(ar, soops, sizex_rna);
+ outliner_draw_rnacols(ar, sizex_rna);
outliner_draw_rnabuts(block, scene, ar, soops, sizex_rna, &soops->tree);
}
else if(soops->outlinevis == SO_KEYMAP) {
@@ -5653,7 +5741,7 @@ void draw_outliner(const bContext *C)
}
else if (!(soops->flag & SO_HIDE_RESTRICTCOLS)) {
/* draw restriction columns */
- outliner_draw_restrictcols(ar, soops);
+ outliner_draw_restrictcols(ar);
outliner_draw_restrictbuts(block, scene, ar, soops, &soops->tree);
}
diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h
index fa3078a365b..cf29bfb4371 100644
--- a/source/blender/editors/space_outliner/outliner_intern.h
+++ b/source/blender/editors/space_outliner/outliner_intern.h
@@ -49,7 +49,7 @@ typedef struct TreeElement {
short index; // index for data arrays
short idcode; // from TreeStore id
short xend; // width of item display, for select
- char *name;
+ const char *name;
void *directdata; // Armature Bones, Base, Sequence, Strip...
PointerRNA rnaptr; // RNA Pointer
} TreeElement;
@@ -131,6 +131,8 @@ void OUTLINER_OT_show_hierarchy(struct wmOperatorType *ot);
void OUTLINER_OT_selected_toggle(struct wmOperatorType *ot);
void OUTLINER_OT_expanded_toggle(struct wmOperatorType *ot);
+void OUTLINER_OT_scroll_page(struct wmOperatorType *ot);
+
void OUTLINER_OT_renderability_toggle(struct wmOperatorType *ot);
void OUTLINER_OT_selectability_toggle(struct wmOperatorType *ot);
void OUTLINER_OT_visibility_toggle(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_outliner/outliner_ops.c b/source/blender/editors/space_outliner/outliner_ops.c
index d23e950a033..f7dd03ec545 100644
--- a/source/blender/editors/space_outliner/outliner_ops.c
+++ b/source/blender/editors/space_outliner/outliner_ops.c
@@ -56,6 +56,7 @@ void outliner_operatortypes(void)
WM_operatortype_append(OUTLINER_OT_show_one_level);
WM_operatortype_append(OUTLINER_OT_show_active);
WM_operatortype_append(OUTLINER_OT_show_hierarchy);
+ WM_operatortype_append(OUTLINER_OT_scroll_page);
WM_operatortype_append(OUTLINER_OT_selected_toggle);
WM_operatortype_append(OUTLINER_OT_expanded_toggle);
@@ -77,7 +78,7 @@ void outliner_keymap(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "OUTLINER_OT_item_rename", LEFTMOUSE, KM_DBL_CLICK, 0, 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_PRESS, 0, 0)->ptr, "extend", 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_RELEASE, 0, 0)->ptr, "extend", 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1);
RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_openclose", RETKEY, KM_PRESS, 0, 0)->ptr, "all", 0);
@@ -91,6 +92,9 @@ void outliner_keymap(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "OUTLINER_OT_show_active", PERIODKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "OUTLINER_OT_show_active", PADPERIOD, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "OUTLINER_OT_scroll_page", PAGEDOWNKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_scroll_page", PAGEUPKEY, KM_PRESS, 0, 0)->ptr, "up", 1);
+
WM_keymap_add_item(keymap, "OUTLINER_OT_show_one_level", PADPLUSKEY, KM_PRESS, 0, 0); /* open */
RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_show_one_level", PADMINUS, KM_PRESS, 0, 0)->ptr, "open", 0); /* close */
diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c
index 5e11d3502c1..0b941e910f8 100644
--- a/source/blender/editors/space_outliner/space_outliner.c
+++ b/source/blender/editors/space_outliner/space_outliner.c
@@ -29,12 +29,12 @@
#include <string.h>
#include <stdio.h>
-
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -60,7 +60,8 @@ static void outliner_main_area_init(wmWindowManager *wm, ARegion *ar)
/* own keymap */
keymap= WM_keymap_find(wm->defaultconf, "Outliner", SPACE_OUTLINER, 0);
- WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+ /* don't pass on view2d mask, it's always set with scrollbar space, hide fails */
+ WM_event_add_keymap_handler_bb(&ar->handlers, keymap, NULL, &ar->winrct);
}
static void outliner_main_area_draw(const bContext *C, ARegion *ar)
@@ -84,11 +85,11 @@ static void outliner_main_area_draw(const bContext *C, ARegion *ar)
}
-static void outliner_main_area_free(ARegion *ar)
+static void outliner_main_area_free(ARegion *UNUSED(ar))
{
+
}
-
static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn)
{
/* context changes */
@@ -97,11 +98,14 @@ static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn)
switch(wmn->data) {
case ND_OB_ACTIVE:
case ND_OB_SELECT:
+ case ND_OB_VISIBLE:
+ case ND_OB_RENDER:
case ND_MODE:
case ND_KEYINGSET:
case ND_FRAME:
case ND_RENDER_OPTIONS:
case ND_LAYER:
+ case ND_WORLD:
ED_region_tag_redraw(ar);
break;
}
@@ -113,7 +117,9 @@ static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn)
break;
case ND_BONE_ACTIVE:
case ND_BONE_SELECT:
+ case ND_DRAW:
case ND_PARENT:
+ case ND_OB_SHADING:
ED_region_tag_redraw(ar);
break;
case ND_CONSTRAINT:
@@ -148,6 +154,25 @@ static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn)
if(wmn->action == NA_RENAME)
ED_region_tag_redraw(ar);
break;
+ case NC_MATERIAL:
+ switch(wmn->data) {
+ case ND_SHADING:
+ case ND_SHADING_DRAW:
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
+ case NC_TEXTURE:
+ ED_region_tag_redraw(ar);
+ break;
+ case NC_GEOM:
+ switch(wmn->data) {
+ case ND_DATA:
+ /* needed for vertex groups only, no special notifier atm so use NC_GEOM|ND_DATA */
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
}
}
@@ -156,7 +181,7 @@ static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn)
/* ************************ header outliner area region *********************** */
/* add handlers, stuff you only do once or on area/region changes */
-static void outliner_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void outliner_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -166,7 +191,7 @@ static void outliner_header_area_draw(const bContext *C, ARegion *ar)
ED_region_header(C, ar);
}
-static void outliner_header_area_free(ARegion *ar)
+static void outliner_header_area_free(ARegion *UNUSED(ar))
{
}
@@ -187,7 +212,7 @@ static void outliner_header_area_listener(ARegion *ar, wmNotifier *wmn)
/* ******************** default callbacks for outliner space ***************** */
-static SpaceLink *outliner_new(const bContext *C)
+static SpaceLink *outliner_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceOops *soutliner;
@@ -231,7 +256,7 @@ static void outliner_free(SpaceLink *sl)
}
/* spacetype; init callback */
-static void outliner_init(wmWindowManager *wm, ScrArea *sa)
+static void outliner_init(wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
diff --git a/source/blender/editors/space_script/CMakeLists.txt b/source/blender/editors/space_script/CMakeLists.txt
index 7abaa4db441..1427e814b41 100644
--- a/source/blender/editors/space_script/CMakeLists.txt
+++ b/source/blender/editors/space_script/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -31,10 +29,18 @@ SET(INC
../../../../intern/guardedalloc
)
-IF(WITH_PYTHON)
- LIST(APPEND INC ${PYTHON_INC} ../../python)
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+set(SRC
+ script_edit.c
+ script_header.c
+ script_ops.c
+ space_script.c
+
+ script_intern.h
+)
+
+if(WITH_PYTHON)
+ list(APPEND INC ${PYTHON_INCLUDE_DIRS} ../../python)
+ add_definitions(-DWITH_PYTHON)
+endif()
-BLENDERLIB(bf_editor_space_script "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_script "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_script/Makefile b/source/blender/editors/space_script/Makefile
deleted file mode 100644
index 35462b8c255..00000000000
--- a/source/blender/editors/space_script/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_script
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_script/SConscript b/source/blender/editors/space_script/SConscript
index f187df19117..8c75b999bc0 100644
--- a/source/blender/editors/space_script/SConscript
+++ b/source/blender/editors/space_script/SConscript
@@ -10,7 +10,7 @@ incs += ' ../../python'
defs = []
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
+if env['WITH_BF_PYTHON']:
+ defs.append('WITH_PYTHON')
env.BlenderLib ( 'bf_editors_space_script', sources, Split(incs), defs, libtype=['core'], priority=[90] )
diff --git a/source/blender/editors/space_script/script_edit.c b/source/blender/editors/space_script/script_edit.c
index 610fecaa543..3da5b48db8e 100644
--- a/source/blender/editors/space_script/script_edit.c
+++ b/source/blender/editors/space_script/script_edit.c
@@ -29,9 +29,8 @@
#include <string.h>
#include <stdio.h>
-
-
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
@@ -46,20 +45,22 @@
#include "script_intern.h" // own include
-#ifndef DISABLE_PYTHON
-#include "BPY_extern.h" /* BPY_run_python_script */
+#ifdef WITH_PYTHON
+#include "BPY_extern.h" /* BPY_script_exec */
#endif
static int run_pyfile_exec(bContext *C, wmOperator *op)
{
char path[512];
RNA_string_get(op->ptr, "filepath", path);
-#ifndef DISABLE_PYTHON
- if(BPY_run_python_script(C, path, NULL, op->reports)) {
+#ifdef WITH_PYTHON
+ if(BPY_filepath_exec(C, path, op->reports)) {
ARegion *ar= CTX_wm_region(C);
ED_region_tag_redraw(ar);
return OPERATOR_FINISHED;
}
+#else
+ (void)C; /* unused */
#endif
return OPERATOR_CANCELLED; /* FAIL */
}
@@ -80,15 +81,18 @@ void SCRIPT_OT_python_file_run(wmOperatorType *ot)
}
-static int script_reload_exec(bContext *C, wmOperator *op)
+static int script_reload_exec(bContext *C, wmOperator *UNUSED(op))
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* TODO, this crashes on netrender and keying sets, need to look into why
* disable for now unless running in debug mode */
WM_cursor_wait(1);
- BPY_eval_string(C, "__import__('bpy').utils.load_scripts(reload_scripts=True)");
+ BPY_string_exec(C, "__import__('bpy').utils.load_scripts(reload_scripts=True)");
WM_cursor_wait(0);
+ WM_event_add_notifier(C, NC_WINDOW, NULL);
return OPERATOR_FINISHED;
+#else
+ (void)C; /* unused */
#endif
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/space_script/script_header.c b/source/blender/editors/space_script/script_header.c
index 6e65d458451..545be69af54 100644
--- a/source/blender/editors/space_script/script_header.c
+++ b/source/blender/editors/space_script/script_header.c
@@ -29,9 +29,9 @@
#include <string.h>
#include <stdio.h>
-
-
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
@@ -39,23 +39,20 @@
#include "ED_types.h"
#include "ED_util.h"
-
-
#include "UI_interface.h"
#include "UI_resources.h"
#include "UI_view2d.h"
#include "script_intern.h"
-
/* ************************ header area region *********************** */
-static void do_viewmenu(bContext *C, void *arg, int event)
+static void do_viewmenu(bContext *UNUSED(C), void *UNUSED(arg), int UNUSED(event))
{
}
-static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
+static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *UNUSED(arg))
{
ScrArea *curarea= CTX_wm_area(C);
uiBlock *block;
@@ -81,7 +78,7 @@ static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
return block;
}
-static void do_script_buttons(bContext *C, void *arg, int event)
+static void do_script_buttons(bContext *UNUSED(C), void *UNUSED(arg), int event)
{
switch(event) {
}
diff --git a/source/blender/editors/space_script/space_script.c b/source/blender/editors/space_script/space_script.c
index f93ddc6efbe..d0631f5651a 100644
--- a/source/blender/editors/space_script/space_script.c
+++ b/source/blender/editors/space_script/space_script.c
@@ -29,12 +29,12 @@
#include <string.h>
#include <stdio.h>
-
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -49,7 +49,7 @@
#include "UI_resources.h"
#include "UI_view2d.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -61,7 +61,7 @@
/* ******************** default callbacks for script space ***************** */
-static SpaceLink *script_new(const bContext *C)
+static SpaceLink *script_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceScript *sscript;
@@ -94,7 +94,7 @@ static void script_free(SpaceLink *sl)
{
SpaceScript *sscript= (SpaceScript*) sl;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/*free buttons references*/
if (sscript->but_refs) {
// XXX BPy_Set_DrawButtonsList(sscript->but_refs);
@@ -107,7 +107,7 @@ static void script_free(SpaceLink *sl)
/* spacetype; init callback */
-static void script_init(struct wmWindowManager *wm, ScrArea *sa)
+static void script_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -145,16 +145,17 @@ static void script_main_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* data... */
- // BPY_run_python_script(C, "/root/blender-svn/blender25/test.py", NULL);
+ // BPY_script_exec(C, "/root/blender-svn/blender25/test.py", NULL);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if (sscript->script) {
- //BPY_run_python_script_space(scpt->script.filename, NULL);
- BPY_run_script_space_draw(C, sscript);
+ // BPY_run_script_space_draw(C, sscript);
}
+#else
+ (void)sscript;
#endif
/* reset view matrix */
@@ -164,7 +165,7 @@ static void script_main_area_draw(const bContext *C, ARegion *ar)
}
/* add handlers, stuff you only do once or on area/region changes */
-static void script_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void script_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -174,7 +175,7 @@ static void script_header_area_draw(const bContext *C, ARegion *ar)
ED_region_header(C, ar);
}
-static void script_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void script_main_area_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
{
/* context changes */
// XXX - Todo, need the ScriptSpace accessible to get the python script to run.
diff --git a/source/blender/editors/space_sequencer/CMakeLists.txt b/source/blender/editors/space_sequencer/CMakeLists.txt
index fa99d35a7cd..9772361e367 100644
--- a/source/blender/editors/space_sequencer/CMakeLists.txt
+++ b/source/blender/editors/space_sequencer/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -33,4 +31,17 @@ SET(INC
../../../../intern/audaspace/intern
)
-BLENDERLIB(bf_editor_space_sequencer "${SRC}" "${INC}")
+set(SRC
+ sequencer_add.c
+ sequencer_buttons.c
+ sequencer_draw.c
+ sequencer_edit.c
+ sequencer_ops.c
+ sequencer_scopes.c
+ sequencer_select.c
+ space_sequencer.c
+
+ sequencer_intern.h
+)
+
+blender_add_lib(bf_editor_space_sequencer "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_sequencer/Makefile b/source/blender/editors/space_sequencer/Makefile
deleted file mode 100644
index bd2b837d499..00000000000
--- a/source/blender/editors/space_sequencer/Makefile
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_sequencer
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../blenfont
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c
index b9db18f7850..c1e01e2ac53 100644
--- a/source/blender/editors/space_sequencer/sequencer_add.c
+++ b/source/blender/editors/space_sequencer/sequencer_add.c
@@ -40,7 +40,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_storage_types.h"
-
+#include "BLI_utildefines.h"
#include "DNA_scene_types.h"
#include "DNA_userdef_types.h"
@@ -73,9 +73,12 @@
/* Generic functions, reused by add strip operators */
/* avoid passing multiple args and be more verbose */
-#define SEQPROP_STARTFRAME 1<<0
-#define SEQPROP_ENDFRAME 1<<1
-#define SEQPROP_FILES 1<<2
+#define SEQPROP_STARTFRAME (1<<0)
+#define SEQPROP_ENDFRAME (1<<1)
+#define SEQPROP_FILES (1<<2)
+#define SEQPROP_NOPATHS (1<<3)
+
+#define SELECT 1
static void sequencer_generic_props__internal(wmOperatorType *ot, int flag)
{
@@ -101,7 +104,7 @@ static void sequencer_generic_invoke_path__internal(bContext *C, wmOperator *op,
if(last_seq && last_seq->strip && SEQ_HAS_PATH(last_seq)) {
char path[sizeof(last_seq->strip->dir)];
BLI_strncpy(path, last_seq->strip->dir, sizeof(path));
- BLI_path_abs(path, G.sce);
+ BLI_path_abs(path, G.main->name);
RNA_string_set(op->ptr, identifier, path);
}
}
@@ -127,8 +130,10 @@ static void sequencer_generic_invoke_xy__internal(bContext *C, wmOperator *op, w
if ((flag & SEQPROP_ENDFRAME) && RNA_property_is_set(op->ptr, "frame_end")==0)
RNA_int_set(op->ptr, "frame_end", (int)mval_v2d[0] + 25); // XXX arbitary but ok for now.
- sequencer_generic_invoke_path__internal(C, op, "filepath");
- sequencer_generic_invoke_path__internal(C, op, "directory");
+ if (!(flag & SEQPROP_NOPATHS)) {
+ sequencer_generic_invoke_path__internal(C, op, "filepath");
+ sequencer_generic_invoke_path__internal(C, op, "directory");
+ }
}
static void seq_load_operator_info(SeqLoadInfo *seq_load, wmOperator *op)
@@ -152,7 +157,7 @@ static void seq_load_operator_info(SeqLoadInfo *seq_load, wmOperator *op)
}
if((is_file != -1) && relative)
- BLI_path_rel(seq_load->path, G.sce);
+ BLI_path_rel(seq_load->path, G.main->name);
if (RNA_struct_find_property(op->ptr, "frame_end")) {
@@ -198,7 +203,6 @@ static int sequencer_add_scene_strip_exec(bContext *C, wmOperator *op)
Sequence *seq; /* generic strip vars */
Strip *strip;
- StripElem *se;
int start_frame, channel; /* operator props */
@@ -224,7 +228,7 @@ static int sequencer_add_scene_strip_exec(bContext *C, wmOperator *op)
strip->len = seq->len = sce_seq->r.efra - sce_seq->r.sfra + 1;
strip->us= 1;
- strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
+ strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
strcpy(seq->name+2, sce_seq->id.name+2);
seqbase_unique_name_recursive(&ed->seqbase, seq);
@@ -253,6 +257,9 @@ static int sequencer_add_scene_strip_invoke(bContext *C, wmOperator *op, wmEvent
return OPERATOR_CANCELLED;
}
+ if(!RNA_property_is_set(op->ptr, "scene"))
+ return WM_enum_search_invoke(C, op, event);
+
sequencer_generic_invoke_xy__internal(C, op, event, 0);
return sequencer_add_scene_strip_exec(C, op);
// needs a menu
@@ -341,23 +348,23 @@ static int sequencer_add_movie_strip_exec(bContext *C, wmOperator *op)
static int sequencer_add_movie_strip_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- if(RNA_collection_length(op->ptr, "files") || RNA_property_is_set(op->ptr, "filepath"))
- return sequencer_add_movie_strip_exec(C, op);
if(!ED_operator_sequencer_active(C)) {
BKE_report(op->reports, RPT_ERROR, "Sequencer area not active");
return OPERATOR_CANCELLED;
}
- if(!RNA_property_is_set(op->ptr, "relative_path"))
- RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
-
/* This is for drag and drop */
- if(RNA_property_is_set(op->ptr, "filepath"))
+ if(RNA_collection_length(op->ptr, "files") || RNA_property_is_set(op->ptr, "filepath")) {
+ sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_NOPATHS);
return sequencer_add_movie_strip_exec(C, op);
-
+ }
+
sequencer_generic_invoke_xy__internal(C, op, event, 0);
-
+
+ if(!RNA_property_is_set(op->ptr, "relative_path"))
+ RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
+
WM_event_add_fileselect(C, op);
return OPERATOR_RUNNING_MODAL;
@@ -396,23 +403,23 @@ static int sequencer_add_sound_strip_exec(bContext *C, wmOperator *op)
static int sequencer_add_sound_strip_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- if(RNA_collection_length(op->ptr, "files") || RNA_property_is_set(op->ptr, "filepath"))
- return sequencer_add_sound_strip_exec(C, op);
if(!ED_operator_sequencer_active(C)) {
BKE_report(op->reports, RPT_ERROR, "Sequencer area not active");
return OPERATOR_CANCELLED;
}
-
- if(!RNA_property_is_set(op->ptr, "relative_path"))
- RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
-
+
/* This is for drag and drop */
- if(RNA_property_is_set(op->ptr, "filepath"))
+ if(RNA_collection_length(op->ptr, "files") || RNA_property_is_set(op->ptr, "filepath")) {
+ sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_NOPATHS);
return sequencer_add_sound_strip_exec(C, op);
-
+ }
+
sequencer_generic_invoke_xy__internal(C, op, event, 0);
-
+
+ if(!RNA_property_is_set(op->ptr, "relative_path"))
+ RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
+
WM_event_add_fileselect(C, op);
return OPERATOR_RUNNING_MODAL;
@@ -500,23 +507,26 @@ static int sequencer_add_image_strip_exec(bContext *C, wmOperator *op)
static int sequencer_add_image_strip_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- if(RNA_collection_length(op->ptr, "files"))
- return sequencer_add_image_strip_exec(C, op);
if(!ED_operator_sequencer_active(C)) {
BKE_report(op->reports, RPT_ERROR, "Sequencer area not active");
return OPERATOR_CANCELLED;
}
- if(!RNA_property_is_set(op->ptr, "relative_path"))
- RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
+ /* drag drop has set the names */
+ if(RNA_collection_length(op->ptr, "files")) {
+ sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_ENDFRAME|SEQPROP_NOPATHS);
+ return sequencer_add_image_strip_exec(C, op);
+ }
+
sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_ENDFRAME);
+
+ if(!RNA_property_is_set(op->ptr, "relative_path"))
+ RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
WM_event_add_fileselect(C, op);
return OPERATOR_RUNNING_MODAL;
-
- //return sequencer_add_image_strip_exec(C, op);
}
@@ -550,13 +560,12 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op)
Sequence *seq; /* generic strip vars */
Strip *strip;
- StripElem *se;
struct SeqEffectHandle sh;
int start_frame, end_frame, channel, type; /* operator props */
Sequence *seq1, *seq2, *seq3;
- char *error_msg;
+ const char *error_msg;
start_frame= RNA_int_get(op->ptr, "frame_start");
end_frame= RNA_int_get(op->ptr, "frame_end");
@@ -605,7 +614,7 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op)
strip->len = seq->len;
strip->us= 1;
if(seq->len>0)
- strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
+ strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
if (seq->type==SEQ_PLUGIN) {
char path[FILE_MAX];
diff --git a/source/blender/editors/space_sequencer/sequencer_buttons.c b/source/blender/editors/space_sequencer/sequencer_buttons.c
index 4394e334614..ee0a5d69113 100644
--- a/source/blender/editors/space_sequencer/sequencer_buttons.c
+++ b/source/blender/editors/space_sequencer/sequencer_buttons.c
@@ -31,14 +31,13 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
-
#include "ED_screen.h"
-
#include "WM_api.h"
#include "WM_types.h"
@@ -47,13 +46,13 @@
#include "sequencer_intern.h"
-static void do_sequencer_panel_events(bContext *C, void *arg, int event)
+static void do_sequencer_panel_events(bContext *UNUSED(C), void *UNUSED(arg), int UNUSED(event))
{
}
-static void sequencer_panel_view_properties(const bContext *C, Panel *pa)
+static void sequencer_panel_view_properties(const bContext *UNUSED(C), Panel *pa)
{
uiBlock *block;
@@ -63,7 +62,7 @@ static void sequencer_panel_view_properties(const bContext *C, Panel *pa)
}
-static void sequencer_panel_properties(const bContext *C, Panel *pa)
+static void sequencer_panel_properties(const bContext *UNUSED(C), Panel *pa)
{
uiBlock *block;
@@ -92,7 +91,7 @@ void sequencer_buttons_register(ARegionType *art)
/* **************** operator to open/close properties view ************* */
-static int sequencer_properties(bContext *C, wmOperator *op)
+static int sequencer_properties(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= sequencer_has_buttons_region(sa);
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 7c6fd83c6aa..635e261b26e 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -32,6 +32,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf_types.h"
@@ -44,7 +45,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_sequencer.h"
-#include "BKE_utildefines.h"
+
#include "BKE_sound.h"
#include "IMB_imbuf.h"
@@ -71,11 +72,11 @@
/* Note, Dont use WHILE_SEQ while drawing! - it messes up transform, - Campbell */
int no_rightbox=0, no_leftbox= 0;
-static void draw_shadedstrip(Sequence *seq, char *col, float x1, float y1, float x2, float y2);
+static void draw_shadedstrip(Sequence *seq, unsigned char col[3], float x1, float y1, float x2, float y2);
-static void get_seq_color3ubv(Scene *curscene, Sequence *seq, char *col)
+static void get_seq_color3ubv(Scene *curscene, Sequence *seq, unsigned char col[3])
{
- char blendcol[3];
+ unsigned char blendcol[3];
SolidColorVars *colvars = (SolidColorVars *)seq->effectdata;
switch(seq->type) {
@@ -212,7 +213,7 @@ static void drawmeta_contents(Scene *scene, Sequence *seqm, float x1, float y1,
/* Note, this used to use WHILE_SEQ, but it messes up the seq->depth value, (needed by transform when doing overlap checks)
* so for now, just use the meta's immediate children, could be fixed but its only drawing - Campbell */
Sequence *seq;
- char col[4];
+ unsigned char col[4];
int chan_min= MAXSEQ;
int chan_max= 0;
@@ -248,7 +249,7 @@ static void drawmeta_contents(Scene *scene, Sequence *seqm, float x1, float y1,
get_seq_color3ubv(scene, seq, col);
- glColor4ubv((GLubyte *)col);
+ glColor4ubv(col);
/* clamp within parent sequence strip bounds */
if(x1_chan < x1) x1_chan= x1;
@@ -260,7 +261,7 @@ static void drawmeta_contents(Scene *scene, Sequence *seqm, float x1, float y1,
glRectf(x1_chan, y1_chan, x2_chan, y2_chan);
UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, -30);
- glColor4ubv((GLubyte *)col);
+ glColor4ubv(col);
fdrawbox(x1_chan, y1_chan, x2_chan, y2_chan);
if((seqm->flag & SEQ_MUTE) == 0 && (seq->flag & SEQ_MUTE))
@@ -343,7 +344,7 @@ static void draw_seq_handle(View2D *v2d, Sequence *seq, float pixelx, short dire
}
if(G.moving || (seq->flag & whichsel)) {
- cpack(0xFFFFFF);
+ const char col[4]= {255, 255, 255, 255};
if (direction == SEQ_LEFTHANDLE) {
sprintf(str, "%d", seq->startdisp);
x1= rx1;
@@ -353,14 +354,14 @@ static void draw_seq_handle(View2D *v2d, Sequence *seq, float pixelx, short dire
x1= x2 - handsize*0.75;
y1= y2 + 0.05;
}
- UI_view2d_text_cache_add(v2d, x1, y1, str);
+ UI_view2d_text_cache_add(v2d, x1, y1, str, col);
}
}
-static void draw_seq_extensions(Scene *scene, ARegion *ar, SpaceSeq *sseq, Sequence *seq)
+static void draw_seq_extensions(Scene *scene, ARegion *ar, Sequence *seq)
{
float x1, x2, y1, y2, pixely, a;
- char col[3], blendcol[3];
+ unsigned char col[3], blendcol[3];
View2D *v2d= &ar->v2d;
if(seq->type >= SEQ_EFFECT) return;
@@ -462,11 +463,12 @@ static void draw_seq_extensions(Scene *scene, ARegion *ar, SpaceSeq *sseq, Seque
}
/* draw info text on a sequence strip */
-static void draw_seq_text(View2D *v2d, Sequence *seq, float x1, float x2, float y1, float y2, char *background_col)
+static void draw_seq_text(View2D *v2d, Sequence *seq, float x1, float x2, float y1, float y2, const unsigned char background_col[3])
{
rctf rect;
char str[32 + FILE_MAXDIR+FILE_MAXFILE];
const char *name= seq->name+2;
+ char col[4];
if(name[0]=='\0')
name= give_seqname(seq);
@@ -511,22 +513,23 @@ static void draw_seq_text(View2D *v2d, Sequence *seq, float x1, float x2, float
}
if(seq->flag & SELECT){
- cpack(0xFFFFFF);
+ col[0]= col[1]= col[2]= 255;
}else if ((((int)background_col[0] + (int)background_col[1] + (int)background_col[2]) / 3) < 50){
- cpack(0x505050); /* use lighter text colour for dark background */
+ col[0]= col[1]= col[2]= 80; /* use lighter text color for dark background */
}else{
- cpack(0);
+ col[0]= col[1]= col[2]= 0;
}
-
+ col[3]= 255;
+
rect.xmin= x1;
rect.ymin= y1;
rect.xmax= x2;
rect.ymax= y2;
- UI_view2d_text_cache_rectf(v2d, &rect, str);
+ UI_view2d_text_cache_rectf(v2d, &rect, str, col);
}
/* draws a shaded strip, made from gradient + flat color + gradient */
-static void draw_shadedstrip(Sequence *seq, char *col, float x1, float y1, float x2, float y2)
+static void draw_shadedstrip(Sequence *seq, unsigned char col[3], float x1, float y1, float x2, float y2)
{
float ymid1, ymid2;
@@ -544,7 +547,7 @@ static void draw_shadedstrip(Sequence *seq, char *col, float x1, float y1, float
if(seq->flag & SELECT) UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, -50);
else UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, 0);
- glColor3ubv((GLubyte *)col);
+ glColor3ubv(col);
glVertex2f(x1,y1);
glVertex2f(x2,y1);
@@ -586,11 +589,11 @@ Draw a sequence strip, bounds check already made
ARegion is currently only used to get the windows width in pixels
so wave file sample drawing precision is zoom adjusted
*/
-static void draw_seq_strip(Scene *scene, ARegion *ar, SpaceSeq *sseq, Sequence *seq, int outline_tint, float pixelx)
+static void draw_seq_strip(Scene *scene, ARegion *ar, Sequence *seq, int outline_tint, float pixelx)
{
View2D *v2d= &ar->v2d;
float x1, x2, y1, y2;
- char col[3], background_col[3], is_single_image;
+ unsigned char col[3], background_col[3], is_single_image;
/* we need to know if this is a single image/color or not for drawing */
is_single_image = (char)seq_single_check(seq);
@@ -616,7 +619,7 @@ static void draw_seq_strip(Scene *scene, ARegion *ar, SpaceSeq *sseq, Sequence *
/* draw additional info and controls */
if (!is_single_image)
- draw_seq_extensions(scene, ar, sseq, seq);
+ draw_seq_extensions(scene, ar, seq);
draw_seq_handle(v2d, seq, pixelx, SEQ_LEFTHANDLE);
draw_seq_handle(v2d, seq, pixelx, SEQ_RIGHTHANDLE);
@@ -693,6 +696,7 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq
float proxy_size = 100.0;
GLuint texid;
GLuint last_texid;
+ SeqRenderData context;
render_size = sseq->render_size;
if (render_size == 0) {
@@ -728,12 +732,18 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq
UI_view2d_totRect_set(v2d, viewrectx + 0.5f, viewrecty + 0.5f);
UI_view2d_curRect_validate(v2d);
+ /* only initialize the preview if a render is in progress */
+ if(G.rendering)
+ return;
+
+ context = seq_new_render_data(bmain, scene, rectx, recty, proxy_size);
+
if (special_seq_update)
- ibuf= give_ibuf_seq_direct(bmain, scene, rectx, recty, cfra + frame_ofs, proxy_size, special_seq_update);
+ ibuf= give_ibuf_seq_direct(context, cfra + frame_ofs, special_seq_update);
else if (!U.prefetchframes) // XXX || (G.f & G_PLAYANIM) == 0) {
- ibuf= (ImBuf *)give_ibuf_seq(bmain, scene, rectx, recty, cfra + frame_ofs, sseq->chanshown, proxy_size);
+ ibuf= (ImBuf *)give_ibuf_seq(context, cfra + frame_ofs, sseq->chanshown);
else
- ibuf= (ImBuf *)give_ibuf_seq_threaded(bmain, scene, rectx, recty, cfra + frame_ofs, sseq->chanshown, proxy_size);
+ ibuf= (ImBuf *)give_ibuf_seq_threaded(context, cfra + frame_ofs, sseq->chanshown);
if(ibuf==NULL)
return;
@@ -772,7 +782,7 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq
}
/* setting up the view - actual drawing starts here */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
last_texid= glaGetOneInteger(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_2D);
@@ -866,7 +876,8 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq
UI_view2d_view_restore(C);
}
-void drawprefetchseqspace(Scene *scene, ARegion *ar, SpaceSeq *sseq)
+#if 0
+void drawprefetchseqspace(Scene *scene, ARegion *UNUSED(ar), SpaceSeq *sseq)
{
int rectx, recty;
int render_size = sseq->render_size;
@@ -889,6 +900,7 @@ void drawprefetchseqspace(Scene *scene, ARegion *ar, SpaceSeq *sseq)
proxy_size);
}
}
+#endif
/* draw backdrop of the sequencer strips view */
static void draw_seq_backdrop(View2D *v2d)
@@ -936,7 +948,6 @@ static void draw_seq_backdrop(View2D *v2d)
static void draw_seq_strips(const bContext *C, Editing *ed, ARegion *ar)
{
Scene *scene= CTX_data_scene(C);
- SpaceSeq *sseq= CTX_wm_space_seq(C);
View2D *v2d= &ar->v2d;
Sequence *last_seq = seq_active_get(scene);
int sel = 0, j;
@@ -958,7 +969,7 @@ static void draw_seq_strips(const bContext *C, Editing *ed, ARegion *ar)
else if (seq->machine > v2d->cur.ymax) continue;
/* strip passed all tests unscathed... so draw it now */
- draw_seq_strip(scene, ar, sseq, seq, outline_tint, pixelx);
+ draw_seq_strip(scene, ar, seq, outline_tint, pixelx);
}
/* draw selected next time round */
@@ -967,14 +978,11 @@ static void draw_seq_strips(const bContext *C, Editing *ed, ARegion *ar)
/* draw the last selected last (i.e. 'active' in other parts of Blender), removes some overlapping error */
if (last_seq)
- draw_seq_strip(scene, ar, sseq, last_seq, 120, pixelx);
+ draw_seq_strip(scene, ar, last_seq, 120, pixelx);
}
-static void seq_draw_sfra_efra(const bContext *C, SpaceSeq *sseq, ARegion *ar)
-{
- View2D *v2d= UI_view2d_fromcontext(C);
- Scene *scene= CTX_data_scene(C);
-
+static void seq_draw_sfra_efra(Scene *scene, View2D *v2d)
+{
glEnable(GL_BLEND);
/* draw darkened area outside of active timeline
@@ -1016,7 +1024,7 @@ void draw_timeline_seq(const bContext *C, ARegion *ar)
glClearColor(col[0], col[1], col[2], 0.0);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* calculate extents of sequencer strips/data
@@ -1029,9 +1037,9 @@ void draw_timeline_seq(const bContext *C, ARegion *ar)
draw_seq_backdrop(v2d);
/* regular grid-pattern over the rest of the view (i.e. frame grid lines) */
- UI_view2d_constant_grid_draw(C, v2d);
+ UI_view2d_constant_grid_draw(v2d);
- seq_draw_sfra_efra(C, sseq, ar);
+ seq_draw_sfra_efra(scene, v2d);
/* sequence strips (if there is data available to be drawn) */
if (ed) {
@@ -1043,17 +1051,17 @@ void draw_timeline_seq(const bContext *C, ARegion *ar)
}
/* current frame */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
if ((sseq->flag & SEQ_DRAWFRAMES)==0) flag |= DRAWCFRA_UNIT_SECONDS;
if ((sseq->flag & SEQ_NO_DRAW_CFRANUM)==0) flag |= DRAWCFRA_SHOW_NUMBOX;
ANIM_draw_cfra(C, v2d, flag);
/* markers */
- UI_view2d_view_orthoSpecial(C, v2d, 1);
+ UI_view2d_view_orthoSpecial(ar, v2d, 1);
draw_markers_time(C, DRAW_MARKERS_LINES);
/* preview range */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
ANIM_draw_previewrange(C, v2d);
/* overlap playhead */
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index d1654dc5d37..47dff6face4 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -41,7 +41,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_storage_types.h"
-
+#include "BLI_utildefines.h"
#include "DNA_scene_types.h"
#include "DNA_userdef_types.h"
@@ -69,11 +69,11 @@
/* own include */
#include "sequencer_intern.h"
-static void error(const char *dummy) {}
-static void waitcursor(int val) {}
-static void activate_fileselect(int d1, char *d2, char *d3, void *d4) {}
-static int pupmenu(const char *dummy) {return 0;}
-static int okee(const char *dummy) {return 0;}
+static void error(const char *UNUSED(dummy)) {}
+static void waitcursor(int UNUSED(val)) {}
+static void activate_fileselect(int UNUSED(d1), const char *UNUSED(d2), const char *UNUSED(d3), void *UNUSED(d4)) {}
+static int pupmenu(const char *UNUSED(dummy)) {return 0;}
+static int okee(const char *UNUSED(dummy)) {return 0;}
/* XXX */
@@ -159,7 +159,7 @@ static void change_plugin_seq(Scene *scene, char *str) /* called from fileselect
struct SeqEffectHandle sh;
Sequence *last_seq= seq_active_get(scene);
- if(last_seq && last_seq->type != SEQ_PLUGIN) return;
+ if(last_seq==NULL || last_seq->type != SEQ_PLUGIN) return;
sh = get_sequence_effect(last_seq);
sh.free(last_seq);
@@ -468,7 +468,7 @@ static void reload_sound_strip(Scene *scene, char *name)
}
#endif
-static void reload_image_strip(Scene *scene, char *name)
+static void reload_image_strip(Scene *scene, char *UNUSED(name))
{
Editing *ed= seq_give_editing(scene, FALSE);
Sequence *seq=NULL, *seqact;
@@ -603,7 +603,7 @@ void change_sequence(Scene *scene)
}
-int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequence **selseq1, Sequence **selseq2, Sequence **selseq3, char **error_str)
+int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequence **selseq1, Sequence **selseq2, Sequence **selseq3, const char **error_str)
{
Editing *ed = seq_give_editing(scene, FALSE);
Sequence *seq1= 0, *seq2= 0, *seq3= 0, *seq;
@@ -735,7 +735,7 @@ static void recurs_del_seq_flag(Scene *scene, ListBase *lb, short flag, short de
}
-static Sequence *cut_seq_hard(Main *bmain, Scene *scene, Sequence * seq, int cutframe)
+static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe)
{
TransSeq ts;
Sequence *seqn = 0;
@@ -782,13 +782,13 @@ static Sequence *cut_seq_hard(Main *bmain, Scene *scene, Sequence * seq, int cut
}
}
- reload_sequence_new_file(bmain, scene, seq, FALSE);
+ reload_sequence_new_file(scene, seq, FALSE);
calc_sequence(scene, seq);
new_tstripdata(seq);
if (!skip_dup) {
/* Duplicate AFTER the first change */
- seqn = seq_dupli_recursive(scene, seq, SEQ_DUPE_UNIQUE_NAME | SEQ_DUPE_ANIM);
+ seqn = seq_dupli_recursive(scene, NULL, seq, SEQ_DUPE_UNIQUE_NAME | SEQ_DUPE_ANIM);
}
if (seqn) {
@@ -822,14 +822,14 @@ static Sequence *cut_seq_hard(Main *bmain, Scene *scene, Sequence * seq, int cut
seqn->startstill = 0;
}
- reload_sequence_new_file(bmain, scene, seqn, FALSE);
+ reload_sequence_new_file(scene, seqn, FALSE);
calc_sequence(scene, seqn);
new_tstripdata(seqn);
}
return seqn;
}
-static Sequence *cut_seq_soft(Main *bmain, Scene *scene, Sequence * seq, int cutframe)
+static Sequence *cut_seq_soft(Scene *scene, Sequence * seq, int cutframe)
{
TransSeq ts;
Sequence *seqn = 0;
@@ -879,7 +879,7 @@ static Sequence *cut_seq_soft(Main *bmain, Scene *scene, Sequence * seq, int cut
if (!skip_dup) {
/* Duplicate AFTER the first change */
- seqn = seq_dupli_recursive(scene, seq, SEQ_DUPE_UNIQUE_NAME | SEQ_DUPE_ANIM);
+ seqn = seq_dupli_recursive(scene, NULL, seq, SEQ_DUPE_UNIQUE_NAME | SEQ_DUPE_ANIM);
}
if (seqn) {
@@ -919,22 +919,22 @@ static Sequence *cut_seq_soft(Main *bmain, Scene *scene, Sequence * seq, int cut
/* like duplicate, but only duplicate and cut overlapping strips,
* strips to the left of the cutframe are ignored and strips to the right are moved into the new list */
-static int cut_seq_list(Main *bmain, Scene *scene, ListBase *old, ListBase *new, int cutframe,
- Sequence * (*cut_seq)(Main *, Scene *, Sequence *, int))
+static int cut_seq_list(Scene *scene, ListBase *old, ListBase *new, int cutframe,
+ Sequence * (*cut_seq)(Scene *, Sequence *, int))
{
int did_something = FALSE;
- Sequence *seq, *seq_next;
+ Sequence *seq, *seq_next_iter;
seq= old->first;
while(seq) {
- seq_next = seq->next; /* we need this because we may remove seq */
+ seq_next_iter = seq->next; /* we need this because we may remove seq */
seq->tmp= NULL;
if(seq->flag & SELECT) {
if(cutframe > seq->startdisp &&
cutframe < seq->enddisp) {
- Sequence * seqn = cut_seq(bmain, scene, seq, cutframe);
+ Sequence * seqn = cut_seq(scene, seq, cutframe);
if (seqn) {
BLI_addtail(new, seqn);
}
@@ -947,7 +947,7 @@ static int cut_seq_list(Main *bmain, Scene *scene, ListBase *old, ListBase *new,
BLI_addtail(new, seq);
}
}
- seq = seq_next;
+ seq = seq_next_iter;
}
return did_something;
}
@@ -992,7 +992,7 @@ void touch_seq_files(Scene *scene)
if(seq->flag & SELECT) {
if(seq->type==SEQ_MOVIE) {
if(seq->strip && seq->strip->stripdata) {
- BLI_make_file_string(G.sce, str, seq->strip->dir, seq->strip->stripdata->name);
+ BLI_make_file_string(G.main->name, str, seq->strip->dir, seq->strip->stripdata->name);
BLI_touch(seq->name);
}
}
@@ -1004,7 +1004,8 @@ void touch_seq_files(Scene *scene)
waitcursor(0);
}
-void set_filter_seq(Main *bmain, Scene *scene)
+/*
+static void set_filter_seq(Scene *scene)
{
Sequence *seq;
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1018,15 +1019,15 @@ void set_filter_seq(Main *bmain, Scene *scene)
if(seq->flag & SELECT) {
if(seq->type==SEQ_MOVIE) {
seq->flag |= SEQ_FILTERY;
- reload_sequence_new_file(bmain, scene, seq, FALSE);
+ reload_sequence_new_file(scene, seq, FALSE);
calc_sequence(scene, seq);
}
}
}
SEQ_END
-
}
+*/
void seq_remap_paths(Scene *scene)
{
@@ -1137,14 +1138,15 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
snap_frame= RNA_int_get(op->ptr, "frame");
- /* problem: contents of meta's are all shifted to the same position... */
-
/* also check metas */
- SEQP_BEGIN(ed, seq) {
+ for(seq= ed->seqbasep->first; seq; seq= seq->next) {
if (seq->flag & SELECT && !(seq->depth==0 && seq->flag & SEQ_LOCK) &&
seq_tx_test(seq)) {
if((seq->flag & (SEQ_LEFTSEL+SEQ_RIGHTSEL))==0) {
- seq->start= snap_frame-seq->startofs+seq->startstill;
+ /* simple but no anim update */
+ /* seq->start= snap_frame-seq->startofs+seq->startstill; */
+
+ seq_translate(scene, seq, (snap_frame-seq->startofs+seq->startstill) - seq->start);
} else {
if(seq->flag & SEQ_LEFTSEL) {
seq_tx_set_final_left(seq, snap_frame);
@@ -1156,10 +1158,10 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
calc_sequence(scene, seq);
}
}
- SEQ_END
- /* test for effects and overlap */
- SEQP_BEGIN(ed, seq) {
+ /* test for effects and overlap
+ * dont use SEQP_BEGIN since that would be recursive */
+ for(seq= ed->seqbasep->first; seq; seq= seq->next) {
if(seq->flag & SELECT && !(seq->depth==0 && seq->flag & SEQ_LOCK)) {
seq->flag &= ~SEQ_OVERLAP;
if( seq_test_overlap(ed->seqbasep, seq) ) {
@@ -1175,7 +1177,6 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
calc_sequence(scene, seq);
}
}
- SEQ_END;
/* as last: */
sort_seq(scene);
@@ -1185,7 +1186,7 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int sequencer_snap_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int sequencer_snap_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Scene *scene = CTX_data_scene(C);
@@ -1310,7 +1311,7 @@ void SEQUENCER_OT_unmute(struct wmOperatorType *ot)
/* lock operator */
-static int sequencer_lock_exec(bContext *C, wmOperator *op)
+static int sequencer_lock_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1343,7 +1344,7 @@ void SEQUENCER_OT_lock(struct wmOperatorType *ot)
}
/* unlock operator */
-static int sequencer_unlock_exec(bContext *C, wmOperator *op)
+static int sequencer_unlock_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1376,7 +1377,7 @@ void SEQUENCER_OT_unlock(struct wmOperatorType *ot)
}
/* reload operator */
-static int sequencer_reload_exec(bContext *C, wmOperator *op)
+static int sequencer_reload_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1409,7 +1410,7 @@ void SEQUENCER_OT_reload(struct wmOperatorType *ot)
}
/* reload operator */
-static int sequencer_refresh_all_exec(bContext *C, wmOperator *op)
+static int sequencer_refresh_all_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1440,7 +1441,7 @@ static int sequencer_reassign_inputs_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Sequence *seq1, *seq2, *seq3, *last_seq = seq_active_get(scene);
- char *error_msg;
+ const char *error_msg;
if(!seq_effect_find_selected(scene, last_seq, last_seq->type, &seq1, &seq2, &seq3, &error_msg)) {
BKE_report(op->reports, RPT_ERROR, error_msg);
@@ -1497,6 +1498,42 @@ void SEQUENCER_OT_reassign_inputs(struct wmOperatorType *ot)
}
+static int sequencer_swap_inputs_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Sequence *seq, *last_seq = seq_active_get(scene);
+
+ if(last_seq->seq1==NULL || last_seq->seq2 == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No valid inputs to swap");
+ return OPERATOR_CANCELLED;
+ }
+
+ seq = last_seq->seq1;
+ last_seq->seq1 = last_seq->seq2;
+ last_seq->seq2 = seq;
+
+ update_changed_seq_and_deps(scene, last_seq, 1, 1);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
+
+ return OPERATOR_FINISHED;
+}
+void SEQUENCER_OT_swap_inputs(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Swap Inputs";
+ ot->idname= "SEQUENCER_OT_swap_inputs";
+ ot->description="Swap the first two inputs for the effects strip";
+
+ /* api callbacks */
+ ot->exec= sequencer_swap_inputs_exec;
+ ot->poll= sequencer_effect_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+
/* cut operator */
static EnumPropertyItem prop_cut_types[] = {
{SEQ_CUT_SOFT, "SOFT", 0, "Soft", ""},
@@ -1506,7 +1543,6 @@ static EnumPropertyItem prop_cut_types[] = {
static int sequencer_cut_exec(bContext *C, wmOperator *op)
{
- Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
int cut_side, cut_hard, cut_frame;
@@ -1521,16 +1557,14 @@ static int sequencer_cut_exec(bContext *C, wmOperator *op)
newlist.first= newlist.last= NULL;
if (cut_hard==SEQ_CUT_HARD) {
- changed = cut_seq_list(bmain, scene,
- ed->seqbasep, &newlist, cut_frame, cut_seq_hard);
+ changed = cut_seq_list(scene, ed->seqbasep, &newlist, cut_frame, cut_seq_hard);
} else {
- changed = cut_seq_list(bmain, scene,
- ed->seqbasep, &newlist, cut_frame, cut_seq_soft);
+ changed = cut_seq_list(scene, ed->seqbasep, &newlist, cut_frame, cut_seq_soft);
}
if (newlist.first) { /* got new strips ? */
Sequence *seq;
- addlisttolist(ed->seqbasep, &newlist);
+ BLI_movelisttolist(ed->seqbasep, &newlist);
if (cut_side != SEQ_SIDE_BOTH) {
SEQP_BEGIN(ed, seq) {
@@ -1609,7 +1643,7 @@ static int apply_unique_name_cb(Sequence *seq, void *arg_pt)
}
-static int sequencer_add_duplicate_exec(bContext *C, wmOperator *op)
+static int sequencer_add_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1619,12 +1653,12 @@ static int sequencer_add_duplicate_exec(bContext *C, wmOperator *op)
if(ed==NULL)
return OPERATOR_CANCELLED;
- seqbase_dupli_recursive(scene, &nseqbase, ed->seqbasep, SEQ_DUPE_CONTEXT);
+ seqbase_dupli_recursive(scene, NULL, &nseqbase, ed->seqbasep, SEQ_DUPE_CONTEXT);
if(nseqbase.first) {
Sequence * seq= nseqbase.first;
/* rely on the nseqbase list being added at the end */
- addlisttolist(ed->seqbasep, &nseqbase);
+ BLI_movelisttolist(ed->seqbasep, &nseqbase);
for( ; seq; seq= seq->next)
seq_recursive_apply(seq, apply_unique_name_cb, scene);
@@ -1636,7 +1670,7 @@ static int sequencer_add_duplicate_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-static int sequencer_add_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int sequencer_add_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
sequencer_add_duplicate_exec(C, op);
@@ -1666,7 +1700,7 @@ void SEQUENCER_OT_duplicate(wmOperatorType *ot)
}
/* delete operator */
-static int sequencer_delete_exec(bContext *C, wmOperator *op)
+static int sequencer_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1747,7 +1781,7 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
- Sequence *seq, *seq_new, *seq_next;
+ Sequence *seq, *seq_new;
Strip *strip_new;
StripElem *se, *se_new;
int start_ofs, cfra, frame_end;
@@ -1759,7 +1793,6 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
if((seq->flag & SELECT) && (seq->type == SEQ_IMAGE) && (seq->len > 1)) {
/* remove seq so overlap tests dont conflict,
see seq_free_sequence below for the real free'ing */
- seq_next = seq->next;
BLI_remlink(ed->seqbasep, seq);
/* if(seq->ipo) seq->ipo->id.us--; */
/* XXX, remove fcurve and assign to split image strips */
@@ -1784,7 +1817,7 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
/* new stripdata */
strip_new->stripdata= se_new= MEM_callocN(sizeof(StripElem)*1, "stripelem");
- strncpy(se_new->name, se->name, FILE_MAXFILE-1);
+ BLI_strncpy(se_new->name, se->name, sizeof(se_new->name));
calc_sequence(scene, seq_new);
if(step > 1) {
@@ -1840,7 +1873,7 @@ void SEQUENCER_OT_images_separate(wmOperatorType *ot)
/* META Operators */
/* separate_meta_toggle operator */
-static int sequencer_meta_toggle_exec(bContext *C, wmOperator *op)
+static int sequencer_meta_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1985,7 +2018,7 @@ static int seq_depends_on_meta(Sequence *seq, Sequence *seqm)
}
/* separate_meta_make operator */
-static int sequencer_meta_separate_exec(bContext *C, wmOperator *op)
+static int sequencer_meta_separate_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1995,7 +2028,7 @@ static int sequencer_meta_separate_exec(bContext *C, wmOperator *op)
if(last_seq==NULL || last_seq->type!=SEQ_META)
return OPERATOR_CANCELLED;
- addlisttolist(ed->seqbasep, &last_seq->seqbase);
+ BLI_movelisttolist(ed->seqbasep, &last_seq->seqbase);
last_seq->seqbase.first= 0;
last_seq->seqbase.last= 0;
@@ -2010,16 +2043,16 @@ static int sequencer_meta_separate_exec(bContext *C, wmOperator *op)
recurs_del_seq_flag(scene, ed->seqbasep, SEQ_FLAG_DELETE, 0);
- /* test for effects and overlap */
- SEQP_BEGIN(ed, seq) {
+ /* test for effects and overlap
+ * dont use SEQP_BEGIN since that would be recursive */
+ for(seq= ed->seqbasep->first; seq; seq= seq->next) {
if(seq->flag & SELECT) {
seq->flag &= ~SEQ_OVERLAP;
- if( seq_test_overlap(ed->seqbasep, seq) ) {
+ if(seq_test_overlap(ed->seqbasep, seq)) {
shuffle_seq(ed->seqbasep, seq, scene);
}
}
}
- SEQ_END;
sort_seq(scene);
seq_update_muting(scene, ed);
@@ -2046,7 +2079,7 @@ void SEQUENCER_OT_meta_separate(wmOperatorType *ot)
}
/* view_all operator */
-static int sequencer_view_all_exec(bContext *C, wmOperator *op)
+static int sequencer_view_all_exec(bContext *C, wmOperator *UNUSED(op))
{
//Scene *scene= CTX_data_scene(C);
bScreen *sc= CTX_wm_screen(C);
@@ -2078,7 +2111,7 @@ void SEQUENCER_OT_view_all(wmOperatorType *ot)
}
/* view_all operator */
-static int sequencer_view_all_preview_exec(bContext *C, wmOperator *op)
+static int sequencer_view_all_preview_exec(bContext *C, wmOperator *UNUSED(op))
{
bScreen *sc= CTX_wm_screen(C);
ScrArea *area= CTX_wm_area(C);
@@ -2169,6 +2202,7 @@ void SEQUENCER_OT_view_zoom_ratio(wmOperatorType *ot)
/* identifiers */
ot->name= "Sequencer View Zoom Ratio";
ot->idname= "SEQUENCER_OT_view_zoom_ratio";
+ ot->description = "Change zoom ratio of sequencer preview";
/* api callbacks */
ot->exec= sequencer_view_zoom_ratio_exec;
@@ -2189,7 +2223,7 @@ static EnumPropertyItem view_type_items[] = {
#endif
/* view_all operator */
-static int sequencer_view_toggle_exec(bContext *C, wmOperator *op)
+static int sequencer_view_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceSeq *sseq= (SpaceSeq *)CTX_wm_space_data(C);
@@ -2218,7 +2252,7 @@ void SEQUENCER_OT_view_toggle(wmOperatorType *ot)
/* view_selected operator */
-static int sequencer_view_selected_exec(bContext *C, wmOperator *op)
+static int sequencer_view_selected_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
View2D *v2d= UI_view2d_fromcontext(C);
@@ -2354,7 +2388,7 @@ static int next_prev_edit_internal(Scene *scene, int side)
}
/* move frame to next edit point operator */
-static int sequencer_next_edit_exec(bContext *C, wmOperator *op)
+static int sequencer_next_edit_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
@@ -2384,7 +2418,7 @@ void SEQUENCER_OT_next_edit(wmOperatorType *ot)
}
/* move frame to previous edit point operator */
-static int sequencer_previous_edit_exec(bContext *C, wmOperator *op)
+static int sequencer_previous_edit_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
@@ -2518,27 +2552,24 @@ void SEQUENCER_OT_swap(wmOperatorType *ot)
RNA_def_enum(ot->srna, "side", prop_side_lr_types, SEQ_SIDE_RIGHT, "Side", "Side of the strip to swap");
}
-static int sequencer_rendersize_exec(bContext *C, wmOperator *op)
+static int sequencer_rendersize_exec(bContext *C, wmOperator *UNUSED(op))
{
int retval = OPERATOR_CANCELLED;
Scene *scene= CTX_data_scene(C);
Sequence *active_seq = seq_active_get(scene);
+ StripElem *se = NULL;
if(active_seq==NULL)
return OPERATOR_CANCELLED;
- switch (active_seq->type) {
+
+ if (active_seq->strip) {
+ switch (active_seq->type) {
case SEQ_IMAGE:
+ se = give_stripelem(active_seq, scene->r.cfra);
+ break;
case SEQ_MOVIE:
- if (active_seq->strip) {
- // prevent setting the render size if sequence values aren't initialized
- if ( (active_seq->strip->orx>0) && (active_seq->strip->ory>0) ) {
- scene->r.xsch= active_seq->strip->orx;
- scene->r.ysch= active_seq->strip->ory;
- WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, scene);
- retval = OPERATOR_FINISHED;
- }
- }
+ se = active_seq->strip->stripdata;
break;
case SEQ_SCENE:
case SEQ_META:
@@ -2546,7 +2577,19 @@ static int sequencer_rendersize_exec(bContext *C, wmOperator *op)
case SEQ_HD_SOUND:
default:
break;
+ }
}
+
+ if (se) {
+ // prevent setting the render size if sequence values aren't initialized
+ if ( (se->orig_width > 0) && (se->orig_height > 0) ) {
+ scene->r.xsch= se->orig_width;
+ scene->r.ysch= se->orig_height;
+ WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, scene);
+ retval = OPERATOR_FINISHED;
+ }
+ }
+
return retval;
}
@@ -2595,7 +2638,7 @@ static int sequencer_copy_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- seqbase_dupli_recursive(scene, &seqbase_clipboard, ed->seqbasep, SEQ_DUPE_UNIQUE_NAME);
+ seqbase_dupli_recursive(scene, NULL, &seqbase_clipboard, ed->seqbasep, SEQ_DUPE_UNIQUE_NAME);
seqbase_clipboard_frame= scene->r.cfra;
/* Need to remove anything that references the current scene */
@@ -2638,7 +2681,7 @@ static void seq_offset(Scene *scene, Sequence *seq, int ofs)
calc_sequence_disp(scene, seq);
}
-static int sequencer_paste_exec(bContext *C, wmOperator *op)
+static int sequencer_paste_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, TRUE); /* create if needed */
@@ -2649,7 +2692,7 @@ static int sequencer_paste_exec(bContext *C, wmOperator *op)
deselect_all_seq(scene);
ofs = scene->r.cfra - seqbase_clipboard_frame;
- seqbase_dupli_recursive(scene, &nseqbase, &seqbase_clipboard, SEQ_DUPE_UNIQUE_NAME);
+ seqbase_dupli_recursive(scene, NULL, &nseqbase, &seqbase_clipboard, SEQ_DUPE_UNIQUE_NAME);
/* transform pasted strips before adding */
if(ofs) {
@@ -2658,7 +2701,7 @@ static int sequencer_paste_exec(bContext *C, wmOperator *op)
}
}
- addlisttolist(ed->seqbasep, &nseqbase);
+ BLI_movelisttolist(ed->seqbasep, &nseqbase);
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
diff --git a/source/blender/editors/space_sequencer/sequencer_intern.h b/source/blender/editors/space_sequencer/sequencer_intern.h
index bf0dfff8e98..3e47368ef3c 100644
--- a/source/blender/editors/space_sequencer/sequencer_intern.h
+++ b/source/blender/editors/space_sequencer/sequencer_intern.h
@@ -54,9 +54,6 @@ void seq_reset_imageofs(struct SpaceSeq *sseq);
/* sequencer_edit.c */
struct View2D;
-int seq_single_check(struct Sequence *seq);
-int seq_tx_get_final_left(struct Sequence *seq, int metaclip);
-int seq_tx_get_final_right(struct Sequence *seq, int metaclip);
void seq_rectf(struct Sequence *seq, struct rctf *rectf);
void boundbox_seq(struct Scene *scene, struct rctf *rect);
struct Sequence *find_nearest_seq(struct Scene *scene, struct View2D *v2d, int *hand, short mval[2]);
@@ -64,8 +61,7 @@ struct Sequence *find_neighboring_sequence(struct Scene *scene, struct Sequence
void deselect_all_seq(struct Scene *scene);
void recurs_sel_seq(struct Sequence *seqm);
int event_to_efftype(int event);
-int seq_effect_find_selected(struct Scene *scene, struct Sequence *activeseq, int type, struct Sequence **selseq1, struct Sequence **selseq2, struct Sequence **selseq3, char **error_str);
-struct Sequence *alloc_sequence(struct ListBase *lb, int cfra, int machine);
+int seq_effect_find_selected(struct Scene *scene, struct Sequence *activeseq, int type, struct Sequence **selseq1, struct Sequence **selseq2, struct Sequence **selseq3, const char **error_str);
/* operator helpers */
int sequencer_edit_poll(struct bContext *C);
@@ -87,6 +83,7 @@ void SEQUENCER_OT_unlock(struct wmOperatorType *ot);
void SEQUENCER_OT_reload(struct wmOperatorType *ot);
void SEQUENCER_OT_refresh_all(struct wmOperatorType *ot);
void SEQUENCER_OT_reassign_inputs(struct wmOperatorType *ot);
+void SEQUENCER_OT_swap_inputs(struct wmOperatorType *ot);
void SEQUENCER_OT_duplicate(struct wmOperatorType *ot);
void SEQUENCER_OT_delete(struct wmOperatorType *ot);
void SEQUENCER_OT_images_separate(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c
index 041b475223b..62c478f916f 100644
--- a/source/blender/editors/space_sequencer/sequencer_ops.c
+++ b/source/blender/editors/space_sequencer/sequencer_ops.c
@@ -60,6 +60,7 @@ void sequencer_operatortypes(void)
WM_operatortype_append(SEQUENCER_OT_reload);
WM_operatortype_append(SEQUENCER_OT_refresh_all);
WM_operatortype_append(SEQUENCER_OT_reassign_inputs);
+ WM_operatortype_append(SEQUENCER_OT_swap_inputs);
WM_operatortype_append(SEQUENCER_OT_duplicate);
WM_operatortype_append(SEQUENCER_OT_delete);
WM_operatortype_append(SEQUENCER_OT_images_separate);
@@ -169,6 +170,7 @@ void sequencer_keymap(wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_swap", RIGHTARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "side", SEQ_SIDE_RIGHT);
WM_keymap_add_item(keymap, "SEQUENCER_OT_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "SEQUENCER_OT_swap_inputs", SKEY, KM_PRESS, KM_ALT, 0);
/* multicam editing keyboard layout, switch to camera 1-10 using
regular number keys */
diff --git a/source/blender/editors/space_sequencer/sequencer_scopes.c b/source/blender/editors/space_sequencer/sequencer_scopes.c
index d9d027823bc..b8b34eacdc0 100644
--- a/source/blender/editors/space_sequencer/sequencer_scopes.c
+++ b/source/blender/editors/space_sequencer/sequencer_scopes.c
@@ -26,7 +26,9 @@
#include <math.h>
#include <string.h>
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
+
+
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -143,7 +145,7 @@ static void wform_put_grid(unsigned char * tgt, int w, int h)
static struct ImBuf *make_waveform_view_from_ibuf_byte(struct ImBuf * ibuf)
{
- struct ImBuf * rval = IMB_allocImBuf(ibuf->x + 3, 515, 32, IB_rect, 0);
+ struct ImBuf * rval = IMB_allocImBuf(ibuf->x + 3, 515, 32, IB_rect);
int x,y;
unsigned char* src = (unsigned char*) ibuf->rect;
unsigned char* tgt = (unsigned char*) rval->rect;
@@ -189,7 +191,7 @@ static struct ImBuf *make_waveform_view_from_ibuf_byte(struct ImBuf * ibuf)
static struct ImBuf *make_waveform_view_from_ibuf_float(struct ImBuf * ibuf)
{
- struct ImBuf * rval = IMB_allocImBuf(ibuf->x + 3, 515, 32, IB_rect, 0);
+ struct ImBuf * rval = IMB_allocImBuf(ibuf->x + 3, 515, 32, IB_rect);
int x,y;
float* src = ibuf->rect_float;
unsigned char* tgt = (unsigned char*) rval->rect;
@@ -249,7 +251,7 @@ struct ImBuf *make_waveform_view_from_ibuf(struct ImBuf * ibuf)
static struct ImBuf *make_sep_waveform_view_from_ibuf_byte(struct ImBuf * ibuf)
{
struct ImBuf * rval = IMB_allocImBuf(
- ibuf->x + 3, 515, 32, IB_rect, 0);
+ ibuf->x + 3, 515, 32, IB_rect);
int x,y;
unsigned char* src = (unsigned char*) ibuf->rect;
unsigned char* tgt = (unsigned char*) rval->rect;
@@ -299,7 +301,7 @@ static struct ImBuf *make_sep_waveform_view_from_ibuf_float(
struct ImBuf * ibuf)
{
struct ImBuf * rval = IMB_allocImBuf(
- ibuf->x + 3, 515, 32, IB_rect, 0);
+ ibuf->x + 3, 515, 32, IB_rect);
int x,y;
float* src = ibuf->rect_float;
unsigned char* tgt = (unsigned char*) rval->rect;
@@ -422,7 +424,7 @@ static void draw_zebra_float(struct ImBuf * src,struct ImBuf * ibuf,float perc)
struct ImBuf * make_zebra_view_from_ibuf(struct ImBuf * src, float perc)
{
- struct ImBuf * ibuf = IMB_allocImBuf(src->x, src->y, 32, IB_rect, 0);
+ struct ImBuf * ibuf = IMB_allocImBuf(src->x, src->y, 32, IB_rect);
if (src->rect_float) {
draw_zebra_float(src, ibuf, perc);
@@ -463,7 +465,7 @@ static void draw_histogram_bar(struct ImBuf * ibuf, int x,float val, int col)
static struct ImBuf *make_histogram_view_from_ibuf_byte(
struct ImBuf * ibuf)
{
- struct ImBuf * rval = IMB_allocImBuf(515, 128, 32, IB_rect, 0);
+ struct ImBuf * rval = IMB_allocImBuf(515, 128, 32, IB_rect);
int n,c,x,y;
unsigned char* src = (unsigned char*) ibuf->rect;
@@ -517,7 +519,7 @@ static int get_bin_float(float f)
static struct ImBuf *make_histogram_view_from_ibuf_float(
struct ImBuf * ibuf)
{
- struct ImBuf * rval = IMB_allocImBuf(515, 128, 32, IB_rect, 0);
+ struct ImBuf * rval = IMB_allocImBuf(515, 128, 32, IB_rect);
int n,c,x,y;
float* src = ibuf->rect_float;
@@ -596,7 +598,7 @@ static void vectorscope_put_cross(unsigned char r, unsigned char g,
static struct ImBuf *make_vectorscope_view_from_ibuf_byte(struct ImBuf * ibuf)
{
- struct ImBuf * rval = IMB_allocImBuf(515, 515, 32, IB_rect, 0);
+ struct ImBuf * rval = IMB_allocImBuf(515, 515, 32, IB_rect);
int x,y;
char* src = (char*) ibuf->rect;
char* tgt = (char*) rval->rect;
@@ -643,7 +645,7 @@ static struct ImBuf *make_vectorscope_view_from_ibuf_byte(struct ImBuf * ibuf)
static struct ImBuf *make_vectorscope_view_from_ibuf_float(struct ImBuf * ibuf)
{
- struct ImBuf * rval = IMB_allocImBuf(515, 515, 32, IB_rect, 0);
+ struct ImBuf * rval = IMB_allocImBuf(515, 515, 32, IB_rect);
int x,y;
float* src = ibuf->rect_float;
char* tgt = (char*) rval->rect;
diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c
index a61e05517d9..a20d2d7680e 100644
--- a/source/blender/editors/space_sequencer/sequencer_select.c
+++ b/source/blender/editors/space_sequencer/sequencer_select.c
@@ -35,9 +35,9 @@
#endif
#include <sys/types.h>
-
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_scene_types.h"
@@ -58,7 +58,7 @@
/* own include */
#include "sequencer_intern.h"
-static void *find_nearest_marker(int d1, int d2) {return NULL;}
+static void *find_nearest_marker(int UNUSED(d1), int UNUSED(d2)) {return NULL;}
void select_surrounding_handles(Scene *scene, Sequence *test) /* XXX BRING BACK */
{
@@ -209,7 +209,7 @@ void select_neighbor_from_last(Scene *scene, int lr)
/* (de)select operator */
-static int sequencer_deselect_exec(bContext *C, wmOperator *op)
+static int sequencer_deselect_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -255,7 +255,7 @@ void SEQUENCER_OT_select_all_toggle(struct wmOperatorType *ot)
/* (de)select operator */
-static int sequencer_select_inverse_exec(bContext *C, wmOperator *op)
+static int sequencer_select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -363,16 +363,16 @@ static int sequencer_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
SpaceSeq *sseq= CTX_wm_space_seq(C);
if (sseq && sseq->flag & SEQ_MARKER_TRANS) {
- TimeMarker *marker;
+ TimeMarker *tmarker;
- for (marker= scene->markers.first; marker; marker= marker->next) {
- if( ((x < CFRA) && marker->frame < CFRA) ||
- ((x >= CFRA) && marker->frame >= CFRA)
+ for (tmarker= scene->markers.first; tmarker; tmarker= tmarker->next) {
+ if( ((x < CFRA) && tmarker->frame < CFRA) ||
+ ((x >= CFRA) && tmarker->frame >= CFRA)
) {
- marker->flag |= SELECT;
+ tmarker->flag |= SELECT;
}
else {
- marker->flag &= ~SELECT;
+ tmarker->flag &= ~SELECT;
}
}
}
@@ -582,7 +582,7 @@ static int select_more_less_seq__internal(Scene *scene, int sel, int linked) {
/* select more operator */
-static int sequencer_select_more_exec(bContext *C, wmOperator *op)
+static int sequencer_select_more_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
@@ -613,7 +613,7 @@ void SEQUENCER_OT_select_more(wmOperatorType *ot)
/* select less operator */
-static int sequencer_select_less_exec(bContext *C, wmOperator *op)
+static int sequencer_select_less_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
@@ -700,7 +700,7 @@ void SEQUENCER_OT_select_linked_pick(wmOperatorType *ot)
/* select linked operator */
-static int sequencer_select_linked_exec(bContext *C, wmOperator *op)
+static int sequencer_select_linked_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
int selected;
diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c
index 4cf25ab9585..ed280d765f0 100644
--- a/source/blender/editors/space_sequencer/space_sequencer.c
+++ b/source/blender/editors/space_sequencer/space_sequencer.c
@@ -36,6 +36,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_path_util.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -236,7 +237,7 @@ static SpaceLink *sequencer_new(const bContext *C)
}
/* not spacelink itself */
-static void sequencer_free(SpaceLink *sl)
+static void sequencer_free(SpaceLink *UNUSED(sl))
{
// SpaceSeq *sseq= (SpaceSequencer*) sl;
@@ -246,7 +247,7 @@ static void sequencer_free(SpaceLink *sl)
/* spacetype; init callback */
-static void sequencer_init(struct wmWindowManager *wm, ScrArea *sa)
+static void sequencer_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -296,7 +297,7 @@ static void sequencer_main_area_draw(const bContext *C, ARegion *ar)
/* ************* dropboxes ************* */
-static int image_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int image_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_PATH)
if(ELEM(drag->icon, ICON_FILE_IMAGE, ICON_FILE_BLANK)) /* rule might not work? */
@@ -304,7 +305,7 @@ static int image_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
return 0;
}
-static int movie_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int movie_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_PATH)
if(ELEM3(drag->icon, 0, ICON_FILE_MOVIE, ICON_FILE_BLANK)) /* rule might not work? */
@@ -312,7 +313,7 @@ static int movie_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
return 0;
}
-static int sound_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int sound_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_PATH)
if(ELEM(drag->icon, ICON_FILE_SOUND, ICON_FILE_BLANK)) /* rule might not work? */
@@ -334,6 +335,7 @@ static void sequencer_drop_copy(wmDrag *drag, wmDropBox *drop)
RNA_string_set(drop->ptr, "directory", dir);
+ RNA_collection_clear(drop->ptr, "files");
RNA_collection_add(drop->ptr, "files", &itemptr);
RNA_string_set(&itemptr, "name", file);
}
@@ -352,7 +354,7 @@ static void sequencer_dropboxes(void)
/* ************* end drop *********** */
/* add handlers, stuff you only do once or on area/region changes */
-static void sequencer_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void sequencer_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -371,6 +373,7 @@ static void sequencer_main_area_listener(ARegion *ar, wmNotifier *wmn)
case ND_FRAME:
case ND_FRAME_RANGE:
case ND_MARKERS:
+ case ND_RENDER_OPTIONS: /* for FPS and FPS Base */
case ND_SEQUENCER:
ED_region_tag_redraw(ar);
break;
@@ -516,7 +519,7 @@ void ED_spacetype_sequencer(void)
art->init= sequencer_main_area_init;
art->draw= sequencer_main_area_draw;
art->listener= sequencer_main_area_listener;
- art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES|ED_KEYMAP_ANIMATION;
+ art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS|ED_KEYMAP_FRAMES|ED_KEYMAP_ANIMATION;
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_sound/CMakeLists.txt b/source/blender/editors/space_sound/CMakeLists.txt
index c78fc11a908..df148e0fd91 100644
--- a/source/blender/editors/space_sound/CMakeLists.txt
+++ b/source/blender/editors/space_sound/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -31,4 +29,11 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_space_sound "${SRC}" "${INC}")
+set(SRC
+ sound_header.c
+ space_sound.c
+
+ sound_intern.h
+)
+
+blender_add_lib(bf_editor_space_sound "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_sound/Makefile b/source/blender/editors/space_sound/Makefile
deleted file mode 100644
index 9afda815f59..00000000000
--- a/source/blender/editors/space_sound/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_sound
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_sound/sound_header.c b/source/blender/editors/space_sound/sound_header.c
index fbf6d8c85c9..60bf0775f5e 100644
--- a/source/blender/editors/space_sound/sound_header.c
+++ b/source/blender/editors/space_sound/sound_header.c
@@ -33,6 +33,8 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
@@ -40,7 +42,6 @@
#include "ED_types.h"
#include "ED_util.h"
-
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -53,12 +54,12 @@
/* ************************ header area region *********************** */
-static void do_viewmenu(bContext *C, void *arg, int event)
+static void do_viewmenu(bContext *UNUSED(C), void *UNUSED(arg), int UNUSED(event))
{
}
-static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
+static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *UNUSED(arg))
{
ScrArea *curarea= CTX_wm_area(C);
uiBlock *block;
@@ -84,7 +85,7 @@ static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
return block;
}
-static void do_sound_buttons(bContext *C, void *arg, int event)
+static void do_sound_buttons(bContext *UNUSED(C), void *UNUSED(arg), int event)
{
switch(event) {
}
diff --git a/source/blender/editors/space_sound/space_sound.c b/source/blender/editors/space_sound/space_sound.c
index 905e1d6cdd9..200f15f6109 100644
--- a/source/blender/editors/space_sound/space_sound.c
+++ b/source/blender/editors/space_sound/space_sound.c
@@ -36,6 +36,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -55,7 +56,7 @@
/* ******************** default callbacks for sound space ***************** */
-static SpaceLink *sound_new(const bContext *C)
+static SpaceLink *sound_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceSound *ssound;
@@ -106,7 +107,7 @@ static SpaceLink *sound_new(const bContext *C)
}
/* not spacelink itself */
-static void sound_free(SpaceLink *sl)
+static void sound_free(SpaceLink *UNUSED(sl))
{
// SpaceSound *ssound= (SpaceSound*) sl;
@@ -115,7 +116,7 @@ static void sound_free(SpaceLink *sl)
/* spacetype; init callback */
-static void sound_init(struct wmWindowManager *wm, ScrArea *sa)
+static void sound_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -153,7 +154,7 @@ static void sound_main_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* data... */
@@ -169,13 +170,13 @@ void sound_operatortypes(void)
}
-void sound_keymap(struct wmKeyConfig *keyconf)
+void sound_keymap(struct wmKeyConfig *UNUSED(keyconf))
{
}
/* add handlers, stuff you only do once or on area/region changes */
-static void sound_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void sound_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
}
@@ -194,7 +195,7 @@ static void sound_header_area_draw(const bContext *C, ARegion *ar)
glClear(GL_COLOR_BUFFER_BIT);
/* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(C, &ar->v2d);
+ UI_view2d_view_ortho(&ar->v2d);
sound_header_buttons(C, ar);
@@ -202,7 +203,7 @@ static void sound_header_area_draw(const bContext *C, ARegion *ar)
UI_view2d_view_restore(C);
}
-static void sound_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void sound_main_area_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
{
/* context changes */
}
diff --git a/source/blender/editors/space_text/CMakeLists.txt b/source/blender/editors/space_text/CMakeLists.txt
index eabf508b5f6..8c18630ab7d 100644
--- a/source/blender/editors/space_text/CMakeLists.txt
+++ b/source/blender/editors/space_text/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenfont
../../blenkernel
@@ -32,10 +30,19 @@ SET(INC
../../../../intern/guardedalloc
)
-IF(WITH_PYTHON)
- LIST(APPEND INC ${PYTHON_INC} ../../python)
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+set(SRC
+ space_text.c
+ text_draw.c
+ text_header.c
+ text_ops.c
+ text_python.c
+
+ text_intern.h
+)
+
+if(WITH_PYTHON)
+ list(APPEND INC ${PYTHON_INCLUDE_DIRS} ../../python)
+ add_definitions(-DWITH_PYTHON)
+endif()
-BLENDERLIB(bf_editor_text "${SRC}" "${INC}")
+blender_add_lib(bf_editor_text "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_text/Makefile b/source/blender/editors/space_text/Makefile
deleted file mode 100644
index 8bc12852e18..00000000000
--- a/source/blender/editors/space_text/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_text
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenfont
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_text/SConscript b/source/blender/editors/space_text/SConscript
index bd87a799756..6d2816b7834 100644
--- a/source/blender/editors/space_text/SConscript
+++ b/source/blender/editors/space_text/SConscript
@@ -7,7 +7,7 @@ incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
incs += ' ../../python ../../makesrna ../../blenfont'
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
+if env['WITH_BF_PYTHON']:
+ defs.append('WITH_PYTHON')
env.BlenderLib ( 'bf_editors_space_text', sources, Split(incs), defs, libtype=['core'], priority=[95] )
diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c
index 7f7a07f8cf7..75001b9514c 100644
--- a/source/blender/editors/space_text/space_text.c
+++ b/source/blender/editors/space_text/space_text.c
@@ -37,6 +37,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -59,7 +60,7 @@
/* ******************** default callbacks for text space ***************** */
-static SpaceLink *text_new(const bContext *C)
+static SpaceLink *text_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceText *stext;
@@ -92,11 +93,12 @@ static void text_free(SpaceLink *sl)
SpaceText *stext= (SpaceText*) sl;
stext->text= NULL;
+ text_free_caches(stext);
}
/* spacetype; init callback */
-static void text_init(struct wmWindowManager *wm, ScrArea *sa)
+static void text_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -104,9 +106,11 @@ static void text_init(struct wmWindowManager *wm, ScrArea *sa)
static SpaceLink *text_duplicate(SpaceLink *sl)
{
SpaceText *stextn= MEM_dupallocN(sl);
-
+
/* clear or remove stuff from old */
-
+
+ stextn->drawcache= NULL; /* space need it's own cache */
+
return (SpaceLink *)stextn;
}
@@ -132,8 +136,11 @@ static void text_listener(ScrArea *sa, wmNotifier *wmn)
switch(wmn->action) {
case NA_EDITED:
- if(st->text)
+ if(st->text) {
+ text_drawcache_tag_update(st, 1);
text_update_edited(st->text);
+ }
+
ED_area_tag_redraw(sa);
/* no break -- fall down to tag redraw */
case NA_ADDED:
@@ -215,9 +222,21 @@ static void text_keymap(struct wmKeyConfig *keyconf)
#ifdef __APPLE__
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", LEFTARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", LINE_BEGIN);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", RIGHTARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", LINE_BEGIN);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", RIGHTARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", LINE_END);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", LEFTARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "type", PREV_WORD);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", RIGHTARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "type", NEXT_WORD);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", UPARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", FILE_TOP);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", DOWNARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", FILE_BOTTOM);
+
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", LEFTARROWKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0)->ptr, "type", LINE_BEGIN);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0)->ptr, "type", LINE_BEGIN);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0)->ptr, "type", LINE_END);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", LEFTARROWKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0)->ptr, "type", PREV_WORD);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0)->ptr, "type", NEXT_WORD);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", UPARROWKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0)->ptr, "type", FILE_TOP);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", DOWNARROWKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0)->ptr, "type", FILE_BOTTOM);
+
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_ALT, 0)->ptr, "type", DEL_PREV_WORD);
+
WM_keymap_add_item(keymap, "TEXT_OT_save", SKEY, KM_PRESS, KM_ALT|KM_OSKEY, 0);
WM_keymap_add_item(keymap, "TEXT_OT_save_as", SKEY, KM_PRESS, KM_ALT|KM_SHIFT|KM_OSKEY, 0);
WM_keymap_add_item(keymap, "TEXT_OT_cut", XKEY, KM_PRESS, KM_OSKEY, 0);
@@ -311,7 +330,7 @@ static void text_keymap(struct wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_PREV_CHAR);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", DELKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_NEXT_WORD);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_PREV_WORD);
-
+
WM_keymap_add_item(keymap, "TEXT_OT_overwrite_toggle", INSERTKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "TEXT_OT_scroll", MIDDLEMOUSE, KM_PRESS, 0, 0);
@@ -378,7 +397,7 @@ static void text_main_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- // UI_view2d_view_ortho(C, v2d);
+ // UI_view2d_view_ortho(v2d);
/* data... */
draw_text_main(st, ar);
@@ -389,7 +408,7 @@ static void text_main_area_draw(const bContext *C, ARegion *ar)
/* scrollers? */
}
-static void text_cursor(wmWindow *win, ScrArea *sa, ARegion *ar)
+static void text_cursor(wmWindow *win, ScrArea *UNUSED(sa), ARegion *UNUSED(ar))
{
WM_cursor_set(win, BC_TEXTEDITCURSOR);
}
@@ -398,10 +417,10 @@ static void text_cursor(wmWindow *win, ScrArea *sa, ARegion *ar)
/* ************* dropboxes ************* */
-static int text_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int text_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_PATH)
- if(ELEM(drag->icon, 0, ICON_FILE_BLANK)) /* rule might not work? */
+ if(ELEM(drag->icon, ICON_FILE_SCRIPT, ICON_FILE_BLANK)) /* rule might not work? */
return 1;
return 0;
}
@@ -427,7 +446,7 @@ static void text_dropboxes(void)
/****************** header region ******************/
/* add handlers, stuff you only do once or on area/region changes */
-static void text_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void text_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
diff --git a/source/blender/editors/space_text/text_draw.c b/source/blender/editors/space_text/text_draw.c
index 62274fc664a..6f9ad138bac 100644
--- a/source/blender/editors/space_text/text_draw.c
+++ b/source/blender/editors/space_text/text_draw.c
@@ -10,7 +10,6 @@
*
* 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
@@ -37,6 +36,7 @@
#include "BLF_api.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_text_types.h"
#include "DNA_space_types.h"
@@ -46,7 +46,7 @@
#include "BKE_context.h"
#include "BKE_suggestions.h"
#include "BKE_text.h"
-#include "BKE_utildefines.h"
+
#include "BIF_gl.h"
@@ -57,25 +57,22 @@
#include "text_intern.h"
/******************** text font drawing ******************/
-static int mono= -1; // XXX needs proper storage and change all the BLF_* here
+// XXX, fixme
+#define mono blf_mono_font
static void text_font_begin(SpaceText *st)
{
- if(mono == -1)
- mono= BLF_load_mem("monospace", (unsigned char*)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size);
-
- BLF_aspect(mono, 1.0);
BLF_size(mono, st->lheight, 72);
}
-static void text_font_end(SpaceText *st)
+static void text_font_end(SpaceText *UNUSED(st))
{
}
-static int text_font_draw(SpaceText *st, int x, int y, char *str)
+static int text_font_draw(SpaceText *UNUSED(st), int x, int y, char *str)
{
BLF_position(mono, x, y, 0);
- BLF_draw(mono, str);
+ BLF_draw(mono, str, 65535); /* XXX, use real length */
return BLF_width(mono, str);
}
@@ -83,17 +80,16 @@ static int text_font_draw(SpaceText *st, int x, int y, char *str)
static int text_font_draw_character(SpaceText *st, int x, int y, char c)
{
char str[2];
-
str[0]= c;
str[1]= '\0';
BLF_position(mono, x, y, 0);
- BLF_draw(mono, str);
+ BLF_draw(mono, str, 1);
return st->cwidth;
}
-int text_font_width(SpaceText *st, char *str)
+int text_font_width(SpaceText *UNUSED(st), const char *str)
{
return BLF_width(mono, str);
}
@@ -128,7 +124,7 @@ static void flatten_string_append(FlattenString *fs, char c, int accum)
fs->pos++;
}
-int flatten_string(SpaceText *st, FlattenString *fs, char *in)
+int flatten_string(SpaceText *st, FlattenString *fs, const char *in)
{
int r = 0, i = 0;
@@ -498,7 +494,7 @@ int wrap_width(SpaceText *st, ARegion *ar)
int x, max;
x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
- max= (winx-x)/st->cwidth;
+ max= st->cwidth ? (winx-x)/st->cwidth : 0;
return max>8 ? max : 8;
}
@@ -521,9 +517,22 @@ void wrap_offset(SpaceText *st, ARegion *ar, TextLine *linein, int cursin, int *
linep= text->lines.first;
i= st->top;
while(i>0 && linep) {
- if(linep == linein) return; /* Line before top */
- linep= linep->next;
- i--;
+ int lines= text_get_visible_lines(st, ar, linep->line);
+
+ /* Line before top */
+ if(linep == linein) {
+ if(lines <= i)
+ /* no visible part of line */
+ return;
+ }
+
+ if (i-lines<0) {
+ break;
+ } else {
+ linep= linep->next;
+ (*offl)+= lines-1;
+ i-= lines;
+ }
}
max= wrap_width(st, ar);
@@ -548,10 +557,18 @@ void wrap_offset(SpaceText *st, ARegion *ar, TextLine *linein, int cursin, int *
while(chars--) {
if(i-start>=max) {
- if(chop && linep==linein && i >= cursin)
+ if(chop && linep==linein && i >= cursin) {
+ if (i==cursin) {
+ (*offl)++;
+ *offc -= end-start;
+ }
+
return;
+ }
+
(*offl)++;
*offc -= end-start;
+
start= end;
end += max;
chop= 1;
@@ -570,7 +587,65 @@ void wrap_offset(SpaceText *st, ARegion *ar, TextLine *linein, int cursin, int *
}
}
-static int get_char_pos(SpaceText *st, char *line, int cur)
+void wrap_offset_in_line(SpaceText *st, ARegion *ar, TextLine *linein, int cursin, int *offl, int *offc)
+{
+ int i, j, start, end, chars, max, chop;
+ char ch;
+
+ *offl= *offc= 0;
+
+ if(!st->text) return;
+ if(!st->wordwrap) return;
+
+ max= wrap_width(st, ar);
+
+ start= 0;
+ end= max;
+ chop= 1;
+ *offc= 0;
+
+ for(i=0, j=0; linein->line[j]!='\0'; j++) {
+
+ /* Mimic replacement of tabs */
+ ch= linein->line[j];
+ if(ch=='\t') {
+ chars= st->tabnumber-i%st->tabnumber;
+ if(i<cursin) cursin += chars-1;
+ ch= ' ';
+ }
+ else
+ chars= 1;
+
+ while(chars--) {
+ if(i-start>=max) {
+ if(chop && i >= cursin) {
+ if (i==cursin) {
+ (*offl)++;
+ *offc -= end-start;
+ }
+
+ return;
+ }
+
+ (*offl)++;
+ *offc -= end-start;
+
+ start= end;
+ end += max;
+ chop= 1;
+ }
+ else if(ch==' ' || ch=='-') {
+ end = i+1;
+ chop= 0;
+ if(i >= cursin)
+ return;
+ }
+ i++;
+ }
+ }
+}
+
+int text_get_char_pos(SpaceText *st, const char *line, int cur)
{
int a=0, i;
@@ -583,7 +658,7 @@ static int get_char_pos(SpaceText *st, char *line, int cur)
return a;
}
-static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char *format)
+static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char *format, int skip)
{
FlattenString fs;
int basex, i, a, len, start, end, max, lines;
@@ -599,6 +674,14 @@ static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char
end= max;
for(i=0; i<len; i++) {
if(i-start >= max) {
+ /* skip hidden part of line */
+ if(skip) {
+ skip--;
+ start= end;
+ end += max;
+ continue;
+ }
+
/* Draw the visible portion of text on the overshot line */
for(a=start; a<end; a++) {
if(st->showsyntax && format) format_draw_color(format[a]);
@@ -609,6 +692,8 @@ static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char
lines++;
start= end;
end += max;
+
+ if(y<=0) break;
}
else if(str[i]==' ' || str[i]=='-') {
end = i+1;
@@ -616,7 +701,7 @@ static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char
}
/* Draw the remaining text */
- for(a=start; a<len; a++) {
+ for(a=start; a<len && y > 0; a++) {
if(st->showsyntax && format)
format_draw_color(format[a]);
@@ -631,7 +716,7 @@ static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char
static int text_draw(SpaceText *st, char *str, int cshift, int maxwidth, int draw, int x, int y, char *format)
{
FlattenString fs;
- int r=0, w= 0;
+ int r=0, w= 0, amount;
int *acc;
char *in;
@@ -647,18 +732,26 @@ static int text_draw(SpaceText *st, char *str, int cshift, int maxwidth, int dra
if(draw) {
if(st->showsyntax && format) {
- int amount, a;
+ int a;
format = format+cshift;
amount = strlen(in);
+ if(maxwidth)
+ amount= MIN2(amount, maxwidth);
for(a = 0; a < amount; a++) {
format_draw_color(format[a]);
x += text_font_draw_character(st, x, y, in[a]);
}
}
- else
+ else {
+ amount = strlen(in);
+ if(maxwidth)
+ amount= MIN2(amount, maxwidth);
+
+ in[amount]= 0;
text_font_draw(st, x, y, in);
+ }
}
else {
while(w-- && *acc++ < maxwidth)
@@ -675,23 +768,313 @@ static int text_draw(SpaceText *st, char *str, int cshift, int maxwidth, int dra
return r+TXT_OFFSET;
}
+/************************ cache utilities *****************************/
+
+typedef struct DrawCache {
+ int *line_height;
+ int total_lines, nlines;
+
+ /* this is needed to check cache relevance */
+ int winx, wordwrap, showlinenrs, tabnumber;
+ short lheight;
+ char cwidth;
+ char text_id[MAX_ID_NAME];
+
+ /* for partial lines recalculation */
+ short update_flag;
+ int valid_head, valid_tail; /* amount of unchanged lines */
+} DrawCache;
+
+static void text_drawcache_init(SpaceText *st)
+{
+ DrawCache *drawcache= MEM_callocN(sizeof (DrawCache), "text draw cache");
+
+ drawcache->winx= -1;
+ drawcache->nlines= BLI_countlist(&st->text->lines);
+ drawcache->text_id[0]= '\0';
+
+ st->drawcache= drawcache;
+}
+
+static void text_update_drawcache(SpaceText *st, ARegion *ar)
+{
+ DrawCache *drawcache;
+ int full_update= 0, nlines= 0;
+ Text *txt= st->text;
+
+ if(!st->drawcache) text_drawcache_init(st);
+
+ text_update_character_width(st);
+
+ drawcache= (DrawCache *)st->drawcache;
+ nlines= drawcache->nlines;
+
+ /* check if full cache update is needed */
+ full_update|= drawcache->winx != ar->winx; /* area was resized */
+ full_update|= drawcache->wordwrap != st->wordwrap; /* word-wrapping option was toggled */
+ full_update|= drawcache->showlinenrs != st->showlinenrs; /* word-wrapping option was toggled */
+ full_update|= drawcache->tabnumber != st->tabnumber; /* word-wrapping option was toggled */
+ full_update|= drawcache->lheight != st->lheight; /* word-wrapping option was toggled */
+ full_update|= drawcache->cwidth != st->cwidth; /* word-wrapping option was toggled */
+ full_update|= strncmp(drawcache->text_id, txt->id.name, MAX_ID_NAME); /* text datablock was changed */
+
+ if(st->wordwrap) {
+ /* update line heights */
+ if(full_update || !drawcache->line_height) {
+ drawcache->valid_head = 0;
+ drawcache->valid_tail = 0;
+ drawcache->update_flag = 1;
+ }
+
+ if(drawcache->update_flag) {
+ TextLine *line= st->text->lines.first;
+ int lineno= 0, size, lines_count;
+ int *fp= drawcache->line_height, *new_tail, *old_tail;
+
+ nlines= BLI_countlist(&txt->lines);
+ size= sizeof(int)*nlines;
+
+ if(fp) fp= MEM_reallocN(fp, size);
+ else fp= MEM_callocN(size, "text drawcache line_height");
+
+ drawcache->valid_tail= drawcache->valid_head= 0;
+ old_tail= fp + drawcache->nlines - drawcache->valid_tail;
+ new_tail= fp + nlines - drawcache->valid_tail;
+ memmove(new_tail, old_tail, drawcache->valid_tail);
+
+ drawcache->total_lines= 0;
+
+ if(st->showlinenrs)
+ st->linenrs_tot= (int)floor(log10((float)nlines)) + 1;
+
+ while(line) {
+ if(drawcache->valid_head) { /* we're inside valid head lines */
+ lines_count= fp[lineno];
+ drawcache->valid_head--;
+ } else if (lineno > new_tail - fp) { /* we-re inside valid tail lines */
+ lines_count= fp[lineno];
+ } else {
+ lines_count= text_get_visible_lines(st, ar, line->line);
+ }
+
+ fp[lineno]= lines_count;
+
+ line= line->next;
+ lineno++;
+ drawcache->total_lines+= lines_count;
+ }
+
+ drawcache->line_height= fp;
+ }
+ } else {
+ if(drawcache->line_height) {
+ MEM_freeN(drawcache->line_height);
+ drawcache->line_height= NULL;
+ }
+
+ if(full_update || drawcache->update_flag) {
+ nlines= BLI_countlist(&txt->lines);
+
+ if(st->showlinenrs)
+ st->linenrs_tot= (int)floor(log10((float)nlines)) + 1;
+ }
+
+ drawcache->total_lines= nlines;
+ }
+
+ drawcache->nlines= nlines;
+
+ /* store settings */
+ drawcache->winx = ar->winx;
+ drawcache->wordwrap = st->wordwrap;
+ drawcache->lheight = st->lheight;
+ drawcache->cwidth = st->cwidth;
+ drawcache->showlinenrs = st->showlinenrs;
+ drawcache->tabnumber = st->tabnumber;
+
+ strncpy(drawcache->text_id, txt->id.name, MAX_ID_NAME);
+
+ /* clear update flag */
+ drawcache->update_flag = 0;
+ drawcache->valid_head = 0;
+ drawcache->valid_tail = 0;
+}
+
+void text_drawcache_tag_update(SpaceText *st, int full)
+{
+ DrawCache *drawcache= (DrawCache *)st->drawcache;
+
+ if(drawcache) {
+ Text *txt= st->text;
+
+ if(drawcache->update_flag) {
+ /* happens when tagging update from space listener */
+ /* should do nothing to prevent locally tagged cache be fully recalculated */
+ return;
+ }
+
+ if(!full) {
+ int sellno= BLI_findindex(&txt->lines, txt->sell);
+ int curlno= BLI_findindex(&txt->lines, txt->curl);
+
+ if(curlno < sellno) {
+ drawcache->valid_head= curlno;
+ drawcache->valid_tail= drawcache->nlines - sellno - 1;
+ } else {
+ drawcache->valid_head= sellno;
+ drawcache->valid_tail= drawcache->nlines - curlno - 1;
+ }
+
+ /* quick cache recalculation is also used in delete operator,
+ which could merge lines which are adjusent to current selection lines
+ expand recalculate area to this lines */
+ if(drawcache->valid_head>0) drawcache->valid_head--;
+ if(drawcache->valid_tail>0) drawcache->valid_tail--;
+ } else {
+ drawcache->valid_head= 0;
+ drawcache->valid_tail= 0;
+ }
+
+ drawcache->update_flag= 1;
+ }
+}
+
+void text_free_caches(SpaceText *st)
+{
+ DrawCache *drawcache= (DrawCache *)st->drawcache;
+
+ if(drawcache) {
+ if(drawcache->line_height)
+ MEM_freeN(drawcache->line_height);
+
+ MEM_freeN(drawcache);
+ }
+}
+
+/************************ word-wrap utilities *****************************/
+
+/* cache should be updated in caller */
+int text_get_visible_lines_no(SpaceText *st, int lineno)
+{
+ DrawCache *drawcache= (DrawCache *)st->drawcache;
+
+ return drawcache->line_height[lineno];
+}
+
+int text_get_visible_lines(SpaceText *st, ARegion *ar, const char *str)
+{
+ int i, j, start, end, max, lines, chars;
+ char ch;
+
+ max= wrap_width(st, ar);
+ lines= 1;
+ start= 0;
+ end= max;
+ for(i= 0, j= 0; str[j] != '\0'; j++) {
+ /* Mimic replacement of tabs */
+ ch= str[j];
+ if(ch=='\t') {
+ chars= st->tabnumber-i%st->tabnumber;
+ ch= ' ';
+ }
+ else chars= 1;
+
+ while(chars--) {
+ if(i-start >= max) {
+ lines++;
+ start= end;
+ end += max;
+ }
+ else if(ch==' ' || ch=='-') {
+ end= i+1;
+ }
+
+ i++;
+ }
+ }
+
+ return lines;
+}
+
+int text_get_span_wrap(SpaceText *st, ARegion *ar, TextLine *from, TextLine *to)
+{
+ if(st->wordwrap) {
+ int ret=0;
+ TextLine *tmp= from;
+
+ /* Look forwards */
+ while (tmp) {
+ if (tmp == to) return ret;
+ ret+= text_get_visible_lines(st, ar, tmp->line);
+ tmp= tmp->next;
+ }
+
+ return ret;
+ } else return txt_get_span(from, to);
+}
+
+int text_get_total_lines(SpaceText *st, ARegion *ar)
+{
+ DrawCache *drawcache;
+
+ text_update_drawcache(st, ar);
+ drawcache= (DrawCache *)st->drawcache;
+
+ return drawcache->total_lines;
+}
+
+/* Move pointer to first visible line (top) */
+static TextLine *first_visible_line(SpaceText *st, ARegion *ar, int *wrap_top)
+{
+ Text *text= st->text;
+ TextLine* pline= text->lines.first;
+ int i= st->top, lineno= 0;
+
+ text_update_drawcache(st, ar);
+
+ if(wrap_top) *wrap_top= 0;
+
+ if(st->wordwrap) {
+ while(i>0 && pline) {
+ int lines= text_get_visible_lines_no(st, lineno);
+
+ if (i-lines<0) {
+ if(wrap_top) *wrap_top= i;
+ break;
+ } else {
+ pline= pline->next;
+ i-= lines;
+ lineno++;
+ }
+ }
+ } else {
+ for(i=st->top; pline->next && i>0; i--)
+ pline= pline->next;
+ }
+
+ return pline;
+}
+
/************************ draw scrollbar *****************************/
-static void calc_text_rcts(SpaceText *st, ARegion *ar, rcti *scroll)
+static void calc_text_rcts(SpaceText *st, ARegion *ar, rcti *scroll, rcti *back)
{
- int lhlstart, lhlend, ltexth;
+ int lhlstart, lhlend, ltexth, sell_off, curl_off;
short barheight, barstart, hlstart, hlend, blank_lines;
short pix_available, pix_top_margin, pix_bottom_margin, pix_bardiff;
pix_top_margin = 8;
pix_bottom_margin = 4;
pix_available = ar->winy - pix_top_margin - pix_bottom_margin;
- ltexth= txt_get_span(st->text->lines.first, st->text->lines.last);
+ ltexth= text_get_total_lines(st, ar);
blank_lines = st->viewlines / 2;
/* nicer code: use scroll rect for entire bar */
- //scroll->xmin= 5;
- //scroll->xmax= 17;
+ back->xmin= ar->winx -18;
+ back->xmax= ar->winx;
+ back->ymin= 0;
+ back->ymax= ar->winy;
+
scroll->xmin= ar->winx - 17;
scroll->xmax= ar->winx - 5;
scroll->ymin= 4;
@@ -722,10 +1105,10 @@ static void calc_text_rcts(SpaceText *st, ARegion *ar, rcti *scroll)
st->pix_per_line= (pix_available > 0)? (float) ltexth/pix_available: 0;
if(st->pix_per_line<.1) st->pix_per_line=.1f;
- lhlstart = MIN2(txt_get_span(st->text->lines.first, st->text->curl),
- txt_get_span(st->text->lines.first, st->text->sell));
- lhlend = MAX2(txt_get_span(st->text->lines.first, st->text->curl),
- txt_get_span(st->text->lines.first, st->text->sell));
+ curl_off= text_get_span_wrap(st, ar, st->text->lines.first, st->text->curl);
+ sell_off= text_get_span_wrap(st, ar, st->text->lines.first, st->text->sell);
+ lhlstart = MIN2(curl_off, sell_off);
+ lhlend = MAX2(curl_off, sell_off);
if(ltexth > 0) {
hlstart = (lhlstart * pix_available)/ltexth;
@@ -787,19 +1170,23 @@ static void calc_text_rcts(SpaceText *st, ARegion *ar, rcti *scroll)
CLAMP(st->txtscroll.ymax, pix_bottom_margin, ar->winy - pix_top_margin);
}
-static void draw_textscroll(SpaceText *st, ARegion *ar, rcti *scroll)
+static void draw_textscroll(SpaceText *st, rcti *scroll, rcti *back)
{
bTheme *btheme= U.themes.first;
uiWidgetColors wcol= btheme->tui.wcol_scroll;
- char col[3];
+ unsigned char col[4];
float rad;
+ UI_ThemeColor(TH_BACK);
+ glRecti(back->xmin, back->ymin, back->xmax, back->ymax);
+
uiWidgetScrollDraw(&wcol, scroll, &st->txtbar, (st->flags & ST_SCROLL_SELECT)?UI_SCROLL_PRESSED:0);
uiSetRoundBox(15);
rad= 0.4f*MIN2(st->txtscroll.xmax - st->txtscroll.xmin, st->txtscroll.ymax - st->txtscroll.ymin);
UI_GetThemeColor3ubv(TH_HILITE, col);
- glColor4ub(col[0], col[1], col[2], 48);
+ col[3]= 48;
+ glColor4ubv(col);
glEnable(GL_BLEND);
uiRoundBox(st->txtscroll.xmin+1, st->txtscroll.ymin, st->txtscroll.xmax-1, st->txtscroll.ymax, rad);
glDisable(GL_BLEND);
@@ -811,78 +1198,80 @@ static void draw_markers(SpaceText *st, ARegion *ar)
{
Text *text= st->text;
TextMarker *marker, *next;
- TextLine *top, *bottom, *line;
- int offl, offc, i, cy, x1, x2, y1, y2, x, y;
+ TextLine *top, *line;
+ int offl, offc, i, x1, x2, y1, y2, x, y;
+ int topi, topy;
- for(i=st->top, top= text->lines.first; top->next && i>0; i--)
- top= top->next;
+ /* Move pointer to first visible line (top) */
+ top= first_visible_line(st, ar, NULL);
+ topi= BLI_findindex(&text->lines, top);
+
+ topy= txt_get_span(text->lines.first, top);
- for(i=st->viewlines-1, bottom=top; bottom->next && i>0; i--)
- bottom= bottom->next;
-
for(marker= text->markers.first; marker; marker= next) {
next= marker->next;
- for(cy= 0, line= top; line; cy++, line= line->next) {
- if(cy+st->top==marker->lineno) {
- /* Remove broken markers */
- if(marker->end>line->len || marker->start>marker->end) {
- BLI_freelinkN(&text->markers, marker);
- break;
- }
+ /* invisible line (before top) */
+ if(marker->lineno<topi) continue;
- wrap_offset(st, ar, line, marker->start, &offl, &offc);
- x1= get_char_pos(st, line->line, marker->start) - st->left + offc;
- y1= cy + offl;
- wrap_offset(st, ar, line, marker->end, &offl, &offc);
- x2= get_char_pos(st, line->line, marker->end) - st->left + offc;
- y2= cy + offl;
-
- glColor3ub(marker->color[0], marker->color[1], marker->color[2]);
- x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
- y= ar->winy-3;
-
- if(y1==y2) {
- y -= y1*st->lheight;
- glBegin(GL_LINE_LOOP);
- glVertex2i(x+x2*st->cwidth+1, y);
- glVertex2i(x+x1*st->cwidth-2, y);
- glVertex2i(x+x1*st->cwidth-2, y-st->lheight);
- glVertex2i(x+x2*st->cwidth+1, y-st->lheight);
- glEnd();
- }
- else {
- y -= y1*st->lheight;
- glBegin(GL_LINE_STRIP);
- glVertex2i(ar->winx, y);
- glVertex2i(x+x1*st->cwidth-2, y);
- glVertex2i(x+x1*st->cwidth-2, y-st->lheight);
- glVertex2i(ar->winx, y-st->lheight);
- glEnd();
- y-=st->lheight;
-
- for(i=y1+1; i<y2; i++) {
- glBegin(GL_LINES);
- glVertex2i(x, y);
- glVertex2i(ar->winx, y);
- glVertex2i(x, y-st->lheight);
- glVertex2i(ar->winx, y-st->lheight);
- glEnd();
- y-=st->lheight;
- }
+ line= BLI_findlink(&text->lines, marker->lineno);
- glBegin(GL_LINE_STRIP);
- glVertex2i(x, y);
- glVertex2i(x+x2*st->cwidth+1, y);
- glVertex2i(x+x2*st->cwidth+1, y-st->lheight);
- glVertex2i(x, y-st->lheight);
- glEnd();
- }
+ /* Remove broken markers */
+ if(marker->end>line->len || marker->start>marker->end) {
+ BLI_freelinkN(&text->markers, marker);
+ continue;
+ }
- break;
+ wrap_offset(st, ar, line, marker->start, &offl, &offc);
+ y1 = txt_get_span(top, line) - st->top + offl + topy;
+ x1 = text_get_char_pos(st, line->line, marker->start) - st->left + offc;
+
+ wrap_offset(st, ar, line, marker->end, &offl, &offc);
+ y2 = txt_get_span(top, line) - st->top + offl + topy;
+ x2 = text_get_char_pos(st, line->line, marker->end) - st->left + offc;
+
+ /* invisible part of line (before top, after last visible line) */
+ if(y2 < 0 || y1 > st->top+st->viewlines) continue;
+
+ glColor3ubv(marker->color);
+ x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
+ y= ar->winy-3;
+
+ if(y1==y2) {
+ y -= y1*st->lheight;
+ glBegin(GL_LINE_LOOP);
+ glVertex2i(x+x2*st->cwidth+1, y);
+ glVertex2i(x+x1*st->cwidth-2, y);
+ glVertex2i(x+x1*st->cwidth-2, y-st->lheight);
+ glVertex2i(x+x2*st->cwidth+1, y-st->lheight);
+ glEnd();
+ }
+ else {
+ y -= y1*st->lheight;
+ glBegin(GL_LINE_STRIP);
+ glVertex2i(ar->winx, y);
+ glVertex2i(x+x1*st->cwidth-2, y);
+ glVertex2i(x+x1*st->cwidth-2, y-st->lheight);
+ glVertex2i(ar->winx, y-st->lheight);
+ glEnd();
+ y-=st->lheight;
+
+ for(i=y1+1; i<y2; i++) {
+ glBegin(GL_LINES);
+ glVertex2i(x, y);
+ glVertex2i(ar->winx, y);
+ glVertex2i(x, y-st->lheight);
+ glVertex2i(ar->winx, y-st->lheight);
+ glEnd();
+ y-=st->lheight;
}
- if(line==bottom) break;
+ glBegin(GL_LINE_STRIP);
+ glVertex2i(x, y);
+ glVertex2i(x+x2*st->cwidth+1, y);
+ glVertex2i(x+x2*st->cwidth+1, y-st->lheight);
+ glVertex2i(x, y-st->lheight);
+ glEnd();
}
}
}
@@ -893,7 +1282,7 @@ static void draw_documentation(SpaceText *st, ARegion *ar)
{
TextLine *tmp;
char *docs, buf[DOC_WIDTH+1], *p;
- int len, i, br, lines;
+ int i, br, lines;
int boxw, boxh, l, x, y, top;
if(!st || !st->text) return;
@@ -918,7 +1307,6 @@ static void draw_documentation(SpaceText *st, ARegion *ar)
}
top= y= ar->winy - st->lheight*l - 2;
- len= strlen(docs);
boxw= DOC_WIDTH*st->cwidth + 20;
boxh= (DOC_HEIGHT+1)*st->lheight;
@@ -1033,7 +1421,7 @@ static void draw_suggestion_list(SpaceText *st, ARegion *ar)
UI_ThemeColor(TH_SHADE2);
glRecti(x+16, y-3, x+16+w, y+st->lheight-3);
}
- b=1; /* b=1 colour block, text is default. b=0 no block, colour text */
+ b=1; /* b=1 color block, text is default. b=0 no block, color text */
switch (item->type) {
case 'k': UI_ThemeColor(TH_SYNTAX_B); b=0; break;
case 'm': UI_ThemeColor(TH_TEXT); break;
@@ -1057,17 +1445,18 @@ static void draw_cursor(SpaceText *st, ARegion *ar)
{
Text *text= st->text;
int vcurl, vcurc, vsell, vselc, hidden=0;
- int offl, offc, x, y, w, i;
-
+ int x, y, w, i;
+
/* Draw the selection */
if(text->curl!=text->sell || text->curc!=text->selc) {
+ int offl, offc;
/* Convert all to view space character coordinates */
wrap_offset(st, ar, text->curl, text->curc, &offl, &offc);
vcurl = txt_get_span(text->lines.first, text->curl) - st->top + offl;
- vcurc = get_char_pos(st, text->curl->line, text->curc) - st->left + offc;
+ vcurc = text_get_char_pos(st, text->curl->line, text->curc) - st->left + offc;
wrap_offset(st, ar, text->sell, text->selc, &offl, &offc);
vsell = txt_get_span(text->lines.first, text->sell) - st->top + offl;
- vselc = get_char_pos(st, text->sell->line, text->selc) - st->left + offc;
+ vselc = text_get_char_pos(st, text->sell->line, text->selc) - st->left + offc;
if(vcurc<0) vcurc=0;
if(vselc<0) vselc=0, hidden=1;
@@ -1104,9 +1493,10 @@ static void draw_cursor(SpaceText *st, ARegion *ar)
}
}
else {
+ int offl, offc;
wrap_offset(st, ar, text->sell, text->selc, &offl, &offc);
vsell = txt_get_span(text->lines.first, text->sell) - st->top + offl;
- vselc = get_char_pos(st, text->sell->line, text->selc) - st->left + offc;
+ vselc = text_get_char_pos(st, text->sell->line, text->selc) - st->left + offc;
if(vselc<0) {
vselc= 0;
@@ -1115,17 +1505,30 @@ static void draw_cursor(SpaceText *st, ARegion *ar)
}
if(st->line_hlight) {
- y= ar->winy-2 - vsell*st->lheight;
- if(!(y<0 || y > ar->winy)) { /* check we need to draw */
- int x1= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
- int x2= x1 + ar->winx;
- y= ar->winy-2 - vsell*st->lheight;
-
+ int x1, x2, y1, y2;
+
+ if(st->wordwrap) {
+ int visible_lines = text_get_visible_lines(st, ar, text->sell->line);
+ int offl, offc;
+
+ wrap_offset_in_line(st, ar, text->sell, text->selc, &offl, &offc);
+
+ y1= ar->winy-2 - (vsell-offl)*st->lheight;
+ y2= y1-st->lheight*visible_lines+1;
+ } else {
+ y1= ar->winy-2 - vsell*st->lheight;
+ y2= y1-st->lheight+1;
+ }
+
+ if(!(y1<0 || y2 > ar->winy)) { /* check we need to draw */
+ x1= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
+ x2= x1 + ar->winx;
+
glColor4ub(255, 255, 255, 32);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
- glRecti(x1-4, y, x2, y-st->lheight+1);
+ glRecti(x1-4, y1, x2, y2);
glDisable(GL_BLEND);
}
}
@@ -1138,8 +1541,10 @@ static void draw_cursor(SpaceText *st, ARegion *ar)
if(st->overwrite) {
char ch= text->sell->line[text->selc];
- if(!ch) ch= ' ';
+
w= st->cwidth;
+ if(ch=='\t') w*= st->tabnumber-(vselc+st->left)%st->tabnumber;
+
UI_ThemeColor(TH_HILITE);
glRecti(x, y-st->lheight-1, x+w, y-st->lheight+1);
}
@@ -1243,7 +1648,7 @@ static void draw_brackets(SpaceText *st, ARegion *ar)
/* draw opening bracket */
ch= startl->line[startc];
wrap_offset(st, ar, startl, startc, &offl, &offc);
- viewc= get_char_pos(st, startl->line, startc) - st->left + offc;
+ viewc= text_get_char_pos(st, startl->line, startc) - st->left + offc;
if(viewc >= 0){
viewl= txt_get_span(text->lines.first, startl) - st->top + offl;
@@ -1255,7 +1660,7 @@ static void draw_brackets(SpaceText *st, ARegion *ar)
/* draw closing bracket */
ch= endl->line[endc];
wrap_offset(st, ar, endl, endc, &offl, &offc);
- viewc= get_char_pos(st, endl->line, endc) - st->left + offc;
+ viewc= text_get_char_pos(st, endl->line, endc) - st->left + offc;
if(viewc >= 0) {
viewl= txt_get_span(text->lines.first, endl) - st->top + offl;
@@ -1271,14 +1676,17 @@ void draw_text_main(SpaceText *st, ARegion *ar)
{
Text *text= st->text;
TextLine *tmp;
- rcti scroll;
+ rcti scroll, back;
char linenr[12];
- int i, x, y, winx, linecount= 0;
+ int i, x, y, winx, linecount= 0, lineno= 0;
+ int wraplinecount= 0, wrap_skip= 0;
/* if no text, nothing to do */
if(!text)
return;
+ text_update_drawcache(st, ar);
+
/* make sure all the positional pointers exist */
if(!text->curl || !text->sell || !text->lines.first || !text->lines.last)
txt_clean_text(text);
@@ -1287,16 +1695,32 @@ void draw_text_main(SpaceText *st, ARegion *ar)
else st->viewlines= 0;
/* update rects for scroll */
- calc_text_rcts(st, ar, &scroll); /* scroll will hold the entire bar size */
+ calc_text_rcts(st, ar, &scroll, &back); /* scroll will hold the entire bar size */
/* update syntax formatting if needed */
tmp= text->lines.first;
+ lineno= 0;
for(i= 0; i<st->top && tmp; i++) {
if(st->showsyntax && !tmp->format)
txt_format_line(st, tmp, 0);
- tmp= tmp->next;
- linecount++;
+ if(st->wordwrap) {
+ int lines= text_get_visible_lines_no(st, lineno);
+
+ if (wraplinecount+lines>st->top) {
+ wrap_skip= st->top-wraplinecount;
+ break;
+ } else {
+ wraplinecount+= lines;
+ tmp= tmp->next;
+ linecount++;
+ }
+ } else {
+ tmp= tmp->next;
+ linecount++;
+ }
+
+ lineno++;
}
text_font_begin(st);
@@ -1305,7 +1729,6 @@ void draw_text_main(SpaceText *st, ARegion *ar)
/* draw line numbers background */
if(st->showlinenrs) {
- st->linenrs_tot = (int)floor(log10((float)(linecount + st->viewlines))) + 1;
x= TXT_OFFSET + TEXTXLOC;
UI_ThemeColor(TH_GRID);
@@ -1328,7 +1751,7 @@ void draw_text_main(SpaceText *st, ARegion *ar)
if(st->showsyntax && !tmp->format)
txt_format_line(st, tmp, 0);
- if(st->showlinenrs) {
+ if(st->showlinenrs && !wrap_skip) {
/* draw line number */
if(tmp == text->curl)
UI_ThemeColor(TH_HILITE);
@@ -1344,21 +1767,23 @@ void draw_text_main(SpaceText *st, ARegion *ar)
if(st->wordwrap) {
/* draw word wrapped text */
- int lines = text_draw_wrapped(st, tmp->line, x, y, winx-x, tmp->format);
+ int lines = text_draw_wrapped(st, tmp->line, x, y, winx-x, tmp->format, wrap_skip);
y -= lines*st->lheight;
}
else {
/* draw unwrapped text */
- text_draw(st, tmp->line, st->left, 0, 1, x, y, tmp->format);
+ text_draw(st, tmp->line, st->left, ar->winx/st->cwidth, 1, x, y, tmp->format);
y -= st->lheight;
}
+
+ wrap_skip= 0;
}
/* draw other stuff */
draw_brackets(st, ar);
draw_markers(st, ar);
glTranslatef(0.375f, 0.375f, 0.0f); /* XXX scroll requires exact pixel space */
- draw_textscroll(st, ar, &scroll);
+ draw_textscroll(st, &scroll, &back);
draw_documentation(st, ar);
draw_suggestion_list(st, ar);
@@ -1398,6 +1823,12 @@ void text_update_cursor_moved(bContext *C)
text_update_character_width(st);
i= txt_get_span(text->lines.first, text->sell);
+ if(st->wordwrap) {
+ int offl, offc;
+ wrap_offset(st, CTX_wm_region(C), text->sell, text->selc, &offl, &offc);
+ i+= offl;
+ }
+
if(st->top+st->viewlines <= i || st->top > i)
st->top= i - st->viewlines/2;
diff --git a/source/blender/editors/space_text/text_header.c b/source/blender/editors/space_text/text_header.c
index 672940cf3cb..1287f68dc04 100644
--- a/source/blender/editors/space_text/text_header.c
+++ b/source/blender/editors/space_text/text_header.c
@@ -47,6 +47,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
@@ -57,7 +58,7 @@
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// XXX #include "BPY_menus.h"
#endif
@@ -101,7 +102,7 @@ static int properties_poll(bContext *C)
return (CTX_wm_space_text(C) != NULL);
}
-static int properties_exec(bContext *C, wmOperator *op)
+static int properties_exec(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= text_has_properties_region(sa);
@@ -133,23 +134,23 @@ void TEXT_OT_properties(wmOperatorType *ot)
uiPopupMenu *pup;
if(text) {
- pup= uiPupMenuBegin(C, "Text", 0);
+ pup= uiPupMenuBegin(C, "Text", ICON_NULL);
if(txt_has_sel(text)) {
- uiItemO(layout, NULL, 0, "TEXT_OT_cut");
- uiItemO(layout, NULL, 0, "TEXT_OT_copy");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_cut");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_copy");
}
- uiItemO(layout, NULL, 0, "TEXT_OT_paste");
- uiItemO(layout, NULL, 0, "TEXT_OT_new");
- uiItemO(layout, NULL, 0, "TEXT_OT_open");
- uiItemO(layout, NULL, 0, "TEXT_OT_save");
- uiItemO(layout, NULL, 0, "TEXT_OT_save_as");
- uiItemO(layout, NULL, 0, "TEXT_OT_run_script");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_paste");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_new");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_open");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_save");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_save_as");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_run_script");
uiPupMenuEnd(C, pup);
}
else {
- pup= uiPupMenuBegin(C, "File", 0);
- uiItemO(layout, NULL, 0, "TEXT_OT_new");
- uiItemO(layout, NULL, 0, "TEXT_OT_open");
+ pup= uiPupMenuBegin(C, "File", ICON_NULL);
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_new");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_open");
uiPupMenuEnd(C, pup);
}
}
@@ -159,10 +160,10 @@ void TEXT_OT_properties(wmOperatorType *ot)
uiPopupMenu *pup;
- pup= uiPupMenuBegin(C, "Edit", 0);
- uiItemO(layout, NULL, 0, "TEXT_OT_cut");
- uiItemO(layout, NULL, 0, "TEXT_OT_copy");
- uiItemO(layout, NULL, 0, "TEXT_OT_paste");
+ pup= uiPupMenuBegin(C, "Edit", ICON_NULL);
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_cut");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_copy");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_paste");
uiPupMenuEnd(C, pup);
}
@@ -172,18 +173,18 @@ void TEXT_OT_properties(wmOperatorType *ot)
uiPopupMenu *pup;
if(text) {
- pup= uiPupMenuBegin(C, "Text", 0);
- uiItemO(layout, NULL, 0, "TEXT_OT_new");
- uiItemO(layout, NULL, 0, "TEXT_OT_open");
- uiItemO(layout, NULL, 0, "TEXT_OT_save");
- uiItemO(layout, NULL, 0, "TEXT_OT_save_as");
- uiItemO(layout, NULL, 0, "TEXT_OT_run_script");
+ pup= uiPupMenuBegin(C, "Text", ICON_NULL);
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_new");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_open");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_save");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_save_as");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_run_script");
uiPupMenuEnd(C, pup);
}
else {
- pup= uiPupMenuBegin(C, "File", 0);
- uiItemO(layout, NULL, 0, "TEXT_OT_new");
- uiItemO(layout, NULL, 0, "TEXT_OT_open");
+ pup= uiPupMenuBegin(C, "File", ICON_NULL);
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_new");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_open");
uiPupMenuEnd(C, pup);
}
}
@@ -193,7 +194,7 @@ void TEXT_OT_properties(wmOperatorType *ot)
uiPopupMenu *pup;
- pup= uiPupMenuBegin(C, "Text", 0);
+ pup= uiPupMenuBegin(C, "Text", ICON_NULL);
uiItemEnumO(layout, "TEXT_OT_move", "Top of File", 0, "type", FILE_TOP);
uiItemEnumO(layout, "TEXT_OT_move", "Bottom of File", 0, "type", FILE_BOTTOM);
uiItemEnumO(layout, "TEXT_OT_move", "Page Up", 0, "type", PREV_PAGE);
diff --git a/source/blender/editors/space_text/text_intern.h b/source/blender/editors/space_text/text_intern.h
index a93f30ac62a..5f6b2e05ba7 100644
--- a/source/blender/editors/space_text/text_intern.h
+++ b/source/blender/editors/space_text/text_intern.h
@@ -44,16 +44,10 @@ struct wmWindowManager;
/* text_draw.c */
void draw_text_main(struct SpaceText *st, struct ARegion *ar);
-int text_check_bracket(char ch);
-int text_check_delim(char ch);
-int text_check_digit(char ch);
-int text_check_identifier(char ch);
-int text_check_whitespace(char ch);
-
int text_font_width_character(struct SpaceText *st);
-int text_font_width(struct SpaceText *st, char *str);
+int text_font_width(struct SpaceText *st, const char *str);
-void text_update_line_edited(struct Text *text, struct TextLine *line);
+void text_update_line_edited(struct TextLine *line);
void text_update_edited(struct Text *text);
void text_update_character_width(struct SpaceText *st);
void text_update_cursor_moved(struct bContext *C);
@@ -85,17 +79,25 @@ typedef struct FlattenString {
int pos, len;
} FlattenString;
-int flatten_string(struct SpaceText *st, FlattenString *fs, char *in);
+int flatten_string(struct SpaceText *st, FlattenString *fs, const char *in);
void flatten_string_free(FlattenString *fs);
int wrap_width(struct SpaceText *st, struct ARegion *ar);
void wrap_offset(struct SpaceText *st, struct ARegion *ar, struct TextLine *linein, int cursin, int *offl, int *offc);
+void wrap_offset_in_line(struct SpaceText *st, struct ARegion *ar, struct TextLine *linep, int cursin, int *offl, int *offc);
+int text_get_char_pos(struct SpaceText *st, const char *line, int cur);
+
+void text_drawcache_tag_update(struct SpaceText *st, int full);
+void text_free_caches(struct SpaceText *st);
int text_file_modified(struct Text *text);
int text_do_suggest_select(struct SpaceText *st, struct ARegion *ar);
-void text_pop_suggest_list();
+void text_pop_suggest_list(void);
+int text_get_visible_lines(struct SpaceText *st, struct ARegion *ar, const char *str);
+int text_get_span_wrap(struct SpaceText *st, struct ARegion *ar, struct TextLine *from, struct TextLine *to);
+int text_get_total_lines(struct SpaceText *st, struct ARegion *ar);
/* text_ops.c */
enum { LINE_BEGIN, LINE_END, FILE_TOP, FILE_BOTTOM, PREV_CHAR, NEXT_CHAR,
diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c
index ed70f31f970..bfec734dad6 100644
--- a/source/blender/editors/space_text/text_ops.c
+++ b/source/blender/editors/space_text/text_ops.c
@@ -38,6 +38,8 @@
#include "DNA_userdef_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "PIL_time.h"
#include "BKE_context.h"
@@ -58,7 +60,7 @@
#include "RNA_access.h"
#include "RNA_define.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -66,7 +68,7 @@
/************************ poll ***************************/
-static int text_new_poll(bContext *C)
+static int text_new_poll(bContext *UNUSED(C))
{
return 1;
}
@@ -122,10 +124,9 @@ static int text_region_edit_poll(bContext *C)
return 1;
}
-
/********************** updates *********************/
-void text_update_line_edited(Text *text, TextLine *line)
+void text_update_line_edited(TextLine *line)
{
if(!line)
return;
@@ -142,12 +143,12 @@ void text_update_edited(Text *text)
TextLine *line;
for(line=text->lines.first; line; line=line->next)
- text_update_line_edited(text, line);
+ text_update_line_edited(line);
}
/******************* new operator *********************/
-static int new_exec(bContext *C, wmOperator *op)
+static int new_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceText *st= CTX_wm_space_text(C);
Text *text;
@@ -162,7 +163,9 @@ static int new_exec(bContext *C, wmOperator *op)
if(prop) {
/* when creating new ID blocks, use is already 1, but RNA
* pointer se also increases user, so this compensates it */
- text->id.us--;
+ /* doesnt always seem to happen... (ton) */
+ if(text->id.us>1)
+ text->id.us--;
RNA_id_pointer_create(&text->id, &idptr);
RNA_property_pointer_set(&ptr, prop, idptr);
@@ -171,6 +174,7 @@ static int new_exec(bContext *C, wmOperator *op)
else if(st) {
st->text= text;
st->top= 0;
+ text_drawcache_tag_update(st, 1);
}
WM_event_add_notifier(C, NC_TEXT|NA_ADDED, text);
@@ -203,7 +207,7 @@ static void open_init(bContext *C, wmOperator *op)
uiIDContextProperty(C, &pprop->ptr, &pprop->prop);
}
-static int open_cancel(bContext *C, wmOperator *op)
+static int open_cancel(bContext *UNUSED(C), wmOperator *op)
{
MEM_freeN(op->customdata);
return OPERATOR_CANCELLED;
@@ -220,7 +224,7 @@ static int open_exec(bContext *C, wmOperator *op)
RNA_string_get(op->ptr, "filepath", str);
- text= add_text(str, G.sce);
+ text= add_text(str, G.main->name);
if(!text) {
if(op->customdata) MEM_freeN(op->customdata);
@@ -254,6 +258,7 @@ static int open_exec(bContext *C, wmOperator *op)
text->name = NULL;
}
+ text_drawcache_tag_update(st, 1);
WM_event_add_notifier(C, NC_TEXT|NA_ADDED, text);
MEM_freeN(op->customdata);
@@ -261,10 +266,10 @@ static int open_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int open_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int open_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Text *text= CTX_data_edit_text(C);
- char *path= (text && text->name)? text->name: G.sce;
+ char *path= (text && text->name)? text->name: G.main->name;
if(RNA_property_is_set(op->ptr, "filepath"))
return open_exec(C, op);
@@ -308,13 +313,14 @@ static int reload_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if(text->compiled)
- BPY_free_compiled_text(text);
+ BPY_text_free_code(text);
#endif
text_update_edited(text);
text_update_cursor_moved(C);
+ text_drawcache_tag_update(CTX_wm_space_text(C), 1);
WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
return OPERATOR_FINISHED;
@@ -335,7 +341,13 @@ void TEXT_OT_reload(wmOperatorType *ot)
/******************* delete operator *********************/
-static int unlink_exec(bContext *C, wmOperator *op)
+static int text_unlink_poll(bContext *C)
+{
+ /* it should be possible to unlink texts if they're lib-linked in... */
+ return CTX_data_edit_text(C) != NULL;
+}
+
+static int unlink_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
SpaceText *st= CTX_wm_space_text(C);
@@ -357,6 +369,8 @@ static int unlink_exec(bContext *C, wmOperator *op)
unlink_text(bmain, text);
free_libblock(&bmain->text, text);
+
+ text_drawcache_tag_update(st, 1);
WM_event_add_notifier(C, NC_TEXT|NA_REMOVED, NULL);
return OPERATOR_FINISHED;
@@ -372,7 +386,7 @@ void TEXT_OT_unlink(wmOperatorType *ot)
/* api callbacks */
ot->exec= unlink_exec;
ot->invoke= WM_operator_confirm;
- ot->poll= text_edit_poll;
+ ot->poll= text_unlink_poll;
/* flags */
ot->flag= OPTYPE_UNDO;
@@ -380,7 +394,7 @@ void TEXT_OT_unlink(wmOperatorType *ot)
/******************* make internal operator *********************/
-static int make_internal_exec(bContext *C, wmOperator *op)
+static int make_internal_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
@@ -433,7 +447,7 @@ static void txt_write_file(Text *text, ReportList *reports)
char file[FILE_MAXDIR+FILE_MAXFILE];
BLI_strncpy(file, text->name, FILE_MAXDIR+FILE_MAXFILE);
- BLI_path_abs(file, G.sce);
+ BLI_path_abs(file, G.main->name);
fp= fopen(file, "w");
if(fp==NULL) {
@@ -506,7 +520,7 @@ static int save_as_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Text *text= CTX_data_edit_text(C);
char *str;
@@ -519,7 +533,7 @@ static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event)
else if(text->flags & TXT_ISMEM)
str= text->id.name+2;
else
- str= G.sce;
+ str= G.main->name;
RNA_string_set(op->ptr, "filepath", str);
WM_event_add_fileselect(C, op);
@@ -552,7 +566,9 @@ static int run_script_poll(bContext *C)
static int run_script_exec(bContext *C, wmOperator *op)
{
-#ifdef DISABLE_PYTHON
+#ifndef WITH_PYTHON
+ (void)C; /* unused */
+
BKE_report(op->reports, RPT_ERROR, "Python disabled in this build");
return OPERATOR_CANCELLED;
@@ -560,7 +576,7 @@ static int run_script_exec(bContext *C, wmOperator *op)
Text *text= CTX_data_edit_text(C);
SpaceText *st= CTX_wm_space_text(C);
- if (BPY_run_python_script(C, NULL, text, op->reports))
+ if (BPY_text_exec(C, text, op->reports))
return OPERATOR_FINISHED;
/* Dont report error messages while live editing */
@@ -588,9 +604,9 @@ void TEXT_OT_run_script(wmOperatorType *ot)
/******************* refresh pyconstraints operator *********************/
-static int refresh_pyconstraints_exec(bContext *C, wmOperator *op)
+static int refresh_pyconstraints_exec(bContext *UNUSED(C), wmOperator *UNUSED(op))
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#if 0
Text *text= CTX_data_edit_text(C);
Object *ob;
@@ -622,7 +638,7 @@ static int refresh_pyconstraints_exec(bContext *C, wmOperator *op)
}
if(update) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
}
#endif
@@ -738,6 +754,8 @@ static int paste_exec(bContext *C, wmOperator *op)
if(!buf)
return OPERATOR_CANCELLED;
+ text_drawcache_tag_update(CTX_wm_space_text(C), 0);
+
txt_insert_buf(text, buf);
text_update_edited(text);
@@ -782,7 +800,7 @@ static void txt_copy_clipboard(Text *text)
}
}
-static int copy_exec(bContext *C, wmOperator *op)
+static int copy_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
@@ -809,6 +827,8 @@ static int cut_exec(bContext *C, wmOperator *op)
{
Text *text= CTX_data_edit_text(C);
+ text_drawcache_tag_update(CTX_wm_space_text(C), 0);
+
txt_copy_clipboard(text);
txt_delete_selected(text);
@@ -836,10 +856,12 @@ void TEXT_OT_cut(wmOperatorType *ot)
/******************* indent operator *********************/
-static int indent_exec(bContext *C, wmOperator *op)
+static int indent_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
+ text_drawcache_tag_update(CTX_wm_space_text(C), 0);
+
if(txt_has_sel(text)) {
txt_order_cursors(text);
indent(text);
@@ -869,11 +891,13 @@ void TEXT_OT_indent(wmOperatorType *ot)
/******************* unindent operator *********************/
-static int unindent_exec(bContext *C, wmOperator *op)
+static int unindent_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
if(txt_has_sel(text)) {
+ text_drawcache_tag_update(CTX_wm_space_text(C), 0);
+
txt_order_cursors(text);
unindent(text);
@@ -902,13 +926,15 @@ void TEXT_OT_unindent(wmOperatorType *ot)
/******************* line break operator *********************/
-static int line_break_exec(bContext *C, wmOperator *op)
+static int line_break_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceText *st= CTX_wm_space_text(C);
Text *text= CTX_data_edit_text(C);
int a, curts;
int space = (text->flags & TXT_TABSTOSPACES) ? st->tabnumber : 1;
+ text_drawcache_tag_update(st, 0);
+
// double check tabs/spaces before splitting the line
curts= setcurr_tab_spaces(text, space);
txt_split_curline(text);
@@ -923,8 +949,8 @@ static int line_break_exec(bContext *C, wmOperator *op)
if(text->curl) {
if(text->curl->prev)
- text_update_line_edited(text, text->curl->prev);
- text_update_line_edited(text, text->curl);
+ text_update_line_edited(text->curl->prev);
+ text_update_line_edited(text->curl);
}
text_update_cursor_moved(C);
@@ -947,11 +973,13 @@ void TEXT_OT_line_break(wmOperatorType *ot)
/******************* comment operator *********************/
-static int comment_exec(bContext *C, wmOperator *op)
+static int comment_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
if(txt_has_sel(text)) {
+ text_drawcache_tag_update(CTX_wm_space_text(C), 0);
+
txt_order_cursors(text);
comment(text);
text_update_edited(text);
@@ -978,11 +1006,13 @@ void TEXT_OT_comment(wmOperatorType *ot)
/******************* uncomment operator *********************/
-static int uncomment_exec(bContext *C, wmOperator *op)
+static int uncomment_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
if(txt_has_sel(text)) {
+ text_drawcache_tag_update(CTX_wm_space_text(C), 0);
+
txt_order_cursors(text);
uncomment(text);
text_update_edited(text);
@@ -1130,6 +1160,7 @@ static int convert_whitespace_exec(bContext *C, wmOperator *op)
text_update_edited(text);
text_update_cursor_moved(C);
+ text_drawcache_tag_update(st, 1);
WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
return OPERATOR_FINISHED;
@@ -1152,7 +1183,7 @@ void TEXT_OT_convert_whitespace(wmOperatorType *ot)
/******************* select all operator *********************/
-static int select_all_exec(bContext *C, wmOperator *op)
+static int select_all_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
@@ -1178,7 +1209,7 @@ void TEXT_OT_select_all(wmOperatorType *ot)
/******************* select line operator *********************/
-static int select_line_exec(bContext *C, wmOperator *op)
+static int select_line_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
@@ -1204,7 +1235,7 @@ void TEXT_OT_select_line(wmOperatorType *ot)
/******************* previous marker operator *********************/
-static int previous_marker_exec(bContext *C, wmOperator *op)
+static int previous_marker_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
TextMarker *mrk;
@@ -1240,7 +1271,7 @@ void TEXT_OT_previous_marker(wmOperatorType *ot)
/******************* next marker operator *********************/
-static int next_marker_exec(bContext *C, wmOperator *op)
+static int next_marker_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
TextMarker *mrk;
@@ -1276,7 +1307,7 @@ void TEXT_OT_next_marker(wmOperatorType *ot)
/******************* clear all markers operator *********************/
-static int clear_all_markers_exec(bContext *C, wmOperator *op)
+static int clear_all_markers_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
@@ -1317,146 +1348,370 @@ static EnumPropertyItem move_type_items[]= {
{NEXT_PAGE, "NEXT_PAGE", 0, "Next Page", ""},
{0, NULL, 0, NULL, NULL}};
+/* get cursor position in line by relative wrapped line and column positions */
+static int text_get_cursor_rel(SpaceText* st, ARegion *ar, TextLine *linein, int rell, int relc)
+{
+ int i, j, start, end, max, chop, curs, loop, endj, found, selc;
+ char ch;
+
+ max= wrap_width(st, ar);
+
+ selc= start= endj= curs= found= 0;
+ end= max;
+ chop= loop= 1;
+
+ for(i=0, j=0; loop; j++) {
+ int chars;
+ /* Mimic replacement of tabs */
+ ch= linein->line[j];
+ if(ch=='\t') {
+ chars= st->tabnumber-i%st->tabnumber;
+ ch= ' ';
+ }
+ else chars= 1;
+
+ while(chars--) {
+ if(rell==0 && i-start==relc) {
+ /* current position could be wrapped to next line */
+ /* this should be checked when end of current line would be reached */
+ selc= j;
+ found= 1;
+ }
+ else if(i-end==relc) {
+ curs= j;
+ }
+ if(i-start>=max) {
+ if(found) {
+ /* exact cursor position was found, check if it's */
+ /* still on needed line (hasn't been wrapped) */
+ if(selc>endj && !chop) selc= endj;
+ loop= 0;
+ break;
+ }
+
+ if(chop) endj= j;
+
+ start= end;
+ end += max;
+ chop= 1;
+ rell--;
+
+ if(rell==0 && i-start>=relc) {
+ selc= curs;
+ loop= 0;
+ break;
+ }
+ }
+ else if (ch=='\0') {
+ if(!found) selc= linein->len;
+ loop= 0;
+ break;
+ }
+ else if(ch==' ' || ch=='-') {
+ if(found) {
+ loop= 0;
+ break;
+ }
+
+ if(rell==0 && i-start>=relc) {
+ selc= curs;
+ loop= 0;
+ break;
+ }
+ end= i+1;
+ endj= j;
+ chop= 0;
+ }
+ i++;
+ }
+ }
+
+ return selc;
+}
+
+static int cursor_skip_find_line(SpaceText* st, ARegion *ar,
+ int lines, TextLine **linep, int *charp, int *rell, int *relc)
+{
+ int offl, offc, visible_lines;
+
+ wrap_offset_in_line(st, ar, *linep, *charp, &offl, &offc);
+ *relc= text_get_char_pos(st, (*linep)->line, *charp) + offc;
+ *rell= lines;
+
+ /* handle current line */
+ if(lines>0) {
+ visible_lines= text_get_visible_lines(st, ar, (*linep)->line);
+
+ if(*rell-visible_lines+offl>=0) {
+ if(!(*linep)->next) {
+ if(offl < visible_lines-1) {
+ *rell= visible_lines-1;
+ return 1;
+ }
+
+ *charp= (*linep)->len;
+ return 0;
+ }
+
+ *rell-= visible_lines-offl;
+ *linep=(*linep)->next;
+ } else {
+ *rell+= offl;
+ return 1;
+ }
+ } else {
+ if(*rell+offl<=0) {
+ if(!(*linep)->prev) {
+ if(offl) {
+ *rell= 0;
+ return 1;
+ }
+
+ *charp= 0;
+ return 0;
+ }
+
+ *rell+= offl;
+ *linep=(*linep)->prev;
+ } else {
+ *rell+= offl;
+ return 1;
+ }
+ }
+
+ /* skip lines and find destination line and offsets */
+ while(*linep) {
+ visible_lines= text_get_visible_lines(st, ar, (*linep)->line);
+
+ if(lines<0) { /* moving top */
+ if(*rell+visible_lines >= 0) {
+ *rell+= visible_lines;
+ break;
+ }
+
+ if(!(*linep)->prev) {
+ *rell= 0;
+ break;
+ }
+
+ *rell+= visible_lines;
+ *linep=(*linep)->prev;
+ } else { /* moving bottom */
+ if(*rell-visible_lines < 0) break;
+
+ if(!(*linep)->next) {
+ *rell= visible_lines-1;
+ break;
+ }
+
+ *rell-= visible_lines;
+ *linep=(*linep)->next;
+ }
+ }
+
+ return 1;
+}
+
static void wrap_move_bol(SpaceText *st, ARegion *ar, short sel)
{
Text *text= st->text;
- int offl, offc, lin;
+ TextLine **linep;
+ int *charp;
+ int oldl, oldc, i, j, max, start, end, endj, chop, loop;
+ char ch;
text_update_character_width(st);
- lin= txt_get_span(text->lines.first, text->sell);
- wrap_offset(st, ar, text->sell, text->selc, &offl, &offc);
+ if (sel) linep= &text->sell, charp= &text->selc;
+ else linep= &text->curl, charp= &text->curc;
- if (sel) {
- txt_undo_add_toop(text, UNDO_STO, lin, text->selc, lin, -offc);
- text->selc= -offc;
- } else {
- txt_undo_add_toop(text, UNDO_CTO, lin, text->curc, lin, -offc);
- text->curc= -offc;
- txt_pop_sel(text);
+ oldc= *charp;
+ oldl= txt_get_span(text->lines.first, *linep);
+
+ max= wrap_width(st, ar);
+
+ start= endj= 0;
+ end= max;
+ chop= loop= 1;
+ *charp= 0;
+
+ for(i=0, j=0; loop; j++) {
+ int chars;
+ /* Mimic replacement of tabs */
+ ch= (*linep)->line[j];
+ if(ch=='\t') {
+ chars= st->tabnumber-i%st->tabnumber;
+ ch= ' ';
+ }
+ else chars= 1;
+
+ while(chars--) {
+ if(i-start>=max) {
+ *charp= endj;
+
+ if(j>=oldc) {
+ if(ch=='\0') *charp= start;
+ loop= 0;
+ break;
+ }
+
+ if(chop) endj= j;
+
+ start= end;
+ end += max;
+ chop= 1;
+ }
+ else if(ch==' ' || ch=='-' || ch=='\0') {
+ if(j>=oldc) {
+ *charp= start;
+ loop= 0;
+ break;
+ }
+
+ end= i+1;
+ endj= j+1;
+ chop= 0;
+ }
+ i++;
+ }
}
+
+ if (!sel) txt_pop_sel(text);
+ txt_undo_add_toop(text, sel?UNDO_STO:UNDO_CTO, oldl, oldc, oldl, *charp);
}
static void wrap_move_eol(SpaceText *st, ARegion *ar, short sel)
{
Text *text= st->text;
- int offl, offc, lin, startl, c;
+ TextLine **linep;
+ int *charp;
+ int oldl, oldc, i, j, max, start, end, endj, chop, loop;
+ char ch;
text_update_character_width(st);
- lin= txt_get_span(text->lines.first, text->sell);
- wrap_offset(st, ar, text->sell, text->selc, &offl, &offc);
- startl= offl;
- c= text->selc;
- while (offl==startl && text->sell->line[c]!='\0') {
- c++;
- wrap_offset(st, ar, text->sell, c, &offl, &offc);
- } if (offl!=startl) c--;
-
- if (sel) {
- txt_undo_add_toop(text, UNDO_STO, lin, text->selc, lin, c);
- text->selc= c;
- } else {
- txt_undo_add_toop(text, UNDO_CTO, lin, text->curc, lin, c);
- text->curc= c;
- txt_pop_sel(text);
+ if (sel) linep= &text->sell, charp= &text->selc;
+ else linep= &text->curl, charp= &text->curc;
+
+ oldc= *charp;
+ oldl= txt_get_span(text->lines.first, *linep);
+
+ max= wrap_width(st, ar);
+
+ start= endj= 0;
+ end= max;
+ chop= loop= 1;
+ *charp= 0;
+
+ for(i=0, j=0; loop; j++) {
+ int chars;
+ /* Mimic replacement of tabs */
+ ch= (*linep)->line[j];
+ if(ch=='\t') {
+ chars= st->tabnumber-i%st->tabnumber;
+ ch= ' ';
+ }
+ else chars= 1;
+
+ while(chars--) {
+ if(i-start>=max) {
+ if(chop) endj= j-1;
+
+ if(endj>=oldc) {
+ if(ch=='\0') *charp= (*linep)->len;
+ else *charp= endj;
+ loop= 0;
+ break;
+ }
+
+ start= end;
+ end += max;
+ chop= 1;
+ } else if(ch=='\0') {
+ *charp= (*linep)->len;
+ loop= 0;
+ break;
+ } else if(ch==' ' || ch=='-') {
+ end= i+1;
+ endj= j;
+ chop= 0;
+ }
+ i++;
+ }
}
+
+ if (!sel) txt_pop_sel(text);
+ txt_undo_add_toop(text, sel?UNDO_STO:UNDO_CTO, oldl, oldc, oldl, *charp);
}
static void wrap_move_up(SpaceText *st, ARegion *ar, short sel)
{
Text *text= st->text;
- int offl, offl_1, offc, fromline, toline, c, target;
+ TextLine **linep;
+ int *charp;
+ int oldl, oldc, offl, offc, col, newl;
text_update_character_width(st);
- wrap_offset(st, ar, text->sell, 0, &offl_1, &offc);
- wrap_offset(st, ar, text->sell, text->selc, &offl, &offc);
- fromline= toline= txt_get_span(text->lines.first, text->sell);
- target= text->selc + offc;
+ if (sel) linep= &text->sell, charp= &text->selc;
+ else linep= &text->curl, charp= &text->curc;
- if (offl==offl_1) {
- if (!text->sell->prev) {
- txt_move_bol(text, sel);
- return;
- }
- toline--;
- c= text->sell->prev->len; /* End of prev. line */
- wrap_offset(st, ar, text->sell->prev, c, &offl, &offc);
- c= -offc+target;
+ /* store previous position */
+ oldc= *charp;
+ newl= oldl= txt_get_span(text->lines.first, *linep);
+
+ wrap_offset_in_line(st, ar, *linep, *charp, &offl, &offc);
+ col= text_get_char_pos(st, (*linep)->line, *charp) + offc;
+ if(offl) {
+ *charp= text_get_cursor_rel(st, ar, *linep, offl-1, col);
+ newl= BLI_findindex(&text->lines, linep);
} else {
- c= -offc-1; /* End of prev. line */
- wrap_offset(st, ar, text->sell, c, &offl, &offc);
- c= -offc+target;
- }
- if (c<0) c=0;
-
- if (sel) {
- txt_undo_add_toop(text, UNDO_STO, fromline, text->selc, toline, c);
- if (toline<fromline) text->sell= text->sell->prev;
- if(text->sell) {
- if (c>text->sell->len) c= text->sell->len;
- text->selc= c;
- }
- }
- else if(text->curl) {
- txt_undo_add_toop(text, UNDO_CTO, fromline, text->curc, toline, c);
- if (toline<fromline) text->curl= text->curl->prev;
- if(text->curl) {
- if (c>text->curl->len) c= text->curl->len;
- text->curc= c;
- txt_pop_sel(text);
- }
+ if((*linep)->prev) {
+ int visible_lines;
+
+ *linep= (*linep)->prev;
+ visible_lines= text_get_visible_lines(st, ar, (*linep)->line);
+ *charp= text_get_cursor_rel(st, ar, *linep, visible_lines-1, col);
+ newl--;
+ } else *charp= 0;
}
+
+ if (!sel) txt_pop_sel(text);
+ txt_undo_add_toop(text, sel?UNDO_STO:UNDO_CTO, oldl, oldc, newl, *charp);
}
static void wrap_move_down(SpaceText *st, ARegion *ar, short sel)
{
Text *text= st->text;
- int offl, startoff, offc, fromline, toline, c, target;
+ TextLine **linep;
+ int *charp;
+ int oldl, oldc, offl, offc, col, newl, visible_lines;
text_update_character_width(st);
- wrap_offset(st, ar, text->sell, text->selc, &offl, &offc);
- fromline= toline= txt_get_span(text->lines.first, text->sell);
- target= text->selc + offc;
- startoff= offl;
- c= text->selc;
- while (offl==startoff && text->sell->line[c]!='\0') {
- c++;
- wrap_offset(st, ar, text->sell, c, &offl, &offc);
- }
+ if (sel) linep= &text->sell, charp= &text->selc;
+ else linep= &text->curl, charp= &text->curc;
- if (text->sell->line[c]=='\0') {
- if (!text->sell->next) {
- txt_move_eol(text, sel);
- return;
- }
- toline++;
- c= target;
+ /* store previous position */
+ oldc= *charp;
+ newl= oldl= txt_get_span(text->lines.first, *linep);
+
+ wrap_offset_in_line(st, ar, *linep, *charp, &offl, &offc);
+ col= text_get_char_pos(st, (*linep)->line, *charp) + offc;
+ visible_lines= text_get_visible_lines(st, ar, (*linep)->line);
+ if(offl<visible_lines-1) {
+ *charp= text_get_cursor_rel(st, ar, *linep, offl+1, col);
+ newl= BLI_findindex(&text->lines, linep);
} else {
- c += target;
- if (c > text->sell->len) c= text->sell->len;
- }
- if (c<0) c=0;
-
- if (sel) {
- txt_undo_add_toop(text, UNDO_STO, fromline, text->selc, toline, c);
- if (toline>fromline) text->sell= text->sell->next;
- if(text->sell) {
- if (c>text->sell->len) c= text->sell->len;
- text->selc= c;
- }
- }
- else if(text->curl) {
- txt_undo_add_toop(text, UNDO_CTO, fromline, text->curc, toline, c);
- if (toline>fromline) text->curl= text->curl->next;
- if(text->curl) {
- if (c > text->curl->len) c= text->curl->len;
- text->curc= c;
- txt_pop_sel(text);
- }
+ if((*linep)->next) {
+ *linep= (*linep)->next;
+ *charp= text_get_cursor_rel(st, ar, *linep, 0, col);
+ newl++;
+ } else *charp= (*linep)->len;
}
+
+ if (!sel) txt_pop_sel(text);
+ txt_undo_add_toop(text, sel?UNDO_STO:UNDO_CTO, oldl, oldc, newl, *charp);
}
/* Moves the cursor vertically by the specified number of lines.
@@ -1465,7 +1720,7 @@ static void wrap_move_down(SpaceText *st, ARegion *ar, short sel)
This is to replace screen_skip for PageUp/Down operations.
*/
-static void cursor_skip(Text *text, int lines, int sel)
+static void cursor_skip(SpaceText* st, ARegion *ar, Text *text, int lines, int sel)
{
TextLine **linep;
int oldl, oldc, *charp;
@@ -1475,13 +1730,21 @@ static void cursor_skip(Text *text, int lines, int sel)
oldl= txt_get_span(text->lines.first, *linep);
oldc= *charp;
- while (lines>0 && (*linep)->next) {
- *linep= (*linep)->next;
- lines--;
- }
- while (lines<0 && (*linep)->prev) {
- *linep= (*linep)->prev;
- lines++;
+ if(st && ar && st->wordwrap) {
+ int rell, relc;
+
+ /* find line and offsets inside it needed to set cursor position */
+ if(cursor_skip_find_line(st, ar, lines, linep, charp, &rell, &relc))
+ *charp= text_get_cursor_rel (st, ar, *linep, rell, relc);
+ } else {
+ while (lines>0 && (*linep)->next) {
+ *linep= (*linep)->next;
+ lines--;
+ }
+ while (lines<0 && (*linep)->prev) {
+ *linep= (*linep)->prev;
+ lines++;
+ }
}
if (*charp > (*linep)->len) *charp= (*linep)->len;
@@ -1546,18 +1809,18 @@ static int move_cursor(bContext *C, int type, int select)
break;
case PREV_PAGE:
- if(st) cursor_skip(text, -st->viewlines, select);
- else cursor_skip(text, -10, select);
+ if(st) cursor_skip(st, ar, st->text, -st->viewlines, select);
+ else cursor_skip(NULL, NULL, text, -10, select);
break;
case NEXT_PAGE:
- if(st) cursor_skip(text, st->viewlines, select);
- else cursor_skip(text, 10, select);
+ if(st) cursor_skip(st, ar, st->text, st->viewlines, select);
+ else cursor_skip(NULL, NULL, text, 10, select);
break;
}
text_update_cursor_moved(C);
- WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
+ WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, text);
return OPERATOR_FINISHED;
}
@@ -1629,7 +1892,7 @@ static int jump_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int jump_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int jump_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
return WM_operator_props_dialog_popup(C,op,200,100);
@@ -1665,6 +1928,8 @@ static int delete_exec(bContext *C, wmOperator *op)
Text *text= CTX_data_edit_text(C);
int type= RNA_enum_get(op->ptr, "type");
+ text_drawcache_tag_update(CTX_wm_space_text(C), 0);
+
if(type == DEL_PREV_WORD)
txt_backspace_word(text);
else if(type == DEL_PREV_CHAR)
@@ -1674,7 +1939,7 @@ static int delete_exec(bContext *C, wmOperator *op)
else if(type == DEL_NEXT_CHAR)
txt_delete_char(text);
- text_update_line_edited(text, text->curl);
+ text_update_line_edited(text->curl);
text_update_cursor_moved(C);
WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
@@ -1703,7 +1968,7 @@ void TEXT_OT_delete(wmOperatorType *ot)
/******************* toggle overwrite operator **********************/
-static int toggle_overwrite_exec(bContext *C, wmOperator *op)
+static int toggle_overwrite_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceText *st= CTX_wm_space_text(C);
@@ -1729,39 +1994,53 @@ void TEXT_OT_overwrite_toggle(wmOperatorType *ot)
/******************* scroll operator **********************/
/* Moves the view vertically by the specified number of lines */
-static void screen_skip(SpaceText *st, int lines)
+static void screen_skip(SpaceText *st, ARegion *ar, int lines)
{
int last;
- st->top += lines;
+ st->top += lines;
- last= txt_get_span(st->text->lines.first, st->text->lines.last);
+ last= text_get_total_lines(st, ar);
last= last - (st->viewlines/2);
if(st->top>last) st->top= last;
if(st->top<0) st->top= 0;
}
+/* quick enum for tsc->zone (scroller handles) */
+enum {
+ SCROLLHANDLE_BAR,
+ SCROLLHANDLE_MIN_OUTSIDE,
+ SCROLLHANDLE_MAX_OUTSIDE
+} TextScrollerHandle_Zone;
+
typedef struct TextScroll {
short old[2];
- short hold[2];
short delta[2];
int first;
- int characters;
- int lines;
int scrollbar;
+
+ int zone;
} TextScroll;
+static int text_scroll_poll(bContext *C)
+{
+ /* it should be possible to still scroll linked texts to read them, even if they can't be edited... */
+ return CTX_data_edit_text(C) != NULL;
+}
+
static int scroll_exec(bContext *C, wmOperator *op)
{
SpaceText *st= CTX_wm_space_text(C);
+ ARegion *ar= CTX_wm_region(C);
+
int lines= RNA_int_get(op->ptr, "lines");
if(lines == 0)
return OPERATOR_CANCELLED;
- screen_skip(st, lines*U.wheellinescroll);
+ screen_skip(st, ar, lines*U.wheellinescroll);
ED_area_tag_redraw(CTX_wm_area(C));
@@ -1771,41 +2050,44 @@ static int scroll_exec(bContext *C, wmOperator *op)
static void scroll_apply(bContext *C, wmOperator *op, wmEvent *event)
{
SpaceText *st= CTX_wm_space_text(C);
+ ARegion *ar= CTX_wm_region(C);
TextScroll *tsc= op->customdata;
- short *mval= event->mval;
+ short mval[2]= {event->x, event->y};
+ short txtdelta[2] = {0, 0};
text_update_character_width(st);
if(tsc->first) {
tsc->old[0]= mval[0];
tsc->old[1]= mval[1];
- tsc->hold[0]= mval[0];
- tsc->hold[1]= mval[1];
tsc->first= 0;
}
+ tsc->delta[0]+= mval[0] - tsc->old[0];
+ tsc->delta[1]+= mval[1] - tsc->old[1];
+
if(!tsc->scrollbar) {
- tsc->delta[0]= (tsc->hold[0]-mval[0])/st->cwidth;
- tsc->delta[1]= (mval[1]-tsc->hold[1])/st->lheight;
+ txtdelta[0]= -tsc->delta[0]/st->cwidth;
+ txtdelta[1]= tsc->delta[1]/st->lheight;
+
+ tsc->delta[0]%= st->cwidth;
+ tsc->delta[1]%= st->lheight;
+ }
+ else {
+ txtdelta[1]= -tsc->delta[1]*st->pix_per_line;
+ tsc->delta[1]+= txtdelta[1]/st->pix_per_line;
}
- else
- tsc->delta[1]= (tsc->hold[1]-mval[1])*st->pix_per_line;
-
- if(tsc->delta[0] || tsc->delta[1]) {
- screen_skip(st, tsc->delta[1]);
- tsc->lines += tsc->delta[1];
+ if(txtdelta[0] || txtdelta[1]) {
+ screen_skip(st, ar, txtdelta[1]);
if(st->wordwrap) {
st->left= 0;
}
else {
- st->left+= tsc->delta[0];
+ st->left+= txtdelta[0];
if(st->left<0) st->left= 0;
}
-
- tsc->hold[0]= mval[0];
- tsc->hold[1]= mval[1];
ED_area_tag_redraw(CTX_wm_area(C));
}
@@ -1824,13 +2106,30 @@ static void scroll_exit(bContext *C, wmOperator *op)
static int scroll_modal(bContext *C, wmOperator *op, wmEvent *event)
{
+ TextScroll *tsc= op->customdata;
+ SpaceText *st= CTX_wm_space_text(C);
+ ARegion *ar= CTX_wm_region(C);
+
switch(event->type) {
case MOUSEMOVE:
- scroll_apply(C, op, event);
+ if(tsc->zone == SCROLLHANDLE_BAR)
+ scroll_apply(C, op, event);
break;
case LEFTMOUSE:
case RIGHTMOUSE:
case MIDDLEMOUSE:
+ if(ELEM(tsc->zone, SCROLLHANDLE_MIN_OUTSIDE, SCROLLHANDLE_MAX_OUTSIDE)) {
+ int last;
+
+ st->top+= st->viewlines * (tsc->zone==SCROLLHANDLE_MIN_OUTSIDE ? 1 : -1);
+
+ last= text_get_total_lines(st, ar);
+ last= last - (st->viewlines/2);
+
+ CLAMP(st->top, 0, last);
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+ }
scroll_exit(C, op);
return OPERATOR_FINISHED;
}
@@ -1855,6 +2154,7 @@ static int scroll_invoke(bContext *C, wmOperator *op, wmEvent *event)
tsc= MEM_callocN(sizeof(TextScroll), "TextScroll");
tsc->first= 1;
+ tsc->zone= SCROLLHANDLE_BAR;
op->customdata= tsc;
st->flags|= ST_SCROLL_SELECT;
@@ -1862,11 +2162,11 @@ static int scroll_invoke(bContext *C, wmOperator *op, wmEvent *event)
if (event->type == MOUSEPAN) {
text_update_character_width(st);
- tsc->hold[0] = event->prevx;
- tsc->hold[1] = event->prevy;
+ tsc->old[0] = event->x;
+ tsc->old[1] = event->x;
/* Sensitivity of scroll set to 4pix per line/char */
- event->mval[0] = event->prevx + (event->x - event->prevx)*st->cwidth/4;
- event->mval[1] = event->prevy + (event->y - event->prevy)*st->lheight/4;
+ tsc->delta[0] = (event->x - event->prevx)*st->cwidth/4;
+ tsc->delta[1] = (event->y - event->prevy)*st->lheight/4;
tsc->first = 0;
tsc->scrollbar = 0;
scroll_apply(C, op, event);
@@ -1894,10 +2194,10 @@ void TEXT_OT_scroll(wmOperatorType *ot)
ot->invoke= scroll_invoke;
ot->modal= scroll_modal;
ot->cancel= scroll_cancel;
- ot->poll= text_space_edit_poll;
+ ot->poll= text_scroll_poll;
/* flags */
- ot->flag= OPTYPE_BLOCKING;
+ ot->flag= OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER;
/* properties */
RNA_def_int(ot->srna, "lines", 1, INT_MIN, INT_MAX, "Lines", "Number of lines to scroll.", -100, 100);
@@ -1905,24 +2205,54 @@ void TEXT_OT_scroll(wmOperatorType *ot)
/******************** scroll bar operator *******************/
+static int text_region_scroll_poll(bContext *C)
+{
+ /* same as text_region_edit_poll except it works on libdata too */
+ SpaceText *st= CTX_wm_space_text(C);
+ Text *text= CTX_data_edit_text(C);
+ ARegion *ar= CTX_wm_region(C);
+
+ if(!st || !text)
+ return 0;
+
+ if(!ar || ar->regiontype != RGN_TYPE_WINDOW)
+ return 0;
+
+ return 1;
+}
+
static int scroll_bar_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
SpaceText *st= CTX_wm_space_text(C);
ARegion *ar= CTX_wm_region(C);
TextScroll *tsc;
short *mval= event->mval;
+ int zone= -1;
if(RNA_property_is_set(op->ptr, "lines"))
return scroll_exec(C, op);
/* verify we are in the right zone */
- if(!(mval[0]>ar->winx-TXT_SCROLL_WIDTH && mval[0]<ar->winx-TXT_SCROLL_SPACE
- && mval[1]>TXT_SCROLL_SPACE && mval[1]<ar->winy))
+ if(mval[0]>st->txtbar.xmin && mval[0]<st->txtbar.xmax) {
+ if(mval[1]>=st->txtbar.ymin && mval[1]<=st->txtbar.ymax) {
+ /* mouse inside scroll handle */
+ zone = SCROLLHANDLE_BAR;
+ }
+ else if(mval[1]>TXT_SCROLL_SPACE && mval[1]<ar->winy-TXT_SCROLL_SPACE) {
+ if(mval[1]<st->txtbar.ymin) zone= SCROLLHANDLE_MIN_OUTSIDE;
+ else zone= SCROLLHANDLE_MAX_OUTSIDE;
+ }
+ }
+
+ if(zone == -1) {
+ /* we are outside slider - nothing to do */
return OPERATOR_PASS_THROUGH;
+ }
tsc= MEM_callocN(sizeof(TextScroll), "TextScroll");
tsc->first= 1;
tsc->scrollbar= 1;
+ tsc->zone= zone;
op->customdata= tsc;
st->flags|= ST_SCROLL_SELECT;
@@ -1946,7 +2276,7 @@ void TEXT_OT_scroll_bar(wmOperatorType *ot)
ot->invoke= scroll_bar_invoke;
ot->modal= scroll_modal;
ot->cancel= scroll_cancel;
- ot->poll= text_region_edit_poll;
+ ot->poll= text_region_scroll_poll;
/* flags */
ot->flag= OPTYPE_BLOCKING;
@@ -1976,7 +2306,7 @@ static void set_cursor_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel)
if(sel) { linep= &text->sell; charp= &text->selc; }
else { linep= &text->curl; charp= &text->curc; }
- y= (ar->winy - y)/st->lheight;
+ y= (ar->winy - 2 - y)/st->lheight;
if(st->showlinenrs)
x-= TXT_OFFSET+TEXTXLOC;
@@ -1987,24 +2317,36 @@ static void set_cursor_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel)
x = (x/st->cwidth) + st->left;
if(st->wordwrap) {
- int i, j, endj, curs, max, chop, start, end, chars, loop;
+ int i, j, endj, curs, max, chop, start, end, loop, found;
char ch;
/* Point to first visible line */
*linep= text->lines.first;
- for(i=0; i<st->top && (*linep)->next; i++) *linep= (*linep)->next;
+ i= st->top;
+ while(i>0 && *linep) {
+ int lines= text_get_visible_lines(st, ar, (*linep)->line);
+
+ if (i-lines<0) {
+ y+= i;
+ break;
+ } else {
+ *linep= (*linep)->next;
+ i-= lines;
+ }
+ }
max= wrap_width(st, ar);
loop= 1;
+ found= 0;
while(loop && *linep) {
start= 0;
end= max;
chop= 1;
- chars= 0;
curs= 0;
endj= 0;
for(i=0, j=0; loop; j++) {
+ int chars;
/* Mimic replacement of tabs */
ch= (*linep)->line[j];
@@ -2021,22 +2363,34 @@ static void set_cursor_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel)
*charp= endj;
loop= 0;
break;
- /* Exactly at the cursor, done */
+ /* Exactly at the cursor */
}
else if(y==0 && i-start==x) {
+ /* current position could be wrapped to next line */
+ /* this should be checked when end of current line would be reached */
*charp= curs= j;
- loop= 0;
- break;
+ found= 1;
/* Prepare curs for next wrap */
}
else if(i-end==x) {
curs= j;
}
if(i-start>=max) {
+ if(found) {
+ /* exact cursor position was found, check if it's */
+ /* still on needed line (hasn't been wrapped) */
+ if(*charp>endj && !chop && ch!='\0') (*charp)= endj;
+ loop= 0;
+ break;
+ }
+
if(chop) endj= j;
- y--;
start= end;
end += max;
+
+ if(j<(*linep)->len)
+ y--;
+
chop= 1;
if(y==0 && i-start>=x) {
*charp= curs;
@@ -2045,6 +2399,11 @@ static void set_cursor_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel)
}
}
else if(ch==' ' || ch=='-' || ch=='\0') {
+ if(found) {
+ loop= 0;
+ break;
+ }
+
if(y==0 && i-start>=x) {
*charp= curs;
loop= 0;
@@ -2058,13 +2417,13 @@ static void set_cursor_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel)
}
if(ch=='\0') break;
}
- if(!loop || y<0) break;
+ if(!loop || found) break;
if(!(*linep)->next) {
*charp= (*linep)->len;
break;
}
-
+
/* On correct line but didn't meet cursor, must be at end */
if(y==0) {
*charp= (*linep)->len;
@@ -2102,7 +2461,7 @@ static void set_cursor_apply(bContext *C, wmOperator *op, wmEvent *event)
if(event->mval[1]<0 || event->mval[1]>ar->winy) {
int d= (scu->old[1]-event->mval[1])*st->pix_per_line;
- if(d) screen_skip(st, d);
+ if(d) screen_skip(st, ar, d);
set_cursor_to_pos(st, ar, event->mval[0], event->mval[1]<0?0:ar->winy, 1);
@@ -2234,7 +2593,7 @@ void TEXT_OT_cursor_set(wmOperatorType *ot)
/******************* line number operator **********************/
-static int line_number_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int line_number_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
SpaceText *st= CTX_wm_space_text(C);
Text *text= CTX_data_edit_text(C);
@@ -2244,10 +2603,12 @@ static int line_number_invoke(bContext *C, wmOperator *op, wmEvent *event)
static int jump_to= 0;
static double last_jump= 0;
+ text_update_character_width(st);
+
if(!st->showlinenrs)
return OPERATOR_PASS_THROUGH;
- if(!(mval[0]>2 && mval[0]<60 && mval[1]>2 && mval[1]<ar->winy-2))
+ if(!(mval[0]>2 && mval[0]<(TXT_OFFSET + TEXTXLOC) && mval[1]>2 && mval[1]<ar->winy-2))
return OPERATOR_PASS_THROUGH;
if(!(event->ascii>='0' && event->ascii<='9'))
@@ -2290,6 +2651,8 @@ static int insert_exec(bContext *C, wmOperator *op)
char *str;
int done = 0, i;
+ text_drawcache_tag_update(st, 0);
+
str= RNA_string_get_alloc(op->ptr, "text", NULL, 0);
if(st && st->overwrite) {
@@ -2307,7 +2670,7 @@ static int insert_exec(bContext *C, wmOperator *op)
if(!done)
return OPERATOR_CANCELLED;
- text_update_line_edited(text, text->curl);
+ text_update_line_edited(text->curl);
text_update_cursor_moved(C);
WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
@@ -2317,18 +2680,22 @@ static int insert_exec(bContext *C, wmOperator *op)
static int insert_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- char str[2];
int ret;
- /* XXX old code from winqreadtextspace, is it still needed somewhere? */
- /* smartass code to prevent the CTRL/ALT events below from not working! */
- /*if(qual & (LR_ALTKEY|LR_CTRLKEY))
- if(!ispunct(ascii))
- ascii= 0;*/
- str[0]= event->ascii;
- str[1]= '\0';
+ // if(!RNA_property_is_set(op->ptr, "text")) { /* always set from keymap XXX */
+ if(!RNA_string_length(op->ptr, "text")) {
+ /* if alt/ctrl/super are pressed pass through */
+ if(event->ctrl || event->oskey) {
+ return OPERATOR_PASS_THROUGH;
+ }
+ else {
+ char str[2];
+ str[0]= event->ascii;
+ str[1]= '\0';
+ RNA_string_set(op->ptr, "text", str);
+ }
+ }
- RNA_string_set(op->ptr, "text", str);
ret = insert_exec(C, op);
/* run the script while editing, evil but useful */
@@ -2396,9 +2763,10 @@ static int find_and_replace(bContext *C, wmOperator *op, short mode)
}
text_update_cursor_moved(C);
WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
+ text_drawcache_tag_update(CTX_wm_space_text(C), 1);
}
else if(mode==TEXT_MARK_ALL) {
- char color[4];
+ unsigned char color[4];
UI_GetThemeColor4ubv(TH_SHADE2, color);
if(txt_find_marker(text, text->curl, text->selc, TMARK_GRP_FINDALL, 0)) {
@@ -2529,7 +2897,7 @@ void TEXT_OT_find_set_selected(wmOperatorType *ot)
/******************* replace set selected *********************/
-static int replace_set_selected_exec(bContext *C, wmOperator *op)
+static int replace_set_selected_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceText *st= CTX_wm_space_text(C);
Text *text= CTX_data_edit_text(C);
@@ -2579,7 +2947,7 @@ int text_file_modified(Text *text)
return 0;
BLI_strncpy(file, text->name, FILE_MAXDIR+FILE_MAXFILE);
- BLI_path_abs(file, G.sce);
+ BLI_path_abs(file, G.main->name);
if(!BLI_exists(file))
return 2;
@@ -2607,7 +2975,7 @@ static void text_ignore_modified(Text *text)
if(!text || !text->name) return;
BLI_strncpy(file, text->name, FILE_MAXDIR+FILE_MAXFILE);
- BLI_path_abs(file, G.sce);
+ BLI_path_abs(file, G.main->name);
if(!BLI_exists(file)) return;
@@ -2639,7 +3007,7 @@ static int resolve_conflict_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Text *text= CTX_data_edit_text(C);
uiPopupMenu *pup;
@@ -2649,7 +3017,7 @@ static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *event)
case 1:
if(text->flags & TXT_ISDIRTY) {
/* modified locally and externally, ahhh. offer more possibilites. */
- pup= uiPupMenuBegin(C, "File Modified Outside and Inside Blender", 0);
+ pup= uiPupMenuBegin(C, "File Modified Outside and Inside Blender", ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemEnumO(layout, op->type->idname, "Reload from disk (ignore local changes)", 0, "resolution", RESOLVE_RELOAD);
uiItemEnumO(layout, op->type->idname, "Save to disk (ignore outside changes)", 0, "resolution", RESOLVE_SAVE);
@@ -2657,7 +3025,7 @@ static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *event)
uiPupMenuEnd(C, pup);
}
else {
- pup= uiPupMenuBegin(C, "File Modified Outside Blender", 0);
+ pup= uiPupMenuBegin(C, "File Modified Outside Blender", ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemEnumO(layout, op->type->idname, "Reload from disk", 0, "resolution", RESOLVE_RELOAD);
uiItemEnumO(layout, op->type->idname, "Make text internal (separate copy)", 0, "resolution", RESOLVE_MAKE_INTERNAL);
@@ -2666,7 +3034,7 @@ static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
break;
case 2:
- pup= uiPupMenuBegin(C, "File Deleted Outside Blender", 0);
+ pup= uiPupMenuBegin(C, "File Deleted Outside Blender", ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemEnumO(layout, op->type->idname, "Make text internal", 0, "resolution", RESOLVE_MAKE_INTERNAL);
uiItemEnumO(layout, op->type->idname, "Recreate file", 0, "resolution", RESOLVE_SAVE);
@@ -2741,6 +3109,7 @@ void ED_text_undo_step(bContext *C, int step)
text_update_edited(text);
text_update_cursor_moved(C);
+ text_drawcache_tag_update(CTX_wm_space_text(C), 1);
WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
}
diff --git a/source/blender/editors/space_text/text_python.c b/source/blender/editors/space_text/text_python.c
index aee1a7ecfd6..1c75e6f65ca 100644
--- a/source/blender/editors/space_text/text_python.c
+++ b/source/blender/editors/space_text/text_python.c
@@ -182,7 +182,7 @@ static void confirm_suggestion(Text *text, int skipleft)
#define LR_SHIFTKEY 0
#define LR_ALTKEY 0
#define LR_CTRLKEY 0
-#define LR_COMMANDKEY 0
+#define LR_OSKEY 0
// XXX
static int doc_scroll= 0;
@@ -204,7 +204,7 @@ short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val)
if(tools & TOOL_SUGG_LIST) {
if((ascii != '_' && ascii != '*' && ispunct(ascii)) || text_check_whitespace(ascii)) {
confirm_suggestion(st->text, 0);
- text_update_line_edited(st->text, st->text->curl);
+ text_update_line_edited(st->text->curl);
}
else if((st->overwrite && txt_replace_char(st->text, ascii)) || txt_add_char(st->text, ascii)) {
get_suggest_prefix(st->text, 0);
@@ -230,7 +230,7 @@ short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val)
case MIDDLEMOUSE:
if(text_do_suggest_select(st, ar)) {
confirm_suggestion(st->text, 0);
- text_update_line_edited(st->text, st->text->curl);
+ text_update_line_edited(st->text->curl);
swallow= 1;
}
else {
@@ -248,7 +248,7 @@ short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val)
case RETKEY:
if(tools & TOOL_SUGG_LIST) {
confirm_suggestion(st->text, 0);
- text_update_line_edited(st->text, st->text->curl);
+ text_update_line_edited(st->text->curl);
swallow= 1;
draw= 1;
}
@@ -358,7 +358,7 @@ short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val)
}
#if 0
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* Run text plugin scripts if enabled */
if(st->doplugins && event && val) {
if(BPY_menu_do_shortcut(PYMENU_TEXTPLUGIN, event, qual)) {
@@ -388,7 +388,7 @@ short do_textmarkers(SpaceText *st, char ascii, unsigned short evnt, short val)
/* Find the next temporary marker */
if(evnt==TABKEY) {
int lineno= txt_get_span(text->lines.first, text->curl);
- TextMarker *mrk= text->markers.first;
+ mrk= text->markers.first;
while(mrk) {
if(!marker && (mrk->flags & TMARK_TEMP)) marker= mrk;
if((mrk->flags & TMARK_TEMP) && (mrk->lineno > lineno || (mrk->lineno==lineno && mrk->end > text->curc))) {
@@ -430,11 +430,11 @@ short do_textmarkers(SpaceText *st, char ascii, unsigned short evnt, short val)
if(s!=c) txt_move_to(text, mrk->lineno, mrk->start+s, 1);
if(st->overwrite) {
if(txt_replace_char(text, ascii))
- text_update_line_edited(st->text, st->text->curl);
+ text_update_line_edited(st->text->curl);
}
else {
if(txt_add_char(text, ascii)) {
- text_update_line_edited(st->text, st->text->curl);
+ text_update_line_edited(st->text->curl);
}
}
@@ -459,7 +459,7 @@ short do_textmarkers(SpaceText *st, char ascii, unsigned short evnt, short val)
txt_move_to(text, mrk->lineno, mrk->start+c, 0);
if(s!=c) txt_move_to(text, mrk->lineno, mrk->start+s, 1);
txt_backspace_char(text);
- text_update_line_edited(st->text, st->text->curl);
+ text_update_line_edited(st->text->curl);
if(mrk==marker || mrk==nxt) break;
mrk= nxt;
}
@@ -479,7 +479,7 @@ short do_textmarkers(SpaceText *st, char ascii, unsigned short evnt, short val)
txt_move_to(text, mrk->lineno, mrk->start+c, 0);
if(s!=c) txt_move_to(text, mrk->lineno, mrk->start+s, 1);
txt_delete_char(text);
- text_update_line_edited(st->text, st->text->curl);
+ text_update_line_edited(st->text->curl);
if(mrk==marker || mrk==nxt) break;
mrk= nxt;
}
diff --git a/source/blender/editors/space_time/CMakeLists.txt b/source/blender/editors/space_time/CMakeLists.txt
index 4da42ec1f42..d3f0fccd19a 100644
--- a/source/blender/editors/space_time/CMakeLists.txt
+++ b/source/blender/editors/space_time/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -31,4 +29,11 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_space_time "${SRC}" "${INC}")
+set(SRC
+ space_time.c
+ time_ops.c
+
+ time_intern.h
+)
+
+blender_add_lib(bf_editor_space_time "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_time/Makefile b/source/blender/editors/space_time/Makefile
deleted file mode 100644
index 958c3018f82..00000000000
--- a/source/blender/editors/space_time/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_time
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c
index de9c063f069..f05cb860d6f 100644
--- a/source/blender/editors/space_time/space_time.c
+++ b/source/blender/editors/space_time/space_time.c
@@ -36,6 +36,7 @@
#include "BLI_blenlib.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -61,11 +62,8 @@
/* ************************ main time area region *********************** */
-static void time_draw_sfra_efra(const bContext *C, SpaceTime *stime, ARegion *ar)
-{
- View2D *v2d= UI_view2d_fromcontext(C);
- Scene *scene= CTX_data_scene(C);
-
+static void time_draw_sfra_efra(Scene *scene, View2D *v2d)
+{
/* draw darkened area outside of active timeline
* frame range used is preview range or scene range */
UI_ThemeColorShade(TH_BACK, -25);
@@ -86,25 +84,84 @@ static void time_draw_sfra_efra(const bContext *C, SpaceTime *stime, ARegion *ar
#define CACHE_DRAW_HEIGHT 3.0f
-static void time_draw_cache(const bContext *C, SpaceTime *stime, ARegion *ar)
+static void time_draw_cache(SpaceTime *stime, Object *ob)
{
- SpaceTimeCache *stc;
+ PTCacheID *pid;
+ ListBase pidlist;
+ SpaceTimeCache *stc = stime->caches.first;
float yoffs=0.f;
- if (!(stime->cache_display & TIME_CACHE_DISPLAY))
+ if (!(stime->cache_display & TIME_CACHE_DISPLAY) || (!ob))
return;
-
- for (stc= stime->caches.first; stc; stc=stc->next) {
- float col[4];
-
- if (!stc->array || !stc->ok)
+
+ BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0);
+
+ /* iterate over pointcaches on the active object,
+ * add spacetimecache and vertex array for each */
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ float col[4], *fp;
+ int i, sta = pid->cache->startframe, end = pid->cache->endframe;
+ int len = (end - sta + 1)*4;
+
+ switch(pid->type) {
+ case PTCACHE_TYPE_SOFTBODY:
+ if (!(stime->cache_display & TIME_CACHE_SOFTBODY)) continue;
+ break;
+ case PTCACHE_TYPE_PARTICLES:
+ if (!(stime->cache_display & TIME_CACHE_PARTICLES)) continue;
+ break;
+ case PTCACHE_TYPE_CLOTH:
+ if (!(stime->cache_display & TIME_CACHE_CLOTH)) continue;
+ break;
+ case PTCACHE_TYPE_SMOKE_DOMAIN:
+ case PTCACHE_TYPE_SMOKE_HIGHRES:
+ if (!(stime->cache_display & TIME_CACHE_SMOKE)) continue;
+ break;
+ }
+
+ if(pid->cache->cached_frames == NULL)
continue;
+
+
+ /* make sure we have stc with correct array length */
+ if(stc == NULL || MEM_allocN_len(stc->array) != len*2*sizeof(float)) {
+ if(stc) {
+ MEM_freeN(stc->array);
+ }
+ else {
+ stc = MEM_callocN(sizeof(SpaceTimeCache), "spacetimecache");
+ BLI_addtail(&stime->caches, stc);
+ }
+
+ stc->array = MEM_callocN(len*2*sizeof(float), "SpaceTimeCache array");
+ }
+
+ /* fill the vertex array with a quad for each cached frame */
+ for (i=sta, fp=stc->array; i<=end; i++) {
+ if (pid->cache->cached_frames[i-sta]) {
+ fp[0] = (float)i-0.5f;
+ fp[1] = 0.0;
+ fp+=2;
+
+ fp[0] = (float)i-0.5f;
+ fp[1] = 1.0;
+ fp+=2;
+
+ fp[0] = (float)i+0.5f;
+ fp[1] = 1.0;
+ fp+=2;
+
+ fp[0] = (float)i+0.5f;
+ fp[1] = 0.0;
+ fp+=2;
+ }
+ }
glPushMatrix();
glTranslatef(0.0, (float)V2D_SCROLL_HEIGHT+yoffs, 0.0);
glScalef(1.0, CACHE_DRAW_HEIGHT, 0.0);
- switch(stc->type) {
+ switch(pid->type) {
case PTCACHE_TYPE_SOFTBODY:
col[0] = 1.0; col[1] = 0.4; col[2] = 0.02;
col[3] = 0.1;
@@ -127,17 +184,17 @@ static void time_draw_cache(const bContext *C, SpaceTime *stime, ARegion *ar)
glEnable(GL_BLEND);
- glRectf((float)stc->startframe, 0.0, (float)stc->endframe, 1.0);
+ glRectf((float)sta, 0.0, (float)end, 1.0);
col[3] = 0.4;
- if (stc->flag & PTCACHE_BAKED) {
+ if (pid->cache->flag & PTCACHE_BAKED) {
col[0] -= 0.4; col[1] -= 0.4; col[2] -= 0.4;
}
glColor4fv(col);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, stc->array);
- glDrawArrays(GL_QUADS, 0, stc->len);
+ glDrawArrays(GL_QUADS, 0, (fp-stc->array)/2);
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_BLEND);
@@ -145,6 +202,19 @@ static void time_draw_cache(const bContext *C, SpaceTime *stime, ARegion *ar)
glPopMatrix();
yoffs += CACHE_DRAW_HEIGHT;
+
+ stc = stc->next;
+ }
+
+ BLI_freelistN(&pidlist);
+
+ /* free excessive caches */
+ while(stc) {
+ SpaceTimeCache *tmp = stc->next;
+ BLI_remlink(&stime->caches, stc);
+ MEM_freeN(stc->array);
+ MEM_freeN(stc);
+ stc = tmp;
}
}
@@ -162,94 +232,10 @@ static void time_cache_free(SpaceTime *stime)
BLI_freelistN(&stime->caches);
}
-static void time_cache_refresh(const bContext *C, SpaceTime *stime, ARegion *ar)
+static void time_cache_refresh(SpaceTime *stime)
{
- Object *ob = CTX_data_active_object(C);
- PTCacheID *pid;
- ListBase pidlist;
-
+ /* Free previous caches to indicate full refresh */
time_cache_free(stime);
-
- if (!(stime->cache_display & TIME_CACHE_DISPLAY) || (!ob))
- return;
-
- BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0);
-
- /* iterate over pointcaches on the active object,
- * add spacetimecache and vertex array for each */
- for(pid=pidlist.first; pid; pid=pid->next) {
- SpaceTimeCache *stc;
- float *fp, *array;
- int i, len;
-
- switch(pid->type) {
- case PTCACHE_TYPE_SOFTBODY:
- if (!(stime->cache_display & TIME_CACHE_SOFTBODY)) continue;
- break;
- case PTCACHE_TYPE_PARTICLES:
- if (!(stime->cache_display & TIME_CACHE_PARTICLES)) continue;
- break;
- case PTCACHE_TYPE_CLOTH:
- if (!(stime->cache_display & TIME_CACHE_CLOTH)) continue;
- break;
- case PTCACHE_TYPE_SMOKE_DOMAIN:
- case PTCACHE_TYPE_SMOKE_HIGHRES:
- if (!(stime->cache_display & TIME_CACHE_SMOKE)) continue;
- break;
- }
-
- stc= MEM_callocN(sizeof(SpaceTimeCache), "spacetimecache");
-
- stc->type = pid->type;
-
- if (pid->cache->flag & PTCACHE_BAKED)
- stc->flag |= PTCACHE_BAKED;
- if (pid->cache->flag & PTCACHE_DISK_CACHE)
- stc->flag |= PTCACHE_DISK_CACHE;
-
- /* first allocate with maximum number of frames needed */
- BKE_ptcache_id_time(pid, CTX_data_scene(C), 0, &stc->startframe, &stc->endframe, NULL);
- len = (stc->endframe - stc->startframe + 1)*4;
- fp = array = MEM_callocN(len*2*sizeof(float), "temporary timeline cache array");
-
- /* fill the vertex array with a quad for each cached frame */
- for (i=stc->startframe; i<=stc->endframe; i++) {
-
- if (BKE_ptcache_id_exist(pid, i)) {
- fp[0] = (float)i;
- fp[1] = 0.0;
- fp+=2;
-
- fp[0] = (float)i;
- fp[1] = 1.0;
- fp+=2;
-
- fp[0] = (float)(i+1);
- fp[1] = 1.0;
- fp+=2;
-
- fp[0] = (float)(i+1);
- fp[1] = 0.0;
- fp+=2;
- }
- }
- /* update with final number of frames */
- stc->len = (i-stc->startframe)*4;
- stc->array = MEM_mallocN(stc->len*2*sizeof(float), "SpaceTimeCache array");
- memcpy(stc->array, array, stc->len*2*sizeof(float));
-
- MEM_freeN(array);
- array = NULL;
-
- stc->ok = 1;
-
- BLI_addtail(&stime->caches, stc);
- }
-
- /* todo: sort time->caches list for consistent order */
- // ...
-
- BLI_freelistN(&pidlist);
}
/* helper function - find actkeycolumn that occurs on cframe, or the nearest one if not found */
@@ -277,7 +263,7 @@ static ActKeyColumn *time_cfra_find_ak (ActKeyColumn *ak, float cframe)
/* helper for time_draw_keyframes() */
static void time_draw_idblock_keyframes(View2D *v2d, ID *id, short onlysel)
{
- bDopeSheet ads;
+ bDopeSheet ads= {0};
DLRBT_Tree keys;
ActKeyColumn *ak;
@@ -286,7 +272,6 @@ static void time_draw_idblock_keyframes(View2D *v2d, ID *id, short onlysel)
/* init dopesheet settings */
// FIXME: the ob_to_keylist function currently doesn't take this into account...
- memset(&ads, 0, sizeof(bDopeSheet));
if (onlysel)
ads.filterflag |= ADS_FILTER_ONLYSEL;
@@ -374,7 +359,7 @@ static void time_draw_keyframes(const bContext *C, SpaceTime *stime, ARegion *ar
/* ---------------- */
-static void time_refresh(const bContext *C, ScrArea *sa)
+static void time_refresh(const bContext *UNUSED(C), ScrArea *sa)
{
SpaceTime *stime = (SpaceTime *)sa->spacedata.first;
ARegion *ar;
@@ -382,7 +367,7 @@ static void time_refresh(const bContext *C, ScrArea *sa)
/* find the main timeline region and refresh cache display*/
for (ar= sa->regionbase.first; ar; ar= ar->next) {
if (ar->regiontype==RGN_TYPE_WINDOW) {
- time_cache_refresh(C, stime, ar);
+ time_cache_refresh(stime);
break;
}
}
@@ -398,13 +383,15 @@ static void time_listener(ScrArea *sa, wmNotifier *wmn)
switch (wmn->data) {
case ND_BONE_ACTIVE:
case ND_POINTCACHE:
+ case ND_MODIFIER:
+ case ND_PARTICLE:
ED_area_tag_refresh(sa);
ED_area_tag_redraw(sa);
break;
}
break;
case NC_SCENE:
- switch (wmn->data) {
+ switch (wmn->data) {
case ND_OB_ACTIVE:
case ND_FRAME:
ED_area_tag_refresh(sa);
@@ -425,11 +412,17 @@ static void time_listener(ScrArea *sa, wmNotifier *wmn)
break;
}
case NC_SPACE:
- switch (wmn->data) {
+ switch (wmn->data) {
case ND_SPACE_CHANGED:
ED_area_tag_refresh(sa);
break;
}
+ case NC_WM:
+ switch (wmn->data) {
+ case ND_FILEREAD:
+ ED_area_tag_refresh(sa);
+ break;
+ }
}
}
@@ -450,7 +443,9 @@ static void time_main_area_init(wmWindowManager *wm, ARegion *ar)
static void time_main_area_draw(const bContext *C, ARegion *ar)
{
/* draw entirely, view changes should be handled here */
+ Scene *scene= CTX_data_scene(C);
SpaceTime *stime= CTX_wm_space_time(C);
+ Object *obact = CTX_data_active_object(C);
View2D *v2d= &ar->v2d;
View2DGrid *grid;
View2DScrollers *scrollers;
@@ -460,32 +455,32 @@ static void time_main_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* start and end frame */
- time_draw_sfra_efra(C, stime, ar);
+ time_draw_sfra_efra(scene, v2d);
/* grid */
unit= (stime->flag & TIME_DRAWFRAMES)? V2D_UNIT_FRAMES: V2D_UNIT_SECONDS;
- grid= UI_view2d_grid_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy);
- UI_view2d_grid_draw(C, v2d, grid, (V2D_VERTICAL_LINES|V2D_VERTICAL_AXIS));
+ grid= UI_view2d_grid_calc(scene, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy);
+ UI_view2d_grid_draw(v2d, grid, (V2D_VERTICAL_LINES|V2D_VERTICAL_AXIS));
UI_view2d_grid_free(grid);
- /* keyframes */
- if(!G.rendering) /* ANIM_nla_mapping_apply_fcurve() modifies curve data while rendering, possible race condition */
- time_draw_keyframes(C, stime, ar);
-
/* current frame */
if ((stime->flag & TIME_DRAWFRAMES)==0) flag |= DRAWCFRA_UNIT_SECONDS;
if (stime->flag & TIME_CFRA_NUM) flag |= DRAWCFRA_SHOW_NUMBOX;
ANIM_draw_cfra(C, v2d, flag);
+ /* keyframes */
+ if(!G.rendering) /* ANIM_nla_mapping_apply_fcurve() modifies curve data while rendering, possible race condition */
+ time_draw_keyframes(C, stime, ar);
+
/* markers */
- UI_view2d_view_orthoSpecial(C, v2d, 1);
+ UI_view2d_view_orthoSpecial(ar, v2d, 1);
draw_markers_time(C, 0);
/* caches */
- time_draw_cache(C, stime, ar);
+ time_draw_cache(stime, obact);
/* reset view matrix */
UI_view2d_view_restore(C);
@@ -511,6 +506,8 @@ static void time_main_area_listener(ARegion *ar, wmNotifier *wmn)
case NC_SCENE:
switch (wmn->data) {
+ case ND_OB_SELECT:
+ case ND_OB_ACTIVE:
case ND_FRAME:
case ND_FRAME_RANGE:
case ND_KEYINGSET:
@@ -524,7 +521,7 @@ static void time_main_area_listener(ARegion *ar, wmNotifier *wmn)
/* ************************ header time area region *********************** */
/* add handlers, stuff you only do once or on area/region changes */
-static void time_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void time_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -545,6 +542,7 @@ static void time_header_area_listener(ARegion *ar, wmNotifier *wmn)
case NC_SCENE:
switch (wmn->data) {
+ case ND_OB_SELECT:
case ND_FRAME:
case ND_FRAME_RANGE:
case ND_KEYINGSET:
@@ -571,7 +569,7 @@ static SpaceLink *time_new(const bContext *C)
stime= MEM_callocN(sizeof(SpaceTime), "inittime");
stime->spacetype= SPACE_TIME;
- stime->redraws= TIME_ALL_3D_WIN|TIME_ALL_ANIM_WIN;
+ stime->redraws= TIME_ALL_3D_WIN|TIME_ALL_ANIM_WIN; // XXX: depreceated
stime->flag |= TIME_DRAWFRAMES;
/* header */
@@ -622,7 +620,7 @@ static void time_free(SpaceLink *sl)
/* spacetype; init callback in ED_area_initialize() */
/* init is called to (re)initialize an existing editor (file read, screen changes) */
/* validate spacedata, add own area level handlers */
-static void time_init(wmWindowManager *wm, ScrArea *sa)
+static void time_init(wmWindowManager *UNUSED(wm), ScrArea *sa)
{
SpaceTime *stime= (SpaceTime *)sa->spacedata.first;
diff --git a/source/blender/editors/space_time/time_ops.c b/source/blender/editors/space_time/time_ops.c
index fb80d54d5e6..5bc59f06a19 100644
--- a/source/blender/editors/space_time/time_ops.c
+++ b/source/blender/editors/space_time/time_ops.c
@@ -29,24 +29,21 @@
#include <stdlib.h>
#include <math.h>
-
#include "DNA_scene_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
-
#include "ED_screen.h"
-
#include "WM_api.h"
#include "WM_types.h"
-
/* ****************** Start/End Frame Operators *******************************/
-static int time_set_sfra_exec (bContext *C, wmOperator *op)
+static int time_set_sfra_exec (bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
int frame= CFRA;
@@ -86,7 +83,7 @@ void TIME_OT_start_frame_set (wmOperatorType *ot)
}
-static int time_set_efra_exec (bContext *C, wmOperator *op)
+static int time_set_efra_exec (bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
int frame= CFRA;
@@ -127,7 +124,7 @@ void TIME_OT_end_frame_set (wmOperatorType *ot)
/* ************************ View All Operator *******************************/
-static int time_view_all_exec (bContext *C, wmOperator *op)
+static int time_view_all_exec (bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
ARegion *ar= CTX_wm_region(C);
diff --git a/source/blender/editors/space_userpref/CMakeLists.txt b/source/blender/editors/space_userpref/CMakeLists.txt
index d57661bb166..1ea1806fb95 100644
--- a/source/blender/editors/space_userpref/CMakeLists.txt
+++ b/source/blender/editors/space_userpref/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -31,4 +29,11 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_space_userpref "${SRC}" "${INC}")
+set(SRC
+ space_userpref.c
+ userpref_ops.c
+
+ userpref_intern.h
+)
+
+blender_add_lib(bf_editor_space_userpref "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_userpref/Makefile b/source/blender/editors/space_userpref/Makefile
deleted file mode 100644
index 8510c355ab4..00000000000
--- a/source/blender/editors/space_userpref/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_userpref
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../blenfont
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_userpref/space_userpref.c b/source/blender/editors/space_userpref/space_userpref.c
index 8eea83a1083..6f155fc3b99 100644
--- a/source/blender/editors/space_userpref/space_userpref.c
+++ b/source/blender/editors/space_userpref/space_userpref.c
@@ -33,13 +33,13 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
#include "ED_screen.h"
-
#include "WM_api.h"
#include "WM_types.h"
@@ -47,7 +47,7 @@
/* ******************** default callbacks for userpref space ***************** */
-static SpaceLink *userpref_new(const bContext *C)
+static SpaceLink *userpref_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceUserPref *spref;
@@ -72,7 +72,7 @@ static SpaceLink *userpref_new(const bContext *C)
}
/* not spacelink itself */
-static void userpref_free(SpaceLink *sl)
+static void userpref_free(SpaceLink *UNUSED(sl))
{
// SpaceUserPref *spref= (SpaceUserPref*) sl;
@@ -80,7 +80,7 @@ static void userpref_free(SpaceLink *sl)
/* spacetype; init callback */
-static void userpref_init(struct wmWindowManager *wm, ScrArea *sa)
+static void userpref_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -111,13 +111,13 @@ void userpref_operatortypes(void)
{
}
-void userpref_keymap(struct wmKeyConfig *keyconf)
+void userpref_keymap(struct wmKeyConfig *UNUSED(keyconf))
{
}
/* add handlers, stuff you only do once or on area/region changes */
-static void userpref_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void userpref_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -127,19 +127,20 @@ static void userpref_header_area_draw(const bContext *C, ARegion *ar)
ED_region_header(C, ar);
}
-static void userpref_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void userpref_main_area_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
{
/* context changes */
}
-static void userpref_header_listener(ARegion *ar, wmNotifier *wmn)
+static void userpref_header_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
{
/* context changes */
+#if 0
switch(wmn->category) {
default:
break;
}
-
+#endif
}
/* only called once, from space/spacetypes.c */
diff --git a/source/blender/editors/space_view3d/CMakeLists.txt b/source/blender/editors/space_view3d/CMakeLists.txt
index 48747898981..1f47a25ad92 100644
--- a/source/blender/editors/space_view3d/CMakeLists.txt
+++ b/source/blender/editors/space_view3d/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenfont
../../blenkernel
@@ -36,15 +34,32 @@ SET(INC
../../../../intern/smoke/extern
)
-IF(WITH_GAMEENGINE)
- LIST(APPEND INC ../../../kernel/gen_system)
- ADD_DEFINITIONS(-DGAMEBLENDER)
-ENDIF(WITH_GAMEENGINE)
+set(SRC
+ drawanimviz.c
+ drawarmature.c
+ drawmesh.c
+ drawobject.c
+ drawvolume.c
+ space_view3d.c
+ view3d_buttons.c
+ view3d_draw.c
+ view3d_edit.c
+ view3d_fly.c
+ view3d_header.c
+ view3d_ops.c
+ view3d_select.c
+ view3d_snap.c
+ view3d_toolbar.c
+ view3d_view.c
+
+ view3d_intern.h
+)
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_GAMEENGINE)
+ list(APPEND INC ../../../kernel/gen_system)
+ add_definitions(-DWITH_GAMEENGINE)
+endif()
-ADD_DEFINITIONS(-DGLEW_STATIC)
+add_definitions(-DGLEW_STATIC)
-BLENDERLIB(bf_editor_space_view3d "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_view3d "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_view3d/Makefile b/source/blender/editors/space_view3d/Makefile
deleted file mode 100644
index 58d88194c22..00000000000
--- a/source/blender/editors/space_view3d/Makefile
+++ /dev/null
@@ -1,61 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_view3d
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../render/extern/include
-CPPFLAGS += -I../../blenfont
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_SMOKE)/include
-ifneq ($(NAN_NO_KETSJI),true)
- CPPFLAGS += -I../../../kernel/gen_system
-endif
-
-# own include
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_view3d/SConscript b/source/blender/editors/space_view3d/SConscript
index d9074113ba9..bb32f8b926e 100644
--- a/source/blender/editors/space_view3d/SConscript
+++ b/source/blender/editors/space_view3d/SConscript
@@ -12,7 +12,7 @@ incs += ' #/intern/smoke/extern'
incs += ' #source/kernel/gen_system'
if env['WITH_BF_GAMEENGINE']:
- defs.append('GAMEBLENDER=1')
+ defs.append('WITH_GAMEENGINE')
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
incs += ' ' + env['BF_PTHREADS_INC']
diff --git a/source/blender/editors/space_view3d/drawanimviz.c b/source/blender/editors/space_view3d/drawanimviz.c
index fb271556a9c..7c07f99b8ea 100644
--- a/source/blender/editors/space_view3d/drawanimviz.c
+++ b/source/blender/editors/space_view3d/drawanimviz.c
@@ -31,6 +31,7 @@
#include <string.h>
#include <math.h>
+#include "BLO_sys_types.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -64,7 +65,7 @@
// - include support for editing the path verts
/* Set up drawing environment for drawing motion paths */
-void draw_motion_paths_init(Scene *scene, View3D *v3d, ARegion *ar)
+void draw_motion_paths_init(View3D *v3d, ARegion *ar)
{
RegionView3D *rv3d= ar->regiondata;
@@ -78,8 +79,7 @@ void draw_motion_paths_init(Scene *scene, View3D *v3d, ARegion *ar)
* - assumes that the viewport has already been initialised properly
* i.e. draw_motion_paths_init() has been called
*/
-// FIXME: the text is still drawn in the wrong space - it includes the current transforms of the object still...
-void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar,
+void draw_motion_path_instance(Scene *scene,
Object *ob, bPoseChannel *pchan, bAnimVizSettings *avs, bMotionPath *mpath)
{
//RegionView3D *rv3d= ar->regiondata;
@@ -201,15 +201,24 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar,
UI_ThemeColor(TH_TEXT_HI);
}
+ // XXX, this isnt up to date but probably should be kept so.
+ invert_m4_m4(ob->imat, ob->obmat);
+
/* Draw frame numbers at each framestep value */
if (avs->path_viewflag & MOTIONPATH_VIEW_FNUMS) {
+ unsigned char col[4];
+ UI_GetThemeColor3ubv(TH_TEXT_HI, col);
+ col[3]= 255;
+
for (i=0, mpv=mpv_start; i < len; i+=stepsize, mpv+=stepsize) {
char str[32];
+ float co[3];
/* only draw framenum if several consecutive highlighted points don't occur on same point */
if (i == 0) {
sprintf(str, "%d", (i+sfra));
- view3d_cached_text_draw_add(mpv->co[0], mpv->co[1], mpv->co[2], str, 0, 0);
+ mul_v3_m4v3(co, ob->imat, mpv->co);
+ view3d_cached_text_draw_add(co, str, 0, V3D_CACHE_TEXT_WORLDSPACE|V3D_CACHE_TEXT_ASCII, col);
}
else if ((i > stepsize) && (i < len-stepsize)) {
bMotionPathVert *mpvP = (mpv - stepsize);
@@ -217,7 +226,8 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar,
if ((equals_v3v3(mpv->co, mpvP->co)==0) || (equals_v3v3(mpv->co, mpvN->co)==0)) {
sprintf(str, "%d", (sfra+i));
- view3d_cached_text_draw_add(mpv->co[0], mpv->co[1], mpv->co[2], str, 0, 0);
+ mul_v3_m4v3(co, ob->imat, mpv->co);
+ view3d_cached_text_draw_add(co, str, 0, V3D_CACHE_TEXT_WORLDSPACE|V3D_CACHE_TEXT_ASCII, col);
}
}
}
@@ -225,6 +235,8 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar,
/* Keyframes - dots and numbers */
if (avs->path_viewflag & MOTIONPATH_VIEW_KFRAS) {
+ unsigned char col[4];
+
AnimData *adt= BKE_animdata_from_id(&ob->id);
DLRBT_Tree keys;
@@ -250,8 +262,11 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar,
}
/* Draw slightly-larger yellow dots at each keyframe */
- UI_ThemeColor(TH_VERTEX_SELECT);
+ UI_GetThemeColor3ubv(TH_VERTEX_SELECT, col);
+ col[3]= 255;
+
glPointSize(4.0f); // XXX perhaps a bit too big
+ glColor3ubv(col);
glBegin(GL_POINTS);
for (i=0, mpv=mpv_start; i < len; i++, mpv++) {
@@ -266,6 +281,7 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar,
/* Draw frame numbers of keyframes */
if (avs->path_viewflag & MOTIONPATH_VIEW_KFNOS) {
+ float co[3];
for (i=0, mpv=mpv_start; i < len; i++, mpv++) {
float mframe= (float)(sfra + i);
@@ -273,7 +289,8 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar,
char str[32];
sprintf(str, "%d", (sfra+i));
- view3d_cached_text_draw_add(mpv->co[0], mpv->co[1], mpv->co[2], str, 0, 0);
+ mul_v3_m4v3(co, ob->imat, mpv->co);
+ view3d_cached_text_draw_add(co, str, 0, V3D_CACHE_TEXT_WORLDSPACE|V3D_CACHE_TEXT_ASCII, col);
}
}
}
@@ -283,7 +300,7 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar,
}
/* Clean up drawing environment after drawing motion paths */
-void draw_motion_paths_cleanup(Scene *scene, View3D *v3d, ARegion *ar)
+void draw_motion_paths_cleanup(View3D *v3d)
{
if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
glPopMatrix();
diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c
index c6aa4656191..f16078ba454 100644
--- a/source/blender/editors/space_view3d/drawarmature.c
+++ b/source/blender/editors/space_view3d/drawarmature.c
@@ -43,6 +43,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "BKE_animsys.h"
#include "BKE_action.h"
@@ -50,7 +51,7 @@
#include "BKE_global.h"
#include "BKE_modifier.h"
#include "BKE_nla.h"
-#include "BKE_utildefines.h"
+
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -140,7 +141,7 @@ static void cp_shade_color3ub (char cp[], int offset)
}
/* This function sets the gl-color for coloring a certain bone (based on bcolor) */
-static short set_pchan_glColor (short colCode, int armflag, int boneflag, int constflag)
+static short set_pchan_glColor (short colCode, int boneflag, int constflag)
{
switch (colCode) {
case PCHAN_COLOR_NORMAL:
@@ -150,6 +151,9 @@ static short set_pchan_glColor (short colCode, int armflag, int boneflag, int co
if (boneflag & BONE_DRAW_ACTIVE) {
VECCOPY(cp, bcolor->active);
+ if(!(boneflag & BONE_SELECTED)) {
+ cp_shade_color3ub(cp, -80);
+ }
}
else if (boneflag & BONE_SELECTED) {
VECCOPY(cp, bcolor->select);
@@ -163,7 +167,8 @@ static short set_pchan_glColor (short colCode, int armflag, int boneflag, int co
glColor3ub(cp[0], cp[1], cp[2]);
}
else {
- if (boneflag & BONE_DRAW_ACTIVE) UI_ThemeColorShade(TH_BONE_POSE, 40);
+ if (boneflag & BONE_DRAW_ACTIVE && boneflag & BONE_SELECTED) UI_ThemeColorShade(TH_BONE_POSE, 40);
+ else if (boneflag & BONE_DRAW_ACTIVE) UI_ThemeColorBlend(TH_WIRE, TH_BONE_POSE, 0.15f); /* unselected active */
else if (boneflag & BONE_SELECTED) UI_ThemeColor(TH_BONE_POSE);
else UI_ThemeColor(TH_WIRE);
}
@@ -284,6 +289,13 @@ static short set_pchan_glColor (short colCode, int armflag, int boneflag, int co
return 0;
}
+static void set_ebone_glColor(const unsigned int boneflag)
+{
+ if (boneflag & BONE_DRAW_ACTIVE && boneflag & BONE_SELECTED) UI_ThemeColor(TH_EDGE_SELECT);
+ else if (boneflag & BONE_DRAW_ACTIVE) UI_ThemeColorBlend(TH_WIRE, TH_EDGE_SELECT, 0.15f); /* unselected active */
+ else if (boneflag & BONE_SELECTED) UI_ThemeColorShade(TH_EDGE_SELECT, -20);
+ else UI_ThemeColor(TH_WIRE);
+}
/* *************** Armature drawing, helper calls for parts ******************* */
@@ -427,7 +439,7 @@ static void draw_bonevert_solid(void)
glCallList(displist);
}
-static void draw_bone_octahedral()
+static void draw_bone_octahedral(void)
{
static GLuint displist=0;
@@ -551,7 +563,7 @@ static void draw_bone_points(int dt, int armflag, unsigned int boneflag, int id)
}
else {
if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, 0);
+ set_pchan_glColor(PCHAN_COLOR_SOLID, boneflag, 0);
else
UI_ThemeColor(TH_BONE_SOLID);
}
@@ -574,7 +586,7 @@ static void draw_bone_points(int dt, int armflag, unsigned int boneflag, int id)
}
else {
if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, 0);
+ set_pchan_glColor(PCHAN_COLOR_SOLID, boneflag, 0);
else
UI_ThemeColor(TH_BONE_SOLID);
}
@@ -616,17 +628,17 @@ static float co[16] ={
/* smat, imat = mat & imat to draw screenaligned */
-static void draw_sphere_bone_dist(float smat[][4], float imat[][4], int boneflag, bPoseChannel *pchan, EditBone *ebone)
+static void draw_sphere_bone_dist(float smat[][4], float imat[][4], bPoseChannel *pchan, EditBone *ebone)
{
- float head, tail, length, dist;
+ float head, tail, dist /*, length*/;
float *headvec, *tailvec, dirvec[3];
/* figure out the sizes of spheres */
if (ebone) {
/* this routine doesn't call get_matrix_editbone() that calculates it */
ebone->length = len_v3v3(ebone->head, ebone->tail);
-
- length= ebone->length;
+
+ /*length= ebone->length;*/ /*UNUSED*/
tail= ebone->rad_tail;
dist= ebone->dist;
if (ebone->parent && (ebone->flag & BONE_CONNECTED))
@@ -637,7 +649,7 @@ static void draw_sphere_bone_dist(float smat[][4], float imat[][4], int boneflag
tailvec= ebone->tail;
}
else {
- length= pchan->bone->length;
+ /*length= pchan->bone->length;*/ /*UNUSED*/
tail= pchan->bone->rad_tail;
dist= pchan->bone->dist;
if (pchan->parent && (pchan->bone->flag & BONE_CONNECTED))
@@ -748,7 +760,7 @@ static void draw_sphere_bone_dist(float smat[][4], float imat[][4], int boneflag
/* smat, imat = mat & imat to draw screenaligned */
static void draw_sphere_bone_wire(float smat[][4], float imat[][4], int armflag, int boneflag, int constflag, unsigned int id, bPoseChannel *pchan, EditBone *ebone)
{
- float head, tail, length;
+ float head, tail /*, length*/;
float *headvec, *tailvec, dirvec[3];
/* figure out the sizes of spheres */
@@ -756,7 +768,7 @@ static void draw_sphere_bone_wire(float smat[][4], float imat[][4], int armflag,
/* this routine doesn't call get_matrix_editbone() that calculates it */
ebone->length = len_v3v3(ebone->head, ebone->tail);
- length= ebone->length;
+ /*length= ebone->length;*/ /*UNUSED*/
tail= ebone->rad_tail;
if (ebone->parent && (boneflag & BONE_CONNECTED))
head= ebone->parent->rad_tail;
@@ -766,7 +778,7 @@ static void draw_sphere_bone_wire(float smat[][4], float imat[][4], int armflag,
tailvec= ebone->tail;
}
else {
- length= pchan->bone->length;
+ /*length= pchan->bone->length;*/ /*UNUSED*/
tail= pchan->bone->rad_tail;
if ((pchan->parent) && (boneflag & BONE_CONNECTED))
head= pchan->parent->bone->rad_tail;
@@ -782,7 +794,7 @@ static void draw_sphere_bone_wire(float smat[][4], float imat[][4], int armflag,
else UI_ThemeColor(TH_VERTEX);
}
else if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, boneflag, constflag);
/* Draw root point if we are not connected */
if ((boneflag & BONE_CONNECTED)==0) {
@@ -903,7 +915,7 @@ static void draw_sphere_bone(int dt, int armflag, int boneflag, int constflag, u
else UI_ThemeColorShade(TH_BONE_SOLID, -30);
}
else if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_SPHEREBONE_END, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_SPHEREBONE_END, boneflag, constflag);
else if (dt==OB_SOLID)
UI_ThemeColorShade(TH_BONE_SOLID, -30);
@@ -933,7 +945,7 @@ static void draw_sphere_bone(int dt, int armflag, int boneflag, int constflag, u
else UI_ThemeColor(TH_BONE_SOLID);
}
else if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_SPHEREBONE_BASE, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_SPHEREBONE_BASE, boneflag, constflag);
else if (dt == OB_SOLID)
UI_ThemeColor(TH_BONE_SOLID);
@@ -1003,7 +1015,7 @@ static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned in
if (armflag & (ARM_EDITMODE|ARM_POSEMODE)) {
glLineWidth(4.0f);
if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, boneflag, constflag);
else if (armflag & ARM_EDITMODE) {
UI_ThemeColor(TH_WIRE);
}
@@ -1048,7 +1060,7 @@ static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned in
glLoadName(id & 0xFFFF); /* object tag, for bordersel optim */
if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_LINEBONE, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_LINEBONE, boneflag, constflag);
}
glLineWidth(2.0);
@@ -1147,15 +1159,13 @@ static void draw_b_bone(int dt, int armflag, int boneflag, int constflag, unsign
/* colors for modes */
if (armflag & ARM_POSEMODE) {
if (dt <= OB_WIRE)
- set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, boneflag, constflag);
else
- set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_SOLID, boneflag, constflag);
}
else if (armflag & ARM_EDITMODE) {
if (dt==OB_WIRE) {
- if (boneflag & BONE_DRAW_ACTIVE) UI_ThemeColor(TH_EDGE_SELECT);
- else if (boneflag & BONE_SELECTED) UI_ThemeColorShade(TH_EDGE_SELECT, -20);
- else UI_ThemeColor(TH_WIRE);
+ set_ebone_glColor(boneflag);
}
else
UI_ThemeColor(TH_BONE_SOLID);
@@ -1171,7 +1181,7 @@ static void draw_b_bone(int dt, int armflag, int boneflag, int constflag, unsign
glEnable(GL_LIGHTING);
if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_SOLID, boneflag, constflag);
else
UI_ThemeColor(TH_BONE_SOLID);
@@ -1186,7 +1196,7 @@ static void draw_b_bone(int dt, int armflag, int boneflag, int constflag, unsign
if (armflag & ARM_POSEMODE) {
if (constflag) {
/* set constraint colors */
- if (set_pchan_glColor(PCHAN_COLOR_CONSTS, armflag, boneflag, constflag)) {
+ if (set_pchan_glColor(PCHAN_COLOR_CONSTS, boneflag, constflag)) {
glEnable(GL_BLEND);
draw_b_bone_boxes(OB_SOLID, pchan, xwidth, length, zwidth);
@@ -1195,7 +1205,7 @@ static void draw_b_bone(int dt, int armflag, int boneflag, int constflag, unsign
}
/* restore colors */
- set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, boneflag, constflag);
}
}
@@ -1221,9 +1231,9 @@ static void draw_bone(int dt, int armflag, int boneflag, int constflag, unsigned
/* colors for posemode */
if (armflag & ARM_POSEMODE) {
if (dt <= OB_WIRE)
- set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, boneflag, constflag);
else
- set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_SOLID, boneflag, constflag);
}
@@ -1238,14 +1248,12 @@ static void draw_bone(int dt, int armflag, int boneflag, int constflag, unsigned
if (dt <= OB_WIRE) {
/* colors */
if (armflag & ARM_EDITMODE) {
- if (boneflag & BONE_DRAW_ACTIVE) UI_ThemeColor(TH_EDGE_SELECT);
- else if (boneflag & BONE_SELECTED) UI_ThemeColorShade(TH_EDGE_SELECT, -20);
- else UI_ThemeColor(TH_WIRE);
+ set_ebone_glColor(boneflag);
}
else if (armflag & ARM_POSEMODE) {
if (constflag) {
/* draw constraint colors */
- if (set_pchan_glColor(PCHAN_COLOR_CONSTS, armflag, boneflag, constflag)) {
+ if (set_pchan_glColor(PCHAN_COLOR_CONSTS, boneflag, constflag)) {
glEnable(GL_BLEND);
draw_bone_solid_octahedral();
@@ -1254,7 +1262,7 @@ static void draw_bone(int dt, int armflag, int boneflag, int constflag, unsigned
}
/* restore colors */
- set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, boneflag, constflag);
}
}
draw_bone_octahedral();
@@ -1262,7 +1270,7 @@ static void draw_bone(int dt, int armflag, int boneflag, int constflag, unsigned
else {
/* solid */
if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_SOLID, boneflag, constflag);
else
UI_ThemeColor(TH_BONE_SOLID);
draw_bone_solid_octahedral();
@@ -1283,7 +1291,7 @@ static void draw_custom_bone(Scene *scene, View3D *v3d, RegionView3D *rv3d, Obje
/* colors for posemode */
if (armflag & ARM_POSEMODE) {
- set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, 0);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, boneflag, 0);
}
if (id != -1) {
@@ -1565,7 +1573,7 @@ static void bone_matrix_translate_y(float mat[][4], float y)
}
/* assumes object is Armature with pose */
-static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt)
+static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, short ghost)
{
RegionView3D *rv3d= ar->regiondata;
Object *ob= base->object;
@@ -1578,6 +1586,9 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
short do_dashed= 3, draw_wire= 0;
short flag, constflag;
+ /* being set below */
+ arm->layer_used= 0;
+
/* hacky... prevent outline select from drawing dashed helplines */
glGetFloatv(GL_LINE_WIDTH, &tmp);
if (tmp > 1.1) do_dashed &= ~1;
@@ -1602,7 +1613,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
if (bone && !(bone->flag & (BONE_HIDDEN_P|BONE_NO_DEFORM|BONE_HIDDEN_PG))) {
if (bone->flag & (BONE_SELECTED)) {
if (bone->layer & arm->layer)
- draw_sphere_bone_dist(smat, imat, bone->flag, pchan, NULL);
+ draw_sphere_bone_dist(smat, imat, pchan, NULL);
}
}
}
@@ -1624,6 +1635,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
bone= pchan->bone;
+ arm->layer_used |= bone->layer;
if ( (bone) && !(bone->flag & (BONE_HIDDEN_P|BONE_HIDDEN_PG)) ) {
if (bone->layer & arm->layer) {
@@ -1642,7 +1654,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
flag &= ~BONE_CONNECTED;
/* set temporary flag for drawing bone as active, but only if selected */
- if ((bone == arm->act_bone) && (bone->flag & BONE_SELECTED))
+ if (bone == arm->act_bone)
flag |= BONE_DRAW_ACTIVE;
/* set color-set to use */
@@ -1706,9 +1718,11 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
}
/* prepare colors */
- if (arm->flag & ARM_POSEMODE)
+ if(ghost) {
+ /* 13 October 2009, Disabled this to make ghosting show the right colors (Aligorith) */
+ }
+ else if (arm->flag & ARM_POSEMODE)
set_pchan_colorset(ob, pchan);
-#if 0 // XXX - 13 October 2009, Disabled this to make ghosting show the right colors (Aligorith)
else {
if ((scene->basact)==base) {
if (base->flag & (SELECT+BA_WAS_SEL)) UI_ThemeColor(TH_ACTIVE);
@@ -1719,7 +1733,6 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
else UI_ThemeColor(TH_WIRE);
}
}
-#endif
/* catch exception for bone with hidden parent */
flag= bone->flag;
@@ -1727,7 +1740,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
flag &= ~BONE_CONNECTED;
/* set temporary flag for drawing bone as active, but only if selected */
- if ((bone == arm->act_bone) && (bone->flag & BONE_SELECTED))
+ if (bone == arm->act_bone)
flag |= BONE_DRAW_ACTIVE;
draw_custom_bone(scene, v3d, rv3d, pchan->custom, OB_WIRE, arm->flag, flag, index, bone->length);
@@ -1741,8 +1754,8 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
if (index != -1)
index+= 0x10000; // pose bones count in higher 2 bytes only
}
-
- if (draw_wire) {
+ /* stick bones have not been drawn yet so dont clear object selection in this case */
+ if ((arm->drawtype != ARM_LINE) && draw_wire) {
/* object tag, for bordersel optim */
glLoadName(index & 0xFFFF);
index= -1;
@@ -1768,10 +1781,11 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
bone= pchan->bone;
+ arm->layer_used |= bone->layer;
if ((bone) && !(bone->flag & (BONE_HIDDEN_P|BONE_HIDDEN_PG))) {
if (bone->layer & arm->layer) {
- if ((do_dashed & 1) && (bone->parent)) {
+ if ((do_dashed & 1) && (pchan->parent)) {
/* Draw a line from our root to the parent's tip
* - only if V3D_HIDE_HELPLINES is enabled...
*/
@@ -1822,7 +1836,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
flag &= ~BONE_CONNECTED;
/* set temporary flag for drawing bone as active, but only if selected */
- if ((bone == arm->act_bone) && (bone->flag & BONE_SELECTED))
+ if (bone == arm->act_bone)
flag |= BONE_DRAW_ACTIVE;
/* extra draw service for pose mode */
@@ -1873,6 +1887,12 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
/* patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing */
if ((G.f & G_PICKSEL) == 0) {
float vec[3];
+
+ unsigned char col[4];
+ float col_f[3];
+ glGetFloatv(GL_CURRENT_COLOR, col_f); /* incase this is not set below */
+ rgb_float_to_byte(col_f, col);
+ col[3]= 255;
if (v3d->zbuf) glDisable(GL_DEPTH_TEST);
@@ -1881,17 +1901,16 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
if (pchan->bone->layer & arm->layer) {
if (arm->flag & (ARM_EDITMODE|ARM_POSEMODE)) {
bone= pchan->bone;
-
- if (bone->flag & BONE_SELECTED) UI_ThemeColor(TH_TEXT_HI);
- else UI_ThemeColor(TH_TEXT);
+ UI_GetThemeColor3ubv((bone->flag & BONE_SELECTED) ? TH_TEXT_HI : TH_TEXT, col);
}
- else if (dt > OB_WIRE)
- UI_ThemeColor(TH_TEXT);
-
+ else if (dt > OB_WIRE) {
+ UI_GetThemeColor3ubv(TH_TEXT, col);
+ }
+
/* Draw names of bone */
if (arm->flag & ARM_DRAWNAMES) {
mid_v3_v3v3(vec, pchan->pose_head, pchan->pose_tail);
- view3d_cached_text_draw_add(vec[0], vec[1], vec[2], pchan->name, 10, 0);
+ view3d_cached_text_draw_add(vec, pchan->name, 10, 0, col);
}
/* Draw additional axes on the bone tail */
@@ -1900,8 +1919,9 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
copy_m4_m4(bmat, pchan->pose_mat);
bone_matrix_translate_y(bmat, pchan->bone->length);
glMultMatrixf(bmat);
-
- drawaxes(pchan->bone->length*0.25f, 0, OB_ARROWS);
+
+ glColor3ubv(col);
+ drawaxes(pchan->bone->length*0.25f, OB_ARROWS);
glPopMatrix();
}
@@ -1940,6 +1960,9 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt)
unsigned int index;
int flag;
+ /* being set in code below */
+ arm->layer_used= 0;
+
/* envelope (deform distance) */
if(arm->drawtype==ARM_ENVELOPE) {
/* precalc inverse matrix for drawing screen aligned */
@@ -1957,7 +1980,7 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt)
if (eBone->layer & arm->layer) {
if ((eBone->flag & (BONE_HIDDEN_A|BONE_NO_DEFORM))==0) {
if (eBone->flag & (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL))
- draw_sphere_bone_dist(smat, imat, eBone->flag, NULL, eBone);
+ draw_sphere_bone_dist(smat, imat, NULL, eBone);
}
}
}
@@ -1978,11 +2001,11 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt)
/* catch exception for bone with hidden parent */
flag= eBone->flag;
- if ( (eBone->parent) && ((eBone->parent->flag & BONE_HIDDEN_A) || (eBone->parent->layer & arm->layer)==0) )
+ if ( (eBone->parent) && !EBONE_VISIBLE(arm, eBone->parent))
flag &= ~BONE_CONNECTED;
/* set temporary flag for drawing bone as active, but only if selected */
- if ((eBone == arm->act_edbone) && (eBone->flag & BONE_SELECTED))
+ if (eBone == arm->act_edbone)
flag |= BONE_DRAW_ACTIVE;
if (arm->drawtype==ARM_ENVELOPE)
@@ -2012,16 +2035,17 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt)
index= 0; /* do selection codes */
for (eBone=arm->edbo->first; eBone; eBone=eBone->next) {
+ arm->layer_used |= eBone->layer;
if (eBone->layer & arm->layer) {
if ((eBone->flag & BONE_HIDDEN_A)==0) {
/* catch exception for bone with hidden parent */
flag= eBone->flag;
- if ( (eBone->parent) && ((eBone->parent->flag & BONE_HIDDEN_A) || (eBone->parent->layer & arm->layer)==0) )
+ if ( (eBone->parent) && !EBONE_VISIBLE(arm, eBone->parent))
flag &= ~BONE_CONNECTED;
/* set temporary flag for drawing bone as active, but only if selected */
- if ((eBone == arm->act_edbone) && (eBone->flag & BONE_SELECTED))
+ if (eBone == arm->act_edbone)
flag |= BONE_DRAW_ACTIVE;
if (arm->drawtype == ARM_ENVELOPE) {
@@ -2071,21 +2095,22 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt)
// patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing
if ((G.f & G_PICKSEL) == 0) {
float vec[3];
+ unsigned char col[4];
+ col[3]= 255;
if (v3d->zbuf) glDisable(GL_DEPTH_TEST);
for (eBone=arm->edbo->first; eBone; eBone=eBone->next) {
if(eBone->layer & arm->layer) {
if ((eBone->flag & BONE_HIDDEN_A)==0) {
-
- if (eBone->flag & BONE_SELECTED) UI_ThemeColor(TH_TEXT_HI);
- else UI_ThemeColor(TH_TEXT);
-
+
+ UI_GetThemeColor3ubv((eBone->flag & BONE_SELECTED) ? TH_TEXT_HI : TH_TEXT, col);
+
/* Draw name */
if (arm->flag & ARM_DRAWNAMES) {
mid_v3_v3v3(vec, eBone->head, eBone->tail);
glRasterPos3fv(vec);
- view3d_cached_text_draw_add(vec[0], vec[1], vec[2], eBone->name, 10, 0);
+ view3d_cached_text_draw_add(vec, eBone->name, 10, 0, col);
}
/* Draw additional axes */
if (arm->flag & ARM_DRAWAXES) {
@@ -2093,8 +2118,9 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt)
get_matrix_editbone(eBone, bmat);
bone_matrix_translate_y(bmat, eBone->length);
glMultMatrixf(bmat);
-
- drawaxes(eBone->length*0.25f, 0, OB_ARROWS);
+
+ glColor3ubv(col);
+ drawaxes(eBone->length*0.25f, OB_ARROWS);
glPopMatrix();
}
@@ -2122,16 +2148,16 @@ static void draw_pose_paths(Scene *scene, View3D *v3d, ARegion *ar, Object *ob)
bPoseChannel *pchan;
/* setup drawing environment for paths */
- draw_motion_paths_init(scene, v3d, ar);
+ draw_motion_paths_init(v3d, ar);
/* draw paths where they exist and they releated bone is visible */
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
if ((pchan->bone->layer & arm->layer) && (pchan->mpath))
- draw_motion_path_instance(scene, v3d, ar, ob, pchan, avs, pchan->mpath);
+ draw_motion_path_instance(scene, ob, pchan, avs, pchan->mpath);
}
/* cleanup after drawing */
- draw_motion_paths_cleanup(scene, v3d, ar);
+ draw_motion_paths_cleanup(v3d);
}
@@ -2211,7 +2237,7 @@ static void draw_ghost_poses_range(Scene *scene, View3D *v3d, ARegion *ar, Base
BKE_animsys_evaluate_animdata(&ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
where_is_pose(scene, ob);
- draw_pose_bones(scene, v3d, ar, base, OB_WIRE);
+ draw_pose_bones(scene, v3d, ar, base, OB_WIRE, TRUE);
}
glDisable(GL_BLEND);
if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
@@ -2290,7 +2316,7 @@ static void draw_ghost_poses_keys(Scene *scene, View3D *v3d, ARegion *ar, Base *
BKE_animsys_evaluate_animdata(&ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
where_is_pose(scene, ob);
- draw_pose_bones(scene, v3d, ar, base, OB_WIRE);
+ draw_pose_bones(scene, v3d, ar, base, OB_WIRE, TRUE);
}
glDisable(GL_BLEND);
if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
@@ -2360,7 +2386,7 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
if (CFRA != cfrao) {
BKE_animsys_evaluate_animdata(&ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
where_is_pose(scene, ob);
- draw_pose_bones(scene, v3d, ar, base, OB_WIRE);
+ draw_pose_bones(scene, v3d, ar, base, OB_WIRE, TRUE);
}
}
@@ -2375,7 +2401,7 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
if (CFRA != cfrao) {
BKE_animsys_evaluate_animdata(&ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
where_is_pose(scene, ob);
- draw_pose_bones(scene, v3d, ar, base, OB_WIRE);
+ draw_pose_bones(scene, v3d, ar, base, OB_WIRE, TRUE);
}
}
}
@@ -2409,7 +2435,7 @@ int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, in
/* we use color for solid lighting */
glColorMaterial(GL_FRONT_AND_BACK, GL_SPECULAR);
glEnable(GL_COLOR_MATERIAL);
- glColor3ub(0,0,0); // clear spec
+ glColor3ub(255,0,255); // clear spec
glDisable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
@@ -2458,7 +2484,7 @@ int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, in
}
}
}
- draw_pose_bones(scene, v3d, ar, base, dt);
+ draw_pose_bones(scene, v3d, ar, base, dt, FALSE);
arm->flag &= ~ARM_POSEMODE;
if(ob->mode & OB_MODE_POSE)
diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c
index 372ac976342..caac8d1d9fe 100644
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@ -34,7 +34,7 @@
#include "BLI_math.h"
#include "BLI_edgehash.h"
#include "BLI_editVert.h"
-
+#include "BLI_utildefines.h"
#include "DNA_material_types.h"
#include "DNA_meshdata_types.h"
@@ -50,7 +50,7 @@
#include "BKE_material.h"
#include "BKE_paint.h"
#include "BKE_property.h"
-#include "BKE_utildefines.h"
+
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -93,13 +93,10 @@ static EdgeHash *get_tface_mesh_marked_edge_info(Mesh *me)
EdgeHash *eh = BLI_edgehash_new();
int i;
MFace *mf;
- MTFace *tf = NULL;
for (i=0; i<me->totface; i++) {
mf = &me->mface[i];
- if (me->mtface)
- tf = &me->mtface[i];
-
+
if (mf->v3) {
if (!(mf->flag&ME_HIDE)) {
unsigned int flags = eEdge_Visible;
@@ -168,6 +165,7 @@ static int draw_tfaces3D__setSelectOpts(void *userData, int index)
return flags & eEdge_Select;
}
+#if 0
static int draw_tfaces3D__setActiveOpts(void *userData, int index)
{
struct { Mesh *me; EdgeHash *eh; } *data = userData;
@@ -191,8 +189,21 @@ static int draw_tfaces3D__drawFaceOpts(void *userData, int index)
else
return 0;
}
+#endif
-static void draw_tfaces3D(RegionView3D *rv3d, Object *ob, Mesh *me, DerivedMesh *dm)
+/* draws unselected */
+static int draw_tfaces3D__drawFaceOptsInv(void *userData, int index)
+{
+ Mesh *me = (Mesh*)userData;
+
+ MFace *mface = &me->mface[index];
+ if (!(mface->flag&ME_HIDE) && !(mface->flag&ME_FACE_SEL))
+ return 2; /* Don't set color */
+ else
+ return 0;
+}
+
+static void draw_tfaces3D(RegionView3D *rv3d, Mesh *me, DerivedMesh *dm, short draw_seams)
{
struct { Mesh *me; EdgeHash *eh; } data;
@@ -203,17 +214,17 @@ static void draw_tfaces3D(RegionView3D *rv3d, Object *ob, Mesh *me, DerivedMesh
glDisable(GL_LIGHTING);
bglPolygonOffset(rv3d->dist, 1.0);
- /* Draw (Hidden) Edges */
+ /* Draw (Hidden) Edges */
+ setlinestyle(1);
UI_ThemeColor(TH_EDGE_FACESEL);
dm->drawMappedEdges(dm, draw_tfaces3D__setHiddenOpts, &data);
+ setlinestyle(0);
- /* Draw Seams */
- if(me->drawflag & ME_DRAWSEAMS) {
+ /* Draw Seams */
+ if(draw_seams && me->drawflag & ME_DRAWSEAMS) {
UI_ThemeColor(TH_EDGE_SEAM);
glLineWidth(2);
-
dm->drawMappedEdges(dm, draw_tfaces3D__setSeamOpts, &data);
-
glLineWidth(1);
}
@@ -221,10 +232,16 @@ static void draw_tfaces3D(RegionView3D *rv3d, Object *ob, Mesh *me, DerivedMesh
if(me->drawflag & ME_DRAWFACES) {
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+#if 0
UI_ThemeColor4(TH_FACE_SELECT);
dm->drawMappedFacesTex(dm, draw_tfaces3D__drawFaceOpts, (void*)me);
-
+#else
+ /* dull unselected faces so as not to get in the way of seeing color */
+ glColor4ub(96, 96, 96, 64);
+ dm->drawMappedFacesTex(dm, draw_tfaces3D__drawFaceOptsInv, (void*)me);
+#endif
+
glDisable(GL_BLEND);
}
@@ -236,8 +253,6 @@ static void draw_tfaces3D(RegionView3D *rv3d, Object *ob, Mesh *me, DerivedMesh
dm->drawMappedEdges(dm, draw_tfaces3D__setSelectOpts, &data);
setlinestyle(0);
- dm->drawMappedEdges(dm, draw_tfaces3D__setActiveOpts, &data);
-
bglPolygonOffset(rv3d->dist, 0.0); // resets correctly now, even after calling accumulated offsets
BLI_edgehash_free(data.eh, NULL);
@@ -365,7 +380,7 @@ static void draw_textured_begin(Scene *scene, View3D *v3d, RegionView3D *rv3d, O
glShadeModel(GL_SMOOTH);
}
-static void draw_textured_end()
+static void draw_textured_end(void)
{
/* switch off textures */
GPU_set_tpage(NULL, 0);
@@ -508,10 +523,10 @@ static int draw_tface_mapped__set_draw(void *userData, int index)
{
Mesh *me = (Mesh*)userData;
MTFace *tface = (me->mtface)? &me->mtface[index]: NULL;
- MFace *mface = (me->mface)? &me->mface[index]: NULL;
+ MFace *mface = &me->mface[index];
MCol *mcol = (me->mcol)? &me->mcol[index]: NULL;
- int matnr = me->mface[index].mat_nr;
- if (mface && mface->flag&ME_HIDE) return 0;
+ const int matnr = mface->mat_nr;
+ if (mface->flag & ME_HIDE) return 0;
return draw_tface__set_draw(tface, mcol, matnr);
}
@@ -523,7 +538,7 @@ static int draw_em_tf_mapped__set_draw(void *userData, int index)
MCol *mcol;
int matnr;
- if (efa==NULL || efa->h)
+ if (efa->h)
return 0;
tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
@@ -536,12 +551,13 @@ static int draw_em_tf_mapped__set_draw(void *userData, int index)
static int wpaint__setSolidDrawOptions(void *userData, int index, int *drawSmooth_r)
{
Mesh *me = (Mesh*)userData;
- MTFace *tface = (me->mtface)? &me->mtface[index]: NULL;
- MFace *mface = (me->mface)? &me->mface[index]: NULL;
-
- if ((mface->flag&ME_HIDE) || (tface && (tface->mode&TF_INVISIBLE)))
- return 0;
-
+
+ if ( (me->mface && me->mface[index].flag & ME_HIDE) ||
+ (me->mtface && (me->mtface[index].mode & TF_INVISIBLE))
+ ) {
+ return 0;
+ }
+
*drawSmooth_r = 1;
return 1;
}
@@ -642,20 +658,20 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o
/* draw the textured mesh */
draw_textured_begin(scene, v3d, rv3d, ob);
+ glColor4f(1.0f,1.0f,1.0f,1.0f);
+
if(ob->mode & OB_MODE_EDIT) {
- glColor4f(1.0f,1.0f,1.0f,1.0f);
dm->drawMappedFacesTex(dm, draw_em_tf_mapped__set_draw, me->edit_mesh);
} else if(faceselect) {
if(ob->mode & OB_MODE_WEIGHT_PAINT)
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me, 1);
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me, 1, GPU_enable_material);
else
- dm->drawMappedFacesTex(dm, draw_tface_mapped__set_draw, me);
+ dm->drawMappedFacesTex(dm, me->mface ? draw_tface_mapped__set_draw : NULL, me);
}
else {
if( GPU_buffer_legacy(dm) )
dm->drawFacesTex(dm, draw_tface__set_draw_legacy);
else {
- glColor4f(1.0f,1.0f,1.0f,1.0f);
if( !CustomData_has_layer(&dm->faceData,CD_TEXTURE_MCOL) )
add_tface_color_layer(dm);
dm->drawFacesTex(dm, draw_tface__set_draw);
@@ -670,7 +686,7 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o
/* draw edges and selected faces over textured mesh */
if(!(ob == scene->obedit) && faceselect)
- draw_tfaces3D(rv3d, ob, me, dm);
+ draw_tfaces3D(rv3d, me, dm, ob->mode & OB_MODE_WEIGHT_PAINT);
/* reset from negative scale correction */
glFrontFace(GL_CCW);
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 44fa0c7b181..8724f2f9def 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -47,6 +47,7 @@
#include "BLI_editVert.h"
#include "BLI_edgehash.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_anim.h" //for the where_on_path function
#include "BKE_constraint.h" // for the get_constraint_target function
@@ -67,7 +68,7 @@
#include "BKE_particle.h"
#include "BKE_pointcache.h"
#include "BKE_unit.h"
-#include "BKE_utildefines.h"
+
#include "smoke_API.h"
#include "BIF_gl.h"
@@ -316,12 +317,16 @@ static float cosval[32] ={
1.00000000
};
-static void draw_xyz_wire(float *c, float size, int axis)
+static void draw_xyz_wire(const float c[3], float size, int axis)
{
float v1[3]= {0.f, 0.f, 0.f}, v2[3] = {0.f, 0.f, 0.f};
float dim = size * 0.1;
- float dx[3]={dim, 0.0, 0.0}, dy[3]={0.0, dim, 0.0}, dz[3]={0.0, 0.0, dim};
-
+ float dx[3], dy[3], dz[3];
+
+ dx[0]=dim; dx[1]=0.f; dx[2]=0.f;
+ dy[0]=0.f; dy[1]=dim; dy[2]=0.f;
+ dz[0]=0.f; dz[1]=0.f; dz[2]=dim;
+
switch(axis) {
case 0: /* x axis */
glBegin(GL_LINES);
@@ -398,8 +403,7 @@ static void draw_xyz_wire(float *c, float size, int axis)
}
-/* flag is same as for draw_object */
-void drawaxes(float size, int flag, char drawtype)
+void drawaxes(float size, char drawtype)
{
int axis;
float v1[3]= {0.0, 0.0, 0.0};
@@ -410,16 +414,16 @@ void drawaxes(float size, int flag, char drawtype)
case OB_PLAINAXES:
for (axis=0; axis<3; axis++) {
- float v1[3]= {0.0, 0.0, 0.0};
- float v2[3]= {0.0, 0.0, 0.0};
-
glBegin(GL_LINES);
v1[axis]= size;
v2[axis]= -size;
glVertex3fv(v1);
glVertex3fv(v2);
-
+
+ /* reset v1 & v2 to zero */
+ v1[axis]= v2[axis]= 0.0f;
+
glEnd();
}
break;
@@ -475,10 +479,8 @@ void drawaxes(float size, int flag, char drawtype)
case OB_ARROWS:
default:
for (axis=0; axis<3; axis++) {
- float v1[3]= {0.0, 0.0, 0.0};
- float v2[3]= {0.0, 0.0, 0.0};
- int arrow_axis= (axis==0)?1:0;
-
+ const int arrow_axis= (axis==0) ? 1:0;
+
glBegin(GL_LINES);
v2[axis]= size;
@@ -499,12 +501,16 @@ void drawaxes(float size, int flag, char drawtype)
v2[axis]+= size*0.125;
draw_xyz_wire(v2, size, axis);
+
+
+ /* reset v1 & v2 to zero */
+ v1[arrow_axis]= v1[axis]= v2[axis]= 0.0f;
}
break;
}
}
-void drawcircball(int mode, float *cent, float rad, float tmat[][4])
+void drawcircball(int mode, const float cent[3], float rad, float tmat[][4])
{
float vec[3], vx[3], vy[3];
int a, tot=32;
@@ -523,12 +529,9 @@ void drawcircball(int mode, float *cent, float rad, float tmat[][4])
}
/* circle for object centers, special_color is for library or ob users */
-static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, float *vec, int selstate, int special_color)
+static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, const float co[3], int selstate, int special_color)
{
- float size;
-
- size= rv3d->persmat[0][3]*vec[0]+ rv3d->persmat[1][3]*vec[1]+ rv3d->persmat[2][3]*vec[2]+ rv3d->persmat[3][3];
- size*= rv3d->pixsize*((float)U.obcenter_dia*0.5f);
+ const float size= view3d_pixel_size(rv3d, co) * (float)U.obcenter_dia * 0.5f;
/* using gldepthfunc guarantees that it does write z values, but not checks for it, so centers remain visible independt order of drawing */
if(v3d->zbuf) glDepthFunc(GL_ALWAYS);
@@ -544,10 +547,10 @@ static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, float *vec, int se
else if (selstate == SELECT) UI_ThemeColorShadeAlpha(TH_SELECT, 0, -80);
else if (selstate == DESELECT) UI_ThemeColorShadeAlpha(TH_TRANSFORM, 0, -80);
}
- drawcircball(GL_POLYGON, vec, size, rv3d->viewinv);
+ drawcircball(GL_POLYGON, co, size, rv3d->viewinv);
UI_ThemeColorShadeAlpha(TH_WIRE, 0, -30);
- drawcircball(GL_LINE_LOOP, vec, size, rv3d->viewinv);
+ drawcircball(GL_LINE_LOOP, co, size, rv3d->viewinv);
glDisable(GL_BLEND);
if(v3d->zbuf) glDepthFunc(GL_LEQUAL);
@@ -559,11 +562,15 @@ static int CachedTextLevel= 0;
typedef struct ViewCachedString {
struct ViewCachedString *next, *prev;
- float vec[3], col[4];
- char str[128];
+ float vec[3];
+ union {
+ unsigned char ub[4];
+ int pack;
+ } col;
short mval[2];
short xoffs;
short flag;
+ /* str is allocated past the end */
} ViewCachedString;
void view3d_cached_text_draw_begin()
@@ -573,19 +580,20 @@ void view3d_cached_text_draw_begin()
CachedTextLevel++;
}
-void view3d_cached_text_draw_add(float x, float y, float z, char *str, short xoffs, short flag)
+void view3d_cached_text_draw_add(const float co[3], const char *str, short xoffs, short flag, const unsigned char col[4])
{
+ int alloc_len= strlen(str) + 1;
ListBase *strings= &CachedText[CachedTextLevel-1];
- ViewCachedString *vos= MEM_callocN(sizeof(ViewCachedString), "ViewCachedString");
+ ViewCachedString *vos= MEM_callocN(sizeof(ViewCachedString) + alloc_len, "ViewCachedString");
BLI_addtail(strings, vos);
- BLI_strncpy(vos->str, str, 128);
- vos->vec[0]= x;
- vos->vec[1]= y;
- vos->vec[2]= z;
- glGetFloatv(GL_CURRENT_COLOR, vos->col);
+ copy_v3_v3(vos->vec, co);
+ vos->col.pack= *((int *)col);
vos->xoffs= xoffs;
vos->flag= flag;
+
+ /* allocate past the end */
+ memcpy(++vos, str, alloc_len);
}
void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, float mat[][4])
@@ -605,6 +613,8 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa
}
if(tot) {
+ int col_pack_prev= 0;
+
#if 0
bglMats mats; /* ZBuffer depth vars */
double ux, uy, uz;
@@ -639,8 +649,18 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa
}
#endif
if(vos->mval[0]!=IS_CLIPPED) {
- glColor3fv(vos->col);
- BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, vos->str);
+ const char *str= (char *)(vos+1);
+
+ if(col_pack_prev != vos->col.pack) {
+ glColor3ubv(vos->col.ub);
+ col_pack_prev= vos->col.pack;
+ }
+ if(vos->flag & V3D_CACHE_TEXT_ASCII) {
+ BLF_draw_default_ascii((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, str, 65535); /* XXX, use real length */
+ }
+ else {
+ BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, str, 65535); /* XXX, use real length */
+ }
}
}
@@ -780,7 +800,9 @@ static void spotvolume(float *lvec, float *vvec, float inp)
cross_v3_v3v3(temp,vvec,lvec); /* equation for a plane through vvec en lvec */
cross_v3_v3v3(plane,lvec,temp); /* a plane perpendicular to this, parrallel with lvec */
- normalize_v3(plane);
+ /* vectors are exactly aligned, use the X axis, this is arbitrary */
+ if(normalize_v3(plane) == 0.0f)
+ plane[1]= 1.0f;
/* now we've got two equations: one of a cone and one of a plane, but we have
three unknowns. We remove one unkown by rotating the plane to z=0 (the plane normal) */
@@ -892,13 +914,17 @@ static void draw_transp_spot_volume(Lamp *la, float x, float z)
static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt, int flag)
{
Object *ob= base->object;
+ const float pixsize= view3d_pixel_size(rv3d, ob->obmat[3]);
Lamp *la= ob->data;
float vec[3], lvec[3], vvec[3], circrad, x,y,z;
- float pixsize, lampsize;
+ float lampsize;
float imat[4][4], curcol[4];
- char col[4];
- int drawcone= (dt>OB_WIRE && !(G.f & G_PICKSEL) && la->type == LA_SPOT && (la->mode & LA_SHOW_CONE));
-
+ unsigned char col[4];
+ /* cone can't be drawn for duplicated lamps, because duplilist would be freed to */
+ /* the moment of view3d_draw_transp() call */
+ const short is_view= (rv3d->persp==RV3D_CAMOB && v3d->camera == base->object);
+ const short drawcone= (dt>OB_WIRE && !(G.f & G_PICKSEL) && (la->type == LA_SPOT) && (la->mode & LA_SHOW_CONE) && !(base->flag & OB_FROMDUPLI) && !is_view);
+
if(drawcone && !v3d->transp) {
/* in this case we need to draw delayed */
add_view3d_after(&v3d->afterdraw_transp, base, flag);
@@ -910,14 +936,15 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
glLoadMatrixf(rv3d->viewmat);
/* lets calculate the scale: */
- pixsize= rv3d->persmat[0][3]*ob->obmat[3][0]+ rv3d->persmat[1][3]*ob->obmat[3][1]+ rv3d->persmat[2][3]*ob->obmat[3][2]+ rv3d->persmat[3][3];
- pixsize*= rv3d->pixsize;
lampsize= pixsize*((float)U.obcenter_dia*0.5f);
/* and view aligned matrix: */
copy_m4_m4(imat, rv3d->viewinv);
normalize_v3(imat[0]);
normalize_v3(imat[1]);
+
+ /* lamp center */
+ copy_v3_v3(vec, ob->obmat[3]);
/* for AA effects */
glGetFloatv(GL_CURRENT_COLOR, curcol);
@@ -932,7 +959,6 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
}
/* Inner Circle */
- copy_v3_v3(vec, ob->obmat[3]);
glEnable(GL_BLEND);
drawcircball(GL_LINE_LOOP, vec, lampsize, imat);
glDisable(GL_BLEND);
@@ -1002,7 +1028,10 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
glPopMatrix(); /* back in object space */
zero_v3(vec);
- if ((la->type==LA_SPOT) || (la->type==LA_YF_PHOTON)) {
+ if(is_view) {
+ /* skip drawing extra info */
+ }
+ else if ((la->type==LA_SPOT) || (la->type==LA_YF_PHOTON)) {
lvec[0]=lvec[1]= 0.0;
lvec[2] = 1.0;
x = rv3d->persmat[0][2];
@@ -1145,12 +1174,12 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
setlinestyle(0);
- if(la->type==LA_SPOT && (la->mode & LA_SHAD_BUF) ) {
+ if((la->type == LA_SPOT) && (la->mode & LA_SHAD_BUF) && (is_view == FALSE)) {
drawshadbuflimits(la, ob->obmat);
}
UI_GetThemeColor4ubv(TH_LAMP, col);
- glColor4ub(col[0], col[1], col[2], col[3]);
+ glColor4ubv(col);
glEnable(GL_BLEND);
@@ -1210,10 +1239,15 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
{
/* a standing up pyramid with (0,0,0) as top */
Camera *cam;
- World *wrld;
- float nobmat[4][4], vec[8][4], fac, facx, facy, depth, aspx, aspy, caspx, caspy;
+ float vec[8][4], facx, facy, depth, aspx, aspy, caspx, caspy, shx, shy;
int i;
+ float drawsize;
+ const short is_view= (rv3d->persp==RV3D_CAMOB && ob==v3d->camera);
+ const float scax= 1.0f / len_v3(ob->obmat[0]);
+ const float scay= 1.0f / len_v3(ob->obmat[1]);
+ const float scaz= 1.0f / len_v3(ob->obmat[2]);
+
cam= ob->data;
aspx= (float) scene->r.xsch*scene->r.xasp;
aspy= (float) scene->r.ysch*scene->r.yasp;
@@ -1230,36 +1264,55 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
glDisable(GL_LIGHTING);
glDisable(GL_CULL_FACE);
- if(rv3d->persp>=2 && cam->type==CAM_ORTHO && ob==v3d->camera) {
- facx= 0.5*cam->ortho_scale*caspx;
- facy= 0.5*cam->ortho_scale*caspy;
- depth= -cam->clipsta-0.1;
+ if(cam->type==CAM_ORTHO) {
+ facx= 0.5f * cam->ortho_scale * caspx * scax;
+ facy= 0.5f * cam->ortho_scale * caspy * scay;
+ shx= cam->shiftx * cam->ortho_scale * scax;
+ shy= cam->shifty * cam->ortho_scale * scay;
+ depth= is_view ? -((cam->clipsta * scaz) + 0.1f) : - cam->drawsize * cam->ortho_scale * scaz;
+
+ drawsize= 0.5f * cam->ortho_scale;
}
else {
- fac= cam->drawsize;
- if(rv3d->persp>=2 && ob==v3d->camera) fac= cam->clipsta+0.1; /* that way it's always visible */
-
- depth= - fac*cam->lens/16.0;
- facx= fac*caspx;
- facy= fac*caspy;
+ /* that way it's always visible - clipsta+0.1 */
+ float fac;
+ drawsize= cam->drawsize / ((scax + scay + scaz) / 3.0f);
+
+ if(is_view) {
+ /* fixed depth, variable size (avoids exceeding clipping range) */
+ depth = -(cam->clipsta + 0.1);
+ fac = depth / (cam->lens/-16.0f * scaz);
+ }
+ else {
+ /* fixed size, variable depth (stays a reasonable size in the 3D view) */
+ depth= drawsize * cam->lens/-16.0f * scaz;
+ fac= drawsize;
+ }
+
+ facx= fac * caspx * scax;
+ facy= fac * caspy * scay;
+ shx= cam->shiftx*fac*2 * scax;
+ shy= cam->shifty*fac*2 * scay;
}
- vec[0][0]= 0.0; vec[0][1]= 0.0; vec[0][2]= 0.001; /* GLBUG: for picking at iris Entry (well thats old!) */
- vec[1][0]= facx; vec[1][1]= facy; vec[1][2]= depth;
- vec[2][0]= facx; vec[2][1]= -facy; vec[2][2]= depth;
- vec[3][0]= -facx; vec[3][1]= -facy; vec[3][2]= depth;
- vec[4][0]= -facx; vec[4][1]= facy; vec[4][2]= depth;
+ vec[0][0]= 0.0; vec[0][1]= 0.0; vec[0][2]= 0.0;
+ vec[1][0]= shx + facx; vec[1][1]= shy + facy; vec[1][2]= depth;
+ vec[2][0]= shx + facx; vec[2][1]= shy - facy; vec[2][2]= depth;
+ vec[3][0]= shx - facx; vec[3][1]= shy - facy; vec[3][2]= depth;
+ vec[4][0]= shx - facx; vec[4][1]= shy + facy; vec[4][2]= depth;
+ /* camera frame */
glBegin(GL_LINE_LOOP);
glVertex3fv(vec[1]);
glVertex3fv(vec[2]);
glVertex3fv(vec[3]);
glVertex3fv(vec[4]);
glEnd();
-
- if(rv3d->persp>=2 && ob==v3d->camera) return;
-
+ if(is_view)
+ return;
+
+ /* center point to camera frame */
glBegin(GL_LINE_STRIP);
glVertex3fv(vec[2]);
glVertex3fv(vec[0]);
@@ -1273,7 +1326,7 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
/* arrow on top */
vec[0][2]= depth;
-
+
/* draw an outline arrow for inactive cameras and filled
* for active cameras. We actually draw both outline+filled
* for active cameras so the wire can be seen side-on */
@@ -1281,24 +1334,26 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
if (i==0) glBegin(GL_LINE_LOOP);
else if (i==1 && (ob == v3d->camera)) glBegin(GL_TRIANGLES);
else break;
+
+ vec[0][0]= shx + ((-0.7 * drawsize) * scax);
+ vec[0][1]= shy + ((drawsize * (caspy + 0.1)) * scay);
+ glVertex3fv(vec[0]); /* left */
- vec[0][0]= -0.7*cam->drawsize*caspx;
- vec[0][1]= 1.1*cam->drawsize*caspy;
- glVertex3fv(vec[0]);
-
- vec[0][0]= 0.0;
- vec[0][1]= 1.8*cam->drawsize*caspy;
- glVertex3fv(vec[0]);
+ vec[0][0]= shx + ((0.7 * drawsize) * scax);
+ glVertex3fv(vec[0]); /* right */
- vec[0][0]= 0.7*cam->drawsize*caspx;
- vec[0][1]= 1.1*cam->drawsize*caspy;
- glVertex3fv(vec[0]);
+ vec[0][0]= shx;
+ vec[0][1]= shy + ((1.1 * drawsize * (caspy + 0.7)) * scay);
+ glVertex3fv(vec[0]); /* top */
glEnd();
}
if(flag==0) {
if(cam->flag & (CAM_SHOWLIMITS+CAM_SHOWMIST)) {
+ float nobmat[4][4];
+ World *wrld;
+
/* draw in normalized object matrix space */
copy_m4_m4(nobmat, ob->obmat);
normalize_m4(nobmat);
@@ -1463,7 +1518,7 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob)
* if not, ED_view3d_init_mats_rv3d() can be used for selection tools
* but would not give correct results with dupli's for eg. which dont
* use the object matrix in the useual way */
-static void mesh_foreachScreenVert__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+static void mesh_foreachScreenVert__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
{
struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index); void *userData; ViewContext vc; int clipVerts; } *data = userData;
EditVert *eve = EM_get_vert_for_index(index);
@@ -1547,7 +1602,7 @@ void mesh_foreachScreenEdge(ViewContext *vc, void (*func)(void *userData, EditEd
dm->release(dm);
}
-static void mesh_foreachScreenFace__mapFunc(void *userData, int index, float *cent, float *no)
+static void mesh_foreachScreenFace__mapFunc(void *userData, int index, float *cent, float *UNUSED(no))
{
struct { void (*func)(void *userData, EditFace *efa, int x, int y, int index); void *userData; ViewContext vc; } *data = userData;
EditFace *efa = EM_get_face_for_index(index);
@@ -1658,7 +1713,7 @@ static void draw_dm_face_normals(Scene *scene, DerivedMesh *dm)
glEnd();
}
-static void draw_dm_face_centers__mapFunc(void *userData, int index, float *cent, float *no)
+static void draw_dm_face_centers__mapFunc(void *userData, int index, float *cent, float *UNUSED(no))
{
EditFace *efa = EM_get_face_for_index(index);
int sel = *((int*) userData);
@@ -1702,7 +1757,7 @@ static void draw_dm_vert_normals(Scene *scene, DerivedMesh *dm)
}
/* Draw verts with color set based on selection */
-static void draw_dm_verts__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+static void draw_dm_verts__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
{
struct { int sel; EditVert *eve_act; } * data = userData;
EditVert *eve = EM_get_vert_for_index(index);
@@ -1779,7 +1834,7 @@ static void draw_dm_edges_sel(DerivedMesh *dm, unsigned char *baseCol, unsigned
}
/* Draw edges */
-static int draw_dm_edges__setDrawOptions(void *userData, int index)
+static int draw_dm_edges__setDrawOptions(void *UNUSED(userData), int index)
{
return EM_get_edge_for_index(index)->h==0;
}
@@ -1789,7 +1844,7 @@ static void draw_dm_edges(DerivedMesh *dm)
}
/* Draw edges with color interpolated based on selection */
-static int draw_dm_edges_sel_interp__setDrawOptions(void *userData, int index)
+static int draw_dm_edges_sel_interp__setDrawOptions(void *UNUSED(userData), int index)
{
return EM_get_edge_for_index(index)->h==0;
}
@@ -1808,13 +1863,14 @@ static void draw_dm_edges_sel_interp__setDrawInterpOptions(void *userData, int i
static void draw_dm_edges_sel_interp(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol)
{
- unsigned char *cols[2] = {baseCol, selCol};
-
+ unsigned char *cols[2];
+ cols[0]= baseCol;
+ cols[1]= selCol;
dm->drawMappedEdgesInterp(dm, draw_dm_edges_sel_interp__setDrawOptions, draw_dm_edges_sel_interp__setDrawInterpOptions, cols);
}
/* Draw only seam edges */
-static int draw_dm_edges_seams__setDrawOptions(void *userData, int index)
+static int draw_dm_edges_seams__setDrawOptions(void *UNUSED(userData), int index)
{
EditEdge *eed = EM_get_edge_for_index(index);
@@ -1826,7 +1882,7 @@ static void draw_dm_edges_seams(DerivedMesh *dm)
}
/* Draw only sharp edges */
-static int draw_dm_edges_sharp__setDrawOptions(void *userData, int index)
+static int draw_dm_edges_sharp__setDrawOptions(void *UNUSED(userData), int index)
{
EditEdge *eed = EM_get_edge_for_index(index);
@@ -1840,7 +1896,7 @@ static void draw_dm_edges_sharp(DerivedMesh *dm)
/* Draw faces with color set based on selection
* return 2 for the active face so it renders with stipple enabled */
-static int draw_dm_faces_sel__setDrawOptions(void *userData, int index, int *drawSmooth_r)
+static int draw_dm_faces_sel__setDrawOptions(void *userData, int index, int *UNUSED(drawSmooth_r))
{
struct { unsigned char *cols[3]; EditFace *efa_act; } * data = userData;
EditFace *efa = EM_get_face_for_index(index);
@@ -1869,10 +1925,10 @@ static void draw_dm_faces_sel(DerivedMesh *dm, unsigned char *baseCol, unsigned
data.cols[2] = actCol;
data.efa_act = efa_act;
- dm->drawMappedFaces(dm, draw_dm_faces_sel__setDrawOptions, &data, 0);
+ dm->drawMappedFaces(dm, draw_dm_faces_sel__setDrawOptions, &data, 0, GPU_enable_material);
}
-static int draw_dm_creases__setDrawOptions(void *userData, int index)
+static int draw_dm_creases__setDrawOptions(void *UNUSED(userData), int index)
{
EditEdge *eed = EM_get_edge_for_index(index);
@@ -1890,7 +1946,7 @@ static void draw_dm_creases(DerivedMesh *dm)
glLineWidth(1.0);
}
-static int draw_dm_bweights__setDrawOptions(void *userData, int index)
+static int draw_dm_bweights__setDrawOptions(void *UNUSED(userData), int index)
{
EditEdge *eed = EM_get_edge_for_index(index);
@@ -1901,7 +1957,7 @@ static int draw_dm_bweights__setDrawOptions(void *userData, int index)
return 0;
}
}
-static void draw_dm_bweights__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+static void draw_dm_bweights__mapFunc(void *UNUSED(userData), int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
{
EditVert *eve = EM_get_vert_for_index(index);
@@ -1936,7 +1992,7 @@ static void draw_dm_bweights(Scene *scene, DerivedMesh *dm)
/* EditMesh drawing routines*/
-static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, EditMesh *em, DerivedMesh *cageDM, EditVert *eve_act)
+static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, DerivedMesh *cageDM, EditVert *eve_act)
{
ToolSettings *ts= scene->toolsettings;
int sel;
@@ -1944,7 +2000,7 @@ static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, EditM
if(v3d->zbuf) glDepthMask(0); // disable write in zbuffer, zbuf select
for (sel=0; sel<2; sel++) {
- char col[4], fcol[4];
+ unsigned char col[4], fcol[4];
int pass;
UI_GetThemeColor3ubv(sel?TH_VERTEX_SELECT:TH_VERTEX, col);
@@ -1972,13 +2028,13 @@ static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, EditM
if(ts->selectmode & SCE_SELECT_VERTEX) {
glPointSize(size);
- glColor4ubv((GLubyte *)col);
+ glColor4ubv(col);
draw_dm_verts(cageDM, sel, eve_act);
}
if(check_ob_drawface_dot(scene, v3d, obedit->dt)) {
glPointSize(fsize);
- glColor4ubv((GLubyte *)fcol);
+ glColor4ubv(fcol);
draw_dm_face_centers(cageDM, sel);
}
@@ -2000,9 +2056,9 @@ static void draw_em_fancy_edges(Scene *scene, View3D *v3d, Mesh *me, DerivedMesh
unsigned char wireCol[4], selCol[4], actCol[4];
/* since this function does transparant... */
- UI_GetThemeColor4ubv(TH_EDGE_SELECT, (char *)selCol);
- UI_GetThemeColor4ubv(TH_WIRE, (char *)wireCol);
- UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, (char *)actCol);
+ UI_GetThemeColor4ubv(TH_EDGE_SELECT, selCol);
+ UI_GetThemeColor4ubv(TH_WIRE, wireCol);
+ UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, actCol);
/* when sel only is used, dont render wire, only selected, this is used for
* textured draw mode when the 'edges' option is disabled */
@@ -2059,42 +2115,30 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
float v1[3], v2[3], v3[3], v4[3], vmid[3];
float fvec[3];
char val[32]; /* Stores the measurement display text here */
- char conv_float[5]; /* Use a float conversion matching the grid size */
- float area, col[3]; /* area of the face, color of the text to draw */
+ const char *conv_float; /* Use a float conversion matching the grid size */
+ unsigned char col[3]; /* color of the text to draw */
+ float area; /* area of the face */
float grid= unit->system ? unit->scale_length : v3d->grid;
const int do_split= unit->flag & USER_UNIT_OPT_SPLIT;
const int do_global= v3d->flag & V3D_GLOBAL_STATS;
const int do_moving= G.moving;
- if(v3d->flag2 & V3D_RENDER_OVERRIDE)
- return;
-
/* make the precision of the pronted value proportionate to the gridsize */
- if (grid < 0.01f)
- strcpy(conv_float, "%.6f");
- else if (grid < 0.1f)
- strcpy(conv_float, "%.5f");
- else if (grid < 1.0f)
- strcpy(conv_float, "%.4f");
- else if (grid < 10.0f)
- strcpy(conv_float, "%.3f");
- else
- strcpy(conv_float, "%.2f");
-
-
+ if (grid < 0.01f) conv_float= "%.6g";
+ else if (grid < 0.1f) conv_float= "%.5g";
+ else if (grid < 1.0f) conv_float= "%.4g";
+ else if (grid < 10.0f) conv_float= "%.3g";
+ else conv_float= "%.2g";
+
if(v3d->zbuf && (v3d->flag & V3D_ZBUF_SELECT)==0)
glDisable(GL_DEPTH_TEST);
if(v3d->zbuf) bglPolygonOffset(rv3d->dist, 5.0f);
- if(me->drawflag & ME_DRAW_EDGELEN) {
- UI_GetThemeColor3fv(TH_TEXT, col);
- /* make color a bit more red */
- if(col[0]> 0.5f) {col[1]*=0.7f; col[2]*= 0.7f;}
- else col[0]= col[0]*0.7f + 0.3f;
- glColor3fv(col);
-
+ if(me->drawflag & ME_DRAWEXTRA_EDGELEN) {
+ UI_GetThemeColor3ubv(TH_DRAWEXTRA_EDGELEN, col);
+
for(eed= em->edges.first; eed; eed= eed->next) {
/* draw non fgon edges, or selected edges, or edges next to selected verts while draging */
if((eed->h != EM_FGON) && ((eed->f & SELECT) || (do_moving && ((eed->v1->f & SELECT) || (eed->v2->f & SELECT)) ))) {
@@ -2112,19 +2156,14 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
else
sprintf(val, conv_float, len_v3v3(v1, v2));
- view3d_cached_text_draw_add(vmid[0], vmid[1], vmid[2], val, 0, 0);
+ view3d_cached_text_draw_add(vmid, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
}
}
- if(me->drawflag & ME_DRAW_FACEAREA) {
+ if(me->drawflag & ME_DRAWEXTRA_FACEAREA) {
// XXX extern int faceselectedOR(EditFace *efa, int flag); // editmesh.h shouldn't be in this file... ok for now?
-
- UI_GetThemeColor3fv(TH_TEXT, col);
- /* make color a bit more green */
- if(col[1]> 0.5f) {col[0]*=0.7f; col[2]*= 0.7f;}
- else col[1]= col[1]*0.7f + 0.3f;
- glColor3fv(col);
+ UI_GetThemeColor3ubv(TH_DRAWEXTRA_FACEAREA, col);
for(efa= em->faces.first; efa; efa= efa->next) {
if((efa->f & SELECT)) { // XXX || (do_moving && faceselectedOR(efa, SELECT)) ) {
@@ -2151,20 +2190,14 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
else
sprintf(val, conv_float, area);
- view3d_cached_text_draw_add(efa->cent[0], efa->cent[1], efa->cent[2], val, 0, 0);
+ view3d_cached_text_draw_add(efa->cent, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
}
}
- if(me->drawflag & ME_DRAW_EDGEANG) {
+ if(me->drawflag & ME_DRAWEXTRA_FACEANG) {
EditEdge *e1, *e2, *e3, *e4;
-
- UI_GetThemeColor3fv(TH_TEXT, col);
- /* make color a bit more blue */
- if(col[2]> 0.5f) {col[0]*=0.7f; col[1]*= 0.7f;}
- else col[2]= col[2]*0.7f + 0.3f;
- glColor3fv(col);
-
+ UI_GetThemeColor3ubv(TH_DRAWEXTRA_FACEANG, col);
for(efa= em->faces.first; efa; efa= efa->next) {
copy_v3_v3(v1, efa->v1->co);
copy_v3_v3(v2, efa->v2->co);
@@ -2191,31 +2224,31 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
if( (e4->f & e1->f & SELECT) || (do_moving && (efa->v1->f & SELECT)) ) {
/* Vec 1 */
- sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v4, v1, v2)));
+ sprintf(val,"%.3g", RAD2DEG(angle_v3v3v3(v4, v1, v2)));
interp_v3_v3v3(fvec, efa->cent, efa->v1->co, 0.8f);
- view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0, 0);
+ view3d_cached_text_draw_add(fvec, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
if( (e1->f & e2->f & SELECT) || (do_moving && (efa->v2->f & SELECT)) ) {
/* Vec 2 */
- sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v1, v2, v3)));
+ sprintf(val,"%.3g", RAD2DEG(angle_v3v3v3(v1, v2, v3)));
interp_v3_v3v3(fvec, efa->cent, efa->v2->co, 0.8f);
- view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0, 0);
+ view3d_cached_text_draw_add(fvec, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
if( (e2->f & e3->f & SELECT) || (do_moving && (efa->v3->f & SELECT)) ) {
/* Vec 3 */
if(efa->v4)
- sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v2, v3, v4)));
+ sprintf(val,"%.3g", RAD2DEG(angle_v3v3v3(v2, v3, v4)));
else
- sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v2, v3, v1)));
+ sprintf(val,"%.3g", RAD2DEG(angle_v3v3v3(v2, v3, v1)));
interp_v3_v3v3(fvec, efa->cent, efa->v3->co, 0.8f);
- view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0, 0);
+ view3d_cached_text_draw_add(fvec, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
/* Vec 4 */
if(efa->v4) {
if( (e3->f & e4->f & SELECT) || (do_moving && (efa->v4->f & SELECT)) ) {
- sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v3, v4, v1)));
+ sprintf(val,"%.3g", RAD2DEG(angle_v3v3v3(v3, v4, v1)));
interp_v3_v3v3(fvec, efa->cent, efa->v4->co, 0.8f);
- view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0, 0);
+ view3d_cached_text_draw_add(fvec, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
}
}
@@ -2227,7 +2260,7 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
}
}
-static int draw_em_fancy__setFaceOpts(void *userData, int index, int *drawSmooth_r)
+static int draw_em_fancy__setFaceOpts(void *UNUSED(userData), int index, int *UNUSED(drawSmooth_r))
{
EditFace *efa = EM_get_face_for_index(index);
@@ -2239,7 +2272,7 @@ static int draw_em_fancy__setFaceOpts(void *userData, int index, int *drawSmooth
return 0;
}
-static int draw_em_fancy__setGLSLFaceOpts(void *userData, int index)
+static int draw_em_fancy__setGLSLFaceOpts(void *UNUSED(userData), int index)
{
EditFace *efa = EM_get_face_for_index(index);
@@ -2289,7 +2322,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
glEnable(GL_LIGHTING);
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
- finalDM->drawMappedFaces(finalDM, draw_em_fancy__setFaceOpts, 0, 0);
+ finalDM->drawMappedFaces(finalDM, draw_em_fancy__setFaceOpts, 0, 0, GPU_enable_material);
glFrontFace(GL_CCW);
glDisable(GL_LIGHTING);
@@ -2309,12 +2342,12 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
}
}
- if((me->drawflag & (ME_DRAWFACES)) || paint_facesel_test(ob)) { /* transp faces */
+ if(me->drawflag & ME_DRAWFACES) { /* transp faces */
unsigned char col1[4], col2[4], col3[4];
- UI_GetThemeColor4ubv(TH_FACE, (char *)col1);
- UI_GetThemeColor4ubv(TH_FACE_SELECT, (char *)col2);
- UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, (char *)col3);
+ UI_GetThemeColor4ubv(TH_FACE, col1);
+ UI_GetThemeColor4ubv(TH_FACE_SELECT, col2);
+ UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, col3);
glEnable(GL_BLEND);
glDepthMask(0); // disable write in zbuffer, needed for nice transp
@@ -2333,7 +2366,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
* */
unsigned char col1[4], col2[4], col3[4];
col1[3] = col2[3] = 0; /* dont draw */
- UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, (char *)col3);
+ UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, col3);
glEnable(GL_BLEND);
glDepthMask(0); // disable write in zbuffer, needed for nice transp
@@ -2385,7 +2418,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
if(em) {
// XXX retopo_matrix_update(v3d);
- draw_em_fancy_verts(scene, v3d, ob, em, cageDM, eve_act);
+ draw_em_fancy_verts(scene, v3d, ob, cageDM, eve_act);
if(me->drawflag & ME_DRAWNORMALS) {
UI_ThemeColor(TH_NORMAL);
@@ -2396,7 +2429,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
draw_dm_vert_normals(scene, cageDM);
}
- if(me->drawflag & (ME_DRAW_EDGELEN|ME_DRAW_FACEAREA|ME_DRAW_EDGEANG))
+ if(me->drawflag & (ME_DRAWEXTRA_EDGELEN|ME_DRAWEXTRA_FACEAREA|ME_DRAWEXTRA_FACEANG) && !((v3d->flag2 & V3D_RENDER_OVERRIDE)))
draw_em_measure_stats(v3d, rv3d, ob, em, &scene->unit);
}
@@ -2435,7 +2468,7 @@ static void draw_mesh_object_outline(View3D *v3d, Object *ob, DerivedMesh *dm)
}
}
-static int wpaint__setSolidDrawOptions(void *userData, int index, int *drawSmooth_r)
+static int wpaint__setSolidDrawOptions(void *UNUSED(userData), int UNUSED(index), int *drawSmooth_r)
{
*drawSmooth_r = 1;
return 1;
@@ -2446,11 +2479,12 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
Object *ob= base->object;
Mesh *me = ob->data;
Material *ma= give_current_material(ob, 1);
- int hasHaloMat = (ma && (ma->material_type == MA_TYPE_HALO));
+ const short hasHaloMat = (ma && (ma->material_type == MA_TYPE_HALO));
+ const short is_paint_sel= (ob==OBACT && paint_facesel_test(ob));
int draw_wire = 0;
- int totvert, totedge, totface;
+ int /* totvert,*/ totedge, totface;
DispList *dl;
- DerivedMesh *dm= mesh_get_derived_final(scene, ob, v3d->customdata_mask);
+ DerivedMesh *dm= mesh_get_derived_final(scene, ob, scene->customdata_mask);
if(!dm)
return;
@@ -2459,7 +2493,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
draw_wire = 2; /* draw wire after solid using zoffset and depth buffer adjusment */
}
- totvert = dm->getNumVerts(dm);
+ /* totvert = dm->getNumVerts(dm); */ /*UNUSED*/
totedge = dm->getNumEdges(dm);
totface = dm->getNumFaces(dm);
@@ -2468,7 +2502,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
// Unwanted combination.
- if (ob==OBACT && paint_facesel_test(ob)) draw_wire = 0;
+ if (is_paint_sel) draw_wire = 0;
if(dt==OB_BOUNDBOX) {
if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0)
@@ -2482,11 +2516,10 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
else if(dt==OB_WIRE || totface==0) {
draw_wire = 1; /* draw wire only, no depth buffer stuff */
}
- else if( (ob==OBACT && (ob->mode & OB_MODE_TEXTURE_PAINT || paint_facesel_test(ob))) ||
+ else if( (is_paint_sel || (ob==OBACT && ob->mode & OB_MODE_TEXTURE_PAINT)) ||
CHECK_OB_DRAWTEXTURE(v3d, dt))
{
- int faceselect= (ob==OBACT && paint_facesel_test(ob));
- if ((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !(G.f&G_PICKSEL || paint_facesel_test(ob)) && !draw_wire) {
+ if ((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !(G.f&G_PICKSEL || is_paint_sel) && !draw_wire) {
draw_mesh_object_outline(v3d, ob, dm);
}
@@ -2501,10 +2534,10 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
glFrontFace(GL_CCW);
}
else {
- draw_mesh_textured(scene, v3d, rv3d, ob, dm, faceselect);
+ draw_mesh_textured(scene, v3d, rv3d, ob, dm, is_paint_sel);
}
- if(!faceselect) {
+ if(!is_paint_sel) {
if(base->flag & SELECT)
UI_ThemeColor((ob==OBACT)?TH_ACTIVE:TH_SELECT);
else
@@ -2519,25 +2552,26 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
/* weight paint in solid mode, special case. focus on making the weights clear
* rather then the shading, this is also forced in wire view */
GPU_enable_material(0, NULL);
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me->mface, 1);
-
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me->mface, 1, GPU_enable_material);
+
bglPolygonOffset(rv3d->dist, 1.0);
glDepthMask(0); // disable write in zbuffer, selected edge wires show better
glEnable(GL_BLEND);
- glColor4ub(196, 196, 196, 196);
+ glColor4ub(255, 255, 255, 96);
glEnable(GL_LINE_STIPPLE);
- glLineStipple(1, 0x8888);
+ glLineStipple(1, 0xAAAA);
- dm->drawEdges(dm, 1, 0);
+ dm->drawEdges(dm, 1, 1);
bglPolygonOffset(rv3d->dist, 0.0);
glDepthMask(1);
glDisable(GL_LINE_STIPPLE);
GPU_disable_material();
-
-
+
+ /* since we already draw wire as wp guide, dont draw over the top */
+ draw_wire= 0;
}
else {
Paint *p;
@@ -2601,7 +2635,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me->mface, 1);
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me->mface, 1, GPU_enable_material);
glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHTING);
@@ -2609,10 +2643,10 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
}
else if(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_TEXTURE_PAINT)) {
if(me->mcol)
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 1);
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 1, GPU_enable_material);
else {
glColor3f(1.0f, 1.0f, 1.0f);
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 0);
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 0, GPU_enable_material);
}
}
else do_draw= 1;
@@ -2625,7 +2659,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
dm->release(dm);
shadeDispList(scene, base);
dl = find_displist(&ob->disp, DL_VERTCOL);
- dm= mesh_get_derived_final(scene, ob, v3d->customdata_mask);
+ dm= mesh_get_derived_final(scene, ob, scene->customdata_mask);
}
if ((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !draw_wire) {
@@ -2734,7 +2768,7 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
finalDM = cageDM = editmesh_get_derived_base(ob, em);
else
cageDM = editmesh_get_derived_cage_and_final(scene, ob, em, &finalDM,
- v3d->customdata_mask);
+ scene->customdata_mask);
if(dt>OB_WIRE) {
// no transp in editmode, the fancy draw over goes bad then
@@ -3113,7 +3147,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
case OB_CURVE:
cu= ob->data;
- lb= &cu->disp;
+ lb= &ob->disp;
if(solid) {
dl= lb->first;
@@ -3160,7 +3194,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
break;
case OB_SURF:
- lb= &((Curve *)ob->data)->disp;
+ lb= &ob->disp;
if(solid) {
dl= lb->first;
@@ -3253,16 +3287,22 @@ static void draw_particle_arrays(int draw_as, int totpoint, int ob_dt, int selec
static void draw_particle(ParticleKey *state, int draw_as, short draw, float pixsize, float imat[4][4], float *draw_line, ParticleBillboardData *bb, ParticleDrawData *pdd)
{
float vec[3], vec2[3];
- float *vd = pdd->vd;
- float *cd = pdd->cd;
+ float *vd = NULL;
+ float *cd = NULL;
float ma_r=0.0f;
float ma_g=0.0f;
float ma_b=0.0f;
- if(pdd->ma_r) {
- ma_r = *pdd->ma_r;
- ma_g = *pdd->ma_g;
- ma_b = *pdd->ma_b;
+ /* null only for PART_DRAW_CIRC */
+ if(pdd) {
+ vd = pdd->vd;
+ cd = pdd->cd;
+
+ if(pdd->ma_r) {
+ ma_r = *pdd->ma_r;
+ ma_g = *pdd->ma_g;
+ ma_b = *pdd->ma_b;
+ }
}
switch(draw_as){
@@ -3286,13 +3326,15 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix
vec[1]=vec[2]=0.0;
mul_qt_v3(state->rot,vec);
if(draw_as==PART_DRAW_AXIS) {
- cd[1]=cd[2]=cd[4]=cd[5]=0.0;
- cd[0]=cd[3]=1.0;
- cd[6]=cd[8]=cd[9]=cd[11]=0.0;
- cd[7]=cd[10]=1.0;
- cd[13]=cd[12]=cd[15]=cd[16]=0.0;
- cd[14]=cd[17]=1.0;
- pdd->cd+=18;
+ if(cd) {
+ cd[1]=cd[2]=cd[4]=cd[5]=0.0;
+ cd[0]=cd[3]=1.0;
+ cd[6]=cd[8]=cd[9]=cd[11]=0.0;
+ cd[7]=cd[10]=1.0;
+ cd[13]=cd[12]=cd[15]=cd[16]=0.0;
+ cd[14]=cd[17]=1.0;
+ pdd->cd+=18;
+ }
copy_v3_v3(vec2,state->co);
}
@@ -3354,8 +3396,6 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix
}
case PART_DRAW_CIRC:
{
- if(pdd->ma_r)
- glColor3f(ma_r,ma_g,ma_b);
drawcircball(GL_LINE_LOOP, state->co, pixsize, imat);
break;
}
@@ -3408,24 +3448,24 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix
static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, ParticleSystem *psys, int ob_dt)
{
Object *ob=base->object;
- ParticleSystemModifierData *psmd;
ParticleEditSettings *pset = PE_settings(scene);
ParticleSettings *part;
ParticleData *pars, *pa;
ParticleKey state, *states=0;
ParticleBillboardData bb;
- ParticleSimulationData sim = {scene, ob, psys, NULL};
+ ParticleSimulationData sim= {0};
ParticleDrawData *pdd = psys->pdd;
Material *ma;
float vel[3], imat[4][4];
float timestep, pixsize=1.0, pa_size, r_tilt, r_length;
float pa_time, pa_birthtime, pa_dietime, pa_health;
- float cfra= bsystem_time(scene, ob,(float)CFRA,0.0);
+ float cfra;
float ma_r=0.0f, ma_g=0.0f, ma_b=0.0f;
int a, totpart, totpoint=0, totve=0, drawn, draw_as, totchild=0;
int select=ob->flag&SELECT, create_cdata=0, need_v=0;
GLint polygonmode[2];
char val[32];
+ unsigned char tcol[4]= {0, 0, 0, 255};
/* 1. */
if(psys==0)
@@ -3452,7 +3492,10 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
return;
/* 2. */
- sim.psmd = psmd = psys_get_modifier(ob,psys);
+ sim.scene= scene;
+ sim.ob= ob;
+ sim.psys= psys;
+ sim.psmd = psys_get_modifier(ob,psys);
if(part->phystype==PART_PHYS_KEYED){
if(psys->flag&PSYS_KEYED){
@@ -3480,20 +3523,14 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
if(v3d->zbuf) glDepthMask(1);
if((ma) && (part->draw&PART_DRAW_MAT_COL)) {
- glColor3f(ma->r,ma->g,ma->b);
+ rgb_float_to_byte(&(ma->r), tcol);
ma_r = ma->r;
ma_g = ma->g;
ma_b = ma->b;
}
- else
- cpack(0);
- if(pdd) {
- pdd->ma_r = &ma_r;
- pdd->ma_g = &ma_g;
- pdd->ma_b = &ma_b;
- }
+ glColor3ubv(tcol);
timestep= psys_get_timestep(&sim);
@@ -3530,8 +3567,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
case PART_DRAW_CROSS:
case PART_DRAW_AXIS:
/* lets calculate the scale: */
- pixsize= rv3d->persmat[0][3]*ob->obmat[3][0]+ rv3d->persmat[1][3]*ob->obmat[3][1]+ rv3d->persmat[2][3]*ob->obmat[3][2]+ rv3d->persmat[3][3];
- pixsize*= rv3d->pixsize;
+ pixsize= view3d_pixel_size(rv3d, ob->obmat[3]);
+
if(part->draw_size==0.0)
pixsize*=2.0;
else
@@ -3647,12 +3684,24 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
pdd->nd= pdd->ndata;
pdd->tot_vec_size= tot_vec_size;
}
+ else if(psys->pdd) {
+ psys_free_pdd(psys);
+ MEM_freeN(psys->pdd);
+ pdd = psys->pdd = NULL;
+ }
+
+ if(pdd) {
+ pdd->ma_r = &ma_r;
+ pdd->ma_g = &ma_g;
+ pdd->ma_b = &ma_b;
+ }
psys->lattice= psys_get_lattice(&sim);
- if(pdd && draw_as!=PART_DRAW_PATH){
+ /* circles don't use drawdata, so have to add a special case here */
+ if((pdd || draw_as==PART_DRAW_CIRC) && draw_as!=PART_DRAW_PATH){
/* 5. */
- if((pdd->flag & PARTICLE_DRAW_DATA_UPDATED)
+ if(pdd && (pdd->flag & PARTICLE_DRAW_DATA_UPDATED)
&& (pdd->vedata || part->draw & (PART_DRAW_SIZE|PART_DRAW_NUM|PART_DRAW_HEALTH))==0) {
totpoint = pdd->totpoint; /* draw data is up to date */
}
@@ -3798,7 +3847,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
if(drawn) {
/* additional things to draw for each particle */
/* (velocity, size and number) */
- if((part->draw & PART_DRAW_VEL) && pdd->vedata){
+ if((part->draw & PART_DRAW_VEL) && pdd && pdd->vedata){
copy_v3_v3(pdd->ved,state.co);
pdd->ved += 3;
mul_v3_v3fl(vel, state.vel, timestep);
@@ -3820,16 +3869,24 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
char *val_pos= val;
val[0]= '\0';
- if(part->draw&PART_DRAW_NUM)
- val_pos += sprintf(val, "%i", a);
-
- if((part->draw & PART_DRAW_HEALTH) && a < totpart && part->phystype==PART_PHYS_BOIDS)
- sprintf(val_pos, (val_pos==val) ? "%.2f" : ":%.2f", pa_health);
+ if(part->draw&PART_DRAW_NUM) {
+ if(a < totpart && (part->draw & PART_DRAW_HEALTH) && (part->phystype==PART_PHYS_BOIDS)) {
+ sprintf(val_pos, "%d:%.2f", a, pa_health);
+ }
+ else {
+ sprintf(val_pos, "%d", a);
+ }
+ }
+ else {
+ if(a < totpart && (part->draw & PART_DRAW_HEALTH) && (part->phystype==PART_PHYS_BOIDS)) {
+ sprintf(val_pos, "%.2f", pa_health);
+ }
+ }
/* in path drawing state.co is the end point */
/* use worldspace beause object matrix is already applied */
mul_v3_m4v3(vec_txt, ob->imat, state.co);
- view3d_cached_text_draw_add(vec_txt[0], vec_txt[1], vec_txt[2], val, 10, V3D_CACHE_TEXT_WORLDSPACE);
+ view3d_cached_text_draw_add(vec_txt, val, 10, V3D_CACHE_TEXT_WORLDSPACE|V3D_CACHE_TEXT_ASCII, tcol);
}
}
}
@@ -3918,12 +3975,10 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
for(a=0, pa=psys->particles; a<totpart; a++, pa++){
float vec_txt[3];
- val[0]= '\0';
-
sprintf(val, "%i", a);
/* use worldspace beause object matrix is already applied */
mul_v3_m4v3(vec_txt, ob->imat, cache[a]->co);
- view3d_cached_text_draw_add(vec_txt[0], vec_txt[1], vec_txt[2], val, 10, V3D_CACHE_TEXT_WORLDSPACE);
+ view3d_cached_text_draw_add(vec_txt, val, 10, V3D_CACHE_TEXT_WORLDSPACE|V3D_CACHE_TEXT_ASCII, tcol);
}
}
}
@@ -4029,7 +4084,7 @@ static void draw_update_ptcache_edit(Scene *scene, Object *ob, PTCacheEdit *edit
psys_cache_edit_paths(scene, ob, edit, CFRA);
}
-static void draw_ptcache_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, PTCacheEdit *edit, int dt)
+static void draw_ptcache_edit(Scene *scene, View3D *v3d, PTCacheEdit *edit)
{
ParticleCacheKey **cache, *path, *pkey;
PTCacheEditPoint *point;
@@ -4064,8 +4119,8 @@ static void draw_ptcache_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Obj
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
- glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+ glEnable(GL_COLOR_MATERIAL);
glShadeModel(GL_SMOOTH);
if(pset->brushtype == PE_BRUSH_WEIGHT) {
@@ -4734,9 +4789,17 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
while (nr-->0) { /* accounts for empty bevel lists */
float fac= bevp->radius * ts->normalsize;
- float vec_a[3] = { fac,0, 0}; // Offset perpendicular to the curve
- float vec_b[3] = {-fac,0, 0}; // Delta along the curve
+ float vec_a[3]; // Offset perpendicular to the curve
+ float vec_b[3]; // Delta along the curve
+ vec_a[0]= fac;
+ vec_a[1]= 0.0f;
+ vec_a[2]= 0.0f;
+
+ vec_b[0]= -fac;
+ vec_b[1]= 0.0f;
+ vec_b[2]= 0.0f;
+
mul_qt_v3(bevp->quat, vec_a);
mul_qt_v3(bevp->quat, vec_b);
add_v3_v3(vec_a, bevp->vec);
@@ -4823,9 +4886,9 @@ static void draw_empty_cone (float size)
}
/* draw points on curve speed handles */
+#if 0 // XXX old animation system stuff
static void curve_draw_speed(Scene *scene, Object *ob)
{
-#if 0 // XXX old animation system stuff
Curve *cu= ob->data;
IpoCurve *icu;
BezTriple *bezt;
@@ -4851,8 +4914,8 @@ static void curve_draw_speed(Scene *scene, Object *ob)
glPointSize(1.0);
bglEnd();
-#endif // XXX old animation system stuff
}
+#endif // XXX old animation system stuff
static void draw_textcurs(float textcurs[][2])
@@ -5308,10 +5371,12 @@ static void draw_bounding_volume(Scene *scene, Object *ob)
bb= ob->bb ? ob->bb : ( (Curve *)ob->data )->bb;
}
else if(ob->type==OB_MBALL) {
- bb= ob->bb;
- if(bb==0) {
- makeDispListMBall(scene, ob);
+ if(is_basis_mball(ob)) {
bb= ob->bb;
+ if(bb==0) {
+ makeDispListMBall(scene, ob);
+ bb= ob->bb;
+ }
}
}
else {
@@ -5362,7 +5427,7 @@ static void drawtexspace(Object *ob)
}
/* draws wire outline */
-static void drawSolidSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
+static void drawObjectSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
{
RegionView3D *rv3d= ar->regiondata;
Object *ob= base->object;
@@ -5378,7 +5443,7 @@ static void drawSolidSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
if (dm) {
hasfaces= dm->getNumFaces(dm);
} else {
- hasfaces= displist_has_faces(&cu->disp);
+ hasfaces= displist_has_faces(&ob->disp);
}
if (hasfaces && boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) {
@@ -5386,13 +5451,15 @@ static void drawSolidSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
if (dm) {
draw_mesh_object_outline(v3d, ob, dm);
} else {
- drawDispListwire(&cu->disp);
+ drawDispListwire(&ob->disp);
}
draw_index_wire= 1;
}
} else if (ob->type==OB_MBALL) {
- if((base->flag & OB_FROMDUPLI)==0)
- drawDispListwire(&ob->disp);
+ if(is_basis_mball(ob)) {
+ if((base->flag & OB_FROMDUPLI)==0)
+ drawDispListwire(&ob->disp);
+ }
}
else if(ob->type==OB_ARMATURE) {
if(!(ob->mode & OB_MODE_POSE))
@@ -5439,14 +5506,16 @@ static void drawWireExtra(Scene *scene, RegionView3D *rv3d, Object *ob)
if (ob->derivedFinal) {
drawCurveDMWired(ob);
} else {
- drawDispListwire(&cu->disp);
+ drawDispListwire(&ob->disp);
}
if (ob->type==OB_CURVE)
draw_index_wire= 1;
}
} else if (ob->type==OB_MBALL) {
- drawDispListwire(&ob->disp);
+ if(is_basis_mball(ob)) {
+ drawDispListwire(&ob->disp);
+ }
}
glDepthMask(1);
@@ -5487,30 +5556,37 @@ static void draw_hooks(Object *ob)
void drawRBpivot(bRigidBodyJointConstraint *data)
{
int axis;
- float v1[3]= {data->pivX, data->pivY, data->pivZ};
- float eu[3]= {data->axX, data->axY, data->axZ};
float mat[4][4];
- eul_to_mat4(mat,eu);
+ /* color */
+ float curcol[4];
+ unsigned char tcol[4];
+ glGetFloatv(GL_CURRENT_COLOR, curcol);
+ rgb_float_to_byte(curcol, tcol);
+ tcol[3]= 255;
+
+ eul_to_mat4(mat,&data->axX);
glLineWidth (4.0f);
setlinestyle(2);
for (axis=0; axis<3; axis++) {
float dir[3] = {0,0,0};
- float v[3]= {data->pivX, data->pivY, data->pivZ};
+ float v[3];
+
+ copy_v3_v3(v, &data->pivX);
dir[axis] = 1.f;
glBegin(GL_LINES);
mul_m4_v3(mat,dir);
add_v3_v3(v, dir);
- glVertex3fv(v1);
+ glVertex3fv(&data->pivX);
glVertex3fv(v);
glEnd();
if (axis==0)
- view3d_cached_text_draw_add(v[0], v[1], v[2], "px", 0, 0);
+ view3d_cached_text_draw_add(v, "px", 0, V3D_CACHE_TEXT_ASCII, tcol);
else if (axis==1)
- view3d_cached_text_draw_add(v[0], v[1], v[2], "py", 0, 0);
+ view3d_cached_text_draw_add(v, "py", 0, V3D_CACHE_TEXT_ASCII, tcol);
else
- view3d_cached_text_draw_add(v[0], v[1], v[2], "pz", 0, 0);
+ view3d_cached_text_draw_add(v, "pz", 0, V3D_CACHE_TEXT_ASCII, tcol);
}
glLineWidth (1.0f);
setlinestyle(0);
@@ -5648,13 +5724,13 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
bAnimVizSettings *avs= &ob->avs;
/* setup drawing environment for paths */
- draw_motion_paths_init(scene, v3d, ar);
+ draw_motion_paths_init(v3d, ar);
/* draw motion path for object */
- draw_motion_path_instance(scene, v3d, ar, ob, NULL, avs, ob->mpath);
+ draw_motion_path_instance(scene, ob, NULL, avs, ob->mpath);
/* cleanup after drawing */
- draw_motion_paths_cleanup(scene, v3d, ar);
+ draw_motion_paths_cleanup(v3d);
}
/* multiply view with object matrix.
@@ -5751,17 +5827,16 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
/* bad exception, solve this! otherwise outline shows too late */
if(ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
- cu= ob->data;
/* still needed for curves hidden in other layers. depgraph doesnt handle that yet */
- if (cu->disp.first==NULL) makeDispListCurveTypes(scene, ob, 0);
+ if (ob->disp.first==NULL) makeDispListCurveTypes(scene, ob, 0);
}
- /* draw outline for selected solid objects, mesh does itself */
+ /* draw outline for selected objects, mesh does itself */
if((v3d->flag & V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && ob->type!=OB_MESH) {
- if(dt>OB_WIRE && dt<OB_TEXTURE && (ob->mode & OB_MODE_EDIT)==0 && (flag & DRAW_SCENESET)==0) {
+ if(dt>OB_WIRE && (ob->mode & OB_MODE_EDIT)==0 && (flag & DRAW_SCENESET)==0) {
if (!(ob->dtx&OB_DRAWWIRE) && (ob->flag&SELECT) && !(flag&DRAW_PICKING)) {
- drawSolidSelect(scene, v3d, ar, base);
+ drawObjectSelect(scene, v3d, ar, base);
}
}
}
@@ -5878,9 +5953,9 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
else if(boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) {
empty_object= drawDispList(scene, v3d, rv3d, base, dt);
-
- if(cu->path)
- curve_draw_speed(scene, ob);
+
+//XXX old animsys if(cu->path)
+// curve_draw_speed(scene, ob);
}
break;
case OB_MBALL:
@@ -5899,7 +5974,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
case OB_EMPTY:
if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0)
- drawaxes(ob->empty_drawsize, flag, ob->empty_drawtype);
+ drawaxes(ob->empty_drawsize, ob->empty_drawtype);
break;
case OB_LAMP:
if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
@@ -5925,7 +6000,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
break;
default:
if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
- drawaxes(1.0, flag, OB_ARROWS);
+ drawaxes(1.0, OB_ARROWS);
}
}
@@ -5978,7 +6053,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
draw_new_particle_system(scene, v3d, rv3d, base, psys, dt);
}
-
+ invert_m4_m4(ob->imat, ob->obmat);
view3d_cached_text_draw_end(v3d, ar, 0, NULL);
glMultMatrixf(ob->obmat);
@@ -5997,7 +6072,8 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
PTCacheEdit *edit = PE_create_current(scene, ob);
if(edit) {
glLoadMatrixf(rv3d->viewmat);
- draw_ptcache_edit(scene, v3d, rv3d, ob, edit, dt);
+ draw_update_ptcache_edit(scene, ob, edit);
+ draw_ptcache_edit(scene, v3d, edit);
glMultMatrixf(ob->obmat);
}
}
@@ -6046,12 +6122,14 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
// only draw domains
if(smd->domain && smd->domain->fluid)
{
- if(!smd->domain->wt || !(smd->domain->viewsettings & MOD_SMOKE_VIEW_SHOWBIG))
+ if(CFRA < smd->domain->point_cache[0]->startframe)
+ ; /* don't show smoke before simulation starts, this could be made an option in the future */
+ else if(!smd->domain->wt || !(smd->domain->viewsettings & MOD_SMOKE_VIEW_SHOWBIG))
{
// #if 0
smd->domain->tex = NULL;
GPU_create_smoke(smd, 0);
- draw_volume(scene, ar, v3d, base, smd->domain->tex, smd->domain->p0, smd->domain->p1, smd->domain->res, smd->domain->dx, smd->domain->tex_shadow);
+ draw_volume(ar, smd->domain->tex, smd->domain->p0, smd->domain->p1, smd->domain->res, smd->domain->dx, smd->domain->tex_shadow);
GPU_free_smoke(smd);
// #endif
#if 0
@@ -6102,7 +6180,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
{
smd->domain->tex = NULL;
GPU_create_smoke(smd, 1);
- draw_volume(scene, ar, v3d, base, smd->domain->tex, smd->domain->p0, smd->domain->p1, smd->domain->res_wt, smd->domain->dx_wt, smd->domain->tex_shadow);
+ draw_volume(ar, smd->domain->tex, smd->domain->p0, smd->domain->p1, smd->domain->res_wt, smd->domain->dx_wt, smd->domain->tex_shadow);
GPU_free_smoke(smd);
}
}
@@ -6125,7 +6203,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if(dtx && (G.f & G_RENDER_OGL)==0) {
if(dtx & OB_AXIS) {
- drawaxes(1.0f, flag, OB_ARROWS);
+ drawaxes(1.0f, OB_ARROWS);
}
if(dtx & OB_BOUNDBOX) {
if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0)
@@ -6136,7 +6214,13 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
/* patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing */
/* but, we also dont draw names for sets or duplicators */
if(flag == 0) {
- view3d_cached_text_draw_add(0.0f, 0.0f, 0.0f, ob->id.name+2, 10, 0);
+ float zero[3]= {0,0,0};
+ float curcol[4];
+ unsigned char tcol[4];
+ glGetFloatv(GL_CURRENT_COLOR, curcol);
+ rgb_float_to_byte(curcol, tcol);
+ tcol[3]= 255;
+ view3d_cached_text_draw_add(zero, ob->id.name+2, 10, 0, tcol);
}
}
/*if(dtx & OB_DRAWIMAGE) drawDispListwire(&ob->disp);*/
@@ -6158,6 +6242,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
/* return warning, this is cached text draw */
+ invert_m4_m4(ob->imat, ob->obmat);
view3d_cached_text_draw_end(v3d, ar, 1, NULL);
glLoadMatrixf(rv3d->viewmat);
@@ -6216,15 +6301,16 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
/* Drawing the constraint lines */
- list = &ob->constraints;
- if (list) {
+ if (ob->constraints.first) {
bConstraint *curcon;
bConstraintOb *cob;
- char col[4], col2[4];
+ unsigned char col1[4], col2[4];
+
+ list = &ob->constraints;
- UI_GetThemeColor3ubv(TH_GRID, col);
- UI_make_axis_color(col, col2, 'z');
- glColor3ubv((GLubyte *)col2);
+ UI_GetThemeColor3ubv(TH_GRID, col1);
+ UI_make_axis_color(col1, col2, 'Z');
+ glColor3ubv(col2);
cob= constraints_make_evalob(scene, ob, NULL, CONSTRAINT_OBTYPE_OBJECT);
@@ -6265,7 +6351,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
/* ***************** BACKBUF SEL (BBS) ********* */
-static void bbs_mesh_verts__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+static void bbs_mesh_verts__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
{
int offset = (intptr_t) userData;
EditVert *eve = EM_get_vert_for_index(index);
@@ -6301,7 +6387,7 @@ static void bbs_mesh_wire(DerivedMesh *dm, int offset)
dm->drawMappedEdges(dm, bbs_mesh_wire__setDrawOptions, (void*)(intptr_t) offset);
}
-static int bbs_mesh_solid__setSolidDrawOptions(void *userData, int index, int *drawSmooth_r)
+static int bbs_mesh_solid__setSolidDrawOptions(void *userData, int index, int *UNUSED(drawSmooth_r))
{
if (EM_get_face_for_index(index)->h==0) {
if (userData) {
@@ -6313,7 +6399,7 @@ static int bbs_mesh_solid__setSolidDrawOptions(void *userData, int index, int *d
}
}
-static void bbs_mesh_solid__drawCenter(void *userData, int index, float *cent, float *no)
+static void bbs_mesh_solid__drawCenter(void *UNUSED(userData), int index, float *cent, float *UNUSED(no))
{
EditFace *efa = EM_get_face_for_index(index);
@@ -6330,7 +6416,7 @@ static void bbs_mesh_solid_EM(Scene *scene, View3D *v3d, Object *ob, DerivedMesh
cpack(0);
if (facecol) {
- dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, (void*)(intptr_t) 1, 0);
+ dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, (void*)(intptr_t) 1, 0, GPU_enable_material);
if(check_ob_drawface_dot(scene, v3d, ob->dt)) {
glPointSize(UI_GetThemeValuef(TH_FACEDOT_SIZE));
@@ -6341,17 +6427,17 @@ static void bbs_mesh_solid_EM(Scene *scene, View3D *v3d, Object *ob, DerivedMesh
}
} else {
- dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, (void*) 0, 0);
+ dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, (void*) 0, 0, GPU_enable_material);
}
}
-static int bbs_mesh_solid__setDrawOpts(void *userData, int index, int *drawSmooth_r)
+static int bbs_mesh_solid__setDrawOpts(void *UNUSED(userData), int index, int *UNUSED(drawSmooth_r))
{
WM_set_framebuffer_index_color(index+1);
return 1;
}
-static int bbs_mesh_solid_hide__setDrawOpts(void *userData, int index, int *drawSmooth_r)
+static int bbs_mesh_solid_hide__setDrawOpts(void *userData, int index, int *UNUSED(drawSmooth_r))
{
Mesh *me = userData;
@@ -6363,16 +6449,15 @@ static int bbs_mesh_solid_hide__setDrawOpts(void *userData, int index, int *draw
}
}
-static void bbs_mesh_solid(Scene *scene, View3D *v3d, Object *ob)
+static void bbs_mesh_solid(Scene *scene, Object *ob)
{
- DerivedMesh *dm = mesh_get_derived_final(scene, ob, v3d->customdata_mask);
+ DerivedMesh *dm = mesh_get_derived_final(scene, ob, scene->customdata_mask);
Mesh *me = (Mesh*)ob->data;
- int face_sel_mode = (me->flag & ME_EDIT_PAINT_MASK) ? 1:0;
glColor3ub(0, 0, 0);
- if(face_sel_mode) dm->drawMappedFaces(dm, bbs_mesh_solid_hide__setDrawOpts, me, 0);
- else dm->drawMappedFaces(dm, bbs_mesh_solid__setDrawOpts, me, 0);
+ if((me->editflag & ME_EDIT_PAINT_MASK)) dm->drawMappedFaces(dm, bbs_mesh_solid_hide__setDrawOpts, me, 0, GPU_enable_material);
+ else dm->drawMappedFaces(dm, bbs_mesh_solid__setDrawOpts, me, 0, GPU_enable_material);
dm->release(dm);
}
@@ -6422,7 +6507,7 @@ void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec
EM_free_index_arrays();
}
- else bbs_mesh_solid(scene, v3d, ob);
+ else bbs_mesh_solid(scene, ob);
}
break;
case OB_CURVE:
@@ -6479,7 +6564,7 @@ static void draw_object_mesh_instance(Scene *scene, View3D *v3d, RegionView3D *r
GPU_end_object_materials();
}
else if(edm)
- edm->drawMappedFaces(edm, NULL, NULL, 0);
+ edm->drawMappedFaces(edm, NULL, NULL, 0, GPU_enable_material);
glDisable(GL_LIGHTING);
}
@@ -6498,7 +6583,7 @@ void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
draw_object_mesh_instance(scene, v3d, rv3d, ob, dt, outline);
break;
case OB_EMPTY:
- drawaxes(ob->empty_drawsize, 0, ob->empty_drawtype);
+ drawaxes(ob->empty_drawsize, ob->empty_drawtype);
break;
}
}
diff --git a/source/blender/editors/space_view3d/drawvolume.c b/source/blender/editors/space_view3d/drawvolume.c
index 678920f8173..0f6e0bdc834 100644
--- a/source/blender/editors/space_view3d/drawvolume.c
+++ b/source/blender/editors/space_view3d/drawvolume.c
@@ -31,10 +31,6 @@
#include "MEM_guardedalloc.h"
-
-
-
-
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_view3d_types.h"
@@ -44,6 +40,7 @@
#include "BLI_editVert.h"
#include "BLI_edgehash.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_curve.h"
#include "BKE_constraint.h" // for the get_constraint_target function
@@ -65,7 +62,7 @@
#include "BKE_particle.h"
#include "BKE_property.h"
#include "BKE_smoke.h"
-#include "BKE_utildefines.h"
+
#include "smoke_API.h"
#include "BIF_gl.h"
@@ -100,7 +97,7 @@ static void tend ( void )
{
QueryPerformanceCounter ( &liCurrentTime );
}
-static double tval()
+static double tval( void )
{
return ((double)( (liCurrentTime.QuadPart - liStartTime.QuadPart)* (double)1000.0/(double)liFrequency.QuadPart ));
}
@@ -175,7 +172,7 @@ static int larger_pow2(int n)
return n*2;
}
-void draw_volume(Scene *scene, ARegion *ar, View3D *v3d, Base *base, GPUTexture *tex, float *min, float *max, int res[3], float dx, GPUTexture *tex_shadow)
+void draw_volume(ARegion *ar, GPUTexture *tex, float *min, float *max, int res[3], float dx, GPUTexture *tex_shadow)
{
RegionView3D *rv3d= ar->regiondata;
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index c6b92fae1c0..9ec68d62364 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -37,7 +37,9 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
+#include "BKE_object.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -191,21 +193,24 @@ static SpaceLink *view3d_new(const bContext *C)
v3d->lay= v3d->layact= scene->lay;
v3d->camera= scene->camera;
}
- v3d->scenelock= 1;
+ v3d->scenelock= TRUE;
v3d->grid= 1.0f;
v3d->gridlines= 16;
v3d->gridsubdiv = 10;
- v3d->drawtype= OB_WIRE;
+ v3d->drawtype= OB_SOLID;
v3d->gridflag |= V3D_SHOW_X;
v3d->gridflag |= V3D_SHOW_Y;
v3d->gridflag |= V3D_SHOW_FLOOR;
v3d->gridflag &= ~V3D_SHOW_Z;
+ v3d->flag |= V3D_SELECT_OUTLINE;
+
v3d->lens= 35.0f;
v3d->near= 0.01f;
v3d->far= 500.0f;
+ v3d->twflag |= U.tw_flag & V3D_USE_MANIPULATOR;
v3d->twtype= V3D_MANIP_TRANSLATE;
v3d->around= V3D_CENTROID;
@@ -249,8 +254,8 @@ static SpaceLink *view3d_new(const bContext *C)
ar->regiondata= MEM_callocN(sizeof(RegionView3D), "region view3d");
rv3d= ar->regiondata;
rv3d->viewquat[0]= 1.0f;
- rv3d->persp= 1;
- rv3d->view= 7;
+ rv3d->persp= RV3D_PERSP;
+ rv3d->view= RV3D_VIEW_PERSPORTHO;
rv3d->dist= 10.0;
return (SpaceLink *)v3d;
@@ -274,7 +279,7 @@ static void view3d_free(SpaceLink *sl)
/* spacetype; init callback */
-static void view3d_init(struct wmWindowManager *wm, ScrArea *sa)
+static void view3d_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -316,6 +321,10 @@ static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar)
/* object ops. */
+ /* important to be before Pose keymap since they can both be enabled at once */
+ keymap= WM_keymap_find(wm->defaultconf, "Face Mask", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
/* pose is not modal, operator poll checks for this */
keymap= WM_keymap_find(wm->defaultconf, "Pose", 0, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
@@ -331,9 +340,6 @@ static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar)
keymap= WM_keymap_find(wm->defaultconf, "Weight Paint", 0, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
-
- keymap= WM_keymap_find(wm->defaultconf, "Face Mask", 0, 0);
- WM_event_add_keymap_handler(&ar->handlers, keymap);
keymap= WM_keymap_find(wm->defaultconf, "Sculpt", 0, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
@@ -387,7 +393,7 @@ static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar)
}
-static int view3d_ob_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int view3d_ob_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_ID) {
ID *id= (ID *)drag->poin;
@@ -397,7 +403,7 @@ static int view3d_ob_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
return 0;
}
-static int view3d_mat_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int view3d_mat_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_ID) {
ID *id= (ID *)drag->poin;
@@ -407,7 +413,7 @@ static int view3d_mat_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
return 0;
}
-static int view3d_ima_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int view3d_ima_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_ID) {
ID *id= (ID *)drag->poin;
@@ -477,7 +483,7 @@ static void view3d_dropboxes(void)
WM_dropbox_add(lb, "OBJECT_OT_add_named_cursor", view3d_ob_drop_poll, view3d_ob_drop_copy);
WM_dropbox_add(lb, "OBJECT_OT_drop_named_material", view3d_mat_drop_poll, view3d_id_drop_copy);
WM_dropbox_add(lb, "MESH_OT_drop_named_image", view3d_ima_ob_drop_poll, view3d_id_path_drop_copy);
- WM_dropbox_add(lb, "VIEW3D_OT_add_background_image", view3d_ima_bg_drop_poll, view3d_id_path_drop_copy);
+ WM_dropbox_add(lb, "VIEW3D_OT_background_image_add", view3d_ima_bg_drop_poll, view3d_id_path_drop_copy);
}
@@ -529,39 +535,40 @@ static void *view3d_main_area_duplicate(void *poin)
return NULL;
}
-static void view3d_recalc_used_layers(ARegion *ar, wmNotifier *wmn)
+static void view3d_recalc_used_layers(ARegion *ar, wmNotifier *wmn, Scene *scene)
{
wmWindow *win= wmn->wm->winactive;
ScrArea *sa;
+ unsigned int lay_used= 0;
+ Base *base;
if (!win) return;
- sa= win->screen->areabase.first;
+ base= scene->base.first;
+ while(base) {
+ lay_used |= base->lay & ((1<<20)-1); /* ignore localview */
- while(sa) {
- if(sa->spacetype == SPACE_VIEW3D)
- if(BLI_findindex(&sa->regionbase, ar) >= 0) {
- View3D *v3d= sa->spacedata.first;
- Scene *scene= wmn->reference;
- Base *base;
-
- v3d->lay_used= 0;
- base= scene->base.first;
- while(base) {
- v3d->lay_used|= base->lay;
+ if (lay_used == (1<<20)-1)
+ break;
- base= base->next;
- }
+ base= base->next;
+ }
+ for(sa= win->screen->areabase.first; sa; sa= sa->next) {
+ if(sa->spacetype == SPACE_VIEW3D) {
+ if(BLI_findindex(&sa->regionbase, ar) != -1) {
+ View3D *v3d= sa->spacedata.first;
+ v3d->lay_used= lay_used;
break;
}
-
- sa= sa->next;
+ }
}
}
static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
{
+ bScreen *sc;
+
/* context changes */
switch(wmn->category) {
case NC_ANIMATION:
@@ -584,7 +591,7 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
case NC_SCENE:
switch(wmn->data) {
case ND_LAYER_CONTENT:
- view3d_recalc_used_layers(ar, wmn);
+ view3d_recalc_used_layers(ar, wmn, wmn->reference);
ED_region_tag_redraw(ar);
break;
case ND_FRAME:
@@ -597,6 +604,9 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
case ND_MODE:
ED_region_tag_redraw(ar);
break;
+ case ND_WORLD:
+ /* handled by space_view3d_listener() for v3d access */
+ break;
}
if (wmn->action == NA_EDITED)
ED_region_tag_redraw(ar);
@@ -615,6 +625,11 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
ED_region_tag_redraw(ar);
break;
}
+ switch(wmn->action) {
+ case NA_ADDED:
+ ED_region_tag_redraw(ar);
+ break;
+ }
break;
case NC_GEOM:
switch(wmn->data) {
@@ -647,8 +662,15 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
case NC_WORLD:
switch(wmn->data) {
case ND_WORLD_DRAW:
- ED_region_tag_redraw(ar);
+ /* handled by space_view3d_listener() for v3d access */
break;
+ case ND_WORLD_STARS:
+ {
+ RegionView3D *rv3d= ar->regiondata;
+ if(rv3d->persp == RV3D_CAMOB) {
+ ED_region_tag_redraw(ar);
+ }
+ }
}
break;
case NC_LAMP:
@@ -681,16 +703,29 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
ED_region_tag_redraw(ar);
break;
case NC_SCREEN:
- if(wmn->data == ND_GPENCIL)
- ED_region_tag_redraw(ar);
- else if(wmn->data==ND_ANIMPLAY)
- ED_region_tag_redraw(ar);
+ switch(wmn->data) {
+ case ND_GPENCIL:
+ case ND_ANIMPLAY:
+ case ND_SKETCH:
+ ED_region_tag_redraw(ar);
+ break;
+ case ND_SCREENBROWSE:
+ case ND_SCREENDELETE:
+ case ND_SCREENSET:
+ /* screen was changed, need to update used layers due to NC_SCENE|ND_LAYER_CONTENT */
+ /* updates used layers only for View3D in active screen */
+ sc= wmn->reference;
+ view3d_recalc_used_layers(ar, wmn, sc->scene);
+ ED_region_tag_redraw(ar);
+ break;
+ }
+
break;
}
}
/* concept is to retrieve cursor type context-less */
-static void view3d_main_area_cursor(wmWindow *win, ScrArea *sa, ARegion *ar)
+static void view3d_main_area_cursor(wmWindow *win, ScrArea *UNUSED(sa), ARegion *UNUSED(ar))
{
Scene *scene= win->screen->scene;
@@ -726,6 +761,7 @@ static void view3d_header_area_listener(ARegion *ar, wmNotifier *wmn)
case ND_FRAME:
case ND_OB_ACTIVE:
case ND_OB_SELECT:
+ case ND_OB_VISIBLE:
case ND_MODE:
case ND_LAYER:
case ND_TOOLSETTINGS:
@@ -779,6 +815,7 @@ static void view3d_buttons_area_listener(ARegion *ar, wmNotifier *wmn)
case ND_FRAME:
case ND_OB_ACTIVE:
case ND_OB_SELECT:
+ case ND_OB_VISIBLE:
case ND_MODE:
case ND_LAYER:
case ND_LAYER_CONTENT:
@@ -872,12 +909,53 @@ static void view3d_props_area_listener(ARegion *ar, wmNotifier *wmn)
}
}
+/*area (not region) level listener*/
+void space_view3d_listener(struct ScrArea *sa, struct wmNotifier *wmn)
+{
+ View3D *v3d = sa->spacedata.first;
+
+ /* context changes */
+ switch(wmn->category) {
+ case NC_SCENE:
+ switch(wmn->data) {
+ case ND_WORLD:
+ if(v3d->flag2 & V3D_RENDER_OVERRIDE)
+ ED_area_tag_redraw_regiontype(sa, RGN_TYPE_WINDOW);
+ break;
+ }
+ break;
+ case NC_WORLD:
+ switch(wmn->data) {
+ case ND_WORLD_DRAW:
+ if(v3d->flag2 & V3D_RENDER_OVERRIDE)
+ ED_area_tag_redraw_regiontype(sa, RGN_TYPE_WINDOW);
+ break;
+ }
+ break;
+
+ }
+
+#if 0 // removed since BKE_image_user_calc_frame is now called in draw_bgpic because screen_ops doesnt call the notifier.
+ if (wmn->category == NC_SCENE && wmn->data == ND_FRAME) {
+ View3D *v3d = area->spacedata.first;
+ BGpic *bgpic = v3d->bgpicbase.first;
+
+ for (; bgpic; bgpic = bgpic->next) {
+ if (bgpic->ima) {
+ Scene *scene = wmn->reference;
+ BKE_image_user_calc_frame(&bgpic->iuser, scene->r.cfra, 0);
+ }
+ }
+ }
+#endif
+}
+
static int view3d_context(const bContext *C, const char *member, bContextDataResult *result)
{
View3D *v3d= CTX_wm_view3d(C);
Scene *scene= CTX_data_scene(C);
Base *base;
- int lay = v3d ? v3d->lay:scene->lay; /* fallback to the scene layer, allows duplicate and other oject operators to run outside the 3d view */
+ unsigned int lay = v3d ? v3d->lay:scene->lay; /* fallback to the scene layer, allows duplicate and other oject operators to run outside the 3d view */
if(CTX_data_dir(member)) {
static const char *dir[] = {
@@ -974,23 +1052,6 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
return -1; /* found but not available */
}
-/*area (not region) level listener*/
-#if 0 // removed since BKE_image_user_calc_frame is now called in draw_bgpic because screen_ops doesnt call the notifier.
-void space_view3d_listener(struct ScrArea *area, struct wmNotifier *wmn)
-{
- if (wmn->category == NC_SCENE && wmn->data == ND_FRAME) {
- View3D *v3d = area->spacedata.first;
- BGpic *bgpic = v3d->bgpicbase.first;
-
- for (; bgpic; bgpic = bgpic->next) {
- if (bgpic->ima) {
- Scene *scene = wmn->reference;
- BKE_image_user_calc_frame(&bgpic->iuser, scene->r.cfra, 0);
- }
- }
- }
-}
-#endif
/* only called once, from space/spacetypes.c */
void ED_spacetype_view3d(void)
@@ -1004,7 +1065,7 @@ void ED_spacetype_view3d(void)
st->new= view3d_new;
st->free= view3d_free;
st->init= view3d_init;
-// st->listener = space_view3d_listener;
+ st->listener = space_view3d_listener;
st->duplicate= view3d_duplicate;
st->operatortypes= view3d_operatortypes;
st->keymap= view3d_keymap;
diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c
index a0167c87d87..53a4981661f 100644
--- a/source/blender/editors/space_view3d/view3d_buttons.c
+++ b/source/blender/editors/space_view3d/view3d_buttons.c
@@ -45,6 +45,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_action.h"
#include "BKE_context.h"
@@ -56,7 +57,6 @@
#include "BKE_screen.h"
#include "BKE_deform.h"
-
#include "WM_api.h"
#include "WM_types.h"
@@ -128,7 +128,7 @@ typedef struct {
/* is used for both read and write... */
-static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d, Object *ob, float lim)
+static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float lim)
{
uiBlock *block= (layout)? uiLayoutAbsoluteBlock(layout): NULL;
MDeformVert *dvert=NULL;
@@ -281,32 +281,32 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
mul_m4_v3(ob->obmat, median);
if(block) { // buttons
- int but_y;
- if((ob->parent) && (ob->partype == PARBONE)) but_y = 135;
- else but_y = 150;
-
-
-
+ uiBut *but;
+
memcpy(tfp->ve_median, median, sizeof(tfp->ve_median));
uiBlockBeginAlign(block);
if(tot==1) {
uiDefBut(block, LABEL, 0, "Vertex:", 0, 130, 200, 20, 0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "X:", 0, 110, 200, 20, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Y:", 0, 90, 200, 20, &(tfp->ve_median[1]), -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Z:", 0, 70, 200, 20, &(tfp->ve_median[2]), -lim, lim, 10, 3, "");
-
+
+ but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "X:", 0, 110, 200, 20, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
+ but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Y:", 0, 90, 200, 20, &(tfp->ve_median[1]), -lim, lim, 10, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
+ but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Z:", 0, 70, 200, 20, &(tfp->ve_median[2]), -lim, lim, 10, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
+
if(totw==1) {
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "W:", 0, 50, 200, 20, &(tfp->ve_median[3]), 0.01, 100.0, 10, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "W:", 0, 50, 200, 20, &(tfp->ve_median[3]), 0.01, 100.0, 1, 3, "");
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, B_REDR, "Global", 0, 25, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays global values");
uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, B_REDR, "Local", 100, 25, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays local values");
uiBlockEndAlign(block);
if(totweight)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 0, 0, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 0, 0, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 1, 3, "");
if(totradius)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:", 0, 0, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 10, 3, "Radius of curve CPs");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:", 0, 0, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 1, 3, "Radius of curve CPs");
}
else {
uiBlockBeginAlign(block);
@@ -322,11 +322,14 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
else {
uiDefBut(block, LABEL, 0, "Median:", 0, 130, 200, 20, 0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "X:", 0, 110, 200, 20, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Y:", 0, 90, 200, 20, &(tfp->ve_median[1]), -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Z:", 0, 70, 200, 20, &(tfp->ve_median[2]), -lim, lim, 10, 3, "");
+ but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "X:", 0, 110, 200, 20, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
+ but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Y:", 0, 90, 200, 20, &(tfp->ve_median[1]), -lim, lim, 10, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
+ but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Z:", 0, 70, 200, 20, &(tfp->ve_median[2]), -lim, lim, 10, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
if(totw==tot) {
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "W:", 0, 50, 200, 20, &(tfp->ve_median[3]), 0.01, 100.0, 10, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "W:", 0, 50, 200, 20, &(tfp->ve_median[3]), 0.01, 100.0, 1, 3, "");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, B_REDR, "Global", 0, 25, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays global values");
@@ -344,17 +347,17 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, B_REDR, "Local", 100, 45, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays local values");
uiBlockEndAlign(block);
if(totweight)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 0, 20, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, "Weight is used for SoftBody Goal");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 0, 20, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 1, 3, "Weight is used for SoftBody Goal");
if(totradius)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:", 0, 0, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 10, 3, "Radius of curve CPs");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:", 0, 0, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 1, 3, "Radius of curve CPs");
uiBlockEndAlign(block);
}
}
if(totedge==1)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Crease:", 0, 20, 200, 20, &(tfp->ve_median[3]), 0.0, 1.0, 10, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Crease:", 0, 20, 200, 20, &(tfp->ve_median[3]), 0.0, 1.0, 1, 3, "");
else if(totedge>1)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Mean Crease:", 0, 20, 200, 20, &(tfp->ve_median[3]), 0.0, 1.0, 10, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Mean Crease:", 0, 20, 200, 20, &(tfp->ve_median[3]), 0.0, 1.0, 1, 3, "");
}
else { // apply
@@ -373,30 +376,66 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
if(ob->type==OB_MESH) {
Mesh *me= ob->data;
EditMesh *em = BKE_mesh_get_editmesh(me);
- EditVert *eve;
- EditEdge *eed;
-
- eve= em->verts.first;
- while(eve) {
- if(eve->f & SELECT) {
- add_v3_v3(eve->co, median);
+
+ /* allow for some rounding error becasue of matrix transform */
+ if(len_v3(median) > 0.000001) {
+ EditVert *eve;
+
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ if(eve->f & SELECT) {
+ add_v3_v3(eve->co, median);
+ }
}
- eve= eve->next;
+
+ recalc_editnormals(em);
}
-
- for(eed= em->edges.first; eed; eed= eed->next) {
- if(eed->f & SELECT) {
- /* ensure the median can be set to zero or one */
- if(ve_median[3]==0.0f) eed->crease= 0.0f;
- else if(ve_median[3]==1.0f) eed->crease= 1.0f;
+
+ if(median[3] != 0.0f) {
+ EditEdge *eed;
+ const float fixed_crease= (ve_median[3] <= 0.0f ? 0.0 : (ve_median[3] >= 1.0f ? 1.0 : FLT_MAX));
+
+ if(fixed_crease != FLT_MAX) {
+ /* simple case */
+
+ for(eed= em->edges.first; eed; eed= eed->next) {
+ if(eed->f & SELECT) {
+ eed->crease= fixed_crease;
+ }
+ }
+ }
+ else {
+ /* scale crease to target median */
+ float median_new= ve_median[3];
+ float median_orig= ve_median[3] - median[3]; /* previous median value */
+
+ /* incase of floating point error */
+ CLAMP(median_orig, 0.0, 1.0);
+ CLAMP(median_new, 0.0, 1.0);
+
+ if(median_new < median_orig) {
+ /* scale down */
+ const float sca= median_new / median_orig;
+
+ for(eed= em->edges.first; eed; eed= eed->next) {
+ if(eed->f & SELECT) {
+ eed->crease *= sca;
+ CLAMP(eed->crease, 0.0, 1.0);
+ }
+ }
+ }
else {
- eed->crease+= median[3];
- CLAMP(eed->crease, 0.0, 1.0);
+ /* scale up */
+ const float sca= (1.0f - median_new) / (1.0f - median_orig);
+
+ for(eed= em->edges.first; eed; eed= eed->next) {
+ if(eed->f & SELECT) {
+ eed->crease = 1.0f - ((1.0f - eed->crease) * sca);
+ CLAMP(eed->crease, 0.0, 1.0);
+ }
+ }
}
}
}
-
- recalc_editnormals(em);
BKE_mesh_end_editmesh(me, em);
}
@@ -643,7 +682,7 @@ static void vgroup_normalize_active(Object *ob)
}
-static void do_view3d_vgroup_buttons(bContext *C, void *arg, int event)
+static void do_view3d_vgroup_buttons(bContext *C, void *UNUSED(arg), int event)
{
Scene *scene= CTX_data_scene(C);
Object *ob= OBACT;
@@ -666,11 +705,11 @@ static void do_view3d_vgroup_buttons(bContext *C, void *arg, int event)
// ED_vgroup_mirror(ob, 1, 1, 0);
/* default for now */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
}
-int view3d_panel_vgroup_poll(const bContext *C, PanelType *pt)
+int view3d_panel_vgroup_poll(const bContext *C, PanelType *UNUSED(pt))
{
Scene *scene= CTX_data_scene(C);
Object *ob= OBACT;
@@ -740,61 +779,61 @@ static void v3d_transform_butsR(uiLayout *layout, PointerRNA *ptr)
uiLayoutSetActive(split, !(bone->parent && bone->flag & BONE_CONNECTED));
}
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "location", 0, "Location", 0);
+ uiItemR(colsub, ptr, "location", 0, "Location", ICON_NULL);
colsub = uiLayoutColumn(split, 1);
- uiItemL(colsub, "", 0);
- uiItemR(colsub, ptr, "lock_location", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemL(colsub, "", ICON_NULL);
+ uiItemR(colsub, ptr, "lock_location", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
split = uiLayoutSplit(layout, 0.8, 0);
switch(RNA_enum_get(ptr, "rotation_mode")) {
case ROT_MODE_QUAT: /* quaternion */
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "rotation_quaternion", 0, "Rotation", 0);
+ uiItemR(colsub, ptr, "rotation_quaternion", 0, "Rotation", ICON_NULL);
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, "4L", 0);
+ uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, "4L", ICON_NULL);
if (RNA_boolean_get(ptr, "lock_rotations_4d"))
- uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
else
- uiItemL(colsub, "", 0);
- uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemL(colsub, "", ICON_NULL);
+ uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
break;
case ROT_MODE_AXISANGLE: /* axis angle */
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "rotation_axis_angle", 0, "Rotation", 0);
+ uiItemR(colsub, ptr, "rotation_axis_angle", 0, "Rotation", ICON_NULL);
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, "4L", 0);
+ uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, "4L", ICON_NULL);
if (RNA_boolean_get(ptr, "lock_rotations_4d"))
- uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
else
- uiItemL(colsub, "", 0);
- uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemL(colsub, "", ICON_NULL);
+ uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
break;
default: /* euler rotations */
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "rotation_euler", 0, "Rotation", 0);
+ uiItemR(colsub, ptr, "rotation_euler", 0, "Rotation", ICON_NULL);
colsub = uiLayoutColumn(split, 1);
- uiItemL(colsub, "", 0);
- uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemL(colsub, "", ICON_NULL);
+ uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
break;
}
- uiItemR(layout, ptr, "rotation_mode", 0, "", 0);
+ uiItemR(layout, ptr, "rotation_mode", 0, "", ICON_NULL);
split = uiLayoutSplit(layout, 0.8, 0);
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "scale", 0, "Scale", 0);
+ uiItemR(colsub, ptr, "scale", 0, "Scale", ICON_NULL);
colsub = uiLayoutColumn(split, 1);
- uiItemL(colsub, "", 0);
- uiItemR(colsub, ptr, "lock_scale", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemL(colsub, "", ICON_NULL);
+ uiItemR(colsub, ptr, "lock_scale", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
if (ptr->type == &RNA_Object) {
Object *ob = ptr->data;
if (ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL))
- uiItemR(layout, ptr, "dimensions", 0, "Dimensions", 0);
+ uiItemR(layout, ptr, "dimensions", 0, "Dimensions", ICON_NULL);
}
}
-static void v3d_posearmature_buts(uiLayout *layout, View3D *v3d, Object *ob, float lim)
+static void v3d_posearmature_buts(uiLayout *layout, Object *ob)
{
// uiBlock *block= uiLayoutGetBlock(layout);
// bArmature *arm;
@@ -803,13 +842,14 @@ static void v3d_posearmature_buts(uiLayout *layout, View3D *v3d, Object *ob, flo
PointerRNA pchanptr;
uiLayout *col;
// uiLayout *row;
+// uiBut *but;
pchan= get_active_posechannel(ob);
// row= uiLayoutRow(layout, 0);
if (!pchan) {
- uiItemL(layout, "No Bone Active", 0);
+ uiItemL(layout, "No Bone Active", ICON_NULL);
return;
}
@@ -841,9 +881,13 @@ static void v3d_posearmature_buts(uiLayout *layout, View3D *v3d, Object *ob, flo
uiDefBut(block, LABEL, 0, "Location:", 0, 240, 100, 20, 0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_ARMATUREPANEL2, "X:", 0, 220, 120, 19, pchan->loc, -lim, lim, 100, 3, "");
- uiDefButF(block, NUM, B_ARMATUREPANEL2, "Y:", 0, 200, 120, 19, pchan->loc+1, -lim, lim, 100, 3, "");
- uiDefButF(block, NUM, B_ARMATUREPANEL2, "Z:", 0, 180, 120, 19, pchan->loc+2, -lim, lim, 100, 3, "");
+
+ but= uiDefButF(block, NUM, B_ARMATUREPANEL2, "X:", 0, 220, 120, 19, pchan->loc, -lim, lim, 100, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
+ but= uiDefButF(block, NUM, B_ARMATUREPANEL2, "Y:", 0, 200, 120, 19, pchan->loc+1, -lim, lim, 100, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
+ but= uiDefButF(block, NUM, B_ARMATUREPANEL2, "Z:", 0, 180, 120, 19, pchan->loc+2, -lim, lim, 100, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
@@ -884,19 +928,19 @@ static void v3d_posearmature_buts(uiLayout *layout, View3D *v3d, Object *ob, flo
void validate_editbonebutton_cb(bContext *C, void *bonev, void *namev)
{
EditBone *eBone= bonev;
- char oldname[32], newname[32];
-
+ char oldname[sizeof(eBone->name)], newname[sizeof(eBone->name)];
+
/* need to be on the stack */
- BLI_strncpy(newname, eBone->name, 32);
- BLI_strncpy(oldname, (char *)namev, 32);
+ BLI_strncpy(newname, eBone->name, sizeof(eBone->name));
+ BLI_strncpy(oldname, (char *)namev, sizeof(eBone->name));
/* restore */
- BLI_strncpy(eBone->name, oldname, 32);
-
+ BLI_strncpy(eBone->name, oldname, sizeof(eBone->name));
+
ED_armature_bone_rename(CTX_data_edit_object(C)->data, oldname, newname); // editarmature.c
WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, CTX_data_edit_object(C)); // XXX fix
}
-static void v3d_editarmature_buts(uiLayout *layout, View3D *v3d, Object *ob, float lim)
+static void v3d_editarmature_buts(uiLayout *layout, Object *ob)
{
// uiBlock *block= uiLayoutGetBlock(layout);
bArmature *arm= ob->data;
@@ -916,21 +960,21 @@ static void v3d_editarmature_buts(uiLayout *layout, View3D *v3d, Object *ob, flo
col= uiLayoutColumn(layout, 0);
- uiItemR(col, &eboneptr, "head", 0, "Head", 0);
+ uiItemR(col, &eboneptr, "head", 0, "Head", ICON_NULL);
if (ebone->parent && ebone->flag & BONE_CONNECTED ) {
PointerRNA parptr = RNA_pointer_get(&eboneptr, "parent");
- uiItemR(col, &parptr, "tail_radius", 0, "Radius", 0);
+ uiItemR(col, &parptr, "tail_radius", 0, "Radius (Parent)", ICON_NULL);
} else {
- uiItemR(col, &eboneptr, "head_radius", 0, "Radius", 0);
+ uiItemR(col, &eboneptr, "head_radius", 0, "Radius", ICON_NULL);
}
- uiItemR(col, &eboneptr, "tail", 0, "Tail", 0);
- uiItemR(col, &eboneptr, "tail_radius", 0, "Radius", 0);
+ uiItemR(col, &eboneptr, "tail", 0, "Tail", ICON_NULL);
+ uiItemR(col, &eboneptr, "tail_radius", 0, "Radius", ICON_NULL);
- uiItemR(col, &eboneptr, "roll", 0, "Roll", 0);
+ uiItemR(col, &eboneptr, "roll", 0, "Roll", ICON_NULL);
}
-static void v3d_editmetaball_buts(uiLayout *layout, Object *ob, float lim)
+static void v3d_editmetaball_buts(uiLayout *layout, Object *ob)
{
PointerRNA mbptr, ptr;
MetaBall *mball= ob->data;
@@ -946,37 +990,37 @@ static void v3d_editmetaball_buts(uiLayout *layout, Object *ob, float lim)
RNA_pointer_create(&mball->id, &RNA_MetaElement, mball->lastelem, &ptr);
col= uiLayoutColumn(layout, 0);
- uiItemR(col, &ptr, "location", 0, "Location", 0);
+ uiItemR(col, &ptr, "co", 0, "Location", ICON_NULL);
- uiItemR(col, &ptr, "radius", 0, "Radius", 0);
- uiItemR(col, &ptr, "stiffness", 0, "Stiffness", 0);
+ uiItemR(col, &ptr, "radius", 0, "Radius", ICON_NULL);
+ uiItemR(col, &ptr, "stiffness", 0, "Stiffness", ICON_NULL);
- uiItemR(col, &ptr, "type", 0, "Type", 0);
+ uiItemR(col, &ptr, "type", 0, "Type", ICON_NULL);
col= uiLayoutColumn(layout, 1);
switch (RNA_enum_get(&ptr, "type")) {
case MB_BALL:
break;
case MB_CUBE:
- uiItemL(col, "Size:", 0);
- uiItemR(col, &ptr, "size_x", 0, "X", 0);
- uiItemR(col, &ptr, "size_y", 0, "Y", 0);
- uiItemR(col, &ptr, "size_z", 0, "Z", 0);
+ uiItemL(col, "Size:", ICON_NULL);
+ uiItemR(col, &ptr, "size_x", 0, "X", ICON_NULL);
+ uiItemR(col, &ptr, "size_y", 0, "Y", ICON_NULL);
+ uiItemR(col, &ptr, "size_z", 0, "Z", ICON_NULL);
break;
case MB_TUBE:
- uiItemL(col, "Size:", 0);
- uiItemR(col, &ptr, "size_x", 0, "X", 0);
+ uiItemL(col, "Size:", ICON_NULL);
+ uiItemR(col, &ptr, "size_x", 0, "X", ICON_NULL);
break;
case MB_PLANE:
- uiItemL(col, "Size:", 0);
- uiItemR(col, &ptr, "size_x", 0, "X", 0);
- uiItemR(col, &ptr, "size_y", 0, "Y", 0);
+ uiItemL(col, "Size:", ICON_NULL);
+ uiItemR(col, &ptr, "size_x", 0, "X", ICON_NULL);
+ uiItemR(col, &ptr, "size_y", 0, "Y", ICON_NULL);
break;
case MB_ELIPSOID:
- uiItemL(col, "Size:", 0);
- uiItemR(col, &ptr, "size_x", 0, "X", 0);
- uiItemR(col, &ptr, "size_y", 0, "Y", 0);
- uiItemR(col, &ptr, "size_z", 0, "Z", 0);
+ uiItemL(col, "Size:", ICON_NULL);
+ uiItemR(col, &ptr, "size_x", 0, "X", ICON_NULL);
+ uiItemR(col, &ptr, "size_y", 0, "Y", ICON_NULL);
+ uiItemR(col, &ptr, "size_z", 0, "Z", ICON_NULL);
break;
}
}
@@ -989,7 +1033,7 @@ static int test_parent_loop(Object *par, Object *ob)
return test_parent_loop(par->parent, ob);
}
-static void do_view3d_region_buttons(bContext *C, void *arg, int event)
+static void do_view3d_region_buttons(bContext *C, void *UNUSED(index), int event)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -1006,14 +1050,14 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
return; /* no notifier! */
case B_OBJECTPANEL:
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
break;
case B_OBJECTPANELMEDIAN:
if(ob) {
- v3d_editvertex_buts(C, NULL, v3d, ob, 1.0);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ v3d_editvertex_buts(NULL, v3d, ob, 1.0);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
break;
@@ -1024,7 +1068,7 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
ob->parent= NULL;
else {
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
}
}
break;
@@ -1058,12 +1102,15 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
case B_ARMATUREPANEL2:
{
ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
break;
case B_TRANSFORMSPACEADD:
- BIF_createTransformOrientation(C, NULL, "", 1, 0);
+ {
+ char names[sizeof(((TransformOrientation *)NULL)->name)]= "";
+ BIF_createTransformOrientation(C, NULL, names, 1, 0);
break;
+ }
case B_TRANSFORMSPACECLEAR:
BIF_clearTransformOrientation(C);
break;
@@ -1111,7 +1158,7 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
int a;
for(a=0; a<me->totvert; a++)
ED_vgroup_vert_remove (ob, defGroup, a);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
}
break;
@@ -1152,12 +1199,12 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, ob);
}
-void removeTransformOrientation_func(bContext *C, void *target, void *unused)
+void removeTransformOrientation_func(bContext *C, void *target, void *UNUSED(arg))
{
BIF_removeTransformOrientation(C, (TransformOrientation *) target);
}
-void selectTransformOrientation_func(bContext *C, void *target, void *unused)
+void selectTransformOrientation_func(bContext *C, void *target, void *UNUSED(arg))
{
BIF_selectTransformOrientation(C, (TransformOrientation *) target);
}
@@ -1203,12 +1250,12 @@ static void view3d_panel_object(const bContext *C, Panel *pa)
RNA_id_pointer_create(&ob->id, &obptr);
if(ob==obedit) {
- if(ob->type==OB_ARMATURE) v3d_editarmature_buts(col, v3d, ob, lim);
- if(ob->type==OB_MBALL) v3d_editmetaball_buts(col, ob, lim);
- else v3d_editvertex_buts(C, col, v3d, ob, lim);
+ if(ob->type==OB_ARMATURE) v3d_editarmature_buts(col, ob);
+ if(ob->type==OB_MBALL) v3d_editmetaball_buts(col, ob);
+ else v3d_editvertex_buts(col, v3d, ob, lim);
}
else if(ob->mode & OB_MODE_POSE) {
- v3d_posearmature_buts(col, v3d, ob, lim);
+ v3d_posearmature_buts(col, ob);
}
else {
@@ -1376,53 +1423,6 @@ static void view3d_panel_bonesketch_spaces(const bContext *C, Panel *pa)
uiBlockEndAlign(block);
}
-/* op->invoke */
-static void redo_cb(bContext *C, void *arg_op, void *arg2)
-{
- wmOperator *lastop= arg_op;
-
- if(lastop) {
- int retval;
-
- if (G.f & G_DEBUG)
- printf("operator redo %s\n", lastop->type->name);
- ED_undo_pop(C);
- retval= WM_operator_repeat(C, lastop);
- if((retval & OPERATOR_FINISHED)==0) {
- if (G.f & G_DEBUG)
- printf("operator redo failed %s\n", lastop->type->name);
- ED_undo_redo(C);
- }
- }
-}
-
-static void view3d_panel_operator_redo(const bContext *C, Panel *pa)
-{
- wmWindowManager *wm= CTX_wm_manager(C);
- wmOperator *op;
- PointerRNA ptr;
- uiBlock *block;
-
- block= uiLayoutGetBlock(pa->layout);
-
- /* only for operators that are registered and did an undo push */
- for(op= wm->operators.last; op; op= op->prev)
- if((op->type->flag & OPTYPE_REGISTER) && (op->type->flag & OPTYPE_UNDO))
- break;
-
- if(op==NULL)
- return;
-
- uiBlockSetFunc(block, redo_cb, op, NULL);
-
- if(!op->properties) {
- IDPropertyTemplate val = {0};
- op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties");
- }
-
- RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
- uiDefAutoButsRNA(C, pa->layout, &ptr, 2);
-}
#endif // XXX not used
void view3d_buttons_register(ARegionType *art)
@@ -1451,7 +1451,7 @@ void view3d_buttons_register(ARegionType *art)
// XXX view3d_panel_preview(C, ar, 0);
}
-static int view3d_properties(bContext *C, wmOperator *op)
+static int view3d_properties(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= view3d_has_buttons_region(sa);
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index a44f2b15d11..52f4697bad1 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -45,6 +45,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_anim.h"
#include "BKE_context.h"
@@ -243,15 +244,13 @@ static void drawgrid_draw(ARegion *ar, float wx, float wy, float x, float y, flo
#define GRID_MIN_PX 6.0f
-static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, char **grid_unit)
+static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, const char **grid_unit)
{
/* extern short bgpicmode; */
RegionView3D *rv3d= ar->regiondata;
float wx, wy, x, y, fw, fx, fy, dx;
float vec4[4];
- char col[3], col2[3];
-
- *grid_unit= NULL;
+ unsigned char col[3], col2[3];
vec4[0]=vec4[1]=vec4[2]=0.0;
vec4[3]= 1.0;
@@ -266,7 +265,7 @@ static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, char **grid_u
x= (wx)*fx/fw;
y= (wy)*fy/fw;
- vec4[0]=vec4[1]= (unit->system) ? 1.0 : v3d->grid;
+ vec4[0]=vec4[1]= v3d->grid;
vec4[2]= 0.0;
vec4[3]= 1.0;
@@ -306,7 +305,7 @@ static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, char **grid_u
/* Store the smallest drawn grid size units name so users know how big each grid cell is */
if(*grid_unit==NULL) {
*grid_unit= bUnit_GetNameDisplay(usys, i);
- rv3d->gridview= (scalar * unit->scale_length);
+ rv3d->gridview= (scalar * v3d->grid) / unit->scale_length;
}
blend_fac= 1-((GRID_MIN_PX*2)/dx_scalar);
@@ -399,17 +398,19 @@ static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, char **grid_u
setlinestyle(0);
/* center cross */
+ /* horizontal line */
if( ELEM(rv3d->view, RV3D_VIEW_RIGHT, RV3D_VIEW_LEFT))
- UI_make_axis_color(col, col2, 'y');
- else UI_make_axis_color(col, col2, 'x');
- glColor3ubv((GLubyte *)col2);
+ UI_make_axis_color(col, col2, 'Y');
+ else UI_make_axis_color(col, col2, 'X');
+ glColor3ubv(col2);
fdrawline(0.0, y, (float)ar->winx, y);
+ /* vertical line */
if( ELEM(rv3d->view, RV3D_VIEW_TOP, RV3D_VIEW_BOTTOM))
- UI_make_axis_color(col, col2, 'y');
- else UI_make_axis_color(col, col2, 'z');
- glColor3ubv((GLubyte *)col2);
+ UI_make_axis_color(col, col2, 'Y');
+ else UI_make_axis_color(col, col2, 'Z');
+ glColor3ubv(col2);
fdrawline(x, 0.0, x, (float)ar->winy);
@@ -417,22 +418,39 @@ static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, char **grid_u
}
#undef GRID_MIN_PX
-static void drawfloor(Scene *scene, View3D *v3d)
+static void drawfloor(Scene *scene, View3D *v3d, const char **grid_unit)
{
- float vert[3], grid;
+ float vert[3], grid, grid_scale;
int a, gridlines, emphasise;
- char col[3], col2[3];
+ unsigned char col[3], col2[3];
short draw_line = 0;
vert[2]= 0.0;
if(v3d->gridlines<3) return;
+ grid_scale= v3d->grid;
+ /* use 'grid_scale' instead of 'v3d->grid' from now on */
+
+ /* apply units */
+ if(scene->unit.system) {
+ void *usys;
+ int len;
+
+ bUnit_GetSystem(&usys, &len, scene->unit.system, B_UNIT_LENGTH);
+
+ if(usys) {
+ int i= bUnit_GetBaseUnit(usys);
+ *grid_unit= bUnit_GetNameDisplay(usys, i);
+ grid_scale = (grid_scale * bUnit_GetScaler(usys, i)) / scene->unit.scale_length;
+ }
+ }
+
if(v3d->zbuf && scene->obedit) glDepthMask(0); // for zbuffer-select
gridlines= v3d->gridlines/2;
- grid= gridlines*v3d->grid;
-
+ grid= gridlines * grid_scale;
+
UI_GetThemeColor3ubv(TH_GRID, col);
UI_GetThemeColor3ubv(TH_BACK, col2);
@@ -447,8 +465,8 @@ static void drawfloor(Scene *scene, View3D *v3d)
if(a==0) {
/* check for the 'show Y axis' preference */
if (v3d->gridflag & V3D_SHOW_Y) {
- UI_make_axis_color(col, col2, 'y');
- glColor3ubv((GLubyte *)col2);
+ UI_make_axis_color(col, col2, 'Y');
+ glColor3ubv(col2);
draw_line = 1;
} else if (v3d->gridflag & V3D_SHOW_FLOOR) {
@@ -472,7 +490,7 @@ static void drawfloor(Scene *scene, View3D *v3d)
if (draw_line) {
glBegin(GL_LINE_STRIP);
- vert[0]= a*v3d->grid;
+ vert[0]= a * grid_scale;
vert[1]= grid;
glVertex3fv(vert);
vert[1]= -grid;
@@ -486,8 +504,8 @@ static void drawfloor(Scene *scene, View3D *v3d)
if(a==0) {
/* check for the 'show X axis' preference */
if (v3d->gridflag & V3D_SHOW_X) {
- UI_make_axis_color(col, col2, 'x');
- glColor3ubv((GLubyte *)col2);
+ UI_make_axis_color(col, col2, 'X');
+ glColor3ubv(col2);
draw_line = 1;
} else if (v3d->gridflag & V3D_SHOW_FLOOR) {
@@ -511,7 +529,7 @@ static void drawfloor(Scene *scene, View3D *v3d)
if (draw_line) {
glBegin(GL_LINE_STRIP);
- vert[1]= a*v3d->grid;
+ vert[1]= a * grid_scale;
vert[0]= grid;
glVertex3fv(vert );
vert[0]= -grid;
@@ -523,8 +541,8 @@ static void drawfloor(Scene *scene, View3D *v3d)
/* draw the Z axis line */
/* check for the 'show Z axis' preference */
if (v3d->gridflag & V3D_SHOW_Z) {
- UI_make_axis_color(col, col2, 'z');
- glColor3ubv((GLubyte *)col2);
+ UI_make_axis_color(col, col2, 'Z');
+ glColor3ubv(col2);
glBegin(GL_LINE_STRIP);
vert[0]= 0;
@@ -571,94 +589,85 @@ static void drawcursor(Scene *scene, ARegion *ar, View3D *v3d)
}
}
-/* Draw a live substitute of the view icon, which is always shown */
+/* Draw a live substitute of the view icon, which is always shown
+ * colors copied from transform_manipulator.c, we should keep these matching. */
static void draw_view_axis(RegionView3D *rv3d)
{
const float k = U.rvisize; /* axis size */
const float toll = 0.5; /* used to see when view is quasi-orthogonal */
const float start = k + 1.0; /* axis center in screen coordinates, x=y */
float ydisp = 0.0; /* vertical displacement to allow obj info text */
-
- /* rvibright ranges approx. from original axis icon color to gizmo color */
- float bright = U.rvibright / 15.0f;
-
- unsigned char col[3];
- unsigned char gridcol[3];
- float colf[3];
-
- float vec[4];
+ int bright = 25*(float)U.rvibright + 5; /* axis alpha (rvibright has range 0-10) */
+
+ float vec[3];
float dx, dy;
- float h, s, v;
/* thickness of lines is proportional to k */
- /* (log(k)-1) gives a more suitable thickness, but fps decreased by about 3 fps */
- glLineWidth(k / 10);
- //glLineWidth(log(k)-1); // a bit slow
-
- UI_GetThemeColor3ubv(TH_GRID, (char *)gridcol);
-
+ glLineWidth(2);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
/* X */
- vec[0] = vec[3] = 1;
+ vec[0] = 1;
vec[1] = vec[2] = 0;
mul_qt_v3(rv3d->viewquat, vec);
-
- UI_make_axis_color((char *)gridcol, (char *)col, 'x');
- rgb_to_hsv(col[0]/255.0f, col[1]/255.0f, col[2]/255.0f, &h, &s, &v);
- s = s<0.5 ? s+0.5 : 1.0;
- v = 0.3;
- v = (v<1.0-(bright) ? v+bright : 1.0);
- hsv_to_rgb(h, s, v, colf, colf+1, colf+2);
- glColor3fv(colf);
-
dx = vec[0] * k;
dy = vec[1] * k;
- fdrawline(start, start + ydisp, start + dx, start + dy + ydisp);
+
+ glColor4ub(220, 0, 0, bright);
+ glBegin(GL_LINES);
+ glVertex2f(start, start + ydisp);
+ glVertex2f(start + dx, start + dy + ydisp);
+ glEnd();
+
if (fabs(dx) > toll || fabs(dy) > toll) {
- BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "x");
+ BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "x", 1);
}
+ /* BLF_draw_default disables blending */
+ glEnable(GL_BLEND);
+
/* Y */
- vec[1] = vec[3] = 1;
+ vec[1] = 1;
vec[0] = vec[2] = 0;
mul_qt_v3(rv3d->viewquat, vec);
-
- UI_make_axis_color((char *)gridcol, (char *)col, 'y');
- rgb_to_hsv(col[0]/255.0f, col[1]/255.0f, col[2]/255.0f, &h, &s, &v);
- s = s<0.5 ? s+0.5 : 1.0;
- v = 0.3;
- v = (v<1.0-(bright) ? v+bright : 1.0);
- hsv_to_rgb(h, s, v, colf, colf+1, colf+2);
- glColor3fv(colf);
-
dx = vec[0] * k;
dy = vec[1] * k;
- fdrawline(start, start + ydisp, start + dx, start + dy + ydisp);
+
+ glColor4ub(0, 220, 0, bright);
+ glBegin(GL_LINES);
+ glVertex2f(start, start + ydisp);
+ glVertex2f(start + dx, start + dy + ydisp);
+ glEnd();
+
if (fabs(dx) > toll || fabs(dy) > toll) {
- BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "y");
+ BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "y", 1);
}
+
+ glEnable(GL_BLEND);
/* Z */
- vec[2] = vec[3] = 1;
+ vec[2] = 1;
vec[1] = vec[0] = 0;
mul_qt_v3(rv3d->viewquat, vec);
-
- UI_make_axis_color((char *)gridcol, (char *)col, 'z');
- rgb_to_hsv(col[0]/255.0f, col[1]/255.0f, col[2]/255.0f, &h, &s, &v);
- s = s<0.5 ? s+0.5 : 1.0;
- v = 0.5;
- v = (v<1.0-(bright) ? v+bright : 1.0);
- hsv_to_rgb(h, s, v, colf, colf+1, colf+2);
- glColor3fv(colf);
-
dx = vec[0] * k;
dy = vec[1] * k;
- fdrawline(start, start + ydisp, start + dx, start + dy + ydisp);
+
+ glColor4ub(30, 30, 220, bright);
+ glBegin(GL_LINES);
+ glVertex2f(start, start + ydisp);
+ glVertex2f(start + dx, start + dy + ydisp);
+ glEnd();
+
if (fabs(dx) > toll || fabs(dy) > toll) {
- BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "z");
+ BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "z", 1);
}
-
+
/* restore line-width */
+
glLineWidth(1.0);
+ glDisable(GL_BLEND);
}
@@ -682,9 +691,9 @@ static void draw_view_icon(RegionView3D *rv3d)
glDisable(GL_BLEND);
}
-static char *view3d_get_name(View3D *v3d, RegionView3D *rv3d)
+static const char *view3d_get_name(View3D *v3d, RegionView3D *rv3d)
{
- char *name = NULL;
+ const char *name = NULL;
switch (rv3d->view) {
case RV3D_VIEW_FRONT:
@@ -733,24 +742,17 @@ static char *view3d_get_name(View3D *v3d, RegionView3D *rv3d)
static void draw_viewport_name(ARegion *ar, View3D *v3d)
{
RegionView3D *rv3d= ar->regiondata;
- char *name = view3d_get_name(v3d, rv3d);
- char *printable = NULL;
+ const char *name= view3d_get_name(v3d, rv3d);
+ char tmpstr[24];
if (v3d->localvd) {
- printable = MEM_mallocN(strlen(name) + strlen(" (Local)_"), "viewport_name"); /* '_' gives space for '\0' */
- strcpy(printable, name);
- strcat(printable, " (Local)");
- } else {
- printable = name;
+ BLI_snprintf(tmpstr, sizeof(tmpstr), "%s (Local)", name);
+ name= tmpstr;
}
- if (printable) {
+ if (name) {
UI_ThemeColor(TH_TEXT_HI);
- BLF_draw_default(22, ar->winy-17, 0.0f, printable);
- }
-
- if (v3d->localvd) {
- MEM_freeN(printable);
+ BLF_draw_default(22, ar->winy-17, 0.0f, name, sizeof(tmpstr));
}
}
@@ -825,7 +827,7 @@ static void draw_selected_name(Scene *scene, Object *ob, View3D *v3d)
sprintf(info, "(%d) %s", CFRA, ob->id.name+2);
}
- /* colour depends on whether there is a keyframe */
+ /* color depends on whether there is a keyframe */
if (id_frame_has_keyframe((ID *)ob, /*BKE_curframe(scene)*/(float)(CFRA), v3d->keyflags))
UI_ThemeColor(TH_VERTEX_SELECT);
else
@@ -838,14 +840,14 @@ static void draw_selected_name(Scene *scene, Object *ob, View3D *v3d)
else
sprintf(info, "(%d)", CFRA);
- /* colour is always white */
+ /* color is always white */
UI_ThemeColor(TH_TEXT_HI);
}
if (U.uiflag & USER_SHOW_ROTVIEWICON)
offset = 14 + (U.rvisize * 2);
- BLF_draw_default(offset, 10, 0.0f, info);
+ BLF_draw_default(offset, 10, 0.0f, info, sizeof(info)-1);
}
static void view3d_get_viewborder_size(Scene *scene, ARegion *ar, float size_r[2])
@@ -862,7 +864,7 @@ static void view3d_get_viewborder_size(Scene *scene, ARegion *ar, float size_r[2
}
}
-void view3d_calc_camera_border(Scene *scene, ARegion *ar, RegionView3D *rv3d, View3D *v3d, rctf *viewborder_r)
+void view3d_calc_camera_border(Scene *scene, ARegion *ar, RegionView3D *rv3d, View3D *v3d, rctf *viewborder_r, short do_shift)
{
float zoomfac, size[2];
float dx= 0.0f, dy= 0.0f;
@@ -901,12 +903,13 @@ void view3d_calc_camera_border(Scene *scene, ARegion *ar, RegionView3D *rv3d, Vi
viewborder_r->xmax-= dx;
viewborder_r->ymax-= dy;
- if(v3d->camera && v3d->camera->type==OB_CAMERA) {
+ if(do_shift && v3d->camera && v3d->camera->type==OB_CAMERA) {
Camera *cam= v3d->camera->data;
float w = viewborder_r->xmax - viewborder_r->xmin;
float h = viewborder_r->ymax - viewborder_r->ymin;
float side = MAX2(w, h);
-
+
+ if(do_shift == -1) side *= -1;
viewborder_r->xmin+= cam->shiftx*side;
viewborder_r->xmax+= cam->shiftx*side;
viewborder_r->ymin+= cam->shifty*side;
@@ -926,52 +929,6 @@ void view3d_set_1_to_1_viewborder(Scene *scene, ARegion *ar)
rv3d->camzoom= CLAMPIS(rv3d->camzoom, RV3D_CAMZOOM_MIN, RV3D_CAMZOOM_MAX);
}
-
-static void drawviewborder_flymode(ARegion *ar)
-{
- /* draws 4 edge brackets that frame the safe area where the
- mouse can move during fly mode without spinning the view */
- float x1, x2, y1, y2;
-
- x1= 0.45*(float)ar->winx;
- y1= 0.45*(float)ar->winy;
- x2= 0.55*(float)ar->winx;
- y2= 0.55*(float)ar->winy;
- cpack(0);
-
-
- glBegin(GL_LINES);
- /* bottom left */
- glVertex2f(x1,y1);
- glVertex2f(x1,y1+5);
-
- glVertex2f(x1,y1);
- glVertex2f(x1+5,y1);
-
- /* top right */
- glVertex2f(x2,y2);
- glVertex2f(x2,y2-5);
-
- glVertex2f(x2,y2);
- glVertex2f(x2-5,y2);
-
- /* top left */
- glVertex2f(x1,y2);
- glVertex2f(x1,y2-5);
-
- glVertex2f(x1,y2);
- glVertex2f(x1+5,y2);
-
- /* bottom right */
- glVertex2f(x2,y1);
- glVertex2f(x2,y1+5);
-
- glVertex2f(x2,y1);
- glVertex2f(x2-5,y1);
- glEnd();
-}
-
-
static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
{
float fac, a;
@@ -987,7 +944,7 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
if(v3d->camera->type==OB_CAMERA)
ca = v3d->camera->data;
- view3d_calc_camera_border(scene, ar, rv3d, v3d, &viewborder);
+ view3d_calc_camera_border(scene, ar, rv3d, v3d, &viewborder, FALSE);
/* the offsets */
x1= viewborder.xmin;
y1= viewborder.ymin;
@@ -1069,7 +1026,7 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
/* camera name - draw in highlighted text color */
if (ca && (ca->flag & CAM_SHOWNAME)) {
UI_ThemeColor(TH_TEXT_HI);
- BLF_draw_default(x1i, y1i-15, 0.0f, v3d->camera->id.name+2);
+ BLF_draw_default(x1i, y1i-15, 0.0f, v3d->camera->id.name+2, sizeof(v3d->camera->id.name)-2);
UI_ThemeColor(TH_WIRE);
}
}
@@ -1186,7 +1143,7 @@ ImBuf *view3d_read_backbuf(ViewContext *vc, short xmin, short ymin, short xmax,
if(ymax >= vc->ar->winy) ymaxc= vc->ar->winy-1; else ymaxc= ymax;
if(yminc > ymaxc) return NULL;
- ibuf= IMB_allocImBuf((xmaxc-xminc+1), (ymaxc-yminc+1), 32, IB_rect,0);
+ ibuf= IMB_allocImBuf((xmaxc-xminc+1), (ymaxc-yminc+1), 32, IB_rect);
view3d_validate_backbuf(vc);
@@ -1206,7 +1163,7 @@ ImBuf *view3d_read_backbuf(ViewContext *vc, short xmin, short ymin, short xmax,
if(xminc==xmin && xmaxc==xmax && yminc==ymin && ymaxc==ymax)
return ibuf;
- ibuf1= IMB_allocImBuf( (xmax-xmin+1),(ymax-ymin+1),32,IB_rect,0);
+ ibuf1= IMB_allocImBuf( (xmax-xmin+1),(ymax-ymin+1),32,IB_rect);
rd= ibuf->rect;
dr= ibuf1->rect;
@@ -1324,7 +1281,7 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
if(rv3d->persp==RV3D_CAMOB) {
rctf vb;
- view3d_calc_camera_border(scene, ar, rv3d, v3d, &vb);
+ view3d_calc_camera_border(scene, ar, rv3d, v3d, &vb, FALSE);
x1= vb.xmin;
y1= vb.ymin;
@@ -1524,7 +1481,7 @@ static void draw_dupli_objects_color(Scene *scene, ARegion *ar, View3D *v3d, Bas
{
RegionView3D *rv3d= ar->regiondata;
ListBase *lb;
- DupliObject *dob_prev= NULL, *dob, *dob_next;
+ DupliObject *dob_prev= NULL, *dob, *dob_next= NULL;
Base tbase;
BoundBox bb, *bb_tmp; /* use a copy because draw_object, calls clear_mesh_caches */
GLuint displist=0;
@@ -1634,8 +1591,62 @@ static void draw_dupli_objects(Scene *scene, ARegion *ar, View3D *v3d, Base *bas
draw_dupli_objects_color(scene, ar, v3d, base, color);
}
+void view3d_update_depths_rect(ARegion *ar, ViewDepths *d, rcti *rect)
+{
+ int x, y, w, h;
+ rcti r;
+ /* clamp rect by area */
+
+ r.xmin= 0;
+ r.xmax= ar->winx-1;
+ r.ymin= 0;
+ r.ymax= ar->winy-1;
+
+ /* Constrain rect to depth bounds */
+ BLI_isect_rcti(&r, rect, rect);
+
+ /* assign values to compare with the ViewDepths */
+ x= rect->xmin;
+ y= rect->ymin;
+
+ w= rect->xmax - rect->xmin;
+ h= rect->ymax - rect->ymin;
+
+ if(w <= 0 || h <= 0) {
+ if(d->depths)
+ MEM_freeN(d->depths);
+ d->depths= NULL;
-void view3d_update_depths(ARegion *ar, View3D *v3d)
+ d->damaged= FALSE;
+ }
+ else if( d->w != w ||
+ d->h != h ||
+ d->x != x ||
+ d->y != y ||
+ d->depths==NULL
+ ) {
+ d->x= x;
+ d->y= y;
+ d->w= w;
+ d->h= h;
+
+ if(d->depths)
+ MEM_freeN(d->depths);
+
+ d->depths= MEM_mallocN(sizeof(float)*d->w*d->h,"View depths Subset");
+
+ d->damaged= TRUE;
+ }
+
+ if(d->damaged) {
+ glReadPixels(ar->winrct.xmin+d->x,ar->winrct.ymin+d->y, d->w,d->h, GL_DEPTH_COMPONENT,GL_FLOAT, d->depths);
+ glGetDoublev(GL_DEPTH_RANGE,d->depth_range);
+ d->damaged= FALSE;
+ }
+}
+
+/* note, with nouveau drivers the glReadPixels() is very slow. [#24339] */
+void view3d_update_depths(ARegion *ar)
{
RegionView3D *rv3d= ar->regiondata;
@@ -1665,6 +1676,30 @@ void view3d_update_depths(ARegion *ar, View3D *v3d)
}
}
+/* utility function to find the closest Z value, use for autodepth */
+float view3d_depth_near(ViewDepths *d)
+{
+ /* convert to float for comparisons */
+ const float near= (float)d->depth_range[0];
+ const float far_real= (float)d->depth_range[1];
+ float far= far_real;
+
+ const float *depths= d->depths;
+ float depth= FLT_MAX;
+ int i= (int)d->w * (int)d->h; /* cast to avoid short overflow */
+
+ /* far is both the starting 'far' value
+ * and the closest value found. */
+ while(i--) {
+ depth= *depths++;
+ if((depth < far) && (depth > near)) {
+ far= depth;
+ }
+ }
+
+ return far == far_real ? FLT_MAX : far;
+}
+
void draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d)
{
short zbuf= v3d->zbuf;
@@ -1694,7 +1729,6 @@ void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (* func)(void *))
{
RegionView3D *rv3d= ar->regiondata;
Base *base;
- Scene *sce;
short zbuf= v3d->zbuf;
short flag= v3d->flag;
float glalphaclip= U.glalphaclip;
@@ -1727,7 +1761,8 @@ void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (* func)(void *))
/* draw set first */
if(scene->set) {
- for(SETLOOPER(scene->set, base)) {
+ Scene *sce_iter;
+ for(SETLOOPER(scene->set, sce_iter, base)) {
if(v3d->lay & base->lay) {
if (func == NULL || func(base)) {
draw_object(scene, ar, v3d, base, 0);
@@ -1849,16 +1884,14 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
{
ListBase shadows;
View3DShadow *shadow;
- Scene *sce;
+ Scene *sce_iter;
Base *base;
Object *ob;
- ARegion ar;
- RegionView3D rv3d;
shadows.first= shadows.last= NULL;
/* update lamp transform and gather shadow lamps */
- for(SETLOOPER(scene, base)) {
+ for(SETLOOPER(scene, sce_iter, base)) {
ob= base->object;
if(ob->type == OB_LAMP)
@@ -1882,6 +1915,8 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
/* this needs to be done better .. */
float viewmat[4][4], winmat[4][4];
int drawtype, lay, winsize, flag2=v3d->flag2;
+ ARegion ar= {0};
+ RegionView3D rv3d= {{{0}}};
drawtype= v3d->drawtype;
lay= v3d->lay;
@@ -1893,9 +1928,6 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
GPU_lamp_shadow_buffer_bind(shadow->lamp, viewmat, &winsize, winmat);
- memset(&ar, 0, sizeof(ar));
- memset(&rv3d, 0, sizeof(rv3d));
-
ar.regiondata= &rv3d;
ar.regiontype= RGN_TYPE_WINDOW;
rv3d.persp= RV3D_CAMOB;
@@ -1919,8 +1951,10 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
/* *********************** customdata **************** */
/* goes over all modes and view3d settings */
-static CustomDataMask get_viewedit_datamask(bScreen *screen, Scene *scene, Object *ob)
+CustomDataMask ED_viewedit_datamask(bScreen *screen)
{
+ Scene *scene= screen->scene;
+ Object *ob= scene->basact ? scene->basact->object : NULL;
CustomDataMask mask = CD_MASK_BAREMESH;
ScrArea *sa;
@@ -1976,19 +2010,26 @@ static void view3d_main_area_setup_view(Scene *scene, View3D *v3d, ARegion *ar,
mul_m4_m4m4(rv3d->persmat, rv3d->viewmat, rv3d->winmat);
invert_m4_m4(rv3d->persinv, rv3d->persmat);
invert_m4_m4(rv3d->viewinv, rv3d->viewmat);
-
+
/* calculate pixelsize factor once, is used for lamps and obcenters */
{
- rv3d->pixsize= 2.0f;
+ /* note: '1.0f / len_v3(v1)' replaced 'len_v3(rv3d->viewmat[0])'
+ * because of float point precision problems at large values [#23908] */
+ float v1[3], v2[3];
+ float len1, len2;
+
+ v1[0]= rv3d->persmat[0][0];
+ v1[1]= rv3d->persmat[1][0];
+ v1[2]= rv3d->persmat[2][0];
+
+ v2[0]= rv3d->persmat[0][1];
+ v2[1]= rv3d->persmat[1][1];
+ v2[2]= rv3d->persmat[2][1];
- if(rv3d->persp == RV3D_ORTHO || v3d->camera) { /* camera view needs with for ortho & persp */
- float len1= len_v3(rv3d->persinv[0]);
- float len2= len_v3(rv3d->persinv[1]);
- rv3d->pixsize *= MAX2(len1, len2);
- }
+ len1= 1.0f / len_v3(v1);
+ len2= 1.0f / len_v3(v2);
- /* correct for window size */
- rv3d->pixsize/= (float)MAX2(ar->winx, ar->winy);
+ rv3d->pixsize = (2.0f * MAX2(len1, len2)) / (float)MAX2(ar->winx, ar->winy);
}
/* set for opengl */
@@ -2000,7 +2041,6 @@ static void view3d_main_area_setup_view(Scene *scene, View3D *v3d, ARegion *ar,
void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx, int winy, float viewmat[][4], float winmat[][4])
{
- Scene *sce;
Base *base;
float backcol[3];
int bwinx, bwiny;
@@ -2027,6 +2067,10 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx,
/* free images which can have changed on frame-change
* warning! can be slow so only free animated images - campbell */
GPU_free_images_anim();
+
+ /* shadow buffers, before we setup matrices */
+ if(draw_glsl_material(scene, NULL, v3d, v3d->drawtype))
+ gpu_update_lamps_shadows(scene, v3d);
/* set background color, fallback on the view background color */
if(scene->world) {
@@ -2055,7 +2099,8 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx,
/* draw set first */
if(scene->set) {
- for(SETLOOPER(scene->set, base)) {
+ Scene *sce_iter;
+ for(SETLOOPER(scene->set, sce_iter, base)) {
if(v3d->lay & base->lay) {
UI_ThemeColorBlend(TH_WIRE, TH_BACK, 0.6f);
draw_object(scene, ar, v3d, base, DRAW_CONSTCOLOR|DRAW_SCENESET);
@@ -2117,9 +2162,12 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
RegionView3D *rv3d= ar->regiondata;
ImBuf *ibuf;
GPUOffScreen *ofs;
+
+ /* state changes make normal drawing go weird otherwise */
+ glPushAttrib(GL_LIGHTING_BIT);
/* bind */
- ofs= GPU_offscreen_create(sizex, sizey);
+ ofs= GPU_offscreen_create(&sizex, &sizey);
if(ofs == NULL)
return NULL;
@@ -2140,7 +2188,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
}
/* read in pixels & stamp */
- ibuf= IMB_allocImBuf(sizex, sizey, 32, flag, 0);
+ ibuf= IMB_allocImBuf(sizex, sizey, 32, flag);
if(ibuf->rect_float)
glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, ibuf->rect_float);
@@ -2154,6 +2202,8 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
GPU_offscreen_unbind(ofs);
GPU_offscreen_free(ofs);
+ glPopAttrib();
+
if(ibuf->rect_float && ibuf->rect)
IMB_rect_from_float(ibuf);
@@ -2163,13 +2213,9 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
/* creates own 3d views, used by the sequencer */
ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height, unsigned int flag, int drawtype)
{
- View3D v3d;
- ARegion ar;
- RegionView3D rv3d;
-
- memset(&v3d, 0, sizeof(v3d));
- memset(&ar, 0, sizeof(ar));
- memset(&rv3d, 0, sizeof(rv3d));
+ View3D v3d= {0};
+ ARegion ar= {0};
+ RegionView3D rv3d= {{{0}}};
/* connect data */
v3d.regionbase.first= v3d.regionbase.last= &ar;
@@ -2250,24 +2296,20 @@ static void draw_viewport_fps(Scene *scene, ARegion *ar)
BLI_snprintf(printable, sizeof(printable), "fps: %i", (int)(fps+0.5));
}
- BLF_draw_default(22, ar->winy-17, 0.0f, printable);
+ BLF_draw_default(22, ar->winy-17, 0.0f, printable, sizeof(printable)-1);
}
+/* warning: this function has duplicate drawing in ED_view3d_draw_offscreen() */
void view3d_main_area_draw(const bContext *C, ARegion *ar)
{
Scene *scene= CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
- Scene *sce;
Base *base;
Object *ob;
float backcol[3];
- int retopo= 0, sculptparticle= 0;
- Object *obact = OBACT;
- char *grid_unit= NULL;
-
- /* from now on all object derived meshes check this */
- v3d->customdata_mask= get_viewedit_datamask(CTX_wm_screen(C), scene, obact);
+ unsigned int lay_used;
+ const char *grid_unit= NULL;
/* shadow buffers, before we setup matrices */
if(draw_glsl_material(scene, NULL, v3d, v3d->drawtype))
@@ -2314,22 +2356,25 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
// needs to be done always, gridview is adjusted in drawgrid() now
rv3d->gridview= v3d->grid;
-
- if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
- if(rv3d->view==0 || rv3d->persp != RV3D_ORTHO) {
- drawfloor(scene, v3d);
- if(rv3d->persp==RV3D_CAMOB) {
- if(scene->world) {
- if(scene->world->mode & WO_STARS) {
- RE_make_stars(NULL, scene, star_stuff_init_func, star_stuff_vertex_func,
- star_stuff_term_func);
- }
+ if(rv3d->view==0 || rv3d->persp != RV3D_ORTHO) {
+ if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
+ drawfloor(scene, v3d, &grid_unit);
+ }
+ if(rv3d->persp==RV3D_CAMOB) {
+ if(scene->world) {
+ if(scene->world->mode & WO_STARS) {
+ RE_make_stars(NULL, scene, star_stuff_init_func, star_stuff_vertex_func,
+ star_stuff_term_func);
}
+ }
+ if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
if(v3d->flag & V3D_DISPBGPICS) draw_bgpic(scene, ar, v3d);
}
}
- else {
+ }
+ else {
+ if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
ED_region_pixelspace(ar);
drawgrid(&scene->unit, ar, v3d, &grid_unit);
/* XXX make function? replaces persp(1) */
@@ -2349,7 +2394,8 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
/* draw set first */
if(scene->set) {
- for(SETLOOPER(scene->set, base)) {
+ Scene *sce_iter;
+ for(SETLOOPER(scene->set, sce_iter, base)) {
if(v3d->lay & base->lay) {
@@ -2365,8 +2411,12 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
/* Transp and X-ray afterdraw stuff for sets is done later */
}
+ lay_used= 0;
+
/* then draw not selected and the duplis, but skip editmode object */
for(base= scene->base.first; base; base= base->next) {
+ lay_used |= base->lay & ((1<<20)-1);
+
if(v3d->lay & base->lay) {
/* dupli drawing */
@@ -2380,11 +2430,20 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
}
}
-// retopo= retopo_mesh_check() || retopo_curve_check();
- sculptparticle= (obact && obact->mode & (OB_MODE_PARTICLE_EDIT)) && !scene->obedit;
- if(retopo)
- view3d_update_depths(ar, v3d);
-
+ if(v3d->lay_used != lay_used) { /* happens when loading old files or loading with UI load */
+ ARegion *ar_iter;
+ ScrArea *sa= CTX_wm_area(C);
+
+ /* find header and force tag redraw */
+ for(ar_iter= sa->regionbase.first; ar_iter; ar_iter= ar_iter->next)
+ if(ar_iter->regiontype==RGN_TYPE_HEADER) {
+ ED_region_tag_redraw(ar_iter);
+ break;
+ }
+
+ v3d->lay_used= lay_used;
+ }
+
/* draw selected and editmode */
for(base= scene->base.first; base; base= base->next) {
if(v3d->lay & base->lay) {
@@ -2392,11 +2451,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
draw_object(scene, ar, v3d, base, 0);
}
}
-
- if(!retopo && sculptparticle && !(obact && (obact->dtx & OB_DRAWXRAY))) {
- view3d_update_depths(ar, v3d);
- }
-
+
// REEB_draw();
/* Transp and X-ray afterdraw stuff */
@@ -2405,11 +2460,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
if(v3d->afterdraw_xraytransp.first) view3d_draw_xraytransp(scene, ar, v3d, 1);
ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_VIEW);
-
- if(!retopo && sculptparticle && (obact && (OBACT->dtx & OB_DRAWXRAY))) {
- view3d_update_depths(ar, v3d);
- }
-
+
if(rv3d->rflag & RV3D_CLIPPING)
view3d_clr_clipping();
@@ -2440,8 +2491,8 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
/* Draw particle edit brush XXX (removed) */
- if(rv3d->persp==RV3D_CAMOB) drawviewborder(scene, ar, v3d);
- if(rv3d->rflag & RV3D_FLYMODE) drawviewborder_flymode(ar);
+ if(rv3d->persp==RV3D_CAMOB)
+ drawviewborder(scene, ar, v3d);
if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
/* draw grease-pencil stuff - needed to get paint-buffer shown too (since it's 2D) */
@@ -2463,8 +2514,14 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
draw_viewport_name(ar, v3d);
}
if (grid_unit) { /* draw below the viewport name */
+ char tstr[32]= "";
+
UI_ThemeColor(TH_TEXT_HI);
- BLF_draw_default(22, ar->winy-(USER_SHOW_VIEWPORTNAME?40:20), 0.0f, grid_unit);
+ if(v3d->grid != 1.0f) {
+ BLI_snprintf(tstr, sizeof(tstr), "%s x %.4g", grid_unit, v3d->grid);
+ }
+
+ BLF_draw_default(22, ar->winy-(USER_SHOW_VIEWPORTNAME?40:20), 0.0f, tstr[0]?tstr : grid_unit, sizeof(tstr)); /* XXX, use real length */
}
ob= OBACT;
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index e2c12386dd3..de0878925ae 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -34,12 +34,14 @@
#include "DNA_armature_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_camera_types.h"
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_image.h"
@@ -51,6 +53,7 @@
#include "BIF_gl.h"
+#include "BIF_glutil.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -59,10 +62,10 @@
#include "RNA_define.h"
#include "ED_particle.h"
-#include "ED_retopo.h"
#include "ED_screen.h"
#include "ED_transform.h"
#include "ED_mesh.h"
+#include "ED_view3d.h"
#include "PIL_time.h" /* smoothview */
@@ -157,6 +160,7 @@ static void view3d_boxview_sync(ScrArea *sa, ARegion *ar)
{
ARegion *artest;
RegionView3D *rv3d= ar->regiondata;
+ short clip= 0;
for(artest= sa->regionbase.first; artest; artest= artest->next) {
if(artest!=ar && artest->regiontype==RGN_TYPE_WINDOW) {
@@ -184,11 +188,16 @@ static void view3d_boxview_sync(ScrArea *sa, ARegion *ar)
rv3dtest->ofs[2]= rv3d->ofs[2];
}
+ clip |= rv3dtest->viewlock & RV3D_BOXCLIP;
+
ED_region_tag_redraw(artest);
}
}
}
- view3d_boxview_clip(sa);
+
+ if(clip) {
+ view3d_boxview_clip(sa);
+ }
}
/* for home, center etc */
@@ -196,6 +205,7 @@ void view3d_boxview_copy(ScrArea *sa, ARegion *ar)
{
ARegion *artest;
RegionView3D *rv3d= ar->regiondata;
+ short clip= 0;
for(artest= sa->regionbase.first; artest; artest= artest->next) {
if(artest!=ar && artest->regiontype==RGN_TYPE_WINDOW) {
@@ -205,17 +215,23 @@ void view3d_boxview_copy(ScrArea *sa, ARegion *ar)
rv3dtest->dist= rv3d->dist;
copy_v3_v3(rv3dtest->ofs, rv3d->ofs);
ED_region_tag_redraw(artest);
+
+ clip |= rv3dtest->viewlock & RV3D_BOXCLIP;
}
}
}
- view3d_boxview_clip(sa);
+
+ if(clip) {
+ view3d_boxview_clip(sa);
+ }
}
-void ED_view3d_quadview_update(ScrArea *sa, ARegion *ar)
+/* 'clip' is used to know if our clip setting has changed */
+void ED_view3d_quadview_update(ScrArea *sa, ARegion *ar, short do_clip)
{
+ ARegion *arsync= NULL;
RegionView3D *rv3d= ar->regiondata;
short viewlock;
-
/* this function copies flags from the first of the 3 other quadview
regions to the 2 other, so it assumes this is the region whose
properties are always being edited, weak */
@@ -223,18 +239,30 @@ void ED_view3d_quadview_update(ScrArea *sa, ARegion *ar)
if((viewlock & RV3D_LOCKED)==0)
viewlock= 0;
- else if((viewlock & RV3D_BOXVIEW)==0)
+ else if((viewlock & RV3D_BOXVIEW)==0) {
viewlock &= ~RV3D_BOXCLIP;
+ do_clip= TRUE;
+ }
for(; ar; ar= ar->prev) {
if(ar->alignment==RGN_ALIGN_QSPLIT) {
rv3d= ar->regiondata;
rv3d->viewlock= viewlock;
+
+ if(do_clip && (viewlock & RV3D_BOXCLIP)==0) {
+ rv3d->rflag &= ~RV3D_BOXCLIP;
+ }
+
+ /* use arsync so we sync with one of the aligned views below
+ * else the view jumps on changing view settings like 'clip'
+ * since it copies from the perspective view */
+ arsync= ar;
}
}
- if(rv3d->viewlock & RV3D_BOXVIEW)
- view3d_boxview_copy(sa, sa->regionbase.last);
+ if(rv3d->viewlock & RV3D_BOXVIEW) {
+ view3d_boxview_copy(sa, arsync ? arsync : sa->regionbase.last);
+ }
ED_area_tag_redraw(sa);
}
@@ -297,7 +325,7 @@ static void calctrackballvec(rcti *rect, int mx, int my, float *vec)
static void viewops_data_create(bContext *C, wmOperator *op, wmEvent *event)
{
static float lastofs[3] = {0,0,0};
- View3D *v3d = CTX_wm_view3d(C);
+ View3D *v3d;
RegionView3D *rv3d;
ViewOpsData *vod= MEM_callocN(sizeof(ViewOpsData), "viewops data");
@@ -305,6 +333,7 @@ static void viewops_data_create(bContext *C, wmOperator *op, wmEvent *event)
op->customdata= vod;
vod->sa= CTX_wm_area(C);
vod->ar= CTX_wm_region(C);
+ v3d= vod->sa->spacedata.first;
vod->rv3d= rv3d= vod->ar->regiondata;
vod->dist0= rv3d->dist;
copy_qt_qt(vod->oldquat, rv3d->viewquat);
@@ -377,19 +406,26 @@ static void viewops_data_create(bContext *C, wmOperator *op, wmEvent *event)
static void viewops_data_free(bContext *C, wmOperator *op)
{
+ ARegion *ar;
Paint *p = paint_get_active(CTX_data_scene(C));
- ViewOpsData *vod= op->customdata;
- vod->rv3d->rflag &= ~RV3D_NAVIGATING;
+ if(op->customdata) {
+ ViewOpsData *vod= op->customdata;
+ ar= vod->ar;
+ vod->rv3d->rflag &= ~RV3D_NAVIGATING;
- if(p && (p->flags & PAINT_FAST_NAVIGATE))
- ED_region_tag_redraw(vod->ar);
+ if(vod->timer)
+ WM_event_remove_timer(CTX_wm_manager(C), vod->timer->win, vod->timer);
- if(vod->timer)
- WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), vod->timer);
+ MEM_freeN(vod);
+ op->customdata= NULL;
+ }
+ else {
+ ar= CTX_wm_region(C);
+ }
- MEM_freeN(vod);
- op->customdata= NULL;
+ if(p && (p->flags & PAINT_FAST_NAVIGATE))
+ ED_region_tag_redraw(ar);
}
/* ************************** viewrotate **********************************/
@@ -663,6 +699,9 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
vod->oldx= x;
vod->oldy= y;
+ /* avoid precision loss over time */
+ normalize_qt(rv3d->viewquat);
+
ED_region_tag_redraw(vod->ar);
}
@@ -706,7 +745,7 @@ static int viewrotate_modal(bContext *C, wmOperator *op, wmEvent *event)
viewrotate_apply(vod, event->x, event->y);
}
else if (event_code==VIEW_CONFIRM) {
- request_depth_update(CTX_wm_region_view3d(C));
+ request_depth_update(vod->rv3d);
viewops_data_free(C, op);
return OPERATOR_FINISHED;
@@ -717,36 +756,44 @@ static int viewrotate_modal(bContext *C, wmOperator *op, wmEvent *event)
static int viewrotate_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- RegionView3D *rv3d= CTX_wm_region_view3d(C);
ViewOpsData *vod;
-
- if(rv3d->viewlock)
- return OPERATOR_CANCELLED;
+ RegionView3D *rv3d;
/* makes op->customdata */
viewops_data_create(C, op, event);
vod= op->customdata;
+ rv3d= vod->rv3d;
+
+ if(rv3d->viewlock) { /* poll should check but in some cases fails, see poll func for details */
+ viewops_data_free(C, op);
+ return OPERATOR_PASS_THROUGH;
+ }
/* switch from camera view when: */
- if(vod->rv3d->persp != RV3D_PERSP) {
+ if(rv3d->persp != RV3D_PERSP) {
- if (U.uiflag & USER_AUTOPERSP)
- vod->rv3d->persp= RV3D_PERSP;
- else if(vod->rv3d->persp==RV3D_CAMOB) {
+ if (U.uiflag & USER_AUTOPERSP) {
+ rv3d->persp= RV3D_PERSP;
+ }
+ else if(rv3d->persp==RV3D_CAMOB) {
/* changed since 2.4x, use the camera view */
- View3D *v3d = CTX_wm_view3d(C);
- if(v3d->camera)
+ View3D *v3d = vod->sa->spacedata.first;
+
+ if(v3d->camera) {
view3d_settings_from_ob(v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, NULL);
+ }
- vod->rv3d->persp= RV3D_PERSP;
+ if(rv3d->persp==RV3D_CAMOB) {
+ rv3d->persp= rv3d->lpersp;
+ }
}
ED_region_tag_redraw(vod->ar);
}
if (event->type == MOUSEPAN) {
viewrotate_apply(vod, event->prevx, event->prevy);
- request_depth_update(CTX_wm_region_view3d(C));
+ request_depth_update(rv3d);
viewops_data_free(C, op);
@@ -755,7 +802,7 @@ static int viewrotate_invoke(bContext *C, wmOperator *op, wmEvent *event)
else if (event->type == MOUSEROTATE) {
/* MOUSEROTATE performs orbital rotation, so y axis delta is set to 0 */
viewrotate_apply(vod, event->prevx, event->y);
- request_depth_update(CTX_wm_region_view3d(C));
+ request_depth_update(rv3d);
viewops_data_free(C, op);
@@ -781,21 +828,6 @@ static int view3d_camera_active_poll(bContext *C)
return 0;
}
-static int view3d_rotate_poll(bContext *C)
-{
- if (!ED_operator_view3d_active(C)) {
- return 0;
- } else {
- RegionView3D *rv3d= CTX_wm_region_view3d(C);
- /* rv3d is null in menus, but it's ok when the menu is clicked on */
- /* XXX of course, this doesn't work with quadview
- * Maybe having exec return PASSTHROUGH would be better than polling here
- * Poll functions are full of problems anyway.
- * */
- return rv3d == NULL || rv3d->viewlock == 0;
- }
-}
-
void VIEW3D_OT_rotate(wmOperatorType *ot)
{
@@ -807,7 +839,7 @@ void VIEW3D_OT_rotate(wmOperatorType *ot)
/* api callbacks */
ot->invoke= viewrotate_invoke;
ot->modal= viewrotate_modal;
- ot->poll= view3d_rotate_poll;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER;
@@ -913,7 +945,7 @@ static int viewmove_modal(bContext *C, wmOperator *op, wmEvent *event)
viewmove_apply(vod, event->x, event->y);
}
else if (event_code==VIEW_CONFIRM) {
- request_depth_update(CTX_wm_region_view3d(C));
+ request_depth_update(vod->rv3d);
viewops_data_free(C, op);
@@ -931,7 +963,7 @@ static int viewmove_invoke(bContext *C, wmOperator *op, wmEvent *event)
if (event->type == MOUSEPAN) {
ViewOpsData *vod= op->customdata;
viewmove_apply(vod, event->prevx, event->prevy);
- request_depth_update(CTX_wm_region_view3d(C));
+ request_depth_update(vod->rv3d);
viewops_data_free(C, op);
@@ -1145,7 +1177,7 @@ static int viewzoom_modal(bContext *C, wmOperator *op, wmEvent *event)
viewzoom_apply(vod, event->x, event->y, U.viewzoom);
}
else if (event_code==VIEW_CONFIRM) {
- request_depth_update(CTX_wm_region_view3d(C));
+ request_depth_update(vod->rv3d);
viewops_data_free(C, op);
return OPERATOR_FINISHED;
@@ -1156,11 +1188,30 @@ static int viewzoom_modal(bContext *C, wmOperator *op, wmEvent *event)
static int viewzoom_exec(bContext *C, wmOperator *op)
{
- View3D *v3d = CTX_wm_view3d(C);
- RegionView3D *rv3d= CTX_wm_region_view3d(C);
+ View3D *v3d;
+ RegionView3D *rv3d;
+ ScrArea *sa;
+ ARegion *ar;
+
int delta= RNA_int_get(op->ptr, "delta");
- int mx = RNA_int_get(op->ptr, "mx");
- int my = RNA_int_get(op->ptr, "my");
+ int mx, my;
+
+ if(op->customdata) {
+ ViewOpsData *vod= op->customdata;
+
+ sa= vod->sa;
+ ar= vod->ar;
+ }
+ else {
+ sa= CTX_wm_area(C);
+ ar= CTX_wm_region(C);
+ }
+
+ v3d= sa->spacedata.first;
+ rv3d= ar->regiondata;
+
+ mx= RNA_property_is_set(op->ptr, "mx") ? RNA_int_get(op->ptr, "mx") : ar->winx / 2;
+ my= RNA_property_is_set(op->ptr, "my") ? RNA_int_get(op->ptr, "my") : ar->winy / 2;
if(delta < 0) {
/* this min and max is also in viewmove() */
@@ -1169,7 +1220,7 @@ static int viewzoom_exec(bContext *C, wmOperator *op)
if(rv3d->camzoom < RV3D_CAMZOOM_MIN) rv3d->camzoom= RV3D_CAMZOOM_MIN;
}
else if(rv3d->dist<10.0*v3d->far) {
- view_zoom_mouseloc(CTX_wm_region(C), 1.2f, mx, my);
+ view_zoom_mouseloc(ar, 1.2f, mx, my);
}
}
else {
@@ -1178,16 +1229,16 @@ static int viewzoom_exec(bContext *C, wmOperator *op)
if(rv3d->camzoom > RV3D_CAMZOOM_MAX) rv3d->camzoom= RV3D_CAMZOOM_MAX;
}
else if(rv3d->dist> 0.001*v3d->grid) {
- view_zoom_mouseloc(CTX_wm_region(C), .83333f, mx, my);
+ view_zoom_mouseloc(ar, .83333f, mx, my);
}
}
if(rv3d->viewlock & RV3D_BOXVIEW)
- view3d_boxview_sync(CTX_wm_area(C), CTX_wm_region(C));
+ view3d_boxview_sync(sa, ar);
+
+ request_depth_update(rv3d);
+ ED_region_tag_redraw(ar);
- request_depth_update(CTX_wm_region_view3d(C));
- ED_region_tag_redraw(CTX_wm_region(C));
-
viewops_data_free(C, op);
return OPERATOR_FINISHED;
@@ -1195,8 +1246,6 @@ static int viewzoom_exec(bContext *C, wmOperator *op)
static int viewzoom_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- int delta= RNA_int_get(op->ptr, "delta");
-
/* if one or the other zoom position aren't set, set from event */
if (!RNA_property_is_set(op->ptr, "mx") || !RNA_property_is_set(op->ptr, "my"))
{
@@ -1204,7 +1253,7 @@ static int viewzoom_invoke(bContext *C, wmOperator *op, wmEvent *event)
RNA_int_set(op->ptr, "my", event->y);
}
- if(delta) {
+ if(RNA_property_is_set(op->ptr, "delta")) {
/* makes op->customdata */
viewops_data_create(C, op, event);
viewzoom_exec(C, op);
@@ -1231,7 +1280,7 @@ static int viewzoom_invoke(bContext *C, wmOperator *op, wmEvent *event)
vod->origy = vod->oldy = vod->origy + event->x - event->prevx;
viewzoom_apply(vod, event->prevx, event->prevy, USER_ZOOM_DOLLY);
}
- request_depth_update(CTX_wm_region_view3d(C));
+ request_depth_update(vod->rv3d);
viewops_data_free(C, op);
return OPERATOR_FINISHED;
@@ -1264,7 +1313,7 @@ void VIEW3D_OT_zoom(wmOperatorType *ot)
ot->invoke= viewzoom_invoke;
ot->exec= viewzoom_exec;
ot->modal= viewzoom_modal;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER;
@@ -1274,7 +1323,7 @@ void VIEW3D_OT_zoom(wmOperatorType *ot)
RNA_def_int(ot->srna, "my", 0, 0, INT_MAX, "Zoom Position Y", "", 0, INT_MAX);
}
-static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.4x */
+static int view3d_all_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.4x */
{
ARegion *ar= CTX_wm_region(C);
View3D *v3d = CTX_wm_view3d(C);
@@ -1289,19 +1338,18 @@ static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.
int ok= 1, onedone=0;
if(center) {
- min[0]= min[1]= min[2]= 0.0f;
- max[0]= max[1]= max[2]= 0.0f;
-
/* in 2.4x this also move the cursor to (0, 0, 0) (with shift+c). */
curs= give_cursor(scene, v3d);
- curs[0]= curs[1]= curs[2]= 0.0;
+ zero_v3(min);
+ zero_v3(max);
+ zero_v3(curs);
}
else {
INIT_MINMAX(min, max);
}
for(base= scene->base.first; base; base= base->next) {
- if(base->lay & v3d->lay) {
+ if(BASE_VISIBLE(v3d, base)) {
onedone= 1;
minmax_object(base->object, min, max);
}
@@ -1318,9 +1366,7 @@ static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.
return OPERATOR_FINISHED;
}
- afm[0]= (max[0]-min[0]);
- afm[1]= (max[1]-min[1]);
- afm[2]= (max[2]-min[2]);
+ sub_v3_v3v3(afm, max, min);
size= 0.7f*MAX3(afm[0], afm[1], afm[2]);
if(size==0.0) ok= 0;
@@ -1342,7 +1388,7 @@ static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.
if (rv3d->persp==RV3D_CAMOB) {
rv3d->persp= RV3D_PERSP;
- smooth_view(C, NULL, v3d->camera, new_ofs, NULL, &new_dist, NULL);
+ smooth_view(C, v3d->camera, NULL, new_ofs, NULL, &new_dist, NULL);
}
else {
smooth_view(C, NULL, NULL, new_ofs, NULL, &new_dist, NULL);
@@ -1350,25 +1396,11 @@ static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.
}
// XXX BIF_view3d_previewrender_signal(curarea, PR_DBASE|PR_DISPRECT);
- if(rv3d->viewlock & RV3D_BOXVIEW)
- view3d_boxview_copy(CTX_wm_area(C), ar);
-
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, v3d);
return OPERATOR_FINISHED;
}
-static int viewhome_poll(bContext *C)
-{
- if(ED_operator_view3d_active(C)) {
- RegionView3D *rv3d= CTX_wm_region_view3d(C); //XXX, when accessed from a header menu this doesnt work!
- if(rv3d && rv3d->persp!=RV3D_CAMOB) {
- return 1;
- }
- }
-
- return 0;
-}
void VIEW3D_OT_view_all(wmOperatorType *ot)
{
@@ -1378,8 +1410,8 @@ void VIEW3D_OT_view_all(wmOperatorType *ot)
ot->idname= "VIEW3D_OT_view_all";
/* api callbacks */
- ot->exec= viewhome_exec;
- ot->poll= viewhome_poll;
+ ot->exec= view3d_all_exec;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= 0;
@@ -1388,7 +1420,7 @@ void VIEW3D_OT_view_all(wmOperatorType *ot)
}
-static int viewselected_exec(bContext *C, wmOperator *op) /* like a localview without local!, was centerview() in 2.4x */
+static int viewselected_exec(bContext *C, wmOperator *UNUSED(op)) /* like a localview without local!, was centerview() in 2.4x */
{
ARegion *ar= CTX_wm_region(C);
View3D *v3d = CTX_wm_view3d(C);
@@ -1445,7 +1477,7 @@ static int viewselected_exec(bContext *C, wmOperator *op) /* like a localview wi
}
}
else if (paint_facesel_test(ob)) {
- ok= minmax_tface(ob, min, max);
+ ok= paintface_minmax(ob, min, max);
}
else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT)) {
ok= PE_minmax(scene, min, max);
@@ -1505,9 +1537,9 @@ static int viewselected_exec(bContext *C, wmOperator *op) /* like a localview wi
smooth_view(C, NULL, NULL, new_ofs, NULL, ok_dist ? &new_dist : NULL, NULL);
}
+ /* smooth view does viewlock RV3D_BOXVIEW copy */
+
// XXX BIF_view3d_previewrender_signal(curarea, PR_DBASE|PR_DISPRECT);
- if(rv3d->viewlock & RV3D_BOXVIEW)
- view3d_boxview_copy(CTX_wm_area(C), ar);
return OPERATOR_FINISHED;
}
@@ -1522,13 +1554,13 @@ void VIEW3D_OT_view_selected(wmOperatorType *ot)
/* api callbacks */
ot->exec= viewselected_exec;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= 0;
}
-static int viewcenter_cursor_exec(bContext *C, wmOperator *op)
+static int viewcenter_cursor_exec(bContext *C, wmOperator *UNUSED(op))
{
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
@@ -1540,8 +1572,7 @@ static int viewcenter_cursor_exec(bContext *C, wmOperator *op)
negate_v3_v3(new_ofs, give_cursor(scene, v3d));
smooth_view(C, NULL, NULL, new_ofs, NULL, NULL, NULL);
- if (rv3d->viewlock & RV3D_BOXVIEW)
- view3d_boxview_copy(CTX_wm_area(C), CTX_wm_region(C));
+ /* smooth view does viewlock RV3D_BOXVIEW copy */
}
return OPERATOR_FINISHED;
@@ -1562,7 +1593,7 @@ void VIEW3D_OT_view_center_cursor(wmOperatorType *ot)
ot->flag= 0;
}
-static int view3d_center_camera_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.4x */
+static int view3d_center_camera_exec(bContext *C, wmOperator *UNUSED(op)) /* was view3d_home() in 2.4x */
{
RegionView3D *rv3d= CTX_wm_region_view3d(C);
@@ -1607,7 +1638,7 @@ static int render_border_exec(bContext *C, wmOperator *op)
rect.ymax= RNA_int_get(op->ptr, "ymax");
/* calculate range */
- view3d_calc_camera_border(scene, ar, rv3d, v3d, &vb);
+ view3d_calc_camera_border(scene, ar, rv3d, v3d, &vb, FALSE);
scene->r.border.xmin= ((float)rect.xmin-vb.xmin)/(vb.xmax-vb.xmin);
scene->r.border.ymin= ((float)rect.ymin-vb.ymin)/(vb.ymax-vb.ymin);
@@ -1681,10 +1712,8 @@ static int view3d_zoom_border_exec(bContext *C, wmOperator *op)
/* ZBuffer depth vars */
bglMats mats;
- float depth, depth_close= FLT_MAX;
- int had_depth = 0;
+ float depth_close= FLT_MAX;
double cent[2], p[3];
- int xs, ys;
/* note; otherwise opengl won't work */
view3d_operator_needs_opengl(C);
@@ -1698,38 +1727,19 @@ static int view3d_zoom_border_exec(bContext *C, wmOperator *op)
/* Get Z Depths, needed for perspective, nice for ortho */
bgl_get_mats(&mats);
draw_depth(scene, ar, v3d, NULL);
+
+ {
+ /* avoid allocating the whole depth buffer */
+ ViewDepths depth_temp= {0};
- /* force updating */
- if (rv3d->depths) {
- had_depth = 1;
- rv3d->depths->damaged = 1;
- }
-
- view3d_update_depths(ar, v3d);
-
- /* Constrain rect to depth bounds */
- if (rect.xmin < 0) rect.xmin = 0;
- if (rect.ymin < 0) rect.ymin = 0;
- if (rect.xmax >= rv3d->depths->w) rect.xmax = rv3d->depths->w-1;
- if (rect.ymax >= rv3d->depths->h) rect.ymax = rv3d->depths->h-1;
-
- /* Find the closest Z pixel */
- for (xs=rect.xmin; xs < rect.xmax; xs++) {
- for (ys=rect.ymin; ys < rect.ymax; ys++) {
- depth= rv3d->depths->depths[ys*rv3d->depths->w+xs];
- if(depth < rv3d->depths->depth_range[1] && depth > rv3d->depths->depth_range[0]) {
- if (depth_close > depth) {
- depth_close = depth;
- }
- }
- }
- }
-
- if (had_depth==0) {
- MEM_freeN(rv3d->depths->depths);
- rv3d->depths->depths = NULL;
+ /* avoid view3d_update_depths() for speed. */
+ view3d_update_depths_rect(ar, &depth_temp, &rect);
+
+ /* find the closest Z pixel */
+ depth_close= view3d_depth_near(&depth_temp);
+
+ MEM_freeN(depth_temp.depths);
}
- rv3d->depths->damaged = 1;
cent[0] = (((double)rect.xmin)+((double)rect.xmax)) / 2;
cent[1] = (((double)rect.ymin)+((double)rect.ymax)) / 2;
@@ -1811,7 +1821,6 @@ static int view3d_zoom_border_invoke(bContext *C, wmOperator *op, wmEvent *event
void VIEW3D_OT_zoom_border(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Border Zoom";
ot->description = "Zoom in the view to the nearest object contained in the border";
@@ -1822,7 +1831,7 @@ void VIEW3D_OT_zoom_border(wmOperatorType *ot)
ot->exec= view3d_zoom_border_exec;
ot->modal= WM_border_select_modal;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= 0;
@@ -1929,6 +1938,9 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
viewnum = RNA_enum_get(op->ptr, "type");
align_active = RNA_boolean_get(op->ptr, "align_active");
+ /* set this to zero, gets handled in axis_set_view */
+ if(rv3d->viewlock)
+ align_active= 0;
/* Use this to test if we started out with a camera */
@@ -2035,6 +2047,8 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
+
+
void VIEW3D_OT_viewnumpad(wmOperatorType *ot)
{
/* identifiers */
@@ -2044,7 +2058,7 @@ void VIEW3D_OT_viewnumpad(wmOperatorType *ot)
/* api callbacks */
ot->exec= viewnumpad_exec;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= 0;
@@ -2112,7 +2126,7 @@ void VIEW3D_OT_view_orbit(wmOperatorType *ot)
/* api callbacks */
ot->exec= vieworbit_exec;
- ot->poll= view3d_rotate_poll;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= 0;
@@ -2136,14 +2150,11 @@ static int viewpan_exec(bContext *C, wmOperator *op)
pandir = RNA_enum_get(op->ptr, "type");
initgrabz(rv3d, 0.0, 0.0, 0.0);
-
if(pandir == V3D_VIEW_PANRIGHT) window_to_3d_delta(ar, vec, -32, 0);
else if(pandir == V3D_VIEW_PANLEFT) window_to_3d_delta(ar, vec, 32, 0);
else if(pandir == V3D_VIEW_PANUP) window_to_3d_delta(ar, vec, 0, -25);
else if(pandir == V3D_VIEW_PANDOWN) window_to_3d_delta(ar, vec, 0, 25);
- rv3d->ofs[0]+= vec[0];
- rv3d->ofs[1]+= vec[1];
- rv3d->ofs[2]+= vec[2];
+ add_v3_v3(rv3d->ofs, vec);
if(rv3d->viewlock & RV3D_BOXVIEW)
view3d_boxview_sync(CTX_wm_area(C), ar);
@@ -2162,14 +2173,14 @@ void VIEW3D_OT_view_pan(wmOperatorType *ot)
/* api callbacks */
ot->exec= viewpan_exec;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= 0;
RNA_def_enum(ot->srna, "type", prop_view_pan_items, 0, "Pan", "Direction of View Pan");
}
-static int viewpersportho_exec(bContext *C, wmOperator *op)
+static int viewpersportho_exec(bContext *C, wmOperator *UNUSED(op))
{
ARegion *ar= CTX_wm_region(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
@@ -2194,7 +2205,7 @@ void VIEW3D_OT_view_persportho(wmOperatorType *ot)
/* api callbacks */
ot->exec= viewpersportho_exec;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= 0;
@@ -2202,7 +2213,7 @@ void VIEW3D_OT_view_persportho(wmOperatorType *ot)
/* ******************** add background image operator **************** */
-static BGpic *add_background_image(bContext *C)
+static BGpic *background_image_add(bContext *C)
{
View3D *v3d= CTX_wm_view3d(C);
@@ -2218,16 +2229,15 @@ static BGpic *add_background_image(bContext *C)
return bgpic;
}
-static int add_background_image_exec(bContext *C, wmOperator *op)
+static int background_image_add_exec(bContext *C, wmOperator *UNUSED(op))
{
- add_background_image(C);
+ background_image_add(C);
return OPERATOR_FINISHED;
}
-static int add_background_image_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int background_image_add_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
- Scene *scene= CTX_data_scene(C);
View3D *v3d= CTX_wm_view3d(C);
Image *ima= NULL;
BGpic *bgpic;
@@ -2238,14 +2248,14 @@ static int add_background_image_invoke(bContext *C, wmOperator *op, wmEvent *eve
char path[FILE_MAX];
RNA_string_get(op->ptr, "filepath", path);
- ima= BKE_add_image_file(path, scene ? scene->r.cfra : 1);
+ ima= BKE_add_image_file(path);
}
else if(RNA_property_is_set(op->ptr, "name")) {
RNA_string_get(op->ptr, "name", name);
ima= (Image *)find_id("IM", name);
}
- bgpic = add_background_image(C);
+ bgpic = background_image_add(C);
if (ima) {
bgpic->ima = ima;
@@ -2262,16 +2272,16 @@ static int add_background_image_invoke(bContext *C, wmOperator *op, wmEvent *eve
return OPERATOR_FINISHED;
}
-void VIEW3D_OT_add_background_image(wmOperatorType *ot)
+void VIEW3D_OT_background_image_add(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Add Background Image";
ot->description= "Add a new background image";
- ot->idname = "VIEW3D_OT_add_background_image";
+ ot->idname = "VIEW3D_OT_background_image_add";
/* api callbacks */
- ot->invoke = add_background_image_invoke;
- ot->exec = add_background_image_exec;
+ ot->invoke = background_image_add_invoke;
+ ot->exec = background_image_add_exec;
ot->poll = ED_operator_view3d_active;
/* flags */
@@ -2284,33 +2294,34 @@ void VIEW3D_OT_add_background_image(wmOperatorType *ot)
/* ***** remove image operator ******* */
-static int remove_background_image_exec(bContext *C, wmOperator *op)
+static int background_image_remove_exec(bContext *C, wmOperator *op)
{
- BGpic *bgpic_rem = CTX_data_pointer_get_type(C, "bgpic", &RNA_BackgroundImage).data;
View3D *vd = CTX_wm_view3d(C);
int index = RNA_int_get(op->ptr, "index");
+ BGpic *bgpic_rem= BLI_findlink(&vd->bgpicbase, index);
- bgpic_rem = BLI_findlink(&vd->bgpicbase, index);
if(bgpic_rem) {
BLI_remlink(&vd->bgpicbase, bgpic_rem);
if(bgpic_rem->ima) bgpic_rem->ima->id.us--;
MEM_freeN(bgpic_rem);
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, vd);
+ return OPERATOR_FINISHED;
+ }
+ else {
+ return OPERATOR_CANCELLED;
}
- WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, vd);
-
- return OPERATOR_FINISHED;
}
-void VIEW3D_OT_remove_background_image(wmOperatorType *ot)
+void VIEW3D_OT_background_image_remove(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Remove Background Image";
ot->description= "Remove a background image from the 3D view";
- ot->idname = "VIEW3D_OT_remove_background_image";
+ ot->idname = "VIEW3D_OT_background_image_remove";
/* api callbacks */
- ot->exec = remove_background_image_exec;
+ ot->exec = background_image_remove_exec;
ot->poll = ED_operator_view3d_active;
/* flags */
@@ -2413,7 +2424,7 @@ void VIEW3D_OT_clip_border(wmOperatorType *ot)
ot->exec= view3d_clipping_exec;
ot->modal= WM_border_select_modal;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= 0;
@@ -2428,7 +2439,7 @@ void VIEW3D_OT_clip_border(wmOperatorType *ot)
/* ***************** 3d cursor cursor op ******************* */
/* mx my in region coords */
-static int set_3dcursor_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int set_3dcursor_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
Scene *scene= CTX_data_scene(C);
ARegion *ar= CTX_wm_region(C);
@@ -2462,7 +2473,9 @@ static int set_3dcursor_invoke(bContext *C, wmOperator *op, wmEvent *event)
short depth_used = 0;
if (U.uiflag & USER_ORBIT_ZBUF) { /* maybe this should be accessed some other way */
- short mval_depth[2] = {mx, my};
+ short mval_depth[2];
+ mval_depth[0]= mx;
+ mval_depth[1]= my;
view3d_operator_needs_opengl(C);
if (view_autodist(scene, ar, v3d, mval_depth, fp))
depth_used= 1;
@@ -2553,7 +2566,7 @@ void VIEW3D_OT_manipulator(wmOperatorType *ot)
Transform_Properties(ot, P_CONSTRAINT);
}
-static int enable_manipulator_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int enable_manipulator_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
View3D *v3d = CTX_wm_view3d(C);
@@ -2591,90 +2604,49 @@ void VIEW3D_OT_enable_manipulator(wmOperatorType *ot)
/* ************************* below the line! *********************** */
-static float view_autodist_depth_margin(ARegion *ar, short *mval, int margin)
+static float view_autodist_depth_margin(ARegion *ar, short mval[2], int margin)
{
- RegionView3D *rv3d= ar->regiondata;
- float depth= FLT_MAX;
+ ViewDepths depth_temp= {0};
+ rcti rect;
+ float depth_close;
if(margin==0) {
- if (mval[0] < 0) return 0;
- if (mval[1] < 0) return 0;
- if (mval[0] >= rv3d->depths->w) return 0;
- if (mval[1] >= rv3d->depths->h) return 0;
-
/* Get Z Depths, needed for perspective, nice for ortho */
- depth= rv3d->depths->depths[mval[1]*rv3d->depths->w+mval[0]];
- if(depth >= rv3d->depths->depth_range[1] || depth <= rv3d->depths->depth_range[0]) {
- depth= FLT_MAX;
- }
+ rect.xmin= mval[0];
+ rect.ymin= mval[1];
+ rect.xmax= mval[0] + 1;
+ rect.ymax= mval[1] + 1;
}
else {
- rcti rect;
- float depth_close= FLT_MAX;
- int xs, ys;
-
rect.xmax = mval[0] + margin;
rect.ymax = mval[1] + margin;
rect.xmin = mval[0] - margin;
rect.ymin = mval[1] - margin;
-
- /* Constrain rect to depth bounds */
- if (rect.xmin < 0) rect.xmin = 0;
- if (rect.ymin < 0) rect.ymin = 0;
- if (rect.xmax >= rv3d->depths->w) rect.xmax = rv3d->depths->w-1;
- if (rect.ymax >= rv3d->depths->h) rect.ymax = rv3d->depths->h-1;
-
- /* Find the closest Z pixel */
- for (xs=rect.xmin; xs < rect.xmax; xs++) {
- for (ys=rect.ymin; ys < rect.ymax; ys++) {
- depth= rv3d->depths->depths[ys*rv3d->depths->w+xs];
- if(depth < rv3d->depths->depth_range[1] && depth > rv3d->depths->depth_range[0]) {
- if (depth_close > depth) {
- depth_close = depth;
- }
- }
- }
- }
-
- depth= depth_close;
}
- return depth;
+ view3d_update_depths_rect(ar, &depth_temp, &rect);
+ depth_close= view3d_depth_near(&depth_temp);
+ if(depth_temp.depths) MEM_freeN(depth_temp.depths);
+ return depth_close;
}
/* XXX todo Zooms in on a border drawn by the user */
int view_autodist(Scene *scene, ARegion *ar, View3D *v3d, short *mval, float mouse_worldloc[3] ) //, float *autodist )
{
- RegionView3D *rv3d= ar->regiondata;
bglMats mats; /* ZBuffer depth vars */
float depth_close= FLT_MAX;
- int had_depth = 0;
double cent[2], p[3];
/* Get Z Depths, needed for perspective, nice for ortho */
bgl_get_mats(&mats);
draw_depth(scene, ar, v3d, NULL);
- /* force updating */
- if (rv3d->depths) {
- had_depth = 1;
- rv3d->depths->damaged = 1;
- }
-
- view3d_update_depths(ar, v3d);
-
depth_close= view_autodist_depth_margin(ar, mval, 4);
if (depth_close==FLT_MAX)
return 0;
- if (had_depth==0) {
- MEM_freeN(rv3d->depths->depths);
- rv3d->depths->depths = NULL;
- }
- rv3d->depths->damaged = 1;
-
cent[0] = (double)mval[0];
cent[1] = (double)mval[1];
@@ -2689,8 +2661,6 @@ int view_autodist(Scene *scene, ARegion *ar, View3D *v3d, short *mval, float mou
int view_autodist_init(Scene *scene, ARegion *ar, View3D *v3d, int mode) //, float *autodist )
{
- RegionView3D *rv3d= ar->regiondata;
-
/* Get Z Depths, needed for perspective, nice for ortho */
switch(mode) {
case 0:
@@ -2701,12 +2671,6 @@ int view_autodist_init(Scene *scene, ARegion *ar, View3D *v3d, int mode) //, flo
break;
}
- /* force updating */
- if (rv3d->depths) {
- rv3d->depths->damaged = 1;
- }
-
- view3d_update_depths(ar, v3d);
return 1;
}
@@ -2739,12 +2703,51 @@ int view_autodist_simple(ARegion *ar, short *mval, float mouse_worldloc[3], int
return 1;
}
-int view_autodist_depth(struct ARegion *ar, short *mval, int margin, float *depth)
+int view_autodist_depth(struct ARegion *ar, short mval[2], int margin, float *depth)
{
*depth= view_autodist_depth_margin(ar, mval, margin);
return (*depth==FLT_MAX) ? 0:1;
+}
+
+static int depth_segment_cb(int x, int y, void *userData)
+{
+ struct { struct ARegion *ar; int margin; float depth; } *data = userData;
+ short mval[2];
+ float depth;
+
+ mval[0]= (short)x;
+ mval[1]= (short)y;
+
+ depth= view_autodist_depth_margin(data->ar, mval, data->margin);
+
+ if(depth != FLT_MAX) {
+ data->depth= depth;
return 0;
+ }
+ else {
+ return 1;
+ }
+}
+
+int view_autodist_depth_segment(struct ARegion *ar, short mval_sta[2], short mval_end[2], int margin, float *depth)
+{
+ struct { struct ARegion *ar; int margin; float depth; } data = {0};
+ int p1[2];
+ int p2[2];
+
+ data.ar= ar;
+ data.margin= margin;
+ data.depth= FLT_MAX;
+
+ VECCOPY2D(p1, mval_sta);
+ VECCOPY2D(p2, mval_end);
+
+ plot_line_v2v2i(p1, p2, depth_segment_cb, &data);
+
+ *depth= data.depth;
+
+ return (*depth==FLT_MAX) ? 0:1;
}
/* ********************* NDOF ************************ */
@@ -2796,6 +2799,7 @@ void filterNDOFvalues(float *sbval)
sbval[i]=0.0;
}
+#if 0
// statics for controlling rv3d->dist corrections.
// viewmoveNDOF zeros and adjusts rv3d->ofs.
// viewmove restores based on dz_flag state.
@@ -2803,7 +2807,7 @@ void filterNDOFvalues(float *sbval)
int dz_flag = 0;
float m_dist;
-void viewmoveNDOFfly(ARegion *ar, View3D *v3d, int mode)
+void viewmoveNDOFfly(ARegion *ar, View3D *v3d, int UNUSED(mode))
{
RegionView3D *rv3d= ar->regiondata;
int i;
@@ -2932,7 +2936,7 @@ void viewmoveNDOFfly(ARegion *ar, View3D *v3d, int mode)
// XXX BIF_view3d_previewrender_signal(ar, PR_DBASE|PR_DISPRECT);
}
-void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode)
+void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int UNUSED(mode))
{
RegionView3D *rv3d= ar->regiondata;
float fval[7];
@@ -3136,7 +3140,23 @@ void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode)
*/
// XXX scrarea_do_windraw(curarea);
}
-
-
-
-
+#endif // if 0, unused NDof code
+
+/* give a 4x4 matrix from a perspective view, only needs viewquat, ofs and dist
+ * basically the same as...
+ * rv3d->persp= RV3D_PERSP
+ * setviewmatrixview3d(scene, v3d, rv3d);
+ * setcameratoview3d(v3d, rv3d, v3d->camera);
+ * ...but less of a hassle
+ * */
+void view3d_persp_mat4(RegionView3D *rv3d, float mat[][4])
+{
+ float qt[4], dvec[3];
+ copy_qt_qt(qt, rv3d->viewquat);
+ qt[0]= -qt[0];
+ quat_to_mat4(mat, qt);
+ mat[3][2] -= rv3d->dist;
+ translate_m4(mat, rv3d->ofs[0], rv3d->ofs[1], rv3d->ofs[2]);
+ mul_v3_v3fl(dvec, mat[2], -rv3d->dist);
+ sub_v3_v3v3(mat[3], dvec, rv3d->ofs);
+}
diff --git a/source/blender/editors/space_view3d/view3d_fly.c b/source/blender/editors/space_view3d/view3d_fly.c
new file mode 100644
index 00000000000..e6119672977
--- /dev/null
+++ b/source/blender/editors/space_view3d/view3d_fly.c
@@ -0,0 +1,942 @@
+/**
+ * $Id: view3d_fly.c 34159 2011-01-07 18:36:47Z campbellbarton $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* defines VIEW3D_OT_fly modal operator */
+
+#include "DNA_anim_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_context.h"
+#include "BKE_object.h"
+#include "BKE_report.h"
+
+#include "BKE_depsgraph.h" /* for fly mode updating */
+
+#include "BIF_gl.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_keyframing.h"
+#include "ED_screen.h"
+#include "ED_space_api.h"
+
+#include "PIL_time.h" /* smoothview */
+
+#include "view3d_intern.h" // own include
+
+/* NOTE: these defines are saved in keymap files, do not change values but just add new ones */
+#define FLY_MODAL_CANCEL 1
+#define FLY_MODAL_CONFIRM 2
+#define FLY_MODAL_ACCELERATE 3
+#define FLY_MODAL_DECELERATE 4
+#define FLY_MODAL_PAN_ENABLE 5
+#define FLY_MODAL_PAN_DISABLE 6
+#define FLY_MODAL_DIR_FORWARD 7
+#define FLY_MODAL_DIR_BACKWARD 8
+#define FLY_MODAL_DIR_LEFT 9
+#define FLY_MODAL_DIR_RIGHT 10
+#define FLY_MODAL_DIR_UP 11
+#define FLY_MODAL_DIR_DOWN 12
+#define FLY_MODAL_AXIS_LOCK_X 13
+#define FLY_MODAL_AXIS_LOCK_Z 14
+#define FLY_MODAL_PRECISION_ENABLE 15
+#define FLY_MODAL_PRECISION_DISABLE 16
+
+/* called in transform_ops.c, on each regeneration of keymaps */
+void fly_modal_keymap(wmKeyConfig *keyconf)
+{
+ static EnumPropertyItem modal_items[] = {
+ {FLY_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""},
+ {FLY_MODAL_CONFIRM, "CONFIRM", 0, "Confirm", ""},
+ {FLY_MODAL_ACCELERATE, "ACCELERATE", 0, "Accelerate", ""},
+ {FLY_MODAL_DECELERATE, "DECELERATE", 0, "Decelerate", ""},
+
+ {FLY_MODAL_PAN_ENABLE, "PAN_ENABLE", 0, "Pan Enable", ""},
+ {FLY_MODAL_PAN_DISABLE, "PAN_DISABLE", 0, "Pan Disable", ""},
+
+ {FLY_MODAL_DIR_FORWARD, "FORWARD", 0, "Fly Forward", ""},
+ {FLY_MODAL_DIR_BACKWARD,"BACKWARD", 0, "Fly Backward", ""},
+ {FLY_MODAL_DIR_LEFT, "LEFT", 0, "Fly Left", ""},
+ {FLY_MODAL_DIR_RIGHT, "RIGHT", 0, "Fly Right", ""},
+ {FLY_MODAL_DIR_UP, "UP", 0, "Fly Up", ""},
+ {FLY_MODAL_DIR_DOWN, "DOWN", 0, "Fly Down", ""},
+
+ {FLY_MODAL_AXIS_LOCK_X, "AXIS_LOCK_X", 0, "X Axis Correction", "X axis correction (toggle)"},
+ {FLY_MODAL_AXIS_LOCK_Z, "AXIS_LOCK_Z", 0, "X Axis Correction", "Z axis correction (toggle)"},
+
+ {FLY_MODAL_PRECISION_ENABLE, "PRECISION_ENABLE", 0, "Precision Enable", ""},
+ {FLY_MODAL_PRECISION_DISABLE, "PRECISION_DISABLE", 0, "Precision Disable", ""},
+
+ {0, NULL, 0, NULL, NULL}};
+
+ wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "View3D Fly Modal");
+
+ /* this function is called for each spacetype, only needs to add map once */
+ if(keymap) return;
+
+ keymap= WM_modalkeymap_add(keyconf, "View3D Fly Modal", modal_items);
+
+ /* items for modal map */
+ WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CANCEL);
+ WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_ANY, KM_ANY, 0, FLY_MODAL_CANCEL);
+
+ WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_ANY, KM_ANY, 0, FLY_MODAL_CONFIRM);
+ WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM);
+ WM_modalkeymap_add_item(keymap, SPACEKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM);
+ WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM);
+
+ WM_modalkeymap_add_item(keymap, PADPLUSKEY, KM_PRESS, 0, 0, FLY_MODAL_ACCELERATE);
+ WM_modalkeymap_add_item(keymap, PADMINUS, KM_PRESS, 0, 0, FLY_MODAL_DECELERATE);
+ WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, 0, 0, FLY_MODAL_ACCELERATE);
+ WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, 0, 0, FLY_MODAL_DECELERATE);
+
+ WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_PRESS, KM_ANY, 0, FLY_MODAL_PAN_ENABLE);
+ WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, KM_ANY, 0, FLY_MODAL_PAN_DISABLE); /* XXX - Bug in the event system, middle mouse release doesnt work */
+
+ /* WASD */
+ WM_modalkeymap_add_item(keymap, WKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_FORWARD);
+ WM_modalkeymap_add_item(keymap, SKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_BACKWARD);
+ WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_LEFT);
+ WM_modalkeymap_add_item(keymap, DKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_RIGHT);
+ WM_modalkeymap_add_item(keymap, RKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_UP);
+ WM_modalkeymap_add_item(keymap, FKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_DOWN);
+
+ WM_modalkeymap_add_item(keymap, XKEY, KM_PRESS, 0, 0, FLY_MODAL_AXIS_LOCK_X);
+ WM_modalkeymap_add_item(keymap, ZKEY, KM_PRESS, 0, 0, FLY_MODAL_AXIS_LOCK_Z);
+
+ WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_PRECISION_ENABLE);
+ WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_RELEASE, KM_ANY, 0, FLY_MODAL_PRECISION_DISABLE);
+
+ /* assign map to operators */
+ WM_modalkeymap_assign(keymap, "VIEW3D_OT_fly");
+
+}
+
+typedef struct FlyInfo {
+ /* context stuff */
+ RegionView3D *rv3d;
+ View3D *v3d;
+ ARegion *ar;
+ Scene *scene;
+
+ wmTimer *timer; /* needed for redraws */
+
+ short state;
+ short use_precision;
+ short redraw;
+ short mval[2];
+
+ /* fly state state */
+ float speed; /* the speed the view is moving per redraw */
+ short axis; /* Axis index to move allong by default Z to move allong the view */
+ short pan_view; /* when true, pan the view instead of rotating */
+
+ /* relative view axis locking - xlock, zlock
+ 0; disabled
+ 1; enabled but not checking because mouse hasnt moved outside the margin since locking was checked an not needed
+ when the mouse moves, locking is set to 2 so checks are done.
+ 2; mouse moved and checking needed, if no view altering is donem its changed back to 1 */
+ short xlock, zlock;
+ float xlock_momentum, zlock_momentum; /* nicer dynamics */
+ float grid; /* world scale 1.0 default */
+
+ /* root most parent */
+ Object *root_parent;
+
+ /* backup values */
+ float dist_backup; /* backup the views distance since we use a zero dist for fly mode */
+ float ofs_backup[3]; /* backup the views offset incase the user cancels flying in non camera mode */
+ float rot_backup[4]; /* backup the views quat incase the user cancels flying in non camera mode. (quat for view, eul for camera) */
+ short persp_backup; /* remember if were ortho or not, only used for restoring the view if it was a ortho view */
+
+ void *obtfm; /* backup the objects transform */
+
+ /* compare between last state */
+ double time_lastwheel; /* used to accelerate when using the mousewheel a lot */
+ double time_lastdraw; /* time between draws */
+
+ void *draw_handle_pixel;
+
+ /* use for some lag */
+ float dvec_prev[3]; /* old for some lag */
+
+} FlyInfo;
+
+static void drawFlyPixel(const struct bContext *UNUSED(C), struct ARegion *UNUSED(ar), void *arg)
+{
+ FlyInfo *fly = arg;
+
+ /* draws 4 edge brackets that frame the safe area where the
+ mouse can move during fly mode without spinning the view */
+ float x1, x2, y1, y2;
+
+ x1= 0.45*(float)fly->ar->winx;
+ y1= 0.45*(float)fly->ar->winy;
+ x2= 0.55*(float)fly->ar->winx;
+ y2= 0.55*(float)fly->ar->winy;
+ cpack(0);
+
+
+ glBegin(GL_LINES);
+ /* bottom left */
+ glVertex2f(x1,y1);
+ glVertex2f(x1,y1+5);
+
+ glVertex2f(x1,y1);
+ glVertex2f(x1+5,y1);
+
+ /* top right */
+ glVertex2f(x2,y2);
+ glVertex2f(x2,y2-5);
+
+ glVertex2f(x2,y2);
+ glVertex2f(x2-5,y2);
+
+ /* top left */
+ glVertex2f(x1,y2);
+ glVertex2f(x1,y2-5);
+
+ glVertex2f(x1,y2);
+ glVertex2f(x1+5,y2);
+
+ /* bottom right */
+ glVertex2f(x2,y1);
+ glVertex2f(x2,y1+5);
+
+ glVertex2f(x2,y1);
+ glVertex2f(x2-5,y1);
+ glEnd();
+}
+
+/* FlyInfo->state */
+#define FLY_RUNNING 0
+#define FLY_CANCEL 1
+#define FLY_CONFIRM 2
+
+static int initFlyInfo (bContext *C, FlyInfo *fly, wmOperator *op, wmEvent *event)
+{
+ float upvec[3]; // tmp
+ float mat[3][3];
+
+ fly->rv3d= CTX_wm_region_view3d(C);
+ fly->v3d = CTX_wm_view3d(C);
+ fly->ar = CTX_wm_region(C);
+ fly->scene= CTX_data_scene(C);
+
+ if(fly->rv3d->persp==RV3D_CAMOB && fly->v3d->camera->id.lib) {
+ BKE_report(op->reports, RPT_ERROR, "Cannot fly a camera from an external library");
+ return FALSE;
+ }
+
+ if(fly->v3d->ob_centre) {
+ BKE_report(op->reports, RPT_ERROR, "Cannot fly when the view is locked to an object");
+ return FALSE;
+ }
+
+ if(fly->rv3d->persp==RV3D_CAMOB && fly->v3d->camera->constraints.first) {
+ BKE_report(op->reports, RPT_ERROR, "Cannot fly an object with constraints");
+ return FALSE;
+ }
+
+ fly->state= FLY_RUNNING;
+ fly->speed= 0.0f;
+ fly->axis= 2;
+ fly->pan_view= FALSE;
+ fly->xlock= FALSE;
+ fly->zlock= FALSE;
+ fly->xlock_momentum=0.0f;
+ fly->zlock_momentum=0.0f;
+ fly->grid= 1.0f;
+ fly->use_precision= 0;
+
+ fly->dvec_prev[0]= fly->dvec_prev[1]= fly->dvec_prev[2]= 0.0f;
+
+ fly->timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f);
+
+ fly->mval[0] = event->x - fly->ar->winrct.xmin;
+ fly->mval[1] = event->y - fly->ar->winrct.ymin;
+
+
+ fly->time_lastdraw= fly->time_lastwheel= PIL_check_seconds_timer();
+
+ fly->draw_handle_pixel = ED_region_draw_cb_activate(fly->ar->type, drawFlyPixel, fly, REGION_DRAW_POST_PIXEL);
+
+ fly->rv3d->rflag |= RV3D_NAVIGATING; /* so we draw the corner margins */
+
+ /* detect weather to start with Z locking */
+ upvec[0]=1.0f; upvec[1]=0.0f; upvec[2]=0.0f;
+ copy_m3_m4(mat, fly->rv3d->viewinv);
+ mul_m3_v3(mat, upvec);
+ if (fabs(upvec[2]) < 0.1)
+ fly->zlock = 1;
+ upvec[0]=0; upvec[1]=0; upvec[2]=0;
+
+ fly->persp_backup= fly->rv3d->persp;
+ fly->dist_backup= fly->rv3d->dist;
+ if (fly->rv3d->persp==RV3D_CAMOB) {
+ Object *ob_back;
+ if((fly->root_parent=fly->v3d->camera->parent)) {
+ while(fly->root_parent->parent)
+ fly->root_parent= fly->root_parent->parent;
+ ob_back= fly->root_parent;
+ }
+ else {
+ ob_back= fly->v3d->camera;
+ }
+
+ /* store the original camera loc and rot */
+ /* TODO. axis angle etc */
+
+ fly->obtfm= object_tfm_backup(ob_back);
+
+ where_is_object(fly->scene, fly->v3d->camera);
+ negate_v3_v3(fly->rv3d->ofs, fly->v3d->camera->obmat[3]);
+
+ fly->rv3d->dist=0.0;
+ } else {
+ /* perspective or ortho */
+ if (fly->rv3d->persp==RV3D_ORTHO)
+ fly->rv3d->persp= RV3D_PERSP; /*if ortho projection, make perspective */
+ copy_qt_qt(fly->rot_backup, fly->rv3d->viewquat);
+ copy_v3_v3(fly->ofs_backup, fly->rv3d->ofs);
+ fly->rv3d->dist= 0.0f;
+
+ upvec[2]= fly->dist_backup; /*x and y are 0*/
+ mul_m3_v3(mat, upvec);
+ sub_v3_v3(fly->rv3d->ofs, upvec);
+ /*Done with correcting for the dist*/
+ }
+
+
+ /* center the mouse, probably the UI mafia are against this but without its quite annoying */
+ WM_cursor_warp(CTX_wm_window(C), fly->ar->winrct.xmin + fly->ar->winx/2, fly->ar->winrct.ymin + fly->ar->winy/2);
+
+ return 1;
+}
+
+static int flyEnd(bContext *C, FlyInfo *fly)
+{
+ RegionView3D *rv3d= fly->rv3d;
+ View3D *v3d = fly->v3d;
+
+ float upvec[3];
+
+ if(fly->state == FLY_RUNNING)
+ return OPERATOR_RUNNING_MODAL;
+
+ WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), fly->timer);
+
+ ED_region_draw_cb_exit(fly->ar->type, fly->draw_handle_pixel);
+
+ rv3d->dist= fly->dist_backup;
+
+ if (fly->state == FLY_CANCEL) {
+ /* Revert to original view? */
+ if (fly->persp_backup==RV3D_CAMOB) { /* a camera view */
+ Object *ob_back;
+ if(fly->root_parent)ob_back= fly->root_parent;
+ else ob_back= fly->v3d->camera;
+
+ /* store the original camera loc and rot */
+ object_tfm_restore(ob_back, fly->obtfm);
+
+ DAG_id_tag_update(&ob_back->id, OB_RECALC_OB);
+ } else {
+ /* Non Camera we need to reset the view back to the original location bacause the user canceled*/
+ copy_qt_qt(rv3d->viewquat, fly->rot_backup);
+ copy_v3_v3(rv3d->ofs, fly->ofs_backup);
+ rv3d->persp= fly->persp_backup;
+ }
+ }
+ else if (fly->persp_backup==RV3D_CAMOB) { /* camera */
+ DAG_id_tag_update(fly->root_parent ? &fly->root_parent->id : &v3d->camera->id, OB_RECALC_OB);
+ }
+ else { /* not camera */
+ /* Apply the fly mode view */
+ /*restore the dist*/
+ float mat[3][3];
+ upvec[0]= upvec[1]= 0;
+ upvec[2]= fly->dist_backup; /*x and y are 0*/
+ copy_m3_m4(mat, rv3d->viewinv);
+ mul_m3_v3(mat, upvec);
+ add_v3_v3(rv3d->ofs, upvec);
+ /*Done with correcting for the dist */
+ }
+
+ rv3d->rflag &= ~RV3D_NAVIGATING;
+//XXX2.5 BIF_view3d_previewrender_signal(fly->sa, PR_DBASE|PR_DISPRECT); /* not working at the moment not sure why */
+
+ if(fly->obtfm)
+ MEM_freeN(fly->obtfm);
+
+ if(fly->state == FLY_CONFIRM) {
+ MEM_freeN(fly);
+ return OPERATOR_FINISHED;
+ }
+
+ MEM_freeN(fly);
+ return OPERATOR_CANCELLED;
+}
+
+static void flyEvent(FlyInfo *fly, wmEvent *event)
+{
+ if (event->type == TIMER && event->customdata == fly->timer) {
+ fly->redraw = 1;
+ }
+ else if (event->type == MOUSEMOVE) {
+ fly->mval[0] = event->x - fly->ar->winrct.xmin;
+ fly->mval[1] = event->y - fly->ar->winrct.ymin;
+ } /* handle modal keymap first */
+ else if (event->type == EVT_MODAL_MAP) {
+ switch (event->val) {
+ case FLY_MODAL_CANCEL:
+ fly->state = FLY_CANCEL;
+ break;
+ case FLY_MODAL_CONFIRM:
+ fly->state = FLY_CONFIRM;
+ break;
+
+ case FLY_MODAL_ACCELERATE:
+ {
+ double time_currwheel;
+ float time_wheel;
+
+ time_currwheel= PIL_check_seconds_timer();
+ time_wheel = (float)(time_currwheel - fly->time_lastwheel);
+ fly->time_lastwheel = time_currwheel;
+ /*printf("Wheel %f\n", time_wheel);*/
+ /*Mouse wheel delays range from 0.5==slow to 0.01==fast*/
+ time_wheel = 1+ (10 - (20*MIN2(time_wheel, 0.5))); /* 0-0.5 -> 0-5.0 */
+
+ if (fly->speed<0.0f) fly->speed= 0.0f;
+ else {
+ if (event->shift)
+ fly->speed+= fly->grid*time_wheel*0.1;
+ else
+ fly->speed+= fly->grid*time_wheel;
+ }
+ break;
+ }
+ case FLY_MODAL_DECELERATE:
+ {
+ double time_currwheel;
+ float time_wheel;
+
+ time_currwheel= PIL_check_seconds_timer();
+ time_wheel = (float)(time_currwheel - fly->time_lastwheel);
+ fly->time_lastwheel = time_currwheel;
+ time_wheel = 1+ (10 - (20*MIN2(time_wheel, 0.5))); /* 0-0.5 -> 0-5.0 */
+
+ if (fly->speed>0) fly->speed=0;
+ else {
+ if (event->shift)
+ fly->speed-= fly->grid*time_wheel*0.1;
+ else
+ fly->speed-= fly->grid*time_wheel;
+ }
+ break;
+ }
+ case FLY_MODAL_PAN_ENABLE:
+ fly->pan_view= TRUE;
+ break;
+ case FLY_MODAL_PAN_DISABLE:
+//XXX2.5 warp_pointer(cent_orig[0], cent_orig[1]);
+ fly->pan_view= FALSE;
+ break;
+
+ /* impliment WASD keys */
+ case FLY_MODAL_DIR_FORWARD:
+ if (fly->speed < 0.0f) fly->speed= -fly->speed; /* flip speed rather then stopping, game like motion */
+ else if (fly->axis==2) fly->speed += fly->grid; /* increse like mousewheel if were already moving in that difection*/
+ fly->axis= 2;
+ break;
+ case FLY_MODAL_DIR_BACKWARD:
+ if (fly->speed > 0.0f) fly->speed= -fly->speed;
+ else if (fly->axis==2) fly->speed -= fly->grid;
+ fly->axis= 2;
+ break;
+ case FLY_MODAL_DIR_LEFT:
+ if (fly->speed < 0.0f) fly->speed= -fly->speed;
+ else if (fly->axis==0) fly->speed += fly->grid;
+ fly->axis= 0;
+ break;
+ case FLY_MODAL_DIR_RIGHT:
+ if (fly->speed > 0.0f) fly->speed= -fly->speed;
+ else if (fly->axis==0) fly->speed -= fly->grid;
+ fly->axis= 0;
+ break;
+ case FLY_MODAL_DIR_DOWN:
+ if (fly->speed < 0.0f) fly->speed= -fly->speed;
+ else if (fly->axis==1) fly->speed += fly->grid;
+ fly->axis= 1;
+ break;
+ case FLY_MODAL_DIR_UP:
+ if (fly->speed > 0.0f) fly->speed= -fly->speed;
+ else if (fly->axis==1) fly->speed -= fly->grid;
+ fly->axis= 1;
+ break;
+
+ case FLY_MODAL_AXIS_LOCK_X:
+ if (fly->xlock) fly->xlock=0;
+ else {
+ fly->xlock = 2;
+ fly->xlock_momentum = 0.0;
+ }
+ break;
+ case FLY_MODAL_AXIS_LOCK_Z:
+ if (fly->zlock) fly->zlock=0;
+ else {
+ fly->zlock = 2;
+ fly->zlock_momentum = 0.0;
+ }
+ break;
+
+ case FLY_MODAL_PRECISION_ENABLE:
+ fly->use_precision= TRUE;
+ break;
+ case FLY_MODAL_PRECISION_DISABLE:
+ fly->use_precision= FALSE;
+ break;
+
+ }
+ }
+}
+
+static int flyApply(bContext *C, FlyInfo *fly)
+{
+
+#define FLY_ROTATE_FAC 2.5f /* more is faster */
+#define FLY_ZUP_CORRECT_FAC 0.1f /* ammount to correct per step */
+#define FLY_ZUP_CORRECT_ACCEL 0.05f /* increase upright momentum each step */
+
+ /*
+ fly mode - Shift+F
+ a fly loop where the user can move move the view as if they are flying
+ */
+ RegionView3D *rv3d= fly->rv3d;
+ View3D *v3d = fly->v3d;
+ ARegion *ar = fly->ar;
+ Scene *scene= fly->scene;
+
+ float prev_view_mat[4][4];
+
+ float mat[3][3], /* 3x3 copy of the view matrix so we can move allong the view axis */
+ dvec[3]={0,0,0}, /* this is the direction thast added to the view offset per redraw */
+
+ /* Camera Uprighting variables */
+ upvec[3]={0,0,0}, /* stores the view's up vector */
+
+ moffset[2], /* mouse offset from the views center */
+ tmp_quat[4]; /* used for rotating the view */
+
+ int cent_orig[2], /* view center */
+//XXX- can avoid using // cent[2], /* view center modified */
+ xmargin, ymargin; /* x and y margin are define the safe area where the mouses movement wont rotate the view */
+ unsigned char
+ apply_rotation= 1; /* if the user presses shift they can look about without movinf the direction there looking*/
+
+ if(fly->root_parent)
+ view3d_persp_mat4(rv3d, prev_view_mat);
+
+ /* the dist defines a vector that is infront of the offset
+ to rotate the view about.
+ this is no good for fly mode because we
+ want to rotate about the viewers center.
+ but to correct the dist removal we must
+ alter offset so the view doesn't jump. */
+
+ xmargin= ar->winx/20.0f;
+ ymargin= ar->winy/20.0f;
+
+ cent_orig[0]= ar->winrct.xmin + ar->winx/2;
+ cent_orig[1]= ar->winrct.ymin + ar->winy/2;
+
+ {
+
+ /* mouse offset from the center */
+ moffset[0]= fly->mval[0]- ar->winx/2;
+ moffset[1]= fly->mval[1]- ar->winy/2;
+
+ /* enforce a view margin */
+ if (moffset[0]>xmargin) moffset[0]-=xmargin;
+ else if (moffset[0] < -xmargin) moffset[0]+=xmargin;
+ else moffset[0]=0;
+
+ if (moffset[1]>ymargin) moffset[1]-=ymargin;
+ else if (moffset[1] < -ymargin) moffset[1]+=ymargin;
+ else moffset[1]=0;
+
+
+ /* scale the mouse movement by this value - scales mouse movement to the view size
+ * moffset[0]/(ar->winx-xmargin*2) - window size minus margin (same for y)
+ *
+ * the mouse moves isnt linear */
+
+ if(moffset[0]) {
+ moffset[0] /= ar->winx - (xmargin*2);
+ moffset[0] *= fabs(moffset[0]);
+ }
+
+ if(moffset[1]) {
+ moffset[1] /= ar->winy - (ymargin*2);
+ moffset[1] *= fabs(moffset[1]);
+ }
+
+ /* Should we redraw? */
+ if(fly->speed != 0.0f || moffset[0] || moffset[1] || fly->zlock || fly->xlock || dvec[0] || dvec[1] || dvec[2] ) {
+ float dvec_tmp[3];
+ double time_current, time_redraw; /*time how fast it takes for us to redraw, this is so simple scenes dont fly too fast */
+ float time_redraw_clamped;
+
+ time_current= PIL_check_seconds_timer();
+ time_redraw= (float)(time_current - fly->time_lastdraw);
+ time_redraw_clamped= MIN2(0.05f, time_redraw); /* clamt the redraw time to avoid jitter in roll correction */
+ fly->time_lastdraw= time_current;
+ /*fprintf(stderr, "%f\n", time_redraw);*/ /* 0.002 is a small redraw 0.02 is larger */
+
+ /* Scale the time to use shift to scale the speed down- just like
+ shift slows many other areas of blender down */
+ if (fly->use_precision)
+ fly->speed= fly->speed * (1.0f-time_redraw_clamped);
+
+ copy_m3_m4(mat, rv3d->viewinv);
+
+ if (fly->pan_view==TRUE) {
+ /* pan only */
+ dvec_tmp[0]= -moffset[0];
+ dvec_tmp[1]= -moffset[1];
+ dvec_tmp[2]= 0;
+
+ if (fly->use_precision) {
+ dvec_tmp[0] *= 0.1;
+ dvec_tmp[1] *= 0.1;
+ }
+
+ mul_m3_v3(mat, dvec_tmp);
+ mul_v3_fl(dvec_tmp, time_redraw*200.0 * fly->grid);
+
+ } else {
+ float roll; /* similar to the angle between the camera's up and the Z-up, but its very rough so just roll*/
+
+ /* rotate about the X axis- look up/down */
+ if (moffset[1]) {
+ upvec[0]=1;
+ upvec[1]=0;
+ upvec[2]=0;
+ mul_m3_v3(mat, upvec);
+ axis_angle_to_quat( tmp_quat, upvec, (float)moffset[1] * time_redraw * -FLY_ROTATE_FAC); /* Rotate about the relative up vec */
+ mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
+
+ if (fly->xlock) fly->xlock = 2; /*check for rotation*/
+ if (fly->zlock) fly->zlock = 2;
+ fly->xlock_momentum= 0.0f;
+ }
+
+ /* rotate about the Y axis- look left/right */
+ if (moffset[0]) {
+
+ /* if we're upside down invert the moffset */
+ upvec[0]=0;
+ upvec[1]=1;
+ upvec[2]=0;
+ mul_m3_v3(mat, upvec);
+
+ if(upvec[2] < 0.0f)
+ moffset[0]= -moffset[0];
+
+ /* make the lock vectors */
+ if (fly->zlock) {
+ upvec[0]=0;
+ upvec[1]=0;
+ upvec[2]=1;
+ } else {
+ upvec[0]=0;
+ upvec[1]=1;
+ upvec[2]=0;
+ mul_m3_v3(mat, upvec);
+ }
+
+ axis_angle_to_quat( tmp_quat, upvec, (float)moffset[0] * time_redraw * FLY_ROTATE_FAC); /* Rotate about the relative up vec */
+ mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
+
+ if (fly->xlock) fly->xlock = 2;/*check for rotation*/
+ if (fly->zlock) fly->zlock = 2;
+ }
+
+ if (fly->zlock==2) {
+ upvec[0]=1;
+ upvec[1]=0;
+ upvec[2]=0;
+ mul_m3_v3(mat, upvec);
+
+ /*make sure we have some z rolling*/
+ if (fabs(upvec[2]) > 0.00001f) {
+ roll= upvec[2]*5;
+ upvec[0]=0; /*rotate the view about this axis*/
+ upvec[1]=0;
+ upvec[2]=1;
+
+ mul_m3_v3(mat, upvec);
+ axis_angle_to_quat( tmp_quat, upvec, roll*time_redraw_clamped*fly->zlock_momentum * FLY_ZUP_CORRECT_FAC); /* Rotate about the relative up vec */
+ mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
+
+ fly->zlock_momentum += FLY_ZUP_CORRECT_ACCEL;
+ } else {
+ fly->zlock=1; /* dont check until the view rotates again */
+ fly->zlock_momentum= 0.0f;
+ }
+ }
+
+ if (fly->xlock==2 && moffset[1]==0) { /*only apply xcorrect when mouse isnt applying x rot*/
+ upvec[0]=0;
+ upvec[1]=0;
+ upvec[2]=1;
+ mul_m3_v3(mat, upvec);
+ /*make sure we have some z rolling*/
+ if (fabs(upvec[2]) > 0.00001) {
+ roll= upvec[2] * -5;
+
+ upvec[0]= 1.0f; /*rotate the view about this axis*/
+ upvec[1]= 0.0f;
+ upvec[2]= 0.0f;
+
+ mul_m3_v3(mat, upvec);
+
+ axis_angle_to_quat( tmp_quat, upvec, roll*time_redraw_clamped*fly->xlock_momentum*0.1f); /* Rotate about the relative up vec */
+ mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
+
+ fly->xlock_momentum += 0.05f;
+ } else {
+ fly->xlock=1; /* see above */
+ fly->xlock_momentum= 0.0f;
+ }
+ }
+
+
+ if (apply_rotation) {
+ /* Normal operation */
+ /* define dvec, view direction vector */
+ dvec_tmp[0]= dvec_tmp[1]= dvec_tmp[2]= 0.0f;
+ /* move along the current axis */
+ dvec_tmp[fly->axis]= 1.0f;
+
+ mul_m3_v3(mat, dvec_tmp);
+
+ mul_v3_fl(dvec_tmp, fly->speed * time_redraw * 0.25f);
+ }
+ }
+
+ /* impose a directional lag */
+ interp_v3_v3v3(dvec, dvec_tmp, fly->dvec_prev, (1.0f/(1.0f+(time_redraw*5.0f))));
+
+ if (rv3d->persp==RV3D_CAMOB) {
+ Object *lock_ob= fly->root_parent ? fly->root_parent : fly->v3d->camera;
+ if (lock_ob->protectflag & OB_LOCK_LOCX) dvec[0] = 0.0;
+ if (lock_ob->protectflag & OB_LOCK_LOCY) dvec[1] = 0.0;
+ if (lock_ob->protectflag & OB_LOCK_LOCZ) dvec[2] = 0.0;
+ }
+
+ add_v3_v3(rv3d->ofs, dvec);
+
+ /* todo, dynamic keys */
+#if 0
+ if (fly->zlock && fly->xlock)
+ ED_area_headerprint(fly->ar, "FlyKeys Speed:(+/- | Wheel), Upright Axis:X on/Z on, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
+ else if (fly->zlock)
+ ED_area_headerprint(fly->ar, "FlyKeys Speed:(+/- | Wheel), Upright Axis:X off/Z on, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
+ else if (fly->xlock)
+ ED_area_headerprint(fly->ar, "FlyKeys Speed:(+/- | Wheel), Upright Axis:X on/Z off, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
+ else
+ ED_area_headerprint(fly->ar, "FlyKeys Speed:(+/- | Wheel), Upright Axis:X off/Z off, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
+#endif
+
+ /* we are in camera view so apply the view ofs and quat to the view matrix and set the camera to the view */
+ if (rv3d->persp==RV3D_CAMOB) {
+ ID *id_key;
+ /* transform the parent or the camera? */
+ if(fly->root_parent) {
+ Object *ob_update;
+
+ float view_mat[4][4];
+ float prev_view_imat[4][4];
+ float diff_mat[4][4];
+ float parent_mat[4][4];
+
+ invert_m4_m4(prev_view_imat, prev_view_mat);
+ view3d_persp_mat4(rv3d, view_mat);
+ mul_m4_m4m4(diff_mat, prev_view_imat, view_mat);
+ mul_m4_m4m4(parent_mat, fly->root_parent->obmat, diff_mat);
+ object_apply_mat4(fly->root_parent, parent_mat, TRUE, FALSE);
+
+ // where_is_object(scene, fly->root_parent);
+
+ ob_update= v3d->camera->parent;
+ while(ob_update) {
+ DAG_id_tag_update(&ob_update->id, OB_RECALC_OB);
+ ob_update= ob_update->parent;
+ }
+
+ copy_m4_m4(prev_view_mat, view_mat);
+
+ id_key= &fly->root_parent->id;
+
+ }
+ else {
+ float view_mat[4][4];
+ view3d_persp_mat4(rv3d, view_mat);
+ object_apply_mat4(v3d->camera, view_mat, TRUE, FALSE);
+ id_key= &v3d->camera->id;
+ }
+
+ /* record the motion */
+ if (autokeyframe_cfra_can_key(scene, id_key)) {
+ ListBase dsources = {NULL, NULL};
+
+ /* add datasource override for the camera object */
+ ANIM_relative_keyingset_add_source(&dsources, id_key, NULL, NULL);
+
+ /* insert keyframes
+ * 1) on the first frame
+ * 2) on each subsequent frame
+ * TODO: need to check in future that frame changed before doing this
+ */
+ if (fly->xlock || fly->zlock || moffset[0] || moffset[1]) {
+ KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Rotation");
+ ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
+ }
+ if (fly->speed) {
+ KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Location");
+ ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
+ }
+
+ /* free temp data */
+ BLI_freelistN(&dsources);
+ }
+ }
+ } else
+ /*were not redrawing but we need to update the time else the view will jump */
+ fly->time_lastdraw= PIL_check_seconds_timer();
+ /* end drawing */
+ copy_v3_v3(fly->dvec_prev, dvec);
+ }
+
+/* moved to flyEnd() */
+
+ return OPERATOR_FINISHED;
+}
+
+
+
+static int fly_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
+ FlyInfo *fly;
+
+ if(rv3d->viewlock)
+ return OPERATOR_CANCELLED;
+
+ fly= MEM_callocN(sizeof(FlyInfo), "FlyOperation");
+
+ op->customdata= fly;
+
+ if(initFlyInfo(C, fly, op, event)==FALSE) {
+ MEM_freeN(op->customdata);
+ return OPERATOR_CANCELLED;
+ }
+
+ flyEvent(fly, event);
+
+ WM_event_add_modal_handler(C, op);
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static int fly_cancel(bContext *C, wmOperator *op)
+{
+ FlyInfo *fly = op->customdata;
+
+ fly->state = FLY_CANCEL;
+ flyEnd(C, fly);
+ op->customdata= NULL;
+
+ return OPERATOR_CANCELLED;
+}
+
+static int fly_modal(bContext *C, wmOperator *op, wmEvent *event)
+{
+ int exit_code;
+ short do_draw= FALSE;
+ FlyInfo *fly= op->customdata;
+ RegionView3D *rv3d= fly->rv3d;
+ Object *fly_object= fly->root_parent ? fly->root_parent : fly->v3d->camera;
+
+ fly->redraw= 0;
+
+ flyEvent(fly, event);
+
+ if(event->type==TIMER && event->customdata == fly->timer)
+ flyApply(C, fly);
+
+ do_draw |= fly->redraw;
+
+ exit_code = flyEnd(C, fly);
+
+ if(exit_code!=OPERATOR_RUNNING_MODAL)
+ do_draw= TRUE;
+
+ if(do_draw) {
+ if(rv3d->persp==RV3D_CAMOB) {
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, fly_object);
+ }
+
+ ED_region_tag_redraw(CTX_wm_region(C));
+ }
+
+ return exit_code;
+}
+
+void VIEW3D_OT_fly(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Fly Navigation";
+ ot->description= "Interactively fly around the scene";
+ ot->idname= "VIEW3D_OT_fly";
+
+ /* api callbacks */
+ ot->invoke= fly_invoke;
+ ot->cancel= fly_cancel;
+ ot->modal= fly_modal;
+ ot->poll= ED_operator_view3d_active;
+
+ /* flags */
+ ot->flag= OPTYPE_BLOCKING;
+}
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index d7ab8034286..a481fdb59f6 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -37,6 +37,11 @@
#include "MEM_guardedalloc.h"
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_effect.h"
@@ -58,11 +63,6 @@
#include "RNA_define.h"
#include "RNA_enum_types.h"
-
-#include "BLI_math.h"
-#include "BLI_blenlib.h"
-#include "BLI_editVert.h"
-
#include "UI_interface.h"
#include "UI_resources.h"
@@ -81,9 +81,6 @@
#define TEST_EDITMESH if(obedit==0) return; \
if( (v3d->lay & obedit->lay)==0 ) return;
-/* XXX port over */
-extern void borderselect();
-
/* view3d handler codes */
#define VIEW3D_HANDLER_BACKGROUND 1
#define VIEW3D_HANDLER_PROPERTIES 2
@@ -204,7 +201,7 @@ static int layers_exec(bContext *C, wmOperator *op)
if(v3d->scenelock) handle_view3d_lock(C);
/* new layers might need unflushed events events */
- DAG_scene_update_flags(bmain, scene, v3d->lay); /* tags all that moves and flushes */
+ DAG_scene_update_flags(bmain, scene, v3d->lay, FALSE); /* tags all that moves and flushes */
ED_area_tag_redraw(sa);
@@ -304,7 +301,7 @@ static char *view3d_modeselect_pup(Scene *scene)
}
-static void do_view3d_header_buttons(bContext *C, void *arg, int event)
+static void do_view3d_header_buttons(bContext *C, void *UNUSED(arg), int event)
{
wmWindow *win= CTX_wm_window(C);
ToolSettings *ts= CTX_data_tool_settings(C);
@@ -446,16 +443,6 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
v3d->modeselect = ob->mode;
else
v3d->modeselect = OB_MODE_OBJECT;
-
- v3d->flag &= ~V3D_MODE;
-
- /* not sure what the v3d->flag is useful for now... modeselect is confusing */
- if(obedit) v3d->flag |= V3D_EDITMODE;
- if(ob && (ob->mode & OB_MODE_POSE)) v3d->flag |= V3D_POSEMODE;
- if(ob && (ob->mode & OB_MODE_VERTEX_PAINT)) v3d->flag |= V3D_VERTEXPAINT;
- if(ob && (ob->mode & OB_MODE_WEIGHT_PAINT)) v3d->flag |= V3D_WEIGHTPAINT;
- if(ob && (ob->mode & OB_MODE_TEXTURE_PAINT)) v3d->flag |= V3D_TEXTUREPAINT;
- if(paint_facesel_test(ob)) v3d->flag |= V3D_FACESELECT;
uiBlockBeginAlign(block);
uiDefIconTextButS(block, MENU, B_MODESELECT, object_mode_icon(v3d->modeselect), view3d_modeselect_pup(scene) ,
@@ -463,7 +450,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
uiBlockEndAlign(block);
/* Draw type */
- uiItemR(layout, &v3dptr, "viewport_shade", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(layout, &v3dptr, "viewport_shade", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
if (obedit==NULL && ((ob && ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT)))) {
/* Manipulators aren't used in weight paint mode */
@@ -471,13 +458,13 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
PointerRNA meshptr;
RNA_pointer_create(&ob->id, &RNA_Mesh, ob->data, &meshptr);
- uiItemR(layout, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(layout, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
} else {
- char *str_menu;
+ const char *str_menu;
row= uiLayoutRow(layout, 1);
- uiItemR(row, &v3dptr, "pivot_point", UI_ITEM_R_ICON_ONLY, "", 0);
- uiItemR(row, &v3dptr, "use_pivot_point_align", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(row, &v3dptr, "pivot_point", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemR(row, &v3dptr, "use_pivot_point_align", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
/* NDOF */
/* Not implemented yet
@@ -492,7 +479,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
/* Transform widget / manipulators */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &v3dptr, "show_manipulator", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(row, &v3dptr, "show_manipulator", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
block= uiLayoutGetBlock(row);
if(v3d->twflag & V3D_USE_MANIPULATOR) {
@@ -507,11 +494,11 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
str_menu = BIF_menustringTransformOrientation(C, "Orientation");
uiDefButS(block, MENU, B_MAN_MODE, str_menu,0,0,70,YIC, &v3d->twmode, 0, 0, 0, 0, "Transform Orientation");
- MEM_freeN(str_menu);
+ MEM_freeN((void *)str_menu);
}
if(obedit==NULL && v3d->localvd==NULL) {
- int ob_lay = ob ? ob->lay : 0;
+ unsigned int ob_lay = ob ? ob->lay : 0;
/* Layers */
if (v3d->scenelock)
@@ -520,7 +507,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
uiTemplateLayers(layout, &v3dptr, "layers", &v3dptr, "layers_used", ob_lay);
/* Scene lock */
- uiItemR(layout, &v3dptr, "lock_camera_and_layers", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(layout, &v3dptr, "lock_camera_and_layers", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
}
/* selection modus, dont use python for this since it cant do the toggle buttons with shift+click as well as clicking to set one. */
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index 4065b159ccf..0f1fe2fba07 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -54,19 +54,12 @@ struct bMotionPath;
#define DRAW_CONSTCOLOR 2
#define DRAW_SCENESET 4
-#define V3D_XRAY 1
-#define V3D_TRANSP 2
-#define V3D_XRAYTRANSP 4
-
-#define V3D_SELECT_MOUSE 1
-
/* view3d_header.c */
void view3d_header_buttons(const struct bContext *C, struct ARegion *ar);
void VIEW3D_OT_layers(struct wmOperatorType *ot);
/* view3d_ops.c */
void view3d_operatortypes(void);
-void view3d_keymap(struct wmKeyConfig *keyconf);
/* view3d_edit.c */
void VIEW3D_OT_zoom(struct wmOperatorType *ot);
@@ -79,8 +72,8 @@ void VIEW3D_OT_view_center_cursor(struct wmOperatorType *ot);
void VIEW3D_OT_view_center_camera(struct wmOperatorType *ot);
void VIEW3D_OT_view_pan(struct wmOperatorType *ot);
void VIEW3D_OT_view_persportho(struct wmOperatorType *ot);
-void VIEW3D_OT_add_background_image(struct wmOperatorType *ot);
-void VIEW3D_OT_remove_background_image(struct wmOperatorType *ot);
+void VIEW3D_OT_background_image_add(struct wmOperatorType *ot);
+void VIEW3D_OT_background_image_remove(struct wmOperatorType *ot);
void VIEW3D_OT_view_orbit(struct wmOperatorType *ot);
void VIEW3D_OT_clip_border(struct wmOperatorType *ot);
void VIEW3D_OT_cursor3d(struct wmOperatorType *ot);
@@ -91,13 +84,18 @@ void VIEW3D_OT_zoom_border(struct wmOperatorType *ot);
void VIEW3D_OT_drawtype(struct wmOperatorType *ot);
void view3d_boxview_copy(ScrArea *sa, ARegion *ar);
+void view3d_persp_mat4(struct RegionView3D *rv3d, float mat[][4]);
+
+/* view3d_fly.c */
+void view3d_keymap(struct wmKeyConfig *keyconf);
+void VIEW3D_OT_fly(struct wmOperatorType *ot);
/* drawanim.c */
-void draw_motion_paths_init(Scene *scene, View3D *v3d, struct ARegion *ar);
-void draw_motion_path_instance(Scene *scene, View3D *v3d, struct ARegion *ar,
+void draw_motion_paths_init(View3D *v3d, struct ARegion *ar);
+void draw_motion_path_instance(Scene *scene,
struct Object *ob, struct bPoseChannel *pchan,
struct bAnimVizSettings *avs, struct bMotionPath *mpath);
-void draw_motion_paths_cleanup(Scene *scene, View3D *v3d, struct ARegion *ar);
+void draw_motion_paths_cleanup(View3D *v3d);
@@ -106,13 +104,14 @@ void draw_object(Scene *scene, struct ARegion *ar, View3D *v3d, Base *base, int
int draw_glsl_material(Scene *scene, struct Object *ob, View3D *v3d, int dt);
void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, struct Object *ob, int dt, int outline);
void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, struct Object *ob);
-void drawaxes(float size, int flag, char drawtype);
+void drawaxes(float size, char drawtype);
void view3d_cached_text_draw_begin(void);
-void view3d_cached_text_draw_add(float x, float y, float z, char *str, short xoffs, short flag);
+void view3d_cached_text_draw_add(const float co[3], const char *str, short xoffs, short flag, const unsigned char col[4]);
void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, float mat[][4]);
-#define V3D_CACHE_TEXT_ZBUF 1
-#define V3D_CACHE_TEXT_WORLDSPACE 2
+#define V3D_CACHE_TEXT_ZBUF (1<<0)
+#define V3D_CACHE_TEXT_WORLDSPACE (1<<1)
+#define V3D_CACHE_TEXT_ASCII (1<<2)
/* drawarmature.c */
int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, int flag);
@@ -130,7 +129,8 @@ void add_view3d_after(ListBase *lb, Base *base, int flag);
void circf(float x, float y, float rad);
void circ(float x, float y, float rad);
-void view3d_update_depths(struct ARegion *ar, View3D *v3d);
+void view3d_update_depths_rect(struct ARegion *ar, struct ViewDepths *d, struct rcti *rect);
+float view3d_depth_near(struct ViewDepths *d);
/* view3d_select.c */
void VIEW3D_OT_select(struct wmOperatorType *ot);
@@ -148,7 +148,6 @@ void VIEW3D_OT_setcameratoview(struct wmOperatorType *ot);
void VIEW3D_OT_object_as_camera(struct wmOperatorType *ot);
void VIEW3D_OT_localview(struct wmOperatorType *ot);
void VIEW3D_OT_game_start(struct wmOperatorType *ot);
-void VIEW3D_OT_fly(struct wmOperatorType *ot);
int boundbox_clip(RegionView3D *rv3d, float obmat[][4], struct BoundBox *bb);
@@ -189,7 +188,7 @@ ARegion *view3d_has_buttons_region(ScrArea *sa);
ARegion *view3d_has_tools_region(ScrArea *sa);
/* draw_volume.c */
-void draw_volume(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, struct Base *base, struct GPUTexture *tex, float *min, float *max, int res[3], float dx, struct GPUTexture *tex_shadow);
+void draw_volume(struct ARegion *ar, struct GPUTexture *tex, float *min, float *max, int res[3], float dx, struct GPUTexture *tex_shadow);
#endif /* ED_VIEW3D_INTERN_H */
diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c
index 9ee12a8ef1e..cb6eee26df5 100644
--- a/source/blender/editors/space_view3d/view3d_ops.c
+++ b/source/blender/editors/space_view3d/view3d_ops.c
@@ -38,7 +38,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
-
+#include "BLI_utildefines.h"
#include "RNA_access.h"
@@ -62,8 +62,8 @@ void view3d_operatortypes(void)
WM_operatortype_append(VIEW3D_OT_view_orbit);
WM_operatortype_append(VIEW3D_OT_view_pan);
WM_operatortype_append(VIEW3D_OT_view_persportho);
- WM_operatortype_append(VIEW3D_OT_add_background_image);
- WM_operatortype_append(VIEW3D_OT_remove_background_image);
+ WM_operatortype_append(VIEW3D_OT_background_image_add);
+ WM_operatortype_append(VIEW3D_OT_background_image_remove);
WM_operatortype_append(VIEW3D_OT_view_selected);
WM_operatortype_append(VIEW3D_OT_view_center_cursor);
WM_operatortype_append(VIEW3D_OT_view_center_camera);
@@ -181,6 +181,26 @@ void view3d_keymap(wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", WHEELDOWNMOUSE, KM_PRESS, KM_SHIFT|KM_ALT, 0)->ptr, "type", V3D_VIEW_STEPDOWN);
/* active aligned, replaces '*' key in 2.4x */
+#ifdef WIN32
+ kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD1, KM_PRESS, KM_ALT, 0);
+ RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_FRONT);
+ RNA_boolean_set(kmi->ptr, "align_active", TRUE);
+ kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD3, KM_PRESS, KM_ALT, 0);
+ RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_RIGHT);
+ RNA_boolean_set(kmi->ptr, "align_active", TRUE);
+ kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD7, KM_PRESS, KM_ALT, 0);
+ RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_TOP);
+ RNA_boolean_set(kmi->ptr, "align_active", TRUE);
+ kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD1, KM_PRESS, KM_ALT|KM_CTRL, 0);
+ RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_BACK);
+ RNA_boolean_set(kmi->ptr, "align_active", TRUE);
+ kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD3, KM_PRESS, KM_ALT|KM_CTRL, 0);
+ RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_LEFT);
+ RNA_boolean_set(kmi->ptr, "align_active", TRUE);
+ kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD7, KM_PRESS, KM_ALT|KM_CTRL, 0);
+ RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_BOTTOM);
+ RNA_boolean_set(kmi->ptr, "align_active", TRUE);
+#else
kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD1, KM_PRESS, KM_SHIFT, 0);
RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_FRONT);
RNA_boolean_set(kmi->ptr, "align_active", TRUE);
@@ -199,6 +219,7 @@ void view3d_keymap(wmKeyConfig *keyconf)
kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD7, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_BOTTOM);
RNA_boolean_set(kmi->ptr, "align_active", TRUE);
+#endif
WM_keymap_add_item(keymap, "VIEW3D_OT_localview", PADSLASHKEY, KM_PRESS, 0, 0);
@@ -272,7 +293,7 @@ void view3d_keymap(wmKeyConfig *keyconf)
RNA_string_set(kmi->ptr, "value", "MEDIAN_POINT");
kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", COMMAKEY, KM_PRESS, KM_ALT, 0); /* new in 2.5 */
- RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point_align");
+ RNA_string_set(kmi->ptr, "data_path", "space_data.use_pivot_point_align");
kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", SPACEKEY, KM_PRESS, KM_CTRL, 0); /* new in 2.5 */
RNA_string_set(kmi->ptr, "data_path", "space_data.show_manipulator");
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index cc4defacb35..f85bdc437f3 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -30,7 +30,9 @@
#include <stdio.h>
#include <math.h>
#include <float.h>
+#include <assert.h>
+#include "DNA_action_types.h"
#include "DNA_armature_types.h"
#include "DNA_curve_types.h"
#include "DNA_meta_types.h"
@@ -45,12 +47,15 @@
#include "BLI_editVert.h"
#include "BLI_rand.h"
#include "BLI_linklist.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_paint.h"
+#include "BKE_armature.h"
#include "BIF_gl.h"
+#include "BIF_glutil.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -63,7 +68,6 @@
#include "ED_particle.h"
#include "ED_mesh.h"
#include "ED_object.h"
-#include "ED_retopo.h"
#include "ED_screen.h"
#include "ED_mball.h"
@@ -189,9 +193,9 @@ void EM_backbuf_checkAndSelectTFaces(Mesh *me, int select)
}
}
+#if 0
void arrows_move_cursor(unsigned short event)
{
-#if 0
short mval[2];
getmouseco_sc(mval);
@@ -205,8 +209,8 @@ void arrows_move_cursor(unsigned short event)
} else if(event==RIGHTARROWKEY) {
warp_pointer(mval[0]+1, mval[1]);
}
-#endif
}
+#endif
/* *********************** GESTURE AND LASSO ******************* */
@@ -214,16 +218,26 @@ void arrows_move_cursor(unsigned short event)
static int view3d_selectable_data(bContext *C)
{
Object *ob = CTX_data_active_object(C);
-
- if (!ED_operator_view3d_active(C))
+
+ if (!ED_operator_region_view3d_active(C))
return 0;
-
- if (!CTX_data_edit_object(C))
- if (ob && ob->mode & OB_MODE_SCULPT)
- return 0;
- if (ob && ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT) && !paint_facesel_test(ob))
- return 0;
-
+
+ if(ob) {
+ if (ob->mode & OB_MODE_EDIT) {
+ if(ob->type == OB_FONT) {
+ return 0;
+ }
+ }
+ else {
+ if (ob->mode & OB_MODE_SCULPT) {
+ return 0;
+ }
+ if (ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT) && !paint_facesel_test(ob)) {
+ return 0;
+ }
+ }
+ }
+
return 1;
}
@@ -345,34 +359,43 @@ static void do_lasso_select_pose(ViewContext *vc, Object *ob, short mcords[][2],
bPoseChannel *pchan;
float vec[3];
short sco1[2], sco2[2];
+ bArmature *arm= ob->data;
if(ob->type!=OB_ARMATURE || ob->pose==NULL) return;
-
+
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- mul_v3_m4v3(vec, ob->obmat, pchan->pose_head);
- project_short(vc->ar, vec, sco1);
- mul_v3_m4v3(vec, ob->obmat, pchan->pose_tail);
- project_short(vc->ar, vec, sco2);
-
- if(lasso_inside_edge(mcords, moves, sco1[0], sco1[1], sco2[0], sco2[1])) {
- if(select) pchan->bone->flag |= BONE_SELECTED;
- else pchan->bone->flag &= ~BONE_SELECTED;
+ if (PBONE_VISIBLE(arm, pchan->bone) && (pchan->bone->flag & BONE_UNSELECTABLE)==0) {
+ mul_v3_m4v3(vec, ob->obmat, pchan->pose_head);
+ project_short(vc->ar, vec, sco1);
+ mul_v3_m4v3(vec, ob->obmat, pchan->pose_tail);
+ project_short(vc->ar, vec, sco2);
+
+ if(lasso_inside_edge(mcords, moves, sco1[0], sco1[1], sco2[0], sco2[1])) {
+ if(select) pchan->bone->flag |= BONE_SELECTED;
+ else pchan->bone->flag &= ~BONE_SELECTED;
+ }
}
}
-
- {
- bArmature *arm= ob->data;
- if(arm->act_bone && (arm->act_bone->flag & BONE_SELECTED)==0) {
- arm->act_bone= NULL;
+}
+
+static void object_deselect_all_visible(Scene *scene, View3D *v3d)
+{
+ Base *base;
+
+ for(base= scene->base.first; base; base= base->next) {
+ if(BASE_SELECTABLE(v3d, base)) {
+ ED_base_object_select(base, BA_DESELECT);
}
}
}
-
-static void do_lasso_select_objects(ViewContext *vc, short mcords[][2], short moves, short select)
+static void do_lasso_select_objects(ViewContext *vc, short mcords[][2], short moves, short extend, short select)
{
Base *base;
+ if (extend == 0 && select)
+ object_deselect_all_visible(vc->scene, vc->v3d);
+
for(base= vc->scene->base.first; base; base= base->next) {
if(BASE_SELECTABLE(vc->v3d, base)) { /* use this to avoid un-needed lasso lookups */
project_short(vc->ar, base->object->obmat[3], &base->sx);
@@ -389,7 +412,7 @@ static void do_lasso_select_objects(ViewContext *vc, short mcords[][2], short mo
}
}
-void lasso_select_boundbox(rcti *rect, short mcords[][2], short moves)
+static void lasso_select_boundbox(rcti *rect, short mcords[][2], short moves)
{
short a;
@@ -404,7 +427,7 @@ void lasso_select_boundbox(rcti *rect, short mcords[][2], short moves)
}
}
-static void do_lasso_select_mesh__doSelectVert(void *userData, EditVert *eve, int x, int y, int index)
+static void do_lasso_select_mesh__doSelectVert(void *userData, EditVert *eve, int x, int y, int UNUSED(index))
{
struct { ViewContext vc; rcti *rect; short (*mcords)[2], moves, select, pass, done; } *data = userData;
@@ -431,7 +454,7 @@ static void do_lasso_select_mesh__doSelectEdge(void *userData, EditEdge *eed, in
}
}
}
-static void do_lasso_select_mesh__doSelectFace(void *userData, EditFace *efa, int x, int y, int index)
+static void do_lasso_select_mesh__doSelectFace(void *userData, EditFace *efa, int x, int y, int UNUSED(index))
{
struct { ViewContext vc; rcti *rect; short (*mcords)[2], moves, select, pass, done; } *data = userData;
@@ -440,7 +463,7 @@ static void do_lasso_select_mesh__doSelectFace(void *userData, EditFace *efa, in
}
}
-static void do_lasso_select_mesh(ViewContext *vc, short mcords[][2], short moves, short select)
+static void do_lasso_select_mesh(ViewContext *vc, short mcords[][2], short moves, short extend, short select)
{
struct { ViewContext vc; rcti *rect; short (*mcords)[2], moves, select, pass, done; } data;
ToolSettings *ts= vc->scene->toolsettings;
@@ -460,8 +483,11 @@ static void do_lasso_select_mesh(ViewContext *vc, short mcords[][2], short moves
data.done = 0;
data.pass = 0;
+ if (extend == 0 && select)
+ EM_deselect_all(vc->em);
+
/* workaround: init mats first, EM_mask_init_backbuf_border can change
- view matrix to pixel space, breaking edge select with backbuf. fixes bug #20936 */
+ view matrix to pixel space, breaking edge select with backbuf. fixes bug [#20936] */
/* [#21018] breaks zbuf select. run below. only if bbsel fails */
/* ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d) */
@@ -560,7 +586,7 @@ static void do_lasso_select_mesh_uv(short mcords[][2], short moves, short select
}
#endif
-static void do_lasso_select_curve__doSelect(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
+static void do_lasso_select_curve__doSelect(void *userData, Nurb *UNUSED(nu), BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
struct { ViewContext *vc; short (*mcords)[2]; short moves; short select; } *data = userData;
Object *obedit= data->vc->obedit;
@@ -589,7 +615,7 @@ static void do_lasso_select_curve__doSelect(void *userData, Nurb *nu, BPoint *bp
}
}
-static void do_lasso_select_curve(ViewContext *vc, short mcords[][2], short moves, short select)
+static void do_lasso_select_curve(ViewContext *vc, short mcords[][2], short moves, short extend, short select)
{
struct { ViewContext *vc; short (*mcords)[2]; short moves; short select; } data;
@@ -599,6 +625,9 @@ static void do_lasso_select_curve(ViewContext *vc, short mcords[][2], short move
data.moves = moves;
data.select = select;
+ if (extend == 0 && select)
+ CU_deselect_all(vc->obedit);
+
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
nurbs_foreachScreenVert(vc, do_lasso_select_curve__doSelect, &data);
}
@@ -611,7 +640,7 @@ static void do_lasso_select_lattice__doSelect(void *userData, BPoint *bp, int x,
bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
}
}
-static void do_lasso_select_lattice(ViewContext *vc, short mcords[][2], short moves, short select)
+static void do_lasso_select_lattice(ViewContext *vc, short mcords[][2], short moves, short extend, short select)
{
struct { short (*mcords)[2]; short moves; short select; } data;
@@ -620,45 +649,52 @@ static void do_lasso_select_lattice(ViewContext *vc, short mcords[][2], short mo
data.moves = moves;
data.select = select;
+ if (extend == 0 && select)
+ ED_setflagsLatt(vc->obedit, 0);
+
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
lattice_foreachScreenVert(vc, do_lasso_select_lattice__doSelect, &data);
}
-static void do_lasso_select_armature(ViewContext *vc, short mcords[][2], short moves, short select)
+static void do_lasso_select_armature(ViewContext *vc, short mcords[][2], short moves, short extend, short select)
{
bArmature *arm= vc->obedit->data;
EditBone *ebone;
float vec[3];
short sco1[2], sco2[2], didpoint;
int change= FALSE;
-
+
+ if (extend==0 && select)
+ ED_armature_deselect_all_visible(vc->obedit);
+
/* set editdata in vc */
for (ebone= arm->edbo->first; ebone; ebone=ebone->next) {
-
- mul_v3_m4v3(vec, vc->obedit->obmat, ebone->head);
- project_short(vc->ar, vec, sco1);
- mul_v3_m4v3(vec, vc->obedit->obmat, ebone->tail);
- project_short(vc->ar, vec, sco2);
-
- didpoint= 0;
- if(lasso_inside(mcords, moves, sco1[0], sco1[1])) {
- if(select) ebone->flag |= BONE_ROOTSEL;
- else ebone->flag &= ~BONE_ROOTSEL;
- didpoint= 1;
- change= TRUE;
- }
- if(lasso_inside(mcords, moves, sco2[0], sco2[1])) {
- if(select) ebone->flag |= BONE_TIPSEL;
- else ebone->flag &= ~BONE_TIPSEL;
- didpoint= 1;
- change= TRUE;
- }
- /* if one of points selected, we skip the bone itself */
- if(didpoint==0 && lasso_inside_edge(mcords, moves, sco1[0], sco1[1], sco2[0], sco2[1])) {
- if(select) ebone->flag |= BONE_TIPSEL|BONE_ROOTSEL|BONE_SELECTED;
- else ebone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
- change= TRUE;
+ if (EBONE_VISIBLE(arm, ebone) && (ebone->flag & BONE_UNSELECTABLE)==0) {
+ mul_v3_m4v3(vec, vc->obedit->obmat, ebone->head);
+ project_short(vc->ar, vec, sco1);
+ mul_v3_m4v3(vec, vc->obedit->obmat, ebone->tail);
+ project_short(vc->ar, vec, sco2);
+
+ didpoint= 0;
+ if(lasso_inside(mcords, moves, sco1[0], sco1[1])) {
+ if(select) ebone->flag |= BONE_ROOTSEL;
+ else ebone->flag &= ~BONE_ROOTSEL;
+ didpoint= 1;
+ change= TRUE;
+ }
+ if(lasso_inside(mcords, moves, sco2[0], sco2[1])) {
+ if(select) ebone->flag |= BONE_TIPSEL;
+ else ebone->flag &= ~BONE_TIPSEL;
+ didpoint= 1;
+ change= TRUE;
+ }
+ /* if one of points selected, we skip the bone itself */
+ if(didpoint==0 && lasso_inside_edge(mcords, moves, sco1[0], sco1[1], sco2[0], sco2[1])) {
+ if(select) ebone->flag |= BONE_TIPSEL|BONE_ROOTSEL|BONE_SELECTED;
+ else ebone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
+ change= TRUE;
+ }
}
}
@@ -669,25 +705,56 @@ static void do_lasso_select_armature(ViewContext *vc, short mcords[][2], short m
}
}
-static void do_lasso_select_facemode(ViewContext *vc, short mcords[][2], short moves, short select)
+
+
+
+static void do_lasso_select_meta(ViewContext *vc, short mcords[][2], short moves, short extend, short select)
+{
+ MetaBall *mb = (MetaBall*)vc->obedit->data;
+ MetaElem *ml;
+ float vec[3];
+ short sco[2];
+
+ if (extend == 0 && select) {
+ for(ml= mb->editelems->first; ml; ml= ml->next) {
+ ml->flag &= ~SELECT;
+ }
+ }
+
+ for(ml= mb->editelems->first; ml; ml= ml->next) {
+
+ mul_v3_m4v3(vec, vc->obedit->obmat, &ml->x);
+ project_short(vc->ar, vec, sco);
+
+ if(lasso_inside(mcords, moves, sco[0], sco[1])) {
+ if(select) ml->flag |= SELECT;
+ else ml->flag &= ~SELECT;
+ }
+ }
+}
+
+static void do_lasso_select_paintface(ViewContext *vc, short mcords[][2], short moves, short extend, short select)
{
Object *ob= vc->obact;
Mesh *me= ob?ob->data:NULL;
rcti rect;
-
- if(me==NULL || me->mtface==NULL) return;
- if(me->totface==0) return;
-
+
+ if(me==NULL || me->totface==0)
+ return;
+
+ if(extend==0 && select)
+ paintface_deselect_all_visible(ob, SEL_DESELECT, FALSE); /* flush selection at the end */
+
em_vertoffs= me->totface+1; /* max index array */
-
+
lasso_select_boundbox(&rect, mcords, moves);
EM_mask_init_backbuf_border(vc, mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
EM_backbuf_checkAndSelectTFaces(me, select);
-
+
EM_free_backbuf();
-
-// XXX object_tface_flags_changed(ob, 0);
+
+ paintface_flush_flags(ob);
}
#if 0
@@ -721,32 +788,44 @@ static void do_lasso_select_node(short mcords[][2], short moves, short select)
}
#endif
-void view3d_lasso_select(bContext *C, ViewContext *vc, short mcords[][2], short moves, short select)
+static void view3d_lasso_select(bContext *C, ViewContext *vc, short mcords[][2], short moves, short extend, short select)
{
Object *ob = CTX_data_active_object(C);
if(vc->obedit==NULL) { /* Object Mode */
if(paint_facesel_test(ob))
- do_lasso_select_facemode(vc, mcords, moves, select);
+ do_lasso_select_paintface(vc, mcords, moves, extend, select);
else if(ob && ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))
;
else if(ob && ob->mode & OB_MODE_PARTICLE_EDIT)
- PE_lasso_select(C, mcords, moves, select);
+ PE_lasso_select(C, mcords, moves, extend, select);
else {
- do_lasso_select_objects(vc, mcords, moves, select);
+ do_lasso_select_objects(vc, mcords, moves, extend, select);
WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, vc->scene);
}
}
else { /* Edit Mode */
- if(vc->obedit->type==OB_MESH)
- do_lasso_select_mesh(vc, mcords, moves, select);
- else if(vc->obedit->type==OB_CURVE || vc->obedit->type==OB_SURF)
- do_lasso_select_curve(vc, mcords, moves, select);
- else if(vc->obedit->type==OB_LATTICE)
- do_lasso_select_lattice(vc, mcords, moves, select);
- else if(vc->obedit->type==OB_ARMATURE)
- do_lasso_select_armature(vc, mcords, moves, select);
-
+ switch(vc->obedit->type) {
+ case OB_MESH:
+ do_lasso_select_mesh(vc, mcords, moves, extend, select);
+ break;
+ case OB_CURVE:
+ case OB_SURF:
+ do_lasso_select_curve(vc, mcords, moves, extend, select);
+ break;
+ case OB_LATTICE:
+ do_lasso_select_lattice(vc, mcords, moves, extend, select);
+ break;
+ case OB_ARMATURE:
+ do_lasso_select_armature(vc, mcords, moves, extend, select);
+ break;
+ case OB_MBALL:
+ do_lasso_select_meta(vc, mcords, moves, extend, select);
+ break;
+ default:
+ assert(!"lasso select on incorrect object type");
+ }
+
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, vc->obedit->data);
}
}
@@ -757,7 +836,7 @@ void view3d_lasso_select(bContext *C, ViewContext *vc, short mcords[][2], short
static int view3d_lasso_select_exec(bContext *C, wmOperator *op)
{
ViewContext vc;
- int select, i= 0;
+ int i= 0;
short mcords[1024][2];
RNA_BEGIN(op->ptr, itemptr, "path") {
@@ -772,13 +851,15 @@ static int view3d_lasso_select_exec(bContext *C, wmOperator *op)
RNA_END;
if(i>1) {
+ short extend, select;
view3d_operator_needs_opengl(C);
/* setup view context for argument to callbacks */
view3d_set_viewcontext(C, &vc);
+ extend= RNA_boolean_get(op->ptr, "extend");
select= !RNA_boolean_get(op->ptr, "deselect");
- view3d_lasso_select(C, &vc, mcords, i, select);
+ view3d_lasso_select(C, &vc, mcords, i, extend, select);
return OPERATOR_FINISHED;
}
@@ -801,6 +882,7 @@ void VIEW3D_OT_select_lasso(wmOperatorType *ot)
RNA_def_collection_runtime(ot->srna, "path", &RNA_OperatorMousePath, "Path", "");
RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "Deselect rather than select items.");
+ RNA_def_boolean(ot->srna, "extend", 1, "Extend", "Extend selection instead of deselecting everything first.");
}
@@ -925,7 +1007,7 @@ static Base *mouse_select_menu(bContext *C, ViewContext *vc, unsigned int *buffe
}
else {
/* UI */
- uiPopupMenu *pup= uiPupMenuBegin(C, "Select Object", 0);
+ uiPopupMenu *pup= uiPupMenuBegin(C, "Select Object", ICON_NULL);
uiLayout *layout= uiPupMenuLayout(pup);
uiLayout *split= uiLayoutSplit(layout, 0, 0);
uiLayout *column= uiLayoutColumn(split, 0);
@@ -1291,7 +1373,7 @@ int edge_inside_circle(short centx, short centy, short rad, short x1, short y1,
return 0;
}
-static void do_nurbs_box_select__doSelect(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
+static void do_nurbs_box_select__doSelect(void *userData, Nurb *UNUSED(nu), BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
struct { ViewContext *vc; rcti *rect; int select; } *data = userData;
Object *obedit= data->vc->obedit;
@@ -1319,7 +1401,7 @@ static void do_nurbs_box_select__doSelect(void *userData, Nurb *nu, BPoint *bp,
}
}
}
-static void do_nurbs_box_select(ViewContext *vc, rcti *rect, int select, int extend)
+static int do_nurbs_box_select(ViewContext *vc, rcti *rect, int select, int extend)
{
struct { ViewContext *vc; rcti *rect; int select; } data;
@@ -1327,12 +1409,13 @@ static void do_nurbs_box_select(ViewContext *vc, rcti *rect, int select, int ext
data.rect = rect;
data.select = select;
- if (extend == 0 && select) {
+ if (extend == 0 && select)
CU_deselect_all(vc->obedit);
- }
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
nurbs_foreachScreenVert(vc, do_nurbs_box_select__doSelect, &data);
+
+ return OPERATOR_FINISHED;
}
static void do_lattice_box_select__doSelect(void *userData, BPoint *bp, int x, int y)
@@ -1343,7 +1426,7 @@ static void do_lattice_box_select__doSelect(void *userData, BPoint *bp, int x, i
bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
}
}
-static void do_lattice_box_select(ViewContext *vc, rcti *rect, int select, int extend)
+static int do_lattice_box_select(ViewContext *vc, rcti *rect, int select, int extend)
{
struct { ViewContext vc; rcti *rect; int select, pass, done; } data;
@@ -1351,15 +1434,16 @@ static void do_lattice_box_select(ViewContext *vc, rcti *rect, int select, int e
data.rect = rect;
data.select = select;
- if (extend == 0 && select) {
+ if (extend == 0 && select)
ED_setflagsLatt(vc->obedit, 0);
- }
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
lattice_foreachScreenVert(vc, do_lattice_box_select__doSelect, &data);
+
+ return OPERATOR_FINISHED;
}
-static void do_mesh_box_select__doSelectVert(void *userData, EditVert *eve, int x, int y, int index)
+static void do_mesh_box_select__doSelectVert(void *userData, EditVert *eve, int x, int y, int UNUSED(index))
{
struct { ViewContext vc; rcti *rect; short select, pass, done; } *data = userData;
@@ -1384,7 +1468,7 @@ static void do_mesh_box_select__doSelectEdge(void *userData, EditEdge *eed, int
}
}
}
-static void do_mesh_box_select__doSelectFace(void *userData, EditFace *efa, int x, int y, int index)
+static void do_mesh_box_select__doSelectFace(void *userData, EditFace *efa, int x, int y, int UNUSED(index))
{
struct { ViewContext vc; rcti *rect; short select, pass, done; } *data = userData;
@@ -1392,7 +1476,7 @@ static void do_mesh_box_select__doSelectFace(void *userData, EditFace *efa, int
EM_select_face_fgon(data->vc.em, efa, data->select);
}
}
-static void do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int extend)
+static int do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int extend)
{
struct { ViewContext vc; rcti *rect; short select, pass, done; } data;
ToolSettings *ts= vc->scene->toolsettings;
@@ -1405,9 +1489,7 @@ static void do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int exte
data.done = 0;
if (extend == 0 && select)
- {
EM_deselect_all(vc->em);
- }
/* workaround: init mats first, EM_mask_init_backbuf_border can change
view matrix to pixel space, breaking edge select with backbuf. fixes bug #20936 */
@@ -1451,261 +1533,282 @@ static void do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int exte
EM_free_backbuf();
EM_selectmode_flush(vc->em);
+
+ return OPERATOR_FINISHED;
}
-static int view3d_borderselect_exec(bContext *C, wmOperator *op)
+static int do_meta_box_select(ViewContext *vc, rcti *rect, int select, int extend)
{
- ViewContext vc;
- Scene *scene= CTX_data_scene(C);
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
- Object *obedit= CTX_data_edit_object(C);
- Object *obact= CTX_data_active_object(C);
- rcti rect;
- Base *base;
+ MetaBall *mb = (MetaBall*)vc->obedit->data;
MetaElem *ml;
+ int a;
+
unsigned int buffer[4*MAXPICKBUF];
- int a, index;
- int extend;
- short hits, selecting;
+ short hits;
- view3d_operator_needs_opengl(C);
-
- /* setup view context for argument to callbacks */
- view3d_set_viewcontext(C, &vc);
-
- selecting= (RNA_int_get(op->ptr, "gesture_mode")==GESTURE_MODAL_SELECT);
- rect.xmin= RNA_int_get(op->ptr, "xmin");
- rect.ymin= RNA_int_get(op->ptr, "ymin");
- rect.xmax= RNA_int_get(op->ptr, "xmax");
- rect.ymax= RNA_int_get(op->ptr, "ymax");
- extend = RNA_boolean_get(op->ptr, "extend");
+ hits= view3d_opengl_select(vc, buffer, MAXPICKBUF, rect);
- if(obedit==NULL && (paint_facesel_test(OBACT))) {
- face_borderselect(C, obact, &rect, selecting, extend);
- return OPERATOR_FINISHED;
- }
- else if(obedit==NULL && (obact && obact->mode & OB_MODE_PARTICLE_EDIT)) {
- return PE_border_select(C, &rect, selecting, extend);
+ if (extend == 0 && select) {
+ for(ml= mb->editelems->first; ml; ml= ml->next) {
+ ml->flag &= ~SELECT;
+ }
}
- else if(obedit==NULL && (obact && obact->mode & OB_MODE_SCULPT))
- return OPERATOR_CANCELLED;
- if(obedit) {
- if(obedit->type==OB_MESH) {
- Mesh *me= obedit->data;
- vc.em= me->edit_mesh;
- do_mesh_box_select(&vc, &rect, selecting, extend);
-// if (EM_texFaceCheck())
- WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
-
- }
- else if(ELEM(obedit->type, OB_CURVE, OB_SURF)) {
- do_nurbs_box_select(&vc, &rect, selecting, extend);
- }
- else if(obedit->type==OB_MBALL) {
- MetaBall *mb = (MetaBall*)obedit->data;
- hits= view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect);
-
- if (extend == 0 && selecting) {
- ml= mb->editelems->first;
-
- while(ml) {
- ml->flag &= ~SELECT;
- ml= ml->next;
- }
+ for(ml= mb->editelems->first; ml; ml= ml->next) {
+ for(a=0; a<hits; a++) {
+ if(ml->selcol1==buffer[ (4 * a) + 3 ]) {
+ ml->flag |= MB_SCALE_RAD;
+ if(select) ml->flag |= SELECT;
+ else ml->flag &= ~SELECT;
+ break;
}
-
- ml= mb->editelems->first;
-
- while(ml) {
- for(a=0; a<hits; a++) {
- if(ml->selcol1==buffer[ (4 * a) + 3 ]) {
- ml->flag |= MB_SCALE_RAD;
- if(selecting) ml->flag |= SELECT;
- else ml->flag &= ~SELECT;
- break;
- }
- if(ml->selcol2==buffer[ (4 * a) + 3 ]) {
- ml->flag &= ~MB_SCALE_RAD;
- if(selecting) ml->flag |= SELECT;
- else ml->flag &= ~SELECT;
- break;
- }
- }
- ml= ml->next;
+ if(ml->selcol2==buffer[ (4 * a) + 3 ]) {
+ ml->flag &= ~MB_SCALE_RAD;
+ if(select) ml->flag |= SELECT;
+ else ml->flag &= ~SELECT;
+ break;
}
}
- else if(obedit->type==OB_ARMATURE) {
- bArmature *arm= obedit->data;
- EditBone *ebone;
-
- /* clear flag we use to detect point was affected */
- for(ebone= arm->edbo->first; ebone; ebone= ebone->next)
- ebone->flag &= ~BONE_DONE;
-
- if (extend==0 && selecting) {
- /* Set the flags */
- CTX_DATA_BEGIN(C, EditBone *, ebone, visible_bones) {
- /* ignore bone if selection can't change */
- if ((ebone->flag & BONE_UNSELECTABLE) == 0) {
- ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- }
- }
- CTX_DATA_END;
- }
+ }
- hits= view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect);
-
- /* first we only check points inside the border */
- for (a=0; a<hits; a++){
- index = buffer[(4*a)+3];
- if (index!=-1) {
- ebone = BLI_findlink(arm->edbo, index & ~(BONESEL_ANY));
- if (index & BONESEL_TIP) {
- ebone->flag |= BONE_DONE;
- if (selecting) ebone->flag |= BONE_TIPSEL;
- else ebone->flag &= ~BONE_TIPSEL;
- }
-
- if (index & BONESEL_ROOT) {
- ebone->flag |= BONE_DONE;
- if (selecting) ebone->flag |= BONE_ROOTSEL;
- else ebone->flag &= ~BONE_ROOTSEL;
- }
+ return OPERATOR_FINISHED;
+}
+
+static int do_armature_box_select(ViewContext *vc, rcti *rect, short select, short extend)
+{
+ bArmature *arm= vc->obedit->data;
+ EditBone *ebone;
+ int a;
+
+ unsigned int buffer[4*MAXPICKBUF];
+ short hits;
+
+ hits= view3d_opengl_select(vc, buffer, MAXPICKBUF, rect);
+
+ /* clear flag we use to detect point was affected */
+ for(ebone= arm->edbo->first; ebone; ebone= ebone->next)
+ ebone->flag &= ~BONE_DONE;
+
+ if (extend==0 && select)
+ ED_armature_deselect_all_visible(vc->obedit);
+
+ /* first we only check points inside the border */
+ for (a=0; a<hits; a++){
+ int index = buffer[(4*a)+3];
+ if (index!=-1) {
+ ebone = BLI_findlink(arm->edbo, index & ~(BONESEL_ANY));
+ if ((ebone->flag & BONE_UNSELECTABLE)==0) {
+ if (index & BONESEL_TIP) {
+ ebone->flag |= BONE_DONE;
+ if (select) ebone->flag |= BONE_TIPSEL;
+ else ebone->flag &= ~BONE_TIPSEL;
}
- }
-
- /* now we have to flush tag from parents... */
- for(ebone= arm->edbo->first; ebone; ebone= ebone->next) {
- if(ebone->parent && (ebone->flag & BONE_CONNECTED)) {
- if(ebone->parent->flag & BONE_DONE)
- ebone->flag |= BONE_DONE;
+
+ if (index & BONESEL_ROOT) {
+ ebone->flag |= BONE_DONE;
+ if (select) ebone->flag |= BONE_ROOTSEL;
+ else ebone->flag &= ~BONE_ROOTSEL;
}
}
-
- /* only select/deselect entire bones when no points where in the rect */
- for (a=0; a<hits; a++){
- index = buffer[(4*a)+3];
- if (index!=-1) {
- ebone = BLI_findlink(arm->edbo, index & ~(BONESEL_ANY));
- if (index & BONESEL_BONE) {
- if(!(ebone->flag & BONE_DONE)) {
- if (selecting)
- ebone->flag |= (BONE_ROOTSEL|BONE_TIPSEL|BONE_SELECTED);
- else
- ebone->flag &= ~(BONE_ROOTSEL|BONE_TIPSEL|BONE_SELECTED);
- }
+ }
+ }
+
+ /* now we have to flush tag from parents... */
+ for(ebone= arm->edbo->first; ebone; ebone= ebone->next) {
+ if(ebone->parent && (ebone->flag & BONE_CONNECTED)) {
+ if(ebone->parent->flag & BONE_DONE)
+ ebone->flag |= BONE_DONE;
+ }
+ }
+
+ /* only select/deselect entire bones when no points where in the rect */
+ for (a=0; a<hits; a++){
+ int index = buffer[(4*a)+3];
+ if (index!=-1) {
+ ebone = BLI_findlink(arm->edbo, index & ~(BONESEL_ANY));
+ if (index & BONESEL_BONE) {
+ if ((ebone->flag & BONE_UNSELECTABLE)==0) {
+ if(!(ebone->flag & BONE_DONE)) {
+ if (select)
+ ebone->flag |= (BONE_ROOTSEL|BONE_TIPSEL|BONE_SELECTED);
+ else
+ ebone->flag &= ~(BONE_ROOTSEL|BONE_TIPSEL|BONE_SELECTED);
}
}
}
-
- ED_armature_sync_selection(arm->edbo);
- WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, vc.obedit);
- }
- else if(obedit->type==OB_LATTICE) {
- do_lattice_box_select(&vc, &rect, selecting, extend);
}
}
- else { /* no editmode, unified for bones and objects */
- Bone *bone;
- Object *ob= OBACT;
- unsigned int *vbuffer=NULL; /* selection buffer */
- unsigned int *col; /* color in buffer */
- int bone_only;
- int bone_selected=0;
- int totobj= MAXPICKBUF; // XXX solve later
-
- if((ob) && (ob->mode & OB_MODE_POSE))
- bone_only= 1;
- else
- bone_only= 0;
-
- if (extend == 0 && selecting) {
- base= FIRSTBASE;
+
+ ED_armature_sync_selection(arm->edbo);
+
+ return OPERATOR_CANCELLED;
+}
- if (bone_only) {
- CTX_DATA_BEGIN(C, bPoseChannel *, pchan, visible_pose_bones) {
+static int do_object_pose_box_select(bContext *C, ViewContext *vc, rcti *rect, int select, int extend)
+{
+ Bone *bone;
+ Object *ob= vc->obact;
+ unsigned int *vbuffer=NULL; /* selection buffer */
+ unsigned int *col; /* color in buffer */
+ int bone_only;
+ int bone_selected=0;
+ int totobj= MAXPICKBUF; // XXX solve later
+ short hits;
+
+ if((ob) && (ob->mode & OB_MODE_POSE))
+ bone_only= 1;
+ else
+ bone_only= 0;
+
+ if (extend == 0 && select) {
+ if (bone_only) {
+ CTX_DATA_BEGIN(C, bPoseChannel *, pchan, visible_pose_bones) {
+ if ((pchan->bone->flag & BONE_UNSELECTABLE)==0) {
pchan->bone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
}
- CTX_DATA_END;
- } else {
- while(base) {
- Base *next = base->next;
- if(BASE_SELECTABLE(v3d, base)) {
- ED_base_object_select(base, BA_DESELECT);
- }
- base= next;
- }
}
+ CTX_DATA_END;
+ } else {
+ object_deselect_all_visible(vc->scene, vc->v3d);
}
+ }
- /* selection buffer now has bones potentially too, so we add MAXPICKBUF */
- vbuffer = MEM_mallocN(4 * (totobj+MAXPICKBUF) * sizeof(unsigned int), "selection buffer");
- hits= view3d_opengl_select(&vc, vbuffer, 4*(totobj+MAXPICKBUF), &rect);
- /*
- LOGIC NOTES (theeth):
- The buffer and ListBase have the same relative order, which makes the selection
- very simple. Loop through both data sets at the same time, if the color
- is the same as the object, we have a hit and can move to the next color
- and object pair, if not, just move to the next object,
- keeping the same color until we have a hit.
-
- The buffer order is defined by OGL standard, hopefully no stupid GFX card
- does it incorrectly.
- */
-
- if (hits>0) { /* no need to loop if there's no hit */
- base= FIRSTBASE;
- col = vbuffer + 3;
-
- while(base && hits) {
- Base *next = base->next;
- if(BASE_SELECTABLE(v3d, base)) {
- while (base->selcol == (*col & 0xFFFF)) { /* we got an object */
-
- if(*col & 0xFFFF0000) { /* we got a bone */
- bone = get_indexed_bone(base->object, *col & ~(BONESEL_ANY));
- if(bone) {
- if(selecting) {
+ /* selection buffer now has bones potentially too, so we add MAXPICKBUF */
+ vbuffer = MEM_mallocN(4 * (totobj+MAXPICKBUF) * sizeof(unsigned int), "selection buffer");
+ hits= view3d_opengl_select(vc, vbuffer, 4*(totobj+MAXPICKBUF), rect);
+ /*
+ LOGIC NOTES (theeth):
+ The buffer and ListBase have the same relative order, which makes the selection
+ very simple. Loop through both data sets at the same time, if the color
+ is the same as the object, we have a hit and can move to the next color
+ and object pair, if not, just move to the next object,
+ keeping the same color until we have a hit.
+
+ The buffer order is defined by OGL standard, hopefully no stupid GFX card
+ does it incorrectly.
+ */
+
+ if (hits>0) { /* no need to loop if there's no hit */
+ Base *base;
+ col = vbuffer + 3;
+
+ for(base= vc->scene->base.first; base && hits; base= base->next) {
+ if(BASE_SELECTABLE(vc->v3d, base)) {
+ while (base->selcol == (*col & 0xFFFF)) { /* we got an object */
+
+ if(*col & 0xFFFF0000) { /* we got a bone */
+ bone = get_indexed_bone(base->object, *col & ~(BONESEL_ANY));
+ if(bone) {
+ if(select) {
+ if ((bone->flag & BONE_UNSELECTABLE)==0) {
bone->flag |= BONE_SELECTED;
bone_selected=1;
// XXX select_actionchannel_by_name(base->object->action, bone->name, 1);
}
- else {
- bArmature *arm= base->object->data;
- bone->flag &= ~BONE_SELECTED;
+ }
+ else {
+ bArmature *arm= base->object->data;
+ bone->flag &= ~BONE_SELECTED;
// XXX select_actionchannel_by_name(base->object->action, bone->name, 0);
- if(arm->act_bone==bone)
- arm->act_bone= NULL;
-
- }
+ if(arm->act_bone==bone)
+ arm->act_bone= NULL;
+
}
}
- else if(!bone_only) {
- if (selecting)
- ED_base_object_select(base, BA_SELECT);
- else
- ED_base_object_select(base, BA_DESELECT);
- }
-
- col+=4; /* next color */
- hits--;
- if(hits==0) break;
}
+ else if(!bone_only) {
+ if (select)
+ ED_base_object_select(base, BA_SELECT);
+ else
+ ED_base_object_select(base, BA_DESELECT);
+ }
+
+ col+=4; /* next color */
+ hits--;
+ if(hits==0) break;
}
-
- if (bone_selected) WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, base->object);
-
- base= next;
}
+
+ if (bone_selected) {
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, base->object);
+ }
+ }
- WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, vc->scene);
+
+ }
+ MEM_freeN(vbuffer);
+
+ return hits > 0 ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
+}
+static int view3d_borderselect_exec(bContext *C, wmOperator *op)
+{
+ ViewContext vc;
+ rcti rect;
+ short extend;
+ short select;
+
+ int ret= OPERATOR_CANCELLED;
+
+ view3d_operator_needs_opengl(C);
+
+ /* setup view context for argument to callbacks */
+ view3d_set_viewcontext(C, &vc);
+
+ select= (RNA_int_get(op->ptr, "gesture_mode")==GESTURE_MODAL_SELECT);
+ rect.xmin= RNA_int_get(op->ptr, "xmin");
+ rect.ymin= RNA_int_get(op->ptr, "ymin");
+ rect.xmax= RNA_int_get(op->ptr, "xmax");
+ rect.ymax= RNA_int_get(op->ptr, "ymax");
+ extend = RNA_boolean_get(op->ptr, "extend");
+
+ if(vc.obedit) {
+ switch(vc.obedit->type) {
+ case OB_MESH:
+ vc.em= ((Mesh *)vc.obedit->data)->edit_mesh;
+ ret= do_mesh_box_select(&vc, &rect, select, extend);
+// if (EM_texFaceCheck())
+ if(ret & OPERATOR_FINISHED) {
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, vc.obedit->data);
+ }
+ break;
+ case OB_CURVE:
+ case OB_SURF:
+ ret= do_nurbs_box_select(&vc, &rect, select, extend);
+ break;
+ case OB_MBALL:
+ ret= do_meta_box_select(&vc, &rect, select, extend);
+ break;
+ case OB_ARMATURE:
+ ret= do_armature_box_select(&vc, &rect, select, extend);
+ if(ret & OPERATOR_FINISHED) {
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, vc.obedit);
+ }
+ break;
+ case OB_LATTICE:
+ ret= do_lattice_box_select(&vc, &rect, select, extend);
+ break;
+ default:
+ assert(!"border select on incorrect object type");
}
- MEM_freeN(vbuffer);
}
- return OPERATOR_FINISHED;
+ else { /* no editmode, unified for bones and objects */
+ if(vc.obact && vc.obact->mode & OB_MODE_SCULPT) {
+ /* pass */
+ }
+ else if(vc.obact && paint_facesel_test(vc.obact)) {
+ ret= do_paintface_box_select(&vc, &rect, select, extend);
+ }
+ else if(vc.obact && vc.obact->mode & OB_MODE_PARTICLE_EDIT) {
+ ret= PE_border_select(C, &rect, select, extend);
+ }
+ else { /* object mode with none active */
+ ret= do_object_pose_box_select(C, &vc, &rect, select, extend);
+ }
+ }
+
+ return ret;
}
@@ -1764,7 +1867,7 @@ static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
else if(obact && obact->mode & OB_MODE_PARTICLE_EDIT)
return PE_mouse_particles(C, event->mval, extend);
else if(obact && paint_facesel_test(obact))
- retval = face_select(C, obact, event->mval, extend);
+ retval = paintface_mouse_select(C, obact, event->mval, extend);
else
retval = mouse_select(C, event->mval, extend, center, enumerate);
@@ -1800,7 +1903,7 @@ void VIEW3D_OT_select(wmOperatorType *ot)
/* -------------------- circle select --------------------------------------------- */
-static void mesh_circle_doSelectVert(void *userData, EditVert *eve, int x, int y, int index)
+static void mesh_circle_doSelectVert(void *userData, EditVert *eve, int x, int y, int UNUSED(index))
{
struct {ViewContext *vc; short select, mval[2]; float radius; } *data = userData;
int mx = x - data->mval[0], my = y - data->mval[1];
@@ -1810,7 +1913,7 @@ static void mesh_circle_doSelectVert(void *userData, EditVert *eve, int x, int y
eve->f = data->select?(eve->f|1):(eve->f&~1);
}
}
-static void mesh_circle_doSelectEdge(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index)
+static void mesh_circle_doSelectEdge(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int UNUSED(index))
{
struct {ViewContext *vc; short select, mval[2]; float radius; } *data = userData;
@@ -1818,7 +1921,7 @@ static void mesh_circle_doSelectEdge(void *userData, EditEdge *eed, int x0, int
EM_select_edge(eed, data->select);
}
}
-static void mesh_circle_doSelectFace(void *userData, EditFace *efa, int x, int y, int index)
+static void mesh_circle_doSelectFace(void *userData, EditFace *efa, int x, int y, int UNUSED(index))
{
struct {ViewContext *vc; short select, mval[2]; float radius; } *data = userData;
int mx = x - data->mval[0], my = y - data->mval[1];
@@ -1829,7 +1932,7 @@ static void mesh_circle_doSelectFace(void *userData, EditFace *efa, int x, int y
}
}
-static void mesh_circle_select(ViewContext *vc, int selecting, short *mval, float rad)
+static void mesh_circle_select(ViewContext *vc, int select, short *mval, float rad)
{
ToolSettings *ts= vc->scene->toolsettings;
int bbsel;
@@ -1841,14 +1944,14 @@ static void mesh_circle_select(ViewContext *vc, int selecting, short *mval, floa
vc->em= ((Mesh *)vc->obedit->data)->edit_mesh;
data.vc = vc;
- data.select = selecting;
+ data.select = select;
data.mval[0] = mval[0];
data.mval[1] = mval[1];
data.radius = rad;
if(ts->selectmode & SCE_SELECT_VERTEX) {
if(bbsel) {
- EM_backbuf_checkAndSelectVerts(vc->em, selecting==LEFTMOUSE);
+ EM_backbuf_checkAndSelectVerts(vc->em, select==LEFTMOUSE);
} else {
mesh_foreachScreenVert(vc, mesh_circle_doSelectVert, &data, 1);
}
@@ -1856,7 +1959,7 @@ static void mesh_circle_select(ViewContext *vc, int selecting, short *mval, floa
if(ts->selectmode & SCE_SELECT_EDGE) {
if (bbsel) {
- EM_backbuf_checkAndSelectEdges(vc->em, selecting==LEFTMOUSE);
+ EM_backbuf_checkAndSelectEdges(vc->em, select==LEFTMOUSE);
} else {
mesh_foreachScreenEdge(vc, mesh_circle_doSelectEdge, &data, 0);
}
@@ -1864,7 +1967,7 @@ static void mesh_circle_select(ViewContext *vc, int selecting, short *mval, floa
if(ts->selectmode & SCE_SELECT_FACE) {
if(bbsel) {
- EM_backbuf_checkAndSelectFaces(vc->em, selecting==LEFTMOUSE);
+ EM_backbuf_checkAndSelectFaces(vc->em, select==LEFTMOUSE);
} else {
mesh_foreachScreenFace(vc, mesh_circle_doSelectFace, &data);
}
@@ -1874,7 +1977,7 @@ static void mesh_circle_select(ViewContext *vc, int selecting, short *mval, floa
EM_selectmode_flush(vc->em);
}
-static void paint_facesel_circle_select(ViewContext *vc, int selecting, short *mval, float rad)
+static void paint_facesel_circle_select(ViewContext *vc, int select, short *mval, float rad)
{
Object *ob= vc->obact;
Mesh *me = ob?ob->data:NULL;
@@ -1884,15 +1987,13 @@ static void paint_facesel_circle_select(ViewContext *vc, int selecting, short *m
em_vertoffs= me->totface+1; /* max index array */
bbsel= EM_init_backbuf_circle(vc, mval[0], mval[1], (short)(rad+1.0));
- EM_backbuf_checkAndSelectTFaces(me, selecting==LEFTMOUSE);
+ EM_backbuf_checkAndSelectTFaces(me, select==LEFTMOUSE);
EM_free_backbuf();
-
-// XXX object_tface_flags_changed(OBACT, 0);
}
}
-static void nurbscurve_circle_doSelect(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
+static void nurbscurve_circle_doSelect(void *userData, Nurb *UNUSED(nu), BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
struct {ViewContext *vc; short select, mval[2]; float radius; } *data = userData;
int mx = x - data->mval[0], my = y - data->mval[1];
@@ -1923,13 +2024,13 @@ static void nurbscurve_circle_doSelect(void *userData, Nurb *nu, BPoint *bp, Bez
}
}
}
-static void nurbscurve_circle_select(ViewContext *vc, int selecting, short *mval, float rad)
+static void nurbscurve_circle_select(ViewContext *vc, int select, short *mval, float rad)
{
struct {ViewContext *vc; short select, mval[2]; float radius; } data;
/* set vc-> edit data */
- data.select = selecting;
+ data.select = select;
data.mval[0] = mval[0];
data.mval[1] = mval[1];
data.radius = rad;
@@ -1950,13 +2051,13 @@ static void latticecurve_circle_doSelect(void *userData, BPoint *bp, int x, int
bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
}
}
-static void lattice_circle_select(ViewContext *vc, int selecting, short *mval, float rad)
+static void lattice_circle_select(ViewContext *vc, int select, short *mval, float rad)
{
struct {ViewContext *vc; short select, mval[2]; float radius; } data;
/* set vc-> edit data */
- data.select = selecting;
+ data.select = select;
data.mval[0] = mval[0];
data.mval[1] = mval[1];
data.radius = rad;
@@ -1966,6 +2067,67 @@ static void lattice_circle_select(ViewContext *vc, int selecting, short *mval, f
}
+// NOTE: pose-bone case is copied from editbone case...
+static short pchan_circle_doSelectJoint(void *userData, bPoseChannel *pchan, int x, int y)
+{
+ struct {ViewContext *vc; short select, mval[2]; float radius; } *data = userData;
+ int mx = x - data->mval[0], my = y - data->mval[1];
+ float r = sqrt(mx*mx + my*my);
+
+ if (r <= data->radius) {
+ if (data->select)
+ pchan->bone->flag |= BONE_SELECTED;
+ else
+ pchan->bone->flag &= ~BONE_SELECTED;
+ return 1;
+ }
+ return 0;
+}
+static void pose_circle_select(ViewContext *vc, int select, short *mval, float rad)
+{
+ struct {ViewContext *vc; short select, mval[2]; float radius; } data;
+ bPose *pose = vc->obact->pose;
+ bPoseChannel *pchan;
+ int change= FALSE;
+
+ /* set vc->edit data */
+ data.select = select;
+ data.mval[0] = mval[0];
+ data.mval[1] = mval[1];
+ data.radius = rad;
+
+ ED_view3d_init_mats_rv3d(vc->obact, vc->rv3d); /* for foreach's screen/vert projection */
+
+ /* check each PoseChannel... */
+ // TODO: could be optimised at some point
+ for (pchan = pose->chanbase.first; pchan; pchan = pchan->next) {
+ short sco1[2], sco2[2], didpoint=0;
+ float vec[3];
+
+ /* project head location to screenspace */
+ mul_v3_m4v3(vec, vc->obact->obmat, pchan->pose_head);
+ project_short(vc->ar, vec, sco1);
+
+ /* project tail location to screenspace */
+ mul_v3_m4v3(vec, vc->obact->obmat, pchan->pose_tail);
+ project_short(vc->ar, vec, sco2);
+
+ /* check if the head and/or tail is in the circle
+ * - the call to check also does the selection already
+ */
+ if (pchan_circle_doSelectJoint(&data, pchan, sco1[0], sco1[1]))
+ didpoint= 1;
+ if (pchan_circle_doSelectJoint(&data, pchan, sco2[0], sco2[1]))
+ didpoint= 1;
+
+ change |= didpoint;
+ }
+
+ if (change) {
+ WM_main_add_notifier(NC_OBJECT|ND_BONE_SELECT, vc->obact);
+ }
+}
+
static short armature_circle_doSelectJoint(void *userData, EditBone *ebone, int x, int y, short head)
{
struct {ViewContext *vc; short select, mval[2]; float radius; } *data = userData;
@@ -1989,7 +2151,7 @@ static short armature_circle_doSelectJoint(void *userData, EditBone *ebone, int
}
return 0;
}
-static void armature_circle_select(ViewContext *vc, int selecting, short *mval, float rad)
+static void armature_circle_select(ViewContext *vc, int select, short *mval, float rad)
{
struct {ViewContext *vc; short select, mval[2]; float radius; } data;
bArmature *arm= vc->obedit->data;
@@ -1997,7 +2159,7 @@ static void armature_circle_select(ViewContext *vc, int selecting, short *mval,
int change= FALSE;
/* set vc->edit data */
- data.select = selecting;
+ data.select = select;
data.mval[0] = mval[0];
data.mval[1] = mval[1];
data.radius = rad;
@@ -2029,15 +2191,18 @@ static void armature_circle_select(ViewContext *vc, int selecting, short *mval,
/* only if the endpoints didn't get selected, deal with the middle of the bone too */
// XXX should we just do this always?
if ( (didpoint==0) && edge_inside_circle(mval[0], mval[1], rad, sco1[0], sco1[1], sco2[0], sco2[1]) ) {
- if (selecting)
+ if (select)
ebone->flag |= BONE_TIPSEL|BONE_ROOTSEL|BONE_SELECTED;
else
ebone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
change= TRUE;
}
+
+ change |= didpoint;
}
if(change) {
+ ED_armature_sync_selection(arm->edbo);
ED_armature_validate_active(arm);
WM_main_add_notifier(NC_OBJECT|ND_BONE_SELECT, vc->obedit);
}
@@ -2045,21 +2210,21 @@ static void armature_circle_select(ViewContext *vc, int selecting, short *mval,
/** Callbacks for circle selection in Editmode */
-static void obedit_circle_select(ViewContext *vc, short selecting, short *mval, float rad)
+static void obedit_circle_select(ViewContext *vc, short select, short *mval, float rad)
{
switch(vc->obedit->type) {
case OB_MESH:
- mesh_circle_select(vc, selecting, mval, rad);
+ mesh_circle_select(vc, select, mval, rad);
break;
case OB_CURVE:
case OB_SURF:
- nurbscurve_circle_select(vc, selecting, mval, rad);
+ nurbscurve_circle_select(vc, select, mval, rad);
break;
case OB_LATTICE:
- lattice_circle_select(vc, selecting, mval, rad);
+ lattice_circle_select(vc, select, mval, rad);
break;
case OB_ARMATURE:
- armature_circle_select(vc, selecting, mval, rad);
+ armature_circle_select(vc, select, mval, rad);
break;
default:
return;
@@ -2078,12 +2243,13 @@ static int view3d_circle_select_exec(bContext *C, wmOperator *op)
int y= RNA_int_get(op->ptr, "y");
int radius= RNA_int_get(op->ptr, "radius");
int gesture_mode= RNA_int_get(op->ptr, "gesture_mode");
- int selecting;
+ int select;
- selecting= (gesture_mode==GESTURE_MODAL_SELECT);
+ select= (gesture_mode==GESTURE_MODAL_SELECT);
- if(CTX_data_edit_object(C) || paint_facesel_test(obact) ||
- (obact && obact->mode & OB_MODE_PARTICLE_EDIT)) {
+ if( CTX_data_edit_object(C) || paint_facesel_test(obact) ||
+ (obact && (obact->mode & (OB_MODE_PARTICLE_EDIT|OB_MODE_POSE))) )
+ {
ViewContext vc;
short mval[2];
@@ -2094,22 +2260,24 @@ static int view3d_circle_select_exec(bContext *C, wmOperator *op)
mval[1]= y;
if(CTX_data_edit_object(C)) {
- obedit_circle_select(&vc, selecting, mval, (float)radius);
+ obedit_circle_select(&vc, select, mval, (float)radius);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obact->data);
}
else if(paint_facesel_test(obact)) {
- paint_facesel_circle_select(&vc, selecting, mval, (float)radius);
+ paint_facesel_circle_select(&vc, select, mval, (float)radius);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obact->data);
}
+ else if(obact->mode & OB_MODE_POSE)
+ pose_circle_select(&vc, select, mval, (float)radius);
else
- return PE_circle_select(C, selecting, mval, (float)radius);
+ return PE_circle_select(C, select, mval, (float)radius);
}
else if(obact && obact->mode & OB_MODE_SCULPT) {
return OPERATOR_CANCELLED;
}
else {
Base *base;
- selecting= selecting?BA_SELECT:BA_DESELECT;
+ select= select?BA_SELECT:BA_DESELECT;
for(base= FIRSTBASE; base; base= base->next) {
if(BASE_SELECTABLE(v3d, base)) {
project_short(ar, base->object->obmat[3], &base->sx);
@@ -2117,7 +2285,7 @@ static int view3d_circle_select_exec(bContext *C, wmOperator *op)
int dx= base->sx-x;
int dy= base->sy-y;
if( dx*dx + dy*dy < radius*radius)
- ED_base_object_select(base, selecting);
+ ED_base_object_select(base, select);
}
}
}
diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c
index 5ee87db6b68..e90998da21c 100644
--- a/source/blender/editors/space_view3d/view3d_snap.c
+++ b/source/blender/editors/space_view3d/view3d_snap.c
@@ -43,6 +43,7 @@
#include "BLI_math.h"
#include "BLI_editVert.h"
#include "BLI_linklist.h"
+#include "BLI_utildefines.h"
#include "BKE_armature.h"
#include "BKE_context.h"
@@ -82,12 +83,12 @@ static TransVert *transvmain=NULL;
static int tottrans= 0;
/* copied from editobject.c, now uses (almost) proper depgraph */
-static void special_transvert_update(Scene *scene, Object *obedit)
+static void special_transvert_update(Object *obedit)
{
if(obedit) {
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
if(obedit->type==OB_MESH) {
Mesh *me= obedit->data;
@@ -443,7 +444,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
/* *********************** operators ******************** */
-static int snap_sel_to_grid(bContext *C, wmOperator *op)
+static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op))
{
extern float originmat[3][3]; /* XXX object.c */
Main *bmain= CTX_data_main(C);
@@ -481,7 +482,7 @@ static int snap_sel_to_grid(bContext *C, wmOperator *op)
VECCOPY(tv->loc, vec);
}
- special_transvert_update(scene, obedit);
+ special_transvert_update(obedit);
MEM_freeN(transvmain);
transvmain= NULL;
@@ -510,7 +511,12 @@ static int snap_sel_to_grid(bContext *C, wmOperator *op)
armature_loc_pose_to_bone(pchan, vec, vecN);
/* adjust location */
- VECCOPY(pchan->loc, vecN);
+ if ((pchan->protectflag & OB_LOCK_LOCX)==0)
+ pchan->loc[0]= vecN[0];
+ if ((pchan->protectflag & OB_LOCK_LOCY)==0)
+ pchan->loc[0]= vecN[1];
+ if ((pchan->protectflag & OB_LOCK_LOCZ)==0)
+ pchan->loc[0]= vecN[2];
}
/* if the bone has a parent and is connected to the parent,
* don't do anything - will break chain unless we do auto-ik.
@@ -522,7 +528,7 @@ static int snap_sel_to_grid(bContext *C, wmOperator *op)
/* auto-keyframing */
// XXX autokeyframe_pose_cb_func(ob, TFM_TRANSLATION, 0);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else {
ob->recalc |= OB_RECALC_OB;
@@ -536,16 +542,14 @@ static int snap_sel_to_grid(bContext *C, wmOperator *op)
invert_m3_m3(imat, originmat);
mul_m3_v3(imat, vec);
- ob->loc[0]+= vec[0];
- ob->loc[1]+= vec[1];
- ob->loc[2]+= vec[2];
}
- else {
+ if ((ob->protectflag & OB_LOCK_LOCX)==0)
ob->loc[0]+= vec[0];
+ if ((ob->protectflag & OB_LOCK_LOCY)==0)
ob->loc[1]+= vec[1];
+ if ((ob->protectflag & OB_LOCK_LOCZ)==0)
ob->loc[2]+= vec[2];
- }
-
+
/* auto-keyframing */
// XXX autokeyframe_ob_cb_func(ob, TFM_TRANSLATION);
}
@@ -569,7 +573,7 @@ void VIEW3D_OT_snap_selected_to_grid(wmOperatorType *ot)
/* api callbacks */
ot->exec= snap_sel_to_grid;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -577,7 +581,7 @@ void VIEW3D_OT_snap_selected_to_grid(wmOperatorType *ot)
/* *************************************************** */
-static int snap_sel_to_curs(bContext *C, wmOperator *op)
+static int snap_sel_to_curs(bContext *C, wmOperator *UNUSED(op))
{
extern float originmat[3][3]; /* XXX object.c */
Main *bmain= CTX_data_main(C);
@@ -602,15 +606,12 @@ static int snap_sel_to_curs(bContext *C, wmOperator *op)
tv= transvmain;
for(a=0; a<tottrans; a++, tv++) {
- vec[0]= curs[0]-obedit->obmat[3][0];
- vec[1]= curs[1]-obedit->obmat[3][1];
- vec[2]= curs[2]-obedit->obmat[3][2];
-
+ sub_v3_v3v3(vec, curs, obedit->obmat[3]);
mul_m3_v3(imat, vec);
- VECCOPY(tv->loc, vec);
+ copy_v3_v3(tv->loc, vec);
}
- special_transvert_update(scene, obedit);
+ special_transvert_update(obedit);
MEM_freeN(transvmain);
transvmain= NULL;
@@ -636,8 +637,13 @@ static int snap_sel_to_curs(bContext *C, wmOperator *op)
/* get location of cursor in bone-space */
armature_loc_pose_to_bone(pchan, cursp, curspn);
- /* calculate new position */
- VECCOPY(pchan->loc, curspn);
+ /* copy new position */
+ if ((pchan->protectflag & OB_LOCK_LOCX)==0)
+ pchan->loc[0]= curspn[0];
+ if ((pchan->protectflag & OB_LOCK_LOCY)==0)
+ pchan->loc[1]= curspn[1];
+ if ((pchan->protectflag & OB_LOCK_LOCZ)==0)
+ pchan->loc[2]= curspn[2];
}
/* if the bone has a parent and is connected to the parent,
* don't do anything - will break chain unless we do auto-ik.
@@ -649,7 +655,7 @@ static int snap_sel_to_curs(bContext *C, wmOperator *op)
/* auto-keyframing */
// XXX autokeyframe_pose_cb_func(ob, TFM_TRANSLATION, 0);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else {
ob->recalc |= OB_RECALC_OB;
@@ -663,15 +669,14 @@ static int snap_sel_to_curs(bContext *C, wmOperator *op)
invert_m3_m3(imat, originmat);
mul_m3_v3(imat, vec);
- ob->loc[0]+= vec[0];
- ob->loc[1]+= vec[1];
- ob->loc[2]+= vec[2];
}
- else {
+ if ((ob->protectflag & OB_LOCK_LOCX)==0)
ob->loc[0]+= vec[0];
+ if ((ob->protectflag & OB_LOCK_LOCY)==0)
ob->loc[1]+= vec[1];
+ if ((ob->protectflag & OB_LOCK_LOCZ)==0)
ob->loc[2]+= vec[2];
- }
+
/* auto-keyframing */
// XXX autokeyframe_ob_cb_func(ob, TFM_TRANSLATION);
}
@@ -703,7 +708,7 @@ void VIEW3D_OT_snap_selected_to_cursor(wmOperatorType *ot)
/* *************************************************** */
-static int snap_curs_to_grid(bContext *C, wmOperator *op)
+static int snap_curs_to_grid(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
RegionView3D *rv3d= CTX_wm_region_data(C);
@@ -732,7 +737,7 @@ void VIEW3D_OT_snap_cursor_to_grid(wmOperatorType *ot)
/* api callbacks */
ot->exec= snap_curs_to_grid;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -740,7 +745,7 @@ void VIEW3D_OT_snap_cursor_to_grid(wmOperatorType *ot)
/* **************************************************** */
-static int snap_curs_to_sel(bContext *C, wmOperator *op)
+static int snap_curs_to_sel(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Scene *scene= CTX_data_scene(C);
@@ -786,16 +791,16 @@ static int snap_curs_to_sel(bContext *C, wmOperator *op)
transvmain= NULL;
}
else {
- Object *ob= CTX_data_active_object(C);
+ Object *obact= CTX_data_active_object(C);
- if(ob && (ob->mode & OB_MODE_POSE)) {
- bArmature *arm= ob->data;
+ if(obact && (obact->mode & OB_MODE_POSE)) {
+ bArmature *arm= obact->data;
bPoseChannel *pchan;
- for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) {
+ for (pchan = obact->pose->chanbase.first; pchan; pchan=pchan->next) {
if(arm->layer & pchan->bone->layer) {
if(pchan->bone->flag & BONE_SELECTED) {
VECCOPY(vec, pchan->pose_head);
- mul_m4_v3(ob->obmat, vec);
+ mul_m4_v3(obact->obmat, vec);
add_v3_v3(centroid, vec);
DO_MINMAX(vec, min, max);
count++;
@@ -847,7 +852,7 @@ void VIEW3D_OT_snap_cursor_to_selected(wmOperatorType *ot)
/* ********************************************** */
-static int snap_curs_to_active(bContext *C, wmOperator *op)
+static int snap_curs_to_active(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Object *obact= CTX_data_active_object(C);
@@ -898,7 +903,7 @@ void VIEW3D_OT_snap_cursor_to_active(wmOperatorType *ot)
/* **************************************************** */
/*New Code - Snap Cursor to Center -*/
-static int snap_curs_to_center(bContext *C, wmOperator *op)
+static int snap_curs_to_center(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
View3D *v3d= CTX_wm_view3d(C);
@@ -924,7 +929,7 @@ void VIEW3D_OT_snap_cursor_to_center(wmOperatorType *ot)
/* api callbacks */
ot->exec= snap_curs_to_center;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_view3d_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
diff --git a/source/blender/editors/space_view3d/view3d_toolbar.c b/source/blender/editors/space_view3d/view3d_toolbar.c
index 6e2624cb60b..3f69ce3e8a8 100644
--- a/source/blender/editors/space_view3d/view3d_toolbar.c
+++ b/source/blender/editors/space_view3d/view3d_toolbar.c
@@ -40,6 +40,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_idprop.h"
@@ -63,27 +64,6 @@
/* ******************* view3d space & buttons ************** */
-
-/* op->invoke */
-static void redo_cb(bContext *C, void *arg_op, void *arg2)
-{
- wmOperator *lastop= arg_op;
-
- if(lastop) {
- int retval;
-
- if (G.f & G_DEBUG)
- printf("operator redo %s\n", lastop->type->name);
- ED_undo_pop_op(C, lastop);
- retval= WM_operator_repeat(C, lastop);
- if((retval & OPERATOR_FINISHED)==0) {
- if (G.f & G_DEBUG)
- printf("operator redo failed %s\n", lastop->type->name);
- ED_undo_redo(C);
- }
- }
-}
-
static wmOperator *view3d_last_operator(const bContext *C)
{
wmWindowManager *wm= CTX_wm_manager(C);
@@ -99,22 +79,7 @@ static wmOperator *view3d_last_operator(const bContext *C)
static void view3d_panel_operator_redo_buts(const bContext *C, Panel *pa, wmOperator *op)
{
- wmWindowManager *wm= CTX_wm_manager(C);
- PointerRNA ptr;
-
- if(!op->properties) {
- IDPropertyTemplate val = {0};
- op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties");
- }
-
- RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
- if(op->type->ui) {
- op->layout= pa->layout;
- op->type->ui((bContext*)C, op);
- op->layout= NULL;
- }
- else
- uiDefAutoButsRNA(C, pa->layout, &ptr, 1);
+ uiLayoutOperatorButs(C, pa->layout, op, NULL, 'V', 0);
}
static void view3d_panel_operator_redo_header(const bContext *C, Panel *pa)
@@ -129,7 +94,7 @@ static void view3d_panel_operator_redo_operator(const bContext *C, Panel *pa, wm
{
if(op->type->flag & OPTYPE_MACRO) {
for(op= op->macro.first; op; op= op->next) {
- uiItemL(pa->layout, op->type->name, 0);
+ uiItemL(pa->layout, op->type->name, ICON_NULL);
view3d_panel_operator_redo_operator(C, pa, op);
}
}
@@ -149,8 +114,12 @@ static void view3d_panel_operator_redo(const bContext *C, Panel *pa)
return;
block= uiLayoutGetBlock(pa->layout);
+
+ if(ED_undo_valid(C, op->type->name)==0)
+ uiLayoutSetEnabled(pa->layout, 0);
- uiBlockSetFunc(block, redo_cb, op, NULL);
+ /* note, blockfunc is a default but->func, use Handle func to allow button callbacks too */
+ uiBlockSetHandleFunc(block, ED_undo_operator_repeat_cb_evt, op);
view3d_panel_operator_redo_operator(C, pa, op);
}
@@ -177,7 +146,7 @@ static void operator_call_cb(struct bContext *C, void *arg_listbase, void *arg2)
}
-static void operator_search_cb(const struct bContext *C, void *arg, char *str, uiSearchItems *items)
+static void operator_search_cb(const struct bContext *C, void *UNUSED(arg), const char *str, uiSearchItems *items)
{
wmOperatorType *ot = WM_operatortype_first();
@@ -246,7 +215,7 @@ static void view3d_panel_tool_shelf(const bContext *C, Panel *pa)
for(ct= st->toolshelf.first; ct; ct= ct->next) {
if(0==strncmp(context, ct->context, OP_MAX_TYPENAME)) {
col= uiLayoutColumn(pa->layout, 1);
- uiItemFullO(col, ct->opname, NULL, 0, NULL, WM_OP_INVOKE_REGION_WIN, 0);
+ uiItemFullO(col, ct->opname, NULL, ICON_NULL, NULL, WM_OP_INVOKE_REGION_WIN, 0);
}
}
}
@@ -280,7 +249,7 @@ void view3d_tool_props_register(ARegionType *art)
/* ********** operator to open/close toolshelf region */
-static int view3d_toolshelf(bContext *C, wmOperator *op)
+static int view3d_toolshelf(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= view3d_has_tools_region(sa);
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c
index 6a3c121ce4b..7ed85cacc1e 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -26,12 +26,6 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include <string.h>
-#include <stdio.h>
-#include <math.h>
-#include <float.h>
-
-#include "DNA_anim_types.h"
#include "DNA_camera_types.h"
#include "DNA_lamp_types.h"
#include "DNA_scene_types.h"
@@ -40,9 +34,9 @@
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
-#include "BLI_blenlib.h"
-#include "BLI_editVert.h"
-#include "BLI_rand.h"
+#include "BLI_rect.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
#include "BKE_anim.h"
#include "BKE_action.h"
@@ -52,25 +46,19 @@
#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_depsgraph.h" /* for fly mode updating */
-
#include "BIF_gl.h"
#include "BIF_glutil.h"
+#include "GPU_draw.h"
+
#include "WM_api.h"
#include "WM_types.h"
-#include "ED_keyframing.h"
#include "ED_screen.h"
#include "ED_armature.h"
-#include "GPU_draw.h"
-
-
-#include "PIL_time.h" /* smoothview */
-
-#if GAMEBLENDER == 1
+#ifdef WITH_GAMEENGINE
#include "SYS_System.h"
#endif
@@ -81,15 +69,21 @@
opengl drawing context */
void view3d_operator_needs_opengl(const bContext *C)
{
+ wmWindow *win = CTX_wm_window(C);
ARegion *ar= CTX_wm_region(C);
+
+ view3d_region_operator_needs_opengl(win, ar);
+}
+void view3d_region_operator_needs_opengl(wmWindow *win, ARegion *ar)
+{
/* for debugging purpose, context should always be OK */
- if(ar->regiontype!=RGN_TYPE_WINDOW)
- printf("view3d_operator_needs_opengl error, wrong region\n");
+ if ((ar == NULL) || (ar->regiontype!=RGN_TYPE_WINDOW))
+ printf("view3d_region_operator_needs_opengl error, wrong region\n");
else {
RegionView3D *rv3d= ar->regiondata;
- wmSubWindowSet(CTX_wm_window(C), ar->swinid);
+ wmSubWindowSet(win, ar->swinid);
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(rv3d->winmat);
glMatrixMode(GL_MODELVIEW);
@@ -153,8 +147,12 @@ void view3d_settings_from_ob(Object *ob, float *ofs, float *quat, float *dist, f
}
if (dist) {
- float vec[3] = {0.0f, 0.0f, -(*dist)};
float tquat[4];
+ float vec[3];
+
+ vec[0]= 0.0f;
+ vec[1]= 0.0f;
+ vec[2]= -(*dist);
mat4_to_quat(tquat, ob->obmat);
@@ -189,10 +187,10 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
{
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
- struct SmoothViewStore sms;
+ struct SmoothViewStore sms= {0};
+ short ok= FALSE;
/* initialize sms */
- memset(&sms,0,sizeof(struct SmoothViewStore));
copy_v3_v3(sms.new_ofs, rv3d->ofs);
copy_qt_qt(sms.new_quat, rv3d->viewquat);
sms.new_dist= rv3d->dist;
@@ -204,7 +202,7 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
if(quat) copy_qt_qt(sms.new_quat, quat);
if(dist) sms.new_dist= *dist;
if(lens) sms.new_lens= *lens;
-
+
if (camera) {
view3d_settings_from_ob(camera, sms.new_ofs, sms.new_quat, &sms.new_dist, &sms.new_lens);
sms.to_camera= 1; /* restore view3d values in end */
@@ -213,15 +211,15 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
if (C && U.smooth_viewtx) {
int changed = 0; /* zero means no difference */
- if (sms.new_dist != rv3d->dist)
+ if (oldcamera != camera)
changed = 1;
- if (sms.new_lens != v3d->lens)
+ else if (sms.new_dist != rv3d->dist)
changed = 1;
-
- if (!equals_v3v3(sms.new_ofs, rv3d->ofs))
+ else if (sms.new_lens != v3d->lens)
changed = 1;
-
- if (!equals_v4v4(sms.new_quat, rv3d->viewquat))
+ else if (!equals_v3v3(sms.new_ofs, rv3d->ofs))
+ changed = 1;
+ else if (!equals_v4v4(sms.new_quat, rv3d->viewquat))
changed = 1;
/* The new view is different from the old one
@@ -280,22 +278,30 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
/* TIMER1 is hardcoded in keymap */
rv3d->smooth_timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER1, 1.0/100.0); /* max 30 frs/sec */
- return;
+ ok= TRUE;
}
}
/* if we get here nothing happens */
- if(sms.to_camera==0) {
- copy_v3_v3(rv3d->ofs, sms.new_ofs);
- copy_qt_qt(rv3d->viewquat, sms.new_quat);
- rv3d->dist = sms.new_dist;
- v3d->lens = sms.new_lens;
+ if(ok == FALSE) {
+ ARegion *ar= CTX_wm_region(C);
+
+ if(sms.to_camera==0) {
+ copy_v3_v3(rv3d->ofs, sms.new_ofs);
+ copy_qt_qt(rv3d->viewquat, sms.new_quat);
+ rv3d->dist = sms.new_dist;
+ v3d->lens = sms.new_lens;
+ }
+
+ if(rv3d->viewlock & RV3D_BOXVIEW)
+ view3d_boxview_copy(CTX_wm_area(C), ar);
+
+ ED_region_tag_redraw(ar);
}
- ED_region_tag_redraw(CTX_wm_region(C));
}
/* only meant for timer usage */
-static int view3d_smoothview_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int view3d_smoothview_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
@@ -358,6 +364,9 @@ static int view3d_smoothview_invoke(bContext *C, wmOperator *op, wmEvent *event)
v3d->lens = sms->new_lens*step + sms->orig_lens*step_inv;
}
+ if(rv3d->viewlock & RV3D_BOXVIEW)
+ view3d_boxview_copy(CTX_wm_area(C), CTX_wm_region(C));
+
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, v3d);
return OPERATOR_FINISHED;
@@ -379,7 +388,7 @@ void VIEW3D_OT_smoothview(wmOperatorType *ot)
/* ****************** change view operators ****************** */
-static void setcameratoview3d(View3D *v3d, RegionView3D *rv3d, Object *ob)
+static void setcameratoview3d(RegionView3D *rv3d, Object *ob)
{
float dvec[3];
float mat3[3][3];
@@ -398,16 +407,18 @@ static void setcameratoview3d(View3D *v3d, RegionView3D *rv3d, Object *ob)
}
-static int view3d_setcameratoview_exec(bContext *C, wmOperator *op)
+static int view3d_setcameratoview_exec(bContext *C, wmOperator *UNUSED(op))
{
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
copy_qt_qt(rv3d->lviewquat, rv3d->viewquat);
rv3d->lview= rv3d->view;
- rv3d->lpersp= rv3d->persp;
+ if(rv3d->persp != RV3D_CAMOB) {
+ rv3d->lpersp= rv3d->persp;
+ }
- setcameratoview3d(v3d, rv3d, v3d->camera);
+ setcameratoview3d(rv3d, v3d->camera);
rv3d->persp = RV3D_CAMOB;
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, v3d->camera);
@@ -443,25 +454,36 @@ void VIEW3D_OT_setcameratoview(wmOperatorType *ot)
}
-static int view3d_setobjectascamera_exec(bContext *C, wmOperator *op)
+static int view3d_setobjectascamera_exec(bContext *C, wmOperator *UNUSED(op))
{
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
Scene *scene= CTX_data_scene(C);
-
- if(BASACT) {
+ Object *ob = CTX_data_active_object(C);
+
+ if(ob) {
+ Object *camera_old= (rv3d->persp == RV3D_CAMOB && scene->camera) ? scene->camera : NULL;
rv3d->persp= RV3D_CAMOB;
- v3d->camera= OBACT;
+ v3d->camera= ob;
if(v3d->scenelock)
- scene->camera= OBACT;
- smooth_view(C, NULL, v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, &v3d->lens);
+ scene->camera= ob;
+
+ if(camera_old != ob) /* unlikely but looks like a glitch when set to the same */
+ smooth_view(C, camera_old, v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, &v3d->lens);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS|NC_OBJECT|ND_DRAW, CTX_data_scene(C));
}
- WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS|NC_OBJECT|ND_DRAW, CTX_data_scene(C));
-
return OPERATOR_FINISHED;
}
+static int region3d_unlocked_poll(bContext *C)
+{
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
+ return (rv3d && rv3d->viewlock==0);
+}
+
+
void VIEW3D_OT_object_as_camera(wmOperatorType *ot)
{
@@ -472,7 +494,7 @@ void VIEW3D_OT_object_as_camera(wmOperatorType *ot)
/* api callbacks */
ot->exec= view3d_setobjectascamera_exec;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= region3d_unlocked_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1031,6 +1053,17 @@ int get_view3d_viewplane(View3D *v3d, RegionView3D *rv3d, int winxi, int winyi,
if(cam) {
float dx= 0.5*fac*rv3d->camdx*(x2-x1);
float dy= 0.5*fac*rv3d->camdy*(y2-y1);
+
+ /* shift offset */
+ if(cam->type==CAM_ORTHO) {
+ dx += cam->shiftx * cam->ortho_scale;
+ dy += cam->shifty * cam->ortho_scale;
+ }
+ else {
+ dx += cam->shiftx * (cam->clipsta / cam->lens) * 32.0;
+ dy += cam->shifty * (cam->clipsta / cam->lens) * 32.0;
+ }
+
x1+= dx;
x2+= dx;
y1+= dy;
@@ -1170,25 +1203,6 @@ static void view3d_viewlock(RegionView3D *rv3d)
}
}
-/* give a 4x4 matrix from a perspective view, only needs viewquat, ofs and dist
- * basically the same as...
- * rv3d->persp= RV3D_PERSP
- * setviewmatrixview3d(scene, v3d, rv3d);
- * setcameratoview3d(v3d, rv3d, v3d->camera);
- * ...but less of a hassle
- * */
-static void view3d_persp_mat4(RegionView3D *rv3d, float mat[][4])
-{
- float qt[4], dvec[3];
- copy_qt_qt(qt, rv3d->viewquat);
- qt[0]= -qt[0];
- quat_to_mat4(mat, qt);
- mat[3][2] -= rv3d->dist;
- translate_m4(mat, rv3d->ofs[0], rv3d->ofs[1], rv3d->ofs[2]);
- mul_v3_v3fl(dvec, mat[2], -rv3d->dist);
- sub_v3_v3v3(mat[3], dvec, rv3d->ofs);
-}
-
/* dont set windows active in in here, is used by renderwin too */
void setviewmatrixview3d(Scene *scene, View3D *v3d, RegionView3D *rv3d)
{
@@ -1223,6 +1237,11 @@ void setviewmatrixview3d(Scene *scene, View3D *v3d, RegionView3D *rv3d)
}
translate_m4( rv3d->viewmat,-vec[0], -vec[1], -vec[2]);
}
+ else if (v3d->ob_centre_cursor) {
+ float vec[3];
+ copy_v3_v3(vec, give_cursor(scene, v3d));
+ translate_m4(rv3d->viewmat, -vec[0], -vec[1], -vec[2]);
+ }
else translate_m4( rv3d->viewmat,rv3d->ofs[0], rv3d->ofs[1], rv3d->ofs[2]);
}
}
@@ -1508,7 +1527,6 @@ static void initlocalview(Main *bmain, Scene *scene, ScrArea *sa)
v3d->cursor[2]= -rv3d->ofs[2];
}
}
- if (v3d->near> 0.1) v3d->near= 0.1;
v3d->lay= locallay;
}
@@ -1595,7 +1613,7 @@ static void endlocalview(Scene *scene, ScrArea *sa)
}
}
-static int localview_exec(bContext *C, wmOperator *unused)
+static int localview_exec(bContext *C, wmOperator *UNUSED(unused))
{
View3D *v3d= CTX_wm_view3d(C);
@@ -1623,12 +1641,11 @@ void VIEW3D_OT_localview(wmOperatorType *ot)
ot->poll= ED_operator_view3d_active;
}
-#if GAMEBLENDER == 1
+#ifdef WITH_GAMEENGINE
static ListBase queue_back;
-static void SaveState(bContext *C)
+static void SaveState(bContext *C, wmWindow *win)
{
- wmWindow *win= CTX_wm_window(C);
Object *obact = CTX_data_active_object(C);
glPushAttrib(GL_ALL_ATTRIB_BITS);
@@ -1643,9 +1660,8 @@ static void SaveState(bContext *C)
//XXX waitcursor(1);
}
-static void RestoreState(bContext *C)
+static void RestoreState(bContext *C, wmWindow *win)
{
- wmWindow *win= CTX_wm_window(C);
Object *obact = CTX_data_active_object(C);
if(obact && obact->mode & OB_MODE_TEXTURE_PAINT)
@@ -1659,9 +1675,11 @@ static void RestoreState(bContext *C)
//XXX waitcursor(0);
//XXX G.qual= 0;
- win->queue= queue_back;
+ if(win) /* check because closing win can set to NULL */
+ win->queue= queue_back;
GPU_state_init();
+ GPU_set_tpage(NULL, 0);
glPopAttrib();
}
@@ -1714,7 +1732,7 @@ void game_set_commmandline_options(GameData *gm)
/* maybe we need this defined somewhere else */
extern void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *cam_frame, int always_use_expand_framing);
-#endif // GAMEBLENDER == 1
+#endif // WITH_GAMEENGINE
int game_engine_poll(bContext *C)
{
@@ -1738,7 +1756,6 @@ int ED_view3d_context_activate(bContext *C)
bScreen *sc= CTX_wm_screen(C);
ScrArea *sa= CTX_wm_area(C);
ARegion *ar;
- RegionView3D *rv3d;
/* sa can be NULL when called from python */
if(sa==NULL || sa->spacetype != SPACE_VIEW3D)
@@ -1759,14 +1776,13 @@ int ED_view3d_context_activate(bContext *C)
// bad context switch ..
CTX_wm_area_set(C, sa);
CTX_wm_region_set(C, ar);
- rv3d= ar->regiondata;
return 1;
}
static int game_engine_exec(bContext *C, wmOperator *op)
{
-#if GAMEBLENDER == 1
+#ifdef WITH_GAMEENGINE
Scene *startscene = CTX_data_scene(C);
ScrArea *sa, *prevsa= CTX_wm_area(C);
ARegion *ar, *prevar= CTX_wm_region(C);
@@ -1774,6 +1790,8 @@ static int game_engine_exec(bContext *C, wmOperator *op)
RegionView3D *rv3d;
rcti cam_frame;
+ (void)op; /* unused */
+
// bad context switch ..
if(!ED_view3d_context_activate(C))
return OPERATOR_CANCELLED;
@@ -1788,7 +1806,7 @@ static int game_engine_exec(bContext *C, wmOperator *op)
if(rv3d->persp==RV3D_CAMOB && startscene->gm.framing.type == SCE_GAMEFRAMING_BARS && startscene->gm.stereoflag != STEREO_DOME) { /* Letterbox */
rctf cam_framef;
- view3d_calc_camera_border(startscene, ar, rv3d, CTX_wm_view3d(C), &cam_framef);
+ view3d_calc_camera_border(startscene, ar, rv3d, CTX_wm_view3d(C), &cam_framef, FALSE);
cam_frame.xmin = cam_framef.xmin + ar->winrct.xmin;
cam_frame.xmax = cam_framef.xmax + ar->winrct.xmin;
cam_frame.ymin = cam_framef.ymin + ar->winrct.ymin;
@@ -1803,16 +1821,25 @@ static int game_engine_exec(bContext *C, wmOperator *op)
}
- SaveState(C);
+ SaveState(C, prevwin);
StartKetsjiShell(C, ar, &cam_frame, 1);
+
+ /* window wasnt closed while the BGE was running */
+ if(BLI_findindex(&CTX_wm_manager(C)->windows, prevwin) == -1) {
+ prevwin= NULL;
+ CTX_wm_window_set(C, NULL);
+ }
- /* restore context, in case it changed in the meantime, for
- example by working in another window or closing it */
- CTX_wm_region_set(C, prevar);
- CTX_wm_window_set(C, prevwin);
- CTX_wm_area_set(C, prevsa);
- RestoreState(C);
+ if(prevwin) {
+ /* restore context, in case it changed in the meantime, for
+ example by working in another window or closing it */
+ CTX_wm_region_set(C, prevar);
+ CTX_wm_window_set(C, prevwin);
+ CTX_wm_area_set(C, prevsa);
+ }
+
+ RestoreState(C, prevwin);
//XXX restore_all_scene_cfra(scene_cfra_store);
set_scene_bg(CTX_data_main(C), startscene);
@@ -1822,6 +1849,7 @@ static int game_engine_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
#else
+ (void)C; /* unused */
BKE_report(op->reports, RPT_ERROR, "Game engine is disabled in this build.");
return OPERATOR_CANCELLED;
#endif
@@ -1841,852 +1869,6 @@ void VIEW3D_OT_game_start(wmOperatorType *ot)
ot->poll= game_engine_poll;
}
-
-/* NOTE: these defines are saved in keymap files, do not change values but just add new ones */
-#define FLY_MODAL_CANCEL 1
-#define FLY_MODAL_CONFIRM 2
-#define FLY_MODAL_ACCELERATE 3
-#define FLY_MODAL_DECELERATE 4
-#define FLY_MODAL_PAN_ENABLE 5
-#define FLY_MODAL_PAN_DISABLE 6
-#define FLY_MODAL_DIR_FORWARD 7
-#define FLY_MODAL_DIR_BACKWARD 8
-#define FLY_MODAL_DIR_LEFT 9
-#define FLY_MODAL_DIR_RIGHT 10
-#define FLY_MODAL_DIR_UP 11
-#define FLY_MODAL_DIR_DOWN 12
-#define FLY_MODAL_AXIS_LOCK_X 13
-#define FLY_MODAL_AXIS_LOCK_Z 14
-#define FLY_MODAL_PRECISION_ENABLE 15
-#define FLY_MODAL_PRECISION_DISABLE 16
-
-/* called in transform_ops.c, on each regeneration of keymaps */
-void fly_modal_keymap(wmKeyConfig *keyconf)
-{
- static EnumPropertyItem modal_items[] = {
- {FLY_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""},
- {FLY_MODAL_CONFIRM, "CONFIRM", 0, "Confirm", ""},
- {FLY_MODAL_ACCELERATE, "ACCELERATE", 0, "Accelerate", ""},
- {FLY_MODAL_DECELERATE, "DECELERATE", 0, "Decelerate", ""},
-
- {FLY_MODAL_PAN_ENABLE, "PAN_ENABLE", 0, "Pan Enable", ""},
- {FLY_MODAL_PAN_DISABLE, "PAN_DISABLE", 0, "Pan Disable", ""},
-
- {FLY_MODAL_DIR_FORWARD, "FORWARD", 0, "Fly Forward", ""},
- {FLY_MODAL_DIR_BACKWARD,"BACKWARD", 0, "Fly Backward", ""},
- {FLY_MODAL_DIR_LEFT, "LEFT", 0, "Fly Left", ""},
- {FLY_MODAL_DIR_RIGHT, "RIGHT", 0, "Fly Right", ""},
- {FLY_MODAL_DIR_UP, "UP", 0, "Fly Up", ""},
- {FLY_MODAL_DIR_DOWN, "DOWN", 0, "Fly Down", ""},
-
- {FLY_MODAL_AXIS_LOCK_X, "AXIS_LOCK_X", 0, "X Axis Correction", "X axis correction (toggle)"},
- {FLY_MODAL_AXIS_LOCK_Z, "AXIS_LOCK_Z", 0, "X Axis Correction", "Z axis correction (toggle)"},
-
- {FLY_MODAL_PRECISION_ENABLE, "PRECISION_ENABLE", 0, "Precision Enable", ""},
- {FLY_MODAL_PRECISION_DISABLE, "PRECISION_DISABLE", 0, "Precision Disable", ""},
-
- {0, NULL, 0, NULL, NULL}};
-
- wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "View3D Fly Modal");
-
- /* this function is called for each spacetype, only needs to add map once */
- if(keymap) return;
-
- keymap= WM_modalkeymap_add(keyconf, "View3D Fly Modal", modal_items);
-
- /* items for modal map */
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_ANY, KM_ANY, 0, FLY_MODAL_CANCEL);
-
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_ANY, KM_ANY, 0, FLY_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, SPACEKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM);
-
- WM_modalkeymap_add_item(keymap, PADPLUSKEY, KM_PRESS, 0, 0, FLY_MODAL_ACCELERATE);
- WM_modalkeymap_add_item(keymap, PADMINUS, KM_PRESS, 0, 0, FLY_MODAL_DECELERATE);
- WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, 0, 0, FLY_MODAL_ACCELERATE);
- WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, 0, 0, FLY_MODAL_DECELERATE);
-
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_PRESS, KM_ANY, 0, FLY_MODAL_PAN_ENABLE);
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, KM_ANY, 0, FLY_MODAL_PAN_DISABLE); /* XXX - Bug in the event system, middle mouse release doesnt work */
-
- /* WASD */
- WM_modalkeymap_add_item(keymap, WKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_FORWARD);
- WM_modalkeymap_add_item(keymap, SKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_BACKWARD);
- WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_LEFT);
- WM_modalkeymap_add_item(keymap, DKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_RIGHT);
- WM_modalkeymap_add_item(keymap, RKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_UP);
- WM_modalkeymap_add_item(keymap, FKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_DOWN);
-
- WM_modalkeymap_add_item(keymap, XKEY, KM_PRESS, 0, 0, FLY_MODAL_AXIS_LOCK_X);
- WM_modalkeymap_add_item(keymap, ZKEY, KM_PRESS, 0, 0, FLY_MODAL_AXIS_LOCK_Z);
-
- WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_PRECISION_ENABLE);
- WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_RELEASE, KM_ANY, 0, FLY_MODAL_PRECISION_DISABLE);
-
- /* assign map to operators */
- WM_modalkeymap_assign(keymap, "VIEW3D_OT_fly");
-
-}
-
-typedef struct FlyInfo {
- /* context stuff */
- RegionView3D *rv3d;
- View3D *v3d;
- ARegion *ar;
- Scene *scene;
-
- wmTimer *timer; /* needed for redraws */
-
- short state;
- short use_precision;
- short redraw;
- short mval[2];
-
- /* fly state state */
- float speed; /* the speed the view is moving per redraw */
- short axis; /* Axis index to move allong by default Z to move allong the view */
- short pan_view; /* when true, pan the view instead of rotating */
-
- /* relative view axis locking - xlock, zlock
- 0; disabled
- 1; enabled but not checking because mouse hasnt moved outside the margin since locking was checked an not needed
- when the mouse moves, locking is set to 2 so checks are done.
- 2; mouse moved and checking needed, if no view altering is donem its changed back to 1 */
- short xlock, zlock;
- float xlock_momentum, zlock_momentum; /* nicer dynamics */
- float grid; /* world scale 1.0 default */
-
- /* root most parent */
- Object *root_parent;
-
- /* backup values */
- float dist_backup; /* backup the views distance since we use a zero dist for fly mode */
- float ofs_backup[3]; /* backup the views offset incase the user cancels flying in non camera mode */
- float rot_backup[4]; /* backup the views quat incase the user cancels flying in non camera mode. (quat for view, eul for camera) */
- short persp_backup; /* remember if were ortho or not, only used for restoring the view if it was a ortho view */
-
- void *obtfm; /* backup the objects transform */
-
- /* compare between last state */
- double time_lastwheel; /* used to accelerate when using the mousewheel a lot */
- double time_lastdraw; /* time between draws */
-
- /* use for some lag */
- float dvec_prev[3]; /* old for some lag */
-
-} FlyInfo;
-
-/* FlyInfo->state */
-#define FLY_RUNNING 0
-#define FLY_CANCEL 1
-#define FLY_CONFIRM 2
-
-static int initFlyInfo (bContext *C, FlyInfo *fly, wmOperator *op, wmEvent *event)
-{
- float upvec[3]; // tmp
- float mat[3][3];
-
- fly->rv3d= CTX_wm_region_view3d(C);
- fly->v3d = CTX_wm_view3d(C);
- fly->ar = CTX_wm_region(C);
- fly->scene= CTX_data_scene(C);
-
- if(fly->rv3d->persp==RV3D_CAMOB && fly->v3d->camera->id.lib) {
- BKE_report(op->reports, RPT_ERROR, "Cannot fly a camera from an external library");
- return FALSE;
- }
-
- if(fly->v3d->ob_centre) {
- BKE_report(op->reports, RPT_ERROR, "Cannot fly when the view is locked to an object");
- return FALSE;
- }
-
- if(fly->rv3d->persp==RV3D_CAMOB && fly->v3d->camera->constraints.first) {
- BKE_report(op->reports, RPT_ERROR, "Cannot fly an object with constraints");
- return FALSE;
- }
-
- fly->state= FLY_RUNNING;
- fly->speed= 0.0f;
- fly->axis= 2;
- fly->pan_view= FALSE;
- fly->xlock= FALSE;
- fly->zlock= FALSE;
- fly->xlock_momentum=0.0f;
- fly->zlock_momentum=0.0f;
- fly->grid= 1.0f;
- fly->use_precision= 0;
-
- fly->dvec_prev[0]= fly->dvec_prev[1]= fly->dvec_prev[2]= 0.0f;
-
- fly->timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f);
-
- fly->mval[0] = event->x - fly->ar->winrct.xmin;
- fly->mval[1] = event->y - fly->ar->winrct.ymin;
-
-
- fly->time_lastdraw= fly->time_lastwheel= PIL_check_seconds_timer();
-
- fly->rv3d->rflag |= RV3D_FLYMODE|RV3D_NAVIGATING; /* so we draw the corner margins */
-
- /* detect weather to start with Z locking */
- upvec[0]=1.0f; upvec[1]=0.0f; upvec[2]=0.0f;
- copy_m3_m4(mat, fly->rv3d->viewinv);
- mul_m3_v3(mat, upvec);
- if (fabs(upvec[2]) < 0.1)
- fly->zlock = 1;
- upvec[0]=0; upvec[1]=0; upvec[2]=0;
-
- fly->persp_backup= fly->rv3d->persp;
- fly->dist_backup= fly->rv3d->dist;
- if (fly->rv3d->persp==RV3D_CAMOB) {
- Object *ob_back;
- if((fly->root_parent=fly->v3d->camera->parent)) {
- while(fly->root_parent->parent)
- fly->root_parent= fly->root_parent->parent;
- ob_back= fly->root_parent;
- }
- else {
- ob_back= fly->v3d->camera;
- }
-
- /* store the original camera loc and rot */
- /* TODO. axis angle etc */
-
- fly->obtfm= object_tfm_backup(ob_back);
-
- where_is_object(fly->scene, fly->v3d->camera);
- negate_v3_v3(fly->rv3d->ofs, fly->v3d->camera->obmat[3]);
-
- fly->rv3d->dist=0.0;
- } else {
- /* perspective or ortho */
- if (fly->rv3d->persp==RV3D_ORTHO)
- fly->rv3d->persp= RV3D_PERSP; /*if ortho projection, make perspective */
- copy_qt_qt(fly->rot_backup, fly->rv3d->viewquat);
- copy_v3_v3(fly->ofs_backup, fly->rv3d->ofs);
- fly->rv3d->dist= 0.0f;
-
- upvec[2]= fly->dist_backup; /*x and y are 0*/
- mul_m3_v3(mat, upvec);
- sub_v3_v3(fly->rv3d->ofs, upvec);
- /*Done with correcting for the dist*/
- }
-
-
- /* center the mouse, probably the UI mafia are against this but without its quite annoying */
- WM_cursor_warp(CTX_wm_window(C), fly->ar->winrct.xmin + fly->ar->winx/2, fly->ar->winrct.ymin + fly->ar->winy/2);
-
- return 1;
-}
-
-static int flyEnd(bContext *C, FlyInfo *fly)
-{
- RegionView3D *rv3d= fly->rv3d;
- View3D *v3d = fly->v3d;
-
- float upvec[3];
-
- if(fly->state == FLY_RUNNING)
- return OPERATOR_RUNNING_MODAL;
-
- WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), fly->timer);
-
- rv3d->dist= fly->dist_backup;
-
- if (fly->state == FLY_CANCEL) {
- /* Revert to original view? */
- if (fly->persp_backup==RV3D_CAMOB) { /* a camera view */
- Object *ob_back;
- if(fly->root_parent)ob_back= fly->root_parent;
- else ob_back= fly->v3d->camera;
-
- /* store the original camera loc and rot */
- object_tfm_restore(ob_back, fly->obtfm);
-
- DAG_id_flush_update(&ob_back->id, OB_RECALC_OB);
- } else {
- /* Non Camera we need to reset the view back to the original location bacause the user canceled*/
- copy_qt_qt(rv3d->viewquat, fly->rot_backup);
- copy_v3_v3(rv3d->ofs, fly->ofs_backup);
- rv3d->persp= fly->persp_backup;
- }
- }
- else if (fly->persp_backup==RV3D_CAMOB) { /* camera */
- float mat3[3][3];
- if(fly->root_parent) {
- DAG_id_flush_update(&fly->root_parent->id, OB_RECALC_OB);
- }
- else {
- copy_m3_m4(mat3, v3d->camera->obmat);
- object_mat3_to_rot(v3d->camera, mat3, TRUE);
- DAG_id_flush_update(&v3d->camera->id, OB_RECALC_OB);
- }
-
-#if 0 //XXX2.5
- if (IS_AUTOKEY_MODE(NORMAL)) {
- allqueue(REDRAWIPO, 0);
- allspace(REMAKEIPO, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWTIME, 0);
- }
-#endif
- }
- else { /* not camera */
- /* Apply the fly mode view */
- /*restore the dist*/
- float mat[3][3];
- upvec[0]= upvec[1]= 0;
- upvec[2]= fly->dist_backup; /*x and y are 0*/
- copy_m3_m4(mat, rv3d->viewinv);
- mul_m3_v3(mat, upvec);
- add_v3_v3(rv3d->ofs, upvec);
- /*Done with correcting for the dist */
- }
-
- rv3d->rflag &= ~(RV3D_FLYMODE|RV3D_NAVIGATING);
-//XXX2.5 BIF_view3d_previewrender_signal(fly->sa, PR_DBASE|PR_DISPRECT); /* not working at the moment not sure why */
-
- if(fly->obtfm)
- MEM_freeN(fly->obtfm);
-
- if(fly->state == FLY_CONFIRM) {
- MEM_freeN(fly);
- return OPERATOR_FINISHED;
- }
-
- MEM_freeN(fly);
- return OPERATOR_CANCELLED;
-}
-
-static void flyEvent(FlyInfo *fly, wmEvent *event)
-{
- if (event->type == TIMER && event->customdata == fly->timer) {
- fly->redraw = 1;
- }
- else if (event->type == MOUSEMOVE) {
- fly->mval[0] = event->x - fly->ar->winrct.xmin;
- fly->mval[1] = event->y - fly->ar->winrct.ymin;
- } /* handle modal keymap first */
- else if (event->type == EVT_MODAL_MAP) {
- switch (event->val) {
- case FLY_MODAL_CANCEL:
- fly->state = FLY_CANCEL;
- break;
- case FLY_MODAL_CONFIRM:
- fly->state = FLY_CONFIRM;
- break;
-
- case FLY_MODAL_ACCELERATE:
- {
- double time_currwheel;
- float time_wheel;
-
- time_currwheel= PIL_check_seconds_timer();
- time_wheel = (float)(time_currwheel - fly->time_lastwheel);
- fly->time_lastwheel = time_currwheel;
- /*printf("Wheel %f\n", time_wheel);*/
- /*Mouse wheel delays range from 0.5==slow to 0.01==fast*/
- time_wheel = 1+ (10 - (20*MIN2(time_wheel, 0.5))); /* 0-0.5 -> 0-5.0 */
-
- if (fly->speed<0.0f) fly->speed= 0.0f;
- else {
- if (event->shift)
- fly->speed+= fly->grid*time_wheel*0.1;
- else
- fly->speed+= fly->grid*time_wheel;
- }
- break;
- }
- case FLY_MODAL_DECELERATE:
- {
- double time_currwheel;
- float time_wheel;
-
- time_currwheel= PIL_check_seconds_timer();
- time_wheel = (float)(time_currwheel - fly->time_lastwheel);
- fly->time_lastwheel = time_currwheel;
- time_wheel = 1+ (10 - (20*MIN2(time_wheel, 0.5))); /* 0-0.5 -> 0-5.0 */
-
- if (fly->speed>0) fly->speed=0;
- else {
- if (event->shift)
- fly->speed-= fly->grid*time_wheel*0.1;
- else
- fly->speed-= fly->grid*time_wheel;
- }
- break;
- }
- case FLY_MODAL_PAN_ENABLE:
- fly->pan_view= TRUE;
- break;
- case FLY_MODAL_PAN_DISABLE:
-//XXX2.5 warp_pointer(cent_orig[0], cent_orig[1]);
- fly->pan_view= FALSE;
- break;
-
- /* impliment WASD keys */
- case FLY_MODAL_DIR_FORWARD:
- if (fly->speed < 0.0f) fly->speed= -fly->speed; /* flip speed rather then stopping, game like motion */
- else fly->speed += fly->grid; /* increse like mousewheel if were already moving in that difection*/
- fly->axis= 2;
- break;
- case FLY_MODAL_DIR_BACKWARD:
- if (fly->speed>0) fly->speed= -fly->speed;
- else fly->speed -= fly->grid;
- fly->axis= 2;
- break;
- case FLY_MODAL_DIR_LEFT:
- if (fly->speed < 0.0f) fly->speed= -fly->speed;
- fly->axis= 0;
- break;
- case FLY_MODAL_DIR_RIGHT:
- if (fly->speed > 0.0f) fly->speed= -fly->speed;
- fly->axis= 0;
- break;
-
- case FLY_MODAL_DIR_UP:
- if (fly->speed > 0.0f) fly->speed= -fly->speed;
- fly->axis= 1;
- break;
-
- case FLY_MODAL_DIR_DOWN:
- if (fly->speed < 0.0f) fly->speed= -fly->speed;
- fly->axis= 1;
- break;
-
- case FLY_MODAL_AXIS_LOCK_X:
- if (fly->xlock) fly->xlock=0;
- else {
- fly->xlock = 2;
- fly->xlock_momentum = 0.0;
- }
- break;
- case FLY_MODAL_AXIS_LOCK_Z:
- if (fly->zlock) fly->zlock=0;
- else {
- fly->zlock = 2;
- fly->zlock_momentum = 0.0;
- }
- break;
-
- case FLY_MODAL_PRECISION_ENABLE:
- fly->use_precision= TRUE;
- break;
- case FLY_MODAL_PRECISION_DISABLE:
- fly->use_precision= FALSE;
- break;
-
- }
- }
-}
-
-static int flyApply(bContext *C, FlyInfo *fly)
-{
-
-#define FLY_ROTATE_FAC 2.5f /* more is faster */
-#define FLY_ZUP_CORRECT_FAC 0.1f /* ammount to correct per step */
-#define FLY_ZUP_CORRECT_ACCEL 0.05f /* increase upright momentum each step */
-
- /*
- fly mode - Shift+F
- a fly loop where the user can move move the view as if they are flying
- */
- RegionView3D *rv3d= fly->rv3d;
- View3D *v3d = fly->v3d;
- ARegion *ar = fly->ar;
- Scene *scene= fly->scene;
-
- float prev_view_mat[4][4];
-
- float mat[3][3], /* 3x3 copy of the view matrix so we can move allong the view axis */
- dvec[3]={0,0,0}, /* this is the direction thast added to the view offset per redraw */
-
- /* Camera Uprighting variables */
- upvec[3]={0,0,0}, /* stores the view's up vector */
-
- moffset[2], /* mouse offset from the views center */
- tmp_quat[4]; /* used for rotating the view */
-
- int cent_orig[2], /* view center */
-//XXX- can avoid using // cent[2], /* view center modified */
- xmargin, ymargin; /* x and y margin are define the safe area where the mouses movement wont rotate the view */
- unsigned char
- apply_rotation= 1; /* if the user presses shift they can look about without movinf the direction there looking*/
-
- if(fly->root_parent)
- view3d_persp_mat4(rv3d, prev_view_mat);
-
- /* the dist defines a vector that is infront of the offset
- to rotate the view about.
- this is no good for fly mode because we
- want to rotate about the viewers center.
- but to correct the dist removal we must
- alter offset so the view doesn't jump. */
-
- xmargin= ar->winx/20.0f;
- ymargin= ar->winy/20.0f;
-
- cent_orig[0]= ar->winrct.xmin + ar->winx/2;
- cent_orig[1]= ar->winrct.ymin + ar->winy/2;
-
- {
-
- /* mouse offset from the center */
- moffset[0]= fly->mval[0]- ar->winx/2;
- moffset[1]= fly->mval[1]- ar->winy/2;
-
- /* enforce a view margin */
- if (moffset[0]>xmargin) moffset[0]-=xmargin;
- else if (moffset[0] < -xmargin) moffset[0]+=xmargin;
- else moffset[0]=0;
-
- if (moffset[1]>ymargin) moffset[1]-=ymargin;
- else if (moffset[1] < -ymargin) moffset[1]+=ymargin;
- else moffset[1]=0;
-
-
- /* scale the mouse movement by this value - scales mouse movement to the view size
- * moffset[0]/(ar->winx-xmargin*2) - window size minus margin (same for y)
- *
- * the mouse moves isnt linear */
-
- if(moffset[0]) {
- moffset[0] /= ar->winx - (xmargin*2);
- moffset[0] *= fabs(moffset[0]);
- }
-
- if(moffset[1]) {
- moffset[1] /= ar->winy - (ymargin*2);
- moffset[1] *= fabs(moffset[1]);
- }
-
- /* Should we redraw? */
- if(fly->speed != 0.0f || moffset[0] || moffset[1] || fly->zlock || fly->xlock || dvec[0] || dvec[1] || dvec[2] ) {
- float dvec_tmp[3];
- double time_current, time_redraw; /*time how fast it takes for us to redraw, this is so simple scenes dont fly too fast */
- float time_redraw_clamped;
-
- time_current= PIL_check_seconds_timer();
- time_redraw= (float)(time_current - fly->time_lastdraw);
- time_redraw_clamped= MIN2(0.05f, time_redraw); /* clamt the redraw time to avoid jitter in roll correction */
- fly->time_lastdraw= time_current;
- /*fprintf(stderr, "%f\n", time_redraw);*/ /* 0.002 is a small redraw 0.02 is larger */
-
- /* Scale the time to use shift to scale the speed down- just like
- shift slows many other areas of blender down */
- if (fly->use_precision)
- fly->speed= fly->speed * (1.0f-time_redraw_clamped);
-
- copy_m3_m4(mat, rv3d->viewinv);
-
- if (fly->pan_view==TRUE) {
- /* pan only */
- dvec_tmp[0]= -moffset[0];
- dvec_tmp[1]= -moffset[1];
- dvec_tmp[2]= 0;
-
- if (fly->use_precision) {
- dvec_tmp[0] *= 0.1;
- dvec_tmp[1] *= 0.1;
- }
-
- mul_m3_v3(mat, dvec_tmp);
- mul_v3_fl(dvec_tmp, time_redraw*200.0 * fly->grid);
-
- } else {
- float roll; /* similar to the angle between the camera's up and the Z-up, but its very rough so just roll*/
-
- /* rotate about the X axis- look up/down */
- if (moffset[1]) {
- upvec[0]=1;
- upvec[1]=0;
- upvec[2]=0;
- mul_m3_v3(mat, upvec);
- axis_angle_to_quat( tmp_quat, upvec, (float)moffset[1] * time_redraw * -FLY_ROTATE_FAC); /* Rotate about the relative up vec */
- mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
-
- if (fly->xlock) fly->xlock = 2; /*check for rotation*/
- if (fly->zlock) fly->zlock = 2;
- fly->xlock_momentum= 0.0f;
- }
-
- /* rotate about the Y axis- look left/right */
- if (moffset[0]) {
-
- /* if we're upside down invert the moffset */
- upvec[0]=0;
- upvec[1]=1;
- upvec[2]=0;
- mul_m3_v3(mat, upvec);
-
- if(upvec[2] < 0.0f)
- moffset[0]= -moffset[0];
-
- /* make the lock vectors */
- if (fly->zlock) {
- upvec[0]=0;
- upvec[1]=0;
- upvec[2]=1;
- } else {
- upvec[0]=0;
- upvec[1]=1;
- upvec[2]=0;
- mul_m3_v3(mat, upvec);
- }
-
- axis_angle_to_quat( tmp_quat, upvec, (float)moffset[0] * time_redraw * FLY_ROTATE_FAC); /* Rotate about the relative up vec */
- mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
-
- if (fly->xlock) fly->xlock = 2;/*check for rotation*/
- if (fly->zlock) fly->zlock = 2;
- }
-
- if (fly->zlock==2) {
- upvec[0]=1;
- upvec[1]=0;
- upvec[2]=0;
- mul_m3_v3(mat, upvec);
-
- /*make sure we have some z rolling*/
- if (fabs(upvec[2]) > 0.00001f) {
- roll= upvec[2]*5;
- upvec[0]=0; /*rotate the view about this axis*/
- upvec[1]=0;
- upvec[2]=1;
-
- mul_m3_v3(mat, upvec);
- axis_angle_to_quat( tmp_quat, upvec, roll*time_redraw_clamped*fly->zlock_momentum * FLY_ZUP_CORRECT_FAC); /* Rotate about the relative up vec */
- mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
-
- fly->zlock_momentum += FLY_ZUP_CORRECT_ACCEL;
- } else {
- fly->zlock=1; /* dont check until the view rotates again */
- fly->zlock_momentum= 0.0f;
- }
- }
-
- if (fly->xlock==2 && moffset[1]==0) { /*only apply xcorrect when mouse isnt applying x rot*/
- upvec[0]=0;
- upvec[1]=0;
- upvec[2]=1;
- mul_m3_v3(mat, upvec);
- /*make sure we have some z rolling*/
- if (fabs(upvec[2]) > 0.00001) {
- roll= upvec[2] * -5;
-
- upvec[0]= 1.0f; /*rotate the view about this axis*/
- upvec[1]= 0.0f;
- upvec[2]= 0.0f;
-
- mul_m3_v3(mat, upvec);
-
- axis_angle_to_quat( tmp_quat, upvec, roll*time_redraw_clamped*fly->xlock_momentum*0.1f); /* Rotate about the relative up vec */
- mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
-
- fly->xlock_momentum += 0.05f;
- } else {
- fly->xlock=1; /* see above */
- fly->xlock_momentum= 0.0f;
- }
- }
-
-
- if (apply_rotation) {
- /* Normal operation */
- /* define dvec, view direction vector */
- dvec_tmp[0]= dvec_tmp[1]= dvec_tmp[2]= 0.0f;
- /* move along the current axis */
- dvec_tmp[fly->axis]= 1.0f;
-
- mul_m3_v3(mat, dvec_tmp);
-
- mul_v3_fl(dvec_tmp, fly->speed * time_redraw * 0.25f);
- }
- }
-
- /* impose a directional lag */
- interp_v3_v3v3(dvec, dvec_tmp, fly->dvec_prev, (1.0f/(1.0f+(time_redraw*5.0f))));
-
- if (rv3d->persp==RV3D_CAMOB) {
- Object *lock_ob= fly->root_parent ? fly->root_parent : fly->v3d->camera;
- if (lock_ob->protectflag & OB_LOCK_LOCX) dvec[0] = 0.0;
- if (lock_ob->protectflag & OB_LOCK_LOCY) dvec[1] = 0.0;
- if (lock_ob->protectflag & OB_LOCK_LOCZ) dvec[2] = 0.0;
- }
-
- add_v3_v3(rv3d->ofs, dvec);
-
- /* todo, dynamic keys */
-#if 0
- if (fly->zlock && fly->xlock)
- ED_area_headerprint(fly->ar, "FlyKeys Speed:(+/- | Wheel), Upright Axis:X on/Z on, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
- else if (fly->zlock)
- ED_area_headerprint(fly->ar, "FlyKeys Speed:(+/- | Wheel), Upright Axis:X off/Z on, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
- else if (fly->xlock)
- ED_area_headerprint(fly->ar, "FlyKeys Speed:(+/- | Wheel), Upright Axis:X on/Z off, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
- else
- ED_area_headerprint(fly->ar, "FlyKeys Speed:(+/- | Wheel), Upright Axis:X off/Z off, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
-#endif
-
- /* we are in camera view so apply the view ofs and quat to the view matrix and set the camera to the view */
- if (rv3d->persp==RV3D_CAMOB) {
- ID *id_key;
- /* transform the parent or the camera? */
- if(fly->root_parent) {
- Object *ob_update;
-
- float view_mat[4][4];
- float prev_view_imat[4][4];
- float diff_mat[4][4];
- float parent_mat[4][4];
-
- invert_m4_m4(prev_view_imat, prev_view_mat);
- view3d_persp_mat4(rv3d, view_mat);
- mul_m4_m4m4(diff_mat, prev_view_imat, view_mat);
- mul_m4_m4m4(parent_mat, fly->root_parent->obmat, diff_mat);
- object_apply_mat4(fly->root_parent, parent_mat);
-
- // where_is_object(scene, fly->root_parent);
-
- ob_update= v3d->camera->parent;
- while(ob_update) {
- DAG_id_flush_update(&ob_update->id, OB_RECALC_OB);
- ob_update= ob_update->parent;
- }
-
- copy_m4_m4(prev_view_mat, view_mat);
-
- id_key= &fly->root_parent->id;
-
- }
- else {
- float view_mat[4][4];
- view3d_persp_mat4(rv3d, view_mat);
- object_apply_mat4(v3d->camera, view_mat);
- id_key= &v3d->camera->id;
- }
-
- /* record the motion */
- if (autokeyframe_cfra_can_key(scene, id_key)) {
- ListBase dsources = {NULL, NULL};
-
- /* add datasource override for the camera object */
- ANIM_relative_keyingset_add_source(&dsources, id_key, NULL, NULL);
-
- /* insert keyframes
- * 1) on the first frame
- * 2) on each subsequent frame
- * TODO: need to check in future that frame changed before doing this
- */
- if (fly->xlock || fly->zlock || moffset[0] || moffset[1]) {
- KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Rotation");
- ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
- }
- if (fly->speed) {
- KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Location");
- ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
- }
-
- /* free temp data */
- BLI_freelistN(&dsources);
- }
- }
- } else
- /*were not redrawing but we need to update the time else the view will jump */
- fly->time_lastdraw= PIL_check_seconds_timer();
- /* end drawing */
- copy_v3_v3(fly->dvec_prev, dvec);
- }
-
-/* moved to flyEnd() */
-
- return OPERATOR_FINISHED;
-}
-
-
-
-static int fly_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- RegionView3D *rv3d= CTX_wm_region_view3d(C);
- FlyInfo *fly;
-
- if(rv3d->viewlock)
- return OPERATOR_CANCELLED;
-
- fly= MEM_callocN(sizeof(FlyInfo), "FlyOperation");
-
- op->customdata= fly;
-
- if(initFlyInfo(C, fly, op, event)==FALSE) {
- MEM_freeN(op->customdata);
- return OPERATOR_CANCELLED;
- }
-
- flyEvent(fly, event);
-
- WM_event_add_modal_handler(C, op);
-
- return OPERATOR_RUNNING_MODAL;
-}
-
-static int fly_cancel(bContext *C, wmOperator *op)
-{
- FlyInfo *fly = op->customdata;
-
- fly->state = FLY_CANCEL;
- flyEnd(C, fly);
- op->customdata= NULL;
-
- return OPERATOR_CANCELLED;
-}
-
-static int fly_modal(bContext *C, wmOperator *op, wmEvent *event)
-{
- int exit_code;
-
- FlyInfo *fly = op->customdata;
-
- fly->redraw= 0;
-
- flyEvent(fly, event);
-
- if(event->type==TIMER && event->customdata == fly->timer)
- flyApply(C, fly);
-
- if(fly->redraw) {
- ED_region_tag_redraw(CTX_wm_region(C));
- }
-
- exit_code = flyEnd(C, fly);
-
- if(exit_code!=OPERATOR_RUNNING_MODAL)
- ED_region_tag_redraw(CTX_wm_region(C));
-
- return exit_code;
-}
-
-void VIEW3D_OT_fly(wmOperatorType *ot)
-{
-
- /* identifiers */
- ot->name= "Fly Navigation";
- ot->description= "Interactively fly around the scene";
- ot->idname= "VIEW3D_OT_fly";
-
- /* api callbacks */
- ot->invoke= fly_invoke;
- ot->cancel= fly_cancel;
- ot->modal= fly_modal;
- ot->poll= ED_operator_view3d_active;
-
- /* flags */
- ot->flag= OPTYPE_BLOCKING;
-
-}
-
/* ************************************** */
void view3d_align_axis_to_vector(View3D *v3d, RegionView3D *rv3d, int axisidx, float vec[3])
@@ -2726,3 +1908,12 @@ int view3d_is_ortho(View3D *v3d, RegionView3D *rv3d)
{
return (rv3d->persp == RV3D_ORTHO || (v3d->camera && ((Camera *)v3d->camera->data)->type == CAM_ORTHO));
}
+
+float view3d_pixel_size(struct RegionView3D *rv3d, const float co[3])
+{
+ return (rv3d->persmat[3][3] + (
+ rv3d->persmat[0][3]*co[0] +
+ rv3d->persmat[1][3]*co[1] +
+ rv3d->persmat[2][3]*co[2])
+ ) * rv3d->pixsize;
+}
diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt
index e28ed89c80c..c68b758527b 100644
--- a/source/blender/editors/transform/CMakeLists.txt
+++ b/source/blender/editors/transform/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -31,4 +29,19 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_transform "${SRC}" "${INC}")
+set(SRC
+ transform.c
+ transform_constraints.c
+ transform_conversions.c
+ transform_generics.c
+ transform_input.c
+ transform_manipulator.c
+ transform_ndofinput.c
+ transform_ops.c
+ transform_orientations.c
+ transform_snap.c
+
+ transform.h
+)
+
+blender_add_lib(bf_editor_transform "${SRC}" "${INC}")
diff --git a/source/blender/editors/transform/Makefile b/source/blender/editors/transform/Makefile
deleted file mode 100644
index 9d23b763cd6..00000000000
--- a/source/blender/editors/transform/Makefile
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_transform
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 0acbe608f41..394dd433060 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -89,11 +89,11 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_editVert.h"
#include "BLI_ghash.h"
#include "BLI_linklist.h"
-
#include "UI_resources.h"
//#include "blendef.h"
@@ -103,6 +103,7 @@
#include "transform.h"
void drawTransformApply(const struct bContext *C, struct ARegion *ar, void *arg);
+int doEdgeSlide(TransInfo *t, float perc);
/* ************************** SPACE DEPENDANT CODE **************************** */
@@ -337,7 +338,7 @@ static void viewRedrawForce(const bContext *C, TransInfo *t)
}
}
-static void viewRedrawPost(TransInfo *t)
+static void viewRedrawPost(bContext *C, TransInfo *t)
{
ED_area_headerprint(t->sa, NULL);
@@ -345,6 +346,10 @@ static void viewRedrawPost(TransInfo *t)
/* if autokeying is enabled, send notifiers that keyframes were added */
if (IS_AUTOKEY_ON(t->scene))
WM_main_add_notifier(NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
+
+ /* XXX temp, first hack to get auto-render in compositor work (ton) */
+ WM_event_add_notifier(C, NC_SCENE|ND_TRANSFORM_DONE, CTX_data_scene(C));
+
}
#if 0 // TRANSFORM_FIX_ME
@@ -384,7 +389,7 @@ void BIF_selectOrientation() {
#endif
}
-static void view_editmove(unsigned short event)
+static void view_editmove(unsigned short UNUSED(event))
{
#if 0 // TRANSFORM_FIX_ME
int refresh = 0;
@@ -481,6 +486,8 @@ static void view_editmove(unsigned short event)
* */
#define TFM_MODAL_PROPSIZE_UP 20
#define TFM_MODAL_PROPSIZE_DOWN 21
+#define TFM_MODAL_AUTOIK_LEN_INC 22
+#define TFM_MODAL_AUTOIK_LEN_DEC 23
/* called in transform_ops.c, on each regeneration of keymaps */
wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf)
@@ -507,6 +514,8 @@ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf)
{NUM_MODAL_INCREMENT_DOWN, "INCREMENT_DOWN", 0, "Numinput Increment Down", ""},
{TFM_MODAL_PROPSIZE_UP, "PROPORTIONAL_SIZE_UP", 0, "Increase Proportional Influence", ""},
{TFM_MODAL_PROPSIZE_DOWN, "PROPORTIONAL_SIZE_DOWN", 0, "Decrease Poportional Influence", ""},
+ {TFM_MODAL_AUTOIK_LEN_INC, "AUTOIK_CHAIN_LEN_UP", 0, "Increase Max AutoIK Chain Length", ""},
+ {TFM_MODAL_AUTOIK_LEN_DEC, "AUTOIK_CHAIN_LEN_DOWN", 0, "Decrease Max AutoIK Chain Length", ""},
{0, NULL, 0, NULL, NULL}};
wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "Transform Modal Map");
@@ -530,6 +539,9 @@ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf)
WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, TFM_MODAL_SNAP_INV_ON);
WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, TFM_MODAL_SNAP_INV_OFF);
+
+ WM_modalkeymap_add_item(keymap, RIGHTCTRLKEY, KM_PRESS, KM_ANY, 0, TFM_MODAL_SNAP_INV_ON);
+ WM_modalkeymap_add_item(keymap, RIGHTCTRLKEY, KM_RELEASE, KM_ANY, 0, TFM_MODAL_SNAP_INV_OFF);
WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, 0, 0, TFM_MODAL_ADD_SNAP);
WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, KM_ALT, 0, TFM_MODAL_REMOVE_SNAP);
@@ -541,14 +553,19 @@ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf)
WM_modalkeymap_add_item(keymap, PAGEDOWNKEY, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_DOWN);
WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_UP);
WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_DOWN);
-
+
+ WM_modalkeymap_add_item(keymap, PAGEUPKEY, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_AUTOIK_LEN_INC);
+ WM_modalkeymap_add_item(keymap, PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_AUTOIK_LEN_DEC);
+ WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_AUTOIK_LEN_INC);
+ WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_AUTOIK_LEN_DEC);
+
return keymap;
}
int transformEvent(TransInfo *t, wmEvent *event)
{
- float mati[3][3] = {{1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}};
+ float mati[3][3]= MAT3_UNITY;
char cmode = constraintModeToChar(t);
int handled = 1;
@@ -562,7 +579,9 @@ int transformEvent(TransInfo *t, wmEvent *event)
t->mval[0] = event->x - t->ar->winrct.xmin;
t->mval[1] = event->y - t->ar->winrct.ymin;
- t->redraw |= TREDRAW_SOFT;
+ // t->redraw |= TREDRAW_SOFT; /* Use this for soft redraw. Might cause flicker in object mode */
+ t->redraw |= TREDRAW_HARD;
+
if (t->state == TRANS_STARTING) {
t->state = TRANS_RUNNING;
@@ -592,20 +611,22 @@ int transformEvent(TransInfo *t, wmEvent *event)
break;
case TFM_MODAL_ROTATE:
/* only switch when... */
- if( ELEM4(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL, TFM_TRANSLATION) ) {
-
- resetTransRestrictions(t);
-
- if (t->mode == TFM_ROTATION) {
- restoreTransObjects(t);
- initTrackball(t);
- }
- else {
- restoreTransObjects(t);
- initRotation(t);
+ if(!(t->options & CTX_TEXTURE)) {
+ if( ELEM4(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL, TFM_TRANSLATION) ) {
+
+ resetTransRestrictions(t);
+
+ if (t->mode == TFM_ROTATION) {
+ restoreTransObjects(t);
+ initTrackball(t);
+ }
+ else {
+ restoreTransObjects(t);
+ initRotation(t);
+ }
+ initSnapping(t, NULL); // need to reinit after mode change
+ t->redraw |= TREDRAW_HARD;
}
- initSnapping(t, NULL); // need to reinit after mode change
- t->redraw |= TREDRAW_HARD;
}
break;
case TFM_MODAL_RESIZE:
@@ -724,6 +745,8 @@ int transformEvent(TransInfo *t, wmEvent *event)
case TFM_MODAL_PROPSIZE_UP:
if(t->flag & T_PROP_EDIT) {
t->prop_size*= 1.1f;
+ if(t->spacetype==SPACE_VIEW3D && t->persp != RV3D_ORTHO)
+ t->prop_size= MIN2(t->prop_size, ((View3D *)t->view)->far);
calculatePropRatio(t);
}
t->redraw |= TREDRAW_HARD;
@@ -735,6 +758,16 @@ int transformEvent(TransInfo *t, wmEvent *event)
}
t->redraw |= TREDRAW_HARD;
break;
+ case TFM_MODAL_AUTOIK_LEN_INC:
+ if (t->flag & T_AUTOIK)
+ transform_autoik_update(t, 1);
+ t->redraw |= TREDRAW_HARD;
+ break;
+ case TFM_MODAL_AUTOIK_LEN_DEC:
+ if (t->flag & T_AUTOIK)
+ transform_autoik_update(t, -1);
+ t->redraw |= TREDRAW_HARD;
+ break;
default:
handled = 0;
break;
@@ -833,20 +866,22 @@ int transformEvent(TransInfo *t, wmEvent *event)
break;
case RKEY:
/* only switch when... */
- if( ELEM4(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL, TFM_TRANSLATION) ) {
+ if(!(t->options & CTX_TEXTURE)) {
+ if( ELEM4(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL, TFM_TRANSLATION) ) {
- resetTransRestrictions(t);
+ resetTransRestrictions(t);
- if (t->mode == TFM_ROTATION) {
- restoreTransObjects(t);
- initTrackball(t);
- }
- else {
- restoreTransObjects(t);
- initRotation(t);
+ if (t->mode == TFM_ROTATION) {
+ restoreTransObjects(t);
+ initTrackball(t);
+ }
+ else {
+ restoreTransObjects(t);
+ initRotation(t);
+ }
+ initSnapping(t, NULL); // need to reinit after mode change
+ t->redraw |= TREDRAW_HARD;
}
- initSnapping(t, NULL); // need to reinit after mode change
- t->redraw |= TREDRAW_HARD;
}
break;
case CKEY:
@@ -950,6 +985,8 @@ int transformEvent(TransInfo *t, wmEvent *event)
case PADPLUSKEY:
if(event->alt && t->flag & T_PROP_EDIT) {
t->prop_size *= 1.1f;
+ if(t->spacetype==SPACE_VIEW3D && t->persp != RV3D_ORTHO)
+ t->prop_size= MIN2(t->prop_size, ((View3D *)t->view)->far);
calculatePropRatio(t);
}
t->redraw= 1;
@@ -1201,14 +1238,17 @@ static void drawArc(float size, float angle_start, float angle_end, int segments
glEnd();
}
-static void drawHelpline(bContext *C, int x, int y, void *customdata)
+static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
{
TransInfo *t = (TransInfo*)customdata;
if (t->helpline != HLP_NONE && !(t->flag & T_USES_MANIPULATOR))
{
float vecrot[3], cent[2];
- int mval[2] = {x, y};
+ int mval[2];
+
+ mval[0]= x;
+ mval[1]= y;
VECCOPY(vecrot, t->center);
if(t->flag & T_EDIT) {
@@ -1306,20 +1346,20 @@ static void drawHelpline(bContext *C, int x, int y, void *customdata)
}
case HLP_TRACKBALL:
{
- char col[3], col2[3];
+ unsigned char col[3], col2[3];
UI_GetThemeColor3ubv(TH_GRID, col);
glTranslatef(mval[0], mval[1], 0);
glLineWidth(3.0);
- UI_make_axis_color(col, col2, 'x');
+ UI_make_axis_color(col, col2, 'X');
glColor3ubv((GLubyte *)col2);
drawArrow(RIGHT, 5, 10, 5);
drawArrow(LEFT, 5, 10, 5);
- UI_make_axis_color(col, col2, 'y');
+ UI_make_axis_color(col, col2, 'Y');
glColor3ubv((GLubyte *)col2);
drawArrow(UP, 5, 10, 5);
@@ -1333,16 +1373,16 @@ static void drawHelpline(bContext *C, int x, int y, void *customdata)
}
}
-void drawTransformView(const struct bContext *C, struct ARegion *ar, void *arg)
+void drawTransformView(const struct bContext *C, struct ARegion *UNUSED(ar), void *arg)
{
TransInfo *t = arg;
- drawConstraint(C, t);
+ drawConstraint(t);
drawPropCircle(C, t);
drawSnapping(C, t);
}
-void drawTransformPixel(const struct bContext *C, struct ARegion *ar, void *arg)
+void drawTransformPixel(const struct bContext *UNUSED(C), struct ARegion *UNUSED(ar), void *UNUSED(arg))
{
// TransInfo *t = arg;
//
@@ -1465,10 +1505,16 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
{
int options = 0;
+ t->context = C;
+
/* added initialize, for external calls to set stuff in TransInfo, like undo string */
t->state = TRANS_STARTING;
+ if(RNA_struct_find_property(op->ptr, "texture_space"))
+ if(RNA_boolean_get(op->ptr, "texture_space"))
+ options |= CTX_TEXTURE;
+
t->options = options;
t->mode = mode;
@@ -1534,7 +1580,7 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
if ((ELEM(kmi->type, LEFTCTRLKEY, RIGHTCTRLKEY) && event->ctrl) ||
(ELEM(kmi->type, LEFTSHIFTKEY, RIGHTSHIFTKEY) && event->shift) ||
(ELEM(kmi->type, LEFTALTKEY, RIGHTALTKEY) && event->alt) ||
- (kmi->type == COMMANDKEY && event->oskey)) {
+ (kmi->type == OSKEY && event->oskey)) {
t->modifiers |= MOD_SNAP_INVERT;
}
break;
@@ -1606,6 +1652,11 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
break;
case TFM_EDGE_SLIDE:
initEdgeSlide(t);
+ if(t->state == TRANS_CANCEL)
+ {
+ postTrans(C, t);
+ return 0;
+ }
break;
case TFM_BONE_ROLL:
initBoneRoll(t);
@@ -1653,7 +1704,7 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
/* overwrite initial values if operator supplied a non-null vector */
if (RNA_property_is_set(op->ptr, "value"))
{
- float values[4];
+ float values[4]= {0}; /* incase value isn't length 4, avoid uninitialized memory */
RNA_float_get_array(op->ptr, "value", values);
QUATCOPY(t->values, values);
QUATCOPY(t->auto_values, values);
@@ -1665,6 +1716,7 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
{
RNA_float_get_array(op->ptr, "axis", t->axis);
normalize_v3(t->axis);
+ copy_v3_v3(t->axis_orig, t->axis);
}
/* Constraint init from operator */
@@ -1692,11 +1744,15 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
}
}
+ t->context = NULL;
+
return 1;
}
-void transformApply(const bContext *C, TransInfo *t)
+void transformApply(bContext *C, TransInfo *t)
{
+ t->context = C;
+
if ((t->redraw & TREDRAW_HARD) || (t->draw_handle_apply == NULL && (t->redraw & TREDRAW_SOFT)))
{
selectConstraint(t);
@@ -1721,15 +1777,17 @@ void transformApply(const bContext *C, TransInfo *t)
//do_screenhandlers(G.curscreen);
t->redraw |= TREDRAW_HARD;
}
+
+ t->context = NULL;
}
-void drawTransformApply(const struct bContext *C, struct ARegion *ar, void *arg)
+void drawTransformApply(const bContext *C, struct ARegion *UNUSED(ar), void *arg)
{
TransInfo *t = arg;
if (t->redraw & TREDRAW_SOFT) {
t->redraw |= TREDRAW_HARD;
- transformApply(C, t);
+ transformApply((bContext *)C, t);
}
}
@@ -1737,11 +1795,17 @@ int transformEnd(bContext *C, TransInfo *t)
{
int exit_code = OPERATOR_RUNNING_MODAL;
+ t->context = C;
+
if (t->state != TRANS_STARTING && t->state != TRANS_RUNNING)
{
/* handle restoring objects */
if(t->state == TRANS_CANCEL)
{
+ /* exception, edge slide transformed UVs too */
+ if(t->mode==TFM_EDGE_SLIDE)
+ doEdgeSlide(t, 0.0f);
+
exit_code = OPERATOR_CANCELLED;
restoreTransObjects(t); // calls recalcData()
}
@@ -1757,7 +1821,7 @@ int transformEnd(bContext *C, TransInfo *t)
postTrans(C, t);
/* send events out for redraws */
- viewRedrawPost(t);
+ viewRedrawPost(C, t);
/* Undo as last, certainly after special_trans_update! */
@@ -1773,6 +1837,8 @@ int transformEnd(bContext *C, TransInfo *t)
viewRedrawForce(C, t);
}
+ t->context = NULL;
+
return exit_code;
}
@@ -1872,23 +1938,29 @@ static void protectedQuaternionBits(short protectflag, float *quat, float *oldqu
}
else {
/* quaternions get limited with euler... (compatability mode) */
- float eul[3], oldeul[3], quat1[4];
-
- QUATCOPY(quat1, quat);
- quat_to_eul( eul,quat);
- quat_to_eul( oldeul,oldquat);
-
+ float eul[3], oldeul[3], nquat[4], noldquat[4];
+ float qlen;
+
+ qlen= normalize_qt_qt(nquat, quat);
+ normalize_qt_qt(noldquat, oldquat);
+
+ quat_to_eul(eul, nquat);
+ quat_to_eul(oldeul, noldquat);
+
if (protectflag & OB_LOCK_ROTX)
eul[0]= oldeul[0];
if (protectflag & OB_LOCK_ROTY)
eul[1]= oldeul[1];
if (protectflag & OB_LOCK_ROTZ)
eul[2]= oldeul[2];
-
+
eul_to_quat( quat,eul);
+
+ /* restore original quat size */
+ mul_qt_fl(quat, qlen);
/* quaternions flip w sign to accumulate rotations correctly */
- if ( (quat1[0]<0.0f && quat[0]>0.0f) || (quat1[0]>0.0f && quat[0]<0.0f) ) {
+ if ( (nquat[0]<0.0f && quat[0]>0.0f) || (nquat[0]>0.0f && quat[0]<0.0f) ) {
mul_qt_fl(quat, -1.0f);
}
}
@@ -1896,18 +1968,17 @@ static void protectedQuaternionBits(short protectflag, float *quat, float *oldqu
/* ******************* TRANSFORM LIMITS ********************** */
-static void constraintTransLim(TransInfo *t, TransData *td)
+static void constraintTransLim(TransInfo *UNUSED(t), TransData *td)
{
if (td->con) {
bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_LOCLIMIT);
- bConstraintOb cob;
+ bConstraintOb cob= {0};
bConstraint *con;
/* Make a temporary bConstraintOb for using these limit constraints
* - they only care that cob->matrix is correctly set ;-)
* - current space should be local
*/
- memset(&cob, 0, sizeof(bConstraintOb));
unit_m4(cob.matrix);
VECCOPY(cob.matrix[3], td->loc);
@@ -1961,37 +2032,29 @@ static void constraintob_from_transdata(bConstraintOb *cob, TransData *td)
* - current space should be local
*/
memset(cob, 0, sizeof(bConstraintOb));
- if (td->rotOrder == ROT_MODE_QUAT) {
- /* quats */
- if (td->ext) {
+ if (td->ext)
+ {
+ if (td->ext->rotOrder == ROT_MODE_QUAT) {
+ /* quats */
/* objects and bones do normalization first too, otherwise
we don't necessarily end up with a rotation matrix, and
then conversion back to quat gives a different result */
float quat[4];
- copy_qt_qt(quat, td->ext->quat);
- normalize_qt(quat);
+ normalize_qt_qt(quat, td->ext->quat);
quat_to_mat4(cob->matrix, quat);
}
- else
- return;
- }
- else if (td->rotOrder == ROT_MODE_AXISANGLE) {
- /* axis angle */
- if (td->ext)
+ else if (td->ext->rotOrder == ROT_MODE_AXISANGLE) {
+ /* axis angle */
axis_angle_to_mat4(cob->matrix, &td->ext->quat[1], td->ext->quat[0]);
- else
- return;
- }
- else {
- /* eulers */
- if (td->ext)
- eulO_to_mat4(cob->matrix, td->ext->rot, td->rotOrder);
- else
- return;
+ }
+ else {
+ /* eulers */
+ eulO_to_mat4(cob->matrix, td->ext->rot, td->ext->rotOrder);
+ }
}
}
-static void constraintRotLim(TransInfo *t, TransData *td)
+static void constraintRotLim(TransInfo *UNUSED(t), TransData *td)
{
if (td->con) {
bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_ROTLIMIT);
@@ -2045,17 +2108,17 @@ static void constraintRotLim(TransInfo *t, TransData *td)
if(dolimit) {
/* copy results from cob->matrix */
- if (td->rotOrder == ROT_MODE_QUAT) {
+ if (td->ext->rotOrder == ROT_MODE_QUAT) {
/* quats */
mat4_to_quat( td->ext->quat,cob.matrix);
}
- else if (td->rotOrder == ROT_MODE_AXISANGLE) {
+ else if (td->ext->rotOrder == ROT_MODE_AXISANGLE) {
/* axis angle */
mat4_to_axis_angle( &td->ext->quat[1], &td->ext->quat[0],cob.matrix);
}
else {
/* eulers */
- mat4_to_eulO( td->ext->rot, td->rotOrder,cob.matrix);
+ mat4_to_eulO( td->ext->rot, td->ext->rotOrder,cob.matrix);
}
}
}
@@ -2065,14 +2128,13 @@ static void constraintSizeLim(TransInfo *t, TransData *td)
{
if (td->con && td->ext) {
bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_SIZELIMIT);
- bConstraintOb cob;
+ bConstraintOb cob= {0};
bConstraint *con;
/* Make a temporary bConstraintOb for using these limit constraints
* - they only care that cob->matrix is correctly set ;-)
* - current space should be local
*/
- memset(&cob, 0, sizeof(bConstraintOb));
if ((td->flag & TD_SINGLESIZE) && !(t->con.mode & CON_APPLY)) {
/* scale val and reset size */
return; // TODO: fix this case
@@ -2180,7 +2242,7 @@ void initWarp(TransInfo *t)
mul_m4_v3(t->viewmat, center);
sub_v3_v3(center, t->viewmat[3]);
if (i)
- minmax_v3_v3v3(min, max, center);
+ minmax_v3v3_v3(min, max, center);
else {
copy_v3_v3(max, center);
copy_v3_v3(min, center);
@@ -2211,7 +2273,7 @@ int handleEventWarp(TransInfo *t, wmEvent *event)
return status;
}
-int Warp(TransInfo *t, short mval[2])
+int Warp(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
float vec[3], circumfac, dist, phi0, co, si, *curs, cursor[3], gcursor[3];
@@ -2309,7 +2371,7 @@ int Warp(TransInfo *t, short mval[2])
/* ************************** SHEAR *************************** */
-void postInputShear(TransInfo *t, float values[3])
+void postInputShear(TransInfo *UNUSED(t), float values[3])
{
mul_v3_fl(values, 0.05f);
}
@@ -2359,7 +2421,7 @@ int handleEventShear(TransInfo *t, wmEvent *event)
}
-int Shear(TransInfo *t, short mval[2])
+int Shear(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
float vec[3];
@@ -2490,6 +2552,9 @@ static void headerResize(TransInfo *t, float vec[3], char *str) {
else
sprintf(str, "Scale X: %s Y: %s Z: %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
}
+
+ if (t->flag & (T_PROP_EDIT|T_PROP_CONNECTED))
+ sprintf(str, "%s Proportional size: %.2f", str, t->prop_size);
}
#define SIGN(a) (a<-FLT_EPSILON?1:a>FLT_EPSILON?2:3)
@@ -2723,7 +2788,7 @@ void initToSphere(TransInfo *t)
t->val /= (float)t->total;
}
-int ToSphere(TransInfo *t, short mval[2])
+int ToSphere(TransInfo *t, short UNUSED(mval[2]))
{
float vec[3];
float ratio, radius;
@@ -2820,6 +2885,8 @@ void initRotation(TransInfo *t)
negate_v3_v3(t->axis, t->viewinv[2]);
normalize_v3(t->axis);
+
+ copy_v3_v3(t->axis_orig, t->axis);
}
static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short around) {
@@ -2897,9 +2964,19 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
sub_v3_v3v3(vec, vec, td->center); // Translation needed from the initial location
- mul_m3_v3(pmtx, vec); // To Global space
- mul_m3_v3(td->smtx, vec);// To Pose space
-
+ /* special exception, see TD_PBONE_LOCAL_MTX definition comments */
+ if(td->flag & TD_PBONE_LOCAL_MTX_P) {
+ /* do nothing */
+ }
+ else if (td->flag & TD_PBONE_LOCAL_MTX_C) {
+ mul_m3_v3(pmtx, vec); // To Global space
+ mul_m3_v3(td->ext->l_smtx, vec);// To Pose space (Local Location)
+ }
+ else {
+ mul_m3_v3(pmtx, vec); // To Global space
+ mul_m3_v3(td->smtx, vec);// To Pose space
+ }
+
protectedTransBits(td->protectflag, vec);
add_v3_v3v3(td->loc, td->iloc, vec);
@@ -2910,7 +2987,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
/* rotation */
if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate objects itself
/* euler or quaternion/axis-angle? */
- if (td->rotOrder == ROT_MODE_QUAT) {
+ if (td->ext->rotOrder == ROT_MODE_QUAT) {
mul_serie_m3(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
mat3_to_quat( quat,fmat); // Actual transform
@@ -2920,7 +2997,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
protectedQuaternionBits(td->protectflag, td->ext->quat, td->ext->iquat);
}
- else if (td->rotOrder == ROT_MODE_AXISANGLE) {
+ else if (td->ext->rotOrder == ROT_MODE_AXISANGLE) {
/* calculate effect based on quats */
float iquat[4], tquat[4];
@@ -2943,12 +3020,12 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
/* calculate the total rotatation in eulers */
VECCOPY(eul, td->ext->irot);
- eulO_to_mat3( eulmat,eul, td->rotOrder);
+ eulO_to_mat3( eulmat,eul, td->ext->rotOrder);
/* mat = transform, obmat = bone rotation */
mul_m3_m3m3(fmat, smat, eulmat);
- mat3_to_compatible_eulO( eul, td->ext->rot, td->rotOrder,fmat);
+ mat3_to_compatible_eulO( eul, td->ext->rot, td->ext->rotOrder,fmat);
/* and apply (to end result only) */
protectedRotateBits(td->protectflag, eul, td->ext->irot);
@@ -2980,7 +3057,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
/* rotation */
if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate objects itself
/* euler or quaternion? */
- if ((td->rotOrder == ROT_MODE_QUAT) || (td->flag & TD_USEQUAT)) {
+ if ((td->ext->rotOrder == ROT_MODE_QUAT) || (td->flag & TD_USEQUAT)) {
mul_serie_m3(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
mat3_to_quat( quat,fmat); // Actual transform
@@ -2988,7 +3065,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
/* this function works on end result */
protectedQuaternionBits(td->protectflag, td->ext->quat, td->ext->iquat);
}
- else if (td->rotOrder == ROT_MODE_AXISANGLE) {
+ else if (td->ext->rotOrder == ROT_MODE_AXISANGLE) {
/* calculate effect based on quats */
float iquat[4], tquat[4];
@@ -2998,7 +3075,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
mat3_to_quat( quat,fmat); // Actual transform
mul_qt_qtqt(tquat, quat, iquat);
- quat_to_axis_angle( td->ext->rotAxis, td->ext->rotAngle,quat);
+ quat_to_axis_angle( td->ext->rotAxis, td->ext->rotAngle,tquat);
/* this function works on end result */
protectedAxisAngleBits(td->protectflag, td->ext->rotAxis, td->ext->rotAngle, td->ext->irotAxis, td->ext->irotAngle);
@@ -3011,11 +3088,11 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
/* calculate the total rotatation in eulers */
add_v3_v3v3(eul, td->ext->irot, td->ext->drot); /* we have to correct for delta rot */
- eulO_to_mat3( obmat,eul, td->rotOrder);
+ eulO_to_mat3( obmat,eul, td->ext->rotOrder);
/* mat = transform, obmat = object rotation */
mul_m3_m3m3(fmat, smat, obmat);
- mat3_to_compatible_eulO( eul, td->ext->rot, td->rotOrder,fmat);
+ mat3_to_compatible_eulO( eul, td->ext->rot, td->ext->rotOrder,fmat);
/* correct back for delta rot */
sub_v3_v3v3(eul, eul, td->ext->drot);
@@ -3058,14 +3135,12 @@ static void applyRotation(TransInfo *t, float angle, float axis[3])
}
}
-int Rotation(TransInfo *t, short mval[2])
+int Rotation(TransInfo *t, short UNUSED(mval[2]))
{
char str[64];
float final;
-
- float mat[3][3];
-
+
final = t->values[0];
applyNDofInput(&t->ndof, &final);
@@ -3076,8 +3151,7 @@ int Rotation(TransInfo *t, short mval[2])
t->con.applyRot(t, NULL, t->axis, NULL);
} else {
/* reset axis if constraint is not set */
- negate_v3_v3(t->axis, t->viewinv[2]);
- normalize_v3(t->axis);
+ copy_v3_v3(t->axis, t->axis_orig);
}
applySnapping(t, &final);
@@ -3104,9 +3178,10 @@ int Rotation(TransInfo *t, short mval[2])
sprintf(str, "Rot: %.2f%s %s", 180.0*final/M_PI, t->con.text, t->proptext);
}
+ if (t->flag & (T_PROP_EDIT|T_PROP_CONNECTED))
+ sprintf(str, "%s Proportional size: %.2f", str, t->prop_size);
+
t->values[0] = final;
-
- vec_rot_to_mat3( mat, t->axis, final);
applyRotation(t, final, t->axis);
@@ -3172,7 +3247,7 @@ static void applyTrackball(TransInfo *t, float axis1[3], float axis2[3], float a
}
}
-int Trackball(TransInfo *t, short mval[2])
+int Trackball(TransInfo *t, short UNUSED(mval[2]))
{
char str[128];
float axis1[3], axis2[3];
@@ -3278,7 +3353,7 @@ static void headerTranslation(TransInfo *t, float vec[3], char *str) {
applyAspectRatio(t, dvec);
dist = len_v3(vec);
- if(t->scene->unit.system) {
+ if(!(t->flag & T_2D_EDIT) && t->scene->unit.system) {
int i, do_split= t->scene->unit.flag & USER_UNIT_OPT_SPLIT ? 1:0;
for(i=0; i<3; i++)
@@ -3291,7 +3366,7 @@ static void headerTranslation(TransInfo *t, float vec[3], char *str) {
}
}
- if(t->scene->unit.system)
+ if(!(t->flag & T_2D_EDIT) && t->scene->unit.system)
bUnit_AsString(distvec, sizeof(distvec), dist*t->scene->unit.scale_length, 4, t->scene->unit.system, B_UNIT_LENGTH, t->scene->unit.flag & USER_UNIT_OPT_SPLIT, 0);
else if( dist > 1e10 || dist < -1e10 ) /* prevent string buffer overflow */
sprintf(distvec, "%.4e", dist);
@@ -3327,6 +3402,9 @@ static void headerTranslation(TransInfo *t, float vec[3], char *str) {
else
sprintf(str, "Dx: %s Dy: %s Dz: %s (%s)%s %s %s", &tvec[0], &tvec[20], &tvec[40], distvec, t->con.text, t->proptext, &autoik[0]);
}
+
+ if (t->flag & (T_PROP_EDIT|T_PROP_CONNECTED))
+ sprintf(str, "%s Proportional size: %.2f", str, t->prop_size);
}
static void applyTranslation(TransInfo *t, float vec[3]) {
@@ -3391,13 +3469,16 @@ static void applyTranslation(TransInfo *t, float vec[3]) {
}
/* uses t->vec to store actual translation in */
-int Translation(TransInfo *t, short mval[2])
+int Translation(TransInfo *t, short UNUSED(mval[2]))
{
char str[250];
if (t->con.mode & CON_APPLY) {
float pvec[3] = {0.0f, 0.0f, 0.0f};
float tvec[3];
+ if (hasNumInput(&t->num)) {
+ removeAspectRatio(t, t->values);
+ }
applySnapping(t, t->values);
t->con.applyVec(t, NULL, t->values, tvec, pvec);
VECCOPY(t->values, tvec);
@@ -3407,11 +3488,9 @@ int Translation(TransInfo *t, short mval[2])
applyNDofInput(&t->ndof, t->values);
snapGrid(t, t->values);
applyNumInput(&t->num, t->values);
- if (hasNumInput(&t->num))
- {
+ if (hasNumInput(&t->num)) {
removeAspectRatio(t, t->values);
}
-
applySnapping(t, t->values);
headerTranslation(t, t->values, str);
}
@@ -3457,7 +3536,7 @@ void initShrinkFatten(TransInfo *t)
-int ShrinkFatten(TransInfo *t, short mval[2])
+int ShrinkFatten(TransInfo *t, short UNUSED(mval[2]))
{
float vec[3];
float distance;
@@ -3532,7 +3611,7 @@ void initTilt(TransInfo *t)
-int Tilt(TransInfo *t, short mval[2])
+int Tilt(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
int i;
@@ -3604,7 +3683,7 @@ void initCurveShrinkFatten(TransInfo *t)
t->flag |= T_NO_CONSTRAINT;
}
-int CurveShrinkFatten(TransInfo *t, short mval[2])
+int CurveShrinkFatten(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
float ratio;
@@ -3672,7 +3751,7 @@ void initPushPull(TransInfo *t)
}
-int PushPull(TransInfo *t, short mval[2])
+int PushPull(TransInfo *t, short UNUSED(mval[2]))
{
float vec[3], axis[3];
float distance;
@@ -3805,12 +3884,12 @@ int handleEventBevel(TransInfo *t, wmEvent *event)
return 0;
}
-int Bevel(TransInfo *t, short mval[2])
+int Bevel(TransInfo *t, short UNUSED(mval[2]))
{
float distance,d;
int i;
char str[128];
- char *mode;
+ const char *mode;
TransData *td = t->data;
mode = (G.editBMesh->options & BME_BEVEL_VERT) ? "verts only" : "normal";
@@ -3873,7 +3952,7 @@ void initBevelWeight(TransInfo *t)
t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT;
}
-int BevelWeight(TransInfo *t, short mval[2])
+int BevelWeight(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
float weight;
@@ -3946,7 +4025,7 @@ void initCrease(TransInfo *t)
t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT;
}
-int Crease(TransInfo *t, short mval[2])
+int Crease(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
float crease;
@@ -4140,7 +4219,7 @@ void initBoneEnvelope(TransInfo *t)
t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT;
}
-int BoneEnvelope(TransInfo *t, short mval[2])
+int BoneEnvelope(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
float ratio;
@@ -4242,6 +4321,7 @@ static int createSlideVerts(TransInfo *t)
efa->e1->f1++;
if(efa->e1->f1 > 2) {
//BKE_report(op->reports, RPT_ERROR, "3+ face edge");
+ MEM_freeN(sld);
return 0;
}
}
@@ -4250,6 +4330,7 @@ static int createSlideVerts(TransInfo *t)
efa->e2->f1++;
if(efa->e2->f1 > 2) {
//BKE_report(op->reports, RPT_ERROR, "3+ face edge");
+ MEM_freeN(sld);
return 0;
}
}
@@ -4258,6 +4339,7 @@ static int createSlideVerts(TransInfo *t)
efa->e3->f1++;
if(efa->e3->f1 > 2) {
//BKE_report(op->reports, RPT_ERROR, "3+ face edge");
+ MEM_freeN(sld);
return 0;
}
}
@@ -4266,13 +4348,15 @@ static int createSlideVerts(TransInfo *t)
efa->e4->f1++;
if(efa->e4->f1 > 2) {
//BKE_report(op->reports, RPT_ERROR, "3+ face edge");
+ MEM_freeN(sld);
return 0;
}
}
// Make sure loop is not 2 edges of same face
if(ct > 1) {
//BKE_report(op->reports, RPT_ERROR, "Loop crosses itself");
- return 0;
+ MEM_freeN(sld);
+ return 0;
}
}
@@ -4284,6 +4368,7 @@ static int createSlideVerts(TransInfo *t)
// Test for multiple segments
if(vertsel > numsel+1) {
//BKE_report(op->reports, RPT_ERROR, "Please choose a single edge loop");
+ MEM_freeN(sld);
return 0;
}
@@ -4320,6 +4405,7 @@ static int createSlideVerts(TransInfo *t)
if(timesthrough >= numsel*2) {
BLI_linklist_free(edgelist,NULL);
//BKE_report(op->reports, RPT_ERROR, "Could not order loop");
+ MEM_freeN(sld);
return 0;
}
}
@@ -4452,7 +4538,7 @@ static int createSlideVerts(TransInfo *t)
look = look->next;
}
- // make sure the UPs nad DOWNs are 'faceloops'
+ // make sure the UPs and DOWNs are 'faceloops'
// Also find the nearest slidevert to the cursor
look = vertlist;
@@ -4469,7 +4555,7 @@ static int createSlideVerts(TransInfo *t)
return 0;
}
- if(me->drawflag & ME_DRAW_EDGELEN) {
+ if(me->drawflag & ME_DRAWEXTRA_EDGELEN) {
if(!(tempsv->up->f & SELECT)) {
tempsv->up->f |= SELECT;
tempsv->up->f2 |= 16;
@@ -4491,7 +4577,7 @@ static int createSlideVerts(TransInfo *t)
sv = BLI_ghash_lookup(vertgh, ev);
if(sv) {
- float co[3], co2[3], vec[3];
+ float co[3], co2[3], tvec[3];
ev = (EditVert*)look->link;
@@ -4508,12 +4594,12 @@ static int createSlideVerts(TransInfo *t)
}
if (ev == tempsv->up->v1) {
- sub_v3_v3v3(vec, co, co2);
+ sub_v3_v3v3(tvec, co, co2);
} else {
- sub_v3_v3v3(vec, co2, co);
+ sub_v3_v3v3(tvec, co2, co);
}
- add_v3_v3(start, vec);
+ add_v3_v3(start, tvec);
if (v3d) {
view3d_project_float(t->ar, tempsv->down->v1->co, co, projectMat);
@@ -4521,12 +4607,12 @@ static int createSlideVerts(TransInfo *t)
}
if (ev == tempsv->down->v1) {
- sub_v3_v3v3(vec, co2, co);
+ sub_v3_v3v3(tvec, co2, co);
} else {
- sub_v3_v3v3(vec, co, co2);
+ sub_v3_v3v3(tvec, co, co2);
}
- add_v3_v3(end, vec);
+ add_v3_v3(end, tvec);
totvec += 1.0f;
nearest = (EditVert*)look->link;
@@ -4544,7 +4630,26 @@ static int createSlideVerts(TransInfo *t)
start[0] = t->mval[0];
start[1] = t->mval[1];
add_v3_v3v3(end, start, vec);
-
+
+
+ /* Ensure minimum screen distance, when looking top down on edge loops */
+#define EDGE_SLIDE_MIN 30
+ if (len_squared_v2v2(start, end) < (EDGE_SLIDE_MIN * EDGE_SLIDE_MIN)) {
+ if(ABS(start[0]-end[0]) + ABS(start[1]-end[1]) < 4.0f) {
+ /* even more exceptional case, points are ontop of eachother */
+ end[0]= start[0];
+ end[1]= start[1] + EDGE_SLIDE_MIN;
+ }
+ else {
+ sub_v2_v2(end, start);
+ normalize_v2(end);
+ mul_v2_fl(end, EDGE_SLIDE_MIN);
+ add_v2_v2(end, start);
+ }
+ }
+#undef EDGE_SLIDE_MIN
+
+
sld->start[0] = (short) start[0];
sld->start[1] = (short) start[1];
sld->end[0] = (short) end[0];
@@ -4589,7 +4694,7 @@ static int createSlideVerts(TransInfo *t)
uv_new = tf->uv[k];
if (ev->tmp.l) {
- if (fabs(suv->origuv[0]-uv_new[0]) > 0.0001 || fabs(suv->origuv[1]-uv_new[1])) {
+ if (fabs(suv->origuv[0]-uv_new[0]) > 0.0001f || fabs(suv->origuv[1]-uv_new[1]) > 0.0001f) {
ev->tmp.l = -1; /* Tag as invalid */
BLI_linklist_free(suv->fuv_list,NULL);
suv->fuv_list = NULL;
@@ -4664,7 +4769,7 @@ void freeSlideVerts(TransInfo *t)
Mesh *me = t->obedit->data;
int uvlay_idx;
- if(me->drawflag & ME_DRAW_EDGELEN) {
+ if(me->drawflag & ME_DRAWEXTRA_EDGELEN) {
TransDataSlideVert *tempsv;
LinkNode *look = sld->vertlist;
GHash *vertgh = sld->vhash;
@@ -4711,7 +4816,11 @@ void initEdgeSlide(TransInfo *t)
t->mode = TFM_EDGE_SLIDE;
t->transform = EdgeSlide;
- createSlideVerts(t);
+ if(!createSlideVerts(t)) {
+ t->state= TRANS_CANCEL;
+ return;
+ }
+
sld = t->customData;
if (!sld)
@@ -4744,18 +4853,16 @@ int doEdgeSlide(TransInfo *t, float perc)
LinkNode *vertlist=sld->vertlist, *look;
GHash *vertgh = sld->vhash;
TransDataSlideVert *tempsv;
- float len = 0.0f;
+ float len;
int prop=1, flip=0;
/* UV correction vars */
GHash **uvarray= sld->uvhash;
int uvlay_tot= CustomData_number_of_layers(&em->fdata, CD_MTFACE);
int uvlay_idx;
- TransDataSlideUv *suv=sld->slideuv;
+ TransDataSlideUv *suv;
float uv_tmp[2];
LinkNode *fuv_link;
- len = 0.0f;
-
tempsv = BLI_ghash_lookup(vertgh,nearest);
centerVert = editedge_getSharedVert(tempsv->up, tempsv->down);
@@ -4846,7 +4953,7 @@ int doEdgeSlide(TransInfo *t, float perc)
return 1;
}
-int EdgeSlide(TransInfo *t, short mval[2])
+int EdgeSlide(TransInfo *t, short UNUSED(mval[2]))
{
char str[50];
float final;
@@ -4905,7 +5012,7 @@ void initBoneRoll(TransInfo *t)
t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT;
}
-int BoneRoll(TransInfo *t, short mval[2])
+int BoneRoll(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
int i;
@@ -5041,7 +5148,7 @@ void initMirror(TransInfo *t)
}
}
-int Mirror(TransInfo *t, short mval[2])
+int Mirror(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td;
float size[3], mat[3][3];
@@ -5118,7 +5225,7 @@ void initAlign(TransInfo *t)
initMouseInputMode(t, &t->mouse, INPUT_NONE);
}
-int Align(TransInfo *t, short mval[2])
+int Align(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
float center[3];
@@ -5221,7 +5328,7 @@ static void applySeqSlide(TransInfo *t, float val[2]) {
}
}
-int SeqSlide(TransInfo *t, short mval[2])
+int SeqSlide(TransInfo *t, short UNUSED(mval[2]))
{
char str[200];
@@ -5449,7 +5556,7 @@ static void headerTimeTranslate(TransInfo *t, char *str)
sprintf(str, "DeltaX: %s", &tvec[0]);
}
-static void applyTimeTranslate(TransInfo *t, float sval)
+static void applyTimeTranslate(TransInfo *t, float UNUSED(sval))
{
TransData *td = t->data;
TransData2D *td2d = t->data2d;
@@ -5751,7 +5858,7 @@ static void applyTimeScale(TransInfo *t) {
}
}
-int TimeScale(TransInfo *t, short mval[2])
+int TimeScale(TransInfo *t, short UNUSED(mval[2]))
{
char str[200];
@@ -5772,14 +5879,14 @@ int TimeScale(TransInfo *t, short mval[2])
/* ************************************ */
-void BIF_TransformSetUndo(char *str)
+void BIF_TransformSetUndo(char *UNUSED(str))
{
// TRANSFORM_FIX_ME
//Trans.undostr= str;
}
-void NDofTransform()
+void NDofTransform(void)
{
#if 0 // TRANSFORM_FIX_ME
float fval[7];
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index 6cfe78a979d..b4a25416dfe 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -131,8 +131,8 @@ typedef struct TransCon {
typedef struct TransDataExtension {
float drot[3]; /* Initial object drot */
- float drotAngle; /* Initial object drotAngle */
- float drotAxis[3]; /* Initial object drotAxis */
+ // float drotAngle; /* Initial object drotAngle, TODO: not yet implimented */
+ // float drotAxis[3]; /* Initial object drotAxis, TODO: not yet implimented */
float dquat[4]; /* Initial object dquat */
float dsize[3]; /* Initial object dsize */
float *rot; /* Rotation of the data to transform (Faculative) */
@@ -146,6 +146,8 @@ typedef struct TransDataExtension {
float *size; /* Size of the data to transform (Faculative) */
float isize[3]; /* Initial size */
float obmat[4][4]; /* Object matrix */
+ float l_smtx[3][3]; /* use instead of td->smtx, It is the same but without the 'bone->bone_mat', see TD_PBONE_LOCAL_MTX_C */
+ int rotOrder; /* rotation mode, as defined in eRotationModes (DNA_action_types.h) */
} TransDataExtension;
typedef struct TransData2D {
@@ -232,7 +234,6 @@ typedef struct TransData {
void *extra; /* extra data (mirrored element pointer, in editmode mesh to EditVert) (editbone for roll fixing) (...) */
int flag; /* Various flags */
short protectflag; /* If set, copy of Object or PoseChannel protection */
- int rotOrder; /* rotation mode, as defined in eRotationModes (DNA_action_types.h) */
} TransData;
typedef struct MouseInput {
@@ -313,8 +314,10 @@ typedef struct TransInfo {
float values[4];
float auto_values[4];
float axis[3];
+ float axis_orig[3]; /* TransCon can change 'axis', store the original value here */
void *view;
+ struct bContext *context; /* Only valid (non null) during an operator called function. */
struct ScrArea *sa;
struct ARegion *ar;
struct Scene *scene;
@@ -421,7 +424,7 @@ typedef struct TransInfo {
#define TD_USEQUAT (1 << 3)
#define TD_NOTCONNECTED (1 << 4)
#define TD_SINGLESIZE (1 << 5) /* used for scaling of MetaElem->rad */
-#define TD_TIMEONLY (1 << 8)
+/*#define TD_TIMEONLY (1 << 8) */ /*UNUSED*/
#define TD_NOCENTER (1 << 9)
#define TD_NO_EXT (1 << 10) /* ext abused for particle key timing */
#define TD_SKIP (1 << 11) /* don't transform this data */
@@ -432,6 +435,8 @@ typedef struct TransInfo {
#define TD_MIRROR_EDGE (1 << 16) /* For editmode mirror, clamp to x = 0 */
#define TD_MOVEHANDLE1 (1 << 17) /* For fcurve handles, move them along with their keyframes */
#define TD_MOVEHANDLE2 (1 << 18)
+#define TD_PBONE_LOCAL_MTX_P (1 << 19) /* exceptional case with pose bone rotating when a parent bone has 'Local Location' option enabled and rotating also transforms it. */
+#define TD_PBONE_LOCAL_MTX_C (1 << 20) /* same as above but for a child bone */
/* transsnap->status */
#define SNAP_FORCED 1
@@ -444,7 +449,7 @@ void TRANSFORM_OT_transform(struct wmOperatorType *ot);
int initTransform(struct bContext *C, struct TransInfo *t, struct wmOperator *op, struct wmEvent *event, int mode);
void saveTransform(struct bContext *C, struct TransInfo *t, struct wmOperator *op);
int transformEvent(TransInfo *t, struct wmEvent *event);
-void transformApply(const struct bContext *C, TransInfo *t);
+void transformApply(struct bContext *C, TransInfo *t);
int transformEnd(struct bContext *C, TransInfo *t);
void setTransformViewMatrices(TransInfo *t);
@@ -553,7 +558,6 @@ void flushTransSeq(TransInfo *t);
/*********************** exported from transform_manipulator.c ********** */
int gimbal_axis(struct Object *ob, float gmat[][3]); /* return 0 when no gimbal for selection */
int calc_manipulator_stats(const struct bContext *C);
-float get_drawsize(struct ARegion *ar, float *co);
/*********************** TransData Creation and General Handling *********** */
void createTransData(struct bContext *C, TransInfo *t);
@@ -571,7 +575,7 @@ void autokeyframe_pose_cb_func(struct bContext *C, struct Scene *scene, struct V
/*********************** Constraints *****************************/
-void drawConstraint(const struct bContext *C, TransInfo *t);
+void drawConstraint(TransInfo *t);
void getConstraintMatrix(TransInfo *t);
void setConstraint(TransInfo *t, float space[3][3], int mode, const char text[]);
@@ -580,7 +584,6 @@ void setUserConstraint(TransInfo *t, short orientation, int mode, const char tex
void constraintNumInput(TransInfo *t, float vec[3]);
-void getConstraintMatrix(TransInfo *t);
int isLockConstraint(TransInfo *t);
int getConstraintSpaceDimension(TransInfo *t);
char constraintModeToChar(TransInfo *t);
@@ -657,8 +660,6 @@ TransDataCurveHandleFlags *initTransDataCurveHandes(TransData *td, struct BezTri
/* DRAWLINE options flags */
#define DRAWLIGHT 1
-#define DRAWDASHED 2
-#define DRAWBOLD 4
void applyTransObjects(TransInfo *t);
void restoreTransObjects(TransInfo *t);
@@ -714,9 +715,6 @@ void applyTransformOrientation(const struct bContext *C, float mat[3][3], char *
int getTransformOrientation(const struct bContext *C, float normal[3], float plane[3], int activeOnly);
-int createSpaceNormal(float mat[3][3], float normal[3]);
-int createSpaceNormalTangent(float mat[3][3], float normal[3], float tangent[3]);
-
void freeSlideVerts(TransInfo *t);
#endif
diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c
index 1e6916f0a86..d5700db8c57 100644
--- a/source/blender/editors/transform/transform_constraints.c
+++ b/source/blender/editors/transform/transform_constraints.c
@@ -49,12 +49,13 @@
#include "BIF_glutil.h"
#include "BKE_context.h"
-#include "BKE_utildefines.h"
+
#include "ED_image.h"
#include "ED_view3d.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
//#include "blendef.h"
//
@@ -154,14 +155,16 @@ static void postConstraintChecks(TransInfo *t, float vec[3], float pvec[3]) {
if (hasNumInput(&t->num)) {
applyNumInput(&t->num, vec);
+ removeAspectRatio(t, vec);
constraintNumInput(t, vec);
}
/* autovalues is operator param, use that directly but not if snapping is forced */
if (t->flag & T_AUTOVALUES && (t->tsnap.status & SNAP_FORCED) == 0)
{
- VECCOPY(vec, t->auto_values);
+ mul_v3_m3v3(vec, t->con.imtx, t->auto_values);
constraintAutoValues(t, vec);
+ /* inverse transformation at the end */
}
if (t->con.mode & CON_AXIS0) {
@@ -558,9 +561,8 @@ void setUserConstraint(TransInfo *t, short orientation, int mode, const char fte
switch(orientation) {
case V3D_MANIP_GLOBAL:
{
- float mtx[3][3];
+ float mtx[3][3]= MAT3_UNITY;
sprintf(text, ftext, "global");
- unit_m3(mtx);
setConstraint(t, mtx, mode, text);
}
break;
@@ -593,7 +595,7 @@ void setUserConstraint(TransInfo *t, short orientation, int mode, const char fte
/*----------------- DRAWING CONSTRAINTS -------------------*/
-void drawConstraint(const struct bContext *C, TransInfo *t)
+void drawConstraint(TransInfo *t)
{
TransCon *tc = &(t->con);
@@ -623,9 +625,9 @@ void drawConstraint(const struct bContext *C, TransInfo *t)
convertViewVec(t, vec, (short)(t->mval[0] - t->con.imval[0]), (short)(t->mval[1] - t->con.imval[1]));
add_v3_v3(vec, tc->center);
- drawLine(t, tc->center, tc->mtx[0], 'x', 0);
- drawLine(t, tc->center, tc->mtx[1], 'y', 0);
- drawLine(t, tc->center, tc->mtx[2], 'z', 0);
+ drawLine(t, tc->center, tc->mtx[0], 'X', 0);
+ drawLine(t, tc->center, tc->mtx[1], 'Y', 0);
+ drawLine(t, tc->center, tc->mtx[2], 'Z', 0);
glColor3ubv((GLubyte *)col2);
@@ -645,13 +647,13 @@ void drawConstraint(const struct bContext *C, TransInfo *t)
}
if (tc->mode & CON_AXIS0) {
- drawLine(t, tc->center, tc->mtx[0], 'x', DRAWLIGHT);
+ drawLine(t, tc->center, tc->mtx[0], 'X', DRAWLIGHT);
}
if (tc->mode & CON_AXIS1) {
- drawLine(t, tc->center, tc->mtx[1], 'y', DRAWLIGHT);
+ drawLine(t, tc->center, tc->mtx[1], 'Y', DRAWLIGHT);
}
if (tc->mode & CON_AXIS2) {
- drawLine(t, tc->center, tc->mtx[2], 'z', DRAWLIGHT);
+ drawLine(t, tc->center, tc->mtx[2], 'Z', DRAWLIGHT);
}
}
}
@@ -712,26 +714,26 @@ static void drawObjectConstraint(TransInfo *t) {
Without drawing the first light, users have little clue what they are doing.
*/
if (t->con.mode & CON_AXIS0) {
- drawLine(t, td->ob->obmat[3], td->axismtx[0], 'x', DRAWLIGHT);
+ drawLine(t, td->ob->obmat[3], td->axismtx[0], 'X', DRAWLIGHT);
}
if (t->con.mode & CON_AXIS1) {
- drawLine(t, td->ob->obmat[3], td->axismtx[1], 'y', DRAWLIGHT);
+ drawLine(t, td->ob->obmat[3], td->axismtx[1], 'Y', DRAWLIGHT);
}
if (t->con.mode & CON_AXIS2) {
- drawLine(t, td->ob->obmat[3], td->axismtx[2], 'z', DRAWLIGHT);
+ drawLine(t, td->ob->obmat[3], td->axismtx[2], 'Z', DRAWLIGHT);
}
td++;
for(i=1;i<t->total;i++,td++) {
if (t->con.mode & CON_AXIS0) {
- drawLine(t, td->ob->obmat[3], td->axismtx[0], 'x', 0);
+ drawLine(t, td->ob->obmat[3], td->axismtx[0], 'X', 0);
}
if (t->con.mode & CON_AXIS1) {
- drawLine(t, td->ob->obmat[3], td->axismtx[1], 'y', 0);
+ drawLine(t, td->ob->obmat[3], td->axismtx[1], 'Y', 0);
}
if (t->con.mode & CON_AXIS2) {
- drawLine(t, td->ob->obmat[3], td->axismtx[2], 'z', 0);
+ drawLine(t, td->ob->obmat[3], td->axismtx[2], 'Z', 0);
}
}
}
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 01404603b86..86da5e0a4b5 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -47,6 +47,7 @@
#include "DNA_constraint_types.h"
#include "DNA_scene_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_gpencil_types.h"
#include "MEM_guardedalloc.h"
@@ -57,6 +58,7 @@
#include "BKE_constraint.h"
#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
+#include "BKE_gpencil.h"
#include "BKE_global.h"
#include "BKE_key.h"
#include "BKE_main.h"
@@ -68,6 +70,7 @@
#include "BKE_pointcache.h"
#include "BKE_bmesh.h"
#include "BKE_scene.h"
+#include "BKE_report.h"
#include "ED_anim_api.h"
@@ -88,6 +91,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "RNA_access.h"
@@ -232,7 +236,7 @@ static void set_prop_dist(TransInfo *t, short with_dist)
/* ********************* texture space ********* */
-static void createTransTexspace(bContext *C, TransInfo *t)
+static void createTransTexspace(TransInfo *t)
{
Scene *scene = t->scene;
TransData *td;
@@ -267,6 +271,7 @@ static void createTransTexspace(bContext *C, TransInfo *t)
invert_m3_m3(td->smtx, td->mtx);
if (give_obdata_texspace(ob, &texflag, &td->loc, &td->ext->size, &td->ext->rot)) {
+ ob->dtx |= OB_TEXSPACE;
*texflag &= ~AUTOSPACE;
}
@@ -277,7 +282,7 @@ static void createTransTexspace(bContext *C, TransInfo *t)
/* ********************* edge (for crease) ***** */
-static void createTransEdge(bContext *C, TransInfo *t) {
+static void createTransEdge(TransInfo *t) {
EditMesh *em = ((Mesh *)t->obedit->data)->edit_mesh;
TransData *td = NULL;
EditEdge *eed;
@@ -445,17 +450,22 @@ static short apply_targetless_ik(Object *ob)
/* apply and decompose, doesn't work for constraints or non-uniform scale well */
{
- float rmat3[3][3], qrmat[3][3], imat[3][3], smat[3][3];
-
+ float rmat3[3][3], qrmat[3][3], imat3[3][3], smat[3][3];
+
copy_m3_m4(rmat3, rmat);
/* rotation */
- if (parchan->rotmode > 0)
- mat3_to_eulO( parchan->eul, parchan->rotmode,rmat3);
+ /* [#22409] is partially caused by this, as slight numeric error introduced during
+ * the solving process leads to locked-axis values changing. However, we cannot modify
+ * the values here, or else there are huge discreptancies between IK-solver (interactive)
+ * and applied poses.
+ */
+ if (parchan->rotmode > 0)
+ mat3_to_eulO(parchan->eul, parchan->rotmode,rmat3);
else if (parchan->rotmode == ROT_MODE_AXISANGLE)
- mat3_to_axis_angle( parchan->rotAxis, &pchan->rotAngle,rmat3);
+ mat3_to_axis_angle(parchan->rotAxis, &parchan->rotAngle,rmat3);
else
- mat3_to_quat( parchan->quat,rmat3);
+ mat3_to_quat(parchan->quat,rmat3);
/* for size, remove rotation */
/* causes problems with some constraints (so apply only if needed) */
@@ -467,8 +477,8 @@ static short apply_targetless_ik(Object *ob)
else
quat_to_mat3( qrmat,parchan->quat);
- invert_m3_m3(imat, qrmat);
- mul_m3_m3m3(smat, rmat3, imat);
+ invert_m3_m3(imat3, qrmat);
+ mul_m3_m3m3(smat, rmat3, imat3);
mat3_to_size( parchan->size,smat);
}
@@ -543,13 +553,13 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
QUATCOPY(td->ext->iquat, pchan->quat);
}
- td->rotOrder= pchan->rotmode;
+ td->ext->rotOrder= pchan->rotmode;
/* proper way to get parent transform + own transform + constraints transform */
copy_m3_m4(omat, ob->obmat);
- if (t->mode==TFM_TRANSLATION && (pchan->bone->flag & BONE_NO_LOCAL_LOCATION))
+ if (ELEM(t->mode, TFM_TRANSLATION, TFM_RESIZE) && (pchan->bone->flag & BONE_NO_LOCAL_LOCATION))
unit_m3(bmat);
else
copy_m3_m3(bmat, pchan->bone->bone_mat);
@@ -580,6 +590,19 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
invert_m3_m3(td->smtx, td->mtx);
+ /* exceptional case: rotate the pose bone which also applies transformation
+ * when a parentless bone has BONE_NO_LOCAL_LOCATION [] */
+ if (!ELEM(t->mode, TFM_TRANSLATION, TFM_RESIZE) && (pchan->bone->flag & BONE_NO_LOCAL_LOCATION)) {
+ if(pchan->parent) {
+ /* same as td->smtx but without pchan->bone->bone_mat */
+ td->flag |= TD_PBONE_LOCAL_MTX_C;
+ mul_m3_m3m3(td->ext->l_smtx, pchan->bone->bone_mat, td->smtx);
+ }
+ else {
+ td->flag |= TD_PBONE_LOCAL_MTX_P;
+ }
+ }
+
/* for axismat we use bone's own transform */
copy_m3_m4(pmat, pchan->pose_mat);
mul_m3_m3m3(td->axismtx, omat, pmat);
@@ -660,7 +683,7 @@ int count_set_pose_transflags(int *out_mode, short around, Object *ob)
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
bone = pchan->bone;
- if ((bone->layer & arm->layer) && !(pchan->bone->flag & BONE_HIDDEN_P)) {
+ if (PBONE_VISIBLE(arm, bone)) {
if ((bone->flag & BONE_SELECTED) && !(ob->proxy && pchan->bone->layer & arm->layer_protected))
bone->flag |= BONE_TRANSFORM;
else
@@ -688,9 +711,8 @@ int count_set_pose_transflags(int *out_mode, short around, Object *ob)
for(pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
bone = pchan->bone;
if(bone->flag & BONE_TRANSFORM) {
-
total++;
-
+
if(mode == TFM_TRANSLATION) {
if( has_targetless_ik(pchan)==NULL ) {
if(pchan->parent && (pchan->bone->flag & BONE_CONNECTED)) {
@@ -731,7 +753,7 @@ static void pchan_autoik_adjust (bPoseChannel *pchan, short chainlen)
for (con= pchan->constraints.first; con; con= con->next) {
if (con->type == CONSTRAINT_TYPE_KINEMATIC && (con->enforce!=0.0)) {
bKinematicConstraint *data= con->data;
-
+
/* only accept if a temporary one (for auto-ik) */
if (data->flag & CONSTRAINT_IK_TEMP) {
/* chainlen is new chainlen, but is limited by maximum chainlen */
@@ -780,8 +802,9 @@ static void pose_grab_with_ik_clear(Object *ob)
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
/* clear all temporary lock flags */
pchan->ikflag &= ~(BONE_IK_NO_XDOF_TEMP|BONE_IK_NO_YDOF_TEMP|BONE_IK_NO_ZDOF_TEMP);
-
+
pchan->constflag &= ~(PCHAN_HAS_IK|PCHAN_HAS_TARGET);
+
/* remove all temporary IK-constraints added */
for (con= pchan->constraints.first; con; con= next) {
next= con->next;
@@ -804,9 +827,9 @@ static void pose_grab_with_ik_clear(Object *ob)
/* adds the IK to pchan - returns if added */
static short pose_grab_with_ik_add(bPoseChannel *pchan)
{
+ bKinematicConstraint *targetless = NULL;
bKinematicConstraint *data;
bConstraint *con;
- bConstraint *targetless = 0;
/* Sanity check */
if (pchan == NULL)
@@ -815,15 +838,31 @@ static short pose_grab_with_ik_add(bPoseChannel *pchan)
/* Rule: not if there's already an IK on this channel */
for (con= pchan->constraints.first; con; con= con->next) {
if (con->type==CONSTRAINT_TYPE_KINEMATIC) {
- bKinematicConstraint *data= con->data;
- if(data->tar==NULL || (data->tar->type==OB_ARMATURE && data->subtarget[0]==0)) {
- targetless = con;
+ data= con->data;
+
+ if (data->tar==NULL || (data->tar->type==OB_ARMATURE && data->subtarget[0]=='\0')) {
+ /* make reference to constraint to base things off later (if it's the last targetless constraint encountered) */
+ targetless = (bKinematicConstraint *)con->data;
+
/* but, if this is a targetless IK, we make it auto anyway (for the children loop) */
if (con->enforce!=0.0f) {
- targetless->flag |= CONSTRAINT_IK_AUTO;
- return 0;
+ data->flag |= CONSTRAINT_IK_AUTO;
+
+ /* if no chain length has been specified, just make things obey standard rotation locks too */
+ if (data->rootbone == 0) {
+ for (; pchan; pchan=pchan->parent) {
+ /* here, we set ik-settings for bone from pchan->protectflag */
+ // XXX: careful with quats/axis-angle rotations where we're locking 4d components
+ if (pchan->protectflag & OB_LOCK_ROTX) pchan->ikflag |= BONE_IK_NO_XDOF_TEMP;
+ if (pchan->protectflag & OB_LOCK_ROTY) pchan->ikflag |= BONE_IK_NO_YDOF_TEMP;
+ if (pchan->protectflag & OB_LOCK_ROTZ) pchan->ikflag |= BONE_IK_NO_ZDOF_TEMP;
+ }
+ }
+
+ return 0;
}
}
+
if ((con->flag & CONSTRAINT_DISABLE)==0 && (con->enforce!=0.0f))
return 0;
}
@@ -832,25 +871,32 @@ static short pose_grab_with_ik_add(bPoseChannel *pchan)
con = add_pose_constraint(NULL, pchan, "TempConstraint", CONSTRAINT_TYPE_KINEMATIC);
pchan->constflag |= (PCHAN_HAS_IK|PCHAN_HAS_TARGET); /* for draw, but also for detecting while pose solving */
data= con->data;
- if (targetless) { /* if exists use values from last targetless IK-constraint as base */
- *data = *((bKinematicConstraint*)targetless->data);
+ if (targetless) {
+ /* if exists, use values from last targetless (but disabled) IK-constraint as base */
+ *data = *targetless;
}
else
data->flag= CONSTRAINT_IK_TIP;
data->flag |= CONSTRAINT_IK_TEMP|CONSTRAINT_IK_AUTO;
VECCOPY(data->grabtarget, pchan->pose_tail);
- data->rootbone= 1;
-
- /* we include only a connected chain */
- while ((pchan) && (pchan->bone->flag & BONE_CONNECTED)) {
+ data->rootbone= 0; /* watch-it! has to be 0 here, since we're still on the same bone for the first time through the loop [#25885] */
+
+ /* we only include bones that are part of a continual connected chain */
+ while (pchan) {
/* here, we set ik-settings for bone from pchan->protectflag */
+ // XXX: careful with quats/axis-angle rotations where we're locking 4d components
if (pchan->protectflag & OB_LOCK_ROTX) pchan->ikflag |= BONE_IK_NO_XDOF_TEMP;
if (pchan->protectflag & OB_LOCK_ROTY) pchan->ikflag |= BONE_IK_NO_YDOF_TEMP;
if (pchan->protectflag & OB_LOCK_ROTZ) pchan->ikflag |= BONE_IK_NO_ZDOF_TEMP;
-
+
/* now we count this pchan as being included */
data->rootbone++;
- pchan= pchan->parent;
+
+ /* continue to parent, but only if we're connected to it */
+ if (pchan->bone->flag & BONE_CONNECTED)
+ pchan = pchan->parent;
+ else
+ pchan = NULL;
}
/* make a copy of maximum chain-length */
@@ -930,7 +976,7 @@ static short pose_grab_with_ik(Object *ob)
/* only called with pose mode active object now */
-static void createTransPose(bContext *C, TransInfo *t, Object *ob)
+static void createTransPose(TransInfo *t, Object *ob)
{
bArmature *arm;
bPoseChannel *pchan;
@@ -995,7 +1041,7 @@ static void createTransPose(bContext *C, TransInfo *t, Object *ob)
/* ********************* armature ************** */
-static void createTransArmatureVerts(bContext *C, TransInfo *t)
+static void createTransArmatureVerts(TransInfo *t)
{
EditBone *ebo;
bArmature *arm= t->obedit->data;
@@ -1195,7 +1241,7 @@ static void createTransArmatureVerts(bContext *C, TransInfo *t)
/* ********************* meta elements ********* */
-static void createTransMBallVerts(bContext *C, TransInfo *t)
+static void createTransMBallVerts(TransInfo *t)
{
MetaBall *mb = (MetaBall*)t->obedit->data;
MetaElem *ml;
@@ -1393,7 +1439,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
) {
VECCOPY(td->iloc, bezt->vec[0]);
td->loc= bezt->vec[0];
- VECCOPY(td->center, bezt->vec[1]);
+ VECCOPY(td->center, bezt->vec[(hide_handles || bezt->f2 & SELECT) ? 1:0]);
if (hide_handles) {
if(bezt->f2 & SELECT) td->flag= TD_SELECTED;
else td->flag= 0;
@@ -1452,7 +1498,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
) {
VECCOPY(td->iloc, bezt->vec[2]);
td->loc= bezt->vec[2];
- VECCOPY(td->center, bezt->vec[1]);
+ VECCOPY(td->center, bezt->vec[(hide_handles || bezt->f2 & SELECT) ? 1:2]);
if (hide_handles) {
if(bezt->f2 & SELECT) td->flag= TD_SELECTED;
else td->flag= 0;
@@ -1530,7 +1576,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
/* ********************* lattice *************** */
-static void createTransLatticeVerts(bContext *C, TransInfo *t)
+static void createTransLatticeVerts(TransInfo *t)
{
Lattice *latt = ((Lattice*)t->obedit->data)->editlatt->latt;
TransData *td = NULL;
@@ -1896,7 +1942,7 @@ static void VertsToTransData(TransInfo *t, TransData *td, EditMesh *em, EditVert
/* *********************** CrazySpace correction. Now without doing subsurf optimal ****************** */
-static void make_vertexcos__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+static void make_vertexcos__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
{
float *vec = userData;
@@ -2145,7 +2191,7 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
/* detect CrazySpace [tm] */
if(propmode==0) {
if(modifiers_getCageIndex(t->scene, t->obedit, NULL, 1)>=0) {
- if(modifiers_isCorrectableDeformed(t->scene, t->obedit)) {
+ if(modifiers_isCorrectableDeformed(t->obedit)) {
/* check if we can use deform matrices for modifier from the
start up to stack, they are more accurate than quats */
totleft= editmesh_get_first_deform_matrices(t->scene, t->obedit, em, &defmats, &defcos);
@@ -2274,11 +2320,10 @@ void flushTransNodes(TransInfo *t)
}
/* *** SEQUENCE EDITOR *** */
-#define XXX_DURIAN_ANIM_TX_HACK
void flushTransSeq(TransInfo *t)
{
ListBase *seqbasep= seq_give_editing(t->scene, FALSE)->seqbasep; /* Editing null check already done */
- int a, new_frame;
+ int a, new_frame, old_start;
TransData *td= NULL;
TransData2D *td2d= NULL;
TransDataSeq *tdsq= NULL;
@@ -2295,16 +2340,11 @@ void flushTransSeq(TransInfo *t)
for(a=0, td= t->data, td2d= t->data2d; a<t->total; a++, td++, td2d++) {
tdsq= (TransDataSeq *)td->extra;
seq= tdsq->seq;
+ old_start = seq->start;
new_frame= (int)floor(td2d->loc[0] + 0.5f);
switch (tdsq->sel_flag) {
case SELECT:
-#ifdef XXX_DURIAN_ANIM_TX_HACK
- if (seq != seq_prev) {
- int ofs = (new_frame - tdsq->start_offset) - seq->start; // breaks for single strips - color/image
- seq_offset_animdata(t->scene, seq, ofs);
- }
-#endif
if (seq->type != SEQ_META && (seq->depth != 0 || seq_tx_test(seq))) /* for meta's, their children move */
seq->start= new_frame - tdsq->start_offset;
@@ -2335,6 +2375,9 @@ void flushTransSeq(TransInfo *t)
else {
calc_sequence_disp(t->scene, seq);
}
+
+ if(tdsq->sel_flag == SELECT)
+ seq_offset_animdata(t->scene, seq, seq->start - old_start);
}
seq_prev= seq;
}
@@ -2423,7 +2466,7 @@ static void createTransUVs(bContext *C, TransInfo *t)
EditMesh *em = ((Mesh *)t->obedit->data)->edit_mesh;
EditFace *efa;
- if(!ED_uvedit_test(t->obedit)) return;
+ if(!ED_space_image_show_uvedit(sima, t->obedit)) return;
/* count */
for (efa= em->faces.first; efa; efa= efa->next) {
@@ -2642,6 +2685,7 @@ static void createTransNlaData(bContext *C, TransInfo *t)
for (ale= anim_data.first; ale; ale= ale->next) {
/* only if a real NLA-track */
if (ale->type == ANIMTYPE_NLATRACK) {
+ AnimData *adt = ale->adt;
NlaTrack *nlt= (NlaTrack *)ale->data;
NlaStrip *strip;
@@ -2666,7 +2710,7 @@ static void createTransNlaData(bContext *C, TransInfo *t)
tdn->id= ale->id;
tdn->oldTrack= tdn->nlt= nlt;
tdn->strip= strip;
- tdn->trackIndex= BLI_findindex(&nlt->strips, strip);
+ tdn->trackIndex= BLI_findindex(&adt->nla_tracks, nlt);
yval= (float)(tdn->trackIndex * NLACHANNEL_STEP);
@@ -2767,7 +2811,6 @@ static void createTransNlaData(bContext *C, TransInfo *t)
* It also makes sure gp-frames are still stored in chronological order after
* transform.
*/
-#if 0
static void posttrans_gpd_clean (bGPdata *gpd)
{
bGPDlayer *gpl;
@@ -2776,17 +2819,17 @@ static void posttrans_gpd_clean (bGPdata *gpd)
ListBase sel_buffer = {NULL, NULL};
bGPDframe *gpf, *gpfn;
bGPDframe *gfs, *gfsn;
-
+
/* loop 1: loop through and isolate selected gp-frames to buffer
* (these need to be sorted as they are isolated)
*/
for (gpf= gpl->frames.first; gpf; gpf= gpfn) {
short added= 0;
gpfn= gpf->next;
-
+
if (gpf->flag & GP_FRAME_SELECT) {
BLI_remlink(&gpl->frames, gpf);
-
+
/* find place to add them in buffer
* - go backwards as most frames will still be in order,
* so doing it this way will be faster
@@ -2803,27 +2846,27 @@ static void posttrans_gpd_clean (bGPdata *gpd)
BLI_addhead(&sel_buffer, gpf);
}
}
-
+
/* error checking: it is unlikely, but may be possible to have none selected */
if (sel_buffer.first == NULL)
continue;
-
+
/* if all were selected (i.e. gpl->frames is empty), then just transfer sel-buf over */
if (gpl->frames.first == NULL) {
gpl->frames.first= sel_buffer.first;
gpl->frames.last= sel_buffer.last;
-
+
continue;
}
-
+
/* loop 2: remove duplicates of frames in buffers */
for (gpf= gpl->frames.first; gpf && sel_buffer.first; gpf= gpfn) {
gpfn= gpf->next;
-
+
/* loop through sel_buffer, emptying stuff from front of buffer if ok */
for (gfs= sel_buffer.first; gfs && gpf; gfs= gfsn) {
gfsn= gfs->next;
-
+
/* if this buffer frame needs to go before current, add it! */
if (gfs->framenum < gpf->framenum) {
/* transfer buffer frame to frames list (before current) */
@@ -2835,24 +2878,22 @@ static void posttrans_gpd_clean (bGPdata *gpd)
/* transfer buffer frame to frames list (before current) */
BLI_remlink(&sel_buffer, gfs);
BLI_insertlinkbefore(&gpl->frames, gpf, gfs);
-
+
/* get rid of current frame */
- // TRANSFORM_FIX_ME
- //gpencil_layer_delframe(gpl, gpf);
+ gpencil_layer_delframe(gpl, gpf);
}
}
}
-
+
/* if anything is still in buffer, append to end */
for (gfs= sel_buffer.first; gfs; gfs= gfsn) {
gfsn= gfs->next;
-
+
BLI_remlink(&sel_buffer, gfs);
BLI_addtail(&gpl->frames, gfs);
}
}
}
-#endif
/* Called during special_aftertrans_update to make sure selected keyframes replace
* any other keyframes which may reside on that frame (that is not selected).
@@ -2975,15 +3016,14 @@ static int count_fcurve_keys(FCurve *fcu, char side, float cfra)
}
/* fully select selected beztriples, but only include if it's on the right side of cfra */
-#if 0
static int count_gplayer_frames(bGPDlayer *gpl, char side, float cfra)
{
bGPDframe *gpf;
int count = 0;
-
+
if (gpl == NULL)
return count;
-
+
/* only include points that occur on the right side of cfra */
for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
if (gpf->flag & GP_FRAME_SELECT) {
@@ -2991,10 +3031,9 @@ static int count_gplayer_frames(bGPDlayer *gpl, char side, float cfra)
count++;
}
}
-
+
return count;
}
-#endif
/* This function assigns the information to transdata */
static void TimeToTransData(TransData *td, float *time, AnimData *adt)
@@ -3031,23 +3070,23 @@ static TransData *ActionFCurveToTransData(TransData *td, TransData2D **td2dv, FC
/* only add if on the right 'side' of the current frame */
if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) {
TimeToTransData(td, bezt->vec[1], adt);
-
+
/*set flags to move handles as necassary*/
td->flag |= TD_MOVEHANDLE1|TD_MOVEHANDLE2;
td2d->h1 = bezt->vec[0];
td2d->h2 = bezt->vec[2];
-
+
VECCOPY2D(td2d->ih1, td2d->h1);
VECCOPY2D(td2d->ih2, td2d->h2);
-
+
td++;
td2d++;
}
}
}
-
+
*td2dv = td2d;
-
+
return td;
}
@@ -3082,12 +3121,11 @@ void flushTransGPactionData (TransInfo *t)
* The 'side' argument is needed for the extend mode. 'B' = both sides, 'R'/'L' mean only data
* on the named side are used.
*/
-#if 0
static int GPLayerToTransData (TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl, char side, float cfra)
{
bGPDframe *gpf;
int count= 0;
-
+
/* check for select frames on right side of current frame */
for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
if (gpf->flag & GP_FRAME_SELECT) {
@@ -3095,10 +3133,10 @@ static int GPLayerToTransData (TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl
/* memory is calloc'ed, so that should zero everything nicely for us */
td->val= &tfd->val;
td->ival= (float)gpf->framenum;
-
+
tfd->val= (float)gpf->framenum;
tfd->sdata= &gpf->framenum;
-
+
/* advance td now */
td++;
tfd++;
@@ -3106,10 +3144,9 @@ static int GPLayerToTransData (TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl
}
}
}
-
+
return count;
}
-#endif
static void createTransActionData(bContext *C, TransInfo *t)
{
@@ -3162,10 +3199,10 @@ static void createTransActionData(bContext *C, TransInfo *t)
else
cfra = (float)CFRA;
- //if (ale->type == ANIMTYPE_GPLAYER)
- // count += count_gplayer_frames(ale->data, t->frame_side, cfra);
- //else
+ if (ale->type == ANIMTYPE_FCURVE)
count += count_fcurve_keys(ale->key_data, t->frame_side, cfra);
+ else
+ count += count_gplayer_frames(ale->data, t->frame_side, cfra);
}
/* stop if trying to build list if nothing selected */
@@ -3198,15 +3235,15 @@ static void createTransActionData(bContext *C, TransInfo *t)
/* loop 2: build transdata array */
for (ale= anim_data.first; ale; ale= ale->next) {
- //if (ale->type == ANIMTYPE_GPLAYER) {
- // bGPDlayer *gpl= (bGPDlayer *)ale->data;
- // int i;
- //
- // i = GPLayerToTransData(td, tfd, gpl, t->frame_side, cfra);
- // td += i;
- // tfd += i;
- //}
- //else {
+ if (ale->type == ANIMTYPE_GPLAYER) {
+ bGPDlayer *gpl= (bGPDlayer *)ale->data;
+ int i;
+
+ i = GPLayerToTransData(td, tfd, gpl, t->frame_side, cfra);
+ td += i;
+ tfd += i;
+ }
+ else {
AnimData *adt= ANIM_nla_mapping_get(&ac, ale);
FCurve *fcu= (FCurve *)ale->key_data;
@@ -3219,7 +3256,7 @@ static void createTransActionData(bContext *C, TransInfo *t)
cfra = (float)CFRA;
td= ActionFCurveToTransData(td, &td2d, fcu, adt, t->frame_side, cfra);
- //}
+ }
}
/* check if we're supposed to be setting minx/maxx for TimeSlide */
@@ -3329,7 +3366,7 @@ static void bezt_to_transdata (TransData *td, TransData2D *td2d, AnimData *adt,
static void createTransGraphEditData(bContext *C, TransInfo *t)
{
- SpaceIpo *sipo= CTX_wm_space_graph(C);
+ SpaceIpo *sipo = (SpaceIpo *)t->sa->spacedata.first;
Scene *scene= t->scene;
ARegion *ar= t->ar;
View2D *v2d= &ar->v2d;
@@ -3346,6 +3383,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
int count=0, i;
float cfra;
float mtx[3][3], smtx[3][3];
+ const short use_handle = !(sipo->flag & SIPO_NOHANDLES);
/* determine what type of data we are operating on */
if (ANIM_animdata_get_context(C, &ac) == 0)
@@ -3389,13 +3427,17 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
/* only include BezTriples whose 'keyframe' occurs on the same side of the current frame as mouse */
for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
if (FrameOnMouseSide(t->frame_side, bezt->vec[1][0], cfra)) {
+ const char sel1= use_handle ? bezt->f1 & SELECT : 0;
+ const char sel2= bezt->f2 & SELECT;
+ const char sel3= use_handle ? bezt->f3 & SELECT : 0;
+
if (ELEM3(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE, TFM_TIME_SLIDE)) {
/* for 'normal' pivots - just include anything that is selected.
this works a bit differently in translation modes */
- if (bezt->f2 & SELECT) count++;
+ if (sel2) count++;
else {
- if (bezt->f1 & SELECT) count++;
- if (bezt->f3 & SELECT) count++;
+ if (sel1) count++;
+ if (sel3) count++;
}
}
else if (sipo->around == V3D_LOCAL) {
@@ -3403,17 +3445,17 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
* don't get moved wrong
*/
if (bezt->ipo == BEZT_IPO_BEZ) {
- if (bezt->f1 & SELECT) count++;
- if (bezt->f3 & SELECT) count++;
+ if (sel1) count++;
+ if (sel3) count++;
}
- /* else if (bezt->f2 & SELECT) count++; // TODO: could this cause problems? */
+ /* else if (sel2) count++; // TODO: could this cause problems? */
/* - yes this causes problems, because no td is created for the center point */
}
else {
/* for 'normal' pivots - just include anything that is selected */
- if (bezt->f1 & SELECT) count++;
- if (bezt->f2 & SELECT) count++;
- if (bezt->f3 & SELECT) count++;
+ if (sel1) count++;
+ if (sel2) count++;
+ if (sel3) count++;
}
}
}
@@ -3478,21 +3520,25 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
/* only include BezTriples whose 'keyframe' occurs on the same side of the current frame as mouse (if applicable) */
for (i=0, bezt= fcu->bezt; i < fcu->totvert; i++, bezt++) {
if (FrameOnMouseSide(t->frame_side, bezt->vec[1][0], cfra)) {
+ const char sel1= use_handle ? bezt->f1 & SELECT : 0;
+ const char sel2= bezt->f2 & SELECT;
+ const char sel3= use_handle ? bezt->f3 & SELECT : 0;
+
TransDataCurveHandleFlags *hdata = NULL;
short h1=1, h2=1;
/* only include handles if selected, irrespective of the interpolation modes.
* also, only treat handles specially if the center point isn't selected.
*/
- if (!ELEM3(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE, TFM_TIME_SLIDE) || !(bezt->f2 & SELECT)) {
- if (bezt->f1 & SELECT) {
+ if (!ELEM3(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE, TFM_TIME_SLIDE) || !(sel2)) {
+ if (sel1) {
hdata = initTransDataCurveHandles(td, bezt);
bezt_to_transdata(td++, td2d++, adt, bezt, 0, 1, 1, intvals, mtx, smtx);
}
else
h1= 0;
- if (bezt->f3 & SELECT) {
+ if (sel3) {
if (hdata==NULL)
hdata = initTransDataCurveHandles(td, bezt);
bezt_to_transdata(td++, td2d++, adt, bezt, 2, 1, 1, intvals, mtx, smtx);
@@ -3502,16 +3548,16 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
}
/* only include main vert if selected */
- if (bezt->f2 & SELECT && (sipo->around != V3D_LOCAL || ELEM3(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE, TFM_TIME_SLIDE))) {
+ if (sel2 && (sipo->around != V3D_LOCAL || ELEM3(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE, TFM_TIME_SLIDE))) {
/* move handles relative to center */
if (ELEM3(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE, TFM_TIME_SLIDE)) {
- if (bezt->f1 & SELECT) td->flag |= TD_MOVEHANDLE1;
- if (bezt->f3 & SELECT) td->flag |= TD_MOVEHANDLE2;
+ if (sel1) td->flag |= TD_MOVEHANDLE1;
+ if (sel3) td->flag |= TD_MOVEHANDLE2;
}
/* if handles were not selected, store their selection status */
- if (!(bezt->f1 & SELECT) && !(bezt->f3 & SELECT)) {
+ if (!(sel1) && !(sel3)) {
if (hdata == NULL)
hdata = initTransDataCurveHandles(td, bezt);
}
@@ -3525,7 +3571,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
* - If so, change them auto-handles to aligned handles so that handles get affected too
*/
if ((bezt->h1 == HD_AUTO) && (bezt->h2 == HD_AUTO) && ELEM(t->mode, TFM_ROTATION, TFM_RESIZE)) {
- if (hdata && (bezt->f1 & SELECT) && (bezt->f3 & SELECT)) {
+ if (hdata && (sel1) && (sel3)) {
bezt->h1= HD_ALIGN;
bezt->h2= HD_ALIGN;
}
@@ -3544,20 +3590,20 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
/* ------------------------ */
-/* struct for use in re-sorting BezTriples during IPO transform */
+/* struct for use in re-sorting BezTriples during Graph Editor transform */
typedef struct BeztMap {
BezTriple *bezt;
- int oldIndex; /* index of bezt in icu->bezt array before sorting */
- int newIndex; /* index of bezt in icu->bezt array after sorting */
- short swapHs; /* swap order of handles (-1=clear; 0=not checked, 1=swap) */
- char pipo, cipo; /* interpolation of current and next segments */
+ unsigned int oldIndex; /* index of bezt in fcu->bezt array before sorting */
+ unsigned int newIndex; /* index of bezt in fcu->bezt array after sorting */
+ short swapHs; /* swap order of handles (-1=clear; 0=not checked, 1=swap) */
+ char pipo, cipo; /* interpolation of current and next segments */
} BeztMap;
/* This function converts an FCurve's BezTriple array to a BeztMap array
* NOTE: this allocates memory that will need to get freed later
*/
-static BeztMap *bezt_to_beztmaps (BezTriple *bezts, int totvert)
+static BeztMap *bezt_to_beztmaps (BezTriple *bezts, int totvert, const short UNUSED(use_handle))
{
BezTriple *bezt= bezts;
BezTriple *prevbezt= NULL;
@@ -3584,7 +3630,7 @@ static BeztMap *bezt_to_beztmaps (BezTriple *bezts, int totvert)
}
/* This function copies the code of sort_time_ipocurve, but acts on BeztMap structs instead */
-static void sort_time_beztmaps (BeztMap *bezms, int totvert)
+static void sort_time_beztmaps (BeztMap *bezms, int totvert, const short UNUSED(use_handle))
{
BeztMap *bezm;
int i, ok= 1;
@@ -3630,7 +3676,7 @@ static void sort_time_beztmaps (BeztMap *bezms, int totvert)
}
/* This function firstly adjusts the pointers that the transdata has to each BezTriple */
-static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totvert)
+static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totvert, const short use_handle)
{
BezTriple *bezts = fcu->bezt;
BeztMap *bezm;
@@ -3657,7 +3703,7 @@ static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totv
/* only selected verts */
if (bezm->pipo == BEZT_IPO_BEZ) {
- if (bezm->bezt->f1 & SELECT) {
+ if (use_handle && bezm->bezt->f1 & SELECT) {
if (td->loc2d == bezm->bezt->vec[0]) {
if (bezm->swapHs == 1)
td->loc2d= (bezts + bezm->newIndex)->vec[2];
@@ -3668,7 +3714,7 @@ static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totv
}
}
if (bezm->cipo == BEZT_IPO_BEZ) {
- if (bezm->bezt->f3 & SELECT) {
+ if (use_handle && bezm->bezt->f3 & SELECT) {
if (td->loc2d == bezm->bezt->vec[2]) {
if (bezm->swapHs == 1)
td->loc2d= (bezts + bezm->newIndex)->vec[0];
@@ -3681,11 +3727,11 @@ static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totv
if (bezm->bezt->f2 & SELECT) {
if (td->loc2d == bezm->bezt->vec[1]) {
td->loc2d= (bezts + bezm->newIndex)->vec[1];
-
+
/* if only control point is selected, the handle pointers need to be updated as well */
td->h1= (bezts + bezm->newIndex)->vec[0];
td->h2= (bezts + bezm->newIndex)->vec[2];
-
+
adjusted[j] = 1;
}
}
@@ -3706,7 +3752,9 @@ static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totv
*/
void remake_graph_transdata (TransInfo *t, ListBase *anim_data)
{
+ SpaceIpo *sipo = (SpaceIpo *)t->sa->spacedata.first;
bAnimListElem *ale;
+ const short use_handle = !(sipo->flag & SIPO_NOHANDLES);
/* sort and reassign verts */
for (ale= anim_data->first; ale; ale= ale->next) {
@@ -3716,9 +3764,9 @@ void remake_graph_transdata (TransInfo *t, ListBase *anim_data)
BeztMap *bezm;
/* adjust transform-data pointers */
- bezm= bezt_to_beztmaps(fcu->bezt, fcu->totvert);
- sort_time_beztmaps(bezm, fcu->totvert);
- beztmap_to_data(t, fcu, bezm, fcu->totvert);
+ bezm= bezt_to_beztmaps(fcu->bezt, fcu->totvert, use_handle);
+ sort_time_beztmaps(bezm, fcu->totvert, use_handle);
+ beztmap_to_data(t, fcu, bezm, fcu->totvert, use_handle);
/* free mapping stuff */
MEM_freeN(bezm);
@@ -3766,7 +3814,7 @@ void flushTransGraphData(TransInfo *t)
break;
}
}
-
+
/* we need to unapply the nla-mapping from the time in some situations */
if (adt)
td2d->loc2d[0]= BKE_nla_tweakedit_remap(adt, td2d->loc[0], NLATIME_CONVERT_UNMAP);
@@ -3778,12 +3826,12 @@ void flushTransGraphData(TransInfo *t)
td2d->loc2d[1]= (float)((int)td2d->loc[1]);
else
td2d->loc2d[1]= td2d->loc[1];
-
+
if ((td->flag & TD_MOVEHANDLE1) && td2d->h1) {
td2d->h1[0] = td2d->ih1[0] + td->loc[0] - td->iloc[0];
td2d->h1[1] = td2d->ih1[1] + td->loc[1] - td->iloc[1];
}
-
+
if ((td->flag & TD_MOVEHANDLE2) && td2d->h2) {
td2d->h2[0] = td2d->ih2[0] + td->loc[0] - td->iloc[0];
td2d->h2[1] = td2d->ih2[1] + td->loc[1] - td->iloc[1];
@@ -3791,47 +3839,7 @@ void flushTransGraphData(TransInfo *t)
}
}
-/* *************************** Object Transform data ******************* */
-
-/* Little helper function for ObjectToTransData used to give certain
- * constraints (ChildOf, FollowPath, and others that may be added)
- * inverse corrections for transform, so that they aren't in CrazySpace.
- * These particular constraints benefit from this, but others don't, hence
- * this semi-hack ;-) - Aligorith
- */
-static short constraints_list_needinv(TransInfo *t, ListBase *list)
-{
- bConstraint *con;
-
- /* loop through constraints, checking if there's one of the mentioned
- * constraints needing special crazyspace corrections
- */
- if (list) {
- for (con= list->first; con; con=con->next) {
- /* only consider constraint if it is enabled, and has influence on result */
- if ((con->flag & CONSTRAINT_DISABLE)==0 && (con->enforce!=0.0)) {
- /* (affirmative) returns for specific constraints here... */
- /* constraints that require this regardless */
- if (con->type == CONSTRAINT_TYPE_CHILDOF) return 1;
- if (con->type == CONSTRAINT_TYPE_FOLLOWPATH) return 1;
- if (con->type == CONSTRAINT_TYPE_CLAMPTO) return 1;
-
- /* constraints that require this only under special conditions */
- if (con->type == CONSTRAINT_TYPE_ROTLIKE) {
- /* CopyRot constraint only does this when rotating, and offset is on */
- bRotateLikeConstraint *data = (bRotateLikeConstraint *)con->data;
-
- if ((data->flag & ROTLIKE_OFFSET) && (t->mode == TFM_ROTATION))
- return 1;
- }
- }
- }
- }
-
- /* no appropriate candidates found */
- return 0;
-}
-
+/* ******************* Sequencer Transform data ******************* */
/* This function applies the rules for transforming a strip so duplicate
* checks dont need to be added in multiple places.
@@ -3841,14 +3849,20 @@ static short constraints_list_needinv(TransInfo *t, ListBase *list)
* seq->depth must be set before running this function so we know if the strips
* are root level or not
*/
+#define XXX_DURIAN_ANIM_TX_HACK
static void SeqTransInfo(TransInfo *t, Sequence *seq, int *recursive, int *count, int *flag)
{
#ifdef XXX_DURIAN_ANIM_TX_HACK
/* hack */
if((seq->flag & SELECT)==0 && seq->type & SEQ_EFFECT) {
- Sequence *seq_t[3] = {seq->seq1, seq->seq2, seq->seq3};
+ Sequence *seq_t[3];
int i;
+
+ seq_t[0]= seq->seq1;
+ seq_t[1]= seq->seq2;
+ seq_t[2]= seq->seq3;
+
for(i=0; i<3; i++) {
if (seq_t[i] && ((seq_t[i])->flag & SELECT) && !(seq_t[i]->flag & SEQ_LOCK) && !(seq_t[i]->flag & (SEQ_LEFTSEL|SEQ_RIGHTSEL)))
seq->flag |= SELECT;
@@ -3978,7 +3992,7 @@ static int SeqTransCount(TransInfo *t, ListBase *seqbase, int depth)
}
-static TransData *SeqToTransData(TransInfo *t, TransData *td, TransData2D *td2d, TransDataSeq *tdsq, Sequence *seq, int flag, int sel_flag)
+static TransData *SeqToTransData(TransData *td, TransData2D *td2d, TransDataSeq *tdsq, Sequence *seq, int flag, int sel_flag)
{
int start_left;
@@ -4063,16 +4077,16 @@ static int SeqToTransData_Recursive(TransInfo *t, ListBase *seqbase, TransData *
if (flag & SELECT) {
if (flag & (SEQ_LEFTSEL|SEQ_RIGHTSEL)) {
if (flag & SEQ_LEFTSEL) {
- SeqToTransData(t, td++, td2d++, tdsq++, seq, flag, SEQ_LEFTSEL);
+ SeqToTransData(td++, td2d++, tdsq++, seq, flag, SEQ_LEFTSEL);
tot++;
}
if (flag & SEQ_RIGHTSEL) {
- SeqToTransData(t, td++, td2d++, tdsq++, seq, flag, SEQ_RIGHTSEL);
+ SeqToTransData(td++, td2d++, tdsq++, seq, flag, SEQ_RIGHTSEL);
tot++;
}
}
else {
- SeqToTransData(t, td++, td2d++, tdsq++, seq, flag, SELECT);
+ SeqToTransData(td++, td2d++, tdsq++, seq, flag, SELECT);
tot++;
}
}
@@ -4231,8 +4245,49 @@ static void createTransSeqData(bContext *C, TransInfo *t)
}
+/* *********************** Object Transform data ******************* */
+
+/* Little helper function for ObjectToTransData used to give certain
+ * constraints (ChildOf, FollowPath, and others that may be added)
+ * inverse corrections for transform, so that they aren't in CrazySpace.
+ * These particular constraints benefit from this, but others don't, hence
+ * this semi-hack ;-) - Aligorith
+ */
+static short constraints_list_needinv(TransInfo *t, ListBase *list)
+{
+ bConstraint *con;
+
+ /* loop through constraints, checking if there's one of the mentioned
+ * constraints needing special crazyspace corrections
+ */
+ if (list) {
+ for (con= list->first; con; con=con->next) {
+ /* only consider constraint if it is enabled, and has influence on result */
+ if ((con->flag & CONSTRAINT_DISABLE)==0 && (con->enforce!=0.0)) {
+ /* (affirmative) returns for specific constraints here... */
+ /* constraints that require this regardless */
+ if (con->type == CONSTRAINT_TYPE_CHILDOF) return 1;
+ if (con->type == CONSTRAINT_TYPE_FOLLOWPATH) return 1;
+ if (con->type == CONSTRAINT_TYPE_CLAMPTO) return 1;
+
+ /* constraints that require this only under special conditions */
+ if (con->type == CONSTRAINT_TYPE_ROTLIKE) {
+ /* CopyRot constraint only does this when rotating, and offset is on */
+ bRotateLikeConstraint *data = (bRotateLikeConstraint *)con->data;
+
+ if ((data->flag & ROTLIKE_OFFSET) && (t->mode == TFM_ROTATION))
+ return 1;
+ }
+ }
+ }
+ }
+
+ /* no appropriate candidates found */
+ return 0;
+}
+
/* transcribe given object into TransData for Transforming */
-static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object *ob)
+static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
{
Scene *scene = t->scene;
float obmtx[3][3];
@@ -4290,8 +4345,8 @@ static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object *
td->ext->irotAngle= ob->rotAngle;
VECCOPY(td->ext->irotAxis, ob->rotAxis);
- td->ext->drotAngle= ob->drotAngle;
- VECCOPY(td->ext->drotAxis, ob->drotAxis);
+ // td->ext->drotAngle= ob->drotAngle; // XXX, not implimented
+ // VECCOPY(td->ext->drotAxis, ob->drotAxis); // XXX, not implimented
}
else {
td->ext->rot= NULL;
@@ -4302,7 +4357,7 @@ static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object *
QUATCOPY(td->ext->iquat, ob->quat);
QUATCOPY(td->ext->dquat, ob->dquat);
}
- td->rotOrder=ob->rotmode;
+ td->ext->rotOrder=ob->rotmode;
td->ext->size = ob->size;
VECCOPY(td->ext->isize, ob->size);
@@ -4342,7 +4397,7 @@ static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object *
/* sets flags in Bases to define whether they take part in transform */
/* it deselects Bases, so we have to call the clear function always after */
-static void set_trans_object_base_flags(bContext *C, TransInfo *t)
+static void set_trans_object_base_flags(TransInfo *t)
{
Scene *scene = t->scene;
View3D *v3d = t->view;
@@ -4377,8 +4432,11 @@ static void set_trans_object_base_flags(bContext *C, TransInfo *t)
while(parsel) {
if(parsel->flag & SELECT) {
Base *parbase = object_in_scene(parsel, scene);
- if TESTBASELIB_BGMODE(v3d, scene, parbase)
+ if(parbase) { /* in rare cases this can fail */
+ if TESTBASELIB_BGMODE(v3d, scene, parbase) {
break;
+ }
+ }
}
parsel= parsel->parent;
}
@@ -4516,6 +4574,7 @@ void autokeyframe_ob_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *ob,
// TODO: this should probably be done per channel instead...
if (autokeyframe_cfra_can_key(scene, id)) {
+ ReportList *reports = CTX_wm_reports(C);
KeyingSet *active_ks = ANIM_scene_get_active_keyingset(scene);
ListBase dsources = {NULL, NULL};
float cfra= (float)CFRA; // xxx this will do for now
@@ -4527,24 +4586,24 @@ void autokeyframe_ob_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *ob,
/* add datasource override for the camera object */
ANIM_relative_keyingset_add_source(&dsources, id, NULL, NULL);
- if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (active_ks)) {
+ if (IS_AUTOKEY_FLAG(scene, ONLYKEYINGSET) && (active_ks)) {
/* only insert into active keyingset
* NOTE: we assume here that the active Keying Set does not need to have its iterator overridden spe
*/
ANIM_apply_keyingset(C, &dsources, NULL, active_ks, MODIFYKEY_MODE_INSERT, cfra);
}
- else if (IS_AUTOKEY_FLAG(INSERTAVAIL)) {
+ else if (IS_AUTOKEY_FLAG(scene, INSERTAVAIL)) {
AnimData *adt= ob->adt;
/* only key on available channels */
if (adt && adt->action) {
for (fcu= adt->action->curves.first; fcu; fcu= fcu->next) {
fcu->flag &= ~FCURVE_SELECTED;
- insert_keyframe(id, adt->action, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
+ insert_keyframe(reports, id, adt->action, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
}
}
}
- else if (IS_AUTOKEY_FLAG(INSERTNEEDED)) {
+ else if (IS_AUTOKEY_FLAG(scene, INSERTNEEDED)) {
short doLoc=0, doRot=0, doScale=0;
/* filter the conditions when this happens (assume that curarea->spacetype==SPACE_VIE3D) */
@@ -4615,6 +4674,7 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o
// TODO: this should probably be done per channel instead...
if (autokeyframe_cfra_can_key(scene, id)) {
+ ReportList *reports = CTX_wm_reports(C);
KeyingSet *active_ks = ANIM_scene_get_active_keyingset(scene);
float cfra= (float)CFRA;
short flag= 0;
@@ -4640,12 +4700,12 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o
ANIM_relative_keyingset_add_source(&dsources, id, &RNA_PoseBone, pchan);
/* only insert into active keyingset? */
- if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (active_ks)) {
+ if (IS_AUTOKEY_FLAG(scene, ONLYKEYINGSET) && (active_ks)) {
/* run the active Keying Set on the current datasource */
ANIM_apply_keyingset(C, &dsources, NULL, active_ks, MODIFYKEY_MODE_INSERT, cfra);
}
/* only insert into available channels? */
- else if (IS_AUTOKEY_FLAG(INSERTAVAIL)) {
+ else if (IS_AUTOKEY_FLAG(scene, INSERTAVAIL)) {
if (act) {
for (fcu= act->curves.first; fcu; fcu= fcu->next) {
/* only insert keyframes for this F-Curve if it affects the current bone */
@@ -4656,7 +4716,7 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o
* NOTE: this will do constraints too, but those are ok to do here too?
*/
if (pchanName && strcmp(pchanName, pchan->name) == 0)
- insert_keyframe(id, act, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
+ insert_keyframe(reports, id, act, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
if (pchanName) MEM_freeN(pchanName);
}
@@ -4664,7 +4724,7 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o
}
}
/* only insert keyframe if needed? */
- else if (IS_AUTOKEY_FLAG(INSERTNEEDED)) {
+ else if (IS_AUTOKEY_FLAG(scene, INSERTNEEDED)) {
short doLoc=0, doRot=0, doScale=0;
/* filter the conditions when this happens (assume that curarea->spacetype==SPACE_VIE3D) */
@@ -4720,7 +4780,7 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o
*/
if (C && (ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS)) {
//ED_pose_clear_paths(C, ob); // XXX for now, don't need to clear
- ED_pose_recalculate_paths(C, scene, ob);
+ ED_pose_recalculate_paths(scene, ob);
}
}
else {
@@ -4828,9 +4888,9 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
// fixme... some of this stuff is not good
if (ob) {
if (ob->pose || ob_get_key(ob))
- DAG_id_flush_update(&ob->id, OB_RECALC_ALL);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME);
else
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
}
/* Do curve cleanups? */
@@ -4853,28 +4913,25 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
else if (ELEM(t->frame_side, 'L', 'R'))
scene_marker_tfm_extend(t->scene, floor(t->vec[0] + 0.5f), SELECT, t->scene->r.cfra, t->frame_side);
}
+ else if(t->mode == TFM_TIME_SCALE) {
+ scene_marker_tfm_scale(t->scene, t->vec[0], SELECT);
+ }
}
-
-#if 0 // XXX future of this is still not clear
+
else if (ac.datatype == ANIMCONT_GPENCIL) {
/* remove duplicate frames and also make sure points are in order! */
if ((cancelled == 0) || (duplicate))
{
- bScreen *sc= (bScreen *)ac.data;
- ScrArea *sa;
+ bGPdata *gpd;
- /* BAD... we need to loop over all screen areas for current screen...
- * - sync this with actdata_filter_gpencil() in editaction.c
- */
- for (sa= sc->areabase.first; sa; sa= sa->next) {
- bGPdata *gpd= gpencil_data_get_active(sa);
-
- if (gpd)
+ // XXX: BAD! this get gpencil datablocks directly from main db...
+ // but that's how this currently works :/
+ for (gpd = G.main->gpencil.first; gpd; gpd = gpd->id.next) {
+ if (ID_REAL_USERS(gpd) > 1)
posttrans_gpd_clean(gpd);
}
}
}
-#endif // XXX future of this is still not clear
/* make sure all F-Curves are set correctly */
ANIM_editkeyframes_refresh(&ac);
@@ -4996,15 +5053,15 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
/* automatic inserting of keys and unkeyed tagging - only if transform wasn't cancelled (or TFM_DUMMY) */
if (!cancelled && (t->mode != TFM_DUMMY)) {
autokeyframe_pose_cb_func(C, t->scene, (View3D *)t->view, ob, t->mode, targetless_ik);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else if (arm->flag & ARM_DELAYDEFORM) {
/* old optimize trick... this enforces to bypass the depgraph */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
ob->recalc= 0; // is set on OK position already by recalcData()
}
else
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else if(t->scene->basact && (ob = t->scene->basact->object) && (ob->mode & OB_MODE_PARTICLE_EDIT) && PE_get_current(t->scene, ob)) {
@@ -5015,10 +5072,10 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
for (i = 0; i < t->total; i++) {
TransData *td = t->data + i;
- Object *ob = td->ob;
ListBase pidlist;
PTCacheID *pid;
-
+ ob = td->ob;
+
if (td->flag & TD_NOACTION)
break;
@@ -5041,7 +5098,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
/* Creates troubles for moving animated objects without */
/* autokey though, probably needed is an anim sys override? */
/* Please remove if some other solution is found. -jahka */
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
/* Set autokey if necessary */
if (!cancelled) {
@@ -5059,21 +5116,22 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
if (C && recalcObPaths) {
//ED_objects_clear_paths(C); // XXX for now, don't need to clear
ED_objects_recalculate_paths(C, t->scene);
+
+ /* recalculating the frame positions means we loose our original transform if its not auto-keyed [#24451]
+ * this hack re-applies it, which is annoying, only alternatives are...
+ * - dont recalc paths.
+ * - have an object_handle_update() which gives is the new transform without touching the objects.
+ * - only recalc paths on auto-keying.
+ * - ED_objects_recalculate_paths could backup/restore transforms.
+ * - re-apply the transform which is simplest in this case. (2 lines below)
+ */
+ t->redraw |= TREDRAW_HARD;
+ transformApply(C, t);
}
}
clear_trans_object_base_flags(t);
- if(t->spacetype == SPACE_VIEW3D)
- {
- View3D *v3d = t->view;
-
- /* restore manipulator */
- if (t->flag & T_MODAL) {
- v3d->twtype = t->twtype;
- }
- }
-
#if 0 // TRANSFORM_FIX_ME
if(resetslowpar)
@@ -5091,7 +5149,7 @@ static void createTransObject(bContext *C, TransInfo *t)
TransDataExtension *tx;
int propmode = t->flag & T_PROP_EDIT;
- set_trans_object_base_flags(C, t);
+ set_trans_object_base_flags(t);
/* count */
t->total= CTX_DATA_COUNT(C, selected_objects);
@@ -5117,7 +5175,7 @@ static void createTransObject(bContext *C, TransInfo *t)
td->flag = TD_SELECTED;
td->protectflag= ob->protectflag;
td->ext = tx;
- td->rotOrder= ob->rotmode;
+ td->ext->rotOrder= ob->rotmode;
if (base->flag & BA_TRANSFORM_CHILD)
{
@@ -5130,7 +5188,7 @@ static void createTransObject(bContext *C, TransInfo *t)
td->flag |= TD_SKIP;
}
- ObjectToTransData(C, t, td, ob);
+ ObjectToTransData(t, td, ob);
td->val = NULL;
td++;
tx++;
@@ -5151,9 +5209,9 @@ static void createTransObject(bContext *C, TransInfo *t)
{
td->protectflag= ob->protectflag;
td->ext = tx;
- td->rotOrder= ob->rotmode;
+ td->ext->rotOrder= ob->rotmode;
- ObjectToTransData(C, t, td, ob);
+ ObjectToTransData(t, td, ob);
td->val = NULL;
td++;
tx++;
@@ -5210,12 +5268,12 @@ void createTransData(bContext *C, TransInfo *t)
if (t->options & CTX_TEXTURE) {
t->flag |= T_TEXTURE;
- createTransTexspace(C, t);
+ createTransTexspace(t);
}
else if (t->options & CTX_EDGE) {
t->ext = NULL;
t->flag |= T_EDIT;
- createTransEdge(C, t);
+ createTransEdge(t);
if(t->data && t->flag & T_PROP_EDIT) {
sort_trans_data(t); // makes selected become first in array
set_prop_dist(t, 1);
@@ -5277,14 +5335,14 @@ void createTransData(bContext *C, TransInfo *t)
createTransCurveVerts(C, t);
}
else if (t->obedit->type==OB_LATTICE) {
- createTransLatticeVerts(C, t);
+ createTransLatticeVerts(t);
}
else if (t->obedit->type==OB_MBALL) {
- createTransMBallVerts(C, t);
+ createTransMBallVerts(t);
}
else if (t->obedit->type==OB_ARMATURE) {
t->flag &= ~T_PROP_EDIT;
- createTransArmatureVerts(C, t);
+ createTransArmatureVerts(t);
}
else {
printf("edit type not implemented!\n");
@@ -5315,22 +5373,22 @@ void createTransData(bContext *C, TransInfo *t)
else if (ob && (ob->mode & OB_MODE_POSE)) {
// XXX this is currently limited to active armature only...
// XXX active-layer checking isn't done as that should probably be checked through context instead
- createTransPose(C, t, ob);
+ createTransPose(t, ob);
}
else if (ob && (ob->mode & OB_MODE_WEIGHT_PAINT)) {
- /* exception, we look for the one selected armature */
- CTX_DATA_BEGIN(C, Object*, ob_armature, selected_objects)
- {
- if(ob_armature->type==OB_ARMATURE)
- {
- if((ob_armature->mode & OB_MODE_POSE) && ob_armature == modifiers_isDeformedByArmature(ob))
- {
- createTransPose(C, t, ob_armature);
- break;
+ /* important that ob_armature can be set even when its not selected [#23412]
+ * lines below just check is also visible */
+ Object *ob_armature= modifiers_isDeformedByArmature(ob);
+ if(ob_armature && ob_armature->mode & OB_MODE_POSE) {
+ Base *base_arm= object_in_scene(ob_armature, t->scene);
+ if(base_arm) {
+ View3D *v3d = t->view;
+ if(BASE_VISIBLE(v3d, base_arm)) {
+ createTransPose(t, ob_armature);
}
}
+
}
- CTX_DATA_END;
}
else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT)
&& PE_start_edit(PE_get_current(scene, ob))) {
@@ -5343,6 +5401,13 @@ void createTransData(bContext *C, TransInfo *t)
sort_trans_data_dist(t);
}
}
+ else if (ob && (ob->mode & (OB_MODE_SCULPT|OB_MODE_TEXTURE_PAINT))) {
+ /* sculpt mode and project paint have own undo stack
+ * transform ops redo clears sculpt/project undo stack.
+ *
+ * Could use 'OB_MODE_ALL_PAINT' since there are key conflicts,
+ * transform + paint isnt well supported. */
+ }
else {
createTransObject(C, t);
t->flag |= T_OBJECT;
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index 036ef410963..85a7526b7b4 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -87,7 +87,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_rand.h"
-
+#include "BLI_utildefines.h"
#include "WM_types.h"
#include "WM_api.h"
@@ -269,7 +269,7 @@ static void animrecord_check_state (Scene *scene, ID *id, wmTimer *animtimer)
* - we're not only keying for available channels
* - the option to add new actions for each round is not enabled
*/
- if (IS_AUTOKEY_FLAG(INSERTAVAIL)==0 && (scene->toolsettings->autokey_flag & ANIMRECORD_FLAG_WITHNLA)) {
+ if (IS_AUTOKEY_FLAG(scene, INSERTAVAIL)==0 && (scene->toolsettings->autokey_flag & ANIMRECORD_FLAG_WITHNLA)) {
/* if playback has just looped around, we need to add a new NLA track+strip to allow a clean pass to occur */
if ((sad) && (sad->flag & ANIMPLAY_FLAG_JUMPED)) {
AnimData *adt= BKE_animdata_from_id(id);
@@ -321,8 +321,7 @@ static int fcu_test_selected(FCurve *fcu)
/* called for updating while transform acts, once per redraw */
void recalcData(TransInfo *t)
{
- Scene *scene = t->scene;
- Base *base = scene->basact;
+ Base *base = t->scene->basact;
if (t->spacetype==SPACE_NODE) {
flushTransNodes(t);
@@ -334,15 +333,13 @@ void recalcData(TransInfo *t)
Scene *scene= t->scene;
SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
- bAnimContext ac;
+ bAnimContext ac= {0};
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
int filter;
/* initialise relevant anim-context 'context' data from TransInfo data */
/* NOTE: sync this with the code in ANIM_animdata_get_context() */
- memset(&ac, 0, sizeof(bAnimContext));
-
ac.scene= t->scene;
ac.obact= OBACT;
ac.sa= t->sa;
@@ -352,22 +349,29 @@ void recalcData(TransInfo *t)
ANIM_animdata_context_getdata(&ac);
- /* get animdata blocks visible in editor, assuming that these will be the ones where things changed */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_ANIMDATA);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* just tag these animdata-blocks to recalc, assuming that some data there changed
- * BUT only do this if realtime updates are enabled
- */
- if ((saction->flag & SACTION_NOREALTIMEUPDATES) == 0) {
- for (ale= anim_data.first; ale; ale= ale->next) {
- /* set refresh tags for objects using this animation */
- ANIM_list_elem_update(t->scene, ale);
+ /* perform flush */
+ if (ac.datatype == ANIMCONT_GPENCIL) {
+ /* flush transform values back to actual coordinates */
+ flushTransGPactionData(t);
+ }
+ else {
+ /* get animdata blocks visible in editor, assuming that these will be the ones where things changed */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_ANIMDATA);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* just tag these animdata-blocks to recalc, assuming that some data there changed
+ * BUT only do this if realtime updates are enabled
+ */
+ if ((saction->flag & SACTION_NOREALTIMEUPDATES) == 0) {
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ /* set refresh tags for objects using this animation */
+ ANIM_list_elem_update(t->scene, ale);
+ }
}
+
+ /* now free temp channels */
+ BLI_freelistN(&anim_data);
}
-
- /* now free temp channels */
- BLI_freelistN(&anim_data);
}
else if (t->spacetype == SPACE_IPO) {
Scene *scene;
@@ -584,7 +588,7 @@ void recalcData(TransInfo *t)
BKE_nlatrack_add_strip(track, strip);
tdn->nlt= track;
- tdn->trackIndex += (n + 1); /* + 1, since n==0 would mean that we didn't change track */
+ tdn->trackIndex++;
}
else /* can't move any further */
break;
@@ -602,7 +606,7 @@ void recalcData(TransInfo *t)
BKE_nlatrack_add_strip(track, strip);
tdn->nlt= track;
- tdn->trackIndex -= (n - 1); /* - 1, since n==0 would mean that we didn't change track */
+ tdn->trackIndex--;
}
else /* can't move any further */
break;
@@ -619,16 +623,11 @@ void recalcData(TransInfo *t)
if(sima->flag & SI_LIVE_UNWRAP)
ED_uvedit_live_unwrap_re_solve();
- DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(t->obedit->data, 0);
}
}
else if (t->spacetype == SPACE_VIEW3D) {
- /* project */
- if(t->state != TRANS_CANCEL) {
- applyProject(t);
- }
-
if (t->obedit) {
if ELEM(t->obedit->type, OB_CURVE, OB_SURF) {
Curve *cu= t->obedit->data;
@@ -637,9 +636,10 @@ void recalcData(TransInfo *t)
if(t->state != TRANS_CANCEL) {
clipMirrorModifier(t, t->obedit);
+ applyProject(t);
}
- DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA); /* sets recalc flags */
+ DAG_id_tag_update(t->obedit->data, 0); /* sets recalc flags */
if (t->state == TRANS_CANCEL) {
while(nu) {
@@ -657,7 +657,12 @@ void recalcData(TransInfo *t)
}
else if(t->obedit->type==OB_LATTICE) {
Lattice *la= t->obedit->data;
- DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA); /* sets recalc flags */
+
+ if(t->state != TRANS_CANCEL) {
+ applyProject(t);
+ }
+
+ DAG_id_tag_update(t->obedit->data, 0); /* sets recalc flags */
if(la->editlatt->latt->flag & LT_OUTSIDE) outside_lattice(la->editlatt->latt);
}
@@ -666,11 +671,12 @@ void recalcData(TransInfo *t)
/* mirror modifier clipping? */
if(t->state != TRANS_CANCEL) {
clipMirrorModifier(t, t->obedit);
+ applyProject(t);
}
if((t->options & CTX_NO_MIRROR) == 0 && (t->flag & T_MIRROR))
editmesh_apply_to_mirror(t);
- DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA); /* sets recalc flags */
+ DAG_id_tag_update(t->obedit->data, 0); /* sets recalc flags */
recalc_editnormals(em);
}
@@ -681,6 +687,10 @@ void recalcData(TransInfo *t)
TransData *td = t->data;
int i;
+ if(t->state != TRANS_CANCEL) {
+ applyProject(t);
+ }
+
/* Ensure all bones are correctly adjusted */
for (ebo = edbo->first; ebo; ebo = ebo->next){
@@ -743,7 +753,7 @@ void recalcData(TransInfo *t)
mul_m3_v3(t->mat, up_axis);
}
- ebo->roll = ED_rollBoneToVector(ebo, up_axis);
+ ebo->roll = ED_rollBoneToVector(ebo, up_axis, FALSE);
}
}
}
@@ -753,7 +763,12 @@ void recalcData(TransInfo *t)
}
else
- DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA); /* sets recalc flags */
+ {
+ if(t->state != TRANS_CANCEL) {
+ applyProject(t);
+ }
+ DAG_id_tag_update(t->obedit->data, 0); /* sets recalc flags */
+ }
}
else if( (t->flag & T_POSE) && t->poseobj) {
Object *ob= t->poseobj;
@@ -762,28 +777,37 @@ void recalcData(TransInfo *t)
/* if animtimer is running, and the object already has animation data,
* check if the auto-record feature means that we should record 'samples'
* (i.e. uneditable animation values)
+ *
+ * context is needed for keying set poll() functions.
*/
// TODO: autokeyframe calls need some setting to specify to add samples (FPoints) instead of keyframes?
- if ((t->animtimer) && IS_AUTOKEY_ON(t->scene)) {
+ if ((t->animtimer) && (t->context) && IS_AUTOKEY_ON(t->scene)) {
int targetless_ik= (t->flag & T_AUTOIK); // XXX this currently doesn't work, since flags aren't set yet!
animrecord_check_state(t->scene, &ob->id, t->animtimer);
- autokeyframe_pose_cb_func(NULL, t->scene, (View3D *)t->view, ob, t->mode, targetless_ik);
+ autokeyframe_pose_cb_func(t->context, t->scene, (View3D *)t->view, ob, t->mode, targetless_ik);
}
/* old optimize trick... this enforces to bypass the depgraph */
if (!(arm->flag & ARM_DELAYDEFORM)) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
}
else
- where_is_pose(scene, ob);
+ where_is_pose(t->scene, ob);
}
- else if(base && (base->object->mode & OB_MODE_PARTICLE_EDIT) && PE_get_current(scene, base->object)) {
+ else if(base && (base->object->mode & OB_MODE_PARTICLE_EDIT) && PE_get_current(t->scene, base->object)) {
+ if(t->state != TRANS_CANCEL) {
+ applyProject(t);
+ }
flushTransParticles(t);
}
else {
int i;
+ if(t->state != TRANS_CANCEL) {
+ applyProject(t);
+ }
+
for (i = 0; i < t->total; i++) {
TransData *td = t->data + i;
Object *ob = td->ob;
@@ -801,13 +825,13 @@ void recalcData(TransInfo *t)
// TODO: autokeyframe calls need some setting to specify to add samples (FPoints) instead of keyframes?
if ((t->animtimer) && IS_AUTOKEY_ON(t->scene)) {
animrecord_check_state(t->scene, &ob->id, t->animtimer);
- autokeyframe_ob_cb_func(NULL, t->scene, (View3D *)t->view, ob, t->mode);
+ autokeyframe_ob_cb_func(t->context, t->scene, (View3D *)t->view, ob, t->mode);
}
/* sets recalc flags fully, instead of flushing existing ones
* otherwise proxies don't function correctly
*/
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
}
}
@@ -819,7 +843,7 @@ void recalcData(TransInfo *t)
void drawLine(TransInfo *t, float *center, float *dir, char axis, short options)
{
float v1[3], v2[3], v3[3];
- char col[3], col2[3];
+ unsigned char col[3], col2[3];
if (t->spacetype == SPACE_VIEW3D)
{
@@ -843,7 +867,7 @@ void drawLine(TransInfo *t, float *center, float *dir, char axis, short options)
UI_GetThemeColor3ubv(TH_GRID, col);
}
UI_make_axis_color(col, col2, axis);
- glColor3ubv((GLubyte *)col2);
+ glColor3ubv(col2);
setlinestyle(0);
glBegin(GL_LINE_STRIP);
@@ -966,6 +990,13 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
{
t->current_orientation = v3d->twmode;
}
+
+ /* exceptional case */
+ if(t->around==V3D_LOCAL && (t->settings->selectmode & SCE_SELECT_FACE)) {
+ if(ELEM3(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL)) {
+ t->options |= CTX_NO_PET;
+ }
+ }
}
else if(t->spacetype==SPACE_IMAGE || t->spacetype==SPACE_NODE)
{
@@ -1068,8 +1099,9 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
/* TRANSFORM_FIX_ME rna restrictions */
- if (t->prop_size <= 0)
+ if (t->prop_size <= 0.00001f)
{
+ printf("Proportional size (%f) under 0.00001, reseting to 1!\n", t->prop_size);
t->prop_size = 1.0f;
}
@@ -1141,6 +1173,13 @@ void postTrans (bContext *C, TransInfo *t)
if(sima->flag & SI_LIVE_UNWRAP)
ED_uvedit_live_unwrap_end(t->state == TRANS_CANCEL);
}
+ else if(t->spacetype==SPACE_VIEW3D) {
+ View3D *v3d = t->sa->spacedata.first;
+ /* restore manipulator */
+ if (t->flag & T_MODAL) {
+ v3d->twtype = t->twtype;
+ }
+ }
if (t->mouse.data)
{
@@ -1177,6 +1216,13 @@ static void restoreElement(TransData *td) {
if (td->ext->rot) {
VECCOPY(td->ext->rot, td->ext->irot);
}
+ if(td->ext->rotAngle) {
+ *td->ext->rotAngle= td->ext->irotAngle;
+ }
+ if(td->ext->rotAxis) {
+ VECCOPY(td->ext->rotAxis, td->ext->irotAxis);
+ }
+ /* XXX, drotAngle & drotAxis not used yet */
if (td->ext->size) {
VECCOPY(td->ext->size, td->ext->isize);
}
@@ -1322,7 +1368,7 @@ void calculateCenterBound(TransInfo *t)
if (i) {
if (t->data[i].flag & TD_SELECTED) {
if (!(t->data[i].flag & TD_NOCENTER))
- minmax_v3_v3v3(min, max, t->data[i].center);
+ minmax_v3v3_v3(min, max, t->data[i].center);
}
else {
/*
@@ -1563,25 +1609,3 @@ void calculatePropRatio(TransInfo *t)
strcpy(t->proptext, "");
}
}
-
-float get_drawsize(ARegion *ar, float *co)
-{
- RegionView3D *rv3d= ar->regiondata;
- float size, vec[3], len1, len2;
-
- /* size calculus, depending ortho/persp settings, like initgrabz() */
- size= rv3d->persmat[0][3]*co[0]+ rv3d->persmat[1][3]*co[1]+ rv3d->persmat[2][3]*co[2]+ rv3d->persmat[3][3];
-
- VECCOPY(vec, rv3d->persinv[0]);
- len1= normalize_v3(vec);
- VECCOPY(vec, rv3d->persinv[1]);
- len2= normalize_v3(vec);
-
- size*= 0.01f*(len1>len2?len1:len2);
-
- /* correct for window size to make widgets appear fixed size */
- if(ar->winx > ar->winy) size*= 1000.0f/(float)ar->winx;
- else size*= 1000.0f/(float)ar->winy;
-
- return size;
-}
diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c
index 54a86b3dca1..a06e5ab21e6 100644
--- a/source/blender/editors/transform/transform_input.c
+++ b/source/blender/editors/transform/transform_input.c
@@ -28,6 +28,7 @@
#include "DNA_screen_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "WM_types.h"
@@ -55,7 +56,7 @@ void InputVector(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
}
-void InputSpring(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
+void InputSpring(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3])
{
float ratio, precise_ratio, dx, dy;
if(mi->precision)
@@ -93,7 +94,7 @@ void InputSpringFlip(TransInfo *t, MouseInput *mi, short mval[2], float output[3
}
}
-void InputTrackBall(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
+void InputTrackBall(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3])
{
if(mi->precision)
@@ -162,7 +163,7 @@ void InputVerticalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float ou
output[0] = dot_v3v3(t->viewinv[1], vec) * 2.0f;
}
-void setCustomPoints(TransInfo *t, MouseInput *mi, short start[2], short end[2])
+void setCustomPoints(TransInfo *UNUSED(t), MouseInput *mi, short start[2], short end[2])
{
short *data;
@@ -178,7 +179,7 @@ void setCustomPoints(TransInfo *t, MouseInput *mi, short start[2], short end[2])
data[3] = end[1];
}
-void InputCustomRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
+void InputCustomRatio(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3])
{
float length;
float distance;
@@ -211,7 +212,7 @@ void InputCustomRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[
}
}
-void InputAngle(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
+void InputAngle(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3])
{
double dx2 = mval[0] - mi->center[0];
double dy2 = mval[1] - mi->center[1];
@@ -272,7 +273,7 @@ void InputAngle(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
output[0] = *angle;
}
-void initMouseInput(TransInfo *t, MouseInput *mi, int center[2], short mval[2])
+void initMouseInput(TransInfo *UNUSED(t), MouseInput *mi, int center[2], short mval[2])
{
mi->factor = 0;
mi->precision = 0;
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index 51698c27b37..d69ba22585b 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -59,6 +59,7 @@
#include "BLI_math.h"
#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "BIF_gl.h"
@@ -101,16 +102,6 @@
#define MAN_GHOST 1
#define MAN_MOVECOL 2
-
-static int is_mat4_flipped(float mat[][4])
-{
- float vec[3];
-
- cross_v3_v3v3(vec, mat[0], mat[1]);
- if( dot_v3v3(vec, mat[2]) < 0.0 ) return 1;
- return 0;
-}
-
/* transform widget center calc helper for below */
static void calc_tw_center(Scene *scene, float *co)
{
@@ -166,6 +157,37 @@ static void stats_editbone(RegionView3D *rv3d, EditBone *ebo)
protectflag_to_drawflags(OB_LOCK_LOC|OB_LOCK_ROT|OB_LOCK_SCALE, &rv3d->twdrawflag);
}
+/* could move into BLI_math however this is only useful for display/editing purposes */
+static void axis_angle_to_gimbal_axis(float gmat[3][3], float axis[3], float angle)
+{
+ /* X/Y are arbitrary axies, most importantly Z is the axis of rotation */
+
+ float cross_vec[3];
+ float quat[4];
+
+ /* this is an un-scientific method to get a vector to cross with
+ * XYZ intentionally YZX */
+ cross_vec[0]= axis[1];
+ cross_vec[1]= axis[2];
+ cross_vec[2]= axis[0];
+
+ /* X-axis */
+ cross_v3_v3v3(gmat[0], cross_vec, axis);
+ normalize_v3(gmat[0]);
+ axis_angle_to_quat(quat, axis, angle);
+ mul_qt_v3(quat, gmat[0]);
+
+ /* Y-axis */
+ axis_angle_to_quat(quat, axis, M_PI/2.0);
+ copy_v3_v3(gmat[1], gmat[0]);
+ mul_qt_v3(quat, gmat[1]);
+
+ /* Z-axis */
+ copy_v3_v3(gmat[2], axis);
+
+ normalize_m3(gmat);
+}
+
static int test_rotmode_euler(short rotmode)
{
@@ -179,10 +201,18 @@ int gimbal_axis(Object *ob, float gmat[][3])
{
bPoseChannel *pchan= get_active_posechannel(ob);
- if(pchan && test_rotmode_euler(pchan->rotmode)) {
+ if(pchan) {
float mat[3][3], tmat[3][3], obmat[3][3];
+ if(test_rotmode_euler(pchan->rotmode)) {
+ eulO_to_gimbal_axis(mat, pchan->eul, pchan->rotmode);
+ }
+ else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
+ axis_angle_to_gimbal_axis(mat, pchan->rotAxis, pchan->rotAngle);
+ }
+ else { /* quat */
+ return 0;
+ }
- eulO_to_gimbal_axis(mat, pchan->eul, pchan->rotmode);
/* apply bone transformation */
mul_m3_m3m3(tmat, pchan->bone->bone_mat, mat);
@@ -211,24 +241,23 @@ int gimbal_axis(Object *ob, float gmat[][3])
}
else {
if(test_rotmode_euler(ob->rotmode)) {
+ eulO_to_gimbal_axis(gmat, ob->rot, ob->rotmode);
+ }
+ else if(ob->rotmode == ROT_MODE_AXISANGLE) {
+ axis_angle_to_gimbal_axis(gmat, ob->rotAxis, ob->rotAngle);
+ }
+ else { /* quat */
+ return 0;
+ }
-
- if (ob->parent)
- {
- float parent_mat[3][3], amat[3][3];
-
- eulO_to_gimbal_axis(amat, ob->rot, ob->rotmode);
- copy_m3_m4(parent_mat, ob->parent->obmat);
- normalize_m3(parent_mat);
- mul_m3_m3m3(gmat, parent_mat, amat);
- return 1;
- }
- else
- {
- eulO_to_gimbal_axis(gmat, ob->rot, ob->rotmode);
- return 1;
- }
+ if (ob->parent)
+ {
+ float parent_mat[3][3];
+ copy_m3_m4(parent_mat, ob->parent->obmat);
+ normalize_m3(parent_mat);
+ mul_m3_m3m3(gmat, parent_mat, gmat);
}
+ return 1;
}
}
@@ -288,7 +317,7 @@ int calc_manipulator_stats(const bContext *C)
bArmature *arm= obedit->data;
EditBone *ebo;
for (ebo= arm->edbo->first; ebo; ebo=ebo->next){
- if(ebo->layer & arm->layer && !(ebo->flag & BONE_HIDDEN_A)) {
+ if(EBONE_VISIBLE(arm, ebo)) {
if (ebo->flag & BONE_TIPSEL) {
calc_tw_center(scene, ebo->tail);
totsel++;
@@ -318,7 +347,7 @@ int calc_manipulator_stats(const bContext *C)
while(a--) {
/* exceptions
* if handles are hidden then only check the center points.
- * If 2 or more are selected then only use the center point too.
+ * If the center knot is selected then only use this as the center point.
*/
if (cu->drawflag & CU_HIDE_HANDLES) {
if (bezt->f2 & SELECT) {
@@ -326,7 +355,7 @@ int calc_manipulator_stats(const bContext *C)
totsel++;
}
}
- else if ( (bezt->f1 & SELECT) + (bezt->f2 & SELECT) + (bezt->f3 & SELECT) > SELECT ) {
+ else if (bezt->f2 & SELECT) {
calc_tw_center(scene, bezt->vec[1]);
totsel++;
}
@@ -335,10 +364,6 @@ int calc_manipulator_stats(const bContext *C)
calc_tw_center(scene, bezt->vec[0]);
totsel++;
}
- if(bezt->f2) {
- calc_tw_center(scene, bezt->vec[1]);
- totsel++;
- }
if(bezt->f3) {
calc_tw_center(scene, bezt->vec[2]);
totsel++;
@@ -419,7 +444,7 @@ int calc_manipulator_stats(const bContext *C)
mul_m4_v3(ob->obmat, scene->twmax);
}
}
- else if(ob && (ob->mode & (OB_MODE_SCULPT|OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))) {
+ else if(ob && (ob->mode & OB_MODE_ALL_PAINT)) {
;
}
else if(ob && ob->mode & OB_MODE_PARTICLE_EDIT) {
@@ -453,7 +478,7 @@ int calc_manipulator_stats(const bContext *C)
if(ob && !(ob->flag & SELECT)) ob= NULL;
for(base= scene->base.first; base; base= base->next) {
- if TESTBASELIB(scene, base) {
+ if TESTBASELIB(v3d, base) {
if(ob==NULL)
ob= base->object;
calc_tw_center(scene, base->object->obmat[3]);
@@ -671,20 +696,20 @@ static char axisBlendAngle(float angle)
moving: in transform theme color
else the red/green/blue
*/
-static void manipulator_setcolor(View3D *v3d, char axis, int colcode, char alpha)
+static void manipulator_setcolor(View3D *v3d, char axis, int colcode, unsigned char alpha)
{
- char col[4];
+ unsigned char col[4]= {0};
+ col[3]= alpha;
if(colcode==MAN_GHOST) {
- glColor4ub(0, 0, 0, 70);
+ col[3]= 70;
}
else if(colcode==MAN_MOVECOL) {
UI_GetThemeColor3ubv(TH_TRANSFORM, col);
- glColor4ub(col[0], col[1], col[2], alpha);
}
else {
switch(axis) {
- case 'c':
+ case 'C':
UI_GetThemeColor3ubv(TH_TRANSFORM, col);
if(v3d->twmode == V3D_MANIP_LOCAL) {
col[0]= col[0]>200?255:col[0]+55;
@@ -696,19 +721,24 @@ static void manipulator_setcolor(View3D *v3d, char axis, int colcode, char alpha
col[1]= col[1]<55?0:col[1]-55;
col[2]= col[2]<55?0:col[2]-55;
}
- glColor4ub(col[0], col[1], col[2], alpha);
break;
- case 'x':
- glColor4ub(220, 0, 0, alpha);
+ case 'X':
+ col[0]= 220;
break;
- case 'y':
- glColor4ub(0, 220, 0, alpha);
+ case 'Y':
+ col[1]= 220;
break;
- case 'z':
- glColor4ub(30, 30, 220, alpha);
+ case 'Z':
+ col[0]= 30;
+ col[1]= 30;
+ col[2]= 220;
break;
+ default:
+ BLI_assert(!"invalid axis arg");
}
}
+
+ glColor4ubv(col);
}
/* viewmatrix should have been set OK, also no shademode! */
@@ -717,7 +747,7 @@ static void draw_manipulator_axes(View3D *v3d, RegionView3D *rv3d, int colcode,
/* axes */
if(flagx) {
- manipulator_setcolor(v3d, 'x', colcode, axisBlendAngle(rv3d->twangle[0]));
+ manipulator_setcolor(v3d, 'X', colcode, axisBlendAngle(rv3d->twangle[0]));
if(flagx & MAN_SCALE_X) glLoadName(MAN_SCALE_X);
else if(flagx & MAN_TRANS_X) glLoadName(MAN_TRANS_X);
glBegin(GL_LINES);
@@ -728,7 +758,7 @@ static void draw_manipulator_axes(View3D *v3d, RegionView3D *rv3d, int colcode,
if(flagy) {
if(flagy & MAN_SCALE_Y) glLoadName(MAN_SCALE_Y);
else if(flagy & MAN_TRANS_Y) glLoadName(MAN_TRANS_Y);
- manipulator_setcolor(v3d, 'y', colcode, axisBlendAngle(rv3d->twangle[1]));
+ manipulator_setcolor(v3d, 'Y', colcode, axisBlendAngle(rv3d->twangle[1]));
glBegin(GL_LINES);
glVertex3f(0.0f, 0.2f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
@@ -737,7 +767,7 @@ static void draw_manipulator_axes(View3D *v3d, RegionView3D *rv3d, int colcode,
if(flagz) {
if(flagz & MAN_SCALE_Z) glLoadName(MAN_SCALE_Z);
else if(flagz & MAN_TRANS_Z) glLoadName(MAN_TRANS_Z);
- manipulator_setcolor(v3d, 'z', colcode, axisBlendAngle(rv3d->twangle[2]));
+ manipulator_setcolor(v3d, 'Z', colcode, axisBlendAngle(rv3d->twangle[2]));
glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.2f);
glVertex3f(0.0f, 0.0f, 1.0f);
@@ -753,7 +783,7 @@ static void preOrthoFront(int ortho, float twmat[][4], int axis)
orthogonalize_m4(omat, axis);
glPushMatrix();
glMultMatrixf(omat);
- glFrontFace( is_mat4_flipped(omat)?GL_CW:GL_CCW);
+ glFrontFace(is_negative_m4(omat) ? GL_CW:GL_CCW);
}
}
@@ -769,7 +799,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
GLUquadricObj *qobj;
double plane[4];
float matt[4][4];
- float size, vec[3], unitmat[4][4];
+ float size, unitmat[4][4];
float cywid= 0.33f*0.01f*(float)U.tw_handlesize;
float cusize= cywid*0.65f;
int arcs= (G.rt!=2);
@@ -790,8 +820,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
gluQuadricDrawStyle(qobj, GLU_FILL);
/* prepare for screen aligned draw */
- VECCOPY(vec, rv3d->twmat[0]);
- size= normalize_v3(vec);
+ size= len_v3(rv3d->twmat[0]);
glPushMatrix();
glTranslatef(rv3d->twmat[3][0], rv3d->twmat[3][1], rv3d->twmat[3][2]);
@@ -850,12 +879,12 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
// XXX mul_m4_m3m4(matt, t->mat, rv3d->twmat);
if (ortho) {
glMultMatrixf(matt);
- glFrontFace( is_mat4_flipped(matt)?GL_CW:GL_CCW);
+ glFrontFace(is_negative_m4(matt) ? GL_CW:GL_CCW);
}
}
else {
if (ortho) {
- glFrontFace( is_mat4_flipped(rv3d->twmat)?GL_CW:GL_CCW);
+ glFrontFace(is_negative_m4(rv3d->twmat) ? GL_CW:GL_CCW);
glMultMatrixf(rv3d->twmat);
}
}
@@ -867,7 +896,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
/* axis */
if( (drawflags & MAN_ROT_X) || (moving && (drawflags & MAN_ROT_Z)) ) {
preOrthoFront(ortho, rv3d->twmat, 2);
- manipulator_setcolor(v3d, 'x', colcode, 255);
+ manipulator_setcolor(v3d, 'X', colcode, 255);
glBegin(GL_LINES);
glVertex3f(0.2f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
@@ -876,7 +905,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
}
if( (drawflags & MAN_ROT_Y) || (moving && (drawflags & MAN_ROT_X)) ) {
preOrthoFront(ortho, rv3d->twmat, 0);
- manipulator_setcolor(v3d, 'y', colcode, 255);
+ manipulator_setcolor(v3d, 'Y', colcode, 255);
glBegin(GL_LINES);
glVertex3f(0.0f, 0.2f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
@@ -885,7 +914,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
}
if( (drawflags & MAN_ROT_Z) || (moving && (drawflags & MAN_ROT_Y)) ) {
preOrthoFront(ortho, rv3d->twmat, 1);
- manipulator_setcolor(v3d, 'z', colcode, 255);
+ manipulator_setcolor(v3d, 'Z', colcode, 255);
glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.2f);
glVertex3f(0.0f, 0.0f, 1.0f);
@@ -902,7 +931,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
if(drawflags & MAN_ROT_Z) {
preOrthoFront(ortho, matt, 2);
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
- manipulator_setcolor(v3d, 'z', colcode, 255);
+ manipulator_setcolor(v3d, 'Z', colcode, 255);
drawcircball(GL_LINE_LOOP, unitmat[3], 1.0, unitmat);
postOrtho(ortho);
}
@@ -911,7 +940,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
preOrthoFront(ortho, matt, 0);
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_X);
glRotatef(90.0, 0.0, 1.0, 0.0);
- manipulator_setcolor(v3d, 'x', colcode, 255);
+ manipulator_setcolor(v3d, 'X', colcode, 255);
drawcircball(GL_LINE_LOOP, unitmat[3], 1.0, unitmat);
glRotatef(-90.0, 0.0, 1.0, 0.0);
postOrtho(ortho);
@@ -921,7 +950,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
preOrthoFront(ortho, matt, 1);
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Y);
glRotatef(-90.0, 1.0, 0.0, 0.0);
- manipulator_setcolor(v3d, 'y', colcode, 255);
+ manipulator_setcolor(v3d, 'Y', colcode, 255);
drawcircball(GL_LINE_LOOP, unitmat[3], 1.0, unitmat);
glRotatef(90.0, 1.0, 0.0, 0.0);
postOrtho(ortho);
@@ -937,7 +966,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
if(drawflags & MAN_ROT_Z) {
preOrthoFront(ortho, rv3d->twmat, 2);
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
- manipulator_setcolor(v3d, 'z', colcode, 255);
+ manipulator_setcolor(v3d, 'Z', colcode, 255);
partial_donut(cusize/4.0f, 1.0f, 0, 48, 8, 48);
postOrtho(ortho);
}
@@ -946,7 +975,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
preOrthoFront(ortho, rv3d->twmat, 0);
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_X);
glRotatef(90.0, 0.0, 1.0, 0.0);
- manipulator_setcolor(v3d, 'x', colcode, 255);
+ manipulator_setcolor(v3d, 'X', colcode, 255);
partial_donut(cusize/4.0f, 1.0f, 0, 48, 8, 48);
glRotatef(-90.0, 0.0, 1.0, 0.0);
postOrtho(ortho);
@@ -956,7 +985,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
preOrthoFront(ortho, rv3d->twmat, 1);
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Y);
glRotatef(-90.0, 1.0, 0.0, 0.0);
- manipulator_setcolor(v3d, 'y', colcode, 255);
+ manipulator_setcolor(v3d, 'Y', colcode, 255);
partial_donut(cusize/4.0f, 1.0f, 0, 48, 8, 48);
glRotatef(90.0, 1.0, 0.0, 0.0);
postOrtho(ortho);
@@ -972,7 +1001,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
preOrthoFront(ortho, rv3d->twmat, 2);
glPushMatrix();
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
- manipulator_setcolor(v3d, 'z', colcode, 255);
+ manipulator_setcolor(v3d, 'Z', colcode, 255);
partial_donut(0.7f*cusize, 1.0f, 31, 33, 8, 64);
@@ -985,7 +1014,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
preOrthoFront(ortho, rv3d->twmat, 1);
glPushMatrix();
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Y);
- manipulator_setcolor(v3d, 'y', colcode, 255);
+ manipulator_setcolor(v3d, 'Y', colcode, 255);
glRotatef(90.0, 1.0, 0.0, 0.0);
glRotatef(90.0, 0.0, 0.0, 1.0);
@@ -1000,7 +1029,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
preOrthoFront(ortho, rv3d->twmat, 0);
glPushMatrix();
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_X);
- manipulator_setcolor(v3d, 'x', colcode, 255);
+ manipulator_setcolor(v3d, 'X', colcode, 255);
glRotatef(-90.0, 0.0, 1.0, 0.0);
glRotatef(90.0, 0.0, 0.0, 1.0);
@@ -1099,7 +1128,7 @@ static void draw_manipulator_scale(View3D *v3d, RegionView3D *rv3d, int moving,
/* center circle, do not add to selection when shift is pressed (planar constraint) */
if( (G.f & G_PICKSEL) && shift==0) glLoadName(MAN_SCALE_C);
- manipulator_setcolor(v3d, 'c', colcode, 255);
+ manipulator_setcolor(v3d, 'C', colcode, 255);
glPushMatrix();
size= screen_aligned(rv3d, rv3d->twmat);
unit_m4(unitmat);
@@ -1116,11 +1145,11 @@ static void draw_manipulator_scale(View3D *v3d, RegionView3D *rv3d, int moving,
copy_m4_m4(matt, rv3d->twmat); // to copy the parts outside of [3][3]
// XXX mul_m4_m3m4(matt, t->mat, rv3d->twmat);
glMultMatrixf(matt);
- glFrontFace( is_mat4_flipped(matt)?GL_CW:GL_CCW);
+ glFrontFace(is_negative_m4(matt) ? GL_CW:GL_CCW);
}
else {
glMultMatrixf(rv3d->twmat);
- glFrontFace( is_mat4_flipped(rv3d->twmat)?GL_CW:GL_CCW);
+ glFrontFace(is_negative_m4(rv3d->twmat) ? GL_CW:GL_CCW);
}
/* axis */
@@ -1132,21 +1161,21 @@ static void draw_manipulator_scale(View3D *v3d, RegionView3D *rv3d, int moving,
glTranslatef(0.0, 0.0, dz);
if(drawflags & MAN_SCALE_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_SCALE_Z);
- manipulator_setcolor(v3d, 'z', colcode, axisBlendAngle(rv3d->twangle[2]));
+ manipulator_setcolor(v3d, 'Z', colcode, axisBlendAngle(rv3d->twangle[2]));
drawsolidcube(cusize);
}
/* X cube */
glTranslatef(dz, 0.0, -dz);
if(drawflags & MAN_SCALE_X) {
if(G.f & G_PICKSEL) glLoadName(MAN_SCALE_X);
- manipulator_setcolor(v3d, 'x', colcode, axisBlendAngle(rv3d->twangle[0]));
+ manipulator_setcolor(v3d, 'X', colcode, axisBlendAngle(rv3d->twangle[0]));
drawsolidcube(cusize);
}
/* Y cube */
glTranslatef(-dz, dz, 0.0);
if(drawflags & MAN_SCALE_Y) {
if(G.f & G_PICKSEL) glLoadName(MAN_SCALE_Y);
- manipulator_setcolor(v3d, 'y', colcode, axisBlendAngle(rv3d->twangle[1]));
+ manipulator_setcolor(v3d, 'Y', colcode, axisBlendAngle(rv3d->twangle[1]));
drawsolidcube(cusize);
}
@@ -1197,7 +1226,7 @@ static void draw_cylinder(GLUquadricObj *qobj, float len, float width)
}
-static void draw_manipulator_translate(View3D *v3d, RegionView3D *rv3d, int moving, int drawflags, int combo, int colcode)
+static void draw_manipulator_translate(View3D *v3d, RegionView3D *rv3d, int UNUSED(moving), int drawflags, int combo, int colcode)
{
GLUquadricObj *qobj;
float cylen= 0.01f*(float)U.tw_handlesize;
@@ -1217,7 +1246,7 @@ static void draw_manipulator_translate(View3D *v3d, RegionView3D *rv3d, int movi
/* center circle, do not add to selection when shift is pressed (planar constraint) */
if( (G.f & G_PICKSEL) && shift==0) glLoadName(MAN_TRANS_C);
- manipulator_setcolor(v3d, 'c', colcode, 255);
+ manipulator_setcolor(v3d, 'C', colcode, 255);
glPushMatrix();
size= screen_aligned(rv3d, rv3d->twmat);
unit_m4(unitmat);
@@ -1244,7 +1273,7 @@ static void draw_manipulator_translate(View3D *v3d, RegionView3D *rv3d, int movi
glTranslatef(0.0, 0.0, dz);
if(drawflags & MAN_TRANS_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_TRANS_Z);
- manipulator_setcolor(v3d, 'z', colcode, axisBlendAngle(rv3d->twangle[2]));
+ manipulator_setcolor(v3d, 'Z', colcode, axisBlendAngle(rv3d->twangle[2]));
draw_cone(qobj, cylen, cywid);
}
/* X Cone */
@@ -1252,7 +1281,7 @@ static void draw_manipulator_translate(View3D *v3d, RegionView3D *rv3d, int movi
if(drawflags & MAN_TRANS_X) {
if(G.f & G_PICKSEL) glLoadName(MAN_TRANS_X);
glRotatef(90.0, 0.0, 1.0, 0.0);
- manipulator_setcolor(v3d, 'x', colcode, axisBlendAngle(rv3d->twangle[0]));
+ manipulator_setcolor(v3d, 'X', colcode, axisBlendAngle(rv3d->twangle[0]));
draw_cone(qobj, cylen, cywid);
glRotatef(-90.0, 0.0, 1.0, 0.0);
}
@@ -1261,7 +1290,7 @@ static void draw_manipulator_translate(View3D *v3d, RegionView3D *rv3d, int movi
if(drawflags & MAN_TRANS_Y) {
if(G.f & G_PICKSEL) glLoadName(MAN_TRANS_Y);
glRotatef(-90.0, 1.0, 0.0, 0.0);
- manipulator_setcolor(v3d, 'y', colcode, axisBlendAngle(rv3d->twangle[1]));
+ manipulator_setcolor(v3d, 'Y', colcode, axisBlendAngle(rv3d->twangle[1]));
draw_cone(qobj, cylen, cywid);
}
@@ -1292,8 +1321,7 @@ static void draw_manipulator_rotate_cyl(View3D *v3d, RegionView3D *rv3d, int mov
/* Screen aligned view rot circle */
if(drawflags & MAN_ROT_V) {
- float unitmat[4][4];
- unit_m4(unitmat);
+ float unitmat[4][4]= MAT4_UNITY;
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_V);
UI_ThemeColor(TH_TRANSFORM);
@@ -1327,7 +1355,7 @@ static void draw_manipulator_rotate_cyl(View3D *v3d, RegionView3D *rv3d, int mov
glMultMatrixf(rv3d->twmat);
}
- glFrontFace( is_mat4_flipped(rv3d->twmat)?GL_CW:GL_CCW);
+ glFrontFace(is_negative_m4(rv3d->twmat) ? GL_CW:GL_CCW);
/* axis */
if( (G.f & G_PICKSEL)==0 ) {
@@ -1344,7 +1372,7 @@ static void draw_manipulator_rotate_cyl(View3D *v3d, RegionView3D *rv3d, int mov
glTranslatef(0.0, 0.0, 1.0);
if(drawflags & MAN_ROT_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
- manipulator_setcolor(v3d, 'z', colcode, 255);
+ manipulator_setcolor(v3d, 'Z', colcode, 255);
draw_cylinder(qobj, cylen, cywid);
}
/* X cyl */
@@ -1352,7 +1380,7 @@ static void draw_manipulator_rotate_cyl(View3D *v3d, RegionView3D *rv3d, int mov
if(drawflags & MAN_ROT_X) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_X);
glRotatef(90.0, 0.0, 1.0, 0.0);
- manipulator_setcolor(v3d, 'x', colcode, 255);
+ manipulator_setcolor(v3d, 'X', colcode, 255);
draw_cylinder(qobj, cylen, cywid);
glRotatef(-90.0, 0.0, 1.0, 0.0);
}
@@ -1361,7 +1389,7 @@ static void draw_manipulator_rotate_cyl(View3D *v3d, RegionView3D *rv3d, int mov
if(drawflags & MAN_ROT_Y) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Y);
glRotatef(-90.0, 1.0, 0.0, 0.0);
- manipulator_setcolor(v3d, 'y', colcode, 255);
+ manipulator_setcolor(v3d, 'Y', colcode, 255);
draw_cylinder(qobj, cylen, cywid);
}
@@ -1377,17 +1405,6 @@ static void draw_manipulator_rotate_cyl(View3D *v3d, RegionView3D *rv3d, int mov
/* ********************************************* */
-static float get_manipulator_drawsize(ARegion *ar)
-{
- RegionView3D *rv3d= ar->regiondata;
- float size = get_drawsize(ar, rv3d->twmat[3]);
-
- size*= (float)U.tw_size;
-
- return size;
-}
-
-
/* main call, does calc centers & orientation too */
/* uses global G.moving */
static int drawflags= 0xFFFF; // only for the calls below, belongs in scene...?
@@ -1435,7 +1452,7 @@ void BIF_draw_manipulator(const bContext *C)
break;
}
- mul_mat3_m4_fl(rv3d->twmat, get_manipulator_drawsize(ar));
+ mul_mat3_m4_fl(rv3d->twmat, view3d_pixel_size(rv3d, rv3d->twmat[3]) * U.tw_size * 5.0f);
}
test_manipulator_axis(C);
diff --git a/source/blender/editors/transform/transform_ndofinput.c b/source/blender/editors/transform/transform_ndofinput.c
index 3e47484c54c..ae12daa29ad 100644
--- a/source/blender/editors/transform/transform_ndofinput.c
+++ b/source/blender/editors/transform/transform_ndofinput.c
@@ -27,9 +27,10 @@
#include <math.h> /* fabs */
#include <stdio.h> /* for sprintf */
-#include "BKE_global.h" /* for G */
-#include "BKE_utildefines.h" /* ABS */
+#include "BLI_utildefines.h"
+#include "BKE_global.h" /* for G */
+ /* ABS */
#include "WM_types.h"
@@ -65,7 +66,7 @@ static void resetNDofInput(NDofInput *n)
}
-int handleNDofInput(NDofInput *n, wmEvent *event)
+int handleNDofInput(NDofInput *UNUSED(n), wmEvent *UNUSED(event))
{
int retval = 0;
// TRANSFORM_FIX_ME
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index 0187a3b3567..82cec1eec42 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -31,6 +31,7 @@
#include "RNA_enum_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -145,12 +146,12 @@ static int select_orientation_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int select_orientation_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int select_orientation_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
uiPopupMenu *pup;
uiLayout *layout;
- pup= uiPupMenuBegin(C, "Orientation", 0);
+ pup= uiPupMenuBegin(C, "Orientation", ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemsEnumO(layout, "TRANSFORM_OT_select_orientation", "orientation");
uiPupMenuEnd(C, pup);
@@ -171,7 +172,7 @@ void TRANSFORM_OT_select_orientation(struct wmOperatorType *ot)
/* api callbacks */
ot->invoke = select_orientation_invoke;
ot->exec = select_orientation_exec;
- ot->poll = ED_operator_areaactive;
+ ot->poll = ED_operator_view3d_active;
prop= RNA_def_property(ot->srna, "orientation", PROP_ENUM, PROP_NONE);
RNA_def_property_ui_text(prop, "Orientation", "Transformation orientation");
@@ -179,7 +180,7 @@ void TRANSFORM_OT_select_orientation(struct wmOperatorType *ot)
}
-static int delete_orientation_exec(bContext *C, wmOperator *op)
+static int delete_orientation_exec(bContext *C, wmOperator *UNUSED(op))
{
View3D *v3d = CTX_wm_view3d(C);
int selected_index = (v3d->twmode - V3D_MANIP_CUSTOM);
@@ -192,7 +193,7 @@ static int delete_orientation_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int delete_orientation_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int delete_orientation_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
return delete_orientation_exec(C, op);
}
@@ -243,7 +244,7 @@ static int create_orientation_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int create_orientation_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int create_orientation_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
return create_orientation_exec(C, op);
}
@@ -319,7 +320,10 @@ static int transform_modal(bContext *C, wmOperator *op, wmEvent *event)
TransInfo *t = op->customdata;
+ /* XXX insert keys are called here, and require context */
+ t->context= C;
exit_code = transformEvent(t, event);
+ t->context= NULL;
transformApply(C, t);
@@ -404,7 +408,7 @@ void Transform_Properties(struct wmOperatorType *ot, int flags)
if (flags & P_CONSTRAINT)
{
- prop= RNA_def_boolean_vector(ot->srna, "constraint_axis", 3, NULL, "Constraint Axis", "");
+ RNA_def_boolean_vector(ot->srna, "constraint_axis", 3, NULL, "Constraint Axis", "");
prop= RNA_def_property(ot->srna, "constraint_orientation", PROP_ENUM, PROP_NONE);
RNA_def_property_ui_text(prop, "Orientation", "Transformation orientation");
RNA_def_enum_funcs(prop, rna_TransformOrientation_itemf);
@@ -422,7 +426,7 @@ void Transform_Properties(struct wmOperatorType *ot, int flags)
{
RNA_def_enum(ot->srna, "proportional", proportional_editing_items, 0, "Proportional Editing", "");
RNA_def_enum(ot->srna, "proportional_edit_falloff", proportional_falloff_items, 0, "Proportional Editing Falloff", "Falloff type for proportional editing mode.");
- RNA_def_float(ot->srna, "proportional_size", 1, 0, FLT_MAX, "Proportional Size", "", 0, 100);
+ RNA_def_float(ot->srna, "proportional_size", 1, 0.00001f, FLT_MAX, "Proportional Size", "", 0.001, 100);
}
if (flags & P_SNAP)
@@ -444,10 +448,15 @@ void Transform_Properties(struct wmOperatorType *ot, int flags)
}
}
}
+
+ if (flags & P_OPTIONS)
+ {
+ RNA_def_boolean(ot->srna, "texture_space", 0, "Edit Object data texture space", "");
+ }
- // Add confirm method all the time. At the end because it's not really that important and should be hidden
- prop = RNA_def_boolean(ot->srna, "release_confirm", 0, "Confirm on Release", "Always confirm operation when releasing button");
- RNA_def_property_flag(prop, PROP_HIDDEN);
+ // Add confirm method all the time. At the end because it's not really that important and should be hidden only in log, not in keymap edit
+ /*prop =*/ RNA_def_boolean(ot->srna, "release_confirm", 0, "Confirm on Release", "Always confirm operation when releasing button");
+ //RNA_def_property_flag(prop, PROP_HIDDEN);
}
void TRANSFORM_OT_translate(struct wmOperatorType *ot)
@@ -467,7 +476,7 @@ void TRANSFORM_OT_translate(struct wmOperatorType *ot)
RNA_def_float_vector_xyz(ot->srna, "value", 3, NULL, -FLT_MAX, FLT_MAX, "Vector", "", -FLT_MAX, FLT_MAX);
- Transform_Properties(ot, P_CONSTRAINT|P_PROPORTIONAL|P_MIRROR|P_ALIGN_SNAP);
+ Transform_Properties(ot, P_CONSTRAINT|P_PROPORTIONAL|P_MIRROR|P_ALIGN_SNAP|P_OPTIONS);
}
void TRANSFORM_OT_resize(struct wmOperatorType *ot)
@@ -487,7 +496,7 @@ void TRANSFORM_OT_resize(struct wmOperatorType *ot)
RNA_def_float_vector(ot->srna, "value", 3, VecOne, -FLT_MAX, FLT_MAX, "Vector", "", -FLT_MAX, FLT_MAX);
- Transform_Properties(ot, P_CONSTRAINT|P_PROPORTIONAL|P_MIRROR|P_GEO_SNAP);
+ Transform_Properties(ot, P_CONSTRAINT|P_PROPORTIONAL|P_MIRROR|P_GEO_SNAP|P_OPTIONS);
}
@@ -829,31 +838,37 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac
switch(spaceid)
{
case SPACE_VIEW3D:
- km = WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
- km= WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
+ WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
- km = WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
- km = WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
- km = WM_keymap_add_item(keymap, OP_WARP, WKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, OP_WARP, WKEY, KM_PRESS, KM_SHIFT, 0);
- km = WM_keymap_add_item(keymap, OP_TOSPHERE, SKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, OP_TOSPHERE, SKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0);
- km = WM_keymap_add_item(keymap, OP_SHEAR, SKEY, KM_PRESS, KM_ALT|KM_CTRL|KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, OP_SHEAR, SKEY, KM_PRESS, KM_ALT|KM_CTRL|KM_SHIFT, 0);
- km = WM_keymap_add_item(keymap, "TRANSFORM_OT_select_orientation", SPACEKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "TRANSFORM_OT_select_orientation", SPACEKEY, KM_PRESS, KM_ALT, 0);
km = WM_keymap_add_item(keymap, "TRANSFORM_OT_create_orientation", SPACEKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
RNA_boolean_set(km->ptr, "use", 1);
- km = WM_keymap_add_item(keymap, OP_MIRROR, MKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, OP_MIRROR, MKEY, KM_PRESS, KM_CTRL, 0);
km = WM_keymap_add_item(keymap, "WM_OT_context_toggle", TABKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(km->ptr, "data_path", "tool_settings.use_snap");
- km = WM_keymap_add_item(keymap, "TRANSFORM_OT_snap_type", TABKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "TRANSFORM_OT_snap_type", TABKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
+
+ km = WM_keymap_add_item(keymap, OP_TRANSLATION, TKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_boolean_set(km->ptr, "texture_space", 1);
+
+ km = WM_keymap_add_item(keymap, OP_RESIZE, TKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0);
+ RNA_boolean_set(km->ptr, "texture_space", 1);
break;
case SPACE_ACTION:
@@ -873,16 +888,16 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac
RNA_int_set(km->ptr, "mode", TFM_TIME_SLIDE);
break;
case SPACE_IPO:
- km= WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
- km= WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
+ WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EKEY, KM_PRESS, 0, 0);
RNA_int_set(km->ptr, "mode", TFM_TIME_EXTEND);
- km = WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
- km = WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
break;
case SPACE_NLA:
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", GKEY, KM_PRESS, 0, 0);
@@ -898,35 +913,35 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac
RNA_int_set(km->ptr, "mode", TFM_TIME_SCALE);
break;
case SPACE_NODE:
- km= WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
km= WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_A, KM_ANY, 0, 0);
RNA_enum_set(km->ptr, "release_confirm", 1);
km= WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
RNA_enum_set(km->ptr, "release_confirm", 1);
- km = WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
- km = WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
break;
case SPACE_SEQ:
- km= WM_keymap_add_item(keymap, OP_SEQ_SLIDE, GKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_SEQ_SLIDE, GKEY, KM_PRESS, 0, 0);
- km= WM_keymap_add_item(keymap, OP_SEQ_SLIDE, EVT_TWEAK_S, KM_ANY, 0, 0);
+ WM_keymap_add_item(keymap, OP_SEQ_SLIDE, EVT_TWEAK_S, KM_ANY, 0, 0);
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EKEY, KM_PRESS, 0, 0);
RNA_int_set(km->ptr, "mode", TFM_TIME_EXTEND);
break;
case SPACE_IMAGE:
- km = WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
- km= WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
+ WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
- km = WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
- km = WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
- km = WM_keymap_add_item(keymap, "TRANSFORM_OT_mirror", MKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "TRANSFORM_OT_mirror", MKEY, KM_PRESS, KM_CTRL, 0);
km = WM_keymap_add_item(keymap, "WM_OT_context_toggle", TABKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(km->ptr, "data_path", "tool_settings.use_snap");
diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c
index 210ab0d45a8..fb3758d2b0b 100644
--- a/source/blender/editors/transform/transform_orientations.c
+++ b/source/blender/editors/transform/transform_orientations.c
@@ -34,7 +34,7 @@
#include "DNA_screen_types.h"
#include "DNA_view3d_types.h"
-#include "BKE_utildefines.h"
+
#include "BKE_armature.h"
#include "BKE_context.h"
#include "BKE_report.h"
@@ -42,6 +42,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
//#include "BIF_editmesh.h"
//#include "BIF_interface.h"
@@ -72,13 +73,12 @@ void BIF_clearTransformOrientation(bContext *C)
}
}
-TransformOrientation* findOrientationName(bContext *C, char *name)
+static TransformOrientation* findOrientationName(ListBase *lb, const char *name)
{
- ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
TransformOrientation *ts= NULL;
- for (ts = transform_spaces->first; ts; ts = ts->next) {
- if (strncmp(ts->name, name, 35) == 0) {
+ for (ts= lb->first; ts; ts = ts->next) {
+ if (strncmp(ts->name, name, sizeof(ts->name)-1) == 0) {
return ts;
}
}
@@ -86,34 +86,14 @@ TransformOrientation* findOrientationName(bContext *C, char *name)
return NULL;
}
-void uniqueOrientationName(bContext *C, char *name)
+static int uniqueOrientationNameCheck(void *arg, const char *name)
{
- if (findOrientationName(C, name) != NULL)
- {
- char tempname[64];
- int number;
- char *dot;
-
-
- number = strlen(name);
-
- if (number && isdigit(name[number-1]))
- {
- dot = strrchr(name, '.'); // last occurrence
- if (dot)
- *dot=0;
- }
+ return findOrientationName((ListBase *)arg, name) != NULL;
+}
- for (number = 1; number <= 999; number++)
- {
- sprintf(tempname, "%s.%03d", name, number);
- if (findOrientationName(C, tempname) == NULL)
- {
- BLI_strncpy(name, tempname, 32);
- break;
- }
- }
- }
+static void uniqueOrientationName(ListBase *lb, char *name)
+{
+ BLI_uniquename_cb(uniqueOrientationNameCheck, lb, "Space", '.', name, sizeof(((TransformOrientation *)NULL)->name));
}
void BIF_createTransformOrientation(bContext *C, ReportList *reports, char *name, int use, int overwrite)
@@ -141,7 +121,7 @@ void BIF_createTransformOrientation(bContext *C, ReportList *reports, char *name
}
}
-TransformOrientation *createObjectSpace(bContext *C, ReportList *reports, char *name, int overwrite) {
+TransformOrientation *createObjectSpace(bContext *C, ReportList *UNUSED(reports), char *name, int overwrite) {
Base *base = CTX_data_active_base(C);
Object *ob;
float mat[3][3];
@@ -287,11 +267,11 @@ TransformOrientation* addMatrixSpace(bContext *C, float mat[3][3], char name[],
if (overwrite)
{
- ts = findOrientationName(C, name);
+ ts = findOrientationName(transform_spaces, name);
}
else
{
- uniqueOrientationName(C, name);
+ uniqueOrientationName(transform_spaces, name);
}
/* if not, create a new one */
@@ -310,7 +290,7 @@ TransformOrientation* addMatrixSpace(bContext *C, float mat[3][3], char name[],
void BIF_removeTransformOrientation(bContext *C, TransformOrientation *target) {
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
- TransformOrientation *ts = transform_spaces->first;
+ TransformOrientation *ts;
int i;
for (i = 0, ts = transform_spaces->first; ts; ts = ts->next, i++) {
@@ -337,35 +317,31 @@ void BIF_removeTransformOrientation(bContext *C, TransformOrientation *target) {
void BIF_removeTransformOrientationIndex(bContext *C, int index) {
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
- TransformOrientation *ts = transform_spaces->first;
- int i;
-
- for (i = 0, ts = transform_spaces->first; ts; ts = ts->next, i++) {
- if (i == index) {
- View3D *v3d = CTX_wm_view3d(C);
- if(v3d) {
- int selected_index = (v3d->twmode - V3D_MANIP_CUSTOM);
-
- // Transform_fix_me NEED TO DO THIS FOR ALL VIEW3D
- if (selected_index == i) {
- v3d->twmode = V3D_MANIP_GLOBAL; /* fallback to global */
- }
- else if (selected_index > i) {
- v3d->twmode--;
- }
-
- }
+ TransformOrientation *ts= BLI_findlink(transform_spaces, index);
- BLI_freelinkN(transform_spaces, ts);
- break;
+ if (ts) {
+ View3D *v3d = CTX_wm_view3d(C);
+ if(v3d) {
+ int selected_index = (v3d->twmode - V3D_MANIP_CUSTOM);
+
+ // Transform_fix_me NEED TO DO THIS FOR ALL VIEW3D
+ if (selected_index == index) {
+ v3d->twmode = V3D_MANIP_GLOBAL; /* fallback to global */
+ }
+ else if (selected_index > index) {
+ v3d->twmode--;
+ }
+
}
+
+ BLI_freelinkN(transform_spaces, ts);
}
}
void BIF_selectTransformOrientation(bContext *C, TransformOrientation *target) {
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
View3D *v3d = CTX_wm_view3d(C);
- TransformOrientation *ts = transform_spaces->first;
+ TransformOrientation *ts;
int i;
for (i = 0, ts = transform_spaces->first; ts; ts = ts->next, i++) {
@@ -425,7 +401,7 @@ EnumPropertyItem *BIF_enumTransformOrientation(bContext *C)
return item;
}
-char * BIF_menustringTransformOrientation(const bContext *C, char *title) {
+const char * BIF_menustringTransformOrientation(const bContext *C, const char *title) {
char menu[] = "%t|Global%x0|Local%x1|Gimbal%x4|Normal%x2|View%x3";
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
TransformOrientation *ts;
@@ -830,14 +806,14 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
{
if (ebone->flag & BONE_SELECTED)
{
- float mat[3][3];
+ float tmat[3][3];
float vec[3];
sub_v3_v3v3(vec, ebone->tail, ebone->head);
normalize_v3(vec);
add_v3_v3(normal, vec);
- vec_roll_to_mat3(vec, ebone->roll, mat);
- add_v3_v3(plane, mat[2]);
+ vec_roll_to_mat3(vec, ebone->roll, tmat);
+ add_v3_v3(plane, tmat[2]);
}
}
}
@@ -894,7 +870,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
result = ORIENTATION_EDGE;
}
}
- else if(ob && (ob->mode & (OB_MODE_SCULPT|OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT|OB_MODE_PARTICLE_EDIT)))
+ else if(ob && (ob->mode & (OB_MODE_ALL_PAINT|OB_MODE_PARTICLE_EDIT)))
{
}
else {
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index 778698d3060..93403ea5817 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -48,6 +48,7 @@
#include "BLI_math.h"
#include "BLI_editVert.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
//#include "BDR_drawobject.h"
//
@@ -105,17 +106,19 @@ float ResizeBetween(TransInfo *t, float p1[3], float p2[3]);
/****************** IMPLEMENTATIONS *********************/
+#if 0
int BIF_snappingSupported(Object *obedit)
{
int status = 0;
- if (obedit == NULL || ELEM3(obedit->type, OB_MESH, OB_ARMATURE, OB_CURVE)) /* only support object mesh, armature, curves */
+ if (obedit == NULL || ELEM4(obedit->type, OB_MESH, OB_ARMATURE, OB_CURVE, OB_LATTICE)) /* only support object mesh, armature, curves */
{
status = 1;
}
return status;
}
+#endif
int validSnap(TransInfo *t)
{
@@ -133,30 +136,30 @@ void drawSnapping(const struct bContext *C, TransInfo *t)
if (validSnap(t) && activeSnap(t))
{
- char col[4] = {1, 0, 1};
+ unsigned char col[4];
UI_GetThemeColor3ubv(TH_TRANSFORM, col);
- glColor4ub(col[0], col[1], col[2], 128);
+ col[3]= 128;
+ glColor4ubv(col);
if (t->spacetype == SPACE_VIEW3D) {
TransSnapPoint *p;
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d = CTX_wm_region_view3d(C);
- float tmat[4][4], imat[4][4];
+ float imat[4][4];
float size;
glDisable(GL_DEPTH_TEST);
- size = 0.5f * UI_GetThemeValuef(TH_VERTEX_SIZE);
-
- copy_m4_m4(tmat, rv3d->viewmat);
- invert_m4_m4(imat, tmat);
+ size = 2.5f * UI_GetThemeValuef(TH_VERTEX_SIZE);
+
+ invert_m4_m4(imat, rv3d->viewmat);
for (p = t->tsnap.points.first; p; p = p->next) {
- drawcircball(GL_LINE_LOOP, p->co, size * get_drawsize(t->ar, p->co), imat);
+ drawcircball(GL_LINE_LOOP, p->co, view3d_pixel_size(rv3d, p->co) * size, imat);
}
if (t->tsnap.status & POINT_INIT) {
- drawcircball(GL_LINE_LOOP, t->tsnap.snapPoint, size * get_drawsize(t->ar, t->tsnap.snapPoint), imat);
+ drawcircball(GL_LINE_LOOP, t->tsnap.snapPoint, view3d_pixel_size(rv3d, t->tsnap.snapPoint) * size, imat);
}
/* draw normal if needed */
@@ -211,7 +214,7 @@ void drawSnapping(const struct bContext *C, TransInfo *t)
}
}
-int handleSnapping(TransInfo *t, wmEvent *event)
+int handleSnapping(TransInfo *UNUSED(t), wmEvent *UNUSED(event))
{
int status = 0;
@@ -262,6 +265,8 @@ void applyProject(TransInfo *t)
}
else if (t->flag & T_OBJECT)
{
+ td->ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
+ object_handle_update(t->scene, td->ob);
VECCOPY(iloc, td->ob->obmat[3]);
}
@@ -371,9 +376,10 @@ void initSnappingMode(TransInfo *t)
/* Edit mode */
if (t->tsnap.applySnap != NULL && // A snapping function actually exist
- (obedit != NULL && ELEM3(obedit->type, OB_MESH, OB_ARMATURE, OB_CURVE)) ) // Temporary limited to edit mode meshes, armature, curves
+ (obedit != NULL && ELEM4(obedit->type, OB_MESH, OB_ARMATURE, OB_CURVE, OB_LATTICE)) ) // Temporary limited to edit mode meshes, armature, curves
{
- if ((t->flag & T_PROP_EDIT) || t->tsnap.project) /* also exclude edit for project, for now */
+ /* editmode meshes now supported */
+ if ((obedit->type != OB_MESH) && ((t->flag & T_PROP_EDIT) || t->tsnap.project)) /* also exclude edit for project, for now */
{
t->tsnap.modeSelect = SNAP_NOT_OBEDIT;
}
@@ -597,7 +603,7 @@ void ApplySnapResize(TransInfo *t, float vec[3])
/********************** DISTANCE **************************/
-float TranslationBetween(TransInfo *t, float p1[3], float p2[3])
+float TranslationBetween(TransInfo *UNUSED(t), float p1[3], float p2[3])
{
return len_v3v3(p1, p2);
}
@@ -681,12 +687,12 @@ float ResizeBetween(TransInfo *t, float p1[3], float p2[3])
/********************** CALC **************************/
-void CalcSnapGrid(TransInfo *t, float *vec)
+void CalcSnapGrid(TransInfo *t, float *UNUSED(vec))
{
snapGridAction(t, t->tsnap.snapPoint, BIG_GEARS);
}
-void CalcSnapGeometry(TransInfo *t, float *vec)
+void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec))
{
if (t->spacetype == SPACE_VIEW3D)
{
@@ -704,7 +710,7 @@ void CalcSnapGeometry(TransInfo *t, float *vec)
ListBase depth_peels;
DepthPeel *p1, *p2;
float *last_p = NULL;
- float dist = FLT_MAX;
+ float max_dist = FLT_MAX;
float p[3] = {0.0f, 0.0f, 0.0f};
depth_peels.first = depth_peels.last = NULL;
@@ -768,23 +774,27 @@ void CalcSnapGeometry(TransInfo *t, float *vec)
if (last_p == NULL)
{
VECCOPY(p, vec);
- dist = 0;
+ max_dist = 0;
break;
}
new_dist = len_v3v3(last_p, vec);
- if (new_dist < dist)
+ if (new_dist < max_dist)
{
VECCOPY(p, vec);
- dist = new_dist;
+ max_dist = new_dist;
}
}
}
- if (dist != FLT_MAX)
+ if (max_dist != FLT_MAX)
{
VECCOPY(loc, p);
+ /* XXX, is there a correct normal in this case ???, for now just z up */
+ no[0]= 0.0;
+ no[1]= 0.0;
+ no[2]= 1.0;
found = 1;
}
@@ -1191,7 +1201,7 @@ int snapVertex(ARegion *ar, float vco[3], short vno[3], float mval[2], float ray
return retval;
}
-int snapArmature(short snap_mode, ARegion *ar, Object *ob, bArmature *arm, float obmat[][4], float ray_start[3], float ray_normal[3], float mval[2], float *loc, float *no, int *dist, float *depth)
+int snapArmature(short snap_mode, ARegion *ar, Object *ob, bArmature *arm, float obmat[][4], float ray_start[3], float ray_normal[3], float mval[2], float *loc, float *UNUSED(no), int *dist, float *depth)
{
float imat[4][4];
float ray_start_local[3], ray_normal_local[3];
@@ -1261,7 +1271,7 @@ int snapDerivedMesh(short snap_mode, ARegion *ar, Object *ob, DerivedMesh *dm, E
int retval = 0;
int totvert = dm->getNumVerts(dm);
int totface = dm->getNumFaces(dm);
-
+
if (totvert > 0) {
float imat[4][4];
float timat[3][3]; /* transpose inverse matrix for normals */
@@ -1298,15 +1308,19 @@ int snapDerivedMesh(short snap_mode, ARegion *ar, Object *ob, DerivedMesh *dm, E
BVHTreeRayHit hit;
BVHTreeFromMesh treeData;
+ /* local scale in normal direction */
+ float local_scale = len_v3(ray_normal_local);
+
+ treeData.em_evil= em;
bvhtree_from_mesh_faces(&treeData, dm, 0.0f, 4, 6);
hit.index = -1;
- hit.dist = *depth;
+ hit.dist = *depth * (*depth == FLT_MAX ? 1.0f : local_scale);
if(treeData.tree && BLI_bvhtree_ray_cast(treeData.tree, ray_start_local, ray_normal_local, 0.0f, &hit, treeData.raycast_callback, &treeData) != -1)
{
- if(hit.dist<=*depth) {
- *depth= hit.dist;
+ if(hit.dist/local_scale <= *depth) {
+ *depth= hit.dist/local_scale;
copy_v3_v3(loc, hit.co);
copy_v3_v3(no, hit.no);
@@ -1532,7 +1546,8 @@ int snapObject(Scene *scene, ARegion *ar, Object *ob, int editobject, float obma
if (editobject)
{
em = ((Mesh *)ob->data)->edit_mesh;
- dm = editmesh_get_derived_cage(scene, ob, em, CD_MASK_BAREMESH);
+ /* dm = editmesh_get_derived_cage(scene, ob, em, CD_MASK_BAREMESH); */
+ dm = editmesh_get_derived_base(ob, em); /* limitation, em & dm MUST have the same number of faces */
}
else
{
@@ -1578,10 +1593,9 @@ int snapObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, float mv
Object *ob = base->object;
retval |= snapObject(scene, ar, ob, 0, ob->obmat, ray_start, ray_normal, mval, loc, no, dist, &depth);
}
-
- base= FIRSTBASE;
+
for ( base = FIRSTBASE; base != NULL; base = base->next ) {
- if ( BASE_SELECTABLE(v3d, base) && (base->flag & (BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA)) == 0 && ((mode == SNAP_NOT_SELECTED && (base->flag & (SELECT|BA_WAS_SEL)) == 0) || (ELEM(mode, SNAP_ALL, SNAP_NOT_OBEDIT) && base != BASACT)) ) {
+ if ( BASE_VISIBLE(v3d, base) && (base->flag & (BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA)) == 0 && ((mode == SNAP_NOT_SELECTED && (base->flag & (SELECT|BA_WAS_SEL)) == 0) || (ELEM(mode, SNAP_ALL, SNAP_NOT_OBEDIT) && base != BASACT)) ) {
Object *ob = base->object;
if (ob->transflag & OB_DUPLI)
@@ -1676,7 +1690,7 @@ void addDepthPeel(ListBase *depth_peels, float depth, float p[3], float no[3], O
peel->flag = 0;
}
-int peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float ray_start[3], float ray_normal[3], float mval[2], ListBase *depth_peels)
+int peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float ray_start[3], float ray_normal[3], float UNUSED(mval[2]), ListBase *depth_peels)
{
int retval = 0;
int totvert = dm->getNumVerts(dm);
@@ -1803,25 +1817,25 @@ int peelObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, ListBase
for(dupli_ob = lb->first; dupli_ob; dupli_ob = dupli_ob->next)
{
- Object *ob = dupli_ob->ob;
+ Object *dob = dupli_ob->ob;
- if (ob->type == OB_MESH) {
+ if (dob->type == OB_MESH) {
EditMesh *em;
DerivedMesh *dm = NULL;
int val;
- if (ob != obedit)
+ if (dob != obedit)
{
- dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
+ dm = mesh_get_derived_final(scene, dob, CD_MASK_BAREMESH);
- val = peelDerivedMesh(ob, dm, ob->obmat, ray_start, ray_normal, mval, depth_peels);
+ val = peelDerivedMesh(dob, dm, dob->obmat, ray_start, ray_normal, mval, depth_peels);
}
else
{
- em = ((Mesh *)ob->data)->edit_mesh;
+ em = ((Mesh *)dob->data)->edit_mesh;
dm = editmesh_get_derived_cage(scene, obedit, em, CD_MASK_BAREMESH);
- val = peelDerivedMesh(ob, dm, ob->obmat, ray_start, ray_normal, mval, depth_peels);
+ val = peelDerivedMesh(dob, dm, dob->obmat, ray_start, ray_normal, mval, depth_peels);
}
retval = retval || val;
diff --git a/source/blender/editors/util/CMakeLists.txt b/source/blender/editors/util/CMakeLists.txt
index a67be4631de..221a65620dd 100644
--- a/source/blender/editors/util/CMakeLists.txt
+++ b/source/blender/editors/util/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c *.cpp)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -32,4 +30,58 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_util "${SRC}" "${INC}")
+set(SRC
+ ed_util.c
+ editmode_undo.c
+ numinput.c
+ undo.c
+ navmesh_conversion.cpp
+
+ util_intern.h
+ # general includes
+ ../include/BIF_gl.h
+ ../include/BIF_glutil.h
+ ../include/ED_anim_api.h
+ ../include/ED_armature.h
+ ../include/ED_curve.h
+ ../include/ED_datafiles.h
+ ../include/ED_fileselect.h
+ ../include/ED_fluidsim.h
+ ../include/ED_gpencil.h
+ ../include/ED_image.h
+ ../include/ED_info.h
+ ../include/ED_keyframes_draw.h
+ ../include/ED_keyframes_edit.h
+ ../include/ED_keyframing.h
+ ../include/ED_lattice.h
+ ../include/ED_logic.h
+ ../include/ED_markers.h
+ ../include/ED_mball.h
+ ../include/ED_mesh.h
+ ../include/ED_navmesh_conversion.h
+ ../include/ED_node.h
+ ../include/ED_numinput.h
+ ../include/ED_object.h
+ ../include/ED_particle.h
+ ../include/ED_physics.h
+ ../include/ED_render.h
+ ../include/ED_screen.h
+ ../include/ED_screen_types.h
+ ../include/ED_sculpt.h
+ ../include/ED_sequencer.h
+ ../include/ED_sound.h
+ ../include/ED_space_api.h
+ ../include/ED_text.h
+ ../include/ED_transform.h
+ ../include/ED_types.h
+ ../include/ED_util.h
+ ../include/ED_uvedit.h
+ ../include/ED_view3d.h
+ ../include/UI_icons.h
+ ../include/UI_interface.h
+ ../include/UI_interface_icons.h
+ ../include/UI_resources.h
+ ../include/UI_view2d.h
+)
+
+blender_add_lib(bf_editor_util "${SRC}" "${INC}")
diff --git a/source/blender/editors/util/Makefile b/source/blender/editors/util/Makefile
deleted file mode 100644
index 8535b3fb402..00000000000
--- a/source/blender/editors/util/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_util
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/util/SConscript b/source/blender/editors/util/SConscript
index 810874da865..ab48dd79e20 100644
--- a/source/blender/editors/util/SConscript
+++ b/source/blender/editors/util/SConscript
@@ -8,4 +8,4 @@ incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
incs += ' ../../makesrna'
incs += ' #extern/recastnavigation/Recast/Include'
-env.BlenderLib ( 'bf_editors_util', sources, Split(incs), [], libtype=['core'], priority=[130] )
+env.BlenderLib ( 'bf_editors_util', sources, Split(incs), [], libtype=['core','player'], priority=[130,210] )
diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c
index 0d3d8a48b60..081bda60ba2 100644
--- a/source/blender/editors/util/ed_util.c
+++ b/source/blender/editors/util/ed_util.c
@@ -27,18 +27,23 @@
*/
#include <stdlib.h>
+#include <string.h>
#include <math.h>
#include "MEM_guardedalloc.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_packedFile_types.h"
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BKE_context.h"
+#include "BKE_global.h"
#include "BKE_main.h"
+#include "BKE_utildefines.h"
+#include "BKE_packedFile.h"
#include "ED_armature.h"
#include "ED_mesh.h"
@@ -48,6 +53,11 @@
#include "UI_interface.h"
+#include "WM_types.h"
+#include "RNA_access.h"
+
+
+
/* ********* general editor util funcs, not BKE stuff please! ********* */
void ED_editors_init(bContext *C)
@@ -152,7 +162,7 @@ void apply_keyb_grid(int shift, int ctrl, float *val, float fac1, float fac2, fl
}
-int GetButStringLength(char *str)
+int GetButStringLength(const char *str)
{
int rt;
@@ -161,3 +171,91 @@ int GetButStringLength(char *str)
return rt + 15;
}
+
+void unpack_menu(bContext *C, const char *opname, const char *id_name, const char *abs_name, const char *folder, struct PackedFile *pf)
+{
+ PointerRNA props_ptr;
+ uiPopupMenu *pup;
+ uiLayout *layout;
+ char line[FILE_MAXDIR + FILE_MAXFILE + 100];
+
+ pup= uiPupMenuBegin(C, "Unpack file", ICON_NULL);
+ layout= uiPupMenuLayout(pup);
+
+ sprintf(line, "Remove Pack");
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_REMOVE);
+ RNA_string_set(&props_ptr, "id", id_name);
+
+ if(G.relbase_valid) {
+ char local_name[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX];
+
+ BLI_strncpy(local_name, abs_name, sizeof(local_name));
+ BLI_splitdirstring(local_name, fi);
+ sprintf(local_name, "//%s/%s", folder, fi);
+ if(strcmp(abs_name, local_name)!=0) {
+ switch(checkPackedFile(local_name, pf)) {
+ case PF_NOFILE:
+ sprintf(line, "Create %s", local_name);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_WRITE_LOCAL);
+ RNA_string_set(&props_ptr, "id", id_name);
+
+ break;
+ case PF_EQUAL:
+ sprintf(line, "Use %s (identical)", local_name);
+ //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_USE_LOCAL);
+ RNA_string_set(&props_ptr, "id", id_name);
+
+ break;
+ case PF_DIFFERS:
+ sprintf(line, "Use %s (differs)", local_name);
+ //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_USE_LOCAL);
+ RNA_string_set(&props_ptr, "id", id_name);
+
+ sprintf(line, "Overwrite %s", local_name);
+ //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_LOCAL);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_WRITE_LOCAL);
+ RNA_string_set(&props_ptr, "id", id_name);
+ break;
+ }
+ }
+ }
+
+ switch(checkPackedFile(abs_name, pf)) {
+ case PF_NOFILE:
+ sprintf(line, "Create %s", abs_name);
+ //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_WRITE_ORIGINAL);
+ RNA_string_set(&props_ptr, "id", id_name);
+ break;
+ case PF_EQUAL:
+ sprintf(line, "Use %s (identical)", abs_name);
+ //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_USE_ORIGINAL);
+ RNA_string_set(&props_ptr, "id", id_name);
+ break;
+ case PF_DIFFERS:
+ sprintf(line, "Use %s (differs)", abs_name);
+ //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_USE_ORIGINAL);
+ RNA_string_set(&props_ptr, "id", id_name);
+
+ sprintf(line, "Overwrite %s", abs_name);
+ //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_WRITE_ORIGINAL);
+ RNA_string_set(&props_ptr, "id", id_name);
+ break;
+ }
+
+ uiPupMenuEnd(C, pup);
+}
diff --git a/source/blender/editors/util/editmode_undo.c b/source/blender/editors/util/editmode_undo.c
index 290c8a64881..85f343e3311 100644
--- a/source/blender/editors/util/editmode_undo.c
+++ b/source/blender/editors/util/editmode_undo.c
@@ -37,14 +37,15 @@
#include "DNA_object_types.h"
#include "DNA_screen_types.h"
-#include "BKE_context.h"
-#include "BKE_depsgraph.h"
-#include "BKE_global.h"
-
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
+#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+#include "BKE_global.h"
+
#include "ED_mesh.h"
#include "UI_interface.h"
@@ -55,7 +56,7 @@
Add this in your local code:
-void undo_editmode_push(bContext *C, char *name,
+void undo_editmode_push(bContext *C, const char *name,
void * (*getdata)(bContext *C), // use context to retrieve current editdata
void (*freedata)(void *), // pointer to function freeing data
void (*to_editmode)(void *, void *), // data to editmode conversion
@@ -74,7 +75,7 @@ void undo_editmode_menu(void) // history menu
/* ********************************************************************* */
/* ****** XXX ***** */
-void error(const char *dummy) {}
+void error(const char *UNUSED(arg)) {}
/* ****** XXX ***** */
@@ -108,7 +109,7 @@ static void undo_restore(UndoElem *undo, void *editdata)
}
/* name can be a dynamic string */
-void undo_editmode_push(bContext *C, char *name,
+void undo_editmode_push(bContext *C, const char *name,
void * (*getdata)(bContext *C),
void (*freedata)(void *),
void (*to_editmode)(void *, void *),
@@ -268,7 +269,7 @@ void undo_editmode_step(bContext *C, int step)
EM_selectmode_to_scene(CTX_data_scene(C), obedit);
}
- DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
/* XXX notifiers */
}
@@ -313,6 +314,20 @@ void undo_editmode_name(bContext *C, const char *undoname)
}
}
+/* undoname optionally, if NULL it just checks for existing undo steps */
+int undo_editmode_valid(const char *undoname)
+{
+ if(undoname) {
+ UndoElem *uel;
+
+ for(uel= undobase.last; uel; uel= uel->prev) {
+ if(strcmp(undoname, uel->name)==0)
+ break;
+ }
+ return uel != NULL;
+ }
+ return undobase.last != undobase.first;
+}
/* ************** for interaction with menu/pullown */
@@ -341,7 +356,7 @@ void undo_editmode_menu(bContext *C)
if(event>0) undo_number(C, event);
}
-static void do_editmode_undohistorymenu(bContext *C, void *arg, int event)
+static void do_editmode_undohistorymenu(bContext *C, void *UNUSED(arg), int event)
{
Object *obedit= CTX_data_edit_object(C);
@@ -351,7 +366,7 @@ static void do_editmode_undohistorymenu(bContext *C, void *arg, int event)
}
-uiBlock *editmode_undohistorymenu(bContext *C, ARegion *ar, void *arg_unused)
+uiBlock *editmode_undohistorymenu(bContext *C, ARegion *ar, void *UNUSED(arg))
{
uiBlock *block;
UndoElem *uel;
diff --git a/source/blender/editors/util/numinput.c b/source/blender/editors/util/numinput.c
index 868aa8ac6af..ccdbe7dfd4e 100644
--- a/source/blender/editors/util/numinput.c
+++ b/source/blender/editors/util/numinput.c
@@ -30,6 +30,7 @@
#include <math.h> /* fabs */
#include <stdio.h> /* for sprintf */
+#include "BLI_utildefines.h"
#include "WM_types.h"
diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c
index e5128ea784a..0158719b2fb 100644
--- a/source/blender/editors/util/undo.c
+++ b/source/blender/editors/util/undo.c
@@ -36,13 +36,15 @@
#include "DNA_object_types.h"
-#include "BKE_blender.h"
-#include "BKE_context.h"
-
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
+#include "BKE_blender.h"
+#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_screen.h"
#include "ED_armature.h"
#include "ED_particle.h"
@@ -63,7 +65,7 @@
/* ***************** generic undo system ********************* */
-void ED_undo_push(bContext *C, char *str)
+void ED_undo_push(bContext *C, const char *str)
{
wmWindowManager *wm= CTX_wm_manager(C);
Object *obedit= CTX_data_edit_object(C);
@@ -156,9 +158,10 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
if(do_glob_undo) {
if(U.uiflag & USER_GLOBALUNDO) {
-#ifndef DISABLE_PYTHON
+ // note python defines not valid here anymore.
+ //#ifdef WITH_PYTHON
// XXX BPY_scripts_clear_pyobjects();
-#endif
+ //#endif
if(undoname)
BKE_undo_name(C, undoname);
else
@@ -196,14 +199,60 @@ void ED_undo_pop_op(bContext *C, wmOperator *op)
ed_undo_step(C, 0, op->type->name);
}
-static int ed_undo_exec(bContext *C, wmOperator *op)
+/* name optionally, function used to check for operator redo panel */
+int ED_undo_valid(const bContext *C, const char *undoname)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ Object *obact= CTX_data_active_object(C);
+ ScrArea *sa= CTX_wm_area(C);
+
+ if(sa && sa->spacetype==SPACE_IMAGE) {
+ SpaceImage *sima= (SpaceImage *)sa->spacedata.first;
+
+ if((obact && obact->mode & OB_MODE_TEXTURE_PAINT) || sima->flag & SI_DRAWTOOL) {
+ return 1;
+ }
+ }
+
+ if(sa && sa->spacetype==SPACE_TEXT) {
+ return 1;
+ }
+ else if(obedit) {
+ if ELEM7(obedit->type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE) {
+ return undo_editmode_valid(undoname);
+ }
+ }
+ else {
+
+ /* if below tests fail, global undo gets executed */
+
+ if(obact && obact->mode & OB_MODE_TEXTURE_PAINT) {
+ if( ED_undo_paint_valid(UNDO_PAINT_IMAGE, undoname) )
+ return 1;
+ }
+ else if(obact && obact->mode & OB_MODE_SCULPT) {
+ if( ED_undo_paint_valid(UNDO_PAINT_MESH, undoname) )
+ return 1;
+ }
+ else if(obact && obact->mode & OB_MODE_PARTICLE_EDIT) {
+ return PE_undo_valid(CTX_data_scene(C));
+ }
+
+ if(U.uiflag & USER_GLOBALUNDO) {
+ return BKE_undo_valid(undoname);
+ }
+ }
+ return 0;
+}
+
+static int ed_undo_exec(bContext *C, wmOperator *UNUSED(op))
{
/* "last operator" should disappear, later we can tie ths with undo stack nicer */
WM_operator_stack_clear(C);
return ed_undo_step(C, 1, NULL);
}
-static int ed_redo_exec(bContext *C, wmOperator *op)
+static int ed_redo_exec(bContext *C, wmOperator *UNUSED(op))
{
return ed_undo_step(C, -1, NULL);
}
@@ -260,3 +309,53 @@ void ED_OT_redo(wmOperatorType *ot)
}
+/* ui callbacks should call this rather then calling WM_operator_repeat() themselves */
+int ED_undo_operator_repeat(bContext *C, struct wmOperator *op)
+{
+ int ret= 0;
+
+ if(op) {
+ ARegion *ar= CTX_wm_region(C);
+ ARegion *ar1= BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_WINDOW);
+
+ if(ar1)
+ CTX_wm_region_set(C, ar1);
+
+ if(WM_operator_repeat_check(C, op) && WM_operator_poll(C, op->type)) {
+ int retval;
+
+ if (G.f & G_DEBUG)
+ printf("redo_cb: operator redo %s\n", op->type->name);
+ ED_undo_pop_op(C, op);
+ retval= WM_operator_repeat(C, op);
+ if((retval & OPERATOR_FINISHED)==0) {
+ if (G.f & G_DEBUG)
+ printf("redo_cb: operator redo failed: %s, return %d\n", op->type->name, retval);
+ ED_undo_redo(C);
+ }
+ else {
+ ret= 1;
+ }
+ }
+
+ /* set region back */
+ CTX_wm_region_set(C, ar);
+ }
+ else {
+ if (G.f & G_DEBUG) {
+ printf("redo_cb: WM_operator_repeat_check returned false %s\n", op->type->name);
+ }
+ }
+
+ return ret;
+}
+
+void ED_undo_operator_repeat_cb(bContext *C, void *arg_op, void *UNUSED(arg_unused))
+{
+ ED_undo_operator_repeat(C, (wmOperator *)arg_op);
+}
+
+void ED_undo_operator_repeat_cb_evt(bContext *C, void *arg_op, int UNUSED(arg_event))
+{
+ ED_undo_operator_repeat(C, (wmOperator *)arg_op);
+}
diff --git a/source/blender/editors/util/util_intern.h b/source/blender/editors/util/util_intern.h
index 73675ab4ef9..b5750c55c87 100644
--- a/source/blender/editors/util/util_intern.h
+++ b/source/blender/editors/util/util_intern.h
@@ -34,6 +34,7 @@
/* editmode_undo.c */
void undo_editmode_clear(void);
void undo_editmode_name(bContext *C, const char *undoname);
+int undo_editmode_valid(const char *undoname);
#endif /* ED_UTIL_INTERN_H */
diff --git a/source/blender/editors/uvedit/CMakeLists.txt b/source/blender/editors/uvedit/CMakeLists.txt
index 36cd1274ec7..6333eded12e 100644
--- a/source/blender/editors/uvedit/CMakeLists.txt
+++ b/source/blender/editors/uvedit/CMakeLists.txt
@@ -19,9 +19,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
../../blenlib
@@ -32,4 +30,14 @@ SET(INC
../../../../intern/opennl/extern
)
-BLENDERLIB(bf_editor_uvedit "${SRC}" "${INC}")
+set(SRC
+ uvedit_draw.c
+ uvedit_ops.c
+ uvedit_parametrizer.c
+ uvedit_unwrap_ops.c
+
+ uvedit_intern.h
+ uvedit_parametrizer.h
+)
+
+blender_add_lib(bf_editor_uvedit "${SRC}" "${INC}")
diff --git a/source/blender/editors/uvedit/Makefile b/source/blender/editors/uvedit/Makefile
deleted file mode 100644
index e4b9ae72ccb..00000000000
--- a/source/blender/editors/uvedit/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_uvedit
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_OPENNL)/include
-
-# own include
-
-CPPFLAGS += -I../include
-
diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c
index f1f2dd8548a..98c71407631 100644
--- a/source/blender/editors/uvedit/uvedit_draw.c
+++ b/source/blender/editors/uvedit/uvedit_draw.c
@@ -35,18 +35,20 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "BLI_math.h"
+#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
+
#include "BKE_DerivedMesh.h"
#include "BKE_mesh.h"
-#include "BKE_utildefines.h"
-#include "BLI_math.h"
-#include "BLI_editVert.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
#include "ED_image.h"
#include "ED_mesh.h"
+#include "ED_uvedit.h"
#include "UI_resources.h"
@@ -113,7 +115,7 @@ static int draw_uvs_face_check(Scene *scene)
return (ts->uv_selectmode == UV_SELECT_FACE);
}
-static void draw_uvs_shadow(SpaceImage *sima, Object *obedit)
+static void draw_uvs_shadow(Object *obedit)
{
EditMesh *em;
EditFace *efa;
@@ -374,7 +376,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, EditMesh *em, MTFac
}
}
-static void draw_uvs_other(SpaceImage *sima, Scene *scene, Object *obedit, MTFace *activetf)
+static void draw_uvs_other(Scene *scene, Object *obedit, MTFace *activetf)
{
Base *base;
Image *curimage;
@@ -422,9 +424,9 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
EditFace *efa, *efa_act;
MTFace *tf, *activetf = NULL;
DerivedMesh *finaldm, *cagedm;
- char col1[4], col2[4];
+ unsigned char col1[4], col2[4];
float pointsize;
- int drawfaces, interpedges, lastsel, sel;
+ int drawfaces, interpedges;
Image *ima= sima->image;
em= BKE_mesh_get_editmesh(me);
@@ -440,7 +442,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
/* draw other uvs */
if(sima->flag & SI_DRAW_OTHER)
- draw_uvs_other(sima, scene, obedit, activetf);
+ draw_uvs_other(scene, obedit, activetf);
/* 1. draw shadow mesh */
@@ -625,8 +627,8 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
glColor4ubv((unsigned char *)col2);
if(me->drawflag & ME_DRAWEDGES) {
+ int lastsel= 0, sel;
UI_GetThemeColor4ubv(TH_VERTEX_SELECT, col1);
- lastsel = sel = 0;
if(interpedges) {
glShadeModel(GL_SMOOTH);
@@ -838,7 +840,7 @@ void draw_uvedit_main(SpaceImage *sima, ARegion *ar, Scene *scene, Object *obedi
if(show_uvedit || show_uvshadow) {
if(show_uvshadow)
- draw_uvs_shadow(sima, obedit);
+ draw_uvs_shadow(obedit);
else
draw_uvs(sima, scene, obedit);
diff --git a/source/blender/editors/uvedit/uvedit_intern.h b/source/blender/editors/uvedit/uvedit_intern.h
index 25e2aa2a26f..2c412697de3 100644
--- a/source/blender/editors/uvedit/uvedit_intern.h
+++ b/source/blender/editors/uvedit/uvedit_intern.h
@@ -37,28 +37,10 @@ struct Image;
struct Object;
struct wmOperatorType;
-#define UV_SELECT_ALL 1
-#define UV_SELECT_PINNED 2
-
/* id can be from 0 to 3 */
#define TF_PIN_MASK(id) (TF_PIN1 << id)
#define TF_SEL_MASK(id) (TF_SEL1 << id)
-/* visibility and selection */
-int uvedit_face_visible_nolocal(struct Scene *scene, struct EditFace *efa);
-int uvedit_face_visible(struct Scene *scene, struct Image *ima, struct EditFace *efa, struct MTFace *tf);
-
-int uvedit_face_selected(struct Scene *scene, struct EditFace *efa, struct MTFace *tf);
-void uvedit_face_select(struct Scene *scene, struct EditFace *efa, struct MTFace *tf);
-void uvedit_face_deselect(struct Scene *scene, struct EditFace *efa, struct MTFace *tf);
-
-int uvedit_edge_selected(struct Scene *scene, struct EditFace *efa, struct MTFace *tf, int i);
-void uvedit_edge_select(struct Scene *scene, struct EditFace *efa, struct MTFace *tf, int i);
-void uvedit_edge_deselect(struct Scene *scene, struct EditFace *efa, struct MTFace *tf, int i);
-
-int uvedit_uv_selected(struct Scene *scene, struct EditFace *efa, struct MTFace *tf, int i);
-void uvedit_uv_select(struct Scene *scene, struct EditFace *efa, struct MTFace *tf, int i);
-void uvedit_uv_deselect(struct Scene *scene, struct EditFace *efa, struct MTFace *tf, int i);
/* geometric utilities */
void uv_center(float uv[][2], float cent[2], int quad);
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index cd58ac4a482..0d3e9b94f98 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -40,6 +40,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_customdata.h"
@@ -51,6 +52,7 @@
#include "ED_image.h"
#include "ED_mesh.h"
+#include "ED_uvedit.h"
#include "ED_object.h"
#include "ED_screen.h"
#include "ED_transform.h"
@@ -134,14 +136,14 @@ void ED_uvedit_assign_image(Scene *scene, Object *obedit, Image *ima, Image *pre
/* and update depdency graph */
if(update)
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
BKE_mesh_end_editmesh(obedit->data, em);
}
/* dotile - 1, set the tile flag (from the space image)
* 2, set the tile index for the faces. */
-void ED_uvedit_set_tile(bContext *C, Scene *scene, Object *obedit, Image *ima, int curtile)
+static int uvedit_set_tile(Object *obedit, Image *ima, int curtile)
{
EditMesh *em;
EditFace *efa;
@@ -149,11 +151,14 @@ void ED_uvedit_set_tile(bContext *C, Scene *scene, Object *obedit, Image *ima, i
/* verify if we have something to do */
if(!ima || !ED_uvedit_test(obedit))
- return;
-
+ return 0;
+
+ if((ima->tpageflag & IMA_TILES) == 0)
+ return 0;
+
/* skip assigning these procedural images... */
if(ima->type==IMA_TYPE_R_RESULT || ima->type==IMA_TYPE_COMPOSITE)
- return;
+ return 0;
em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
@@ -164,9 +169,10 @@ void ED_uvedit_set_tile(bContext *C, Scene *scene, Object *obedit, Image *ima, i
tf->tile= curtile; /* set tile index */
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_tag_update(obedit->data, 0);
BKE_mesh_end_editmesh(obedit->data, em);
+
+ return 1;
}
/*********************** space conversion *********************/
@@ -245,9 +251,9 @@ int uvedit_edge_selected(Scene *scene, EditFace *efa, MTFace *tf, int i)
int nvert= (efa->v4)? 4: 3;
if(ts->uv_flag & UV_SYNC_SELECTION) {
- if(ts->selectmode == SCE_SELECT_FACE)
+ if(ts->selectmode & SCE_SELECT_FACE)
return (efa->f & SELECT);
- else if(ts->selectmode == SCE_SELECT_EDGE)
+ else if(ts->selectmode & SCE_SELECT_EDGE)
return (*(&efa->e1 + i))->f & SELECT;
else
return (((efa->v1 + i)->f & SELECT) && ((efa->v1 + (i+1)%nvert)->f & SELECT));
@@ -262,9 +268,9 @@ void uvedit_edge_select(Scene *scene, EditFace *efa, MTFace *tf, int i)
int nvert= (efa->v4)? 4: 3;
if(ts->uv_flag & UV_SYNC_SELECTION) {
- if(ts->selectmode == SCE_SELECT_FACE)
+ if(ts->selectmode & SCE_SELECT_FACE)
EM_select_face(efa, 1);
- else if(ts->selectmode == SCE_SELECT_EDGE)
+ else if(ts->selectmode & SCE_SELECT_EDGE)
EM_select_edge((*(&efa->e1 + i)), 1);
else {
(efa->v1 + i)->f |= SELECT;
@@ -281,9 +287,9 @@ void uvedit_edge_deselect(Scene *scene, EditFace *efa, MTFace *tf, int i)
int nvert= (efa->v4)? 4: 3;
if(ts->uv_flag & UV_SYNC_SELECTION) {
- if(ts->selectmode == SCE_SELECT_FACE)
+ if(ts->selectmode & SCE_SELECT_FACE)
EM_select_face(efa, 0);
- else if(ts->selectmode == SCE_SELECT_EDGE)
+ else if(ts->selectmode & SCE_SELECT_EDGE)
EM_select_edge((*(&efa->e1 + i)), 0);
else {
(efa->v1 + i)->f &= ~SELECT;
@@ -299,7 +305,7 @@ int uvedit_uv_selected(Scene *scene, EditFace *efa, MTFace *tf, int i)
ToolSettings *ts= scene->toolsettings;
if(ts->uv_flag & UV_SYNC_SELECTION) {
- if(ts->selectmode == SCE_SELECT_FACE)
+ if(ts->selectmode & SCE_SELECT_FACE)
return (efa->f & SELECT);
else
return (*(&efa->v1 + i))->f & SELECT;
@@ -313,7 +319,7 @@ void uvedit_uv_select(Scene *scene, EditFace *efa, MTFace *tf, int i)
ToolSettings *ts= scene->toolsettings;
if(ts->uv_flag & UV_SYNC_SELECTION) {
- if(ts->selectmode == SCE_SELECT_FACE)
+ if(ts->selectmode & SCE_SELECT_FACE)
EM_select_face(efa, 1);
else
(*(&efa->v1 + i))->f |= SELECT;
@@ -327,7 +333,7 @@ void uvedit_uv_deselect(Scene *scene, EditFace *efa, MTFace *tf, int i)
ToolSettings *ts= scene->toolsettings;
if(ts->uv_flag & UV_SYNC_SELECTION) {
- if(ts->selectmode == SCE_SELECT_FACE)
+ if(ts->selectmode & SCE_SELECT_FACE)
EM_select_face(efa, 0);
else
(*(&efa->v1 + i))->f &= ~SELECT;
@@ -845,7 +851,8 @@ static void select_linked(Scene *scene, Image *ima, EditMesh *em, float limit[2]
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if(uvedit_face_visible(scene, ima, efa, tf)) {
- if(tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)) {
+ const char select_flag= efa->v4 ? (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4) : (TF_SEL1|TF_SEL2|TF_SEL3);
+ if(tf->flag & select_flag) {
stack[stacksize]= a;
stacksize++;
flag[a]= 1;
@@ -873,7 +880,7 @@ static void select_linked(Scene *scene, Image *ima, EditMesh *em, float limit[2]
nverts= efa->v4? 4: 3;
for(i=0; i<nverts; i++) {
- /* make_uv_vert_map_EM sets verts tmp.l to the indicies */
+ /* make_uv_vert_map_EM sets verts tmp.l to the indices */
vlist= EM_get_uv_map_vert(vmap, (*(&efa->v1 + i))->tmp.l);
startv= vlist;
@@ -909,12 +916,9 @@ static void select_linked(Scene *scene, Image *ima, EditMesh *em, float limit[2]
else {
for(a=0, efa= em->faces.first; efa; efa= efa->next, a++) {
if(flag[a]) {
+ const char select_flag= efa->v4 ? (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4) : (TF_SEL1|TF_SEL2|TF_SEL3);
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if(efa->v4) {
- if((tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)))
- break;
- }
- else if(tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3))
+ if((tf->flag & select_flag))
break;
}
}
@@ -1015,7 +1019,7 @@ static void weld_align_uv(bContext *C, int tool)
}
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -1052,7 +1056,7 @@ void UV_OT_align(wmOperatorType *ot)
/* ******************** weld operator **************** */
-static int weld_exec(bContext *C, wmOperator *op)
+static int weld_exec(bContext *C, wmOperator *UNUSED(op))
{
weld_align_uv(C, 'w');
@@ -1082,7 +1086,6 @@ typedef struct UVVertAverage {
static int stitch_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima;
Scene *scene;
Object *obedit;
EditMesh *em;
@@ -1090,8 +1093,7 @@ static int stitch_exec(bContext *C, wmOperator *op)
EditVert *eve;
Image *ima;
MTFace *tf;
-
- sima= CTX_wm_space_image(C);
+
scene= CTX_data_scene(C);
obedit= CTX_data_edit_object(C);
em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
@@ -1238,7 +1240,7 @@ static int stitch_exec(bContext *C, wmOperator *op)
MEM_freeN(uv_average);
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -1264,7 +1266,7 @@ void UV_OT_stitch(wmOperatorType *ot)
/* ******************** (de)select all operator **************** */
-static int select_inverse_exec(bContext *C, wmOperator *op)
+static int select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene;
ToolSettings *ts;
@@ -1355,10 +1357,11 @@ static int select_all_exec(bContext *C, wmOperator *op)
if (action == SEL_TOGGLE) {
action = SEL_SELECT;
for(efa= em->faces.first; efa; efa= efa->next) {
+ const char select_flag= efa->v4 ? (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4) : (TF_SEL1|TF_SEL2|TF_SEL3);
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if(uvedit_face_visible(scene, ima, efa, tf)) {
- if(tf->flag & (TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4)) {
+ if(tf->flag & select_flag) {
action = SEL_DESELECT;
break;
}
@@ -1370,12 +1373,7 @@ static int select_all_exec(bContext *C, wmOperator *op)
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if(uvedit_face_visible(scene, ima, efa, tf)) {
- char select_flag;
-
- if(efa->v4)
- select_flag = (TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4);
- else
- select_flag = (TF_SEL1+TF_SEL2+TF_SEL3);
+ const char select_flag= efa->v4 ? (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4) : (TF_SEL1|TF_SEL2|TF_SEL3);
switch (action) {
case SEL_SELECT:
@@ -1703,7 +1701,7 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop)
}
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -1855,7 +1853,7 @@ static int select_linked_internal(bContext *C, wmOperator *op, wmEvent *event, i
select_linked(scene, ima, em, limit, hit_p, extend);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -1937,18 +1935,14 @@ static int unlink_selection_exec(bContext *C, wmOperator *op)
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if(uvedit_face_visible(scene, ima, efa, tf)) {
- if(efa->v4) {
- if(~tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4))
- tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
- }
- else {
- if(~tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3))
- tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3);
- }
+ const char select_flag= efa->v4 ? (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4) : (TF_SEL1|TF_SEL2|TF_SEL3);
+ if(~tf->flag & select_flag)
+ tf->flag &= ~select_flag;
+
}
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -2260,7 +2254,7 @@ void UV_OT_select_border(wmOperatorType *ot)
/* ******************** circle select operator **************** */
-static void select_uv_inside_ellipse(SpaceImage *sima, Scene *scene, int select, EditFace *efa, MTFace *tface, int index, float *offset, float *ell, int select_index)
+static void select_uv_inside_ellipse(Scene *scene, int select, EditFace *efa, MTFace *tface, int index, float *offset, float *ell, int select_index)
{
/* normalized ellipse: ell[0] = scaleX, ell[1] = scaleY */
float x, y, r2, *uv;
@@ -2309,11 +2303,11 @@ int circle_select_exec(bContext *C, wmOperator *op)
/* do selection */
for(efa= em->faces.first; efa; efa= efa->next) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- select_uv_inside_ellipse(sima, scene, select, efa, tface, 0, offset, ellipse, 0);
- select_uv_inside_ellipse(sima, scene, select, efa, tface, 1, offset, ellipse, 1);
- select_uv_inside_ellipse(sima, scene, select, efa, tface, 2, offset, ellipse, 2);
+ select_uv_inside_ellipse(scene, select, efa, tface, 0, offset, ellipse, 0);
+ select_uv_inside_ellipse(scene, select, efa, tface, 1, offset, ellipse, 1);
+ select_uv_inside_ellipse(scene, select, efa, tface, 2, offset, ellipse, 2);
if(efa->v4)
- select_uv_inside_ellipse(sima, scene, select, efa, tface, 3, offset, ellipse, 3);
+ select_uv_inside_ellipse(scene, select, efa, tface, 3, offset, ellipse, 3);
}
if(select) EM_select_flush(em);
@@ -2458,7 +2452,7 @@ static int snap_uvs_to_adjacent_unselected(Scene *scene, Image *ima, Object *obe
eve->tmp.l=-1;
/* index every vert that has a selected UV using it, but only once so as to
- * get unique indicies and to count how much to malloc */
+ * get unique indices and to count how much to malloc */
for(efa= em->faces.first; efa; efa= efa->next) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
@@ -2629,7 +2623,7 @@ static int snap_selection_exec(bContext *C, wmOperator *op)
if(!change)
return OPERATOR_CANCELLED;
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -2714,7 +2708,7 @@ void UV_OT_pin(wmOperatorType *ot)
/******************* select pinned operator ***************/
-static int select_pinned_exec(bContext *C, wmOperator *op)
+static int select_pinned_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
@@ -2800,11 +2794,9 @@ static int hide_exec(bContext *C, wmOperator *op)
tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
}
else if(em->selectmode == SCE_SELECT_FACE) {
- if((tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3))==0) {
- if(!efa->v4)
- EM_select_face(efa, 0);
- else if(!(tf->flag & TF_SEL4))
- EM_select_face(efa, 0);
+ const char select_flag= efa->v4 ? (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4) : (TF_SEL1|TF_SEL2|TF_SEL3);
+ if((tf->flag & select_flag)==0) {
+ EM_select_face(efa, 0);
tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
}
}
@@ -2845,9 +2837,8 @@ static int hide_exec(bContext *C, wmOperator *op)
tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
}
else if(em->selectmode == SCE_SELECT_FACE) {
- if(tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3))
- EM_select_face(efa, 0);
- else if(efa->v4 && tf->flag & TF_SEL4)
+ const char select_flag= efa->v4 ? (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4) : (TF_SEL1|TF_SEL2|TF_SEL3);
+ if(tf->flag & select_flag)
EM_select_face(efa, 0);
tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
@@ -2902,7 +2893,7 @@ void UV_OT_hide(wmOperatorType *ot)
/****************** reveal operator ******************/
-static int reveal_exec(bContext *C, wmOperator *op)
+static int reveal_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceImage *sima= CTX_wm_space_image(C);
ToolSettings *ts= CTX_data_tool_settings(C);
@@ -3038,6 +3029,9 @@ static int set_2d_cursor_exec(bContext *C, wmOperator *op)
SpaceImage *sima = CTX_wm_space_image(C);
float location[2];
+ if(!sima)
+ return OPERATOR_CANCELLED;
+
RNA_float_get_array(op->ptr, "location", location);
sima->cursor[0]= location[0];
sima->cursor[1]= location[1];
@@ -3086,16 +3080,18 @@ static int set_tile_exec(bContext *C, wmOperator *op)
{
Image *ima= CTX_data_edit_image(C);
int tile[2];
-
- if(!ima || !(ima->tpageflag & IMA_TILES))
- return OPERATOR_CANCELLED;
+ Object *obedit= CTX_data_edit_object(C);
RNA_int_get_array(op->ptr, "tile", tile);
- ED_uvedit_set_tile(C, CTX_data_scene(C), CTX_data_edit_object(C), ima, tile[0] + ima->xrep*tile[1]);
- WM_event_add_notifier(C, NC_SPACE|ND_SPACE_IMAGE, NULL);
+ if(uvedit_set_tile(obedit, ima, tile[0] + ima->xrep*tile[1])) {
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_IMAGE, NULL);
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
+ }
+
+ return OPERATOR_CANCELLED;
}
static int set_tile_invoke(bContext *C, wmOperator *op, wmEvent *event)
@@ -3189,6 +3185,7 @@ void ED_operatortypes_uvedit(void)
void ED_keymap_uvedit(wmKeyConfig *keyconf)
{
wmKeyMap *keymap;
+ wmKeyMapItem *kmi;
keymap= WM_keymap_find(keyconf, "UV Editor", 0, 0);
keymap->poll= ED_operator_uvedit;
@@ -3239,6 +3236,20 @@ void ED_keymap_uvedit(wmKeyConfig *keyconf)
/* menus */
WM_keymap_add_menu(keymap, "IMAGE_MT_uvs_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_menu(keymap, "IMAGE_MT_uvs_select_mode", TABKEY, KM_PRESS, KM_CTRL, 0);
+
+ /* pivot */
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", COMMAKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "data_path", "space_data.uv_editor.pivot_point");
+ RNA_string_set(kmi->ptr, "value", "CENTER");
+
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", COMMAKEY, KM_PRESS, KM_CTRL, 0);
+ RNA_string_set(kmi->ptr, "data_path", "space_data.uv_editor.pivot_point");
+ RNA_string_set(kmi->ptr, "value", "MEDIAN");
+
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", PERIODKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "data_path", "space_data.uv_editor.pivot_point");
+ RNA_string_set(kmi->ptr, "value", "CURSOR");
ED_object_generic_keymap(keyconf, keymap, 2);
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c
index 259b7a95492..dc5e17b5fae 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -6,8 +6,9 @@
#include "BLI_rand.h"
#include "BLI_heap.h"
#include "BLI_boxpack2d.h"
+#include "BLI_utildefines.h"
+
-#include "BKE_utildefines.h"
#include "ONL_opennl.h"
@@ -3735,7 +3736,7 @@ static void p_smooth(PChart *chart)
int j, it2, maxiter2, it;
int nedges = chart->nedges, nwheel, gridx, gridy;
int edgesx, edgesy, nsize, esize, i, x, y, maxiter, totiter;
- float minv[2], maxv[2], median, invmedian, distortion, avglen2d, avglen3d;
+ float minv[2], maxv[2], median, invmedian, avglen2d, avglen3d;
float center[2], dx, dy, *nodes, dlimit, d, *oldnodesx, *oldnodesy;
float *nodesx, *nodesy, *hedges, *vedges, climit, moved, padding;
SmoothTriangle *triangles, *t, *t2, **tri, **trip;
@@ -3754,7 +3755,6 @@ static void p_smooth(PChart *chart)
invmedian = 1.0/median;
/* compute edge distortion */
- distortion = 0.0;
avglen2d = avglen3d = 0.0;
for (e=chart->edges; e; e=e->nextlink) {
@@ -4360,7 +4360,7 @@ void param_pack(ParamHandle *handle, float margin)
}
if(margin>0.0f) {
- /* multiply the margin by the area to give pradictable results not dependant on UV scale,
+ /* multiply the margin by the area to give predictable results not dependant on UV scale,
* ...Without using the area running pack multiple times also gives a bad feedback loop.
* multiply by 0.1 so the margin value from the UI can be from 0.0 to 1.0 but not give a massive margin */
margin = (margin*(float)area) * 0.1;
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.h b/source/blender/editors/uvedit/uvedit_parametrizer.h
index 0fa54c64d95..147ea430b3b 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.h
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.h
@@ -26,7 +26,7 @@ typedef enum ParamBool {
- output will be written to the uv pointers
*/
-ParamHandle *param_construct_begin();
+ParamHandle *param_construct_begin(void);
void param_aspect_ratio(ParamHandle *handle, float aspx, float aspy);
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index 20c9fa5877b..09069be6d5f 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -38,17 +38,18 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "BLI_math.h"
+#include "BLI_edgehash.h"
+#include "BLI_editVert.h"
+#include "BLI_uvproject.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_image.h"
#include "BKE_mesh.h"
-#include "BLI_math.h"
-#include "BLI_edgehash.h"
-#include "BLI_editVert.h"
-#include "BLI_uvproject.h"
-
#include "PIL_time.h"
#include "ED_image.h"
@@ -143,8 +144,8 @@ ParamHandle *construct_param_handle(Scene *scene, EditMesh *em, short implicit,
efa = EM_get_actFace(em, 1);
if(efa) {
- MTFace *tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
float aspx, aspy;
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
ED_image_uv_aspect(tf->tpage, &aspx, &aspy);
@@ -153,7 +154,7 @@ ParamHandle *construct_param_handle(Scene *scene, EditMesh *em, short implicit,
}
}
- /* we need the vert indicies */
+ /* we need the vert indices */
for(ev= em->verts.first, a=0; ev; ev= ev->next, a++)
ev->tmp.l = a;
@@ -286,7 +287,7 @@ static void minimize_stretch_iteration(bContext *C, wmOperator *op, int interact
ms->lasttime = PIL_check_seconds_timer();
- DAG_id_flush_update(ms->obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ms->obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ms->obedit->data);
}
}
@@ -309,7 +310,7 @@ static void minimize_stretch_exit(bContext *C, wmOperator *op, int cancel)
param_stretch_end(ms->handle);
param_delete(ms->handle);
- DAG_id_flush_update(ms->obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ms->obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ms->obedit->data);
MEM_freeN(ms);
@@ -330,7 +331,7 @@ static int minimize_stretch_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int minimize_stretch_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int minimize_stretch_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
MinStretch *ms;
@@ -425,7 +426,7 @@ void UV_OT_minimize_stretch(wmOperatorType *ot)
/* ******************** Pack Islands operator **************** */
-static int pack_islands_exec(bContext *C, wmOperator *op)
+static int pack_islands_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
@@ -437,7 +438,7 @@ static int pack_islands_exec(bContext *C, wmOperator *op)
param_flush(handle);
param_delete(handle);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -458,7 +459,7 @@ void UV_OT_pack_islands(wmOperatorType *ot)
/* ******************** Average Islands Scale operator **************** */
-static int average_islands_scale_exec(bContext *C, wmOperator *op)
+static int average_islands_scale_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
@@ -470,7 +471,7 @@ static int average_islands_scale_exec(bContext *C, wmOperator *op)
param_flush(handle);
param_delete(handle);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -496,7 +497,7 @@ static ParamHandle *liveHandle = NULL;
void ED_uvedit_live_unwrap_begin(Scene *scene, Object *obedit)
{
EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
- short abf = scene->toolsettings->unwrapper == 1;
+ short abf = scene->toolsettings->unwrapper == 0;
short fillholes = scene->toolsettings->uvcalc_flag & UVCALC_FILLHOLES;
if(!ED_uvedit_test(obedit)) {
@@ -822,6 +823,9 @@ static int unwrap_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
+ /* remember last method for live unwrap */
+ scene->toolsettings->unwrapper = method;
+
handle= construct_param_handle(scene, em, 0, fill_holes, 1, correct_aspect);
param_lscm_begin(handle, PARAM_FALSE, method == 0);
@@ -834,7 +838,7 @@ static int unwrap_exec(bContext *C, wmOperator *op)
param_delete(handle);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -940,7 +944,7 @@ static int uv_from_view_exec(bContext *C, wmOperator *op)
uv_map_clip_correct(em, op);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -975,7 +979,7 @@ void UV_OT_from_view(wmOperatorType *ot)
/********************** Reset operator ********************/
-static int reset_exec(bContext *C, wmOperator *op)
+static int reset_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
@@ -1007,7 +1011,7 @@ static int reset_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -1095,7 +1099,7 @@ static int sphere_project_exec(bContext *C, wmOperator *op)
uv_map_clip_correct(em, op);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -1167,7 +1171,7 @@ static int cylinder_project_exec(bContext *C, wmOperator *op)
uv_map_clip_correct(em, op);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -1254,7 +1258,7 @@ static int cube_project_exec(bContext *C, wmOperator *op)
uv_map_clip_correct(em, op);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 5de7b0c5281..ce1c9c86780 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -24,13 +24,10 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-SET(INC
+set(INC
.
../blenlib
../blenkernel
- ../include
../imbuf
../makesdna
../makesrna
@@ -39,11 +36,23 @@ SET(INC
../../../intern/smoke/extern
)
-IF(WIN32)
- INCLUDE_DIRECTORIES(${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ intern/gpu_buffers.c
+ intern/gpu_codegen.c
+ intern/gpu_draw.c
+ intern/gpu_extensions.c
+ intern/gpu_material.c
+ intern/gpu_shader_material.glsl.c
+ intern/gpu_shader_vertex.glsl.c
+
+ GPU_buffers.h
+ GPU_draw.h
+ GPU_extensions.h
+ GPU_material.h
+ intern/gpu_codegen.h
+)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+add_definitions(-DGLEW_STATIC)
-BLENDERLIB(bf_gpu "${SRC}" "${INC}")
+blender_add_lib(bf_gpu "${SRC}" "${INC}")
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 6f552e087d7..342cc6b72a3 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -121,7 +121,7 @@ typedef struct GPUAttrib
int type;
} GPUAttrib;
-GPUBufferPool *GPU_buffer_pool_new();
+GPUBufferPool *GPU_buffer_pool_new(void);
void GPU_buffer_pool_free( GPUBufferPool *pool );
void GPU_buffer_pool_free_unused( GPUBufferPool *pool );
@@ -171,7 +171,7 @@ void GPU_color_switch( int mode );
void GPU_buffer_draw_elements( GPUBuffer *elements, unsigned int mode, int start, int count );
/* called after drawing */
-void GPU_buffer_unbind();
+void GPU_buffer_unbind(void);
int GPU_buffer_legacy( struct DerivedMesh *dm );
diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h
index 92bf43e9a5a..1f1bbab9abf 100644
--- a/source/blender/gpu/GPU_draw.h
+++ b/source/blender/gpu/GPU_draw.h
@@ -114,7 +114,7 @@ void GPU_paint_set_mipmap(int mipmap);
void GPU_paint_update_image(struct Image *ima, int x, int y, int w, int h, int mipmap);
void GPU_update_images_framechange(void);
int GPU_update_image_time(struct Image *ima, double time);
-int GPU_verify_image(struct Image *ima, struct ImageUser *iuser, int tftile, int tfmode, int compare, int mipmap);
+int GPU_verify_image(struct Image *ima, struct ImageUser *iuser, int tftile, int compare, int mipmap);
void GPU_free_image(struct Image *ima);
void GPU_free_images(void);
void GPU_free_images_anim(void);
diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h
index a7f43d3b0ae..4256d494302 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -57,7 +57,7 @@ typedef struct GPUShader GPUShader;
void GPU_extensions_disable(void);
void GPU_extensions_init(void); /* call this before running any of the functions below */
void GPU_extensions_exit(void);
-int GPU_print_error(char *str);
+int GPU_print_error(const char *str);
int GPU_glsl_support(void);
int GPU_non_power_of_two_support(void);
@@ -130,19 +130,20 @@ int GPU_texture_opengl_height(GPUTexture *tex);
- after any of the GPU_framebuffer_* functions, GPU_framebuffer_restore must
be called before rendering to the window framebuffer again */
-GPUFrameBuffer *GPU_framebuffer_create();
+GPUFrameBuffer *GPU_framebuffer_create(void);
int GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex);
void GPU_framebuffer_texture_detach(GPUFrameBuffer *fb, GPUTexture *tex);
void GPU_framebuffer_texture_bind(GPUFrameBuffer *fb, GPUTexture *tex);
void GPU_framebuffer_texture_unbind(GPUFrameBuffer *fb, GPUTexture *tex);
void GPU_framebuffer_free(GPUFrameBuffer *fb);
-void GPU_framebuffer_restore();
+void GPU_framebuffer_restore(void);
/* GPU OffScreen
- - wrapper around framebuffer and texture for simple offscreen drawing */
+ - wrapper around framebuffer and texture for simple offscreen drawing
+ - changes size if graphics card can't support it */
-GPUOffScreen *GPU_offscreen_create(int width, int height);
+GPUOffScreen *GPU_offscreen_create(int *width, int *height);
void GPU_offscreen_free(GPUOffScreen *ofs);
void GPU_offscreen_bind(GPUOffScreen *ofs);
void GPU_offscreen_unbind(GPUOffScreen *ofs);
@@ -156,9 +157,9 @@ GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, const
void GPU_shader_free(GPUShader *shader);
void GPU_shader_bind(GPUShader *shader);
-void GPU_shader_unbind();
+void GPU_shader_unbind(GPUShader *shader);
-int GPU_shader_get_uniform(GPUShader *shader, char *name);
+int GPU_shader_get_uniform(GPUShader *shader, const char *name);
void GPU_shader_uniform_vector(GPUShader *shader, int location, int length,
int arraysize, float *value);
void GPU_shader_uniform_texture(GPUShader *shader, int location, GPUTexture *tex);
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index e0602c20272..bfc74683c9d 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -93,7 +93,7 @@ typedef enum GPUBlendMode {
typedef struct GPUNodeStack {
GPUType type;
- char *name;
+ const char *name;
float vec[4];
struct GPUNodeLink *link;
short hasinput;
@@ -101,7 +101,7 @@ typedef struct GPUNodeStack {
short sockettype;
} GPUNodeStack;
-GPUNodeLink *GPU_attribute(int type, char *name);
+GPUNodeLink *GPU_attribute(int type, const char *name);
GPUNodeLink *GPU_uniform(float *num);
GPUNodeLink *GPU_dynamic_uniform(float *num);
GPUNodeLink *GPU_image(struct Image *ima, struct ImageUser *iuser);
@@ -110,8 +110,8 @@ GPUNodeLink *GPU_dynamic_texture(struct GPUTexture *tex);
GPUNodeLink *GPU_socket(GPUNodeStack *sock);
GPUNodeLink *GPU_builtin(GPUBuiltin builtin);
-int GPU_link(GPUMaterial *mat, char *name, ...);
-int GPU_stack_link(GPUMaterial *mat, char *name, GPUNodeStack *in, GPUNodeStack *out, ...);
+int GPU_link(GPUMaterial *mat, const char *name, ...);
+int GPU_stack_link(GPUMaterial *mat, const char *name, GPUNodeStack *in, GPUNodeStack *out, ...);
void GPU_material_output_link(GPUMaterial *material, GPUNodeLink *link);
void GPU_material_enable_alpha(GPUMaterial *material);
@@ -122,7 +122,7 @@ GPUBlendMode GPU_material_blend_mode(GPUMaterial *material, float obcol[4]);
GPUMaterial *GPU_material_from_blender(struct Scene *scene, struct Material *ma);
void GPU_material_free(struct Material *ma);
-void GPU_materials_free();
+void GPU_materials_free(void);
void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap);
void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4]);
diff --git a/source/blender/gpu/Makefile b/source/blender/gpu/Makefile
deleted file mode 100644
index eaa8a69bfdd..00000000000
--- a/source/blender/gpu/Makefile
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
-#
-# 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. The Blender
-# Foundation also sells licenses for use in proprietary software under
-# the Blender License. See http://www.blender.org/BL/ for information
-# about this.
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL/BL DUAL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-SOURCEDIR = source/blender/gpu
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/gpu/intern/Makefile b/source/blender/gpu/intern/Makefile
deleted file mode 100644
index 088b56edbab..00000000000
--- a/source/blender/gpu/intern/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
-#
-# 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. The Blender
-# Foundation also sells licenses for use in proprietary software under
-# the Blender License. See http://www.blender.org/BL/ for information
-# about this.
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL/BL DUAL LICENSE BLOCK *****
-#
-
-LIBNAME = gpu
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-ifeq ($(OS),$(findstring $(OS), "darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I$(NAN_SMOKE)/include
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I../
-
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 5bddb42add2..eae5ca1b4b9 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -38,8 +38,9 @@
#include "MEM_guardedalloc.h"
-#include "BLI_ghash.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
#include "BLI_threads.h"
#include "DNA_meshdata_types.h"
@@ -241,7 +242,7 @@ void GPU_buffer_free( GPUBuffer *buffer, GPUBufferPool *pool )
if( pool == 0 )
pool = globalPool;
if( pool == 0 )
- globalPool = GPU_buffer_pool_new();
+ pool = globalPool = GPU_buffer_pool_new();
/* free the last used buffer in the queue if no more space, but only
if we are in the main thread. for e.g. rendering or baking it can
@@ -268,7 +269,6 @@ void GPU_buffer_free( GPUBuffer *buffer, GPUBufferPool *pool )
GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm )
{
GPUDrawObject *object;
- MVert *mvert;
MFace *mface;
int numverts[32768]; /* material number is an 16-bit short so there's at most 32768 materials */
int redir[32768]; /* material number is an 16-bit short so there's at most 32768 materials */
@@ -290,7 +290,6 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm )
/*object->legacy = 1;*/
memset(numverts,0,sizeof(int)*32768);
- mvert = dm->getVertArray(dm);
mface = dm->getFaceArray(dm);
numfaces= dm->getNumFaces(dm);
@@ -491,7 +490,11 @@ void *GPU_build_mesh_buffers(GHash *map, MVert *mvert, MFace *mface,
if(tri_data) {
for(i = 0; i < totface; ++i) {
MFace *f = mface + face_indices[i];
- int v[3] = {f->v1, f->v2, f->v3};
+ int v[3];
+
+ v[0]= f->v1;
+ v[1]= f->v2;
+ v[2]= f->v3;
for(j = 0; j < (f->v4 ? 2 : 1); ++j) {
for(k = 0; k < 3; ++k) {
@@ -592,8 +595,8 @@ void GPU_update_grid_buffers(void *buffers_v, DMGridData **grids,
//printf("node updated %p\n", buffers_v);
}
-void *GPU_build_grid_buffers(DMGridData **grids,
- int *grid_indices, int totgrid, int gridsize)
+void *GPU_build_grid_buffers(DMGridData **UNUSED(grids), int *UNUSED(grid_indices),
+ int totgrid, int gridsize)
{
GPU_Buffers *buffers;
int i, j, k, totquad, offset= 0;
@@ -852,7 +855,7 @@ GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int size, G
return buffer;
}
-void GPU_buffer_copy_vertex( DerivedMesh *dm, float *varray, int *index, int *redir, void *user )
+void GPU_buffer_copy_vertex(DerivedMesh *dm, float *varray, int *index, int *redir, void *UNUSED(user))
{
int start;
int i, j, numfaces;
@@ -901,7 +904,7 @@ GPUBuffer *GPU_buffer_vertex( DerivedMesh *dm )
return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*(dm->drawObject->nelements+dm->drawObject->nlooseverts), GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_vertex);
}
-void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int *redir, void *user )
+void GPU_buffer_copy_normal(DerivedMesh *dm, float *varray, int *index, int *redir, void *UNUSED(user))
{
int i, numfaces;
int start;
@@ -915,6 +918,8 @@ void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int *re
numfaces= dm->getNumFaces(dm);
for( i=0; i < numfaces; i++ ) {
+ const int smoothnormal = (mface[i].flag & ME_SMOOTH);
+
start = index[redir[mface[i].mat_nr+16383]];
if( mface[i].v4 )
index[redir[mface[i].mat_nr+16383]] += 18;
@@ -922,7 +927,7 @@ void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int *re
index[redir[mface[i].mat_nr+16383]] += 9;
/* v1 v2 v3 */
- if( mface[i].flag & ME_SMOOTH ) {
+ if(smoothnormal) {
VECCOPY(&varray[start],mvert[mface[i].v1].no);
VECCOPY(&varray[start+3],mvert[mface[i].v2].no);
VECCOPY(&varray[start+6],mvert[mface[i].v3].no);
@@ -944,7 +949,7 @@ void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int *re
if( mface[i].v4 ) {
/* v3 v4 v1 */
- if( mface[i].flag & ME_SMOOTH ) {
+ if(smoothnormal) {
VECCOPY(&varray[start+9],mvert[mface[i].v3].no);
VECCOPY(&varray[start+12],mvert[mface[i].v4].no);
VECCOPY(&varray[start+15],mvert[mface[i].v1].no);
@@ -965,7 +970,7 @@ GPUBuffer *GPU_buffer_normal( DerivedMesh *dm )
return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_normal);
}
-void GPU_buffer_copy_uv( DerivedMesh *dm, float *varray, int *index, int *redir, void *user )
+void GPU_buffer_copy_uv(DerivedMesh *dm, float *varray, int *index, int *redir, void *UNUSED(user))
{
int start;
int i, numfaces;
@@ -1107,18 +1112,16 @@ GPUBuffer *GPU_buffer_color( DerivedMesh *dm )
return result;
}
-void GPU_buffer_copy_edge( DerivedMesh *dm, float *varray, int *index, int *redir, void *user )
+void GPU_buffer_copy_edge(DerivedMesh *dm, float *varray, int *UNUSED(index), int *UNUSED(redir), void *UNUSED(user))
{
int i;
- MVert *mvert;
MEdge *medge;
unsigned int *varray_ = (unsigned int *)varray;
int numedges;
DEBUG_VBO("GPU_buffer_copy_edge\n");
- mvert = dm->getVertArray(dm);
medge = dm->getEdgeArray(dm);
numedges= dm->getNumEdges(dm);
@@ -1135,7 +1138,7 @@ GPUBuffer *GPU_buffer_edge( DerivedMesh *dm )
return GPU_buffer_setup( dm, dm->drawObject, sizeof(int)*2*dm->drawObject->nedges, GL_ELEMENT_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_edge);
}
-void GPU_buffer_copy_uvedge( DerivedMesh *dm, float *varray, int *index, int *redir, void *user )
+void GPU_buffer_copy_uvedge(DerivedMesh *dm, float *varray, int *UNUSED(index), int *UNUSED(redir), void *UNUSED(user))
{
MTFace *tf = DM_get_face_data_layer(dm, CD_MTFACE);
int i, j=0;
@@ -1175,8 +1178,13 @@ void GPU_buffer_copy_uvedge( DerivedMesh *dm, float *varray, int *index, int *re
GPUBuffer *GPU_buffer_uvedge( DerivedMesh *dm )
{
DEBUG_VBO("GPU_buffer_uvedge\n");
-
- return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*2*(dm->drawObject->nelements/3)*2, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_uvedge);
+ /* logic here:
+ * ...each face gets 3 'nelements'
+ * ...3 edges per triangle
+ * ...each edge has its own, non-shared coords.
+ * so each tri corner needs minimum of 4 floats, quads used less so here we can over allocate and assume all tris.
+ * */
+ return GPU_buffer_setup( dm, dm->drawObject, 4 * sizeof(float) * dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_uvedge);
}
@@ -1487,7 +1495,7 @@ void GPU_interleaved_attrib_setup( GPUBuffer *buffer, GPUAttrib data[], int numd
glBindBufferARB( GL_ARRAY_BUFFER_ARB, buffer->id );
for( i = 0; i < numdata; i++ ) {
glEnableVertexAttribArrayARB( data[i].index );
- glVertexAttribPointerARB( data[i].index, data[i].size, data[i].type, GL_TRUE, elementsize, (void *)offset );
+ glVertexAttribPointerARB( data[i].index, data[i].size, data[i].type, GL_FALSE, elementsize, (void *)offset );
offset += data[i].size*GPU_typesize(data[i].type);
attribData[i].index = data[i].index;
@@ -1499,7 +1507,7 @@ void GPU_interleaved_attrib_setup( GPUBuffer *buffer, GPUAttrib data[], int numd
else {
for( i = 0; i < numdata; i++ ) {
glEnableVertexAttribArrayARB( data[i].index );
- glVertexAttribPointerARB( data[i].index, data[i].size, data[i].type, GL_TRUE, elementsize, (char *)buffer->pointer + offset );
+ glVertexAttribPointerARB( data[i].index, data[i].size, data[i].type, GL_FALSE, elementsize, (char *)buffer->pointer + offset );
offset += data[i].size*GPU_typesize(data[i].type);
}
}
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index d596f573682..9f0bbda91bb 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -38,12 +38,12 @@
#include "DNA_image_types.h"
#include "DNA_material_types.h"
-#include "BLI_dynstr.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+#include "BLI_dynstr.h"
#include "BLI_ghash.h"
#include "BLI_heap.h"
-
#include "GPU_material.h"
#include "GPU_extensions.h"
@@ -76,13 +76,13 @@ typedef enum GPUDataSource {
GPU_SOURCE_ATTRIB
} GPUDataSource;
-static char* GPU_DATATYPE_STR[17] = {"", "float", "vec2", "vec3", "vec4",
+static const char* GPU_DATATYPE_STR[17] = {"", "float", "vec2", "vec3", "vec4",
0, 0, 0, 0, "mat3", 0, 0, 0, 0, 0, 0, "mat4"};
struct GPUNode {
struct GPUNode *next, *prev;
- char *name;
+ const char *name;
int tag;
ListBase inputs;
@@ -93,7 +93,7 @@ struct GPUNodeLink {
GPUNodeStack *socket;
int attribtype;
- char *attribname;
+ const char *attribname;
int image;
@@ -188,7 +188,7 @@ static GHash *FUNCTION_HASH= NULL;
/*static char *FUNCTION_PROTOTYPES= NULL;
static GPUShader *FUNCTION_LIB= NULL;*/
-static int gpu_str_prefix(char *str, char *prefix)
+static int gpu_str_prefix(const char *str, const char *prefix)
{
while(*str && *prefix) {
if(*str != *prefix)
@@ -346,7 +346,7 @@ static char *gpu_generate_function_prototyps(GHash *hash)
}
#endif
-GPUFunction *GPU_lookup_function(char *name)
+GPUFunction *GPU_lookup_function(const char *name)
{
if(!FUNCTION_HASH) {
FUNCTION_HASH = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "GPU_lookup_function gh");
@@ -355,7 +355,7 @@ GPUFunction *GPU_lookup_function(char *name)
FUNCTION_LIB = GPU_shader_create_lib(datatoc_gpu_shader_material_glsl);*/
}
- return (GPUFunction*)BLI_ghash_lookup(FUNCTION_HASH, name);
+ return (GPUFunction*)BLI_ghash_lookup(FUNCTION_HASH, (void *)name);
}
void GPU_extensions_exit(void)
@@ -381,7 +381,7 @@ void GPU_extensions_exit(void)
/* GLSL code generation */
-static void codegen_convert_datatype(DynStr *ds, int from, int to, char *tmp, int id)
+static void codegen_convert_datatype(DynStr *ds, int from, int to, const char *tmp, int id)
{
char name[1024];
@@ -449,7 +449,7 @@ static int codegen_input_has_texture(GPUInput *input)
return input->tex != 0;
}
-char *GPU_builtin_name(GPUBuiltin builtin)
+const char *GPU_builtin_name(GPUBuiltin builtin)
{
if(builtin == GPU_VIEW_MATRIX)
return "unfviewmat";
@@ -554,7 +554,7 @@ static void codegen_print_uniforms_functions(DynStr *ds, ListBase *nodes)
{
GPUNode *node;
GPUInput *input;
- char *name;
+ const char *name;
int builtins = 0;
/* print uniforms */
@@ -686,7 +686,7 @@ static void codegen_call_functions(DynStr *ds, ListBase *nodes, GPUOutput *final
BLI_dynstr_append(ds, ";\n");
}
-static char *code_generate_fragment(ListBase *nodes, GPUOutput *output, const char *name)
+static char *code_generate_fragment(ListBase *nodes, GPUOutput *output, const char *UNUSED(name))
{
DynStr *ds = BLI_dynstr_new();
char *code;
@@ -907,16 +907,16 @@ void GPU_node_link_free(GPUNodeLink *link)
/* Node Functions */
-GPUNode *GPU_node_begin(char *name)
+GPUNode *GPU_node_begin(const char *name)
{
GPUNode *node = MEM_callocN(sizeof(GPUNode), "GPUNode");
- node->name = name;
+ node->name= name;
return node;
}
-void GPU_node_end(GPUNode *node)
+void GPU_node_end(GPUNode *UNUSED(node))
{
/* empty */
}
@@ -925,7 +925,7 @@ static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, int type)
{
GPUInput *input;
GPUNode *outnode;
- char *name;
+ const char *name;
if(link->output) {
outnode = link->output->node;
@@ -1036,7 +1036,7 @@ static void gpu_node_input_socket(GPUNode *node, GPUNodeStack *sock)
}
}
-void GPU_node_output(GPUNode *node, int type, char *name, GPUNodeLink **link)
+static void GPU_node_output(GPUNode *node, int type, const char *UNUSED(name), GPUNodeLink **link)
{
GPUOutput *output = MEM_callocN(sizeof(GPUOutput), "GPUOutput");
@@ -1149,7 +1149,7 @@ void gpu_nodes_get_builtin_flag(ListBase *nodes, int *builtin)
/* varargs linking */
-GPUNodeLink *GPU_attribute(int type, char *name)
+GPUNodeLink *GPU_attribute(int type, const char *name)
{
GPUNodeLink *link = GPU_node_link_create(0);
@@ -1230,7 +1230,7 @@ GPUNodeLink *GPU_builtin(GPUBuiltin builtin)
return link;
}
-int GPU_link(GPUMaterial *mat, char *name, ...)
+int GPU_link(GPUMaterial *mat, const char *name, ...)
{
GPUNode *node;
GPUFunction *function;
@@ -1266,7 +1266,7 @@ int GPU_link(GPUMaterial *mat, char *name, ...)
return 1;
}
-int GPU_stack_link(GPUMaterial *mat, char *name, GPUNodeStack *in, GPUNodeStack *out, ...)
+int GPU_stack_link(GPUMaterial *mat, const char *name, GPUNodeStack *in, GPUNodeStack *out, ...)
{
GPUNode *node;
GPUFunction *function;
@@ -1333,7 +1333,7 @@ int GPU_link_changed(GPUNodeLink *link)
{
GPUNode *node;
GPUInput *input;
- char *name;
+ const char *name;
if(link->output) {
node = link->output->node;
diff --git a/source/blender/gpu/intern/gpu_codegen.h b/source/blender/gpu/intern/gpu_codegen.h
index 3272f0fa1a9..968e679af0e 100644
--- a/source/blender/gpu/intern/gpu_codegen.h
+++ b/source/blender/gpu/intern/gpu_codegen.h
@@ -55,7 +55,7 @@ typedef struct GPUFunction {
int totparam;
} GPUFunction;
-GPUFunction *GPU_lookup_function(char *name);
+GPUFunction *GPU_lookup_function(const char *name);
/* Pass Generation
- Takes a list of nodes and a desired output, and makes a pass. This
@@ -79,7 +79,7 @@ void GPU_pass_free(GPUPass *pass);
/* Material calls */
-char *GPU_builtin_name(GPUBuiltin builtin);
+const char *GPU_builtin_name(GPUBuiltin builtin);
void gpu_material_add_node(struct GPUMaterial *material, struct GPUNode *node);
int GPU_link_changed(struct GPUNodeLink *link);
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index 798bf5f86ff..dedcab91e06 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -35,6 +35,7 @@
#include "GL/glew.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_lamp_types.h"
#include "DNA_material_types.h"
@@ -58,7 +59,7 @@
#include "BKE_material.h"
#include "BKE_node.h"
#include "BKE_object.h"
-#include "BKE_utildefines.h"
+
#include "BLI_threads.h"
#include "BLI_blenlib.h"
@@ -307,7 +308,7 @@ static void gpu_make_repbind(Image *ima)
ima->repbind= MEM_callocN(sizeof(int)*ima->totbind, "repbind");
}
-static void gpu_clear_tpage()
+static void gpu_clear_tpage(void)
{
if(GTS.lasttface==0)
return;
@@ -394,7 +395,7 @@ static void gpu_verify_reflection(Image *ima)
}
}
-int GPU_verify_image(Image *ima, ImageUser *iuser, int tftile, int tfmode, int compare, int mipmap)
+int GPU_verify_image(Image *ima, ImageUser *iuser, int tftile, int compare, int mipmap)
{
ImBuf *ibuf = NULL;
unsigned int *bind = NULL;
@@ -593,7 +594,7 @@ int GPU_set_tpage(MTFace *tface, int mipmap)
gpu_verify_alpha_mode(tface);
gpu_verify_reflection(ima);
- if(GPU_verify_image(ima, NULL, tface->tile, tface->mode, 1, mipmap)) {
+ if(GPU_verify_image(ima, NULL, tface->tile, 1, mipmap)) {
GTS.curtile= GTS.tile;
GTS.curima= GTS.ima;
GTS.curtilemode= GTS.tilemode;
@@ -775,9 +776,9 @@ void GPU_free_smoke(SmokeModifierData *smd)
void GPU_create_smoke(SmokeModifierData *smd, int highres)
{
- if(smd->type & MOD_SMOKE_TYPE_DOMAIN && smd->domain && !smd->domain->tex && !highres)
+ if(smd->type & MOD_SMOKE_TYPE_DOMAIN && !smd->domain->tex && !highres)
smd->domain->tex = GPU_texture_create_3D(smd->domain->res[0], smd->domain->res[1], smd->domain->res[2], smoke_get_density(smd->domain->fluid));
- else if(smd->type & MOD_SMOKE_TYPE_DOMAIN && smd->domain && !smd->domain->tex && highres)
+ else if(smd->type & MOD_SMOKE_TYPE_DOMAIN && !smd->domain->tex && highres)
smd->domain->tex = GPU_texture_create_3D(smd->domain->res_wt[0], smd->domain->res_wt[1], smd->domain->res_wt[2], smoke_turbulence_get_density(smd->domain->wt));
smd->domain->tex_shadow = GPU_texture_create_3D(smd->domain->res[0], smd->domain->res[1], smd->domain->res[2], smd->domain->shadow);
@@ -810,7 +811,8 @@ void GPU_free_unused_buffers(void)
BLI_freelistN(&image_free_queue);
/* vbo buffers */
- GPU_buffer_pool_free_unused(0);
+ /* it's probably not necessary to free all buffers every frame */
+ /* GPU_buffer_pool_free_unused(0); */
BLI_unlock_thread(LOCK_OPENGL);
}
@@ -871,9 +873,15 @@ void GPU_free_images_anim(void)
/* OpenGL state caching for materials */
+typedef struct GPUMaterialFixed {
+ float diff[4];
+ float spec[4];
+ int hard;
+} GPUMaterialFixed;
+
static struct GPUMaterialState {
- float (*matbuf)[2][4];
- float matbuf_fixed[FIXEDMAT][2][4];
+ GPUMaterialFixed (*matbuf);
+ GPUMaterialFixed matbuf_fixed[FIXEDMAT];
int totmat;
Material **gmatbuf;
@@ -893,6 +901,35 @@ static struct GPUMaterialState {
GPUBlendMode lastblendmode;
} GMS = {NULL};
+/* fixed function material, alpha handed by caller */
+static void gpu_material_to_fixed(GPUMaterialFixed *smat, const Material *bmat, const int gamma, const Object *ob)
+{
+ if (bmat->mode & MA_SHLESS) {
+ copy_v3_v3(smat->diff, &bmat->r);
+ smat->diff[3]= 1.0;
+
+ if(gamma) {
+ linearrgb_to_srgb_v3_v3(smat->diff, smat->diff);
+ }
+ }
+ else {
+ mul_v3_v3fl(smat->diff, &bmat->r, bmat->ref + bmat->emit);
+ smat->diff[3]= 1.0; /* caller may set this to bmat->alpha */
+
+ if(bmat->shade_flag & MA_OBCOLOR)
+ mul_v3_v3(smat->diff, ob->col);
+
+ mul_v3_v3fl(smat->spec, &bmat->specr, bmat->spec);
+ smat->spec[3]= 1.0; /* always 1 */
+ smat->hard= CLAMPIS(bmat->har, 0, 128);
+
+ if(gamma) {
+ linearrgb_to_srgb_v3_v3(smat->diff, smat->diff);
+ linearrgb_to_srgb_v3_v3(smat->spec, smat->spec);
+ }
+ }
+}
+
Material *gpu_active_node_material(Material *ma)
{
if(ma && ma->use_nodes && ma->nodetree) {
@@ -934,7 +971,7 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O
*do_alpha_pass = 0;
if(GMS.totmat > FIXEDMAT) {
- GMS.matbuf= MEM_callocN(sizeof(*GMS.matbuf)*GMS.totmat, "GMS.matbuf");
+ GMS.matbuf= MEM_callocN(sizeof(GPUMaterialFixed)*GMS.totmat, "GMS.matbuf");
GMS.gmatbuf= MEM_callocN(sizeof(*GMS.gmatbuf)*GMS.totmat, "GMS.matbuf");
GMS.blendmode= MEM_callocN(sizeof(*GMS.blendmode)*GMS.totmat, "GMS.matbuf");
}
@@ -946,19 +983,10 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O
/* no materials assigned? */
if(ob->totcol==0) {
- GMS.matbuf[0][0][0]= (defmaterial.ref+defmaterial.emit)*defmaterial.r;
- GMS.matbuf[0][0][1]= (defmaterial.ref+defmaterial.emit)*defmaterial.g;
- GMS.matbuf[0][0][2]= (defmaterial.ref+defmaterial.emit)*defmaterial.b;
- GMS.matbuf[0][0][3]= 1.0;
-
- GMS.matbuf[0][1][0]= defmaterial.spec*defmaterial.specr;
- GMS.matbuf[0][1][1]= defmaterial.spec*defmaterial.specg;
- GMS.matbuf[0][1][2]= defmaterial.spec*defmaterial.specb;
- GMS.matbuf[0][1][3]= 1.0;
-
+ gpu_material_to_fixed(&GMS.matbuf[0], &defmaterial, 0, ob);
+
/* do material 1 too, for displists! */
- QUATCOPY(GMS.matbuf[1][0], GMS.matbuf[0][0]);
- QUATCOPY(GMS.matbuf[1][1], GMS.matbuf[0][1]);
+ memcpy(&GMS.matbuf[1], &GMS.matbuf[0], sizeof(GPUMaterialFixed));
if(glsl) {
GMS.gmatbuf[0]= &defmaterial;
@@ -985,32 +1013,13 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O
}
else {
/* fixed function opengl materials */
- if (ma->mode & MA_SHLESS) {
- GMS.matbuf[a][0][0]= ma->r;
- GMS.matbuf[a][0][1]= ma->g;
- GMS.matbuf[a][0][2]= ma->b;
- if(gamma) linearrgb_to_srgb_v3_v3(&GMS.matbuf[a][0][0], &GMS.matbuf[a][0][0]);
- } else {
- GMS.matbuf[a][0][0]= (ma->ref+ma->emit)*ma->r;
- GMS.matbuf[a][0][1]= (ma->ref+ma->emit)*ma->g;
- GMS.matbuf[a][0][2]= (ma->ref+ma->emit)*ma->b;
-
- GMS.matbuf[a][1][0]= ma->spec*ma->specr;
- GMS.matbuf[a][1][1]= ma->spec*ma->specg;
- GMS.matbuf[a][1][2]= ma->spec*ma->specb;
- GMS.matbuf[a][1][3]= 1.0;
-
- if(gamma) {
- linearrgb_to_srgb_v3_v3(&GMS.matbuf[a][0][0], &GMS.matbuf[a][0][0]);
- linearrgb_to_srgb_v3_v3(&GMS.matbuf[a][1][0], &GMS.matbuf[a][1][0]);
- }
- }
+ gpu_material_to_fixed(&GMS.matbuf[a], ma, gamma, ob);
blendmode = (ma->alpha == 1.0f)? GPU_BLEND_SOLID: GPU_BLEND_ALPHA;
if(do_alpha_pass && GMS.alphapass)
- GMS.matbuf[a][0][3]= ma->alpha;
+ GMS.matbuf[a].diff[3]= ma->alpha;
else
- GMS.matbuf[a][0][3]= 1.0f;
+ GMS.matbuf[a].diff[3]= 1.0f;
}
/* setting do_alpha_pass = 1 indicates this object needs to be
@@ -1039,18 +1048,15 @@ int GPU_enable_material(int nr, void *attribs)
memset(&GMS, 0, sizeof(GMS));
- diff[0]= (defmaterial.ref+defmaterial.emit)*defmaterial.r;
- diff[1]= (defmaterial.ref+defmaterial.emit)*defmaterial.g;
- diff[2]= (defmaterial.ref+defmaterial.emit)*defmaterial.b;
+ mul_v3_v3fl(diff, &defmaterial.r, defmaterial.ref + defmaterial.emit);
diff[3]= 1.0;
- spec[0]= defmaterial.spec*defmaterial.specr;
- spec[1]= defmaterial.spec*defmaterial.specg;
- spec[2]= defmaterial.spec*defmaterial.specb;
+ mul_v3_v3fl(spec, &defmaterial.specr, defmaterial.spec);
spec[3]= 1.0;
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 35); /* blender default */
return 0;
}
@@ -1094,8 +1100,9 @@ int GPU_enable_material(int nr, void *attribs)
}
else {
/* or do fixed function opengl material */
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, GMS.matbuf[nr][0]);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, GMS.matbuf[nr][1]);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, GMS.matbuf[nr].diff);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, GMS.matbuf[nr].spec);
+ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, GMS.matbuf[nr].hard);
}
/* set (alpha) blending mode */
@@ -1257,14 +1264,14 @@ int GPU_scene_object_lights(Scene *scene, Object *ob, int lay, float viewmat[][4
if(la->type==LA_SUN) {
/* sun lamp */
- VECCOPY(direction, base->object->obmat[2]);
+ copy_v3_v3(direction, base->object->obmat[2]);
direction[3]= 0.0;
glLightfv(GL_LIGHT0+count, GL_POSITION, direction);
}
else {
/* other lamps with attenuation */
- VECCOPY(position, base->object->obmat[3]);
+ copy_v3_v3(position, base->object->obmat[3]);
position[3]= 1.0f;
glLightfv(GL_LIGHT0+count, GL_POSITION, position);
@@ -1274,9 +1281,7 @@ int GPU_scene_object_lights(Scene *scene, Object *ob, int lay, float viewmat[][4
if(la->type==LA_SPOT) {
/* spot lamp */
- direction[0]= -base->object->obmat[2][0];
- direction[1]= -base->object->obmat[2][1];
- direction[2]= -base->object->obmat[2][2];
+ negate_v3_v3(direction, base->object->obmat[2]);
glLightfv(GL_LIGHT0+count, GL_SPOT_DIRECTION, direction);
glLightf(GL_LIGHT0+count, GL_SPOT_CUTOFF, la->spotsize/2.0);
glLightf(GL_LIGHT0+count, GL_SPOT_EXPONENT, 128.0*la->spotblend);
@@ -1286,9 +1291,7 @@ int GPU_scene_object_lights(Scene *scene, Object *ob, int lay, float viewmat[][4
}
/* setup energy */
- energy[0]= la->energy*la->r;
- energy[1]= la->energy*la->g;
- energy[2]= la->energy*la->b;
+ mul_v3_v3fl(energy, &la->r, la->energy);
energy[3]= 1.0;
glLightfv(GL_LIGHT0+count, GL_DIFFUSE, energy);
@@ -1312,7 +1315,6 @@ void GPU_state_init(void)
/* also called when doing opengl rendering and in the game engine */
float mat_ambient[] = { 0.0, 0.0, 0.0, 0.0 };
float mat_specular[] = { 0.5, 0.5, 0.5, 1.0 };
- float mat_shininess[] = { 35.0 };
int a, x, y;
GLubyte pat[32*32];
const GLubyte *patc= pat;
@@ -1320,7 +1322,7 @@ void GPU_state_init(void)
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
+ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 35);
GPU_default_lights();
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index fa8ff7a6354..bff4287bd75 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -37,10 +37,10 @@
#include "MEM_guardedalloc.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "GPU_draw.h"
#include "GPU_extensions.h"
@@ -67,10 +67,11 @@ static struct GPUGlobal {
int glslsupport;
int extdisabled;
int colordepth;
+ int npotdisabled; /* ATI 3xx-5xx (and more) chipsets support NPoT partially (== not enough) */
GPUDeviceType device;
GPUOSType os;
GPUDriverType driver;
-} GG = {1, 0, 0, 0};
+} GG = {1, 0, 0, 0, 0};
/* GPU Types */
@@ -91,6 +92,11 @@ void GPU_extensions_init()
GLint r, g, b;
const char *vendor, *renderer;
+ /* can't avoid calling this multiple times, see wm_window_add_ghostwindow */
+ static char init= 0;
+ if(init) return;
+ init= 1;
+
glewInit();
/* glewIsSupported("GL_VERSION_2_0") */
@@ -114,6 +120,12 @@ void GPU_extensions_init()
if(strstr(vendor, "ATI")) {
GG.device = GPU_DEVICE_ATI;
GG.driver = GPU_DRIVER_OFFICIAL;
+
+ /* ATI X1xxx cards (R500 chipset) lack full support for npot textures
+ * although they report the GLEW_ARB_texture_non_power_of_two extension.
+ */
+ if(strstr(renderer, "X1"))
+ GG.npotdisabled = 1;
}
else if(strstr(vendor, "NVIDIA")) {
GG.device = GPU_DEVICE_NVIDIA;
@@ -126,11 +138,22 @@ void GPU_extensions_init()
GG.device = GPU_DEVICE_INTEL;
GG.driver = GPU_DRIVER_OFFICIAL;
}
- else if(strstr(renderer, "Mesa DRI R")) {
+ else if(strstr(renderer, "Mesa DRI R") || (strstr(renderer, "Gallium ") && strstr(renderer, " on ATI "))) {
GG.device = GPU_DEVICE_ATI;
GG.driver = GPU_DRIVER_OPENSOURCE;
+ /* ATI 9500 to X2300 cards support NPoT textures poorly
+ * Incomplete list http://dri.freedesktop.org/wiki/ATIRadeon
+ * New IDs from MESA's src/gallium/drivers/r300/r300_screen.c
+ */
+ if(strstr(renderer, "R3") || strstr(renderer, "RV3") ||
+ strstr(renderer, "R4") || strstr(renderer, "RV4") ||
+ strstr(renderer, "RS4") || strstr(renderer, "RC4") ||
+ strstr(renderer, "R5") || strstr(renderer, "RV5") ||
+ strstr(renderer, "RS600") || strstr(renderer, "RS690") ||
+ strstr(renderer, "RS740"))
+ GG.npotdisabled = 1;
}
- else if(strstr(renderer, "Nouveau")) {
+ else if(strstr(renderer, "Nouveau") || strstr(vendor, "nouveau")) {
GG.device = GPU_DEVICE_NVIDIA;
GG.driver = GPU_DRIVER_OPENSOURCE;
}
@@ -172,6 +195,9 @@ int GPU_non_power_of_two_support()
if(GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_MAC, GPU_DRIVER_OFFICIAL))
return 0;
+ if(GG.npotdisabled)
+ return 0;
+
return GLEW_ARB_texture_non_power_of_two;
}
@@ -180,7 +206,7 @@ int GPU_color_depth()
return GG.colordepth;
}
-int GPU_print_error(char *str)
+int GPU_print_error(const char *str)
{
GLenum errCode;
@@ -484,7 +510,7 @@ GPUTexture *GPU_texture_from_blender(Image *ima, ImageUser *iuser, double time,
glGetIntegerv(GL_TEXTURE_BINDING_2D, &lastbindcode);
GPU_update_image_time(ima, time);
- bindcode = GPU_verify_image(ima, iuser, 0, 0, 0, mipmap);
+ bindcode = GPU_verify_image(ima, iuser, 0, 0, mipmap);
if(ima->gputexture) {
ima->gputexture->bindcode = bindcode;
@@ -744,7 +770,7 @@ void GPU_framebuffer_texture_detach(GPUFrameBuffer *fb, GPUTexture *tex)
tex->fb = NULL;
}
-void GPU_framebuffer_texture_bind(GPUFrameBuffer *fb, GPUTexture *tex)
+void GPU_framebuffer_texture_bind(GPUFrameBuffer *UNUSED(fb), GPUTexture *tex)
{
/* push attributes */
glPushAttrib(GL_ENABLE_BIT);
@@ -766,7 +792,7 @@ void GPU_framebuffer_texture_bind(GPUFrameBuffer *fb, GPUTexture *tex)
glLoadIdentity();
}
-void GPU_framebuffer_texture_unbind(GPUFrameBuffer *fb, GPUTexture *tex)
+void GPU_framebuffer_texture_unbind(GPUFrameBuffer *UNUSED(fb), GPUTexture *UNUSED(tex))
{
/* restore matrix */
glMatrixMode(GL_PROJECTION);
@@ -815,7 +841,7 @@ struct GPUOffScreen {
GPUTexture *depth;
};
-GPUOffScreen *GPU_offscreen_create(int width, int height)
+GPUOffScreen *GPU_offscreen_create(int *width, int *height)
{
GPUOffScreen *ofs;
@@ -827,18 +853,24 @@ GPUOffScreen *GPU_offscreen_create(int width, int height)
return NULL;
}
- ofs->depth = GPU_texture_create_depth(width, height);
+ ofs->depth = GPU_texture_create_depth(*width, *height);
if(!ofs->depth) {
GPU_offscreen_free(ofs);
return NULL;
}
+ if(*width!=ofs->depth->w || *height!=ofs->depth->h) {
+ *width= ofs->depth->w;
+ *height= ofs->depth->h;
+ printf("Offscreen size differs from given size!\n");
+ }
+
if(!GPU_framebuffer_texture_attach(ofs->fb, ofs->depth)) {
GPU_offscreen_free(ofs);
return NULL;
}
- ofs->color = GPU_texture_create_2D(width, height, NULL);
+ ofs->color = GPU_texture_create_2D(*width, *height, NULL);
if(!ofs->color) {
GPU_offscreen_free(ofs);
return NULL;
@@ -889,7 +921,7 @@ struct GPUShader {
int totattrib; /* total number of attributes */
};
-static void shader_print_errors(char *task, char *log, const char *code)
+static void shader_print_errors(const char *task, char *log, const char *code)
{
const char *c, *pos, *end = code + strlen(code);
int line = 1;
@@ -1038,7 +1070,7 @@ void GPU_shader_bind(GPUShader *shader)
GPU_print_error("Post Shader Bind");
}
-void GPU_shader_unbind()
+void GPU_shader_unbind(GPUShader *UNUSED(shader))
{
GPU_print_error("Pre Shader Unbind");
glUseProgramObjectARB(0);
@@ -1058,12 +1090,12 @@ void GPU_shader_free(GPUShader *shader)
MEM_freeN(shader);
}
-int GPU_shader_get_uniform(GPUShader *shader, char *name)
+int GPU_shader_get_uniform(GPUShader *shader, const char *name)
{
return glGetUniformLocationARB(shader->object, name);
}
-void GPU_shader_uniform_vector(GPUShader *shader, int location, int length, int arraysize, float *value)
+void GPU_shader_uniform_vector(GPUShader *UNUSED(shader), int location, int length, int arraysize, float *value)
{
if(location == -1)
return;
@@ -1080,7 +1112,7 @@ void GPU_shader_uniform_vector(GPUShader *shader, int location, int length, int
GPU_print_error("Post Uniform Vector");
}
-void GPU_shader_uniform_texture(GPUShader *shader, int location, GPUTexture *tex)
+void GPU_shader_uniform_texture(GPUShader *UNUSED(shader), int location, GPUTexture *tex)
{
GLenum arbnumber;
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 5f8015be52f..310e2ec722c 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -40,18 +40,21 @@
#include "DNA_scene_types.h"
#include "DNA_world_types.h"
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "BKE_anim.h"
#include "BKE_colortools.h"
#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
+#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_scene.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
-#include "BLI_math.h"
-#include "BLI_blenlib.h"
+#include "IMB_imbuf_types.h"
#include "GPU_extensions.h"
#include "GPU_material.h"
@@ -464,7 +467,7 @@ static void area_lamp_vectors(LampRen *lar)
static void ramp_blend(GPUMaterial *mat, GPUNodeLink *fac, GPUNodeLink *col1, GPUNodeLink *col2, int type, GPUNodeLink **outcol)
{
- static char *names[] = {"mix_blend", "mix_add", "mix_mult", "mix_sub",
+ static const char *names[] = {"mix_blend", "mix_add", "mix_mult", "mix_sub",
"mix_screen", "mix_div", "mix_diff", "mix_dark", "mix_light",
"mix_overlay", "mix_dodge", "mix_burn", "mix_hue", "mix_sat",
"mix_val", "mix_color", "mix_soft", "mix_linear"};
@@ -605,7 +608,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
Material *ma= shi->mat;
GPUMaterial *mat= shi->gpumat;
GPUNodeLink *lv, *dist, *visifac, *is, *inp, *i, *vn, *view;
- GPUNodeLink *outcol, *specfac, *t, *shadfac;
+ GPUNodeLink *outcol, *specfac, *t, *shadfac= NULL;
float one = 1.0f;
if((lamp->mode & LA_ONLYSHADOW) && !(ma->mode & MA_SHADOW))
@@ -629,10 +632,8 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
}
else {
if(lamp->type == LA_AREA) {
- float area[4][4], areasize;
+ float area[4][4]= {{0.0f}}, areasize= 0.0f;
- memset(&area, 0, sizeof(area));
- memset(&areasize, 0, sizeof(areasize));
mat->dynproperty |= DYN_LAMP_VEC|DYN_LAMP_CO;
GPU_link(mat, "shade_inp_area", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco), GPU_dynamic_uniform(lamp->dynvec), vn, GPU_uniform((float*)area),
GPU_uniform(&areasize), GPU_uniform(&lamp->k), &inp);
@@ -758,10 +759,10 @@ static void material_lights(GPUShadeInput *shi, GPUShadeResult *shr)
{
Base *base;
Object *ob;
- Scene *sce;
+ Scene *sce_iter;
GPULamp *lamp;
- for(SETLOOPER(shi->gpumat->scene, base)) {
+ for(SETLOOPER(shi->gpumat->scene, sce_iter, base)) {
ob= base->object;
if(ob->type==OB_LAMP) {
@@ -891,6 +892,8 @@ static void do_material_tex(GPUShadeInput *shi)
char *lastuvname = NULL;
float one = 1.0f, norfac, ofs[3];
int tex_nr, rgbnor, talpha;
+ int init_done = 0, iBumpSpacePrev;
+ GPUNodeLink *vNorg, *vNacc, *fPrevMagnitude;
GPU_link(mat, "set_value", GPU_uniform(&one), &stencil);
@@ -956,7 +959,7 @@ static void do_material_tex(GPUShadeInput *shi)
rgbnor = 0;
if(tex && tex->type == TEX_IMAGE && tex->ima) {
- GPU_link(mat, "mtex_image", texco, GPU_image(tex->ima, &tex->iuser), &tin, &trgb, &tnor);
+ GPU_link(mat, "mtex_image", texco, GPU_image(tex->ima, &tex->iuser), &tin, &trgb);
rgbnor= TEX_RGB;
if(tex->imaflag & TEX_USEALPHA)
@@ -1025,29 +1028,125 @@ static void do_material_tex(GPUShadeInput *shi)
}
if(!(mat->scene->gm.flag & GAME_GLSL_NO_EXTRA_TEX) && (mtex->mapto & MAP_NORM)) {
- if((tex->type==TEX_IMAGE) && (tex->imaflag & TEX_NORMALMAP)) {
- if(mtex->norfac < 0.0f)
- GPU_link(mat, "mtex_negate_texnormal", tnor, &tnor);
-
- if(mtex->normapspace == MTEX_NSPACE_TANGENT)
- GPU_link(mat, "mtex_nspace_tangent", GPU_attribute(CD_TANGENT, ""), shi->vn, tnor, &newnor);
- else
- newnor = tnor;
-
- norfac = MIN2(fabsf(mtex->norfac), 1.0);
- if(norfac == 1.0f && !GPU_link_changed(stencil)) {
- shi->vn = newnor;
- }
- else {
+ if(tex->type==TEX_IMAGE) {
+ if(tex->imaflag & TEX_NORMALMAP) {
+ /* normalmap image */
+ GPU_link(mat, "mtex_normal", texco, GPU_image(tex->ima, &tex->iuser), &tnor );
+
+ if(mtex->norfac < 0.0f)
+ GPU_link(mat, "mtex_negate_texnormal", tnor, &tnor);
+
+ if(mtex->normapspace == MTEX_NSPACE_TANGENT)
+ GPU_link(mat, "mtex_nspace_tangent", GPU_attribute(CD_TANGENT, ""), shi->vn, tnor, &newnor);
+ else
+ newnor = tnor;
+
+ norfac = MIN2(fabsf(mtex->norfac), 1.0);
+
+ if(norfac == 1.0f && !GPU_link_changed(stencil)) {
+ shi->vn = newnor;
+ }
+ else {
+ tnorfac = GPU_uniform(&norfac);
+
+ if(GPU_link_changed(stencil))
+ GPU_link(mat, "math_multiply", tnorfac, stencil, &tnorfac);
+
+ GPU_link(mat, "mtex_blend_normal", tnorfac, shi->vn, newnor, &shi->vn);
+ }
+
+ } else if( mtex->texflag & (MTEX_3TAP_BUMP|MTEX_5TAP_BUMP)) {
+ /* ntap bumpmap image */
+ int iBumpSpace;
+ float hScale = 0.1f; // compatibility adjustment factor for all bumpspace types
+ float hScaleTex = 13.0f; // factor for scaling texspace bumps
+
+ GPUNodeLink *surf_pos = GPU_builtin(GPU_VIEW_POSITION);
+ GPUNodeLink *vR1, *vR2;
+ GPUNodeLink *dBs, *dBt, *fDet;
+
+ if( mtex->texflag & MTEX_BUMP_TEXTURESPACE )
+ hScale = hScaleTex;
+ norfac = hScale * mtex->norfac;
tnorfac = GPU_uniform(&norfac);
-
+
if(GPU_link_changed(stencil))
GPU_link(mat, "math_multiply", tnorfac, stencil, &tnorfac);
-
- GPU_link(mat, "mtex_blend_normal", tnorfac, shi->vn, newnor, &shi->vn);
+
+ if( !init_done ) {
+ // copy shi->vn to vNorg and vNacc, set magnitude to 1
+ GPU_link(mat, "mtex_bump_normals_init", shi->vn, &vNorg, &vNacc, &fPrevMagnitude);
+ iBumpSpacePrev = 0;
+ init_done = 1;
+ }
+
+ // find current bump space
+ if( mtex->texflag & MTEX_BUMP_OBJECTSPACE )
+ iBumpSpace = 1;
+ else if( mtex->texflag & MTEX_BUMP_TEXTURESPACE )
+ iBumpSpace = 2;
+ else
+ iBumpSpace = 4; // ViewSpace
+
+ // re-initialize if bump space changed
+ if( iBumpSpacePrev != iBumpSpace ) {
+
+ if( mtex->texflag & MTEX_BUMP_OBJECTSPACE )
+ GPU_link( mat, "mtex_bump_init_objspace",
+ surf_pos, vNorg,
+ GPU_builtin(GPU_VIEW_MATRIX), GPU_builtin(GPU_INVERSE_VIEW_MATRIX), GPU_builtin(GPU_OBJECT_MATRIX), GPU_builtin(GPU_INVERSE_OBJECT_MATRIX),
+ fPrevMagnitude, vNacc,
+ &fPrevMagnitude, &vNacc,
+ &vR1, &vR2, &fDet );
+
+ else if( mtex->texflag & MTEX_BUMP_TEXTURESPACE )
+ GPU_link( mat, "mtex_bump_init_texturespace",
+ surf_pos, vNorg,
+ fPrevMagnitude, vNacc,
+ &fPrevMagnitude, &vNacc,
+ &vR1, &vR2, &fDet );
+
+ else
+ GPU_link( mat, "mtex_bump_init_viewspace",
+ surf_pos, vNorg,
+ fPrevMagnitude, vNacc,
+ &fPrevMagnitude, &vNacc,
+ &vR1, &vR2, &fDet );
+
+ iBumpSpacePrev = iBumpSpace;
+ }
+
+
+ if( mtex->texflag & MTEX_3TAP_BUMP )
+ GPU_link( mat, "mtex_bump_tap3",
+ texco, GPU_image(tex->ima, &tex->iuser), tnorfac,
+ &dBs, &dBt );
+ else
+ GPU_link( mat, "mtex_bump_tap5",
+ texco, GPU_image(tex->ima, &tex->iuser), tnorfac,
+ &dBs, &dBt );
+
+
+ if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) {
+ float ima_x= 512.0f, ima_y= 512.f; // prevent calling textureSize, glsl 1.3 only
+ ImBuf *ibuf= BKE_image_get_ibuf(tex->ima, &tex->iuser);
+ if(ibuf) {
+ ima_x= ibuf->x;
+ ima_y= ibuf->y;
+ }
+
+ GPU_link( mat, "mtex_bump_apply_texspace",
+ fDet, dBs, dBt, vR1, vR2,
+ GPU_image(tex->ima, &tex->iuser), texco, GPU_uniform(&ima_x), GPU_uniform(&ima_y), vNacc,
+ &vNacc, &shi->vn );
+ } else
+ GPU_link( mat, "mtex_bump_apply",
+ fDet, dBs, dBt, vR1, vR2, vNacc,
+ &vNacc, &shi->vn );
+
}
}
-
+
GPU_link(mat, "vec_math_negate", shi->vn, &orn);
GPU_link(mat, "texco_refl", shi->vn, shi->view, &shi->ref);
}
@@ -1296,7 +1395,7 @@ GPUMaterial *GPU_material_from_blender(Scene *scene, Material *ma)
return mat;
}
-void GPU_materials_free()
+void GPU_materials_free(void)
{
Object *ob;
Material *ma;
diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl b/source/blender/gpu/intern/gpu_shader_material.glsl
index cfd35f59478..6dec6a5e982 100644
--- a/source/blender/gpu/intern/gpu_shader_material.glsl
+++ b/source/blender/gpu/intern/gpu_shader_material.glsl
@@ -641,9 +641,9 @@ void valtorgb(float fac, sampler1D colormap, out vec4 outcol, out float outalpha
outalpha = outcol.a;
}
-void rgbtobw(vec4 color, out float outval)
+void rgbtobw(vec4 color, out float outval)
{
- outval = color.r*0.35 + color.g*0.45 + color.b*0.2;
+ outval = color.r*0.35 + color.g*0.45 + color.b*0.2; /* keep these factors in sync with texture.h:RGBTOBW */
}
void invert(float fac, vec4 col, out vec4 outcol)
@@ -1090,14 +1090,161 @@ void mtex_2d_mapping(vec3 vec, out vec3 outvec)
outvec = vec3(vec.xy*0.5 + vec2(0.5, 0.5), vec.z);
}
-void mtex_image(vec3 vec, sampler2D ima, out float value, out vec4 color, out vec3 normal)
+void mtex_image(vec3 texco, sampler2D ima, out float value, out vec4 color)
{
- color = texture2D(ima, vec.xy);
+ color = texture2D(ima, texco.xy);
value = 1.0;
-
+}
+
+void mtex_normal(vec3 texco, sampler2D ima, out vec3 normal)
+{
+ vec4 color = texture2D(ima, texco.xy);
normal = 2.0*(vec3(color.r, -color.g, color.b) - vec3(0.5, -0.5, 0.5));
}
+void mtex_bump_normals_init( vec3 vN, out vec3 vNorg, out vec3 vNacc, out float fPrevMagnitude )
+{
+ vNorg = vN;
+ vNacc = vN;
+ fPrevMagnitude = 1.0;
+}
+
+/** helper method to extract the upper left 3x3 matrix from a 4x4 matrix */
+mat3 to_mat3(mat4 m4)
+{
+ mat3 m3;
+ m3[0] = m4[0].xyz;
+ m3[1] = m4[1].xyz;
+ m3[2] = m4[2].xyz;
+ return m3;
+}
+
+void mtex_bump_init_objspace( vec3 surf_pos, vec3 surf_norm,
+ mat4 mView, mat4 mViewInv, mat4 mObj, mat4 mObjInv,
+ float fPrevMagnitude_in, vec3 vNacc_in,
+ out float fPrevMagnitude_out, out vec3 vNacc_out,
+ out vec3 vR1, out vec3 vR2, out float fDet )
+{
+ mat3 obj2view = to_mat3(mView * mObj);
+ mat3 view2obj = to_mat3(mObjInv * mViewInv);
+
+ vec3 vSigmaS = view2obj * dFdx( surf_pos );
+ vec3 vSigmaT = view2obj * dFdy( surf_pos );
+ vec3 vN = normalize( surf_norm * obj2view );
+
+ vR1 = cross( vSigmaT, vN );
+ vR2 = cross( vN, vSigmaS ) ;
+ fDet = dot ( vSigmaS, vR1 );
+
+ /* pretransform vNacc (in mtex_bump_apply) using the inverse transposed */
+ vR1 = vR1 * view2obj;
+ vR2 = vR2 * view2obj;
+ vN = vN * view2obj;
+
+ float fMagnitude = abs(fDet) * length(vN);
+ vNacc_out = vNacc_in * (fMagnitude / fPrevMagnitude_in);
+ fPrevMagnitude_out = fMagnitude;
+}
+
+void mtex_bump_init_texturespace( vec3 surf_pos, vec3 surf_norm,
+ float fPrevMagnitude_in, vec3 vNacc_in,
+ out float fPrevMagnitude_out, out vec3 vNacc_out,
+ out vec3 vR1, out vec3 vR2, out float fDet )
+{
+ vec3 vSigmaS = dFdx( surf_pos );
+ vec3 vSigmaT = dFdy( surf_pos );
+ vec3 vN = surf_norm; /* normalized interpolated vertex normal */
+
+ vR1 = normalize( cross( vSigmaT, vN ) );
+ vR2 = normalize( cross( vN, vSigmaS ) );
+ fDet = sign( dot(vSigmaS, vR1) );
+
+ float fMagnitude = abs(fDet);
+ vNacc_out = vNacc_in * (fMagnitude / fPrevMagnitude_in);
+ fPrevMagnitude_out = fMagnitude;
+}
+
+void mtex_bump_init_viewspace( vec3 surf_pos, vec3 surf_norm,
+ float fPrevMagnitude_in, vec3 vNacc_in,
+ out float fPrevMagnitude_out, out vec3 vNacc_out,
+ out vec3 vR1, out vec3 vR2, out float fDet )
+{
+ vec3 vSigmaS = dFdx( surf_pos );
+ vec3 vSigmaT = dFdy( surf_pos );
+ vec3 vN = surf_norm; /* normalized interpolated vertex normal */
+
+ vR1 = cross( vSigmaT, vN );
+ vR2 = cross( vN, vSigmaS ) ;
+ fDet = dot ( vSigmaS, vR1 );
+
+ float fMagnitude = abs(fDet);
+ vNacc_out = vNacc_in * (fMagnitude / fPrevMagnitude_in);
+ fPrevMagnitude_out = fMagnitude;
+}
+
+void mtex_bump_tap3( vec3 texco, sampler2D ima, float hScale,
+ out float dBs, out float dBt )
+{
+ vec2 STll = texco.xy;
+ vec2 STlr = texco.xy + dFdx(texco.xy) ;
+ vec2 STul = texco.xy + dFdy(texco.xy) ;
+
+ float Hll,Hlr,Hul;
+ rgbtobw( texture2D(ima, STll), Hll );
+ rgbtobw( texture2D(ima, STlr), Hlr );
+ rgbtobw( texture2D(ima, STul), Hul );
+
+ dBs = hScale * (Hlr - Hll);
+ dBt = hScale * (Hul - Hll);
+}
+
+void mtex_bump_tap5( vec3 texco, sampler2D ima, float hScale,
+ out float dBs, out float dBt )
+{
+ vec2 TexDx = dFdx(texco.xy);
+ vec2 TexDy = dFdy(texco.xy);
+
+ vec2 STc = texco.xy;
+ vec2 STl = texco.xy - 0.5 * TexDx ;
+ vec2 STr = texco.xy + 0.5 * TexDx ;
+ vec2 STd = texco.xy - 0.5 * TexDy ;
+ vec2 STu = texco.xy + 0.5 * TexDy ;
+
+ float Hc,Hl,Hr,Hd,Hu;
+ rgbtobw( texture2D(ima, STc), Hc );
+ rgbtobw( texture2D(ima, STl), Hl );
+ rgbtobw( texture2D(ima, STr), Hr );
+ rgbtobw( texture2D(ima, STd), Hd );
+ rgbtobw( texture2D(ima, STu), Hu );
+
+ dBs = hScale * (Hr - Hl);
+ dBt = hScale * (Hu - Hd);
+}
+
+void mtex_bump_apply( float fDet, float dBs, float dBt, vec3 vR1, vec3 vR2, vec3 vNacc_in,
+ out vec3 vNacc_out, out vec3 perturbed_norm )
+{
+ vec3 vSurfGrad = sign(fDet) * ( dBs * vR1 + dBt * vR2 );
+
+ vNacc_out = vNacc_in - vSurfGrad;
+ perturbed_norm = normalize( vNacc_out );
+}
+
+void mtex_bump_apply_texspace( float fDet, float dBs, float dBt, vec3 vR1, vec3 vR2,
+ sampler2D ima, vec3 texco, float ima_x, float ima_y, vec3 vNacc_in,
+ out vec3 vNacc_out, out vec3 perturbed_norm )
+{
+ vec2 TexDx = dFdx(texco.xy);
+ vec2 TexDy = dFdy(texco.xy);
+
+ vec3 vSurfGrad = sign(fDet) * (
+ dBs / length( vec2(ima_x*TexDx.x, ima_y*TexDx.y) ) * vR1 +
+ dBt / length( vec2(ima_x*TexDy.x, ima_y*TexDy.y) ) * vR2 );
+
+ vNacc_out = vNacc_in - vSurfGrad;
+ perturbed_norm = normalize( vNacc_out );
+}
+
void mtex_negate_texnormal(vec3 normal, out vec3 outnormal)
{
outnormal = vec3(-normal.x, -normal.y, normal.z);
diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl.c b/source/blender/gpu/intern/gpu_shader_material.glsl.c
index e996578dc89..742e57fbbff 100644
--- a/source/blender/gpu/intern/gpu_shader_material.glsl.c
+++ b/source/blender/gpu/intern/gpu_shader_material.glsl.c
@@ -1,723 +1,863 @@
/* DataToC output of file <gpu_shader_material_glsl> */
-int datatoc_gpu_shader_material_glsl_size= 34245;
+int datatoc_gpu_shader_material_glsl_size= 38724;
char datatoc_gpu_shader_material_glsl[]= {
- 10,102,108,111, 97,
-116, 32,101,120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10, 9,114,101,116,117,114,110,
- 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
-114,103, 98, 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
-116, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,104, 44, 32,115, 44,
- 32,118, 44, 32, 99,100,101,108,116, 97, 59, 10, 9,118,101, 99, 51, 32, 99, 59, 10, 10, 9, 99,109, 97,120, 32, 61, 32,109, 97,
-120, 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10,
- 9, 99,109,105,110, 32, 61, 32,109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32,109,105,110, 40,114,103, 98, 91, 49, 93, 44, 32,
-114,103, 98, 91, 50, 93, 41, 41, 59, 10, 9, 99,100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, 45, 99,109,105,110, 59, 10, 10,
- 9,118, 32, 61, 32, 99,109, 97,120, 59, 10, 9,105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, 48, 41, 10, 9, 9,115, 32, 61,
- 32, 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 10, 9,101,108,115,101, 32,123, 10, 9, 9,115, 32, 61, 32, 48, 46, 48, 59,
- 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 10, 9,105,102, 32, 40,115, 32, 61, 61, 32, 48, 46, 48, 41, 32,123,
- 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9, 99, 32, 61, 32, 40,118,101,
- 99, 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41, 32, 45, 32,114,103, 98, 46,120,121,122, 41, 47,
- 99,100,101,108,116, 97, 59, 10, 10, 9, 9,105,102, 32, 40,114,103, 98, 46,120, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32,
- 99, 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,114,103, 98, 46,121, 61, 61, 99,
-109, 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32, 45, 32, 32, 99, 91, 50, 93, 59, 10, 9, 9,101,
-108,115,101, 32,104, 32, 61, 32, 52, 46, 48, 32, 43, 32, 99, 91, 49, 93, 32, 45, 32, 99, 91, 48, 93, 59, 10, 10, 9, 9,104, 32,
- 47, 61, 32, 54, 46, 48, 59, 10, 10, 9, 9,105,102, 32, 40,104, 60, 48, 46, 48, 41, 10, 9, 9, 9,104, 32, 43, 61, 32, 49, 46,
- 48, 59, 10, 9,125, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,104, 44, 32,115, 44, 32,118, 44, 32,114,
-103, 98, 46,119, 41, 59, 10,125, 10, 10,118,111,105,100, 32,104,115,118, 95,116,111, 95,114,103, 98, 40,118,101, 99, 52, 32,104,
-115,118, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,105, 44,
- 32,102, 44, 32,112, 44, 32,113, 44, 32,116, 44, 32,104, 44, 32,115, 44, 32,118, 59, 10, 9,118,101, 99, 51, 32,114,103, 98, 59,
- 10, 10, 9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 10, 9,115, 32, 61, 32,104,115,118, 91, 49, 93, 59, 10, 9,118, 32, 61,
- 32,104,115,118, 91, 50, 93, 59, 10, 10, 9,105,102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 32, 61, 32,
-118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,105,102, 40,104,
- 61, 61, 49, 46, 48, 41, 10, 9, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9, 10, 9, 9,104, 32, 42, 61, 32, 54, 46, 48,
- 59, 10, 9, 9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 10, 9, 9,102, 32, 61, 32,104, 32, 45, 32,105, 59, 10, 9,
- 9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102, 44, 32,102, 41, 59, 10, 9, 9,112, 32, 61, 32,118, 42, 40, 49,
- 46, 48, 45,115, 41, 59, 10, 9, 9,113, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,102, 41, 41, 59, 10, 9, 9,116, 32,
- 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42, 40, 49, 46, 48, 45,102, 41, 41, 41, 59, 10, 9, 9, 10, 9, 9,105,102, 32, 40,
-105, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,116, 44, 32,112, 41, 59, 10, 9,
- 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 49, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,113,
- 44, 32,118, 44, 32,112, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 50, 46, 48, 41, 32,114,103,
- 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,118, 44, 32,116, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32,
- 61, 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,113, 44, 32,118, 41, 59, 10, 9, 9,101,
-108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 52, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,116, 44, 32,
-112, 44, 32,118, 41, 59, 10, 9, 9,101,108,115,101, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,112, 44, 32,113,
- 41, 59, 10, 9,125, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 44, 32,104,115,118, 46,119,
- 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,102,108,
-111, 97,116, 32, 99, 41, 10,123, 10, 9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53, 41, 10, 9, 9,114,101,116,117,
-114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 40, 49, 46, 48, 47, 49, 50, 46, 57,
- 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,114,101,116,117,114,110, 32,112,111,119, 40, 40, 99, 32, 43, 32, 48, 46, 48, 53,
- 53, 41, 42, 40, 49, 46, 48, 47, 49, 46, 48, 53, 53, 41, 44, 32, 50, 46, 52, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,108,
-105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10, 9,105,102, 40,
- 99, 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48, 56, 41, 10, 9, 9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48,
- 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 49, 50, 46, 57, 50, 59, 10, 9,101,108,115,101, 10, 9, 9,114,101,116,117,114,
-110, 32, 49, 46, 48, 53, 53, 32, 42, 32,112,111,119, 40, 99, 44, 32, 49, 46, 48, 47, 50, 46, 52, 41, 32, 45, 32, 48, 46, 48, 53,
- 53, 59, 10,125, 10, 10,118,111,105,100, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,118,101, 99,
- 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10, 9,
- 99,111,108, 95,116,111, 46,114, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108,
- 95,102,114,111,109, 46,114, 41, 59, 10, 9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,
-110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 98, 32, 61,
- 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10,
- 9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,
-108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44,
- 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10, 9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,
-108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10, 9,
- 99,111,108, 95,116,111, 46,103, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108,
- 95,102,114,111,109, 46,103, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,
-116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 97, 32, 61,
- 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10, 35,100,101,102,105,110,101, 32, 77, 95, 80, 73, 32, 51, 46, 49,
- 52, 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
- 42, 32, 83, 72, 65, 68, 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10,
- 10,118,111,105,100, 32,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 52, 32, 97,116,116,118, 99,111,
-108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 41, 10,123, 10, 9,118, 99,111,108, 32, 61, 32,118,101, 99, 52,
- 40, 97,116,116,118, 99,111,108, 46,120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,121, 47, 50, 53, 53, 46,
- 48, 44, 32, 97,116,116,118, 99,111,108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,
-100, 32,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,
-101, 99, 51, 32,117,118, 41, 10,123, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45,
- 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,103,
-101,111,109, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109, 97,116, 52, 32,118,105,101,119,
-105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101, 99, 50, 32, 97,116,116,117,118,
- 44, 32,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 44,
- 32,111,117,116, 32,118,101, 99, 51, 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,
-111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,116, 32,
-118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 44, 32,111,117,116, 32,
-102,108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10, 9,108,111, 99, 97,108, 32, 61, 32, 99,111, 59, 10,
- 9,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41, 59, 10, 9,103,108,111, 98, 97,
-108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99, 97,108, 44, 32, 49, 46, 48, 41,
- 41, 46,120,121,122, 59, 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10, 9,117,118, 95, 97,116,116,114,
-105, 98,117,116,101, 40, 97,116,116,117,118, 44, 32,117,118, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,
-109, 97,108,105,122,101, 40,110,111,114, 41, 59, 9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,
-111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10, 9,118, 99,111,108, 95, 97,116,116,114,105, 98,
-117,116,101, 40, 97,116,116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10, 9,102,114,111,110,116, 98, 97, 99,107, 32, 61,
- 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,
-109, 97,116, 52, 32,109, 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99, 51, 32,109, 97,120,118,
-101, 99, 44, 32,102,108,111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109, 97,120, 44, 32,111,117,
-116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 40,109, 97,116, 32,
- 42, 32,118,101, 99, 52, 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,105,102, 40,100,111,109,105,110,
- 32, 61, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,116,118,101, 99, 44, 32,
-109,105,110,118,101, 99, 41, 59, 10, 9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,
-118,101, 99, 32, 61, 32,109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59, 10,125, 10, 10,118,111,
-105,100, 32, 99, 97,109,101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,
-105,101,119, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32,111,117,116,100,105,115,116, 41, 10,123, 10, 9,111,117,116,100,101,112,116,104, 32, 61, 32, 97, 98,115, 40, 99,111,
- 46,122, 41, 59, 10, 9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41, 59, 10, 9,111,117,116,
-118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,
-116,104, 95, 97,100,100, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108,
- 49, 32, 43, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,116,114, 97, 99,116, 40,
-102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,
-116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 45, 32,118, 97,108,
- 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,108,111, 97,116, 32,118,
- 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,
-108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,
-111,105,100, 32,109, 97,116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,
-116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32,
- 40,118, 97,108, 50, 32, 61, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,
-108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,
-111,105,100, 32,109, 97,116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,115,105,110, 40,118, 97,108, 41, 59,
- 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,
-115, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,103,101,110,116, 40,102,108,111,
- 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,
-118, 97,108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,115,105,
-110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
- 10, 9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41,
- 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,
-117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97, 99,111,115, 40,102,
-108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,
-102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10, 9, 9,
-111,117,116,118, 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118,
- 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,116, 97,110, 40,102,108,111, 97,
-116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,
- 97,108, 32, 61, 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,112,111,119,
+ 10,102,108,111,
+ 97,116, 32,101,120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10, 9,114,101,116,117,114,
+110, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,118,111,105,100,
+ 32,114,103, 98, 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,
+117,116, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,104, 44, 32,115,
+ 44, 32,118, 44, 32, 99,100,101,108,116, 97, 59, 10, 9,118,101, 99, 51, 32, 99, 59, 10, 10, 9, 99,109, 97,120, 32, 61, 32,109,
+ 97,120, 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59,
+ 10, 9, 99,109,105,110, 32, 61, 32,109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32,109,105,110, 40,114,103, 98, 91, 49, 93, 44,
+ 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10, 9, 99,100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, 45, 99,109,105,110, 59, 10,
+ 10, 9,118, 32, 61, 32, 99,109, 97,120, 59, 10, 9,105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, 48, 41, 10, 9, 9,115, 32,
+ 61, 32, 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 10, 9,101,108,115,101, 32,123, 10, 9, 9,115, 32, 61, 32, 48, 46, 48,
+ 59, 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 10, 9,105,102, 32, 40,115, 32, 61, 61, 32, 48, 46, 48, 41, 32,
+123, 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9, 99, 32, 61, 32, 40,118,
+101, 99, 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41, 32, 45, 32,114,103, 98, 46,120,121,122, 41,
+ 47, 99,100,101,108,116, 97, 59, 10, 10, 9, 9,105,102, 32, 40,114,103, 98, 46,120, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61,
+ 32, 99, 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,114,103, 98, 46,121, 61, 61,
+ 99,109, 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32, 45, 32, 32, 99, 91, 50, 93, 59, 10, 9, 9,
+101,108,115,101, 32,104, 32, 61, 32, 52, 46, 48, 32, 43, 32, 99, 91, 49, 93, 32, 45, 32, 99, 91, 48, 93, 59, 10, 10, 9, 9,104,
+ 32, 47, 61, 32, 54, 46, 48, 59, 10, 10, 9, 9,105,102, 32, 40,104, 60, 48, 46, 48, 41, 10, 9, 9, 9,104, 32, 43, 61, 32, 49,
+ 46, 48, 59, 10, 9,125, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,104, 44, 32,115, 44, 32,118, 44, 32,
+114,103, 98, 46,119, 41, 59, 10,125, 10, 10,118,111,105,100, 32,104,115,118, 95,116,111, 95,114,103, 98, 40,118,101, 99, 52, 32,
+104,115,118, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,105,
+ 44, 32,102, 44, 32,112, 44, 32,113, 44, 32,116, 44, 32,104, 44, 32,115, 44, 32,118, 59, 10, 9,118,101, 99, 51, 32,114,103, 98,
+ 59, 10, 10, 9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 10, 9,115, 32, 61, 32,104,115,118, 91, 49, 93, 59, 10, 9,118, 32,
+ 61, 32,104,115,118, 91, 50, 93, 59, 10, 10, 9,105,102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 32, 61,
+ 32,118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,105,102, 40,
+104, 61, 61, 49, 46, 48, 41, 10, 9, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9, 10, 9, 9,104, 32, 42, 61, 32, 54, 46,
+ 48, 59, 10, 9, 9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 10, 9, 9,102, 32, 61, 32,104, 32, 45, 32,105, 59, 10,
+ 9, 9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102, 44, 32,102, 41, 59, 10, 9, 9,112, 32, 61, 32,118, 42, 40,
+ 49, 46, 48, 45,115, 41, 59, 10, 9, 9,113, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,102, 41, 41, 59, 10, 9, 9,116,
+ 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42, 40, 49, 46, 48, 45,102, 41, 41, 41, 59, 10, 9, 9, 10, 9, 9,105,102, 32,
+ 40,105, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,116, 44, 32,112, 41, 59, 10,
+ 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 49, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,
+113, 44, 32,118, 44, 32,112, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 50, 46, 48, 41, 32,114,
+103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,118, 44, 32,116, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105,
+ 32, 61, 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,113, 44, 32,118, 41, 59, 10, 9, 9,
+101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 52, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,116, 44,
+ 32,112, 44, 32,118, 41, 59, 10, 9, 9,101,108,115,101, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,112, 44, 32,
+113, 41, 59, 10, 9,125, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 44, 32,104,115,118, 46,
+119, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,102,
+108,111, 97,116, 32, 99, 41, 10,123, 10, 9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53, 41, 10, 9, 9,114,101,116,
+117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 40, 49, 46, 48, 47, 49, 50, 46,
+ 57, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,114,101,116,117,114,110, 32,112,111,119, 40, 40, 99, 32, 43, 32, 48, 46, 48,
+ 53, 53, 41, 42, 40, 49, 46, 48, 47, 49, 46, 48, 53, 53, 41, 44, 32, 50, 46, 52, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,
+108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10, 9,105,102,
+ 40, 99, 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48, 56, 41, 10, 9, 9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46,
+ 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 49, 50, 46, 57, 50, 59, 10, 9,101,108,115,101, 10, 9, 9,114,101,116,117,
+114,110, 32, 49, 46, 48, 53, 53, 32, 42, 32,112,111,119, 40, 99, 44, 32, 49, 46, 48, 47, 50, 46, 52, 41, 32, 45, 32, 48, 46, 48,
+ 53, 53, 59, 10,125, 10, 10,118,111,105,100, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,118,101,
+ 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10,
+ 9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,
+108, 95,102,114,111,109, 46,114, 41, 59, 10, 9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,
+105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 98, 32,
+ 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59,
+ 10, 9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10,118,111,105,100,
+ 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109,
+ 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10, 9, 99,111,108, 95,116,111, 46,114, 32, 61,
+ 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10,
+ 9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,
+108, 95,102,114,111,109, 46,103, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,108,105,110,101, 97,114,114,103, 98,
+ 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 97, 32,
+ 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10, 35,100,101,102,105,110,101, 32, 77, 95, 80, 73, 32, 51, 46,
+ 49, 52, 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 32, 83, 72, 65, 68, 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47,
+ 10, 10,118,111,105,100, 32,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 52, 32, 97,116,116,118, 99,
+111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 41, 10,123, 10, 9,118, 99,111,108, 32, 61, 32,118,101, 99,
+ 52, 40, 97,116,116,118, 99,111,108, 46,120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,121, 47, 50, 53, 53,
+ 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,
+105,100, 32,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,
+118,101, 99, 51, 32,117,118, 41, 10,123, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32,
+ 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
+103,101,111,109, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109, 97,116, 52, 32,118,105,101,
+119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101, 99, 50, 32, 97,116,116,117,
+118, 44, 32,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108,
+ 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 44,
+ 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,116,
+ 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 44, 32,111,117,116,
+ 32,102,108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10, 9,108,111, 99, 97,108, 32, 61, 32, 99,111, 59,
+ 10, 9,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41, 59, 10, 9,103,108,111, 98,
+ 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99, 97,108, 44, 32, 49, 46, 48,
+ 41, 41, 46,120,121,122, 59, 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10, 9,117,118, 95, 97,116,116,
+114,105, 98,117,116,101, 40, 97,116,116,117,118, 44, 32,117,118, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,
+114,109, 97,108,105,122,101, 40,110,111,114, 41, 59, 9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,
+110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10, 9,118, 99,111,108, 95, 97,116,116,114,105,
+ 98,117,116,101, 40, 97,116,116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10, 9,102,114,111,110,116, 98, 97, 99,107, 32,
+ 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44,
+ 32,109, 97,116, 52, 32,109, 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99, 51, 32,109, 97,120,
+118,101, 99, 44, 32,102,108,111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109, 97,120, 44, 32,111,
+117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 40,109, 97,116,
+ 32, 42, 32,118,101, 99, 52, 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,105,102, 40,100,111,109,105,
+110, 32, 61, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,116,118,101, 99, 44,
+ 32,109,105,110,118,101, 99, 41, 59, 10, 9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,
+116,118,101, 99, 32, 61, 32,109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59, 10,125, 10, 10,118,
+111,105,100, 32, 99, 97,109,101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,
+118,105,101,119, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,117,116, 32,102,108,
+111, 97,116, 32,111,117,116,100,105,115,116, 41, 10,123, 10, 9,111,117,116,100,101,112,116,104, 32, 61, 32, 97, 98,115, 40, 99,
+111, 46,122, 41, 59, 10, 9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41, 59, 10, 9,111,117,
+116,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,
+ 97,116,104, 95, 97,100,100, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,
+111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,
+108, 49, 32, 43, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,116,114, 97, 99,116,
40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32, 48, 46, 48, 41, 10, 9,
- 9,111,117,116,118, 97,108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101,
- 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,111,
-103, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,
-111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32, 38, 38,
- 32,118, 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 61, 32,108,111,103, 50, 40,118, 97,108, 49,
- 41, 32, 47, 32,108,111,103, 50, 40,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 61, 32,
- 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97,108, 49,
- 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
-123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,
-118,111,105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,
-118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,
-108, 32, 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,
-104, 95,114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
-118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46, 53, 41,
- 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118,
- 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,
-108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61,
- 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,
-111,105,100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49,
- 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
-123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46,
- 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100,
- 32,115,113,117,101,101,122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,119,105,100,116,104, 44,
- 32,102,108,111, 97,116, 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
- 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,119, 40, 50, 46, 55, 49,
- 56, 50, 56, 49, 56, 51, 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,116,104, 41, 41, 41, 59,
- 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,
-101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10,
- 9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,
-111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48,
- 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99, 51, 32,118, 49, 44, 32,
+ 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 45, 32,118, 97,
+108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,108,111, 97,116, 32,
+118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
+ 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50, 59, 10,125, 10, 10,
+118,111,105,100, 32,109, 97,116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111,
+ 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102,
+ 32, 40,118, 97,108, 50, 32, 61, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10, 9,
+101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50, 59, 10,125, 10, 10,
+118,111,105,100, 32,109, 97,116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,
+111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,115,105,110, 40,118, 97,108, 41,
+ 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,
+111,115, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,103,101,110,116, 40,102,108,
+111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,
+116,118, 97,108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,115,
+105,110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
+123, 10, 9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48,
+ 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,
+111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97, 99,111,115, 40,
+102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,
+105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10, 9,
+ 9,111,117,116,118, 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,
+118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,116, 97,110, 40,102,108,111,
+ 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,
+118, 97,108, 32, 61, 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,112,111,
+119, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,
+111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32, 48, 46, 48, 41, 10,
+ 9, 9,111,117,116,118, 97,108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10, 9,101,108,115,
+101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,
+111,103, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,
+108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32, 38,
+ 38, 32,118, 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 61, 32,108,111,103, 50, 40,118, 97,108,
+ 49, 41, 32, 47, 32,108,111,103, 50, 40,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 61,
+ 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97,108,
+ 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
+ 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10,
+ 10,118,111,105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116,
+ 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,
+ 97,108, 32, 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,
+116,104, 95,114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
+116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46, 53,
+ 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,
+118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
+ 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32,
+ 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,
+118,111,105,100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108,
+ 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
+ 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 49,
+ 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,
+100, 32,115,113,117,101,101,122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,119,105,100,116,104,
+ 44, 32,102,108,111, 97,116, 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
+ 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,119, 40, 50, 46, 55,
+ 49, 56, 50, 56, 49, 56, 51, 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,116,104, 41, 41, 41,
+ 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51, 32,118, 49, 44, 32,
118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,
-111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118, 50, 59,
+111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59,
10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115,
40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46,
- 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,101, 40,118,101, 99, 51,
- 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32,
- 43, 32,118, 50, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,
- 9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,
-118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,
-118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
-117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44, 32, 48, 44, 32, 48, 41,
- 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125, 10, 10,118,111,105,100,
- 32,118,101, 99, 95,109, 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50,
- 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
-118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44, 32,118, 50, 41, 59, 10,
- 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,
-100, 32,118,101, 99, 95,109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116,
- 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
-123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10, 9,111,117,116,118,101, 99, 32, 61,
- 32,110,111,114,109, 97,108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,
-110,101,103, 97,116,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 41, 10,123, 10,
- 9,111,117,116,118, 32, 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,
-100,105,114, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10, 9,111,117,116,110,111,114, 32, 61, 32,100,105,
-114, 59, 10, 9,111,117,116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114, 41, 59, 10,125, 10, 10,
-118,111,105,100, 32, 99,117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 51, 32,
-118,101, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99,
- 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114,101, 49,
- 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,120,
- 59, 10, 9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112,
- 44, 32, 40,118,101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,121, 59, 10, 9,111,117,116,118,101, 99, 46,
-122, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,122, 32, 43,
- 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,122, 59, 10, 10, 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10,
- 9, 9,111,117,116,118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43, 32, 40,118,101, 99, 42, 40,
- 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,114,103, 98, 40,102,
-108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,117,
-114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,
-111,108, 46,114, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,117,
-114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,114, 41, 46, 97, 41, 46,114, 59, 10, 9,111,117,116,
- 99,111,108, 46,103, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,
-117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,103, 41, 46, 97, 41, 46,103, 59, 10, 9,111,117,
-116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,
-116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46, 98, 41, 46, 97, 41, 46, 98, 59, 10, 10, 9,
-105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32, 40,111,117,116, 99,
-111,108, 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10, 9,111,117,116,
- 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101,
- 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,
- 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 40,118,
-101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116,
- 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 40,118,101, 99, 52,
- 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108,
- 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111, 40,111,
-117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48,
- 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108,111, 97,
-116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,
-105,100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,108, 41,
- 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
-115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41, 10,123,
- 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,
-120, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101,
- 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99,
- 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108,
- 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108,
- 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 97,100,100, 40,102,108,111,
- 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,
-116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97,
- 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49,
- 44, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61,
- 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97,116, 32,
+ 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99, 51, 32,118, 49, 44,
+ 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,
+108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118, 50,
+ 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,
+115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51,
+ 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,101, 40,118,101, 99,
+ 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,
+111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49,
+ 32, 43, 32,118, 50, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59,
+ 10, 9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10,
+ 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51,
+ 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44, 32, 48, 44, 32, 48,
+ 41, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125, 10, 10,118,111,105,
+100, 32,118,101, 99, 95,109, 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118,
+ 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
+116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44, 32,118, 50, 41, 59,
+ 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,
+105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,
+116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
+ 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10, 9,111,117,116,118,101, 99, 32,
+ 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104,
+ 95,110,101,103, 97,116,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 41, 10,123,
+ 10, 9,111,117,116,118, 32, 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108, 40,118,101, 99, 51,
+ 32,100,105,114, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10, 9,111,117,116,110,111,114, 32, 61, 32,100,
+105,114, 59, 10, 9,111,117,116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114, 41, 59, 10,125, 10,
+ 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 51,
+ 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101,
+ 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114,101,
+ 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,
+120, 59, 10, 9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,
+112, 44, 32, 40,118,101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,121, 59, 10, 9,111,117,116,118,101, 99,
+ 46,122, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,122, 32,
+ 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,122, 59, 10, 10, 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41,
+ 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43, 32, 40,118,101, 99, 42,
+ 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,114,103, 98, 40,
+102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,
+117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116,
+ 99,111,108, 46,114, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,
+117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,114, 41, 46, 97, 41, 46,114, 59, 10, 9,111,117,
+116, 99,111,108, 46,103, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,
+116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,103, 41, 46, 97, 41, 46,103, 59, 10, 9,111,
+117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,
+120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46, 98, 41, 46, 97, 41, 46, 98, 59, 10, 10,
+ 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32, 40,111,117,116,
+ 99,111,108, 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10, 9,111,117,
+116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,
+101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
+ 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 40,
+118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,
+116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 40,118,101, 99,
+ 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,
+108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111, 40,
+111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46,
+ 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108,111,
+ 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,
+111,105,100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,108,
+ 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100,
+ 32,115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41, 10,
+123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,
+105,120, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,
+101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97,
+ 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,
+108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,
+108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 97,100,100, 40,102,108,
+111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,
+117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102,
+ 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108,
+ 49, 44, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32,
+ 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97,116,
+ 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,
+118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44,
+ 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32,
+ 99,111,108, 49, 32, 42, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,
+111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,
102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,
101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32,
- 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,
-111,108, 49, 32, 42, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,
-108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,102,
- 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101,
- 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48,
- 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97,
- 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 52, 40,
-102, 97, 99,109, 41, 32, 43, 32,102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 50, 41, 41, 42,
- 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32,
- 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,108, 97,121, 40,102,108,111, 97,
-116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116,
- 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99,
- 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45,
- 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,
-111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 42, 61, 32,102, 97, 99,109, 32, 43,
- 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,
-114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45,
- 32, 99,111,108, 50, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10, 9,105,102,
- 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 42, 61, 32,102,
- 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,
-116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40,
- 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59,
- 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98,
- 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,101,108,115,101,
- 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,
-102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,
-108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44,
- 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,
-111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44,
- 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32,
- 45, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97,
- 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99,
- 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,
-111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48,
- 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,
-116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 33, 61, 32, 48, 46, 48, 41,
- 32,111,117,116, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99, 42,
-111,117,116, 99,111,108, 46,114, 47, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 50, 46,103, 32, 33, 61, 32, 48,
- 46, 48, 41, 32,111,117,116, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,102,
- 97, 99, 42,111,117,116, 99,111,108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, 33,
- 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32,
- 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,
-105,120, 95,100,105,102,102, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101,
- 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99,
- 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108,
- 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 44, 32,102,
- 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100,
- 32,109,105,120, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,
-118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,
- 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,
-111,108, 46,114,103, 98, 32, 61, 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98, 42,
+ 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102,
+ 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 52,
+ 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 50, 41, 41,
+ 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61,
+ 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,108, 97,121, 40,102,108,111,
+ 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,
+116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97,
+ 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32,
+ 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116,
+ 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 42, 61, 32,102, 97, 99,109, 32,
+ 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108,
+ 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32,
+ 45, 32, 99,111,108, 50, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10, 9,105,
+102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 42, 61, 32,
+102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,101,108,115,101, 10, 9, 9,111,
+117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42,
+ 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41,
+ 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,
+ 98, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,101,108,115,
+101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48,
+ 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,
+111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,111, 97,116, 32,102, 97, 99,
+ 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52,
+ 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48,
+ 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49,
+ 32, 45, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46,
+ 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101,
+ 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,
+ 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46,
+ 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,
+117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 33, 61, 32, 48, 46, 48,
+ 41, 32,111,117,116, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99,
+ 42,111,117,116, 99,111,108, 46,114, 47, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 50, 46,103, 32, 33, 61, 32,
+ 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,
+102, 97, 99, 42,111,117,116, 99,111,108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32,
+ 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98,
+ 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,
+109,105,120, 95,100,105,102,102, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,
+101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97,
+ 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,
+108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 44, 32,
102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,
-100, 32,109,105,120, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49,
- 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,
- 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,
-116, 99,111,108, 46,114,103, 98, 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103,
- 98, 42,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,105,120, 95,100,111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,
-108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,
-123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,
-111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 33, 61, 32,
- 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,
-111,108, 50, 46,114, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,
-108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,
-111,108, 46,114, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49,
- 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 9,125,
- 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,
-116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9, 9,105,102, 40,116,109,112,
- 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,
-115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48,
- 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,
-117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 33,
- 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,
- 42, 99,111,108, 50, 46, 98, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116,
- 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,
-116, 99,111,108, 46, 98, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61,
- 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,
- 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,
-101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
-116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49,
- 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97,
- 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, 99,109,
- 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9,
- 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61,
- 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 47,116,109,112, 41, 41, 32, 60,
- 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102,
- 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,
-108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97,
- 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41,
- 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112,
- 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 47,116,109,112, 41, 41,
- 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,
-105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10,
- 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,
-102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46,
- 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,
-109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 47,116,109,112,
- 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,
-101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48,
- 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,125, 10, 10,118,111,105,
-100, 32,109,105,120, 95,104,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,
-118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,
- 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,
-116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,
-111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98,
- 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121,
- 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,
-104,115,118, 41, 59, 10, 9, 9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 95,116,111,
- 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120,
- 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116, 99,111,108, 46, 97, 32, 61,
- 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 97,116, 40,102,108,111, 97,
-116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116,
- 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99,
- 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45,
- 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,
-118, 44, 32,104,115,118, 50, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118,
- 41, 59, 10, 10, 9,105,102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111,
- 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,102, 97, 99,
-109, 42,104,115,118, 46,121, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111, 95,114,
-103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,
-118, 97,108, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,
-111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,
-108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109,
- 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, 10,
- 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10, 9,114,103, 98, 95,116,111, 95,
-104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,104,115,118, 46,122, 32, 61, 32,102, 97, 99,109, 42,
-104,115,118, 46,122, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,
-104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111,114, 40,
-102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44,
- 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112,
- 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49,
- 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99,
- 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,
-108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123,
- 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 9, 9,104,115,
-118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,104,115,118, 50, 46,121, 59, 10,
- 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,
-111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,
-116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,
-115,111,102,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32,
+100, 32,109,105,120, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44,
+ 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,
+102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116,
+ 99,111,108, 46,114,103, 98, 32, 61, 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98,
+ 42,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,
+105,100, 32,109,105,120, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108,
+ 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123,
+ 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,
+117,116, 99,111,108, 46,114,103, 98, 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,
+103, 98, 42,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,
+118,111,105,100, 32,109,105,120, 95,100,111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,
+111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41,
+ 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,
+ 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 33, 61,
+ 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42,
+ 99,111,108, 50, 46,114, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,
+111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116,
+ 99,111,108, 46,114, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,
+ 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 9,
+125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116,
+ 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9, 9,105,102, 40,116,109,
+112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,
+108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,112, 41, 32, 62, 32, 49, 46,
+ 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,
+111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32,
+ 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97,
+ 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,
+116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,
+117,116, 99,111,108, 46, 98, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32,
+ 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59,
+ 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,
+118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,
+117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32,
+ 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102,
+ 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, 99,
+109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,
+ 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32,
+ 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 47,116,109,112, 41, 41, 32,
+ 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,
+102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,
+101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,102,
+ 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48,
+ 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,
+112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 47,116,109,112, 41,
+ 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101,
+ 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59,
+ 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61,
+ 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48,
+ 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,
+116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 47,116,109,
+112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,
+115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46,
+ 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,125, 10, 10,118,111,
+105,100, 32,109,105,120, 95,104,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44,
+ 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,
+102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111,
+ 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,
+ 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103,
+ 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,
+121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44,
+ 32,104,115,118, 41, 59, 10, 9, 9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 95,116,
+111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,
+120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116, 99,111,108, 46, 97, 32,
+ 61, 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 97,116, 40,102,108,111,
+ 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,
+116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97,
+ 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32,
+ 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,
+115,118, 44, 32,104,115,118, 50, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,
+118, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,
+111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,102, 97,
+ 99,109, 42,104,115,118, 46,121, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111, 95,
+114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120,
+ 95,118, 97,108, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32,
99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32,
99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,
-109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99, 52, 40,
- 49, 46, 48, 41, 59, 10, 9,118,101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32, 99,111,
-108, 50, 41, 42, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,102, 97, 99,109,
- 42, 99,111,108, 49, 32, 43, 32,102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50, 42, 99,
-111,108, 49, 32, 43, 32, 99,111,108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,110,
-101, 97,114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,
-111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,
-108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,
- 99,111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,
-108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 32, 45,
- 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,114,
- 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,
-102, 40, 99,111,108, 50, 46,103, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49,
- 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,
-101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50,
- 46, 48, 42, 40, 99,111,108, 50, 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32,
- 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42,
- 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,
-116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,
- 98, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,114,103, 98, 40,102,108,111, 97,
-116, 32,102, 97, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,111,108,111,114,109, 97,112, 44, 32,111,117,116, 32,118,
-101, 99, 52, 32,111,117,116, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, 97,108,112,104, 97, 41, 10,
-123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,111,108,111,114,109, 97,112, 44, 32,
-102, 97, 99, 41, 59, 10, 9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,
-111,105,100, 32,114,103, 98,116,111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,
-116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, 48, 46,
- 51, 53, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 50, 59,
- 10,125, 10, 10,118,111,105,100, 32,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32,
- 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 46,
-120,121,122, 32, 61, 32,109,105,120, 40, 99,111,108, 46,120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48, 44, 32, 49, 46, 48,
- 44, 32, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 46,120,121,122, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46,
-119, 32, 61, 32, 99,111,108, 46,119, 59, 10,125, 10, 10,118,111,105,100, 32,104,117,101, 95,115, 97,116, 40,102,108,111, 97,116,
- 32,104,117,101, 44, 32,102,108,111, 97,116, 32,115, 97,116, 44, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,102,108,
-111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,
-111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32,104,115,118, 59, 10, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,
-108, 44, 32,104,115,118, 41, 59, 10, 10, 9,104,115,118, 91, 48, 93, 32, 43, 61, 32, 40,104,117,101, 32, 45, 32, 48, 46, 53, 41,
- 59, 10, 9,105,102, 40,104,115,118, 91, 48, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46, 48, 59, 32,101,
-108,115,101, 32,105,102, 40,104,115,118, 91, 48, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32, 49, 46, 48, 59,
- 10, 9,104,115,118, 91, 49, 93, 32, 42, 61, 32,115, 97,116, 59, 10, 9,105,102, 40,104,115,118, 91, 49, 93, 62, 49, 46, 48, 41,
- 32,104,115,118, 91, 49, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 49, 93, 60, 48, 46, 48,
- 41, 32,104,115,118, 91, 49, 93, 61, 32, 48, 46, 48, 59, 10, 9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117,101, 59,
- 10, 9,105,102, 40,104,115,118, 91, 50, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48, 59, 32,101,108,
-115,101, 32,105,102, 40,104,115,118, 91, 50, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46, 48, 59, 10, 10,
- 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 10, 9,111,117,116, 99,
-111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 44, 32,111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 10,125, 10, 10,118,
-111,105,100, 32,115,101,112, 97,114, 97,116,101, 95,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,
-108,111, 97,116, 32,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 98,
- 41, 10,123, 10, 9,114, 32, 61, 32, 99,111,108, 46,114, 59, 10, 9,103, 32, 61, 32, 99,111,108, 46,103, 59, 10, 9, 98, 32, 61,
- 32, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,102,108,111, 97,
-116, 32,114, 44, 32,102,108,111, 97,116, 32,103, 44, 32,102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,
- 99,111,108, 41, 10,123, 10, 9, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32, 49, 46, 48, 41,
- 59, 10,125, 10, 10,118,111,105,100, 32,111,117,116,112,117,116, 95,110,111,100,101, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,
-102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10,
- 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,
-125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 84, 69, 88, 84, 85, 82, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,102,108,105,112, 95, 98,108,101,
-110,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,
- 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 46,121,120,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,
-114,101, 95, 98,108,101,110,100, 95,108,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116,
- 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41,
- 47, 50, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,113,117, 97,100,
- 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,
-111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 44, 32, 48, 46,
- 48, 41, 59, 10, 9,111,117,116,118, 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,116,
-101,120,116,117,114,101, 95,119,111,111,100, 95,115,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,
-111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,
-101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,116, 40,118,101,
- 99, 46,120, 42,118,101, 99, 46,120, 32, 43, 32,118,101, 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101, 99, 46,122, 42,
-118,101, 99, 46,122, 41, 42, 50, 48, 46, 48, 59, 10, 9,102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53, 32, 43, 32, 48,
- 46, 53, 42,115,105,110, 40, 97, 41, 59, 10, 10, 9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 10, 9, 99,111,108,111,114, 32,
- 61, 32,118,101, 99, 52, 40,119,105, 44, 32,119,105, 44, 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10, 9,110,111,114,109, 97,108,
- 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
-116,101,120,116,117,114,101, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 50,
- 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52,
- 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 99,111,108,111,
-114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 40,118,101, 99, 46,120,121, 32, 43, 32,118,101, 99,
- 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 41, 42, 48, 46, 53, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59,
- 10, 10, 9,110,111,114,109, 97,108, 46,120, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46,114, 32, 45, 32, 48, 46, 53,
- 41, 59, 10, 9,110,111,114,109, 97,108, 46,121, 32, 61, 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45, 32, 99,111,108,111,114, 46,
-103, 41, 59, 10, 9,110,111,114,109, 97,108, 46,122, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46, 98, 32, 45, 32, 48,
- 46, 53, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84, 69, 88, 32, 42, 42, 42, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99,111, 40,
-118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 10,123, 10, 9,
-111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,117,118,
- 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10, 9, 47, 42, 32,
-100,105,115, 97, 98,108,101,100, 32,102,111,114, 32,110,111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104,101,114,
- 32,119,105,116,104, 32,108,101, 97,118,105,110,103, 32,111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,
-103, 10, 9, 32, 32, 32,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50,
- 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 32, 42, 47, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40,
- 97,116,116,117,118, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114,109, 40,
-118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41,
- 10,123, 10, 9, 47, 42, 32, 99,111,114,114,101,115,112,111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110, 44, 32,
-119,104,105, 99,104, 32,105,115, 32,110,101,103, 97,116,101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 10, 9, 32, 32, 32,
-111,117,116, 32, 98,108,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42, 47, 10, 9,
-111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125,
- 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 51, 32,116, 97,110,103,101,110,
-116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116, 97,110,103,101,110,116, 41, 10,123, 10, 9,111,117,116,116, 97,
-110,103,101,110,116, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 41, 59, 10,125, 10, 10,118,
-111,105,100, 32,116,101,120, 99,111, 95,103,108,111, 98, 97,108, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116,
- 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 41, 10,123, 10, 9,103,
-108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48,
- 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101, 99,116, 40,109, 97,116,
- 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97,116, 44, 32,118,101, 99,
- 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116, 41, 10,123, 10, 9,111, 98,106,101, 99,116,
- 32, 61, 32, 40,111, 98,105,110,118,109, 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111,
- 44, 32, 49, 46, 48, 41, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,114,101,102,108,
- 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,114,101,
-102, 41, 10,123, 10, 9,114,101,102, 32, 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116, 40,118,110, 44, 32,118,
-105,101,119, 41, 42,118,110, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114,109, 40,118,101, 99, 51,
- 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,
- 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,
-116,101,100, 32, 42, 47, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,
-111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98,108,101,110,100, 40,118,
-101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102,
- 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41,
- 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10,
- 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116,
- 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,
-116,101,120, 95,114,103, 98, 95,109,117,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,
-120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,
-116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102,
- 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10,
- 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,
-116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114,101,101,110, 40,118,101,
- 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97,
- 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,
-123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,
-102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,118,101, 99, 51, 40,
- 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42, 40,118,101, 99, 51, 40,
- 49, 46, 48, 41, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,111,117,116,
- 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101,114,108, 97,121, 40,118,
-101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102,
- 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41,
- 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10,
- 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32,
- 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 42, 40,102, 97, 99,
-109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,
-105,110, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116,
- 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108,
- 46,114, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,
-108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,
-116,101,120, 99,111,108, 46,103, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48,
- 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,
-108, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10, 9,105,102, 40,111,117,116,
- 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46,
- 98, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 41, 59, 10, 9,101,
-108,115,101, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46,
- 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,
-111,117,116, 99,111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,117, 98, 40,
-118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,
-102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108,
- 41, 10,123, 10, 9,105,110, 99,111,108, 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43,
- 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 97,100,100, 40,118,101,
- 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97,
- 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,
-123, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,
-116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118, 40,118,101, 99, 51, 32,
-111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44,
- 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,
-102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,
-109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,114, 32, 33, 61, 32, 48,
- 46, 48, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97,
- 99,116, 42,111,117,116, 99,111,108, 46,114, 47,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40,116,101,120, 99,111,108,
- 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108,
- 46,103, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,103, 47,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102,
- 40,116,101,120, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109,
- 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46, 98, 47,116,101,120, 99,111,108,
- 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,102,102, 40,118,101, 99, 51, 32,111,
+109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59,
+ 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10, 9,114,103, 98, 95,116,111,
+ 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,104,115,118, 46,122, 32, 61, 32,102, 97, 99,109,
+ 42,104,115,118, 46,122, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10, 9,104,115,118, 95,116,111, 95,114,103, 98,
+ 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111,114,
+ 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50,
+ 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,
+112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32,
+ 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101,
+ 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,
+111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,
+123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 9, 9,104,
+115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,104,115,118, 50, 46,121, 59,
+ 10, 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116,
+ 99,111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,
+117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120,
+ 95,115,111,102,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52,
+ 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61,
+ 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97,
+ 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99, 52,
+ 40, 49, 46, 48, 41, 59, 10, 9,118,101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32, 99,
+111,108, 50, 41, 42, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,102, 97, 99,
+109, 42, 99,111,108, 49, 32, 43, 32,102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50, 42,
+ 99,111,108, 49, 32, 43, 32, 99,111,108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,
+110,101, 97,114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32,
+ 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32,
+ 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61,
+ 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,
+111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 32,
+ 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,
+114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,
+105,102, 40, 99,111,108, 50, 46,103, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108,
+ 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10,
+ 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40,
+ 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46, 98,
+ 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99,
+ 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,
+117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50,
+ 46, 98, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,114,103, 98, 40,102,108,111,
+ 97,116, 32,102, 97, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,111,108,111,114,109, 97,112, 44, 32,111,117,116, 32,
+118,101, 99, 52, 32,111,117,116, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, 97,108,112,104, 97, 41,
+ 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,111,108,111,114,109, 97,112, 44,
+ 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108, 46, 97, 59, 10,125, 10, 10,
+118,111,105,100, 32,114,103, 98,116,111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,111,117,116,118, 97,108, 41, 32, 32, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,108,111,114, 46,114,
+ 42, 48, 46, 51, 53, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48,
+ 46, 50, 59, 32, 47, 42, 32,107,101,101,112, 32,116,104,101,115,101, 32,102, 97, 99,116,111,114,115, 32,105,110, 32,115,121,110,
+ 99, 32,119,105,116,104, 32,116,101,120,116,117,114,101, 46,104, 58, 82, 71, 66, 84, 79, 66, 87, 32, 42, 47, 10,125, 10, 10,118,
+111,105,100, 32,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,
+111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 46,120,121,122, 32, 61,
+ 32,109,105,120, 40, 99,111,108, 46,120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48, 44, 32, 49, 46, 48, 44, 32, 49, 46, 48,
+ 41, 32, 45, 32, 99,111,108, 46,120,121,122, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46,119, 32, 61, 32, 99,
+111,108, 46,119, 59, 10,125, 10, 10,118,111,105,100, 32,104,117,101, 95,115, 97,116, 40,102,108,111, 97,116, 32,104,117,101, 44,
+ 32,102,108,111, 97,116, 32,115, 97,116, 44, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,102,108,111, 97,116, 32,102,
+ 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123,
+ 10, 9,118,101, 99, 52, 32,104,115,118, 59, 10, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 44, 32,104,115,
+118, 41, 59, 10, 10, 9,104,115,118, 91, 48, 93, 32, 43, 61, 32, 40,104,117,101, 32, 45, 32, 48, 46, 53, 41, 59, 10, 9,105,102,
+ 40,104,115,118, 91, 48, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46, 48, 59, 32,101,108,115,101, 32,105,
+102, 40,104,115,118, 91, 48, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32, 49, 46, 48, 59, 10, 9,104,115,118,
+ 91, 49, 93, 32, 42, 61, 32,115, 97,116, 59, 10, 9,105,102, 40,104,115,118, 91, 49, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91,
+ 49, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 49, 93, 60, 48, 46, 48, 41, 32,104,115,118,
+ 91, 49, 93, 61, 32, 48, 46, 48, 59, 10, 9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117,101, 59, 10, 9,105,102, 40,
+104,115,118, 91, 50, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102,
+ 40,104,115,118, 91, 50, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46, 48, 59, 10, 10, 9,104,115,118, 95,
+116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,
+109,105,120, 40, 99,111,108, 44, 32,111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,
+101,112, 97,114, 97,116,101, 95,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 98, 41, 10,123, 10, 9,
+114, 32, 61, 32, 99,111,108, 46,114, 59, 10, 9,103, 32, 61, 32, 99,111,108, 46,103, 59, 10, 9, 98, 32, 61, 32, 99,111,108, 46,
+ 98, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,102,108,111, 97,116, 32,114, 44, 32,
+102,108,111, 97,116, 32,103, 44, 32,102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 41, 10,
+123, 10, 9, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,
+118,111,105,100, 32,111,117,116,112,117,116, 95,110,111,100,101, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,102,108,111, 97,116,
+ 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,111,117,116,114,
+103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,125, 10, 10, 47, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 84, 69, 88, 84, 85, 82, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,102,108,105,112, 95, 98,108,101,110,100, 40,118,101,
+ 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,
+101, 99, 32, 61, 32,118,101, 99, 46,121,120,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,
+101,110,100, 95,108,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
+ 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 59,
+ 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,113,117, 97,100, 40,118,101, 99, 51,
+ 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,
+108, 32, 61, 32,109, 97,120, 40, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10, 9,
+111,117,116,118, 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,
+101, 95,119,111,111,100, 95,115,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,
+ 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,
+111,114,109, 97,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,116, 40,118,101, 99, 46,120, 42,118,
+101, 99, 46,120, 32, 43, 32,118,101, 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101, 99, 46,122, 42,118,101, 99, 46,122,
+ 41, 42, 50, 48, 46, 48, 59, 10, 9,102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53, 32, 43, 32, 48, 46, 53, 42,115,105,
+110, 40, 97, 41, 59, 10, 10, 9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99,
+ 52, 40,119,105, 44, 32,119,105, 44, 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32,118,101,
+ 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,
+114,101, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97,
+ 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,
+114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,
+101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 40,118,101, 99, 46,120,121, 32, 43, 32,118,101, 99, 50, 40, 49, 46, 48,
+ 44, 32, 49, 46, 48, 41, 41, 42, 48, 46, 53, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10, 10, 9,110,111,
+114,109, 97,108, 46,120, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46,114, 32, 45, 32, 48, 46, 53, 41, 59, 10, 9,110,
+111,114,109, 97,108, 46,121, 32, 61, 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45, 32, 99,111,108,111,114, 46,103, 41, 59, 10, 9,
+110,111,114,109, 97,108, 46,122, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46, 98, 32, 45, 32, 48, 46, 53, 41, 59, 10,
+125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84, 69, 88, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99,111, 40,118,101, 99, 51, 32,
+ 97,116,116,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 10,123, 10, 9,111,114, 99,111, 32,
+ 61, 32, 97,116,116,111,114, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,117,118, 40,118,101, 99, 50,
+ 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10, 9, 47, 42, 32,100,105,115, 97, 98,
+108,101,100, 32,102,111,114, 32,110,111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104,101,114, 32,119,105,116,104,
+ 32,108,101, 97,118,105,110,103, 32,111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 10, 9, 32, 32,
+ 32,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44,
+ 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 32, 42, 47, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118,
+ 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114,109, 40,118,101, 99, 51, 32,
+110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9, 47,
+ 42, 32, 99,111,114,114,101,115,112,111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110, 44, 32,119,104,105, 99,104,
+ 32,105,115, 32,110,101,103, 97,116,101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 10, 9, 32, 32, 32,111,117,116, 32, 98,
+108,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42, 47, 10, 9,111,117,116,110,111,
+114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,
+100, 32,116,101,120, 99,111, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 51, 32,116, 97,110,103,101,110,116, 44, 32,111,117,
+116, 32,118,101, 99, 51, 32,111,117,116,116, 97,110,103,101,110,116, 41, 10,123, 10, 9,111,117,116,116, 97,110,103,101,110,116,
+ 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,
+101,120, 99,111, 95,103,108,111, 98, 97,108, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,101, 99,
+ 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 41, 10,123, 10, 9,103,108,111, 98, 97,108,
+ 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 46,120,121,
+122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101, 99,116, 40,109, 97,116, 52, 32,118,105,101,
+119,105,110,118,109, 97,116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44,
+ 32,111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116, 41, 10,123, 10, 9,111, 98,106,101, 99,116, 32, 61, 32, 40,111,
+ 98,105,110,118,109, 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48,
+ 41, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,114,101,102,108, 40,118,101, 99, 51,
+ 32,118,110, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,114,101,102, 41, 10,123, 10,
+ 9,114,101,102, 32, 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116, 40,118,110, 44, 32,118,105,101,119, 41, 42,
+118,110, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114,109, 40,118,101, 99, 51, 32,110,111,114,109,
+ 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9, 47, 42, 32, 98,108,
+101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42,
+ 47, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108,
+ 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98,108,101,110,100, 40,118,101, 99, 51, 32,111,
+117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,
+102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,
+108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109,
+ 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,
+111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,
+103, 98, 95,109,117,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44,
+ 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99,
+ 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42,
+ 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,
+108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59,
+ 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114,101,101,110, 40,118,101, 99, 51, 32,111,117,
+116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,
+108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,
+111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32,
+ 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,118,101, 99, 51, 40, 49, 46, 48, 41, 32,
+ 45, 32, 40,118,101, 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32,
+ 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,111,117,116, 99,111,108, 41, 59,
+ 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101,114,108, 97,121, 40,118,101, 99, 51, 32,111,
117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,
102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,
108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109,
- 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,
-111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,
-125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101, 99, 51, 32,111,117,116, 99,111,
+ 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53,
+ 41, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 42, 40,102, 97, 99,109, 32, 43, 32, 50,
+ 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108,
+ 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48,
+ 32, 45, 32,116,101,120, 99,111,108, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10,
+ 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61,
+ 32,111,117,116, 99,111,108, 46,103, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,
+108, 46,103, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102,
+ 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,103, 41, 41,
+ 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98,
+ 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 42, 40,102, 97,
+ 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 41, 59, 10, 9,101,108,115,101, 10, 9,
+ 9,105,110, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,
+116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,
+108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,117, 98, 40,118,101, 99, 51, 32,
+111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44,
+ 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,
+105,110, 99,111,108, 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,
+111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 97,100,100, 40,118,101, 99, 51, 32,111,117,
+116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,
+108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,105,110,
+ 99,111,108, 32, 61, 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59,
+ 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118, 40,118,101, 99, 51, 32,111,117,116, 99,111,
108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,
116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116,
- 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,
-109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,
-108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114,
- 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59,
- 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 32, 60,
- 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,
-110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,
-101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,
-111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,
-108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,108,105,103,104,116, 40,118,101, 99, 51,
- 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116,
- 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,
- 9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103,
- 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116,
- 42,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,
-110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116,
- 99,111,108, 46,114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102,
- 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,
-101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,
-102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,
- 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61,
- 32,111,117,116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,104,117,101, 40,
-118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,
-102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108,
- 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,104,117,101, 40,102, 97, 99,116, 42,102, 97,
- 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,
-111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108,
- 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 97,116, 40,118,101, 99, 51, 32,
+ 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49,
+ 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,
+110, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99,116, 42,111,117,
+116, 99,111,108, 46,114, 47,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,103, 32, 33, 61,
+ 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,
+102, 97, 99,116, 42,111,117,116, 99,111,108, 46,103, 47,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40,116,101,120, 99,
+111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,
+111,108, 46, 98, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46, 98, 47,116,101,120, 99,111,108, 46, 98, 59, 10,125,
+ 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,102,102, 40,118,101, 99, 51, 32,111,117,116, 99,111,108,
+ 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116,
+ 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,
+102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46,
+ 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,
+102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,
+105,100, 32,109,116,101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101,
+ 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
+103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109,
+ 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49,
+ 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 59, 10,
+ 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,111,
+108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, 10, 9, 99,111,108,
+ 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,
+111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,
+103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108,
+ 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, 32,
+ 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, 10,
+125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,108,105,103,104,116, 40,118,101, 99, 51, 32,111,117,116, 99,
+111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111,
+ 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,
+116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97,
+ 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,
+111,108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,
+114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114,
+ 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 32,
+ 62, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,
+105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,
+116,101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110,
+ 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,
+111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,104,117,101, 40,118,101, 99, 51, 32,
111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44,
32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,
-118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,
+118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,104,117,101, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,
101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49,
46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,
+ 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 97,116, 40,118,101, 99, 51, 32,111,117,116, 99,111,
108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,
116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32,
- 99,111,108, 59, 10, 10, 9,109,105,120, 95,118, 97,108, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,
+ 99,111,108, 59, 10, 10, 9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,
117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,
99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 99,111,108,111,114, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,
-118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102,
- 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108,
- 59, 10, 10, 9,109,105,120, 95, 99,111,108,111,114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,
-116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,
-111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,
-105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116, 32,102,108,111, 97,116, 32,102,
- 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,109, 41,
- 10,123, 10, 9,102, 97, 99,116, 32, 42, 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49,
- 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,
-111, 97,116, 32,116,109,112, 32, 61, 32,102, 97, 99,116, 59, 10, 9, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,109, 59, 10, 9,
- 9,102, 97, 99,109, 32, 61, 32,116,109,112, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,
-117,101, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120,
- 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116,
- 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,
-101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59,
- 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,
-116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,109,117,108, 40,102,108,111,
- 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102,
- 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108,
- 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,
-115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46,
- 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,
-116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,
-117,101, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,
-120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,
-116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,
-116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41,
- 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,
- 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108,
- 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,
-118, 97,108,117,101, 95,115,117, 98, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,
-120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,
-116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,
-116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41,
- 59, 10, 10, 9,102, 97, 99,116, 32, 61, 32, 45,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,
-116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,
-108,117,101, 95, 97,100,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,
-111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,
-102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,
-120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10,
- 10, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120,
- 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101,
- 95,100,105,118, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44,
+111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101,
+ 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
+103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10,
+ 10, 9,109,105,120, 95,118, 97,108, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108,
+ 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59,
+ 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,
+116,101,120, 95,114,103, 98, 95, 99,111,108,111,114, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,
+116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,
+111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,
+105,120, 95, 99,111,108,111,114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44,
+ 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10,
+ 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
+101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,
+102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,109, 41, 10,123, 10, 9,102,
+ 97, 99,116, 32, 42, 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97,
+ 99,116, 59, 10, 10, 9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,
+109,112, 32, 61, 32,102, 97, 99,116, 59, 10, 9, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,109, 59, 10, 9, 9,102, 97, 99,109,
+ 32, 61, 32,116,109,112, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 98,108,
+101,110,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,
+102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,
+116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,
+108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,110,
+ 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59,
+ 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,109,117,108, 40,102,108,111, 97,116, 32,111,117,
+116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,
+102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,
+102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,
+116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102,
+ 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,
+108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115, 99,
+114,101,101,110, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44,
+ 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118,
+ 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102,
+ 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 49, 46, 48, 32, 45,
+ 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40, 49,
+ 46, 48, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101,
+ 95,115,117, 98, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44,
+ 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118,
+ 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102,
+ 97, 99,116, 32, 61, 32, 45,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,
+108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 97,
+100,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,
+108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116,
+ 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,
+117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,
+116, 32, 61, 32,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43,
+ 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100,105,118, 40,
+102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,
+116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,
+ 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,
+118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,102, 40,116,101,120,
+ 99,111,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,
+108, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120, 99,111,108, 59, 10, 9,101,108,115,101, 10, 9, 9,
+105,110, 99,111,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,
+100,105,102,102, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44,
32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111,
97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118,
97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,
-102, 40,116,101,120, 99,111,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,
-111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120, 99,111,108, 59, 10, 9,101,108,
-115,101, 10, 9, 9,105,110, 99,111,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118,
- 97,108,117,101, 95,100,105,102,102, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,
-120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,
-116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,
-116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41,
- 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97,
- 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,
-120, 95,118, 97,108,117,101, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116,
- 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44,
- 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59,
- 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97,
- 99,109, 41, 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10,
- 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,
-108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
- 95,118, 97,108,117,101, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116,
- 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44,
- 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59,
- 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97,
- 99,109, 41, 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10,
- 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,
-108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
- 95,118, 97,108,117,101, 95, 99,108, 97,109,112, 95,112,111,115,105,116,105,118,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44,
- 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, 32,109,
- 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101,
- 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102,
- 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32,
- 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,105,118,105,100,101, 40,102,108,
-111, 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,111,117,
-116,104, 97,114, 32, 61, 32,104, 97,114, 47, 49, 50, 56, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104,
- 97,114, 95,109,117,108,116,105,112,108,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,117,116,
- 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,104, 97,114, 32, 42, 61, 32, 49, 50, 56, 46, 48, 59, 10,
- 10, 9,105,102, 40,104, 97,114, 32, 60, 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,
-108,115,101, 32,105,102, 40,104, 97,114, 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 53, 49, 49,
- 46, 48, 59, 10, 9,101,108,115,101, 32,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 59, 10,125, 10, 10,118,111,105,100, 32,
-109,116,101,120, 95, 97,108,112,104, 97, 95,102,114,111,109, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,
-116, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 41, 10,123, 10, 9, 97,108,112,104, 97, 32, 61, 32, 99,111,108, 46, 97, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,116,111, 95, 99,111,108, 40,118,101, 99, 52, 32,
- 99,111,108, 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,
-108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 97,108,112,
-104, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,110,116, 40,118,101, 99, 52, 32,
-114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,105,110,116,
-101,110,115,105,116,121, 32, 61, 32,100,111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32, 48, 46, 52, 53, 44, 32, 48, 46,
- 50, 41, 44, 32,114,103, 98, 46,114,103, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101,
- 95,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,117,116, 32,102,108,111, 97,116,
- 32,111,117,116,118, 97,108,117,101, 41, 10,123, 10, 9,111,117,116,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 32, 45, 32,105,
-110,118, 97,108,117,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,105,110,118,101,114,116, 40,
-118,101, 99, 52, 32,105,110,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,
-111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,105,110,114,103, 98, 46,
-114,103, 98, 44, 32,105,110,114,103, 98, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,
-101, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,102,108,111, 97,116, 32,105,
-110,116,101,110,115,105,116,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,111,117,116,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,102,108,111, 97,116,
- 32,102, 97, 99,116, 32, 61, 32,105,110,116,101,110,115,105,116,121, 59, 10, 9,111,117,116,105,110,116,101,110,115,105,116,121,
- 32, 61, 32,105,110,116,101,110,115,105,116,121, 42,115,116,101,110, 99,105,108, 59, 10, 9,111,117,116,115,116,101,110, 99,105,
-108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,
-103, 98, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,118,101, 99, 52, 32,114,
-103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,118,101,
- 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,114,103, 98, 46, 97,
- 59, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32,114,103, 98, 46, 97, 42,
-115,116,101,110, 99,105,108, 41, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,
-102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,111,102,115, 40,118,
-101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,111,102,115, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,
-116,116,101,120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,120, 99,111, 32, 43, 32,111,102,
-115, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,115,105,122,101, 40,118,101, 99,
- 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,
-116,101,120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,101, 42,116,101,120, 99,111, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101,
- 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,
-118,101, 99, 51, 40,118,101, 99, 46,120,121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 32, 48, 46, 53, 41,
- 44, 32,118,101, 99, 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,105,109, 97,103,101, 40,118,101, 99,
- 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
-118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
-110,111,114,109, 97,108, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97,
- 44, 32,118,101, 99, 46,120,121, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10, 9, 10, 9,110,111,114,109,
- 97,108, 32, 61, 32, 50, 46, 48, 42, 40,118,101, 99, 51, 40, 99,111,108,111,114, 46,114, 44, 32, 45, 99,111,108,111,114, 46,103,
- 44, 32, 99,111,108,111,114, 46, 98, 41, 32, 45, 32,118,101, 99, 51, 40, 48, 46, 53, 44, 32, 45, 48, 46, 53, 44, 32, 48, 46, 53,
- 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,116,101, 95,116,101,120,110,111,114,109, 97,
+110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,
+120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,
+117,101, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,
+111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,
+120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10,
+ 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10, 9,105,102, 40, 99,
+111,108, 32, 60, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,
+110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,
+101, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,
+111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,
+120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10,
+ 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10, 9,105,102, 40, 99,
+111,108, 32, 62, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,
+110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,
+101, 95, 99,108, 97,109,112, 95,112,111,115,105,116,105,118,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, 32,109, 97,120, 40,102, 97,
+ 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109,
+112, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123,
+ 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59,
+ 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,104,
+ 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,111,117,116,104, 97,114, 32,
+ 61, 32,104, 97,114, 47, 49, 50, 56, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,109,117,
+108,116,105,112,108,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,
+116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,104, 97,114, 32, 42, 61, 32, 49, 50, 56, 46, 48, 59, 10, 10, 9,105,102, 40,
+104, 97,114, 32, 60, 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,105,
+102, 40,104, 97,114, 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 53, 49, 49, 46, 48, 59, 10, 9,
+101,108,115,101, 32,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,
+ 97,108,112,104, 97, 95,102,114,111,109, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32, 97,108,112,104, 97, 41, 10,123, 10, 9, 97,108,112,104, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,
+111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,116,111, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,
+102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,
+ 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,
+125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,110,116, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,
+111,117,116, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,105,110,116,101,110,115,105,116,
+121, 32, 61, 32,100,111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32, 48, 46, 52, 53, 44, 32, 48, 46, 50, 41, 44, 32,114,
+103, 98, 46,114,103, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,105,110,118,101,
+114,116, 40,102,108,111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
+ 97,108,117,101, 41, 10,123, 10, 9,111,117,116,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 32, 45, 32,105,110,118, 97,108,117,
+101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,105,110,118,101,114,116, 40,118,101, 99, 52, 32,
+105,110,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,111,117,116,114,103,
+ 98, 32, 61, 32,118,101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,105,110,114,103, 98, 46,114,103, 98, 44, 32,
+105,110,114,103, 98, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115,116,101,
+110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,
+105,116,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,102,
+108,111, 97,116, 32,111,117,116,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116,
+ 32, 61, 32,105,110,116,101,110,115,105,116,121, 59, 10, 9,111,117,116,105,110,116,101,110,115,105,116,121, 32, 61, 32,105,110,
+116,101,110,115,105,116,121, 42,115,116,101,110, 99,105,108, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,
+116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,116,
+101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,118,101, 99, 52, 32,114,103, 98, 44, 32,111,
+117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
+116,114,103, 98, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,114,103, 98, 46, 97, 59, 10, 9,111,117,
+116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32,114,103, 98, 46, 97, 42,115,116,101,110, 99,
+105,108, 41, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59,
+ 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,111,102,115, 40,118,101, 99, 51, 32,116,
+101,120, 99,111, 44, 32,118,101, 99, 51, 32,111,102,115, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,
+111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,120, 99,111, 32, 43, 32,111,102,115, 59, 10,125, 10,
+ 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,115,105,122,101, 40,118,101, 99, 51, 32,116,101,120,
+ 99,111, 44, 32,118,101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,111,
+ 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,101, 42,116,101,120, 99,111, 59, 10,125, 10, 10,118,
+111,105,100, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,
+116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40,
+118,101, 99, 46,120,121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 32, 48, 46, 53, 41, 44, 32,118,101, 99,
+ 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,116,101,120,
+ 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,
+117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,
+101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118, 97,108,117,101, 32,
+ 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,
+116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,
+111,114,109, 97,108, 41, 10,123, 10, 32, 32, 32, 32,118,101, 99, 52, 32, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,
+101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 50, 46,
+ 48, 42, 40,118,101, 99, 51, 40, 99,111,108,111,114, 46,114, 44, 32, 45, 99,111,108,111,114, 46,103, 44, 32, 99,111,108,111,114,
+ 46, 98, 41, 32, 45, 32,118,101, 99, 51, 40, 48, 46, 53, 44, 32, 45, 48, 46, 53, 44, 32, 48, 46, 53, 41, 41, 59, 10,125, 10, 10,
+118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,110,111,114,109, 97,108,115, 95,105,110,105,116, 40, 32,118,101, 99,
+ 51, 32,118, 78, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78,111,114,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,
+ 78, 97, 99, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 41,
+ 10,123, 10, 9,118, 78,111,114,103, 32, 61, 32,118, 78, 59, 10, 9,118, 78, 97, 99, 99, 32, 61, 32,118, 78, 59, 10, 9,102, 80,
+114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10, 47, 42, 42, 32,104,101,108,112,101,
+114, 32,109,101,116,104,111,100, 32,116,111, 32,101,120,116,114, 97, 99,116, 32,116,104,101, 32,117,112,112,101,114, 32,108,101,
+102,116, 32, 51,120, 51, 32,109, 97,116,114,105,120, 32,102,114,111,109, 32, 97, 32, 52,120, 52, 32,109, 97,116,114,105,120, 32,
+ 42, 47, 10,109, 97,116, 51, 32,116,111, 95,109, 97,116, 51, 40,109, 97,116, 52, 32,109, 52, 41, 10,123, 10, 9,109, 97,116, 51,
+ 32,109, 51, 59, 10, 9,109, 51, 91, 48, 93, 32, 61, 32,109, 52, 91, 48, 93, 46,120,121,122, 59, 10, 9,109, 51, 91, 49, 93, 32,
+ 61, 32,109, 52, 91, 49, 93, 46,120,121,122, 59, 10, 9,109, 51, 91, 50, 93, 32, 61, 32,109, 52, 91, 50, 93, 46,120,121,122, 59,
+ 10, 9,114,101,116,117,114,110, 32,109, 51, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,
+110,105,116, 95,111, 98,106,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99,
+ 51, 32,115,117,114,102, 95,110,111,114,109, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,109, 97,116, 52, 32,109, 86,105,101,119,
+ 44, 32,109, 97,116, 52, 32,109, 86,105,101,119, 73,110,118, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 44, 32,109, 97,116, 52,
+ 32,109, 79, 98,106, 73,110,118, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77,
+ 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9,
+ 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,
+116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32,
+ 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116,
+ 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,109, 97,116, 51, 32,111, 98,106, 50,118,105,101,119, 32,
+ 61, 32,116,111, 95,109, 97,116, 51, 40,109, 86,105,101,119, 32, 42, 32,109, 79, 98,106, 41, 59, 10, 9,109, 97,116, 51, 32,118,
+105,101,119, 50,111, 98,106, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 79, 98,106, 73,110,118, 32, 42, 32,109, 86,105,101,
+119, 73,110,118, 41, 59, 10, 9, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,118,105,101,119, 50,111, 98,
+106, 32, 42, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 83,105,103,
+109, 97, 84, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32,
+ 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,115,117,114,102, 95,110,111,
+114,109, 32, 42, 32,111, 98,106, 50,118,105,101,119, 32, 41, 59, 10, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,
+118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44,
+ 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109,
+ 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10, 9, 10, 9, 47, 42, 32,112,114,101,116,114, 97,110,115,102,111,114,109, 32,118, 78,
+ 97, 99, 99, 32, 40,105,110, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 41, 32,117,115,105,110,103, 32,116,
+104,101, 32,105,110,118,101,114,115,101, 32,116,114, 97,110,115,112,111,115,101,100, 32, 42, 47, 10, 9,118, 82, 49, 32, 61, 32,
+118, 82, 49, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10, 9,118, 82, 50, 32, 61, 32,118, 82, 50, 32, 42, 32,118,105,101,
+119, 50,111, 98,106, 59, 10, 9,118, 78, 32, 61, 32,118, 78, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10, 9, 10, 9,102,
+108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 32, 42, 32,108,101,
+110,103,116,104, 40,118, 78, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32,
+ 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,
+110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,
+116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,116,101,120,
+116,117,114,101,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,
+117,114,102, 95,110,111,114,109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118,
+ 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9,
+ 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,
+111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9,
+ 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,
+111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97,
+ 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 83,105,103,
+109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 78,
+ 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32,105,110,116,101,
+114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47, 10, 9, 10, 9,118, 82, 49,
+ 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78,
+ 32, 41, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118,
+ 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 41, 59, 10, 9,102, 68,101,116, 32, 61, 32,115,105,103,110, 40, 32,100,111,
+116, 40,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 41, 32, 41, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,
+110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61,
+ 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77,
+ 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,
+116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,
+112, 95,105,110,105,116, 95,118,105,101,119,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44,
+ 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,102,108,111, 97,
+116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,
+105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,
+110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,
+ 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99,
+ 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51,
+ 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101,
+ 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,
+118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122,
+101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47,
+ 10, 9, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10,
+ 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 10, 9,102,
+ 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10, 9, 10, 9,102,
+108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10, 9,118, 78,
+ 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101,
+ 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,
+110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100,
+ 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 51, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,
+112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,
+117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 83, 84,108,108, 32, 61, 32,116,
+101,120, 99,111, 46,120,121, 59, 10, 9,118,101, 99, 50, 32, 83, 84,108,114, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43,
+ 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,117,108, 32, 61, 32,116,
+101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9, 10, 9,102,108,
+111, 97,116, 32, 72,108,108, 44, 72,108,114, 44, 72,117,108, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,
+114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,108, 41, 44, 32, 72,108,108, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119,
+ 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,114, 41, 44, 32, 72,108,114, 32, 41, 59, 10, 9,
+114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117,108, 41, 44, 32, 72,
+117,108, 32, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,108,114, 32, 45, 32, 72,
+108,108, 41, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117,108, 32, 45, 32, 72,108,108, 41,
+ 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 53, 40, 32,118,101, 99, 51, 32,116,
+101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,
+101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50,
+ 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118,101, 99, 50, 32, 84,
+101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 10, 9,118,101, 99, 50, 32, 83, 84,
+ 99, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10, 9,118,101, 99, 50, 32, 83, 84,108, 32, 61, 32,116,101,120, 99,111, 46,
+120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,114, 32, 61, 32,116,
+101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,
+100, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59, 10, 9,118,101,
+ 99, 50, 32, 83, 84,117, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32,
+ 59, 10, 9, 10, 9,102,108,111, 97,116, 32, 72, 99, 44, 72,108, 44, 72,114, 44, 72,100, 44, 72,117, 59, 10, 9,114,103, 98,116,
+111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84, 99, 41, 44, 32, 72, 99, 32, 41, 59, 10,
+ 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108, 41, 44, 32, 72,
+108, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,
+114, 41, 44, 32, 72,114, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109,
+ 97, 44, 32, 83, 84,100, 41, 44, 32, 72,100, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101,
+ 50, 68, 40,105,109, 97, 44, 32, 83, 84,117, 41, 44, 32, 72,117, 32, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99,
+ 97,108,101, 32, 42, 32, 40, 72,114, 32, 45, 32, 72,108, 41, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42,
+ 32, 40, 72,117, 32, 45, 32, 72,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,
+112,108,121, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,102,108,111, 97,
+116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,118,101, 99, 51, 32,
+118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,
+111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 41, 32, 10,
+123, 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,102, 68,101,116, 41, 32, 42,
+ 32, 40, 32,100, 66,115, 32, 42, 32,118, 82, 49, 32, 43, 32,100, 66,116, 32, 42, 32,118, 82, 50, 32, 41, 59, 10, 9, 10, 9,118,
+ 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114, 97,100, 59,
+ 10, 9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,118, 78,
+ 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,
+108,121, 95,116,101,120,115,112, 97, 99,101, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,116, 32,100,
+ 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, 32,118, 82,
+ 50, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,102,108,111,
+ 97,116, 32,105,109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99,
+ 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,
+117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 41, 32, 10,123,
+ 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,
+118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 10, 9,118,
+101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,102, 68,101,116, 41, 32, 42, 32, 40, 32, 10,
+ 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,115, 32, 47, 32,108,101,110,103,116,104, 40, 32,118,101, 99, 50, 40,
+105,109, 97, 95,120, 42, 84,101,120, 68,120, 46,120, 44, 32,105,109, 97, 95,121, 42, 84,101,120, 68,120, 46,121, 41, 32, 41, 32,
+ 42, 32,118, 82, 49, 32, 43, 32, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,116, 32, 47, 32,108,101,110,103,
+116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,121, 46,120, 44, 32,105,109, 97, 95,121, 42, 84,101,
+120, 68,121, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 50, 32, 41, 59, 10, 9, 9, 9, 9, 10, 9,118, 78, 97, 99, 99, 95,111,117,
+116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114, 97,100, 59, 10, 9,112,101,114,116,117,
+114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,118, 78, 97, 99, 99, 95,111,117,116,
+ 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,116,101, 95,116,101,120,110,111,114,109, 97,
108, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,
108, 41, 10,123, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, 45,110,111,114,109, 97,108, 46,120,
44, 32, 45,110,111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
diff --git a/source/blender/ikplugin/CMakeLists.txt b/source/blender/ikplugin/CMakeLists.txt
index 79f33effb87..47c773756a9 100644
--- a/source/blender/ikplugin/CMakeLists.txt
+++ b/source/blender/ikplugin/CMakeLists.txt
@@ -24,27 +24,32 @@
#
# ***** END GPL LICENSE BLOCK *****
-
-SET(SRC
- ./intern/ikplugin_api.c
- ./intern/iksolver_plugin.c
-)
-
-SET(INC
+set(INC
../blenlib
../makesdna
../blenkernel
- ../include
../ikplugin
../../../intern/guardedalloc
../../../intern/iksolver/extern
)
-IF(WITH_IK_ITASC)
- ADD_DEFINITIONS(-DWITH_IK_ITASC)
- LIST(APPEND INC ../../../extern/Eigen2)
- LIST(APPEND INC ../../../intern/itasc)
- LIST(APPEND SRC ./intern/itasc_plugin.cpp)
-ENDIF(WITH_IK_ITASC)
+set(SRC
+ intern/ikplugin_api.c
+ intern/iksolver_plugin.c
+
+ BIK_api.h
+ intern/ikplugin_api.h
+ intern/iksolver_plugin.h
+ intern/itasc_plugin.h
+)
+
+if(WITH_IK_ITASC)
+ add_definitions(-DWITH_IK_ITASC)
+ list(APPEND INC ../../../extern/Eigen2)
+ list(APPEND INC ../../../intern/itasc)
+ list(APPEND SRC
+ ./intern/itasc_plugin.cpp
+ )
+endif()
-BLENDERLIB(bf_ikplugin "${SRC}" "${INC}")
+blender_add_lib(bf_ikplugin "${SRC}" "${INC}")
diff --git a/source/blender/ikplugin/Makefile b/source/blender/ikplugin/Makefile
deleted file mode 100644
index 28726586cc8..00000000000
--- a/source/blender/ikplugin/Makefile
+++ /dev/null
@@ -1,31 +0,0 @@
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/ikplugin
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/ikplugin/intern/Makefile b/source/blender/ikplugin/intern/Makefile
deleted file mode 100644
index 12e2366b28e..00000000000
--- a/source/blender/ikplugin/intern/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = ikplugin
-DIR = $(OCGDIR)/blender/ikplugin
-
-include nan_compile.mk
-
-CFLAGS += -DWITH_IK_ITASC
-CPPFLAGS += -DWITH_IK_ITASC
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-CFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CFLAGS += -I../../makesdna
-CFLAGS += -I../../blenkernel
-CFLAGS += -I../../blenlib
-CFLAGS += -I../../include
-CFLAGS += -I../../../../intern/itasc
-CFLAGS += -I../../../../extern/Eigen2
-CFLAGS += -I..
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_IKSOLVER)/include
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../include
-CPPFLAGS += -I../../../../intern/itasc
-CPPFLAGS += -I../../../../extern/Eigen2
-CPPFLAGS += -I..
diff --git a/source/blender/ikplugin/intern/ikplugin_api.c b/source/blender/ikplugin/intern/ikplugin_api.c
index c3310e77ad6..1604f591bda 100644
--- a/source/blender/ikplugin/intern/ikplugin_api.c
+++ b/source/blender/ikplugin/intern/ikplugin_api.c
@@ -33,7 +33,7 @@
#include "BLI_math.h"
#include "BKE_armature.h"
-#include "BKE_utildefines.h"
+
#include "DNA_object_types.h"
#include "DNA_action_types.h"
#include "DNA_scene_types.h"
diff --git a/source/blender/ikplugin/intern/iksolver_plugin.c b/source/blender/ikplugin/intern/iksolver_plugin.c
index 9c0f151aa8b..11be240ab76 100644
--- a/source/blender/ikplugin/intern/iksolver_plugin.c
+++ b/source/blender/ikplugin/intern/iksolver_plugin.c
@@ -32,10 +32,11 @@
#include "BIK_api.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_armature.h"
#include "BKE_constraint.h"
-#include "BKE_utildefines.h"
+
#include "DNA_object_types.h"
#include "DNA_action_types.h"
#include "DNA_constraint_types.h"
@@ -50,7 +51,7 @@
/* allocates PoseTree, and links that to root bone/channel */
/* Note: detecting the IK chain is duplicate code... in drawarmature.c and in transform_conversions.c */
-static void initialize_posetree(struct Object *ob, bPoseChannel *pchan_tip)
+static void initialize_posetree(struct Object *UNUSED(ob), bPoseChannel *pchan_tip)
{
bPoseChannel *curchan, *pchan_root=NULL, *chanlist[256], **oldchan;
PoseTree *tree;
@@ -488,7 +489,7 @@ static void free_posetree(PoseTree *tree)
///----------------------------------------
/// Plugin API for legacy iksolver
-void iksolver_initialize_tree(struct Scene *scene, struct Object *ob, float ctime)
+void iksolver_initialize_tree(struct Scene *UNUSED(scene), struct Object *ob, float UNUSED(ctime))
{
bPoseChannel *pchan;
diff --git a/source/blender/ikplugin/intern/itasc_plugin.cpp b/source/blender/ikplugin/intern/itasc_plugin.cpp
index 7bdc327afa1..c3b2ad0804d 100644
--- a/source/blender/ikplugin/intern/itasc_plugin.cpp
+++ b/source/blender/ikplugin/intern/itasc_plugin.cpp
@@ -49,6 +49,7 @@ extern "C" {
#include "BIK_api.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_global.h"
#include "BKE_armature.h"
diff --git a/source/blender/imbuf/CMakeLists.txt b/source/blender/imbuf/CMakeLists.txt
index 699ed6e1b00..f007305e148 100644
--- a/source/blender/imbuf/CMakeLists.txt
+++ b/source/blender/imbuf/CMakeLists.txt
@@ -24,10 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-
-SET(INC
+set(INC
.
../avi
../blenlib
@@ -35,49 +32,112 @@ SET(INC
../makesdna
../../../intern/memutil
../../../intern/guardedalloc
- ${JPEG_INC}
- ${PNG_INC}
- ${ZLIB_INC}
+ ${JPEG_INCLUDE_DIR}
+ ${PNG_INCLUDE_DIR}
+ ${ZLIB_INCLUDE_DIRS}
+)
+
+set(SRC
+ intern/allocimbuf.c
+ intern/anim_movie.c
+ intern/bmp.c
+ intern/cache.c
+ intern/divers.c
+ intern/filetype.c
+ intern/filter.c
+ intern/imageprocess.c
+ intern/iris.c
+ intern/jp2.c
+ intern/jpeg.c
+ intern/md5.c
+ intern/metadata.c
+ intern/module.c
+ intern/png.c
+ intern/radiance_hdr.c
+ intern/readimage.c
+ intern/rectop.c
+ intern/rotate.c
+ intern/scaling.c
+ intern/targa.c
+ intern/thumbs.c
+ intern/thumbs_blend.c
+ intern/tiff.c
+ intern/util.c
+ intern/writeimage.c
+
+ IMB_imbuf.h
+ IMB_imbuf_types.h
+ IMB_thumbs.h
+ intern/IMB_allocimbuf.h
+ intern/IMB_anim.h
+ intern/IMB_filetype.h
+ intern/IMB_filter.h
+ intern/IMB_metadata.h
+ intern/cineon/cin_debug_stuff.h
+ intern/cineon/cineonfile.h
+ intern/cineon/cineonlib.h
+ intern/cineon/dpxfile.h
+ intern/cineon/dpxlib.h
+ intern/cineon/logImageCore.h
+ intern/cineon/logImageLib.h
+ intern/cineon/logmemfile.h
+ intern/dds/BlockDXT.h
+ intern/dds/Color.h
+ intern/dds/ColorBlock.h
+ intern/dds/Common.h
+ intern/dds/DirectDrawSurface.h
+ intern/dds/Image.h
+ intern/dds/PixelFormat.h
+ intern/dds/Stream.h
+ intern/dds/dds_api.h
+ intern/imbuf.h
+ intern/md5.h
+ intern/openexr/openexr_api.h
+ intern/openexr/openexr_multi.h
)
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_IMAGE_OPENEXR)
+ add_definitions(-DWITH_OPENEXR)
+endif()
-IF(WITH_IMAGE_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_IMAGE_OPENEXR)
+if(WITH_IMAGE_TIFF)
+ list(APPEND INC ${TIFF_INCLUDE_DIR})
+ add_definitions(-DWITH_TIFF)
+endif()
-IF(WITH_IMAGE_TIFF)
- SET(INC ${INC} ${TIFF_INCLUDE_DIR})
- ADD_DEFINITIONS(-DWITH_TIFF)
-ENDIF(WITH_IMAGE_TIFF)
+if(WITH_IMAGE_OPENJPEG)
+ list(APPEND INC ${OPENJPEG_INC})
+ add_definitions(-DWITH_OPENJPEG)
+endif()
-IF(WITH_IMAGE_OPENJPEG)
- SET(INC ${INC} ${OPENJPEG_INC})
- ADD_DEFINITIONS(-DWITH_OPENJPEG)
-ENDIF(WITH_IMAGE_OPENJPEG)
+if(WITH_IMAGE_REDCODE)
+ list(APPEND INC ${REDCODE_INC})
+ add_definitions(-DWITH_REDCODE)
+endif()
-IF(WITH_QUICKTIME)
- SET(INC ${INC} ../quicktime ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+if(WITH_CODEC_QUICKTIME)
+ list(APPEND INC
+ ../quicktime
+ ${QUICKTIME_INC}
+ )
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-IF(WITH_FFMPEG)
- SET(INC ${INC} ${FFMPEG_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
-ENDIF(WITH_FFMPEG)
+if(WITH_CODEC_FFMPEG)
+ list(APPEND INC ${FFMPEG_INC})
+ add_definitions(-DWITH_FFMPEG)
+endif()
-IF(WITH_IMAGE_DDS)
- ADD_DEFINITIONS(-DWITH_DDS)
-ENDIF(WITH_IMAGE_DDS)
+if(WITH_IMAGE_DDS)
+ add_definitions(-DWITH_DDS)
+endif()
-IF(WITH_IMAGE_CINEON)
- ADD_DEFINITIONS(-DWITH_CINEON)
-ENDIF(WITH_IMAGE_CINEON)
+if(WITH_IMAGE_CINEON)
+ add_definitions(-DWITH_CINEON)
+endif()
-IF(WITH_IMAGE_HDR)
- ADD_DEFINITIONS(-DWITH_HDR)
-ENDIF(WITH_IMAGE_HDR)
+if(WITH_IMAGE_HDR)
+ add_definitions(-DWITH_HDR)
+endif()
-BLENDERLIB(bf_imbuf "${SRC}" "${INC}")
+blender_add_lib(bf_imbuf "${SRC}" "${INC}")
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index c39c5d31f80..2accad35859 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -117,9 +117,8 @@ void IMB_freeImBuf(struct ImBuf *ibuf);
*
* @attention Defined in allocimbuf.c
*/
-struct ImBuf *IMB_allocImBuf(short x, short y,
- unsigned char d, unsigned int flags,
- unsigned char bitmap);
+struct ImBuf *IMB_allocImBuf(unsigned int x, unsigned int y,
+ unsigned char d, unsigned int flags);
/**
*
@@ -207,7 +206,7 @@ void IMB_close_anim(struct anim *anim);
* @attention Defined in anim.c
*/
-int ismovie(char *name);
+int ismovie(const char *name);
void IMB_anim_set_preseek(struct anim *anim, int preseek);
int IMB_anim_get_preseek(struct anim *anim);
@@ -245,6 +244,7 @@ void IMB_filter(struct ImBuf *ibuf);
void IMB_filterN(struct ImBuf *out, struct ImBuf *in);
void IMB_filter_extend(struct ImBuf *ibuf, char *mask);
void IMB_makemipmap(struct ImBuf *ibuf, int use_filter);
+void IMB_remakemipmap(struct ImBuf *ibuf, int use_filter);
struct ImBuf *IMB_getmipmap(struct ImBuf *ibuf, int level);
/**
@@ -272,19 +272,19 @@ struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1);
*
* @attention Defined in scaling.c
*/
-struct ImBuf *IMB_scaleImBuf(struct ImBuf *ibuf, short newx, short newy);
+struct ImBuf *IMB_scaleImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy);
/**
*
* @attention Defined in scaling.c
*/
-struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, short newx, short newy);
+struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy);
/**
*
* @attention Defined in writeimage.c
*/
-short IMB_saveiff(struct ImBuf *ibuf,char *naam,int flags);
+short IMB_saveiff(struct ImBuf *ibuf, const char *filepath, int flags);
/**
* Encodes a png image from an ImBuf
@@ -297,19 +297,19 @@ short IMB_png_encode(struct ImBuf *ibuf, int file, int flags);
*
* @attention Defined in util.c
*/
-int IMB_ispic(char *name);
+int IMB_ispic(const char *name);
/**
*
* @attention Defined in util.c
*/
-int IMB_isanim(char *name);
+int IMB_isanim(const char *name);
/**
*
* @attention Defined in util.c
*/
-int imb_get_anim_type(char *name);
+int imb_get_anim_type(const char *name);
/**
*
@@ -322,6 +322,7 @@ void IMB_float_from_rect(struct ImBuf *ibuf);
void IMB_float_from_rect_simple(struct ImBuf *ibuf); /* no profile conversion */
/* note, check that the conversion exists, only some are supported */
void IMB_convert_profile(struct ImBuf *ibuf, int profile);
+float *IMB_float_profile_ensure(struct ImBuf *ibuf, int profile, int *alloc);
/**
* Change the ordering of the color bytes pointed to by rect from
diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h
index 203a7268581..5629ead80db 100644
--- a/source/blender/imbuf/IMB_imbuf_types.h
+++ b/source/blender/imbuf/IMB_imbuf_types.h
@@ -71,7 +71,11 @@ typedef struct ImBuf {
struct ImBuf *next, *prev; /**< allow lists of ImBufs, for caches or flipbooks */
/* dimensions */
- short x, y; /* width and Height of our image buffer */
+ int x, y; /* width and Height of our image buffer.
+ * Should be 'unsigned int' since most formats use this.
+ * but this is problematic with texture math in imagetexture.c
+ * avoid problems and use int. - campbell */
+
unsigned char depth; /* Active amount of bits/bitplanes */
int channels; /* amount of channels in rect_float (0 = 4 channel default) */
@@ -127,17 +131,13 @@ typedef struct ImBuf {
/* Moved from BKE_bmfont_types.h because it is a userflag bit mask. */
/**
- * \brief Flags used internally by blender for imagebuffers
+ * \brief userflags: Flags used internally by blender for imagebuffers
*/
#define IB_BITMAPFONT (1 << 0) /* this image is a font */
#define IB_BITMAPDIRTY (1 << 1) /* image needs to be saved is not the same as filename */
-
-/* From iff.h. This was once moved away by Frank, now Nzc moves it
- * back. Such is the way it is... It is a long list of defines, and
- * there are a few external defines in the back. Most of the stuff is
- * probably imbuf_intern only. This will need to be merged later
- * on. */
+#define IB_MIPMAP_INVALID (1 << 2) /* image mipmaps are invalid, need recreate */
+#define IB_RECT_INVALID (1 << 3) /* float buffer changed, needs recreation of byte rect */
/**
* \name Imbuf Component flags
diff --git a/source/blender/imbuf/IMB_thumbs.h b/source/blender/imbuf/IMB_thumbs.h
index 9248b768cb6..02f8e1567bf 100644
--- a/source/blender/imbuf/IMB_thumbs.h
+++ b/source/blender/imbuf/IMB_thumbs.h
@@ -69,12 +69,15 @@ void IMB_thumb_delete(const char* path, ThumbSize size);
ImBuf* IMB_thumb_manage(const char* path, ThumbSize size, ThumbSource source);
/* create the necessary dirs to store the thumbnails */
-void IMB_thumb_makedirs();
+void IMB_thumb_makedirs(void);
/* special function for loading a thumbnail embedded into a blend file */
ImBuf *IMB_loadblend_thumb(const char *path);
void IMB_overlayblend_thumb(unsigned int *thumb, int width, int height, float aspect);
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
#endif /* _IMB_THUMBS_H */
diff --git a/source/blender/imbuf/Makefile b/source/blender/imbuf/Makefile
deleted file mode 100644
index 78eea89173f..00000000000
--- a/source/blender/imbuf/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/imbuf
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/imbuf/intern/IMB_allocimbuf.h b/source/blender/imbuf/intern/IMB_allocimbuf.h
index e6f3abc26b0..bfe53f30321 100644
--- a/source/blender/imbuf/intern/IMB_allocimbuf.h
+++ b/source/blender/imbuf/intern/IMB_allocimbuf.h
@@ -39,15 +39,11 @@
struct ImBuf;
-short imb_addrectImBuf(struct ImBuf * ibuf);
-short imb_addrectfloatImBuf(struct ImBuf * ibuf);
short imb_addplanesImBuf(struct ImBuf *ibuf);
short imb_addencodedbufferImBuf(struct ImBuf *ibuf);
short imb_enlargeencodedbufferImBuf(struct ImBuf *ibuf);
-void imb_freerectImBuf(struct ImBuf *ibuf);
-void imb_freerectfloatImBuf(struct ImBuf *ibuf);
void imb_freeplanesImBuf(struct ImBuf *ibuf);
short imb_addcmapImBuf(struct ImBuf *ibuf);
diff --git a/source/blender/imbuf/intern/IMB_anim.h b/source/blender/imbuf/intern/IMB_anim.h
index c9eac2c1399..6e7f3c34e0f 100644
--- a/source/blender/imbuf/intern/IMB_anim.h
+++ b/source/blender/imbuf/intern/IMB_anim.h
@@ -110,19 +110,14 @@
#define LITTLE_LONG ENDIAN_NOP
#endif
-/****/
-
-#define ANIM_NONE (0)
-#define ANIM_SEQUENCE (1 << 0)
-#define ANIM_DIR (1 << 1)
-#define ANIM_DEPRECATED (1 << 2)
-#define ANIM_TGA (1 << 3)
+/* anim.curtype, runtime only */
+#define ANIM_NONE 0
+#define ANIM_SEQUENCE (1 << 0)
#define ANIM_MOVIE (1 << 4)
-#define ANIM_MDEC (1 << 5)
#define ANIM_AVI (1 << 6)
#define ANIM_QTIME (1 << 7)
-#define ANIM_FFMPEG (1 << 8)
-#define ANIM_REDCODE (1 << 9)
+#define ANIM_FFMPEG (1 << 8)
+#define ANIM_REDCODE (1 << 9)
#define MAXNUMSTREAMS 50
diff --git a/source/blender/imbuf/intern/IMB_filetype.h b/source/blender/imbuf/intern/IMB_filetype.h
index 8529c72c7ae..f82f93c83a1 100644
--- a/source/blender/imbuf/intern/IMB_filetype.h
+++ b/source/blender/imbuf/intern/IMB_filetype.h
@@ -38,7 +38,7 @@ typedef struct ImFileType {
int (*is_a)(unsigned char *buf);
int (*ftype)(struct ImFileType *type, struct ImBuf *ibuf);
struct ImBuf *(*load)(unsigned char *mem, size_t size, int flags);
- int (*save)(struct ImBuf *ibuf, char *name, int flags);
+ int (*save)(struct ImBuf *ibuf, const char *name, int flags);
void (*load_tile)(struct ImBuf *ibuf, unsigned char *mem, size_t size, int tx, int ty, unsigned int *rect);
int flag;
@@ -61,52 +61,52 @@ void imb_tile_cache_tile_free(struct ImBuf *ibuf, int tx, int ty);
/* png */
int imb_is_a_png(unsigned char *buf);
struct ImBuf *imb_loadpng(unsigned char *mem, size_t size, int flags);
-int imb_savepng(struct ImBuf *ibuf, char *name, int flags);
+int imb_savepng(struct ImBuf *ibuf, const char *name, int flags);
/* targa */
int imb_is_a_targa(unsigned char *buf);
struct ImBuf *imb_loadtarga(unsigned char *mem, size_t size, int flags);
-int imb_savetarga(struct ImBuf * ibuf, char *name, int flags);
+int imb_savetarga(struct ImBuf * ibuf, const char *name, int flags);
/* iris */
int imb_is_a_iris(unsigned char *mem);
struct ImBuf *imb_loadiris(unsigned char *mem, size_t size, int flags);
-int imb_saveiris(struct ImBuf * ibuf, char *name, int flags);
+int imb_saveiris(struct ImBuf * ibuf, const char *name, int flags);
/* jp2 */
int imb_is_a_jp2(unsigned char *buf);
struct ImBuf *imb_jp2_decode(unsigned char *mem, size_t size, int flags);
-int imb_savejp2(struct ImBuf *ibuf, char *name, int flags);
+int imb_savejp2(struct ImBuf *ibuf, const char *name, int flags);
/* jpeg */
int imb_is_a_jpeg(unsigned char *mem);
-int imb_savejpeg(struct ImBuf * ibuf, char * name, int flags);
+int imb_savejpeg(struct ImBuf *ibuf, const char *name, int flags);
struct ImBuf * imb_ibJpegImageFromFilename (const char * filename, int flags);
struct ImBuf * imb_load_jpeg (unsigned char * buffer, size_t size, int flags);
/* bmp */
int imb_is_a_bmp(unsigned char *buf);
struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags);
-int imb_savebmp(struct ImBuf *ibuf, char *name, int flags);
+int imb_savebmp(struct ImBuf *ibuf, const char *name, int flags);
/* cocoa */
struct ImBuf *imb_cocoaLoadImage(unsigned char *mem, size_t size, int flags);
-short imb_cocoaSaveImage(struct ImBuf *ibuf, char *name, int flags);
+short imb_cocoaSaveImage(struct ImBuf *ibuf, const char *name, int flags);
/* cineon */
-int imb_savecineon(struct ImBuf *buf, char *myfil, int flags);
+int imb_savecineon(struct ImBuf *buf, const char *name, int flags);
struct ImBuf *imb_loadcineon(unsigned char *mem, size_t size, int flags);
int imb_is_cineon(unsigned char *buf);
/* dpx */
-int imb_save_dpx(struct ImBuf *buf, char *myfile, int flags);
+int imb_save_dpx(struct ImBuf *buf, const char *name, int flags);
struct ImBuf *imb_loaddpx(unsigned char *mem, size_t size, int flags);
int imb_is_dpx(unsigned char *buf);
/* hdr */
int imb_is_a_hdr(unsigned char *buf);
struct ImBuf *imb_loadhdr(unsigned char *mem, size_t size, int flags);
-int imb_savehdr(struct ImBuf * ibuf, char *name, int flags);
+int imb_savehdr(struct ImBuf * ibuf, const char *name, int flags);
/* tiff */
void imb_inittiff(void);
@@ -114,7 +114,7 @@ int imb_is_a_tiff(unsigned char *buf);
struct ImBuf *imb_loadtiff(unsigned char *mem, size_t size, int flags);
void imb_loadtiletiff(struct ImBuf *ibuf, unsigned char *mem, size_t size,
int tx, int ty, unsigned int *rect);
-int imb_savetiff(struct ImBuf *ibuf, char *name, int flags);
+int imb_savetiff(struct ImBuf *ibuf, const char *name, int flags);
void *libtiff_findsymbol(char *name);
#endif /* IMB_FILETYPE_H */
diff --git a/source/blender/imbuf/intern/IMB_filter.h b/source/blender/imbuf/intern/IMB_filter.h
index 84ad72c520a..0d414cb4702 100644
--- a/source/blender/imbuf/intern/IMB_filter.h
+++ b/source/blender/imbuf/intern/IMB_filter.h
@@ -44,5 +44,7 @@ void imb_filterx(struct ImBuf *ibuf);
void IMB_premultiply_rect(unsigned int *rect, int depth, int w, int h);
void IMB_premultiply_rect_float(float *rect_float, int depth, int w, int h);
+void imb_onehalf_no_alloc(struct ImBuf *ibuf2, struct ImBuf *ibuf1);
+
#endif
diff --git a/source/blender/imbuf/intern/Makefile b/source/blender/imbuf/intern/Makefile
deleted file mode 100644
index 8e7272100b9..00000000000
--- a/source/blender/imbuf/intern/Makefile
+++ /dev/null
@@ -1,100 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = imbuf
-DIR = $(OCGDIR)/blender/imbuf
-SOURCEDIR = source/blender/imbuf/intern
-
-include nan_subdirs.mk
-include nan_compile.mk
-include nan_definitions.mk
-
-DIRS =
-
-ifeq ($(WITH_CINEON), true)
- DIRS += cineon
- CPPFLAGS += -DWITH_CINEON
-endif
-
-ifeq ($(WITH_OPENEXR), true)
- DIRS += openexr
- CFLAGS += -DWITH_OPENEXR
-endif
-
-ifeq ($(WITH_DDS), true)
- DIRS += dds
- CPPFLAGS += -DWITH_DDS
-endif
-
-ifeq ($(WITH_OPENJPEG), true)
- ifndef BF_OPENJPEG_INC
- CFLAGS += -DWITH_OPENJPEG -I../../../../extern/libopenjpeg
- else
- CFLAGS += -DWITH_OPENJPEG -I$(BF_OPENJPEG_INC)
- endif
-endif
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_JPEG)/include
-CPPFLAGS += -I$(NAN_PNG)/include
-CPPFLAGS += -I$(NAN_ZLIB)/include
-CPPFLAGS += -I../../include
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../avi
-CPPFLAGS += -I../../quicktime
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_MEMUTIL)/include
-# This is not really needed, but until /include is cleaned, it must be
-# there for proper compilation.
-# - No, it is also needed in antialias, for listbase (nzc)
-CPPFLAGS += -I../../makesdna
-# external interface of this module
-CPPFLAGS += -I..
-
-ifeq ($(WITH_QUICKTIME), true)
- CPPFLAGS += -DWITH_QUICKTIME
-endif
-
-ifeq ($(WITH_FFMPEG), true)
- CPPFLAGS += -DWITH_FFMPEG
- CPPFLAGS += $(NAN_FFMPEGCFLAGS)
-endif
-
-ifeq ($(WITH_TIFF), true)
- CPPFLAGS += -DWITH_TIFF
- CPPFLAGS += -I$(NAN_TIFF)/include
-endif
-
-ifeq ($(WITH_HDR), true)
- CPPFLAGS += -DWITH_HDR
-endif
diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c
index 02fc98f2d63..32284472163 100644
--- a/source/blender/imbuf/intern/allocimbuf.c
+++ b/source/blender/imbuf/intern/allocimbuf.c
@@ -277,7 +277,8 @@ short imb_addrectfloatImBuf(ImBuf *ibuf)
if(ibuf==NULL) return FALSE;
- imb_freerectfloatImBuf(ibuf);
+ if(ibuf->rect_float)
+ imb_freerectfloatImBuf(ibuf); /* frees mipmap too, hrm */
size = ibuf->x *ibuf->y;
size = size *4 *sizeof(float);
@@ -298,8 +299,12 @@ short imb_addrectImBuf(ImBuf *ibuf)
int size;
if(ibuf==NULL) return FALSE;
- imb_freerectImBuf(ibuf);
-
+
+ /* don't call imb_freerectImBuf, it frees mipmaps, this call is used only too give float buffers display */
+ if(ibuf->rect && (ibuf->mall & IB_rect))
+ MEM_freeN(ibuf->rect);
+ ibuf->rect= NULL;
+
size = ibuf->x*ibuf->y;
size = size*sizeof(unsigned int);
@@ -324,7 +329,7 @@ short imb_addtilesImBuf(ImBuf *ibuf)
return (ibuf->tiles != NULL);
}
-ImBuf *IMB_allocImBuf(short x, short y, uchar d, unsigned int flags, uchar bitmap) /* XXX bitmap argument is deprecated */
+ImBuf *IMB_allocImBuf(unsigned int x, unsigned int y, uchar d, unsigned int flags)
{
ImBuf *ibuf;
@@ -384,7 +389,7 @@ ImBuf *IMB_dupImBuf(ImBuf *ibuf1)
y = ibuf1->y;
if(ibuf1->flags & IB_fields) y *= 2;
- ibuf2 = IMB_allocImBuf(x, y, ibuf1->depth, flags, 0);
+ ibuf2 = IMB_allocImBuf(x, y, ibuf1->depth, flags);
if(ibuf2 == NULL) return NULL;
if(flags & IB_rect)
@@ -443,7 +448,7 @@ static void imbuf_cache_destructor(void *data)
ibuf->c_handle = 0;
}
-static MEM_CacheLimiterC **get_imbuf_cache_limiter()
+static MEM_CacheLimiterC **get_imbuf_cache_limiter(void)
{
static MEM_CacheLimiterC *c = 0;
diff --git a/source/blender/imbuf/intern/anim.c b/source/blender/imbuf/intern/anim_movie.c
index 096ed499f85..344601d7346 100644
--- a/source/blender/imbuf/intern/anim.c
+++ b/source/blender/imbuf/intern/anim_movie.c
@@ -1,7 +1,7 @@
/**
* anim.c
*
- * $Id$
+ * $Id: anim_movie.c 34160 2011-01-07 19:18:31Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -60,9 +60,13 @@
#include "BLI_blenlib.h" /* BLI_remlink BLI_filesize BLI_addtail
BLI_countlist BLI_stringdec */
+#include "BLI_utildefines.h"
+
#include "MEM_guardedalloc.h"
#include "DNA_userdef_types.h"
+
+
#include "BKE_global.h"
#include "BKE_depsgraph.h"
@@ -163,7 +167,7 @@ static ImBuf * movie_fetchibuf(struct anim * anim, int position) {
if (anim == 0) return (0);
- ibuf = IMB_allocImBuf(anim->x, anim->y, 24, IB_rect, 0);
+ ibuf = IMB_allocImBuf(anim->x, anim->y, 24, IB_rect);
if ( mvReadFrames(anim->track, position, 1, ibuf->x * ibuf->y *
sizeof(int), ibuf->rect ) != DM_SUCCESS ) {
@@ -214,14 +218,14 @@ int ismovie(char *name) {
#else
-int ismovie(char *name) {
+int ismovie(const char *UNUSED(name)) {
return 0;
}
/* never called, just keep the linker happy */
-static int startmovie(struct anim * anim) { return 1; }
-static ImBuf * movie_fetchibuf(struct anim * anim, int position) { return NULL; }
-static void free_anim_movie(struct anim * anim) { ; }
+static int startmovie(struct anim *UNUSED(anim)) { return 1; }
+static ImBuf * movie_fetchibuf(struct anim *UNUSED(anim), int UNUSED(position)) { return NULL; }
+static void free_anim_movie(struct anim *UNUSED(anim)) { ; }
#endif
@@ -483,7 +487,7 @@ static ImBuf * avi_fetchibuf (struct anim *anim, int position) {
#else
if (1) {
#endif
- ibuf = IMB_allocImBuf (anim->x, anim->y, 24, IB_rect, 0);
+ ibuf = IMB_allocImBuf (anim->x, anim->y, 24, IB_rect);
tmp = AVI_read_frame (anim->avi, AVI_FORMAT_RGB32, position,
AVI_get_stream(anim->avi, AVIST_VIDEO, 0));
@@ -509,7 +513,7 @@ static ImBuf * avi_fetchibuf (struct anim *anim, int position) {
#ifdef WITH_FFMPEG
-extern void do_init_ffmpeg();
+extern void do_init_ffmpeg(void);
#ifdef FFMPEG_CODEC_IS_POINTER
static AVCodecContext* get_codec_from_stream(AVStream* stream)
@@ -809,7 +813,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
if (anim == 0) return (0);
- ibuf = IMB_allocImBuf(anim->x, anim->y, 32, IB_rect, 0);
+ ibuf = IMB_allocImBuf(anim->x, anim->y, 32, IB_rect);
avpicture_fill((AVPicture*) anim->pFrameRGB,
(unsigned char*) ibuf->rect,
@@ -838,7 +842,15 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
}
}
+/* disable seek_by_bytes for now, since bitrates are guessed wrong!
+ also: MPEG2TS-seeking was fixed in later versions of ffmpeg, so problem
+ is somewhat fixed by now (until we add correct timecode management code...)
+*/
+#if 0
seek_by_bytes = !!(anim->pFormatCtx->iformat->flags & AVFMT_TS_DISCONT);
+#else
+ seek_by_bytes = FALSE;
+#endif
if (position != anim->curposition + 1) {
#ifdef FFMPEG_OLD_FRAME_RATE
@@ -850,12 +862,9 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
av_q2d(anim->pFormatCtx->streams[anim->videoStream]
->r_frame_rate);
#endif
- double time_base =
- av_q2d(anim->pFormatCtx->streams[anim->videoStream]
- ->time_base);
+ double pts_time_base = av_q2d(anim->pFormatCtx->streams[anim->videoStream]->time_base);
long long pos;
- long long st_time = anim->pFormatCtx
- ->streams[anim->videoStream]->start_time;
+ long long st_time = anim->pFormatCtx->start_time;
int ret;
if (seek_by_bytes) {
@@ -875,7 +884,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
}
if (st_time != AV_NOPTS_VALUE) {
- pos += st_time * AV_TIME_BASE * time_base;
+ pos += st_time;
}
}
@@ -890,9 +899,9 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
}
pts_to_search = (long long)
- (((double) position) / time_base / frame_rate);
+ (((double) position) / pts_time_base / frame_rate);
if (st_time != AV_NOPTS_VALUE) {
- pts_to_search += st_time;
+ pts_to_search += st_time / pts_time_base/ AV_TIME_BASE;
}
pos_found = 0;
@@ -998,7 +1007,7 @@ static ImBuf * redcode_fetchibuf(struct anim * anim, int position) {
}
ibuf = IMB_allocImBuf(raw_frame->width * 2,
- raw_frame->height * 2, 32, IB_rectfloat, 0);
+ raw_frame->height * 2, 32, IB_rectfloat);
redcode_decode_video_float(raw_frame, ibuf->rect_float, 1);
@@ -1050,31 +1059,31 @@ static struct ImBuf * anim_getnew(struct anim * anim) {
break;
case ANIM_MOVIE:
if (startmovie(anim)) return (0);
- ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0, 0); /* fake */
+ ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0); /* fake */
break;
case ANIM_AVI:
if (startavi(anim)) {
printf("couldnt start avi\n");
return (0);
}
- ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0, 0);
+ ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0);
break;
#ifdef WITH_QUICKTIME
case ANIM_QTIME:
if (startquicktime(anim)) return (0);
- ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0, 0);
+ ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0);
break;
#endif
#ifdef WITH_FFMPEG
case ANIM_FFMPEG:
if (startffmpeg(anim)) return (0);
- ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0, 0);
+ ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0);
break;
#endif
#ifdef WITH_REDCODE
case ANIM_REDCODE:
if (startredcode(anim)) return (0);
- ibuf = IMB_allocImBuf (8, 8, 32, 0, 0);
+ ibuf = IMB_allocImBuf (8, 8, 32, 0);
break;
#endif
}
diff --git a/source/blender/imbuf/intern/bmp.c b/source/blender/imbuf/intern/bmp.c
index 450b09c923b..8aae41b653c 100644
--- a/source/blender/imbuf/intern/bmp.c
+++ b/source/blender/imbuf/intern/bmp.c
@@ -108,6 +108,8 @@ struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags)
int x, y, depth, skip, i;
unsigned char *bmp, *rect;
unsigned short col;
+
+ (void)size; /* unused */
if (checkbmp(mem) == 0) return(0);
@@ -129,9 +131,9 @@ struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags)
/* printf("skip: %d, x: %d y: %d, depth: %d (%x)\n", skip, x, y,
depth, bmi.biBitCount); */
if (flags & IB_test) {
- ibuf = IMB_allocImBuf(x, y, depth, 0, 0);
+ ibuf = IMB_allocImBuf(x, y, depth, 0);
} else {
- ibuf = IMB_allocImBuf(x, y, depth, IB_rect, 0);
+ ibuf = IMB_allocImBuf(x, y, depth, IB_rect);
bmp = mem + skip;
rect = (unsigned char *) ibuf->rect;
@@ -193,12 +195,14 @@ static int putShortLSB(unsigned short us,FILE *ofile) {
}
/* Found write info at http://users.ece.gatech.edu/~slabaugh/personal/c/bitmapUnix.c */
-int imb_savebmp(struct ImBuf *ibuf, char *name, int flags) {
+int imb_savebmp(struct ImBuf *ibuf, const char *name, int flags) {
BMPINFOHEADER infoheader;
int bytesize, extrabytes, x, y, t, ptr;
uchar *data;
FILE *ofile;
+
+ (void)flags; /* unused */
extrabytes = (4 - ibuf->x*3 % 4) % 4;
bytesize = (ibuf->x * 3 + extrabytes) * ibuf->y;
diff --git a/source/blender/imbuf/intern/cache.c b/source/blender/imbuf/intern/cache.c
index 77e01d8ebef..23f0dd87b1a 100644
--- a/source/blender/imbuf/intern/cache.c
+++ b/source/blender/imbuf/intern/cache.c
@@ -22,12 +22,13 @@
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_listbase.h"
#include "BLI_memarena.h"
#include "BLI_threads.h"
-#include "BKE_utildefines.h"
+
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -82,40 +83,42 @@ typedef struct ImGlobalTileCache {
int totthread;
ThreadMutex mutex;
+
+ int initialized;
} ImGlobalTileCache;
static ImGlobalTileCache GLOBAL_CACHE;
/***************************** Hash Functions ********************************/
-static unsigned int imb_global_tile_hash(void *gtile_p)
+static unsigned int imb_global_tile_hash(const void *gtile_p)
{
- ImGlobalTile *gtile= gtile_p;
+ const ImGlobalTile *gtile= gtile_p;
return ((unsigned int)(intptr_t)gtile->ibuf)*769 + gtile->tx*53 + gtile->ty*97;
}
-static int imb_global_tile_cmp(void *a_p, void *b_p)
+static int imb_global_tile_cmp(const void *a_p, const void *b_p)
{
- ImGlobalTile *a= a_p;
- ImGlobalTile *b= b_p;
+ const ImGlobalTile *a= a_p;
+ const ImGlobalTile *b= b_p;
if(a->ibuf == b->ibuf && a->tx == b->tx && a->ty == b->ty) return 0;
else if(a->ibuf < b->ibuf || a->tx < b->tx || a->ty < b->ty) return -1;
else return 1;
}
-static unsigned int imb_thread_tile_hash(void *ttile_p)
+static unsigned int imb_thread_tile_hash(const void *ttile_p)
{
- ImThreadTile *ttile= ttile_p;
+ const ImThreadTile *ttile= ttile_p;
return ((unsigned int)(intptr_t)ttile->ibuf)*769 + ttile->tx*53 + ttile->ty*97;
}
-static int imb_thread_tile_cmp(void *a_p, void *b_p)
+static int imb_thread_tile_cmp(const void *a_p, const void *b_p)
{
- ImThreadTile *a= a_p;
- ImThreadTile *b= b_p;
+ const ImThreadTile *a= a_p;
+ const ImThreadTile *b= b_p;
if(a->ibuf == b->ibuf && a->tx == b->tx && a->ty == b->ty) return 0;
else if(a->ibuf < b->ibuf || a->tx < b->tx || a->ty < b->ty) return -1;
@@ -203,6 +206,8 @@ void imb_tile_cache_init(void)
/* initialize for one thread, for places that access textures
outside of rendering (displace modifier, painting, ..) */
IMB_tile_cache_params(0, 0);
+
+ GLOBAL_CACHE.initialized = 1;
}
void imb_tile_cache_exit(void)
@@ -210,19 +215,23 @@ void imb_tile_cache_exit(void)
ImGlobalTile *gtile;
int a;
- for(gtile=GLOBAL_CACHE.tiles.first; gtile; gtile=gtile->next)
- imb_global_cache_tile_unload(gtile);
+ if(GLOBAL_CACHE.initialized) {
+ for(gtile=GLOBAL_CACHE.tiles.first; gtile; gtile=gtile->next)
+ imb_global_cache_tile_unload(gtile);
+
+ for(a=0; a<GLOBAL_CACHE.totthread; a++)
+ imb_thread_cache_exit(&GLOBAL_CACHE.thread_cache[a]);
- for(a=0; a<GLOBAL_CACHE.totthread; a++)
- imb_thread_cache_exit(&GLOBAL_CACHE.thread_cache[a]);
+ if(GLOBAL_CACHE.memarena)
+ BLI_memarena_free(GLOBAL_CACHE.memarena);
- if(GLOBAL_CACHE.memarena)
- BLI_memarena_free(GLOBAL_CACHE.memarena);
+ if(GLOBAL_CACHE.tilehash)
+ BLI_ghash_free(GLOBAL_CACHE.tilehash, NULL, NULL);
- if(GLOBAL_CACHE.tilehash)
- BLI_ghash_free(GLOBAL_CACHE.tilehash, NULL, NULL);
+ BLI_mutex_end(&GLOBAL_CACHE.mutex);
- BLI_mutex_end(&GLOBAL_CACHE.mutex);
+ memset(&GLOBAL_CACHE, 0, sizeof(ImGlobalTileCache));
+ }
}
/* presumed to be called when no threads are running */
diff --git a/source/blender/imbuf/intern/cineon/CMakeLists.txt b/source/blender/imbuf/intern/cineon/CMakeLists.txt
index 5633d2a66f6..f01de6b2620 100644
--- a/source/blender/imbuf/intern/cineon/CMakeLists.txt
+++ b/source/blender/imbuf/intern/cineon/CMakeLists.txt
@@ -24,17 +24,23 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
.
..
- ../../
- intern/include
+ ../..
../../../blenkernel
../../../blenlib
../../../makesdna
../../../../../intern/guardedalloc
)
-BLENDERLIB(bf_cineon "${SRC}" "${INC}")
+set(SRC
+ cineon_dpx.c
+ cineonlib.c
+ dpxlib.c
+ logImageCore.c
+ logImageLib.c
+ logmemfile.c
+)
+
+blender_add_lib(bf_imbuf_cineon "${SRC}" "${INC}")
diff --git a/source/blender/imbuf/intern/cineon/Makefile b/source/blender/imbuf/intern/cineon/Makefile
deleted file mode 100644
index 6e940d530a9..00000000000
--- a/source/blender/imbuf/intern/cineon/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = cineon
-DIR = $(OCGDIR)/blender/imbuf/cineon
-SOURCEDIR = source/blender/imbuf/intern/cineon
-
-include nan_compile.mk
-include nan_definitions.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_JPEG)/include
-CPPFLAGS += -I$(NAN_PNG)/include
-CPPFLAGS += -I$(NAN_ZLIB)/include
-CPPFLAGS += -I$(NAN_TIFF)/include
-CPPFLAGS += -I../../../include
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../avi
-CPPFLAGS += -I../../../quicktime
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_MEMUTIL)/include
-# This is not really needed, but until /include is cleaned, it must be
-# there for proper compilation.
-# - No, it is also needed in antialias, for listbase (nzc)
-CPPFLAGS += -I../../../makesdna
-# external interface of this module
-CPPFLAGS += -I../..
diff --git a/source/blender/imbuf/intern/cineon/SConscript b/source/blender/imbuf/intern/cineon/SConscript
index d9c8ab14d35..25088c6e34a 100644
--- a/source/blender/imbuf/intern/cineon/SConscript
+++ b/source/blender/imbuf/intern/cineon/SConscript
@@ -14,4 +14,4 @@ incs = ['.',
defs = []
-env.BlenderLib ('bf_cineon', source_files, incs, defs, libtype=['core','player'], priority = [220,175])
+env.BlenderLib ('bf_imbuf_cineon', source_files, incs, defs, libtype=['core','player'], priority = [220,175])
diff --git a/source/blender/imbuf/intern/cineon/cineon_dpx.c b/source/blender/imbuf/intern/cineon/cineon_dpx.c
index a9b229536cb..0551922b19a 100644
--- a/source/blender/imbuf/intern/cineon/cineon_dpx.c
+++ b/source/blender/imbuf/intern/cineon/cineon_dpx.c
@@ -44,6 +44,7 @@
#include "MEM_guardedalloc.h"
+#if 0
static void cineon_conversion_parameters(LogImageByteConversionParameters *params)
{
// params->blackPoint = scene?scene->r.cineonblack:95;
@@ -55,8 +56,8 @@ static void cineon_conversion_parameters(LogImageByteConversionParameters *param
params->whitePoint = 685;
params->gamma = 1.0f;
params->doLogarithm = 0;
-
}
+#endif
static struct ImBuf *imb_load_dpx_cineon(unsigned char *mem, int use_cineon, int size, int flags)
{
@@ -88,7 +89,7 @@ static struct ImBuf *imb_load_dpx_cineon(unsigned char *mem, int use_cineon, int
return NULL;
}
- ibuf = IMB_allocImBuf(width, height, 32, IB_rectfloat | flags, 0);
+ ibuf = IMB_allocImBuf(width, height, 32, IB_rectfloat | flags);
row = MEM_mallocN(sizeof(unsigned short)*width*depth, "row in cineon_dpx.c");
frow = ibuf->rect_float+width*height*4;
@@ -116,32 +117,32 @@ static struct ImBuf *imb_load_dpx_cineon(unsigned char *mem, int use_cineon, int
return ibuf;
}
-static int imb_save_dpx_cineon(ImBuf *buf, char *filename, int use_cineon, int flags)
+static int imb_save_dpx_cineon(ImBuf *ibuf, const char *filename, int use_cineon, int flags)
{
LogImageByteConversionParameters conversion;
- int width, height, depth;
+ const int width= ibuf->x;
+ const int height= ibuf->y;
+ const int depth= 3;
LogImageFile* logImage;
unsigned short* line, *pixel;
int i, j;
- int index;
float *fline;
+ float *fbuf;
+ int is_alloc= 0;
+
+ (void)flags; /* unused */
- cineon_conversion_parameters(&conversion);
+ // cineon_conversion_parameters(&conversion);
+ logImageGetByteConversionDefaults(&conversion);
/*
* Get the drawable for the current image...
*/
- width = buf->x;
- height = buf->y;
- depth = 3;
-
-
- if (!buf->rect_float) {
- IMB_float_from_rect(buf);
- if (!buf->rect_float) { /* in the unlikely event that converting to a float buffer fails */
- return 0;
- }
+ fbuf= IMB_float_profile_ensure(ibuf, conversion.doLogarithm ? IB_PROFILE_LINEAR_RGB : IB_PROFILE_NONE, &is_alloc);
+
+ if (fbuf == NULL) { /* in the unlikely event that converting to a float buffer fails */
+ return 0;
}
logImageSetVerbose((G.f & G_DEBUG) ? 1:0);
@@ -149,14 +150,15 @@ static int imb_save_dpx_cineon(ImBuf *buf, char *filename, int use_cineon, int f
if (!logImage) return 0;
- logImageSetByteConversion(logImage, &conversion);
+ if(logImageSetByteConversion(logImage, &conversion)==0) {
+ printf("error setting args\n");
+ }
- index = 0;
line = MEM_mallocN(sizeof(unsigned short)*depth*width, "line");
/*note that image is flipped when sent to logImageSetRowBytes (see last passed parameter).*/
for (j = 0; j < height; ++j) {
- fline = &buf->rect_float[width*j*4];
+ fline = &fbuf[width*j*4];
for (i=0; i<width; i++) {
float *fpix, fpix2[3];
/*we have to convert to cinepaint's 16-bit-per-channel here*/
@@ -177,10 +179,15 @@ static int imb_save_dpx_cineon(ImBuf *buf, char *filename, int use_cineon, int f
logImageClose(logImage);
MEM_freeN(line);
+
+ if(is_alloc) {
+ MEM_freeN(fbuf);
+ }
+
return 1;
}
-short imb_savecineon(struct ImBuf *buf, char *myfile, int flags)
+short imb_savecineon(struct ImBuf *buf, const char *myfile, int flags)
{
return imb_save_dpx_cineon(buf, myfile, 1, flags);
}
@@ -198,7 +205,7 @@ ImBuf *imb_loadcineon(unsigned char *mem, int size, int flags)
return NULL;
}
-short imb_save_dpx(struct ImBuf *buf, char *myfile, int flags)
+short imb_save_dpx(struct ImBuf *buf, const char *myfile, int flags)
{
return imb_save_dpx_cineon(buf, myfile, 0, flags);
}
diff --git a/source/blender/imbuf/intern/cineon/cineonlib.c b/source/blender/imbuf/intern/cineon/cineonlib.c
index 9c9156a4dd9..a2a0fae526d 100644
--- a/source/blender/imbuf/intern/cineon/cineonlib.c
+++ b/source/blender/imbuf/intern/cineon/cineonlib.c
@@ -185,6 +185,8 @@ dumpCineonImageInfo(CineonImageInformation* imageInfo) {
static void
fillCineonFormatInfo(CineonFile* cineon, CineonFormatInformation* formatInfo) {
+ (void)cineon; /* unused */
+
formatInfo->interleave = 0;
formatInfo->packing = 5;
formatInfo->signage = 0;
@@ -238,6 +240,8 @@ dumpCineonFormatInfo(CineonFormatInformation* formatInfo) {
static void
fillCineonOriginationInfo(CineonFile* cineon,
CineonOriginationInformation* originInfo, CineonFileInformation* fileInfo) {
+
+ (void)cineon; /* unused */
originInfo->x_offset = htonl(0);
originInfo->y_offset = htonl(0);
diff --git a/source/blender/imbuf/intern/cineon/dpxlib.c b/source/blender/imbuf/intern/cineon/dpxlib.c
index 365d56939ed..ade69b4d7c0 100644
--- a/source/blender/imbuf/intern/cineon/dpxlib.c
+++ b/source/blender/imbuf/intern/cineon/dpxlib.c
@@ -39,6 +39,8 @@
static void
fillDpxChannelInfo(DpxFile* dpx, DpxChannelInformation* chan, int des) {
+ (void)dpx; /* unused */
+
chan->signage = 0;
chan->ref_low_data = htonl(0);
chan->ref_low_quantity = htonf(0.0);
@@ -160,7 +162,12 @@ dumpDpxImageInfo(DpxImageInformation* imageInfo) {
static void
fillDpxOriginationInfo(
- DpxFile* dpx, DpxOriginationInformation* originInfo, DpxFileInformation* fileInfo) {
+ DpxFile* dpx, DpxOriginationInformation* originInfo, DpxFileInformation* fileInfo)
+{
+ /* unused */
+ (void)dpx;
+ (void)originInfo;
+ (void)fileInfo;
}
static void
diff --git a/source/blender/imbuf/intern/cineon/logImageCore.c b/source/blender/imbuf/intern/cineon/logImageCore.c
index 424fbcfc503..a340a81d2eb 100644
--- a/source/blender/imbuf/intern/cineon/logImageCore.c
+++ b/source/blender/imbuf/intern/cineon/logImageCore.c
@@ -154,7 +154,7 @@ ntohf(R32 f) {
#define UNDEF_FLOAT 0x7F800000
R32
-undefined() {
+undefined(void) {
Hack hack;
hack.i = UNDEF_FLOAT;
return hack.f;
diff --git a/source/blender/imbuf/intern/cineon/logImageCore.h b/source/blender/imbuf/intern/cineon/logImageCore.h
index 798dfebf059..0ff8e086622 100644
--- a/source/blender/imbuf/intern/cineon/logImageCore.h
+++ b/source/blender/imbuf/intern/cineon/logImageCore.h
@@ -103,7 +103,7 @@ typedef char ASCII;
R32 htonf(R32 f);
R32 ntohf(R32 f);
-R32 undefined();
+R32 undefined(void);
U16 reverseU16(U16 value);
U32 reverseU32(U32 value);
R32 reverseR32(R32 value);
diff --git a/source/blender/imbuf/intern/dds/CMakeLists.txt b/source/blender/imbuf/intern/dds/CMakeLists.txt
index 620d4041703..7564287ce4a 100644
--- a/source/blender/imbuf/intern/dds/CMakeLists.txt
+++ b/source/blender/imbuf/intern/dds/CMakeLists.txt
@@ -24,21 +24,28 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE (GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
..
+ ../..
./intern/include
- ../../
../../../blenlib
../../../blenkernel
../../../makesdna
../../../../../intern/guardedalloc
)
+set(SRC
+ BlockDXT.cpp
+ ColorBlock.cpp
+ DirectDrawSurface.cpp
+ Image.cpp
+ Stream.cpp
+ dds_api.cpp
+)
+
if(WITH_IMAGE_DDS)
- ADD_DEFINITIONS(-DWITH_DDS)
-ENDIF(WITH_IMAGE_DDS)
+ add_definitions(-DWITH_DDS)
+endif()
-BLENDERLIB(bf_dds "${SRC}" "${INC}")
+blender_add_lib(bf_imbuf_dds "${SRC}" "${INC}")
diff --git a/source/blender/imbuf/intern/dds/Makefile b/source/blender/imbuf/intern/dds/Makefile
deleted file mode 100644
index d4f04382899..00000000000
--- a/source/blender/imbuf/intern/dds/Makefile
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = dds
-DIR = $(OCGDIR)/blender/imbuf/dds
-SOURCEDIR = source/blender/imbuf/intern/dds
-
-include nan_compile.mk
-include nan_definitions.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_JPEG)/include
-CPPFLAGS += -I$(NAN_PNG)/include
-CPPFLAGS += -I$(NAN_ZLIB)/include
-CPPFLAGS += -I$(NAN_TIFF)/include
-CPPFLAGS += -I../../../include
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../avi
-CPPFLAGS += -I../../../quicktime
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_MEMUTIL)/include
-# This is not really needed, but until /include is cleaned, it must be
-# there for proper compilation.
-# - No, it is also needed in antialias, for listbase (nzc)
-CPPFLAGS += -I../../../makesdna
-# external interface of this module
-CPPFLAGS += -I../..
-CPPFLAGS += -I..
-CPPFLAGS += -I.
-CPPFLAGS += -DWITH_DDS
diff --git a/source/blender/imbuf/intern/dds/SConscript b/source/blender/imbuf/intern/dds/SConscript
index 59509c88f03..918ae7b530b 100644
--- a/source/blender/imbuf/intern/dds/SConscript
+++ b/source/blender/imbuf/intern/dds/SConscript
@@ -16,4 +16,4 @@ incs = ['.',
defs = ['WITH_DDS']
-env.BlenderLib ('bf_dds', source_files, incs, defs, libtype=['core','player'], priority = [230,190])
+env.BlenderLib ('bf_imbuf_dds', source_files, incs, defs, libtype=['core','player'], priority = [230,190])
diff --git a/source/blender/imbuf/intern/dds/dds_api.cpp b/source/blender/imbuf/intern/dds/dds_api.cpp
index 2e224893271..94ff8fd5d78 100644
--- a/source/blender/imbuf/intern/dds/dds_api.cpp
+++ b/source/blender/imbuf/intern/dds/dds_api.cpp
@@ -37,7 +37,7 @@ extern "C" {
#include "IMB_allocimbuf.h"
-int imb_save_dds(struct ImBuf * ibuf, char *name, int flags)
+int imb_save_dds(struct ImBuf * ibuf, const char *name, int flags)
{
return(0); /* todo: finish this function */
@@ -104,7 +104,7 @@ struct ImBuf *imb_load_dds(unsigned char *mem, size_t size, int flags)
// TODO use the image RGB or RGBA tag to determine the bits per pixel
if (dds.hasAlpha()) bits_per_pixel = 32;
else bits_per_pixel = 24;
- ibuf = IMB_allocImBuf(dds.width(), dds.height(), bits_per_pixel, 0, 0);
+ ibuf = IMB_allocImBuf(dds.width(), dds.height(), bits_per_pixel, 0);
if (ibuf == 0) return(0); /* memory allocation failed */
ibuf->ftype = DDS;
diff --git a/source/blender/imbuf/intern/dds/dds_api.h b/source/blender/imbuf/intern/dds/dds_api.h
index 384570ceb72..6aea3058863 100644
--- a/source/blender/imbuf/intern/dds/dds_api.h
+++ b/source/blender/imbuf/intern/dds/dds_api.h
@@ -29,7 +29,7 @@
extern "C" {
#endif
-int imb_save_dds(struct ImBuf *ibuf, char *name, int flags);
+int imb_save_dds(struct ImBuf *ibuf, const char *name, int flags);
int imb_is_a_dds(unsigned char *mem); /* use only first 32 bytes of mem */
struct ImBuf *imb_load_dds(unsigned char *mem, size_t size, int flags);
diff --git a/source/blender/imbuf/intern/divers.c b/source/blender/imbuf/intern/divers.c
index 7b3a07f10ad..9605185e897 100644
--- a/source/blender/imbuf/intern/divers.c
+++ b/source/blender/imbuf/intern/divers.c
@@ -32,14 +32,17 @@
#include "BLI_blenlib.h"
#include "BLI_rand.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "imbuf.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
#include "IMB_allocimbuf.h"
-#include "BKE_utildefines.h"
+
#include "BKE_colortools.h"
+#include "MEM_guardedalloc.h"
+
void IMB_de_interlace(struct ImBuf *ibuf)
{
struct ImBuf * tbuf1, * tbuf2;
@@ -50,8 +53,8 @@ void IMB_de_interlace(struct ImBuf *ibuf)
if (ibuf->rect) {
/* make copies */
- tbuf1 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0);
- tbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0);
+ tbuf1 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect);
+ tbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect);
ibuf->x *= 2;
IMB_rectcpy(tbuf1, ibuf, 0, 0, 0, 0, ibuf->x, ibuf->y);
@@ -78,8 +81,8 @@ void IMB_interlace(struct ImBuf *ibuf)
if (ibuf->rect) {
/* make copies */
- tbuf1 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0);
- tbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0);
+ tbuf1 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect);
+ tbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect);
IMB_rectcpy(tbuf1, ibuf, 0, 0, 0, 0, ibuf->x, ibuf->y);
IMB_rectcpy(tbuf2, ibuf, 0, 0, 0, tbuf2->y, ibuf->x, ibuf->y);
@@ -163,7 +166,13 @@ void IMB_rect_from_float(struct ImBuf *ibuf)
if (dither != 0.f) {
for (i = ibuf->x * ibuf->y; i > 0; i--, to+=4, tof+=4) {
const float d = (BLI_frand()-0.5)*dither;
- const float col[4] = {d+tof[0], d+tof[1], d+tof[2], d+tof[3]};
+ float col[4];
+
+ col[0]= d + tof[0];
+ col[1]= d + tof[1];
+ col[2]= d + tof[2];
+ col[3]= d + tof[3];
+
to[0] = FTOCHAR(col[0]);
to[1] = FTOCHAR(col[1]);
to[2] = FTOCHAR(col[2]);
@@ -179,19 +188,51 @@ void IMB_rect_from_float(struct ImBuf *ibuf)
}
}
}
+ /* ensure user flag is reset */
+ ibuf->userflags &= ~IB_RECT_INVALID;
}
-void IMB_float_from_rect(struct ImBuf *ibuf)
+static void imb_float_from_rect_nonlinear(struct ImBuf *ibuf, float *fbuf)
{
- /* quick method to convert byte to floatbuf */
- float *tof = ibuf->rect_float;
+ float *tof = fbuf;
int i;
unsigned char *to = (unsigned char *) ibuf->rect;
-
- if(to==NULL) return;
- if(tof==NULL) {
+
+ for (i = ibuf->x * ibuf->y; i > 0; i--)
+ {
+ tof[0] = ((float)to[0])*(1.0f/255.0f);
+ tof[1] = ((float)to[1])*(1.0f/255.0f);
+ tof[2] = ((float)to[2])*(1.0f/255.0f);
+ tof[3] = ((float)to[3])*(1.0f/255.0f);
+ to += 4;
+ tof += 4;
+ }
+}
+
+
+static void imb_float_from_rect_linear(struct ImBuf *ibuf, float *fbuf)
+{
+ float *tof = fbuf;
+ int i;
+ unsigned char *to = (unsigned char *) ibuf->rect;
+
+ for (i = ibuf->x * ibuf->y; i > 0; i--)
+ {
+ tof[0] = srgb_to_linearrgb(((float)to[0])*(1.0f/255.0f));
+ tof[1] = srgb_to_linearrgb(((float)to[1])*(1.0f/255.0f));
+ tof[2] = srgb_to_linearrgb(((float)to[2])*(1.0f/255.0f));
+ tof[3] = ((float)to[3])*(1.0f/255.0f);
+ to += 4;
+ tof += 4;
+ }
+}
+
+void IMB_float_from_rect(struct ImBuf *ibuf)
+{
+ /* quick method to convert byte to floatbuf */
+ if(ibuf->rect==NULL) return;
+ if(ibuf->rect_float==NULL) {
if (imb_addrectfloatImBuf(ibuf) == 0) return;
- tof = ibuf->rect_float;
}
/* Float bufs should be stored linear */
@@ -199,41 +240,18 @@ void IMB_float_from_rect(struct ImBuf *ibuf)
if (ibuf->profile != IB_PROFILE_NONE) {
/* if the image has been given a profile then we're working
* with color management in mind, so convert it to linear space */
-
- for (i = ibuf->x * ibuf->y; i > 0; i--)
- {
- tof[0] = srgb_to_linearrgb(((float)to[0])*(1.0f/255.0f));
- tof[1] = srgb_to_linearrgb(((float)to[1])*(1.0f/255.0f));
- tof[2] = srgb_to_linearrgb(((float)to[2])*(1.0f/255.0f));
- tof[3] = ((float)to[3])*(1.0f/255.0f);
- to += 4;
- tof += 4;
- }
+ imb_float_from_rect_linear(ibuf, ibuf->rect_float);
} else {
- for (i = ibuf->x * ibuf->y; i > 0; i--)
- {
- tof[0] = ((float)to[0])*(1.0f/255.0f);
- tof[1] = ((float)to[1])*(1.0f/255.0f);
- tof[2] = ((float)to[2])*(1.0f/255.0f);
- tof[3] = ((float)to[3])*(1.0f/255.0f);
- to += 4;
- tof += 4;
- }
+ imb_float_from_rect_nonlinear(ibuf, ibuf->rect_float);
}
}
/* no profile conversion */
void IMB_float_from_rect_simple(struct ImBuf *ibuf)
{
- int profile = IB_PROFILE_NONE;
-
- /* no color management:
- * don't disturb the existing profiles */
- SWAP(int, ibuf->profile, profile);
-
- IMB_float_from_rect(ibuf);
-
- SWAP(int, ibuf->profile, profile);
+ if(ibuf->rect_float==NULL)
+ imb_addrectfloatImBuf(ibuf);
+ imb_float_from_rect_nonlinear(ibuf, ibuf->rect_float);
}
void IMB_convert_profile(struct ImBuf *ibuf, int profile)
@@ -258,9 +276,9 @@ void IMB_convert_profile(struct ImBuf *ibuf, int profile)
}
if(ibuf->rect) {
for (i = ibuf->x * ibuf->y; i > 0; i--, rct+=4) {
- rctf[0]= (unsigned char)((srgb_to_linearrgb((float)rctf[0]/255.0f) * 255.0f) + 0.5f);
- rctf[1]= (unsigned char)((srgb_to_linearrgb((float)rctf[1]/255.0f) * 255.0f) + 0.5f);
- rctf[2]= (unsigned char)((srgb_to_linearrgb((float)rctf[2]/255.0f) * 255.0f) + 0.5f);
+ rct[0]= (unsigned char)((srgb_to_linearrgb((float)rct[0]/255.0f) * 255.0f) + 0.5f);
+ rct[1]= (unsigned char)((srgb_to_linearrgb((float)rct[1]/255.0f) * 255.0f) + 0.5f);
+ rct[2]= (unsigned char)((srgb_to_linearrgb((float)rct[2]/255.0f) * 255.0f) + 0.5f);
}
}
ok= TRUE;
@@ -277,9 +295,9 @@ void IMB_convert_profile(struct ImBuf *ibuf, int profile)
}
if(ibuf->rect) {
for (i = ibuf->x * ibuf->y; i > 0; i--, rct+=4) {
- rctf[0]= (unsigned char)((linearrgb_to_srgb((float)rctf[0]/255.0f) * 255.0f) + 0.5f);
- rctf[1]= (unsigned char)((linearrgb_to_srgb((float)rctf[1]/255.0f) * 255.0f) + 0.5f);
- rctf[2]= (unsigned char)((linearrgb_to_srgb((float)rctf[2]/255.0f) * 255.0f) + 0.5f);
+ rct[0]= (unsigned char)((linearrgb_to_srgb((float)rct[0]/255.0f) * 255.0f) + 0.5f);
+ rct[1]= (unsigned char)((linearrgb_to_srgb((float)rct[1]/255.0f) * 255.0f) + 0.5f);
+ rct[2]= (unsigned char)((linearrgb_to_srgb((float)rct[2]/255.0f) * 255.0f) + 0.5f);
}
}
ok= TRUE;
@@ -293,3 +311,48 @@ void IMB_convert_profile(struct ImBuf *ibuf, int profile)
ibuf->profile= profile;
}
+
+/* use when you need to get a buffer with a certain profile
+ * if the return */
+float *IMB_float_profile_ensure(struct ImBuf *ibuf, int profile, int *alloc)
+{
+ /* stupid but it works like this everywhere now */
+ const short is_lin_from= (ibuf->profile != IB_PROFILE_NONE);
+ const short is_lin_to= (profile != IB_PROFILE_NONE);
+
+
+ if(is_lin_from == is_lin_to) {
+ *alloc= 0;
+
+ /* simple case, just allocate the buffer and return */
+ if(ibuf->rect_float == NULL) {
+ IMB_float_from_rect(ibuf);
+ }
+
+ return ibuf->rect_float;
+ }
+ else {
+ /* conversion is needed, first check */
+ float *fbuf= MEM_mallocN(ibuf->x * ibuf->y * sizeof(float) * 4, "IMB_float_profile_ensure");
+ *alloc= 1;
+
+ if(ibuf->rect_float == NULL) {
+ if(is_lin_to) {
+ imb_float_from_rect_linear(ibuf, fbuf);
+ }
+ else {
+ imb_float_from_rect_nonlinear(ibuf, fbuf);
+ }
+ }
+ else {
+ if(is_lin_to) { /* lin -> nonlin */
+ linearrgb_to_srgb_rgba_rgba_buf(fbuf, ibuf->rect_float, ibuf->x * ibuf->y);
+ }
+ else { /* nonlin -> lin */
+ srgb_to_linearrgb_rgba_rgba_buf(fbuf, ibuf->rect_float, ibuf->x * ibuf->y);
+ }
+ }
+
+ return fbuf;
+ }
+}
diff --git a/source/blender/imbuf/intern/filetype.c b/source/blender/imbuf/intern/filetype.c
index fb5d2f2e4d7..0702fbe3907 100644
--- a/source/blender/imbuf/intern/filetype.c
+++ b/source/blender/imbuf/intern/filetype.c
@@ -45,7 +45,7 @@ static int imb_ftype_default(ImFileType *type, ImBuf *ibuf) { return (ibuf->ftyp
#if defined(__APPLE__) && defined(IMBUF_COCOA)
static int imb_ftype_cocoa(ImFileType *type, ImBuf *ibuf) { return (ibuf->ftype & TIF); }
#endif
-static int imb_ftype_iris(ImFileType *type, ImBuf *ibuf) { return (ibuf->ftype == IMAGIC); }
+static int imb_ftype_iris(ImFileType *type, ImBuf *ibuf) { (void)type; return (ibuf->ftype == IMAGIC); }
#ifdef WITH_QUICKTIME
static int imb_ftype_quicktime(ImFileType *type, ImBuf *ibuf) { return 0; } // XXX
#endif
diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c
index 3cc266e460e..42f87049c2a 100644
--- a/source/blender/imbuf/intern/filter.c
+++ b/source/blender/imbuf/intern/filter.c
@@ -29,9 +29,12 @@
* $Id$
*/
-#include "BKE_utildefines.h"
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
+
+
+
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
#include "IMB_filter.h"
@@ -371,16 +374,53 @@ void IMB_filter_extend(struct ImBuf *ibuf, char *mask)
}
}
+/* threadsafe version, only recreates existing maps */
+void IMB_remakemipmap(ImBuf *ibuf, int use_filter)
+{
+ ImBuf *hbuf = ibuf;
+ int curmap = 0;
+
+ ibuf->miptot= 1;
+
+ while(curmap < IB_MIPMAP_LEVELS) {
+
+ if(ibuf->mipmap[curmap]) {
+
+ if(use_filter) {
+ ImBuf *nbuf= IMB_allocImBuf(hbuf->x, hbuf->y, 32, IB_rect);
+ IMB_filterN(nbuf, hbuf);
+ imb_onehalf_no_alloc(ibuf->mipmap[curmap], nbuf);
+ IMB_freeImBuf(nbuf);
+ }
+ else
+ imb_onehalf_no_alloc(ibuf->mipmap[curmap], hbuf);
+ }
+
+ ibuf->miptot= curmap+2;
+ hbuf= ibuf->mipmap[curmap];
+ if(hbuf)
+ hbuf->miplevel= curmap+1;
+
+ if(!hbuf || (hbuf->x <= 2 && hbuf->y <= 2))
+ break;
+
+ curmap++;
+ }
+}
+
+/* frees too (if there) and recreates new data */
void IMB_makemipmap(ImBuf *ibuf, int use_filter)
{
ImBuf *hbuf = ibuf;
int curmap = 0;
+ imb_freemipmapImBuf(ibuf);
+
ibuf->miptot= 1;
while(curmap < IB_MIPMAP_LEVELS) {
if(use_filter) {
- ImBuf *nbuf= IMB_allocImBuf(hbuf->x, hbuf->y, 32, IB_rect, 0);
+ ImBuf *nbuf= IMB_allocImBuf(hbuf->x, hbuf->y, 32, IB_rect);
IMB_filterN(nbuf, hbuf);
ibuf->mipmap[curmap] = IMB_onehalf(nbuf);
IMB_freeImBuf(nbuf);
diff --git a/source/blender/imbuf/intern/imbuf_cocoa.m b/source/blender/imbuf/intern/imbuf_cocoa.m
index 02c90c5bd09..9b627612d2a 100644
--- a/source/blender/imbuf/intern/imbuf_cocoa.m
+++ b/source/blender/imbuf/intern/imbuf_cocoa.m
@@ -93,7 +93,7 @@ struct ImBuf *imb_cocoaLoadImage(unsigned char *mem, int size, int flags)
[bitmapImage setSize:bitmapSize];
/* allocate the image buffer */
- ibuf = IMB_allocImBuf(bitmapSize.width, bitmapSize.height, 32/*RGBA*/, 0, 0);
+ ibuf = IMB_allocImBuf(bitmapSize.width, bitmapSize.height, 32/*RGBA*/, 0);
if (!ibuf) {
fprintf(stderr,
"imb_cocoaLoadImage: could not allocate memory for the " \
diff --git a/source/blender/imbuf/intern/iris.c b/source/blender/imbuf/intern/iris.c
index 883de823745..51359dc0e68 100644
--- a/source/blender/imbuf/intern/iris.c
+++ b/source/blender/imbuf/intern/iris.c
@@ -123,7 +123,8 @@ static int file_offset;
static unsigned short getshort(FILE *inf)
{
unsigned char * buf;
-
+ (void)inf; /* unused */
+
buf = file_data + file_offset;
file_offset += 2;
@@ -133,6 +134,7 @@ static unsigned short getshort(FILE *inf)
static unsigned int getlong(FILE *inf)
{
unsigned char * buf;
+ (void)inf; /* unused */
buf = file_data + file_offset;
file_offset += 4;
@@ -173,9 +175,8 @@ static void readheader(FILE *inf, IMAGE *image)
static int writeheader(FILE *outf, IMAGE *image)
{
- IMAGE t;
+ IMAGE t= {0};
- memset(&t, 0, sizeof(IMAGE));
fwrite(&t,sizeof(IMAGE),1,outf);
fseek(outf,0,SEEK_SET);
putshort(outf,image->imagic);
@@ -258,6 +259,8 @@ struct ImBuf *imb_loadiris(unsigned char *mem, size_t size, int flags)
int bpp, rle, cur, badorder;
ImBuf * ibuf;
+ (void)size; /* unused */
+
if(!imb_is_a_iris(mem)) return NULL;
/*printf("new iris\n");*/
@@ -283,7 +286,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, size_t size, int flags)
zsize = image.zsize;
if (flags & IB_test) {
- ibuf = IMB_allocImBuf(image.xsize, image.ysize, 8 * image.zsize, 0, 0);
+ ibuf = IMB_allocImBuf(image.xsize, image.ysize, 8 * image.zsize, 0);
if (ibuf) ibuf->ftype = IMAGIC;
return(ibuf);
}
@@ -315,7 +318,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, size_t size, int flags)
if (bpp == 1) {
- ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect, 0);
+ ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect);
if (ibuf->depth > 32) ibuf->depth = 32;
base = ibuf->rect;
zbase = (unsigned int *)ibuf->zbuf;
@@ -356,7 +359,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, size_t size, int flags)
} else { /* bpp == 2 */
- ibuf = IMB_allocImBuf(xsize, ysize, 32, (flags & IB_rect)|IB_rectfloat, 0);
+ ibuf = IMB_allocImBuf(xsize, ysize, 32, (flags & IB_rect)|IB_rectfloat);
fbase = ibuf->rect_float;
@@ -399,7 +402,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, size_t size, int flags)
} else {
if (bpp == 1) {
- ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect, 0);
+ ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect);
if (ibuf->depth > 32) ibuf->depth = 32;
base = ibuf->rect;
@@ -424,7 +427,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, size_t size, int flags)
} else { /* bpp == 2 */
- ibuf = IMB_allocImBuf(xsize, ysize, 32, (flags & IB_rect)|IB_rectfloat, 0);
+ ibuf = IMB_allocImBuf(xsize, ysize, 32, (flags & IB_rect)|IB_rectfloat);
fbase = ibuf->rect_float;
@@ -658,7 +661,7 @@ static void expandrow(unsigned char *optr, unsigned char *iptr, int z)
* Added: zbuf write
*/
-static int output_iris(unsigned int *lptr, int xsize, int ysize, int zsize, char *name, int *zptr)
+static int output_iris(unsigned int *lptr, int xsize, int ysize, int zsize, const char *name, int *zptr)
{
FILE *outf;
IMAGE *image;
@@ -812,7 +815,7 @@ static int compressrow(unsigned char *lbuf, unsigned char *rlebuf, int z, int cn
return optr - (unsigned char *)rlebuf;
}
-int imb_saveiris(struct ImBuf * ibuf, char *name, int flags)
+int imb_saveiris(struct ImBuf * ibuf, const char *name, int flags)
{
short zsize;
int ret;
diff --git a/source/blender/imbuf/intern/jp2.c b/source/blender/imbuf/intern/jp2.c
index a70c154014a..c0f54898119 100644
--- a/source/blender/imbuf/intern/jp2.c
+++ b/source/blender/imbuf/intern/jp2.c
@@ -55,14 +55,14 @@ typedef struct img_folder{
float *rates;
}img_fol_t;
-static int checkj2p(unsigned char *mem) /* J2K_CFMT */
+static int check_jp2(unsigned char *mem) /* J2K_CFMT */
{
return memcmp(JP2_HEAD, mem, 12) ? 0 : 1;
}
int imb_is_a_jp2(unsigned char *buf)
{
- return checkj2p(buf);
+ return check_jp2(buf);
}
@@ -95,9 +95,9 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, size_t size, int flags)
struct ImBuf *ibuf = 0;
int use_float = 0; /* for precision higher then 8 use float */
- long signed_offsets[4] = {0,0,0,0};
- int float_divs[4];
-
+ long signed_offsets[4]= {0, 0, 0, 0};
+ int float_divs[4]= {1, 1, 1, 1};
+
int index;
int w, h, depth;
@@ -112,7 +112,7 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, size_t size, int flags)
opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */
opj_cio_t *cio = NULL;
- if (checkj2p(mem) == 0) return(0);
+ if (check_jp2(mem) == 0) return(0);
/* configure the event callbacks (not required) */
memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
@@ -189,7 +189,7 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, size_t size, int flags)
float_divs[i]= (1<<image->comps[i].prec)-1;
}
- ibuf= IMB_allocImBuf(w, h, depth, use_float ? IB_rectfloat : IB_rect, 0);
+ ibuf= IMB_allocImBuf(w, h, depth, use_float ? IB_rectfloat : IB_rect);
if (ibuf==NULL) {
if(dinfo)
@@ -661,7 +661,7 @@ static opj_image_t* ibuftoimage(ImBuf *ibuf, opj_cparameters_t *parameters) {
/* Found write info at http://users.ece.gatech.edu/~slabaugh/personal/c/bitmapUnix.c */
-int imb_savejp2(struct ImBuf *ibuf, char *name, int flags) {
+int imb_savejp2(struct ImBuf *ibuf, const char *name, int flags) {
int quality = ibuf->ftype & 0xff;
@@ -670,6 +670,8 @@ int imb_savejp2(struct ImBuf *ibuf, char *name, int flags) {
opj_event_mgr_t event_mgr; /* event manager */
opj_image_t *image = NULL;
+ (void)flags; /* unused */
+
/*
configure the event callbacks (not required)
setting of each callback is optionnal
diff --git a/source/blender/imbuf/intern/jpeg.c b/source/blender/imbuf/intern/jpeg.c
index 855c0bf3433..c685a54cbe9 100644
--- a/source/blender/imbuf/intern/jpeg.c
+++ b/source/blender/imbuf/intern/jpeg.c
@@ -132,6 +132,7 @@ typedef my_source_mgr * my_src_ptr;
static void init_source(j_decompress_ptr cinfo)
{
+ (void)cinfo; /* unused */
}
@@ -165,6 +166,7 @@ static void skip_input_data(j_decompress_ptr cinfo, long num_bytes)
static void term_source(j_decompress_ptr cinfo)
{
+ (void)cinfo; /* unused */
}
static void memory_source(j_decompress_ptr cinfo, unsigned char *buffer, size_t size)
@@ -297,10 +299,12 @@ static ImBuf * ibJpegImageFromCinfo(struct jpeg_decompress_struct * cinfo, int f
if (flags & IB_test) {
jpeg_abort_decompress(cinfo);
- ibuf = IMB_allocImBuf(x, y, 8 * depth, 0, 0);
- } else {
- ibuf = IMB_allocImBuf(x, y, 8 * depth, IB_rect, 0);
-
+ ibuf = IMB_allocImBuf(x, y, 8 * depth, 0);
+ }
+ else if ((ibuf = IMB_allocImBuf(x, y, 8 * depth, IB_rect)) == NULL) {
+ jpeg_abort_decompress(cinfo);
+ }
+ else {
row_stride = cinfo->output_width * depth;
row_pointer = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, JPOOL_IMAGE, row_stride, 1);
@@ -421,10 +425,12 @@ next_stamp_marker:
}
jpeg_destroy((j_common_ptr) cinfo);
- ibuf->ftype = ibuf_ftype;
- ibuf->profile = IB_PROFILE_SRGB;
+ if(ibuf) {
+ ibuf->ftype = ibuf_ftype;
+ ibuf->profile = IB_PROFILE_SRGB;
+ }
}
-
+
return(ibuf);
}
@@ -616,7 +622,7 @@ static int init_jpeg(FILE * outfile, struct jpeg_compress_struct * cinfo, struct
}
-static int save_stdjpeg(char * name, struct ImBuf * ibuf)
+static int save_stdjpeg(const char *name, struct ImBuf *ibuf)
{
FILE * outfile;
struct jpeg_compress_struct _cinfo, *cinfo = &_cinfo;
@@ -650,7 +656,7 @@ static int save_stdjpeg(char * name, struct ImBuf * ibuf)
}
-static int save_vidjpeg(char * name, struct ImBuf * ibuf)
+static int save_vidjpeg(const char *name, struct ImBuf *ibuf)
{
FILE * outfile;
struct jpeg_compress_struct _cinfo, *cinfo = &_cinfo;
@@ -689,13 +695,13 @@ static int save_vidjpeg(char * name, struct ImBuf * ibuf)
return 1;
}
-static int save_jstjpeg(char * name, struct ImBuf * ibuf)
+static int save_jstjpeg(const char *name, struct ImBuf *ibuf)
{
char fieldname[1024];
struct ImBuf * tbuf;
int oldy, returnval;
- tbuf = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 24, IB_rect, 0);
+ tbuf = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 24, IB_rect);
tbuf->ftype = ibuf->ftype;
tbuf->flags = ibuf->flags;
@@ -720,7 +726,7 @@ static int save_jstjpeg(char * name, struct ImBuf * ibuf)
return returnval;
}
-static int save_maxjpeg(char * name, struct ImBuf * ibuf)
+static int save_maxjpeg(const char *name, struct ImBuf *ibuf)
{
FILE * outfile;
struct jpeg_compress_struct _cinfo, *cinfo = &_cinfo;
@@ -759,7 +765,7 @@ static int save_maxjpeg(char * name, struct ImBuf * ibuf)
return 1;
}
-int imb_savejpeg(struct ImBuf * ibuf, char * name, int flags)
+int imb_savejpeg(struct ImBuf *ibuf, const char *name, int flags)
{
ibuf->flags = flags;
diff --git a/source/blender/imbuf/intern/openexr/CMakeLists.txt b/source/blender/imbuf/intern/openexr/CMakeLists.txt
index cfc977ff155..ace4f4f9a65 100644
--- a/source/blender/imbuf/intern/openexr/CMakeLists.txt
+++ b/source/blender/imbuf/intern/openexr/CMakeLists.txt
@@ -24,13 +24,11 @@
#
# ***** END GPL LICENSE BLOCK *****
-SET(SRC openexr_api.cpp)
-
-SET(INC
+set(INC
.
- ../../../blenkernel
- ../../
..
+ ../..
+ ../../../blenkernel
../../../blenlib
intern/include
../../../../../intern/guardedalloc
@@ -38,8 +36,12 @@ SET(INC
${OPENEXR_INC}
)
-IF(WITH_IMAGE_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_IMAGE_OPENEXR)
+set(SRC
+ openexr_api.cpp
+)
+
+if(WITH_IMAGE_OPENEXR)
+ add_definitions(-DWITH_OPENEXR)
+endif()
-BLENDERLIB(bf_openexr "${SRC}" "${INC}")
+blender_add_lib(bf_imbuf_openexr "${SRC}" "${INC}")
diff --git a/source/blender/imbuf/intern/openexr/Makefile b/source/blender/imbuf/intern/openexr/Makefile
deleted file mode 100644
index 820b2aeb003..00000000000
--- a/source/blender/imbuf/intern/openexr/Makefile
+++ /dev/null
@@ -1,48 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): Gernot Ziegler <gz@lysator.liu.se>
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = openexr
-DIR = $(OCGDIR)/blender/imbuf/openexr
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# If compiling the API, WITH_OPENEXR must be set.
-CPPFLAGS += -DWITH_OPENEXR
-
-CPPFLAGS += -I../../../makesdna
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../imbuf
-CPPFLAGS += -I../../../imbuf/intern
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += $(NAN_OPENEXR_INC)
-CPPFLAGS += -I.
diff --git a/source/blender/imbuf/intern/openexr/SConscript b/source/blender/imbuf/intern/openexr/SConscript
index 47f83868baa..082bb82c322 100644
--- a/source/blender/imbuf/intern/openexr/SConscript
+++ b/source/blender/imbuf/intern/openexr/SConscript
@@ -15,4 +15,4 @@ incs += Split(env['BF_OPENEXR_INC'])
defs = ['WITH_OPENEXR']
-env.BlenderLib ('bf_openexr', source_files, incs, defs, libtype=['core','player'], priority = [225,180])
+env.BlenderLib ('bf_imbuf_openexr', source_files, incs, defs, libtype=['core','player'], priority = [225,180])
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp
index 4107f051d73..7f334a9f1ad 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp
@@ -28,6 +28,7 @@
#include <stdlib.h>
#include <stdio.h>
+#include <stddef.h>
#include <string>
@@ -187,7 +188,7 @@ static void openexr_header_metadata(Header *header, struct ImBuf *ibuf)
header->insert(info->key, StringAttribute(info->value));
}
-static int imb_save_openexr_half(struct ImBuf *ibuf, char *name, int flags)
+static int imb_save_openexr_half(struct ImBuf *ibuf, const char *name, int flags)
{
int channels = ibuf->channels;
int width = ibuf->x;
@@ -314,7 +315,7 @@ static int imb_save_openexr_half(struct ImBuf *ibuf, char *name, int flags)
return (1);
}
-static int imb_save_openexr_float(struct ImBuf *ibuf, char *name, int flags)
+static int imb_save_openexr_float(struct ImBuf *ibuf, const char *name, int flags)
{
int channels = ibuf->channels;
int width = ibuf->x;
@@ -342,6 +343,7 @@ static int imb_save_openexr_float(struct ImBuf *ibuf, char *name, int flags)
int ystride = - xstride*width;
float *rect[4] = {NULL, NULL, NULL, NULL};
+ /* last scanline, stride negative */
rect[0]= ibuf->rect_float + channels*(height-1)*width;
rect[1]= rect[0]+1;
rect[2]= rect[0]+2;
@@ -372,7 +374,7 @@ static int imb_save_openexr_float(struct ImBuf *ibuf, char *name, int flags)
}
-int imb_save_openexr(struct ImBuf *ibuf, char *name, int flags)
+int imb_save_openexr(struct ImBuf *ibuf, const char *name, int flags)
{
if (flags & IB_mem)
{
@@ -482,7 +484,7 @@ void IMB_exr_add_channel(void *handle, const char *layname, const char *passname
}
/* only used for writing temp. render results (not image files) */
-void IMB_exr_begin_write(void *handle, char *filename, int width, int height, int compress)
+void IMB_exr_begin_write(void *handle, const char *filename, int width, int height, int compress)
{
ExrHandle *data= (ExrHandle *)handle;
Header header (width, height);
@@ -498,12 +500,12 @@ void IMB_exr_begin_write(void *handle, char *filename, int width, int height, in
// openexr_header_metadata(&header, ibuf); // no imbuf. cant write
/* header.lineOrder() = DECREASING_Y; this crashes in windows for file read! */
- header.insert ("BlenderMultiChannel", StringAttribute ("Blender V2.43 and newer"));
+ header.insert ("BlenderMultiChannel", StringAttribute ("Blender V2.55.1 and newer"));
data->ofile = new OutputFile(filename, header);
}
-void IMB_exrtile_begin_write(void *handle, char *filename, int mipmap, int width, int height, int tilex, int tiley)
+void IMB_exrtile_begin_write(void *handle, const char *filename, int mipmap, int width, int height, int tilex, int tiley)
{
ExrHandle *data= (ExrHandle *)handle;
Header header (width, height);
@@ -528,7 +530,7 @@ void IMB_exrtile_begin_write(void *handle, char *filename, int mipmap, int width
}
/* read from file */
-int IMB_exr_begin_read(void *handle, char *filename, int *width, int *height)
+int IMB_exr_begin_read(void *handle, const char *filename, int *width, int *height)
{
ExrHandle *data= (ExrHandle *)handle;
@@ -551,7 +553,7 @@ int IMB_exr_begin_read(void *handle, char *filename, int *width, int *height)
}
/* still clumsy name handling, layers/channels can be ordered as list in list later */
-void IMB_exr_set_channel(void *handle, char *layname, char *passname, int xstride, int ystride, float *rect)
+void IMB_exr_set_channel(void *handle, const char *layname, const char *passname, int xstride, int ystride, float *rect)
{
ExrHandle *data= (ExrHandle *)handle;
ExrChannel *echan;
@@ -615,9 +617,13 @@ void IMB_exr_write_channels(void *handle)
ExrChannel *echan;
if(data->channels.first) {
- for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next)
- frameBuffer.insert (echan->name, Slice (FLOAT, (char *)echan->rect,
- echan->xstride*sizeof(float), echan->ystride*sizeof(float)));
+ for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next) {
+ /* last scanline, stride negative */
+ float *rect = echan->rect + echan->xstride*(data->height-1)*data->width;
+
+ frameBuffer.insert (echan->name, Slice (FLOAT, (char *)rect,
+ echan->xstride*sizeof(float), -echan->ystride*sizeof(float)));
+ }
data->ofile->setFrameBuffer (frameBuffer);
try {
@@ -638,11 +644,20 @@ void IMB_exr_read_channels(void *handle)
FrameBuffer frameBuffer;
ExrChannel *echan;
+ /* check if exr was saved with previous versions of blender which flipped images */
+ const StringAttribute *ta = data->ifile->header().findTypedAttribute <StringAttribute> ("BlenderMultiChannel");
+ short flip = (ta && strncmp(ta->value().c_str(), "Blender V2.43", 13)==0); /* 'previous multilayer attribute, flipped */
+
for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next) {
- /* no datawindow correction needed */
- if(echan->rect)
- frameBuffer.insert (echan->name, Slice (FLOAT, (char *)echan->rect,
- echan->xstride*sizeof(float), echan->ystride*sizeof(float)));
+
+ if(echan->rect) {
+ if(flip)
+ frameBuffer.insert (echan->name, Slice (FLOAT, (char *)echan->rect,
+ echan->xstride*sizeof(float), echan->ystride*sizeof(float)));
+ else
+ frameBuffer.insert (echan->name, Slice (FLOAT, (char *)(echan->rect + echan->xstride*(data->height-1)*data->width),
+ echan->xstride*sizeof(float), -echan->ystride*sizeof(float)));
+ }
else
printf("warning, channel with no rect set %s\n", echan->name);
}
@@ -975,7 +990,7 @@ struct ImBuf *imb_load_openexr(unsigned char *mem, size_t size, int flags)
}
else {
- ibuf = IMB_allocImBuf(width, height, 32, 0, 0);
+ ibuf = IMB_allocImBuf(width, height, 32, 0);
ibuf->ftype = OPENEXR;
/* openEXR is linear as per EXR spec */
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.h b/source/blender/imbuf/intern/openexr/openexr_api.h
index c7e4c7d2f57..6d846109846 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.h
+++ b/source/blender/imbuf/intern/openexr/openexr_api.h
@@ -33,9 +33,6 @@
#ifdef __cplusplus
extern "C" {
#endif
-
-#define OPENEXR_FLOATRGB 0x1
-#define OPENEXR_ZBUF 0x2
#include <stdio.h>
@@ -46,7 +43,7 @@ extern "C" {
int imb_is_a_openexr (unsigned char *mem);
-int imb_save_openexr (struct ImBuf *ibuf, char *name, int flags);
+int imb_save_openexr (struct ImBuf *ibuf, const char *name, int flags);
struct ImBuf *imb_load_openexr (unsigned char *mem, size_t size, int flags);
diff --git a/source/blender/imbuf/intern/openexr/openexr_multi.h b/source/blender/imbuf/intern/openexr/openexr_multi.h
index c66abe76289..6455d636f1a 100644
--- a/source/blender/imbuf/intern/openexr/openexr_multi.h
+++ b/source/blender/imbuf/intern/openexr/openexr_multi.h
@@ -44,11 +44,11 @@
void * IMB_exr_get_handle (void);
void IMB_exr_add_channel (void *handle, const char *layname, const char *passname, int xstride, int ystride, float *rect);
-int IMB_exr_begin_read (void *handle, char *filename, int *width, int *height);
-void IMB_exr_begin_write (void *handle, char *filename, int width, int height, int compress);
-void IMB_exrtile_begin_write (void *handle, char *filename, int mipmap, int width, int height, int tilex, int tiley);
+int IMB_exr_begin_read (void *handle, const char *filename, int *width, int *height);
+void IMB_exr_begin_write (void *handle, const char *filename, int width, int height, int compress);
+void IMB_exrtile_begin_write (void *handle, const char *filename, int mipmap, int width, int height, int tilex, int tiley);
-void IMB_exr_set_channel (void *handle, char *layname, char *passname, int xstride, int ystride, float *rect);
+void IMB_exr_set_channel (void *handle, const char *layname, const char *passname, int xstride, int ystride, float *rect);
void IMB_exr_read_channels (void *handle);
void IMB_exr_write_channels (void *handle);
@@ -67,24 +67,27 @@ void IMB_exr_close (void *handle);
/* ugly... but we only use it on pipeline.c, render module, now */
void * IMB_exr_get_handle (void) {return NULL;}
-void IMB_exr_add_channel (void *handle, const char *layname, const char *channame, int xstride, int ystride, float *rect) {}
+void IMB_exr_add_channel (void *handle, const char *layname, const char *channame, int xstride, int ystride, float *rect) { (void)handle; (void)layname; (void)channame; (void)xstride; (void)ystride; (void)rect; }
-int IMB_exr_begin_read (void *handle, char *filename, int *width, int *height) {return 0;}
-void IMB_exr_begin_write (void *handle, char *filename, int width, int height, int compress) {}
-void IMB_exrtile_begin_write (void *handle, char *filename, int mipmap, int width, int height, int tilex, int tiley) {}
+int IMB_exr_begin_read (void *handle, const char *filename, int *width, int *height) { (void)handle; (void)filename; (void)width; (void)height; return 0;}
+void IMB_exr_begin_write (void *handle, const char *filename, int width, int height, int compress) { (void)handle; (void)filename; (void)width; (void)height; (void)compress; }
+void IMB_exrtile_begin_write (void *handle, const char *filename, int mipmap, int width, int height, int tilex, int tiley) { (void)handle; (void)filename; (void)mipmap; (void)width; (void)height; (void)tilex; (void)tiley; }
-void IMB_exr_set_channel (void *handle, char *layname, char *channame, int xstride, int ystride, float *rect) {}
+void IMB_exr_set_channel (void *handle, char *layname, const char *channame, int xstride, int ystride, float *rect) { (void)handle; (void)layname; (void)channame; (void)xstride; (void)ystride; (void)rect; }
-void IMB_exr_read_channels (void *handle) {}
-void IMB_exr_write_channels (void *handle) {}
-void IMB_exrtile_write_channels (void *handle, int partx, int party, int level) {}
-void IMB_exrtile_clear_channels (void *handle) {}
+void IMB_exr_read_channels (void *handle) { (void)handle; }
+void IMB_exr_write_channels (void *handle) { (void)handle; }
+void IMB_exrtile_write_channels (void *handle, int partx, int party, int level) { (void)handle; (void)partx; (void)party; (void)level; }
+void IMB_exrtile_clear_channels (void *handle) { (void)handle; }
void IMB_exr_multilayer_convert (void *handle, void *base,
void * (*addlayer)(void *base, char *str),
- void (*addpass)(void *base, void *lay, char *str, float *rect, int totchan, char *chan_id)) {}
+ void (*addpass)(void *base, void *lay, char *str, float *rect, int totchan, char *chan_id))
+ {
+ (void)handle; (void)base; (void)addlayer; (void)addpass;
+ }
-void IMB_exr_close (void *handle) {}
+void IMB_exr_close (void *handle) { (void)handle; }
#endif
diff --git a/source/blender/imbuf/intern/png.c b/source/blender/imbuf/intern/png.c
index 6b21f20b3fb..390e04ba303 100644
--- a/source/blender/imbuf/intern/png.c
+++ b/source/blender/imbuf/intern/png.c
@@ -61,7 +61,8 @@ int imb_is_a_png(unsigned char *mem)
}
static void Flush(png_structp png_ptr)
-{
+{
+ (void)png_ptr;
}
static void WriteData( png_structp png_ptr, png_bytep data, png_size_t length)
@@ -93,7 +94,7 @@ static void ReadData( png_structp png_ptr, png_bytep data, png_size_t length)
longjmp(png_jmpbuf(png_ptr), 1);
}
-int imb_savepng(struct ImBuf *ibuf, char *name, int flags)
+int imb_savepng(struct ImBuf *ibuf, const char *name, int flags)
{
png_structp png_ptr;
png_infop info_ptr;
@@ -109,35 +110,33 @@ int imb_savepng(struct ImBuf *ibuf, char *name, int flags)
compression= (int)(((float)(ibuf->ftype & 0xff) / 11.1111f));
compression= compression < 0 ? 0 : (compression > 9 ? 9 : compression);
+ /* for prints */
+ if(flags & IB_mem)
+ name= "<memory>";
+
bytesperpixel = (ibuf->depth + 7) >> 3;
if ((bytesperpixel > 4) || (bytesperpixel == 2)) {
- printf("imb_savepng: unsupported bytes per pixel: %d\n", bytesperpixel);
+ printf("imb_savepng: Cunsupported bytes per pixel: %d for file: '%s'\n", bytesperpixel, name);
return (0);
}
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
NULL, NULL, NULL);
if (png_ptr == NULL) {
- printf("Cannot png_create_write_struct\n");
+ printf("imb_savepng: Cannot png_create_write_struct for file: '%s'\n", name);
return 0;
}
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
- printf("Cannot png_create_info_struct\n");
+ printf("imb_savepng: Cannot png_create_info_struct for file: '%s'\n", name);
return 0;
}
if (setjmp(png_jmpbuf(png_ptr))) {
png_destroy_write_struct(&png_ptr, &info_ptr);
- if (pixels) MEM_freeN(pixels);
- if (row_pointers) MEM_freeN(row_pointers);
- // printf("Aborting\n");
- if (fp) {
- fflush(fp);
- fclose(fp);
- }
+ printf("imb_savepng: Cannot setjmp for file: '%s'\n", name);
return 0;
}
@@ -145,7 +144,8 @@ int imb_savepng(struct ImBuf *ibuf, char *name, int flags)
pixels = MEM_mallocN(ibuf->x * ibuf->y * bytesperpixel * sizeof(unsigned char), "pixels");
if (pixels == NULL) {
- printf("Cannot allocate pixels array\n");
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+ printf("imb_savepng: Cannot allocate pixels array of %dx%d, %d bytes per pixel for file: '%s'\n", ibuf->x, ibuf->y, bytesperpixel, name);
return 0;
}
@@ -193,7 +193,9 @@ int imb_savepng(struct ImBuf *ibuf, char *name, int flags)
} else {
fp = fopen(name, "wb");
if (!fp) {
+ png_destroy_write_struct(&png_ptr, &info_ptr);
MEM_freeN(pixels);
+ printf("imb_savepng: Cannot open file for writing: '%s'\n", name);
return 0;
}
png_init_io(png_ptr, fp);
@@ -256,8 +258,12 @@ int imb_savepng(struct ImBuf *ibuf, char *name, int flags)
// allocate memory for an array of row-pointers
row_pointers = (png_bytepp) MEM_mallocN(ibuf->y * sizeof(png_bytep), "row_pointers");
if (row_pointers == NULL) {
- printf("Cannot allocate row-pointers array\n");
+ printf("imb_savepng: Cannot allocate row-pointers array for file '%s'\n", name);
+ png_destroy_write_struct(&png_ptr, &info_ptr);
MEM_freeN(pixels);
+ if (fp) {
+ fclose(fp);
+ }
return 0;
}
@@ -368,7 +374,7 @@ struct ImBuf *imb_loadpng(unsigned char *mem, size_t size, int flags)
longjmp(png_jmpbuf(png_ptr), 1);
}
- ibuf = IMB_allocImBuf(width, height, 8 * bytesperpixel, 0, 0);
+ ibuf = IMB_allocImBuf(width, height, 8 * bytesperpixel, 0);
if (ibuf) {
ibuf->ftype = PNG;
diff --git a/source/blender/imbuf/intern/radiance_hdr.c b/source/blender/imbuf/intern/radiance_hdr.c
index 4064246c866..9dbb4512e1f 100644
--- a/source/blender/imbuf/intern/radiance_hdr.c
+++ b/source/blender/imbuf/intern/radiance_hdr.c
@@ -202,8 +202,8 @@ struct ImBuf *imb_loadhdr(unsigned char *mem, size_t size, int flags)
ptr = (unsigned char *)strchr((char*)&mem[x+1], '\n');
ptr++;
- if (flags & IB_test) ibuf = IMB_allocImBuf(width, height, 32, 0, 0);
- else ibuf = IMB_allocImBuf(width, height, 32, (flags & IB_rect)|IB_rectfloat, 0);
+ if (flags & IB_test) ibuf = IMB_allocImBuf(width, height, 32, 0);
+ else ibuf = IMB_allocImBuf(width, height, 32, (flags & IB_rect)|IB_rectfloat);
if (ibuf==NULL) return NULL;
ibuf->ftype = RADHDR;
@@ -333,13 +333,15 @@ static void writeHeader(FILE *file, int width, int height)
fputc(10, file);
}
-int imb_savehdr(struct ImBuf *ibuf, char *name, int flags)
+int imb_savehdr(struct ImBuf *ibuf, const char *name, int flags)
{
FILE* file = fopen(name, "wb");
float *fp= NULL;
int y, width=ibuf->x, height=ibuf->y;
unsigned char *cp= NULL;
+ (void)flags; /* unused */
+
if (file==NULL) return 0;
writeHeader(file, width, height);
diff --git a/source/blender/imbuf/intern/readimage.c b/source/blender/imbuf/intern/readimage.c
index a56007f15f0..5a0f79c184d 100644
--- a/source/blender/imbuf/intern/readimage.c
+++ b/source/blender/imbuf/intern/readimage.c
@@ -151,7 +151,7 @@ ImBuf *IMB_testiffname(char *name, int flags)
file = open(filename,O_BINARY|O_RDONLY);
if(file < 0) return 0;
- ibuf=IMB_loadifffile(file, flags|IB_test);
+ ibuf=IMB_loadifffile(file, flags|IB_test|IB_multilayer);
if(ibuf) {
BLI_strncpy(ibuf->name, name, sizeof(ibuf->name));
BLI_strncpy(ibuf->cachename, filename, sizeof(ibuf->cachename));
diff --git a/source/blender/imbuf/intern/rectop.c b/source/blender/imbuf/intern/rectop.c
index 53385743bb8..eba32c73688 100644
--- a/source/blender/imbuf/intern/rectop.c
+++ b/source/blender/imbuf/intern/rectop.c
@@ -30,13 +30,14 @@
*/
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "imbuf.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
#include "IMB_allocimbuf.h"
-#include "BKE_utildefines.h"
+
/* blend modes */
diff --git a/source/blender/imbuf/intern/rotate.c b/source/blender/imbuf/intern/rotate.c
index 4edb7ac7877..d4e1a45f0fa 100644
--- a/source/blender/imbuf/intern/rotate.c
+++ b/source/blender/imbuf/intern/rotate.c
@@ -30,7 +30,9 @@
*/
#include "BLI_blenlib.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
+
+
#include "MEM_guardedalloc.h"
#include "imbuf.h"
diff --git a/source/blender/imbuf/intern/scaling.c b/source/blender/imbuf/intern/scaling.c
index 0b8dea01ada..1f50deaee2a 100644
--- a/source/blender/imbuf/intern/scaling.c
+++ b/source/blender/imbuf/intern/scaling.c
@@ -62,7 +62,7 @@ struct ImBuf *IMB_half_x(struct ImBuf *ibuf1)
if (ibuf1->x <= 1) return(IMB_dupImBuf(ibuf1));
- ibuf2 = IMB_allocImBuf((ibuf1->x)/2, ibuf1->y, ibuf1->depth, ibuf1->flags, 0);
+ ibuf2 = IMB_allocImBuf((ibuf1->x)/2, ibuf1->y, ibuf1->depth, ibuf1->flags);
if (ibuf2==NULL) return (0);
_p1 = (uchar *) ibuf1->rect;
@@ -123,7 +123,7 @@ struct ImBuf *IMB_double_fast_x(struct ImBuf *ibuf1)
do_rect= (ibuf1->rect != NULL);
do_float= (ibuf1->rect_float != NULL);
- ibuf2 = IMB_allocImBuf(2 * ibuf1->x , ibuf1->y , ibuf1->depth, ibuf1->flags, 0);
+ ibuf2 = IMB_allocImBuf(2 * ibuf1->x , ibuf1->y , ibuf1->depth, ibuf1->flags);
if (ibuf2==NULL) return (0);
p1 = (int *) ibuf1->rect;
@@ -181,7 +181,7 @@ struct ImBuf *IMB_half_y(struct ImBuf *ibuf1)
do_rect= (ibuf1->rect != NULL);
do_float= (ibuf1->rect_float != NULL);
- ibuf2 = IMB_allocImBuf(ibuf1->x , (ibuf1->y) / 2 , ibuf1->depth, ibuf1->flags, 0);
+ ibuf2 = IMB_allocImBuf(ibuf1->x , (ibuf1->y) / 2 , ibuf1->depth, ibuf1->flags);
if (ibuf2==NULL) return (0);
_p1 = (uchar *) ibuf1->rect;
@@ -249,7 +249,7 @@ struct ImBuf *IMB_double_fast_y(struct ImBuf *ibuf1)
do_rect= (ibuf1->rect != NULL);
do_float= (ibuf1->rect_float != NULL);
- ibuf2 = IMB_allocImBuf(ibuf1->x , 2 * ibuf1->y , ibuf1->depth, ibuf1->flags, 0);
+ ibuf2 = IMB_allocImBuf(ibuf1->x , 2 * ibuf1->y , ibuf1->depth, ibuf1->flags);
if (ibuf2==NULL) return (0);
p1 = (int *) ibuf1->rect;
@@ -286,26 +286,16 @@ struct ImBuf *IMB_double_y(struct ImBuf *ibuf1)
return (ibuf2);
}
-
-struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1)
+/* result in ibuf2, scaling should be done correctly */
+void imb_onehalf_no_alloc(struct ImBuf *ibuf2, struct ImBuf *ibuf1)
{
- struct ImBuf *ibuf2;
uchar *p1, *p2 = NULL, *dest;
float *p1f, *destf, *p2f = NULL;
int x,y;
int do_rect, do_float;
- if (ibuf1==NULL) return (0);
- if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (0);
-
do_rect= (ibuf1->rect != NULL);
-
- if (ibuf1->x <= 1) return(IMB_half_y(ibuf1));
- if (ibuf1->y <= 1) return(IMB_half_x(ibuf1));
- ibuf2=IMB_allocImBuf((ibuf1->x)/2, (ibuf1->y)/2, ibuf1->depth, ibuf1->flags, 0);
- if (ibuf2==NULL) return (0);
-
p1f = ibuf1->rect_float;
destf=ibuf2->rect_float;
p1 = (uchar *) ibuf1->rect;
@@ -343,9 +333,26 @@ struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1)
if (do_float) p1f+=4;
}
}
- return (ibuf2);
+
}
+struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1)
+{
+ struct ImBuf *ibuf2;
+
+ if (ibuf1==NULL) return (0);
+ if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (0);
+
+ if (ibuf1->x <= 1) return(IMB_half_y(ibuf1));
+ if (ibuf1->y <= 1) return(IMB_half_x(ibuf1));
+
+ ibuf2=IMB_allocImBuf((ibuf1->x)/2, (ibuf1->y)/2, ibuf1->depth, ibuf1->flags);
+ if (ibuf2==NULL) return (0);
+
+ imb_onehalf_no_alloc(ibuf2, ibuf1);
+
+ return (ibuf2);
+}
/* q_scale_linear_interpolation helper functions */
@@ -1439,7 +1446,7 @@ static void scalefast_Z_ImBuf(ImBuf *ibuf, short newx, short newy)
}
}
-struct ImBuf *IMB_scaleImBuf(struct ImBuf * ibuf, short newx, short newy)
+struct ImBuf *IMB_scaleImBuf(struct ImBuf * ibuf, unsigned int newx, unsigned int newy)
{
if (ibuf==NULL) return (0);
if (ibuf->rect==NULL && ibuf->rect_float==NULL) return (ibuf);
@@ -1468,7 +1475,7 @@ struct imbufRGBA {
float r, g, b, a;
};
-struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, short newx, short newy)
+struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy)
{
unsigned int *rect,*_newrect,*newrect;
struct imbufRGBA *rectf, *_newrectf, *newrectf;
diff --git a/source/blender/imbuf/intern/targa.c b/source/blender/imbuf/intern/targa.c
index ada1f448bfc..a748cc1ab1d 100644
--- a/source/blender/imbuf/intern/targa.c
+++ b/source/blender/imbuf/intern/targa.c
@@ -233,18 +233,13 @@ static int dumptarga(struct ImBuf * ibuf, FILE * file)
}
-int imb_savetarga(struct ImBuf * ibuf, char *name, int flags)
+int imb_savetarga(struct ImBuf * ibuf, const char *name, int flags)
{
- char buf[20];
+ char buf[20]= {0};
FILE *fildes;
short ok = 0;
-
- if (ibuf == 0) return (0);
- if (ibuf->rect == 0) return (0);
-
- memset(buf,0,sizeof(buf));
-
- /* buf[0] = 0; length string */
+
+ (void)flags; /* unused */
buf[16] = (ibuf->depth + 0x7 ) & ~0x7;
if (ibuf->depth > 8 ){
@@ -537,8 +532,8 @@ struct ImBuf *imb_loadtarga(unsigned char *mem, size_t mem_size, int flags)
if (checktarga(&tga,mem) == 0) return(0);
- if (flags & IB_test) ibuf = IMB_allocImBuf(tga.xsize,tga.ysize,tga.pixsize, 0, 0);
- else ibuf = IMB_allocImBuf(tga.xsize,tga.ysize,(tga.pixsize + 0x7) & ~0x7, IB_rect, 0);
+ if (flags & IB_test) ibuf = IMB_allocImBuf(tga.xsize,tga.ysize,tga.pixsize, 0);
+ else ibuf = IMB_allocImBuf(tga.xsize,tga.ysize,(tga.pixsize + 0x7) & ~0x7, IB_rect);
if (ibuf == 0) return(0);
ibuf->ftype = TGA;
diff --git a/source/blender/imbuf/intern/thumbs.c b/source/blender/imbuf/intern/thumbs.c
index f3415d44ecb..8abc2e89952 100644
--- a/source/blender/imbuf/intern/thumbs.c
+++ b/source/blender/imbuf/intern/thumbs.c
@@ -280,7 +280,7 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, Im
return NULL;
}
if (size == THB_FAIL) {
- img = IMB_allocImBuf(1,1,32, IB_rect | IB_metadata, 0);
+ img = IMB_allocImBuf(1,1,32, IB_rect | IB_metadata);
if (!img) return 0;
} else {
if (THB_SOURCE_IMAGE == source || THB_SOURCE_BLEND == source) {
diff --git a/source/blender/imbuf/intern/thumbs_blend.c b/source/blender/imbuf/intern/thumbs_blend.c
index 2fef230f1c2..1158a3d9491 100644
--- a/source/blender/imbuf/intern/thumbs_blend.c
+++ b/source/blender/imbuf/intern/thumbs_blend.c
@@ -26,6 +26,8 @@
#include "zlib.h"
+#include "BLI_utildefines.h"
+
#include "BKE_utildefines.h"
#include "BKE_global.h"
@@ -102,7 +104,7 @@ static ImBuf *loadblend_thumb(gzFile gzfile)
return NULL;
/* finally malloc and read the data */
- img= IMB_allocImBuf(size[0], size[1], 32, IB_rect | IB_metadata, 0);
+ img= IMB_allocImBuf(size[0], size[1], 32, IB_rect | IB_metadata);
if(gzread(gzfile, img->rect, bhead[1]) != bhead[1]) {
IMB_freeImBuf(img);
@@ -161,11 +163,11 @@ void IMB_overlayblend_thumb(unsigned int *thumb, int width, int height, float as
{
int x, y;
- int hline, vline;
int stride_x= (margin_r - margin_l) - 2;
for(y=0; y < height; y++) {
for(x=0; x < width; x++, px+=4) {
+ int hline= 0, vline= 0;
if((x > margin_l && x < margin_r) && (y > margin_b && y < margin_t)) {
/* interior. skip */
x += stride_x;
diff --git a/source/blender/imbuf/intern/tiff.c b/source/blender/imbuf/intern/tiff.c
index 5b77c6c7c36..5c3451fd6f4 100644
--- a/source/blender/imbuf/intern/tiff.c
+++ b/source/blender/imbuf/intern/tiff.c
@@ -45,12 +45,13 @@
#include <string.h>
#include "imbuf.h"
-
-#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "BLI_math.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_global.h"
+
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -93,11 +94,18 @@ typedef struct ImbTIFFMemFile {
static void imb_tiff_DummyUnmapProc(thandle_t fd, tdata_t base, toff_t size)
{
+ (void)fd;
+ (void)base;
+ (void)size;
}
static int imb_tiff_DummyMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
{
- return (0);
+ (void)fd;
+ (void)pbase;
+ (void)psize;
+
+ return (0);
}
/**
@@ -154,6 +162,10 @@ static tsize_t imb_tiff_ReadProc(thandle_t handle, tdata_t data, tsize_t n)
*/
static tsize_t imb_tiff_WriteProc(thandle_t handle, tdata_t data, tsize_t n)
{
+ (void)handle;
+ (void)data;
+ (void)n;
+
printf("imb_tiff_WriteProc: this function should not be called.\n");
return (-1);
}
@@ -368,7 +380,7 @@ static int imb_read_tiff_pixels(ImBuf *ibuf, TIFF *image, int premul)
ib_flag = IB_rect;
}
- tmpibuf= IMB_allocImBuf(ibuf->x, ibuf->y, ibuf->depth, ib_flag, 0);
+ tmpibuf= IMB_allocImBuf(ibuf->x, ibuf->y, ibuf->depth, ib_flag);
/* simple RGBA image */
if (!(bitspersample == 32 || bitspersample == 16)) {
@@ -497,7 +509,7 @@ ImBuf *imb_loadtiff(unsigned char *mem, size_t size, int flags)
ib_depth = (spp==3)?24:32;
- ibuf = IMB_allocImBuf(width, height, ib_depth, 0, 0);
+ ibuf = IMB_allocImBuf(width, height, ib_depth, 0);
if(ibuf) {
ibuf->ftype = TIF;
}
@@ -533,7 +545,7 @@ ImBuf *imb_loadtiff(unsigned char *mem, size_t size, int flags)
width= (width > 1)? width/2: 1;
height= (height > 1)? height/2: 1;
- hbuf= IMB_allocImBuf(width, height, 32, 0, 0);
+ hbuf= IMB_allocImBuf(width, height, 32, 0);
hbuf->miplevel= level;
hbuf->ftype= ibuf->ftype;
ibuf->mipmap[level-1] = hbuf;
@@ -631,7 +643,7 @@ void imb_loadtiletiff(ImBuf *ibuf, unsigned char *mem, size_t size, int tx, int
* @return: 1 if the function is successful, 0 on failure.
*/
-int imb_savetiff(ImBuf *ibuf, char *name, int flags)
+int imb_savetiff(ImBuf *ibuf, const char *name, int flags)
{
TIFF *image = NULL;
uint16 samplesperpixel, bitspersample;
@@ -748,7 +760,7 @@ int imb_savetiff(ImBuf *ibuf, char *name, int flags)
if (samplesperpixel == 4) {
to16[to_i+3] = FTOUSHORT(fromf[from_i+3]);
- to_i++; from_i++;
+ /*to_i++; from_i++;*/ /*unused, set on each loop */
}
}
else {
diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c
index cd447e5e43a..1e50e2997d1 100644
--- a/source/blender/imbuf/intern/util.c
+++ b/source/blender/imbuf/intern/util.c
@@ -126,6 +126,7 @@ const char *imb_ext_movie[] = {
".flv",
".divx",
".xvid",
+ ".mxf",
NULL};
/* sort of wrong being here... */
@@ -142,7 +143,7 @@ const char *imb_ext_audio[] = {
".eac3",
NULL};
-static int IMB_ispic_name(char *name)
+static int IMB_ispic_name(const char *name)
{
ImFileType *type;
struct stat st;
@@ -176,7 +177,7 @@ static int IMB_ispic_name(char *name)
return FALSE;
}
-int IMB_ispic(char *filename)
+int IMB_ispic(const char *filename)
{
if(U.uiflag & USER_FILTERFILEEXTS) {
if( (BLI_testextensie_array(filename, imb_ext_image)) ||
@@ -195,12 +196,12 @@ int IMB_ispic(char *filename)
-static int isavi (char *name) {
+static int isavi (const char *name) {
return AVI_is_avi (name);
}
#ifdef WITH_QUICKTIME
-static int isqtime (char *name) {
+static int isqtime (const char *name) {
return anim_is_quicktime (name);
}
#endif
@@ -219,8 +220,8 @@ void silence_log_ffmpeg(int quiet)
}
}
-extern void do_init_ffmpeg();
-void do_init_ffmpeg()
+extern void do_init_ffmpeg(void);
+void do_init_ffmpeg(void)
{
static int ffmpeg_init = 0;
if (!ffmpeg_init) {
@@ -248,7 +249,7 @@ static AVCodecContext* get_codec_from_stream(AVStream* stream)
#endif
-static int isffmpeg (char *filename) {
+static int isffmpeg (const char *filename) {
AVFormatContext *pFormatCtx;
unsigned int i;
int videoStream;
@@ -319,7 +320,7 @@ static int isffmpeg (char *filename) {
#endif
#ifdef WITH_REDCODE
-static int isredcode(char * filename)
+static int isredcode(const char * filename)
{
struct redcode_handle * h = redcode_open(filename);
if (!h) {
@@ -331,7 +332,7 @@ static int isredcode(char * filename)
#endif
-int imb_get_anim_type(char * name) {
+int imb_get_anim_type(const char * name) {
int type;
struct stat st;
@@ -372,7 +373,7 @@ int imb_get_anim_type(char * name) {
return(0);
}
-int IMB_isanim(char *filename) {
+int IMB_isanim(const char *filename) {
int type;
if(U.uiflag & USER_FILTERFILEEXTS) {
diff --git a/source/blender/imbuf/intern/writeimage.c b/source/blender/imbuf/intern/writeimage.c
index b55ce4b1df4..9c2855b0544 100644
--- a/source/blender/imbuf/intern/writeimage.c
+++ b/source/blender/imbuf/intern/writeimage.c
@@ -37,7 +37,7 @@
#include "imbuf.h"
-short IMB_saveiff(struct ImBuf *ibuf, char *name, int flags)
+short IMB_saveiff(struct ImBuf *ibuf, const char *name, int flags)
{
ImFileType *type;
@@ -50,7 +50,7 @@ short IMB_saveiff(struct ImBuf *ibuf, char *name, int flags)
if(ibuf->rect==NULL && ibuf->rect_float)
IMB_rect_from_float(ibuf);
}
-
+ /* TODO. have const char for image write funcs */
return type->save(ibuf, name, flags);
}
}
diff --git a/source/blender/makesdna/CMakeLists.txt b/source/blender/makesdna/CMakeLists.txt
index cb61082000d..b1e1b589c6e 100644
--- a/source/blender/makesdna/CMakeLists.txt
+++ b/source/blender/makesdna/CMakeLists.txt
@@ -24,4 +24,67 @@
#
# ***** END GPL LICENSE BLOCK *****
-ADD_SUBDIRECTORY(intern)
+# Use PARENT_SCOPE so makesrna can access.
+set(SRC_DNA_INC
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_ID.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_action_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_actuator_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_anim_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_armature_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_boid_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_brush_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_camera_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_cloth_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_color_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_constraint_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_controller_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_curve_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_customdata_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_documentation.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_effect_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_fileglobal_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_genfile.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_gpencil_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_group_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_image_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_ipo_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_key_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_lamp_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_lattice_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_listBase.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_material_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_mesh_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_meshdata_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_meta_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_modifier_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_nla_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_node_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_object_fluidsim.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_object_force.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_object_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_outliner_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_packedFile_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_particle_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_property_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_scene_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_screen_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_sdna_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_sensor_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_sequence_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_smoke_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_sound_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_space_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_text_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_texture_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_userdef_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_vec_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_vfont_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_view2d_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_view3d_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_windowmanager_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/DNA_world_types.h
+
+ PARENT_SCOPE
+)
+
+add_subdirectory(intern)
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index 49c2df42810..7d4d3d7c333 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -127,8 +127,9 @@ typedef struct Library {
#define PREVIEW_MIPMAP_LARGE 1
typedef struct PreviewImage {
+ /* All values of 2 are really PREVIEW_MIPMAPS */
unsigned int w[2];
- unsigned int h[2];
+ unsigned int h[2];
short changed[2];
short changed_timestamp[2];
unsigned int * rect[2];
@@ -199,6 +200,11 @@ typedef struct PreviewImage {
#define ID_REAL_USERS(id) (((ID *)id)->us - ((((ID *)id)->flag & LIB_FAKEUSER) ? 1:0))
+#ifdef GS
+#undef GS
+#endif
+#define GS(a) (*((short *)(a)))
+
/* id->flag: set frist 8 bits always at zero while reading */
#define LIB_LOCAL 0
#define LIB_EXTERN 1
@@ -215,6 +221,8 @@ typedef struct PreviewImage {
#define LIB_DOIT 1024
/* tag existing data before linking so we know what is new */
#define LIB_PRE_EXISTING 2048
+/* runtime */
+#define LIB_ID_RECALC 4096
#ifdef __cplusplus
}
diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h
index f7bbf9235ab..17f9afce7c3 100644
--- a/source/blender/makesdna/DNA_action_types.h
+++ b/source/blender/makesdna/DNA_action_types.h
@@ -56,7 +56,7 @@ typedef struct bMotionPathVert {
/* bMotionPathVert->flag */
typedef enum eMotionPathVert_Flag {
/* vert is selected */
- MOTIONPATH_VERT_SEL = (1<<0),
+ MOTIONPATH_VERT_SEL = (1<<0)
} eMotionPathVert_Flag;
/* ........ */
@@ -79,7 +79,7 @@ typedef enum eMotionPath_Flag {
/* (for bones) path represents the head of the bone */
MOTIONPATH_FLAG_BHEAD = (1<<0),
/* motion path is being edited */
- MOTIONPATH_FLAG_EDIT = (1<<1),
+ MOTIONPATH_FLAG_EDIT = (1<<1)
} eMotionPath_Flag;
/* Visualisation General --------------------------- */
@@ -114,7 +114,7 @@ typedef struct bAnimVizSettings {
/* bAnimVizSettings->recalc */
typedef enum eAnimViz_RecalcFlags {
/* motionpaths need recalculating */
- ANIMVIZ_RECALC_PATHS = (1<<0),
+ ANIMVIZ_RECALC_PATHS = (1<<0)
} eAnimViz_RecalcFlags;
@@ -127,13 +127,13 @@ typedef enum eOnionSkin_Types {
/* show ghosts within the specified frame range */
GHOST_TYPE_RANGE,
/* show ghosts on keyframes within the specified range only */
- GHOST_TYPE_KEYS,
+ GHOST_TYPE_KEYS
} eOnionSkin_Types;
/* bAnimVizSettings->ghost_flag */
typedef enum eOnionSkin_Flag {
/* only show selected bones in ghosts */
- GHOST_FLAG_ONLYSEL = (1<<0),
+ GHOST_FLAG_ONLYSEL = (1<<0)
} eOnionSkin_Flag;
@@ -142,7 +142,7 @@ typedef enum eMotionPaths_Types {
/* show the paths along their entire ranges */
MOTIONPATH_TYPE_RANGE = 0,
/* only show the parts of the paths around the current frame */
- MOTIONPATH_TYPE_ACFRA,
+ MOTIONPATH_TYPE_ACFRA
} eMotionPath_Types;
/* bAnimVizSettings->path_viewflag */
@@ -154,7 +154,7 @@ typedef enum eMotionPaths_ViewFlag {
/* show keyframe/frame numbers */
MOTIONPATH_VIEW_KFNOS = (1<<2),
/* find keyframes in whole action (instead of just in matching group name) */
- MOTIONPATH_VIEW_KFACT = (1<<3),
+ MOTIONPATH_VIEW_KFACT = (1<<3)
} eMotionPath_ViewFlag;
/* bAnimVizSettings->path_bakeflag */
@@ -164,7 +164,7 @@ typedef enum eMotionPaths_BakeFlag {
/* for bones - calculate head-points for curves instead of tips */
MOTIONPATH_BAKE_HEADS = (1<<1),
/* motion paths exist for AnimVizSettings instance - set when calc for first time, and unset when clearing */
- MOTIONPATH_BAKE_HAS_PATHS = (1<<2),
+ MOTIONPATH_BAKE_HAS_PATHS = (1<<2)
} eMotionPath_BakeFlag;
/* ************************************************ */
@@ -188,7 +188,7 @@ typedef struct bPoseChannel {
short flag; /* dynamic, for detecting transform changes */
short constflag; /* for quick detecting which constraints affect this channel */
short ikflag; /* settings for IK bones */
- short selectflag; /* copy of bone flag, so you can work with library armatures */
+ short selectflag; /* copy of bone flag, so you can work with library armatures, not for runtime use */
short protectflag; /* protect channels from being transformed */
short agrp_index; /* index of action-group this bone belongs to (0 = default/no group) */
@@ -203,12 +203,10 @@ typedef struct bPoseChannel {
struct bPoseChannel *child; /* set on read file or rebuild pose, the 'ik' child, for b-bones */
struct ListBase iktree; /* only while evaluating pose */
- /* only while deform, stores precalculated b_bone deform mats,
- dual quaternions */
- void *b_bone_mats;
- void *dual_quat;
- void *b_bone_dual_quats;
-
+ bMotionPath *mpath; /* motion path cache for this bone */
+ struct Object *custom; /* draws custom object instead of default bone shape */
+ struct bPoseChannel *custom_tx; /* odd feature, display with another bones transform. needed in rare cases for advanced rigs, since the alternative is highly complicated - campbell */
+
/* transforms - written in by actions or transform */
float loc[3];
float size[3];
@@ -234,9 +232,6 @@ typedef struct bPoseChannel {
float iklinweight; /* weight of joint stretch constraint */
float *path; /* totpath x 3 x float */ // XXX depreceated... old animation system (armature only viz)
- bMotionPath *mpath; /* motion path cache for this bone */
- struct Object *custom; /* draws custom object instead of default bone shape */
- struct bPoseChannel *custom_tx; /* odd feature, display with another bones transform. needed in rare cases for advanced rigs, since the alternative is highly complicated - campbell */
} bPoseChannel;
@@ -265,7 +260,7 @@ typedef enum ePchan_Flag {
/* has Spline IK */
POSE_HAS_IKS = (1<<14),
/* spline IK solving */
- POSE_IKSPLINE = (1<<15),
+ POSE_IKSPLINE = (1<<15)
} ePchan_Flag;
/* PoseChannel constflag (constraint detection) */
@@ -278,7 +273,7 @@ typedef enum ePchan_ConstFlag {
/* only for drawing Posemode too */
PCHAN_HAS_STRIDE = (1<<4),
/* spline IK */
- PCHAN_HAS_SPLINEIK = (1<<5),
+ PCHAN_HAS_SPLINEIK = (1<<5)
} ePchan_ConstFlag;
/* PoseChannel->ikflag */
@@ -296,7 +291,7 @@ typedef enum ePchan_IkFlag {
BONE_IK_NO_XDOF_TEMP = (1<<10),
BONE_IK_NO_YDOF_TEMP = (1<<11),
- BONE_IK_NO_ZDOF_TEMP = (1<<12),
+ BONE_IK_NO_ZDOF_TEMP = (1<<12)
} ePchan_IkFlag;
/* PoseChannel->rotmode and Object->rotmode */
@@ -314,9 +309,11 @@ typedef enum eRotationModes {
/* NOTE: space is reserved here for 18 other possible
* euler rotation orders not implemented
*/
- ROT_MODE_MAX, /* sentinel for Py API */
/* axis angle rotations */
- ROT_MODE_AXISANGLE = -1
+ ROT_MODE_AXISANGLE = -1,
+
+ ROT_MODE_MIN = ROT_MODE_AXISANGLE, /* sentinel for Py API */
+ ROT_MODE_MAX = ROT_MODE_ZYX
} eRotationModes;
/* Pose ------------------------------------ */
@@ -330,7 +327,9 @@ typedef struct bPose {
ListBase chanbase; /* list of pose channels, PoseBones in RNA */
struct GHash *chanhash; /* ghash for quicker string lookups */
- short flag, proxy_layer; /* proxy layer: copy from armature, gets synced */
+ short flag, pad;
+ unsigned int proxy_layer; /* proxy layer: copy from armature, gets synced */
+ int pad1;
float ctime; /* local action time of this pose */
float stride_offset[3]; /* applied to object */
@@ -364,7 +363,7 @@ typedef enum ePose_Flags {
/* set by armature_rebuild_pose to give a chance to the IK solver to rebuild IK tree */
POSE_WAS_REBUILT = (1<<5),
/* set by game_copy_pose to indicate that this pose is used in the game engine */
- POSE_GAME_ENGINE = (1<<6),
+ POSE_GAME_ENGINE = (1<<6)
} ePose_Flags;
/* IK Solvers ------------------------------------ */
@@ -372,7 +371,7 @@ typedef enum ePose_Flags {
/* bPose->iksolver and bPose->ikparam->iksolver */
typedef enum ePose_IKSolverType {
IKSOLVER_LEGACY = 0,
- IKSOLVER_ITASC,
+ IKSOLVER_ITASC
} ePose_IKSolverType;
/* header for all bPose->ikparam structures */
@@ -401,7 +400,7 @@ typedef enum eItasc_Flags {
ITASC_AUTO_STEP = (1<<0),
ITASC_INITIAL_REITERATION = (1<<1),
ITASC_REITERATION = (1<<2),
- ITASC_SIMULATION = (1<<3),
+ ITASC_SIMULATION = (1<<3)
} eItasc_Flags;
/* bItasc->solver */
@@ -425,7 +424,7 @@ typedef enum eItasc_Solver {
* ensure that action-groups never end up being the sole 'owner' of a channel.
*
* This is also exploited for bone-groups. Bone-Groups are stored per bPose, and are used
- * primarily to colour bones in the 3d-view. There are other benefits too, but those are mostly related
+ * primarily to color bones in the 3d-view. There are other benefits too, but those are mostly related
* to Action-Groups.
*/
typedef struct bActionGroup {
@@ -496,7 +495,7 @@ typedef enum eAction_Flags {
/* flags for evaluation/editing */
ACT_MUTED = (1<<9),
ACT_PROTECTED = (1<<10),
- ACT_DISABLED = (1<<11),
+ ACT_DISABLED = (1<<11)
} eAction_Flags;
@@ -533,7 +532,7 @@ typedef enum eDopeSheet_FilterFlag {
ADS_FILTER_NOSHAPEKEYS = (1<<6),
ADS_FILTER_NOMESH = (1<<7),
ADS_FILTER_NOOBJ = (1<<8), /* for animdata on object level, if we only want to concentrate on materials/etc. */
- // NOTE: there are a few more spaces for datablock filtering here...
+ ADS_FILTER_NOLAT = (1<<9),
ADS_FILTER_NOCAM = (1<<10),
ADS_FILTER_NOMAT = (1<<11),
ADS_FILTER_NOLAM = (1<<12),
@@ -553,12 +552,12 @@ typedef enum eDopeSheet_FilterFlag {
ADS_FILTER_INCL_HIDDEN = (1<<26), /* include 'hidden' channels too (i.e. those from hidden Objects/Bones) */
/* combination filters (some only used at runtime) */
- ADS_FILTER_NOOBDATA = (ADS_FILTER_NOCAM|ADS_FILTER_NOMAT|ADS_FILTER_NOLAM|ADS_FILTER_NOCUR|ADS_FILTER_NOPART|ADS_FILTER_NOARM),
+ ADS_FILTER_NOOBDATA = (ADS_FILTER_NOCAM|ADS_FILTER_NOMAT|ADS_FILTER_NOLAM|ADS_FILTER_NOCUR|ADS_FILTER_NOPART|ADS_FILTER_NOARM)
} eDopeSheet_FilterFlag;
/* DopeSheet general flags */
typedef enum eDopeSheet_Flag {
- ADS_FLAG_SUMMARY_COLLAPSED = (1<<0), /* when summary is shown, it is collapsed, so all other channels get hidden */
+ ADS_FLAG_SUMMARY_COLLAPSED = (1<<0) /* when summary is shown, it is collapsed, so all other channels get hidden */
} eDopeSheet_Flag;
@@ -596,9 +595,9 @@ typedef enum eSAction_Flag {
SACTION_NOTRANSKEYCULL = (1<<4),
/* don't include keyframes that are out of view */
//SACTION_HORIZOPTIMISEON = (1<<5), // XXX depreceated... old irrelevant trick
- /* hack for moving pose-markers (temp flag) */
- SACTION_POSEMARKERS_MOVE = (1<<6),
- /* don't draw action channels using group colours (where applicable) */
+ /* show pose-markers (local to action) in Action Editor mode */
+ SACTION_POSEMARKERS_SHOW = (1<<6),
+ /* don't draw action channels using group colors (where applicable) */
SACTION_NODRAWGCOLORS = (1<<7), // XXX depreceated... irrelevant for current groups implementation
/* don't draw current frame number beside frame indicator */
SACTION_NODRAWCFRANUM = (1<<8),
@@ -607,7 +606,7 @@ typedef enum eSAction_Flag {
/* don't perform realtime updates */
SACTION_NOREALTIMEUPDATES = (1<<10),
/* move markers as well as keyframes */
- SACTION_MARKERS_MOVE = (1<<11),
+ SACTION_MARKERS_MOVE = (1<<11)
} eSAction_Flag;
/* SpaceAction Mode Settings */
@@ -619,7 +618,7 @@ typedef enum eAnimEdit_Context {
/* editing of gpencil data */
SACTCONT_GPENCIL,
/* dopesheet (default) */
- SACTCONT_DOPESHEET,
+ SACTCONT_DOPESHEET
} eAnimEdit_Context;
/* SpaceAction AutoSnap Settings (also used by other Animation Editors) */
@@ -631,7 +630,7 @@ typedef enum eAnimEdit_AutoSnap {
/* snap to actual frames/seconds (nla-action time) */
SACTSNAP_FRAME,
/* snap to nearest marker */
- SACTSNAP_MARKER,
+ SACTSNAP_MARKER
} eAnimEdit_AutoSnap;
@@ -670,7 +669,7 @@ typedef enum ACHAN_FLAG {
ACHAN_EXPANDED = (1<<4),
ACHAN_SHOWIPO = (1<<5),
ACHAN_SHOWCONS = (1<<6),
- ACHAN_MOVED = (1<<31),
+ ACHAN_MOVED = (1<<31)
} ACHAN_FLAG;
#endif
diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h
index 147d621a4f2..55966e9650b 100644
--- a/source/blender/makesdna/DNA_actuator_types.h
+++ b/source/blender/makesdna/DNA_actuator_types.h
@@ -48,7 +48,7 @@ typedef struct bAddObjectActuator {
typedef struct bActionActuator {
struct bAction *act; /* Pointer to action */
short type, flag; /* Playback type */ // not in use
- int sta, end; /* Start & End frames */
+ float sta, end; /* Start & End frames */
char name[32]; /* For property-driven playback */
char frameProp[32]; /* Set this property to the actions current frame */
short blendin; /* Number of frames of blending */
@@ -112,14 +112,14 @@ typedef struct bObjectActuator {
short damping;
float forceloc[3], forcerot[3];
float pad[3], pad1[3];
- float dloc[3], drot[3];
+ float dloc[3], drot[3]; /* angle in radians */
float linearvelocity[3], angularvelocity[3];
struct Object *reference;
} bObjectActuator;
typedef struct bIpoActuator {
short flag, type;
- int sta, end;
+ float sta, end;
char name[32];
char frameProp[32]; /* Set this property to the actions current frame */
diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h
index 8c2fc7db390..e09d7635f75 100644
--- a/source/blender/makesdna/DNA_anim_types.h
+++ b/source/blender/makesdna/DNA_anim_types.h
@@ -88,7 +88,7 @@ typedef enum eFModifier_Flags {
/* modifier is active one (in UI) for editing purposes */
FMODIFIER_FLAG_ACTIVE = (1<<2),
/* user wants modifier to be skipped */
- FMODIFIER_FLAG_MUTED = (1<<3),
+ FMODIFIER_FLAG_MUTED = (1<<3)
} eFModifier_Flags;
/* --- */
@@ -109,7 +109,7 @@ typedef struct FMod_Generator {
/* generator modes */
typedef enum eFMod_Generator_Modes {
FCM_GENERATOR_POLYNOMIAL = 0,
- FCM_GENERATOR_POLYNOMIAL_FACTORISED,
+ FCM_GENERATOR_POLYNOMIAL_FACTORISED
} eFMod_Generator_Modes;
@@ -118,7 +118,7 @@ typedef enum eFMod_Generator_Modes {
*/
typedef enum eFMod_Generator_Flags {
/* generator works in conjunction with other modifiers (i.e. doesn't replace those before it) */
- FCM_GENERATOR_ADDITIVE = (1<<0),
+ FCM_GENERATOR_ADDITIVE = (1<<0)
} eFMod_Generator_Flags;
@@ -149,7 +149,7 @@ typedef enum eFMod_Generator_Functions {
FCM_GENERATOR_FN_TAN,
FCM_GENERATOR_FN_SQRT,
FCM_GENERATOR_FN_LN,
- FCM_GENERATOR_FN_SINC,
+ FCM_GENERATOR_FN_SINC
} eFMod_Generator_Functions;
@@ -186,7 +186,7 @@ typedef enum eFMod_Cycling_Modes {
FCM_EXTRAPOLATE_NONE = 0, /* don't do anything */
FCM_EXTRAPOLATE_CYCLIC, /* repeat keyframe range as-is */
FCM_EXTRAPOLATE_CYCLIC_OFFSET, /* repeat keyframe range, but with offset based on gradient between values */
- FCM_EXTRAPOLATE_MIRROR, /* alternate between forward and reverse playback of keyframe range */
+ FCM_EXTRAPOLATE_MIRROR /* alternate between forward and reverse playback of keyframe range */
} eFMod_Cycling_Modes;
@@ -209,7 +209,7 @@ typedef enum eFMod_Limit_Flags {
FCM_LIMIT_XMIN = (1<<0),
FCM_LIMIT_XMAX = (1<<1),
FCM_LIMIT_YMIN = (1<<2),
- FCM_LIMIT_YMAX = (1<<3),
+ FCM_LIMIT_YMAX = (1<<3)
} eFMod_Limit_Flags;
@@ -229,7 +229,7 @@ typedef enum eFMod_Noise_Modifications {
FCM_NOISE_MODIF_REPLACE = 0, /* Modify existing curve, matching it's shape */
FCM_NOISE_MODIF_ADD, /* Add noise to the curve */
FCM_NOISE_MODIF_SUBTRACT, /* Subtract noise from the curve */
- FCM_NOISE_MODIF_MULTIPLY, /* Multiply the curve by noise */
+ FCM_NOISE_MODIF_MULTIPLY /* Multiply the curve by noise */
} eFMod_Noise_Modifications;
@@ -379,7 +379,7 @@ typedef enum eDriver_Types {
/* smallest value */
DRIVER_TYPE_MIN,
/* largest value */
- DRIVER_TYPE_MAX,
+ DRIVER_TYPE_MAX
} eDriver_Types;
/* driver flags */
@@ -396,7 +396,7 @@ typedef enum eDriver_Flags {
/* the names are cached so they dont need have python unicode versions created each time */
DRIVER_FLAG_RENAMEVAR = (1<<4),
/* intermediate values of driver should be shown in the UI for debugging purposes */
- DRIVER_FLAG_SHOWDEBUG = (1<<5),
+ DRIVER_FLAG_SHOWDEBUG = (1<<5)
} eDriver_Flags;
/* F-Curves -------------------------------------- */
@@ -465,19 +465,22 @@ typedef enum eFCurve_Flags {
FCURVE_INT_VALUES = (1<<11),
/* curve can only have certain discrete-number values (no interpolation at all, for enums/booleans) */
FCURVE_DISCRETE_VALUES = (1<<12),
+
+ /* temporary tag for editing */
+ FCURVE_TAGGED = (1<<15)
} eFCurve_Flags;
/* extrapolation modes (only simple value 'extending') */
typedef enum eFCurve_Extend {
FCURVE_EXTRAPOLATE_CONSTANT = 0, /* just extend min/max keyframe value */
- FCURVE_EXTRAPOLATE_LINEAR, /* just extend gradient of segment between first segment keyframes */
+ FCURVE_EXTRAPOLATE_LINEAR /* just extend gradient of segment between first segment keyframes */
} eFCurve_Extend;
/* curve coloring modes */
typedef enum eFCurve_Coloring {
FCURVE_COLOR_AUTO_RAINBOW = 0, /* automatically determine color using rainbow (calculated at drawtime) */
FCURVE_COLOR_AUTO_RGB, /* automatically determine color using XYZ (array index) <-> RGB */
- FCURVE_COLOR_CUSTOM, /* custom color */
+ FCURVE_COLOR_CUSTOM /* custom color */
} eFCurve_Coloring;
/* ************************************************ */
@@ -572,7 +575,7 @@ typedef enum eNlaStrip_Blend_Mode {
NLASTRIP_MODE_REPLACE = 0,
NLASTRIP_MODE_ADD,
NLASTRIP_MODE_SUBTRACT,
- NLASTRIP_MODE_MULTIPLY,
+ NLASTRIP_MODE_MULTIPLY
} eNlaStrip_Blend_Mode;
/* NLA Strip Extrpolation Mode */
@@ -582,7 +585,7 @@ typedef enum eNlaStrip_Extrapolate_Mode {
/* only hold+extend last frame */
NLASTRIP_EXTEND_HOLD_FORWARD,
/* don't contribute at all */
- NLASTRIP_EXTEND_NOTHING,
+ NLASTRIP_EXTEND_NOTHING
} eNlaStrip_Extrapolate_Mode;
/* NLA Strip Settings */
@@ -619,7 +622,7 @@ typedef enum eNlaStrip_Flag {
/* temporary editing flags */
/* NLA-Strip is really just a temporary meta used to facilitate easier transform code */
NLASTRIP_FLAG_TEMP_META = (1<<30),
- NLASTRIP_FLAG_EDIT_TOUCHED = (1<<31),
+ NLASTRIP_FLAG_EDIT_TOUCHED = (1<<31)
} eNlaStrip_Flag;
/* NLA Strip Type */
@@ -629,7 +632,7 @@ typedef enum eNlaStrip_Type {
/* 'transition' - blends between the adjacent strips */
NLASTRIP_TYPE_TRANSITION,
/* 'meta' - a strip which acts as a container for a few others */
- NLASTRIP_TYPE_META,
+ NLASTRIP_TYPE_META
} eNlaStrip_Type;
/* NLA Tracks ------------------------------------- */
@@ -666,7 +669,7 @@ typedef enum eNlaTrack_Flag {
NLATRACK_PROTECTED = (1<<4),
/* track is not allowed to execute, usually as result of tweaking being enabled (internal flag) */
- NLATRACK_DISABLED = (1<<10),
+ NLATRACK_DISABLED = (1<<10)
} eNlaTrack_Flag;
@@ -702,7 +705,7 @@ typedef struct KS_Path {
/* KS_Path->flag */
typedef enum eKSP_Settings {
/* entire array (not just the specified index) gets keyframed */
- KSP_FLAG_WHOLE_ARRAY = (1<<0),
+ KSP_FLAG_WHOLE_ARRAY = (1<<0)
} eKSP_Settings;
/* KS_Path->groupmode */
@@ -716,26 +719,9 @@ typedef enum eKSP_Grouping {
/* path should be grouped using name of inner-most context item from templates
* - this is most useful for relative KeyingSets only
*/
- KSP_GROUP_TEMPLATE_ITEM,
+ KSP_GROUP_TEMPLATE_ITEM
} eKSP_Grouping;
-/* KS_Path->templates (Template Flags)
- *
- * Templates in paths are used to substitute information from the
- * active context into relavent places in the path strings. This
- * enum here defines the flags which define which templates are
- * required by a path before it can be used
- */
-typedef enum eKSP_TemplateTypes {
- KSP_TEMPLATE_OBJECT = (1<<0), /* #obj - selected object */
- KSP_TEMPLATE_PCHAN = (1<<1), /* #pch - selected posechannel */
- KSP_TEMPLATE_CONSTRAINT = (1<<2), /* #con - active only */
- KSP_TEMPLATE_NODE = (1<<3), /* #nod - selected node */
- KSP_TEMPLATE_MODIFIER = (1<<4), /* #mod - active only */
-
- KSP_TEMPLATE_ROT = (1<<16), /* modify rotation paths based on rotation mode of Object or Pose Channel */
-} eKSP_TemplateTypes;
-
/* ---------------- */
/* KeyingSet definition (ks)
@@ -767,7 +753,7 @@ typedef enum eKS_Settings {
/* keyingset cannot be removed (and doesn't need to be freed) */
KEYINGSET_BUILTIN = (1<<0),
/* keyingset does not depend on context info (i.e. paths are absolute) */
- KEYINGSET_ABSOLUTE = (1<<1),
+ KEYINGSET_ABSOLUTE = (1<<1)
} eKS_Settings;
/* Flags for use by keyframe creation/deletion calls */
@@ -777,7 +763,7 @@ typedef enum eInsertKeyFlags {
INSERTKEY_FAST = (1<<2), /* don't recalculate handles,etc. after adding key */
INSERTKEY_FASTR = (1<<3), /* don't realloc mem (or increase count, as array has already been set out) */
INSERTKEY_REPLACE = (1<<4), /* only replace an existing keyframe (this overrides INSERTKEY_NEEDED) */
- INSERTKEY_XYZ2RGB = (1<<5), /* transform F-Curves should have XYZ->RGB color mode */
+ INSERTKEY_XYZ2RGB = (1<<5) /* transform F-Curves should have XYZ->RGB color mode */
} eInsertKeyFlags;
/* ************************************************ */
@@ -874,14 +860,14 @@ typedef enum eAnimData_Flag {
ADT_UI_ACTIVE = (1<<15),
/* F-Curves from this AnimData block are not visible in the Graph Editor */
- ADT_CURVES_NOT_VISIBLE = (1<<16),
+ ADT_CURVES_NOT_VISIBLE = (1<<16)
} eAnimData_Flag;
/* Animation Data recalculation settings (to be set by depsgraph) */
typedef enum eAnimData_Recalc {
ADT_RECALC_DRIVERS = (1<<0),
ADT_RECALC_ANIM = (1<<1),
- ADT_RECALC_ALL = (ADT_RECALC_DRIVERS|ADT_RECALC_ANIM),
+ ADT_RECALC_ALL = (ADT_RECALC_DRIVERS|ADT_RECALC_ANIM)
} eAnimData_Recalc;
/* Base Struct for Anim ------------------------------------- */
diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h
index f7533ff9bde..89c2d69b8be 100644
--- a/source/blender/makesdna/DNA_armature_types.h
+++ b/source/blender/makesdna/DNA_armature_types.h
@@ -57,8 +57,9 @@ typedef struct Bone {
int flag;
float arm_head[3];
- float arm_tail[3]; /* head/tail and roll in Armature Space (rest pos) */
+ float arm_tail[3]; /* head/tail in Armature Space (rest pos) */
float arm_mat[4][4]; /* matrix: (bonemat(b)+head(b))*arm_mat(b-1), rest pos*/
+ float arm_roll; /* roll in Armature Space (rest pos) */
float dist, weight; /* dist, weight: for non-deformgroup deforms */
float xwidth, length, zwidth; /* width: for block bones. keep in this order, transform! */
@@ -68,7 +69,7 @@ typedef struct Bone {
float size[3]; /* patch for upward compat, UNUSED! */
int layer; /* layers that bone appears on */
short segments; /* for B-bones */
- short pad[3];
+ short pad[1];
} Bone;
typedef struct bArmature {
@@ -79,6 +80,12 @@ typedef struct bArmature {
ListBase chainbase;
ListBase *edbo; /* editbone listbase, we use pointer so we can check state */
+ /* active bones should work like active object where possible
+ * - active and selection are unrelated
+ * - active & hidden is not allowed
+ * - from the user perspective active == last selected
+ * - active should be ignored when not visible (hidden layer) */
+
Bone *act_bone; /* active bone (when not in editmode) */
void *act_edbone; /* active editbone (in editmode) */
@@ -89,9 +96,8 @@ typedef struct bArmature {
short deformflag;
short pathflag;
- int pad;
-
- int layer, layer_protected; /* for buttons to work, both variables in this order together */
+ unsigned int layer_used; /* for UI, to show which layers are there */
+ unsigned int layer, layer_protected; /* for buttons to work, both variables in this order together */
// XXX depreceated... old animaton system (armature only viz) ---
short ghostep, ghostsize; /* number of frames to ghosts to show, and step between them */
@@ -116,7 +122,7 @@ typedef enum eArmature_Flag {
ARM_MIRROR_EDIT = (1<<8),
ARM_AUTO_IK = (1<<9),
ARM_NO_CUSTOM = (1<<10), /* made option negative, for backwards compat */
- ARM_COL_CUSTOM = (1<<11), /* draw custom colours */
+ ARM_COL_CUSTOM = (1<<11), /* draw custom colors */
ARM_GHOST_ONLYSEL = (1<<12), /* when ghosting, only show selected bones (this should belong to ghostflag instead) */ // XXX depreceated
ARM_DS_EXPAND = (1<<13)
} eArmature_Flag;
@@ -180,7 +186,7 @@ typedef enum eBone_Flag {
BONE_EDITMODE_LOCKED = (1<<19), /* bone transforms are locked in EditMode */
BONE_TRANSFORM_CHILD = (1<<20), /* Indicates that a parent is also being transformed */
BONE_UNSELECTABLE = (1<<21), /* bone cannot be selected */
- BONE_NO_LOCAL_LOCATION = (1<<22), /* bone location is in armature space */
+ BONE_NO_LOCAL_LOCATION = (1<<22) /* bone location is in armature space */
} eBone_Flag;
#endif
diff --git a/source/blender/makesdna/DNA_boid_types.h b/source/blender/makesdna/DNA_boid_types.h
index c4324612aff..83f8f4d0199 100644
--- a/source/blender/makesdna/DNA_boid_types.h
+++ b/source/blender/makesdna/DNA_boid_types.h
@@ -104,6 +104,8 @@ typedef enum BoidMode {
eBoidMode_Liftoff,
NUM_BOID_MODES
} BoidMode;
+
+
typedef struct BoidData {
float health, acc[3];
short state_id, mode;
diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h
index 1492319fe22..6ddad214af4 100644
--- a/source/blender/makesdna/DNA_brush_types.h
+++ b/source/blender/makesdna/DNA_brush_types.h
@@ -127,6 +127,10 @@ typedef struct Brush {
#define BRUSH_FRONTFACE (1<<27)
#define BRUSH_CUSTOM_ICON (1<<28)
+/* temporary flag which sets up autmatically for correct
+ brush drawing when inverted modal operator is running */
+#define BRUSH_INVERTED (1<<29)
+
/* Brush.sculpt_tool */
#define SCULPT_TOOL_DRAW 1
#define SCULPT_TOOL_SMOOTH 2
diff --git a/source/blender/makesdna/DNA_camera_types.h b/source/blender/makesdna/DNA_camera_types.h
index 3a9c7b22cde..11c8533783e 100644
--- a/source/blender/makesdna/DNA_camera_types.h
+++ b/source/blender/makesdna/DNA_camera_types.h
@@ -78,7 +78,7 @@ typedef struct Camera {
#define CAM_PANORAMA 128
/* yafray: dof sampling switch */
-#define CAM_YF_NO_QMC 512
+/* #define CAM_YF_NO_QMC 512 */ /* depreceated */
#ifdef __cplusplus
diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h
index dbd9be14c0e..275ffd93ae5 100644
--- a/source/blender/makesdna/DNA_constraint_types.h
+++ b/source/blender/makesdna/DNA_constraint_types.h
@@ -94,7 +94,7 @@ typedef struct bConstraintTarget {
/* bConstraintTarget -> flag */
typedef enum B_CONSTRAINT_TARGET_FLAG {
- CONSTRAINT_TAR_TEMP = (1<<0), /* temporary target-struct that needs to be freed after use */
+ CONSTRAINT_TAR_TEMP = (1<<0) /* temporary target-struct that needs to be freed after use */
} B_CONSTRAINT_TARGET_FLAG;
/* bConstraintTarget/bConstraintOb -> type */
@@ -476,7 +476,7 @@ typedef enum eBConstraint_SpaceTypes {
/* for posechannels - local with parent */
CONSTRAINT_SPACE_PARLOCAL, /* = 3 */
/* for files from between 2.43-2.46 (should have been parlocal) */
- CONSTRAINT_SPACE_INVALID, /* = 4. do not exchange for anything! */
+ CONSTRAINT_SPACE_INVALID /* = 4. do not exchange for anything! */
} eBConstraint_SpaceTypes;
/* bConstraintChannel.flag */
@@ -496,7 +496,7 @@ typedef enum eCopyRotation_Flags {
ROTLIKE_X_INVERT = (1<<4),
ROTLIKE_Y_INVERT = (1<<5),
ROTLIKE_Z_INVERT = (1<<6),
- ROTLIKE_OFFSET = (1<<7),
+ ROTLIKE_OFFSET = (1<<7)
} eCopyRotation_Flags;
/* bLocateLikeConstraint.flag */
@@ -509,7 +509,7 @@ typedef enum eCopyLocation_Flags {
LOCLIKE_X_INVERT = (1<<4),
LOCLIKE_Y_INVERT = (1<<5),
LOCLIKE_Z_INVERT = (1<<6),
- LOCLIKE_OFFSET = (1<<7),
+ LOCLIKE_OFFSET = (1<<7)
} eCopyLocation_Flags;
/* bSizeLikeConstraint.flag */
@@ -517,50 +517,50 @@ typedef enum eCopyScale_Flags {
SIZELIKE_X = (1<<0),
SIZELIKE_Y = (1<<1),
SIZELIKE_Z = (1<<2),
- SIZELIKE_OFFSET = (1<<3),
+ SIZELIKE_OFFSET = (1<<3)
} eCopyScale_Flags;
/* bSameVolumeConstraint.flag */
typedef enum eSameVolume_Modes {
SAMEVOL_X = 0,
SAMEVOL_Y,
- SAMEVOL_Z,
+ SAMEVOL_Z
} eSameVolume_Modes;
/* Locked-Axis Values (Locked Track) */
typedef enum eLockAxis_Modes {
LOCK_X = 0,
LOCK_Y,
- LOCK_Z,
+ LOCK_Z
} eLockAxis_Modes;
/* Up-Axis Values (TrackTo and Locked Track) */
typedef enum eUpAxis_Modes {
UP_X = 0,
UP_Y,
- UP_Z,
+ UP_Z
} eUpAxis_Modes;
-/* Tracking axis (TrackTo, Locked Track, Damped Track) */
+/* Tracking axis (TrackTo, Locked Track, Damped Track) and minmax (floor) constraint */
typedef enum eTrackToAxis_Modes {
TRACK_X = 0,
TRACK_Y,
TRACK_Z,
TRACK_nX,
TRACK_nY,
- TRACK_nZ,
+ TRACK_nZ
} eTrackToAxis_Modes;
/* FollowPath flags */
typedef enum eFollowPath_Flags {
FOLLOWPATH_FOLLOW = (1<<0),
FOLLOWPATH_STATIC = (1<<1),
- FOLLOWPATH_RADIUS = (1<<2),
+ FOLLOWPATH_RADIUS = (1<<2)
} eFollowPath_Flags;
/* bTrackToConstraint->flags */
typedef enum eTrackTo_Flags {
- TARGET_Z_UP = (1<<0),
+ TARGET_Z_UP = (1<<0)
} eTrackTo_Flags;
/* Strech To Constraint -> volmode */
@@ -568,14 +568,14 @@ typedef enum eStretchTo_VolMode {
VOLUME_XZ = 0,
VOLUME_X,
VOLUME_Z,
- NO_VOLUME,
+ NO_VOLUME
} eStretchTo_VolMode;
/* Stretch To Constraint -> plane mode */
typedef enum eStretchTo_PlaneMode {
PLANE_X = 0,
PLANE_Y,
- PLANE_Z,
+ PLANE_Z
} eStretchTo_PlaneMode;
/* Clamp-To Constraint ->flag */
@@ -583,12 +583,12 @@ typedef enum eClampTo_Modes {
CLAMPTO_AUTO = 0,
CLAMPTO_X,
CLAMPTO_Y,
- CLAMPTO_Z,
+ CLAMPTO_Z
} eClampTo_Modes;
/* ClampTo Constraint ->flag2 */
typedef enum eClampTo_Flags {
- CLAMPTO_CYCLIC = (1<<0),
+ CLAMPTO_CYCLIC = (1<<0)
} eClampTo_Flags;
/* bKinematicConstraint->flag */
@@ -611,7 +611,7 @@ typedef enum eKinematic_Flags {
CONSTRAINT_IK_NO_ROT_Y = (1<<12),
CONSTRAINT_IK_NO_ROT_Z = (1<<13),
/* axis relative to target */
- CONSTRAINT_IK_TARGETAXIS = (1<<14),
+ CONSTRAINT_IK_TARGETAXIS = (1<<14)
} eKinematic_Flags;
/* bSplineIKConstraint->flag */
@@ -625,7 +625,7 @@ typedef enum eSplineIK_Flags {
/* evenly distribute the bones along the path regardless of length */
CONSTRAINT_SPLINEIK_EVENSPLITS = (1<<3),
/* don't adjust the x and z scaling of the bones by the curve radius */
- CONSTRAINT_SPLINEIK_NO_CURVERAD = (1<<4),
+ CONSTRAINT_SPLINEIK_NO_CURVERAD = (1<<4)
} eSplineIK_Flags;
/* bSplineIKConstraint->xzScaleMode */
@@ -635,14 +635,14 @@ typedef enum eSplineIK_XZScaleModes {
/* bones in the chain should take their x/z scales from the original scaling */
CONSTRAINT_SPLINEIK_XZS_ORIGINAL,
/* x/z scales are the inverse of the y-scale */
- CONSTRAINT_SPLINEIK_XZS_VOLUMETRIC,
+ CONSTRAINT_SPLINEIK_XZS_VOLUMETRIC
} eSplineIK_XZScaleModes;
/* MinMax (floor) flags */
typedef enum eFloor_Flags {
MINMAX_STICKY = (1<<0),
MINMAX_STUCK = (1<<1),
- MINMAX_USEROT = (1<<2),
+ MINMAX_USEROT = (1<<2)
} eFloor_Flags;
/* transform limiting constraints -> flag2 */
@@ -650,7 +650,7 @@ typedef enum eTransformLimits_Flags2 {
/* not used anymore - for older Limit Location constraints only */
LIMIT_NOPARENT = (1<<0),
/* for all Limit constraints - allow to be used during transform? */
- LIMIT_TRANSFORM = (1<<1),
+ LIMIT_TRANSFORM = (1<<1)
} eTransformLimits_Flags2;
/* transform limiting constraints -> flag (own flags) */
@@ -660,33 +660,33 @@ typedef enum eTransformLimits_Flags {
LIMIT_YMIN = (1<<2),
LIMIT_YMAX = (1<<3),
LIMIT_ZMIN = (1<<4),
- LIMIT_ZMAX = (1<<5),
+ LIMIT_ZMAX = (1<<5)
} eTransformLimits_Flags;
/* limit rotation constraint -> flag (own flags) */
typedef enum eRotLimit_Flags {
LIMIT_XROT = (1<<0),
LIMIT_YROT = (1<<1),
- LIMIT_ZROT = (1<<2),
+ LIMIT_ZROT = (1<<2)
} eRotLimit_Flags;
/* distance limit constraint */
/* bDistLimitConstraint->flag */
typedef enum eDistLimit_Flag {
- LIMITDIST_USESOFT = (1<<0),
+ LIMITDIST_USESOFT = (1<<0)
} eDistLimit_Flag;
/* bDistLimitConstraint->mode */
typedef enum eDistLimit_Modes {
LIMITDIST_INSIDE = 0,
LIMITDIST_OUTSIDE,
- LIMITDIST_ONSURFACE,
+ LIMITDIST_ONSURFACE
} eDistLimit_Modes;
/* python constraint -> flag */
typedef enum ePyConstraint_Flags {
PYCON_USETARGETS = (1<<0),
- PYCON_SCRIPTERROR = (1<<1),
+ PYCON_SCRIPTERROR = (1<<1)
} ePyConstraint_Flags;
/* ChildOf Constraint -> flag */
@@ -700,6 +700,7 @@ typedef enum eChildOf_Flags {
CHILDOF_SIZEX = (1<<6),
CHILDOF_SIZEY = (1<<7),
CHILDOF_SIZEZ = (1<<8),
+ CHILDOF_ALL = 511
} eChildOf_Flags;
/* Pivot Constraint */
@@ -720,7 +721,7 @@ typedef enum ePivotConstraint_Axis {
/* consider +ve y-axis rotations */
PIVOTCON_AXIS_Y,
/* consider +ve z-axis rotations */
- PIVOTCON_AXIS_Z,
+ PIVOTCON_AXIS_Z
} ePivotConstraint_Axis;
/* settings for Pivot Constraint in general */
@@ -728,7 +729,7 @@ typedef enum ePivotConstraint_Flag {
/* offset is to be interpreted as being a fixed-point in space */
PIVOTCON_FLAG_OFFSET_ABS = (1<<0),
/* rotation-based activation uses negative rotation to drive result */
- PIVOTCON_FLAG_ROTACT_NEG = (1<<1),
+ PIVOTCON_FLAG_ROTACT_NEG = (1<<1)
} ePivotConstraint_Flag;
/* Rigid-Body Constraint */
diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h
index 50579660806..d66246a4136 100644
--- a/source/blender/makesdna/DNA_curve_types.h
+++ b/source/blender/makesdna/DNA_curve_types.h
@@ -63,8 +63,8 @@ typedef struct PathPoint {
#
#
typedef struct Path {
- int len;
struct PathPoint *data;
+ int len;
float totdist;
} Path;
@@ -171,7 +171,7 @@ typedef struct Curve {
struct BoundBox *bb;
ListBase nurb; /* actual data, called splines in rna */
- ListBase disp;
+ ListBase disp; /* undeformed display list, used mostly for texture space calculation */
EditNurb *editnurb; /* edited data, not in file, use pointer so we can check for it */
@@ -189,11 +189,11 @@ typedef struct Curve {
float rot[3];
short texflag, pad1; /* keep a short because of give_obdata_texspace() */
-
- short drawflag, twist_mode, pad[2];
+ short drawflag, twist_mode;
float twist_smooth, smallcaps_scale;
- short pathlen, totcol;
+ int pathlen;
+ short pad, totcol;
short flag, bevresol;
float width, ext1, ext2;
@@ -314,14 +314,14 @@ typedef enum eBezTriple_Handle {
HD_AUTO,
HD_VECT,
HD_ALIGN,
- HD_AUTO_ANIM, /* not real handle type, but is just used as dummy item for anim code */
+ HD_AUTO_ANIM /* not real handle type, but is just used as dummy item for anim code */
} eBezTriple_Handle;
/* interpolation modes (used only for BezTriple->ipo) */
typedef enum eBezTriple_Interpolation {
BEZT_IPO_CONST = 0, /* constant interpolation */
BEZT_IPO_LIN, /* linear interpolation */
- BEZT_IPO_BEZ, /* bezier interpolation */
+ BEZT_IPO_BEZ /* bezier interpolation */
} eBezTriple_Interpolation;
/* types of keyframe (used only for BezTriple->hide when BezTriple is used in F-Curves) */
@@ -329,6 +329,7 @@ typedef enum eBezTriple_KeyframeType {
BEZT_KEYTYPE_KEYFRAME = 0, /* default - 'proper' Keyframe */
BEZT_KEYTYPE_EXTREME, /* 'extreme' keyframe */
BEZT_KEYTYPE_BREAKDOWN, /* 'breakdown' keyframe */
+ BEZT_KEYTYPE_JITTER, /* 'jitter' keyframe (for adding 'filler' secondary motion) */
} eBezTriple_KeyframeType;
/* checks if the given BezTriple is selected */
diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h
index 313c5634819..1478557d8f2 100644
--- a/source/blender/makesdna/DNA_customdata_types.h
+++ b/source/blender/makesdna/DNA_customdata_types.h
@@ -30,6 +30,10 @@
#ifndef DNA_CUSTOMDATA_TYPES_H
#define DNA_CUSTOMDATA_TYPES_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
/* descriptor and storage for a custom data layer */
typedef struct CustomDataLayer {
int type; /* type of data in layer */
@@ -130,4 +134,8 @@ typedef struct CustomData {
#define MAX_MTFACE 8
#define MAX_MCOL 8
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/makesdna/DNA_fileglobal_types.h b/source/blender/makesdna/DNA_fileglobal_types.h
index ae539a18963..0c3a9429de6 100644
--- a/source/blender/makesdna/DNA_fileglobal_types.h
+++ b/source/blender/makesdna/DNA_fileglobal_types.h
@@ -47,7 +47,8 @@ typedef struct FileGlobal {
struct Scene *curscene;
int fileflags;
int globalf;
-
+ int revision; /* svn revision from buildinfo */
+ int pad;
/* file path where this was saved, for recover */
char filename[240]; /* 240 = FILE_MAX */
} FileGlobal;
diff --git a/source/blender/makesdna/DNA_genfile.h b/source/blender/makesdna/DNA_genfile.h
index 75d21644267..8e00a89af09 100644
--- a/source/blender/makesdna/DNA_genfile.h
+++ b/source/blender/makesdna/DNA_genfile.h
@@ -45,7 +45,7 @@ char *DNA_struct_get_compareflags(struct SDNA *sdna, struct SDNA *newsdna);
void *DNA_struct_reconstruct(struct SDNA *newsdna, struct SDNA *oldsdna, char *compflags, int oldSDNAnr, int blocks, void *data);
int DNA_elem_array_size(const char *astr, int len);
-int DNA_elem_offset(struct SDNA *sdna, char *stype, char *vartype, char *name);
+int DNA_elem_offset(struct SDNA *sdna, const char *stype, const char *vartype, const char *name);
#endif
diff --git a/source/blender/makesdna/DNA_group_types.h b/source/blender/makesdna/DNA_group_types.h
index 61a527dd351..7416f6ea397 100644
--- a/source/blender/makesdna/DNA_group_types.h
+++ b/source/blender/makesdna/DNA_group_types.h
@@ -40,8 +40,8 @@ typedef struct GroupObject {
struct GroupObject *next, *prev;
struct Object *ob;
void *lampren; /* used while render */
- int recalc; /* copy of ob->recalc, used to set animated groups OK */
- int pad;
+ short recalc; /* copy of ob->recalc, used to set animated groups OK */
+ char pad[6];
} GroupObject;
diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h
index d1aa3c00ac4..3df3c8b41c6 100644
--- a/source/blender/makesdna/DNA_image_types.h
+++ b/source/blender/makesdna/DNA_image_types.h
@@ -44,16 +44,20 @@ struct GPUTexture;
/* ImageUser is in Texture, in Nodes, Background Image, Image Window, .... */
/* should be used in conjunction with an ID * to Image. */
typedef struct ImageUser {
+ struct Scene *scene; /* to retrieve render result */
+
int framenr; /* movies, sequences: current to display */
int frames; /* total amount of frames to use */
int offset, sfra; /* offset within movie, start frame in global time */
- short fie_ima, cycl; /* fields/image in movie, cyclic flag */
- short flag, ok;
-
+ char fie_ima, cycl; /* fields/image in movie, cyclic flag */
+ char ok, pad;
+
short multi_index, layer, pass; /* listbase indices, for menu browsing or retrieve buffer */
- short menunr; /* localized menu entry, for handling browse event */
+
+ short flag;
- struct Scene *scene; /* to retrieve render result */
+ int pad2;
+
} ImageUser;
/* iuser->flag */
diff --git a/source/blender/makesdna/DNA_ipo_types.h b/source/blender/makesdna/DNA_ipo_types.h
index b7e15808ff0..d0554a7aaa5 100644
--- a/source/blender/makesdna/DNA_ipo_types.h
+++ b/source/blender/makesdna/DNA_ipo_types.h
@@ -421,10 +421,10 @@ typedef struct Ipo {
#define PART_TOTNAM 25
#define PART_EMIT_FREQ 1
-#define PART_EMIT_LIFE 2
+/* #define PART_EMIT_LIFE 2 */ /*UNUSED*/
#define PART_EMIT_VEL 3
#define PART_EMIT_AVE 4
-#define PART_EMIT_SIZE 5
+/* #define PART_EMIT_SIZE 5 */ /*UNUSED*/
#define PART_AVE 6
#define PART_SIZE 7
diff --git a/source/blender/makesdna/DNA_lamp_types.h b/source/blender/makesdna/DNA_lamp_types.h
index 5231108a756..1028d733c65 100644
--- a/source/blender/makesdna/DNA_lamp_types.h
+++ b/source/blender/makesdna/DNA_lamp_types.h
@@ -140,7 +140,7 @@ typedef struct Lamp {
#define LA_SHAD_RAY 8192
/* yafray: lamp shadowbuffer flag, softlight */
/* Since it is used with LOCAL lamp, can't use LA_SHAD */
-#define LA_YF_SOFT 16384
+/* #define LA_YF_SOFT 16384 */ /* no longer used */
#define LA_LAYER_SHADOW 32768
#define LA_SHAD_TEX (1<<16)
#define LA_SHOW_CONE (1<<17)
diff --git a/source/blender/makesdna/DNA_lattice_types.h b/source/blender/makesdna/DNA_lattice_types.h
index 94fc9fefb66..bf2ada51155 100644
--- a/source/blender/makesdna/DNA_lattice_types.h
+++ b/source/blender/makesdna/DNA_lattice_types.h
@@ -31,6 +31,7 @@
#include "DNA_ID.h"
+struct AnimData;
struct BPoint;
struct Ipo;
struct Key;
@@ -46,17 +47,18 @@ typedef struct EditLatt {
typedef struct Lattice {
ID id;
+ struct AnimData *adt;
short pntsu, pntsv, pntsw, flag;
short opntsu, opntsv, opntsw, pad2;
- char typeu, typev, typew, type;
+ char typeu, typev, typew, pad3;
int pad;
float fu, fv, fw, du, dv, dw;
struct BPoint *def;
- struct Ipo *ipo;
+ struct Ipo *ipo; /* XXX: depreceated... old animation system */
struct Key *key;
struct MDeformVert *dvert;
@@ -75,5 +77,7 @@ typedef struct Lattice {
#define LT_GRID 1
#define LT_OUTSIDE 2
+#define LT_DS_EXPAND 4
+
#endif
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index f8eb6e76693..5a117d59f8a 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -300,6 +300,7 @@ typedef struct Material {
#define TEXCO_TANGENT 4096
/* still stored in vertex->accum, 1 D */
#define TEXCO_STRAND 8192
+#define TEXCO_PARTICLE 8192 /* strand is used for normal materials, particle for halo materials */
#define TEXCO_STRESS 16384
#define TEXCO_SPEED 32768
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h
index 4e41309cff4..853c123e5d7 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -153,9 +153,9 @@ typedef struct TFace {
#define ME_DRAWSHARP (1 << 8)
#define ME_DRAWBWEIGHTS (1 << 9)
-#define ME_DRAW_EDGELEN (1 << 10)
-#define ME_DRAW_FACEAREA (1 << 11)
-#define ME_DRAW_EDGEANG (1 << 12)
+#define ME_DRAWEXTRA_EDGELEN (1 << 10)
+#define ME_DRAWEXTRA_FACEAREA (1 << 11)
+#define ME_DRAWEXTRA_FACEANG (1 << 12)
/* old global flags:
#define G_DRAWEDGES (1 << 18)
diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h
index 6dba547f423..59a1828909b 100644
--- a/source/blender/makesdna/DNA_meshdata_types.h
+++ b/source/blender/makesdna/DNA_meshdata_types.h
@@ -61,8 +61,7 @@ typedef struct MDeformVert {
typedef struct MVert {
float co[3];
short no[3];
- short mat_nr;
- char flag, bweight, pad[2];
+ char flag, bweight;
} MVert;
/* at the moment alpha is abused for vertex painting
diff --git a/source/blender/makesdna/DNA_meta_types.h b/source/blender/makesdna/DNA_meta_types.h
index feadf7cd510..dc0ac7fd80c 100644
--- a/source/blender/makesdna/DNA_meta_types.h
+++ b/source/blender/makesdna/DNA_meta_types.h
@@ -48,7 +48,7 @@ typedef struct MetaElem {
short type, flag, selcol1, selcol2;
float x, y, z; /* Position of center of MetaElem */
- float quat[4]; /* Rotation of MetaElem */
+ float quat[4]; /* Rotation of MetaElem (MUST be kept normalized) */
float expx; /* dimension parameters, used for some types like cubes */
float expy;
float expz;
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 0a3533becc8..6e8367385ed 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -68,9 +68,8 @@ typedef enum ModifierType {
eModifierType_Screw,
/* placeholder, keep this so durian files load in
* trunk with the correct modifier once its merged */
- eModifierType_NavMesh,
eModifierType_Warp,
-
+ eModifierType_NavMesh,
NUM_MODIFIER_TYPES
} ModifierType;
@@ -81,6 +80,7 @@ typedef enum ModifierMode {
eModifierMode_OnCage = (1<<3),
eModifierMode_Expanded = (1<<4),
eModifierMode_Virtual = (1<<5),
+ eModifierMode_ApplyOnSpline = (1<<6),
eModifierMode_DisableTemporary = (1 << 31)
} ModifierMode;
@@ -211,30 +211,32 @@ typedef struct ArrayModifierData {
#define MOD_ARR_FITCURVE 2
/* ArrayModifierData->offset_type */
-#define MOD_ARR_OFF_CONST 1<<0
-#define MOD_ARR_OFF_RELATIVE 1<<1
-#define MOD_ARR_OFF_OBJ 1<<2
+#define MOD_ARR_OFF_CONST (1<<0)
+#define MOD_ARR_OFF_RELATIVE (1<<1)
+#define MOD_ARR_OFF_OBJ (1<<2)
/* ArrayModifierData->flags */
-#define MOD_ARR_MERGE 1<<0
-#define MOD_ARR_MERGEFINAL 1<<1
+#define MOD_ARR_MERGE (1<<0)
+#define MOD_ARR_MERGEFINAL (1<<1)
typedef struct MirrorModifierData {
ModifierData modifier;
- short axis, flag;
+ short axis; /* deprecated, use flag instead */
+ short flag;
float tolerance;
struct Object *mirror_ob;
} MirrorModifierData;
/* MirrorModifierData->flag */
-#define MOD_MIR_CLIPPING 1<<0
-#define MOD_MIR_MIRROR_U 1<<1
-#define MOD_MIR_MIRROR_V 1<<2
-#define MOD_MIR_AXIS_X 1<<3
-#define MOD_MIR_AXIS_Y 1<<4
-#define MOD_MIR_AXIS_Z 1<<5
-#define MOD_MIR_VGROUP 1<<6
+#define MOD_MIR_CLIPPING (1<<0)
+#define MOD_MIR_MIRROR_U (1<<1)
+#define MOD_MIR_MIRROR_V (1<<2)
+#define MOD_MIR_AXIS_X (1<<3)
+#define MOD_MIR_AXIS_Y (1<<4)
+#define MOD_MIR_AXIS_Z (1<<5)
+#define MOD_MIR_VGROUP (1<<6)
+#define MOD_MIR_NO_MERGE (1<<7)
typedef struct EdgeSplitModifierData {
ModifierData modifier;
@@ -244,8 +246,8 @@ typedef struct EdgeSplitModifierData {
} EdgeSplitModifierData;
/* EdgeSplitModifierData->flags */
-#define MOD_EDGESPLIT_FROMANGLE 1<<1
-#define MOD_EDGESPLIT_FROMFLAG 1<<2
+#define MOD_EDGESPLIT_FROMANGLE (1<<1)
+#define MOD_EDGESPLIT_FROMFLAG (1<<2)
typedef struct BevelModifierData {
ModifierData modifier;
@@ -332,7 +334,7 @@ typedef struct UVProjectModifierData {
#define MOD_UVPROJECT_MAXPROJECTORS 10
/* UVProjectModifierData->flags */
-#define MOD_UVPROJECT_OVERRIDEIMAGE 1<<0
+#define MOD_UVPROJECT_OVERRIDEIMAGE (1<<0)
typedef struct DecimateModifierData {
ModifierData modifier;
@@ -341,7 +343,6 @@ typedef struct DecimateModifierData {
int faceCount;
} DecimateModifierData;
-
/* Smooth modifier flags */
#define MOD_SMOOTH_X (1<<1)
#define MOD_SMOOTH_Y (1<<2)
@@ -386,13 +387,13 @@ enum {
};
/* WaveModifierData.flag */
-#define MOD_WAVE_X 1<<1
-#define MOD_WAVE_Y 1<<2
-#define MOD_WAVE_CYCL 1<<3
-#define MOD_WAVE_NORM 1<<4
-#define MOD_WAVE_NORM_X 1<<5
-#define MOD_WAVE_NORM_Y 1<<6
-#define MOD_WAVE_NORM_Z 1<<7
+#define MOD_WAVE_X (1<<1)
+#define MOD_WAVE_Y (1<<2)
+#define MOD_WAVE_CYCL (1<<3)
+#define MOD_WAVE_NORM (1<<4)
+#define MOD_WAVE_NORM_X (1<<5)
+#define MOD_WAVE_NORM_Y (1<<6)
+#define MOD_WAVE_NORM_Z (1<<7)
typedef struct WaveModifierData {
ModifierData modifier;
@@ -550,12 +551,9 @@ typedef struct MeshDeformModifierData {
} MeshDeformModifierData;
typedef enum {
- eParticleSystemFlag_Loaded = (1<<0),
- eParticleSystemFlag_Pars = (1<<1),
- eParticleSystemFlag_FromCurve = (1<<2),
- eParticleSystemFlag_DM_changed = (1<<3),
- eParticleSystemFlag_Disabled = (1<<4),
- eParticleSystemFlag_psys_updated = (1<<5),
+ eParticleSystemFlag_Pars = (1<<0),
+ eParticleSystemFlag_psys_updated = (1<<1),
+ eParticleSystemFlag_file_loaded = (1<<2),
} ParticleSystemModifierFlag;
typedef struct ParticleSystemModifierData {
@@ -728,10 +726,8 @@ typedef struct ScrewModifierData {
#define MOD_SCREW_OBJECT_OFFSET (1<<2)
// #define MOD_SCREW_OBJECT_ANGLE (1<<4)
-
typedef struct NavMeshModifierData {
ModifierData modifier;
-
} NavMeshModifierData;
#endif
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index fe422bfa689..5fbbf4338c4 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -149,7 +149,7 @@ typedef struct bNode {
#define NODE_TEST 256
/* composite: don't do node but pass on buffer(s) */
#define NODE_MUTED 512
-#define NODE_CUSTOM_NAME 1024
+#define NODE_CUSTOM_NAME 1024 /* deprecated! */
typedef struct bNodeLink {
struct bNodeLink *next, *prev;
@@ -216,12 +216,11 @@ typedef struct NodeImageAnim {
typedef struct NodeBlurData {
short sizex, sizey;
- short samples, maxspeed, minspeed, relative;
+ short samples, maxspeed, minspeed, relative, aspect;
+ short curved;
float fac, percentx, percenty;
short filtertype;
char bokeh, gamma;
- short curved;
- short pad;
int image_in_width, image_in_height; /* needed for absolute/relative conversions */
} NodeBlurData;
@@ -336,4 +335,8 @@ typedef struct TexNodeOutput {
#define CMP_NODE_CHANNEL_MATTE_CS_YUV 3
#define CMP_NODE_CHANNEL_MATTE_CS_YCC 4
+#define CMP_NODE_BLUR_ASPECT_NONE 0
+#define CMP_NODE_BLUR_ASPECT_Y 1
+#define CMP_NODE_BLUR_ASPECT_X 2
+
#endif
diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h
index 63a6b8fbe4a..7656ae6372b 100644
--- a/source/blender/makesdna/DNA_object_force.h
+++ b/source/blender/makesdna/DNA_object_force.h
@@ -129,7 +129,9 @@ typedef struct EffectorWeights {
*/
#define BPHYS_DATA_INDEX 0
#define BPHYS_DATA_LOCATION 1
+#define BPHYS_DATA_SMOKE_LOW 1
#define BPHYS_DATA_VELOCITY 2
+#define BPHYS_DATA_SMOKE_HIGH 2
#define BPHYS_DATA_ROTATION 3
#define BPHYS_DATA_AVELOCITY 4 /* used for particles */
#define BPHYS_DATA_XCONST 4 /* used for cloth */
@@ -139,20 +141,41 @@ typedef struct EffectorWeights {
#define BPHYS_TOT_DATA 8
+#define BPHYS_EXTRA_FLUID_SPRINGS 1
+
+typedef struct PTCacheExtra {
+ struct PTCacheExtra *next, *prev;
+ unsigned int type, totdata;
+ void *data;
+} PTCacheExtra;
+
typedef struct PTCacheMem {
struct PTCacheMem *next, *prev;
- int frame, totpoint;
+ unsigned int frame, totpoint;
unsigned int data_types, flag;
- int *index_array; /* quick access to stored points with index */
void *data[8]; /* BPHYS_TOT_DATA */
void *cur[8]; /* BPHYS_TOT_DATA */
+
+ struct ListBase extradata;
} PTCacheMem;
typedef struct PointCache {
struct PointCache *next, *prev;
int flag; /* generic flag */
- int step; /* frames between cached frames */
+
+ int step; /* The number of frames between cached frames.
+ * This should probably be an upper bound for a per point adaptive step in the future,
+ * buf for now it's the same for all points. Without adaptivity this can effect the perceived
+ * simulation quite a bit though. If for example particles are colliding with a horizontal
+ * plane (with high damping) they quickly come to a stop on the plane, however there are still
+ * forces acting on the particle (gravity and collisions), so the particle velocity isn't necessarily
+ * zero for the whole duration of the frame even if the particle seems stationary. If all simulation
+ * frames aren't cached (step > 1) these velocities are interpolated into movement for the non-cached
+ * frames. The result will look like the point is oscillating around the collision location. So for
+ * now cache step should be set to 1 for accurate reproduction of collisions.
+ */
+
int simframe; /* current frame of simulation (only if SIMULATION_VALID) */
int startframe; /* simulation start frame */
int endframe; /* simulation end frame */
@@ -161,12 +184,15 @@ typedef struct PointCache {
/* for external cache files */
int totpoint; /* number of cached points */
- int index, rt; /* modifier stack index */
+ int index; /* modifier stack index */
+ short compression, rt;
char name[64];
char prev_name[64];
char info[64];
char path[240]; /* file path */
+ char *cached_frames; /* array of length endframe-startframe+1 with flags to indicate cached frames */
+ /* can be later used for other per frame flags too if needed */
struct ListBase mem_cache;
struct PTCacheEdit *edit;
@@ -313,7 +339,7 @@ typedef struct SoftBody {
/* pd->flag: various settings */
#define PFIELD_USEMAX 1
-#define PDEFLE_DEFORM 2
+/*#define PDEFLE_DEFORM 2*/ /*UNUSED*/
#define PFIELD_GUIDE_PATH_ADD 4 /* TODO: do_versions for below */
#define PFIELD_PLANAR 8 /* used for do_versions */
#define PDEFLE_KILL_PART 16
@@ -371,6 +397,10 @@ typedef struct SoftBody {
/* PTCACHE_OUTDATED + PTCACHE_FRAMES_SKIPPED */
#define PTCACHE_REDO_NEEDED 258
+#define PTCACHE_COMPRESS_NO 0
+#define PTCACHE_COMPRESS_LZO 1
+#define PTCACHE_COMPRESS_LZMA 2
+
/* ob->softflag */
#define OB_SB_ENABLE 1 /* deprecated, use modifier */
#define OB_SB_GOAL 2
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index f1e0323985f..5245d52226d 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -200,7 +200,7 @@ typedef struct Object {
float bbsize[3];
short index; /* custom index, for renderpasses */
unsigned short actdef; /* current deformation group, note: index starts at 1 */
- float col[4]; /* object color, adjusted via IPO's only */
+ float col[4]; /* object color */
/**
* Settings for game objects
* bit 0: Object has dynamic behaviour
@@ -322,16 +322,15 @@ extern Object workob;
#define PARSLOW 16
/* (short) transflag */
-#define OB_OFFS_LOCAL 1
- // XXX OB_QUAT was never used, but is now depreceated in favour of standard rotation handling...
-#define OB_QUAT 2
+/*#define OB_OFFS_LOCAL 1*/ /*UNUSED*/
+/* #define OB_QUAT 2 */ /* never used, free flag */
#define OB_NEG_SCALE 4
#define OB_DUPLI (8+16+256+512+2048)
#define OB_DUPLIFRAMES 8
#define OB_DUPLIVERTS 16
#define OB_DUPLIROT 32
#define OB_DUPLINOSPEED 64
-#define OB_POWERTRACK 128
+/*#define OB_POWERTRACK 128*/ /*UNUSED*/
#define OB_DUPLIGROUP 256
#define OB_DUPLIFACES 512
#define OB_DUPLIFACES_SCALE 1024
@@ -344,9 +343,9 @@ extern Object workob;
#define OB_DRAWKEY 1
#define OB_DRAWKEYSEL 2
#define OB_OFFS_OB 4
-#define OB_OFFS_MAT 8
-#define OB_OFFS_VKEY 16
-#define OB_OFFS_PATH 32
+/* #define OB_OFFS_MAT 8 */ /*UNUSED*/
+/* #define OB_OFFS_VKEY 16 */ /*UNUSED*/
+/* #define OB_OFFS_PATH 32 */ /*UNUSED*/
#define OB_OFFS_PARENT 64
#define OB_OFFS_PARTICLE 128
/* get ipo from from action or not? */
@@ -403,7 +402,7 @@ extern Object workob;
#define OB_BOUND_CONE 3
#define OB_BOUND_POLYH 4
#define OB_BOUND_POLYT 5
-#define OB_BOUND_DYN_MESH 6
+/* #define OB_BOUND_DYN_MESH 6 */ /*UNUSED*/
#define OB_BOUND_CAPSULE 7
@@ -418,7 +417,7 @@ extern Object workob;
/* NOTE: this was used as a proper setting in past, so nullify before using */
#define BA_TEMP_TAG 32
-#define BA_FROMSET 128
+/* #define BA_FROMSET 128 */ /*UNUSED*/
#define BA_TRANSFORM_CHILD 256 /* child of a transformed object */
#define BA_TRANSFORM_PARENT 8192 /* parent of a transformed object */
@@ -439,7 +438,8 @@ extern Object workob;
#define OB_RECALC_DATA 2
/* time flag is set when time changes need recalc, so baked systems can ignore it */
#define OB_RECALC_TIME 4
-#define OB_RECALC_ALL 7
+ /* only use for matching any flag, NOT as an argument since more flags may be added. */
+#define OB_RECALC_ALL (OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME)
/* controller state */
#define OB_MAX_STATES 30
@@ -479,7 +479,7 @@ extern Object workob;
#define OB_LOCK_RIGID_BODY_Y_ROT_AXIS 64
#define OB_LOCK_RIGID_BODY_Z_ROT_AXIS 128
-#define OB_LIFE (OB_PROP|OB_DYNAMIC|OB_ACTOR|OB_MAINACTOR|OB_CHILD)
+/* #define OB_LIFE (OB_PROP|OB_DYNAMIC|OB_ACTOR|OB_MAINACTOR|OB_CHILD) */
/* ob->body_type */
#define OB_BODY_TYPE_NO_COLLISION 0
@@ -562,6 +562,9 @@ typedef enum ObjectMode {
OB_MODE_POSE = 64
} ObjectMode;
+/* any mode where the brush system is used */
+#define OB_MODE_ALL_PAINT (OB_MODE_SCULPT|OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT)
+
#define MAX_DUPLI_RECUR 8
#ifdef __cplusplus
diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h
index 105fa6d5289..e26414a0d72 100644
--- a/source/blender/makesdna/DNA_particle_types.h
+++ b/source/blender/makesdna/DNA_particle_types.h
@@ -61,6 +61,11 @@ typedef struct BoidParticle {
float rt;
} BoidParticle;
+typedef struct ParticleSpring {
+ float rest_length;
+ unsigned int particle_index[2], delete_flag;
+}ParticleSpring;
+
/* Child particles are created around or between parent particles */
typedef struct ChildParticle {
int num, parent; /* num is face index on the final derived mesh */
@@ -116,12 +121,17 @@ typedef struct ParticleData {
typedef struct SPHFluidSettings {
/*Particle Fluid*/
- float spring_k, radius, rest_length;
+ float spring_k, radius, rest_length, plasticity_constant, yield_ratio;
float viscosity_omega, viscosity_beta;
float stiffness_k, stiffness_knear, rest_density;
float buoyancy;
+ int flag, pad;
} SPHFluidSettings;
+/* fluid->flag */
+#define SPH_VISCOELASTIC_SPRINGS 1
+#define SPH_CURRENT_REST_LENGTH 2
+
typedef struct ParticleSettings {
ID id;
struct AnimData *adt;
@@ -158,12 +168,12 @@ typedef struct ParticleSettings {
/* general values */
float sta, end, lifetime, randlife;
- float timetweak, jitfac, eff_hair;
- int totpart, userjit, grid_res;
+ float timetweak, jitfac, eff_hair, grid_rand;
+ int totpart, userjit, grid_res, rt;
/* initial velocity factors */
float normfac, obfac, randfac, partfac, tanfac, tanphase, reactfac;
- float ob_vel[3], rt;
+ float ob_vel[3];
float avefac, phasefac, randrotfac, randphasefac;
/* physical properties */
float mass, size, randsize, reactshape;
@@ -178,13 +188,17 @@ typedef struct ParticleSettings {
/* clumping */
float clumpfac, clumppow;
/* kink */
- float kink_amp, kink_freq, kink_shape;
+ float kink_amp, kink_freq, kink_shape, kink_flat;
+ float kink_amp_clump;
/* rough */
float rough1, rough1_size;
float rough2, rough2_size, rough2_thres;
float rough_end, rough_end_shape;
/* length */
float clength, clength_thres;
+ /* parting */
+ float parting_fac;
+ float parting_min, parting_max;
/* branching */
float branch_thres;
/* drawing stuff */
@@ -232,8 +246,8 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
float imat[4][4]; /* used for duplicators */
float cfra, tree_frame;
- int seed, rt;
- int flag, totpart, totchild, totcached, totchildcache;
+ int seed, child_seed;
+ int flag, totpart, totunexist, totchild, totcached, totchildcache, rt;
short recalc, target_psys, totkeyed, bakespace;
char bb_uvname[3][32]; /* billboard uv name */
@@ -250,6 +264,9 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
struct ListBase *effectors;
+ ParticleSpring *fluid_springs;
+ int tot_fluidsprings, alloc_fluidsprings;
+
struct KDTree *tree; /* used for interactions with self and other systems */
struct ParticleDrawData *pdd;
@@ -273,7 +290,7 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
/* for dopesheet */
#define PART_DS_EXPAND 8
-#define PART_HAIR_GEOMETRY 16
+#define PART_HAIR_REGROW 16 /* regrow hair for each frame */
#define PART_UNBORN 32 /*show unborn particles*/
#define PART_DIED 64 /*show died particles*/
@@ -287,25 +304,25 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
#define PART_ROT_DYN (1<<14) /* dynamic rotation */
#define PART_SIZEMASS (1<<16)
-//#define PART_HAIR_GRAVITY (1<<15)
+#define PART_HIDE_ADVANCED_HAIR (1<<15)
//#define PART_ABS_TIME (1<<17)
//#define PART_GLOB_TIME (1<<18)
#define PART_BOIDS_2D (1<<19)
-#define PART_BRANCHING (1<<20)
-#define PART_ANIM_BRANCHING (1<<21)
-#define PART_SYMM_BRANCHING (1<<24)
+//#define PART_BRANCHING (1<<20)
+//#define PART_ANIM_BRANCHING (1<<21)
+//#define PART_SYMM_BRANCHING (1<<24)
#define PART_HAIR_BSPLINE 1024
#define PART_GRID_INVERT (1<<26)
-#define PART_CHILD_EFFECT (1<<27)
-#define PART_CHILD_SEAMS (1<<28)
-#define PART_CHILD_RENDER (1<<29)
-#define PART_CHILD_GUIDE (1<<30)
+#define PART_CHILD_EFFECT (1<<27)
+#define PART_CHILD_LONG_HAIR (1<<28)
+/* #define PART_CHILD_RENDER (1<<29) */ /*UNUSED*/
+#define PART_CHILD_GUIDE (1<<30)
#define PART_SELF_EFFECT (1<<22)
@@ -442,7 +459,7 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
#define PSYS_ENABLED 16 /* deprecated */
#define PSYS_HAIR_UPDATED 32 /* signal for updating hair particle mode */
#define PSYS_DRAWING 64
-//#define PSYS_SOFT_BAKE 128
+#define PSYS_USE_IMAT 128
#define PSYS_DELETE 256 /* remove particlesystem as soon as possible */
#define PSYS_HAIR_DONE 512
#define PSYS_KEYED 1024
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 094a065145e..348afac766a 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -221,8 +221,8 @@ typedef struct RenderData {
float edgeR, edgeG, edgeB;
short fullscreen, xplay, yplay, freqplay; /* standalone player */ // XXX deprecated since 2.5
- short depth, attrib, rt2; /* standalone player */ // XXX deprecated since 2.5
- short frame_step; /* frames to jump during render/playback */
+ short depth, attrib; /* standalone player */ // XXX deprecated since 2.5
+ int frame_step; /* frames to jump during render/playback */
short stereomode; /* standalone player stereo settings */ // XXX deprecated since 2.5
@@ -458,13 +458,14 @@ typedef struct GameData {
* bit 3: (gameengine): Activity culling is enabled.
* bit 5: (gameengine) : enable Bullet DBVT tree for view frustrum culling
*/
- short mode, flag, matmode/*, pad[2]*/;
+ short mode, flag, matmode, pad[2];
short occlusionRes; /* resolution of occlusion Z buffer in pixel */
short physicsEngine;
short ticrate, maxlogicstep, physubstep, maxphystep;
short obstacleSimulation;
float levelHeight;
+
/* standalone player */
struct GameFraming framing;
short fullscreen, xplay, yplay, freqplay;
@@ -472,8 +473,8 @@ typedef struct GameData {
/* stereo/dome mode */
struct GameDome dome;
- short stereoflag, stereomode, xsch, ysch; //xsch and ysch can be deleted !!!
- float eyeseparation;
+ short stereoflag, stereomode, xsch, ysch; //xsch and ysch used for backwards compat.
+ float eyeseparation, pad1;
RecastData recastData;
} GameData;
@@ -517,7 +518,8 @@ typedef struct GameData {
#define GAME_GLSL_NO_EXTRA_TEX (1 << 11)
#define GAME_IGNORE_DEPRECATION_WARNINGS (1 << 12)
#define GAME_ENABLE_ANIMATION_RECORD (1 << 13)
-#define GAME_SHOW_OBSTACLE_SIMULATION (1 << 14)
+#define GAME_SHOW_MOUSE (1 << 14)
+#define GAME_SHOW_OBSTACLE_SIMULATION (1 << 15)
/* GameData.matmode */
#define GAME_MAT_TEXFACE 0
@@ -683,8 +685,11 @@ typedef struct ToolSettings {
short uvcalc_mapalign;
short uvcalc_flag;
short uv_flag, uv_selectmode;
- short uv_pad[2];
-
+ short uv_pad;
+
+ /* Grease Pencil */
+ short gpencil_flags;
+
/* Auto-IK */
short autoik_chainlen;
@@ -769,8 +774,10 @@ typedef struct bStats {
typedef struct UnitSettings {
/* Display/Editing unit options for each scene */
float scale_length; /* maybe have other unit conversions? */
- short system;
- short flag; /* imperial, metric etc */
+ char system; /* imperial, metric etc */
+ char system_rotation; /* not implimented as a propper unit system yet */
+ short flag;
+
} UnitSettings;
typedef struct PhysicsSettings {
@@ -786,7 +793,6 @@ typedef struct Scene {
struct World *world;
struct Scene *set;
- struct Image *ima;
ListBase base;
struct Base *basact; /* active base */
@@ -798,7 +804,7 @@ typedef struct Scene {
unsigned int lay; /* bitflags for layer visibility */
int layact; /* active layer */
- int pad1;
+ unsigned int customdata_mask; /* XXX. runtime flag for drawing, actually belongs in the window, only used by object_handle_update() */
short flag; /* various settings */
@@ -830,7 +836,7 @@ typedef struct Scene {
short dagisvalid, dagflags;
short recalc; /* recalc = counterpart of ob->recalc */
- short jumpframe;
+ short pad6;
int pad5;
/* User-Defined KeyingSets */
@@ -854,12 +860,6 @@ typedef struct Scene {
/* **************** RENDERDATA ********************* */
-/* bufflag */
-#define R_BACKBUF 1
-#define R_BACKBUFANIM 2
-#define R_FRONTBUF 4
-#define R_FRONTBUFANIM 8
-
/* flag */
/* use preview range */
#define SCER_PRV_RANGE (1<<0)
@@ -877,7 +877,7 @@ typedef struct Scene {
#define R_BORDER 0x0200
#define R_PANORAMA 0x0400 /* deprecated as scene option, still used in renderer */
#define R_CROP 0x0800
-#define R_COSMO 0x1000
+/*#define R_COSMO 0x1000 deprecated */
#define R_ODDFIELD 0x2000
#define R_MBLUR 0x4000
/* unified was here */
@@ -885,7 +885,7 @@ typedef struct Scene {
/* R_GAUSS is obsolete, but used to retrieve setting from old files */
#define R_GAUSS 0x20000
/* fbuf obsolete... */
-#define R_FBUF 0x40000
+/*#define R_FBUF 0x40000*/
/* threads obsolete... is there for old files, now use for autodetect threads */
#define R_THREADS 0x80000
/* Use the same flag for autothreads */
@@ -906,7 +906,7 @@ typedef struct Scene {
#define R_OUTPUT_SCREEN 0
#define R_OUTPUT_AREA 1
#define R_OUTPUT_WINDOW 2
-#define R_OUTPUT_FORKED 3
+/*#define R_OUTPUT_FORKED 3*/
/* filtertype */
#define R_FILTER_BOX 0
@@ -950,10 +950,10 @@ typedef struct Scene {
#define R_COMP_FREE 0x0800
#define R_NO_IMAGE_LOAD 0x1000
#define R_NO_TEX 0x2000
-#define R_STAMP_INFO 0x4000 /* deprecated */
+#define R_NO_FRAME_UPDATE 0x4000
#define R_FULL_SAMPLE 0x8000
-#define R_DEPRECATED 0x10000
-#define R_RECURS_PROTECTION 0x20000
+/* #define R_DEPRECATED 0x10000 */
+/* #define R_RECURS_PROTECTION 0x20000 */
#define R_TEXNODE_PREVIEW 0x40000
/* r->stamp */
@@ -968,7 +968,8 @@ typedef struct Scene {
#define R_STAMP_FILENAME 0x0100
#define R_STAMP_SEQSTRIP 0x0200
#define R_STAMP_RENDERTIME 0x0400
-#define R_STAMP_ALL (R_STAMP_TIME|R_STAMP_FRAME|R_STAMP_DATE|R_STAMP_CAMERA|R_STAMP_SCENE|R_STAMP_NOTE|R_STAMP_MARKER|R_STAMP_FILENAME|R_STAMP_SEQSTRIP|R_STAMP_RENDERTIME)
+#define R_STAMP_CAMERALENS 0x0800
+#define R_STAMP_ALL (R_STAMP_TIME|R_STAMP_FRAME|R_STAMP_DATE|R_STAMP_CAMERA|R_STAMP_SCENE|R_STAMP_NOTE|R_STAMP_MARKER|R_STAMP_FILENAME|R_STAMP_SEQSTRIP|R_STAMP_RENDERTIME|R_STAMP_CAMERALENS)
/* alphamode */
#define R_ADDSKY 0
@@ -989,7 +990,7 @@ typedef struct Scene {
/* #define R_HAMX 2 */ /* hamx is nomore */
/* #define R_FTYPE 3 */ /* ftype is nomore */
#define R_JPEG90 4
-#define R_MOVIE 5
+/*#define R_MOVIE 5*/ /* movie is nomore */
#define R_IRIZ 7
#define R_RAWTGA 14
#define R_AVIRAW 15
@@ -1064,6 +1065,7 @@ typedef struct Scene {
#define TESTBASELIB_BGMODE(v3d, scene, base) ( ((base)->flag & SELECT) && ((base)->lay & (v3d ? v3d->lay : scene->lay)) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
#define BASE_EDITABLE_BGMODE(v3d, scene, base) (((base)->lay & (v3d ? v3d->lay : scene->lay)) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
#define BASE_SELECTABLE(v3d, base) ((base->lay & v3d->lay) && (base->object->restrictflag & (OB_RESTRICT_SELECT|OB_RESTRICT_VIEW))==0)
+#define BASE_VISIBLE(v3d, base) ((base->lay & v3d->lay) && (base->object->restrictflag & OB_RESTRICT_VIEW)==0)
#define FIRSTBASE scene->base.first
#define LASTBASE scene->base.last
#define BASACT (scene->basact)
@@ -1074,7 +1076,6 @@ typedef struct Scene {
#define ID_NEW_US2(a) if( ((ID *)a)->newid) {(a)= ((ID *)a)->newid; ((ID *)a)->us++;}
#define CFRA (scene->r.cfra)
#define SUBFRA (scene->r.subframe)
-#define F_CFRA ((float)(scene->r.cfra))
#define SFRA (scene->r.sfra)
#define EFRA (scene->r.efra)
#define PRVRANGEON (scene->r.flag & SCER_PRV_RANGE)
@@ -1183,8 +1184,9 @@ typedef enum SculptFlags {
/* ImagePaintSettings.flag */
#define IMAGEPAINT_DRAWING 1
-#define IMAGEPAINT_DRAW_TOOL 2
-#define IMAGEPAINT_DRAW_TOOL_DRAWING 4
+// #define IMAGEPAINT_DRAW_TOOL 2 // deprecated
+// #define IMAGEPAINT_DRAW_TOOL_DRAWING 4 // deprecated
+
/* projection painting only */
#define IMAGEPAINT_PROJECT_DISABLE 8 /* Non projection 3D painting */
#define IMAGEPAINT_PROJECT_XRAY 16
@@ -1196,7 +1198,7 @@ typedef enum SculptFlags {
/* toolsettings->uvcalc_flag */
#define UVCALC_FILLHOLES 1
-#define UVCALC_NO_ASPECT_CORRECT 2 /* would call this UVCALC_ASPECT_CORRECT, except it should be default with old file */
+/*#define UVCALC_NO_ASPECT_CORRECT 2*/ /* would call this UVCALC_ASPECT_CORRECT, except it should be default with old file */
#define UVCALC_TRANSFORM_CORRECT 4 /* adjust UV's while transforming to avoid distortion */
/* toolsettings->uv_flag */
@@ -1216,13 +1218,16 @@ typedef enum SculptFlags {
#define EDGE_MODE_TAG_CREASE 3
#define EDGE_MODE_TAG_BEVEL 4
+/* toolsettings->gpencil_flags */
+#define GP_TOOL_FLAG_PAINTSESSIONS_ON (1<<0)
+
/* toolsettings->particle flag */
#define PE_KEEP_LENGTHS 1
#define PE_LOCK_FIRST 2
#define PE_DEFLECT_EMITTER 4
#define PE_INTERPOLATE_ADDED 8
#define PE_DRAW_PART 16
-#define PE_X_MIRROR 64 /* deprecated */
+/* #define PE_X_MIRROR 64 */ /* deprecated */
#define PE_FADE_TIME 128
#define PE_AUTO_VELOCITY 256
@@ -1251,10 +1256,10 @@ typedef enum SculptFlags {
#define RETOPO 1
#define RETOPO_PAINT 2
-/* toolsettings->retopo_paint_tool */
-#define RETOPO_PEN 1
-#define RETOPO_LINE 2
-#define RETOPO_ELLIPSE 4
+/* toolsettings->retopo_paint_tool */ /*UNUSED*/
+/* #define RETOPO_PEN 1 */
+/* #define RETOPO_LINE 2 */
+/* #define RETOPO_ELLIPSE 4 */
/* toolsettings->skgen_options */
#define SKGEN_FILTER_INTERNAL (1 << 0)
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index a811fd9c014..52d8b2e8dd9 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -54,7 +54,11 @@ typedef struct bScreen {
struct Scene *scene;
struct Scene *newscene; /* temporary when switching */
- short full; /* fade out? */
+ int redraws_flag; /* user-setting for which editors get redrawn during anim playback (used to be time->redraws) */
+ int pad1;
+
+ short full; /* temp screen for image render display or fileselect */
+ short temp; /* temp screen in a temp window, don't save (like user prefs) */
short winid; /* winid from WM, starts with 1 */
short do_draw; /* notifier for drawing edges */
short do_refresh; /* notifier for scale screen, changed screen, etc */
@@ -66,7 +70,7 @@ typedef struct bScreen {
short mainwin; /* screensize subwindow, for screenedges and global menus */
short subwinactive; /* active subwindow */
- int pad2;
+ short pad;
struct wmTimer *animtimer; /* if set, screen has timer handler added in window */
void *context; /* context callback */
@@ -187,20 +191,20 @@ typedef struct ARegion {
#define HEADERDOWN 1
#define HEADERTOP 2
-#define SCREENNORMAL 0
-#define SCREENFULL 1
-#define SCREENAUTOPLAY 2
-#define SCREENTEMP 3
+/* screen->full */
+#define SCREENNORMAL 0
+#define SCREENFULL 1
+#define SCREENFULLTEMP 2
/* Panel->snap - for snapping to screen edges */
#define PNL_SNAP_NONE 0
-#define PNL_SNAP_TOP 1
-#define PNL_SNAP_RIGHT 2
-#define PNL_SNAP_BOTTOM 4
-#define PNL_SNAP_LEFT 8
+/* #define PNL_SNAP_TOP 1 */
+/* #define PNL_SNAP_RIGHT 2 */
+#define PNL_SNAP_BOTTOM 4
+/* #define PNL_SNAP_LEFT 8 */
-#define PNL_SNAP_DIST 9.0
+/* #define PNL_SNAP_DIST 9.0 */
/* paneltype flag */
#define PNL_DEFAULT_CLOSED 1
@@ -214,6 +218,7 @@ typedef struct ARegion {
#define SCREEN_HANDLER_VERSE 3
/* regiontype, first two are the default set */
+/* Do NOT change order, append on end. Types are hardcoded needed */
enum {
RGN_TYPE_WINDOW = 0,
RGN_TYPE_HEADER,
diff --git a/source/blender/makesdna/DNA_sdna_types.h b/source/blender/makesdna/DNA_sdna_types.h
index f2bdfeff9dd..8e291035be7 100644
--- a/source/blender/makesdna/DNA_sdna_types.h
+++ b/source/blender/makesdna/DNA_sdna_types.h
@@ -38,7 +38,7 @@ typedef struct SDNA {
int datalen; /* length of data */
int nr_names; /* total number of struct members */
- char **names; /* struct member names */
+ const char **names; /* struct member names */
int pointerlen; /* size of a pointer in bytes */
diff --git a/source/blender/makesdna/DNA_sensor_types.h b/source/blender/makesdna/DNA_sensor_types.h
index d7256b5b9e0..d2f6eb11952 100644
--- a/source/blender/makesdna/DNA_sensor_types.h
+++ b/source/blender/makesdna/DNA_sensor_types.h
@@ -207,6 +207,14 @@ typedef struct bJoystickSensor {
#define SENS_RAY_NEG_Z_AXIS 5
//#define SENS_RAY_NEGATIVE_AXIS 1
+/* bRadarSensor->axis */
+#define SENS_RADAR_X_AXIS 0
+#define SENS_RADAR_Y_AXIS 1
+#define SENS_RADAR_Z_AXIS 2
+#define SENS_RADAR_NEG_X_AXIS 3
+#define SENS_RADAR_NEG_Y_AXIS 4
+#define SENS_RADAR_NEG_Z_AXIS 5
+
/* bMessageSensor->type */
#define SENS_MESG_MESG 0
#define SENS_MESG_PROP 1
diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h
index d51dec97351..4fcf7bd6250 100644
--- a/source/blender/makesdna/DNA_sequence_types.h
+++ b/source/blender/makesdna/DNA_sequence_types.h
@@ -42,6 +42,7 @@ struct bSound;
typedef struct StripElem {
char name[80];
+ int orig_width, orig_height;
} StripElem;
typedef struct StripCrop {
@@ -81,7 +82,6 @@ typedef struct Strip {
int startstill, endstill;
StripElem *stripdata;
char dir[160];
- int orx, ory;
StripProxy *proxy;
StripCrop *crop;
StripTransform *transform;
@@ -232,6 +232,8 @@ typedef struct SpeedControlVars {
int lastValidFrame;
} SpeedControlVars;
+#define SELECT 1
+
/* Editor->over_flag */
#define SEQ_EDIT_OVERLAY_SHOW 1
#define SEQ_EDIT_OVERLAY_ABS 2
diff --git a/source/blender/makesdna/DNA_smoke_types.h b/source/blender/makesdna/DNA_smoke_types.h
index b8be51b378f..0482c19e189 100644
--- a/source/blender/makesdna/DNA_smoke_types.h
+++ b/source/blender/makesdna/DNA_smoke_types.h
@@ -35,6 +35,7 @@
#define MOD_SMOKE_DISSOLVE_LOG (1<<3) /* using 1/x for dissolve */
#define MOD_SMOKE_HIGH_SMOOTH (1<<5) /* smoothens high res emission*/
+#define MOD_SMOKE_FILE_LOAD (1<<6) /* flag for file load */
/* noise */
#define MOD_SMOKE_NOISEWAVE (1<<0)
@@ -86,6 +87,8 @@ typedef struct SmokeDomainSettings {
int v3dnum;
int cache_comp;
int cache_high_comp;
+
+ /* Smoke uses only one cache from now on (index [0]), but keeping the array for now for reading old files. */
struct PointCache *point_cache[2]; /* definition is in DNA_object_force.h */
struct ListBase ptcaches[2];
struct EffectorWeights *effector_weights;
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index ce038ee4a95..287dcf433eb 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -84,11 +84,20 @@ typedef struct SpaceInfo {
short blockhandler[8]; /* XXX depricate this */
- struct bScreen *screen; /* browse screen */
- struct Scene *scene; /* browse scene */
+ char rpt_mask;
+ char pad[7];
} SpaceInfo;
+/* SpaceInfo.rpt_mask */
+enum {
+ INFO_RPT_DEBUG = 1<<0,
+ INFO_RPT_INFO = 1<<1,
+ INFO_RPT_OP = 1<<2,
+ INFO_RPT_WARN = 1<<3,
+ INFO_RPT_ERR = 1<<4,
+};
+
/* 'Graph' Editor (formerly known as the IPO Editor) */
typedef struct SpaceIpo {
SpaceLink *next, *prev;
@@ -126,7 +135,8 @@ typedef struct SpaceButs {
short mainb, mainbo, mainbuser; /* context tabs */
short re_align, align; /* align for panels */
short preview; /* preview is signal to refresh */
- char flag, pad[3];
+ short texture_context; /* texture context selector (material, world, brush)*/
+ char flag, pad;
void *path; /* runtime */
int pathflag, dataicon; /* runtime */
@@ -157,7 +167,7 @@ typedef struct SpaceSeq {
} SpaceSeq;
typedef struct FileSelectParams {
- char title[24]; /* title, also used for the text of the execute button */
+ char title[32]; /* title, also used for the text of the execute button */
char dir[240]; /* directory */
char file[80]; /* file */
char renamefile[80];
@@ -231,9 +241,8 @@ typedef struct SpaceOops {
/* search stuff */
char search_string[32];
struct TreeStoreElem search_tse;
- int search_flags, do_;
-
- short flag, outlinevis, storeflag, pad;
+
+ short flag, outlinevis, storeflag, search_flags;
} SpaceOops;
typedef struct SpaceImage {
@@ -241,34 +250,30 @@ typedef struct SpaceImage {
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
- float blockscale;
- short blockhandler[8];
-
+ int flag;
+
struct Image *image;
struct ImageUser iuser;
+ struct CurveMapping *cumap;
- struct CurveMapping *cumap;
- short menunr, imanr, pad2;
+ struct Scopes scopes; /* histogram waveform and vectorscope */
+ struct Histogram sample_line_hist; /* sample line histogram */
+
+ struct bGPdata *gpd; /* grease pencil data */
+
+ float cursor[2]; /* UV editor 2d cursor */
+ float xof, yof; /* user defined offset, image is centered */
+ float zoom; /* user defined zoom level */
+ float centx, centy; /* storage for offset while render drawing */
+
short curtile; /* the currently active tile of the image when tile is enabled, is kept in sync with the active faces tile */
- int flag;
- short imtypenr, lock;
- short pin, pad3;
+ short imtypenr;
+ short lock;
+ short pin;
char dt_uv; /* UV draw type */
char sticky; /* sticky selection type */
char dt_uvstretch;
char around;
- float cursor[2]; /* UV editor 2d cursor */
-
- float xof, yof; /* user defined offset, image is centered */
- float zoom, pad4; /* user defined zoom level */
- float centx, centy; /* storage for offset while render drawing */
-
- struct bGPdata *gpd; /* grease pencil data */
-
- struct Scopes scopes; /* histogram waveform and vectorscope */
-
- struct Histogram sample_line_hist; /* sample line histogram */
-
} SpaceImage;
typedef struct SpaceNla {
@@ -318,6 +323,8 @@ typedef struct SpaceText {
char findstr[256]; /* ST_MAX_FIND_STR */
char replacestr[256]; /* ST_MAX_FIND_STR */
+
+ void *drawcache; /* cache for faster drawing */
} SpaceText;
typedef struct Script {
@@ -334,9 +341,6 @@ typedef struct Script {
char scriptarg[256];
} Script;
#define SCRIPT_SET_NULL(_script) _script->py_draw = _script->py_event = _script->py_button = _script->py_browsercallback = _script->py_globaldict = NULL; _script->flags = 0;
-#define SCRIPT_RUNNING 0x01
-#define SCRIPT_GUI 0x02
-#define SCRIPT_FILESEL 0x04
typedef struct SpaceScript {
SpaceLink *next, *prev;
@@ -351,15 +355,11 @@ typedef struct SpaceScript {
void *but_refs;
} SpaceScript;
+# /* Only store the data array in the cache to avoid constant reallocation. */
+# /* No need to store when saved. */
typedef struct SpaceTimeCache {
struct SpaceTimeCache *next, *prev;
- int type;
- int flag;
-
float *array;
- int len;
- int startframe, endframe;
- int ok;
} SpaceTimeCache;
typedef struct SpaceTime {
@@ -373,7 +373,7 @@ typedef struct SpaceTime {
ListBase caches;
int cache_display, pad;
- int flag, redraws;
+ int flag, redraws; /* redraws is deprecated... moved to screen */
} SpaceTime;
@@ -397,8 +397,9 @@ typedef struct SpaceNode {
float mx, my; /* mousepos for drawing socketless link */
struct bNodeTree *nodetree, *edittree;
- int treetype; /* treetype: as same nodetree->type */
- short texfrom, pad; /* texfrom object, world or brush */
+ int treetype; /* treetype: as same nodetree->type */
+ short texfrom; /* texfrom object, world or brush */
+ short recalc; /* currently on 0/1, for auto compo */
struct bGPdata *gpd; /* grease-pencil data */
} SpaceNode;
@@ -406,6 +407,9 @@ typedef struct SpaceNode {
/* snode->flag */
#define SNODE_BACKDRAW 2
#define SNODE_DISPGP 4
+#define SNODE_USE_ALPHA 8
+#define SNODE_SHOW_ALPHA 16
+#define SNODE_AUTO_RENDER 32
/* snode->texfrom */
#define SNODE_TEX_OBJECT 0
@@ -507,21 +511,6 @@ enum {
CONSOLE_LINE_ERROR
};
-/* SpaceConsole.rpt_mask */
-enum {
- CONSOLE_TYPE_PYTHON=0,
- CONSOLE_TYPE_REPORT,
-};
-
-/* SpaceConsole.type see BKE_report.h */
-enum {
- CONSOLE_RPT_DEBUG = 1<<0,
- CONSOLE_RPT_INFO = 1<<1,
- CONSOLE_RPT_OP = 1<<2,
- CONSOLE_RPT_WARN = 1<<3,
- CONSOLE_RPT_ERR = 1<<4,
-};
-
typedef struct SpaceConsole {
SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
@@ -531,9 +520,7 @@ typedef struct SpaceConsole {
short blockhandler[8]; // XXX are these needed?
/* space vars */
- int type; /* console/report/..? */
- int rpt_mask; /* which reports to display */
- int flag, lheight;
+ int lheight, pad;
ListBase scrollback; /* ConsoleLine; output */
ListBase history; /* ConsoleLine; command history, current edited line is the first */
@@ -641,10 +628,15 @@ typedef struct SpaceSound {
/* sbuts->flag */
#define SB_PRV_OSA 1
#define SB_PIN_CONTEXT 2
-#define SB_WORLD_TEX 4
-#define SB_BRUSH_TEX 8
+//#define SB_WORLD_TEX 4 //not used anymore
+//#define SB_BRUSH_TEX 8 //not used anymore
#define SB_SHADING_CONTEXT 16
+/* sbuts->texture_context */
+#define SB_TEXC_MAT_OR_LAMP 0
+#define SB_TEXC_WORLD 1
+#define SB_TEXC_BRUSH 2
+
/* sbuts->align */
#define BUT_FREE 0
#define BUT_HORIZONTAL 1
@@ -716,7 +708,7 @@ enum FileSortTypeE {
#define EDITING (1<<0)
#define ACTIVEFILE (1<<1)
#define BLENDERFILE (1<<2)
-#define PSXFILE (1<<3)
+#define BLENDERFILE_BACKUP (1<<3)
#define IMAGEFILE (1<<4)
#define MOVIEFILE (1<<5)
#define PYSCRIPTFILE (1<<6)
@@ -747,35 +739,35 @@ enum FileSortTypeE {
#define SI_STICKY_VERTEX 2
/* SpaceImage->flag */
-#define SI_BE_SQUARE 1<<0
-#define SI_EDITTILE 1<<1
-#define SI_CLIP_UV 1<<2
-#define SI_DRAWTOOL 1<<3
-#define SI_DEPRECATED1 1<<4 /* stick UVs to others in the same location */
-#define SI_DRAWSHADOW 1<<5
-#define SI_SELACTFACE 1<<6 /* deprecated */
-#define SI_DEPRECATED2 1<<7
-#define SI_DEPRECATED3 1<<8 /* stick UV selection to mesh vertex (UVs wont always be touching) */
-#define SI_COORDFLOATS 1<<9
-#define SI_PIXELSNAP 1<<10
-#define SI_LIVE_UNWRAP 1<<11
-#define SI_USE_ALPHA 1<<12
-#define SI_SHOW_ALPHA 1<<13
-#define SI_SHOW_ZBUF 1<<14
+#define SI_BE_SQUARE (1<<0)
+#define SI_EDITTILE (1<<1)
+#define SI_CLIP_UV (1<<2)
+#define SI_DRAWTOOL (1<<3)
+#define SI_DEPRECATED1 (1<<4) /* stick UVs to others in the same location */
+#define SI_DRAWSHADOW (1<<5)
+#define SI_SELACTFACE (1<<6) /* deprecated */
+#define SI_DEPRECATED2 (1<<7)
+#define SI_DEPRECATED3 (1<<8) /* stick UV selection to mesh vertex (UVs wont always be touching) */
+#define SI_COORDFLOATS (1<<9)
+#define SI_PIXELSNAP (1<<10)
+#define SI_LIVE_UNWRAP (1<<11)
+#define SI_USE_ALPHA (1<<12)
+#define SI_SHOW_ALPHA (1<<13)
+#define SI_SHOW_ZBUF (1<<14)
/* next two for render window dislay */
-#define SI_PREVSPACE 1<<15
-#define SI_FULLWINDOW 1<<16
-#define SI_DEPRECATED4 1<<17
-#define SI_DEPRECATED5 1<<18
+#define SI_PREVSPACE (1<<15)
+#define SI_FULLWINDOW (1<<16)
+#define SI_DEPRECATED4 (1<<17)
+#define SI_DEPRECATED5 (1<<18)
/* this means that the image is drawn until it reaches the view edge,
* in the image view, its unrelated to the 'tile' mode for texface */
-#define SI_DRAW_TILE 1<<19
-#define SI_SMOOTH_UV 1<<20
-#define SI_DRAW_STRETCH 1<<21
-#define SI_DISPGP 1<<22
-#define SI_DRAW_OTHER 1<<23
+#define SI_DRAW_TILE (1<<19)
+#define SI_SMOOTH_UV (1<<20)
+#define SI_DRAW_STRETCH (1<<21)
+#define SI_DISPGP (1<<22)
+#define SI_DRAW_OTHER (1<<23)
-#define SI_COLOR_CORRECTION 1<<24
+#define SI_COLOR_CORRECTION (1<<24)
/* SpaceIpo->flag (Graph Editor Settings) */
/* OLD DEPRECEATED SETTING */
@@ -803,6 +795,8 @@ enum FileSortTypeE {
#define SIPO_TEMP_NEEDCHANSYNC (1<<10)
/* don't perform realtime updates */
#define SIPO_NOREALTIMEUPDATES (1<<11)
+ /* don't draw curves with AA ("beauty-draw") for performance */
+#define SIPO_BEAUTYDRAW_OFF (1<<12)
/* SpaceIpo->mode (Graph Editor Mode) */
enum {
@@ -860,12 +854,6 @@ enum {
#define B_IMASELHOME 451
#define B_IMASELREMOVEBIP 452
-#define C_BACK 0xBAAAAA
-#define C_DARK 0x665656
-#define C_DERK 0x766666
-#define C_HI 0xCBBBBB
-#define C_LO 0x544444
-
/* nla->flag */
/* flags (1<<0), (1<<1), and (1<<3) are depreceated flags from old blenders */
/* draw timing in seconds instead of frames */
@@ -885,7 +873,7 @@ enum {
/* only keyframes from active/selected channels get shown */
#define TIME_ONLYACTSEL 4
-/* time->redraws */
+/* time->redraws (now screen->redraws_flag) */
#define TIME_REGION 1
#define TIME_ALL_3D_WIN 2
#define TIME_ALL_ANIM_WIN 4
@@ -933,6 +921,7 @@ enum {
/* space types, moved from DNA_screen_types.h */
+/* Do NOT change order, append on end. types are hardcoded needed */
enum {
SPACE_EMPTY,
SPACE_VIEW3D,
diff --git a/source/blender/makesdna/DNA_text_types.h b/source/blender/makesdna/DNA_text_types.h
index d89d15fa302..82de3fc1833 100644
--- a/source/blender/makesdna/DNA_text_types.h
+++ b/source/blender/makesdna/DNA_text_types.h
@@ -48,7 +48,7 @@ typedef struct TextMarker {
int lineno, start, end, pad1; /* line number and start/end character indices */
int group, flags; /* see BKE_text.h for flag defines */
- char color[4], pad[4]; /* draw color of the marker */
+ unsigned char color[4], pad[4]; /* draw color of the marker */
} TextMarker;
typedef struct Text {
diff --git a/source/blender/makesdna/DNA_texture_types.h b/source/blender/makesdna/DNA_texture_types.h
index e9e058cbbd6..41eebca821c 100644
--- a/source/blender/makesdna/DNA_texture_types.h
+++ b/source/blender/makesdna/DNA_texture_types.h
@@ -34,6 +34,10 @@
#include "DNA_ID.h"
#include "DNA_image_types.h" /* ImageUser */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct AnimData;
struct Ipo;
struct PluginTex;
@@ -220,7 +224,7 @@ typedef struct Tex {
float vn_mexp;
short vn_distm, vn_coltype;
- short noisedepth, noisetype;
+ short noisedepth, noisetype; /* noisedepth MUST be <= 30 else we get floating point exceptions */
/* newnoise: noisebasis type for clouds/marble/etc, noisebasis2 only used for distorted noise */
short noisebasis, noisebasis2;
@@ -450,7 +454,11 @@ typedef struct TexMapping {
#define MTEX_VIEWSPACE 16
#define MTEX_DUPLI_MAPTO 32
#define MTEX_OB_DUPLI_ORIG 64
-#define MTEX_NEW_BUMP 128
+#define MTEX_COMPAT_BUMP 128
+#define MTEX_3TAP_BUMP 256
+#define MTEX_5TAP_BUMP 512
+#define MTEX_BUMP_OBJECTSPACE 1024
+#define MTEX_BUMP_TEXTURESPACE 2048
/* blendtype */
#define MTEX_BLEND 0
@@ -548,11 +556,17 @@ typedef struct TexMapping {
#define TEX_VD_RAW_16BIT 2
#define TEX_VD_IMAGE_SEQUENCE 3
#define TEX_VD_SMOKE 4
+/* for voxels which use VoxelData->source_path */
+#define TEX_VD_IS_SOURCE_PATH(_format) (ELEM3(_format, TEX_VD_BLENDERVOXEL, TEX_VD_RAW_8BIT, TEX_VD_RAW_16BIT))
/* smoke data types */
#define TEX_VD_SMOKEDENSITY 0
#define TEX_VD_SMOKEHEAT 1
#define TEX_VD_SMOKEVEL 2
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 52e82eb743d..d8ab447b93a 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -35,6 +35,10 @@
#include "DNA_listBase.h"
#include "DNA_texture_types.h" /* ColorBand */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
/* themes; defines in BIF_resource.h */
struct ColorBand;
@@ -45,7 +49,7 @@ struct ColorBand;
/* default uifont_id offered by Blender */
#define UIFONT_DEFAULT 0
-#define UIFONT_BITMAP 1
+/*#define UIFONT_BITMAP 1*/ /*UNUSED*/
/* free slots */
#define UIFONT_CUSTOM1 2
#define UIFONT_CUSTOM2 3
@@ -84,6 +88,7 @@ typedef struct uiFontStyle {
/* this is fed to the layout engine and widget code */
+
typedef struct uiStyle {
struct uiStyle *next, *prev;
@@ -154,13 +159,13 @@ typedef struct ThemeSpace {
/* main window colors */
char back[4];
char title[4];
- char text[4];
+ char text[4];
char text_hi[4];
/* header colors */
char header[4];
char header_title[4];
- char header_text[4];
+ char header_text[4];
char header_text_hi[4];
/* button/tool regions */
@@ -172,7 +177,7 @@ typedef struct ThemeSpace {
/* listview regions */
char list[4];
char list_title[4];
- char list_text[4];
+ char list_text[4];
char list_text_hi[4];
/* float panel */
@@ -195,6 +200,7 @@ typedef struct ThemeSpace {
char edge_seam[4], edge_sharp[4], edge_facesel[4], edge_crease[4];
char face[4], face_select[4]; // solid faces
char face_dot[4]; // selected color
+ char extra_edge_len[4], extra_face_angle[4], extra_face_area[4], pad3[4];
char normal[4];
char vertex_normal[4];
char bone_solid[4], bone_pose[4];
@@ -344,7 +350,7 @@ typedef struct UserDef {
short tw_hotspot, tw_flag, tw_handlesize, tw_size;
short textimeout,texcollectrate;
short wmdrawmethod; /* removed wmpad */
- short pad2;
+ short dragthreshold;
int memcachelimit;
int prefetchframes;
short frameserverport;
@@ -372,6 +378,9 @@ typedef struct UserDef {
short autokey_mode; /* autokeying mode */
short autokey_flag; /* flags for autokeying */
+
+ short text_render, pad9; /*options for text rendering*/
+ float pad10;
struct ColorBand coba_weight; /* from texture.h */
@@ -396,16 +405,16 @@ extern UserDef U; /* from blenkernel blender.c */
/* flag */
#define USER_AUTOSAVE (1 << 0)
-#define USER_AUTOGRABGRID (1 << 1) /* deprecated */
-#define USER_AUTOROTGRID (1 << 2) /* deprecated */
-#define USER_AUTOSIZEGRID (1 << 3) /* deprecated */
+/*#define USER_AUTOGRABGRID (1 << 1) deprecated */
+/*#define USER_AUTOROTGRID (1 << 2) deprecated */
+/*#define USER_AUTOSIZEGRID (1 << 3) deprecated */
#define USER_SCENEGLOBAL (1 << 4)
#define USER_TRACKBALL (1 << 5)
-#define USER_DUPLILINK (1 << 6)
-#define USER_FSCOLLUM (1 << 7)
+/*#define USER_DUPLILINK (1 << 6) deprecated */
+/*#define USER_FSCOLLUM (1 << 7) deprecated */
#define USER_MAT_ON_OB (1 << 8)
/*#define USER_NO_CAPSLOCK (1 << 9)*/ /* not used anywhere */
-#define USER_VIEWMOVE (1 << 10)
+/*#define USER_VIEWMOVE (1 << 10)*/ /* not used anywhere */
#define USER_TOOLTIPS (1 << 11)
#define USER_TWOBUTTONMOUSE (1 << 12)
#define USER_NONUMPAD (1 << 13)
@@ -421,6 +430,7 @@ extern UserDef U; /* from blenkernel blender.c */
#define USER_FILENOUI (1 << 23)
#define USER_NONEGFRAMES (1 << 24)
#define USER_TXT_TABSTOSPACES_DISABLE (1 << 25)
+#define USER_TOOLTIPS_PYTHON (1 << 26)
/* helper macro for checking frame clamping */
#define FRAMENUMBER_MIN_CLAMP(cfra) \
@@ -442,10 +452,10 @@ extern UserDef U; /* from blenkernel blender.c */
#define USER_DRAWVIEWINFO (1 << 4)
#define USER_PLAINMENUS (1 << 5) // old EVTTOCONSOLE print ghost events, here for tuhopuu compat. --phase
// old flag for hide pulldown was here
-#define USER_FLIPFULLSCREEN (1 << 7)
+/*#define USER_FLIPFULLSCREEN (1 << 7)*/ /* deprecated */
#define USER_ALLWINCODECS (1 << 8)
#define USER_MENUOPENAUTO (1 << 9)
-#define USER_PANELPINNED (1 << 10) /* deprecated */
+/*#define USER_PANELPINNED (1 << 10) deprecated */
#define USER_AUTOPERSP (1 << 11)
#define USER_LOCKAROUND (1 << 12)
#define USER_GLOBALUNDO (1 << 13)
@@ -464,6 +474,8 @@ extern UserDef U; /* from blenkernel blender.c */
#define USER_ZOOM_INVERT (1 << 25)
#define USER_ZOOM_DOLLY_HORIZ (1 << 26)
#define USER_SPLASH_DISABLE (1 << 27)
+#define USER_HIDE_RECENT (1 << 28)
+#define USER_SHOW_THUMBNAILS (1 << 29)
/* Auto-Keying mode */
/* AUTOKEY_ON is a bitflag */
@@ -480,20 +492,20 @@ extern UserDef U; /* from blenkernel blender.c */
#define AUTOKEY_FLAG_INSERTNEEDED (1<<1)
#define AUTOKEY_FLAG_AUTOMATKEY (1<<2)
#define AUTOKEY_FLAG_XYZ2RGB (1<<3)
- /* U.autokey_flag (strictly autokeying only) */
+
+/* toolsettings->autokey_flag */
#define AUTOKEY_FLAG_ONLYKEYINGSET (1<<6)
- /* toolsettings->autokey_flag */
#define ANIMRECORD_FLAG_WITHNLA (1<<10)
/* transopts */
#define USER_TR_TOOLTIPS (1 << 0)
#define USER_TR_BUTTONS (1 << 1)
#define USER_TR_MENUS (1 << 2)
-#define USER_TR_FILESELECT (1 << 3)
-#define USER_TR_TEXTEDIT (1 << 4)
+/*#define USER_TR_FILESELECT (1 << 3) deprecated*/
+/*#define USER_TR_TEXTEDIT (1 << 4) deprecated*/
#define USER_DOTRANSLATE (1 << 5)
#define USER_USETEXTUREFONT (1 << 6)
-#define CONVERT_TO_UTF8 (1 << 7)
+/*#define CONVERT_TO_UTF8 (1 << 7) deprecated*/
/* dupflag */
#define USER_DUP_MESH (1 << 0)
@@ -510,7 +522,7 @@ extern UserDef U; /* from blenkernel blender.c */
#define USER_DUP_PSYS (1 << 11)
/* gameflags */
-#define USER_DEPRECATED_FLAG 1
+// #define USER_DEPRECATED_FLAG 1
// #define USER_DISABLE_SOUND 2 deprecated, don't use without checking for
// backwards compatibilty in do_versions!
#define USER_DISABLE_MIPMAP 4
@@ -524,6 +536,9 @@ extern UserDef U; /* from blenkernel blender.c */
#define USER_DRAW_AUTOMATIC 3
#define USER_DRAW_OVERLAP_FLIP 4
+/* text draw options*/
+#define USER_TEXT_DISABLE_AA (1 << 0)
+
/* tw_flag (transform widget) */
/* gp_settings (Grease Pencil Settings) */
@@ -558,4 +573,8 @@ extern UserDef U; /* from blenkernel blender.c */
#define TH_OLDSKOOL 3
#define TH_SHADED 4
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/makesdna/DNA_vec_types.h b/source/blender/makesdna/DNA_vec_types.h
index 5d6f1039ed5..b5e3dff7db9 100644
--- a/source/blender/makesdna/DNA_vec_types.h
+++ b/source/blender/makesdna/DNA_vec_types.h
@@ -43,7 +43,7 @@ typedef struct vec2f {
} vec2f;
/* not used at the moment */
-#if 0
+/*
typedef struct vec2i {
int x, y;
} vec2i;
@@ -75,7 +75,7 @@ typedef struct vec4f {
typedef struct vec4d {
double x, y, z, w;
} vec4d;
-#endif
+*/
typedef struct rcti {
int xmin, xmax;
diff --git a/source/blender/makesdna/DNA_vfont_types.h b/source/blender/makesdna/DNA_vfont_types.h
index 0ea60c732cf..e342ef1cd79 100644
--- a/source/blender/makesdna/DNA_vfont_types.h
+++ b/source/blender/makesdna/DNA_vfont_types.h
@@ -55,5 +55,6 @@ typedef struct VFont {
#define FO_PAGEDOWN 9
#define FO_SELCHANGE 10
+#define FO_BUILTIN_NAME "<builtin>"
#endif
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index f692c80f81f..d429f55eb6c 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -89,14 +89,16 @@ typedef struct RegionView3D {
/* transform widget matrix */
float twmat[4][4];
-
- float viewquat[4], dist, zfac; /* zfac is initgrabz() result */
- float camdx, camdy; /* camera view offsets, 1.0 = viewplane moves entire width/height */
- float pixsize;
- float ofs[3];
- short camzoom, viewbut;
+
+ float viewquat[4]; /* view rotation, must be kept normalized */
+ float dist; /* distance from 'ofs' along -viewinv[2] vector, where result is negative as is 'ofs' */
+ float zfac; /* initgrabz() result */
+ float camdx, camdy; /* camera view offsets, 1.0 = viewplane moves entire width/height */
+ float pixsize; /* runtime only */
+ float ofs[3]; /* view center & orbit pivot, negative of worldspace location */
+ short camzoom;
short twdrawflag;
- short pad;
+ int pad;
short rflag, viewlock;
short persp;
@@ -120,7 +122,7 @@ typedef struct RegionView3D {
/* last view */
float lviewquat[4];
- short lpersp, lview;
+ short lpersp, lview; /* lpersp can never be set to 'RV3D_CAMOB' */
float gridview;
float twangle[3];
@@ -139,7 +141,7 @@ typedef struct View3D {
float viewquat[4], dist, pad1; /* XXX depricated */
- int lay_used; /* used while drawing */
+ unsigned int lay_used; /* used while drawing */
short persp; /* XXX depricated */
short view; /* XXX depricated */
@@ -153,13 +155,14 @@ typedef struct View3D {
char ob_centre_bone[32]; /* optional string for armature bone to define center */
- int lay, layact;
+ unsigned int lay;
+ int layact;
/**
* The drawing mode for the 3d display. Set to OB_WIRE, OB_SOLID,
* OB_SHADED or OB_TEXTURE */
short drawtype;
- short pad2;
+ short ob_centre_cursor; /* optional bool for 3d cursor to define center */
short scenelock, around, pad3;
short flag, flag2;
@@ -167,7 +170,7 @@ typedef struct View3D {
float lens, grid;
float gridview; /* XXX deprecated, now in RegionView3D */
- float padf, near, far;
+ float near, far;
float ofs[3]; /* XXX deprecated */
float cursor[3];
@@ -181,9 +184,6 @@ typedef struct View3D {
short twtype, twmode, twflag;
short twdrawflag; /* XXX deprecated */
- /* customdata flags from modes */
- unsigned int customdata_mask;
-
/* afterdraw, for xray & transparent */
struct ListBase afterdraw_transp;
struct ListBase afterdraw_xray;
@@ -202,20 +202,13 @@ typedef struct View3D {
} View3D;
-/* XXX this needs cleaning */
/* View3D->flag (short) */
-#define V3D_MODE (16+32+64+128+256+512)
-#define V3D_DISPIMAGE 1
+/*#define V3D_DISPIMAGE 1*/ /*UNUSED*/
#define V3D_DISPBGPICS 2
#define V3D_HIDE_HELPLINES 4
#define V3D_INVALID_BACKBUF 8
-#define V3D_EDITMODE 16
-#define V3D_VERTEXPAINT 32
-#define V3D_FACESELECT 64
-#define V3D_POSEMODE 128
-#define V3D_TEXTUREPAINT 256
-#define V3D_WEIGHTPAINT 512
+
#define V3D_ALIGN 1024
#define V3D_SELECT_OUTLINE 2048
#define V3D_ZBUF_SELECT 4096
@@ -228,7 +221,6 @@ typedef struct View3D {
#define RV3D_CAMOB 2
/* RegionView3d->rflag */
-#define RV3D_FLYMODE 2
#define RV3D_CLIPPING 4
#define RV3D_NAVIGATING 8
#define RV3D_GPULIGHT_UPDATE 16
@@ -293,7 +285,7 @@ typedef struct View3D {
/* USE = user setting, DRAW = based on selection */
#define V3D_USE_MANIPULATOR 1
#define V3D_DRAW_MANIPULATOR 2
-#define V3D_CALC_MANIPULATOR 4
+/* #define V3D_CALC_MANIPULATOR 4 */ /*UNUSED*/
/* BGPic->flag */
/* may want to use 1 for select ?*/
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index e6d0772f425..f47ea06645b 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -81,16 +81,20 @@ typedef enum ReportType {
enum ReportListFlags {
RPT_PRINT = 1,
RPT_STORE = 2,
- RPT_FREE = 4,
+ RPT_FREE = 4
};
+#
+#
typedef struct Report {
struct Report *next, *prev;
short type; /* ReportType */
short flag;
int len; /* strlen(message), saves some time calculating the word wrap */
- char *typestr;
- char *message;
+ const char *typestr;
+ const char *message;
} Report;
+
+/* saved in the wm, dont remove */
typedef struct ReportList {
ListBase list;
int printlevel; /* ReportType */
@@ -100,6 +104,8 @@ typedef struct ReportList {
} ReportList;
/* timer customdata to control reports display */
+#
+#
typedef struct ReportTimerInfo {
float col[3];
float greyscale;
@@ -140,8 +146,8 @@ typedef struct wmWindowManager {
} wmWindowManager;
/* wmWindowManager.initialized */
-#define WM_INIT_WINDOW 1<<0
-#define WM_INIT_KEYMAP 1<<1
+#define WM_INIT_WINDOW (1<<0)
+#define WM_INIT_KEYMAP (1<<1)
/* the savable part, rest of data is local in ghostwinlay */
typedef struct wmWindow {
@@ -163,9 +169,10 @@ typedef struct wmWindow {
short monitor; /* multiscreen... no idea how to store yet */
short active; /* set to 1 if an active window, for quick rejects */
short cursor; /* current mouse cursor type */
- short lastcursor; /* for temp waitcursor */
+ short lastcursor; /* previous cursor when setting modal one */
+ short modalcursor; /* the current modal cursor */
short addmousemove; /* internal: tag this for extra mousemove event, makes cursors/buttons active on UI switching */
- short pad2[2];
+ short pad2;
struct wmEvent *eventstate; /* storage for event system */
@@ -222,7 +229,7 @@ typedef struct wmKeyMapItem {
/* runtime */
short maptype; /* keymap editor */
- short id; /* unique identifier */
+ short id; /* unique identifier. Positive for kmi that override builtins, negative otherwise */
short pad;
struct PointerRNA *ptr; /* rna pointer to access properties */
} wmKeyMapItem;
@@ -307,7 +314,7 @@ typedef struct wmOperator {
typedef enum wmRadialControlMode {
WM_RADIALCONTROL_SIZE,
WM_RADIALCONTROL_STRENGTH,
- WM_RADIALCONTROL_ANGLE,
+ WM_RADIALCONTROL_ANGLE
} wmRadialControlMode;
#endif /* DNA_WINDOWMANAGER_TYPES_H */
diff --git a/source/blender/makesdna/DNA_world_types.h b/source/blender/makesdna/DNA_world_types.h
index 42c80f4b8b5..68b3c32db97 100644
--- a/source/blender/makesdna/DNA_world_types.h
+++ b/source/blender/makesdna/DNA_world_types.h
@@ -140,7 +140,7 @@ typedef struct World {
/* mode */
#define WO_MIST 1
#define WO_STARS 2
-#define WO_DOF 4
+/*#define WO_DOF 4*/
#define WO_ACTIVITY_CULLING 8
#define WO_ENV_LIGHT 16
#define WO_DBVT_CULLING 32
diff --git a/source/blender/makesdna/Makefile b/source/blender/makesdna/Makefile
deleted file mode 100644
index f83a6288e8d..00000000000
--- a/source/blender/makesdna/Makefile
+++ /dev/null
@@ -1,39 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-# This module does not build normal .o's, but a DNA.c file, to be
-# compiled with the rest of the sources. To speed things up a little,
-# the compilation is done here.
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/makesdna
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/makesdna/intern/CMakeLists.txt b/source/blender/makesdna/intern/CMakeLists.txt
index d42289e17c4..ba9e7d30e80 100644
--- a/source/blender/makesdna/intern/CMakeLists.txt
+++ b/source/blender/makesdna/intern/CMakeLists.txt
@@ -1,3 +1,4 @@
+# -*- mode: cmake; indent-tabs-mode: t; -*-
# $Id$
# ***** BEGIN GPL LICENSE BLOCK *****
#
@@ -24,30 +25,41 @@
#
# ***** END GPL LICENSE BLOCK *****
-INCLUDE_DIRECTORIES(../../../../intern/guardedalloc ..)
-FILE(GLOB INC_FILES ../*.h)
+# message(STATUS "Configuring makesdna")
+
+blender_include_dirs(
+ ../../../../intern/guardedalloc
+ ..
+)
# Build makesdna executable
-SET(SRC
+set(SRC
makesdna.c
../../../../intern/guardedalloc/intern/mallocn.c
)
-IF(WIN32)
- LIST(APPEND SRC ../../../../intern/guardedalloc/intern/mmap_win.c)
-ENDIF(WIN32)
+if(WIN32 AND NOT UNIX)
+ list(APPEND SRC
+ ../../../../intern/guardedalloc/intern/mmap_win.c
+ )
+endif()
-ADD_EXECUTABLE(makesdna ${SRC} ${INC_FILES})
+# SRC_DNA_INC is defined in the parent dir
+
+add_executable(makesdna ${SRC} ${SRC_DNA_INC})
# Output dna.c
-ADD_CUSTOM_COMMAND(
+add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dna.c
COMMAND ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/makesdna ${CMAKE_CURRENT_BINARY_DIR}/dna.c ${CMAKE_SOURCE_DIR}/source/blender/makesdna/
DEPENDS makesdna
)
# Build bf_dna library
-SET(SRC dna_genfile.c dna.c)
-BLENDERLIB(bf_dna "${SRC}" "${INC}")
+set(SRC
+ dna_genfile.c
+ dna.c
+ ${SRC_DNA_INC}
+)
-MESSAGE(STATUS "Configuring makesdna")
+blender_add_lib(bf_dna "${SRC}" "${INC}")
diff --git a/source/blender/makesdna/intern/Makefile b/source/blender/makesdna/intern/Makefile
deleted file mode 100644
index 55b0c42acda..00000000000
--- a/source/blender/makesdna/intern/Makefile
+++ /dev/null
@@ -1,87 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = dna
-DIR = $(OCGDIR)/blender/makesdna
-CSRCS = DNA.c $(wildcard dna_*.c)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I..
-
-ifeq ($(OS),windows)
- # Windows needs these extra libs because of winstuff... It is not
- # _really_ needed, but it is the easiest fix for now. If you have
- # some spare time, try to trace down the exact dep. Then again, you
- # could also spend that time making the sdna system more robust.
- ifneq ($(FREE_WINDOWS),true)
- WINLIBS = kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
- WINLIBS += advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
- WINLIBS += winmm.lib opengl32.lib glu32.lib largeint.lib
- WINLIBS += /link /nodefaultlib:libc
- else
- LDFLAGS += -mwindows -mno-cygwin
- endif
-endif
-
-ifeq ($(OS), darwin)
- LDFLAGS += -arch $(MACOSX_ARCHITECTURE) #-isysroot $(MACOSX_SDK) -mmacosx-version-min=$(MACOSX_MIN_VERS)
-endif
-
-clean::
- @$(RM) $(DIR)/makesdna* $(DIR)/DNA.c
- @$(RM) $(DIR)/debug/makesdna* $(DIR)/debug/DNA.c
-
-# TODO include right .mk for ldflags
-
-# A small note: we do not use the debug version of the alloc lib. That
-# is done quite intentionally. If there is a bug in that lib, it needs
-# to be fixed by the module maintainer.
-DNAOBJS = $(filter-out %DNA.o, $(OBJS))
-
-$(DIR)/$(DEBUG_DIR)makesdna: $(DNAOBJS) $(DIR)/$(DEBUG_DIR)makesdna.o $(NAN_GUARDEDALLOC)/lib/libguardedalloc.a
- $(CC) $(LDFLAGS) -o $@ $^
-
-$(DIR)/$(DEBUG_DIR)DNA.c: $(DIR)/$(DEBUG_DIR)makesdna
- ifeq ($(OS),windows)
- $(SRCHOME)/tools/cygwin/cl_wrapper.pl - $(DIR)/$(DEBUG_DIR)makesdna \
- $(DIR)/$(DEBUG_DIR)DNA.c
- else
- $(DIR)/$(DEBUG_DIR)makesdna $(DIR)/$(DEBUG_DIR)DNA.c
- endif
-
-$(DIR)/$(DEBUG_DIR)makesdna.o: makesdna.c $(wildcard ../*.h)
- $(CC) -c $(CFLAGS) $(CPPFLAGS) makesdna.c -o $@
-
diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c
index fd98fd4ef08..c103e74ca34 100644
--- a/source/blender/makesdna/intern/dna_genfile.c
+++ b/source/blender/makesdna/intern/dna_genfile.c
@@ -43,7 +43,7 @@
/* gcc 4.1 on mingw was complaining that __int64 was already defined
actually is saw the line below as typedef long long long long...
-Anyhow, since its already defined, its safe to do an ifndef here- Cambpell*/
+Anyhow, since its already defined, its safe to do an ifndef here- Campbell */
#ifdef FREE_WINDOWS
#ifndef __int64
typedef long long __int64;
@@ -196,7 +196,7 @@ void DNA_sdna_free(SDNA *sdna)
MEM_freeN(sdna);
}
-static int ispointer(char *name)
+static int ispointer(const char *name)
{
/* check if pointer or function pointer */
return (name[0]=='*' || (name[0]=='(' && name[1]=='*'));
@@ -206,7 +206,7 @@ static int elementsize(SDNA *sdna, short type, short name)
/* call with numbers from struct-array */
{
int mul, namelen, len;
- char *cp;
+ const char *cp;
cp= sdna->names[name];
len= 0;
@@ -251,7 +251,7 @@ static void printstruct(SDNA *sdna, short strnr)
}
#endif
-static short *findstruct_name(SDNA *sdna, char *str)
+static short *findstruct_name(SDNA *sdna, const char *str)
{
int a;
short *sp=0;
@@ -502,7 +502,7 @@ static void recurs_test_compflags(SDNA *sdna, char *compflags, int structnr)
{
int a, b, typenr, elems;
short *sp;
- char *cp;
+ const char *cp;
/* check all structs, test if it's inside another struct */
sp= sdna->structs[structnr];
@@ -546,7 +546,7 @@ char *DNA_struct_get_compareflags(SDNA *sdna, SDNA *newsdna)
*/
int a, b;
short *spold, *spcur;
- char *str1, *str2;
+ const char *str1, *str2;
char *compflags;
if(sdna->nr_structs==0) {
@@ -627,7 +627,7 @@ char *DNA_struct_get_compareflags(SDNA *sdna, SDNA *newsdna)
return compflags;
}
-static void cast_elem(char *ctype, char *otype, char *name, char *curdata, char *olddata)
+static void cast_elem(char *ctype, char *otype, const char *name, char *curdata, char *olddata)
{
double val = 0.0;
int arrlen, curlen=1, oldlen=1, ctypenr, otypenr;
@@ -721,7 +721,7 @@ static void cast_elem(char *ctype, char *otype, char *name, char *curdata, char
}
}
-static void cast_pointer(int curlen, int oldlen, char *name, char *curdata, char *olddata)
+static void cast_pointer(int curlen, int oldlen, const char *name, char *curdata, char *olddata)
{
#ifdef WIN32
__int64 lval;
@@ -764,7 +764,7 @@ static void cast_pointer(int curlen, int oldlen, char *name, char *curdata, char
}
}
-static int elem_strcmp(char *name, char *oname)
+static int elem_strcmp(const char *name, const char *oname)
{
int a=0;
@@ -780,10 +780,10 @@ static int elem_strcmp(char *name, char *oname)
return 0;
}
-static char *find_elem(SDNA *sdna, char *type, char *name, short *old, char *olddata, short **sppo)
+static char *find_elem(SDNA *sdna, const char *type, const char *name, short *old, char *olddata, short **sppo)
{
int a, elemcount, len;
- char *otype, *oname;
+ const char *otype, *oname;
/* without arraypart, so names can differ: return old namenr and type */
@@ -811,7 +811,7 @@ static char *find_elem(SDNA *sdna, char *type, char *name, short *old, char *old
return 0;
}
-static void reconstruct_elem(SDNA *newsdna, SDNA *oldsdna, char *type, char *name, char *curdata, short *old, char *olddata)
+static void reconstruct_elem(SDNA *newsdna, SDNA *oldsdna, char *type, const char *name, char *curdata, short *old, char *olddata)
{
/* rules: test for NAME:
- name equal:
@@ -823,7 +823,8 @@ static void reconstruct_elem(SDNA *newsdna, SDNA *oldsdna, char *type, char *nam
can I force this?)
*/
int a, elemcount, len, array, oldsize, cursize, mul;
- char *otype, *oname, *cp;
+ char *otype;
+ const char *oname, *cp;
/* is 'name' an array? */
cp= name;
@@ -868,6 +869,10 @@ static void reconstruct_elem(SDNA *newsdna, SDNA *oldsdna, char *type, char *nam
mul= len/oldsize;
mul*= (cursize < oldsize)? cursize: oldsize;
memcpy(curdata, olddata, mul);
+
+ /* terminate strings */
+ if(oldsize > cursize && strcmp(type, "char")==0)
+ curdata[mul-1]= 0;
}
else {
if(cursize>oldsize) cast_elem(type, otype, oname, curdata, olddata);
@@ -888,7 +893,8 @@ static void reconstruct_struct(SDNA *newsdna, SDNA *oldsdna, char *compflags, in
*/
int a, elemcount, elen, eleno, mul, mulo, firststructtypenr;
short *spo, *spc, *sppo;
- char *name, *nameo, *type, *cpo, *cpc;
+ char *type, *cpo, *cpc;
+ const char *name, *nameo;
if(oldSDNAnr== -1) return;
if(curSDNAnr== -1) return;
@@ -965,7 +971,8 @@ void DNA_struct_switch_endian(SDNA *oldsdna, int oldSDNAnr, char *data)
*/
int a, mul, elemcount, elen, elena, firststructtypenr;
short *spo, *spc, skip;
- char *name, *type, *cpo, *cur, cval;
+ char *type, *cpo, *cur, cval;
+ const char *name;
if(oldSDNAnr== -1) return;
firststructtypenr= *(oldsdna->structs[0]);
@@ -1095,7 +1102,7 @@ void *DNA_struct_reconstruct(SDNA *newsdna, SDNA *oldsdna, char *compflags, int
return cur;
}
-int DNA_elem_offset(SDNA *sdna, char *stype, char *vartype, char *name)
+int DNA_elem_offset(SDNA *sdna, const char *stype, const char *vartype, const char *name)
{
int SDNAnr= DNA_struct_find_nr(sdna, stype);
diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c
index 577b18556c8..7762ce170df 100644
--- a/source/blender/makesdna/intern/makesdna.c
+++ b/source/blender/makesdna/intern/makesdna.c
@@ -62,7 +62,7 @@
/* Included the path relative from /source/blender/ here, so we can move */
/* headers around with more freedom. */
-char *includefiles[] = {
+const char *includefiles[] = {
// if you add files here, please add them at the end
// of makesdna.c (this file) as well
@@ -162,7 +162,7 @@ int additional_slen_offset;
/**
* Add type <str> to struct indexed by <len>, if it was not yet found.
*/
-int add_type(char *str, int len);
+int add_type(const char *str, int len);
/**
* Add variable <str> to
@@ -214,7 +214,7 @@ void printStructLenghts(void);
/* ************************* MAKEN DNA ********************** */
-int add_type(char *str, int len)
+int add_type(const char *str, int len)
{
int nr;
char *cp;
@@ -244,7 +244,7 @@ int add_type(char *str, int len)
if(nr_types>=maxnr) {
printf("too many types\n");
- return nr_types-1;;
+ return nr_types-1;
}
nr_types++;
@@ -269,7 +269,7 @@ int add_name(char *str)
additional_slen_offset = 0;
- if((str[0]==0) /* || (str[1]==0) */) return -1;
+ if(str[0]==0 /* || (str[1]==0) */) return -1;
if (str[0] == '(' && str[1] == '*') {
/* we handle function pointer and special array cases here, e.g.
@@ -281,7 +281,6 @@ int add_name(char *str)
if (debugSDNA > 3) printf("\t\t\t\t*** Function pointer or multidim array pointer found\n");
/* functionpointer: transform the type (sometimes) */
i = 0;
- j = 0;
while (str[i] != ')') {
buf[i] = str[i];
diff --git a/source/blender/makesrna/CMakeLists.txt b/source/blender/makesrna/CMakeLists.txt
index ec48240bfc5..540597da578 100644
--- a/source/blender/makesrna/CMakeLists.txt
+++ b/source/blender/makesrna/CMakeLists.txt
@@ -24,4 +24,4 @@
#
# ***** END GPL LICENSE BLOCK *****
-ADD_SUBDIRECTORY(intern)
+add_subdirectory(intern)
diff --git a/source/blender/makesrna/Makefile b/source/blender/makesrna/Makefile
deleted file mode 100644
index 2b025949d77..00000000000
--- a/source/blender/makesrna/Makefile
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Contributor(s): Blender Foundation (2008).
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# This module does not build normal .o's, but a RNA.c file, to be
-# compiled with the rest of the sources.
-#
-
-SOURCEDIR = source/blender/makesrna
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index e454dda0ae6..4c6df8bb59e 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -22,8 +22,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef RNA_ACCESS
-#define RNA_ACCESS
+#ifndef RNA_ACCESS_H
+#define RNA_ACCESS_H
#include <stdarg.h>
@@ -157,6 +157,7 @@ extern StructRNA RNA_CompositorNodeTexture;
extern StructRNA RNA_CompositorNodeTime;
extern StructRNA RNA_CompositorNodeTonemap;
extern StructRNA RNA_CompositorNodeTranslate;
+extern StructRNA RNA_CompositorNodeTree;
extern StructRNA RNA_CompositorNodeValToRGB;
extern StructRNA RNA_CompositorNodeValue;
extern StructRNA RNA_CompositorNodeVecBlur;
@@ -325,6 +326,7 @@ extern StructRNA RNA_NlaStrip;
extern StructRNA RNA_NlaTrack;
extern StructRNA RNA_Node;
extern StructRNA RNA_NodeGroup;
+extern StructRNA RNA_NodeLink;
extern StructRNA RNA_NodeSocket;
extern StructRNA RNA_NodeTree;
extern StructRNA RNA_NoiseTexture;
@@ -416,6 +418,7 @@ extern StructRNA RNA_ShaderNodeRGBToBW;
extern StructRNA RNA_ShaderNodeSeparateRGB;
extern StructRNA RNA_ShaderNodeSqueeze;
extern StructRNA RNA_ShaderNodeTexture;
+extern StructRNA RNA_ShaderNodeTree;
extern StructRNA RNA_ShaderNodeValToRGB;
extern StructRNA RNA_ShaderNodeValue;
extern StructRNA RNA_ShaderNodeVectorCurve;
@@ -495,6 +498,7 @@ extern StructRNA RNA_TextureNodeRotate;
extern StructRNA RNA_TextureNodeScale;
extern StructRNA RNA_TextureNodeTexture;
extern StructRNA RNA_TextureNodeTranslate;
+extern StructRNA RNA_TextureNodeTree;
extern StructRNA RNA_TextureNodeValToNor;
extern StructRNA RNA_TextureNodeValToRGB;
extern StructRNA RNA_TextureNodeViewer;
@@ -582,7 +586,7 @@ void RNA_pointer_create(struct ID *id, StructRNA *type, void *data, PointerRNA *
void RNA_blender_rna_pointer_create(PointerRNA *r_ptr);
void RNA_pointer_recast(PointerRNA *ptr, PointerRNA *r_ptr);
-extern PointerRNA PointerRNA_NULL;
+extern const PointerRNA PointerRNA_NULL;
/* Structs */
@@ -613,10 +617,13 @@ int RNA_struct_idprops_register_check(StructRNA *type);
PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier);
-const struct ListBase *RNA_struct_defined_properties(StructRNA *srna);
+
+/* lower level functions for access to type properties */
+const struct ListBase *RNA_struct_type_properties(StructRNA *srna);
+PropertyRNA *RNA_struct_type_find_property(StructRNA *srna, const char *identifier);
FunctionRNA *RNA_struct_find_function(PointerRNA *ptr, const char *identifier);
-const struct ListBase *RNA_struct_defined_functions(StructRNA *srna);
+const struct ListBase *RNA_struct_type_functions(StructRNA *srna);
char *RNA_struct_name_get_alloc(PointerRNA *ptr, char *fixedbuf, int fixedlen);
@@ -678,9 +685,11 @@ int RNA_property_editable_index(PointerRNA *ptr, PropertyRNA *prop, int index);
int RNA_property_editable_flag(PointerRNA *ptr, PropertyRNA *prop); /* without lib check, only checks the flag */
int RNA_property_animateable(PointerRNA *ptr, PropertyRNA *prop);
int RNA_property_animated(PointerRNA *ptr, PropertyRNA *prop);
+int RNA_property_path_from_ID_check(PointerRNA *ptr, PropertyRNA *prop); /* slow, use with care */
void RNA_property_update(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop);
void RNA_property_update_main(struct Main *bmain, struct Scene *scene, PointerRNA *ptr, PropertyRNA *prop);
+int RNA_property_update_check(struct PropertyRNA *prop);
/* Property Data */
@@ -728,7 +737,7 @@ int RNA_property_enum_get_default(PointerRNA *ptr, PropertyRNA *prop);
PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop);
void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr_value);
-// TODO: get default pointers...
+PointerRNA RNA_property_pointer_get_default(PointerRNA *ptr, PropertyRNA *prop);
void RNA_property_collection_begin(PointerRNA *ptr, PropertyRNA *prop, CollectionPropertyIterator *iter);
void RNA_property_collection_next(CollectionPropertyIterator *iter);
@@ -741,8 +750,8 @@ int RNA_property_collection_type_get(PointerRNA *ptr, PropertyRNA *prop, Pointer
/* efficient functions to set properties for arrays */
int RNA_property_collection_raw_array(PointerRNA *ptr, PropertyRNA *prop, PropertyRNA *itemprop, RawArray *array);
-int RNA_property_collection_raw_get(struct ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *array, RawPropertyType type, int len);
-int RNA_property_collection_raw_set(struct ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *array, RawPropertyType type, int len);
+int RNA_property_collection_raw_get(struct ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, const char *propname, void *array, RawPropertyType type, int len);
+int RNA_property_collection_raw_set(struct ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, const char *propname, void *array, RawPropertyType type, int len);
int RNA_raw_type_sizeof(RawPropertyType type);
RawPropertyType RNA_property_raw_type(PropertyRNA *prop);
@@ -834,7 +843,11 @@ char *RNA_string_get_alloc(PointerRNA *ptr, const char *name, char *fixedbuf, in
int RNA_string_length(PointerRNA *ptr, const char *name);
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value);
+/**
+ * Retrieve the named property from PointerRNA.
+ */
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name);
+/* Set the property name of PointerRNA ptr to ptr_value */
void RNA_pointer_set(PointerRNA *ptr, const char *name, PointerRNA ptr_value);
void RNA_pointer_add(PointerRNA *ptr, const char *name);
@@ -909,8 +922,8 @@ void RNA_parameter_list_end(ParameterIterator *iter);
void RNA_parameter_get(ParameterList *parms, PropertyRNA *parm, void **value);
void RNA_parameter_get_lookup(ParameterList *parms, const char *identifier, void **value);
-void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, void *value);
-void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, void *value);
+void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, const void *value);
+void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, const void *value);
int RNA_parameter_length_get(ParameterList *parms, PropertyRNA *parm);
int RNA_parameter_length_get_data(ParameterList *parms, PropertyRNA *parm, void *data);
void RNA_parameter_length_set(ParameterList *parms, PropertyRNA *parm, int length);
@@ -919,8 +932,16 @@ void RNA_parameter_length_set_data(ParameterList *parms, PropertyRNA *parm, void
int RNA_function_call(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, FunctionRNA *func, ParameterList *parms);
int RNA_function_call_lookup(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, const char *identifier, ParameterList *parms);
-int RNA_function_call_direct(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, FunctionRNA *func, const char *format, ...);
-int RNA_function_call_direct_lookup(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, const char *identifier, const char *format, ...);
+int RNA_function_call_direct(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, FunctionRNA *func, const char *format, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 5, 6)));
+#endif
+;
+int RNA_function_call_direct_lookup(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, const char *identifier, const char *format, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 5, 6)));
+#endif
+;
int RNA_function_call_direct_va(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, FunctionRNA *func, const char *format, va_list args);
int RNA_function_call_direct_va_lookup(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, const char *identifier, const char *format, va_list args);
@@ -933,5 +954,4 @@ StructRNA *ID_code_to_RNA_type(short idcode);
}
#endif
-#endif /* RNA_ACCESS */
-
+#endif /* RNA_ACCESS_H */
diff --git a/source/blender/makesrna/RNA_define.h b/source/blender/makesrna/RNA_define.h
index 16ca718e335..f4693ae941e 100644
--- a/source/blender/makesrna/RNA_define.h
+++ b/source/blender/makesrna/RNA_define.h
@@ -86,6 +86,7 @@ PropertyRNA *RNA_def_string_dir_path(StructOrFunctionRNA *cont, const char *iden
PropertyRNA *RNA_def_string_file_name(StructOrFunctionRNA *cont, const char *identifier, const char *default_value, int maxlen, const char *ui_name, const char *ui_description);
PropertyRNA *RNA_def_enum(StructOrFunctionRNA *cont, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description);
+PropertyRNA *RNA_def_enum_flag(StructOrFunctionRNA *cont, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description);
void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc);
PropertyRNA *RNA_def_float(StructOrFunctionRNA *cont, const char *identifier, float default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
@@ -132,8 +133,9 @@ void RNA_def_property_collection_sdna(PropertyRNA *prop, const char *structname,
void RNA_def_property_flag(PropertyRNA *prop, int flag);
void RNA_def_property_clear_flag(PropertyRNA *prop, int flag);
+void RNA_def_property_subtype(PropertyRNA *prop, PropertySubType subtype);
void RNA_def_property_array(PropertyRNA *prop, int length);
-void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, int length[]);
+void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, const int length[]);
void RNA_def_property_range(PropertyRNA *prop, double min, double max);
void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem *item);
@@ -196,6 +198,12 @@ void RNA_def_property_duplicate_pointers(StructOrFunctionRNA *cont_, PropertyRNA
void RNA_def_property_free_pointers(PropertyRNA *prop);
int RNA_def_property_free_identifier(StructOrFunctionRNA *cont_, const char *identifier);
+/* utilities */
+const char *RNA_property_typename(PropertyType type);
+#define IS_DNATYPE_FLOAT_COMPAT(_str) (strcmp(_str, "float") == 0 || strcmp(_str, "double") == 0)
+#define IS_DNATYPE_INT_COMPAT(_str) (strcmp(_str, "int") == 0 || strcmp(_str, "short") == 0 || strcmp(_str, "char") == 0)
+
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h
index 38ba44f2c2b..722facf4ea8 100644
--- a/source/blender/makesrna/RNA_enum_types.h
+++ b/source/blender/makesrna/RNA_enum_types.h
@@ -22,8 +22,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef RNA_ENUM_TYPES
-#define RNA_ENUM_TYPES
+#ifndef RNA_ENUM_TYPES_H
+#define RNA_ENUM_TYPES_H
#include "RNA_types.h"
@@ -36,6 +36,7 @@ extern EnumPropertyItem DummyRNA_NULL_items[];
extern EnumPropertyItem DummyRNA_DEFAULT_items[];
extern EnumPropertyItem object_mode_items[];
+extern EnumPropertyItem metaelem_type_items[];
extern EnumPropertyItem proportional_falloff_items[];
extern EnumPropertyItem proportional_editing_items[];
@@ -56,6 +57,9 @@ extern EnumPropertyItem beztriple_interpolation_mode_items[];
extern EnumPropertyItem keyingset_path_grouping_items[];
+extern EnumPropertyItem keyframe_paste_offset_items[];
+extern EnumPropertyItem keyframe_paste_merge_items[];
+
extern EnumPropertyItem fmodifier_type_items[];
extern EnumPropertyItem nla_mode_extend_items[];
@@ -71,6 +75,8 @@ extern EnumPropertyItem brush_imagepaint_tool_items[];
extern EnumPropertyItem texture_type_items[];
+extern EnumPropertyItem lamp_type_items[];
+
extern EnumPropertyItem unpack_method_items[];
extern EnumPropertyItem object_type_items[];
@@ -79,8 +85,6 @@ extern EnumPropertyItem object_type_curve_items[];
extern EnumPropertyItem controller_type_items[];
-extern EnumPropertyItem space_type_items[];
-
extern EnumPropertyItem keymap_propvalue_items[];
extern EnumPropertyItem operator_context_items[];
@@ -92,6 +96,11 @@ extern EnumPropertyItem property_unit_items[];
extern EnumPropertyItem viewport_shade_items[];
+extern EnumPropertyItem node_blend_type_items[];
+extern EnumPropertyItem node_math_items[];
+extern EnumPropertyItem node_vec_math_items[];
+extern EnumPropertyItem node_filter_items[];
+
struct bContext;
struct PointerRNA;
EnumPropertyItem *rna_TransformOrientation_itemf(struct bContext *C, struct PointerRNA *ptr, int *free);
@@ -109,7 +118,4 @@ EnumPropertyItem *RNA_image_local_itemf(struct bContext *C, struct PointerRNA *p
EnumPropertyItem *RNA_scene_itemf(struct bContext *C, struct PointerRNA *ptr, int *free);
EnumPropertyItem *RNA_scene_local_itemf(struct bContext *C, struct PointerRNA *ptr, int *free);
-#endif /* RNA_ENUM_TYPES */
-
-
-
+#endif /* RNA_ENUM_TYPES_H */
diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h
index 5caae56010f..59c81231afe 100644
--- a/source/blender/makesrna/RNA_types.h
+++ b/source/blender/makesrna/RNA_types.h
@@ -24,8 +24,8 @@
#include "BLO_sys_types.h"
-#ifndef RNA_TYPES
-#define RNA_TYPES
+#ifndef RNA_TYPES_H
+#define RNA_TYPES_H
#ifdef __cplusplus
extern "C" {
@@ -167,6 +167,10 @@ typedef enum PropertyFlag {
* only apply this to types that are derived from an ID ()*/
PROP_ID_SELF_CHECK = 1<<20,
PROP_NEVER_NULL = 1<<18,
+ /* currently only used for UI, this is similar to PROP_NEVER_NULL
+ * except that the value may be NULL at times, used for ObData, where an Empty's will be NULL
+ * but setting NULL on a mesh object is not possible. So, if its not NULL, setting NULL cant be done! */
+ PROP_NEVER_UNLINK = 1<<25,
/* flag contains multiple enums.
* note: not to be confused with prop->enumbitflags
@@ -183,6 +187,12 @@ typedef enum PropertyFlag {
* most common case is functions that return arrays where the array */
PROP_THICK_WRAP = 1<<23,
+ /* Reject values outside limits, use for python api only so far
+ * this is for use when silently clamping string length will give
+ * bad behavior later. Could also enforce this for INT's and other types.
+ * note: currently no support for function arguments or non utf8 paths (filepaths) */
+ PROP_NEVER_CLAMP = 1<<26,
+
/* internal flags */
PROP_BUILTIN = 1<<7,
PROP_EXPORT = 1<<8,
@@ -192,7 +202,7 @@ typedef enum PropertyFlag {
PROP_RAW_ARRAY = 1<<14,
PROP_FREE_POINTERS = 1<<15,
PROP_DYNAMIC = 1<<17, /* for dynamic arrays, and retvals of type string */
- PROP_ENUM_NO_CONTEXT = 1<<18 /* for enum that shouldn't be contextual */
+ PROP_ENUM_NO_CONTEXT = 1<<24 /* for enum that shouldn't be contextual */
} PropertyFlag;
typedef struct CollectionPropertyIterator {
@@ -307,13 +317,13 @@ typedef enum StructFlag {
STRUCT_RUNTIME = 4,
STRUCT_GENERATED = 8,
STRUCT_FREE_POINTERS = 16,
- STRUCT_NO_IDPROPERTIES = 32, /* Menu's and Panels don't need properties */
+ STRUCT_NO_IDPROPERTIES = 32 /* Menu's and Panels don't need properties */
} StructFlag;
typedef int (*StructValidateFunc)(struct PointerRNA *ptr, void *data, int *have_function);
-typedef int (*StructCallbackFunc)(struct PointerRNA *ptr, struct FunctionRNA *func, ParameterList *list);
+typedef int (*StructCallbackFunc)(struct bContext *C, struct PointerRNA *ptr, struct FunctionRNA *func, ParameterList *list);
typedef void (*StructFreeFunc)(void *data);
-typedef struct StructRNA *(*StructRegisterFunc)(const struct bContext *C, struct ReportList *reports, void *data,
+typedef struct StructRNA *(*StructRegisterFunc)(struct bContext *C, struct ReportList *reports, void *data,
const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free);
typedef void (*StructUnregisterFunc)(const struct bContext *C, struct StructRNA *type);
@@ -333,9 +343,9 @@ typedef struct BlenderRNA BlenderRNA;
typedef struct ExtensionRNA {
void *data;
StructRNA *srna;
-
- int (*call)(PointerRNA *, FunctionRNA *, ParameterList *);
- void (*free)(void *data);
+ StructCallbackFunc call;
+ StructFreeFunc free;
+
} ExtensionRNA;
/* fake struct definitions, needed otherwise collections end up owning the C
@@ -370,6 +380,4 @@ typedef struct ExtensionRNA {
}
#endif
-#endif /* RNA_TYPES */
-
-
+#endif /* RNA_TYPES_H */
diff --git a/source/blender/makesrna/SConscript b/source/blender/makesrna/SConscript
index 674aeb264c3..a64963ff03e 100644
--- a/source/blender/makesrna/SConscript
+++ b/source/blender/makesrna/SConscript
@@ -7,7 +7,7 @@ o = SConscript('intern/SConscript')
objs += o
incs = '#/intern/guardedalloc #/intern/memutil #/intern/audaspace/intern ../blenkernel ../blenlib ../makesdna intern .'
-incs += ' ../windowmanager ../editors/include ../gpu ../imbuf ../ikplugin'
+incs += ' ../windowmanager ../editors/include ../gpu ../imbuf ../ikplugin ../blenfont'
incs += ' ../render/extern/include'
defs = []
@@ -46,13 +46,13 @@ if env['WITH_BF_LCMS']:
incs += ' ' + env['BF_LCMS_INC']
if env['WITH_BF_GAMEENGINE']:
- defs.append('GAMEBLENDER=1')
+ defs.append('WITH_GAMEENGINE')
if env['BF_UNIT_TEST']:
defs.append('UNIT_TEST')
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
+if env['WITH_BF_PYTHON']:
+ defs.append('WITH_PYTHON')
if env['OURPLATFORM'] == 'linux2':
cflags='-pthread'
diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt
index 4f9032ffc95..3a6496fab60 100644
--- a/source/blender/makesrna/intern/CMakeLists.txt
+++ b/source/blender/makesrna/intern/CMakeLists.txt
@@ -1,3 +1,4 @@
+# -*- mode: cmake; indent-tabs-mode: t; -*-
# $Id: CMakeLists.txt 17433 2008-11-12 21:16:53Z blendix $
# ***** BEGIN GPL LICENSE BLOCK *****
#
@@ -24,125 +25,145 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB DEFSRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.c")
-FILE(GLOB APISRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*_api.c")
-LIST(REMOVE_ITEM DEFSRC rna_access.c rna_define.c makesrna.c)
-LIST(REMOVE_ITEM DEFSRC ${APISRC})
+# Generated code has some unused vars we can ignore.
+remove_strict_flags()
+
+# message(STATUS "Configuring makesrna")
+
+file(GLOB DEFSRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.c")
+file(GLOB APISRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*_api.c")
+list(REMOVE_ITEM DEFSRC rna_access.c rna_define.c makesrna.c)
+list(REMOVE_ITEM DEFSRC ${APISRC})
-STRING(REGEX REPLACE "rna_([a-zA-Z0-9_-]*).c" "${CMAKE_CURRENT_BINARY_DIR}/rna_\\1_gen.c" GENSRC "${DEFSRC}")
+string(REGEX REPLACE "rna_([a-zA-Z0-9_-]*).c" "${CMAKE_CURRENT_BINARY_DIR}/rna_\\1_gen.c" GENSRC "${DEFSRC}")
+set_source_files_properties(GENSRC PROPERTIES GENERATED true)
+
+set(SRC_RNA_INC
+ ../RNA_access.h
+ ../RNA_define.h
+ ../RNA_enum_types.h
+ ../RNA_types.h
+)
-SET(SRC
+set(SRC
makesrna.c
rna_define.c
${DEFSRC}
${APISRC}
../../../../intern/guardedalloc/intern/mallocn.c
- ../../../../intern/guardedalloc/intern/mmap_win.c)
-
-INCLUDE_DIRECTORIES(
- ../../../../intern/audaspace/intern
- ../../../../intern/guardedalloc
- ../../../../intern/memutil
- ..
- ../../makesdna
- ../../blenkernel
- ../../blenlib
- ../../ikplugin
- ../../windowmanager
- ../../editors/include
- ../../gpu
- ../../imbuf
- ../../render/extern/include
- ../../../../extern/glew/include
- . )
-
-FILE(GLOB INC_FILES ../*.h ../../makesdna/*.h)
+ ../../../../intern/guardedalloc/intern/mmap_win.c
+)
-IF(NOT WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(NOT WITH_PYTHON)
+set(INC
+)
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_PYTHON)
+ add_definitions(-DWITH_PYTHON)
+endif()
-IF(WITH_GAMEENGINE)
- ADD_DEFINITIONS(-DGAMEBLENDER)
-ENDIF(WITH_GAMEENGINE)
+if(WITH_GAMEENGINE)
+ add_definitions(-DWITH_GAMEENGINE)
+endif()
-IF(WITH_IMAGE_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_IMAGE_OPENEXR)
+if(WITH_IMAGE_OPENEXR)
+ add_definitions(-DWITH_OPENEXR)
+endif()
-IF(WITH_IMAGE_TIFF)
- ADD_DEFINITIONS(-DWITH_TIFF)
-ENDIF(WITH_IMAGE_TIFF)
+if(WITH_IMAGE_TIFF)
+ add_definitions(-DWITH_TIFF)
+endif()
-IF(WITH_IMAGE_OPENJPEG)
- ADD_DEFINITIONS(-DWITH_OPENJPEG)
-ENDIF(WITH_IMAGE_OPENJPEG)
+if(WITH_IMAGE_OPENJPEG)
+ add_definitions(-DWITH_OPENJPEG)
+endif()
-IF(WITH_IMAGE_DDS)
- ADD_DEFINITIONS(-DWITH_DDS)
-ENDIF(WITH_IMAGE_DDS)
+if(WITH_IMAGE_DDS)
+ add_definitions(-DWITH_DDS)
+endif()
-IF(WITH_IMAGE_CINEON)
- ADD_DEFINITIONS(-DWITH_CINEON)
-ENDIF(WITH_IMAGE_CINEON)
+if(WITH_IMAGE_CINEON)
+ add_definitions(-DWITH_CINEON)
+endif()
-IF(WITH_IMAGE_HDR)
- ADD_DEFINITIONS(-DWITH_HDR)
-ENDIF(WITH_IMAGE_HDR)
+if(WITH_IMAGE_HDR)
+ add_definitions(-DWITH_HDR)
+endif()
-IF(WITH_QUICKTIME)
- LIST(APPEND INC ../../quicktime)
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+if(WITH_CODEC_QUICKTIME)
+ list(APPEND INC ../../quicktime)
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-IF(WITH_FFMPEG)
- LIST(APPEND INC ${FFMPEG_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
-ENDIF(WITH_FFMPEG)
+if(WITH_CODEC_FFMPEG)
+ list(APPEND INC ${FFMPEG_INC})
+ add_definitions(-DWITH_FFMPEG)
+endif()
-IF(WITH_LCMS)
- LIST(APPEND INC ${LCMS_INCLUDE_DIR})
- ADD_DEFINITIONS(-DWITH_LCMS)
-ENDIF(WITH_LCMS)
+if(WITH_LCMS)
+ list(APPEND INC ${LCMS_INCLUDE_DIR})
+ add_definitions(-DWITH_LCMS)
+endif()
-IF(NOT WITH_FLUID)
- ADD_DEFINITIONS(-DDISABLE_ELBEEM)
-ENDIF(NOT WITH_FLUID)
+if(NOT WITH_MOD_FLUID)
+ add_definitions(-DDISABLE_ELBEEM)
+endif()
-IF(WITH_FFTW3)
- ADD_DEFINITIONS(-DFFTW3=1)
-ENDIF(WITH_FFTW3)
+if(WITH_FFTW3)
+ add_definitions(-DFFTW3=1)
+endif()
-IF(WITH_SDL)
- ADD_DEFINITIONS(-DWITH_SDL)
-ENDIF(WITH_SDL)
+if(WITH_SDL)
+ add_definitions(-DWITH_SDL)
+endif()
-IF(WITH_OPENAL)
- ADD_DEFINITIONS(-DWITH_OPENAL)
-ENDIF(WITH_OPENAL)
+if(WITH_OPENAL)
+ add_definitions(-DWITH_OPENAL)
+endif()
-IF(WITH_JACK)
- ADD_DEFINITIONS(-DWITH_JACK)
-ENDIF(WITH_JACK)
+if(WITH_JACK)
+ add_definitions(-DWITH_JACK)
+endif()
# Build makesrna executable
-ADD_EXECUTABLE(makesrna ${SRC} ${INC_FILES})
-TARGET_LINK_LIBRARIES(makesrna bf_dna)
+blender_include_dirs(
+ .
+ ..
+ ../../blenkernel
+ ../../blenlib
+ ../../blenfont
+ ../../gpu
+ ../../imbuf
+ ../../ikplugin
+ ../../makesdna
+ ../../windowmanager
+ ../../editors/include
+ ../../render/extern/include
+ ../../../../extern/glew/include
+ ../../../../intern/audaspace/intern
+ ../../../../intern/guardedalloc
+ ../../../../intern/memutil
+)
+
+add_executable(makesrna ${SRC} ${SRC_RNA_INC} ${SRC_DNA_INC})
+target_link_libraries(makesrna bf_dna)
# Output rna_*_gen.c
# note (linux only): with crashes try add this after COMMAND: valgrind --leak-check=full --track-origins=yes
-ADD_CUSTOM_COMMAND(
+add_custom_command(
OUTPUT ${GENSRC}
COMMAND ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/makesrna ${CMAKE_CURRENT_BINARY_DIR}/
DEPENDS makesrna
)
# Build bf_rna
-SET(SRC rna_access.c ${GENSRC})
-BLENDERLIB(bf_rna "${SRC}" "${INC}")
+set(SRC
+ rna_access.c
+ ${GENSRC}
+
+ ${SRC_RNA_INC}
+ rna_internal.h
+ rna_internal_types.h
+ rna_nodetree_types.h
+)
-MESSAGE(STATUS "Configuring makesrna")
+blender_add_lib(bf_rna "${SRC}" "${INC}")
diff --git a/source/blender/makesrna/intern/Makefile b/source/blender/makesrna/intern/Makefile
deleted file mode 100644
index 69d5581184d..00000000000
--- a/source/blender/makesrna/intern/Makefile
+++ /dev/null
@@ -1,158 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Contributor(s): Blender Foundation (2008).
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-
-LIBNAME = rna
-DIR = $(OCGDIR)/blender/makesrna
-
-ALLRNA = $(wildcard rna_*.c)
-DEFRNA = $(filter-out %rna_define.c, $(filter-out %rna_access.c, $(ALLRNA)))
-
-GENRNA = $(filter-out %_api.c, $(DEFRNA))
-GENSRCS = $(patsubst rna_%.c, rna_%_gen.c, $(GENRNA))
-GENTARGET = $(patsubst %.c, $(DIR)/$(DEBUG_DIR)%.c, $(GENSRCS))
-
-MAKESRCS = $(DEFRNA) makesrna.c rna_define.c
-MAKEOBJS = $(patsubst %.c, $(DIR)/$(DEBUG_DIR)%.o, $(notdir $(MAKESRCS)))
-
-CSRCS = $(GENSRCS) rna_access.c
-
-include nan_compile.mk
-
-ifdef NAN_DEPEND
--include $(MAKESRCS:%.c=$(DIR)/$(DEBUG_DIR)%.d)
-endif
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_MEMUTIL)/include
-CPPFLAGS += -I../../../../intern/audaspace/intern
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../ikplugin
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../editors/include
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-CPPFLAGS += -I..
-CPPFLAGS += -I.
-
-ifeq ($(WITH_FFMPEG),true)
- CPPFLAGS += -DWITH_FFMPEG
- CPPFLAGS += $(NAN_FFMPEGCFLAGS)
-endif
-
-ifeq ($(WITH_OPENEXR), true)
- CPPFLAGS += -DWITH_OPENEXR
-endif
-
-ifeq ($(WITH_DDS), true)
- CPPFLAGS += -DWITH_DDS
-endif
-
-ifeq ($(WITH_OPENJPEG), true)
- CPPFLAGS += -DWITH_OPENJPEG
-endif
-
-ifeq ($(WITH_QUICKTIME), true)
- CPPFLAGS += -DWITH_QUICKTIME -I../../quicktime
-endif
-
-ifeq ($(WITH_SDL),true)
- CPPFLAGS += -DWITH_SDL
-endif
-
-ifeq ($(WITH_JACK),true)
- CPPFLAGS += -DWITH_JACK
-endif
-
-ifeq ($(WITH_OPENAL),true)
- CPPFLAGS += -DWITH_OPENAL
-endif
-
-ifeq ($(WITH_TIFF),true)
- CPPFLAGS += -DWITH_TIFF
-endif
-
-ifeq ($(WITH_LCMS),true)
- CPPFLAGS += -DWITH_LCMS
-endif
-
-ifeq ($(WITH_CINEON),true)
- CPPFLAGS += -DWITH_CINEON
-endif
-
-ifeq ($(WITH_HDR),true)
- CPPFLAGS += -DWITH_HDR
-endif
-
-ifeq ($(OS),windows)
- # Windows needs these extra libs because of winstuff... It is not
- # _really_ needed, but it is the easiest fix for now. If you have
- # some spare time, try to trace down the exact dep.
- ifneq ($(FREE_WINDOWS),true)
- WINLIBS = kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
- WINLIBS += advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
- WINLIBS += winmm.lib opengl32.lib glu32.lib largeint.lib
- WINLIBS += /link /nodefaultlib:libc
- else
- LDFLAGS += -mwindows -mno-cygwin
- endif
-endif
-
-ifeq ($(OS), darwin)
- LDFLAGS += -arch $(MACOSX_ARCHITECTURE) #-isysroot $(MACOSX_SDK) -mmacosx-version-min=$(MACOSX_MIN_VERS)
-endif
-
-clean::
- @$(RM) $(DIR)/makesrna* $(DIR)/rna*
- @$(RM) $(DIR)/debug/makesrna* $(DIR)/debug/rna*
-
-# TODO include right .mk for ldflags
-
-# A small note: we do not use the debug version of the alloc lib. That
-# is done quite intentionally. If there is a bug in that lib, it needs
-# to be fixed by the module maintainer.
-
-$(DIR)/$(DEBUG_DIR)makesrna: $(MAKEOBJS) $(OCGDIR)/blender/makesdna/$(DEBUG_DIR)libdna.a $(NAN_GUARDEDALLOC)/lib/libguardedalloc.a
- $(CC) $(LDFLAGS) -o $@ $(WINLIBS) $^
-
-$(DIR)/$(DEBUG_DIR)rna_phony_gen.c: $(DIR)/$(DEBUG_DIR)makesrna
- ifeq ($(OS),windows)
- $(SRCHOME)/tools/cygwin/cl_wrapper.pl - $(DIR)/$(DEBUG_DIR)makesrna \
- $(DIR)/$(DEBUG_DIR)
- else
- $(DIR)/$(DEBUG_DIR)makesrna $(DIR)/$(DEBUG_DIR)
- endif
- @touch $@
-
-$(GENTARGET): $(DIR)/$(DEBUG_DIR)rna_phony_gen.c
-
-$(DIR)/$(DEBUG_DIR)makesrna.o: makesrna.c $(wildcard rna_*.c)
- $(CC) -c $(CFLAGS) $(CPPFLAGS) makesrna.c -o $@
-
diff --git a/source/blender/makesrna/intern/SConscript b/source/blender/makesrna/intern/SConscript
index ecee3f94796..5d49b626f54 100644
--- a/source/blender/makesrna/intern/SConscript
+++ b/source/blender/makesrna/intern/SConscript
@@ -6,7 +6,7 @@ def normpath(path):
return os.path.abspath(os.path.normpath(path))
Import ('env')
-cflags = ['-Wall']
+cflags = [] #['-Wall']
defines = []
root_build_dir=normpath(env['BF_BUILDDIR'])
@@ -31,7 +31,7 @@ defs = []
incs = '#/intern/guardedalloc ../../blenlib ../../blenkernel'
incs += ' ../../imbuf ../../makesdna ../../makesrna ../../ikplugin'
-incs += ' ../../windowmanager ../../editors/include'
+incs += ' ../../windowmanager ../../editors/include ../../blenfont'
incs += ' ../../render/extern/include'
incs += ' #/intern/audaspace/intern '
@@ -68,7 +68,7 @@ if env['WITH_BF_LCMS']:
defs.append('WITH_LCMS')
if env['WITH_BF_GAMEENGINE']:
- defs.append('GAMEBLENDER=1')
+ defs.append('WITH_GAMEENGINE')
if env['WITH_BF_FFTW3']:
defs.append('FFTW3=1')
@@ -85,8 +85,8 @@ if env['WITH_BF_JACK']:
if env['BF_UNIT_TEST']:
defs.append('UNIT_TEST')
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
+if env['WITH_BF_PYTHON']:
+ defs.append('WITH_PYTHON')
if env['OURPLATFORM'] == 'linux2':
cflags='-pthread'
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index 38a5b2587ff..4588d0c36c5 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -27,6 +27,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <errno.h>
#include "MEM_guardedalloc.h"
@@ -47,14 +48,40 @@
/* Replace if different */
#define TMP_EXT ".tmp"
-static int replace_if_different(char *tmpfile)
+
+/* copied from BLI_file_older */
+#include <sys/stat.h>
+static int file_older(const char *file1, const char *file2)
+{
+ struct stat st1, st2;
+ // printf("compare: %s %s\n", file1, file2);
+
+ if(stat(file1, &st1)) return 0;
+ if(stat(file2, &st2)) return 0;
+
+ return (st1.st_mtime < st2.st_mtime);
+}
+const char *makesrna_path= NULL;
+
+static int replace_if_different(char *tmpfile, const char *dep_files[])
{
// return 0; // use for testing had edited rna
#define REN_IF_DIFF \
- remove(orgfile); \
+ { \
+ FILE *file_test= fopen(orgfile, "rb"); \
+ if(file_test) { \
+ fclose(file_test); \
+ if(fp_org) fclose(fp_org); \
+ if(fp_new) fclose(fp_new); \
+ if(remove(orgfile) != 0) { \
+ fprintf(stderr, "%s:%d, Remove Error (%s): \"%s\"\n", __FILE__, __LINE__, strerror(errno), orgfile); \
+ return -1; \
+ } \
+ } \
+ } \
if(rename(tmpfile, orgfile) != 0) { \
- fprintf(stderr, "%s:%d, rename error: \"%s\" -> \"%s\"\n", __FILE__, __LINE__, tmpfile, orgfile); \
+ fprintf(stderr, "%s:%d, Rename Error (%s): \"%s\" -> \"%s\"\n", __FILE__, __LINE__, strerror(errno), tmpfile, orgfile); \
return -1; \
} \
remove(tmpfile); \
@@ -62,7 +89,7 @@ static int replace_if_different(char *tmpfile)
/* end REN_IF_DIFF */
- FILE *fp_new, *fp_org;
+ FILE *fp_new= NULL, *fp_org= NULL;
int len_new, len_org;
char *arr_new, *arr_org;
int cmp;
@@ -78,6 +105,42 @@ static int replace_if_different(char *tmpfile)
REN_IF_DIFF;
}
+
+ /* XXX, trick to work around dependancy problem
+ * assumes dep_files is in the same dir as makesrna.c, which is true for now. */
+
+ if(1) {
+ /* first check if makesrna.c is newer then generated files
+ * for development on makesrna.c you may want to disable this */
+ if(file_older(orgfile, __FILE__)) {
+ REN_IF_DIFF;
+ }
+
+ if(file_older(orgfile, makesrna_path)) {
+ REN_IF_DIFF;
+ }
+
+ /* now check if any files we depend on are newer then any generated files */
+ if(dep_files) {
+ int pass;
+ for(pass=0; dep_files[pass]; pass++) {
+ char from_path[4096]= __FILE__;
+ char *p1, *p2;
+
+ /* dir only */
+ p1= strrchr(from_path, '/');
+ p2= strrchr(from_path, '\\');
+ strcpy((p1 > p2 ? p1 : p2)+1, dep_files[pass]);
+ /* account for build deps, if makesrna.c (this file) is newer */
+ if(file_older(orgfile, from_path)) {
+ REN_IF_DIFF;
+ }
+ }
+ }
+ }
+ /* XXX end dep trick */
+
+
fp_new= fopen(tmpfile, "rb");
if(fp_new==NULL) {
@@ -199,7 +262,7 @@ static void rna_sortlist(ListBase *listbase, int(*cmp)(const void*, const void*)
static void rna_print_c_string(FILE *f, const char *str)
{
- static char *escape[] = {"\''", "\"\"", "\??", "\\\\","\aa", "\bb", "\ff", "\nn", "\rr", "\tt", "\vv", NULL};
+ static const char *escape[] = {"\''", "\"\"", "\??", "\\\\","\aa", "\bb", "\ff", "\nn", "\rr", "\tt", "\vv", NULL};
int i, j;
if(!str) {
@@ -292,7 +355,12 @@ static const char *rna_type_type_name(PropertyRNA *prop)
case PROP_FLOAT:
return "float";
case PROP_STRING:
- return "char*";
+ if(prop->flag & PROP_THICK_WRAP) {
+ return "char*";
+ }
+ else {
+ return "const char*";
+ }
default:
return NULL;
}
@@ -364,7 +432,7 @@ static int rna_enum_bitmask(PropertyRNA *prop)
static int rna_color_quantize(PropertyRNA *prop, PropertyDefRNA *dp)
{
- if(prop->type == PROP_FLOAT && prop->subtype == PROP_COLOR)
+ if(prop->type == PROP_FLOAT && (prop->subtype==PROP_COLOR || prop->subtype==PROP_COLOR_GAMMA))
if(strcmp(dp->dnatype, "float") != 0 && strcmp(dp->dnatype, "double") != 0)
return 1;
@@ -404,6 +472,28 @@ static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *pr
DefRNA.error= 1;
return NULL;
}
+
+ /* typecheck, */
+ if(dp->dnatype && *dp->dnatype) {
+
+ if(prop->type == PROP_FLOAT) {
+ if(IS_DNATYPE_FLOAT_COMPAT(dp->dnatype) == 0) {
+ if(prop->subtype != PROP_COLOR_GAMMA) { /* colors are an exception. these get translated */
+ fprintf(stderr, "rna_def_property_get_func1: %s.%s is a '%s' but wrapped as type '%s'.\n", srna->identifier, prop->identifier, dp->dnatype, RNA_property_typename(prop->type));
+ DefRNA.error= 1;
+ return NULL;
+ }
+ }
+ }
+ else if(prop->type == PROP_INT || prop->type == PROP_BOOLEAN || prop->type == PROP_ENUM) {
+ if(IS_DNATYPE_INT_COMPAT(dp->dnatype) == 0) {
+ fprintf(stderr, "rna_def_property_get_func2: %s.%s is a '%s' but wrapped as type '%s'.\n", srna->identifier, prop->identifier, dp->dnatype, RNA_property_typename(prop->type));
+ DefRNA.error= 1;
+ return NULL;
+ }
+ }
+ }
+
}
func= rna_alloc_function_name(srna->identifier, prop->identifier, "get");
@@ -858,6 +948,8 @@ static char *rna_def_property_begin_func(FILE *f, StructRNA *srna, PropertyRNA *
static char *rna_def_property_lookup_int_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp, char *manualfunc, char *nextfunc)
{
+ /* note on indices, this is for external functions and ignores skipped values.
+ * so the the index can only be checked against the length when there is no 'skip' funcion. */
char *func;
if(prop->flag & PROP_IDPROPERTY && manualfunc==NULL)
@@ -875,55 +967,61 @@ static char *rna_def_property_lookup_int_func(FILE *f, StructRNA *srna, Property
func= rna_alloc_function_name(srna->identifier, prop->identifier, "lookup_int");
- fprintf(f, "PointerRNA %s(PointerRNA *ptr, int index)\n", func);
+ fprintf(f, "int %s(PointerRNA *ptr, int index, PointerRNA *r_ptr)\n", func);
fprintf(f, "{\n");
if(manualfunc) {
- fprintf(f, "\n return %s(ptr, index);\n", manualfunc);
+ fprintf(f, "\n return %s(ptr, index, r_ptr);\n", manualfunc);
fprintf(f, "}\n\n");
return func;
}
- fprintf(f, " PointerRNA r_ptr;\n");
+ fprintf(f, " int found= 0;\n");
fprintf(f, " CollectionPropertyIterator iter;\n\n");
fprintf(f, " %s_%s_begin(&iter, ptr);\n\n", srna->identifier, prop->identifier);
- fprintf(f, " {\n");
+ fprintf(f, " if(iter.valid){\n");
if(strcmp(nextfunc, "rna_iterator_array_next") == 0) {
fprintf(f, " ArrayIterator *internal= iter.internal;\n");
- fprintf(f, " if(internal->skip) {\n");
- fprintf(f, " while(index-- > 0) {\n");
- fprintf(f, " do {\n");
- fprintf(f, " internal->ptr += internal->itemsize;\n");
- fprintf(f, " } while(internal->skip(&iter, internal->ptr));\n");
+ fprintf(f, " if(index < 0 || index >= internal->length) {\n");
+ fprintf(f, "#ifdef __GNUC__\n");
+ fprintf(f, " printf(\"Array iterator out of range: %%s (index %%d)\\n\", __func__, index);\n");
+ fprintf(f, "#else\n");
+ fprintf(f, " printf(\"Array iterator out of range: (index %%d)\\n\", index);\n");
+ fprintf(f, "#endif\n");
+ fprintf(f, " }\n");
+ fprintf(f, " else if(internal->skip) {\n");
+ fprintf(f, " while(index-- > 0 && iter.valid) {\n");
+ fprintf(f, " rna_iterator_array_next(&iter);\n");
fprintf(f, " }\n");
+ fprintf(f, " found= (index == -1 && iter.valid);\n");
fprintf(f, " }\n");
fprintf(f, " else {\n");
fprintf(f, " internal->ptr += internal->itemsize*index;\n");
+ fprintf(f, " found= 1;\n");
fprintf(f, " }\n");
}
else if(strcmp(nextfunc, "rna_iterator_listbase_next") == 0) {
fprintf(f, " ListBaseIterator *internal= iter.internal;\n");
fprintf(f, " if(internal->skip) {\n");
- fprintf(f, " while(index-- > 0) {\n");
- fprintf(f, " do {\n");
- fprintf(f, " internal->link= internal->link->next;\n");
- fprintf(f, " } while(internal->skip(&iter, internal->link));\n");
+ fprintf(f, " while(index-- > 0 && iter.valid) {\n");
+ fprintf(f, " rna_iterator_listbase_next(&iter);\n");
fprintf(f, " }\n");
+ fprintf(f, " found= (index == -1 && iter.valid);\n");
fprintf(f, " }\n");
fprintf(f, " else {\n");
- fprintf(f, " while(index-- > 0)\n");
+ fprintf(f, " while(index-- > 0 && internal->link)\n");
fprintf(f, " internal->link= internal->link->next;\n");
+ fprintf(f, " found= (index == -1 && internal->link);\n");
fprintf(f, " }\n");
}
+ fprintf(f, " if(found) *r_ptr = %s_%s_get(&iter);\n", srna->identifier, prop->identifier);
fprintf(f, " }\n\n");
-
- fprintf(f, " r_ptr = %s_%s_get(&iter);\n", srna->identifier, prop->identifier);
fprintf(f, " %s_%s_end(&iter);\n\n", srna->identifier, prop->identifier);
- fprintf(f, " return r_ptr;\n");
+ fprintf(f, " return found;\n");
#if 0
rna_print_data_get(f, dp);
@@ -1397,7 +1495,9 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
FunctionRNA *func;
PropertyDefRNA *dparm;
PropertyType type;
- char *funcname, *ptrstr, *valstr;
+ const char *funcname, *valstr;
+ const char *ptrstr;
+ const short has_data= (dfunc->cont.properties.first != NULL);
int flag, pout, cptr, first;
srna= dsrna->srna;
@@ -1451,10 +1551,12 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
fprintf(f, "\t%s%s %s%s;\n", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, dparm->prop->identifier);
}
- fprintf(f, "\tchar *_data");
- if(func->c_ret) fprintf(f, ", *_retdata");
- fprintf(f, ";\n");
- fprintf(f, "\t\n");
+ if(has_data) {
+ fprintf(f, "\tchar *_data");
+ if(func->c_ret) fprintf(f, ", *_retdata");
+ fprintf(f, ";\n");
+ fprintf(f, "\t\n");
+ }
/* assign self */
if(func->flag & FUNC_USE_SELF_ID) {
@@ -1466,7 +1568,9 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
else fprintf(f, "\t_self= (struct %s *)_ptr->data;\n", srna->identifier);
}
- fprintf(f, "\t_data= (char *)_parms->data;\n");
+ if(has_data) {
+ fprintf(f, "\t_data= (char *)_parms->data;\n");
+ }
dparm= dfunc->cont.properties.first;
for(; dparm; dparm= dparm->next) {
@@ -1478,7 +1582,7 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
if(dparm->prop==func->c_ret)
fprintf(f, "\t_retdata= _data;\n");
else {
- char *data_str;
+ const char *data_str;
if (cptr || (flag & PROP_DYNAMIC)) {
ptrstr= "**";
valstr= "*";
@@ -1643,20 +1747,6 @@ static const char *rna_property_structname(PropertyType type)
}
}
-static const char *rna_property_typename(PropertyType type)
-{
- switch(type) {
- case PROP_BOOLEAN: return "PROP_BOOLEAN";
- case PROP_INT: return "PROP_INT";
- case PROP_FLOAT: return "PROP_FLOAT";
- case PROP_STRING: return "PROP_STRING";
- case PROP_ENUM: return "PROP_ENUM";
- case PROP_POINTER: return "PROP_POINTER";
- case PROP_COLLECTION: return "PROP_COLLECTION";
- default: return "PROP_UNKNOWN";
- }
-}
-
static const char *rna_property_subtypename(PropertySubType type)
{
switch(type) {
@@ -1803,7 +1893,7 @@ static void rna_generate_static_parameter_prototypes(BlenderRNA *brna, StructRNA
StructDefRNA *dsrna;
PropertyType type;
int flag, pout, cptr, first;
- char *ptrstr;
+ const char *ptrstr;
dsrna= rna_find_struct_def(srna);
func= dfunc->func;
@@ -1933,7 +2023,7 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
switch(prop->type) {
case PROP_ENUM: {
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
- int i, defaultfound= 0;
+ int i, defaultfound= 0, totflag= 0;
if(eprop->item) {
fprintf(f, "static EnumPropertyItem rna_%s%s_%s_items[%d] = {\n\t", srna->identifier, strnest, prop->identifier, eprop->totitem+1);
@@ -1945,16 +2035,31 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
rna_print_c_string(f, eprop->item[i].name); fprintf(f, ", ");
rna_print_c_string(f, eprop->item[i].description); fprintf(f, "},\n\t");
- if(eprop->item[i].identifier[0])
- if(eprop->defaultvalue == eprop->item[i].value)
- defaultfound= 1;
+ if(eprop->item[i].identifier[0]) {
+ if(prop->flag & PROP_ENUM_FLAG) {
+ totflag |= eprop->item[i].value;
+ }
+ else {
+ if(eprop->defaultvalue == eprop->item[i].value) {
+ defaultfound= 1;
+ }
+ }
+ }
}
fprintf(f, "{0, NULL, 0, NULL, NULL}\n};\n\n");
- if(!defaultfound) {
- fprintf(stderr, "rna_generate_structs: %s%s.%s, enum default is not in items.\n", srna->identifier, errnest, prop->identifier);
- DefRNA.error= 1;
+ if(prop->flag & PROP_ENUM_FLAG) {
+ if(eprop->defaultvalue & ~totflag) {
+ fprintf(stderr, "rna_generate_structs: %s%s.%s, enum default includes unused bits (%d).\n", srna->identifier, errnest, prop->identifier, eprop->defaultvalue & ~totflag);
+ DefRNA.error= 1;
+ }
+ }
+ else {
+ if(!defaultfound) {
+ fprintf(stderr, "rna_generate_structs: %s%s.%s, enum default is not in items.\n", srna->identifier, errnest, prop->identifier);
+ DefRNA.error= 1;
+ }
}
}
else {
@@ -2039,7 +2144,7 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
rna_print_c_string(f, prop->name); fprintf(f, ",\n\t");
rna_print_c_string(f, prop->description); fprintf(f, ",\n\t");
fprintf(f, "%d,\n", prop->icon);
- fprintf(f, "\t%s, %s|%s, %s, %d, {%d, %d, %d}, %d,\n", rna_property_typename(prop->type), rna_property_subtypename(prop->subtype), rna_property_subtype_unit(prop->subtype), rna_function_string(prop->getlength), prop->arraydimension, prop->arraylength[0], prop->arraylength[1], prop->arraylength[2], prop->totarraylength);
+ fprintf(f, "\t%s, %s|%s, %s, %d, {%d, %d, %d}, %d,\n", RNA_property_typename(prop->type), rna_property_subtypename(prop->subtype), rna_property_subtype_unit(prop->subtype), rna_function_string(prop->getlength), prop->arraydimension, prop->arraylength[0], prop->arraylength[1], prop->arraylength[2], prop->totarraylength);
fprintf(f, "\t%s%s, %d, %s, %s,\n", (prop->flag & PROP_CONTEXT_UPDATE)? "(UpdateFunc)": "", rna_function_string(prop->update), prop->noteflag, rna_function_string(prop->editable), rna_function_string(prop->itemeditable));
if(prop->flag & PROP_RAW_ACCESS) rna_set_raw_offset(f, srna, prop);
@@ -2191,11 +2296,9 @@ static void rna_generate_struct(BlenderRNA *brna, StructRNA *srna, FILE *f)
prop= srna->cont.properties.last;
if(prop) fprintf(f, "(PropertyRNA*)&rna_%s_%s}},\n", srna->identifier, prop->identifier);
else fprintf(f, "NULL}},\n");
-
- fprintf(f, "\tNULL,NULL,\n"); /* PyType - Cant initialize here */
-
fprintf(f, "\t");
rna_print_c_string(f, srna->identifier);
+ fprintf(f, "\t, NULL,NULL\n"); /* PyType - Cant initialize here */
fprintf(f, ", %d, ", srna->flag);
rna_print_c_string(f, srna->name);
fprintf(f, ", ");
@@ -2249,8 +2352,8 @@ static void rna_generate_struct(BlenderRNA *brna, StructRNA *srna, FILE *f)
}
typedef struct RNAProcessItem {
- char *filename;
- char *api_filename;
+ const char *filename;
+ const char *api_filename;
void (*define)(BlenderRNA *brna);
} RNAProcessItem;
@@ -2312,7 +2415,7 @@ RNAProcessItem PROCESS_ITEMS[]= {
{"rna_world.c", NULL, RNA_def_world},
{NULL, NULL}};
-static void rna_generate(BlenderRNA *brna, FILE *f, char *filename, char *api_filename)
+static void rna_generate(BlenderRNA *brna, FILE *f, const char *filename, const char *api_filename)
{
StructDefRNA *ds;
PropertyDefRNA *dp;
@@ -2323,6 +2426,7 @@ static void rna_generate(BlenderRNA *brna, FILE *f, char *filename, char *api_fi
"#define RNA_RUNTIME\n\n");
fprintf(f, "#include <float.h>\n");
+ fprintf(f, "#include <stdio.h>\n");
fprintf(f, "#include <limits.h>\n");
fprintf(f, "#include <string.h>\n\n");
fprintf(f, "#include <stddef.h>\n\n");
@@ -2331,12 +2435,12 @@ static void rna_generate(BlenderRNA *brna, FILE *f, char *filename, char *api_fi
fprintf(f, "#include \"DNA_scene_types.h\"\n");
fprintf(f, "#include \"BLI_blenlib.h\"\n\n");
+ fprintf(f, "#include \"BLI_utildefines.h\"\n\n");
fprintf(f, "#include \"BKE_context.h\"\n");
fprintf(f, "#include \"BKE_library.h\"\n");
fprintf(f, "#include \"BKE_main.h\"\n");
fprintf(f, "#include \"BKE_report.h\"\n");
- fprintf(f, "#include \"BKE_utildefines.h\"\n\n");
fprintf(f, "#include \"RNA_define.h\"\n");
fprintf(f, "#include \"RNA_types.h\"\n");
@@ -2609,6 +2713,7 @@ static int rna_preprocess(char *outfile)
FILE *file;
char deffile[4096];
int i, status;
+ const char *deps[3]; /* expand as needed */
/* define rna */
brna= RNA_create();
@@ -2649,7 +2754,7 @@ static int rna_preprocess(char *outfile)
}
}
- replace_if_different(deffile);
+ replace_if_different(deffile, NULL);
rna_sort(brna);
@@ -2677,7 +2782,12 @@ static int rna_preprocess(char *outfile)
}
}
- replace_if_different(deffile);
+ /* avoid unneeded rebuilds */
+ deps[0]= PROCESS_ITEMS[i].filename;
+ deps[1]= PROCESS_ITEMS[i].api_filename;
+ deps[2]= NULL;
+
+ replace_if_different(deffile, deps);
}
/* create RNA_blender.h */
@@ -2701,7 +2811,7 @@ static int rna_preprocess(char *outfile)
}
}
- replace_if_different(deffile);
+ replace_if_different(deffile, NULL);
/* free RNA */
RNA_define_free(brna);
@@ -2726,6 +2836,7 @@ int main(int argc, char **argv)
}
else {
printf("Running makesrna, program versions %s\n", RNA_VERSION_DATE);
+ makesrna_path= argv[0];
return_status= rna_preprocess(argv[1]);
}
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c
index 4321f8aa711..e1c0bc30102 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -29,6 +29,8 @@
#include "RNA_define.h"
#include "DNA_ID.h"
+#include "DNA_vfont_types.h"
+#include "DNA_object_types.h"
#include "WM_types.h"
@@ -72,6 +74,7 @@ EnumPropertyItem id_type_items[] = {
#include "BKE_library.h"
#include "BKE_animsys.h"
#include "BKE_material.h"
+#include "BKE_depsgraph.h"
/* name functions that ignore the first two ID characters */
void rna_ID_name_get(PointerRNA *ptr, char *value)
@@ -98,7 +101,8 @@ static int rna_ID_name_editable(PointerRNA *ptr)
ID *id= (ID*)ptr->data;
if (GS(id->name) == ID_VF) {
- if (strcmp(id->name+2, "<builtin>")==0)
+ VFont *vf= (VFont *)id;
+ if (strcmp(vf->name, FO_BUILTIN_NAME)==0)
return 0;
}
@@ -188,11 +192,11 @@ void rna_ID_fake_user_set(PointerRNA *ptr, int value)
if(value && !(id->flag & LIB_FAKEUSER)) {
id->flag |= LIB_FAKEUSER;
- id->us++;
+ id_us_plus(id);
}
else if(!value && (id->flag & LIB_FAKEUSER)) {
id->flag &= ~LIB_FAKEUSER;
- id->us--;
+ id_us_min(id);
}
}
@@ -206,7 +210,7 @@ void rna_IDPropertyGroup_unregister(const bContext *C, StructRNA *type)
RNA_struct_free(&BLENDER_RNA, type);
}
-StructRNA *rna_IDPropertyGroup_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+StructRNA *rna_IDPropertyGroup_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
PointerRNA dummyptr;
@@ -221,8 +225,8 @@ StructRNA *rna_IDPropertyGroup_register(const bContext *C, ReportList *reports,
* just a char pointer, but take care here, also be careful that python
* owns the string pointer which it could potentually free while blender
* is running. */
- if(strlen(identifier) >= sizeof(((IDProperty *)NULL)->name)) {
- BKE_reportf(reports, RPT_ERROR, "registering id property class: '%s' is too long, maximum length is %d.", identifier, sizeof(((IDProperty *)NULL)->name));
+ if(BLI_strnlen(identifier, MAX_IDPROP_NAME) == MAX_IDPROP_NAME) {
+ BKE_reportf(reports, RPT_ERROR, "registering id property class: '%s' is too long, maximum length is " STRINGIFY(MAX_IDPROP_NAME) ".", identifier);
return NULL;
}
@@ -239,13 +243,50 @@ ID *rna_ID_copy(ID *id)
ID *newid;
if(id_copy(id, &newid, 0)) {
- if(newid) newid->us--;
+ if(newid) id_us_min(newid);
return newid;
}
return NULL;
}
+static void rna_ID_update_tag(ID *id, ReportList *reports, int flag)
+{
+ /* XXX, new function for this! */
+ /*if (ob->type == OB_FONT) {
+ Curve *cu = ob->data;
+ freedisplist(&cu->disp);
+ BKE_text_to_curve(sce, ob, CU_LEFT);
+ }*/
+
+ if(flag == 0) {
+ /* pass */
+ }
+ else {
+ /* ensure flag us correct for the type */
+ switch(GS(id->name)) {
+ case ID_OB:
+ if(flag & ~(OB_RECALC_ALL)) {
+ BKE_report(reports, RPT_ERROR, "'refresh' incompatible with Object ID type");
+ return;
+ }
+ break;
+ /* Could add particle updates later */
+/* case ID_PA:
+ if(flag & ~(OB_RECALC_ALL|PSYS_RECALC)) {
+ BKE_report(reports, RPT_ERROR, "'refresh' incompatible with ParticleSettings ID type");
+ return;
+ }
+ break; */
+ default:
+ BKE_report(reports, RPT_ERROR, "This ID type is not compatible with any 'refresh' options");
+ return;
+ }
+ }
+
+ DAG_id_tag_update(id, flag);
+}
+
void rna_ID_user_clear(ID *id)
{
id->us= 0; /* dont save */
@@ -380,6 +421,12 @@ static void rna_def_ID(BlenderRNA *brna)
FunctionRNA *func;
PropertyRNA *prop, *parm;
+ static EnumPropertyItem update_flag_items[] = {
+ {OB_RECALC_OB, "OBJECT", 0, "Object", ""},
+ {OB_RECALC_DATA, "DATA", 0, "Data", ""},
+ {OB_RECALC_TIME, "TIME", 0, "Time", ""},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "ID", NULL);
RNA_def_struct_ui_text(srna, "ID", "Base type for datablocks, defining a unique name, linking from other libraries and garbage collection");
RNA_def_struct_flag(srna, STRUCT_ID|STRUCT_ID_REFCOUNT);
@@ -431,6 +478,10 @@ static void rna_def_ID(BlenderRNA *brna)
func= RNA_def_function(srna, "animation_data_clear", "BKE_free_animdata");
RNA_def_function_ui_description(func, "Clear animation on this this ID.");
+ func= RNA_def_function(srna, "update_tag", "rna_ID_update_tag");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ RNA_def_function_ui_description(func, "Tag the id to update its display data.");
+ RNA_def_enum_flag(func, "refresh", update_flag_items, 0, "", "Type of updates to perform.");
}
static void rna_def_library(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index 6cb5858648a..b8e14a9bba5 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -34,6 +34,7 @@
#include "DNA_windowmanager_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_dynstr.h"
#include "BLI_ghash.h"
@@ -42,7 +43,7 @@
#include "BKE_idprop.h"
#include "BKE_main.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
+
#include "WM_api.h"
@@ -56,6 +57,8 @@
#include "rna_internal.h"
+const PointerRNA PointerRNA_NULL= {{0}};
+
/* Init/Exit */
void RNA_init()
@@ -90,8 +93,6 @@ void RNA_exit()
/* Pointer */
-PointerRNA PointerRNA_NULL = {{0}, 0, 0};
-
void RNA_main_pointer_create(struct Main *main, PointerRNA *r_ptr)
{
r_ptr->id.data= NULL;
@@ -101,11 +102,10 @@ void RNA_main_pointer_create(struct Main *main, PointerRNA *r_ptr)
void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
{
- PointerRNA tmp;
StructRNA *type, *idtype= NULL;
if(id) {
- memset(&tmp, 0, sizeof(tmp));
+ PointerRNA tmp= {{0}};
tmp.data= id;
idtype= rna_ID_refine(&tmp);
@@ -126,14 +126,15 @@ void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
{
- PointerRNA tmp;
+#if 0 /* UNUSED */
StructRNA *idtype= NULL;
if(id) {
- memset(&tmp, 0, sizeof(tmp));
+ PointerRNA tmp= {{0}};
tmp.data= id;
idtype= rna_ID_refine(&tmp);
}
+#endif
r_ptr->id.data= id;
r_ptr->type= type;
@@ -170,9 +171,8 @@ void RNA_blender_rna_pointer_create(PointerRNA *r_ptr)
PointerRNA rna_pointer_inherit_refine(PointerRNA *ptr, StructRNA *type, void *data)
{
- PointerRNA result;
-
if(data) {
+ PointerRNA result;
result.data= data;
result.type= type;
rna_pointer_inherit_id(type, ptr, &result);
@@ -185,11 +185,11 @@ PointerRNA rna_pointer_inherit_refine(PointerRNA *ptr, StructRNA *type, void *da
else
result.type= type;
}
+ return result;
+ }
+ else {
+ return PointerRNA_NULL;
}
- else
- memset(&result, 0, sizeof(result));
-
- return result;
}
/**/
@@ -235,8 +235,9 @@ IDProperty *rna_idproperty_ui(PropertyRNA *prop)
}
}
- if (idprop)
- return IDP_GetPropertyFromGroup(idprop, ((IDProperty *)prop)->name);
+ if (idprop) {
+ return IDP_GetPropertyTypeFromGroup(idprop, ((IDProperty *)prop)->name, IDP_GROUP);
+ }
return NULL;
}
@@ -447,11 +448,10 @@ static const char *rna_ensure_property_description(PropertyRNA *prop)
/* attempt to get the local ID values */
IDProperty *idp_ui= rna_idproperty_ui(prop);
- if(idp_ui) { /* TODO, type checking on ID props */
-
- IDProperty *item= IDP_GetPropertyFromGroup(idp_ui, "description");
+ if(idp_ui) {
+ IDProperty *item= IDP_GetPropertyTypeFromGroup(idp_ui, "description", IDP_STRING);
if(item)
- return (char *)item->data.pointer ;
+ return IDP_String(item);
}
return ((IDProperty*)prop)->name; /* XXX - not correct */
@@ -533,7 +533,7 @@ int RNA_struct_is_a(StructRNA *type, StructRNA *srna)
PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
{
- if(identifier[0]=='[' && ELEM(identifier[1], '"', '\'')) { // " (dummy comment to avoid confusing some function lists in text editors)
+ if(identifier[0]=='[' && identifier[1]=='"') { // " (dummy comment to avoid confusing some function lists in text editors)
/* id prop lookup, not so common */
PropertyRNA *r_prop= NULL;
PointerRNA r_ptr; /* only support single level props */
@@ -569,11 +569,17 @@ PropertyRNA *RNA_struct_find_nested(PointerRNA *ptr, StructRNA *srna)
return prop;
}
-const struct ListBase *RNA_struct_defined_properties(StructRNA *srna)
+/* low level direct access to type->properties, note this ignores parent classes so should be used with care */
+const struct ListBase *RNA_struct_type_properties(StructRNA *srna)
{
return &srna->cont.properties;
}
+PropertyRNA *RNA_struct_type_find_property(StructRNA *srna, const char *identifier)
+{
+ return BLI_findstring_ptr(&srna->cont.properties, identifier, offsetof(PropertyRNA, identifier));
+}
+
FunctionRNA *RNA_struct_find_function(PointerRNA *ptr, const char *identifier)
{
#if 1
@@ -610,7 +616,7 @@ FunctionRNA *RNA_struct_find_function(PointerRNA *ptr, const char *identifier)
#endif
}
-const struct ListBase *RNA_struct_defined_functions(StructRNA *srna)
+const struct ListBase *RNA_struct_type_functions(StructRNA *srna)
{
return &srna->functions;
}
@@ -707,8 +713,8 @@ int RNA_property_array_dimension(PointerRNA *ptr, PropertyRNA *prop, int length[
{
PropertyRNA *rprop= rna_ensure_property(prop);
- if(length && rprop->arraydimension > 1)
- rna_ensure_property_multi_array_length(ptr, prop, length);
+ if(length)
+ rna_ensure_property_multi_array_length(ptr, prop, length);
return rprop->arraydimension;
}
@@ -797,14 +803,15 @@ void RNA_property_int_range(PointerRNA *ptr, PropertyRNA *prop, int *hardmin, in
if(prop->magic != RNA_MAGIC) {
/* attempt to get the local ID values */
IDProperty *idp_ui= rna_idproperty_ui(prop);
- IDProperty *item;
- if(idp_ui) { /* TODO, type checking on ID props */
- item= IDP_GetPropertyFromGroup(idp_ui, "min");
- *hardmin= item ? item->data.val : INT_MIN;
+ if(idp_ui) {
+ IDProperty *item;
+
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "min", IDP_INT);
+ *hardmin= item ? IDP_Int(item) : INT_MIN;
- item= IDP_GetPropertyFromGroup(idp_ui, "max");
- *hardmax= item ? item->data.val : INT_MAX;
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "max", IDP_INT);
+ *hardmax= item ? IDP_Int(item) : INT_MAX;
return;
}
@@ -827,17 +834,18 @@ void RNA_property_int_ui_range(PointerRNA *ptr, PropertyRNA *prop, int *softmin,
if(prop->magic != RNA_MAGIC) {
/* attempt to get the local ID values */
IDProperty *idp_ui= rna_idproperty_ui(prop);
- IDProperty *item;
- if(idp_ui) { /* TODO, type checking on ID props */
- item= IDP_GetPropertyFromGroup(idp_ui, "soft_min");
- *softmin= item ? item->data.val : INT_MIN;
+ if(idp_ui) {
+ IDProperty *item;
+
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "soft_min", IDP_INT);
+ *softmin= item ? IDP_Int(item) : INT_MIN;
- item= IDP_GetPropertyFromGroup(idp_ui, "soft_max");
- *softmax= item ? item->data.val : INT_MAX;
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "soft_max", IDP_INT);
+ *softmax= item ? IDP_Int(item) : INT_MAX;
- item= IDP_GetPropertyFromGroup(idp_ui, "step");
- *step= item ? item->data.val : 1;
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "step", IDP_INT);
+ *step= item ? IDP_Int(item) : 1;
return;
}
@@ -863,14 +871,15 @@ void RNA_property_float_range(PointerRNA *ptr, PropertyRNA *prop, float *hardmin
if(prop->magic != RNA_MAGIC) {
/* attempt to get the local ID values */
IDProperty *idp_ui= rna_idproperty_ui(prop);
- IDProperty *item;
- if(idp_ui) { /* TODO, type checking on ID props */
- item= IDP_GetPropertyFromGroup(idp_ui, "min");
- *hardmin= item ? *(double*)&item->data.val : FLT_MIN;
+ if(idp_ui) {
+ IDProperty *item;
+
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "min", IDP_DOUBLE);
+ *hardmin= item ? IDP_Double(item) : FLT_MIN;
- item= IDP_GetPropertyFromGroup(idp_ui, "max");
- *hardmax= item ? *(double*)&item->data.val : FLT_MAX;
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "max", IDP_DOUBLE);
+ *hardmax= item ? IDP_Double(item) : FLT_MAX;
return;
}
@@ -893,20 +902,21 @@ void RNA_property_float_ui_range(PointerRNA *ptr, PropertyRNA *prop, float *soft
if(prop->magic != RNA_MAGIC) {
/* attempt to get the local ID values */
IDProperty *idp_ui= rna_idproperty_ui(prop);
- IDProperty *item;
- if(idp_ui) { /* TODO, type checking on ID props */
- item= IDP_GetPropertyFromGroup(idp_ui, "soft_min");
- *softmin= item ? *(double*)&item->data.val : FLT_MIN;
+ if(idp_ui) {
+ IDProperty *item;
- item= IDP_GetPropertyFromGroup(idp_ui, "soft_max");
- *softmax= item ? *(double*)&item->data.val : FLT_MAX;
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "soft_min", IDP_DOUBLE);
+ *softmin= item ? IDP_Double(item) : FLT_MIN;
- item= IDP_GetPropertyFromGroup(idp_ui, "step");
- *step= item ? *(double*)&item->data.val : 1.0f;
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "soft_max", IDP_DOUBLE);
+ *softmax= item ? IDP_Double(item) : FLT_MAX;
- item= IDP_GetPropertyFromGroup(idp_ui, "precision");
- *precision= item ? *(double*)&item->data.val : 3.0f;
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "step", IDP_DOUBLE);
+ *step= item ? IDP_Double(item) : 1.0f;
+
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "precision", IDP_DOUBLE);
+ *precision= item ? IDP_Double(item) : 3.0f;
return;
}
@@ -1241,6 +1251,29 @@ int RNA_property_animated(PointerRNA *ptr, PropertyRNA *prop)
return 0;
}
+
+/* this function is to check if its possible to create a valid path from the ID
+ * its slow so dont call in a loop */
+int RNA_property_path_from_ID_check(PointerRNA *ptr, PropertyRNA *prop)
+{
+ char *path= RNA_path_from_ID_to_property(ptr, prop);
+ int ret= 0;
+
+ if(path) {
+ PointerRNA id_ptr;
+ PointerRNA r_ptr;
+ PropertyRNA *r_prop;
+
+ RNA_id_pointer_create(ptr->id.data, &id_ptr);
+ RNA_path_resolve(&id_ptr, path, &r_ptr, &r_prop);
+ ret= (prop == r_prop);
+ MEM_freeN(path);
+ }
+
+ return ret;
+}
+
+
static void rna_property_update(bContext *C, Main *bmain, Scene *scene, PointerRNA *ptr, PropertyRNA *prop)
{
int is_rna = (prop->magic == RNA_MAGIC);
@@ -1262,12 +1295,20 @@ static void rna_property_update(bContext *C, Main *bmain, Scene *scene, PointerR
else {
/* WARNING! This is so property drivers update the display!
* not especially nice */
- DAG_id_flush_update(ptr->id.data, OB_RECALC_ALL);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME);
WM_main_add_notifier(NC_WINDOW, NULL);
}
}
+/* must keep in sync with 'rna_property_update'
+ * note, its possible this returns a false positive in the case of PROP_CONTEXT_UPDATE
+ * but this isnt likely to be a performance problem. */
+int RNA_property_update_check(PropertyRNA *prop)
+{
+ return (prop->magic != RNA_MAGIC || prop->update || prop->noteflag);
+}
+
void RNA_property_update(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
{
rna_property_update(C, CTX_data_main(C), CTX_data_scene(C), ptr, prop);
@@ -1966,18 +2007,15 @@ PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
return RNA_property_pointer_get(ptr, prop);
}
else {
- PointerRNA result;
-
- memset(&result, 0, sizeof(result));
- return result;
+ return PointerRNA_NULL;
}
}
void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr_value)
{
- IDProperty *idprop;
+ /*IDProperty *idprop;*/
- if((idprop=rna_idproperty_check(&prop, ptr))) {
+ if((/*idprop=*/ rna_idproperty_check(&prop, ptr))) {
/* not supported */
}
else {
@@ -1992,11 +2030,17 @@ void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr
}
}
+PointerRNA RNA_property_pointer_get_default(PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop))
+{
+ //PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
+ return PointerRNA_NULL; // FIXME: there has to be a way...
+}
+
void RNA_property_pointer_add(PointerRNA *ptr, PropertyRNA *prop)
{
- IDProperty *idprop;
+ /*IDProperty *idprop;*/
- if((idprop=rna_idproperty_check(&prop, ptr))) {
+ if((/*idprop=*/rna_idproperty_check(&prop, ptr))) {
/* already exists */
}
else if(prop->flag & PROP_IDPROPERTY) {
@@ -2277,8 +2321,7 @@ int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int k
if(cprop->lookupint) {
/* we have a callback defined, use it */
- *r_ptr= cprop->lookupint(ptr, key);
- return (r_ptr->data != NULL);
+ return cprop->lookupint(ptr, key, r_ptr);
}
else {
/* no callback defined, just iterate and find the nth item */
@@ -2307,8 +2350,7 @@ int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, co
if(cprop->lookupstring) {
/* we have a callback defined, use it */
- *r_ptr= cprop->lookupstring(ptr, key);
- return (r_ptr->data != NULL);
+ return cprop->lookupstring(ptr, key, r_ptr);
}
else {
/* no callback defined, compare with name properties if they exist */
@@ -2422,7 +2464,7 @@ int RNA_raw_type_sizeof(RawPropertyType type)
}
}
-static int rna_raw_access(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *inarray, RawPropertyType intype, int inlen, int set)
+static int rna_raw_access(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, const char *propname, void *inarray, RawPropertyType intype, int inlen, int set)
{
StructRNA *ptype;
PointerRNA itemptr;
@@ -2724,12 +2766,12 @@ RawPropertyType RNA_property_raw_type(PropertyRNA *prop)
return prop->rawtype;
}
-int RNA_property_collection_raw_get(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *array, RawPropertyType type, int len)
+int RNA_property_collection_raw_get(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, const char *propname, void *array, RawPropertyType type, int len)
{
return rna_raw_access(reports, ptr, prop, propname, array, type, len, 0);
}
-int RNA_property_collection_raw_set(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *array, RawPropertyType type, int len)
+int RNA_property_collection_raw_set(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, const char *propname, void *array, RawPropertyType type, int len)
{
return rna_raw_access(reports, ptr, prop, propname, array, type, len, 1);
}
@@ -2792,6 +2834,10 @@ void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int i
if(ptr == NULL)
length= 0;
+ else if (length == 0) {
+ ptr= NULL;
+ itemsize= 0;
+ }
internal= MEM_callocN(sizeof(ArrayIterator), "ArrayIterator");
internal->ptr= ptr;
@@ -2799,7 +2845,8 @@ void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int i
internal->endptr= ((char*)ptr)+length*itemsize;
internal->itemsize= itemsize;
internal->skip= skip;
-
+ internal->length= length;
+
iter->internal= internal;
iter->valid= (internal->ptr != internal->endptr);
@@ -2879,7 +2926,7 @@ static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int
/* 2 kinds of lookups now, quoted or unquoted */
quote= *p;
- if(quote != '\'' && quote != '"')
+ if(quote != '"')
quote= 0;
if(quote==0) {
@@ -2958,14 +3005,6 @@ static int rna_token_strip_quotes(char *token)
return 1;
}
}
- else if(token[0]=='\'') {
- int len = strlen(token);
- if (len >= 2 && token[len-1]=='\'') {
- /* strip away "" */
- token[len-1]= '\0';
- return 1;
- }
- }
return 0;
}
@@ -3049,6 +3088,9 @@ int RNA_path_resolve_full(PointerRNA *ptr, const char *path, PointerRNA *r_ptr,
else {
/* otherwise do int lookup */
intkey= atoi(token);
+ if(intkey==0 && (token[0] != '0' || token[1] != '\0')) {
+ return 0; /* we can be sure the fixedbuf was used in this case */
+ }
RNA_property_collection_lookup_int(&curptr, prop, intkey, &nextptr);
}
@@ -3084,25 +3126,76 @@ int RNA_path_resolve_full(PointerRNA *ptr, const char *path, PointerRNA *r_ptr,
*index= -1;
if (*path) {
- if (*path=='[') {
- token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 1);
+ int index_arr[RNA_MAX_ARRAY_DIMENSION]= {0};
+ int len[RNA_MAX_ARRAY_DIMENSION];
+ const int dim= RNA_property_array_dimension(&curptr, prop, len);
+ int i, temp_index;
- /* check for "" to see if it is a string */
- if(rna_token_strip_quotes(token)) {
- *index= RNA_property_array_item_index(prop, *(token+1));
+ for(i=0; i<dim; i++) {
+ temp_index= -1;
+
+ /* multi index resolve */
+ if (*path=='[') {
+ token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 1);
+
+ if(token==NULL) {
+ /* invalid syntax blah[] */
+ return 0;
+ }
+ /* check for "" to see if it is a string */
+ else if(rna_token_strip_quotes(token)) {
+ temp_index= RNA_property_array_item_index(prop, *(token+1));
+ }
+ else {
+ /* otherwise do int lookup */
+ temp_index= atoi(token);
+
+ if(temp_index==0 && (token[0] != '0' || token[1] != '\0')) {
+ if(token != fixedbuf) {
+ MEM_freeN(token);
+ }
+
+ return 0;
+ }
+ }
}
- else {
- /* otherwise do int lookup */
- *index= atoi(token);
+ else if(dim==1) {
+ /* location.x || scale.X, single dimension arrays only */
+ token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 0);
+ if(token==NULL) {
+ /* invalid syntax blah.. */
+ return 0;
+ }
+ temp_index= RNA_property_array_item_index(prop, *token);
}
+
+ if(token != fixedbuf) {
+ MEM_freeN(token);
+ }
+
+ /* out of range */
+ if(temp_index < 0 || temp_index >= len[i])
+ return 0;
+
+ index_arr[i]= temp_index;
+ /* end multi index resolve */
}
- else {
- token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 0);
- *index= RNA_property_array_item_index(prop, *token);
+
+ /* arrays always contain numbers so further values are not valid */
+ if(*path) {
+ return 0;
}
+ else {
+ int totdim= 1;
+ int flat_index= 0;
+
+ for(i=dim-1; i>=0; i--) {
+ flat_index += index_arr[i] * totdim;
+ totdim *= len[i];
+ }
- if(token != fixedbuf)
- MEM_freeN(token);
+ *index= flat_index;
+ }
}
}
}
@@ -3212,6 +3305,143 @@ char *RNA_path_back(const char *path)
return result;
}
+/* generic path search func
+ * if its needed this could also reference the IDProperty direct */
+typedef struct IDP_Chain {
+ struct IDP_Chain *up; /* parent member, reverse and set to child for path conversion. */
+
+ const char *name;
+ int index;
+
+} IDP_Chain;
+
+static char *rna_idp_path_create(IDP_Chain *child_link)
+{
+ DynStr *dynstr= BLI_dynstr_new();
+ char *path;
+ short first= TRUE;
+
+ int tot= 0;
+ IDP_Chain *link= child_link;
+
+ /* reverse the list */
+ IDP_Chain *link_prev;
+ link_prev= NULL;
+ while(link) {
+ IDP_Chain *link_next= link->up;
+ link->up= link_prev;
+ link_prev= link;
+ link= link_next;
+ tot++;
+ }
+
+ for(link= link_prev; link; link= link->up) {
+ /* pass */
+ if(link->index >= 0) {
+ BLI_dynstr_appendf(dynstr, first ? "%s[%d]" : ".%s[%d]", link->name, link->index);
+ }
+ else {
+ BLI_dynstr_appendf(dynstr, first ? "%s" : ".%s", link->name);
+ }
+
+ first= FALSE;
+ }
+
+ path= BLI_dynstr_get_cstring(dynstr);
+ BLI_dynstr_free(dynstr);
+
+ if(*path=='\0') {
+ MEM_freeN(path);
+ path= NULL;
+ }
+
+ return path;
+}
+
+static char *rna_idp_path(PointerRNA *ptr, IDProperty *haystack, IDProperty *needle, IDP_Chain *parent_link)
+{
+ char *path= NULL;
+ IDP_Chain link;
+
+ IDProperty *iter;
+ int i;
+
+ BLI_assert(haystack->type == IDP_GROUP);
+
+ link.up= parent_link;
+ link.name= NULL;
+ link.index= -1;
+
+ for (i=0, iter= haystack->data.group.first; iter; iter= iter->next, i++) {
+ if(needle == iter) { /* found! */
+ link.name= iter->name;
+ path= rna_idp_path_create(&link);
+ break;
+ }
+ else {
+ if(iter->type == IDP_GROUP) {
+ /* ensure this is RNA */
+ PointerRNA child_ptr= RNA_pointer_get(ptr, iter->name);
+ if(child_ptr.type) {
+ link.name= iter->name;
+ if((path= rna_idp_path(&child_ptr, iter, needle, &link))) {
+ break;
+ }
+ }
+ }
+ else if (iter->type == IDP_IDPARRAY) {
+ PropertyRNA *prop= RNA_struct_find_property(ptr, iter->name);
+ if(prop && prop->type == PROP_COLLECTION) {
+ IDProperty *array= IDP_IDPArray(iter);
+ if(needle >= array && needle < (iter->len + array)) { /* found! */
+ link.name= iter->name;
+ link.index= (int)(needle - array);
+ path= rna_idp_path_create(&link);
+ break;
+ }
+ else {
+ int i;
+ link.name= iter->name;
+ for(i= 0; i < iter->len; i++, array++) {
+ PointerRNA child_ptr;
+ if(RNA_property_collection_lookup_int(ptr, prop, i, &child_ptr)) {
+ link.index= i;
+ if((path= rna_idp_path(&child_ptr, array, needle, &link))) {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return path;
+}
+
+static char *rna_path_from_ID_to_idpgroup(PointerRNA *ptr)
+{
+ PointerRNA id_ptr;
+ IDProperty *haystack;
+ IDProperty *needle;
+
+ BLI_assert(ptr->id.data != NULL);
+
+ /* TODO, Support Bones/PoseBones. no pointers stored to the bones from here, only the ID. See example in [#25746]
+ * unless this is added only way to find this is to also search all bones and pose bones of an armature or object */
+ RNA_id_pointer_create(ptr->id.data, &id_ptr);
+
+ haystack= RNA_struct_idprops(&id_ptr, FALSE);
+ if(haystack) { /* can fail when called on bones */
+ needle= ptr->data;
+ return rna_idp_path(&id_ptr, haystack, needle, NULL);
+ }
+ else {
+ return NULL;
+ }
+}
+
char *RNA_path_from_ID_to_struct(PointerRNA *ptr)
{
char *ptrpath=NULL;
@@ -3239,6 +3469,10 @@ char *RNA_path_from_ID_to_struct(PointerRNA *ptr)
else
return NULL; // can't do anything about this case yet...
}
+ else if (RNA_struct_is_a(ptr->type, &RNA_IDPropertyGroup)) {
+ /* special case, easier to deal with here then in ptr->type->path() */
+ return rna_path_from_ID_to_idpgroup(ptr);
+ }
else
return NULL;
}
@@ -3557,12 +3791,9 @@ PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
return RNA_property_pointer_get(ptr, prop);
}
else {
- PointerRNA result;
-
printf("RNA_pointer_get: %s.%s not found.\n", ptr->type->identifier, name);
- memset(&result, 0, sizeof(result));
- return result;
+ return PointerRNA_NULL;
}
}
@@ -3758,17 +3989,44 @@ char *RNA_property_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
const char *identifier;
int val = RNA_property_enum_get(ptr, prop);
- if(RNA_property_enum_identifier(C, ptr, prop, val, &identifier)) {
+ if(RNA_property_flag(prop) & PROP_ENUM_FLAG) {
+ /* represent as a python set */
+ EnumPropertyItem *item= NULL;
+ int free;
+
+ BLI_dynstr_append(dynstr, "{");
+
+ RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
+ if(item) {
+ short is_first= TRUE;
+ for (; item->identifier; item++) {
+ if(item->identifier[0] && item->value & val) {
+ BLI_dynstr_appendf(dynstr, is_first ? "'%s'" : ", '%s'", item->identifier);
+ is_first= FALSE;
+ }
+ }
+
+ if(free) {
+ MEM_freeN(item);
+ }
+ }
+
+ BLI_dynstr_append(dynstr, "}");
+ }
+ else if(RNA_property_enum_identifier(C, ptr, prop, val, &identifier)) {
BLI_dynstr_appendf(dynstr, "'%s'", identifier);
}
else {
- BLI_dynstr_appendf(dynstr, "'<UNKNOWN ENUM>'", identifier);
+ BLI_dynstr_append(dynstr, "'<UNKNOWN ENUM>'");
}
break;
}
case PROP_POINTER:
{
- BLI_dynstr_append(dynstr, "'<POINTER>'"); /* TODO */
+ PointerRNA tptr= RNA_property_pointer_get(ptr, prop);
+ cstring= RNA_pointer_as_string(&tptr);
+ BLI_dynstr_append(dynstr, cstring);
+ MEM_freeN(cstring);
break;
}
case PROP_COLLECTION:
@@ -3956,8 +4214,6 @@ int RNA_parameter_list_ret_count(ParameterList *parms)
void RNA_parameter_list_begin(ParameterList *parms, ParameterIterator *iter)
{
- PropertyType ptype;
-
RNA_pointer_create(NULL, &RNA_Function, parms->func, &iter->funcptr);
iter->parms= parms;
@@ -3967,15 +4223,12 @@ void RNA_parameter_list_begin(ParameterList *parms, ParameterIterator *iter)
if(iter->valid) {
iter->size= rna_parameter_size_alloc(iter->parm);
- iter->data= (((char*)iter->parms->data)+iter->offset);
- ptype= RNA_property_type(iter->parm);
+ iter->data= (((char*)iter->parms->data)); /* +iter->offset, always 0 */
}
}
void RNA_parameter_list_next(ParameterIterator *iter)
{
- PropertyType ptype;
-
iter->offset+= iter->size;
iter->parm= iter->parm->next;
iter->valid= iter->parm != NULL;
@@ -3983,7 +4236,6 @@ void RNA_parameter_list_next(ParameterIterator *iter)
if(iter->valid) {
iter->size= rna_parameter_size_alloc(iter->parm);
iter->data= (((char*)iter->parms->data)+iter->offset);
- ptype= RNA_property_type(iter->parm);
}
}
@@ -4023,7 +4275,7 @@ void RNA_parameter_get_lookup(ParameterList *parms, const char *identifier, void
RNA_parameter_get(parms, parm, value);
}
-void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, void *value)
+void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, const void *value)
{
ParameterIterator iter;
@@ -4039,7 +4291,7 @@ void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, void *value)
RNA_parameter_list_end(&iter);
}
-void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, void *value)
+void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, const void *value)
{
PropertyRNA *parm;
@@ -4165,7 +4417,7 @@ static int rna_function_format_array_length(const char *format, int ofs, int fle
for (; ofs<flen && format[ofs]!=']' && idx<sizeof(*lenbuf)-1; idx++, ofs++)
lenbuf[idx]= format[ofs];
- if (ofs<flen && format[ofs++]==']') {
+ if (ofs<flen && format[ofs+1]==']') {
/* XXX put better error reporting for ofs>=flen or idx over lenbuf capacity */
lenbuf[idx]= '\0';
return atoi(lenbuf);
@@ -4579,9 +4831,15 @@ int RNA_property_reset(PointerRNA *ptr, PropertyRNA *prop, int index)
return 1;
}
- //case PROP_POINTER:
+ case PROP_POINTER:
+ {
+ PointerRNA value= RNA_property_pointer_get_default(ptr, prop);
+ RNA_property_pointer_set(ptr, prop, value);
+ return 1;
+ }
+
default:
- // FIXME: many of the other types such as strings and pointers need this implemented too!
+ // FIXME: are there still any cases that haven't been handled? comment out "default" block to check :)
return 0;
}
}
@@ -4684,4 +4942,3 @@ int RNA_property_copy(PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop, i
return 0;
}
-
diff --git a/source/blender/makesrna/intern/rna_action.c b/source/blender/makesrna/intern/rna_action.c
index 42ddf340f12..f9f6478cc3d 100644
--- a/source/blender/makesrna/intern/rna_action.c
+++ b/source/blender/makesrna/intern/rna_action.c
@@ -59,7 +59,7 @@ static void rna_ActionGroup_channels_next(CollectionPropertyIterator *iter)
iter->valid= (internal->link != NULL);
}
-static bActionGroup *rna_Action_groups_new(bAction *act, char name[])
+static bActionGroup *rna_Action_groups_new(bAction *act, const char name[])
{
return action_groups_add_new(act, name);
}
@@ -89,7 +89,7 @@ static void rna_Action_groups_remove(bAction *act, ReportList *reports, bActionG
MEM_freeN(agrp);
}
-static FCurve *rna_Action_fcurve_new(bAction *act, ReportList *reports, char *data_path, int index, char *group)
+static FCurve *rna_Action_fcurve_new(bAction *act, ReportList *reports, const char *data_path, int index, const char *group)
{
if(group && group[0]=='\0') group= NULL;
@@ -128,7 +128,7 @@ static void rna_Action_fcurve_remove(bAction *act, ReportList *reports, FCurve *
}
}
-static TimeMarker *rna_Action_pose_markers_new(bAction *act, ReportList *reports, char name[])
+static TimeMarker *rna_Action_pose_markers_new(bAction *act, ReportList *reports, const char name[])
{
TimeMarker *marker = MEM_callocN(sizeof(TimeMarker), "TimeMarker");
marker->flag= 1;
@@ -235,6 +235,12 @@ static void rna_def_dopesheet(BlenderRNA *brna)
RNA_def_property_ui_icon(prop, ICON_MESH_DATA, 0);
RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
+ prop= RNA_def_property(srna, "show_lattices", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOLAT);
+ RNA_def_property_ui_text(prop, "Display Lattices", "Include visualization of Lattice related Animation data");
+ RNA_def_property_ui_icon(prop, ICON_LATTICE_DATA, 0);
+ RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
+
prop= RNA_def_property(srna, "show_cameras", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOCAM);
RNA_def_property_ui_text(prop, "Display Camera", "Include visualization of Camera related Animation data");
@@ -399,8 +405,8 @@ static void rna_def_action_fcurves(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
parm= RNA_def_string(func, "data_path", "", 0, "Data Path", "FCurve data path to use.");
RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_int(func, "array_index", 0, 0, INT_MAX, "Index", "Array index.", 0, INT_MAX);
- parm= RNA_def_string(func, "action_group", "", 0, "Action Group", "Acton group to add this fcurve into.");
+ RNA_def_int(func, "array_index", 0, 0, INT_MAX, "Index", "Array index.", 0, INT_MAX);
+ RNA_def_string(func, "action_group", "", 0, "Action Group", "Acton group to add this fcurve into.");
parm= RNA_def_pointer(func, "fcurve", "FCurve", "", "Newly created fcurve");
RNA_def_function_return(func, parm);
diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c
index 663b52055da..7e6c6d92cf1 100644
--- a/source/blender/makesrna/intern/rna_actuator.c
+++ b/source/blender/makesrna/intern/rna_actuator.c
@@ -25,6 +25,7 @@
#include <stdlib.h>
#include "RNA_define.h"
+#include "RNA_access.h"
#include "rna_internal.h"
#include "DNA_constraint_types.h"
@@ -34,6 +35,8 @@
#include "WM_types.h"
+#include "BLI_utildefines.h"
+
/* Always keep in alphabetical order */
EnumPropertyItem actuator_type_items[] ={
{ACT_ACTION, "ACTION", 0, "Action", ""},
@@ -41,7 +44,7 @@ EnumPropertyItem actuator_type_items[] ={
{ACT_CAMERA, "CAMERA", 0, "Camera", ""},
{ACT_CONSTRAINT, "CONSTRAINT", 0, "Constraint", ""},
{ACT_EDIT_OBJECT, "EDIT_OBJECT", 0, "Edit Object", ""},
- {ACT_IPO, "F-Curve", 0, "F-Curve", ""},
+ {ACT_IPO, "FCURVE", 0, "F-Curve", ""},
{ACT_2DFILTER, "FILTER_2D", 0, "Filter 2D", ""},
{ACT_GAME, "GAME", 0, "Game", ""},
{ACT_MESSAGE, "MESSAGE", 0, "Message", ""},
@@ -119,6 +122,29 @@ static void rna_Actuator_type_set(struct PointerRNA *ptr, int value)
}
}
+static void rna_ConstraintActuator_type_set(struct PointerRNA *ptr, int value)
+{
+ bActuator *act= (bActuator *)ptr->data;
+ bConstraintActuator *ca= act->data;
+ if (value != ca->type)
+ {
+ ca->type = value;
+ switch (ca->type) {
+ case ACT_CONST_TYPE_ORI:
+ /* negative axis not supported in the orientation mode */
+ if (ELEM3(ca->mode, ACT_CONST_DIRNX,ACT_CONST_DIRNY, ACT_CONST_DIRNZ))
+ ca->mode = ACT_CONST_NONE;
+ break;
+
+ case ACT_CONST_TYPE_LOC:
+ case ACT_CONST_TYPE_DIST:
+ case ACT_CONST_TYPE_FH:
+ default:
+ break;
+ }
+ }
+}
+
static float rna_ConstraintActuator_limitmin_get(struct PointerRNA *ptr)
{
bActuator *act = (bActuator*)ptr->data;
@@ -286,7 +312,6 @@ static void rna_ConstraintActuator_spring_set(struct PointerRNA *ptr, float valu
*fp = value;
}
-
/* ConstraintActuator uses the same property for Material and Property.
Therefore we need to clear the property when "use_material_detect" mode changes */
static void rna_Actuator_constraint_detect_material_set(struct PointerRNA *ptr, int value)
@@ -326,6 +351,33 @@ static void rna_FcurveActuator_force_set(struct PointerRNA *ptr, int value)
ia->flag &= ~ACT_IPOFORCE;
}
+
+static void rna_ObjectActuator_type_set(struct PointerRNA *ptr, int value)
+{
+ bActuator *act= (bActuator *)ptr->data;
+ bObjectActuator *oa = act->data;
+ if (value != oa->type)
+ {
+ oa->type = value;
+ switch (oa->type) {
+ case ACT_OBJECT_NORMAL:
+ memset(oa, 0, sizeof(bObjectActuator));
+ oa->flag = ACT_FORCE_LOCAL|ACT_TORQUE_LOCAL|ACT_DLOC_LOCAL|ACT_DROT_LOCAL;
+ oa->type = ACT_OBJECT_NORMAL;
+ break;
+
+ case ACT_OBJECT_SERVO:
+ memset(oa, 0, sizeof(bObjectActuator));
+ oa->flag = ACT_LIN_VEL_LOCAL;
+ oa->type = ACT_OBJECT_SERVO;
+ oa->forcerot[0] = 30.0f;
+ oa->forcerot[1] = 0.5f;
+ oa->forcerot[2] = 0.0f;
+ break;
+ }
+ }
+}
+
static void rna_ObjectActuator_integralcoefficient_set(struct PointerRNA *ptr, float value)
{
bActuator *act = (bActuator*)ptr->data;
@@ -363,7 +415,7 @@ EnumPropertyItem *rna_Actuator_type_itemf(bContext *C, PointerRNA *ptr, int *fre
Object *ob= NULL;
int totitem= 0;
- if (ptr->type == &RNA_Actuator) {
+ if (ptr->type==&RNA_Actuator || RNA_struct_is_a(ptr->type, &RNA_Actuator)){
ob = (Object *)ptr->id.data;
} else {
/* can't use ob from ptr->id.data because that enum is also used by operators */
@@ -529,7 +581,7 @@ static void rna_def_action_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "play_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_type_items);
- RNA_def_property_ui_text(prop, "Action type", "Action playback type");
+ RNA_def_property_ui_text(prop, "Action Type", "Action playback type");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE);
@@ -551,16 +603,16 @@ static void rna_def_action_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Property", "Use this property to define the Action position");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "sta");
- RNA_def_property_range(prop, 0, MAXFRAME);
- RNA_def_property_ui_text(prop, "Start frame", "");
+ prop= RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "sta");
+ RNA_def_property_ui_range(prop, 0.0, MAXFRAME, 100, 2);
+ RNA_def_property_ui_text(prop, "Start Frame", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "end");
- RNA_def_property_range(prop, 0, MAXFRAME);
- RNA_def_property_ui_text(prop, "End frame", "");
+ prop= RNA_def_property(srna, "frame_end", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "end");
+ RNA_def_property_ui_range(prop, 0.0, MAXFRAME, 100, 2);
+ RNA_def_property_ui_text(prop, "End Frame", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "frame_blend_in", PROP_INT, PROP_NONE);
@@ -606,6 +658,7 @@ static void rna_def_object_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_type_items);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_ObjectActuator_type_set", NULL);
RNA_def_property_ui_text(prop, "Motion Type", "Specify the motion system");
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -685,7 +738,7 @@ static void rna_def_object_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Loc", "Sets the location");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "offset_rotation", PROP_FLOAT, PROP_XYZ);
+ prop= RNA_def_property(srna, "offset_rotation", PROP_FLOAT, PROP_EULER);
RNA_def_property_float_sdna(prop, NULL, "drot");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 2);
@@ -797,15 +850,15 @@ static void rna_def_fcurve_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "F-Curve Type", "Specify the way you want to play the animation");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "sta");
- RNA_def_property_ui_range(prop, 1, MAXFRAME, 1, 1);
+ prop= RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "sta");
+ RNA_def_property_ui_range(prop, 1.0, MAXFRAME, 100, 2);
RNA_def_property_ui_text(prop, "Start Frame", "");
RNA_def_property_update(prop, NC_SCENE, NULL);
- prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "end");
- RNA_def_property_ui_range(prop, 1, MAXFRAME, 1, 1);
+ prop= RNA_def_property(srna, "frame_end", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "end");
+ RNA_def_property_ui_range(prop, 1.0, MAXFRAME, 100, 2);
RNA_def_property_ui_text(prop, "End Frame", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -1014,7 +1067,7 @@ static void rna_def_property_actuator(BlenderRNA *brna)
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "value", PROP_STRING, PROP_NONE);
- RNA_def_property_ui_text(prop, "Value", "The value to use, use \"\" around strings");
+ RNA_def_property_ui_text(prop, "Value", "The name of the property or the value to use (use \"\" around strings)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* Copy Mode */
@@ -1064,6 +1117,14 @@ static void rna_def_constraint_actuator(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL}
};
+ static EnumPropertyItem prop_direction_pos_items[] ={
+ {ACT_CONST_NONE, "NONE", 0, "None", ""},
+ {ACT_CONST_DIRPX, "DIRPX", 0, "X axis", ""},
+ {ACT_CONST_DIRPY, "DIRPY", 0, "Y axis", ""},
+ {ACT_CONST_DIRPZ, "DIRPZ", 0, "Z axis", ""},
+ {0, NULL, 0, NULL, NULL}
+ };
+
srna= RNA_def_struct(brna, "ConstraintActuator", "Actuator");
RNA_def_struct_ui_text(srna, "Constraint Actuator", "Actuator to handle Constraints");
RNA_def_struct_sdna_from(srna, "bConstraintActuator", "data");
@@ -1071,6 +1132,7 @@ static void rna_def_constraint_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_type_items);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_ConstraintActuator_type_set", NULL);
RNA_def_property_ui_text(prop, "Constraints Mode", "The type of the constraint");
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -1105,7 +1167,7 @@ static void rna_def_constraint_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Max", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "damping", PROP_INT, PROP_PERCENTAGE);
+ prop= RNA_def_property(srna, "damping", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "damp");
RNA_def_property_ui_range(prop, 0, 100, 1, 1);
RNA_def_property_ui_text(prop, "Damping", "Damping factor: time constant (in frame) of low pass filter");
@@ -1142,13 +1204,19 @@ static void rna_def_constraint_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Time", "Maximum activation time in frame, 0 for unlimited");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "damping_rotation", PROP_INT, PROP_PERCENTAGE);
+ prop= RNA_def_property(srna, "damping_rotation", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "rotdamp");
RNA_def_property_ui_range(prop, 0, 100, 1, 1);
- RNA_def_property_ui_text(prop, "rotDamp", "Use a different damping for orientation");
+ RNA_def_property_ui_text(prop, "RotDamp", "Use a different damping for orientation");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* ACT_CONST_TYPE_ORI */
+ prop= RNA_def_property(srna, "direction_axis_pos", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "mode");
+ RNA_def_property_enum_items(prop, prop_direction_pos_items);
+ RNA_def_property_ui_text(prop, "Direction", "Select the axis to be aligned along the reference direction");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
prop= RNA_def_property(srna, "rotation_max", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "maxrot");
RNA_def_property_array(prop, 3);
@@ -1156,16 +1224,16 @@ static void rna_def_constraint_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Reference Direction", "Reference Direction");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "angle_min", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "angle_min", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "minloc[0]");
- RNA_def_property_ui_range(prop, 0.0, 180.0, 10, 2);
- RNA_def_property_ui_text(prop, "Min Angle", "Minimum angle (in degree) to maintain with target direction. No correction is done if angle with target direction is between min and max");
+ RNA_def_property_range(prop, 0.0, 180.0);
+ RNA_def_property_ui_text(prop, "Min Angle", "Minimum angle to maintain with target direction. No correction is done if angle with target direction is between min and max");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "angle_max", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "angle_max", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "maxloc[0]");
- RNA_def_property_ui_range(prop, 0.0, 180.0, 10, 2);
- RNA_def_property_ui_text(prop, "Max Angle", "Maximum angle (in degree) allowed with target direction. No correction is done if angle with target direction is between min and max");
+ RNA_def_property_range(prop, 0.0, 180.0);
+ RNA_def_property_ui_text(prop, "Max Angle", "Maximum angle allowed with target direction. No correction is done if angle with target direction is between min and max");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* ACT_CONST_TYPE_FH */
@@ -1175,7 +1243,7 @@ static void rna_def_constraint_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Distance", "Height of the Fh area");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "spring", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "spring", PROP_FLOAT, PROP_PERCENTAGE);
RNA_def_property_float_funcs(prop, "rna_ConstraintActuator_spring_get", "rna_ConstraintActuator_spring_set", NULL);
RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 2);
RNA_def_property_ui_text(prop, "Fh", "Spring force within the Fh area");
@@ -1347,8 +1415,8 @@ static void rna_def_scene_actuator(BlenderRNA *brna)
{ACT_SCENE_RESTART, "RESTART", 0, "Restart", ""},
{ACT_SCENE_SET, "SET", 0, "Set Scene", ""},
{ACT_SCENE_CAMERA, "CAMERA", 0, "Set Camera", ""},
- {ACT_SCENE_ADD_FRONT, "ADDFRONT", 0, "Add OverlayScene", ""},
- {ACT_SCENE_ADD_BACK, "ADDBACK", 0, "Add BackgroundScene", ""},
+ {ACT_SCENE_ADD_FRONT, "ADDFRONT", 0, "Add Overlay Scene", ""},
+ {ACT_SCENE_ADD_BACK, "ADDBACK", 0, "Add Background Scene", ""},
{ACT_SCENE_REMOVE, "REMOVE", 0, "Remove Scene", ""},
{ACT_SCENE_SUSPEND, "SUSPEND", 0, "Suspend Scene", ""},
{ACT_SCENE_RESUME, "RESUME", 0, "Resume Scene", ""},
@@ -1400,16 +1468,16 @@ static void rna_def_random_actuator(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem prop_distribution_items[] ={
- {ACT_RANDOM_BOOL_CONST, "RESTART", 0, "Bool Constant", ""},
- {ACT_RANDOM_BOOL_UNIFORM, "SET", 0, "Bool Uniform", ""},
- {ACT_RANDOM_BOOL_BERNOUILLI, "CAMERA", 0, "Bool Bernoulli", ""},
- {ACT_RANDOM_INT_CONST, "ADDFRONT", 0, "Int Constant", ""},
- {ACT_RANDOM_INT_UNIFORM, "ADDBACK", 0, "Int Uniform", ""},
- {ACT_RANDOM_INT_POISSON, "REMOVE", 0, "Int Poisson", ""},
- {ACT_RANDOM_FLOAT_CONST, "SUSPEND", 0, "Float Constant", ""},
- {ACT_RANDOM_FLOAT_UNIFORM, "RESUME", 0, "Float Uniform", ""},
- {ACT_RANDOM_FLOAT_NORMAL, "RESUME", 0, "Float Normal", ""},
- {ACT_RANDOM_FLOAT_NEGATIVE_EXPONENTIAL, "RESUME", 0, "Float Neg. Exp.", ""},
+ {ACT_RANDOM_BOOL_CONST, "BOOL_CONSTANT", 0, "Bool Constant", ""},
+ {ACT_RANDOM_BOOL_UNIFORM, "BOOL_UNIFORM", 0, "Bool Uniform", ""},
+ {ACT_RANDOM_BOOL_BERNOUILLI, "BOOL_BERNOUILLI", 0, "Bool Bernouilli", ""},
+ {ACT_RANDOM_INT_CONST, "INT_CONSTANT", 0, "Int Constant", ""},
+ {ACT_RANDOM_INT_UNIFORM, "INT_UNIFORM", 0, "Int Uniform", ""},
+ {ACT_RANDOM_INT_POISSON, "INT_POISSON", 0, "Int Poisson", ""},
+ {ACT_RANDOM_FLOAT_CONST, "FLOAT_CONSTANT", 0, "Float Constant", ""},
+ {ACT_RANDOM_FLOAT_UNIFORM, "FLOAT_UNIFORM", 0, "Float Uniform", ""},
+ {ACT_RANDOM_FLOAT_NORMAL, "FLOAT_NORMAL", 0, "Float Normal", ""},
+ {ACT_RANDOM_FLOAT_NEGATIVE_EXPONENTIAL, "FLOAT_NEGATIVE_EXPONENTIAL", 0, "Float Neg. Exp.", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "RandomActuator", "Actuator");
@@ -1438,7 +1506,7 @@ static void rna_def_random_actuator(BlenderRNA *brna)
/* ACT_RANDOM_BOOL_CONST */
prop= RNA_def_property(srna, "use_always_true", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "int_arg_1", 1);
- RNA_def_property_ui_text(prop, "Always true", "Always false or always true");
+ RNA_def_property_ui_text(prop, "Always True", "Always false or always true");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* ACT_RANDOM_BOOL_UNIFORM */
@@ -1515,7 +1583,7 @@ static void rna_def_random_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "half_life_time", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "float_arg_1");
RNA_def_property_range(prop, -1000.0, 1000.0);
- RNA_def_property_ui_text(prop, "Half-life time", "Negative exponential dropoff");
+ RNA_def_property_ui_text(prop, "Half-Life Time", "Negative exponential dropoff");
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
@@ -1556,7 +1624,7 @@ static void rna_def_message_actuator(BlenderRNA *brna)
/* ACT_MESG_PROP */
prop= RNA_def_property(srna, "body_property", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "body");
- RNA_def_property_ui_text(prop, "Propname", "The message body will be set by the Property Value");
+ RNA_def_property_ui_text(prop, "Prop Name", "The message body will be set by the Property Value");
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
@@ -1566,14 +1634,14 @@ static void rna_def_game_actuator(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem prop_type_items[] ={
-// {ACT_GAME_LOAD, "LOAD", 0, "Load game", ""},
-// {ACT_GAME_START, "START", 0, "Start loaded game", ""},
+// {ACT_GAME_LOAD, "LOAD", 0, "Load Game", ""},
+// {ACT_GAME_START, "START", 0, "Start Loaded Game", ""},
// keeping the load/start hacky for compatibility with 2.49
// ideally we could use ACT_GAME_START again and do a do_version()
- {ACT_GAME_LOAD, "START", 0, "Start new game", ""},
- {ACT_GAME_RESTART, "RESTART", 0, "Restart this game", ""},
- {ACT_GAME_QUIT, "QUIT", 0, "Quit this game", ""},
+ {ACT_GAME_LOAD, "START", 0, "Start Game From File", ""},
+ {ACT_GAME_RESTART, "RESTART", 0, "Restart Game", ""},
+ {ACT_GAME_QUIT, "QUIT", 0, "Quit Game", ""},
{ACT_GAME_SAVECFG, "SAVECFG", 0, "Save bge.logic.globalDict", ""},
{ACT_GAME_LOADCFG, "LOADCFG", 0, "Load bge.logic.globalDict", ""},
{0, NULL, 0, NULL, NULL}};
@@ -1606,7 +1674,7 @@ static void rna_def_visibility_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_visible", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ACT_VISIBILITY_INVISIBLE);
- RNA_def_property_ui_text(prop, "Visible", "Set the objects visible. Initialized from the objects render restriction toggle (access in the outliner)");
+ RNA_def_property_ui_text(prop, "Visible", "Set the objects visible. Initialized from the object render restriction toggle in physics button");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "use_occlusion", PROP_BOOLEAN, PROP_NONE);
@@ -1645,13 +1713,13 @@ static void rna_def_twodfilter_actuator(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "Filter2DActuator", "Actuator");
- RNA_def_struct_ui_text(srna, "2D Filter Actuator", "Actuator to ..");
+ RNA_def_struct_ui_text(srna, "Filter 2D Actuator", "Actuator to apply screen graphic effects");
RNA_def_struct_sdna_from(srna, "bTwoDFilterActuator", "data");
prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_type_items);
- RNA_def_property_ui_text(prop, "2D Filter Type", "");
+ RNA_def_property_ui_text(prop, "Filter 2D Type", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "glsl_shader", PROP_POINTER, PROP_NONE);
@@ -1715,7 +1783,7 @@ static void rna_def_parent_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_ghost", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_PARENT_GHOST);
- RNA_def_property_ui_text(prop, "Ghost", "Make this object ghost while parented (only if not compound)");
+ RNA_def_property_ui_text(prop, "Ghost", "Make this object ghost while parented");
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
@@ -1742,7 +1810,7 @@ static void rna_def_shape_action_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_type_items);
- RNA_def_property_ui_text(prop, "Action type", "Action playback type");
+ RNA_def_property_ui_text(prop, "Action Type", "Action playback type");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE);
@@ -1764,16 +1832,16 @@ static void rna_def_shape_action_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Property", "Use this property to define the Action position");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "sta");
- RNA_def_property_range(prop, 0, MAXFRAME);
- RNA_def_property_ui_text(prop, "Start frame", "");
+ prop= RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "sta");
+ RNA_def_property_ui_range(prop, 0.0, MAXFRAME, 100, 2);
+ RNA_def_property_ui_text(prop, "Start Frame", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "end");
- RNA_def_property_range(prop, 0, MAXFRAME);
- RNA_def_property_ui_text(prop, "End frame", "");
+ prop= RNA_def_property(srna, "frame_end", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "end");
+ RNA_def_property_ui_range(prop, 0.0, MAXFRAME, 100, 2);
+ RNA_def_property_ui_text(prop, "End Frame", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "frame_blend_in", PROP_INT, PROP_NONE);
@@ -1873,7 +1941,7 @@ static void rna_def_armature_actuator(BlenderRNA *brna)
RNA_def_property_pointer_sdna(prop, NULL, "subtarget");
RNA_def_property_struct_type(prop, "Object");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Secondary Target", "Set weight of this constraint");
+ RNA_def_property_ui_text(prop, "Secondary Target", "Set this object as the secondary target of the constraint (only IK polar target at the moment)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "weight", PROP_FLOAT, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_animation.c b/source/blender/makesrna/intern/rna_animation.c
index cee6b7f854a..680a230c1a6 100644
--- a/source/blender/makesrna/intern/rna_animation.c
+++ b/source/blender/makesrna/intern/rna_animation.c
@@ -38,6 +38,8 @@
#include "ED_keyframing.h"
+#include "WM_types.h"
+
/* exported for use in API */
EnumPropertyItem keyingset_path_grouping_items[] = {
{KSP_GROUP_NAMED, "NAMED", 0, "Named Group", ""},
@@ -48,6 +50,9 @@ EnumPropertyItem keyingset_path_grouping_items[] = {
#ifdef RNA_RUNTIME
#include "BKE_animsys.h"
+#include "BKE_nla.h"
+
+#include "WM_api.h"
static int rna_AnimData_action_editable(PointerRNA *ptr)
{
@@ -60,12 +65,6 @@ static int rna_AnimData_action_editable(PointerRNA *ptr)
return 1;
}
-static void rna_AnimData_action_set(PointerRNA *ptr, PointerRNA value)
-{
- AnimData *adt= (AnimData*)(ptr->data);
- adt->action= value.data;
-}
-
/* ****************************** */
/* wrapper for poll callback */
@@ -86,7 +85,7 @@ static int RKS_POLL_rna_internal(KeyingSetInfo *ksi, bContext *C)
RNA_parameter_set_lookup(&list, "context", &C);
/* execute the function */
- ksi->ext.call(&ptr, func, &list);
+ ksi->ext.call(C, &ptr, func, &list);
/* read the result */
RNA_parameter_get_lookup(&list, "ok", &ret);
@@ -113,7 +112,7 @@ static void RKS_ITER_rna_internal(KeyingSetInfo *ksi, bContext *C, KeyingSet *ks
RNA_parameter_set_lookup(&list, "ks", &ks);
/* execute the function */
- ksi->ext.call(&ptr, func, &list);
+ ksi->ext.call(C, &ptr, func, &list);
RNA_parameter_list_free(&list);
}
@@ -135,7 +134,7 @@ static void RKS_GEN_rna_internal(KeyingSetInfo *ksi, bContext *C, KeyingSet *ks,
RNA_parameter_set_lookup(&list, "data", data);
/* execute the function */
- ksi->ext.call(&ptr, func, &list);
+ ksi->ext.call(C, &ptr, func, &list);
RNA_parameter_list_free(&list);
}
@@ -163,11 +162,11 @@ static void rna_KeyingSetInfo_unregister(const bContext *C, StructRNA *type)
ANIM_keyingset_info_unregister(C, ksi);
}
-static StructRNA *rna_KeyingSetInfo_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_KeyingSetInfo_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
KeyingSetInfo dummyksi = {0};
KeyingSetInfo *ksi;
- PointerRNA dummyptr;
+ PointerRNA dummyptr = {{0}};
int have_function[3];
/* setup dummy type info to store static properties in */
@@ -179,7 +178,7 @@ static StructRNA *rna_KeyingSetInfo_register(const bContext *C, ReportList *repo
return NULL;
if (strlen(identifier) >= sizeof(dummyksi.idname)) {
- BKE_reportf(reports, RPT_ERROR, "registering keying set info class: '%s' is too long, maximum length is %d.", identifier, sizeof(dummyksi.idname));
+ BKE_reportf(reports, RPT_ERROR, "registering keying set info class: '%s' is too long, maximum length is %d.", identifier, (int)sizeof(dummyksi.idname));
return NULL;
}
@@ -204,9 +203,9 @@ static StructRNA *rna_KeyingSetInfo_register(const bContext *C, ReportList *repo
ksi->poll= (have_function[0])? RKS_POLL_rna_internal: NULL;
ksi->iter= (have_function[1])? RKS_ITER_rna_internal: NULL;
ksi->generate= (have_function[2])? RKS_GEN_rna_internal: NULL;
-
+
/* add and register with other info as needed */
- ANIM_keyingset_info_register(C, ksi);
+ ANIM_keyingset_info_register(ksi);
/* return the struct-rna added */
return ksi->ext.srna;
@@ -327,7 +326,7 @@ static PointerRNA rna_KeyingSet_typeinfo_get(PointerRNA *ptr)
static KS_Path *rna_KeyingSet_paths_add(KeyingSet *keyingset, ReportList *reports,
- ID *id, char rna_path[], int index, int group_method, char group_name[])
+ ID *id, const char rna_path[], int index, int group_method, const char group_name[])
{
KS_Path *ksp = NULL;
short flag = 0;
@@ -387,6 +386,36 @@ static void rna_KeyingSet_paths_clear(KeyingSet *keyingset, ReportList *reports)
}
}
+/* needs wrapper function to push notifier */
+static NlaTrack *rna_NlaTrack_new(AnimData *adt, bContext *C, NlaTrack *track)
+{
+ NlaTrack *new_track = add_nlatrack(adt, track);
+
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_ADDED, NULL);
+
+ return new_track;
+}
+
+static void rna_NlaTrack_remove(AnimData *adt, bContext *C, NlaTrack *track)
+{
+ free_nlatrack(&adt->nla_tracks, track);
+
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_REMOVED, NULL);
+}
+
+static PointerRNA rna_NlaTrack_active_get(PointerRNA *ptr)
+{
+ AnimData *adt= (AnimData*)ptr->data;
+ NlaTrack *track= BKE_nlatrack_find_active(&adt->nla_tracks);
+ return rna_pointer_inherit_refine(ptr, &RNA_NlaTrack, track);
+}
+
+static void rna_NlaTrack_active_set(PointerRNA *ptr, PointerRNA value)
+{
+ AnimData *adt= (AnimData*)ptr->data;
+ NlaTrack *track= (NlaTrack*)value.data;
+ BKE_nlatrack_set_active(&adt->nla_tracks, track);
+}
#else
@@ -429,7 +458,7 @@ static void rna_def_keyingset_info(BlenderRNA *brna)
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "idname");
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
/* Name */
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
@@ -488,6 +517,7 @@ static void rna_def_keyingset_path(BlenderRNA *brna)
RNA_def_property_editable_func(prop, "rna_ksPath_id_editable");
RNA_def_property_pointer_funcs(prop, NULL, NULL, "rna_ksPath_id_typef", NULL);
RNA_def_property_ui_text(prop, "ID-Block", "ID-Block that keyframes for Keying Set should be added to (for Absolute Keying Sets only)");
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_EDITED, NULL); // XXX: maybe a bit too noisy
prop= RNA_def_property(srna, "id_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "idtype");
@@ -495,30 +525,36 @@ static void rna_def_keyingset_path(BlenderRNA *brna)
RNA_def_property_enum_default(prop, ID_OB);
RNA_def_property_enum_funcs(prop, NULL, "rna_ksPath_id_type_set", NULL);
RNA_def_property_ui_text(prop, "ID Type", "Type of ID-block that can be used");
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_EDITED, NULL); // XXX: maybe a bit too noisy
/* Group */
prop= RNA_def_property(srna, "group", PROP_STRING, PROP_NONE);
RNA_def_property_ui_text(prop, "Group Name", "Name of Action Group to assign setting(s) for this path to");
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_EDITED, NULL); // XXX: maybe a bit too noisy
/* Grouping */
prop= RNA_def_property(srna, "group_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "groupmode");
RNA_def_property_enum_items(prop, keyingset_path_grouping_items);
RNA_def_property_ui_text(prop, "Grouping Method", "Method used to define which Group-name to use");
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_EDITED, NULL); // XXX: maybe a bit too noisy
/* Path + Array Index */
prop= RNA_def_property(srna, "data_path", PROP_STRING, PROP_NONE);
RNA_def_property_string_funcs(prop, "rna_ksPath_RnaPath_get", "rna_ksPath_RnaPath_length", "rna_ksPath_RnaPath_set");
RNA_def_property_ui_text(prop, "Data Path", "Path to property setting");
RNA_def_struct_name_property(srna, prop); // XXX this is the best indicator for now...
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_EDITED, NULL);
prop= RNA_def_property(srna, "array_index", PROP_INT, PROP_NONE);
RNA_def_property_ui_text(prop, "RNA Array Index", "Index to the specific setting if applicable");
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_EDITED, NULL); // XXX: maybe a bit too noisy
/* Flags */
prop= RNA_def_property(srna, "use_entire_array", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", KSP_FLAG_WHOLE_ARRAY);
RNA_def_property_ui_text(prop, "Entire Array", "When an 'array/vector' type is chosen (Location, Rotation, Color, etc.), entire array is to be used");
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_EDITED, NULL); // XXX: maybe a bit too noisy
/* Keyframing Settings */
rna_def_common_keying_flags(srna, 0);
@@ -555,10 +591,10 @@ static void rna_def_keyingset_paths(BlenderRNA *brna, PropertyRNA *cprop)
parm= RNA_def_string(func, "data_path", "", 256, "Data-Path", "RNA-Path to destination property."); // xxx hopefully this is long enough
RNA_def_property_flag(parm, PROP_REQUIRED);
/* index (defaults to -1 for entire array) */
- parm=RNA_def_int(func, "index", -1, -1, INT_MAX, "Index", "The index of the destination property (i.e. axis of Location/Rotation/etc.), or -1 for the entire array.", 0, INT_MAX);
+ RNA_def_int(func, "index", -1, -1, INT_MAX, "Index", "The index of the destination property (i.e. axis of Location/Rotation/etc.), or -1 for the entire array.", 0, INT_MAX);
/* grouping */
- parm=RNA_def_enum(func, "group_method", keyingset_path_grouping_items, KSP_GROUP_KSNAME, "Grouping Method", "Method used to define which Group-name to use.");
- parm=RNA_def_string(func, "group_name", "", 64, "Group Name", "Name of Action Group to assign destination to (only if grouping mode is to use this name).");
+ RNA_def_enum(func, "group_method", keyingset_path_grouping_items, KSP_GROUP_KSNAME, "Grouping Method", "Method used to define which Group-name to use.");
+ RNA_def_string(func, "group_name", "", 64, "Group Name", "Name of Action Group to assign destination to (only if grouping mode is to use this name).");
/* Remove Path */
@@ -601,6 +637,7 @@ static void rna_def_keyingset(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Name", "");
RNA_def_struct_ui_icon(srna, ICON_KEY_HLT); // TODO: we need a dedicated icon
RNA_def_struct_name_property(srna, prop);
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_RENAME, NULL);
/* KeyingSetInfo (Type Info) for Builtin Sets only */
prop= RNA_def_property(srna, "type_info", PROP_POINTER, PROP_NONE);
@@ -631,6 +668,42 @@ static void rna_def_keyingset(BlenderRNA *brna)
/* --- */
+static void rna_api_animdata_nla_tracks(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ PropertyRNA *prop;
+
+ RNA_def_property_srna(cprop, "NlaTracks");
+ srna= RNA_def_struct(brna, "NlaTracks", NULL);
+ RNA_def_struct_sdna(srna, "AnimData");
+ RNA_def_struct_ui_text(srna, "NLA Tracks", "Collection of NLA Tracks");
+
+ func = RNA_def_function(srna, "new", "rna_NlaTrack_new");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+ RNA_def_function_ui_description(func, "Add a new NLA Tracks");
+ RNA_def_pointer(func, "prev", "NlaTrack", "", "NLA Track to add the new one after.");
+ /* return type */
+ parm = RNA_def_pointer(func, "track", "NlaTrack", "", "New NLA Track.");
+ RNA_def_function_return(func, parm);
+
+ func = RNA_def_function(srna, "remove", "rna_NlaTrack_remove");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+ RNA_def_function_ui_description(func, "Remove a NLA Track.");
+ parm = RNA_def_pointer(func, "track", "NlaTrack", "", "NLA Track to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "NlaTrack");
+ RNA_def_property_pointer_funcs(prop, "rna_NlaTrack_active_get", "rna_NlaTrack_active_set", NULL, NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Active Constraint", "Active Object constraint");
+ /* XXX: should (but doesn't) update the active track in the NLA window */
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA|NA_SELECTED, NULL);
+}
+
void rna_def_animdata_common(StructRNA *srna)
{
PropertyRNA *prop;
@@ -654,31 +727,35 @@ void rna_def_animdata(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "nla_tracks", NULL);
RNA_def_property_struct_type(prop, "NlaTrack");
RNA_def_property_ui_text(prop, "NLA Tracks", "NLA Tracks (i.e. Animation Layers)");
+
+ rna_api_animdata_nla_tracks(brna, prop);
/* Active Action */
prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE);
- RNA_def_property_pointer_funcs(prop, NULL, "rna_AnimData_action_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE); /* this flag as well as the dynamic test must be defined for this to be editable... */
RNA_def_property_editable_func(prop, "rna_AnimData_action_editable");
RNA_def_property_ui_text(prop, "Action", "Active Action for this datablock");
+ RNA_def_property_update(prop, NC_ANIMATION, NULL); /* this will do? */
-
/* Active Action Settings */
prop= RNA_def_property(srna, "action_extrapolation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "act_extendmode");
RNA_def_property_enum_items(prop, nla_mode_extend_items);
RNA_def_property_ui_text(prop, "Action Extrapolation", "Action to take for gaps past the Active Action's range (when evaluating with NLA)");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "action_blend_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "act_blendmode");
RNA_def_property_enum_items(prop, nla_mode_blend_items);
RNA_def_property_ui_text(prop, "Action Blending", "Method used for combining Active Action's result with result of NLA stack");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "action_influence", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "act_influence");
RNA_def_property_float_default(prop, 1.0f);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Action Influence", "Amount the Active Action contributes to the result of the NLA stack");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
/* Drivers */
prop= RNA_def_property(srna, "drivers", PROP_COLLECTION, PROP_NONE);
@@ -690,6 +767,7 @@ void rna_def_animdata(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_nla", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ADT_NLA_EVAL_OFF);
RNA_def_property_ui_text(prop, "NLA Evaluation Enabled", "NLA stack is evaluated when evaluating this block");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
}
/* --- */
diff --git a/source/blender/makesrna/intern/rna_armature.c b/source/blender/makesrna/intern/rna_armature.c
index d42cf625898..3dc52a5c4e2 100644
--- a/source/blender/makesrna/intern/rna_armature.c
+++ b/source/blender/makesrna/intern/rna_armature.c
@@ -51,7 +51,7 @@ static void rna_Armature_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
{
ID *id= ptr->id.data;
- DAG_id_flush_update(id, OB_RECALC_DATA);
+ DAG_id_tag_update(id, 0);
WM_main_add_notifier(NC_GEOM|ND_DATA, id);
//WM_main_add_notifier(NC_OBJECT|ND_POSE, NULL);
}
@@ -66,12 +66,16 @@ static void rna_Armature_act_bone_set(PointerRNA *ptr, PointerRNA value)
}
else {
if(value.id.data != arm) {
- /* raise an error! */
- }
- else {
- arm->act_bone= value.data;
- arm->act_bone->flag |= BONE_SELECTED;
+ Object *ob = (Object *)value.id.data;
+
+ if(GS(ob->id.name)!=ID_OB || (ob->data != arm)) {
+ printf("ERROR: armature set active bone - new active doesn't come from this armature\n");
+ return;
+ }
}
+
+ arm->act_bone= value.data;
+ arm->act_bone->flag |= BONE_SELECTED;
}
}
@@ -93,7 +97,7 @@ static void rna_Armature_act_edit_bone_set(PointerRNA *ptr, PointerRNA value)
}
}
-EditBone *rna_Armature_edit_bone_new(bArmature *arm, ReportList *reports, char *name)
+EditBone *rna_Armature_edit_bone_new(bArmature *arm, ReportList *reports, const char *name)
{
if(arm->edbo==NULL) {
BKE_reportf(reports, RPT_ERROR, "Armature '%s' not in editmode, cant add an editbone.", arm->id.name+2);
@@ -117,6 +121,20 @@ void rna_Armature_edit_bone_remove(bArmature *arm, ReportList *reports, EditBone
ED_armature_edit_bone_remove(arm, ebone);
}
+static void rna_Armature_update_layers(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ bArmature *arm= ptr->id.data;
+ Object *ob;
+
+ /* proxy lib exception, store it here so we can restore layers on file
+ load, since it would otherwise get lost due to being linked data */
+ for(ob = bmain->object.first; ob; ob=ob->id.next)
+ if(ob->data == arm && ob->pose)
+ ob->pose->proxy_layer = arm->layer;
+
+ WM_main_add_notifier(NC_GEOM|ND_DATA, arm);
+}
+
static void rna_Armature_redraw_data(Main *bmain, Scene *scene, PointerRNA *ptr)
{
ID *id= ptr->id.data;
@@ -385,6 +403,9 @@ static void rna_Armature_bones_next(CollectionPropertyIterator *iter)
#else
+static int rna_matrix_dimsize_4x4[]= {4, 4};
+static int rna_matrix_dimsize_3x3[]= {3, 3};
+
static void rna_def_bone_common(StructRNA *srna, int editbone)
{
PropertyRNA *prop;
@@ -414,7 +435,7 @@ static void rna_def_bone_common(StructRNA *srna, int editbone)
RNA_def_property_ui_text(prop, "Connected", "When bone has a parent, bone's head is struck to the parent's tail");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
- prop= RNA_def_property(srna, "use_hinge", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_inherit_rotation", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_HINGE);
RNA_def_property_ui_text(prop, "Inherit Rotation", "Bone inherits rotation or scale from parent bone");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
@@ -500,6 +521,18 @@ static void rna_def_bone_common(StructRNA *srna, int editbone)
RNA_def_property_range(prop, 0.0f, 2.0f);
RNA_def_property_ui_text(prop, "B-Bone Ease Out", "Length of second Bezier Handle (for B-Bones only)");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
+
+ prop= RNA_def_property(srna, "bbone_x", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "xwidth");
+ RNA_def_property_range(prop, 0.0f, 1000.0f);
+ RNA_def_property_ui_text(prop, "B-Bone Display X Width", "B-Bone X size");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
+
+ prop= RNA_def_property(srna, "bbone_z", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "zwidth");
+ RNA_def_property_range(prop, 0.0f, 1000.0f);
+ RNA_def_property_ui_text(prop, "B-Bone Display Z Width", "B-Bone Z size");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
}
// err... bones should not be directly edited (only editbones should be...)
@@ -539,47 +572,56 @@ static void rna_def_bone(BlenderRNA *brna)
prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_SELECTED);
RNA_def_property_ui_text(prop, "Select", "");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "select_head", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_ROOTSEL);
RNA_def_property_ui_text(prop, "Select Head", "");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "select_tail", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_TIPSEL);
RNA_def_property_ui_text(prop, "Select Tail", "");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
/* XXX better matrix descriptions possible (Arystan) */
prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "bone_mat");
- RNA_def_property_array(prop, 9);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_3x3);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Bone Matrix", "3x3 bone matrix");
prop= RNA_def_property(srna, "matrix_local", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "arm_mat");
- RNA_def_property_array(prop, 16);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Bone Armature-Relative Matrix", "4x4 bone matrix relative to armature");
prop= RNA_def_property(srna, "tail", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "tail");
RNA_def_property_array(prop, 3);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Tail", "Location of tail end of the bone");
prop= RNA_def_property(srna, "tail_local", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "arm_tail");
RNA_def_property_array(prop, 3);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Armature-Relative Tail", "Location of tail end of the bone relative to armature");
prop= RNA_def_property(srna, "head", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "head");
RNA_def_property_array(prop, 3);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Head", "Location of head end of the bone relative to its parent");
prop= RNA_def_property(srna, "head_local", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "arm_head");
RNA_def_property_array(prop, 3);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Armature-Relative Head", "Location of head end of the bone relative to armature");
RNA_api_bone(srna);
@@ -609,18 +651,21 @@ static void rna_def_edit_bone(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "roll");
RNA_def_property_ui_range(prop, -M_PI * 2, M_PI * 2, 0.1, 2);
RNA_def_property_ui_text(prop, "Roll", "Bone rotation around head-tail axis");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
prop= RNA_def_property(srna, "head", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "head");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Head", "Location of head end of the bone");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
prop= RNA_def_property(srna, "tail", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "tail");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Tail", "Location of tail end of the bone");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
rna_def_bone_common(srna, 1);
@@ -628,32 +673,37 @@ static void rna_def_edit_bone(BlenderRNA *brna)
prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_HIDDEN_A);
RNA_def_property_ui_text(prop, "Hide", "Bone is not visible when in Edit Mode");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "lock", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_EDITMODE_LOCKED);
RNA_def_property_ui_text(prop, "Lock", "Bone is not able to be transformed when in Edit Mode");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_SELECTED);
RNA_def_property_ui_text(prop, "Select", "");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "select_head", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_ROOTSEL);
RNA_def_property_ui_text(prop, "Head Select", "");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "select_tail", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_TIPSEL);
RNA_def_property_ui_text(prop, "Tail Select", "");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
/* calculated and read only, not actual data access */
prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
//RNA_def_property_float_sdna(prop, NULL, ""); // doesnt access any real data
- RNA_def_property_array(prop, 16);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_flag(prop, PROP_THICK_WRAP); /* no reference to original data */
RNA_def_property_ui_text(prop, "Editbone Matrix", "Read-only matrix calculated from the roll (armature space)");
@@ -785,6 +835,7 @@ static void rna_def_armature(BlenderRNA *brna)
RNA_def_property_enum_items(prop, prop_pose_position_items);
RNA_def_property_ui_text(prop, "Pose Position", "Show armature in binding pose or final posed state");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
+ RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
prop= RNA_def_property(srna, "draw_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "drawtype");
@@ -809,7 +860,7 @@ static void rna_def_armature(BlenderRNA *brna)
RNA_def_property_array(prop, 32);
RNA_def_property_ui_text(prop, "Visible Layers", "Armature layer visibility");
RNA_def_property_boolean_funcs(prop, NULL, "rna_Armature_layer_set");
- RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Armature_redraw_data");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Armature_update_layers");
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
/* layer protection */
diff --git a/source/blender/makesrna/intern/rna_armature_api.c b/source/blender/makesrna/intern/rna_armature_api.c
index 4e161e5b22e..a2b765e9959 100644
--- a/source/blender/makesrna/intern/rna_armature_api.c
+++ b/source/blender/makesrna/intern/rna_armature_api.c
@@ -38,20 +38,15 @@
#include "BLI_blenlib.h"
#include "BKE_armature.h"
-void rna_EditBone_align_roll(EditBone *ebo, float *no)
+void rna_EditBone_align_roll(EditBone *ebo, float no[3])
{
- if(!is_zero_v3(no)) {
- float normal[3];
- copy_v3_v3(normal, no);
- normalize_v3(normal);
- ebo->roll= ED_rollBoneToVector(ebo, normal);
- }
+ ebo->roll= ED_rollBoneToVector(ebo, no, FALSE);
}
float rna_Bone_do_envelope(Bone *bone, float *vec)
{
float scale = (bone->flag & BONE_MULT_VG_ENV) == BONE_MULT_VG_ENV ? bone->weight : 1.0f;
- return distfactor_to_bone(vec, bone->head, bone->tail, bone->rad_head * scale, bone->rad_tail * scale, bone->dist * scale);
+ return distfactor_to_bone(vec, bone->arm_head, bone->arm_tail, bone->rad_head * scale, bone->rad_tail * scale, bone->dist * scale);
}
#else
diff --git a/source/blender/makesrna/intern/rna_boid.c b/source/blender/makesrna/intern/rna_boid.c
index 8cd6fcbeff9..757952bb956 100644
--- a/source/blender/makesrna/intern/rna_boid.c
+++ b/source/blender/makesrna/intern/rna_boid.c
@@ -78,10 +78,10 @@ static void rna_Boids_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
psys->recalc = PSYS_RECALC_RESET;
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
}
else
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL);
}
@@ -92,10 +92,10 @@ static void rna_Boids_reset_deps(Main *bmain, Scene *scene, PointerRNA *ptr)
psys->recalc = PSYS_RECALC_RESET;
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
}
else
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
DAG_scene_sort(bmain, scene);
@@ -175,6 +175,26 @@ static void rna_BoidState_active_boid_rule_index_set(struct PointerRNA *ptr, int
}
}
+static int particle_id_check(PointerRNA *ptr)
+{
+ ID *id= ptr->id.data;
+
+ return (GS(id->name) == ID_PA);
+}
+
+static char *rna_BoidSettings_path(PointerRNA *ptr)
+{
+ BoidSettings *boids = (BoidSettings *)ptr->data;
+
+ if(particle_id_check(ptr)) {
+ ParticleSettings *part = (ParticleSettings*)ptr->id.data;
+
+ if (part->boids == boids)
+ return BLI_sprintfN("boids");
+ }
+ return NULL;
+}
+
static PointerRNA rna_BoidSettings_active_boid_state_get(PointerRNA *ptr)
{
BoidSettings *boids= (BoidSettings*)ptr->data;
@@ -466,6 +486,7 @@ static void rna_def_boid_settings(BlenderRNA *brna)
PropertyRNA *prop;
srna = RNA_def_struct(brna, "BoidSettings", NULL);
+ RNA_def_struct_path_func(srna, "rna_BoidSettings_path");
RNA_def_struct_ui_text(srna, "Boid Settings", "Settings for boid physics");
prop= RNA_def_property(srna, "land_smooth", PROP_FLOAT, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c
index 83d40a3802b..60c28d8bae1 100644
--- a/source/blender/makesrna/intern/rna_brush.c
+++ b/source/blender/makesrna/intern/rna_brush.c
@@ -37,7 +37,6 @@
#include "IMB_imbuf.h"
-
#include "WM_types.h"
static EnumPropertyItem prop_direction_items[]= {
@@ -93,12 +92,11 @@ EnumPropertyItem brush_imagepaint_tool_items[] = {
#include "BKE_texture.h"
#include "BKE_brush.h"
#include "BKE_icons.h"
-
#include "BKE_paint.h"
#include "WM_api.h"
-static void rna_Brush_reset_icon(Brush *br, char *type)
+static void rna_Brush_reset_icon(Brush *br, const char *UNUSED(type))
{
ID *id = &br->id;
@@ -792,6 +790,11 @@ static void rna_def_operator_stroke_element(BlenderRNA *brna)
prop= RNA_def_property(srna, "time", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_flag(prop, PROP_IDPROPERTY);
RNA_def_property_ui_text(prop, "Time", "");
+
+ /* used for Grease Pencil sketching sessions */
+ prop= RNA_def_property(srna, "is_start", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_IDPROPERTY);
+ RNA_def_property_ui_text(prop, "Is Stroke Start", "");
/* XXX: Tool (this will be for pressing a modifier key for a different brush,
e.g. switching to a Smooth brush in the middle of the stroke */
diff --git a/source/blender/makesrna/intern/rna_camera.c b/source/blender/makesrna/intern/rna_camera.c
index 9d82c472882..b0d93bcd09a 100644
--- a/source/blender/makesrna/intern/rna_camera.c
+++ b/source/blender/makesrna/intern/rna_camera.c
@@ -99,11 +99,12 @@ void RNA_def_camera(BlenderRNA *brna)
prop= RNA_def_property(srna, "lens", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "lens");
RNA_def_property_range(prop, 1.0f, 5000.0f);
- RNA_def_property_ui_text(prop, "Lens", "Perspective Camera lens value in millimeters");
+ RNA_def_property_ui_text(prop, "Focal Length", "Perspective Camera lens value in millimeters");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_range(prop, M_PI * (0.367/180.0), M_PI * (172.847/180.0));
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Angle", "Perspective Camera lens field of view in degrees");
RNA_def_property_float_funcs(prop, "rna_Camera_angle_get", "rna_Camera_angle_set", NULL); /* only for deg/rad conversion */
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
@@ -116,8 +117,8 @@ void RNA_def_camera(BlenderRNA *brna)
prop= RNA_def_property(srna, "draw_size", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "drawsize");
- RNA_def_property_range(prop, 0.1f, 1000.0f);
- RNA_def_property_ui_range(prop, 0.01, 100, 1, 1);
+ RNA_def_property_range(prop, 0.01f, 1000.0f);
+ RNA_def_property_ui_range(prop, 0.01, 100, 1, 2);
RNA_def_property_ui_text(prop, "Draw Size", "Apparent size of the Camera object in the 3D View");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
diff --git a/source/blender/makesrna/intern/rna_cloth.c b/source/blender/makesrna/intern/rna_cloth.c
index 71e95248512..2d2c9ab8a5b 100644
--- a/source/blender/makesrna/intern/rna_cloth.c
+++ b/source/blender/makesrna/intern/rna_cloth.c
@@ -48,7 +48,19 @@ static void rna_cloth_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ob);
+}
+
+static void rna_cloth_pinning_changed(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+// ClothSimSettings *settings = (ClothSimSettings*)ptr->data;
+ ClothModifierData *clmd = (ClothModifierData*)modifiers_findByType(ob, eModifierType_Cloth);
+
+ cloth_free_modifier(clmd);
+
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ob);
}
@@ -59,7 +71,7 @@ static void rna_cloth_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
settings->reset = 1;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ob);
}
@@ -256,7 +268,7 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "vertex_group_mass", PROP_STRING, PROP_NONE);
RNA_def_property_string_funcs(prop, "rna_ClothSettings_mass_vgroup_get", "rna_ClothSettings_mass_vgroup_length", "rna_ClothSettings_mass_vgroup_set");
RNA_def_property_ui_text(prop, "Mass Vertex Group", "Vertex Group for pinning of vertices");
- RNA_def_property_update(prop, 0, "rna_cloth_update");
+ RNA_def_property_update(prop, 0, "rna_cloth_pinning_changed");
prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_ACCELERATION);
RNA_def_property_array(prop, 3);
@@ -276,7 +288,7 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_pin_cloth", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_GOAL);
RNA_def_property_ui_text(prop, "Pin Cloth", "Enable pinning of cloth vertices to other objects/positions");
- RNA_def_property_update(prop, 0, "rna_cloth_update");
+ RNA_def_property_update(prop, 0, "rna_cloth_pinning_changed");
prop= RNA_def_property(srna, "pin_stiffness", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "goalspring");
diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c
index 509fecb0122..01b5c3a9793 100644
--- a/source/blender/makesrna/intern/rna_color.c
+++ b/source/blender/makesrna/intern/rna_color.c
@@ -242,7 +242,7 @@ static void rna_ColorRamp_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Material *ma= ptr->id.data;
- DAG_id_flush_update(&ma->id, 0);
+ DAG_id_tag_update(&ma->id, 0);
WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, ma);
}
break;
@@ -253,7 +253,7 @@ static void rna_ColorRamp_update(Main *bmain, Scene *scene, PointerRNA *ptr)
for(node=ntree->nodes.first; node; node=node->next) {
if (ELEM3(node->type, SH_NODE_VALTORGB, CMP_NODE_VALTORGB, TEX_NODE_VALTORGB)) {
- ED_node_generic_update(bmain, scene, ntree, node);
+ ED_node_generic_update(bmain, ntree, node);
}
}
}
@@ -262,7 +262,7 @@ static void rna_ColorRamp_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Tex *tex= ptr->id.data;
- DAG_id_flush_update(&tex->id, 0);
+ DAG_id_tag_update(&tex->id, 0);
WM_main_add_notifier(NC_TEXTURE, tex);
}
break;
diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c
index e4726f5e92c..692ebb59240 100644
--- a/source/blender/makesrna/intern/rna_constraint.c
+++ b/source/blender/makesrna/intern/rna_constraint.c
@@ -79,7 +79,7 @@ EnumPropertyItem space_pchan_items[] = {
EnumPropertyItem space_object_items[] = {
{0, "WORLD", 0, "World Space", ""},
- {1, "LOCAL", 0, "Local (Without Parent) Space", ""},
+ {1, "LOCAL", 0, "Local Space", ""},
{0, NULL, 0, NULL, NULL}};
EnumPropertyItem constraint_ik_type_items[] ={
@@ -96,8 +96,6 @@ EnumPropertyItem constraint_ik_axisref_items[] ={
#ifdef RNA_RUNTIME
-#include <stdio.h>
-
#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_constraint.h"
@@ -324,6 +322,47 @@ static void rna_SplineIKConstraint_joint_bindings_set(PointerRNA *ptr, const flo
memcpy(ikData->points, values, ikData->numpoints * sizeof(float));
}
+/* Array Get/Set Functions for RigidBodyJointConstraint Min/Max Cone Limits */
+void rna_RigidBodyJointConstraint_limit_cone_min_get(PointerRNA *ptr, float values[3])
+{
+ bRigidBodyJointConstraint *data= (bRigidBodyJointConstraint*)(((bConstraint*)ptr->data)->data);
+ float *limit = data->minLimit;
+
+ values[0]= limit[3];
+ values[1]= limit[4];
+ values[2]= limit[5];
+}
+
+static void rna_RigidBodyJointConstraint_limit_cone_min_set(PointerRNA *ptr, const float values[3])
+{
+ bRigidBodyJointConstraint *data= (bRigidBodyJointConstraint*)(((bConstraint*)ptr->data)->data);
+ float *limit = data->minLimit;
+
+ limit[3]= values[0];
+ limit[4]= values[1];
+ limit[5]= values[2];
+}
+
+void rna_RigidBodyJointConstraint_limit_cone_max_get(PointerRNA *ptr, float values[3])
+{
+ bRigidBodyJointConstraint *data= (bRigidBodyJointConstraint*)(((bConstraint*)ptr->data)->data);
+ float *limit = data->maxLimit;
+
+ values[0]= limit[3];
+ values[1]= limit[4];
+ values[2]= limit[5];
+}
+
+static void rna_RigidBodyJointConstraint_limit_cone_max_set(PointerRNA *ptr, const float values[3])
+{
+ bRigidBodyJointConstraint *data= (bRigidBodyJointConstraint*)(((bConstraint*)ptr->data)->data);
+ float *limit = data->maxLimit;
+
+ limit[3]= values[0];
+ limit[4]= values[1];
+ limit[5]= values[2];
+}
+
#else
EnumPropertyItem constraint_distance_items[] = {
@@ -852,13 +891,14 @@ static void rna_def_constraint_transform_like(BlenderRNA *brna)
srna= RNA_def_struct(brna, "CopyTransformsConstraint", "Constraint");
RNA_def_struct_ui_text(srna, "Copy Transforms Constraint", "Copies all the transforms of the target");
- RNA_def_struct_sdna_from(srna, "bTransLikeConstraint", "data");
prop= RNA_def_property(srna, "head_tail", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, "bConstraint", "headtail");
RNA_def_property_ui_text(prop, "Head/Tail", "Target along length of bone: Head=0, Tail=1");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+ RNA_def_struct_sdna_from(srna, "bTransLikeConstraint", "data");
+
prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "tar");
RNA_def_property_ui_text(prop, "Target", "Target Object");
@@ -877,12 +917,12 @@ static void rna_def_constraint_minmax(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem minmax_items[] = {
- {LOCLIKE_X, "FLOOR_X", 0, "X", ""},
- {LOCLIKE_Y, "FLOOR_Y", 0, "Y", ""},
- {LOCLIKE_Z, "FLOOR_Z", 0, "Z", ""},
- {LOCLIKE_X_INVERT, "FLOOR_NEGATIVE_X", 0, "-X", ""},
- {LOCLIKE_Y_INVERT, "FLOOR_NEGATIVE_Y", 0, "-Y", ""},
- {LOCLIKE_Z_INVERT, "FLOOR_NEGATIVE_Z", 0, "-Z", ""},
+ {TRACK_X, "FLOOR_X", 0, "X", ""},
+ {TRACK_Y, "FLOOR_Y", 0, "Y", ""},
+ {TRACK_Z, "FLOOR_Z", 0, "Z", ""},
+ {TRACK_nX, "FLOOR_NEGATIVE_X", 0, "-X", ""},
+ {TRACK_nY, "FLOOR_NEGATIVE_Y", 0, "-Y", ""},
+ {TRACK_nZ, "FLOOR_NEGATIVE_Z", 0, "-Z", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "FloorConstraint", "Constraint");
@@ -1072,7 +1112,7 @@ static void rna_def_constraint_follow_path(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
- prop= RNA_def_property(srna, "offset", PROP_INT, PROP_TIME);
+ prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_TIME);
RNA_def_property_range(prop, MINAFRAME, MAXFRAME);
RNA_def_property_ui_text(prop, "Offset", "Offset from the position corresponding to the time frame");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
@@ -1241,11 +1281,7 @@ static void rna_def_constraint_rigid_body_joint(BlenderRNA *brna)
RNA_def_property_range(prop, -M_PI*2, M_PI*2);
RNA_def_property_ui_text(prop, "Axis Z", "Rotate pivot on Z axis in degrees");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
-
- /* XXX not sure how to wrap the two 6 element arrays for the generic joint */
- //float minLimit[6];
- //float maxLimit[6];
-
+
prop= RNA_def_property(srna, "use_linked_collision", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_DISABLE_LINKED_COLLISION);
RNA_def_property_ui_text(prop, "Disable Linked Collision", "Disable collision between linked bodies");
@@ -1255,6 +1291,66 @@ static void rna_def_constraint_rigid_body_joint(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_DRAW_PIVOT);
RNA_def_property_ui_text(prop, "Draw Pivot", "Display the pivot point and rotation in 3D view");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
+
+ /* Limit */
+
+ /* Limit Min/Max for genereic 6 DoF */
+ prop= RNA_def_property(srna, "limit_generic_min", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "minLimit");
+ RNA_def_property_array(prop, 6);
+ RNA_def_property_ui_text(prop, "Minimum Limit", "");
+
+ prop= RNA_def_property(srna, "limit_generic_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "maxLimit");
+ RNA_def_property_array(prop, 6);
+ RNA_def_property_ui_text(prop, "Maximum Limit", "");
+
+ /* Limit Min/Max for Cone Twist */
+ prop= RNA_def_property(srna, "limit_cone_min", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "minLimit");
+ RNA_def_property_float_funcs(prop, "rna_RigidBodyJointConstraint_limit_cone_min_get", "rna_RigidBodyJointConstraint_limit_cone_min_set", NULL);
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Minimum Limit", "");
+
+ prop= RNA_def_property(srna, "limit_cone_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "maxLimit");
+ RNA_def_property_float_funcs(prop, "rna_RigidBodyJointConstraint_limit_cone_max_get", "rna_RigidBodyJointConstraint_limit_cone_max_set", NULL);
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Maximum Limit", "");
+
+
+ /* Limit Booleans */
+ prop= RNA_def_property(srna, "use_limit_x", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", 1);
+ RNA_def_property_ui_text(prop, "Use X Limit", "Use minimum/maximum x limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop= RNA_def_property(srna, "use_limit_y", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", 2);
+ RNA_def_property_ui_text(prop, "Use Y Limit", "Use minimum/maximum y limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop= RNA_def_property(srna, "use_limit_z", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", 4);
+ RNA_def_property_ui_text(prop, "Use Z Limit", "Use minimum/maximum z limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop= RNA_def_property(srna, "use_angular_limit_x", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", 8);
+ RNA_def_property_ui_text(prop, "Use Angular X Limit", "Use minimum/maximum x angular limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop= RNA_def_property(srna, "use_angular_limit_y", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", 16);
+ RNA_def_property_ui_text(prop, "Use Angular Y Limit", "Use minimum/maximum y angular limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop= RNA_def_property(srna, "use_angular_limit_z", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", 32);
+ RNA_def_property_ui_text(prop, "Use Angular Z Limit", "Use minimum/maximum z angular limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
}
static void rna_def_constraint_clamp_to(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_controller.c b/source/blender/makesrna/intern/rna_controller.c
index ee0707ad0ae..73ac46e8e78 100644
--- a/source/blender/makesrna/intern/rna_controller.c
+++ b/source/blender/makesrna/intern/rna_controller.c
@@ -207,7 +207,6 @@ void RNA_def_controller(BlenderRNA *brna)
prop= RNA_def_property(srna, "expression", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "str");
- RNA_def_property_string_maxlength(prop, 127);
RNA_def_property_ui_text(prop, "Expression", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c
index e28212470c3..f76994f31ea 100644
--- a/source/blender/makesrna/intern/rna_curve.c
+++ b/source/blender/makesrna/intern/rna_curve.c
@@ -77,6 +77,40 @@ EnumPropertyItem curve_type_items[] = {
#include "ED_curve.h" /* for BKE_curve_nurbs */
+/* highly irritating but from RNA we cant know this */
+static Nurb *curve_nurb_from_point(Curve *cu, const void *point, int *nu_index, int *pt_index)
+{
+ ListBase *nurbs= BKE_curve_nurbs(cu);
+ Nurb *nu;
+ int i= 0;
+
+ for(nu= nurbs->first; nu; nu= nu->next, i++) {
+ if(nu->type == CU_BEZIER) {
+ if(point >= (void *)nu->bezt && point < (void *)(nu->bezt + nu->pntsu)) {
+ break;
+ }
+ }
+ else {
+ if(point >= (void *)nu->bp && point < (void *)(nu->bp + (nu->pntsu * nu->pntsv))) {
+ break;
+ }
+ }
+ }
+
+ if(nu) {
+ if(nu_index) {
+ *nu_index= i;
+ }
+
+ if(pt_index) {
+ if(nu->type == CU_BEZIER) *pt_index= (int)((BezTriple *)point - nu->bezt);
+ else *pt_index= (int)((BPoint *)point - nu->bp);
+ }
+ }
+
+ return nu;
+}
+
static StructRNA *rna_Curve_refine(PointerRNA *ptr)
{
Curve *cu= (Curve*)ptr->data;
@@ -141,6 +175,14 @@ static void rna_BezTriple_ctrlpoint_set(PointerRNA *ptr, const float *values)
bt->vec[1][2]= values[2];
}
+static void rna_Curve_texspace_set(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Curve *cu= (Curve*)ptr->data;
+
+ if (cu->texflag & CU_AUTOSPACE)
+ tex_space_curve(cu);
+}
+
static int rna_Curve_texspace_editable(PointerRNA *ptr)
{
Curve *cu= (Curve*)ptr->data;
@@ -244,7 +286,7 @@ static void rna_BPoint_array_begin(CollectionPropertyIterator *iter, PointerRNA
static void rna_Curve_update_data_id(Main *bmain, Scene *scene, ID *id)
{
- DAG_id_flush_update(id, OB_RECALC_DATA);
+ DAG_id_tag_update(id, 0);
WM_main_add_notifier(NC_GEOM|ND_DATA, id);
}
@@ -259,6 +301,17 @@ static void rna_Curve_update_deps(Main *bmain, Scene *scene, PointerRNA *ptr)
rna_Curve_update_data(bmain, scene, ptr);
}
+static void rna_Curve_update_points(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Curve *cu= (Curve*)ptr->id.data;
+ Nurb *nu= curve_nurb_from_point(cu, ptr->data, NULL, NULL);
+
+ if(nu)
+ calchandlesNurb(nu);
+
+ rna_Curve_update_data(bmain, scene, ptr);
+}
+
static PointerRNA rna_Curve_bevelObject_get(PointerRNA *ptr)
{
Curve *cu= (Curve*)ptr->id.data;
@@ -399,12 +452,24 @@ void rna_Curve_body_set(PointerRNA *ptr, const char *value)
BLI_strncpy(cu->str, value, len+1);
}
-static void rna_Nurb_update_handle_data(Main *bmain, Scene *scene, PointerRNA *ptr)
+static void rna_Nurb_update_cyclic_u(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Nurb *nu= (Nurb*)ptr->data;
- if(nu->type == CU_BEZIER)
+ if(nu->type == CU_BEZIER) {
calchandlesNurb(nu);
+ } else {
+ nurbs_knot_calc_u(nu);
+ }
+
+ rna_Curve_update_data(bmain, scene, ptr);
+}
+
+static void rna_Nurb_update_cyclic_v(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Nurb *nu= (Nurb*)ptr->data;
+
+ nurbs_knot_calc_v(nu);
rna_Curve_update_data(bmain, scene, ptr);
}
@@ -414,7 +479,7 @@ static void rna_Nurb_update_knot_u(Main *bmain, Scene *scene, PointerRNA *ptr)
Nurb *nu= (Nurb*)ptr->data;
clamp_nurb_order_u(nu);
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
rna_Curve_update_data(bmain, scene, ptr);
}
@@ -424,7 +489,7 @@ static void rna_Nurb_update_knot_v(Main *bmain, Scene *scene, PointerRNA *ptr)
Nurb *nu= (Nurb*)ptr->data;
clamp_nurb_order_v(nu);
- makeknots(nu, 2);
+ nurbs_knot_calc_v(nu);
rna_Curve_update_data(bmain, scene, ptr);
}
@@ -441,7 +506,7 @@ static void rna_Curve_spline_points_add(ID *id, Nurb *nu, ReportList *reports, i
addNurbPoints(nu, number);
/* update */
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
rna_Curve_update_data_id(NULL, NULL, id);
}
@@ -458,7 +523,7 @@ static void rna_Curve_spline_bezpoints_add(ID *id, Nurb *nu, ReportList *reports
addNurbPointsBezier(nu, number);
/* update */
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
rna_Curve_update_data_id(NULL, NULL, id);
}
@@ -487,7 +552,7 @@ static Nurb *rna_Curve_spline_new(Curve *cu, int type)
nu->resolu= nu->resolv= 12;
nu->flag= CU_SMOOTH;
- BLI_addtail(&cu->nurb, nu);
+ BLI_addtail(BKE_curve_nurbs(cu), nu);
return nu;
}
@@ -536,6 +601,43 @@ static void rna_Curve_active_spline_set(PointerRNA *ptr, PointerRNA value)
cu->actnu= BLI_findindex(nubase, nu);
}
+static char *rna_Curve_spline_path(PointerRNA *ptr)
+{
+ Curve *cu= (Curve*)ptr->id.data;
+ ListBase *nubase= BKE_curve_nurbs(cu);
+ Nurb *nu= ptr->data;
+ int index= BLI_findindex(nubase, nu);
+
+ if (index >= 0)
+ return BLI_sprintfN("splines[%d]", index);
+ else
+ return BLI_strdup("");
+}
+
+/* use for both bezier and nurbs */
+static char *rna_Curve_spline_point_path(PointerRNA *ptr)
+{
+ Curve *cu= (Curve*)ptr->id.data;
+ Nurb *nu;
+ void *point= ptr->data;
+ int nu_index, pt_index;
+
+ nu= curve_nurb_from_point(cu, point, &nu_index, &pt_index);
+
+ if (nu) {
+ if(nu->type == CU_BEZIER) {
+ return BLI_sprintfN("splines[%d].bezier_points[%d]", nu_index, pt_index);
+ }
+ else {
+ return BLI_sprintfN("splines[%d].points[%d]", nu_index, pt_index);
+ }
+ }
+ else {
+ return BLI_strdup("");
+ }
+}
+
+
static char *rna_TextBox_path(PointerRNA *ptr)
{
Curve *cu= (Curve*)ptr->id.data;
@@ -548,6 +650,12 @@ static char *rna_TextBox_path(PointerRNA *ptr)
return BLI_strdup("");
}
+static void rna_Curve_splines_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+{
+ Curve *cu= (Curve*)ptr->id.data;
+ rna_iterator_listbase_begin(iter, BKE_curve_nurbs(cu), NULL);
+}
+
#else
static void rna_def_bpoint(BlenderRNA *brna)
@@ -597,10 +705,11 @@ static void rna_def_bpoint(BlenderRNA *brna)
prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "radius");
- /*RNA_def_property_range(prop, 0.0f, 1.0f);*/
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_range(prop, 0.0f, FLT_MAX);
RNA_def_property_ui_text(prop, "Bevel Radius", "Radius for bevelling");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+ RNA_def_struct_path_func(srna, "rna_Curve_spline_point_path");
}
static void rna_def_beztriple(BlenderRNA *brna)
@@ -638,32 +747,32 @@ static void rna_def_beztriple(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "h1");
RNA_def_property_enum_items(prop, beztriple_handle_type_items);
RNA_def_property_ui_text(prop, "Handle 1 Type", "Handle types");
- RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_points");
prop= RNA_def_property(srna, "handle_right_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "h2");
RNA_def_property_enum_items(prop, beztriple_handle_type_items);
RNA_def_property_ui_text(prop, "Handle 2 Type", "Handle types");
- RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_points");
/* Vector values */
prop= RNA_def_property(srna, "handle_left", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_BezTriple_handle1_get", "rna_BezTriple_handle1_set", NULL);
RNA_def_property_ui_text(prop, "Handle 1", "Coordinates of the first handle");
- RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_points");
prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_BezTriple_ctrlpoint_get", "rna_BezTriple_ctrlpoint_set", NULL);
RNA_def_property_ui_text(prop, "Control Point", "Coordinates of the control point");
- RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_points");
prop= RNA_def_property(srna, "handle_right", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_BezTriple_handle2_get", "rna_BezTriple_handle2_set", NULL);
RNA_def_property_ui_text(prop, "Handle 2", "Coordinates of the second handle");
- RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_points");
/* Number values */
prop= RNA_def_property(srna, "tilt", PROP_FLOAT, PROP_NONE);
@@ -679,10 +788,11 @@ static void rna_def_beztriple(BlenderRNA *brna)
prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "radius");
- /*RNA_def_property_range(prop, 0.0f, 1.0f);*/
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_range(prop, 0.0f, FLT_MAX);
RNA_def_property_ui_text(prop, "Bevel Radius", "Radius for bevelling");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+ RNA_def_struct_path_func(srna, "rna_Curve_spline_point_path");
}
static void rna_def_path(BlenderRNA *brna, StructRNA *srna)
@@ -733,9 +843,9 @@ static void rna_def_nurbs(BlenderRNA *brna, StructRNA *srna)
PropertyRNA *prop;
/* flags */
- prop= RNA_def_property(srna, "use_map_on_length", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_uv_as_generated", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_UV_ORCO);
- RNA_def_property_ui_text(prop, "Map Along Length", "Generate texture mapping coordinates following the curve direction, rather than the local bounding box");
+ RNA_def_property_ui_text(prop, "Use UV for Mapping", "Uses the UV values as Generated textured coordinates");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
}
@@ -745,7 +855,7 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna)
static EnumPropertyItem prop_align_items[] = {
{CU_LEFT, "LEFT", 0, "Left", "Align text to the left"},
- {CU_MIDDLE, "CENTRAL", 0, "Center", "Center text"},
+ {CU_MIDDLE, "CENTER", 0, "Center", "Center text"},
{CU_RIGHT, "RIGHT", 0, "Right", "Align text to the right"},
{CU_JUSTIFY, "JUSTIFY", 0, "Justify", "Align to the left and the right"},
{CU_FLUSH, "FLUSH", 0, "Flush", "Align to the left and the right, with equal character spacing"},
@@ -832,7 +942,7 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna)
/* strings */
prop= RNA_def_property(srna, "family", PROP_STRING, PROP_NONE);
- RNA_def_property_string_maxlength(prop, 21);
+ RNA_def_property_string_maxlength(prop, (sizeof((ID *)NULL)->name)-2);
RNA_def_property_ui_text(prop, "Object Font", "Use Blender Objects as font characters. Give font objects a common name followed by the character it represents, eg. familya, familyb etc, and turn on Verts Duplication");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
@@ -862,11 +972,29 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ prop= RNA_def_property(srna, "font_bold", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "vfontb");
+ RNA_def_property_ui_text(prop, "Font", "");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+ prop= RNA_def_property(srna, "font_italic", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "vfonti");
+ RNA_def_property_ui_text(prop, "Font", "");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+ prop= RNA_def_property(srna, "font_bold_italic", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "vfontbi");
+ RNA_def_property_ui_text(prop, "Font", "");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
prop= RNA_def_property(srna, "edit_format", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "curinfo");
RNA_def_property_ui_text(prop, "Edit Format", "Editing settings character formatting");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
-
+
/* flags */
prop= RNA_def_property(srna, "use_fast_edit", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_FAST);
@@ -980,7 +1108,7 @@ static void rna_def_curve_spline_points(BlenderRNA *brna, PropertyRNA *cprop)
//PropertyRNA *prop;
FunctionRNA *func;
- PropertyRNA *parm;
+ //PropertyRNA *parm;
RNA_def_property_srna(cprop, "SplinePoints");
srna= RNA_def_struct(brna, "SplinePoints", NULL);
@@ -990,7 +1118,7 @@ static void rna_def_curve_spline_points(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "add", "rna_Curve_spline_points_add");
RNA_def_function_ui_description(func, "Add a number of points to this spline.");
RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_USE_REPORTS);
- parm= RNA_def_int(func, "number", 1, INT_MIN, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
+ RNA_def_int(func, "count", 1, 1, INT_MAX, "Number", "Number of points to add to the spline", 1, INT_MAX);
/*
func= RNA_def_function(srna, "remove", "rna_Curve_spline_remove");
@@ -1007,7 +1135,7 @@ static void rna_def_curve_spline_bezpoints(BlenderRNA *brna, PropertyRNA *cprop)
//PropertyRNA *prop;
FunctionRNA *func;
- PropertyRNA *parm;
+ //PropertyRNA *parm;
RNA_def_property_srna(cprop, "SplineBezierPoints");
srna= RNA_def_struct(brna, "SplineBezierPoints", NULL);
@@ -1017,7 +1145,7 @@ static void rna_def_curve_spline_bezpoints(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "add", "rna_Curve_spline_bezpoints_add");
RNA_def_function_ui_description(func, "Add a number of points to this spline.");
RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_USE_REPORTS);
- parm= RNA_def_int(func, "number", 1, INT_MIN, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
+ RNA_def_int(func, "count", 1, INT_MIN, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
/*
func= RNA_def_function(srna, "remove", "rna_Curve_spline_remove");
@@ -1093,8 +1221,14 @@ static void rna_def_curve(BlenderRNA *brna)
RNA_def_property_pointer_sdna(prop, NULL, "key");
RNA_def_property_ui_text(prop, "Shape Keys", "");
+
prop= RNA_def_property(srna, "splines", PROP_COLLECTION, PROP_NONE);
+#if 0
RNA_def_property_collection_sdna(prop, NULL, "nurb", NULL);
+#else
+ /* this way we get editmode nurbs too, keyframe in editmode */
+ RNA_def_property_collection_funcs(prop, "rna_Curve_splines_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0);
+#endif
RNA_def_property_struct_type(prop, "Spline");
RNA_def_property_ui_text(prop, "Splines", "Collection of splines in this curve data object");
rna_def_curve_splines(brna, prop);
@@ -1141,7 +1275,7 @@ static void rna_def_curve(BlenderRNA *brna)
prop= RNA_def_property(srna, "resolution_u", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "resolu");
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_range(prop, 1, 64, 1, 0);
RNA_def_property_ui_text(prop, "Resolution U", "Surface resolution in U direction");
RNA_def_property_update(prop, 0, "rna_Curve_resolution_u_update_data");
@@ -1149,20 +1283,20 @@ static void rna_def_curve(BlenderRNA *brna)
prop= RNA_def_property(srna, "resolution_v", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "resolv");
RNA_def_property_ui_range(prop, 1, 64, 1, 0);
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_text(prop, "Resolution V", "Surface resolution in V direction");
RNA_def_property_update(prop, 0, "rna_Curve_resolution_v_update_data");
prop= RNA_def_property(srna, "render_resolution_u", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "resolu_ren");
- RNA_def_property_range(prop, 0, INT_MAX);
+ RNA_def_property_range(prop, 0, SHRT_MAX);
RNA_def_property_ui_range(prop, 0, 64, 1, 0);
RNA_def_property_ui_text(prop, "Render Resolution U", "Surface resolution in U direction used while rendering. Zero skips this property");
prop= RNA_def_property(srna, "render_resolution_v", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "resolv_ren");
RNA_def_property_ui_range(prop, 0, 64, 1, 0);
- RNA_def_property_range(prop, 0, INT_MAX);
+ RNA_def_property_range(prop, 0, SHRT_MAX);
RNA_def_property_ui_text(prop, "Render Resolution V", "Surface resolution in V direction used while rendering. Zero skips this property");
@@ -1222,14 +1356,15 @@ static void rna_def_curve(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_fill_deform", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_DEFORM_FILL);
- RNA_def_property_ui_text(prop, "Fill deformed", "Fill curve after applying deformation");
+ RNA_def_property_ui_text(prop, "Fill deformed", "Fill curve after applying shape keys and all modifiers");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* texture space */
prop= RNA_def_property(srna, "use_auto_texspace", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "texflag", CU_AUTOSPACE);
RNA_def_property_ui_text(prop, "Auto Texture Space", "Adjusts active object's texture space automatically when transforming object");
-
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Curve_texspace_set");
+
prop= RNA_def_property(srna, "texspace_location", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Texture Space Location", "Texture space location");
@@ -1251,9 +1386,9 @@ static void rna_def_curve(BlenderRNA *brna)
RNA_def_property_editable_func(prop, texspace_editable);
RNA_def_property_update(prop, 0, "rna_Curve_update_data");*/
- prop= RNA_def_property(srna, "use_map_on_length", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_uv_as_generated", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_UV_ORCO);
- RNA_def_property_ui_text(prop, "Map Along Length", "Generate texture mapping coordinates following the curve direction, rather than the local bounding box");
+ RNA_def_property_ui_text(prop, "Use UV for mapping", "Uses the UV values as Generated textured coordinates");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* materials */
@@ -1341,14 +1476,14 @@ static void rna_def_curve_nurb(BlenderRNA *brna)
prop= RNA_def_property(srna, "resolution_u", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "resolu");
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_range(prop, 1, 64, 1, 0);
RNA_def_property_ui_text(prop, "Resolution U", "Curve or Surface subdivisions per segment");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "resolution_v", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "resolv");
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_range(prop, 1, 64, 1, 0);
RNA_def_property_ui_text(prop, "Resolution V", "Surface subdivisions per segment");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
@@ -1356,12 +1491,12 @@ static void rna_def_curve_nurb(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_cyclic_u", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flagu", CU_NURB_CYCLIC);
RNA_def_property_ui_text(prop, "Cyclic U", "Make this curve or surface a closed loop in the U direction");
- RNA_def_property_update(prop, 0, "rna_Nurb_update_handle_data"); /* only needed for cyclic_u because cyclic_v cant do bezier */
+ RNA_def_property_update(prop, 0, "rna_Nurb_update_cyclic_u");
prop= RNA_def_property(srna, "use_cyclic_v", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flagv", CU_NURB_CYCLIC);
RNA_def_property_ui_text(prop, "Cyclic V", "Make this surface a closed loop in the V direction");
- RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ RNA_def_property_update(prop, 0, "rna_Nurb_update_cyclic_v");
/* Note, endpoint and bezier flags should never be on at the same time! */
@@ -1407,6 +1542,8 @@ static void rna_def_curve_nurb(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* editing this needs knot recalc*/
RNA_def_property_ui_text(prop, "Character Index", "Location of this character in the text data (only for text curves)");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+ RNA_def_struct_path_func(srna, "rna_Curve_spline_path");
}
void RNA_def_curve(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c
index 1fed1663952..454ed7cee71 100644
--- a/source/blender/makesrna/intern/rna_define.c
+++ b/source/blender/makesrna/intern/rna_define.c
@@ -34,10 +34,11 @@
#include "DNA_genfile.h"
#include "DNA_sdna_types.h"
-#include "RNA_define.h"
-
-#include "BLI_ghash.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
+
+#include "RNA_define.h"
#include "rna_internal.h"
@@ -264,8 +265,8 @@ static ContainerDefRNA *rna_find_container_def(ContainerRNA *cont)
/* DNA utility function for looking up members */
typedef struct DNAStructMember {
- char *type;
- char *name;
+ const char *type;
+ const char *name;
int arraylength;
int pointerlevel;
} DNAStructMember;
@@ -295,7 +296,7 @@ static int rna_member_cmp(const char *name, const char *oname)
static int rna_find_sdna_member(SDNA *sdna, const char *structname, const char *membername, DNAStructMember *smember)
{
- char *dnaname;
+ const char *dnaname;
short *sp;
int a, b, structnr, totmember, cmp;
@@ -359,7 +360,7 @@ static int rna_validate_identifier(const char *identifier, char *error, int prop
int a=0;
/* list from http://docs.python.org/reference/lexical_analysis.html#id5 */
- static char *kwlist[] = {
+ static const char *kwlist[] = {
"and", "as", "assert", "break",
"class", "continue", "def", "del",
"elif", "else", "except", "exec",
@@ -474,11 +475,12 @@ void RNA_struct_free(BlenderRNA *brna, StructRNA *srna)
PropertyRNA *prop, *nextprop;
PropertyRNA *parm, *nextparm;
+ /*
if(srna->flag & STRUCT_RUNTIME) {
if(RNA_struct_py_type_get(srna)) {
fprintf(stderr, "RNA_struct_free '%s' freed while holding a python reference\n", srna->identifier);
}
- }
+ } */
for(prop=srna->cont.properties.first; prop; prop=nextprop) {
nextprop= prop->next;
@@ -837,7 +839,7 @@ void RNA_def_struct_ui_icon(StructRNA *srna, int icon)
PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier, int type, int subtype)
{
- StructRNA *srna= DefRNA.laststruct;
+ /*StructRNA *srna= DefRNA.laststruct;*/ /* invalid for python defined props */
ContainerRNA *cont= cont_;
ContainerDefRNA *dcont;
PropertyDefRNA *dprop= NULL;
@@ -847,7 +849,7 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier
char error[512];
if (rna_validate_identifier(identifier, error, 1) == 0) {
- fprintf(stderr, "RNA_def_property: property identifier \"%s.%s\" - %s\n", srna->identifier, identifier, error);
+ fprintf(stderr, "RNA_def_property: property identifier \"%s.%s\" - %s\n", CONTAINER_RNA_ID(cont), identifier, error);
DefRNA.error= 1;
}
@@ -855,7 +857,7 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier
/* XXX - toto, detect supertype collisions */
if(rna_findlink(&dcont->properties, identifier)) {
- fprintf(stderr, "RNA_def_property: duplicate identifier \"%s.%s\"\n", srna->identifier, identifier);
+ fprintf(stderr, "RNA_def_property: duplicate identifier \"%s.%s\"\n", CONTAINER_RNA_ID(cont), identifier);
DefRNA.error= 1;
}
@@ -913,7 +915,7 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier
case PROP_COLLECTION:
break;
default:
- fprintf(stderr, "RNA_def_property: \"%s.%s\", invalid property type.\n", srna->identifier, identifier);
+ fprintf(stderr, "RNA_def_property: \"%s.%s\", invalid property type.\n", CONTAINER_RNA_ID(cont), identifier);
DefRNA.error= 1;
return NULL;
}
@@ -1004,6 +1006,11 @@ void RNA_def_property_clear_flag(PropertyRNA *prop, int flag)
prop->flag &= ~flag;
}
+void RNA_def_property_subtype(PropertyRNA *prop, PropertySubType subtype)
+{
+ prop->subtype= subtype;
+}
+
void RNA_def_property_array(PropertyRNA *prop, int length)
{
StructRNA *srna= DefRNA.laststruct;
@@ -1020,6 +1027,12 @@ void RNA_def_property_array(PropertyRNA *prop, int length)
return;
}
+ if(prop->arraydimension > 1) {
+ fprintf(stderr, "RNA_def_property_array: \"%s.%s\", array dimensions has been set to %d but would be overwritten as 1.\n", srna->identifier, prop->identifier, prop->arraydimension);
+ DefRNA.error= 1;
+ return;
+ }
+
switch(prop->type) {
case PROP_BOOLEAN:
case PROP_INT:
@@ -1035,7 +1048,7 @@ void RNA_def_property_array(PropertyRNA *prop, int length)
}
}
-void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, int length[])
+void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, const int length[])
{
StructRNA *srna= DefRNA.laststruct;
int i;
@@ -1380,20 +1393,36 @@ void RNA_def_property_enum_default(PropertyRNA *prop, int value)
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
eprop->defaultvalue= value;
- for(i=0; i<eprop->totitem; i++) {
- if(eprop->item[i].identifier[0] && eprop->item[i].value == eprop->defaultvalue)
- defaultfound= 1;
- }
-
- if(!defaultfound && eprop->totitem) {
- if(value == 0) {
- eprop->defaultvalue= eprop->item[0].value;
+ if(prop->flag & PROP_ENUM_FLAG) {
+ /* check all bits are accounted for */
+ int totflag= 0;
+ for(i=0; i<eprop->totitem; i++) {
+ if(eprop->item[i].identifier[0]) {
+ totflag |= eprop->item[i].value;
+ }
}
- else {
- fprintf(stderr, "RNA_def_property_enum_default: \"%s.%s\", default is not in items.\n", srna->identifier, prop->identifier);
+
+ if(eprop->defaultvalue & ~totflag) {
+ fprintf(stderr, "RNA_def_property_enum_default: \"%s.%s\", default includes unused bits (%d).\n", srna->identifier, prop->identifier, eprop->defaultvalue & ~totflag);
DefRNA.error= 1;
}
}
+ else {
+ for(i=0; i<eprop->totitem; i++) {
+ if(eprop->item[i].identifier[0] && eprop->item[i].value == eprop->defaultvalue)
+ defaultfound= 1;
+ }
+
+ if(!defaultfound && eprop->totitem) {
+ if(value == 0) {
+ eprop->defaultvalue= eprop->item[0].value;
+ }
+ else {
+ fprintf(stderr, "RNA_def_property_enum_default: \"%s.%s\", default is not in items.\n", srna->identifier, prop->identifier);
+ DefRNA.error= 1;
+ }
+ }
+ }
break;
}
@@ -1480,8 +1509,19 @@ void RNA_def_property_boolean_sdna(PropertyRNA *prop, const char *structname, co
return;
}
- if((dp=rna_def_property_sdna(prop, structname, propname)))
+ if((dp=rna_def_property_sdna(prop, structname, propname))) {
+
+ if(DefRNA.silent == 0) {
+ /* error check to ensure floats are not wrapped as ints/bools */
+ if(dp->dnatype && *dp->dnatype && IS_DNATYPE_INT_COMPAT(dp->dnatype) == 0) {
+ fprintf(stderr, "RNA_def_property_boolean_sdna: %s.%s is a '%s' but wrapped as type '%s'.\n", srna->identifier, prop->identifier, dp->dnatype, RNA_property_typename(prop->type));
+ DefRNA.error= 1;
+ return;
+ }
+ }
+
dp->booleanbit= bit;
+ }
}
void RNA_def_property_boolean_negative_sdna(PropertyRNA *prop, const char *structname, const char *propname, int booleanbit)
@@ -1514,6 +1554,16 @@ void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const
}
if((dp= rna_def_property_sdna(prop, structname, propname))) {
+
+ /* error check to ensure floats are not wrapped as ints/bools */
+ if(DefRNA.silent == 0) {
+ if(dp->dnatype && *dp->dnatype && IS_DNATYPE_INT_COMPAT(dp->dnatype) == 0) {
+ fprintf(stderr, "RNA_def_property_int_sdna: %s.%s is a '%s' but wrapped as type '%s'.\n", srna->identifier, prop->identifier, dp->dnatype, RNA_property_typename(prop->type));
+ DefRNA.error= 1;
+ return;
+ }
+ }
+
/* SDNA doesn't pass us unsigned unfortunately .. */
if(dp->dnatype && strcmp(dp->dnatype, "char") == 0) {
iprop->hardmin= iprop->softmin= CHAR_MIN;
@@ -1538,6 +1588,7 @@ void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const
void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, const char *propname)
{
+ PropertyDefRNA *dp;
StructRNA *srna= DefRNA.laststruct;
if(!DefRNA.preprocess) {
@@ -1551,12 +1602,25 @@ void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, cons
return;
}
+ if((dp= rna_def_property_sdna(prop, structname, propname))) {
+ /* silent is for internal use */
+ if(DefRNA.silent == 0) {
+ if(dp->dnatype && *dp->dnatype && IS_DNATYPE_FLOAT_COMPAT(dp->dnatype) == 0) {
+ if(prop->subtype != PROP_COLOR_GAMMA) { /* colors are an exception. these get translated */
+ fprintf(stderr, "RNA_def_property_float_sdna: %s.%s is a '%s' but wrapped as type '%s'.\n", srna->identifier, prop->identifier, dp->dnatype, RNA_property_typename(prop->type));
+ DefRNA.error= 1;
+ return;
+ }
+ }
+ }
+ }
+
rna_def_property_sdna(prop, structname, propname);
}
void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const char *propname)
{
- PropertyDefRNA *dp;
+ /* PropertyDefRNA *dp; */
StructRNA *srna= DefRNA.laststruct;
if(!DefRNA.preprocess) {
@@ -1570,7 +1634,7 @@ void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const
return;
}
- if((dp=rna_def_property_sdna(prop, structname, propname))) {
+ if(( /* dp= */ rna_def_property_sdna(prop, structname, propname))) {
if(prop->arraydimension) {
prop->arraydimension= 0;
prop->totarraylength= 0;
@@ -1597,7 +1661,7 @@ void RNA_def_property_enum_bitflag_sdna(PropertyRNA *prop, const char *structnam
void RNA_def_property_string_sdna(PropertyRNA *prop, const char *structname, const char *propname)
{
- PropertyDefRNA *dp;
+ /* PropertyDefRNA *dp; */
StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
StructRNA *srna= DefRNA.laststruct;
@@ -1612,7 +1676,7 @@ void RNA_def_property_string_sdna(PropertyRNA *prop, const char *structname, con
return;
}
- if((dp=rna_def_property_sdna(prop, structname, propname))) {
+ if((/* dp= */ rna_def_property_sdna(prop, structname, propname))) {
if(prop->arraydimension) {
sprop->maxlength= prop->totarraylength;
prop->arraydimension= 0;
@@ -1623,7 +1687,7 @@ void RNA_def_property_string_sdna(PropertyRNA *prop, const char *structname, con
void RNA_def_property_pointer_sdna(PropertyRNA *prop, const char *structname, const char *propname)
{
- PropertyDefRNA *dp;
+ /* PropertyDefRNA *dp; */
StructRNA *srna= DefRNA.laststruct;
if(!DefRNA.preprocess) {
@@ -1637,7 +1701,7 @@ void RNA_def_property_pointer_sdna(PropertyRNA *prop, const char *structname, co
return;
}
- if((dp=rna_def_property_sdna(prop, structname, propname))) {
+ if((/* dp= */ rna_def_property_sdna(prop, structname, propname))) {
if(prop->arraydimension) {
prop->arraydimension= 0;
prop->totarraylength= 0;
@@ -2164,6 +2228,27 @@ PropertyRNA *RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, co
return prop;
}
+/* same as above but sets 'PROP_ENUM_FLAG' before setting the default value */
+PropertyRNA *RNA_def_enum_flag(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, int default_value,
+ const char *ui_name, const char *ui_description)
+{
+ ContainerRNA *cont= cont_;
+ PropertyRNA *prop;
+
+ if(!items) {
+ printf("RNA_def_enum_flag: items not allowed to be NULL.\n");
+ return NULL;
+ }
+
+ prop= RNA_def_property(cont, identifier, PROP_ENUM, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_ENUM_FLAG); /* important to run before default set */
+ if(items) RNA_def_property_enum_items(prop, items);
+ RNA_def_property_enum_default(prop, default_value);
+ RNA_def_property_ui_text(prop, ui_name, ui_description);
+
+ return prop;
+}
+
void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc)
{
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
@@ -2234,8 +2319,11 @@ PropertyRNA *RNA_def_float_matrix(StructOrFunctionRNA *cont_, const char *identi
{
ContainerRNA *cont= cont_;
PropertyRNA *prop;
- int length[2]= {rows, columns};
-
+ int length[2];
+
+ length[0]= rows;
+ length[1]= columns;
+
prop= RNA_def_property(cont, identifier, PROP_FLOAT, PROP_MATRIX);
RNA_def_property_multi_array(prop, 2, length);
if(default_value) RNA_def_property_float_array_default(prop, default_value);
@@ -2784,3 +2872,17 @@ int RNA_def_property_free_identifier(StructOrFunctionRNA *cont_, const char *ide
}
#endif
+const char *RNA_property_typename(PropertyType type)
+{
+ switch(type) {
+ case PROP_BOOLEAN: return "PROP_BOOLEAN";
+ case PROP_INT: return "PROP_INT";
+ case PROP_FLOAT: return "PROP_FLOAT";
+ case PROP_STRING: return "PROP_STRING";
+ case PROP_ENUM: return "PROP_ENUM";
+ case PROP_POINTER: return "PROP_POINTER";
+ case PROP_COLLECTION: return "PROP_COLLECTION";
+ }
+
+ return "PROP_UNKNOWN";
+}
diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c
index 63405e08f69..69e15482bbb 100644
--- a/source/blender/makesrna/intern/rna_fcurve.c
+++ b/source/blender/makesrna/intern/rna_fcurve.c
@@ -53,7 +53,7 @@ EnumPropertyItem fmodifier_type_items[] = {
{FMODIFIER_TYPE_CYCLES, "CYCLES", 0, "Cycles", ""},
{FMODIFIER_TYPE_NOISE, "NOISE", 0, "Noise", ""},
{FMODIFIER_TYPE_FILTER, "FILTER", 0, "Filter", ""},
- {FMODIFIER_TYPE_PYTHON, "PYTHON", 0, "Python", ""},
+ //{FMODIFIER_TYPE_PYTHON, "PYTHON", 0, "Python", ""}, // FIXME: not implemented yet!
{FMODIFIER_TYPE_LIMITS, "LIMITS", 0, "Limits", ""},
{FMODIFIER_TYPE_STEPPED, "STEPPED", 0, "Stepped Interpolation", ""},
{0, NULL, 0, NULL, NULL}};
@@ -62,6 +62,7 @@ EnumPropertyItem beztriple_keyframe_type_items[] = {
{BEZT_KEYTYPE_KEYFRAME, "KEYFRAME", 0, "Keyframe", ""},
{BEZT_KEYTYPE_BREAKDOWN, "BREAKDOWN", 0, "Breakdown", ""},
{BEZT_KEYTYPE_EXTREME, "EXTREME", 0, "Extreme", ""},
+ {BEZT_KEYTYPE_JITTER, "JITTER", 0, "Jitter", ""},
{0, NULL, 0, NULL, NULL}};
#ifdef RNA_RUNTIME
@@ -111,7 +112,7 @@ static void rna_ChannelDriver_update_data(Main *bmain, Scene *scene, PointerRNA
// TODO: this really needs an update guard...
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update(id, OB_RECALC_OB|OB_RECALC_DATA);
+ DAG_id_tag_update(id, OB_RECALC_OB|OB_RECALC_DATA);
WM_main_add_notifier(NC_SCENE|ND_FRAME, scene);
}
@@ -334,19 +335,36 @@ static void rna_FCurve_RnaPath_set(PointerRNA *ptr, const char *value)
static void rna_FCurve_group_set(PointerRNA *ptr, PointerRNA value)
{
- AnimData *adt= BKE_animdata_from_id(ptr->id.data);
- bAction *act= (adt) ? adt->action : NULL;
+ ID *pid = (ID *)ptr->id.data;
+ ID *vid = (ID *)value.id.data;
FCurve *fcu= ptr->data;
-
- /* same ID? */
- if (value.data && (ptr->id.data != value.id.data)) {
+ bAction *act = NULL;
+
+ /* get action */
+ if (ELEM(NULL, pid, vid)) {
+ printf("ERROR: one of the ID's for the groups to assign to is invalid (ptr=%p, val=%p)\n", pid, vid);
+ return;
+ }
+ else if (value.data && (pid != vid)) {
/* id's differ, cant do this, should raise an error */
+ printf("ERROR: ID's differ - ptr=%p vs value=%p \n", pid, vid);
return;
}
+
+ if (GS(pid->name)==ID_AC && GS(vid->name)==ID_AC) {
+ /* the ID given is the action already - usually when F-Curve is obtained from an action's pointer */
+ act = (bAction *)pid;
+ }
+ else {
+ /* the ID given is the owner of the F-Curve (for drivers) */
+ AnimData *adt = BKE_animdata_from_id(ptr->id.data);
+ act = (adt)? adt->action : NULL;
+ }
+
/* already belongs to group? */
if (fcu->grp == value.data) {
/* nothing to do */
- printf("ERROR: F-Curve already belongs to the group\n");
+ printf("ERROR: F-Curve already belongs to this group\n");
return;
}
@@ -357,18 +375,16 @@ static void rna_FCurve_group_set(PointerRNA *ptr, PointerRNA value)
/* can't change the grouping of F-Curve when it doesn't belong to an action */
printf("ERROR: cannot assign F-Curve to group, since F-Curve is not attached to any ID\n");
return;
- }
-
- /* try to remove F-Curve from action (including from any existing groups)
- * - if after this op it is still attached to something, then it is a driver
- * not an animation curve as we thought, and we should exit
- */
- action_groups_remove_channel(act, fcu);
- if (fcu->next) {
- /* F-Curve is not one that exists in the action, since the above op couldn't remove it from the list */
+ }
+ /* make sure F-Curve exists in this action first, otherwise we could still have been tricked */
+ else if (BLI_findindex(&act->curves, fcu) == -1) {
+ printf("ERROR: F-Curve (%p) doesn't exist in action '%s'\n", fcu, act->id.name);
return;
}
+ /* try to remove F-Curve from action (including from any existing groups) */
+ action_groups_remove_channel(act, fcu);
+
/* add the F-Curve back to the action now in the right place */
// TODO: make the api function handle the case where there isn't any group to assign to
if (value.data) {
@@ -531,25 +547,34 @@ static void rna_FModifierStepped_end_frame_range(PointerRNA *ptr, float *min, fl
*max= MAXFRAMEF;
}
-static BezTriple *rna_FKeyframe_points_add(FCurve *fcu, float frame, float value, int do_replace, int do_needed, int do_fast)
+static BezTriple *rna_FKeyframe_points_insert(FCurve *fcu, float frame, float value, int flag)
{
- int index;
- int flag= 0;
-
- if(do_replace) flag |= INSERTKEY_REPLACE;
- if(do_needed) flag |= INSERTKEY_NEEDED;
- if(do_fast) flag |= INSERTKEY_FAST;
+ int index= insert_vert_fcurve(fcu, frame, value, flag);
+ return ((fcu->bezt) && (index >= 0))? (fcu->bezt + index) : NULL;
+}
+static void rna_FKeyframe_points_add(FCurve *fcu, int tot)
+{
+ if(tot > 0) {
+ if(fcu->totvert) {
+ BezTriple *nbezt= MEM_callocN(sizeof(BezTriple) * (fcu->totvert + tot), "rna_FKeyframe_points_add");
+ memcpy(nbezt, fcu->bezt, sizeof(BezTriple) * fcu->totvert);
+ MEM_freeN(fcu->bezt);
+ fcu->bezt= nbezt;
+ }
+ else {
+ fcu->bezt= MEM_callocN(sizeof(BezTriple) * tot, "rna_FKeyframe_points_add");
+ }
- index= insert_vert_fcurve(fcu, frame, value, flag);
- return index >= 0 ? fcu->bezt + index : NULL;
+ fcu->totvert += tot;
+ }
}
static void rna_FKeyframe_points_remove(FCurve *fcu, ReportList *reports, BezTriple *bezt, int do_fast)
{
int index= (int)(bezt - fcu->bezt);
if (index < 0 || index >= fcu->totvert) {
- BKE_report(reports, RPT_ERROR, "bezier not in fcurve.");
+ BKE_report(reports, RPT_ERROR, "Keyframe not in F-Curve.");
return;
}
@@ -747,8 +772,8 @@ static void rna_def_fmodifier_cycles(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Before Mode", "Cycling mode to use before first keyframe");
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
- prop= RNA_def_property(srna, "cycles_before", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "before_cycles");
+ prop= RNA_def_property(srna, "cycles_before", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "before_cycles");
RNA_def_property_ui_text(prop, "Before Cycles", "Maximum number of cycles to allow before first keyframe. (0 = infinite)");
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
@@ -759,8 +784,8 @@ static void rna_def_fmodifier_cycles(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "After Mode", "Cycling mode to use after last keyframe");
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
- prop= RNA_def_property(srna, "cycles_after", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "after_cycles");
+ prop= RNA_def_property(srna, "cycles_after", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "after_cycles");
RNA_def_property_ui_text(prop, "After Cycles", "Maximum number of cycles to allow after last keyframe. (0 = infinite)");
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
}
@@ -1308,25 +1333,32 @@ static void rna_def_fcurve_keyframe_points(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
+ static EnumPropertyItem keyframe_flag_items[] = {
+ {INSERTKEY_REPLACE, "REPLACE", 0, "Replace", "Don't add any new keyframes, but just replace existing ones"},
+ {INSERTKEY_NEEDED, "NEEDED", 0, "Needed", "Only adds keyframes that are needed"},
+ {INSERTKEY_FAST, "FAST", 0, "Fast", "Fast keyframe insertion to avoid recalculating the curve each time"},
+ {0, NULL, 0, NULL, NULL}};
+
RNA_def_property_srna(cprop, "FCurveKeyframePoints");
srna= RNA_def_struct(brna, "FCurveKeyframePoints", NULL);
RNA_def_struct_sdna(srna, "FCurve");
RNA_def_struct_ui_text(srna, "Keyframe Points", "Collection of keyframe points");
- func= RNA_def_function(srna, "add", "rna_FKeyframe_points_add");
+ func= RNA_def_function(srna, "insert", "rna_FKeyframe_points_insert");
RNA_def_function_ui_description(func, "Add a keyframe point to a F-Curve.");
parm= RNA_def_float(func, "frame", 0.0f, -FLT_MAX, FLT_MAX, "", "X Value of this keyframe point", -FLT_MAX, FLT_MAX);
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_float(func, "value", 0.0f, -FLT_MAX, FLT_MAX, "", "Y Value of this keyframe point", -FLT_MAX, FLT_MAX);
RNA_def_property_flag(parm, PROP_REQUIRED);
- /* optional */
- parm= RNA_def_boolean(func, "replace", 0, "Replace", "Replace existing keyframes");
- parm= RNA_def_boolean(func, "needed", 0, "Needed", "Only adds keyframes that are needed");
- parm= RNA_def_boolean(func, "fast", 0, "Fast", "Fast keyframe insertion to avoid recalculating the curve each time");
+
+ RNA_def_enum_flag(func, "options", keyframe_flag_items, 0, "", "Keyframe options.");
parm= RNA_def_pointer(func, "keyframe", "Keyframe", "", "Newly created keyframe");
RNA_def_function_return(func, parm);
+ func= RNA_def_function(srna, "add", "rna_FKeyframe_points_add");
+ RNA_def_function_ui_description(func, "Add a keyframe point to a F-Curve.");
+ RNA_def_int(func, "count", 1, 1, INT_MAX, "Number", "Number of points to add to the spline", 1, INT_MAX);
func= RNA_def_function(srna, "remove", "rna_FKeyframe_points_remove");
RNA_def_function_ui_description(func, "Remove keyframe from an fcurve.");
@@ -1334,7 +1366,7 @@ static void rna_def_fcurve_keyframe_points(BlenderRNA *brna, PropertyRNA *cprop)
parm= RNA_def_pointer(func, "keyframe", "Keyframe", "", "Keyframe to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
/* optional */
- parm= RNA_def_boolean(func, "fast", 0, "Fast", "Fast keyframe removal to avoid recalculating the curve each time");
+ RNA_def_boolean(func, "fast", 0, "Fast", "Fast keyframe removal to avoid recalculating the curve each time");
}
static void rna_def_fcurve(BlenderRNA *brna)
@@ -1395,6 +1427,7 @@ static void rna_def_fcurve(BlenderRNA *brna)
prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Color", "Color of the F-Curve in the Graph Editor");
RNA_def_property_update(prop, NC_ANIMATION, NULL);
diff --git a/source/blender/makesrna/intern/rna_fluidsim.c b/source/blender/makesrna/intern/rna_fluidsim.c
index 68060e2cfe3..55045a927bc 100644
--- a/source/blender/makesrna/intern/rna_fluidsim.c
+++ b/source/blender/makesrna/intern/rna_fluidsim.c
@@ -42,6 +42,7 @@
#include "BKE_depsgraph.h"
#include "BKE_fluidsim.h"
+#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_modifier.h"
#include "BKE_particle.h"
@@ -75,10 +76,40 @@ static void rna_fluid_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Object *ob= ptr->id.data;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ob);
}
+static int fluidsim_find_lastframe(FluidsimSettings *fss)
+{
+ char targetDir[FILE_MAXFILE+FILE_MAXDIR], targetFile[FILE_MAXFILE+FILE_MAXDIR];
+ int curFrame = 1;
+
+ BLI_snprintf(targetDir, sizeof(targetDir), "%sfluidsurface_final_####.bobj.gz", fss->surfdataPath);
+ BLI_path_abs(targetDir, G.main->name);
+
+ do {
+ BLI_strncpy(targetFile, targetDir, sizeof(targetFile));
+ BLI_path_frame(targetFile, curFrame++, 0);
+ } while(BLI_exist(targetFile));
+
+ return curFrame - 1;
+}
+
+static void rna_fluid_find_enframe(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Object *ob= ptr->id.data;
+ FluidsimModifierData *fluidmd= (FluidsimModifierData*)modifiers_findByType(ob, eModifierType_Fluidsim);
+
+ if(fluidmd->fss->flag & OB_FLUIDSIM_REVERSE) {
+ fluidmd->fss->lastgoodframe = fluidsim_find_lastframe(fluidmd->fss);
+ }
+ else {
+ fluidmd->fss->lastgoodframe = -1;
+ }
+ rna_fluid_update(bmain, scene, ptr);
+}
+
static void rna_FluidSettings_update_type(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
@@ -231,8 +262,9 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_reverse_frames", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_FLUIDSIM_REVERSE);
RNA_def_property_ui_text(prop, "Reverse Frames", "Reverse fluid frames");
+ RNA_def_property_update(prop, 0, "rna_fluid_find_enframe");
- prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_maxlength(prop, 240);
RNA_def_property_string_sdna(prop, NULL, "surfdataPath");
RNA_def_property_ui_text(prop, "Path", "Directory (and/or filename prefix) to store baked fluid simulation files in");
@@ -469,7 +501,7 @@ static void rna_def_fluidsim_particle(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0, 2.0);
RNA_def_property_ui_text(prop, "Alpha Influence", "Amount of particle alpha change, inverse of size influence: 0=off (all same alpha), 1=full. (large particles get lower alphas, smaller ones higher values)");
- prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_maxlength(prop, 240);
RNA_def_property_string_sdna(prop, NULL, "surfdataPath");
RNA_def_property_ui_text(prop, "Path", "Directory (and/or filename prefix) to store and load particles from");
@@ -527,6 +559,7 @@ static void rna_def_fluidsim_control(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_FLUIDSIM_REVERSE);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Reverse Frames", "Reverse control object movement");
+ RNA_def_property_update(prop, 0, "rna_fluid_find_enframe");
}
void RNA_def_fluidsim(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c
index c03af99ccb0..a104ae9de5c 100644
--- a/source/blender/makesrna/intern/rna_gpencil.c
+++ b/source/blender/makesrna/intern/rna_gpencil.c
@@ -169,6 +169,7 @@ static void rna_def_gpencil_layer(BlenderRNA *brna)
/* Drawing Color */
prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Color", "Color for all strokes in this layer");
RNA_def_property_update(prop, NC_SCREEN|ND_GPENCIL, NULL);
diff --git a/source/blender/makesrna/intern/rna_image.c b/source/blender/makesrna/intern/rna_image.c
index 92c860a8074..cc3c25fdb0e 100644
--- a/source/blender/makesrna/intern/rna_image.c
+++ b/source/blender/makesrna/intern/rna_image.c
@@ -79,7 +79,7 @@ static void rna_Image_source_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Image *ima= ptr->id.data;
BKE_image_signal(ima, NULL, IMA_SIGNAL_SRC_CHANGE);
- DAG_id_flush_update(&ima->id, 0);
+ DAG_id_tag_update(&ima->id, 0);
}
static void rna_Image_fields_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -107,7 +107,7 @@ static void rna_Image_reload_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Image *ima= ptr->id.data;
BKE_image_signal(ima, NULL, IMA_SIGNAL_RELOAD);
- DAG_id_flush_update(&ima->id, 0);
+ DAG_id_tag_update(&ima->id, 0);
}
static void rna_Image_generated_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -171,9 +171,19 @@ static void rna_Image_file_format_set(PointerRNA *ptr, int value)
{
Image *image= (Image*)ptr->data;
if(BKE_imtype_is_movie(value) == 0) { /* should be able to throw an error here */
- ImBuf *ibuf= BKE_image_get_ibuf(image, NULL);
+ ImBuf *ibuf;
+ int ftype= BKE_imtype_to_ftype(value);
+
+ /*
+ ibuf= BKE_image_get_ibuf(image, NULL);
if(ibuf)
- ibuf->ftype= BKE_imtype_to_ftype(value);
+ ibuf->ftype= ftype;
+ */
+
+ /* to be safe change all buffer file types */
+ for(ibuf= image->ibufs.first; ibuf; ibuf= ibuf->next) {
+ ibuf->ftype= ftype;
+ }
}
}
@@ -265,12 +275,12 @@ static void rna_def_imageuser(BlenderRNA *brna)
prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "sfra");
RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
- RNA_def_property_ui_text(prop, "Start Frame", "Sets the global starting frame of the movie");
+ RNA_def_property_ui_text(prop, "Start Frame", "Sets the global starting frame of the movie/sequence, assuming first picture has a #1");
RNA_def_property_update(prop, 0, "rna_ImageUser_update");
prop= RNA_def_property(srna, "fields_per_frame", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "fie_ima");
- RNA_def_property_range(prop, 1, MAXFRAMEF);
+ RNA_def_property_range(prop, 1, 200);
RNA_def_property_ui_text(prop, "Fields per Frame", "The number of fields per rendered frame (2 fields is 1 image)");
RNA_def_property_update(prop, 0, "rna_ImageUser_update");
diff --git a/source/blender/makesrna/intern/rna_image_api.c b/source/blender/makesrna/intern/rna_image_api.c
index 70438ae3d8c..836faf1e9a9 100644
--- a/source/blender/makesrna/intern/rna_image_api.c
+++ b/source/blender/makesrna/intern/rna_image_api.c
@@ -40,8 +40,8 @@
#include "BKE_image.h"
#include "BKE_packedFile.h"
#include "BKE_main.h"
-#include "BKE_utildefines.h"
-#include "BKE_global.h" /* grr: G.sce */
+
+#include "BKE_global.h" /* grr: G.main->name */
#include "IMB_imbuf.h"
@@ -53,7 +53,7 @@
#include "MEM_guardedalloc.h"
-static void rna_Image_save_render(Image *image, bContext *C, ReportList *reports, char *path, Scene *scene)
+static void rna_Image_save_render(Image *image, bContext *C, ReportList *reports, const char *path, Scene *scene)
{
ImBuf *ibuf;
@@ -73,9 +73,17 @@ static void rna_Image_save_render(Image *image, bContext *C, ReportList *reports
if (ibuf == NULL) {
BKE_reportf(reports, RPT_ERROR, "Couldn't acquire buffer from image");
}
-
- if (!BKE_write_ibuf(NULL, ibuf, path, scene->r.imtype, scene->r.subimtype, scene->r.quality)) {
- BKE_reportf(reports, RPT_ERROR, "Couldn't write image: %s", path);
+ else {
+ /* temp swap out the color */
+ const unsigned char imb_depth_back= ibuf->depth;
+ const float dither_back= ibuf->dither;
+ ibuf->depth= scene->r.planes;
+ ibuf->dither= scene->r.dither_intensity;
+ if (!BKE_write_ibuf(NULL, ibuf, path, scene->r.imtype, scene->r.subimtype, scene->r.quality)) {
+ BKE_reportf(reports, RPT_ERROR, "Couldn't write image: %s", path);
+ }
+ ibuf->depth= imb_depth_back;
+ ibuf->dither= dither_back;
}
BKE_image_release_ibuf(image, lock);
@@ -90,7 +98,7 @@ static void rna_Image_save(Image *image, ReportList *reports)
if(ibuf) {
char filename[FILE_MAXDIR + FILE_MAXFILE];
BLI_strncpy(filename, image->name, sizeof(filename));
- BLI_path_abs(filename, G.sce);
+ BLI_path_abs(filename, G.main->name);
if(image->packedfile) {
if (writePackedFile(reports, image->name, image->packedfile, 0) != RET_OK) {
@@ -190,9 +198,9 @@ void RNA_api_image(StructRNA *srna)
func= RNA_def_function(srna, "save_render", "rna_Image_save_render");
RNA_def_function_ui_description(func, "Save image to a specific path using a scenes render settings");
RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
- parm= RNA_def_string(func, "filepath", "", 0, "", "Save path.");
+ parm= RNA_def_string_file_path(func, "filepath", "", 0, "", "Save path.");
RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_pointer(func, "scene", "Scene", "", "Scene to take image parameters from");
+ RNA_def_pointer(func, "scene", "Scene", "", "Scene to take image parameters from");
func= RNA_def_function(srna, "save", "rna_Image_save");
RNA_def_function_ui_description(func, "Save image to its source path");
@@ -208,8 +216,8 @@ void RNA_api_image(StructRNA *srna)
func= RNA_def_function(srna, "gl_load", "rna_Image_gl_load");
RNA_def_function_ui_description(func, "Load the image into OpenGL graphics memory");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- parm= RNA_def_int(func, "filter", GL_LINEAR_MIPMAP_NEAREST, -INT_MAX, INT_MAX, "Filter", "The texture minifying function", -INT_MAX, INT_MAX);
- parm= RNA_def_int(func, "mag", GL_LINEAR, -INT_MAX, INT_MAX, "Magnification", "The texture magnification function", -INT_MAX, INT_MAX);
+ RNA_def_int(func, "filter", GL_LINEAR_MIPMAP_NEAREST, -INT_MAX, INT_MAX, "Filter", "The texture minifying function", -INT_MAX, INT_MAX);
+ RNA_def_int(func, "mag", GL_LINEAR, -INT_MAX, INT_MAX, "Magnification", "The texture magnification function", -INT_MAX, INT_MAX);
/* return value */
parm= RNA_def_int(func, "error", 0, -INT_MAX, INT_MAX, "Error", "OpenGL error value", -INT_MAX, INT_MAX);
RNA_def_function_return(func, parm);
diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h
index 2bfe86a15ee..87e35c09b12 100644
--- a/source/blender/makesrna/intern/rna_internal.h
+++ b/source/blender/makesrna/intern/rna_internal.h
@@ -193,7 +193,7 @@ struct IDProperty *rna_ID_idprops(struct PointerRNA *ptr, int create);
void rna_ID_fake_user_set(struct PointerRNA *ptr, int value);
struct IDProperty *rna_IDPropertyGroup_idprops(struct PointerRNA *ptr, int create);
void rna_IDPropertyGroup_unregister(const struct bContext *C, struct StructRNA *type);
-struct StructRNA *rna_IDPropertyGroup_register(const struct bContext *C, struct ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free);
+struct StructRNA *rna_IDPropertyGroup_register(struct bContext *C, struct ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free);
struct StructRNA* rna_IDPropertyGroup_refine(struct PointerRNA *ptr);
void rna_object_vgroup_name_index_get(struct PointerRNA *ptr, char *value, int index);
@@ -233,6 +233,7 @@ void RNA_api_keyconfig(struct StructRNA *srna);
void RNA_api_keyingset(struct StructRNA *srna);
void RNA_api_keymap(struct StructRNA *srna);
void RNA_api_keymapitem(struct StructRNA *srna);
+void RNA_api_area(struct StructRNA *srna);
void RNA_api_main(struct StructRNA *srna);
void RNA_api_material(StructRNA *srna);
void RNA_api_mesh(struct StructRNA *srna);
@@ -300,7 +301,7 @@ void rna_builtin_properties_begin(struct CollectionPropertyIterator *iter, struc
void rna_builtin_properties_next(struct CollectionPropertyIterator *iter);
PointerRNA rna_builtin_properties_get(struct CollectionPropertyIterator *iter);
PointerRNA rna_builtin_type_get(struct PointerRNA *ptr);
-PointerRNA rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key);
+int rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr);
/* Iterators */
@@ -320,9 +321,15 @@ PointerRNA rna_listbase_lookup_int(PointerRNA *ptr, StructRNA *type, struct List
typedef struct ArrayIterator {
char *ptr;
- char *endptr;
+ char *endptr; /* past the last valid pointer, only for comparisons, ignores skipped values */
void *free_ptr; /* will be free'd if set */
int itemsize;
+
+ /* array length with no skip functins applied, take care not to compare against index from animsys or python indices */
+ int length;
+
+ /* optional skip function, when set the array as viewed by rna can contain only a subset of the members.
+ * this changes indices so quick array index lookups are not possible when skip function is used. */
IteratorSkipFunc skip;
} ArrayIterator;
@@ -355,9 +362,9 @@ int rna_parameter_size(struct PropertyRNA *parm);
int rna_parameter_size_alloc(struct PropertyRNA *parm);
// XXX, these should not need to be defined here~!
-struct MTex *rna_mtex_texture_slots_add(struct ID *self, struct ReportList *reports);
-struct MTex *rna_mtex_texture_slots_create(struct ID *self, struct ReportList *reports, int index);
-void rna_mtex_texture_slots_clear(struct ID *self, struct ReportList *reports, int index);
+struct MTex *rna_mtex_texture_slots_add(struct ID *self, struct bContext *C, struct ReportList *reports);
+struct MTex *rna_mtex_texture_slots_create(struct ID *self, struct bContext *C, struct ReportList *reports, int index);
+void rna_mtex_texture_slots_clear(struct ID *self, struct bContext *C, struct ReportList *reports, int index);
#endif /* RNA_INTERNAL_H */
diff --git a/source/blender/makesrna/intern/rna_internal_types.h b/source/blender/makesrna/intern/rna_internal_types.h
index 216533a8708..c31c473512a 100644
--- a/source/blender/makesrna/intern/rna_internal_types.h
+++ b/source/blender/makesrna/intern/rna_internal_types.h
@@ -22,8 +22,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef RNA_INTERNAL_TYPES
-#define RNA_INTERNAL_TYPES
+#ifndef RNA_INTERNAL_TYPES_H
+#define RNA_INTERNAL_TYPES_H
#include "DNA_listBase.h"
@@ -93,8 +93,8 @@ typedef void (*PropCollectionNextFunc)(struct CollectionPropertyIterator *iter);
typedef void (*PropCollectionEndFunc)(struct CollectionPropertyIterator *iter);
typedef PointerRNA (*PropCollectionGetFunc)(struct CollectionPropertyIterator *iter);
typedef int (*PropCollectionLengthFunc)(struct PointerRNA *ptr);
-typedef PointerRNA (*PropCollectionLookupIntFunc)(struct PointerRNA *ptr, int key);
-typedef PointerRNA (*PropCollectionLookupStringFunc)(struct PointerRNA *ptr, const char *key);
+typedef int (*PropCollectionLookupIntFunc)(struct PointerRNA *ptr, int key, struct PointerRNA *r_ptr);
+typedef int (*PropCollectionLookupStringFunc)(struct PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr);
/* Container - generic abstracted container of RNA properties */
typedef struct ContainerRNA {
@@ -108,7 +108,7 @@ struct FunctionRNA {
/* structs are containers of properties */
ContainerRNA cont;
- /* unique identifier */
+ /* unique identifier, keep after 'cont' */
const char *identifier;
/* various options */
int flag;
@@ -283,13 +283,14 @@ struct StructRNA {
/* structs are containers of properties */
ContainerRNA cont;
+ /* unique identifier, keep after 'cont' */
+ const char *identifier;
+
/* python type, this is a subtype of pyrna_struct_Type but used so each struct can have its own type
* which is useful for subclassing RNA */
void *py_type;
void *blender_type;
- /* unique identifier */
- const char *identifier;
/* various options */
int flag;
@@ -340,5 +341,6 @@ struct BlenderRNA {
ListBase structs;
};
-#endif /* RNA_INTERNAL_TYPES */
+#define CONTAINER_RNA_ID(cont) (const char *)(((ContainerRNA *)(cont))+1)
+#endif /* RNA_INTERNAL_TYPES_H */
diff --git a/source/blender/makesrna/intern/rna_key.c b/source/blender/makesrna/intern/rna_key.c
index 970c825d30b..beceb66986d 100644
--- a/source/blender/makesrna/intern/rna_key.c
+++ b/source/blender/makesrna/intern/rna_key.c
@@ -57,6 +57,7 @@ static Key *rna_ShapeKey_find_key(ID *id)
case ID_KE: return (Key*)id;
case ID_LT: return ((Lattice*)id)->key;
case ID_ME: return ((Mesh*)id)->key;
+ case ID_OB: return ob_get_key((Object*)id);
default: return NULL;
}
}
@@ -97,17 +98,55 @@ static void rna_ShapeKey_value_range(PointerRNA *ptr, float *min, float *max)
*max= data->slidermax;
}
+/* epsilon for how close one end of shapekey range can get to the other */
+#define SHAPEKEY_SLIDER_TOL 0.001
+
+static void rna_ShapeKey_slider_min_range(PointerRNA *ptr, float *min, float *max)
+{
+ KeyBlock *data= (KeyBlock*)ptr->data;
+
+ *min= -10.0f;
+ *max= data->slidermax - SHAPEKEY_SLIDER_TOL;
+}
+
+static void rna_ShapeKey_slider_min_set(PointerRNA *ptr, float value)
+{
+ KeyBlock *data= (KeyBlock*)ptr->data;
+ float min, max;
+
+ rna_ShapeKey_slider_min_range(ptr, &min, &max);
+ CLAMP(value, min, max);
+ data->slidermin = value;
+}
+
+static void rna_ShapeKey_slider_max_range(PointerRNA *ptr, float *min, float *max)
+{
+ KeyBlock *data= (KeyBlock*)ptr->data;
+
+ *min= data->slidermin + SHAPEKEY_SLIDER_TOL;
+ *max= 10.0f;
+}
+
+static void rna_ShapeKey_slider_max_set(PointerRNA *ptr, float value)
+{
+ KeyBlock *data= (KeyBlock*)ptr->data;
+ float min, max;
+
+ rna_ShapeKey_slider_max_range(ptr, &min, &max);
+ CLAMP(value, min, max);
+ data->slidermax = value;
+}
+
+#undef SHAPEKEY_SLIDER_TOL
+
PointerRNA rna_object_shapekey_index_get(ID *id, int value)
{
Key *key= rna_ShapeKey_find_key(id);
KeyBlock *kb= NULL;
PointerRNA ptr;
- int a;
- if(key && value < key->totkey)
- for(a=0, kb=key->block.first; kb; kb=kb->next, a++)
- if(a == value)
- break;
+ if (key && value < key->totkey)
+ kb = BLI_findlink(&key->block, value);
RNA_pointer_create(id, &RNA_ShapeKey, kb, &ptr);
@@ -117,13 +156,11 @@ PointerRNA rna_object_shapekey_index_get(ID *id, int value)
int rna_object_shapekey_index_set(ID *id, PointerRNA value, int current)
{
Key *key= rna_ShapeKey_find_key(id);
- KeyBlock *kb;
- int a;
- if(key)
- for(a=0, kb=key->block.first; kb; kb=kb->next, a++)
- if(kb == value.data)
- return a;
+ if (key) {
+ int a = BLI_findindex(&key->block, value.data);
+ if (a >= 0) return a;
+ }
return current;
}
@@ -245,17 +282,17 @@ static void rna_ShapeKey_data_begin(CollectionPropertyIterator *iter, PointerRNA
Curve *cu;
Nurb *nu;
int tot= kb->totelem, size= key->elemsize;
-
+
if(GS(key->from->name) == ID_CU) {
cu= (Curve*)key->from;
nu= cu->nurb.first;
-
+
if(nu->bezt) {
tot /= 3;
size *= 3;
}
}
-
+
rna_iterator_array_begin(iter, (void*)kb->data, size, tot, 0, NULL);
}
@@ -266,15 +303,15 @@ static int rna_ShapeKey_data_length(PointerRNA *ptr)
Curve *cu;
Nurb *nu;
int tot= kb->totelem;
-
+
if(GS(key->from->name) == ID_CU) {
cu= (Curve*)key->from;
nu= cu->nurb.first;
-
+
if(nu->bezt)
tot /= 3;
}
-
+
return tot;
}
@@ -284,11 +321,11 @@ static PointerRNA rna_ShapeKey_data_get(CollectionPropertyIterator *iter)
StructRNA *type;
Curve *cu;
Nurb *nu;
-
+
if(GS(key->from->name) == ID_CU) {
cu= (Curve*)key->from;
nu= cu->nurb.first;
-
+
if(nu->bezt)
type= &RNA_ShapeKeyBezierPoint;
else
@@ -318,12 +355,88 @@ static void rna_Key_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
for(ob=bmain->object.first; ob; ob= ob->id.next) {
if(ob_get_key(ob) == key) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ob);
}
}
}
+static KeyBlock *rna_ShapeKeyData_find_keyblock(Key *key, float *point)
+{
+ KeyBlock *kb;
+
+ /* sanity checks */
+ if (ELEM(NULL, key, point))
+ return NULL;
+
+ /* we'll need to manually search through the keyblocks and check
+ * if the point is somewhere in the middle of each block's data
+ */
+ for (kb = key->block.first; kb; kb = kb->next) {
+ if (kb->data) {
+ float *start = (float *)kb->data;
+ float *end;
+
+ /* easy cases first */
+ if ((start == NULL) || (start > point)) {
+ /* there's no chance point is in array */
+ continue;
+ }
+ else if (start == point) {
+ /* exact match - point is first in array */
+ return kb;
+ }
+
+ /* determine where end of array is
+ * - elemsize is in bytes, so use char* cast to get array in terms of bytes
+ */
+ end = (float *)((char *)start + (key->elemsize * kb->totelem));
+
+ /* if point's address is less than the end, then it is somewhere between start and end, so in array */
+ if (end > point) {
+ /* we've found the owner of the point data */
+ return kb;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+static int rna_ShapeKeyPoint_get_index(Key *key, KeyBlock *kb, float *point)
+{
+ /* if we frame the data array and point pointers as char*, then the difference between
+ * them will be in bytes. Thus, dividing through by key->elemsize (number of bytes per point)
+ * gives us the offset of point from start of array.
+ */
+ char *start = (char *)kb->data;
+ char *pt = (char *)point;
+
+ return (int)(pt - start) / key->elemsize;
+}
+
+static char *rna_ShapeKeyPoint_path(PointerRNA *ptr)
+{
+ ID *id = (ID *)ptr->id.data;
+ Key *key = rna_ShapeKey_find_key(ptr->id.data);
+ KeyBlock *kb;
+ float *point = (float *)ptr->data;
+
+ /* if we can get a key block, we can construct a path */
+ kb = rna_ShapeKeyData_find_keyblock(key, point);
+
+ if (kb) {
+ int index = rna_ShapeKeyPoint_get_index(key, kb, point);
+
+ if (GS(id->name) == ID_KE)
+ return BLI_sprintfN("keys[\"%s\"].data[%d]", kb->name, index);
+ else
+ return BLI_sprintfN("shape_keys.keys[\"%s\"].data[%d]", kb->name, index);
+ }
+ else
+ return NULL; // XXX: there's really no way to resolve this...
+}
+
#else
static void rna_def_keydata(BlenderRNA *brna)
@@ -333,6 +446,7 @@ static void rna_def_keydata(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ShapeKeyPoint", NULL);
RNA_def_struct_ui_text(srna, "Shape Key Point", "Point in a shape key");
+ RNA_def_struct_path_func(srna, "rna_ShapeKeyPoint_path");
prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
@@ -342,6 +456,7 @@ static void rna_def_keydata(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ShapeKeyCurvePoint", NULL);
RNA_def_struct_ui_text(srna, "Shape Key Curve Point", "Point in a shape key for curves");
+ RNA_def_struct_path_func(srna, "rna_ShapeKeyPoint_path"); /* there's nothing type specific here, so this is fine for now */
prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
@@ -356,6 +471,7 @@ static void rna_def_keydata(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ShapeKeyBezierPoint", NULL);
RNA_def_struct_ui_text(srna, "Shape Key Bezier Point", "Point in a shape key for bezier curves");
+ RNA_def_struct_path_func(srna, "rna_ShapeKeyPoint_path"); /* there's nothing type specific here, so this is fine for now */
prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
@@ -446,12 +562,14 @@ static void rna_def_keyblock(BlenderRNA *brna)
prop= RNA_def_property(srna, "slider_min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "slidermin");
RNA_def_property_range(prop, -10.0f, 10.0f);
+ RNA_def_property_float_funcs(prop, NULL, "rna_ShapeKey_slider_min_set", "rna_ShapeKey_slider_min_range");
RNA_def_property_ui_text(prop, "Slider Min", "Minimum for slider");
prop= RNA_def_property(srna, "slider_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "slidermax");
RNA_def_property_range(prop, -10.0f, 10.0f);
RNA_def_property_float_default(prop, 1.0f);
+ RNA_def_property_float_funcs(prop, NULL, "rna_ShapeKey_slider_max_set", "rna_ShapeKey_slider_max_range");
RNA_def_property_ui_text(prop, "Slider Max", "Maximum for slider");
prop= RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_lamp.c b/source/blender/makesrna/intern/rna_lamp.c
index fb7bb4a9194..f2dc0decf29 100644
--- a/source/blender/makesrna/intern/rna_lamp.c
+++ b/source/blender/makesrna/intern/rna_lamp.c
@@ -105,7 +105,7 @@ static void rna_Lamp_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Lamp *la= ptr->id.data;
- DAG_id_flush_update(&la->id, 0);
+ DAG_id_tag_update(&la->id, 0);
if(scene->gm.matmode == GAME_MAT_GLSL)
WM_main_add_notifier(NC_LAMP|ND_LIGHTING_DRAW, la);
else
@@ -116,7 +116,7 @@ static void rna_Lamp_draw_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Lamp *la= ptr->id.data;
- DAG_id_flush_update(&la->id, 0);
+ DAG_id_tag_update(&la->id, 0);
WM_main_add_notifier(NC_LAMP|ND_LIGHTING_DRAW, la);
}
@@ -124,7 +124,7 @@ static void rna_Lamp_sky_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Lamp *la= ptr->id.data;
- DAG_id_flush_update(&la->id, 0);
+ DAG_id_tag_update(&la->id, 0);
WM_main_add_notifier(NC_LAMP|ND_SKY, la);
}
@@ -144,6 +144,14 @@ static void rna_Lamp_spot_size_set(PointerRNA *ptr, float value)
#else
+EnumPropertyItem lamp_type_items[] = {
+ {LA_LOCAL, "POINT", 0, "Point", "Omnidirectional point light source"},
+ {LA_SUN, "SUN", 0, "Sun", "Constant direction parallel ray light source"},
+ {LA_SPOT, "SPOT", 0, "Spot", "Directional cone light source"},
+ {LA_HEMI, "HEMI", 0, "Hemi", "180 degree constant light source"},
+ {LA_AREA, "AREA", 0, "Area", "Directional area light source"},
+ {0, NULL, 0, NULL, NULL}};
+
static void rna_def_lamp_mtex(BlenderRNA *brna)
{
StructRNA *srna;
@@ -326,21 +334,13 @@ static void rna_def_lamp(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- static EnumPropertyItem prop_type_items[] = {
- {LA_LOCAL, "POINT", 0, "Point", "Omnidirectional point light source"},
- {LA_SUN, "SUN", 0, "Sun", "Constant direction parallel ray light source"},
- {LA_SPOT, "SPOT", 0, "Spot", "Directional cone light source"},
- {LA_HEMI, "HEMI", 0, "Hemi", "180 degree constant light source"},
- {LA_AREA, "AREA", 0, "Area", "Directional area light source"},
- {0, NULL, 0, NULL, NULL}};
-
srna= RNA_def_struct(brna, "Lamp", "ID");
RNA_def_struct_refine_func(srna, "rna_Lamp_refine");
RNA_def_struct_ui_text(srna, "Lamp", "Lamp datablock for lighting a scene");
RNA_def_struct_ui_icon(srna, ICON_LAMP_DATA);
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_items(prop, prop_type_items);
+ RNA_def_property_enum_items(prop, lamp_type_items);
RNA_def_property_ui_text(prop, "Type", "Type of Lamp");
RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
diff --git a/source/blender/makesrna/intern/rna_lattice.c b/source/blender/makesrna/intern/rna_lattice.c
index f27a1ef86c0..de09d9605cd 100644
--- a/source/blender/makesrna/intern/rna_lattice.c
+++ b/source/blender/makesrna/intern/rna_lattice.c
@@ -91,7 +91,7 @@ static void rna_Lattice_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
{
ID *id= ptr->id.data;
- DAG_id_flush_update(id, OB_RECALC_DATA);
+ DAG_id_tag_update(id, 0);
WM_main_add_notifier(NC_GEOM|ND_DATA, id);
}
@@ -180,6 +180,32 @@ static void rna_Lattice_vg_name_set(PointerRNA *ptr, const char *value)
strcpy(lt->editlatt->latt->vgroup, value);
}
+/* annoying, but is a consequence of RNA structures... */
+static char *rna_LatticePoint_path(PointerRNA *ptr)
+{
+ Lattice *lt= (Lattice*)ptr->id.data;
+ void *point= ptr->data;
+ BPoint *points = NULL;
+
+ if (lt->editlatt && lt->editlatt->latt->def)
+ points = lt->editlatt->latt->def;
+ else
+ points = lt->def;
+
+ if (points && point) {
+ int tot= lt->pntsu*lt->pntsv*lt->pntsw;
+
+ /* only return index if in range */
+ if ((point >= (void *)points) && (point < (void *)(points + tot))) {
+ int pt_index = (int)((BPoint *)point - points);
+
+ return BLI_sprintfN("points[%d]", pt_index);
+ }
+ }
+
+ return BLI_strdup("");
+}
+
#else
@@ -191,6 +217,7 @@ static void rna_def_latticepoint(BlenderRNA *brna)
srna= RNA_def_struct(brna, "LatticePoint", NULL);
RNA_def_struct_sdna(srna, "BPoint");
RNA_def_struct_ui_text(srna, "LatticePoint", "Point in the lattice grid");
+ RNA_def_struct_path_func(srna, "rna_LatticePoint_path");
prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
@@ -287,6 +314,9 @@ static void rna_def_lattice(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "LatticePoint");
RNA_def_property_collection_funcs(prop, "rna_Lattice_points_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", 0, 0, 0);
RNA_def_property_ui_text(prop, "Points", "Points of the lattice");
+
+ /* pointers */
+ rna_def_animdata_common(srna);
}
void RNA_def_lattice(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_main.c b/source/blender/makesrna/intern/rna_main.c
index 99758b8f0fe..e626abd85c7 100644
--- a/source/blender/makesrna/intern/rna_main.c
+++ b/source/blender/makesrna/intern/rna_main.c
@@ -36,19 +36,6 @@
#include "BKE_global.h"
/* all the list begin functions are added manually here, Main is not in SDNA */
-static int rna_Main_debug_get(PointerRNA *ptr)
-{
- return G.f & G_DEBUG;
-}
-
-
-static void rna_Main_debug_set(PointerRNA *ptr, const int value)
-{
- if (value)
- G.f |= G_DEBUG;
- else
- G.f &= ~G_DEBUG;
-}
static int rna_Main_is_dirty_get(PointerRNA *ptr)
{
@@ -317,11 +304,6 @@ void RNA_def_main(BlenderRNA *brna)
RNA_def_property_boolean_funcs(prop, "rna_Main_is_dirty_get", NULL);
RNA_def_property_ui_text(prop, "File is Saved", "Has the current session been saved to disk as a .blend file");
- prop= RNA_def_property(srna, "debug", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_funcs(prop, "rna_Main_debug_get", "rna_Main_debug_set");
- RNA_def_property_ui_text(prop, "Debug", "Print debugging information in console");
-
-
for(i=0; lists[i].name; i++)
{
prop= RNA_def_property(srna, lists[i].identifier, PROP_COLLECTION, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index b244d8ee5d3..c13bfaca8bb 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -79,15 +79,15 @@
#include "ED_screen.h"
-Tex *rna_Main_add_texture(Main *bmain, char *name)
+Tex *rna_Main_add_texture(Main *bmain, const char *name)
{
return add_texture(name);
}
-Camera *rna_Main_cameras_new(Main *bmain, char* name)
+Camera *rna_Main_cameras_new(Main *bmain, const char *name)
{
ID *id= add_camera(name);
- id->us--;
+ id_us_min(id);
return (Camera *)id;
}
void rna_Main_cameras_remove(Main *bmain, ReportList *reports, struct Camera *camera)
@@ -100,7 +100,7 @@ void rna_Main_cameras_remove(Main *bmain, ReportList *reports, struct Camera *ca
/* XXX python now has invalid pointer? */
}
-Scene *rna_Main_scenes_new(Main *bmain, char* name)
+Scene *rna_Main_scenes_new(Main *bmain, const char *name)
{
return add_scene(name);
}
@@ -118,12 +118,13 @@ void rna_Main_scenes_remove(Main *bmain, bContext *C, ReportList *reports, struc
return;
}
- ED_screen_set_scene(C, newscene);
+ if(CTX_wm_screen(C)->scene == scene)
+ ED_screen_set_scene(C, newscene);
unlink_scene(bmain, scene, newscene);
}
-Object *rna_Main_objects_new(Main *bmain, ReportList *reports, char* name, ID *data)
+Object *rna_Main_objects_new(Main *bmain, ReportList *reports, const char *name, ID *data)
{
Object *ob;
int type= OB_EMPTY;
@@ -161,11 +162,11 @@ Object *rna_Main_objects_new(Main *bmain, ReportList *reports, char* name, ID *d
}
}
- data->us++;
+ id_us_plus(data);
}
ob= add_only_object(type, name);
- ob->id.us--;
+ id_us_min(&ob->id);
ob->data= data;
test_object_materials(ob->data);
@@ -176,7 +177,7 @@ Object *rna_Main_objects_new(Main *bmain, ReportList *reports, char* name, ID *d
void rna_Main_objects_remove(Main *bmain, ReportList *reports, struct Object *object)
{
if(ID_REAL_USERS(object) <= 0) {
- unlink_object(NULL, object); /* needed or ID pointers to this are not cleared */
+ unlink_object(object); /* needed or ID pointers to this are not cleared */
free_libblock(&bmain->object, object);
}
else {
@@ -184,10 +185,10 @@ void rna_Main_objects_remove(Main *bmain, ReportList *reports, struct Object *ob
}
}
-struct Material *rna_Main_materials_new(Main *bmain, char* name)
+struct Material *rna_Main_materials_new(Main *bmain, const char *name)
{
ID *id= (ID *)add_material(name);
- id->us--;
+ id_us_min(id);
return (Material *)id;
}
void rna_Main_materials_remove(Main *bmain, ReportList *reports, struct Material *material)
@@ -200,11 +201,13 @@ void rna_Main_materials_remove(Main *bmain, ReportList *reports, struct Material
/* XXX python now has invalid pointer? */
}
-// XXX, commended for now, need to see how this can be used with node groups.
-struct bNodeTree *rna_Main_nodetree_new(Main *bmain, int type)
+struct bNodeTree *rna_Main_nodetree_new(Main *bmain, const char *name, int type)
{
- bNodeTree *tree = ntreeAddTree(type);
- tree->id.us--;
+ bNodeTree *tree = ntreeAddTree(name, type, TRUE);
+
+ ntreeMakeOwnType(tree);
+
+ id_us_min(&tree->id);
return tree;
}
void rna_Main_nodetree_remove(Main *bmain, ReportList *reports, struct bNodeTree *tree)
@@ -217,10 +220,10 @@ void rna_Main_nodetree_remove(Main *bmain, ReportList *reports, struct bNodeTree
/* XXX python now has invalid pointer? */
}
-Mesh *rna_Main_meshes_new(Main *bmain, char* name)
+Mesh *rna_Main_meshes_new(Main *bmain, const char *name)
{
Mesh *me= add_mesh(name);
- me->id.us--;
+ id_us_min(&me->id);
return me;
}
void rna_Main_meshes_remove(Main *bmain, ReportList *reports, Mesh *mesh)
@@ -233,10 +236,11 @@ void rna_Main_meshes_remove(Main *bmain, ReportList *reports, Mesh *mesh)
/* XXX python now has invalid pointer? */
}
-Lamp *rna_Main_lamps_new(Main *bmain, char* name)
+Lamp *rna_Main_lamps_new(Main *bmain, const char *name, int type)
{
Lamp *lamp= add_lamp(name);
- lamp->id.us--;
+ lamp->type= type;
+ id_us_min(&lamp->id);
return lamp;
}
void rna_Main_lamps_remove(Main *bmain, ReportList *reports, Lamp *lamp)
@@ -249,19 +253,19 @@ void rna_Main_lamps_remove(Main *bmain, ReportList *reports, Lamp *lamp)
/* XXX python now has invalid pointer? */
}
-Image *rna_Main_images_new(Main *bmain, char* name, int width, int height, int alpha, int float_buffer)
+Image *rna_Main_images_new(Main *bmain, const char *name, int width, int height, int alpha, int float_buffer)
{
float color[4]= {0.0, 0.0, 0.0, 1.0};
Image *image= BKE_add_image_size(width, height, name, alpha ? 32:24, float_buffer, 0, color);
- image->id.us--;
+ id_us_min(&image->id);
return image;
}
-Image *rna_Main_images_load(Main *bmain, ReportList *reports, char *filepath)
+Image *rna_Main_images_load(Main *bmain, ReportList *reports, const char *filepath)
{
Image *ima;
errno= 0;
- ima= BKE_add_image_file(filepath, 0);
+ ima= BKE_add_image_file(filepath);
if(!ima)
BKE_reportf(reports, RPT_ERROR, "Can't read: \"%s\", %s.", filepath, errno ? strerror(errno) : "Unsupported image format");
@@ -278,10 +282,10 @@ void rna_Main_images_remove(Main *bmain, ReportList *reports, Image *image)
/* XXX python now has invalid pointer? */
}
-Lattice *rna_Main_lattices_new(Main *bmain, char* name)
+Lattice *rna_Main_lattices_new(Main *bmain, const char *name)
{
Lattice *lt= add_lattice(name);
- lt->id.us--;
+ id_us_min(&lt->id);
return lt;
}
void rna_Main_lattices_remove(Main *bmain, ReportList *reports, struct Lattice *lt)
@@ -292,10 +296,10 @@ void rna_Main_lattices_remove(Main *bmain, ReportList *reports, struct Lattice *
BKE_reportf(reports, RPT_ERROR, "Lattice \"%s\" must have zero users to be removed, found %d.", lt->id.name+2, ID_REAL_USERS(lt));
}
-Curve *rna_Main_curves_new(Main *bmain, char* name, int type)
+Curve *rna_Main_curves_new(Main *bmain, const char *name, int type)
{
Curve *cu= add_curve(name, type);
- cu->id.us--;
+ id_us_min(&cu->id);
return cu;
}
void rna_Main_curves_remove(Main *bmain, ReportList *reports, struct Curve *cu)
@@ -306,10 +310,10 @@ void rna_Main_curves_remove(Main *bmain, ReportList *reports, struct Curve *cu)
BKE_reportf(reports, RPT_ERROR, "Curve \"%s\" must have zero users to be removed, found %d.", cu->id.name+2, ID_REAL_USERS(cu));
}
-MetaBall *rna_Main_metaballs_new(Main *bmain, char* name)
+MetaBall *rna_Main_metaballs_new(Main *bmain, const char *name)
{
MetaBall *mb= add_mball(name);
- mb->id.us--;
+ id_us_min(&mb->id);
return mb;
}
void rna_Main_metaballs_remove(Main *bmain, ReportList *reports, struct MetaBall *mb)
@@ -320,7 +324,7 @@ void rna_Main_metaballs_remove(Main *bmain, ReportList *reports, struct MetaBall
BKE_reportf(reports, RPT_ERROR, "MetaBall \"%s\" must have zero users to be removed, found %d.", mb->id.name+2, ID_REAL_USERS(mb));
}
-VFont *rna_Main_fonts_load(Main *bmain, ReportList *reports, char *filepath)
+VFont *rna_Main_fonts_load(Main *bmain, ReportList *reports, const char *filepath)
{
VFont *font;
@@ -343,11 +347,11 @@ void rna_Main_fonts_remove(Main *bmain, ReportList *reports, VFont *vfont)
/* XXX python now has invalid pointer? */
}
-Tex *rna_Main_textures_new(Main *bmain, char* name, int type)
+Tex *rna_Main_textures_new(Main *bmain, const char *name, int type)
{
Tex *tex= add_texture(name);
tex_set_type(tex, type);
- tex->id.us--;
+ id_us_min(&tex->id);
return tex;
}
void rna_Main_textures_remove(Main *bmain, ReportList *reports, struct Tex *tex)
@@ -358,10 +362,10 @@ void rna_Main_textures_remove(Main *bmain, ReportList *reports, struct Tex *tex)
BKE_reportf(reports, RPT_ERROR, "Texture \"%s\" must have zero users to be removed, found %d.", tex->id.name+2, ID_REAL_USERS(tex));
}
-Brush *rna_Main_brushes_new(Main *bmain, char* name)
+Brush *rna_Main_brushes_new(Main *bmain, const char *name)
{
Brush *brush = add_brush(name);
- brush->id.us--;
+ id_us_min(&brush->id);
return brush;
}
void rna_Main_brushes_remove(Main *bmain, ReportList *reports, struct Brush *brush)
@@ -372,10 +376,10 @@ void rna_Main_brushes_remove(Main *bmain, ReportList *reports, struct Brush *bru
BKE_reportf(reports, RPT_ERROR, "Brush \"%s\" must have zero users to be removed, found %d.", brush->id.name+2, ID_REAL_USERS(brush));
}
-World *rna_Main_worlds_new(Main *bmain, char* name)
+World *rna_Main_worlds_new(Main *bmain, const char *name)
{
World *world = add_world(name);
- world->id.us--;
+ id_us_min(&world->id);
return world;
}
void rna_Main_worlds_remove(Main *bmain, ReportList *reports, struct World *world)
@@ -386,7 +390,7 @@ void rna_Main_worlds_remove(Main *bmain, ReportList *reports, struct World *worl
BKE_reportf(reports, RPT_ERROR, "World \"%s\" must have zero users to be removed, found %d.", world->id.name+2, ID_REAL_USERS(world));
}
-Group *rna_Main_groups_new(Main *bmain, char* name)
+Group *rna_Main_groups_new(Main *bmain, const char *name)
{
return add_group(name);
}
@@ -397,7 +401,7 @@ void rna_Main_groups_remove(Main *bmain, ReportList *reports, Group *group)
/* XXX python now has invalid pointer? */
}
-Text *rna_Main_texts_new(Main *bmain, char* name)
+Text *rna_Main_texts_new(Main *bmain, const char *name)
{
return add_empty_text(name);
}
@@ -408,7 +412,7 @@ void rna_Main_texts_remove(Main *bmain, ReportList *reports, Text *text)
/* XXX python now has invalid pointer? */
}
-Text *rna_Main_texts_load(Main *bmain, ReportList *reports, char* filepath)
+Text *rna_Main_texts_load(Main *bmain, ReportList *reports, const char *filepath)
{
Text *txt;
@@ -421,10 +425,10 @@ Text *rna_Main_texts_load(Main *bmain, ReportList *reports, char* filepath)
return txt;
}
-bArmature *rna_Main_armatures_new(Main *bmain, char* name)
+bArmature *rna_Main_armatures_new(Main *bmain, const char *name)
{
bArmature *arm= add_armature(name);
- arm->id.us--;
+ id_us_min(&arm->id);
return arm;
}
void rna_Main_armatures_remove(Main *bmain, ReportList *reports, bArmature *arm)
@@ -437,10 +441,10 @@ void rna_Main_armatures_remove(Main *bmain, ReportList *reports, bArmature *arm)
/* XXX python now has invalid pointer? */
}
-bAction *rna_Main_actions_new(Main *bmain, char* name)
+bAction *rna_Main_actions_new(Main *bmain, const char *name)
{
bAction *act= add_empty_action(name);
- act->id.us--;
+ id_us_min(&act->id);
act->id.flag &= ~LIB_FAKEUSER;
return act;
}
@@ -454,10 +458,10 @@ void rna_Main_actions_remove(Main *bmain, ReportList *reports, bAction *act)
/* XXX python now has invalid pointer? */
}
-ParticleSettings *rna_Main_particles_new(Main *bmain, char* name)
+ParticleSettings *rna_Main_particles_new(Main *bmain, const char *name)
{
ParticleSettings *part = psys_new_settings(name, bmain);
- part->id.us--;
+ id_us_min(&part->id);
return part;
}
void rna_Main_particles_remove(Main *bmain, ReportList *reports, ParticleSettings *part)
@@ -470,6 +474,35 @@ void rna_Main_particles_remove(Main *bmain, ReportList *reports, ParticleSetting
/* XXX python now has invalid pointer? */
}
+/* tag functions, all the same */
+void rna_Main_cameras_tag(Main *bmain, int value) { tag_main_lb(&bmain->camera, value); }
+void rna_Main_scenes_tag(Main *bmain, int value) { tag_main_lb(&bmain->scene, value); }
+void rna_Main_objects_tag(Main *bmain, int value) { tag_main_lb(&bmain->object, value); }
+void rna_Main_materials_tag(Main *bmain, int value) { tag_main_lb(&bmain->mat, value); }
+void rna_Main_node_groups_tag(Main *bmain, int value) { tag_main_lb(&bmain->nodetree, value); }
+void rna_Main_meshes_tag(Main *bmain, int value) { tag_main_lb(&bmain->mesh, value); }
+void rna_Main_lamps_tag(Main *bmain, int value) { tag_main_lb(&bmain->lamp, value); }
+void rna_Main_libraries_tag(Main *bmain, int value) { tag_main_lb(&bmain->library, value); }
+void rna_Main_screens_tag(Main *bmain, int value) { tag_main_lb(&bmain->screen, value); }
+void rna_Main_window_managers_tag(Main *bmain, int value) { tag_main_lb(&bmain->wm, value); }
+void rna_Main_images_tag(Main *bmain, int value) { tag_main_lb(&bmain->image, value); }
+void rna_Main_lattices_tag(Main *bmain, int value) { tag_main_lb(&bmain->latt, value); }
+void rna_Main_curves_tag(Main *bmain, int value) { tag_main_lb(&bmain->curve, value); }
+void rna_Main_metaballs_tag(Main *bmain, int value) { tag_main_lb(&bmain->mball, value); }
+void rna_Main_fonts_tag(Main *bmain, int value) { tag_main_lb(&bmain->vfont, value); }
+void rna_Main_textures_tag(Main *bmain, int value) { tag_main_lb(&bmain->tex, value); }
+void rna_Main_brushes_tag(Main *bmain, int value) { tag_main_lb(&bmain->brush, value); }
+void rna_Main_worlds_tag(Main *bmain, int value) { tag_main_lb(&bmain->world, value); }
+void rna_Main_groups_tag(Main *bmain, int value) { tag_main_lb(&bmain->group, value); }
+void rna_Main_shape_keys_tag(Main *bmain, int value) { tag_main_lb(&bmain->key, value); }
+void rna_Main_scripts_tag(Main *bmain, int value) { tag_main_lb(&bmain->script, value); }
+void rna_Main_texts_tag(Main *bmain, int value) { tag_main_lb(&bmain->text, value); }
+void rna_Main_sounds_tag(Main *bmain, int value) { tag_main_lb(&bmain->sound, value); }
+void rna_Main_armatures_tag(Main *bmain, int value) { tag_main_lb(&bmain->armature, value); }
+void rna_Main_actions_tag(Main *bmain, int value) { tag_main_lb(&bmain->action, value); }
+void rna_Main_particles_tag(Main *bmain, int value) { tag_main_lb(&bmain->particle, value); }
+void rna_Main_gpencil_tag(Main *bmain, int value) { tag_main_lb(&bmain->gpencil, value); }
+
#else
void RNA_api_main(StructRNA *srna)
@@ -483,7 +516,7 @@ void RNA_api_main(StructRNA *srna)
/*
func= RNA_def_function(srna, "add_image", "rna_Main_add_image");
RNA_def_function_ui_description(func, "Add a new image.");
- parm= RNA_def_string(func, "filepath", "", 0, "", "File path to load image from.");
+ parm= RNA_def_string_file_path(func, "filepath", "", 0, "", "File path to load image from.");
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_pointer(func, "image", "Image", "", "New image.");
RNA_def_function_return(func, parm);
@@ -514,6 +547,10 @@ void RNA_def_main_cameras(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a camera from the current blendfile.");
parm= RNA_def_pointer(func, "camera", "Camera", "", "Camera to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_cameras_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_scenes(BlenderRNA *brna, PropertyRNA *cprop)
@@ -568,6 +605,10 @@ void RNA_def_main_objects(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
parm= RNA_def_pointer(func, "object", "Object", "", "Object to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_objects_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop)
@@ -593,27 +634,32 @@ void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a material from the current blendfile.");
parm= RNA_def_pointer(func, "material", "Material", "", "Material to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_materials_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_node_groups(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
-// FunctionRNA *func;
-// PropertyRNA *parm;
+ FunctionRNA *func;
+ PropertyRNA *parm;
-/* static EnumPropertyItem node_nodetree_items[] = {
+ static EnumPropertyItem node_nodetree_items[] = {
{0, "SHADER", 0, "Shader", ""},
{1, "COMPOSITE", 0, "Composite", ""},
{2, "TEXTURE", 0, "Texture", ""},
- {0, NULL, 0, NULL, NULL}}; */
+ {0, NULL, 0, NULL, NULL}};
RNA_def_property_srna(cprop, "MainNodeTrees");
srna= RNA_def_struct(brna, "MainNodeTrees", NULL);
RNA_def_struct_ui_text(srna, "Main Node Trees", "Collection of node trees");
-#if 0 // need to see some examples of using these functions before enabling.
func= RNA_def_function(srna, "new", "rna_Main_nodetree_new");
RNA_def_function_ui_description(func, "Add a new node tree to the main database");
- parm= RNA_def_enum(func, "type", node_nodetree_items, 0, "Type", "The type of curve object to add");
+ parm= RNA_def_string(func, "name", "NodeGroup", 0, "", "New name for the datablock.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_enum(func, "type", node_nodetree_items, 0, "Type", "The type of node_group to add");
RNA_def_property_flag(parm, PROP_REQUIRED);
/* return type */
parm= RNA_def_pointer(func, "tree", "NodeTree", "", "New node tree datablock.");
@@ -624,7 +670,10 @@ void RNA_def_main_node_groups(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a node tree from the current blendfile.");
parm= RNA_def_pointer(func, "tree", "NodeTree", "", "Node tree to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
-#endif
+
+ func= RNA_def_function(srna, "tag", "rna_Main_node_groups_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -649,6 +698,10 @@ void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a mesh from the current blendfile.");
parm= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_meshes_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_lamps(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -664,6 +717,8 @@ void RNA_def_main_lamps(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Add a new lamp to the main database");
parm= RNA_def_string(func, "name", "Lamp", 0, "", "New name for the datablock.");
RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_enum(func, "type", lamp_type_items, 0, "Type", "The type of texture to add");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
/* return type */
parm= RNA_def_pointer(func, "lamp", "Lamp", "", "New lamp datablock.");
RNA_def_function_return(func, parm);
@@ -673,18 +728,55 @@ void RNA_def_main_lamps(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a lamp from the current blendfile.");
parm= RNA_def_pointer(func, "lamp", "Lamp", "", "Lamp to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_lamps_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
+
void RNA_def_main_libraries(BlenderRNA *brna, PropertyRNA *cprop)
{
+ StructRNA *srna;
+ FunctionRNA *func;
+ PropertyRNA *parm;
+ RNA_def_property_srna(cprop, "MainLibraries");
+ srna= RNA_def_struct(brna, "MainLibraries", NULL);
+ RNA_def_struct_ui_text(srna, "Main Libraries", "Collection of libraries");
+
+ func= RNA_def_function(srna, "tag", "rna_Main_libraries_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
+
void RNA_def_main_screens(BlenderRNA *brna, PropertyRNA *cprop)
{
+ StructRNA *srna;
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "MainScreens");
+ srna= RNA_def_struct(brna, "MainScreens", NULL);
+ RNA_def_struct_ui_text(srna, "Main Screens", "Collection of screens");
+ func= RNA_def_function(srna, "tag", "rna_Main_screens_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
+
void RNA_def_main_window_managers(BlenderRNA *brna, PropertyRNA *cprop)
{
-
+ StructRNA *srna;
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "MainWindowManagers");
+ srna= RNA_def_struct(brna, "MainWindowManagers", NULL);
+ RNA_def_struct_ui_text(srna, "Main Window Managers", "Collection of window managers");
+
+ func= RNA_def_function(srna, "tag", "rna_Main_window_managers_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -701,9 +793,11 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
parm= RNA_def_string(func, "name", "Image", 0, "", "New name for the datablock.");
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_int(func, "width", 1024, 1, INT_MAX, "", "Width of the image.", 0, INT_MAX);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_int(func, "height", 1024, 1, INT_MAX, "", "Height of the image.", 0, INT_MAX);
- parm= RNA_def_boolean(func, "alpha", 0, "Alpha", "Use alpha channel");
- parm= RNA_def_boolean(func, "float_buffer", 0, "Float Buffer", "Create an image with floating point color");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_boolean(func, "alpha", 0, "Alpha", "Use alpha channel");
+ RNA_def_boolean(func, "float_buffer", 0, "Float Buffer", "Create an image with floating point color");
/* return type */
parm= RNA_def_pointer(func, "image", "Image", "", "New image datablock.");
RNA_def_function_return(func, parm);
@@ -711,7 +805,7 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "load", "rna_Main_images_load");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Load a new image into the main database");
- parm= RNA_def_string(func, "filepath", "File Path", 0, "", "path of the file to load.");
+ parm= RNA_def_string_file_path(func, "filepath", "File Path", 0, "", "path of the file to load.");
RNA_def_property_flag(parm, PROP_REQUIRED);
/* return type */
parm= RNA_def_pointer(func, "image", "Image", "", "New image datablock.");
@@ -722,6 +816,10 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove an image from the current blendfile.");
parm= RNA_def_pointer(func, "image", "Image", "", "Image to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_images_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_lattices(BlenderRNA *brna, PropertyRNA *cprop)
@@ -747,6 +845,10 @@ void RNA_def_main_lattices(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a lattice from the current blendfile.");
parm= RNA_def_pointer(func, "lattice", "Lattice", "", "Lattice to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_lattices_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -773,6 +875,10 @@ void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a curve from the current blendfile.");
parm= RNA_def_pointer(func, "curve", "Curve", "", "Curve to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_curves_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_metaballs(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -797,6 +903,10 @@ void RNA_def_main_metaballs(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a metaball from the current blendfile.");
parm= RNA_def_pointer(func, "metaball", "MetaBall", "", "MetaBall to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_metaballs_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -811,7 +921,7 @@ void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "load", "rna_Main_fonts_load");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Load a new font into the main database");
- parm= RNA_def_string(func, "filepath", "File Path", 0, "", "path of the font to load.");
+ parm= RNA_def_string_file_path(func, "filepath", "File Path", 0, "", "path of the font to load.");
RNA_def_property_flag(parm, PROP_REQUIRED);
/* return type */
parm= RNA_def_pointer(func, "vfont", "VectorFont", "", "New font datablock.");
@@ -822,6 +932,10 @@ void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a font from the current blendfile.");
parm= RNA_def_pointer(func, "vfont", "VectorFont", "", "Font to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_fonts_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -848,6 +962,10 @@ void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a texture from the current blendfile.");
parm= RNA_def_pointer(func, "texture", "Texture", "", "Texture to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_textures_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_brushes(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -872,6 +990,10 @@ void RNA_def_main_brushes(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a brush from the current blendfile.");
parm= RNA_def_pointer(func, "brush", "Brush", "", "Brush to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_brushes_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_worlds(BlenderRNA *brna, PropertyRNA *cprop)
@@ -897,6 +1019,10 @@ void RNA_def_main_worlds(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a world from the current blendfile.");
parm= RNA_def_pointer(func, "world", "World", "", "World to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_worlds_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_groups(BlenderRNA *brna, PropertyRNA *cprop)
@@ -922,6 +1048,10 @@ void RNA_def_main_groups(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a group from the current blendfile.");
parm= RNA_def_pointer(func, "group", "Group", "", "Group to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_groups_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -951,16 +1081,34 @@ void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "load", "rna_Main_texts_load");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Add a new text to the main database from a file");
- parm= RNA_def_string(func, "filepath", "Path", FILE_MAXDIR + FILE_MAXFILE, "", "path for the datablock.");
+ parm= RNA_def_string_file_path(func, "filepath", "Path", FILE_MAXDIR + FILE_MAXFILE, "", "path for the datablock.");
RNA_def_property_flag(parm, PROP_REQUIRED);
/* return type */
parm= RNA_def_pointer(func, "text", "Text", "", "New text datablock.");
RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_texts_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
+
void RNA_def_main_sounds(BlenderRNA *brna, PropertyRNA *cprop)
{
+ StructRNA *srna;
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "MainSounds");
+ srna= RNA_def_struct(brna, "MainSounds", NULL);
+ RNA_def_struct_ui_text(srna, "Main Sounds", "Collection of sounds");
+ /* TODO, 'load' */
+
+ func= RNA_def_function(srna, "tag", "rna_Main_sounds_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
+
void RNA_def_main_armatures(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
@@ -984,6 +1132,10 @@ void RNA_def_main_armatures(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a armature from the current blendfile.");
parm= RNA_def_pointer(func, "armature", "Armature", "", "Armature to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_armatures_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_actions(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -1008,6 +1160,10 @@ void RNA_def_main_actions(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a action from the current blendfile.");
parm= RNA_def_pointer(func, "action", "Action", "", "Action to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_actions_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_particles(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -1032,10 +1188,25 @@ void RNA_def_main_particles(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a particle settings instance from the current blendfile.");
parm= RNA_def_pointer(func, "particle", "ParticleSettings", "", "Particle Settings to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_particles_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
+
void RNA_def_main_gpencil(BlenderRNA *brna, PropertyRNA *cprop)
{
+ StructRNA *srna;
+ FunctionRNA *func;
+ PropertyRNA *parm;
+ RNA_def_property_srna(cprop, "MainGreasePencils");
+ srna= RNA_def_struct(brna, "MainGreasePencils", NULL);
+ RNA_def_struct_ui_text(srna, "Main Grease Pencils", "Collection of grease pencils");
+
+ func= RNA_def_function(srna, "tag", "rna_Main_gpencil_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c
index 997690b2395..3d9eaa0b141 100644
--- a/source/blender/makesrna/intern/rna_material.c
+++ b/source/blender/makesrna/intern/rna_material.c
@@ -40,7 +40,7 @@ static EnumPropertyItem prop_texture_coordinates_items[] = {
{TEXCO_OBJECT, "OBJECT", 0, "Object", "Uses linked object's coordinates for texture coordinates"},
{TEXCO_UV, "UV", 0, "UV", "Uses UV coordinates for texture coordinates"},
{TEXCO_ORCO, "ORCO", 0, "Generated", "Uses the original undeformed coordinates of the object"},
-{TEXCO_STRAND, "STRAND", 0, "Strand", "Uses normalized strand texture coordinate (1D)"},
+{TEXCO_STRAND, "STRAND", 0, "Strand / Particle", "Uses normalized strand texture coordinate (1D) or particle age (X) and trail position (Y)"},
{TEXCO_STICKY, "STICKY", 0, "Sticky", "Uses mesh's sticky coordinates for the texture coordinates"},
{TEXCO_WINDOW, "WINDOW", 0, "Window", "Uses screen coordinates as texture coordinates"},
{TEXCO_NORM, "NORMAL", 0, "Normal", "Uses normal vector as texture coordinates"},
@@ -67,7 +67,7 @@ static void rna_Material_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Material *ma= ptr->id.data;
- DAG_id_flush_update(&ma->id, 0);
+ DAG_id_tag_update(&ma->id, 0);
if(scene->gm.matmode == GAME_MAT_GLSL)
WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, ma);
else
@@ -78,7 +78,7 @@ static void rna_Material_draw_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Material *ma= ptr->id.data;
- DAG_id_flush_update(&ma->id, 0);
+ DAG_id_tag_update(&ma->id, 0);
WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, ma);
}
@@ -276,7 +276,7 @@ static EnumPropertyItem *rna_Material_texture_coordinates_itemf(bContext *C, Poi
return item;
}
-MTex *rna_mtex_texture_slots_add(ID *self_id, ReportList *reports)
+MTex *rna_mtex_texture_slots_add(ID *self_id, struct bContext *C, ReportList *reports)
{
MTex *mtex= add_mtex_id(self_id, -1);
if (mtex == NULL) {
@@ -284,10 +284,13 @@ MTex *rna_mtex_texture_slots_add(ID *self_id, ReportList *reports)
return NULL;
}
+ /* for redraw only */
+ WM_event_add_notifier(C, NC_TEXTURE, CTX_data_scene(C));
+
return mtex;
}
-MTex *rna_mtex_texture_slots_create(ID *self_id, ReportList *reports, int index)
+MTex *rna_mtex_texture_slots_create(ID *self_id, struct bContext *C, ReportList *reports, int index)
{
MTex *mtex;
@@ -298,10 +301,13 @@ MTex *rna_mtex_texture_slots_create(ID *self_id, ReportList *reports, int index)
mtex= add_mtex_id(self_id, index);
+ /* for redraw only */
+ WM_event_add_notifier(C, NC_TEXTURE, CTX_data_scene(C));
+
return mtex;
}
-void rna_mtex_texture_slots_clear(ID *self_id, ReportList *reports, int index)
+void rna_mtex_texture_slots_clear(ID *self_id, struct bContext *C, ReportList *reports, int index)
{
MTex **mtex_ar;
short act;
@@ -323,6 +329,9 @@ void rna_mtex_texture_slots_clear(ID *self_id, ReportList *reports, int index)
MEM_freeN(mtex_ar[index]);
mtex_ar[index]= NULL;
}
+
+ /* for redraw only */
+ WM_event_add_notifier(C, NC_TEXTURE, CTX_data_scene(C));
}
#else
@@ -367,6 +376,19 @@ static void rna_def_material_mtex(BlenderRNA *brna)
{MTEX_NSPACE_TANGENT, "TANGENT", 0, "Tangent", ""},
{0, NULL, 0, NULL, NULL}};
+ static EnumPropertyItem prop_bump_method_items[] = {
+ {0, "BUMP_ORIGINAL", 0, "Original", ""},
+ {MTEX_COMPAT_BUMP, "BUMP_COMPATIBLE", 0, "Compatible", ""},
+ {MTEX_3TAP_BUMP, "BUMP_DEFAULT", 0, "Default", ""},
+ {MTEX_5TAP_BUMP, "BUMP_BEST_QUALITY", 0, "Best Quality", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem prop_bump_space_items[] = {
+ {0, "BUMP_VIEWSPACE", 0, "ViewSpace", ""},
+ {MTEX_BUMP_OBJECTSPACE, "BUMP_OBJECTSPACE", 0, "ObjectSpace", ""},
+ {MTEX_BUMP_TEXTURESPACE, "BUMP_TEXTURESPACE", 0, "TextureSpace", ""},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "MaterialTextureSlot", "TextureSlot");
RNA_def_struct_sdna(srna, "MTex");
RNA_def_struct_ui_text(srna, "Material Texture Slot", "Texture slot for textures in a Material datablock");
@@ -496,7 +518,7 @@ static void rna_def_material_mtex(BlenderRNA *brna)
prop= RNA_def_property(srna, "normal_map_space", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "normapspace");
RNA_def_property_enum_items(prop, prop_normal_map_space_items);
- RNA_def_property_ui_text(prop, "Normal Map Space", "");
+ RNA_def_property_ui_text(prop, "Normal Map Space", "Sets space of normal map image");
RNA_def_property_update(prop, 0, "rna_Material_update");
prop= RNA_def_property(srna, "normal_factor", PROP_FLOAT, PROP_NONE);
@@ -668,9 +690,16 @@ static void rna_def_material_mtex(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Enabled", "Enable this material texture slot");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "use_old_bump", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "texflag", MTEX_NEW_BUMP);
- RNA_def_property_ui_text(prop, "Old Bump", "Use old bump mapping (backwards compatibility option)");
+ prop= RNA_def_property(srna, "bump_method", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "texflag");
+ RNA_def_property_enum_items(prop, prop_bump_method_items);
+ RNA_def_property_ui_text(prop, "Bump Method", "Method to use for bump mapping");
+ RNA_def_property_update(prop, 0, "rna_Material_update");
+
+ prop= RNA_def_property(srna, "bump_objectspace", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "texflag");
+ RNA_def_property_enum_items(prop, prop_bump_space_items);
+ RNA_def_property_ui_text(prop, "Bump Space", "Space to apply bump mapping in");
RNA_def_property_update(prop, 0, "rna_Material_update");
}
@@ -695,8 +724,8 @@ static void rna_def_material_colors(StructRNA *srna)
{MA_RAMP_SAT, "SATURATION", 0, "Saturation", ""},
{MA_RAMP_VAL, "VALUE", 0, "Value", ""},
{MA_RAMP_COLOR, "COLOR", 0, "Color", ""},
- {MA_RAMP_SOFT, "SOFT LIGHT", 0, "Soft Light", ""},
- {MA_RAMP_LINEAR, "LINEAR LIGHT", 0, "Linear Light", ""},
+ {MA_RAMP_SOFT, "SOFT_LIGHT", 0, "Soft Light", ""},
+ {MA_RAMP_LINEAR, "LINEAR_LIGHT", 0, "Linear Light", ""},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem prop_ramp_input_items[] = {
@@ -949,7 +978,7 @@ static void rna_def_material_raytra(BlenderRNA *brna)
prop= RNA_def_property(srna, "ior", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ang");
- RNA_def_property_range(prop, 1.0f, 3.0f);
+ RNA_def_property_range(prop, 0.25f, 4.0f);
RNA_def_property_ui_text(prop, "IOR", "Sets angular index of refraction for raytraced refraction");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1063,7 +1092,7 @@ static void rna_def_material_volume(BlenderRNA *brna)
prop= RNA_def_property(srna, "cache_resolution", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "precache_resolution");
- RNA_def_property_range(prop, 0, 1024);
+ RNA_def_property_range(prop, 1, 1024);
RNA_def_property_ui_text(prop, "Resolution", "Resolution of the voxel grid, low resolutions are faster, high resolutions use more memory");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1121,7 +1150,7 @@ static void rna_def_material_volume(BlenderRNA *brna)
prop= RNA_def_property(srna, "reflection_color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "reflection_col");
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Reflection Color", "Colour of light scattered out of the volume (does not affect transmission)");
+ RNA_def_property_ui_text(prop, "Reflection Color", "Color of light scattered out of the volume (does not affect transmission)");
RNA_def_property_update(prop, 0, "rna_Material_draw_update");
prop= RNA_def_property(srna, "reflection", PROP_FLOAT, PROP_NONE);
@@ -1372,7 +1401,7 @@ static void rna_def_material_specularity(StructRNA *srna)
RNA_def_property_float_sdna(prop, NULL, "spec");
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_text(prop, "Specular Intensity", "");
- RNA_def_property_update(prop, 0, "rna_Material_update");
+ RNA_def_property_update(prop, 0, "rna_Material_draw_update");
/* NOTE: "har", "param", etc are used for multiple purposes depending on
* settings. This should be fixed in DNA once, for RNA we just expose them
@@ -1383,7 +1412,7 @@ static void rna_def_material_specularity(StructRNA *srna)
RNA_def_property_int_sdna(prop, NULL, "har");
RNA_def_property_range(prop, 1, 511);
RNA_def_property_ui_text(prop, "Specular Hardness", "");
- RNA_def_property_update(prop, 0, "rna_Material_update");
+ RNA_def_property_update(prop, 0, "rna_Material_draw_update");
prop= RNA_def_property(srna, "specular_ior", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "refrac");
@@ -1403,7 +1432,7 @@ static void rna_def_material_specularity(StructRNA *srna)
RNA_def_property_ui_text(prop, "Specular Toon Smooth", "Smoothness of specular toon area");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "specular_slope", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "specular_slope", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "rms");
RNA_def_property_range(prop, 0, 0.4);
RNA_def_property_ui_text(prop, "Specular Slope", "The standard deviation of surface slope");
@@ -1425,8 +1454,10 @@ static void rna_def_material_strand(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Tangent Shading", "Uses direction of strands as normal for tangent-shading");
RNA_def_property_update(prop, 0, "rna_Material_update");
+ /* this flag is only set when rendering, not to be edited manually */
prop= RNA_def_property(srna, "use_surface_diffuse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_STR_SURFDIFF);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Surface Diffuse", "Make diffuse shading more similar to shading the surface");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1584,7 +1615,7 @@ void RNA_def_material(BlenderRNA *brna)
RNA_def_property_range(prop, 0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 2.0f, 1, 2);
RNA_def_property_ui_text(prop, "Emit", "Amount of light to emit");
- RNA_def_property_update(prop, 0, "rna_Material_update");
+ RNA_def_property_update(prop, 0, "rna_Material_draw_update");
prop= RNA_def_property(srna, "translucency", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_range(prop, 0, 1);
@@ -1599,7 +1630,7 @@ void RNA_def_material(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_object_color", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shade_flag", MA_OBCOLOR);
RNA_def_property_ui_text(prop, "Object Color", "Modulate the result with a per-object color");
- RNA_def_property_update(prop, 0, "rna_Material_update");
+ RNA_def_property_update(prop, 0, "rna_Material_draw_update");
prop= RNA_def_property(srna, "shadow_ray_bias", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "sbias");
@@ -1644,7 +1675,7 @@ void RNA_def_material(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_shadeless", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_SHLESS);
RNA_def_property_ui_text(prop, "Shadeless", "Makes this material insensitive to light or shadow");
- RNA_def_property_update(prop, 0, "rna_Material_update");
+ RNA_def_property_update(prop, 0, "rna_Material_draw_update");
prop= RNA_def_property(srna, "use_vertex_color_light", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_VERTEXCOL);
@@ -1817,7 +1848,6 @@ void RNA_def_material(BlenderRNA *brna)
}
-/* curve.splines */
static void rna_def_texture_slots(BlenderRNA *brna, PropertyRNA *cprop, const char *structname, const char *structname_slots)
{
StructRNA *srna;
@@ -1832,22 +1862,19 @@ static void rna_def_texture_slots(BlenderRNA *brna, PropertyRNA *cprop, const ch
/* functions */
func= RNA_def_function(srna, "add", "rna_mtex_texture_slots_add");
- RNA_def_function_ui_description(func, "Add a number of points to this spline.");
- RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_NO_SELF|FUNC_USE_REPORTS);
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_NO_SELF|FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
parm= RNA_def_pointer(func, "mtex", structname, "", "The newly initialized mtex.");
RNA_def_function_return(func, parm);
func= RNA_def_function(srna, "create", "rna_mtex_texture_slots_create");
- RNA_def_function_ui_description(func, "Add a number of points to this spline.");
- RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_NO_SELF|FUNC_USE_REPORTS);
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_NO_SELF|FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
parm= RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "Slot index to initialize.", 0, INT_MAX);
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_pointer(func, "mtex", structname, "", "The newly initialized mtex.");
RNA_def_function_return(func, parm);
func= RNA_def_function(srna, "clear", "rna_mtex_texture_slots_clear");
- RNA_def_function_ui_description(func, "Add a number of points to this spline.");
- RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_NO_SELF|FUNC_USE_REPORTS);
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_NO_SELF|FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
parm= RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "Slot index to clar.", 0, INT_MAX);
RNA_def_property_flag(parm, PROP_REQUIRED);
}
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index db5a2062359..6760000c702 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -46,7 +46,7 @@
#include "BKE_depsgraph.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
-#include "BKE_utildefines.h"
+
#include "ED_mesh.h" /* XXX Bad level call */
@@ -59,7 +59,7 @@ static void rna_Mesh_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
/* cheating way for importers to avoid slow updates */
if(id->us > 0) {
- DAG_id_flush_update(id, OB_RECALC_DATA);
+ DAG_id_tag_update(id, 0);
WM_main_add_notifier(NC_GEOM|ND_DATA, id);
}
}
@@ -229,6 +229,15 @@ static void rna_MeshColor_color4_set(PointerRNA *ptr, const float *values)
(&mcol[3].r)[0]= (char)(CLAMPIS(values[2]*255.0f, 0, 255));
}
+static void rna_Mesh_texspace_set(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Mesh *me= (Mesh*)ptr->data;
+
+ if (me->texflag & AUTOSPACE)
+ tex_space_mesh(me);
+}
+
+
static int rna_Mesh_texspace_editable(PointerRNA *ptr)
{
Mesh *me= (Mesh*)ptr->data;
@@ -952,27 +961,46 @@ static char *rna_VertexGroupElement_path(PointerRNA *ptr)
MDeformVert *dvert;
int a, b;
- for(a=0, dvert=me->dvert; a<me->totvert; a++, dvert++)
- for(b=0; b<dvert->totweight; b++)
+ /* sanity check: make sure that mesh pointer is valid */
+ if (me == NULL)
+ return NULL;
+ else if (GS(me->id.name) != ID_ME) {
+ /* if object pointer, try to resolve the object's data to mesh pointer */
+ if (GS(me->id.name) == ID_OB) {
+ Object *ob = (Object *)me;
+
+ if (ob->type == OB_MESH)
+ me = (Mesh *)ob->data;
+ else
+ return NULL; /* nothing can be done */
+ }
+ else
+ return NULL; /* nothing can be done */
+ }
+
+ for(a=0, dvert=me->dvert; a<me->totvert; a++, dvert++) {
+ for(b=0; b<dvert->totweight; b++) {
if(dw == &dvert->dw[b])
- return BLI_sprintfN("verts[%d].groups[%d]", a, b);
+ return BLI_sprintfN("vertices[%d].groups[%d]", a, b);
+ }
+ }
return NULL;
}
static char *rna_MeshFace_path(PointerRNA *ptr)
{
- return BLI_sprintfN("faces[%d]", (MFace*)ptr->data - ((Mesh*)ptr->id.data)->mface);
+ return BLI_sprintfN("faces[%d]", (int)((MFace*)ptr->data - ((Mesh*)ptr->id.data)->mface));
}
static char *rna_MeshEdge_path(PointerRNA *ptr)
{
- return BLI_sprintfN("edges[%d]", (MEdge*)ptr->data - ((Mesh*)ptr->id.data)->medge);
+ return BLI_sprintfN("edges[%d]", (int)((MEdge*)ptr->data - ((Mesh*)ptr->id.data)->medge));
}
static char *rna_MeshVertex_path(PointerRNA *ptr)
{
- return BLI_sprintfN("verts[%d]", (MVert*)ptr->data - ((Mesh*)ptr->id.data)->mvert);
+ return BLI_sprintfN("vertices[%d]", (int)((MVert*)ptr->data - ((Mesh*)ptr->id.data)->mvert));
}
static char *rna_MeshTextureFaceLayer_path(PointerRNA *ptr)
@@ -1015,7 +1043,7 @@ static char *rna_MeshColor_path(PointerRNA *ptr)
static char *rna_MeshSticky_path(PointerRNA *ptr)
{
- return BLI_sprintfN("sticky[%d]", (MSticky*)ptr->data - ((Mesh*)ptr->id.data)->msticky);
+ return BLI_sprintfN("sticky[%d]", (int)((MSticky*)ptr->data - ((Mesh*)ptr->id.data)->msticky));
}
static char *rna_MeshIntPropertyLayer_path(PointerRNA *ptr)
@@ -1064,7 +1092,7 @@ static int rna_Mesh_tot_face_get(PointerRNA *ptr)
return me->edit_mesh ? me->edit_mesh->totfacesel : 0;
}
-static CustomDataLayer *rna_Mesh_vertex_color_new(struct Mesh *me, struct bContext *C, char *name)
+static CustomDataLayer *rna_Mesh_vertex_color_new(struct Mesh *me, struct bContext *C, const char *name)
{
CustomData *fdata;
CustomDataLayer *cdl= NULL;
@@ -1078,13 +1106,13 @@ static CustomDataLayer *rna_Mesh_vertex_color_new(struct Mesh *me, struct bConte
return cdl;
}
-static CustomDataLayer *rna_Mesh_uv_texture_new(struct Mesh *me, struct bContext *C, char *name)
+static CustomDataLayer *rna_Mesh_uv_texture_new(struct Mesh *me, struct bContext *C, const char *name)
{
CustomData *fdata;
CustomDataLayer *cdl= NULL;
int index;
- if(ED_mesh_uv_texture_add(C, NULL, NULL, me, name, FALSE)) {
+ if(ED_mesh_uv_texture_add(C, me, name, FALSE)) {
fdata= rna_mesh_fdata(me);
index= CustomData_get_named_layer_index(fdata, CD_MTFACE, name);
cdl= (index == -1)? NULL: &fdata->layers[index];
@@ -1135,7 +1163,9 @@ static void rna_def_mvert(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_DIRECTION);
- RNA_def_property_float_sdna(prop, NULL, "no");
+ // RNA_def_property_float_sdna(prop, NULL, "no");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_range(prop, -1.0f, 1.0f);
RNA_def_property_float_funcs(prop, "rna_MeshVertex_normal_get", "rna_MeshVertex_normal_set", NULL);
RNA_def_property_ui_text(prop, "Normal", "Vertex Normal");
@@ -1300,7 +1330,7 @@ static void rna_def_mtface(BlenderRNA *brna)
{TF_ALPHA, "ALPHA", 0, "Alpha", "Render polygon transparent, depending on alpha channel of the texture"},
{TF_CLIP, "CLIPALPHA", 0, "Clip Alpha", "Use the images alpha values clipped with no blending (binary alpha)"},
{0, NULL, 0, NULL, NULL}};
- int uv_dim[]= {4, 2};
+ const int uv_dim[]= {4, 2};
srna= RNA_def_struct(brna, "MeshTextureFaceLayer", NULL);
RNA_def_struct_ui_text(srna, "Mesh Texture Face Layer", "Layer of texture faces in a Mesh datablock");
@@ -1639,7 +1669,7 @@ static void rna_def_mesh_vertices(BlenderRNA *brna, PropertyRNA *cprop)
// PropertyRNA *prop;
FunctionRNA *func;
- PropertyRNA *parm;
+// PropertyRNA *parm;
RNA_def_property_srna(cprop, "MeshVertices");
srna= RNA_def_struct(brna, "MeshVertices", NULL);
@@ -1648,7 +1678,7 @@ static void rna_def_mesh_vertices(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "add", "ED_mesh_vertices_add");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- parm= RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of vertices to add.", 0, INT_MAX);
+ RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of vertices to add.", 0, INT_MAX);
}
/* mesh.edges */
@@ -1658,7 +1688,7 @@ static void rna_def_mesh_edges(BlenderRNA *brna, PropertyRNA *cprop)
// PropertyRNA *prop;
FunctionRNA *func;
- PropertyRNA *parm;
+// PropertyRNA *parm;
RNA_def_property_srna(cprop, "MeshEdges");
srna= RNA_def_struct(brna, "MeshEdges", NULL);
@@ -1667,7 +1697,7 @@ static void rna_def_mesh_edges(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "add", "ED_mesh_edges_add");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- parm= RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of vertices to add.", 0, INT_MAX);
+ RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of vertices to add.", 0, INT_MAX);
}
/* mesh.faces */
@@ -1677,7 +1707,7 @@ static void rna_def_mesh_faces(BlenderRNA *brna, PropertyRNA *cprop)
PropertyRNA *prop;
FunctionRNA *func;
- PropertyRNA *parm;
+ /*PropertyRNA *parm;*/
RNA_def_property_srna(cprop, "MeshFaces");
srna= RNA_def_struct(brna, "MeshFaces", NULL);
@@ -1696,7 +1726,7 @@ static void rna_def_mesh_faces(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "add", "ED_mesh_faces_add");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- parm= RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of vertices to add.", 0, INT_MAX);
+ RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of vertices to add.", 0, INT_MAX);
}
/* mesh.vertex_colors */
@@ -1716,7 +1746,7 @@ static void rna_def_vertex_colors(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "new", "rna_Mesh_vertex_color_new");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
RNA_def_function_ui_description(func, "Add a vertex color layer to Mesh.");
- parm= RNA_def_string(func, "name", "UVTex", 0, "", "UV Texture name.");
+ RNA_def_string(func, "name", "Col", 0, "", "Vertex color name.");
parm= RNA_def_pointer(func, "layer", "MeshColorLayer", "", "The newly created layer.");
RNA_def_function_return(func, parm);
@@ -1757,7 +1787,7 @@ static void rna_def_uv_textures(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "new", "rna_Mesh_uv_texture_new");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
RNA_def_function_ui_description(func, "Add a UV texture layer to Mesh.");
- parm= RNA_def_string(func, "name", "UVTex", 0, "", "UV Texture name.");
+ RNA_def_string(func, "name", "UVTex", 0, "", "UV Texture name.");
parm= RNA_def_pointer(func, "layer", "MeshTextureFaceLayer", "", "The newly created layer.");
RNA_def_function_return(func, parm);
@@ -1901,6 +1931,7 @@ static void rna_def_mesh(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_auto_texspace", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "texflag", AUTOSPACE);
RNA_def_property_ui_text(prop, "Auto Texture Space", "Adjusts active object's texture space automatically when transforming object");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Mesh_texspace_set");
prop= RNA_def_property(srna, "texspace_location", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
@@ -1978,17 +2009,17 @@ static void rna_def_mesh(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
prop= RNA_def_property(srna, "show_extra_edge_length", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_EDGELEN);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEXTRA_EDGELEN);
RNA_def_property_ui_text(prop, "Edge Length", "Displays selected edge lengths, Using global values when set in the transform panel");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
- prop= RNA_def_property(srna, "show_extra_edge_angle", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_EDGEANG);
- RNA_def_property_ui_text(prop, "Edge Angles", "Displays the angles in the selected edges in degrees, Using global values when set in the transform panel");
+ prop= RNA_def_property(srna, "show_extra_face_angle", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEXTRA_FACEANG);
+ RNA_def_property_ui_text(prop, "Faces Angles", "Displays the angles in the selected edges in degrees, Using global values when set in the transform panel");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
prop= RNA_def_property(srna, "show_extra_face_area", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_FACEAREA);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEXTRA_FACEAREA);
RNA_def_property_ui_text(prop, "Face Area", "Displays the area of selected faces, Using global values when set in the transform panel");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
diff --git a/source/blender/makesrna/intern/rna_mesh_api.c b/source/blender/makesrna/intern/rna_mesh_api.c
index eaf18920c85..3090f8512e0 100644
--- a/source/blender/makesrna/intern/rna_mesh_api.c
+++ b/source/blender/makesrna/intern/rna_mesh_api.c
@@ -33,6 +33,7 @@
#include "BLO_sys_types.h"
+#include "BKE_mesh.h"
#include "ED_mesh.h"
#ifdef RNA_RUNTIME
@@ -56,6 +57,12 @@ void RNA_api_mesh(StructRNA *srna)
func= RNA_def_function(srna, "update", "ED_mesh_update");
RNA_def_boolean(func, "calc_edges", 0, "Calculate Edges", "Force recalculation of edges.");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+
+ func= RNA_def_function(srna, "validate", "BKE_mesh_validate");
+ RNA_def_function_ui_description(func, "validate geometry, return True when the mesh has had invalid geometry corrected/removed.");
+ parm= RNA_def_boolean(func, "verbose", 0, "Verbose", "Output information about the errors found");
+ parm= RNA_def_boolean(func, "result", 0, "Result", "");
+ RNA_def_function_return(func, parm);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_meta.c b/source/blender/makesrna/intern/rna_meta.c
index 18dfd05b971..142c8017289 100644
--- a/source/blender/makesrna/intern/rna_meta.c
+++ b/source/blender/makesrna/intern/rna_meta.c
@@ -25,6 +25,7 @@
#include <stdlib.h>
#include "RNA_define.h"
+#include "RNA_enum_types.h"
#include "rna_internal.h"
@@ -97,18 +98,25 @@ static void rna_MetaBall_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
if(ob->data == mb)
copy_mball_properties(scene, ob);
- DAG_id_flush_update(&mb->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&mb->id, 0);
WM_main_add_notifier(NC_GEOM|ND_DATA, mb);
}
}
+static void rna_MetaBall_update_rotation(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ MetaElem *ml= ptr->data;
+ normalize_qt(ml->quat);
+ rna_MetaBall_update_data(bmain, scene, ptr);
+}
+
static MetaElem *rna_MetaBall_elements_new(MetaBall *mb, int type)
{
MetaElem *ml= add_metaball_element(mb, type);
/* cheating way for importers to avoid slow updates */
if(mb->id.us > 0) {
- DAG_id_flush_update(&mb->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&mb->id, 0);
WM_main_add_notifier(NC_GEOM|ND_DATA, &mb->id);
}
@@ -131,21 +139,13 @@ static void rna_MetaBall_elements_remove(MetaBall *mb, ReportList *reports, Meta
/* cheating way for importers to avoid slow updates */
if(mb->id.us > 0) {
- DAG_id_flush_update(&mb->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&mb->id, 0);
WM_main_add_notifier(NC_GEOM|ND_DATA, &mb->id);
}
}
#else
-static EnumPropertyItem metaelem_type_items[] = {
- {MB_BALL, "BALL", ICON_META_BALL, "Ball", ""},
- {MB_TUBE, "CAPSULE", ICON_META_CAPSULE, "Capsule", ""},
- {MB_PLANE, "PLANE", ICON_META_PLANE, "Plane", ""},
- {MB_ELIPSOID, "ELLIPSOID", ICON_META_ELLIPSOID, "Ellipsoid", ""}, // NOTE: typo at original definition!
- {MB_CUBE, "CUBE", ICON_META_CUBE, "Cube", ""},
- {0, NULL, 0, NULL, NULL}};
-
static void rna_def_metaelement(BlenderRNA *brna)
{
StructRNA *srna;
@@ -155,7 +155,7 @@ static void rna_def_metaelement(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "MetaElem");
RNA_def_struct_ui_text(srna, "Meta Element", "Blobby element in a MetaBall datablock");
RNA_def_struct_ui_icon(srna, ICON_OUTLINER_DATA_META);
-
+
/* enums */
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, metaelem_type_items);
@@ -171,8 +171,8 @@ static void rna_def_metaelement(BlenderRNA *brna)
prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_QUATERNION);
RNA_def_property_float_sdna(prop, NULL, "quat");
- RNA_def_property_ui_text(prop, "Rotation", "");
- RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
+ RNA_def_property_ui_text(prop, "Rotation", "Normalized quaternion rotation");
+ RNA_def_property_update(prop, 0, "rna_MetaBall_update_rotation");
prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_UNSIGNED|PROP_UNIT_LENGTH);
RNA_def_property_float_sdna(prop, NULL, "rad");
@@ -232,7 +232,7 @@ static void rna_def_metaball_elements(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "new", "rna_MetaBall_elements_new");
RNA_def_function_ui_description(func, "Add a new spline to the curve.");
- parm= RNA_def_enum(func, "type", metaelem_type_items, MB_BALL, "", "type for the new meta element.");
+ RNA_def_enum(func, "type", metaelem_type_items, MB_BALL, "", "type for the new meta element.");
parm= RNA_def_pointer(func, "element", "MetaElement", "", "The newly created metaelement.");
RNA_def_function_return(func, parm);
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 8672c7babcf..0da7bb5c8c2 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -211,7 +211,7 @@ static char *rna_Modifier_path(PointerRNA *ptr)
static void rna_Modifier_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ptr->id.data);
}
@@ -251,14 +251,14 @@ static void rna_Smoke_set_type(Main *bmain, Scene *scene, PointerRNA *ptr)
{
psys = psmd->psys;
part = psys->part;
- part->flag |= PART_UNBORN;
part->lifetime = 1.0f;
part->sta = 1.0f;
part->end = 250.0f;
part->ren_as = PART_DRAW_NOT;
+ part->draw_as = PART_DRAW_DOT;
sprintf(psys->name, "SmokeParticles");
psys->recalc |= (PSYS_RECALC_RESET|PSYS_RECALC_PHYS);
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
}
}
if(smd->flow)
@@ -669,7 +669,7 @@ static void rna_def_modifier_lattice(BlenderRNA *brna)
prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
+ RNA_def_property_ui_text(prop, "Vertex Group", "Name of Vertex Group which determines influence of modifier per point");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_LatticeModifier_vgroup_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
@@ -701,7 +701,7 @@ static void rna_def_modifier_curve(BlenderRNA *brna)
prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
+ RNA_def_property_ui_text(prop, "Vertex Group", "Name of Vertex Group which determines influence of modifier per point");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_CurveModifier_vgroup_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -779,6 +779,11 @@ static void rna_def_modifier_mirror(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_VGROUP);
RNA_def_property_ui_text(prop, "Mirror Vertex Groups", "Mirror vertex groups (e.g. .R->.L)");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "use_mirror_merge", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", MOD_MIR_NO_MERGE);
+ RNA_def_property_ui_text(prop, "Merge Verticies", "Merge vertices within the merge threshold");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "use_mirror_u", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_MIRROR_U);
@@ -814,7 +819,7 @@ static void rna_def_modifier_decimate(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "DecimateModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_DECIM);
- prop= RNA_def_property(srna, "ratio", PROP_FLOAT, PROP_PERCENTAGE);
+ prop= RNA_def_property(srna, "ratio", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "percent");
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_range(prop, 0, 1, 1, 2);
@@ -995,36 +1000,36 @@ static void rna_def_modifier_armature(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
- prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
- RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
- RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
- RNA_def_property_string_funcs(prop, NULL, NULL, "rna_ArmatureModifier_vgroup_set");
- RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
- prop= RNA_def_property(srna, "invert_vertex_group", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_INVERT_VGROUP);
- RNA_def_property_ui_text(prop, "Invert", "Invert vertex group influence");
+ prop= RNA_def_property(srna, "use_bone_envelopes", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_ENVELOPE);
+ RNA_def_property_ui_text(prop, "Use Bone Envelopes", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "use_vertex_groups", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_VGROUP);
RNA_def_property_ui_text(prop, "Use Vertex Groups", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
- prop= RNA_def_property(srna, "use_bone_envelopes", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_ENVELOPE);
- RNA_def_property_ui_text(prop, "Use Bone Envelopes", "");
- RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
+
prop= RNA_def_property(srna, "use_deform_preserve_volume", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_QUATERNION);
- RNA_def_property_ui_text(prop, "Quaternion", "Deform rotation interpolation with quaternions");
+ RNA_def_property_ui_text(prop, "Preserve Volume", "Deform rotation interpolation with quaternions");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "use_multi_modifier", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "multi", 0);
RNA_def_property_ui_text(prop, "Multi Modifier", "Use same input as previous modifier, and mix results using overall vgroup");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
+ RNA_def_property_ui_text(prop, "Vertex Group", "Name of Vertex Group which determines influence of modifier per point");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_ArmatureModifier_vgroup_set");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "invert_vertex_group", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_INVERT_VGROUP);
+ RNA_def_property_ui_text(prop, "Invert", "Invert vertex group influence");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_hook(BlenderRNA *brna)
@@ -1060,7 +1065,7 @@ static void rna_def_modifier_hook(BlenderRNA *brna)
prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
+ RNA_def_property_ui_text(prop, "Vertex Group", "Name of Vertex Group which determines influence of modifier per point");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_HookModifier_vgroup_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
@@ -1169,12 +1174,12 @@ static void rna_def_modifier_array(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Constant Offset Displacement", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "use_relative_offset", PROP_BOOLEAN, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "use_relative_offset", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "offset_type", MOD_ARR_OFF_RELATIVE);
RNA_def_property_ui_text(prop, "Relative Offset", "Add an offset relative to the object's bounding box");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "relative_offset_displace", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "relative_offset_displace", PROP_FLOAT, PROP_NONE); /* PROP_TRANSLATION causes units to be used which we dont want */
RNA_def_property_float_sdna(prop, NULL, "scale");
RNA_def_property_ui_text(prop, "Relative Offset Displacement", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1278,7 +1283,7 @@ static void rna_def_modifier_displace(BlenderRNA *brna)
prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
- RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
+ RNA_def_property_ui_text(prop, "Vertex Group", "Name of Vertex Group which determines influence of modifier per point");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_DisplaceModifier_vgroup_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1441,7 +1446,7 @@ static void rna_def_modifier_smooth(BlenderRNA *brna)
prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
- RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
+ RNA_def_property_ui_text(prop, "Vertex Group", "Name of Vertex Group which determines influence of modifier per point");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SmoothModifier_vgroup_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
@@ -1903,11 +1908,11 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_ShrinkwrapModifier_vgroup_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
+
prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "keepDist");
- RNA_def_property_range(prop, 0, FLT_MAX);
- RNA_def_property_ui_range(prop, 0, 100, 1, 2);
+ RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
+ RNA_def_property_ui_range(prop, -100, 100, 1, 2);
RNA_def_property_ui_text(prop, "Offset", "Distance to keep from the target");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -2254,7 +2259,6 @@ static void rna_def_modifier_navmesh(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "NavMesh Modifier", "NavMesh modifier");
RNA_def_struct_sdna(srna, "NavMeshModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_DECIM);
-
}
void RNA_def_modifier(BlenderRNA *brna)
@@ -2313,6 +2317,11 @@ void RNA_def_modifier(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Expanded", "Set modifier expanded in the user interface");
RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1);
+ prop= RNA_def_property(srna, "use_apply_on_spline", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_ApplyOnSpline);
+ RNA_def_property_ui_text(prop, "Apply on spline", "Apply this and all preceding deformation modifiers on splines' points rather than on filled curve/surface");
+ RNA_def_property_ui_icon(prop, ICON_SURFACE_DATA, 0);
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
/* types */
rna_def_modifier_subsurf(brna);
diff --git a/source/blender/makesrna/intern/rna_nla.c b/source/blender/makesrna/intern/rna_nla.c
index 15c8608e523..f28fec75fe2 100644
--- a/source/blender/makesrna/intern/rna_nla.c
+++ b/source/blender/makesrna/intern/rna_nla.c
@@ -34,6 +34,9 @@
#include "MEM_guardedalloc.h"
+#include "WM_api.h"
+#include "WM_types.h"
+
#ifdef RNA_RUNTIME
#include <stdio.h>
@@ -43,6 +46,8 @@
#include "BKE_animsys.h"
#include "BKE_nla.h"
+#include "ED_anim_api.h"
+
/* temp constant defined for these funcs only... */
#define NLASTRIP_MIN_LEN_THRESH 0.1f
@@ -263,6 +268,60 @@ static void rna_NlaStrip_animated_time_set(PointerRNA *ptr, int value)
data->flag &= ~NLASTRIP_FLAG_USR_TIME;
}
+static NlaStrip *rna_NlaStrip_new(NlaTrack *track, bContext *C, ReportList *reports, const char *name, int start, bAction *action)
+{
+ NlaStrip *strip = add_nlastrip(action);
+
+ if (strip == NULL) {
+ BKE_reportf(reports, RPT_ERROR, "Unable to create new strip.");
+ return NULL;
+ }
+
+ strip->end += (start - strip->start);
+ strip->start = start;
+
+ if (BKE_nlastrips_add_strip(&track->strips, strip) == 0) {
+ BKE_reportf(reports, RPT_ERROR, "Unable to add strip. Track doesn't have any space to accommodate this new strip.");
+ free_nlastrip(NULL, strip);
+ return NULL;
+ }
+
+ /* create dummy AnimData block so that BKE_nlastrip_validate_name()
+ * can be used to ensure a valid name, as we don't have one here...
+ * - only the nla_tracks list is needed there, which we aim to reverse engineer here...
+ */
+ {
+ AnimData adt = {0};
+ NlaTrack *nlt, *nlt_p;
+
+ /* 'first' NLA track is found by going back up chain of given track's parents until we fall off */
+ nlt_p = track; nlt = track;
+ while ((nlt = nlt->prev) != NULL)
+ nlt_p = nlt;
+ adt.nla_tracks.first = nlt_p;
+
+ /* do the same thing to find the last track */
+ nlt_p = track; nlt = track;
+ while ((nlt = nlt->next) != NULL)
+ nlt_p = nlt;
+ adt.nla_tracks.last = nlt_p;
+
+ /* now we can just auto-name as usual */
+ BKE_nlastrip_validate_name(&adt, strip);
+ }
+
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_ADDED, NULL);
+
+ return strip;
+}
+
+static void rna_NlaStrip_remove(NlaTrack *track, bContext *C, ReportList *reports, NlaStrip *strip)
+{
+ free_nlastrip(&track->strips, strip);
+
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_REMOVED, NULL);
+}
+
#else
/* enum defines exported for rna_animation.c */
@@ -301,6 +360,7 @@ static void rna_def_nlastrip(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Name", "");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_NlaStrip_name_set");
RNA_def_struct_name_property(srna, prop);
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
/* Enums */
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
@@ -308,16 +368,19 @@ static void rna_def_nlastrip(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE); // XXX for now, not editable, since this is dangerous
RNA_def_property_enum_items(prop, prop_type_items);
RNA_def_property_ui_text(prop, "Type", "Type of NLA Strip");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "extrapolation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "extendmode");
RNA_def_property_enum_items(prop, nla_mode_extend_items);
RNA_def_property_ui_text(prop, "Extrapolation", "Action to take for gaps past the strip extents");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "blend_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "blendmode");
RNA_def_property_enum_items(prop, nla_mode_blend_items);
RNA_def_property_ui_text(prop, "Blending", "Method used for combining strip's result with accumulated result");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
/* Strip extents */
prop= RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_TIME);
@@ -337,32 +400,38 @@ static void rna_def_nlastrip(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "blendin");
RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_blend_in_set", NULL);
RNA_def_property_ui_text(prop, "Blend In", "Number of frames at start of strip to fade in influence");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "blend_out", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "blendout");
RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_blend_out_set", NULL);
RNA_def_property_ui_text(prop, "Blend Out", "");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "use_auto_blend", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_AUTO_BLENDS);
RNA_def_property_ui_text(prop, "Auto Blend In/Out", "Number of frames for Blending In/Out is automatically determined from overlapping strips");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
/* Action */
prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "act");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Action", "Action referenced by this strip");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
/* Action extents */
prop= RNA_def_property(srna, "action_frame_start", PROP_FLOAT, PROP_TIME);
RNA_def_property_float_sdna(prop, NULL, "actstart");
RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_action_start_frame_set", NULL);
RNA_def_property_ui_text(prop, "Action Start Frame", "");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "action_frame_end", PROP_FLOAT, PROP_TIME);
RNA_def_property_float_sdna(prop, NULL, "actend");
RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_action_end_frame_set", NULL);
RNA_def_property_ui_text(prop, "Action End Frame", "");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
/* Action Reuse */
prop= RNA_def_property(srna, "repeat", PROP_FLOAT, PROP_NONE);
@@ -370,12 +439,14 @@ static void rna_def_nlastrip(BlenderRNA *brna)
RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_repeat_set", NULL);
RNA_def_property_range(prop, 0.1f, 1000.0f); /* these limits have currently be chosen arbitarily, but could be extended (minimum should still be > 0 though) if needed... */
RNA_def_property_ui_text(prop, "Repeat", "Number of times to repeat the action range");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "scale");
RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_scale_set", NULL);
RNA_def_property_range(prop, 0.0001f, 1000.0f); /* these limits can be extended, but beyond this, we can get some crazy+annoying bugs due to numeric errors */
RNA_def_property_ui_text(prop, "Scale", "Scaling factor for action");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
/* Strip's F-Curves */
prop= RNA_def_property(srna, "fcurves", PROP_COLLECTION, PROP_NONE);
@@ -396,21 +467,25 @@ static void rna_def_nlastrip(BlenderRNA *brna)
prop= RNA_def_property(srna, "influence", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Influence", "Amount the strip contributes to the current result");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "strip_time", PROP_FLOAT, PROP_TIME);
RNA_def_property_ui_text(prop, "Strip Time", "Frame of referenced Action to evaluate");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
// TODO: should the animated_influence/time settings be animatable themselves?
prop= RNA_def_property(srna, "use_animated_influence", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_USR_INFLUENCE);
RNA_def_property_boolean_funcs(prop, NULL, "rna_NlaStrip_animated_influence_set");
RNA_def_property_ui_text(prop, "Animated Influence", "Influence setting is controlled by an F-Curve rather than automatically determined");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "use_animated_time", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_USR_TIME);
RNA_def_property_boolean_funcs(prop, NULL, "rna_NlaStrip_animated_time_set");
RNA_def_property_ui_text(prop, "Animated Strip Time", "Strip time is controlled by an F-Curve rather than automatically determined");
-
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
+
prop= RNA_def_property(srna, "use_animated_time_cyclic", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_USR_TIME_CYCLIC);
RNA_def_property_ui_text(prop, "Cyclic Strip Time", "Cycle the animated time within the action start & end");
@@ -421,23 +496,58 @@ static void rna_def_nlastrip(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* can be made editable by hooking it up to the necessary NLA API methods */
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_ACTIVE);
RNA_def_property_ui_text(prop, "Active", "NLA Strip is active");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_SELECT);
RNA_def_property_ui_text(prop, "Select", "NLA Strip is selected");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_MUTED);
RNA_def_property_ui_text(prop, "Muted", "NLA Strip is not evaluated");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "use_reverse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_REVERSE);
RNA_def_property_ui_text(prop, "Reversed", "NLA Strip is played back in reverse order (only when timing is automatically determined)");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
// TODO:
// - sync length
}
+static void rna_api_nlatrack_strips(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ RNA_def_property_srna(cprop, "NlaStrips");
+ srna= RNA_def_struct(brna, "NlaStrips", NULL);
+ RNA_def_struct_sdna(srna, "NlaTrack");
+ RNA_def_struct_ui_text(srna, "Nla Strips", "Collection of Nla Strips");
+
+ func = RNA_def_function(srna, "new", "rna_NlaStrip_new");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+ RNA_def_function_ui_description(func, "Add a new Action-Clip strip to the track");
+ parm= RNA_def_string(func, "name", "NlaStrip", 0, "", "Name for the NLA Strips.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm = RNA_def_int(func, "start", 0, INT_MIN, INT_MAX, "Start Frame", "Start frame for this strip.", INT_MIN, INT_MAX);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm = RNA_def_pointer(func, "action", "Action", "", "Action to assign to this strip.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+ /* return type */
+ parm = RNA_def_pointer(func, "strip", "NlaStrip", "", "New NLA Strip.");
+ RNA_def_function_return(func, parm);
+
+ func = RNA_def_function(srna, "remove", "rna_NlaStrip_remove");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+ RNA_def_function_ui_description(func, "Remove a NLA Strip.");
+ parm = RNA_def_pointer(func, "strip", "NlaStrip", "", "NLA Strip to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+}
+
static void rna_def_nlatrack(BlenderRNA *brna)
{
StructRNA *srna;
@@ -451,34 +561,42 @@ static void rna_def_nlatrack(BlenderRNA *brna)
prop= RNA_def_property(srna, "strips", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "NlaStrip");
RNA_def_property_ui_text(prop, "NLA Strips", "NLA Strips on this NLA-track");
-
+
+ rna_api_nlatrack_strips(brna, prop);
+
/* name property */
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_ui_text(prop, "Name", "");
RNA_def_struct_name_property(srna, prop);
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
/* settings */
prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* can be made editable by hooking it up to the necessary NLA API methods */
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLATRACK_ACTIVE);
RNA_def_property_ui_text(prop, "Active", "NLA Track is active");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "is_solo", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* can be made editable by hooking it up to the necessary NLA API methods */
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLATRACK_SOLO);
RNA_def_property_ui_text(prop, "Solo", "NLA Track is evaluated itself (i.e. active Action and all other NLA Tracks in the same AnimData block are disabled)");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLATRACK_SELECTED);
RNA_def_property_ui_text(prop, "Select", "NLA Track is selected");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLATRACK_MUTED);
RNA_def_property_ui_text(prop, "Muted", "NLA Track is not evaluated");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "lock", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLATRACK_PROTECTED);
RNA_def_property_ui_text(prop, "Locked", "NLA Track is locked");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
}
/* --------- */
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 36385759c5a..bb5c867f789 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -41,17 +41,83 @@
#include "BKE_texture.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "WM_types.h"
#include "MEM_guardedalloc.h"
+EnumPropertyItem node_blend_type_items[] = {
+{ 0, "MIX", 0, "Mix", ""},
+{ 1, "ADD", 0, "Add", ""},
+{ 3, "SUBTRACT", 0, "Subtract", ""},
+{ 2, "MULTIPLY", 0, "Multiply", ""},
+{ 4, "SCREEN", 0, "Screen", ""},
+{ 9, "OVERLAY", 0, "Overlay", ""},
+{ 5, "DIVIDE", 0, "Divide", ""},
+{ 6, "DIFFERENCE", 0, "Difference", ""},
+{ 7, "DARKEN", 0, "Darken", ""},
+{ 8, "LIGHTEN", 0, "Lighten", ""},
+{10, "DODGE", 0, "Dodge", ""},
+{11, "BURN", 0, "Burn", ""},
+{15, "COLOR", 0, "Color", ""},
+{14, "VALUE", 0, "Value", ""},
+{13, "SATURATION", 0, "Saturation", ""},
+{12, "HUE", 0, "Hue", ""},
+{16, "SOFT_LIGHT", 0, "Soft Light", ""},
+{17, "LINEAR_LIGHT", 0, "Linear Light",""},
+{0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem node_math_items[] = {
+{ 0, "ADD", 0, "Add", ""},
+{ 1, "SUBTRACT", 0, "Subtract", ""},
+{ 2, "MULTIPLY", 0, "Multiply", ""},
+{ 3, "DIVIDE", 0, "Divide", ""},
+{ 4, "SINE", 0, "Sine", ""},
+{ 5, "COSINE", 0, "Cosine", ""},
+{ 6, "TANGENT", 0, "Tangent", ""},
+{ 7, "ARCSINE", 0, "Arcsine", ""},
+{ 8, "ARCCOSINE", 0, "Arccosine", ""},
+{ 9, "ARCTANGENT", 0, "Arctangent", ""},
+{10, "POWER", 0, "Power", ""},
+{11, "LOGARITHM", 0, "Logarithm", ""},
+{12, "MINIMUM", 0, "Minimum", ""},
+{13, "MAXIMUM", 0, "Maximum", ""},
+{14, "ROUND", 0, "Round", ""},
+{15, "LESS_THAN", 0, "Less Than", ""},
+{16, "GREATER_THAN", 0, "Greater Than", ""},
+{0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem node_vec_math_items[] = {
+{0, "ADD", 0, "Add", ""},
+{1, "SUBTRACT", 0, "Subtract", ""},
+{2, "AVERAGE", 0, "Average", ""},
+{3, "DOT_PRODUCT", 0, "Dot Product", ""},
+{4, "CROSS_PRODUCT", 0, "Cross Product", ""},
+{5, "NORMALIZE", 0, "Normalize", ""},
+{0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem node_filter_items[] = {
+{0, "SOFTEN", 0, "Soften", ""},
+{1, "SHARPEN", 0, "Sharpen", ""},
+{2, "LAPLACE", 0, "Laplace", ""},
+{3, "SOBEL", 0, "Sobel", ""},
+{4, "PREWITT", 0, "Prewitt", ""},
+{5, "KIRSCH", 0, "Kirsch", ""},
+{6, "SHADOW", 0, "Shadow", ""},
+{0, NULL, 0, NULL, NULL}};
+
#ifdef RNA_RUNTIME
+#include "BLI_linklist.h"
+
#include "ED_node.h"
#include "RE_pipeline.h"
+#include "DNA_scene_types.h"
+#include "WM_api.h"
+
static StructRNA *rna_Node_refine(struct PointerRNA *ptr)
{
bNode *node = (bNode*)ptr->data;
@@ -89,6 +155,22 @@ static StructRNA *rna_NodeSocketType_refine(struct PointerRNA *ptr)
}
}
+static StructRNA *rna_NodeTree_refine(struct PointerRNA *ptr)
+{
+ bNodeTree *ntree= (bNodeTree*)ptr->data;
+
+ switch(ntree->type) {
+ case NTREE_SHADER:
+ return &RNA_ShaderNodeTree;
+ case NTREE_COMPOSIT:
+ return &RNA_CompositorNodeTree;
+ case NTREE_TEXTURE:
+ return &RNA_TextureNodeTree;
+ default:
+ return &RNA_UnknownType;
+ }
+}
+
static char *rna_Node_path(PointerRNA *ptr)
{
bNode *node= (bNode*)ptr->data;
@@ -157,9 +239,25 @@ static void rna_Image_end_frame_set(PointerRNA *ptr, int value)
image->efra= value;
}
+static void rna_Node_scene_set(PointerRNA *ptr, PointerRNA value)
+{
+ bNode *node= (bNode*)ptr->data;
+
+ if (node->id) {
+ id_us_min(node->id);
+ node->id= NULL;
+ }
+
+ node->id= value.data;
+
+ id_us_plus(node->id);
+}
+
+
+
static void node_update(Main *bmain, Scene *scene, bNodeTree *ntree, bNode *node)
{
- ED_node_generic_update(bmain, scene, ntree, node);
+ ED_node_generic_update(bmain, ntree, node);
}
static void rna_Node_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -180,7 +278,7 @@ static void rna_NodeGroup_update(Main *bmain, Scene *scene, PointerRNA *ptr)
node_update(bmain, scene, ntree, node);
}
-static void rna_Node_update_name(Main *bmain, Scene *scene, PointerRNA *ptr)
+static void rna_Node_name_set(PointerRNA *ptr, const char *value)
{
bNodeTree *ntree= (bNodeTree*)ptr->id.data;
bNode *node= (bNode*)ptr->data;
@@ -188,14 +286,13 @@ static void rna_Node_update_name(Main *bmain, Scene *scene, PointerRNA *ptr)
/* make a copy of the old name first */
BLI_strncpy(oldname, node->name, sizeof(node->name));
+ /* set new name */
+ BLI_strncpy(node->name, value, sizeof(node->name));
nodeUniqueName(ntree, node);
- node->flag |= NODE_CUSTOM_NAME;
/* fix all the animation data which may link to this */
BKE_all_animdata_fix_paths_rename("nodes", oldname, node->name);
-
- node_update(bmain, scene, ntree, node);
}
/* this should be done at display time! if no custom names are set */
@@ -389,6 +486,129 @@ static EnumPropertyItem *rna_Node_channel_itemf(bContext *C, PointerRNA *ptr, in
return item;
}
+static bNode *rna_NodeTree_node_new(bNodeTree *ntree, bContext *C, ReportList *reports, int type, bNodeTree *group)
+{
+ bNode *node;
+
+ if (type == NODE_GROUP && group == NULL) {
+ BKE_reportf(reports, RPT_ERROR, "node type \'GROUP\' missing group argument");
+ return NULL;
+ }
+ node = nodeAddNodeType(ntree, type, group, NULL);
+
+ if (node == NULL) {
+ BKE_reportf(reports, RPT_ERROR, "Unable to create node");
+ }
+ else {
+ nodeVerifyGroup(ntree); /* update group node socket links*/
+ NodeTagChanged(ntree, node);
+ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+
+ if (group)
+ id_us_plus(&group->id);
+ }
+
+ return node;
+}
+
+static bNode *rna_NodeTree_node_composite_new(bNodeTree *ntree, bContext *C, ReportList *reports, int type, bNodeTree *group)
+{
+ /* raises error on failier */
+ bNode *node= rna_NodeTree_node_new(ntree, C, reports, type, group);
+
+ if (node) {
+ if(ELEM4(node->type, CMP_NODE_COMPOSITE, CMP_NODE_DEFOCUS, CMP_NODE_OUTPUT_FILE, CMP_NODE_R_LAYERS)) {
+ /* annoying, find the node tree we are in, scene can be NULL */
+ Scene *scene;
+ for(scene= CTX_data_main(C)->scene.first; scene; scene= scene->id.next) {
+ if(scene->nodetree == ntree) {
+ break;
+ }
+ }
+ node->id= (ID *)scene;
+ id_us_plus(node->id);
+ }
+
+ ntreeCompositForceHidden(ntree, CTX_data_scene(C));
+ ntreeSolveOrder(ntree);
+ }
+
+ return node;
+}
+
+static bNode *rna_NodeTree_node_texture_new(bNodeTree *ntree, bContext *C, ReportList *reports, int type, bNodeTree *group)
+{
+ /* raises error on failier */
+ bNode *node= rna_NodeTree_node_new(ntree, C, reports, type, group);
+
+ if (node) {
+ ntreeTexCheckCyclics(ntree);
+ }
+
+ return node;
+}
+
+static void rna_NodeTree_node_remove(bNodeTree *ntree, ReportList *reports, bNode *node)
+{
+ if (BLI_findindex(&ntree->nodes, node) == -1) {
+ BKE_reportf(reports, RPT_ERROR, "Unable to locate node '%s' in nodetree", node->name);
+ }
+ else {
+ if (node->id)
+ id_us_min(node->id);
+
+ nodeFreeNode(ntree, node);
+ nodeVerifyGroup(ntree); /* update group node socket links*/
+
+ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+ }
+}
+
+static bNodeLink *rna_NodeTree_link_new(bNodeTree *ntree, ReportList *reports, bNodeSocket *in, bNodeSocket *out)
+{
+ bNodeLink *ret;
+ bNode *fromnode, *tonode;
+
+ if (!nodeFindNode(ntree, in, &fromnode, NULL)) {
+ BKE_reportf(reports, RPT_ERROR, "Unable to locate input socket's node in nodetree");
+ return NULL;
+ }
+
+ if (!nodeFindNode(ntree, out, &tonode, NULL)) {
+ BKE_reportf(reports, RPT_ERROR, "Unable to locate output socket's node in nodetree");
+ return NULL;
+ }
+
+ /* unlink node input socket */
+ nodeRemSocketLinks(ntree, out);
+
+ ret= nodeAddLink(ntree, fromnode, in, tonode, out);
+
+ if(ret) {
+ NodeTagChanged(ntree, tonode);
+
+ nodeVerifyGroup(ntree); /* update group node socket links*/
+
+ ntreeSolveOrder(ntree);
+
+ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+ }
+ return ret;
+}
+
+static void rna_NodeTree_link_remove(bNodeTree *ntree, ReportList *reports, bNodeLink *link)
+{
+ if (BLI_findindex(&ntree->links, link) == -1) {
+ BKE_reportf(reports, RPT_ERROR, "Unable to locate link in nodetree");
+ }
+ else {
+ nodeRemLink(ntree, link);
+ ntreeSolveOrder(ntree);
+ nodeVerifyGroup(ntree); /* update group node socket links*/
+
+ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+ }
+}
#else
@@ -406,73 +626,18 @@ static EnumPropertyItem prop_tri_channel_items[] = {
{ 3, "B", 0, "B", ""},
{0, NULL, 0, NULL, NULL}};
-static EnumPropertyItem node_blend_type_items[] = {
-{ 0, "MIX", 0, "Mix", ""},
-{ 1, "ADD", 0, "Add", ""},
-{ 3, "SUBTRACT", 0, "Subtract", ""},
-{ 2, "MULTIPLY", 0, "Multiply", ""},
-{ 4, "SCREEN", 0, "Screen", ""},
-{ 9, "OVERLAY", 0, "Overlay", ""},
-{ 5, "DIVIDE", 0, "Divide", ""},
-{ 6, "DIFFERENCE", 0, "Difference", ""},
-{ 7, "DARKEN", 0, "Darken", ""},
-{ 8, "LIGHTEN", 0, "Lighten", ""},
-{10, "DODGE", 0, "Dodge", ""},
-{11, "BURN", 0, "Burn", ""},
-{15, "COLOR", 0, "Color", ""},
-{14, "VALUE", 0, "Value", ""},
-{13, "SATURATION", 0, "Saturation", ""},
-{12, "HUE", 0, "Hue", ""},
-{16, "SOFT_LIGHT", 0, "Soft Light", ""},
-{17, "LINEAR_LIGHT", 0, "Linear Light",""},
-{0, NULL, 0, NULL, NULL}};
-
static EnumPropertyItem node_flip_items[] = {
{0, "X", 0, "Flip X", ""},
{1, "Y", 0, "Flip Y", ""},
{2, "XY", 0, "Flip X & Y", ""},
{0, NULL, 0, NULL, NULL}};
-static EnumPropertyItem node_math_items[] = {
-{ 0, "ADD", 0, "Add", ""},
-{ 1, "SUBTRACT", 0, "Subtract", ""},
-{ 2, "MULTIPLY", 0, "Multiply", ""},
-{ 3, "DIVIDE", 0, "Divide", ""},
-{ 4, "SINE", 0, "Sine", ""},
-{ 5, "COSINE", 0, "Cosine", ""},
-{ 6, "TANGENT", 0, "Tangent", ""},
-{ 7, "ARCSINE", 0, "Arcsine", ""},
-{ 8, "ARCCOSINE", 0, "Arccosine", ""},
-{ 9, "ARCTANGENT", 0, "Arctangent", ""},
-{10, "POWER", 0, "Power", ""},
-{11, "LOGARITHM", 0, "Logarithm", ""},
-{12, "MINIMUM", 0, "Minimum", ""},
-{13, "MAXIMUM", 0, "Maximum", ""},
-{14, "ROUND", 0, "Round", ""},
-{15, "LESS_THAN", 0, "Less Than", ""},
-{16, "GREATER_THAN", 0, "Greater Than", ""},
-{0, NULL, 0, NULL, NULL}};
-
-static EnumPropertyItem node_vec_math_items[] = {
-{0, "ADD", 0, "Add", ""},
-{1, "SUBTRACT", 0, "Subtract", ""},
-{2, "AVERAGE", 0, "Average", ""},
-{3, "DOT_PRODUCT", 0, "Dot Product", ""},
-{4, "CROSS_PRODUCT", 0, "Cross Product", ""},
-{5, "NORMALIZE", 0, "Normalize", ""},
-{0, NULL, 0, NULL, NULL}};
-
-static EnumPropertyItem node_filter_items[] = {
-{0, "SOFTEN", 0, "Soften", ""},
-{1, "SHARPEN", 0, "Sharpen", ""},
-{2, "LAPLACE", 0, "Laplace", ""},
-{3, "SOBEL", 0, "Sobel", ""},
-{4, "PREWITT", 0, "Prewitt", ""},
-{5, "KIRSCH", 0, "Kirsch", ""},
-{6, "SHADOW", 0, "Shadow", ""},
+static EnumPropertyItem node_ycc_items[] = {
+{ 0, "ITUBT601", 0, "ITU 601", ""},
+{ 1, "ITUBT709", 0, "ITU 709", ""},
+{ 2, "JFIF", 0, "Jpeg", ""},
{0, NULL, 0, NULL, NULL}};
-
#define MaxNodes 1000
enum
@@ -515,15 +680,12 @@ static void init(void)
{
memset(nodes, 0, sizeof nodes);
- #define Str(x) #x
-
#define DefNode(Category, ID, DefFunc, EnumName, StructName, UIName, UIDesc) \
- reg_node(ID, Category_##Category, EnumName, Str(Category##StructName), #Category, UIName, UIDesc);
+ reg_node(ID, Category_##Category, EnumName, STRINGIFY_ARG(Category##StructName), #Category, UIName, UIDesc);
#include "rna_nodetree_types.h"
#undef DefNode
- #undef Str
reg_node(NODE_GROUP, Category_GroupNode, "GROUP", "NodeGroup", "Node", "Group", "");
}
@@ -867,6 +1029,12 @@ static void def_cmp_blur(StructRNA *srna)
{R_FILTER_MITCH, "MITCH", 0, "Mitch", ""},
{0, NULL, 0, NULL, NULL}};
+ static EnumPropertyItem aspect_correction_type_items[] = {
+ {CMP_NODE_BLUR_ASPECT_NONE, "NONE", 0, "None", ""},
+ {CMP_NODE_BLUR_ASPECT_Y, "Y", 0, "Y", ""},
+ {CMP_NODE_BLUR_ASPECT_X, "X", 0, "X", ""},
+ {0, NULL, 0, NULL, NULL}};
+
RNA_def_struct_sdna_from(srna, "NodeBlurData", "storage");
prop = RNA_def_property(srna, "size_x", PROP_INT, PROP_NONE);
@@ -886,21 +1054,27 @@ static void def_cmp_blur(StructRNA *srna)
RNA_def_property_ui_text(prop, "Relative", "Use relative (percent) values to define blur radius");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+ prop = RNA_def_property(srna, "aspect_correction", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "aspect");
+ RNA_def_property_enum_items(prop, aspect_correction_type_items);
+ RNA_def_property_ui_text(prop, "Aspect Correction", "Type of aspect correction to use");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+
prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fac");
RNA_def_property_range(prop, 0.0f, 2.0f);
RNA_def_property_ui_text(prop, "Factor", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "factor_x", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "factor_x", PROP_FLOAT, PROP_PERCENTAGE);
RNA_def_property_float_sdna(prop, NULL, "percentx");
- RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_text(prop, "Relative Size X", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "factor_y", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "factor_y", PROP_FLOAT, PROP_PERCENTAGE);
RNA_def_property_float_sdna(prop, NULL, "percenty");
- RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_text(prop, "Relative Size Y", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1097,8 +1271,9 @@ static void def_cmp_render_layers(StructRNA *srna)
prop = RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "id");
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Node_scene_set", NULL, NULL);
RNA_def_property_struct_type(prop, "Scene");
- RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_ui_text(prop, "Scene", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1131,13 +1306,13 @@ static void def_cmp_output_file(StructRNA *srna)
{0, "NONE", 0, "None", ""},
{1, "PXR24", 0, "Pxr24 (lossy)", ""},
{2, "ZIP", 0, "ZIP (lossless)", ""},
- {3, "PIZ", 0, "PIX (lossless)", ""},
+ {3, "PIZ", 0, "PIZ (lossless)", ""},
{4, "RLE", 0, "RLE (lossless)", ""},
{0, NULL, 0, NULL, NULL}};
RNA_def_struct_sdna_from(srna, "NodeImageFile", "storage");
- prop = RNA_def_property(srna, "filepath", PROP_STRING, PROP_DIRPATH);
+ prop = RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_sdna(prop, NULL, "name");
RNA_def_property_ui_text(prop, "File Path", "Output path for the image, same functionality as render output.");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1851,9 +2026,9 @@ static void def_cmp_glare(StructRNA *srna)
RNA_def_property_ui_text(prop, "Streaks", "Total number of streaks");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "angle_offset", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "angle_ofs");
- RNA_def_property_range(prop, 0.0f, 180.0f);
+ prop = RNA_def_property(srna, "angle_offset", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "angle_ofs");
+ RNA_def_property_range(prop, 0, 180);
RNA_def_property_ui_text(prop, "Angle Offset", "Streak angle offset in degrees");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1864,7 +2039,7 @@ static void def_cmp_glare(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
prop = RNA_def_property(srna, "use_rotate_45", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "angle", 1);
+ RNA_def_property_boolean_sdna(prop, NULL, "angle", 0);
RNA_def_property_ui_text(prop, "Rotate 45", "Simple star filter: add 45 degree rotation offset");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -2037,6 +2212,27 @@ static void def_cmp_huecorrect(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
}
+static void def_cmp_zcombine(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ prop = RNA_def_property(srna, "use_alpha", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "custom1", 0);
+ RNA_def_property_ui_text(prop, "Use Alpha", "Takes Alpha channel into account when doing the Z operation");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+}
+
+static void def_cmp_ycc(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "custom1");
+ RNA_def_property_enum_items(prop, node_ycc_items);
+ RNA_def_property_ui_text(prop, "Mode", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+}
+
/* -- Texture Nodes --------------------------------------------------------- */
@@ -2159,9 +2355,129 @@ static void rna_def_texture_node(BlenderRNA *brna)
/* -------------------------------------------------------------------------- */
+static void rna_def_nodetree_link_api(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ RNA_def_property_srna(cprop, "NodeLinks");
+ srna= RNA_def_struct(brna, "NodeLinks", NULL);
+ RNA_def_struct_sdna(srna, "bNodeTree");
+ RNA_def_struct_ui_text(srna, "Node Links", "Collection of Node Links");
+
+ func= RNA_def_function(srna, "new", "rna_NodeTree_link_new");
+ RNA_def_function_ui_description(func, "Add a node link to this node tree.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "input", "NodeSocket", "", "The input socket.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_pointer(func, "output", "NodeSocket", "", "The output socket.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ /* return */
+ parm= RNA_def_pointer(func, "link", "NodeLink", "", "New node link.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "remove", "rna_NodeTree_link_remove");
+ RNA_def_function_ui_description(func, "remove a node link from the node tree.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "link", "NodeLink", "", "The node link to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+}
+
+static void rna_def_composite_nodetree_api(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ RNA_def_property_srna(cprop, "CompositorNodes");
+ srna= RNA_def_struct(brna, "CompositorNodes", NULL);
+ RNA_def_struct_sdna(srna, "bNodeTree");
+ RNA_def_struct_ui_text(srna, "Compositor Nodes", "Collection of Compositor Nodes");
+
+ func= RNA_def_function(srna, "new", "rna_NodeTree_node_composite_new");
+ RNA_def_function_ui_description(func, "Add a node to this node tree.");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+ parm= RNA_def_enum(func, "type", compositor_node_type_items, 0, "Type", "Type of node to add");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_pointer(func, "group", "NodeTree", "", "The group tree");
+ /* return value */
+ parm= RNA_def_pointer(func, "node", "Node", "", "New node.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "remove", "rna_NodeTree_node_remove");
+ RNA_def_function_ui_description(func, "remove a node from this node tree.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "node", "Node", "", "The node to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+}
+
+static void rna_def_shader_nodetree_api(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ RNA_def_property_srna(cprop, "ShaderNodes");
+ srna= RNA_def_struct(brna, "ShaderNodes", NULL);
+ RNA_def_struct_sdna(srna, "bNodeTree");
+ RNA_def_struct_ui_text(srna, "Shader Nodes", "Collection of Shader Nodes");
+
+ func= RNA_def_function(srna, "new", "rna_NodeTree_node_new");
+ RNA_def_function_ui_description(func, "Add a node to this node tree.");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+ parm= RNA_def_enum(func, "type", shader_node_type_items, 0, "Type", "Type of node to add");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_pointer(func, "group", "NodeTree", "", "The group tree");
+ /* return value */
+ parm= RNA_def_pointer(func, "node", "Node", "", "New node.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "remove", "rna_NodeTree_node_remove");
+ RNA_def_function_ui_description(func, "remove a node from this node tree.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "node", "Node", "", "The node to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+}
+
+static void rna_def_texture_nodetree_api(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ RNA_def_property_srna(cprop, "TextureNodes");
+ srna= RNA_def_struct(brna, "TextureNodes", NULL);
+ RNA_def_struct_sdna(srna, "bNodeTree");
+ RNA_def_struct_ui_text(srna, "Texture Nodes", "Collection of Texture Nodes");
+
+ func= RNA_def_function(srna, "new", "rna_NodeTree_node_texture_new");
+ RNA_def_function_ui_description(func, "Add a node to this node tree.");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+ parm= RNA_def_enum(func, "type", texture_node_type_items, 0, "Type", "Type of node to add");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_pointer(func, "group", "NodeTree", "", "The group tree");
+ /* return value */
+ parm= RNA_def_pointer(func, "node", "Node", "", "New node.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "remove", "rna_NodeTree_node_remove");
+ RNA_def_function_ui_description(func, "remove a node from this node tree.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "node", "Node", "", "The node to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+}
+
static void rna_def_node_socket(BlenderRNA *brna)
{
StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem node_socket_type_items[] = {
+ {SOCK_VALUE, "VALUE", 0, "Value", ""},
+ {SOCK_VECTOR, "VECTOR", 0, "Vector", ""},
+ {SOCK_RGBA, "RGBA", 0, "RGBA", ""},
+ {0, NULL, 0, NULL, NULL}};
srna = RNA_def_struct(brna, "NodeSocket", NULL);
RNA_def_struct_ui_text(srna, "Node Socket", "Input or output socket of a node");
@@ -2170,24 +2486,43 @@ static void rna_def_node_socket(BlenderRNA *brna)
RNA_def_struct_ui_icon(srna, ICON_PLUG);
RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
+ prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Name", "Socket name");
+ RNA_def_struct_name_property(srna, prop);
+
+ /* can add back if there is any use in reading them */
+#if 0
+ prop = RNA_def_property(srna, "min", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "ns.min");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Minimum Value", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+
+ prop = RNA_def_property(srna, "max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "ns.max");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Maximum Value", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+#endif
+
+ prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_enum_items(prop, node_socket_type_items);
+ RNA_def_property_ui_text(prop, "Type", "Node Socket type");
}
static void rna_def_node_socket_value(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
-
- srna = RNA_def_struct(brna, "ValueNodeSocket", NULL);
+
+ srna = RNA_def_struct(brna, "ValueNodeSocket", "NodeSocket");
RNA_def_struct_ui_text(srna, "Value Node Socket", "Input or output socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_ui_icon(srna, ICON_PLUG);
RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
-
- prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Name", "Socket name");
- RNA_def_struct_name_property(srna, prop);
-
+
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ns.vec");
RNA_def_property_array(prop, 1);
@@ -2200,18 +2535,13 @@ static void rna_def_node_socket_vector(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
-
- srna = RNA_def_struct(brna, "VectorNodeSocket", NULL);
+
+ srna = RNA_def_struct(brna, "VectorNodeSocket", "NodeSocket");
RNA_def_struct_ui_text(srna, "Vector Node Socket", "Input or output socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_ui_icon(srna, ICON_PLUG);
RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
-
- prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Name", "Socket name");
- RNA_def_struct_name_property(srna, prop);
-
+
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "ns.vec");
RNA_def_property_array(prop, 3);
@@ -2224,18 +2554,13 @@ static void rna_def_node_socket_rgba(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
-
- srna = RNA_def_struct(brna, "RGBANodeSocket", NULL);
+
+ srna = RNA_def_struct(brna, "RGBANodeSocket", "NodeSocket");
RNA_def_struct_ui_text(srna, "RGBA Node Socket", "Input or output socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_ui_icon(srna, ICON_PLUG);
RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
-
- prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Name", "Socket name");
- RNA_def_struct_name_property(srna, prop);
-
+
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "ns.vec");
RNA_def_property_array(prop, 4);
@@ -2266,7 +2591,8 @@ static void rna_def_node(BlenderRNA *brna)
prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_ui_text(prop, "Name", "Node name");
RNA_def_struct_name_property(srna, prop);
- RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update_name");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Node_name_set");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
prop = RNA_def_property(srna, "inputs", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "inputs", NULL);
@@ -2279,31 +2605,152 @@ static void rna_def_node(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Outputs", "");
}
+static void rna_def_node_link(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "NodeLink", NULL);
+ RNA_def_struct_ui_text(srna, "NodeLink", "Link between nodes in a node tree");
+ RNA_def_struct_sdna(srna, "bNodeLink");
+ RNA_def_struct_ui_icon(srna, ICON_NODE);
+
+ prop = RNA_def_property(srna, "from_node", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "fromnode");
+ RNA_def_property_struct_type(prop, "Node");
+ RNA_def_property_ui_text(prop, "From node", "");
+
+ prop = RNA_def_property(srna, "to_node", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "tonode");
+ RNA_def_property_struct_type(prop, "Node");
+ RNA_def_property_ui_text(prop, "To node", "");
+
+ prop = RNA_def_property(srna, "from_socket", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "fromsock");
+ RNA_def_property_struct_type(prop, "NodeSocket");
+ RNA_def_property_ui_text(prop, "From socket", "");
+
+ prop = RNA_def_property(srna, "to_socket", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "tosock");
+ RNA_def_property_struct_type(prop, "NodeSocket");
+ RNA_def_property_ui_text(prop, "To socket", "");
+}
+
static void rna_def_nodetree(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
+ /* FunctionRNA *func; */
+ /* PropertyRNA *parm; */
+
+ static EnumPropertyItem nodetree_type_items[] = {
+ {NTREE_SHADER, "SHADER", 0, "Shader", ""},
+ {NTREE_COMPOSIT, "COMPOSITE", 0, "Composite", ""},
+ {NTREE_TEXTURE, "TEXTURE", 0, "Texture", ""},
+ {0, NULL, 0, NULL, NULL}};
srna = RNA_def_struct(brna, "NodeTree", "ID");
RNA_def_struct_ui_text(srna, "Node Tree", "Node tree consisting of linked nodes used for materials, textures and compositing");
RNA_def_struct_sdna(srna, "bNodeTree");
RNA_def_struct_ui_icon(srna, ICON_NODETREE);
-
+ RNA_def_struct_refine_func(srna, "rna_NodeTree_refine");
+
/* AnimData */
rna_def_animdata_common(srna);
- /* Nodes Collection */
- prop = RNA_def_property(srna, "nodes", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_collection_sdna(prop, NULL, "nodes", NULL);
- RNA_def_property_struct_type(prop, "Node");
- RNA_def_property_ui_text(prop, "Nodes", "");
-
+ /* NodeLinks Collection */
+ prop = RNA_def_property(srna, "links", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "links", NULL);
+ RNA_def_property_struct_type(prop, "NodeLink");
+ RNA_def_property_ui_text(prop, "Links", "");
+ rna_def_nodetree_link_api(brna, prop);
+
/* Grease Pencil */
prop= RNA_def_property(srna, "grease_pencil", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "gpd");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "GreasePencil");
RNA_def_property_ui_text(prop, "Grease Pencil Data", "Grease Pencil datablock");
+
+ /* these are too much like operators, better to have data level access
+ * ngroup = bpy.data.node_groups.new()
+ * ngroup.nodes.new(....) etc. */
+#if 0
+ func= RNA_def_function(srna, "group_add", "nodeMakeGroupFromSelected");
+ RNA_def_function_ui_description(func, "Make a group from the active nodes.");
+ /* return */
+ parm= RNA_def_pointer(func, "group", "Node", "", "New group.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "ungroup", "nodeGroupUnGroup");
+ RNA_def_function_ui_description(func, "Ungroup node group");
+ parm= RNA_def_pointer(func, "group", "Node", "", "The group to ungroup.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_int(func, "bool", 0, 0, 1, "Bool", "", 0, 1);
+ RNA_def_function_return(func, parm);
+#endif
+
+ prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_enum_items(prop, nodetree_type_items);
+ RNA_def_property_ui_text(prop, "Type", "Node Tree type");
+}
+
+static void rna_def_composite_nodetree(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "CompositorNodeTree", "NodeTree");
+ RNA_def_struct_ui_text(srna, "Compositor Node Tree", "Node tree consisting of linked nodes used for compositing");
+ RNA_def_struct_sdna(srna, "bNodeTree");
+ RNA_def_struct_ui_icon(srna, ICON_NODETREE);
+
+ /* Nodes Collection */
+ prop = RNA_def_property(srna, "nodes", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "nodes", NULL);
+ RNA_def_property_struct_type(prop, "Node");
+ RNA_def_property_ui_text(prop, "Nodes", "");
+
+ rna_def_composite_nodetree_api(brna, prop);
+}
+
+static void rna_def_shader_nodetree(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "ShaderNodeTree", "NodeTree");
+ RNA_def_struct_ui_text(srna, "Shader Node Tree", "Node tree consisting of linked nodes used for materials");
+ RNA_def_struct_sdna(srna, "bNodeTree");
+ RNA_def_struct_ui_icon(srna, ICON_NODETREE);
+
+ /* Nodes Collection */
+ prop = RNA_def_property(srna, "nodes", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "nodes", NULL);
+ RNA_def_property_struct_type(prop, "Node");
+ RNA_def_property_ui_text(prop, "Nodes", "");
+
+ rna_def_shader_nodetree_api(brna, prop);
+}
+
+static void rna_def_texture_nodetree(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "TextureNodeTree", "NodeTree");
+ RNA_def_struct_ui_text(srna, "Texture Node Tree", "Node tree consisting of linked nodes used for textures");
+ RNA_def_struct_sdna(srna, "bNodeTree");
+ RNA_def_struct_ui_icon(srna, ICON_NODETREE);
+
+ /* Nodes Collection */
+ prop = RNA_def_property(srna, "nodes", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "nodes", NULL);
+ RNA_def_property_struct_type(prop, "Node");
+ RNA_def_property_ui_text(prop, "Nodes", "");
+
+ rna_def_texture_nodetree_api(brna, prop);
}
static void define_specific_node(BlenderRNA *brna, int id, void (*func)(StructRNA*))
@@ -2323,10 +2770,13 @@ void RNA_def_nodetree(BlenderRNA *brna)
rna_def_node_socket_vector(brna);
rna_def_node_socket_rgba(brna);
rna_def_node(brna);
+ rna_def_node_link(brna);
rna_def_shader_node(brna);
rna_def_compositor_node(brna);
rna_def_texture_node(brna);
-
+ rna_def_composite_nodetree(brna);
+ rna_def_shader_nodetree(brna);
+ rna_def_texture_nodetree(brna);
#define DefNode(Category, ID, DefFunc, EnumName, StructName, UIName, UIDesc) \
define_specific_node(brna, ID, DefFunc);
diff --git a/source/blender/makesrna/intern/rna_nodetree_types.h b/source/blender/makesrna/intern/rna_nodetree_types.h
index f824f6f20ce..e74680280f8 100644
--- a/source/blender/makesrna/intern/rna_nodetree_types.h
+++ b/source/blender/makesrna/intern/rna_nodetree_types.h
@@ -71,13 +71,13 @@ DefNode( CompositorNode, CMP_NODE_COMPOSITE, 0, "COMPO
DefNode( CompositorNode, CMP_NODE_OUTPUT_FILE, def_cmp_output_file, "OUTPUT_FILE", OutputFile, "Output File", "" )
DefNode( CompositorNode, CMP_NODE_TEXTURE, def_texture, "TEXTURE", Texture, "Texture", "" )
DefNode( CompositorNode, CMP_NODE_TRANSLATE, 0, "TRANSLATE", Translate, "Translate", "" )
-DefNode( CompositorNode, CMP_NODE_ZCOMBINE, 0, "ZCOMBINE", Zcombine, "Z Combine", "" )
+DefNode( CompositorNode, CMP_NODE_ZCOMBINE, def_cmp_zcombine, "ZCOMBINE", Zcombine, "Z Combine", "" )
DefNode( CompositorNode, CMP_NODE_COMBRGBA, 0, "COMBRGBA", CombRGBA, "Combine RGBA", "" )
DefNode( CompositorNode, CMP_NODE_DILATEERODE, def_cmp_dilate_erode, "DILATEERODE", DilateErode, "Dilate/Erode", "" )
DefNode( CompositorNode, CMP_NODE_ROTATE, def_cmp_rotate, "ROTATE", Rotate, "Rotate", "" )
DefNode( CompositorNode, CMP_NODE_SCALE, def_cmp_scale, "SCALE", Scale, "Scale", "" )
-DefNode( CompositorNode, CMP_NODE_SEPYCCA, 0, "SEPYCCA", SepYCCA, "Separate YCCA", "" )
-DefNode( CompositorNode, CMP_NODE_COMBYCCA, 0, "COMBYCCA", CombYCCA, "Combine YCCA", "" )
+DefNode( CompositorNode, CMP_NODE_SEPYCCA, def_cmp_ycc, "SEPYCCA", SepYCCA, "Separate YCCA", "" )
+DefNode( CompositorNode, CMP_NODE_COMBYCCA, def_cmp_ycc, "COMBYCCA", CombYCCA, "Combine YCCA", "" )
DefNode( CompositorNode, CMP_NODE_SEPYUVA, 0, "SEPYUVA", SepYUVA, "Separate YUVA", "" )
DefNode( CompositorNode, CMP_NODE_COMBYUVA, 0, "COMBYUVA", CombYUVA, "Combine YUVA", "" )
DefNode( CompositorNode, CMP_NODE_DIFF_MATTE, def_cmp_diff_matte, "DIFF_MATTE", DiffMatte, "Difference Key", "" )
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index 3938f4c1538..d1c184441b6 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -34,12 +34,16 @@
#include "DNA_action_types.h"
#include "DNA_customdata_types.h"
#include "DNA_controller_types.h"
+#include "DNA_group_types.h"
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
#include "DNA_object_force.h"
#include "DNA_object_types.h"
#include "DNA_property_types.h"
#include "DNA_scene_types.h"
+#include "DNA_meta_types.h"
+
+#include "BKE_group.h" /* needed for object_in_group() */
#include "BLO_sys_types.h" /* needed for intptr_t used in ED_mesh.h */
#include "ED_mesh.h"
@@ -80,17 +84,25 @@ static EnumPropertyItem collision_bounds_items[] = {
//{OB_DYN_MESH, "DYNAMIC_MESH", 0, "Dynamic Mesh", ""},
{0, NULL, 0, NULL, NULL}};
+EnumPropertyItem metaelem_type_items[] = {
+ {MB_BALL, "BALL", ICON_META_BALL, "Ball", ""},
+ {MB_TUBE, "CAPSULE", ICON_META_CAPSULE, "Capsule", ""},
+ {MB_PLANE, "PLANE", ICON_META_PLANE, "Plane", ""},
+ {MB_ELIPSOID, "ELLIPSOID", ICON_META_ELLIPSOID, "Ellipsoid", ""}, // NOTE: typo at original definition!
+ {MB_CUBE, "CUBE", ICON_META_CUBE, "Cube", ""},
+ {0, NULL, 0, NULL, NULL}};
+
/* used for 2 enums */
#define OBTYPE_CU_CURVE {OB_CURVE, "CURVE", 0, "Curve", ""}
#define OBTYPE_CU_SURF {OB_SURF, "SURFACE", 0, "Surface", ""}
-#define OBTYPE_CU_TEXT {OB_FONT, "TEXT", 0, "Text", ""}
+#define OBTYPE_CU_FONT {OB_FONT, "FONT", 0, "Font", ""}
EnumPropertyItem object_type_items[] = {
{OB_MESH, "MESH", 0, "Mesh", ""},
OBTYPE_CU_CURVE,
OBTYPE_CU_SURF,
{OB_MBALL, "META", 0, "Meta", ""},
- OBTYPE_CU_TEXT,
+ OBTYPE_CU_FONT,
{0, "", 0, NULL, NULL},
{OB_ARMATURE, "ARMATURE", 0, "Armature", ""},
{OB_LATTICE, "LATTICE", 0, "Lattice", ""},
@@ -103,15 +115,17 @@ EnumPropertyItem object_type_items[] = {
EnumPropertyItem object_type_curve_items[] = {
OBTYPE_CU_CURVE,
OBTYPE_CU_SURF,
- OBTYPE_CU_TEXT,
+ OBTYPE_CU_FONT,
{0, NULL, 0, NULL, NULL}};
-
+
+
#ifdef RNA_RUNTIME
#include "BLI_math.h"
#include "DNA_key_types.h"
#include "DNA_constraint_types.h"
+#include "DNA_lattice_types.h"
#include "BKE_armature.h"
#include "BKE_bullet.h"
@@ -138,12 +152,13 @@ EnumPropertyItem object_type_curve_items[] = {
static void rna_Object_internal_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- DAG_id_flush_update(ptr->id.data, OB_RECALC_OB);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_OB);
}
static void rna_Object_matrix_world_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- object_apply_mat4(ptr->id.data, ((Object *)ptr->id.data)->obmat);
+ /* dont use compat so we get predictable rotation */
+ object_apply_mat4(ptr->id.data, ((Object *)ptr->id.data)->obmat, FALSE, TRUE);
rna_Object_internal_update(bmain, scene, ptr);
}
@@ -177,12 +192,25 @@ static void rna_Object_matrix_local_set(PointerRNA *ptr, const float values[16])
copy_m4_m4(ob->obmat, (float(*)[4])values);
}
- object_apply_mat4(ob, ob->obmat);
+ /* dont use compat so we get predictable rotation */
+ object_apply_mat4(ob, ob->obmat, FALSE, FALSE);
+}
+
+static void rna_Object_matrix_basis_get(PointerRNA *ptr, float values[16])
+{
+ Object *ob= ptr->id.data;
+ object_to_mat4(ob, (float(*)[4])values);
+}
+
+static void rna_Object_matrix_basis_set(PointerRNA *ptr, const float values[16])
+{
+ Object *ob= ptr->id.data;
+ object_apply_mat4(ob, (float(*)[4])values, FALSE, FALSE);
}
void rna_Object_internal_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_DRAW, ptr->id.data);
}
@@ -214,7 +242,7 @@ void rna_Object_active_shape_update(Main *bmain, Scene *scene, PointerRNA *ptr)
static void rna_Object_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- DAG_id_flush_update(ptr->id.data, OB_RECALC_OB);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_OB);
DAG_scene_sort(bmain, scene);
WM_main_add_notifier(NC_OBJECT|ND_PARENT, ptr->id.data);
}
@@ -402,6 +430,20 @@ static void rna_Object_parent_bone_set(PointerRNA *ptr, const char *value)
ED_object_parent(ob, ob->parent, ob->partype, value);
}
+static void rna_Object_dup_group_set(PointerRNA *ptr, PointerRNA value)
+{
+ Object *ob= (Object *)ptr->data;
+ Group *grp = (Group *)value.data;
+
+ /* must not let this be set if the object belongs in this group already,
+ * thus causing a cycle/infinite-recursion leading to crashes on load [#25298]
+ */
+ if (object_in_group(ob, grp) == 0)
+ ob->dup_group = grp;
+ else
+ BKE_report(NULL, RPT_ERROR, "Cannot set dupli-group as object belongs in group being instanced thus causing a cycle");
+}
+
static int rna_VertexGroup_index_get(PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
@@ -546,11 +588,12 @@ static void rna_Object_active_material_index_range(PointerRNA *ptr, int *min, in
*max= MAX2(ob->totcol-1, 0);
}
+/* returns active base material */
static PointerRNA rna_Object_active_material_get(PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
Material *ma;
-
+
ma= (ob->totcol)? give_current_material(ob, ob->actcol): NULL;
return rna_pointer_inherit_refine(ptr, &RNA_Material, ma);
}
@@ -559,6 +602,7 @@ static void rna_Object_active_material_set(PointerRNA *ptr, PointerRNA value)
{
Object *ob= (Object*)ptr->id.data;
+ DAG_id_tag_update(value.data, 0);
assign_material(ob, value.data, ob->actcol);
}
@@ -769,6 +813,12 @@ static void rna_MaterialSlot_name_get(PointerRNA *ptr, char *str)
strcpy(str, "");
}
+static void rna_MaterialSlot_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ rna_Object_internal_update(bmain, scene, ptr);
+ WM_main_add_notifier(NC_OBJECT|ND_OB_SHADING, ptr->id.data);
+}
+
/* why does this have to be so complicated?, can't all this crap be
* moved to in BGE conversion function? - Campbell *
*
@@ -813,7 +863,7 @@ static void rna_GameObjectSettings_physics_type_set(PointerRNA *ptr, int value)
switch (ob->body_type) {
case OB_BODY_TYPE_SENSOR:
ob->gameflag |= OB_SENSOR|OB_COLLISION|OB_GHOST;
- ob->gameflag &= ~(OB_OCCLUDER|OB_NAVMESH|OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_ACTOR|OB_ANISOTROPIC_FRICTION|OB_DO_FH|OB_ROT_FH|OB_COLLISION_RESPONSE);
+ ob->gameflag &= ~(OB_OCCLUDER|OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_ACTOR|OB_ANISOTROPIC_FRICTION|OB_DO_FH|OB_ROT_FH|OB_COLLISION_RESPONSE|OB_NAVMESH);
break;
case OB_BODY_TYPE_OCCLUDER:
ob->gameflag |= OB_OCCLUDER;
@@ -1048,7 +1098,7 @@ static void rna_Object_constraints_remove(Object *object, ReportList *reports, b
WM_main_add_notifier(NC_OBJECT|ND_CONSTRAINT, object);
}
-static ModifierData *rna_Object_modifier_new(Object *object, bContext *C, ReportList *reports, char *name, int type)
+static ModifierData *rna_Object_modifier_new(Object *object, bContext *C, ReportList *reports, const char *name, int type)
{
return ED_object_modifier_add(reports, CTX_data_main(C), CTX_data_scene(C), object, name, type);
}
@@ -1066,15 +1116,65 @@ static void rna_Object_boundbox_get(PointerRNA *ptr, float *values)
memcpy(values, bb->vec, sizeof(bb->vec));
}
else {
- memset(values, -1.0f, sizeof(bb->vec));
+ fill_vn(values, sizeof(bb->vec)/sizeof(float), 0.0f);
}
}
-static void rna_Object_add_vertex_to_group(Object *ob, int index_len, int *index, bDeformGroup *def, float weight, int assignmode)
+static bDeformGroup *rna_Object_vgroup_new(Object *ob, const char *name)
+{
+ bDeformGroup *defgroup = ED_vgroup_add_name(ob, name);
+
+ WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
+
+ return defgroup;
+}
+
+static void rna_Object_vgroup_remove(Object *ob, bDeformGroup *defgroup)
+{
+ ED_vgroup_delete(ob, defgroup);
+
+ WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
+}
+
+static void rna_VertexGroup_vertex_add(ID *id, bDeformGroup *def, ReportList *reports, int index_len, int *index, float weight, int assignmode)
{
+ Object *ob = (Object *)id;
+
+ if(ED_vgroup_object_is_edit_mode(ob)) {
+ BKE_reportf(reports, RPT_ERROR, "VertexGroup.add(): Can't be called while object is in edit mode.");
+ return;
+ }
+
+ while(index_len--)
+ ED_vgroup_vert_add(ob, def, *index++, weight, assignmode); /* XXX, not efficient calling within loop*/
+
+ WM_main_add_notifier(NC_GEOM|ND_DATA, (ID *)ob->data);
+}
+
+static void rna_VertexGroup_vertex_remove(ID *id, bDeformGroup *dg, ReportList *reports, int index_len, int *index)
+{
+ Object *ob = (Object *)id;
+
+ if(ED_vgroup_object_is_edit_mode(ob)) {
+ BKE_reportf(reports, RPT_ERROR, "VertexGroup.remove(): Can't be called while object is in edit mode.");
+ return;
+ }
+
while(index_len--)
- ED_vgroup_vert_add(ob, def, *index++, weight, assignmode);
+ ED_vgroup_vert_remove(ob, dg, *index++);
+
+ WM_main_add_notifier(NC_GEOM|ND_DATA, (ID *)ob->data);
+}
+
+static float rna_VertexGroup_weight(ID *id, bDeformGroup *dg, ReportList *reports, int index)
+{
+ float weight = ED_vgroup_vert_weight((Object *)id, dg, index);
+
+ if(weight < 0) {
+ BKE_reportf(reports, RPT_ERROR, "Vertex not in group");
+ }
+ return weight;
}
/* generic poll functions */
@@ -1105,10 +1205,20 @@ int rna_Camera_object_poll(PointerRNA *ptr, PointerRNA value)
#else
+static int rna_matrix_dimsize_4x4[]= {4, 4};
+
static void rna_def_vertex_group(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
+ FunctionRNA *func;
+
+ static EnumPropertyItem assign_mode_items[] = {
+ {WEIGHT_REPLACE, "REPLACE", 0, "Replace", "Replace"},
+ {WEIGHT_ADD, "ADD", 0, "Add", "Add"},
+ {WEIGHT_SUBTRACT, "SUBTRACT", 0, "Subtract", "Subtract"},
+ {0, NULL, 0, NULL, NULL}
+ };
srna= RNA_def_struct(brna, "VertexGroup", NULL);
RNA_def_struct_sdna(srna, "bDeformGroup");
@@ -1118,12 +1228,38 @@ static void rna_def_vertex_group(BlenderRNA *brna)
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_ui_text(prop, "Name", "Vertex group name");
RNA_def_struct_name_property(srna, prop);
- RNA_def_property_update(prop, NC_GEOM|ND_DATA|NA_RENAME, NULL);
+ RNA_def_property_update(prop, NC_GEOM|ND_DATA|NA_RENAME, "rna_Object_internal_update_data"); /* update data because modifiers may use [#24761] */
prop= RNA_def_property(srna, "index", PROP_INT, PROP_UNSIGNED);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_int_funcs(prop, "rna_VertexGroup_index_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Index", "Index number of the vertex group");
+
+ func= RNA_def_function(srna, "add", "rna_VertexGroup_vertex_add");
+ RNA_def_function_ui_description(func, "Add vertices to the group.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS|FUNC_USE_SELF_ID);
+ /* TODO, see how array size of 0 works, this shouldnt be used */
+ prop= RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List.", 0, 0);
+ RNA_def_property_flag(prop, PROP_DYNAMIC|PROP_REQUIRED);
+ prop= RNA_def_float(func, "weight", 0, 0.0f, 1.0f, "", "Vertex weight.", 0.0f, 1.0f);
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+ prop= RNA_def_enum(func, "type", assign_mode_items, 0, "", "Vertex assign mode.");
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+
+ func= RNA_def_function(srna, "remove", "rna_VertexGroup_vertex_remove");
+ RNA_def_function_ui_description(func, "Remove a vertex from the group.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS|FUNC_USE_SELF_ID);
+ /* TODO, see how array size of 0 works, this shouldnt be used */
+ prop= RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List.", 0, 0);
+ RNA_def_property_flag(prop, PROP_DYNAMIC|PROP_REQUIRED);
+
+ func= RNA_def_function(srna, "weight", "rna_VertexGroup_weight");
+ RNA_def_function_ui_description(func, "Get a vertex weight from the group.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS|FUNC_USE_SELF_ID);
+ prop=RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "The index of the vertex.", 0, INT_MAX);
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+ prop= RNA_def_float(func, "weight", 0, 0.0f, 1.0f, "", "Vertex weight.", 0.0f, 1.0f);
+ RNA_def_function_return(func, prop);
}
static void rna_def_material_slot(BlenderRNA *brna)
@@ -1149,13 +1285,13 @@ static void rna_def_material_slot(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_pointer_funcs(prop, "rna_MaterialSlot_material_get", "rna_MaterialSlot_material_set", NULL, NULL);
RNA_def_property_ui_text(prop, "Material", "Material datablock used by this material slot");
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_MaterialSlot_update");
prop= RNA_def_property(srna, "link", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, link_items);
RNA_def_property_enum_funcs(prop, "rna_MaterialSlot_link_get", "rna_MaterialSlot_link_set", NULL);
RNA_def_property_ui_text(prop, "Link", "Link material to object or the object's data");
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_MaterialSlot_update");
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_string_funcs(prop, "rna_MaterialSlot_name_get", "rna_MaterialSlot_name_length", NULL);
@@ -1355,7 +1491,7 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "obstacleRad");
RNA_def_property_range(prop, 0.0, 1000.0);
RNA_def_property_ui_text(prop, "Obstacle Radius", "Radius of object representation in obstacle simulation");
-
+
/* state */
prop= RNA_def_property(srna, "states_visible", PROP_BOOLEAN, PROP_LAYER_MEMBER);
@@ -1510,13 +1646,6 @@ static void rna_def_object_particle_systems(BlenderRNA *brna, PropertyRNA *cprop
/* object.vertex_groups */
static void rna_def_object_vertex_groups(BlenderRNA *brna, PropertyRNA *cprop)
{
- static EnumPropertyItem assign_mode_items[] = {
- {WEIGHT_REPLACE, "REPLACE", 0, "Replace", "Replace"},
- {WEIGHT_ADD, "ADD", 0, "Add", "Add"},
- {WEIGHT_SUBTRACT, "SUBTRACT", 0, "Subtract", "Subtract"},
- {0, NULL, 0, NULL, NULL}
- };
-
StructRNA *srna;
PropertyRNA *prop;
@@ -1543,24 +1672,16 @@ static void rna_def_object_vertex_groups(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_update(prop, NC_GEOM|ND_DATA, "rna_Object_internal_update_data");
/* vertex groups */ // add_vertex_group
- func= RNA_def_function(srna, "new", "ED_vgroup_add_name");
+ func= RNA_def_function(srna, "new", "rna_Object_vgroup_new");
RNA_def_function_ui_description(func, "Add vertex group to object.");
- parm= RNA_def_string(func, "name", "Group", 0, "", "Vertex group name."); /* optional */
+ RNA_def_string(func, "name", "Group", 0, "", "Vertex group name."); /* optional */
parm= RNA_def_pointer(func, "group", "VertexGroup", "", "New vertex group.");
RNA_def_function_return(func, parm);
- func= RNA_def_function(srna, "assign", "rna_Object_add_vertex_to_group");
- RNA_def_function_ui_description(func, "Add vertex to a vertex group.");
- /* TODO, see how array size of 0 works, this shouldnt be used */
- parm= RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List.", 0, 0);
- RNA_def_property_flag(parm, PROP_DYNAMIC);
- RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_pointer(func, "group", "VertexGroup", "", "Vertex group to add vertex to.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_float(func, "weight", 0, 0.0f, 1.0f, "", "Vertex weight.", 0.0f, 1.0f);
- RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_enum(func, "type", assign_mode_items, 0, "", "Vertex assign mode.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ func= RNA_def_function(srna, "remove", "rna_Object_vgroup_remove");
+ RNA_def_function_ui_description(func, "Delete vertex group from object.");
+ parm= RNA_def_pointer(func, "group", "VertexGroup", "", "Vertex group to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
@@ -1569,23 +1690,10 @@ static void rna_def_object(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- static EnumPropertyItem object_type_items[] = {
- {OB_EMPTY, "EMPTY", 0, "Empty", ""},
- {OB_MESH, "MESH", 0, "Mesh", ""},
- {OB_CURVE, "CURVE", 0, "Curve", ""},
- {OB_SURF, "SURFACE", 0, "Surface", ""},
- {OB_FONT, "TEXT", 0, "Text", ""},
- {OB_MBALL, "META", 0, "Meta", ""},
- {OB_LAMP, "LAMP", 0, "Lamp", ""},
- {OB_CAMERA, "CAMERA", 0, "Camera", ""},
- {OB_LATTICE, "LATTICE", 0, "Lattice", ""},
- {OB_ARMATURE, "ARMATURE", 0, "Armature", ""},
- {0, NULL, 0, NULL, NULL}};
-
static EnumPropertyItem empty_drawtype_items[] = {
+ {OB_PLAINAXES, "PLAIN_AXES", 0, "Plain Axes", ""},
{OB_ARROWS, "ARROWS", 0, "Arrows", ""},
{OB_SINGLE_ARROW, "SINGLE_ARROW", 0, "Single Arrow", ""},
- {OB_PLAINAXES, "PLAIN_AXES", 0, "Plain Axes", ""},
{OB_CIRCLE, "CIRCLE", 0, "Circle", ""},
{OB_CUBE, "CUBE", 0, "Cube", ""},
{OB_EMPTY_SPHERE, "SPHERE", 0, "Sphere", ""},
@@ -1647,8 +1755,7 @@ static void rna_def_object(BlenderRNA *brna)
static float default_quat[4] = {1,0,0,0}; /* default quaternion values */
static float default_axisAngle[4] = {0,0,1,0}; /* default axis-angle rotation values */
static float default_scale[3] = {1,1,1}; /* default scale values */
- int matrix_dimsize[]= {4, 4};
- int boundbox_dimsize[]= {8, 3};
+ static int boundbox_dimsize[]= {8, 3};
srna= RNA_def_struct(brna, "Object", "ID");
RNA_def_struct_ui_text(srna, "Object", "Object datablock defining an object in a scene");
@@ -1659,7 +1766,7 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "ID");
RNA_def_property_pointer_funcs(prop, NULL, "rna_Object_data_set", "rna_Object_data_typef", NULL);
RNA_def_property_editable_func(prop, "rna_Object_data_editable");
- RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_flag(prop, PROP_EDITABLE|PROP_NEVER_UNLINK);
RNA_def_property_ui_text(prop, "Data", "Object data");
RNA_def_property_update(prop, 0, "rna_Object_internal_update_data");
@@ -1693,7 +1800,7 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_multi_array(prop, 2, boundbox_dimsize);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_float_funcs(prop, "rna_Object_boundbox_get", NULL, NULL);
- RNA_def_property_ui_text(prop, "Bound Box", "Objects bound box in object-space coordinates");
+ RNA_def_property_ui_text(prop, "Bound Box", "Objects bound box in object-space coordinates, all values are -1.0 when not available.");
/* parent */
prop= RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
@@ -1755,14 +1862,14 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_pointer_funcs(prop, "rna_Object_active_material_get", "rna_Object_active_material_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Active Material", "Active material being displayed");
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_MaterialSlot_update");
prop= RNA_def_property(srna, "active_material_index", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "actcol");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_int_funcs(prop, "rna_Object_active_material_index_get", "rna_Object_active_material_index_set", "rna_Object_active_material_index_range");
RNA_def_property_ui_text(prop, "Active Material Index", "Index of active material slot");
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
/* transform */
prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
@@ -1884,16 +1991,25 @@ static void rna_def_object(BlenderRNA *brna)
/* matrix */
prop= RNA_def_property(srna, "matrix_world", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "obmat");
- RNA_def_property_multi_array(prop, 2, matrix_dimsize);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Matrix World", "Worldspace transformation matrix");
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_matrix_world_update");
prop= RNA_def_property(srna, "matrix_local", PROP_FLOAT, PROP_MATRIX);
- RNA_def_property_multi_array(prop, 2, matrix_dimsize);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Local Matrix", "Parent relative transformation matrix");
RNA_def_property_float_funcs(prop, "rna_Object_matrix_local_get", "rna_Object_matrix_local_set", NULL);
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, NULL);
+ prop= RNA_def_property(srna, "matrix_basis", PROP_FLOAT, PROP_MATRIX);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_ui_text(prop, "Input Matrix", "Matrix access to location, rotation and scale (including deltas), before constraints and parenting are applied.");
+ RNA_def_property_float_funcs(prop, "rna_Object_matrix_basis_get", "rna_Object_matrix_basis_set", NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update");
+
/* collections */
prop= RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "Constraint");
@@ -2031,6 +2147,7 @@ static void rna_def_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "dupli_group", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "dup_group");
RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Object_dup_group_set", NULL, NULL);
RNA_def_property_ui_text(prop, "Dupli Group", "Instance an existing group");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_dependency_update");
@@ -2135,7 +2252,7 @@ static void rna_def_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "show_transparent", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_DRAWTRANSP);
- RNA_def_property_ui_text(prop, "Draw Transparent", "Enables transparent materials for the object (Mesh only)");
+ RNA_def_property_ui_text(prop, "Draw Transparent", "Displays material transparency in the object");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
prop= RNA_def_property(srna, "show_x_ray", PROP_BOOLEAN, PROP_NONE);
@@ -2162,7 +2279,7 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Pose", "Current pose for armatures");
/* shape keys */
- prop= RNA_def_property(srna, "show_shape_key", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_only_shape_key", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shapeflag", OB_SHAPE_LOCK);
RNA_def_property_ui_text(prop, "Shape Key Lock", "Always show the current Shape for this Object");
RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1);
@@ -2206,12 +2323,14 @@ static void rna_def_dupli_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "matrix_original", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "omat");
- RNA_def_property_array(prop, 16);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Object Matrix", "The original matrix of this object before it was duplicated");
prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "mat");
- RNA_def_property_array(prop, 16);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Object Duplicate Matrix", "Object duplicate transformation matrix");
/* TODO: DupliObject has more properties that can be wrapped */
diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c
index d48e714ea23..468a97f5269 100644
--- a/source/blender/makesrna/intern/rna_object_api.c
+++ b/source/blender/makesrna/intern/rna_object_api.c
@@ -56,6 +56,7 @@
#include "BKE_displist.h"
#include "BKE_font.h"
#include "BKE_mball.h"
+#include "BKE_modifier.h"
#include "BLI_math.h"
@@ -166,6 +167,8 @@ static Mesh *rna_Object_create_mesh(Object *ob, ReportList *reports, Scene *sce,
/* Copy materials to new mesh */
switch (ob->type) {
case OB_SURF:
+ case OB_FONT:
+ case OB_CURVE:
tmpmesh->totcol = tmpcu->totcol;
/* free old material list (if it exists) and adjust user counts */
@@ -261,49 +264,7 @@ static void rna_Object_free_duplilist(Object *ob, ReportList *reports)
}
}
-/* copied from old API Object.makeDisplayList (Object.c)
- * use _ suffix because this exists for internal rna */
-static void rna_Object_update(Object *ob, Scene *sce, int object, int data, int time)
-{
- int flag= 0;
-
- if (ob->type == OB_FONT) {
- Curve *cu = ob->data;
- freedisplist(&cu->disp);
- BKE_text_to_curve(sce, ob, CU_LEFT);
- }
-
- if(object) flag |= OB_RECALC_OB;
- if(data) flag |= OB_RECALC_DATA;
- if(time) flag |= OB_RECALC_TIME;
-
- DAG_id_flush_update(&ob->id, flag);
-}
-
-static Object *rna_Object_find_armature(Object *ob)
-{
- Object *ob_arm = NULL;
-
- if (ob->type != OB_MESH) return NULL;
-
- if (ob->parent && ob->partype == PARSKEL && ob->parent->type == OB_ARMATURE) {
- ob_arm = ob->parent;
- }
- else {
- ModifierData *mod = (ModifierData*)ob->modifiers.first;
- while (mod) {
- if (mod->type == eModifierType_Armature) {
- ob_arm = ((ArmatureModifierData*)mod)->object;
- }
-
- mod = mod->next;
- }
- }
-
- return ob_arm;
-}
-
-static PointerRNA rna_Object_add_shape_key(Object *ob, bContext *C, ReportList *reports, char *name, int from_mix)
+static PointerRNA rna_Object_shape_key_add(Object *ob, bContext *C, ReportList *reports, const char *name, int from_mix)
{
Scene *scene= CTX_data_scene(C);
KeyBlock *kb= NULL;
@@ -365,7 +326,7 @@ static void rna_Mesh_assign_verts_to_group(Object *ob, bDeformGroup *group, int
void rna_Object_ray_cast(Object *ob, ReportList *reports, float ray_start[3], float ray_end[3], float r_location[3], float r_normal[3], int *index)
{
- BVHTreeFromMesh treeData;
+ BVHTreeFromMesh treeData= {0};
if(ob->derivedFinal==NULL) {
BKE_reportf(reports, RPT_ERROR, "object \"%s\" has no mesh data to be used for ray casting.", ob->id.name+2);
@@ -447,17 +408,17 @@ void RNA_api_object(StructRNA *srna)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
/* Armature */
- func= RNA_def_function(srna, "find_armature", "rna_Object_find_armature");
+ func= RNA_def_function(srna, "find_armature", "modifiers_isDeformedByArmature");
RNA_def_function_ui_description(func, "Find armature influencing this object as a parent or via a modifier.");
parm= RNA_def_pointer(func, "ob_arm", "Object", "", "Armature object influencing this object or NULL.");
RNA_def_function_return(func, parm);
/* Shape key */
- func= RNA_def_function(srna, "add_shape_key", "rna_Object_add_shape_key");
+ func= RNA_def_function(srna, "shape_key_add", "rna_Object_shape_key_add");
RNA_def_function_ui_description(func, "Add shape key to an object.");
RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
- parm= RNA_def_string(func, "name", "Key", 0, "", "Unique name for the new keylock."); /* optional */
- parm= RNA_def_boolean(func, "from_mix", 1, "", "Create new shape from existing mix of shapes.");
+ RNA_def_string(func, "name", "Key", 0, "", "Unique name for the new keylock."); /* optional */
+ RNA_def_boolean(func, "from_mix", 1, "", "Create new shape from existing mix of shapes.");
parm= RNA_def_pointer(func, "key", "ShapeKey", "", "New shape keyblock.");
RNA_def_property_flag(parm, PROP_RNAPTR);
RNA_def_function_return(func, parm);
@@ -484,16 +445,6 @@ void RNA_api_object(StructRNA *srna)
parm= RNA_def_int(func, "index", 0, 0, 0, "", "The face index, -1 when no intersection is found.", 0, 0);
RNA_def_function_output(func, parm);
-
- /* DAG */
- func= RNA_def_function(srna, "update", "rna_Object_update");
- RNA_def_function_ui_description(func, "Tag the object to update its display data.");
- parm= RNA_def_pointer(func, "scene", "Scene", "", "");
- RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
- RNA_def_boolean(func, "object", 1, "", "Tag the object for updating");
- RNA_def_boolean(func, "data", 1, "", "Tag the objects display data for updating");
- RNA_def_boolean(func, "time", 1, "", "Tag the object time related data for updating");
-
/* View */
func= RNA_def_function(srna, "is_visible", "rna_Object_is_visible");
RNA_def_function_ui_description(func, "Determine if object is visible in a given scene.");
diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c
index 3a8f66a3773..fb8617bc626 100644
--- a/source/blender/makesrna/intern/rna_object_force.c
+++ b/source/blender/makesrna/intern/rna_object_force.c
@@ -110,15 +110,19 @@ static void rna_Cache_change(Main *bmain, Scene *scene, PointerRNA *ptr)
BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
for(pid=pidlist.first; pid; pid=pid->next) {
if(pid->cache==cache)
break;
}
- if(pid)
+ if(pid) {
+ /* Just make sure this wasn't changed. */
+ if(pid->type == PTCACHE_TYPE_SMOKE_DOMAIN)
+ cache->step = 1;
BKE_ptcache_update_info(pid);
+ }
BLI_freelistN(&pidlist);
}
@@ -140,8 +144,11 @@ static void rna_Cache_toggle_disk_cache(Main *bmain, Scene *scene, PointerRNA *p
break;
}
- if(pid)
+ /* smoke can only use disk cache */
+ if(pid && pid->type != PTCACHE_TYPE_SMOKE_DOMAIN)
BKE_ptcache_toggle_disk_cache(pid);
+ else
+ cache->flag ^= PTCACHE_DISK_CACHE;
BLI_freelistN(&pidlist);
}
@@ -153,7 +160,6 @@ static void rna_Cache_idname_change(Main *bmain, Scene *scene, PointerRNA *ptr)
PTCacheID *pid = NULL, *pid2= NULL;
ListBase pidlist;
int new_name = 1;
- char name[80];
if(!ob)
return;
@@ -171,11 +177,9 @@ static void rna_Cache_idname_change(Main *bmain, Scene *scene, PointerRNA *ptr)
if(!pid)
return;
- cache->flag |= (PTCACHE_BAKED|PTCACHE_DISK_CACHE|PTCACHE_SIMULATION_VALID);
- cache->flag &= ~(PTCACHE_OUTDATED|PTCACHE_FRAMES_SKIPPED);
-
BKE_ptcache_load_external(pid);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else {
for(pid=pidlist.first; pid; pid=pid->next) {
@@ -190,19 +194,13 @@ static void rna_Cache_idname_change(Main *bmain, Scene *scene, PointerRNA *ptr)
if(new_name) {
if(pid2 && cache->flag & PTCACHE_DISK_CACHE) {
- /* TODO: change to simple file rename */
- strcpy(name, cache->name);
- strcpy(cache->name, cache->prev_name);
-
- cache->flag &= ~PTCACHE_DISK_CACHE;
+ char old_name[80];
+ char new_name[80];
- BKE_ptcache_toggle_disk_cache(pid2);
+ strcpy(old_name, cache->prev_name);
+ strcpy(new_name, cache->name);
- strcpy(cache->name, name);
-
- cache->flag |= PTCACHE_DISK_CACHE;
-
- BKE_ptcache_toggle_disk_cache(pid2);
+ BKE_ptcache_disk_cache_rename(pid2, old_name, new_name);
}
strcpy(cache->prev_name, cache->name);
@@ -482,7 +480,7 @@ static void rna_FieldSettings_update(Main *bmain, Scene *scene, PointerRNA *ptr)
part->pd2->tex= 0;
}
- DAG_id_flush_update(&part->id, OB_RECALC_ALL|PSYS_RECALC_RESET);
+ DAG_id_tag_update(&part->id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME|PSYS_RECALC_RESET);
WM_main_add_notifier(NC_OBJECT|ND_DRAW, NULL);
}
@@ -494,7 +492,7 @@ static void rna_FieldSettings_update(Main *bmain, Scene *scene, PointerRNA *ptr)
ob->pd->tex= 0;
}
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
}
}
@@ -524,7 +522,7 @@ static void rna_FieldSettings_shape_update(Main *bmain, Scene *scene, PointerRNA
static void rna_FieldSettings_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
if(particle_id_check(ptr)) {
- DAG_id_flush_update((ID*)ptr->id.data, OB_RECALC_ALL|PSYS_RECALC_RESET);
+ DAG_id_tag_update((ID*)ptr->id.data, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME|PSYS_RECALC_RESET);
}
else {
Object *ob= (Object*)ptr->id.data;
@@ -541,9 +539,9 @@ static void rna_FieldSettings_dependency_update(Main *bmain, Scene *scene, Point
DAG_scene_sort(bmain, scene);
if(ob->type == OB_CURVE && ob->pd->forcefield == PFIELD_GUIDE)
- DAG_id_flush_update(&ob->id, OB_RECALC_ALL);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME);
else
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
}
@@ -575,7 +573,7 @@ static char *rna_FieldSettings_path(PointerRNA *ptr)
static void rna_EffectorWeight_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- DAG_id_flush_update((ID*)ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update((ID*)ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_main_add_notifier(NC_OBJECT|ND_DRAW, NULL);
}
@@ -584,7 +582,7 @@ static void rna_EffectorWeight_dependency_update(Main *bmain, Scene *scene, Poin
{
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update((ID*)ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update((ID*)ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_main_add_notifier(NC_OBJECT|ND_DRAW, NULL);
}
@@ -651,7 +649,7 @@ static void rna_CollisionSettings_update(Main *bmain, Scene *scene, PointerRNA *
{
Object *ob= (Object*)ptr->id.data;
- DAG_id_flush_update(&ob->id, OB_RECALC_ALL);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME);
WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
}
@@ -659,7 +657,7 @@ static void rna_softbody_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ob);
}
@@ -720,6 +718,12 @@ static void rna_def_pointcache(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
+ static EnumPropertyItem point_cache_compress_items[] = {
+ {PTCACHE_COMPRESS_NO, "NO", 0, "No", "No compression"},
+ {PTCACHE_COMPRESS_LZO, "LIGHT", 0, "Light", "Fast but not so effective compression"},
+ {PTCACHE_COMPRESS_LZMA, "HEAVY", 0, "Heavy", "Effective but slow compression"},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "PointCache", NULL);
RNA_def_struct_ui_text(srna, "Point Cache", "Point cache for physics simulations");
RNA_def_struct_ui_icon(srna, ICON_PHYSICS);
@@ -747,6 +751,11 @@ static void rna_def_pointcache(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Cache Index", "Index number of cache files");
RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
+ prop= RNA_def_property(srna, "compression", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, point_cache_compress_items);
+ RNA_def_property_ui_text(prop, "Cache Compression", "Compression method to be used");
+ RNA_def_property_update(prop, 0, NULL);
+
/* flags */
prop= RNA_def_property(srna, "is_baked", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_BAKED);
@@ -1439,7 +1448,7 @@ static void rna_def_softbody(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
- int matrix_dimsize[]= {3, 3};
+ const int matrix_dimsize[]= {3, 3};
static EnumPropertyItem collision_type_items[] = {
@@ -1552,20 +1561,20 @@ static void rna_def_softbody(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Damp", "Edge spring friction");
RNA_def_property_update(prop, 0, "rna_softbody_update");
- prop= RNA_def_property(srna, "spring_length", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "springpreload");
+ prop= RNA_def_property(srna, "spring_length", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "springpreload");
RNA_def_property_range(prop, 0.0f, 200.0f);
RNA_def_property_ui_text(prop, "SL", "Alter spring length to shrink/blow up (unit %) 0 to disable");
RNA_def_property_update(prop, 0, "rna_softbody_update");
- prop= RNA_def_property(srna, "aero", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "aeroedge");
+ prop= RNA_def_property(srna, "aero", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "aeroedge");
RNA_def_property_range(prop, 0.0f, 30000.0f);
RNA_def_property_ui_text(prop, "Aero", "Make edges 'sail'");
RNA_def_property_update(prop, 0, "rna_softbody_update");
- prop= RNA_def_property(srna, "plastic", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "plastic");
+ prop= RNA_def_property(srna, "plastic", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "plastic");
RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_text(prop, "Plastic", "Permanent deform");
RNA_def_property_update(prop, 0, "rna_softbody_update");
diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c
index 1151215f5f7..14afbf93373 100644
--- a/source/blender/makesrna/intern/rna_particle.c
+++ b/source/blender/makesrna/intern/rna_particle.c
@@ -95,6 +95,9 @@ EnumPropertyItem part_hair_ren_as_items[] = {
#ifdef RNA_RUNTIME
+#include "BLI_math.h"
+#include "BLI_listbase.h"
+
#include "BKE_context.h"
#include "BKE_cloth.h"
#include "BKE_deform.h"
@@ -104,9 +107,6 @@ EnumPropertyItem part_hair_ren_as_items[] = {
#include "BKE_particle.h"
#include "BKE_pointcache.h"
-#include "BLI_math.h"
-#include "BLI_listbase.h"
-
/* use for object space hair get/set */
static void rna_ParticleHairKey_location_object_info(PointerRNA *ptr, ParticleSystemModifierData **psmd_pt, ParticleData **pa_pt)
{
@@ -201,10 +201,10 @@ static void particle_recalc(Main *bmain, Scene *scene, PointerRNA *ptr, short fl
psys->recalc = flag;
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
}
else
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA|flag);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA|flag);
WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL);
}
@@ -279,7 +279,7 @@ static void rna_Particle_target_reset(Main *bmain, Scene *scene, PointerRNA *ptr
psys->recalc = PSYS_RECALC_RESET;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
DAG_scene_sort(bmain, scene);
}
@@ -295,13 +295,14 @@ static void rna_Particle_target_redo(Main *bmain, Scene *scene, PointerRNA *ptr)
psys->recalc = PSYS_RECALC_REDO;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL);
}
}
static void rna_Particle_hair_dynamics(Main *bmain, Scene *scene, PointerRNA *ptr)
{
+ Object *ob = (Object*)ptr->id.data;
ParticleSystem *psys = (ParticleSystem*)ptr->data;
if(psys && !psys->clmd) {
@@ -313,6 +314,8 @@ static void rna_Particle_hair_dynamics(Main *bmain, Scene *scene, PointerRNA *pt
}
else
WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL);
+
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
static PointerRNA rna_particle_settings_get(PointerRNA *ptr)
{
@@ -325,15 +328,21 @@ static PointerRNA rna_particle_settings_get(PointerRNA *ptr)
static void rna_particle_settings_set(PointerRNA *ptr, PointerRNA value)
{
ParticleSystem *psys= (ParticleSystem*)ptr->data;
+ int old_type = 0;
+
- if(psys->part)
+ if(psys->part) {
+ old_type = psys->part->type;
psys->part->id.us--;
+ }
psys->part = (ParticleSettings *)value.data;
if(psys->part) {
psys->part->id.us++;
psys_check_boid_data(psys);
+ if(old_type != psys->part->type)
+ psys->recalc |= PSYS_RECALC_TYPE;
}
}
static void rna_Particle_abspathtime_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -378,6 +387,18 @@ static void rna_PartSettings_end_set(struct PointerRNA *ptr, float value)
settings->end = value;
}
+static void rna_PartSetting_hairlength_set(struct PointerRNA *ptr, float value)
+{
+ ParticleSettings *settings = (ParticleSettings*)ptr->data;
+ settings->normfac = value / 4.f;
+}
+
+static float rna_PartSetting_hairlength_get(struct PointerRNA *ptr)
+{
+ ParticleSettings *settings = (ParticleSettings*)ptr->data;
+ return settings->normfac * 4.f;
+}
+
static void rna_PartSetting_linelentail_set(struct PointerRNA *ptr, float value)
{
ParticleSettings *settings = (ParticleSettings*)ptr->data;
@@ -414,6 +435,14 @@ static float rna_PartSetting_linelenhead_get(struct PointerRNA *ptr)
return settings->draw_line[1];
}
+
+static int rna_PartSettings_is_fluid_get(PointerRNA *ptr)
+{
+ ParticleSettings *part= (ParticleSettings*)ptr->data;
+
+ return part->type == PART_FLUID;
+}
+
static PointerRNA rna_ParticleSystem_active_particle_target_get(PointerRNA *ptr)
{
ParticleSystem *psys= (ParticleSystem*)ptr->data;
@@ -512,6 +541,27 @@ static void rna_ParticleTarget_name_get(PointerRNA *ptr, char *str)
else
strcpy(str, "Invalid target!");
}
+
+static int particle_id_check(PointerRNA *ptr)
+{
+ ID *id= ptr->id.data;
+
+ return (GS(id->name) == ID_PA);
+}
+
+static char *rna_SPHFluidSettings_path(PointerRNA *ptr)
+{
+ SPHFluidSettings *fluid = (SPHFluidSettings *)ptr->data;
+
+ if(particle_id_check(ptr)) {
+ ParticleSettings *part = (ParticleSettings*)ptr->id.data;
+
+ if (part->fluid == fluid)
+ return BLI_sprintfN("fluid");
+ }
+ return NULL;
+}
+
static int rna_ParticleSystem_multiple_caches_get(PointerRNA *ptr)
{
ParticleSystem *psys= (ParticleSystem*)ptr->data;
@@ -697,6 +747,12 @@ static void psys_vg_name_set__internal(PointerRNA *ptr, const char *value, int i
}
}
+static char *rna_ParticleSystem_path(PointerRNA *ptr)
+{
+ ParticleSystem *psys= (ParticleSystem*)ptr->data;
+ return BLI_sprintfN("particle_systems[\"%s\"]", psys->name);
+}
+
/* irritating string functions for each index :/ */
static void rna_ParticleVGroup_name_get_0(PointerRNA *ptr, char *value) { psys_vg_name_get__internal(ptr, value, 0); }
static void rna_ParticleVGroup_name_get_1(PointerRNA *ptr, char *value) { psys_vg_name_get__internal(ptr, value, 1); }
@@ -863,7 +919,7 @@ static void rna_def_particle(BlenderRNA *brna)
/* Hair & Keyed Keys */
- prop= RNA_def_property(srna, "is_hair", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "hair", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "hair", "totkey");
RNA_def_property_struct_type(prop, "ParticleHairKey");
RNA_def_property_ui_text(prop, "Hair", "");
@@ -936,7 +992,7 @@ static void rna_def_particle_dupliweight(BlenderRNA *brna)
RNA_def_struct_name_property(srna, prop);
prop= RNA_def_property(srna, "count", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_range(prop, 0, INT_MAX);
+ RNA_def_property_range(prop, 0, SHRT_MAX);
RNA_def_property_ui_text(prop, "Count", "The number of times this object is repeated with respect to other objects");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
}
@@ -947,64 +1003,94 @@ static void rna_def_fluid_settings(BlenderRNA *brna)
PropertyRNA *prop;
srna = RNA_def_struct(brna, "SPHFluidSettings", NULL);
+ RNA_def_struct_path_func(srna, "rna_SPHFluidSettings_path");
RNA_def_struct_ui_text(srna, "SPH Fluid Settings", "Settings for particle fluids physics");
/* Fluid settings */
prop= RNA_def_property(srna, "spring_force", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "spring_k");
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Spring", "Spring force constant");
- RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ RNA_def_property_range(prop, 0.0f, 100.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Spring Force", "Spring force");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "fluid_radius", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "radius");
- RNA_def_property_range(prop, 0.0f, 2.0f);
- RNA_def_property_ui_text(prop, "Radius", "Fluid interaction Radius");
+ RNA_def_property_range(prop, 0.0f, 20.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 2.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Interaction Radius", "Fluid interaction radius");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ /* Hidden in ui to give a little easier user experience. */
prop= RNA_def_property(srna, "rest_length", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "rest_length");
RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Rest Length", "The Spring Rest Length (factor of interaction radius)");
- RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ RNA_def_property_ui_text(prop, "Rest Length", "Spring rest length (factor of interaction radius)");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "use_viscoelastic_springs", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SPH_VISCOELASTIC_SPRINGS);
+ RNA_def_property_ui_text(prop, "Viscoelastic Springs", "Use viscoelastic springs instead of Hooke's springs");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "use_initial_rest_length", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SPH_CURRENT_REST_LENGTH);
+ RNA_def_property_ui_text(prop, "Initial Rest Length", "Use the initial length as spring rest length instead of interaction radius/2");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "plasticity", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "plasticity_constant");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Plasticity", "How much the spring rest length can change after the elastic limit is crossed");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "yield_ratio", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "yield_ratio");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Elastic Limit", "How much the spring has to be stretched/compressed in order to change it's rest length");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* Viscosity */
- prop= RNA_def_property(srna, "viscosity_omega", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "linear_viscosity", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "viscosity_omega");
RNA_def_property_range(prop, 0.0f, 100.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
RNA_def_property_ui_text(prop, "Viscosity", "Linear viscosity");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "viscosity_beta", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "square_viscosity", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "viscosity_beta");
RNA_def_property_range(prop, 0.0f, 100.0f);
- RNA_def_property_ui_text(prop, "Square viscosity", "Square viscosity factor");
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Square viscosity", "Square viscosity");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* Double density relaxation */
- prop= RNA_def_property(srna, "stiffness", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "density_force", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "stiffness_k");
RNA_def_property_range(prop, 0.0f, 100.0f);
- RNA_def_property_ui_text(prop, "Stiffness ", "Constant K - Stiffness");
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Density Force", "How strongly the fluid tends to rest density");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "stiffness_near", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "repulsion_force", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "stiffness_knear");
RNA_def_property_range(prop, 0.0f, 100.0f);
- RNA_def_property_ui_text(prop, "Repulsion", "Repulsion factor: stiffness_knear");
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Repulsion", "How strongly the fluid tries to keep from clustering");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "rest_density", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rest_density");
- RNA_def_property_range(prop, 0.0f, 100.0f);
- RNA_def_property_ui_text(prop, "Rest Density", "Density");
+ RNA_def_property_range(prop, 0.0f, 1000.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Rest Density", "Rest density of the fluid");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* Buoyancy */
prop= RNA_def_property(srna, "buoyancy", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "buoyancy");
RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Buoyancy", "");
+ RNA_def_property_ui_text(prop, "Buoyancy", "Artificial buoyancy force in negative gravity direction based on pressure differences inside the fluid");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
}
@@ -1066,8 +1152,8 @@ static void rna_def_particle_settings(BlenderRNA *brna)
static EnumPropertyItem child_type_items[] = {
{0, "NONE", 0, "None", ""},
- {PART_CHILD_PARTICLES, "PARTICLES", 0, "Particles", ""},
- {PART_CHILD_FACES, "FACES", 0, "Faces", ""},
+ {PART_CHILD_PARTICLES, "SIMPLE", 0, "Simple", ""},
+ {PART_CHILD_FACES, "INTERPOLATED", 0, "Interpolated", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -1133,6 +1219,12 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Particle Settings", "Particle settings, reusable by multiple particle systems");
RNA_def_struct_ui_icon(srna, ICON_PARTICLE_DATA);
+ /* fluid particle type can't be checked from the type value in rna as it's not shown in the menu */
+ prop= RNA_def_property(srna, "is_fluid", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_PartSettings_is_fluid_get", NULL);
+ RNA_def_property_ui_text(prop, "Fluid", "Particles were created by a fluid simulation");
+
/* flag */
prop= RNA_def_property(srna, "use_react_start_end", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_REACT_STA_END);
@@ -1146,6 +1238,11 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Multi React", "React multiple times");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ prop= RNA_def_property(srna, "regrow_hair", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_HAIR_REGROW);
+ RNA_def_property_ui_text(prop, "Regrow", "Regrow hair for each frame");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
+
prop= RNA_def_property(srna, "show_unborn", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_UNBORN);
RNA_def_property_ui_text(prop, "Unborn", "Show particles before they are emitted");
@@ -1192,26 +1289,17 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Mass from Size", "Multiply mass by particle size");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ prop= RNA_def_property(srna, "use_advanced_hair", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", PART_HIDE_ADVANCED_HAIR);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_ui_text(prop, "Advanced", "Use full physics calculations for growing hair");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
prop= RNA_def_property(srna, "lock_boids_to_surface", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_BOIDS_2D);
RNA_def_property_ui_text(prop, "Boids 2D", "Constrain boids to a surface");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "use_branching", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_BRANCHING);
- RNA_def_property_ui_text(prop, "Branching", "Branch child paths from each other");
- RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
-
- prop= RNA_def_property(srna, "use_animate_branching", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_ANIM_BRANCHING);
- RNA_def_property_ui_text(prop, "Animated", "Animate branching");
- RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
-
- prop= RNA_def_property(srna, "use_symmetric_branching", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_SYMM_BRANCHING);
- RNA_def_property_ui_text(prop, "Symmetric", "Start and end points are the same");
- RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
-
prop= RNA_def_property(srna, "use_hair_bspline", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_HAIR_BSPLINE);
RNA_def_property_ui_text(prop, "B-Spline", "Interpolate hair using B-Splines");
@@ -1219,18 +1307,18 @@ static void rna_def_particle_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "invert_grid", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_GRID_INVERT);
- RNA_def_property_ui_text(prop, "Invert", "Invert what is considered object and what is not");
+ RNA_def_property_ui_text(prop, "Invert Grid", "Invert what is considered object and what is not");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "apply_effector_to_children", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_CHILD_EFFECT);
- RNA_def_property_ui_text(prop, "Children", "Apply effectors to children");
+ RNA_def_property_ui_text(prop, "Effect Children", "Apply effectors to children");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- //prop= RNA_def_property(srna, "child_seams", PROP_BOOLEAN, PROP_NONE);
- //RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_CHILD_SEAMS);
- //RNA_def_property_ui_text(prop, "Use seams", "Use seams to determine parents");
- //RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+ prop= RNA_def_property(srna, "create_long_hair_children", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_CHILD_LONG_HAIR);
+ RNA_def_property_ui_text(prop, "Long Hair", "Calculate children that suit long hair well");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "apply_guide_to_children", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_CHILD_GUIDE);
@@ -1390,7 +1478,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "draw_size", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 0, 1000);
- RNA_def_property_ui_range(prop, 1, 100, 1, 0);
+ RNA_def_property_ui_range(prop, 0, 100, 1, 0);
RNA_def_property_ui_text(prop, "Draw Size", "Size of particles on viewport in pixels (0=default)");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
@@ -1420,7 +1508,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
//TODO: not found in UI, readonly?
prop= RNA_def_property(srna, "keys_step", PROP_INT, PROP_NONE);
- RNA_def_property_range(prop, 0, INT_MAX);//TODO:min,max
+ RNA_def_property_range(prop, 0, SHRT_MAX);//TODO:min,max
RNA_def_property_ui_text(prop, "Keys Step", "");
/* adaptive path rendering */
@@ -1614,11 +1702,17 @@ static void rna_def_particle_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "grid_resolution", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "grid_res");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
- RNA_def_property_range(prop, 1, 46); /* ~100k particles in a cube */
- RNA_def_property_ui_range(prop, 1, 215, 1, 0); /* ~10M particles in a cube */
+ RNA_def_property_range(prop, 1, 250); /* ~15M particles in a cube (ouch!), but could be very usable in a plane */
+ RNA_def_property_ui_range(prop, 1, 50, 1, 0); /* ~100k particles in a cube */
RNA_def_property_ui_text(prop, "Resolution", "The resolution of the particle grid");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ prop= RNA_def_property(srna, "grid_random", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "grid_rand");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Grid Randomness", "Add random offset to the grid locations");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
/* initial velocity factors */
prop= RNA_def_property(srna, "normal_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "normfac");//optional if prop names are the same
@@ -1700,6 +1794,13 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Random Phase", "Randomize rotation phase");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ prop= RNA_def_property(srna, "hair_length", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_funcs(prop, "rna_PartSetting_hairlength_get", "rna_PartSetting_hairlength_set", NULL);
+ RNA_def_property_range(prop, 0.0f, 1000.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Hair Length", "Length of the hair");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
/* physical properties */
prop= RNA_def_property(srna, "mass", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.001f, 100000.0f);
@@ -1821,6 +1922,12 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Amplitude", "The amplitude of the offset");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+ prop= RNA_def_property(srna, "kink_amplitude_clump", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "kink_amp_clump");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Amplitude Clump", "How much clump effects kink amplitude");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
prop= RNA_def_property(srna, "kink_frequency", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "kink_freq");
RNA_def_property_range(prop, -100000.0f, 100000.0f);
@@ -1833,6 +1940,10 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Shape", "Adjust the offset to the beginning/end");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+ prop= RNA_def_property(srna, "kink_flat", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Flatness", "How flat the hairs are");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
/* rough */
prop= RNA_def_property(srna, "roughness_1", PROP_FLOAT, PROP_NONE);
@@ -1894,6 +2005,25 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Threshold", "Amount of particles left untouched by child path length");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+ /* parting */
+ prop= RNA_def_property(srna, "child_parting_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "parting_fac");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Parting Factor", "Create parting in the children based on parent strands");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
+ prop= RNA_def_property(srna, "child_parting_min", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "parting_min");
+ RNA_def_property_range(prop, 0.0f, 180.0f);
+ RNA_def_property_ui_text(prop, "Parting Minimum", "Minimum root to tip angle (tip distance/root distance for long hair)");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
+ prop= RNA_def_property(srna, "child_parting_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "parting_max");
+ RNA_def_property_range(prop, 0.0f, 180.0f);
+ RNA_def_property_ui_text(prop, "Parting Maximum", "Maximum root to tip angle (tip distance/root distance for long hair)");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
/* branching */
prop= RNA_def_property(srna, "branch_threshold", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "branch_thres");
@@ -1942,18 +2072,6 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_range(prop, 1.0f, 100.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Loop count", "Number of times the keys are looped");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
-
- /* boids */
- prop= RNA_def_property(srna, "boids", PROP_POINTER, PROP_NONE);
- RNA_def_property_struct_type(prop, "BoidSettings");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Boid Settings", "");
-
- /* Fluid particles */
- prop= RNA_def_property(srna, "fluid", PROP_POINTER, PROP_NONE);
- RNA_def_property_struct_type(prop, "SPHFluidSettings");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "SPH Fluid Settings", "");
/* draw objects & groups */
prop= RNA_def_property(srna, "dupli_group", PROP_POINTER, PROP_NONE);
@@ -1991,6 +2109,19 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Billboard Object", "Billboards face this object (default is active camera)");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
+ /* boids */
+ prop= RNA_def_property(srna, "boids", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "BoidSettings");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Boid Settings", "");
+
+ /* Fluid particles */
+ prop= RNA_def_property(srna, "fluid", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "SPHFluidSettings");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "SPH Fluid Settings", "");
+
+ /* Effector weights */
prop= RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "EffectorWeights");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -2109,6 +2240,10 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Seed", "Offset in the random number table, to get a different randomized result");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ prop= RNA_def_property(srna, "child_seed", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_ui_text(prop, "Child Seed", "Offset in the random number table for child particles, to get a different randomized result");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
/* hair */
prop= RNA_def_property(srna, "is_global_hair", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PSYS_GLOBAL_HAIR);
@@ -2136,7 +2271,7 @@ static void rna_def_particle_system(BlenderRNA *brna)
prop= RNA_def_property(srna, "reactor_target_particle_system", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "target_psys");
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_text(prop, "Reactor Target Particle System", "For reactor systems, index of particle system on the target object");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
@@ -2336,15 +2471,17 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_boolean_funcs(prop, "rna_ParticleSystem_edited_get", NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Edited", "Particle system has been edited in particle mode");
+
+
+ RNA_def_struct_path_func(srna, "rna_ParticleSystem_path");
}
void RNA_def_particle(BlenderRNA *brna)
{
rna_def_particle_target(brna);
-
+ rna_def_fluid_settings(brna);
rna_def_particle_hair_key(brna);
rna_def_particle_key(brna);
- rna_def_fluid_settings(brna);
rna_def_child_particle(brna);
rna_def_particle(brna);
diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c
index e4a3be023ca..709945c7891 100644
--- a/source/blender/makesrna/intern/rna_pose.c
+++ b/source/blender/makesrna/intern/rna_pose.c
@@ -70,7 +70,7 @@ static void rna_Pose_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
// XXX when to use this? ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
}
static void rna_Pose_IK_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -78,7 +78,7 @@ static void rna_Pose_IK_update(Main *bmain, Scene *scene, PointerRNA *ptr)
// XXX when to use this? ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
Object *ob= ptr->id.data;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
BIK_clear_data(ob->pose);
}
@@ -91,13 +91,13 @@ static void rna_BoneGroup_color_set_set(PointerRNA *ptr, int value)
{
bActionGroup *grp= ptr->data;
- /* if valid value, set the new enum value, then copy the relevant colours? */
+ /* if valid value, set the new enum value, then copy the relevant colors? */
if ((value >= -1) && (value < 21))
grp->customCol= value;
else
return;
- /* only do color copying if using a custom color (i.e. not default colour) */
+ /* only do color copying if using a custom color (i.e. not default color) */
if (grp->customCol) {
if (grp->customCol > 0) {
/* copy theme colors on-to group's custom color in case user tries to edit color */
@@ -162,7 +162,7 @@ static void rna_Pose_ik_solver_update(Main *bmain, Scene *scene, PointerRNA *ptr
object_test_constraints(ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
}
/* rotation - axis-angle */
@@ -271,7 +271,7 @@ static void rna_Itasc_update(Main *bmain, Scene *scene, PointerRNA *ptr)
itasc->maxvel = 100.f;
BIK_update_param(ob->pose);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
static void rna_Itasc_update_rebuild(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -283,6 +283,21 @@ static void rna_Itasc_update_rebuild(Main *bmain, Scene *scene, PointerRNA *ptr)
rna_Itasc_update(bmain, scene, ptr);
}
+static void rna_PoseChannel_bone_custom_set(PointerRNA *ptr, PointerRNA value)
+{
+ bPoseChannel *pchan = (bPoseChannel*)ptr->data;
+
+
+ if (pchan->custom) {
+ id_us_min(&pchan->custom->id);
+ pchan->custom = NULL;
+ }
+
+ pchan->custom = value.data;
+
+ id_us_plus(&pchan->custom->id);
+}
+
static PointerRNA rna_PoseChannel_bone_group_get(PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
@@ -532,25 +547,29 @@ static int rna_PoseChannel_rotation_4d_editable(PointerRNA *ptr, int index)
}
/* not essential, but much faster then the default lookup function */
-PointerRNA rna_PoseBones_lookup_string(PointerRNA *ptr, const char *key)
+int rna_PoseBones_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
{
- PointerRNA rptr;
bPose *pose= (bPose*)ptr->data;
bPoseChannel *pchan= get_pose_channel(pose, key);
- RNA_pointer_create(ptr->id.data, &RNA_PoseBone, pchan, &rptr);
- return rptr;
+ if(pchan) {
+ RNA_pointer_create(ptr->id.data, &RNA_PoseBone, pchan, r_ptr);
+ return TRUE;
+ }
+ else {
+ return FALSE;
+ }
}
-static void rna_PoseChannel_matrix_local_get(PointerRNA *ptr, float *values)
+static void rna_PoseChannel_matrix_basis_get(PointerRNA *ptr, float *values)
{
bPoseChannel *pchan= (bPoseChannel*)ptr->data;
pchan_to_mat4(pchan, (float (*)[4])values);
}
-static void rna_PoseChannel_matrix_local_set(PointerRNA *ptr, const float *values)
+static void rna_PoseChannel_matrix_basis_set(PointerRNA *ptr, const float *values)
{
bPoseChannel *pchan= (bPoseChannel*)ptr->data;
- pchan_apply_mat4(pchan, (float (*)[4])values);
+ pchan_apply_mat4(pchan, (float (*)[4])values, FALSE); /* no compat for predictable result */
}
#else
@@ -683,6 +702,8 @@ static void rna_def_pose_channel(BlenderRNA *brna)
static float default_axisAngle[4] = {0,0,1,0}; /* default axis-angle rotation values */
static float default_scale[3] = {1,1,1}; /* default scale values */
+ const int matrix_dimsize[]= {4, 4};
+
StructRNA *srna;
PropertyRNA *prop;
@@ -706,10 +727,6 @@ static void rna_def_pose_channel(BlenderRNA *brna)
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_struct_name_property(srna, prop);
- prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "selectflag", BONE_SELECTED);
- RNA_def_property_ui_text(prop, "Select", "");
-
/* Baked Bone Path cache data */
rna_def_motionpath_common(srna);
@@ -784,18 +801,22 @@ static void rna_def_pose_channel(BlenderRNA *brna)
/* transform matrices - should be read-only since these are set directly by AnimSys evaluation */
prop= RNA_def_property(srna, "matrix_channel", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "chan_mat");
- RNA_def_property_array(prop, 16);
+ RNA_def_property_multi_array(prop, 2, matrix_dimsize);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Channel Matrix", "4x4 matrix, before constraints");
- prop= RNA_def_property(srna, "matrix_local", PROP_FLOAT, PROP_MATRIX);
- RNA_def_property_array(prop, 16);
- RNA_def_property_ui_text(prop, "Local Matrix", "Matrix representing the parent relative location, scale and rotation. Provides an alternative access to these properties.");
- RNA_def_property_float_funcs(prop, "rna_PoseChannel_matrix_local_get", "rna_PoseChannel_matrix_local_set", NULL);
+ /* writable because it touches loc/scale/rot directly */
+ prop= RNA_def_property(srna, "matrix_basis", PROP_FLOAT, PROP_MATRIX);
+ RNA_def_property_multi_array(prop, 2, matrix_dimsize);
+ RNA_def_property_ui_text(prop, "Basis Matrix", "Provides an alternative access to loc/scale/rotation relative to the parent and own rest bone.");
+ RNA_def_property_float_funcs(prop, "rna_PoseChannel_matrix_basis_get", "rna_PoseChannel_matrix_basis_set", NULL);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+ /* final matrix */
prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "pose_mat");
- RNA_def_property_array(prop, 16);
+ RNA_def_property_multi_array(prop, 2, matrix_dimsize);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Pose Matrix", "Final 4x4 matrix for this channel");
@@ -954,6 +975,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
RNA_def_property_pointer_sdna(prop, NULL, "custom");
RNA_def_property_struct_type(prop, "Object");
RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_PoseChannel_bone_custom_set", NULL, NULL);
RNA_def_property_ui_text(prop, "Custom Object", "Object that defines custom draw type for this bone");
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
@@ -970,6 +992,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
prop= RNA_def_property(srna, "bone_group_index", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "agrp_index");
RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_int_funcs(prop, "rna_PoseChannel_bone_group_index_get", "rna_PoseChannel_bone_group_index_set", "rna_PoseChannel_bone_group_index_range");
RNA_def_property_ui_text(prop, "Bone Group Index", "Bone Group this pose channel belongs to (0=no group)");
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
diff --git a/source/blender/makesrna/intern/rna_property.c b/source/blender/makesrna/intern/rna_property.c
index 13f913b978b..b7ae1229c4a 100644
--- a/source/blender/makesrna/intern/rna_property.c
+++ b/source/blender/makesrna/intern/rna_property.c
@@ -154,7 +154,7 @@ void RNA_def_gameproperty(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "bProperty");
prop= RNA_def_property(srna, "value", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "data");
+ // RNA_def_property_float_sdna(prop, NULL, "data");
RNA_def_property_ui_text(prop, "Value", "Property value");
RNA_def_property_range(prop, -10000, 10000);
RNA_def_property_float_funcs(prop, "rna_GameFloatProperty_value_get", "rna_GameFloatProperty_value_set", NULL);
@@ -166,7 +166,7 @@ void RNA_def_gameproperty(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "bProperty");
prop= RNA_def_property(srna, "value", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "data");
+ // RNA_def_property_float_sdna(prop, NULL, "data");
RNA_def_property_ui_text(prop, "Value", "Property value");
RNA_def_property_range(prop, -10000, 10000);
RNA_def_property_float_funcs(prop, "rna_GameFloatProperty_value_get", "rna_GameFloatProperty_value_set", NULL);
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index e6b86ae8766..3d97e38e3a4 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -30,9 +30,10 @@
#include "rna_internal.h"
-
#include "RE_pipeline.h"
+#include "BKE_utildefines.h"
+
#ifdef RNA_RUNTIME
#include "MEM_guardedalloc.h"
@@ -42,12 +43,11 @@
#include "BKE_context.h"
#include "BKE_report.h"
-
/* RenderEngine */
static RenderEngineType internal_render_type = {
NULL, NULL, "BLENDER_RENDER", "Blender Render", RE_INTERNAL, NULL, {NULL, NULL, NULL, NULL}};
-#if GAMEBLENDER == 1
+#ifdef WITH_GAMEENGINE
static RenderEngineType internal_game_type = {
NULL, NULL, "BLENDER_GAME", "Blender Game", RE_INTERNAL|RE_GAME, NULL, {NULL, NULL, NULL, NULL}};
#endif
@@ -57,7 +57,7 @@ ListBase R_engines = {NULL, NULL};
void RE_engines_init()
{
BLI_addtail(&R_engines, &internal_render_type);
-#if GAMEBLENDER == 1
+#ifdef WITH_GAMEENGINE
BLI_addtail(&R_engines, &internal_game_type);
#endif
}
@@ -91,7 +91,7 @@ static void engine_render(RenderEngine *engine, struct Scene *scene)
RNA_parameter_list_create(&list, &ptr, func);
RNA_parameter_set_lookup(&list, "scene", &scene);
- engine->type->ext.call(&ptr, func, &list);
+ engine->type->ext.call(NULL, &ptr, func, &list);
RNA_parameter_list_free(&list);
}
@@ -108,7 +108,7 @@ static void rna_RenderEngine_unregister(const bContext *C, StructRNA *type)
RNA_struct_free(&BLENDER_RNA, type);
}
-static StructRNA *rna_RenderEngine_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_RenderEngine_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
RenderEngineType *et, dummyet = {0};
RenderEngine dummyengine= {0};
@@ -124,7 +124,7 @@ static StructRNA *rna_RenderEngine_register(const bContext *C, ReportList *repor
return NULL;
if(strlen(identifier) >= sizeof(dummyet.idname)) {
- BKE_reportf(reports, RPT_ERROR, "registering render engine class: '%s' is too long, maximum length is %d.", identifier, sizeof(dummyet.idname));
+ BKE_reportf(reports, RPT_ERROR, "registering render engine class: '%s' is too long, maximum length is %d.", identifier, (int)sizeof(dummyet.idname));
return NULL;
}
@@ -271,7 +271,7 @@ static void rna_def_render_engine(BlenderRNA *brna)
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->name");
@@ -334,7 +334,9 @@ static void rna_def_render_layer(BlenderRNA *brna)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
prop= RNA_def_string(func, "filename", "", 0, "Filename", "Filename to load into this render tile, must be no smaller then the renderlayer");
RNA_def_property_flag(prop, PROP_REQUIRED);
-
+ prop= RNA_def_int(func, "x", 0, 0, INT_MAX, "Offset X", "Offset the position to copy from if the image is larger then the render layer", 0, INT_MAX);
+ prop= RNA_def_int(func, "y", 0, 0, INT_MAX, "Offset Y", "Offset the position to copy from if the image is larger then the render layer", 0, INT_MAX);
+
RNA_define_verify_sdna(0);
rna_def_render_layer_common(srna, 0);
diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c
index 81b0df1d840..d0a4647efc3 100644
--- a/source/blender/makesrna/intern/rna_rna.c
+++ b/source/blender/makesrna/intern/rna_rna.c
@@ -54,6 +54,7 @@ EnumPropertyItem property_unit_items[] = {
#ifdef RNA_RUNTIME
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
/* Struct */
@@ -115,11 +116,12 @@ static int rna_idproperty_known(CollectionPropertyIterator *iter, void *data)
/* function to skip any id properties that are already known by RNA,
* for the second loop where we go over unknown id properties */
+ do {
+ for(prop= ptype->cont.properties.first; prop; prop=prop->next)
+ if((prop->flag & PROP_BUILTIN) == 0 && strcmp(prop->identifier, idprop->name) == 0)
+ return 1;
+ } while((ptype=ptype->base));
- for(prop= ptype->cont.properties.first; prop; prop=prop->next)
- if(strcmp(prop->identifier, idprop->name) == 0)
- return 1;
-
return 0;
}
@@ -299,13 +301,12 @@ PointerRNA rna_builtin_properties_get(CollectionPropertyIterator *iter)
return rna_Struct_properties_get(iter);
}
-PointerRNA rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key)
+int rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
{
StructRNA *srna;
PropertyRNA *prop;
- PointerRNA propptr;
+ PointerRNA propptr= {{0}};
- memset(&propptr, 0, sizeof(propptr));
srna= ptr->type;
do {
@@ -315,15 +316,20 @@ PointerRNA rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key
if(prop) {
propptr.type= &RNA_Property;
propptr.data= prop;
- return propptr;
+
+ *r_ptr= propptr;
+ return TRUE;
}
}
+ else {
+ for(prop=srna->cont.properties.first; prop; prop=prop->next) {
+ if(!(prop->flag & PROP_BUILTIN) && strcmp(prop->identifier, key)==0) {
+ propptr.type= &RNA_Property;
+ propptr.data= prop;
- for(prop=srna->cont.properties.first; prop; prop=prop->next) {
- if(!(prop->flag & PROP_BUILTIN) && strcmp(prop->identifier, key)==0) {
- propptr.type= &RNA_Property;
- propptr.data= prop;
- return propptr;
+ *r_ptr= propptr;
+ return TRUE;
+ }
}
}
} while((srna=srna->base));
@@ -342,13 +348,15 @@ PointerRNA rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key
if(strcmp(idp->name, key) == 0) {
propptr.type= &RNA_Property;
propptr.data= idp;
- return propptr;
+
+ *r_ptr= propptr;
+ return TRUE;
}
}
}
}
#endif
- return propptr;
+ return FALSE;
}
PointerRNA rna_builtin_type_get(PointerRNA *ptr)
@@ -474,6 +482,12 @@ static int rna_Property_is_never_none_get(PointerRNA *ptr)
return prop->flag & PROP_NEVER_NULL ? 1:0;
}
+static int rna_Property_is_hidden_get(PointerRNA *ptr)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ return prop->flag & PROP_HIDDEN ? 1:0;
+}
+
static int rna_Property_array_length_get(PointerRNA *ptr)
{
PropertyRNA *prop= (PropertyRNA*)ptr->data;
@@ -836,34 +850,29 @@ static int rna_BlenderRNA_structs_length(PointerRNA *ptr)
{
return BLI_countlist(&((BlenderRNA*)ptr->data)->structs);
}
-static PointerRNA rna_BlenderRNA_structs_lookup_int(PointerRNA *ptr, int index)
+static int rna_BlenderRNA_structs_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
{
StructRNA *srna= BLI_findlink(&((BlenderRNA*)ptr->data)->structs, index);
if(srna) {
- PointerRNA r_ptr;
- RNA_pointer_create(NULL, &RNA_Struct, srna, &r_ptr);
- return r_ptr;
+ RNA_pointer_create(NULL, &RNA_Struct, srna, r_ptr);
+ return TRUE;
}
else {
- return PointerRNA_NULL;
+ return FALSE;
}
}
-static PointerRNA rna_BlenderRNA_structs_lookup_string(PointerRNA *ptr, const char *key)
+static int rna_BlenderRNA_structs_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
{
StructRNA *srna= ((BlenderRNA*)ptr->data)->structs.first;
- for(; srna; srna=srna->cont.next)
- if(key[0] == srna->identifier[0] && strcmp(key, srna->identifier)==0)
- break;
-
- if(srna) {
- PointerRNA r_ptr;
- RNA_pointer_create(NULL, &RNA_Struct, srna, &r_ptr);
- return r_ptr;
- }
- else {
- return PointerRNA_NULL;
+ for(; srna; srna=srna->cont.next) {
+ if(key[0] == srna->identifier[0] && strcmp(key, srna->identifier)==0) {
+ RNA_pointer_create(NULL, &RNA_Struct, srna, r_ptr);
+ return TRUE;
+ }
}
+
+ return FALSE;
}
@@ -1011,6 +1020,11 @@ static void rna_def_property(BlenderRNA *brna)
RNA_def_property_boolean_funcs(prop, "rna_Property_is_never_none_get", NULL);
RNA_def_property_ui_text(prop, "Never None", "True when this value can't be set to None");
+ prop= RNA_def_property(srna, "is_hidden", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Property_is_hidden_get", NULL);
+ RNA_def_property_ui_text(prop, "Hidden", "True when the property is hidden");
+
prop= RNA_def_property(srna, "is_output", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_boolean_funcs(prop, "rna_Property_use_output_get", NULL);
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index e434fad5ff1..02665cf9b90 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -151,8 +151,14 @@ EnumPropertyItem image_type_items[] = {
#include "DNA_object_types.h"
#include "DNA_mesh_types.h"
+#include "RNA_access.h"
+
#include "MEM_guardedalloc.h"
+#include "BLI_threads.h"
+#include "BLI_editVert.h"
+#include "BLI_blenlib.h"
+
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_image.h"
@@ -167,10 +173,6 @@ EnumPropertyItem image_type_items[] = {
#include "BKE_screen.h"
#include "BKE_animsys.h"
-#include "BLI_threads.h"
-#include "BLI_editVert.h"
-#include "BLI_blenlib.h"
-
#include "WM_api.h"
#include "ED_info.h"
@@ -181,6 +183,21 @@ EnumPropertyItem image_type_items[] = {
#include "RE_pipeline.h"
+static int rna_Scene_object_bases_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
+{
+ Scene *scene= (Scene*)ptr->data;
+ Base *base;
+
+ for(base= scene->base.first; base; base= base->next) {
+ if(strncmp(base->object->id.name+2, key, sizeof(base->object->id.name)-2)==0) {
+ *r_ptr= rna_pointer_inherit_refine(ptr, &RNA_ObjectBase, base);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
static PointerRNA rna_Scene_objects_get(CollectionPropertyIterator *iter)
{
ListBaseIterator *internal= iter->internal;
@@ -209,7 +226,7 @@ static Base *rna_Scene_object_link(Scene *scene, bContext *C, ReportList *report
if(scene == scene_act)
ob->lay= base->lay;
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
/* slows down importers too much, run scene.update() */
/* DAG_scene_sort(G.main, scene); */
@@ -298,6 +315,12 @@ static void rna_Scene_view3d_update(Main *bmain, Scene *unused, PointerRNA *ptr)
BKE_screen_view3d_main_sync(&bmain->screen, scene);
}
+static void rna_Scene_framelen_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ scene->r.framelen= (float)scene->r.framapto/(float)scene->r.images;
+}
+
+
static void rna_Scene_current_frame_set(PointerRNA *ptr, int value)
{
Scene *data= (Scene*)ptr->data;
@@ -404,7 +427,7 @@ static int rna_Scene_active_keying_set_index_get(PointerRNA *ptr)
}
/* get KeyingSet index stuff for list of Keying Sets editing UI
- * - value+1 since 0 is reserved for 'none'=
+ * - value+1 since 0 is reserved for 'none'
*/
static void rna_Scene_active_keying_set_index_set(PointerRNA *ptr, int value)
{
@@ -710,7 +733,7 @@ static void rna_Scene_glsl_update(Main *bmain, Scene *unused, PointerRNA *ptr)
{
Scene *scene= (Scene*)ptr->id.data;
- DAG_id_flush_update(&scene->id, 0);
+ DAG_id_tag_update(&scene->id, 0);
}
static void rna_RenderSettings_color_management_update(Main *bmain, Scene *unused, PointerRNA *ptr)
@@ -859,10 +882,10 @@ static void object_simplify_update(Object *ob)
static void rna_Scene_use_simplify_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- Scene *sce;
+ Scene *sce_iter;
Base *base;
- for(SETLOOPER(scene, base))
+ for(SETLOOPER(scene, sce_iter, base))
object_simplify_update(base->object);
DAG_ids_flush_update(bmain, 0);
@@ -918,7 +941,7 @@ static void rna_GameSettings_auto_start_set(PointerRNA *ptr, int value)
}
-static TimeMarker *rna_TimeLine_add(Scene *scene, char name[])
+static TimeMarker *rna_TimeLine_add(Scene *scene, const char name[])
{
TimeMarker *marker = MEM_callocN(sizeof(TimeMarker), "TimeMarker");
marker->flag= SELECT;
@@ -940,7 +963,7 @@ static void rna_TimeLine_remove(Scene *scene, ReportList *reports, TimeMarker *m
MEM_freeN(marker);
}
-static KeyingSet *rna_Scene_keying_set_new(Scene *sce, ReportList *reports, char name[])
+static KeyingSet *rna_Scene_keying_set_new(Scene *sce, ReportList *reports, const char name[])
{
KeyingSet *ks= NULL;
@@ -964,7 +987,7 @@ static void rna_def_transform_orientation(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- int matrix_dimsize[]= {3, 3};
+ const int matrix_dimsize[]= {3, 3};
srna= RNA_def_struct(brna, "TransformOrientation", NULL);
@@ -1065,6 +1088,11 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Proportional Editing Falloff", "Falloff type for proportional editing mode");
RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
+ prop= RNA_def_property(srna, "proportional_size", PROP_FLOAT, PROP_DISTANCE);
+ RNA_def_property_float_sdna(prop, NULL, "proportional_size");
+ RNA_def_property_ui_text(prop, "Proportional Size", "Display size for proportional editing circle");
+ RNA_def_property_range(prop, 0.00001, 5000.0);
+
prop= RNA_def_property(srna, "normal_size", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "normalsize");
RNA_def_property_ui_text(prop, "Normal Size", "Display size for normals in the 3D view");
@@ -1108,10 +1136,16 @@ static void rna_def_tool_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_snap_project", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP_PROJECT);
- RNA_def_property_ui_text(prop, "Project Individual Elements", "Project vertices on the surface of other objects");
+ RNA_def_property_ui_text(prop, "Project Individual Elements", "Project individual elements on the surface of other objects");
RNA_def_property_ui_icon(prop, ICON_RETOPO, 0);
RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
-
+
+ /* Grease Pencil */
+ prop = RNA_def_property(srna, "use_grease_pencil_sessions", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "gpencil_flags", GP_TOOL_FLAG_PAINTSESSIONS_ON);
+ RNA_def_property_ui_text(prop, "Use Sketching Sessions", "Allow drawing multiple strokes at a time with Grease Pencil");
+ RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); // xxx: need toolbar to be redrawn...
+
/* Auto Keying */
prop= RNA_def_property(srna, "use_keyframe_insert_auto", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "autokey_mode", AUTOKEY_ON);
@@ -1126,7 +1160,12 @@ static void rna_def_tool_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_record_with_nla", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", ANIMRECORD_FLAG_WITHNLA);
RNA_def_property_ui_text(prop, "Layered", "Add a new NLA Track + Strip for every loop/pass made over the animation to allow non-destructive tweaking");
-
+
+ prop= RNA_def_property(srna, "use_keyframe_insert_keyingset", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", AUTOKEY_FLAG_ONLYKEYINGSET);
+ RNA_def_property_ui_text(prop, "Auto Keyframe Insert Keying Set", "Automatic keyframe insertion using active Keying Set only");
+ RNA_def_property_ui_icon(prop, ICON_KEY_HLT, 0); // XXX: we need a dedicated icon
+
/* UV */
prop= RNA_def_property(srna, "uv_select_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "uv_selectmode");
@@ -1198,7 +1237,7 @@ static void rna_def_tool_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "etch_subdivision_number", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "skgen_subdivision_number");
- RNA_def_property_range(prop, 1, 10000);
+ RNA_def_property_range(prop, 1, 255);
RNA_def_property_ui_text(prop, "Subdivisions", "Number of bones in the subdivided stroke");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
@@ -1263,6 +1302,11 @@ static void rna_def_unit_settings(BlenderRNA *brna)
RNA_def_property_enum_items(prop, unit_systems);
RNA_def_property_ui_text(prop, "Unit System", "The unit system to use for button display");
RNA_def_property_update(prop, NC_WINDOW, NULL);
+
+ prop= RNA_def_property(srna, "system_rotation", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, rotation_units);
+ RNA_def_property_ui_text(prop, "Rotation Units", "Unit to use for displaying/editing rotation values");
+ RNA_def_property_update(prop, NC_WINDOW, NULL);
prop= RNA_def_property(srna, "scale_length", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_ui_text(prop, "Unit Scale", "Scale to use when converting between blender units and dimensions");
@@ -1274,12 +1318,6 @@ static void rna_def_unit_settings(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_UNIT_OPT_SPLIT);
RNA_def_property_ui_text(prop, "Separate Units", "Display units in pairs");
RNA_def_property_update(prop, NC_WINDOW, NULL);
-
- prop= RNA_def_property(srna, "rotation_units", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
- RNA_def_property_enum_items(prop, rotation_units);
- RNA_def_property_ui_text(prop, "Rotation Units", "Unit to use for displaying/editing rotation values");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
}
void rna_def_render_layer_common(StructRNA *srna, int scene)
@@ -1560,31 +1598,31 @@ static void rna_def_scene_game_recast_data(BlenderRNA *brna)
prop= RNA_def_property(srna, "cell_size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "cellsize");
- RNA_def_property_ui_range(prop, 0.1, 1, 0.01, 2);
+ RNA_def_property_ui_range(prop, 0.1, 1, 1, 2);
RNA_def_property_ui_text(prop, "Cell Size", "Rasterized cell size");
RNA_def_property_update(prop, NC_SCENE, NULL);
prop= RNA_def_property(srna, "cell_height", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "cellheight");
- RNA_def_property_ui_range(prop, 0.1, 1, 0.01, 2);
+ RNA_def_property_ui_range(prop, 0.1, 1, 1, 2);
RNA_def_property_ui_text(prop, "Cell Height", "Rasterized cell height");
RNA_def_property_update(prop, NC_SCENE, NULL);
prop= RNA_def_property(srna, "agent_height", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "agentheight");
- RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2);
+ RNA_def_property_ui_range(prop, 0.1, 5, 1, 2);
RNA_def_property_ui_text(prop, "Agent Height", "Minimum height where the agent can still walk");
RNA_def_property_update(prop, NC_SCENE, NULL);
prop= RNA_def_property(srna, "agent_radius", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "agentradius");
- RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2);
+ RNA_def_property_ui_range(prop, 0.1, 5, 1, 2);
RNA_def_property_ui_text(prop, "Agent Radius", "Radius of the agent");
RNA_def_property_update(prop, NC_SCENE, NULL);
prop= RNA_def_property(srna, "max_climb", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "agentmaxclimb");
- RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2);
+ RNA_def_property_ui_range(prop, 0.1, 5, 1, 2);
RNA_def_property_ui_text(prop, "Max Climb", "Maximum height between grid cells the agent can climb");
RNA_def_property_update(prop, NC_SCENE, NULL);
@@ -1615,7 +1653,7 @@ static void rna_def_scene_game_recast_data(BlenderRNA *brna)
prop= RNA_def_property(srna, "edge_max_error", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "edgemaxerror");
- RNA_def_property_ui_range(prop, 0.1, 3.0, 0.1, 2);
+ RNA_def_property_ui_range(prop, 0.1, 3.0, 1, 2);
RNA_def_property_ui_text(prop, "Max Edge Error", "Maximum distance error from contour to cells");
RNA_def_property_update(prop, NC_SCENE, NULL);
@@ -1737,8 +1775,9 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
prop= RNA_def_property(srna, "frame_color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "framing.col");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Framing Color", "Set colour of the bars");
+ RNA_def_property_ui_text(prop, "Framing Color", "Set color of the bars");
RNA_def_property_update(prop, NC_SCENE, NULL);
/* Stereo */
@@ -1811,8 +1850,8 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Physics Gravity", "Gravitational constant used for physics simulation in the game engine");
RNA_def_property_update(prop, NC_SCENE, NULL);
- prop= RNA_def_property(srna, "occlusion_culling_resolution", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "occlusionRes");
+ prop= RNA_def_property(srna, "occlusion_culling_resolution", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "occlusionRes");
RNA_def_property_range(prop, 128.0, 1024.0);
RNA_def_property_ui_text(prop, "Occlusion Resolution", "The size of the occlusion buffer in pixel, use higher value for better precision (slower)");
RNA_def_property_update(prop, NC_SCENE, NULL);
@@ -1874,6 +1913,10 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_SHOW_PHYSICS);
RNA_def_property_ui_text(prop, "Show Physics Visualization", "Show a visualization of physics bounds and interactions");
+ prop= RNA_def_property(srna, "show_mouse", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_SHOW_MOUSE);
+ RNA_def_property_ui_text(prop, "Show Mouse", "Start player with a visible mouse cursor");
+
prop= RNA_def_property(srna, "use_frame_rate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_ENABLE_ALL_FRAMES);
RNA_def_property_ui_text(prop, "Use Frame Rate", "Respect the frame rate rather than rendering as many frames as possible");
@@ -1957,7 +2000,6 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
/* Nestled Data */
rna_def_scene_game_recast_data(brna);
-
}
static void rna_def_scene_render_layer(BlenderRNA *brna)
@@ -2510,14 +2552,14 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_range(prop, 1, 900);
RNA_def_property_ui_text(prop, "Frame Map Old", "Specify old mapping value in frames");
- RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ RNA_def_property_update(prop, NC_SCENE|ND_FRAME, "rna_Scene_framelen_update");
prop= RNA_def_property(srna, "frame_map_new", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "images");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_range(prop, 1, 900);
RNA_def_property_ui_text(prop, "Frame Map New", "Specify how many frames the Map Old will last");
- RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ RNA_def_property_update(prop, NC_SCENE|ND_FRAME, "rna_Scene_framelen_update");
prop= RNA_def_property(srna, "dither_intensity", PROP_FLOAT, PROP_NONE);
@@ -2778,11 +2820,6 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_boolean_funcs(prop, "rna_RenderSettings_full_sample_get", NULL);
RNA_def_property_ui_text(prop, "Full Sample","Save for every anti-aliasing sample the entire RenderLayer results. This solves anti-aliasing issues with compositing");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
-
- prop= RNA_def_property(srna, "use_backbuf", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "bufflag", R_BACKBUF);
- RNA_def_property_ui_text(prop, "Back Buffer", "Render backbuffer image");
- RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
prop= RNA_def_property(srna, "display_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "displaymode");
@@ -2790,7 +2827,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Display", "Select where rendered images will be displayed");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_sdna(prop, NULL, "pic");
RNA_def_property_ui_text(prop, "Output Path", "Directory/name to save animations, # characters defines the position and length of frame numbers");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -2868,6 +2905,11 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_CAMERA);
RNA_def_property_ui_text(prop, "Stamp Camera", "Include the name of the active camera in image metadata");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+ prop= RNA_def_property(srna, "use_stamp_lens", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_CAMERALENS);
+ RNA_def_property_ui_text(prop, "Stamp Lens", "Include the name of the active cameras lens in image metadata");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
prop= RNA_def_property(srna, "use_stamp_scene", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_SCENE);
@@ -2962,6 +3004,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_single_layer", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_SINGLE_LAYER);
RNA_def_property_ui_text(prop, "Single Layer", "Only render the active layer");
+ RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1);
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
/* engine */
@@ -3035,7 +3078,7 @@ static void rna_def_scene_objects(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Link object to scene, run scene.update() after.");
RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
parm= RNA_def_pointer(func, "object", "Object", "", "Object to add to scene.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
parm= RNA_def_pointer(func, "base", "ObjectBase", "", "The newly created base.");
RNA_def_function_return(func, parm);
@@ -3043,7 +3086,7 @@ static void rna_def_scene_objects(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Unlink object from scene.");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
parm= RNA_def_pointer(func, "object", "Object", "", "Object to remove from scene.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Object");
@@ -3218,7 +3261,7 @@ void RNA_def_scene(BlenderRNA *brna)
prop= RNA_def_property(srna, "world", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "World", "World used for rendering the scene");
- RNA_def_property_update(prop, NC_SCENE|NC_WORLD, NULL);
+ RNA_def_property_update(prop, NC_SCENE|ND_WORLD, NULL);
prop= RNA_def_property(srna, "cursor_location", PROP_FLOAT, PROP_XYZ_LENGTH);
RNA_def_property_float_sdna(prop, NULL, "cursor");
@@ -3231,6 +3274,7 @@ void RNA_def_scene(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "base", NULL);
RNA_def_property_struct_type(prop, "ObjectBase");
RNA_def_property_ui_text(prop, "Bases", "");
+ RNA_def_property_collection_funcs(prop, 0, 0, 0, 0, 0, 0, "rna_Scene_object_bases_lookup_string");
rna_def_scene_bases(brna, prop);
prop= RNA_def_property(srna, "objects", PROP_COLLECTION, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c
index 800922ceba0..31297d8a478 100644
--- a/source/blender/makesrna/intern/rna_scene_api.c
+++ b/source/blender/makesrna/intern/rna_scene_api.c
@@ -55,7 +55,12 @@ static void rna_Scene_frame_set(Scene *scene, int frame, float subframe)
CLAMP(scene->r.cfra, MINAFRAME, MAXFRAME);
scene_update_for_newframe(G.main, scene, (1<<20) - 1);
- WM_main_add_notifier(NC_SCENE|ND_FRAME, scene);
+ /* cant use NC_SCENE|ND_FRAME because this casues wm_event_do_notifiers to call
+ * scene_update_for_newframe which will loose any un-keyed changes [#24690] */
+ /* WM_main_add_notifier(NC_SCENE|ND_FRAME, scene); */
+
+ /* instead just redraw the views */
+ WM_main_add_notifier(NC_WINDOW, NULL);
}
static void rna_Scene_update_tagged(Scene *scene)
@@ -68,7 +73,7 @@ static void rna_SceneRender_get_frame_path(RenderData *rd, int frame, char *name
if(BKE_imtype_is_movie(rd->imtype))
BKE_makeanimstring(name, rd);
else
- BKE_makepicstring(name, rd->pic, (frame==INT_MIN) ? rd->cfra : frame, rd->imtype, rd->scemode & R_EXTENSION);
+ BKE_makepicstring(name, rd->pic, (frame==INT_MIN) ? rd->cfra : frame, rd->imtype, rd->scemode & R_EXTENSION, TRUE);
}
#else
@@ -82,7 +87,7 @@ void RNA_api_scene(StructRNA *srna)
RNA_def_function_ui_description(func, "Set scene frame updating all objects immediately.");
parm= RNA_def_int(func, "frame", 0, MINAFRAME, MAXFRAME, "", "Frame number to set.", MINAFRAME, MAXFRAME);
RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_float(func, "subframe", 0.0, 0.0, 1.0, "", "Sub-frame time, between 0.0 and 1.0", 0.0, 1.0);
+ RNA_def_float(func, "subframe", 0.0, 0.0, 1.0, "", "Sub-frame time, between 0.0 and 1.0", 0.0, 1.0);
func= RNA_def_function(srna, "update", "rna_Scene_update_tagged");
RNA_def_function_ui_description(func, "Update data tagged to be updated from previous access to data or operators.");
@@ -95,8 +100,8 @@ void RNA_api_scene_render(StructRNA *srna)
func= RNA_def_function(srna, "frame_path", "rna_SceneRender_get_frame_path");
RNA_def_function_ui_description(func, "Return the absolute path to the filename to be written for a given frame.");
- parm= RNA_def_int(func, "frame", INT_MIN, INT_MIN, INT_MAX, "", "Frame number to use, if unset the current frame will be used.", MINAFRAME, MAXFRAME);
- parm= RNA_def_string(func, "name", "", FILE_MAX, "File Name", "the resulting filename from the scenes render settings.");
+ RNA_def_int(func, "frame", INT_MIN, INT_MIN, INT_MAX, "", "Frame number to use, if unset the current frame will be used.", MINAFRAME, MAXFRAME);
+ parm= RNA_def_string_file_path(func, "filepath", "", FILE_MAX, "File Path", "the resulting filepath from the scenes render settings.");
RNA_def_property_flag(parm, PROP_THICK_WRAP); /* needed for string return value */
RNA_def_function_output(func, parm);
}
diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c
index da8aab32f31..02eadbcdaad 100644
--- a/source/blender/makesrna/intern/rna_screen.c
+++ b/source/blender/makesrna/intern/rna_screen.c
@@ -44,14 +44,14 @@ EnumPropertyItem region_type_items[] = {
{RGN_TYPE_PREVIEW, "PREVIEW", 0, "Preview", ""},
{0, NULL, 0, NULL, NULL}};
-#ifdef RNA_RUNTIME
-
#include "ED_screen.h"
-
#include "WM_api.h"
#include "WM_types.h"
+#ifdef RNA_RUNTIME
+
+
static void rna_Screen_scene_set(PointerRNA *ptr, PointerRNA value)
{
bScreen *sc= (bScreen*)ptr->data;
@@ -74,6 +74,15 @@ static void rna_Screen_scene_update(bContext *C, PointerRNA *ptr)
}
}
+static void rna_Screen_redraw_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ bScreen *screen= (bScreen*)ptr->data;
+
+ /* the settings for this are currently only available from a menu in the TimeLine, hence refresh=SPACE_TIME */
+ ED_screen_animation_timer_update(screen, screen->redraws_flag, SPACE_TIME);
+}
+
+
static int rna_Screen_is_animation_playing_get(PointerRNA *ptr)
{
bScreen *sc= (bScreen*)ptr->data;
@@ -83,7 +92,7 @@ static int rna_Screen_is_animation_playing_get(PointerRNA *ptr)
static int rna_Screen_fullscreen_get(PointerRNA *ptr)
{
bScreen *sc= (bScreen*)ptr->data;
- return (sc->full == SCREENFULL);
+ return (sc->full != 0);
}
static void rna_Area_type_set(PointerRNA *ptr, int value)
@@ -106,6 +115,7 @@ static void rna_def_area(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
+ FunctionRNA *func;
srna= RNA_def_struct(brna, "Area", NULL);
RNA_def_struct_ui_text(srna, "Area", "Area in a subdivided screen, containing an editor");
@@ -114,7 +124,7 @@ static void rna_def_area(BlenderRNA *brna)
prop= RNA_def_property(srna, "spaces", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "spacedata", NULL);
RNA_def_property_struct_type(prop, "Space");
- RNA_def_property_ui_text(prop, "Spaces", "Spaces contained in this area, the first space is active");
+ RNA_def_property_ui_text(prop, "Spaces", "Spaces contained in this area, the first being the active space. NOTE: Useful for example to restore a previously used 3d view space in a certain area to get the old view orientation.");
prop= RNA_def_property(srna, "active_space", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "spacedata.first");
@@ -139,6 +149,10 @@ static void rna_def_area(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Area_type_update");
RNA_def_function(srna, "tag_redraw", "ED_area_tag_redraw");
+
+ func= RNA_def_function(srna, "header_text_set", "ED_area_headerprint");
+ RNA_def_function_ui_description(func, "Set the header text");
+ RNA_def_string(func, "text", NULL, 0, "Text", "New string for the header, no argument clears the text.");
}
static void rna_def_region(BlenderRNA *brna)
@@ -170,6 +184,8 @@ static void rna_def_region(BlenderRNA *brna)
RNA_def_property_int_sdna(prop, NULL, "winy");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Height", "Region height");
+
+ RNA_def_function(srna, "tag_redraw", "ED_region_tag_redraw");
}
static void rna_def_screen(BlenderRNA *brna)
@@ -182,6 +198,7 @@ static void rna_def_screen(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Screen", "Screen datablock, defining the layout of areas in a window");
RNA_def_struct_ui_icon(srna, ICON_SPLITSCREEN);
+ /* pointers */
prop= RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_NEVER_NULL);
RNA_def_property_pointer_funcs(prop, NULL, "rna_Screen_scene_set", NULL, NULL);
@@ -189,11 +206,13 @@ static void rna_def_screen(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_property_update(prop, 0, "rna_Screen_scene_update");
+ /* collections */
prop= RNA_def_property(srna, "areas", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "areabase", NULL);
RNA_def_property_struct_type(prop, "Area");
RNA_def_property_ui_text(prop, "Areas", "Areas the screen is subdivided into");
-
+
+ /* readonly status indicators */
prop= RNA_def_property(srna, "is_animation_playing", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_boolean_funcs(prop, "rna_Screen_is_animation_playing_get", NULL);
@@ -203,6 +222,42 @@ static void rna_def_screen(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_boolean_funcs(prop, "rna_Screen_fullscreen_get", NULL);
RNA_def_property_ui_text(prop, "Fullscreen", "An area is maximised, filling this screen");
+
+ /* Define Anim Playback Areas */
+ prop= RNA_def_property(srna, "use_play_top_left_3d_editor", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_REGION);
+ RNA_def_property_ui_text(prop, "Top-Left 3D Editor", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
+
+ prop= RNA_def_property(srna, "use_play_3d_editors", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_ALL_3D_WIN);
+ RNA_def_property_ui_text(prop, "All 3D View Editors", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
+
+ prop= RNA_def_property(srna, "use_play_animation_editors", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_ALL_ANIM_WIN);
+ RNA_def_property_ui_text(prop, "Animation Editors", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
+
+ prop= RNA_def_property(srna, "use_play_properties_editors", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_ALL_BUTS_WIN);
+ RNA_def_property_ui_text(prop, "Property Editors", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
+
+ prop= RNA_def_property(srna, "use_play_image_editors", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_ALL_IMAGE_WIN);
+ RNA_def_property_ui_text(prop, "Image Editors", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
+
+ prop= RNA_def_property(srna, "use_play_sequence_editors", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_SEQ);
+ RNA_def_property_ui_text(prop, "Sequencer Editors", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
+
+ prop= RNA_def_property(srna, "use_play_node_editors", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_NODES);
+ RNA_def_property_ui_text(prop, "Node Editors", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
}
void RNA_def_screen(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c
index 3b83ec2d3ad..040c2175d07 100644
--- a/source/blender/makesrna/intern/rna_sculpt_paint.c
+++ b/source/blender/makesrna/intern/rna_sculpt_paint.c
@@ -77,7 +77,7 @@ static EnumPropertyItem particle_edit_cache_brush_items[] = {
static PointerRNA rna_ParticleEdit_brush_get(PointerRNA *ptr)
{
ParticleEditSettings *pset= (ParticleEditSettings*)ptr->data;
- ParticleBrushData *brush= NULL;;
+ ParticleBrushData *brush= NULL;
if(pset->brushtype != PE_BRUSH_NONE)
brush= &pset->brush[pset->brushtype];
@@ -105,7 +105,7 @@ static void rna_ParticleEdit_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Object *ob= (scene->basact)? scene->basact->object: NULL;
- if(ob) DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ if(ob) DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
static void rna_ParticleEdit_tool_set(PointerRNA *ptr, int value)
{
@@ -115,7 +115,7 @@ static void rna_ParticleEdit_tool_set(PointerRNA *ptr, int value)
if((pset->brushtype == PE_BRUSH_WEIGHT || value == PE_BRUSH_WEIGHT) && pset->scene) {
Object *ob = (pset->scene->basact)? pset->scene->basact->object: NULL;
if(ob) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL);
}
}
@@ -160,10 +160,25 @@ static int rna_ParticleEdit_hair_get(PointerRNA *ptr)
static int rna_Brush_mode_poll(PointerRNA *ptr, PointerRNA value)
{
Scene *scene= (Scene *)ptr->id.data;
- Object *ob = OBACT;
+ ToolSettings *ts = scene->toolsettings;
Brush *brush= value.id.data;
- return ob->mode & brush->ob_mode;
+ int mode = 0;
+
+ /* check the origin of the Paint struct to see which paint
+ mode to select from */
+
+ if(ptr->data == &ts->imapaint)
+ mode = OB_MODE_TEXTURE_PAINT;
+ else if(ptr->data == ts->sculpt)
+ mode = OB_MODE_SCULPT;
+ else if(ptr->data == ts->vpaint)
+ mode = OB_MODE_VERTEX_PAINT;
+ else if(ptr->data == ts->wpaint)
+ mode = OB_MODE_WEIGHT_PAINT;
+
+ return brush->ob_mode & mode;
}
+
#else
static void rna_def_paint(BlenderRNA *brna)
@@ -274,15 +289,6 @@ static void rna_def_image_paint(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Image Paint", "Properties of image and texture painting mode");
/* booleans */
-
- prop= RNA_def_property(srna, "show_brush_draw", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_DRAW_TOOL);
- RNA_def_property_ui_text(prop, "Show Brush Draw", "Enables brush shape while drawing");
-
- prop= RNA_def_property(srna, "show_brush", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_DRAW_TOOL_DRAWING);
- RNA_def_property_ui_text(prop, "Show Brush", "Enables brush shape while not drawing");
-
prop= RNA_def_property(srna, "use_projection", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_DISABLE);
RNA_def_property_ui_text(prop, "Project Paint", "Use projection painting for improved consistency in the brush strokes");
@@ -409,7 +415,7 @@ static void rna_def_particle_edit(BlenderRNA *brna)
prop= RNA_def_property(srna, "default_key_count", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "totaddkey");
- RNA_def_property_range(prop, 2, INT_MAX);
+ RNA_def_property_range(prop, 2, SHRT_MAX);
RNA_def_property_ui_range(prop, 2, 20, 10, 3);
RNA_def_property_ui_text(prop, "Keys", "How many keys to make new particles with");
@@ -456,7 +462,7 @@ static void rna_def_particle_edit(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Particle Brush", "Particle editing brush");
prop= RNA_def_property(srna, "size", PROP_INT, PROP_NONE);
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_range(prop, 1, 100, 10, 3);
RNA_def_property_ui_text(prop, "Size", "Brush size");
@@ -471,7 +477,7 @@ static void rna_def_particle_edit(BlenderRNA *brna)
prop= RNA_def_property(srna, "steps", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "step");
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_range(prop, 1, 50, 10, 3);
RNA_def_property_ui_text(prop, "Steps", "Brush steps");
diff --git a/source/blender/makesrna/intern/rna_sensor.c b/source/blender/makesrna/intern/rna_sensor.c
index 6dddb042533..e0a9c17193c 100644
--- a/source/blender/makesrna/intern/rna_sensor.c
+++ b/source/blender/makesrna/intern/rna_sensor.c
@@ -26,6 +26,7 @@
#include "RNA_define.h"
#include "RNA_enum_types.h"
+#include "RNA_access.h"
#include "rna_internal.h"
@@ -115,7 +116,7 @@ EnumPropertyItem *rna_Sensor_type_itemf(bContext *C, PointerRNA *ptr, int *free)
Object *ob=NULL;
int totitem= 0;
- if (ptr->type == &RNA_Sensor) {
+ if (ptr->type == &RNA_Sensor || RNA_struct_is_a(ptr->type, &RNA_Sensor)) {
ob = (Object *)ptr->id.data;
} else {
/* can't use ob from ptr->id.data because that enum is also used by operators */
@@ -331,7 +332,7 @@ static void rna_def_near_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Property", "Only look for objects with this property");
+ RNA_def_property_ui_text(prop, "Property", "Only look for objects with this property (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
@@ -342,7 +343,7 @@ static void rna_def_near_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "reset_distance", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "resetdist");
- RNA_def_property_ui_text(prop, "Reset Distance", "");
+ RNA_def_property_ui_text(prop, "Reset Distance", "The distance where the sensor forgets the actor");
RNA_def_property_range(prop, 0.0f, 10000.0f);
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
@@ -387,7 +388,7 @@ static void rna_def_touch_sensor(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Material");
RNA_def_property_pointer_sdna(prop, NULL, "ma");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Material", "Only look for objects with this material");
+ RNA_def_property_ui_text(prop, "Material", "Only look for objects with this material (blank = all objects)");
/* note: custom set function is ONLY to avoid rna setting a user for this. */
RNA_def_property_pointer_funcs(prop, NULL, "rna_Sensor_touch_material_set", NULL, NULL);
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -425,12 +426,12 @@ static void rna_def_keyboard_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "target", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "targetName");
- RNA_def_property_ui_text(prop, "Target", "Property that indicates whether to log keystrokes as a string");
+ RNA_def_property_ui_text(prop, "Target", "Property that receive the keystrokes in case a string is logged");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "log", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "toggleName");
- RNA_def_property_ui_text(prop, "Log Toggle", "Property that receive the keystrokes in case a string is logged");
+ RNA_def_property_ui_text(prop, "Log Toggle", "Property that indicates whether to log keystrokes as a string");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "use_all_keys", PROP_BOOLEAN, PROP_NONE);
@@ -491,7 +492,7 @@ static void rna_def_armature_sensor(BlenderRNA *brna)
{SENS_ARM_LIN_ERROR_BELOW, "LINERRORBELOW", 0, "Lin error below", ""},
{SENS_ARM_LIN_ERROR_ABOVE, "LINERRORABOVE", 0, "Lin error above", ""},
{SENS_ARM_ROT_ERROR_BELOW, "ROTERRORBELOW", 0, "Rot error below", ""},
- {SENS_ARM_ROT_ERROR_ABOVE, "ROTERRORBELOW", 0, "Rot error above", ""},
+ {SENS_ARM_ROT_ERROR_ABOVE, "ROTERRORABOVE", 0, "Rot error above", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "ArmatureSensor", "Sensor");
@@ -501,17 +502,17 @@ static void rna_def_armature_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "test_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_type_items);
- RNA_def_property_ui_text(prop, "Test Type", "Type of value and test");
+ RNA_def_property_ui_text(prop, "Test", "Type of value and test");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "bone", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "posechannel");
- RNA_def_property_ui_text(prop, "Bone name", "Identify the bone to check value from");
+ RNA_def_property_ui_text(prop, "Bone Name", "Identify the bone to check value from");
RNA_def_property_update(prop, NC_LOGIC, "rna_Sensor_Armature_update");
prop= RNA_def_property(srna, "constraint", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "constraint");
- RNA_def_property_ui_text(prop, "Constraint name", "Identify the bone constraint to check value from");
+ RNA_def_property_ui_text(prop, "Constraint Name", "Identify the bone constraint to check value from");
RNA_def_property_update(prop, NC_LOGIC, "rna_Sensor_Armature_update");
prop= RNA_def_property(srna, "value", PROP_FLOAT, PROP_NONE);
@@ -582,13 +583,13 @@ static void rna_def_collision_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property");
+ RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
//XXX to make a setFunction to create a lookup with all materials in Blend File (not only this object mat.)
prop= RNA_def_property(srna, "material", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "materialName");
- RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material");
+ RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/*//XXX either use a datablock look up to store the string name (material)
@@ -597,7 +598,7 @@ static void rna_def_collision_sensor(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Material");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_pointer_sdna(prop, NULL, "ma");
- RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material");
+ RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material (blank = all objects)");
*/
}
@@ -606,12 +607,12 @@ static void rna_def_radar_sensor(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
static EnumPropertyItem axis_items[] ={
- {SENS_RAY_X_AXIS, "XAXIS", 0, "+X axis", ""},
- {SENS_RAY_Y_AXIS, "YAXIS", 0, "+Y axis", ""},
- {SENS_RAY_Z_AXIS, "ZAXIS", 0, "+Z axis", ""},
- {SENS_RAY_NEG_X_AXIS, "NEGXAXIS", 0, "-X axis", ""},
- {SENS_RAY_NEG_Y_AXIS, "NEGYAXIS", 0, "-Y axis", ""},
- {SENS_RAY_NEG_Z_AXIS, "NEGZAXIS", 0, "-Z axis", ""},
+ {SENS_RADAR_X_AXIS, "XAXIS", 0, "+X axis", ""},
+ {SENS_RADAR_Y_AXIS, "YAXIS", 0, "+Y axis", ""},
+ {SENS_RADAR_Z_AXIS, "ZAXIS", 0, "+Z axis", ""},
+ {SENS_RADAR_NEG_X_AXIS, "NEGXAXIS", 0, "-X axis", ""},
+ {SENS_RADAR_NEG_Y_AXIS, "NEGYAXIS", 0, "-Y axis", ""},
+ {SENS_RADAR_NEG_Z_AXIS, "NEGZAXIS", 0, "-Z axis", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "RadarSensor", "Sensor");
@@ -620,7 +621,7 @@ static void rna_def_radar_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property");
+ RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "axis", PROP_ENUM, PROP_NONE);
@@ -628,7 +629,7 @@ static void rna_def_radar_sensor(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Axis", "Specify along which axis the radar cone is cast");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_range(prop, 0.0, 179.9);
RNA_def_property_ui_text(prop, "Angle", "Opening angle of the radar cone");
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -685,12 +686,12 @@ static void rna_def_ray_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "propname");
- RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property");
+ RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "material", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "matname");
- RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material");
+ RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* //XXX either use a datablock look up to store the string name (material)
@@ -699,7 +700,7 @@ static void rna_def_ray_sensor(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Material");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_pointer_sdna(prop, NULL, "ma");
- RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material");
+ RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material (blank = all objects)");
*/
prop= RNA_def_property(srna, "use_x_ray", PROP_BOOLEAN, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c
index 3593efaa743..233ffd06188 100644
--- a/source/blender/makesrna/intern/rna_sequencer.c
+++ b/source/blender/makesrna/intern/rna_sequencer.c
@@ -119,7 +119,7 @@ static void rna_Sequence_start_frame_set(PointerRNA *ptr, int value)
Sequence *seq= (Sequence*)ptr->data;
Scene *scene= (Scene*)ptr->id.data;
- seq->start= value;
+ seq_translate(scene, seq, value - seq->start);
rna_Sequence_frame_change_update(scene, seq);
}
@@ -150,7 +150,7 @@ static void rna_Sequence_anim_startofs_final_set(PointerRNA *ptr, int value)
seq->anim_startofs = MIN2(value, seq->len + seq->anim_startofs);
- reload_sequence_new_file(G.main, scene, seq, FALSE);
+ reload_sequence_new_file(scene, seq, FALSE);
rna_Sequence_frame_change_update(scene, seq);
}
@@ -161,7 +161,7 @@ static void rna_Sequence_anim_endofs_final_set(PointerRNA *ptr, int value)
seq->anim_endofs = MIN2(value, seq->len + seq->anim_endofs);
- reload_sequence_new_file(G.main, scene, seq, FALSE);
+ reload_sequence_new_file(scene, seq, FALSE);
rna_Sequence_frame_change_update(scene, seq);
}
@@ -502,6 +502,12 @@ static void rna_Sequence_attenuation_set(PointerRNA *ptr, float value)
}
+static int rna_Sequence_input_count_get(PointerRNA *ptr)
+{
+ Sequence *seq= (Sequence*)(ptr->data);
+
+ return get_sequence_effect_num_inputs(seq->type);
+}
/*static void rna_SoundSequence_filename_set(PointerRNA *ptr, const char *value)
{
Sequence *seq= (Sequence*)(ptr->data);
@@ -552,7 +558,7 @@ static void rna_Sequence_mute_update(Main *bmain, Scene *scene, PointerRNA *ptr)
static void rna_Sequence_filepath_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Sequence *seq= (Sequence*)(ptr->data);
- reload_sequence_new_file(G.main, scene, seq, TRUE);
+ reload_sequence_new_file(scene, seq, TRUE);
calc_sequence(scene, seq);
rna_Sequence_update(bmain, scene, ptr);
}
@@ -660,6 +666,16 @@ static void rna_def_strip_element(BlenderRNA *brna)
RNA_def_property_string_sdna(prop, NULL, "name");
RNA_def_property_ui_text(prop, "Filename", "");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
+
+ prop= RNA_def_property(srna, "orig_width", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "orig_width");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Orig Width", "Original image width");
+
+ prop= RNA_def_property(srna, "orig_height", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "orig_height");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Orig Height", "Original image height");
}
static void rna_def_strip_crop(BlenderRNA *brna)
@@ -677,13 +693,13 @@ static void rna_def_strip_crop(BlenderRNA *brna)
RNA_def_property_ui_range(prop, 0, 4096, 1, 0);
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "min_x", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "min_y", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "bottom");
RNA_def_property_ui_text(prop, "Bottom", "");
RNA_def_property_ui_range(prop, 0, 4096, 1, 0);
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "min_y", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "min_x", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "left");
RNA_def_property_ui_text(prop, "Left", "");
RNA_def_property_ui_range(prop, 0, 4096, 1, 0);
@@ -980,11 +996,29 @@ static void rna_def_sequence(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "speed_fader", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "speed_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "speed_fader");
- RNA_def_property_ui_text(prop, "Speed effect fader position", "");
+ RNA_def_property_ui_text(prop, "Speed factor", "Multiply the current speed of the sequence with this number or remap current frame to this frame");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
+ /* effect strip inputs */
+
+ prop= RNA_def_property(srna, "input_count", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_int_funcs(prop, "rna_Sequence_input_count_get", NULL, NULL);
+
+ prop= RNA_def_property(srna, "input_1", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "seq1");
+ RNA_def_property_ui_text(prop, "Input 1", "First input for the effect strip");
+
+ prop= RNA_def_property(srna, "input_2", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "seq2");
+ RNA_def_property_ui_text(prop, "Input 2", "Second input for the effect strip");
+
+ prop= RNA_def_property(srna, "input_3", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "seq1");
+ RNA_def_property_ui_text(prop, "Input 3", "Third input for the effect strip");
+
RNA_api_sequence_strip(srna);
}
@@ -1248,6 +1282,11 @@ static void rna_def_movie(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "MPEG Preseek", "For MPEG movies, preseek this many frames");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
+ prop= RNA_def_property(srna, "elements", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "strip->stripdata", "strip->len");
+ RNA_def_property_struct_type(prop, "SequenceElement");
+ RNA_def_property_ui_text(prop, "Elements", "");
+
prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
RNA_def_property_ui_text(prop, "File", "");
RNA_def_property_string_funcs(prop, "rna_Sequence_filepath_get", "rna_Sequence_filepath_length",
@@ -1281,7 +1320,7 @@ static void rna_def_sound(BlenderRNA *brna)
prop= RNA_def_property(srna, "attenuation", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, -100.0f, +40.0f);
- RNA_def_property_ui_text(prop, "Attenuation/db", "Attenuation in dezibel");
+ RNA_def_property_ui_text(prop, "Attenuation/dB", "Attenuation in decibel");
RNA_def_property_float_funcs(prop, "rna_Sequence_attenuation_get", "rna_Sequence_attenuation_set", NULL);
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
@@ -1535,16 +1574,16 @@ static void rna_def_speed_control(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "SpeedControl Sequence", "Sequence strip to control the speed of other strips");
RNA_def_struct_sdna_from(srna, "SpeedControlVars", "effectdata");
- prop= RNA_def_property(srna, "global_speed", PROP_FLOAT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "multiply_speed", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_float_sdna(prop, NULL, "globalSpeed");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); /* seq->facf0 is used to animate this */
- RNA_def_property_ui_text(prop, "Global Speed", "");
+ RNA_def_property_ui_text(prop, "Multiply Speed", "Multiply the resulting speed after the speed factor");
RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 0);
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "use_curve_velocity", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_as_speed", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", SEQ_SPEED_INTEGRATE);
- RNA_def_property_ui_text(prop, "F-Curve Velocity", "Interpret the F-Curve value as a velocity instead of a frame number");
+ RNA_def_property_ui_text(prop, "Use as speed", "Interpret the value as speed instead of a frame number");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
prop= RNA_def_property(srna, "use_frame_blend", PROP_BOOLEAN, PROP_NONE);
@@ -1552,9 +1591,9 @@ static void rna_def_speed_control(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Frame Blending", "Blend two frames into the target for a smoother result");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "use_curve_compress_y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "scale_to_length", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", SEQ_SPEED_COMPRESS_IPO_Y);
- RNA_def_property_ui_text(prop, "F-Curve Compress Y", "Scale F-Curve value to get the target frame number, F-Curve value runs from 0.0 to 1.0");
+ RNA_def_property_ui_text(prop, "Scale to length", "Scale values from 0.0 to 1.0 to target sequence length");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
}
diff --git a/source/blender/makesrna/intern/rna_sequencer_api.c b/source/blender/makesrna/intern/rna_sequencer_api.c
index 425bad9fcd7..245a36d9573 100644
--- a/source/blender/makesrna/intern/rna_sequencer_api.c
+++ b/source/blender/makesrna/intern/rna_sequencer_api.c
@@ -66,7 +66,7 @@ void RNA_api_sequence_strip(StructRNA *srna)
func= RNA_def_function(srna, "swap", "rna_Sequence_swap_internal");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
parm= RNA_def_pointer(func, "other", "Sequence", "Other", "");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c
index 53f27bc06fb..fc1584c7a0f 100644
--- a/source/blender/makesrna/intern/rna_smoke.c
+++ b/source/blender/makesrna/intern/rna_smoke.c
@@ -33,6 +33,7 @@
#include "BKE_smoke.h"
#include "DNA_modifier_types.h"
+#include "DNA_object_force.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_smoke_types.h"
@@ -49,7 +50,7 @@
static void rna_Smoke_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
}
static void rna_Smoke_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -64,6 +65,9 @@ static void rna_Smoke_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
smokeModifier_reset(settings->smd);
+ if(settings->smd && settings->smd->domain)
+ settings->point_cache[0]->flag |= PTCACHE_OUTDATED;
+
rna_Smoke_update(bmain, scene, ptr);
}
@@ -73,6 +77,9 @@ static void rna_Smoke_reset_dependancy(Main *bmain, Scene *scene, PointerRNA *pt
smokeModifier_reset(settings->smd);
+ if(settings->smd && settings->smd->domain)
+ settings->smd->domain->point_cache[0]->flag |= PTCACHE_OUTDATED;
+
rna_Smoke_dependency_update(bmain, scene, ptr);
}
@@ -165,14 +172,14 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "alpha");
RNA_def_property_range(prop, -5.0, 5.0);
RNA_def_property_ui_range(prop, -5.0, 5.0, 0.02, 5);
- RNA_def_property_ui_text(prop, "Gravity", "Higher value results in sinking smoke");
+ RNA_def_property_ui_text(prop, "Density", "How much density effects smoke motion, higher value results in faster rising smoke");
RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
prop= RNA_def_property(srna, "beta", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "beta");
RNA_def_property_range(prop, -5.0, 5.0);
RNA_def_property_ui_range(prop, -5.0, 5.0, 0.02, 5);
- RNA_def_property_ui_text(prop, "Heat", "Higher value results in faster rising smoke");
+ RNA_def_property_ui_text(prop, "Heat", "How much heat effects smoke motion, higher value results in faster rising smoke");
RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
prop= RNA_def_property(srna, "collision_group", PROP_POINTER, PROP_NONE);
@@ -208,40 +215,29 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
RNA_def_property_range(prop, 1.0, 10000.0);
RNA_def_property_ui_range(prop, 1.0, 10000.0, 1, 0);
RNA_def_property_ui_text(prop, "Dissolve Speed", "Dissolve Speed");
- RNA_def_property_update(prop, 0, NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
prop= RNA_def_property(srna, "use_dissolve_smoke", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_DISSOLVE);
RNA_def_property_ui_text(prop, "Dissolve Smoke", "Enable smoke to disappear over time");
- RNA_def_property_update(prop, 0, NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
prop= RNA_def_property(srna, "use_dissolve_smoke_log", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_DISSOLVE_LOG);
RNA_def_property_ui_text(prop, "Logarithmic dissolve", "Using 1/x ");
- RNA_def_property_update(prop, 0, NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
- prop= RNA_def_property(srna, "point_cache_low", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "point_cache[0]");
RNA_def_property_ui_text(prop, "Point Cache", "");
- prop= RNA_def_property(srna, "point_cache_high", PROP_POINTER, PROP_NONE);
- RNA_def_property_flag(prop, PROP_NEVER_NULL);
- RNA_def_property_pointer_sdna(prop, NULL, "point_cache[1]");
- RNA_def_property_ui_text(prop, "Point Cache", "");
-
prop= RNA_def_property(srna, "point_cache_compress_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "cache_comp");
RNA_def_property_enum_items(prop, smoke_cache_comp_items);
RNA_def_property_ui_text(prop, "Cache Compression", "Compression method to be used");
RNA_def_property_update(prop, 0, NULL);
- prop= RNA_def_property(srna, "point_cache_compress_high_type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "cache_high_comp");
- RNA_def_property_enum_items(prop, smoke_cache_comp_items);
- RNA_def_property_ui_text(prop, "Cache Compression", "Compression method to be used");
- RNA_def_property_update(prop, 0, NULL);
-
prop= RNA_def_property(srna, "collision_extents", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "border_collisions");
RNA_def_property_enum_items(prop, smoke_domain_colli_items);
@@ -256,7 +252,7 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "smooth_emitter", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_HIGH_SMOOTH);
RNA_def_property_ui_text(prop, "Smooth Emitter", "Smoothens emitted smoke to avoid blockiness.");
- RNA_def_property_update(prop, 0, NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
prop= RNA_def_property(srna, "time_scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "time_scale");
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index eeb45aec538..78434643028 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -31,7 +31,10 @@
#include "rna_internal.h"
+#include "BKE_key.h"
+
#include "DNA_action_types.h"
+#include "DNA_key_types.h"
#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_space_types.h"
@@ -59,7 +62,7 @@ EnumPropertyItem space_type_items[] = {
{SPACE_TIME, "TIMELINE", 0, "Timeline", ""},
{SPACE_NODE, "NODE_EDITOR", 0, "Node Editor", ""},
{SPACE_LOGIC, "LOGIC_EDITOR", 0, "Logic Editor", ""},
- {SPACE_CONSOLE, "CONSOLE", 0, "Console", ""},
+ {SPACE_CONSOLE, "CONSOLE", 0, "Python Console", ""},
{SPACE_USERPREF, "USER_PREFERENCES", 0, "User Preferences", ""},
{0, NULL, 0, NULL, NULL}};
@@ -345,7 +348,18 @@ static void rna_RegionView3D_quadview_update(Main *main, Scene *scene, PointerRN
rna_area_region_from_regiondata(ptr, &sa, &ar);
if(sa && ar && ar->alignment==RGN_ALIGN_QSPLIT)
- ED_view3d_quadview_update(sa, ar);
+ ED_view3d_quadview_update(sa, ar, FALSE);
+}
+
+/* same as above but call clip==TRUE */
+static void rna_RegionView3D_quadview_clip_update(Main *main, Scene *scene, PointerRNA *ptr)
+{
+ ScrArea *sa;
+ ARegion *ar;
+
+ rna_area_region_from_regiondata(ptr, &sa, &ar);
+ if(sa && ar && ar->alignment==RGN_ALIGN_QSPLIT)
+ ED_view3d_quadview_update(sa, ar, TRUE);
}
static void rna_RegionView3D_view_location_get(PointerRNA *ptr, float *values)
@@ -370,6 +384,8 @@ static PointerRNA rna_SpaceImageEditor_uvedit_get(PointerRNA *ptr)
static void rna_SpaceImageEditor_paint_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
paint_init(&scene->toolsettings->imapaint.paint, PAINT_CURSOR_TEXTURE_PAINT);
+
+ ED_space_image_paint_update(bmain->wm.first, scene->toolsettings);
}
static int rna_SpaceImageEditor_show_render_get(PointerRNA *ptr)
@@ -474,7 +490,8 @@ static void rna_SpaceImageEditor_curves_update(Main *bmain, Scene *scene, Pointe
void *lock;
ibuf= ED_space_image_acquire_buffer(sima, &lock);
- curvemapping_do_ibuf(sima->cumap, ibuf);
+ if(ibuf->rect_float)
+ curvemapping_do_ibuf(sima->cumap, ibuf);
ED_space_image_release_buffer(sima, lock);
WM_main_add_notifier(NC_IMAGE, sima->image);
@@ -558,6 +575,14 @@ static void rna_SpaceProperties_pin_id_update(Main *bmain, Scene *scene, Pointer
}
+static void rna_SpaceProperties_context_set(PointerRNA *ptr, int value)
+{
+ SpaceButs *sbuts= (SpaceButs*)(ptr->data);
+
+ sbuts->mainb= value;
+ sbuts->mainbuser = value;
+}
+
static void rna_SpaceProperties_align_set(PointerRNA *ptr, int value)
{
SpaceButs *sbuts= (SpaceButs*)(ptr->data);
@@ -605,16 +630,6 @@ static void rna_ConsoleLine_cursor_index_range(PointerRNA *ptr, int *min, int *m
*max= ci->len;
}
-/* Space Time */
-
-static void rna_SpaceTime_redraw_update(Main *bmain, Scene *scene, PointerRNA *ptr)
-{
- SpaceTime *st= (SpaceTime*)ptr->data;
- bScreen *screen= (bScreen*)ptr->id.data;
-
- ED_screen_animation_timer_update(screen, st->redraws, SPACE_TIME);
-}
-
/* Space Dopesheet */
static void rna_SpaceDopeSheetEditor_action_set(PointerRNA *ptr, PointerRNA value)
@@ -629,29 +644,64 @@ static void rna_SpaceDopeSheetEditor_action_update(Main *bmain, Scene *scene, Po
Object *obact= (scene->basact)? scene->basact->object: NULL;
/* we must set this action to be the one used by active object (if not pinned) */
- if(obact/* && saction->pin == 0*/) {
- AnimData *adt= BKE_id_add_animdata(&obact->id); /* this only adds if non-existant */
+ if (obact/* && saction->pin == 0*/) {
+ AnimData *adt = NULL;
+
+ if (saction->mode == SACTCONT_ACTION) {
+ // TODO: context selector could help decide this with more control?
+ adt= BKE_id_add_animdata(&obact->id); /* this only adds if non-existant */
+ }
+ else if (saction->mode == SACTCONT_SHAPEKEY) {
+ Key *key = ob_get_key(obact);
+ if (key)
+ adt= BKE_id_add_animdata(&key->id); /* this only adds if non-existant */
+ }
/* set action */
- adt->action= saction->action;
- id_us_plus(&adt->action->id);
+ if (adt) {
+ /* fix id-count of action we're replacing */
+ id_us_min(&adt->action->id);
+
+ /* show new id-count of action we're replacing */
+ adt->action= saction->action;
+ id_us_plus(&adt->action->id);
+ }
/* force depsgraph flush too */
- DAG_id_flush_update(&obact->id, OB_RECALC_OB|OB_RECALC_DATA);
+ DAG_id_tag_update(&obact->id, OB_RECALC_OB|OB_RECALC_DATA);
}
}
static void rna_SpaceDopeSheetEditor_mode_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
SpaceAction *saction= (SpaceAction*)(ptr->data);
+ Object *obact= (scene->basact)? scene->basact->object: NULL;
- /* special exception for ShapeKey Editor mode:
- * enable 'show sliders' by default, since one of the main
- * points of the ShapeKey Editor is to provide a one-stop shop
- * for controlling the shapekeys, whose main control is the value
- */
- if (saction->mode == SACTCONT_SHAPEKEY)
+ /* special exceptions for ShapeKey Editor mode */
+ if (saction->mode == SACTCONT_SHAPEKEY) {
+ Key *key = ob_get_key(obact);
+
+ /* 1) update the action stored for the editor */
+ if (key)
+ saction->action = (key->adt)? key->adt->action : NULL;
+ else
+ saction->action = NULL;
+
+ /* 2) enable 'show sliders' by default, since one of the main
+ * points of the ShapeKey Editor is to provide a one-stop shop
+ * for controlling the shapekeys, whose main control is the value
+ */
saction->flag |= SACTION_SLIDERS;
+ }
+ /* make sure action stored is valid */
+ else if (saction->mode == SACTCONT_ACTION) {
+ /* 1) update the action stored for the editor */
+ // TODO: context selector could help decide this with more control?
+ if (obact)
+ saction->action = (obact->adt)? obact->adt->action : NULL;
+ else
+ saction->action = NULL;
+ }
}
/* Space Graph Editor */
@@ -680,6 +730,63 @@ static void rna_Sequencer_display_mode_update(bContext *C, PointerRNA *ptr)
ED_sequencer_update_view(C, view);
}
+static float rna_BackgroundImage_opacity_get(PointerRNA *ptr)
+{
+ BGpic *bgpic= (BGpic *)ptr->data;
+ return 1.0f-bgpic->blend;
+}
+
+static void rna_BackgroundImage_opacity_set(PointerRNA *ptr, float value)
+{
+ BGpic *bgpic= (BGpic *)ptr->data;
+ bgpic->blend = 1.0f - value;
+}
+
+static EnumPropertyItem *rna_SpaceProperties_texture_context_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ Scene *scene = CTX_data_scene(C);
+ Object *ob = CTX_data_active_object(C);
+ EnumPropertyItem *item= NULL;
+ EnumPropertyItem tmp= {0, "", 0, "", ""};
+ int totitem= 0;
+
+ if(ob) {
+ if(ob->type == OB_LAMP) {
+ tmp.value = SB_TEXC_MAT_OR_LAMP;
+ tmp.description = "Show Lamp Textures";
+ tmp.identifier = "LAMP";
+ tmp.icon = ICON_LAMP_POINT;
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
+ else if(ob->totcol) {
+ tmp.value = SB_TEXC_MAT_OR_LAMP;
+ tmp.description = "Show Material Textures";
+ tmp.identifier = "MATERIAL";
+ tmp.icon = ICON_MATERIAL;
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
+ }
+
+ if(scene && scene->world) {
+ tmp.value = SB_TEXC_WORLD;
+ tmp.description = "Show World Textures";
+ tmp.identifier = "WORLD";
+ tmp.icon = ICON_WORLD;
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
+
+ tmp.value = SB_TEXC_BRUSH;
+ tmp.description = "Show Brush Textures";
+ tmp.identifier = "BRUSH";
+ tmp.icon = ICON_BRUSH_DATA;
+ RNA_enum_item_add(&item, &totitem, &tmp);
+
+ RNA_enum_item_end(&item, &totitem);
+ *free = 1;
+
+ return item;
+}
+
#else
static void rna_def_space(BlenderRNA *brna)
@@ -915,9 +1022,10 @@ static void rna_def_background_image(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0, FLT_MAX);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "transparency", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "opacity", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "blend");
- RNA_def_property_ui_text(prop, "Transparency", "Amount to blend the image against the background color");
+ RNA_def_property_float_funcs(prop, "rna_BackgroundImage_opacity_get", "rna_BackgroundImage_opacity_set", NULL);
+ RNA_def_property_ui_text(prop, "Opacity", "Image opacity to blend the image against the background color");
RNA_def_property_range(prop, 0.0, 1.0);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
@@ -938,7 +1046,7 @@ static void rna_def_space_view3d(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
- int matrix_dimsize[]= {4, 4};
+ const int matrix_dimsize[]= {4, 4};
static EnumPropertyItem pivot_items[] = {
{V3D_CENTER, "BOUNDING_BOX_CENTER", ICON_ROTATE, "Bounding Box Center", ""},
@@ -967,12 +1075,17 @@ static void rna_def_space_view3d(BlenderRNA *brna)
prop= RNA_def_property(srna, "lock_object", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_pointer_sdna(prop, NULL, "ob_centre");
- RNA_def_property_ui_text(prop, "Lock Object", "3D View center is locked to this object's position");
+ RNA_def_property_ui_text(prop, "Lock to Object", "3D View center is locked to this object's position");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "lock_bone", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "ob_centre_bone");
- RNA_def_property_ui_text(prop, "Lock Bone", "3D View center is locked to this bone's position");
+ RNA_def_property_ui_text(prop, "Lock to Bone", "3D View center is locked to this bone's position");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
+
+ prop= RNA_def_property(srna, "lock_cursor", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ob_centre_cursor", 1);
+ RNA_def_property_ui_text(prop, "Lock to Cursor", "3D View center is locked to the cursor's position");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "viewport_shade", PROP_ENUM, PROP_NONE);
@@ -1009,13 +1122,13 @@ static void rna_def_space_view3d(BlenderRNA *brna)
RNA_def_property_range(prop, 1.0f, FLT_MAX);
RNA_def_property_ui_text(prop, "Clip End", "3D View far clipping distance");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
-
- prop= RNA_def_property(srna, "grid_spacing", PROP_FLOAT, PROP_DISTANCE);
+
+ prop= RNA_def_property(srna, "grid_scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "grid");
- RNA_def_property_ui_text(prop, "Grid Spacing", "The distance between 3D View grid lines");
+ RNA_def_property_ui_text(prop, "Grid Scale", "The distance between 3D View grid lines");
RNA_def_property_range(prop, 0.0f, FLT_MAX);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
-
+
prop= RNA_def_property(srna, "grid_lines", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "gridlines");
RNA_def_property_ui_text(prop, "Grid Lines", "The number of grid lines to display in perspective view");
@@ -1187,7 +1300,7 @@ static void rna_def_space_view3d(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_box_clip", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "viewlock", RV3D_BOXCLIP);
RNA_def_property_ui_text(prop, "Clip", "Clip objects based on what's visible in other side views");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, "rna_RegionView3D_quadview_update");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, "rna_RegionView3D_quadview_clip_update");
prop= RNA_def_property(srna, "perspective_matrix", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "persmat");
@@ -1255,6 +1368,10 @@ static void rna_def_space_buttons(BlenderRNA *brna)
{BUT_HORIZONTAL, "HORIZONTAL", 0, "Horizontal", ""},
{BUT_VERTICAL, "VERTICAL", 0, "Vertical", ""},
{0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem buttons_texture_context_items[] = {
+ {SB_TEXC_MAT_OR_LAMP, "MATERIAL", ICON_MATERIAL, "Material", "Material"},
+ {0, NULL, 0, NULL, NULL}}; //actually populated dynamically trough a function
srna= RNA_def_struct(brna, "SpaceProperties", "Space");
RNA_def_struct_sdna(srna, "SpaceButs");
@@ -1263,6 +1380,7 @@ static void rna_def_space_buttons(BlenderRNA *brna)
prop= RNA_def_property(srna, "context", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "mainb");
RNA_def_property_enum_items(prop, buttons_context_items);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_SpaceProperties_context_set", NULL);
RNA_def_property_ui_text(prop, "Context", "Type of active data to display and edit");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_PROPERTIES, NULL);
@@ -1273,9 +1391,10 @@ static void rna_def_space_buttons(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Align", "Arrangement of the panels");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_PROPERTIES, NULL);
- prop= RNA_def_property(srna, "show_brush_texture", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", SB_BRUSH_TEX);
- RNA_def_property_ui_text(prop, "Brush Texture", "Show brush textures");
+ prop= RNA_def_property(srna, "texture_context", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, buttons_texture_context_items);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_SpaceProperties_texture_context_itemf");
+ RNA_def_property_ui_text(prop, "Texture Context", "Type of texture data to display and edit");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_PROPERTIES, NULL);
/* pinned data */
@@ -1306,7 +1425,7 @@ static void rna_def_space_image(BlenderRNA *brna)
RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceImageEditor_image_set", NULL, NULL);
RNA_def_property_ui_text(prop, "Image", "Image displayed and edited in this space");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
+ RNA_def_property_update(prop, NC_GEOM|ND_DATA, NULL); // is handled in image editor too
prop= RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
@@ -1613,7 +1732,7 @@ static void rna_def_space_dopesheet(BlenderRNA *brna)
{SACTCONT_DOPESHEET, "DOPESHEET", 0, "DopeSheet", ""},
{SACTCONT_ACTION, "ACTION", 0, "Action Editor", ""},
{SACTCONT_SHAPEKEY, "SHAPEKEY", 0, "ShapeKey Editor", ""},
- //{SACTCONT_GPENCIL, "GPENCIL", 0, "Grease Pencil", ""}, // XXX: to be reimplemented, but not enough time before 2.53 - Aligorith, 2010Jul14
+ {SACTCONT_GPENCIL, "GPENCIL", 0, "Grease Pencil", ""},
{0, NULL, 0, NULL, NULL}};
@@ -1652,6 +1771,11 @@ static void rna_def_space_dopesheet(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Sliders", "Show sliders beside F-Curve channels");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_DOPESHEET, NULL);
+ prop= RNA_def_property(srna, "show_pose_markers", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SACTION_POSEMARKERS_SHOW);
+ RNA_def_property_ui_text(prop, "Show Pose Markers", "Show markers belonging to the active action instead of Scene markers (Action and Shape Key Editors only)");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_DOPESHEET, NULL);
+
/* editing */
prop= RNA_def_property(srna, "use_auto_merge_keyframes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SACTION_NOTRANSKEYCULL);
@@ -1745,6 +1869,11 @@ static void rna_def_space_graph(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Only Selected Keyframes Handles", "Only show and edit handles of selected keyframes");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
+ prop= RNA_def_property(srna, "use_fancy_drawing", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SIPO_BEAUTYDRAW_OFF);
+ RNA_def_property_ui_text(prop, "Use Fancy Drawing", "Draw F-Curves using Anti-Aliasing and other fancy effects. Disable for better performance");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
+
/* editing */
prop= RNA_def_property(srna, "use_auto_merge_keyframes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SIPO_NOTRANSKEYCULL);
@@ -1849,43 +1978,7 @@ static void rna_def_space_time(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "SpaceTime");
RNA_def_struct_ui_text(srna, "Space Timeline Editor", "Timeline editor space data");
- /* Define Anim Playback Areas */
- prop= RNA_def_property(srna, "use_play_top_left_3d_editor", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_REGION);
- RNA_def_property_ui_text(prop, "Top-Left 3D Editor", "");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
-
- prop= RNA_def_property(srna, "use_play_3d_editors", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_ALL_3D_WIN);
- RNA_def_property_ui_text(prop, "All 3D View Editors", "");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
-
- prop= RNA_def_property(srna, "use_play_animation_editors", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_ALL_ANIM_WIN);
- RNA_def_property_ui_text(prop, "Animation Editors", "");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
-
- prop= RNA_def_property(srna, "use_play_properties_editors", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_ALL_BUTS_WIN);
- RNA_def_property_ui_text(prop, "Property Editors", "");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
-
- prop= RNA_def_property(srna, "use_play_image_editors", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_ALL_IMAGE_WIN);
- RNA_def_property_ui_text(prop, "Image Editors", "");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
-
- prop= RNA_def_property(srna, "use_play_sequence_editors", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_SEQ);
- RNA_def_property_ui_text(prop, "Sequencer Editors", "");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
-
- prop= RNA_def_property(srna, "use_play_node_editors", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_NODES);
- RNA_def_property_ui_text(prop, "Node Editors", "");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
-
- /* Other options */
+ /* view settings */
prop= RNA_def_property(srna, "show_only_selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TIME_ONLYACTSEL);
RNA_def_property_ui_text(prop, "Only Selected channels", "Show keyframes for active Object and/or its selected channels only");
@@ -1942,11 +2035,6 @@ static void rna_def_console_line(BlenderRNA *brna)
RNA_def_property_int_funcs(prop, NULL, NULL, "rna_ConsoleLine_cursor_index_range");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE, NULL);
}
-
-static EnumPropertyItem console_type_items[] = {
- {CONSOLE_TYPE_PYTHON, "PYTHON", 0, "Python", ""},
- {CONSOLE_TYPE_REPORT, "REPORT", 0, "Report", ""},
- {0, NULL, 0, NULL, NULL}};
static void rna_def_space_console(BlenderRNA *brna)
{
@@ -1963,12 +2051,7 @@ static void rna_def_space_console(BlenderRNA *brna)
RNA_def_property_range(prop, 8, 32);
RNA_def_property_ui_text(prop, "Font Size", "Font size to use for displaying the text");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE, NULL);
-
- prop= RNA_def_property(srna, "console_type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "type");
- RNA_def_property_enum_items(prop, console_type_items);
- RNA_def_property_ui_text(prop, "Type", "Console type");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE, NULL);
+
prop= RNA_def_property(srna, "select_start", PROP_INT, PROP_UNSIGNED); /* copied from text editor */
RNA_def_property_int_sdna(prop, NULL, "sel_start");
@@ -1978,32 +2061,6 @@ static void rna_def_space_console(BlenderRNA *brna)
RNA_def_property_int_sdna(prop, NULL, "sel_end");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE, NULL);
- /* reporting display */
- prop= RNA_def_property(srna, "show_report_debug", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", CONSOLE_RPT_DEBUG);
- RNA_def_property_ui_text(prop, "Show Debug", "Display debug reporting info");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL);
-
- prop= RNA_def_property(srna, "show_report_info", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", CONSOLE_RPT_INFO);
- RNA_def_property_ui_text(prop, "Show Info", "Display general information");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL);
-
- prop= RNA_def_property(srna, "show_report_operator", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", CONSOLE_RPT_OP);
- RNA_def_property_ui_text(prop, "Show Operator", "Display the operator log");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL);
-
- prop= RNA_def_property(srna, "show_report_warning", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", CONSOLE_RPT_WARN);
- RNA_def_property_ui_text(prop, "Show Warn", "Display warnings");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL);
-
- prop= RNA_def_property(srna, "show_report_error", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", CONSOLE_RPT_ERR);
- RNA_def_property_ui_text(prop, "Show Error", "Display error text");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL);
-
prop= RNA_def_property(srna, "prompt", PROP_STRING, PROP_NONE);
RNA_def_property_ui_text(prop, "Prompt", "Command line prompt");
@@ -2155,10 +2212,37 @@ static void rna_def_space_filebrowser(BlenderRNA *brna)
static void rna_def_space_info(BlenderRNA *brna)
{
StructRNA *srna;
+ PropertyRNA *prop;
srna= RNA_def_struct(brna, "SpaceInfo", "Space");
RNA_def_struct_sdna(srna, "SpaceInfo");
RNA_def_struct_ui_text(srna, "Space Info", "Info space data");
+
+ /* reporting display */
+ prop= RNA_def_property(srna, "show_report_debug", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", INFO_RPT_DEBUG);
+ RNA_def_property_ui_text(prop, "Show Debug", "Display debug reporting info");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_INFO_REPORT, NULL);
+
+ prop= RNA_def_property(srna, "show_report_info", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", INFO_RPT_INFO);
+ RNA_def_property_ui_text(prop, "Show Info", "Display general information");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_INFO_REPORT, NULL);
+
+ prop= RNA_def_property(srna, "show_report_operator", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", INFO_RPT_OP);
+ RNA_def_property_ui_text(prop, "Show Operator", "Display the operator log");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_INFO_REPORT, NULL);
+
+ prop= RNA_def_property(srna, "show_report_warning", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", INFO_RPT_WARN);
+ RNA_def_property_ui_text(prop, "Show Warn", "Display warnings");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_INFO_REPORT, NULL);
+
+ prop= RNA_def_property(srna, "show_report_error", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", INFO_RPT_ERR);
+ RNA_def_property_ui_text(prop, "Show Error", "Display error text");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_INFO_REPORT, NULL);
}
static void rna_def_space_userpref(BlenderRNA *brna)
@@ -2192,7 +2276,13 @@ static void rna_def_space_node(BlenderRNA *brna)
{SNODE_TEX_WORLD, "WORLD", ICON_WORLD_DATA, "World", "Edit texture nodes from World"},
{SNODE_TEX_BRUSH, "BRUSH", ICON_BRUSH_DATA, "Brush", "Edit texture nodes from Brush"},
{0, NULL, 0, NULL, NULL}};
-
+
+ static EnumPropertyItem backdrop_channels_items[] = {
+ {0, "COLOR", ICON_IMAGE_RGB, "Color", "Draw image with RGB colors"},
+ {SNODE_USE_ALPHA, "COLOR_ALPHA", ICON_IMAGE_RGB_ALPHA, "Color and Alpha", "Draw image with RGB colors and alpha transparency"},
+ {SNODE_SHOW_ALPHA, "ALPHA", ICON_IMAGE_ALPHA, "Alpha", "Draw alpha transparency channel"},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "SpaceNodeEditor", "Space");
RNA_def_struct_sdna(srna, "SpaceNode");
RNA_def_struct_ui_text(srna, "Space Node Editor", "Node editor space data");
@@ -2227,6 +2317,35 @@ static void rna_def_space_node(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", SNODE_BACKDRAW);
RNA_def_property_ui_text(prop, "Backdrop", "Use active Viewer Node output as backdrop for compositing nodes");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE_VIEW, NULL);
+
+ prop= RNA_def_property(srna, "use_auto_render", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SNODE_AUTO_RENDER);
+ RNA_def_property_ui_text(prop, "Auto Render", "Re-render and composite changed layer on 3D edits");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE_VIEW, NULL);
+
+ prop= RNA_def_property(srna, "backdrop_zoom", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "zoom");
+ RNA_def_property_float_default(prop, 1.0f);
+ RNA_def_property_range(prop, 0.01f, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.01, 100, 1, 2);
+ RNA_def_property_ui_text(prop, "Backdrop Zoom", "Backdrop zoom factor");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE_VIEW, NULL);
+
+ prop= RNA_def_property(srna, "backdrop_x", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "xof");
+ RNA_def_property_ui_text(prop, "Backdrop X", "Backdrop X offset");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE_VIEW, NULL);
+
+ prop= RNA_def_property(srna, "backdrop_y", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "yof");
+ RNA_def_property_ui_text(prop, "Backdrop Y", "Backdrop Y offset");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE_VIEW, NULL);
+
+ prop= RNA_def_property(srna, "backdrop_channels", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
+ RNA_def_property_enum_items(prop, backdrop_channels_items);
+ RNA_def_property_ui_text(prop, "Draw Channels", "Channels of the image to draw");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE_VIEW, NULL);
}
static void rna_def_space_logic(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_text.c b/source/blender/makesrna/intern/rna_text.c
index 15e7ce525ba..66046939350 100644
--- a/source/blender/makesrna/intern/rna_text.c
+++ b/source/blender/makesrna/intern/rna_text.c
@@ -164,7 +164,8 @@ static void rna_def_text_marker(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Edit All", "Edit all markers of the same group as one");
- prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Color", "Color to display the marker with");
}
diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c
index 567166fd15f..7c83676113d 100644
--- a/source/blender/makesrna/intern/rna_texture.c
+++ b/source/blender/makesrna/intern/rna_texture.c
@@ -128,7 +128,7 @@ static void rna_Texture_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Tex *tex= ptr->id.data;
- DAG_id_flush_update(&tex->id, 0);
+ DAG_id_tag_update(&tex->id, 0);
WM_main_add_notifier(NC_TEXTURE, tex);
}
@@ -148,12 +148,13 @@ static void rna_Texture_voxeldata_image_update(Main *bmain, Scene *scene, Pointe
rna_Texture_voxeldata_update(bmain, scene, ptr);
}
+
/* Used for Texture Properties, used (also) for/in Nodes */
static void rna_Texture_nodes_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Tex *tex= ptr->id.data;
- DAG_id_flush_update(&tex->id, 0);
+ DAG_id_tag_update(&tex->id, 0);
WM_main_add_notifier(NC_TEXTURE|ND_NODES, tex);
}
@@ -168,11 +169,12 @@ void rna_TextureSlot_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
ID *id= ptr->id.data;
- DAG_id_flush_update(id, 0);
+ DAG_id_tag_update(id, 0);
switch(GS(id->name)) {
case ID_MA:
WM_main_add_notifier(NC_MATERIAL|ND_SHADING, id);
+ WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, id);
break;
case ID_WO:
WM_main_add_notifier(NC_WORLD, id);
@@ -325,9 +327,6 @@ static void rna_ImageTexture_mipmap_set(PointerRNA *ptr, int value)
if(value) tex->imaflag |= TEX_MIPMAP;
else tex->imaflag &= ~TEX_MIPMAP;
-
- if(tex->imaflag & TEX_MIPMAP)
- tex->texfilter = TXF_EWA;
}
static void rna_Envmap_source_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -363,6 +362,16 @@ static void rna_PointDensity_psys_set(PointerRNA *ptr, PointerRNA value)
pd->psys= BLI_findindex(&ob->particlesystem, value.data) + 1;
}
+static char *rna_PointDensity_path(PointerRNA *ptr)
+{
+ return BLI_sprintfN("point_density");
+}
+
+static char *rna_VoxelData_path(PointerRNA *ptr)
+{
+ return BLI_sprintfN("voxel_data");
+}
+
#else
static void rna_def_texmapping(BlenderRNA *brna)
@@ -429,8 +438,8 @@ static void rna_def_mtex(BlenderRNA *brna)
{MTEX_BLEND_SAT, "SATURATION", 0, "Saturation", ""},
{MTEX_BLEND_VAL, "VALUE", 0, "Value", ""},
{MTEX_BLEND_COLOR, "COLOR", 0, "Color", ""},
- {MTEX_SOFT_LIGHT, "SOFT LIGHT", 0, "Soft Light", ""},
- {MTEX_LIN_LIGHT , "LINEAR LIGHT", 0, "Linear Light", ""},
+ {MTEX_SOFT_LIGHT, "SOFT_LIGHT", 0, "Soft Light", ""},
+ {MTEX_LIN_LIGHT , "LINEAR_LIGHT", 0, "Linear Light", ""},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem output_node_items[] = {
@@ -473,7 +482,7 @@ static void rna_def_mtex(BlenderRNA *brna)
prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "r");
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Color", "The default color for textures that don't return RGB");
+ RNA_def_property_ui_text(prop, "Color", "The default color for textures that don't return RGB or when RGB to intensity is enabled");
RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
prop= RNA_def_property(srna, "blend_type", PROP_ENUM, PROP_NONE);
@@ -676,8 +685,8 @@ static void rna_def_texture_clouds(BlenderRNA *brna)
prop= RNA_def_property(srna, "noise_depth", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "noisedepth");
- RNA_def_property_range(prop, 0, INT_MAX);
- RNA_def_property_ui_range(prop, 0, 6, 0, 2);
+ RNA_def_property_range(prop, 0, 30);
+ RNA_def_property_ui_range(prop, 0, 24, 0, 2);
RNA_def_property_ui_text(prop, "Noise Depth", "Sets the depth of the cloud calculation");
RNA_def_property_update(prop, 0, "rna_Texture_nodes_update");
@@ -811,8 +820,8 @@ static void rna_def_texture_marble(BlenderRNA *brna)
prop= RNA_def_property(srna, "noise_depth", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "noisedepth");
- RNA_def_property_range(prop, 0, INT_MAX);
- RNA_def_property_ui_range(prop, 0, 6, 0, 2);
+ RNA_def_property_range(prop, 0, 30);
+ RNA_def_property_ui_range(prop, 0, 24, 0, 2);
RNA_def_property_ui_text(prop, "Noise Depth", "Sets the depth of the cloud calculation");
RNA_def_property_update(prop, 0, "rna_Texture_update");
@@ -866,8 +875,8 @@ static void rna_def_texture_magic(BlenderRNA *brna)
prop= RNA_def_property(srna, "noise_depth", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "noisedepth");
- RNA_def_property_range(prop, 0, INT_MAX);
- RNA_def_property_ui_range(prop, 0, 6, 0, 2);
+ RNA_def_property_range(prop, 0, 30);
+ RNA_def_property_ui_range(prop, 0, 24, 0, 2);
RNA_def_property_ui_text(prop, "Noise Depth", "Sets the depth of the cloud calculation");
RNA_def_property_update(prop, 0, "rna_Texture_update");
}
@@ -979,13 +988,6 @@ static void rna_def_texture_image(BlenderRNA *brna)
{TEX_REPEAT, "REPEAT", 0, "Repeat", "Causes the image to repeat horizontally and vertically"},
{TEX_CHECKER, "CHECKER", 0, "Checker", "Causes the image to repeat in checker board pattern"},
{0, NULL, 0, NULL, NULL}};
-
- static EnumPropertyItem prop_normal_space[] = {
- {MTEX_NSPACE_CAMERA, "CAMERA", 0, "Camera", ""},
- {MTEX_NSPACE_WORLD, "WORLD", 0, "World", ""},
- {MTEX_NSPACE_OBJECT, "OBJECT", 0, "Object", ""},
- {MTEX_NSPACE_TANGENT, "TANGENT", 0, "Tangent", ""},
- {0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "ImageTexture", "Texture");
RNA_def_struct_ui_text(srna, "Image Texture", "");
@@ -1123,15 +1125,6 @@ static void rna_def_texture_image(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "imaflag", TEX_NORMALMAP);
RNA_def_property_ui_text(prop, "Normal Map", "Uses image RGB values for normal mapping");
RNA_def_property_update(prop, 0, "rna_Texture_update");
-
- /* not sure why this goes in mtex instead of texture directly? */
- RNA_def_struct_sdna(srna, "MTex");
-
- prop= RNA_def_property(srna, "normal_space", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "normapspace");
- RNA_def_property_enum_items(prop, prop_normal_space);
- RNA_def_property_ui_text(prop, "Normal Space", "Sets space of normal map image");
- RNA_def_property_update(prop, 0, "rna_Texture_update");
}
static void rna_def_texture_plugin(BlenderRNA *brna)
@@ -1432,6 +1425,7 @@ static void rna_def_texture_pointdensity(BlenderRNA *brna)
srna= RNA_def_struct(brna, "PointDensity", NULL);
RNA_def_struct_sdna(srna, "PointDensity");
RNA_def_struct_ui_text(srna, "PointDensity", "Point density settings");
+ RNA_def_struct_path_func(srna, "rna_PointDensity_path");
prop= RNA_def_property(srna, "point_source", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "source");
@@ -1520,7 +1514,7 @@ static void rna_def_texture_pointdensity(BlenderRNA *brna)
prop= RNA_def_property(srna, "turbulence_depth", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "noise_depth");
- RNA_def_property_range(prop, 0, INT_MAX);
+ RNA_def_property_range(prop, 0, 30);
RNA_def_property_ui_text(prop, "Depth", "Level of detail in the added turbulent noise");
RNA_def_property_update(prop, 0, "rna_Texture_update");
@@ -1584,6 +1578,7 @@ static void rna_def_texture_voxeldata(BlenderRNA *brna)
srna= RNA_def_struct(brna, "VoxelData", NULL);
RNA_def_struct_sdna(srna, "VoxelData");
RNA_def_struct_ui_text(srna, "VoxelData", "Voxel data settings");
+ RNA_def_struct_path_func(srna, "rna_VoxelData_path");
prop= RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "interp_type");
diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c
index f2c33f354c2..35186b91901 100644
--- a/source/blender/makesrna/intern/rna_ui.c
+++ b/source/blender/makesrna/intern/rna_ui.c
@@ -101,7 +101,7 @@ static int panel_poll(const bContext *C, PanelType *pt)
RNA_parameter_list_create(&list, &ptr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- pt->ext.call(&ptr, func, &list);
+ pt->ext.call((bContext *)C, &ptr, func, &list);
RNA_parameter_get_lookup(&list, "visible", &ret);
visible= *(int*)ret;
@@ -122,7 +122,7 @@ static void panel_draw(const bContext *C, Panel *pnl)
RNA_parameter_list_create(&list, &ptr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- pnl->type->ext.call(&ptr, func, &list);
+ pnl->type->ext.call((bContext *)C, &ptr, func, &list);
RNA_parameter_list_free(&list);
}
@@ -138,7 +138,7 @@ static void panel_draw_header(const bContext *C, Panel *pnl)
RNA_parameter_list_create(&list, &ptr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- pnl->type->ext.call(&ptr, func, &list);
+ pnl->type->ext.call((bContext *)C, &ptr, func, &list);
RNA_parameter_list_free(&list);
}
@@ -163,7 +163,7 @@ static void rna_Panel_unregister(const bContext *C, StructRNA *type)
WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL);
}
-static StructRNA *rna_Panel_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_Panel_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
ARegionType *art;
PanelType *pt, dummypt = {0};
@@ -180,7 +180,7 @@ static StructRNA *rna_Panel_register(const bContext *C, ReportList *reports, voi
return NULL;
if(strlen(identifier) >= sizeof(dummypt.idname)) {
- BKE_reportf(reports, RPT_ERROR, "registering panel class: '%s' is too long, maximum length is %d.", identifier, sizeof(dummypt.idname));
+ BKE_reportf(reports, RPT_ERROR, "registering panel class: '%s' is too long, maximum length is %d.", identifier, (int)sizeof(dummypt.idname));
return NULL;
}
@@ -213,7 +213,19 @@ static StructRNA *rna_Panel_register(const bContext *C, ReportList *reports, voi
pt->draw= (have_function[1])? panel_draw: NULL;
pt->draw_header= (have_function[2])? panel_draw_header: NULL;
- BLI_addtail(&art->paneltypes, pt);
+ /* XXX use "no header" flag for some ordering of panels until we have real panel ordering */
+ if(pt->flag & PNL_NO_HEADER) {
+ PanelType *pth = art->paneltypes.first;
+ while(pth && pth->flag & PNL_NO_HEADER)
+ pth=pth->next;
+
+ if(pth)
+ BLI_insertlinkbefore(&art->paneltypes, pth, pt);
+ else
+ BLI_addtail(&art->paneltypes, pt);
+ }
+ else
+ BLI_addtail(&art->paneltypes, pt);
/* update while blender is running */
if(C)
@@ -241,7 +253,7 @@ static void header_draw(const bContext *C, Header *hdr)
RNA_parameter_list_create(&list, &htr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- hdr->type->ext.call(&htr, func, &list);
+ hdr->type->ext.call((bContext *)C, &htr, func, &list);
RNA_parameter_list_free(&list);
}
@@ -266,7 +278,7 @@ static void rna_Header_unregister(const bContext *C, StructRNA *type)
WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL);
}
-static StructRNA *rna_Header_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_Header_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
ARegionType *art;
HeaderType *ht, dummyht = {0};
@@ -283,7 +295,7 @@ static StructRNA *rna_Header_register(const bContext *C, ReportList *reports, vo
return NULL;
if(strlen(identifier) >= sizeof(dummyht.idname)) {
- BKE_reportf(reports, RPT_ERROR, "registering header class: '%s' is too long, maximum length is %d.", identifier, sizeof(dummyht.idname));
+ BKE_reportf(reports, RPT_ERROR, "registering header class: '%s' is too long, maximum length is %d.", identifier, (int)sizeof(dummyht.idname));
return NULL;
}
@@ -341,7 +353,7 @@ static int menu_poll(const bContext *C, MenuType *pt)
RNA_parameter_list_create(&list, &ptr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- pt->ext.call(&ptr, func, &list);
+ pt->ext.call((bContext *)C, &ptr, func, &list);
RNA_parameter_get_lookup(&list, "visible", &ret);
visible= *(int*)ret;
@@ -362,7 +374,7 @@ static void menu_draw(const bContext *C, Menu *hdr)
RNA_parameter_list_create(&list, &mtr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- hdr->type->ext.call(&mtr, func, &list);
+ hdr->type->ext.call((bContext *)C, &mtr, func, &list);
RNA_parameter_list_free(&list);
}
@@ -385,7 +397,7 @@ static void rna_Menu_unregister(const bContext *C, StructRNA *type)
WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL);
}
-static StructRNA *rna_Menu_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_Menu_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
MenuType *mt, dummymt = {0};
Menu dummymenu= {0};
@@ -401,7 +413,7 @@ static StructRNA *rna_Menu_register(const bContext *C, ReportList *reports, void
return NULL;
if(strlen(identifier) >= sizeof(dummymt.idname)) {
- BKE_reportf(reports, RPT_ERROR, "registering menu class: '%s' is too long, maximum length is %d.", identifier, sizeof(dummymt.idname));
+ BKE_reportf(reports, RPT_ERROR, "registering menu class: '%s' is too long, maximum length is %d.", identifier, (int)sizeof(dummymt.idname));
return NULL;
}
@@ -449,6 +461,16 @@ static void rna_UILayout_active_set(PointerRNA *ptr, int value)
uiLayoutSetActive(ptr->data, value);
}
+static int rna_UILayout_alert_get(PointerRNA *ptr)
+{
+ return uiLayoutGetRedAlert(ptr->data);
+}
+
+static void rna_UILayout_alert_set(PointerRNA *ptr, int value)
+{
+ uiLayoutSetRedAlert(ptr->data, value);
+}
+
static void rna_UILayout_op_context_set(PointerRNA *ptr, int value)
{
uiLayoutSetOperatorContext(ptr->data, value);
@@ -552,10 +574,8 @@ static void rna_def_ui_layout(BlenderRNA *brna)
RNA_def_property_boolean_funcs(prop, "rna_UILayout_enabled_get", "rna_UILayout_enabled_set");
RNA_def_property_ui_text(prop, "Enabled", "When false, this (sub)layout is greyed out.");
-#if 0
- prop= RNA_def_property(srna, "red_alert", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_funcs(prop, "rna_UILayout_red_alert_get", "rna_UILayout_red_alert_set");
-#endif
+ prop= RNA_def_property(srna, "alert", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_UILayout_alert_get", "rna_UILayout_alert_set");
prop= RNA_def_property(srna, "alignment", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, alignment_items);
@@ -626,7 +646,7 @@ static void rna_def_panel(BlenderRNA *brna)
/* registration */
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
RNA_def_property_ui_text(prop, "ID Name", "If this is set, the panel gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is \"OBJECT_PT_hello\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_PT_hello\"");
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
@@ -688,7 +708,7 @@ static void rna_def_header(BlenderRNA *brna)
/* registration */
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
RNA_def_property_ui_text(prop, "ID Name", "If this is set, the header gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is \"OBJECT_HT_hello\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_HT_hello\"");
prop= RNA_def_property(srna, "bl_space_type", PROP_ENUM, PROP_NONE);
@@ -738,7 +758,7 @@ static void rna_def_menu(BlenderRNA *brna)
/* registration */
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
RNA_def_property_ui_text(prop, "ID Name", "If this is set, the menu gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is \"OBJECT_MT_hello\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_MT_hello\"");
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c
index 1d86faa5e53..022f818d7d7 100644
--- a/source/blender/makesrna/intern/rna_ui_api.c
+++ b/source/blender/makesrna/intern/rna_ui_api.c
@@ -35,7 +35,7 @@
#ifdef RNA_RUNTIME
-static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, char *propname, char *name, int icon, int expand, int slider, int toggle, int icon_only, int event, int full_event, int emboss, int index)
+static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, const char *name, int icon, int expand, int slider, int toggle, int icon_only, int event, int full_event, int emboss, int index)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
int flag= 0;
@@ -56,7 +56,7 @@ static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, char *propname, char
uiItemFullR(layout, ptr, prop, index, 0, flag, name, icon);
}
-static PointerRNA rna_uiItemO(uiLayout *layout, char *opname, char *name, int icon, int emboss)
+static PointerRNA rna_uiItemO(uiLayout *layout, const char *opname, const char *name, int icon, int emboss)
{
int flag= UI_ITEM_O_RETURN_PROPS;
flag |= (emboss)? 0: UI_ITEM_R_NO_BG;
@@ -65,11 +65,15 @@ static PointerRNA rna_uiItemO(uiLayout *layout, char *opname, char *name, int ic
#else
-#define DEF_ICON(name) {name, (#name)+5, 0, (#name)+5, ""},
+#define DEF_ICON_BLANK_SKIP
+#define DEF_ICON(name) {ICON_##name, (#name), 0, (#name), ""},
+#define DEF_VICO(name) {VICO_##name, (#name), 0, (#name), ""},
static EnumPropertyItem icon_items[] = {
#include "UI_icons.h"
{0, NULL, 0, NULL, NULL}};
+#undef DEF_ICON_BLANK_SKIP
#undef DEF_ICON
+#undef DEF_VICO
static void api_ui_item_common(FunctionRNA *func)
{
@@ -137,7 +141,7 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_boolean(func, "align", 0, "", "Align buttons to each other.");
func= RNA_def_function(srna, "column_flow", "uiLayoutColumnFlow");
- parm= RNA_def_int(func, "columns", 0, 0, INT_MAX, "", "Number of columns, 0 is automatic.", 0, INT_MAX);
+ RNA_def_int(func, "columns", 0, 0, INT_MAX, "", "Number of columns, 0 is automatic.", 0, INT_MAX);
parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in.");
RNA_def_function_return(func, parm);
RNA_def_boolean(func, "align", 0, "", "Align buttons to each other.");
@@ -287,24 +291,22 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_int(func, "cols", 0, 0, INT_MAX, "Number of thumbnail preview columns to display", "", 0, INT_MAX);
func= RNA_def_function(srna, "template_any_ID", "uiTemplateAnyID");
- RNA_def_function_flag(func, FUNC_USE_CONTEXT);
parm= RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL);
parm= RNA_def_string(func, "property", "", 0, "", "Identifier of property in data.");
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_string(func, "type_property", "", 0, "", "Identifier of property in data giving the type of the ID-blocks to use.");
RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_string(func, "text", "", 0, "", "Custom label to display in UI.");
+ RNA_def_string(func, "text", "", 0, "", "Custom label to display in UI.");
func= RNA_def_function(srna, "template_path_builder", "uiTemplatePathBuilder");
- RNA_def_function_flag(func, FUNC_USE_CONTEXT);
parm= RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL);
parm= RNA_def_string(func, "property", "", 0, "", "Identifier of property in data.");
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_pointer(func, "root", "ID", "", "ID-block from which path is evaluated from.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR);
- parm= RNA_def_string(func, "text", "", 0, "", "Custom label to display in UI.");
+ RNA_def_string(func, "text", "", 0, "", "Custom label to display in UI.");
func= RNA_def_function(srna, "template_modifier", "uiTemplateModifier");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
@@ -325,6 +327,7 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_function_ui_description(func, "Item. A preview window for materials, textures, lamps, etc.");
parm= RNA_def_pointer(func, "id", "ID", "", "ID datablock.");
RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_boolean(func, "show_buttons", 1, "", "Show preview buttons?");
RNA_def_pointer(func, "parent", "ID", "", "ID datablock.");
RNA_def_pointer(func, "slot", "TextureSlot", "", "Texture slot.");
@@ -343,17 +346,14 @@ void RNA_api_ui_layout(StructRNA *srna)
func= RNA_def_function(srna, "template_histogram", "uiTemplateHistogram");
RNA_def_function_ui_description(func, "Item. A histogramm widget to analyze imaga data.");
api_ui_item_rna_common(func);
- RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail.");
func= RNA_def_function(srna, "template_waveform", "uiTemplateWaveform");
RNA_def_function_ui_description(func, "Item. A waveform widget to analyze imaga data.");
api_ui_item_rna_common(func);
- RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail.");
func= RNA_def_function(srna, "template_vectorscope", "uiTemplateVectorscope");
RNA_def_function_ui_description(func, "Item. A vectorscope widget to analyze imaga data.");
api_ui_item_rna_common(func);
- RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail.");
func= RNA_def_function(srna, "template_layers", "uiTemplateLayers");
api_ui_item_rna_common(func);
@@ -398,14 +398,14 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL);
parm= RNA_def_string(func, "active_property", "", 0, "", "Identifier of property in data, for the active element.");
RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_int(func, "rows", 5, 0, INT_MAX, "", "Number of rows to display.", 0, INT_MAX);
- parm= RNA_def_int(func, "maxrows", 5, 0, INT_MAX, "", "Maximum number of rows to display.", 0, INT_MAX);
- parm= RNA_def_enum(func, "type", list_type_items, 0, "Type", "Type of list to use.");
+ RNA_def_int(func, "rows", 5, 0, INT_MAX, "", "Number of rows to display.", 0, INT_MAX);
+ RNA_def_int(func, "maxrows", 5, 0, INT_MAX, "", "Maximum number of rows to display.", 0, INT_MAX);
+ RNA_def_enum(func, "type", list_type_items, 0, "Type", "Type of list to use.");
func= RNA_def_function(srna, "template_running_jobs", "uiTemplateRunningJobs");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
- func= RNA_def_function(srna, "template_operator_search", "uiTemplateOperatorSearch");
+ RNA_def_function(srna, "template_operator_search", "uiTemplateOperatorSearch");
func= RNA_def_function(srna, "template_header_3D", "uiTemplateHeader3D");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index 7459adc121f..e080b735048 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -33,22 +33,28 @@
#include "DNA_space_types.h"
#include "DNA_userdef_types.h"
#include "DNA_brush_types.h"
+#include "DNA_view3d_types.h"
#include "WM_api.h"
#include "WM_types.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
#include "BKE_sound.h"
#ifdef RNA_RUNTIME
-#include "BKE_main.h"
+#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+
#include "BKE_DerivedMesh.h"
#include "BKE_depsgraph.h"
-#include "DNA_object_types.h"
-#include "GPU_draw.h"
#include "BKE_global.h"
+#include "BKE_main.h"
+
+#include "GPU_draw.h"
+
+#include "BLF_api.h"
#include "MEM_guardedalloc.h"
#include "MEM_CacheLimiterC-Api.h"
@@ -58,6 +64,34 @@ static void rna_userdef_update(Main *bmain, Scene *scene, PointerRNA *ptr)
WM_main_add_notifier(NC_WINDOW, NULL);
}
+static void rna_userdef_show_manipulator_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ UserDef *userdef = (UserDef *)ptr->data;
+
+ /* lame, loop over all views and set */
+ bScreen *sc;
+ ScrArea *sa;
+ SpaceLink *sl;
+
+ /* from scene copy to the other views */
+ for(sc=bmain->screen.first; sc; sc=sc->id.next) {
+ for(sa=sc->areabase.first; sa; sa=sa->next) {
+ for(sl=sa->spacedata.first; sl; sl=sl->next) {
+ if(sl->spacetype==SPACE_VIEW3D) {
+ View3D *v3d= (View3D *)sl;
+ if(userdef->tw_flag & V3D_USE_MANIPULATOR)
+ v3d->twflag |= V3D_USE_MANIPULATOR;
+ else
+ v3d->twflag &= ~V3D_USE_MANIPULATOR;
+ }
+ }
+ }
+ }
+
+ rna_userdef_update(bmain, scene, ptr);
+}
+
+
static void rna_userdef_script_autoexec_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
UserDef *userdef = (UserDef*)ptr->data;
@@ -185,7 +219,7 @@ static void rna_UserDef_weight_color_update(Main *bmain, Scene *scene, PointerRN
for(ob= bmain->object.first; ob; ob= ob->id.next) {
if(ob->mode & OB_MODE_WEIGHT_PAINT)
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
rna_userdef_update(bmain, scene, ptr);
@@ -221,8 +255,13 @@ static void rna_userdef_addon_remove(bAddon *bext)
static void rna_userdef_temp_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
extern char btempdir[];
- UserDef *userdef = (UserDef*)ptr->data;
- strncpy(btempdir, userdef->tempdir, FILE_MAXDIR+FILE_MAXFILE);
+ BLI_where_is_temp(btempdir, 1);
+}
+
+static void rna_userdef_text_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ BLF_cache_clear();
+ WM_main_add_notifier(NC_WINDOW, NULL);
}
#else
@@ -334,32 +373,32 @@ static void rna_def_userdef_theme_ui_wcol(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "uiWidgetColors");
RNA_def_struct_ui_text(srna, "Theme Widget Color Set", "Theme settings for widget color sets");
- prop= RNA_def_property(srna, "outline", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "outline", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Outline", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "inner", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "inner", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Inner", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "inner_sel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "inner_sel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Inner Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "item", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "item", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Item", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "text", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "text", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Text", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "text_sel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "text_sel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Text Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -389,32 +428,32 @@ static void rna_def_userdef_theme_ui_wcol_state(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "uiWidgetStateColors");
RNA_def_struct_ui_text(srna, "Theme Widget State Color", "Theme settings for widget state colors");
- prop= RNA_def_property(srna, "inner_anim", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "inner_anim", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Animated", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "inner_anim_sel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "inner_anim_sel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Animated Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "inner_key", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "inner_key", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Keyframe", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "inner_key_sel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "inner_key_sel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Keyframe Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "inner_driven", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "inner_driven", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Driven", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "inner_driven_sel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "inner_driven_sel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Driven Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -566,60 +605,60 @@ static void rna_def_userdef_theme_spaces_main(StructRNA *srna, int spacetype)
PropertyRNA *prop;
/* window */
- prop= RNA_def_property(srna, "back", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "back", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Window Background", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "title", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "title", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Title", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "text", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "text", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Text", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "text_hi", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "text_hi", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Text Highlight", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
/* header */
- prop= RNA_def_property(srna, "header", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "header", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Header", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "header_text", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "header_text", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Header Text", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "header_text_hi", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "header_text_hi", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Header Text Highlight", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
/* buttons */
// if(! ELEM(spacetype, SPACE_BUTS, SPACE_OUTLINER)) {
- prop= RNA_def_property(srna, "button", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "button", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Region Background", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "button_title", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "button_title", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Region Text Titles", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "button_text", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "button_text", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Region Text", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "button_text_hi", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "button_text_hi", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Region Text Highlight", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -627,22 +666,22 @@ static void rna_def_userdef_theme_spaces_main(StructRNA *srna, int spacetype)
/* list/channels */
if(ELEM5(spacetype, SPACE_IPO, SPACE_ACTION, SPACE_NLA, SPACE_NODE, SPACE_FILE)) {
- prop= RNA_def_property(srna, "list", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "list", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Source List", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "list_title", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "list_title", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Source List Title", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "list_text", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "list_text", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Source List Text", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "list_text_hi", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "list_text_hi", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Source List Text Highlight", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -653,12 +692,12 @@ static void rna_def_userdef_theme_spaces_vertex(StructRNA *srna)
{
PropertyRNA *prop;
- prop= RNA_def_property(srna, "vertex", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "vertex", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Vertex", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "vertex_select", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "vertex_select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Vertex Select", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -673,27 +712,27 @@ static void rna_def_userdef_theme_spaces_edge(StructRNA *srna)
{
PropertyRNA *prop;
- prop= RNA_def_property(srna, "edge_select", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "edge_select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Edge Select", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "edge_seam", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "edge_seam", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Edge Seam", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "edge_sharp", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "edge_sharp", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Edge Sharp", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "edge_crease", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "edge_crease", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Edge Crease", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "edge_facesel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "edge_facesel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Edge UV Face Select", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -703,17 +742,17 @@ static void rna_def_userdef_theme_spaces_face(StructRNA *srna)
{
PropertyRNA *prop;
- prop= RNA_def_property(srna, "face", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "face", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Face", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "face_select", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "face_select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Face Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "face_dot", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "face_dot", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Face Dot Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -729,86 +768,86 @@ static void rna_def_userdef_theme_spaces_curves(StructRNA *srna, short incl_nurb
PropertyRNA *prop;
if (incl_nurbs) {
- prop= RNA_def_property(srna, "nurb_uline", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "nurb_uline", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "nurb_uline");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Nurb U-lines", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "nurb_vline", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "nurb_vline", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "nurb_vline");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Nurb V-lines", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "nurb_sel_uline", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "nurb_sel_uline", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "nurb_sel_uline");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Nurb active U-lines", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "nurb_sel_vline", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "nurb_sel_vline", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "nurb_sel_vline");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Nurb active V-lines", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "act_spline", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "act_spline", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "act_spline");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Active spline", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
}
- prop= RNA_def_property(srna, "handle_free", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_free", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "handle_free");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Free handle color", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_auto", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_auto", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "handle_auto");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Auto handle color", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_vect", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_vect", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "handle_vect");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Vector handle color", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_align", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_align", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "handle_align");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Align handle color", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_sel_free", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_sel_free", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "handle_sel_free");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Free handle selected color", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_sel_auto", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_sel_auto", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "handle_sel_auto");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Auto handle selected color", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_sel_vect", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_sel_vect", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "handle_sel_vect");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Vector handle selected color", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_sel_align", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_sel_align", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "handle_sel_align");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Align handle selected color", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "lastsel_point", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "lastsel_point", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "lastsel_point");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Last selected point", "");
@@ -828,51 +867,51 @@ static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_VIEW3D);
- prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Panel", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wire", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "wire", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Wire", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "lamp", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "lamp", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Lamp", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "object_selected", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "object_selected", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "select");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Object Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "object_active", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "object_active", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "active");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Active Object", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "object_grouped", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "object_grouped", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "group");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Object Grouped", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "object_grouped_active", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "object_grouped_active", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "group_active");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Object Grouped Active", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "transform", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "transform", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Transform", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -882,32 +921,47 @@ static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna)
rna_def_userdef_theme_spaces_face(srna);
rna_def_userdef_theme_spaces_curves(srna, 1);
- prop= RNA_def_property(srna, "editmesh_active", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "extra_edge_len", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Edge Length Text", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop= RNA_def_property(srna, "extra_face_angle", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Face Angle Text", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop= RNA_def_property(srna, "extra_face_area", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Face Area Text", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop= RNA_def_property(srna, "editmesh_active", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Active Vert/Edge/Face", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Face Normal", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "vertex_normal", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "vertex_normal", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Vertex Normal", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "bone_solid", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "bone_solid", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Bone Solid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "bone_pose", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "bone_pose", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Bone Pose", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "cframe");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Current Frame", "");
@@ -927,23 +981,23 @@ static void rna_def_userdef_theme_space_graph(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_IPO);
- prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Panel", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "window_sliders", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "window_sliders", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade1");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Window Sliders", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "channels_region", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "channels_region", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade2");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Channels Region", "");
@@ -952,18 +1006,18 @@ static void rna_def_userdef_theme_space_graph(BlenderRNA *brna)
rna_def_userdef_theme_spaces_vertex(srna);
rna_def_userdef_theme_spaces_curves(srna, 0);
- prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "cframe");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Current Frame", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_vertex", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_vertex", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Handle Vertex", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_vertex_select", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_vertex_select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Handle Vertex Select", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -973,25 +1027,25 @@ static void rna_def_userdef_theme_space_graph(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Handle Vertex Size", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "channel_group", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "channel_group", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "group");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Channel Group", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "active_channels_group", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "active_channels_group", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "group_active");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Active Channel Group", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "dopesheet_channel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "dopesheet_channel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "ds_channel");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "DopeSheet Channel", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "dopesheet_subchannel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "dopesheet_subchannel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "ds_subchannel");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "DopeSheet Sub-Channel", "");
@@ -1011,37 +1065,37 @@ static void rna_def_userdef_theme_space_file(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_FILE);
- prop= RNA_def_property(srna, "selected_file", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "selected_file", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "hilite");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Selected File", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "tiles", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "tiles", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "panel");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Tiles", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "scrollbar", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "scrollbar", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade1");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Scrollbar", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "scroll_handle", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "scroll_handle", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade2");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Scroll Handle", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "active_file", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "active_file", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "active");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Active File", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "active_file_text", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "active_file_text", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "grid");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Active File Text", "");
@@ -1087,31 +1141,31 @@ static void rna_def_userdef_theme_space_console(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_CONSOLE);
- prop= RNA_def_property(srna, "line_output", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "line_output", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "console_output");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Line Output", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "line_input", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "line_input", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "console_input");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Line Input", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "line_info", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "line_info", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "console_info");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Line Info", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "line_error", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "line_error", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "console_error");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Line Error", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "cursor", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "cursor", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "console_cursor");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Cursor", "");
@@ -1145,55 +1199,55 @@ static void rna_def_userdef_theme_space_text(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_TEXT);
- prop= RNA_def_property(srna, "line_numbers_background", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "line_numbers_background", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "grid");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Line Numbers Background", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "scroll_bar", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "scroll_bar", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade1");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Scroll Bar", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "selected_text", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "selected_text", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade2");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Selected Text", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "cursor", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "cursor", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "hilite");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Cursor", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "syntax_builtin", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "syntax_builtin", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxb");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Syntax Built-in", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "syntax_special", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "syntax_special", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxv");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Syntax Special", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "syntax_comment", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "syntax_comment", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxc");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Syntax Comment", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "syntax_string", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "syntax_string", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxl");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Syntax String", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "syntax_numbers", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "syntax_numbers", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxn");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Syntax Numbers", "");
@@ -1213,49 +1267,49 @@ static void rna_def_userdef_theme_space_node(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_NODE);
- prop= RNA_def_property(srna, "wire", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "wire", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "wire");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Wires", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wire_select", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "wire_select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "edge_select");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Wire Select", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "selected_text", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "selected_text", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade2");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Selected Text", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "node_backdrop", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "node_backdrop", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxl");
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Node Backdrop", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "in_out_node", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "in_out_node", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxn");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "In/Out Node", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "converter_node", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "converter_node", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxv");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Converter Node", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "operator_node", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "operator_node", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxb");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Operator Node", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "group_node", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "group_node", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxc");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Group Node", "");
@@ -1275,7 +1329,7 @@ static void rna_def_userdef_theme_space_logic(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_LOGIC);
- prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Panel", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -1295,7 +1349,7 @@ static void rna_def_userdef_theme_space_buts(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_BUTS);
- prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Panel", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -1314,12 +1368,12 @@ static void rna_def_userdef_theme_space_time(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_TIME);
- prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "cframe");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Current Frame", "");
@@ -1339,18 +1393,18 @@ static void rna_def_userdef_theme_space_sound(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_SOUND);
- prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "window_sliders", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "window_sliders", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade1");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Window Sliders", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "cframe");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Current Frame", "");
@@ -1372,12 +1426,12 @@ static void rna_def_userdef_theme_space_image(BlenderRNA *brna)
rna_def_userdef_theme_spaces_vertex(srna);
rna_def_userdef_theme_spaces_face(srna);
- prop= RNA_def_property(srna, "editmesh_active", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "editmesh_active", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Active Vert/Edge/Face", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "scope_back", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "scope_back", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "preview_back");
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Scope region background color", "");
@@ -1397,78 +1451,78 @@ static void rna_def_userdef_theme_space_seq(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_IMAGE);
- prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "window_sliders", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "window_sliders", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade1");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Window Sliders", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "movie_strip", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "movie_strip", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "movie");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Movie Strip", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "image_strip", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "image_strip", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "image");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Image Strip", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "scene_strip", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "scene_strip", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "scene");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Scene Strip", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "audio_strip", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "audio_strip", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "audio");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Audio Strip", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "effect_strip", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "effect_strip", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "effect");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Effect Strip", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "plugin_strip", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "plugin_strip", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "plugin");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Plugin Strip", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "transition_strip", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "transition_strip", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "transition");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Transition Strip", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "meta_strip", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "meta_strip", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "meta");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Meta Strip", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "cframe");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Current Frame", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "keyframe", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "keyframe", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "vertex_select");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Keyframe", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "draw_action", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "draw_action", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "bone_pose");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Draw Action", "");
@@ -1488,72 +1542,72 @@ static void rna_def_userdef_theme_space_action(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_ACTION);
- prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "value_sliders", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "value_sliders", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "face");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Value Sliders", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "view_sliders", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "view_sliders", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade1");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "View Sliders", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "channels", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "channels", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade2");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Channels", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "channels_selected", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "channels_selected", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "hilite");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Channels Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "channel_group", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "channel_group", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "group");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Channel Group", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "active_channels_group", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "active_channels_group", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "group_active");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Active Channel Group", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "long_key", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "long_key", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "strip");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Long Key", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "long_key_selected", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "long_key_selected", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "strip_select");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Long Key Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "cframe");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Current Frame", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "dopesheet_channel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "dopesheet_channel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "ds_channel");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "DopeSheet Channel", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "dopesheet_subchannel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "dopesheet_subchannel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "ds_subchannel");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "DopeSheet Sub-Channel", "");
@@ -1573,42 +1627,42 @@ static void rna_def_userdef_theme_space_nla(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_NLA);
- prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "view_sliders", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "view_sliders", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade1");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "View Sliders", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "bars", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "bars", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade2");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Bars", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "bars_selected", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "bars_selected", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "hilite");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Bars Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "strips", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "strips", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "strip");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Strips", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "strips_selected", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "strips_selected", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "strip_select");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Strips Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "cframe");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Current Frame", "");
@@ -1624,19 +1678,19 @@ static void rna_def_userdef_theme_colorset(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "ThemeWireColor");
RNA_def_struct_ui_text(srna, "Theme Bone Color Set", "Theme settings for bone color sets");
- prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "solid");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Normal", "Color used for the surface of bones");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "select", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "select");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Select", "Color used for selected bones");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "active", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "active", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Active", "Color used for active bones");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -1669,7 +1723,7 @@ static void rna_def_userdef_themes(BlenderRNA *brna)
{14, "USER_PREFERENCES", ICON_PREFERENCES, "User Preferences", ""},
{15, "INFO", ICON_INFO, "Info", ""},
{16, "FILE_BROWSER", ICON_FILESEL, "File Browser", ""},
- {17, "CONSOLE", ICON_CONSOLE, "Console", ""},
+ {17, "CONSOLE", ICON_CONSOLE, "Python Console", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "Theme", NULL);
@@ -1894,6 +1948,10 @@ static void rna_def_userdef_view(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_TOOLTIPS);
RNA_def_property_ui_text(prop, "Tooltips", "Display tooltips");
+ prop= RNA_def_property(srna, "show_tooltips_python", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", USER_TOOLTIPS_PYTHON);
+ RNA_def_property_ui_text(prop, "Show Python Tooltips", "Show Python references in tooltips");
+
prop= RNA_def_property(srna, "show_object_info", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_DRAWVIEWINFO);
RNA_def_property_ui_text(prop, "Display Object Info", "Display objects name and frame number in 3D view");
@@ -2009,9 +2067,9 @@ static void rna_def_userdef_view(BlenderRNA *brna)
/* 3D transform widget */
prop= RNA_def_property(srna, "show_manipulator", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "tw_flag", 1);
+ RNA_def_property_boolean_sdna(prop, NULL, "tw_flag", V3D_USE_MANIPULATOR);
RNA_def_property_ui_text(prop, "Manipulator", "Use 3D transform manipulator");
- RNA_def_property_update(prop, 0, "rna_userdef_update");
+ RNA_def_property_update(prop, 0, "rna_userdef_show_manipulator_update");
prop= RNA_def_property(srna, "manipulator_size", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "tw_size");
@@ -2095,7 +2153,7 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_drag_immediately", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_RELEASECONFIRM);
- RNA_def_property_ui_text(prop, "Release confirm", "Moving things with a mouse drag confirms when releasing the button");
+ RNA_def_property_ui_text(prop, "Release confirms", "Moving things with a mouse drag confirms when releasing the button");
/* Undo */
prop= RNA_def_property(srna, "undo_steps", PROP_INT, PROP_NONE);
@@ -2127,10 +2185,6 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", AUTOKEY_FLAG_INSERTAVAIL);
RNA_def_property_ui_text(prop, "Auto Keyframe Insert Available", "Automatic keyframe insertion in available curves");
- prop= RNA_def_property(srna, "use_keyframe_insert_keyingset", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", AUTOKEY_FLAG_ONLYKEYINGSET);
- RNA_def_property_ui_text(prop, "Auto Keyframe Insert Keying Set", "Automatic keyframe insertion using active Keying Set");
-
/* keyframing settings */
prop= RNA_def_property(srna, "use_keyframe_insert_needed", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", AUTOKEY_FLAG_INSERTNEEDED);
@@ -2185,7 +2239,7 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
/* sculpt and paint */
- prop= RNA_def_property(srna, "sculpt_paint_overlay_color", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "sculpt_paint_overlay_color", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "sculpt_paint_overlay_col");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Sculpt/Paint Overlay Color", "Color of texture overlay");
@@ -2542,6 +2596,11 @@ static void rna_def_userdef_system(BlenderRNA *brna)
RNA_def_property_range(prop, 50, 1000);
RNA_def_property_ui_text(prop, "Wait Timer (ms)", "Time in milliseconds between each frame recorded for screencast");
+ prop= RNA_def_property(srna, "use_text_antialiasing", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "text_render", USER_TEXT_DISABLE_AA);
+ RNA_def_property_ui_text(prop, "Text Anti-aliasing", "Draw user interface text anti-aliased");
+ RNA_def_property_update(prop, 0, "rna_userdef_text_update");
+
#if 0
prop= RNA_def_property(srna, "verse_master", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "versemaster");
@@ -2613,6 +2672,12 @@ static void rna_def_userdef_input(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_CONTINUOUS_MOUSE);
RNA_def_property_ui_text(prop, "Continuous Grab", "Allow moving the mouse outside the view on some manipulations (transform, ui control drag)");
+ /* tweak tablet & mouse preset */
+ prop= RNA_def_property(srna, "drag_threshold", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "dragthreshold");
+ RNA_def_property_range(prop, 3, 40);
+ RNA_def_property_ui_text(prop, "Drag Threshold", "Amount of pixels you have to drag before dragging UI items happens");
+
prop= RNA_def_property(srna, "ndof_pan_speed", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "ndof_pan");
RNA_def_property_range(prop, 0, 200);
@@ -2689,10 +2754,18 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_FILTERFILEEXTS);
RNA_def_property_ui_text(prop, "Filter File Extensions", "Display only files with extensions in the image select window");
+ prop= RNA_def_property(srna, "hide_recent_locations", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_HIDE_RECENT);
+ RNA_def_property_ui_text(prop, "Hide Recent Locations", "Hide recent locations in the file selector");
+
+ prop= RNA_def_property(srna, "show_thumbnails", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_SHOW_THUMBNAILS);
+ RNA_def_property_ui_text(prop, "Show Thumbnails", "Open in thumbnail view for images and movies");
+
prop= RNA_def_property(srna, "use_relative_paths", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_RELPATHS);
RNA_def_property_ui_text(prop, "Relative Paths", "Default relative path option for the file selector");
-
+
prop= RNA_def_property(srna, "use_file_compression", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_FILECOMPRESS);
RNA_def_property_ui_text(prop, "Compress File", "Enable file compression when saving .blend files");
@@ -2719,7 +2792,7 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
prop= RNA_def_property(srna, "render_output_directory", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_sdna(prop, NULL, "renderdir");
- RNA_def_property_ui_text(prop, "Render Output Directory", "The default directory for rendering output");
+ RNA_def_property_ui_text(prop, "Render Output Directory", "The default directory for rendering output, for new scenes");
prop= RNA_def_property(srna, "script_directory", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_sdna(prop, NULL, "pythondir");
@@ -2734,11 +2807,11 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Temporary Directory", "The directory for storing temporary save files");
RNA_def_property_update(prop, 0, "rna_userdef_temp_update");
- prop= RNA_def_property(srna, "image_editor", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "image_editor", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_sdna(prop, NULL, "image_editor");
RNA_def_property_ui_text(prop, "Image Editor", "Path to an image editor");
- prop= RNA_def_property(srna, "animation_player", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "animation_player", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_sdna(prop, NULL, "anim_player");
RNA_def_property_ui_text(prop, "Animation Player", "Path to a custom animation/frame sequence player");
@@ -2757,7 +2830,7 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_auto_save_temporary_files", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_AUTOSAVE);
- RNA_def_property_ui_text(prop, "Auto Save Temporary Files", "Automatic saving of temporary files");
+ RNA_def_property_ui_text(prop, "Auto Save Temporary Files", "Automatic saving of temporary files in temp directory, uses process ID");
RNA_def_property_update(prop, 0, "rna_userdef_autosave_update");
prop= RNA_def_property(srna, "auto_save_time", PROP_INT, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 62d0c99f6c5..c432123d6ba 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -101,7 +101,7 @@ EnumPropertyItem event_timer_type_items[]= {
{TIMER2, "TIMER2", 0, "Timer 2", ""},
{0, NULL, 0, NULL, NULL}};
-/* not returned: CAPSLOCKKEY, UNKNOWNKEY, GRLESSKEY */
+/* not returned: CAPSLOCKKEY, UNKNOWNKEY */
EnumPropertyItem event_type_items[] = {
{0, "NONE", 0, "", ""},
@@ -175,8 +175,8 @@ EnumPropertyItem event_type_items[] = {
{RIGHTCTRLKEY, "RIGHT_CTRL", 0, "Right Ctrl", ""},
{RIGHTSHIFTKEY, "RIGHT_SHIFT", 0, "Right Shift", ""},
{0, "", 0, NULL, NULL},
- {COMMANDKEY, "COMMAND", 0, "Command", ""},
- {0, "", 0, NULL, NULL},
+ {OSKEY, "OSKEY", 0, "OS Key", ""},
+ {GRLESSKEY, "GRLESS", 0, "Grless", ""},
{ESCKEY, "ESC", 0, "Esc", ""},
{TABKEY, "TAB", 0, "Tab", ""},
{RETKEY, "RET", 0, "Return", ""},
@@ -265,6 +265,7 @@ EnumPropertyItem operator_flag_items[] = {
{OPTYPE_BLOCKING, "BLOCKING", 0, "Finished", ""},
{OPTYPE_MACRO, "MACRO", 0, "Macro", ""},
{OPTYPE_GRAB_POINTER, "GRAB_POINTER", 0, "Grab Pointer", ""},
+ {OPTYPE_PRESET, "PRESET", 0, "Preset", ""},
{0, NULL, 0, NULL, NULL}};
EnumPropertyItem operator_return_items[] = {
@@ -294,6 +295,8 @@ EnumPropertyItem wm_report_items[] = {
#ifdef RNA_RUNTIME
+#include <assert.h>
+
#include "WM_api.h"
#include "BKE_idprop.h"
@@ -588,7 +591,7 @@ static void rna_wmKeyMapItem_idname_set(PointerRNA *ptr, const char *value)
if(strcmp(idname, kmi->idname) != 0) {
BLI_strncpy(kmi->idname, idname, sizeof(kmi->idname));
- WM_keymap_properties_reset(kmi);
+ WM_keymap_properties_reset(kmi, NULL);
}
}
@@ -612,6 +615,12 @@ static int rna_wmKeyMapItem_name_length(PointerRNA *ptr)
return 0;
}
+static int rna_KeyMapItem_userdefined_get(PointerRNA *ptr)
+{
+ wmKeyMapItem *kmi= ptr->data;
+ return kmi->id < 0;
+}
+
static void rna_wmClipboard_get(PointerRNA *ptr, char *value)
{
char *pbuf;
@@ -649,10 +658,10 @@ static void rna_wmClipboard_set(PointerRNA *ptr, const char *value)
WM_clipboard_text_set((void *) value, FALSE);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static void rna_Operator_unregister(const bContext *C, StructRNA *type)
{
- char *idname;
+ const char *idname;
wmOperatorType *ot= RNA_struct_blender_type_get(type);
if(!ot)
@@ -668,7 +677,7 @@ static void rna_Operator_unregister(const bContext *C, StructRNA *type)
idname= ot->idname;
WM_operatortype_remove(ot->idname);
- MEM_freeN(idname);
+ MEM_freeN((void *)idname);
/* not to be confused with the RNA_struct_free that WM_operatortype_remove calls, they are 2 different srna's */
RNA_struct_free(&BLENDER_RNA, type);
@@ -687,7 +696,7 @@ static int operator_poll(bContext *C, wmOperatorType *ot)
RNA_parameter_list_create(&list, &ptr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- ot->ext.call(&ptr, func, &list);
+ ot->ext.call(C, &ptr, func, &list);
RNA_parameter_get_lookup(&list, "visible", &ret);
visible= *(int*)ret;
@@ -710,7 +719,7 @@ static int operator_execute(bContext *C, wmOperator *op)
RNA_parameter_list_create(&list, &opr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- op->type->ext.call(&opr, func, &list);
+ op->type->ext.call(C, &opr, func, &list);
RNA_parameter_get_lookup(&list, "result", &ret);
result= *(int*)ret;
@@ -734,7 +743,7 @@ static int operator_check(bContext *C, wmOperator *op)
RNA_parameter_list_create(&list, &opr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- op->type->ext.call(&opr, func, &list);
+ op->type->ext.call(C, &opr, func, &list);
RNA_parameter_get_lookup(&list, "result", &ret);
result= *(int*)ret;
@@ -758,7 +767,7 @@ static int operator_invoke(bContext *C, wmOperator *op, wmEvent *event)
RNA_parameter_list_create(&list, &opr, func);
RNA_parameter_set_lookup(&list, "context", &C);
RNA_parameter_set_lookup(&list, "event", &event);
- op->type->ext.call(&opr, func, &list);
+ op->type->ext.call(C, &opr, func, &list);
RNA_parameter_get_lookup(&list, "result", &ret);
result= *(int*)ret;
@@ -783,7 +792,7 @@ static int operator_modal(bContext *C, wmOperator *op, wmEvent *event)
RNA_parameter_list_create(&list, &opr, func);
RNA_parameter_set_lookup(&list, "context", &C);
RNA_parameter_set_lookup(&list, "event", &event);
- op->type->ext.call(&opr, func, &list);
+ op->type->ext.call(C, &opr, func, &list);
RNA_parameter_get_lookup(&list, "result", &ret);
result= *(int*)ret;
@@ -804,7 +813,7 @@ static void operator_draw(bContext *C, wmOperator *op)
RNA_parameter_list_create(&list, &opr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- op->type->ext.call(&opr, func, &list);
+ op->type->ext.call(C, &opr, func, &list);
RNA_parameter_list_free(&list);
}
@@ -815,7 +824,7 @@ void macro_wrapper(wmOperatorType *ot, void *userdata);
static char _operator_idname[OP_MAX_TYPENAME];
static char _operator_name[OP_MAX_TYPENAME];
static char _operator_descr[1024];
-static StructRNA *rna_Operator_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_Operator_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
wmOperatorType dummyot = {0};
wmOperator dummyop= {0};
@@ -829,30 +838,63 @@ static StructRNA *rna_Operator_register(const bContext *C, ReportList *reports,
dummyot.description= _operator_descr; /* only assigne the pointer, string is NULL'd */
RNA_pointer_create(NULL, &RNA_Operator, &dummyop, &dummyotr);
+ /* clear incase they are left unset */
+ _operator_idname[0]= _operator_name[0]= _operator_descr[0]= '\0';
+
/* validate the python class */
if(validate(&dummyotr, data, have_function) != 0)
return NULL;
{ /* convert foo.bar to FOO_OT_bar
* allocate the description and the idname in 1 go */
- int idlen = strlen(_operator_idname) + 4;
- int namelen = strlen(_operator_name) + 1;
- int desclen = strlen(_operator_descr) + 1;
- char *ch, *ch_arr;
- ch_arr= ch= MEM_callocN(sizeof(char) * (idlen + namelen + desclen), "_operator_idname"); /* 2 terminators and 3 to convert a.b -> A_OT_b */
- WM_operator_bl_idname(ch, _operator_idname); /* convert the idname from python */
- dummyot.idname= ch;
- ch += idlen;
- strcpy(ch, _operator_name);
- dummyot.name = ch;
- ch += namelen;
- strcpy(ch, _operator_descr);
- dummyot.description = ch;
- }
- if(strlen(identifier) >= sizeof(dummyop.idname)) {
- BKE_reportf(reports, RPT_ERROR, "registering operator class: '%s' is too long, maximum length is %d.", identifier, sizeof(dummyop.idname));
- return NULL;
+ /* inconveniently long name sanity check */
+ {
+ char *ch= _operator_idname;
+ int i;
+ int dot= 0;
+ for(i=0; *ch; i++) {
+ if((*ch >= 'a' && *ch <= 'z') || (*ch >= '0' && *ch <= '9') || *ch == '_') {
+ /* pass */
+ }
+ else if(*ch == '.') {
+ dot++;
+ }
+ else {
+ BKE_reportf(reports, RPT_ERROR, "registering operator class: '%s', invalid bl_idname '%s', at position %d", identifier, _operator_idname, i);
+ return NULL;
+ }
+
+ ch++;
+ }
+
+ if(i > ((int)sizeof(dummyop.idname)) - 3) {
+ BKE_reportf(reports, RPT_ERROR, "registering operator class: '%s', invalid bl_idname '%s', is too long, maximum length is %d.", identifier, _operator_idname, (int)sizeof(dummyop.idname) - 3);
+ return NULL;
+ }
+
+ if(dot != 1) {
+ BKE_reportf(reports, RPT_ERROR, "registering operator class: '%s', invalid bl_idname '%s', must contain 1 '.' character", identifier, _operator_idname);
+ return NULL;
+ }
+ }
+ /* end sanity check */
+
+ {
+ int idlen = strlen(_operator_idname) + 4;
+ int namelen = strlen(_operator_name) + 1;
+ int desclen = strlen(_operator_descr) + 1;
+ char *ch, *ch_arr;
+ ch_arr= ch= MEM_callocN(sizeof(char) * (idlen + namelen + desclen), "_operator_idname"); /* 2 terminators and 3 to convert a.b -> A_OT_b */
+ WM_operator_bl_idname(ch, _operator_idname); /* convert the idname from python */
+ dummyot.idname= ch;
+ ch += idlen;
+ strcpy(ch, _operator_name);
+ dummyot.name = ch;
+ ch += namelen;
+ strcpy(ch, _operator_descr);
+ dummyot.description = ch;
+ }
}
/* check if we have registered this operator type before, and remove it */
@@ -885,7 +927,7 @@ static StructRNA *rna_Operator_register(const bContext *C, ReportList *reports,
}
-static StructRNA *rna_MacroOperator_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_MacroOperator_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
wmOperatorType dummyot = {0};
wmOperator dummyop= {0};
@@ -921,7 +963,7 @@ static StructRNA *rna_MacroOperator_register(const bContext *C, ReportList *repo
}
if(strlen(identifier) >= sizeof(dummyop.idname)) {
- BKE_reportf(reports, RPT_ERROR, "registering operator class: '%s' is too long, maximum length is %d.", identifier, sizeof(dummyop.idname));
+ BKE_reportf(reports, RPT_ERROR, "registering operator class: '%s' is too long, maximum length is %d.", identifier, (int)sizeof(dummyop.idname));
return NULL;
}
@@ -949,7 +991,7 @@ static StructRNA *rna_MacroOperator_register(const bContext *C, ReportList *repo
return dummyot.ext.srna;
}
-#endif /* DISABLE_PYTHON */
+#endif /* WITH_PYTHON */
static StructRNA* rna_Operator_refine(PointerRNA *opr)
{
@@ -963,7 +1005,7 @@ static StructRNA* rna_MacroOperator_refine(PointerRNA *opr)
return (op->type && op->type->ext.srna)? op->type->ext.srna: &RNA_Macro;
}
-static wmKeyMapItem *rna_KeyMap_item_new(wmKeyMap *km, ReportList *reports, char *idname, int type, int value, int any, int shift, int ctrl, int alt, int oskey, int keymodifier)
+static wmKeyMapItem *rna_KeyMap_item_new(wmKeyMap *km, ReportList *reports, const char *idname, int type, int value, int any, int shift, int ctrl, int alt, int oskey, int keymodifier)
{
// wmWindowManager *wm = CTX_wm_manager(C);
int modifier= 0;
@@ -984,7 +1026,7 @@ static wmKeyMapItem *rna_KeyMap_item_new(wmKeyMap *km, ReportList *reports, char
return WM_keymap_add_item(km, idname, type, value, modifier, keymodifier);
}
-static wmKeyMapItem *rna_KeyMap_item_new_modal(wmKeyMap *km, bContext *C, ReportList *reports, char* propvalue_str, int type, int value, int any, int shift, int ctrl, int alt, int oskey, int keymodifier)
+static wmKeyMapItem *rna_KeyMap_item_new_modal(wmKeyMap *km, bContext *C, ReportList *reports, const char *propvalue_str, int type, int value, int any, int shift, int ctrl, int alt, int oskey, int keymodifier)
{
wmWindowManager *wm = CTX_wm_manager(C);
int modifier= 0;
@@ -1023,7 +1065,7 @@ static wmKeyMapItem *rna_KeyMap_item_new_modal(wmKeyMap *km, bContext *C, Report
return WM_modalkeymap_add_item(km, type, value, modifier, keymodifier, propvalue);
}
-static wmKeyMap *rna_keymap_new(wmKeyConfig *keyconf, char *idname, int spaceid, int regionid, int modal)
+static wmKeyMap *rna_keymap_new(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid, int modal)
{
if (modal == 0) {
return WM_keymap_find(keyconf, idname, spaceid, regionid);
@@ -1032,12 +1074,12 @@ static wmKeyMap *rna_keymap_new(wmKeyConfig *keyconf, char *idname, int spaceid,
}
}
-static wmKeyMap *rna_keymap_find(wmKeyConfig *keyconf, char *idname, int spaceid, int regionid)
+static wmKeyMap *rna_keymap_find(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
{
return WM_keymap_list_find(&keyconf->keymaps, idname, spaceid, regionid);
}
-static wmKeyMap *rna_keymap_find_modal(wmKeyConfig *keyconf, char *idname)
+static wmKeyMap *rna_keymap_find_modal(wmKeyConfig *keyconf, const char *idname)
{
wmOperatorType *ot = WM_operatortype_find(idname, 0);
@@ -1047,6 +1089,31 @@ static wmKeyMap *rna_keymap_find_modal(wmKeyConfig *keyconf, char *idname)
return ot->modalkeymap;
}
+/* just to work around 'const char *' warning and to ensure this is a python op */
+static void rna_Operator_bl_idname_set(PointerRNA *ptr, const char *value)
+{
+ wmOperator *data= (wmOperator*)(ptr->data);
+ char *str= (char *)data->type->idname;
+ if(!str[0]) strcpy(str, value);
+ else assert(!"setting the bl_idname on a non-builtin operator");
+}
+
+static void rna_Operator_bl_label_set(PointerRNA *ptr, const char *value)
+{
+ wmOperator *data= (wmOperator*)(ptr->data);
+ char *str= (char *)data->type->name;
+ if(!str[0]) strcpy(str, value);
+ else assert(!"setting the bl_label on a non-builtin operator");
+}
+
+static void rna_Operator_bl_description_set(PointerRNA *ptr, const char *value)
+{
+ wmOperator *data= (wmOperator*)(ptr->data);
+ char *str= (char *)data->type->description;
+ if(!str[0]) strcpy(str, value);
+ else assert(!"setting the bl_description on a non-builtin operator");
+}
+
#else /* RNA_RUNTIME */
static void rna_def_operator(BlenderRNA *brna)
@@ -1058,7 +1125,7 @@ static void rna_def_operator(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Operator", "Storage of an operator being executed, or registered after execution");
RNA_def_struct_sdna(srna, "wmOperator");
RNA_def_struct_refine_func(srna, "rna_Operator_refine");
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
RNA_def_struct_register_funcs(srna, "rna_Operator_register", "rna_Operator_unregister");
#endif
@@ -1084,19 +1151,25 @@ static void rna_def_operator(BlenderRNA *brna)
/* Registration */
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
- RNA_def_property_string_maxlength(prop, OP_MAX_TYPENAME); /* else it uses the pointer size! */
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_string_maxlength(prop, OP_MAX_TYPENAME-3); /* else it uses the pointer size!. -3 because '.' -> '_OT_' */
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Operator_bl_idname_set");
+ // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
RNA_def_struct_name_property(srna, prop);
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->name");
RNA_def_property_string_maxlength(prop, 1024); /* else it uses the pointer size! */
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Operator_bl_label_set");
+ // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_flag(prop, PROP_REGISTER);
prop= RNA_def_property(srna, "bl_description", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->description");
RNA_def_property_string_maxlength(prop, 1024); /* else it uses the pointer size! */
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Operator_bl_description_set");
+ // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
prop= RNA_def_property(srna, "bl_options", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type->flag");
@@ -1121,7 +1194,7 @@ static void rna_def_macro_operator(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Macro Operator", "Storage of a macro operator being executed, or registered after execution");
RNA_def_struct_sdna(srna, "wmOperator");
RNA_def_struct_refine_func(srna, "rna_MacroOperator_refine");
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
RNA_def_struct_register_funcs(srna, "rna_MacroOperator_register", "rna_Operator_unregister");
#endif
@@ -1140,18 +1213,24 @@ static void rna_def_macro_operator(BlenderRNA *brna)
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
RNA_def_property_string_maxlength(prop, OP_MAX_TYPENAME); /* else it uses the pointer size! */
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Operator_bl_idname_set");
+ // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
RNA_def_struct_name_property(srna, prop);
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->name");
RNA_def_property_string_maxlength(prop, 1024); /* else it uses the pointer size! */
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Operator_bl_label_set");
+ // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_flag(prop, PROP_REGISTER);
prop= RNA_def_property(srna, "bl_description", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->description");
RNA_def_property_string_maxlength(prop, 1024); /* else it uses the pointer size! */
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Operator_bl_description_set");
+ // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
prop= RNA_def_property(srna, "bl_options", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type->flag");
@@ -1670,6 +1749,11 @@ static void rna_def_keyconfig(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Active", "Activate or deactivate item");
RNA_def_property_ui_icon(prop, ICON_CHECKBOX_DEHLT, 1);
+ prop= RNA_def_property(srna, "is_user_defined", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "User Defined", "Is this keymap item user defined (doesn't just override a builtin item)");
+ RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_userdefined_get", NULL);
+
RNA_api_keymapitem(srna);
}
diff --git a/source/blender/makesrna/intern/rna_wm_api.c b/source/blender/makesrna/intern/rna_wm_api.c
index 36dd6efc256..b934bdfc979 100644
--- a/source/blender/makesrna/intern/rna_wm_api.c
+++ b/source/blender/makesrna/intern/rna_wm_api.c
@@ -34,6 +34,7 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "DNA_windowmanager_types.h"
#ifdef RNA_RUNTIME
@@ -50,7 +51,7 @@ static void rna_keymap_restore_item_to_default(wmKeyMap *km, bContext *C, wmKeyM
WM_keymap_restore_item_to_default(C, km, kmi);
}
-static void rna_Operator_report(wmOperator *op, int type, char *msg)
+static void rna_Operator_report(wmOperator *op, int type, const char *msg)
{
BKE_report(op->reports, type, msg);
}
@@ -62,7 +63,7 @@ static void rna_Operator_enum_search_invoke(bContext *C, wmOperator *op)
}
-static int rna_event_add_modal_handler(struct bContext *C, struct wmOperator *operator)
+static int rna_event_modal_handler_add(struct bContext *C, struct wmOperator *operator)
{
return WM_event_add_modal_handler(C, operator) != NULL;
}
@@ -87,13 +88,12 @@ static void rna_generic_op_invoke(FunctionRNA *func, int flag)
}
if(flag & WM_GEN_INVOKE_SIZE) {
- parm= RNA_def_int(func, "width", 300, 0, INT_MAX, "", "Width of the popup.", 0, INT_MAX);
- parm= RNA_def_int(func, "height", 20, 0, INT_MAX, "", "Height of the popup.", 0, INT_MAX);
+ RNA_def_int(func, "width", 300, 0, INT_MAX, "", "Width of the popup.", 0, INT_MAX);
+ RNA_def_int(func, "height", 20, 0, INT_MAX, "", "Height of the popup.", 0, INT_MAX);
}
if(flag & WM_GEN_INVOKE_RETURN) {
- parm= RNA_def_enum(func, "result", operator_return_items, 0, "result", "");
- RNA_def_property_flag(parm, PROP_ENUM_FLAG);
+ parm= RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", "");
RNA_def_function_return(func, parm);
}
}
@@ -103,11 +103,11 @@ void RNA_api_wm(StructRNA *srna)
FunctionRNA *func;
PropertyRNA *parm;
- func= RNA_def_function(srna, "add_fileselect", "WM_event_add_fileselect");
+ func= RNA_def_function(srna, "fileselect_add", "WM_event_add_fileselect");
RNA_def_function_ui_description(func, "Show up the file selector.");
rna_generic_op_invoke(func, 0);
- func= RNA_def_function(srna, "add_modal_handler", "rna_event_add_modal_handler");
+ func= RNA_def_function(srna, "modal_handler_add", "rna_event_modal_handler_add");
RNA_def_function_flag(func, FUNC_NO_SELF|FUNC_USE_CONTEXT);
parm= RNA_def_pointer(func, "operator", "Operator", "", "Operator to call.");
RNA_def_property_flag(parm, PROP_REQUIRED);
@@ -131,6 +131,11 @@ void RNA_api_wm(StructRNA *srna)
func= RNA_def_function(srna, "invoke_popup", "WM_operator_ui_popup");
RNA_def_function_ui_description(func, "Operator popup invoke.");
rna_generic_op_invoke(func, WM_GEN_INVOKE_SIZE|WM_GEN_INVOKE_RETURN);
+
+ func= RNA_def_function(srna, "invoke_confirm", "WM_operator_confirm");
+ RNA_def_function_ui_description(func, "Operator confirmation.");
+ rna_generic_op_invoke(func, WM_GEN_INVOKE_EVENT|WM_GEN_INVOKE_RETURN);
+
}
void RNA_api_operator(StructRNA *srna)
@@ -140,8 +145,8 @@ void RNA_api_operator(StructRNA *srna)
/* utility, not for registering */
func= RNA_def_function(srna, "report", "rna_Operator_report");
- parm= RNA_def_enum(func, "type", wm_report_items, 0, "Type", "");
- RNA_def_property_flag(parm, PROP_REQUIRED|PROP_ENUM_FLAG);
+ parm= RNA_def_enum_flag(func, "type", wm_report_items, 0, "Type", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_string(func, "message", "", 0, "Report Message", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
@@ -161,8 +166,7 @@ void RNA_api_operator(StructRNA *srna)
RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
RNA_def_pointer(func, "context", "Context", "", "");
- parm= RNA_def_enum(func, "result", operator_return_items, 0, "result", ""); // better name?
- RNA_def_property_flag(parm, PROP_ENUM_FLAG);
+ parm= RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", ""); // better name?
RNA_def_function_return(func, parm);
/* check */
@@ -181,8 +185,7 @@ void RNA_api_operator(StructRNA *srna)
RNA_def_pointer(func, "context", "Context", "", "");
RNA_def_pointer(func, "event", "Event", "", "");
- parm= RNA_def_enum(func, "result", operator_return_items, 0, "result", ""); // better name?
- RNA_def_property_flag(parm, PROP_ENUM_FLAG);
+ parm= RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", ""); // better name?
RNA_def_function_return(func, parm);
func= RNA_def_function(srna, "modal", NULL); /* same as invoke */
@@ -191,8 +194,7 @@ void RNA_api_operator(StructRNA *srna)
RNA_def_pointer(func, "context", "Context", "", "");
RNA_def_pointer(func, "event", "Event", "", "");
- parm= RNA_def_enum(func, "result", operator_return_items, 0, "result", ""); // better name?
- RNA_def_property_flag(parm, PROP_ENUM_FLAG);
+ parm= RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", ""); // better name?
RNA_def_function_return(func, parm);
/* draw */
@@ -209,8 +211,8 @@ void RNA_api_macro(StructRNA *srna)
/* utility, not for registering */
func= RNA_def_function(srna, "report", "rna_Operator_report");
- parm= RNA_def_enum(func, "type", wm_report_items, 0, "Type", "");
- RNA_def_property_flag(parm, PROP_REQUIRED|PROP_ENUM_FLAG);
+ parm= RNA_def_enum_flag(func, "type", wm_report_items, 0, "Type", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_string(func, "message", "", 0, "Report Message", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
@@ -251,7 +253,7 @@ void RNA_api_keymap(StructRNA *srna)
parm= RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "User editable key map.");
RNA_def_function_return(func, parm);
- func= RNA_def_function(srna, "restore_to_default", "WM_keymap_restore_to_default");
+ RNA_def_function(srna, "restore_to_default", "WM_keymap_restore_to_default");
func= RNA_def_function(srna, "restore_item_to_default", "rna_keymap_restore_item_to_default");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
diff --git a/source/blender/makesrna/intern/rna_world.c b/source/blender/makesrna/intern/rna_world.c
index ecf253acbce..1358964a92b 100644
--- a/source/blender/makesrna/intern/rna_world.c
+++ b/source/blender/makesrna/intern/rna_world.c
@@ -86,7 +86,7 @@ static void rna_World_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
World *wo= ptr->id.data;
- DAG_id_flush_update(&wo->id, 0);
+ DAG_id_tag_update(&wo->id, 0);
WM_main_add_notifier(NC_WORLD, wo);
}
@@ -94,10 +94,29 @@ static void rna_World_draw_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
World *wo= ptr->id.data;
- DAG_id_flush_update(&wo->id, 0);
+ DAG_id_tag_update(&wo->id, 0);
WM_main_add_notifier(NC_WORLD|ND_WORLD_DRAW, wo);
}
+/* so camera mist limits redraw */
+static void rna_World_draw_mist_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ World *wo= ptr->id.data;
+
+ DAG_id_tag_update(&wo->id, 0);
+ WM_main_add_notifier(NC_WORLD|ND_WORLD_DRAW, wo);
+ WM_main_add_notifier(NC_OBJECT|ND_DRAW, NULL);
+}
+
+static void rna_World_stars_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ World *wo= ptr->id.data;
+
+ DAG_id_tag_update(&wo->id, 0);
+ WM_main_add_notifier(NC_WORLD|ND_WORLD_STARS, wo);
+}
+
+
#else
static void rna_def_world_mtex(BlenderRNA *brna)
@@ -266,7 +285,7 @@ static void rna_def_lighting(BlenderRNA *brna)
prop= RNA_def_property(srna, "indirect_bounces", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "ao_indirect_bounces");
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_text(prop, "Bounces", "Number of indirect diffuse light bounces to use for approximate ambient occlusion");
RNA_def_property_update(prop, 0, "rna_World_update");
@@ -290,7 +309,7 @@ static void rna_def_lighting(BlenderRNA *brna)
prop= RNA_def_property(srna, "falloff_strength", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "aodistfac");
- RNA_def_property_ui_text(prop, "Strength", "Distance attenuation factor, the higher, the 'shorter' the shadows");
+ RNA_def_property_ui_text(prop, "Strength", "Distance attenuation factor, the higher, the less influence farther away objects have influence");
RNA_def_property_update(prop, 0, "rna_World_update");
prop= RNA_def_property(srna, "bias", PROP_FLOAT, PROP_NONE);
@@ -379,14 +398,14 @@ static void rna_def_world_mist(BlenderRNA *brna)
RNA_def_property_range(prop, 0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 10000, 10, 2);
RNA_def_property_ui_text(prop, "Start", "Starting distance of the mist, measured from the camera");
- RNA_def_property_update(prop, 0, "rna_World_draw_update");
+ RNA_def_property_update(prop, 0, "rna_World_draw_mist_update");
prop= RNA_def_property(srna, "depth", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "mistdist");
RNA_def_property_range(prop, 0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 10000, 10, 2);
RNA_def_property_ui_text(prop, "Depth", "The distance over which the mist effect fades in");
- RNA_def_property_update(prop, 0, "rna_World_draw_update");
+ RNA_def_property_update(prop, 0, "rna_World_draw_mist_update");
prop= RNA_def_property(srna, "height", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "misthi");
@@ -414,31 +433,31 @@ static void rna_def_world_stars(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_stars", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_STARS);
RNA_def_property_ui_text(prop, "Use Stars", "Enable starfield generation");
- RNA_def_property_update(prop, 0, "rna_World_draw_update");
+ RNA_def_property_update(prop, 0, "rna_World_stars_update");
prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "starsize");
RNA_def_property_range(prop, 0, 10);
RNA_def_property_ui_text(prop, "Size", "Average screen dimension of stars");
- RNA_def_property_update(prop, 0, "rna_World_update");
+ RNA_def_property_update(prop, 0, "rna_World_draw_update"); /* use normal update since this isnt visualized */
prop= RNA_def_property(srna, "distance_min", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "starmindist");
RNA_def_property_range(prop, 0, 1000);
RNA_def_property_ui_text(prop, "Minimum Distance", "Minimum distance to the camera for stars");
- RNA_def_property_update(prop, 0, "rna_World_update");
+ RNA_def_property_update(prop, 0, "rna_World_stars_update");
prop= RNA_def_property(srna, "average_separation", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "stardist");
RNA_def_property_range(prop, 2, 1000);
RNA_def_property_ui_text(prop, "Average Separation", "Average distance between any two stars");
- RNA_def_property_update(prop, 0, "rna_World_draw_update");
+ RNA_def_property_update(prop, 0, "rna_World_stars_update");
prop= RNA_def_property(srna, "color_random", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "starcolnoise");
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_text(prop, "Color Randomization", "Randomize star colors");
- RNA_def_property_update(prop, 0, "rna_World_update");
+ RNA_def_property_update(prop, 0, "rna_World_stars_update");
/* unused
prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
@@ -478,9 +497,8 @@ void RNA_def_world(BlenderRNA *brna)
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Horizon Color", "Color at the horizon");
/* RNA_def_property_update(prop, 0, "rna_World_update"); */
- /* render-only uses this, the notifier could be made to be more spesific */
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, "rna_World_update");
-
+ /* render-only uses this */
+ RNA_def_property_update(prop, NC_WORLD|ND_WORLD_DRAW, "rna_World_update");
prop= RNA_def_property(srna, "zenith_color", PROP_FLOAT, PROP_COLOR);
diff --git a/source/blender/makesrna/rna_cleanup/rna_properties.txt b/source/blender/makesrna/rna_cleanup/rna_properties.txt
index 92adbf4373e..030fecec20e 100644
--- a/source/blender/makesrna/rna_cleanup/rna_properties.txt
+++ b/source/blender/makesrna/rna_cleanup/rna_properties.txt
@@ -1,4605 +1 @@
- NOTE * CLASS.FROM -> TO: TYPE "DESCRIPTION"
-#+ * ActionGroup.channels -> channels: collection, "(read-only) F-Curves in this group"
-#+ * ActionGroup.custom_color -> custom_color: int "Index of custom color set"
-#+ * ActionGroup.lock -> lock: boolean "Action Group is locked"
-#+ * ActionGroup.name -> name: string "NO DESCRIPTION"
-#+ * ActionGroup.select -> select: boolean "Action Group is selected"
-#ActionGroup.show_expanded -> show_expanded: boolean "Action Group is expanded"
-#+ * Actuator.name -> name: string "NO DESCRIPTION"
-#Actuator.pin -> pin: boolean "Display when not linked to a visible states controller"
-#Actuator.show_expanded -> show_expanded: boolean "Set actuator expanded in the user interface"
-#+ * Actuator.type -> type: enum "NO DESCRIPTION"
-#+ * Actuator|ActionActuator.action -> action: pointer "NO DESCRIPTION"
-#Actuator|ActionActuator.frame_blend_in -> frame_blend_in: int "Number of frames of motion blending"
-#+ * Actuator|ActionActuator.frame_end -> frame_end: int "NO DESCRIPTION"
-#+ * Actuator|ActionActuator.frame_property -> frame_property: string "Assign the actions current frame number to this property"
-#+ * Actuator|ActionActuator.frame_start -> frame_start: int "NO DESCRIPTION"
-#Actuator|ActionActuator.play_mode -> play_mode: enum "Action playback type"
-#+ * Actuator|ActionActuator.priority -> priority: int "Execution priority - lower numbers will override actions with higher numbers. With 2 or more actions at once, the overriding channels must be lower in the stack"
-#+ * Actuator|ActionActuator.property -> property: string "Use this property to define the Action position"
-#Actuator|ActionActuator.use_continue_last_frame -> use_continue_last_frame: boolean "Restore last frame when switching on/off, otherwise play from the start each time"
-#+ * Actuator|ArmatureActuator.bone -> bone: string "Bone on which the constraint is defined"
-#+ * Actuator|ArmatureActuator.constraint -> constraint: string "Name of the constraint you want to control"
-#+ * Actuator|ArmatureActuator.mode -> mode: enum "NO DESCRIPTION"
-#+ * Actuator|ArmatureActuator.secondary_target -> secondary_target: pointer "Set weight of this constraint"
-#+ * Actuator|ArmatureActuator.target -> target: pointer "Set this object as the target of the constraint"
-#+ * Actuator|ArmatureActuator.weight -> weight: float "Set weight of this constraint"
-#+ * Actuator|CameraActuator.axis -> axis: enum "Specify the axis the Camera will try to get behind"
-#+ * Actuator|CameraActuator.height -> height: float "NO DESCRIPTION"
-#+ * Actuator|CameraActuator.max -> max: float "NO DESCRIPTION"
-#+ * Actuator|CameraActuator.min -> min: float "NO DESCRIPTION"
-#+ * Actuator|CameraActuator.object -> object: pointer "Look at this Object"
-#Actuator|ConstraintActuator.angle_max -> angle_max: float "Maximum angle (in degree) allowed with target direction. No correction is done if angle with target direction is between min and max"
-#Actuator|ConstraintActuator.angle_min -> angle_min: float "Minimum angle (in degree) to maintain with target direction. No correction is done if angle with target direction is between min and max"
-#+ * Actuator|ConstraintActuator.damping -> damping: int "Damping factor: time constant (in frame) of low pass filter"
-#+ * Actuator|ConstraintActuator.damping_rotation -> damping_rotation: int "Use a different damping for orientation"
-#+ * Actuator|ConstraintActuator.direction -> direction: enum "Set the direction of the ray"
-#+ * Actuator|ConstraintActuator.direction_axis -> direction_axis: enum "Select the axis to be aligned along the reference direction"
-#+ * Actuator|ConstraintActuator.distance -> distance: float "Set the maximum length of ray"
-#+ * Actuator|ConstraintActuator.fh_damping -> fh_damping: float "Damping factor of the Fh spring force"
-#+ * Actuator|ConstraintActuator.fh_height -> fh_height: float "Height of the Fh area"
-#+ * Actuator|ConstraintActuator.limit -> limit: enum "NO DESCRIPTION"
-#+ * Actuator|ConstraintActuator.limit_max -> limit_max: float "NO DESCRIPTION"
-#+ * Actuator|ConstraintActuator.limit_min -> limit_min: float "NO DESCRIPTION"
-#+ * Actuator|ConstraintActuator.material -> material: string "Ray detects only Objects with this material"
-#+ * Actuator|ConstraintActuator.mode -> mode: enum "The type of the constraint"
-#+ * Actuator|ConstraintActuator.property -> property: string "Ray detect only Objects with this property"
-#+ * Actuator|ConstraintActuator.range -> range: float "Set the maximum length of ray"
-#Actuator|ConstraintActuator.rotation_max -> rotation_max: float[3] "Reference Direction"
-#+ * Actuator|ConstraintActuator.spring -> spring: float "Spring force within the Fh area"
-#+ * Actuator|ConstraintActuator.time -> time: int "Maximum activation time in frame, 0 for unlimited"
-#Actuator|ConstraintActuator.use_fh_normal -> use_fh_normal: boolean "Add a horizontal spring force on slopes"
-#Actuator|ConstraintActuator.use_fh_paralel_axis -> use_fh_paralel_axis: boolean "Keep object axis parallel to normal"
-#Actuator|ConstraintActuator.use_force_distance -> use_force_distance: boolean "Force distance of object to point of impact of ray"
-#Actuator|ConstraintActuator.use_local -> use_local: boolean "Set ray along objects axis or global axis"
-#Actuator|ConstraintActuator.use_material_detect -> use_material_detect: boolean "Detect material instead of property"
-#Actuator|ConstraintActuator.use_normal -> use_normal: boolean "Set object axis along (local axis) or parallel (global axis) to the normal at hit position"
-#Actuator|ConstraintActuator.use_persistent -> use_persistent: boolean "Persistent actuator: stays active even if ray does not reach target"
-#+ * Actuator|EditObjectActuator.angular_velocity -> angular_velocity: float[3] "Angular velocity upon creation"
-#+ * Actuator|EditObjectActuator.dynamic_operation -> dynamic_operation: enum "NO DESCRIPTION"
-#+ * Actuator|EditObjectActuator.linear_velocity -> linear_velocity: float[3] "Velocity upon creation"
-#+ * Actuator|EditObjectActuator.mass -> mass: float "The mass of the object"
-#+ * Actuator|EditObjectActuator.mesh -> mesh: pointer "Replace the existing, when left blank Phys will remake the existing physics mesh"
-#+ * Actuator|EditObjectActuator.mode -> mode: enum "The mode of the actuator"
-#+ * Actuator|EditObjectActuator.object -> object: pointer "Add this Object and all its children (cant be on an visible layer)"
-#+ * Actuator|EditObjectActuator.time -> time: int "Duration the new Object lives or the track takes"
-#+ * Actuator|EditObjectActuator.track_object -> track_object: pointer "Track to this Object"
-#Actuator|EditObjectActuator.use_3d_tracking -> use_3d_tracking: boolean "Enable 3D tracking"
-#Actuator|EditObjectActuator.use_local_angular_velocity -> use_local_angular_velocity: boolean "Apply the rotation locally"
-#Actuator|EditObjectActuator.use_local_linear_velocity -> use_local_linear_velocity: boolean "Apply the transformation locally"
-#Actuator|EditObjectActuator.use_replace_display_mesh -> use_replace_display_mesh: boolean "Replace the display mesh"
-#Actuator|EditObjectActuator.use_replace_physics_mesh -> use_replace_physics_mesh: boolean "Replace the physics mesh (triangle bounds only - compound shapes not supported)"
-#Actuator|FCurveActuator.apply_to_children -> apply_to_children: boolean "Update F-Curve on all children Objects as well"
-#Actuator|FCurveActuator.frame_end -> frame_end: int "NO DESCRIPTION"
-#Actuator|FCurveActuator.frame_property -> frame_property: string "Assign the actions current frame number to this property"
-#Actuator|FCurveActuator.frame_start -> frame_start: int "NO DESCRIPTION"
-#Actuator|FCurveActuator.play_type -> play_type: enum "Specify the way you want to play the animation"
-#Actuator|FCurveActuator.property -> property: string "Use this property to define the F-Curve position"
-#Actuator|FCurveActuator.use_additive -> use_additive: boolean "F-Curve is added to the current loc/rot/scale in global or local coordinate according to Local flag"
-#Actuator|FCurveActuator.use_force -> use_force: boolean "Apply F-Curve as a global or local force depending on the local option (dynamic objects only)"
-#Actuator|FCurveActuator.use_local -> use_local: boolean "Let the F-Curve act in local coordinates, used in Force and Add mode"
-#+ * Actuator|Filter2DActuator.filter_pass -> filter_pass: int "Set filter order"
-#+ * Actuator|Filter2DActuator.glsl_shader -> glsl_shader: pointer "NO DESCRIPTION"
-#+ * Actuator|Filter2DActuator.mode -> mode: enum "NO DESCRIPTION"
-#+ * Actuator|Filter2DActuator.motion_blur_factor -> motion_blur_factor: float "Set motion blur factor"
-#Actuator|Filter2DActuator.use_motion_blur -> use_motion_blur: boolean "Enable/Disable Motion Blur"
-#+ * Actuator|GameActuator.filename -> filename: string "Load this blend file, use the // prefix for a path relative to the current blend file"
-#+ * Actuator|GameActuator.mode -> mode: enum "NO DESCRIPTION"
-#+ * Actuator|MessageActuator.body_message -> body_message: string "Optional message body Text"
-#+ * Actuator|MessageActuator.body_property -> body_property: string "The message body will be set by the Property Value"
-#+ * Actuator|MessageActuator.body_type -> body_type: enum "Toggle message type: either Text or a PropertyName"
-#+ * Actuator|MessageActuator.subject -> subject: string "Optional message subject. This is what can be filtered on"
-#+ * Actuator|MessageActuator.to_property -> to_property: string "Optional send message to objects with this name only, or empty to broadcast"
-#+ * Actuator|ObjectActuator.angular_velocity -> angular_velocity: float[3] "Sets the angular velocity"
-#+ * Actuator|ObjectActuator.damping -> damping: int "Number of frames to reach the target velocity"
-#+ * Actuator|ObjectActuator.derivate_coefficient -> derivate_coefficient: float "Not required, high values can cause instability"
-#+ * Actuator|ObjectActuator.force -> force: float[3] "Sets the force"
-#+ * Actuator|ObjectActuator.force_max_x -> force_max_x: float "Set the upper limit for force"
-#+ * Actuator|ObjectActuator.force_max_y -> force_max_y: float "Set the upper limit for force"
-#+ * Actuator|ObjectActuator.force_max_z -> force_max_z: float "Set the upper limit for force"
-#+ * Actuator|ObjectActuator.force_min_x -> force_min_x: float "Set the lower limit for force"
-#+ * Actuator|ObjectActuator.force_min_y -> force_min_y: float "Set the lower limit for force"
-#+ * Actuator|ObjectActuator.force_min_z -> force_min_z: float "Set the lower limit for force"
-#+ * Actuator|ObjectActuator.integral_coefficient -> integral_coefficient: float "Low value (0.01) for slow response, high value (0.5) for fast response"
-#+ * Actuator|ObjectActuator.linear_velocity -> linear_velocity: float[3] "Sets the linear velocity (in Servo mode it sets the target relative linear velocity, it will be achieved by automatic application of force. Null velocity is a valid target)"
-#+ * Actuator|ObjectActuator.mode -> mode: enum "Specify the motion system"
-#Actuator|ObjectActuator.offset_location -> offset_location: float[3] "Sets the location"
-#Actuator|ObjectActuator.offset_rotation -> offset_rotation: float[3] "Sets the rotation"
-#+ * Actuator|ObjectActuator.proportional_coefficient -> proportional_coefficient: float "Typical value is 60x integral coefficient"
-#+ * Actuator|ObjectActuator.reference_object -> reference_object: pointer "Reference object for velocity calculation, leave empty for world reference"
-#+ * Actuator|ObjectActuator.torque -> torque: float[3] "Sets the torque"
-#Actuator|ObjectActuator.use_add_linear_velocity -> use_add_linear_velocity: boolean "Toggles between ADD and SET linV"
-#Actuator|ObjectActuator.use_local_angular_velocity -> use_local_angular_velocity: boolean "Angular velocity is defined in local coordinates"
-#Actuator|ObjectActuator.use_local_force -> use_local_force: boolean "Force is defined in local coordinates"
-#Actuator|ObjectActuator.use_local_linear_velocity -> use_local_linear_velocity: boolean "Velocity is defined in local coordinates"
-#Actuator|ObjectActuator.use_local_location -> use_local_location: boolean "Location is defined in local coordinates"
-#Actuator|ObjectActuator.use_local_rotation -> use_local_rotation: boolean "Rotation is defined in local coordinates"
-#Actuator|ObjectActuator.use_local_torque -> use_local_torque: boolean "Torque is defined in local coordinates"
-#Actuator|ObjectActuator.use_servo_limit_x -> use_servo_limit_x: boolean "Set limit to force along the X axis"
-#Actuator|ObjectActuator.use_servo_limit_y -> use_servo_limit_y: boolean "Set limit to force along the Y axis"
-#Actuator|ObjectActuator.use_servo_limit_z -> use_servo_limit_z: boolean "Set limit to force along the Z axis"
-#+ * Actuator|ParentActuator.mode -> mode: enum "NO DESCRIPTION"
-#+ * Actuator|ParentActuator.object -> object: pointer "Set this object as parent"
-#Actuator|ParentActuator.use_compound -> use_compound: boolean "Add this object shape to the parent shape (only if the parent shape is already compound)"
-#Actuator|ParentActuator.use_ghost -> use_ghost: boolean "Make this object ghost while parented (only if not compound)"
-#+ * Actuator|PropertyActuator.mode -> mode: enum "NO DESCRIPTION"
-#+ * Actuator|PropertyActuator.object -> object: pointer "Copy from this Object"
-#+ * Actuator|PropertyActuator.object_property -> object_property: string "Copy this property"
-#+ * Actuator|PropertyActuator.property -> property: string "The name of the property"
-#+ * Actuator|PropertyActuator.value -> value: string "The value to use, use around strings"
-#+ * Actuator|RandomActuator.chance -> chance: float "Pick a number between 0 and 1. Success if you stay below this value"
-#+ * Actuator|RandomActuator.distribution -> distribution: enum "Choose the type of distribution"
-#+ * Actuator|RandomActuator.float_max -> float_max: float "Choose a number from a range. Upper boundary of the range"
-#+ * Actuator|RandomActuator.float_mean -> float_mean: float "A normal distribution. Mean of the distribution"
-#+ * Actuator|RandomActuator.float_min -> float_min: float "Choose a number from a range. Lower boundary of the range"
-#+ * Actuator|RandomActuator.float_value -> float_value: float "Always return this number"
-#+ * Actuator|RandomActuator.half_life_time -> half_life_time: float "Negative exponential dropoff"
-#+ * Actuator|RandomActuator.int_max -> int_max: int "Choose a number from a range. Upper boundary of the range"
-#+ * Actuator|RandomActuator.int_mean -> int_mean: float "Expected mean value of the distribution"
-#+ * Actuator|RandomActuator.int_min -> int_min: int "Choose a number from a range. Lower boundary of the range"
-#+ * Actuator|RandomActuator.int_value -> int_value: int "Always return this number"
-#+ * Actuator|RandomActuator.property -> property: string "Assign the random value to this property"
-#+ * Actuator|RandomActuator.seed -> seed: int "Initial seed of the random generator. Use Python for more freedom (choose 0 for not random)"
-#+ * Actuator|RandomActuator.standard_derivation -> standard_derivation: float "A normal distribution. Standard deviation of the distribution"
-#Actuator|RandomActuator.use_always_true -> use_always_true: boolean "Always false or always true"
-#+ * Actuator|SceneActuator.camera -> camera: pointer "Set this Camera. Leave empty to refer to self object"
-#+ * Actuator|SceneActuator.mode -> mode: enum "NO DESCRIPTION"
-#+ * Actuator|SceneActuator.scene -> scene: pointer "Set the Scene to be added/removed/paused/resumed"
-#+ * Actuator|ShapeActionActuator.action -> action: pointer "NO DESCRIPTION"
-#Actuator|ShapeActionActuator.frame_blend_in -> frame_blend_in: int "Number of frames of motion blending"
-#+ * Actuator|ShapeActionActuator.frame_end -> frame_end: int "NO DESCRIPTION"
-#+ * Actuator|ShapeActionActuator.frame_property -> frame_property: string "Assign the actions current frame number to this property"
-#+ * Actuator|ShapeActionActuator.frame_start -> frame_start: int "NO DESCRIPTION"
-#+ * Actuator|ShapeActionActuator.mode -> mode: enum "Action playback type"
-#+ * Actuator|ShapeActionActuator.priority -> priority: int "Execution priority - lower numbers will override actions with higher numbers. With 2 or more actions at once, the overriding channels must be lower in the stack"
-#+ * Actuator|ShapeActionActuator.property -> property: string "Use this property to define the Action position"
-#Actuator|ShapeActionActuator.use_continue_last_frame -> use_continue_last_frame: boolean "Restore last frame when switching on/off, otherwise play from the start each time"
-#+ * Actuator|SoundActuator.cone_inner_angle_3d -> cone_inner_angle_3d: float "The angle of the inner cone"
-#+ * Actuator|SoundActuator.cone_outer_angle_3d -> cone_outer_angle_3d: float "The angle of the outer cone"
-#+ * Actuator|SoundActuator.cone_outer_gain_3d -> cone_outer_gain_3d: float "The gain outside the outer cone. The gain in the outer cone will be interpolated between this value and the normal gain in the inner cone"
-#Actuator|SoundActuator.distance_3d_max -> distance_3d_max: float "The maximum distance at which you can hear the sound"
-#Actuator|SoundActuator.distance_3d_reference -> distance_3d_reference: float "The distance where the sound has a gain of 1.0"
-#Actuator|SoundActuator.gain_3d_max -> gain_3d_max: float "The maximum gain of the sound, no matter how near it is"
-#Actuator|SoundActuator.gain_3d_min -> gain_3d_min: float "The minimum gain of the sound, no matter how far it is away"
-#+ * Actuator|SoundActuator.mode -> mode: enum "NO DESCRIPTION"
-#+ * Actuator|SoundActuator.pitch -> pitch: float "Sets the pitch of the sound"
-#+ * Actuator|SoundActuator.rolloff_factor_3d -> rolloff_factor_3d: float "The influence factor on volume depending on distance"
-#+ * Actuator|SoundActuator.sound -> sound: pointer "NO DESCRIPTION"
-#Actuator|SoundActuator.use_sound_3d -> use_sound_3d: boolean "Enable/Disable 3D Sound"
-#+ * Actuator|SoundActuator.volume -> volume: float "Sets the initial volume of the sound"
-#+ * Actuator|StateActuator.operation -> operation: enum "Select the bit operation on object state mask"
-#Actuator|StateActuator.states -> states: boolean[30] "NO DESCRIPTION"
-#Actuator|VisibilityActuator.apply_to_children -> apply_to_children: boolean "Set all the children of this object to the same visibility/occlusion recursively"
-#Actuator|VisibilityActuator.use_occlusion -> use_occlusion: boolean "Set the object to occlude objects behind it. Initialized from the object type in physics button"
-#Actuator|VisibilityActuator.use_visible -> use_visible: boolean "Set the objects visible. Initialized from the objects render restriction toggle (access in the outliner)"
-#+ * Addon.module -> module: string "Module name"
-#+ * AnimData.action -> action: pointer "Active Action for this datablock"
-#AnimData.action_blend_type -> action_blend_type: enum "Method used for combining Active Actions result with result of NLA stack"
-#+ * AnimData.action_extrapolation -> action_extrapolation: enum "Action to take for gaps past the Active Actions range (when evaluating with NLA)"
-#+ * AnimData.action_influence -> action_influence: float "Amount the Active Action contributes to the result of the NLA stack"
-#+ * AnimData.drivers -> drivers: collection, "(read-only) The Drivers/Expressions for this datablock"
-#+ * AnimData.nla_tracks -> nla_tracks: collection, "(read-only) NLA Tracks (i.e. Animation Layers)"
-#AnimData.use_nla -> use_nla: boolean "NLA stack is evaluated when evaluating this block"
-#AnimViz.motion_path -> motion_path: pointer, "(read-only) Motion Path settings for visualisation"
-#AnimViz.onion_skin_frames -> onion_skin_frames: pointer, "(read-only) Onion Skinning (ghosting) settings for visualisation"
-#+ * AnimVizMotionPaths.bake_location -> bake_location: enum "When calculating Bone Paths, use Head or Tips"
-#AnimVizMotionPaths.frame_after -> frame_after: int "Number of frames to show after the current frame (only for Around Current Frame Onion-skinning method)"
-#AnimVizMotionPaths.frame_before -> frame_before: int "Number of frames to show before the current frame (only for Around Current Frame Onion-skinning method)"
-#+ * AnimVizMotionPaths.frame_end -> frame_end: int "End frame of range of paths to display/calculate (not for Around Current Frame Onion-skinning method)"
-#+ * AnimVizMotionPaths.frame_start -> frame_start: int "Starting frame of range of paths to display/calculate (not for Around Current Frame Onion-skinning method)"
-#+ * AnimVizMotionPaths.frame_step -> frame_step: int "Number of frames between paths shown (not for On Keyframes Onion-skinning method)"
-#+ * AnimVizMotionPaths.show_frame_numbers -> show_frame_numbers: boolean "Show frame numbers on Motion Paths"
-#AnimVizMotionPaths.show_keyframe_action_all -> show_keyframe_action_all: boolean "For bone motion paths, search whole Action for keyframes instead of in group with matching name only (is slower)"
-#AnimVizMotionPaths.show_keyframe_highlight -> show_keyframe_highlight: boolean "Emphasize position of keyframes on Motion Paths"
-#+ * AnimVizMotionPaths.show_keyframe_numbers -> show_keyframe_numbers: boolean "Show frame numbers of Keyframes on Motion Paths"
-#+ * AnimVizMotionPaths.type -> type: enum "Type of range to show for Motion Paths"
-#AnimVizOnionSkinning.frame_after -> frame_after: int "Number of frames to show after the current frame (only for Around Current Frame Onion-skinning method)"
-#AnimVizOnionSkinning.frame_before -> frame_before: int "Number of frames to show before the current frame (only for Around Current Frame Onion-skinning method)"
-#+ * AnimVizOnionSkinning.frame_end -> frame_end: int "End frame of range of Ghosts to display (not for Around Current Frame Onion-skinning method)"
-#+ * AnimVizOnionSkinning.frame_start -> frame_start: int "Starting frame of range of Ghosts to display (not for Around Current Frame Onion-skinning method)"
-#+ * AnimVizOnionSkinning.frame_step -> frame_step: int "Number of frames between ghosts shown (not for On Keyframes Onion-skinning method)"
-#AnimVizOnionSkinning.show_only_selected -> show_only_selected: boolean "For Pose-Mode drawing, only draw ghosts for selected bones"
-#+ * AnimVizOnionSkinning.type -> type: enum "Method used for determining what ghosts get drawn"
-#MAKE PROPERTY OF A COLLECTION * Area.active_space -> active_space: pointer, "(read-only) Space currently being displayed in this area"
-#+ * Area.regions -> regions: collection, "(read-only) Regions this area is subdivided in"
-#+ * Area.show_menus -> show_menus: boolean "Show menus in the header"
-#+ * Area.spaces -> spaces: collection, "(read-only) Spaces contained in this area, the first space is active"
-#+ * Area.type -> type: enum "Space type"
-#+ * ArmatureBones.active -> active: pointer "Armatures active bone"
-#+ * ArmatureEditBones.active -> active: pointer "Armatures active edit bone"
-#+ * BackgroundImage.image -> image: pointer "Image displayed and edited in this space"
-#+ * BackgroundImage.image_user -> image_user: pointer, "(read-only) Parameters defining which layer, pass and frame of the image is displayed"
-#+ * BackgroundImage.offset_x -> offset_x: float "Offsets image horizontally from the world origin"
-#+ * BackgroundImage.offset_y -> offset_y: float "Offsets image vertically from the world origin"
-#+ * BackgroundImage.show_expanded -> show_expanded: boolean "Show the expanded in the user interface"
-#+ * BackgroundImage.size -> size: float "Scaling factor for the background image"
-#+ * BackgroundImage.transparency -> transparency: float "Amount to blend the image against the background color"
-#+ * BackgroundImage.view_axis -> view_axis: enum "The axis to display the image on"
-#+ * BezierSplinePoint.co -> co: float[3] "Coordinates of the control point"
-#BezierSplinePoint.handle_left -> handle_left: float[3] "Coordinates of the first handle"
-#BezierSplinePoint.handle_left_type -> handle_left_type: enum "Handle types"
-#BezierSplinePoint.handle_right -> handle_right: float[3] "Coordinates of the second handle"
-#BezierSplinePoint.handle_right_type -> handle_right_type: enum "Handle types"
-#+ * BezierSplinePoint.hide -> hide: boolean "Visibility status"
-#+ * BezierSplinePoint.radius -> radius: float, "(read-only) Radius for bevelling"
-#+ * BezierSplinePoint.select_control_point -> select_control_point: boolean "Control point selection status"
-#+ * BezierSplinePoint.select_left_handle -> select_left_handle: boolean "Handle 1 selection status"
-#+ * BezierSplinePoint.select_right_handle -> select_right_handle: boolean "Handle 2 selection status"
-#+ * BezierSplinePoint.tilt -> tilt: float "Tilt in 3D View"
-#+ * BezierSplinePoint.weight -> weight: float "Softbody goal weight"
-#+ * BlenderRNA.structs -> structs: collection, "(read-only)"
-#+ * BoidRule.name -> name: string "Boid rule name"
-#+ * BoidRule.type -> type: enum, "(read-only)"
-#BoidRule.use_in_air -> use_in_air: boolean "Use rule when boid is flying"
-#BoidRule.use_on_land -> use_on_land: boolean "Use rule when boid is on land"
-#+ * BoidRule|BoidRuleAverageSpeed.level -> level: float "How much velocitys z-component is kept constant"
-#+ * BoidRule|BoidRuleAverageSpeed.speed -> speed: float "Percentage of maximum speed"
-#+ * BoidRule|BoidRuleAverageSpeed.wander -> wander: float "How fast velocitys direction is randomized"
-#+ * BoidRule|BoidRuleAvoid.fear_factor -> fear_factor: float "Avoid object if danger from it is above this threshold"
-#+ * BoidRule|BoidRuleAvoid.object -> object: pointer "Object to avoid"
-#BoidRule|BoidRuleAvoid.use_predict -> use_predict: boolean "Predict target movement"
-#+ * BoidRule|BoidRuleAvoidCollision.look_ahead -> look_ahead: float "Time to look ahead in seconds"
-#BoidRule|BoidRuleAvoidCollision.use_avoid -> use_avoid: boolean "Avoid collision with other boids"
-#BoidRule|BoidRuleAvoidCollision.use_avoid_collision -> use_avoid_collision: boolean "Avoid collision with deflector objects"
-#+ * BoidRule|BoidRuleFight.distance -> distance: float "Attack boids at max this distance"
-#+ * BoidRule|BoidRuleFight.flee_distance -> flee_distance: float "Flee to this distance"
-#+ * BoidRule|BoidRuleFollowLeader.distance -> distance: float "Distance behind leader to follow"
-#+ * BoidRule|BoidRuleFollowLeader.object -> object: pointer "Follow this object instead of a boid"
-#BoidRule|BoidRuleFollowLeader.queue_count -> queue_count: int "How many boids in a line"
-#BoidRule|BoidRuleFollowLeader.use_line -> use_line: boolean "Follow leader in a line"
-#+ * BoidRule|BoidRuleGoal.object -> object: pointer "Goal object"
-#BoidRule|BoidRuleGoal.use_predict -> use_predict: boolean "Predict target movement"
-#+ * BoidSettings.accuracy -> accuracy: float "Accuracy of attack"
-#+ * BoidSettings.active_boid_state -> active_boid_state: pointer, "(read-only)"
-#+ * BoidSettings.active_boid_state_index -> active_boid_state_index: int "NO DESCRIPTION"
-#+ * BoidSettings.aggression -> aggression: float "Boid will fight this times stronger enemy"
-#BoidSettings.air_acc_max -> air_acc_max: float "Maximum acceleration in air (relative to maximum speed)"
-#BoidSettings.air_ave_max -> air_ave_max: float "Maximum angular velocity in air (relative to 180 degrees)"
-#+ * BoidSettings.air_personal_space -> air_personal_space: float "Radius of boids personal space in air (% of particle size)"
-#BoidSettings.air_speed_max -> air_speed_max: float "Maximum speed in air"
-#BoidSettings.air_speed_min -> air_speed_min: float "Minimum speed in air (relative to maximum speed)"
-#BoidSettings.bank -> bank: float "Amount of rotation around velocity vector on turns"
-#+ * BoidSettings.health -> health: float "Initial boid health when born"
-#+ * BoidSettings.height -> height: float "Boid height relative to particle size"
-#BoidSettings.land_acc_max -> land_acc_max: float "Maximum acceleration on land (relative to maximum speed)"
-#BoidSettings.land_ave_max -> land_ave_max: float "Maximum angular velocity on land (relative to 180 degrees)"
-#+ * BoidSettings.land_jump_speed -> land_jump_speed: float "Maximum speed for jumping"
-#+ * BoidSettings.land_personal_space -> land_personal_space: float "Radius of boids personal space on land (% of particle size)"
-#BoidSettings.land_smooth -> land_smooth: float "How smoothly the boids land"
-#BoidSettings.land_speed_max -> land_speed_max: float "Maximum speed on land"
-#+ * BoidSettings.land_stick_force -> land_stick_force: float "How strong a force must be to start effecting a boid on land"
-#+ * BoidSettings.range -> range: float "The maximum distance from which a boid can attack"
-#+ * BoidSettings.states -> states: collection, "(read-only)"
-#+ * BoidSettings.strength -> strength: float "Maximum caused damage on attack per second"
-#BoidSettings.use_climb -> use_climb: boolean "Allow boids to climb goal objects"
-#BoidSettings.use_flight -> use_flight: boolean "Allow boids to move in air"
-#BoidSettings.use_land -> use_land: boolean "Allow boids to move on land"
-#+ * BoidState.active_boid_rule -> active_boid_rule: pointer, "(read-only)"
-#+ * BoidState.active_boid_rule_index -> active_boid_rule_index: int "NO DESCRIPTION"
-#+ * BoidState.falloff -> falloff: float "NO DESCRIPTION"
-#+ * BoidState.name -> name: string "Boid state name"
-#BoidState.rule_fuzzy -> rule_fuzzy: float "NO DESCRIPTION"
-#+ * BoidState.rules -> rules: collection, "(read-only)"
-#+ * BoidState.ruleset_type -> ruleset_type: enum "How the rules in the list are evaluated"
-#+ * BoidState.volume -> volume: float "NO DESCRIPTION"
-#+ * Bone.bbone_in -> bbone_in: float "Length of first Bezier Handle (for B-Bones only)"
-#+ * Bone.bbone_out -> bbone_out: float "Length of second Bezier Handle (for B-Bones only)"
-#+ * Bone.bbone_segments -> bbone_segments: int "Number of subdivisions of bone (for B-Bones only)"
-#+ * Bone.children -> children: collection, "(read-only) Bones which are children of this bone"
-#+ * Bone.envelope_distance -> envelope_distance: float "Bone deformation distance (for Envelope deform only)"
-#+ * Bone.envelope_weight -> envelope_weight: float "Bone deformation weight (for Envelope deform only)"
-#+ * Bone.head -> head: float[3] "Location of head end of the bone relative to its parent"
-#+ * Bone.head_local -> head_local: float[3] "Location of head end of the bone relative to armature"
-#+ * Bone.head_radius -> head_radius: float "Radius of head of bone (for Envelope deform only)"
-#+ * Bone.hide -> hide: boolean "Bone is not visible when it is not in Edit Mode (i.e. in Object or Pose Modes)"
-#+ * Bone.hide_select -> hide_select: boolean "Bone is able to be selected"
-#Bone.layers -> layers: boolean[32] "Layers bone exists in"
-#+ * Bone.matrix -> matrix: float[9] "3x3 bone matrix"
-#+ * Bone.matrix_local -> matrix_local: float[16] "4x4 bone matrix relative to armature"
-#+ * Bone.name -> name: string "NO DESCRIPTION"
-#+ * Bone.parent -> parent: pointer, "(read-only) Parent bone (in same Armature)"
-#+ * Bone.select -> select: boolean "NO DESCRIPTION"
-#Bone.show_wire -> show_wire: boolean "Bone is always drawn as Wireframe regardless of viewport draw mode. Useful for non-obstructive custom bone shapes"
-#+ * Bone.tail -> tail: float[3] "Location of tail end of the bone"
-#+ * Bone.tail_local -> tail_local: float[3] "Location of tail end of the bone relative to armature"
-#+ * Bone.tail_radius -> tail_radius: float "Radius of tail of bone (for Envelope deform only)"
-#Bone.use_connect -> use_connect: boolean, "(read-only) When bone has a parent, bones head is struck to the parents tail"
-#Bone.use_cyclic_offset -> use_cyclic_offset: boolean "When bone doesnt have a parent, it receives cyclic offset effects"
-#Bone.use_deform -> use_deform: boolean "Bone does not deform any geometry"
-#Bone.use_envelope_multiply -> use_envelope_multiply: boolean "When deforming bone, multiply effects of Vertex Group weights with Envelope influence"
-#Bone.use_hinge -> use_hinge: boolean "Bone inherits rotation or scale from parent bone"
-#Bone.use_inherit_scale -> use_inherit_scale: boolean "Bone inherits scaling from parent bone"
-#Bone.use_local_location -> use_local_location: boolean "Bone location is set in local space"
-#+ * BoneGroup.color_set -> color_set: enum "Custom color set to use"
-#+ * BoneGroup.colors -> colors: pointer, "(read-only) Copy of the colors associated with the groups color set"
-#+ * BoneGroup.name -> name: string "NO DESCRIPTION"
-#BoneGroups.active -> active: pointer "Active bone group for this pose"
-#+ * ClothCollisionSettings.collision_quality -> collision_quality: int "How many collision iterations should be done. (higher is better quality but slower)"
-#ClothCollisionSettings.distance_min -> distance_min: float "Minimum distance between collision objects before collision response takes in"
-#+ * ClothCollisionSettings.friction -> friction: float "Friction force if a collision happened. (higher = less movement)"
-#+ * ClothCollisionSettings.group -> group: pointer "Limit colliders to this Group"
-#+ * ClothCollisionSettings.self_collision_quality -> self_collision_quality: int "How many self collision iterations should be done. (higher is better quality but slower)"
-#ClothCollisionSettings.self_distance_min -> self_distance_min: float "0.5 means no distance at all, 1.0 is maximum distance"
-#+ * ClothCollisionSettings.self_friction -> self_friction: float "Friction/damping with self contact"
-#ClothCollisionSettings.use_collision -> use_collision: boolean "Enable collisions with other objects"
-#ClothCollisionSettings.use_self_collision -> use_self_collision: boolean "Enable self collisions"
-#+ * ClothSettings.air_damping -> air_damping: float "Air has normally some thickness which slows falling things down"
-#+ * ClothSettings.bending_stiffness -> bending_stiffness: float "Wrinkle coefficient. (higher = less smaller but more big wrinkles)"
-#+ * ClothSettings.bending_stiffness_max -> bending_stiffness_max: float "Maximum bending stiffness value"
-#+ * ClothSettings.bending_vertex_group -> bending_vertex_group: string "Vertex group for fine control over bending stiffness"
-#+ * ClothSettings.collider_friction -> collider_friction: float "NO DESCRIPTION"
-#+ * ClothSettings.effector_weights -> effector_weights: pointer, "(read-only)"
-#+ * ClothSettings.goal_default -> goal_default: float "Default Goal (vertex target position) value, when no Vertex Group used"
-#+ * ClothSettings.goal_friction -> goal_friction: float "Goal (vertex target position) friction"
-#+ * ClothSettings.goal_max -> goal_max: float "Goal maximum, vertex group weights are scaled to match this range"
-#+ * ClothSettings.goal_min -> goal_min: float "Goal minimum, vertex group weights are scaled to match this range"
-#+ * ClothSettings.goal_spring -> goal_spring: float "Goal (vertex target position) spring stiffness"
-#+ * ClothSettings.gravity -> gravity: float[3] "Gravity or external force vector"
-#+ * ClothSettings.internal_friction -> internal_friction: float "NO DESCRIPTION"
-#+ * ClothSettings.mass -> mass: float "Mass of cloth material"
-#+ * ClothSettings.mass_vertex_group -> mass_vertex_group: string "Vertex Group for pinning of vertices"
-#+ * ClothSettings.pin_stiffness -> pin_stiffness: float "Pin (vertex target position) spring stiffness"
-#+ * ClothSettings.pre_roll -> pre_roll: int "Simulation starts on this frame"
-#+ * ClothSettings.quality -> quality: int "Quality of the simulation in steps per frame. (higher is better quality but slower)"
-#+ * ClothSettings.rest_shape_key -> rest_shape_key: pointer "Shape key to use the rest spring lengths from"
-#+ * ClothSettings.spring_damping -> spring_damping: float "Damping of cloth velocity. (higher = more smooth, less jiggling)"
-#+ * ClothSettings.structural_stiffness -> structural_stiffness: float "Overall stiffness of structure"
-#+ * ClothSettings.structural_stiffness_max -> structural_stiffness_max: float "Maximum structural stiffness value"
-#+ * ClothSettings.structural_stiffness_vertex_group -> structural_stiffness_vertex_group: string "Vertex group for fine control over structural stiffness"
-#ClothSettings.use_pin_cloth -> use_pin_cloth: boolean "Enable pinning of cloth vertices to other objects/positions"
-#ClothSettings.use_stiffness_scale -> use_stiffness_scale: boolean "If enabled, stiffness can be scaled along a weight painted vertex group"
-#+ * CollisionSettings.absorption -> absorption: float "How much of effector force gets lost during collision with this object (in percent)"
-#+ * CollisionSettings.damping -> damping: float "Amount of damping during collision"
-#+ * CollisionSettings.damping_factor -> damping_factor: float "Amount of damping during particle collision"
-#CollisionSettings.damping_random -> damping_random: float "Random variation of damping"
-#+ * CollisionSettings.friction_factor -> friction_factor: float "Amount of friction during particle collision"
-#CollisionSettings.friction_random -> friction_random: float "Random variation of friction"
-#+ * CollisionSettings.permeability -> permeability: float "Chance that the particle will pass through the mesh"
-#+ * CollisionSettings.stickness -> stickness: float "Amount of stickness to surface collision"
-#CollisionSettings.thickness_inner -> thickness_inner: float "Inner face thickness"
-#CollisionSettings.thickness_outer -> thickness_outer: float "Outer face thickness"
-#+ * CollisionSettings.use -> use: boolean "Enable this objects as a collider for physics systems"
-#CollisionSettings.use_particle_kill -> use_particle_kill: boolean "Kill collided particles"
-#+ * ColorRamp.elements -> elements: collection, "(read-only)"
-#+ * ColorRamp.interpolation -> interpolation: enum "NO DESCRIPTION"
-#+ * ColorRampElement.color -> color: float[4] "NO DESCRIPTION"
-#+ * ColorRampElement.position -> position: float "NO DESCRIPTION"
-#ConsoleLine.body -> body: string "Text in the line"
-#+ * ConsoleLine.current_character -> current_character: int "NO DESCRIPTION"
-#+ * Constraint.active -> active: boolean "Constraint is the one being edited"
-#Constraint.error_location -> error_location: float, "(read-only) Amount of residual error in Blender space unit for constraints that work on position"
-#Constraint.error_rotation -> error_rotation: float, "(read-only) Amount of residual error in radiant for constraints that work on orientation"
-#+ * Constraint.influence -> influence: float "Amount of influence constraint will have on the final solution"
-#Constraint.is_proxy_local -> is_proxy_local: boolean "Constraint was added in this proxy instance (i.e. did not belong to source Armature)"
-#Constraint.is_valid -> is_valid: boolean, "(read-only) Constraint has invalid settings and will not be evaluated"
-#+ * Constraint.mute -> mute: boolean "Enable/Disable Constraint"
-#+ * Constraint.name -> name: string "Constraint name"
-#+ * Constraint.owner_space -> owner_space: enum "Space that owner is evaluated in"
-#Constraint.show_expanded -> show_expanded: boolean "Constraints panel is expanded in UI"
-#+ * Constraint.target_space -> target_space: enum "Space that target is evaluated in"
-#+ * Constraint.type -> type: enum, "(read-only)"
-#+ * ConstraintTarget.subtarget -> subtarget: string "NO DESCRIPTION"
-#+ * ConstraintTarget.target -> target: pointer "Target Object"
-#+ * Constraint|ActionConstraint.action -> action: pointer "NO DESCRIPTION"
-#+ * Constraint|ActionConstraint.frame_end -> frame_end: int "Last frame of the Action to use"
-#+ * Constraint|ActionConstraint.frame_start -> frame_start: int "First frame of the Action to use"
-#Constraint|ActionConstraint.max -> max: float "Maximum value for target channel range"
-#Constraint|ActionConstraint.min -> min: float "Minimum value for target channel range"
-#+ * Constraint|ActionConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
-#+ * Constraint|ActionConstraint.target -> target: pointer "Target Object"
-#+ * Constraint|ActionConstraint.transform_channel -> transform_channel: enum "Transformation channel from the target that is used to key the Action"
-#+ * Constraint|ChildOfConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
-#+ * Constraint|ChildOfConstraint.target -> target: pointer "Target Object"
-#+ * Constraint|ChildOfConstraint.use_location_x -> use_location_x: boolean "Use X Location of Parent"
-#+ * Constraint|ChildOfConstraint.use_location_y -> use_location_y: boolean "Use Y Location of Parent"
-#+ * Constraint|ChildOfConstraint.use_location_z -> use_location_z: boolean "Use Z Location of Parent"
-#+ * Constraint|ChildOfConstraint.use_rotation_x -> use_rotation_x: boolean "Use X Rotation of Parent"
-#+ * Constraint|ChildOfConstraint.use_rotation_y -> use_rotation_y: boolean "Use Y Rotation of Parent"
-#+ * Constraint|ChildOfConstraint.use_rotation_z -> use_rotation_z: boolean "Use Z Rotation of Parent"
-#+ * Constraint|ChildOfConstraint.use_scale_x -> use_scale_x: boolean "Use X Scale of Parent"
-#+ * Constraint|ChildOfConstraint.use_scale_y -> use_scale_y: boolean "Use Y Scale of Parent"
-#+ * Constraint|ChildOfConstraint.use_scale_z -> use_scale_z: boolean "Use Z Scale of Parent"
-#+ * Constraint|ClampToConstraint.main_axis -> main_axis: enum "Main axis of movement"
-#+ * Constraint|ClampToConstraint.target -> target: pointer "Target Object"
-#Constraint|ClampToConstraint.use_cyclic -> use_cyclic: boolean "Treat curve as cyclic curve (no clamping to curve bounding box"
-#+ * Constraint|CopyLocationConstraint.head_tail -> head_tail: float "Target along length of bone: Head=0, Tail=1"
-#+ * Constraint|CopyLocationConstraint.invert_x -> invert_x: boolean "Invert the X location"
-#+ * Constraint|CopyLocationConstraint.invert_y -> invert_y: boolean "Invert the Y location"
-#+ * Constraint|CopyLocationConstraint.invert_z -> invert_z: boolean "Invert the Z location"
-#+ * Constraint|CopyLocationConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
-#+ * Constraint|CopyLocationConstraint.target -> target: pointer "Target Object"
-#+ * Constraint|CopyLocationConstraint.use_offset -> use_offset: boolean "Add original location into copied location"
-#+ * Constraint|CopyLocationConstraint.use_x -> use_x: boolean "Copy the targets X location"
-#+ * Constraint|CopyLocationConstraint.use_y -> use_y: boolean "Copy the targets Y location"
-#+ * Constraint|CopyLocationConstraint.use_z -> use_z: boolean "Copy the targets Z location"
-#+ * Constraint|CopyRotationConstraint.invert_x -> invert_x: boolean "Invert the X rotation"
-#+ * Constraint|CopyRotationConstraint.invert_y -> invert_y: boolean "Invert the Y rotation"
-#+ * Constraint|CopyRotationConstraint.invert_z -> invert_z: boolean "Invert the Z rotation"
-#+ * Constraint|CopyRotationConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
-#+ * Constraint|CopyRotationConstraint.target -> target: pointer "Target Object"
-#+ * Constraint|CopyRotationConstraint.use_offset -> use_offset: boolean "Add original rotation into copied rotation"
-#+ * Constraint|CopyRotationConstraint.use_x -> use_x: boolean "Copy the targets X rotation"
-#+ * Constraint|CopyRotationConstraint.use_y -> use_y: boolean "Copy the targets Y rotation"
-#+ * Constraint|CopyRotationConstraint.use_z -> use_z: boolean "Copy the targets Z rotation"
-#+ * Constraint|CopyScaleConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
-#+ * Constraint|CopyScaleConstraint.target -> target: pointer "Target Object"
-#+ * Constraint|CopyScaleConstraint.use_offset -> use_offset: boolean "Add original scale into copied scale"
-#+ * Constraint|CopyScaleConstraint.use_x -> use_x: boolean "Copy the targets X scale"
-#+ * Constraint|CopyScaleConstraint.use_y -> use_y: boolean "Copy the targets Y scale"
-#+ * Constraint|CopyScaleConstraint.use_z -> use_z: boolean "Copy the targets Z scale"
-#+ * Constraint|CopyTransformsConstraint.head_tail -> head_tail: float "Target along length of bone: Head=0, Tail=1"
-#+ * Constraint|CopyTransformsConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
-#+ * Constraint|CopyTransformsConstraint.target -> target: pointer "Target Object"
-#+ * Constraint|DampedTrackConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
-#+ * Constraint|DampedTrackConstraint.target -> target: pointer "Target Object"
-#Constraint|DampedTrackConstraint.track_axis -> track_axis: enum "Axis that points to the target object"
-#+ * Constraint|FloorConstraint.floor_location -> floor_location: enum "Location of target that object will not pass through"
-#+ * Constraint|FloorConstraint.offset -> offset: float "Offset of floor from object origin"
-#+ * Constraint|FloorConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
-#+ * Constraint|FloorConstraint.target -> target: pointer "Target Object"
-#+ * Constraint|FloorConstraint.use_rotation -> use_rotation: boolean "Use the targets rotation to determine floor"
-#Constraint|FloorConstraint.use_sticky -> use_sticky: boolean "Immobilize object while constrained"
-#Constraint|FollowPathConstraint.forward_axis -> forward_axis: enum "Axis that points forward along the path"
-#+ * Constraint|FollowPathConstraint.offset -> offset: int "Offset from the position corresponding to the time frame"
-#+ * Constraint|FollowPathConstraint.offset_factor -> offset_factor: float "Percentage value defining target position along length of bone"
-#+ * Constraint|FollowPathConstraint.target -> target: pointer "Target Object"
-#Constraint|FollowPathConstraint.up_axis -> up_axis: enum "Axis that points upward"
-#+ * Constraint|FollowPathConstraint.use_curve_follow -> use_curve_follow: boolean "Object will follow the heading and banking of the curve"
-#+ * Constraint|FollowPathConstraint.use_curve_radius -> use_curve_radius: boolean "Objects scale by the curve radius"
-#Constraint|FollowPathConstraint.use_fixed_location -> use_fixed_location: boolean "Object will stay locked to a single point somewhere along the length of the curve regardless of time"
-#Constraint|KinematicConstraint.chain_count -> chain_count: int "How many bones are included in the IK effect - 0 uses all bones"
-#+ * Constraint|KinematicConstraint.distance -> distance: float "Radius of limiting sphere"
-#+ * Constraint|KinematicConstraint.ik_type -> ik_type: enum "NO DESCRIPTION"
-#+ * Constraint|KinematicConstraint.iterations -> iterations: int "Maximum number of solving iterations"
-#+ * Constraint|KinematicConstraint.limit_mode -> limit_mode: enum "Distances in relation to sphere of influence to allow"
-#Constraint|KinematicConstraint.lock_location_x -> lock_location_x: boolean "Constraint position along X axis"
-#Constraint|KinematicConstraint.lock_location_y -> lock_location_y: boolean "Constraint position along Y axis"
-#Constraint|KinematicConstraint.lock_location_z -> lock_location_z: boolean "Constraint position along Z axis"
-#Constraint|KinematicConstraint.lock_rotation_x -> lock_rotation_x: boolean "Constraint rotation along X axis"
-#Constraint|KinematicConstraint.lock_rotation_y -> lock_rotation_y: boolean "Constraint rotation along Y axis"
-#Constraint|KinematicConstraint.lock_rotation_z -> lock_rotation_z: boolean "Constraint rotation along Z axis"
-#+ * Constraint|KinematicConstraint.orient_weight -> orient_weight: float "For Tree-IK: Weight of orientation control for this target"
-#+ * Constraint|KinematicConstraint.pole_angle -> pole_angle: float "Pole rotation offset"
-#+ * Constraint|KinematicConstraint.pole_subtarget -> pole_subtarget: string "NO DESCRIPTION"
-#+ * Constraint|KinematicConstraint.pole_target -> pole_target: pointer "Object for pole rotation"
-#Constraint|KinematicConstraint.reference_axis -> reference_axis: enum "Constraint axis Lock options relative to Bone or Target reference"
-#+ * Constraint|KinematicConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
-#+ * Constraint|KinematicConstraint.target -> target: pointer "Target Object"
-#Constraint|KinematicConstraint.use_location -> use_location: boolean "Chain follows position of target"
-#+ * Constraint|KinematicConstraint.use_rotation -> use_rotation: boolean "Chain follows rotation of target"
-#+ * Constraint|KinematicConstraint.use_stretch -> use_stretch: boolean "Enable IK Stretching"
-#+ * Constraint|KinematicConstraint.use_tail -> use_tail: boolean "Include bones tail as last element in chain"
-#+ * Constraint|KinematicConstraint.use_target -> use_target: boolean "Disable for targetless IK"
-#+ * Constraint|KinematicConstraint.weight -> weight: float "For Tree-IK: Weight of position control for this target"
-#+ * Constraint|LimitDistanceConstraint.distance -> distance: float "Radius of limiting sphere"
-#+ * Constraint|LimitDistanceConstraint.limit_mode -> limit_mode: enum "Distances in relation to sphere of influence to allow"
-#+ * Constraint|LimitDistanceConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
-#+ * Constraint|LimitDistanceConstraint.target -> target: pointer "Target Object"
-#Constraint|LimitLocationConstraint.max_x -> max_x: float "Highest X value to allow"
-#Constraint|LimitLocationConstraint.max_y -> max_y: float "Highest Y value to allow"
-#Constraint|LimitLocationConstraint.max_z -> max_z: float "Highest Z value to allow"
-#Constraint|LimitLocationConstraint.min_x -> min_x: float "Lowest X value to allow"
-#Constraint|LimitLocationConstraint.min_y -> min_y: float "Lowest Y value to allow"
-#Constraint|LimitLocationConstraint.min_z -> min_z: float "Lowest Z value to allow"
-#Constraint|LimitLocationConstraint.use_max_x -> use_max_x: boolean "Use the maximum X value"
-#Constraint|LimitLocationConstraint.use_max_y -> use_max_y: boolean "Use the maximum Y value"
-#Constraint|LimitLocationConstraint.use_max_z -> use_max_z: boolean "Use the maximum Z value"
-#Constraint|LimitLocationConstraint.use_min_x -> use_min_x: boolean "Use the minimum X value"
-#Constraint|LimitLocationConstraint.use_min_y -> use_min_y: boolean "Use the minimum Y value"
-#Constraint|LimitLocationConstraint.use_min_z -> use_min_z: boolean "Use the minimum Z value"
-#Constraint|LimitLocationConstraint.use_transform_limit -> use_transform_limit: boolean "Transforms are affected by this constraint as well"
-#Constraint|LimitRotationConstraint.max_x -> max_x: float "Highest X value to allow"
-#Constraint|LimitRotationConstraint.max_y -> max_y: float "Highest Y value to allow"
-#Constraint|LimitRotationConstraint.max_z -> max_z: float "Highest Z value to allow"
-#Constraint|LimitRotationConstraint.min_x -> min_x: float "Lowest X value to allow"
-#Constraint|LimitRotationConstraint.min_y -> min_y: float "Lowest Y value to allow"
-#Constraint|LimitRotationConstraint.min_z -> min_z: float "Lowest Z value to allow"
-#+ * Constraint|LimitRotationConstraint.use_limit_x -> use_limit_x: boolean "Use the minimum X value"
-#+ * Constraint|LimitRotationConstraint.use_limit_y -> use_limit_y: boolean "Use the minimum Y value"
-#+ * Constraint|LimitRotationConstraint.use_limit_z -> use_limit_z: boolean "Use the minimum Z value"
-#Constraint|LimitRotationConstraint.use_transform_limit -> use_transform_limit: boolean "Transforms are affected by this constraint as well"
-#Constraint|LimitScaleConstraint.max_x -> max_x: float "Highest X value to allow"
-#Constraint|LimitScaleConstraint.max_y -> max_y: float "Highest Y value to allow"
-#Constraint|LimitScaleConstraint.max_z -> max_z: float "Highest Z value to allow"
-#Constraint|LimitScaleConstraint.min_x -> min_x: float "Lowest X value to allow"
-#Constraint|LimitScaleConstraint.min_y -> min_y: float "Lowest Y value to allow"
-#Constraint|LimitScaleConstraint.min_z -> min_z: float "Lowest Z value to allow"
-#Constraint|LimitScaleConstraint.use_max_x -> use_max_x: boolean "Use the maximum X value"
-#Constraint|LimitScaleConstraint.use_max_y -> use_max_y: boolean "Use the maximum Y value"
-#Constraint|LimitScaleConstraint.use_max_z -> use_max_z: boolean "Use the maximum Z value"
-#Constraint|LimitScaleConstraint.use_min_x -> use_min_x: boolean "Use the minimum X value"
-#Constraint|LimitScaleConstraint.use_min_y -> use_min_y: boolean "Use the minimum Y value"
-#Constraint|LimitScaleConstraint.use_min_z -> use_min_z: boolean "Use the minimum Z value"
-#Constraint|LimitScaleConstraint.use_transform_limit -> use_transform_limit: boolean "Transforms are affected by this constraint as well"
-#Constraint|LockedTrackConstraint.lock_axis -> lock_axis: enum "Axis that points upward"
-#+ * Constraint|LockedTrackConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
-#+ * Constraint|LockedTrackConstraint.target -> target: pointer "Target Object"
-#Constraint|LockedTrackConstraint.track_axis -> track_axis: enum "Axis that points to the target object"
-#Constraint|MaintainVolumeConstraint.free_axis -> free_axis: enum "The free scaling axis of the object"
-#+ * Constraint|MaintainVolumeConstraint.volume -> volume: float "Volume of the bone at rest"
-#+ * Constraint|PivotConstraint.head_tail -> head_tail: float "Target along length of bone: Head=0, Tail=1"
-#+ * Constraint|PivotConstraint.offset -> offset: float[3] "Offset of pivot from target (when set), or from owners location (when Fixed Position is off), or the absolute pivot point"
-#Constraint|PivotConstraint.rotation_range -> rotation_range: enum "Rotation range on which pivoting should occur"
-#+ * Constraint|PivotConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
-#+ * Constraint|PivotConstraint.target -> target: pointer "Target Object, defining the position of the pivot when defined"
-#Constraint|PivotConstraint.use_relative_location -> use_relative_location: boolean "Offset will be an absolute point in space instead of relative to the target"
-#Constraint|PythonConstraint.has_script_error -> has_script_error: boolean, "(read-only) The linked Python script has thrown an error"
-#Constraint|PythonConstraint.target_count -> target_count: int "Usually only 1-3 are needed"
-#+ * Constraint|PythonConstraint.targets -> targets: collection, "(read-only) Target Objects"
-#+ * Constraint|PythonConstraint.text -> text: pointer "The text object that contains the Python script"
-#+ * Constraint|PythonConstraint.use_targets -> use_targets: boolean "Use the targets indicated in the constraint panel"
-#+ * Constraint|RigidBodyJointConstraint.axis_x -> axis_x: float "Rotate pivot on X axis in degrees"
-#+ * Constraint|RigidBodyJointConstraint.axis_y -> axis_y: float "Rotate pivot on Y axis in degrees"
-#+ * Constraint|RigidBodyJointConstraint.axis_z -> axis_z: float "Rotate pivot on Z axis in degrees"
-#+ * Constraint|RigidBodyJointConstraint.child -> child: pointer "Child object"
-#+ * Constraint|RigidBodyJointConstraint.pivot_type -> pivot_type: enum "NO DESCRIPTION"
-#+ * Constraint|RigidBodyJointConstraint.pivot_x -> pivot_x: float "Offset pivot on X"
-#+ * Constraint|RigidBodyJointConstraint.pivot_y -> pivot_y: float "Offset pivot on Y"
-#+ * Constraint|RigidBodyJointConstraint.pivot_z -> pivot_z: float "Offset pivot on Z"
-#Constraint|RigidBodyJointConstraint.show_pivot -> show_pivot: boolean "Display the pivot point and rotation in 3D view"
-#+ * Constraint|RigidBodyJointConstraint.target -> target: pointer "Target Object"
-#Constraint|RigidBodyJointConstraint.use_linked_collision -> use_linked_collision: boolean "Disable collision between linked bodies"
-#+ * Constraint|ShrinkwrapConstraint.distance -> distance: float "Distance to Target"
-#+ * Constraint|ShrinkwrapConstraint.shrinkwrap_type -> shrinkwrap_type: enum "Selects type of shrinkwrap algorithm for target position"
-#+ * Constraint|ShrinkwrapConstraint.target -> target: pointer "Target Object"
-#+ * Constraint|ShrinkwrapConstraint.use_x -> use_x: boolean "Projection over X Axis"
-#+ * Constraint|ShrinkwrapConstraint.use_y -> use_y: boolean "Projection over Y Axis"
-#+ * Constraint|ShrinkwrapConstraint.use_z -> use_z: boolean "Projection over Z Axis"
-#Constraint|SplineIKConstraint.chain_count -> chain_count: int "How many bones are included in the chain"
-#+ * Constraint|SplineIKConstraint.joint_bindings -> joint_bindings: float[32] "(EXPERIENCED USERS ONLY) The relative positions of the joints along the chain as percentages"
-#+ * Constraint|SplineIKConstraint.target -> target: pointer "Curve that controls this relationship"
-#Constraint|SplineIKConstraint.use_chain_offset -> use_chain_offset: boolean "Offset the entire chain relative to the root joint"
-#+ * Constraint|SplineIKConstraint.use_curve_radius -> use_curve_radius: boolean "Average radius of the endpoints is used to tweak the X and Z Scaling of the bones, on top of XZ Scale mode"
-#Constraint|SplineIKConstraint.use_even_divisions -> use_even_divisions: boolean "Ignore the relative lengths of the bones when fitting to the curve"
-#Constraint|SplineIKConstraint.use_y_stretch -> use_y_stretch: boolean "Stretch the Y axis of the bones to fit the curve"
-#Constraint|SplineIKConstraint.xz_scale_mode -> xz_scale_mode: enum "Method used for determining the scaling of the X and Z axes of the bones"
-#+ * Constraint|StretchToConstraint.bulge -> bulge: float "Factor between volume variation and stretching"
-#+ * Constraint|StretchToConstraint.head_tail -> head_tail: float "Target along length of bone: Head=0, Tail=1"
-#+ * Constraint|StretchToConstraint.keep_axis -> keep_axis: enum "Axis to maintain during stretch"
-#Constraint|StretchToConstraint.rest_length -> rest_length: float "Length at rest position"
-#+ * Constraint|StretchToConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
-#+ * Constraint|StretchToConstraint.target -> target: pointer "Target Object"
-#+ * Constraint|StretchToConstraint.volume -> volume: enum "Maintain the objects volume as it stretches"
-#+ * Constraint|TrackToConstraint.head_tail -> head_tail: float "Target along length of bone: Head=0, Tail=1"
-#+ * Constraint|TrackToConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
-#+ * Constraint|TrackToConstraint.target -> target: pointer "Target Object"
-#Constraint|TrackToConstraint.track_axis -> track_axis: enum "Axis that points to the target object"
-#Constraint|TrackToConstraint.up_axis -> up_axis: enum "Axis that points upward"
-#Constraint|TrackToConstraint.use_target_z -> use_target_z: boolean "Targets Z axis, not World Z axis, will constraint the Up direction"
-#+ * Constraint|TransformConstraint.from_max_x -> from_max_x: float "Top range of X axis source motion"
-#+ * Constraint|TransformConstraint.from_max_y -> from_max_y: float "Top range of Y axis source motion"
-#+ * Constraint|TransformConstraint.from_max_z -> from_max_z: float "Top range of Z axis source motion"
-#+ * Constraint|TransformConstraint.from_min_x -> from_min_x: float "Bottom range of X axis source motion"
-#+ * Constraint|TransformConstraint.from_min_y -> from_min_y: float "Bottom range of Y axis source motion"
-#+ * Constraint|TransformConstraint.from_min_z -> from_min_z: float "Bottom range of Z axis source motion"
-#+ * Constraint|TransformConstraint.map_from -> map_from: enum "The transformation type to use from the target"
-#+ * Constraint|TransformConstraint.map_to -> map_to: enum "The transformation type to affect of the constrained object"
-#+ * Constraint|TransformConstraint.map_to_x_from -> map_to_x_from: enum "The source axis constrained objects X axis uses"
-#+ * Constraint|TransformConstraint.map_to_y_from -> map_to_y_from: enum "The source axis constrained objects Y axis uses"
-#+ * Constraint|TransformConstraint.map_to_z_from -> map_to_z_from: enum "The source axis constrained objects Z axis uses"
-#+ * Constraint|TransformConstraint.subtarget -> subtarget: string "NO DESCRIPTION"
-#+ * Constraint|TransformConstraint.target -> target: pointer "Target Object"
-#+ * Constraint|TransformConstraint.to_max_x -> to_max_x: float "Top range of X axis destination motion"
-#+ * Constraint|TransformConstraint.to_max_y -> to_max_y: float "Top range of Y axis destination motion"
-#+ * Constraint|TransformConstraint.to_max_z -> to_max_z: float "Top range of Z axis destination motion"
-#+ * Constraint|TransformConstraint.to_min_x -> to_min_x: float "Bottom range of X axis destination motion"
-#+ * Constraint|TransformConstraint.to_min_y -> to_min_y: float "Bottom range of Y axis destination motion"
-#+ * Constraint|TransformConstraint.to_min_z -> to_min_z: float "Bottom range of Z axis destination motion"
-#Constraint|TransformConstraint.use_motion_extrapolate -> use_motion_extrapolate: boolean "Extrapolate ranges"
-#+ * Context.area -> area: pointer, "(read-only)"
-#+ * Context.main -> main: pointer, "(read-only)"
-#+ * Context.mode -> mode: enum, "(read-only)"
-#+ * Context.region -> region: pointer, "(read-only)"
-#+ * Context.region_data -> region_data: pointer, "(read-only)"
-#+ * Context.scene -> scene: pointer, "(read-only)"
-#+ * Context.screen -> screen: pointer, "(read-only)"
-#+ * Context.space_data -> space_data: pointer, "(read-only)"
-#+ * Context.tool_settings -> tool_settings: pointer, "(read-only)"
-#+ * Context.user_preferences -> user_preferences: pointer, "(read-only)"
-#+ * Context.window -> window: pointer, "(read-only)"
- + * Context.manager -> wm: pointer, "(read-only)"
-#+ * Controller.name -> name: string "NO DESCRIPTION"
-#Controller.show_expanded -> show_expanded: boolean "Set controller expanded in the user interface"
-#Controller.states -> states: int "Set Controller state index (1 to 30)"
-#+ * Controller.type -> type: enum "NO DESCRIPTION"
-#Controller.use_priority -> use_priority: boolean "Mark controller for execution before all non-marked controllers (good for startup scripts)"
-#+ * Controller|ExpressionController.expression -> expression: string "NO DESCRIPTION"
-#+ * Controller|PythonController.mode -> mode: enum "Python script type (textblock or module - faster)"
-#+ * Controller|PythonController.module -> module: string "Module name and function to run e.g. someModule.main. Internal texts and external python files can be used"
-#+ * Controller|PythonController.text -> text: pointer "Text datablock with the python script"
-#Controller|PythonController.use_debug -> use_debug: boolean "Continuously reload the module from disk for editing external modules without restarting"
-#+ * CurveMap.extend -> extend: enum, "(read-only) Extrapolate the curve or extend it horizontally"
-#+ * CurveMap.points -> points: collection, "(read-only)"
-#+ * CurveMapPoint.handle_type -> handle_type: enum, "(read-only) Curve interpolation at this point: bezier or vector"
-#+ * CurveMapPoint.location -> location: float[2], "(read-only) X/Y coordinates of the curve point"
-#+ * CurveMapPoint.select -> select: boolean "Selection state of the curve point"
-#+ * CurveMapping.black_level -> black_level: float[3] "For RGB curves, the color that black is mapped to"
-#+ * CurveMapping.clip_max_x -> clip_max_x: float "NO DESCRIPTION"
-#+ * CurveMapping.clip_max_y -> clip_max_y: float "NO DESCRIPTION"
-#+ * CurveMapping.clip_min_x -> clip_min_x: float "NO DESCRIPTION"
-#+ * CurveMapping.clip_min_y -> clip_min_y: float "NO DESCRIPTION"
-#+ * CurveMapping.curves -> curves: collection, "(read-only)"
-#CurveMapping.use_clip -> use_clip: boolean "Force the curve view to fit a defined boundary"
-#+ * CurveMapping.white_level -> white_level: float[3] "For RGB curves, the color that white is mapped to"
-#+ * CurveSplines.active -> active: pointer "Active curve spline"
-#DopeSheet.filter_group -> filter_group: pointer "Group that included Object should be a member of"
-#DopeSheet.show_armatures -> show_armatures: boolean "Include visualization of Armature related Animation data"
-#DopeSheet.show_cameras -> show_cameras: boolean "Include visualization of Camera related Animation data"
-#DopeSheet.show_curves -> show_curves: boolean "Include visualization of Curve related Animation data"
-#DopeSheet.show_expanded_summary -> show_expanded_summary: boolean "Collapse summary when shown, so all other channels get hidden. (DopeSheet Editors Only)"
-#DopeSheet.show_hidden -> show_hidden: boolean "Include channels from objects/bone that arent visible"
-#DopeSheet.show_lamps -> show_lamps: boolean "Include visualization of Lamp related Animation data"
-#DopeSheet.show_materials -> show_materials: boolean "Include visualization of Material related Animation data"
-#DopeSheet.show_meshes -> show_meshes: boolean "Include visualization of Mesh related Animation data"
-#DopeSheet.show_metaballs -> show_metaballs: boolean "Include visualization of Metaball related Animation data"
-#DopeSheet.show_missing_nla -> show_missing_nla: boolean "Include Animation Data blocks with no NLA data. (NLA Editor only)"
-#DopeSheet.show_nodes -> show_nodes: boolean "Include visualization of Node related Animation data"
-#DopeSheet.show_only_group_objects -> show_only_group_objects: boolean "Only include channels from Objects in the specified Group"
-#DopeSheet.show_only_selected -> show_only_selected: boolean "Only include channels relating to selected objects and data"
-#DopeSheet.show_particles -> show_particles: boolean "Include visualization of Particle related Animation data"
-#DopeSheet.show_scenes -> show_scenes: boolean "Include visualization of Scene related Animation data"
-#DopeSheet.show_shapekeys -> show_shapekeys: boolean "Include visualization of ShapeKey related Animation data"
-#DopeSheet.show_summary -> show_summary: boolean "Display an additional summary line. (DopeSheet Editors only)"
-#DopeSheet.show_textures -> show_textures: boolean "Include visualization of Texture related Animation data"
-#DopeSheet.show_transforms -> show_transforms: boolean "Include visualization of Object-level Animation data (mostly Transforms)"
-#DopeSheet.show_worlds -> show_worlds: boolean "Include visualization of World related Animation data"
-#+ * DopeSheet.source -> source: pointer, "(read-only) ID-Block representing source data, currently ID_SCE (for Dopesheet), and ID_SC (for Grease Pencil)"
-#+ * Driver.expression -> expression: string "Expression to use for Scripted Expression"
-#Driver.is_valid -> is_valid: boolean "Driver could not be evaluated in past, so should be skipped"
-#+ * Driver.show_debug_info -> show_debug_info: boolean "Show intermediate values for the driver calculations to allow debugging of drivers"
-#+ * Driver.type -> type: enum "Driver type"
-#+ * Driver.variables -> variables: collection, "(read-only) Properties acting as inputs for this driver"
-#+ * DriverTarget.bone_target -> bone_target: string "Name of PoseBone to use as target"
-#+ * DriverTarget.data_path -> data_path: string "RNA Path (from ID-block) to property used"
-#+ * DriverTarget.id -> id: pointer "ID-block that the specific property used can be found from (id_type property must be set first)"
-#+ * DriverTarget.id_type -> id_type: enum "Type of ID-block that can be used"
-#+ * DriverTarget.transform_type -> transform_type: enum "Driver variable type"
-#DriverTarget.use_local_space_transform -> use_local_space_transform: boolean "Use transforms in Local Space (as opposed to the worldspace default)"
-#+ * DriverVariable.name -> name: string "Name to use in scripted expressions/functions. (No spaces or dots are allowed. Also, must not start with a symbol or digit)"
-#+ * DriverVariable.targets -> targets: collection, "(read-only) Sources of input data for evaluating this variable"
-#+ * DriverVariable.type -> type: enum "Driver variable type"
-#+ * DupliObject.matrix -> matrix: float[16] "Object duplicate transformation matrix"
-#+ * DupliObject.matrix_original -> matrix_original: float[16] "The original matrix of this object before it was duplicated"
-#+ * DupliObject.object -> object: pointer, "(read-only) Object being duplicated"
-#+ * EditBone.bbone_in -> bbone_in: float "Length of first Bezier Handle (for B-Bones only)"
-#+ * EditBone.bbone_out -> bbone_out: float "Length of second Bezier Handle (for B-Bones only)"
-#+ * EditBone.bbone_segments -> bbone_segments: int "Number of subdivisions of bone (for B-Bones only)"
-#+ * EditBone.envelope_distance -> envelope_distance: float "Bone deformation distance (for Envelope deform only)"
-#+ * EditBone.envelope_weight -> envelope_weight: float "Bone deformation weight (for Envelope deform only)"
-#+ * EditBone.head -> head: float[3] "Location of head end of the bone"
-#+ * EditBone.head_radius -> head_radius: float "Radius of head of bone (for Envelope deform only)"
-#+ * EditBone.hide -> hide: boolean "Bone is not visible when in Edit Mode"
-#+ * EditBone.hide_select -> hide_select: boolean "Bone is able to be selected"
-#EditBone.layers -> layers: boolean[32] "Layers bone exists in"
-#+ * EditBone.lock -> lock: boolean "Bone is not able to be transformed when in Edit Mode"
-#+ * EditBone.matrix -> matrix: float[16], "(read-only) Read-only matrix calculated from the roll (armature space)"
-#+ * EditBone.name -> name: string "NO DESCRIPTION"
-#+ * EditBone.parent -> parent: pointer "Parent edit bone (in same Armature)"
-#+ * EditBone.roll -> roll: float "Bone rotation around head-tail axis"
-#+ * EditBone.select -> select: boolean "NO DESCRIPTION"
-#+ * EditBone.select_head -> select_head: boolean "NO DESCRIPTION"
-#+ * EditBone.select_tail -> select_tail: boolean "NO DESCRIPTION"
-#EditBone.show_wire -> show_wire: boolean "Bone is always drawn as Wireframe regardless of viewport draw mode. Useful for non-obstructive custom bone shapes"
-#+ * EditBone.tail -> tail: float[3] "Location of tail end of the bone"
-#+ * EditBone.tail_radius -> tail_radius: float "Radius of tail of bone (for Envelope deform only)"
-#EditBone.use_connect -> use_connect: boolean "When bone has a parent, bones head is struck to the parents tail"
-#EditBone.use_cyclic_offset -> use_cyclic_offset: boolean "When bone doesnt have a parent, it receives cyclic offset effects"
-#EditBone.use_deform -> use_deform: boolean "Bone does not deform any geometry"
-#EditBone.use_envelope_multiply -> use_envelope_multiply: boolean "When deforming bone, multiply effects of Vertex Group weights with Envelope influence"
-#EditBone.use_hinge -> use_hinge: boolean "Bone inherits rotation or scale from parent bone"
-#EditBone.use_inherit_scale -> use_inherit_scale: boolean "Bone inherits scaling from parent bone"
-#EditBone.use_local_location -> use_local_location: boolean "Bone location is set in local space"
-#+ * EffectorWeights.all -> all: float "All effectors weight"
-#EffectorWeights.apply_to_hair_growing -> apply_to_hair_growing: boolean "Use force fields when growing hair"
-#+ * EffectorWeights.boid -> boid: float "Boid effector weight"
-#+ * EffectorWeights.charge -> charge: float "Charge effector weight"
-#EffectorWeights.curve_guide -> curve_guide: float "Curve guide effector weight"
-#+ * EffectorWeights.drag -> drag: float "Drag effector weight"
-#+ * EffectorWeights.force -> force: float "Force effector weight"
-#+ * EffectorWeights.gravity -> gravity: float "Global gravity weight"
-#+ * EffectorWeights.group -> group: pointer "Limit effectors to this Group"
-#+ * EffectorWeights.harmonic -> harmonic: float "Harmonic effector weight"
-#+ * EffectorWeights.lennardjones -> lennardjones: float "Lennard-Jones effector weight"
-#+ * EffectorWeights.magnetic -> magnetic: float "Magnetic effector weight"
-#+ * EffectorWeights.texture -> texture: float "Texture effector weight"
-#+ * EffectorWeights.turbulence -> turbulence: float "Turbulence effector weight"
-#+ * EffectorWeights.vortex -> vortex: float "Vortex effector weight"
-#+ * EffectorWeights.wind -> wind: float "Wind effector weight"
-#+ * EnumPropertyItem.description -> description: string, "(read-only) Description of the items purpose"
-#+ * EnumPropertyItem.identifier -> identifier: string, "(read-only) Unique name used in the code and scripting"
-#+ * EnumPropertyItem.name -> name: string, "(read-only) Human readable name"
-#+ * EnumPropertyItem.value -> value: int, "(read-only) Value of the item"
-#+ * EnvironmentMap.clip_end -> clip_end: float "Objects further than this are not visible to map"
-#+ * EnvironmentMap.clip_start -> clip_start: float "Objects nearer than this are not visible to map"
-#+ * EnvironmentMap.depth -> depth: int "Number of times a map will be rendered recursively (mirror effects.)"
-#EnvironmentMap.layers_ignore -> layers_ignore: boolean[20] "Hide objects on these layers when generating the Environment Map"
-#+ * EnvironmentMap.mapping -> mapping: enum "NO DESCRIPTION"
-#+ * EnvironmentMap.resolution -> resolution: int "Pixel resolution of the rendered environment map"
-#+ * EnvironmentMap.source -> source: enum "NO DESCRIPTION"
-#+ * EnvironmentMap.viewpoint_object -> viewpoint_object: pointer "Object to use as the environment maps viewpoint location"
-#+ * EnvironmentMap.zoom -> zoom: float "NO DESCRIPTION"
-#+ * Event.ascii -> ascii: string, "(read-only) Single ASCII character for this event"
- + * Event.alt -> is_pressed_alt: boolean, "(read-only) True when the Alt/Option key is held"
- + * Event.oskey -> is_pressed_cmd: boolean, "(read-only) True when the Cmd key is held"
- + * Event.ctrl -> is_pressed_ctrl: boolean, "(read-only) True when the Ctrl key is held"
- + * Event.shift -> is_pressed_shift: boolean, "(read-only) True when the Shift key is held"
-#+ * Event.mouse_prev_x -> mouse_prev_x: int, "(read-only) The window relative vertical location of the mouse"
-#+ * Event.mouse_prev_y -> mouse_prev_y: int, "(read-only) The window relative horizontal location of the mouse"
-#+ * Event.mouse_region_x -> mouse_region_x: int, "(read-only) The region relative vertical location of the mouse"
-#+ * Event.mouse_region_y -> mouse_region_y: int, "(read-only) The region relative horizontal location of the mouse"
-#+ * Event.mouse_x -> mouse_x: int, "(read-only) The window relative vertical location of the mouse"
-#+ * Event.mouse_y -> mouse_y: int, "(read-only) The window relative horizontal location of the mouse"
-#+ * Event.type -> type: enum, "(read-only)"
-#+ * Event.value -> value: enum, "(read-only) The type of event, only applies to some"
-#+ * FCurve.array_index -> array_index: int "Index to the specific property affected by F-Curve if applicable"
-#+ * FCurve.color -> color: float[3] "Color of the F-Curve in the Graph Editor"
-#+ * FCurve.color_mode -> color_mode: enum "Method used to determine color of F-Curve in Graph Editor"
-#+ * FCurve.data_path -> data_path: string "RNA Path to property affected by F-Curve"
-#+ * FCurve.driver -> driver: pointer, "(read-only) Channel Driver (only set for Driver F-Curves)"
-#+ * FCurve.extrapolation -> extrapolation: enum "NO DESCRIPTION"
-#+ * FCurve.group -> group: pointer "Action Group that this F-Curve belongs to"
-#+ * FCurve.hide -> hide: boolean "F-Curve and its keyframes are hidden in the Graph Editor graphs"
-#+ * FCurve.is_valid -> is_valid: boolean "False when F-Curve could not be evaluated in past, so should be skipped when evaluating"
-#+ * FCurve.keyframe_points -> keyframe_points: collection, "(read-only) User-editable keyframes"
-#+ * FCurve.lock -> lock: boolean "F-Curves settings cannot be edited"
-#+ * FCurve.modifiers -> modifiers: collection, "(read-only) Modifiers affecting the shape of the F-Curve"
-#+ * FCurve.mute -> mute: boolean "F-Curve is not evaluated"
-#+ * FCurve.sampled_points -> sampled_points: collection, "(read-only) Sampled animation data"
-#+ * FCurve.select -> select: boolean "F-Curve is selected for editing"
-#+ * FCurve.use_auto_handle_clamp -> use_auto_handle_clamp: boolean "All auto-handles for F-Curve are clamped"
-#+ * FCurveModifiers.active -> active: pointer "Active F-Curve Modifier"
-#+ * FCurveSample.co -> co: float[2] "Point coordinates"
-#+ * FCurveSample.select -> select: boolean "Selection status"
-#REMOVE * FModifier.active -> active: boolean "F-Curve Modifier is the one being edited"
-#FModifier.is_valid -> is_valid: boolean, "(read-only) F-Curve Modifier has invalid settings and will not be evaluated"
-#+ * FModifier.mute -> mute: boolean "F-Curve Modifier will not be evaluated"
-#FModifier.show_expanded -> show_expanded: boolean "F-Curve Modifiers panel is expanded in UI"
-#+ * FModifier.type -> type: enum, "(read-only) F-Curve Modifier Type"
-#+ * FModifierEnvelopeControlPoint.frame -> frame: float "Frame this control-point occurs on"
-#FModifierEnvelopeControlPoint.max -> max: float "Upper bound of envelope at this control-point"
-#FModifierEnvelopeControlPoint.min -> min: float "Lower bound of envelope at this control-point"
-#FModifier|FModifierCycles.cycles_after -> cycles_after: float "Maximum number of cycles to allow after last keyframe. (0 = infinite)"
-#FModifier|FModifierCycles.cycles_before -> cycles_before: float "Maximum number of cycles to allow before first keyframe. (0 = infinite)"
-#FModifier|FModifierCycles.mode_after -> mode_after: enum "Cycling mode to use after last keyframe"
-#FModifier|FModifierCycles.mode_before -> mode_before: enum "Cycling mode to use before first keyframe"
-#+ * FModifier|FModifierEnvelope.control_points -> control_points: collection, "(read-only) Control points defining the shape of the envelope"
-#FModifier|FModifierEnvelope.default_max -> default_max: float "Upper distance from Reference Value for 1:1 default influence"
-#FModifier|FModifierEnvelope.default_min -> default_min: float "Lower distance from Reference Value for 1:1 default influence"
-#+ * FModifier|FModifierEnvelope.reference_value -> reference_value: float "Value that envelopes influence is centered around / based on"
-#+ * FModifier|FModifierFunctionGenerator.amplitude -> amplitude: float "Scale factor determining the maximum/minimum values"
-#+ * FModifier|FModifierFunctionGenerator.function_type -> function_type: enum "Type of built-in function to use"
-#+ * FModifier|FModifierFunctionGenerator.phase_multiplier -> phase_multiplier: float "Scale factor determining the speed of the function"
-#+ * FModifier|FModifierFunctionGenerator.phase_offset -> phase_offset: float "Constant factor to offset time by for function"
-#FModifier|FModifierFunctionGenerator.use_additive -> use_additive: boolean "Values generated by this modifier are applied on top of the existing values instead of overwriting them"
-#+ * FModifier|FModifierFunctionGenerator.value_offset -> value_offset: float "Constant factor to offset values by"
-#+ * FModifier|FModifierGenerator.coefficients -> coefficients: float[32] "Coefficients for x (starting from lowest power of x^0)"
-#+ * FModifier|FModifierGenerator.mode -> mode: enum "Type of generator to use"
-#+ * FModifier|FModifierGenerator.poly_order -> poly_order: int "The highest power of x for this polynomial. (number of coefficients - 1)"
-#FModifier|FModifierGenerator.use_additive -> use_additive: boolean "Values generated by this modifier are applied on top of the existing values instead of overwriting them"
-#FModifier|FModifierLimits.max_x -> max_x: float "Highest X value to allow"
-#FModifier|FModifierLimits.max_y -> max_y: float "Highest Y value to allow"
-#FModifier|FModifierLimits.min_x -> min_x: float "Lowest X value to allow"
-#FModifier|FModifierLimits.min_y -> min_y: float "Lowest Y value to allow"
-#FModifier|FModifierLimits.use_max_x -> use_max_x: boolean "Use the maximum X value"
-#FModifier|FModifierLimits.use_max_y -> use_max_y: boolean "Use the maximum Y value"
-#FModifier|FModifierLimits.use_min_x -> use_min_x: boolean "Use the minimum X value"
-#FModifier|FModifierLimits.use_min_y -> use_min_y: boolean "Use the minimum Y value"
-#FModifier|FModifierNoise.blend_type -> blend_type: enum "Method of modifying the existing F-Curve"
-#+ * FModifier|FModifierNoise.depth -> depth: int "Amount of fine level detail present in the noise"
-#+ * FModifier|FModifierNoise.phase -> phase: float "A random seed for the noise effect"
-#FModifier|FModifierNoise.scale -> scale: float "Scaling (in time) of the noise"
-#+ * FModifier|FModifierNoise.strength -> strength: float "Amplitude of the noise - the amount that it modifies the underlying curve"
-#+ * FModifier|FModifierStepped.frame_end -> frame_end: float "Frame that modifiers influence ends (if applicable)"
-#FModifier|FModifierStepped.frame_offset -> frame_offset: float "Reference number of frames before frames get held. Use to get hold for 1-3 vs 5-7 holding patterns"
-#+ * FModifier|FModifierStepped.frame_start -> frame_start: float "Frame that modifiers influence starts (if applicable)"
-#FModifier|FModifierStepped.frame_step -> frame_step: float "Number of frames to hold each value"
-#+ * FModifier|FModifierStepped.use_frame_end -> use_frame_end: boolean "Restrict modifier to only act before its end frame"
-#+ * FModifier|FModifierStepped.use_frame_start -> use_frame_start: boolean "Restrict modifier to only act after its start frame"
-#FieldSettings.apply_to_location -> apply_to_location: boolean "Effect particles location"
-#FieldSettings.apply_to_rotation -> apply_to_rotation: boolean "Effect particles dynamic rotation"
-#FieldSettings.distance_max -> distance_max: float "Maximum distance for the field to work"
-#FieldSettings.distance_min -> distance_min: float "Minimum distance for the fields fall-off"
-#+ * FieldSettings.falloff_power -> falloff_power: float "Falloff power (real gravitational falloff = 2)"
-#+ * FieldSettings.falloff_type -> falloff_type: enum "Fall-off shape"
-#+ * FieldSettings.flow -> flow: float "Convert effector force into air flow velocity"
-#+ * FieldSettings.guide_clump_amount -> guide_clump_amount: float "Amount of clumping"
-#+ * FieldSettings.guide_clump_shape -> guide_clump_shape: float "Shape of clumping"
-#+ * FieldSettings.guide_free -> guide_free: float "Guide-free time from particle lifes end"
-#+ * FieldSettings.guide_kink_amplitude -> guide_kink_amplitude: float "The amplitude of the offset"
-#+ * FieldSettings.guide_kink_axis -> guide_kink_axis: enum "Which axis to use for offset"
-#+ * FieldSettings.guide_kink_frequency -> guide_kink_frequency: float "The frequency of the offset (1/total length)"
-#+ * FieldSettings.guide_kink_shape -> guide_kink_shape: float "Adjust the offset to the beginning/end"
-#+ * FieldSettings.guide_kink_type -> guide_kink_type: enum "Type of periodic offset on the curve"
-#+ * FieldSettings.guide_minimum -> guide_minimum: float "The distance from which particles are affected fully"
-#+ * FieldSettings.harmonic_damping -> harmonic_damping: float "Damping of the harmonic force"
-#+ * FieldSettings.inflow -> inflow: float "Inwards component of the vortex force"
-#+ * FieldSettings.linear_drag -> linear_drag: float "Drag component proportional to velocity"
-#+ * FieldSettings.noise -> noise: float "Noise of the force"
-#+ * FieldSettings.quadratic_drag -> quadratic_drag: float "Drag component proportional to the square of velocity"
-#+ * FieldSettings.radial_falloff -> radial_falloff: float "Radial falloff power (real gravitational falloff = 2)"
-#FieldSettings.radial_max -> radial_max: float "Maximum radial distance for the field to work"
-#FieldSettings.radial_min -> radial_min: float "Minimum radial distance for the fields fall-off"
-#+ * FieldSettings.rest_length -> rest_length: float "Rest length of the harmonic force"
-#+ * FieldSettings.seed -> seed: int "Seed of the noise"
-#+ * FieldSettings.shape -> shape: enum "Which direction is used to calculate the effector force"
-#+ * FieldSettings.size -> size: float "Size of the noise"
-#+ * FieldSettings.strength -> strength: float "Strength of force field"
-#+ * FieldSettings.texture -> texture: pointer "Texture to use as force"
-#+ * FieldSettings.texture_mode -> texture_mode: enum "How the texture effect is calculated (RGB & Curl need a RGB texture else Gradient will be used instead)"
-#+ * FieldSettings.texture_nabla -> texture_nabla: float "Defines size of derivative offset used for calculating gradient and curl"
-#+ * FieldSettings.type -> type: enum "Type of field"
-#FieldSettings.use_2d_force -> use_2d_force: boolean "Apply force only in 2d"
-#FieldSettings.use_absorption -> use_absorption: boolean "Force gets absorbed by collision objects"
-#FieldSettings.use_global_coords -> use_global_coords: boolean "Use effector/global coordinates for turbulence"
-#FieldSettings.use_guide_path_add -> use_guide_path_add: boolean "Based on distance/falloff it adds a portion of the entire path"
-#+ * FieldSettings.use_guide_path_weight -> use_guide_path_weight: boolean "Use curve weights to influence the particle influence along the curve"
-#+ * FieldSettings.use_max_distance -> use_max_distance: boolean "Use a maximum distance for the field to work"
-#+ * FieldSettings.use_min_distance -> use_min_distance: boolean "Use a minimum distance for the fields fall-off"
-#FieldSettings.use_multiple_springs -> use_multiple_springs: boolean "Every point is effected by multiple springs"
-#FieldSettings.use_object_coords -> use_object_coords: boolean "Use object/global coordinates for texture"
-#+ * FieldSettings.use_radial_max -> use_radial_max: boolean "Use a maximum radial distance for the field to work"
-#+ * FieldSettings.use_radial_min -> use_radial_min: boolean "Use a minimum radial distance for the fields fall-off"
-#FieldSettings.use_root_coords -> use_root_coords: boolean "Texture coordinates from root particle locations"
-#+ * FieldSettings.z_direction -> z_direction: enum "Effect in full or only positive/negative Z direction"
-#+ * FileSelectParams.directory -> directory: string "Directory displayed in the file browser"
-#FileSelectParams.display_type -> display_type: enum "Display mode for the file list"
-#FileSelectParams.filename -> filename: string "Active file in the file browser"
-#FileSelectParams.show_hidden -> show_hidden: boolean "Hide hidden dot files"
-#FileSelectParams.sort_method -> sort_method: enum "NO DESCRIPTION"
-#+ * FileSelectParams.title -> title: string, "(read-only) Title for the file browser"
-#FileSelectParams.use_filter -> use_filter: boolean "Enable filtering of files"
-#FileSelectParams.use_filter_blender -> use_filter_blender: boolean "Show .blend files"
-#FileSelectParams.use_filter_folder -> use_filter_folder: boolean "Show folders"
-#FileSelectParams.use_filter_font -> use_filter_font: boolean "Show font files"
-#FileSelectParams.use_filter_image -> use_filter_image: boolean "Show image files"
-#FileSelectParams.use_filter_movie -> use_filter_movie: boolean "Show movie files"
-#FileSelectParams.use_filter_script -> use_filter_script: boolean "Show script files"
-#FileSelectParams.use_filter_sound -> use_filter_sound: boolean "Show sound files"
-#FileSelectParams.use_filter_text -> use_filter_text: boolean "Show text files"
-#+ * FluidSettings.type -> type: enum "Type of participation in the fluid simulation"
-#+ * FluidSettings|ControlFluidSettings.attraction_radius -> attraction_radius: float "Specifies the force field radius around the control object"
-#+ * FluidSettings|ControlFluidSettings.attraction_strength -> attraction_strength: float "Force strength for directional attraction towards the control object"
-#+ * FluidSettings|ControlFluidSettings.end_time -> end_time: float "Specifies time when the control particles are deactivated"
-#+ * FluidSettings|ControlFluidSettings.quality -> quality: float "Specifies the quality which is used for object sampling. (higher = better but slower)"
-#+ * FluidSettings|ControlFluidSettings.start_time -> start_time: float "Specifies time when the control particles are activated"
-#FluidSettings|ControlFluidSettings.use -> use: boolean "Object contributes to the fluid simulation"
-#FluidSettings|ControlFluidSettings.use_reverse_frames -> use_reverse_frames: boolean "Reverse control object movement"
-#+ * FluidSettings|ControlFluidSettings.velocity_radius -> velocity_radius: float "Specifies the force field radius around the control object"
-#+ * FluidSettings|ControlFluidSettings.velocity_strength -> velocity_strength: float "Force strength of how much of the control objects velocity is influencing the fluid velocity"
-#+ * FluidSettings|DomainFluidSettings.compressibility -> compressibility: float "Allowed compressibility due to gravitational force for standing fluid. (directly affects simulation step size)"
-#+ * FluidSettings|DomainFluidSettings.end_time -> end_time: float "Simulation time of the last blender frame (in seconds)"
-#FluidSettings|DomainFluidSettings.filepath -> filepath: string "Directory (and/or filename prefix) to store baked fluid simulation files in"
-#+ * FluidSettings|DomainFluidSettings.generate_particles -> generate_particles: float "Amount of particles to generate (0=off, 1=normal, >1=more)"
-#+ * FluidSettings|DomainFluidSettings.gravity -> gravity: float[3] "Gravity in X, Y and Z direction"
-#+ * FluidSettings|DomainFluidSettings.grid_levels -> grid_levels: int "Number of coarsened grids to use (-1 for automatic)"
-#+ * FluidSettings|DomainFluidSettings.memory_estimate -> memory_estimate: string, "(read-only) Estimated amount of memory needed for baking the domain"
-#+ * FluidSettings|DomainFluidSettings.partial_slip_factor -> partial_slip_factor: float "Amount of mixing between no- and free-slip, 0 is no slip and 1 is free slip"
-#+ * FluidSettings|DomainFluidSettings.preview_resolution -> preview_resolution: int "Preview resolution in X,Y and Z direction"
-#+ * FluidSettings|DomainFluidSettings.render_display_mode -> render_display_mode: enum "How to display the mesh for rendering"
-#+ * FluidSettings|DomainFluidSettings.resolution -> resolution: int "Domain resolution in X,Y and Z direction"
-#FluidSettings|DomainFluidSettings.simulation_scale -> simulation_scale: float "Size of the simulation domain in metres"
-#+ * FluidSettings|DomainFluidSettings.slip_type -> slip_type: enum "NO DESCRIPTION"
-#+ * FluidSettings|DomainFluidSettings.start_time -> start_time: float "Simulation time of the first blender frame (in seconds)"
-#FluidSettings|DomainFluidSettings.surface_smooth -> surface_smooth: float "Amount of surface smoothing. A value of 0 is off, 1 is normal smoothing and more than 1 is extra smoothing"
-#+ * FluidSettings|DomainFluidSettings.surface_subdivisions -> surface_subdivisions: int "Number of isosurface subdivisions. This is necessary for the inclusion of particles into the surface generation. Warning - can lead to longer computation times!"
-#+ * FluidSettings|DomainFluidSettings.tracer_particles -> tracer_particles: int "Number of tracer particles to generate"
-#FluidSettings|DomainFluidSettings.use_reverse_frames -> use_reverse_frames: boolean "Reverse fluid frames"
-#FluidSettings|DomainFluidSettings.use_speed_vectors -> use_speed_vectors: boolean "Generate speed vectors for vector blur"
-#FluidSettings|DomainFluidSettings.use_time_override -> use_time_override: boolean "Use a custom start and end time (in seconds) instead of the scenes timeline"
-#+ * FluidSettings|DomainFluidSettings.viewport_display_mode -> viewport_display_mode: enum "How to display the mesh in the viewport"
-#+ * FluidSettings|DomainFluidSettings.viscosity_base -> viscosity_base: float "Viscosity setting: value that is multiplied by 10 to the power of (exponent*-1)"
-#+ * FluidSettings|DomainFluidSettings.viscosity_exponent -> viscosity_exponent: int "Negative exponent for the viscosity value (to simplify entering small values e.g. 5*10^-6.)"
-#+ * FluidSettings|DomainFluidSettings.viscosity_preset -> viscosity_preset: enum "Set viscosity of the fluid to a preset value, or use manual input"
-#+ * FluidSettings|FluidFluidSettings.initial_velocity -> initial_velocity: float[3] "Initial velocity of fluid"
-#FluidSettings|FluidFluidSettings.use -> use: boolean "Object contributes to the fluid simulation"
-#FluidSettings|FluidFluidSettings.use_animated_mesh -> use_animated_mesh: boolean "Export this mesh as an animated one. Slower, only use if really necessary (e.g. armatures or parented objects), animated pos/rot/scale IPOs do not require it"
-#+ * FluidSettings|FluidFluidSettings.volume_initialization -> volume_initialization: enum "Volume initialization type"
-#+ * FluidSettings|InflowFluidSettings.inflow_velocity -> inflow_velocity: float[3] "Initial velocity of fluid"
-#FluidSettings|InflowFluidSettings.use -> use: boolean "Object contributes to the fluid simulation"
-#FluidSettings|InflowFluidSettings.use_animated_mesh -> use_animated_mesh: boolean "Export this mesh as an animated one. Slower, only use if really necessary (e.g. armatures or parented objects), animated pos/rot/scale IPOs do not require it"
-#FluidSettings|InflowFluidSettings.use_local_coords -> use_local_coords: boolean "Use local coordinates for inflow. (e.g. for rotating objects)"
-#+ * FluidSettings|InflowFluidSettings.volume_initialization -> volume_initialization: enum "Volume initialization type"
-#+ * FluidSettings|ObstacleFluidSettings.impact_factor -> impact_factor: float "This is an unphysical value for moving objects - it controls the impact an obstacle has on the fluid, =0 behaves a bit like outflow (deleting fluid), =1 is default, while >1 results in high forces. Can be used to tweak total mass"
-#+ * FluidSettings|ObstacleFluidSettings.partial_slip_factor -> partial_slip_factor: float "Amount of mixing between no- and free-slip, 0 is no slip and 1 is free slip"
-#+ * FluidSettings|ObstacleFluidSettings.slip_type -> slip_type: enum "NO DESCRIPTION"
-#FluidSettings|ObstacleFluidSettings.use -> use: boolean "Object contributes to the fluid simulation"
-#FluidSettings|ObstacleFluidSettings.use_animated_mesh -> use_animated_mesh: boolean "Export this mesh as an animated one. Slower, only use if really necessary (e.g. armatures or parented objects), animated pos/rot/scale IPOs do not require it"
-#+ * FluidSettings|ObstacleFluidSettings.volume_initialization -> volume_initialization: enum "Volume initialization type"
-#FluidSettings|OutflowFluidSettings.use -> use: boolean "Object contributes to the fluid simulation"
-#FluidSettings|OutflowFluidSettings.use_animated_mesh -> use_animated_mesh: boolean "Export this mesh as an animated one. Slower, only use if really necessary (e.g. armatures or parented objects), animated pos/rot/scale IPOs do not require it"
-#+ * FluidSettings|OutflowFluidSettings.volume_initialization -> volume_initialization: enum "Volume initialization type"
-#+ * FluidSettings|ParticleFluidSettings.alpha_influence -> alpha_influence: float "Amount of particle alpha change, inverse of size influence: 0=off (all same alpha), 1=full. (large particles get lower alphas, smaller ones higher values)"
-#FluidSettings|ParticleFluidSettings.filepath -> filepath: string "Directory (and/or filename prefix) to store and load particles from"
-#+ * FluidSettings|ParticleFluidSettings.particle_influence -> particle_influence: float "Amount of particle size scaling: 0=off (all same size), 1=full (range 0.2-2.0), >1=stronger"
-#FluidSettings|ParticleFluidSettings.show_tracer -> show_tracer: boolean "Show tracer particles"
-#FluidSettings|ParticleFluidSettings.use_drops -> use_drops: boolean "Show drop particles"
-#FluidSettings|ParticleFluidSettings.use_floats -> use_floats: boolean "Show floating foam particles"
-#+ * Function.description -> description: string, "(read-only) Description of the Functions purpose"
-#+ * Function.identifier -> identifier: string, "(read-only) Unique name used in the code and scripting"
-#Function.is_registered -> is_registered: boolean, "(read-only) Function is registered as callback as part of type registration"
-#Function.is_registered_optional -> is_registered_optional: boolean, "(read-only) Function is optionally registered as callback part of type registration"
-#+ * Function.parameters -> parameters: collection, "(read-only) Parameters for the function"
-#Function.use_self -> use_self: boolean, "(read-only) Function does not pass its self as an argument (becomes a class method in python)"
-#+ * GPencilFrame.frame_number -> frame_number: int "The frame on which this sketch appears"
-#GPencilFrame.is_edited -> is_edited: boolean "Frame is being edited (painted on)"
-#+ * GPencilFrame.select -> select: boolean "Frame is selected for editing in the DopeSheet"
-#+ * GPencilFrame.strokes -> strokes: collection, "(read-only) Freehand curves defining the sketch on this frame"
-#+ * GPencilLayer.active -> active: boolean "Set active layer for editing"
-#+ * GPencilLayer.active_frame -> active_frame: pointer, "(read-only) Frame currently being displayed for this layer"
-#GPencilLayer.alpha -> alpha: float "Layer Opacity"
-#+ * GPencilLayer.color -> color: float[3] "Color for all strokes in this layer"
-#+ * GPencilLayer.frames -> frames: collection, "(read-only) Sketches for this layer on different frames"
-#GPencilLayer.ghost_range_max -> ghost_range_max: int "Maximum number of frames on either side of the active frame to show (0 = show the first available sketch on either side)"
-#+ * GPencilLayer.hide -> hide: boolean "Set layer Visibility"
-#+ * GPencilLayer.info -> info: string "Layer name"
-#GPencilLayer.line_width -> line_width: int "Thickness of strokes (in pixels)"
-#+ * GPencilLayer.lock -> lock: boolean "Protect layer from further editing and/or frame changes"
-#GPencilLayer.lock_frame -> lock_frame: boolean "Lock current frame displayed by layer"
-#+ * GPencilLayer.select -> select: boolean "Layer is selected for editing in the DopeSheet"
-#+ * GPencilLayer.show_points -> show_points: boolean "Draw the points which make up the strokes (for debugging purposes)"
-#+ * GPencilLayer.use_onion_skinning -> use_onion_skinning: boolean "Ghost frames on either side of frame"
-#+ * GPencilStroke.points -> points: collection, "(read-only) Stroke data points"
-#+ * GPencilStrokePoint.co -> co: float[3] "NO DESCRIPTION"
-#+ * GPencilStrokePoint.pressure -> pressure: float "Pressure of tablet at point when drawing it"
-#+ * GameObjectSettings.actuators -> actuators: collection, "(read-only) Game engine actuators to act on events"
-#GameObjectSettings.collision_bounds_type -> collision_bounds_type: enum "Selects the collision type"
-#+ * GameObjectSettings.collision_margin -> collision_margin: float "Extra margin around object for collision detection, small amount required for stability"
-#+ * GameObjectSettings.controllers -> controllers: collection, "(read-only) Game engine controllers to process events, connecting sensor to actuators"
-#+ * GameObjectSettings.damping -> damping: float "General movement damping"
-#+ * GameObjectSettings.form_factor -> form_factor: float "Form factor scales the inertia tensor"
-#+ * GameObjectSettings.friction_coefficients -> friction_coefficients: float[3] "Relative friction coefficient in the in the X, Y and Z directions, when anisotropic friction is enabled"
-#GameObjectSettings.lock_location_x -> lock_location_x: boolean "Disable simulation of linear motion along the X axis"
-#GameObjectSettings.lock_location_y -> lock_location_y: boolean "Disable simulation of linear motion along the Y axis"
-#GameObjectSettings.lock_location_z -> lock_location_z: boolean "Disable simulation of linear motion along the Z axis"
-#GameObjectSettings.lock_rotation_x -> lock_rotation_x: boolean "Disable simulation of angular motion along the X axis"
-#GameObjectSettings.lock_rotation_y -> lock_rotation_y: boolean "Disable simulation of angular motion along the Y axis"
-#GameObjectSettings.lock_rotation_z -> lock_rotation_z: boolean "Disable simulation of angular motion along the Z axis"
-#+ * GameObjectSettings.mass -> mass: float "Mass of the object"
-#+ * GameObjectSettings.physics_type -> physics_type: enum "Selects the type of physical representation"
-#+ * GameObjectSettings.properties -> properties: collection, "(read-only) Game engine properties"
-#+ * GameObjectSettings.radius -> radius: float "Radius of bounding sphere and material physics"
-#+ * GameObjectSettings.rotation_damping -> rotation_damping: float "General rotation damping"
-#+ * GameObjectSettings.sensors -> sensors: collection, "(read-only) Game engine sensor to detect events"
-#+ * GameObjectSettings.show_actuators -> show_actuators: boolean "Shows actuators for this object in the user interface"
-#+ * GameObjectSettings.show_controllers -> show_controllers: boolean "Shows controllers for this object in the user interface"
-#GameObjectSettings.show_debug_state -> show_debug_state: boolean "Print state debug info in the game engine"
-#+ * GameObjectSettings.show_sensors -> show_sensors: boolean "Shows sensors for this object in the user interface"
-#+ * GameObjectSettings.show_state_panel -> show_state_panel: boolean "Show state panel"
-#+ * GameObjectSettings.soft_body -> soft_body: pointer, "(read-only) Settings for Bullet soft body simulation"
-#GameObjectSettings.states_initial -> states_initial: boolean[30] "Initial state when the game starts"
-#GameObjectSettings.states_visible -> states_visible: boolean[30] "State determining which controllers are displayed"
-#+ * GameObjectSettings.use_activity_culling -> use_activity_culling: boolean "Disable simulation of angular motion along the Z axis"
-#GameObjectSettings.use_actor -> use_actor: boolean "Object is detected by the Near and Radar sensor"
-#GameObjectSettings.use_all_states -> use_all_states: boolean "Set all state bits"
-#GameObjectSettings.use_anisotropic_friction -> use_anisotropic_friction: boolean "Enable anisotropic friction"
-#+ * GameObjectSettings.use_collision_bounds -> use_collision_bounds: boolean "Specify a collision bounds type other than the default"
-#GameObjectSettings.use_collision_compound -> use_collision_compound: boolean "Add children to form a compound collision object"
-#GameObjectSettings.use_ghost -> use_ghost: boolean "Object does not restitute collisions, like a ghost"
-#GameObjectSettings.use_material_physics -> use_material_physics: boolean "Use physics settings in materials"
-#GameObjectSettings.use_rotate_from_normal -> use_rotate_from_normal: boolean "Use face normal to rotate object, so that it points away from the surface"
-#GameObjectSettings.use_sleep -> use_sleep: boolean "Disable auto (de)activation in physics simulation"
-#GameObjectSettings.used_states -> used_states: boolean[30], "(read-only) States which are being used by controllers"
-#GameObjectSettings.velocity_max -> velocity_max: float "Clamp velocity to this maximum speed"
-#GameObjectSettings.velocity_min -> velocity_min: float "Clamp velocity to this minimum speed (except when totally still)"
-#+ * GameProperty.name -> name: string "Available as GameObject attributes in the game engines python API"
-#GameProperty.show_debug -> show_debug: boolean "Print debug information for this property"
-#+ * GameProperty.type -> type: enum "NO DESCRIPTION"
-#+ * GameProperty|GameBooleanProperty.value -> value: boolean "Property value"
-#+ * GameProperty|GameFloatProperty.value -> value: float "Property value"
-#+ * GameProperty|GameIntProperty.value -> value: int "Property value"
-#+ * GameProperty|GameStringProperty.value -> value: string "Property value"
-#+ * GameProperty|GameTimerProperty.value -> value: float "Property value"
-#+ * GameSoftBodySettings.cluster_iterations -> cluster_iterations: int "Specify the number of cluster iterations"
-#GameSoftBodySettings.collision_margin -> collision_margin: float "Collision margin for soft body. Small value makes the algorithm unstable"
-#+ * GameSoftBodySettings.dynamic_friction -> dynamic_friction: float "Dynamic Friction"
-#GameSoftBodySettings.linear_stiffness -> linear_stiffness: float "Linear stiffness of the soft body links"
-#GameSoftBodySettings.location_iterations -> location_iterations: int "Position solver iterations"
-#GameSoftBodySettings.shape_threshold -> shape_threshold: float "Shape matching threshold"
-#GameSoftBodySettings.use_bending_constraints -> use_bending_constraints: boolean "Enable bending constraints"
-#GameSoftBodySettings.use_cluster_rigid_to_softbody -> use_cluster_rigid_to_softbody: boolean "Enable cluster collision between soft and rigid body"
-#GameSoftBodySettings.use_cluster_soft_to_softbody -> use_cluster_soft_to_softbody: boolean "Enable cluster collision between soft and soft body"
-#GameSoftBodySettings.use_shape_match -> use_shape_match: boolean "Enable soft body shape matching goal"
-#GameSoftBodySettings.weld_threshold -> weld_threshold: float "Welding threshold: distance between nearby vertices to be considered equal => set to 0.0 to disable welding test and speed up scene loading (ok if the mesh has no duplicates)"
-#+ * Header.bl_idname -> bl_idname: string "If this is set, the header gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is OBJECT_HT_hello, and bl_idname is not set by the script, then bl_idname = OBJECT_HT_hello"
-#+ * Header.bl_space_type -> bl_space_type: enum "The space where the header is going to be used in."
-#+ * Header.layout -> layout: pointer, "(read-only) Defines the structure of the header in the UI."
-#+ * Histogram.mode -> mode: enum "Channels to display when drawing the histogram"
-#+ * ID.library -> library: pointer, "(read-only) Library file the datablock is linked from"
-#+ * ID.name -> name: string "Unique datablock ID name"
-#+ * ID.tag -> tag: boolean "Tools can use this to tag data, (initial state is undefined)"
-#ID.use_fake_user -> use_fake_user: boolean "Saves this datablock even if it has no users"
-#+ * ID.users -> users: int, "(read-only) Number of times this datablock is referenced"
-#+ * IDProperty.collection -> collection: collection, "(read-only)"
-#+ * IDProperty.double -> double: float "NO DESCRIPTION"
-#+ * IDProperty.double_array -> double_array: float[1] "NO DESCRIPTION"
-#+ * IDProperty.float -> float: float "NO DESCRIPTION"
-#+ * IDProperty.float_array -> float_array: float[1] "NO DESCRIPTION"
-#+ * IDProperty.group -> group: pointer, "(read-only)"
-#+ * IDProperty.int -> int: int "NO DESCRIPTION"
-#+ * IDProperty.int_array -> int_array: int[1] "NO DESCRIPTION"
-#+ * IDProperty.string -> string: string "NO DESCRIPTION"
-#+ * IDPropertyGroup.name -> name: string "Unique name used in the code and scripting"
-#+ * IDPropertyGroup|NetRenderJob.name -> name: string "NO DESCRIPTION"
-#+ * IDPropertyGroup|NetRenderSettings.active_blacklisted_slave_index -> active_blacklisted_slave_index: int "NO DESCRIPTION"
-#+ * IDPropertyGroup|NetRenderSettings.active_job_index -> active_job_index: int "NO DESCRIPTION"
-#+ * IDPropertyGroup|NetRenderSettings.active_slave_index -> active_slave_index: int "NO DESCRIPTION"
-#+ * IDPropertyGroup|NetRenderSettings.chunks -> chunks: int "Number of frame to dispatch to each slave in one chunk"
-#+ * IDPropertyGroup|NetRenderSettings.job_category -> job_category: string "Category of the job"
-#+ * IDPropertyGroup|NetRenderSettings.job_id -> job_id: string "id of the last sent render job"
-#+ * IDPropertyGroup|NetRenderSettings.job_name -> job_name: string "Name of the job"
-#+ * IDPropertyGroup|NetRenderSettings.jobs -> jobs: collection, "(read-only)"
-#+ * IDPropertyGroup|NetRenderSettings.mode -> mode: enum "Mode of operation of this instance"
-#+ * IDPropertyGroup|NetRenderSettings.path -> path: string "Path for temporary files"
-#+ * IDPropertyGroup|NetRenderSettings.priority -> priority: int "Priority of the job"
-#+ * IDPropertyGroup|NetRenderSettings.server_address -> server_address: string "IP or name of the master render server"
-#+ * IDPropertyGroup|NetRenderSettings.server_port -> server_port: int "port of the master render server"
-#+ * IDPropertyGroup|NetRenderSettings.slaves -> slaves: collection, "(read-only)"
-#+ * IDPropertyGroup|NetRenderSettings.slaves_blacklist -> slaves_blacklist: collection, "(read-only)"
-#IDPropertyGroup|NetRenderSettings.use_master_broadcast -> use_master_broadcast: boolean "broadcast master server address on local network"
-#IDPropertyGroup|NetRenderSettings.use_master_clear -> use_master_clear: boolean "delete saved files on exit"
-#IDPropertyGroup|NetRenderSettings.use_slave_clear -> use_slave_clear: boolean "delete downloaded files on exit"
-#IDPropertyGroup|NetRenderSettings.use_slave_output_log -> use_slave_output_log: boolean "Output render text log to console as well as sending it to the master"
-#IDPropertyGroup|NetRenderSettings.use_slave_thumb -> use_slave_thumb: boolean "Generate thumbnails on slaves instead of master"
-#+ * IDPropertyGroup|NetRenderSlave.name -> name: string "NO DESCRIPTION"
-#+ * IDPropertyGroup|OperatorFileListElement.name -> name: string "the name of a file or directory within a file list"
-#+ * IDPropertyGroup|OperatorMousePath.loc -> loc: float[2] "Mouse location"
-#+ * IDPropertyGroup|OperatorMousePath.time -> time: float "Time of mouse location"
-#+ * IDPropertyGroup|OperatorStrokeElement.location -> location: float[3] "NO DESCRIPTION"
-#+ * IDPropertyGroup|OperatorStrokeElement.mouse -> mouse: float[2] "NO DESCRIPTION"
-#+ * IDPropertyGroup|OperatorStrokeElement.pen_flip -> pen_flip: boolean "NO DESCRIPTION"
-#+ * IDPropertyGroup|OperatorStrokeElement.pressure -> pressure: float "Tablet pressure"
-#+ * IDPropertyGroup|OperatorStrokeElement.time -> time: float "NO DESCRIPTION"
-#+ * IDPropertyGroup|PoseTemplate.name -> name: string "NO DESCRIPTION"
-#+ * IDPropertyGroup|PoseTemplateSettings.active_template_index -> active_template_index: int "NO DESCRIPTION"
-#+ * IDPropertyGroup|PoseTemplateSettings.templates -> templates: collection, "(read-only)"
-#IDPropertyGroup|PoseTemplateSettings.use_generate_deform_rig -> use_generate_deform_rig: boolean "Create a copy of the metarig, constrainted by the generated rig"
-#+ * ID|Action.fcurves -> fcurves: collection, "(read-only) The individual F-Curves that make up the Action"
-#+ * ID|Action.groups -> groups: collection, "(read-only) Convenient groupings of F-Curves"
-#+ * ID|Action.pose_markers -> pose_markers: collection, "(read-only) Markers specific to this Action, for labeling poses"
-#+ * ID|Armature.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
-#+ * ID|Armature.bones -> bones: collection, "(read-only)"
-#ID|Armature.draw_type -> draw_type: enum "NO DESCRIPTION"
-#+ * ID|Armature.edit_bones -> edit_bones: collection, "(read-only)"
-#+ * ID|Armature.ghost_frame_end -> ghost_frame_end: int "End frame of range of Ghosts to display (not for Around Current Frame Onion-skinning method)"
-#+ * ID|Armature.ghost_frame_start -> ghost_frame_start: int "Starting frame of range of Ghosts to display (not for Around Current Frame Onion-skinning method)"
-#+ * ID|Armature.ghost_size -> ghost_size: int "Frame step for Ghosts (not for On Keyframes Onion-skinning method)"
-#+ * ID|Armature.ghost_step -> ghost_step: int "Number of frame steps on either side of current frame to show as ghosts (only for Around Current Frame Onion-skinning method)"
-#+ * ID|Armature.ghost_type -> ghost_type: enum "Method of Onion-skinning for active Action"
-#ID|Armature.layers -> layers: boolean[32] "Armature layer visibility"
-#ID|Armature.layers_protected -> layers_protected: boolean[32] "Protected layers in Proxy Instances are restored to Proxy settings on file reload and undo"
-#+ * ID|Armature.pose_position -> pose_position: enum "Show armature in binding pose or final posed state"
-#ID|Armature.show_axes -> show_axes: boolean "Draw bone axes"
-#ID|Armature.show_bone_custom_shapes -> show_bone_custom_shapes: boolean "Draw bones with their custom shapes"
-#ID|Armature.show_group_colors -> show_group_colors: boolean "Draw bone group colors"
-#ID|Armature.show_names -> show_names: boolean "Draw bone names"
-#ID|Armature.show_only_ghost_selected -> show_only_ghost_selected: boolean "NO DESCRIPTION"
-#ID|Armature.use_auto_ik -> use_auto_ik: boolean "Add temporaral IK constraints while grabbing bones in Pose Mode"
-#ID|Armature.use_deform_delay -> use_deform_delay: boolean "Dont deform children when manipulating bones in Pose Mode"
-#ID|Armature.use_deform_envelopes -> use_deform_envelopes: boolean "Enable Bone Envelopes when defining deform"
-#ID|Armature.use_deform_preserve_volume -> use_deform_preserve_volume: boolean "Enable deform rotation with Quaternions"
-#ID|Armature.use_deform_vertex_groups -> use_deform_vertex_groups: boolean "Enable Vertex Groups when defining deform"
-#ID|Armature.use_mirror_x -> use_mirror_x: boolean "Apply changes to matching bone on opposite side of X-Axis"
-#ID|Brush.auto_smooth_factor -> auto_smooth_factor: float "Amount of smoothing to automatically apply to each stroke"
-#+ * ID|Brush.blend -> blend: enum "Brush blending mode"
-#+ * ID|Brush.clone_alpha -> clone_alpha: float "Opacity of clone image display"
-#+ * ID|Brush.clone_image -> clone_image: pointer "Image for clone tool"
-#+ * ID|Brush.clone_offset -> clone_offset: float[2] "NO DESCRIPTION"
-#+ * ID|Brush.color -> color: float[3] "NO DESCRIPTION"
-#+ * ID|Brush.crease_pinch_factor -> crease_pinch_factor: float "How much the crease brush pinches"
-#ID|Brush.cursor_color_add -> cursor_color_add: float[3] "Color of cursor when adding"
-#ID|Brush.cursor_color_subtract -> cursor_color_subtract: float[3] "Color of cursor when subtracting"
-#+ * ID|Brush.curve -> curve: pointer, "(read-only) Editable falloff curve"
-#+ * ID|Brush.direction -> direction: enum "NO DESCRIPTION"
-#+ * ID|Brush.icon_filepath -> icon_filepath: string "File path to brush icon"
-#+ * ID|Brush.imagepaint_tool -> imagepaint_tool: enum "NO DESCRIPTION"
-#+ * ID|Brush.jitter -> jitter: float "Jitter the position of the brush while painting"
-#+ * ID|Brush.normal_weight -> normal_weight: float "How much grab will pull vertexes out of surface during a grab"
-#+ * ID|Brush.plane_offset -> plane_offset: float "Adjusts plane on which the brush acts towards or away from the object surface"
-#+ * ID|Brush.plane_trim -> plane_trim: float "If a vertex is further from offset plane than this then it is not affected"
-#+ * ID|Brush.rate -> rate: float "Interval between paints for Airbrush"
-#+ * ID|Brush.sculpt_plane -> sculpt_plane: enum "NO DESCRIPTION"
-#+ * ID|Brush.sculpt_tool -> sculpt_tool: enum "NO DESCRIPTION"
-#+ * ID|Brush.size -> size: int "Radius of the brush in pixels"
-#+ * ID|Brush.smooth_stroke_factor -> smooth_stroke_factor: float "Higher values give a smoother stroke"
-#+ * ID|Brush.smooth_stroke_radius -> smooth_stroke_radius: int "Minimum distance from last point before stroke continues"
-#ID|Brush.spacing -> spacing: int "Spacing between brush daubs as a percentage of brush diameter"
-#+ * ID|Brush.strength -> strength: float "How powerful the effect of the brush is when applied"
-#+ * ID|Brush.stroke_method -> stroke_method: enum "NO DESCRIPTION"
-#+ * ID|Brush.texture -> texture: pointer "NO DESCRIPTION"
-#ID|Brush.texture_angle_source_no_random -> texture_angle_source_no_random: enum "NO DESCRIPTION"
-#ID|Brush.texture_angle_source_random -> texture_angle_source_random: enum "NO DESCRIPTION"
-#+ * ID|Brush.texture_overlay_alpha -> texture_overlay_alpha: int "NO DESCRIPTION"
-#+ * ID|Brush.texture_sample_bias -> texture_sample_bias: float "Value added to texture samples"
-#+ * ID|Brush.texture_slot -> texture_slot: pointer, "(read-only)"
-#+ * ID|Brush.unprojected_radius -> unprojected_radius: float "Radius of brush in Blender units"
-#+ * ID|Brush.use_accumulate -> use_accumulate: boolean "Accumulate stroke dabs on top of each other"
-#+ * ID|Brush.use_adaptive_space -> use_adaptive_space: boolean "Space daubs according to surface orientation instead of screen space"
-#+ * ID|Brush.use_airbrush -> use_airbrush: boolean "Keep applying paint effect while holding mouse (spray)"
-#+ * ID|Brush.use_alpha -> use_alpha: boolean "When this is disabled, lock alpha while painting"
-#+ * ID|Brush.use_anchor -> use_anchor: boolean "Keep the brush anchored to the initial location"
-#+ * ID|Brush.use_custom_icon -> use_custom_icon: boolean "Set the brush icon from an image file"
-#ID|Brush.use_edge_to_edge -> use_edge_to_edge: boolean "Drag anchor brush from edge-to-edge"
-#+ * ID|Brush.use_frontface -> use_frontface: boolean "Brush only affects vertexes that face the viewer"
-#+ * ID|Brush.use_inverse_smooth_pressure -> use_inverse_smooth_pressure: boolean "Lighter pressure causes more smoothing to be applied"
-#+ * ID|Brush.use_locked_size -> use_locked_size: boolean "When locked brush stays same size relative to object; when unlocked brush size is given in pixels"
-#+ * ID|Brush.use_offset_pressure -> use_offset_pressure: boolean "Enable tablet pressure sensitivity for offset"
-#+ * ID|Brush.use_original_normal -> use_original_normal: boolean "When locked keep using normal of surface where stroke was initiated"
-#+ * ID|Brush.use_paint_sculpt -> use_paint_sculpt: boolean "Use this brush in sculpt mode"
-#+ * ID|Brush.use_paint_texture -> use_paint_texture: boolean "Use this brush in texture paint mode"
-#+ * ID|Brush.use_paint_vertex -> use_paint_vertex: boolean "Use this brush in vertex paint mode"
-#+ * ID|Brush.use_paint_weight -> use_paint_weight: boolean "Use this brush in weight paint mode"
-#+ * ID|Brush.use_persistent -> use_persistent: boolean "Sculpts on a persistent layer of the mesh"
-#+ * ID|Brush.use_plane_trim -> use_plane_trim: boolean "Enable Plane Trim"
-#ID|Brush.use_pressure_jitter -> use_pressure_jitter: boolean "Enable tablet pressure sensitivity for jitter"
-#ID|Brush.use_pressure_size -> use_pressure_size: boolean "Enable tablet pressure sensitivity for size"
-#ID|Brush.use_pressure_spacing -> use_pressure_spacing: boolean "Enable tablet pressure sensitivity for spacing"
-#ID|Brush.use_pressure_strength -> use_pressure_strength: boolean "Enable tablet pressure sensitivity for strength"
-#+ * ID|Brush.use_rake -> use_rake: boolean "Rotate the brush texture to match the stroke direction"
-#+ * ID|Brush.use_random_rotation -> use_random_rotation: boolean "Rotate the brush texture at random"
-#ID|Brush.use_restore_mesh -> use_restore_mesh: boolean "Allows a single dot to be carefully positioned"
-#+ * ID|Brush.use_smooth_stroke -> use_smooth_stroke: boolean "Brush lags behind mouse and follows a smoother path"
-#+ * ID|Brush.use_space -> use_space: boolean "Limit brush application to the distance specified by spacing"
-#+ * ID|Brush.use_space_atten -> use_space_atten: boolean "Automatically adjusts strength to give consistent results for different spacings"
-#+ * ID|Brush.use_texture_overlay -> use_texture_overlay: boolean "Show texture in viewport"
-#+ * ID|Brush.use_wrap -> use_wrap: boolean "Enable torus wrapping while painting"
-#+ * ID|Brush.vertexpaint_tool -> vertexpaint_tool: enum "NO DESCRIPTION"
-#+ * ID|Camera.angle -> angle: float "Perspective Camera lens field of view in degrees"
-#+ * ID|Camera.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
-#+ * ID|Camera.clip_end -> clip_end: float "Camera far clipping distance"
-#+ * ID|Camera.clip_start -> clip_start: float "Camera near clipping distance"
-#+ * ID|Camera.dof_distance -> dof_distance: float "Distance to the focus point for depth of field"
-#+ * ID|Camera.dof_object -> dof_object: pointer "Use this object to define the depth of field focal point"
-#+ * ID|Camera.draw_size -> draw_size: float "Apparent size of the Camera object in the 3D View"
-#+ * ID|Camera.lens -> lens: float "Perspective Camera lens value in millimeters"
-#+ * ID|Camera.lens_unit -> lens_unit: enum "Unit to edit lens in for the user interface"
-#+ * ID|Camera.ortho_scale -> ortho_scale: float "Orthographic Camera scale (similar to zoom)"
-#+ * ID|Camera.passepartout_alpha -> passepartout_alpha: float "Opacity (alpha) of the darkened overlay in Camera view"
-#+ * ID|Camera.shift_x -> shift_x: float "Perspective Camera horizontal shift"
-#+ * ID|Camera.shift_y -> shift_y: float "Perspective Camera vertical shift"
-#+ * ID|Camera.show_limits -> show_limits: boolean "Draw the clipping range and focus point on the camera"
-#+ * ID|Camera.show_mist -> show_mist: boolean "Draw a line from the Camera to indicate the mist area"
-#+ * ID|Camera.show_name -> show_name: boolean "Show the active Cameras name in Camera view"
-#+ * ID|Camera.show_passepartout -> show_passepartout: boolean "Show a darkened overlay outside the image area in Camera view"
-#+ * ID|Camera.show_title_safe -> show_title_safe: boolean "Show indicators for the title safe zone in Camera view"
-#+ * ID|Camera.type -> type: enum "Camera types"
-#ID|Camera.use_panorama -> use_panorama: boolean "Render the scene with a cylindrical camera for pseudo-fisheye lens effects"
-#+ * ID|Curve.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
-#+ * ID|Curve.bevel_depth -> bevel_depth: float "Bevel depth when not using a bevel object"
-#+ * ID|Curve.bevel_object -> bevel_object: pointer "Curve object name that defines the bevel shape"
-#+ * ID|Curve.bevel_resolution -> bevel_resolution: int "Bevel resolution when depth is non-zero and no specific bevel object has been defined"
-#+ * ID|Curve.dimensions -> dimensions: enum "Select 2D or 3D curve type"
-#+ * ID|Curve.eval_time -> eval_time: float "Parametric position along the length of the curve that Objects following it should be at. Position is evaluated by dividing by the Path Length value"
-#+ * ID|Curve.extrude -> extrude: float "Amount of curve extrusion when not using a bevel object"
-#+ * ID|Curve.materials -> materials: collection, "(read-only)"
-#ID|Curve.offset -> offset: float "Scale the original width (1.0) based on given factor"
-#ID|Curve.path_duration -> path_duration: int "The number of frames that are needed to traverse the path, defining the maximum value for the Evaluation Time setting"
-#+ * ID|Curve.render_resolution_u -> render_resolution_u: int "Surface resolution in U direction used while rendering. Zero skips this property"
-#+ * ID|Curve.render_resolution_v -> render_resolution_v: int "Surface resolution in V direction used while rendering. Zero skips this property"
-#+ * ID|Curve.resolution_u -> resolution_u: int "Surface resolution in U direction"
-#+ * ID|Curve.resolution_v -> resolution_v: int "Surface resolution in V direction"
-#+ * ID|Curve.shape_keys -> shape_keys: pointer, "(read-only)"
-#ID|Curve.show_handles -> show_handles: boolean "Display bezier handles in editmode"
-#ID|Curve.show_normal_face -> show_normal_face: boolean "Display 3D curve normals in editmode"
-#+ * ID|Curve.splines -> splines: collection, "(read-only) Collection of splines in this curve data object"
-#+ * ID|Curve.taper_object -> taper_object: pointer "Curve object name that defines the taper (width)"
-#ID|Curve.texspace_location -> texspace_location: float[3] "Texture space location"
-#+ * ID|Curve.texspace_size -> texspace_size: float[3] "Texture space size"
-#+ * ID|Curve.twist_mode -> twist_mode: enum "The type of tilt calculation for 3D Curves"
-#+ * ID|Curve.twist_smooth -> twist_smooth: float "Smoothing iteration for tangents"
-#ID|Curve.use_auto_texspace -> use_auto_texspace: boolean "Adjusts active objects texture space automatically when transforming object"
-#+ * ID|Curve.use_deform_bounds -> use_deform_bounds: boolean "Use the mesh bounds to clamp the deformation"
-#ID|Curve.use_fill_back -> use_fill_back: boolean "Draw filled back for extruded/beveled curves"
-#ID|Curve.use_fill_deform -> use_fill_deform: boolean "Fill curve after applying deformation"
-#ID|Curve.use_fill_front -> use_fill_front: boolean "Draw filled front for extruded/beveled curves"
-#ID|Curve.use_map_on_length -> use_map_on_length: boolean "Generate texture mapping coordinates following the curve direction, rather than the local bounding box"
-#+ * ID|Curve.use_path -> use_path: boolean "Enable the curve to become a translation path"
-#+ * ID|Curve.use_path_follow -> use_path_follow: boolean "Make curve path children to rotate along the path"
-#+ * ID|Curve.use_radius -> use_radius: boolean "Option for paths: apply the curve radius with path following it and deforming"
-#+ * ID|Curve.use_stretch -> use_stretch: boolean "Option for curve-deform: makes deformed child to stretch along entire path"
-#+ * ID|Curve.use_time_offset -> use_time_offset: boolean "Children will use TimeOffs value as path distance offset"
-#ID|Curve|SurfaceCurve.use_map_on_length -> use_map_on_length: boolean "Generate texture mapping coordinates following the curve direction, rather than the local bounding box"
-#MAKE COLLECTION ATTR * ID|Curve|TextCurve.active_textbox -> active_textbox: int "NO DESCRIPTION"
-#ID|Curve|TextCurve.align -> align: enum "Text align from the object center"
-#+ * ID|Curve|TextCurve.body -> body: string "contents of this text object"
-#+ * ID|Curve|TextCurve.body_format -> body_format: collection, "(read-only) Stores the style of each character"
-#+ * ID|Curve|TextCurve.edit_format -> edit_format: pointer, "(read-only) Editing settings character formatting"
-#+ * ID|Curve|TextCurve.family -> family: string "Use Blender Objects as font characters. Give font objects a common name followed by the character it represents, eg. familya, familyb etc, and turn on Verts Duplication"
-#ID|Curve|TextCurve.follow_curve -> follow_curve: pointer "Curve deforming text object"
-#+ * ID|Curve|TextCurve.font -> font: pointer "NO DESCRIPTION"
-#+ * ID|Curve|TextCurve.offset_x -> offset_x: float "Horizontal offset from the object origin"
-#+ * ID|Curve|TextCurve.offset_y -> offset_y: float "Vertical offset from the object origin"
-#+ * ID|Curve|TextCurve.shear -> shear: float "Italic angle of the characters"
-#ID|Curve|TextCurve.size -> size: float "NO DESCRIPTION"
-#+ * ID|Curve|TextCurve.small_caps_scale -> small_caps_scale: float "Scale of small capitals"
-#ID|Curve|TextCurve.space_character -> space_character: float "NO DESCRIPTION"
-#ID|Curve|TextCurve.space_line -> space_line: float "NO DESCRIPTION"
-#ID|Curve|TextCurve.space_word -> space_word: float "NO DESCRIPTION"
-#ID|Curve|TextCurve.text_boxes -> text_boxes: collection, "(read-only)"
-#ID|Curve|TextCurve.underline_height -> underline_height: float "NO DESCRIPTION"
-#ID|Curve|TextCurve.underline_position -> underline_position: float "Vertical position of underline"
-#ID|Curve|TextCurve.use_fast_edit -> use_fast_edit: boolean "Dont fill polygons while editing"
-#ID|Curve|TextCurve.use_map_on_length -> use_map_on_length: boolean "Generate texture mapping coordinates following the curve direction, rather than the local bounding box"
-#+ * ID|GreasePencil.draw_mode -> draw_mode: enum "NO DESCRIPTION"
-#+ * ID|GreasePencil.layers -> layers: collection, "(read-only)"
-#+ * ID|GreasePencil.use_stroke_endpoints -> use_stroke_endpoints: boolean "Only use the first and last parts of the stroke for snapping"
-#+ * ID|Group.dupli_offset -> dupli_offset: float[3] "Offset from the origin to use when instancing as DupliGroup"
-#ID|Group.layers -> layers: boolean[20] "Layers visible when this groups is instanced as a dupli"
-#+ * ID|Group.objects -> objects: collection, "(read-only) A collection of this groups objects"
-#+ * ID|Image.bindcode -> bindcode: int, "(read-only) OpenGL bindcode"
-#+ * ID|Image.depth -> depth: int, "(read-only) Image bit depth"
-#+ * ID|Image.display_aspect -> display_aspect: float[2] "Display Aspect for this image, does not affect rendering"
-#+ * ID|Image.field_order -> field_order: enum "Order of video fields. Select which lines are displayed first"
-#+ * ID|Image.file_format -> file_format: enum "Format used for re-saving this file"
-#+ * ID|Image.filepath -> filepath: string "Image/Movie file name"
-#+ * ID|Image.filepath_raw -> filepath_raw: string "Image/Movie file name (without data refreshing)"
-#ID|Image.fps -> fps: int "Speed of the animation in frames per second"
-#ID|Image.frame_end -> frame_end: int "End frame of an animated texture"
-#ID|Image.frame_start -> frame_start: int "Start frame of an animated texture"
-#+ * ID|Image.generated_height -> generated_height: int "Generated image height"
-#+ * ID|Image.generated_type -> generated_type: enum "Generated image type"
-#+ * ID|Image.generated_width -> generated_width: int "Generated image width"
-#+ * ID|Image.has_data -> has_data: boolean, "(read-only) True if this image has data"
-#ID|Image.is_dirty -> is_dirty: boolean, "(read-only) Image has changed and is not saved"
-#+ * ID|Image.mapping -> mapping: enum "Mapping type to use for this image in the game engine"
-#+ * ID|Image.packed_file -> packed_file: pointer, "(read-only)"
-#+ * ID|Image.size -> size: int[2], "(read-only) Width and height in pixels, zero when image data cant be loaded"
-#+ * ID|Image.source -> source: enum "Where the image comes from"
-#+ * ID|Image.tiles_x -> tiles_x: int "Degree of repetition in the X direction"
-#+ * ID|Image.tiles_y -> tiles_y: int "Degree of repetition in the Y direction"
-#+ * ID|Image.type -> type: enum, "(read-only) How to generate the image"
-#ID|Image.use_animation -> use_animation: boolean "Use as animated texture in the game engine"
-#ID|Image.use_clamp_x -> use_clamp_x: boolean "Disable texture repeating horizontally"
-#ID|Image.use_clamp_y -> use_clamp_y: boolean "Disable texture repeating vertically"
-#ID|Image.use_fields -> use_fields: boolean "Use fields of the image"
-#ID|Image.use_premultiply -> use_premultiply: boolean "Convert RGB from key alpha to premultiplied alpha"
-#ID|Image.use_tiles -> use_tiles: boolean "Use of tilemode for faces (default shift-LMB to pick the tile for selected faces)"
-#+ * ID|Key.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
-#+ * ID|Key.keys -> keys: collection, "(read-only) Shape keys"
-#+ * ID|Key.reference_key -> reference_key: pointer, "(read-only)"
-#+ * ID|Key.slurph -> slurph: int "Creates a delay in amount of frames in applying keypositions, first vertex goes first"
-#ID|Key.use_relative -> use_relative: boolean "Makes shape keys relative"
-#+ * ID|Key.user -> user: pointer, "(read-only) Datablock using these shape keys"
-#+ * ID|Lamp.active_texture -> active_texture: pointer "Active texture slot being displayed"
-#+ * ID|Lamp.active_texture_index -> active_texture_index: int "Index of active texture slot"
-#+ * ID|Lamp.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
-#+ * ID|Lamp.color -> color: float[3] "Light color"
-#+ * ID|Lamp.distance -> distance: float "Falloff distance - the light is at half the original intensity at this point"
-#+ * ID|Lamp.energy -> energy: float "Amount of light that the lamp emits"
-#+ * ID|Lamp.texture_slots -> texture_slots: collection, "(read-only) Texture slots defining the mapping and influence of textures"
-#+ * ID|Lamp.type -> type: enum "Type of Lamp"
-#ID|Lamp.use_diffuse -> use_diffuse: boolean "Lamp does diffuse shading"
-#ID|Lamp.use_negative -> use_negative: boolean "Lamp casts negative light"
-#ID|Lamp.use_own_layer -> use_own_layer: boolean "Illuminates objects only on the same layer the lamp is on"
-#ID|Lamp.use_specular -> use_specular: boolean "Lamp creates specular highlights"
-#+ * ID|Lamp|AreaLamp.gamma -> gamma: float "Light gamma correction value"
-#+ * ID|Lamp|AreaLamp.shadow_adaptive_threshold -> shadow_adaptive_threshold: float "Threshold for Adaptive Sampling (Raytraced shadows)"
-#+ * ID|Lamp|AreaLamp.shadow_color -> shadow_color: float[3] "Color of shadows cast by the lamp"
-#+ * ID|Lamp|AreaLamp.shadow_method -> shadow_method: enum "Method to compute lamp shadow with"
-#ID|Lamp|AreaLamp.shadow_ray_sample_method -> shadow_ray_sample_method: enum "Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower"
-#+ * ID|Lamp|AreaLamp.shadow_ray_samples_x -> shadow_ray_samples_x: int "Amount of samples taken extra (samples x samples)"
-#+ * ID|Lamp|AreaLamp.shadow_ray_samples_y -> shadow_ray_samples_y: int "Amount of samples taken extra (samples x samples)"
-#+ * ID|Lamp|AreaLamp.shadow_soft_size -> shadow_soft_size: float "Light size for ray shadow sampling (Raytraced shadows)"
-#+ * ID|Lamp|AreaLamp.shape -> shape: enum "Shape of the area lamp"
-#+ * ID|Lamp|AreaLamp.size -> size: float "Size of the area of the area Lamp, X direction size for Rectangle shapes"
-#+ * ID|Lamp|AreaLamp.size_y -> size_y: float "Size of the area of the area Lamp in the Y direction for Rectangle shapes"
-#ID|Lamp|AreaLamp.use_dither -> use_dither: boolean "Use 2x2 dithering for sampling (Constant Jittered sampling)"
-#ID|Lamp|AreaLamp.use_jitter -> use_jitter: boolean "Use noise for sampling (Constant Jittered sampling)"
-#ID|Lamp|AreaLamp.use_only_shadow -> use_only_shadow: boolean "Causes light to cast shadows only without illuminating objects"
-#ID|Lamp|AreaLamp.use_shadow_layer -> use_shadow_layer: boolean "Causes only objects on the same layer to cast shadows"
-#ID|Lamp|AreaLamp.use_umbra -> use_umbra: boolean "Emphasize parts that are fully shadowed (Constant Jittered sampling)"
-#+ * ID|Lamp|PointLamp.falloff_curve -> falloff_curve: pointer, "(read-only) Custom Lamp Falloff Curve"
-#+ * ID|Lamp|PointLamp.falloff_type -> falloff_type: enum "Intensity Decay with distance"
-#+ * ID|Lamp|PointLamp.linear_attenuation -> linear_attenuation: float "Linear distance attenuation"
-#+ * ID|Lamp|PointLamp.quadratic_attenuation -> quadratic_attenuation: float "Quadratic distance attenuation"
-#+ * ID|Lamp|PointLamp.shadow_adaptive_threshold -> shadow_adaptive_threshold: float "Threshold for Adaptive Sampling (Raytraced shadows)"
-#+ * ID|Lamp|PointLamp.shadow_color -> shadow_color: float[3] "Color of shadows cast by the lamp"
-#+ * ID|Lamp|PointLamp.shadow_method -> shadow_method: enum "Method to compute lamp shadow with"
-#ID|Lamp|PointLamp.shadow_ray_sample_method -> shadow_ray_sample_method: enum "Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower"
-#+ * ID|Lamp|PointLamp.shadow_ray_samples -> shadow_ray_samples: int "Amount of samples taken extra (samples x samples)"
-#+ * ID|Lamp|PointLamp.shadow_soft_size -> shadow_soft_size: float "Light size for ray shadow sampling (Raytraced shadows)"
-#ID|Lamp|PointLamp.use_only_shadow -> use_only_shadow: boolean "Causes light to cast shadows only without illuminating objects"
-#ID|Lamp|PointLamp.use_shadow_layer -> use_shadow_layer: boolean "Causes only objects on the same layer to cast shadows"
-#ID|Lamp|PointLamp.use_sphere -> use_sphere: boolean "Sets light intensity to zero beyond lamp distance"
-#+ * ID|Lamp|SpotLamp.compression_threshold -> compression_threshold: float "Deep shadow map compression threshold"
-#+ * ID|Lamp|SpotLamp.falloff_curve -> falloff_curve: pointer, "(read-only) Custom Lamp Falloff Curve"
-#+ * ID|Lamp|SpotLamp.falloff_type -> falloff_type: enum "Intensity Decay with distance"
-#+ * ID|Lamp|SpotLamp.halo_intensity -> halo_intensity: float "Brightness of the spotlights halo cone (Buffer Shadows)"
-#+ * ID|Lamp|SpotLamp.halo_step -> halo_step: int "Volumetric halo sampling frequency"
-#+ * ID|Lamp|SpotLamp.linear_attenuation -> linear_attenuation: float "Linear distance attenuation"
-#+ * ID|Lamp|SpotLamp.quadratic_attenuation -> quadratic_attenuation: float "Quadratic distance attenuation"
-#+ * ID|Lamp|SpotLamp.shadow_adaptive_threshold -> shadow_adaptive_threshold: float "Threshold for Adaptive Sampling (Raytraced shadows)"
-#+ * ID|Lamp|SpotLamp.shadow_buffer_bias -> shadow_buffer_bias: float "Shadow buffer sampling bias"
-#+ * ID|Lamp|SpotLamp.shadow_buffer_clip_end -> shadow_buffer_clip_end: float "Shadow map clip end beyond which objects will not generate shadows"
-#+ * ID|Lamp|SpotLamp.shadow_buffer_clip_start -> shadow_buffer_clip_start: float "Shadow map clip start: objects closer will not generate shadows"
-#+ * ID|Lamp|SpotLamp.shadow_buffer_samples -> shadow_buffer_samples: int "Number of shadow buffer samples"
-#+ * ID|Lamp|SpotLamp.shadow_buffer_size -> shadow_buffer_size: int "Resolution of the shadow buffer, higher values give crisper shadows but use more memory"
-#+ * ID|Lamp|SpotLamp.shadow_buffer_soft -> shadow_buffer_soft: float "Size of shadow buffer sampling area"
-#+ * ID|Lamp|SpotLamp.shadow_buffer_type -> shadow_buffer_type: enum "Type of shadow buffer"
-#+ * ID|Lamp|SpotLamp.shadow_color -> shadow_color: float[3] "Color of shadows cast by the lamp"
-#+ * ID|Lamp|SpotLamp.shadow_filter_type -> shadow_filter_type: enum "Type of shadow filter (Buffer Shadows)"
-#+ * ID|Lamp|SpotLamp.shadow_method -> shadow_method: enum "Method to compute lamp shadow with"
-#ID|Lamp|SpotLamp.shadow_ray_sample_method -> shadow_ray_sample_method: enum "Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower"
-#+ * ID|Lamp|SpotLamp.shadow_ray_samples -> shadow_ray_samples: int "Amount of samples taken extra (samples x samples)"
-#+ * ID|Lamp|SpotLamp.shadow_sample_buffers -> shadow_sample_buffers: enum "Number of shadow buffers to render for better AA, this increases memory usage"
-#+ * ID|Lamp|SpotLamp.shadow_soft_size -> shadow_soft_size: float "Light size for ray shadow sampling (Raytraced shadows)"
-#+ * ID|Lamp|SpotLamp.show_cone -> show_cone: boolean "Draw transparent cone in 3D view to visualize which objects are contained in it"
-#+ * ID|Lamp|SpotLamp.spot_blend -> spot_blend: float "The softness of the spotlight edge"
-#+ * ID|Lamp|SpotLamp.spot_size -> spot_size: float "Angle of the spotlight beam in degrees"
-#ID|Lamp|SpotLamp.use_auto_clip_end -> use_auto_clip_end: boolean "Automatic calculation of clipping-end, based on visible vertices"
-#ID|Lamp|SpotLamp.use_auto_clip_start -> use_auto_clip_start: boolean "Automatic calculation of clipping-start, based on visible vertices"
-#ID|Lamp|SpotLamp.use_halo -> use_halo: boolean "Renders spotlight with a volumetric halo (Buffer Shadows)"
-#ID|Lamp|SpotLamp.use_only_shadow -> use_only_shadow: boolean "Causes light to cast shadows only without illuminating objects"
-#ID|Lamp|SpotLamp.use_shadow_layer -> use_shadow_layer: boolean "Causes only objects on the same layer to cast shadows"
-#ID|Lamp|SpotLamp.use_sphere -> use_sphere: boolean "Sets light intensity to zero beyond lamp distance"
-#ID|Lamp|SpotLamp.use_square -> use_square: boolean "Casts a square spot light shape"
-#+ * ID|Lamp|SunLamp.shadow_adaptive_threshold -> shadow_adaptive_threshold: float "Threshold for Adaptive Sampling (Raytraced shadows)"
-#+ * ID|Lamp|SunLamp.shadow_color -> shadow_color: float[3] "Color of shadows cast by the lamp"
-#+ * ID|Lamp|SunLamp.shadow_method -> shadow_method: enum "Method to compute lamp shadow with"
-#ID|Lamp|SunLamp.shadow_ray_sample_method -> shadow_ray_sample_method: enum "Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower"
-#+ * ID|Lamp|SunLamp.shadow_ray_samples -> shadow_ray_samples: int "Amount of samples taken extra (samples x samples)"
-#+ * ID|Lamp|SunLamp.shadow_soft_size -> shadow_soft_size: float "Light size for ray shadow sampling (Raytraced shadows)"
-#+ * ID|Lamp|SunLamp.sky -> sky: pointer, "(read-only) Sky related settings for sun lamps"
-#ID|Lamp|SunLamp.use_only_shadow -> use_only_shadow: boolean "Causes light to cast shadows only without illuminating objects"
-#ID|Lamp|SunLamp.use_shadow_layer -> use_shadow_layer: boolean "Causes only objects on the same layer to cast shadows"
-#+ * ID|Lattice.interpolation_type_u -> interpolation_type_u: enum "NO DESCRIPTION"
-#+ * ID|Lattice.interpolation_type_v -> interpolation_type_v: enum "NO DESCRIPTION"
-#+ * ID|Lattice.interpolation_type_w -> interpolation_type_w: enum "NO DESCRIPTION"
-#+ * ID|Lattice.points -> points: collection, "(read-only) Points of the lattice"
-#+ * ID|Lattice.points_u -> points_u: int "Points in U direction (cant be changed when there are shape keys)"
-#+ * ID|Lattice.points_v -> points_v: int "Points in V direction (cant be changed when there are shape keys)"
-#+ * ID|Lattice.points_w -> points_w: int "Points in W direction (cant be changed when there are shape keys)"
-#+ * ID|Lattice.shape_keys -> shape_keys: pointer, "(read-only)"
-#ID|Lattice.use_outside -> use_outside: boolean "Only draw, and take into account, the outer vertices"
-#+ * ID|Lattice.vertex_group -> vertex_group: string "Vertex group to apply the influence of the lattice"
-#+ * ID|Library.filepath -> filepath: string "Path to the library .blend file"
-#+ * ID|Library.parent -> parent: pointer, "(read-only)"
-#+ * ID|Material.active_node_material -> active_node_material: pointer "Active node material"
-#+ * ID|Material.active_texture -> active_texture: pointer "Active texture slot being displayed"
-#+ * ID|Material.active_texture_index -> active_texture_index: int "Index of active texture slot"
-#+ * ID|Material.alpha -> alpha: float "Alpha transparency of the material"
-#+ * ID|Material.ambient -> ambient: float "Amount of global ambient color the material receives"
-#+ * ID|Material.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
-#+ * ID|Material.darkness -> darkness: float "Minnaert darkness"
-#+ * ID|Material.diffuse_color -> diffuse_color: float[3] "NO DESCRIPTION"
-#+ * ID|Material.diffuse_fresnel -> diffuse_fresnel: float "Power of Fresnel"
-#+ * ID|Material.diffuse_fresnel_factor -> diffuse_fresnel_factor: float "Blending factor of Fresnel"
-#+ * ID|Material.diffuse_intensity -> diffuse_intensity: float "Amount of diffuse reflection"
-#+ * ID|Material.diffuse_ramp -> diffuse_ramp: pointer, "(read-only) Color ramp used to affect diffuse shading"
-#+ * ID|Material.diffuse_ramp_blend -> diffuse_ramp_blend: enum "NO DESCRIPTION"
-#+ * ID|Material.diffuse_ramp_factor -> diffuse_ramp_factor: float "Blending factor (also uses alpha in Colorband)"
-#+ * ID|Material.diffuse_ramp_input -> diffuse_ramp_input: enum "NO DESCRIPTION"
-#+ * ID|Material.diffuse_shader -> diffuse_shader: enum "NO DESCRIPTION"
-#+ * ID|Material.diffuse_toon_size -> diffuse_toon_size: float "Size of diffuse toon area"
-#+ * ID|Material.diffuse_toon_smooth -> diffuse_toon_smooth: float "Smoothness of diffuse toon area"
-#+ * ID|Material.emit -> emit: float "Amount of light to emit"
-#+ * ID|Material.halo -> halo: pointer, "(read-only) Halo settings for the material"
-#+ * ID|Material.invert_z -> invert_z: boolean "Renders materials faces with an inverted Z buffer (scanline only)"
-#+ * ID|Material.light_group -> light_group: pointer "Limit lighting to lamps in this Group"
-#+ * ID|Material.mirror_color -> mirror_color: float[3] "Mirror color of the material"
-#+ * ID|Material.node_tree -> node_tree: pointer, "(read-only) Node tree for node based materials"
-#ID|Material.offset_z -> offset_z: float "Gives faces an artificial offset in the Z buffer for Z transparency"
-#+ * ID|Material.physics -> physics: pointer, "(read-only) Game physics settings"
-#+ * ID|Material.preview_render_type -> preview_render_type: enum "Type of preview render"
-#+ * ID|Material.raytrace_mirror -> raytrace_mirror: pointer, "(read-only) Raytraced reflection settings for the material"
-#+ * ID|Material.raytrace_transparency -> raytrace_transparency: pointer, "(read-only) Raytraced transparency settings for the material"
-#+ * ID|Material.roughness -> roughness: float "Oren-Nayar Roughness"
-#+ * ID|Material.shadow_buffer_bias -> shadow_buffer_bias: float "Factor to multiply shadow buffer bias with (0 is ignore.)"
-#ID|Material.shadow_cast_alpha -> shadow_cast_alpha: float "Shadow casting alpha, in use for Irregular and Deep shadow buffer"
-#+ * ID|Material.shadow_ray_bias -> shadow_ray_bias: float "Shadow raytracing bias to prevent terminator problems on shadow boundary"
-#+ * ID|Material.specular_alpha -> specular_alpha: float "Alpha transparency for specular areas"
-#+ * ID|Material.specular_color -> specular_color: float[3] "Specular color of the material"
-#+ * ID|Material.specular_hardness -> specular_hardness: int "NO DESCRIPTION"
-#+ * ID|Material.specular_intensity -> specular_intensity: float "NO DESCRIPTION"
-#+ * ID|Material.specular_ior -> specular_ior: float "NO DESCRIPTION"
-#+ * ID|Material.specular_ramp -> specular_ramp: pointer, "(read-only) Color ramp used to affect specular shading"
-#+ * ID|Material.specular_ramp_blend -> specular_ramp_blend: enum "NO DESCRIPTION"
-#+ * ID|Material.specular_ramp_factor -> specular_ramp_factor: float "Blending factor (also uses alpha in Colorband)"
-#+ * ID|Material.specular_ramp_input -> specular_ramp_input: enum "NO DESCRIPTION"
-#+ * ID|Material.specular_shader -> specular_shader: enum "NO DESCRIPTION"
-#+ * ID|Material.specular_slope -> specular_slope: float "The standard deviation of surface slope"
-#+ * ID|Material.specular_toon_size -> specular_toon_size: float "Size of specular toon area"
-#+ * ID|Material.specular_toon_smooth -> specular_toon_smooth: float "Smoothness of specular toon area"
-#+ * ID|Material.strand -> strand: pointer, "(read-only) Strand settings for the material"
-#+ * ID|Material.subsurface_scattering -> subsurface_scattering: pointer, "(read-only) Subsurface scattering settings for the material"
-#+ * ID|Material.texture_slots -> texture_slots: collection, "(read-only) Texture slots defining the mapping and influence of textures"
-#+ * ID|Material.translucency -> translucency: float "Amount of diffuse shading on the back side"
-#+ * ID|Material.transparency_method -> transparency_method: enum "Method to use for rendering transparency"
-#+ * ID|Material.type -> type: enum "Material type defining how the object is rendered"
-#ID|Material.use_cast_approximate -> use_cast_approximate: boolean "Allow this material to cast shadows when using approximate ambient occlusion."
-#ID|Material.use_cast_buffer_shadows -> use_cast_buffer_shadows: boolean "Allow this material to cast shadows from shadow buffer lamps"
-#ID|Material.use_cast_shadows_only -> use_cast_shadows_only: boolean "Makes objects with this material appear invisible, only casting shadows (not rendered)"
-#ID|Material.use_cubic -> use_cubic: boolean "Use cubic interpolation for diffuse values, for smoother transitions"
-#+ * ID|Material.use_diffuse_ramp -> use_diffuse_ramp: boolean "Toggle diffuse ramp operations"
-#ID|Material.use_face_texture -> use_face_texture: boolean "Replaces the objects base color with color from face assigned image textures"
-#ID|Material.use_face_texture_alpha -> use_face_texture_alpha: boolean "Replaces the objects base alpha value with alpha from face assigned image textures"
-#ID|Material.use_full_oversampling -> use_full_oversampling: boolean "Force this material to render full shading/textures for all anti-aliasing samples"
-#ID|Material.use_light_group_exclusive -> use_light_group_exclusive: boolean "Material uses the light group exclusively - these lamps are excluded from other scene lighting"
-#ID|Material.use_mist -> use_mist: boolean "Use mist with this material (in world settings)"
-#+ * ID|Material.use_nodes -> use_nodes: boolean "Use shader nodes to render the material"
-#ID|Material.use_object_color -> use_object_color: boolean "Modulate the result with a per-object color"
-#ID|Material.use_only_shadow -> use_only_shadow: boolean "Renders shadows as the materials alpha value, making materials transparent except for shadowed areas"
-#ID|Material.use_ray_shadow_bias -> use_ray_shadow_bias: boolean "Prevents raytraced shadow errors on surfaces with smooth shaded normals (terminator problem)"
-#ID|Material.use_raytrace -> use_raytrace: boolean "Include this material and geometry that uses it in ray tracing calculations"
-#ID|Material.use_shadeless -> use_shadeless: boolean "Makes this material insensitive to light or shadow"
-#ID|Material.use_shadows -> use_shadows: boolean "Allows this material to receive shadows"
-#+ * ID|Material.use_sky -> use_sky: boolean "Renders this material with zero alpha, with sky background in place (scanline only)"
-#+ * ID|Material.use_specular_ramp -> use_specular_ramp: boolean "Toggle specular ramp operations"
-#ID|Material.use_tangent_shading -> use_tangent_shading: boolean "Use the materials tangent vector instead of the normal for shading - for anisotropic shading effects"
-#+ * ID|Material.use_textures -> use_textures: boolean[18] "Enable/Disable each texture"
-#ID|Material.use_transparency -> use_transparency: boolean "Render material as transparent"
-#ID|Material.use_transparent_shadows -> use_transparent_shadows: boolean "Allow this object to receive transparent shadows casted through other objects"
-#ID|Material.use_vertex_color_light -> use_vertex_color_light: boolean "Add vertex colors as additional lighting"
-#ID|Material.use_vertex_color_paint -> use_vertex_color_paint: boolean "Replaces object base color with vertex colors (multiplies with texture face face assigned textures)"
-#+ * ID|Material.volume -> volume: pointer, "(read-only) Volume settings for the material"
-#+ * ID|Mesh.active_uv_texture_index -> active_uv_texture_index: int "Active UV texture index"
-#+ * ID|Mesh.active_vertex_color_index -> active_vertex_color_index: int "Active vertex color index"
-#+ * ID|Mesh.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
-#ID|Mesh.auto_smooth_angle -> auto_smooth_angle: int "Defines maximum angle between face normals that Auto Smooth will operate on"
-#+ * ID|Mesh.edges -> edges: collection, "(read-only) Edges of the mesh"
-#+ * ID|Mesh.faces -> faces: collection, "(read-only) Faces of the mesh"
-#ID|Mesh.layers_float -> layers_float: collection, "(read-only)"
-#ID|Mesh.layers_int -> layers_int: collection, "(read-only)"
-#ID|Mesh.layers_string -> layers_string: collection, "(read-only)"
-#+ * ID|Mesh.materials -> materials: collection, "(read-only)"
-#+ * ID|Mesh.shape_keys -> shape_keys: pointer, "(read-only)"
-#ID|Mesh.show_all_edges -> show_all_edges: boolean "Displays all edges for wireframe in all view modes in the 3D view"
-#ID|Mesh.show_double_sided -> show_double_sided: boolean "Render/display the mesh with double or single sided lighting"
-#ID|Mesh.show_edge_bevel_weight -> show_edge_bevel_weight: boolean "Displays weights created for the Bevel modifier"
-#ID|Mesh.show_edge_crease -> show_edge_crease: boolean "Displays creases created for subsurf weighting"
-#ID|Mesh.show_edge_seams -> show_edge_seams: boolean "Displays UV unwrapping seams"
-#ID|Mesh.show_edge_sharp -> show_edge_sharp: boolean "Displays sharp edges, used with the EdgeSplit modifier"
-#ID|Mesh.show_edges -> show_edges: boolean "Displays selected edges using highlights in the 3D view and UV editor"
-#ID|Mesh.show_extra_edge_angle -> show_extra_edge_angle: boolean "Displays the angles in the selected edges in degrees, Using global values when set in the transform panel"
-#ID|Mesh.show_extra_edge_length -> show_extra_edge_length: boolean "Displays selected edge lengths, Using global values when set in the transform panel"
-#ID|Mesh.show_extra_face_area -> show_extra_face_area: boolean "Displays the area of selected faces, Using global values when set in the transform panel"
-#ID|Mesh.show_faces -> show_faces: boolean "Displays all faces as shades in the 3D view and UV editor"
-#ID|Mesh.show_normal_face -> show_normal_face: boolean "Displays face normals as lines"
-#ID|Mesh.show_normal_vertex -> show_normal_vertex: boolean "Displays vertex normals as lines"
-#+ * ID|Mesh.sticky -> sticky: collection, "(read-only) Sticky texture coordinates"
-#+ * ID|Mesh.texco_mesh -> texco_mesh: pointer "Derive texture coordinates from another mesh"
-#ID|Mesh.texspace_location -> texspace_location: float[3] "Texture space location"
-#+ * ID|Mesh.texspace_size -> texspace_size: float[3] "Texture space size"
-#+ * ID|Mesh.texture_mesh -> texture_mesh: pointer "Use another mesh for texture indices (vertex indices must be aligned)"
-#+ * ID|Mesh.total_edge_sel -> total_edge_sel: int, "(read-only) Selected edge count in editmode"
-#+ * ID|Mesh.total_face_sel -> total_face_sel: int, "(read-only) Selected face count in editmode"
-#+ * ID|Mesh.total_vert_sel -> total_vert_sel: int, "(read-only) Selected vertex count in editmode"
-#ID|Mesh.use_auto_smooth -> use_auto_smooth: boolean "Treats all set-smoothed faces with angles less than the specified angle as smooth during render"
-#ID|Mesh.use_auto_texspace -> use_auto_texspace: boolean "Adjusts active objects texture space automatically when transforming object"
-#+ * ID|Mesh.use_mirror_topology -> use_mirror_topology: boolean "Use topology based mirroring"
-#+ * ID|Mesh.use_mirror_x -> use_mirror_x: boolean "X Axis mirror editing"
-#+ * ID|Mesh.use_paint_mask -> use_paint_mask: boolean "Face selection masking for painting"
-#+ * ID|Mesh.uv_texture_clone -> uv_texture_clone: pointer "UV texture to be used as cloning source"
-#+ * ID|Mesh.uv_texture_clone_index -> uv_texture_clone_index: int "Clone UV texture index"
-#+ * ID|Mesh.uv_texture_stencil -> uv_texture_stencil: pointer "UV texture to mask the painted area"
-#+ * ID|Mesh.uv_texture_stencil_index -> uv_texture_stencil_index: int "Mask UV texture index"
-#+ * ID|Mesh.uv_textures -> uv_textures: collection, "(read-only)"
-#+ * ID|Mesh.vertex_colors -> vertex_colors: collection, "(read-only)"
-#ID|Mesh.vertices -> vertices: collection, "(read-only) Vertices of the mesh"
-#+ * ID|MetaBall.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
-#+ * ID|MetaBall.elements -> elements: collection, "(read-only) Meta elements"
-#+ * ID|MetaBall.materials -> materials: collection, "(read-only)"
-#ID|MetaBall.render_resolution -> render_resolution: float "Polygonization resolution in rendering"
-#ID|MetaBall.resolution -> resolution: float "Polygonization resolution in the 3D viewport"
-#ID|MetaBall.texspace_location -> texspace_location: float[3] "Texture space location"
-#+ * ID|MetaBall.texspace_size -> texspace_size: float[3] "Texture space size"
-#+ * ID|MetaBall.threshold -> threshold: float "Influence of meta elements"
-#ID|MetaBall.update_method -> update_method: enum "Metaball edit update behavior"
-#ID|MetaBall.use_auto_texspace -> use_auto_texspace: boolean "Adjusts active objects texture space automatically when transforming object"
-#+ * ID|NodeTree.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
-#+ * ID|NodeTree.grease_pencil -> grease_pencil: pointer "Grease Pencil datablock"
-#+ * ID|NodeTree.nodes -> nodes: collection, "(read-only)"
-#+ * ID|Object.active_material -> active_material: pointer "Active material being displayed"
-#+ * ID|Object.active_material_index -> active_material_index: int "Index of active material slot"
-#+ * ID|Object.active_particle_system -> active_particle_system: pointer, "(read-only) Active particle system being displayed"
-#+ * ID|Object.active_particle_system_index -> active_particle_system_index: int "Index of active particle system slot"
-#+ * ID|Object.active_shape_key -> active_shape_key: pointer, "(read-only) Current shape key"
-#+ * ID|Object.active_shape_key_index -> active_shape_key_index: int "Current shape key index"
-#+ * ID|Object.active_vertex_group -> active_vertex_group: pointer, "(read-only) Vertex groups of the object"
-#+ * ID|Object.active_vertex_group_index -> active_vertex_group_index: int "Active index in vertex group array"
-#+ * ID|Object.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
-#+ * ID|Object.animation_visualisation -> animation_visualisation: pointer, "(read-only) Animation data for this datablock"
-#+ * ID|Object.bound_box -> bound_box: float[24], "(read-only) Objects bound box in object-space coordinates"
-#+ * ID|Object.collision -> collision: pointer, "(read-only) Settings for using the objects as a collider in physics simulation"
-#+ * ID|Object.color -> color: float[4] "Object color and alpha, used when faces have the ObColor mode enabled"
-#+ * ID|Object.constraints -> constraints: collection, "(read-only) Constraints affecting the transformation of the object"
-#+ * ID|Object.data -> data: pointer "Object data"
-#+ * ID|Object.delta_location -> delta_location: float[3] "Extra translation added to the location of the object"
-#+ * ID|Object.delta_rotation_euler -> delta_rotation_euler: float[3] "Extra rotation added to the rotation of the object (when using Euler rotations)"
-#+ * ID|Object.delta_rotation_quaternion -> delta_rotation_quaternion: float[4] "Extra rotation added to the rotation of the object (when using Quaternion rotations)"
-#+ * ID|Object.delta_scale -> delta_scale: float[3] "Extra scaling added to the scale of the object"
-#+ * ID|Object.dimensions -> dimensions: float[3] "Absolute bounding box dimensions of the object"
-#+ * ID|Object.draw_bounds_type -> draw_bounds_type: enum "Object boundary display type"
-#ID|Object.draw_type -> draw_type: enum "Maximum draw type to display object with in viewport"
-#+ * ID|Object.dupli_faces_scale -> dupli_faces_scale: float "Scale the DupliFace objects"
-#+ * ID|Object.dupli_frames_end -> dupli_frames_end: int "End frame for DupliFrames"
-#+ * ID|Object.dupli_frames_off -> dupli_frames_off: int "Recurring frames to exclude from the Dupliframes"
-#+ * ID|Object.dupli_frames_on -> dupli_frames_on: int "Number of frames to use between DupOff frames"
-#+ * ID|Object.dupli_frames_start -> dupli_frames_start: int "Start frame for DupliFrames"
-#+ * ID|Object.dupli_group -> dupli_group: pointer "Instance an existing group"
-#+ * ID|Object.dupli_list -> dupli_list: collection, "(read-only) Object duplis"
-#+ * ID|Object.dupli_type -> dupli_type: enum "If not None, object duplication method to use"
-#+ * ID|Object.empty_draw_size -> empty_draw_size: float "Size of display for empties in the viewport"
-#+ * ID|Object.empty_draw_type -> empty_draw_type: enum "Viewport display style for empties"
-#+ * ID|Object.field -> field: pointer, "(read-only) Settings for using the objects as a field in physics simulation"
-#+ * ID|Object.game -> game: pointer, "(read-only) Game engine related settings for the object"
-#+ * ID|Object.grease_pencil -> grease_pencil: pointer "Grease Pencil datablock"
-#+ * ID|Object.hide -> hide: boolean "Restrict visibility in the viewport"
-#+ * ID|Object.hide_render -> hide_render: boolean "Restrict renderability"
-#+ * ID|Object.hide_select -> hide_select: boolean "Restrict selection in the viewport"
-#ID|Object.is_duplicator -> is_duplicator: boolean, "(read-only)"
-#+ * ID|Object.layers -> layers: boolean[20] "Layers the object is on"
-#+ * ID|Object.location -> location: float[3] "Location of the object"
-#+ * ID|Object.lock_location -> lock_location: boolean[3] "Lock editing of location in the interface"
-#+ * ID|Object.lock_rotation -> lock_rotation: boolean[3] "Lock editing of rotation in the interface"
-#+ * ID|Object.lock_rotation_w -> lock_rotation_w: boolean "Lock editing of angle component of four-component rotations in the interface"
-#+ * ID|Object.lock_rotations_4d -> lock_rotations_4d: boolean "Lock editing of four component rotations by components (instead of as Eulers)"
-#+ * ID|Object.lock_scale -> lock_scale: boolean[3] "Lock editing of scale in the interface"
-#+ * ID|Object.material_slots -> material_slots: collection, "(read-only) Material slots in the object"
-#+ * ID|Object.matrix_local -> matrix_local: float[16] "Parent relative transformation matrix"
-#+ * ID|Object.matrix_world -> matrix_world: float[16] "Worldspace transformation matrix"
-#+ * ID|Object.mode -> mode: enum, "(read-only) Object interaction mode"
-#+ * ID|Object.modifiers -> modifiers: collection, "(read-only) Modifiers affecting the geometric data of the object"
-#+ * ID|Object.motion_path -> motion_path: pointer, "(read-only) Motion Path for this element"
-#+ * ID|Object.parent -> parent: pointer "Parent Object"
-#+ * ID|Object.parent_bone -> parent_bone: string "Name of parent bone in case of a bone parenting relation"
-#+ * ID|Object.parent_type -> parent_type: enum "Type of parent relation"
-#+ * ID|Object.parent_vertices -> parent_vertices: int[3], "(read-only) Indices of vertices in cases of a vertex parenting relation"
-#+ * ID|Object.particle_systems -> particle_systems: collection, "(read-only) Particle systems emitted from the object"
-#+ * ID|Object.pass_index -> pass_index: int "Index # for the IndexOB render pass"
-#+ * ID|Object.pose -> pose: pointer, "(read-only) Current pose for armatures"
-#+ * ID|Object.pose_library -> pose_library: pointer, "(read-only) Action used as a pose library for armatures"
-#+ * ID|Object.proxy -> proxy: pointer, "(read-only) Library object this proxy object controls"
-#+ * ID|Object.proxy_group -> proxy_group: pointer, "(read-only) Library group duplicator object this proxy object controls"
-#+ * ID|Object.rotation_axis_angle -> rotation_axis_angle: float[4] "Angle of Rotation for Axis-Angle rotation representation"
-#+ * ID|Object.rotation_euler -> rotation_euler: float[3] "Rotation in Eulers"
-#+ * ID|Object.rotation_mode -> rotation_mode: enum "NO DESCRIPTION"
-#+ * ID|Object.rotation_quaternion -> rotation_quaternion: float[4] "Rotation in Quaternions"
-#+ * ID|Object.scale -> scale: float[3] "Scaling of the object"
-#+ * ID|Object.select -> select: boolean "Object selection state"
-#ID|Object.show_axis -> show_axis: boolean "Displays the objects origin and axis"
-#ID|Object.show_bounds -> show_bounds: boolean "Displays the objects bounds"
-#ID|Object.show_name -> show_name: boolean "Displays the objects name"
-#ID|Object.show_shape_key -> show_shape_key: boolean "Always show the current Shape for this Object"
-#ID|Object.show_texture_space -> show_texture_space: boolean "Displays the objects texture space"
-#ID|Object.show_transparent -> show_transparent: boolean "Enables transparent materials for the object (Mesh only)"
-#ID|Object.show_wire -> show_wire: boolean "Adds the objects wireframe over solid drawing"
-#ID|Object.show_x_ray -> show_x_ray: boolean "Makes the object draw in front of others"
-#+ * ID|Object.soft_body -> soft_body: pointer, "(read-only) Settings for soft body simulation"
-#+ * ID|Object.time_offset -> time_offset: float "Animation offset in frames for F-Curve and dupligroup instances"
-#+ * ID|Object.track_axis -> track_axis: enum "Axis that points in forward direction"
-#+ * ID|Object.type -> type: enum, "(read-only) Type of Object"
-#+ * ID|Object.up_axis -> up_axis: enum "Axis that points in the upward direction"
-#+ * ID|Object.use_dupli_faces_scale -> use_dupli_faces_scale: boolean "Scale dupli based on face size"
-#+ * ID|Object.use_dupli_frames_speed -> use_dupli_frames_speed: boolean "Set dupliframes to use the frame"
-#ID|Object.use_dupli_vertices_rotation -> use_dupli_vertices_rotation: boolean "Rotate dupli according to vertex normal"
-#ID|Object.use_shape_key_edit_mode -> use_shape_key_edit_mode: boolean "Apply shape keys in edit mode (for Meshes only)"
-#ID|Object.use_slow_parent -> use_slow_parent: boolean "Create a delay in the parent relationship"
-#ID|Object.use_time_offset_add_parent -> use_time_offset_add_parent: boolean "Add the parents time offset value"
-#ID|Object.use_time_offset_edit -> use_time_offset_edit: boolean "Use time offset when inserting keys and display time offset for F-Curve and action views"
-#ID|Object.use_time_offset_parent -> use_time_offset_parent: boolean "Apply the time offset to this objects parent relationship"
-#ID|Object.use_time_offset_particle -> use_time_offset_particle: boolean "Let the time offset work on the particle effect"
-#+ * ID|Object.vertex_groups -> vertex_groups: collection, "(read-only) Vertex groups of the object"
-#+ * ID|ParticleSettings.active_dupliweight -> active_dupliweight: pointer, "(read-only)"
-#+ * ID|ParticleSettings.active_dupliweight_index -> active_dupliweight_index: int "NO DESCRIPTION"
-#+ * ID|ParticleSettings.adaptive_angle -> adaptive_angle: int "How many degrees path has to curve to make another render segment"
-#ID|ParticleSettings.adaptive_pixel -> adaptive_pixel: int "How many pixels path has to cover to make another render segment"
-#+ * ID|ParticleSettings.angular_velocity_factor -> angular_velocity_factor: float "Angular velocity amount"
-#+ * ID|ParticleSettings.angular_velocity_mode -> angular_velocity_mode: enum "Particle angular velocity mode"
-#+ * ID|ParticleSettings.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
-#ID|ParticleSettings.apply_effector_to_children -> apply_effector_to_children: boolean "Apply effectors to children"
-#ID|ParticleSettings.apply_guide_to_children -> apply_guide_to_children: boolean "NO DESCRIPTION"
-#+ * ID|ParticleSettings.billboard_align -> billboard_align: enum "In respect to what the billboards are aligned"
-#+ * ID|ParticleSettings.billboard_animation -> billboard_animation: enum "How to animate billboard textures"
-#+ * ID|ParticleSettings.billboard_object -> billboard_object: pointer "Billboards face this object (default is active camera)"
-#+ * ID|ParticleSettings.billboard_offset -> billboard_offset: float[2] "NO DESCRIPTION"
-#ID|ParticleSettings.billboard_offset_split -> billboard_offset_split: enum "How to offset billboard textures"
-#+ * ID|ParticleSettings.billboard_tilt -> billboard_tilt: float "Tilt of the billboards"
-#ID|ParticleSettings.billboard_tilt_random -> billboard_tilt_random: float "Random tilt of the billboards"
-#+ * ID|ParticleSettings.billboard_uv_split -> billboard_uv_split: int "Amount of rows/columns to split UV coordinates for billboards"
-#+ * ID|ParticleSettings.boids -> boids: pointer, "(read-only)"
-#+ * ID|ParticleSettings.branch_threshold -> branch_threshold: float "Threshold of branching"
-#+ * ID|ParticleSettings.brownian_factor -> brownian_factor: float "Specify the amount of Brownian motion"
-#+ * ID|ParticleSettings.child_length -> child_length: float "Length of child paths"
-#ID|ParticleSettings.child_length_threshold -> child_length_threshold: float "Amount of particles left untouched by child path length"
-#+ * ID|ParticleSettings.child_nbr -> child_nbr: int "Amount of children/parent"
-#+ * ID|ParticleSettings.child_radius -> child_radius: float "Radius of children around parent"
-#+ * ID|ParticleSettings.child_roundness -> child_roundness: float "Roundness of children around parent"
-#+ * ID|ParticleSettings.child_size -> child_size: float "A multiplier for the child particle size"
-#ID|ParticleSettings.child_size_random -> child_size_random: float "Random variation to the size of the child particles"
-#+ * ID|ParticleSettings.child_type -> child_type: enum "Create child particles"
-#+ * ID|ParticleSettings.clump_factor -> clump_factor: float "Amount of clumping"
-#ID|ParticleSettings.clump_shape -> clump_shape: float "Shape of clumping"
-#ID|ParticleSettings.count -> count: int "Total number of particles"
-#ID|ParticleSettings.damping -> damping: float "Specify the amount of damping"
-#+ * ID|ParticleSettings.distribution -> distribution: enum "How to distribute particles on selected element"
-#+ * ID|ParticleSettings.drag_factor -> drag_factor: float "Specify the amount of air-drag"
-#ID|ParticleSettings.draw_method -> draw_method: enum "How particles are drawn in viewport"
-#ID|ParticleSettings.draw_percentage -> draw_percentage: int "Percentage of particles to display in 3D view"
-#+ * ID|ParticleSettings.draw_size -> draw_size: int "Size of particles on viewport in pixels (0=default)"
-#+ * ID|ParticleSettings.draw_step -> draw_step: int "How many steps paths are drawn with (power of 2)"
-#+ * ID|ParticleSettings.dupli_group -> dupli_group: pointer "Show Objects in this Group in place of particles"
-#+ * ID|ParticleSettings.dupli_object -> dupli_object: pointer "Show this Object in place of particles"
-#ID|ParticleSettings.dupli_weights -> dupli_weights: collection, "(read-only) Weights for all of the objects in the dupli group"
-#+ * ID|ParticleSettings.effect_hair -> effect_hair: float "Hair stiffness for effectors"
-#+ * ID|ParticleSettings.effector_weights -> effector_weights: pointer, "(read-only)"
-#+ * ID|ParticleSettings.emit_from -> emit_from: enum "Where to emit particles from"
-#ID|ParticleSettings.factor_random -> factor_random: float "Give the starting speed a random variation"
-#+ * ID|ParticleSettings.fluid -> fluid: pointer, "(read-only)"
-#+ * ID|ParticleSettings.force_field_1 -> force_field_1: pointer, "(read-only)"
-#+ * ID|ParticleSettings.force_field_2 -> force_field_2: pointer, "(read-only)"
-#+ * ID|ParticleSettings.frame_end -> frame_end: float "Frame # to stop emitting particles"
-#+ * ID|ParticleSettings.frame_start -> frame_start: float "Frame # to start emitting particles"
-#+ * ID|ParticleSettings.grid_resolution -> grid_resolution: int "The resolution of the particle grid"
-#+ * ID|ParticleSettings.hair_step -> hair_step: int "Number of hair segments"
-#+ * ID|ParticleSettings.integrator -> integrator: enum "Select physics integrator type"
-#ID|ParticleSettings.invert_grid -> invert_grid: boolean "Invert what is considered object and what is not"
-#+ * ID|ParticleSettings.jitter_factor -> jitter_factor: float "Amount of jitter applied to the sampling"
-#+ * ID|ParticleSettings.keyed_loops -> keyed_loops: int "Number of times the keys are looped"
-#+ * ID|ParticleSettings.keys_step -> keys_step: int "NO DESCRIPTION"
-#+ * ID|ParticleSettings.kink -> kink: enum "Type of periodic offset on the path"
-#+ * ID|ParticleSettings.kink_amplitude -> kink_amplitude: float "The amplitude of the offset"
-#+ * ID|ParticleSettings.kink_axis -> kink_axis: enum "Which axis to use for offset"
-#+ * ID|ParticleSettings.kink_frequency -> kink_frequency: float "The frequency of the offset (1/total length)"
-#+ * ID|ParticleSettings.kink_shape -> kink_shape: float "Adjust the offset to the beginning/end"
-#ID|ParticleSettings.length_random -> length_random: float "Give path length a random variation"
-#+ * ID|ParticleSettings.lifetime -> lifetime: float "Specify the life span of the particles"
-#ID|ParticleSettings.lifetime_random -> lifetime_random: float "Give the particle life a random variation"
-#+ * ID|ParticleSettings.line_length_head -> line_length_head: float "Length of the lines head"
-#+ * ID|ParticleSettings.line_length_tail -> line_length_tail: float "Length of the lines tail"
-#ID|ParticleSettings.lock_billboard -> lock_billboard: boolean "Lock the billboards align axis"
-#ID|ParticleSettings.lock_boids_to_surface -> lock_boids_to_surface: boolean "Constrain boids to a surface"
-#+ * ID|ParticleSettings.mass -> mass: float "Specify the mass of the particles"
-#+ * ID|ParticleSettings.material -> material: int "Specify material used for the particles"
-#+ * ID|ParticleSettings.normal_factor -> normal_factor: float "Let the surface normal give the particle a starting speed"
-#ID|ParticleSettings.object_align_factor -> object_align_factor: float[3] "Let the emitter object orientation give the particle a starting speed"
-#+ * ID|ParticleSettings.object_factor -> object_factor: float "Let the object give the particle a starting speed"
-#+ * ID|ParticleSettings.particle_factor -> particle_factor: float "Let the target particle give the particle a starting speed"
-#+ * ID|ParticleSettings.particle_size -> particle_size: float "The size of the particles"
-#+ * ID|ParticleSettings.path_end -> path_end: float "End time of drawn path"
-#+ * ID|ParticleSettings.path_start -> path_start: float "Starting time of drawn path"
-#+ * ID|ParticleSettings.phase_factor -> phase_factor: float "Initial rotation phase"
-#ID|ParticleSettings.phase_factor_random -> phase_factor_random: float "Randomize rotation phase"
-#+ * ID|ParticleSettings.physics_type -> physics_type: enum "Particle physics type"
-#+ * ID|ParticleSettings.react_event -> react_event: enum "The event of target particles to react on"
-#+ * ID|ParticleSettings.reaction_shape -> reaction_shape: float "Power of reaction strength dependence on distance to target"
-#+ * ID|ParticleSettings.reactor_factor -> reactor_factor: float "Let the vector away from the target particles location give the particle a starting speed"
-#+ * ID|ParticleSettings.render_step -> render_step: int "How many steps paths are rendered with (power of 2)"
-#ID|ParticleSettings.render_type -> render_type: enum "How particles are rendered"
-#ID|ParticleSettings.rendered_child_count -> rendered_child_count: int "Amount of children/parent for rendering"
-#ID|ParticleSettings.rotation_factor_random -> rotation_factor_random: float "Randomize rotation"
-#+ * ID|ParticleSettings.rotation_mode -> rotation_mode: enum "Particles initial rotation"
-#ID|ParticleSettings.roughness_1 -> roughness_1: float "Amount of location dependent rough"
-#ID|ParticleSettings.roughness_1_size -> roughness_1_size: float "Size of location dependent rough"
-#ID|ParticleSettings.roughness_2 -> roughness_2: float "Amount of random rough"
-#ID|ParticleSettings.roughness_2_size -> roughness_2_size: float "Size of random rough"
-#ID|ParticleSettings.roughness_2_threshold -> roughness_2_threshold: float "Amount of particles left untouched by random rough"
-#ID|ParticleSettings.roughness_end_shape -> roughness_end_shape: float "Shape of end point rough"
-#ID|ParticleSettings.roughness_endpoint -> roughness_endpoint: float "Amount of end point rough"
-#ID|ParticleSettings.show_health -> show_health: boolean "Draw boid health"
-#ID|ParticleSettings.show_material_color -> show_material_color: boolean "Draw particles using materials diffuse color"
-#ID|ParticleSettings.show_number -> show_number: boolean "Show particle number"
-#+ * ID|ParticleSettings.show_size -> show_size: boolean "Show particle size"
-#ID|ParticleSettings.show_unborn -> show_unborn: boolean "Show particles before they are emitted"
-#ID|ParticleSettings.show_velocity -> show_velocity: boolean "Show particle velocity"
-#+ * ID|ParticleSettings.simplify_rate -> simplify_rate: float "Speed of simplification"
-#+ * ID|ParticleSettings.simplify_refsize -> simplify_refsize: int "Reference size in pixels, after which simplification begins"
-#+ * ID|ParticleSettings.simplify_transition -> simplify_transition: float "Transition period for fading out strands"
-#+ * ID|ParticleSettings.simplify_viewport -> simplify_viewport: float "Speed of Simplification"
-#ID|ParticleSettings.size_random -> size_random: float "Give the particle size a random variation"
-#+ * ID|ParticleSettings.subframes -> subframes: int "Subframes to simulate for improved stability and finer granularity simulations"
-#+ * ID|ParticleSettings.tangent_factor -> tangent_factor: float "Let the surface tangent give the particle a starting speed"
-#+ * ID|ParticleSettings.tangent_phase -> tangent_phase: float "Rotate the surface tangent"
-#+ * ID|ParticleSettings.time_tweak -> time_tweak: float "A multiplier for physics timestep (1.0 means one frame = 1/25 seconds)"
-#+ * ID|ParticleSettings.trail_count -> trail_count: int "Number of trail particles"
-#+ * ID|ParticleSettings.type -> type: enum "NO DESCRIPTION"
-#ID|ParticleSettings.use_absolute_path_time -> use_absolute_path_time: boolean "Path timing is in absolute frames"
-#ID|ParticleSettings.use_animate_branching -> use_animate_branching: boolean "Animate branching"
-#ID|ParticleSettings.use_branching -> use_branching: boolean "Branch child paths from each other"
-#ID|ParticleSettings.use_dead -> use_dead: boolean "Show particles after they have died"
-#ID|ParticleSettings.use_die_on_collision -> use_die_on_collision: boolean "Particles die when they collide with a deflector object"
-#ID|ParticleSettings.use_dynamic_rotation -> use_dynamic_rotation: boolean "Sets rotation to dynamic/constant"
-#ID|ParticleSettings.use_emit_random -> use_emit_random: boolean "Emit in random order of elements"
-#ID|ParticleSettings.use_even_distribution -> use_even_distribution: boolean "Use even distribution from faces based on face areas or edge lengths"
-#+ * ID|ParticleSettings.use_global_dupli -> use_global_dupli: boolean "Use objects global coordinates for duplication"
-#+ * ID|ParticleSettings.use_group_count -> use_group_count: boolean "Use object multiple times in the same group"
-#ID|ParticleSettings.use_group_pick_random -> use_group_pick_random: boolean "Pick objects from group randomly"
-#ID|ParticleSettings.use_hair_bspline -> use_hair_bspline: boolean "Interpolate hair using B-Splines"
-#ID|ParticleSettings.use_multiply_size_mass -> use_multiply_size_mass: boolean "Multiply mass by particle size"
-#ID|ParticleSettings.use_parent_particles -> use_parent_particles: boolean "Render parent particles"
-#ID|ParticleSettings.use_react_multiple -> use_react_multiple: boolean "React multiple times"
-#ID|ParticleSettings.use_react_start_end -> use_react_start_end: boolean "Give birth to unreacted particles eventually"
-#ID|ParticleSettings.use_render_adaptive -> use_render_adaptive: boolean "Draw steps of the particle path"
-#ID|ParticleSettings.use_render_emitter -> use_render_emitter: boolean "Render emitter Object also"
-#ID|ParticleSettings.use_self_effect -> use_self_effect: boolean "Particle effectors effect themselves"
-#ID|ParticleSettings.use_simplify -> use_simplify: boolean "Remove child strands as the object becomes smaller on the screen"
-#ID|ParticleSettings.use_simplify_viewport -> use_simplify_viewport: boolean "NO DESCRIPTION"
-#ID|ParticleSettings.use_size_deflect -> use_size_deflect: boolean "Use particles size in deflection"
-#ID|ParticleSettings.use_strand_primitive -> use_strand_primitive: boolean "Use the strand primitive for rendering"
-#ID|ParticleSettings.use_symmetric_branching -> use_symmetric_branching: boolean "Start and end points are the same"
-#ID|ParticleSettings.use_velocity_length -> use_velocity_length: boolean "Multiply line length by particle speed"
-#ID|ParticleSettings.use_whole_group -> use_whole_group: boolean "Use whole group at once"
-#+ * ID|ParticleSettings.userjit -> userjit: int "Emission locations / face (0 = automatic)"
-#+ * ID|ParticleSettings.virtual_parents -> virtual_parents: float "Relative amount of virtual parents"
-#+ * ID|Scene.active_keying_set_index -> active_keying_set_index: int "Current Keying Set index (negative for builtin and positive for absolute)"
-#+ * ID|Scene.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
-#ID|Scene.audio_distance_model -> audio_distance_model: enum "Distance model for distance attenuation calculation"
-#ID|Scene.audio_doppler_factor -> audio_doppler_factor: float "Pitch factor for Doppler effect calculation"
-#ID|Scene.audio_doppler_speed -> audio_doppler_speed: float "Speed of sound for Doppler effect calculation"
-#ID|Scene.background_set -> background_set: pointer "Background set scene"
-#+ * ID|Scene.camera -> camera: pointer "Active camera used for rendering the scene"
-#+ * ID|Scene.cursor_location -> cursor_location: float[3] "3D cursor location"
-#+ * ID|Scene.frame_current -> frame_current: int "NO DESCRIPTION"
-#+ * ID|Scene.frame_end -> frame_end: int "Final frame of the playback/rendering range"
-#ID|Scene.frame_preview_end -> frame_preview_end: int "Alternative end frame for UI playback"
-#ID|Scene.frame_preview_start -> frame_preview_start: int "Alternative start frame for UI playback"
-#+ * ID|Scene.frame_start -> frame_start: int "First frame of the playback/rendering range"
-#+ * ID|Scene.frame_step -> frame_step: int "Number of frames to skip forward while rendering/playing back each frame"
-#ID|Scene.game_settings -> game_settings: pointer, "(read-only)"
-#+ * ID|Scene.gravity -> gravity: float[3] "Constant acceleration in a given direction"
-#+ * ID|Scene.grease_pencil -> grease_pencil: pointer "Grease Pencil datablock"
-#ID|Scene.is_nla_tweakmode -> is_nla_tweakmode: boolean, "(read-only) Indicates whether there is any action referenced by NLA being edited. Strictly read-only"
-#+ * ID|Scene.keying_sets -> keying_sets: collection, "(read-only) Absolute Keying Sets for this Scene"
-#ID|Scene.keying_sets_all -> keying_sets_all: collection, "(read-only) All Keying Sets available for use (builtins and Absolute Keying Sets for this Scene)"
-#+ * ID|Scene.layers -> layers: boolean[20] "Layers visible when rendering the scene"
-#+ * ID|Scene.network_render -> network_render: pointer, "(read-only) Network Render Settings"
-#+ * ID|Scene.nodetree -> nodetree: pointer, "(read-only) Compositing node tree"
-#ID|Scene.object_bases -> object_bases: collection, "(read-only)"
-#+ * ID|Scene.objects -> objects: collection, "(read-only)"
-#+ * ID|Scene.orientations -> orientations: collection, "(read-only)"
-#+ * ID|Scene.pose_templates -> pose_templates: pointer, "(read-only) Pose Template Settings"
-#+ * ID|Scene.render -> render: pointer, "(read-only)"
-#+ * ID|Scene.sequence_editor -> sequence_editor: pointer, "(read-only)"
-#+ * ID|Scene.sync_mode -> sync_mode: enum "How to sync playback"
-#+ * ID|Scene.timeline_markers -> timeline_markers: collection, "(read-only) Markers used in all timelines for the current scene"
-#+ * ID|Scene.tool_settings -> tool_settings: pointer, "(read-only)"
-#+ * ID|Scene.unit_settings -> unit_settings: pointer, "(read-only) Unit editing settings"
-#ID|Scene.use_audio -> use_audio: boolean "Play back of audio from Sequence Editor will be muted"
-#ID|Scene.use_audio_scrub -> use_audio_scrub: boolean "Play audio from Sequence Editor while scrubbing"
-#ID|Scene.use_audio_sync -> use_audio_sync: boolean "Play back and sync with audio clock, dropping frames if frame display is too slow"
-#ID|Scene.use_frame_drop -> use_frame_drop: boolean "Play back dropping frames if frame display is too slow"
-#+ * ID|Scene.use_gravity -> use_gravity: boolean "Use global gravity for all dynamics"
-#+ * ID|Scene.use_nodes -> use_nodes: boolean "Enable the compositing node tree"
-#+ * ID|Scene.use_preview_range -> use_preview_range: boolean "Use an alternative start/end frame for UI playback, rather than the scene start/end frame"
-#ID|Scene.use_stamp_note -> use_stamp_note: string "User define note for the render stamping"
-#+ * ID|Scene.world -> world: pointer "World used for rendering the scene"
-#+ * ID|Screen.areas -> areas: collection, "(read-only) Areas the screen is subdivided into"
-#ID|Screen.is_animation_playing -> is_animation_playing: boolean, "(read-only) Animation playback is active"
-#+ * ID|Screen.scene -> scene: pointer "Active scene to be edited in the screen"
-#ID|Screen.show_fullscreen -> show_fullscreen: boolean, "(read-only) An area is maximised, filling this screen"
-#+ * ID|Sound.filepath -> filepath: string "Sound sample file used by this Sound datablock"
-#+ * ID|Sound.packed_file -> packed_file: pointer, "(read-only)"
-#ID|Sound.use_memory_cache -> use_memory_cache: boolean "The sound file is decoded and loaded into RAM"
-#+ * ID|Text.current_character -> current_character: int, "(read-only) Index of current character in current line, and also start index of character in selection if one exists"
-#+ * ID|Text.current_line -> current_line: pointer, "(read-only) Current line, and start line of selection if one exists"
-#+ * ID|Text.filepath -> filepath: string "Filename of the text file"
-#ID|Text.is_dirty -> is_dirty: boolean, "(read-only) Text file has been edited since last save"
-#ID|Text.is_in_memory -> is_in_memory: boolean, "(read-only) Text file is in memory, without a corresponding file on disk"
-#ID|Text.is_modified -> is_modified: boolean, "(read-only) Text file on disk is different than the one in memory"
-#+ * ID|Text.lines -> lines: collection, "(read-only) Lines of text"
-#+ * ID|Text.markers -> markers: collection, "(read-only) Text markers highlighting part of the text"
-#ID|Text.select_end_character -> select_end_character: int, "(read-only) Index of character after end of selection in the selection end line"
-#ID|Text.select_end_line -> select_end_line: pointer, "(read-only) End line of selection"
-#+ * ID|Text.use_module -> use_module: boolean "Register this text as a module on loading, Text name must end with .py"
-#ID|Text.use_tabs_as_spaces -> use_tabs_as_spaces: boolean "Automatically converts all new tabs into spaces"
-#+ * ID|Texture.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
-#+ * ID|Texture.color_ramp -> color_ramp: pointer, "(read-only)"
-#+ * ID|Texture.contrast -> contrast: float "NO DESCRIPTION"
-#+TODO MAKE COLOR * ID|Texture.factor_blue -> factor_blue: float "NO DESCRIPTION"
-#+TODO MAKE COLOR * ID|Texture.factor_green -> factor_green: float "NO DESCRIPTION"
-#+TODO MAKE COLOR * ID|Texture.factor_red -> factor_red: float "NO DESCRIPTION"
-#ID|Texture.intensity -> intensity: float "NO DESCRIPTION"
-#+ * ID|Texture.node_tree -> node_tree: pointer, "(read-only) Node tree for node-based textures"
-#+ * ID|Texture.saturation -> saturation: float "NO DESCRIPTION"
-#+ * ID|Texture.type -> type: enum "NO DESCRIPTION"
-#+ * ID|Texture.use_color_ramp -> use_color_ramp: boolean "Toggle color ramp operations"
-#+ * ID|Texture.use_nodes -> use_nodes: boolean "Make this a node-based texture"
-#+ * ID|Texture.use_preview_alpha -> use_preview_alpha: boolean "Show Alpha in Preview Render"
-#+ * ID|Texture|BlendTexture.progression -> progression: enum "Sets the style of the color blending"
-#ID|Texture|BlendTexture.use_flip_axis -> use_flip_axis: enum "Flips the textures X and Y axis"
-#ID|Texture|CloudsTexture.cloud_type -> cloud_type: enum "NO DESCRIPTION"
-#+ * ID|Texture|CloudsTexture.nabla -> nabla: float "Size of derivative offset used for calculating normal"
-#+ * ID|Texture|CloudsTexture.noise_basis -> noise_basis: enum "Sets the noise basis used for turbulence"
-#+ * ID|Texture|CloudsTexture.noise_depth -> noise_depth: int "Sets the depth of the cloud calculation"
-#ID|Texture|CloudsTexture.noise_scale -> noise_scale: float "Sets scaling for noise input"
-#+ * ID|Texture|CloudsTexture.noise_type -> noise_type: enum "NO DESCRIPTION"
-#+ * ID|Texture|DistortedNoiseTexture.distortion -> distortion: float "NO DESCRIPTION"
-#+ * ID|Texture|DistortedNoiseTexture.nabla -> nabla: float "Size of derivative offset used for calculating normal"
-#+ * ID|Texture|DistortedNoiseTexture.noise_basis -> noise_basis: enum "Sets the noise basis used for turbulence"
-#+ * ID|Texture|DistortedNoiseTexture.noise_distortion -> noise_distortion: enum "Sets the noise basis for the distortion"
-#ID|Texture|DistortedNoiseTexture.noise_scale -> noise_scale: float "Sets scaling for noise input"
-#+ * ID|Texture|EnvironmentMapTexture.environment_map -> environment_map: pointer, "(read-only) Gets the environment map associated with this texture"
-#+ * ID|Texture|EnvironmentMapTexture.filter_eccentricity -> filter_eccentricity: int "Maximum eccentricity. Higher gives less blur at distant/oblique angles, but is also slower"
-#+ * ID|Texture|EnvironmentMapTexture.filter_probes -> filter_probes: int "Maximum number of samples. Higher gives less blur at distant/oblique angles, but is also slower"
-#+ * ID|Texture|EnvironmentMapTexture.filter_size -> filter_size: float "Multiplies the filter size used by MIP Map and Interpolation"
-#ID|Texture|EnvironmentMapTexture.filter_type -> filter_type: enum "Texture filter to use for sampling image"
-#+ * ID|Texture|EnvironmentMapTexture.image -> image: pointer "Source image file to read the environment map from"
-#+ * ID|Texture|EnvironmentMapTexture.image_user -> image_user: pointer, "(read-only) Parameters defining which layer, pass and frame of the image is displayed"
-#ID|Texture|EnvironmentMapTexture.use_filter_size_min -> use_filter_size_min: boolean "Use Filter Size as a minimal filter value in pixels"
-#ID|Texture|EnvironmentMapTexture.use_mipmap -> use_mipmap: boolean "Uses auto-generated MIP maps for the image"
-#ID|Texture|EnvironmentMapTexture.use_mipmap_gauss -> use_mipmap_gauss: boolean "Uses Gauss filter to sample down MIP maps"
-#+ * ID|Texture|ImageTexture.checker_distance -> checker_distance: float "Sets distance between checker tiles"
-#+ * ID|Texture|ImageTexture.crop_max_x -> crop_max_x: float "Sets maximum X value to crop the image"
-#+ * ID|Texture|ImageTexture.crop_max_y -> crop_max_y: float "Sets maximum Y value to crop the image"
-#+ * ID|Texture|ImageTexture.crop_min_x -> crop_min_x: float "Sets minimum X value to crop the image"
-#+ * ID|Texture|ImageTexture.crop_min_y -> crop_min_y: float "Sets minimum Y value to crop the image"
-#+ * ID|Texture|ImageTexture.extension -> extension: enum "Sets how the image is extrapolated past its original bounds"
-#+ * ID|Texture|ImageTexture.filter_eccentricity -> filter_eccentricity: int "Maximum eccentricity. Higher gives less blur at distant/oblique angles, but is also slower"
-#+ * ID|Texture|ImageTexture.filter_probes -> filter_probes: int "Maximum number of samples. Higher gives less blur at distant/oblique angles, but is also slower"
-#+ * ID|Texture|ImageTexture.filter_size -> filter_size: float "Multiplies the filter size used by MIP Map and Interpolation"
-#ID|Texture|ImageTexture.filter_type -> filter_type: enum "Texture filter to use for sampling image"
-#+ * ID|Texture|ImageTexture.image -> image: pointer "NO DESCRIPTION"
-#+ * ID|Texture|ImageTexture.image_user -> image_user: pointer, "(read-only) Parameters defining which layer, pass and frame of the image is displayed"
-#+ * ID|Texture|ImageTexture.invert_alpha -> invert_alpha: boolean "Inverts all the alpha values in the image"
-#+ * ID|Texture|ImageTexture.normal_space -> normal_space: enum "Sets space of normal map image"
-#+ * ID|Texture|ImageTexture.repeat_x -> repeat_x: int "Sets a repetition multiplier in the X direction"
-#+ * ID|Texture|ImageTexture.repeat_y -> repeat_y: int "Sets a repetition multiplier in the Y direction"
-#+ * ID|Texture|ImageTexture.use_alpha -> use_alpha: boolean "Uses the alpha channel information in the image"
-#ID|Texture|ImageTexture.use_calculate_alpha -> use_calculate_alpha: boolean "Calculates an alpha channel based on RGB values in the image"
-#ID|Texture|ImageTexture.use_checker_even -> use_checker_even: boolean "Sets even checker tiles"
-#ID|Texture|ImageTexture.use_checker_odd -> use_checker_odd: boolean "Sets odd checker tiles"
-#ID|Texture|ImageTexture.use_filter_size_min -> use_filter_size_min: boolean "Use Filter Size as a minimal filter value in pixels"
-#ID|Texture|ImageTexture.use_flip_axis -> use_flip_axis: boolean "Flips the textures X and Y axis"
-#ID|Texture|ImageTexture.use_interpolation -> use_interpolation: boolean "Interpolates pixels using Area filter"
-#ID|Texture|ImageTexture.use_mipmap -> use_mipmap: boolean "Uses auto-generated MIP maps for the image"
-#ID|Texture|ImageTexture.use_mipmap_gauss -> use_mipmap_gauss: boolean "Uses Gauss filter to sample down MIP maps"
-#ID|Texture|ImageTexture.use_mirror_x -> use_mirror_x: boolean "Mirrors the image repetition on the X direction"
-#ID|Texture|ImageTexture.use_mirror_y -> use_mirror_y: boolean "Mirrors the image repetition on the Y direction"
-#ID|Texture|ImageTexture.use_normal_map -> use_normal_map: boolean "Uses image RGB values for normal mapping"
-#+ * ID|Texture|MagicTexture.noise_depth -> noise_depth: int "Sets the depth of the cloud calculation"
-#+ * ID|Texture|MagicTexture.turbulence -> turbulence: float "Sets the turbulence of the bandnoise and ringnoise types"
-#ID|Texture|MarbleTexture.marble_type -> marble_type: enum "NO DESCRIPTION"
-#+ * ID|Texture|MarbleTexture.nabla -> nabla: float "Size of derivative offset used for calculating normal"
-#+ * ID|Texture|MarbleTexture.noise_basis -> noise_basis: enum "Sets the noise basis used for turbulence"
-#+ * ID|Texture|MarbleTexture.noise_depth -> noise_depth: int "Sets the depth of the cloud calculation"
-#ID|Texture|MarbleTexture.noise_scale -> noise_scale: float "Sets scaling for noise input"
-#+ * ID|Texture|MarbleTexture.noise_type -> noise_type: enum "NO DESCRIPTION"
-#ID|Texture|MarbleTexture.noisebasis_2 -> noisebasis_2: enum "NO DESCRIPTION"
-#+ * ID|Texture|MarbleTexture.turbulence -> turbulence: float "Sets the turbulence of the bandnoise and ringnoise types"
-#ID|Texture|MusgraveTexture.dimension_max -> dimension_max: float "Highest fractal dimension"
-#+ * ID|Texture|MusgraveTexture.gain -> gain: float "The gain multiplier"
-#+ * ID|Texture|MusgraveTexture.lacunarity -> lacunarity: float "Gap between successive frequencies"
-#+ * ID|Texture|MusgraveTexture.musgrave_type -> musgrave_type: enum "NO DESCRIPTION"
-#+ * ID|Texture|MusgraveTexture.nabla -> nabla: float "Size of derivative offset used for calculating normal"
-#+ * ID|Texture|MusgraveTexture.noise_basis -> noise_basis: enum "Sets the noise basis used for turbulence"
-#+ * ID|Texture|MusgraveTexture.noise_intensity -> noise_intensity: float "NO DESCRIPTION"
-#ID|Texture|MusgraveTexture.noise_scale -> noise_scale: float "Sets scaling for noise input"
-#+ * ID|Texture|MusgraveTexture.octaves -> octaves: float "Number of frequencies used"
-#+ * ID|Texture|MusgraveTexture.offset -> offset: float "The fractal offset"
-#ID|Texture|PointDensityTexture.point_density -> point_density: pointer, "(read-only) The point density settings associated with this texture"
-#+ * ID|Texture|StucciTexture.noise_basis -> noise_basis: enum "Sets the noise basis used for turbulence"
-#ID|Texture|StucciTexture.noise_scale -> noise_scale: float "Sets scaling for noise input"
-#+ * ID|Texture|StucciTexture.noise_type -> noise_type: enum "NO DESCRIPTION"
-#ID|Texture|StucciTexture.stucci_type -> stucci_type: enum "NO DESCRIPTION"
-#+ * ID|Texture|StucciTexture.turbulence -> turbulence: float "Sets the turbulence of the bandnoise and ringnoise types"
-#ID|Texture|VoronoiTexture.color_mode -> color_mode: enum "NO DESCRIPTION"
-#+ * ID|Texture|VoronoiTexture.distance_metric -> distance_metric: enum "NO DESCRIPTION"
-#+ * ID|Texture|VoronoiTexture.minkovsky_exponent -> minkovsky_exponent: float "Minkovsky exponent"
-#+ * ID|Texture|VoronoiTexture.nabla -> nabla: float "Size of derivative offset used for calculating normal"
-#+ * ID|Texture|VoronoiTexture.noise_intensity -> noise_intensity: float "NO DESCRIPTION"
-#ID|Texture|VoronoiTexture.noise_scale -> noise_scale: float "Sets scaling for noise input"
-#+ * ID|Texture|VoronoiTexture.weight_1 -> weight_1: float "Voronoi feature weight 1"
-#+ * ID|Texture|VoronoiTexture.weight_2 -> weight_2: float "Voronoi feature weight 2"
-#+ * ID|Texture|VoronoiTexture.weight_3 -> weight_3: float "Voronoi feature weight 3"
-#+ * ID|Texture|VoronoiTexture.weight_4 -> weight_4: float "Voronoi feature weight 4"
-#+ * ID|Texture|VoxelDataTexture.image -> image: pointer "NO DESCRIPTION"
-#+ * ID|Texture|VoxelDataTexture.image_user -> image_user: pointer, "(read-only) Parameters defining which layer, pass and frame of the image is displayed"
-#ID|Texture|VoxelDataTexture.voxel_data -> voxel_data: pointer, "(read-only) The voxel data associated with this texture"
-#+ * ID|Texture|WoodTexture.nabla -> nabla: float "Size of derivative offset used for calculating normal"
-#+ * ID|Texture|WoodTexture.noise_basis -> noise_basis: enum "Sets the noise basis used for turbulence"
-#ID|Texture|WoodTexture.noise_scale -> noise_scale: float "Sets scaling for noise input"
-#+ * ID|Texture|WoodTexture.noise_type -> noise_type: enum "NO DESCRIPTION"
-#ID|Texture|WoodTexture.noisebasis_2 -> noisebasis_2: enum "NO DESCRIPTION"
-#+ * ID|Texture|WoodTexture.turbulence -> turbulence: float "Sets the turbulence of the bandnoise and ringnoise types"
-#ID|Texture|WoodTexture.wood_type -> wood_type: enum "NO DESCRIPTION"
-#+ * ID|VectorFont.filepath -> filepath: string, "(read-only)"
-#+ * ID|VectorFont.packed_file -> packed_file: pointer, "(read-only)"
-#+ * ID|WindowManager.keyconfigs -> keyconfigs: collection, "(read-only) Registered key configurations"
-#+ * ID|WindowManager.operators -> operators: collection, "(read-only) Operator registry"
-#+ * ID|WindowManager.windows -> windows: collection, "(read-only) Open windows"
-#+ * ID|World.active_texture -> active_texture: pointer "Active texture slot being displayed"
-#+ * ID|World.active_texture_index -> active_texture_index: int "Index of active texture slot"
-#+ * ID|World.ambient_color -> ambient_color: float[3] "NO DESCRIPTION"
-#+ * ID|World.animation_data -> animation_data: pointer, "(read-only) Animation data for this datablock"
-#ID|World.color_range -> color_range: float "The color range that will be mapped to 0-1"
-#+ * ID|World.exposure -> exposure: float "Amount of exponential color correction for light"
-#+ * ID|World.horizon_color -> horizon_color: float[3] "Color at the horizon"
-#ID|World.light_settings -> light_settings: pointer, "(read-only) World lighting settings"
-#ID|World.mist_settings -> mist_settings: pointer, "(read-only) World mist settings"
-#ID|World.star_settings -> star_settings: pointer, "(read-only) World stars settings"
-#+ * ID|World.texture_slots -> texture_slots: collection, "(read-only) Texture slots defining the mapping and influence of textures"
-#ID|World.use_sky_blend -> use_sky_blend: boolean "Render background with natural progression from horizon to zenith"
-#ID|World.use_sky_paper -> use_sky_paper: boolean "Flatten blend or texture coordinates"
-#ID|World.use_sky_real -> use_sky_real: boolean "Render background with a real horizon, relative to the camera angle"
-#+ * ID|World.zenith_color -> zenith_color: float[3] "Color at the zenith"
-#+ * IKParam.ik_solver -> ik_solver: enum, "(read-only) IK solver for which these parameters are defined, 0 for Legacy, 1 for iTaSC"
-#IKParam|Itasc.damping_epsilon -> damping_epsilon: float "Singular value under which damping is progressively applied. Higher values=more stability, less reactivity. Default=0.1"
-#IKParam|Itasc.damping_max -> damping_max: float "Maximum damping coefficient when singular value is nearly 0. Higher values=more stability, less reactivity. Default=0.5"
-#+ * IKParam|Itasc.feedback -> feedback: float "Feedback coefficient for error correction. Average response time=1/feedback. Default=20"
-#IKParam|Itasc.iterations -> iterations: int "Maximum number of iterations for convergence in case of reiteration"
-#+ * IKParam|Itasc.mode -> mode: enum "NO DESCRIPTION"
-#+ * IKParam|Itasc.precision -> precision: float "Precision of convergence in case of reiteration"
-#IKParam|Itasc.reiteration_method -> reiteration_method: enum "Defines if the solver is allowed to reiterate (converges until precision is met) on none, first or all frames"
-#+ * IKParam|Itasc.solver -> solver: enum "Solving method selection: Automatic damping or manual damping"
-#IKParam|Itasc.step_count -> step_count: int "Divides the frame interval into this many steps"
-#IKParam|Itasc.step_max -> step_max: float "Higher bound for timestep in second in case of automatic substeps"
-#IKParam|Itasc.step_min -> step_min: float "Lower bound for timestep in second in case of automatic substeps"
-#IKParam|Itasc.use_auto_step -> use_auto_step: boolean "Automatically determine the optimal number of steps for best performance/accuracy trade off"
-#IKParam|Itasc.velocity_max -> velocity_max: float "Maximum joint velocity in rad/s. Default=50"
-#+ * ImageUser.fields_per_frame -> fields_per_frame: int "The number of fields per rendered frame (2 fields is 1 image)"
-#ImageUser.frame_duration -> frame_duration: int "Sets the number of images of a movie to use"
-#ImageUser.frame_offset -> frame_offset: int "Offsets the number of the frame to use in the animation"
-#+ * ImageUser.frame_start -> frame_start: int "Sets the global starting frame of the movie"
-#+ * ImageUser.multilayer_layer -> multilayer_layer: int, "(read-only) Layer in multilayer image"
-#+ * ImageUser.multilayer_pass -> multilayer_pass: int, "(read-only) Pass in multilayer image"
-#ImageUser.use_auto_refresh -> use_auto_refresh: boolean "Always refresh image on frame changes"
-#ImageUser.use_cyclic -> use_cyclic: boolean "Cycle the images in the movie"
-#KeyConfig.is_user_defined -> is_user_defined: boolean, "(read-only) Indicates that a keyconfig was defined by the user"
-#+ * KeyConfig.keymaps -> keymaps: collection, "(read-only) Key maps configured as part of this configuration"
-#+ * KeyConfig.name -> name: string "Name of the key configuration"
-#KeyConfigurations.active -> active: pointer "Active wm KeyConfig"
-#KeyConfigurations.default -> default: pointer, "(read-only)"
-#KeyMap.is_modal -> is_modal: boolean, "(read-only) Indicates that a keymap is used for translate modal events for an operator"
-#KeyMap.is_user_defined -> is_user_defined: boolean "Keymap is defined by the user"
-#+ * KeyMap.items -> items: collection, "(read-only) Items in the keymap, linking an operator to an input event"
-#+ * KeyMap.name -> name: string, "(read-only) Name of the key map"
-#+ * KeyMap.region_type -> region_type: enum, "(read-only) Optional region type keymap is associated with"
-#KeyMap.show_expanded_children -> show_expanded_children: boolean "Children expanded in the user interface"
-#KeyMap.show_expanded_items -> show_expanded_items: boolean "Expanded in the user interface"
-#+ * KeyMap.space_type -> space_type: enum, "(read-only) Optional space type keymap is associated with"
-#TODO MOVE TO COLLECTION * KeyMapItem.active -> active: boolean "Activate or deactivate item"
-#+ * KeyMapItem.id -> id: int, "(read-only) ID of the item"
-#+ * KeyMapItem.idname -> idname: string "Identifier of operator to call on input event"
-#+ * KeyMapItem.key_modifier -> key_modifier: enum "Regular key pressed as a modifier"
-#+ * KeyMapItem.map_type -> map_type: enum "Type of event mapping"
-#+ * KeyMapItem.name -> name: string, "(read-only) Name of operator to call on input event"
- + * KeyMapItem.alt -> pressed_alt: boolean "Alt key pressed"
- + * KeyMapItem.any -> pressed_any: boolean "Any modifier keys pressed"
- + * KeyMapItem.ctrl -> pressed_ctrl: boolean "Control key pressed"
- + * KeyMapItem.oskey -> pressed_oskey: boolean "Operating system key pressed"
- + * KeyMapItem.shift -> pressed_shift: boolean "Shift key pressed"
-#+ * KeyMapItem.properties -> properties: pointer, "(read-only) Properties to set when the operator is called"
-#TODO * KeyMapItem.propvalue -> propvalue: enum "The value this event translates to in a modal keymap"
-#KeyMapItem.show_expanded -> show_expanded: boolean "Show key map event and property details in the user interface"
-#+ * KeyMapItem.type -> type: enum "Type of event"
-#+ * KeyMapItem.value -> value: enum "NO DESCRIPTION"
-#+ * Keyframe.co -> co: float[2] "Coordinates of the control point"
-#Keyframe.handle_left -> handle_left: float[2] "Coordinates of the first handle"
-#Keyframe.handle_left_type -> handle_left_type: enum "Handle types"
-#Keyframe.handle_right -> handle_right: float[2] "Coordinates of the second handle"
-#Keyframe.handle_right_type -> handle_right_type: enum "Handle types"
-#+ * Keyframe.interpolation -> interpolation: enum "Interpolation method to use for segment of the curve from this Keyframe until the next Keyframe"
-#+ * Keyframe.select_control_point -> select_control_point: boolean "Control point selection status"
-#+ * Keyframe.select_left_handle -> select_left_handle: boolean "Handle 1 selection status"
-#+ * Keyframe.select_right_handle -> select_right_handle: boolean "Handle 2 selection status"
-#+ * Keyframe.type -> type: enum "The type of keyframe"
-#+ * KeyingSet.active_path_index -> active_path_index: int "Current Keying Set index"
-#KeyingSet.is_path_absolute -> is_path_absolute: boolean, "(read-only) Keying Set defines specific paths/settings to be keyframed (i.e. is not reliant on context info)"
-#+ * KeyingSet.name -> name: string "NO DESCRIPTION"
-#+ * KeyingSet.paths -> paths: collection, "(read-only) Keying Set Paths to define settings that get keyframed together"
-#+ * KeyingSet.type_info -> type_info: pointer, "(read-only) Callback function defines for built-in Keying Sets"
-#KeyingSet.use_insertkey_needed -> use_insertkey_needed: boolean "Only insert keyframes where theyre needed in the relevant F-Curves"
-#KeyingSet.use_insertkey_visual -> use_insertkey_visual: boolean "Insert keyframes based on visual transforms"
-#KeyingSet.use_insertkey_xyz_to_rgb -> use_insertkey_xyz_to_rgb: boolean "Color for newly added transformation F-Curves (Location, Rotation, Scale) and also Color is based on the transform axis"
-#+ * KeyingSetInfo.bl_idname -> bl_idname: string "NO DESCRIPTION"
-#+ * KeyingSetInfo.bl_label -> bl_label: string "NO DESCRIPTION"
-#KeyingSetInfo.use_insertkey_needed -> use_insertkey_needed: boolean "Only insert keyframes where theyre needed in the relevant F-Curves"
-#KeyingSetInfo.use_insertkey_visual -> use_insertkey_visual: boolean "Insert keyframes based on visual transforms"
-#KeyingSetInfo.use_insertkey_xyz_to_rgb -> use_insertkey_xyz_to_rgb: boolean "Color for newly added transformation F-Curves (Location, Rotation, Scale) and also Color is based on the transform axis"
-#+ * KeyingSetPath.array_index -> array_index: int "Index to the specific setting if applicable"
-#+ * KeyingSetPath.data_path -> data_path: string "Path to property setting"
-#+ * KeyingSetPath.group -> group: string "Name of Action Group to assign setting(s) for this path to"
-#KeyingSetPath.group_method -> group_method: enum "Method used to define which Group-name to use"
-#+ * KeyingSetPath.id -> id: pointer "ID-Block that keyframes for Keying Set should be added to (for Absolute Keying Sets only)"
-#+ * KeyingSetPath.id_type -> id_type: enum "Type of ID-block that can be used"
-#KeyingSetPath.use_entire_array -> use_entire_array: boolean "When an array/vector type is chosen (Location, Rotation, Color, etc.), entire array is to be used"
-#KeyingSetPath.use_insertkey_needed -> use_insertkey_needed: boolean "Only insert keyframes where theyre needed in the relevant F-Curves"
-#KeyingSetPath.use_insertkey_visual -> use_insertkey_visual: boolean "Insert keyframes based on visual transforms"
-#KeyingSetPath.use_insertkey_xyz_to_rgb -> use_insertkey_xyz_to_rgb: boolean "Color for newly added transformation F-Curves (Location, Rotation, Scale) and also Color is based on the transform axis"
-#KeyingSetPaths.active -> active: pointer "Active Keying Set used to insert/delete keyframes"
-#KeyingSets.active -> active: pointer "Active Keying Set used to insert/delete keyframes"
-#+ * LampSkySettings.atmosphere_distance_factor -> atmosphere_distance_factor: float "Multiplier to convert blender units to physical distance"
-#+ * LampSkySettings.atmosphere_extinction -> atmosphere_extinction: float "Extinction scattering contribution factor"
-#+ * LampSkySettings.atmosphere_inscattering -> atmosphere_inscattering: float "Scatter contribution factor"
-#+ * LampSkySettings.atmosphere_turbidity -> atmosphere_turbidity: float "Sky turbidity"
-#+ * LampSkySettings.backscattered_light -> backscattered_light: float "Backscattered light"
-#+ * LampSkySettings.horizon_brightness -> horizon_brightness: float "Horizon brightness"
-#+ * LampSkySettings.sky_blend -> sky_blend: float "Blend factor with sky"
-#+ * LampSkySettings.sky_blend_type -> sky_blend_type: enum "Blend mode for combining sun sky with world sky"
-#+ * LampSkySettings.sky_color_space -> sky_color_space: enum "Color space to use for internal XYZ->RGB color conversion"
-#+ * LampSkySettings.sky_exposure -> sky_exposure: float "Strength of sky shading exponential exposure correction"
-#+ * LampSkySettings.spread -> spread: float "Horizon Spread"
-#+ * LampSkySettings.sun_brightness -> sun_brightness: float "Sun brightness"
-#+ * LampSkySettings.sun_intensity -> sun_intensity: float "Sun intensity"
-#+ * LampSkySettings.sun_size -> sun_size: float "Sun size"
-#+ * LampSkySettings.use_atmosphere -> use_atmosphere: boolean "Apply sun effect on atmosphere"
-#+ * LampSkySettings.use_sky -> use_sky: boolean "Apply sun effect on sky"
-#+ * LatticePoint.co -> co: float[3], "(read-only)"
-#LatticePoint.co_deform -> co_deform: float[3] "NO DESCRIPTION"
-#+ * LatticePoint.groups -> groups: collection, "(read-only) Weights for the vertex groups this point is member of"
-#+ * Macro.bl_description -> bl_description: string "NO DESCRIPTION"
-#+ * Macro.bl_idname -> bl_idname: string "NO DESCRIPTION"
-#+ * Macro.bl_label -> bl_label: string "NO DESCRIPTION"
-#+ * Macro.bl_options -> bl_options: enum "Options for this operator type"
-#+ * Macro.name -> name: string, "(read-only)"
-#+ * Macro.properties -> properties: pointer, "(read-only)"
-#+ * Main.actions -> actions: collection, "(read-only) Action datablocks."
-#+ * Main.armatures -> armatures: collection, "(read-only) Armature datablocks."
-#+ * Main.brushes -> brushes: collection, "(read-only) Brush datablocks."
-#+ * Main.cameras -> cameras: collection, "(read-only) Camera datablocks."
-#+ * Main.curves -> curves: collection, "(read-only) Curve datablocks."
-#+ * Main.filepath -> filepath: string, "(read-only) Path to the .blend file"
-#+ * Main.fonts -> fonts: collection, "(read-only) Vector font datablocks."
-#Main.grease_pencil -> grease_pencil: collection, "(read-only) Grease Pencil datablocks."
-#+ * Main.groups -> groups: collection, "(read-only) Group datablocks."
-#+ * Main.images -> images: collection, "(read-only) Image datablocks."
-#Main.is_dirty -> is_dirty: boolean, "(read-only) Has the current session been saved to disk as a .blend file"
-#+ * Main.lamps -> lamps: collection, "(read-only) Lamp datablocks."
-#+ * Main.lattices -> lattices: collection, "(read-only) Lattice datablocks."
-#+ * Main.libraries -> libraries: collection, "(read-only) Library datablocks."
-#+ * Main.materials -> materials: collection, "(read-only) Material datablocks."
-#+ * Main.meshes -> meshes: collection, "(read-only) Mesh datablocks."
-#+ * Main.metaballs -> metaballs: collection, "(read-only) Metaball datablocks."
-#+ * Main.node_groups -> node_groups: collection, "(read-only) Node group datablocks."
-#+ * Main.objects -> objects: collection, "(read-only) Object datablocks."
-#+ * Main.particles -> particles: collection, "(read-only) Particle datablocks."
-#+ * Main.scenes -> scenes: collection, "(read-only) Scene datablocks."
-#+ * Main.screens -> screens: collection, "(read-only) Screen datablocks."
-#+ * Main.scripts -> scripts: collection, "(read-only) Script datablocks (DEPRECATED)."
- + * Main.debug -> show_debug: boolean "Print debugging information in console"
-#+ * Main.sounds -> sounds: collection, "(read-only) Sound datablocks."
-#+ * Main.texts -> texts: collection, "(read-only) Text datablocks."
-#+ * Main.textures -> textures: collection, "(read-only) Texture datablocks."
-#+ * Main.window_managers -> window_managers: collection, "(read-only) Window manager datablocks."
-#+ * Main.worlds -> worlds: collection, "(read-only) World datablocks."
-#+ * MaterialHalo.add -> add: float "Sets the strength of the add effect"
-#+ * MaterialHalo.flare_boost -> flare_boost: float "Gives the flare extra strength"
-#+ * MaterialHalo.flare_seed -> flare_seed: int "Specifies an offset in the flare seed table"
-#+ * MaterialHalo.flare_size -> flare_size: float "Sets the factor by which the flare is larger than the halo"
-#MaterialHalo.flare_subflare_count -> flare_subflare_count: int "Sets the number of subflares"
-#MaterialHalo.flare_subflare_size -> flare_subflare_size: float "Sets the dimension of the subflares, dots and circles"
-#+ * MaterialHalo.hardness -> hardness: int "Sets the hardness of the halo"
-#MaterialHalo.line_count -> line_count: int "Sets the number of star shaped lines rendered over the halo"
-#MaterialHalo.ring_count -> ring_count: int "Sets the number of rings rendered over the halo"
-#+ * MaterialHalo.seed -> seed: int "Randomizes ring dimension and line location"
-#+ * MaterialHalo.size -> size: float "Sets the dimension of the halo"
-#MaterialHalo.star_tip_count -> star_tip_count: int "Sets the number of points on the star shaped halo"
-#MaterialHalo.use_extreme_alpha -> use_extreme_alpha: boolean "Uses extreme alpha"
-#MaterialHalo.use_flare_mode -> use_flare_mode: boolean "Renders halo as a lensflare"
-#MaterialHalo.use_lines -> use_lines: boolean "Renders star shaped lines over halo"
-#MaterialHalo.use_ring -> use_ring: boolean "Renders rings over halo"
-#MaterialHalo.use_shaded -> use_shaded: boolean "Lets halo receive light and shadows from external objects"
-#MaterialHalo.use_soft -> use_soft: boolean "Softens the edges of halos at intersections with other geometry"
-#MaterialHalo.use_star -> use_star: boolean "Renders halo as a star"
-#MaterialHalo.use_texture -> use_texture: boolean "Gives halo a texture"
-#MaterialHalo.use_vertex_normal -> use_vertex_normal: boolean "Uses the vertex normal to specify the dimension of the halo"
-#MaterialPhysics.damping -> damping: float "Damping of the spring force, when inside the physics distance area"
-#+ * MaterialPhysics.distance -> distance: float "Distance of the physics area"
-#+ * MaterialPhysics.elasticity -> elasticity: float "Elasticity of collisions"
-#+ * MaterialPhysics.force -> force: float "Upward spring force, when inside the physics distance area"
-#+ * MaterialPhysics.friction -> friction: float "Coulomb friction coefficient, when inside the physics distance area"
-#MaterialPhysics.use_normal_align -> use_normal_align: boolean "Align dynamic game objects along the surface normal, when inside the physics distance area"
-#+ * MaterialRaytraceMirror.depth -> depth: int "Maximum allowed number of light inter-reflections"
-#+ * MaterialRaytraceMirror.distance -> distance: float "Maximum distance of reflected rays. Reflections further than this range fade to sky color or material color"
-#+ * MaterialRaytraceMirror.fade_to -> fade_to: enum "The color that rays with no intersection within the Max Distance take. Material color can be best for indoor scenes, sky color for outdoor"
-#+ * MaterialRaytraceMirror.fresnel -> fresnel: float "Power of Fresnel for mirror reflection"
-#+ * MaterialRaytraceMirror.fresnel_factor -> fresnel_factor: float "Blending factor for Fresnel"
-#+ * MaterialRaytraceMirror.gloss_anisotropic -> gloss_anisotropic: float "The shape of the reflection, from 0.0 (circular) to 1.0 (fully stretched along the tangent"
-#+ * MaterialRaytraceMirror.gloss_factor -> gloss_factor: float "The shininess of the reflection. Values < 1.0 give diffuse, blurry reflections"
-#+ * MaterialRaytraceMirror.gloss_samples -> gloss_samples: int "Number of cone samples averaged for blurry reflections"
-#+ * MaterialRaytraceMirror.gloss_threshold -> gloss_threshold: float "Threshold for adaptive sampling. If a sample contributes less than this amount (as a percentage), sampling is stopped"
-#+ * MaterialRaytraceMirror.reflect_factor -> reflect_factor: float "Sets the amount mirror reflection for raytrace"
-#+ * MaterialRaytraceMirror.use -> use: boolean "Enable raytraced reflections"
-#+ * MaterialRaytraceTransparency.depth -> depth: int "Maximum allowed number of light inter-refractions"
-#MaterialRaytraceTransparency.depth_max -> depth_max: float "Maximum depth for light to travel through the transparent material before becoming fully filtered (0.0 is disabled)"
-#+ * MaterialRaytraceTransparency.falloff -> falloff: float "Falloff power for transmissivity filter effect (1.0 is linear)"
-#+ * MaterialRaytraceTransparency.filter -> filter: float "Amount to blend in the materials diffuse color in raytraced transparency (simulating absorption)"
-#+ * MaterialRaytraceTransparency.fresnel -> fresnel: float "Power of Fresnel for transparency (Ray or ZTransp)"
-#+ * MaterialRaytraceTransparency.fresnel_factor -> fresnel_factor: float "Blending factor for Fresnel"
-#+ * MaterialRaytraceTransparency.gloss_factor -> gloss_factor: float "The clarity of the refraction. Values < 1.0 give diffuse, blurry refractions"
-#+ * MaterialRaytraceTransparency.gloss_samples -> gloss_samples: int "Number of cone samples averaged for blurry refractions"
-#+ * MaterialRaytraceTransparency.gloss_threshold -> gloss_threshold: float "Threshold for adaptive sampling. If a sample contributes less than this amount (as a percentage), sampling is stopped"
-#+ * MaterialRaytraceTransparency.ior -> ior: float "Sets angular index of refraction for raytraced refraction"
-#+ * MaterialSlot.link -> link: enum "Link material to object or the objects data"
-#+ * MaterialSlot.material -> material: pointer "Material datablock used by this material slot"
-#+ * MaterialSlot.name -> name: string, "(read-only) Material slot name"
-#+ * MaterialStrand.blend_distance -> blend_distance: float "Worldspace distance over which to blend in the surface normal"
-#+ * MaterialStrand.root_size -> root_size: float "Start size of strands in pixels or Blender units"
-#+ * MaterialStrand.shape -> shape: float "Positive values make strands rounder, negative makes strands spiky"
-#MaterialStrand.size_min -> size_min: float "Minimum size of strands in pixels"
-#+ * MaterialStrand.tip_size -> tip_size: float "End size of strands in pixels or Blender units"
-#MaterialStrand.use_blender_units -> use_blender_units: boolean "Use Blender units for widths instead of pixels"
-#MaterialStrand.use_surface_diffuse -> use_surface_diffuse: boolean "Make diffuse shading more similar to shading the surface"
-#MaterialStrand.use_tangent_shading -> use_tangent_shading: boolean "Uses direction of strands as normal for tangent-shading"
-#+ * MaterialStrand.uv_layer -> uv_layer: string "Name of UV layer to override"
-#+ * MaterialStrand.width_fade -> width_fade: float "Transparency along the width of the strand"
-#+ * MaterialSubsurfaceScattering.back -> back: float "Back scattering weight"
-#+ * MaterialSubsurfaceScattering.color -> color: float[3] "Scattering color"
-#+ * MaterialSubsurfaceScattering.color_factor -> color_factor: float "Blend factor for SSS colors"
-#MaterialSubsurfaceScattering.error_threshold -> error_threshold: float "Error tolerance (low values are slower and higher quality)"
-#+ * MaterialSubsurfaceScattering.front -> front: float "Front scattering weight"
-#+ * MaterialSubsurfaceScattering.ior -> ior: float "Index of refraction (higher values are denser)"
-#+ * MaterialSubsurfaceScattering.radius -> radius: float[3] "Mean red/green/blue scattering path length"
-#+ * MaterialSubsurfaceScattering.scale -> scale: float "Object scale factor"
-#+ * MaterialSubsurfaceScattering.texture_factor -> texture_factor: float "Texture scatting blend factor"
-#+ * MaterialSubsurfaceScattering.use -> use: boolean "Enable diffuse subsurface scatting effects in a material"
-#+ * MaterialVolume.asymmetry -> asymmetry: float "Back scattering (-1.0) to Forward scattering (1.0) and the range in between"
-#+ * MaterialVolume.cache_resolution -> cache_resolution: int "Resolution of the voxel grid, low resolutions are faster, high resolutions use more memory"
-#+ * MaterialVolume.density -> density: float "The base density of the volume"
-#+ * MaterialVolume.density_scale -> density_scale: float "Multiplier for the materials density"
-#MaterialVolume.depth_threshold -> depth_threshold: float "Stop ray marching early if transmission drops below this luminance - higher values give speedups in dense volumes at the expense of accuracy"
-#+ * MaterialVolume.emission -> emission: float "Amount of light that gets emitted by the volume"
-#+ * MaterialVolume.emission_color -> emission_color: float[3] "NO DESCRIPTION"
-#MaterialVolume.light_method -> light_method: enum "Method of shading, attenuating, and scattering light through the volume"
-#+ * MaterialVolume.ms_diffusion -> ms_diffusion: float "Diffusion factor, the strength of the blurring effect"
-#+ * MaterialVolume.ms_intensity -> ms_intensity: float "Multiplier for multiple scattered light energy"
-#+ * MaterialVolume.ms_spread -> ms_spread: float "Proportional distance over which the light is diffused"
-#+ * MaterialVolume.reflection -> reflection: float "Multiplier to make out-scattered light brighter or darker (non-physically correct)"
-#+ * MaterialVolume.reflection_color -> reflection_color: float[3] "Colour of light scattered out of the volume (does not affect transmission)"
-#+ * MaterialVolume.scattering -> scattering: float "Amount of light that gets scattered out by the volume - the more out-scattering, the shallower the light will penetrate"
-#MaterialVolume.step_method -> step_method: enum "Method of calculating the steps through the volume"
-#+ * MaterialVolume.step_size -> step_size: float "Distance between subsequent volume depth samples"
-#+ * MaterialVolume.transmission_color -> transmission_color: float[3] "Result color of the volume, after other light has been scattered/absorbed"
-#MaterialVolume.use_external_shadows -> use_external_shadows: boolean "Receive shadows from sources outside the volume (temporary)"
-#MaterialVolume.use_light_cache -> use_light_cache: boolean "Pre-calculate the shading information into a voxel grid, speeds up shading at slightly less accuracy"
-#+ * Menu.bl_idname -> bl_idname: string "If this is set, the menu gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is OBJECT_MT_hello, and bl_idname is not set by the script, then bl_idname = OBJECT_MT_hello"
-#+ * Menu.bl_label -> bl_label: string "The menu label"
-#+ * Menu.layout -> layout: pointer, "(read-only) Defines the structure of the menu in the UI."
-#+ * MeshColor.color1 -> color1: float[3] "NO DESCRIPTION"
-#+ * MeshColor.color2 -> color2: float[3] "NO DESCRIPTION"
-#+ * MeshColor.color3 -> color3: float[3] "NO DESCRIPTION"
-#+ * MeshColor.color4 -> color4: float[3] "NO DESCRIPTION"
-#+ * MeshColorLayer.active -> active: boolean "Sets the layer as active for display and editing"
-#+ * MeshColorLayer.active_render -> active_render: boolean "Sets the layer as active for rendering"
-#+ * MeshColorLayer.data -> data: collection, "(read-only)"
-#+ * MeshColorLayer.name -> name: string "NO DESCRIPTION"
-#+ * MeshEdge.bevel_weight -> bevel_weight: float "Weight used by the Bevel modifier"
-#+ * MeshEdge.crease -> crease: float "Weight used by the Subsurf modifier for creasing"
-#+ * MeshEdge.hide -> hide: boolean "NO DESCRIPTION"
-#+ * MeshEdge.index -> index: int, "(read-only) Index number of the vertex"
-#MeshEdge.is_fgon -> is_fgon: boolean "Fgon edge"
-#MeshEdge.is_loose -> is_loose: boolean "Loose edge"
-#+ * MeshEdge.select -> select: boolean "NO DESCRIPTION"
-#MeshEdge.use_edge_sharp -> use_edge_sharp: boolean "Sharp edge for the EdgeSplit modifier"
-#MeshEdge.use_seam -> use_seam: boolean "Seam edge for UV unwrapping"
-#MeshEdge.vertices -> vertices: int[2] "Vertex indices"
-#+ * MeshFace.area -> area: float, "(read-only) read only area of the face"
-#+ * MeshFace.hide -> hide: boolean "NO DESCRIPTION"
-#+ * MeshFace.index -> index: int, "(read-only) Index number of the vertex"
-#+ * MeshFace.material_index -> material_index: int "NO DESCRIPTION"
-#+ * MeshFace.normal -> normal: float[3], "(read-only) local space unit length normal vector for this face"
-#+ * MeshFace.select -> select: boolean "NO DESCRIPTION"
-#MeshFace.use_smooth -> use_smooth: boolean "NO DESCRIPTION"
-#MeshFace.vertices -> vertices: int[4] "Vertex indices"
-#MeshFace.vertices_raw -> vertices_raw: int[4] "Fixed size vertex indices array"
-#+ * MeshFaces.active -> active: int "The active face for this mesh"
-#+ * MeshFaces.active_tface -> active_tface: pointer, "(read-only) Active Texture Face"
-#+ * MeshFloatProperty.value -> value: float "NO DESCRIPTION"
-#+ * MeshFloatPropertyLayer.data -> data: collection, "(read-only)"
-#+ * MeshFloatPropertyLayer.name -> name: string "NO DESCRIPTION"
-#+ * MeshIntProperty.value -> value: int "NO DESCRIPTION"
-#+ * MeshIntPropertyLayer.data -> data: collection, "(read-only)"
-#+ * MeshIntPropertyLayer.name -> name: string "NO DESCRIPTION"
-#+ * MeshSticky.co -> co: float[2] "Sticky texture coordinate location"
-#+ * MeshStringProperty.value -> value: string "NO DESCRIPTION"
-#+ * MeshStringPropertyLayer.data -> data: collection, "(read-only)"
-#+ * MeshStringPropertyLayer.name -> name: string "NO DESCRIPTION"
-#MeshTextureFace.blend_type -> blend_type: enum "Transparency blending mode"
-#MeshTextureFace.hide -> hide: boolean "Make face invisible"
-#+ * MeshTextureFace.image -> image: pointer "NO DESCRIPTION"
-#MeshTextureFace.pin_uv -> pin_uv: boolean[4] "NO DESCRIPTION"
-#+ * MeshTextureFace.select_uv -> select_uv: boolean[4] "NO DESCRIPTION"
-#MeshTextureFace.use_alpha_sort -> use_alpha_sort: boolean "Enable sorting of faces for correct alpha drawing (slow, use Clip Alpha instead when possible)"
-#MeshTextureFace.use_billboard -> use_billboard: boolean "Billboard with Z-axis constraint"
-#MeshTextureFace.use_bitmap_text -> use_bitmap_text: boolean "Enable bitmap text on face"
-#MeshTextureFace.use_blend_shared -> use_blend_shared: boolean "Blend vertex colors across face when vertices are shared"
-#MeshTextureFace.use_collision -> use_collision: boolean "Use face for collision and ray-sensor detection"
-#MeshTextureFace.use_halo -> use_halo: boolean "Screen aligned billboard"
-#MeshTextureFace.use_image -> use_image: boolean "Render face with texture"
-#MeshTextureFace.use_light -> use_light: boolean "Use light for face"
-#MeshTextureFace.use_object_color -> use_object_color: boolean "Use ObColor instead of vertex colors"
-#MeshTextureFace.use_shadow_cast -> use_shadow_cast: boolean "Face is used for shadow"
-#MeshTextureFace.use_twoside -> use_twoside: boolean "Render face two-sided"
-#+ * MeshTextureFace.uv -> uv: float[8] "NO DESCRIPTION"
-#+ * MeshTextureFace.uv1 -> uv1: float[2] "NO DESCRIPTION"
-#+ * MeshTextureFace.uv2 -> uv2: float[2] "NO DESCRIPTION"
-#+ * MeshTextureFace.uv3 -> uv3: float[2] "NO DESCRIPTION"
-#+ * MeshTextureFace.uv4 -> uv4: float[2] "NO DESCRIPTION"
-#+ * MeshTextureFace.uv_raw -> uv_raw: float[8] "Fixed size UV coordinates array"
-#+ * MeshTextureFaceLayer.active -> active: boolean "Sets the layer as active for display and editing"
-#+ * MeshTextureFaceLayer.active_clone -> active_clone: boolean "Sets the layer as active for cloning"
-#+ * MeshTextureFaceLayer.active_render -> active_render: boolean "Sets the layer as active for rendering"
-#+ * MeshTextureFaceLayer.data -> data: collection, "(read-only)"
-#+ * MeshTextureFaceLayer.name -> name: string "NO DESCRIPTION"
-#+ * MeshVertex.bevel_weight -> bevel_weight: float "Weight used by the Bevel modifier Only Vertices option"
-#+ * MeshVertex.co -> co: float[3] "NO DESCRIPTION"
-#+ * MeshVertex.groups -> groups: collection, "(read-only) Weights for the vertex groups this vertex is member of"
-#+ * MeshVertex.hide -> hide: boolean "NO DESCRIPTION"
-#+ * MeshVertex.index -> index: int, "(read-only) Index number of the vertex"
-#+ * MeshVertex.normal -> normal: float[3] "Vertex Normal"
-#+ * MeshVertex.select -> select: boolean "NO DESCRIPTION"
-#MetaBallElements.active -> active: pointer, "(read-only) Last selected element"
-#MetaElement.co -> co: float[3] "NO DESCRIPTION"
-#+ * MetaElement.hide -> hide: boolean "Hide element"
-#+ * MetaElement.radius -> radius: float "NO DESCRIPTION"
-#+ * MetaElement.rotation -> rotation: float[4] "NO DESCRIPTION"
-#+ * MetaElement.size_x -> size_x: float "Size of element, use of components depends on element type"
-#+ * MetaElement.size_y -> size_y: float "Size of element, use of components depends on element type"
-#+ * MetaElement.size_z -> size_z: float "Size of element, use of components depends on element type"
-#+ * MetaElement.stiffness -> stiffness: float "Stiffness defines how much of the element to fill"
-#+ * MetaElement.type -> type: enum "Metaball types"
-#MetaElement.use_negative -> use_negative: boolean "Set metaball as negative one"
-#+ * Modifier.name -> name: string "Modifier name"
-#Modifier.show_expanded -> show_expanded: boolean "Set modifier expanded in the user interface"
-#Modifier.show_in_editmode -> show_in_editmode: boolean "Use modifier while in the edit mode"
-#Modifier.show_on_cage -> show_on_cage: boolean "Enable direct editing of modifier control cage"
-#Modifier.show_render -> show_render: boolean "Use modifier during rendering"
-#Modifier.show_viewport -> show_viewport: boolean "Realtime display of a modifier"
-#+ * Modifier.type -> type: enum, "(read-only)"
-#Modifier|ArmatureModifier.invert_vertex_group -> invert_vertex_group: boolean "Invert vertex group influence"
-#+ * Modifier|ArmatureModifier.object -> object: pointer "Armature object to deform with"
-#+ * Modifier|ArmatureModifier.use_bone_envelopes -> use_bone_envelopes: boolean "NO DESCRIPTION"
-#Modifier|ArmatureModifier.use_deform_preserve_volume -> use_deform_preserve_volume: boolean "Deform rotation interpolation with quaternions"
-#Modifier|ArmatureModifier.use_multi_modifier -> use_multi_modifier: boolean "Use same input as previous modifier, and mix results using overall vgroup"
-#+ * Modifier|ArmatureModifier.use_vertex_groups -> use_vertex_groups: boolean "NO DESCRIPTION"
-#+ * Modifier|ArmatureModifier.vertex_group -> vertex_group: string "Vertex group name"
-#Modifier|ArrayModifier.constant_offset_displace -> constant_offset_displace: float[3] "NO DESCRIPTION"
-#+ * Modifier|ArrayModifier.count -> count: int "Number of duplicates to make"
-#+ * Modifier|ArrayModifier.curve -> curve: pointer "Curve object to fit array length to"
-#+ * Modifier|ArrayModifier.end_cap -> end_cap: pointer "Mesh object to use as an end cap"
-#Modifier|ArrayModifier.fit_length -> fit_length: float "Length to fit array within"
-#+ * Modifier|ArrayModifier.fit_type -> fit_type: enum "Array length calculation method"
-#Modifier|ArrayModifier.merge_threshold -> merge_threshold: float "Limit below which to merge vertices"
-#+ * Modifier|ArrayModifier.offset_object -> offset_object: pointer "NO DESCRIPTION"
-#Modifier|ArrayModifier.relative_offset_displace -> relative_offset_displace: float[3] "NO DESCRIPTION"
-#+ * Modifier|ArrayModifier.start_cap -> start_cap: pointer "Mesh object to use as a start cap"
-#Modifier|ArrayModifier.use_constant_offset -> use_constant_offset: boolean "Add a constant offset"
-#Modifier|ArrayModifier.use_merge_vertices -> use_merge_vertices: boolean "Merge vertices in adjacent duplicates"
-#Modifier|ArrayModifier.use_merge_vertices_cap -> use_merge_vertices_cap: boolean "Merge vertices in first and last duplicates"
-#Modifier|ArrayModifier.use_object_offset -> use_object_offset: boolean "Add another objects transformation to the total offset"
-#Modifier|ArrayModifier.use_relative_offset -> use_relative_offset: boolean "Add an offset relative to the objects bounding box"
-#Modifier|BevelModifier.angle_limit -> angle_limit: float "Angle above which to bevel edges"
-#+ * Modifier|BevelModifier.edge_weight_method -> edge_weight_method: enum "What edge weight to use for weighting a vertex"
-#+ * Modifier|BevelModifier.limit_method -> limit_method: enum "NO DESCRIPTION"
-#Modifier|BevelModifier.use_only_vertices -> use_only_vertices: boolean "Bevel verts/corners, not edges"
-#+ * Modifier|BevelModifier.width -> width: float "Bevel value/amount"
-#+ * Modifier|BooleanModifier.object -> object: pointer "Mesh object to use for Boolean operation"
-#+ * Modifier|BooleanModifier.operation -> operation: enum "NO DESCRIPTION"
-#Modifier|BuildModifier.frame_duration -> frame_duration: float "Specify the total time the build effect requires"
-#+ * Modifier|BuildModifier.frame_start -> frame_start: float "Specify the start frame of the effect"
-#+ * Modifier|BuildModifier.seed -> seed: int "Specify the seed for random if used"
-#Modifier|BuildModifier.use_random_order -> use_random_order: boolean "Randomize the faces or edges during build"
-#+ * Modifier|CastModifier.cast_type -> cast_type: enum "NO DESCRIPTION"
-#+ * Modifier|CastModifier.factor -> factor: float "NO DESCRIPTION"
-#+ * Modifier|CastModifier.object -> object: pointer "Control object: if available, its location determines the center of the effect"
-#+ * Modifier|CastModifier.radius -> radius: float "Only deform vertices within this distance from the center of the effect (leave as 0 for infinite.)"
-#+ * Modifier|CastModifier.size -> size: float "Size of projection shape (leave as 0 for auto.)"
-#Modifier|CastModifier.use_radius_as_size -> use_radius_as_size: boolean "Use radius as size of projection shape (0 = auto)"
-#+ * Modifier|CastModifier.use_transform -> use_transform: boolean "Use object transform to control projection shape"
-#Modifier|CastModifier.use_x -> use_x: boolean "NO DESCRIPTION"
-#Modifier|CastModifier.use_y -> use_y: boolean "NO DESCRIPTION"
-#Modifier|CastModifier.use_z -> use_z: boolean "NO DESCRIPTION"
-#+ * Modifier|CastModifier.vertex_group -> vertex_group: string "Vertex group name"
-#+ * Modifier|ClothModifier.collision_settings -> collision_settings: pointer, "(read-only)"
-#+ * Modifier|ClothModifier.point_cache -> point_cache: pointer, "(read-only)"
-#+ * Modifier|ClothModifier.settings -> settings: pointer, "(read-only)"
-#+ * Modifier|CollisionModifier.settings -> settings: pointer, "(read-only)"
-#+ * Modifier|CurveModifier.deform_axis -> deform_axis: enum "The axis that the curve deforms along"
-#+ * Modifier|CurveModifier.object -> object: pointer "Curve object to deform with"
-#+ * Modifier|CurveModifier.vertex_group -> vertex_group: string "Vertex group name"
-#+ * Modifier|DecimateModifier.face_count -> face_count: int, "(read-only) The current number of faces in the decimated mesh"
-#+ * Modifier|DecimateModifier.ratio -> ratio: float "Defines the ratio of triangles to reduce to"
-#+ * Modifier|DisplaceModifier.direction -> direction: enum "NO DESCRIPTION"
-#Modifier|DisplaceModifier.mid_level -> mid_level: float "Material value that gives no displacement"
-#+ * Modifier|DisplaceModifier.strength -> strength: float "NO DESCRIPTION"
-#+ * Modifier|DisplaceModifier.texture -> texture: pointer "NO DESCRIPTION"
-#+ * Modifier|DisplaceModifier.texture_coordinate_object -> texture_coordinate_object: pointer "NO DESCRIPTION"
-#Modifier|DisplaceModifier.texture_coords -> texture_coords: enum "NO DESCRIPTION"
-#+ * Modifier|DisplaceModifier.uv_layer -> uv_layer: string "UV layer name"
-#+ * Modifier|DisplaceModifier.vertex_group -> vertex_group: string "Vertex group name"
-#+ * Modifier|EdgeSplitModifier.split_angle -> split_angle: float "Angle above which to split edges"
-#+ * Modifier|EdgeSplitModifier.use_edge_angle -> use_edge_angle: boolean "Split edges with high angle between faces"
-#Modifier|EdgeSplitModifier.use_edge_sharp -> use_edge_sharp: boolean "Split edges that are marked as sharp"
-#+ * Modifier|ExplodeModifier.protect -> protect: float "Clean vertex group edges"
-#Modifier|ExplodeModifier.show_alive -> show_alive: boolean "Show mesh when particles are alive"
-#Modifier|ExplodeModifier.show_dead -> show_dead: boolean "Show mesh when particles are dead"
-#Modifier|ExplodeModifier.show_unborn -> show_unborn: boolean "Show mesh when particles are unborn"
-#Modifier|ExplodeModifier.use_edge_split -> use_edge_split: boolean "Split face edges for nicer shrapnel"
-#Modifier|ExplodeModifier.use_size -> use_size: boolean "Use particle size for the shrapnel"
-#+ * Modifier|ExplodeModifier.vertex_group -> vertex_group: string "NO DESCRIPTION"
-#+ * Modifier|FluidSimulationModifier.settings -> settings: pointer, "(read-only) Settings for how this object is used in the fluid simulation"
-#+ * Modifier|HookModifier.falloff -> falloff: float "If not zero, the distance from the hook where influence ends"
-#+ * Modifier|HookModifier.force -> force: float "Relative force of the hook"
-#+ * Modifier|HookModifier.object -> object: pointer "Parent Object for hook, also recalculates and clears offset"
-#+ * Modifier|HookModifier.subtarget -> subtarget: string "Name of Parent Bone for hook (if applicable), also recalculates and clears offset"
-#+ * Modifier|HookModifier.vertex_group -> vertex_group: string "Vertex group name"
-#+ * Modifier|LatticeModifier.object -> object: pointer "Lattice object to deform with"
-#+ * Modifier|LatticeModifier.vertex_group -> vertex_group: string "Vertex group name"
-#+ * Modifier|MaskModifier.armature -> armature: pointer "Armature to use as source of bones to mask"
-#Modifier|MaskModifier.invert_vertex_group -> invert_vertex_group: boolean "Use vertices that are not part of region defined"
-#+ * Modifier|MaskModifier.mode -> mode: enum "NO DESCRIPTION"
-#+ * Modifier|MaskModifier.vertex_group -> vertex_group: string "Vertex group name"
-#Modifier|MeshDeformModifier.invert_vertex_group -> invert_vertex_group: boolean "Invert vertex group influence"
-#+ * Modifier|MeshDeformModifier.is_bound -> is_bound: boolean, "(read-only) Whether geometry has been bound to control cage"
-#+ * Modifier|MeshDeformModifier.object -> object: pointer "Mesh object to deform with"
-#+ * Modifier|MeshDeformModifier.precision -> precision: int "The grid size for binding"
-#Modifier|MeshDeformModifier.use_dynamic_bind -> use_dynamic_bind: boolean "Recompute binding dynamically on top of other deformers (slower and more memory consuming.)"
-#+ * Modifier|MeshDeformModifier.vertex_group -> vertex_group: string "Vertex group name"
-#Modifier|MirrorModifier.merge_threshold -> merge_threshold: float "Distance from axis within which mirrored vertices are merged"
-#+ * Modifier|MirrorModifier.mirror_object -> mirror_object: pointer "Object to use as mirror"
-#Modifier|MirrorModifier.use_clip -> use_clip: boolean "Prevents vertices from going through the mirror during transform"
-#Modifier|MirrorModifier.use_mirror_u -> use_mirror_u: boolean "Mirror the U texture coordinate around the 0.5 point"
-#Modifier|MirrorModifier.use_mirror_v -> use_mirror_v: boolean "Mirror the V texture coordinate around the 0.5 point"
-#Modifier|MirrorModifier.use_mirror_vertex_groups -> use_mirror_vertex_groups: boolean "Mirror vertex groups (e.g. .R->.L)"
-#Modifier|MirrorModifier.use_x -> use_x: boolean "Enable X axis mirror"
-#Modifier|MirrorModifier.use_y -> use_y: boolean "Enable Y axis mirror"
-#Modifier|MirrorModifier.use_z -> use_z: boolean "Enable Z axis mirror"
-#+ * Modifier|MultiresModifier.filepath -> filepath: string "Path to external displacements file"
-#Modifier|MultiresModifier.is_external -> is_external: boolean, "(read-only) Store multires displacements outside the .blend file, to save memory"
-#+ * Modifier|MultiresModifier.levels -> levels: int "Number of subdivisions to use in the viewport"
-#+ * Modifier|MultiresModifier.render_levels -> render_levels: int "NO DESCRIPTION"
-#+ * Modifier|MultiresModifier.sculpt_levels -> sculpt_levels: int "Number of subdivisions to use in sculpt mode"
-#Modifier|MultiresModifier.show_only_control_edges -> show_only_control_edges: boolean "Skip drawing/rendering of interior subdivided edges"
-#+ * Modifier|MultiresModifier.subdivision_type -> subdivision_type: enum "Selects type of subdivision algorithm"
-#+ * Modifier|MultiresModifier.total_levels -> total_levels: int, "(read-only) Number of subdivisions for which displacements are stored"
-#+ * Modifier|ParticleInstanceModifier.axis -> axis: enum "Pole axis for rotation"
-#+ * Modifier|ParticleInstanceModifier.object -> object: pointer "Object that has the particle system"
-#Modifier|ParticleInstanceModifier.particle_system_index -> particle_system_index: int "NO DESCRIPTION"
-#+ * Modifier|ParticleInstanceModifier.position -> position: float "Position along path"
-#+ * Modifier|ParticleInstanceModifier.random_position -> random_position: float "Randomize position along path"
-#Modifier|ParticleInstanceModifier.show_alive -> show_alive: boolean "Show instances when particles are alive"
-#Modifier|ParticleInstanceModifier.show_dead -> show_dead: boolean "Show instances when particles are dead"
-#Modifier|ParticleInstanceModifier.show_unborn -> show_unborn: boolean "Show instances when particles are unborn"
-#Modifier|ParticleInstanceModifier.use_children -> use_children: boolean "Create instances from child particles"
-#Modifier|ParticleInstanceModifier.use_normal -> use_normal: boolean "Create instances from normal particles"
-#+ * Modifier|ParticleInstanceModifier.use_path -> use_path: boolean "Create instances along particle paths"
-#Modifier|ParticleInstanceModifier.use_preserve_shape -> use_preserve_shape: boolean "Dont stretch the object"
-#Modifier|ParticleInstanceModifier.use_size -> use_size: boolean "Use particle size to scale the instances"
-#+ * Modifier|ParticleSystemModifier.particle_system -> particle_system: pointer, "(read-only) Particle System that this modifier controls"
-#+ * Modifier|ScrewModifier.angle -> angle: float "Angle of revolution"
-#+ * Modifier|ScrewModifier.axis -> axis: enum "Screw axis"
-#+ * Modifier|ScrewModifier.iterations -> iterations: int "Number of times to apply the screw operation"
-#+ * Modifier|ScrewModifier.object -> object: pointer "Object to define the screw axis"
-#+ * Modifier|ScrewModifier.render_steps -> render_steps: int "Number of steps in the revolution"
-#+ * Modifier|ScrewModifier.screw_offset -> screw_offset: float "Offset the revolution along its axis"
-#+ * Modifier|ScrewModifier.steps -> steps: int "Number of steps in the revolution"
-#+ * Modifier|ScrewModifier.use_normal_calculate -> use_normal_calculate: boolean "Calculate the order of edges (needed for meshes, but not curves)"
-#+ * Modifier|ScrewModifier.use_normal_flip -> use_normal_flip: boolean "Flip normals of lathed faces"
-#+ * Modifier|ScrewModifier.use_object_screw_offset -> use_object_screw_offset: boolean "Use the distance between the objects to make a screw"
-#+ * Modifier|ShrinkwrapModifier.auxiliary_target -> auxiliary_target: pointer "Additional mesh target to shrink to"
-#+ * Modifier|ShrinkwrapModifier.offset -> offset: float "Distance to keep from the target"
-#+ * Modifier|ShrinkwrapModifier.subsurf_levels -> subsurf_levels: int "Number of subdivisions that must be performed before extracting vertices positions and normals"
-#+ * Modifier|ShrinkwrapModifier.target -> target: pointer "Mesh target to shrink to"
-#Modifier|ShrinkwrapModifier.use_cull_back_faces -> use_cull_back_faces: boolean "Stop vertices from projecting to a back face on the target"
-#Modifier|ShrinkwrapModifier.use_cull_front_faces -> use_cull_front_faces: boolean "Stop vertices from projecting to a front face on the target"
-#Modifier|ShrinkwrapModifier.use_keep_above_surface -> use_keep_above_surface: boolean "NO DESCRIPTION"
-#Modifier|ShrinkwrapModifier.use_negative_direction -> use_negative_direction: boolean "Allow vertices to move in the negative direction of axis"
-#Modifier|ShrinkwrapModifier.use_positive_direction -> use_positive_direction: boolean "Allow vertices to move in the positive direction of axis"
-#Modifier|ShrinkwrapModifier.use_project_x -> use_project_x: boolean "NO DESCRIPTION"
-#Modifier|ShrinkwrapModifier.use_project_y -> use_project_y: boolean "NO DESCRIPTION"
-#Modifier|ShrinkwrapModifier.use_project_z -> use_project_z: boolean "NO DESCRIPTION"
-#+ * Modifier|ShrinkwrapModifier.vertex_group -> vertex_group: string "Vertex group name"
-#Modifier|ShrinkwrapModifier.wrap_method -> wrap_method: enum "NO DESCRIPTION"
-#Modifier|SimpleDeformModifier.deform_method -> deform_method: enum "NO DESCRIPTION"
-#+ * Modifier|SimpleDeformModifier.factor -> factor: float "NO DESCRIPTION"
-#+ * Modifier|SimpleDeformModifier.limits -> limits: float[2] "Lower/Upper limits for deform"
-#Modifier|SimpleDeformModifier.lock_x -> lock_x: boolean "NO DESCRIPTION"
-#Modifier|SimpleDeformModifier.lock_y -> lock_y: boolean "NO DESCRIPTION"
-#+ * Modifier|SimpleDeformModifier.origin -> origin: pointer "Origin of modifier space coordinates"
-#Modifier|SimpleDeformModifier.use_relative -> use_relative: boolean "Sets the origin of deform space to be relative to the object"
-#+ * Modifier|SimpleDeformModifier.vertex_group -> vertex_group: string "Vertex group name"
-#+ * Modifier|SmokeModifier.coll_settings -> coll_settings: pointer, "(read-only)"
-#+ * Modifier|SmokeModifier.domain_settings -> domain_settings: pointer, "(read-only)"
-#+ * Modifier|SmokeModifier.flow_settings -> flow_settings: pointer, "(read-only)"
-#Modifier|SmokeModifier.smoke_type -> smoke_type: enum "NO DESCRIPTION"
-#+ * Modifier|SmoothModifier.factor -> factor: float "NO DESCRIPTION"
-#Modifier|SmoothModifier.iterations -> iterations: int "NO DESCRIPTION"
-#Modifier|SmoothModifier.use_x -> use_x: boolean "NO DESCRIPTION"
-#Modifier|SmoothModifier.use_y -> use_y: boolean "NO DESCRIPTION"
-#Modifier|SmoothModifier.use_z -> use_z: boolean "NO DESCRIPTION"
-#+ * Modifier|SmoothModifier.vertex_group -> vertex_group: string "Vertex group name"
-#+ * Modifier|SoftBodyModifier.point_cache -> point_cache: pointer, "(read-only)"
-#+ * Modifier|SoftBodyModifier.settings -> settings: pointer, "(read-only)"
-#+ * Modifier|SolidifyModifier.edge_crease_inner -> edge_crease_inner: float "Assign a crease to inner edges"
-#+ * Modifier|SolidifyModifier.edge_crease_outer -> edge_crease_outer: float "Assign a crease to outer edges"
-#+ * Modifier|SolidifyModifier.edge_crease_rim -> edge_crease_rim: float "Assign a crease to the edges making up the rim"
-#Modifier|SolidifyModifier.invert_vertex_group -> invert_vertex_group: boolean "Invert the vertex group influence"
-#+ * Modifier|SolidifyModifier.offset -> offset: float "Offset the thickness from the center"
-#+ * Modifier|SolidifyModifier.thickness -> thickness: float "Thickness of the shell"
-#+ * Modifier|SolidifyModifier.use_even_offset -> use_even_offset: boolean "Maintain thickness by adjusting for sharp corners (slow, disable when not needed)"
-#+ * Modifier|SolidifyModifier.use_quality_normals -> use_quality_normals: boolean "Calculate normals which result in more even thickness (slow, disable when not needed)"
-#+ * Modifier|SolidifyModifier.use_rim -> use_rim: boolean "Create edge loops between the inner and outer surfaces on face edges (slow, disable when not needed)"
-#+ * Modifier|SolidifyModifier.use_rim_material -> use_rim_material: boolean "Use in the next material for rim faces"
-#+ * Modifier|SolidifyModifier.vertex_group -> vertex_group: string "Vertex group name"
-#+ * Modifier|SubsurfModifier.levels -> levels: int "Number of subdivisions to perform"
-#+ * Modifier|SubsurfModifier.render_levels -> render_levels: int "Number of subdivisions to perform when rendering"
-#Modifier|SubsurfModifier.show_only_control_edges -> show_only_control_edges: boolean "Skip drawing/rendering of interior subdivided edges"
-#+ * Modifier|SubsurfModifier.subdivision_type -> subdivision_type: enum "Selects type of subdivision algorithm"
-#Modifier|SubsurfModifier.use_subsurf_uv -> use_subsurf_uv: boolean "Use subsurf to subdivide UVs"
-#+ * Modifier|UVProjectModifier.aspect_x -> aspect_x: float "NO DESCRIPTION"
-#+ * Modifier|UVProjectModifier.aspect_y -> aspect_y: float "NO DESCRIPTION"
-#+ * Modifier|UVProjectModifier.image -> image: pointer "NO DESCRIPTION"
-#Modifier|UVProjectModifier.projector_count -> projector_count: int "Number of projectors to use"
-#+ * Modifier|UVProjectModifier.projectors -> projectors: collection, "(read-only)"
-#+ * Modifier|UVProjectModifier.scale_x -> scale_x: float "NO DESCRIPTION"
-#+ * Modifier|UVProjectModifier.scale_y -> scale_y: float "NO DESCRIPTION"
-#Modifier|UVProjectModifier.use_image_override -> use_image_override: boolean "Override faces current images with the given image"
-#+ * Modifier|UVProjectModifier.uv_layer -> uv_layer: string "UV layer name"
-#+ * Modifier|WaveModifier.damping_time -> damping_time: float "NO DESCRIPTION"
-#+ * Modifier|WaveModifier.falloff_radius -> falloff_radius: float "NO DESCRIPTION"
-#+ * Modifier|WaveModifier.height -> height: float "NO DESCRIPTION"
-#+ * Modifier|WaveModifier.lifetime -> lifetime: float "NO DESCRIPTION"
-#+ * Modifier|WaveModifier.narrowness -> narrowness: float "NO DESCRIPTION"
-#+ * Modifier|WaveModifier.speed -> speed: float "NO DESCRIPTION"
-#+ * Modifier|WaveModifier.start_position_object -> start_position_object: pointer "NO DESCRIPTION"
-#+ * Modifier|WaveModifier.start_position_x -> start_position_x: float "NO DESCRIPTION"
-#+ * Modifier|WaveModifier.start_position_y -> start_position_y: float "NO DESCRIPTION"
-#+ * Modifier|WaveModifier.texture -> texture: pointer "Texture for modulating the wave"
-#Modifier|WaveModifier.texture_coords -> texture_coords: enum "Texture coordinates used for modulating input"
-#Modifier|WaveModifier.texture_coords_object -> texture_coords_object: pointer "NO DESCRIPTION"
-#+ * Modifier|WaveModifier.time_offset -> time_offset: float "Either the starting frame (for positive speed) or ending frame (for negative speed.)"
-#Modifier|WaveModifier.use_cyclic -> use_cyclic: boolean "Cyclic wave effect"
-#Modifier|WaveModifier.use_normal -> use_normal: boolean "Displace along normals"
-#Modifier|WaveModifier.use_normal_x -> use_normal_x: boolean "Enable displacement along the X normal"
-#Modifier|WaveModifier.use_normal_y -> use_normal_y: boolean "Enable displacement along the Y normal"
-#Modifier|WaveModifier.use_normal_z -> use_normal_z: boolean "Enable displacement along the Z normal"
-#Modifier|WaveModifier.use_x -> use_x: boolean "X axis motion"
-#Modifier|WaveModifier.use_y -> use_y: boolean "Y axis motion"
-#+ * Modifier|WaveModifier.uv_layer -> uv_layer: string "UV layer name"
-#+ * Modifier|WaveModifier.vertex_group -> vertex_group: string "Vertex group name for modulating the wave"
-#+ * Modifier|WaveModifier.width -> width: float "NO DESCRIPTION"
-#+ * MotionPath.frame_end -> frame_end: int, "(read-only) End frame of the stored range"
-#+ * MotionPath.frame_start -> frame_start: int, "(read-only) Starting frame of the stored range"
-#MotionPath.is_modified -> is_modified: boolean "Path is being edited"
-#+ * MotionPath.length -> length: int, "(read-only) Number of frames cached"
-#+ * MotionPath.points -> points: collection, "(read-only) Cached positions per frame"
-#+ * MotionPath.use_bone_head -> use_bone_head: boolean, "(read-only) For PoseBone paths, use the bone head location when calculating this path"
-#+ * MotionPathVert.co -> co: float[3] "NO DESCRIPTION"
-#+ * MotionPathVert.select -> select: boolean "Path point is selected for editing"
-#+ * NlaStrip.action -> action: pointer "Action referenced by this strip"
-#NlaStrip.action_frame_end -> action_frame_end: float "NO DESCRIPTION"
-#NlaStrip.action_frame_start -> action_frame_start: float "NO DESCRIPTION"
-#+ * NlaStrip.active -> active: boolean, "(read-only) NLA Strip is active"
-#+ * NlaStrip.blend_in -> blend_in: float "Number of frames at start of strip to fade in influence"
-#+ * NlaStrip.blend_out -> blend_out: float "NO DESCRIPTION"
-#NlaStrip.blend_type -> blend_type: enum "Method used for combining strips result with accumulated result"
-#+ * NlaStrip.extrapolation -> extrapolation: enum "Action to take for gaps past the strip extents"
-#+ * NlaStrip.fcurves -> fcurves: collection, "(read-only) F-Curves for controlling the strips influence and timing"
-#+ * NlaStrip.frame_end -> frame_end: float "NO DESCRIPTION"
-#+ * NlaStrip.frame_start -> frame_start: float "NO DESCRIPTION"
-#+ * NlaStrip.influence -> influence: float "Amount the strip contributes to the current result"
-#+ * NlaStrip.modifiers -> modifiers: collection, "(read-only) Modifiers affecting all the F-Curves in the referenced Action"
-#+ * NlaStrip.mute -> mute: boolean "NLA Strip is not evaluated"
-#+ * NlaStrip.name -> name: string "NO DESCRIPTION"
-#+ * NlaStrip.repeat -> repeat: float "Number of times to repeat the action range"
-#+ * NlaStrip.scale -> scale: float "Scaling factor for action"
-#+ * NlaStrip.select -> select: boolean "NLA Strip is selected"
-#+ * NlaStrip.strip_time -> strip_time: float "Frame of referenced Action to evaluate"
-#+ * NlaStrip.strips -> strips: collection, "(read-only) NLA Strips that this strip acts as a container for (if it is of type Meta)"
-#+ * NlaStrip.type -> type: enum, "(read-only) Type of NLA Strip"
-#NlaStrip.use_animated_influence -> use_animated_influence: boolean "Influence setting is controlled by an F-Curve rather than automatically determined"
-#NlaStrip.use_animated_time -> use_animated_time: boolean "Strip time is controlled by an F-Curve rather than automatically determined"
-#NlaStrip.use_animated_time_cyclic -> use_animated_time_cyclic: boolean "Cycle the animated time within the action start & end"
-#NlaStrip.use_auto_blend -> use_auto_blend: boolean "Number of frames for Blending In/Out is automatically determined from overlapping strips"
-#NlaStrip.use_reverse -> use_reverse: boolean "NLA Strip is played back in reverse order (only when timing is automatically determined)"
-#+ * NlaTrack.active -> active: boolean, "(read-only) NLA Track is active"
-#NlaTrack.is_solo -> is_solo: boolean, "(read-only) NLA Track is evaluated itself (i.e. active Action and all other NLA Tracks in the same AnimData block are disabled)"
-#+ * NlaTrack.lock -> lock: boolean "NLA Track is locked"
-#+ * NlaTrack.mute -> mute: boolean "NLA Track is not evaluated"
-#+ * NlaTrack.name -> name: string "NO DESCRIPTION"
-#+ * NlaTrack.select -> select: boolean "NLA Track is selected"
-#+ * NlaTrack.strips -> strips: collection, "(read-only) NLA Strips on this NLA-track"
-#+ * Node.inputs -> inputs: collection, "(read-only)"
-#+ * Node.location -> location: float[2] "NO DESCRIPTION"
-#+ * Node.name -> name: string "Node name"
-#+ * Node.outputs -> outputs: collection, "(read-only)"
-#+ * Node|CompositorNode.type -> type: enum, "(read-only)"
-#+ * Node|CompositorNode|CompositorNodeAlphaOver.premul -> premul: float "Mix Factor"
-#Node|CompositorNode|CompositorNodeAlphaOver.use_premultiply -> use_premultiply: boolean "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeBilateralblur.iterations -> iterations: int "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeBilateralblur.sigma_color -> sigma_color: float "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeBilateralblur.sigma_space -> sigma_space: float "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeBlur.factor -> factor: float "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeBlur.factor_x -> factor_x: float "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeBlur.factor_y -> factor_y: float "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeBlur.filter_type -> filter_type: enum "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeBlur.size_x -> size_x: int "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeBlur.size_y -> size_y: int "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeBlur.use_bokeh -> use_bokeh: boolean "Uses circular filter (slower)"
-#Node|CompositorNode|CompositorNodeBlur.use_gamma_correction -> use_gamma_correction: boolean "Applies filter on gamma corrected values"
-#Node|CompositorNode|CompositorNodeBlur.use_relative -> use_relative: boolean "Use relative (percent) values to define blur radius"
-#+ * Node|CompositorNode|CompositorNodeChannelMatte.color_space -> color_space: enum "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeChannelMatte.limit_channel -> limit_channel: enum "Limit by this channels value"
-#Node|CompositorNode|CompositorNodeChannelMatte.limit_max -> limit_max: float "Values higher than this setting are 100% opaque"
-#Node|CompositorNode|CompositorNodeChannelMatte.limit_method -> limit_method: enum "Algorithm to use to limit channel"
-#Node|CompositorNode|CompositorNodeChannelMatte.limit_min -> limit_min: float "Values lower than this setting are 100% keyed"
-#Node|CompositorNode|CompositorNodeChannelMatte.matte_channel -> matte_channel: enum "Channel used to determine matte"
-#+ * Node|CompositorNode|CompositorNodeChromaMatte.gain -> gain: float "Alpha gain"
-#+ * Node|CompositorNode|CompositorNodeChromaMatte.lift -> lift: float "Alpha lift"
-#+ * Node|CompositorNode|CompositorNodeChromaMatte.shadow_adjust -> shadow_adjust: float "Adjusts the brightness of any shadows captured"
-#Node|CompositorNode|CompositorNodeChromaMatte.threshold -> threshold: float "Tolerance below which colors will be considered as exact matches"
-#Node|CompositorNode|CompositorNodeChromaMatte.tolerance -> tolerance: float "Tolerance for a color to be considered a keying color"
-#Node|CompositorNode|CompositorNodeColorBalance.correction_method -> correction_method: enum "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeColorBalance.gain -> gain: float[3] "Correction for Highlights"
-#+ * Node|CompositorNode|CompositorNodeColorBalance.gamma -> gamma: float[3] "Correction for Midtones"
-#+ * Node|CompositorNode|CompositorNodeColorBalance.lift -> lift: float[3] "Correction for Shadows"
-#+ * Node|CompositorNode|CompositorNodeColorBalance.offset -> offset: float[3] "Correction for Shadows"
-#+ * Node|CompositorNode|CompositorNodeColorBalance.power -> power: float[3] "Correction for Midtones"
-#+ * Node|CompositorNode|CompositorNodeColorBalance.slope -> slope: float[3] "Correction for Highlights"
-#Node|CompositorNode|CompositorNodeColorMatte.color_hue -> color_hue: float "Hue tolerance for colors to be considered a keying color"
-#Node|CompositorNode|CompositorNodeColorMatte.color_saturation -> color_saturation: float "Saturation Tolerance for the color"
-#Node|CompositorNode|CompositorNodeColorMatte.color_value -> color_value: float "Value Tolerance for the color"
-#+ * Node|CompositorNode|CompositorNodeColorSpill.channel -> channel: enum "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeColorSpill.limit_channel -> limit_channel: enum "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeColorSpill.limit_method -> limit_method: enum "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeColorSpill.ratio -> ratio: float "Scale limit by value"
-#+ * Node|CompositorNode|CompositorNodeColorSpill.unspill_blue -> unspill_blue: float "Blue spillmap scale"
-#+ * Node|CompositorNode|CompositorNodeColorSpill.unspill_green -> unspill_green: float "Green spillmap scale"
-#+ * Node|CompositorNode|CompositorNodeColorSpill.unspill_red -> unspill_red: float "Red spillmap scale"
-#Node|CompositorNode|CompositorNodeColorSpill.use_unspill -> use_unspill: boolean "Compensate all channels (diffenrently) by hand"
-#Node|CompositorNode|CompositorNodeCrop.max_x -> max_x: int "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeCrop.max_y -> max_y: int "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeCrop.min_x -> min_x: int "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeCrop.min_y -> min_y: int "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeCrop.use_crop_size -> use_crop_size: boolean "Whether to crop the size of the input image"
-#+ * Node|CompositorNode|CompositorNodeCurveRGB.mapping -> mapping: pointer, "(read-only)"
-#+ * Node|CompositorNode|CompositorNodeCurveVec.mapping -> mapping: pointer, "(read-only)"
-#+ * Node|CompositorNode|CompositorNodeDBlur.angle -> angle: float "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeDBlur.center_x -> center_x: float "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeDBlur.center_y -> center_y: float "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeDBlur.distance -> distance: float "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeDBlur.iterations -> iterations: int "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeDBlur.spin -> spin: float "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeDBlur.use_wrap -> use_wrap: boolean "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeDBlur.zoom -> zoom: float "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeDefocus.angle -> angle: int "Bokeh shape rotation offset in degrees"
-#Node|CompositorNode|CompositorNodeDefocus.blur_max -> blur_max: float "blur limit, maximum CoC radius, 0=no limit"
-#+ * Node|CompositorNode|CompositorNodeDefocus.bokeh -> bokeh: enum "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeDefocus.f_stop -> f_stop: float "Amount of focal blur, 128=infinity=perfect focus, half the value doubles the blur radius"
-#+ * Node|CompositorNode|CompositorNodeDefocus.samples -> samples: int "Number of samples (16=grainy, higher=less noise)"
-#+ * Node|CompositorNode|CompositorNodeDefocus.threshold -> threshold: float "CoC radius threshold, prevents background bleed on in-focus midground, 0=off"
-#Node|CompositorNode|CompositorNodeDefocus.use_gamma_correction -> use_gamma_correction: boolean "Enable gamma correction before and after main process"
-#Node|CompositorNode|CompositorNodeDefocus.use_preview -> use_preview: boolean "Enable sampling mode, useful for preview when using low samplecounts"
-#+ * Node|CompositorNode|CompositorNodeDefocus.use_zbuffer -> use_zbuffer: boolean "Disable when using an image as input instead of actual zbuffer (auto enabled if node not image based, eg. time node)"
-#+ * Node|CompositorNode|CompositorNodeDefocus.z_scale -> z_scale: float "Scales the Z input when not using a zbuffer, controls maximum blur designated by the color white or input value 1"
-#+ * Node|CompositorNode|CompositorNodeDiffMatte.falloff -> falloff: float "Color distances below this additional threshold are partially keyed"
-#+ * Node|CompositorNode|CompositorNodeDiffMatte.tolerance -> tolerance: float "Color distances below this threshold are keyed"
-#+ * Node|CompositorNode|CompositorNodeDilateErode.distance -> distance: int "Distance to grow/shrink (number of iterations)"
-#+ * Node|CompositorNode|CompositorNodeDistanceMatte.falloff -> falloff: float "Color distances below this additional threshold are partially keyed"
-#+ * Node|CompositorNode|CompositorNodeDistanceMatte.tolerance -> tolerance: float "Color distances below this threshold are keyed"
-#+ * Node|CompositorNode|CompositorNodeFilter.filter_type -> filter_type: enum "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeFlip.axis -> axis: enum "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeGlare.angle_offset -> angle_offset: float "Streak angle offset in degrees"
-#+ * Node|CompositorNode|CompositorNodeGlare.color_modulation -> color_modulation: float "Amount of Color Modulation, modulates colors of streaks and ghosts for a spectral dispersion effect"
-#+ * Node|CompositorNode|CompositorNodeGlare.fade -> fade: float "Streak fade-out factor"
-#+ * Node|CompositorNode|CompositorNodeGlare.glare_type -> glare_type: enum "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeGlare.iterations -> iterations: int "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeGlare.mix -> mix: float "-1 is original image only, 0 is exact 50/50 mix, 1 is processed image only"
-#+ * Node|CompositorNode|CompositorNodeGlare.quality -> quality: enum "If not set to high quality, the effect will be applied to a low-res copy of the source image"
-#+ * Node|CompositorNode|CompositorNodeGlare.size -> size: int "Glow/glare size (not actual size; relative to initial size of bright area of pixels)"
-#+ * Node|CompositorNode|CompositorNodeGlare.streaks -> streaks: int "Total number of streaks"
-#+ * Node|CompositorNode|CompositorNodeGlare.threshold -> threshold: float "The glare filter will only be applied to pixels brighter than this value"
-#Node|CompositorNode|CompositorNodeGlare.use_rotate_45 -> use_rotate_45: boolean "Simple star filter: add 45 degree rotation offset"
-#+ * Node|CompositorNode|CompositorNodeHueCorrect.mapping -> mapping: pointer, "(read-only)"
-#Node|CompositorNode|CompositorNodeHueSat.color_hue -> color_hue: float "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeHueSat.color_saturation -> color_saturation: float "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeHueSat.color_value -> color_value: float "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeIDMask.index -> index: int "Pass index number to convert to alpha"
-#Node|CompositorNode|CompositorNodeImage.frame_duration -> frame_duration: int "Number of images used in animation"
-#Node|CompositorNode|CompositorNodeImage.frame_offset -> frame_offset: int "Offsets the number of the frame to use in the animation"
-#Node|CompositorNode|CompositorNodeImage.frame_start -> frame_start: int "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeImage.image -> image: pointer "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeImage.layer -> layer: enum "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeImage.use_auto_refresh -> use_auto_refresh: boolean "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeImage.use_cyclic -> use_cyclic: boolean "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeInvert.invert_alpha -> invert_alpha: boolean "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeInvert.invert_rgb -> invert_rgb: boolean "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeLensdist.use_fit -> use_fit: boolean "For positive distortion factor only: scale image such that black areas are not visible"
-#Node|CompositorNode|CompositorNodeLensdist.use_jitter -> use_jitter: boolean "Enable/disable jittering; faster, but also noisier"
-#Node|CompositorNode|CompositorNodeLensdist.use_projector -> use_projector: boolean "Enable/disable projector mode. Effect is applied in horizontal direction only"
-#+ * Node|CompositorNode|CompositorNodeLevels.channel -> channel: enum "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeLumaMatte.limit_max -> limit_max: float "Values higher than this setting are 100% opaque"
-#Node|CompositorNode|CompositorNodeLumaMatte.limit_min -> limit_min: float "Values lower than this setting are 100% keyed"
-#+ * Node|CompositorNode|CompositorNodeMapUV.alpha -> alpha: int "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeMapValue.max -> max: float[1] "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeMapValue.min -> min: float[1] "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeMapValue.offset -> offset: float[1] "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeMapValue.size -> size: float[1] "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeMapValue.use_max -> use_max: boolean "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeMapValue.use_min -> use_min: boolean "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeMath.operation -> operation: enum "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeMixRGB.blend_type -> blend_type: enum "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeMixRGB.use_alpha -> use_alpha: boolean "Include alpha of second input in this operation"
-#+ * Node|CompositorNode|CompositorNodeOutputFile.exr_codec -> exr_codec: enum "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeOutputFile.filepath -> filepath: string "Output path for the image, same functionality as render output."
-#+ * Node|CompositorNode|CompositorNodeOutputFile.frame_end -> frame_end: int "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeOutputFile.frame_start -> frame_start: int "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeOutputFile.image_type -> image_type: enum "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeOutputFile.quality -> quality: int "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeOutputFile.use_exr_half -> use_exr_half: boolean "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodePremulKey.mapping -> mapping: enum "Conversion between premultiplied alpha and key alpha"
-#+ * Node|CompositorNode|CompositorNodeRLayers.layer -> layer: enum "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeRLayers.scene -> scene: pointer "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeRotate.filter_type -> filter_type: enum "Method to use to filter rotation"
-#+ * Node|CompositorNode|CompositorNodeScale.space -> space: enum "Coordinate space to scale relative to"
-#+ * Node|CompositorNode|CompositorNodeSplitViewer.axis -> axis: enum "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeSplitViewer.factor -> factor: int "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeTexture.node_output -> node_output: int "For node-based textures, which output node to use"
-#+ * Node|CompositorNode|CompositorNodeTexture.texture -> texture: pointer "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeTime.curve -> curve: pointer, "(read-only)"
-#Node|CompositorNode|CompositorNodeTime.frame_end -> frame_end: int "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeTime.frame_start -> frame_start: int "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeTonemap.adaptation -> adaptation: float "If 0, global; if 1, based on pixel intensity"
-#+ * Node|CompositorNode|CompositorNodeTonemap.contrast -> contrast: float "Set to 0 to use estimate from input image"
-#+ * Node|CompositorNode|CompositorNodeTonemap.correction -> correction: float "If 0, same for all channels; if 1, each independent"
-#+ * Node|CompositorNode|CompositorNodeTonemap.gamma -> gamma: float "If not used, set to 1"
-#+ * Node|CompositorNode|CompositorNodeTonemap.intensity -> intensity: float "If less than zero, darkens image; otherwise, makes it brighter"
-#+ * Node|CompositorNode|CompositorNodeTonemap.key -> key: float "The value the average luminance is mapped to"
-#+ * Node|CompositorNode|CompositorNodeTonemap.offset -> offset: float "Normally always 1, but can be used as an extra control to alter the brightness curve"
-#+ * Node|CompositorNode|CompositorNodeTonemap.tonemap_type -> tonemap_type: enum "NO DESCRIPTION"
-#+ * Node|CompositorNode|CompositorNodeValToRGB.color_ramp -> color_ramp: pointer, "(read-only)"
-#+ * Node|CompositorNode|CompositorNodeVecBlur.factor -> factor: float "Scaling factor for motion vectors; actually shutter speed in frames"
-#+ * Node|CompositorNode|CompositorNodeVecBlur.samples -> samples: int "NO DESCRIPTION"
-#Node|CompositorNode|CompositorNodeVecBlur.speed_max -> speed_max: int "Maximum speed, or zero for none"
-#Node|CompositorNode|CompositorNodeVecBlur.speed_min -> speed_min: int "Minimum speed for a pixel to be blurred; used to separate background from foreground"
-#Node|CompositorNode|CompositorNodeVecBlur.use_curved -> use_curved: boolean "Interpolate between frames in a bezier curve, rather than linearly"
-#+ * Node|NodeGroup.nodetree -> nodetree: pointer "NO DESCRIPTION"
-#+ * Node|ShaderNode.type -> type: enum, "(read-only)"
-#+ * Node|ShaderNode|ShaderNodeExtendedMaterial.invert_normal -> invert_normal: boolean "Material Node uses inverted normal"
-#+ * Node|ShaderNode|ShaderNodeExtendedMaterial.material -> material: pointer "NO DESCRIPTION"
-#Node|ShaderNode|ShaderNodeExtendedMaterial.use_diffuse -> use_diffuse: boolean "Material Node outputs Diffuse"
-#Node|ShaderNode|ShaderNodeExtendedMaterial.use_specular -> use_specular: boolean "Material Node outputs Specular"
-#+ * Node|ShaderNode|ShaderNodeGeometry.color_layer -> color_layer: string "NO DESCRIPTION"
-#+ * Node|ShaderNode|ShaderNodeGeometry.uv_layer -> uv_layer: string "NO DESCRIPTION"
-#+ * Node|ShaderNode|ShaderNodeMapping.location -> location: float[3] "Location offset for the input coordinate"
-#Node|ShaderNode|ShaderNodeMapping.max -> max: float[3] "Maximum value to clamp coordinate to"
-#Node|ShaderNode|ShaderNodeMapping.min -> min: float[3] "Minimum value to clamp coordinate to"
-#+ * Node|ShaderNode|ShaderNodeMapping.rotation -> rotation: float[3] "Rotation offset for the input coordinate"
-#+ * Node|ShaderNode|ShaderNodeMapping.scale -> scale: float[3] "Scale adjustment for the input coordinate"
-#Node|ShaderNode|ShaderNodeMapping.use_max -> use_max: boolean "Clamp the output coordinate to a maximum value"
-#Node|ShaderNode|ShaderNodeMapping.use_min -> use_min: boolean "Clamp the output coordinate to a minimum value"
-#+ * Node|ShaderNode|ShaderNodeMaterial.invert_normal -> invert_normal: boolean "Material Node uses inverted normal"
-#+ * Node|ShaderNode|ShaderNodeMaterial.material -> material: pointer "NO DESCRIPTION"
-#Node|ShaderNode|ShaderNodeMaterial.use_diffuse -> use_diffuse: boolean "Material Node outputs Diffuse"
-#Node|ShaderNode|ShaderNodeMaterial.use_specular -> use_specular: boolean "Material Node outputs Specular"
-#+ * Node|ShaderNode|ShaderNodeMath.operation -> operation: enum "NO DESCRIPTION"
-#+ * Node|ShaderNode|ShaderNodeMixRGB.blend_type -> blend_type: enum "NO DESCRIPTION"
-#Node|ShaderNode|ShaderNodeMixRGB.use_alpha -> use_alpha: boolean "Include alpha of second input in this operation"
-#+ * Node|ShaderNode|ShaderNodeRGBCurve.mapping -> mapping: pointer, "(read-only)"
-#+ * Node|ShaderNode|ShaderNodeTexture.node_output -> node_output: int "For node-based textures, which output node to use"
-#+ * Node|ShaderNode|ShaderNodeTexture.texture -> texture: pointer "NO DESCRIPTION"
-#+ * Node|ShaderNode|ShaderNodeValToRGB.color_ramp -> color_ramp: pointer, "(read-only)"
-#+ * Node|ShaderNode|ShaderNodeVectorCurve.mapping -> mapping: pointer, "(read-only)"
-#+ * Node|ShaderNode|ShaderNodeVectorMath.operation -> operation: enum "NO DESCRIPTION"
-#+ * Node|TextureNode.type -> type: enum, "(read-only)"
-#+ * Node|TextureNode|TextureNodeBricks.offset -> offset: float "NO DESCRIPTION"
-#+ * Node|TextureNode|TextureNodeBricks.offset_frequency -> offset_frequency: int "Offset every N rows"
-#+ * Node|TextureNode|TextureNodeBricks.squash -> squash: float "NO DESCRIPTION"
-#+ * Node|TextureNode|TextureNodeBricks.squash_frequency -> squash_frequency: int "Squash every N rows"
-#+ * Node|TextureNode|TextureNodeCurveRGB.mapping -> mapping: pointer, "(read-only)"
-#+ * Node|TextureNode|TextureNodeCurveTime.curve -> curve: pointer, "(read-only)"
-#Node|TextureNode|TextureNodeCurveTime.frame_end -> frame_end: int "NO DESCRIPTION"
-#Node|TextureNode|TextureNodeCurveTime.frame_start -> frame_start: int "NO DESCRIPTION"
-#+ * Node|TextureNode|TextureNodeImage.image -> image: pointer "NO DESCRIPTION"
-#+ * Node|TextureNode|TextureNodeMath.operation -> operation: enum "NO DESCRIPTION"
-#+ * Node|TextureNode|TextureNodeMixRGB.blend_type -> blend_type: enum "NO DESCRIPTION"
-#Node|TextureNode|TextureNodeMixRGB.use_alpha -> use_alpha: boolean "Include alpha of second input in this operation"
-#Node|TextureNode|TextureNodeOutput.filepath -> filepath: string "NO DESCRIPTION"
-#+ * Node|TextureNode|TextureNodeTexture.node_output -> node_output: int "For node-based textures, which output node to use"
-#+ * Node|TextureNode|TextureNodeTexture.texture -> texture: pointer "NO DESCRIPTION"
-#+ * Node|TextureNode|TextureNodeValToRGB.color_ramp -> color_ramp: pointer, "(read-only)"
-#+ * ObjectBase.layers -> layers: boolean[20] "Layers the object base is on"
-#+ * ObjectBase.object -> object: pointer, "(read-only) Object this base links to"
-#+ * ObjectBase.select -> select: boolean "Object base selection state"
-#+ * ObjectConstraints.active -> active: pointer "Active Object constraint"
-#+ * Operator.bl_description -> bl_description: string "NO DESCRIPTION"
-#+ * Operator.bl_idname -> bl_idname: string "NO DESCRIPTION"
-#+ * Operator.bl_label -> bl_label: string "NO DESCRIPTION"
-#+ * Operator.bl_options -> bl_options: enum "Options for this operator type"
-#+ * Operator.has_reports -> has_reports: boolean, "(read-only) Operator has a set of reports (warnings and errors) from last execution"
-#+ * Operator.layout -> layout: pointer, "(read-only)"
-#+ * Operator.name -> name: string, "(read-only)"
-#+ * Operator.properties -> properties: pointer, "(read-only)"
-#+ * OperatorTypeMacro.properties -> properties: pointer, "(read-only)"
-#+ * PackedFile.size -> size: int, "(read-only) Size of packed file in bytes"
-#+ * Paint.brush -> brush: pointer "Active Brush"
-#+ * Paint.show_brush -> show_brush: boolean "NO DESCRIPTION"
-#+ * Paint.show_brush_on_surface -> show_brush_on_surface: boolean "NO DESCRIPTION"
-#Paint.show_low_resolution -> show_low_resolution: boolean "For multires, show low resolution while navigating the view"
-#+ * Paint|ImagePaint.invert_stencil -> invert_stencil: boolean "Invert the stencil layer"
-#+ * Paint|ImagePaint.normal_angle -> normal_angle: int "Paint most on faces pointing towards the view according to this angle"
-#+ * Paint|ImagePaint.screen_grab_size -> screen_grab_size: int[2] "Size to capture the image for re-projecting"
-#+ * Paint|ImagePaint.seam_bleed -> seam_bleed: int "Extend paint beyond the faces UVs to reduce seams (in pixels, slower)"
-#+ * Paint|ImagePaint.show_brush -> show_brush: boolean "Enables brush shape while not drawing"
-#+ * Paint|ImagePaint.show_brush_draw -> show_brush_draw: boolean "Enables brush shape while drawing"
-#Paint|ImagePaint.use_backface_culling -> use_backface_culling: boolean "Ignore faces pointing away from the view (faster)"
-#+ * Paint|ImagePaint.use_clone_layer -> use_clone_layer: boolean "Use another UV layer as clone source, otherwise use 3D the cursor as the source"
-#+ * Paint|ImagePaint.use_normal_falloff -> use_normal_falloff: boolean "Paint most on faces pointing towards the view"
-#+ * Paint|ImagePaint.use_occlude -> use_occlude: boolean "Only paint onto the faces directly under the brush (slower)"
-#+ * Paint|ImagePaint.use_projection -> use_projection: boolean "Use projection painting for improved consistency in the brush strokes"
-#+ * Paint|ImagePaint.use_stencil_layer -> use_stencil_layer: boolean "Set the mask layer from the UV layer buttons"
-#+ * Paint|Sculpt.lock_x -> lock_x: boolean "Disallow changes to the X axis of vertices"
-#+ * Paint|Sculpt.lock_y -> lock_y: boolean "Disallow changes to the Y axis of vertices"
-#+ * Paint|Sculpt.lock_z -> lock_z: boolean "Disallow changes to the Z axis of vertices"
-#Paint|Sculpt.radial_symmetry -> radial_symmetry: int[3] "Number of times to copy strokes across the surface"
-#+ * Paint|Sculpt.use_symmetry_feather -> use_symmetry_feather: boolean "Reduce the strength of the brush where it overlaps symmetrical daubs"
-#Paint|Sculpt.use_symmetry_x -> use_symmetry_x: boolean "Mirror brush across the X axis"
-#Paint|Sculpt.use_symmetry_y -> use_symmetry_y: boolean "Mirror brush across the Y axis"
-#Paint|Sculpt.use_symmetry_z -> use_symmetry_z: boolean "Mirror brush across the Z axis"
-#Paint|Sculpt.use_threaded -> use_threaded: boolean "Take advantage of multiple CPU cores to improve sculpting performance"
-#Paint|VertexPaint.use_all_faces -> use_all_faces: boolean "Paint on all faces inside brush"
-#Paint|VertexPaint.use_normal -> use_normal: boolean "Applies the vertex normal before painting"
-#Paint|VertexPaint.use_spray -> use_spray: boolean "Keep applying paint effect while holding mouse"
-#+ * Panel.bl_context -> bl_context: string "The context in which the panel belongs to. (TODO: explain the possible combinations bl_context/bl_region_type/bl_space_type)"
-#+ * Panel.bl_idname -> bl_idname: string "If this is set, the panel gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is OBJECT_PT_hello, and bl_idname is not set by the script, then bl_idname = OBJECT_PT_hello"
-#+ * Panel.bl_label -> bl_label: string "The panel label, shows up in the panel header at the right of the triangle used to collapse the panel."
-#+ * Panel.bl_region_type -> bl_region_type: enum "The region where the panel is going to be used in."
-#+ * Panel.bl_show_header -> bl_show_header: boolean "If set to True, the panel shows a header, which contains a clickable arrow to collapse the panel and the label (see bl_label)."
-#+ * Panel.bl_space_type -> bl_space_type: enum "The space where the panel is going to be used in."
- + * Panel.bl_default_closed -> bl_use_closed: boolean "Defines if the panel has to be open or collapsed at the time of its creation. Note that once the panel has been created with bl_default_closed = True, at reload (F8) it stays open."
-#+ * Panel.layout -> layout: pointer, "(read-only) Defines the structure of the panel in the UI."
-#TODO SHOULD THIS BE HERE * Panel.text -> text: string "XXX todo"
-#+ * Particle.alive_state -> alive_state: enum "NO DESCRIPTION"
-#+ * Particle.angular_velocity -> angular_velocity: float[3] "NO DESCRIPTION"
-#Particle.birth_time -> birth_time: float "NO DESCRIPTION"
-#+ * Particle.die_time -> die_time: float "NO DESCRIPTION"
-#Particle.is_exist -> is_exist: boolean, "(read-only)"
-#Particle.is_hair -> is_hair: collection, "(read-only)"
-#+ * Particle.is_visible -> is_visible: boolean, "(read-only)"
-#+ * Particle.keys -> keys: collection, "(read-only)"
-#+ * Particle.lifetime -> lifetime: float "NO DESCRIPTION"
-#+ * Particle.location -> location: float[3] "NO DESCRIPTION"
-#+ * Particle.prev_angular_velocity -> prev_angular_velocity: float[3] "NO DESCRIPTION"
-#+ * Particle.prev_location -> prev_location: float[3] "NO DESCRIPTION"
-#+ * Particle.prev_rotation -> prev_rotation: float[4] "NO DESCRIPTION"
-#+ * Particle.prev_velocity -> prev_velocity: float[3] "NO DESCRIPTION"
-#+ * Particle.rotation -> rotation: float[4] "NO DESCRIPTION"
-#+ * Particle.size -> size: float "NO DESCRIPTION"
-#+ * Particle.velocity -> velocity: float[3] "NO DESCRIPTION"
-#+ * ParticleBrush.count -> count: int "Particle count"
-#+ * ParticleBrush.curve -> curve: pointer, "(read-only)"
-#+ * ParticleBrush.length_mode -> length_mode: enum "NO DESCRIPTION"
-#+ * ParticleBrush.puff_mode -> puff_mode: enum "NO DESCRIPTION"
-#+ * ParticleBrush.size -> size: int "Brush size"
-#+ * ParticleBrush.steps -> steps: int "Brush steps"
-#+ * ParticleBrush.strength -> strength: float "Brush strength"
-#+ * ParticleBrush.use_puff_volume -> use_puff_volume: boolean "Apply puff to unselected end-points, (helps maintain hair volume when puffing root)"
-#+ * ParticleDupliWeight.count -> count: int "The number of times this object is repeated with respect to other objects"
-#+ * ParticleDupliWeight.name -> name: string, "(read-only) Particle dupliobject name"
-#+ * ParticleEdit.brush -> brush: pointer, "(read-only)"
-#ParticleEdit.default_key_count -> default_key_count: int "How many keys to make new particles with"
-#+ * ParticleEdit.draw_step -> draw_step: int "How many steps to draw the path with"
-#+ * ParticleEdit.emitter_distance -> emitter_distance: float "Distance to keep particles away from the emitter"
-#+ * ParticleEdit.fade_frames -> fade_frames: int "How many frames to fade"
-#ParticleEdit.is_editable -> is_editable: boolean, "(read-only) A valid edit mode exists"
-#ParticleEdit.is_hair -> is_hair: boolean, "(read-only) Editing hair"
-#+ * ParticleEdit.object -> object: pointer, "(read-only) The edited object"
-#ParticleEdit.select_mode -> select_mode: enum "Particle select and display mode"
-#ParticleEdit.show_particles -> show_particles: boolean "Draw actual particles"
-#+ * ParticleEdit.tool -> tool: enum "NO DESCRIPTION"
-#+ * ParticleEdit.type -> type: enum "NO DESCRIPTION"
-#ParticleEdit.use_auto_velocity -> use_auto_velocity: boolean "Calculate point velocities automatically"
-#ParticleEdit.use_default_interpolate -> use_default_interpolate: boolean "Interpolate new particles from the existing ones"
-#ParticleEdit.use_emitter_deflect -> use_emitter_deflect: boolean "Keep paths from intersecting the emitter"
-#ParticleEdit.use_fade_time -> use_fade_time: boolean "Fade paths and keys further away from current frame"
-#ParticleEdit.use_preserve_length -> use_preserve_length: boolean "Keep path lengths constant"
-#ParticleEdit.use_preserve_root -> use_preserve_root: boolean "Keep root keys unmodified"
-#ParticleHairKey.co -> co: float[3] "Location of the hair key in object space"
-#ParticleHairKey.co_hair_space -> co_hair_space: float[3] "Location of the hair key in its internal coordinate system, relative to the emitting face"
-#+ * ParticleHairKey.time -> time: float "Relative time of key over hair length"
-#+ * ParticleHairKey.weight -> weight: float "Weight for cloth simulation"
-#+ * ParticleKey.angular_velocity -> angular_velocity: float[3] "Key angular velocity"
-#+ * ParticleKey.location -> location: float[3] "Key location"
-#+ * ParticleKey.rotation -> rotation: float[4] "Key rotation quaterion"
-#+ * ParticleKey.time -> time: float "Time of key over the simulation"
-#+ * ParticleKey.velocity -> velocity: float[3] "Key velocity"
-#+ * ParticleSystem.active_particle_target -> active_particle_target: pointer, "(read-only)"
-#+ * ParticleSystem.active_particle_target_index -> active_particle_target_index: int "NO DESCRIPTION"
-#+ * ParticleSystem.billboard_normal_uv -> billboard_normal_uv: string "UV Layer to control billboard normals"
-#+ * ParticleSystem.billboard_split_uv -> billboard_split_uv: string "UV Layer to control billboard splitting"
-#+ * ParticleSystem.billboard_time_index_uv -> billboard_time_index_uv: string "UV Layer to control billboard time index (X-Y)"
-#+ * ParticleSystem.child_particles -> child_particles: collection, "(read-only) Child particles generated by the particle system"
-#+ * ParticleSystem.cloth -> cloth: pointer, "(read-only) Cloth dynamics for hair"
-#ParticleSystem.has_multiple_caches -> has_multiple_caches: boolean, "(read-only) Particle system has multiple point caches"
-#ParticleSystem.invert_vertex_group_clump -> invert_vertex_group_clump: boolean "Negate the effect of the clump vertex group"
-#ParticleSystem.invert_vertex_group_density -> invert_vertex_group_density: boolean "Negate the effect of the density vertex group"
-#ParticleSystem.invert_vertex_group_field -> invert_vertex_group_field: boolean "Negate the effect of the field vertex group"
-#ParticleSystem.invert_vertex_group_kink -> invert_vertex_group_kink: boolean "Negate the effect of the kink vertex group"
-#ParticleSystem.invert_vertex_group_length -> invert_vertex_group_length: boolean "Negate the effect of the length vertex group"
-#ParticleSystem.invert_vertex_group_rotation -> invert_vertex_group_rotation: boolean "Negate the effect of the rotation vertex group"
-#ParticleSystem.invert_vertex_group_roughness_1 -> invert_vertex_group_roughness_1: boolean "Negate the effect of the roughness 1 vertex group"
-#ParticleSystem.invert_vertex_group_roughness_2 -> invert_vertex_group_roughness_2: boolean "Negate the effect of the roughness 2 vertex group"
-#ParticleSystem.invert_vertex_group_roughness_end -> invert_vertex_group_roughness_end: boolean "Negate the effect of the roughness end vertex group"
-#ParticleSystem.invert_vertex_group_size -> invert_vertex_group_size: boolean "Negate the effect of the size vertex group"
-#ParticleSystem.invert_vertex_group_tangent -> invert_vertex_group_tangent: boolean "Negate the effect of the tangent vertex group"
-#ParticleSystem.invert_vertex_group_velocity -> invert_vertex_group_velocity: boolean "Negate the effect of the velocity vertex group"
-#ParticleSystem.is_editable -> is_editable: boolean, "(read-only) Particle system can be edited in particle mode"
-#ParticleSystem.is_edited -> is_edited: boolean, "(read-only) Particle system has been edited in particle mode"
-#ParticleSystem.is_global_hair -> is_global_hair: boolean, "(read-only) Hair keys are in global coordinate space"
-#+ * ParticleSystem.name -> name: string "Particle system name"
-#+ * ParticleSystem.parent -> parent: pointer "Use this objects coordinate system instead of global coordinate system"
-#+ * ParticleSystem.particles -> particles: collection, "(read-only) Particles generated by the particle system"
-#+ * ParticleSystem.point_cache -> point_cache: pointer, "(read-only)"
-#+ * ParticleSystem.reactor_target_object -> reactor_target_object: pointer "For reactor systems, the object that has the target particle system (empty if same object)"
-#+ * ParticleSystem.reactor_target_particle_system -> reactor_target_particle_system: int "For reactor systems, index of particle system on the target object"
-#+ * ParticleSystem.seed -> seed: int "Offset in the random number table, to get a different randomized result"
-#+ * ParticleSystem.settings -> settings: pointer "Particle system settings"
-#+ * ParticleSystem.targets -> targets: collection, "(read-only) Target particle systems"
-#ParticleSystem.use_hair_dynamics -> use_hair_dynamics: boolean "Enable hair dynamics using cloth simulation"
-#ParticleSystem.use_keyed_timing -> use_keyed_timing: boolean "Use key times"
-#+ * ParticleSystem.vertex_group_clump -> vertex_group_clump: string "Vertex group to control clump"
-#+ * ParticleSystem.vertex_group_density -> vertex_group_density: string "Vertex group to control density"
-#+ * ParticleSystem.vertex_group_field -> vertex_group_field: string "Vertex group to control field"
-#+ * ParticleSystem.vertex_group_kink -> vertex_group_kink: string "Vertex group to control kink"
-#+ * ParticleSystem.vertex_group_length -> vertex_group_length: string "Vertex group to control length"
-#+ * ParticleSystem.vertex_group_rotation -> vertex_group_rotation: string "Vertex group to control rotation"
-#ParticleSystem.vertex_group_roughness_1 -> vertex_group_roughness_1: string "Vertex group to control roughness 1"
-#ParticleSystem.vertex_group_roughness_2 -> vertex_group_roughness_2: string "Vertex group to control roughness 2"
-#+ * ParticleSystem.vertex_group_roughness_end -> vertex_group_roughness_end: string "Vertex group to control roughness end"
-#+ * ParticleSystem.vertex_group_size -> vertex_group_size: string "Vertex group to control size"
-#+ * ParticleSystem.vertex_group_tangent -> vertex_group_tangent: string "Vertex group to control tangent"
-#+ * ParticleSystem.vertex_group_velocity -> vertex_group_velocity: string "Vertex group to control velocity"
-#ParticleTarget.alliance -> alliance: enum "NO DESCRIPTION"
-#+ * ParticleTarget.duration -> duration: float "NO DESCRIPTION"
-#ParticleTarget.is_valid -> is_valid: boolean "Keyed particles target is valid"
-#+ * ParticleTarget.name -> name: string, "(read-only) Particle target name"
-#+ * ParticleTarget.object -> object: pointer "The object that has the target particle system (empty if same object)"
-#+ * ParticleTarget.system -> system: int "The index of particle system on the target object"
-#+ * ParticleTarget.time -> time: float "NO DESCRIPTION"
-#+ * PointCache.active_point_cache_index -> active_point_cache_index: int "NO DESCRIPTION"
-#+ * PointCache.filepath -> filepath: string "Cache file path"
-#+ * PointCache.frame_end -> frame_end: int "Frame on which the simulation stops"
-#+ * PointCache.frame_start -> frame_start: int "Frame on which the simulation starts"
-#PointCache.frame_step -> frame_step: int "Number of frames between cached frames"
-#+ * PointCache.frames_skipped -> frames_skipped: boolean, "(read-only)"
-#+ * PointCache.index -> index: int "Index number of cache files"
-#+ * PointCache.info -> info: string, "(read-only) Info on current cache status"
-#PointCache.is_baked -> is_baked: boolean, "(read-only)"
-#PointCache.is_baking -> is_baking: boolean, "(read-only)"
-#PointCache.is_outdated -> is_outdated: boolean, "(read-only)"
-#+ * PointCache.name -> name: string "Cache name"
-#PointCache.point_caches -> point_caches: collection, "(read-only) Point cache list"
-#PointCache.use_disk_cache -> use_disk_cache: boolean "Save cache files to disk (.blend file must be saved first)"
-#PointCache.use_external -> use_external: boolean "Read cache from an external location"
-#+ * PointCache.use_library_path -> use_library_path: boolean "Use this files path when library linked into another file."
-#PointCache.use_quick_cache -> use_quick_cache: boolean "Update simulation with cache steps"
-#+ * PointDensity.color_ramp -> color_ramp: pointer, "(read-only)"
-#+ * PointDensity.color_source -> color_source: enum "Data to derive color results from"
-#+ * PointDensity.falloff -> falloff: enum "Method of attenuating density by distance from the point"
-#PointDensity.falloff_soft -> falloff_soft: float "Softness of the soft falloff option"
-#+ * PointDensity.noise_basis -> noise_basis: enum "Noise formula used for turbulence"
-#+ * PointDensity.object -> object: pointer "Object to take point data from"
-#PointDensity.particle_cache_space -> particle_cache_space: enum "Co-ordinate system to cache particles in"
-#+ * PointDensity.particle_system -> particle_system: pointer "Particle System to render as points"
-#+ * PointDensity.point_source -> point_source: enum "Point data to use as renderable point density"
-#+ * PointDensity.radius -> radius: float "Radius from the shaded sample to look for points within"
-#+ * PointDensity.speed_scale -> speed_scale: float "Multiplier to bring particle speed within an acceptable range"
-#+ * PointDensity.turbulence_depth -> turbulence_depth: int "Level of detail in the added turbulent noise"
-#+ * PointDensity.turbulence_influence -> turbulence_influence: enum "Method for driving added turbulent noise"
-#PointDensity.turbulence_scale -> turbulence_scale: float "Scale of the added turbulent noise"
-#+ * PointDensity.turbulence_strength -> turbulence_strength: float "NO DESCRIPTION"
-#PointDensity.use_turbulence -> use_turbulence: boolean "Add directed noise to the density at render-time"
-#PointDensity.vertex_cache_space -> vertex_cache_space: enum "Co-ordinate system to cache vertices in"
-#+ * Pose.active_bone_group_index -> active_bone_group_index: int "Active index in bone groups array"
-#+ * Pose.animation_visualisation -> animation_visualisation: pointer, "(read-only) Animation data for this datablock"
-#+ * Pose.bone_groups -> bone_groups: collection, "(read-only) Groups of the bones"
-#+ * Pose.bones -> bones: collection, "(read-only) Individual pose bones for the armature"
-#+ * Pose.ik_param -> ik_param: pointer, "(read-only) Parameters for IK solver"
-#+ * Pose.ik_solver -> ik_solver: enum "Selection of IK solver for IK chain, current choice is 0 for Legacy, 1 for iTaSC"
-#+ * PoseBone.bone -> bone: pointer, "(read-only) Bone associated with this PoseBone"
-#+ * PoseBone.bone_group -> bone_group: pointer "Bone Group this pose channel belongs to"
-#+ * PoseBone.bone_group_index -> bone_group_index: int "Bone Group this pose channel belongs to (0=no group)"
-#+ * PoseBone.child -> child: pointer, "(read-only) Child of this pose bone"
-#+ * PoseBone.constraints -> constraints: collection, "(read-only) Constraints that act on this PoseChannel"
-#+ * PoseBone.custom_shape -> custom_shape: pointer "Object that defines custom draw type for this bone"
-#+ * PoseBone.custom_shape_transform -> custom_shape_transform: pointer "Bone that defines the display transform of this custom shape"
-#+ * PoseBone.head -> head: float[3], "(read-only) Location of head of the channels bone"
-#PoseBone.ik_linear_weight -> ik_linear_weight: float "Weight of scale constraint for IK"
-#+ * PoseBone.ik_max_x -> ik_max_x: float "Maximum angles for IK Limit"
-#+ * PoseBone.ik_max_y -> ik_max_y: float "Maximum angles for IK Limit"
-#+ * PoseBone.ik_max_z -> ik_max_z: float "Maximum angles for IK Limit"
-#+ * PoseBone.ik_min_x -> ik_min_x: float "Minimum angles for IK Limit"
-#+ * PoseBone.ik_min_y -> ik_min_y: float "Minimum angles for IK Limit"
-#+ * PoseBone.ik_min_z -> ik_min_z: float "Minimum angles for IK Limit"
-#PoseBone.ik_rotation_weight -> ik_rotation_weight: float "Weight of rotation constraint for IK"
-#+ * PoseBone.ik_stiffness_x -> ik_stiffness_x: float "IK stiffness around the X axis"
-#+ * PoseBone.ik_stiffness_y -> ik_stiffness_y: float "IK stiffness around the Y axis"
-#+ * PoseBone.ik_stiffness_z -> ik_stiffness_z: float "IK stiffness around the Z axis"
-#+ * PoseBone.ik_stretch -> ik_stretch: float "Allow scaling of the bone for IK"
-#PoseBone.is_in_ik_chain -> is_in_ik_chain: boolean, "(read-only) Is part of an IK chain"
-#+ * PoseBone.location -> location: float[3] "NO DESCRIPTION"
-#PoseBone.lock_ik_x -> lock_ik_x: boolean "Disallow movement around the X axis"
-#PoseBone.lock_ik_y -> lock_ik_y: boolean "Disallow movement around the Y axis"
-#PoseBone.lock_ik_z -> lock_ik_z: boolean "Disallow movement around the Z axis"
-#+ * PoseBone.lock_location -> lock_location: boolean[3] "Lock editing of location in the interface"
-#+ * PoseBone.lock_rotation -> lock_rotation: boolean[3] "Lock editing of rotation in the interface"
-#+ * PoseBone.lock_rotation_w -> lock_rotation_w: boolean "Lock editing of angle component of four-component rotations in the interface"
-#+ * PoseBone.lock_rotations_4d -> lock_rotations_4d: boolean "Lock editing of four component rotations by components (instead of as Eulers)"
-#+ * PoseBone.lock_scale -> lock_scale: boolean[3] "Lock editing of scale in the interface"
-#+ * PoseBone.matrix -> matrix: float[16], "(read-only) Final 4x4 matrix for this channel"
-#+ * PoseBone.matrix_channel -> matrix_channel: float[16], "(read-only) 4x4 matrix, before constraints"
-#+ * PoseBone.matrix_local -> matrix_local: float[16] "Matrix representing the parent relative location, scale and rotation. Provides an alternative access to these properties."
-#+ * PoseBone.motion_path -> motion_path: pointer, "(read-only) Motion Path for this element"
-#+ * PoseBone.name -> name: string "NO DESCRIPTION"
-#+ * PoseBone.parent -> parent: pointer, "(read-only) Parent of this pose bone"
-#+ * PoseBone.rotation_axis_angle -> rotation_axis_angle: float[4] "Angle of Rotation for Axis-Angle rotation representation"
-#+ * PoseBone.rotation_euler -> rotation_euler: float[3] "Rotation in Eulers"
-#+ * PoseBone.rotation_mode -> rotation_mode: enum "NO DESCRIPTION"
-#+ * PoseBone.rotation_quaternion -> rotation_quaternion: float[4] "Rotation in Quaternions"
-#+ * PoseBone.scale -> scale: float[3] "NO DESCRIPTION"
-#+ * PoseBone.select -> select: boolean "NO DESCRIPTION"
-#+ * PoseBone.tail -> tail: float[3], "(read-only) Location of tail of the channels bone"
-#PoseBone.use_ik_limit_x -> use_ik_limit_x: boolean "Limit movement around the X axis"
-#PoseBone.use_ik_limit_y -> use_ik_limit_y: boolean "Limit movement around the Y axis"
-#PoseBone.use_ik_limit_z -> use_ik_limit_z: boolean "Limit movement around the Z axis"
-#PoseBone.use_ik_linear_control -> use_ik_linear_control: boolean "Apply channel size as IK constraint if stretching is enabled"
-#PoseBone.use_ik_rotation_control -> use_ik_rotation_control: boolean "Apply channel rotation as IK constraint"
-#+ * PoseBoneConstraints.active -> active: pointer "Active PoseChannel constraint"
-#+ * Property.description -> description: string, "(read-only) Description of the property for tooltips"
-#+ * Property.identifier -> identifier: string, "(read-only) Unique name used in the code and scripting"
-#+ * Property.is_never_none -> is_never_none: boolean, "(read-only) True when this value cant be set to None"
-#Property.is_output -> is_output: boolean, "(read-only) True when this property is an output value from an RNA function"
-#+ * Property.is_readonly -> is_readonly: boolean, "(read-only) Property is editable through RNA"
-#Property.is_registered -> is_registered: boolean, "(read-only) Property is registered as part of type registration"
-#Property.is_registered_optional -> is_registered_optional: boolean, "(read-only) Property is optionally registered as part of type registration"
-#+ * Property.is_required -> is_required: boolean, "(read-only) False when this property is an optional argument in an RNA function"
-#+ * Property.name -> name: string, "(read-only) Human readable name"
-#+ * Property.srna -> srna: pointer, "(read-only) Struct definition used for properties assigned to this item"
-#+ * Property.subtype -> subtype: enum, "(read-only) Semantic interpretation of the property"
-#+ * Property.type -> type: enum, "(read-only) Data type of the property"
-#+ * Property.unit -> unit: enum, "(read-only) Type of units for this property"
-#+ * Property|BooleanProperty.array_length -> array_length: int, "(read-only) Maximum length of the array, 0 means unlimited"
-#+ * Property|BooleanProperty.default -> default: boolean, "(read-only) Default value for this number"
-#+ * Property|BooleanProperty.default_array -> default_array: boolean[3], "(read-only) Default value for this array"
-#+ * Property|CollectionProperty.fixed_type -> fixed_type: pointer, "(read-only) Fixed pointer type, empty if variable type"
-#+ * Property|EnumProperty.default -> default: enum, "(read-only) Default value for this enum"
-#+ * Property|EnumProperty.items -> items: collection, "(read-only) Possible values for the property"
-#+ * Property|FloatProperty.array_length -> array_length: int, "(read-only) Maximum length of the array, 0 means unlimited"
-#+ * Property|FloatProperty.default -> default: float, "(read-only) Default value for this number"
-#+ * Property|FloatProperty.default_array -> default_array: float[3], "(read-only) Default value for this array"
-#+ * Property|FloatProperty.hard_max -> hard_max: float, "(read-only) Maximum value used by buttons"
-#+ * Property|FloatProperty.hard_min -> hard_min: float, "(read-only) Minimum value used by buttons"
-#+ * Property|FloatProperty.precision -> precision: int, "(read-only) Number of digits after the dot used by buttons"
-#+ * Property|FloatProperty.soft_max -> soft_max: float, "(read-only) Maximum value used by buttons"
-#+ * Property|FloatProperty.soft_min -> soft_min: float, "(read-only) Minimum value used by buttons"
-#+ * Property|FloatProperty.step -> step: float, "(read-only) Step size used by number buttons, for floats 1/100th of the step size"
-#+ * Property|IntProperty.array_length -> array_length: int, "(read-only) Maximum length of the array, 0 means unlimited"
-#+ * Property|IntProperty.default -> default: int, "(read-only) Default value for this number"
-#+ * Property|IntProperty.default_array -> default_array: int[3], "(read-only) Default value for this array"
-#+ * Property|IntProperty.hard_max -> hard_max: int, "(read-only) Maximum value used by buttons"
-#+ * Property|IntProperty.hard_min -> hard_min: int, "(read-only) Minimum value used by buttons"
-#+ * Property|IntProperty.soft_max -> soft_max: int, "(read-only) Maximum value used by buttons"
-#+ * Property|IntProperty.soft_min -> soft_min: int, "(read-only) Minimum value used by buttons"
-#+ * Property|IntProperty.step -> step: int, "(read-only) Step size used by number buttons, for floats 1/100th of the step size"
-#+ * Property|PointerProperty.fixed_type -> fixed_type: pointer, "(read-only) Fixed pointer type, empty if variable type"
-#+ * Property|StringProperty.default -> default: string, "(read-only) string default value"
-#Property|StringProperty.length_max -> length_max: int, "(read-only) Maximum length of the string, 0 means unlimited"
-#+ * RGBANodeSocket.default_value -> default_value: float[4] "Default value of the socket when no link is attached"
-#+ * RGBANodeSocket.name -> name: string, "(read-only) Socket name"
-#+ * Region.height -> height: int, "(read-only) Region height"
-#+ * Region.id -> id: int, "(read-only) Unique ID for this region"
-#+ * Region.type -> type: enum, "(read-only) Type of this region"
-#+ * Region.width -> width: int, "(read-only) Region width"
-#+ * RegionView3D.lock_rotation -> lock_rotation: boolean "Lock view rotation in side views"
-#+ * RegionView3D.perspective_matrix -> perspective_matrix: float[16], "(read-only) Current perspective matrix of the 3D region"
-#RegionView3D.show_sync_view -> show_sync_view: boolean "Sync view position between side views"
-#RegionView3D.use_box_clip -> use_box_clip: boolean "Clip objects based on whats visible in other side views"
-#+ * RegionView3D.view_distance -> view_distance: float "Distance to the view location"
-#+ * RegionView3D.view_location -> view_location: float[3] "View pivot location"
-#+ * RegionView3D.view_matrix -> view_matrix: float[16], "(read-only) Current view matrix of the 3D region"
-#+ * RegionView3D.view_perspective -> view_perspective: enum "View Perspective"
-#RegionView3D.view_rotate_method -> view_rotate_method: float[4] "Rotation in quaternions (keep normalized)"
-#+ * RenderEngine.bl_idname -> bl_idname: string "NO DESCRIPTION"
-#+ * RenderEngine.bl_label -> bl_label: string "NO DESCRIPTION"
-#RenderEngine.bl_use_postprocess -> bl_use_postprocess: boolean "NO DESCRIPTION"
-#RenderEngine.bl_use_preview -> bl_use_preview: boolean "NO DESCRIPTION"
-#RenderLayer.exclude_ambient_occlusion -> exclude_ambient_occlusion: boolean, "(read-only) Exclude AO pass from combined"
-#RenderLayer.exclude_emit -> exclude_emit: boolean, "(read-only) Exclude emission pass from combined"
-#RenderLayer.exclude_environment -> exclude_environment: boolean, "(read-only) Exclude environment pass from combined"
-#RenderLayer.exclude_indirect -> exclude_indirect: boolean, "(read-only) Exclude indirect pass from combined"
-#RenderLayer.exclude_reflection -> exclude_reflection: boolean, "(read-only) Exclude raytraced reflection pass from combined"
-#RenderLayer.exclude_refraction -> exclude_refraction: boolean, "(read-only) Exclude raytraced refraction pass from combined"
-#RenderLayer.exclude_shadow -> exclude_shadow: boolean, "(read-only) Exclude shadow pass from combined"
-#RenderLayer.exclude_specular -> exclude_specular: boolean, "(read-only) Exclude specular pass from combined"
-#RenderLayer.invert_zmask -> invert_zmask: boolean, "(read-only) For Zmask, only render what is behind solid z values instead of in front"
-#RenderLayer.layers -> layers: boolean[20], "(read-only) Scene layers included in this render layer"
-#RenderLayer.layers_zmask -> layers_zmask: boolean[20], "(read-only) Zmask scene layers"
-#+ * RenderLayer.light_override -> light_override: pointer, "(read-only) Group to override all other lights in this render layer"
-#+ * RenderLayer.material_override -> material_override: pointer, "(read-only) Material to override all other materials in this render layer"
-#+ * RenderLayer.name -> name: string, "(read-only) Render layer name"
-#+ * RenderLayer.passes -> passes: collection, "(read-only)"
-#+ * RenderLayer.rect -> rect: float "NO DESCRIPTION"
-#+ * RenderLayer.use -> use: boolean, "(read-only) Disable or enable the render layer"
-#RenderLayer.use_all_z -> use_all_z: boolean, "(read-only) Fill in Z values for solid faces in invisible layers, for masking"
-#RenderLayer.use_edge_enhance -> use_edge_enhance: boolean, "(read-only) Render Edge-enhance in this Layer (only works for Solid faces)"
-#RenderLayer.use_halo -> use_halo: boolean, "(read-only) Render Halos in this Layer (on top of Solid)"
-#RenderLayer.use_pass_ambient_occlusion -> use_pass_ambient_occlusion: boolean, "(read-only) Deliver AO pass"
-#RenderLayer.use_pass_color -> use_pass_color: boolean, "(read-only) Deliver shade-less color pass"
-#RenderLayer.use_pass_combined -> use_pass_combined: boolean, "(read-only) Deliver full combined RGBA buffer"
-#RenderLayer.use_pass_diffuse -> use_pass_diffuse: boolean, "(read-only) Deliver diffuse pass"
-#RenderLayer.use_pass_emit -> use_pass_emit: boolean, "(read-only) Deliver emission pass"
-#RenderLayer.use_pass_environment -> use_pass_environment: boolean, "(read-only) Deliver environment lighting pass"
-#RenderLayer.use_pass_indirect -> use_pass_indirect: boolean, "(read-only) Deliver indirect lighting pass"
-#RenderLayer.use_pass_mist -> use_pass_mist: boolean, "(read-only) Deliver mist factor pass (0.0-1.0)"
-#RenderLayer.use_pass_normal -> use_pass_normal: boolean, "(read-only) Deliver normal pass"
-#RenderLayer.use_pass_object_index -> use_pass_object_index: boolean, "(read-only) Deliver object index pass"
-#RenderLayer.use_pass_reflection -> use_pass_reflection: boolean, "(read-only) Deliver raytraced reflection pass"
-#RenderLayer.use_pass_refraction -> use_pass_refraction: boolean, "(read-only) Deliver raytraced refraction pass"
-#RenderLayer.use_pass_shadow -> use_pass_shadow: boolean, "(read-only) Deliver shadow pass"
-#RenderLayer.use_pass_specular -> use_pass_specular: boolean, "(read-only) Deliver specular pass"
-#RenderLayer.use_pass_uv -> use_pass_uv: boolean, "(read-only) Deliver texture UV pass"
-#RenderLayer.use_pass_vector -> use_pass_vector: boolean, "(read-only) Deliver speed vector pass"
-#RenderLayer.use_pass_z -> use_pass_z: boolean, "(read-only) Deliver Z values pass"
-#RenderLayer.use_sky -> use_sky: boolean, "(read-only) Render Sky in this Layer"
-#RenderLayer.use_solid -> use_solid: boolean, "(read-only) Render Solid faces in this Layer"
-#RenderLayer.use_strand -> use_strand: boolean, "(read-only) Render Strands in this Layer"
-#RenderLayer.use_zmask -> use_zmask: boolean, "(read-only) Only render whats in front of the solid z values"
-#RenderLayer.use_ztransp -> use_ztransp: boolean, "(read-only) Render Z-Transparent faces in this Layer (On top of Solid and Halos)"
-#+ * RenderPass.channel_id -> channel_id: string, "(read-only)"
-#+ * RenderPass.channels -> channels: int, "(read-only)"
-#+ * RenderPass.name -> name: string, "(read-only)"
-#+ * RenderPass.rect -> rect: float "NO DESCRIPTION"
-#+ * RenderPass.type -> type: enum, "(read-only)"
-#+ * RenderResult.layers -> layers: collection, "(read-only)"
-#+ * RenderResult.resolution_x -> resolution_x: int, "(read-only)"
-#+ * RenderResult.resolution_y -> resolution_y: int, "(read-only)"
-#+ * RenderSettings.active_layer_index -> active_layer_index: int "Active index in render layer array"
-#+ * RenderSettings.alpha_mode -> alpha_mode: enum "Representation of alpha information in the RGBA pixels"
-#+ * RenderSettings.antialiasing_samples -> antialiasing_samples: enum "Amount of anti-aliasing samples per pixel"
-#+ * RenderSettings.bake_aa_mode -> bake_aa_mode: enum "NO DESCRIPTION"
-#+ * RenderSettings.bake_bias -> bake_bias: float "Bias towards faces further away from the object (in blender units)"
-#+ * RenderSettings.bake_distance -> bake_distance: float "Maximum distance from active object to other object (in blender units"
-#+ * RenderSettings.bake_margin -> bake_margin: int "Amount of pixels to extend the baked result with, as post process filter"
-#+ * RenderSettings.bake_normal_space -> bake_normal_space: enum "Choose normal space for baking"
-#+ * RenderSettings.bake_quad_split -> bake_quad_split: enum "Choose the method used to split a quad into 2 triangles for baking"
-#+ * RenderSettings.bake_type -> bake_type: enum "Choose shading information to bake into the image"
-#+ * RenderSettings.border_max_x -> border_max_x: float "Sets maximum X value for the render border"
-#+ * RenderSettings.border_max_y -> border_max_y: float "Sets maximum Y value for the render border"
-#+ * RenderSettings.border_min_x -> border_min_x: float "Sets minimum X value to for the render border"
-#+ * RenderSettings.border_min_y -> border_min_y: float "Sets minimum Y value for the render border"
-#+ * RenderSettings.cineon_black -> cineon_black: int "Log conversion reference blackpoint"
-#+ * RenderSettings.cineon_gamma -> cineon_gamma: float "Log conversion gamma"
-#+ * RenderSettings.cineon_white -> cineon_white: int "Log conversion reference whitepoint"
-#+ * RenderSettings.color_mode -> color_mode: enum "Choose BW for saving greyscale images, RGB for saving red, green and blue channels, AND RGBA for saving red, green, blue + alpha channels"
-#+ * RenderSettings.display_mode -> display_mode: enum "Select where rendered images will be displayed"
-#+ * RenderSettings.dither_intensity -> dither_intensity: float "Amount of dithering noise added to the rendered image to break up banding"
-#+ * RenderSettings.edge_color -> edge_color: float[3] "NO DESCRIPTION"
-#+ * RenderSettings.edge_threshold -> edge_threshold: int "Threshold for drawing outlines on geometry edges"
-#+ * RenderSettings.engine -> engine: enum "Engine to use for rendering"
-#+ * RenderSettings.field_order -> field_order: enum "Order of video fields. Select which lines get rendered first, to create smooth motion for TV output"
-#+ * RenderSettings.file_extension -> file_extension: string, "(read-only) The file extension used for saving renders"
-#+ * RenderSettings.file_format -> file_format: enum "File format to save the rendered images as"
-#+ * RenderSettings.file_quality -> file_quality: int "Quality of JPEG images, AVI Jpeg and SGI movies, Compression for PNGs"
-#RenderSettings.filepath -> filepath: string "Directory/name to save animations, # characters defines the position and length of frame numbers"
-#+ * RenderSettings.filter_size -> filter_size: float "Pixel width over which the reconstruction filter combines samples"
-#+ * RenderSettings.fps -> fps: int "Framerate, expressed in frames per second"
-#+ * RenderSettings.fps_base -> fps_base: float "Framerate base"
-#RenderSettings.has_multiple_engines -> has_multiple_engines: boolean, "(read-only) More than one rendering engine is available"
-#+ * RenderSettings.is_movie_format -> is_movie_format: boolean, "(read-only) When true the format is a movie"
-#+ * RenderSettings.layers -> layers: collection, "(read-only)"
-#+ * RenderSettings.motion_blur_samples -> motion_blur_samples: int "Number of scene samples to take with motion blur"
-#+ * RenderSettings.motion_blur_shutter -> motion_blur_shutter: float "Time taken in frames between shutter open and close"
-#+ * RenderSettings.octree_resolution -> octree_resolution: enum "Resolution of raytrace accelerator. Use higher resolutions for larger scenes"
-#+ * RenderSettings.parts_x -> parts_x: int "Number of horizontal tiles to use while rendering"
-#+ * RenderSettings.parts_y -> parts_y: int "Number of vertical tiles to use while rendering"
-#+ * RenderSettings.pixel_aspect_x -> pixel_aspect_x: float "Horizontal aspect ratio - for anamorphic or non-square pixel output"
-#+ * RenderSettings.pixel_aspect_y -> pixel_aspect_y: float "Vertical aspect ratio - for anamorphic or non-square pixel output"
-#RenderSettings.pixel_filter_type -> pixel_filter_type: enum "Reconstruction filter used for combining anti-aliasing samples"
-#RenderSettings.raytrace_method -> raytrace_method: enum "Type of raytrace accelerator structure"
-#+ * RenderSettings.resolution_percentage -> resolution_percentage: int "Percentage scale for render resolution"
-#+ * RenderSettings.resolution_x -> resolution_x: int "Number of horizontal pixels in the rendered image"
-#+ * RenderSettings.resolution_y -> resolution_y: int "Number of vertical pixels in the rendered image"
-#+ * RenderSettings.sequencer_gl_preview -> sequencer_gl_preview: enum "Method to draw in the sequencer view"
-#+ * RenderSettings.sequencer_gl_render -> sequencer_gl_render: enum "Method to draw in the sequencer view"
-#+ * RenderSettings.simplify_ao_sss -> simplify_ao_sss: float "Global approximate AA and SSS quality factor"
-#+ * RenderSettings.simplify_child_particles -> simplify_child_particles: float "Global child particles percentage"
-#+ * RenderSettings.simplify_shadow_samples -> simplify_shadow_samples: int "Global maximum shadow samples"
-#+ * RenderSettings.simplify_subdivision -> simplify_subdivision: int "Global maximum subdivision level"
-#+ * RenderSettings.stamp_background -> stamp_background: float[4] "Color to use behind stamp text"
-#+ * RenderSettings.stamp_font_size -> stamp_font_size: int "Size of the font used when rendering stamp text"
-#+ * RenderSettings.stamp_foreground -> stamp_foreground: float[4] "Color to use for stamp text"
-#+ * RenderSettings.stamp_note_text -> stamp_note_text: string "Custom text to appear in the stamp note"
-#+ * RenderSettings.threads -> threads: int "Number of CPU threads to use simultaneously while rendering (for multi-core/CPU systems)"
-#+ * RenderSettings.threads_mode -> threads_mode: enum "Determine the amount of render threads used"
-#RenderSettings.use_antialiasing -> use_antialiasing: boolean "Render and combine multiple samples per pixel to prevent jagged edges"
-#RenderSettings.use_backbuf -> use_backbuf: boolean "Render backbuffer image"
-#RenderSettings.use_bake_antialiasing -> use_bake_antialiasing: boolean "Enables Anti-aliasing"
-#RenderSettings.use_bake_clear -> use_bake_clear: boolean "Clear Images before baking"
-#RenderSettings.use_bake_normalize -> use_bake_normalize: boolean "With displacement normalize to the distance, with ambient occlusion normalize without using material settings"
-#RenderSettings.use_bake_selected_to_active -> use_bake_selected_to_active: boolean "Bake shading on the surface of selected objects to the active object"
-#+ * RenderSettings.use_border -> use_border: boolean "Render a user-defined border region, within the frame size. Note, this disables save_buffers and full_sample"
-#RenderSettings.use_cineon_log -> use_cineon_log: boolean "Convert to logarithmic color space"
-#RenderSettings.use_color_management -> use_color_management: boolean "Use linear workflow - gamma corrected imaging pipeline"
-#+ * RenderSettings.use_compositing -> use_compositing: boolean "Process the render result through the compositing pipeline, if compositing nodes are enabled"
-#RenderSettings.use_crop_to_border -> use_crop_to_border: boolean "Crop the rendered frame to the defined border size"
-#RenderSettings.use_edge_enhance -> use_edge_enhance: boolean "Create a toon outline around the edges of geometry"
-#+ * RenderSettings.use_envmaps -> use_envmaps: boolean "Calculate environment maps while rendering"
-#RenderSettings.use_fields -> use_fields: boolean "Render image to two fields per frame, for interlaced TV output"
-#RenderSettings.use_fields_still -> use_fields_still: boolean "Disable the time difference between fields"
-#+ * RenderSettings.use_file_extension -> use_file_extension: boolean "Add the file format extensions to the rendered file name (eg: filename + .jpg)"
-#RenderSettings.use_free_image_textures -> use_free_image_textures: boolean "Free all image texture from memory after render, to save memory before compositing"
-#RenderSettings.use_free_unused_nodes -> use_free_unused_nodes: boolean "Free Nodes that are not used while compositing, to save memory"
-#RenderSettings.use_full_sample -> use_full_sample: boolean "Save for every anti-aliasing sample the entire RenderLayer results. This solves anti-aliasing issues with compositing"
-#+ * RenderSettings.use_game_engine -> use_game_engine: boolean, "(read-only) Current rendering engine is a game engine"
-#+ * RenderSettings.use_instances -> use_instances: boolean "Instance support leads to effective memory reduction when using duplicates"
-#+ * RenderSettings.use_local_coords -> use_local_coords: boolean "Vertex coordinates are stored localy on each primitive. Increases memory usage, but may have impact on speed"
-#RenderSettings.use_motion_blur -> use_motion_blur: boolean "Use multi-sampled 3D scene motion blur"
-#+ * RenderSettings.use_overwrite -> use_overwrite: boolean "Overwrite existing files while rendering"
-#+ * RenderSettings.use_placeholder -> use_placeholder: boolean "Create empty placeholder files while rendering frames (similar to Unix touch)"
-#+ * RenderSettings.use_radiosity -> use_radiosity: boolean "Calculate radiosity in a pre-process before rendering"
-#RenderSettings.use_raytrace -> use_raytrace: boolean "Pre-calculate the raytrace accelerator and render raytracing effects"
-#RenderSettings.use_save_buffers -> use_save_buffers: boolean "Save tiles for all RenderLayers and SceneNodes to files in the temp directory (saves memory, required for Full Sample)"
-#+ * RenderSettings.use_sequencer -> use_sequencer: boolean "Process the render (and composited) result through the video sequence editor pipeline, if sequencer strips exist"
-#+ * RenderSettings.use_sequencer_gl_preview -> use_sequencer_gl_preview: boolean "NO DESCRIPTION"
-#+ * RenderSettings.use_sequencer_gl_render -> use_sequencer_gl_render: boolean "NO DESCRIPTION"
-#+ * RenderSettings.use_shadows -> use_shadows: boolean "Calculate shadows while rendering"
-#+ * RenderSettings.use_simplify -> use_simplify: boolean "Enable simplification of scene for quicker preview renders"
-#RenderSettings.use_simplify_triangulate -> use_simplify_triangulate: boolean "Disables non-planer quads being triangulated"
-#RenderSettings.use_single_layer -> use_single_layer: boolean "Only render the active layer"
-#+ * RenderSettings.use_sss -> use_sss: boolean "Calculate sub-surface scattering in materials rendering"
-#RenderSettings.use_stamp -> use_stamp: boolean "Render the stamp info text in the rendered image"
-#RenderSettings.use_stamp_camera -> use_stamp_camera: boolean "Include the name of the active camera in image metadata"
-#RenderSettings.use_stamp_date -> use_stamp_date: boolean "Include the current date in image metadata"
-#RenderSettings.use_stamp_filename -> use_stamp_filename: boolean "Include the filename of the .blend file in image metadata"
-#RenderSettings.use_stamp_frame -> use_stamp_frame: boolean "Include the frame number in image metadata"
-#RenderSettings.use_stamp_marker -> use_stamp_marker: boolean "Include the name of the last marker in image metadata"
-#RenderSettings.use_stamp_note -> use_stamp_note: boolean "Include a custom note in image metadata"
-#RenderSettings.use_stamp_render_time -> use_stamp_render_time: boolean "Include the render time in the stamp image"
-#RenderSettings.use_stamp_scene -> use_stamp_scene: boolean "Include the name of the active scene in image metadata"
-#RenderSettings.use_stamp_sequencer_strip -> use_stamp_sequencer_strip: boolean "Include the name of the foreground sequence strip in image metadata"
-#RenderSettings.use_stamp_time -> use_stamp_time: boolean "Include the render frame as HH:MM:SS.FF in image metadata"
-#+ * RenderSettings.use_textures -> use_textures: boolean "Use textures to affect material properties"
-#RenderSettings.use_tiff_16bit -> use_tiff_16bit: boolean "Save TIFF with 16 bits per channel"
-#+ * SPHFluidSettings.buoyancy -> buoyancy: float "NO DESCRIPTION"
-#+ * SPHFluidSettings.fluid_radius -> fluid_radius: float "Fluid interaction Radius"
-#+ * SPHFluidSettings.rest_density -> rest_density: float "Density"
-#+ * SPHFluidSettings.rest_length -> rest_length: float "The Spring Rest Length (factor of interaction radius)"
-#SPHFluidSettings.spring_force -> spring_force: float "Spring force constant"
-#SPHFluidSettings.stiffness -> stiffness: float "Constant K - Stiffness"
-#SPHFluidSettings.stiffness_near -> stiffness_near: float "Repulsion factor: stiffness_knear"
-#+ * SPHFluidSettings.viscosity_beta -> viscosity_beta: float "Square viscosity factor"
-#+ * SPHFluidSettings.viscosity_omega -> viscosity_omega: float "Linear viscosity"
-#+ * SceneBases.active -> active: pointer "Active object base in the scene"
-#+ * SceneGameData.activity_culling_box_radius -> activity_culling_box_radius: float "Radius of the activity bubble, in Manhattan length. Objects outside the box are activity-culled"
-#+ * SceneGameData.depth -> depth: int "Displays bit depth of full screen display"
-#+ * SceneGameData.dome_angle -> dome_angle: int "Field of View of the Dome - it only works in mode Fisheye and Truncated"
-#+ * SceneGameData.dome_buffer_resolution -> dome_buffer_resolution: float "Buffer Resolution - decrease it to increase speed"
-#+ * SceneGameData.dome_mode -> dome_mode: enum "Dome physical configurations"
-#+ * SceneGameData.dome_tesselation -> dome_tesselation: int "Tessellation level - check the generated mesh in wireframe mode"
-#+ * SceneGameData.dome_text -> dome_text: pointer "Custom Warp Mesh data file"
-#+ * SceneGameData.dome_tilt -> dome_tilt: int "Camera rotation in horizontal axis"
-#+ * SceneGameData.fps -> fps: int "The nominal number of game frames per second. Physics fixed timestep = 1/fps, independently of actual frame rate"
-#SceneGameData.frame_color -> frame_color: float[3] "Set colour of the bars"
-#SceneGameData.frame_type -> frame_type: enum "Select the type of Framing you want"
-#+ * SceneGameData.frequency -> frequency: int "Displays clock frequency of fullscreen display"
-#+ * SceneGameData.logic_step_max -> logic_step_max: int "Sets the maximum number of logic frame per game frame if graphics slows down the game, higher value allows better synchronization with physics"
-#+ * SceneGameData.material_mode -> material_mode: enum "Material mode to use for rendering"
-#+ * SceneGameData.occlusion_culling_resolution -> occlusion_culling_resolution: float "The size of the occlusion buffer in pixel, use higher value for better precision (slower)"
-#+ * SceneGameData.physics_engine -> physics_engine: enum "Physics engine used for physics simulation in the game engine"
-#+ * SceneGameData.physics_gravity -> physics_gravity: float "Gravitational constant used for physics simulation in the game engine"
-#+ * SceneGameData.physics_step_max -> physics_step_max: int "Sets the maximum number of physics step per game frame if graphics slows down the game, higher value allows physics to keep up with realtime"
-#+ * SceneGameData.physics_step_sub -> physics_step_sub: int "Sets the number of simulation substep per physic timestep, higher value give better physics precision"
-#+ * SceneGameData.resolution_x -> resolution_x: int "Number of horizontal pixels in the screen"
-#+ * SceneGameData.resolution_y -> resolution_y: int "Number of vertical pixels in the screen"
-#+ * SceneGameData.show_debug_properties -> show_debug_properties: boolean "Show properties marked for debugging while the game runs"
-#+ * SceneGameData.show_framerate_profile -> show_framerate_profile: boolean "Show framerate and profiling information while the game runs"
-#SceneGameData.show_fullscreen -> show_fullscreen: boolean "Starts player in a new fullscreen display"
-#+ * SceneGameData.show_physics_visualization -> show_physics_visualization: boolean "Show a visualization of physics bounds and interactions"
-#+ * SceneGameData.stereo -> stereo: enum "NO DESCRIPTION"
-#SceneGameData.stereo_eye_separation -> stereo_eye_separation: float "Set the distance between the eyes - the camera focal length/30 should be fine"
-#+ * SceneGameData.stereo_mode -> stereo_mode: enum "Stereographic techniques"
-#SceneGameData.use_activity_culling -> use_activity_culling: boolean "Activity culling is enabled"
-#+ * SceneGameData.use_animation_record -> use_animation_record: boolean "Record animation to fcurves"
-#SceneGameData.use_auto_start -> use_auto_start: boolean "Automatically start game at load time"
-#+ * SceneGameData.use_deprecation_warnings -> use_deprecation_warnings: boolean "Print warnings when using deprecated features in the python API"
-#+ * SceneGameData.use_display_lists -> use_display_lists: boolean "Use display lists to speed up rendering by keeping geometry on the GPU"
-#+ * SceneGameData.use_frame_rate -> use_frame_rate: boolean "Respect the frame rate rather than rendering as many frames as possible"
-#SceneGameData.use_glsl_extra_textures -> use_glsl_extra_textures: boolean "Use extra textures like normal or specular maps for GLSL rendering"
-#SceneGameData.use_glsl_lights -> use_glsl_lights: boolean "Use lights for GLSL rendering"
-#SceneGameData.use_glsl_nodes -> use_glsl_nodes: boolean "Use nodes for GLSL rendering"
-#SceneGameData.use_glsl_ramps -> use_glsl_ramps: boolean "Use ramps for GLSL rendering"
-#SceneGameData.use_glsl_shaders -> use_glsl_shaders: boolean "Use shaders for GLSL rendering"
-#SceneGameData.use_glsl_shadows -> use_glsl_shadows: boolean "Use shadows for GLSL rendering"
-#+ * SceneGameData.use_occlusion_culling -> use_occlusion_culling: boolean "Use optimized Bullet DBVT tree for view frustum and occlusion culling"
-#+ * SceneObjects.active -> active: pointer "Active object for this scene"
-#SceneRenderLayer.exclude_ambient_occlusion -> exclude_ambient_occlusion: boolean "Exclude AO pass from combined"
-#SceneRenderLayer.exclude_emit -> exclude_emit: boolean "Exclude emission pass from combined"
-#SceneRenderLayer.exclude_environment -> exclude_environment: boolean "Exclude environment pass from combined"
-#SceneRenderLayer.exclude_indirect -> exclude_indirect: boolean "Exclude indirect pass from combined"
-#SceneRenderLayer.exclude_reflection -> exclude_reflection: boolean "Exclude raytraced reflection pass from combined"
-#SceneRenderLayer.exclude_refraction -> exclude_refraction: boolean "Exclude raytraced refraction pass from combined"
-#SceneRenderLayer.exclude_shadow -> exclude_shadow: boolean "Exclude shadow pass from combined"
-#SceneRenderLayer.exclude_specular -> exclude_specular: boolean "Exclude specular pass from combined"
-#SceneRenderLayer.invert_zmask -> invert_zmask: boolean "For Zmask, only render what is behind solid z values instead of in front"
-#SceneRenderLayer.layers -> layers: boolean[20] "Scene layers included in this render layer"
-#SceneRenderLayer.layers_zmask -> layers_zmask: boolean[20] "Zmask scene layers"
-#+ * SceneRenderLayer.light_override -> light_override: pointer "Group to override all other lights in this render layer"
-#+ * SceneRenderLayer.material_override -> material_override: pointer "Material to override all other materials in this render layer"
-#+ * SceneRenderLayer.name -> name: string "Render layer name"
-#+ * SceneRenderLayer.use -> use: boolean "Disable or enable the render layer"
-#SceneRenderLayer.use_all_z -> use_all_z: boolean "Fill in Z values for solid faces in invisible layers, for masking"
-#SceneRenderLayer.use_edge_enhance -> use_edge_enhance: boolean "Render Edge-enhance in this Layer (only works for Solid faces)"
-#SceneRenderLayer.use_halo -> use_halo: boolean "Render Halos in this Layer (on top of Solid)"
-#SceneRenderLayer.use_pass_ambient_occlusion -> use_pass_ambient_occlusion: boolean "Deliver AO pass"
-#SceneRenderLayer.use_pass_color -> use_pass_color: boolean "Deliver shade-less color pass"
-#SceneRenderLayer.use_pass_combined -> use_pass_combined: boolean "Deliver full combined RGBA buffer"
-#SceneRenderLayer.use_pass_diffuse -> use_pass_diffuse: boolean "Deliver diffuse pass"
-#SceneRenderLayer.use_pass_emit -> use_pass_emit: boolean "Deliver emission pass"
-#SceneRenderLayer.use_pass_environment -> use_pass_environment: boolean "Deliver environment lighting pass"
-#SceneRenderLayer.use_pass_indirect -> use_pass_indirect: boolean "Deliver indirect lighting pass"
-#SceneRenderLayer.use_pass_mist -> use_pass_mist: boolean "Deliver mist factor pass (0.0-1.0)"
-#SceneRenderLayer.use_pass_normal -> use_pass_normal: boolean "Deliver normal pass"
-#SceneRenderLayer.use_pass_object_index -> use_pass_object_index: boolean "Deliver object index pass"
-#SceneRenderLayer.use_pass_reflection -> use_pass_reflection: boolean "Deliver raytraced reflection pass"
-#SceneRenderLayer.use_pass_refraction -> use_pass_refraction: boolean "Deliver raytraced refraction pass"
-#SceneRenderLayer.use_pass_shadow -> use_pass_shadow: boolean "Deliver shadow pass"
-#SceneRenderLayer.use_pass_specular -> use_pass_specular: boolean "Deliver specular pass"
-#SceneRenderLayer.use_pass_uv -> use_pass_uv: boolean "Deliver texture UV pass"
-#SceneRenderLayer.use_pass_vector -> use_pass_vector: boolean "Deliver speed vector pass"
-#SceneRenderLayer.use_pass_z -> use_pass_z: boolean "Deliver Z values pass"
-#SceneRenderLayer.use_sky -> use_sky: boolean "Render Sky in this Layer"
-#SceneRenderLayer.use_solid -> use_solid: boolean "Render Solid faces in this Layer"
-#SceneRenderLayer.use_strand -> use_strand: boolean "Render Strands in this Layer"
-#SceneRenderLayer.use_zmask -> use_zmask: boolean "Only render whats in front of the solid z values"
-#SceneRenderLayer.use_ztransp -> use_ztransp: boolean "Render Z-Transparent faces in this Layer (On top of Solid and Halos)"
-#+ * Scopes.accuracy -> accuracy: float "Proportion of original image source pixel lines to sample"
-#+ * Scopes.histogram -> histogram: pointer, "(read-only) Histogram for viewing image statistics"
-#+ * Scopes.use_full_resolution -> use_full_resolution: boolean "Sample every pixel of the image"
-#+ * Scopes.vectorscope_alpha -> vectorscope_alpha: float "Opacity of the points"
-#+ * Scopes.waveform_alpha -> waveform_alpha: float "Opacity of the points"
-#+ * Scopes.waveform_mode -> waveform_mode: enum "NO DESCRIPTION"
-#+ * Sensor.frequency -> frequency: int "Delay between repeated pulses(in logic tics, 0=no delay)"
-#+ * Sensor.invert -> invert: boolean "Invert the level(output) of this sensor"
-#+ * Sensor.name -> name: string "Sensor name"
-#Sensor.pin -> pin: boolean "Display when not linked to a visible states controller"
-#Sensor.show_expanded -> show_expanded: boolean "Set sensor expanded in the user interface"
-#+ * Sensor.type -> type: enum "NO DESCRIPTION"
-#Sensor.use_level -> use_level: boolean "Level detector, trigger controllers of new states(only applicable upon logic state transition)"
-#Sensor.use_pulse_false_level -> use_pulse_false_level: boolean "Activate FALSE level triggering (pulse mode)"
-#Sensor.use_pulse_true_level -> use_pulse_true_level: boolean "Activate TRUE level triggering (pulse mode)"
-#Sensor.use_tap -> use_tap: boolean "Trigger controllers only for an instant, even while the sensor remains true"
-#+ * Sensor|ActuatorSensor.actuator -> actuator: string "Actuator name, actuator active state modifications will be detected"
-#+ * Sensor|ArmatureSensor.bone -> bone: string "Identify the bone to check value from"
-#+ * Sensor|ArmatureSensor.constraint -> constraint: string "Identify the bone constraint to check value from"
-#+ * Sensor|ArmatureSensor.test_type -> test_type: enum "Type of value and test"
-#+ * Sensor|ArmatureSensor.value -> value: float "Specify value to be used in comparison"
-#+ * Sensor|CollisionSensor.material -> material: string "Only look for Objects with this material"
-#+ * Sensor|CollisionSensor.property -> property: string "Only look for Objects with this property"
-#Sensor|CollisionSensor.use_material -> use_material: boolean "Toggle collision on material or property"
-#Sensor|CollisionSensor.use_pulse -> use_pulse: boolean "Changes to the set of colliding objects generates pulse"
-#+ * Sensor|DelaySensor.delay -> delay: int "Delay in number of logic tics before the positive trigger (default 60 per second)"
-#+ * Sensor|DelaySensor.duration -> duration: int "If >0, delay in number of logic tics before the negative trigger following the positive trigger"
-#Sensor|DelaySensor.use_repeat -> use_repeat: boolean "Toggle repeat option. If selected, the sensor restarts after Delay+Dur logic tics"
-#+ * Sensor|JoystickSensor.axis_direction -> axis_direction: enum "The direction of the axis"
-#+ * Sensor|JoystickSensor.axis_number -> axis_number: int "Specify which axis pair to use, 1 is usually the main direction input"
-#+ * Sensor|JoystickSensor.axis_threshold -> axis_threshold: int "Specify the precision of the axis"
-#+ * Sensor|JoystickSensor.button_number -> button_number: int "Specify which button to use"
-#+ * Sensor|JoystickSensor.event_type -> event_type: enum "The type of event this joystick sensor is triggered on"
-#+ * Sensor|JoystickSensor.hat_direction -> hat_direction: enum "Specify hat direction"
-#+ * Sensor|JoystickSensor.hat_number -> hat_number: int "Specify which hat to use"
-#+ * Sensor|JoystickSensor.joystick_index -> joystick_index: int "Specify which joystick to use"
-#+ * Sensor|JoystickSensor.single_axis_number -> single_axis_number: int "Specify a single axis (verticle/horizontal/other) to detect"
-#Sensor|JoystickSensor.use_all_events -> use_all_events: boolean "Triggered by all events on this joysticks current type (axis/button/hat)"
-#+ * Sensor|KeyboardSensor.key -> key: enum "NO DESCRIPTION"
-#+ * Sensor|KeyboardSensor.log -> log: string "Property that receive the keystrokes in case a string is logged"
-#Sensor|KeyboardSensor.modifier_key_1 -> modifier_key_1: enum "Modifier key code"
-#Sensor|KeyboardSensor.modifier_key_2 -> modifier_key_2: enum "Modifier key code"
-#+ * Sensor|KeyboardSensor.target -> target: string "Property that indicates whether to log keystrokes as a string"
-#Sensor|KeyboardSensor.use_all_keys -> use_all_keys: boolean "Trigger this sensor on any keystroke"
-#+ * Sensor|MessageSensor.subject -> subject: string "Optional subject filter: only accept messages with this subject, or empty for all"
-#+ * Sensor|MouseSensor.mouse_event -> mouse_event: enum "Specify the type of event this mouse sensor should trigger on"
-#+ * Sensor|NearSensor.distance -> distance: float "Trigger distance"
-#+ * Sensor|NearSensor.property -> property: string "Only look for objects with this property"
-#+ * Sensor|NearSensor.reset_distance -> reset_distance: float "NO DESCRIPTION"
-#+ * Sensor|PropertySensor.evaluation_type -> evaluation_type: enum "Type of property evaluation"
-#+ * Sensor|PropertySensor.property -> property: string "NO DESCRIPTION"
-#+ * Sensor|PropertySensor.value -> value: string "Check for this value in types in Equal or Not Equal types"
-#Sensor|PropertySensor.value_max -> value_max: string "Specify maximum value in Interval type"
-#Sensor|PropertySensor.value_min -> value_min: string "Specify minimum value in Interval type"
-#+ * Sensor|RadarSensor.angle -> angle: float "Opening angle of the radar cone"
-#+ * Sensor|RadarSensor.axis -> axis: enum "Specify along which axis the radar cone is cast"
-#+ * Sensor|RadarSensor.distance -> distance: float "Depth of the radar cone"
-#+ * Sensor|RadarSensor.property -> property: string "Only look for Objects with this property"
-#+ * Sensor|RandomSensor.seed -> seed: int "Initial seed of the generator. (Choose 0 for not random)"
-#+ * Sensor|RaySensor.axis -> axis: enum "Specify along which axis the ray is cast"
-#+ * Sensor|RaySensor.material -> material: string "Only look for Objects with this material"
-#+ * Sensor|RaySensor.property -> property: string "Only look for Objects with this property"
-#+ * Sensor|RaySensor.range -> range: float "Sense objects no farther than this distance"
-#+ * Sensor|RaySensor.ray_type -> ray_type: enum "Toggle collision on material or property"
-#Sensor|RaySensor.use_x_ray -> use_x_ray: boolean "Toggle X-Ray option (see through objects that dont have the property)"
-#+ * Sensor|TouchSensor.material -> material: pointer "Only look for objects with this material"
-#Sequence.blend_alpha -> blend_alpha: float "NO DESCRIPTION"
-#Sequence.blend_type -> blend_type: enum "NO DESCRIPTION"
-#+ * Sequence.channel -> channel: int "Y position of the sequence strip"
-#+ * Sequence.effect_fader -> effect_fader: float "NO DESCRIPTION"
-#Sequence.frame_duration -> frame_duration: int, "(read-only) The length of the contents of this strip before the handles are applied"
-#Sequence.frame_final_duration -> frame_final_duration: int "The length of the contents of this strip before the handles are applied"
-#+ * Sequence.frame_final_end -> frame_final_end: int "End frame displayed in the sequence editor after offsets are applied"
-#+ * Sequence.frame_final_start -> frame_final_start: int "Start frame displayed in the sequence editor after offsets are applied, setting this is equivalent to moving the handle, not the actual start frame"
-#+ * Sequence.frame_offset_end -> frame_offset_end: int, "(read-only)"
-#+ * Sequence.frame_offset_start -> frame_offset_start: int, "(read-only)"
-#+ * Sequence.frame_start -> frame_start: int "NO DESCRIPTION"
-#+ * Sequence.frame_still_end -> frame_still_end: int, "(read-only)"
-#+ * Sequence.frame_still_start -> frame_still_start: int, "(read-only)"
-#+ * Sequence.lock -> lock: boolean "Lock strip so that it cant be transformed"
-#+ * Sequence.mute -> mute: boolean "NO DESCRIPTION"
-#+ * Sequence.name -> name: string "NO DESCRIPTION"
-#+ * Sequence.select -> select: boolean "NO DESCRIPTION"
-#+ * Sequence.select_left_handle -> select_left_handle: boolean "NO DESCRIPTION"
-#+ * Sequence.select_right_handle -> select_right_handle: boolean "NO DESCRIPTION"
-#+ * Sequence.speed_fader -> speed_fader: float "NO DESCRIPTION"
-#+ * Sequence.type -> type: enum, "(read-only)"
-#Sequence.use_default_fade -> use_default_fade: boolean "Fade effect using the built-in default (usually make transition as long as effect strip)"
-#+ * SequenceColorBalance.gain -> gain: float[3] "Color balance gain (highlights)"
-#+ * SequenceColorBalance.gamma -> gamma: float[3] "Color balance gamma (midtones)"
-#SequenceColorBalance.invert_gain -> invert_gain: boolean "NO DESCRIPTION"
-#SequenceColorBalance.invert_gamma -> invert_gamma: boolean "NO DESCRIPTION"
-#SequenceColorBalance.invert_lift -> invert_lift: boolean "NO DESCRIPTION"
-#+ * SequenceColorBalance.lift -> lift: float[3] "Color balance lift (shadows)"
-#SequenceCrop.max_x -> max_x: int "NO DESCRIPTION"
-#SequenceCrop.max_y -> max_y: int "NO DESCRIPTION"
-#SequenceCrop.min_x -> min_x: int "NO DESCRIPTION"
-#SequenceCrop.min_y -> min_y: int "NO DESCRIPTION"
-#+ * SequenceEditor.active_strip -> active_strip: pointer "NO DESCRIPTION"
-#+ * SequenceEditor.meta_stack -> meta_stack: collection, "(read-only) Meta strip stack, last is currently edited meta strip"
-#+ * SequenceEditor.overlay_frame -> overlay_frame: int "Sequencers active strip"
-#+ * SequenceEditor.overlay_lock -> overlay_lock: boolean "NO DESCRIPTION"
-#+ * SequenceEditor.sequences -> sequences: collection, "(read-only)"
-#+ * SequenceEditor.sequences_all -> sequences_all: collection, "(read-only)"
-#+ * SequenceEditor.show_overlay -> show_overlay: boolean "Partial overlay ontop of the sequencer"
-#+ * SequenceElement.filename -> filename: string "NO DESCRIPTION"
-#+ * SequenceProxy.directory -> directory: string "Location to store the proxy files"
-#+ * SequenceProxy.filepath -> filepath: string "Location of custom proxy file"
-#+ * SequenceTransform.offset_x -> offset_x: int "NO DESCRIPTION"
-#+ * SequenceTransform.offset_y -> offset_y: int "NO DESCRIPTION"
-#+ * Sequence|EffectSequence.color_balance -> color_balance: pointer, "(read-only)"
-#Sequence|EffectSequence.color_multiply -> color_multiply: float "NO DESCRIPTION"
-#+ * Sequence|EffectSequence.color_saturation -> color_saturation: float "NO DESCRIPTION"
-#+ * Sequence|EffectSequence.crop -> crop: pointer, "(read-only)"
-#+ * Sequence|EffectSequence.proxy -> proxy: pointer, "(read-only)"
-#+ * Sequence|EffectSequence.strobe -> strobe: float "Only display every nth frame"
-#+ * Sequence|EffectSequence.transform -> transform: pointer, "(read-only)"
-#+ * Sequence|EffectSequence.use_color_balance -> use_color_balance: boolean "(3-Way color correction) on input"
-#+ * Sequence|EffectSequence.use_crop -> use_crop: boolean "Crop image before processing"
-#Sequence|EffectSequence.use_deinterlace -> use_deinterlace: boolean "For video movies to remove fields"
-#Sequence|EffectSequence.use_flip_x -> use_flip_x: boolean "Flip on the X axis"
-#Sequence|EffectSequence.use_flip_y -> use_flip_y: boolean "Flip on the Y axis"
-#Sequence|EffectSequence.use_float -> use_float: boolean "Convert input to float data"
-#Sequence|EffectSequence.use_premultiply -> use_premultiply: boolean "Convert RGB from key alpha to premultiplied alpha"
-#+ * Sequence|EffectSequence.use_proxy -> use_proxy: boolean "Use a preview proxy for this strip"
-#Sequence|EffectSequence.use_proxy_custom_directory -> use_proxy_custom_directory: boolean "Use a custom directory to store data"
-#Sequence|EffectSequence.use_proxy_custom_file -> use_proxy_custom_file: boolean "Use a custom file to read proxy data from"
-#Sequence|EffectSequence.use_reverse_frames -> use_reverse_frames: boolean "Reverse frame order"
-#+ * Sequence|EffectSequence.use_translation -> use_translation: boolean "Translate image before processing"
-#+ * Sequence|EffectSequence|ColorSequence.color -> color: float[3] "NO DESCRIPTION"
-#Sequence|EffectSequence|GlowSequence.blur_radius -> blur_radius: float "Radius of glow effect"
-#+ * Sequence|EffectSequence|GlowSequence.boost_factor -> boost_factor: float "Brightness multiplier"
-#+ * Sequence|EffectSequence|GlowSequence.clamp -> clamp: float "rightness limit of intensity"
-#+ * Sequence|EffectSequence|GlowSequence.quality -> quality: int "Accuracy of the blur effect"
-#+ * Sequence|EffectSequence|GlowSequence.threshold -> threshold: float "Minimum intensity to trigger a glow"
-#Sequence|EffectSequence|GlowSequence.use_only_boost -> use_only_boost: boolean "Show the glow buffer only"
-#+ * Sequence|EffectSequence|PluginSequence.filename -> filename: string, "(read-only)"
-#+ * Sequence|EffectSequence|SpeedControlSequence.global_speed -> global_speed: float "NO DESCRIPTION"
-#Sequence|EffectSequence|SpeedControlSequence.use_curve_compress_y -> use_curve_compress_y: boolean "Scale F-Curve value to get the target frame number, F-Curve value runs from 0.0 to 1.0"
-#Sequence|EffectSequence|SpeedControlSequence.use_curve_velocity -> use_curve_velocity: boolean "Interpret the F-Curve value as a velocity instead of a frame number"
-#Sequence|EffectSequence|SpeedControlSequence.use_frame_blend -> use_frame_blend: boolean "Blend two frames into the target for a smoother result"
-#+ * Sequence|EffectSequence|TransformSequence.interpolation -> interpolation: enum "NO DESCRIPTION"
-#+ * Sequence|EffectSequence|TransformSequence.rotation_start -> rotation_start: float "NO DESCRIPTION"
-#+ * Sequence|EffectSequence|TransformSequence.scale_start_x -> scale_start_x: float "NO DESCRIPTION"
-#+ * Sequence|EffectSequence|TransformSequence.scale_start_y -> scale_start_y: float "NO DESCRIPTION"
-#+ * Sequence|EffectSequence|TransformSequence.translate_start_x -> translate_start_x: float "NO DESCRIPTION"
-#+ * Sequence|EffectSequence|TransformSequence.translate_start_y -> translate_start_y: float "NO DESCRIPTION"
-#+ * Sequence|EffectSequence|TransformSequence.translation_unit -> translation_unit: enum "NO DESCRIPTION"
-#Sequence|EffectSequence|TransformSequence.use_uniform_scale -> use_uniform_scale: boolean "Scale uniformly, preserving aspect ratio"
-#+ * Sequence|EffectSequence|WipeSequence.angle -> angle: float "Edge angle"
-#+ * Sequence|EffectSequence|WipeSequence.blur_width -> blur_width: float "Width of the blur edge, in percentage relative to the image size"
-#+ * Sequence|EffectSequence|WipeSequence.direction -> direction: enum "Wipe direction"
-#+ * Sequence|EffectSequence|WipeSequence.transition_type -> transition_type: enum "NO DESCRIPTION"
-#Sequence|ImageSequence.animation_offset_end -> animation_offset_end: int "Animation end offset (trim end)"
-#Sequence|ImageSequence.animation_offset_start -> animation_offset_start: int "Animation start offset (trim start)"
-#+ * Sequence|ImageSequence.color_balance -> color_balance: pointer, "(read-only)"
-#Sequence|ImageSequence.color_multiply -> color_multiply: float "NO DESCRIPTION"
-#+ * Sequence|ImageSequence.color_saturation -> color_saturation: float "NO DESCRIPTION"
-#+ * Sequence|ImageSequence.crop -> crop: pointer, "(read-only)"
-#+ * Sequence|ImageSequence.directory -> directory: string "NO DESCRIPTION"
-#+ * Sequence|ImageSequence.elements -> elements: collection, "(read-only)"
-#+ * Sequence|ImageSequence.proxy -> proxy: pointer, "(read-only)"
-#+ * Sequence|ImageSequence.strobe -> strobe: float "Only display every nth frame"
-#+ * Sequence|ImageSequence.transform -> transform: pointer, "(read-only)"
-#+ * Sequence|ImageSequence.use_color_balance -> use_color_balance: boolean "(3-Way color correction) on input"
-#+ * Sequence|ImageSequence.use_crop -> use_crop: boolean "Crop image before processing"
-#Sequence|ImageSequence.use_deinterlace -> use_deinterlace: boolean "For video movies to remove fields"
-#Sequence|ImageSequence.use_flip_x -> use_flip_x: boolean "Flip on the X axis"
-#Sequence|ImageSequence.use_flip_y -> use_flip_y: boolean "Flip on the Y axis"
-#Sequence|ImageSequence.use_float -> use_float: boolean "Convert input to float data"
-#Sequence|ImageSequence.use_premultiply -> use_premultiply: boolean "Convert RGB from key alpha to premultiplied alpha"
-#+ * Sequence|ImageSequence.use_proxy -> use_proxy: boolean "Use a preview proxy for this strip"
-#Sequence|ImageSequence.use_proxy_custom_directory -> use_proxy_custom_directory: boolean "Use a custom directory to store data"
-#Sequence|ImageSequence.use_proxy_custom_file -> use_proxy_custom_file: boolean "Use a custom file to read proxy data from"
-#Sequence|ImageSequence.use_reverse_frames -> use_reverse_frames: boolean "Reverse frame order"
-#+ * Sequence|ImageSequence.use_translation -> use_translation: boolean "Translate image before processing"
-#Sequence|MetaSequence.animation_offset_end -> animation_offset_end: int "Animation end offset (trim end)"
-#Sequence|MetaSequence.animation_offset_start -> animation_offset_start: int "Animation start offset (trim start)"
-#+ * Sequence|MetaSequence.color_balance -> color_balance: pointer, "(read-only)"
-#Sequence|MetaSequence.color_multiply -> color_multiply: float "NO DESCRIPTION"
-#+ * Sequence|MetaSequence.color_saturation -> color_saturation: float "NO DESCRIPTION"
-#+ * Sequence|MetaSequence.crop -> crop: pointer, "(read-only)"
-#+ * Sequence|MetaSequence.proxy -> proxy: pointer, "(read-only)"
-#+ * Sequence|MetaSequence.sequences -> sequences: collection, "(read-only)"
-#+ * Sequence|MetaSequence.strobe -> strobe: float "Only display every nth frame"
-#+ * Sequence|MetaSequence.transform -> transform: pointer, "(read-only)"
-#+ * Sequence|MetaSequence.use_color_balance -> use_color_balance: boolean "(3-Way color correction) on input"
-#+ * Sequence|MetaSequence.use_crop -> use_crop: boolean "Crop image before processing"
-#Sequence|MetaSequence.use_deinterlace -> use_deinterlace: boolean "For video movies to remove fields"
-#Sequence|MetaSequence.use_flip_x -> use_flip_x: boolean "Flip on the X axis"
-#Sequence|MetaSequence.use_flip_y -> use_flip_y: boolean "Flip on the Y axis"
-#Sequence|MetaSequence.use_float -> use_float: boolean "Convert input to float data"
-#Sequence|MetaSequence.use_premultiply -> use_premultiply: boolean "Convert RGB from key alpha to premultiplied alpha"
-#+ * Sequence|MetaSequence.use_proxy -> use_proxy: boolean "Use a preview proxy for this strip"
-#Sequence|MetaSequence.use_proxy_custom_directory -> use_proxy_custom_directory: boolean "Use a custom directory to store data"
-#Sequence|MetaSequence.use_proxy_custom_file -> use_proxy_custom_file: boolean "Use a custom file to read proxy data from"
-#Sequence|MetaSequence.use_reverse_frames -> use_reverse_frames: boolean "Reverse frame order"
-#+ * Sequence|MetaSequence.use_translation -> use_translation: boolean "Translate image before processing"
-#Sequence|MovieSequence.animation_offset_end -> animation_offset_end: int "Animation end offset (trim end)"
-#Sequence|MovieSequence.animation_offset_start -> animation_offset_start: int "Animation start offset (trim start)"
-#+ * Sequence|MovieSequence.color_balance -> color_balance: pointer, "(read-only)"
-#Sequence|MovieSequence.color_multiply -> color_multiply: float "NO DESCRIPTION"
-#+ * Sequence|MovieSequence.color_saturation -> color_saturation: float "NO DESCRIPTION"
-#+ * Sequence|MovieSequence.crop -> crop: pointer, "(read-only)"
-#+ * Sequence|MovieSequence.filepath -> filepath: string "NO DESCRIPTION"
-#+ * Sequence|MovieSequence.mpeg_preseek -> mpeg_preseek: int "For MPEG movies, preseek this many frames"
-#+ * Sequence|MovieSequence.proxy -> proxy: pointer, "(read-only)"
-#+ * Sequence|MovieSequence.strobe -> strobe: float "Only display every nth frame"
-#+ * Sequence|MovieSequence.transform -> transform: pointer, "(read-only)"
-#+ * Sequence|MovieSequence.use_color_balance -> use_color_balance: boolean "(3-Way color correction) on input"
-#+ * Sequence|MovieSequence.use_crop -> use_crop: boolean "Crop image before processing"
-#Sequence|MovieSequence.use_deinterlace -> use_deinterlace: boolean "For video movies to remove fields"
-#Sequence|MovieSequence.use_flip_x -> use_flip_x: boolean "Flip on the X axis"
-#Sequence|MovieSequence.use_flip_y -> use_flip_y: boolean "Flip on the Y axis"
-#Sequence|MovieSequence.use_float -> use_float: boolean "Convert input to float data"
-#Sequence|MovieSequence.use_premultiply -> use_premultiply: boolean "Convert RGB from key alpha to premultiplied alpha"
-#+ * Sequence|MovieSequence.use_proxy -> use_proxy: boolean "Use a preview proxy for this strip"
-#Sequence|MovieSequence.use_proxy_custom_directory -> use_proxy_custom_directory: boolean "Use a custom directory to store data"
-#Sequence|MovieSequence.use_proxy_custom_file -> use_proxy_custom_file: boolean "Use a custom file to read proxy data from"
-#Sequence|MovieSequence.use_reverse_frames -> use_reverse_frames: boolean "Reverse frame order"
-#+ * Sequence|MovieSequence.use_translation -> use_translation: boolean "Translate image before processing"
-#Sequence|MulticamSequence.animation_offset_end -> animation_offset_end: int "Animation end offset (trim end)"
-#Sequence|MulticamSequence.animation_offset_start -> animation_offset_start: int "Animation start offset (trim start)"
-#+ * Sequence|MulticamSequence.color_balance -> color_balance: pointer, "(read-only)"
-#Sequence|MulticamSequence.color_multiply -> color_multiply: float "NO DESCRIPTION"
-#+ * Sequence|MulticamSequence.color_saturation -> color_saturation: float "NO DESCRIPTION"
-#+ * Sequence|MulticamSequence.crop -> crop: pointer, "(read-only)"
-#+ * Sequence|MulticamSequence.multicam_source -> multicam_source: int "NO DESCRIPTION"
-#+ * Sequence|MulticamSequence.proxy -> proxy: pointer, "(read-only)"
-#+ * Sequence|MulticamSequence.strobe -> strobe: float "Only display every nth frame"
-#+ * Sequence|MulticamSequence.transform -> transform: pointer, "(read-only)"
-#+ * Sequence|MulticamSequence.use_color_balance -> use_color_balance: boolean "(3-Way color correction) on input"
-#+ * Sequence|MulticamSequence.use_crop -> use_crop: boolean "Crop image before processing"
-#Sequence|MulticamSequence.use_deinterlace -> use_deinterlace: boolean "For video movies to remove fields"
-#Sequence|MulticamSequence.use_flip_x -> use_flip_x: boolean "Flip on the X axis"
-#Sequence|MulticamSequence.use_flip_y -> use_flip_y: boolean "Flip on the Y axis"
-#Sequence|MulticamSequence.use_float -> use_float: boolean "Convert input to float data"
-#Sequence|MulticamSequence.use_premultiply -> use_premultiply: boolean "Convert RGB from key alpha to premultiplied alpha"
-#+ * Sequence|MulticamSequence.use_proxy -> use_proxy: boolean "Use a preview proxy for this strip"
-#Sequence|MulticamSequence.use_proxy_custom_directory -> use_proxy_custom_directory: boolean "Use a custom directory to store data"
-#Sequence|MulticamSequence.use_proxy_custom_file -> use_proxy_custom_file: boolean "Use a custom file to read proxy data from"
-#Sequence|MulticamSequence.use_reverse_frames -> use_reverse_frames: boolean "Reverse frame order"
-#+ * Sequence|MulticamSequence.use_translation -> use_translation: boolean "Translate image before processing"
-#Sequence|SceneSequence.animation_offset_end -> animation_offset_end: int "Animation end offset (trim end)"
-#Sequence|SceneSequence.animation_offset_start -> animation_offset_start: int "Animation start offset (trim start)"
-#+ * Sequence|SceneSequence.color_balance -> color_balance: pointer, "(read-only)"
-#Sequence|SceneSequence.color_multiply -> color_multiply: float "NO DESCRIPTION"
-#+ * Sequence|SceneSequence.color_saturation -> color_saturation: float "NO DESCRIPTION"
-#+ * Sequence|SceneSequence.crop -> crop: pointer, "(read-only)"
-#+ * Sequence|SceneSequence.proxy -> proxy: pointer, "(read-only)"
-#+ * Sequence|SceneSequence.scene -> scene: pointer "Scene that this sequence uses"
-#+ * Sequence|SceneSequence.scene_camera -> scene_camera: pointer "Override the scenes active camera"
-#+ * Sequence|SceneSequence.strobe -> strobe: float "Only display every nth frame"
-#+ * Sequence|SceneSequence.transform -> transform: pointer, "(read-only)"
-#+ * Sequence|SceneSequence.use_color_balance -> use_color_balance: boolean "(3-Way color correction) on input"
-#+ * Sequence|SceneSequence.use_crop -> use_crop: boolean "Crop image before processing"
-#Sequence|SceneSequence.use_deinterlace -> use_deinterlace: boolean "For video movies to remove fields"
-#Sequence|SceneSequence.use_flip_x -> use_flip_x: boolean "Flip on the X axis"
-#Sequence|SceneSequence.use_flip_y -> use_flip_y: boolean "Flip on the Y axis"
-#Sequence|SceneSequence.use_float -> use_float: boolean "Convert input to float data"
-#Sequence|SceneSequence.use_premultiply -> use_premultiply: boolean "Convert RGB from key alpha to premultiplied alpha"
-#+ * Sequence|SceneSequence.use_proxy -> use_proxy: boolean "Use a preview proxy for this strip"
-#Sequence|SceneSequence.use_proxy_custom_directory -> use_proxy_custom_directory: boolean "Use a custom directory to store data"
-#Sequence|SceneSequence.use_proxy_custom_file -> use_proxy_custom_file: boolean "Use a custom file to read proxy data from"
-#Sequence|SceneSequence.use_reverse_frames -> use_reverse_frames: boolean "Reverse frame order"
-#+ * Sequence|SceneSequence.use_translation -> use_translation: boolean "Translate image before processing"
-#Sequence|SoundSequence.animation_offset_end -> animation_offset_end: int "Animation end offset (trim end)"
-#Sequence|SoundSequence.animation_offset_start -> animation_offset_start: int "Animation start offset (trim start)"
-#+ * Sequence|SoundSequence.attenuation -> attenuation: float "Attenuation in dezibel"
-#+ * Sequence|SoundSequence.filepath -> filepath: string "NO DESCRIPTION"
-#+ * Sequence|SoundSequence.sound -> sound: pointer, "(read-only) Sound datablock used by this sequence"
-#+ * Sequence|SoundSequence.volume -> volume: float "Playback volume of the sound"
-#+ * ShapeKey.data -> data: collection, "(read-only)"
-#+ * ShapeKey.frame -> frame: float, "(read-only) Frame for absolute keys"
-#+ * ShapeKey.interpolation -> interpolation: enum "Interpolation type"
-#+ * ShapeKey.mute -> mute: boolean "Mute this shape key"
-#+ * ShapeKey.name -> name: string "NO DESCRIPTION"
-#+ * ShapeKey.relative_key -> relative_key: pointer "Shape used as a relative key"
-#+ * ShapeKey.slider_max -> slider_max: float "Maximum for slider"
-#+ * ShapeKey.slider_min -> slider_min: float "Minimum for slider"
-#+ * ShapeKey.value -> value: float "Value of shape key at the current frame"
-#+ * ShapeKey.vertex_group -> vertex_group: string "Vertex weight group, to blend with basis shape"
-#+ * ShapeKeyBezierPoint.co -> co: float[3] "NO DESCRIPTION"
-#ShapeKeyBezierPoint.handle_left -> handle_left: float[3] "NO DESCRIPTION"
-#ShapeKeyBezierPoint.handle_right -> handle_right: float[3] "NO DESCRIPTION"
-#+ * ShapeKeyCurvePoint.co -> co: float[3] "NO DESCRIPTION"
-#+ * ShapeKeyCurvePoint.tilt -> tilt: float "NO DESCRIPTION"
-#+ * ShapeKeyPoint.co -> co: float[3] "NO DESCRIPTION"
-#TODO BETTER NAME * SmokeDomainSettings.alpha -> alpha: float "Higher value results in sinking smoke"
-#+ * SmokeDomainSettings.amplify -> amplify: int "Enhance the resolution of smoke by this factor using noise"
-#TODO BETTER NAME * SmokeDomainSettings.beta -> beta: float "Higher value results in faster rising smoke"
-#SmokeDomainSettings.collision_extents -> collision_extents: enum "Selects which domain border will be treated as collision object."
-#SmokeDomainSettings.collision_group -> collision_group: pointer "Limit collisions to this group"
-#+ * SmokeDomainSettings.dissolve_speed -> dissolve_speed: int "Dissolve Speed"
-#SmokeDomainSettings.effector_group -> effector_group: pointer "Limit effectors to this group"
-#+ * SmokeDomainSettings.effector_weights -> effector_weights: pointer, "(read-only)"
-#+ * SmokeDomainSettings.fluid_group -> fluid_group: pointer "Limit fluid objects to this group"
-#+ * SmokeDomainSettings.noise_type -> noise_type: enum "Noise method which is used for creating the high resolution"
-#SmokeDomainSettings.point_cache_compress_high_type -> point_cache_compress_high_type: enum "Compression method to be used"
-#SmokeDomainSettings.point_cache_compress_type -> point_cache_compress_type: enum "Compression method to be used"
-#+ * SmokeDomainSettings.point_cache_high -> point_cache_high: pointer, "(read-only)"
-#+ * SmokeDomainSettings.point_cache_low -> point_cache_low: pointer, "(read-only)"
-#SmokeDomainSettings.resolution_max -> resolution_max: int "Maximal resolution used in the fluid domain"
-#SmokeDomainSettings.show_high_resolution -> show_high_resolution: boolean "Show high resolution (using amplification)"
-#SmokeDomainSettings.smooth_emitter -> smooth_emitter: boolean "Smoothens emitted smoke to avoid blockiness."
-#+ * SmokeDomainSettings.strength -> strength: float "Strength of wavelet noise"
-#+ * SmokeDomainSettings.time_scale -> time_scale: float "Adjust simulation speed."
-#SmokeDomainSettings.use_dissolve_smoke -> use_dissolve_smoke: boolean "Enable smoke to disappear over time"
-#SmokeDomainSettings.use_dissolve_smoke_log -> use_dissolve_smoke_log: boolean "Using 1/x"
-#SmokeDomainSettings.use_high_resolution -> use_high_resolution: boolean "Enable high resolution (using amplification)"
-#+ * SmokeDomainSettings.vorticity -> vorticity: float "Amount of turbulence/rotation in fluid."
-#+ * SmokeFlowSettings.density -> density: float "NO DESCRIPTION"
-#+ * SmokeFlowSettings.initial_velocity -> initial_velocity: boolean "Smoke inherits its velocity from the emitter particle"
-#SmokeFlowSettings.particle_system -> particle_system: pointer "Particle systems emitted from the object"
-#+ * SmokeFlowSettings.temperature -> temperature: float "Temperature difference to ambient temperature"
-#SmokeFlowSettings.use_absolute -> use_absolute: boolean "Only allows given density value in emitter area."
-#SmokeFlowSettings.use_outflow -> use_outflow: boolean "Deletes smoke from simulation"
-#SmokeFlowSettings.velocity_factor -> velocity_factor: float "Multiplier to adjust velocity passed to smoke"
-#+ * SoftBodySettings.aero -> aero: float "Make edges sail"
-#+ * SoftBodySettings.aerodynamics_type -> aerodynamics_type: enum "Method of calculating aerodynamic interaction"
-#+ * SoftBodySettings.ball_damp -> ball_damp: float "Blending to inelastic collision"
-#+ * SoftBodySettings.ball_size -> ball_size: float "Absolute ball size or factor if not manual adjusted"
-#+ * SoftBodySettings.ball_stiff -> ball_stiff: float "Ball inflating pressure"
-#SoftBodySettings.bend -> bend: float "Bending Stiffness"
-#+ * SoftBodySettings.choke -> choke: int "Viscosity inside collision target"
-#+ * SoftBodySettings.collision_type -> collision_type: enum "Choose Collision Type"
-#SoftBodySettings.damping -> damping: float "Edge spring friction"
-#+ * SoftBodySettings.effector_weights -> effector_weights: pointer, "(read-only)"
-#SoftBodySettings.error_threshold -> error_threshold: float "The Runge-Kutta ODE solver error limit, low value gives more precision, high values speed"
-#+ * SoftBodySettings.friction -> friction: float "General media friction for point movements"
-#+ * SoftBodySettings.fuzzy -> fuzzy: int "Fuzziness while on collision, high values make collsion handling faster but less stable"
-#+ * SoftBodySettings.goal_default -> goal_default: float "Default Goal (vertex target position) value, when no Vertex Group used"
-#+ * SoftBodySettings.goal_friction -> goal_friction: float "Goal (vertex target position) friction"
-#+ * SoftBodySettings.goal_max -> goal_max: float "Goal maximum, vertex weights are scaled to match this range"
-#+ * SoftBodySettings.goal_min -> goal_min: float "Goal minimum, vertex weights are scaled to match this range"
-#+ * SoftBodySettings.goal_spring -> goal_spring: float "Goal (vertex target position) spring stiffness"
-#+ * SoftBodySettings.goal_vertex_group -> goal_vertex_group: string "Control point weight values"
-#+ * SoftBodySettings.gravity -> gravity: float "Apply gravitation to point movement"
-#SoftBodySettings.location_mass_center -> location_mass_center: float[3] "Location of Center of mass"
-#+ * SoftBodySettings.mass -> mass: float "General Mass value"
-#+ * SoftBodySettings.mass_vertex_group -> mass_vertex_group: string "Control point mass values"
-#+ * SoftBodySettings.plastic -> plastic: float "Permanent deform"
-#+ * SoftBodySettings.pull -> pull: float "Edge spring stiffness when longer than rest length"
-#+ * SoftBodySettings.push -> push: float "Edge spring stiffness when shorter than rest length"
-#SoftBodySettings.rotation_estimate -> rotation_estimate: float[9] "Estimated rotation matrix"
-#SoftBodySettings.scale_estimate -> scale_estimate: float[9] "Estimated scale matrix"
-#+ * SoftBodySettings.shear -> shear: float "Shear Stiffness"
-#+ * SoftBodySettings.speed -> speed: float "Tweak timing for physics to control frequency and speed"
-#+ * SoftBodySettings.spring_length -> spring_length: float "Alter spring length to shrink/blow up (unit %) 0 to disable"
-#+ * SoftBodySettings.spring_vertex_group -> spring_vertex_group: string "Control point spring strength values"
-#SoftBodySettings.step_max -> step_max: int "Maximal # solver steps/frame"
-#SoftBodySettings.step_min -> step_min: int "Minimal # solver steps/frame"
-#SoftBodySettings.use_auto_step -> use_auto_step: boolean "Use velocities for automagic step sizes"
-#SoftBodySettings.use_diagnose -> use_diagnose: boolean "Turn on SB diagnose console prints"
-#SoftBodySettings.use_edge_collision -> use_edge_collision: boolean "Edges collide too"
-#+ * SoftBodySettings.use_edges -> use_edges: boolean "Use Edges as springs"
-#SoftBodySettings.use_estimate_matrix -> use_estimate_matrix: boolean "estimate matrix .. split to COM , ROT ,SCALE"
-#SoftBodySettings.use_face_collision -> use_face_collision: boolean "Faces collide too, can be very slow"
-#+ * SoftBodySettings.use_goal -> use_goal: boolean "Define forces for vertices to stick to animated position"
-#SoftBodySettings.use_self_collision -> use_self_collision: boolean "Enable naive vertex ball self collision"
-#SoftBodySettings.use_stiff_quads -> use_stiff_quads: boolean "Adds diagonal springs on 4-gons"
-#+ * Space.type -> type: enum, "(read-only) Space data type"
-#+ * SpaceUVEditor.cursor_location -> cursor_location: float[2] "2D cursor location for this view"
-#+ * SpaceUVEditor.draw_stretch_type -> draw_stretch_type: enum "Type of stretch to draw"
-#+ * SpaceUVEditor.edge_draw_type -> edge_draw_type: enum "Draw type for drawing UV edges"
-#SpaceUVEditor.lock_bounds -> lock_bounds: boolean "Constraint to stay within the image bounds while editing"
-#SpaceUVEditor.pivot_point -> pivot_point: enum "Rotation/Scaling Pivot"
-#SpaceUVEditor.show_modified_edges -> show_modified_edges: boolean "Draw edges after modifiers are applied"
-#SpaceUVEditor.show_normalized_coords -> show_normalized_coords: boolean "Display UV coordinates from 0.0 to 1.0 rather than in pixels"
-#SpaceUVEditor.show_other_objects -> show_other_objects: boolean "Draw other selected objects that share the same image"
-#SpaceUVEditor.show_smooth_edges -> show_smooth_edges: boolean "Draw UV edges anti-aliased"
-#SpaceUVEditor.show_stretch -> show_stretch: boolean "Draw faces colored according to the difference in shape between UVs and their 3D coordinates (blue for low distortion, red for high distortion)"
-#SpaceUVEditor.sticky_select_mode -> sticky_select_mode: enum "Automatically select also UVs sharing the same vertex as the ones being selected"
-#SpaceUVEditor.use_live_unwrap -> use_live_unwrap: boolean "Continuously unwrap the selected UV island while transforming pinned vertices"
-#SpaceUVEditor.use_snap_to_pixels -> use_snap_to_pixels: boolean "Snap UVs to pixel locations while editing"
-#+ * Space|SpaceConsole.console_type -> console_type: enum "Console type"
-#+ * Space|SpaceConsole.font_size -> font_size: int "Font size to use for displaying the text"
-#+ * Space|SpaceConsole.history -> history: collection, "(read-only) Command history"
-#+ * Space|SpaceConsole.language -> language: string "Command line prompt language"
-#+ * Space|SpaceConsole.prompt -> prompt: string "Command line prompt"
-#+ * Space|SpaceConsole.scrollback -> scrollback: collection, "(read-only) Command output"
-#Space|SpaceConsole.select_end -> select_end: int "NO DESCRIPTION"
-#Space|SpaceConsole.select_start -> select_start: int "NO DESCRIPTION"
-#+ * Space|SpaceConsole.show_report_debug -> show_report_debug: boolean "Display debug reporting info"
-#+ * Space|SpaceConsole.show_report_error -> show_report_error: boolean "Display error text"
-#+ * Space|SpaceConsole.show_report_info -> show_report_info: boolean "Display general information"
-#+ * Space|SpaceConsole.show_report_operator -> show_report_operator: boolean "Display the operator log"
-#Space|SpaceConsole.show_report_warning -> show_report_warning: boolean "Display warnings"
-#+ * Space|SpaceDopeSheetEditor.action -> action: pointer "Action displayed and edited in this space"
-#Space|SpaceDopeSheetEditor.auto_snap -> auto_snap: enum "Automatic time snapping settings for transformations"
-#+ * Space|SpaceDopeSheetEditor.dopesheet -> dopesheet: pointer, "(read-only) Settings for filtering animation data"
-#+ * Space|SpaceDopeSheetEditor.mode -> mode: enum "Editing context being displayed"
-#Space|SpaceDopeSheetEditor.show_frame_indicator -> show_frame_indicator: boolean "Show frame number beside the current frame indicator line"
-#+ * Space|SpaceDopeSheetEditor.show_seconds -> show_seconds: boolean, "(read-only) Show timing in seconds not frames"
-#+ * Space|SpaceDopeSheetEditor.show_sliders -> show_sliders: boolean "Show sliders beside F-Curve channels"
-#Space|SpaceDopeSheetEditor.use_auto_merge_keyframes -> use_auto_merge_keyframes: boolean "Automatically merge nearby keyframes"
-#+ * Space|SpaceDopeSheetEditor.use_marker_sync -> use_marker_sync: boolean "Sync Markers with keyframe edits"
-#Space|SpaceDopeSheetEditor.use_realtime_update -> use_realtime_update: boolean "When transforming keyframes, changes to the animation data are flushed to other views"
-#+ * Space|SpaceFileBrowser.params -> params: pointer, "(read-only) Parameters and Settings for the Filebrowser"
-#Space|SpaceGraphEditor.auto_snap -> auto_snap: enum "Automatic time snapping settings for transformations"
-#Space|SpaceGraphEditor.cursor_position_y -> cursor_position_y: float "Graph Editor 2D-Value cursor - Y-Value component"
-#+ * Space|SpaceGraphEditor.dopesheet -> dopesheet: pointer, "(read-only) Settings for filtering animation data"
-#+ * Space|SpaceGraphEditor.has_ghost_curves -> has_ghost_curves: boolean "Graph Editor instance has some ghost curves stored"
-#+ * Space|SpaceGraphEditor.mode -> mode: enum "Editing context being displayed"
-#+ * Space|SpaceGraphEditor.pivot_point -> pivot_point: enum "Pivot center for rotation/scaling"
-#+ * Space|SpaceGraphEditor.show_cursor -> show_cursor: boolean "Show 2D cursor"
-#Space|SpaceGraphEditor.show_frame_indicator -> show_frame_indicator: boolean "Show frame number beside the current frame indicator line"
-#+ * Space|SpaceGraphEditor.show_handles -> show_handles: boolean "Show handles of Bezier control points"
-#+ * Space|SpaceGraphEditor.show_seconds -> show_seconds: boolean, "(read-only) Show timing in seconds not frames"
-#+ * Space|SpaceGraphEditor.show_sliders -> show_sliders: boolean "Show sliders beside F-Curve channels"
-#Space|SpaceGraphEditor.use_auto_merge_keyframes -> use_auto_merge_keyframes: boolean "Automatically merge nearby keyframes"
-#Space|SpaceGraphEditor.use_only_selected_curves_handles -> use_only_selected_curves_handles: boolean "Only keyframes of selected F-Curves are visible and editable"
-#Space|SpaceGraphEditor.use_only_selected_keyframe_handles -> use_only_selected_keyframe_handles: boolean "Only show and edit handles of selected keyframes"
-#Space|SpaceGraphEditor.use_realtime_update -> use_realtime_update: boolean "When transforming keyframes, changes to the animation data are flushed to other views"
-#+ * Space|SpaceImageEditor.curves -> curves: pointer, "(read-only) Color curve mapping to use for displaying the image"
-#+ * Space|SpaceImageEditor.draw_channels -> draw_channels: enum "Channels of the image to draw"
-#+ * Space|SpaceImageEditor.grease_pencil -> grease_pencil: pointer "Grease pencil data for this space"
-#+ * Space|SpaceImageEditor.image -> image: pointer "Image displayed and edited in this space"
-#+ * Space|SpaceImageEditor.image_user -> image_user: pointer, "(read-only) Parameters defining which layer, pass and frame of the image is displayed"
-#+ * Space|SpaceImageEditor.sample_histogram -> sample_histogram: pointer, "(read-only) Sampled colors along line"
-#+ * Space|SpaceImageEditor.scopes -> scopes: pointer, "(read-only) Scopes to visualize image statistics."
-#+ * Space|SpaceImageEditor.show_paint -> show_paint: boolean, "(read-only) Show paint related properties"
-#+ * Space|SpaceImageEditor.show_render -> show_render: boolean, "(read-only) Show render related properties"
-#Space|SpaceImageEditor.show_repeat -> show_repeat: boolean "Draw the image repeated outside of the main view"
-#+ * Space|SpaceImageEditor.show_uvedit -> show_uvedit: boolean, "(read-only) Show UV editing related properties"
-#+ * Space|SpaceImageEditor.use_grease_pencil -> use_grease_pencil: boolean "Display and edit the grease pencil freehand annotations overlay"
-#Space|SpaceImageEditor.use_image_paint -> use_image_paint: boolean "Enable image painting mode"
-#Space|SpaceImageEditor.use_image_pin -> use_image_pin: boolean "Display current image regardless of object selection"
-#Space|SpaceImageEditor.use_realtime_update -> use_realtime_update: boolean "Update other affected window spaces automatically to reflect changes during interactive operations such as transform"
-#+ * Space|SpaceImageEditor.uv_editor -> uv_editor: pointer, "(read-only) UV editor settings"
-#Space|SpaceLogicEditor.show_actuators_active_object -> show_actuators_active_object: boolean "Show actuators of active object"
-#Space|SpaceLogicEditor.show_actuators_active_states -> show_actuators_active_states: boolean "Show only actuators connected to active states"
-#Space|SpaceLogicEditor.show_actuators_linked_controller -> show_actuators_linked_controller: boolean "Show linked objects to the actuator"
-#Space|SpaceLogicEditor.show_actuators_selected_objects -> show_actuators_selected_objects: boolean "Show actuators of all selected objects"
-#Space|SpaceLogicEditor.show_controllers_active_object -> show_controllers_active_object: boolean "Show controllers of active object"
-#Space|SpaceLogicEditor.show_controllers_linked_controller -> show_controllers_linked_controller: boolean "Show linked objects to sensor/actuator"
-#Space|SpaceLogicEditor.show_controllers_selected_objects -> show_controllers_selected_objects: boolean "Show controllers of all selected objects"
-#Space|SpaceLogicEditor.show_sensors_active_object -> show_sensors_active_object: boolean "Show sensors of active object"
-#Space|SpaceLogicEditor.show_sensors_active_states -> show_sensors_active_states: boolean "Show only sensors connected to active states"
-#Space|SpaceLogicEditor.show_sensors_linked_controller -> show_sensors_linked_controller: boolean "Show linked objects to the controller"
-#Space|SpaceLogicEditor.show_sensors_selected_objects -> show_sensors_selected_objects: boolean "Show sensors of all selected objects"
-#Space|SpaceNLA.auto_snap -> auto_snap: enum "Automatic time snapping settings for transformations"
-#+ * Space|SpaceNLA.dopesheet -> dopesheet: pointer, "(read-only) Settings for filtering animation data"
-#Space|SpaceNLA.show_frame_indicator -> show_frame_indicator: boolean "Show frame number beside the current frame indicator line"
-#+ * Space|SpaceNLA.show_seconds -> show_seconds: boolean, "(read-only) Show timing in seconds not frames"
-#+ * Space|SpaceNLA.show_strip_curves -> show_strip_curves: boolean "Show influence curves on strips"
-#Space|SpaceNLA.use_realtime_update -> use_realtime_update: boolean "When transforming strips, changes to the animation data are flushed to other views"
-#+ * Space|SpaceNodeEditor.id -> id: pointer, "(read-only) Datablock whose nodes are being edited"
-#+ * Space|SpaceNodeEditor.id_from -> id_from: pointer, "(read-only) Datablock from which the edited datablock is linked"
-#+ * Space|SpaceNodeEditor.nodetree -> nodetree: pointer, "(read-only) Node tree being displayed and edited"
-#Space|SpaceNodeEditor.show_backdrop -> show_backdrop: boolean "Use active Viewer Node output as backdrop for compositing nodes"
-#+ * Space|SpaceNodeEditor.texture_type -> texture_type: enum "Type of data to take texture from"
-#+ * Space|SpaceNodeEditor.tree_type -> tree_type: enum "Node tree type to display and edit"
-#+ * Space|SpaceOutliner.display_mode -> display_mode: enum "Type of information to display"
-#Space|SpaceOutliner.filter_text -> filter_text: string "Live search filtering string"
-#Space|SpaceOutliner.show_restrict_columns -> show_restrict_columns: boolean "Show column"
-#Space|SpaceOutliner.use_filter_case_sensitive -> use_filter_case_sensitive: boolean "Only use case sensitive matches of search string"
-#Space|SpaceOutliner.use_filter_complete -> use_filter_complete: boolean "Only use complete matches of search string"
-#+ * Space|SpaceProperties.align -> align: enum "Arrangement of the panels"
-#+ * Space|SpaceProperties.context -> context: enum "Type of active data to display and edit"
-#+ * Space|SpaceProperties.pin_id -> pin_id: pointer "NO DESCRIPTION"
-#Space|SpaceProperties.show_brush_texture -> show_brush_texture: boolean "Show brush textures"
-#+ * Space|SpaceProperties.use_pin_id -> use_pin_id: boolean "Use the pinned context"
-#+ * Space|SpaceSequenceEditor.display_channel -> display_channel: int "The channel number shown in the image preview. 0 is the result of all strips combined"
-#+ * Space|SpaceSequenceEditor.display_mode -> display_mode: enum "The view mode to use for displaying sequencer output"
-#+ * Space|SpaceSequenceEditor.draw_overexposed -> draw_overexposed: int "Show overexposed areas with zebra stripes"
-#+ * Space|SpaceSequenceEditor.grease_pencil -> grease_pencil: pointer, "(read-only) Grease pencil data for this space"
-#+ * Space|SpaceSequenceEditor.offset_x -> offset_x: float "Offsets image horizontally from the view center"
-#+ * Space|SpaceSequenceEditor.offset_y -> offset_y: float "Offsets image horizontally from the view center"
-#+ * Space|SpaceSequenceEditor.proxy_render_size -> proxy_render_size: enum "Draw preview using full resolution or different proxy resolutions"
-#Space|SpaceSequenceEditor.show_frame_indicator -> show_frame_indicator: boolean "Show frame number beside the current frame indicator line"
-#Space|SpaceSequenceEditor.show_frames -> show_frames: boolean "Draw frames rather than seconds"
-#Space|SpaceSequenceEditor.show_safe_margin -> show_safe_margin: boolean "Draw title safe margins in preview"
-#Space|SpaceSequenceEditor.show_separate_color -> show_separate_color: boolean "Separate color channels in preview"
-#+ * Space|SpaceSequenceEditor.use_grease_pencil -> use_grease_pencil: boolean "Display and edit the grease pencil freehand annotations overlay"
-#+ * Space|SpaceSequenceEditor.use_marker_sync -> use_marker_sync: boolean "Transform markers as well as strips"
-#+ * Space|SpaceSequenceEditor.view_type -> view_type: enum "The type of the Sequencer view (sequencer, preview or both)"
-#+ * Space|SpaceSequenceEditor.zoom -> zoom: float "Display zoom level"
-#+ * Space|SpaceTextEditor.find_text -> find_text: string "Text to search for with the find tool"
-#+ * Space|SpaceTextEditor.font_size -> font_size: int "Font size to use for displaying the text"
-#+ * Space|SpaceTextEditor.replace_text -> replace_text: string "Text to replace selected text with using the replace tool"
-#Space|SpaceTextEditor.show_line_highlight -> show_line_highlight: boolean "Highlight the current line"
-#+ * Space|SpaceTextEditor.show_line_numbers -> show_line_numbers: boolean "Show line numbers next to the text"
-#+ * Space|SpaceTextEditor.show_syntax_highlight -> show_syntax_highlight: boolean "Syntax highlight for scripting"
-#+ * Space|SpaceTextEditor.show_word_wrap -> show_word_wrap: boolean "Wrap words if there is not enough horizontal space"
-#+ * Space|SpaceTextEditor.tab_width -> tab_width: int "Number of spaces to display tabs with"
-#+ * Space|SpaceTextEditor.text -> text: pointer "Text displayed and edited in this space"
-#Space|SpaceTextEditor.use_find_all -> use_find_all: boolean "Search in all text datablocks, instead of only the active one"
-#Space|SpaceTextEditor.use_find_wrap -> use_find_wrap: boolean "Search again from the start of the file when reaching the end"
-#Space|SpaceTextEditor.use_live_edit -> use_live_edit: boolean "Run python while editing"
-#Space|SpaceTextEditor.use_overwrite -> use_overwrite: boolean "Overwrite characters when typing rather than inserting them"
-#+ * Space|SpaceTimeline.cache_cloth -> cache_cloth: boolean "Show the active objects cloth point cache"
-#+ * Space|SpaceTimeline.cache_particles -> cache_particles: boolean "Show the active objects particle point cache"
-#+ * Space|SpaceTimeline.cache_smoke -> cache_smoke: boolean "Show the active objects smoke cache"
-#+ * Space|SpaceTimeline.cache_softbody -> cache_softbody: boolean "Show the active objects softbody point cache"
-#+ * Space|SpaceTimeline.show_cache -> show_cache: boolean "Show the status of cached frames in the timeline"
-#Space|SpaceTimeline.show_frame_indicator -> show_frame_indicator: boolean "Show frame number beside the current frame indicator line"
-#Space|SpaceTimeline.show_only_selected -> show_only_selected: boolean "Show keyframes for active Object and/or its selected channels only"
-#Space|SpaceTimeline.use_play_3d_editors -> use_play_3d_editors: boolean "NO DESCRIPTION"
-#Space|SpaceTimeline.use_play_animation_editors -> use_play_animation_editors: boolean "NO DESCRIPTION"
-#Space|SpaceTimeline.use_play_image_editors -> use_play_image_editors: boolean "NO DESCRIPTION"
-#Space|SpaceTimeline.use_play_node_editors -> use_play_node_editors: boolean "NO DESCRIPTION"
-#Space|SpaceTimeline.use_play_properties_editors -> use_play_properties_editors: boolean "NO DESCRIPTION"
-#Space|SpaceTimeline.use_play_sequence_editors -> use_play_sequence_editors: boolean "NO DESCRIPTION"
-#Space|SpaceTimeline.use_play_top_left_3d_editor -> use_play_top_left_3d_editor: boolean "NO DESCRIPTION"
-#Space|SpaceUserPreferences.filter_text -> filter_text: string "Search term for filtering in the UI"
-#+ * Space|SpaceView3D.background_images -> background_images: collection, "(read-only) List of background images"
-#+ * Space|SpaceView3D.camera -> camera: pointer "Active camera used in this view (when unlocked from the scenes active camera)"
-#+ * Space|SpaceView3D.clip_end -> clip_end: float "3D View far clipping distance"
-#+ * Space|SpaceView3D.clip_start -> clip_start: float "3D View near clipping distance"
-#+ * Space|SpaceView3D.current_orientation -> current_orientation: pointer, "(read-only) Current Transformation orientation"
-#+ * Space|SpaceView3D.cursor_location -> cursor_location: float[3] "3D cursor location for this view (dependent on local view setting)"
-#+ * Space|SpaceView3D.grid_lines -> grid_lines: int "The number of grid lines to display in perspective view"
-#+ * Space|SpaceView3D.grid_spacing -> grid_spacing: float "The distance between 3D View grid lines"
-#+ * Space|SpaceView3D.grid_subdivisions -> grid_subdivisions: int "The number of subdivisions between grid lines"
-#+ * Space|SpaceView3D.layers -> layers: boolean[20] "Layers visible in this 3D View"
-#Space|SpaceView3D.layers_used -> layers_used: boolean[20], "(read-only) Layers that contain something"
-#+ * Space|SpaceView3D.lens -> lens: float "Lens angle (mm) in perspective view"
-#+ * Space|SpaceView3D.local_view -> local_view: pointer, "(read-only) Display an isolated sub-set of objects, apart from the scene visibility"
-#+ * Space|SpaceView3D.lock_bone -> lock_bone: string "3D View center is locked to this bones position"
-#+ * Space|SpaceView3D.lock_camera_and_layers -> lock_camera_and_layers: boolean "Use the scenes active camera and layers in this view, rather than local layers"
-#+ * Space|SpaceView3D.lock_object -> lock_object: pointer "3D View center is locked to this objects position"
-#+ * Space|SpaceView3D.pivot_point -> pivot_point: enum "Pivot center for rotation/scaling"
-#+ * Space|SpaceView3D.region_3d -> region_3d: pointer, "(read-only) 3D region in this space, in case of quad view the camera region"
-#+ * Space|SpaceView3D.region_quadview -> region_quadview: pointer, "(read-only) 3D region that defines the quad view settings"
-#Space|SpaceView3D.show_all_objects_origin -> show_all_objects_origin: boolean "Show the object origin center dot for all (selected and unselected) objects"
-#Space|SpaceView3D.show_axis_x -> show_axis_x: boolean "Show the X axis line in perspective view"
-#Space|SpaceView3D.show_axis_y -> show_axis_y: boolean "Show the Y axis line in perspective view"
-#Space|SpaceView3D.show_axis_z -> show_axis_z: boolean "Show the Z axis line in perspective view"
-#Space|SpaceView3D.show_background_images -> show_background_images: boolean "Display reference images behind objects in the 3D View"
-#Space|SpaceView3D.show_floor -> show_floor: boolean "Show the ground plane grid in perspective view"
-#Space|SpaceView3D.show_manipulator -> show_manipulator: boolean "Use a 3D manipulator widget for controlling transforms"
-#Space|SpaceView3D.show_only_render -> show_only_render: boolean "Display only objects which will be rendered"
-#Space|SpaceView3D.show_outline_selected -> show_outline_selected: boolean "Show an outline highlight around selected objects in non-wireframe views"
-#Space|SpaceView3D.show_relationship_lines -> show_relationship_lines: boolean "Show dashed lines indicating parent or constraint relationships"
-#Space|SpaceView3D.show_textured_solid -> show_textured_solid: boolean "Display face-assigned textures in solid view"
-#+ * Space|SpaceView3D.transform_orientation -> transform_orientation: enum "Transformation orientation"
-#Space|SpaceView3D.use_manipulator_rotate -> use_manipulator_rotate: boolean "Use the manipulator for rotation transformations"
-#Space|SpaceView3D.use_manipulator_scale -> use_manipulator_scale: boolean "Use the manipulator for scale transformations"
-#Space|SpaceView3D.use_manipulator_translate -> use_manipulator_translate: boolean "Use the manipulator for movement transformations"
-#Space|SpaceView3D.use_occlude_geometry -> use_occlude_geometry: boolean "Limit selection to visible (clipped with depth buffer)"
-#Space|SpaceView3D.use_pivot_point_align -> use_pivot_point_align: boolean "Manipulate object centers only"
-#Space|SpaceView3D.viewport_shade -> viewport_shade: enum "Method to display/shade objects in the 3D View"
-#+ * Spline.bezier_points -> bezier_points: collection, "(read-only) Collection of points for bezier curves only"
-#+ * Spline.character_index -> character_index: int, "(read-only) Location of this character in the text data (only for text curves)"
-#+ * Spline.hide -> hide: boolean "Hide this curve in editmode"
-#+ * Spline.material_index -> material_index: int "NO DESCRIPTION"
-#+ * Spline.order_u -> order_u: int "Nurbs order in the U direction (For splines and surfaces), Higher values let points influence a greater area"
-#+ * Spline.order_v -> order_v: int "Nurbs order in the V direction (For surfaces only), Higher values let points influence a greater area"
-#+ * Spline.point_count_u -> point_count_u: int, "(read-only) Total number points for the curve or surface in the U direction"
-#+ * Spline.point_count_v -> point_count_v: int, "(read-only) Total number points for the surface on the V direction"
-#+ * Spline.points -> points: collection, "(read-only) Collection of points that make up this poly or nurbs spline"
-#+ * Spline.radius_interpolation -> radius_interpolation: enum "The type of radius interpolation for Bezier curves"
-#+ * Spline.resolution_u -> resolution_u: int "Curve or Surface subdivisions per segment"
-#+ * Spline.resolution_v -> resolution_v: int "Surface subdivisions per segment"
-#+ * Spline.tilt_interpolation -> tilt_interpolation: enum "The type of tilt interpolation for 3D, Bezier curves"
-#+ * Spline.type -> type: enum "The interpolation type for this curve element"
-#Spline.use_bezier_u -> use_bezier_u: boolean "Make this nurbs curve or surface act like a bezier spline in the U direction (Order U must be 3 or 4, Cyclic U must be disabled)"
-#Spline.use_bezier_v -> use_bezier_v: boolean "Make this nurbs surface act like a bezier spline in the V direction (Order V must be 3 or 4, Cyclic V must be disabled)"
-#Spline.use_cyclic_u -> use_cyclic_u: boolean "Make this curve or surface a closed loop in the U direction"
-#Spline.use_cyclic_v -> use_cyclic_v: boolean "Make this surface a closed loop in the V direction"
-#Spline.use_endpoint_u -> use_endpoint_u: boolean "Make this nurbs curve or surface meet the endpoints in the U direction (Cyclic U must be disabled)"
-#Spline.use_endpoint_v -> use_endpoint_v: boolean "Make this nurbs surface meet the endpoints in the V direction (Cyclic V must be disabled)"
-#Spline.use_smooth -> use_smooth: boolean "Smooth the normals of the surface or beveled curve"
-#+ * SplinePoint.co -> co: float[4] "Point coordinates"
-#+ * SplinePoint.hide -> hide: boolean "Visibility status"
-#+ * SplinePoint.radius -> radius: float, "(read-only) Radius for bevelling"
-#+ * SplinePoint.select -> select: boolean "Selection status"
-#+ * SplinePoint.tilt -> tilt: float "Tilt in 3D View"
-#+ * SplinePoint.weight -> weight: float "Nurbs weight"
-#+ * SplinePoint.weight_softbody -> weight_softbody: float "Softbody goal weight"
-#+ * Struct.base -> base: pointer, "(read-only) Struct definition this is derived from"
-#+ * Struct.description -> description: string, "(read-only) Description of the Structs purpose"
-#+ * Struct.functions -> functions: collection, "(read-only)"
-#+ * Struct.identifier -> identifier: string, "(read-only) Unique name used in the code and scripting"
-#+ * Struct.name -> name: string, "(read-only) Human readable name"
-#+ * Struct.name_property -> name_property: pointer, "(read-only) Property that gives the name of the struct"
-#+ * Struct.nested -> nested: pointer, "(read-only) Struct in which this struct is always nested, and to which it logically belongs"
-#+ * Struct.properties -> properties: collection, "(read-only) Properties in the struct"
-#+ * TexMapping.location -> location: float[3] "NO DESCRIPTION"
-#TexMapping.max -> max: float[3] "Maximum value for clipping"
-#TexMapping.min -> min: float[3] "Minimum value for clipping"
-#+ * TexMapping.rotation -> rotation: float[3] "NO DESCRIPTION"
-#+ * TexMapping.scale -> scale: float[3] "NO DESCRIPTION"
-#TexMapping.use_max -> use_max: boolean "Whether to use maximum clipping value"
-#TexMapping.use_min -> use_min: boolean "Whether to use minimum clipping value"
-#+ * TextBox.height -> height: float "NO DESCRIPTION"
-#+ * TextBox.width -> width: float "NO DESCRIPTION"
-#+ * TextBox.x -> x: float "NO DESCRIPTION"
-#+ * TextBox.y -> y: float "NO DESCRIPTION"
-#TextCharacterFormat.use_bold -> use_bold: boolean "NO DESCRIPTION"
-#TextCharacterFormat.use_italic -> use_italic: boolean "NO DESCRIPTION"
-#+ * TextCharacterFormat.use_small_caps -> use_small_caps: boolean "NO DESCRIPTION"
-#TextCharacterFormat.use_underline -> use_underline: boolean "NO DESCRIPTION"
-#+ * TextLine.body -> body: string "Text in the line"
-#TextMarker.character_index_end -> character_index_end: int, "(read-only) Start position of the marker in the line"
-#TextMarker.character_index_start -> character_index_start: int, "(read-only) Start position of the marker in the line"
-#+ * TextMarker.color -> color: float[4] "Color to display the marker with"
-#+ * TextMarker.group -> group: int, "(read-only)"
-#TextMarker.is_temporary -> is_temporary: boolean, "(read-only) Marker is temporary"
-#+ * TextMarker.line -> line: int, "(read-only) Line in which the marker is located"
-#TextMarker.use_edit_all -> use_edit_all: boolean, "(read-only) Edit all markers of the same group as one"
-#+ * TextureSlot.blend_type -> blend_type: enum "NO DESCRIPTION"
-#+ * TextureSlot.color -> color: float[3] "The default color for textures that dont return RGB"
-#+ * TextureSlot.default_value -> default_value: float "Value to use for Ref, Spec, Amb, Emit, Alpha, RayMir, TransLu and Hard"
-#TextureSlot.invert -> invert: boolean "Inverts the values of the texture to reverse its effect"
-#+ * TextureSlot.name -> name: string, "(read-only) Texture slot name"
-#+ * TextureSlot.offset -> offset: float[3] "Fine tunes texture mapping X, Y and Z locations"
-#+ * TextureSlot.output_node -> output_node: enum "Which output node to use, for node-based textures"
-#TextureSlot.scale -> scale: float[3] "Sets scaling for the textures X, Y and Z sizes"
-#+ * TextureSlot.texture -> texture: pointer "Texture datablock used by this texture slot"
-#TextureSlot.use_rgb_to_intensity -> use_rgb_to_intensity: boolean "Converts texture RGB values to intensity (gray) values"
-#TextureSlot.use_stencil -> use_stencil: boolean "Use this texture as a blending value on the next texture"
-#+ * TextureSlot|BrushTextureSlot.angle -> angle: float "Defines brush texture rotation"
-#+ * TextureSlot|BrushTextureSlot.map_mode -> map_mode: enum "NO DESCRIPTION"
-#+ * TextureSlot|LampTextureSlot.color_factor -> color_factor: float "Amount texture affects color values"
-#+ * TextureSlot|LampTextureSlot.object -> object: pointer "Object to use for mapping with Object texture coordinates"
-#+ * TextureSlot|LampTextureSlot.shadow_factor -> shadow_factor: float "Amount texture affects shadow"
-#TextureSlot|LampTextureSlot.texture_coords -> texture_coords: enum "NO DESCRIPTION"
-#TextureSlot|LampTextureSlot.use_map_color -> use_map_color: boolean "Lets the texture affect the basic color of the lamp"
-#TextureSlot|LampTextureSlot.use_map_shadow -> use_map_shadow: boolean "Lets the texture affect the shadow color of the lamp"
-#+ * TextureSlot|MaterialTextureSlot.alpha_factor -> alpha_factor: float "Amount texture affects alpha"
-#+ * TextureSlot|MaterialTextureSlot.ambient_factor -> ambient_factor: float "Amount texture affects ambient"
-#TextureSlot|MaterialTextureSlot.color_emission_factor -> color_emission_factor: float "Amount texture affects emission color"
-#+ * TextureSlot|MaterialTextureSlot.density_factor -> density_factor: float "Amount texture affects density"
-#TextureSlot|MaterialTextureSlot.diffuse_color_factor -> diffuse_color_factor: float "Amount texture affects diffuse color"
-#+ * TextureSlot|MaterialTextureSlot.diffuse_factor -> diffuse_factor: float "Amount texture affects diffuse reflectivity"
-#+ * TextureSlot|MaterialTextureSlot.displacement_factor -> displacement_factor: float "Amount texture displaces the surface"
-#+ * TextureSlot|MaterialTextureSlot.emission_factor -> emission_factor: float "Amount texture affects emission"
-#+ * TextureSlot|MaterialTextureSlot.emit_factor -> emit_factor: float "Amount texture affects emission"
-#+ * TextureSlot|MaterialTextureSlot.hardness_factor -> hardness_factor: float "Amount texture affects hardness"
-#+ * TextureSlot|MaterialTextureSlot.mapping -> mapping: enum "NO DESCRIPTION"
-#TextureSlot|MaterialTextureSlot.mapping_x -> mapping_x: enum "NO DESCRIPTION"
-#TextureSlot|MaterialTextureSlot.mapping_y -> mapping_y: enum "NO DESCRIPTION"
-#TextureSlot|MaterialTextureSlot.mapping_z -> mapping_z: enum "NO DESCRIPTION"
-#+ * TextureSlot|MaterialTextureSlot.mirror_factor -> mirror_factor: float "Amount texture affects mirror color"
-#+ * TextureSlot|MaterialTextureSlot.normal_factor -> normal_factor: float "Amount texture affects normal values"
-#+ * TextureSlot|MaterialTextureSlot.normal_map_space -> normal_map_space: enum "NO DESCRIPTION"
-#+ * TextureSlot|MaterialTextureSlot.object -> object: pointer "Object to use for mapping with Object texture coordinates"
-#+ * TextureSlot|MaterialTextureSlot.raymir_factor -> raymir_factor: float "Amount texture affects ray mirror"
-#TextureSlot|MaterialTextureSlot.reflection_color_factor -> reflection_color_factor: float "Amount texture affects color of out-scattered light"
-#+ * TextureSlot|MaterialTextureSlot.reflection_factor -> reflection_factor: float "Amount texture affects brightness of out-scattered light"
-#+ * TextureSlot|MaterialTextureSlot.scattering_factor -> scattering_factor: float "Amount texture affects scattering"
-#TextureSlot|MaterialTextureSlot.specular_color_factor -> specular_color_factor: float "Amount texture affects specular color"
-#+ * TextureSlot|MaterialTextureSlot.specular_factor -> specular_factor: float "Amount texture affects specular reflectivity"
-#TextureSlot|MaterialTextureSlot.texture_coords -> texture_coords: enum "NO DESCRIPTION"
-#+ * TextureSlot|MaterialTextureSlot.translucency_factor -> translucency_factor: float "Amount texture affects translucency"
-#TextureSlot|MaterialTextureSlot.transmission_color_factor -> transmission_color_factor: float "Amount texture affects result color after light has been scattered/absorbed"
-#+ * TextureSlot|MaterialTextureSlot.use -> use: boolean "Enable this material texture slot"
-#TextureSlot|MaterialTextureSlot.use_from_dupli -> use_from_dupli: boolean "Duplis instanced from verts, faces or particles, inherit texture coordinate from their parent"
-#TextureSlot|MaterialTextureSlot.use_from_original -> use_from_original: boolean "Duplis derive their object coordinates from the original objects transformation"
-#TextureSlot|MaterialTextureSlot.use_map_alpha -> use_map_alpha: boolean "Causes the texture to affect the alpha value"
-#TextureSlot|MaterialTextureSlot.use_map_ambient -> use_map_ambient: boolean "Causes the texture to affect the value of ambient"
-#TextureSlot|MaterialTextureSlot.use_map_color_diffuse -> use_map_color_diffuse: boolean "Causes the texture to affect basic color of the material"
-#TextureSlot|MaterialTextureSlot.use_map_color_emission -> use_map_color_emission: boolean "Causes the texture to affect the color of emission"
-#TextureSlot|MaterialTextureSlot.use_map_color_reflection -> use_map_color_reflection: boolean "Causes the texture to affect the color of scattered light"
-#TextureSlot|MaterialTextureSlot.use_map_color_spec -> use_map_color_spec: boolean "Causes the texture to affect the specularity color"
-#TextureSlot|MaterialTextureSlot.use_map_color_transmission -> use_map_color_transmission: boolean "Causes the texture to affect the result color after other light has been scattered/absorbed"
-#TextureSlot|MaterialTextureSlot.use_map_density -> use_map_density: boolean "Causes the texture to affect the volumes density"
-#TextureSlot|MaterialTextureSlot.use_map_diffuse -> use_map_diffuse: boolean "Causes the texture to affect the value of the materials diffuse reflectivity"
-#TextureSlot|MaterialTextureSlot.use_map_displacement -> use_map_displacement: boolean "Let the texture displace the surface"
-#TextureSlot|MaterialTextureSlot.use_map_emission -> use_map_emission: boolean "Causes the texture to affect the volumes emission"
-#TextureSlot|MaterialTextureSlot.use_map_emit -> use_map_emit: boolean "Causes the texture to affect the emit value"
-#TextureSlot|MaterialTextureSlot.use_map_hardness -> use_map_hardness: boolean "Causes the texture to affect the hardness value"
-#TextureSlot|MaterialTextureSlot.use_map_mirror -> use_map_mirror: boolean "Causes the texture to affect the mirror color"
-#TextureSlot|MaterialTextureSlot.use_map_normal -> use_map_normal: boolean "Causes the texture to affect the rendered normal"
-#TextureSlot|MaterialTextureSlot.use_map_raymir -> use_map_raymir: boolean "Causes the texture to affect the ray-mirror value"
-#TextureSlot|MaterialTextureSlot.use_map_reflect -> use_map_reflect: boolean "Causes the texture to affect the reflected lights brightness"
-#TextureSlot|MaterialTextureSlot.use_map_scatter -> use_map_scatter: boolean "Causes the texture to affect the volumes scattering"
-#TextureSlot|MaterialTextureSlot.use_map_specular -> use_map_specular: boolean "Causes the texture to affect the value of specular reflectivity"
-#TextureSlot|MaterialTextureSlot.use_map_translucency -> use_map_translucency: boolean "Causes the texture to affect the translucency value"
-#TextureSlot|MaterialTextureSlot.use_map_warp -> use_map_warp: boolean "Let the texture warp texture coordinates of next channels"
-#TextureSlot|MaterialTextureSlot.use_old_bump -> use_old_bump: boolean "Use old bump mapping (backwards compatibility option)"
-#+ * TextureSlot|MaterialTextureSlot.uv_layer -> uv_layer: string "UV layer to use for mapping with UV texture coordinates"
-#+ * TextureSlot|MaterialTextureSlot.warp_factor -> warp_factor: float "Amount texture affects texture coordinates of next channels"
-#+ * TextureSlot|WorldTextureSlot.blend_factor -> blend_factor: float "Amount texture affects color progression of the background"
-#+ * TextureSlot|WorldTextureSlot.horizon_factor -> horizon_factor: float "Amount texture affects color of the horizon"
-#+ * TextureSlot|WorldTextureSlot.object -> object: pointer "Object to use for mapping with Object texture coordinates"
-#TextureSlot|WorldTextureSlot.texture_coords -> texture_coords: enum "Texture coordinates used to map the texture onto the background"
-#TextureSlot|WorldTextureSlot.use_map_blend -> use_map_blend: boolean "Affect the color progression of the background"
-#TextureSlot|WorldTextureSlot.use_map_horizon -> use_map_horizon: boolean "Affect the color of the horizon"
-#TextureSlot|WorldTextureSlot.use_map_zenith_down -> use_map_zenith_down: boolean "Affect the color of the zenith below"
-#TextureSlot|WorldTextureSlot.use_map_zenith_up -> use_map_zenith_up: boolean "Affect the color of the zenith above"
-#+ * TextureSlot|WorldTextureSlot.zenith_down_factor -> zenith_down_factor: float "Amount texture affects color of the zenith below"
-#+ * TextureSlot|WorldTextureSlot.zenith_up_factor -> zenith_up_factor: float "Amount texture affects color of the zenith above"
-#+ * Theme.bone_color_sets -> bone_color_sets: collection, "(read-only)"
-#+ * Theme.console -> console: pointer, "(read-only)"
-#+ * Theme.dopesheet_editor -> dopesheet_editor: pointer, "(read-only)"
-#+ * Theme.file_browser -> file_browser: pointer, "(read-only)"
-#+ * Theme.graph_editor -> graph_editor: pointer, "(read-only)"
-#+ * Theme.image_editor -> image_editor: pointer, "(read-only)"
-#+ * Theme.info -> info: pointer, "(read-only)"
-#+ * Theme.logic_editor -> logic_editor: pointer, "(read-only)"
-#+ * Theme.name -> name: string "Name of the theme"
-#+ * Theme.nla_editor -> nla_editor: pointer, "(read-only)"
-#+ * Theme.node_editor -> node_editor: pointer, "(read-only)"
-#+ * Theme.outliner -> outliner: pointer, "(read-only)"
-#+ * Theme.properties -> properties: pointer, "(read-only)"
-#+ * Theme.sequence_editor -> sequence_editor: pointer, "(read-only)"
-#+ * Theme.text_editor -> text_editor: pointer, "(read-only)"
-#+ * Theme.theme_area -> theme_area: enum "NO DESCRIPTION"
-#+ * Theme.timeline -> timeline: pointer, "(read-only)"
-#+ * Theme.user_interface -> user_interface: pointer, "(read-only)"
-#+ * Theme.user_preferences -> user_preferences: pointer, "(read-only)"
-#+ * Theme.view_3d -> view_3d: pointer, "(read-only)"
-#+ * ThemeAudioWindow.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeAudioWindow.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeAudioWindow.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeAudioWindow.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeAudioWindow.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeAudioWindow.frame_current -> frame_current: float[3] "NO DESCRIPTION"
-#+ * ThemeAudioWindow.grid -> grid: float[3] "NO DESCRIPTION"
-#+ * ThemeAudioWindow.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeAudioWindow.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeAudioWindow.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeAudioWindow.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeAudioWindow.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeAudioWindow.title -> title: float[3] "NO DESCRIPTION"
-#+ * ThemeAudioWindow.window_sliders -> window_sliders: float[3] "NO DESCRIPTION"
-#+ * ThemeBoneColorSet.active -> active: float[3] "Color used for active bones"
-#+ * ThemeBoneColorSet.normal -> normal: float[3] "Color used for the surface of bones"
-#+ * ThemeBoneColorSet.select -> select: float[3] "Color used for selected bones"
-#ThemeBoneColorSet.show_colored_constraints -> show_colored_constraints: boolean "Allow the use of colors indicating constraints/keyed status"
-#+ * ThemeConsole.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeConsole.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeConsole.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeConsole.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeConsole.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeConsole.cursor -> cursor: float[3] "NO DESCRIPTION"
-#+ * ThemeConsole.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeConsole.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeConsole.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeConsole.line_error -> line_error: float[3] "NO DESCRIPTION"
-#+ * ThemeConsole.line_info -> line_info: float[3] "NO DESCRIPTION"
-#+ * ThemeConsole.line_input -> line_input: float[3] "NO DESCRIPTION"
-#+ * ThemeConsole.line_output -> line_output: float[3] "NO DESCRIPTION"
-#+ * ThemeConsole.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeConsole.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeConsole.title -> title: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.active_channels_group -> active_channels_group: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.channel_group -> channel_group: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.channels -> channels: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.channels_selected -> channels_selected: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.dopesheet_channel -> dopesheet_channel: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.dopesheet_subchannel -> dopesheet_subchannel: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.frame_current -> frame_current: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.grid -> grid: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.list -> list: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.list_text -> list_text: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.list_text_hi -> list_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.list_title -> list_title: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.long_key -> long_key: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.long_key_selected -> long_key_selected: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.title -> title: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.value_sliders -> value_sliders: float[3] "NO DESCRIPTION"
-#+ * ThemeDopeSheet.view_sliders -> view_sliders: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.active_file -> active_file: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.active_file_text -> active_file_text: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.list -> list: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.list_text -> list_text: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.list_text_hi -> list_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.list_title -> list_title: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.scroll_handle -> scroll_handle: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.scrollbar -> scrollbar: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.selected_file -> selected_file: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.tiles -> tiles: float[3] "NO DESCRIPTION"
-#+ * ThemeFileBrowser.title -> title: float[3] "NO DESCRIPTION"
-#+ * ThemeFontStyle.font_kerning_style -> font_kerning_style: enum "Which style to use for font kerning"
-#+ * ThemeFontStyle.points -> points: int "NO DESCRIPTION"
-#+ * ThemeFontStyle.shadow -> shadow: int "Shadow size in pixels (0, 3 and 5 supported)"
-#ThemeFontStyle.shadow_offset_x -> shadow_offset_x: int "Shadow offset in pixels"
-#ThemeFontStyle.shadow_offset_y -> shadow_offset_y: int "Shadow offset in pixels"
-#+ * ThemeFontStyle.shadowalpha -> shadowalpha: float "NO DESCRIPTION"
-#+ * ThemeFontStyle.shadowcolor -> shadowcolor: float "Shadow color in grey value"
-#+ * ThemeGraphEditor.active_channels_group -> active_channels_group: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.channel_group -> channel_group: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.channels_region -> channels_region: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.dopesheet_channel -> dopesheet_channel: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.dopesheet_subchannel -> dopesheet_subchannel: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.frame_current -> frame_current: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.grid -> grid: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.handle_align -> handle_align: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.handle_auto -> handle_auto: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.handle_free -> handle_free: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.handle_sel_align -> handle_sel_align: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.handle_sel_auto -> handle_sel_auto: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.handle_sel_free -> handle_sel_free: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.handle_sel_vect -> handle_sel_vect: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.handle_vect -> handle_vect: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.handle_vertex -> handle_vertex: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.handle_vertex_select -> handle_vertex_select: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.handle_vertex_size -> handle_vertex_size: int "NO DESCRIPTION"
-#+ * ThemeGraphEditor.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.lastsel_point -> lastsel_point: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.list -> list: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.list_text -> list_text: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.list_text_hi -> list_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.list_title -> list_title: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.panel -> panel: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.title -> title: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.vertex -> vertex: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.vertex_select -> vertex_select: float[3] "NO DESCRIPTION"
-#+ * ThemeGraphEditor.vertex_size -> vertex_size: int "NO DESCRIPTION"
-#+ * ThemeGraphEditor.window_sliders -> window_sliders: float[3] "NO DESCRIPTION"
-#+ * ThemeImageEditor.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeImageEditor.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeImageEditor.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeImageEditor.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeImageEditor.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeImageEditor.editmesh_active -> editmesh_active: float[4] "NO DESCRIPTION"
-#+ * ThemeImageEditor.face -> face: float[4] "NO DESCRIPTION"
-#+ * ThemeImageEditor.face_dot -> face_dot: float[3] "NO DESCRIPTION"
-#+ * ThemeImageEditor.face_select -> face_select: float[4] "NO DESCRIPTION"
-#+ * ThemeImageEditor.facedot_size -> facedot_size: int "NO DESCRIPTION"
-#+ * ThemeImageEditor.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeImageEditor.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeImageEditor.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeImageEditor.scope_back -> scope_back: float[4] "NO DESCRIPTION"
-#+ * ThemeImageEditor.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeImageEditor.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeImageEditor.title -> title: float[3] "NO DESCRIPTION"
-#+ * ThemeImageEditor.vertex -> vertex: float[3] "NO DESCRIPTION"
-#+ * ThemeImageEditor.vertex_select -> vertex_select: float[3] "NO DESCRIPTION"
-#+ * ThemeImageEditor.vertex_size -> vertex_size: int "NO DESCRIPTION"
-#+ * ThemeInfo.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeInfo.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeInfo.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeInfo.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeInfo.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeInfo.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeInfo.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeInfo.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeInfo.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeInfo.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeInfo.title -> title: float[3] "NO DESCRIPTION"
-#+ * ThemeLogicEditor.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeLogicEditor.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeLogicEditor.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeLogicEditor.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeLogicEditor.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeLogicEditor.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeLogicEditor.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeLogicEditor.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeLogicEditor.panel -> panel: float[3] "NO DESCRIPTION"
-#+ * ThemeLogicEditor.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeLogicEditor.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeLogicEditor.title -> title: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.bars -> bars: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.bars_selected -> bars_selected: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.frame_current -> frame_current: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.grid -> grid: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.list -> list: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.list_text -> list_text: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.list_text_hi -> list_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.list_title -> list_title: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.strips -> strips: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.strips_selected -> strips_selected: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.title -> title: float[3] "NO DESCRIPTION"
-#+ * ThemeNLAEditor.view_sliders -> view_sliders: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.converter_node -> converter_node: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.group_node -> group_node: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.in_out_node -> in_out_node: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.list -> list: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.list_text -> list_text: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.list_text_hi -> list_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.list_title -> list_title: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.node_backdrop -> node_backdrop: float[4] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.operator_node -> operator_node: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.selected_text -> selected_text: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.title -> title: float[3] "NO DESCRIPTION"
-#ThemeNodeEditor.wire -> wire: float[3] "NO DESCRIPTION"
-#+ * ThemeNodeEditor.wire_select -> wire_select: float[3] "NO DESCRIPTION"
-#+ * ThemeOutliner.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeOutliner.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeOutliner.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeOutliner.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeOutliner.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeOutliner.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeOutliner.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeOutliner.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeOutliner.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeOutliner.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeOutliner.title -> title: float[3] "NO DESCRIPTION"
-#+ * ThemeProperties.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeProperties.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeProperties.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeProperties.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeProperties.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeProperties.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeProperties.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeProperties.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeProperties.panel -> panel: float[3] "NO DESCRIPTION"
-#+ * ThemeProperties.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeProperties.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeProperties.title -> title: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.audio_strip -> audio_strip: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.draw_action -> draw_action: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.effect_strip -> effect_strip: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.frame_current -> frame_current: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.grid -> grid: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.image_strip -> image_strip: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.keyframe -> keyframe: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.meta_strip -> meta_strip: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.movie_strip -> movie_strip: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.plugin_strip -> plugin_strip: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.scene_strip -> scene_strip: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.title -> title: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.transition_strip -> transition_strip: float[3] "NO DESCRIPTION"
-#+ * ThemeSequenceEditor.window_sliders -> window_sliders: float[3] "NO DESCRIPTION"
-#ThemeStyle.group_label -> group_label: pointer, "(read-only)"
-#ThemeStyle.panel_title -> panel_title: pointer, "(read-only)"
-#+ * ThemeStyle.panelzoom -> panelzoom: float "Default zoom level for panel areas"
-#+ * ThemeStyle.widget -> widget: pointer, "(read-only)"
-#ThemeStyle.widget_label -> widget_label: pointer, "(read-only)"
-#+ * ThemeTextEditor.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.cursor -> cursor: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.line_numbers_background -> line_numbers_background: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.scroll_bar -> scroll_bar: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.selected_text -> selected_text: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.syntax_builtin -> syntax_builtin: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.syntax_comment -> syntax_comment: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.syntax_numbers -> syntax_numbers: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.syntax_special -> syntax_special: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.syntax_string -> syntax_string: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeTextEditor.title -> title: float[3] "NO DESCRIPTION"
-#+ * ThemeTimeline.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeTimeline.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeTimeline.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeTimeline.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeTimeline.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeTimeline.frame_current -> frame_current: float[3] "NO DESCRIPTION"
-#+ * ThemeTimeline.grid -> grid: float[3] "NO DESCRIPTION"
-#+ * ThemeTimeline.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeTimeline.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeTimeline.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeTimeline.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeTimeline.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeTimeline.title -> title: float[3] "NO DESCRIPTION"
-#+ * ThemeUserInterface.icon_file -> icon_file: string "NO DESCRIPTION"
-#+ * ThemeUserInterface.wcol_box -> wcol_box: pointer, "(read-only)"
-#+ * ThemeUserInterface.wcol_list_item -> wcol_list_item: pointer, "(read-only)"
-#+ * ThemeUserInterface.wcol_menu -> wcol_menu: pointer, "(read-only)"
-#+ * ThemeUserInterface.wcol_menu_back -> wcol_menu_back: pointer, "(read-only)"
-#+ * ThemeUserInterface.wcol_menu_item -> wcol_menu_item: pointer, "(read-only)"
-#+ * ThemeUserInterface.wcol_num -> wcol_num: pointer, "(read-only)"
-#+ * ThemeUserInterface.wcol_numslider -> wcol_numslider: pointer, "(read-only)"
-#+ * ThemeUserInterface.wcol_option -> wcol_option: pointer, "(read-only)"
-#+ * ThemeUserInterface.wcol_progress -> wcol_progress: pointer, "(read-only)"
-#+ * ThemeUserInterface.wcol_pulldown -> wcol_pulldown: pointer, "(read-only)"
-#+ * ThemeUserInterface.wcol_radio -> wcol_radio: pointer, "(read-only)"
-#+ * ThemeUserInterface.wcol_regular -> wcol_regular: pointer, "(read-only)"
-#+ * ThemeUserInterface.wcol_scroll -> wcol_scroll: pointer, "(read-only)"
-#+ * ThemeUserInterface.wcol_state -> wcol_state: pointer, "(read-only)"
-#+ * ThemeUserInterface.wcol_text -> wcol_text: pointer, "(read-only)"
-#+ * ThemeUserInterface.wcol_toggle -> wcol_toggle: pointer, "(read-only)"
-#+ * ThemeUserInterface.wcol_tool -> wcol_tool: pointer, "(read-only)"
-#+ * ThemeUserPreferences.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeUserPreferences.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeUserPreferences.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeUserPreferences.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeUserPreferences.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeUserPreferences.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeUserPreferences.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeUserPreferences.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeUserPreferences.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeUserPreferences.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeUserPreferences.title -> title: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.act_spline -> act_spline: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.back -> back: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.bone_pose -> bone_pose: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.bone_solid -> bone_solid: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.button -> button: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.button_text -> button_text: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.button_text_hi -> button_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.button_title -> button_title: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.edge_crease -> edge_crease: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.edge_facesel -> edge_facesel: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.edge_seam -> edge_seam: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.edge_select -> edge_select: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.edge_sharp -> edge_sharp: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.editmesh_active -> editmesh_active: float[4] "NO DESCRIPTION"
-#+ * ThemeView3D.face -> face: float[4] "NO DESCRIPTION"
-#+ * ThemeView3D.face_dot -> face_dot: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.face_select -> face_select: float[4] "NO DESCRIPTION"
-#+ * ThemeView3D.facedot_size -> facedot_size: int "NO DESCRIPTION"
-#+ * ThemeView3D.frame_current -> frame_current: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.grid -> grid: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.handle_align -> handle_align: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.handle_auto -> handle_auto: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.handle_free -> handle_free: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.handle_sel_align -> handle_sel_align: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.handle_sel_auto -> handle_sel_auto: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.handle_sel_free -> handle_sel_free: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.handle_sel_vect -> handle_sel_vect: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.handle_vect -> handle_vect: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.header -> header: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.header_text -> header_text: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.header_text_hi -> header_text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.lamp -> lamp: float[4] "NO DESCRIPTION"
-#+ * ThemeView3D.lastsel_point -> lastsel_point: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.normal -> normal: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.nurb_sel_uline -> nurb_sel_uline: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.nurb_sel_vline -> nurb_sel_vline: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.nurb_uline -> nurb_uline: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.nurb_vline -> nurb_vline: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.object_active -> object_active: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.object_grouped -> object_grouped: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.object_grouped_active -> object_grouped_active: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.object_selected -> object_selected: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.panel -> panel: float[4] "NO DESCRIPTION"
-#+ * ThemeView3D.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.text_hi -> text_hi: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.title -> title: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.transform -> transform: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.vertex -> vertex: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.vertex_normal -> vertex_normal: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.vertex_select -> vertex_select: float[3] "NO DESCRIPTION"
-#+ * ThemeView3D.vertex_size -> vertex_size: int "NO DESCRIPTION"
-#+ * ThemeView3D.wire -> wire: float[3] "NO DESCRIPTION"
-#+ * ThemeWidgetColors.inner -> inner: float[4] "NO DESCRIPTION"
-#+ * ThemeWidgetColors.inner_sel -> inner_sel: float[4] "NO DESCRIPTION"
-#+ * ThemeWidgetColors.item -> item: float[4] "NO DESCRIPTION"
-#+ * ThemeWidgetColors.outline -> outline: float[3] "NO DESCRIPTION"
-#+ * ThemeWidgetColors.shadedown -> shadedown: int "NO DESCRIPTION"
-#+ * ThemeWidgetColors.shadetop -> shadetop: int "NO DESCRIPTION"
-#ThemeWidgetColors.show_shaded -> show_shaded: boolean "NO DESCRIPTION"
-#+ * ThemeWidgetColors.text -> text: float[3] "NO DESCRIPTION"
-#+ * ThemeWidgetColors.text_sel -> text_sel: float[3] "NO DESCRIPTION"
-#+ * ThemeWidgetStateColors.blend -> blend: float "NO DESCRIPTION"
-#+ * ThemeWidgetStateColors.inner_anim -> inner_anim: float[3] "NO DESCRIPTION"
-#+ * ThemeWidgetStateColors.inner_anim_sel -> inner_anim_sel: float[3] "NO DESCRIPTION"
-#+ * ThemeWidgetStateColors.inner_driven -> inner_driven: float[3] "NO DESCRIPTION"
-#+ * ThemeWidgetStateColors.inner_driven_sel -> inner_driven_sel: float[3] "NO DESCRIPTION"
-#+ * ThemeWidgetStateColors.inner_key -> inner_key: float[3] "NO DESCRIPTION"
-#+ * ThemeWidgetStateColors.inner_key_sel -> inner_key_sel: float[3] "NO DESCRIPTION"
-#+ * TimelineMarker.camera -> camera: pointer "Camera this timeline sets to active"
-#+ * TimelineMarker.frame -> frame: int "The frame on which the timeline marker appears"
-#+ * TimelineMarker.name -> name: string "NO DESCRIPTION"
-#+ * TimelineMarker.select -> select: boolean "Marker selection state"
-#ToolSettings.auto_keying_mode -> auto_keying_mode: enum "Mode of automatic keyframe insertion for Objects and Bones"
-#+ * ToolSettings.edge_path_mode -> edge_path_mode: enum "The edge flag to tag when selecting the shortest path"
-#+ * ToolSettings.etch_adaptive_limit -> etch_adaptive_limit: float "Number of bones in the subdivided stroke"
-#+ * ToolSettings.etch_convert_mode -> etch_convert_mode: enum "Method used to convert stroke to bones"
-#+ * ToolSettings.etch_length_limit -> etch_length_limit: float "Number of bones in the subdivided stroke"
-#+ * ToolSettings.etch_number -> etch_number: string "DOC BROKEN"
-#+ * ToolSettings.etch_roll_mode -> etch_roll_mode: enum "Method used to adjust the roll of bones when retargeting"
-#+ * ToolSettings.etch_side -> etch_side: string "DOC BROKEN"
-#+ * ToolSettings.etch_subdivision_number -> etch_subdivision_number: int "Number of bones in the subdivided stroke"
-#+ * ToolSettings.etch_template -> etch_template: pointer "Template armature that will be retargeted to the stroke"
-#+ * ToolSettings.image_paint -> image_paint: pointer, "(read-only)"
-#ToolSettings.mesh_select_mode -> mesh_select_mode: boolean[3] "Which mesh elements selection works on"
-#+ * ToolSettings.normal_size -> normal_size: float "Display size for normals in the 3D view"
-#+ * ToolSettings.particle_edit -> particle_edit: pointer, "(read-only)"
-#ToolSettings.proportional_edit -> proportional_edit: enum "Proportional editing mode"
-#ToolSettings.proportional_edit_falloff -> proportional_edit_falloff: enum "Falloff type for proportional editing mode"
-#+ * ToolSettings.sculpt -> sculpt: pointer, "(read-only)"
-#+ * ToolSettings.sculpt_paint_use_unified_size -> sculpt_paint_use_unified_size: boolean "Instead of per brush radius, the radius is shared across brushes"
-#+ * ToolSettings.sculpt_paint_use_unified_strength -> sculpt_paint_use_unified_strength: boolean "Instead of per brush strength, the strength is shared across brushes"
-#ToolSettings.show_uv_local_view -> show_uv_local_view: boolean "Draw only faces with the currently displayed image assigned"
-#+ * ToolSettings.snap_element -> snap_element: enum "Type of element to snap to"
-#+ * ToolSettings.snap_target -> snap_target: enum "Which part to snap onto the target"
-#ToolSettings.use_auto_normalize -> use_auto_normalize: boolean "Ensure all bone-deforming vertex groups add up to 1.0 while weight painting"
-#ToolSettings.use_bone_sketching -> use_bone_sketching: boolean "DOC BROKEN"
-#ToolSettings.use_etch_autoname -> use_etch_autoname: boolean "DOC BROKEN"
-#ToolSettings.use_etch_overdraw -> use_etch_overdraw: boolean "DOC BROKEN"
-#ToolSettings.use_etch_quick -> use_etch_quick: boolean "DOC BROKEN"
-#ToolSettings.use_keyframe_insert_auto -> use_keyframe_insert_auto: boolean "Automatic keyframe insertion for Objects and Bones"
-#ToolSettings.use_mesh_automerge -> use_mesh_automerge: boolean "Automatically merge vertices moved to the same location"
-#ToolSettings.use_proportional_edit_objects -> use_proportional_edit_objects: boolean "Proportional editing object mode"
-#ToolSettings.use_record_with_nla -> use_record_with_nla: boolean "Add a new NLA Track + Strip for every loop/pass made over the animation to allow non-destructive tweaking"
-#ToolSettings.use_snap -> use_snap: boolean "Snap during transform"
-#ToolSettings.use_snap_align_rotation -> use_snap_align_rotation: boolean "Align rotation with the snapping target"
-#ToolSettings.use_snap_peel_object -> use_snap_peel_object: boolean "Consider objects as whole when finding volume center"
-#ToolSettings.use_snap_project -> use_snap_project: boolean "Project vertices on the surface of other objects"
-#ToolSettings.use_uv_select_sync -> use_uv_select_sync: boolean "Keep UV and edit mode mesh selection in sync"
-#ToolSettings.uv_select_mode -> uv_select_mode: enum "UV selection and display mode"
-#+ * ToolSettings.vertex_group_weight -> vertex_group_weight: float "Weight to assign in vertex groups"
-#+ * ToolSettings.vertex_paint -> vertex_paint: pointer, "(read-only)"
-#+ * ToolSettings.weight_paint -> weight_paint: pointer, "(read-only)"
-#+ * TransformOrientation.matrix -> matrix: float[9] "NO DESCRIPTION"
-#+ * TransformOrientation.name -> name: string "NO DESCRIPTION"
-#+ * UILayout.alignment -> alignment: enum "NO DESCRIPTION"
-#+ * UILayout.operator_context -> operator_context: enum "NO DESCRIPTION"
-#+ * UILayout.scale_x -> scale_x: float "Scale factor along the X for items in this (sub)layout."
-#+ * UILayout.scale_y -> scale_y: float "Scale factor along the Y for items in this (sub)layout."
- + * UILayout.active -> show_active: boolean "NO DESCRIPTION"
- + * UILayout.enabled -> show_enabled: boolean "When false, this (sub)layout is greyed out."
-#+ * UVProjector.object -> object: pointer "Object to use as projector transform"
-#UVTextures.active -> active: pointer "Active UV texture"
-#+ * UnitSettings.rotation_units -> rotation_units: enum "Unit to use for displaying/editing rotation values"
-#+ * UnitSettings.scale_length -> scale_length: float "Scale to use when converting between blender units and dimensions"
-#+ * UnitSettings.system -> system: enum "The unit system to use for button display"
-#+ * UnitSettings.use_separate -> use_separate: boolean "Display units in pairs"
-#+ * UserPreferences.active_section -> active_section: enum "Active section of the user preferences shown in the user interface"
-#+ * UserPreferences.addons -> addons: collection, "(read-only)"
-#+ * UserPreferences.edit -> edit: pointer, "(read-only) Settings for interacting with Blender data"
-#+ * UserPreferences.filepaths -> filepaths: pointer, "(read-only) Default paths for external files"
-#+ * UserPreferences.inputs -> inputs: pointer, "(read-only) Settings for input devices"
-#+ * UserPreferences.system -> system: pointer, "(read-only) Graphics driver and operating system settings"
-#+ * UserPreferences.themes -> themes: collection, "(read-only)"
-#UserPreferences.ui_styles -> ui_styles: collection, "(read-only)"
-#+ * UserPreferences.view -> view: pointer, "(read-only) Preferences related to viewing data"
-#+ * UserPreferencesEdit.auto_keying_mode -> auto_keying_mode: enum "Mode of automatic keyframe insertion for Objects and Bones"
-#+ * UserPreferencesEdit.grease_pencil_eraser_radius -> grease_pencil_eraser_radius: int "Radius of eraser brush"
-#+ * UserPreferencesEdit.grease_pencil_euclidean_distance -> grease_pencil_euclidean_distance: int "Distance moved by mouse when drawing stroke (in pixels) to include"
-#+ * UserPreferencesEdit.grease_pencil_manhattan_distance -> grease_pencil_manhattan_distance: int "Pixels moved by mouse per axis when drawing stroke"
-#+ * UserPreferencesEdit.keyframe_new_handle_type -> keyframe_new_handle_type: enum "NO DESCRIPTION"
-#+ * UserPreferencesEdit.keyframe_new_interpolation_type -> keyframe_new_interpolation_type: enum "NO DESCRIPTION"
-#+ * UserPreferencesEdit.material_link -> material_link: enum "Toggle whether the material is linked to object data or the object block"
-#+ * UserPreferencesEdit.object_align -> object_align: enum "When adding objects from a 3D View menu, either align them to that views direction or the world coordinates"
-#UserPreferencesEdit.sculpt_paint_overlay_color -> sculpt_paint_overlay_color: float[3] "Color of texture overlay"
-#+ * UserPreferencesEdit.undo_memory_limit -> undo_memory_limit: int "Maximum memory usage in megabytes (0 means unlimited)"
-#+ * UserPreferencesEdit.undo_steps -> undo_steps: int "Number of undo steps available (smaller values conserve memory)"
-#+ * UserPreferencesEdit.use_auto_keying -> use_auto_keying: boolean "Automatic keyframe insertion for Objects and Bones"
-#UserPreferencesEdit.use_drag_immediately -> use_drag_immediately: boolean "Moving things with a mouse drag confirms when releasing the button"
-#UserPreferencesEdit.use_duplicate_action -> use_duplicate_action: boolean "Causes actions to be duplicated with the object"
-#UserPreferencesEdit.use_duplicate_armature -> use_duplicate_armature: boolean "Causes armature data to be duplicated with the object"
-#UserPreferencesEdit.use_duplicate_curve -> use_duplicate_curve: boolean "Causes curve data to be duplicated with the object"
-#UserPreferencesEdit.use_duplicate_fcurve -> use_duplicate_fcurve: boolean "Causes F-curve data to be duplicated with the object"
-#UserPreferencesEdit.use_duplicate_lamp -> use_duplicate_lamp: boolean "Causes lamp data to be duplicated with the object"
-#UserPreferencesEdit.use_duplicate_material -> use_duplicate_material: boolean "Causes material data to be duplicated with the object"
-#UserPreferencesEdit.use_duplicate_mesh -> use_duplicate_mesh: boolean "Causes mesh data to be duplicated with the object"
-#UserPreferencesEdit.use_duplicate_metaball -> use_duplicate_metaball: boolean "Causes metaball data to be duplicated with the object"
-#UserPreferencesEdit.use_duplicate_particle -> use_duplicate_particle: boolean "Causes particle systems to be duplicated with the object"
-#UserPreferencesEdit.use_duplicate_surface -> use_duplicate_surface: boolean "Causes surface data to be duplicated with the object"
-#UserPreferencesEdit.use_duplicate_text -> use_duplicate_text: boolean "Causes text data to be duplicated with the object"
-#UserPreferencesEdit.use_duplicate_texture -> use_duplicate_texture: boolean "Causes texture data to be duplicated with the object"
-#UserPreferencesEdit.use_enter_edit_mode -> use_enter_edit_mode: boolean "Enter Edit Mode automatically after adding a new object"
-#UserPreferencesEdit.use_global_undo -> use_global_undo: boolean "Global undo works by keeping a full copy of the file itself in memory, so takes extra memory"
-#UserPreferencesEdit.use_grease_pencil_simplify_stroke -> use_grease_pencil_simplify_stroke: boolean "Simplify the final stroke"
-#UserPreferencesEdit.use_grease_pencil_smooth_stroke -> use_grease_pencil_smooth_stroke: boolean "Smooth the final stroke"
-#UserPreferencesEdit.use_insertkey_xyz_to_rgb -> use_insertkey_xyz_to_rgb: boolean "Color for newly added transformation F-Curves (Location, Rotation, Scale) and also Color is based on the transform axis"
-#UserPreferencesEdit.use_keyframe_insert_available -> use_keyframe_insert_available: boolean "Automatic keyframe insertion in available curves"
-#UserPreferencesEdit.use_keyframe_insert_keyingset -> use_keyframe_insert_keyingset: boolean "Automatic keyframe insertion using active Keying Set"
-#UserPreferencesEdit.use_keyframe_insert_needed -> use_keyframe_insert_needed: boolean "Keyframe insertion only when keyframe needed"
-#+ * UserPreferencesEdit.use_negative_frames -> use_negative_frames: boolean "Current frame number can be manually set to a negative value"
-#+ * UserPreferencesEdit.use_visual_keying -> use_visual_keying: boolean "Use Visual keying automatically for constrained objects"
-#+ * UserPreferencesFilePaths.animation_player -> animation_player: string "Path to a custom animation/frame sequence player"
-#+ * UserPreferencesFilePaths.animation_player_preset -> animation_player_preset: enum "Preset configs for external animation players"
-#+ * UserPreferencesFilePaths.auto_save_time -> auto_save_time: int "The time (in minutes) to wait between automatic temporary saves"
-#UserPreferencesFilePaths.font_directory -> font_directory: string "The default directory to search for loading fonts"
-#+ * UserPreferencesFilePaths.image_editor -> image_editor: string "Path to an image editor"
-#+ * UserPreferencesFilePaths.recent_files -> recent_files: int "Maximum number of recently opened files to remember"
-#+ * UserPreferencesFilePaths.render_output_directory -> render_output_directory: string "The default directory for rendering output"
-#+ * UserPreferencesFilePaths.save_version -> save_version: int "The number of old versions to maintain in the current directory, when manually saving"
-#UserPreferencesFilePaths.script_directory -> script_directory: string "The default directory to search for Python scripts (resets python module search path: sys.path)"
-#+ * UserPreferencesFilePaths.sequence_plugin_directory -> sequence_plugin_directory: string "The default directory to search for sequence plugins"
-#UserPreferencesFilePaths.show_hidden_files_datablocks -> show_hidden_files_datablocks: boolean "Hide files/datablocks that start with a dot(.*)"
-#UserPreferencesFilePaths.sound_directory -> sound_directory: string "The default directory to search for sounds"
-#+ * UserPreferencesFilePaths.temporary_directory -> temporary_directory: string "The directory for storing temporary save files"
-#UserPreferencesFilePaths.texture_directory -> texture_directory: string "The default directory to search for textures"
-#+ * UserPreferencesFilePaths.texture_plugin_directory -> texture_plugin_directory: string "The default directory to search for texture plugins"
-#UserPreferencesFilePaths.use_auto_save_temporary_files -> use_auto_save_temporary_files: boolean "Automatic saving of temporary files"
-#UserPreferencesFilePaths.use_file_compression -> use_file_compression: boolean "Enable file compression when saving .blend files"
-#UserPreferencesFilePaths.use_filter_files -> use_filter_files: boolean "Display only files with extensions in the image select window"
-#UserPreferencesFilePaths.use_load_ui -> use_load_ui: boolean "Load user interface setup when loading .blend files"
-#+ * UserPreferencesFilePaths.use_relative_paths -> use_relative_paths: boolean "Default relative path option for the file selector"
-#UserPreferencesFilePaths.use_save_preview_images -> use_save_preview_images: boolean "Enables automatic saving of preview images in the .blend file"
-#+ * UserPreferencesInput.edited_keymaps -> edited_keymaps: collection, "(read-only)"
-#UserPreferencesInput.invert_mouse_wheel_zoom -> invert_mouse_wheel_zoom: boolean "Invert the axis of mouse movement for zooming"
-#UserPreferencesInput.invert_zoom_wheel -> invert_zoom_wheel: boolean "Swap the Mouse Wheel zoom direction"
-#UserPreferencesInput.mouse_double_click_time -> mouse_double_click_time: int "The time (in ms) for a double click"
-#+ * UserPreferencesInput.ndof_pan_speed -> ndof_pan_speed: int "The overall panning speed of an NDOF device, as percent of standard"
-#+ * UserPreferencesInput.ndof_rotate_speed -> ndof_rotate_speed: int "The overall rotation speed of an NDOF device, as percent of standard"
-#+ * UserPreferencesInput.select_mouse -> select_mouse: enum "The mouse button used for selection"
-#UserPreferencesInput.use_emulate_numpad -> use_emulate_numpad: boolean "Causes the 1 to 0 keys to act as the numpad (useful for laptops)"
-#UserPreferencesInput.use_mouse_continuous -> use_mouse_continuous: boolean "Allow moving the mouse outside the view on some manipulations (transform, ui control drag)"
-#UserPreferencesInput.use_mouse_emulate_3_button -> use_mouse_emulate_3_button: boolean "Emulates Middle Mouse with Alt+LeftMouse (doesnt work with Left Mouse Select option)"
-#UserPreferencesInput.use_mouse_mmb_paste -> use_mouse_mmb_paste: boolean "In text window, paste with middle mouse button instead of panning"
-#UserPreferencesInput.view_rotate_method -> view_rotate_method: enum "Rotation style in the viewport"
-#UserPreferencesInput.view_zoom_axis -> view_zoom_axis: enum "Axis of mouse movement to zoom in or out on"
-#UserPreferencesInput.view_zoom_method -> view_zoom_method: enum "Which style to use for viewport scaling"
-#+ * UserPreferencesInput.wheel_scroll_lines -> wheel_scroll_lines: int "The number of lines scrolled at a time with the mouse wheel"
-#+ * UserPreferencesSystem.audio_channels -> audio_channels: enum "Sets the audio channel count"
-#+ * UserPreferencesSystem.audio_device -> audio_device: enum "Sets the audio output device"
-#+ * UserPreferencesSystem.audio_mixing_buffer -> audio_mixing_buffer: enum "Sets the number of samples used by the audio mixing buffer"
-#+ * UserPreferencesSystem.audio_sample_format -> audio_sample_format: enum "Sets the audio sample format"
-#+ * UserPreferencesSystem.audio_sample_rate -> audio_sample_rate: enum "Sets the audio sample rate"
-#+ * UserPreferencesSystem.color_picker_type -> color_picker_type: enum "Different styles of displaying the color picker widget"
-#+ * UserPreferencesSystem.dpi -> dpi: int "Font size and resolution for display"
-#+ * UserPreferencesSystem.frame_server_port -> frame_server_port: int "Frameserver Port for Frameserver Rendering"
-#UserPreferencesSystem.gl_clip_alpha -> gl_clip_alpha: float "Clip alpha below this threshold in the 3D textured view"
-#+ * UserPreferencesSystem.gl_texture_limit -> gl_texture_limit: enum "Limit the texture size to save graphics memory"
-#+ * UserPreferencesSystem.language -> language: enum "Language use for translation"
-#+ * UserPreferencesSystem.memory_cache_limit -> memory_cache_limit: int "Memory cache limit in sequencer (megabytes)"
-#+ * UserPreferencesSystem.prefetch_frames -> prefetch_frames: int "Number of frames to render ahead during playback"
-#+ * UserPreferencesSystem.screencast_fps -> screencast_fps: int "Frame rate for the screencast to be played back"
-#+ * UserPreferencesSystem.screencast_wait_time -> screencast_wait_time: int "Time in milliseconds between each frame recorded for screencast"
-#+ * UserPreferencesSystem.scrollback -> scrollback: int "Maximum number of lines to store for the console buffer"
-#+ * UserPreferencesSystem.solid_lights -> solid_lights: collection, "(read-only) Lights user to display objects in solid draw mode"
-#+ * UserPreferencesSystem.texture_collection_rate -> texture_collection_rate: int "Number of seconds between each run of the GL texture garbage collector"
-#+ * UserPreferencesSystem.texture_time_out -> texture_time_out: int "Time since last access of a GL texture in seconds after which it is freed. (Set to 0 to keep textures allocated.)"
-#+ * UserPreferencesSystem.use_antialiasing -> use_antialiasing: boolean "Use anti-aliasing for the 3D view (may impact redraw performance)"
-#UserPreferencesSystem.use_international_fonts -> use_international_fonts: boolean "Use international fonts"
-#+ * UserPreferencesSystem.use_mipmaps -> use_mipmaps: boolean "Scale textures for the 3D View (looks nicer but uses more memory and slows image reloading)"
-#UserPreferencesSystem.use_preview_images -> use_preview_images: boolean "Enables automatic saving of preview images in the .blend file (Windows only)"
-#UserPreferencesSystem.use_scripts_auto_execute -> use_scripts_auto_execute: boolean "Allow any .blend file to run scripts automatically (unsafe with blend files from an untrusted source)"
-#UserPreferencesSystem.use_tabs_as_spaces -> use_tabs_as_spaces: boolean "Automatically converts all new tabs into spaces for new and loaded text files"
-#+ * UserPreferencesSystem.use_textured_fonts -> use_textured_fonts: boolean "Use textures for drawing international fonts"
-#UserPreferencesSystem.use_translate_buttons -> use_translate_buttons: boolean "Translate button labels"
-#UserPreferencesSystem.use_translate_toolbox -> use_translate_toolbox: boolean "Translate toolbox menu"
-#UserPreferencesSystem.use_translate_tooltips -> use_translate_tooltips: boolean "Translate Tooltips"
-#UserPreferencesSystem.use_vertex_buffer_objects -> use_vertex_buffer_objects: boolean "Use Vertex Buffer Objects (or Vertex Arrays, if unsupported) for viewport rendering"
-#+ * UserPreferencesSystem.use_weight_color_range -> use_weight_color_range: boolean "Enable color range used for weight visualization in weight painting mode"
-#+ * UserPreferencesSystem.weight_color_range -> weight_color_range: pointer, "(read-only) Color range used for weight visualization in weight painting mode"
-#+ * UserPreferencesSystem.window_draw_method -> window_draw_method: enum "Drawing method used by the window manager"
-#+ * UserPreferencesView.manipulator_handle_size -> manipulator_handle_size: int "Size of widget handles as percentage of widget radius"
-#+ * UserPreferencesView.manipulator_hotspot -> manipulator_hotspot: int "Hotspot in pixels for clicking widget handles"
-#+ * UserPreferencesView.manipulator_size -> manipulator_size: int "Diameter of widget, in 10 pixel units"
-#+ * UserPreferencesView.mini_axis_brightness -> mini_axis_brightness: int "The brightness of the icon"
-#+ * UserPreferencesView.mini_axis_size -> mini_axis_size: int "The axis icons size"
-#+ * UserPreferencesView.object_origin_size -> object_origin_size: int "Diameter in Pixels for Object/Lamp origin display"
-#+ * UserPreferencesView.open_left_mouse_delay -> open_left_mouse_delay: int "Time in 1/10 seconds to hold the Left Mouse Button before opening the toolbox"
-#+ * UserPreferencesView.open_right_mouse_delay -> open_right_mouse_delay: int "Time in 1/10 seconds to hold the Right Mouse Button before opening the toolbox"
-#+ * UserPreferencesView.open_sublevel_delay -> open_sublevel_delay: int "Time delay in 1/10 seconds before automatically opening sub level menus"
-#+ * UserPreferencesView.open_toplevel_delay -> open_toplevel_delay: int "Time delay in 1/10 seconds before automatically opening top level menus"
-#+ * UserPreferencesView.rotation_angle -> rotation_angle: int "The rotation step for numerical pad keys (2 4 6 8)"
-#UserPreferencesView.show_column_layout -> show_column_layout: boolean "Use a column layout for toolbox"
-#UserPreferencesView.show_large_cursors -> show_large_cursors: boolean "Use large mouse cursors when available"
-#UserPreferencesView.show_manipulator -> show_manipulator: boolean "Use 3D transform manipulator"
-#+ * UserPreferencesView.show_mini_axis -> show_mini_axis: boolean "Show a small rotating 3D axis in the bottom left corner of the 3D View"
-#UserPreferencesView.show_object_info -> show_object_info: boolean "Display objects name and frame number in 3D view"
-#+ * UserPreferencesView.show_playback_fps -> show_playback_fps: boolean "Show the frames per second screen refresh rate, while animation is played back"
-#+ * UserPreferencesView.show_splash -> show_splash: boolean "Display splash screen on startup"
-#UserPreferencesView.show_tooltips -> show_tooltips: boolean "Display tooltips"
-#+ * UserPreferencesView.show_view_name -> show_view_name: boolean "Show the name of the views direction in each 3D View"
-#+ * UserPreferencesView.smooth_view -> smooth_view: int "The time to animate the view in milliseconds, zero to disable"
-#+ * UserPreferencesView.timecode_style -> timecode_style: enum "Format of Time Codes displayed when not displaying timing in terms of frames"
-#UserPreferencesView.use_auto_perspective -> use_auto_perspective: boolean "Automatically switch between orthographic and perspective when changing from top/front/side views"
-#UserPreferencesView.use_directional_menus -> use_directional_menus: boolean "Otherwise menus, etc will always be top to bottom, left to right, no matter opening direction"
-#UserPreferencesView.use_global_pivot -> use_global_pivot: boolean "Lock the same rotation/scaling pivot in all 3D Views"
-#UserPreferencesView.use_global_scene -> use_global_scene: boolean "Forces the current Scene to be displayed in all Screens"
-#UserPreferencesView.use_mouse_auto_depth -> use_mouse_auto_depth: boolean "Use the depth under the mouse to improve view pan/rotate/zoom functionality"
-#UserPreferencesView.use_mouse_over_open -> use_mouse_over_open: boolean "Open menu buttons and pulldowns automatically when the mouse is hovering"
-#UserPreferencesView.use_rotate_around_active -> use_rotate_around_active: boolean "Use selection as the pivot point"
-#UserPreferencesView.use_zoom_to_mouse -> use_zoom_to_mouse: boolean "Zoom in towards the mouse pointers position in the 3D view, rather than the 2D window center"
-#UserPreferencesView.view2d_grid_spacing_min -> view2d_grid_spacing_min: int "Minimum number of pixels between each gridline in 2D Viewports"
-#+ * UserSolidLight.diffuse_color -> diffuse_color: float[3] "The diffuse color of the OpenGL light"
-#+ * UserSolidLight.direction -> direction: float[3] "The direction that the OpenGL light is shining"
-#+ * UserSolidLight.specular_color -> specular_color: float[3] "The color of the lights specular highlight"
-#+ * UserSolidLight.use -> use: boolean "Enable this OpenGL light in solid draw mode"
-#+ * ValueNodeSocket.default_value -> default_value: float[1] "Default value of the socket when no link is attached"
-#+ * ValueNodeSocket.name -> name: string, "(read-only) Socket name"
-#+ * VectorNodeSocket.default_value -> default_value: float[3] "Default value of the socket when no link is attached"
-#+ * VectorNodeSocket.name -> name: string, "(read-only) Socket name"
-#VertexColors.active -> active: pointer "Active vertex color layer"
-#+ * VertexGroup.index -> index: int, "(read-only) Index number of the vertex group"
-#+ * VertexGroup.name -> name: string "Vertex group name"
-#+ * VertexGroupElement.group -> group: int, "(read-only)"
-#+ * VertexGroupElement.weight -> weight: float "Vertex Weight"
-#+ * VoxelData.domain_object -> domain_object: pointer "Object used as the smoke simulation domain"
-#+ * VoxelData.extension -> extension: enum "Sets how the texture is extrapolated past its original bounds"
-#+ * VoxelData.file_format -> file_format: enum "Format of the source data set to render"
-#VoxelData.filepath -> filepath: string "The external source data file to use"
-#+ * VoxelData.intensity -> intensity: float "Multiplier for intensity values"
-#+ * VoxelData.interpolation -> interpolation: enum "Method to interpolate/smooth values between voxel cells"
-#+ * VoxelData.resolution -> resolution: int[3] "Resolution of the voxel grid"
-#+ * VoxelData.smoke_data_type -> smoke_data_type: enum "Simulation value to be used as a texture"
-#VoxelData.still_frame -> still_frame: int "The frame number to always use"
-#VoxelData.use_still_frame -> use_still_frame: boolean "Always render a still frame from the voxel data sequence"
-#+ * Window.screen -> screen: pointer "Active screen showing in the window"
-#+ * WorldLighting.adapt_to_speed -> adapt_to_speed: float "Use the speed vector pass to reduce AO samples in fast moving pixels. Higher values result in more aggressive sample reduction. Requires Vec pass enabled (for Raytrace Adaptive QMC)"
-#WorldLighting.ao_blend_type -> ao_blend_type: enum "Defines how AO mixes with material shading"
-#+ * WorldLighting.ao_factor -> ao_factor: float "Factor for ambient occlusion blending"
-#+ * WorldLighting.bias -> bias: float "Bias (in radians) to prevent smoothed faces from showing banding (for Raytrace Constant Jittered)"
-#+ * WorldLighting.correction -> correction: float "Ad-hoc correction for over-occlusion due to the approximation (for Approximate)"
-#+ * WorldLighting.distance -> distance: float "Length of rays, defines how far away other faces give occlusion effect"
-#+ * WorldLighting.environment_color -> environment_color: enum "Defines where the color of the environment light comes from"
-#+ * WorldLighting.environment_energy -> environment_energy: float "Defines the strength of environment light"
-#WorldLighting.error_threshold -> error_threshold: float "Low values are slower and higher quality (for Approximate)"
-#+ * WorldLighting.falloff_strength -> falloff_strength: float "Distance attenuation factor, the higher, the shorter the shadows"
-#+ * WorldLighting.gather_method -> gather_method: enum "NO DESCRIPTION"
-#+ * WorldLighting.indirect_bounces -> indirect_bounces: int "Number of indirect diffuse light bounces to use for approximate ambient occlusion"
-#+ * WorldLighting.indirect_factor -> indirect_factor: float "Factor for how much surrounding objects contribute to light"
-#+ * WorldLighting.passes -> passes: int "Number of preprocessing passes to reduce overocclusion (for approximate ambient occlusion)"
-#+ * WorldLighting.sample_method -> sample_method: enum "Method for generating shadow samples (for Raytrace)"
-#+ * WorldLighting.samples -> samples: int "Amount of ray samples. Higher values give smoother results and longer rendering times"
-#+ * WorldLighting.threshold -> threshold: float "Samples below this threshold will be considered fully shadowed/unshadowed and skipped (for Raytrace Adaptive QMC)"
-#+ * WorldLighting.use_ambient_occlusion -> use_ambient_occlusion: boolean "Use Ambient Occlusion to add shadowing based on distance between objects"
-#WorldLighting.use_cache -> use_cache: boolean "Cache AO results in pixels and interpolate over neighbouring pixels for speedup (for Approximate)"
-#WorldLighting.use_environment_light -> use_environment_light: boolean "Add light coming from the environment"
-#WorldLighting.use_falloff -> use_falloff: boolean "NO DESCRIPTION"
-#WorldLighting.use_indirect_light -> use_indirect_light: boolean "Add indirect light bouncing of surrounding objects"
-#+ * WorldMistSettings.depth -> depth: float "The distance over which the mist effect fades in"
-#+ * WorldMistSettings.falloff -> falloff: enum "Type of transition used to fade mist"
-#+ * WorldMistSettings.height -> height: float "Control how much mist density decreases with height"
-#+ * WorldMistSettings.intensity -> intensity: float "Intensity of the mist effect"
-#+ * WorldMistSettings.start -> start: float "Starting distance of the mist, measured from the camera"
-#+ * WorldMistSettings.use_mist -> use_mist: boolean "Occlude objects with the environment color as they are further away"
-#+ * WorldStarsSettings.average_separation -> average_separation: float "Average distance between any two stars"
-#WorldStarsSettings.color_random -> color_random: float "Randomize star colors"
-#WorldStarsSettings.distance_min -> distance_min: float "Minimum distance to the camera for stars"
-#+ * WorldStarsSettings.size -> size: float "Average screen dimension of stars"
-#+ * WorldStarsSettings.use_stars -> use_stars: boolean "Enable starfield generation"
+# See svn history for example formatting for this file, currently this isnt in use.
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
index 1c3c772de38..31adba0b63f 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c intern/*.cpp)
-
-SET(INC
+set(INC
. ./intern
../blenlib
../makesdna
@@ -35,17 +33,73 @@ SET(INC
../render/extern/include
../editors/include
../gpu
- ../../../intern/guardedalloc
- ../../../intern/decimation/extern
+ ../../../intern/guardedalloc
../../../intern/elbeem/extern
- ../../../intern/bsp/extern
../../../extern/recastnavigation/Recast/Include
- ${ZLIB_INC}
+ ${ZLIB_INCLUDE_DIRS}
)
-IF(NOT WITH_FLUID)
- ADD_DEFINITIONS(-DDISABLE_ELBEEM)
-ENDIF(NOT WITH_FLUID)
+set(SRC
+ intern/MOD_armature.c
+ intern/MOD_array.c
+ intern/MOD_bevel.c
+ intern/MOD_boolean.c
+ intern/MOD_build.c
+ intern/MOD_cast.c
+ intern/MOD_cloth.c
+ intern/MOD_collision.c
+ intern/MOD_curve.c
+ intern/MOD_decimate.c
+ intern/MOD_displace.c
+ intern/MOD_edgesplit.c
+ intern/MOD_explode.c
+ intern/MOD_fluidsim.c
+ intern/MOD_fluidsim_util.c
+ intern/MOD_hook.c
+ intern/MOD_lattice.c
+ intern/MOD_mask.c
+ intern/MOD_meshdeform.c
+ intern/MOD_mirror.c
+ intern/MOD_multires.c
+ intern/MOD_navmesh.cpp
+ intern/MOD_none.c
+ intern/MOD_particleinstance.c
+ intern/MOD_particlesystem.c
+ intern/MOD_screw.c
+ intern/MOD_shapekey.c
+ intern/MOD_shrinkwrap.c
+ intern/MOD_simpledeform.c
+ intern/MOD_smoke.c
+ intern/MOD_smooth.c
+ intern/MOD_softbody.c
+ intern/MOD_solidify.c
+ intern/MOD_subsurf.c
+ intern/MOD_surface.c
+ intern/MOD_util.c
+ intern/MOD_uvproject.c
+ intern/MOD_wave.c
+
+ MOD_modifiertypes.h
+ intern/MOD_boolean_util.h
+ intern/MOD_fluidsim_util.h
+ intern/MOD_util.h
+)
+
+if(WITH_MOD_BOOLEAN)
+ add_definitions(-DWITH_MOD_BOOLEAN)
+ list(APPEND SRC
+ intern/MOD_boolean_util.c
+ )
+ list(APPEND INC ../../../intern/bsp/extern)
+endif()
+
+if(WITH_MOD_DECIMATE)
+ add_definitions(-DWITH_MOD_DECIMATE)
+ list(APPEND INC ../../../intern/decimation/extern)
+endif()
-BLENDERLIB(bf_modifiers "${SRC}" "${INC}")
+if(NOT WITH_MOD_FLUID)
+ add_definitions(-DDISABLE_ELBEEM)
+endif()
+blender_add_lib(bf_modifiers "${SRC}" "${INC}")
diff --git a/source/blender/modifiers/MOD_modifiertypes.h b/source/blender/modifiers/MOD_modifiertypes.h
index 67f9107d3fc..b76a0f85ca5 100644
--- a/source/blender/modifiers/MOD_modifiertypes.h
+++ b/source/blender/modifiers/MOD_modifiertypes.h
@@ -70,6 +70,6 @@ extern ModifierTypeInfo modifierType_Screw;
extern ModifierTypeInfo modifierType_NavMesh;
/* MOD_util.c */
-void modifier_type_init(ModifierTypeInfo *types[], ModifierType type);
+void modifier_type_init(ModifierTypeInfo *types[]);
#endif //MOD_MODIFIERTYPES_H
diff --git a/source/blender/modifiers/Makefile b/source/blender/modifiers/Makefile
deleted file mode 100644
index ddcddb90186..00000000000
--- a/source/blender/modifiers/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): Ben Batt
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/modifiers
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/modifiers/SConscript b/source/blender/modifiers/SConscript
index e9930d65cb8..659cd1ffcb1 100644
--- a/source/blender/modifiers/SConscript
+++ b/source/blender/modifiers/SConscript
@@ -14,9 +14,13 @@ incs += ' ' + env['BF_ZLIB_INC']
defs = []
+# could be made optional
+defs += ['WITH_MOD_BOOLEAN']
+defs += ['WITH_MOD_DECIMATE']
+
if env['BF_NO_ELBEEM']:
defs.append('DISABLE_ELBEEM')
env.BlenderLib ( libname = 'bf_modifiers', sources = sources,
includes = Split(incs), defines=defs,
- libtype=['core','player'], priority = [180, 20] )
+ libtype=['core','player'], priority = [180, 40] )
diff --git a/source/blender/modifiers/intern/MOD_armature.c b/source/blender/modifiers/intern/MOD_armature.c
index d0e36f90ff5..ac25987871d 100644
--- a/source/blender/modifiers/intern/MOD_armature.c
+++ b/source/blender/modifiers/intern/MOD_armature.c
@@ -34,6 +34,10 @@
#include "DNA_armature_types.h"
#include "DNA_object_types.h"
+#include "DNA_mesh_types.h"
+
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_lattice.h"
@@ -60,20 +64,21 @@ static void copyData(ModifierData *md, ModifierData *target)
tamd->object = amd->object;
tamd->deformflag = amd->deformflag;
+ tamd->multi = amd->multi;
strncpy(tamd->defgrp_name, amd->defgrp_name, 32);
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md))
{
CustomDataMask dataMask = 0;
/* ask for vertexgroups */
- dataMask |= (1 << CD_MDEFORMVERT);
+ dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
-static int isDisabled(ModifierData *md, int useRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{
ArmatureModifierData *amd = (ArmatureModifierData*) md;
@@ -90,9 +95,10 @@ static void foreachObjectLink(
walk(userData, ob, &amd->object);
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob,
- DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
ArmatureModifierData *amd = (ArmatureModifierData*) md;
@@ -104,9 +110,12 @@ static void updateDepgraph(
}
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
ArmatureModifierData *amd = (ArmatureModifierData*) md;
@@ -153,6 +162,19 @@ static void deformMatricesEM(
if(!derivedData) dm->release(dm);
}
+static void deformMatrices(ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ float (*vertexCos)[3], float (*defMats)[3][3], int numVerts)
+{
+ ArmatureModifierData *amd = (ArmatureModifierData*) md;
+ DerivedMesh *dm = derivedData;
+
+ if(!derivedData) dm = CDDM_from_mesh((Mesh*)ob->data, ob);
+
+ armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts,
+ amd->deformflag, NULL, amd->defgrp_name);
+
+ if(!derivedData) dm->release(dm);
+}
ModifierTypeInfo modifierType_Armature = {
/* name */ "Armature",
@@ -164,6 +186,7 @@ ModifierTypeInfo modifierType_Armature = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ deformMatrices,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ deformMatricesEM,
/* applyModifier */ 0,
@@ -174,6 +197,7 @@ ModifierTypeInfo modifierType_Armature = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c
index a6fefbcd863..9b49066d623 100644
--- a/source/blender/modifiers/intern/MOD_array.c
+++ b/source/blender/modifiers/intern/MOD_array.c
@@ -35,6 +35,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_edgehash.h"
@@ -101,8 +102,8 @@ static void foreachObjectLink(
walk(userData, ob, &amd->offset_ob);
}
-static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene,
- Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene), Object *UNUSED(ob), DagNode *obNode)
{
ArrayModifierData *amd = (ArrayModifierData*) md;
@@ -151,6 +152,30 @@ static float vertarray_size(MVert *mvert, int numVerts, int axis)
return max_co - min_co;
}
+/* XXX This function fixes bad merging code, in some cases removing vertices creates indices > maxvert */
+
+static int test_index_face_maxvert(MFace *mface, CustomData *fdata, int mfindex, int nr, int maxvert)
+{
+ if(mface->v1 >= maxvert) {
+ // printf("bad index in array\n");
+ mface->v1= maxvert - 1;
+ }
+ if(mface->v2 >= maxvert) {
+ // printf("bad index in array\n");
+ mface->v2= maxvert - 1;
+ }
+ if(mface->v3 >= maxvert) {
+ // printf("bad index in array\n");
+ mface->v3= maxvert - 1;
+ }
+ if(mface->v4 >= maxvert) {
+ // printf("bad index in array\n");
+ mface->v4= maxvert - 1;
+ }
+
+ return test_index_face(mface, fdata, mfindex, nr);
+}
+
typedef struct IndexMapEntry {
/* the new vert index that this old vert index maps to */
int new;
@@ -419,7 +444,13 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
}
if(med.v1 == med.v2) continue;
-
+
+ /* XXX Unfortunately the calc_mapping returns sometimes numVerts... leads to bad crashes */
+ if(med.v1 >= numVerts)
+ med.v1= numVerts-1;
+ if(med.v2 >= numVerts)
+ med.v2= numVerts-1;
+
if (initFlags) {
med.flag |= ME_EDGEDRAW | ME_EDGERENDER;
}
@@ -436,6 +467,16 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
{
vert1 = calc_mapping(indexMap, inMED.v1, j);
vert2 = calc_mapping(indexMap, inMED.v2, j);
+
+ /* edge could collapse to single point after mapping */
+ if(vert1 == vert2) continue;
+
+ /* XXX Unfortunately the calc_mapping returns sometimes numVerts... leads to bad crashes */
+ if(vert1 >= numVerts)
+ vert1= numVerts-1;
+ if(vert2 >= numVerts)
+ vert2= numVerts-1;
+
/* avoid duplicate edges */
if(!BLI_edgehash_haskey(edges, vert1, vert2)) {
med2 = &medge[numEdges];
@@ -481,7 +522,7 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
if(inMF.v4 && indexMap[inMF.v4].merge_final)
mf->v4 = calc_mapping(indexMap, indexMap[inMF.v4].merge, count-1);
- if(test_index_face(mf, &result->faceData, numFaces, inMF.v4?4:3) < 3)
+ if(test_index_face_maxvert(mf, &result->faceData, numFaces, inMF.v4?4:3, numVerts) < 3)
continue;
numFaces++;
@@ -505,12 +546,10 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
if (inMF.v4)
mf2->v4 = calc_mapping(indexMap, inMF.v4, j);
- test_index_face(mf2, &result->faceData, numFaces, inMF.v4?4:3);
numFaces++;
/* if the face has fewer than 3 vertices, don't create it */
- if(mf2->v3 == 0 || (mf2->v1 && (mf2->v1 == mf2->v3 || mf2->v1 ==
- mf2->v4))) {
+ if(test_index_face_maxvert(mf2, &result->faceData, numFaces-1, inMF.v4?4:3, numVerts) < 3) {
numFaces--;
DM_free_face_data(result, numFaces, 1);
}
@@ -601,8 +640,8 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
if(mface[numFaces].v4) {
mface[numFaces].v4 = vert_map[mface[numFaces].v4];
- test_index_face(&mface[numFaces], &result->faceData,
- numFaces, 4);
+ test_index_face_maxvert(&mface[numFaces], &result->faceData,
+ numFaces, 4, numVerts);
}
else
{
@@ -729,26 +768,27 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
return result;
}
-static DerivedMesh *applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
+ DerivedMesh *dm,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *result;
ArrayModifierData *amd = (ArrayModifierData*) md;
- result = arrayModifier_doArray(amd, md->scene, ob, derivedData, 0);
+ result = arrayModifier_doArray(amd, md->scene, ob, dm, 0);
- if(result != derivedData)
+ if(result != dm)
CDDM_calc_normals(result);
return result;
}
-static DerivedMesh *applyModifierEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
- DerivedMesh *derivedData)
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *dm)
{
- return applyModifier(md, ob, derivedData, 0, 1);
+ return applyModifier(md, ob, dm, 0, 1);
}
@@ -765,6 +805,7 @@ ModifierTypeInfo modifierType_Array = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -775,6 +816,7 @@ ModifierTypeInfo modifierType_Array = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_bevel.c b/source/blender/modifiers/intern/MOD_bevel.c
index 62c7dfa5600..effc376943e 100644
--- a/source/blender/modifiers/intern/MOD_bevel.c
+++ b/source/blender/modifiers/intern/MOD_bevel.c
@@ -31,6 +31,8 @@
*/
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
+
#include "BKE_bmesh.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
@@ -66,20 +68,21 @@ static void copyData(ModifierData *md, ModifierData *target)
strncpy(tbmd->defgrp_name, bmd->defgrp_name, 32);
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
BevelModifierData *bmd = (BevelModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(bmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(bmd->defgrp_name[0]) dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
-static DerivedMesh *applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *result;
BME_Mesh *bm;
@@ -107,9 +110,9 @@ static DerivedMesh *applyModifier(
return result;
}
-static DerivedMesh *applyModifierEM(
- ModifierData *md, Object *ob, EditMesh *editData,
- DerivedMesh *derivedData)
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
+ EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, 0, 1);
}
@@ -126,6 +129,7 @@ ModifierTypeInfo modifierType_Bevel = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -136,6 +140,7 @@ ModifierTypeInfo modifierType_Bevel = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c
index 4e8e3117b7e..c40d6cfb79e 100644
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -32,6 +32,9 @@
#include "DNA_object_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
@@ -49,7 +52,7 @@ static void copyData(ModifierData *md, ModifierData *target)
tbmd->operation = bmd->operation;
}
-static int isDisabled(ModifierData *md, int useRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{
BooleanModifierData *bmd = (BooleanModifierData*) md;
@@ -66,9 +69,10 @@ static void foreachObjectLink(
walk(userData, ob, &bmd->object);
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob,
- DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
BooleanModifierData *bmd = (BooleanModifierData*) md;
@@ -80,10 +84,11 @@ static void updateDepgraph(
}
}
-
-static DerivedMesh *applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+#ifdef WITH_MOD_BOOLEAN
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
BooleanModifierData *bmd = (BooleanModifierData*) md;
DerivedMesh *dm = bmd->object->derivedFinal;
@@ -104,12 +109,21 @@ static DerivedMesh *applyModifier(
return derivedData;
}
+#else // WITH_MOD_BOOLEAN
+static DerivedMesh *applyModifier(ModifierData *UNUSED(md), Object *UNUSED(ob),
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
+{
+ return derivedData;
+}
+#endif // WITH_MOD_BOOLEAN
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md))
{
- CustomDataMask dataMask = (1 << CD_MTFACE) + (1 << CD_MEDGE);
+ CustomDataMask dataMask = CD_MASK_MTFACE | CD_MASK_MEDGE;
- dataMask |= (1 << CD_MDEFORMVERT);
+ dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
@@ -125,6 +139,7 @@ ModifierTypeInfo modifierType_Boolean = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -135,6 +150,7 @@ ModifierTypeInfo modifierType_Boolean = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_boolean_util.c b/source/blender/modifiers/intern/MOD_boolean_util.c
index 2fba4c6a603..900a94487e5 100644
--- a/source/blender/modifiers/intern/MOD_boolean_util.c
+++ b/source/blender/modifiers/intern/MOD_boolean_util.c
@@ -37,6 +37,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BKE_cdderivedmesh.h"
@@ -577,7 +578,7 @@ int NewBooleanMesh(Scene *scene, Base *base, Base *base_select, int int_op_type)
MEM_freeN(mat);
/* update dag */
- DAG_id_flush_update(&ob_new->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob_new->id, OB_RECALC_DATA);
return 1;
}
diff --git a/source/blender/modifiers/intern/MOD_build.c b/source/blender/modifiers/intern/MOD_build.c
index 8fc1be7d5ee..704caf0aff8 100644
--- a/source/blender/modifiers/intern/MOD_build.c
+++ b/source/blender/modifiers/intern/MOD_build.c
@@ -32,6 +32,7 @@
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BLI_rand.h"
#include "BLI_ghash.h"
@@ -65,14 +66,15 @@ static void copyData(ModifierData *md, ModifierData *target)
tbmd->seed = bmd->seed;
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
- DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm = derivedData;
DerivedMesh *result;
@@ -285,6 +287,7 @@ ModifierTypeInfo modifierType_Build = {
| eModifierTypeFlag_AcceptsCVs,
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -295,6 +298,7 @@ ModifierTypeInfo modifierType_Build = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_cast.c b/source/blender/modifiers/intern/MOD_cast.c
index 10843cf9677..17c2ec40b7e 100644
--- a/source/blender/modifiers/intern/MOD_cast.c
+++ b/source/blender/modifiers/intern/MOD_cast.c
@@ -34,11 +34,13 @@
#include "DNA_object_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_deform.h"
#include "BKE_DerivedMesh.h"
#include "BKE_modifier.h"
-#include "BKE_utildefines.h"
+
#include "depsgraph_private.h"
@@ -73,7 +75,7 @@ static void copyData(ModifierData *md, ModifierData *target)
strncpy(tcmd->defgrp_name, cmd->defgrp_name, 32);
}
-static int isDisabled(ModifierData *md, int useRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{
CastModifierData *cmd = (CastModifierData*) md;
short flag;
@@ -85,13 +87,13 @@ static int isDisabled(ModifierData *md, int useRenderParams)
return 0;
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
CastModifierData *cmd = (CastModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(cmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(cmd->defgrp_name[0]) dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
@@ -106,9 +108,10 @@ static void foreachObjectLink(
walk (userData, ob, &cmd->object);
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob,
- DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
CastModifierData *cmd = (CastModifierData*) md;
@@ -566,14 +569,17 @@ static void cuboid_do(
}
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm = NULL;
CastModifierData *cmd = (CastModifierData *)md;
- dm = get_dm(md->scene, ob, NULL, derivedData, NULL, 0);
+ dm = get_dm(ob, NULL, derivedData, NULL, 0);
if (cmd->type == MOD_CAST_TYPE_CUBOID) {
cuboid_do(cmd, ob, dm, vertexCos, numVerts);
@@ -589,7 +595,7 @@ static void deformVertsEM(
ModifierData *md, Object *ob, struct EditMesh *editData,
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
{
- DerivedMesh *dm = get_dm(md->scene, ob, editData, derivedData, NULL, 0);
+ DerivedMesh *dm = get_dm(ob, editData, derivedData, NULL, 0);
CastModifierData *cmd = (CastModifierData *)md;
if (cmd->type == MOD_CAST_TYPE_CUBOID) {
@@ -613,6 +619,7 @@ ModifierTypeInfo modifierType_Cast = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -623,6 +630,7 @@ ModifierTypeInfo modifierType_Cast = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_cloth.c b/source/blender/modifiers/intern/MOD_cloth.c
index bfb5f6ee028..1cb46c0992f 100644
--- a/source/blender/modifiers/intern/MOD_cloth.c
+++ b/source/blender/modifiers/intern/MOD_cloth.c
@@ -36,6 +36,9 @@
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cloth.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_global.h"
@@ -61,7 +64,9 @@ static void initData(ModifierData *md)
}
static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
- DerivedMesh *derivedData, int useRenderParams, int isFinalCalc)
+ DerivedMesh *dm,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
ClothModifierData *clmd = (ClothModifierData*) md;
DerivedMesh *result=NULL;
@@ -72,17 +77,17 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
initData(md);
if(!clmd->sim_parms || !clmd->coll_parms)
- return derivedData;
+ return dm;
}
- result = clothModifier_do(clmd, md->scene, ob, derivedData, useRenderParams, isFinalCalc);
+ result = clothModifier_do(clmd, md->scene, ob, dm);
if(result)
{
CDDM_calc_normals(result);
return result;
}
- return derivedData;
+ return dm;
}
static void updateDepgraph(
@@ -111,16 +116,16 @@ static void updateDepgraph(
}
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
CustomDataMask dataMask = 0;
ClothModifierData *clmd = (ClothModifierData*)md;
if(cloth_uses_vgroup(clmd))
- dataMask |= (1 << CD_MDEFORMVERT);
+ dataMask |= CD_MASK_MDEFORMVERT;
if(clmd->sim_parms->shapekey_rest != 0)
- dataMask |= (1 << CD_CLOTH_ORCO);
+ dataMask |= CD_MASK_CLOTH_ORCO;
return dataMask;
}
@@ -150,7 +155,7 @@ static void copyData(ModifierData *md, ModifierData *target)
tclmd->clothObject = NULL;
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
@@ -191,6 +196,7 @@ ModifierTypeInfo modifierType_Cloth = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -201,6 +207,7 @@ ModifierTypeInfo modifierType_Cloth = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_collision.c b/source/blender/modifiers/intern/MOD_collision.c
index 32fbd58839a..8decb460d6a 100644
--- a/source/blender/modifiers/intern/MOD_collision.c
+++ b/source/blender/modifiers/intern/MOD_collision.c
@@ -37,6 +37,8 @@
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_collision.h"
#include "BKE_cdderivedmesh.h"
@@ -94,14 +96,17 @@ static void freeData(ModifierData *md)
}
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int UNUSED(numVerts),
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
CollisionModifierData *collmd = (CollisionModifierData*) md;
DerivedMesh *dm = NULL;
@@ -238,6 +243,7 @@ ModifierTypeInfo modifierType_Collision = {
/* copyData */ 0,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -248,6 +254,7 @@ ModifierTypeInfo modifierType_Collision = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_curve.c b/source/blender/modifiers/intern/MOD_curve.c
index 97c7a4b01d6..c4e41941acc 100644
--- a/source/blender/modifiers/intern/MOD_curve.c
+++ b/source/blender/modifiers/intern/MOD_curve.c
@@ -35,6 +35,9 @@
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_lattice.h"
#include "BKE_modifier.h"
@@ -59,18 +62,18 @@ static void copyData(ModifierData *md, ModifierData *target)
strncpy(tcmd->name, cmd->name, 32);
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
CurveModifierData *cmd = (CurveModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(cmd->name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(cmd->name[0]) dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
-static int isDisabled(ModifierData *md, int userRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(userRenderParams))
{
CurveModifierData *cmd = (CurveModifierData*) md;
@@ -87,9 +90,10 @@ static void foreachObjectLink(
walk(userData, ob, &cmd->object);
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest, Scene *scene,
- Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
CurveModifierData *cmd = (CurveModifierData*) md;
@@ -101,9 +105,12 @@ static void updateDepgraph(
}
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
CurveModifierData *cmd = (CurveModifierData*) md;
@@ -135,6 +142,7 @@ ModifierTypeInfo modifierType_Curve = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -145,6 +153,7 @@ ModifierTypeInfo modifierType_Curve = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_decimate.c b/source/blender/modifiers/intern/MOD_decimate.c
index 9163a9771f0..2f1723cf9bb 100644
--- a/source/blender/modifiers/intern/MOD_decimate.c
+++ b/source/blender/modifiers/intern/MOD_decimate.c
@@ -33,6 +33,8 @@
#include "DNA_meshdata_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_mesh.h"
@@ -41,8 +43,9 @@
#include "MEM_guardedalloc.h"
+#ifdef WITH_MOD_DECIMATE
#include "LOD_decimation.h"
-
+#endif
static void initData(ModifierData *md)
{
@@ -59,9 +62,11 @@ static void copyData(ModifierData *md, ModifierData *target)
tdmd->percent = dmd->percent;
}
-static DerivedMesh *applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+#ifdef WITH_MOD_DECIMATE
+static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DecimateModifierData *dmd = (DecimateModifierData*) md;
DerivedMesh *dm = derivedData, *result = NULL;
@@ -174,7 +179,15 @@ static DerivedMesh *applyModifier(
exit:
return result;
}
-
+#else // WITH_MOD_DECIMATE
+static DerivedMesh *applyModifier(ModifierData *UNUSED(md), Object *UNUSED(ob),
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
+{
+ return derivedData;
+}
+#endif // WITH_MOD_DECIMATE
ModifierTypeInfo modifierType_Decimate = {
/* name */ "Decimate",
@@ -184,6 +197,7 @@ ModifierTypeInfo modifierType_Decimate = {
/* flags */ eModifierTypeFlag_AcceptsMesh,
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -194,6 +208,7 @@ ModifierTypeInfo modifierType_Decimate = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_displace.c b/source/blender/modifiers/intern/MOD_displace.c
index efe57410441..919814edf59 100644
--- a/source/blender/modifiers/intern/MOD_displace.c
+++ b/source/blender/modifiers/intern/MOD_displace.c
@@ -34,6 +34,8 @@
#include "DNA_object_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
@@ -75,16 +77,16 @@ static void copyData(ModifierData *md, ModifierData *target)
strncpy(tdmd->uvlayer_name, dmd->uvlayer_name, 32);
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
DisplaceModifierData *dmd = (DisplaceModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(dmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(dmd->defgrp_name[0]) dataMask |= CD_MASK_MDEFORMVERT;
/* ask for UV coordinates if we need them */
- if(dmd->texmapping == MOD_DISP_MAP_UV) dataMask |= (1 << CD_MTFACE);
+ if(dmd->texmapping == MOD_DISP_MAP_UV) dataMask |= CD_MASK_MTFACE;
return dataMask;
}
@@ -103,6 +105,12 @@ static int dependsOnTime(ModifierData *md)
}
}
+static int dependsOnNormals(ModifierData *md)
+{
+ DisplaceModifierData *dmd = (DisplaceModifierData *)md;
+ return (dmd->direction == MOD_DISP_DIR_NOR);
+}
+
static void foreachObjectLink(ModifierData *md, Object *ob,
ObjectWalkFunc walk, void *userData)
{
@@ -121,16 +129,17 @@ static void foreachIDLink(ModifierData *md, Object *ob,
foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData);
}
-static int isDisabled(ModifierData *md, int useRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{
DisplaceModifierData *dmd = (DisplaceModifierData*) md;
return (!dmd->texture || dmd->strength == 0.0f);
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest, struct Scene *scene,
- Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
DisplaceModifierData *dmd = (DisplaceModifierData*) md;
@@ -140,6 +149,12 @@ static void updateDepgraph(
dag_add_relation(forest, curNode, obNode,
DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Displace Modifier");
}
+
+
+ if(dmd->texmapping == MOD_DISP_MAP_GLOBAL)
+ dag_add_relation(forest, obNode, obNode,
+ DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Displace Modifier");
+
}
static void get_texture_coords(DisplaceModifierData *dmd, Object *ob,
@@ -302,11 +317,14 @@ static void displaceModifier_do(
MEM_freeN(tex_co);
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
- DerivedMesh *dm= get_cddm(md->scene, ob, NULL, derivedData, vertexCos);
+ DerivedMesh *dm= get_cddm(ob, NULL, derivedData, vertexCos);
displaceModifier_do((DisplaceModifierData *)md, ob, dm,
vertexCos, numVerts);
@@ -319,7 +337,7 @@ static void deformVertsEM(
ModifierData *md, Object *ob, struct EditMesh *editData,
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
{
- DerivedMesh *dm= get_cddm(md->scene, ob, editData, derivedData, vertexCos);
+ DerivedMesh *dm= get_cddm(ob, editData, derivedData, vertexCos);
displaceModifier_do((DisplaceModifierData *)md, ob, dm,
vertexCos, numVerts);
@@ -339,6 +357,7 @@ ModifierTypeInfo modifierType_Displace = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -349,6 +368,7 @@ ModifierTypeInfo modifierType_Displace = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ dependsOnNormals,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ foreachIDLink,
};
diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c
index 6614625a650..56138552000 100644
--- a/source/blender/modifiers/intern/MOD_edgesplit.c
+++ b/source/blender/modifiers/intern/MOD_edgesplit.c
@@ -39,6 +39,8 @@
#include "BLI_memarena.h"
#include "BLI_edgehash.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
@@ -730,8 +732,7 @@ static int edge_is_loose(SmoothEdge *edge)
return !(edge->faces && edge->faces->next);
}
-static int edge_is_sharp(SmoothEdge *edge, int flags,
- float threshold)
+static int edge_is_sharp(SmoothEdge *edge)
{
#ifdef EDGESPLIT_DEBUG_1
printf("edge %d: ", edge->newIndex);
@@ -761,8 +762,7 @@ static int edge_is_sharp(SmoothEdge *edge, int flags,
* - hits a sharp edge (the edge is returned)
* - returns to the start edge (NULL is returned)
*/
-static SmoothEdge *find_other_sharp_edge(SmoothVert *vert, SmoothEdge *edge,
- LinkNode **visited_faces, float threshold, int flags)
+static SmoothEdge *find_other_sharp_edge(SmoothVert *vert, SmoothEdge *edge, LinkNode **visited_faces)
{
SmoothFace *face = NULL;
SmoothEdge *edge2 = NULL;
@@ -790,7 +790,7 @@ static SmoothEdge *find_other_sharp_edge(SmoothVert *vert, SmoothEdge *edge,
/* search until we hit a loose edge or a sharp edge or an edge we've
* seen before
*/
- while(face && !edge_is_sharp(edge2, flags, threshold)
+ while(face && !edge_is_sharp(edge2)
&& !linklist_contains(visited_edges, edge2)) {
#ifdef EDGESPLIT_DEBUG_3
printf("current face %4d; current edge %4d\n", face->newIndex,
@@ -902,8 +902,7 @@ static void propagate_split(SmoothEdge *edge, SmoothVert *vert,
edge->newIndex, vert->newIndex);
#endif
- edge2 = find_other_sharp_edge(vert, edge, &visited_faces,
- mesh->threshold, mesh->flags);
+ edge2 = find_other_sharp_edge(vert, edge, &visited_faces);
if(!edge2) {
/* didn't find a sharp or loose edge, so we've hit a dead end */
@@ -912,7 +911,7 @@ static void propagate_split(SmoothEdge *edge, SmoothVert *vert,
if(edge_is_loose(edge)) {
/* edge is loose, so we can split edge2 at this vert */
split_edge(edge2, vert, mesh);
- } else if(edge_is_sharp(edge, mesh->flags, mesh->threshold)) {
+ } else if(edge_is_sharp(edge)) {
/* both edges are sharp, so we can split the pair at vert */
split_edge(edge, vert, mesh);
} else {
@@ -961,8 +960,7 @@ static void split_edge(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh)
edge->newIndex, vert->newIndex);
#endif
- edge2 = find_other_sharp_edge(vert, edge, &visited_faces,
- mesh->threshold, mesh->flags);
+ edge2 = find_other_sharp_edge(vert, edge, &visited_faces);
if(!edge2) {
/* didn't find a sharp or loose edge, so try the other vert */
@@ -1111,7 +1109,7 @@ static void split_sharp_edges(SmoothMesh *mesh, float split_angle, int flags)
for(i = 0; i < mesh->num_edges; i++) {
SmoothEdge *edge = &mesh->edges[i];
- if(edge_is_sharp(edge, flags, mesh->threshold)) {
+ if(edge_is_sharp(edge)) {
split_edge(edge, edge->verts[0], mesh);
do {
@@ -1190,8 +1188,7 @@ static void split_bridge_verts(SmoothMesh *mesh)
}
}
-static DerivedMesh *edgesplitModifier_do(EdgeSplitModifierData *emd,
- Object *ob, DerivedMesh *dm)
+static DerivedMesh *edgesplitModifier_do(EdgeSplitModifierData *emd, DerivedMesh *dm)
{
SmoothMesh *mesh;
DerivedMesh *result;
@@ -1244,14 +1241,15 @@ static DerivedMesh *edgesplitModifier_do(EdgeSplitModifierData *emd,
return result;
}
-static DerivedMesh *applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *result;
EdgeSplitModifierData *emd = (EdgeSplitModifierData*) md;
- result = edgesplitModifier_do(emd, ob, derivedData);
+ result = edgesplitModifier_do(emd, derivedData);
if(result != derivedData)
CDDM_calc_normals(result);
@@ -1259,9 +1257,9 @@ static DerivedMesh *applyModifier(
return result;
}
-static DerivedMesh *applyModifierEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
- DerivedMesh *derivedData)
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, 0, 1);
}
@@ -1280,6 +1278,7 @@ ModifierTypeInfo modifierType_EdgeSplit = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -1290,6 +1289,7 @@ ModifierTypeInfo modifierType_EdgeSplit = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c
index 9a42c9909a7..a0765b56808 100644
--- a/source/blender/modifiers/intern/MOD_explode.c
+++ b/source/blender/modifiers/intern/MOD_explode.c
@@ -37,6 +37,7 @@
#include "BLI_rand.h"
#include "BLI_math.h"
#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_deform.h"
@@ -46,7 +47,7 @@
#include "BKE_object.h"
#include "BKE_particle.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
+
#include "MEM_guardedalloc.h"
@@ -74,24 +75,24 @@ static void copyData(ModifierData *md, ModifierData *target)
temd->protect = emd->protect;
temd->vgroup = emd->vgroup;
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
ExplodeModifierData *emd= (ExplodeModifierData*) md;
CustomDataMask dataMask = 0;
if(emd->vgroup)
- dataMask |= (1 << CD_MDEFORMVERT);
+ dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
static void createFacepa(ExplodeModifierData *emd,
- ParticleSystemModifierData *psmd,
- Object *ob, DerivedMesh *dm)
+ ParticleSystemModifierData *psmd,
+ DerivedMesh *dm)
{
ParticleSystem *psys=psmd->psys;
MFace *fa=0, *mface=0;
@@ -197,7 +198,7 @@ static DerivedMesh * splitEdges(ExplodeModifierData *emd, DerivedMesh *dm){
int *facesplit = MEM_callocN(sizeof(int)*totface,"explode_facesplit");
int *vertpa = MEM_callocN(sizeof(int)*totvert,"explode_vertpa2");
int *facepa = emd->facepa;
- int *fs, totesplit=0,totfsplit=0,totin=0,curdupvert=0,curdupface=0,curdupin=0;
+ int *fs, totesplit=0,totfsplit=0,totin=0,curdupface=0,curdupin=0;
int i,j,v1,v2,v3,v4,esplit;
edgehash= BLI_edgehash_new();
@@ -313,7 +314,6 @@ static DerivedMesh * splitEdges(ExplodeModifierData *emd, DerivedMesh *dm){
emd->facepa=facepa;
/* create new verts */
- curdupvert=totvert;
ehi= BLI_edgehashIterator_new(edgehash);
for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
BLI_edgehashIterator_getKey(ehi, &i, &j);
@@ -663,14 +663,15 @@ static DerivedMesh * explodeMesh(ExplodeModifierData *emd,
DerivedMesh *explode, *dm=to_explode;
MFace *mf=0, *mface;
ParticleSettings *part=psmd->psys->part;
- ParticleSimulationData sim = {scene, ob, psmd->psys, psmd};
+ ParticleSimulationData sim= {0};
ParticleData *pa=NULL, *pars=psmd->psys->particles;
ParticleKey state;
EdgeHash *vertpahash;
EdgeHashIterator *ehi;
float *vertco=0, imat[4][4];
float loc0[3], nor[3];
- float timestep, cfra;
+ float cfra;
+ /* float timestep; */
int *facepa=emd->facepa;
int totdup=0,totvert=0,totface=0,totpart=0;
int i, j, v, mindex=0;
@@ -680,7 +681,12 @@ static DerivedMesh * explodeMesh(ExplodeModifierData *emd,
mface= dm->getFaceArray(dm);
totpart= psmd->psys->totpart;
- timestep= psys_get_timestep(&sim);
+ sim.scene= scene;
+ sim.ob= ob;
+ sim.psys= psmd->psys;
+ sim.psmd= psmd;
+
+ /* timestep= psys_get_timestep(&sim); */
//if(part->flag & PART_GLOB_TIME)
cfra= BKE_curframe(scene);
@@ -833,9 +839,10 @@ static ParticleSystemModifierData * findPrecedingParticlesystem(Object *ob, Modi
}
return psmd;
}
-static DerivedMesh * applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+static DerivedMesh * applyModifier(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm = derivedData;
ExplodeModifierData *emd= (ExplodeModifierData*) md;
@@ -852,16 +859,16 @@ static DerivedMesh * applyModifier(
if(emd->facepa==0
|| psmd->flag&eParticleSystemFlag_Pars
|| emd->flag&eExplodeFlag_CalcFaces
- || MEM_allocN_len(emd->facepa)/sizeof(int) != dm->getNumFaces(dm)){
+ || MEM_allocN_len(emd->facepa)/sizeof(int) != dm->getNumFaces(dm))
+ {
if(psmd->flag & eParticleSystemFlag_Pars)
psmd->flag &= ~eParticleSystemFlag_Pars;
if(emd->flag & eExplodeFlag_CalcFaces)
emd->flag &= ~eExplodeFlag_CalcFaces;
- createFacepa(emd,psmd,ob,derivedData);
- }
-
+ createFacepa(emd,psmd,derivedData);
+ }
/* 2. create new mesh */
if(emd->flag & eExplodeFlag_EdgeSplit){
int *facepa = emd->facepa;
@@ -888,6 +895,7 @@ ModifierTypeInfo modifierType_Explode = {
/* flags */ eModifierTypeFlag_AcceptsMesh,
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -898,6 +906,7 @@ ModifierTypeInfo modifierType_Explode = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_fluidsim.c b/source/blender/modifiers/intern/MOD_fluidsim.c
index c683bee0b35..19111b0cafc 100644
--- a/source/blender/modifiers/intern/MOD_fluidsim.c
+++ b/source/blender/modifiers/intern/MOD_fluidsim.c
@@ -34,6 +34,9 @@
#include "DNA_object_fluidsim.h"
#include "DNA_object_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
@@ -69,9 +72,10 @@ static void copyData(ModifierData *md, ModifierData *target)
-static DerivedMesh * applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
+ DerivedMesh *dm,
+ int useRenderParams,
+ int isFinalCalc)
{
FluidsimModifierData *fluidmd= (FluidsimModifierData*) md;
DerivedMesh *result = NULL;
@@ -82,17 +86,12 @@ static DerivedMesh * applyModifier(
initData(md);
if(!fluidmd->fss)
- return derivedData;
+ return dm;
}
- result = fluidsimModifier_do(fluidmd, md->scene, ob, derivedData, useRenderParams, isFinalCalc);
+ result= fluidsimModifier_do(fluidmd, md->scene, ob, dm, useRenderParams, isFinalCalc);
- if(result)
- {
- return result;
- }
-
- return derivedData;
+ return result ? result : dm;
}
static void updateDepgraph(
@@ -125,7 +124,7 @@ static void updateDepgraph(
}
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
@@ -143,6 +142,7 @@ ModifierTypeInfo modifierType_Fluidsim = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -153,6 +153,7 @@ ModifierTypeInfo modifierType_Fluidsim = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_fluidsim_util.c b/source/blender/modifiers/intern/MOD_fluidsim_util.c
index 0c5428cc9d8..eb556e31aba 100644
--- a/source/blender/modifiers/intern/MOD_fluidsim_util.c
+++ b/source/blender/modifiers/intern/MOD_fluidsim_util.c
@@ -42,11 +42,13 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+#include "BKE_main.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_mesh.h"
#include "BKE_utildefines.h"
-#include "BKE_global.h" /* G.sce only */
+#include "BKE_global.h" /* G.main->name only */
#include "MOD_modifiertypes.h"
@@ -138,6 +140,8 @@ void fluidsim_init(FluidsimModifierData *fluidmd)
fss->flag |= OB_FLUIDSIM_ACTIVE;
}
+#else
+ (void)fluidmd; /* unused */
#endif
return;
}
@@ -154,7 +158,10 @@ void fluidsim_free(FluidsimModifierData *fluidmd)
}
MEM_freeN(fluidmd->fss);
}
+#else
+ (void)fluidmd; /* unused */
#endif
+
return;
}
@@ -162,15 +169,15 @@ void fluidsim_free(FluidsimModifierData *fluidmd)
/* read .bobj.gz file into a fluidsimDerivedMesh struct */
DerivedMesh *fluidsim_read_obj(char *filename)
{
- int wri,i,j;
- float wrf;
+ int wri = 0,i;
int gotBytes;
gzFile gzf;
int numverts = 0, numfaces = 0;
DerivedMesh *dm = NULL;
- MFace *mface;
- MVert *mvert;
- short *normals;
+ MFace *mf;
+ MVert *mv;
+ short *normals, *no_s;
+ float no[3];
// ------------------------------------------------
// get numverts + numfaces first
@@ -186,28 +193,25 @@ DerivedMesh *fluidsim_read_obj(char *filename)
numverts = wri;
// skip verts
- for(i=0; i<numverts*3; i++)
- {
- gotBytes = gzread(gzf, &wrf, sizeof( wrf ));
- }
+ gotBytes = gzseek(gzf, numverts * 3 * sizeof(float), SEEK_CUR) != -1;
+
// read number of normals
- gotBytes = gzread(gzf, &wri, sizeof(wri));
+ if(gotBytes)
+ gotBytes = gzread(gzf, &wri, sizeof(wri));
// skip normals
- for(i=0; i<numverts*3; i++)
- {
- gotBytes = gzread(gzf, &wrf, sizeof( wrf ));
- }
+ gotBytes = gzseek(gzf, numverts * 3 * sizeof(float), SEEK_CUR) != -1;
/* get no. of triangles */
- gotBytes = gzread(gzf, &wri, sizeof(wri));
+ if(gotBytes)
+ gotBytes = gzread(gzf, &wri, sizeof(wri));
numfaces = wri;
gzclose( gzf );
// ------------------------------------------------
- if(!numfaces || !numverts)
+ if(!numfaces || !numverts || !gotBytes)
return NULL;
gzf = gzopen(filename, "rb");
@@ -228,17 +232,10 @@ DerivedMesh *fluidsim_read_obj(char *filename)
gotBytes = gzread(gzf, &wri, sizeof(wri));
// read vertex position from file
- mvert = CDDM_get_verts(dm);
- for(i=0; i<numverts; i++)
- {
- MVert *mv = &mvert[i];
+ mv = CDDM_get_verts(dm);
- for(j=0; j<3; j++)
- {
- gotBytes = gzread(gzf, &wrf, sizeof( wrf ));
- mv->co[j] = wrf;
- }
- }
+ for(i=0; i<numverts; i++, mv++)
+ gotBytes = gzread(gzf, mv->co, sizeof(float) * 3);
// should be the same as numverts
gotBytes = gzread(gzf, &wri, sizeof(wri));
@@ -260,29 +257,31 @@ DerivedMesh *fluidsim_read_obj(char *filename)
}
// read normals from file (but don't save them yet)
- for(i=0; i<numverts*3; i++)
+ for(i=numverts, no_s= normals; i>0; i--, no_s += 3)
{
- gotBytes = gzread(gzf, &wrf, sizeof( wrf ));
- normals[i] = (short)(wrf*32767.0f);
+ gotBytes = gzread(gzf, no, sizeof(float) * 3);
+ normal_float_to_short_v3(no_s, no);
}
/* read no. of triangles */
gotBytes = gzread(gzf, &wri, sizeof(wri));
- if(wri!=numfaces)
+ if(wri!=numfaces) {
printf("Fluidsim: error in reading data from file.\n");
+ if(dm)
+ dm->release(dm);
+ gzclose( gzf );
+ MEM_freeN(normals);
+ return NULL;
+ }
// read triangles from file
- mface = CDDM_get_faces(dm);
- for(i=0; i<numfaces; i++)
+ mf = CDDM_get_faces(dm);
+ for(i=numfaces; i>0; i--, mf++)
{
- int face[4];
- MFace *mf = &mface[i];
+ int face[3];
- gotBytes = gzread(gzf, &(face[0]), sizeof( face[0] ));
- gotBytes = gzread(gzf, &(face[1]), sizeof( face[1] ));
- gotBytes = gzread(gzf, &(face[2]), sizeof( face[2] ));
- face[3] = 0;
+ gotBytes = gzread(gzf, face, sizeof(int) * 3);
// check if 3rd vertex has index 0 (not allowed in blender)
if(face[2])
@@ -297,7 +296,7 @@ DerivedMesh *fluidsim_read_obj(char *filename)
mf->v2 = face[2];
mf->v3 = face[0];
}
- mf->v4 = face[3];
+ mf->v4 = 0;
test_index_face(mf, NULL, 0, 3);
}
@@ -443,7 +442,7 @@ void fluidsim_read_vel_cache(FluidsimModifierData *fluidmd, DerivedMesh *dm, cha
gzclose(gzf);
}
-DerivedMesh *fluidsim_read_cache(Object *ob, DerivedMesh *orgdm, FluidsimModifierData *fluidmd, int framenr, int useRenderParams)
+DerivedMesh *fluidsim_read_cache(DerivedMesh *orgdm, FluidsimModifierData *fluidmd, int framenr, int useRenderParams)
{
int displaymode = 0;
int curFrame = framenr - 1 /*scene->r.sfra*/; /* start with 0 at start frame */
@@ -477,7 +476,7 @@ DerivedMesh *fluidsim_read_cache(Object *ob, DerivedMesh *orgdm, FluidsimModifie
strcat(targetDir,"fluidsurface_final_####");
}
- BLI_path_abs(targetDir, G.sce);
+ BLI_path_abs(targetDir, G.main->name);
BLI_path_frame(targetDir, curFrame, 0); // fixed #frame-no
strcpy(targetFile,targetDir);
@@ -534,10 +533,12 @@ DerivedMesh *fluidsim_read_cache(Object *ob, DerivedMesh *orgdm, FluidsimModifie
return dm;
}
-
#endif // DISABLE_ELBEEM
-DerivedMesh *fluidsimModifier_do(FluidsimModifierData *fluidmd, Scene *scene, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc)
+DerivedMesh *fluidsimModifier_do(FluidsimModifierData *fluidmd, Scene *scene,
+ Object *UNUSED(ob),
+ DerivedMesh *dm,
+ int useRenderParams)
{
#ifndef DISABLE_ELBEEM
DerivedMesh *result = NULL;
@@ -558,7 +559,7 @@ DerivedMesh *fluidsimModifier_do(FluidsimModifierData *fluidmd, Scene *scene, Ob
// timescale not supported yet
// clmd->sim_parms->timescale= timescale;
-
+
// support reversing of baked fluid frames here
if((fss->flag & OB_FLUIDSIM_REVERSE) && (fss->lastgoodframe >= 0))
{
@@ -567,42 +568,17 @@ DerivedMesh *fluidsimModifier_do(FluidsimModifierData *fluidmd, Scene *scene, Ob
}
/* try to read from cache */
- if(((fss->lastgoodframe >= framenr) || (fss->lastgoodframe < 0)) && (result = fluidsim_read_cache(ob, dm, fluidmd, framenr, useRenderParams)))
- {
- // fss->lastgoodframe = framenr; // set also in src/fluidsim.c
+ /* if the frame is there, fine, otherwise don't do anything */
+ if((result = fluidsim_read_cache(dm, fluidmd, framenr, useRenderParams)))
return result;
- }
- else
- {
- // display last known good frame
- if(fss->lastgoodframe >= 0)
- {
- if((result = fluidsim_read_cache(ob, dm, fluidmd, fss->lastgoodframe, useRenderParams)))
- {
- return result;
- }
-
- // it was supposed to be a valid frame but it isn't!
- fss->lastgoodframe = framenr - 1;
-
-
- // this could be likely the case when you load an old fluidsim
- if((result = fluidsim_read_cache(ob, dm, fluidmd, fss->lastgoodframe, useRenderParams)))
- {
- return result;
- }
- }
-
- result = CDDM_copy(dm);
-
- if(result)
- {
- return result;
- }
- }
return dm;
#else
+ /* unused */
+ (void)fluidmd;
+ (void)scene;
+ (void)dm;
+ (void)useRenderParams;
return NULL;
#endif
}
diff --git a/source/blender/modifiers/intern/MOD_hook.c b/source/blender/modifiers/intern/MOD_hook.c
index 2c9ae311585..79493d2c549 100644
--- a/source/blender/modifiers/intern/MOD_hook.c
+++ b/source/blender/modifiers/intern/MOD_hook.c
@@ -35,12 +35,14 @@
#include "DNA_object_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_action.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
#include "BKE_deform.h"
+
#include "depsgraph_private.h"
#include "MEM_guardedalloc.h"
@@ -68,13 +70,14 @@ static void copyData(ModifierData *md, ModifierData *target)
strncpy(thmd->subtarget, hmd->subtarget, 32);
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
HookModifierData *hmd = (HookModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(!hmd->indexar && hmd->name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(hmd->name[0]) dataMask |= CD_MASK_MDEFORMVERT;
+ if(hmd->indexar) dataMask |= CD_MASK_ORIGINDEX;
return dataMask;
}
@@ -86,7 +89,7 @@ static void freeData(ModifierData *md)
if (hmd->indexar) MEM_freeN(hmd->indexar);
}
-static int isDisabled(ModifierData *md, int useRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{
HookModifierData *hmd = (HookModifierData*) md;
@@ -103,8 +106,10 @@ static void foreachObjectLink(
walk(userData, ob, &hmd->object);
}
-static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene,
- Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
HookModifierData *hmd = (HookModifierData*) md;
@@ -118,15 +123,37 @@ static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *sc
}
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static float hook_falloff(float *co_1, float *co_2, const float falloff_squared, float fac)
+{
+ if(falloff_squared) {
+ float len_squared = len_squared_v3v3(co_1, co_2);
+ if(len_squared > falloff_squared) {
+ return 0.0f;
+ }
+ else if(len_squared > 0.0) {
+ return fac * (1.0 - (len_squared / falloff_squared));
+ }
+ }
+
+ return fac;
+}
+
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *dm,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
HookModifierData *hmd = (HookModifierData*) md;
bPoseChannel *pchan= get_pose_channel(hmd->object->pose, hmd->subtarget);
float vec[3], mat[4][4], dmat[4][4];
- int i;
- DerivedMesh *dm = derivedData;
+ int i, *index_pt;
+ const float falloff_squared= hmd->falloff * hmd->falloff; /* for faster comparisons */
+
+ int max_dvert= 0;
+ MDeformVert *dvert= NULL;
+ int defgrp_index = -1;
/* get world-space matrix of target, corrected for the space the verts are in */
if (hmd->subtarget[0] && pchan) {
@@ -141,98 +168,91 @@ static void deformVerts(
mul_serie_m4(mat, ob->imat, dmat, hmd->parentinv,
NULL, NULL, NULL, NULL, NULL);
- /* vertex indices? */
- if(hmd->indexar) {
- for(i = 0; i < hmd->totindex; i++) {
- int index = hmd->indexar[i];
-
- /* This should always be true and I don't generally like
- * "paranoid" style code like this, but old files can have
- * indices that are out of range because old blender did
- * not correct them on exit editmode. - zr
- */
- if(index < numVerts) {
- float *co = vertexCos[index];
- float fac = hmd->force;
-
- /* if DerivedMesh is present and has original index data,
- * use it
- */
- if(dm && dm->getVertDataArray(dm, CD_ORIGINDEX)) {
+ if((defgrp_index= defgroup_name_index(ob, hmd->name)) != -1) {
+ Mesh *me = ob->data;
+ if(dm) {
+ dvert= dm->getVertDataArray(dm, CD_MDEFORMVERT);
+ if(dvert) {
+ max_dvert = numVerts;
+ }
+ }
+ else if(me->dvert) {
+ dvert= me->dvert;
+ if(dvert) {
+ max_dvert = me->totvert;
+ }
+ }
+ }
+
+ /* Regarding index range checking below.
+ *
+ * This should always be true and I don't generally like
+ * "paranoid" style code like this, but old files can have
+ * indices that are out of range because old blender did
+ * not correct them on exit editmode. - zr
+ */
+
+ if(hmd->force == 0.0f) {
+ /* do nothing, avoid annoying checks in the loop */
+ }
+ else if(hmd->indexar) { /* vertex indices? */
+ const float fac_orig= hmd->force;
+ float fac;
+ const int *origindex_ar;
+
+ /* if DerivedMesh is present and has original index data,
+ * use it
+ */
+ if(dm && (origindex_ar= dm->getVertDataArray(dm, CD_ORIGINDEX))) {
+ for(i= 0, index_pt= hmd->indexar; i < hmd->totindex; i++, index_pt++) {
+ if(*index_pt < numVerts) {
int j;
- int orig_index;
- for(j = 0; j < numVerts; ++j) {
- fac = hmd->force;
- orig_index = *(int *)dm->getVertData(dm, j,
- CD_ORIGINDEX);
- if(orig_index == index) {
- co = vertexCos[j];
- if(hmd->falloff != 0.0) {
- float len = len_v3v3(co, hmd->cent);
- if(len > hmd->falloff) fac = 0.0;
- else if(len > 0.0)
- fac *= sqrt(1.0 - len / hmd->falloff);
- }
- if(fac != 0.0) {
- mul_v3_m4v3(vec, mat, co);
- interp_v3_v3v3(co, co, vec, fac);
+ for(j = 0; j < numVerts; j++) {
+ if(origindex_ar[j] == *index_pt) {
+ float *co = vertexCos[j];
+ if((fac= hook_falloff(hmd->cent, co, falloff_squared, fac_orig))) {
+ if(dvert)
+ fac *= defvert_find_weight(dvert+j, defgrp_index);
+
+ if(fac) {
+ mul_v3_m4v3(vec, mat, co);
+ interp_v3_v3v3(co, co, vec, fac);
+ }
}
}
}
- } else {
- if(hmd->falloff != 0.0) {
- float len = len_v3v3(co, hmd->cent);
- if(len > hmd->falloff) fac = 0.0;
- else if(len > 0.0)
- fac *= sqrt(1.0 - len / hmd->falloff);
- }
-
- if(fac != 0.0) {
- mul_v3_m4v3(vec, mat, co);
- interp_v3_v3v3(co, co, vec, fac);
- }
}
}
}
- }
- else if(hmd->name[0]) { /* vertex group hook */
- Mesh *me = ob->data;
- int use_dverts = 0;
- int maxVerts = 0;
- int defgrp_index = defgroup_name_index(ob, hmd->name);
-
- if(dm) {
- if(dm->getVertData(dm, 0, CD_MDEFORMVERT)) {
- maxVerts = dm->getNumVerts(dm);
- use_dverts = 1;
+ else { /* missing dm or ORIGINDEX */
+ for(i= 0, index_pt= hmd->indexar; i < hmd->totindex; i++, index_pt++) {
+ if(*index_pt < numVerts) {
+ float *co = vertexCos[*index_pt];
+ if((fac= hook_falloff(hmd->cent, co, falloff_squared, fac_orig))) {
+ if(dvert)
+ fac *= defvert_find_weight(dvert+(*index_pt), defgrp_index);
+
+ if(fac) {
+ mul_v3_m4v3(vec, mat, co);
+ interp_v3_v3v3(co, co, vec, fac);
+ }
+ }
+ }
}
}
- else if(me->dvert) {
- maxVerts = me->totvert;
- use_dverts = 1;
- }
+ }
+ else if(dvert) { /* vertex group hook */
+ int i;
+ const float fac_orig= hmd->force;
- if(defgrp_index >= 0 && use_dverts) {
- MDeformVert *dvert = me->dvert;
- int i;
+ for(i = 0; i < max_dvert; i++, dvert++) {
float fac;
+ float *co = vertexCos[i];
- for(i = 0; i < maxVerts; i++, dvert++) {
- if(dm) dvert = dm->getVertData(dm, i, CD_MDEFORMVERT);
-
- fac= defvert_find_weight(dvert, defgrp_index);
-
- if(fac > 0.0f) {
- float *co = vertexCos[i];
-
- if(hmd->falloff != 0.0) {
- float len = len_v3v3(co, hmd->cent);
- if(len > hmd->falloff) fac = 0.0;
- else if(len > 0.0)
- fac *= sqrt(1.0 - len / hmd->falloff);
- }
-
+ if((fac= hook_falloff(hmd->cent, co, falloff_squared, fac_orig))) {
+ fac *= defvert_find_weight(dvert, defgrp_index);
+ if(fac) {
mul_v3_m4v3(vec, mat, co);
interp_v3_v3v3(co, co, vec, fac);
}
@@ -249,7 +269,7 @@ static void deformVertsEM(
if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
- deformVerts(md, ob, derivedData, vertexCos, numVerts, 0, 0);
+ deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0);
if(!derivedData) dm->release(dm);
}
@@ -264,6 +284,7 @@ ModifierTypeInfo modifierType_Hook = {
| eModifierTypeFlag_SupportsEditmode,
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -274,6 +295,7 @@ ModifierTypeInfo modifierType_Hook = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_lattice.c b/source/blender/modifiers/intern/MOD_lattice.c
index 4270f2ff6e8..c5fb87c8ffc 100644
--- a/source/blender/modifiers/intern/MOD_lattice.c
+++ b/source/blender/modifiers/intern/MOD_lattice.c
@@ -34,6 +34,9 @@
#include "DNA_object_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_lattice.h"
#include "BKE_modifier.h"
@@ -52,18 +55,18 @@ static void copyData(ModifierData *md, ModifierData *target)
strncpy(tlmd->name, lmd->name, 32);
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
LatticeModifierData *lmd = (LatticeModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(lmd->name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(lmd->name[0]) dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
-static int isDisabled(ModifierData *md, int userRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(userRenderParams))
{
LatticeModifierData *lmd = (LatticeModifierData*) md;
@@ -80,8 +83,10 @@ static void foreachObjectLink(
walk(userData, ob, &lmd->object);
}
-static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene,
- Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
LatticeModifierData *lmd = (LatticeModifierData*) md;
@@ -93,9 +98,12 @@ static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *sc
}
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
LatticeModifierData *lmd = (LatticeModifierData*) md;
@@ -129,6 +137,7 @@ ModifierTypeInfo modifierType_Lattice = {
| eModifierTypeFlag_SupportsEditmode,
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -139,6 +148,7 @@ ModifierTypeInfo modifierType_Lattice = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_mask.c b/source/blender/modifiers/intern/MOD_mask.c
index 94eb2380b66..b2f2c86c46d 100644
--- a/source/blender/modifiers/intern/MOD_mask.c
+++ b/source/blender/modifiers/intern/MOD_mask.c
@@ -32,6 +32,7 @@
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "DNA_armature_types.h"
@@ -53,11 +54,12 @@ static void copyData(ModifierData *md, ModifierData *target)
MaskModifierData *tmmd = (MaskModifierData*) target;
strcpy(tmmd->vgroup, mmd->vgroup);
+ tmmd->flag = mmd->flag;
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md))
{
- return (1 << CD_MDEFORMVERT);
+ return CD_MASK_MDEFORMVERT;
}
static void foreachObjectLink(
@@ -69,8 +71,10 @@ static void foreachObjectLink(
walk(userData, ob, &mmd->ob_arm);
}
-static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene,
- Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
MaskModifierData *mmd = (MaskModifierData *)md;
@@ -84,8 +88,9 @@ static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *sc
}
static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
- DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
MaskModifierData *mmd= (MaskModifierData *)md;
DerivedMesh *dm= derivedData, *result= NULL;
@@ -129,7 +134,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
return derivedData;
/* hashes for finding mapping of:
- * - vgroups to indicies -> vgroupHash (string, int)
+ * - vgroups to indices -> vgroupHash (string, int)
* - bones to vgroup indices -> boneHash (index of vgroup, dummy)
*/
vgroupHash= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "mask vgroup gh");
@@ -394,6 +399,7 @@ ModifierTypeInfo modifierType_Mask = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -404,6 +410,7 @@ ModifierTypeInfo modifierType_Mask = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c
index fa1ee7e3159..61e7f950e0f 100644
--- a/source/blender/modifiers/intern/MOD_meshdeform.c
+++ b/source/blender/modifiers/intern/MOD_meshdeform.c
@@ -34,6 +34,8 @@
#include "DNA_object_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_global.h"
@@ -76,18 +78,18 @@ static void copyData(ModifierData *md, ModifierData *target)
tmmd->object = mmd->object;
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
MeshDeformModifierData *mmd = (MeshDeformModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(mmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(mmd->defgrp_name[0]) dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
-static int isDisabled(ModifierData *md, int useRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{
MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
@@ -104,9 +106,10 @@ static void foreachObjectLink(
walk(userData, ob, &mmd->object);
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob,
- DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
@@ -204,7 +207,7 @@ static void meshdeformModifier_do(
/* if we don't have one computed, use derivedmesh from data
* without any modifiers */
if(!cagedm) {
- cagedm= get_dm(md->scene, mmd->object, NULL, NULL, NULL, 0);
+ cagedm= get_dm(mmd->object, NULL, NULL, NULL, 0);
if(cagedm)
cagedm->needsFree= 1;
}
@@ -338,11 +341,14 @@ static void meshdeformModifier_do(
cagedm->release(cagedm);
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
- DerivedMesh *dm= get_dm(md->scene, ob, NULL, derivedData, NULL, 0);;
+ DerivedMesh *dm= get_dm(ob, NULL, derivedData, NULL, 0);
modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */
@@ -352,11 +358,13 @@ static void deformVerts(
dm->release(dm);
}
-static void deformVertsEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
- DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+static void deformVertsEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts)
{
- DerivedMesh *dm= get_dm(md->scene, ob, NULL, derivedData, NULL, 0);;
+ DerivedMesh *dm= get_dm(ob, NULL, derivedData, NULL, 0);
meshdeformModifier_do(md, ob, dm, vertexCos, numVerts);
@@ -437,6 +445,7 @@ ModifierTypeInfo modifierType_MeshDeform = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -447,6 +456,7 @@ ModifierTypeInfo modifierType_MeshDeform = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_mirror.c b/source/blender/modifiers/intern/MOD_mirror.c
index 06c93eefc59..5c73b2f0866 100644
--- a/source/blender/modifiers/intern/MOD_mirror.c
+++ b/source/blender/modifiers/intern/MOD_mirror.c
@@ -34,12 +34,13 @@
#include "DNA_object_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_deform.h"
-#include "BKE_utildefines.h"
+
#include "MEM_guardedalloc.h"
#include "depsgraph_private.h"
@@ -61,7 +62,7 @@ static void copyData(ModifierData *md, ModifierData *target)
tmmd->axis = mmd->axis;
tmmd->flag = mmd->flag;
tmmd->tolerance = mmd->tolerance;
- tmmd->mirror_ob = mmd->mirror_ob;;
+ tmmd->mirror_ob = mmd->mirror_ob;
}
static void foreachObjectLink(
@@ -74,8 +75,10 @@ static void foreachObjectLink(
walk(userData, ob, &mmd->mirror_ob);
}
-static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene,
- Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
MirrorModifierData *mmd = (MirrorModifierData*) md;
@@ -139,7 +142,11 @@ static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
if (mmd->mirror_ob) {
mul_m4_v3(mtx, co);
}
- isShared = ABS(co[axis])<=tolerance;
+
+ if(mmd->flag & MOD_MIR_NO_MERGE)
+ isShared = 0;
+ else
+ isShared = ABS(co[axis])<=tolerance;
/* Because the topology result (# of vertices) must be the same if
* the mesh data is overridden by vertex cos, have to calc sharedness
@@ -151,8 +158,8 @@ static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
indexMap[i][0] = numVerts - 1;
indexMap[i][1] = !isShared;
-
- if(isShared) {
+ //
+ if(isShared ) {
co[axis] = 0;
if (mmd->mirror_ob) {
mul_m4_v3(imtx, co);
@@ -298,9 +305,10 @@ static DerivedMesh *mirrorModifier__doMirror(MirrorModifierData *mmd,
return result;
}
-static DerivedMesh *applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *result;
MirrorModifierData *mmd = (MirrorModifierData*) md;
@@ -313,9 +321,9 @@ static DerivedMesh *applyModifier(
return result;
}
-static DerivedMesh *applyModifierEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
- DerivedMesh *derivedData)
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, 0, 1);
}
@@ -334,6 +342,7 @@ ModifierTypeInfo modifierType_Mirror = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -344,6 +353,7 @@ ModifierTypeInfo modifierType_Mirror = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c
index dd99c88a684..10b135aaa77 100644
--- a/source/blender/modifiers/intern/MOD_multires.c
+++ b/source/blender/modifiers/intern/MOD_multires.c
@@ -59,6 +59,8 @@ static void copyData(ModifierData *md, ModifierData *target)
tmmd->sculptlvl = mmd->sculptlvl;
tmmd->renderlvl = mmd->renderlvl;
tmmd->totlvl = mmd->totlvl;
+ tmmd->simple = mmd->simple;
+ tmmd->flags = mmd->flags;
}
static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm,
@@ -74,7 +76,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm,
if(!CustomData_get_layer(&me->fdata, CD_MDISPS)) {
/* multires always needs a displacement layer */
CustomData_add_layer(&me->fdata, CD_MDISPS, CD_CALLOC, NULL, me->totface);
- return dm;
}
}
@@ -108,6 +109,7 @@ ModifierTypeInfo modifierType_Multires = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -118,6 +120,7 @@ ModifierTypeInfo modifierType_Multires = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_navmesh.cpp b/source/blender/modifiers/intern/MOD_navmesh.cpp
index e02ad8896a9..888da7ba985 100644
--- a/source/blender/modifiers/intern/MOD_navmesh.cpp
+++ b/source/blender/modifiers/intern/MOD_navmesh.cpp
@@ -41,7 +41,7 @@ extern "C"{
#include "BKE_customdata.h"
#include "MEM_guardedalloc.h"
#include "BIF_gl.h"
-#include "gpu_buffers.h"
+#include "GPU_buffers.h"
#include "GPU_draw.h"
#include "UI_resources.h"
@@ -251,6 +251,7 @@ ModifierTypeInfo modifierType_NavMesh = {
| eModifierTypeFlag_Single),
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
diff --git a/source/blender/modifiers/intern/MOD_none.c b/source/blender/modifiers/intern/MOD_none.c
index 0c749b79f5a..c08335d638a 100644
--- a/source/blender/modifiers/intern/MOD_none.c
+++ b/source/blender/modifiers/intern/MOD_none.c
@@ -34,13 +34,17 @@
* ***** END GPL LICENSE BLOCK *****
*/
+
+
+#include "BLI_utildefines.h"
+
#include "MOD_modifiertypes.h"
/* We only need to define isDisabled; because it always returns 1,
* no other functions will be called
*/
-static int isDisabled(ModifierData *md, int userRenderParams)
+static int isDisabled(ModifierData *UNUSED(md), int UNUSED(userRenderParams))
{
return 1;
}
@@ -55,6 +59,7 @@ ModifierTypeInfo modifierType_None = {
/* copyData */ 0,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -65,6 +70,7 @@ ModifierTypeInfo modifierType_None = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_particleinstance.c b/source/blender/modifiers/intern/MOD_particleinstance.c
index 4f5acc60cda..c36581d9317 100644
--- a/source/blender/modifiers/intern/MOD_particleinstance.c
+++ b/source/blender/modifiers/intern/MOD_particleinstance.c
@@ -37,13 +37,14 @@
#include "BLI_math.h"
#include "BLI_listbase.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_lattice.h"
#include "BKE_modifier.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
-#include "BKE_utildefines.h"
+
#include "depsgraph_private.h"
@@ -72,12 +73,14 @@ static void copyData(ModifierData *md, ModifierData *target)
tpimd->random_position = pimd->random_position;
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 0;
}
static void updateDepgraph(ModifierData *md, DagForest *forest,
- struct Scene *scene,Object *ob, DagNode *obNode)
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData*) md;
@@ -98,9 +101,10 @@ static void foreachObjectLink(ModifierData *md, Object *ob,
walk(userData, ob, &pimd->ob);
}
-static DerivedMesh * applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+static DerivedMesh * applyModifier(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm = derivedData, *result;
ParticleInstanceModifierData *pimd= (ParticleInstanceModifierData*) md;
@@ -306,9 +310,9 @@ static DerivedMesh * applyModifier(
return result;
}
-static DerivedMesh *applyModifierEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
- DerivedMesh *derivedData)
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, 0, 1);
}
@@ -326,6 +330,7 @@ ModifierTypeInfo modifierType_ParticleInstance = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -336,6 +341,7 @@ ModifierTypeInfo modifierType_ParticleInstance = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_particlesystem.c b/source/blender/modifiers/intern/MOD_particlesystem.c
index 02480b8d2a3..c7638afbbcc 100644
--- a/source/blender/modifiers/intern/MOD_particlesystem.c
+++ b/source/blender/modifiers/intern/MOD_particlesystem.c
@@ -34,6 +34,9 @@
#include "DNA_material_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_material.h"
#include "BKE_modifier.h"
@@ -94,24 +97,24 @@ static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
mtex=ma->mtex[i];
if(mtex && (ma->septex & (1<<i))==0)
if(mtex->pmapto && (mtex->texco & TEXCO_UV))
- dataMask |= (1 << CD_MTFACE);
+ dataMask |= CD_MASK_MTFACE;
}
}
if(psmd->psys->part->tanfac!=0.0)
- dataMask |= (1 << CD_MTFACE);
+ dataMask |= CD_MASK_MTFACE;
/* ask for vertexgroups if we need them */
for(i=0; i<PSYS_TOT_VG; i++){
if(psmd->psys->vgroup[i]){
- dataMask |= (1 << CD_MDEFORMVERT);
+ dataMask |= CD_MASK_MDEFORMVERT;
break;
}
}
/* particles only need this if they are after a non deform modifier, and
* the modifier stack will only create them in that case. */
- dataMask |= CD_MASK_ORIGSPACE;
+ dataMask |= CD_MASK_ORIGSPACE|CD_MASK_ORIGINDEX;
dataMask |= CD_MASK_ORCO;
@@ -119,9 +122,12 @@ static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
}
/* saves the current emitter state for a particle system and calculates particles */
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int UNUSED(numVerts),
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm = derivedData;
ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md;
@@ -137,7 +143,7 @@ static void deformVerts(
return;
if(dm==0) {
- dm= get_dm(md->scene, ob, NULL, NULL, vertexCos, 1);
+ dm= get_dm(ob, NULL, NULL, vertexCos, 1);
if(!dm)
return;
@@ -150,6 +156,14 @@ static void deformVerts(
psmd->dm->needsFree = 1;
psmd->dm->release(psmd->dm);
}
+ else if(psmd->flag & eParticleSystemFlag_file_loaded) {
+ /* in file read dm just wasn't saved in file so no need to reset everything */
+ psmd->flag &= ~eParticleSystemFlag_file_loaded;
+ }
+ else {
+ /* no dm before, so recalc particles fully */
+ psys->recalc |= PSYS_RECALC_RESET;
+ }
/* make new dm */
psmd->dm=CDDM_copy(dm);
@@ -168,10 +182,8 @@ static void deformVerts(
if(psmd->dm->getNumVerts(psmd->dm)!=psmd->totdmvert ||
psmd->dm->getNumEdges(psmd->dm)!=psmd->totdmedge ||
psmd->dm->getNumFaces(psmd->dm)!=psmd->totdmface){
- /* in file read dm hasn't really changed but just wasn't saved in file */
psys->recalc |= PSYS_RECALC_RESET;
- psmd->flag |= eParticleSystemFlag_DM_changed;
psmd->totdmvert= psmd->dm->getNumVerts(psmd->dm);
psmd->totdmedge= psmd->dm->getNumEdges(psmd->dm);
@@ -182,7 +194,6 @@ static void deformVerts(
psmd->flag &= ~eParticleSystemFlag_psys_updated;
particle_system_update(md->scene, ob, psys);
psmd->flag |= eParticleSystemFlag_psys_updated;
- psmd->flag &= ~eParticleSystemFlag_DM_changed;
}
}
@@ -218,6 +229,7 @@ ModifierTypeInfo modifierType_ParticleSystem = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
/* deformVertsEM */ 0 /* deformVertsEM */ ,
+ /* deformMatrices */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
/* applyModifierEM */ 0,
@@ -227,6 +239,7 @@ ModifierTypeInfo modifierType_ParticleSystem = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_screw.c b/source/blender/modifiers/intern/MOD_screw.c
index 067567b9cda..7e8fad2801e 100644
--- a/source/blender/modifiers/intern/MOD_screw.c
+++ b/source/blender/modifiers/intern/MOD_screw.c
@@ -36,6 +36,8 @@
#include "DNA_object_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
@@ -128,8 +130,9 @@ static void copyData(ModifierData *md, ModifierData *target)
}
static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
- DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+ DerivedMesh *derivedData,
+ int useRenderParams,
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm= derivedData;
DerivedMesh *result;
@@ -140,7 +143,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
int step;
int i, j;
int i1,i2;
- int step_tot= ltmd->steps;
+ int step_tot= useRenderParams ? ltmd->render_steps : ltmd->steps;
const int do_flip = ltmd->flag & MOD_SCREW_NORMAL_FLIP ? 1 : 0;
int maxVerts=0, maxEdges=0, maxFaces=0;
int totvert= dm->getNumVerts(dm);
@@ -166,17 +169,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
ScrewVertConnect *vc, *vc_tmp, *vert_connect= NULL;
- float mat[4][4] = {{0.0f, 0.0f, 0.0f, 0.0f},
- {0.0f, 0.0f, 0.0f, 0.0f},
- {0.0f, 0.0f, 0.0f, 0.0f},
- {0.0f, 0.0f, 0.0f, 1.0f}};
-
/* dont do anything? */
if (!totvert)
return CDDM_from_template(dm, 0, 0, 0);
- step_tot= useRenderParams ? ltmd->render_steps : ltmd->steps;
-
switch(ltmd->axis) {
case 0:
other_axis_1=1;
@@ -221,7 +217,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
/* angle */
-#if 0 // cant incluide this, not pradictable enough, though quite fun,.
+#if 0 // cant incluide this, not predictable enough, though quite fun,.
if(ltmd->flag & MOD_SCREW_OBJECT_ANGLE) {
float mtx3_tx[3][3];
copy_m3_m4(mtx3_tx, mtx_tx);
@@ -270,7 +266,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
step_tot = ((step_tot + 1) * ltmd->iter) - (ltmd->iter - 1);
/* will the screw be closed?
- * Note! smaller then FLT_EPSILON*100 gives problems with float precission so its never closed. */
+ * Note! smaller then FLT_EPSILON*100 gives problems with float precision so its never closed. */
if (fabs(screw_ofs) <= (FLT_EPSILON*100) && fabs(fabs(angle) - (M_PI * 2)) <= (FLT_EPSILON*100)) {
close= 1;
step_tot--;
@@ -304,6 +300,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
medge_new = result->getEdgeArray(result);
origindex= result->getFaceDataArray(result, CD_ORIGINDEX);
+
+ DM_copy_vert_data(dm, result, 0, 0, totvert); /* copy first otherwise this overwrites our own vertex normals */
/* Set the locations of the first set of verts */
@@ -665,13 +663,12 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
}
/* done with edge connectivity based normal flipping */
- DM_copy_vert_data(dm, result, 0, 0, totvert);
-
/* Add Faces */
for (step=1; step < step_tot; step++) {
const int varray_stride= totvert * step;
float step_angle;
float nor_tx[3];
+ float mat[4][4];
/* Rotation Matrix */
step_angle= (angle / (step_tot - (!close))) * step;
@@ -832,9 +829,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest,
- struct Scene *scene, Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
ScrewModifierData *ltmd= (ScrewModifierData*) md;
@@ -859,13 +857,15 @@ static void foreachObjectLink(
/* This dosnt work with material*/
static DerivedMesh *applyModifierEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
+ ModifierData *md,
+ Object *ob,
+ struct EditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, 0, 1);
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 0;
}
@@ -884,6 +884,7 @@ ModifierTypeInfo modifierType_Screw = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -894,6 +895,7 @@ ModifierTypeInfo modifierType_Screw = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_shapekey.c b/source/blender/modifiers/intern/MOD_shapekey.c
index f73dcc25235..e03783e8eeb 100644
--- a/source/blender/modifiers/intern/MOD_shapekey.c
+++ b/source/blender/modifiers/intern/MOD_shapekey.c
@@ -34,6 +34,9 @@
#include "DNA_key_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_key.h"
#include "BKE_particle.h"
@@ -42,9 +45,12 @@
#include "MEM_guardedalloc.h"
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *UNUSED(derivedData),
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
KeyBlock *kb= ob_get_keyblock(ob);
float (*deformedVerts)[3];
@@ -58,9 +64,32 @@ static void deformVerts(
}
}
-static void deformVertsEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
- DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+static void deformMatrices(ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ float (*vertexCos)[3], float (*defMats)[3][3], int numVerts)
+{
+ Key *key= ob_get_key(ob);
+ KeyBlock *kb= ob_get_keyblock(ob);
+ float scale[3][3];
+ int a;
+
+ (void)vertexCos; /* unused */
+
+ if(kb && kb->totelem==numVerts && kb!=key->refkey) {
+ if(ob->shapeflag & OB_SHAPE_LOCK) scale_m3_fl(scale, 1);
+ else scale_m3_fl(scale, kb->curval);
+
+ for(a=0; a<numVerts; a++)
+ copy_m3_m3(defMats[a], scale);
+ }
+
+ deformVerts(md, ob, derivedData, vertexCos, numVerts, 0, 0);
+}
+
+static void deformVertsEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts)
{
Key *key= ob_get_key(ob);
@@ -68,16 +97,20 @@ static void deformVertsEM(
deformVerts(md, ob, derivedData, vertexCos, numVerts, 0, 0);
}
-static void deformMatricesEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
- DerivedMesh *derivedData, float (*vertexCos)[3],
- float (*defMats)[3][3], int numVerts)
+static void deformMatricesEM(ModifierData *UNUSED(md), Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *UNUSED(derivedData),
+ float (*vertexCos)[3],
+ float (*defMats)[3][3],
+ int numVerts)
{
Key *key= ob_get_key(ob);
KeyBlock *kb= ob_get_keyblock(ob);
float scale[3][3];
int a;
+ (void)vertexCos; /* unused */
+
if(kb && kb->totelem==numVerts && kb!=key->refkey) {
scale_m3_fl(scale, kb->curval);
@@ -86,7 +119,6 @@ static void deformMatricesEM(
}
}
-
ModifierTypeInfo modifierType_ShapeKey = {
/* name */ "ShapeKey",
/* structName */ "ShapeKeyModifierData",
@@ -97,6 +129,7 @@ ModifierTypeInfo modifierType_ShapeKey = {
/* copyData */ 0,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ deformMatrices,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ deformMatricesEM,
/* applyModifier */ 0,
@@ -107,6 +140,7 @@ ModifierTypeInfo modifierType_ShapeKey = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.c b/source/blender/modifiers/intern/MOD_shrinkwrap.c
index 6526be4cb53..56a5b4b8577 100644
--- a/source/blender/modifiers/intern/MOD_shrinkwrap.c
+++ b/source/blender/modifiers/intern/MOD_shrinkwrap.c
@@ -32,6 +32,9 @@
#include <string.h>
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
#include "BKE_shrinkwrap.h"
@@ -71,23 +74,23 @@ static void copyData(ModifierData *md, ModifierData *target)
tsmd->subsurfLevels = smd->subsurfLevels;
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
if(smd->vgroup_name[0])
- dataMask |= (1 << CD_MDEFORMVERT);
+ dataMask |= CD_MASK_MDEFORMVERT;
if(smd->shrinkType == MOD_SHRINKWRAP_PROJECT
&& smd->projAxis == MOD_SHRINKWRAP_PROJECT_OVER_NORMAL)
- dataMask |= (1 << CD_MVERT);
+ dataMask |= CD_MASK_MVERT;
return dataMask;
}
-static int isDisabled(ModifierData *md, int useRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
return !smd->target;
@@ -102,16 +105,21 @@ static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk,
walk(userData, ob, &smd->auxTarget);
}
-static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm = derivedData;
CustomDataMask dataMask = requiredDataMask(ob, md);
/* ensure we get a CDDM with applied vertex coords */
if(dataMask)
- dm= get_cddm(md->scene, ob, NULL, dm, vertexCos);
+ dm= get_cddm(ob, NULL, dm, vertexCos);
- shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, md->scene, ob, dm, vertexCos, numVerts);
+ shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, ob, dm, vertexCos, numVerts);
if(dm != derivedData)
dm->release(dm);
@@ -124,15 +132,18 @@ static void deformVertsEM(ModifierData *md, Object *ob, struct EditMesh *editDat
/* ensure we get a CDDM with applied vertex coords */
if(dataMask)
- dm= get_cddm(md->scene, ob, editData, dm, vertexCos);
+ dm= get_cddm(ob, editData, dm, vertexCos);
- shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, md->scene, ob, dm, vertexCos, numVerts);
+ shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, ob, dm, vertexCos, numVerts);
if(dm != derivedData)
dm->release(dm);
}
-static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
@@ -156,6 +167,7 @@ ModifierTypeInfo modifierType_Shrinkwrap = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -166,6 +178,7 @@ ModifierTypeInfo modifierType_Shrinkwrap = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_simpledeform.c b/source/blender/modifiers/intern/MOD_simpledeform.c
index c64fec4075d..1c3e40a4193 100644
--- a/source/blender/modifiers/intern/MOD_simpledeform.c
+++ b/source/blender/modifiers/intern/MOD_simpledeform.c
@@ -34,13 +34,14 @@
#include "DNA_object_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_lattice.h"
#include "BKE_modifier.h"
#include "BKE_deform.h"
#include "BKE_shrinkwrap.h"
-#include "BKE_utildefines.h"
+
#include "depsgraph_private.h"
@@ -290,14 +291,14 @@ static void copyData(ModifierData *md, ModifierData *target)
strcpy(tsmd->vgroup_name, smd->vgroup_name);
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
if(smd->vgroup_name[0])
- dataMask |= (1 << CD_MDEFORMVERT);
+ dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
@@ -308,7 +309,10 @@ static void foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *u
walk(userData, ob, &smd->origin);
}
-static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
SimpleDeformModifierData *smd = (SimpleDeformModifierData*)md;
@@ -316,7 +320,12 @@ static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *sc
dag_add_relation(forest, dag_get_node(forest, smd->origin), obNode, DAG_RL_OB_DATA, "SimpleDeform Modifier");
}
-static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm = derivedData;
CustomDataMask dataMask = requiredDataMask(ob, md);
@@ -324,7 +333,7 @@ static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData,
/* we implement requiredDataMask but thats not really usefull since
mesh_calc_modifiers pass a NULL derivedData */
if(dataMask)
- dm= get_dm(md->scene, ob, NULL, dm, NULL, 0);
+ dm= get_dm(ob, NULL, dm, NULL, 0);
SimpleDeformModifier_do((SimpleDeformModifierData*)md, ob, dm, vertexCos, numVerts);
@@ -332,7 +341,11 @@ static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData,
dm->release(dm);
}
-static void deformVertsEM(ModifierData *md, Object *ob, struct EditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+static void deformVertsEM(ModifierData *md, Object *ob,
+ struct EditMesh *editData,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts)
{
DerivedMesh *dm = derivedData;
CustomDataMask dataMask = requiredDataMask(ob, md);
@@ -340,7 +353,7 @@ static void deformVertsEM(ModifierData *md, Object *ob, struct EditMesh *editDat
/* we implement requiredDataMask but thats not really usefull since
mesh_calc_modifiers pass a NULL derivedData */
if(dataMask)
- dm= get_dm(md->scene, ob, editData, dm, NULL, 0);
+ dm= get_dm(ob, editData, dm, NULL, 0);
SimpleDeformModifier_do((SimpleDeformModifierData*)md, ob, dm, vertexCos, numVerts);
@@ -362,6 +375,7 @@ ModifierTypeInfo modifierType_SimpleDeform = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -372,6 +386,7 @@ ModifierTypeInfo modifierType_SimpleDeform = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_smoke.c b/source/blender/modifiers/intern/MOD_smoke.c
index 25153de7be4..0227d2008e5 100644
--- a/source/blender/modifiers/intern/MOD_smoke.c
+++ b/source/blender/modifiers/intern/MOD_smoke.c
@@ -34,7 +34,13 @@
#include "MEM_guardedalloc.h"
+#include "DNA_group_types.h"
#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_smoke_types.h"
+
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
@@ -71,29 +77,34 @@ static void freeData(ModifierData *md)
smokeModifier_free (smd);
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int UNUSED(numVerts),
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
SmokeModifierData *smd = (SmokeModifierData*) md;
- DerivedMesh *dm = dm= get_cddm(md->scene, ob, NULL, derivedData, vertexCos);
+ DerivedMesh *dm = get_cddm(ob, NULL, derivedData, vertexCos);
- smokeModifier_do(smd, md->scene, ob, dm, useRenderParams, isFinalCalc);
+ smokeModifier_do(smd, md->scene, ob, dm);
if(dm != derivedData)
dm->release(dm);
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob,
- DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *scene,
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
- /*SmokeModifierData *smd = (SmokeModifierData *) md;
+ SmokeModifierData *smd = (SmokeModifierData *) md;
+
if(smd && (smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain)
{
if(smd->domain->fluid_group)
@@ -107,7 +118,7 @@ static void updateDepgraph(
SmokeModifierData *smd2 = (SmokeModifierData *)modifiers_findByType(go->ob, eModifierType_Smoke);
// check for initialized smoke object
- if(smd2 && (smd2->type & MOD_SMOKE_TYPE_FLOW) && smd2->flow)
+ if(smd2 && (((smd2->type & MOD_SMOKE_TYPE_FLOW) && smd2->flow) || ((smd->type & MOD_SMOKE_TYPE_COLL) && smd2->coll)))
{
DagNode *curNode = dag_get_node(forest, go->ob);
dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Smoke Flow");
@@ -115,8 +126,20 @@ static void updateDepgraph(
}
}
}
+ else {
+ Base *base = scene->base.first;
+
+ for(; base; base = base->next) {
+ SmokeModifierData *smd2 = (SmokeModifierData *)modifiers_findByType(base->object, eModifierType_Smoke);
+
+ if(smd2 && (((smd2->type & MOD_SMOKE_TYPE_FLOW) && smd2->flow) || ((smd->type & MOD_SMOKE_TYPE_COLL) && smd2->coll)))
+ {
+ DagNode *curNode = dag_get_node(forest, base->object);
+ dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Smoke Flow");
+ }
+ }
+ }
}
- */
}
@@ -131,6 +154,7 @@ ModifierTypeInfo modifierType_Smoke = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -141,6 +165,7 @@ ModifierTypeInfo modifierType_Smoke = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_smooth.c b/source/blender/modifiers/intern/MOD_smooth.c
index a42bf8abbaf..7761995a419 100644
--- a/source/blender/modifiers/intern/MOD_smooth.c
+++ b/source/blender/modifiers/intern/MOD_smooth.c
@@ -33,11 +33,13 @@
#include "DNA_meshdata_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_particle.h"
#include "BKE_deform.h"
+
#include "MEM_guardedalloc.h"
#include "MOD_modifiertypes.h"
@@ -65,7 +67,7 @@ static void copyData(ModifierData *md, ModifierData *target)
strncpy(tsmd->defgrp_name, smd->defgrp_name, 32);
}
-static int isDisabled(ModifierData *md, int useRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{
SmoothModifierData *smd = (SmoothModifierData*) md;
short flag;
@@ -78,13 +80,13 @@ static int isDisabled(ModifierData *md, int useRenderParams)
return 0;
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
SmoothModifierData *smd = (SmoothModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(smd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(smd->defgrp_name[0]) dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
@@ -219,9 +221,9 @@ static void smoothModifier_do(
static void deformVerts(
ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+ float (*vertexCos)[3], int numVerts, int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
{
- DerivedMesh *dm= get_dm(md->scene, ob, NULL, derivedData, NULL, 0);
+ DerivedMesh *dm= get_dm(ob, NULL, derivedData, NULL, 0);
smoothModifier_do((SmoothModifierData *)md, ob, dm,
vertexCos, numVerts);
@@ -234,7 +236,7 @@ static void deformVertsEM(
ModifierData *md, Object *ob, struct EditMesh *editData,
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
{
- DerivedMesh *dm= get_dm(md->scene, ob, editData, derivedData, NULL, 0);
+ DerivedMesh *dm= get_dm(ob, editData, derivedData, NULL, 0);
smoothModifier_do((SmoothModifierData *)md, ob, dm,
vertexCos, numVerts);
@@ -254,6 +256,7 @@ ModifierTypeInfo modifierType_Smooth = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -264,6 +267,7 @@ ModifierTypeInfo modifierType_Smooth = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_softbody.c b/source/blender/modifiers/intern/MOD_softbody.c
index 8f629001e0b..7322628267c 100644
--- a/source/blender/modifiers/intern/MOD_softbody.c
+++ b/source/blender/modifiers/intern/MOD_softbody.c
@@ -32,20 +32,26 @@
#include "DNA_scene_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_particle.h"
#include "BKE_softbody.h"
#include "MOD_modifiertypes.h"
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *UNUSED(derivedData),
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
sbObjectStep(md->scene, ob, (float)md->scene->r.cfra, vertexCos, numVerts);
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
@@ -62,6 +68,7 @@ ModifierTypeInfo modifierType_Softbody = {
/* copyData */ 0,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -72,6 +79,7 @@ ModifierTypeInfo modifierType_Softbody = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c
index ee608c7cf31..4faf955b953 100644
--- a/source/blender/modifiers/intern/MOD_solidify.c
+++ b/source/blender/modifiers/intern/MOD_solidify.c
@@ -34,12 +34,13 @@
#include "BLI_math.h"
#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_mesh.h"
#include "BKE_particle.h"
#include "BKE_deform.h"
-#include "BKE_utildefines.h"
+
#include "MOD_modifiertypes.h"
@@ -126,7 +127,7 @@ static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
}
for(edge_iter = BLI_edgehashIterator_new(edge_hash); !BLI_edgehashIterator_isDone(edge_iter); BLI_edgehashIterator_step(edge_iter)) {
- /* Get the edge vert indicies, and edge value (the face indicies that use it)*/
+ /* Get the edge vert indices, and edge value (the face indices that use it)*/
BLI_edgehashIterator_getKey(edge_iter, (int*)&ed_v1, (int*)&ed_v2);
edge_ref = BLI_edgehashIterator_getValue(edge_iter);
@@ -179,35 +180,34 @@ static void copyData(ModifierData *md, ModifierData *target)
strcpy(tsmd->defgrp_name, smd->defgrp_name);
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
SolidifyModifierData *smd = (SolidifyModifierData*) md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(smd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(smd->defgrp_name[0]) dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
-static DerivedMesh *applyModifier(ModifierData *md,
- Object *ob,
- DerivedMesh *dm,
- int useRenderParams,
- int isFinalCalc)
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
+ DerivedMesh *dm,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
int i;
DerivedMesh *result;
- SolidifyModifierData *smd = (SolidifyModifierData*) md;
+ const SolidifyModifierData *smd = (SolidifyModifierData*) md;
MFace *mf, *mface, *orig_mface;
MEdge *ed, *medge, *orig_medge;
MVert *mv, *mvert, *orig_mvert;
- int numVerts = dm->getNumVerts(dm);
- int numEdges = dm->getNumEdges(dm);
- int numFaces = dm->getNumFaces(dm);
+ const int numVerts = dm->getNumVerts(dm);
+ const int numEdges = dm->getNumEdges(dm);
+ const int numFaces = dm->getNumFaces(dm);
/* use for edges */
int *new_vert_arr= NULL;
@@ -221,13 +221,13 @@ static DerivedMesh *applyModifier(ModifierData *md,
float (*vert_nors)[3]= NULL;
- float ofs_orig= - (((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset);
- float ofs_new= smd->offset - (((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset);
+ float const ofs_orig= - (((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset);
+ float const ofs_new= smd->offset - (((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset);
/* weights */
MDeformVert *dvert= NULL, *dv= NULL;
- int defgrp_invert = ((smd->flag & MOD_SOLIDIFY_VGROUP_INV) != 0);
- int defgrp_index= defgroup_name_index(ob, smd->defgrp_name);
+ const int defgrp_invert = ((smd->flag & MOD_SOLIDIFY_VGROUP_INV) != 0);
+ const int defgrp_index= defgroup_name_index(ob, smd->defgrp_name);
if (defgrp_index >= 0)
dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
@@ -322,7 +322,7 @@ static DerivedMesh *applyModifier(ModifierData *md,
dm_calc_normal(dm, vert_nors);
}
- result = CDDM_from_template(dm, numVerts * 2, (numEdges * 2) + newEdges, (numFaces * 2) + newFaces);
+ result = CDDM_from_template(dm, numVerts * 2, (numEdges * 2) + newEdges, (numFaces * 2) + newFaces);
mface = result->getFaceArray(result);
medge = result->getEdgeArray(result);
@@ -630,7 +630,7 @@ static DerivedMesh *applyModifier(ModifierData *md,
static DerivedMesh *applyModifierEM(ModifierData *md,
Object *ob,
- struct EditMesh *editData,
+ struct EditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, 0, 1);
@@ -651,6 +651,7 @@ ModifierTypeInfo modifierType_Solidify = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -661,6 +662,7 @@ ModifierTypeInfo modifierType_Solidify = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_subsurf.c b/source/blender/modifiers/intern/MOD_subsurf.c
index 799df64b2b5..4ba139305d8 100644
--- a/source/blender/modifiers/intern/MOD_subsurf.c
+++ b/source/blender/modifiers/intern/MOD_subsurf.c
@@ -35,6 +35,9 @@
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_scene.h"
#include "BKE_subsurf.h"
@@ -83,9 +86,10 @@ static int isDisabled(ModifierData *md, int useRenderParams)
return get_render_subsurf_level(&md->scene->r, levels) == 0;
}
-static DerivedMesh *applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
+ DerivedMesh *derivedData,
+ int useRenderParams,
+ int isFinalCalc)
{
SubsurfModifierData *smd = (SubsurfModifierData*) md;
DerivedMesh *result;
@@ -102,9 +106,9 @@ static DerivedMesh *applyModifier(
return result;
}
-static DerivedMesh *applyModifierEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
- DerivedMesh *derivedData)
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *UNUSED(ob),
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData)
{
SubsurfModifierData *smd = (SubsurfModifierData*) md;
DerivedMesh *result;
@@ -129,6 +133,7 @@ ModifierTypeInfo modifierType_Subsurf = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -139,6 +144,7 @@ ModifierTypeInfo modifierType_Subsurf = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_surface.c b/source/blender/modifiers/intern/MOD_surface.c
index 223d8e7792f..8d6f6954e18 100644
--- a/source/blender/modifiers/intern/MOD_surface.c
+++ b/source/blender/modifiers/intern/MOD_surface.c
@@ -35,6 +35,8 @@
#include "DNA_meshdata_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
@@ -76,14 +78,17 @@ static void freeData(ModifierData *md)
}
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int UNUSED(numVerts),
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
SurfaceModifierData *surmd = (SurfaceModifierData*) md;
unsigned int numverts = 0, i = 0;
@@ -93,7 +98,7 @@ static void deformVerts(
/* if possible use/create DerivedMesh */
if(derivedData) surmd->dm = CDDM_copy(derivedData);
- else surmd->dm = get_dm(md->scene, ob, NULL, NULL, NULL, 0);
+ else surmd->dm = get_dm(ob, NULL, NULL, NULL, 0);
if(!ob->pd)
{
@@ -168,6 +173,7 @@ ModifierTypeInfo modifierType_Surface = {
/* copyData */ 0,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -178,6 +184,7 @@ ModifierTypeInfo modifierType_Surface = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c
index f4342c56af5..c697dafb6fc 100644
--- a/source/blender/modifiers/intern/MOD_util.c
+++ b/source/blender/modifiers/intern/MOD_util.c
@@ -36,10 +36,12 @@
#include "DNA_object_types.h"
#include "DNA_curve_types.h"
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_mesh.h"
#include "BKE_displist.h"
-#include "BKE_utildefines.h"
+
#include "BKE_modifier.h"
#include "MOD_util.h"
@@ -53,7 +55,8 @@ void get_texture_value(Tex *texture, float *tex_co, TexResult *texres)
{
int result_type;
- result_type = multitex_ext(texture, tex_co, NULL, NULL, 0, texres);
+ /* no node textures for now */
+ result_type = multitex_ext_safe(texture, tex_co, texres);
/* if the texture gave an RGB value, we assume it didn't give a valid
* intensity, so calculate one (formula from do_material_tex).
@@ -84,13 +87,13 @@ void validate_layer_name(const CustomData *data, int type, char *name, char *out
/* if a layer name was given, try to find that layer */
if(name[0])
- index = CustomData_get_named_layer_index(data, CD_MTFACE, name);
+ index = CustomData_get_named_layer_index(data, type, name);
if(index < 0) {
/* either no layer was specified, or the layer we want has been
* deleted, so assign the active layer to name
*/
- index = CustomData_get_active_layer_index(data, CD_MTFACE);
+ index = CustomData_get_active_layer_index(data, type);
strcpy(outname, data->layers[index].name);
}
else
@@ -98,13 +101,13 @@ void validate_layer_name(const CustomData *data, int type, char *name, char *out
}
/* returns a cdderivedmesh if dm == NULL or is another type of derivedmesh */
-DerivedMesh *get_cddm(struct Scene *scene, Object *ob, struct EditMesh *em, DerivedMesh *dm, float (*vertexCos)[3])
+DerivedMesh *get_cddm(Object *ob, struct EditMesh *em, DerivedMesh *dm, float (*vertexCos)[3])
{
if(dm && dm->type == DM_TYPE_CDDM)
return dm;
if(!dm) {
- dm= get_dm(scene, ob, em, dm, vertexCos, 0);
+ dm= get_dm(ob, em, dm, vertexCos, 0);
}
else {
dm= CDDM_copy(dm);
@@ -118,7 +121,7 @@ DerivedMesh *get_cddm(struct Scene *scene, Object *ob, struct EditMesh *em, Deri
}
/* returns a derived mesh if dm == NULL, for deforming modifiers that need it */
-DerivedMesh *get_dm(struct Scene *scene, Object *ob, struct EditMesh *em, DerivedMesh *dm, float (*vertexCos)[3], int orco)
+DerivedMesh *get_dm(Object *ob, struct EditMesh *em, DerivedMesh *dm, float (*vertexCos)[3], int orco)
{
if(dm)
return dm;
@@ -143,7 +146,7 @@ DerivedMesh *get_dm(struct Scene *scene, Object *ob, struct EditMesh *em, Derive
}
/* only called by BKE_modifier.h/modifier.c */
-void modifier_type_init(ModifierTypeInfo *types[], ModifierType type)
+void modifier_type_init(ModifierTypeInfo *types[])
{
memset(types, 0, sizeof(types));
#define INIT_TYPE(typeName) (types[eModifierType_##typeName] = &modifierType_##typeName)
diff --git a/source/blender/modifiers/intern/MOD_util.h b/source/blender/modifiers/intern/MOD_util.h
index 5750e042199..0ba35ad23e6 100644
--- a/source/blender/modifiers/intern/MOD_util.h
+++ b/source/blender/modifiers/intern/MOD_util.h
@@ -40,9 +40,7 @@ struct ModifierData;
void get_texture_value(struct Tex *texture, float *tex_co, struct TexResult *texres);
void modifier_vgroup_cache(struct ModifierData *md, float (*vertexCos)[3]);
void validate_layer_name(const struct CustomData *data, int type, char *name, char *outname);
-struct DerivedMesh *get_cddm(struct Scene *scene, struct Object *ob, struct EditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3]);
-struct DerivedMesh *get_dm(struct Scene *scene, struct Object *ob, struct EditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3], int orco);
-
-void modifier_type_init(struct ModifierTypeInfo *types[], ModifierType type);
+struct DerivedMesh *get_cddm(struct Object *ob, struct EditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3]);
+struct DerivedMesh *get_dm(struct Object *ob, struct EditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3], int orco);
#endif /* MOD_UTIL_H */
diff --git a/source/blender/modifiers/intern/MOD_uvproject.c b/source/blender/modifiers/intern/MOD_uvproject.c
index 1a595cbf051..8eaf0d5fbcb 100644
--- a/source/blender/modifiers/intern/MOD_uvproject.c
+++ b/source/blender/modifiers/intern/MOD_uvproject.c
@@ -38,6 +38,8 @@
#include "BLI_math.h"
#include "BLI_uvproject.h"
+#include "BLI_utildefines.h"
+
#include "BKE_DerivedMesh.h"
@@ -78,12 +80,12 @@ static void copyData(ModifierData *md, ModifierData *target)
tumd->scaley = umd->scaley;
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md))
{
CustomDataMask dataMask = 0;
/* ask for UV coordinates */
- dataMask |= (1 << CD_MTFACE);
+ dataMask |= CD_MASK_MTFACE;
return dataMask;
}
@@ -109,8 +111,10 @@ static void foreachIDLink(ModifierData *md, Object *ob,
userData);
}
-static void updateDepgraph(ModifierData *md,
- DagForest *forest, struct Scene *scene, Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
UVProjectModifierData *umd = (UVProjectModifierData*) md;
int i;
@@ -376,9 +380,10 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
return dm;
}
-static DerivedMesh *applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *result;
UVProjectModifierData *umd = (UVProjectModifierData*) md;
@@ -388,9 +393,9 @@ static DerivedMesh *applyModifier(
return result;
}
-static DerivedMesh *applyModifierEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
- DerivedMesh *derivedData)
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, 0, 1);
}
@@ -408,6 +413,7 @@ ModifierTypeInfo modifierType_UVProject = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -418,6 +424,7 @@ ModifierTypeInfo modifierType_UVProject = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ foreachIDLink,
};
diff --git a/source/blender/modifiers/intern/MOD_wave.c b/source/blender/modifiers/intern/MOD_wave.c
index 191c702903a..dae9fc471cd 100644
--- a/source/blender/modifiers/intern/MOD_wave.c
+++ b/source/blender/modifiers/intern/MOD_wave.c
@@ -36,6 +36,9 @@
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_DerivedMesh.h"
#include "BKE_object.h"
#include "BKE_deform.h"
@@ -93,7 +96,7 @@ static void copyData(ModifierData *md, ModifierData *target)
strncpy(twmd->defgrp_name, wmd->defgrp_name, 32);
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
@@ -118,9 +121,10 @@ static void foreachIDLink(ModifierData *md, Object *ob,
foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData);
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest, Scene *scene, Object *ob,
- DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
WaveModifierData *wmd = (WaveModifierData*) md;
@@ -139,7 +143,7 @@ static void updateDepgraph(
}
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
WaveModifierData *wmd = (WaveModifierData *)md;
CustomDataMask dataMask = 0;
@@ -147,11 +151,11 @@ static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
/* ask for UV coordinates if we need them */
if(wmd->texture && wmd->texmapping == MOD_WAV_MAP_UV)
- dataMask |= (1 << CD_MTFACE);
+ dataMask |= CD_MASK_MTFACE;
/* ask for vertexgroups if we need them */
if(wmd->defgrp_name[0])
- dataMask |= (1 << CD_MDEFORMVERT);
+ dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
@@ -399,17 +403,20 @@ static void waveModifier_do(WaveModifierData *md,
if(wmd->texture) MEM_freeN(tex_co);
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm= derivedData;
WaveModifierData *wmd = (WaveModifierData *)md;
if(wmd->flag & MOD_WAVE_NORM)
- dm= get_cddm(md->scene, ob, NULL, dm, vertexCos);
+ dm= get_cddm(ob, NULL, dm, vertexCos);
else if(wmd->texture || wmd->defgrp_name[0])
- dm= get_dm(md->scene, ob, NULL, dm, NULL, 0);
+ dm= get_dm(ob, NULL, dm, NULL, 0);
waveModifier_do(wmd, md->scene, ob, dm, vertexCos, numVerts);
@@ -425,9 +432,9 @@ static void deformVertsEM(
WaveModifierData *wmd = (WaveModifierData *)md;
if(wmd->flag & MOD_WAVE_NORM)
- dm= get_cddm(md->scene, ob, editData, dm, vertexCos);
+ dm= get_cddm(ob, editData, dm, vertexCos);
else if(wmd->texture || wmd->defgrp_name[0])
- dm= get_dm(md->scene, ob, editData, dm, NULL, 0);
+ dm= get_dm(ob, editData, dm, NULL, 0);
waveModifier_do(wmd, md->scene, ob, dm, vertexCos, numVerts);
@@ -445,6 +452,7 @@ ModifierTypeInfo modifierType_Wave = {
| eModifierTypeFlag_SupportsEditmode,
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -455,6 +463,7 @@ ModifierTypeInfo modifierType_Wave = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ foreachIDLink,
};
diff --git a/source/blender/modifiers/intern/Makefile b/source/blender/modifiers/intern/Makefile
deleted file mode 100644
index 94ea068a1bc..00000000000
--- a/source/blender/modifiers/intern/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = modifiers
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I..
-
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenkernel/intern
-CPPFLAGS += -I../../render/extern/include
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-CPPFLAGS += -I$(NAN_DECIMATION)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-CPPFLAGS += -I$(NAN_OPENNL)/include
-CPPFLAGS += -I$(NAN_BSP)/include
-# CPPFLAGS += -I$(NAN_SMOKE)/include
-
-
diff --git a/source/blender/nodes/CMP_node.h b/source/blender/nodes/CMP_node.h
index c2bc4d026ef..4cbb5599797 100644
--- a/source/blender/nodes/CMP_node.h
+++ b/source/blender/nodes/CMP_node.h
@@ -3,21 +3,21 @@
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
- * This program is free software; you can redistribute it and/or
+ * This program is free software(ListBase *lb); 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
+ * as published by the Free Software Foundation(ListBase *lb); either version 2
* of the License, or (at your option) any later version. The Blender
* Foundation also sells licenses for use in proprietary software under
* the Blender License. See http://www.blender.org/BL/ for information
* about this.
*
* This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * but WITHOUT ANY WARRANTY(ListBase *lb); 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,
+ * along with this program(ListBase *lb); if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2005 Blender Foundation.
@@ -38,76 +38,76 @@
/* ****************** types array for all composite nodes ****************** */
-extern bNodeType cmp_node_rlayers;
-extern bNodeType cmp_node_image;
-extern bNodeType cmp_node_texture;
-extern bNodeType cmp_node_value;
-extern bNodeType cmp_node_rgb;
-extern bNodeType cmp_node_curve_time;
+void register_node_type_cmp_rlayers(ListBase *lb);
+void register_node_type_cmp_image(ListBase *lb);
+void register_node_type_cmp_texture(ListBase *lb);
+void register_node_type_cmp_value(ListBase *lb);
+void register_node_type_cmp_rgb(ListBase *lb);
+void register_node_type_cmp_curve_time(ListBase *lb);
-extern bNodeType cmp_node_composite;
-extern bNodeType cmp_node_viewer;
-extern bNodeType cmp_node_splitviewer;
-extern bNodeType cmp_node_output_file;
-extern bNodeType cmp_node_view_levels;
+void register_node_type_cmp_composite(ListBase *lb);
+void register_node_type_cmp_viewer(ListBase *lb);
+void register_node_type_cmp_splitviewer(ListBase *lb);
+void register_node_type_cmp_output_file(ListBase *lb);
+void register_node_type_cmp_view_levels(ListBase *lb);
-extern bNodeType cmp_node_curve_rgb;
-extern bNodeType cmp_node_mix_rgb;
-extern bNodeType cmp_node_hue_sat;
-extern bNodeType cmp_node_brightcontrast;
-extern bNodeType cmp_node_gamma;
-extern bNodeType cmp_node_invert;
-extern bNodeType cmp_node_alphaover;
-extern bNodeType cmp_node_zcombine;
-extern bNodeType cmp_node_colorbalance;
-extern bNodeType cmp_node_huecorrect;
+void register_node_type_cmp_curve_rgb(ListBase *lb);
+void register_node_type_cmp_mix_rgb(ListBase *lb);
+void register_node_type_cmp_hue_sat(ListBase *lb);
+void register_node_type_cmp_brightcontrast(ListBase *lb);
+void register_node_type_cmp_gamma(ListBase *lb);
+void register_node_type_cmp_invert(ListBase *lb);
+void register_node_type_cmp_alphaover(ListBase *lb);
+void register_node_type_cmp_zcombine(ListBase *lb);
+void register_node_type_cmp_colorbalance(ListBase *lb);
+void register_node_type_cmp_huecorrect(ListBase *lb);
-extern bNodeType cmp_node_normal;
-extern bNodeType cmp_node_curve_vec;
-extern bNodeType cmp_node_map_value;
-extern bNodeType cmp_node_normalize;
+void register_node_type_cmp_normal(ListBase *lb);
+void register_node_type_cmp_curve_vec(ListBase *lb);
+void register_node_type_cmp_map_value(ListBase *lb);
+void register_node_type_cmp_normalize(ListBase *lb);
-extern bNodeType cmp_node_filter;
-extern bNodeType cmp_node_blur;
-extern bNodeType cmp_node_dblur;
-extern bNodeType cmp_node_bilateralblur;
-extern bNodeType cmp_node_vecblur;
-extern bNodeType cmp_node_dilateerode;
-extern bNodeType cmp_node_defocus;
+void register_node_type_cmp_filter(ListBase *lb);
+void register_node_type_cmp_blur(ListBase *lb);
+void register_node_type_cmp_dblur(ListBase *lb);
+void register_node_type_cmp_bilateralblur(ListBase *lb);
+void register_node_type_cmp_vecblur(ListBase *lb);
+void register_node_type_cmp_dilateerode(ListBase *lb);
+void register_node_type_cmp_defocus(ListBase *lb);
-extern bNodeType cmp_node_valtorgb;
-extern bNodeType cmp_node_rgbtobw;
-extern bNodeType cmp_node_setalpha;
-extern bNodeType cmp_node_idmask;
-extern bNodeType cmp_node_math;
-extern bNodeType cmp_node_seprgba;
-extern bNodeType cmp_node_combrgba;
-extern bNodeType cmp_node_sephsva;
-extern bNodeType cmp_node_combhsva;
-extern bNodeType cmp_node_sepyuva;
-extern bNodeType cmp_node_combyuva;
-extern bNodeType cmp_node_sepycca;
-extern bNodeType cmp_node_combycca;
-extern bNodeType cmp_node_premulkey;
+void register_node_type_cmp_valtorgb(ListBase *lb);
+void register_node_type_cmp_rgbtobw(ListBase *lb);
+void register_node_type_cmp_setalpha(ListBase *lb);
+void register_node_type_cmp_idmask(ListBase *lb);
+void register_node_type_cmp_math(ListBase *lb);
+void register_node_type_cmp_seprgba(ListBase *lb);
+void register_node_type_cmp_combrgba(ListBase *lb);
+void register_node_type_cmp_sephsva(ListBase *lb);
+void register_node_type_cmp_combhsva(ListBase *lb);
+void register_node_type_cmp_sepyuva(ListBase *lb);
+void register_node_type_cmp_combyuva(ListBase *lb);
+void register_node_type_cmp_sepycca(ListBase *lb);
+void register_node_type_cmp_combycca(ListBase *lb);
+void register_node_type_cmp_premulkey(ListBase *lb);
-extern bNodeType cmp_node_diff_matte;
-extern bNodeType cmp_node_distance_matte;
-extern bNodeType cmp_node_chroma_matte;
-extern bNodeType cmp_node_color_matte;
-extern bNodeType cmp_node_channel_matte;
-extern bNodeType cmp_node_color_spill;
-extern bNodeType cmp_node_luma_matte;
+void register_node_type_cmp_diff_matte(ListBase *lb);
+void register_node_type_cmp_distance_matte(ListBase *lb);
+void register_node_type_cmp_chroma_matte(ListBase *lb);
+void register_node_type_cmp_color_matte(ListBase *lb);
+void register_node_type_cmp_channel_matte(ListBase *lb);
+void register_node_type_cmp_color_spill(ListBase *lb);
+void register_node_type_cmp_luma_matte(ListBase *lb);
-extern bNodeType cmp_node_translate;
-extern bNodeType cmp_node_rotate;
-extern bNodeType cmp_node_scale;
-extern bNodeType cmp_node_flip;
-extern bNodeType cmp_node_crop;
-extern bNodeType cmp_node_displace;
-extern bNodeType cmp_node_mapuv;
+void register_node_type_cmp_translate(ListBase *lb);
+void register_node_type_cmp_rotate(ListBase *lb);
+void register_node_type_cmp_scale(ListBase *lb);
+void register_node_type_cmp_flip(ListBase *lb);
+void register_node_type_cmp_crop(ListBase *lb);
+void register_node_type_cmp_displace(ListBase *lb);
+void register_node_type_cmp_mapuv(ListBase *lb);
-extern bNodeType cmp_node_glare;
-extern bNodeType cmp_node_tonemap;
-extern bNodeType cmp_node_lensdist;
+void register_node_type_cmp_glare(ListBase *lb);
+void register_node_type_cmp_tonemap(ListBase *lb);
+void register_node_type_cmp_lensdist(ListBase *lb);
#endif
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index 8d8423cc19b..09a627b51d4 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -23,9 +23,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c intern/CMP_nodes/*.c intern/SHD_nodes/*.c intern/TEX_nodes/*.c)
-
-SET(INC
+set(INC
.
../blenkernel
../blenlib
@@ -39,15 +37,121 @@ SET(INC
../../../extern/glew/include
)
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ intern/CMP_nodes/CMP_alphaOver.c
+ intern/CMP_nodes/CMP_bilateralblur.c
+ intern/CMP_nodes/CMP_blur.c
+ intern/CMP_nodes/CMP_brightness.c
+ intern/CMP_nodes/CMP_channelMatte.c
+ intern/CMP_nodes/CMP_chromaMatte.c
+ intern/CMP_nodes/CMP_colorMatte.c
+ intern/CMP_nodes/CMP_colorSpill.c
+ intern/CMP_nodes/CMP_colorbalance.c
+ intern/CMP_nodes/CMP_composite.c
+ intern/CMP_nodes/CMP_crop.c
+ intern/CMP_nodes/CMP_curves.c
+ intern/CMP_nodes/CMP_defocus.c
+ intern/CMP_nodes/CMP_diffMatte.c
+ intern/CMP_nodes/CMP_dilate.c
+ intern/CMP_nodes/CMP_directionalblur.c
+ intern/CMP_nodes/CMP_displace.c
+ intern/CMP_nodes/CMP_distanceMatte.c
+ intern/CMP_nodes/CMP_filter.c
+ intern/CMP_nodes/CMP_flip.c
+ intern/CMP_nodes/CMP_gamma.c
+ intern/CMP_nodes/CMP_glare.c
+ intern/CMP_nodes/CMP_hueSatVal.c
+ intern/CMP_nodes/CMP_huecorrect.c
+ intern/CMP_nodes/CMP_idMask.c
+ intern/CMP_nodes/CMP_image.c
+ intern/CMP_nodes/CMP_invert.c
+ intern/CMP_nodes/CMP_lensdist.c
+ intern/CMP_nodes/CMP_levels.c
+ intern/CMP_nodes/CMP_lummaMatte.c
+ intern/CMP_nodes/CMP_mapUV.c
+ intern/CMP_nodes/CMP_mapValue.c
+ intern/CMP_nodes/CMP_math.c
+ intern/CMP_nodes/CMP_mixrgb.c
+ intern/CMP_nodes/CMP_normal.c
+ intern/CMP_nodes/CMP_normalize.c
+ intern/CMP_nodes/CMP_outputFile.c
+ intern/CMP_nodes/CMP_premulkey.c
+ intern/CMP_nodes/CMP_rgb.c
+ intern/CMP_nodes/CMP_rotate.c
+ intern/CMP_nodes/CMP_scale.c
+ intern/CMP_nodes/CMP_sepcombHSVA.c
+ intern/CMP_nodes/CMP_sepcombRGBA.c
+ intern/CMP_nodes/CMP_sepcombYCCA.c
+ intern/CMP_nodes/CMP_sepcombYUVA.c
+ intern/CMP_nodes/CMP_setalpha.c
+ intern/CMP_nodes/CMP_splitViewer.c
+ intern/CMP_nodes/CMP_texture.c
+ intern/CMP_nodes/CMP_tonemap.c
+ intern/CMP_nodes/CMP_translate.c
+ intern/CMP_nodes/CMP_valToRgb.c
+ intern/CMP_nodes/CMP_value.c
+ intern/CMP_nodes/CMP_vecBlur.c
+ intern/CMP_nodes/CMP_viewer.c
+ intern/CMP_nodes/CMP_zcombine.c
+ intern/CMP_util.c
+ intern/SHD_nodes/SHD_camera.c
+ intern/SHD_nodes/SHD_curves.c
+ intern/SHD_nodes/SHD_dynamic.c
+ intern/SHD_nodes/SHD_geom.c
+ intern/SHD_nodes/SHD_hueSatVal.c
+ intern/SHD_nodes/SHD_invert.c
+ intern/SHD_nodes/SHD_mapping.c
+ intern/SHD_nodes/SHD_material.c
+ intern/SHD_nodes/SHD_math.c
+ intern/SHD_nodes/SHD_mixRgb.c
+ intern/SHD_nodes/SHD_normal.c
+ intern/SHD_nodes/SHD_output.c
+ intern/SHD_nodes/SHD_rgb.c
+ intern/SHD_nodes/SHD_sepcombRGB.c
+ intern/SHD_nodes/SHD_squeeze.c
+ intern/SHD_nodes/SHD_texture.c
+ intern/SHD_nodes/SHD_valToRgb.c
+ intern/SHD_nodes/SHD_value.c
+ intern/SHD_nodes/SHD_vectMath.c
+ intern/SHD_util.c
+ intern/TEX_nodes/TEX_at.c
+ intern/TEX_nodes/TEX_bricks.c
+ intern/TEX_nodes/TEX_checker.c
+ intern/TEX_nodes/TEX_compose.c
+ intern/TEX_nodes/TEX_coord.c
+ intern/TEX_nodes/TEX_curves.c
+ intern/TEX_nodes/TEX_decompose.c
+ intern/TEX_nodes/TEX_distance.c
+ intern/TEX_nodes/TEX_hueSatVal.c
+ intern/TEX_nodes/TEX_image.c
+ intern/TEX_nodes/TEX_invert.c
+ intern/TEX_nodes/TEX_math.c
+ intern/TEX_nodes/TEX_mixRgb.c
+ intern/TEX_nodes/TEX_output.c
+ intern/TEX_nodes/TEX_proc.c
+ intern/TEX_nodes/TEX_rotate.c
+ intern/TEX_nodes/TEX_scale.c
+ intern/TEX_nodes/TEX_texture.c
+ intern/TEX_nodes/TEX_translate.c
+ intern/TEX_nodes/TEX_valToNor.c
+ intern/TEX_nodes/TEX_valToRgb.c
+ intern/TEX_nodes/TEX_viewer.c
+ intern/TEX_util.c
+ intern/node_util.c
+
+ CMP_node.h
+ SHD_node.h
+ TEX_node.h
+ intern/CMP_util.h
+ intern/SHD_util.h
+ intern/TEX_util.h
+ intern/node_util.h
+)
-IF(WITH_PYTHON)
- SET(INC ${INC} ../python ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_PYTHON)
+ set(INC ${INC} ../python ${PYTHON_INCLUDE_DIRS})
+ add_definitions(-DWITH_PYTHON)
+endif()
-BLENDERLIB(bf_nodes "${SRC}" "${INC}")
+blender_add_lib(bf_nodes "${SRC}" "${INC}")
diff --git a/source/blender/nodes/Makefile b/source/blender/nodes/Makefile
deleted file mode 100644
index f997e640a17..00000000000
--- a/source/blender/nodes/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) Blender Foundation.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/nodes
-DIRS = intern intern/CMP_nodes intern/SHD_nodes intern/TEX_nodes
-
-include nan_subdirs.mk
diff --git a/source/blender/nodes/SConscript b/source/blender/nodes/SConscript
index 3e7e0dbe54c..4bed612144c 100644
--- a/source/blender/nodes/SConscript
+++ b/source/blender/nodes/SConscript
@@ -22,10 +22,9 @@ defs = []
if env['WITH_BF_PYTHON']:
incs += ' ' + env['BF_PYTHON_INC']
incs += ' ../python'
+ defs.append('WITH_PYTHON')
if env['BF_DEBUG']:
defs.append('_DEBUG')
-else:
- defs.append('DISABLE_PYTHON')
if env['OURPLATFORM'] == 'linux2':
cflags='-pthread'
diff --git a/source/blender/nodes/SHD_node.h b/source/blender/nodes/SHD_node.h
index 80cd0c2e73c..20a7aa083ec 100644
--- a/source/blender/nodes/SHD_node.h
+++ b/source/blender/nodes/SHD_node.h
@@ -39,29 +39,29 @@
/* the type definitions array */
/* ****************** types array for all shaders ****************** */
-extern bNodeType sh_node_output;
-extern bNodeType sh_node_material;
-extern bNodeType sh_node_camera;
-extern bNodeType sh_node_value;
-extern bNodeType sh_node_rgb;
-extern bNodeType sh_node_mix_rgb;
-extern bNodeType sh_node_valtorgb;
-extern bNodeType sh_node_rgbtobw;
-extern bNodeType sh_node_texture;
-extern bNodeType sh_node_normal;
-extern bNodeType sh_node_geom;
-extern bNodeType sh_node_mapping;
-extern bNodeType sh_node_curve_vec;
-extern bNodeType sh_node_curve_rgb;
-extern bNodeType sh_node_math;
-extern bNodeType sh_node_vect_math;
-extern bNodeType sh_node_squeeze;
-extern bNodeType node_dynamic_typeinfo;
-extern bNodeType sh_node_material_ext;
-extern bNodeType sh_node_invert;
-extern bNodeType sh_node_seprgb;
-extern bNodeType sh_node_combrgb;
-extern bNodeType sh_node_hue_sat;
+void register_node_type_sh_output(ListBase *lb);
+void register_node_type_sh_material(ListBase *lb);
+void register_node_type_sh_camera(ListBase *lb);
+void register_node_type_sh_value(ListBase *lb);
+void register_node_type_sh_rgb(ListBase *lb);
+void register_node_type_sh_mix_rgb(ListBase *lb);
+void register_node_type_sh_valtorgb(ListBase *lb);
+void register_node_type_sh_rgbtobw(ListBase *lb);
+void register_node_type_sh_texture(ListBase *lb);
+void register_node_type_sh_normal(ListBase *lb);
+void register_node_type_sh_geom(ListBase *lb);
+void register_node_type_sh_mapping(ListBase *lb);
+void register_node_type_sh_curve_vec(ListBase *lb);
+void register_node_type_sh_curve_rgb(ListBase *lb);
+void register_node_type_sh_math(ListBase *lb);
+void register_node_type_sh_vect_math(ListBase *lb);
+void register_node_type_sh_squeeze(ListBase *lb);
+void register_node_type_sh_dynamic(ListBase *lb);
+void register_node_type_sh_material_ext(ListBase *lb);
+void register_node_type_sh_invert(ListBase *lb);
+void register_node_type_sh_seprgb(ListBase *lb);
+void register_node_type_sh_combrgb(ListBase *lb);
+void register_node_type_sh_hue_sat(ListBase *lb);
#endif
diff --git a/source/blender/nodes/TEX_node.h b/source/blender/nodes/TEX_node.h
index 1bbca09ac8f..b741c654b15 100644
--- a/source/blender/nodes/TEX_node.h
+++ b/source/blender/nodes/TEX_node.h
@@ -38,41 +38,41 @@
/* ****************** types array for all texture nodes ****************** */
-extern bNodeType tex_node_math;
-extern bNodeType tex_node_mix_rgb;
-extern bNodeType tex_node_valtorgb;
-extern bNodeType tex_node_valtonor;
-extern bNodeType tex_node_rgbtobw;
-extern bNodeType tex_node_output;
-extern bNodeType tex_node_viewer;
-extern bNodeType tex_node_checker;
-extern bNodeType tex_node_texture;
-extern bNodeType tex_node_bricks;
-extern bNodeType tex_node_image;
-extern bNodeType tex_node_curve_rgb;
-extern bNodeType tex_node_curve_time;
-extern bNodeType tex_node_invert;
-extern bNodeType tex_node_hue_sat;
-extern bNodeType tex_node_coord;
-extern bNodeType tex_node_distance;
+void register_node_type_tex_math(ListBase *lb);
+void register_node_type_tex_mix_rgb(ListBase *lb);
+void register_node_type_tex_valtorgb(ListBase *lb);
+void register_node_type_tex_valtonor(ListBase *lb);
+void register_node_type_tex_rgbtobw(ListBase *lb);
+void register_node_type_tex_output(ListBase *lb);
+void register_node_type_tex_viewer(ListBase *lb);
+void register_node_type_tex_checker(ListBase *lb);
+void register_node_type_tex_texture(ListBase *lb);
+void register_node_type_tex_bricks(ListBase *lb);
+void register_node_type_tex_image(ListBase *lb);
+void register_node_type_tex_curve_rgb(ListBase *lb);
+void register_node_type_tex_curve_time(ListBase *lb);
+void register_node_type_tex_invert(ListBase *lb);
+void register_node_type_tex_hue_sat(ListBase *lb);
+void register_node_type_tex_coord(ListBase *lb);
+void register_node_type_tex_distance(ListBase *lb);
-extern bNodeType tex_node_rotate;
-extern bNodeType tex_node_translate;
-extern bNodeType tex_node_scale;
-extern bNodeType tex_node_at;
+void register_node_type_tex_rotate(ListBase *lb);
+void register_node_type_tex_translate(ListBase *lb);
+void register_node_type_tex_scale(ListBase *lb);
+void register_node_type_tex_at(ListBase *lb);
-extern bNodeType tex_node_compose;
-extern bNodeType tex_node_decompose;
+void register_node_type_tex_compose(ListBase *lb);
+void register_node_type_tex_decompose(ListBase *lb);
-extern bNodeType tex_node_proc_voronoi;
-extern bNodeType tex_node_proc_blend;
-extern bNodeType tex_node_proc_magic;
-extern bNodeType tex_node_proc_marble;
-extern bNodeType tex_node_proc_clouds;
-extern bNodeType tex_node_proc_wood;
-extern bNodeType tex_node_proc_musgrave;
-extern bNodeType tex_node_proc_noise;
-extern bNodeType tex_node_proc_stucci;
-extern bNodeType tex_node_proc_distnoise;
+void register_node_type_tex_proc_voronoi(ListBase *lb);
+void register_node_type_tex_proc_blend(ListBase *lb);
+void register_node_type_tex_proc_magic(ListBase *lb);
+void register_node_type_tex_proc_marble(ListBase *lb);
+void register_node_type_tex_proc_clouds(ListBase *lb);
+void register_node_type_tex_proc_wood(ListBase *lb);
+void register_node_type_tex_proc_musgrave(ListBase *lb);
+void register_node_type_tex_proc_noise(ListBase *lb);
+void register_node_type_tex_proc_stucci(ListBase *lb);
+void register_node_type_tex_proc_distnoise(ListBase *lb);
#endif
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c b/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c
index 37061dd7eae..e8cfc8533d1 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c
@@ -41,7 +41,7 @@ static bNodeSocketType cmp_node_alphaover_out[]= {
{ -1, 0, "" }
};
-static void do_alphaover_premul(bNode *node, float *out, float *src, float *over, float *fac)
+static void do_alphaover_premul(bNode *UNUSED(node), float *out, float *src, float *over, float *fac)
{
if(over[3]<=0.0f) {
@@ -61,7 +61,7 @@ static void do_alphaover_premul(bNode *node, float *out, float *src, float *over
}
/* result will be still premul, but the over part is premulled */
-static void do_alphaover_key(bNode *node, float *out, float *src, float *over, float *fac)
+static void do_alphaover_key(bNode *UNUSED(node), float *out, float *src, float *over, float *fac)
{
if(over[3]<=0.0f) {
@@ -107,7 +107,7 @@ static void do_alphaover_mixed(bNode *node, float *out, float *src, float *over,
-static void node_composit_exec_alphaover(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_alphaover(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: col col */
/* stack order out: col */
@@ -140,22 +140,19 @@ static void node_alphaover_init(bNode* node)
node->storage= MEM_callocN(sizeof(NodeTwoFloats), "NodeTwoFloats");
}
-bNodeType cmp_node_alphaover= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_ALPHAOVER,
- /* name */ "AlphaOver",
- /* width+range */ 80, 40, 120,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_alphaover_in,
- /* output sock */ cmp_node_alphaover_out,
- /* storage */ "NodeTwoFloats",
- /* execfunc */ node_composit_exec_alphaover,
- /* butfunc */ NULL,
- /* initfunc */ node_alphaover_init,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-
-};
+void register_node_type_cmp_alphaover(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_ALPHAOVER, "AlphaOver", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_alphaover_in, cmp_node_alphaover_out);
+ node_type_size(&ntype, 80, 40, 120);
+ node_type_init(&ntype, node_alphaover_init);
+ node_type_storage(&ntype, "NodeTwoFloats", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_alphaover);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c b/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
index 97577fa6b5e..efa044158a2 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
@@ -81,7 +81,7 @@ static bNodeSocketType cmp_node_bilateralblur_out[]= {
/* code of this node was heavily inspired by the smooth function of opencv library.
The main change is an optional image input */
-static void node_composit_exec_bilateralblur(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_bilateralblur(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
NodeBilateralBlurData *nbbd= node->storage;
CompBuf *new, *source, *img= in[0]->data , *refimg= in[1]->data;
@@ -250,20 +250,17 @@ static void node_composit_init_bilateralblur(bNode* node)
nbbd->sigma_space= 5.0;
}
-bNodeType cmp_node_bilateralblur= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_BILATERALBLUR,
- /* name */ "Bilateral Blur",
- /* width+range */ 150, 120, 200,
- /* class+opts */ NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- /* input sock */ cmp_node_bilateralblur_in,
- /* output sock */ cmp_node_bilateralblur_out,
- /* storage */ "NodeBilateralBlurData",
- /* execfunc */ node_composit_exec_bilateralblur,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_bilateralblur,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-
-};
+void register_node_type_cmp_bilateralblur(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_BILATERALBLUR, "Bilateral Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
+ cmp_node_bilateralblur_in, cmp_node_bilateralblur_out);
+ node_type_size(&ntype, 150, 120, 200);
+ node_type_init(&ntype, node_composit_init_bilateralblur);
+ node_type_storage(&ntype, "NodeBilateralBlurData", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_bilateralblur);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c b/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
index eb8b079f341..75aca3e0428 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
@@ -93,109 +93,119 @@ static void blur_single_image(bNode *node, CompBuf *new, CompBuf *img, float sca
int x, y, pix= img->type;
int i, bigstep;
float *src, *dest;
-
+
/* helper image */
work= alloc_compbuf(imgx, imgy, img->type, 1); /* allocs */
-
- /* horizontal */
- rad = scale*(float)nbd->sizex;
- if(rad>imgx/2)
- rad= imgx/2;
- else if(rad<1)
- rad= 1;
- gausstab= make_gausstab(nbd->filtertype, rad);
- gausstabcent= gausstab+rad;
-
- for (y = 0; y < imgy; y++) {
- float *srcd= img->rect + pix*(y*img->x);
+ /* horizontal */
+ if(nbd->sizex == 0) {
+ memcpy(work->rect, img->rect, sizeof(float) * img->type * imgx * imgy);
+ }
+ else {
+ rad = scale*(float)nbd->sizex;
+ if(rad>imgx/2)
+ rad= imgx/2;
+ else if(rad<1)
+ rad= 1;
- dest = work->rect + pix*(y * img->x);
+ gausstab= make_gausstab(nbd->filtertype, rad);
+ gausstabcent= gausstab+rad;
- for (x = 0; x < imgx ; x++) {
- int minr= x-rad<0?-x:-rad;
- int maxr= x+rad>imgx?imgx-x:rad;
+ for (y = 0; y < imgy; y++) {
+ float *srcd= img->rect + pix*(y*img->x);
- src= srcd + pix*(x+minr);
+ dest = work->rect + pix*(y * img->x);
- sum= gval = rval= bval= aval= 0.0f;
- for (i= minr; i < maxr; i++) {
- val= gausstabcent[i];
- sum+= val;
- rval += val * (*src++);
+ for (x = 0; x < imgx ; x++) {
+ int minr= x-rad<0?-x:-rad;
+ int maxr= x+rad>imgx?imgx-x:rad;
+
+ src= srcd + pix*(x+minr);
+
+ sum= gval = rval= bval= aval= 0.0f;
+ for (i= minr; i < maxr; i++) {
+ val= gausstabcent[i];
+ sum+= val;
+ rval += val * (*src++);
+ if(pix==4) {
+ gval += val * (*src++);
+ bval += val * (*src++);
+ aval += val * (*src++);
+ }
+ }
+ sum= 1.0f/sum;
+ *dest++ = rval*sum;
if(pix==4) {
- gval += val * (*src++);
- bval += val * (*src++);
- aval += val * (*src++);
+ *dest++ = gval*sum;
+ *dest++ = bval*sum;
+ *dest++ = aval*sum;
}
}
- sum= 1.0f/sum;
- *dest++ = rval*sum;
- if(pix==4) {
- *dest++ = gval*sum;
- *dest++ = bval*sum;
- *dest++ = aval*sum;
- }
+ if(node->exec & NODE_BREAK)
+ break;
}
- if(node->exec & NODE_BREAK)
- break;
+
+ /* vertical */
+ MEM_freeN(gausstab);
}
- /* vertical */
- MEM_freeN(gausstab);
-
- rad = scale*(float)nbd->sizey;
- if(rad>imgy/2)
- rad= imgy/2;
- else if(rad<1)
- rad= 1;
-
- gausstab= make_gausstab(nbd->filtertype, rad);
- gausstabcent= gausstab+rad;
-
- bigstep = pix*imgx;
- for (x = 0; x < imgx; x++) {
- float *srcd= work->rect + pix*x;
-
- dest = new->rect + pix*x;
+ if(nbd->sizey == 0) {
+ memcpy(new->rect, work->rect, sizeof(float) * img->type * imgx * imgy);
+ }
+ else {
+ rad = scale*(float)nbd->sizey;
+ if(rad>imgy/2)
+ rad= imgy/2;
+ else if(rad<1)
+ rad= 1;
+
+ gausstab= make_gausstab(nbd->filtertype, rad);
+ gausstabcent= gausstab+rad;
- for (y = 0; y < imgy ; y++) {
- int minr= y-rad<0?-y:-rad;
- int maxr= y+rad>imgy?imgy-y:rad;
+ bigstep = pix*imgx;
+ for (x = 0; x < imgx; x++) {
+ float *srcd= work->rect + pix*x;
- src= srcd + bigstep*(y+minr);
+ dest = new->rect + pix*x;
- sum= gval = rval= bval= aval= 0.0f;
- for (i= minr; i < maxr; i++) {
- val= gausstabcent[i];
- sum+= val;
- rval += val * src[0];
+ for (y = 0; y < imgy ; y++) {
+ int minr= y-rad<0?-y:-rad;
+ int maxr= y+rad>imgy?imgy-y:rad;
+
+ src= srcd + bigstep*(y+minr);
+
+ sum= gval = rval= bval= aval= 0.0f;
+ for (i= minr; i < maxr; i++) {
+ val= gausstabcent[i];
+ sum+= val;
+ rval += val * src[0];
+ if(pix==4) {
+ gval += val * src[1];
+ bval += val * src[2];
+ aval += val * src[3];
+ }
+ src += bigstep;
+ }
+ sum= 1.0f/sum;
+ dest[0] = rval*sum;
if(pix==4) {
- gval += val * src[1];
- bval += val * src[2];
- aval += val * src[3];
+ dest[1] = gval*sum;
+ dest[2] = bval*sum;
+ dest[3] = aval*sum;
}
- src += bigstep;
+ dest+= bigstep;
}
- sum= 1.0f/sum;
- dest[0] = rval*sum;
- if(pix==4) {
- dest[1] = gval*sum;
- dest[2] = bval*sum;
- dest[3] = aval*sum;
- }
- dest+= bigstep;
+ if(node->exec & NODE_BREAK)
+ break;
}
- if(node->exec & NODE_BREAK)
- break;
+ MEM_freeN(gausstab);
}
-
+
free_compbuf(work);
- MEM_freeN(gausstab);
}
/* reference has to be mapped 0-1, and equal in size */
-static void bloom_with_reference(CompBuf *new, CompBuf *img, CompBuf *ref, float fac, NodeBlurData *nbd)
+static void bloom_with_reference(CompBuf *new, CompBuf *img, CompBuf *UNUSED(ref), float UNUSED(fac), NodeBlurData *nbd)
{
CompBuf *wbuf;
register float val;
@@ -568,11 +578,25 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN
if(out[0]->hasoutput==0) return;
if(nbd->relative) {
- nbd->sizex= (int)(nbd->percentx*nbd->image_in_width);
- nbd->sizey= (int)(nbd->percenty*nbd->image_in_height);
+ if (nbd->aspect==CMP_NODE_BLUR_ASPECT_NONE) {
+ nbd->sizex= (int)(nbd->percentx*0.01f*nbd->image_in_width);
+ nbd->sizey= (int)(nbd->percenty*0.01f*nbd->image_in_height);
+ }
+ else if (nbd->aspect==CMP_NODE_BLUR_ASPECT_Y) {
+ nbd->sizex= (int)(nbd->percentx*0.01f*nbd->image_in_width);
+ nbd->sizey= (int)(nbd->percenty*0.01f*nbd->image_in_width);
+ }
+ else if (nbd->aspect==CMP_NODE_BLUR_ASPECT_X) {
+ nbd->sizex= (int)(nbd->percentx*0.01f*nbd->image_in_height);
+ nbd->sizey= (int)(nbd->percenty*0.01f*nbd->image_in_height);
+ }
}
- if (((NodeBlurData *)node->storage)->filtertype == R_FILTER_FAST_GAUSS) {
+ if (nbd->sizex==0 && nbd->sizey==0) {
+ new= pass_on_compbuf(img);
+ out[0]->data= new;
+ }
+ else if (nbd->filtertype == R_FILTER_FAST_GAUSS) {
CompBuf *new, *img = in[0]->data;
/*from eeshlo's original patch, removed to fit in with the existing blur node */
/*const float sx = in[1]->vec[0], sy = in[2]->vec[0];*/
@@ -612,6 +636,7 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN
/* if fac input, we do it different */
if(in[1]->data) {
+ CompBuf *gammabuf;
/* make output size of input image */
new= alloc_compbuf(img->x, img->y, img->type, 1); /* allocs */
@@ -620,7 +645,18 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN
new->xof = img->xof;
new->yof = img->yof;
- blur_with_reference(node, new, img, in[1]->data);
+ if(nbd->gamma) {
+ gammabuf= dupalloc_compbuf(img);
+ gamma_correct_compbuf(gammabuf, 0);
+ }
+ else gammabuf= img;
+
+ blur_with_reference(node, new, gammabuf, in[1]->data);
+
+ if(nbd->gamma) {
+ gamma_correct_compbuf(new, 1);
+ free_compbuf(gammabuf);
+ }
if(node->exec & NODE_BREAK) {
free_compbuf(new);
new= NULL;
@@ -633,7 +669,6 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN
new= pass_on_compbuf(img);
}
else {
- NodeBlurData *nbd= node->storage;
CompBuf *gammabuf;
/* make output size of input image */
@@ -679,21 +714,19 @@ static void node_composit_init_blur(bNode* node)
node->storage= MEM_callocN(sizeof(NodeBlurData), "node blur data");
}
-bNodeType cmp_node_blur= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_BLUR,
- /* name */ "Blur",
- /* width+range */ 120, 80, 200,
- /* class+opts */ NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_blur_in,
- /* output sock */ cmp_node_blur_out,
- /* storage */ "NodeBlurData",
- /* execfunc */ node_composit_exec_blur,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_blur,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_blur(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_BLUR, "Blur", NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_blur_in, cmp_node_blur_out);
+ node_type_size(&ntype, 120, 80, 200);
+ node_type_init(&ntype, node_composit_init_blur);
+ node_type_storage(&ntype, "NodeBlurData", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_blur);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c b/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c
index 03eed59a4c4..f2f7636e96b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c
@@ -44,15 +44,14 @@ static bNodeSocketType cmp_node_brightcontrast_out[]= {
{ -1, 0, "" }
};
-static void do_brightnesscontrast(bNode *node, float *out, float *in)
+static void do_brightnesscontrast(bNode *UNUSED(node), float *out, float *in, float *in_brightness, float *in_contrast)
{
float i;
int c;
- float a, b, contrast, brightness, delta, v;
- contrast = node->custom2;
- brightness = (float)(node->custom1);
- brightness = (brightness) / 100.0f;
- delta = contrast / 200.0f;
+ float a, b, v;
+ float brightness = (*in_brightness) / 100.0f;
+ float contrast = *in_contrast;
+ float delta = contrast / 200.0f;
a = 1.0f - delta * 2.0f;
/*
* The algorithm is by Werner D. Streidt
@@ -77,37 +76,30 @@ static void do_brightnesscontrast(bNode *node, float *out, float *in)
}
}
-static void node_composit_exec_brightcontrast(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_brightcontrast(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
if(out[0]->hasoutput==0)
return;
if(in[0]->data) {
CompBuf *stackbuf, *cbuf= typecheck_compbuf(in[0]->data, CB_RGBA);
- node->custom1 = in[1]->vec[0];
- node->custom2 = in[2]->vec[0];
stackbuf= dupalloc_compbuf(cbuf);
- composit1_pixel_processor(node, stackbuf, cbuf, in[0]->vec, do_brightnesscontrast, CB_RGBA);
+ composit3_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, in[2]->data, in[2]->vec, do_brightnesscontrast, CB_RGBA, CB_VAL, CB_VAL);
out[0]->data = stackbuf;
if(cbuf != in[0]->data)
free_compbuf(cbuf);
}
}
-bNodeType cmp_node_brightcontrast= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_BRIGHTCONTRAST,
- /* name */ "Bright/Contrast",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_brightcontrast_in,
- /* output sock */ cmp_node_brightcontrast_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_brightcontrast,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copysotragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_brightcontrast(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_BRIGHTCONTRAST, "Bright/Contrast", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_brightcontrast_in, cmp_node_brightcontrast_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_brightcontrast);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
index ca7c19cc778..044ed6d069b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
@@ -42,7 +42,7 @@ static bNodeSocketType cmp_node_channel_matte_out[]={
{-1,0,""}
};
-static void do_normalized_rgba_to_ycca2(bNode *node, float *out, float *in)
+static void do_normalized_rgba_to_ycca2(bNode *UNUSED(node), float *out, float *in)
{
/*normalize to the range 0.0 to 1.0) */
rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601);
@@ -52,7 +52,7 @@ static void do_normalized_rgba_to_ycca2(bNode *node, float *out, float *in)
out[3]=in[3];
}
-static void do_normalized_ycca_to_rgba2(bNode *node, float *out, float *in)
+static void do_normalized_ycca_to_rgba2(bNode *UNUSED(node), float *out, float *in)
{
/*un-normalize the normalize from above */
in[0]=in[0]*255.0;
@@ -197,19 +197,17 @@ static void node_composit_init_channel_matte(bNode *node)
node->custom2= 2; /* Green Channel */
}
-bNodeType cmp_node_channel_matte={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_CHANNEL_MATTE,
- /* name */ "Channel Key",
- /* width+range */ 200, 80, 250,
- /* class+opts */ NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_channel_matte_in,
- /* output sock */ cmp_node_channel_matte_out,
- /* storage */ "NodeChroma",
- /* execfunc */ node_composit_exec_channel_matte,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_channel_matte,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_channel_matte(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_CHANNEL_MATTE, "Channel Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_channel_matte_in, cmp_node_channel_matte_out);
+ node_type_size(&ntype, 200, 80, 250);
+ node_type_init(&ntype, node_composit_init_channel_matte);
+ node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_channel_matte);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
index e502129c3d3..eba2d55187e 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
@@ -42,7 +42,7 @@ static bNodeSocketType cmp_node_chroma_out[]={
{-1,0,""}
};
-static void do_rgba_to_ycca_normalized(bNode *node, float *out, float *in)
+static void do_rgba_to_ycca_normalized(bNode *UNUSED(node), float *out, float *in)
{
rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601);
@@ -62,7 +62,7 @@ static void do_rgba_to_ycca_normalized(bNode *node, float *out, float *in)
out[3]=in[3];
}
-static void do_ycca_to_rgba_normalized(bNode *node, float *out, float *in)
+static void do_ycca_to_rgba_normalized(bNode *UNUSED(node), float *out, float *in)
{
/*un-normalize the normalize from above */
in[0]=(in[0]+1.0)/2.0;
@@ -184,21 +184,19 @@ static void node_composit_init_chroma_matte(bNode *node)
c->fstrength= 1.0f;
};
-bNodeType cmp_node_chroma_matte={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_CHROMA_MATTE,
- /* name */ "Chroma Key",
- /* width+range */ 200, 80, 300,
- /* class+opts */ NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_chroma_in,
- /* output sock */ cmp_node_chroma_out,
- /* storage */ "NodeChroma",
- /* execfunc */ node_composit_exec_chroma_matte,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_chroma_matte,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_chroma_matte(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_CHROMA_MATTE, "Chroma Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_chroma_in, cmp_node_chroma_out);
+ node_type_size(&ntype, 200, 80, 300);
+ node_type_init(&ntype, node_composit_init_chroma_matte);
+ node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_chroma_matte);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
index 8d5f4688657..57063465ac2 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
@@ -112,21 +112,19 @@ static void node_composit_init_color_matte(bNode *node)
c->fstrength= 1.0f;
};
-bNodeType cmp_node_color_matte={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COLOR_MATTE,
- /* name */ "Color Key",
- /* width+range */ 200, 80, 300,
- /* class+opts */ NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_color_in,
- /* output sock */ cmp_node_color_out,
- /* storage */ "NodeChroma",
- /* execfunc */ node_composit_exec_color_matte,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_color_matte,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_color_matte(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_COLOR_MATTE, "Color Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_color_in, cmp_node_color_out);
+ node_type_size(&ntype, 200, 80, 300);
+ node_type_init(&ntype, node_composit_init_color_matte);
+ node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_color_matte);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
index 3191ad757a0..e4b9ead504b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
@@ -182,7 +182,7 @@ static void do_apply_spillmap_blue(bNode *node, float* out, float *in, float *ma
}
}
-static void node_composit_exec_color_spill(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_color_spill(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/*
Originally based on the information from the book "The Art and Science of Digital Composition" and
@@ -322,19 +322,16 @@ static void node_composit_init_color_spill(bNode *node)
ncs->unspill=0; /* do not use unspill */
}
-bNodeType cmp_node_color_spill={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COLOR_SPILL,
- /* name */ "Color Spill",
- /* width+range */ 140, 80, 200,
- /* class+opts */ NODE_CLASS_MATTE, NODE_OPTIONS,
- /* input sock */ cmp_node_color_spill_in,
- /* output sock */ cmp_node_color_spill_out,
- /* storage */ "NodeColorspill",
- /* execfunc */ node_composit_exec_color_spill,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_color_spill,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
-};
-
+void register_node_type_cmp_color_spill(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_COLOR_SPILL, "Color Spill", NODE_CLASS_MATTE, NODE_OPTIONS,
+ cmp_node_color_spill_in, cmp_node_color_spill_out);
+ node_type_size(&ntype, 140, 80, 200);
+ node_type_init(&ntype, node_composit_init_color_spill);
+ node_type_storage(&ntype, "NodeColorspill", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_color_spill);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
index 33f5680eaa9..2596037065f 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
@@ -120,7 +120,7 @@ static void do_colorbalance_lgg_fac(bNode *node, float* out, float *in, float *f
out[3] = in[3];
}
-static void node_composit_exec_colorbalance(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_colorbalance(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
CompBuf *cbuf= in[1]->data;
CompBuf *stackbuf;
@@ -179,20 +179,18 @@ static void node_composit_init_colorbalance(bNode *node)
n->gain[0] = n->gain[1] = n->gain[2] = 1.0f;
}
-bNodeType cmp_node_colorbalance={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COLORBALANCE,
- /* name */ "Color Balance",
- /* width+range */ 400, 200, 400,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_colorbalance_in,
- /* output sock */ cmp_node_colorbalance_out,
- /* storage */ "NodeColorBalance",
- /* execfunc */ node_composit_exec_colorbalance,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_colorbalance,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_colorbalance(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_COLORBALANCE, "Color Balance", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_colorbalance_in, cmp_node_colorbalance_out);
+ node_type_size(&ntype, 400, 200, 400);
+ node_type_init(&ntype, node_composit_init_colorbalance);
+ node_type_storage(&ntype, "NodeColorBalance", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_colorbalance);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_composite.c b/source/blender/nodes/intern/CMP_nodes/CMP_composite.c
index 7510a2d11d4..1bbcb0f7527 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_composite.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_composite.c
@@ -40,7 +40,7 @@ static bNodeSocketType cmp_node_composite_in[]= {
};
/* applies to render pipeline */
-static void node_composit_exec_composite(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_composite(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out))
{
/* image assigned to output */
/* stack order input sockets: col, alpha, z */
@@ -94,19 +94,15 @@ static void node_composit_exec_composite(void *data, bNode *node, bNodeStack **i
generate_preview(data, node, in[0]->data);
}
-bNodeType cmp_node_composite= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COMPOSITE,
- /* name */ "Composite",
- /* width+range */ 80, 60, 200,
- /* class+opts */ NODE_CLASS_OUTPUT, NODE_PREVIEW,
- /* input sock */ cmp_node_composite_in,
- /* output sock */ NULL,
- /* storage */ "",
- /* execfunc */ node_composit_exec_composite,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_composite(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_COMPOSITE, "Composite", NODE_CLASS_OUTPUT, NODE_PREVIEW,
+ cmp_node_composite_in, NULL);
+ node_type_size(&ntype, 80, 60, 200);
+ node_type_exec(&ntype, node_composit_exec_composite);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c b/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
index dd5ce88bd36..b8d24fc1b14 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
@@ -40,7 +40,7 @@ static bNodeSocketType cmp_node_crop_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_crop(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_crop(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
if(in[0]->data) {
NodeTwoXYs *ntxy= node->storage;
@@ -108,19 +108,17 @@ static void node_composit_init_crop(bNode* node)
nxy->y2= 0;
}
-bNodeType cmp_node_crop= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_CROP,
- /* name */ "Crop",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ cmp_node_crop_in,
- /* output sock */ cmp_node_crop_out,
- /* storage */ "NodeTwoXYs",
- /* execfunc */ node_composit_exec_crop,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_crop,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_crop(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_CROP, "Crop", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ cmp_node_crop_in, cmp_node_crop_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_init(&ntype, node_composit_init_crop);
+ node_type_storage(&ntype, "NodeTwoXYs", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_crop);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c b/source/blender/nodes/intern/CMP_nodes/CMP_curves.c
index e4afa1922bb..2252bc2d181 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_curves.c
@@ -38,7 +38,7 @@ static bNodeSocketType cmp_node_time_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_curves_time(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_curves_time(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
RenderData *rd= data;
/* stack order output: fac */
@@ -59,22 +59,20 @@ static void node_composit_init_curves_time(bNode* node)
node->storage= curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
}
-bNodeType cmp_node_curve_time= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_TIME,
- /* name */ "Time",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ cmp_node_time_out,
- /* storage */ "CurveMapping",
- /* execfunc */ node_composit_exec_curves_time,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_curves_time,
- /* freestoragefunc */ node_free_curves,
- /* copystoragefunc */ node_copy_curves,
- /* id */ NULL
-};
+void register_node_type_cmp_curve_time(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_TIME, "Time", NODE_CLASS_INPUT, NODE_OPTIONS,
+ NULL, cmp_node_time_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_init(&ntype, node_composit_init_curves_time);
+ node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+ node_type_exec(&ntype, node_composit_exec_curves_time);
+
+ nodeRegisterType(lb, &ntype);
+}
+
@@ -89,7 +87,7 @@ static bNodeSocketType cmp_node_curve_vec_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_curve_vec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_curve_vec(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order input: vec */
/* stack order output: vec */
@@ -102,23 +100,20 @@ static void node_composit_init_curve_vec(bNode* node)
node->storage= curvemapping_add(3, -1.0f, -1.0f, 1.0f, 1.0f);
};
-bNodeType cmp_node_curve_vec= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_CURVE_VEC,
- /* name */ "Vector Curves",
- /* width+range */ 200, 140, 320,
- /* class+opts */ NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_curve_vec_in,
- /* output sock */ cmp_node_curve_vec_out,
- /* storage */ "CurveMapping",
- /* execfunc */ node_composit_exec_curve_vec,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_curve_vec,
- /* freestoragefunc */ node_free_curves,
- /* copystoragefunc */ node_copy_curves,
- /* id */ NULL
-
-};
+void register_node_type_cmp_curve_vec(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
+ cmp_node_curve_vec_in, cmp_node_curve_vec_out);
+ node_type_size(&ntype, 200, 140, 320);
+ node_type_init(&ntype, node_composit_init_curve_vec);
+ node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+ node_type_exec(&ntype, node_composit_exec_curve_vec);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** CURVE RGB ******************** */
static bNodeSocketType cmp_node_curve_rgb_in[]= {
@@ -158,7 +153,7 @@ static void do_curves_fac(bNode *node, float *out, float *in, float *fac)
out[3]= in[3];
}
-static void node_composit_exec_curve_rgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_curve_rgb(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order input: fac, image, black level, white level */
/* stack order output: image */
@@ -192,20 +187,18 @@ static void node_composit_init_curve_rgb(bNode* node)
node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f);
};
-bNodeType cmp_node_curve_rgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_CURVE_RGB,
- /* name */ "RGB Curves",
- /* width+range */ 200, 140, 320,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_curve_rgb_in,
- /* output sock */ cmp_node_curve_rgb_out,
- /* storage */ "CurveMapping",
- /* execfunc */ node_composit_exec_curve_rgb,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_curve_rgb,
- /* freestoragefunc */ node_free_curves,
- /* copystoragefunc */ node_copy_curves,
- /* id */ NULL
-};
+void register_node_type_cmp_curve_rgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_curve_rgb_in, cmp_node_curve_rgb_out);
+ node_type_size(&ntype, 200, 140, 320);
+ node_type_init(&ntype, node_composit_init_curve_rgb);
+ node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+ node_type_exec(&ntype, node_composit_exec_curve_rgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c b/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
index a93a5760842..7f5d5df9d6f 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
@@ -378,7 +378,13 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf,
//------------------------------------------------------------------
// main loop
+#ifndef __APPLE__ /* can crash on Mac, see bug #22856, disabled for now */
+#ifdef __INTEL_COMPILER /* icc doesn't like the compound statement -- internal error: 0_1506 */
+ #pragma omp parallel for private(y) if(!nqd->preview) schedule(guided)
+#else
#pragma omp parallel for private(y) if(!nqd->preview && img->y*img->x > 16384) schedule(guided)
+#endif
+#endif
for (y=0; y<img->y; y++) {
unsigned int p, p4, zp, cp, cp4;
float *ctcol, u, v, ct_crad, cR2=0;
@@ -791,7 +797,7 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf,
}
-static void node_composit_exec_defocus(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_defocus(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
CompBuf *new, *old, *zbuf_use = NULL, *img = in[0]->data, *zbuf = in[1]->data;
NodeDefocus *nqd = node->storage;
@@ -863,21 +869,19 @@ static void node_composit_init_defocus(bNode* node)
node->storage = nbd;
}
-bNodeType cmp_node_defocus = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_DEFOCUS,
- /* name */ "Defocus",
- /* width+range */ 150, 120, 200,
- /* class+opts */ NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- /* input sock */ cmp_node_defocus_in,
- /* output sock */ cmp_node_defocus_out,
- /* storage */ "NodeDefocus",
- /* execfunc */ node_composit_exec_defocus,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_defocus,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_defocus(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_DEFOCUS, "Defocus", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
+ cmp_node_defocus_in, cmp_node_defocus_out);
+ node_type_size(&ntype, 150, 120, 200);
+ node_type_init(&ntype, node_composit_init_defocus);
+ node_type_storage(&ntype, "NodeDefocus", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_defocus);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
index 0735a369d12..73046d70011 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
@@ -128,21 +128,19 @@ static void node_composit_init_diff_matte(bNode *node)
c->t2= 0.1f;
}
-bNodeType cmp_node_diff_matte={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_DIFF_MATTE,
- /* name */ "Difference Key",
- /* width+range */ 200, 80, 250,
- /* class+opts */ NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_diff_matte_in,
- /* output sock */ cmp_node_diff_matte_out,
- /* storage */ "NodeChroma",
- /* execfunc */ node_composit_exec_diff_matte,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_diff_matte,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_diff_matte(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_DIFF_MATTE, "Difference Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_diff_matte_in, cmp_node_diff_matte_out);
+ node_type_size(&ntype, 200, 80, 250);
+ node_type_init(&ntype, node_composit_init_diff_matte);
+ node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_diff_matte);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c b/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c
index 6c67413ea1f..3ceaecfed43 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c
@@ -110,7 +110,7 @@ static void morpho_erode(CompBuf *cbuf)
}
-static void node_composit_exec_dilateerode(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_dilateerode(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: mask */
/* stack order out: mask */
@@ -143,21 +143,16 @@ static void node_composit_exec_dilateerode(void *data, bNode *node, bNodeStack *
}
}
-bNodeType cmp_node_dilateerode= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_DILATEERODE,
- /* name */ "Dilate/Erode",
- /* width+range */ 130, 100, 320,
- /* class+opts */ NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- /* input sock */ cmp_node_dilateerode_in,
- /* output sock */ cmp_node_dilateerode_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_dilateerode,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_dilateerode(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_DILATEERODE, "Dilate/Erode", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
+ cmp_node_dilateerode_in, cmp_node_dilateerode_out);
+ node_type_size(&ntype, 130, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_dilateerode);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c b/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
index b0cf5559772..533a8b1324b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
@@ -102,7 +102,7 @@ static CompBuf *dblur(bNode *node, CompBuf *img, int iterations, int wrap,
return img;
}
-static void node_composit_exec_dblur(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_dblur(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
NodeDBlurData *ndbd= node->storage;
CompBuf *new, *img= in[0]->data;
@@ -125,19 +125,17 @@ static void node_composit_init_dblur(bNode* node)
ndbd->center_y= 0.5;
}
-bNodeType cmp_node_dblur = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_DBLUR,
- /* name */ "Directional Blur",
- /* width+range */ 150, 120, 200,
- /* class+opts */ NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- /* input sock */ cmp_node_dblur_in,
- /* output sock */ cmp_node_dblur_out,
- /* storage */ "NodeDBlurData",
- /* execfunc */ node_composit_exec_dblur,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_dblur,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_dblur(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_DBLUR, "Directional Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
+ cmp_node_dblur_in, cmp_node_dblur_out);
+ node_type_size(&ntype, 150, 120, 200);
+ node_type_init(&ntype, node_composit_init_dblur);
+ node_type_storage(&ntype, "NodeDBlurData", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_dblur);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c b/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
index aa7fac81c2c..7871efc30b7 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
@@ -48,7 +48,7 @@ static bNodeSocketType cmp_node_displace_out[]= {
* in order to take effect */
#define DISPLACE_EPSILON 0.01
-static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float *veccol, CompBuf *xbuf, CompBuf *ybuf, float *xscale, float *yscale)
+static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float *UNUSED(veccol), CompBuf *xbuf, CompBuf *ybuf, float *xscale, float *yscale)
{
ImBuf *ibuf;
int x, y;
@@ -60,7 +60,7 @@ static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float
float vec[3], vecdx[3], vecdy[3];
float col[3];
- ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0, 0);
+ ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0);
ibuf->rect_float= cbuf->rect;
for(y=0; y < stackbuf->y; y++) {
@@ -140,7 +140,7 @@ static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float
}
-static void node_composit_exec_displace(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_displace(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in, bNodeStack **out)
{
if(out[0]->hasoutput==0)
return;
@@ -171,20 +171,16 @@ static void node_composit_exec_displace(void *data, bNode *node, bNodeStack **in
}
}
-bNodeType cmp_node_displace= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_DISPLACE,
- /* name */ "Displace",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ cmp_node_displace_in,
- /* output sock */ cmp_node_displace_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_displace,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_displace(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_DISPLACE, "Displace", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ cmp_node_displace_in, cmp_node_displace_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_displace);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
index e0e595fc8f6..406f9e829c1 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
@@ -125,21 +125,19 @@ static void node_composit_init_distance_matte(bNode *node)
c->t2= 0.1f;
}
-bNodeType cmp_node_distance_matte={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_DIST_MATTE,
- /* name */ "Distance Key",
- /* width+range */ 200, 80, 250,
- /* class+opts */ NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_distance_matte_in,
- /* output sock */ cmp_node_distance_matte_out,
- /* storage */ "NodeChroma",
- /* execfunc */ node_composit_exec_distance_matte,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_distance_matte,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_distance_matte(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_DIST_MATTE, "Distance Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_distance_matte_in, cmp_node_distance_matte_out);
+ node_type_size(&ntype, 200, 80, 250);
+ node_type_init(&ntype, node_composit_init_distance_matte);
+ node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_distance_matte);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_filter.c b/source/blender/nodes/intern/CMP_nodes/CMP_filter.c
index 8f9a988c4c2..52b0fb008aa 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_filter.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_filter.c
@@ -217,22 +217,18 @@ static void node_composit_exec_filter(void *data, bNode *node, bNodeStack **in,
}
-bNodeType cmp_node_filter= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_FILTER,
- /* name */ "Filter",
- /* width+range */ 80, 40, 120,
- /* class+opts */ NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_filter_in,
- /* output sock */ cmp_node_filter_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_filter,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_filter(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_FILTER, "Filter", NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_filter_in, cmp_node_filter_out);
+ node_type_size(&ntype, 80, 40, 120);
+ node_type_label(&ntype, node_filter_label);
+ node_type_exec(&ntype, node_composit_exec_filter);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_flip.c b/source/blender/nodes/intern/CMP_nodes/CMP_flip.c
index fbc570c4028..b0058765136 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_flip.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_flip.c
@@ -40,7 +40,7 @@ static bNodeSocketType cmp_node_flip_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_flip(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_flip(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
if(in[0]->data) {
CompBuf *cbuf= in[0]->data;
@@ -85,21 +85,17 @@ static void node_composit_exec_flip(void *data, bNode *node, bNodeStack **in, bN
}
}
-bNodeType cmp_node_flip= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_FLIP,
- /* name */ "Flip",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ cmp_node_flip_in,
- /* output sock */ cmp_node_flip_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_flip,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_flip(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_FLIP, "Flip", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ cmp_node_flip_in, cmp_node_flip_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_flip);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c b/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c
index c0e524a3ae9..98af5bff2ec 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c
@@ -42,7 +42,7 @@ static bNodeSocketType cmp_node_gamma_out[]= {
{ -1, 0, "" }
};
-static void do_gamma(bNode *node, float *out, float *in, float *fac)
+static void do_gamma(bNode *UNUSED(node), float *out, float *in, float *fac)
{
int i=0;
for(i=0; i<3; i++) {
@@ -51,7 +51,7 @@ static void do_gamma(bNode *node, float *out, float *in, float *fac)
}
out[3] = in[3];
}
-static void node_composit_exec_gamma(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_gamma(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: Fac, Image */
/* stack order out: Image */
@@ -72,21 +72,14 @@ static void node_composit_exec_gamma(void *data, bNode *node, bNodeStack **in, b
}
}
-bNodeType cmp_node_gamma= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_GAMMA,
- /* name */ "Gamma",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_gamma_in,
- /* output sock */ cmp_node_gamma_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_gamma,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copysotragefunc */ NULL,
- /* id */ NULL
-};
-
-
+void register_node_type_cmp_gamma(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_GAMMA, "Gamma", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_gamma_in, cmp_node_gamma_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_gamma);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_glare.c b/source/blender/nodes/intern/CMP_nodes/CMP_glare.c
index 1d50acfdc26..1d7471680d0 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_glare.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_glare.c
@@ -422,7 +422,7 @@ static void fglow(NodeGlare* ndg, CompBuf* dst, CompBuf* src)
//--------------------------------------------------------------------------------------------
-static void node_composit_exec_glare(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_glare(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
CompBuf *new, *src, *img = in[0]->data;
NodeGlare* ndg = node->storage;
@@ -484,19 +484,17 @@ static void node_composit_init_glare(bNode* node)
node->storage = ndg;
}
-bNodeType cmp_node_glare = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_GLARE,
- /* name */ "Glare",
- /* width+range */ 150, 120, 200,
- /* class+opts */ NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- /* input sock */ cmp_node_glare_in,
- /* output sock */ cmp_node_glare_out,
- /* storage */ "NodeGlare",
- /* execfunc */ node_composit_exec_glare,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_glare,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_glare(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_GLARE, "Glare", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
+ cmp_node_glare_in, cmp_node_glare_out);
+ node_type_size(&ntype, 150, 120, 200);
+ node_type_init(&ntype, node_composit_init_glare);
+ node_type_storage(&ntype, "NodeGlare", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_glare);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c b/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c
index c274c580771..412ed5e6fa5 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c
@@ -65,7 +65,7 @@ static void do_hue_sat_fac(bNode *node, float *out, float *in, float *fac)
}
}
-static void node_composit_exec_hue_sat(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_hue_sat(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: Fac, Image */
/* stack order out: Image */
@@ -99,22 +99,19 @@ static void node_composit_init_hue_sat(bNode* node)
nhs->val= 1.0f;
}
-bNodeType cmp_node_hue_sat= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_HUE_SAT,
- /* name */ "Hue Saturation Value",
- /* width+range */ 150, 80, 250,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_hue_sat_in,
- /* output sock */ cmp_node_hue_sat_out,
- /* storage */ "NodeHueSat",
- /* execfunc */ node_composit_exec_hue_sat,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_hue_sat,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-
-};
+void register_node_type_cmp_hue_sat(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_hue_sat_in, cmp_node_hue_sat_out);
+ node_type_size(&ntype, 150, 80, 250);
+ node_type_init(&ntype, node_composit_init_hue_sat);
+ node_type_storage(&ntype, "NodeHueSat", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_hue_sat);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c b/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c
index 9eb79bb8c36..54503d23550 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c
@@ -98,7 +98,7 @@ static void do_huecorrect_fac(bNode *node, float *out, float *in, float *fac)
out[3]= in[3];
}
-static void node_composit_exec_huecorrect(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_huecorrect(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
CompBuf *cbuf= in[1]->data;
CompBuf *stackbuf;
@@ -148,20 +148,18 @@ static void node_composit_init_huecorrect(bNode* node)
cumapping->cur = 1;
}
-bNodeType cmp_node_huecorrect= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_HUECORRECT,
- /* name */ "Hue Correct",
- /* width+range */ 320, 140, 400,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_huecorrect_in,
- /* output sock */ cmp_node_huecorrect_out,
- /* storage */ "CurveMapping",
- /* execfunc */ node_composit_exec_huecorrect,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_huecorrect,
- /* freestoragefunc */ node_free_curves,
- /* copystoragefunc */ node_copy_curves,
- /* id */ NULL
-};
+void register_node_type_cmp_huecorrect(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_HUECORRECT, "Hue Correct", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_huecorrect_in, cmp_node_huecorrect_out);
+ node_type_size(&ntype, 320, 140, 400);
+ node_type_init(&ntype, node_composit_init_huecorrect);
+ node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+ node_type_exec(&ntype, node_composit_exec_huecorrect);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c b/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
index 9b088cb3f55..8b422012cec 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
@@ -104,21 +104,17 @@ static void node_composit_exec_idmask(void *data, bNode *node, bNodeStack **in,
}
-bNodeType cmp_node_idmask= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_ID_MASK,
- /* name */ "ID Mask",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_idmask_in,
- /* output sock */ cmp_node_idmask_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_idmask,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_idmask(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_ID_MASK, "ID Mask", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_idmask_in, cmp_node_idmask_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_idmask);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/intern/CMP_nodes/CMP_image.c
index 9309d2939db..a0ac8d90bfa 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_image.c
@@ -77,25 +77,31 @@ static CompBuf *node_composit_get_image(RenderData *rd, Image *ima, ImageUser *i
/* now we need a float buffer from the image
* with matching color management */
- if(rd->color_mgt_flag & R_COLOR_MANAGEMENT) {
- if(ibuf->profile != IB_PROFILE_NONE) {
- rect= ibuf->rect_float;
+ if(ibuf->channels == 4) {
+ if(rd->color_mgt_flag & R_COLOR_MANAGEMENT) {
+ if(ibuf->profile != IB_PROFILE_NONE) {
+ rect= ibuf->rect_float;
+ }
+ else {
+ rect= MEM_mapallocN(sizeof(float) * 4 * ibuf->x * ibuf->y, "node_composit_get_image");
+ srgb_to_linearrgb_rgba_rgba_buf(rect, ibuf->rect_float, ibuf->x * ibuf->y);
+ alloc= TRUE;
+ }
}
else {
- rect= MEM_mapallocN(sizeof(float) * 4 * ibuf->x * ibuf->y, "node_composit_get_image");
- srgb_to_linearrgb_rgba_rgba_buf(rect, ibuf->rect_float, ibuf->x * ibuf->y);
- alloc= TRUE;
+ if(ibuf->profile == IB_PROFILE_NONE) {
+ rect= ibuf->rect_float;
+ }
+ else {
+ rect= MEM_mapallocN(sizeof(float) * 4 * ibuf->x * ibuf->y, "node_composit_get_image");
+ linearrgb_to_srgb_rgba_rgba_buf(rect, ibuf->rect_float, ibuf->x * ibuf->y);
+ alloc= TRUE;
+ }
}
}
else {
- if(ibuf->profile == IB_PROFILE_NONE) {
- rect= ibuf->rect_float;
- }
- else {
- rect= MEM_mapallocN(sizeof(float) * 4 * ibuf->x * ibuf->y, "node_composit_get_image");
- linearrgb_to_srgb_rgba_rgba_buf(rect, ibuf->rect_float, ibuf->x * ibuf->y);
- alloc= TRUE;
- }
+ /* non-rgba passes can't use color profiles */
+ rect= ibuf->rect_float;
}
/* done coercing into the correct color management */
@@ -209,7 +215,7 @@ void outputs_multilayer_get(RenderData *rd, RenderLayer *rl, bNodeStack **out, I
};
-static void node_composit_exec_image(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
/* image assigned to output */
@@ -291,22 +297,20 @@ static void node_composit_init_image(bNode* node)
iuser->ok= 1;
}
-bNodeType cmp_node_image= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_IMAGE,
- /* name */ "Image",
- /* width+range */ 120, 80, 300,
- /* class+opts */ NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ cmp_node_rlayers_out,
- /* storage */ "ImageUser",
- /* execfunc */ node_composit_exec_image,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_image,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_image(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
+ NULL, cmp_node_rlayers_out);
+ node_type_size(&ntype, 120, 80, 300);
+ node_type_init(&ntype, node_composit_init_image);
+ node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_image);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** RENDER RESULT ******************** */
@@ -372,7 +376,7 @@ void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStack **out
out[RRES_OUT_ENV]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_ENVIRONMENT);
};
-static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
Scene *sce= (Scene *)node->id;
Render *re= (sce)? RE_GetRender(sce->id.name): NULL;
@@ -422,22 +426,17 @@ static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **in,
};
-bNodeType cmp_node_rlayers= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_R_LAYERS,
- /* name */ "Render Layers",
- /* width+range */ 150, 100, 300,
- /* class+opts */ NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ cmp_node_rlayers_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_rlayers,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_cmp_rlayers(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_R_LAYERS, "Render Layers", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
+ NULL, cmp_node_rlayers_out);
+ node_type_size(&ntype, 150, 100, 300);
+ node_type_exec(&ntype, node_composit_exec_rlayers);
+
+ nodeRegisterType(lb, &ntype);
+}
-};
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c b/source/blender/nodes/intern/CMP_nodes/CMP_invert.c
index 08ae51975b9..a60edd5ac7d 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_invert.c
@@ -75,7 +75,7 @@ static void do_invert_fac(bNode *node, float *out, float *in, float *fac)
QUATCOPY(out, col);
}
-static void node_composit_exec_invert(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_invert(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: fac, Image, Image */
/* stack order out: Image */
@@ -115,20 +115,16 @@ static void node_composit_init_invert(bNode *node)
}
/* custom1 = mix type */
-bNodeType cmp_node_invert= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_INVERT,
- /* name */ "Invert",
- /* width+range */ 120, 120, 140,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_invert_in,
- /* output sock */ cmp_node_invert_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_invert,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_invert,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_invert(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_invert_in, cmp_node_invert_out);
+ node_type_size(&ntype, 120, 120, 140);
+ node_type_init(&ntype, node_composit_init_invert);
+ node_type_exec(&ntype, node_composit_exec_invert);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c b/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c
index fc9045caafd..159bc859450 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c
@@ -147,7 +147,7 @@ static void lensDistort(CompBuf* dst, CompBuf* src, float kr, float kg, float kb
}
-static void node_composit_exec_lensdist(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_lensdist(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
CompBuf *new, *img = in[0]->data;
NodeLensDist* nld = node->storage;
@@ -174,19 +174,17 @@ static void node_composit_init_lensdist(bNode* node)
}
-bNodeType cmp_node_lensdist = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_LENSDIST,
- /* name */ "Lens Distortion",
- /* width+range */ 150, 120, 200,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ cmp_node_lensdist_in,
- /* output sock */ cmp_node_lensdist_out,
- /* storage */ "NodeLensDist",
- /* execfunc */ node_composit_exec_lensdist,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_lensdist,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_lensdist(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_LENSDIST, "Lens Distortion", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ cmp_node_lensdist_in, cmp_node_lensdist_out);
+ node_type_size(&ntype, 150, 120, 200);
+ node_type_init(&ntype, node_composit_init_lensdist);
+ node_type_storage(&ntype, "NodeLensDist", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_lensdist);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_levels.c b/source/blender/nodes/intern/CMP_nodes/CMP_levels.c
index f4934b4b57b..71170d1633e 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_levels.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_levels.c
@@ -328,21 +328,18 @@ static void node_composit_init_view_levels(bNode* node)
node->custom1=1; /*All channels*/
}
-bNodeType cmp_node_view_levels= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_VIEW_LEVELS,
- /* name */ "Levels",
- /* widthrange */ 140, 100, 320,
- /* classopts */ NODE_CLASS_OUTPUT, NODE_OPTIONS|NODE_PREVIEW,
- /* input sock */ cmp_node_view_levels_in,
- /* output sock */ cmp_node_view_levels_out,
- /* storage */ "ImageUser",
- /* execfunc */ node_composit_exec_view_levels,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_view_levels,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_view_levels(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_VIEW_LEVELS, "Levels", NODE_CLASS_OUTPUT, NODE_OPTIONS|NODE_PREVIEW,
+ cmp_node_view_levels_in, cmp_node_view_levels_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_init(&ntype, node_composit_init_view_levels);
+ node_type_storage(&ntype, "ImageUser", NULL, NULL);
+ node_type_exec(&ntype, node_composit_exec_view_levels);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
index af198fba699..91edb48415b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
@@ -103,20 +103,18 @@ static void node_composit_init_luma_matte(bNode *node)
c->t2= 0.0f;
};
-bNodeType cmp_node_luma_matte={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_LUMA_MATTE,
- /* name */ "Luminance Key",
- /* width+range */ 200, 80, 250,
- /* class+opts */ NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_luma_matte_in,
- /* output sock */ cmp_node_luma_matte_out,
- /* storage */ "NodeChroma",
- /* execfunc */ node_composit_exec_luma_matte,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_luma_matte,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_luma_matte(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_LUMA_MATTE, "Luminance Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_luma_matte_in, cmp_node_luma_matte_out);
+ node_type_size(&ntype, 200, 80, 250);
+ node_type_init(&ntype, node_composit_init_luma_matte);
+ node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_luma_matte);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c b/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c
index 91d1aa148b2..f0e0aec37b9 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c
@@ -51,7 +51,7 @@ static void do_mapuv(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *uvbuf, float thr
int x, y, sx, sy, row= 3*stackbuf->x;
/* ibuf needed for sampling */
- ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0, 0);
+ ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0);
ibuf->rect_float= cbuf->rect;
/* vars for efficient looping */
@@ -134,7 +134,7 @@ static void do_mapuv(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *uvbuf, float thr
}
-static void node_composit_exec_mapuv(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_mapuv(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
if(out[0]->hasoutput==0)
return;
@@ -159,21 +159,17 @@ static void node_composit_exec_mapuv(void *data, bNode *node, bNodeStack **in, b
}
}
-bNodeType cmp_node_mapuv= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_MAP_UV,
- /* name */ "Map UV",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ cmp_node_mapuv_in,
- /* output sock */ cmp_node_mapuv_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_mapuv,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_mapuv(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_MAP_UV, "Map UV", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ cmp_node_mapuv_in, cmp_node_mapuv_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_mapuv);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c b/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c
index 357218ea937..550e4a2e870 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c
@@ -52,7 +52,7 @@ static void do_map_value(bNode *node, float *out, float *src)
out[0]= texmap->max[0];
}
-static void node_composit_exec_map_value(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_map_value(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: valbuf */
/* stack order out: valbuf */
@@ -79,23 +79,20 @@ static void node_composit_init_map_value(bNode* node)
node->storage= add_mapping();
}
-bNodeType cmp_node_map_value= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_MAP_VALUE,
- /* name */ "Map Value",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_map_value_in,
- /* output sock */ cmp_node_map_value_out,
- /* storage */ "TexMapping",
- /* execfunc */ node_composit_exec_map_value,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_map_value,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-
-};
+void register_node_type_cmp_map_value(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_MAP_VALUE, "Map Value", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
+ cmp_node_map_value_in, cmp_node_map_value_out);
+ node_type_size(&ntype, 100, 60, 150);
+ node_type_init(&ntype, node_composit_init_map_value);
+ node_type_storage(&ntype, "TexMapping", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_map_value);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_math.c b/source/blender/nodes/intern/CMP_nodes/CMP_math.c
index f663dc76b5c..7a8dadafb86 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_math.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_math.c
@@ -29,7 +29,6 @@
#include "../CMP_util.h"
-
/* **************** SCALAR MATH ******************** */
static bNodeSocketType cmp_node_math_in[]= {
{ SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f},
@@ -151,7 +150,7 @@ static void do_math(bNode *node, float *out, float *in, float *in2)
}
}
-static void node_composit_exec_math(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_math(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
CompBuf *cbuf=in[0]->data;
CompBuf *cbuf2=in[1]->data;
@@ -181,22 +180,19 @@ static void node_composit_exec_math(void *data, bNode *node, bNodeStack **in, bN
out[0]->data= stackbuf;
}
-bNodeType cmp_node_math= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_MATH,
- /* name */ "Math",
- /* width+range */ 120, 110, 160,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_math_in,
- /* output sock */ cmp_node_math_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_math,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_math(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_math_in, cmp_node_math_out);
+ node_type_size(&ntype, 120, 110, 160);
+ node_type_label(&ntype, node_math_label);
+ node_type_exec(&ntype, node_composit_exec_math);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c b/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c
index 34d6713d9e3..91b8eb8b752 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c
@@ -79,20 +79,16 @@ static void node_composit_exec_mix_rgb(void *data, bNode *node, bNodeStack **in,
}
/* custom1 = mix type */
-bNodeType cmp_node_mix_rgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_MIX_RGB,
- /* name */ "Mix",
- /* width+range */ 110, 60, 120,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_mix_rgb_in,
- /* output sock */ cmp_node_mix_rgb_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_mix_rgb,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_mix_rgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_mix_rgb_in, cmp_node_mix_rgb_out);
+ node_type_size(&ntype, 110, 60, 120);
+ node_type_label(&ntype, node_blend_label);
+ node_type_exec(&ntype, node_composit_exec_mix_rgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_normal.c b/source/blender/nodes/intern/CMP_nodes/CMP_normal.c
index c57caf180ad..5b218f4d486 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_normal.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_normal.c
@@ -52,7 +52,7 @@ static void do_normal(bNode *node, float *out, float *in)
}
/* generates normal, does dot product */
-static void node_composit_exec_normal(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_normal(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
/* stack order input: normal */
@@ -77,21 +77,16 @@ static void node_composit_exec_normal(void *data, bNode *node, bNodeStack **in,
}
-bNodeType cmp_node_normal= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_NORMAL,
- /* name */ "Normal",
- /* width+range */ 100, 60, 200,
- /* class+opts */ NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_normal_in,
- /* output sock */ cmp_node_normal_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_normal,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_normal(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
+ cmp_node_normal_in, cmp_node_normal_out);
+ node_type_size(&ntype, 100, 60, 200);
+ node_type_exec(&ntype, node_composit_exec_normal);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c b/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c
index 64855ba5cf3..1c92eb6519e 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c
@@ -40,7 +40,7 @@ static bNodeSocketType cmp_node_normalize_out[]= {
{ -1, 0, "" }
};
-static void do_normalize(bNode *node, float *out, float *src, float *min, float *mult)
+static void do_normalize(bNode *UNUSED(node), float *out, float *src, float *min, float *mult)
{
float res;
res = (src[0] - min[0]) * mult[0];
@@ -58,7 +58,7 @@ static void do_normalize(bNode *node, float *out, float *src, float *min, float
/* The code below assumes all data is inside range +- this, and that input buffer is single channel */
#define BLENDER_ZMAX 10000.0f
-static void node_composit_exec_normalize(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_normalize(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: valbuf */
/* stack order out: valbuf */
@@ -98,19 +98,15 @@ static void node_composit_exec_normalize(void *data, bNode *node, bNodeStack **i
}
}
-bNodeType cmp_node_normalize= {
- /* *next, *prev*/ NULL, NULL,
- /* type code */ CMP_NODE_NORMALIZE,
- /* name */ "Normalize",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_normalize_in,
- /* output sock */ cmp_node_normalize_out,
- /* storage */ "TexMapping",
- /* execfunc */ node_composit_exec_normalize,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_normalize(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_NORMALIZE, "Normalize", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
+ cmp_node_normalize_in, cmp_node_normalize_out);
+ node_type_size(&ntype, 100, 60, 150);
+ node_type_exec(&ntype, node_composit_exec_normalize);
+ node_type_storage(&ntype, "TexMapping", NULL, NULL);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c b/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c
index 6f29548fcc3..701a3910be9 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c
@@ -36,7 +36,7 @@ static bNodeSocketType cmp_node_output_file_in[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_output_file(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_output_file(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out))
{
/* image assigned to output */
/* stack order input sockets: col, alpha */
@@ -54,7 +54,7 @@ static void node_composit_exec_output_file(void *data, bNode *node, bNodeStack *
return;
} else {
CompBuf *cbuf= typecheck_compbuf(in[0]->data, CB_RGBA);
- ImBuf *ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0, 0);
+ ImBuf *ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0);
char string[256];
ibuf->rect_float= cbuf->rect;
@@ -71,7 +71,7 @@ static void node_composit_exec_output_file(void *data, bNode *node, bNodeStack *
}
}
- BKE_makepicstring(string, nif->name, rd->cfra, nif->imtype, (rd->scemode & R_EXTENSION));
+ BKE_makepicstring(string, nif->name, rd->cfra, nif->imtype, (rd->scemode & R_EXTENSION), TRUE);
if(0 == BKE_write_ibuf((Scene *)node->id, ibuf, string, nif->imtype, nif->subimtype, nif->imtype==R_OPENEXR?nif->codec:nif->quality))
printf("Cannot save Node File Output to %s\n", string);
@@ -104,22 +104,19 @@ static void node_composit_init_output_file(bNode *node)
}
}
-bNodeType cmp_node_output_file= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_OUTPUT_FILE,
- /* name */ "File Output",
- /* width+range */ 140, 80, 300,
- /* class+opts */ NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_output_file_in,
- /* output sock */ NULL,
- /* storage */ "NodeImageFile",
- /* execfunc */ node_composit_exec_output_file,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_output_file,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-
-};
+void register_node_type_cmp_output_file(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_OUTPUT_FILE, "File Output", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_output_file_in, NULL);
+ node_type_size(&ntype, 140, 80, 300);
+ node_type_init(&ntype, node_composit_init_output_file);
+ node_type_storage(&ntype, "NodeImageFile", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_output_file);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c b/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c
index 5058fa51c11..d64a2cee453 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c
@@ -41,7 +41,7 @@ static bNodeSocketType cmp_node_premulkey_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_premulkey(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_premulkey(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
if(out[0]->hasoutput==0)
return;
@@ -58,20 +58,16 @@ static void node_composit_exec_premulkey(void *data, bNode *node, bNodeStack **i
}
}
-bNodeType cmp_node_premulkey= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_PREMULKEY,
- /* name */ "Alpha Convert",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_premulkey_in,
- /* output sock */ cmp_node_premulkey_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_premulkey,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copysotragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_premulkey(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_PREMULKEY, "Alpha Convert", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_premulkey_in, cmp_node_premulkey_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_premulkey);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c b/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c
index 3b9b993d5f8..975d9cae219 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c
@@ -36,29 +36,24 @@ static bNodeSocketType cmp_node_rgb_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_rgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_rgb(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
VECCOPY(out[0]->vec, sock->ns.vec);
}
-bNodeType cmp_node_rgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_RGB,
- /* name */ "RGB",
- /* width+range */ 140, 80, 140,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ cmp_node_rgb_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_rgb,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_rgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS,
+ NULL, cmp_node_rgb_out);
+ node_type_size(&ntype, 140, 80, 140);
+ node_type_exec(&ntype, node_composit_exec_rgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c b/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
index ccb1d8abfd9..ff8a2460efc 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
@@ -42,7 +42,7 @@ static bNodeSocketType cmp_node_rotate_out[]= {
};
/* only supports RGBA nodes now */
-static void node_composit_exec_rotate(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_rotate(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
if(out[0]->hasoutput==0)
@@ -68,8 +68,8 @@ static void node_composit_exec_rotate(void *data, bNode *node, bNodeStack **in,
maxy= -centy + (float)cbuf->y;
- ibuf=IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0, 0);
- obuf=IMB_allocImBuf(stackbuf->x, stackbuf->y, 32, 0, 0);
+ ibuf=IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0);
+ obuf=IMB_allocImBuf(stackbuf->x, stackbuf->y, 32, 0);
if(ibuf && obuf){
ibuf->rect_float=cbuf->rect;
@@ -120,19 +120,16 @@ static void node_composit_init_rotate(bNode *node)
node->custom1= 1; /* Bilinear Filter*/
}
-bNodeType cmp_node_rotate= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_ROTATE,
- /* name */ "Rotate",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ cmp_node_rotate_in,
- /* output sock */ cmp_node_rotate_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_rotate,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_rotate,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_rotate(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_ROTATE, "Rotate", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ cmp_node_rotate_in, cmp_node_rotate_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_init(&ntype, node_composit_init_rotate);
+ node_type_exec(&ntype, node_composit_exec_rotate);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_scale.c b/source/blender/nodes/intern/CMP_nodes/CMP_scale.c
index 9779875b01a..a524f4cb29b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_scale.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_scale.c
@@ -75,7 +75,7 @@ static void node_composit_exec_scale(void *data, bNode *node, bNodeStack **in, b
newx= MIN2(newx, CMP_SCALE_MAX);
newy= MIN2(newy, CMP_SCALE_MAX);
- ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0, 0);
+ ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0);
if(ibuf) {
ibuf->rect_float= cbuf->rect;
IMB_scaleImBuf(ibuf, newx, newy);
@@ -109,22 +109,18 @@ static void node_composit_exec_scale(void *data, bNode *node, bNodeStack **in, b
}
};
-bNodeType cmp_node_scale= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_SCALE,
- /* name */ "Scale",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ cmp_node_scale_in,
- /* output sock */ cmp_node_scale_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_scale,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_scale(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ cmp_node_scale_in, cmp_node_scale_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_scale);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
index 0ac47c58ab3..040a88bc37b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
@@ -43,7 +43,7 @@ static bNodeSocketType cmp_node_sephsva_out[]= {
{ -1, 0, "" }
};
-static void do_sephsva(bNode *node, float *out, float *in)
+static void do_sephsva(bNode *UNUSED(node), float *out, float *in)
{
float h, s, v;
@@ -55,7 +55,7 @@ static void do_sephsva(bNode *node, float *out, float *in)
out[3]= in[3];
}
-static void node_composit_exec_sephsva(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_sephsva(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order out: bw channels */
/* stack order in: col */
@@ -96,23 +96,18 @@ static void node_composit_exec_sephsva(void *data, bNode *node, bNodeStack **in,
}
}
-bNodeType cmp_node_sephsva= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_SEPHSVA,
- /* name */ "Separate HSVA",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, 0,
- /* input sock */ cmp_node_sephsva_in,
- /* output sock */ cmp_node_sephsva_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_sephsva,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_sephsva(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_SEPHSVA, "Separate HSVA", NODE_CLASS_CONVERTOR, 0,
+ cmp_node_sephsva_in, cmp_node_sephsva_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_sephsva);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** COMBINE HSVA ******************** */
static bNodeSocketType cmp_node_combhsva_in[]= {
@@ -127,7 +122,7 @@ static bNodeSocketType cmp_node_combhsva_out[]= {
{ -1, 0, "" }
};
-static void do_comb_hsva(bNode *node, float *out, float *in1, float *in2, float *in3, float *in4)
+static void do_comb_hsva(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4)
{
float r,g,b;
hsv_to_rgb(in1[0], in2[0], in3[0], &r, &g, &b);
@@ -138,7 +133,7 @@ static void do_comb_hsva(bNode *node, float *out, float *in1, float *in2, float
out[3] = in4[0];
}
-static void node_composit_exec_combhsva(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_combhsva(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order out: 1 rgba channels */
/* stack order in: 4 value channels */
@@ -171,21 +166,17 @@ static void node_composit_exec_combhsva(void *data, bNode *node, bNodeStack **in
}
}
-bNodeType cmp_node_combhsva= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COMBHSVA,
- /* name */ "Combine HSVA",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_combhsva_in,
- /* output sock */ cmp_node_combhsva_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_combhsva,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_combhsva(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_COMBHSVA, "Combine HSVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_combhsva_in, cmp_node_combhsva_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_combhsva);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c
index c5a57f8a175..1062344db39 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c
@@ -42,7 +42,7 @@ static bNodeSocketType cmp_node_seprgba_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_seprgba(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_seprgba(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in, bNodeStack **out)
{
/* stack order out: bw channels */
/* stack order in: col */
@@ -74,23 +74,18 @@ static void node_composit_exec_seprgba(void *data, bNode *node, bNodeStack **in,
}
}
-bNodeType cmp_node_seprgba= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_SEPRGBA,
- /* name */ "Separate RGBA",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, 0,
- /* input sock */ cmp_node_seprgba_in,
- /* output sock */ cmp_node_seprgba_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_seprgba,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_seprgba(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_SEPRGBA, "Separate RGBA", NODE_CLASS_CONVERTOR, 0,
+ cmp_node_seprgba_in, cmp_node_seprgba_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_seprgba);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** COMBINE RGBA ******************** */
@@ -106,7 +101,7 @@ static bNodeSocketType cmp_node_combrgba_out[]= {
{ -1, 0, "" }
};
-static void do_combrgba(bNode *node, float *out, float *in1, float *in2, float *in3, float *in4)
+static void do_combrgba(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4)
{
out[0] = in1[0];
out[1] = in2[0];
@@ -114,7 +109,7 @@ static void do_combrgba(bNode *node, float *out, float *in1, float *in2, float *
out[3] = in4[0];
}
-static void node_composit_exec_combrgba(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_combrgba(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order out: 1 rgba channels */
/* stack order in: 4 value channels */
@@ -147,21 +142,16 @@ static void node_composit_exec_combrgba(void *data, bNode *node, bNodeStack **in
}
}
-bNodeType cmp_node_combrgba= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COMBRGBA,
- /* name */ "Combine RGBA",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_combrgba_in,
- /* output sock */ cmp_node_combrgba_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_combrgba,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_combrgba(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_COMBRGBA, "Combine RGBA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_combrgba_in, cmp_node_combrgba_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_combrgba);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c
index 7b3dfccab50..364457fc5fa 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c
@@ -43,7 +43,7 @@ static bNodeSocketType cmp_node_sepycca_out[]= {
{ -1, 0, "" }
};
-static void do_sepycca(bNode *node, float *out, float *in)
+static void do_sepycca_601(bNode *UNUSED(node), float *out, float *in)
{
float y, cb, cr;
@@ -56,13 +56,51 @@ static void do_sepycca(bNode *node, float *out, float *in)
out[3]= in[3];
}
-static void node_composit_exec_sepycca(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void do_sepycca_709(bNode *UNUSED(node), float *out, float *in)
+{
+ float y, cb, cr;
+
+ rgb_to_ycc(in[0], in[1], in[2], &y, &cb, &cr, BLI_YCC_ITU_BT709);
+
+ /*divided by 255 to normalize for viewing in */
+ out[0]= y/255.0;
+ out[1]= cb/255.0;
+ out[2]= cr/255.0;
+ out[3]= in[3];
+}
+
+static void do_sepycca_jfif(bNode *UNUSED(node), float *out, float *in)
+{
+ float y, cb, cr;
+
+ rgb_to_ycc(in[0], in[1], in[2], &y, &cb, &cr, BLI_YCC_JFIF_0_255);
+
+ /*divided by 255 to normalize for viewing in */
+ out[0]= y/255.0;
+ out[1]= cb/255.0;
+ out[2]= cr/255.0;
+ out[3]= in[3];
+}
+
+static void node_composit_exec_sepycca(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* input no image? then only color operation */
if(in[0]->data==NULL) {
float y, cb, cr;
- rgb_to_ycc(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &y, &cb, &cr, BLI_YCC_ITU_BT601);
+ switch(node->custom1)
+ {
+ case 1:
+ rgb_to_ycc(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &y, &cb, &cr, BLI_YCC_ITU_BT709);
+ break;
+ case 2:
+ rgb_to_ycc(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &y, &cb, &cr, BLI_YCC_JFIF_0_255);
+ break;
+ case 0:
+ default:
+ rgb_to_ycc(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &y, &cb, &cr, BLI_YCC_ITU_BT601);
+ break;
+ }
/*divided by 255 to normalize for viewing in */
out[0]->vec[0] = y/255.0;
@@ -76,7 +114,19 @@ static void node_composit_exec_sepycca(void *data, bNode *node, bNodeStack **in,
CompBuf *cbuf2=typecheck_compbuf(cbuf, CB_RGBA);
/* convert the RGB stackbuf to an HSV representation */
- composit1_pixel_processor(node, cbuf2, cbuf2, in[0]->vec, do_sepycca, CB_RGBA);
+ switch(node->custom1)
+ {
+ case 1:
+ composit1_pixel_processor(node, cbuf2, cbuf2, in[0]->vec, do_sepycca_709, CB_RGBA);
+ break;
+ case 2:
+ composit1_pixel_processor(node, cbuf2, cbuf2, in[0]->vec, do_sepycca_jfif, CB_RGBA);
+ break;
+ case 0:
+ default:
+ composit1_pixel_processor(node, cbuf2, cbuf2, in[0]->vec, do_sepycca_601, CB_RGBA);
+ break;
+ }
/* separate each of those channels */
if(out[0]->hasoutput)
@@ -95,29 +145,25 @@ static void node_composit_exec_sepycca(void *data, bNode *node, bNodeStack **in,
}
}
-bNodeType cmp_node_sepycca= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_SEPYCCA,
- /* name */ "Separate YCbCrA",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, 0,
- /* input sock */ cmp_node_sepycca_in,
- /* output sock */ cmp_node_sepycca_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_sepycca,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_sepycca(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_SEPYCCA, "Separate YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_sepycca_in, cmp_node_sepycca_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_sepycca);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** COMBINE YCCA ******************** */
static bNodeSocketType cmp_node_combycca_in[]= {
{ SOCK_VALUE, 1, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Cb", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Cr", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { SOCK_VALUE, 1, "Cb", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { SOCK_VALUE, 1, "Cr", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
{ SOCK_VALUE, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
@@ -126,7 +172,7 @@ static bNodeSocketType cmp_node_combycca_out[]= {
{ -1, 0, "" }
};
-static void do_comb_ycca(bNode *node, float *out, float *in1, float *in2, float *in3, float *in4)
+static void do_comb_ycca_601(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4)
{
float r,g,b;
float y, cb, cr;
@@ -144,16 +190,67 @@ static void do_comb_ycca(bNode *node, float *out, float *in1, float *in2, float
out[3] = in4[0];
}
-static void node_composit_exec_combycca(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void do_comb_ycca_709(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4)
+{
+ float r,g,b;
+ float y, cb, cr;
+
+ /*need to un-normalize the data*/
+ y=in1[0]*255;
+ cb=in2[0]*255;
+ cr=in3[0]*255;
+
+ ycc_to_rgb(y,cb,cr, &r, &g, &b, BLI_YCC_ITU_BT709);
+
+ out[0] = r;
+ out[1] = g;
+ out[2] = b;
+ out[3] = in4[0];
+}
+
+static void do_comb_ycca_jfif(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4)
+{
+ float r,g,b;
+ float y, cb, cr;
+
+ /*need to un-normalize the data*/
+ y=in1[0]*255;
+ cb=in2[0]*255;
+ cr=in3[0]*255;
+
+ ycc_to_rgb(y,cb,cr, &r, &g, &b, BLI_YCC_JFIF_0_255);
+
+ out[0] = r;
+ out[1] = g;
+ out[2] = b;
+ out[3] = in4[0];
+}
+
+static void node_composit_exec_combycca(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order out: 1 ycca channels */
/* stack order in: 4 value channels */
/* input no image? then only color operation */
if((in[0]->data==NULL) && (in[1]->data==NULL) && (in[2]->data==NULL) && (in[3]->data==NULL)) {
- out[0]->vec[0] = in[0]->vec[0];
- out[0]->vec[1] = in[1]->vec[0];
- out[0]->vec[2] = in[2]->vec[0];
+ float y = in[0]->vec[0] * 255;
+ float cb = in[1]->vec[0] * 255;
+ float cr = in[2]->vec[0] * 255;
+
+ switch(node->custom1)
+ {
+ case 1:
+ ycc_to_rgb(y, cb, cr, &out[0]->vec[0], &out[0]->vec[1], &out[0]->vec[2], BLI_YCC_ITU_BT709);
+ break;
+ case 2:
+ ycc_to_rgb(y, cb, cr, &out[0]->vec[0], &out[0]->vec[1], &out[0]->vec[2], BLI_YCC_JFIF_0_255);
+ break;
+ case 0:
+ default:
+ ycc_to_rgb(y, cb, cr, &out[0]->vec[0], &out[0]->vec[1], &out[0]->vec[2], BLI_YCC_ITU_BT601);
+ break;
+ }
+
out[0]->vec[3] = in[3]->vec[0];
}
else {
@@ -169,29 +266,43 @@ static void node_composit_exec_combycca(void *data, bNode *node, bNodeStack **in
stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
- composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec,
- in[2]->data, in[2]->vec, in[3]->data, in[3]->vec,
- do_comb_ycca, CB_VAL, CB_VAL, CB_VAL, CB_VAL);
+
+ switch(node->custom1)
+ {
+ case 1:
+ composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec,
+ in[2]->data, in[2]->vec, in[3]->data, in[3]->vec,
+ do_comb_ycca_709, CB_VAL, CB_VAL, CB_VAL, CB_VAL);
+ break;
+
+ case 2:
+ composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec,
+ in[2]->data, in[2]->vec, in[3]->data, in[3]->vec,
+ do_comb_ycca_jfif, CB_VAL, CB_VAL, CB_VAL, CB_VAL);
+ break;
+ case 0:
+ default:
+ composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec,
+ in[2]->data, in[2]->vec, in[3]->data, in[3]->vec,
+ do_comb_ycca_601, CB_VAL, CB_VAL, CB_VAL, CB_VAL);
+ break;
+ }
out[0]->data= stackbuf;
}
}
-bNodeType cmp_node_combycca= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COMBYCCA,
- /* name */ "Combine YCbCrA",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_combycca_in,
- /* output sock */ cmp_node_combycca_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_combycca,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_combycca(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_COMBYCCA, "Combine YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_combycca_in, cmp_node_combycca_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_combycca);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c
index 13b71026054..99a625042df 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c
@@ -43,7 +43,7 @@ static bNodeSocketType cmp_node_sepyuva_out[]= {
{ -1, 0, "" }
};
-static void do_sepyuva(bNode *node, float *out, float *in)
+static void do_sepyuva(bNode *UNUSED(node), float *out, float *in)
{
float y, u, v;
@@ -55,7 +55,7 @@ static void do_sepyuva(bNode *node, float *out, float *in)
out[3]= in[3];
}
-static void node_composit_exec_sepyuva(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_sepyuva(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order out: bw channels */
/* stack order in: col */
@@ -96,22 +96,18 @@ static void node_composit_exec_sepyuva(void *data, bNode *node, bNodeStack **in,
}
}
-bNodeType cmp_node_sepyuva= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_SEPYUVA,
- /* name */ "Separate YUVA",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, 0,
- /* input sock */ cmp_node_sepyuva_in,
- /* output sock */ cmp_node_sepyuva_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_sepyuva,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_sepyuva(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_SEPYUVA, "Separate YUVA", NODE_CLASS_CONVERTOR, 0,
+ cmp_node_sepyuva_in, cmp_node_sepyuva_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_sepyuva);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** COMBINE YUVA ******************** */
@@ -127,7 +123,7 @@ static bNodeSocketType cmp_node_combyuva_out[]= {
{ -1, 0, "" }
};
-static void do_comb_yuva(bNode *node, float *out, float *in1, float *in2, float *in3, float *in4)
+static void do_comb_yuva(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4)
{
float r,g,b;
yuv_to_rgb(in1[0], in2[0], in3[0], &r, &g, &b);
@@ -138,7 +134,7 @@ static void do_comb_yuva(bNode *node, float *out, float *in1, float *in2, float
out[3] = in4[0];
}
-static void node_composit_exec_combyuva(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_combyuva(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order out: 1 rgba channels */
/* stack order in: 4 value channels */
@@ -171,20 +167,16 @@ static void node_composit_exec_combyuva(void *data, bNode *node, bNodeStack **in
}
}
-bNodeType cmp_node_combyuva= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COMBYUVA,
- /* name */ "Combine YUVA",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_combyuva_in,
- /* output sock */ cmp_node_combyuva_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_combyuva,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_combyuva(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_COMBYUVA, "Combine YUVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_combyuva_in, cmp_node_combyuva_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_combyuva);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c b/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c
index a7d10017c1f..106203ded7a 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c
@@ -40,7 +40,7 @@ static bNodeSocketType cmp_node_setalpha_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_setalpha(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_setalpha(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order out: RGBA image */
/* stack order in: col, alpha */
@@ -70,20 +70,15 @@ static void node_composit_exec_setalpha(void *data, bNode *node, bNodeStack **in
}
}
-bNodeType cmp_node_setalpha= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_SETALPHA,
- /* name */ "Set Alpha",
- /* width+range */ 120, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_setalpha_in,
- /* output sock */ cmp_node_setalpha_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_setalpha,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_setalpha(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_SETALPHA, "Set Alpha", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_setalpha_in, cmp_node_setalpha_out);
+ node_type_size(&ntype, 120, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_setalpha);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c b/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c
index 98bda1bd7fa..1bb0cdfcd10 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c
@@ -36,7 +36,7 @@ static bNodeSocketType cmp_node_splitviewer_in[]= {
{ -1, 0, "" }
};
-static void do_copy_split_rgba(bNode *node, float *out, float *in1, float *in2, float *fac)
+static void do_copy_split_rgba(bNode *UNUSED(node), float *out, float *in1, float *in2, float *fac)
{
if(*fac==0.0f) {
QUATCOPY(out, in1);
@@ -46,7 +46,7 @@ static void do_copy_split_rgba(bNode *node, float *out, float *in1, float *in2,
}
}
-static void node_composit_exec_splitviewer(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_splitviewer(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out))
{
/* image assigned to output */
/* stack order input sockets: image image */
@@ -146,22 +146,20 @@ static void node_composit_init_splitviewer(bNode* node)
node->custom1= 50; /* default 50% split */
}
-bNodeType cmp_node_splitviewer= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_SPLITVIEWER,
- /* name */ "SplitViewer",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_splitviewer_in,
- /* output sock */ NULL,
- /* storage */ "ImageUser",
- /* execfunc */ node_composit_exec_splitviewer,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_splitviewer,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_splitviewer(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_SPLITVIEWER, "SplitViewer", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_splitviewer_in, NULL);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_init(&ntype, node_composit_init_splitviewer);
+ node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_splitviewer);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c b/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
index f990fa452cb..63a43352b2a 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
@@ -79,7 +79,7 @@ static void texture_procedural(CompBuf *cbuf, float *out, float xco, float yco)
else {
VECCOPY(col, nor);
}
-
+
typecheck_compbuf_color(out, col, cbuf->type, cbuf->procedural_type);
}
@@ -96,19 +96,20 @@ static void node_composit_exec_texture(void *data, bNode *node, bNodeStack **in,
/* first make the preview image */
CompBuf *prevbuf= alloc_compbuf(140, 140, CB_RGBA, 1); /* alloc */
- /* Also take care about the render size! */
- sizex = (rd->size*rd->xsch)/100;
- sizey = (rd->size*rd->ysch)/100;
-
prevbuf->rect_procedural= texture_procedural;
prevbuf->node= node;
VECCOPY(prevbuf->procedural_offset, in[0]->vec);
VECCOPY(prevbuf->procedural_size, in[1]->vec);
prevbuf->procedural_type= CB_RGBA;
composit1_pixel_processor(node, prevbuf, prevbuf, out[0]->vec, do_copy_rgba, CB_RGBA);
+
generate_preview(data, node, prevbuf);
free_compbuf(prevbuf);
+ /* texture procedural buffer type doesnt work well, we now render a buffer in scene size */
+ sizex = (rd->size*rd->xsch)/100;
+ sizey = (rd->size*rd->ysch)/100;
+
if(out[0]->hasoutput) {
CompBuf *stackbuf= alloc_compbuf(sizex, sizey, CB_VAL, 1); /* alloc */
@@ -117,6 +118,8 @@ static void node_composit_exec_texture(void *data, bNode *node, bNodeStack **in,
VECCOPY(stackbuf->procedural_offset, in[0]->vec);
VECCOPY(stackbuf->procedural_size, in[1]->vec);
stackbuf->procedural_type= CB_VAL;
+ composit1_pixel_processor(node, stackbuf, stackbuf, out[0]->vec, do_copy_value, CB_VAL);
+ stackbuf->rect_procedural= NULL;
out[0]->data= stackbuf;
}
@@ -128,28 +131,25 @@ static void node_composit_exec_texture(void *data, bNode *node, bNodeStack **in,
VECCOPY(stackbuf->procedural_offset, in[0]->vec);
VECCOPY(stackbuf->procedural_size, in[1]->vec);
stackbuf->procedural_type= CB_RGBA;
+ composit1_pixel_processor(node, stackbuf, stackbuf, out[0]->vec, do_copy_rgba, CB_RGBA);
+ stackbuf->rect_procedural= NULL;
out[1]->data= stackbuf;
}
}
}
-bNodeType cmp_node_texture= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_TEXTURE,
- /* name */ "Texture",
- /* width+range */ 120, 80, 240,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- /* input sock */ cmp_node_texture_in,
- /* output sock */ cmp_node_texture_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_texture,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_texture(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
+ cmp_node_texture_in, cmp_node_texture_out);
+ node_type_size(&ntype, 120, 80, 240);
+ node_type_exec(&ntype, node_composit_exec_texture);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c b/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c
index 12f0c171f94..d58f0e827c2 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c
@@ -123,7 +123,7 @@ static void tonemap(NodeTonemap* ntm, CompBuf* dst, CompBuf* src)
}
-static void node_composit_exec_tonemap(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_tonemap(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
CompBuf *new, *img = in[0]->data;
@@ -158,19 +158,17 @@ static void node_composit_init_tonemap(bNode* node)
node->storage = ntm;
}
-bNodeType cmp_node_tonemap = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_TONEMAP,
- /* name */ "Tonemap",
- /* width+range */ 150, 120, 200,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_tonemap_in,
- /* output sock */ cmp_node_tonemap_out,
- /* storage */ "NodeTonemap",
- /* execfunc */ node_composit_exec_tonemap,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_tonemap,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_tonemap(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_TONEMAP, "Tonemap", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_tonemap_in, cmp_node_tonemap_out);
+ node_type_size(&ntype, 150, 120, 200);
+ node_type_init(&ntype, node_composit_init_tonemap);
+ node_type_storage(&ntype, "NodeTonemap", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_tonemap);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_translate.c b/source/blender/nodes/intern/CMP_nodes/CMP_translate.c
index ca359d436f6..cad4d79b75c 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_translate.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_translate.c
@@ -43,7 +43,7 @@ static bNodeSocketType cmp_node_translate_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_translate(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_translate(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in, bNodeStack **out)
{
if(in[0]->data) {
CompBuf *cbuf= in[0]->data;
@@ -56,20 +56,16 @@ static void node_composit_exec_translate(void *data, bNode *node, bNodeStack **i
}
}
-bNodeType cmp_node_translate= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_TRANSLATE,
- /* name */ "Translate",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ cmp_node_translate_in,
- /* output sock */ cmp_node_translate_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_translate,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_translate(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ cmp_node_translate_in, cmp_node_translate_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_translate);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c b/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c
index 6ce03f38cdb..2000e411f8c 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c
@@ -46,7 +46,7 @@ static void do_colorband_composit(bNode *node, float *out, float *in)
do_colorband(node->storage, in[0], out);
}
-static void node_composit_exec_valtorgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_valtorgb(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: fac */
/* stack order out: col, alpha */
@@ -80,23 +80,20 @@ static void node_composit_init_valtorgb(bNode* node)
node->storage= add_colorband(1);
}
-bNodeType cmp_node_valtorgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_VALTORGB,
- /* name */ "ColorRamp",
- /* width+range */ 240, 200, 300,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_valtorgb_in,
- /* output sock */ cmp_node_valtorgb_out,
- /* storage */ "ColorBand",
- /* execfunc */ node_composit_exec_valtorgb,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_valtorgb,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-
-};
+void register_node_type_cmp_valtorgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_valtorgb_in, cmp_node_valtorgb_out);
+ node_type_size(&ntype, 240, 200, 300);
+ node_type_init(&ntype, node_composit_init_valtorgb);
+ node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_valtorgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** RGBTOBW ******************** */
@@ -109,12 +106,12 @@ static bNodeSocketType cmp_node_rgbtobw_out[]= {
{ -1, 0, "" }
};
-static void do_rgbtobw(bNode *node, float *out, float *in)
+static void do_rgbtobw(bNode *UNUSED(node), float *out, float *in)
{
out[0]= in[0]*0.35f + in[1]*0.45f + in[2]*0.2f;
}
-static void node_composit_exec_rgbtobw(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_rgbtobw(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order out: bw */
/* stack order in: col */
@@ -137,21 +134,14 @@ static void node_composit_exec_rgbtobw(void *data, bNode *node, bNodeStack **in,
}
}
-bNodeType cmp_node_rgbtobw= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_RGBTOBW,
- /* name */ "RGB to BW",
- /* width+range */ 80, 40, 120,
- /* class+opts */ NODE_CLASS_CONVERTOR, 0,
- /* input sock */ cmp_node_rgbtobw_in,
- /* output sock */ cmp_node_rgbtobw_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_rgbtobw,
- /* butfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_cmp_rgbtobw(ListBase *lb)
+{
+ static bNodeType ntype;
-};
-
-
+ node_type_base(&ntype, CMP_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0,
+ cmp_node_rgbtobw_in, cmp_node_rgbtobw_out);
+ node_type_size(&ntype, 80, 40, 120);
+ node_type_exec(&ntype, node_composit_exec_rgbtobw);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_value.c b/source/blender/nodes/intern/CMP_nodes/CMP_value.c
index 14a3b6fe15c..787c9135898 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_value.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_value.c
@@ -35,27 +35,23 @@ static bNodeSocketType cmp_node_value_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_value(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_value(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
out[0]->vec[0]= sock->ns.vec[0];
}
-bNodeType cmp_node_value= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_VALUE,
- /* name */ "Value",
- /* width+range */ 80, 40, 120,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ cmp_node_value_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_value,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_value(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS,
+ NULL, cmp_node_value_out);
+ node_type_size(&ntype, 80, 40, 120);
+ node_type_exec(&ntype, node_composit_exec_value);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c b/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c
index eaeeadd02af..71c8c48db7a 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c
@@ -44,7 +44,7 @@ static bNodeSocketType cmp_node_vecblur_out[]= {
-static void node_composit_exec_vecblur(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_vecblur(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
NodeBlurData *nbd= node->storage;
CompBuf *new, *img= in[0]->data, *vecbuf= in[2]->data, *zbuf= in[1]->data;
@@ -91,20 +91,18 @@ static void node_composit_init_vecblur(bNode* node)
};
/* custom1: itterations, custom2: maxspeed (0 = nolimit) */
-bNodeType cmp_node_vecblur= {
- /* next, prev */ NULL, NULL,
- /* type code */ CMP_NODE_VECBLUR,
- /* name */ "Vector Blur",
- /* width+range */ 120, 80, 200,
- /* class+opts */ NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- /* input sock */ cmp_node_vecblur_in,
- /* output sock */ cmp_node_vecblur_out,
- /* storage */ "NodeBlurData",
- /* execfunc */ node_composit_exec_vecblur,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_vecblur,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_vecblur(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_VECBLUR, "Vector Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
+ cmp_node_vecblur_in, cmp_node_vecblur_out);
+ node_type_size(&ntype, 120, 80, 200);
+ node_type_init(&ntype, node_composit_init_vecblur);
+ node_type_storage(&ntype, "NodeBlurData", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_vecblur);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c b/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c
index 80200ad9ce6..f23a82e1dc2 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c
@@ -39,7 +39,7 @@ static bNodeSocketType cmp_node_viewer_in[]= {
};
-static void node_composit_exec_viewer(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_viewer(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out))
{
/* image assigned to output */
/* stack order input sockets: col, alpha, z */
@@ -128,21 +128,18 @@ static void node_composit_init_viewer(bNode* node)
iuser->ok= 1;
}
-bNodeType cmp_node_viewer= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_VIEWER,
- /* name */ "Viewer",
- /* width+range */ 80, 60, 200,
- /* class+opts */ NODE_CLASS_OUTPUT, NODE_PREVIEW,
- /* input sock */ cmp_node_viewer_in,
- /* output sock */ NULL,
- /* storage */ "ImageUser",
- /* execfunc */ node_composit_exec_viewer,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_viewer,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-
-};
+void register_node_type_cmp_viewer(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, NODE_PREVIEW,
+ cmp_node_viewer_in, NULL);
+ node_type_size(&ntype, 80, 60, 200);
+ node_type_init(&ntype, node_composit_init_viewer);
+ node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_viewer);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c b/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
index 7be9f34f00b..675eae74a53 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
@@ -31,7 +31,7 @@
/* **************** Z COMBINE ******************** */
- /* lazy coder note: node->custom1 is abused to send signal */
+ /* lazy coder note: node->custom2 is abused to send signal */
static bNodeSocketType cmp_node_zcombine_in[]= {
{ SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
{ SOCK_VALUE, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f},
@@ -47,13 +47,40 @@ static bNodeSocketType cmp_node_zcombine_out[]= {
static void do_zcombine(bNode *node, float *out, float *src1, float *z1, float *src2, float *z2)
{
+ float alpha;
+ float malpha;
+
if(*z1 <= *z2) {
- QUATCOPY(out, src1);
+ if (node->custom1) {
+ // use alpha in combine operation
+ alpha= src1[3];
+ malpha= 1.0f - alpha;
+ out[0]= malpha*src2[0] + alpha*src1[0];
+ out[1]= malpha*src2[1] + alpha*src1[1];
+ out[2]= malpha*src2[2] + alpha*src1[2];
+ out[3]= malpha*src2[3] + alpha*src1[3];
+ }
+ else {
+ // do combination based solely on z value
+ QUATCOPY(out, src1);
+ }
}
else {
- QUATCOPY(out, src2);
+ if (node->custom1) {
+ // use alpha in combine operation
+ alpha= src2[3];
+ malpha= 1.0f - alpha;
+ out[0]= malpha*src1[0] + alpha*src2[0];
+ out[1]= malpha*src1[1] + alpha*src2[1];
+ out[2]= malpha*src1[2] + alpha*src2[2];
+ out[3]= malpha*src1[3] + alpha*src2[3];
+ }
+ else {
+ // do combination based solely on z value
+ QUATCOPY(out, src1);
+ }
- if(node->custom1)
+ if(node->custom2)
*z1= *z2;
}
}
@@ -62,20 +89,49 @@ static void do_zcombine_mask(bNode *node, float *out, float *z1, float *z2)
{
if(*z1 > *z2) {
*out= 1.0f;
- if(node->custom1)
+ if(node->custom2)
*z1= *z2;
}
}
static void do_zcombine_add(bNode *node, float *out, float *col1, float *col2, float *acol)
{
- float alpha= *acol;
- float malpha= 1.0f - alpha;
-
- out[0]= malpha*col1[0] + alpha*col2[0];
- out[1]= malpha*col1[1] + alpha*col2[1];
- out[2]= malpha*col1[2] + alpha*col2[2];
- out[3]= malpha*col1[3] + alpha*col2[3];
+ float alpha;
+ float malpha;
+
+ if (node->custom1) {
+ // use alpha in combine operation, antialiased mask in used here just as hint for the z value
+ if (*acol>0.0f) {
+ alpha= col2[3];
+ malpha= 1.0f - alpha;
+
+
+ out[0]= malpha*col1[0] + alpha*col2[0];
+ out[1]= malpha*col1[1] + alpha*col2[1];
+ out[2]= malpha*col1[2] + alpha*col2[2];
+ out[3]= malpha*col1[3] + alpha*col2[3];
+ }
+ else {
+ alpha= col1[3];
+ malpha= 1.0f - alpha;
+
+
+ out[0]= malpha*col2[0] + alpha*col1[0];
+ out[1]= malpha*col2[1] + alpha*col1[1];
+ out[2]= malpha*col2[2] + alpha*col1[2];
+ out[3]= malpha*col2[3] + alpha*col1[3];
+ }
+ }
+ else {
+ // do combination based solely on z value but with antialiased mask
+ alpha = *acol;
+ malpha= 1.0f - alpha;
+
+ out[0]= malpha*col1[0] + alpha*col2[0];
+ out[1]= malpha*col1[1] + alpha*col2[1];
+ out[2]= malpha*col1[2] + alpha*col2[2];
+ out[3]= malpha*col1[3] + alpha*col2[3];
+ }
}
static void node_composit_exec_zcombine(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
@@ -107,11 +163,11 @@ static void node_composit_exec_zcombine(void *data, bNode *node, bNodeStack **in
*zval= in[1]->vec[0];
}
/* lazy coder hack */
- node->custom1= 1;
+ node->custom2= 1;
out[1]->data= zbuf;
}
else {
- node->custom1= 0;
+ node->custom2= 0;
zbuf= in[1]->data;
}
@@ -163,20 +219,15 @@ static void node_composit_exec_zcombine(void *data, bNode *node, bNodeStack **in
}
-bNodeType cmp_node_zcombine= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_ZCOMBINE,
- /* name */ "Z Combine",
- /* width+range */ 80, 40, 120,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_zcombine_in,
- /* output sock */ cmp_node_zcombine_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_zcombine,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_zcombine(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_ZCOMBINE, "Z Combine", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_zcombine_in, cmp_node_zcombine_out);
+ node_type_size(&ntype, 80, 40, 120);
+ node_type_exec(&ntype, node_composit_exec_zcombine);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/Makefile b/source/blender/nodes/intern/CMP_nodes/Makefile
deleted file mode 100644
index 5e97864fb95..00000000000
--- a/source/blender/nodes/intern/CMP_nodes/Makefile
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = nodes_cmp
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../../makesdna
-CPPFLAGS += -I../../../makesrna
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../editors/include
-CPPFLAGS += -I../../../imbuf
-CPPFLAGS += -I../../../render/extern/include
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
diff --git a/source/blender/nodes/intern/CMP_util.c b/source/blender/nodes/intern/CMP_util.c
index 9edcc8b0eec..9e2fed1877e 100644
--- a/source/blender/nodes/intern/CMP_util.c
+++ b/source/blender/nodes/intern/CMP_util.c
@@ -414,12 +414,12 @@ CompBuf *typecheck_compbuf(CompBuf *inbuf, int type)
return inbuf;
}
-float *compbuf_get_pixel(CompBuf *cbuf, float *rectf, int x, int y, int xrad, int yrad)
+static float *compbuf_get_pixel(CompBuf *cbuf, float *defcol, float *use, int x, int y, int xrad, int yrad)
{
if(cbuf) {
if(cbuf->rect_procedural) {
- cbuf->rect_procedural(cbuf, rectf, (float)x/(float)xrad, (float)y/(float)yrad);
- return rectf;
+ cbuf->rect_procedural(cbuf, use, (float)x/(float)xrad, (float)y/(float)yrad);
+ return use;
}
else {
static float col[4]= {0.0f, 0.0f, 0.0f, 0.0f};
@@ -434,7 +434,7 @@ float *compbuf_get_pixel(CompBuf *cbuf, float *rectf, int x, int y, int xrad, in
return cbuf->rect + cbuf->type*( (cbuf->yrad+y)*cbuf->x + (cbuf->xrad+x) );
}
}
- else return rectf;
+ else return defcol;
}
/* **************************************************** */
@@ -446,6 +446,7 @@ void composit1_pixel_processor(bNode *node, CompBuf *out, CompBuf *src_buf, floa
{
CompBuf *src_use;
float *outfp=out->rect, *srcfp;
+ float color[4]; /* local color if compbuf is procedural */
int xrad, yrad, x, y;
src_use= typecheck_compbuf(src_buf, src_type);
@@ -455,7 +456,7 @@ void composit1_pixel_processor(bNode *node, CompBuf *out, CompBuf *src_buf, floa
for(y= -yrad; y<-yrad+out->y; y++) {
for(x= -xrad; x<-xrad+out->x; x++, outfp+=out->type) {
- srcfp= compbuf_get_pixel(src_use, src_col, x, y, xrad, yrad);
+ srcfp= compbuf_get_pixel(src_use, src_col, color, x, y, xrad, yrad);
func(node, outfp, srcfp);
}
}
@@ -471,6 +472,7 @@ void composit2_pixel_processor(bNode *node, CompBuf *out, CompBuf *src_buf, floa
{
CompBuf *src_use, *fac_use;
float *outfp=out->rect, *srcfp, *facfp;
+ float color[4]; /* local color if compbuf is procedural */
int xrad, yrad, x, y;
src_use= typecheck_compbuf(src_buf, src_type);
@@ -481,8 +483,8 @@ void composit2_pixel_processor(bNode *node, CompBuf *out, CompBuf *src_buf, floa
for(y= -yrad; y<-yrad+out->y; y++) {
for(x= -xrad; x<-xrad+out->x; x++, outfp+=out->type) {
- srcfp= compbuf_get_pixel(src_use, src_col, x, y, xrad, yrad);
- facfp= compbuf_get_pixel(fac_use, fac, x, y, xrad, yrad);
+ srcfp= compbuf_get_pixel(src_use, src_col, color, x, y, xrad, yrad);
+ facfp= compbuf_get_pixel(fac_use, fac, color, x, y, xrad, yrad);
func(node, outfp, srcfp, facfp);
}
@@ -500,6 +502,7 @@ void composit3_pixel_processor(bNode *node, CompBuf *out, CompBuf *src1_buf, flo
{
CompBuf *src1_use, *src2_use, *fac_use;
float *outfp=out->rect, *src1fp, *src2fp, *facfp;
+ float color[4]; /* local color if compbuf is procedural */
int xrad, yrad, x, y;
src1_use= typecheck_compbuf(src1_buf, src1_type);
@@ -511,9 +514,9 @@ void composit3_pixel_processor(bNode *node, CompBuf *out, CompBuf *src1_buf, flo
for(y= -yrad; y<-yrad+out->y; y++) {
for(x= -xrad; x<-xrad+out->x; x++, outfp+=out->type) {
- src1fp= compbuf_get_pixel(src1_use, src1_col, x, y, xrad, yrad);
- src2fp= compbuf_get_pixel(src2_use, src2_col, x, y, xrad, yrad);
- facfp= compbuf_get_pixel(fac_use, fac, x, y, xrad, yrad);
+ src1fp= compbuf_get_pixel(src1_use, src1_col, color, x, y, xrad, yrad);
+ src2fp= compbuf_get_pixel(src2_use, src2_col, color, x, y, xrad, yrad);
+ facfp= compbuf_get_pixel(fac_use, fac, color, x, y, xrad, yrad);
func(node, outfp, src1fp, src2fp, facfp);
}
@@ -535,6 +538,7 @@ void composit4_pixel_processor(bNode *node, CompBuf *out, CompBuf *src1_buf, flo
{
CompBuf *src1_use, *src2_use, *fac1_use, *fac2_use;
float *outfp=out->rect, *src1fp, *src2fp, *fac1fp, *fac2fp;
+ float color[4]; /* local color if compbuf is procedural */
int xrad, yrad, x, y;
src1_use= typecheck_compbuf(src1_buf, src1_type);
@@ -547,10 +551,10 @@ void composit4_pixel_processor(bNode *node, CompBuf *out, CompBuf *src1_buf, flo
for(y= -yrad; y<-yrad+out->y; y++) {
for(x= -xrad; x<-xrad+out->x; x++, outfp+=out->type) {
- src1fp= compbuf_get_pixel(src1_use, src1_col, x, y, xrad, yrad);
- src2fp= compbuf_get_pixel(src2_use, src2_col, x, y, xrad, yrad);
- fac1fp= compbuf_get_pixel(fac1_use, fac1, x, y, xrad, yrad);
- fac2fp= compbuf_get_pixel(fac2_use, fac2, x, y, xrad, yrad);
+ src1fp= compbuf_get_pixel(src1_use, src1_col, color, x, y, xrad, yrad);
+ src2fp= compbuf_get_pixel(src2_use, src2_col, color, x, y, xrad, yrad);
+ fac1fp= compbuf_get_pixel(fac1_use, fac1, color, x, y, xrad, yrad);
+ fac2fp= compbuf_get_pixel(fac2_use, fac2, color, x, y, xrad, yrad);
func(node, outfp, src1fp, fac1fp, src2fp, fac2fp);
}
@@ -662,59 +666,59 @@ void generate_preview(void *data, bNode *node, CompBuf *stackbuf)
}
}
-void do_rgba_to_yuva(bNode *node, float *out, float *in)
+void do_rgba_to_yuva(bNode *UNUSED(node), float *out, float *in)
{
rgb_to_yuv(in[0],in[1],in[2], &out[0], &out[1], &out[2]);
out[3]=in[3];
}
-void do_rgba_to_hsva(bNode *node, float *out, float *in)
+void do_rgba_to_hsva(bNode *UNUSED(node), float *out, float *in)
{
rgb_to_hsv(in[0],in[1],in[2], &out[0], &out[1], &out[2]);
out[3]=in[3];
}
-void do_rgba_to_ycca(bNode *node, float *out, float *in)
+void do_rgba_to_ycca(bNode *UNUSED(node), float *out, float *in)
{
rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601);
out[3]=in[3];
}
-void do_yuva_to_rgba(bNode *node, float *out, float *in)
+void do_yuva_to_rgba(bNode *UNUSED(node), float *out, float *in)
{
yuv_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2]);
out[3]=in[3];
}
-void do_hsva_to_rgba(bNode *node, float *out, float *in)
+void do_hsva_to_rgba(bNode *UNUSED(node), float *out, float *in)
{
hsv_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2]);
out[3]=in[3];
}
-void do_ycca_to_rgba(bNode *node, float *out, float *in)
+void do_ycca_to_rgba(bNode *UNUSED(node), float *out, float *in)
{
ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601);
out[3]=in[3];
}
-void do_copy_rgba(bNode *node, float *out, float *in)
+void do_copy_rgba(bNode *UNUSED(node), float *out, float *in)
{
QUATCOPY(out, in);
}
-void do_copy_rgb(bNode *node, float *out, float *in)
+void do_copy_rgb(bNode *UNUSED(node), float *out, float *in)
{
VECCOPY(out, in);
out[3]= 1.0f;
}
-void do_copy_value(bNode *node, float *out, float *in)
+void do_copy_value(bNode *UNUSED(node), float *out, float *in)
{
out[0]= in[0];
}
-void do_copy_a_rgba(bNode *node, float *out, float *in, float *fac)
+void do_copy_a_rgba(bNode *UNUSED(node), float *out, float *in, float *fac)
{
VECCOPY(out, in);
out[3]= *fac;
@@ -1303,7 +1307,7 @@ CompBuf* qd_downScaledCopy(CompBuf* src, int scale)
void IIR_gauss(CompBuf* src, float sigma, int chan, int xy)
{
double q, q2, sc, cf[4], tsM[9], tsu[3], tsv[3];
- float *X, *Y, *W;
+ double *X, *Y, *W;
int i, x, y, sz;
// <0.5 not valid, though can have a possibly useful sort of sharpening effect
@@ -1367,9 +1371,9 @@ void IIR_gauss(CompBuf* src, float sigma, int chan, int xy)
// intermediate buffers
sz = MAX2(src->x, src->y);
- X = MEM_callocN(sz*sizeof(float), "IIR_gauss X buf");
- Y = MEM_callocN(sz*sizeof(float), "IIR_gauss Y buf");
- W = MEM_callocN(sz*sizeof(float), "IIR_gauss W buf");
+ X = MEM_callocN(sz*sizeof(double), "IIR_gauss X buf");
+ Y = MEM_callocN(sz*sizeof(double), "IIR_gauss Y buf");
+ W = MEM_callocN(sz*sizeof(double), "IIR_gauss W buf");
if (xy & 1) { // H
for (y=0; y<src->y; ++y) {
const int yx = y*src->x;
diff --git a/source/blender/nodes/intern/CMP_util.h b/source/blender/nodes/intern/CMP_util.h
index 9dfea6abf54..efb711ab416 100644
--- a/source/blender/nodes/intern/CMP_util.h
+++ b/source/blender/nodes/intern/CMP_util.h
@@ -46,25 +46,28 @@
#include "DNA_scene_types.h"
#include "DNA_texture_types.h"
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_rand.h"
+#include "BLI_threads.h"
+#include "BLI_utildefines.h"
+#include "BLI_utildefines.h"
+
#include "BKE_blender.h"
#include "BKE_colortools.h"
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_material.h"
+#include "BKE_node.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "BKE_library.h"
#include "BKE_object.h"
#include "../CMP_node.h"
#include "node_util.h"
-#include "BLI_math.h"
-#include "BLI_blenlib.h"
-#include "BLI_rand.h"
-#include "BLI_threads.h"
-
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -117,7 +120,6 @@ CompBuf *get_cropped_compbuf(rcti *drect, float *rectf, int rectx, int recty, in
CompBuf *scalefast_compbuf(CompBuf *inbuf, int newx, int newy);
CompBuf *typecheck_compbuf(CompBuf *inbuf, int type);
void typecheck_compbuf_color(float *out, float *in, int outtype, int intype);
-float *compbuf_get_pixel(CompBuf *cbuf, float *rectf, int x, int y, int xrad, int yrad);
/* **************************************************** */
@@ -163,7 +165,7 @@ void convolve(CompBuf* dst, CompBuf* in1, CompBuf* in2);
extern void node_ID_title_cb(void *node_v, void *unused_v);
-/* utility functions used by glare, tonemap and lense distortion */
+/* utility functions used by glare, tonemap and lens distortion */
/* soms macros for color handling */
typedef float fRGB[4];
/* clear color */
diff --git a/source/blender/nodes/intern/Makefile b/source/blender/nodes/intern/Makefile
deleted file mode 100644
index 1ffc09bce2c..00000000000
--- a/source/blender/nodes/intern/Makefile
+++ /dev/null
@@ -1,51 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = nodes
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../editors/include
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../render/extern/include
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-DIRS = SHD_nodes CMP_nodes TEX_nodes
-include nan_subdirs.mk
diff --git a/source/blender/nodes/intern/SHD_nodes/Makefile b/source/blender/nodes/intern/SHD_nodes/Makefile
deleted file mode 100644
index 666ffd4a7d3..00000000000
--- a/source/blender/nodes/intern/SHD_nodes/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = nodes_shd
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I../../../python
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../../makesdna
-CPPFLAGS += -I../../../makesrna
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../editors/include
-CPPFLAGS += -I../../../imbuf
-CPPFLAGS += -I../../../render/extern/include
-CPPFLAGS += -I../../../gpu
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_camera.c b/source/blender/nodes/intern/SHD_nodes/SHD_camera.c
index d89099955aa..82c060ed1d6 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_camera.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_camera.c
@@ -38,7 +38,7 @@ static bNodeSocketType sh_node_camera_out[]= {
};
-static void node_shader_exec_camera(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_camera(void *data, bNode *UNUSED(node), bNodeStack **UNUSED(in), bNodeStack **out)
{
if(data) {
ShadeInput *shi= ((ShaderCallData *)data)->shi; /* Data we need for shading. */
@@ -49,26 +49,23 @@ static void node_shader_exec_camera(void *data, bNode *node, bNodeStack **in, bN
}
}
-static int gpu_shader_camera(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+static int gpu_shader_camera(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
{
return GPU_stack_link(mat, "camera", in, out, GPU_builtin(GPU_VIEW_POSITION));
}
-bNodeType sh_node_camera= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_CAMERA,
- /* name */ "Camera Data",
- /* width+range */ 95, 95, 120,
- /* class+opts */ NODE_CLASS_INPUT, 0,
- /* input sock */ NULL,
- /* output sock */ sh_node_camera_out,
- /* storage */ "node_camera",
- /* execfunc */ node_shader_exec_camera,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_camera
-};
+void register_node_type_sh_camera(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_CAMERA, "Camera Data", NODE_CLASS_INPUT, 0,
+ NULL, sh_node_camera_out);
+ node_type_size(&ntype, 95, 95, 120);
+ node_type_storage(&ntype, "node_camera", NULL, NULL);
+ node_type_exec(&ntype, node_shader_exec_camera);
+ node_type_gpu(&ntype, gpu_shader_camera);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_curves.c b/source/blender/nodes/intern/SHD_nodes/SHD_curves.c
index 4e47e75993d..405c455501c 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_curves.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_curves.c
@@ -42,7 +42,7 @@ static bNodeSocketType sh_node_curve_vec_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_curve_vec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_curve_vec(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
float vec[3];
@@ -66,24 +66,21 @@ static int gpu_shader_curve_vec(GPUMaterial *mat, bNode *node, GPUNodeStack *in,
return GPU_stack_link(mat, "curves_vec", in, out, GPU_texture(size, array));
}
-bNodeType sh_node_curve_vec= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_CURVE_VEC,
- /* name */ "Vector Curves",
- /* width+range */ 200, 140, 320,
- /* class+opts */ NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- /* input sock */ sh_node_curve_vec_in,
- /* output sock */ sh_node_curve_vec_out,
- /* storage */ "CurveMapping",
- /* execfunc */ node_shader_exec_curve_vec,
- /* butfunc */ NULL,
- /* initfunc */ node_shader_init_curve_vec,
- /* freestoragefunc */ node_free_curves,
- /* copystoragefunc */ node_copy_curves,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_curve_vec
-
-};
+void register_node_type_sh_curve_vec(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
+ sh_node_curve_vec_in, sh_node_curve_vec_out);
+ node_type_size(&ntype, 200, 140, 320);
+ node_type_init(&ntype, node_shader_init_curve_vec);
+ node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+ node_type_exec(&ntype, node_shader_exec_curve_vec);
+ node_type_gpu(&ntype, gpu_shader_curve_vec);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** CURVE RGB ******************** */
static bNodeSocketType sh_node_curve_rgb_in[]= {
@@ -97,7 +94,7 @@ static bNodeSocketType sh_node_curve_rgb_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_curve_rgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_curve_rgb(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
float vec[3];
@@ -123,21 +120,18 @@ static int gpu_shader_curve_rgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in,
return GPU_stack_link(mat, "curves_rgb", in, out, GPU_texture(size, array));
}
-bNodeType sh_node_curve_rgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_CURVE_RGB,
- /* name */ "RGB Curves",
- /* width+range */ 200, 140, 320,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ sh_node_curve_rgb_in,
- /* output sock */ sh_node_curve_rgb_out,
- /* storage */ "CurveMapping",
- /* execfunc */ node_shader_exec_curve_rgb,
- /* butfunc */ NULL,
- /* initfunc */ node_shader_init_curve_rgb,
- /* freestoragefunc */ node_free_curves,
- /* copystoragefunc */ node_copy_curves,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_curve_rgb
-};
+void register_node_type_sh_curve_rgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ sh_node_curve_rgb_in, sh_node_curve_rgb_out);
+ node_type_size(&ntype, 200, 140, 320);
+ node_type_init(&ntype, node_shader_init_curve_rgb);
+ node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+ node_type_exec(&ntype, node_shader_exec_curve_rgb);
+ node_type_gpu(&ntype, gpu_shader_curve_rgb);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c b/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
index 5e391e02feb..315655d68bf 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DISABLE_PYTHON
+/* TODO, support python3.x */
+#undef WITH_PYTHON
+
+#ifdef WITH_PYTHON
#include <Python.h>
#include <compile.h>
#include <eval.h>
#endif
-/* TODO, support python3.x */
-#define DISABLE_PYTHON 1
-
#include "DNA_text_types.h"
#include "BKE_text.h"
-#include "BKE_utildefines.h"
+
// XXX
#if 0
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "api2_2x/Node.h"
#include "api2_2x/gen_utils.h"
#include "BPY_extern.h"
@@ -57,7 +57,7 @@ static void node_dynamic_setup(bNode *node);
static void node_dynamic_exec_cb(void *data, bNode *node, bNodeStack **in, bNodeStack **out);
static void node_dynamic_free_storage_cb(bNode *node);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static PyObject *init_dynamicdict(void) {
PyObject *newscriptdict, *item;
PyGILState_STATE gilstate = PyGILState_Ensure();
@@ -156,7 +156,7 @@ static void node_dynamic_update_socket_links(bNode *node, bNodeTree *ntree)
static void node_dynamic_free_storage_cb(bNode *node)
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
NodeScriptDict *nsd;
PyObject *pydict;
BPy_Node *pynode;
@@ -186,7 +186,7 @@ static void node_dynamic_disable(bNode *node)
/* Disable all pynodes using the given text (script) id */
static void node_dynamic_disable_all_by_id(ID *id)
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
Material *ma; /* XXX hardcoded for shaders */
for (ma= G.main->mat.first; ma; ma= ma->id.next) {
@@ -346,7 +346,7 @@ int nodeDynamicUnlinkText(ID *txtid) {
static void node_dynamic_pyerror_print(bNode *node)
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyGILState_STATE gilstate = PyGILState_Ensure();
fprintf(stderr, "\nError in dynamic node script \"%s\":\n", node->name);
@@ -373,7 +373,7 @@ static void node_dynamic_register_type(bNode *node)
node->typeinfo->name = BLI_strdup(node->name);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* node_dynamic_get_pynode:
* Find the pynode definition from the script */
static PyObject *node_dynamic_get_pynode(PyObject *dict)
@@ -415,11 +415,11 @@ static PyObject *node_dynamic_get_pynode(PyObject *dict)
"no PyNode definition found in the script!");
return NULL;
}
-#endif /* DISABLE_PYTHON */
+#endif /* WITH_PYTHON */
static int node_dynamic_parse(struct bNode *node)
{
-#ifdef DISABLE_PYTHON
+#ifndef WITH_PYTHON
return -1;
#else
PyObject *dict= NULL;
@@ -516,7 +516,7 @@ static int node_dynamic_parse(struct bNode *node)
* pynodes already linked to a script (node->id != NULL). */
static void node_dynamic_setup(bNode *node)
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
NodeScriptDict *nsd = NULL;
bNodeTree *nodetree = NULL;
bNodeType *ntype = NULL;
@@ -640,7 +640,7 @@ static void node_dynamic_setup(bNode *node)
node->custom1 = BSET(node->custom1, NODE_DYNAMIC_READY);
PyGILState_Release(gilstate);
-#endif /* DISABLE_PYTHON */
+#endif /* WITH_PYTHON */
return;
}
@@ -673,7 +673,7 @@ static void node_dynamic_init_cb(bNode *node) {
/* node_dynamic_copy_cb: pynode copy callback */
static void node_dynamic_copy_cb(bNode *orig_node, bNode *new_node)
{
-#ifdef DISABLE_PYTHON
+#ifndef WITH_PYTHON
return;
#else
NodeScriptDict *nsd;
@@ -698,7 +698,7 @@ static void node_dynamic_copy_cb(bNode *orig_node, bNode *new_node)
/* node_dynamic_exec_cb: the execution callback called per pixel
* during rendering. */
static void node_dynamic_exec_cb(void *data, bNode *node, bNodeStack **in, bNodeStack **out) {
-#ifdef DISABLE_PYTHON
+#ifndef WITH_PYTHON
return;
#else
BPy_Node *mynode = NULL;
@@ -758,26 +758,29 @@ static void node_dynamic_exec_cb(void *data, bNode *node, bNodeStack **in, bNode
#endif
}
-bNodeType node_dynamic_typeinfo = {
- /* next, prev */ NULL, NULL,
- /* type code */ NODE_DYNAMIC,
- /* name */ "Dynamic",
- /* width+range */ 150, 60, 300,
- /* class+opts */ NODE_CLASS_OP_DYNAMIC, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ NULL,
- /* storage */ "NodeScriptDict",
- /* execfunc */ node_dynamic_exec_cb,
- /* butfunc */ NULL,
- /* initfunc */ node_dynamic_init_cb,
- /* freefunc */ node_dynamic_free_storage_cb,
- /* copyfunc */ node_dynamic_copy_cb,
- /* id */ NULL
-};
+void register_node_type_sh_dynamic(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_DYNAMIC, "Dynamic", NODE_CLASS_OP_DYNAMIC, NODE_OPTIONS, NULL, NULL);
+ node_type_size(&ntype, 150, 60, 300);
+ node_type_init(&ntype, node_dynamic_init_cb);
+ node_type_storage(&ntype, "NodeScriptDict", node_dynamic_free_storage_cb, node_dynamic_copy_cb);
+ node_type_exec(&ntype, node_dynamic_exec_cb);
+
+ nodeRegisterType(lb, &ntype);
+}
#else
-bNodeType node_dynamic_typeinfo = {NULL};
+void register_node_type_sh_dynamic(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, 0, "", 0, 0, NULL, NULL);
+
+ nodeRegisterType(lb, &ntype);
+}
#endif
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c b/source/blender/nodes/intern/SHD_nodes/SHD_geom.c
index aefe7d104b5..32fe457c2d8 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_geom.c
@@ -47,7 +47,7 @@ static bNodeSocketType sh_node_geom_out[]= {
};
/* node execute callback */
-static void node_shader_exec_geom(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_geom(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
if(data) {
ShadeInput *shi= ((ShaderCallData *)data)->shi;
@@ -131,21 +131,18 @@ static int gpu_shader_geom(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUN
}
/* node type definition */
-bNodeType sh_node_geom= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_GEOMETRY,
- /* name */ "Geometry",
- /* width+range */ 120, 80, 160,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ sh_node_geom_out,
- /* storage */ "NodeGeometry",
- /* execfunc */ node_shader_exec_geom,
- /* butfunc */ NULL,
- /* initfunc */ node_shader_init_geometry,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_geom
-
-};
+void register_node_type_sh_geom(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_GEOMETRY, "Geometry", NODE_CLASS_INPUT, NODE_OPTIONS,
+ NULL, sh_node_geom_out);
+ node_type_size(&ntype, 120, 80, 160);
+ node_type_init(&ntype, node_shader_init_geometry);
+ node_type_storage(&ntype, "NodeGeometry", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_shader_exec_geom);
+ node_type_gpu(&ntype, gpu_shader_geom);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c b/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
index 4f319f8937c..6fd8ece8ec9 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
@@ -45,7 +45,7 @@ static bNodeSocketType sh_node_hue_sat_out[]= {
};
/* note: it would be possible to use CMP version for both nodes */
-static void do_hue_sat_fac(bNode *node, float *out, float *hue, float *sat, float *val, float *in, float *fac)
+static void do_hue_sat_fac(bNode *UNUSED(node), float *out, float *hue, float *sat, float *val, float *in, float *fac)
{
if(*fac!=0.0f && (*hue!=0.5f || *sat!=1.0 || *val!=1.0)) {
float col[3], hsv[3], mfac= 1.0f - *fac;
@@ -66,34 +66,29 @@ static void do_hue_sat_fac(bNode *node, float *out, float *hue, float *sat, floa
}
}
-static void node_shader_exec_hue_sat(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_hue_sat(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
do_hue_sat_fac(node, out[0]->vec, in[0]->vec, in[1]->vec, in[2]->vec, in[4]->vec, in[3]->vec);
}
-static int gpu_shader_hue_sat(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+static int gpu_shader_hue_sat(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
{
return GPU_stack_link(mat, "hue_sat", in, out);
}
-bNodeType sh_node_hue_sat= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_HUE_SAT,
- /* name */ "Hue Saturation Value",
- /* width+range */ 150, 80, 250,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ sh_node_hue_sat_in,
- /* output sock */ sh_node_hue_sat_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_hue_sat,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_hue_sat
-
-};
+void register_node_type_sh_hue_sat(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ sh_node_hue_sat_in, sh_node_hue_sat_out);
+ node_type_size(&ntype, 150, 80, 250);
+ node_type_exec(&ntype, node_shader_exec_hue_sat);
+ node_type_gpu(&ntype, gpu_shader_hue_sat);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_invert.c b/source/blender/nodes/intern/SHD_nodes/SHD_invert.c
index 08666f4dd52..9929afd0bc1 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_invert.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_invert.c
@@ -43,7 +43,7 @@ static bNodeSocketType sh_node_invert_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_invert(void *data, bNode *node, bNodeStack **in,
+static void node_shader_exec_invert(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in,
bNodeStack **out)
{
float col[3], facm;
@@ -64,26 +64,22 @@ bNodeStack **out)
VECCOPY(out[0]->vec, col);
}
-static int gpu_shader_invert(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+static int gpu_shader_invert(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
{
return GPU_stack_link(mat, "invert", in, out);
}
-bNodeType sh_node_invert= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_INVERT,
- /* name */ "Invert",
- /* width+range */ 90, 80, 100,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ sh_node_invert_in,
- /* output sock */ sh_node_invert_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_invert,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_invert
-};
+void register_node_type_sh_invert(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ sh_node_invert_in, sh_node_invert_out);
+ node_type_size(&ntype, 90, 80, 100);
+ node_type_exec(&ntype, node_shader_exec_invert);
+ node_type_gpu(&ntype, gpu_shader_invert);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c b/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c
index 49778625446..f11200cfc7e 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c
@@ -41,7 +41,7 @@ static bNodeSocketType sh_node_mapping_out[]= {
};
/* do the regular mapping options for blender textures */
-static void node_shader_exec_mapping(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_mapping(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
TexMapping *texmap= node->storage;
float *vec= out[0]->vec;
@@ -83,22 +83,17 @@ static int gpu_shader_mapping(GPUMaterial *mat, bNode *node, GPUNodeStack *in, G
return GPU_stack_link(mat, "mapping", in, out, tmat, tmin, tmax, tdomin, tdomax);
}
-bNodeType sh_node_mapping= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_MAPPING,
- /* name */ "Mapping",
- /* width+range */ 240, 160, 320,
- /* class+opts */ NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- /* input sock */ sh_node_mapping_in,
- /* output sock */ sh_node_mapping_out,
- /* storage */ "TexMapping",
- /* execfunc */ node_shader_exec_mapping,
- /* butfunc */ NULL,
- /* initfunc */ node_shader_init_mapping,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_mapping
+void register_node_type_sh_mapping(ListBase *lb)
+{
+ static bNodeType ntype;
-};
-
+ node_type_base(&ntype, SH_NODE_MAPPING, "Mapping", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
+ sh_node_mapping_in, sh_node_mapping_out);
+ node_type_size(&ntype, 240, 160, 320);
+ node_type_init(&ntype, node_shader_init_mapping);
+ node_type_storage(&ntype, "TexMapping", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_shader_exec_mapping);
+ node_type_gpu(&ntype, gpu_shader_mapping);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_material.c b/source/blender/nodes/intern/SHD_nodes/SHD_material.c
index 4395eef0a5f..4984a1ca821 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_material.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_material.c
@@ -235,10 +235,12 @@ static int gpu_shader_material(GPUMaterial *mat, bNode *node, GPUNodeStack *in,
/* write to outputs */
if(node->custom1 & SH_NODE_MAT_DIFF) {
- if(node->custom1 & SH_NODE_MAT_SPEC)
- out[MAT_OUT_COLOR].link= shr.combined;
- else
- out[MAT_OUT_COLOR].link= shr.diff;
+ out[MAT_OUT_COLOR].link= shr.combined;
+
+ if(!(node->custom1 & SH_NODE_MAT_SPEC)) {
+ GPUNodeLink *link;
+ GPU_link(mat, "vec_math_sub", shr.combined, shr.spec, &out[MAT_OUT_COLOR].link, &link);
+ }
}
else if(node->custom1 & SH_NODE_MAT_SPEC) {
out[MAT_OUT_COLOR].link= shr.spec;
@@ -265,39 +267,33 @@ static int gpu_shader_material(GPUMaterial *mat, bNode *node, GPUNodeStack *in,
return 0;
}
-bNodeType sh_node_material= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_MATERIAL,
- /* name */ "Material",
- /* width+range */ 120, 80, 240,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- /* input sock */ sh_node_material_in,
- /* output sock */ sh_node_material_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_material,
- /* butfunc */ NULL,
- /* initfunc */ node_shader_init_material,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_material
-};
+void register_node_type_sh_material(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_MATERIAL, "Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
+ sh_node_material_in, sh_node_material_out);
+ node_type_size(&ntype, 120, 80, 240);
+ node_type_init(&ntype, node_shader_init_material);
+ node_type_exec(&ntype, node_shader_exec_material);
+ node_type_gpu(&ntype, gpu_shader_material);
+
+ nodeRegisterType(lb, &ntype);
+}
+
+
+void register_node_type_sh_material_ext(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_MATERIAL_EXT, "Extended Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
+ sh_node_material_ext_in, sh_node_material_ext_out);
+ node_type_size(&ntype, 120, 80, 240);
+ node_type_init(&ntype, node_shader_init_material);
+ node_type_exec(&ntype, node_shader_exec_material);
+ node_type_gpu(&ntype, gpu_shader_material);
+
+ nodeRegisterType(lb, &ntype);
+}
-bNodeType sh_node_material_ext= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_MATERIAL_EXT,
- /* name */ "Extended Material",
- /* width+range */ 120, 80, 240,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- /* input sock */ sh_node_material_ext_in,
- /* output sock */ sh_node_material_ext_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_material,
- /* butfunc */ NULL,
- /* initfunc */ node_shader_init_material,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_material
-};
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_math.c b/source/blender/nodes/intern/SHD_nodes/SHD_math.c
index 7429c084ab3..ba2ee6d066a 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_math.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_math.c
@@ -30,7 +30,6 @@
#include "../SHD_util.h"
-
/* **************** SCALAR MATH ******************** */
static bNodeSocketType sh_node_math_in[]= {
{ SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f},
@@ -43,7 +42,7 @@ static bNodeSocketType sh_node_math_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_math(void *data, bNode *node, bNodeStack **in,
+static void node_shader_exec_math(void *UNUSED(data), bNode *node, bNodeStack **in,
bNodeStack **out)
{
switch(node->custom1){
@@ -196,7 +195,7 @@ bNodeStack **out)
static int gpu_shader_math(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
{
- static char *names[] = {"math_add", "math_subtract", "math_multiply",
+ static const char *names[] = {"math_add", "math_subtract", "math_multiply",
"math_divide", "math_sine", "math_cosine", "math_tangent", "math_asin",
"math_acos", "math_atan", "math_pow", "math_log", "math_min", "math_max",
"math_round", "math_less_than", "math_greater_than"};
@@ -234,21 +233,19 @@ static int gpu_shader_math(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUN
return 1;
}
-bNodeType sh_node_math= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_MATH,
- /* name */ "Math",
- /* width+range */ 120, 110, 160,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ sh_node_math_in,
- /* output sock */ sh_node_math_out,
- /* storage */ "node_math",
- /* execfunc */ node_shader_exec_math,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_math
-};
+void register_node_type_sh_math(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ sh_node_math_in, sh_node_math_out);
+ node_type_size(&ntype, 120, 110, 160);
+ node_type_label(&ntype, node_math_label);
+ node_type_storage(&ntype, "node_math", NULL, NULL);
+ node_type_exec(&ntype, node_shader_exec_math);
+ node_type_gpu(&ntype, gpu_shader_math);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c b/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c
index bc4342e11e3..eac3c60655a 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c
@@ -29,7 +29,6 @@
#include "../SHD_util.h"
-
/* **************** MIX RGB ******************** */
static bNodeSocketType sh_node_mix_rgb_in[]= {
{ SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
@@ -42,7 +41,7 @@ static bNodeSocketType sh_node_mix_rgb_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_mix_rgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_mix_rgb(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: fac, col1, col2 */
/* stack order out: col */
@@ -62,7 +61,7 @@ static void node_shader_exec_mix_rgb(void *data, bNode *node, bNodeStack **in, b
static int gpu_shader_mix_rgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
{
- static char *names[] = {"mix_blend", "mix_add", "mix_mult", "mix_sub",
+ static const char *names[] = {"mix_blend", "mix_add", "mix_mult", "mix_sub",
"mix_screen", "mix_div", "mix_diff", "mix_dark", "mix_light",
"mix_overlay", "mix_dodge", "mix_burn", "mix_hue", "mix_sat",
"mix_val", "mix_color", "mix_soft", "mix_linear"};
@@ -71,21 +70,17 @@ static int gpu_shader_mix_rgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in, G
}
-bNodeType sh_node_mix_rgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_MIX_RGB,
- /* name */ "Mix",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ sh_node_mix_rgb_in,
- /* output sock */ sh_node_mix_rgb_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_mix_rgb,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_mix_rgb
-
-};
+void register_node_type_sh_mix_rgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ sh_node_mix_rgb_in, sh_node_mix_rgb_out);
+ node_type_size(&ntype, 100, 60, 150);
+ node_type_label(&ntype, node_blend_label);
+ node_type_exec(&ntype, node_shader_exec_mix_rgb);
+ node_type_gpu(&ntype, gpu_shader_mix_rgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_normal.c b/source/blender/nodes/intern/SHD_nodes/SHD_normal.c
index eb3786286ae..ccbf80edeb7 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_normal.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_normal.c
@@ -42,7 +42,7 @@ static bNodeSocketType sh_node_normal_out[]= {
};
/* generates normal, does dot product */
-static void node_shader_exec_normal(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_normal(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
float vec[3];
@@ -65,21 +65,14 @@ static int gpu_shader_normal(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GP
return GPU_stack_link(mat, "normal", in, out, vec);
}
-bNodeType sh_node_normal= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_NORMAL,
- /* name */ "Normal",
- /* width+range */ 100, 60, 200,
- /* class+opts */ NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- /* input sock */ sh_node_normal_in,
- /* output sock */ sh_node_normal_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_normal,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_normal
-};
-
+void register_node_type_sh_normal(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
+ sh_node_normal_in, sh_node_normal_out);
+ node_type_exec(&ntype, node_shader_exec_normal);
+ node_type_gpu(&ntype, gpu_shader_normal);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_output.c b/source/blender/nodes/intern/SHD_nodes/SHD_output.c
index 740639b6ab4..d61e9def144 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_output.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_output.c
@@ -36,7 +36,7 @@ static bNodeSocketType sh_node_output_in[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_output(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_output(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out))
{
if(data) {
ShadeInput *shi= ((ShaderCallData *)data)->shi;
@@ -62,7 +62,7 @@ static void node_shader_exec_output(void *data, bNode *node, bNodeStack **in, bN
}
}
-static int gpu_shader_output(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+static int gpu_shader_output(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
{
GPUNodeLink *outlink;
@@ -75,22 +75,17 @@ static int gpu_shader_output(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GP
return 1;
}
-bNodeType sh_node_output= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_OUTPUT,
- /* name */ "Output",
- /* width+range */ 80, 60, 200,
- /* class+opts */ NODE_CLASS_OUTPUT, NODE_PREVIEW,
- /* input sock */ sh_node_output_in,
- /* output sock */ NULL,
- /* storage */ "",
- /* execfunc */ node_shader_exec_output,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_output
-
-};
+void register_node_type_sh_output(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW,
+ sh_node_output_in, NULL);
+ node_type_size(&ntype, 80, 60, 200);
+ node_type_exec(&ntype, node_shader_exec_output);
+ node_type_gpu(&ntype, gpu_shader_output);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c b/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c
index 71af58beb67..109147c7d45 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c
@@ -35,7 +35,7 @@ static bNodeSocketType sh_node_rgb_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_rgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_rgb(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
@@ -50,21 +50,16 @@ static int gpu_shader_rgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNo
return GPU_stack_link(mat, "set_rgba", in, out, vec);
}
-bNodeType sh_node_rgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_RGB,
- /* name */ "RGB",
- /* width+range */ 140, 80, 140,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ sh_node_rgb_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_rgb,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_rgb
-
-};
+void register_node_type_sh_rgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS,
+ NULL, sh_node_rgb_out);
+ node_type_size(&ntype, 140, 80, 140);
+ node_type_exec(&ntype, node_shader_exec_rgb);
+ node_type_gpu(&ntype, gpu_shader_rgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c b/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
index 883cd4d3bf4..da4c7f70022 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
@@ -41,36 +41,31 @@ static bNodeSocketType sh_node_seprgb_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_seprgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_seprgb(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in, bNodeStack **out)
{
out[0]->vec[0] = in[0]->vec[0];
out[1]->vec[0] = in[0]->vec[1];
out[2]->vec[0] = in[0]->vec[2];
}
-static int gpu_shader_seprgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+static int gpu_shader_seprgb(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
{
return GPU_stack_link(mat, "separate_rgb", in, out);
}
-bNodeType sh_node_seprgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_SEPRGB,
- /* name */ "Separate RGB",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, 0,
- /* input sock */ sh_node_seprgb_in,
- /* output sock */ sh_node_seprgb_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_seprgb,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_seprgb
-
-};
+void register_node_type_sh_seprgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_SEPRGB, "Separate RGB", NODE_CLASS_CONVERTOR, 0,
+ sh_node_seprgb_in, sh_node_seprgb_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_shader_exec_seprgb);
+ node_type_gpu(&ntype, gpu_shader_seprgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** COMBINE RGB ******************** */
@@ -85,33 +80,28 @@ static bNodeSocketType sh_node_combrgb_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_combrgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_combrgb(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in, bNodeStack **out)
{
out[0]->vec[0] = in[0]->vec[0];
out[0]->vec[1] = in[1]->vec[0];
out[0]->vec[2] = in[2]->vec[0];
}
-static int gpu_shader_combrgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+static int gpu_shader_combrgb(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
{
return GPU_stack_link(mat, "combine_rgb", in, out);
}
-bNodeType sh_node_combrgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_COMBRGB,
- /* name */ "Combine RGB",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ sh_node_combrgb_in,
- /* output sock */ sh_node_combrgb_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_combrgb,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_combrgb
-
-};
+void register_node_type_sh_combrgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_COMBRGB, "Combine RGB", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ sh_node_combrgb_in, sh_node_combrgb_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_shader_exec_combrgb);
+ node_type_gpu(&ntype, gpu_shader_combrgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c b/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c
index 926dcd0f046..ff6e3913d19 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c
@@ -42,7 +42,7 @@ static bNodeSocketType sh_node_squeeze_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_squeeze(void *data, bNode *node, bNodeStack **in,
+static void node_shader_exec_squeeze(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in,
bNodeStack **out)
{
float vec[3];
@@ -54,26 +54,23 @@ bNodeStack **out)
out[0]->vec[0] = 1.0f / (1.0f + pow(2.71828183,-((vec[0]-vec[2])*vec[1]))) ;
}
-static int gpu_shader_squeeze(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+static int gpu_shader_squeeze(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
{
return GPU_stack_link(mat, "squeeze", in, out);
}
-bNodeType sh_node_squeeze= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_SQUEEZE,
- /* name */ "Squeeze Value",
- /* width+range */ 120, 110, 160,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ sh_node_squeeze_in,
- /* output sock */ sh_node_squeeze_out,
- /* storage */ "node_squeeze",
- /* execfunc */ node_shader_exec_squeeze,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_squeeze
-};
+void register_node_type_sh_squeeze(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_SQUEEZE, "Squeeze Value", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ sh_node_squeeze_in, sh_node_squeeze_out);
+ node_type_size(&ntype, 120, 110, 160);
+ node_type_storage(&ntype, "node_squeeze", NULL, NULL);
+ node_type_exec(&ntype, node_shader_exec_squeeze);
+ node_type_gpu(&ntype, gpu_shader_squeeze);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_texture.c b/source/blender/nodes/intern/SHD_nodes/SHD_texture.c
index b2fb3b2261c..ec36dd8043e 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_texture.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_texture.c
@@ -58,6 +58,7 @@ static void node_shader_exec_texture(void *data, bNode *node, bNodeStack **in, b
/* we should find out if a normal as output is needed, for now we do all */
texres.nor= nor;
+ texres.tr= texres.tg= texres.tb= 0.0f;
if(in[0]->hasinput) {
nodestack_get_vec(vec, SOCK_VECTOR, in[0]);
@@ -127,22 +128,17 @@ static int gpu_shader_texture(GPUMaterial *mat, bNode *node, GPUNodeStack *in, G
return 0;
}
-bNodeType sh_node_texture= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_TEXTURE,
- /* name */ "Texture",
- /* width+range */ 120, 80, 240,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- /* input sock */ sh_node_texture_in,
- /* output sock */ sh_node_texture_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_texture,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_texture
-
-};
+void register_node_type_sh_texture(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
+ sh_node_texture_in, sh_node_texture_out);
+ node_type_size(&ntype, 120, 80, 240);
+ node_type_exec(&ntype, node_shader_exec_texture);
+ node_type_gpu(&ntype, gpu_shader_texture);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c b/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
index e2260461152..8603ec018d6 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
@@ -40,7 +40,7 @@ static bNodeSocketType sh_node_valtorgb_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_valtorgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_valtorgb(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: fac */
/* stack order out: col, alpha */
@@ -68,24 +68,21 @@ static int gpu_shader_valtorgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in,
return GPU_stack_link(mat, "valtorgb", in, out, GPU_texture(size, array));
}
-bNodeType sh_node_valtorgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_VALTORGB,
- /* name */ "ColorRamp",
- /* width+range */ 240, 200, 300,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ sh_node_valtorgb_in,
- /* output sock */ sh_node_valtorgb_out,
- /* storage */ "ColorBand",
- /* execfunc */ node_shader_exec_valtorgb,
- /* butfunc */ NULL,
- /* initfunc */ node_shader_init_valtorgb,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_valtorgb
-
-};
+void register_node_type_sh_valtorgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ sh_node_valtorgb_in, sh_node_valtorgb_out);
+ node_type_size(&ntype, 240, 200, 300);
+ node_type_init(&ntype, node_shader_init_valtorgb);
+ node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_shader_exec_valtorgb);
+ node_type_gpu(&ntype, gpu_shader_valtorgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** RGBTOBW ******************** */
static bNodeSocketType sh_node_rgbtobw_in[]= {
@@ -98,7 +95,7 @@ static bNodeSocketType sh_node_rgbtobw_out[]= {
};
-static void node_shader_exec_rgbtobw(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_rgbtobw(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in, bNodeStack **out)
{
/* stack order out: bw */
/* stack order in: col */
@@ -106,27 +103,22 @@ static void node_shader_exec_rgbtobw(void *data, bNode *node, bNodeStack **in, b
out[0]->vec[0]= in[0]->vec[0]*0.35f + in[0]->vec[1]*0.45f + in[0]->vec[2]*0.2f;
}
-static int gpu_shader_rgbtobw(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+static int gpu_shader_rgbtobw(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
{
return GPU_stack_link(mat, "rgbtobw", in, out);
}
-bNodeType sh_node_rgbtobw= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_RGBTOBW,
- /* name */ "RGB to BW",
- /* width+range */ 80, 40, 120,
- /* class+opts */ NODE_CLASS_CONVERTOR, 0,
- /* input sock */ sh_node_rgbtobw_in,
- /* output sock */ sh_node_rgbtobw_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_rgbtobw,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_rgbtobw
+void register_node_type_sh_rgbtobw(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0,
+ sh_node_rgbtobw_in, sh_node_rgbtobw_out);
+ node_type_size(&ntype, 80, 40, 120);
+ node_type_exec(&ntype, node_shader_exec_rgbtobw);
+ node_type_gpu(&ntype, gpu_shader_rgbtobw);
+
+ nodeRegisterType(lb, &ntype);
+}
-};
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_value.c b/source/blender/nodes/intern/SHD_nodes/SHD_value.c
index 1663ea352aa..21c58419d9b 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_value.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_value.c
@@ -35,7 +35,7 @@ static bNodeSocketType sh_node_value_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_value(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_value(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
@@ -50,22 +50,17 @@ static int gpu_shader_value(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPU
return GPU_stack_link(mat, "set_value", in, out, vec);
}
-bNodeType sh_node_value= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_VALUE,
- /* name */ "Value",
- /* width+range */ 80, 50, 120,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ sh_node_value_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_value,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_value
-
-};
+void register_node_type_sh_value(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS,
+ NULL, sh_node_value_out);
+ node_type_size(&ntype, 80, 50, 120);
+ node_type_exec(&ntype, node_shader_exec_value);
+ node_type_gpu(&ntype, gpu_shader_value);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c b/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c
index 062c6402fb6..a85022cffab 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c
@@ -44,7 +44,7 @@ static bNodeSocketType sh_node_vect_math_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_vect_math(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_vect_math(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
float vec1[3], vec2[3];
@@ -101,7 +101,7 @@ static void node_shader_exec_vect_math(void *data, bNode *node, bNodeStack **in,
static int gpu_shader_vect_math(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
{
- static char *names[] = {"vec_math_add", "vec_math_sub",
+ static const char *names[] = {"vec_math_add", "vec_math_sub",
"vec_math_average", "vec_math_dot", "vec_math_cross",
"vec_math_normalize"};
@@ -127,21 +127,19 @@ static int gpu_shader_vect_math(GPUMaterial *mat, bNode *node, GPUNodeStack *in,
return 1;
}
-bNodeType sh_node_vect_math= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_VECT_MATH,
- /* name */ "Vector Math",
- /* width+range */ 80, 75, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ sh_node_vect_math_in,
- /* output sock */ sh_node_vect_math_out,
- /* storage */ "node_vect_math",
- /* execfunc */ node_shader_exec_vect_math,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_vect_math
-};
+void register_node_type_sh_vect_math(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_VECT_MATH, "Vector Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ sh_node_vect_math_in, sh_node_vect_math_out);
+ node_type_size(&ntype, 80, 75, 140);
+ node_type_label(&ntype, node_vect_math_label);
+ node_type_storage(&ntype, "node_vect_math", NULL, NULL);
+ node_type_exec(&ntype, node_shader_exec_vect_math);
+ node_type_gpu(&ntype, gpu_shader_vect_math);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_util.h b/source/blender/nodes/intern/SHD_util.h
index ea3a100ca05..4134c160f16 100644
--- a/source/blender/nodes/intern/SHD_util.h
+++ b/source/blender/nodes/intern/SHD_util.h
@@ -51,8 +51,9 @@
#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_material.h"
+#include "BKE_node.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "BKE_library.h"
#include "../SHD_node.h"
@@ -62,6 +63,7 @@
#include "BLI_blenlib.h"
#include "BLI_rand.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
diff --git a/source/blender/nodes/intern/TEX_nodes/Makefile b/source/blender/nodes/intern/TEX_nodes/Makefile
deleted file mode 100644
index 74eabe7932a..00000000000
--- a/source/blender/nodes/intern/TEX_nodes/Makefile
+++ /dev/null
@@ -1,49 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
-#
-# 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. The Blender
-# Foundation also sells licenses for use in proprietary software under
-# the Blender License. See http://www.blender.org/BL/ for information
-# about this.
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL/BL DUAL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = nodes_tex
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../../makesdna
-CPPFLAGS += -I../../../makesrna
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../include
-CPPFLAGS += -I../../../imbuf
-CPPFLAGS += -I../../../render/extern/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_at.c b/source/blender/nodes/intern/TEX_nodes/TEX_at.c
index 08c1c65792d..75fa1e4378d 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_at.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_at.c
@@ -38,7 +38,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
TexParams np = *p;
float new_co[3];
@@ -53,20 +53,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_at = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_AT,
- /* name */ "At",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_DISTORT, 0,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_at(ListBase *lb)
+{
+ static bNodeType ntype;
-};
+ node_type_base(&ntype, TEX_NODE_AT, "At", NODE_CLASS_DISTORT, 0,
+ inputs, outputs);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c b/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c
index 9d26621e08c..7a32b6342aa 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c
@@ -112,20 +112,15 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_bricks= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_BRICKS,
- /* name */ "Bricks",
- /* width+range */ 150, 60, 150,
- /* class+opts */ NODE_CLASS_PATTERN, NODE_OPTIONS | NODE_PREVIEW,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ init,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_bricks(ListBase *lb)
+{
+ static bNodeType ntype;
-};
+ node_type_base(&ntype, TEX_NODE_BRICKS, "Bricks", NODE_CLASS_PATTERN, NODE_PREVIEW|NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 150, 60, 150);
+ node_type_init(&ntype, init);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_checker.c b/source/blender/nodes/intern/TEX_nodes/TEX_checker.c
index 4155cec4d7f..25cfd4412f5 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_checker.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_checker.c
@@ -40,7 +40,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
float x = p->co[0];
float y = p->co[1];
@@ -64,20 +64,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_checker= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_CHECKER,
- /* name */ "Checker",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_PATTERN, NODE_OPTIONS | NODE_PREVIEW,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_checker(ListBase *lb)
+{
+ static bNodeType ntype;
-};
+ node_type_base(&ntype, TEX_NODE_CHECKER, "Checker", NODE_CLASS_PATTERN, NODE_PREVIEW|NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 100, 60, 150);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_compose.c b/source/blender/nodes/intern/TEX_nodes/TEX_compose.c
index 7319a50b7d9..3b933927c5e 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_compose.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_compose.c
@@ -40,7 +40,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
int i;
for(i = 0; i < 4; i++)
@@ -52,20 +52,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_compose= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_COMPOSE,
- /* name */ "Compose RGBA",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_OP_COLOR, 0,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_compose(ListBase *lb)
+{
+ static bNodeType ntype;
-};
+ node_type_base(&ntype, TEX_NODE_COMPOSE, "Compose RGBA", NODE_CLASS_OP_COLOR, 0,
+ inputs, outputs);
+ node_type_size(&ntype, 100, 60, 150);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_coord.c b/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
index 68e892ce77c..5311dbc2360 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
@@ -33,7 +33,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void vectorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void vectorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **UNUSED(in), short UNUSED(thread))
{
out[0] = p->co[0];
out[1] = p->co[1];
@@ -45,20 +45,15 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &vectorfn, data);
}
-bNodeType tex_node_coord= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_COORD,
- /* name */ "Coordinates",
- /* width+range */ 120, 110, 160,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ outputs,
- /* storage */ "node_coord",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
-
+void register_node_type_tex_coord(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_COORD, "Coordinates", NODE_CLASS_INPUT, NODE_OPTIONS,
+ NULL, outputs);
+ node_type_size(&ntype, 120, 110, 160);
+ node_type_storage(&ntype, "node_coord", NULL, NULL);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_curves.c b/source/blender/nodes/intern/TEX_nodes/TEX_curves.c
index 49a1ef35fbb..e4ea39b8591 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_curves.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_curves.c
@@ -36,7 +36,7 @@ static bNodeSocketType time_outputs[]= {
{ -1, 0, "" }
};
-static void time_colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void time_colorfn(float *out, TexParams *p, bNode *node, bNodeStack **UNUSED(in), short UNUSED(thread))
{
/* stack order output: fac */
float fac= 0.0f;
@@ -61,22 +61,19 @@ static void time_init(bNode* node)
node->storage= curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
}
-bNodeType tex_node_curve_time= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_CURVE_TIME,
- /* name */ "Time",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ time_outputs,
- /* storage */ "CurveMapping",
- /* execfunc */ time_exec,
- /* butfunc */ NULL,
- /* initfunc */ time_init,
- /* freestoragefunc */ node_free_curves,
- /* copystoragefunc */ node_copy_curves,
- /* id */ NULL
-};
+void register_node_type_tex_curve_time(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_CURVE_TIME, "Time", NODE_CLASS_INPUT, NODE_OPTIONS,
+ NULL, time_outputs);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_init(&ntype, time_init);
+ node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+ node_type_exec(&ntype, time_exec);
+
+ nodeRegisterType(lb, &ntype);
+}
/* **************** CURVE RGB ******************** */
static bNodeSocketType rgb_inputs[]= {
@@ -108,20 +105,17 @@ static void rgb_init(bNode *node)
node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f);
}
-bNodeType tex_node_curve_rgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_CURVE_RGB,
- /* name */ "RGB Curves",
- /* width+range */ 200, 140, 320,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ rgb_inputs,
- /* output sock */ rgb_outputs,
- /* storage */ "CurveMapping",
- /* execfunc */ rgb_exec,
- /* butfunc */ NULL,
- /* initfunc */ rgb_init,
- /* freestoragefunc */ node_free_curves,
- /* copystoragefunc */ node_copy_curves,
- /* id */ NULL
-};
+void register_node_type_tex_curve_rgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ rgb_inputs, rgb_outputs);
+ node_type_size(&ntype, 200, 140, 320);
+ node_type_init(&ntype, rgb_init);
+ node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+ node_type_exec(&ntype, rgb_exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c b/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c
index f031091e08d..c66e26321b6 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c
@@ -41,25 +41,25 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void valuefn_r(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void valuefn_r(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
tex_input_rgba(out, in[0], p, thread);
*out = out[0];
}
-static void valuefn_g(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void valuefn_g(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
tex_input_rgba(out, in[0], p, thread);
*out = out[1];
}
-static void valuefn_b(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void valuefn_b(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
tex_input_rgba(out, in[0], p, thread);
*out = out[2];
}
-static void valuefn_a(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void valuefn_a(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
tex_input_rgba(out, in[0], p, thread);
*out = out[3];
@@ -73,20 +73,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[3], &valuefn_a, data);
}
-bNodeType tex_node_decompose= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_DECOMPOSE,
- /* name */ "Decompose RGBA",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_OP_COLOR, 0,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_decompose(ListBase *lb)
+{
+ static bNodeType ntype;
-};
+ node_type_base(&ntype, TEX_NODE_DECOMPOSE, "Decompose RGBA", NODE_CLASS_OP_COLOR, 0,
+ inputs, outputs);
+ node_type_size(&ntype, 100, 60, 150);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_distance.c b/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
index e0fee3e3153..887fbd1be90 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
@@ -41,7 +41,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void valuefn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
float co1[3], co2[3];
@@ -56,21 +56,15 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &valuefn, data);
}
-bNodeType tex_node_distance= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_DISTANCE,
- /* name */ "Distance",
- /* width+range */ 120, 110, 160,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "node_distance",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
-
-
+void register_node_type_tex_distance(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_DISTANCE, "Distance", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 120, 110, 160);
+ node_type_storage(&ntype, "node_distance", NULL, NULL);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c b/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
index 367ea7b9e5f..66a98b70fd4 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
@@ -42,7 +42,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void do_hue_sat_fac(bNode *node, float *out, float hue, float sat, float val, float *in, float fac)
+static void do_hue_sat_fac(bNode *UNUSED(node), float *out, float hue, float sat, float val, float *in, float fac)
{
if(fac != 0 && (hue != 0.5f || sat != 1 || val != 1)) {
float col[3], hsv[3], mfac= 1.0f - fac;
@@ -87,22 +87,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_hue_sat= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_HUE_SAT,
- /* name */ "Hue Saturation Value",
- /* width+range */ 150, 80, 250,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_hue_sat(ListBase *lb)
+{
+ static bNodeType ntype;
-};
-
-
+ node_type_base(&ntype, TEX_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 150, 80, 250);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_image.c b/source/blender/nodes/intern/TEX_nodes/TEX_image.c
index 628d9026db1..a870d1d31fe 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_image.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_image.c
@@ -34,7 +34,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **UNUSED(in), short UNUSED(thread))
{
float x = p->co[0];
float y = p->co[1];
@@ -58,7 +58,13 @@ static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor
py = (int)( (y-yoff) * ysize );
if( (!xsize) || (!ysize) ) return;
- if( !ibuf->rect_float ) IMB_float_from_rect(ibuf);
+
+ if( !ibuf->rect_float ) {
+ BLI_lock_thread(LOCK_IMAGE);
+ if( !ibuf->rect_float )
+ IMB_float_from_rect(ibuf);
+ BLI_unlock_thread(LOCK_IMAGE);
+ }
while( px < 0 ) px += ibuf->x;
while( py < 0 ) py += ibuf->y;
@@ -85,20 +91,16 @@ static void init(bNode* node)
iuser->ok= 1;
}
-bNodeType tex_node_image= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_IMAGE,
- /* name */ "Image",
- /* width+range */ 120, 80, 300,
- /* class+opts */ NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ outputs,
- /* storage */ "ImageUser",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ init,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
-
+void register_node_type_tex_image(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
+ NULL, outputs);
+ node_type_size(&ntype, 120, 80, 300);
+ node_type_init(&ntype, init);
+ node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_invert.c b/source/blender/nodes/intern/TEX_nodes/TEX_invert.c
index 1619ed73023..d6d66abd863 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_invert.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_invert.c
@@ -39,7 +39,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
float col[4];
@@ -58,20 +58,15 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_invert= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_INVERT,
- /* name */ "Invert",
- /* width+range */ 90, 80, 100,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_tex_invert(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 90, 80, 100);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_math.c b/source/blender/nodes/intern/TEX_nodes/TEX_math.c
index a17c295eb7f..7e1c54b6e47 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_math.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_math.c
@@ -174,20 +174,17 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &valuefn, data);
}
-bNodeType tex_node_math= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_MATH,
- /* name */ "Math",
- /* width+range */ 120, 110, 160,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "node_math",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_tex_math(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 120, 110, 160);
+ node_type_label(&ntype, node_math_label);
+ node_type_storage(&ntype, "node_math", NULL, NULL);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c b/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
index c709d58b8ba..152288fcac8 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
@@ -28,7 +28,6 @@
#include "../TEX_util.h"
-
/* **************** MIX RGB ******************** */
static bNodeSocketType inputs[]= {
{ SOCK_VALUE, 1, "Factor", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
@@ -60,20 +59,15 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_mix_rgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_MIX_RGB,
- /* name */ "Mix",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_mix_rgb(ListBase *lb)
+{
+ static bNodeType ntype;
-};
+ node_type_base(&ntype, TEX_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 100, 60, 150);
+ node_type_label(&ntype, node_blend_label);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_output.c b/source/blender/nodes/intern/TEX_nodes/TEX_output.c
index 09bc893cc1f..b10cfa543a1 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_output.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_output.c
@@ -36,7 +36,7 @@ static bNodeSocketType inputs[]= {
};
/* applies to render pipeline */
-static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out))
{
TexCallData *cdata = (TexCallData *)data;
TexResult *target = cdata->target;
@@ -45,7 +45,7 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
TexParams params;
params_from_cdata(&params, cdata);
- if(in[1]->hasinput && !in[0]->hasinput)
+ if(in[1] && in[1]->hasinput && !in[0]->hasinput)
tex_input_rgba(&target->tr, in[1], &params, cdata->thread);
else
tex_input_rgba(&target->tr, in[0], &params, cdata->thread);
@@ -63,7 +63,7 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
target->talpha = 1.0f;
if(target->nor) {
- if(in[1]->hasinput)
+ if(in[1] && in[1]->hasinput)
tex_input_vec(target->nor, in[1], &params, cdata->thread);
else
target->nor = 0;
@@ -152,20 +152,16 @@ static void copy(bNode *orig, bNode *new)
assign_index(new);
}
-bNodeType tex_node_output= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_OUTPUT,
- /* name */ "Output",
- /* width+range */ 150, 60, 200,
- /* class+opts */ NODE_CLASS_OUTPUT, NODE_PREVIEW | NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ NULL,
- /* storage */ "TexNodeOutput",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ init,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ copy,
- /* id */ NULL
-};
-
+void register_node_type_tex_output(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS,
+ inputs, NULL);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, init);
+ node_type_storage(&ntype, "TexNodeOutput", node_free_standard_storage, copy);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_proc.c b/source/blender/nodes/intern/TEX_nodes/TEX_proc.c
index 3e7ef0e94fe..bba25ea7bd2 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_proc.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_proc.c
@@ -111,7 +111,7 @@ static int count_outputs(bNode *node)
/* Boilerplate generators */
#define ProcNoInputs(name) \
- static void name##_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread) \
+ static void name##_map_inputs(Tex *UNUSED(tex), bNodeStack **UNUSED(in), TexParams *UNUSED(p), short UNUSED(thread)) \
{}
#define ProcDef(name) \
@@ -290,21 +290,29 @@ static void init(bNode *node)
/* Node type definitions */
#define TexDef(TEXTYPE, outputs, name, Name) \
- { NULL, NULL, TEX_NODE_PROC+TEXTYPE, Name, 140,80,140, NODE_CLASS_TEXTURE, \
- NODE_OPTIONS | NODE_PREVIEW, name##_inputs, outputs, "Tex", name##_exec, NULL, init, \
- node_free_standard_storage, node_copy_standard_storage, NULL }
+void register_node_type_tex_proc_##name(ListBase *lb) \
+{ \
+ static bNodeType ntype; \
+ \
+ node_type_base(&ntype, TEX_NODE_PROC+TEXTYPE, Name, NODE_CLASS_TEXTURE, NODE_PREVIEW|NODE_OPTIONS, name##_inputs, outputs); \
+ node_type_size(&ntype, 140, 80, 140); \
+ node_type_init(&ntype, init); \
+ node_type_storage(&ntype, "Tex", node_free_standard_storage, node_copy_standard_storage); \
+ node_type_exec(&ntype, name##_exec); \
+ \
+ nodeRegisterType(lb, &ntype); \
+}
#define C outputs_color_only
#define CV outputs_both
-bNodeType tex_node_proc_voronoi = TexDef(TEX_VORONOI, CV, voronoi, "Voronoi" );
-bNodeType tex_node_proc_blend = TexDef(TEX_BLEND, C, blend, "Blend" );
-bNodeType tex_node_proc_magic = TexDef(TEX_MAGIC, C, magic, "Magic" );
-bNodeType tex_node_proc_marble = TexDef(TEX_MARBLE, CV, marble, "Marble" );
-bNodeType tex_node_proc_clouds = TexDef(TEX_CLOUDS, CV, clouds, "Clouds" );
-bNodeType tex_node_proc_wood = TexDef(TEX_WOOD, CV, wood, "Wood" );
-bNodeType tex_node_proc_musgrave = TexDef(TEX_MUSGRAVE, CV, musgrave, "Musgrave" );
-bNodeType tex_node_proc_noise = TexDef(TEX_NOISE, C, noise, "Noise" );
-bNodeType tex_node_proc_stucci = TexDef(TEX_STUCCI, CV, stucci, "Stucci" );
-bNodeType tex_node_proc_distnoise = TexDef(TEX_DISTNOISE, CV, distnoise, "Distorted Noise" );
-
+TexDef(TEX_VORONOI, CV, voronoi, "Voronoi" );
+TexDef(TEX_BLEND, C, blend, "Blend" );
+TexDef(TEX_MAGIC, C, magic, "Magic" );
+TexDef(TEX_MARBLE, CV, marble, "Marble" );
+TexDef(TEX_CLOUDS, CV, clouds, "Clouds" );
+TexDef(TEX_WOOD, CV, wood, "Wood" );
+TexDef(TEX_MUSGRAVE, CV, musgrave, "Musgrave" );
+TexDef(TEX_NOISE, C, noise, "Noise" );
+TexDef(TEX_STUCCI, CV, stucci, "Stucci" );
+TexDef(TEX_DISTNOISE, CV, distnoise, "Distorted Noise" );
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c b/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c
index 9a855938eef..92a9fa26311 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c
@@ -64,7 +64,7 @@ static void rotate(float new_co[3], float a, float ax[3], float co[3])
new_co[2] = para[2] + perp[2] + cp[2];
}
-static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
float new_co[3], new_dxt[3], new_dyt[3], a, ax[3];
@@ -90,20 +90,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_rotate= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_ROTATE,
- /* name */ "Rotate",
- /* width+range */ 90, 80, 100,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
-
+void register_node_type_tex_rotate(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_ROTATE, "Rotate", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_scale.c b/source/blender/nodes/intern/TEX_nodes/TEX_scale.c
index 721c322c540..65ae744531b 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_scale.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_scale.c
@@ -40,7 +40,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
float scale[3], new_co[3], new_dxt[3], new_dyt[3];
TexParams np = *p;
@@ -64,20 +64,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_scale = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_SCALE,
- /* name */ "Scale",
- /* width+range */ 90, 80, 100,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
-
+void register_node_type_tex_scale(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 90, 80, 100);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
index c01caa022e5..2bbd08a4c1f 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
@@ -83,21 +83,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_texture= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_TEXTURE,
- /* name */ "Texture",
- /* width+range */ 120, 80, 240,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_texture(ListBase *lb)
+{
+ static bNodeType ntype;
-};
-
+ node_type_base(&ntype, TEX_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 120, 80, 240);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_translate.c b/source/blender/nodes/intern/TEX_nodes/TEX_translate.c
index a823338faf9..a570386bcda 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_translate.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_translate.c
@@ -40,7 +40,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
float offset[3], new_co[3];
TexParams np = *p;
@@ -59,20 +59,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_translate = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_TRANSLATE,
- /* name */ "Translate",
- /* width+range */ 90, 80, 100,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
-
+void register_node_type_tex_translate(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 90, 80, 100);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c b/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c
index 46aefe5ad47..67fb068870c 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c
@@ -39,7 +39,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void normalfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void normalfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
float new_co[3];
float *co = p->co;
@@ -75,20 +75,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &normalfn, data);
}
-bNodeType tex_node_valtonor = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_VALTONOR,
- /* name */ "Value to Normal",
- /* width+range */ 90, 80, 100,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
-
+void register_node_type_tex_valtonor(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_VALTONOR, "Value to Normal", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 90, 80, 100);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c b/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
index 3810167a58a..f23baffb0ee 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
@@ -58,23 +58,19 @@ static void valtorgb_init(bNode *node)
node->storage = add_colorband(1);
}
-bNodeType tex_node_valtorgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_VALTORGB,
- /* name */ "ColorRamp",
- /* width+range */ 240, 200, 300,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ valtorgb_in,
- /* output sock */ valtorgb_out,
- /* storage */ "ColorBand",
- /* execfunc */ valtorgb_exec,
- /* butfunc */ NULL,
- /* initfunc */ valtorgb_init,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
+void register_node_type_tex_valtorgb(ListBase *lb)
+{
+ static bNodeType ntype;
-};
+ node_type_base(&ntype, TEX_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ valtorgb_in, valtorgb_out);
+ node_type_size(&ntype, 240, 200, 300);
+ node_type_init(&ntype, valtorgb_init);
+ node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, valtorgb_exec);
+
+ nodeRegisterType(lb, &ntype);
+}
/* **************** RGBTOBW ******************** */
static bNodeSocketType rgbtobw_in[]= {
@@ -87,7 +83,7 @@ static bNodeSocketType rgbtobw_out[]= {
};
-static void rgbtobw_valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void rgbtobw_valuefn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
float cin[4];
tex_input_rgba(cin, in[0], p, thread);
@@ -100,21 +96,15 @@ static void rgbtobw_exec(void *data, bNode *node, bNodeStack **in, bNodeStack **
tex_output(node, in, out[0], &rgbtobw_valuefn, data);
}
-bNodeType tex_node_rgbtobw= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_RGBTOBW,
- /* name */ "RGB to BW",
- /* width+range */ 80, 40, 120,
- /* class+opts */ NODE_CLASS_CONVERTOR, 0,
- /* input sock */ rgbtobw_in,
- /* output sock */ rgbtobw_out,
- /* storage */ "",
- /* execfunc */ rgbtobw_exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_tex_rgbtobw(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0,
+ rgbtobw_in, rgbtobw_out);
+ node_type_size(&ntype, 80, 40, 120);
+ node_type_exec(&ntype, rgbtobw_exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c b/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c
index 698c894a8d8..5dbfc2561b5 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c
@@ -37,7 +37,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out))
{
TexCallData *cdata = (TexCallData *)data;
@@ -51,20 +51,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
}
}
-bNodeType tex_node_viewer = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_VIEWER,
- /* name */ "Viewer",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_OUTPUT, NODE_PREVIEW,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_viewer(ListBase *lb)
+{
+ static bNodeType ntype;
-};
+ node_type_base(&ntype, TEX_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, NODE_PREVIEW,
+ inputs, outputs);
+ node_type_size(&ntype, 100, 60, 150);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_util.c b/source/blender/nodes/intern/TEX_util.c
index dc31685827f..d288b13a66c 100644
--- a/source/blender/nodes/intern/TEX_util.c
+++ b/source/blender/nodes/intern/TEX_util.c
@@ -29,11 +29,11 @@
/*
HOW TEXTURE NODES WORK
- In contrast to Shader nodes, which place a colour into the output
+ In contrast to Shader nodes, which place a color into the output
stack when executed, Texture nodes place a TexDelegate* there. To
- obtain a colour value from this, a node further up the chain reads
+ obtain a color value from this, a node further up the chain reads
the TexDelegate* from its input stack, and uses tex_call_delegate to
- retrieve the colour from the delegate.
+ retrieve the color from the delegate.
comments: (ton)
@@ -173,7 +173,7 @@ int ntreeTexExecTree(
float *dxt, float *dyt,
int osatex,
short thread,
- Tex *tex,
+ Tex *UNUSED(tex),
short which_output,
int cfra,
int preview,
@@ -181,6 +181,7 @@ int ntreeTexExecTree(
MTex *mtex
){
TexCallData data;
+ float *nor= texres->nor;
int retval = TEX_INT;
data.co = co;
@@ -199,6 +200,9 @@ int ntreeTexExecTree(
if(texres->nor) retval |= TEX_NOR;
retval |= TEX_RGB;
+ /* confusing stuff; the texture output node sets this to NULL to indicate no normal socket was set
+ however, the texture code checks this for other reasons (namely, a normal is required for material) */
+ texres->nor= nor;
return retval;
}
diff --git a/source/blender/nodes/intern/TEX_util.h b/source/blender/nodes/intern/TEX_util.h
index a9465e17623..4caee223a1e 100644
--- a/source/blender/nodes/intern/TEX_util.h
+++ b/source/blender/nodes/intern/TEX_util.h
@@ -50,8 +50,9 @@
#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_material.h"
+#include "BKE_node.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "BKE_library.h"
#include "../SHD_node.h"
@@ -61,6 +62,7 @@
#include "BLI_blenlib.h"
#include "BLI_rand.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
diff --git a/source/blender/nodes/intern/node_util.c b/source/blender/nodes/intern/node_util.c
index 746b8a37f5b..baf0fc17bf7 100644
--- a/source/blender/nodes/intern/node_util.c
+++ b/source/blender/nodes/intern/node_util.c
@@ -30,6 +30,9 @@
#include "CMP_util.h"
#include "SHD_util.h"
+#include "RNA_access.h"
+#include "RNA_enum_types.h"
+
void node_free_curves(bNode *node)
{
curvemapping_free(node->storage);
@@ -50,3 +53,30 @@ void node_copy_standard_storage(bNode *orig_node, bNode *new_node)
new_node->storage= MEM_dupallocN(orig_node->storage);
}
+const char *node_blend_label(bNode *node)
+{
+ const char *name;
+ RNA_enum_name(node_blend_type_items, node->custom1, &name);
+ return name;
+}
+
+const char *node_math_label(bNode *node)
+{
+ const char *name;
+ RNA_enum_name(node_math_items, node->custom1, &name);
+ return name;
+}
+
+const char *node_vect_math_label(bNode *node)
+{
+ const char *name;
+ RNA_enum_name(node_vec_math_items, node->custom1, &name);
+ return name;
+}
+
+const char *node_filter_label(bNode *node)
+{
+ const char *name;
+ RNA_enum_name(node_filter_items, node->custom1, &name);
+ return name;
+}
diff --git a/source/blender/nodes/intern/node_util.h b/source/blender/nodes/intern/node_util.h
index 0326459ac68..c41ce3025ba 100644
--- a/source/blender/nodes/intern/node_util.h
+++ b/source/blender/nodes/intern/node_util.h
@@ -38,6 +38,11 @@ extern void node_free_standard_storage(struct bNode *node);
extern void node_copy_curves(struct bNode *orig_node, struct bNode *new_node);
extern void node_copy_standard_storage(struct bNode *orig_node, struct bNode *new_node);
+const char *node_blend_label(struct bNode *node);
+const char *node_math_label(struct bNode *node);
+const char *node_vect_math_label(struct bNode *node);
+const char *node_filter_label(struct bNode *node);
+
#endif
// this is needed for inlining behaviour
diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h
index 40d544ac17e..5ee4664fd57 100644
--- a/source/blender/python/BPY_extern.h
+++ b/source/blender/python/BPY_extern.h
@@ -31,7 +31,6 @@
#define BPY_EXTERN_H
extern char bprogname[]; /* holds a copy of argv[0], from creator.c */
-extern char btempdir[]; /* use this to store a valid temp directory */
struct Text; /* defined in DNA_text_types.h */
struct ID; /* DNA_ID.h */
@@ -39,14 +38,12 @@ struct Object; /* DNA_object_types.h */
struct ChannelDriver; /* DNA_anim_types.h */
struct ListBase; /* DNA_listBase.h */
struct SpaceText; /* DNA_space_types.h */
-struct SpaceScript; /* DNA_space_types.h */
struct ScrArea; /* DNA_screen_types.h */
struct bScreen; /* DNA_screen_types.h */
struct bConstraint; /* DNA_constraint_types.h */
struct bPythonConstraint; /* DNA_constraint_types.h */
struct bConstraintOb; /* DNA_constraint_types.h */
struct bConstraintTarget; /* DNA_constraint_types.h*/
-struct Script; /* DNA_screen_types.h */
struct BPyMenu;
struct bContext;
struct bContextDataResult;
@@ -56,34 +53,15 @@ struct ReportList;
extern "C" {
#endif
- /*These two next functions are important for making sure the Draw module
- works correctly. Before calling any gui callback using the Draw module,
- the following code must be executed:
-
- if (some_drawspace_pylist) {
- BPy_Set_DrawButtonsList(some_drawspace_pylist->but_refs);
- BPy_Free_DrawButtonsList();
- }
- some_drawspace_pylist = PyList_New(0);
- BPy_Set_DrawButtonsList(some_drawspace_pylist);
-
- Also, BPy_Free_DrawButtonsList() must be called as necassary when a drawspace
- with python callbacks is destroyed.
-
- This is necassary to avoid blender buttons storing invalid pointers to freed
- python data.*/
-// void BPy_Set_DrawButtonsList(void *list);
-// void BPy_Free_DrawButtonsList(void);
-//
- void BPY_pyconstraint_eval(struct bPythonConstraint *con, struct bConstraintOb *cob, struct ListBase *targets);
+void BPY_pyconstraint_exec(struct bPythonConstraint *con, struct bConstraintOb *cob, struct ListBase *targets);
// void BPY_pyconstraint_settings(void *arg1, void *arg2);
- void BPY_pyconstraint_target(struct bPythonConstraint *con, struct bConstraintTarget *ct);
- void BPY_pyconstraint_update(struct Object *owner, struct bConstraint *con);
- int BPY_is_pyconstraint(struct Text *text);
+void BPY_pyconstraint_target(struct bPythonConstraint *con, struct bConstraintTarget *ct);
+void BPY_pyconstraint_update(struct Object *owner, struct bConstraint *con);
+int BPY_is_pyconstraint(struct Text *text);
// void BPY_free_pyconstraint_links(struct Text *text);
//
- void BPY_start_python( int argc, char **argv );
- void BPY_end_python( void );
+void BPY_python_start( int argc, char **argv );
+void BPY_python_end( void );
// void init_syspath( int first_time );
// void syspath_append( char *dir );
// void BPY_rebuild_syspath( void );
@@ -91,55 +69,23 @@ extern "C" {
//
// int BPY_Err_getLinenumber( void );
// const char *BPY_Err_getFilename( void );
-//
-// int BPY_txt_do_python_Text( struct Text *text );
-// int BPY_menu_do_python( short menutype, int event );
-// int BPY_menu_do_shortcut( short menutype, unsigned short key, unsigned short modifiers );
-// int BPY_menu_invoke( struct BPyMenu *pym, short menutype );
-
- /* 2.5 UI Scripts */
- int BPY_run_python_script( struct bContext *C, const char *filename, struct Text *text, struct ReportList *reports ); // 2.5 working
- int BPY_run_script_space_draw(const struct bContext *C, struct SpaceScript * sc); // 2.5 working
-// int BPY_run_script_space_listener(struct bContext *C, struct SpaceScript * sc, struct ARegion *ar, struct wmNotifier *wmn); // 2.5 working
- void BPY_update_modules( void ); // XXX - annoying, need this for pointers that get out of date
-//
- int BPY_context_get(struct bContext *C, const char *member, struct bContextDataResult *result);
-//
-// int BPY_run_script(struct Script *script);
- void BPY_free_compiled_text( struct Text *text );
-//
-// int BPY_has_onload_script( void );
-//
-// int BPY_is_spacehandler(struct Text *text, char spacetype);
-// int BPY_del_spacehandler(struct Text *text, struct ScrArea *sa);
-// int BPY_add_spacehandler(struct Text *txt, struct ScrArea *sa,char spacetype);
-// int BPY_has_spacehandler(struct Text *text, struct ScrArea *sa);
-// void BPY_screen_free_spacehandlers(struct bScreen *sc);
-// int BPY_do_spacehandlers(struct ScrArea *sa, unsigned short event,
-// short eventValue, unsigned short space_event);
-//
-// void BPY_pydriver_update(void);
- float BPY_eval_driver(struct ChannelDriver *driver);
-//
- int BPY_eval_button(struct bContext *C, const char *expr, double *value);
- int BPY_eval_string(struct bContext *C, const char *expr);
+/* 2.5 UI Scripts */
+int BPY_filepath_exec(struct bContext *C, const char *filepath, struct ReportList *reports);
+int BPY_text_exec(struct bContext *C, struct Text *text, struct ReportList *reports);
+void BPY_text_free_code(struct Text *text);
+void BPY_modules_update(struct bContext *C); // XXX - annoying, need this for pointers that get out of date
+void BPY_modules_load_user(struct bContext *C);
-/* format importer hook */
- int BPY_call_importloader( char *name );
-//
-// void BPY_spacescript_do_pywin_draw( struct SpaceScript *sc );
-// void BPY_spacescript_do_pywin_event( struct SpaceScript *sc,
-// unsigned short event, short val, char ascii );
-// void BPY_free_finished_script( struct Script *script );
-// void BPY_scripts_clear_pyobjects( void );
-//
-// void error_pyscript( void );
- void BPY_DECREF(void *pyob_ptr); /* Py_DECREF() */
- void BPY_set_context(struct bContext *C);
-/* void BPY_Err_Handle(struct Text *text); */
-/* int BPY_spacetext_is_pywin(struct SpaceText *st); */
- void BPY_load_user_modules(struct bContext *C);
+void BPY_driver_reset(void);
+float BPY_driver_exec(struct ChannelDriver *driver);
+
+int BPY_button_exec(struct bContext *C, const char *expr, double *value);
+int BPY_string_exec(struct bContext *C, const char *expr);
+
+void BPY_DECREF(void *pyob_ptr); /* Py_DECREF() */
+int BPY_context_member_get(struct bContext *C, const char *member, struct bContextDataResult *result);
+void BPY_context_set(struct bContext *C);
#ifdef __cplusplus
} /* extern "C" */
diff --git a/source/blender/python/CMakeLists.txt b/source/blender/python/CMakeLists.txt
index adb60528f51..fe9e0307703 100644
--- a/source/blender/python/CMakeLists.txt
+++ b/source/blender/python/CMakeLists.txt
@@ -14,35 +14,7 @@
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
-# The Original Code is Copyright (C) 2006, Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): Jacques Beaurainm, Campbell Barton
-#
# ***** END GPL LICENSE BLOCK *****
-ADD_SUBDIRECTORY(generic)
-
-FILE(GLOB SRC intern/*.c)
-
-SET(INC
- .
- ../blenlib
- ../makesdna
- ../makesrna
- ../blenkernel
- ../windowmanager
- ../editors/include
- ../../../intern/guardedalloc
- ../../../intern/audaspace/intern
- ${PYTHON_INC}
-)
-
-# only to check if buildinfo is available
-IF(WITH_BUILDINFO)
- ADD_DEFINITIONS(-DBUILD_DATE)
-ENDIF(WITH_BUILDINFO)
-
-BLENDERLIB(bf_python "${SRC}" "${INC}")
+add_subdirectory(intern)
+add_subdirectory(generic)
diff --git a/source/blender/python/Makefile b/source/blender/python/Makefile
deleted file mode 100644
index 43b6f91369b..00000000000
--- a/source/blender/python/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) Blender Foundation.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/python
-DIRS = intern generic
-
-include nan_subdirs.mk
diff --git a/source/blender/python/doc/epy/BGL.py b/source/blender/python/doc/epy/BGL.py
deleted file mode 100644
index ce148dc72ba..00000000000
--- a/source/blender/python/doc/epy/BGL.py
+++ /dev/null
@@ -1,1807 +0,0 @@
-# Blender.BGL module (OpenGL wrapper)
-
-"""
-The Blender.BGL submodule (the OpenGL wrapper).
-
-B{New}: some GLU functions: L{gluLookAt}, etc.
-
-The Blender.BGL submodule
-=========================
-(when accessing it from the Game Engine use BGL instead of Blender.BGL)
-
-This module wraps OpenGL constants and functions, making them available from
-within Blender Python.
-
-The complete list can be retrieved from the module itself, by listing its
-contents: dir(Blender.BGL). A simple search on the net can point to more
-than enough material to teach OpenGL programming, from books to many
-collections of tutorials.
-
-The "red book": "I{OpenGL Programming Guide: The Official Guide to Learning
-OpenGL}" and the online NeHe tutorials are two of the best resources.
-
-Example::
- import Blender
- from Blender.BGL import *
- from Blender import Draw
- R = G = B = 0
- A = 1
- title = "Testing BGL + Draw"
- instructions = "Use mouse buttons or wheel to change the background color."
- quitting = " Press ESC or q to quit."
- len1 = Draw.GetStringWidth(title)
- len2 = Draw.GetStringWidth(instructions + quitting)
- #
- def show_win():
- glClearColor(R,G,B,A) # define color used to clear buffers
- glClear(GL_COLOR_BUFFER_BIT) # use it to clear the color buffer
- glColor3f(0.35,0.18,0.92) # define default color
- glBegin(GL_POLYGON) # begin a vertex data list
- glVertex2i(165, 158)
- glVertex2i(252, 55)
- glVertex2i(104, 128)
- glEnd()
- glColor3f(0.4,0.4,0.4) # change default color
- glRecti(40, 96, 60+len1, 113)
- glColor3f(1,1,1)
- glRasterPos2i(50,100) # move cursor to x = 50, y = 100
- Draw.Text(title) # draw this text there
- glRasterPos2i(350,40) # move cursor again
- Draw.Text(instructions + quitting) # draw another msg
- glBegin(GL_LINE_LOOP) # begin a vertex-data list
- glVertex2i(46,92)
- glVertex2i(120,92)
- glVertex2i(120,115)
- glVertex2i(46,115)
- glEnd() # close this list
- #
- def ev(evt, val): # event callback for Draw.Register()
- global R,G,B,A # ... it handles input events
- if evt == Draw.ESCKEY or evt == Draw.QKEY:
- Draw.Exit() # this quits the script
- elif not val: return
- elif evt == Draw.LEFTMOUSE: R = 1 - R
- elif evt == Draw.MIDDLEMOUSE: G = 1 - G
- elif evt == Draw.RIGHTMOUSE: B = 1 - B
- elif evt == Draw.WHEELUPMOUSE:
- R += 0.1
- if R > 1: R = 1
- elif evt == Draw.WHEELDOWNMOUSE:
- R -= 0.1
- if R < 0: R = 0
- else:
- return # don't redraw if nothing changed
- Draw.Redraw(1) # make changes visible.
- #
- Draw.Register(show_win, ev, None) # start the main loop
-
-@note: you can use the L{Image} module and L{Image.Image} BPy object to load
- and set textures. See L{Image.Image.glLoad} and L{Image.Image.glFree},
- for example.
-@see: U{www.opengl.org}
-@see: U{nehe.gamedev.net}
-"""
-
-def glAccum(op, value):
- """
- Operate on the accumulation buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/accum.html}
-
- @type op: Enumerated constant
- @param op: The accumulation buffer operation.
- @type value: float
- @param value: a value used in the accumulation buffer operation.
- """
-
-def glAlphaFunc(func, ref):
- """
- Specify the alpha test function
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/alphafunc.html}
-
- @type func: Enumerated constant
- @param func: Specifies the alpha comparison function.
- @type ref: float
- @param ref: The reference value that incoming alpha values are compared to.
- Clamped between 0 and 1.
- """
-
-def glAreTexturesResident(n, textures, residences):
- """
- Determine if textures are loaded in texture memory
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/aretexturesresident.html}
-
- @type n: int
- @param n: Specifies the number of textures to be queried.
- @type textures: Buffer object I{type GL_INT}
- @param textures: Specifies an array containing the names of the textures to be queried
- @type residences: Buffer object I{type GL_INT}(boolean)
- @param residences: An array in which the texture residence status in returned.The residence status of a
- texture named by an element of textures is returned in the corresponding element of residences.
- """
-
-def glBegin(mode):
- """
- Delimit the vertices of a primitive or a group of like primatives
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/begin.html}
-
- @type mode: Enumerated constant
- @param mode: Specifies the primitive that will be create from vertices between glBegin and
- glEnd.
- """
-
-def glBindTexture(target, texture):
- """
- Bind a named texture to a texturing target
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/bindtexture.html}
-
- @type target: Enumerated constant
- @param target: Specifies the target to which the texture is bound.
- @type texture: unsigned int
- @param texture: Specifies the name of a texture.
- """
-
-def glBitmap(width, height, xorig, yorig, xmove, ymove, bitmap):
- """
- Draw a bitmap
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/bitmap.html}
-
- @type width, height: int
- @param width, height: Specify the pixel width and height of the bitmap image.
- @type xorig, yorig: float
- @param xorig, yorig: Specify the location of the origin in the bitmap image. The origin is measured
- from the lower left corner of the bitmap, with right and up being the positive axes.
- @type xmove, ymove: float
- @param xmove, ymove: Specify the x and y offsets to be added to the current raster position after
- the bitmap is drawn.
- @type bitmap: Buffer object I{type GL_BYTE}
- @param bitmap: Specifies the address of the bitmap image.
- """
-
-def glBlendFunc(sfactor, dfactor):
- """
- Specify pixel arithmetic
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/blendfunc.html}
-
- @type sfactor: Enumerated constant
- @param sfactor: Specifies how the red, green, blue, and alpha source blending factors are
- computed.
- @type dfactor: Enumerated constant
- @param dfactor: Specifies how the red, green, blue, and alpha destination blending factors are
- computed.
- """
-
-def glCallList(list):
- """
- Execute a display list
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/calllist.html}
-
- @type list: unsigned int
- @param list: Specifies the integer name of the display list to be executed.
- """
-
-def glCallLists(n, type, lists):
- """
- Execute a list of display lists
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/calllists.html}
-
- @type n: int
- @param n: Specifies the number of display lists to be executed.
- @type type: Enumerated constant
- @param type: Specifies the type of values in lists.
- @type lists: Buffer object
- @param lists: Specifies the address of an array of name offsets in the display list.
- The pointer type is void because the offsets can be bytes, shorts, ints, or floats,
- depending on the value of type.
- """
-
-def glClear(mask):
- """
- Clear buffers to preset values
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/clear.html}
-
- @type mask: Enumerated constant(s)
- @param mask: Bitwise OR of masks that indicate the buffers to be cleared.
- """
-
-def glClearAccum(red, green, blue, alpha):
- """
- Specify clear values for the accumulation buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/clearaccum.html}
-
- @type red, green, blue, alpha: float
- @param red, green, blue, alpha: Specify the red, green, blue, and alpha values used when the
- accumulation buffer is cleared. The initial values are all 0.
- """
-
-def glClearColor(red, green, blue, alpha):
- """
- Specify clear values for the color buffers
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/clearcolor.html}
-
- @type red, green, blue, alpha: float
- @param red, green, blue, alpha: Specify the red, green, blue, and alpha values used when the
- color buffers are cleared. The initial values are all 0.
- """
-
-def glClearDepth(depth):
- """
- Specify the clear value for the depth buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/cleardepth.html}
-
- @type depth: int
- @param depth: Specifies the depth value used when the depth buffer is cleared.
- The initial value is 1.
- """
-
-def glClearIndex(c):
- """
- Specify the clear value for the color index buffers
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/clearindex.html}
-
- @type c: float
- @param c: Specifies the index used when the color index buffers are cleared.
- The initial value is 0.
- """
-
-def glClearStencil(s):
- """
- Specify the clear value for the stencil buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/clearstencil.html}
-
- @type s: int
- @param s: Specifies the index used when the stencil buffer is cleared. The initial value is 0.
- """
-
-def glClipPlane (plane, equation):
- """
- Specify a plane against which all geometry is clipped
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/clipplane.html}
-
- @type plane: Enumerated constant
- @param plane: Specifies which clipping plane is being positioned.
- @type equation: Buffer object I{type GL_FLOAT}(double)
- @param equation: Specifies the address of an array of four double- precision floating-point
- values. These values are interpreted as a plane equation.
- """
-
-def glColor (red, green, blue, alpha):
- """
- B{glColor3b, glColor3d, glColor3f, glColor3i, glColor3s, glColor3ub, glColor3ui, glColor3us,
- glColor4b, glColor4d, glColor4f, glColor4i, glColor4s, glColor4ub, glColor4ui, glColor4us,
- glColor3bv, glColor3dv, glColor3fv, glColor3iv, glColor3sv, glColor3ubv, glColor3uiv,
- glColor3usv, glColor4bv, glColor4dv, glColor4fv, glColor4iv, glColor4sv, glColor4ubv,
- glColor4uiv, glColor4usv}
-
- Set a new color.
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/color.html}
-
- @type red, green, blue, alpha: Depends on function prototype.
- @param red, green, blue: Specify new red, green, and blue values for the current color.
- @param alpha: Specifies a new alpha value for the current color. Included only in the
- four-argument glColor4 commands. (With '4' colors only)
- """
-
-def glColorMask(red, green, blue, alpha):
- """
- Enable and disable writing of frame buffer color components
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/colormask.html}
-
- @type red, green, blue, alpha: int (boolean)
- @param red, green, blue, alpha: Specify whether red, green, blue, and alpha can or cannot be
- written into the frame buffer. The initial values are all GL_TRUE, indicating that the
- color components can be written.
- """
-
-def glColorMaterial(face, mode):
- """
- Cause a material color to track the current color
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/colormaterial.html}
-
- @type face: Enumerated constant
- @param face: Specifies whether front, back, or both front and back material parameters should
- track the current color.
- @type mode: Enumerated constant
- @param mode: Specifies which of several material parameters track the current color.
- """
-
-def glCopyPixels(x, y, width, height, type):
- """
- Copy pixels in the frame buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/copypixels.html}
-
- @type x, y: int
- @param x, y: Specify the window coordinates of the lower left corner of the rectangular
- region of pixels to be copied.
- @type width, height: int
- @param width,height: Specify the dimensions of the rectangular region of pixels to be copied.
- Both must be non-negative.
- @type type: Enumerated constant
- @param type: Specifies whether color values, depth values, or stencil values are to be copied.
- """
-
- def glCopyTexImage2D(target, level, internalformat, x, y, width, height, border):
- """
- Copy pixels into a 2D texture image
- @see: U{www.opengl.org/sdk/docs/man/xhtml/glCopyTexImage2D.xml}
-
- @type target: Enumerated constant
- @param target: Specifies the target texture.
- @type level: int
- @param level: Specifies the level-of-detail number. Level 0 is the base image level.
- Level n is the nth mipmap reduction image.
- @type internalformat: int
- @param internalformat: Specifies the number of color components in the texture.
- @type width: int
- @type x, y: int
- @param x, y:Specify the window coordinates of the first pixel that is copied
- from the frame buffer. This location is the lower left corner of a rectangular
- block of pixels.
- @param width: Specifies the width of the texture image. Must be 2n+2(border) for
- some integer n. All implementations support texture images that are at least 64
- texels wide.
- @type height: int
- @param height: Specifies the height of the texture image. Must be 2m+2(border) for
- some integer m. All implementations support texture images that are at least 64
- texels high.
- @type border: int
- @param border: Specifies the width of the border. Must be either 0 or 1.
- """
-
-def glCullFace(mode):
- """
- Specify whether front- or back-facing facets can be culled
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/cullface.html}
-
- @type mode: Enumerated constant
- @param mode: Specifies whether front- or back-facing facets are candidates for culling.
- """
-
-def glDeleteLists(list, range):
- """
- Delete a contiguous group of display lists
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/deletelists.html}
-
- @type list: unsigned int
- @param list: Specifies the integer name of the first display list to delete
- @type range: int
- @param range: Specifies the number of display lists to delete
- """
-
-def glDeleteTextures(n, textures):
- """
- Delete named textures
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/deletetextures.html}
-
- @type n: int
- @param n: Specifies the number of textures to be deleted
- @type textures: Buffer I{GL_INT}
- @param textures: Specifies an array of textures to be deleted
- """
-
-def glDepthFunc(func):
- """
- Specify the value used for depth buffer comparisons
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/depthfunc.html}
-
- @type func: Enumerated constant
- @param func: Specifies the depth comparison function.
- """
-
-def glDepthMask(flag):
- """
- Enable or disable writing into the depth buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/depthmask.html}
-
- @type flag: int (boolean)
- @param flag: Specifies whether the depth buffer is enabled for writing. If flag is GL_FALSE,
- depth buffer writing is disabled. Otherwise, it is enabled. Initially, depth buffer
- writing is enabled.
- """
-
-def glDepthRange(zNear, zFar):
- """
- Specify mapping of depth values from normalized device coordinates to window coordinates
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/depthrange.html}
-
- @type zNear: int
- @param zNear: Specifies the mapping of the near clipping plane to window coordinates.
- The initial value is 0.
- @type zFar: int
- @param zFar: Specifies the mapping of the far clipping plane to window coordinates.
- The initial value is 1.
- """
-
-def glDisable(cap):
- """
- Disable server-side GL capabilities
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/enable.html}
-
- @type cap: Enumerated constant
- @param cap: Specifies a symbolic constant indicating a GL capability.
- """
-
-def glDrawBuffer(mode):
- """
- Specify which color buffers are to be drawn into
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/drawbuffer.html}
-
- @type mode: Enumerated constant
- @param mode: Specifies up to four color buffers to be drawn into.
- """
-
-def glDrawPixels(width, height, format, type, pixels):
- """
- Write a block of pixels to the frame buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/drawpixels.html}
-
- @type width, height: int
- @param width, height: Specify the dimensions of the pixel rectangle to be
- written into the frame buffer.
- @type format: Enumerated constant
- @param format: Specifies the format of the pixel data.
- @type type: Enumerated constant
- @param type: Specifies the data type for pixels.
- @type pixels: Buffer object
- @param pixels: Specifies a pointer to the pixel data.
- """
-
-def glEdgeFlag (flag):
- """
- B{glEdgeFlag, glEdgeFlagv}
-
- Flag edges as either boundary or non-boundary
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/edgeflag.html}
-
- @type flag: Depends of function prototype
- @param flag: Specifies the current edge flag value.The initial value is GL_TRUE.
- """
-
-def glEnable(cap):
- """
- Enable server-side GL capabilities
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/enable.html}
-
- @type cap: Enumerated constant
- @param cap: Specifies a symbolic constant indicating a GL capability.
- """
-
-def glEnd():
- """
- Delimit the vertices of a primitive or group of like primitives
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/begin.html}
- """
-
-def glEndList():
- """
- Create or replace a display list
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/newlist.html}
- """
-
-def glEvalCoord (u,v):
- """
- B{glEvalCoord1d, glEvalCoord1f, glEvalCoord2d, glEvalCoord2f, glEvalCoord1dv, glEvalCoord1fv,
- glEvalCoord2dv, glEvalCoord2fv}
-
- Evaluate enabled one- and two-dimensional maps
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/evalcoord.html}
-
- @type u: Depends on function prototype.
- @param u: Specifies a value that is the domain coordinate u to the basis function defined
- in a previous glMap1 or glMap2 command. If the function prototype ends in 'v' then
- u specifies a pointer to an array containing either one or two domain coordinates. The first
- coordinate is u. The second coordinate is v, which is present only in glEvalCoord2 versions.
- @type v: Depends on function prototype. (only with '2' prototypes)
- @param v: Specifies a value that is the domain coordinate v to the basis function defined
- in a previous glMap2 command. This argument is not present in a glEvalCoord1 command.
- """
-
-def glEvalMesh (mode, i1, i2):
- """
- B{glEvalMesh1 or glEvalMesh2}
-
- Compute a one- or two-dimensional grid of points or lines
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/evalmesh.html}
-
- @type mode: Enumerated constant
- @param mode: In glEvalMesh1, specifies whether to compute a one-dimensional
- mesh of points or lines.
- @type i1, i2: int
- @param i1, i2: Specify the first and last integer values for the grid domain variable i.
- """
-
-def glEvalPoint (i, j):
- """
- B{glEvalPoint1 and glEvalPoint2}
-
- Generate and evaluate a single point in a mesh
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/evalpoint.html}
-
- @type i: int
- @param i: Specifies the integer value for grid domain variable i.
- @type j: int (only with '2' prototypes)
- @param j: Specifies the integer value for grid domain variable j (glEvalPoint2 only).
- """
-
-def glFeedbackBuffer (size, type, buffer):
- """
- Controls feedback mode
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/feedbackbuffer.html}
-
- @type size: int
- @param size:Specifies the maximum number of values that can be written into buffer.
- @type type: Enumerated constant
- @param type:Specifies a symbolic constant that describes the information that
- will be returned for each vertex.
- @type buffer: Buffer object I{GL_FLOAT}
- @param buffer: Returns the feedback data.
- """
-
-def glFinish():
- """
- Block until all GL execution is complete
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/finish.html}
- """
-
-def glFlush():
- """
- Force Execution of GL commands in finite time
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/flush.html}
- """
-
-def glFog (pname, param):
- """
- B{glFogf, glFogi, glFogfv, glFogiv}
-
- Specify fog parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/fog.html}
-
- @type pname: Enumerated constant
- @param pname: Specifies a single-valued fog parameter. If the function prototype
- ends in 'v' specifies a fog parameter.
- @type param: Depends on function prototype.
- @param param: Specifies the value or values to be assigned to pname. GL_FOG_COLOR
- requires an array of four values. All other parameters accept an array containing
- only a single value.
- """
-
-def glFrontFace(mode):
- """
- Define front- and back-facing polygons
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/frontface.html}
-
- @type mode: Enumerated constant
- @param mode: Specifies the orientation of front-facing polygons.
- """
-
-def glFrustum(left, right, bottom, top, zNear, zFar):
- """
- Multiply the current matrix by a perspective matrix
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/frustum.html}
-
- @type left, right: double (float)
- @param left, right: Specify the coordinates for the left and right vertical
- clipping planes.
- @type top, bottom: double (float)
- @param top, bottom: Specify the coordinates for the bottom and top horizontal
- clipping planes.
- @type zNear, zFar: double (float)
- @param zNear, zFar: Specify the distances to the near and far depth clipping planes.
- Both distances must be positive.
- """
-
-def glGenLists(range):
- """
- Generate a contiguous set of empty display lists
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/genlists.html}
-
- @type range: int
- @param range: Specifies the number of contiguous empty display lists to be generated.
- """
-
-def glGenTextures(n, textures):
- """
- Generate texture names
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/gentextures.html}
-
- @type n: int
- @param n: Specifies the number of textures name to be generated.
- @type textures: Buffer object I{type GL_INT}
- @param textures: Specifies an array in which the generated textures names are stored.
- """
-
-def glGet (pname, param):
- """
- B{glGetBooleanv, glGetfloatv, glGetFloatv, glGetIntegerv}
-
- Return the value or values of a selected parameter
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/get.html}
-
- @type pname: Enumerated constant
- @param pname: Specifies the parameter value to be returned.
- @type param: Depends on function prototype.
- @param param: Returns the value or values of the specified parameter.
- """
-
-def glGetClipPlane(plane, equation):
- """
- Return the coefficients of the specified clipping plane
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getclipplane.html}
-
- @type plane: Enumerated constant
- @param plane: Specifies a clipping plane. The number of clipping planes depends on the
- implementation, but at least six clipping planes are supported. They are identified by
- symbolic names of the form GL_CLIP_PLANEi where 0 < i < GL_MAX_CLIP_PLANES.
- @type equation: Buffer object I{type GL_FLOAT}
- @param equation: Returns four float (double)-precision values that are the coefficients of the
- plane equation of plane in eye coordinates. The initial value is (0, 0, 0, 0).
- """
-
-def glGetError():
- """
- Return error information
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/geterror.html}
- """
-
-def glGetLight (light, pname, params):
- """
- B{glGetLightfv and glGetLightiv}
-
- Return light source parameter values
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getlight.html}
-
- @type light: Enumerated constant
- @param light: Specifies a light source. The number of possible lights depends on the
- implementation, but at least eight lights are supported. They are identified by symbolic
- names of the form GL_LIGHTi where 0 < i < GL_MAX_LIGHTS.
- @type pname: Enumerated constant
- @param pname: Specifies a light source parameter for light.
- @type params: Buffer object. Depends on function prototype.
- @param params: Returns the requested data.
- """
-
-def glGetMap (target, query, v):
- """
- B{glGetMapdv, glGetMapfv, glGetMapiv}
-
- Return evaluator parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getmap.html}
-
- @type target: Enumerated constant
- @param target: Specifies the symbolic name of a map.
- @type query: Enumerated constant
- @param query: Specifies which parameter to return.
- @type v: Buffer object. Depends on function prototype.
- @param v: Returns the requested data.
- """
-
-def glGetMaterial (face, pname, params):
- """
- B{glGetMaterialfv, glGetMaterialiv}
-
- Return material parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getmaterial.html}
-
- @type face: Enumerated constant
- @param face: Specifies which of the two materials is being queried.
- representing the front and back materials, respectively.
- @type pname: Enumerated constant
- @param pname: Specifies the material parameter to return.
- @type params: Buffer object. Depends on function prototype.
- @param params: Returns the requested data.
- """
-
-def glGetPixelMap (map, values):
- """
- B{glGetPixelMapfv, glGetPixelMapuiv, glGetPixelMapusv}
-
- Return the specified pixel map
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getpixelmap.html}
-
- @type map: Enumerated constant
- @param map: Specifies the name of the pixel map to return.
- @type values: Buffer object. Depends on function prototype.
- @param values: Returns the pixel map contents.
- """
-
-def glGetPolygonStipple(mask):
- """
- Return the polygon stipple pattern
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getpolygonstipple.html}
-
- @type mask: Buffer object I{type GL_BYTE}
- @param mask: Returns the stipple pattern. The initial value is all 1's.
- """
-
-def glGetString(name):
- """
- Return a string describing the current GL connection
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getstring.html}
-
- @type name: Enumerated constant
- @param name: Specifies a symbolic constant.
-
- """
-
-def glGetTexEnv (target, pname, params):
- """
- B{glGetTexEnvfv, glGetTexEnviv}
-
- Return texture environment parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/gettexenv.html}
-
- @type target: Enumerated constant
- @param target: Specifies a texture environment. Must be GL_TEXTURE_ENV.
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name of a texture environment parameter.
- @type params: Buffer object. Depends on function prototype.
- @param params: Returns the requested data.
- """
-
-def glGetTexGen (coord, pname, params):
- """
- B{glGetTexGendv, glGetTexGenfv, glGetTexGeniv}
-
- Return texture coordinate generation parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/gettexgen.html}
-
- @type coord: Enumerated constant
- @param coord: Specifies a texture coordinate.
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name of the value(s) to be returned.
- @type params: Buffer object. Depends on function prototype.
- @param params: Returns the requested data.
- """
-
-def glGetTexImage(target, level, format, type, pixels):
- """
- Return a texture image
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getteximage.html}
-
- @type target: Enumerated constant
- @param target: Specifies which texture is to be obtained.
- @type level: int
- @param level: Specifies the level-of-detail number of the desired image.
- Level 0 is the base image level. Level n is the nth mipmap reduction image.
- @type format: Enumerated constant
- @param format: Specifies a pixel format for the returned data.
- @type type: Enumerated constant
- @param type: Specifies a pixel type for the returned data.
- @type pixels: Buffer object.
- @param pixels: Returns the texture image. Should be a pointer to an array of the
- type specified by type
- """
-
-def glGetTexLevelParameter (target, level, pname, params):
- """
- B{glGetTexLevelParameterfv, glGetTexLevelParameteriv}
-
- return texture parameter values for a specific level of detail
- @see: U{opengl.org/developers/documentation/man_pages/hardcopy/GL/html/gl/gettexlevelparameter.html}
-
- @type target: Enumerated constant
- @param target: Specifies the symbolic name of the target texture.
- @type level: int
- @param level: Specifies the level-of-detail number of the desired image.
- Level 0 is the base image level. Level n is the nth mipmap reduction image.
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name of a texture parameter.
- @type params: Buffer object. Depends on function prototype.
- @param params: Returns the requested data.
- """
-
-def glGetTexParameter (target, pname, params):
- """
- B{glGetTexParameterfv, glGetTexParameteriv}
-
- Return texture parameter values
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/gettexparameter.html}
-
- @type target: Enumerated constant
- @param target: Specifies the symbolic name of the target texture.
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name the target texture.
- @type params: Buffer object. Depends on function prototype.
- @param params: Returns the texture parameters.
- """
-
-def glHint(target, mode):
- """
- Specify implementation-specific hints
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/hint.html}
-
- @type target: Enumerated constant
- @param target: Specifies a symbolic constant indicating the behavior to be
- controlled.
- @type mode: Enumerated constant
- @param mode: Specifies a symbolic constant indicating the desired behavior.
- """
-
-def glIndex (c):
- """
- B{glIndexd, glIndexf, glIndexi, glIndexs, glIndexdv, glIndexfv, glIndexiv, glIndexsv}
-
- Set the current color index
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/index_.html}
-
- @type c: Buffer object. Depends on function prototype.
- @param c: Specifies a pointer to a one element array that contains the new value for
- the current color index.
- """
-
-def glInitNames():
- """
- Initialize the name stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/initnames.html}
- """
-
-def glIsEnabled(cap):
- """
- Test whether a capability is enabled
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/isenabled.html}
-
- @type cap: Enumerated constant
- @param cap: Specifies a constant representing a GL capability.
- """
-
-def glIsList(list):
- """
- Determine if a name corresponds to a display-list
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/islist.html}
-
- @type list: unsigned int
- @param list: Specifies a potential display-list name.
- """
-
-def glIsTexture(texture):
- """
- Determine if a name corresponds to a texture
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/istexture.html}
-
- @type texture: unsigned int
- @param texture: Specifies a value that may be the name of a texture.
- """
-
-def glLight (light, pname, param):
- """
- B{glLightf,glLighti, glLightfv, glLightiv}
-
- Set the light source parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/light.html}
-
- @type light: Enumerated constant
- @param light: Specifies a light. The number of lights depends on the implementation,
- but at least eight lights are supported. They are identified by symbolic names of the
- form GL_LIGHTi where 0 < i < GL_MAX_LIGHTS.
- @type pname: Enumerated constant
- @param pname: Specifies a single-valued light source parameter for light.
- @type param: Depends on function prototype.
- @param param: Specifies the value that parameter pname of light source light will be set to.
- If function prototype ends in 'v' specifies a pointer to the value or values that
- parameter pname of light source light will be set to.
- """
-
-def glLightModel (pname, param):
- """
- B{glLightModelf, glLightModeli, glLightModelfv, glLightModeliv}
-
- Set the lighting model parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/lightmodel.html}
-
- @type pname: Enumerated constant
- @param pname: Specifies a single-value light model parameter.
- @type param: Depends on function prototype.
- @param param: Specifies the value that param will be set to. If function prototype ends in 'v'
- specifies a pointer to the value or values that param will be set to.
- """
-
-def glLineStipple(factor, pattern):
- """
- Specify the line stipple pattern
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/linestipple.html}
-
- @type factor: int
- @param factor: Specifies a multiplier for each bit in the line stipple pattern.
- If factor is 3, for example, each bit in the pattern is used three times before
- the next bit in the pattern is used. factor is clamped to the range [1, 256] and
- defaults to 1.
- @type pattern: unsigned short int
- @param pattern: Specifies a 16-bit integer whose bit pattern determines which fragments
- of a line will be drawn when the line is rasterized. Bit zero is used first; the default
- pattern is all 1's.
- """
-
-def glLineWidth(width):
- """
- Specify the width of rasterized lines.
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/linewidth.html}
-
- @type width: float
- @param width: Specifies the width of rasterized lines. The initial value is 1.
- """
-
-def glListBase(base):
- """
- Set the display-list base for glCallLists
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/listbase.html}
-
- @type base: unsigned int
- @param base: Specifies an integer offset that will be added to glCallLists
- offsets to generate display-list names. The initial value is 0.
- """
-
-def glLoadIdentity():
- """
- Replace the current matrix with the identity matrix
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/loadidentity.html}
- """
-
-def glLoadMatrix (m):
- """
- B{glLoadMatrixd, glLoadMatixf}
-
- Replace the current matrix with the specified matrix
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/loadmatrix.html}
-
- @type m: Buffer object. Depends on function prototype.
- @param m: Specifies a pointer to 16 consecutive values, which are used as the elements
- of a 4x4 column-major matrix.
- """
-
-def glLoadName(name):
- """
- Load a name onto the name stack.
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/loadname.html}
-
- @type name: unsigned int
- @param name: Specifies a name that will replace the top value on the name stack.
- """
-
-def glLogicOp(opcode):
- """
- Specify a logical pixel operation for color index rendering
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/logicop.html}
-
- @type opcode: Enumerated constant
- @param opcode: Specifies a symbolic constant that selects a logical operation.
- """
-
-def glMap1 (target, u1, u2, stride, order, points):
- """
- B{glMap1d, glMap1f}
-
- Define a one-dimensional evaluator
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/map1.html}
-
- @type target: Enumerated constant
- @param target: Specifies the kind of values that are generated by the evaluator.
- @type u1, u2: Depends on function prototype.
- @param u1,u2: Specify a linear mapping of u, as presented to glEvalCoord1, to ^, t
- he variable that is evaluated by the equations specified by this command.
- @type stride: int
- @param stride: Specifies the number of floats or float (double)s between the beginning
- of one control point and the beginning of the next one in the data structure
- referenced in points. This allows control points to be embedded in arbitrary data
- structures. The only constraint is that the values for a particular control point must
- occupy contiguous memory locations.
- @type order: int
- @param order: Specifies the number of control points. Must be positive.
- @type points: Buffer object. Depends on function prototype.
- @param points: Specifies a pointer to the array of control points.
- """
-
-def glMap2 (target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points):
- """
- B{glMap2d, glMap2f}
-
- Define a two-dimensional evaluator
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/map2.html}
-
- @type target: Enumerated constant
- @param target: Specifies the kind of values that are generated by the evaluator.
- @type u1, u2: Depends on function prototype.
- @param u1,u2: Specify a linear mapping of u, as presented to glEvalCoord2, to ^, t
- he variable that is evaluated by the equations specified by this command. Initially
- u1 is 0 and u2 is 1.
- @type ustride: int
- @param ustride: Specifies the number of floats or float (double)s between the beginning
- of control point R and the beginning of control point R ij, where i and j are the u
- and v control point indices, respectively. This allows control points to be embedded
- in arbitrary data structures. The only constraint is that the values for a particular
- control point must occupy contiguous memory locations. The initial value of ustride is 0.
- @type uorder: int
- @param uorder: Specifies the dimension of the control point array in the u axis.
- Must be positive. The initial value is 1.
- @type v1, v2: Depends on function prototype.
- @param v1, v2: Specify a linear mapping of v, as presented to glEvalCoord2, to ^,
- one of the two variables that are evaluated by the equations specified by this command.
- Initially, v1 is 0 and v2 is 1.
- @type vstride: int
- @param vstride: Specifies the number of floats or float (double)s between the beginning of control
- point R and the beginning of control point R ij, where i and j are the u and v control
- point(indices, respectively. This allows control points to be embedded in arbitrary data
- structures. The only constraint is that the values for a particular control point must
- occupy contiguous memory locations. The initial value of vstride is 0.
- @type vorder: int
- @param vorder: Specifies the dimension of the control point array in the v axis.
- Must be positive. The initial value is 1.
- @type points: Buffer object. Depends on function prototype.
- @param points: Specifies a pointer to the array of control points.
- """
-
-def glMapGrid (un, u1,u2 ,vn, v1, v2):
- """
- B{glMapGrid1d, glMapGrid1f, glMapGrid2d, glMapGrid2f}
-
- Define a one- or two-dimensional mesh
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/mapgrid.html}
-
- @type un: int
- @param un: Specifies the number of partitions in the grid range interval
- [u1, u2]. Must be positive.
- @type u1, u2: Depends on function prototype.
- @param u1, u2: Specify the mappings for integer grid domain values i=0 and i=un.
- @type vn: int
- @param vn: Specifies the number of partitions in the grid range interval [v1, v2]
- (glMapGrid2 only).
- @type v1, v2: Depends on function prototype.
- @param v1, v2: Specify the mappings for integer grid domain values j=0 and j=vn
- (glMapGrid2 only).
- """
-
-def glMaterial (face, pname, params):
- """
- Specify material parameters for the lighting model.
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/material.html}
-
- @type face: Enumerated constant
- @param face: Specifies which face or faces are being updated. Must be one of:
- @type pname: Enumerated constant
- @param pname: Specifies the single-valued material parameter of the face
- or faces that is being updated. Must be GL_SHININESS.
- @type params: int
- @param params: Specifies the value that parameter GL_SHININESS will be set to.
- If function prototype ends in 'v' specifies a pointer to the value or values that
- pname will be set to.
- """
-
-def glMatrixMode(mode):
- """
- Specify which matrix is the current matrix.
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/matrixmode.html}
-
- @type mode: Enumerated constant
- @param mode: Specifies which matrix stack is the target for subsequent matrix operations.
- """
-
-def glMultMatrix (m):
- """
- B{glMultMatrixd, glMultMatrixf}
-
- Multiply the current matrix with the specified matrix
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/multmatrix.html}
-
- @type m: Buffer object. Depends on function prototype.
- @param m: Points to 16 consecutive values that are used as the elements of a 4x4 column
- major matrix.
- """
-
-def glNewList(list, mode):
- """
- Create or replace a display list
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/newlist.html}
-
- @type list: unsigned int
- @param list: Specifies the display list name
- @type mode: Enumerated constant
- @param mode: Specifies the compilation mode.
- """
-
-def glNormal3 (nx, ny, nz, v):
- """
- B{Normal3b, Normal3bv, Normal3d, Normal3dv, Normal3f, Normal3fv, Normal3i, Normal3iv,
- Normal3s, Normal3sv}
-
- Set the current normal vector
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/normal.html}
-
- @type nx, ny, nz: Depends on function prototype. (non - 'v' prototypes only)
- @param nx, ny, nz: Specify the x, y, and z coordinates of the new current normal.
- The initial value of the current normal is the unit vector, (0, 0, 1).
- @type v: Buffer object. Depends on function prototype. ('v' prototypes)
- @param v: Specifies a pointer to an array of three elements: the x, y, and z coordinates
- of the new current normal.
- """
-
-def glOrtho(left, right, bottom, top, zNear, zFar):
- """
- Multiply the current matrix with an orthographic matrix
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/ortho.html}
-
- @type left, right: double (float)
- @param left, right: Specify the coordinates for the left and
- right vertical clipping planes.
- @type bottom, top: double (float)
- @param bottom, top: Specify the coordinates for the bottom and top
- horizontal clipping planes.
- @type zNear, zFar: double (float)
- @param zNear, zFar: Specify the distances to the nearer and farther
- depth clipping planes. These values are negative if the plane is to be behind the viewer.
- """
-
-def glPassThrough(token):
- """
- Place a marker in the feedback buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/passthrough.html}
-
- @type token: float
- @param token: Specifies a marker value to be placed in the feedback
- buffer following a GL_PASS_THROUGH_TOKEN.
- """
-
-def glPixelMap (map, mapsize, values):
- """
- B{glPixelMapfv, glPixelMapuiv, glPixelMapusv}
-
- Set up pixel transfer maps
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pixelmap.html}
-
- @type map: Enumerated constant
- @param map: Specifies a symbolic map name.
- @type mapsize: int
- @param mapsize: Specifies the size of the map being defined.
- @type values: Buffer object. Depends on function prototype.
- @param values: Specifies an array of mapsize values.
- """
-
-def glPixelStore (pname, param):
- """
- B{glPixelStoref, glPixelStorei}
-
- Set pixel storage modes
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pixelstore.html}
-
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name of the parameter to be set.
- Six values affect the packing of pixel data into memory.
- Six more affect the unpacking of pixel data from memory.
- @type param: Depends on function prototype.
- @param param: Specifies the value that pname is set to.
- """
-
-def glPixelTransfer (pname, param):
- """
- B{glPixelTransferf, glPixelTransferi}
-
- Set pixel transfer modes
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pixeltransfer.html}
-
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name of the pixel transfer parameter to be set.
- @type param: Depends on function prototype.
- @param param: Specifies the value that pname is set to.
- """
-
-def glPixelZoom(xfactor, yfactor):
- """
- Specify the pixel zoom factors
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pixelzoom.html}
-
- @type xfactor, yfactor: float
- @param xfactor, yfactor: Specify the x and y zoom factors for pixel write operations.
- """
-
-def glPointSize(size):
- """
- Specify the diameter of rasterized points
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pointsize.html}
-
- @type size: float
- @param size: Specifies the diameter of rasterized points. The initial value is 1.
- """
-
-def glPolygonMode(face, mode):
- """
- Select a polygon rasterization mode
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/polygonmode.html}
-
- @type face: Enumerated constant
- @param face: Specifies the polygons that mode applies to.
- Must be GL_FRONT for front-facing polygons, GL_BACK for back- facing polygons,
- or GL_FRONT_AND_BACK for front- and back-facing polygons.
- @type mode: Enumerated constant
- @param mode: Specifies how polygons will be rasterized.
- The initial value is GL_FILL for both front- and back- facing polygons.
- """
-
-def glPolygonOffset(factor, units):
- """
- Set the scale and units used to calculate depth values
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/polygonoffset.html}
-
- @type factor: float
- @param factor: Specifies a scale factor that is used to create a variable depth
- offset for each polygon. The initial value is 0.
- @type units: float
- @param units: Is multiplied by an implementation-specific value to create a constant
- depth offset. The initial value is 0.
- """
-
-def glPolygonStipple(mask):
- """
- Set the polygon stippling pattern
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/polygonstipple.html}
-
- @type mask: Buffer object I{type GL_BYTE}
- @param mask: Specifies a pointer to a 32x32 stipple pattern that will be unpacked
- from memory in the same way that glDrawPixels unpacks pixels.
- """
-
-def glPopAttrib():
- """
- Pop the server attribute stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushattrib.html}
- """
-
-def glPopClientAttrib():
- """
- Pop the client attribute stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushclientattrib.html}
- """
-
-def glPopMatrix():
- """
- Pop the current matrix stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushmatrix.html}
- """
-
-def glPopName():
- """
- Pop the name stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushname.html}
- """
-
-def glPrioritizeTextures(n, textures, priorities):
- """
- Set texture residence priority
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/prioritizetextures.html}
-
- @type n: int
- @param n:Specifies the number of textures to be prioritized.
- @type textures: Buffer I{type GL_INT}
- @param textures: Specifies an array containing the names of the textures to be prioritized.
- @type priorities: Buffer I{type GL_FLOAT}
- @param priorities: Specifies an array containing the texture priorities. A priority given
- in an element of priorities applies to the texture named by the corresponding element of textures.
- """
-
-def glPushAttrib(mask):
- """
- Push the server attribute stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushattrib.html}
-
- @type mask: Enumerated constant(s)
- @param mask: Specifies a mask that indicates which attributes to save.
- """
-
-def glPushClientAttrib(mask):
- """
- Push the client attribute stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushclientattrib.html}
-
- @type mask: Enumerated constant(s)
- @param mask: Specifies a mask that indicates which attributes to save.
- """
-
-def glPushMatrix():
- """
- Push the current matrix stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushmatrix.html}
- """
-
-def glPushName(name):
- """
- Push the name stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushname.html}
-
- @type name: unsigned int
- @param name: Specifies a name that will be pushed onto the name stack.
- """
-
-def glRasterPos (x,y,z,w):
- """
- B{glRasterPos2d, glRasterPos2f, glRasterPos2i, glRasterPos2s, glRasterPos3d,
- glRasterPos3f, glRasterPos3i, glRasterPos3s, glRasterPos4d, glRasterPos4f,
- glRasterPos4i, glRasterPos4s, glRasterPos2dv, glRasterPos2fv, glRasterPos2iv,
- glRasterPos2sv, glRasterPos3dv, glRasterPos3fv, glRasterPos3iv, glRasterPos3sv,
- glRasterPos4dv, glRasterPos4fv, glRasterPos4iv, glRasterPos4sv}
-
- Specify the raster position for pixel operations
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/rasterpos.html}
-
- @type x, y, z, w: Depends on function prototype. (z and w for '3' and '4' prototypes only)
- @param x, y, z, w: Specify the x,y,z, and w object coordinates (if present) for the
- raster position. If function prototype ends in 'v' specifies a pointer to an array of two,
- three, or four elements, specifying x, y, z, and w coordinates, respectively.
- @note:
- If you are drawing to the 3d view with a Scriptlink of a space handler
- the zoom level of the panels will scale the glRasterPos by the view matrix.
- so a X of 10 will not always offset 10 pixels as you would expect.
-
- To work around this get the scale value of the view matrix and use it to scale your pixel values.
-
- Workaround::
-
- import Blender
- from Blender.BGL import *
- xval, yval= 100, 40
- # Get the scale of the view matrix
- viewMatrix = Buffer(GL_FLOAT, 16)
- glGetFloatv(GL_MODELVIEW_MATRIX, viewMatrix)
- f = 1/viewMatrix[0]
- glRasterPos2f(xval*f, yval*f) # Instead of the usual glRasterPos2i(xval, yval)
- """
-
-def glReadBuffer(mode):
- """
- Select a color buffer source for pixels.
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/readbuffer.html}
-
- @type mode: Enumerated constant
- @param mode: Specifies a color buffer.
- """
-
-def glReadPixels(x, y, width, height, format, type, pixels):
- """
- Read a block of pixels from the frame buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/readpixels.html}
-
- @type x, y: int
- @param x, y:Specify the window coordinates of the first pixel that is read
- from the frame buffer. This location is the lower left corner of a rectangular
- block of pixels.
- @type width, height: int
- @param width, height: Specify the dimensions of the pixel rectangle. width and
- height of one correspond to a single pixel.
- @type format: Enumerated constant
- @param format: Specifies the format of the pixel data.
- @type type: Enumerated constant
- @param type: Specifies the data type of the pixel data.
- @type pixels: Buffer object
- @param pixels: Returns the pixel data.
- """
-
-def glRect (x1,y1,x2,y2,v1,v2):
- """
- B{glRectd, glRectf, glRecti, glRects, glRectdv, glRectfv, glRectiv, glRectsv}
-
- Draw a rectangle
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/rect.html}
-
- @type x1, y1: Depends on function prototype. (for non 'v' prototypes only)
- @param x1, y1: Specify one vertex of a rectangle
- @type x2, y2: Depends on function prototype. (for non 'v' prototypes only)
- @param x2, y2: Specify the opposite vertex of the rectangle
- @type v1, v2: Depends on function prototype. (for 'v' prototypes only)
- @param v1, v2: Specifies a pointer to one vertex of a rectangle and the pointer
- to the opposite vertex of the rectangle
- """
-
-def glRenderMode(mode):
- """
- Set rasterization mode
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/rendermode.html}
-
- @type mode: Enumerated constant
- @param mode: Specifies the rasterization mode.
- """
-
-def glRotate (angle, x, y, z):
- """
- B{glRotated, glRotatef}
-
- Multiply the current matrix by a rotation matrix
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/rotate.html}
-
- @type angle: Depends on function prototype.
- @param angle: Specifies the angle of rotation in degrees.
- @type x, y, z: Depends on function prototype.
- @param x, y, z: Specify the x, y, and z coordinates of a vector respectively.
- """
-
-def glScale (x,y,z):
- """
- B{glScaled, glScalef}
-
- Multiply the current matrix by a general scaling matrix
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/scale.html}
-
- @type x, y, z: Depends on function prototype.
- @param x, y, z: Specify scale factors along the x, y, and z axes, respectively.
- """
-
-def glScissor(x,y,width,height):
- """
- Define the scissor box
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/scissor.html}
-
- @type x, y: int
- @param x, y: Specify the lower left corner of the scissor box. Initially (0, 0).
- @type width, height: int
- @param width height: Specify the width and height of the scissor box. When a
- GL context is first attached to a window, width and height are set to the
- dimensions of that window.
- """
-
-def glSelectBuffer(size, buffer):
- """
- Establish a buffer for selection mode values
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/selectbuffer.html}
-
- @type size: int
- @param size: Specifies the size of buffer
- @type buffer: Buffer I{type GL_INT}
- @param buffer: Returns the selection data
- """
-
-def glShadeModel(mode):
- """
- Select flat or smooth shading
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/shademodel.html}
-
- @type mode: Enumerated constant
- @param mode: Specifies a symbolic value representing a shading technique.
- """
-
-def glStencilFuc(func, ref, mask):
- """
- Set function and reference value for stencil testing
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/stencilfunc.html}
-
- @type func: Enumerated constant
- @param func:Specifies the test function.
- @type ref: int
- @param ref:Specifies the reference value for the stencil test. ref is clamped to
- the range [0,2n-1], where n is the number of bitplanes in the stencil buffer.
- The initial value is 0.
- @type mask: unsigned int
- @param mask:Specifies a mask that is ANDed with both the reference value and
- the stored stencil value when the test is done. The initial value is all 1's.
- """
-
-def glStencilMask(mask):
- """
- Control the writing of individual bits in the stencil planes
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/stencilmask.html}
-
- @type mask: unsigned int
- @param mask: Specifies a bit mask to enable and disable writing of individual bits
- in the stencil planes. Initially, the mask is all 1's.
- """
-
-def glStencilOp(fail, zfail, zpass):
- """
- Set stencil test actions
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/stencilop.html}
-
- @type fail: Enumerated constant
- @param fail: Specifies the action to take when the stencil test fails.
- The initial value is GL_KEEP.
- @type zfail: Enumerated constant
- @param zfail: Specifies the stencil action when the stencil test passes, but the
- depth test fails. zfail accepts the same symbolic constants as fail.
- The initial value is GL_KEEP.
- @type zpass: Enumerated constant
- @param zpass: Specifies the stencil action when both the stencil test and the
- depth test pass, or when the stencil test passes and either there is no depth
- buffer or depth testing is not enabled. zpass accepts the same symbolic constants
- as fail. The initial value is GL_KEEP.
- """
-
-def glTexCoord (s,t,r,q,v):
- """
- B{glTexCoord1d, glTexCoord1f, glTexCoord1i, glTexCoord1s, glTexCoord2d, glTexCoord2f,
- glTexCoord2i, glTexCoord2s, glTexCoord3d, glTexCoord3f, glTexCoord3i, glTexCoord3s,
- glTexCoord4d, glTexCoord4f, glTexCoord4i, glTexCoord4s, glTexCoord1dv, glTexCoord1fv,
- glTexCoord1iv, glTexCoord1sv, glTexCoord2dv, glTexCoord2fv, glTexCoord2iv,
- glTexCoord2sv, glTexCoord3dv, glTexCoord3fv, glTexCoord3iv, glTexCoord3sv,
- glTexCoord4dv, glTexCoord4fv, glTexCoord4iv, glTexCoord4sv}
-
- Set the current texture coordinates
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/texcoord.html}
-
- @type s, t, r, q: Depends on function prototype. (r and q for '3' and '4' prototypes only)
- @param s, t, r, q: Specify s, t, r, and q texture coordinates. Not all parameters are
- present in all forms of the command.
- @type v: Buffer object. Depends on function prototype. (for 'v' prototypes only)
- @param v: Specifies a pointer to an array of one, two, three, or four elements,
- which in turn specify the s, t, r, and q texture coordinates.
- """
-
-def glTexEnv (target, pname, param):
- """
- B{glTextEnvf, glTextEnvi, glTextEnvfv, glTextEnviv}
-
- Set texture environment parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/texenv.html}
-
- @type target: Enumerated constant
- @param target: Specifies a texture environment. Must be GL_TEXTURE_ENV.
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name of a single-valued texture environment
- parameter. Must be GL_TEXTURE_ENV_MODE.
- @type param: Depends on function prototype.
- @param param: Specifies a single symbolic constant. If function prototype ends in 'v'
- specifies a pointer to a parameter array that contains either a single symbolic
- constant or an RGBA color
- """
-
-def glTexGen (coord, pname, param):
- """
- B{glTexGend, glTexGenf, glTexGeni, glTexGendv, glTexGenfv, glTexGeniv}
-
- Control the generation of texture coordinates
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/texgen.html}
-
- @type coord: Enumerated constant
- @param coord: Specifies a texture coordinate.
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name of the texture- coordinate generation function.
- @type param: Depends on function prototype.
- @param param: Specifies a single-valued texture generation parameter.
- If function prototype ends in 'v' specifies a pointer to an array of texture
- generation parameters. If pname is GL_TEXTURE_GEN_MODE, then the array must
- contain a single symbolic constant. Otherwise, params holds the coefficients
- for the texture-coordinate generation function specified by pname.
- """
-
-def glTexImage1D(target, level, internalformat, width, border, format, type, pixels):
- """
- Specify a one-dimensional texture image
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/teximage1d.html}
-
- @type target: Enumerated constant
- @param target: Specifies the target texture.
- @type level: int
- @param level: Specifies the level-of-detail number. Level 0 is the base image level.
- Level n is the nth mipmap reduction image.
- @type internalformat: int
- @param internalformat: Specifies the number of color components in the texture.
- @type width: int
- @param width: Specifies the width of the texture image. Must be 2n+2(border) for
- some integer n. All implementations support texture images that are at least 64
- texels wide. The height of the 1D texture image is 1.
- @type border: int
- @param border: Specifies the width of the border. Must be either 0 or 1.
- @type format: Enumerated constant
- @param format: Specifies the format of the pixel data.
- @type type: Enumerated constant
- @param type: Specifies the data type of the pixel data.
- @type pixels: Buffer object.
- @param pixels: Specifies a pointer to the image data in memory.
- """
-
-def glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels):
- """
- Specify a two-dimensional texture image
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/teximage2d.html}
-
- @type target: Enumerated constant
- @param target: Specifies the target texture.
- @type level: int
- @param level: Specifies the level-of-detail number. Level 0 is the base image level.
- Level n is the nth mipmap reduction image.
- @type internalformat: int
- @param internalformat: Specifies the number of color components in the texture.
- @type width: int
- @param width: Specifies the width of the texture image. Must be 2n+2(border) for
- some integer n. All implementations support texture images that are at least 64
- texels wide.
- @type height: int
- @param height: Specifies the height of the texture image. Must be 2m+2(border) for
- some integer m. All implementations support texture images that are at least 64
- texels high.
- @type border: int
- @param border: Specifies the width of the border. Must be either 0 or 1.
- @type format: Enumerated constant
- @param format: Specifies the format of the pixel data.
- @type type: Enumerated constant
- @param type: Specifies the data type of the pixel data.
- @type pixels: Buffer object.
- @param pixels: Specifies a pointer to the image data in memory.
- """
-
-def glTexParameter (target, pname, param):
- """
- B{glTexParameterf, glTexParameteri, glTexParameterfv, glTexParameteriv}
-
- Set texture parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/texparameter.html}
-
- @type target: Enumerated constant
- @param target: Specifies the target texture.
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name of a single-valued texture parameter.
- @type param: Depends on function prototype.
- @param param: Specifies the value of pname. If function prototype ends in 'v' specifies
- a pointer to an array where the value or values of pname are stored.
- """
-
-def glTranslate (x, y, z):
- """
- B{glTranslatef, glTranslated}
-
- Multiply the current matrix by a translation matrix
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/translate.html}
-
- @type x, y, z: Depends on function prototype.
- @param x, y, z: Specify the x, y, and z coordinates of a translation vector.
- """
-
-def glVertex (x,y,z,w,v):
- """
- B{glVertex2d, glVertex2f, glVertex2i, glVertex2s, glVertex3d, glVertex3f, glVertex3i,
- glVertex3s, glVertex4d, glVertex4f, glVertex4i, glVertex4s, glVertex2dv, glVertex2fv,
- glVertex2iv, glVertex2sv, glVertex3dv, glVertex3fv, glVertex3iv, glVertex3sv, glVertex4dv,
- glVertex4fv, glVertex4iv, glVertex4sv}
-
- Specify a vertex
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/vertex.html}
-
- @type x, y, z, w: Depends on function prototype (z and w for '3' and '4' prototypes only)
- @param x, y, z, w: Specify x, y, z, and w coordinates of a vertex. Not all parameters
- are present in all forms of the command.
- @type v: Buffer object. Depends of function prototype (for 'v' prototypes only)
- @param v: Specifies a pointer to an array of two, three, or four elements. The
- elements of a two-element array are x and y; of a three-element array, x, y, and z;
- and of a four-element array, x, y, z, and w.
- """
-
-def glViewport(x,y,width,height):
- """
- Set the viewport
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/viewport.html}
-
- @type x, y: int
- @param x, y: Specify the lower left corner of the viewport rectangle,
- in pixels. The initial value is (0,0).
- @type width, height: int
- @param width, height: Specify the width and height of the viewport. When a GL context
- is first attached to a window, width and height are set to the dimensions of that window.
- """
-
-def gluPerspective(fovY, aspect, zNear, zFar):
- """
- Set up a perspective projection matrix.
- @see: U{http://biology.ncsa.uiuc.edu/cgi-bin/infosrch.cgi?cmd=getdoc&coll=0650&db=bks&fname=/SGI_Developer/OpenGL_RM/ch06.html#id5577288}
-
- @type fovY: double
- @param fovY: Specifies the field of view angle, in degrees, in the y direction.
- @type aspect: double
- @param aspect: Specifies the aspect ratio that determines the field of view in the x direction.
- The aspect ratio is the ratio of x (width) to y (height).
- @type zNear: double
- @param zNear: Specifies the distance from the viewer to the near clipping plane (always positive).
- @type zFar: double
- @param zFar: Specifies the distance from the viewer to the far clipping plane (always positive).
- """
-
-def gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz):
- """
- Define a viewing transformation
- @see: U{http://biology.ncsa.uiuc.edu/cgi-bin/infosrch.cgi?cmd=getdoc&coll=0650&db=bks&fname=/SGI_Developer/OpenGL_RM/ch06.html#id5573042}
-
- @type eyex, eyey, eyez: double
- @param eyex, eyey, eyez: Specifies the position of the eye point.
- @type centerx, centery, centerz: double
- @param centerx, centery, centerz: Specifies the position of the reference point.
- @type upx, upy, upz: double
- @param upx, upy, upz: Specifies the direction of the up vector.
- """
-
-def gluOrtho2D(left, right, bottom, top):
- """
- Define a 2-D orthographic projection matrix
- @see: U{http://biology.ncsa.uiuc.edu/cgi-bin/infosrch.cgi?cmd=getdoc&coll=0650&db=bks&fname=/SGI_Developer/OpenGL_RM/ch06.html#id5578074}
-
- @type left, right: double
- @param left, right: Specify the coordinates for the left and right vertical clipping planes.
- @type bottom, top: double
- @param bottom, top: Specify the coordinates for the bottom and top horizontal clipping planes.
- """
-
-def gluPickMatrix(x, y, width, height, viewport):
- """
- Define a picking region
- @see: U{http://biology.ncsa.uiuc.edu/cgi-bin/infosrch.cgi?cmd=getdoc&coll=0650&db=bks&fname=/SGI_Developer/OpenGL_RM/ch06.html#id5578074}
-
- @type x, y: double
- @param x, y: Specify the center of a picking region in window coordinates.
- @type width, height: double
- @param width, height: Specify the width and height, respectively, of the picking region in window coordinates.
- @type viewport: Buffer object. [int]
- @param viewport: Specifies the current viewport.
- """
-
-def gluProject(objx, objy, objz, modelMatrix, projMatrix, viewport, winx, winy, winz):
- """
- Map object coordinates to window coordinates.
- @see: U{http://biology.ncsa.uiuc.edu/cgi-bin/infosrch.cgi?cmd=getdoc&coll=0650&db=bks&fname=/SGI_Developer/OpenGL_RM/ch06.html#id5578074}
-
- @type objx, objy, objz: double
- @param objx, objy, objz: Specify the object coordinates.
- @type modelMatrix: Buffer object. [double]
- @param modelMatrix: Specifies the current modelview matrix (as from a glGetDoublev call).
- @type projMatrix: Buffer object. [double]
- @param projMatrix: Specifies the current projection matrix (as from a glGetDoublev call).
- @type viewport: Buffer object. [int]
- @param viewport: Specifies the current viewport (as from a glGetIntegerv call).
- @type winx, winy, winz: Buffer object. [double]
- @param winx, winy, winz: Return the computed window coordinates.
- """
-
-def gluUnProject(winx, winy, winz, modelMatrix, projMatrix, viewport, objx, objy, objz):
- """
- Map object coordinates to window
- coordinates.
- @see: U{http://biology.ncsa.uiuc.edu/cgi-bin/infosrch.cgi?cmd=getdoc&coll=0650&db=bks&fname=/SGI_Developer/OpenGL_RM/ch06.html#id5582204}
-
- @type winx, winy, winz: double
- @param winx, winy, winz: Specify the window coordinates to be mapped.
- @type modelMatrix: Buffer object. [double]
- @param modelMatrix: Specifies the current modelview matrix (as from a glGetDoublev call).
- @type projMatrix: Buffer object. [double]
- @param projMatrix: Specifies the current projection matrix (as from a glGetDoublev call).
- @type viewport: Buffer object. [int]
- @param viewport: Specifies the current viewport (as from a glGetIntegerv call).
- @type objx, objy, objz: Buffer object. [double]
- @param objx, objy, objz: Return the computed object coordinates.
- """
-
-class Buffer:
- """
- The Buffer object is simply a block of memory that is delineated and initialized by the
- user. Many OpenGL functions return data to a C-style pointer, however, because this
- is not possible in python the Buffer object can be used to this end. Wherever pointer
- notation is used in the OpenGL functions the Buffer object can be used in it's BGL
- wrapper. In some instances the Buffer object will need to be initialized with the template
- parameter, while in other instances the user will want to create just a blank buffer
- which will be zeroed by default.
-
- Example with Buffer::
- import Blender
- from Blender import BGL
- myByteBuffer = BGL.Buffer(BGL.GL_BYTE, [32,32])
- BGL.glGetPolygonStipple(myByteBuffer)
- print myByteBuffer.dimensions
- print myByteBuffer.list
- sliceBuffer = myByteBuffer[0:16]
- print sliceBuffer
-
- @ivar list: The contents of the Buffer.
- @ivar dimensions: The size of the Buffer.
- """
-
- def __init__(type, dimensions, template = None):
- """
- This will create a new Buffer object for use with other BGL OpenGL commands.
- Only the type of argument to store in the buffer and the dimensions of the buffer
- are necessary. Buffers are zeroed by default unless a template is supplied, in
- which case the buffer is initialized to the template.
-
- @type type: int
- @param type: The format to store data in. The type should be one of
- GL_BYTE, GL_SHORT, GL_INT, or GL_FLOAT.
- @type dimensions: An int or sequence object specifying the dimensions of the buffer.
- @param dimensions: If the dimensions are specified as an int a linear array will
- be created for the buffer. If a sequence is passed for the dimensions, the buffer
- becomes n-Dimensional, where n is equal to the number of parameters passed in the
- sequence. Example: [256,2] is a two- dimensional buffer while [256,256,4] creates
- a three- dimensional buffer. You can think of each additional dimension as a sub-item
- of the dimension to the left. i.e. [10,2] is a 10 element array each with 2 sub-items.
- [(0,0), (0,1), (1,0), (1,1), (2,0), ...] etc.
- @type template: A python sequence object (optional)
- @param template: A sequence of matching dimensions which will be used to initialize
- the Buffer. If a template is not passed in all fields will be initialized to 0.
- @rtype: Buffer object
- @return: The newly created buffer as a PyObject.
- """
diff --git a/source/blender/python/doc/epy/Geometry.py b/source/blender/python/doc/epy/Geometry.py
deleted file mode 100644
index d0c4dfdfd8d..00000000000
--- a/source/blender/python/doc/epy/Geometry.py
+++ /dev/null
@@ -1,189 +0,0 @@
-# Blender.Geometry module and its subtypes
-
-"""
-The Blender.Geometry submodule.
-
-Geometry
-========
-(when accessing it from the Game Engine use Geometry instead of Blender.Geometry)
-
-This new module provides access to a geometry function.
-"""
-
-def Intersect(vec1, vec2, vec3, ray, orig, clip=1):
- """
- Return the intersection between a ray and a triangle, if possible, return None otherwise.
- @type vec1: Vector object.
- @param vec1: A 3d vector, one corner of the triangle.
- @type vec2: Vector object.
- @param vec2: A 3d vector, one corner of the triangle.
- @type vec3: Vector object.
- @param vec3: A 3d vector, one corner of the triangle.
- @type ray: Vector object.
- @param ray: A 3d vector, the orientation of the ray. the length of the ray is not used, only the direction.
- @type orig: Vector object.
- @param orig: A 3d vector, the origin of the ray.
- @type clip: integer
- @param clip: if 0, don't restrict the intersection to the area of the triangle, use the infinite plane defined by the triangle.
- @rtype: Vector object
- @return: The intersection between a ray and a triangle, if possible, None otherwise.
- """
-
-def TriangleArea(vec1, vec2, vec3):
- """
- Return the area size of the 2D or 3D triangle defined.
- @type vec1: Vector object.
- @param vec1: A 2d or 3d vector, one corner of the triangle.
- @type vec2: Vector object.
- @param vec2: A 2d or 3d vector, one corner of the triangle.
- @type vec3: Vector object.
- @param vec3: A 2d or 3d vector, one corner of the triangle.
- @rtype: float
- @return: The area size of the 2D or 3D triangle defined.
- """
-
-def TriangleNormal(vec1, vec2, vec3):
- """
- Return the normal of the 3D triangle defined.
- @type vec1: Vector object.
- @param vec1: A 3d vector, one corner of the triangle.
- @type vec2: Vector object.
- @param vec2: A 3d vector, one corner of the triangle.
- @type vec3: Vector object.
- @param vec3: A 3d vector, one corner of the triangle.
- @rtype: float
- @return: The normal of the 3D triangle defined.
- """
-
-def QuadNormal(vec1, vec2, vec3, vec4):
- """
- Return the normal of the 3D quad defined.
- @type vec1: Vector object.
- @param vec1: A 3d vector, the first vertex of the quad.
- @type vec2: Vector object.
- @param vec2: A 3d vector, the second vertex of the quad.
- @type vec3: Vector object.
- @param vec3: A 3d vector, the third vertex of the quad.
- @type vec4: Vector object.
- @param vec4: A 3d vector, the fourth vertex of the quad.
- @rtype: float
- @return: The normal of the 3D quad defined.
- """
-
-def LineIntersect(vec1, vec2, vec3, vec4):
- """
- Return a tuple with the points on each line respectively closest to the other
- (when both lines intersect, both vector hold the same value).
- The lines are evaluated as infinite lines in space, the values returned may not be between the 2 points given for each line.
- @type vec1: Vector object.
- @param vec1: A 3d vector, one point on the first line.
- @type vec2: Vector object.
- @param vec2: A 3d vector, another point on the first line.
- @type vec3: Vector object.
- @param vec3: A 3d vector, one point on the second line.
- @type vec4: Vector object.
- @param vec4: A 3d vector, another point on the second line.
- @rtype: (Vector object, Vector object)
- @return: A tuple with the points on each line respectively closest to the other.
- """
-
-def PolyFill(polylines):
- """
- Takes a list of polylines and calculates triangles that would fill in the polylines.
- Multiple lines can be used to make holes inside a polyline, or fill in 2 separate lines at once.
- @type polylines: List of lists containing vectors, each representing a closed polyline.
- @rtype: list
- @return: a list if tuples each a tuple of 3 ints representing a triangle indexing the points given.
- @note: 2D Vectors will have an assumed Z axis of zero, 4D Vectors W axis is ignored.
- @note: The order of points in a polyline effect the direction returned triangles face, reverse the order of a polyline to flip the normal of returned faces.
-
- I{B{Example:}}
-
- The example below creates 2 polylines and fills them in with faces, then makes a mesh in the current scene::
- import Blender
- Vector= Blender.mathutils.Vector
-
- # Outline of 5 points
- polyline1= [Vector(-2.0, 1.0, 1.0), Vector(-1.0, 2.0, 1.0), Vector(1.0, 2.0, 1.0), Vector(1.0, -1.0, 1.0), Vector(-1.0, -1.0, 1.0)]
- polyline2= [Vector(-1, 1, 1.0), Vector(0, 1, 1.0), Vector(0, 0, 1.0), Vector(-1.0, 0.0, 1.0)]
- fill= Blender.Geometry.PolyFill([polyline1, polyline2])
-
- # Make a new mesh and add the truangles into it
- me= Blender.Mesh.New()
- me.verts.extend(polyline1)
- me.verts.extend(polyline2)
- me.faces.extend(fill) # Add the faces, they reference the verts in polyline 1 and 2
-
- scn = Blender.Scene.GetCurrent()
- ob = scn.objects.new(me)
- Blender.Redraw()
- """
-
-def LineIntersect2D(vec1, vec2, vec3, vec4):
- """
- Takes 2 lines vec1, vec2 for the 2 points of the first line and vec2, vec3 for the 2 points of the second line.
- @rtype: Vector
- @return: a 2D Vector for the intersection or None where there is no intersection.
- """
-
-def ClosestPointOnLine(pt, vec1, vec2):
- """
- Takes 2 lines vec1, vec2 for the 2 points of the first line and vec2, vec3 for the 2 points of the second line.
- @rtype: tuple
- @return: a tuple containing a vector and a float, the vector is the closest point on the line, the float is the position on the line, between 0 and 1 the point is on the line.
- """
-
-def PointInTriangle2D(pt, tri_pt1, tri_pt2, tri_pt3):
- """
- Takes 4 vectors (one for the test point and 3 for the triangle)
- This is a 2d function so only X and Y are used, Z and W will be ignored.
- @rtype: int
- @return: 1 for a clockwise intersection, -1 for counter clockwise intersection, 0 when there is no intersection.
- """
-
-def PointInQuad2D(pt, quad_pt1, quad_pt2, quad_pt3):
- """
- Takes 5 vectors (one for the test point and 5 for the quad)
- This is a 2d function so only X and Y are used, Z and W will be ignored.
- @rtype: int
- @return: 1 for a clockwise intersection, -1 for counter clockwise intersection, 0 when there is no intersection.
- """
-
-def BoxPack2D(boxlist):
- """
- Takes a list of 2D boxes and packs them into a square.
- Each box in boxlist must be a list of at least 4 items - [x,y,w,h], after running this script,
- the X and Y values in each box will be moved to packed, non overlapping locations.
-
- Example::
-
- # Make 500 random boxes, pack them and make a mesh from it
- from Blender import Geometry, Scene, Mesh
- import random
- boxes = []
- for i in xrange(500):
- boxes.append( [0,0, random.random()+0.1, random.random()+0.1] )
- boxsize = Geometry.BoxPack2D(boxes)
- print 'BoxSize', boxsize
- me = Mesh.New()
- for x in boxes:
- me.verts.extend([(x[0],x[1], 0), (x[0],x[1]+x[3], 0), (x[0]+x[2],x[1]+x[3], 0), (x[0]+x[2],x[1], 0) ])
- v1= me.verts[-1]
- v2= me.verts[-2]
- v3= me.verts[-3]
- v4= me.verts[-4]
- me.faces.extend([(v1,v2,v3,v4)])
- scn = Scene.GetCurrent()
- scn.objects.new(me)
-
- @note: Each boxlist item can be longer then 4, the extra items are ignored and stay untouched.
- @rtype: tuple
- @return: a tuple pair - (width, height) of all the packed boxes.
- """
-def BezierInterp(vec_knot_1, vec_handle_1, vec_handle_2, vec_knot_2, resolution):
- """
- Takes 4 vectors representing a bezier curve and returns a list of vector points.
- @note: any vector size is supported, the largest dimension from the input will be used for all returned vectors/
- @rtype: list
- @return: a list of vectors the size of resolution including the start and end points (vec_knot_1 and vec_knot_2)
- """
diff --git a/source/blender/python/doc/epy/IDProp.py b/source/blender/python/doc/epy/IDProp.py
deleted file mode 100644
index 1fc26d7f65b..00000000000
--- a/source/blender/python/doc/epy/IDProp.py
+++ /dev/null
@@ -1,132 +0,0 @@
-class IDGroup:
- """
- The IDGroup Type
- ================
- This type supports both iteration and the []
- operator to get child ID properties.
-
- You can also add new properties using the [] operator.
- For example::
-
- group['a float!'] = 0.0
- group['an int!'] = 0
- group['a string!'] = "hi!"
- group['an array!'] = [0, 0, 1.0, 0]
-
- group['a subgroup!] = {"float": 0.0, "an int": 1.0, "an array": [1, 2],
- "another subgroup": {"a": 0.0, "str": "bleh"}}
-
- Note that for arrays, the array type defaults to int unless a float is found
- while scanning the template list; if any floats are found, then the whole
- array is float. Note that double-precision floating point numbers are used for
- python-created float ID properties and arrays (though the internal C api does
- support single-precision floats, and the python code will read them).
-
- You can also delete properties with the del operator. For example:
-
- del group['property']
-
- To get the type of a property, use the type() operator, for example::
-
- if type(group['bleh']) == str: pass
-
- To tell if the property is a group or array type, import the Blender.Types module and test
- against IDGroupType and IDArrayType, like so::
-
- from Blender.Types import IDGroupType, IDArrayType.
-
- if type(group['bleghr']) == IDGroupType:
- (do something)
-
- @ivar name: The name of the property
- @type name: string
- """
-
- def pop(item):
- """
- Pop an item from the group property.
- @type item: string
- @param item: The item name.
- @rtype: can be dict, list, int, float or string.
- @return: The removed property.
- """
-
- def update(updatedict):
- """
- Updates items in the dict, similar to normal python
- dictionary method .update().
- @type updatedict: dict
- @param updatedict: A dict of simple types to derive updated/new IDProperties from.
- @rtype: None
- @return: None
- """
-
- def keys():
- """
- Returns a list of the keys in this property group.
- @rtype: list of strings.
- @return: a list of the keys in this property group.
- """
-
- def values():
- """
- Returns a list of the values in this property group.
-
- Note that unless a value is itself a property group or an array, you
- cannot change it by changing the values in this list, you must change them
- in the parent property group.
-
- For example,
-
- group['some_property'] = new_value
-
- . . .is correct, while,
-
- values = group.values()
- values[0] = new_value
-
- . . .is wrong.
-
- @rtype: list of strings.
- @return: a list of the values in this property group.
- """
-
- def iteritems():
- """
- Implements the python dictionary iteritmes method.
-
- For example::
-
- for k, v in group.iteritems():
- print "Property name: " + k
- print "Property value: " + str(v)
-
- @rtype: an iterator that spits out items of the form [key, value]
- @return: an iterator.
- """
-
- def convert_to_pyobject():
- """
- Converts the entire property group to a purely python form.
-
- @rtype: dict
- @return: A python dictionary representing the property group
- """
-
-class IDArray:
- """
- The IDArray Type
- ================
-
- @ivar type: returns the type of the array, can be either IDP_Int or IDP_Float
- """
-
- def __getitem__(index):
- pass
-
- def __setitem__(index, value):
- pass
-
- def __len__():
- pass
-
diff --git a/source/blender/python/doc/epy/Mathutils.py b/source/blender/python/doc/epy/Mathutils.py
deleted file mode 100644
index 17a227f729a..00000000000
--- a/source/blender/python/doc/epy/Mathutils.py
+++ /dev/null
@@ -1,156 +0,0 @@
-# Blender.mathutils module and its subtypes
-
-
-
-class Vector:
- """
-
- @attention: Vector data can be wrapped or non-wrapped. When a object is wrapped it
- means that the object will give you direct access to the data inside of blender. Modification
- of this object will directly change the data inside of blender. To copy a wrapped object
- you need to use the object's constructor. If you copy and object by assignment you will not get
- a second copy but a second reference to the same data. Only certain functions will return
- wrapped data. This will be indicated in the method description.
- """
-
- def __init__(list = None):
- """
- Create a new 2d, 3d, or 4d Vector object from a list of floating point numbers.
- @note: that python uses higher precission floating point numbers, so values assigned to a vector may have some rounding error.
-
-
- Example::
- v = Vector(1,0,0)
- v = Vector(myVec)
- v = Vector(list)
- @type list: PyList of float or int
- @param list: The list of values for the Vector object. Can be a sequence or raw numbers.
- Must be 2, 3, or 4 values. The list is mapped to the parameters as [x,y,z,w].
- @rtype: Vector object.
- @return: It depends wheter a parameter was passed:
- - (list): Vector object initialized with the given values;
- - (): An empty 3 dimensional vector.
- """
-
-class Euler:
- """
- The Euler object
- ================
- This object gives access to Eulers in Blender.
- @note: You can access a euler object like a sequence
- - x = euler[0]
- @note: Comparison operators can be done:
- - ==, != test numeric values within epsilon
- @attention: Euler data can be wrapped or non-wrapped. When a object is wrapped it
- means that the object will give you direct access to the data inside of blender. Modification
- of this object will directly change the data inside of blender. To copy a wrapped object
- you need to use the object's constructor. If you copy and object by assignment you will not get
- a second copy but a second reference to the same data. Only certain functions will return
- wrapped data. This will be indicated in the method description.
- """
-
- def __init__(list = None):
- """
- Create a new euler object.
-
- Example::
- euler = Euler(45,0,0)
- euler = Euler(myEuler)
- euler = Euler(sequence)
- @type list: PyList of float/int
- @param list: 3d list to initialize euler
- @rtype: Euler object
- @return: Euler representing heading, pitch, bank.
- @note: Values are in degrees.
- """
-
-class Quaternion:
- """
- The Quaternion object
- =====================
- This object gives access to Quaternions in Blender.
- @note: Comparison operators can be done:
- - ==, != test numeric values within epsilon
- @note: Math can be performed on Quaternion classes
- - quat + quat
- - quat - quat
- - quat * float/int
- - quat * vec
- - quat * quat
- @note: You can access a quaternion object like a sequence
- - x = quat[0]
- @attention: Quaternion data can be wrapped or non-wrapped. When a object is wrapped it
- means that the object will give you direct access to the data inside of blender. Modification
- of this object will directly change the data inside of blender. To copy a wrapped object
- you need to use the object's constructor. If you copy and object by assignment you will not get
- a second copy but a second reference to the same data. Only certain functions will return
- wrapped data. This will be indicated in the method description.
- """
-
- def __init__(list, angle = None):
- """
- Create a new quaternion object from initialized values.
-
- Example::
- quat = Quaternion(1,2,3,4)
- quat = Quaternion(axis, angle)
- quat = Quaternion()
- quat = Quaternion(180, list)
-
- @type list: PyList of int/float
- @param list: A 3d or 4d list to initialize quaternion.
- 4d if intializing [w,x,y,z], 3d if used as an axis of rotation.
- @type angle: float (optional)
- @param angle: An arbitrary rotation amount around 'list'.
- List is used as an axis of rotation in this case.
- @rtype: New quaternion object.
- @return: It depends wheter a parameter was passed:
- - (list/angle): Quaternion object initialized with the given values;
- - (): An identity 4 dimensional quaternion.
- """
-
-class Matrix:
- """
- The Matrix Object
- =================
- @note: Math can be performed on Matrix classes
- - mat + mat
- - mat - mat
- - mat * float/int
- - mat * vec
- - mat * mat
- @note: Comparison operators can be done:
- - ==, != test numeric values within epsilon
- @note: You can access a quaternion object like a 2d sequence
- - x = matrix[0][1]
- - vector = matrix[2]
- @attention: Quaternion data can be wrapped or non-wrapped. When a object is wrapped it
- means that the object will give you direct access to the data inside of blender. Modification
- of this object will directly change the data inside of blender. To copy a wrapped object
- you need to use the object's constructor. If you copy and object by assignment you will not get
- a second copy but a second reference to the same data. Only certain functions will return
- wrapped data. This will be indicated in the method description.
- """
-
- def __init__(list1 = None, list2 = None, list3 = None, list4 = None):
- """
- Create a new matrix object from initialized values.
-
- Example::
- matrix = Matrix([1,1,1],[0,1,0],[1,0,0])
- matrix = Matrix(mat)
- matrix = Matrix(seq1, seq2, vector)
-
- @type list1: PyList of int/float
- @param list1: A 2d,3d or 4d list.
- @type list2: PyList of int/float
- @param list2: A 2d,3d or 4d list.
- @type list3: PyList of int/float
- @param list3: A 2d,3d or 4d list.
- @type list4: PyList of int/float
- @param list4: A 2d,3d or 4d list.
- @rtype: New matrix object.
- @return: It depends wheter a parameter was passed:
- - (list1, etc.): Matrix object initialized with the given values;
- - (): An empty 3 dimensional matrix.
- """
diff --git a/source/blender/python/doc/epy/testbgl.py b/source/blender/python/doc/epy/testbgl.py
deleted file mode 100644
index e895d01df69..00000000000
--- a/source/blender/python/doc/epy/testbgl.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# Testing the BGL module
-
-import Blender
-from Blender.BGL import *
-from Blender import Draw
-
-R = G = B = 0
-A = 1
-
-instructions = "Hold mouse buttons to change the background color."
-quitting = " Press ESC or q to quit."
-
-def show_win():
- glClearColor(R,G,B,A) # define color used to clear buffers
- glClear(GL_COLOR_BUFFER_BIT) # use it to clear the color buffer
- glColor3f(1,1,1) # change default color
- glRasterPos2i(50,100) # move cursor to x = 50, y = 100
- Draw.Text("Testing BGL + Draw") # draw this text there
- glRasterPos2i(350,20) # move cursor again
- Draw.Text(instructions + quitting) # draw another msg
- glBegin(GL_LINE_LOOP) # begin a vertex-data list
- glVertex2i(46,92)
- glVertex2i(120,92)
- glVertex2i(120,115)
- glVertex2i(46,115)
- glEnd() # close this list
- glColor3f(0.35,0.18,0.92) # change default color again
- glBegin(GL_POLYGON) # another list, for a polygon
- glVertex2i(315, 292)
- glVertex2i(412, 200)
- glVertex2i(264, 256)
- glEnd()
- Draw.Redraw(1) # make changes visible.
-
-def ev(evt, val): # this is a callback for Draw.Register()
- global R,G,B,A # it handles input events
- if evt == Draw.ESCKEY or evt == Draw.QKEY:
- Draw.Exit() # this quits the script
- elif evt == Draw.LEFTMOUSE: R = 1 - R
- elif evt == Draw.MIDDLEMOUSE: G = 1 - G
- elif evt == Draw.RIGHTMOUSE: B = 1 - B
- else:
- Draw.Register(show_win, ev, None)
-
-Draw.Register(show_win, ev, None) # start the main loop
diff --git a/source/blender/python/doc/examples/bpy.data.py b/source/blender/python/doc/examples/bpy.data.py
deleted file mode 100644
index fc1145a523f..00000000000
--- a/source/blender/python/doc/examples/bpy.data.py
+++ /dev/null
@@ -1,29 +0,0 @@
-import bpy
-
-
-# print all objects
-for obj in bpy.data.objects:
- print(obj.name)
-
-
-# print all scene names in a list
-print(bpy.data.scenes.keys())
-
-
-# remove mesh Cube
-if "Cube" in bpy.data.meshes:
- mesh = bpy.data.meshes["Cube"]
- print("removing mesh", mesh)
- bpy.data.meshes.unlink(mesh)
-
-
-# write images into a file next to the blend
-import os
-file = open(os.path.splitext(bpy.data.filepath)[0] + ".txt", 'w')
-
-for image in bpy.data.images:
- file.write("%s %dx%d\n" % (image.filepath, image.size[0], image.size[1]))
-
-file.close()
-
-
diff --git a/source/blender/python/doc/examples/mathutils.Euler.py b/source/blender/python/doc/examples/mathutils.Euler.py
deleted file mode 100644
index bc7702c1d53..00000000000
--- a/source/blender/python/doc/examples/mathutils.Euler.py
+++ /dev/null
@@ -1,3 +0,0 @@
-import mathutils
-
-# todo
diff --git a/source/blender/python/doc/examples/mathutils.Matrix.py b/source/blender/python/doc/examples/mathutils.Matrix.py
deleted file mode 100644
index bc7702c1d53..00000000000
--- a/source/blender/python/doc/examples/mathutils.Matrix.py
+++ /dev/null
@@ -1,3 +0,0 @@
-import mathutils
-
-# todo
diff --git a/source/blender/python/doc/examples/mathutils.Quaternion.py b/source/blender/python/doc/examples/mathutils.Quaternion.py
deleted file mode 100644
index bc7702c1d53..00000000000
--- a/source/blender/python/doc/examples/mathutils.Quaternion.py
+++ /dev/null
@@ -1,3 +0,0 @@
-import mathutils
-
-# todo
diff --git a/source/blender/python/doc/examples/mathutils.Vector.py b/source/blender/python/doc/examples/mathutils.Vector.py
deleted file mode 100644
index fb00e8aead6..00000000000
--- a/source/blender/python/doc/examples/mathutils.Vector.py
+++ /dev/null
@@ -1,55 +0,0 @@
-import mathutils
-
-# zero length vector
-vec = mathutils.Vector((0, 0, 1))
-
-# unit length vector
-vec_a = vec.copy().normalize()
-
-vec_b = mathutils.Vector((0, 1, 2))
-
-vec2d = mathutils.Vector((1, 2))
-vec3d = mathutils.Vector((1, 0, 0))
-vec4d = vec_a.copy().resize4D()
-
-# other mathutuls types
-quat = mathutils.Quaternion()
-matrix = mathutils.Matrix()
-
-# Comparison operators can be done on Vector classes:
-
-# greater and less then test vector length.
-vec_a > vec_b
-vec_a >= vec_b
-vec_a < vec_b
-vec_a <= vec_b
-
-# ==, != test vector values e.g. 1,2,3 != 3,2,1 even if they are the same length
-vec_a == vec_b
-vec_a != vec_b
-
-
-# Math can be performed on Vector classes
-vec_a + vec_b
-vec_a - vec_b
-vec_a * vec_b
-vec_a * 10.0
-vec_a * matrix
-vec_a * vec_b
-vec_a * quat
--vec_a
-
-
-# You can access a vector object like a sequence
-x = vec_a[0]
-len(vec)
-vec_a[:] = vec_b
-vec2d[:] = vec3d[:2]
-
-
-# Vectors support 'swizzle' operations
-# See http://en.wikipedia.org/wiki/Swizzling_(computer_graphics)
-vec.xyz = vec.zyx
-vec.xy = vec4d.zw
-vec.xyz = vec4d.wzz
-vec4d.wxyz = vec.yxyx
diff --git a/source/blender/python/doc/examples/mathutils.py b/source/blender/python/doc/examples/mathutils.py
deleted file mode 100644
index 02f69515f21..00000000000
--- a/source/blender/python/doc/examples/mathutils.py
+++ /dev/null
@@ -1,18 +0,0 @@
-import mathutils
-from math import radians
-
-vec = mathutils.Vector((1.0, 2.0, 3.0))
-
-mat_rot = mathutils.Matrix.Rotation(radians(90), 4, 'X')
-mat_trans = mathutils.Matrix.Translation(vec)
-
-mat = mat_trans * mat_rot
-mat.invert()
-
-mat3 = mat.rotation_part()
-quat1 = mat.to_quat()
-quat2 = mat3.to_quat()
-
-angle = quat1.difference(quat2)
-
-print(angle)
diff --git a/source/blender/python/doc/sphinx_doc_gen.py b/source/blender/python/doc/sphinx_doc_gen.py
deleted file mode 100644
index b20cd74f82a..00000000000
--- a/source/blender/python/doc/sphinx_doc_gen.py
+++ /dev/null
@@ -1,862 +0,0 @@
- # ***** BEGIN GPL LICENSE BLOCK *****
- #
- # 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- #
- # Contributor(s): Campbell Barton
- #
- # #**** END GPL LICENSE BLOCK #****
-
-script_help_msg = '''
-Usage,
-run this script from blenders root path once you have compiled blender
- ./blender.bin -b -P /b/source/blender/python/doc/sphinx_doc_gen.py
-
-This will generate python files in "./source/blender/python/doc/sphinx-in"
-Generate html docs by running...
-
- sphinx-build source/blender/python/doc/sphinx-in source/blender/python/doc/sphinx-out
-
-
-For PDF generation
-
- sphinx-build -b latex source/blender/python/doc/sphinx-in source/blender/python/doc/sphinx-out
- cd source/blender/python/doc/sphinx-out
- make
-'''
-
-# import rpdb2; rpdb2.start_embedded_debugger('test')
-
-import os
-import inspect
-import bpy
-import rna_info
-reload(rna_info)
-
-# lame, python wont give some access
-ClassMethodDescriptorType = type(dict.__dict__['fromkeys'])
-MethodDescriptorType = type(dict.get)
-GetSetDescriptorType = type(int.real)
-
-EXAMPLE_SET = set()
-EXAMPLE_SET_USED = set()
-
-_BPY_STRUCT_FAKE = "bpy_struct"
-_BPY_FULL_REBUILD = False
-
-def undocumented_message(module_name, type_name, identifier):
- message = "Undocumented (`contribute " \
- "<http://wiki.blender.org/index.php/Dev:2.5/Py/API/Documentation/Contribute" \
- "?action=edit&section=new&preload=Dev:2.5/Py/API/Documentation/Contribute/Howto-message" \
- "&preloadtitle=%s.%s.%s>`_)\n\n" % (module_name, type_name, identifier)
- return message
-
-
-def range_str(val):
- '''
- Converts values to strings for the range directive.
- (unused function it seems)
- '''
- if val < -10000000: return '-inf'
- if val > 10000000: return 'inf'
- if type(val)==float:
- return '%g' % val
- else:
- return str(val)
-
-
-def write_example_ref(ident, fw, example_id, ext="py"):
- if example_id in EXAMPLE_SET:
- fw("%s.. literalinclude:: ../examples/%s.%s\n\n" % (ident, example_id, ext))
- EXAMPLE_SET_USED.add(example_id)
- else:
- if bpy.app.debug:
- print("\tskipping example:", example_id)
-
-
-def write_indented_lines(ident, fn, text, strip=True):
- '''
- Apply same indentation to all lines in a multilines text.
- '''
- if text is None:
- return
- for l in text.split("\n"):
- if strip:
- fn(ident + l.strip() + "\n")
- else:
- fn(ident + l + "\n")
-
-
-def pymethod2sphinx(ident, fw, identifier, py_func):
- '''
- class method to sphinx
- '''
- arg_str = inspect.formatargspec(*inspect.getargspec(py_func))
- if arg_str.startswith("(self, "):
- arg_str = "(" + arg_str[7:]
- func_type = "method"
- elif arg_str.startswith("(cls, "):
- arg_str = "(" + arg_str[6:]
- func_type = "classmethod"
- else:
- func_type = "staticmethod"
-
- fw(ident + ".. %s:: %s%s\n\n" % (func_type, identifier, arg_str))
- if py_func.__doc__:
- write_indented_lines(ident + " ", fw, py_func.__doc__)
- fw("\n")
-
-
-def pyfunc2sphinx(ident, fw, identifier, py_func, is_class=True):
- '''
- function or class method to sphinx
- '''
- arg_str = inspect.formatargspec(*inspect.getargspec(py_func))
-
- if not is_class:
- func_type = "function"
-
- # ther rest are class methods
- elif arg_str.startswith("(self, "):
- arg_str = "(" + arg_str[7:]
- func_type = "method"
- elif arg_str.startswith("(cls, "):
- arg_str = "(" + arg_str[6:]
- func_type = "classmethod"
- else:
- func_type = "staticmethod"
-
- fw(ident + ".. %s:: %s%s\n\n" % (func_type, identifier, arg_str))
- if py_func.__doc__:
- write_indented_lines(ident + " ", fw, py_func.__doc__.strip())
- fw("\n")
-
-
-def py_descr2sphinx(ident, fw, descr, module_name, type_name, identifier):
- if identifier.startswith("_"):
- return
-
- doc = descr.__doc__
- if not doc:
- doc = undocumented_message(module_name, type_name, identifier)
-
- if type(descr) == GetSetDescriptorType:
- fw(ident + ".. attribute:: %s\n\n" % identifier)
- write_indented_lines(ident + " ", fw, doc, False)
- elif type(descr) in (MethodDescriptorType, ClassMethodDescriptorType):
- write_indented_lines(ident, fw, doc, False)
- else:
- raise TypeError("type was not GetSetDescriptorType, MethodDescriptorType or ClassMethodDescriptorType")
-
- write_example_ref(ident, fw, module_name + "." + type_name + "." + identifier)
- fw("\n")
-
-
-def py_c_func2sphinx(ident, fw, module_name, type_name, identifier, py_func, is_class=True):
- '''
- c defined function to sphinx.
- '''
-
- # dump the docstring, assume its formatted correctly
- if py_func.__doc__:
- write_indented_lines(ident, fw, py_func.__doc__, False)
- fw("\n")
- else:
- fw(ident + ".. function:: %s()\n\n" % identifier)
- fw(ident + " " + undocumented_message(module_name, type_name, identifier))
-
-
-def pyprop2sphinx(ident, fw, identifier, py_prop):
- '''
- python property to sphinx
- '''
- # readonly properties use "data" directive, variables use "attribute" directive
- if py_prop.fset is None:
- fw(ident + ".. data:: %s\n\n" % identifier)
- else:
- fw(ident + ".. attribute:: %s\n\n" % identifier)
- write_indented_lines(ident + " ", fw, py_prop.__doc__)
- if py_prop.fset is None:
- fw(ident + " (readonly)\n\n")
-
-
-def pymodule2sphinx(BASEPATH, module_name, module, title):
- import types
- attribute_set = set()
- filepath = os.path.join(BASEPATH, module_name + ".rst")
-
- file = open(filepath, "w")
-
- fw = file.write
-
- fw(title + "\n")
- fw(("=" * len(title)) + "\n\n")
-
- fw(".. module:: %s\n\n" % module_name)
-
- if module.__doc__:
- # Note, may contain sphinx syntax, dont mangle!
- fw(module.__doc__.strip())
- fw("\n\n")
-
- write_example_ref("", fw, module_name)
-
- # write members of the module
- # only tested with PyStructs which are not exactly modules
- for key, descr in sorted(type(module).__dict__.items()):
- if type(descr) == types.MemberDescriptorType:
- if descr.__doc__:
- fw(".. data:: %s\n\n" % key)
- write_indented_lines(" ", fw, descr.__doc__, False)
- attribute_set.add(key)
- fw("\n")
- del key, descr
-
- classes = []
-
- for attribute in sorted(dir(module)):
- if not attribute.startswith("_"):
-
- if attribute in attribute_set:
- continue
-
- if attribute.startswith("n_"): # annoying exception, needed for bpy.app
- continue
-
- value = getattr(module, attribute)
-
- value_type = type(value)
-
- if value_type == types.FunctionType:
- pyfunc2sphinx("", fw, attribute, value, is_class=False)
- elif value_type in (types.BuiltinMethodType, types.BuiltinFunctionType): # both the same at the moment but to be future proof
- # note: can't get args from these, so dump the string as is
- # this means any module used like this must have fully formatted docstrings.
- py_c_func2sphinx("", fw, module_name, module, attribute, value, is_class=False)
- elif value_type == type:
- classes.append((attribute, value))
- elif value_type in (bool, int, float, str, tuple):
- # constant, not much fun we can do here except to list it.
- # TODO, figure out some way to document these!
- fw(".. data:: %s\n\n" % attribute)
- write_indented_lines(" ", fw, "constant value %s" % repr(value), False)
- fw("\n")
- else:
- print("\tnot documenting %s.%s" % (module_name, attribute))
- continue
-
- attribute_set.add(attribute)
- # TODO, more types...
-
- # write collected classes now
- for (type_name, value) in classes:
- # May need to be its own function
- fw(".. class:: %s\n\n" % type_name)
- if value.__doc__:
- write_indented_lines(" ", fw, value.__doc__, False)
- fw("\n")
- write_example_ref(" ", fw, module_name + "." + type_name)
-
- descr_items = [(key, descr) for key, descr in sorted(value.__dict__.items()) if not key.startswith("__")]
-
- for key, descr in descr_items:
- if type(descr) == ClassMethodDescriptorType:
- py_descr2sphinx(" ", fw, descr, module_name, type_name, key)
-
- for key, descr in descr_items:
- if type(descr) == MethodDescriptorType:
- py_descr2sphinx(" ", fw, descr, module_name, type_name, key)
-
- for key, descr in descr_items:
- if type(descr) == GetSetDescriptorType:
- py_descr2sphinx(" ", fw, descr, module_name, type_name, key)
-
- fw("\n\n")
-
- file.close()
-
-
-
-def rna2sphinx(BASEPATH):
-
- structs, funcs, ops, props = rna_info.BuildRNAInfo()
-
- try:
- os.mkdir(BASEPATH)
- except:
- pass
-
- # conf.py - empty for now
- filepath = os.path.join(BASEPATH, "conf.py")
- file = open(filepath, "w")
- fw = file.write
-
-
- version_string = bpy.app.version_string.split("(")[0]
- if bpy.app.build_revision != "Unknown":
- version_string = version_string + " r" + bpy.app.build_revision
-
- # for use with files
- version_string_fp = "_".join(str(v) for v in bpy.app.version)
-
- fw("project = 'Blender'\n")
- # fw("master_doc = 'index'\n")
- fw("copyright = u'Blender Foundation'\n")
- fw("version = '%s - UNSTABLE API'\n" % version_string)
- fw("release = '%s - UNSTABLE API'\n" % version_string)
- fw("html_theme = 'blender-org'\n")
- fw("html_theme_path = ['../']\n")
- fw("html_favicon = 'favicon.ico'\n")
- # not helpful since the source us generated, adds to upload size.
- fw("html_copy_source = False\n")
- fw("\n")
- # needed for latex, pdf gen
- fw("latex_documents = [ ('contents', 'contents.tex', 'Blender Index', 'Blender Foundation', 'manual'), ]\n")
- fw("latex_paper_size = 'a4paper'\n")
- file.close()
-
-
- filepath = os.path.join(BASEPATH, "contents.rst")
- file = open(filepath, "w")
- fw = file.write
-
- fw("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n")
- fw(" Blender Documentation contents\n")
- fw("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n")
- fw("\n")
- fw("This document is an API reference for Blender %s. built %s.\n" % (version_string, bpy.app.build_date))
- fw("\n")
- fw("An introduction to Blender and Python can be found at <http://wiki.blender.org/index.php/Dev:2.5/Py/API/Intro>\n")
- fw("\n")
- fw("`A PDF version of this document is also available <blender_python_reference_%s.pdf>`__\n" % version_string_fp)
- fw("\n")
- fw(".. warning:: The Python API in Blender is **UNSTABLE**, It should only be used for testing, any script written now may break in future releases.\n")
- fw(" \n")
- fw(" The following areas are subject to change.\n")
- fw(" * operator names and arguments\n")
- fw(" * render api\n")
- fw(" * function calls with the data api (any function calls with values accessed from bpy.data), including functions for importing and exporting meshes\n")
- fw(" * class registration (Operator, Panels, Menus, Headers)\n")
- fw(" * modules: bpy.props, blf)\n")
- fw(" * members in the bpy.context have to be reviewed\n")
- fw(" * python defined modal operators, especially drawing callbacks are highly experemental\n")
- fw(" \n")
- fw(" These parts of the API are relatively stable and are unlikely to change significantly\n")
- fw(" * data API, access to attributes of blender data such as mesh verts, material color, timeline frames and scene objects\n")
- fw(" * user interface functions for defining buttons, creation of menus, headers, panels\n")
- fw(" * modules: bgl, mathutils and geometry\n")
- fw(" * game engine modules\n")
- fw("\n")
-
- fw("===================\n")
- fw("Application Modules\n")
- fw("===================\n")
- fw("\n")
- fw(".. toctree::\n")
- fw(" :maxdepth: 1\n\n")
- fw(" bpy.data.rst\n\n") # note: not actually a module
- fw(" bpy.ops.rst\n\n")
- fw(" bpy.types.rst\n\n")
-
- # py modules
- fw(" bpy.utils.rst\n\n")
- fw(" bpy.path.rst\n\n")
- fw(" bpy.app.rst\n\n")
-
- # C modules
- fw(" bpy.props.rst\n\n")
-
- fw("==================\n")
- fw("Standalone Modules\n")
- fw("==================\n")
- fw("\n")
- fw(".. toctree::\n")
- fw(" :maxdepth: 1\n\n")
-
-
- fw(" mathutils.rst\n\n")
- fw(" blf.rst\n\n")
- fw(" aud.rst\n\n")
-
- # game engine
- fw("===================\n")
- fw("Game Engine Modules\n")
- fw("===================\n")
- fw("\n")
- fw(".. toctree::\n")
- fw(" :maxdepth: 1\n\n")
- fw(" bge.types.rst\n\n")
- fw(" bge.logic.rst\n\n")
- fw(" bge.render.rst\n\n")
- fw(" bge.events.rst\n\n")
-
- file.close()
-
-
- # internal modules
- filepath = os.path.join(BASEPATH, "bpy.ops.rst")
- file = open(filepath, "w")
- fw = file.write
- fw("Operators (bpy.ops)\n")
- fw("===================\n\n")
- fw(".. toctree::\n")
- fw(" :glob:\n\n")
- fw(" bpy.ops.*\n\n")
- file.close()
-
- filepath = os.path.join(BASEPATH, "bpy.types.rst")
- file = open(filepath, "w")
- fw = file.write
- fw("Types (bpy.types)\n")
- fw("=================\n\n")
- fw(".. toctree::\n")
- fw(" :glob:\n\n")
- fw(" bpy.types.*\n\n")
- file.close()
-
-
- # not actually a module, only write this file so we
- # can reference in the TOC
- filepath = os.path.join(BASEPATH, "bpy.data.rst")
- file = open(filepath, "w")
- fw = file.write
- fw("Data Access (bpy.data)\n")
- fw("======================\n\n")
- fw(".. module:: bpy\n")
- fw("\n")
- fw("This module is used for all blender/python access.\n")
- fw("\n")
- fw(".. literalinclude:: ../examples/bpy.data.py\n")
- fw("\n")
- fw(".. data:: data\n")
- fw("\n")
- fw(" Access to blenders internal data\n")
- fw("\n")
- fw(" :type: :class:`bpy.types.BlendData`\n")
- file.close()
-
- EXAMPLE_SET_USED.add("bpy.data")
-
-
- # python modules
- from bpy import utils as module
- pymodule2sphinx(BASEPATH, "bpy.utils", module, "Utilities (bpy.utils)")
-
- from bpy import path as module
- pymodule2sphinx(BASEPATH, "bpy.path", module, "Path Utilities (bpy.path)")
-
- # C modules
- from bpy import app as module
- pymodule2sphinx(BASEPATH, "bpy.app", module, "Application Data (bpy.app)")
-
- from bpy import props as module
- pymodule2sphinx(BASEPATH, "bpy.props", module, "Property Definitions (bpy.props)")
-
- import mathutils as module
- pymodule2sphinx(BASEPATH, "mathutils", module, "Math Types & Utilities (mathutils)")
- del module
-
- import blf as module
- pymodule2sphinx(BASEPATH, "blf", module, "Font Drawing (blf)")
- del module
-
- import aud as module
- pymodule2sphinx(BASEPATH, "aud", module, "Audio System (aud)")
- del module
-
- # game engine
- import shutil
- # copy2 keeps time/date stamps
- shutil.copy2(os.path.join(BASEPATH, "../../../../gameengine/PyDoc/bge.types.rst"), BASEPATH)
- shutil.copy2(os.path.join(BASEPATH, "../../../../gameengine/PyDoc/bge.logic.rst"), BASEPATH)
- shutil.copy2(os.path.join(BASEPATH, "../../../../gameengine/PyDoc/bge.render.rst"), BASEPATH)
- shutil.copy2(os.path.join(BASEPATH, "../../../../gameengine/PyDoc/bge.events.rst"), BASEPATH)
-
-
- if 0:
- filepath = os.path.join(BASEPATH, "bpy.rst")
- file = open(filepath, "w")
- fw = file.write
-
- fw("\n")
-
- title = ":mod:`bpy` --- Blender Python Module"
- fw("%s\n%s\n\n" % (title, "=" * len(title)))
- fw(".. module:: bpy.types\n\n")
- file.close()
-
- def write_param(ident, fw, prop, is_return=False):
- if is_return:
- id_name = "return"
- id_type = "rtype"
- kwargs = {"as_ret": True, "class_fmt": ":class:`%s`"}
- identifier = ""
- else:
- id_name = "arg"
- id_type = "type"
- kwargs = {"as_arg": True, "class_fmt": ":class:`%s`"}
- identifier = " %s" % prop.identifier
-
- type_descr = prop.get_type_description(**kwargs)
- if prop.name or prop.description:
- fw(ident + ":%s%s: %s\n" % (id_name, identifier, ", ".join(val for val in (prop.name, prop.description) if val)))
- fw(ident + ":%s%s: %s\n" % (id_type, identifier, type_descr))
-
- def write_struct(struct):
- #if not struct.identifier.startswith("Sc") and not struct.identifier.startswith("I"):
- # return
-
- #if not struct.identifier == "Object":
- # return
-
- filepath = os.path.join(BASEPATH, "bpy.types.%s.rst" % struct.identifier)
- file = open(filepath, "w")
- fw = file.write
-
- base_id = getattr(struct.base, "identifier", "")
-
- if _BPY_STRUCT_FAKE:
- if not base_id:
- base_id = _BPY_STRUCT_FAKE
-
- if base_id:
- title = "%s(%s)" % (struct.identifier, base_id)
- else:
- title = struct.identifier
-
- fw("%s\n%s\n\n" % (title, "=" * len(title)))
-
- fw(".. module:: bpy.types\n\n")
-
- base_ids = [base.identifier for base in struct.get_bases()]
-
- if _BPY_STRUCT_FAKE:
- base_ids.append(_BPY_STRUCT_FAKE)
-
- base_ids.reverse()
-
- if base_ids:
- if len(base_ids) > 1:
- fw("base classes --- ")
- else:
- fw("base class --- ")
-
- fw(", ".join((":class:`%s`" % base_id) for base_id in base_ids))
- fw("\n\n")
-
- subclass_ids = [s.identifier for s in structs.values() if s.base is struct if not rna_info.rna_id_ignore(s.identifier)]
- if subclass_ids:
- fw("subclasses --- \n" + ", ".join((":class:`%s`" % s) for s in subclass_ids) + "\n\n")
-
- base_id = getattr(struct.base, "identifier", "")
-
- if _BPY_STRUCT_FAKE:
- if not base_id:
- base_id = _BPY_STRUCT_FAKE
-
- if base_id:
- fw(".. class:: %s(%s)\n\n" % (struct.identifier, base_id))
- else:
- fw(".. class:: %s\n\n" % struct.identifier)
-
- fw(" %s\n\n" % struct.description)
-
- # properties sorted in alphabetical order
- sorted_struct_properties = struct.properties[:]
- sorted_struct_properties.sort(key=lambda prop: prop.identifier)
-
- for prop in sorted_struct_properties:
- type_descr = prop.get_type_description(class_fmt=":class:`%s`")
- # readonly properties use "data" directive, variables properties use "attribute" directive
- if 'readonly' in type_descr:
- fw(" .. data:: %s\n\n" % prop.identifier)
- else:
- fw(" .. attribute:: %s\n\n" % prop.identifier)
- if prop.description:
- fw(" %s\n\n" % prop.description)
- fw(" :type: %s\n\n" % type_descr)
-
- # python attributes
- py_properties = struct.get_py_properties()
- py_prop = None
- for identifier, py_prop in py_properties:
- pyprop2sphinx(" ", fw, identifier, py_prop)
- del py_properties, py_prop
-
- for func in struct.functions:
- args_str = ", ".join(prop.get_arg_default(force=False) for prop in func.args)
-
- fw(" .. %s:: %s(%s)\n\n" % ("classmethod" if func.is_classmethod else "method", func.identifier, args_str))
- fw(" %s\n\n" % func.description)
-
- for prop in func.args:
- write_param(" ", fw, prop)
-
- if len(func.return_values) == 1:
- write_param(" ", fw, func.return_values[0], is_return=True)
- elif func.return_values: # multiple return values
- fw(" :return (%s):\n" % ", ".join(prop.identifier for prop in func.return_values))
- for prop in func.return_values:
- type_descr = prop.get_type_description(as_ret=True, class_fmt=":class:`%s`")
- descr = prop.description
- if not descr:
- descr = prop.name
- fw(" `%s`, %s, %s\n\n" % (prop.identifier, descr, type_descr))
-
- fw("\n")
-
-
- # python methods
- py_funcs = struct.get_py_functions()
- py_func = None
-
- for identifier, py_func in py_funcs:
- pyfunc2sphinx(" ", fw, identifier, py_func, is_class=True)
- del py_funcs, py_func
-
- lines = []
-
- if struct.base or _BPY_STRUCT_FAKE:
- bases = list(reversed(struct.get_bases()))
-
- # props
- lines[:] = []
-
- if _BPY_STRUCT_FAKE:
- descr_items = [(key, descr) for key, descr in sorted(bpy.types.Struct.__bases__[0].__dict__.items()) if not key.startswith("__")]
-
- if _BPY_STRUCT_FAKE:
- for key, descr in descr_items:
- if type(descr) == GetSetDescriptorType:
- lines.append(" * :class:`%s.%s`\n" % (_BPY_STRUCT_FAKE, key))
-
- for base in bases:
- for prop in base.properties:
- lines.append(" * :class:`%s.%s`\n" % (base.identifier, prop.identifier))
-
- for identifier, py_prop in base.get_py_properties():
- lines.append(" * :class:`%s.%s`\n" % (base.identifier, identifier))
-
- for identifier, py_prop in base.get_py_properties():
- lines.append(" * :class:`%s.%s`\n" % (base.identifier, identifier))
-
- if lines:
- fw(".. rubric:: Inherited Properties\n\n")
-
- fw(".. hlist::\n")
- fw(" :columns: 2\n\n")
-
- for line in lines:
- fw(line)
- fw("\n")
-
-
- # funcs
- lines[:] = []
-
- if _BPY_STRUCT_FAKE:
- for key, descr in descr_items:
- if type(descr) == MethodDescriptorType:
- lines.append(" * :class:`%s.%s`\n" % (_BPY_STRUCT_FAKE, key))
-
- for base in bases:
- for func in base.functions:
- lines.append(" * :class:`%s.%s`\n" % (base.identifier, func.identifier))
- for identifier, py_func in base.get_py_functions():
- lines.append(" * :class:`%s.%s`\n" % (base.identifier, identifier))
-
- if lines:
- fw(".. rubric:: Inherited Functions\n\n")
-
- fw(".. hlist::\n")
- fw(" :columns: 2\n\n")
-
- for line in lines:
- fw(line)
- fw("\n")
-
- lines[:] = []
-
-
- if struct.references:
- # use this otherwise it gets in the index for a normal heading.
- fw(".. rubric:: References\n\n")
-
- fw(".. hlist::\n")
- fw(" :columns: 2\n\n")
-
- for ref in struct.references:
- ref_split = ref.split(".")
- if len(ref_split) > 2:
- ref = ref_split[-2] + "." + ref_split[-1]
- fw(" * :class:`%s`\n" % ref)
- fw("\n")
-
-
- for struct in structs.values():
- # TODO, rna_info should filter these out!
- if "_OT_" in struct.identifier:
- continue
- write_struct(struct)
-
- # special case, bpy_struct
- if _BPY_STRUCT_FAKE:
- filepath = os.path.join(BASEPATH, "bpy.types.%s.rst" % _BPY_STRUCT_FAKE)
- file = open(filepath, "w")
- fw = file.write
-
- fw("%s\n" % _BPY_STRUCT_FAKE)
- fw("=" * len(_BPY_STRUCT_FAKE) + "\n")
- fw("\n")
- fw(".. module:: bpy.types\n")
- fw("\n")
-
- subclass_ids = [s.identifier for s in structs.values() if s.base is None if not rna_info.rna_id_ignore(s.identifier)]
- if subclass_ids:
- fw("subclasses --- \n" + ", ".join((":class:`%s`" % s) for s in sorted(subclass_ids)) + "\n\n")
-
- fw(".. class:: %s\n\n" % _BPY_STRUCT_FAKE)
- fw(" built-in base class for all classes in bpy.types.\n\n")
- fw(" .. note::\n\n")
- fw(" Note that bpy.types.%s is not actually available from within blender, it only exists for the purpose of documentation.\n\n" % _BPY_STRUCT_FAKE)
-
- descr_items = [(key, descr) for key, descr in sorted(bpy.types.Struct.__bases__[0].__dict__.items()) if not key.startswith("__")]
-
- for key, descr in descr_items:
- if type(descr) == MethodDescriptorType: # GetSetDescriptorType, GetSetDescriptorType's are not documented yet
- py_descr2sphinx(" ", fw, descr, "bpy.types", _BPY_STRUCT_FAKE, key)
-
- for key, descr in descr_items:
- if type(descr) == GetSetDescriptorType:
- py_descr2sphinx(" ", fw, descr, "bpy.types", _BPY_STRUCT_FAKE, key)
-
-
- # operators
- def write_ops():
- API_BASEURL='https://svn.blender.org/svnroot/bf-blender/trunk/blender/release/scripts'
- fw = None
- last_mod = ''
-
- for op_key in sorted(ops.keys()):
- op = ops[op_key]
-
- if last_mod != op.module_name:
- filepath = os.path.join(BASEPATH, "bpy.ops.%s.rst" % op.module_name)
- file = open(filepath, "w")
- fw = file.write
-
- title = "%s Operators" % (op.module_name[0].upper() + op.module_name[1:])
- fw("%s\n%s\n\n" % (title, "=" * len(title)))
-
- fw(".. module:: bpy.ops.%s\n\n" % op.module_name)
- last_mod = op.module_name
-
- args_str = ", ".join(prop.get_arg_default(force=True) for prop in op.args)
- fw(".. function:: %s(%s)\n\n" % (op.func_name, args_str))
-
- # if the description isn't valid, we output the standard warning
- # with a link to the wiki so that people can help
- if not op.description or op.description == "(undocumented operator)":
- operator_description = undocumented_message('bpy.ops',op.module_name,op.func_name)
- else:
- operator_description = op.description
-
- fw(" %s\n\n" % operator_description)
- for prop in op.args:
- write_param(" ", fw, prop)
- if op.args:
- fw("\n")
-
- location = op.get_location()
- if location != (None, None):
- fw(" :file: `%s <%s/%s>`_:%d\n\n" % (location[0],API_BASEURL,location[0],location[1]))
-
- write_ops()
-
- file.close()
-
-def main():
- import bpy
- if 'bpy' not in dir():
- print("\nError, this script must run from inside blender2.5")
- print(script_help_msg)
- else:
- import shutil
-
- path_in = 'source/blender/python/doc/sphinx-in'
- path_out = 'source/blender/python/doc/sphinx-out'
- path_examples = 'source/blender/python/doc/examples'
- # only for partial updates
- path_in_tmp = path_in + "-tmp"
-
- if not os.path.exists(path_in):
- os.mkdir(path_in)
-
- for f in os.listdir(path_examples):
- if f.endswith(".py"):
- EXAMPLE_SET.add(os.path.splitext(f)[0])
-
-
- # only for full updates
- if _BPY_FULL_REBUILD:
- shutil.rmtree(path_in, True)
- shutil.rmtree(path_out, True)
- else:
- # write here, then move
- shutil.rmtree(path_in_tmp, True)
-
- rna2sphinx(path_in_tmp)
-
- if not _BPY_FULL_REBUILD:
- import filecmp
-
- # now move changed files from 'path_in_tmp' --> 'path_in'
- file_list_path_in = set(os.listdir(path_in))
- file_list_path_in_tmp = set(os.listdir(path_in_tmp))
-
- # remove deprecated files that have been removed.
- for f in sorted(file_list_path_in):
- if f not in file_list_path_in_tmp:
- print("\tdeprecated: %s" % f)
- os.remove(os.path.join(path_in, f))
-
- # freshen with new files.
- for f in sorted(file_list_path_in_tmp):
- f_from = os.path.join(path_in_tmp, f)
- f_to = os.path.join(path_in, f)
-
- do_copy = True
- if f in file_list_path_in:
- if filecmp.cmp(f_from, f_to):
- do_copy = False
-
- if do_copy:
- print("\tupdating: %s" % f)
- shutil.copy(f_from, f_to)
- '''else:
- print("\tkeeping: %s" % f) # eh, not that useful'''
-
-
- EXAMPLE_SET_UNUSED = EXAMPLE_SET - EXAMPLE_SET_USED
- if EXAMPLE_SET_UNUSED:
- print("\nUnused examples found in '%s'..." % path_examples)
- for f in EXAMPLE_SET_UNUSED:
- print(" %s.py" % f)
- print(" %d total\n" % len(EXAMPLE_SET_UNUSED))
-
- import sys
- sys.exit()
-
-if __name__ == '__main__':
- main()
diff --git a/source/blender/python/doc/sphinx_doc_gen.sh b/source/blender/python/doc/sphinx_doc_gen.sh
deleted file mode 100755
index 989424ba7eb..00000000000
--- a/source/blender/python/doc/sphinx_doc_gen.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/sh
-# run from the blender source dir
-# bash source/blender/python/doc/sphinx_doc_gen.sh
-# ssh upload means you need an account on the server
-
-BLENDER="./blender.bin"
-SSH_HOST="ideasman42@emo.blender.org"
-SSH_UPLOAD="/data/www/vhosts/www.blender.org/documentation" # blender_python_api_VERSION, added after
-
-# sed string from hell, 'Blender 2.53 (sub 1) Build' --> '2_53_1'
-# "_".join(str(v) for v in bpy.app.version)
-BLENDER_VERSION=`$BLENDER --version | cut -f2-4 -d" " | sed 's/(//g' | sed 's/)//g' | sed 's/ sub /./g' | sed 's/\./_/g'`
-SSH_UPLOAD_FULL=$SSH_UPLOAD/"blender_python_api_"$BLENDER_VERSION
-
-# dont delete existing docs, now partial updates are used for quick builds.
-$BLENDER --background --python ./source/blender/python/doc/sphinx_doc_gen.py
-
-# html
-sphinx-build source/blender/python/doc/sphinx-in source/blender/python/doc/sphinx-out
-cp source/blender/python/doc/sphinx-out/contents.html source/blender/python/doc/sphinx-out/index.html
-ssh ideasman42@emo.blender.org 'rm -rf '$SSH_UPLOAD_FULL'/*'
-rsync --progress -avze "ssh -p 22" /b/source/blender/python/doc/sphinx-out/* $SSH_HOST:$SSH_UPLOAD_FULL/
-
-# pdf
-sphinx-build -b latex source/blender/python/doc/sphinx-in source/blender/python/doc/sphinx-out
-cd source/blender/python/doc/sphinx-out
-make
-cd ../../../../../
-rsync --progress -avze "ssh -p 22" source/blender/python/doc/sphinx-out/contents.pdf $SSH_HOST:$SSH_UPLOAD_FULL/blender_python_reference_$BLENDER_VERSION.pdf
diff --git a/source/blender/python/generic/CMakeLists.txt b/source/blender/python/generic/CMakeLists.txt
index 1a91abfbec8..58d69db4a0e 100644
--- a/source/blender/python/generic/CMakeLists.txt
+++ b/source/blender/python/generic/CMakeLists.txt
@@ -18,17 +18,43 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
.
../../blenlib
../../makesdna
../../blenkernel
- ../../editors/include
../../../../intern/guardedalloc
../../../../extern/glew/include
- ${PYTHON_INC}
+ ${PYTHON_INCLUDE_DIRS}
+)
+
+set(SRC
+ IDProp.c
+ bgl.c
+ blf_py_api.c
+ bpy_internal_import.c
+ mathutils.c
+ mathutils_color.c
+ mathutils_euler.c
+ mathutils_geometry.c
+ mathutils_matrix.c
+ mathutils_quat.c
+ mathutils_vector.c
+ noise.c
+ py_capi_utils.c
+
+ IDProp.h
+ bgl.h
+ blf_py_api.h
+ bpy_internal_import.h
+ mathutils.h
+ mathutils_color.h
+ mathutils_euler.h
+ mathutils_geometry.h
+ mathutils_matrix.h
+ mathutils_quat.h
+ mathutils_vector.h
+ py_capi_utils.h
)
-BLENDERLIB(bf_python_ext "${SRC}" "${INC}")
+blender_add_lib(bf_python_ext "${SRC}" "${INC}")
diff --git a/source/blender/python/generic/IDProp.c b/source/blender/python/generic/IDProp.c
index 2a07ab3bc90..9e4aa88354d 100644
--- a/source/blender/python/generic/IDProp.c
+++ b/source/blender/python/generic/IDProp.c
@@ -23,10 +23,15 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "BKE_idprop.h"
#include "IDProp.h"
#include "MEM_guardedalloc.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_idprop.h"
+
+
#define USE_STRING_COERCE
#ifdef USE_STRING_COERCE
@@ -34,7 +39,7 @@
#endif
PyObject * PyC_UnicodeFromByte(const char *str);
-const char * PuC_UnicodeAsByte(PyObject *py_str, PyObject **coerce); /* coerce must be NULL */
+const char * PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce); /* coerce must be NULL */
/*** Function to wrap ID properties ***/
PyObject *BPy_Wrap_IDProperty(ID *id, IDProperty *prop, IDProperty *parent);
@@ -88,7 +93,7 @@ PyObject *BPy_IDGroup_WrapData( ID *id, IDProperty *prop )
int i;
if (!seq) {
- PyErr_Format( PyExc_RuntimeError, "BPy_IDGroup_MapDataToPy, IDP_IDPARRAY: PyList_New(%d) failed", prop->len);
+ PyErr_Format(PyExc_RuntimeError, "BPy_IDGroup_MapDataToPy, IDP_IDPARRAY: PyList_New(%d) failed", prop->len);
return NULL;
}
@@ -123,7 +128,7 @@ int BPy_IDGroup_SetData(BPy_IDProperty *self, IDProperty *prop, PyObject *value)
int alloc_len;
PyObject *value_coerce= NULL;
- st= (char *)PuC_UnicodeAsByte(value, &value_coerce);
+ st= (char *)PyC_UnicodeAsByte(value, &value_coerce);
alloc_len= strlen(st) + 1;
st = _PyUnicode_AsString(value);
@@ -177,12 +182,12 @@ int BPy_IDGroup_SetData(BPy_IDProperty *self, IDProperty *prop, PyObject *value)
return 0;
}
-PyObject *BPy_IDGroup_GetName(BPy_IDProperty *self, void *bleh)
+PyObject *BPy_IDGroup_GetName(BPy_IDProperty *self, void *UNUSED(closure))
{
return PyUnicode_FromString(self->prop->name);
}
-static int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *bleh)
+static int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *UNUSED(closure))
{
char *st;
if (!PyUnicode_Check(value)) {
@@ -191,7 +196,7 @@ static int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *bleh
}
st = _PyUnicode_AsString(value);
- if (strlen(st) >= MAX_IDPROP_NAME) {
+ if (BLI_strnlen(st, MAX_IDPROP_NAME) == MAX_IDPROP_NAME) {
PyErr_SetString(PyExc_TypeError, "string length cannot exceed 31 characters!");
return -1;
}
@@ -208,17 +213,14 @@ static PyObject *BPy_IDGroup_GetType(BPy_IDProperty *self)
#endif
static PyGetSetDef BPy_IDGroup_getseters[] = {
- {"name",
- (getter)BPy_IDGroup_GetName, (setter)BPy_IDGroup_SetName,
- "The name of this Group.",
- NULL},
+ {(char *)"name", (getter)BPy_IDGroup_GetName, (setter)BPy_IDGroup_SetName, (char *)"The name of this Group.", NULL},
{NULL, NULL, NULL, NULL, NULL}
};
static Py_ssize_t BPy_IDGroup_Map_Len(BPy_IDProperty *self)
{
if (self->prop->type != IDP_GROUP) {
- PyErr_SetString( PyExc_TypeError, "len() of unsized object");
+ PyErr_SetString(PyExc_TypeError, "len() of unsized object");
return -1;
}
@@ -231,21 +233,21 @@ static PyObject *BPy_IDGroup_Map_GetItem(BPy_IDProperty *self, PyObject *item)
char *name;
if (self->prop->type != IDP_GROUP) {
- PyErr_SetString( PyExc_TypeError, "unsubscriptable object");
+ PyErr_SetString(PyExc_TypeError, "unsubscriptable object");
return NULL;
}
name= _PyUnicode_AsString(item);
if (name == NULL) {
- PyErr_SetString( PyExc_TypeError, "only strings are allowed as keys of ID properties");
+ PyErr_SetString(PyExc_TypeError, "only strings are allowed as keys of ID properties");
return NULL;
}
idprop= IDP_GetPropertyFromGroup(self->prop, name);
if(idprop==NULL) {
- PyErr_SetString( PyExc_KeyError, "key not in subgroup dict");
+ PyErr_SetString(PyExc_KeyError, "key not in subgroup dict");
return NULL;
}
@@ -259,7 +261,7 @@ static int idp_sequence_type(PyObject *seq)
PyObject *item;
int type= IDP_INT;
- int i, len = PySequence_Length(seq);
+ int i, len = PySequence_Size(seq);
for (i=0; i < len; i++) {
item = PySequence_GetItem(seq, i);
if (PyFloat_Check(item)) {
@@ -294,7 +296,7 @@ static int idp_sequence_type(PyObject *seq)
}
/* note: group can be a pointer array or a group */
-char *BPy_IDProperty_Map_ValidateAndCreate(char *name, IDProperty *group, PyObject *ob)
+const char *BPy_IDProperty_Map_ValidateAndCreate(const char *name, IDProperty *group, PyObject *ob)
{
IDProperty *prop = NULL;
IDPropertyTemplate val = {0};
@@ -311,7 +313,7 @@ char *BPy_IDProperty_Map_ValidateAndCreate(char *name, IDProperty *group, PyObje
} else if (PyUnicode_Check(ob)) {
#ifdef USE_STRING_COERCE
PyObject *value_coerce= NULL;
- val.str = (char *)PuC_UnicodeAsByte(ob, &value_coerce);
+ val.str = (char *)PyC_UnicodeAsByte(ob, &value_coerce);
prop = IDP_New(IDP_STRING, val, name);
Py_XDECREF(value_coerce);
#else
@@ -329,7 +331,7 @@ char *BPy_IDProperty_Map_ValidateAndCreate(char *name, IDProperty *group, PyObje
we assume IDP_INT unless we hit a float
number; then we assume it's */
- val.array.len = PySequence_Length(ob);
+ val.array.len = PySequence_Size(ob);
switch(val.array.type) {
case IDP_DOUBLE:
@@ -351,7 +353,7 @@ char *BPy_IDProperty_Map_ValidateAndCreate(char *name, IDProperty *group, PyObje
case IDP_IDPARRAY:
prop= IDP_NewIDPArray(name);
for (i=0; i<val.array.len; i++) {
- char *error;
+ const char *error;
item = PySequence_GetItem(ob, i);
error= BPy_IDProperty_Map_ValidateAndCreate("", prop, item);
Py_DECREF(item);
@@ -414,7 +416,7 @@ char *BPy_IDProperty_Map_ValidateAndCreate(char *name, IDProperty *group, PyObje
int BPy_Wrap_SetMapItem(IDProperty *prop, PyObject *key, PyObject *val)
{
if (prop->type != IDP_GROUP) {
- PyErr_SetString( PyExc_TypeError, "unsubscriptable object");
+ PyErr_SetString(PyExc_TypeError, "unsubscriptable object");
return -1;
}
@@ -426,21 +428,21 @@ int BPy_Wrap_SetMapItem(IDProperty *prop, PyObject *key, PyObject *val)
MEM_freeN(pkey);
return 0;
} else {
- PyErr_SetString( PyExc_KeyError, "property not found in group" );
+ PyErr_SetString(PyExc_KeyError, "property not found in group");
return -1;
}
}
else {
- char *err;
+ const char *err;
if (!PyUnicode_Check(key)) {
- PyErr_SetString( PyExc_TypeError, "only strings are allowed as subgroup keys" );
+ PyErr_SetString(PyExc_TypeError, "only strings are allowed as subgroup keys");
return -1;
}
err = BPy_IDProperty_Map_ValidateAndCreate(_PyUnicode_AsString(key), prop, val);
if (err) {
- PyErr_SetString( PyExc_KeyError, err );
+ PyErr_SetString(PyExc_KeyError, err );
return -1;
}
@@ -488,7 +490,7 @@ static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
int i;
if (!seq) {
- PyErr_Format( PyExc_RuntimeError, "BPy_IDGroup_MapDataToPy, IDP_ARRAY: PyList_New(%d) failed", prop->len);
+ PyErr_Format(PyExc_RuntimeError, "BPy_IDGroup_MapDataToPy, IDP_ARRAY: PyList_New(%d) failed", prop->len);
return NULL;
}
@@ -513,7 +515,7 @@ static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
int i;
if (!seq) {
- PyErr_Format( PyExc_RuntimeError, "BPy_IDGroup_MapDataToPy, IDP_IDPARRAY: PyList_New(%d) failed", prop->len);
+ PyErr_Format(PyExc_RuntimeError, "BPy_IDGroup_MapDataToPy, IDP_IDPARRAY: PyList_New(%d) failed", prop->len);
return NULL;
}
@@ -555,7 +557,7 @@ static PyObject *BPy_IDGroup_Pop(BPy_IDProperty *self, PyObject *value)
char *name = _PyUnicode_AsString(value);
if (!name) {
- PyErr_SetString( PyExc_TypeError, "pop expected at least 1 argument, got 0" );
+ PyErr_SetString(PyExc_TypeError, "pop expected at least 1 argument, got 0");
return NULL;
}
@@ -575,7 +577,7 @@ static PyObject *BPy_IDGroup_Pop(BPy_IDProperty *self, PyObject *value)
return pyform;
}
- PyErr_SetString( PyExc_KeyError, "item not in group" );
+ PyErr_SetString(PyExc_KeyError, "item not in group");
return NULL;
}
@@ -692,7 +694,7 @@ static int BPy_IDGroup_Contains(BPy_IDProperty *self, PyObject *value)
char *name = _PyUnicode_AsString(value);
if (!name) {
- PyErr_SetString( PyExc_TypeError, "expected a string");
+ PyErr_SetString(PyExc_TypeError, "expected a string");
return -1;
}
@@ -705,7 +707,7 @@ static PyObject *BPy_IDGroup_Update(BPy_IDProperty *self, PyObject *value)
Py_ssize_t i=0;
if (!PyDict_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "expected an object derived from dict.");
+ PyErr_SetString(PyExc_TypeError, "expected an object derived from dict");
return NULL;
}
@@ -860,7 +862,7 @@ PyObject *BPy_Wrap_IDProperty(ID *id, IDProperty *prop, IDProperty *parent)
static PyObject *IDArray_repr(BPy_IDArray *self)
{
- return PyUnicode_FromString("(ID Array)");
+ return PyUnicode_FromFormat("(ID Array [%d])", self->prop->len);
}
@@ -875,14 +877,8 @@ static PyObject *BPy_IDArray_GetLen(BPy_IDArray *self)
}
static PyGetSetDef BPy_IDArray_getseters[] = {
- {"len",
- (getter)BPy_IDArray_GetLen, (setter)NULL,
- "The length of the array, can also be gotten with len(array).",
- NULL},
- {"type",
- (getter)BPy_IDArray_GetType, (setter)NULL,
- "The type of the data in the array, is an ant.",
- NULL},
+ {(char *)"len", (getter)BPy_IDArray_GetLen, (setter)NULL, (char *)"The length of the array, can also be gotten with len(array).", NULL},
+ {(char *)"type", (getter)BPy_IDArray_GetType, (setter)NULL, (char *)"The type of the data in the array, is an ant.", NULL},
{NULL, NULL, NULL, NULL, NULL},
};
@@ -905,7 +901,7 @@ static int BPy_IDArray_Len(BPy_IDArray *self)
static PyObject *BPy_IDArray_GetItem(BPy_IDArray *self, int index)
{
if (index < 0 || index >= self->prop->len) {
- PyErr_SetString( PyExc_IndexError, "index out of range!");
+ PyErr_SetString(PyExc_IndexError, "index out of range!");
return NULL;
}
@@ -921,7 +917,7 @@ static PyObject *BPy_IDArray_GetItem(BPy_IDArray *self, int index)
break;
}
- PyErr_SetString( PyExc_RuntimeError, "invalid/corrupt array type!");
+ PyErr_SetString(PyExc_RuntimeError, "invalid/corrupt array type!");
return NULL;
}
@@ -932,7 +928,7 @@ static int BPy_IDArray_SetItem(BPy_IDArray *self, int index, PyObject *value)
double d;
if (index < 0 || index >= self->prop->len) {
- PyErr_SetString( PyExc_RuntimeError, "index out of range!");
+ PyErr_SetString(PyExc_RuntimeError, "index out of range!");
return -1;
}
@@ -1071,7 +1067,7 @@ static PyObject *IDGroup_Iter_iterself(PyObject *self)
static PyObject *IDGroup_Iter_repr(BPy_IDGroup_Iter *self)
{
- return PyUnicode_FromString("(ID Property Group)");
+ return PyUnicode_FromFormat("(ID Property Group Iter \"%s\")", self->group->prop->name);
}
static PyObject *BPy_Group_Iter_Next(BPy_IDGroup_Iter *self)
@@ -1091,7 +1087,7 @@ static PyObject *BPy_Group_Iter_Next(BPy_IDGroup_Iter *self)
return PyUnicode_FromString(cur->name);
}
} else {
- PyErr_SetString( PyExc_StopIteration, "iterator at end" );
+ PyErr_SetString(PyExc_StopIteration, "iterator at end");
return NULL;
}
}
diff --git a/source/blender/python/generic/IDProp.h b/source/blender/python/generic/IDProp.h
index c0a07879c1d..cd5bff4788e 100644
--- a/source/blender/python/generic/IDProp.h
+++ b/source/blender/python/generic/IDProp.h
@@ -56,7 +56,7 @@ int BPy_Wrap_SetMapItem(struct IDProperty *prop, PyObject *key, PyObject *val);
PyObject *BPy_IDGroup_WrapData(struct ID *id, struct IDProperty *prop );
-char *BPy_IDProperty_Map_ValidateAndCreate(char *name, struct IDProperty *group, PyObject *ob);
+const char *BPy_IDProperty_Map_ValidateAndCreate(const char *name, struct IDProperty *group, PyObject *ob);
void IDProp_Init_Types(void);
diff --git a/source/blender/python/generic/Makefile b/source/blender/python/generic/Makefile
deleted file mode 100644
index 0df98046f63..00000000000
--- a/source/blender/python/generic/Makefile
+++ /dev/null
@@ -1,66 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = gen_python
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# OpenGL and Python
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += $(OGL_CPPFLAGS)
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-# PreProcessor stuff
-
-CPPFLAGS += -I$(NAN_GHOST)/include
-CPPFLAGS += $(NAN_SDLCFLAGS)
-
-# modules
-CPPFLAGS += -I../../editors/include
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../nodes
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../render/extern/include
-
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_MEMUTIL)/include
-
-# path to our own headerfiles
-CPPFLAGS += -I..
diff --git a/source/blender/python/generic/bgl.c b/source/blender/python/generic/bgl.c
index 8ac2107f8d2..474259fe0e3 100644
--- a/source/blender/python/generic/bgl.c
+++ b/source/blender/python/generic/bgl.c
@@ -35,6 +35,10 @@
#include <GL/glew.h>
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
+
+
+
static char Method_Buffer_doc[] =
"(type, dimensions, [template]) - Create a new Buffer object\n\n\
(type) - The format to store data in\n\
@@ -51,7 +55,7 @@ For example, passing [100, 100] will create a 2 dimensional\n\
square buffer. Passing [16, 16, 32] will create a 3 dimensional\n\
buffer which is twice as deep as it is wide or high.";
-static PyObject *Method_Buffer( PyObject * self, PyObject * args );
+static PyObject *Method_Buffer( PyObject * self, PyObject *args );
/* Buffer sequence methods */
@@ -99,7 +103,7 @@ PyTypeObject BGL_bufferType = {
/* #ifndef __APPLE__ */
#define BGL_Wrap(nargs, funcname, ret, arg_list) \
-static PyObject *Method_##funcname (PyObject *self, PyObject *args) {\
+static PyObject *Method_##funcname (PyObject *UNUSED(self), PyObject *args) {\
arg_def##nargs arg_list; \
ret_def_##ret; \
if(!PyArg_ParseTuple(args, arg_str##nargs arg_list, arg_ref##nargs arg_list)) return NULL;\
@@ -108,7 +112,7 @@ static PyObject *Method_##funcname (PyObject *self, PyObject *args) {\
}
#define BGLU_Wrap(nargs, funcname, ret, arg_list) \
-static PyObject *Method_##funcname (PyObject *self, PyObject *args) {\
+static PyObject *Method_##funcname (PyObject *UNUSED(self), PyObject *args) {\
arg_def##nargs arg_list; \
ret_def_##ret; \
if(!PyArg_ParseTuple(args, arg_str##nargs arg_list, arg_ref##nargs arg_list)) return NULL;\
@@ -181,45 +185,62 @@ Buffer *BGL_MakeBuffer(int type, int ndimensions, int *dimensions, void *initbuf
}
#define MAX_DIMENSIONS 256
-static PyObject *Method_Buffer (PyObject *self, PyObject *args)
+static PyObject *Method_Buffer (PyObject *UNUSED(self), PyObject *args)
{
- PyObject *length_ob= NULL, *template= NULL;
+ PyObject *length_ob= NULL, *init= NULL;
Buffer *buffer;
int dimensions[MAX_DIMENSIONS];
int i, type;
int ndimensions = 0;
- if (!PyArg_ParseTuple(args, "iO|O", &type, &length_ob, &template)) {
+ if (!PyArg_ParseTuple(args, "iO|O", &type, &length_ob, &init)) {
PyErr_SetString(PyExc_AttributeError, "expected an int and one or two PyObjects");
return NULL;
}
- if (type!=GL_BYTE && type!=GL_SHORT && type!=GL_INT && type!=GL_FLOAT && type!=GL_DOUBLE) {
+ if (!ELEM5(type, GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE)) {
PyErr_SetString(PyExc_AttributeError, "invalid first argument type, should be one of GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT or GL_DOUBLE");
return NULL;
}
- if (PyNumber_Check(length_ob)) {
+ if (PyLong_Check(length_ob)) {
ndimensions= 1;
- dimensions[0]= PyLong_AsLong(length_ob);
- } else if (PySequence_Check(length_ob)) {
- ndimensions= PySequence_Length(length_ob);
+ if(((dimensions[0]= PyLong_AsLong(length_ob)) < 1)) {
+ PyErr_SetString(PyExc_AttributeError, "dimensions must be between 1 and "STRINGIFY(MAX_DIMENSIONS));
+ return NULL;
+ }
+ }
+ else if (PySequence_Check(length_ob)) {
+ ndimensions= PySequence_Size(length_ob);
if (ndimensions > MAX_DIMENSIONS) {
- PyErr_SetString(PyExc_AttributeError, "too many dimensions, max is 256");
+ PyErr_SetString(PyExc_AttributeError, "too many dimensions, max is "STRINGIFY(MAX_DIMENSIONS));
+ return NULL;
+ }
+ else if (ndimensions < 1) {
+ PyErr_SetString(PyExc_AttributeError, "sequence must have at least one dimension");
return NULL;
}
for (i=0; i<ndimensions; i++) {
PyObject *ob= PySequence_GetItem(length_ob, i);
- if (!PyNumber_Check(ob)) dimensions[i]= 1;
+ if (!PyLong_Check(ob)) dimensions[i]= 1;
else dimensions[i]= PyLong_AsLong(ob);
Py_DECREF(ob);
+
+ if(dimensions[i] < 1) {
+ PyErr_SetString(PyExc_AttributeError, "dimensions must be between 1 and "STRINGIFY(MAX_DIMENSIONS));
+ return NULL;
+ }
}
}
+ else {
+ PyErr_Format(PyExc_TypeError, "invalid second argument argument expected a sequence or an int, not a %.200s", Py_TYPE(length_ob)->tp_name);
+ return NULL;
+ }
buffer= BGL_MakeBuffer(type, ndimensions, dimensions, NULL);
- if (template && ndimensions) {
- if (Buffer_ass_slice((PyObject *) buffer, 0, dimensions[0], template)) {
+ if (init && ndimensions) {
+ if (Buffer_ass_slice((PyObject *) buffer, 0, dimensions[0], init)) {
Py_DECREF(buffer);
return NULL;
}
@@ -295,9 +316,9 @@ static PyObject *Buffer_slice(PyObject *self, int begin, int end)
list= PyList_New(end-begin);
- for (count= begin; count<end; count++)
- PyList_SetItem(list, count-begin, Buffer_item(self, count));
-
+ for (count= begin; count<end; count++) {
+ PyList_SET_ITEM(list, count-begin, Buffer_item(self, count));
+ }
return list;
}
@@ -356,8 +377,8 @@ static int Buffer_ass_slice(PyObject *self, int begin, int end, PyObject *seq)
return -1;
}
- if (PySequence_Length(seq)!=(end-begin)) {
- int seq_len = PySequence_Length(seq);
+ if (PySequence_Size(seq)!=(end-begin)) {
+ int seq_len = PySequence_Size(seq);
char err_str[128];
sprintf(err_str, "size mismatch in assignment. Expected size: %d (size provided: %d)", seq_len, (end-begin));
PyErr_SetString(PyExc_TypeError, err_str);
@@ -389,11 +410,11 @@ static PyObject *Buffer_tolist(PyObject *self)
{
int i, len= ((Buffer *)self)->dimensions[0];
PyObject *list= PyList_New(len);
-
+
for (i=0; i<len; i++) {
- PyList_SetItem(list, i, Buffer_item(self, i));
+ PyList_SET_ITEM(list, i, Buffer_item(self, i));
}
-
+
return list;
}
@@ -402,11 +423,11 @@ static PyObject *Buffer_dimensions(PyObject *self)
Buffer *buffer= (Buffer *) self;
PyObject *list= PyList_New(buffer->ndimensions);
int i;
-
+
for (i= 0; i<buffer->ndimensions; i++) {
- PyList_SetItem(list, i, PyLong_FromLong(buffer->dimensions[i]));
+ PyList_SET_ITEM(list, i, PyLong_FromLong(buffer->dimensions[i]));
}
-
+
return list;
}
@@ -1113,12 +1134,11 @@ static struct PyModuleDef BGL_module_def = {
};
-PyObject *BGL_Init(void)
+PyObject *BPyInit_bgl(void)
{
- PyObject *mod, *dict, *item;
- mod = PyModule_Create(&BGL_module_def);
- PyDict_SetItemString(PyImport_GetModuleDict(), BGL_module_def.m_name, mod);
- dict= PyModule_GetDict(mod);
+ PyObject *submodule, *dict, *item;
+ submodule= PyModule_Create(&BGL_module_def);
+ dict= PyModule_GetDict(submodule);
if( PyType_Ready( &BGL_bufferType) < 0)
return NULL; /* should never happen */
@@ -1610,6 +1630,6 @@ PyObject *BGL_Init(void)
EXPP_ADDCONST(GL_TEXTURE_BINDING_1D);
EXPP_ADDCONST(GL_TEXTURE_BINDING_2D);
- return mod;
+ return submodule;
}
diff --git a/source/blender/python/generic/bgl.h b/source/blender/python/generic/bgl.h
index 80b0b90f643..049b3f101a0 100644
--- a/source/blender/python/generic/bgl.h
+++ b/source/blender/python/generic/bgl.h
@@ -33,12 +33,12 @@
* writers to make OpenGL calls in their Python scripts for Blender. The
* more important original comments are marked with an @ symbol. */
-#ifndef EXPP_BGL_H
-#define EXPP_BGL_H
+#ifndef BGL_H
+#define BGL_H
#include <Python.h>
-PyObject *BGL_Init(void);
+PyObject *BPyInit_bgl(void);
/*@ Create a buffer object */
/*@ dimensions is an array of ndimensions integers representing the size of each dimension */
@@ -215,19 +215,19 @@ extern PyTypeObject BGL_bufferType;
#define GLsizei_def(num) int GLsizei_var(num)
/* typedef unsigned char GLubyte; */
-#define GLubyte_str "b"
+#define GLubyte_str "B"
#define GLubyte_var(num) bgl_var##num
#define GLubyte_ref(num) &bgl_var##num
#define GLubyte_def(num) /* unsigned */ char GLubyte_var(num)
/* typedef unsigned short GLushort; */
-#define GLushort_str "h"
+#define GLushort_str "H"
#define GLushort_var(num) bgl_var##num
#define GLushort_ref(num) &bgl_var##num
#define GLushort_def(num) /* unsigned */ short GLushort_var(num)
/* typedef unsigned int GLuint; */
-#define GLuint_str "i"
+#define GLuint_str "I"
#define GLuint_var(num) bgl_var##num
#define GLuint_ref(num) &bgl_var##num
#define GLuint_def(num) /* unsigned */ int GLuint_var(num)
@@ -337,4 +337,4 @@ extern PyTypeObject BGL_bufferType;
return NULL;\
}
-#endif /* EXPP_BGL_H */
+#endif /* BGL_H */
diff --git a/source/blender/python/generic/blf_api.c b/source/blender/python/generic/blf_py_api.c
index a5f5f8815c7..a401f1e4393 100644
--- a/source/blender/python/generic/blf_api.c
+++ b/source/blender/python/generic/blf_py_api.c
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id: blf_py_api.c 34160 2011-01-07 19:18:31Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -23,10 +23,14 @@
*/
#include <Python.h>
-#include "blf_api.h"
+#include "blf_py_api.h"
#include "../../blenfont/BLF_api.h"
+#include "BLI_utildefines.h"
+
+
+
static char py_blf_position_doc[] =
".. function:: position(fontid, x, y, z)\n"
"\n"
@@ -41,7 +45,7 @@ static char py_blf_position_doc[] =
" :arg z: Z axis position to draw the text.\n"
" :type z: float\n";
-static PyObject *py_blf_position(PyObject *self, PyObject *args)
+static PyObject *py_blf_position(PyObject *UNUSED(self), PyObject *args)
{
int fontid;
float x, y, z;
@@ -67,7 +71,7 @@ static char py_blf_size_doc[] =
" :arg dpi: dots per inch value to use for drawing.\n"
" :type dpi: int\n";
-static PyObject *py_blf_size(PyObject *self, PyObject *args)
+static PyObject *py_blf_size(PyObject *UNUSED(self), PyObject *args)
{
int fontid, size, dpi;
@@ -90,7 +94,7 @@ static char py_blf_aspect_doc[] =
" :arg aspect: The aspect ratio for text drawing to use.\n"
" :type aspect: float\n";
-static PyObject *py_blf_aspect(PyObject *self, PyObject *args)
+static PyObject *py_blf_aspect(PyObject *UNUSED(self), PyObject *args)
{
float aspect;
int fontid;
@@ -98,7 +102,7 @@ static PyObject *py_blf_aspect(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "if:blf.aspect", &fontid, &aspect))
return NULL;
- BLF_aspect(fontid, aspect);
+ BLF_aspect(fontid, aspect, aspect, 1.0);
Py_RETURN_NONE;
}
@@ -114,7 +118,7 @@ static char py_blf_blur_doc[] =
" :arg radius: The radius for blurring text (in pixels).\n"
" :type radius: int\n";
-static PyObject *py_blf_blur(PyObject *self, PyObject *args)
+static PyObject *py_blf_blur(PyObject *UNUSED(self), PyObject *args)
{
int blur, fontid;
@@ -137,15 +141,16 @@ static char py_blf_draw_doc[] =
" :arg text: the text to draw.\n"
" :type text: string\n";
-static PyObject *py_blf_draw(PyObject *self, PyObject *args)
+static PyObject *py_blf_draw(PyObject *UNUSED(self), PyObject *args)
{
char *text;
+ int text_length;
int fontid;
- if (!PyArg_ParseTuple(args, "is:blf.draw", &fontid, &text))
+ if (!PyArg_ParseTuple(args, "is#:blf.draw", &fontid, &text, &text_length))
return NULL;
- BLF_draw(fontid, text);
+ BLF_draw(fontid, text, (unsigned int)text_length);
Py_RETURN_NONE;
}
@@ -162,7 +167,7 @@ static char py_blf_dimensions_doc[] =
" :return: the width and height of the text.\n"
" :rtype: tuple of 2 floats\n";
-static PyObject *py_blf_dimensions(PyObject *self, PyObject *args)
+static PyObject *py_blf_dimensions(PyObject *UNUSED(self), PyObject *args)
{
char *text;
float r_width, r_height;
@@ -196,7 +201,7 @@ static char py_blf_clipping_doc[] =
" :arg ymax: Clip the drawing area by these bounds.\n"
" :type ymax: float\n";
-static PyObject *py_blf_clipping(PyObject *self, PyObject *args)
+static PyObject *py_blf_clipping(PyObject *UNUSED(self), PyObject *args)
{
float xmin, ymin, xmax, ymax;
int fontid;
@@ -219,7 +224,7 @@ static char py_blf_disable_doc[] =
" :arg option: One of ROTATION, CLIPPING, SHADOW or KERNING_DEFAULT.\n"
" :type option: int\n";
-static PyObject *py_blf_disable(PyObject *self, PyObject *args)
+static PyObject *py_blf_disable(PyObject *UNUSED(self), PyObject *args)
{
int option, fontid;
@@ -241,7 +246,7 @@ static char py_blf_enable_doc[] =
" :arg option: One of ROTATION, CLIPPING, SHADOW or KERNING_DEFAULT.\n"
" :type option: int\n";
-static PyObject *py_blf_enable(PyObject *self, PyObject *args)
+static PyObject *py_blf_enable(PyObject *UNUSED(self), PyObject *args)
{
int option, fontid;
@@ -263,7 +268,7 @@ static char py_blf_rotation_doc[] =
" :arg angle: The angle for text drawing to use.\n"
" :type angle: float\n";
-static PyObject *py_blf_rotation(PyObject *self, PyObject *args)
+static PyObject *py_blf_rotation(PyObject *UNUSED(self), PyObject *args)
{
float angle;
int fontid;
@@ -294,7 +299,7 @@ static char py_blf_shadow_doc[] =
" :arg a: Shadow color (alpha channel 0.0 - 1.0).\n"
" :type a: float\n";
-static PyObject *py_blf_shadow(PyObject *self, PyObject *args)
+static PyObject *py_blf_shadow(PyObject *UNUSED(self), PyObject *args)
{
int level, fontid;
float r, g, b, a;
@@ -324,7 +329,7 @@ static char py_blf_shadow_offset_doc[] =
" :arg y: Horizontal shadow offset value in pixels.\n"
" :type y: float\n";
-static PyObject *py_blf_shadow_offset(PyObject *self, PyObject *args)
+static PyObject *py_blf_shadow_offset(PyObject *UNUSED(self), PyObject *args)
{
int x, y, fontid;
@@ -346,7 +351,7 @@ static char py_blf_load_doc[] =
" :return: the new font's fontid or -1 if there was an error.\n"
" :rtype: integer\n";
-static PyObject *py_blf_load(PyObject *self, PyObject *args)
+static PyObject *py_blf_load(PyObject *UNUSED(self), PyObject *args)
{
char* filename;
@@ -365,7 +370,7 @@ struct PyMethodDef BLF_methods[] = {
{"dimensions", (PyCFunction) py_blf_dimensions, METH_VARARGS, py_blf_dimensions_doc},
{"draw", (PyCFunction) py_blf_draw, METH_VARARGS, py_blf_draw_doc},
{"enable", (PyCFunction) py_blf_enable, METH_VARARGS, py_blf_enable_doc},
- {"position", (PyCFunction)py_blf_position, METH_VARARGS, py_blf_position_doc},
+ {"position", (PyCFunction) py_blf_position, METH_VARARGS, py_blf_position_doc},
{"rotation", (PyCFunction) py_blf_rotation, METH_VARARGS, py_blf_rotation_doc},
{"shadow", (PyCFunction) py_blf_shadow, METH_VARARGS, py_blf_shadow_doc},
{"shadow_offset", (PyCFunction) py_blf_shadow_offset, METH_VARARGS, py_blf_shadow_offset_doc},
@@ -389,17 +394,16 @@ static struct PyModuleDef BLF_module_def = {
0, /* m_free */
};
-PyObject *BLF_Init(void)
+PyObject *BPyInit_blf(void)
{
PyObject *submodule;
submodule = PyModule_Create(&BLF_module_def);
- PyDict_SetItemString(PyImport_GetModuleDict(), BLF_module_def.m_name, submodule);
PyModule_AddIntConstant(submodule, "ROTATION", BLF_ROTATION);
PyModule_AddIntConstant(submodule, "CLIPPING", BLF_CLIPPING);
PyModule_AddIntConstant(submodule, "SHADOW", BLF_SHADOW);
PyModule_AddIntConstant(submodule, "KERNING_DEFAULT", BLF_KERNING_DEFAULT);
- return (submodule);
+ return submodule;
}
diff --git a/source/blender/python/generic/blf_api.h b/source/blender/python/generic/blf_py_api.h
index fae20ace996..8a7bae59e21 100644
--- a/source/blender/python/generic/blf_api.h
+++ b/source/blender/python/generic/blf_py_api.h
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id: blf_py_api.h 33573 2010-12-09 17:31:42Z dfelinto $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -22,5 +22,4 @@
* ***** END GPL LICENSE BLOCK *****
*/
-
-PyObject *BLF_Init(void);
+PyObject *BPyInit_blf(void);
diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c
index 11f8ff49ffe..a1b99e12e94 100644
--- a/source/blender/python/generic/bpy_internal_import.c
+++ b/source/blender/python/generic/bpy_internal_import.c
@@ -26,17 +26,27 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <Python.h>
+#include <stddef.h>
+
+#include "compile.h" /* for the PyCodeObject */
+#include "eval.h" /* for PyEval_EvalCode */
+
#include "bpy_internal_import.h"
-#include "DNA_text_types.h"
#include "MEM_guardedalloc.h"
-#include "BKE_text.h" /* txt_to_buf */
-#include "BKE_main.h"
-#include "BKE_global.h" /* grr, only for G.sce */
+
+#include "DNA_text_types.h"
+
#include "BLI_listbase.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
-#include <stddef.h>
+#include "BLI_utildefines.h"
+
+ /* UNUSED */
+#include "BKE_text.h" /* txt_to_buf */
+#include "BKE_main.h"
+#include "BKE_global.h" /* grr, only for G.main->name */
static Main *bpy_import_main= NULL;
@@ -61,16 +71,17 @@ void bpy_import_main_set(struct Main *maggie)
/* returns a dummy filename for a textblock so we can tell what file a text block comes from */
void bpy_text_filename_get(char *fn, Text *text)
{
- sprintf(fn, "%s/%s", text->id.lib ? text->id.lib->filepath : G.sce, text->id.name+2);
-
- /* XXX, this is a bug in python's Py_CompileString()!
+#if PY_VERSION_HEX >= 0x03020000
+ sprintf(fn, "%s%c%s", text->id.lib ? text->id.lib->filepath : G.main->name, SEP, text->id.name+2);
+#else
+ /* this is a bug in python's Py_CompileString()!, fixed for python 3.2.
the string encoding should not be required to be utf-8
- reported: http://bugs.python.org/msg115202
- */
- BLI_utf8_invalid_strip(fn, strlen(fn));
+ reported: http://bugs.python.org/msg115202 */
+ strcpy(fn, text->id.name+2);
+#endif
}
-PyObject *bpy_text_import( Text *text )
+PyObject *bpy_text_import(Text *text)
{
char *buf = NULL;
char modulename[24];
@@ -191,24 +202,24 @@ PyObject *bpy_text_reimport( PyObject *module, int *found )
}
-static PyObject *blender_import( PyObject * self, PyObject * args, PyObject * kw)
+static PyObject *blender_import(PyObject *UNUSED(self), PyObject *args, PyObject * kw)
{
PyObject *exception, *err, *tb;
char *name;
int found= 0;
PyObject *globals = NULL, *locals = NULL, *fromlist = NULL;
- PyObject *newmodule;
+ int level= -1; /* relative imports */
+ PyObject *newmodule;
//PyObject_Print(args, stderr, 0);
- int dummy_val; /* what does this do?*/
- static char *kwlist[] = {"name", "globals", "locals", "fromlist", "level", 0};
+ static const char *kwlist[] = {"name", "globals", "locals", "fromlist", "level", 0};
- if( !PyArg_ParseTupleAndKeywords( args, kw, "s|OOOi:bpy_import_meth", kwlist,
- &name, &globals, &locals, &fromlist, &dummy_val) )
+ if( !PyArg_ParseTupleAndKeywords(args, kw, "s|OOOi:bpy_import_meth", (char **)kwlist,
+ &name, &globals, &locals, &fromlist, &level) )
return NULL;
/* import existing builtin modules or modules that have been imported already */
- newmodule = PyImport_ImportModuleEx( name, globals, locals, fromlist );
+ newmodule= PyImport_ImportModuleLevel(name, globals, locals, fromlist, level);
if(newmodule)
return newmodule;
@@ -244,7 +255,7 @@ static PyObject *blender_import( PyObject * self, PyObject * args, PyObject * k
* our reload() module, to handle reloading in-memory scripts
*/
-static PyObject *blender_reload( PyObject * self, PyObject * module )
+static PyObject *blender_reload(PyObject *UNUSED(self), PyObject * module)
{
PyObject *exception, *err, *tb;
PyObject *newmodule = NULL;
@@ -281,8 +292,8 @@ static PyObject *blender_reload( PyObject * self, PyObject * module )
return newmodule;
}
-PyMethodDef bpy_import_meth[] = { {"bpy_import_meth", (PyCFunction)blender_import, METH_VARARGS | METH_KEYWORDS, "blenders import"} };
-PyMethodDef bpy_reload_meth[] = { {"bpy_reload_meth", (PyCFunction)blender_reload, METH_O, "blenders reload"} };
+PyMethodDef bpy_import_meth = {"bpy_import_meth", (PyCFunction)blender_import, METH_VARARGS | METH_KEYWORDS, "blenders import"};
+PyMethodDef bpy_reload_meth = {"bpy_reload_meth", (PyCFunction)blender_reload, METH_O, "blenders reload"};
/* Clear user modules.
diff --git a/source/blender/python/generic/bpy_internal_import.h b/source/blender/python/generic/bpy_internal_import.h
index 09e1fa629d3..dd7a3ab9f64 100644
--- a/source/blender/python/generic/bpy_internal_import.h
+++ b/source/blender/python/generic/bpy_internal_import.h
@@ -28,8 +28,8 @@
/* Note, the BGE needs to use this too, keep it minimal */
-#ifndef EXPP_bpy_import_h
-#define EXPP_bpy_import_h
+#ifndef BPY_INTERNAL_IMPORT_H
+#define BPY_INTERNAL_IMPORT_H
/* python redefines :/ */
#ifdef _POSIX_C_SOURCE
@@ -40,24 +40,20 @@
#undef _XOPEN_SOURCE
#endif
-#include <Python.h>
-#include "compile.h" /* for the PyCodeObject */
-#include "eval.h" /* for PyEval_EvalCode */
-
struct Text;
-PyObject* bpy_text_import( struct Text *text );
-PyObject* bpy_text_import_name( char *name, int *found );
-PyObject* bpy_text_reimport( PyObject *module, int *found );
-/* void bpy_text_clear_modules( int clear_all );*/ /* Clear user modules */
+PyObject* bpy_text_import(struct Text *text);
+PyObject* bpy_text_import_name(char *name, int *found);
+PyObject* bpy_text_reimport(PyObject *module, int *found);
+/* void bpy_text_clear_modules(int clear_all);*/ /* Clear user modules */
void bpy_text_filename_get(char *fn, struct Text *text);
-extern PyMethodDef bpy_import_meth[];
-extern PyMethodDef bpy_reload_meth[];
+extern PyMethodDef bpy_import_meth;
+extern PyMethodDef bpy_reload_meth;
/* The game engine has its own Main struct, if this is set search this rather then G.main */
struct Main *bpy_import_main_get(void);
void bpy_import_main_set(struct Main *maggie);
-#endif /* EXPP_bpy_import_h */
+#endif /* BPY_INTERNAL_IMPORT_H */
diff --git a/source/blender/python/generic/geometry.c b/source/blender/python/generic/geometry.c
deleted file mode 100644
index 0e98760314d..00000000000
--- a/source/blender/python/generic/geometry.c
+++ /dev/null
@@ -1,841 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * This is a new part of Blender.
- *
- * Contributor(s): Joseph Gilbert, Campbell Barton
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include "geometry.h"
-
-/* Used for PolyFill */
-#include "BKE_displist.h"
-#include "MEM_guardedalloc.h"
-#include "BLI_blenlib.h"
-
-#include "BKE_utildefines.h"
-#include "BKE_curve.h"
-#include "BLI_boxpack2d.h"
-#include "BLI_math.h"
-
-#define SWAP_FLOAT(a,b,tmp) tmp=a; a=b; b=tmp
-#define eps 0.000001
-
-
-/*-------------------------DOC STRINGS ---------------------------*/
-static char M_Geometry_doc[] = "The Blender geometry module\n\n";
-static char M_Geometry_Intersect_doc[] = "(v1, v2, v3, ray, orig, clip=1) - returns the intersection between a ray and a triangle, if possible, returns None otherwise";
-static char M_Geometry_TriangleArea_doc[] = "(v1, v2, v3) - returns the area size of the 2D or 3D triangle defined";
-static char M_Geometry_TriangleNormal_doc[] = "(v1, v2, v3) - returns the normal of the 3D triangle defined";
-static char M_Geometry_QuadNormal_doc[] = "(v1, v2, v3, v4) - returns the normal of the 3D quad defined";
-static char M_Geometry_LineIntersect_doc[] = "(v1, v2, v3, v4) - returns a tuple with the points on each line respectively closest to the other";
-static char M_Geometry_PolyFill_doc[] = "(veclist_list) - takes a list of polylines (each point a vector) and returns the point indicies for a polyline filled with triangles";
-static char M_Geometry_LineIntersect2D_doc[] = "(lineA_p1, lineA_p2, lineB_p1, lineB_p2) - takes 2 lines (as 4 vectors) and returns a vector for their point of intersection or None";
-static char M_Geometry_ClosestPointOnLine_doc[] = "(pt, line_p1, line_p2) - takes a point and a line and returns a (Vector, float) for the point on the line, and the bool so you can know if the point was between the 2 points";
-static char M_Geometry_PointInTriangle2D_doc[] = "(pt, tri_p1, tri_p2, tri_p3) - takes 4 vectors, one is the point and the next 3 define the triangle, only the x and y are used from the vectors";
-static char M_Geometry_PointInQuad2D_doc[] = "(pt, quad_p1, quad_p2, quad_p3, quad_p4) - takes 5 vectors, one is the point and the next 4 define the quad, only the x and y are used from the vectors";
-static char M_Geometry_BoxPack2D_doc[] = "";
-static char M_Geometry_BezierInterp_doc[] = "";
-
-//---------------------------------INTERSECTION FUNCTIONS--------------------
-//----------------------------------geometry.Intersect() -------------------
-static PyObject *M_Geometry_Intersect( PyObject * self, PyObject * args )
-{
- VectorObject *ray, *ray_off, *vec1, *vec2, *vec3;
- float dir[3], orig[3], v1[3], v2[3], v3[3], e1[3], e2[3], pvec[3], tvec[3], qvec[3];
- float det, inv_det, u, v, t;
- int clip = 1;
-
- if(!PyArg_ParseTuple(args, "O!O!O!O!O!|i", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3, &vector_Type, &ray, &vector_Type, &ray_off , &clip)) {
- PyErr_SetString( PyExc_TypeError, "expected 5 vector types\n" );
- return NULL;
- }
- if(vec1->size != 3 || vec2->size != 3 || vec3->size != 3 || ray->size != 3 || ray_off->size != 3) {
- PyErr_SetString( PyExc_TypeError, "only 3D vectors for all parameters\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(ray) || !BaseMath_ReadCallback(ray_off))
- return NULL;
-
- VECCOPY(v1, vec1->vec);
- VECCOPY(v2, vec2->vec);
- VECCOPY(v3, vec3->vec);
-
- VECCOPY(dir, ray->vec);
- normalize_v3(dir);
-
- VECCOPY(orig, ray_off->vec);
-
- /* find vectors for two edges sharing v1 */
- sub_v3_v3v3(e1, v2, v1);
- sub_v3_v3v3(e2, v3, v1);
-
- /* begin calculating determinant - also used to calculated U parameter */
- cross_v3_v3v3(pvec, dir, e2);
-
- /* if determinant is near zero, ray lies in plane of triangle */
- det = dot_v3v3(e1, pvec);
-
- if (det > -0.000001 && det < 0.000001) {
- Py_RETURN_NONE;
- }
-
- inv_det = 1.0f / det;
-
- /* calculate distance from v1 to ray origin */
- sub_v3_v3v3(tvec, orig, v1);
-
- /* calculate U parameter and test bounds */
- u = dot_v3v3(tvec, pvec) * inv_det;
- if (clip && (u < 0.0f || u > 1.0f)) {
- Py_RETURN_NONE;
- }
-
- /* prepare to test the V parameter */
- cross_v3_v3v3(qvec, tvec, e1);
-
- /* calculate V parameter and test bounds */
- v = dot_v3v3(dir, qvec) * inv_det;
-
- if (clip && (v < 0.0f || u + v > 1.0f)) {
- Py_RETURN_NONE;
- }
-
- /* calculate t, ray intersects triangle */
- t = dot_v3v3(e2, qvec) * inv_det;
-
- mul_v3_fl(dir, t);
- add_v3_v3v3(pvec, orig, dir);
-
- return newVectorObject(pvec, 3, Py_NEW, NULL);
-}
-//----------------------------------geometry.LineIntersect() -------------------
-/* Line-Line intersection using algorithm from mathworld.wolfram.com */
-static PyObject *M_Geometry_LineIntersect( PyObject * self, PyObject * args )
-{
- PyObject * tuple;
- VectorObject *vec1, *vec2, *vec3, *vec4;
- float v1[3], v2[3], v3[3], v4[3], i1[3], i2[3];
-
- if( !PyArg_ParseTuple( args, "O!O!O!O!", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3, &vector_Type, &vec4 ) ) {
- PyErr_SetString( PyExc_TypeError, "expected 4 vector types\n" );
- return NULL;
- }
- if( vec1->size != vec2->size || vec1->size != vec3->size || vec3->size != vec2->size) {
- PyErr_SetString( PyExc_TypeError,"vectors must be of the same size\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(vec4))
- return NULL;
-
- if( vec1->size == 3 || vec1->size == 2) {
- int result;
-
- if (vec1->size == 3) {
- VECCOPY(v1, vec1->vec);
- VECCOPY(v2, vec2->vec);
- VECCOPY(v3, vec3->vec);
- VECCOPY(v4, vec4->vec);
- }
- else {
- v1[0] = vec1->vec[0];
- v1[1] = vec1->vec[1];
- v1[2] = 0.0f;
-
- v2[0] = vec2->vec[0];
- v2[1] = vec2->vec[1];
- v2[2] = 0.0f;
-
- v3[0] = vec3->vec[0];
- v3[1] = vec3->vec[1];
- v3[2] = 0.0f;
-
- v4[0] = vec4->vec[0];
- v4[1] = vec4->vec[1];
- v4[2] = 0.0f;
- }
-
- result = isect_line_line_v3(v1, v2, v3, v4, i1, i2);
-
- if (result == 0) {
- /* colinear */
- Py_RETURN_NONE;
- }
- else {
- tuple = PyTuple_New( 2 );
- PyTuple_SetItem( tuple, 0, newVectorObject(i1, vec1->size, Py_NEW, NULL) );
- PyTuple_SetItem( tuple, 1, newVectorObject(i2, vec1->size, Py_NEW, NULL) );
- return tuple;
- }
- }
- else {
- PyErr_SetString( PyExc_TypeError, "2D/3D vectors only\n" );
- return NULL;
- }
-}
-
-
-
-//---------------------------------NORMALS FUNCTIONS--------------------
-//----------------------------------geometry.QuadNormal() -------------------
-static PyObject *M_Geometry_QuadNormal( PyObject * self, PyObject * args )
-{
- VectorObject *vec1;
- VectorObject *vec2;
- VectorObject *vec3;
- VectorObject *vec4;
- float v1[3], v2[3], v3[3], v4[3], e1[3], e2[3], n1[3], n2[3];
-
- if( !PyArg_ParseTuple( args, "O!O!O!O!", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3, &vector_Type, &vec4 ) ) {
- PyErr_SetString( PyExc_TypeError, "expected 4 vector types\n" );
- return NULL;
- }
- if( vec1->size != vec2->size || vec1->size != vec3->size || vec1->size != vec4->size) {
- PyErr_SetString( PyExc_TypeError,"vectors must be of the same size\n" );
- return NULL;
- }
- if( vec1->size != 3 ) {
- PyErr_SetString( PyExc_TypeError, "only 3D vectors\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(vec4))
- return NULL;
-
- VECCOPY(v1, vec1->vec);
- VECCOPY(v2, vec2->vec);
- VECCOPY(v3, vec3->vec);
- VECCOPY(v4, vec4->vec);
-
- /* find vectors for two edges sharing v2 */
- sub_v3_v3v3(e1, v1, v2);
- sub_v3_v3v3(e2, v3, v2);
-
- cross_v3_v3v3(n1, e2, e1);
- normalize_v3(n1);
-
- /* find vectors for two edges sharing v4 */
- sub_v3_v3v3(e1, v3, v4);
- sub_v3_v3v3(e2, v1, v4);
-
- cross_v3_v3v3(n2, e2, e1);
- normalize_v3(n2);
-
- /* adding and averaging the normals of both triangles */
- add_v3_v3v3(n1, n2, n1);
- normalize_v3(n1);
-
- return newVectorObject(n1, 3, Py_NEW, NULL);
-}
-
-//----------------------------geometry.TriangleNormal() -------------------
-static PyObject *M_Geometry_TriangleNormal( PyObject * self, PyObject * args )
-{
- VectorObject *vec1, *vec2, *vec3;
- float v1[3], v2[3], v3[3], e1[3], e2[3], n[3];
-
- if( !PyArg_ParseTuple( args, "O!O!O!", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3 ) ) {
- PyErr_SetString( PyExc_TypeError, "expected 3 vector types\n" );
- return NULL;
- }
- if( vec1->size != vec2->size || vec1->size != vec3->size ) {
- PyErr_SetString( PyExc_TypeError, "vectors must be of the same size\n" );
- return NULL;
- }
- if( vec1->size != 3 ) {
- PyErr_SetString( PyExc_TypeError, "only 3D vectors\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3))
- return NULL;
-
- VECCOPY(v1, vec1->vec);
- VECCOPY(v2, vec2->vec);
- VECCOPY(v3, vec3->vec);
-
- /* find vectors for two edges sharing v2 */
- sub_v3_v3v3(e1, v1, v2);
- sub_v3_v3v3(e2, v3, v2);
-
- cross_v3_v3v3(n, e2, e1);
- normalize_v3(n);
-
- return newVectorObject(n, 3, Py_NEW, NULL);
-}
-
-//--------------------------------- AREA FUNCTIONS--------------------
-//----------------------------------geometry.TriangleArea() -------------------
-static PyObject *M_Geometry_TriangleArea( PyObject * self, PyObject * args )
-{
- VectorObject *vec1, *vec2, *vec3;
- float v1[3], v2[3], v3[3];
-
- if( !PyArg_ParseTuple
- ( args, "O!O!O!", &vector_Type, &vec1, &vector_Type, &vec2
- , &vector_Type, &vec3 ) ) {
- PyErr_SetString( PyExc_TypeError, "expected 3 vector types\n");
- return NULL;
- }
- if( vec1->size != vec2->size || vec1->size != vec3->size ) {
- PyErr_SetString( PyExc_TypeError, "vectors must be of the same size\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3))
- return NULL;
-
- if (vec1->size == 3) {
- VECCOPY(v1, vec1->vec);
- VECCOPY(v2, vec2->vec);
- VECCOPY(v3, vec3->vec);
-
- return PyFloat_FromDouble( area_tri_v3(v1, v2, v3) );
- }
- else if (vec1->size == 2) {
- v1[0] = vec1->vec[0];
- v1[1] = vec1->vec[1];
-
- v2[0] = vec2->vec[0];
- v2[1] = vec2->vec[1];
-
- v3[0] = vec3->vec[0];
- v3[1] = vec3->vec[1];
-
- return PyFloat_FromDouble( area_tri_v2(v1, v2, v3) );
- }
- else {
- PyErr_SetString( PyExc_TypeError, "only 2D,3D vectors are supported\n" );
- return NULL;
- }
-}
-
-/*----------------------------------geometry.PolyFill() -------------------*/
-/* PolyFill function, uses Blenders scanfill to fill multiple poly lines */
-static PyObject *M_Geometry_PolyFill( PyObject * self, PyObject * polyLineSeq )
-{
- PyObject *tri_list; /*return this list of tri's */
- PyObject *polyLine, *polyVec;
- int i, len_polylines, len_polypoints, ls_error = 0;
-
- /* display listbase */
- ListBase dispbase={NULL, NULL};
- DispList *dl;
- float *fp; /*pointer to the array of malloced dl->verts to set the points from the vectors */
- int index, *dl_face, totpoints=0;
-
-
- dispbase.first= dispbase.last= NULL;
-
-
- if(!PySequence_Check(polyLineSeq)) {
- PyErr_SetString( PyExc_TypeError, "expected a sequence of poly lines" );
- return NULL;
- }
-
- len_polylines = PySequence_Size( polyLineSeq );
-
- for( i = 0; i < len_polylines; ++i ) {
- polyLine= PySequence_GetItem( polyLineSeq, i );
- if (!PySequence_Check(polyLine)) {
- freedisplist(&dispbase);
- Py_XDECREF(polyLine); /* may be null so use Py_XDECREF*/
- PyErr_SetString( PyExc_TypeError, "One or more of the polylines is not a sequence of mathutils.Vector's" );
- return NULL;
- }
-
- len_polypoints= PySequence_Size( polyLine );
- if (len_polypoints>0) { /* dont bother adding edges as polylines */
-#if 0
- if (EXPP_check_sequence_consistency( polyLine, &vector_Type ) != 1) {
- freedisplist(&dispbase);
- Py_DECREF(polyLine);
- PyErr_SetString( PyExc_TypeError, "A point in one of the polylines is not a mathutils.Vector type" );
- return NULL;
- }
-#endif
- dl= MEM_callocN(sizeof(DispList), "poly disp");
- BLI_addtail(&dispbase, dl);
- dl->type= DL_INDEX3;
- dl->nr= len_polypoints;
- dl->type= DL_POLY;
- dl->parts= 1; /* no faces, 1 edge loop */
- dl->col= 0; /* no material */
- dl->verts= fp= MEM_callocN( sizeof(float)*3*len_polypoints, "dl verts");
- dl->index= MEM_callocN(sizeof(int)*3*len_polypoints, "dl index");
-
- for( index = 0; index<len_polypoints; ++index, fp+=3) {
- polyVec= PySequence_GetItem( polyLine, index );
- if(VectorObject_Check(polyVec)) {
-
- if(!BaseMath_ReadCallback((VectorObject *)polyVec))
- ls_error= 1;
-
- fp[0] = ((VectorObject *)polyVec)->vec[0];
- fp[1] = ((VectorObject *)polyVec)->vec[1];
- if( ((VectorObject *)polyVec)->size > 2 )
- fp[2] = ((VectorObject *)polyVec)->vec[2];
- else
- fp[2]= 0.0f; /* if its a 2d vector then set the z to be zero */
- }
- else {
- ls_error= 1;
- }
-
- totpoints++;
- Py_DECREF(polyVec);
- }
- }
- Py_DECREF(polyLine);
- }
-
- if(ls_error) {
- freedisplist(&dispbase); /* possible some dl was allocated */
- PyErr_SetString( PyExc_TypeError, "A point in one of the polylines is not a mathutils.Vector type" );
- return NULL;
- }
- else if (totpoints) {
- /* now make the list to return */
- filldisplist(&dispbase, &dispbase, 0);
-
- /* The faces are stored in a new DisplayList
- thats added to the head of the listbase */
- dl= dispbase.first;
-
- tri_list= PyList_New(dl->parts);
- if( !tri_list ) {
- freedisplist(&dispbase);
- PyErr_SetString( PyExc_RuntimeError, "geometry.PolyFill failed to make a new list" );
- return NULL;
- }
-
- index= 0;
- dl_face= dl->index;
- while(index < dl->parts) {
- PyList_SetItem(tri_list, index, Py_BuildValue("iii", dl_face[0], dl_face[1], dl_face[2]) );
- dl_face+= 3;
- index++;
- }
- freedisplist(&dispbase);
- } else {
- /* no points, do this so scripts dont barf */
- freedisplist(&dispbase); /* possible some dl was allocated */
- tri_list= PyList_New(0);
- }
-
- return tri_list;
-}
-
-
-static PyObject *M_Geometry_LineIntersect2D( PyObject * self, PyObject * args )
-{
- VectorObject *line_a1, *line_a2, *line_b1, *line_b2;
- float a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y, xi, yi, a1,a2,b1,b2, newvec[2];
- if( !PyArg_ParseTuple ( args, "O!O!O!O!",
- &vector_Type, &line_a1,
- &vector_Type, &line_a2,
- &vector_Type, &line_b1,
- &vector_Type, &line_b2)
- ) {
- PyErr_SetString( PyExc_TypeError, "expected 4 vector types\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(line_a1) || !BaseMath_ReadCallback(line_a2) || !BaseMath_ReadCallback(line_b1) || !BaseMath_ReadCallback(line_b2))
- return NULL;
-
- a1x= line_a1->vec[0];
- a1y= line_a1->vec[1];
- a2x= line_a2->vec[0];
- a2y= line_a2->vec[1];
-
- b1x= line_b1->vec[0];
- b1y= line_b1->vec[1];
- b2x= line_b2->vec[0];
- b2y= line_b2->vec[1];
-
- if((MIN2(a1x, a2x) > MAX2(b1x, b2x)) ||
- (MAX2(a1x, a2x) < MIN2(b1x, b2x)) ||
- (MIN2(a1y, a2y) > MAX2(b1y, b2y)) ||
- (MAX2(a1y, a2y) < MIN2(b1y, b2y)) ) {
- Py_RETURN_NONE;
- }
- /* Make sure the hoz/vert line comes first. */
- if (fabs(b1x - b2x) < eps || fabs(b1y - b2y) < eps) {
- SWAP_FLOAT(a1x, b1x, xi); /*abuse xi*/
- SWAP_FLOAT(a1y, b1y, xi);
- SWAP_FLOAT(a2x, b2x, xi);
- SWAP_FLOAT(a2y, b2y, xi);
- }
-
- if (fabs(a1x-a2x) < eps) { /* verticle line */
- if (fabs(b1x-b2x) < eps){ /*verticle second line */
- Py_RETURN_NONE; /* 2 verticle lines dont intersect. */
- }
- else if (fabs(b1y-b2y) < eps) {
- /*X of vert, Y of hoz. no calculation needed */
- newvec[0]= a1x;
- newvec[1]= b1y;
- return newVectorObject(newvec, 2, Py_NEW, NULL);
- }
-
- yi = (float)(((b1y / fabs(b1x - b2x)) * fabs(b2x - a1x)) + ((b2y / fabs(b1x - b2x)) * fabs(b1x - a1x)));
-
- if (yi > MAX2(a1y, a2y)) {/* New point above seg1's vert line */
- Py_RETURN_NONE;
- } else if (yi < MIN2(a1y, a2y)) { /* New point below seg1's vert line */
- Py_RETURN_NONE;
- }
- newvec[0]= a1x;
- newvec[1]= yi;
- return newVectorObject(newvec, 2, Py_NEW, NULL);
- } else if (fabs(a2y-a1y) < eps) { /* hoz line1 */
- if (fabs(b2y-b1y) < eps) { /*hoz line2*/
- Py_RETURN_NONE; /*2 hoz lines dont intersect*/
- }
-
- /* Can skip vert line check for seg 2 since its covered above. */
- xi = (float)(((b1x / fabs(b1y - b2y)) * fabs(b2y - a1y)) + ((b2x / fabs(b1y - b2y)) * fabs(b1y - a1y)));
- if (xi > MAX2(a1x, a2x)) { /* New point right of hoz line1's */
- Py_RETURN_NONE;
- } else if (xi < MIN2(a1x, a2x)) { /*New point left of seg1's hoz line */
- Py_RETURN_NONE;
- }
- newvec[0]= xi;
- newvec[1]= a1y;
- return newVectorObject(newvec, 2, Py_NEW, NULL);
- }
-
- b1 = (a2y-a1y)/(a2x-a1x);
- b2 = (b2y-b1y)/(b2x-b1x);
- a1 = a1y-b1*a1x;
- a2 = b1y-b2*b1x;
-
- if (b1 - b2 == 0.0) {
- Py_RETURN_NONE;
- }
-
- xi = - (a1-a2)/(b1-b2);
- yi = a1+b1*xi;
- if ((a1x-xi)*(xi-a2x) >= 0 && (b1x-xi)*(xi-b2x) >= 0 && (a1y-yi)*(yi-a2y) >= 0 && (b1y-yi)*(yi-b2y)>=0) {
- newvec[0]= xi;
- newvec[1]= yi;
- return newVectorObject(newvec, 2, Py_NEW, NULL);
- }
- Py_RETURN_NONE;
-}
-
-static PyObject *M_Geometry_ClosestPointOnLine( PyObject * self, PyObject * args )
-{
- VectorObject *pt, *line_1, *line_2;
- float pt_in[3], pt_out[3], l1[3], l2[3];
- float lambda;
- PyObject *ret;
-
- if( !PyArg_ParseTuple ( args, "O!O!O!",
- &vector_Type, &pt,
- &vector_Type, &line_1,
- &vector_Type, &line_2)
- ) {
- PyErr_SetString( PyExc_TypeError, "expected 3 vector types\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(pt) || !BaseMath_ReadCallback(line_1) || !BaseMath_ReadCallback(line_2))
- return NULL;
-
- /* accept 2d verts */
- if (pt->size==3) { VECCOPY(pt_in, pt->vec);}
- else { pt_in[2]=0.0; VECCOPY2D(pt_in, pt->vec) }
-
- if (line_1->size==3) { VECCOPY(l1, line_1->vec);}
- else { l1[2]=0.0; VECCOPY2D(l1, line_1->vec) }
-
- if (line_2->size==3) { VECCOPY(l2, line_2->vec);}
- else { l2[2]=0.0; VECCOPY2D(l2, line_2->vec) }
-
- /* do the calculation */
- lambda = closest_to_line_v3( pt_out,pt_in, l1, l2);
-
- ret = PyTuple_New(2);
- PyTuple_SET_ITEM( ret, 0, newVectorObject(pt_out, 3, Py_NEW, NULL) );
- PyTuple_SET_ITEM( ret, 1, PyFloat_FromDouble(lambda) );
- return ret;
-}
-
-static PyObject *M_Geometry_PointInTriangle2D( PyObject * self, PyObject * args )
-{
- VectorObject *pt_vec, *tri_p1, *tri_p2, *tri_p3;
-
- if( !PyArg_ParseTuple ( args, "O!O!O!O!",
- &vector_Type, &pt_vec,
- &vector_Type, &tri_p1,
- &vector_Type, &tri_p2,
- &vector_Type, &tri_p3)
- ) {
- PyErr_SetString( PyExc_TypeError, "expected 4 vector types\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(pt_vec) || !BaseMath_ReadCallback(tri_p1) || !BaseMath_ReadCallback(tri_p2) || !BaseMath_ReadCallback(tri_p3))
- return NULL;
-
- return PyLong_FromLong(isect_point_tri_v2(pt_vec->vec, tri_p1->vec, tri_p2->vec, tri_p3->vec));
-}
-
-static PyObject *M_Geometry_PointInQuad2D( PyObject * self, PyObject * args )
-{
- VectorObject *pt_vec, *quad_p1, *quad_p2, *quad_p3, *quad_p4;
-
- if( !PyArg_ParseTuple ( args, "O!O!O!O!O!",
- &vector_Type, &pt_vec,
- &vector_Type, &quad_p1,
- &vector_Type, &quad_p2,
- &vector_Type, &quad_p3,
- &vector_Type, &quad_p4)
- ) {
- PyErr_SetString( PyExc_TypeError, "expected 5 vector types\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(pt_vec) || !BaseMath_ReadCallback(quad_p1) || !BaseMath_ReadCallback(quad_p2) || !BaseMath_ReadCallback(quad_p3) || !BaseMath_ReadCallback(quad_p4))
- return NULL;
-
- return PyLong_FromLong(isect_point_quad_v2(pt_vec->vec, quad_p1->vec, quad_p2->vec, quad_p3->vec, quad_p4->vec));
-}
-
-static int boxPack_FromPyObject(PyObject * value, boxPack **boxarray )
-{
- int len, i;
- PyObject *list_item, *item_1, *item_2;
- boxPack *box;
-
-
- /* Error checking must already be done */
- if( !PyList_Check( value ) ) {
- PyErr_SetString( PyExc_TypeError, "can only back a list of [x,y,x,w]" );
- return -1;
- }
-
- len = PyList_Size( value );
-
- (*boxarray) = MEM_mallocN( len*sizeof(boxPack), "boxPack box");
-
-
- for( i = 0; i < len; i++ ) {
- list_item = PyList_GET_ITEM( value, i );
- if( !PyList_Check( list_item ) || PyList_Size( list_item ) < 4 ) {
- MEM_freeN(*boxarray);
- PyErr_SetString( PyExc_TypeError, "can only back a list of [x,y,x,w]" );
- return -1;
- }
-
- box = (*boxarray)+i;
-
- item_1 = PyList_GET_ITEM(list_item, 2);
- item_2 = PyList_GET_ITEM(list_item, 3);
-
- if (!PyNumber_Check(item_1) || !PyNumber_Check(item_2)) {
- MEM_freeN(*boxarray);
- PyErr_SetString( PyExc_TypeError, "can only back a list of 2d boxes [x,y,x,w]" );
- return -1;
- }
-
- box->w = (float)PyFloat_AsDouble( item_1 );
- box->h = (float)PyFloat_AsDouble( item_2 );
- box->index = i;
- /* verts will be added later */
- }
- return 0;
-}
-
-static void boxPack_ToPyObject(PyObject * value, boxPack **boxarray)
-{
- int len, i;
- PyObject *list_item;
- boxPack *box;
-
- len = PyList_Size( value );
-
- for( i = 0; i < len; i++ ) {
- box = (*boxarray)+i;
- list_item = PyList_GET_ITEM( value, box->index );
- PyList_SET_ITEM( list_item, 0, PyFloat_FromDouble( box->x ));
- PyList_SET_ITEM( list_item, 1, PyFloat_FromDouble( box->y ));
- }
- MEM_freeN(*boxarray);
-}
-
-
-static PyObject *M_Geometry_BoxPack2D( PyObject * self, PyObject * boxlist )
-{
- boxPack *boxarray = NULL;
- float tot_width, tot_height;
- int len;
- int error;
-
- if(!PyList_Check(boxlist)) {
- PyErr_SetString( PyExc_TypeError, "expected a sequence of boxes [[x,y,w,h], ... ]" );
- return NULL;
- }
-
- len = PyList_Size( boxlist );
-
- if (!len)
- return Py_BuildValue( "ff", 0.0, 0.0);
-
- error = boxPack_FromPyObject(boxlist, &boxarray);
- if (error!=0) return NULL;
-
- /* Non Python function */
- boxPack2D(boxarray, len, &tot_width, &tot_height);
-
- boxPack_ToPyObject(boxlist, &boxarray);
-
- return Py_BuildValue( "ff", tot_width, tot_height);
-}
-
-static PyObject *M_Geometry_BezierInterp( PyObject * self, PyObject * args )
-{
- VectorObject *vec_k1, *vec_h1, *vec_k2, *vec_h2;
- int resolu;
- int dims;
- int i;
- float *coord_array, *fp;
- PyObject *list;
-
- float k1[4] = {0.0, 0.0, 0.0, 0.0};
- float h1[4] = {0.0, 0.0, 0.0, 0.0};
- float k2[4] = {0.0, 0.0, 0.0, 0.0};
- float h2[4] = {0.0, 0.0, 0.0, 0.0};
-
-
- if( !PyArg_ParseTuple ( args, "O!O!O!O!i",
- &vector_Type, &vec_k1,
- &vector_Type, &vec_h1,
- &vector_Type, &vec_h2,
- &vector_Type, &vec_k2, &resolu) || (resolu<=1)
- ) {
- PyErr_SetString( PyExc_TypeError, "expected 4 vector types and an int greater then 1\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec_k1) || !BaseMath_ReadCallback(vec_h1) || !BaseMath_ReadCallback(vec_k2) || !BaseMath_ReadCallback(vec_h2))
- return NULL;
-
- dims= MAX4(vec_k1->size, vec_h1->size, vec_h2->size, vec_k2->size);
-
- for(i=0; i < vec_k1->size; i++) k1[i]= vec_k1->vec[i];
- for(i=0; i < vec_h1->size; i++) h1[i]= vec_h1->vec[i];
- for(i=0; i < vec_k2->size; i++) k2[i]= vec_k2->vec[i];
- for(i=0; i < vec_h2->size; i++) h2[i]= vec_h2->vec[i];
-
- coord_array = MEM_callocN(dims * (resolu) * sizeof(float), "BezierInterp");
- for(i=0; i<dims; i++) {
- forward_diff_bezier(k1[i], h1[i], h2[i], k2[i], coord_array+i, resolu-1, sizeof(float)*dims);
- }
-
- list= PyList_New(resolu);
- fp= coord_array;
- for(i=0; i<resolu; i++, fp= fp+dims) {
- PyList_SET_ITEM(list, i, newVectorObject(fp, dims, Py_NEW, NULL));
- }
- MEM_freeN(coord_array);
- return list;
-}
-
-static PyObject *M_Geometry_BarycentricTransform(PyObject * self, PyObject * args)
-{
- VectorObject *vec_pt;
- VectorObject *vec_t1_tar, *vec_t2_tar, *vec_t3_tar;
- VectorObject *vec_t1_src, *vec_t2_src, *vec_t3_src;
- float vec[3];
-
- if( !PyArg_ParseTuple ( args, "O!O!O!O!O!O!O!",
- &vector_Type, &vec_pt,
- &vector_Type, &vec_t1_src,
- &vector_Type, &vec_t2_src,
- &vector_Type, &vec_t3_src,
- &vector_Type, &vec_t1_tar,
- &vector_Type, &vec_t2_tar,
- &vector_Type, &vec_t3_tar) || ( vec_pt->size != 3 ||
- vec_t1_src->size != 3 ||
- vec_t2_src->size != 3 ||
- vec_t3_src->size != 3 ||
- vec_t1_tar->size != 3 ||
- vec_t2_tar->size != 3 ||
- vec_t3_tar->size != 3)
- ) {
- PyErr_SetString( PyExc_TypeError, "expected 7, 3D vector types\n" );
- return NULL;
- }
-
- barycentric_transform(vec, vec_pt->vec,
- vec_t1_tar->vec, vec_t2_tar->vec, vec_t3_tar->vec,
- vec_t1_src->vec, vec_t2_src->vec, vec_t3_src->vec);
-
- return newVectorObject(vec, 3, Py_NEW, NULL);
-}
-
-struct PyMethodDef M_Geometry_methods[] = {
- {"Intersect", ( PyCFunction ) M_Geometry_Intersect, METH_VARARGS, M_Geometry_Intersect_doc},
- {"TriangleArea", ( PyCFunction ) M_Geometry_TriangleArea, METH_VARARGS, M_Geometry_TriangleArea_doc},
- {"TriangleNormal", ( PyCFunction ) M_Geometry_TriangleNormal, METH_VARARGS, M_Geometry_TriangleNormal_doc},
- {"QuadNormal", ( PyCFunction ) M_Geometry_QuadNormal, METH_VARARGS, M_Geometry_QuadNormal_doc},
- {"LineIntersect", ( PyCFunction ) M_Geometry_LineIntersect, METH_VARARGS, M_Geometry_LineIntersect_doc},
- {"PolyFill", ( PyCFunction ) M_Geometry_PolyFill, METH_O, M_Geometry_PolyFill_doc},
- {"LineIntersect2D", ( PyCFunction ) M_Geometry_LineIntersect2D, METH_VARARGS, M_Geometry_LineIntersect2D_doc},
- {"ClosestPointOnLine", ( PyCFunction ) M_Geometry_ClosestPointOnLine, METH_VARARGS, M_Geometry_ClosestPointOnLine_doc},
- {"PointInTriangle2D", ( PyCFunction ) M_Geometry_PointInTriangle2D, METH_VARARGS, M_Geometry_PointInTriangle2D_doc},
- {"PointInQuad2D", ( PyCFunction ) M_Geometry_PointInQuad2D, METH_VARARGS, M_Geometry_PointInQuad2D_doc},
- {"BoxPack2D", ( PyCFunction ) M_Geometry_BoxPack2D, METH_O, M_Geometry_BoxPack2D_doc},
- {"BezierInterp", ( PyCFunction ) M_Geometry_BezierInterp, METH_VARARGS, M_Geometry_BezierInterp_doc},
- {"BarycentricTransform", ( PyCFunction ) M_Geometry_BarycentricTransform, METH_VARARGS, NULL},
- {NULL, NULL, 0, NULL}
-};
-
-static struct PyModuleDef M_Geometry_module_def = {
- PyModuleDef_HEAD_INIT,
- "geometry", /* m_name */
- M_Geometry_doc, /* m_doc */
- 0, /* m_size */
- M_Geometry_methods, /* m_methods */
- 0, /* m_reload */
- 0, /* m_traverse */
- 0, /* m_clear */
- 0, /* m_free */
-};
-
-/*----------------------------MODULE INIT-------------------------*/
-PyObject *Geometry_Init(void)
-{
- PyObject *submodule;
-
- submodule = PyModule_Create(&M_Geometry_module_def);
- PyDict_SetItemString(PyImport_GetModuleDict(), M_Geometry_module_def.m_name, submodule);
-
- return (submodule);
-}
diff --git a/source/blender/python/generic/mathutils.c b/source/blender/python/generic/mathutils.c
index a643e6621b2..dc6fbac7eac 100644
--- a/source/blender/python/generic/mathutils.c
+++ b/source/blender/python/generic/mathutils.c
@@ -37,15 +37,34 @@
* - Mathutils.Slerp --> quat.slerp(other, fac)
* - Mathutils.Rand: removed, use pythons random module
* - Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
+ * - Mathutils.OrthoProjectionMatrix(plane, size, axis) --> Mathutils.OrthoProjectionMatrix(axis, size); merge axis & plane args
+ * - Mathutils.ShearMatrix(plane, factor, size) --> Mathutils.ShearMatrix(plane, size, factor); swap size & factor args, match other constructors.
* - Matrix.scalePart --> Matrix.scale_part
* - Matrix.translationPart --> Matrix.translation_part
* - Matrix.rotationPart --> Matrix.rotation_part
+ * - mathutils.Matrix.Shear(plane, fac, size), now takes a pair of floats for 3x3 or 4x4 shear factor.
* - toMatrix --> to_matrix
* - toEuler --> to_euler
* - toQuat --> to_quat
* - Vector.toTrackQuat --> Vector.to_track_quat
+ * - Vector.rotate(axis, angle) --> rotate(other), where other can be Euler/Quaternion/Matrix.
* - Quaternion * Quaternion --> cross product (not dot product)
- *
+ * - Euler.rotate(angle, axis) --> Euler.rotate_axis(axis, angle)
+ * - Euler.unique() *removed*, not a standard function only toggled different rotations.
+ * - Matrix.rotation_part() -> to_3x3()
+ * - Matrix.scale_part() -> to_scale()
+ * - Matrix.translation_part() -> to_translation()
+ * - Matrix.resize4x4() -> resize_4x4()
+ * - Euler.to_quat() -> to_quaternion()
+ * - Matrix.to_quat() -> to_quaternion()
+ * resizing nolonger returns the resized value.
+ * - Vector.resize2D -> resize_2d
+ * - Vector.resize3D -> resize_3d
+ * - Vector.resize4D -> resize_4d
+ * added new functions.
+ * - Vector.to_2d()
+ * - Vector.to_3d()
+ * - Vector.to_4d()
* moved into class functions.
* - Mathutils.RotationMatrix -> mathutils.Matrix.Rotation
* - Mathutils.ScaleMatrix -> mathutils.Matrix.Scale
@@ -54,20 +73,35 @@
* - Mathutils.OrthoProjectionMatrix -> mathutils.Matrix.OrthoProjection
*
* Moved to Geometry module: Intersect, TriangleArea, TriangleNormal, QuadNormal, LineIntersect
+ * - geometry.Intersect -> intersect_ray_tri
+ * - geometry.ClosestPointOnLine -> intersect_point_line
+ * - geometry.PointInTriangle2D -> intersect_point_tri_2d
+ * - geometry.PointInQuad2D -> intersect_point_quad_2d
+ * - geometry.LineIntersect -> intersect_line_line
+ * - geometry.LineIntersect2D -> intersect_line_line_2d
+ * - geometry.BezierInterp -> interpolate_bezier
+ * - geometry.TriangleArea -> area_tri
+ * - geometry.QuadNormal, TriangleNormal -> normal
+ * - geometry.PolyFill -> tesselate_polygon
+ * - geometry.BoxPack2D -> box_pack_2d
+ * - geometry.BarycentricTransform -> barycentric_transform
*/
#include "mathutils.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+
//-------------------------DOC STRINGS ---------------------------
static char M_Mathutils_doc[] =
-"This module provides access to matrices, eulers, quaternions and vectors.";
-
-/* helper functionm returns length of the 'value', -1 on error */
-int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix)
+"This module provides access to matrices, eulers, quaternions and vectors."
+;
+static int mathutils_array_parse_fast(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix)
{
PyObject *value_fast= NULL;
+ PyObject *item;
int i, size;
@@ -89,8 +123,8 @@ int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *
i= size;
do {
i--;
- if(((array[i]= PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value_fast, i))) == -1.0) && PyErr_Occurred()) {
- PyErr_Format(PyExc_ValueError, "%.200s: sequence index %d is not a float", error_prefix, i);
+ if(((array[i]= PyFloat_AsDouble((item= PySequence_Fast_GET_ITEM(value_fast, i)))) == -1.0) && PyErr_Occurred()) {
+ PyErr_Format(PyExc_ValueError, "%.200s: sequence index %d expected a number, found '%.200s' type, ", error_prefix, i, Py_TYPE(item)->tp_name);
Py_DECREF(value_fast);
return -1;
}
@@ -100,6 +134,80 @@ int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *
return size;
}
+/* helper functionm returns length of the 'value', -1 on error */
+int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix)
+{
+#if 1 /* approx 6x speedup for mathutils types */
+ int size;
+
+ if( (VectorObject_Check(value) && (size= ((VectorObject *)value)->size)) ||
+ (EulerObject_Check(value) && (size= 3)) ||
+ (QuaternionObject_Check(value) && (size= 4)) ||
+ (ColorObject_Check(value) && (size= 3))
+ ) {
+ if(!BaseMath_ReadCallback((BaseMathObject *)value)) {
+ return -1;
+ }
+
+ if(size > array_max || size < array_min) {
+ if (array_max == array_min) PyErr_Format(PyExc_ValueError, "%.200s: sequence size is %d, expected %d", error_prefix, size, array_max);
+ else PyErr_Format(PyExc_ValueError, "%.200s: sequence size is %d, expected [%d - %d]", error_prefix, size, array_min, array_max);
+ return -1;
+ }
+
+ memcpy(array, ((BaseMathObject *)value)->data, size * sizeof(float));
+ return size;
+ }
+ else
+#endif
+ {
+ return mathutils_array_parse_fast(array, array_min, array_max, value, error_prefix);
+ }
+}
+
+int mathutils_any_to_rotmat(float rmat[3][3], PyObject *value, const char *error_prefix)
+{
+ if(EulerObject_Check(value)) {
+ if(!BaseMath_ReadCallback((BaseMathObject *)value)) {
+ return -1;
+ }
+ else {
+ eulO_to_mat3(rmat, ((EulerObject *)value)->eul, ((EulerObject *)value)->order);
+ return 0;
+ }
+ }
+ else if (QuaternionObject_Check(value)) {
+ if(!BaseMath_ReadCallback((BaseMathObject *)value)) {
+ return -1;
+ }
+ else {
+ float tquat[4];
+ normalize_qt_qt(tquat, ((QuaternionObject *)value)->quat);
+ quat_to_mat3(rmat, tquat);
+ return 0;
+ }
+ }
+ else if (MatrixObject_Check(value)) {
+ if(!BaseMath_ReadCallback((BaseMathObject *)value)) {
+ return -1;
+ }
+ else if(((MatrixObject *)value)->col_size < 3 || ((MatrixObject *)value)->row_size < 3) {
+ PyErr_Format(PyExc_ValueError, "%.200s: matrix must have minimum 3x3 dimensions", error_prefix);
+ return -1;
+ }
+ else {
+ matrix_as_3x3(rmat, (MatrixObject *)value);
+ normalize_m3(rmat);
+ return 0;
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError, "%.200s: expected a Euler, Quaternion or Matrix type, found %.200s", error_prefix, Py_TYPE(value)->tp_name);
+ return -1;
+ }
+}
+
+
//----------------------------------MATRIX FUNCTIONS--------------------
@@ -202,7 +310,7 @@ int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index)
/* BaseMathObject generic functions for all mathutils types */
char BaseMathObject_Owner_doc[] = "The item this is wrapping or None (readonly).";
-PyObject *BaseMathObject_getOwner( BaseMathObject * self, void *type )
+PyObject *BaseMathObject_getOwner(BaseMathObject *self, void *UNUSED(closure))
{
PyObject *ret= self->cb_user ? self->cb_user : Py_None;
Py_INCREF(ret);
@@ -210,7 +318,7 @@ PyObject *BaseMathObject_getOwner( BaseMathObject * self, void *type )
}
char BaseMathObject_Wrapped_doc[] = "True when this object wraps external data (readonly).\n\n:type: boolean";
-PyObject *BaseMathObject_getWrapped( BaseMathObject *self, void *type )
+PyObject *BaseMathObject_getWrapped(BaseMathObject *self, void *UNUSED(closure))
{
return PyBool_FromLong((self->wrapped == Py_WRAP) ? 1:0);
}
@@ -242,10 +350,11 @@ static struct PyModuleDef M_Mathutils_module_def = {
0, /* m_free */
};
-PyObject *Mathutils_Init(void)
+PyMODINIT_FUNC BPyInit_mathutils(void)
{
PyObject *submodule;
-
+ PyObject *item;
+
if( PyType_Ready( &vector_Type ) < 0 )
return NULL;
if( PyType_Ready( &matrix_Type ) < 0 )
@@ -258,7 +367,6 @@ PyObject *Mathutils_Init(void)
return NULL;
submodule = PyModule_Create(&M_Mathutils_module_def);
- PyDict_SetItemString(PyImport_GetModuleDict(), M_Mathutils_module_def.m_name, submodule);
/* each type has its own new() function */
PyModule_AddObject( submodule, "Vector", (PyObject *)&vector_Type );
@@ -267,7 +375,15 @@ PyObject *Mathutils_Init(void)
PyModule_AddObject( submodule, "Quaternion", (PyObject *)&quaternion_Type );
PyModule_AddObject( submodule, "Color", (PyObject *)&color_Type );
+ /* submodule */
+ PyModule_AddObject( submodule, "geometry", (item=BPyInit_mathutils_geometry()));
+ /* XXX, python doesnt do imports with this usefully yet
+ * 'from mathutils.geometry import PolyFill'
+ * ...fails without this. */
+ PyDict_SetItemString(PyThreadState_GET()->interp->modules, "mathutils.geometry", item);
+ Py_INCREF(item);
+
mathutils_matrix_vector_cb_index= Mathutils_RegisterCallback(&mathutils_matrix_vector_cb);
- return (submodule);
+ return submodule;
}
diff --git a/source/blender/python/generic/mathutils.h b/source/blender/python/generic/mathutils.h
index 85fbe3225ba..07342f8144b 100644
--- a/source/blender/python/generic/mathutils.h
+++ b/source/blender/python/generic/mathutils.h
@@ -28,8 +28,8 @@
*/
//Include this file for access to vector, quat, matrix, euler, etc...
-#ifndef EXPP_Mathutils_H
-#define EXPP_Mathutils_H
+#ifndef MATHUTILS_H
+#define MATHUTILS_H
#include <Python.h>
@@ -55,20 +55,17 @@ typedef struct {
#include "mathutils_quat.h"
#include "mathutils_euler.h"
#include "mathutils_color.h"
+#include "mathutils_geometry.h"
PyObject *BaseMathObject_getOwner( BaseMathObject * self, void * );
PyObject *BaseMathObject_getWrapped( BaseMathObject *self, void * );
void BaseMathObject_dealloc(BaseMathObject * self);
-PyObject *Mathutils_Init(void);
-PyObject *Noise_Init(void); /* lazy, saves having own header */
+PyMODINIT_FUNC BPyInit_mathutils(void);
int EXPP_FloatsAreEqual(float A, float B, int floatSteps);
int EXPP_VectorsAreEqual(float *vecA, float *vecB, int size, int floatSteps);
-
-#define Py_PI 3.14159265358979323846
-
#define Py_NEW 1
#define Py_WRAP 2
@@ -103,5 +100,6 @@ int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index);
/* utility func */
int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix);
+int mathutils_any_to_rotmat(float rmat[3][3], PyObject *value, const char *error_prefix);
-#endif /* EXPP_Mathutils_H */
+#endif /* MATHUTILS_H */
diff --git a/source/blender/python/generic/mathutils_color.c b/source/blender/python/generic/mathutils_color.c
index 57d2838238c..af4742e74c6 100644
--- a/source/blender/python/generic/mathutils_color.c
+++ b/source/blender/python/generic/mathutils_color.c
@@ -25,16 +25,23 @@
#include "mathutils.h"
#include "BLI_math.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
+
+
#define COLOR_SIZE 3
//----------------------------------mathutils.Color() -------------------
//makes a new color for you to play with
-static PyObject *Color_new(PyTypeObject * type, PyObject * args, PyObject * kwargs)
+static PyObject *Color_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
float col[3]= {0.0f, 0.0f, 0.0f};
+ if(kwds && PyDict_Size(kwds)) {
+ PyErr_SetString(PyExc_TypeError, "mathutils.Color(): takes no keyword args");
+ return NULL;
+ }
+
switch(PyTuple_GET_SIZE(args)) {
case 0:
break;
@@ -81,9 +88,9 @@ static char Color_copy_doc[] =
" :return: A copy of the color.\n"
" :rtype: :class:`Color`\n"
"\n"
-" .. note:: use this to get a copy of a wrapped color with no reference to the original data.\n";
-
-static PyObject *Color_copy(ColorObject * self, PyObject *args)
+" .. note:: use this to get a copy of a wrapped color with no reference to the original data.\n"
+;
+static PyObject *Color_copy(ColorObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
@@ -111,54 +118,46 @@ static PyObject *Color_repr(ColorObject * self)
//------------------------tp_richcmpr
//returns -1 execption, 0 false, 1 true
-static PyObject* Color_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type)
+static PyObject* Color_richcmpr(PyObject *a, PyObject *b, int op)
{
- ColorObject *colA = NULL, *colB = NULL;
- int result = 0;
+ PyObject *res;
+ int ok= -1; /* zero is true */
- if(ColorObject_Check(objectA)) {
- colA = (ColorObject*)objectA;
- if(!BaseMath_ReadCallback(colA))
- return NULL;
- }
- if(ColorObject_Check(objectB)) {
- colB = (ColorObject*)objectB;
- if(!BaseMath_ReadCallback(colB))
+ if (ColorObject_Check(a) && ColorObject_Check(b)) {
+ ColorObject *colA= (ColorObject*)a;
+ ColorObject *colB= (ColorObject*)b;
+
+ if(!BaseMath_ReadCallback(colA) || !BaseMath_ReadCallback(colB))
return NULL;
- }
- if (!colA || !colB){
- if (comparison_type == Py_NE){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
- }
+ ok= EXPP_VectorsAreEqual(colA->col, colB->col, COLOR_SIZE, 1) ? 0 : -1;
}
- colA = (ColorObject*)objectA;
- colB = (ColorObject*)objectB;
-
- switch (comparison_type){
- case Py_EQ:
- result = EXPP_VectorsAreEqual(colA->col, colB->col, COLOR_SIZE, 1);
- break;
- case Py_NE:
- result = !EXPP_VectorsAreEqual(colA->col, colB->col, COLOR_SIZE, 1);
- break;
- default:
- printf("The result of the comparison could not be evaluated");
- break;
- }
- if (result == 1){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
+
+ switch (op) {
+ case Py_NE:
+ ok = !ok; /* pass through */
+ case Py_EQ:
+ res = ok ? Py_False : Py_True;
+ break;
+
+ case Py_LT:
+ case Py_LE:
+ case Py_GT:
+ case Py_GE:
+ res = Py_NotImplemented;
+ break;
+ default:
+ PyErr_BadArgument();
+ return NULL;
}
+
+ return Py_INCREF(res), res;
}
//---------------------SEQUENCE PROTOCOLS------------------------
//----------------------------len(object)------------------------
//sequence length
-static int Color_len(ColorObject * self)
+static int Color_len(ColorObject *UNUSED(self))
{
return COLOR_SIZE;
}
@@ -193,7 +192,7 @@ static int Color_ass_item(ColorObject * self, int i, PyObject * value)
if(i<0) i= COLOR_SIZE-i;
if(i < 0 || i >= COLOR_SIZE){
- PyErr_SetString(PyExc_IndexError, "color[attribute] = x: array assignment index out of range\n");
+ PyErr_SetString(PyExc_IndexError, "color[attribute] = x: array assignment index out of range");
return -1;
}
@@ -208,7 +207,7 @@ static int Color_ass_item(ColorObject * self, int i, PyObject * value)
//sequence slice (get)
static PyObject *Color_slice(ColorObject * self, int begin, int end)
{
- PyObject *list = NULL;
+ PyObject *tuple;
int count;
if(!BaseMath_ReadCallback(self))
@@ -217,15 +216,14 @@ static PyObject *Color_slice(ColorObject * self, int begin, int end)
CLAMP(begin, 0, COLOR_SIZE);
if (end<0) end= (COLOR_SIZE + 1) + end;
CLAMP(end, 0, COLOR_SIZE);
- begin = MIN2(begin,end);
+ begin= MIN2(begin, end);
- list = PyList_New(end - begin);
- for(count = begin; count < end; count++) {
- PyList_SetItem(list, count - begin,
- PyFloat_FromDouble(self->col[count]));
+ tuple= PyTuple_New(end - begin);
+ for(count= begin; count < end; count++) {
+ PyTuple_SET_ITEM(tuple, count - begin, PyFloat_FromDouble(self->col[count]));
}
- return list;
+ return tuple;
}
//----------------------------object[z:y]------------------------
//sequence slice (set)
@@ -253,7 +251,7 @@ static int Color_ass_slice(ColorObject * self, int begin, int end, PyObject * se
for(i= 0; i < COLOR_SIZE; i++)
self->col[begin + i] = col[i];
- BaseMath_WriteCallback(self);
+ (void)BaseMath_WriteCallback(self);
return 0;
}
@@ -270,11 +268,11 @@ static PyObject *Color_subscript(ColorObject *self, PyObject *item)
} else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)item, COLOR_SIZE, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, COLOR_SIZE, &start, &stop, &step, &slicelength) < 0)
return NULL;
if (slicelength <= 0) {
- return PyList_New(0);
+ return PyTuple_New(0);
}
else if (step == 1) {
return Color_slice(self, start, stop);
@@ -285,9 +283,7 @@ static PyObject *Color_subscript(ColorObject *self, PyObject *item)
}
}
else {
- PyErr_Format(PyExc_TypeError,
- "color indices must be integers, not %.200s",
- item->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "color indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
return NULL;
}
}
@@ -305,7 +301,7 @@ static int Color_ass_subscript(ColorObject *self, PyObject *item, PyObject *valu
else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)item, COLOR_SIZE, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, COLOR_SIZE, &start, &stop, &step, &slicelength) < 0)
return -1;
if (step == 1)
@@ -316,9 +312,7 @@ static int Color_ass_subscript(ColorObject *self, PyObject *item, PyObject *valu
}
}
else {
- PyErr_Format(PyExc_TypeError,
- "color indices must be integers, not %.200s",
- item->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "color indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
return -1;
}
}
@@ -329,9 +323,9 @@ static PySequenceMethods Color_SeqMethods = {
(binaryfunc) NULL, /* sq_concat */
(ssizeargfunc) NULL, /* sq_repeat */
(ssizeargfunc) Color_item, /* sq_item */
- (ssizessizeargfunc) NULL, /* sq_slice, deprecated */
+ NULL, /* sq_slice, deprecated */
(ssizeobjargproc) Color_ass_item, /* sq_ass_item */
- (ssizessizeobjargproc) NULL, /* sq_ass_slice, deprecated */
+ NULL, /* sq_ass_slice, deprecated */
(objobjproc) NULL, /* sq_contains */
(binaryfunc) NULL, /* sq_inplace_concat */
(ssizeargfunc) NULL, /* sq_inplace_repeat */
@@ -394,7 +388,7 @@ static int Color_setChannelHSV(ColorObject * self, PyObject * value, void * type
}
/* color channel (HSV), color.h/s/v */
-static PyObject *Color_getHSV(ColorObject * self, void *type)
+static PyObject *Color_getHSV(ColorObject * self, void *UNUSED(closure))
{
float hsv[3];
PyObject *ret;
@@ -411,7 +405,7 @@ static PyObject *Color_getHSV(ColorObject * self, void *type)
return ret;
}
-static int Color_setHSV(ColorObject * self, PyObject * value, void * type)
+static int Color_setHSV(ColorObject * self, PyObject * value, void *UNUSED(closure))
{
float hsv[3];
@@ -434,36 +428,36 @@ static int Color_setHSV(ColorObject * self, PyObject * value, void * type)
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Color_getseters[] = {
- {"r", (getter)Color_getChannel, (setter)Color_setChannel, "Red color channel.\n\n:type: float", (void *)0},
- {"g", (getter)Color_getChannel, (setter)Color_setChannel, "Green color channel.\n\n:type: float", (void *)1},
- {"b", (getter)Color_getChannel, (setter)Color_setChannel, "Blue color channel.\n\n:type: float", (void *)2},
+ {(char *)"r", (getter)Color_getChannel, (setter)Color_setChannel, (char *)"Red color channel.\n\n:type: float", (void *)0},
+ {(char *)"g", (getter)Color_getChannel, (setter)Color_setChannel, (char *)"Green color channel.\n\n:type: float", (void *)1},
+ {(char *)"b", (getter)Color_getChannel, (setter)Color_setChannel, (char *)"Blue color channel.\n\n:type: float", (void *)2},
- {"h", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, "HSV Hue component in [0, 1].\n\n:type: float", (void *)0},
- {"s", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, "HSV Saturation component in [0, 1].\n\n:type: float", (void *)1},
- {"v", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, "HSV Value component in [0, 1].\n\n:type: float", (void *)2},
+ {(char *)"h", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, (char *)"HSV Hue component in [0, 1].\n\n:type: float", (void *)0},
+ {(char *)"s", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, (char *)"HSV Saturation component in [0, 1].\n\n:type: float", (void *)1},
+ {(char *)"v", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, (char *)"HSV Value component in [0, 1].\n\n:type: float", (void *)2},
- {"hsv", (getter)Color_getHSV, (setter)Color_setHSV, "HSV Values in [0, 1].\n\n:type: float triplet", (void *)0},
+ {(char *)"hsv", (getter)Color_getHSV, (setter)Color_setHSV, (char *)"HSV Values in [0, 1].\n\n:type: float triplet", (void *)0},
- {"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
- {"owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
+ {(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
+ {(char *)"owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
//-----------------------METHOD DEFINITIONS ----------------------
static struct PyMethodDef Color_methods[] = {
- {"__copy__", (PyCFunction) Color_copy, METH_VARARGS, Color_copy_doc},
- {"copy", (PyCFunction) Color_copy, METH_VARARGS, Color_copy_doc},
+ {"__copy__", (PyCFunction) Color_copy, METH_NOARGS, Color_copy_doc},
+ {"copy", (PyCFunction) Color_copy, METH_NOARGS, Color_copy_doc},
{NULL, NULL, 0, NULL}
};
//------------------PY_OBECT DEFINITION--------------------------
static char color_doc[] =
-"This object gives access to Colors in Blender.";
-
+"This object gives access to Colors in Blender."
+;
PyTypeObject color_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "color", //tp_name
+ "mathutils.Color", //tp_name
sizeof(ColorObject), //tp_basicsize
0, //tp_itemsize
(destructor)BaseMathObject_dealloc, //tp_dealloc
diff --git a/source/blender/python/generic/mathutils_color.h b/source/blender/python/generic/mathutils_color.h
index 02b27d86817..f3f185b2991 100644
--- a/source/blender/python/generic/mathutils_color.h
+++ b/source/blender/python/generic/mathutils_color.h
@@ -28,8 +28,8 @@
*
*/
-#ifndef EXPP_color_h
-#define EXPP_color_h
+#ifndef MATHUTILS_COLOR_H
+#define MATHUTILS_COLOR_H
#include <Python.h>
@@ -49,4 +49,4 @@ blender (stored in blend_data). This is an either/or struct not both*/
PyObject *newColorObject( float *col, int type, PyTypeObject *base_type);
PyObject *newColorObject_cb(PyObject *cb_user, int cb_type, int cb_subtype);
-#endif /* EXPP_color_h */
+#endif /* MATHUTILS_COLOR_H */
diff --git a/source/blender/python/generic/mathutils_euler.c b/source/blender/python/generic/mathutils_euler.c
index 84845002ce8..8792b154ca6 100644
--- a/source/blender/python/generic/mathutils_euler.c
+++ b/source/blender/python/generic/mathutils_euler.c
@@ -20,7 +20,7 @@
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
- *
+ *
* Contributor(s): Joseph Gilbert
*
* ***** END GPL LICENSE BLOCK *****
@@ -29,7 +29,9 @@
#include "mathutils.h"
#include "BLI_math.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
+
+
#ifndef int32_t
#include "BLO_sys_types.h"
@@ -39,14 +41,19 @@
//----------------------------------mathutils.Euler() -------------------
//makes a new euler for you to play with
-static PyObject *Euler_new(PyTypeObject * type, PyObject * args, PyObject * kwargs)
+static PyObject *Euler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject *seq= NULL;
- char *order_str= NULL;
+ const char *order_str= NULL;
float eul[EULER_SIZE]= {0.0f, 0.0f, 0.0f};
short order= EULER_ORDER_XYZ;
+ if(kwds && PyDict_Size(kwds)) {
+ PyErr_SetString(PyExc_TypeError, "mathutils.Euler(): takes no keyword args");
+ return NULL;
+ }
+
if(!PyArg_ParseTuple(args, "|Os:mathutils.Euler", &seq, &order_str))
return NULL;
@@ -62,7 +69,14 @@ static PyObject *Euler_new(PyTypeObject * type, PyObject * args, PyObject * kwar
return NULL;
break;
}
- return newEulerObject(eul, order, Py_NEW, NULL);
+ return newEulerObject(eul, order, Py_NEW, type);
+}
+
+/* internal use, assuem read callback is done */
+static const char *euler_order_str(EulerObject *self)
+{
+ static const char order[][4] = {"XYZ", "XZY", "YXZ", "YZX", "ZXY", "ZYX"};
+ return order[self->order-EULER_ORDER_XYZ];
}
short euler_order_from_string(const char *str, const char *error_prefix)
@@ -107,146 +121,77 @@ static PyObject *Euler_ToTupleExt(EulerObject *self, int ndigits)
//-----------------------------METHODS----------------------------
//return a quaternion representation of the euler
-static char Euler_ToQuat_doc[] =
-".. method:: to_quat()\n"
+static char Euler_to_quaternion_doc[] =
+".. method:: to_quaternion()\n"
"\n"
" Return a quaternion representation of the euler.\n"
"\n"
" :return: Quaternion representation of the euler.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Euler_ToQuat(EulerObject * self)
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Euler_to_quaternion(EulerObject * self)
{
float quat[4];
if(!BaseMath_ReadCallback(self))
return NULL;
- if(self->order==EULER_ORDER_XYZ) eul_to_quat(quat, self->eul);
- else eulO_to_quat(quat, self->eul, self->order);
+ eulO_to_quat(quat, self->eul, self->order);
return newQuaternionObject(quat, Py_NEW, NULL);
}
//return a matrix representation of the euler
-static char Euler_ToMatrix_doc[] =
+static char Euler_to_matrix_doc[] =
".. method:: to_matrix()\n"
"\n"
" Return a matrix representation of the euler.\n"
"\n"
" :return: A 3x3 roation matrix representation of the euler.\n"
-" :rtype: :class:`Matrix`\n";
-
-static PyObject *Euler_ToMatrix(EulerObject * self)
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *Euler_to_matrix(EulerObject * self)
{
- float mat[9] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
+ float mat[9];
if(!BaseMath_ReadCallback(self))
return NULL;
- if(self->order==EULER_ORDER_XYZ) eul_to_mat3((float (*)[3])mat, self->eul);
- else eulO_to_mat3((float (*)[3])mat, self->eul, self->order);
+ eulO_to_mat3((float (*)[3])mat, self->eul, self->order);
return newMatrixObject(mat, 3, 3 , Py_NEW, NULL);
}
-//sets the x,y,z values to a unique euler rotation
-// TODO, check if this works with rotation order!!!
-static char Euler_Unique_doc[] =
-".. method:: unique()\n"
-"\n"
-" Calculate a unique rotation for this euler. Avoids gimble lock.\n"
-"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Euler`\n";
-
-static PyObject *Euler_Unique(EulerObject * self)
-{
-#define PI_2 (Py_PI * 2.0)
-#define PI_HALF (Py_PI / 2.0)
-#define PI_INV (1.0 / Py_PI)
-
- double heading, pitch, bank;
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- heading = self->eul[0];
- pitch = self->eul[1];
- bank = self->eul[2];
-
- //wrap heading in +180 / -180
- pitch += Py_PI;
- pitch -= floor(pitch * PI_INV) * PI_2;
- pitch -= Py_PI;
-
-
- if(pitch < -PI_HALF) {
- pitch = -Py_PI - pitch;
- heading += Py_PI;
- bank += Py_PI;
- } else if(pitch > PI_HALF) {
- pitch = Py_PI - pitch;
- heading += Py_PI;
- bank += Py_PI;
- }
- //gimbal lock test
- if(fabs(pitch) > PI_HALF - 1e-4) {
- heading += bank;
- bank = 0.0f;
- } else {
- bank += Py_PI;
- bank -= (floor(bank * PI_INV)) * PI_2;
- bank -= Py_PI;
- }
-
- heading += Py_PI;
- heading -= (floor(heading * PI_INV)) * PI_2;
- heading -= Py_PI;
-
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject *)self;
-}
-
//sets the euler to 0,0,0
-static char Euler_Zero_doc[] =
+static char Euler_zero_doc[] =
".. method:: zero()\n"
"\n"
" Set all values to zero.\n"
-"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Euler`\n";
-
-static PyObject *Euler_Zero(EulerObject * self)
+;
+static PyObject *Euler_zero(EulerObject * self)
{
- self->eul[0] = 0.0;
- self->eul[1] = 0.0;
- self->eul[2] = 0.0;
+ zero_v3(self->eul);
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject *)self;
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
-static char Euler_Rotate_doc[] =
-".. method:: rotate(angle, axis)\n"
+static char Euler_rotate_axis_doc[] =
+".. method:: rotate_axis(axis, angle)\n"
"\n"
" Rotates the euler a certain amount and returning a unique euler rotation (no 720 degree pitches).\n"
"\n"
-" :arg angle: angle in radians.\n"
-" :type angle: float\n"
" :arg axis: single character in ['X, 'Y', 'Z'].\n"
" :type axis: string\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Euler`";
-
-static PyObject *Euler_Rotate(EulerObject * self, PyObject *args)
+" :arg angle: angle in radians.\n"
+" :type angle: float\n"
+;
+static PyObject *Euler_rotate_axis(EulerObject * self, PyObject *args)
{
float angle = 0.0f;
- char *axis;
+ const char *axis;
- if(!PyArg_ParseTuple(args, "fs:rotate", &angle, &axis)){
+ if(!PyArg_ParseTuple(args, "sf:rotate", &axis, &angle)){
PyErr_SetString(PyExc_TypeError, "euler.rotate(): expected angle (float) and axis (x,y,z)");
return NULL;
}
@@ -258,46 +203,66 @@ static PyObject *Euler_Rotate(EulerObject * self, PyObject *args)
if(!BaseMath_ReadCallback(self))
return NULL;
- if(self->order == EULER_ORDER_XYZ) rotate_eul(self->eul, *axis, angle);
- else rotate_eulO(self->eul, self->order, *axis, angle);
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject *)self;
+ rotate_eulO(self->eul, self->order, *axis, angle);
+
+ (void)BaseMath_WriteCallback(self);
+
+ Py_RETURN_NONE;
}
-static char Euler_MakeCompatible_doc[] =
+static char Euler_rotate_doc[] =
+".. method:: rotate(other)\n"
+"\n"
+" Rotates the euler a by another mathutils value.\n"
+"\n"
+" :arg other: rotation component of mathutils value\n"
+" :type other: :class:`Euler`, :class:`Quaternion` or :class:`Matrix`\n"
+;
+static PyObject *Euler_rotate(EulerObject * self, PyObject *value)
+{
+ float self_rmat[3][3], other_rmat[3][3], rmat[3][3];
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(mathutils_any_to_rotmat(other_rmat, value, "euler.rotate(value)") == -1)
+ return NULL;
+
+ eulO_to_mat3(self_rmat, self->eul, self->order);
+ mul_m3_m3m3(rmat, self_rmat, other_rmat);
+
+ mat3_to_compatible_eulO(self->eul, self->eul, self->order, rmat);
+
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
+}
+
+static char Euler_make_compatible_doc[] =
".. method:: make_compatible(other)\n"
"\n"
" Make this euler compatible with another, so interpolating between them works as intended.\n"
"\n"
" :arg other: make compatible with this rotation.\n"
" :type other: :class:`Euler`\n"
-" :return: an instance of itself.\n"
-" :rtype: :class:`Euler`\n"
"\n"
-" .. note:: the order of eulers must match or an exception is raised.\n";
-
-static PyObject *Euler_MakeCompatible(EulerObject * self, EulerObject *value)
+" .. note:: the rotation order is not taken into account for this function.\n"
+;
+static PyObject *Euler_make_compatible(EulerObject * self, PyObject *value)
{
- if(!EulerObject_Check(value)) {
- PyErr_SetString(PyExc_TypeError, "euler.make_compatible(euler): expected a single euler argument.");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
+ float teul[EULER_SIZE];
+
+ if(!BaseMath_ReadCallback(self))
return NULL;
- if(self->order != value->order) {
- PyErr_SetString(PyExc_ValueError, "euler.make_compatible(euler): rotation orders don't match\n");
+ if(mathutils_array_parse(teul, EULER_SIZE, EULER_SIZE, value, "euler.make_compatible(other), invalid 'other' arg") == -1)
return NULL;
- }
- compatible_eul(self->eul, value->eul);
+ compatible_eul(self->eul, teul);
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject *)self;
+ (void)BaseMath_WriteCallback(self);
+
+ Py_RETURN_NONE;
}
//----------------------------Euler.rotate()-----------------------
@@ -311,9 +276,9 @@ static char Euler_copy_doc[] =
" :return: A copy of the euler.\n"
" :rtype: :class:`Euler`\n"
"\n"
-" .. note:: use this to get a copy of a wrapped euler with no reference to the original data.\n";
-
-static PyObject *Euler_copy(EulerObject * self, PyObject *args)
+" .. note:: use this to get a copy of a wrapped euler with no reference to the original data.\n"
+;
+static PyObject *Euler_copy(EulerObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
@@ -327,68 +292,58 @@ static PyObject *Euler_copy(EulerObject * self, PyObject *args)
static PyObject *Euler_repr(EulerObject * self)
{
PyObject *ret, *tuple;
-
+
if(!BaseMath_ReadCallback(self))
return NULL;
tuple= Euler_ToTupleExt(self, -1);
- ret= PyUnicode_FromFormat("Euler(%R)", tuple);
+ ret= PyUnicode_FromFormat("Euler(%R, '%s')", tuple, euler_order_str(self));
Py_DECREF(tuple);
return ret;
}
-//------------------------tp_richcmpr
-//returns -1 execption, 0 false, 1 true
-static PyObject* Euler_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type)
+static PyObject* Euler_richcmpr(PyObject *a, PyObject *b, int op)
{
- EulerObject *eulA = NULL, *eulB = NULL;
- int result = 0;
+ PyObject *res;
+ int ok= -1; /* zero is true */
- if(EulerObject_Check(objectA)) {
- eulA = (EulerObject*)objectA;
- if(!BaseMath_ReadCallback(eulA))
- return NULL;
- }
- if(EulerObject_Check(objectB)) {
- eulB = (EulerObject*)objectB;
- if(!BaseMath_ReadCallback(eulB))
+ if (EulerObject_Check(a) && EulerObject_Check(b)) {
+ EulerObject *eulA= (EulerObject*)a;
+ EulerObject *eulB= (EulerObject*)b;
+
+ if(!BaseMath_ReadCallback(eulA) || !BaseMath_ReadCallback(eulB))
return NULL;
- }
- if (!eulA || !eulB){
- if (comparison_type == Py_NE){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
- }
- }
- eulA = (EulerObject*)objectA;
- eulB = (EulerObject*)objectB;
-
- switch (comparison_type){
- case Py_EQ:
- result = EXPP_VectorsAreEqual(eulA->eul, eulB->eul, EULER_SIZE, 1);
- break;
- case Py_NE:
- result = !EXPP_VectorsAreEqual(eulA->eul, eulB->eul, EULER_SIZE, 1);
- break;
- default:
- printf("The result of the comparison could not be evaluated");
- break;
+ ok= ((eulA->order == eulB->order) && EXPP_VectorsAreEqual(eulA->eul, eulB->eul, EULER_SIZE, 1)) ? 0 : -1;
}
- if (result == 1){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
+
+ switch (op) {
+ case Py_NE:
+ ok = !ok; /* pass through */
+ case Py_EQ:
+ res = ok ? Py_False : Py_True;
+ break;
+
+ case Py_LT:
+ case Py_LE:
+ case Py_GT:
+ case Py_GE:
+ res = Py_NotImplemented;
+ break;
+ default:
+ PyErr_BadArgument();
+ return NULL;
}
+
+ return Py_INCREF(res), res;
}
//---------------------SEQUENCE PROTOCOLS------------------------
//----------------------------len(object)------------------------
//sequence length
-static int Euler_len(EulerObject * self)
+static int Euler_len(EulerObject *UNUSED(self))
{
return EULER_SIZE;
}
@@ -397,7 +352,7 @@ static int Euler_len(EulerObject * self)
static PyObject *Euler_item(EulerObject * self, int i)
{
if(i<0) i= EULER_SIZE-i;
-
+
if(i < 0 || i >= EULER_SIZE) {
PyErr_SetString(PyExc_IndexError, "euler[attribute]: array index out of range");
return NULL;
@@ -411,7 +366,7 @@ static PyObject *Euler_item(EulerObject * self, int i)
}
//----------------------------object[]-------------------------
//sequence accessor (set)
-static int Euler_ass_item(EulerObject * self, int i, PyObject * value)
+static int Euler_ass_item(EulerObject * self, int i, PyObject *value)
{
float f = PyFloat_AsDouble(value);
@@ -421,12 +376,12 @@ static int Euler_ass_item(EulerObject * self, int i, PyObject * value)
}
if(i<0) i= EULER_SIZE-i;
-
+
if(i < 0 || i >= EULER_SIZE){
- PyErr_SetString(PyExc_IndexError, "euler[attribute] = x: array assignment index out of range\n");
+ PyErr_SetString(PyExc_IndexError, "euler[attribute] = x: array assignment index out of range");
return -1;
}
-
+
self->eul[i] = f;
if(!BaseMath_WriteIndexCallback(self, i))
@@ -438,7 +393,7 @@ static int Euler_ass_item(EulerObject * self, int i, PyObject * value)
//sequence slice (get)
static PyObject *Euler_slice(EulerObject * self, int begin, int end)
{
- PyObject *list = NULL;
+ PyObject *tuple;
int count;
if(!BaseMath_ReadCallback(self))
@@ -447,15 +402,14 @@ static PyObject *Euler_slice(EulerObject * self, int begin, int end)
CLAMP(begin, 0, EULER_SIZE);
if (end<0) end= (EULER_SIZE + 1) + end;
CLAMP(end, 0, EULER_SIZE);
- begin = MIN2(begin,end);
+ begin= MIN2(begin, end);
- list = PyList_New(end - begin);
+ tuple= PyTuple_New(end - begin);
for(count = begin; count < end; count++) {
- PyList_SetItem(list, count - begin,
- PyFloat_FromDouble(self->eul[count]));
+ PyTuple_SET_ITEM(tuple, count - begin, PyFloat_FromDouble(self->eul[count]));
}
- return list;
+ return tuple;
}
//----------------------------object[z:y]------------------------
//sequence slice (set)
@@ -483,7 +437,7 @@ static int Euler_ass_slice(EulerObject * self, int begin, int end, PyObject * se
for(i= 0; i < EULER_SIZE; i++)
self->eul[begin + i] = eul[i];
- BaseMath_WriteCallback(self);
+ (void)BaseMath_WriteCallback(self);
return 0;
}
@@ -500,11 +454,11 @@ static PyObject *Euler_subscript(EulerObject *self, PyObject *item)
} else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)item, EULER_SIZE, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, EULER_SIZE, &start, &stop, &step, &slicelength) < 0)
return NULL;
if (slicelength <= 0) {
- return PyList_New(0);
+ return PyTuple_New(0);
}
else if (step == 1) {
return Euler_slice(self, start, stop);
@@ -515,9 +469,7 @@ static PyObject *Euler_subscript(EulerObject *self, PyObject *item)
}
}
else {
- PyErr_Format(PyExc_TypeError,
- "euler indices must be integers, not %.200s",
- item->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "euler indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
return NULL;
}
}
@@ -536,7 +488,7 @@ static int Euler_ass_subscript(EulerObject *self, PyObject *item, PyObject *valu
else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)item, EULER_SIZE, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, EULER_SIZE, &start, &stop, &step, &slicelength) < 0)
return -1;
if (step == 1)
@@ -547,9 +499,7 @@ static int Euler_ass_subscript(EulerObject *self, PyObject *item, PyObject *valu
}
}
else {
- PyErr_Format(PyExc_TypeError,
- "euler indices must be integers, not %.200s",
- item->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "euler indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
return -1;
}
}
@@ -577,37 +527,35 @@ static PyMappingMethods Euler_AsMapping = {
/*
* euler axis, euler.x/y/z
*/
-static PyObject *Euler_getAxis( EulerObject * self, void *type )
+static PyObject *Euler_getAxis(EulerObject *self, void *type )
{
return Euler_item(self, GET_INT_FROM_POINTER(type));
}
-static int Euler_setAxis( EulerObject * self, PyObject * value, void * type )
+static int Euler_setAxis(EulerObject *self, PyObject *value, void *type)
{
return Euler_ass_item(self, GET_INT_FROM_POINTER(type), value);
}
/* rotation order */
-static PyObject *Euler_getOrder(EulerObject *self, void *type)
+static PyObject *Euler_getOrder(EulerObject *self, void *UNUSED(closure))
{
- const char order[][4] = {"XYZ", "XZY", "YXZ", "YZX", "ZXY", "ZYX"};
-
if(!BaseMath_ReadCallback(self)) /* can read order too */
return NULL;
- return PyUnicode_FromString(order[self->order-EULER_ORDER_XYZ]);
+ return PyUnicode_FromString(euler_order_str(self));
}
-static int Euler_setOrder( EulerObject * self, PyObject * value, void * type )
+static int Euler_setOrder(EulerObject *self, PyObject *value, void *UNUSED(closure))
{
- char *order_str= _PyUnicode_AsString(value);
+ const char *order_str= _PyUnicode_AsString(value);
short order= euler_order_from_string(order_str, "euler.order");
if(order == -1)
return -1;
self->order= order;
- BaseMath_WriteCallback(self); /* order can be written back */
+ (void)BaseMath_WriteCallback(self); /* order can be written back */
return 0;
}
@@ -615,37 +563,37 @@ static int Euler_setOrder( EulerObject * self, PyObject * value, void * type )
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Euler_getseters[] = {
- {"x", (getter)Euler_getAxis, (setter)Euler_setAxis, "Euler X axis in radians.\n\n:type: float", (void *)0},
- {"y", (getter)Euler_getAxis, (setter)Euler_setAxis, "Euler Y axis in radians.\n\n:type: float", (void *)1},
- {"z", (getter)Euler_getAxis, (setter)Euler_setAxis, "Euler Z axis in radians.\n\n:type: float", (void *)2},
- {"order", (getter)Euler_getOrder, (setter)Euler_setOrder, "Euler rotation order.\n\n:type: string in ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX']", (void *)NULL},
+ {(char *)"x", (getter)Euler_getAxis, (setter)Euler_setAxis, (char *)"Euler X axis in radians.\n\n:type: float", (void *)0},
+ {(char *)"y", (getter)Euler_getAxis, (setter)Euler_setAxis, (char *)"Euler Y axis in radians.\n\n:type: float", (void *)1},
+ {(char *)"z", (getter)Euler_getAxis, (setter)Euler_setAxis, (char *)"Euler Z axis in radians.\n\n:type: float", (void *)2},
+ {(char *)"order", (getter)Euler_getOrder, (setter)Euler_setOrder, (char *)"Euler rotation order.\n\n:type: string in ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX']", (void *)NULL},
- {"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
- {"owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
+ {(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, (char *)BaseMathObject_Wrapped_doc, NULL},
+ {(char *)"owner", (getter)BaseMathObject_getOwner, (setter)NULL, (char *)BaseMathObject_Owner_doc, NULL},
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
//-----------------------METHOD DEFINITIONS ----------------------
static struct PyMethodDef Euler_methods[] = {
- {"zero", (PyCFunction) Euler_Zero, METH_NOARGS, Euler_Zero_doc},
- {"unique", (PyCFunction) Euler_Unique, METH_NOARGS, Euler_Unique_doc},
- {"to_matrix", (PyCFunction) Euler_ToMatrix, METH_NOARGS, Euler_ToMatrix_doc},
- {"to_quat", (PyCFunction) Euler_ToQuat, METH_NOARGS, Euler_ToQuat_doc},
- {"rotate", (PyCFunction) Euler_Rotate, METH_VARARGS, Euler_Rotate_doc},
- {"make_compatible", (PyCFunction) Euler_MakeCompatible, METH_O, Euler_MakeCompatible_doc},
- {"__copy__", (PyCFunction) Euler_copy, METH_VARARGS, Euler_copy_doc},
- {"copy", (PyCFunction) Euler_copy, METH_VARARGS, Euler_copy_doc},
+ {"zero", (PyCFunction) Euler_zero, METH_NOARGS, Euler_zero_doc},
+ {"to_matrix", (PyCFunction) Euler_to_matrix, METH_NOARGS, Euler_to_matrix_doc},
+ {"to_quaternion", (PyCFunction) Euler_to_quaternion, METH_NOARGS, Euler_to_quaternion_doc},
+ {"rotate_axis", (PyCFunction) Euler_rotate_axis, METH_VARARGS, Euler_rotate_axis_doc},
+ {"rotate", (PyCFunction) Euler_rotate, METH_O, Euler_rotate_doc},
+ {"make_compatible", (PyCFunction) Euler_make_compatible, METH_O, Euler_make_compatible_doc},
+ {"__copy__", (PyCFunction) Euler_copy, METH_NOARGS, Euler_copy_doc},
+ {"copy", (PyCFunction) Euler_copy, METH_NOARGS, Euler_copy_doc},
{NULL, NULL, 0, NULL}
};
//------------------PY_OBECT DEFINITION--------------------------
static char euler_doc[] =
-"This object gives access to Eulers in Blender.";
-
+"This object gives access to Eulers in Blender."
+;
PyTypeObject euler_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "euler", //tp_name
+ "mathutils.Euler", //tp_name
sizeof(EulerObject), //tp_basicsize
0, //tp_itemsize
(destructor)BaseMathObject_dealloc, //tp_dealloc
diff --git a/source/blender/python/generic/mathutils_euler.h b/source/blender/python/generic/mathutils_euler.h
index b8523c3b661..fc4e4ddb667 100644
--- a/source/blender/python/generic/mathutils_euler.h
+++ b/source/blender/python/generic/mathutils_euler.h
@@ -28,8 +28,8 @@
*
*/
-#ifndef EXPP_euler_h
-#define EXPP_euler_h
+#ifndef MATHUTILS_EULER_H
+#define MATHUTILS_EULER_H
#include <Python.h>
@@ -54,4 +54,4 @@ PyObject *newEulerObject_cb(PyObject *cb_user, short order, int cb_type, int cb_
short euler_order_from_string(const char *str, const char *error_prefix);
-#endif /* EXPP_euler_h */
+#endif /* MATHUTILS_EULER_H */
diff --git a/source/blender/python/generic/mathutils_geometry.c b/source/blender/python/generic/mathutils_geometry.c
new file mode 100644
index 00000000000..75f94752e6e
--- /dev/null
+++ b/source/blender/python/generic/mathutils_geometry.c
@@ -0,0 +1,880 @@
+/*
+ * $Id: mathutils_geometry.c 34380 2011-01-18 01:58:19Z campbellbarton $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * This is a new part of Blender.
+ *
+ * Contributor(s): Joseph Gilbert, Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "mathutils_geometry.h"
+
+/* Used for PolyFill */
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_boxpack2d.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_displist.h"
+
+#include "BKE_curve.h"
+
+#define SWAP_FLOAT(a,b,tmp) tmp=a; a=b; b=tmp
+#define eps 0.000001
+
+
+/*-------------------------DOC STRINGS ---------------------------*/
+static char M_Geometry_doc[]= "The Blender geometry module\n\n";
+
+//---------------------------------INTERSECTION FUNCTIONS--------------------
+
+static char M_Geometry_intersect_ray_tri_doc[] =
+".. function:: intersect_ray_tri(v1, v2, v3, ray, orig, clip=True)\n"
+"\n"
+" Returns the intersection between a ray and a triangle, if possible, returns None otherwise.\n"
+"\n"
+" :arg v1: Point1\n"
+" :type v1: :class:`mathutils.Vector`\n"
+" :arg v2: Point2\n"
+" :type v2: :class:`mathutils.Vector`\n"
+" :arg v3: Point3\n"
+" :type v3: :class:`mathutils.Vector`\n"
+" :arg ray: Direction of the projection\n"
+" :type ray: :class:`mathutils.Vector`\n"
+" :arg orig: Origin\n"
+" :type orig: :class:`mathutils.Vector`\n"
+" :arg clip: Clip by the ray length\n"
+" :type clip: boolean\n"
+" :return: The point of intersection or None if no intersection is found\n"
+" :rtype: :class:`mathutils.Vector` or None\n"
+;
+static PyObject *M_Geometry_intersect_ray_tri(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *ray, *ray_off, *vec1, *vec2, *vec3;
+ float dir[3], orig[3], v1[3], v2[3], v3[3], e1[3], e2[3], pvec[3], tvec[3], qvec[3];
+ float det, inv_det, u, v, t;
+ int clip= 1;
+
+ if(!PyArg_ParseTuple(args, "O!O!O!O!O!|i:intersect_ray_tri", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3, &vector_Type, &ray, &vector_Type, &ray_off , &clip)) {
+ return NULL;
+ }
+ if(vec1->size != 3 || vec2->size != 3 || vec3->size != 3 || ray->size != 3 || ray_off->size != 3) {
+ PyErr_SetString(PyExc_ValueError, "only 3D vectors for all parameters");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(ray) || !BaseMath_ReadCallback(ray_off))
+ return NULL;
+
+ VECCOPY(v1, vec1->vec);
+ VECCOPY(v2, vec2->vec);
+ VECCOPY(v3, vec3->vec);
+
+ VECCOPY(dir, ray->vec);
+ normalize_v3(dir);
+
+ VECCOPY(orig, ray_off->vec);
+
+ /* find vectors for two edges sharing v1 */
+ sub_v3_v3v3(e1, v2, v1);
+ sub_v3_v3v3(e2, v3, v1);
+
+ /* begin calculating determinant - also used to calculated U parameter */
+ cross_v3_v3v3(pvec, dir, e2);
+
+ /* if determinant is near zero, ray lies in plane of triangle */
+ det= dot_v3v3(e1, pvec);
+
+ if (det > -0.000001 && det < 0.000001) {
+ Py_RETURN_NONE;
+ }
+
+ inv_det= 1.0f / det;
+
+ /* calculate distance from v1 to ray origin */
+ sub_v3_v3v3(tvec, orig, v1);
+
+ /* calculate U parameter and test bounds */
+ u= dot_v3v3(tvec, pvec) * inv_det;
+ if (clip && (u < 0.0f || u > 1.0f)) {
+ Py_RETURN_NONE;
+ }
+
+ /* prepare to test the V parameter */
+ cross_v3_v3v3(qvec, tvec, e1);
+
+ /* calculate V parameter and test bounds */
+ v= dot_v3v3(dir, qvec) * inv_det;
+
+ if (clip && (v < 0.0f || u + v > 1.0f)) {
+ Py_RETURN_NONE;
+ }
+
+ /* calculate t, ray intersects triangle */
+ t= dot_v3v3(e2, qvec) * inv_det;
+
+ mul_v3_fl(dir, t);
+ add_v3_v3v3(pvec, orig, dir);
+
+ return newVectorObject(pvec, 3, Py_NEW, NULL);
+}
+
+/* Line-Line intersection using algorithm from mathworld.wolfram.com */
+
+static char M_Geometry_intersect_line_line_doc[] =
+".. function:: intersect_line_line(v1, v2, v3, v4)\n"
+"\n"
+" Returns a tuple with the points on each line respectively closest to the other.\n"
+"\n"
+" :arg v1: First point of the first line\n"
+" :type v1: :class:`mathutils.Vector`\n"
+" :arg v2: Second point of the first line\n"
+" :type v2: :class:`mathutils.Vector`\n"
+" :arg v3: First point of the second line\n"
+" :type v3: :class:`mathutils.Vector`\n"
+" :arg v4: Second point of the second line\n"
+" :type v4: :class:`mathutils.Vector`\n"
+" :rtype: tuple of :class:`mathutils.Vector`'s\n"
+;
+static PyObject *M_Geometry_intersect_line_line(PyObject *UNUSED(self), PyObject *args)
+{
+ PyObject * tuple;
+ VectorObject *vec1, *vec2, *vec3, *vec4;
+ float v1[3], v2[3], v3[3], v4[3], i1[3], i2[3];
+
+ if(!PyArg_ParseTuple(args, "O!O!O!O!:intersect_line_line", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3, &vector_Type, &vec4)) {
+ return NULL;
+ }
+ if(vec1->size != vec2->size || vec1->size != vec3->size || vec3->size != vec2->size) {
+ PyErr_SetString(PyExc_ValueError,"vectors must be of the same size");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(vec4))
+ return NULL;
+
+ if(vec1->size == 3 || vec1->size == 2) {
+ int result;
+
+ if (vec1->size == 3) {
+ VECCOPY(v1, vec1->vec);
+ VECCOPY(v2, vec2->vec);
+ VECCOPY(v3, vec3->vec);
+ VECCOPY(v4, vec4->vec);
+ }
+ else {
+ v1[0]= vec1->vec[0];
+ v1[1]= vec1->vec[1];
+ v1[2]= 0.0f;
+
+ v2[0]= vec2->vec[0];
+ v2[1]= vec2->vec[1];
+ v2[2]= 0.0f;
+
+ v3[0]= vec3->vec[0];
+ v3[1]= vec3->vec[1];
+ v3[2]= 0.0f;
+
+ v4[0]= vec4->vec[0];
+ v4[1]= vec4->vec[1];
+ v4[2]= 0.0f;
+ }
+
+ result= isect_line_line_v3(v1, v2, v3, v4, i1, i2);
+
+ if (result == 0) {
+ /* colinear */
+ Py_RETURN_NONE;
+ }
+ else {
+ tuple= PyTuple_New(2);
+ PyTuple_SET_ITEM(tuple, 0, newVectorObject(i1, vec1->size, Py_NEW, NULL));
+ PyTuple_SET_ITEM(tuple, 1, newVectorObject(i2, vec1->size, Py_NEW, NULL));
+ return tuple;
+ }
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError, "2D/3D vectors only");
+ return NULL;
+ }
+}
+
+
+
+
+//----------------------------geometry.normal() -------------------
+static char M_Geometry_normal_doc[] =
+".. function:: normal(v1, v2, v3, v4=None)\n"
+"\n"
+" Returns the normal of the 3D tri or quad.\n"
+"\n"
+" :arg v1: Point1\n"
+" :type v1: :class:`mathutils.Vector`\n"
+" :arg v2: Point2\n"
+" :type v2: :class:`mathutils.Vector`\n"
+" :arg v3: Point3\n"
+" :type v3: :class:`mathutils.Vector`\n"
+" :arg v4: Point4 (optional)\n"
+" :type v4: :class:`mathutils.Vector`\n"
+" :rtype: :class:`mathutils.Vector`\n"
+;
+static PyObject *M_Geometry_normal(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *vec1, *vec2, *vec3, *vec4;
+ float n[3];
+
+ if(PyTuple_GET_SIZE(args) == 3) {
+ if(!PyArg_ParseTuple(args, "O!O!O!:normal", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3)) {
+ return NULL;
+ }
+ if(vec1->size != vec2->size || vec1->size != vec3->size) {
+ PyErr_SetString(PyExc_ValueError, "vectors must be of the same size");
+ return NULL;
+ }
+ if(vec1->size < 3) {
+ PyErr_SetString(PyExc_ValueError, "2D vectors unsupported");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3))
+ return NULL;
+
+ normal_tri_v3(n, vec1->vec, vec2->vec, vec3->vec);
+ }
+ else {
+ if(!PyArg_ParseTuple(args, "O!O!O!O!:normal", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3, &vector_Type, &vec4)) {
+ return NULL;
+ }
+ if(vec1->size != vec2->size || vec1->size != vec3->size || vec1->size != vec4->size) {
+ PyErr_SetString(PyExc_ValueError,"vectors must be of the same size");
+ return NULL;
+ }
+ if(vec1->size < 3) {
+ PyErr_SetString(PyExc_ValueError, "2D vectors unsupported");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(vec4))
+ return NULL;
+
+ normal_quad_v3(n, vec1->vec, vec2->vec, vec3->vec, vec4->vec);
+ }
+
+ return newVectorObject(n, 3, Py_NEW, NULL);
+}
+
+//--------------------------------- AREA FUNCTIONS--------------------
+
+static char M_Geometry_area_tri_doc[] =
+".. function:: area_tri(v1, v2, v3)\n"
+"\n"
+" Returns the area size of the 2D or 3D triangle defined.\n"
+"\n"
+" :arg v1: Point1\n"
+" :type v1: :class:`mathutils.Vector`\n"
+" :arg v2: Point2\n"
+" :type v2: :class:`mathutils.Vector`\n"
+" :arg v3: Point3\n"
+" :type v3: :class:`mathutils.Vector`\n"
+" :rtype: float\n"
+;
+static PyObject *M_Geometry_area_tri(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *vec1, *vec2, *vec3;
+
+ if(!PyArg_ParseTuple(args, "O!O!O!:area_tri", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3)) {
+ return NULL;
+ }
+
+ if(vec1->size != vec2->size || vec1->size != vec3->size) {
+ PyErr_SetString(PyExc_ValueError, "vectors must be of the same size");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3))
+ return NULL;
+
+ if (vec1->size == 3) {
+ return PyFloat_FromDouble(area_tri_v3(vec1->vec, vec2->vec, vec3->vec));
+ }
+ else if (vec1->size == 2) {
+ return PyFloat_FromDouble(area_tri_v2(vec1->vec, vec2->vec, vec3->vec));
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError, "only 2D,3D vectors are supported");
+ return NULL;
+ }
+}
+
+/*----------------------------------geometry.PolyFill() -------------------*/
+static char M_Geometry_tesselate_polygon_doc[] =
+".. function:: tesselate_polygon(veclist_list)\n"
+"\n"
+" Takes a list of polylines (each point a vector) and returns the point indices for a polyline filled with triangles.\n"
+"\n"
+" :arg veclist_list: list of polylines\n"
+" :rtype: list\n"
+;
+/* PolyFill function, uses Blenders scanfill to fill multiple poly lines */
+static PyObject *M_Geometry_tesselate_polygon(PyObject *UNUSED(self), PyObject *polyLineSeq)
+{
+ PyObject *tri_list; /*return this list of tri's */
+ PyObject *polyLine, *polyVec;
+ int i, len_polylines, len_polypoints, ls_error= 0;
+
+ /* display listbase */
+ ListBase dispbase={NULL, NULL};
+ DispList *dl;
+ float *fp; /*pointer to the array of malloced dl->verts to set the points from the vectors */
+ int index, *dl_face, totpoints=0;
+
+ if(!PySequence_Check(polyLineSeq)) {
+ PyErr_SetString(PyExc_TypeError, "expected a sequence of poly lines");
+ return NULL;
+ }
+
+ len_polylines= PySequence_Size(polyLineSeq);
+
+ for(i= 0; i < len_polylines; ++i) {
+ polyLine= PySequence_GetItem(polyLineSeq, i);
+ if (!PySequence_Check(polyLine)) {
+ freedisplist(&dispbase);
+ Py_XDECREF(polyLine); /* may be null so use Py_XDECREF*/
+ PyErr_SetString(PyExc_TypeError, "One or more of the polylines is not a sequence of mathutils.Vector's");
+ return NULL;
+ }
+
+ len_polypoints= PySequence_Size(polyLine);
+ if (len_polypoints>0) { /* dont bother adding edges as polylines */
+#if 0
+ if (EXPP_check_sequence_consistency(polyLine, &vector_Type) != 1) {
+ freedisplist(&dispbase);
+ Py_DECREF(polyLine);
+ PyErr_SetString(PyExc_TypeError, "A point in one of the polylines is not a mathutils.Vector type");
+ return NULL;
+ }
+#endif
+ dl= MEM_callocN(sizeof(DispList), "poly disp");
+ BLI_addtail(&dispbase, dl);
+ dl->type= DL_INDEX3;
+ dl->nr= len_polypoints;
+ dl->type= DL_POLY;
+ dl->parts= 1; /* no faces, 1 edge loop */
+ dl->col= 0; /* no material */
+ dl->verts= fp= MEM_callocN(sizeof(float)*3*len_polypoints, "dl verts");
+ dl->index= MEM_callocN(sizeof(int)*3*len_polypoints, "dl index");
+
+ for(index= 0; index<len_polypoints; ++index, fp+=3) {
+ polyVec= PySequence_GetItem(polyLine, index);
+ if(VectorObject_Check(polyVec)) {
+
+ if(!BaseMath_ReadCallback((VectorObject *)polyVec))
+ ls_error= 1;
+
+ fp[0]= ((VectorObject *)polyVec)->vec[0];
+ fp[1]= ((VectorObject *)polyVec)->vec[1];
+ if(((VectorObject *)polyVec)->size > 2)
+ fp[2]= ((VectorObject *)polyVec)->vec[2];
+ else
+ fp[2]= 0.0f; /* if its a 2d vector then set the z to be zero */
+ }
+ else {
+ ls_error= 1;
+ }
+
+ totpoints++;
+ Py_DECREF(polyVec);
+ }
+ }
+ Py_DECREF(polyLine);
+ }
+
+ if(ls_error) {
+ freedisplist(&dispbase); /* possible some dl was allocated */
+ PyErr_SetString(PyExc_TypeError, "A point in one of the polylines is not a mathutils.Vector type");
+ return NULL;
+ }
+ else if (totpoints) {
+ /* now make the list to return */
+ filldisplist(&dispbase, &dispbase, 0);
+
+ /* The faces are stored in a new DisplayList
+ thats added to the head of the listbase */
+ dl= dispbase.first;
+
+ tri_list= PyList_New(dl->parts);
+ if(!tri_list) {
+ freedisplist(&dispbase);
+ PyErr_SetString(PyExc_RuntimeError, "geometry.PolyFill failed to make a new list");
+ return NULL;
+ }
+
+ index= 0;
+ dl_face= dl->index;
+ while(index < dl->parts) {
+ PyList_SET_ITEM(tri_list, index, Py_BuildValue("iii", dl_face[0], dl_face[1], dl_face[2]));
+ dl_face+= 3;
+ index++;
+ }
+ freedisplist(&dispbase);
+ } else {
+ /* no points, do this so scripts dont barf */
+ freedisplist(&dispbase); /* possible some dl was allocated */
+ tri_list= PyList_New(0);
+ }
+
+ return tri_list;
+}
+
+static char M_Geometry_intersect_line_line_2d_doc[] =
+".. function:: intersect_line_line_2d(lineA_p1, lineA_p2, lineB_p1, lineB_p2)\n"
+"\n"
+" Takes 2 lines (as 4 vectors) and returns a vector for their point of intersection or None.\n"
+"\n"
+" :arg lineA_p1: First point of the first line\n"
+" :type lineA_p1: :class:`mathutils.Vector`\n"
+" :arg lineA_p2: Second point of the first line\n"
+" :type lineA_p2: :class:`mathutils.Vector`\n"
+" :arg lineB_p1: First point of the second line\n"
+" :type lineB_p1: :class:`mathutils.Vector`\n"
+" :arg lineB_p2: Second point of the second line\n"
+" :type lineB_p2: :class:`mathutils.Vector`\n"
+" :return: The point of intersection or None when not found\n"
+" :rtype: :class:`mathutils.Vector` or None\n"
+;
+static PyObject *M_Geometry_intersect_line_line_2d(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *line_a1, *line_a2, *line_b1, *line_b2;
+ float vi[2];
+ if(!PyArg_ParseTuple(args, "O!O!O!O!:intersect_line_line_2d",
+ &vector_Type, &line_a1,
+ &vector_Type, &line_a2,
+ &vector_Type, &line_b1,
+ &vector_Type, &line_b2)
+ ) {
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(line_a1) || !BaseMath_ReadCallback(line_a2) || !BaseMath_ReadCallback(line_b1) || !BaseMath_ReadCallback(line_b2))
+ return NULL;
+
+ if(isect_seg_seg_v2_point(line_a1->vec, line_a2->vec, line_b1->vec, line_b2->vec, vi) == 1) {
+ return newVectorObject(vi, 2, Py_NEW, NULL);
+ } else {
+ Py_RETURN_NONE;
+ }
+}
+
+
+static char M_Geometry_intersect_point_line_doc[] =
+".. function:: intersect_point_line(pt, line_p1, line_p2)\n"
+"\n"
+" Takes a point and a line and returns a tuple with the closest point on the line and its distance from the first point of the line as a percentage of the length of the line.\n"
+"\n"
+" :arg pt: Point\n"
+" :type pt: :class:`mathutils.Vector`\n"
+" :arg line_p1: First point of the line\n"
+" :type line_p1: :class:`mathutils.Vector`\n"
+" :arg line_p1: Second point of the line\n"
+" :type line_p1: :class:`mathutils.Vector`\n"
+" :rtype: (:class:`mathutils.Vector`, float)\n"
+;
+static PyObject *M_Geometry_intersect_point_line(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *pt, *line_1, *line_2;
+ float pt_in[3], pt_out[3], l1[3], l2[3];
+ float lambda;
+ PyObject *ret;
+
+ if(!PyArg_ParseTuple(args, "O!O!O!:intersect_point_line",
+ &vector_Type, &pt,
+ &vector_Type, &line_1,
+ &vector_Type, &line_2)
+ ) {
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(pt) || !BaseMath_ReadCallback(line_1) || !BaseMath_ReadCallback(line_2))
+ return NULL;
+
+ /* accept 2d verts */
+ if (pt->size==3) { VECCOPY(pt_in, pt->vec);}
+ else { pt_in[2]=0.0; VECCOPY2D(pt_in, pt->vec) }
+
+ if (line_1->size==3) { VECCOPY(l1, line_1->vec);}
+ else { l1[2]=0.0; VECCOPY2D(l1, line_1->vec) }
+
+ if (line_2->size==3) { VECCOPY(l2, line_2->vec);}
+ else { l2[2]=0.0; VECCOPY2D(l2, line_2->vec) }
+
+ /* do the calculation */
+ lambda= closest_to_line_v3(pt_out,pt_in, l1, l2);
+
+ ret= PyTuple_New(2);
+ PyTuple_SET_ITEM(ret, 0, newVectorObject(pt_out, 3, Py_NEW, NULL));
+ PyTuple_SET_ITEM(ret, 1, PyFloat_FromDouble(lambda));
+ return ret;
+}
+
+static char M_Geometry_intersect_point_tri_2d_doc[] =
+".. function:: intersect_point_tri_2d(pt, tri_p1, tri_p2, tri_p3)\n"
+"\n"
+" Takes 4 vectors (using only the x and y coordinates): one is the point and the next 3 define the triangle. Returns 1 if the point is within the triangle, otherwise 0.\n"
+"\n"
+" :arg pt: Point\n"
+" :type v1: :class:`mathutils.Vector`\n"
+" :arg tri_p1: First point of the triangle\n"
+" :type tri_p1: :class:`mathutils.Vector`\n"
+" :arg tri_p2: Second point of the triangle\n"
+" :type tri_p2: :class:`mathutils.Vector`\n"
+" :arg tri_p3: Third point of the triangle\n"
+" :type tri_p3: :class:`mathutils.Vector`\n"
+" :rtype: int\n"
+;
+static PyObject *M_Geometry_intersect_point_tri_2d(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *pt_vec, *tri_p1, *tri_p2, *tri_p3;
+
+ if(!PyArg_ParseTuple(args, "O!O!O!O!:intersect_point_tri_2d",
+ &vector_Type, &pt_vec,
+ &vector_Type, &tri_p1,
+ &vector_Type, &tri_p2,
+ &vector_Type, &tri_p3)
+ ) {
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(pt_vec) || !BaseMath_ReadCallback(tri_p1) || !BaseMath_ReadCallback(tri_p2) || !BaseMath_ReadCallback(tri_p3))
+ return NULL;
+
+ return PyLong_FromLong(isect_point_tri_v2(pt_vec->vec, tri_p1->vec, tri_p2->vec, tri_p3->vec));
+}
+
+static char M_Geometry_intersect_point_quad_2d_doc[] =
+".. function:: intersect_point_quad_2d(pt, quad_p1, quad_p2, quad_p3, quad_p4)\n"
+"\n"
+" Takes 5 vectors (using only the x and y coordinates): one is the point and the next 4 define the quad, only the x and y are used from the vectors. Returns 1 if the point is within the quad, otherwise 0.\n"
+"\n"
+" :arg pt: Point\n"
+" :type v1: :class:`mathutils.Vector`\n"
+" :arg quad_p1: First point of the quad\n"
+" :type quad_p1: :class:`mathutils.Vector`\n"
+" :arg quad_p2: Second point of the quad\n"
+" :type quad_p2: :class:`mathutils.Vector`\n"
+" :arg quad_p3: Third point of the quad\n"
+" :type quad_p3: :class:`mathutils.Vector`\n"
+" :arg quad_p4: Forth point of the quad\n"
+" :type quad_p4: :class:`mathutils.Vector`\n"
+" :rtype: int\n"
+;
+static PyObject *M_Geometry_intersect_point_quad_2d(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *pt_vec, *quad_p1, *quad_p2, *quad_p3, *quad_p4;
+
+ if(!PyArg_ParseTuple(args, "O!O!O!O!O!:intersect_point_quad_2d",
+ &vector_Type, &pt_vec,
+ &vector_Type, &quad_p1,
+ &vector_Type, &quad_p2,
+ &vector_Type, &quad_p3,
+ &vector_Type, &quad_p4)
+ ) {
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(pt_vec) || !BaseMath_ReadCallback(quad_p1) || !BaseMath_ReadCallback(quad_p2) || !BaseMath_ReadCallback(quad_p3) || !BaseMath_ReadCallback(quad_p4))
+ return NULL;
+
+ return PyLong_FromLong(isect_point_quad_v2(pt_vec->vec, quad_p1->vec, quad_p2->vec, quad_p3->vec, quad_p4->vec));
+}
+
+static int boxPack_FromPyObject(PyObject *value, boxPack **boxarray)
+{
+ int len, i;
+ PyObject *list_item, *item_1, *item_2;
+ boxPack *box;
+
+
+ /* Error checking must already be done */
+ if(!PyList_Check(value)) {
+ PyErr_SetString(PyExc_TypeError, "can only back a list of [x, y, w, h]");
+ return -1;
+ }
+
+ len= PyList_Size(value);
+
+ (*boxarray)= MEM_mallocN(len*sizeof(boxPack), "boxPack box");
+
+
+ for(i= 0; i < len; i++) {
+ list_item= PyList_GET_ITEM(value, i);
+ if(!PyList_Check(list_item) || PyList_Size(list_item) < 4) {
+ MEM_freeN(*boxarray);
+ PyErr_SetString(PyExc_TypeError, "can only pack a list of [x, y, w, h]");
+ return -1;
+ }
+
+ box= (*boxarray)+i;
+
+ item_1= PyList_GET_ITEM(list_item, 2);
+ item_2= PyList_GET_ITEM(list_item, 3);
+
+ box->w= (float)PyFloat_AsDouble(item_1);
+ box->h= (float)PyFloat_AsDouble(item_2);
+ box->index= i;
+
+ if (box->w < 0.0f || box->h < 0.0f) {
+ MEM_freeN(*boxarray);
+ PyErr_SetString(PyExc_TypeError, "error parsing width and height values from list: [x, y, w, h], not numbers or below zero");
+ return -1;
+ }
+
+ /* verts will be added later */
+ }
+ return 0;
+}
+
+static void boxPack_ToPyObject(PyObject * value, boxPack **boxarray)
+{
+ int len, i;
+ PyObject *list_item;
+ boxPack *box;
+
+ len= PyList_Size(value);
+
+ for(i= 0; i < len; i++) {
+ box= (*boxarray)+i;
+ list_item= PyList_GET_ITEM(value, box->index);
+ PyList_SET_ITEM(list_item, 0, PyFloat_FromDouble(box->x));
+ PyList_SET_ITEM(list_item, 1, PyFloat_FromDouble(box->y));
+ }
+ MEM_freeN(*boxarray);
+}
+
+static char M_Geometry_box_pack_2d_doc[] =
+".. function:: box_pack_2d(boxes)\n"
+"\n"
+" Returns the normal of the 3D tri or quad.\n"
+"\n"
+" :arg boxes: list of boxes, each box is a list where the first 4 items are [x,y, width, height, ...] other items are ignored.\n"
+" :type boxes: list\n"
+" :return: the width and height of the packed bounding box\n"
+" :rtype: tuple, pair of floats\n"
+;
+static PyObject *M_Geometry_box_pack_2d(PyObject *UNUSED(self), PyObject *boxlist)
+{
+ float tot_width= 0.0f, tot_height= 0.0f;
+ int len;
+
+ PyObject *ret;
+
+ if(!PyList_Check(boxlist)) {
+ PyErr_SetString(PyExc_TypeError, "expected a list of boxes [[x,y,w,h], ... ]");
+ return NULL;
+ }
+
+ len= PyList_GET_SIZE(boxlist);
+ if (len) {
+ boxPack *boxarray= NULL;
+ if(boxPack_FromPyObject(boxlist, &boxarray) == -1) {
+ return NULL; /* exception set */
+ }
+
+ /* Non Python function */
+ boxPack2D(boxarray, len, &tot_width, &tot_height);
+
+ boxPack_ToPyObject(boxlist, &boxarray);
+ }
+
+ ret= PyTuple_New(2);
+ PyTuple_SET_ITEM(ret, 0, PyFloat_FromDouble(tot_width));
+ PyTuple_SET_ITEM(ret, 1, PyFloat_FromDouble(tot_width));
+ return ret;
+}
+
+static char M_Geometry_interpolate_bezier_doc[] =
+".. function:: interpolate_bezier(knot1, handle1, handle2, knot2, resolution)\n"
+"\n"
+" Interpolate a bezier spline segment.\n"
+"\n"
+" :arg knot1: First bezier spline point.\n"
+" :type knot1: :class:`mathutils.Vector`\n"
+" :arg handle1: First bezier spline handle.\n"
+" :type handle1: :class:`mathutils.Vector`\n"
+" :arg handle2: Second bezier spline handle.\n"
+" :type handle2: :class:`mathutils.Vector`\n"
+" :arg knot2: Second bezier spline point.\n"
+" :type knot2: :class:`mathutils.Vector`\n"
+" :arg resolution: Number of points to return.\n"
+" :type resolution: int\n"
+" :return: The interpolated points\n"
+" :rtype: list of :class:`mathutils.Vector`'s\n"
+;
+static PyObject *M_Geometry_interpolate_bezier(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *vec_k1, *vec_h1, *vec_k2, *vec_h2;
+ int resolu;
+ int dims;
+ int i;
+ float *coord_array, *fp;
+ PyObject *list;
+
+ float k1[4]= {0.0, 0.0, 0.0, 0.0};
+ float h1[4]= {0.0, 0.0, 0.0, 0.0};
+ float k2[4]= {0.0, 0.0, 0.0, 0.0};
+ float h2[4]= {0.0, 0.0, 0.0, 0.0};
+
+
+ if(!PyArg_ParseTuple(args, "O!O!O!O!i:interpolate_bezier",
+ &vector_Type, &vec_k1,
+ &vector_Type, &vec_h1,
+ &vector_Type, &vec_h2,
+ &vector_Type, &vec_k2, &resolu)
+ ) {
+ return NULL;
+ }
+
+ if(resolu <= 1) {
+ PyErr_SetString(PyExc_ValueError, "resolution must be 2 or over");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec_k1) || !BaseMath_ReadCallback(vec_h1) || !BaseMath_ReadCallback(vec_k2) || !BaseMath_ReadCallback(vec_h2))
+ return NULL;
+
+ dims= MAX4(vec_k1->size, vec_h1->size, vec_h2->size, vec_k2->size);
+
+ for(i=0; i < vec_k1->size; i++) k1[i]= vec_k1->vec[i];
+ for(i=0; i < vec_h1->size; i++) h1[i]= vec_h1->vec[i];
+ for(i=0; i < vec_k2->size; i++) k2[i]= vec_k2->vec[i];
+ for(i=0; i < vec_h2->size; i++) h2[i]= vec_h2->vec[i];
+
+ coord_array= MEM_callocN(dims * (resolu) * sizeof(float), "interpolate_bezier");
+ for(i=0; i<dims; i++) {
+ forward_diff_bezier(k1[i], h1[i], h2[i], k2[i], coord_array+i, resolu-1, sizeof(float)*dims);
+ }
+
+ list= PyList_New(resolu);
+ fp= coord_array;
+ for(i=0; i<resolu; i++, fp= fp+dims) {
+ PyList_SET_ITEM(list, i, newVectorObject(fp, dims, Py_NEW, NULL));
+ }
+ MEM_freeN(coord_array);
+ return list;
+}
+
+static char M_Geometry_barycentric_transform_doc[] =
+".. function:: barycentric_transform(point, tri_a1, tri_a2, tri_a3, tri_b1, tri_b2, tri_b3)\n"
+"\n"
+" Return a transformed point, the transformation is defined by 2 triangles.\n"
+"\n"
+" :arg point: The point to transform.\n"
+" :type point: :class:`mathutils.Vector`\n"
+" :arg tri_a1: source triangle vertex.\n"
+" :type tri_a1: :class:`mathutils.Vector`\n"
+" :arg tri_a2: source triangle vertex.\n"
+" :type tri_a2: :class:`mathutils.Vector`\n"
+" :arg tri_a3: source triangle vertex.\n"
+" :type tri_a3: :class:`mathutils.Vector`\n"
+" :arg tri_a1: target triangle vertex.\n"
+" :type tri_a1: :class:`mathutils.Vector`\n"
+" :arg tri_a2: target triangle vertex.\n"
+" :type tri_a2: :class:`mathutils.Vector`\n"
+" :arg tri_a3: target triangle vertex.\n"
+" :type tri_a3: :class:`mathutils.Vector`\n"
+" :return: The transformed point\n"
+" :rtype: :class:`mathutils.Vector`'s\n"
+;
+static PyObject *M_Geometry_barycentric_transform(PyObject *UNUSED(self), PyObject *args)
+{
+ VectorObject *vec_pt;
+ VectorObject *vec_t1_tar, *vec_t2_tar, *vec_t3_tar;
+ VectorObject *vec_t1_src, *vec_t2_src, *vec_t3_src;
+ float vec[3];
+
+ if(!PyArg_ParseTuple(args, "O!O!O!O!O!O!O!:barycentric_transform",
+ &vector_Type, &vec_pt,
+ &vector_Type, &vec_t1_src,
+ &vector_Type, &vec_t2_src,
+ &vector_Type, &vec_t3_src,
+ &vector_Type, &vec_t1_tar,
+ &vector_Type, &vec_t2_tar,
+ &vector_Type, &vec_t3_tar)
+ ) {
+ return NULL;
+ }
+
+ if( vec_pt->size != 3 ||
+ vec_t1_src->size != 3 ||
+ vec_t2_src->size != 3 ||
+ vec_t3_src->size != 3 ||
+ vec_t1_tar->size != 3 ||
+ vec_t2_tar->size != 3 ||
+ vec_t3_tar->size != 3)
+ {
+ PyErr_SetString(PyExc_ValueError, "One of more of the vector arguments wasnt a 3D vector");
+ return NULL;
+ }
+
+ barycentric_transform(vec, vec_pt->vec,
+ vec_t1_tar->vec, vec_t2_tar->vec, vec_t3_tar->vec,
+ vec_t1_src->vec, vec_t2_src->vec, vec_t3_src->vec);
+
+ return newVectorObject(vec, 3, Py_NEW, NULL);
+}
+
+struct PyMethodDef M_Geometry_methods[]= {
+ {"intersect_ray_tri", (PyCFunction) M_Geometry_intersect_ray_tri, METH_VARARGS, M_Geometry_intersect_ray_tri_doc},
+ {"intersect_point_line", (PyCFunction) M_Geometry_intersect_point_line, METH_VARARGS, M_Geometry_intersect_point_line_doc},
+ {"intersect_point_tri_2d", (PyCFunction) M_Geometry_intersect_point_tri_2d, METH_VARARGS, M_Geometry_intersect_point_tri_2d_doc},
+ {"intersect_point_quad_2d", (PyCFunction) M_Geometry_intersect_point_quad_2d, METH_VARARGS, M_Geometry_intersect_point_quad_2d_doc},
+ {"intersect_line_line", (PyCFunction) M_Geometry_intersect_line_line, METH_VARARGS, M_Geometry_intersect_line_line_doc},
+ {"intersect_line_line_2d", (PyCFunction) M_Geometry_intersect_line_line_2d, METH_VARARGS, M_Geometry_intersect_line_line_2d_doc},
+ {"interpolate_bezier", (PyCFunction) M_Geometry_interpolate_bezier, METH_VARARGS, M_Geometry_interpolate_bezier_doc},
+ {"area_tri", (PyCFunction) M_Geometry_area_tri, METH_VARARGS, M_Geometry_area_tri_doc},
+ {"normal", (PyCFunction) M_Geometry_normal, METH_VARARGS, M_Geometry_normal_doc},
+ {"tesselate_polygon", (PyCFunction) M_Geometry_tesselate_polygon, METH_O, M_Geometry_tesselate_polygon_doc},
+ {"box_pack_2d", (PyCFunction) M_Geometry_box_pack_2d, METH_O, M_Geometry_box_pack_2d_doc},
+ {"barycentric_transform", (PyCFunction) M_Geometry_barycentric_transform, METH_VARARGS, M_Geometry_barycentric_transform_doc},
+ {NULL, NULL, 0, NULL}
+};
+
+static struct PyModuleDef M_Geometry_module_def= {
+ PyModuleDef_HEAD_INIT,
+ "mathutils.geometry", /* m_name */
+ M_Geometry_doc, /* m_doc */
+ 0, /* m_size */
+ M_Geometry_methods, /* m_methods */
+ 0, /* m_reload */
+ 0, /* m_traverse */
+ 0, /* m_clear */
+ 0, /* m_free */
+};
+
+/*----------------------------MODULE INIT-------------------------*/
+PyMODINIT_FUNC BPyInit_mathutils_geometry(void)
+{
+ PyObject *submodule= PyModule_Create(&M_Geometry_module_def);
+ return submodule;
+}
diff --git a/source/blender/python/generic/geometry.h b/source/blender/python/generic/mathutils_geometry.h
index 401efcc7888..ba32a752db1 100644
--- a/source/blender/python/generic/geometry.h
+++ b/source/blender/python/generic/mathutils_geometry.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: mathutils_geometry.h 34335 2011-01-15 16:14:57Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -28,12 +28,12 @@
*/
/*Include this file for access to vector, quat, matrix, euler, etc...*/
-#ifndef EXPP_Geometry_H
-#define EXPP_Geometry_H
+#ifndef MATHUTILS_GEOMETRY_H
+#define MATHUTILS_GEOMETRY_H
#include <Python.h>
#include "mathutils.h"
-PyObject *Geometry_Init(void);
+PyMODINIT_FUNC BPyInit_mathutils_geometry(void);
-#endif /* EXPP_Geometry_H */
+#endif /* MATHUTILS_GEOMETRY_H */
diff --git a/source/blender/python/generic/mathutils_matrix.c b/source/blender/python/generic/mathutils_matrix.c
index 3b8c7d3122a..9144da4fa22 100644
--- a/source/blender/python/generic/mathutils_matrix.c
+++ b/source/blender/python/generic/mathutils_matrix.c
@@ -27,12 +27,13 @@
#include "mathutils.h"
-#include "BKE_utildefines.h"
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
-static PyObject *column_vector_multiplication(MatrixObject * mat, VectorObject* vec); /* utility func */
-
+static PyObject *Matrix_copy(MatrixObject *self);
+static int Matrix_ass_slice(MatrixObject *self, int begin, int end, PyObject *value);
+static PyObject *matrix__apply_to_copy(PyNoArgsFunction matrix_func, MatrixObject *self);
/* matrix vector callbacks */
int mathutils_matrix_vector_cb_index= -1;
@@ -51,7 +52,7 @@ static int mathutils_matrix_vector_get(BaseMathObject *bmo, int subtype)
if(!BaseMath_ReadCallback(self))
return 0;
- for(i=0; i < self->colSize; i++)
+ for(i=0; i < self->col_size; i++)
bmo->data[i]= self->matrix[subtype][i];
return 1;
@@ -65,10 +66,10 @@ static int mathutils_matrix_vector_set(BaseMathObject *bmo, int subtype)
if(!BaseMath_ReadCallback(self))
return 0;
- for(i=0; i < self->colSize; i++)
+ for(i=0; i < self->col_size; i++)
self->matrix[subtype][i]= bmo->data[i];
- BaseMath_WriteCallback(self);
+ (void)BaseMath_WriteCallback(self);
return 1;
}
@@ -92,7 +93,7 @@ static int mathutils_matrix_vector_set_index(BaseMathObject *bmo, int subtype, i
self->matrix[subtype][index]= bmo->data[index];
- BaseMath_WriteCallback(self);
+ (void)BaseMath_WriteCallback(self);
return 1;
}
@@ -110,80 +111,73 @@ Mathutils_Callback mathutils_matrix_vector_cb = {
//create a new matrix type
static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
- PyObject *argObject, *m, *s;
- MatrixObject *mat;
- int argSize, seqSize = 0, i, j;
- float matrix[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
- float scalar;
+ if(kwds && PyDict_Size(kwds)) {
+ PyErr_SetString(PyExc_TypeError, "mathutils.Matrix(): takes no keyword args");
+ return NULL;
+ }
- argSize = PyTuple_GET_SIZE(args);
- if(argSize > MATRIX_MAX_DIM) { //bad arg nums
- PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n");
- return NULL;
- } else if (argSize == 0) { //return empty 4D matrix
- return (PyObject *) newMatrixObject(NULL, 4, 4, Py_NEW, NULL);
- }else if (argSize == 1){
- //copy constructor for matrix objects
- argObject = PyTuple_GET_ITEM(args, 0);
- if(MatrixObject_Check(argObject)){
- mat = (MatrixObject*)argObject;
- if(!BaseMath_ReadCallback(mat))
- return NULL;
+ switch(PyTuple_GET_SIZE(args)) {
+ case 0:
+ return (PyObject *) newMatrixObject(NULL, 4, 4, Py_NEW, type);
+ case 1:
+ {
+ PyObject *arg= PyTuple_GET_ITEM(args, 0);
- memcpy(matrix, mat->contigPtr, sizeof(float) * mat->rowSize * mat->colSize);
- argSize = mat->rowSize;
- seqSize = mat->colSize;
- }
- }else{ //2-4 arguments (all seqs? all same size?)
- for(i =0; i < argSize; i++){
- argObject = PyTuple_GET_ITEM(args, i);
- if (PySequence_Check(argObject)) { //seq?
- if(seqSize){ //0 at first
- if(PySequence_Length(argObject) != seqSize){ //seq size not same
- PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n");
- return NULL;
+ const unsigned short row_size= PySequence_Size(arg); /* -1 is an error, size checks will accunt for this */
+
+ if(IN_RANGE_INCL(row_size, 2, 4)) {
+ PyObject *item= PySequence_GetItem(arg, 0);
+ const unsigned short col_size= PySequence_Size(item);
+ Py_XDECREF(item);
+
+ if(IN_RANGE_INCL(col_size, 2, 4)) {
+ /* sane row & col size, new matrix and assign as slice */
+ PyObject *matrix= newMatrixObject(NULL, row_size, col_size, Py_NEW, type);
+ if(Matrix_ass_slice((MatrixObject *)matrix, 0, INT_MAX, arg) == 0) {
+ return matrix;
+ }
+ else { /* matrix ok, slice assignment not */
+ Py_DECREF(matrix);
}
}
- seqSize = PySequence_Length(argObject);
- }else{ //arg not a sequence
- PyErr_SetString(PyExc_TypeError, "mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n");
- return NULL;
}
}
- //all is well... let's continue parsing
- for (i = 0; i < argSize; i++){
- m = PyTuple_GET_ITEM(args, i);
- if (m == NULL) { // Failed to read sequence
- PyErr_SetString(PyExc_RuntimeError, "mathutils.Matrix(): failed to parse arguments...\n");
- return NULL;
- }
+ }
- for (j = 0; j < seqSize; j++) {
- s = PySequence_GetItem(m, j);
- if (s == NULL) { // Failed to read sequence
- PyErr_SetString(PyExc_RuntimeError, "mathutils.Matrix(): failed to parse arguments...\n");
- return NULL;
- }
-
- scalar= (float)PyFloat_AsDouble(s);
- Py_DECREF(s);
-
- if(scalar==-1 && PyErr_Occurred()) { // parsed item is not a number
- PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n");
- return NULL;
- }
+ /* will overwrite error */
+ PyErr_SetString(PyExc_TypeError, "mathutils.Matrix(): expects no args or 2-4 numeric sequences");
+ return NULL;
+}
- matrix[(seqSize*i)+j]= scalar;
- }
- }
+static PyObject *matrix__apply_to_copy(PyNoArgsFunction matrix_func, MatrixObject *self)
+{
+ PyObject *ret= Matrix_copy(self);
+ PyObject *ret_dummy= matrix_func(ret);
+ if(ret_dummy) {
+ Py_DECREF(ret_dummy);
+ return (PyObject *)ret;
+ }
+ else { /* error */
+ Py_DECREF(ret);
+ return NULL;
}
- return newMatrixObject(matrix, argSize, seqSize, Py_NEW, NULL);
+}
+
+/* when a matrix is 4x4 size but initialized as a 3x3, re-assign values for 4x4 */
+static void matrix_3x3_as_4x4(float mat[16])
+{
+ mat[10] = mat[8];
+ mat[9] = mat[7];
+ mat[8] = mat[6];
+ mat[7] = 0.0f;
+ mat[6] = mat[5];
+ mat[5] = mat[4];
+ mat[4] = mat[3];
+ mat[3] = 0.0f;
}
/*-----------------------CLASS-METHODS----------------------------*/
-//----------------------------------mathutils.RotationMatrix() ----------
//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
static char C_Matrix_Rotation_doc[] =
".. classmethod:: Rotation(angle, size, axis)\n"
@@ -197,26 +191,26 @@ static char C_Matrix_Rotation_doc[] =
" :arg axis: a string in ['X', 'Y', 'Z'] or a 3D Vector Object (optional when size is 2).\n"
" :type axis: string or :class:`Vector`\n"
" :return: A new rotation matrix.\n"
-" :rtype: :class:`Matrix`\n";
-
+" :rtype: :class:`Matrix`\n"
+;
static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args)
{
- VectorObject *vec= NULL;
- char *axis= NULL;
+ PyObject *vec= NULL;
+ const char *axis= NULL;
int matSize;
- float angle = 0.0f;
+ double angle; /* use double because of precision problems at high values */
float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
- if(!PyArg_ParseTuple(args, "fi|O", &angle, &matSize, &vec)) {
- PyErr_SetString(PyExc_TypeError, "mathutils.RotationMatrix(angle, size, axis): expected float int and a string or vector\n");
+ if(!PyArg_ParseTuple(args, "di|O", &angle, &matSize, &vec)) {
+ PyErr_SetString(PyExc_TypeError, "mathutils.RotationMatrix(angle, size, axis): expected float int and a string or vector");
return NULL;
}
- if(vec && !VectorObject_Check(vec)) {
+ if(vec && PyUnicode_Check(vec)) {
axis= _PyUnicode_AsString((PyObject *)vec);
if(axis==NULL || axis[0]=='\0' || axis[1]!='\0' || axis[0] < 'X' || axis[0] > 'Z') {
- PyErr_SetString(PyExc_TypeError, "mathutils.RotationMatrix(): 3rd argument axis value must be a 3D vector or a string in 'X', 'Y', 'Z'\n");
+ PyErr_SetString(PyExc_TypeError, "mathutils.RotationMatrix(): 3rd argument axis value must be a 3D vector or a string in 'X', 'Y', 'Z'");
return NULL;
}
else {
@@ -225,37 +219,30 @@ static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args)
}
}
- while (angle<-(Py_PI*2))
- angle+=(Py_PI*2);
- while (angle>(Py_PI*2))
- angle-=(Py_PI*2);
-
+ /* clamp angle between -360 and 360 in radians */
+ angle= fmod(angle + M_PI*2, M_PI*4) - M_PI*2;
+
if(matSize != 2 && matSize != 3 && matSize != 4) {
- PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n");
+ PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): can only return a 2x2 3x3 or 4x4 matrix");
return NULL;
}
if(matSize == 2 && (vec != NULL)) {
- PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): cannot create a 2x2 rotation matrix around arbitrary axis\n");
+ PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): cannot create a 2x2 rotation matrix around arbitrary axis");
return NULL;
}
if((matSize == 3 || matSize == 4) && (axis == NULL) && (vec == NULL)) {
- PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): please choose an axis of rotation for 3d and 4d matrices\n");
+ PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): axis of rotation for 3d and 4d matrices is required");
return NULL;
}
- if(vec) {
- if(vec->size != 3) {
- PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): the vector axis must be a 3D vector\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec))
- return NULL;
-
- }
/* check for valid vector/axis above */
if(vec) {
- axis_angle_to_mat3( (float (*)[3])mat,vec->vec, angle);
+ float tvec[3];
+
+ if (mathutils_array_parse(tvec, 3, 3, vec, "mathutils.RotationMatrix(angle, size, axis), invalid 'axis' arg") == -1)
+ return NULL;
+
+ axis_angle_to_mat3((float (*)[3])mat, tvec, angle);
}
else if(matSize == 2) {
//2D rotation matrix
@@ -287,20 +274,12 @@ static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args)
}
else {
/* should never get here */
- PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): unknown error\n");
+ PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): unknown error");
return NULL;
}
if(matSize == 4) {
- //resize matrix
- mat[10] = mat[8];
- mat[9] = mat[7];
- mat[8] = mat[6];
- mat[7] = 0.0f;
- mat[6] = mat[5];
- mat[5] = mat[4];
- mat[4] = mat[3];
- mat[3] = 0.0f;
+ matrix_3x3_as_4x4(mat);
}
//pass to matrix creation
return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
@@ -315,34 +294,21 @@ static char C_Matrix_Translation_doc[] =
" :arg vector: The translation vector.\n"
" :type vector: :class:`Vector`\n"
" :return: An identity matrix with a translation.\n"
-" :rtype: :class:`Matrix`\n";
-
-static PyObject *C_Matrix_Translation(PyObject *cls, VectorObject * vec)
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *C_Matrix_Translation(PyObject *cls, PyObject *value)
{
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
-
- if(!VectorObject_Check(vec)) {
- PyErr_SetString(PyExc_TypeError, "mathutils.TranslationMatrix(): expected vector\n");
- return NULL;
- }
- if(vec->size != 3 && vec->size != 4) {
- PyErr_SetString(PyExc_TypeError, "mathutils.TranslationMatrix(): vector must be 3D or 4D\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec))
+ float mat[16], tvec[3];
+
+ if (mathutils_array_parse(tvec, 3, 4, value, "mathutils.Matrix.Translation(vector), invalid vector arg") == -1)
return NULL;
-
- //create a identity matrix and add translation
- unit_m4((float(*)[4]) mat);
- mat[12] = vec->vec[0];
- mat[13] = vec->vec[1];
- mat[14] = vec->vec[2];
+ /* create a identity matrix and add translation */
+ unit_m4((float(*)[4]) mat);
+ copy_v3_v3(mat + 12, tvec); /* 12, 13, 14 */
return newMatrixObject(mat, 4, 4, Py_NEW, (PyTypeObject *)cls);
}
-//----------------------------------mathutils.ScaleMatrix() -------------
+//----------------------------------mathutils.Matrix.Scale() -------------
//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
static char C_Matrix_Scale_doc[] =
".. classmethod:: Scale(factor, size, axis)\n"
@@ -356,33 +322,30 @@ static char C_Matrix_Scale_doc[] =
" :arg axis: Direction to influence scale. (optional).\n"
" :type axis: :class:`Vector`\n"
" :return: A new scale matrix.\n"
-" :rtype: :class:`Matrix`\n";
-
+" :rtype: :class:`Matrix`\n"
+;
static PyObject *C_Matrix_Scale(PyObject *cls, PyObject *args)
{
- VectorObject *vec = NULL;
- float norm = 0.0f, factor;
- int matSize, x;
+ PyObject *vec= NULL;
+ int vec_size;
+ float tvec[3];
+ float factor;
+ int matSize;
float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
- if(!PyArg_ParseTuple(args, "fi|O!", &factor, &matSize, &vector_Type, &vec)) {
- PyErr_SetString(PyExc_TypeError, "mathutils.ScaleMatrix(): expected float int and optional vector\n");
+ if(!PyArg_ParseTuple(args, "fi|O:Matrix.Scale", &factor, &matSize, &vec)) {
return NULL;
}
if(matSize != 2 && matSize != 3 && matSize != 4) {
- PyErr_SetString(PyExc_AttributeError, "mathutils.ScaleMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n");
+ PyErr_SetString(PyExc_AttributeError, "Matrix.Scale(): can only return a 2x2 3x3 or 4x4 matrix");
return NULL;
}
if(vec) {
- if(vec->size > 2 && matSize == 2) {
- PyErr_SetString(PyExc_AttributeError, "mathutils.ScaleMatrix(): please use 2D vectors when scaling in 2D\n");
+ vec_size= (matSize == 2 ? 2 : 3);
+ if(mathutils_array_parse(tvec, vec_size, vec_size, vec, "Matrix.Scale(factor, size, axis), invalid 'axis' arg") == -1) {
return NULL;
}
-
- if(!BaseMath_ReadCallback(vec))
- return NULL;
-
}
if(vec == NULL) { //scaling along axis
if(matSize == 2) {
@@ -393,233 +356,254 @@ static PyObject *C_Matrix_Scale(PyObject *cls, PyObject *args)
mat[4] = factor;
mat[8] = factor;
}
- } else { //scaling in arbitrary direction
+ }
+ else { //scaling in arbitrary direction
//normalize arbitrary axis
- for(x = 0; x < vec->size; x++) {
- norm += vec->vec[x] * vec->vec[x];
+ float norm = 0.0f;
+ int x;
+ for(x = 0; x < vec_size; x++) {
+ norm += tvec[x] * tvec[x];
}
norm = (float) sqrt(norm);
- for(x = 0; x < vec->size; x++) {
- vec->vec[x] /= norm;
+ for(x = 0; x < vec_size; x++) {
+ tvec[x] /= norm;
}
if(matSize == 2) {
- mat[0] = 1 +((factor - 1) *(vec->vec[0] * vec->vec[0]));
- mat[1] =((factor - 1) *(vec->vec[0] * vec->vec[1]));
- mat[2] =((factor - 1) *(vec->vec[0] * vec->vec[1]));
- mat[3] = 1 + ((factor - 1) *(vec->vec[1] * vec->vec[1]));
+ mat[0] = 1 + ((factor - 1) *(tvec[0] * tvec[0]));
+ mat[1] = ((factor - 1) *(tvec[0] * tvec[1]));
+ mat[2] = ((factor - 1) *(tvec[0] * tvec[1]));
+ mat[3] = 1 + ((factor - 1) *(tvec[1] * tvec[1]));
} else {
- mat[0] = 1 + ((factor - 1) *(vec->vec[0] * vec->vec[0]));
- mat[1] =((factor - 1) *(vec->vec[0] * vec->vec[1]));
- mat[2] =((factor - 1) *(vec->vec[0] * vec->vec[2]));
- mat[3] =((factor - 1) *(vec->vec[0] * vec->vec[1]));
- mat[4] = 1 + ((factor - 1) *(vec->vec[1] * vec->vec[1]));
- mat[5] =((factor - 1) *(vec->vec[1] * vec->vec[2]));
- mat[6] =((factor - 1) *(vec->vec[0] * vec->vec[2]));
- mat[7] =((factor - 1) *(vec->vec[1] * vec->vec[2]));
- mat[8] = 1 + ((factor - 1) *(vec->vec[2] * vec->vec[2]));
+ mat[0] = 1 + ((factor - 1) *(tvec[0] * tvec[0]));
+ mat[1] = ((factor - 1) *(tvec[0] * tvec[1]));
+ mat[2] = ((factor - 1) *(tvec[0] * tvec[2]));
+ mat[3] = ((factor - 1) *(tvec[0] * tvec[1]));
+ mat[4] = 1 + ((factor - 1) *(tvec[1] * tvec[1]));
+ mat[5] = ((factor - 1) *(tvec[1] * tvec[2]));
+ mat[6] = ((factor - 1) *(tvec[0] * tvec[2]));
+ mat[7] = ((factor - 1) *(tvec[1] * tvec[2]));
+ mat[8] = 1 + ((factor - 1) *(tvec[2] * tvec[2]));
}
}
if(matSize == 4) {
- //resize matrix
- mat[10] = mat[8];
- mat[9] = mat[7];
- mat[8] = mat[6];
- mat[7] = 0.0f;
- mat[6] = mat[5];
- mat[5] = mat[4];
- mat[4] = mat[3];
- mat[3] = 0.0f;
+ matrix_3x3_as_4x4(mat);
}
//pass to matrix creation
return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
}
-//----------------------------------mathutils.OrthoProjectionMatrix() ---
+//----------------------------------mathutils.Matrix.OrthoProjection() ---
//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
static char C_Matrix_OrthoProjection_doc[] =
-".. classmethod:: OrthoProjection(plane, size, axis)\n"
+".. classmethod:: OrthoProjection(axis, size)\n"
"\n"
" Create a matrix to represent an orthographic projection.\n"
"\n"
-" :arg plane: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ', 'R'], where a single axis is for a 2D matrix and 'R' requires axis is given.\n"
-" :type plane: string\n"
+" :arg axis: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ'], where a single axis is for a 2D matrix. Or a vector for an arbitrary axis\n"
+" :type axis: string or :class:`Vector`\n"
" :arg size: The size of the projection matrix to construct [2, 4].\n"
" :type size: int\n"
-" :arg axis: Arbitrary perpendicular plane vector (optional).\n"
-" :type axis: :class:`Vector`\n"
" :return: A new projection matrix.\n"
-" :rtype: :class:`Matrix`\n";
+" :rtype: :class:`Matrix`\n"
+;
static PyObject *C_Matrix_OrthoProjection(PyObject *cls, PyObject *args)
{
- VectorObject *vec = NULL;
- char *plane;
+ PyObject *axis;
+
int matSize, x;
float norm = 0.0f;
float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
-
- if(!PyArg_ParseTuple(args, "si|O!", &plane, &matSize, &vector_Type, &vec)) {
- PyErr_SetString(PyExc_TypeError, "mathutils.OrthoProjectionMatrix(): expected string and int and optional vector\n");
+
+ if(!PyArg_ParseTuple(args, "Oi:Matrix.OrthoProjection", &axis, &matSize)) {
return NULL;
}
if(matSize != 2 && matSize != 3 && matSize != 4) {
- PyErr_SetString(PyExc_AttributeError,"mathutils.OrthoProjectionMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n");
+ PyErr_SetString(PyExc_AttributeError,"mathutils.Matrix.OrthoProjection(): can only return a 2x2 3x3 or 4x4 matrix");
return NULL;
}
- if(vec) {
- if(vec->size > 2 && matSize == 2) {
- PyErr_SetString(PyExc_AttributeError, "mathutils.OrthoProjectionMatrix(): please use 2D vectors when scaling in 2D\n");
- return NULL;
+
+ if(PyUnicode_Check(axis)) { //ortho projection onto cardinal plane
+ Py_ssize_t plane_len;
+ const char *plane= _PyUnicode_AsStringAndSize(axis, &plane_len);
+ if(matSize == 2) {
+ if(plane_len == 1 && plane[0]=='X') {
+ mat[0]= 1.0f;
+ }
+ else if (plane_len == 1 && plane[0]=='Y') {
+ mat[3]= 1.0f;
+ }
+ else {
+ PyErr_Format(PyExc_ValueError, "mathutils.Matrix.OrthoProjection(): unknown plane, expected: X, Y, not '%.200s'", plane);
+ return NULL;
+ }
}
-
- if(!BaseMath_ReadCallback(vec))
- return NULL;
-
- }
- if(vec == NULL) { //ortho projection onto cardinal plane
- if((strcmp(plane, "X") == 0) && matSize == 2) {
- mat[0] = 1.0f;
- } else if((strcmp(plane, "Y") == 0) && matSize == 2) {
- mat[3] = 1.0f;
- } else if((strcmp(plane, "XY") == 0) && matSize > 2) {
- mat[0] = 1.0f;
- mat[4] = 1.0f;
- } else if((strcmp(plane, "XZ") == 0) && matSize > 2) {
- mat[0] = 1.0f;
- mat[8] = 1.0f;
- } else if((strcmp(plane, "YZ") == 0) && matSize > 2) {
- mat[4] = 1.0f;
- mat[8] = 1.0f;
- } else {
- PyErr_SetString(PyExc_AttributeError, "mathutils.OrthoProjectionMatrix(): unknown plane - expected: X, Y, XY, XZ, YZ\n");
+ else {
+ if(plane_len == 2 && plane[0]=='X' && plane[1]=='Y') {
+ mat[0]= 1.0f;
+ mat[4]= 1.0f;
+ }
+ else if (plane_len == 2 && plane[0]=='X' && plane[1]=='Z') {
+ mat[0]= 1.0f;
+ mat[8]= 1.0f;
+ }
+ else if (plane_len == 2 && plane[0]=='Y' && plane[1]=='Z') {
+ mat[4]= 1.0f;
+ mat[8]= 1.0f;
+ }
+ else {
+ PyErr_Format(PyExc_ValueError, "mathutils.Matrix.OrthoProjection(): unknown plane, expected: XY, XZ, YZ, not '%.200s'", plane);
+ return NULL;
+ }
+ }
+ }
+ else {
+ //arbitrary plane
+
+ int vec_size= (matSize == 2 ? 2 : 3);
+ float tvec[4];
+
+ if(mathutils_array_parse(tvec, vec_size, vec_size, axis, "Matrix.OrthoProjection(axis, size), invalid 'axis' arg") == -1) {
return NULL;
}
- } else { //arbitrary plane
+
//normalize arbitrary axis
- for(x = 0; x < vec->size; x++) {
- norm += vec->vec[x] * vec->vec[x];
+ for(x = 0; x < vec_size; x++) {
+ norm += tvec[x] * tvec[x];
}
norm = (float) sqrt(norm);
- for(x = 0; x < vec->size; x++) {
- vec->vec[x] /= norm;
+ for(x = 0; x < vec_size; x++) {
+ tvec[x] /= norm;
}
- if((strcmp(plane, "R") == 0) && matSize == 2) {
- mat[0] = 1 - (vec->vec[0] * vec->vec[0]);
- mat[1] = -(vec->vec[0] * vec->vec[1]);
- mat[2] = -(vec->vec[0] * vec->vec[1]);
- mat[3] = 1 - (vec->vec[1] * vec->vec[1]);
- } else if((strcmp(plane, "R") == 0) && matSize > 2) {
- mat[0] = 1 - (vec->vec[0] * vec->vec[0]);
- mat[1] = -(vec->vec[0] * vec->vec[1]);
- mat[2] = -(vec->vec[0] * vec->vec[2]);
- mat[3] = -(vec->vec[0] * vec->vec[1]);
- mat[4] = 1 - (vec->vec[1] * vec->vec[1]);
- mat[5] = -(vec->vec[1] * vec->vec[2]);
- mat[6] = -(vec->vec[0] * vec->vec[2]);
- mat[7] = -(vec->vec[1] * vec->vec[2]);
- mat[8] = 1 - (vec->vec[2] * vec->vec[2]);
- } else {
- PyErr_SetString(PyExc_AttributeError, "mathutils.OrthoProjectionMatrix(): unknown plane - expected: 'r' expected for axis designation\n");
- return NULL;
+ if(matSize == 2) {
+ mat[0] = 1 - (tvec[0] * tvec[0]);
+ mat[1] = -(tvec[0] * tvec[1]);
+ mat[2] = -(tvec[0] * tvec[1]);
+ mat[3] = 1 - (tvec[1] * tvec[1]);
+ }
+ else if(matSize > 2) {
+ mat[0] = 1 - (tvec[0] * tvec[0]);
+ mat[1] = -(tvec[0] * tvec[1]);
+ mat[2] = -(tvec[0] * tvec[2]);
+ mat[3] = -(tvec[0] * tvec[1]);
+ mat[4] = 1 - (tvec[1] * tvec[1]);
+ mat[5] = -(tvec[1] * tvec[2]);
+ mat[6] = -(tvec[0] * tvec[2]);
+ mat[7] = -(tvec[1] * tvec[2]);
+ mat[8] = 1 - (tvec[2] * tvec[2]);
}
}
if(matSize == 4) {
- //resize matrix
- mat[10] = mat[8];
- mat[9] = mat[7];
- mat[8] = mat[6];
- mat[7] = 0.0f;
- mat[6] = mat[5];
- mat[5] = mat[4];
- mat[4] = mat[3];
- mat[3] = 0.0f;
+ matrix_3x3_as_4x4(mat);
}
//pass to matrix creation
return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
}
static char C_Matrix_Shear_doc[] =
-".. classmethod:: Shear(plane, factor, size)\n"
+".. classmethod:: Shear(plane, size, factor)\n"
"\n"
" Create a matrix to represent an shear transformation.\n"
"\n"
-" :arg plane: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ'], where a single axis is for a 2D matrix.\n"
+" :arg plane: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ'], where a single axis is for a 2D matrix only.\n"
" :type plane: string\n"
-" :arg factor: The factor of shear to apply.\n"
-" :type factor: float\n"
" :arg size: The size of the shear matrix to construct [2, 4].\n"
" :type size: int\n"
+" :arg factor: The factor of shear to apply. For a 3 or 4 *size* matrix pass a pair of floats corrasponding with the *plane* axis.\n"
+" :type factor: float or float pair\n"
" :return: A new shear matrix.\n"
-" :rtype: :class:`Matrix`\n";
-
+" :rtype: :class:`Matrix`\n"
+;
static PyObject *C_Matrix_Shear(PyObject *cls, PyObject *args)
{
int matSize;
- char *plane;
- float factor;
+ const char *plane;
+ PyObject *fac;
float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
- if(!PyArg_ParseTuple(args, "sfi", &plane, &factor, &matSize)) {
- PyErr_SetString(PyExc_TypeError,"mathutils.ShearMatrix(): expected string float and int\n");
+ if(!PyArg_ParseTuple(args, "siO:Matrix.Shear", &plane, &matSize, &fac)) {
return NULL;
}
if(matSize != 2 && matSize != 3 && matSize != 4) {
- PyErr_SetString(PyExc_AttributeError,"mathutils.ShearMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n");
+ PyErr_SetString(PyExc_AttributeError,"mathutils.Matrix.Shear(): can only return a 2x2 3x3 or 4x4 matrix");
return NULL;
}
- if((strcmp(plane, "X") == 0)
- && matSize == 2) {
- mat[0] = 1.0f;
- mat[2] = factor;
- mat[3] = 1.0f;
- } else if((strcmp(plane, "Y") == 0) && matSize == 2) {
+ if(matSize == 2) {
+ float const factor= PyFloat_AsDouble(fac);
+
+ if(factor==-1.0 && PyErr_Occurred()) {
+ PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix.Shear(): the factor to be a float");
+ return NULL;
+ }
+
+ /* unit */
mat[0] = 1.0f;
- mat[1] = factor;
mat[3] = 1.0f;
- } else if((strcmp(plane, "XY") == 0) && matSize > 2) {
- mat[0] = 1.0f;
- mat[4] = 1.0f;
- mat[6] = factor;
- mat[7] = factor;
- } else if((strcmp(plane, "XZ") == 0) && matSize > 2) {
- mat[0] = 1.0f;
- mat[3] = factor;
- mat[4] = 1.0f;
- mat[5] = factor;
- mat[8] = 1.0f;
- } else if((strcmp(plane, "YZ") == 0) && matSize > 2) {
+
+ if(strcmp(plane, "X") == 0) {
+ mat[2] = factor;
+ }
+ else if(strcmp(plane, "Y") == 0) {
+ mat[1] = factor;
+ }
+ else {
+ PyErr_SetString(PyExc_AttributeError, "Matrix.Shear(): expected: X, Y or wrong matrix size for shearing plane");
+ return NULL;
+ }
+ }
+ else {
+ /* 3 or 4, apply as 3x3, resize later if needed */
+ float factor[2];
+
+ if(mathutils_array_parse(factor, 2, 2, fac, "Matrix.Shear()") < 0) {
+ return NULL;
+ }
+
+ /* unit */
mat[0] = 1.0f;
- mat[1] = factor;
- mat[2] = factor;
mat[4] = 1.0f;
mat[8] = 1.0f;
- } else {
- PyErr_SetString(PyExc_AttributeError, "mathutils.ShearMatrix(): expected: x, y, xy, xz, yz or wrong matrix size for shearing plane\n");
- return NULL;
+
+ if(strcmp(plane, "XY") == 0) {
+ mat[6] = factor[0];
+ mat[7] = factor[1];
+ }
+ else if(strcmp(plane, "XZ") == 0) {
+ mat[3] = factor[0];
+ mat[5] = factor[1];
+ }
+ else if(strcmp(plane, "YZ") == 0) {
+ mat[1] = factor[0];
+ mat[2] = factor[1];
+ }
+ else {
+ PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix.Shear(): expected: X, Y, XY, XZ, YZ");
+ return NULL;
+ }
}
+
if(matSize == 4) {
- //resize matrix
- mat[10] = mat[8];
- mat[9] = mat[7];
- mat[8] = mat[6];
- mat[7] = 0.0f;
- mat[6] = mat[5];
- mat[5] = mat[4];
- mat[4] = mat[3];
- mat[3] = 0.0f;
+ matrix_3x3_as_4x4(mat);
}
//pass to matrix creation
return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
}
+void matrix_as_3x3(float mat[3][3], MatrixObject *self)
+{
+ copy_v3_v3(mat[0], self->matrix[0]);
+ copy_v3_v3(mat[1], self->matrix[1]);
+ copy_v3_v3(mat[2], self->matrix[2]);
+}
+
/* assumes rowsize == colsize is checked and the read callback has run */
-static float matrix_determinant(MatrixObject * self)
+static float matrix_determinant_internal(MatrixObject *self)
{
- if(self->rowSize == 2) {
+ if(self->row_size == 2) {
return determinant_m2(self->matrix[0][0], self->matrix[0][1],
self->matrix[1][0], self->matrix[1][1]);
- } else if(self->rowSize == 3) {
+ } else if(self->row_size == 3) {
return determinant_m3(self->matrix[0][0], self->matrix[0][1],
self->matrix[0][2], self->matrix[1][0],
self->matrix[1][1], self->matrix[1][2],
@@ -632,37 +616,37 @@ static float matrix_determinant(MatrixObject * self)
/*-----------------------------METHODS----------------------------*/
-static char Matrix_toQuat_doc[] =
-".. method:: to_quat()\n"
+static char Matrix_to_quaternion_doc[] =
+".. method:: to_quaternion()\n"
"\n"
" Return a quaternion representation of the rotation matrix.\n"
"\n"
" :return: Quaternion representation of the rotation matrix.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Matrix_toQuat(MatrixObject * self)
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Matrix_to_quaternion(MatrixObject *self)
{
float quat[4];
if(!BaseMath_ReadCallback(self))
return NULL;
-
+
/*must be 3-4 cols, 3-4 rows, square matrix*/
- if(self->colSize < 3 || self->rowSize < 3 || (self->colSize != self->rowSize)) {
+ if((self->col_size < 3) || (self->row_size < 3) || (self->col_size != self->row_size)) {
PyErr_SetString(PyExc_AttributeError, "Matrix.to_quat(): inappropriate matrix size - expects 3x3 or 4x4 matrix");
return NULL;
- }
- if(self->colSize == 3){
+ }
+ if(self->col_size == 3){
mat3_to_quat( quat,(float (*)[3])self->contigPtr);
}else{
mat4_to_quat( quat,(float (*)[4])self->contigPtr);
}
-
+
return newQuaternionObject(quat, Py_NEW, NULL);
}
/*---------------------------Matrix.toEuler() --------------------*/
-static char Matrix_toEuler_doc[] =
+static char Matrix_to_euler_doc[] =
".. method:: to_euler(order, euler_compat)\n"
"\n"
" Return an Euler representation of the rotation matrix (3x3 or 4x4 matrix only).\n"
@@ -672,39 +656,39 @@ static char Matrix_toEuler_doc[] =
" :arg euler_compat: Optional euler argument the new euler will be made compatible with (no axis flipping between them). Useful for converting a series of matrices to animation curves.\n"
" :type euler_compat: :class:`Euler`\n"
" :return: Euler representation of the matrix.\n"
-" :rtype: :class:`Euler`\n";
-
-PyObject *Matrix_toEuler(MatrixObject * self, PyObject *args)
+" :rtype: :class:`Euler`\n"
+;
+static PyObject *Matrix_to_euler(MatrixObject *self, PyObject *args)
{
- char *order_str= NULL;
+ const char *order_str= NULL;
short order= EULER_ORDER_XYZ;
float eul[3], eul_compatf[3];
EulerObject *eul_compat = NULL;
float tmat[3][3];
float (*mat)[3];
-
+
if(!BaseMath_ReadCallback(self))
return NULL;
-
+
if(!PyArg_ParseTuple(args, "|sO!:to_euler", &order_str, &euler_Type, &eul_compat))
return NULL;
-
+
if(eul_compat) {
if(!BaseMath_ReadCallback(eul_compat))
return NULL;
copy_v3_v3(eul_compatf, eul_compat->eul);
}
-
+
/*must be 3-4 cols, 3-4 rows, square matrix*/
- if(self->colSize ==3 && self->rowSize ==3) {
+ if(self->col_size ==3 && self->row_size ==3) {
mat= (float (*)[3])self->contigPtr;
- }else if (self->colSize ==4 && self->rowSize ==4) {
+ }else if (self->col_size ==4 && self->row_size ==4) {
copy_m3_m4(tmat, (float (*)[4])self->contigPtr);
mat= tmat;
}else {
- PyErr_SetString(PyExc_AttributeError, "Matrix.to_euler(): inappropriate matrix size - expects 3x3 or 4x4 matrix\n");
+ PyErr_SetString(PyExc_AttributeError, "Matrix.to_euler(): inappropriate matrix size - expects 3x3 or 4x4 matrix");
return NULL;
}
@@ -726,16 +710,13 @@ PyObject *Matrix_toEuler(MatrixObject * self, PyObject *args)
return newEulerObject(eul, order, Py_NEW, NULL);
}
-/*---------------------------Matrix.resize4x4() ------------------*/
-static char Matrix_Resize4x4_doc[] =
-".. method:: resize4x4()\n"
+
+static char Matrix_resize_4x4_doc[] =
+".. method:: resize_4x4()\n"
"\n"
" Resize the matrix to 4x4.\n"
-"\n"
-" :return: an instance of itself.\n"
-" :rtype: :class:`Matrix`\n";
-
-PyObject *Matrix_Resize4x4(MatrixObject * self)
+;
+static PyObject *Matrix_resize_4x4(MatrixObject *self)
{
int x, first_row_elem, curr_pos, new_pos, blank_columns, blank_rows, index;
@@ -747,10 +728,10 @@ PyObject *Matrix_Resize4x4(MatrixObject * self)
PyErr_SetString(PyExc_TypeError, "cannot resize owned data - make a copy and resize that");
return NULL;
}
-
+
self->contigPtr = PyMem_Realloc(self->contigPtr, (sizeof(float) * 16));
if(self->contigPtr == NULL) {
- PyErr_SetString(PyExc_MemoryError, "matrix.resize4x4(): problem allocating pointer space");
+ PyErr_SetString(PyExc_MemoryError, "matrix.resize_4x4(): problem allocating pointer space");
return NULL;
}
/*set row pointers*/
@@ -758,9 +739,9 @@ PyObject *Matrix_Resize4x4(MatrixObject * self)
self->matrix[x] = self->contigPtr + (x * 4);
}
/*move data to new spot in array + clean*/
- for(blank_rows = (4 - self->rowSize); blank_rows > 0; blank_rows--){
+ for(blank_rows = (4 - self->row_size); blank_rows > 0; blank_rows--){
for(x = 0; x < 4; x++){
- index = (4 * (self->rowSize + (blank_rows - 1))) + x;
+ index = (4 * (self->row_size + (blank_rows - 1))) + x;
if (index == 10 || index == 15){
self->contigPtr[index] = 1.0f;
}else{
@@ -768,11 +749,11 @@ PyObject *Matrix_Resize4x4(MatrixObject * self)
}
}
}
- for(x = 1; x <= self->rowSize; x++){
- first_row_elem = (self->colSize * (self->rowSize - x));
- curr_pos = (first_row_elem + (self->colSize -1));
- new_pos = (4 * (self->rowSize - x )) + (curr_pos - first_row_elem);
- for(blank_columns = (4 - self->colSize); blank_columns > 0; blank_columns--){
+ for(x = 1; x <= self->row_size; x++){
+ first_row_elem = (self->col_size * (self->row_size - x));
+ curr_pos = (first_row_elem + (self->col_size -1));
+ new_pos = (4 * (self->row_size - x )) + (curr_pos - first_row_elem);
+ for(blank_columns = (4 - self->col_size); blank_columns > 0; blank_columns--){
self->contigPtr[new_pos + blank_columns] = 0.0f;
}
for(curr_pos = curr_pos; curr_pos >= first_row_elem; curr_pos--){
@@ -780,11 +761,10 @@ PyObject *Matrix_Resize4x4(MatrixObject * self)
new_pos--;
}
}
- self->rowSize = 4;
- self->colSize = 4;
-
- Py_INCREF(self);
- return (PyObject *)self;
+ self->row_size = 4;
+ self->col_size = 4;
+
+ Py_RETURN_NONE;
}
static char Matrix_to_4x4_doc[] =
@@ -793,16 +773,17 @@ static char Matrix_to_4x4_doc[] =
" Return a 4x4 copy of this matrix.\n"
"\n"
" :return: a new matrix.\n"
-" :rtype: :class:`Matrix`\n";
-PyObject *Matrix_to_4x4(MatrixObject * self)
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *Matrix_to_4x4(MatrixObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
- if(self->colSize==4 && self->rowSize==4) {
+ if(self->col_size==4 && self->row_size==4) {
return (PyObject *)newMatrixObject(self->contigPtr, 4, 4, Py_NEW, Py_TYPE(self));
}
- else if(self->colSize==3 && self->rowSize==3) {
+ else if(self->col_size==3 && self->row_size==3) {
float mat[4][4];
copy_m4_m3(mat, (float (*)[3])self->contigPtr);
return (PyObject *)newMatrixObject((float *)mat, 4, 4, Py_NEW, Py_TYPE(self));
@@ -819,126 +800,81 @@ static char Matrix_to_3x3_doc[] =
" Return a 3x3 copy of this matrix.\n"
"\n"
" :return: a new matrix.\n"
-" :rtype: :class:`Matrix`\n";
-PyObject *Matrix_to_3x3(MatrixObject * self)
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *Matrix_to_3x3(MatrixObject *self)
{
+ float mat[3][3];
+
if(!BaseMath_ReadCallback(self))
return NULL;
- if(self->colSize==3 && self->rowSize==3) {
- return (PyObject *)newMatrixObject(self->contigPtr, 3, 3, Py_NEW, Py_TYPE(self));
- }
- else if(self->colSize==4 && self->rowSize==4) {
- float mat[3][3];
- copy_m3_m4(mat, (float (*)[4])self->contigPtr);
- return (PyObject *)newMatrixObject((float *)mat, 3, 3, Py_NEW, Py_TYPE(self));
+ if((self->col_size < 3) || (self->row_size < 3)) {
+ PyErr_SetString(PyExc_AttributeError, "Matrix.to_3x3(): inappropriate matrix size");
+ return NULL;
}
- /* TODO, 2x2 matrix */
- PyErr_SetString(PyExc_TypeError, "Matrix.to_3x3(): inappropriate matrix size");
- return NULL;
+ matrix_as_3x3(mat, self);
+
+ return newMatrixObject((float *)mat, 3, 3, Py_NEW, Py_TYPE(self));
}
-/*---------------------------Matrix.translationPart() ------------*/
-static char Matrix_TranslationPart_doc[] =
-".. method:: translation_part()\n"
+static char Matrix_to_translation_doc[] =
+".. method:: to_translation()\n"
"\n"
" Return a the translation part of a 4 row matrix.\n"
"\n"
" :return: Return a the translation of a matrix.\n"
-" :rtype: :class:`Matrix`\n"
-"\n"
-" .. note:: Note that the (4,4) element of a matrix can be used for uniform scaling too.\n";
-
-PyObject *Matrix_TranslationPart(MatrixObject * self)
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Matrix_to_translation(MatrixObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
-
- if(self->colSize < 3 || self->rowSize < 4){
- PyErr_SetString(PyExc_AttributeError, "Matrix.translation_part(): inappropriate matrix size");
+
+ if((self->col_size < 3) || self->row_size < 4){
+ PyErr_SetString(PyExc_AttributeError, "Matrix.to_translation(): inappropriate matrix size");
return NULL;
}
return newVectorObject(self->matrix[3], 3, Py_NEW, NULL);
}
-/*---------------------------Matrix.rotationPart() ---------------*/
-static char Matrix_RotationPart_doc[] =
-".. method:: rotation_part()\n"
+
+static char Matrix_to_scale_doc[] =
+".. method:: to_scale()\n"
"\n"
-" Return the 3d submatrix corresponding to the linear term of the embedded affine transformation in 3d. This matrix represents rotation and scale.\n"
+" Return a the scale part of a 3x3 or 4x4 matrix.\n"
"\n"
-" :return: Return the 3d matrix for rotation and scale.\n"
-" :rtype: :class:`Matrix`\n"
+" :return: Return a the scale of a matrix.\n"
+" :rtype: :class:`Vector`\n"
"\n"
-" .. note:: Note that the (4,4) element of a matrix can be used for uniform scaling too.\n";
-
-PyObject *Matrix_RotationPart(MatrixObject * self)
+" .. note:: This method does not return negative a scale on any axis because it is not possible to obtain this data from the matrix alone.\n"
+;
+static PyObject *Matrix_to_scale(MatrixObject *self)
{
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
+ float rot[3][3];
+ float mat[3][3];
+ float size[3];
if(!BaseMath_ReadCallback(self))
return NULL;
- if(self->colSize < 3 || self->rowSize < 3){
- PyErr_SetString(PyExc_AttributeError, "Matrix.rotation_part(): inappropriate matrix size\n");
+ /*must be 3-4 cols, 3-4 rows, square matrix*/
+ if((self->col_size < 3) || (self->row_size < 3)) {
+ PyErr_SetString(PyExc_AttributeError, "Matrix.to_scale(): inappropriate matrix size, 3x3 minimum size");
return NULL;
}
- mat[0] = self->matrix[0][0];
- mat[1] = self->matrix[0][1];
- mat[2] = self->matrix[0][2];
- mat[3] = self->matrix[1][0];
- mat[4] = self->matrix[1][1];
- mat[5] = self->matrix[1][2];
- mat[6] = self->matrix[2][0];
- mat[7] = self->matrix[2][1];
- mat[8] = self->matrix[2][2];
+ matrix_as_3x3(mat, self);
- return newMatrixObject(mat, 3, 3, Py_NEW, Py_TYPE(self));
-}
-/*---------------------------Matrix.scalePart() --------------------*/
-static char Matrix_scalePart_doc[] =
-".. method:: scale_part()\n"
-"\n"
-" Return a the scale part of a 3x3 or 4x4 matrix.\n"
-"\n"
-" :return: Return a the scale of a matrix.\n"
-" :rtype: :class:`Vector`\n"
-"\n"
-" .. note:: This method does not return negative a scale on any axis because it is not possible to obtain this data from the matrix alone.\n";
+ /* compatible mat4_to_loc_rot_size */
+ mat3_to_rot_size(rot, size, mat);
-PyObject *Matrix_scalePart(MatrixObject * self)
-{
- float scale[3], rot[3];
- float mat[3][3], imat[3][3], tmat[3][3];
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- /*must be 3-4 cols, 3-4 rows, square matrix*/
- if(self->colSize == 4 && self->rowSize == 4)
- copy_m3_m4(mat, (float (*)[4])self->contigPtr);
- else if(self->colSize == 3 && self->rowSize == 3)
- copy_m3_m3(mat, (float (*)[3])self->contigPtr);
- else {
- PyErr_SetString(PyExc_AttributeError, "Matrix.scale_part(): inappropriate matrix size - expects 3x3 or 4x4 matrix\n");
- return NULL;
- }
- /* functionality copied from editobject.c apply_obmat */
- mat3_to_eul( rot,mat);
- eul_to_mat3( tmat,rot);
- invert_m3_m3(imat, tmat);
- mul_m3_m3m3(tmat, imat, mat);
-
- scale[0]= tmat[0][0];
- scale[1]= tmat[1][1];
- scale[2]= tmat[2][2];
- return newVectorObject(scale, 3, Py_NEW, NULL);
+ return newVectorObject(size, 3, Py_NEW, NULL);
}
+
/*---------------------------Matrix.invert() ---------------------*/
-static char Matrix_Invert_doc[] =
+static char Matrix_invert_doc[] =
".. method:: invert()\n"
"\n"
" Set the matrix to its inverse.\n"
@@ -948,11 +884,11 @@ static char Matrix_Invert_doc[] =
"\n"
" .. note:: :exc:`ValueError` exception is raised.\n"
"\n"
-" .. seealso:: <http://en.wikipedia.org/wiki/Inverse_matrix>\n";
-
-PyObject *Matrix_Invert(MatrixObject * self)
+" .. seealso:: <http://en.wikipedia.org/wiki/Inverse_matrix>\n"
+;
+static PyObject *Matrix_invert(MatrixObject *self)
{
-
+
int x, y, z = 0;
float det = 0.0f;
float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
@@ -961,52 +897,180 @@ PyObject *Matrix_Invert(MatrixObject * self)
if(!BaseMath_ReadCallback(self))
return NULL;
- if(self->rowSize != self->colSize){
+ if(self->row_size != self->col_size){
PyErr_SetString(PyExc_AttributeError, "Matrix.invert(ed): only square matrices are supported");
return NULL;
}
/*calculate the determinant*/
- det = matrix_determinant(self);
+ det = matrix_determinant_internal(self);
if(det != 0) {
/*calculate the classical adjoint*/
- if(self->rowSize == 2) {
+ if(self->row_size == 2) {
mat[0] = self->matrix[1][1];
mat[1] = -self->matrix[0][1];
mat[2] = -self->matrix[1][0];
mat[3] = self->matrix[0][0];
- } else if(self->rowSize == 3) {
+ } else if(self->row_size == 3) {
adjoint_m3_m3((float (*)[3]) mat,(float (*)[3])self->contigPtr);
- } else if(self->rowSize == 4) {
+ } else if(self->row_size == 4) {
adjoint_m4_m4((float (*)[4]) mat, (float (*)[4])self->contigPtr);
}
/*divide by determinate*/
- for(x = 0; x < (self->rowSize * self->colSize); x++) {
+ for(x = 0; x < (self->row_size * self->col_size); x++) {
mat[x] /= det;
}
/*set values*/
- for(x = 0; x < self->rowSize; x++) {
- for(y = 0; y < self->colSize; y++) {
+ for(x = 0; x < self->row_size; x++) {
+ for(y = 0; y < self->col_size; y++) {
self->matrix[x][y] = mat[z];
z++;
}
}
/*transpose
- Matrix_Transpose(self);*/
+ Matrix_transpose(self);*/
} else {
PyErr_SetString(PyExc_ValueError, "matrix does not have an inverse");
return NULL;
}
-
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject *)self;
+
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
+}
+
+static char Matrix_inverted_doc[] =
+".. method:: inverted()\n"
+"\n"
+" Return an inverted copy of the matrix.\n"
+"\n"
+" :return: the inverted matrix.\n"
+" :rtype: :class:`Matrix`\n"
+"\n"
+" .. note:: :exc:`ValueError` exception is raised.\n"
+;
+static PyObject *Matrix_inverted(MatrixObject *self)
+{
+ return matrix__apply_to_copy((PyNoArgsFunction)Matrix_invert, self);
}
+static char Matrix_rotate_doc[] =
+".. method:: rotate(other)\n"
+"\n"
+" Rotates the matrix a by another mathutils value.\n"
+"\n"
+" :arg other: rotation component of mathutils value\n"
+" :type other: :class:`Euler`, :class:`Quaternion` or :class:`Matrix`\n"
+"\n"
+" .. note:: If any of the columns are not unit length this may not have desired results.\n"
+;
+static PyObject *Matrix_rotate(MatrixObject *self, PyObject *value)
+{
+ float self_rmat[3][3], other_rmat[3][3], rmat[3][3];
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(mathutils_any_to_rotmat(other_rmat, value, "matrix.rotate(value)") == -1)
+ return NULL;
+
+ if(self->col_size != 3 || self->row_size != 3) {
+ PyErr_SetString(PyExc_ValueError, "Matrix must have 3x3 dimensions");
+ return NULL;
+ }
+
+ matrix_as_3x3(self_rmat, self);
+ mul_m3_m3m3(rmat, self_rmat, other_rmat);
+
+ copy_m3_m3((float (*)[3])(self->contigPtr), rmat);
+
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
+}
+
+/*---------------------------Matrix.decompose() ---------------------*/
+static char Matrix_decompose_doc[] =
+".. method:: decompose()\n"
+"\n"
+" Return the location, rotaion and scale components of this matrix.\n"
+"\n"
+" :return: loc, rot, scale triple.\n"
+" :rtype: (:class:`Vector`, :class:`Quaternion`, :class:`Vector`)"
+;
+static PyObject *Matrix_decompose(MatrixObject *self)
+{
+ PyObject *ret;
+ float loc[3];
+ float rot[3][3];
+ float quat[4];
+ float size[3];
+
+ if(self->col_size != 4 || self->row_size != 4) {
+ PyErr_SetString(PyExc_AttributeError, "Matrix.decompose(): inappropriate matrix size - expects 4x4 matrix");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ mat4_to_loc_rot_size(loc, rot, size, (float (*)[4])self->contigPtr);
+ mat3_to_quat(quat, rot);
+
+ ret= PyTuple_New(3);
+ PyTuple_SET_ITEM(ret, 0, newVectorObject(loc, 3, Py_NEW, NULL));
+ PyTuple_SET_ITEM(ret, 1, newQuaternionObject(quat, Py_NEW, NULL));
+ PyTuple_SET_ITEM(ret, 2, newVectorObject(size, 3, Py_NEW, NULL));
+
+ return ret;
+}
+
+
+
+static char Matrix_lerp_doc[] =
+".. function:: lerp(other, factor)\n"
+"\n"
+" Returns the interpolation of two matricies.\n"
+"\n"
+" :arg other: value to interpolate with.\n"
+" :type other: :class:`Matrix`\n"
+" :arg factor: The interpolation value in [0.0, 1.0].\n"
+" :type factor: float\n"
+" :return: The interpolated rotation.\n"
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *Matrix_lerp(MatrixObject *self, PyObject *args)
+{
+ MatrixObject *mat2 = NULL;
+ float fac, mat[MATRIX_MAX_DIM*MATRIX_MAX_DIM];
+
+ if(!PyArg_ParseTuple(args, "O!f:lerp", &matrix_Type, &mat2, &fac))
+ return NULL;
+
+ if(self->row_size != mat2->row_size || self->col_size != mat2->col_size) {
+ PyErr_SetString(PyExc_AttributeError, "matrix.lerp(): expects both matrix objects of the same dimensions");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(mat2))
+ return NULL;
+
+ /* TODO, different sized matrix */
+ if(self->row_size==4 && self->col_size==4) {
+ blend_m4_m4m4((float (*)[4])mat, (float (*)[4])self->contigPtr, (float (*)[4])mat2->contigPtr, fac);
+ }
+ else if (self->row_size==3 && self->col_size==3) {
+ blend_m3_m3m3((float (*)[3])mat, (float (*)[3])self->contigPtr, (float (*)[3])mat2->contigPtr, fac);
+ }
+ else {
+ PyErr_SetString(PyExc_AttributeError, "matrix.lerp(): only 3x3 and 4x4 matrices supported");
+ return NULL;
+ }
+
+ return (PyObject*)newMatrixObject(mat, self->row_size, self->col_size, Py_NEW, Py_TYPE(self));
+}
/*---------------------------Matrix.determinant() ----------------*/
-static char Matrix_Determinant_doc[] =
+static char Matrix_determinant_doc[] =
".. method:: determinant()\n"
"\n"
" Return the determinant of a matrix.\n"
@@ -1014,113 +1078,111 @@ static char Matrix_Determinant_doc[] =
" :return: Return a the determinant of a matrix.\n"
" :rtype: float\n"
"\n"
-" .. seealso:: <http://en.wikipedia.org/wiki/Determinant>\n";
-
-PyObject *Matrix_Determinant(MatrixObject * self)
+" .. seealso:: <http://en.wikipedia.org/wiki/Determinant>\n"
+;
+static PyObject *Matrix_determinant(MatrixObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
-
- if(self->rowSize != self->colSize){
+
+ if(self->row_size != self->col_size){
PyErr_SetString(PyExc_AttributeError, "Matrix.determinant: only square matrices are supported");
return NULL;
}
- return PyFloat_FromDouble((double)matrix_determinant(self));
+ return PyFloat_FromDouble((double)matrix_determinant_internal(self));
}
/*---------------------------Matrix.transpose() ------------------*/
-static char Matrix_Transpose_doc[] =
+static char Matrix_transpose_doc[] =
".. method:: transpose()\n"
"\n"
" Set the matrix to its transpose.\n"
"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Matrix`\n"
-"\n"
-" .. seealso:: <http://en.wikipedia.org/wiki/Transpose>\n";
-
-PyObject *Matrix_Transpose(MatrixObject * self)
+" .. seealso:: <http://en.wikipedia.org/wiki/Transpose>\n"
+;
+static PyObject *Matrix_transpose(MatrixObject *self)
{
float t = 0.0f;
if(!BaseMath_ReadCallback(self))
return NULL;
-
- if(self->rowSize != self->colSize){
+
+ if(self->row_size != self->col_size){
PyErr_SetString(PyExc_AttributeError, "Matrix.transpose(d): only square matrices are supported");
return NULL;
}
- if(self->rowSize == 2) {
+ if(self->row_size == 2) {
t = self->matrix[1][0];
self->matrix[1][0] = self->matrix[0][1];
self->matrix[0][1] = t;
- } else if(self->rowSize == 3) {
+ } else if(self->row_size == 3) {
transpose_m3((float (*)[3])self->contigPtr);
} else {
transpose_m4((float (*)[4])self->contigPtr);
}
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject *)self;
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
+static char Matrix_transposed_doc[] =
+".. method:: transposed()\n"
+"\n"
+" Return a new, transposed matrix.\n"
+"\n"
+" :return: a transposed matrix\n"
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *Matrix_transposed(MatrixObject *self)
+{
+ return matrix__apply_to_copy((PyNoArgsFunction)Matrix_transpose, self);
+}
/*---------------------------Matrix.zero() -----------------------*/
-static char Matrix_Zero_doc[] =
+static char Matrix_zero_doc[] =
".. method:: zero()\n"
"\n"
" Set all the matrix values to zero.\n"
"\n"
" :return: an instance of itself\n"
-" :rtype: :class:`Matrix`\n";
-
-PyObject *Matrix_Zero(MatrixObject * self)
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *Matrix_zero(MatrixObject *self)
{
- int row, col;
-
- for(row = 0; row < self->rowSize; row++) {
- for(col = 0; col < self->colSize; col++) {
- self->matrix[row][col] = 0.0f;
- }
- }
-
+ fill_vn(self->contigPtr, self->row_size * self->col_size, 0.0f);
+
if(!BaseMath_WriteCallback(self))
return NULL;
-
- Py_INCREF(self);
- return (PyObject *)self;
+
+ Py_RETURN_NONE;
}
/*---------------------------Matrix.identity(() ------------------*/
-static char Matrix_Identity_doc[] =
+static char Matrix_identity_doc[] =
".. method:: identity()\n"
"\n"
" Set the matrix to the identity matrix.\n"
"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Matrix`\n"
-"\n"
" .. note:: An object with zero location and rotation, a scale of one, will have an identity matrix.\n"
"\n"
-" .. seealso:: <http://en.wikipedia.org/wiki/Identity_matrix>\n";
-
-PyObject *Matrix_Identity(MatrixObject * self)
+" .. seealso:: <http://en.wikipedia.org/wiki/Identity_matrix>\n"
+;
+static PyObject *Matrix_identity(MatrixObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
-
- if(self->rowSize != self->colSize){
- PyErr_SetString(PyExc_AttributeError, "Matrix.identity: only square matrices are supported\n");
+
+ if(self->row_size != self->col_size){
+ PyErr_SetString(PyExc_AttributeError, "Matrix.identity: only square matrices are supported");
return NULL;
}
- if(self->rowSize == 2) {
+ if(self->row_size == 2) {
self->matrix[0][0] = 1.0f;
self->matrix[0][1] = 0.0f;
self->matrix[1][0] = 0.0f;
self->matrix[1][1] = 1.0f;
- } else if(self->rowSize == 3) {
+ } else if(self->row_size == 3) {
unit_m3((float (*)[3])self->contigPtr);
} else {
unit_m4((float (*)[4])self->contigPtr);
@@ -1128,9 +1190,8 @@ PyObject *Matrix_Identity(MatrixObject * self)
if(!BaseMath_WriteCallback(self))
return NULL;
-
- Py_INCREF(self);
- return (PyObject *)self;
+
+ Py_RETURN_NONE;
}
/*---------------------------Matrix.copy() ------------------*/
@@ -1140,346 +1201,273 @@ static char Matrix_copy_doc[] =
" Returns a copy of this matrix.\n"
"\n"
" :return: an instance of itself\n"
-" :rtype: :class:`Matrix`\n";
-
-PyObject *Matrix_copy(MatrixObject * self)
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *Matrix_copy(MatrixObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
-
- return (PyObject*)newMatrixObject((float (*))self->contigPtr, self->rowSize, self->colSize, Py_NEW, Py_TYPE(self));
+
+ return (PyObject*)newMatrixObject((float (*))self->contigPtr, self->row_size, self->col_size, Py_NEW, Py_TYPE(self));
}
/*----------------------------print object (internal)-------------*/
/*print the object to screen*/
-static PyObject *Matrix_repr(MatrixObject * self)
+static PyObject *Matrix_repr(MatrixObject *self)
{
int x, y;
- char str[1024]="Matrix((", *str_p;
+ PyObject *rows[MATRIX_MAX_DIM]= {0};
if(!BaseMath_ReadCallback(self))
return NULL;
- str_p= &str[8];
-
- for(x = 0; x < self->colSize; x++){
- for(y = 0; y < (self->rowSize - 1); y++) {
- str_p += sprintf(str_p, "%f, ", self->matrix[y][x]);
- }
- if(x < (self->colSize-1)){
- str_p += sprintf(str_p, "%f), (", self->matrix[y][x]);
- }
- else{
- str_p += sprintf(str_p, "%f)", self->matrix[y][x]);
+ for(x = 0; x < self->row_size; x++){
+ rows[x]= PyTuple_New(self->col_size);
+ for(y = 0; y < self->col_size; y++) {
+ PyTuple_SET_ITEM(rows[x], y, PyFloat_FromDouble(self->matrix[x][y]));
}
}
- strcat(str_p, ")");
+ switch(self->row_size) {
+ case 2: return PyUnicode_FromFormat("Matrix(%R,\n"
+ " %R)", rows[0], rows[1]);
+
+ case 3: return PyUnicode_FromFormat("Matrix(%R,\n"
+ " %R,\n"
+ " %R)", rows[0], rows[1], rows[2]);
+
+ case 4: return PyUnicode_FromFormat("Matrix(%R,\n"
+ " %R,\n"
+ " %R,\n"
+ " %R)", rows[0], rows[1], rows[2], rows[3]);
+ }
- return PyUnicode_FromString(str);
+ PyErr_SetString(PyExc_RuntimeError, "invalid matrix size");
+ return NULL;
}
-/*------------------------tp_richcmpr*/
-/*returns -1 execption, 0 false, 1 true*/
-static PyObject* Matrix_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type)
+
+static PyObject* Matrix_richcmpr(PyObject *a, PyObject *b, int op)
{
- MatrixObject *matA = NULL, *matB = NULL;
- int result = 0;
-
- if (!MatrixObject_Check(objectA) || !MatrixObject_Check(objectB)){
- if (comparison_type == Py_NE){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
- }
+ PyObject *res;
+ int ok= -1; /* zero is true */
+
+ if (MatrixObject_Check(a) && MatrixObject_Check(b)) {
+ MatrixObject *matA= (MatrixObject*)a;
+ MatrixObject *matB= (MatrixObject*)b;
+
+ if(!BaseMath_ReadCallback(matA) || !BaseMath_ReadCallback(matB))
+ return NULL;
+
+ ok= ( (matA->col_size == matB->col_size) &&
+ (matA->row_size == matB->row_size) &&
+ EXPP_VectorsAreEqual(matA->contigPtr, matB->contigPtr, (matA->row_size * matA->col_size), 1)
+ ) ? 0 : -1;
}
- matA = (MatrixObject*)objectA;
- matB = (MatrixObject*)objectB;
- if(!BaseMath_ReadCallback(matA) || !BaseMath_ReadCallback(matB))
+ switch (op) {
+ case Py_NE:
+ ok = !ok; /* pass through */
+ case Py_EQ:
+ res = ok ? Py_False : Py_True;
+ break;
+
+ case Py_LT:
+ case Py_LE:
+ case Py_GT:
+ case Py_GE:
+ res = Py_NotImplemented;
+ break;
+ default:
+ PyErr_BadArgument();
return NULL;
-
- if (matA->colSize != matB->colSize || matA->rowSize != matB->rowSize){
- if (comparison_type == Py_NE){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
- }
}
- switch (comparison_type){
- case Py_EQ:
- /*contigPtr is basically a really long vector*/
- result = EXPP_VectorsAreEqual(matA->contigPtr, matB->contigPtr,
- (matA->rowSize * matA->colSize), 1);
- break;
- case Py_NE:
- result = EXPP_VectorsAreEqual(matA->contigPtr, matB->contigPtr,
- (matA->rowSize * matA->colSize), 1);
- if (result == 0){
- result = 1;
- }else{
- result = 0;
- }
- break;
- default:
- printf("The result of the comparison could not be evaluated");
- break;
- }
- if (result == 1){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
- }
+ return Py_INCREF(res), res;
}
/*---------------------SEQUENCE PROTOCOLS------------------------
----------------------------len(object)------------------------
sequence length*/
-static int Matrix_len(MatrixObject * self)
+static int Matrix_len(MatrixObject *self)
{
- return (self->rowSize);
+ return (self->row_size);
}
/*----------------------------object[]---------------------------
sequence accessor (get)
the wrapped vector gives direct access to the matrix data*/
-static PyObject *Matrix_item(MatrixObject * self, int i)
+static PyObject *Matrix_item(MatrixObject *self, int i)
{
if(!BaseMath_ReadCallback(self))
return NULL;
-
- if(i < 0 || i >= self->rowSize) {
+
+ if(i < 0 || i >= self->row_size) {
PyErr_SetString(PyExc_IndexError, "matrix[attribute]: array index out of range");
return NULL;
}
- return newVectorObject_cb((PyObject *)self, self->colSize, mathutils_matrix_vector_cb_index, i);
+ return newVectorObject_cb((PyObject *)self, self->col_size, mathutils_matrix_vector_cb_index, i);
}
/*----------------------------object[]-------------------------
- sequence accessor (set)*/
-static int Matrix_ass_item(MatrixObject * self, int i, PyObject * ob)
+ sequence accessor (set) */
+
+static int Matrix_ass_item(MatrixObject *self, int i, PyObject *value)
{
- int y, x, size = 0;
float vec[4];
- PyObject *m, *f;
-
if(!BaseMath_ReadCallback(self))
return -1;
-
- if(i >= self->rowSize || i < 0){
- PyErr_SetString(PyExc_TypeError, "matrix[attribute] = x: bad column\n");
+
+ if(i >= self->row_size || i < 0){
+ PyErr_SetString(PyExc_TypeError, "matrix[attribute] = x: bad column");
return -1;
}
- if(PySequence_Check(ob)){
- size = PySequence_Length(ob);
- if(size != self->colSize){
- PyErr_SetString(PyExc_TypeError, "matrix[attribute] = x: bad sequence size\n");
- return -1;
- }
- for (x = 0; x < size; x++) {
- m = PySequence_GetItem(ob, x);
- if (m == NULL) { /*Failed to read sequence*/
- PyErr_SetString(PyExc_RuntimeError, "matrix[attribute] = x: unable to read sequence\n");
- return -1;
- }
-
- f = PyNumber_Float(m);
- if(f == NULL) { /*parsed item not a number*/
- Py_DECREF(m);
- PyErr_SetString(PyExc_TypeError, "matrix[attribute] = x: sequence argument not a number\n");
- return -1;
- }
-
- vec[x] = (float)PyFloat_AS_DOUBLE(f);
- Py_DECREF(m);
- Py_DECREF(f);
- }
- /*parsed well - now set in matrix*/
- for(y = 0; y < size; y++){
- self->matrix[i][y] = vec[y];
- }
-
- BaseMath_WriteCallback(self);
- return 0;
- }else{
- PyErr_SetString(PyExc_TypeError, "matrix[attribute] = x: expects a sequence of column size\n");
+ if(mathutils_array_parse(vec, self->col_size, self->col_size, value, "matrix[i] = value assignment") < 0) {
return -1;
}
+
+ memcpy(self->matrix[i], vec, self->col_size *sizeof(float));
+
+ (void)BaseMath_WriteCallback(self);
+ return 0;
}
+
/*----------------------------object[z:y]------------------------
sequence slice (get)*/
-static PyObject *Matrix_slice(MatrixObject * self, int begin, int end)
+static PyObject *Matrix_slice(MatrixObject *self, int begin, int end)
{
- PyObject *list = NULL;
+ PyObject *tuple;
int count;
-
+
if(!BaseMath_ReadCallback(self))
return NULL;
- CLAMP(begin, 0, self->rowSize);
- CLAMP(end, 0, self->rowSize);
- begin = MIN2(begin,end);
+ CLAMP(begin, 0, self->row_size);
+ CLAMP(end, 0, self->row_size);
+ begin= MIN2(begin,end);
- list = PyList_New(end - begin);
- for(count = begin; count < end; count++) {
- PyList_SetItem(list, count - begin,
- newVectorObject_cb((PyObject *)self, self->colSize, mathutils_matrix_vector_cb_index, count));
+ tuple= PyTuple_New(end - begin);
+ for(count= begin; count < end; count++) {
+ PyTuple_SET_ITEM(tuple, count - begin,
+ newVectorObject_cb((PyObject *)self, self->col_size, mathutils_matrix_vector_cb_index, count));
}
- return list;
+ return tuple;
}
/*----------------------------object[z:y]------------------------
sequence slice (set)*/
-static int Matrix_ass_slice(MatrixObject * self, int begin, int end, PyObject * seq)
+static int Matrix_ass_slice(MatrixObject *self, int begin, int end, PyObject *value)
{
- int i, x, y, size, sub_size = 0;
- float mat[16], f;
- PyObject *subseq;
- PyObject *m;
+ PyObject *value_fast= NULL;
if(!BaseMath_ReadCallback(self))
return -1;
-
- CLAMP(begin, 0, self->rowSize);
- CLAMP(end, 0, self->rowSize);
+
+ CLAMP(begin, 0, self->row_size);
+ CLAMP(end, 0, self->row_size);
begin = MIN2(begin,end);
- if(PySequence_Check(seq)){
- size = PySequence_Length(seq);
- if(size != (end - begin)){
- PyErr_SetString(PyExc_TypeError, "matrix[begin:end] = []: size mismatch in slice assignment\n");
+ /* non list/tuple cases */
+ if(!(value_fast=PySequence_Fast(value, "matrix[begin:end] = value"))) {
+ /* PySequence_Fast sets the error */
+ return -1;
+ }
+ else {
+ const int size= end - begin;
+ int i;
+ float mat[16];
+
+ if(PySequence_Fast_GET_SIZE(value_fast) != size) {
+ Py_DECREF(value_fast);
+ PyErr_SetString(PyExc_TypeError, "matrix[begin:end] = []: size mismatch in slice assignment");
return -1;
}
+
/*parse sub items*/
for (i = 0; i < size; i++) {
/*parse each sub sequence*/
- subseq = PySequence_GetItem(seq, i);
- if (subseq == NULL) { /*Failed to read sequence*/
- PyErr_SetString(PyExc_RuntimeError, "matrix[begin:end] = []: unable to read sequence");
- return -1;
- }
+ PyObject *item= PySequence_Fast_GET_ITEM(value_fast, i);
- if(PySequence_Check(subseq)){
- /*subsequence is also a sequence*/
- sub_size = PySequence_Length(subseq);
- if(sub_size != self->colSize){
- Py_DECREF(subseq);
- PyErr_SetString(PyExc_TypeError, "matrix[begin:end] = []: size mismatch in slice assignment\n");
- return -1;
- }
- for (y = 0; y < sub_size; y++) {
- m = PySequence_GetItem(subseq, y);
- if (m == NULL) { /*Failed to read sequence*/
- Py_DECREF(subseq);
- PyErr_SetString(PyExc_RuntimeError, "matrix[begin:end] = []: unable to read sequence\n");
- return -1;
- }
-
- f = PyFloat_AsDouble(m); /* faster to assume a float and raise an error after */
- if(f == -1 && PyErr_Occurred()) { /*parsed item not a number*/
- Py_DECREF(m);
- Py_DECREF(subseq);
- PyErr_SetString(PyExc_TypeError, "matrix[begin:end] = []: sequence argument not a number\n");
- return -1;
- }
-
- mat[(i * self->colSize) + y] = f;
- Py_DECREF(m);
- }
- }else{
- Py_DECREF(subseq);
- PyErr_SetString(PyExc_TypeError, "matrix[begin:end] = []: illegal argument type for built-in operation\n");
+ if(mathutils_array_parse(&mat[i * self->col_size], self->col_size, self->col_size, item, "matrix[begin:end] = value assignment") < 0) {
return -1;
}
- Py_DECREF(subseq);
}
+
+ Py_DECREF(value_fast);
+
/*parsed well - now set in matrix*/
- for(x = 0; x < (size * sub_size); x++){
- self->matrix[begin + (int)floor(x / self->colSize)][x % self->colSize] = mat[x];
- }
-
- BaseMath_WriteCallback(self);
+ memcpy(self->contigPtr + (begin * self->col_size), mat, sizeof(float) * (size * self->col_size));
+
+ (void)BaseMath_WriteCallback(self);
return 0;
- }else{
- PyErr_SetString(PyExc_TypeError, "matrix[begin:end] = []: illegal argument type for built-in operation\n");
- return -1;
}
}
/*------------------------NUMERIC PROTOCOLS----------------------
------------------------obj + obj------------------------------*/
-static PyObject *Matrix_add(PyObject * m1, PyObject * m2)
+static PyObject *Matrix_add(PyObject *m1, PyObject *m2)
{
- int x, y;
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
+ float mat[16];
MatrixObject *mat1 = NULL, *mat2 = NULL;
mat1 = (MatrixObject*)m1;
mat2 = (MatrixObject*)m2;
if(!MatrixObject_Check(m1) || !MatrixObject_Check(m2)) {
- PyErr_SetString(PyExc_AttributeError, "Matrix addition: arguments not valid for this operation....");
+ PyErr_SetString(PyExc_AttributeError, "Matrix addition: arguments not valid for this operation");
return NULL;
}
-
+
if(!BaseMath_ReadCallback(mat1) || !BaseMath_ReadCallback(mat2))
return NULL;
-
- if(mat1->rowSize != mat2->rowSize || mat1->colSize != mat2->colSize){
+
+ if(mat1->row_size != mat2->row_size || mat1->col_size != mat2->col_size){
PyErr_SetString(PyExc_AttributeError, "Matrix addition: matrices must have the same dimensions for this operation");
return NULL;
}
- for(x = 0; x < mat1->rowSize; x++) {
- for(y = 0; y < mat1->colSize; y++) {
- mat[((x * mat1->colSize) + y)] = mat1->matrix[x][y] + mat2->matrix[x][y];
- }
- }
+ add_vn_vnvn(mat, mat1->contigPtr, mat2->contigPtr, mat1->row_size * mat1->col_size);
- return newMatrixObject(mat, mat1->rowSize, mat1->colSize, Py_NEW, NULL);
+ return newMatrixObject(mat, mat1->row_size, mat1->col_size, Py_NEW, Py_TYPE(mat1));
}
/*------------------------obj - obj------------------------------
subtraction*/
-static PyObject *Matrix_sub(PyObject * m1, PyObject * m2)
+static PyObject *Matrix_sub(PyObject *m1, PyObject *m2)
{
- int x, y;
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
+ float mat[16];
MatrixObject *mat1 = NULL, *mat2 = NULL;
mat1 = (MatrixObject*)m1;
mat2 = (MatrixObject*)m2;
if(!MatrixObject_Check(m1) || !MatrixObject_Check(m2)) {
- PyErr_SetString(PyExc_AttributeError, "Matrix addition: arguments not valid for this operation....");
+ PyErr_SetString(PyExc_AttributeError, "Matrix addition: arguments not valid for this operation");
return NULL;
}
-
+
if(!BaseMath_ReadCallback(mat1) || !BaseMath_ReadCallback(mat2))
return NULL;
-
- if(mat1->rowSize != mat2->rowSize || mat1->colSize != mat2->colSize){
+
+ if(mat1->row_size != mat2->row_size || mat1->col_size != mat2->col_size){
PyErr_SetString(PyExc_AttributeError, "Matrix addition: matrices must have the same dimensions for this operation");
return NULL;
}
- for(x = 0; x < mat1->rowSize; x++) {
- for(y = 0; y < mat1->colSize; y++) {
- mat[((x * mat1->colSize) + y)] = mat1->matrix[x][y] - mat2->matrix[x][y];
- }
- }
+ sub_vn_vnvn(mat, mat1->contigPtr, mat2->contigPtr, mat1->row_size * mat1->col_size);
- return newMatrixObject(mat, mat1->rowSize, mat1->colSize, Py_NEW, NULL);
+ return newMatrixObject(mat, mat1->row_size, mat1->col_size, Py_NEW, Py_TYPE(mat1));
}
/*------------------------obj * obj------------------------------
mulplication*/
+static PyObject *matrix_mul_float(MatrixObject *mat, const float scalar)
+{
+ float tmat[16];
+ mul_vn_vn_fl(tmat, mat->contigPtr, mat->row_size * mat->col_size, scalar);
+ return newMatrixObject(tmat, mat->row_size, mat->col_size, Py_NEW, Py_TYPE(mat));
+}
+
static PyObject *Matrix_mul(PyObject * m1, PyObject * m2)
{
- int x, y, z;
float scalar;
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
- double dot = 0.0f;
+
MatrixObject *mat1 = NULL, *mat2 = NULL;
if(MatrixObject_Check(m1)) {
@@ -1494,65 +1482,54 @@ static PyObject *Matrix_mul(PyObject * m1, PyObject * m2)
}
if(mat1 && mat2) { /*MATRIX * MATRIX*/
- if(mat1->rowSize != mat2->colSize){
+ if(mat1->row_size != mat2->col_size){
PyErr_SetString(PyExc_AttributeError,"Matrix multiplication: matrix A rowsize must equal matrix B colsize");
return NULL;
}
- for(x = 0; x < mat2->rowSize; x++) {
- for(y = 0; y < mat1->colSize; y++) {
- for(z = 0; z < mat1->rowSize; z++) {
- dot += (mat1->matrix[z][y] * mat2->matrix[x][z]);
- }
- mat[((x * mat1->colSize) + y)] = (float)dot;
- dot = 0.0f;
- }
- }
-
- return newMatrixObject(mat, mat2->rowSize, mat1->colSize, Py_NEW, NULL);
- }
-
- if(mat1==NULL){
- scalar=PyFloat_AsDouble(m1); // may not be a float...
- if ((scalar == -1.0 && PyErr_Occurred())==0) { /*FLOAT/INT * MATRIX, this line annoys theeth, lets see if he finds it */
- for(x = 0; x < mat2->rowSize; x++) {
- for(y = 0; y < mat2->colSize; y++) {
- mat[((x * mat2->colSize) + y)] = scalar * mat2->matrix[x][y];
+ else {
+ float mat[16]= {0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f};
+ double dot = 0.0f;
+ int x, y, z;
+
+ for(x = 0; x < mat2->row_size; x++) {
+ for(y = 0; y < mat1->col_size; y++) {
+ for(z = 0; z < mat1->row_size; z++) {
+ dot += (mat1->matrix[z][y] * mat2->matrix[x][z]);
+ }
+ mat[((x * mat1->col_size) + y)] = (float)dot;
+ dot = 0.0f;
}
}
- return newMatrixObject(mat, mat2->rowSize, mat2->colSize, Py_NEW, NULL);
+
+ return newMatrixObject(mat, mat2->row_size, mat1->col_size, Py_NEW, Py_TYPE(mat1));
}
-
- PyErr_SetString(PyExc_TypeError, "Matrix multiplication: arguments not acceptable for this operation");
- return NULL;
}
- else /* if(mat1) { */ {
- if(VectorObject_Check(m2)) { /* MATRIX*VECTOR */
- return column_vector_multiplication(mat1, (VectorObject *)m2); /* vector update done inside the function */
+ else if(mat2) {
+ if (((scalar= PyFloat_AsDouble(m1)) == -1.0 && PyErr_Occurred())==0) { /*FLOAT/INT * MATRIX */
+ return matrix_mul_float(mat2, scalar);
}
- else {
- scalar= PyFloat_AsDouble(m2);
- if ((scalar == -1.0 && PyErr_Occurred())==0) { /* MATRIX*FLOAT/INT */
- for(x = 0; x < mat1->rowSize; x++) {
- for(y = 0; y < mat1->colSize; y++) {
- mat[((x * mat1->colSize) + y)] = scalar * mat1->matrix[x][y];
- }
- }
- return newMatrixObject(mat, mat1->rowSize, mat1->colSize, Py_NEW, NULL);
- }
+ }
+ else if(mat1) {
+ if (((scalar= PyFloat_AsDouble(m2)) == -1.0 && PyErr_Occurred())==0) { /*FLOAT/INT * MATRIX */
+ return matrix_mul_float(mat1, scalar);
}
- PyErr_SetString(PyExc_TypeError, "Matrix multiplication: arguments not acceptable for this operation");
- return NULL;
+ }
+ else {
+ BLI_assert(!"internal error");
}
- PyErr_SetString(PyExc_TypeError, "Matrix multiplication: arguments not acceptable for this operation\n");
+ PyErr_Format(PyExc_TypeError, "Matrix multiplication: not supported between '%.200s' and '%.200s' types", Py_TYPE(m1)->tp_name, Py_TYPE(m2)->tp_name);
return NULL;
}
static PyObject* Matrix_inv(MatrixObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
-
- return Matrix_Invert(self);
+
+ return Matrix_invert(self);
}
/*-----------------PROTOCOL DECLARATIONS--------------------------*/
@@ -1561,9 +1538,9 @@ static PySequenceMethods Matrix_SeqMethods = {
(binaryfunc) NULL, /* sq_concat */
(ssizeargfunc) NULL, /* sq_repeat */
(ssizeargfunc) Matrix_item, /* sq_item */
- (ssizessizeargfunc) Matrix_slice, /* sq_slice, deprecated TODO, replace */
+ (ssizessizeargfunc) NULL, /* sq_slice, deprecated */
(ssizeobjargproc) Matrix_ass_item, /* sq_ass_item */
- (ssizessizeobjargproc) Matrix_ass_slice, /* sq_ass_slice, deprecated TODO, replace */
+ (ssizessizeobjargproc) NULL, /* sq_ass_slice, deprecated */
(objobjproc) NULL, /* sq_contains */
(binaryfunc) NULL, /* sq_inplace_concat */
(ssizeargfunc) NULL, /* sq_inplace_repeat */
@@ -1578,16 +1555,16 @@ static PyObject *Matrix_subscript(MatrixObject* self, PyObject* item)
if (i == -1 && PyErr_Occurred())
return NULL;
if (i < 0)
- i += self->rowSize;
+ i += self->row_size;
return Matrix_item(self, i);
} else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)item, self->rowSize, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, self->row_size, &start, &stop, &step, &slicelength) < 0)
return NULL;
if (slicelength <= 0) {
- return PyList_New(0);
+ return PyTuple_New(0);
}
else if (step == 1) {
return Matrix_slice(self, start, stop);
@@ -1598,9 +1575,7 @@ static PyObject *Matrix_subscript(MatrixObject* self, PyObject* item)
}
}
else {
- PyErr_Format(PyExc_TypeError,
- "vector indices must be integers, not %.200s",
- item->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "vector indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
return NULL;
}
}
@@ -1612,13 +1587,13 @@ static int Matrix_ass_subscript(MatrixObject* self, PyObject* item, PyObject* va
if (i == -1 && PyErr_Occurred())
return -1;
if (i < 0)
- i += self->rowSize;
+ i += self->row_size;
return Matrix_ass_item(self, i, value);
}
else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)item, self->rowSize, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, self->row_size, &start, &stop, &step, &slicelength) < 0)
return -1;
if (step == 1)
@@ -1629,9 +1604,7 @@ static int Matrix_ass_subscript(MatrixObject* self, PyObject* item, PyObject* va
}
}
else {
- PyErr_Format(PyExc_TypeError,
- "matrix indices must be integers, not %.200s",
- item->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "matrix indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
return -1;
}
}
@@ -1680,17 +1653,17 @@ static PyNumberMethods Matrix_NumMethods = {
0, /* nb_index */
};
-static PyObject *Matrix_getRowSize( MatrixObject * self, void *type )
+static PyObject *Matrix_getRowSize(MatrixObject *self, void *UNUSED(closure))
{
- return PyLong_FromLong((long) self->rowSize);
+ return PyLong_FromLong((long) self->row_size);
}
-static PyObject *Matrix_getColSize( MatrixObject * self, void *type )
+static PyObject *Matrix_getColSize(MatrixObject *self, void *UNUSED(closure))
{
- return PyLong_FromLong((long) self->colSize);
+ return PyLong_FromLong((long) self->col_size);
}
-static PyObject *Matrix_getMedianScale( MatrixObject * self, void *type )
+static PyObject *Matrix_getMedianScale(MatrixObject *self, void *UNUSED(closure))
{
float mat[3][3];
@@ -1698,30 +1671,28 @@ static PyObject *Matrix_getMedianScale( MatrixObject * self, void *type )
return NULL;
/*must be 3-4 cols, 3-4 rows, square matrix*/
- if(self->colSize == 4 && self->rowSize == 4)
- copy_m3_m4(mat, (float (*)[4])self->contigPtr);
- else if(self->colSize == 3 && self->rowSize == 3)
- copy_m3_m3(mat, (float (*)[3])self->contigPtr);
- else {
- PyErr_SetString(PyExc_AttributeError, "Matrix.median_scale: inappropriate matrix size - expects 3x3 or 4x4 matrix\n");
+ if((self->col_size < 3) || (self->row_size < 3)) {
+ PyErr_SetString(PyExc_AttributeError, "Matrix.median_scale: inappropriate matrix size, 3x3 minimum");
return NULL;
}
-
+
+ matrix_as_3x3(mat, self);
+
return PyFloat_FromDouble(mat3_to_scale(mat));
}
-static PyObject *Matrix_getIsNegative( MatrixObject * self, void *type )
+static PyObject *Matrix_getIsNegative(MatrixObject *self, void *UNUSED(closure))
{
if(!BaseMath_ReadCallback(self))
return NULL;
/*must be 3-4 cols, 3-4 rows, square matrix*/
- if(self->colSize == 4 && self->rowSize == 4)
+ if(self->col_size == 4 && self->row_size == 4)
return PyBool_FromLong(is_negative_m4((float (*)[4])self->contigPtr));
- else if(self->colSize == 3 && self->rowSize == 3)
+ else if(self->col_size == 3 && self->row_size == 3)
return PyBool_FromLong(is_negative_m3((float (*)[3])self->contigPtr));
else {
- PyErr_SetString(PyExc_AttributeError, "Matrix.is_negative: inappropriate matrix size - expects 3x3 or 4x4 matrix\n");
+ PyErr_SetString(PyExc_AttributeError, "Matrix.is_negative: inappropriate matrix size - expects 3x3 or 4x4 matrix");
return NULL;
}
}
@@ -1731,33 +1702,47 @@ static PyObject *Matrix_getIsNegative( MatrixObject * self, void *type )
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Matrix_getseters[] = {
- {"row_size", (getter)Matrix_getRowSize, (setter)NULL, "The row size of the matrix (readonly).\n\n:type: int", NULL},
- {"col_size", (getter)Matrix_getColSize, (setter)NULL, "The column size of the matrix (readonly).\n\n:type: int", NULL},
- {"median_scale", (getter)Matrix_getMedianScale, (setter)NULL, "The average scale applied to each axis (readonly).\n\n:type: float", NULL},
- {"is_negative", (getter)Matrix_getIsNegative, (setter)NULL, "True if this matrix results in a negative scale, 3x3 and 4x4 only, (readonly).\n\n:type: bool", NULL},
- {"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
- {"owner",(getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
+ {(char *)"row_size", (getter)Matrix_getRowSize, (setter)NULL, (char *)"The row size of the matrix (readonly).\n\n:type: int", NULL},
+ {(char *)"col_size", (getter)Matrix_getColSize, (setter)NULL, (char *)"The column size of the matrix (readonly).\n\n:type: int", NULL},
+ {(char *)"median_scale", (getter)Matrix_getMedianScale, (setter)NULL, (char *)"The average scale applied to each axis (readonly).\n\n:type: float", NULL},
+ {(char *)"is_negative", (getter)Matrix_getIsNegative, (setter)NULL, (char *)"True if this matrix results in a negative scale, 3x3 and 4x4 only, (readonly).\n\n:type: bool", NULL},
+ {(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, (char *)BaseMathObject_Wrapped_doc, NULL},
+ {(char *)"owner",(getter)BaseMathObject_getOwner, (setter)NULL, (char *)BaseMathObject_Owner_doc, NULL},
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
/*-----------------------METHOD DEFINITIONS ----------------------*/
static struct PyMethodDef Matrix_methods[] = {
- {"zero", (PyCFunction) Matrix_Zero, METH_NOARGS, Matrix_Zero_doc},
- {"identity", (PyCFunction) Matrix_Identity, METH_NOARGS, Matrix_Identity_doc},
- {"transpose", (PyCFunction) Matrix_Transpose, METH_NOARGS, Matrix_Transpose_doc},
- {"determinant", (PyCFunction) Matrix_Determinant, METH_NOARGS, Matrix_Determinant_doc},
- {"invert", (PyCFunction) Matrix_Invert, METH_NOARGS, Matrix_Invert_doc},
- {"translation_part", (PyCFunction) Matrix_TranslationPart, METH_NOARGS, Matrix_TranslationPart_doc},
- {"rotation_part", (PyCFunction) Matrix_RotationPart, METH_NOARGS, Matrix_RotationPart_doc},
- {"scale_part", (PyCFunction) Matrix_scalePart, METH_NOARGS, Matrix_scalePart_doc},
- {"resize4x4", (PyCFunction) Matrix_Resize4x4, METH_NOARGS, Matrix_Resize4x4_doc},
- {"to_4x4", (PyCFunction) Matrix_to_4x4, METH_NOARGS, Matrix_to_4x4_doc},
+ /* derived values */
+ {"determinant", (PyCFunction) Matrix_determinant, METH_NOARGS, Matrix_determinant_doc},
+ {"decompose", (PyCFunction) Matrix_decompose, METH_NOARGS, Matrix_decompose_doc},
+
+ /* in place only */
+ {"zero", (PyCFunction) Matrix_zero, METH_NOARGS, Matrix_zero_doc},
+ {"identity", (PyCFunction) Matrix_identity, METH_NOARGS, Matrix_identity_doc},
+
+ /* operate on original or copy */
+ {"transpose", (PyCFunction) Matrix_transpose, METH_NOARGS, Matrix_transpose_doc},
+ {"transposed", (PyCFunction) Matrix_transposed, METH_NOARGS, Matrix_transposed_doc},
+ {"invert", (PyCFunction) Matrix_invert, METH_NOARGS, Matrix_invert_doc},
+ {"inverted", (PyCFunction) Matrix_inverted, METH_NOARGS, Matrix_inverted_doc},
{"to_3x3", (PyCFunction) Matrix_to_3x3, METH_NOARGS, Matrix_to_3x3_doc},
- {"to_euler", (PyCFunction) Matrix_toEuler, METH_VARARGS, Matrix_toEuler_doc},
- {"to_quat", (PyCFunction) Matrix_toQuat, METH_NOARGS, Matrix_toQuat_doc},
+ // TODO. {"resize_3x3", (PyCFunction) Matrix_resize3x3, METH_NOARGS, Matrix_resize3x3_doc},
+ {"to_4x4", (PyCFunction) Matrix_to_4x4, METH_NOARGS, Matrix_to_4x4_doc},
+ {"resize_4x4", (PyCFunction) Matrix_resize_4x4, METH_NOARGS, Matrix_resize_4x4_doc},
+ {"rotate", (PyCFunction) Matrix_rotate, METH_O, Matrix_rotate_doc},
+
+ /* return converted representation */
+ {"to_euler", (PyCFunction) Matrix_to_euler, METH_VARARGS, Matrix_to_euler_doc},
+ {"to_quaternion", (PyCFunction) Matrix_to_quaternion, METH_NOARGS, Matrix_to_quaternion_doc},
+ {"to_scale", (PyCFunction) Matrix_to_scale, METH_NOARGS, Matrix_to_scale_doc},
+ {"to_translation", (PyCFunction) Matrix_to_translation, METH_NOARGS, Matrix_to_translation_doc},
+
+ /* operation between 2 or more types */
+ {"lerp", (PyCFunction) Matrix_lerp, METH_VARARGS, Matrix_lerp_doc},
{"copy", (PyCFunction) Matrix_copy, METH_NOARGS, Matrix_copy_doc},
{"__copy__", (PyCFunction) Matrix_copy, METH_NOARGS, Matrix_copy_doc},
-
+
/* class methods */
{"Rotation", (PyCFunction) C_Matrix_Rotation, METH_VARARGS | METH_CLASS, C_Matrix_Rotation_doc},
{"Scale", (PyCFunction) C_Matrix_Scale, METH_VARARGS | METH_CLASS, C_Matrix_Scale_doc},
@@ -1769,11 +1754,11 @@ static struct PyMethodDef Matrix_methods[] = {
/*------------------PY_OBECT DEFINITION--------------------------*/
static char matrix_doc[] =
-"This object gives access to Matrices in Blender.";
-
+"This object gives access to Matrices in Blender."
+;
PyTypeObject matrix_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "matrix", /*tp_name*/
+ "mathutils.Matrix", /*tp_name*/
sizeof(MatrixObject), /*tp_basicsize*/
0, /*tp_itemsize*/
(destructor)BaseMathObject_dealloc, /*tp_dealloc*/
@@ -1829,14 +1814,14 @@ self->matrix self->contiguous_ptr (reference to data.xxx)
[1]------------->[3]
[4]
[5]
- ....
+
self->matrix[1][1] = self->contigPtr[4] */
/*pass Py_WRAP - if vector is a WRAPPER for data allocated by BLENDER
(i.e. it was allocated elsewhere by MEM_mallocN())
pass Py_NEW - if vector is not a WRAPPER and managed by PYTHON
(i.e. it must be created here with PyMEM_malloc())*/
-PyObject *newMatrixObject(float *mat, int rowSize, int colSize, int type, PyTypeObject *base_type)
+PyObject *newMatrixObject(float *mat, const unsigned short rowSize, const unsigned short colSize, int type, PyTypeObject *base_type)
{
MatrixObject *self;
int x, row, col;
@@ -1850,9 +1835,9 @@ PyObject *newMatrixObject(float *mat, int rowSize, int colSize, int type, PyType
if(base_type) self = (MatrixObject *)base_type->tp_alloc(base_type, 0);
else self = PyObject_NEW(MatrixObject, &matrix_Type);
- self->rowSize = rowSize;
- self->colSize = colSize;
-
+ self->row_size = rowSize;
+ self->col_size = colSize;
+
/* init callbacks as NULL */
self->cb_user= NULL;
self->cb_type= self->cb_subtype= 0;
@@ -1867,7 +1852,7 @@ PyObject *newMatrixObject(float *mat, int rowSize, int colSize, int type, PyType
}else if (type == Py_NEW){
self->contigPtr = PyMem_Malloc(rowSize * colSize * sizeof(float));
if(self->contigPtr == NULL) { /*allocation failure*/
- PyErr_SetString( PyExc_MemoryError, "matrix(): problem allocating pointer space\n");
+ PyErr_SetString(PyExc_MemoryError, "matrix(): problem allocating pointer space");
return NULL;
}
/*pointer array points to contigous memory*/
@@ -1882,8 +1867,8 @@ PyObject *newMatrixObject(float *mat, int rowSize, int colSize, int type, PyType
}
}
} else if (rowSize == colSize ) { /*or if no arguments are passed return identity matrix for square matrices */
- Matrix_Identity(self);
- Py_DECREF(self);
+ PyObject *ret_dummy= Matrix_identity(self);
+ Py_DECREF(ret_dummy);
}
self->wrapped = Py_NEW;
}else{ /*bad type*/
@@ -1903,42 +1888,3 @@ PyObject *newMatrixObject_cb(PyObject *cb_user, int rowSize, int colSize, int cb
}
return (PyObject *) self;
}
-
-//----------------column_vector_multiplication (internal)---------
-//COLUMN VECTOR Multiplication (Matrix X Vector)
-// [1][4][7] [a]
-// [2][5][8] * [b]
-// [3][6][9] [c]
-//vector/matrix multiplication IS NOT COMMUTATIVE!!!!
-static PyObject *column_vector_multiplication(MatrixObject * mat, VectorObject* vec)
-{
- float vecNew[4], vecCopy[4];
- double dot = 0.0f;
- int x, y, z = 0;
-
- if(!BaseMath_ReadCallback(mat) || !BaseMath_ReadCallback(vec))
- return NULL;
-
- if(mat->rowSize != vec->size){
- if(mat->rowSize == 4 && vec->size != 3){
- PyErr_SetString(PyExc_AttributeError, "matrix * vector: matrix row size and vector size must be the same");
- return NULL;
- }else{
- vecCopy[3] = 1.0f;
- }
- }
-
- for(x = 0; x < vec->size; x++){
- vecCopy[x] = vec->vec[x];
- }
- vecNew[3] = 1.0f;
-
- for(x = 0; x < mat->colSize; x++) {
- for(y = 0; y < mat->rowSize; y++) {
- dot += mat->matrix[y][x] * vecCopy[y];
- }
- vecNew[z++] = (float)dot;
- dot = 0.0f;
- }
- return newVectorObject(vecNew, vec->size, Py_NEW, NULL);
-}
diff --git a/source/blender/python/generic/mathutils_matrix.h b/source/blender/python/generic/mathutils_matrix.h
index 21538f8168e..7b980222048 100644
--- a/source/blender/python/generic/mathutils_matrix.h
+++ b/source/blender/python/generic/mathutils_matrix.h
@@ -27,8 +27,8 @@
*
*/
-#ifndef EXPP_matrix_h
-#define EXPP_matrix_h
+#ifndef MATHUTILS_MATRIX_H
+#define MATHUTILS_MATRIX_H
#include <Python.h>
@@ -38,10 +38,9 @@ extern PyTypeObject matrix_Type;
typedef struct {
BASE_MATH_MEMBERS(contigPtr)
-
- unsigned char rowSize;
- unsigned int colSize;
float *matrix[MATRIX_MAX_DIM]; /* ptr to the contigPtr (accessor) */
+ unsigned short row_size;
+ unsigned short col_size;
} MatrixObject;
/*struct data contains a pointer to the actual data that the
@@ -50,10 +49,12 @@ be stored in py_data) or be a wrapper for data allocated through
blender (stored in blend_data). This is an either/or struct not both*/
/*prototypes*/
-PyObject *newMatrixObject(float *mat, int rowSize, int colSize, int type, PyTypeObject *base_type);
-PyObject *newMatrixObject_cb(PyObject *user, int rowSize, int colSize, int cb_type, int cb_subtype);
+PyObject *newMatrixObject(float *mat, const unsigned short row_size, const unsigned short col_size, int type, PyTypeObject *base_type);
+PyObject *newMatrixObject_cb(PyObject *user, int row_size, int col_size, int cb_type, int cb_subtype);
extern int mathutils_matrix_vector_cb_index;
extern struct Mathutils_Callback mathutils_matrix_vector_cb;
-#endif /* EXPP_matrix_H */
+void matrix_as_3x3(float mat[3][3], MatrixObject *self);
+
+#endif /* MATHUTILS_MATRIX_H */
diff --git a/source/blender/python/generic/mathutils_quat.c b/source/blender/python/generic/mathutils_quat.c
index 553844b6ee5..88cd7358ad5 100644
--- a/source/blender/python/generic/mathutils_quat.c
+++ b/source/blender/python/generic/mathutils_quat.c
@@ -20,7 +20,7 @@
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
- *
+ *
* Contributor(s): Joseph Gilbert
*
* ***** END GPL LICENSE BLOCK *****
@@ -29,14 +29,17 @@
#include "mathutils.h"
#include "BLI_math.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
#define QUAT_SIZE 4
+static PyObject *quat__apply_to_copy(PyNoArgsFunction quat_func, QuaternionObject *self);
+static PyObject *Quaternion_copy(QuaternionObject *self);
+
//-----------------------------METHODS------------------------------
/* note: BaseMath_ReadCallback must be called beforehand */
-static PyObject *Quaternion_ToTupleExt(QuaternionObject *self, int ndigits)
+static PyObject *Quaternion_to_tuple_ext(QuaternionObject *self, int ndigits)
{
PyObject *ret;
int i;
@@ -57,7 +60,7 @@ static PyObject *Quaternion_ToTupleExt(QuaternionObject *self, int ndigits)
return ret;
}
-static char Quaternion_ToEuler_doc[] =
+static char Quaternion_to_euler_doc[] =
".. method:: to_euler(order, euler_compat)\n"
"\n"
" Return Euler representation of the quaternion.\n"
@@ -67,18 +70,19 @@ static char Quaternion_ToEuler_doc[] =
" :arg euler_compat: Optional euler argument the new euler will be made compatible with (no axis flipping between them). Useful for converting a series of matrices to animation curves.\n"
" :type euler_compat: :class:`Euler`\n"
" :return: Euler representation of the quaternion.\n"
-" :rtype: :class:`Euler`\n";
-
-static PyObject *Quaternion_ToEuler(QuaternionObject * self, PyObject *args)
+" :rtype: :class:`Euler`\n"
+;
+static PyObject *Quaternion_to_euler(QuaternionObject *self, PyObject *args)
{
+ float tquat[4];
float eul[3];
- char *order_str= NULL;
+ const char *order_str= NULL;
short order= EULER_ORDER_XYZ;
EulerObject *eul_compat = NULL;
-
+
if(!PyArg_ParseTuple(args, "|sO!:to_euler", &order_str, &euler_Type, &eul_compat))
return NULL;
-
+
if(!BaseMath_ReadCallback(self))
return NULL;
@@ -89,34 +93,36 @@ static PyObject *Quaternion_ToEuler(QuaternionObject * self, PyObject *args)
return NULL;
}
+ normalize_qt_qt(tquat, self->quat);
+
if(eul_compat) {
float mat[3][3];
-
+
if(!BaseMath_ReadCallback(eul_compat))
return NULL;
-
- quat_to_mat3(mat, self->quat);
+
+ quat_to_mat3(mat, tquat);
if(order == EULER_ORDER_XYZ) mat3_to_compatible_eul(eul, eul_compat->eul, mat);
else mat3_to_compatible_eulO(eul, eul_compat->eul, order, mat);
}
else {
- if(order == EULER_ORDER_XYZ) quat_to_eul(eul, self->quat);
- else quat_to_eulO(eul, order, self->quat);
+ if(order == EULER_ORDER_XYZ) quat_to_eul(eul, tquat);
+ else quat_to_eulO(eul, order, tquat);
}
-
+
return newEulerObject(eul, order, Py_NEW, NULL);
}
//----------------------------Quaternion.toMatrix()------------------
-static char Quaternion_ToMatrix_doc[] =
+static char Quaternion_to_matrix_doc[] =
".. method:: to_matrix()\n"
"\n"
" Return a matrix representation of the quaternion.\n"
"\n"
" :return: A 3x3 rotation matrix representation of the quaternion.\n"
-" :rtype: :class:`Matrix`\n";
-
-static PyObject *Quaternion_ToMatrix(QuaternionObject * self)
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *Quaternion_to_matrix(QuaternionObject *self)
{
float mat[9]; /* all values are set */
@@ -128,7 +134,7 @@ static PyObject *Quaternion_ToMatrix(QuaternionObject * self)
}
//----------------------------Quaternion.cross(other)------------------
-static char Quaternion_Cross_doc[] =
+static char Quaternion_cross_doc[] =
".. method:: cross(other)\n"
"\n"
" Return the cross product of this quaternion and another.\n"
@@ -136,26 +142,24 @@ static char Quaternion_Cross_doc[] =
" :arg other: The other quaternion to perform the cross product with.\n"
" :type other: :class:`Quaternion`\n"
" :return: The cross product.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Quaternion_Cross(QuaternionObject * self, QuaternionObject * value)
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_cross(QuaternionObject *self, PyObject *value)
{
- float quat[QUAT_SIZE];
-
- if (!QuaternionObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "quat.cross(value): expected a quaternion argument" );
+ float quat[QUAT_SIZE], tquat[QUAT_SIZE];
+
+ if(!BaseMath_ReadCallback(self))
return NULL;
- }
-
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
+
+ if(mathutils_array_parse(tquat, QUAT_SIZE, QUAT_SIZE, value, "quaternion.cross(other), invalid 'other' arg") == -1)
return NULL;
- mul_qt_qtqt(quat, self->quat, value->quat);
- return newQuaternionObject(quat, Py_NEW, NULL);
+ mul_qt_qtqt(quat, self->quat, tquat);
+ return newQuaternionObject(quat, Py_NEW, Py_TYPE(self));
}
//----------------------------Quaternion.dot(other)------------------
-static char Quaternion_Dot_doc[] =
+static char Quaternion_dot_doc[] =
".. method:: dot(other)\n"
"\n"
" Return the dot product of this quaternion and another.\n"
@@ -163,22 +167,22 @@ static char Quaternion_Dot_doc[] =
" :arg other: The other quaternion to perform the dot product with.\n"
" :type other: :class:`Quaternion`\n"
" :return: The dot product.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Quaternion_Dot(QuaternionObject * self, QuaternionObject * value)
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_dot(QuaternionObject *self, PyObject *value)
{
- if (!QuaternionObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "quat.dot(value): expected a quaternion argument" );
+ float tquat[QUAT_SIZE];
+
+ if(!BaseMath_ReadCallback(self))
return NULL;
- }
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
+ if(mathutils_array_parse(tquat, QUAT_SIZE, QUAT_SIZE, value, "quaternion.dot(other), invalid 'other' arg") == -1)
return NULL;
- return PyFloat_FromDouble(dot_qtqt(self->quat, value->quat));
+ return PyFloat_FromDouble(dot_qtqt(self->quat, tquat));
}
-static char Quaternion_Difference_doc[] =
+static char Quaternion_difference_doc[] =
".. function:: difference(other)\n"
"\n"
" Returns a quaternion representing the rotational difference.\n"
@@ -186,26 +190,24 @@ static char Quaternion_Difference_doc[] =
" :arg other: second quaternion.\n"
" :type other: :class:`Quaternion`\n"
" :return: the rotational difference between the two quat rotations.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Quaternion_Difference(QuaternionObject * self, QuaternionObject * value)
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_difference(QuaternionObject *self, PyObject *value)
{
- float quat[QUAT_SIZE];
+ float tquat[QUAT_SIZE], quat[QUAT_SIZE];
- if (!QuaternionObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "quat.difference(value): expected a quaternion argument" );
+ if(!BaseMath_ReadCallback(self))
return NULL;
- }
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
+ if(mathutils_array_parse(tquat, QUAT_SIZE, QUAT_SIZE, value, "quaternion.difference(other), invalid 'other' arg") == -1)
return NULL;
- rotation_between_quats_to_quat(quat, self->quat, value->quat);
+ rotation_between_quats_to_quat(quat, self->quat, tquat);
- return newQuaternionObject(quat, Py_NEW, NULL);
+ return newQuaternionObject(quat, Py_NEW, Py_TYPE(self));
}
-static char Quaternion_Slerp_doc[] =
+static char Quaternion_slerp_doc[] =
".. function:: slerp(other, factor)\n"
"\n"
" Returns the interpolation of two quaternions.\n"
@@ -215,19 +217,22 @@ static char Quaternion_Slerp_doc[] =
" :arg factor: The interpolation value in [0.0, 1.0].\n"
" :type factor: float\n"
" :return: The interpolated rotation.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Quaternion_Slerp(QuaternionObject *self, PyObject *args)
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_slerp(QuaternionObject *self, PyObject *args)
{
- QuaternionObject *value;
- float quat[QUAT_SIZE], fac;
+ PyObject *value;
+ float tquat[QUAT_SIZE], quat[QUAT_SIZE], fac;
- if(!PyArg_ParseTuple(args, "O!f:slerp", &quaternion_Type, &value, &fac)) {
+ if(!PyArg_ParseTuple(args, "Of:slerp", &value, &fac)) {
PyErr_SetString(PyExc_TypeError, "quat.slerp(): expected Quaternion types and float");
return NULL;
}
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(mathutils_array_parse(tquat, QUAT_SIZE, QUAT_SIZE, value, "quaternion.slerp(other), invalid 'other' arg") == -1)
return NULL;
if(fac > 1.0f || fac < 0.0f) {
@@ -235,112 +240,167 @@ static PyObject *Quaternion_Slerp(QuaternionObject *self, PyObject *args)
return NULL;
}
- interp_qt_qtqt(quat, self->quat, value->quat, fac);
+ interp_qt_qtqt(quat, self->quat, tquat, fac);
+
+ return newQuaternionObject(quat, Py_NEW, Py_TYPE(self));
+}
+
+static char Quaternion_rotate_doc[] =
+".. method:: rotate(other)\n"
+"\n"
+" Rotates the quaternion a by another mathutils value.\n"
+"\n"
+" :arg other: rotation component of mathutils value\n"
+" :type other: :class:`Euler`, :class:`Quaternion` or :class:`Matrix`\n"
+;
+static PyObject *Quaternion_rotate(QuaternionObject *self, PyObject *value)
+{
+ float self_rmat[3][3], other_rmat[3][3], rmat[3][3];
+ float tquat[4], length;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(mathutils_any_to_rotmat(other_rmat, value, "quaternion.rotate(value)") == -1)
+ return NULL;
+
+ length= normalize_qt_qt(tquat, self->quat);
+ quat_to_mat3(self_rmat, tquat);
+ mul_m3_m3m3(rmat, self_rmat, other_rmat);
- return newQuaternionObject(quat, Py_NEW, NULL);
+ mat3_to_quat(self->quat, rmat);
+ mul_qt_fl(self->quat, length); /* maintain length after rotating */
+
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
//----------------------------Quaternion.normalize()----------------
//normalize the axis of rotation of [theta,vector]
-static char Quaternion_Normalize_doc[] =
+static char Quaternion_normalize_doc[] =
".. function:: normalize()\n"
"\n"
" Normalize the quaternion.\n"
-"\n"
-" :return: an instance of itself.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Quaternion_Normalize(QuaternionObject * self)
+;
+static PyObject *Quaternion_normalize(QuaternionObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
normalize_qt(self->quat);
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject*)self;
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
-//----------------------------Quaternion.inverse()------------------
-static char Quaternion_Inverse_doc[] =
-".. function:: inverse()\n"
+static char Quaternion_normalized_doc[] =
+".. function:: normalized()\n"
"\n"
-" Set the quaternion to its inverse.\n"
+" Return a new normalized quaternion.\n"
"\n"
-" :return: an instance of itself.\n"
-" :rtype: :class:`Quaternion`\n";
+" :return: a normalized copy.\n"
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_normalized(QuaternionObject *self)
+{
+ return quat__apply_to_copy((PyNoArgsFunction)Quaternion_normalize, self);
+}
-static PyObject *Quaternion_Inverse(QuaternionObject * self)
+//----------------------------Quaternion.invert()------------------
+static char Quaternion_invert_doc[] =
+".. function:: invert()\n"
+"\n"
+" Set the quaternion to its inverse.\n"
+;
+static PyObject *Quaternion_invert(QuaternionObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
invert_qt(self->quat);
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject*)self;
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
+static char Quaternion_inverted_doc[] =
+".. function:: inverted()\n"
+"\n"
+" Return a new, inverted quaternion.\n"
+"\n"
+" :return: the inverted value.\n"
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_inverted(QuaternionObject *self)
+{
+ return quat__apply_to_copy((PyNoArgsFunction)Quaternion_invert, self);
+}
+
//----------------------------Quaternion.identity()-----------------
-static char Quaternion_Identity_doc[] =
+static char Quaternion_identity_doc[] =
".. function:: identity()\n"
"\n"
" Set the quaternion to an identity quaternion.\n"
"\n"
" :return: an instance of itself.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Quaternion_Identity(QuaternionObject * self)
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_identity(QuaternionObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
unit_qt(self->quat);
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject*)self;
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
//----------------------------Quaternion.negate()-------------------
-static char Quaternion_Negate_doc[] =
+static char Quaternion_negate_doc[] =
".. function:: negate()\n"
"\n"
" Set the quaternion to its negative.\n"
"\n"
" :return: an instance of itself.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Quaternion_Negate(QuaternionObject * self)
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_negate(QuaternionObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
mul_qt_fl(self->quat, -1.0f);
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject*)self;
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
//----------------------------Quaternion.conjugate()----------------
-static char Quaternion_Conjugate_doc[] =
+static char Quaternion_conjugate_doc[] =
".. function:: conjugate()\n"
"\n"
" Set the quaternion to its conjugate (negate x, y, z).\n"
-"\n"
-" :return: an instance of itself.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Quaternion_Conjugate(QuaternionObject * self)
+;
+static PyObject *Quaternion_conjugate(QuaternionObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
conjugate_qt(self->quat);
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject*)self;
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
+static char Quaternion_conjugated_doc[] =
+".. function:: conjugated()\n"
+"\n"
+" Return a new conjugated quaternion.\n"
+"\n"
+" :return: a new quaternion.\n"
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_conjugated(QuaternionObject *self)
+{
+ return quat__apply_to_copy((PyNoArgsFunction)Quaternion_conjugate, self);
+}
+
//----------------------------Quaternion.copy()----------------
static char Quaternion_copy_doc[] =
".. function:: copy()\n"
@@ -350,9 +410,9 @@ static char Quaternion_copy_doc[] =
" :return: A copy of the quaternion.\n"
" :rtype: :class:`Quaternion`\n"
"\n"
-" .. note:: use this to get a copy of a wrapped quaternion with no reference to the original data.\n";
-
-static PyObject *Quaternion_copy(QuaternionObject * self)
+" .. note:: use this to get a copy of a wrapped quaternion with no reference to the original data.\n"
+;
+static PyObject *Quaternion_copy(QuaternionObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
@@ -362,14 +422,14 @@ static PyObject *Quaternion_copy(QuaternionObject * self)
//----------------------------print object (internal)--------------
//print the object to screen
-static PyObject *Quaternion_repr(QuaternionObject * self)
+static PyObject *Quaternion_repr(QuaternionObject *self)
{
PyObject *ret, *tuple;
-
+
if(!BaseMath_ReadCallback(self))
return NULL;
- tuple= Quaternion_ToTupleExt(self, -1);
+ tuple= Quaternion_to_tuple_ext(self, -1);
ret= PyUnicode_FromFormat("Quaternion(%R)", tuple);
@@ -377,70 +437,57 @@ static PyObject *Quaternion_repr(QuaternionObject * self)
return ret;
}
-//------------------------tp_richcmpr
-//returns -1 execption, 0 false, 1 true
-static PyObject* Quaternion_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type)
+static PyObject* Quaternion_richcmpr(PyObject *a, PyObject *b, int op)
{
- QuaternionObject *quatA = NULL, *quatB = NULL;
- int result = 0;
+ PyObject *res;
+ int ok= -1; /* zero is true */
- if(QuaternionObject_Check(objectA)) {
- quatA = (QuaternionObject*)objectA;
- if(!BaseMath_ReadCallback(quatA))
- return NULL;
- }
- if(QuaternionObject_Check(objectB)) {
- quatB = (QuaternionObject*)objectB;
- if(!BaseMath_ReadCallback(quatB))
+ if (QuaternionObject_Check(a) && QuaternionObject_Check(b)) {
+ QuaternionObject *quatA= (QuaternionObject *)a;
+ QuaternionObject *quatB= (QuaternionObject *)b;
+
+ if(!BaseMath_ReadCallback(quatA) || !BaseMath_ReadCallback(quatB))
return NULL;
- }
- if (!quatA || !quatB){
- if (comparison_type == Py_NE){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
- }
+ ok= (EXPP_VectorsAreEqual(quatA->quat, quatB->quat, QUAT_SIZE, 1)) ? 0 : -1;
}
- switch (comparison_type){
- case Py_EQ:
- result = EXPP_VectorsAreEqual(quatA->quat, quatB->quat, QUAT_SIZE, 1);
- break;
- case Py_NE:
- result = EXPP_VectorsAreEqual(quatA->quat, quatB->quat, QUAT_SIZE, 1);
- if (result == 0){
- result = 1;
- }else{
- result = 0;
- }
- break;
- default:
- printf("The result of the comparison could not be evaluated");
- break;
- }
- if (result == 1){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
+ switch (op) {
+ case Py_NE:
+ ok = !ok; /* pass through */
+ case Py_EQ:
+ res = ok ? Py_False : Py_True;
+ break;
+
+ case Py_LT:
+ case Py_LE:
+ case Py_GT:
+ case Py_GE:
+ res = Py_NotImplemented;
+ break;
+ default:
+ PyErr_BadArgument();
+ return NULL;
}
+
+ return Py_INCREF(res), res;
}
//---------------------SEQUENCE PROTOCOLS------------------------
//----------------------------len(object)------------------------
//sequence length
-static int Quaternion_len(QuaternionObject * self)
+static int Quaternion_len(QuaternionObject *UNUSED(self))
{
return QUAT_SIZE;
}
//----------------------------object[]---------------------------
//sequence accessor (get)
-static PyObject *Quaternion_item(QuaternionObject * self, int i)
+static PyObject *Quaternion_item(QuaternionObject *self, int i)
{
if(i<0) i= QUAT_SIZE-i;
if(i < 0 || i >= QUAT_SIZE) {
- PyErr_SetString(PyExc_IndexError, "quaternion[attribute]: array index out of range\n");
+ PyErr_SetString(PyExc_IndexError, "quaternion[attribute]: array index out of range");
return NULL;
}
@@ -452,18 +499,18 @@ static PyObject *Quaternion_item(QuaternionObject * self, int i)
}
//----------------------------object[]-------------------------
//sequence accessor (set)
-static int Quaternion_ass_item(QuaternionObject * self, int i, PyObject * ob)
+static int Quaternion_ass_item(QuaternionObject *self, int i, PyObject *ob)
{
float scalar= (float)PyFloat_AsDouble(ob);
if(scalar==-1.0f && PyErr_Occurred()) { /* parsed item not a number */
- PyErr_SetString(PyExc_TypeError, "quaternion[index] = x: index argument not a number\n");
+ PyErr_SetString(PyExc_TypeError, "quaternion[index] = x: index argument not a number");
return -1;
}
if(i<0) i= QUAT_SIZE-i;
if(i < 0 || i >= QUAT_SIZE){
- PyErr_SetString(PyExc_IndexError, "quaternion[attribute] = x: array assignment index out of range\n");
+ PyErr_SetString(PyExc_IndexError, "quaternion[attribute] = x: array assignment index out of range");
return -1;
}
self->quat[i] = scalar;
@@ -475,9 +522,9 @@ static int Quaternion_ass_item(QuaternionObject * self, int i, PyObject * ob)
}
//----------------------------object[z:y]------------------------
//sequence slice (get)
-static PyObject *Quaternion_slice(QuaternionObject * self, int begin, int end)
+static PyObject *Quaternion_slice(QuaternionObject *self, int begin, int end)
{
- PyObject *list = NULL;
+ PyObject *tuple;
int count;
if(!BaseMath_ReadCallback(self))
@@ -486,19 +533,18 @@ static PyObject *Quaternion_slice(QuaternionObject * self, int begin, int end)
CLAMP(begin, 0, QUAT_SIZE);
if (end<0) end= (QUAT_SIZE + 1) + end;
CLAMP(end, 0, QUAT_SIZE);
- begin = MIN2(begin,end);
+ begin= MIN2(begin, end);
- list = PyList_New(end - begin);
- for(count = begin; count < end; count++) {
- PyList_SetItem(list, count - begin,
- PyFloat_FromDouble(self->quat[count]));
+ tuple= PyTuple_New(end - begin);
+ for(count= begin; count < end; count++) {
+ PyTuple_SET_ITEM(tuple, count - begin, PyFloat_FromDouble(self->quat[count]));
}
- return list;
+ return tuple;
}
//----------------------------object[z:y]------------------------
//sequence slice (set)
-static int Quaternion_ass_slice(QuaternionObject * self, int begin, int end, PyObject * seq)
+static int Quaternion_ass_slice(QuaternionObject *self, int begin, int end, PyObject *seq)
{
int i, size;
float quat[QUAT_SIZE];
@@ -513,7 +559,7 @@ static int Quaternion_ass_slice(QuaternionObject * self, int begin, int end, PyO
if((size=mathutils_array_parse(quat, 0, QUAT_SIZE, seq, "mathutils.Quaternion[begin:end] = []")) == -1)
return -1;
-
+
if(size != (end - begin)){
PyErr_SetString(PyExc_TypeError, "quaternion[begin:end] = []: size mismatch in slice assignment");
return -1;
@@ -523,7 +569,7 @@ static int Quaternion_ass_slice(QuaternionObject * self, int begin, int end, PyO
for(i= 0; i < size; i++)
self->quat[begin + i] = quat[i];
- BaseMath_WriteCallback(self);
+ (void)BaseMath_WriteCallback(self);
return 0;
}
@@ -541,11 +587,11 @@ static PyObject *Quaternion_subscript(QuaternionObject *self, PyObject *item)
} else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)item, QUAT_SIZE, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, QUAT_SIZE, &start, &stop, &step, &slicelength) < 0)
return NULL;
if (slicelength <= 0) {
- return PyList_New(0);
+ return PyTuple_New(0);
}
else if (step == 1) {
return Quaternion_slice(self, start, stop);
@@ -556,9 +602,7 @@ static PyObject *Quaternion_subscript(QuaternionObject *self, PyObject *item)
}
}
else {
- PyErr_Format(PyExc_TypeError,
- "quaternion indices must be integers, not %.200s",
- item->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "quaternion indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
return NULL;
}
}
@@ -577,7 +621,7 @@ static int Quaternion_ass_subscript(QuaternionObject *self, PyObject *item, PyOb
else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)item, QUAT_SIZE, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, QUAT_SIZE, &start, &stop, &step, &slicelength) < 0)
return -1;
if (step == 1)
@@ -588,9 +632,7 @@ static int Quaternion_ass_subscript(QuaternionObject *self, PyObject *item, PyOb
}
}
else {
- PyErr_Format(PyExc_TypeError,
- "quaternion indices must be integers, not %.200s",
- item->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "quaternion indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
return -1;
}
}
@@ -598,40 +640,40 @@ static int Quaternion_ass_subscript(QuaternionObject *self, PyObject *item, PyOb
//------------------------NUMERIC PROTOCOLS----------------------
//------------------------obj + obj------------------------------
//addition
-static PyObject *Quaternion_add(PyObject * q1, PyObject * q2)
+static PyObject *Quaternion_add(PyObject *q1, PyObject *q2)
{
float quat[QUAT_SIZE];
QuaternionObject *quat1 = NULL, *quat2 = NULL;
if(!QuaternionObject_Check(q1) || !QuaternionObject_Check(q2)) {
- PyErr_SetString(PyExc_AttributeError, "Quaternion addition: arguments not valid for this operation....\n");
+ PyErr_SetString(PyExc_AttributeError, "Quaternion addition: arguments not valid for this operation");
return NULL;
}
quat1 = (QuaternionObject*)q1;
quat2 = (QuaternionObject*)q2;
-
+
if(!BaseMath_ReadCallback(quat1) || !BaseMath_ReadCallback(quat2))
return NULL;
add_qt_qtqt(quat, quat1->quat, quat2->quat, 1.0f);
- return newQuaternionObject(quat, Py_NEW, NULL);
+ return newQuaternionObject(quat, Py_NEW, Py_TYPE(q1));
}
//------------------------obj - obj------------------------------
//subtraction
-static PyObject *Quaternion_sub(PyObject * q1, PyObject * q2)
+static PyObject *Quaternion_sub(PyObject *q1, PyObject *q2)
{
int x;
float quat[QUAT_SIZE];
QuaternionObject *quat1 = NULL, *quat2 = NULL;
if(!QuaternionObject_Check(q1) || !QuaternionObject_Check(q2)) {
- PyErr_SetString(PyExc_AttributeError, "Quaternion addition: arguments not valid for this operation....\n");
+ PyErr_SetString(PyExc_AttributeError, "Quaternion addition: arguments not valid for this operation");
return NULL;
}
-
+
quat1 = (QuaternionObject*)q1;
quat2 = (QuaternionObject*)q2;
-
+
if(!BaseMath_ReadCallback(quat1) || !BaseMath_ReadCallback(quat2))
return NULL;
@@ -639,15 +681,23 @@ static PyObject *Quaternion_sub(PyObject * q1, PyObject * q2)
quat[x] = quat1->quat[x] - quat2->quat[x];
}
- return newQuaternionObject(quat, Py_NEW, NULL);
+ return newQuaternionObject(quat, Py_NEW, Py_TYPE(q1));
}
+
+static PyObject *quat_mul_float(QuaternionObject *quat, const float scalar)
+{
+ float tquat[4];
+ copy_qt_qt(tquat, quat->quat);
+ mul_qt_fl(tquat, scalar);
+ return newQuaternionObject(tquat, Py_NEW, Py_TYPE(quat));
+}
+
//------------------------obj * obj------------------------------
//mulplication
-static PyObject *Quaternion_mul(PyObject * q1, PyObject * q2)
+static PyObject *Quaternion_mul(PyObject *q1, PyObject *q2)
{
float quat[QUAT_SIZE], scalar;
QuaternionObject *quat1 = NULL, *quat2 = NULL;
- VectorObject *vec = NULL;
if(QuaternionObject_Check(q1)) {
quat1 = (QuaternionObject*)q1;
@@ -662,49 +712,41 @@ static PyObject *Quaternion_mul(PyObject * q1, PyObject * q2)
if(quat1 && quat2) { /* QUAT*QUAT (cross product) */
mul_qt_qtqt(quat, quat1->quat, quat2->quat);
- return newQuaternionObject(quat, Py_NEW, NULL);
+ return newQuaternionObject(quat, Py_NEW, Py_TYPE(q1));
}
-
/* the only case this can happen (for a supported type is "FLOAT*QUAT" ) */
- if(!QuaternionObject_Check(q1)) {
- scalar= PyFloat_AsDouble(q1);
- if ((scalar == -1.0 && PyErr_Occurred())==0) { /* FLOAT*QUAT */
- QUATCOPY(quat, quat2->quat);
- mul_qt_fl(quat, scalar);
- return newQuaternionObject(quat, Py_NEW, NULL);
+ else if(quat2) { /* FLOAT*QUAT */
+ if(((scalar= PyFloat_AsDouble(q1)) == -1.0 && PyErr_Occurred())==0) {
+ return quat_mul_float(quat2, scalar);
}
- PyErr_SetString(PyExc_TypeError, "Quaternion multiplication: val * quat, val is not an acceptable type");
- return NULL;
}
- else { /* QUAT*SOMETHING */
- if(VectorObject_Check(q2)){ /* QUAT*VEC */
- float tvec[3];
- vec = (VectorObject*)q2;
- if(vec->size != 3){
- PyErr_SetString(PyExc_TypeError, "Quaternion multiplication: only 3D vector rotations currently supported\n");
- return NULL;
- }
- if(!BaseMath_ReadCallback(vec)) {
- return NULL;
- }
-
- copy_v3_v3(tvec, vec->vec);
- mul_qt_v3(quat1->quat, tvec);
- return newVectorObject(tvec, 3, Py_NEW, NULL);
- }
-
- scalar= PyFloat_AsDouble(q2);
- if ((scalar == -1.0 && PyErr_Occurred())==0) { /* QUAT*FLOAT */
- QUATCOPY(quat, quat1->quat);
- mul_qt_fl(quat, scalar);
- return newQuaternionObject(quat, Py_NEW, NULL);
+ else if (quat1) { /* QUAT*FLOAT */
+ if((((scalar= PyFloat_AsDouble(q2)) == -1.0 && PyErr_Occurred())==0)) {
+ return quat_mul_float(quat1, scalar);
}
}
-
- PyErr_SetString(PyExc_TypeError, "Quaternion multiplication: arguments not acceptable for this operation\n");
+ else {
+ BLI_assert(!"internal error");
+ }
+
+ PyErr_Format(PyExc_TypeError, "Quaternion multiplication: not supported between '%.200s' and '%.200s' types", Py_TYPE(q1)->tp_name, Py_TYPE(q2)->tp_name);
return NULL;
}
+/* -obj
+ returns the negative of this object*/
+static PyObject *Quaternion_neg(QuaternionObject *self)
+{
+ float tquat[QUAT_SIZE];
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ negate_v4_v4(tquat, self->quat);
+ return newQuaternionObject(tquat, Py_NEW, Py_TYPE(self));
+}
+
+
//-----------------PROTOCOL DECLARATIONS--------------------------
static PySequenceMethods Quaternion_SeqMethods = {
(lenfunc) Quaternion_len, /* sq_length */
@@ -732,7 +774,7 @@ static PyNumberMethods Quaternion_NumMethods = {
0, /*nb_remainder*/
0, /*nb_divmod*/
0, /*nb_power*/
- (unaryfunc) 0, /*nb_negative*/
+ (unaryfunc) Quaternion_neg, /*nb_negative*/
(unaryfunc) 0, /*tp_positive*/
(unaryfunc) 0, /*tp_absolute*/
(inquiry) 0, /*tp_bool*/
@@ -762,17 +804,17 @@ static PyNumberMethods Quaternion_NumMethods = {
0, /* nb_index */
};
-static PyObject *Quaternion_getAxis( QuaternionObject * self, void *type )
+static PyObject *Quaternion_getAxis( QuaternionObject *self, void *type )
{
return Quaternion_item(self, GET_INT_FROM_POINTER(type));
}
-static int Quaternion_setAxis( QuaternionObject * self, PyObject * value, void * type )
+static int Quaternion_setAxis( QuaternionObject *self, PyObject *value, void *type )
{
return Quaternion_ass_item(self, GET_INT_FROM_POINTER(type), value);
}
-static PyObject *Quaternion_getMagnitude( QuaternionObject * self, void *type )
+static PyObject *Quaternion_getMagnitude(QuaternionObject *self, void *UNUSED(closure))
{
if(!BaseMath_ReadCallback(self))
return NULL;
@@ -780,31 +822,40 @@ static PyObject *Quaternion_getMagnitude( QuaternionObject * self, void *type )
return PyFloat_FromDouble(sqrt(dot_qtqt(self->quat, self->quat)));
}
-static PyObject *Quaternion_getAngle( QuaternionObject * self, void *type )
+static PyObject *Quaternion_getAngle(QuaternionObject *self, void *UNUSED(closure))
{
+ float tquat[4];
+
if(!BaseMath_ReadCallback(self))
return NULL;
- return PyFloat_FromDouble(2.0 * (saacos(self->quat[0])));
+ normalize_qt_qt(tquat, self->quat);
+ return PyFloat_FromDouble(2.0 * (saacos(tquat[0])));
}
-static int Quaternion_setAngle(QuaternionObject * self, PyObject * value, void * type)
+static int Quaternion_setAngle(QuaternionObject *self, PyObject *value, void *UNUSED(closure))
{
- float axis[3];
- float angle;
+ float tquat[4];
+ float len;
+
+ float axis[3], angle_dummy;
+ double angle;
if(!BaseMath_ReadCallback(self))
return -1;
- quat_to_axis_angle(axis, &angle, self->quat);
+ len= normalize_qt_qt(tquat, self->quat);
+ quat_to_axis_angle(axis, &angle_dummy, tquat);
- angle = PyFloat_AsDouble(value);
+ angle= PyFloat_AsDouble(value);
if(angle==-1.0f && PyErr_Occurred()) { /* parsed item not a number */
PyErr_SetString(PyExc_TypeError, "quaternion.angle = value: float expected");
return -1;
}
+ angle= fmod(angle + M_PI*2, M_PI*4) - M_PI*2;
+
/* If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations */
if( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) &&
EXPP_FloatsAreEqual(axis[1], 0.0f, 10) &&
@@ -812,8 +863,9 @@ static int Quaternion_setAngle(QuaternionObject * self, PyObject * value, void *
) {
axis[0] = 1.0f;
}
-
+
axis_angle_to_quat(self->quat, axis, angle);
+ mul_qt_fl(self->quat, len);
if(!BaseMath_WriteCallback(self))
return -1;
@@ -821,15 +873,18 @@ static int Quaternion_setAngle(QuaternionObject * self, PyObject * value, void *
return 0;
}
-static PyObject *Quaternion_getAxisVec(QuaternionObject *self, void *type)
+static PyObject *Quaternion_getAxisVec(QuaternionObject *self, void *UNUSED(closure))
{
+ float tquat[4];
+
float axis[3];
float angle;
if(!BaseMath_ReadCallback(self))
return NULL;
-
- quat_to_axis_angle(axis, &angle, self->quat);
+
+ normalize_qt_qt(tquat, self->quat);
+ quat_to_axis_angle(axis, &angle, tquat);
/* If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations */
if( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) &&
@@ -842,28 +897,25 @@ static PyObject *Quaternion_getAxisVec(QuaternionObject *self, void *type)
return (PyObject *) newVectorObject(axis, 3, Py_NEW, NULL);
}
-static int Quaternion_setAxisVec(QuaternionObject *self, PyObject *value, void *type)
+static int Quaternion_setAxisVec(QuaternionObject *self, PyObject *value, void *UNUSED(closure))
{
+ float tquat[4];
+ float len;
+
float axis[3];
float angle;
-
- VectorObject *vec;
if(!BaseMath_ReadCallback(self))
return -1;
- quat_to_axis_angle(axis, &angle, self->quat);
+ len= normalize_qt_qt(tquat, self->quat);
+ quat_to_axis_angle(axis, &angle, tquat); /* axis value is unused */
- if(!VectorObject_Check(value)) {
- PyErr_SetString(PyExc_TypeError, "quaternion.axis = value: expected a 3D Vector");
- return -1;
- }
-
- vec= (VectorObject *)value;
- if(!BaseMath_ReadCallback(vec))
+ if (mathutils_array_parse(axis, 3, 3, value, "quat.axis = other") == -1)
return -1;
- axis_angle_to_quat(self->quat, vec->vec, angle);
+ axis_angle_to_quat(self->quat, axis, angle);
+ mul_qt_fl(self->quat, len);
if(!BaseMath_WriteCallback(self))
return -1;
@@ -875,10 +927,15 @@ static int Quaternion_setAxisVec(QuaternionObject *self, PyObject *value, void *
static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject *seq= NULL;
- float angle = 0.0f;
+ double angle = 0.0f;
float quat[QUAT_SIZE]= {0.0f, 0.0f, 0.0f, 0.0f};
- if(!PyArg_ParseTuple(args, "|Of:mathutils.Quaternion", &seq, &angle))
+ if(kwds && PyDict_Size(kwds)) {
+ PyErr_SetString(PyExc_TypeError, "mathutils.Quaternion(): takes no keyword args");
+ return NULL;
+ }
+
+ if(!PyArg_ParseTuple(args, "|Od:mathutils.Quaternion", &seq, &angle))
return NULL;
switch(PyTuple_GET_SIZE(args)) {
@@ -891,28 +948,55 @@ static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kw
case 2:
if (mathutils_array_parse(quat, 3, 3, seq, "mathutils.Quaternion()") == -1)
return NULL;
-
+ angle= fmod(angle + M_PI*2, M_PI*4) - M_PI*2; /* clamp because of precision issues */
axis_angle_to_quat(quat, quat, angle);
break;
/* PyArg_ParseTuple assures no more then 2 */
}
- return newQuaternionObject(quat, Py_NEW, NULL);
+ return newQuaternionObject(quat, Py_NEW, type);
}
+static PyObject *quat__apply_to_copy(PyNoArgsFunction quat_func, QuaternionObject *self)
+{
+ PyObject *ret= Quaternion_copy(self);
+ PyObject *ret_dummy= quat_func(ret);
+ if(ret_dummy) {
+ Py_DECREF(ret_dummy);
+ return (PyObject *)ret;
+ }
+ else { /* error */
+ Py_DECREF(ret);
+ return NULL;
+ }
+}
//-----------------------METHOD DEFINITIONS ----------------------
static struct PyMethodDef Quaternion_methods[] = {
- {"identity", (PyCFunction) Quaternion_Identity, METH_NOARGS, Quaternion_Identity_doc},
- {"negate", (PyCFunction) Quaternion_Negate, METH_NOARGS, Quaternion_Negate_doc},
- {"conjugate", (PyCFunction) Quaternion_Conjugate, METH_NOARGS, Quaternion_Conjugate_doc},
- {"inverse", (PyCFunction) Quaternion_Inverse, METH_NOARGS, Quaternion_Inverse_doc},
- {"normalize", (PyCFunction) Quaternion_Normalize, METH_NOARGS, Quaternion_Normalize_doc},
- {"to_euler", (PyCFunction) Quaternion_ToEuler, METH_VARARGS, Quaternion_ToEuler_doc},
- {"to_matrix", (PyCFunction) Quaternion_ToMatrix, METH_NOARGS, Quaternion_ToMatrix_doc},
- {"cross", (PyCFunction) Quaternion_Cross, METH_O, Quaternion_Cross_doc},
- {"dot", (PyCFunction) Quaternion_Dot, METH_O, Quaternion_Dot_doc},
- {"difference", (PyCFunction) Quaternion_Difference, METH_O, Quaternion_Difference_doc},
- {"slerp", (PyCFunction) Quaternion_Slerp, METH_VARARGS, Quaternion_Slerp_doc},
+ /* in place only */
+ {"identity", (PyCFunction) Quaternion_identity, METH_NOARGS, Quaternion_identity_doc},
+ {"negate", (PyCFunction) Quaternion_negate, METH_NOARGS, Quaternion_negate_doc},
+
+ /* operate on original or copy */
+ {"conjugate", (PyCFunction) Quaternion_conjugate, METH_NOARGS, Quaternion_conjugate_doc},
+ {"conjugated", (PyCFunction) Quaternion_conjugated, METH_NOARGS, Quaternion_conjugated_doc},
+
+ {"invert", (PyCFunction) Quaternion_invert, METH_NOARGS, Quaternion_invert_doc},
+ {"inverted", (PyCFunction) Quaternion_inverted, METH_NOARGS, Quaternion_inverted_doc},
+
+ {"normalize", (PyCFunction) Quaternion_normalize, METH_NOARGS, Quaternion_normalize_doc},
+ {"normalized", (PyCFunction) Quaternion_normalized, METH_NOARGS, Quaternion_normalized_doc},
+
+ /* return converted representation */
+ {"to_euler", (PyCFunction) Quaternion_to_euler, METH_VARARGS, Quaternion_to_euler_doc},
+ {"to_matrix", (PyCFunction) Quaternion_to_matrix, METH_NOARGS, Quaternion_to_matrix_doc},
+
+ /* operation between 2 or more types */
+ {"cross", (PyCFunction) Quaternion_cross, METH_O, Quaternion_cross_doc},
+ {"dot", (PyCFunction) Quaternion_dot, METH_O, Quaternion_dot_doc},
+ {"difference", (PyCFunction) Quaternion_difference, METH_O, Quaternion_difference_doc},
+ {"slerp", (PyCFunction) Quaternion_slerp, METH_VARARGS, Quaternion_slerp_doc},
+ {"rotate", (PyCFunction) Quaternion_rotate, METH_VARARGS, Quaternion_rotate_doc},
+
{"__copy__", (PyCFunction) Quaternion_copy, METH_NOARGS, Quaternion_copy_doc},
{"copy", (PyCFunction) Quaternion_copy, METH_NOARGS, Quaternion_copy_doc},
{NULL, NULL, 0, NULL}
@@ -922,25 +1006,25 @@ static struct PyMethodDef Quaternion_methods[] = {
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Quaternion_getseters[] = {
- {"w", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, "Quaternion W value.\n\n:type: float", (void *)0},
- {"x", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, "Quaternion X axis.\n\n:type: float", (void *)1},
- {"y", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, "Quaternion Y axis.\n\n:type: float", (void *)2},
- {"z", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, "Quaternion Z axis.\n\n:type: float", (void *)3},
- {"magnitude", (getter)Quaternion_getMagnitude, (setter)NULL, "Size of the quaternion (readonly).\n\n:type: float", NULL},
- {"angle", (getter)Quaternion_getAngle, (setter)Quaternion_setAngle, "angle of the quaternion.\n\n:type: float", NULL},
- {"axis",(getter)Quaternion_getAxisVec, (setter)Quaternion_setAxisVec, "quaternion axis as a vector.\n\n:type: :class:`Vector`", NULL},
- {"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
- {"owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
+ {(char *)"w", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, (char *)"Quaternion W value.\n\n:type: float", (void *)0},
+ {(char *)"x", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, (char *)"Quaternion X axis.\n\n:type: float", (void *)1},
+ {(char *)"y", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, (char *)"Quaternion Y axis.\n\n:type: float", (void *)2},
+ {(char *)"z", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, (char *)"Quaternion Z axis.\n\n:type: float", (void *)3},
+ {(char *)"magnitude", (getter)Quaternion_getMagnitude, (setter)NULL, (char *)"Size of the quaternion (readonly).\n\n:type: float", NULL},
+ {(char *)"angle", (getter)Quaternion_getAngle, (setter)Quaternion_setAngle, (char *)"angle of the quaternion.\n\n:type: float", NULL},
+ {(char *)"axis",(getter)Quaternion_getAxisVec, (setter)Quaternion_setAxisVec, (char *)"quaternion axis as a vector.\n\n:type: :class:`Vector`", NULL},
+ {(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, (char *)BaseMathObject_Wrapped_doc, NULL},
+ {(char *)"owner", (getter)BaseMathObject_getOwner, (setter)NULL, (char *)BaseMathObject_Owner_doc, NULL},
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
//------------------PY_OBECT DEFINITION--------------------------
static char quaternion_doc[] =
-"This object gives access to Quaternions in Blender.";
-
+"This object gives access to Quaternions in Blender."
+;
PyTypeObject quaternion_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "quaternion", //tp_name
+ "mathutils.Quaternion", //tp_name
sizeof(QuaternionObject), //tp_basicsize
0, //tp_itemsize
(destructor)BaseMathObject_dealloc, //tp_dealloc
@@ -995,7 +1079,7 @@ PyTypeObject quaternion_Type = {
PyObject *newQuaternionObject(float *quat, int type, PyTypeObject *base_type)
{
QuaternionObject *self;
-
+
if(base_type) self = (QuaternionObject *)base_type->tp_alloc(base_type, 0);
else self = PyObject_NEW(QuaternionObject, &quaternion_Type);
diff --git a/source/blender/python/generic/mathutils_quat.h b/source/blender/python/generic/mathutils_quat.h
index c9ec12d6152..cfa82f20d42 100644
--- a/source/blender/python/generic/mathutils_quat.h
+++ b/source/blender/python/generic/mathutils_quat.h
@@ -28,8 +28,8 @@
*
*/
-#ifndef EXPP_quat_h
-#define EXPP_quat_h
+#ifndef MATHUTILS_QUAT_H
+#define MATHUTILS_QUAT_H
#include <Python.h>
@@ -49,4 +49,4 @@ blender (stored in blend_data). This is an either/or struct not both*/
PyObject *newQuaternionObject( float *quat, int type, PyTypeObject *base_type);
PyObject *newQuaternionObject_cb(PyObject *cb_user, int cb_type, int cb_subtype);
-#endif /* EXPP_quat_h */
+#endif /* MATHUTILS_QUAT_H */
diff --git a/source/blender/python/generic/mathutils_vector.c b/source/blender/python/generic/mathutils_vector.c
index 7b73a7501bb..27eb531ff21 100644
--- a/source/blender/python/generic/mathutils_vector.c
+++ b/source/blender/python/generic/mathutils_vector.c
@@ -19,7 +19,7 @@
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
- *
+ *
* Contributor(s): Willian P. Germano, Joseph Gilbert, Ken Hughes, Alex Fraser, Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
@@ -28,10 +28,11 @@
#include "mathutils.h"
#include "BLI_blenlib.h"
-#include "BKE_utildefines.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#define MAX_DIMENSIONS 4
+
/* Swizzle axes get packed into a single value that is used as a closure. Each
axis uses SWIZZLE_BITS_PER_AXIS bits. The first bit (SWIZZLE_VALID_AXIS) is
used as a sentinel: if it is unset, the axis is not valid. */
@@ -39,13 +40,13 @@
#define SWIZZLE_VALID_AXIS 0x4
#define SWIZZLE_AXIS 0x3
-static int row_vector_multiplication(float rvec[4], VectorObject* vec, MatrixObject * mat); /* utility func */
-static PyObject *Vector_ToTupleExt(VectorObject *self, int ndigits);
+static PyObject *Vector_copy(VectorObject *self);
+static PyObject *Vector_to_tuple_ext(VectorObject *self, int ndigits);
-//----------------------------------mathutils.Vector() ------------------
-// Supports 2D, 3D, and 4D vector objects both int and float values
-// accepted. Mixed float and int values accepted. Ints are parsed to float
-static PyObject *Vector_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+/* Supports 2D, 3D, and 4D vector objects both int and float values
+ * accepted. Mixed float and int values accepted. Ints are parsed to float
+ */
+static PyObject *Vector_new(PyTypeObject *type, PyObject *args, PyObject *UNUSED(kwds))
{
float vec[4]= {0.0f, 0.0f, 0.0f, 0.0f};
int size= 3; /* default to a 3D vector */
@@ -64,47 +65,51 @@ static PyObject *Vector_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return newVectorObject(vec, size, Py_NEW, type);
}
+static PyObject *vec__apply_to_copy(PyNoArgsFunction vec_func, VectorObject *self)
+{
+ PyObject *ret= Vector_copy(self);
+ PyObject *ret_dummy= vec_func(ret);
+ if(ret_dummy) {
+ Py_DECREF(ret_dummy);
+ return (PyObject *)ret;
+ }
+ else { /* error */
+ Py_DECREF(ret);
+ return NULL;
+ }
+}
+
/*-----------------------------METHODS---------------------------- */
-static char Vector_Zero_doc[] =
+static char Vector_zero_doc[] =
".. method:: zero()\n"
"\n"
" Set all values to zero.\n"
-"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Zero(VectorObject *self)
+;
+static PyObject *Vector_zero(VectorObject *self)
{
- int i;
- for(i = 0; i < self->size; i++) {
- self->vec[i] = 0.0f;
- }
-
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject*)self;
+ fill_vn(self->vec, self->size, 0.0f);
+
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
-/*----------------------------Vector.normalize() ----------------- */
-static char Vector_Normalize_doc[] =
+
+static char Vector_normalize_doc[] =
".. method:: normalize()\n"
"\n"
" Normalize the vector, making the length of the vector always 1.0.\n"
"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Vector`\n"
-"\n"
" .. warning:: Normalizing a vector where all values are zero results in all axis having a nan value (not a number).\n"
"\n"
-" .. note:: Normalize works for vectors of all sizes, however 4D Vectors w axis is left untouched.\n";
-
-static PyObject *Vector_Normalize(VectorObject *self)
+" .. note:: Normalize works for vectors of all sizes, however 4D Vectors w axis is left untouched.\n"
+;
+static PyObject *Vector_normalize(VectorObject *self)
{
int i;
float norm = 0.0f;
if(!BaseMath_ReadCallback(self))
return NULL;
-
+
for(i = 0; i < self->size; i++) {
norm += self->vec[i] * self->vec[i];
}
@@ -112,99 +117,106 @@ static PyObject *Vector_Normalize(VectorObject *self)
for(i = 0; i < self->size; i++) {
self->vec[i] /= norm;
}
-
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject*)self;
-}
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
+}
+static char Vector_normalized_doc[] =
+".. method:: normalized()\n"
+"\n"
+" Return a new, normalized vector.\n"
+"\n"
+" :return: a normalized copy of the vector\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_normalized(VectorObject *self)
+{
+ return vec__apply_to_copy((PyNoArgsFunction)Vector_normalize, self);
+}
-/*----------------------------Vector.resize2D() ------------------ */
-static char Vector_Resize2D_doc[] =
-".. method:: resize2D()\n"
+static char Vector_resize_2d_doc[] =
+".. method:: resize_2d()\n"
"\n"
" Resize the vector to 2D (x, y).\n"
"\n"
" :return: an instance of itself\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Resize2D(VectorObject *self)
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_resize_2d(VectorObject *self)
{
if(self->wrapped==Py_WRAP) {
- PyErr_SetString(PyExc_TypeError, "vector.resize2D(): cannot resize wrapped data - only python vectors\n");
+ PyErr_SetString(PyExc_TypeError, "vector.resize_2d(): cannot resize wrapped data - only python vectors");
return NULL;
}
if(self->cb_user) {
- PyErr_SetString(PyExc_TypeError, "vector.resize2D(): cannot resize a vector that has an owner");
+ PyErr_SetString(PyExc_TypeError, "vector.resize_2d(): cannot resize a vector that has an owner");
return NULL;
}
-
+
self->vec = PyMem_Realloc(self->vec, (sizeof(float) * 2));
if(self->vec == NULL) {
- PyErr_SetString(PyExc_MemoryError, "vector.resize2D(): problem allocating pointer space\n\n");
+ PyErr_SetString(PyExc_MemoryError, "vector.resize_2d(): problem allocating pointer space");
return NULL;
}
-
+
self->size = 2;
- Py_INCREF(self);
- return (PyObject*)self;
+ Py_RETURN_NONE;
}
-/*----------------------------Vector.resize3D() ------------------ */
-static char Vector_Resize3D_doc[] =
-".. method:: resize3D()\n"
+
+static char Vector_resize_3d_doc[] =
+".. method:: resize_3d()\n"
"\n"
" Resize the vector to 3D (x, y, z).\n"
"\n"
" :return: an instance of itself\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Resize3D(VectorObject *self)
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_resize_3d(VectorObject *self)
{
if (self->wrapped==Py_WRAP) {
- PyErr_SetString(PyExc_TypeError, "vector.resize3D(): cannot resize wrapped data - only python vectors\n");
+ PyErr_SetString(PyExc_TypeError, "vector.resize_3d(): cannot resize wrapped data - only python vectors");
return NULL;
}
if(self->cb_user) {
- PyErr_SetString(PyExc_TypeError, "vector.resize3D(): cannot resize a vector that has an owner");
+ PyErr_SetString(PyExc_TypeError, "vector.resize_3d(): cannot resize a vector that has an owner");
return NULL;
}
-
+
self->vec = PyMem_Realloc(self->vec, (sizeof(float) * 3));
if(self->vec == NULL) {
- PyErr_SetString(PyExc_MemoryError, "vector.resize3D(): problem allocating pointer space\n\n");
+ PyErr_SetString(PyExc_MemoryError, "vector.resize_3d(): problem allocating pointer space");
return NULL;
}
-
+
if(self->size == 2)
self->vec[2] = 0.0f;
-
+
self->size = 3;
- Py_INCREF(self);
- return (PyObject*)self;
+ Py_RETURN_NONE;
}
-/*----------------------------Vector.resize4D() ------------------ */
-static char Vector_Resize4D_doc[] =
-".. method:: resize4D()\n"
+
+static char Vector_resize_4d_doc[] =
+".. method:: resize_4d()\n"
"\n"
" Resize the vector to 4D (x, y, z, w).\n"
"\n"
" :return: an instance of itself\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Resize4D(VectorObject *self)
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_resize_4d(VectorObject *self)
{
if(self->wrapped==Py_WRAP) {
- PyErr_SetString(PyExc_TypeError, "vector.resize4D(): cannot resize wrapped data - only python vectors");
+ PyErr_SetString(PyExc_TypeError, "vector.resize_4d(): cannot resize wrapped data - only python vectors");
return NULL;
}
if(self->cb_user) {
- PyErr_SetString(PyExc_TypeError, "vector.resize4D(): cannot resize a vector that has an owner");
+ PyErr_SetString(PyExc_TypeError, "vector.resize_4d(): cannot resize a vector that has an owner");
return NULL;
}
-
+
self->vec = PyMem_Realloc(self->vec, (sizeof(float) * 4));
if(self->vec == NULL) {
- PyErr_SetString(PyExc_MemoryError, "vector.resize4D(): problem allocating pointer space\n\n");
+ PyErr_SetString(PyExc_MemoryError, "vector.resize_4d(): problem allocating pointer space");
return NULL;
}
if(self->size == 2){
@@ -214,12 +226,61 @@ static PyObject *Vector_Resize4D(VectorObject *self)
self->vec[3] = 1.0f;
}
self->size = 4;
- Py_INCREF(self);
- return (PyObject*)self;
+ Py_RETURN_NONE;
}
+static char Vector_to_2d_doc[] =
+".. method:: to_2d()\n"
+"\n"
+" Return a 2d copy of the vector.\n"
+"\n"
+" :return: a new vector\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_to_2d(VectorObject *self)
+{
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ return newVectorObject(self->vec, 2, Py_NEW, Py_TYPE(self));
+}
+static char Vector_to_3d_doc[] =
+".. method:: to_3d()\n"
+"\n"
+" Return a 3d copy of the vector.\n"
+"\n"
+" :return: a new vector\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_to_3d(VectorObject *self)
+{
+ float tvec[3]= {0.0f};
-/*----------------------------Vector.toTuple() ------------------ */
-static char Vector_ToTuple_doc[] =
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ memcpy(tvec, self->vec, sizeof(float) * MIN2(self->size, 3));
+ return newVectorObject(tvec, 3, Py_NEW, Py_TYPE(self));
+}
+static char Vector_to_4d_doc[] =
+".. method:: to_4d()\n"
+"\n"
+" Return a 4d copy of the vector.\n"
+"\n"
+" :return: a new vector\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_to_4d(VectorObject *self)
+{
+ float tvec[4]= {0.0f, 0.0f, 0.0f, 1.0f};
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ memcpy(tvec, self->vec, sizeof(float) * MIN2(self->size, 4));
+ return newVectorObject(tvec, 4, Py_NEW, Py_TYPE(self));
+}
+
+static char Vector_to_tuple_doc[] =
".. method:: to_tuple(precision=-1)\n"
"\n"
" Return this vector as a tuple with.\n"
@@ -227,10 +288,10 @@ static char Vector_ToTuple_doc[] =
" :arg precision: The number to round the value to in [-1, 21].\n"
" :type precision: int\n"
" :return: the values of the vector rounded by *precision*\n"
-" :rtype: tuple\n";
-
+" :rtype: tuple\n"
+;
/* note: BaseMath_ReadCallback must be called beforehand */
-static PyObject *Vector_ToTupleExt(VectorObject *self, int ndigits)
+static PyObject *Vector_to_tuple_ext(VectorObject *self, int ndigits)
{
PyObject *ret;
int i;
@@ -251,7 +312,7 @@ static PyObject *Vector_ToTupleExt(VectorObject *self, int ndigits)
return ret;
}
-static PyObject *Vector_ToTuple(VectorObject *self, PyObject *args)
+static PyObject *Vector_to_tuple(VectorObject *self, PyObject *args)
{
int ndigits= 0;
@@ -269,11 +330,10 @@ static PyObject *Vector_ToTuple(VectorObject *self, PyObject *args)
if(!BaseMath_ReadCallback(self))
return NULL;
- return Vector_ToTupleExt(self, ndigits);
+ return Vector_to_tuple_ext(self, ndigits);
}
-/*----------------------------Vector.toTrackQuat(track, up) ---------------------- */
-static char Vector_ToTrackQuat_doc[] =
+static char Vector_to_track_quat_doc[] =
".. method:: to_track_quat(track, up)\n"
"\n"
" Return a quaternion rotation from the vector and the track and up axis.\n"
@@ -283,22 +343,22 @@ static char Vector_ToTrackQuat_doc[] =
" :arg up: Up axis in ['X', 'Y', 'Z'].\n"
" :type up: string\n"
" :return: rotation from the vector and the track and up axis.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Vector_ToTrackQuat(VectorObject *self, PyObject *args )
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Vector_to_track_quat(VectorObject *self, PyObject *args )
{
float vec[3], quat[4];
- char *strack, *sup;
+ const char *strack, *sup;
short track = 2, up = 1;
if(!PyArg_ParseTuple( args, "|ss:to_track_quat", &strack, &sup))
return NULL;
if (self->size != 3) {
- PyErr_SetString( PyExc_TypeError, "only for 3D vectors\n" );
+ PyErr_SetString(PyExc_TypeError, "only for 3D vectors");
return NULL;
}
-
+
if(!BaseMath_ReadCallback(self))
return NULL;
@@ -316,12 +376,12 @@ static PyObject *Vector_ToTrackQuat(VectorObject *self, PyObject *args )
track = 5;
break;
default:
- PyErr_SetString( PyExc_ValueError, "only X, -X, Y, -Y, Z or -Z for track axis\n" );
+ PyErr_SetString(PyExc_ValueError, "only X, -X, Y, -Y, Z or -Z for track axis");
return NULL;
}
}
else {
- PyErr_SetString( PyExc_ValueError, "only X, -X, Y, -Y, Z or -Z for track axis\n" );
+ PyErr_SetString(PyExc_ValueError, "only X, -X, Y, -Y, Z or -Z for track axis");
return NULL;
}
}
@@ -338,12 +398,12 @@ static PyObject *Vector_ToTrackQuat(VectorObject *self, PyObject *args )
track = 2;
break;
default:
- PyErr_SetString( PyExc_ValueError, "only X, -X, Y, -Y, Z or -Z for track axis\n" );
+ PyErr_SetString(PyExc_ValueError, "only X, -X, Y, -Y, Z or -Z for track axis");
return NULL;
}
}
else {
- PyErr_SetString( PyExc_ValueError, "only X, -X, Y, -Y, Z or -Z for track axis\n" );
+ PyErr_SetString(PyExc_ValueError, "only X, -X, Y, -Y, Z or -Z for track axis");
return NULL;
}
}
@@ -354,46 +414,44 @@ static PyObject *Vector_ToTrackQuat(VectorObject *self, PyObject *args )
case 'X':
up = 0;
break;
- case 'y':
+ case 'Y':
up = 1;
break;
case 'Z':
up = 2;
break;
default:
- PyErr_SetString( PyExc_ValueError, "only X, Y or Z for up axis\n" );
+ PyErr_SetString(PyExc_ValueError, "only X, Y or Z for up axis");
return NULL;
}
}
else {
- PyErr_SetString( PyExc_ValueError, "only X, Y or Z for up axis\n" );
+ PyErr_SetString(PyExc_ValueError, "only X, Y or Z for up axis");
return NULL;
}
}
if (track == up) {
- PyErr_SetString( PyExc_ValueError, "Can't have the same axis for track and up\n" );
+ PyErr_SetString(PyExc_ValueError, "Can't have the same axis for track and up");
return NULL;
}
/*
- flip vector around, since vectoquat expect a vector from target to tracking object
+ flip vector around, since vectoquat expect a vector from target to tracking object
and the python function expects the inverse (a vector to the target).
*/
- vec[0] = -self->vec[0];
- vec[1] = -self->vec[1];
- vec[2] = -self->vec[2];
+ negate_v3_v3(vec, self->vec);
vec_to_quat( quat,vec, track, up);
return newQuaternionObject(quat, Py_NEW, NULL);
}
-/*----------------------------Vector.reflect(mirror) ----------------------
- return a reflected vector on the mirror normal
- vec - ((2 * DotVecs(vec, mirror)) * mirror)
-*/
-static char Vector_Reflect_doc[] =
+/*
+ * Vector.reflect(mirror): return a reflected vector on the mirror normal
+ * vec - ((2 * DotVecs(vec, mirror)) * mirror)
+ */
+static char Vector_reflect_doc[] =
".. method:: reflect(mirror)\n"
"\n"
" Return the reflection vector from the *mirror* argument.\n"
@@ -401,38 +459,38 @@ static char Vector_Reflect_doc[] =
" :arg mirror: This vector could be a normal from the reflecting surface.\n"
" :type mirror: :class:`Vector`\n"
" :return: The reflected vector matching the size of this vector.\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Reflect(VectorObject *self, VectorObject *value )
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_reflect(VectorObject *self, PyObject *value)
{
+ int value_size;
float mirror[3], vec[3];
- float reflect[3] = {0.0f, 0.0f, 0.0f};
-
- if (!VectorObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "vec.reflect(value): expected a vector argument" );
+ float reflect[3] = {0.0f};
+ float tvec[MAX_DIMENSIONS];
+
+ if(!BaseMath_ReadCallback(self))
return NULL;
- }
-
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
+
+ if((value_size= mathutils_array_parse(tvec, 2, 4, value, "vector.reflect(other), invalid 'other' arg")) == -1)
return NULL;
-
- mirror[0] = value->vec[0];
- mirror[1] = value->vec[1];
- if (value->size > 2) mirror[2] = value->vec[2];
+
+ mirror[0] = tvec[0];
+ mirror[1] = tvec[1];
+ if (value_size > 2) mirror[2] = tvec[2];
else mirror[2] = 0.0;
-
+
vec[0] = self->vec[0];
vec[1] = self->vec[1];
if (self->size > 2) vec[2] = self->vec[2];
else vec[2] = 0.0;
-
+
normalize_v3(mirror);
reflect_v3_v3v3(reflect, vec, mirror);
-
- return newVectorObject(reflect, self->size, Py_NEW, NULL);
+
+ return newVectorObject(reflect, self->size, Py_NEW, Py_TYPE(self));
}
-static char Vector_Cross_doc[] =
+static char Vector_cross_doc[] =
".. method:: cross(other)\n"
"\n"
" Return the cross product of this vector and another.\n"
@@ -442,31 +500,25 @@ static char Vector_Cross_doc[] =
" :return: The cross product.\n"
" :rtype: :class:`Vector`\n"
"\n"
-" .. note:: both vectors must be 3D\n";
-
-static PyObject *Vector_Cross(VectorObject *self, VectorObject *value )
+" .. note:: both vectors must be 3D\n"
+;
+static PyObject *Vector_cross(VectorObject *self, PyObject *value)
{
- VectorObject *vecCross = NULL;
+ VectorObject *ret;
+ float tvec[MAX_DIMENSIONS];
- if (!VectorObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "vec.cross(value): expected a vector argument" );
- return NULL;
- }
-
- if(self->size != 3 || value->size != 3) {
- PyErr_SetString(PyExc_AttributeError, "vec.cross(value): expects both vectors to be 3D\n");
+ if(!BaseMath_ReadCallback(self))
return NULL;
- }
-
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
+
+ if(mathutils_array_parse(tvec, self->size, self->size, value, "vector.cross(other), invalid 'other' arg") == -1)
return NULL;
-
- vecCross = (VectorObject *)newVectorObject(NULL, 3, Py_NEW, NULL);
- cross_v3_v3v3(vecCross->vec, self->vec, value->vec);
- return (PyObject *)vecCross;
+
+ ret= (VectorObject *)newVectorObject(NULL, 3, Py_NEW, Py_TYPE(self));
+ cross_v3_v3v3(ret->vec, self->vec, tvec);
+ return (PyObject *)ret;
}
-static char Vector_Dot_doc[] =
+static char Vector_dot_doc[] =
".. method:: dot(other)\n"
"\n"
" Return the dot product of this vector and another.\n"
@@ -474,33 +526,28 @@ static char Vector_Dot_doc[] =
" :arg other: The other vector to perform the dot product with.\n"
" :type other: :class:`Vector`\n"
" :return: The dot product.\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Dot(VectorObject *self, VectorObject *value )
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_dot(VectorObject *self, PyObject *value)
{
+ float tvec[MAX_DIMENSIONS];
double dot = 0.0;
int x;
-
- if (!VectorObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "vec.dot(value): expected a vector argument" );
- return NULL;
- }
-
- if(self->size != value->size) {
- PyErr_SetString(PyExc_AttributeError, "vec.dot(value): expects both vectors to have the same size\n");
+
+ if(!BaseMath_ReadCallback(self))
return NULL;
- }
-
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
+
+ if(mathutils_array_parse(tvec, self->size, self->size, value, "vector.dot(other), invalid 'other' arg") == -1)
return NULL;
-
+
for(x = 0; x < self->size; x++) {
- dot += self->vec[x] * value->vec[x];
+ dot += self->vec[x] * tvec[x];
}
+
return PyFloat_FromDouble(dot);
}
-static char Vector_angle_doc[] =
+static char Vector_angle_doc[] =
".. function:: angle(other, fallback)\n"
"\n"
" Return the angle between two vectors.\n"
@@ -512,36 +559,29 @@ static char Vector_angle_doc[] =
" :return: angle in radians or fallback when given\n"
" :rtype: float\n"
"\n"
-" .. note:: Zero length vectors raise an :exc:`AttributeError`.\n";
+" .. note:: Zero length vectors raise an :exc:`AttributeError`.\n"
+;
static PyObject *Vector_angle(VectorObject *self, PyObject *args)
{
- VectorObject *value;
- double dot = 0.0f, angleRads, test_v1 = 0.0f, test_v2 = 0.0f;
- int x, size;
+ const int size= self->size;
+ float tvec[MAX_DIMENSIONS];
+ PyObject *value;
+ double dot = 0.0f, test_v1 = 0.0f, test_v2 = 0.0f;
+ int x;
PyObject *fallback= NULL;
-
- if(!PyArg_ParseTuple(args, "O!|O:angle", &vector_Type, &value, &fallback))
- return NULL;
- if (!VectorObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "vec.angle(value): expected a vector argument" );
+ if(!PyArg_ParseTuple(args, "O|O:angle", &value, &fallback))
return NULL;
- }
-
- if(self->size != value->size) {
- PyErr_SetString(PyExc_AttributeError, "vec.angle(value): expects both vectors to have the same size\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
+
+ if(!BaseMath_ReadCallback(self))
return NULL;
- //since size is the same....
- size = self->size;
+ if(mathutils_array_parse(tvec, size, size, value, "vector.angle(other), invalid 'other' arg") == -1)
+ return NULL;
for(x = 0; x < size; x++) {
test_v1 += self->vec[x] * self->vec[x];
- test_v2 += value->vec[x] * value->vec[x];
+ test_v2 += tvec[x] * tvec[x];
}
if (!test_v1 || !test_v2){
/* avoid exception */
@@ -550,23 +590,21 @@ static PyObject *Vector_angle(VectorObject *self, PyObject *args)
return fallback;
}
else {
- PyErr_SetString(PyExc_ValueError, "vector.angle(other): zero length vectors have no valid angle\n");
+ PyErr_SetString(PyExc_ValueError, "vector.angle(other): zero length vectors have no valid angle");
return NULL;
}
}
//dot product
- for(x = 0; x < size; x++) {
- dot += self->vec[x] * value->vec[x];
+ for(x = 0; x < self->size; x++) {
+ dot += self->vec[x] * tvec[x];
}
dot /= (sqrt(test_v1) * sqrt(test_v2));
- angleRads = (double)saacos(dot);
-
- return PyFloat_FromDouble(angleRads);
+ return PyFloat_FromDouble(saacos(dot));
}
-static char Vector_Difference_doc[] =
+static char Vector_difference_doc[] =
".. function:: difference(other)\n"
"\n"
" Returns a quaternion representing the rotational difference between this vector and another.\n"
@@ -576,34 +614,32 @@ static char Vector_Difference_doc[] =
" :return: the rotational difference between the two vectors.\n"
" :rtype: :class:`Quaternion`\n"
"\n"
-" .. note:: 2D vectors raise an :exc:`AttributeError`.\n";;
-
-static PyObject *Vector_Difference(VectorObject *self, VectorObject *value )
+" .. note:: 2D vectors raise an :exc:`AttributeError`.\n"
+;
+static PyObject *Vector_difference(VectorObject *self, PyObject *value)
{
float quat[4], vec_a[3], vec_b[3];
- if (!VectorObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "vec.difference(value): expected a vector argument" );
+ if(self->size < 3) {
+ PyErr_SetString(PyExc_AttributeError, "vec.difference(value): expects both vectors to be size 3 or 4");
return NULL;
}
- if(self->size < 3 || value->size < 3) {
- PyErr_SetString(PyExc_AttributeError, "vec.difference(value): expects both vectors to be size 3 or 4\n");
+ if(!BaseMath_ReadCallback(self))
return NULL;
- }
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
+ if(mathutils_array_parse(vec_b, 3, MAX_DIMENSIONS, value, "vector.difference(other), invalid 'other' arg") == -1)
return NULL;
normalize_v3_v3(vec_a, self->vec);
- normalize_v3_v3(vec_b, value->vec);
+ normalize_v3(vec_b);
rotation_between_vecs_to_quat(quat, vec_a, vec_b);
return newQuaternionObject(quat, Py_NEW, NULL);
}
-static char Vector_Project_doc[] =
+static char Vector_project_doc[] =
".. function:: project(other)\n"
"\n"
" Return the projection of this vector onto the *other*.\n"
@@ -611,45 +647,39 @@ static char Vector_Project_doc[] =
" :arg other: second vector.\n"
" :type other: :class:`Vector`\n"
" :return: the parallel projection vector\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Project(VectorObject *self, VectorObject *value)
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_project(VectorObject *self, PyObject *value)
{
- float vec[4];
+ const int size= self->size;
+ float tvec[MAX_DIMENSIONS];
+ float vec[MAX_DIMENSIONS];
double dot = 0.0f, dot2 = 0.0f;
- int x, size;
+ int x;
- if (!VectorObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "vec.project(value): expected a vector argument" );
+ if(!BaseMath_ReadCallback(self))
return NULL;
- }
- if(self->size != value->size) {
- PyErr_SetString(PyExc_AttributeError, "vec.project(value): expects both vectors to have the same size\n");
+ if(mathutils_array_parse(tvec, size, size, value, "vector.project(other), invalid 'other' arg") == -1)
return NULL;
- }
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
+ if(!BaseMath_ReadCallback(self))
return NULL;
-
- //since they are the same size...
- size = self->size;
-
//get dot products
for(x = 0; x < size; x++) {
- dot += self->vec[x] * value->vec[x];
- dot2 += value->vec[x] * value->vec[x];
+ dot += self->vec[x] * tvec[x];
+ dot2 += tvec[x] * tvec[x];
}
//projection
dot /= dot2;
for(x = 0; x < size; x++) {
- vec[x] = (float)(dot * value->vec[x]);
+ vec[x] = (float)(dot * tvec[x]);
}
- return newVectorObject(vec, size, Py_NEW, NULL);
+ return newVectorObject(vec, size, Py_NEW, Py_TYPE(self));
}
-static char Vector_Lerp_doc[] =
+static char Vector_lerp_doc[] =
".. function:: lerp(other, factor)\n"
"\n"
" Returns the interpolation of two vectors.\n"
@@ -659,34 +689,62 @@ static char Vector_Lerp_doc[] =
" :arg factor: The interpolation value in [0.0, 1.0].\n"
" :type factor: float\n"
" :return: The interpolated rotation.\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Lerp(VectorObject *self, PyObject *args)
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_lerp(VectorObject *self, PyObject *args)
{
- VectorObject *vec2 = NULL;
- float fac, ifac, vec[4];
+ const int size= self->size;
+ PyObject *value= NULL;
+ float fac, ifac;
+ float tvec[MAX_DIMENSIONS], vec[MAX_DIMENSIONS];
int x;
- if(!PyArg_ParseTuple(args, "O!f:lerp", &vector_Type, &vec2, &fac))
+ if(!PyArg_ParseTuple(args, "Of:lerp", &value, &fac))
return NULL;
- if(self->size != vec2->size) {
- PyErr_SetString(PyExc_AttributeError, "vector.lerp(): expects (2) vector objects of the same size");
+ if(mathutils_array_parse(tvec, size, size, value, "vector.lerp(other), invalid 'other' arg") == -1)
return NULL;
- }
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(vec2))
+ if(!BaseMath_ReadCallback(self))
return NULL;
ifac= 1.0 - fac;
- for(x = 0; x < self->size; x++) {
- vec[x] = (ifac * self->vec[x]) + (fac * vec2->vec[x]);
+ for(x = 0; x < size; x++) {
+ vec[x] = (ifac * self->vec[x]) + (fac * tvec[x]);
}
- return newVectorObject(vec, self->size, Py_NEW, NULL);
+ return newVectorObject(vec, size, Py_NEW, Py_TYPE(self));
+}
+
+static char Vector_rotate_doc[] =
+".. function:: rotate(other)\n"
+"\n"
+" Return vector by a rotation value.\n"
+"\n"
+" :arg other: rotation component of mathutils value\n"
+" :type other: :class:`Euler`, :class:`Quaternion` or :class:`Matrix`\n"
+;
+static PyObject *Vector_rotate(VectorObject *self, PyObject *value)
+{
+ float other_rmat[3][3];
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(mathutils_any_to_rotmat(other_rmat, value, "vector.rotate(value)") == -1)
+ return NULL;
+
+ if(self->size < 3) {
+ PyErr_SetString(PyExc_ValueError, "Vector must be 3D or 4D");
+ return NULL;
+ }
+
+ mul_m3_v3(other_rmat, self->vec);
+
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
-/*----------------------------Vector.copy() -------------------------------------- */
static char Vector_copy_doc[] =
".. function:: copy()\n"
"\n"
@@ -695,18 +753,16 @@ static char Vector_copy_doc[] =
" :return: A copy of the vector.\n"
" :rtype: :class:`Vector`\n"
"\n"
-" .. note:: use this to get a copy of a wrapped vector with no reference to the original data.\n";
-
+" .. note:: use this to get a copy of a wrapped vector with no reference to the original data.\n"
+;
static PyObject *Vector_copy(VectorObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
-
+
return newVectorObject(self->vec, self->size, Py_NEW, Py_TYPE(self));
}
-/*----------------------------print object (internal)-------------
- print the object to screen */
static PyObject *Vector_repr(VectorObject *self)
{
PyObject *ret, *tuple;
@@ -714,265 +770,268 @@ static PyObject *Vector_repr(VectorObject *self)
if(!BaseMath_ReadCallback(self))
return NULL;
- tuple= Vector_ToTupleExt(self, -1);
+ tuple= Vector_to_tuple_ext(self, -1);
ret= PyUnicode_FromFormat("Vector(%R)", tuple);
Py_DECREF(tuple);
return ret;
}
-/*---------------------SEQUENCE PROTOCOLS------------------------
- ----------------------------len(object)------------------------
- sequence length*/
+/* Sequence Protocol */
+/* sequence length len(vector) */
static int Vector_len(VectorObject *self)
{
return self->size;
}
-/*----------------------------object[]---------------------------
- sequence accessor (get)*/
+/* sequence accessor (get): vector[index] */
static PyObject *Vector_item(VectorObject *self, int i)
{
if(i<0) i= self->size-i;
if(i < 0 || i >= self->size) {
- PyErr_SetString(PyExc_IndexError,"vector[index]: out of range\n");
+ PyErr_SetString(PyExc_IndexError,"vector[index]: out of range");
return NULL;
}
if(!BaseMath_ReadIndexCallback(self, i))
return NULL;
-
- return PyFloat_FromDouble(self->vec[i]);
+ return PyFloat_FromDouble(self->vec[i]);
}
-/*----------------------------object[]-------------------------
- sequence accessor (set)*/
+/* sequence accessor (set): vector[index] = value */
static int Vector_ass_item(VectorObject *self, int i, PyObject * ob)
{
float scalar;
if((scalar=PyFloat_AsDouble(ob))==-1.0f && PyErr_Occurred()) { /* parsed item not a number */
- PyErr_SetString(PyExc_TypeError, "vector[index] = x: index argument not a number\n");
+ PyErr_SetString(PyExc_TypeError, "vector[index] = x: index argument not a number");
return -1;
}
if(i<0) i= self->size-i;
if(i < 0 || i >= self->size){
- PyErr_SetString(PyExc_IndexError, "vector[index] = x: assignment index out of range\n");
+ PyErr_SetString(PyExc_IndexError, "vector[index] = x: assignment index out of range");
return -1;
}
self->vec[i] = scalar;
-
+
if(!BaseMath_WriteIndexCallback(self, i))
return -1;
return 0;
}
-/*----------------------------object[z:y]------------------------
- sequence slice (get) */
+/* sequence slice (get): vector[a:b] */
static PyObject *Vector_slice(VectorObject *self, int begin, int end)
{
- PyObject *list = NULL;
+ PyObject *tuple;
int count;
if(!BaseMath_ReadCallback(self))
return NULL;
-
+
CLAMP(begin, 0, self->size);
if (end<0) end= self->size+end+1;
CLAMP(end, 0, self->size);
- begin = MIN2(begin,end);
+ begin= MIN2(begin, end);
- list = PyList_New(end - begin);
+ tuple= PyTuple_New(end - begin);
for(count = begin; count < end; count++) {
- PyList_SET_ITEM(list, count - begin, PyFloat_FromDouble(self->vec[count]));
+ PyTuple_SET_ITEM(tuple, count - begin, PyFloat_FromDouble(self->vec[count]));
}
- return list;
+ return tuple;
}
-/*----------------------------object[z:y]------------------------
- sequence slice (set) */
+/* sequence slice (set): vector[a:b] = value */
static int Vector_ass_slice(VectorObject *self, int begin, int end,
PyObject * seq)
{
- int i, y, size = 0;
- float vec[4], scalar;
- PyObject *v;
+ int y, size = 0;
+ float vec[MAX_DIMENSIONS];
if(!BaseMath_ReadCallback(self))
return -1;
-
+
CLAMP(begin, 0, self->size);
- if (end<0) end= self->size+end+1;
CLAMP(end, 0, self->size);
begin = MIN2(begin,end);
- size = PySequence_Length(seq);
- if(size != (end - begin)){
- PyErr_SetString(PyExc_TypeError, "vector[begin:end] = []: size mismatch in slice assignment\n");
+ size = (end - begin);
+ if(mathutils_array_parse(vec, size, size, seq, "vector[begin:end] = [...]") == -1)
return -1;
- }
-
- for (i = 0; i < size; i++) {
- v = PySequence_GetItem(seq, i);
- if (v == NULL) { /* Failed to read sequence */
- PyErr_SetString(PyExc_RuntimeError, "vector[begin:end] = []: unable to read sequence\n");
- return -1;
- }
-
- if((scalar=PyFloat_AsDouble(v)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
- Py_DECREF(v);
- PyErr_SetString(PyExc_TypeError, "vector[begin:end] = []: sequence argument not a number\n");
- return -1;
- }
- vec[i] = scalar;
- Py_DECREF(v);
- }
/*parsed well - now set in vector*/
for(y = 0; y < size; y++){
self->vec[begin + y] = vec[y];
}
-
+
if(!BaseMath_WriteCallback(self))
return -1;
-
+
return 0;
}
-/*------------------------NUMERIC PROTOCOLS----------------------
- ------------------------obj + obj------------------------------
- addition*/
+
+/* Numeric Protocols */
+/* addition: obj + obj */
static PyObject *Vector_add(PyObject * v1, PyObject * v2)
{
- int i;
- float vec[4];
-
VectorObject *vec1 = NULL, *vec2 = NULL;
-
- if VectorObject_Check(v1)
- vec1= (VectorObject *)v1;
-
- if VectorObject_Check(v2)
- vec2= (VectorObject *)v2;
-
- /* make sure v1 is always the vector */
- if (vec1 && vec2 ) {
-
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
- return NULL;
-
- /*VECTOR + VECTOR*/
- if(vec1->size != vec2->size) {
- PyErr_SetString(PyExc_AttributeError, "Vector addition: vectors must have the same dimensions for this operation\n");
- return NULL;
- }
- for(i = 0; i < vec1->size; i++) {
- vec[i] = vec1->vec[i] + vec2->vec[i];
- }
- return newVectorObject(vec, vec1->size, Py_NEW, NULL);
+ float vec[MAX_DIMENSIONS];
+
+ if (!VectorObject_Check(v1) || !VectorObject_Check(v2)) {
+ PyErr_SetString(PyExc_AttributeError, "Vector addition: arguments not valid for this operation");
+ return NULL;
}
-
- PyErr_SetString(PyExc_AttributeError, "Vector addition: arguments not valid for this operation....\n");
- return NULL;
+ vec1 = (VectorObject*)v1;
+ vec2 = (VectorObject*)v2;
+
+ if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
+ return NULL;
+
+ /*VECTOR + VECTOR*/
+ if(vec1->size != vec2->size) {
+ PyErr_SetString(PyExc_AttributeError, "Vector addition: vectors must have the same dimensions for this operation");
+ return NULL;
+ }
+
+ add_vn_vnvn(vec, vec1->vec, vec2->vec, vec1->size);
+
+ return newVectorObject(vec, vec1->size, Py_NEW, Py_TYPE(v1));
}
-/* ------------------------obj += obj------------------------------
- addition in place */
+/* addition in-place: obj += obj */
static PyObject *Vector_iadd(PyObject * v1, PyObject * v2)
{
- int i;
VectorObject *vec1 = NULL, *vec2 = NULL;
if (!VectorObject_Check(v1) || !VectorObject_Check(v2)) {
- PyErr_SetString(PyExc_AttributeError, "Vector addition: arguments not valid for this operation....\n");
+ PyErr_SetString(PyExc_AttributeError, "Vector addition: arguments not valid for this operation");
return NULL;
}
vec1 = (VectorObject*)v1;
vec2 = (VectorObject*)v2;
-
+
if(vec1->size != vec2->size) {
- PyErr_SetString(PyExc_AttributeError, "Vector addition: vectors must have the same dimensions for this operation\n");
+ PyErr_SetString(PyExc_AttributeError, "Vector addition: vectors must have the same dimensions for this operation");
return NULL;
}
-
+
if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
return NULL;
- for(i = 0; i < vec1->size; i++) {
- vec1->vec[i] = vec1->vec[i] + vec2->vec[i];
- }
+ add_vn_vn(vec1->vec, vec2->vec, vec1->size);
- BaseMath_WriteCallback(vec1);
- Py_INCREF( v1 );
+ (void)BaseMath_WriteCallback(vec1);
+ Py_INCREF(v1);
return v1;
}
-/*------------------------obj - obj------------------------------
- subtraction*/
+/* subtraction: obj - obj */
static PyObject *Vector_sub(PyObject * v1, PyObject * v2)
{
- int i;
- float vec[4];
VectorObject *vec1 = NULL, *vec2 = NULL;
+ float vec[MAX_DIMENSIONS];
if (!VectorObject_Check(v1) || !VectorObject_Check(v2)) {
- PyErr_SetString(PyExc_AttributeError, "Vector subtraction: arguments not valid for this operation....\n");
+ PyErr_SetString(PyExc_AttributeError, "Vector subtraction: arguments not valid for this operation");
return NULL;
}
vec1 = (VectorObject*)v1;
vec2 = (VectorObject*)v2;
-
+
if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
return NULL;
-
+
if(vec1->size != vec2->size) {
- PyErr_SetString(PyExc_AttributeError, "Vector subtraction: vectors must have the same dimensions for this operation\n");
+ PyErr_SetString(PyExc_AttributeError, "Vector subtraction: vectors must have the same dimensions for this operation");
return NULL;
}
- for(i = 0; i < vec1->size; i++) {
- vec[i] = vec1->vec[i] - vec2->vec[i];
- }
- return newVectorObject(vec, vec1->size, Py_NEW, NULL);
+ sub_vn_vnvn(vec, vec1->vec, vec2->vec, vec1->size);
+
+ return newVectorObject(vec, vec1->size, Py_NEW, Py_TYPE(v1));
}
-/*------------------------obj -= obj------------------------------
- subtraction*/
+/* subtraction in-place: obj -= obj */
static PyObject *Vector_isub(PyObject * v1, PyObject * v2)
{
- int i;
- VectorObject *vec1 = NULL, *vec2 = NULL;
+ VectorObject *vec1= NULL, *vec2= NULL;
if (!VectorObject_Check(v1) || !VectorObject_Check(v2)) {
- PyErr_SetString(PyExc_AttributeError, "Vector subtraction: arguments not valid for this operation....\n");
+ PyErr_SetString(PyExc_AttributeError, "Vector subtraction: arguments not valid for this operation");
return NULL;
}
vec1 = (VectorObject*)v1;
vec2 = (VectorObject*)v2;
-
+
if(vec1->size != vec2->size) {
- PyErr_SetString(PyExc_AttributeError, "Vector subtraction: vectors must have the same dimensions for this operation\n");
+ PyErr_SetString(PyExc_AttributeError, "Vector subtraction: vectors must have the same dimensions for this operation");
return NULL;
}
-
+
if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
return NULL;
- for(i = 0; i < vec1->size; i++) {
- vec1->vec[i] = vec1->vec[i] - vec2->vec[i];
- }
+ sub_vn_vn(vec1->vec, vec2->vec, vec1->size);
- BaseMath_WriteCallback(vec1);
- Py_INCREF( v1 );
+ (void)BaseMath_WriteCallback(vec1);
+ Py_INCREF(v1);
return v1;
}
/*------------------------obj * obj------------------------------
mulplication*/
+
+
+/* COLUMN VECTOR Multiplication (Vector X Matrix)
+ * [a] * [1][4][7]
+ * [b] * [2][5][8]
+ * [c] * [3][6][9]
+ *
+ * note: vector/matrix multiplication IS NOT COMMUTATIVE!!!!
+ * note: assume read callbacks have been done first.
+ */
+static int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject* vec, MatrixObject * mat)
+{
+ float vec_cpy[MAX_DIMENSIONS];
+ double dot = 0.0f;
+ int x, y, z = 0;
+
+ if(mat->row_size != vec->size){
+ if(mat->row_size == 4 && vec->size == 3) {
+ vec_cpy[3] = 1.0f;
+ }
+ else {
+ PyErr_SetString(PyExc_AttributeError, "matrix * vector: matrix.row_size and len(vector) must be the same, except for 3D vector * 4x4 matrix.");
+ return -1;
+ }
+ }
+
+ memcpy(vec_cpy, vec->vec, vec->size * sizeof(float));
+
+ rvec[3] = 1.0f;
+
+ for(x = 0; x < mat->col_size; x++) {
+ for(y = 0; y < mat->row_size; y++) {
+ dot += mat->matrix[y][x] * vec_cpy[y];
+ }
+ rvec[z++] = (float)dot;
+ dot = 0.0f;
+ }
+
+ return 0;
+}
+
+static PyObject *vector_mul_float(VectorObject *vec, const float scalar)
+{
+ float tvec[MAX_DIMENSIONS];
+ mul_vn_vn_fl(tvec, vec->vec, vec->size, scalar);
+ return newVectorObject(tvec, vec->size, Py_NEW, Py_TYPE(vec));
+}
+
static PyObject *Vector_mul(PyObject * v1, PyObject * v2)
{
VectorObject *vec1 = NULL, *vec2 = NULL;
float scalar;
-
+
if VectorObject_Check(v1) {
vec1= (VectorObject *)v1;
if(!BaseMath_ReadCallback(vec1))
@@ -983,189 +1042,189 @@ static PyObject *Vector_mul(PyObject * v1, PyObject * v2)
if(!BaseMath_ReadCallback(vec2))
return NULL;
}
-
-
+
+
/* make sure v1 is always the vector */
if (vec1 && vec2 ) {
int i;
double dot = 0.0f;
-
+
if(vec1->size != vec2->size) {
- PyErr_SetString(PyExc_AttributeError, "Vector multiplication: vectors must have the same dimensions for this operation\n");
+ PyErr_SetString(PyExc_AttributeError, "Vector multiplication: vectors must have the same dimensions for this operation");
return NULL;
}
-
+
/*dot product*/
for(i = 0; i < vec1->size; i++) {
dot += vec1->vec[i] * vec2->vec[i];
}
return PyFloat_FromDouble(dot);
}
-
- /* swap so vec1 is always the vector */
- /* note: it would seem from this code that the matrix multiplication below
- * is communicative. however the matrix class will always handle the
- * (matrix * vector) case so we can ignore it here.
- * This is NOT so for Quaternions: TODO, check if communicative (vec * quat) is correct */
- if (vec2) {
- vec1= vec2;
- v2= v1;
- }
-
- if (MatrixObject_Check(v2)) {
- /* VEC * MATRIX */
- float tvec[4];
- if(row_vector_multiplication(tvec, vec1, (MatrixObject*)v2) == -1)
- return NULL;
- return newVectorObject(tvec, vec1->size, Py_NEW, NULL);
- } else if (QuaternionObject_Check(v2)) {
- /* VEC * QUAT */
- QuaternionObject *quat2 = (QuaternionObject*)v2;
- float tvec[4];
+ else if (vec1) {
+ if (MatrixObject_Check(v2)) {
+ /* VEC * MATRIX */
+ float tvec[MAX_DIMENSIONS];
+ if(!BaseMath_ReadCallback((MatrixObject *)v2))
+ return NULL;
+ if(column_vector_multiplication(tvec, vec1, (MatrixObject*)v2) == -1) {
+ return NULL;
+ }
- if(vec1->size != 3) {
- PyErr_SetString(PyExc_TypeError, "Vector multiplication: only 3D vector rotations (with quats) currently supported\n");
- return NULL;
+ return newVectorObject(tvec, vec1->size, Py_NEW, Py_TYPE(vec1));
}
- if(!BaseMath_ReadCallback(quat2)) {
- return NULL;
+ else if (QuaternionObject_Check(v2)) {
+ /* VEC * QUAT */
+ QuaternionObject *quat2 = (QuaternionObject*)v2;
+ float tvec[3];
+
+ if(vec1->size != 3) {
+ PyErr_SetString(PyExc_TypeError, "Vector multiplication: only 3D vector rotations (with quats) currently supported");
+ return NULL;
+ }
+ if(!BaseMath_ReadCallback(quat2)) {
+ return NULL;
+ }
+ copy_v3_v3(tvec, vec1->vec);
+ mul_qt_v3(quat2->quat, tvec);
+ return newVectorObject(tvec, 3, Py_NEW, Py_TYPE(vec1));
+ }
+ else if (((scalar= PyFloat_AsDouble(v2)) == -1.0 && PyErr_Occurred())==0) { /* VEC*FLOAT */
+ return vector_mul_float(vec1, scalar);
}
- copy_v3_v3(tvec, vec1->vec);
- mul_qt_v3(quat2->quat, tvec);
- return newVectorObject(tvec, 3, Py_NEW, NULL);
}
- else if (((scalar= PyFloat_AsDouble(v2)) == -1.0 && PyErr_Occurred())==0) { /* VEC*FLOAT */
- int i;
- float vec[4];
-
- for(i = 0; i < vec1->size; i++) {
- vec[i] = vec1->vec[i] * scalar;
+ else if (vec2) {
+ if (((scalar= PyFloat_AsDouble(v1)) == -1.0 && PyErr_Occurred())==0) { /* VEC*FLOAT */
+ return vector_mul_float(vec2, scalar);
}
- return newVectorObject(vec, vec1->size, Py_NEW, NULL);
-
}
-
- PyErr_SetString(PyExc_TypeError, "Vector multiplication: arguments not acceptable for this operation\n");
+ else {
+ BLI_assert(!"internal error");
+ }
+
+ PyErr_Format(PyExc_TypeError, "Vector multiplication: not supported between '%.200s' and '%.200s' types", Py_TYPE(v1)->tp_name, Py_TYPE(v2)->tp_name);
return NULL;
}
-/*------------------------obj *= obj------------------------------
- in place mulplication */
+/* mulplication in-place: obj *= obj */
static PyObject *Vector_imul(PyObject * v1, PyObject * v2)
{
VectorObject *vec = (VectorObject *)v1;
- int i;
float scalar;
-
+
if(!BaseMath_ReadCallback(vec))
return NULL;
-
+
/* only support vec*=float and vec*=mat
vec*=vec result is a float so that wont work */
if (MatrixObject_Check(v2)) {
- float tvec[4];
- if(row_vector_multiplication(tvec, vec, (MatrixObject*)v2) == -1)
+ float rvec[MAX_DIMENSIONS];
+ if(!BaseMath_ReadCallback((MatrixObject *)v2))
return NULL;
- i= vec->size - 1;
- do {
- vec->vec[i] = tvec[i];
- } while(i--);
+ if(column_vector_multiplication(rvec, vec, (MatrixObject*)v2) == -1)
+ return NULL;
+
+ memcpy(vec->vec, rvec, sizeof(float) * vec->size);
+ }
+ else if (QuaternionObject_Check(v2)) {
+ /* VEC *= QUAT */
+ QuaternionObject *quat2 = (QuaternionObject*)v2;
+
+ if(vec->size != 3) {
+ PyErr_SetString(PyExc_TypeError, "Vector multiplication: only 3D vector rotations (with quats) currently supported");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(quat2)) {
+ return NULL;
+ }
+ mul_qt_v3(quat2->quat, vec->vec);
}
else if (((scalar= PyFloat_AsDouble(v2)) == -1.0 && PyErr_Occurred())==0) { /* VEC*=FLOAT */
- i= vec->size - 1;
- do {
- vec->vec[i] *= scalar;
- } while(i--);
+ mul_vn_fl(vec->vec, vec->size, scalar);
}
else {
- PyErr_SetString(PyExc_TypeError, "Vector multiplication: arguments not acceptable for this operation\n");
+ PyErr_SetString(PyExc_TypeError, "Vector multiplication: arguments not acceptable for this operation");
return NULL;
}
-
- BaseMath_WriteCallback(vec);
+
+ (void)BaseMath_WriteCallback(vec);
Py_INCREF( v1 );
return v1;
}
-/*------------------------obj / obj------------------------------
- divide*/
+/* divid: obj / obj */
static PyObject *Vector_div(PyObject * v1, PyObject * v2)
{
int i;
float vec[4], scalar;
VectorObject *vec1 = NULL;
-
+
if(!VectorObject_Check(v1)) { /* not a vector */
- PyErr_SetString(PyExc_TypeError, "Vector division: Vector must be divided by a float\n");
+ PyErr_SetString(PyExc_TypeError, "Vector division: Vector must be divided by a float");
return NULL;
}
vec1 = (VectorObject*)v1; /* vector */
-
+
if(!BaseMath_ReadCallback(vec1))
return NULL;
if((scalar=PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
- PyErr_SetString(PyExc_TypeError, "Vector division: Vector must be divided by a float\n");
+ PyErr_SetString(PyExc_TypeError, "Vector division: Vector must be divided by a float");
return NULL;
}
-
+
if(scalar==0.0) {
- PyErr_SetString(PyExc_ZeroDivisionError, "Vector division: divide by zero error.\n");
+ PyErr_SetString(PyExc_ZeroDivisionError, "Vector division: divide by zero error");
return NULL;
}
-
+
for(i = 0; i < vec1->size; i++) {
vec[i] = vec1->vec[i] / scalar;
}
- return newVectorObject(vec, vec1->size, Py_NEW, NULL);
+ return newVectorObject(vec, vec1->size, Py_NEW, Py_TYPE(v1));
}
-/*------------------------obj /= obj------------------------------
- divide*/
+/* divide in-place: obj /= obj */
static PyObject *Vector_idiv(PyObject * v1, PyObject * v2)
{
int i;
float scalar;
VectorObject *vec1 = (VectorObject*)v1;
-
+
if(!BaseMath_ReadCallback(vec1))
return NULL;
if((scalar=PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
- PyErr_SetString(PyExc_TypeError, "Vector division: Vector must be divided by a float\n");
+ PyErr_SetString(PyExc_TypeError, "Vector division: Vector must be divided by a float");
return NULL;
}
if(scalar==0.0) {
- PyErr_SetString(PyExc_ZeroDivisionError, "Vector division: divide by zero error.\n");
+ PyErr_SetString(PyExc_ZeroDivisionError, "Vector division: divide by zero error");
return NULL;
}
for(i = 0; i < vec1->size; i++) {
vec1->vec[i] /= scalar;
}
-
- BaseMath_WriteCallback(vec1);
-
+
+ (void)BaseMath_WriteCallback(vec1);
+
Py_INCREF( v1 );
return v1;
}
-/*-------------------------- -obj -------------------------------
+/* -obj
returns the negative of this object*/
static PyObject *Vector_neg(VectorObject *self)
{
- int i;
- float vec[4];
-
+ float tvec[MAX_DIMENSIONS];
+
if(!BaseMath_ReadCallback(self))
return NULL;
-
- for(i = 0; i < self->size; i++){
- vec[i] = -self->vec[i];
- }
- return newVectorObject(vec, self->size, Py_NEW, Py_TYPE(self));
+ negate_vn_vn(tvec, self->vec, self->size);
+ return newVectorObject(tvec, self->size, Py_NEW, Py_TYPE(self));
}
/*------------------------vec_magnitude_nosqrt (internal) - for comparing only */
@@ -1181,7 +1240,7 @@ static double vec_magnitude_nosqrt(float *data, int size)
/* warning, line above removed because we are not using the length,
rather the comparing the sizes and for this we do not need the sqrt
for the actual length, the dot must be sqrt'd */
- return (double)dot;
+ return dot;
}
@@ -1206,7 +1265,7 @@ static PyObject* Vector_richcmpr(PyObject *objectA, PyObject *objectB, int compa
if(!BaseMath_ReadCallback(vecA) || !BaseMath_ReadCallback(vecB))
return NULL;
-
+
if (vecA->size != vecB->size){
if (comparison_type == Py_NE){
Py_RETURN_TRUE;
@@ -1292,11 +1351,11 @@ static PyObject *Vector_subscript(VectorObject* self, PyObject* item)
} else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)item, self->size, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, self->size, &start, &stop, &step, &slicelength) < 0)
return NULL;
if (slicelength <= 0) {
- return PyList_New(0);
+ return PyTuple_New(0);
}
else if (step == 1) {
return Vector_slice(self, start, stop);
@@ -1307,9 +1366,7 @@ static PyObject *Vector_subscript(VectorObject* self, PyObject* item)
}
}
else {
- PyErr_Format(PyExc_TypeError,
- "vector indices must be integers, not %.200s",
- item->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "vector indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
return NULL;
}
}
@@ -1327,7 +1384,7 @@ static int Vector_ass_subscript(VectorObject* self, PyObject* item, PyObject* va
else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)item, self->size, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, self->size, &start, &stop, &step, &slicelength) < 0)
return -1;
if (step == 1)
@@ -1338,9 +1395,7 @@ static int Vector_ass_subscript(VectorObject* self, PyObject* item, PyObject* va
}
}
else {
- PyErr_Format(PyExc_TypeError,
- "vector indices must be integers, not %.200s",
- item->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "vector indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
return -1;
}
}
@@ -1394,37 +1449,37 @@ static PyNumberMethods Vector_NumMethods = {
/*
* vector axis, vector.x/y/z/w
*/
-
-static PyObject *Vector_getAxis(VectorObject *self, void *type )
+
+static PyObject *Vector_getAxis(VectorObject *self, void *type)
{
return Vector_item(self, GET_INT_FROM_POINTER(type));
}
-static int Vector_setAxis(VectorObject *self, PyObject * value, void * type )
+static int Vector_setAxis(VectorObject *self, PyObject * value, void *type)
{
return Vector_ass_item(self, GET_INT_FROM_POINTER(type), value);
}
/* vector.length */
-static PyObject *Vector_getLength(VectorObject *self, void *type )
+static PyObject *Vector_getLength(VectorObject *self, void *UNUSED(closure))
{
double dot = 0.0f;
int i;
-
+
if(!BaseMath_ReadCallback(self))
return NULL;
-
+
for(i = 0; i < self->size; i++){
dot += (self->vec[i] * self->vec[i]);
}
return PyFloat_FromDouble(sqrt(dot));
}
-static int Vector_setLength(VectorObject *self, PyObject * value )
+static int Vector_setLength(VectorObject *self, PyObject *value)
{
double dot = 0.0f, param;
int i;
-
+
if(!BaseMath_ReadCallback(self))
return -1;
@@ -1432,38 +1487,36 @@ static int Vector_setLength(VectorObject *self, PyObject * value )
PyErr_SetString(PyExc_TypeError, "length must be set to a number");
return -1;
}
-
+
if (param < 0.0f) {
- PyErr_SetString( PyExc_TypeError, "cannot set a vectors length to a negative value" );
+ PyErr_SetString(PyExc_TypeError, "cannot set a vectors length to a negative value");
return -1;
}
if (param == 0.0f) {
- for(i = 0; i < self->size; i++){
- self->vec[i]= 0;
- }
+ fill_vn(self->vec, self->size, 0.0f);
return 0;
}
-
+
for(i = 0; i < self->size; i++){
dot += (self->vec[i] * self->vec[i]);
}
if (!dot) /* cant sqrt zero */
return 0;
-
+
dot = sqrt(dot);
-
+
if (dot==param)
return 0;
-
+
dot= dot/param;
-
+
for(i = 0; i < self->size; i++){
self->vec[i]= self->vec[i] / (float)dot;
}
-
- BaseMath_WriteCallback(self); /* checked already */
-
+
+ (void)BaseMath_WriteCallback(self); /* checked already */
+
return 0;
}
@@ -1476,10 +1529,10 @@ static PyObject *Vector_getSwizzle(VectorObject *self, void *closure)
size_t axis_from;
float vec[MAX_DIMENSIONS];
unsigned int swizzleClosure;
-
+
if(!BaseMath_ReadCallback(self))
return NULL;
-
+
/* Unpack the axes from the closure into an array. */
axis_to = 0;
swizzleClosure = GET_INT_FROM_POINTER(closure);
@@ -1487,7 +1540,7 @@ static PyObject *Vector_getSwizzle(VectorObject *self, void *closure)
{
axis_from = swizzleClosure & SWIZZLE_AXIS;
if(axis_from >= self->size) {
- PyErr_SetString(PyExc_AttributeError, "Error: vector does not have specified axis.");
+ PyErr_SetString(PyExc_AttributeError, "Error: vector does not have specified axis");
return NULL;
}
@@ -1495,7 +1548,7 @@ static PyObject *Vector_getSwizzle(VectorObject *self, void *closure)
swizzleClosure = swizzleClosure >> SWIZZLE_BITS_PER_AXIS;
axis_to++;
}
-
+
return newVectorObject(vec, axis_to, Py_NEW, Py_TYPE(self));
}
@@ -1518,13 +1571,13 @@ static int Vector_setSwizzle(VectorObject *self, PyObject * value, void *closure
size_t axis_to;
unsigned int swizzleClosure;
-
+
float tvec[MAX_DIMENSIONS];
float vec_assign[MAX_DIMENSIONS];
-
+
if(!BaseMath_ReadCallback(self))
return -1;
-
+
/* Check that the closure can be used with this vector: even 2D vectors have
swizzles defined for axes z and w, but they would be invalid. */
swizzleClosure = GET_INT_FROM_POINTER(closure);
@@ -1534,7 +1587,7 @@ static int Vector_setSwizzle(VectorObject *self, PyObject * value, void *closure
axis_to = swizzleClosure & SWIZZLE_AXIS;
if (axis_to >= self->size)
{
- PyErr_SetString(PyExc_AttributeError, "Error: vector does not have specified axis.\n");
+ PyErr_SetString(PyExc_AttributeError, "Error: vector does not have specified axis");
return -1;
}
swizzleClosure = swizzleClosure >> SWIZZLE_BITS_PER_AXIS;
@@ -1553,7 +1606,7 @@ static int Vector_setSwizzle(VectorObject *self, PyObject * value, void *closure
}
if(axis_from != size_from) {
- PyErr_SetString(PyExc_AttributeError, "Error: vector size does not match swizzle.\n");
+ PyErr_SetString(PyExc_AttributeError, "Error: vector size does not match swizzle");
return -1;
}
@@ -1570,7 +1623,7 @@ static int Vector_setSwizzle(VectorObject *self, PyObject * value, void *closure
memcpy(self->vec, tvec, axis_from * sizeof(float));
/* continue with BaseMathObject_WriteCallback at the end */
-
+
if(!BaseMath_WriteCallback(self))
return -1;
else
@@ -1581,352 +1634,352 @@ static int Vector_setSwizzle(VectorObject *self, PyObject * value, void *closure
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Vector_getseters[] = {
- {"x", (getter)Vector_getAxis, (setter)Vector_setAxis, "Vector X axis.\n\n:type: float", (void *)0},
- {"y", (getter)Vector_getAxis, (setter)Vector_setAxis, "Vector Y axis.\n\n:type: float", (void *)1},
- {"z", (getter)Vector_getAxis, (setter)Vector_setAxis, "Vector Z axis (3D Vectors only).\n\n:type: float", (void *)2},
- {"w", (getter)Vector_getAxis, (setter)Vector_setAxis, "Vector W axis (4D Vectors only).\n\n:type: float", (void *)3},
- {"length", (getter)Vector_getLength, (setter)Vector_setLength, "Vector Length.\n\n:type: float", NULL},
- {"magnitude", (getter)Vector_getLength, (setter)Vector_setLength, "Vector Length.\n\n:type: float", NULL},
- {"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
- {"owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
-
+ {(char *)"x", (getter)Vector_getAxis, (setter)Vector_setAxis, (char *)"Vector X axis.\n\n:type: float", (void *)0},
+ {(char *)"y", (getter)Vector_getAxis, (setter)Vector_setAxis, (char *)"Vector Y axis.\n\n:type: float", (void *)1},
+ {(char *)"z", (getter)Vector_getAxis, (setter)Vector_setAxis, (char *)"Vector Z axis (3D Vectors only).\n\n:type: float", (void *)2},
+ {(char *)"w", (getter)Vector_getAxis, (setter)Vector_setAxis, (char *)"Vector W axis (4D Vectors only).\n\n:type: float", (void *)3},
+ {(char *)"length", (getter)Vector_getLength, (setter)Vector_setLength, (char *)"Vector Length.\n\n:type: float", NULL},
+ {(char *)"magnitude", (getter)Vector_getLength, (setter)Vector_setLength, (char *)"Vector Length.\n\n:type: float", NULL},
+ {(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, (char *)BaseMathObject_Wrapped_doc, NULL},
+ {(char *)"owner", (getter)BaseMathObject_getOwner, (setter)NULL, (char *)BaseMathObject_Owner_doc, NULL},
+
/* autogenerated swizzle attrs, see python script below */
- {"xx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 36
- {"xxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 292
- {"xxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2340
- {"xxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2852
- {"xxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3364
- {"xxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3876
- {"xxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 356
- {"xxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2404
- {"xxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2916
- {"xxyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3428
- {"xxyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3940
- {"xxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 420
- {"xxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2468
- {"xxzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2980
- {"xxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3492
- {"xxzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4004
- {"xxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 484
- {"xxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2532
- {"xxwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3044
- {"xxwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3556
- {"xxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4068
- {"xy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 44
- {"xyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 300
- {"xyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2348
- {"xyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2860
- {"xyxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3372
- {"xyxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3884
- {"xyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 364
- {"xyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2412
- {"xyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2924
- {"xyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3436
- {"xyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3948
- {"xyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 428
- {"xyzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2476
- {"xyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2988
- {"xyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3500
- {"xyzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4012
- {"xyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 492
- {"xywx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2540
- {"xywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3052
- {"xywz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3564
- {"xyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4076
- {"xz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 52
- {"xzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 308
- {"xzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2356
- {"xzxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2868
- {"xzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3380
- {"xzxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3892
- {"xzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 372
- {"xzyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2420
- {"xzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2932
- {"xzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3444
- {"xzyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3956
- {"xzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 436
- {"xzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2484
- {"xzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2996
- {"xzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3508
- {"xzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4020
- {"xzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 500
- {"xzwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2548
- {"xzwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3060
- {"xzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3572
- {"xzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4084
- {"xw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 60
- {"xwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 316
- {"xwxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2364
- {"xwxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2876
- {"xwxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3388
- {"xwxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3900
- {"xwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 380
- {"xwyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2428
- {"xwyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2940
- {"xwyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3452
- {"xwyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3964
- {"xwz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 444
- {"xwzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2492
- {"xwzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3004
- {"xwzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3516
- {"xwzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4028
- {"xww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 508
- {"xwwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2556
- {"xwwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3068
- {"xwwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3580
- {"xwww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4092
- {"yx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 37
- {"yxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 293
- {"yxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2341
- {"yxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2853
- {"yxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3365
- {"yxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3877
- {"yxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 357
- {"yxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2405
- {"yxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2917
- {"yxyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3429
- {"yxyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3941
- {"yxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 421
- {"yxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2469
- {"yxzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2981
- {"yxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3493
- {"yxzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4005
- {"yxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 485
- {"yxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2533
- {"yxwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3045
- {"yxwz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3557
- {"yxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4069
- {"yy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 45
- {"yyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 301
- {"yyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2349
- {"yyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2861
- {"yyxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3373
- {"yyxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3885
- {"yyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 365
- {"yyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2413
- {"yyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2925
- {"yyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3437
- {"yyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3949
- {"yyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 429
- {"yyzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2477
- {"yyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2989
- {"yyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3501
- {"yyzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4013
- {"yyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 493
- {"yywx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2541
- {"yywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3053
- {"yywz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3565
- {"yyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4077
- {"yz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 53
- {"yzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 309
- {"yzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2357
- {"yzxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2869
- {"yzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3381
- {"yzxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3893
- {"yzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 373
- {"yzyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2421
- {"yzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2933
- {"yzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3445
- {"yzyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3957
- {"yzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 437
- {"yzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2485
- {"yzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2997
- {"yzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3509
- {"yzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4021
- {"yzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 501
- {"yzwx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2549
- {"yzwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3061
- {"yzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3573
- {"yzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4085
- {"yw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 61
- {"ywx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 317
- {"ywxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2365
- {"ywxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2877
- {"ywxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3389
- {"ywxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3901
- {"ywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 381
- {"ywyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2429
- {"ywyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2941
- {"ywyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3453
- {"ywyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3965
- {"ywz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 445
- {"ywzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2493
- {"ywzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3005
- {"ywzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3517
- {"ywzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4029
- {"yww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 509
- {"ywwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2557
- {"ywwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3069
- {"ywwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3581
- {"ywww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4093
- {"zx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 38
- {"zxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 294
- {"zxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2342
- {"zxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2854
- {"zxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3366
- {"zxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3878
- {"zxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 358
- {"zxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2406
- {"zxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2918
- {"zxyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3430
- {"zxyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3942
- {"zxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 422
- {"zxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2470
- {"zxzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2982
- {"zxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3494
- {"zxzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4006
- {"zxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 486
- {"zxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2534
- {"zxwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3046
- {"zxwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3558
- {"zxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4070
- {"zy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 46
- {"zyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 302
- {"zyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2350
- {"zyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2862
- {"zyxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3374
- {"zyxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3886
- {"zyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 366
- {"zyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2414
- {"zyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2926
- {"zyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3438
- {"zyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3950
- {"zyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 430
- {"zyzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2478
- {"zyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2990
- {"zyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3502
- {"zyzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4014
- {"zyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 494
- {"zywx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2542
- {"zywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3054
- {"zywz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3566
- {"zyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4078
- {"zz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 54
- {"zzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 310
- {"zzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2358
- {"zzxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2870
- {"zzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3382
- {"zzxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3894
- {"zzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 374
- {"zzyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2422
- {"zzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2934
- {"zzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3446
- {"zzyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3958
- {"zzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 438
- {"zzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2486
- {"zzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2998
- {"zzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3510
- {"zzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4022
- {"zzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 502
- {"zzwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2550
- {"zzwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3062
- {"zzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3574
- {"zzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4086
- {"zw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 62
- {"zwx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 318
- {"zwxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2366
- {"zwxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2878
- {"zwxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3390
- {"zwxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3902
- {"zwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 382
- {"zwyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2430
- {"zwyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2942
- {"zwyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3454
- {"zwyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3966
- {"zwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 446
- {"zwzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2494
- {"zwzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3006
- {"zwzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3518
- {"zwzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4030
- {"zww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 510
- {"zwwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2558
- {"zwwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3070
- {"zwwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3582
- {"zwww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4094
- {"wx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 39
- {"wxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 295
- {"wxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2343
- {"wxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2855
- {"wxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3367
- {"wxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3879
- {"wxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 359
- {"wxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2407
- {"wxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2919
- {"wxyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3431
- {"wxyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3943
- {"wxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 423
- {"wxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2471
- {"wxzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2983
- {"wxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3495
- {"wxzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4007
- {"wxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 487
- {"wxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2535
- {"wxwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3047
- {"wxwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3559
- {"wxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4071
- {"wy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 47
- {"wyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 303
- {"wyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2351
- {"wyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2863
- {"wyxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3375
- {"wyxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3887
- {"wyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 367
- {"wyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2415
- {"wyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2927
- {"wyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3439
- {"wyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3951
- {"wyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 431
- {"wyzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2479
- {"wyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2991
- {"wyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3503
- {"wyzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4015
- {"wyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 495
- {"wywx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2543
- {"wywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3055
- {"wywz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3567
- {"wyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4079
- {"wz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 55
- {"wzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 311
- {"wzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2359
- {"wzxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2871
- {"wzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3383
- {"wzxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3895
- {"wzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 375
- {"wzyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2423
- {"wzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2935
- {"wzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3447
- {"wzyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3959
- {"wzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 439
- {"wzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2487
- {"wzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2999
- {"wzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3511
- {"wzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4023
- {"wzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 503
- {"wzwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2551
- {"wzwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3063
- {"wzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3575
- {"wzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4087
- {"ww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 63
- {"wwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 319
- {"wwxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2367
- {"wwxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2879
- {"wwxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3391
- {"wwxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3903
- {"wwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 383
- {"wwyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2431
- {"wwyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2943
- {"wwyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3455
- {"wwyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3967
- {"wwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 447
- {"wwzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2495
- {"wwzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3007
- {"wwzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3519
- {"wwzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4031
- {"www", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 511
- {"wwwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2559
- {"wwwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3071
- {"wwwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3583
- {"wwww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4095
+ {(char *)"xx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 36
+ {(char *)"xxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 292
+ {(char *)"xxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2340
+ {(char *)"xxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2852
+ {(char *)"xxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3364
+ {(char *)"xxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3876
+ {(char *)"xxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 356
+ {(char *)"xxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2404
+ {(char *)"xxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2916
+ {(char *)"xxyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3428
+ {(char *)"xxyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3940
+ {(char *)"xxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 420
+ {(char *)"xxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2468
+ {(char *)"xxzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2980
+ {(char *)"xxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3492
+ {(char *)"xxzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4004
+ {(char *)"xxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 484
+ {(char *)"xxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2532
+ {(char *)"xxwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3044
+ {(char *)"xxwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3556
+ {(char *)"xxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4068
+ {(char *)"xy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 44
+ {(char *)"xyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 300
+ {(char *)"xyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2348
+ {(char *)"xyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2860
+ {(char *)"xyxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3372
+ {(char *)"xyxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3884
+ {(char *)"xyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 364
+ {(char *)"xyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2412
+ {(char *)"xyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2924
+ {(char *)"xyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3436
+ {(char *)"xyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3948
+ {(char *)"xyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 428
+ {(char *)"xyzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2476
+ {(char *)"xyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2988
+ {(char *)"xyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3500
+ {(char *)"xyzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4012
+ {(char *)"xyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 492
+ {(char *)"xywx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2540
+ {(char *)"xywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3052
+ {(char *)"xywz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3564
+ {(char *)"xyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4076
+ {(char *)"xz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 52
+ {(char *)"xzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 308
+ {(char *)"xzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2356
+ {(char *)"xzxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2868
+ {(char *)"xzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3380
+ {(char *)"xzxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3892
+ {(char *)"xzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 372
+ {(char *)"xzyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2420
+ {(char *)"xzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2932
+ {(char *)"xzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3444
+ {(char *)"xzyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3956
+ {(char *)"xzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 436
+ {(char *)"xzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2484
+ {(char *)"xzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2996
+ {(char *)"xzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3508
+ {(char *)"xzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4020
+ {(char *)"xzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 500
+ {(char *)"xzwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2548
+ {(char *)"xzwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3060
+ {(char *)"xzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3572
+ {(char *)"xzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4084
+ {(char *)"xw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 60
+ {(char *)"xwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 316
+ {(char *)"xwxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2364
+ {(char *)"xwxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2876
+ {(char *)"xwxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3388
+ {(char *)"xwxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3900
+ {(char *)"xwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 380
+ {(char *)"xwyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2428
+ {(char *)"xwyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2940
+ {(char *)"xwyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3452
+ {(char *)"xwyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3964
+ {(char *)"xwz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 444
+ {(char *)"xwzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2492
+ {(char *)"xwzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3004
+ {(char *)"xwzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3516
+ {(char *)"xwzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4028
+ {(char *)"xww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 508
+ {(char *)"xwwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2556
+ {(char *)"xwwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3068
+ {(char *)"xwwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3580
+ {(char *)"xwww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4092
+ {(char *)"yx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 37
+ {(char *)"yxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 293
+ {(char *)"yxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2341
+ {(char *)"yxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2853
+ {(char *)"yxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3365
+ {(char *)"yxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3877
+ {(char *)"yxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 357
+ {(char *)"yxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2405
+ {(char *)"yxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2917
+ {(char *)"yxyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3429
+ {(char *)"yxyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3941
+ {(char *)"yxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 421
+ {(char *)"yxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2469
+ {(char *)"yxzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2981
+ {(char *)"yxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3493
+ {(char *)"yxzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4005
+ {(char *)"yxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 485
+ {(char *)"yxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2533
+ {(char *)"yxwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3045
+ {(char *)"yxwz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3557
+ {(char *)"yxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4069
+ {(char *)"yy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 45
+ {(char *)"yyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 301
+ {(char *)"yyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2349
+ {(char *)"yyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2861
+ {(char *)"yyxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3373
+ {(char *)"yyxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3885
+ {(char *)"yyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 365
+ {(char *)"yyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2413
+ {(char *)"yyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2925
+ {(char *)"yyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3437
+ {(char *)"yyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3949
+ {(char *)"yyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 429
+ {(char *)"yyzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2477
+ {(char *)"yyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2989
+ {(char *)"yyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3501
+ {(char *)"yyzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4013
+ {(char *)"yyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 493
+ {(char *)"yywx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2541
+ {(char *)"yywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3053
+ {(char *)"yywz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3565
+ {(char *)"yyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4077
+ {(char *)"yz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 53
+ {(char *)"yzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 309
+ {(char *)"yzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2357
+ {(char *)"yzxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2869
+ {(char *)"yzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3381
+ {(char *)"yzxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3893
+ {(char *)"yzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 373
+ {(char *)"yzyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2421
+ {(char *)"yzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2933
+ {(char *)"yzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3445
+ {(char *)"yzyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3957
+ {(char *)"yzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 437
+ {(char *)"yzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2485
+ {(char *)"yzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2997
+ {(char *)"yzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3509
+ {(char *)"yzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4021
+ {(char *)"yzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 501
+ {(char *)"yzwx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2549
+ {(char *)"yzwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3061
+ {(char *)"yzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3573
+ {(char *)"yzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4085
+ {(char *)"yw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 61
+ {(char *)"ywx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 317
+ {(char *)"ywxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2365
+ {(char *)"ywxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2877
+ {(char *)"ywxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3389
+ {(char *)"ywxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3901
+ {(char *)"ywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 381
+ {(char *)"ywyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2429
+ {(char *)"ywyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2941
+ {(char *)"ywyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3453
+ {(char *)"ywyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3965
+ {(char *)"ywz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 445
+ {(char *)"ywzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2493
+ {(char *)"ywzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3005
+ {(char *)"ywzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3517
+ {(char *)"ywzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4029
+ {(char *)"yww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 509
+ {(char *)"ywwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2557
+ {(char *)"ywwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3069
+ {(char *)"ywwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3581
+ {(char *)"ywww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4093
+ {(char *)"zx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 38
+ {(char *)"zxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 294
+ {(char *)"zxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2342
+ {(char *)"zxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2854
+ {(char *)"zxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3366
+ {(char *)"zxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3878
+ {(char *)"zxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 358
+ {(char *)"zxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2406
+ {(char *)"zxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2918
+ {(char *)"zxyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3430
+ {(char *)"zxyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3942
+ {(char *)"zxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 422
+ {(char *)"zxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2470
+ {(char *)"zxzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2982
+ {(char *)"zxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3494
+ {(char *)"zxzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4006
+ {(char *)"zxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 486
+ {(char *)"zxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2534
+ {(char *)"zxwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3046
+ {(char *)"zxwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3558
+ {(char *)"zxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4070
+ {(char *)"zy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 46
+ {(char *)"zyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 302
+ {(char *)"zyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2350
+ {(char *)"zyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2862
+ {(char *)"zyxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3374
+ {(char *)"zyxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3886
+ {(char *)"zyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 366
+ {(char *)"zyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2414
+ {(char *)"zyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2926
+ {(char *)"zyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3438
+ {(char *)"zyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3950
+ {(char *)"zyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 430
+ {(char *)"zyzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2478
+ {(char *)"zyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2990
+ {(char *)"zyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3502
+ {(char *)"zyzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4014
+ {(char *)"zyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 494
+ {(char *)"zywx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2542
+ {(char *)"zywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3054
+ {(char *)"zywz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3566
+ {(char *)"zyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4078
+ {(char *)"zz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 54
+ {(char *)"zzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 310
+ {(char *)"zzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2358
+ {(char *)"zzxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2870
+ {(char *)"zzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3382
+ {(char *)"zzxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3894
+ {(char *)"zzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 374
+ {(char *)"zzyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2422
+ {(char *)"zzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2934
+ {(char *)"zzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3446
+ {(char *)"zzyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3958
+ {(char *)"zzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 438
+ {(char *)"zzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2486
+ {(char *)"zzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2998
+ {(char *)"zzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3510
+ {(char *)"zzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4022
+ {(char *)"zzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 502
+ {(char *)"zzwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2550
+ {(char *)"zzwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3062
+ {(char *)"zzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3574
+ {(char *)"zzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4086
+ {(char *)"zw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 62
+ {(char *)"zwx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 318
+ {(char *)"zwxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2366
+ {(char *)"zwxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2878
+ {(char *)"zwxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3390
+ {(char *)"zwxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3902
+ {(char *)"zwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 382
+ {(char *)"zwyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2430
+ {(char *)"zwyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2942
+ {(char *)"zwyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3454
+ {(char *)"zwyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3966
+ {(char *)"zwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 446
+ {(char *)"zwzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2494
+ {(char *)"zwzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3006
+ {(char *)"zwzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3518
+ {(char *)"zwzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4030
+ {(char *)"zww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 510
+ {(char *)"zwwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2558
+ {(char *)"zwwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3070
+ {(char *)"zwwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3582
+ {(char *)"zwww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4094
+ {(char *)"wx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 39
+ {(char *)"wxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 295
+ {(char *)"wxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2343
+ {(char *)"wxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2855
+ {(char *)"wxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3367
+ {(char *)"wxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3879
+ {(char *)"wxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 359
+ {(char *)"wxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2407
+ {(char *)"wxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2919
+ {(char *)"wxyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3431
+ {(char *)"wxyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3943
+ {(char *)"wxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 423
+ {(char *)"wxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2471
+ {(char *)"wxzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2983
+ {(char *)"wxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3495
+ {(char *)"wxzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4007
+ {(char *)"wxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 487
+ {(char *)"wxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2535
+ {(char *)"wxwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3047
+ {(char *)"wxwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3559
+ {(char *)"wxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4071
+ {(char *)"wy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 47
+ {(char *)"wyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 303
+ {(char *)"wyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2351
+ {(char *)"wyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2863
+ {(char *)"wyxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3375
+ {(char *)"wyxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3887
+ {(char *)"wyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 367
+ {(char *)"wyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2415
+ {(char *)"wyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2927
+ {(char *)"wyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3439
+ {(char *)"wyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3951
+ {(char *)"wyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 431
+ {(char *)"wyzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2479
+ {(char *)"wyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2991
+ {(char *)"wyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3503
+ {(char *)"wyzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4015
+ {(char *)"wyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 495
+ {(char *)"wywx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2543
+ {(char *)"wywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3055
+ {(char *)"wywz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3567
+ {(char *)"wyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4079
+ {(char *)"wz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 55
+ {(char *)"wzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 311
+ {(char *)"wzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2359
+ {(char *)"wzxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2871
+ {(char *)"wzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3383
+ {(char *)"wzxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3895
+ {(char *)"wzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 375
+ {(char *)"wzyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2423
+ {(char *)"wzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2935
+ {(char *)"wzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3447
+ {(char *)"wzyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3959
+ {(char *)"wzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 439
+ {(char *)"wzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2487
+ {(char *)"wzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2999
+ {(char *)"wzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3511
+ {(char *)"wzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4023
+ {(char *)"wzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 503
+ {(char *)"wzwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2551
+ {(char *)"wzwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3063
+ {(char *)"wzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3575
+ {(char *)"wzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4087
+ {(char *)"ww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 63
+ {(char *)"wwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 319
+ {(char *)"wwxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2367
+ {(char *)"wwxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2879
+ {(char *)"wwxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3391
+ {(char *)"wwxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3903
+ {(char *)"wwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 383
+ {(char *)"wwyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2431
+ {(char *)"wwyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2943
+ {(char *)"wwyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3455
+ {(char *)"wwyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3967
+ {(char *)"wwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 447
+ {(char *)"wwzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2495
+ {(char *)"wwzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3007
+ {(char *)"wwzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3519
+ {(char *)"wwzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4031
+ {(char *)"www", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 511
+ {(char *)"wwwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2559
+ {(char *)"wwwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3071
+ {(char *)"wwwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3583
+ {(char *)"wwww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4095
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
@@ -1971,7 +2024,7 @@ if len(unique) != len(items):
print "ERROR"
*/
-//-----------------row_vector_multiplication (internal)-----------
+#if 0
//ROW VECTOR Multiplication - Vector X Matrix
//[x][y][z] * [1][4][7]
// [2][5][8]
@@ -1979,7 +2032,7 @@ if len(unique) != len(items):
//vector/matrix multiplication IS NOT COMMUTATIVE!!!!
static int row_vector_multiplication(float rvec[4], VectorObject* vec, MatrixObject * mat)
{
- float vecCopy[4];
+ float vec_cpy[4];
double dot = 0.0f;
int x, y, z = 0, vec_size = vec->size;
@@ -1988,68 +2041,76 @@ static int row_vector_multiplication(float rvec[4], VectorObject* vec, MatrixObj
PyErr_SetString(PyExc_AttributeError, "vector * matrix: matrix column size and the vector size must be the same");
return -1;
}else{
- vecCopy[3] = 1.0f;
+ vec_cpy[3] = 1.0f;
}
}
if(!BaseMath_ReadCallback(vec) || !BaseMath_ReadCallback(mat))
return -1;
-
- for(x = 0; x < vec_size; x++){
- vecCopy[x] = vec->vec[x];
- }
+
+ memcpy(vec_cpy, vec->vec, vec_size * sizeof(float));
+
rvec[3] = 1.0f;
//muliplication
for(x = 0; x < mat->rowSize; x++) {
for(y = 0; y < mat->colSize; y++) {
- dot += mat->matrix[x][y] * vecCopy[y];
+ dot += mat->matrix[x][y] * vec_cpy[y];
}
rvec[z++] = (float)dot;
dot = 0.0f;
}
return 0;
}
+#endif
/*----------------------------Vector.negate() -------------------- */
-static char Vector_Negate_doc[] =
+static char Vector_negate_doc[] =
".. method:: negate()\n"
"\n"
" Set all values to their negative.\n"
"\n"
" :return: an instance of itself\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Negate(VectorObject *self)
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_negate(VectorObject *self)
{
- int i;
if(!BaseMath_ReadCallback(self))
return NULL;
- for(i = 0; i < self->size; i++)
- self->vec[i] = -(self->vec[i]);
-
- BaseMath_WriteCallback(self); // already checked for error
-
- Py_INCREF(self);
- return (PyObject*)self;
+ negate_vn(self->vec, self->size);
+
+ (void)BaseMath_WriteCallback(self); // already checked for error
+ Py_RETURN_NONE;
}
static struct PyMethodDef Vector_methods[] = {
- {"zero", (PyCFunction) Vector_Zero, METH_NOARGS, Vector_Zero_doc},
- {"normalize", (PyCFunction) Vector_Normalize, METH_NOARGS, Vector_Normalize_doc},
- {"negate", (PyCFunction) Vector_Negate, METH_NOARGS, Vector_Negate_doc},
- {"resize2D", (PyCFunction) Vector_Resize2D, METH_NOARGS, Vector_Resize2D_doc},
- {"resize3D", (PyCFunction) Vector_Resize3D, METH_NOARGS, Vector_Resize3D_doc},
- {"resize4D", (PyCFunction) Vector_Resize4D, METH_NOARGS, Vector_Resize4D_doc},
- {"to_tuple", (PyCFunction) Vector_ToTuple, METH_VARARGS, Vector_ToTuple_doc},
- {"to_track_quat", ( PyCFunction ) Vector_ToTrackQuat, METH_VARARGS, Vector_ToTrackQuat_doc},
- {"reflect", ( PyCFunction ) Vector_Reflect, METH_O, Vector_Reflect_doc},
- {"cross", ( PyCFunction ) Vector_Cross, METH_O, Vector_Cross_doc},
- {"dot", ( PyCFunction ) Vector_Dot, METH_O, Vector_Dot_doc},
- {"angle", ( PyCFunction ) Vector_angle, METH_VARARGS, Vector_angle_doc},
- {"difference", ( PyCFunction ) Vector_Difference, METH_O, Vector_Difference_doc},
- {"project", ( PyCFunction ) Vector_Project, METH_O, Vector_Project_doc},
- {"lerp", ( PyCFunction ) Vector_Lerp, METH_VARARGS, Vector_Lerp_doc},
+ /* in place only */
+ {"zero", (PyCFunction) Vector_zero, METH_NOARGS, Vector_zero_doc},
+ {"negate", (PyCFunction) Vector_negate, METH_NOARGS, Vector_negate_doc},
+
+ /* operate on original or copy */
+ {"normalize", (PyCFunction) Vector_normalize, METH_NOARGS, Vector_normalize_doc},
+ {"normalized", (PyCFunction) Vector_normalized, METH_NOARGS, Vector_normalized_doc},
+
+ {"to_2d", (PyCFunction) Vector_to_2d, METH_NOARGS, Vector_to_2d_doc},
+ {"resize_2d", (PyCFunction) Vector_resize_2d, METH_NOARGS, Vector_resize_2d_doc},
+ {"to_3d", (PyCFunction) Vector_to_3d, METH_NOARGS, Vector_to_3d_doc},
+ {"resize_3d", (PyCFunction) Vector_resize_3d, METH_NOARGS, Vector_resize_3d_doc},
+ {"to_4d", (PyCFunction) Vector_to_4d, METH_NOARGS, Vector_to_4d_doc},
+ {"resize_4d", (PyCFunction) Vector_resize_4d, METH_NOARGS, Vector_resize_4d_doc},
+ {"to_tuple", (PyCFunction) Vector_to_tuple, METH_VARARGS, Vector_to_tuple_doc},
+ {"to_track_quat", (PyCFunction) Vector_to_track_quat, METH_VARARGS, Vector_to_track_quat_doc},
+
+ /* operation between 2 or more types */
+ {"reflect", (PyCFunction) Vector_reflect, METH_O, Vector_reflect_doc},
+ {"cross", (PyCFunction) Vector_cross, METH_O, Vector_cross_doc},
+ {"dot", (PyCFunction) Vector_dot, METH_O, Vector_dot_doc},
+ {"angle", (PyCFunction) Vector_angle, METH_VARARGS, Vector_angle_doc},
+ {"difference", (PyCFunction) Vector_difference, METH_O, Vector_difference_doc},
+ {"project", (PyCFunction) Vector_project, METH_O, Vector_project_doc},
+ {"lerp", (PyCFunction) Vector_lerp, METH_VARARGS, Vector_lerp_doc},
+ {"rotate", (PyCFunction) Vector_rotate, METH_O, Vector_rotate_doc},
+
{"copy", (PyCFunction) Vector_copy, METH_NOARGS, Vector_copy_doc},
{"__copy__", (PyCFunction) Vector_copy, METH_NOARGS, NULL},
{NULL, NULL, 0, NULL}
@@ -2063,12 +2124,12 @@ static struct PyMethodDef Vector_methods[] = {
*/
static char vector_doc[] =
-"This object gives access to Vectors in Blender.";
-
+"This object gives access to Vectors in Blender."
+;
PyTypeObject vector_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
/* For printing, in format "<module>.<name>" */
- "vector", /* char *tp_name; */
+ "mathutils.Vector", /* char *tp_name; */
sizeof(VectorObject), /* int tp_basicsize; */
0, /* tp_itemsize; For allocation */
@@ -2151,9 +2212,8 @@ PyTypeObject vector_Type = {
(i.e. it was allocated elsewhere by MEM_mallocN())
pass Py_NEW - if vector is not a WRAPPER and managed by PYTHON
(i.e. it must be created here with PyMEM_malloc())*/
-PyObject *newVectorObject(float *vec, int size, int type, PyTypeObject *base_type)
+PyObject *newVectorObject(float *vec, const int size, const int type, PyTypeObject *base_type)
{
- int i;
VectorObject *self;
if(size > 4 || size < 2)
@@ -2172,16 +2232,14 @@ PyObject *newVectorObject(float *vec, int size, int type, PyTypeObject *base_typ
self->vec = vec;
self->wrapped = Py_WRAP;
} else if (type == Py_NEW) {
- self->vec = PyMem_Malloc(size * sizeof(float));
- if(!vec) { /*new empty*/
- for(i = 0; i < size; i++){
- self->vec[i] = 0.0f;
- }
- if(size == 4) /* do the homogenous thing */
+ self->vec= PyMem_Malloc(size * sizeof(float));
+ if(vec) {
+ memcpy(self->vec, vec, size * sizeof(float));
+ }
+ else { /* new empty */
+ fill_vn(self->vec, size, 0.0f);
+ if(size == 4) { /* do the homogenous thing */
self->vec[3] = 1.0f;
- }else{
- for(i = 0; i < size; i++){
- self->vec[i] = vec[i];
}
}
self->wrapped = Py_NEW;
@@ -2201,6 +2259,6 @@ PyObject *newVectorObject_cb(PyObject *cb_user, int size, int cb_type, int cb_su
self->cb_type= (unsigned char)cb_type;
self->cb_subtype= (unsigned char)cb_subtype;
}
-
+
return (PyObject *)self;
}
diff --git a/source/blender/python/generic/mathutils_vector.h b/source/blender/python/generic/mathutils_vector.h
index 42b9849dd3f..2dbe9d9d3fe 100644
--- a/source/blender/python/generic/mathutils_vector.h
+++ b/source/blender/python/generic/mathutils_vector.h
@@ -28,8 +28,8 @@
*
*/
-#ifndef EXPP_vector_h
-#define EXPP_vector_h
+#ifndef MATHUTILS_VECTOR_H
+#define MATHUTILS_VECTOR_H
#include <Python.h>
@@ -43,7 +43,7 @@ typedef struct {
} VectorObject;
/*prototypes*/
-PyObject *newVectorObject(float *vec, int size, int type, PyTypeObject *base_type);
+PyObject *newVectorObject(float *vec, const int size, const int type, PyTypeObject *base_type);
PyObject *newVectorObject_cb(PyObject *user, int size, int callback_type, int subtype);
-#endif /* EXPP_vector_h */
+#endif /* MATHUTILS_VECTOR_H */
diff --git a/source/blender/python/generic/noise.c b/source/blender/python/generic/noise.c
index 4a09cbb58d8..f266a666274 100644
--- a/source/blender/python/generic/noise.c
+++ b/source/blender/python/generic/noise.c
@@ -38,7 +38,11 @@
#include "structseq.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "DNA_texture_types.h"
+
+
/*-----------------------------------------*/
/* 'mersenne twister' random number generator */
@@ -120,8 +124,6 @@ static int left = 1;
static int initf = 0;
static unsigned long *next;
-PyObject *Noise_Init(void);
-
/* initializes state[N] with a seed */
static void init_genrand(unsigned long s)
{
@@ -174,7 +176,7 @@ static void setRndSeed(int seed)
}
/* float number in range [0, 1) using the mersenne twister rng */
-static float frand()
+static float frand(void)
{
unsigned long y;
@@ -207,12 +209,12 @@ static void randuvec(float v[3])
v[2] = 1.f;
}
-static PyObject *Noise_random(PyObject * self)
+static PyObject *Noise_random(PyObject *UNUSED(self))
{
return PyFloat_FromDouble(frand());
}
-static PyObject *Noise_random_unit_vector(PyObject * self)
+static PyObject *Noise_random_unit_vector(PyObject *UNUSED(self))
{
float v[3] = {0.0f, 0.0f, 0.0f};
randuvec(v);
@@ -223,7 +225,7 @@ static PyObject *Noise_random_unit_vector(PyObject * self)
/* Random seed init. Only used for MT random() & randuvec() */
-static PyObject *Noise_seed_set(PyObject * self, PyObject * args)
+static PyObject *Noise_seed_set(PyObject *UNUSED(self), PyObject *args)
{
int s;
if(!PyArg_ParseTuple(args, "i:seed_set", &s))
@@ -236,7 +238,7 @@ static PyObject *Noise_seed_set(PyObject * self, PyObject * args)
/* General noise */
-static PyObject *Noise_noise(PyObject * self, PyObject * args)
+static PyObject *Noise_noise(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z;
int nb = 1;
@@ -260,7 +262,7 @@ static void noise_vector(float x, float y, float z, int nb, float v[3])
nb) - 1.0);
}
-static PyObject *Noise_vector(PyObject * self, PyObject * args)
+static PyObject *Noise_vector(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, v[3];
int nb = 1;
@@ -296,7 +298,7 @@ static float turb(float x, float y, float z, int oct, int hard, int nb,
return out;
}
-static PyObject *Noise_turbulence(PyObject * self, PyObject * args)
+static PyObject *Noise_turbulence(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z;
int oct, hd, nb = 1;
@@ -340,7 +342,7 @@ static void vTurb(float x, float y, float z, int oct, int hard, int nb,
}
}
-static PyObject *Noise_turbulence_vector(PyObject * self, PyObject * args)
+static PyObject *Noise_turbulence_vector(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, v[3];
int oct, hd, nb = 1;
@@ -355,7 +357,7 @@ static PyObject *Noise_turbulence_vector(PyObject * self, PyObject * args)
/* F. Kenton Musgrave's fractal functions */
-static PyObject *Noise_fractal(PyObject * self, PyObject * args)
+static PyObject *Noise_fractal(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, H, lac, oct;
int nb = 1;
@@ -366,7 +368,7 @@ static PyObject *Noise_fractal(PyObject * self, PyObject * args)
/*------------------------------------------------------------------------*/
-static PyObject *Noise_multi_fractal(PyObject * self, PyObject * args)
+static PyObject *Noise_multi_fractal(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, H, lac, oct;
int nb = 1;
@@ -378,7 +380,7 @@ static PyObject *Noise_multi_fractal(PyObject * self, PyObject * args)
/*------------------------------------------------------------------------*/
-static PyObject *Noise_vl_vector(PyObject * self, PyObject * args)
+static PyObject *Noise_vl_vector(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, d;
int nt1 = 1, nt2 = 1;
@@ -389,7 +391,7 @@ static PyObject *Noise_vl_vector(PyObject * self, PyObject * args)
/*-------------------------------------------------------------------------*/
-static PyObject *Noise_hetero_terrain(PyObject * self, PyObject * args)
+static PyObject *Noise_hetero_terrain(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, H, lac, oct, ofs;
int nb = 1;
@@ -401,7 +403,7 @@ static PyObject *Noise_hetero_terrain(PyObject * self, PyObject * args)
/*-------------------------------------------------------------------------*/
-static PyObject *Noise_hybrid_multi_fractal(PyObject * self, PyObject * args)
+static PyObject *Noise_hybrid_multi_fractal(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, H, lac, oct, ofs, gn;
int nb = 1;
@@ -413,7 +415,7 @@ static PyObject *Noise_hybrid_multi_fractal(PyObject * self, PyObject * args)
/*------------------------------------------------------------------------*/
-static PyObject *Noise_ridged_multi_fractal(PyObject * self, PyObject * args)
+static PyObject *Noise_ridged_multi_fractal(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, H, lac, oct, ofs, gn;
int nb = 1;
@@ -424,7 +426,7 @@ static PyObject *Noise_ridged_multi_fractal(PyObject * self, PyObject * args)
/*-------------------------------------------------------------------------*/
-static PyObject *Noise_voronoi(PyObject * self, PyObject * args)
+static PyObject *Noise_voronoi(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, da[4], pa[12];
int dtype = 0;
@@ -441,7 +443,7 @@ static PyObject *Noise_voronoi(PyObject * self, PyObject * args)
/*-------------------------------------------------------------------------*/
-static PyObject *Noise_cell(PyObject * self, PyObject * args)
+static PyObject *Noise_cell(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z;
if(!PyArg_ParseTuple(args, "(fff):cell", &x, &y, &z))
@@ -452,7 +454,7 @@ static PyObject *Noise_cell(PyObject * self, PyObject * args)
/*--------------------------------------------------------------------------*/
-static PyObject *Noise_cell_vector(PyObject * self, PyObject * args)
+static PyObject *Noise_cell_vector(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, ca[3];
if(!PyArg_ParseTuple(args, "(fff):cell_vector", &x, &y, &z))
@@ -603,22 +605,22 @@ look like anything from an earthquake to a very nervous or maybe even drunk came
/* Just in case, declarations for a header file */
/*
-static PyObject *Noise_random(PyObject *self);
-static PyObject *Noise_random_unit_vector(PyObject *self);
-static PyObject *Noise_seed_set(PyObject *self, PyObject *args);
-static PyObject *Noise_noise(PyObject *self, PyObject *args);
-static PyObject *Noise_vector(PyObject *self, PyObject *args);
-static PyObject *Noise_turbulence(PyObject *self, PyObject *args);
-static PyObject *Noise_turbulence_vector(PyObject *self, PyObject *args);
-static PyObject *Noise_fractal(PyObject *self, PyObject *args);
-static PyObject *Noise_multi_fractal(PyObject *self, PyObject *args);
-static PyObject *Noise_vl_vector(PyObject *self, PyObject *args);
-static PyObject *Noise_hetero_terrain(PyObject *self, PyObject *args);
-static PyObject *Noise_hybrid_multi_fractal(PyObject *self, PyObject *args);
-static PyObject *Noise_ridged_multi_fractal(PyObject *self, PyObject *args);
-static PyObject *Noise_voronoi(PyObject *self, PyObject *args);
-static PyObject *Noise_cell(PyObject *self, PyObject *args);
-static PyObject *Noise_cell_vector(PyObject *self, PyObject *args);
+static PyObject *Noise_random(PyObject *UNUSED(self));
+static PyObject *Noise_random_unit_vector(PyObject *UNUSED(self));
+static PyObject *Noise_seed_set(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_noise(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_vector(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_turbulence(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_turbulence_vector(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_fractal(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_multi_fractal(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_vl_vector(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_hetero_terrain(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_hybrid_multi_fractal(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_ridged_multi_fractal(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_voronoi(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_cell(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_cell_vector(PyObject *UNUSED(self), PyObject *args);
*/
static PyMethodDef NoiseMethods[] = {
@@ -655,10 +657,9 @@ static struct PyModuleDef noise_module_def = {
0, /* m_free */
};
-PyObject *Noise_Init(void)
+PyObject *BPyInit_noise(void)
{
PyObject *submodule = PyModule_Create(&noise_module_def);
- PyDict_SetItemString(PyImport_GetModuleDict(), noise_module_def.m_name, submodule);
/* use current time as seed for random number generator by default */
setRndSeed(0);
@@ -666,22 +667,22 @@ PyObject *Noise_Init(void)
/* Constant noisetype dictionary */
if(submodule) {
static PyStructSequence_Field noise_types_fields[] = {
- {"BLENDER", ""},
- {"STDPERLIN", ""},
- {"NEWPERLIN", ""},
- {"VORONOI_F1", ""},
- {"VORONOI_F2", ""},
- {"VORONOI_F3", ""},
- {"VORONOI_F4", ""},
- {"VORONOI_F2F1", ""},
- {"VORONOI_CRACKLE", ""},
- {"CELLNOISE", ""},
+ {(char *)"BLENDER", NULL},
+ {(char *)"STDPERLIN", NULL},
+ {(char *)"NEWPERLIN", NULL},
+ {(char *)"VORONOI_F1", NULL},
+ {(char *)"VORONOI_F2", NULL},
+ {(char *)"VORONOI_F3", NULL},
+ {(char *)"VORONOI_F4", NULL},
+ {(char *)"VORONOI_F2F1", NULL},
+ {(char *)"VORONOI_CRACKLE", NULL},
+ {(char *)"CELLNOISE", NULL},
{0}
};
static PyStructSequence_Desc noise_types_info_desc = {
- "noise.types", /* name */
- "Noise type", /* doc */
+ (char *)"noise.types", /* name */
+ (char *)"Noise type", /* doc */
noise_types_fields, /* fields */
(sizeof(noise_types_fields)/sizeof(PyStructSequence_Field)) - 1
};
@@ -715,19 +716,19 @@ PyObject *Noise_Init(void)
if(submodule) {
static PyStructSequence_Field distance_metrics_fields[] = {
- {"DISTANCE", ""},
- {"DISTANCE_SQUARED", ""},
- {"MANHATTAN", ""},
- {"CHEBYCHEV", ""},
- {"MINKOVSKY_HALF", ""},
- {"MINKOVSKY_FOUR", ""},
- {"MINKOVSKY", ""},
+ {(char *)"DISTANCE", NULL},
+ {(char *)"DISTANCE_SQUARED", NULL},
+ {(char *)"MANHATTAN", NULL},
+ {(char *)"CHEBYCHEV", NULL},
+ {(char *)"MINKOVSKY_HALF", NULL},
+ {(char *)"MINKOVSKY_FOUR", NULL},
+ {(char *)"MINKOVSKY", NULL},
{0}
};
static PyStructSequence_Desc noise_types_info_desc = {
- "noise.distance_metrics", /* name */
- "Distance Metrics for noise module.", /* doc */
+ (char *)"noise.distance_metrics", /* name */
+ (char *)"Distance Metrics for noise module.", /* doc */
distance_metrics_fields, /* fields */
(sizeof(distance_metrics_fields)/sizeof(PyStructSequence_Field)) - 1
};
diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c
index d59624b54ab..9f7a9f2cabe 100644
--- a/source/blender/python/generic/py_capi_utils.c
+++ b/source/blender/python/generic/py_capi_utils.c
@@ -24,7 +24,7 @@
#include "py_capi_utils.h"
/* for debugging */
-void PyC_ObSpit(char *name, PyObject *var) {
+void PyC_ObSpit(const char *name, PyObject *var) {
fprintf(stderr, "<%s> : ", name);
if (var==NULL) {
fprintf(stderr, "<NIL>");
@@ -75,7 +75,7 @@ void PyC_FileAndNum(const char **filename, int *lineno)
/* when executing a script */
if (filename) {
- co_filename= PyC_Object_GetAttrStringArgs(frame, 1, "f_code", "co_filename");
+ co_filename= PyC_Object_GetAttrStringArgs(frame, 2, "f_code", "co_filename");
if (co_filename==NULL) {
PyErr_SetString(PyExc_SystemError, "Could not access sys._getframe().f_code.co_filename");
Py_DECREF(frame);
@@ -171,7 +171,7 @@ PyObject *PyC_ExceptionBuffer(void)
if(! (string_io_mod= PyImport_ImportModule("io")) ) {
goto error_cleanup;
- } else if (! (string_io = PyObject_CallMethod(string_io_mod, "StringIO", NULL))) {
+ } else if (! (string_io = PyObject_CallMethod(string_io_mod, (char *)"StringIO", NULL))) {
goto error_cleanup;
} else if (! (string_io_getvalue= PyObject_GetAttrString(string_io, "getvalue"))) {
goto error_cleanup;
@@ -217,7 +217,7 @@ error_cleanup:
/* string conversion, escape non-unicode chars, coerce must be set to NULL */
-const char *PuC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
+const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
{
char *result;
@@ -228,6 +228,10 @@ const char *PuC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
* chars since blender doesnt limit this */
return result;
}
+ else if(PyBytes_Check(py_str)) {
+ PyErr_Clear();
+ return PyBytes_AS_STRING(py_str);
+ }
else {
/* mostly copied from fileio.c's, fileio_init */
PyObject *stringobj;
@@ -265,7 +269,8 @@ PyObject *PyC_UnicodeFromByte(const char *str)
}
else {
PyErr_Clear();
- result= PyUnicode_DecodeUTF8(str, strlen(str), "surrogateescape");
+ /* this means paths will always be accessible once converted, on all OS's */
+ result= PyUnicode_DecodeFSDefault(str);
return result;
}
}
@@ -277,6 +282,10 @@ PyObject *PyC_UnicodeFromByte(const char *str)
for 'pickle' to work as well as strings like this...
>> foo = 10
>> print(__import__("__main__").foo)
+*
+* note: this overwrites __main__ which gives problems with nested calles.
+* be sure to run PyC_MainModule_Backup & PyC_MainModule_Restore if there is
+* any chance that python is in the call stack.
*****************************************************************************/
PyObject *PyC_DefaultNameSpace(const char *filename)
{
@@ -292,6 +301,20 @@ PyObject *PyC_DefaultNameSpace(const char *filename)
return PyModule_GetDict(mod_main);
}
+/* restore MUST be called after this */
+void PyC_MainModule_Backup(PyObject **main_mod)
+{
+ PyInterpreterState *interp= PyThreadState_GET()->interp;
+ *main_mod= PyDict_GetItemString(interp->modules, "__main__");
+ Py_XINCREF(*main_mod); /* dont free */
+}
+
+void PyC_MainModule_Restore(PyObject *main_mod)
+{
+ PyInterpreterState *interp= PyThreadState_GET()->interp;
+ PyDict_SetItemString(interp->modules, "__main__", main_mod);
+ Py_XDECREF(main_mod);
+}
/* Would be nice if python had this built in */
void PyC_RunQuicky(const char *filepath, int n, ...)
@@ -323,12 +346,12 @@ void PyC_RunQuicky(const char *filepath, int n, ...)
char *format = va_arg(vargs, char *);
void *ptr = va_arg(vargs, void *);
- ret= PyObject_CallFunction(calcsize, "s", format);
+ ret= PyObject_CallFunction(calcsize, (char *)"s", format);
if(ret) {
sizes[i]= PyLong_AsSsize_t(ret);
Py_DECREF(ret);
- ret = PyObject_CallFunction(unpack, "sy#", format, (char *)ptr, sizes[i]);
+ ret = PyObject_CallFunction(unpack, (char *)"sy#", format, (char *)ptr, sizes[i]);
}
if(ret == NULL) {
diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h
index b378f7a5a34..ccdbde5cecb 100644
--- a/source/blender/python/generic/py_capi_utils.h
+++ b/source/blender/python/generic/py_capi_utils.h
@@ -25,18 +25,21 @@
#ifndef PY_CAPI_UTILS_H
#define PY_CAPI_UTILS_H
-void PyC_ObSpit(char *name, PyObject *var);
+void PyC_ObSpit(const char *name, PyObject *var);
void PyC_LineSpit(void);
PyObject * PyC_ExceptionBuffer(void);
PyObject * PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...);
void PyC_FileAndNum(const char **filename, int *lineno);
-int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, char *error_prefix);
+int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, const char *error_prefix);
/* follow http://www.python.org/dev/peps/pep-0383/ */
PyObject * PyC_UnicodeFromByte(const char *str);
-const char * PuC_UnicodeAsByte(PyObject *py_str, PyObject **coerce); /* coerce must be NULL */
+const char * PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce); /* coerce must be NULL */
/* name namespace function for bpy & bge */
PyObject * PyC_DefaultNameSpace(const char *filename);
void PyC_RunQuicky(const char *filepath, int n, ...);
+
+void PyC_MainModule_Backup(PyObject **main_mod);
+void PyC_MainModule_Restore(PyObject *main_mod);
#endif // PY_CAPI_UTILS_H
diff --git a/source/blender/blenpluginapi/intern/Makefile b/source/blender/python/intern/CMakeLists.txt
index 696462f3f46..3c7804ab7e3 100644
--- a/source/blender/blenpluginapi/intern/Makefile
+++ b/source/blender/python/intern/CMakeLists.txt
@@ -1,6 +1,3 @@
-#
-# $Id$
-#
# ***** BEGIN GPL LICENSE BLOCK *****
#
# This program is free software; you can redistribute it and/or
@@ -17,34 +14,56 @@
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+# The Original Code is Copyright (C) 2006, Blender Foundation
# All rights reserved.
#
# The Original Code is: all of this file.
#
-# Contributor(s): none yet.
+# Contributor(s): Jacques Beaurainm, Campbell Barton
#
# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blenpluginapi
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-include nan_compile.mk
+set(INC
+ ..
+ ../../blenlib
+ ../../makesdna
+ ../../makesrna
+ ../../blenkernel
+ ../../windowmanager
+ ../../editors/include
+ ../../../../intern/guardedalloc
+ ../../../../intern/audaspace/intern
+ ${PYTHON_INCLUDE_DIRS}
+)
-CFLAGS += $(LEVEL_1_C_WARNINGS)
+set(SRC
+ bpy.c
+ bpy_app.c
+ bpy_driver.c
+ bpy_interface.c
+ bpy_operator.c
+ bpy_operator_wrap.c
+ bpy_props.c
+ bpy_rna.c
+ bpy_rna_array.c
+ bpy_rna_callback.c
+ bpy_util.c
+ stubs.c
-# path to our own external headerfiles. On win2k this needs to be
-# longer, to avoid the util.h include problem
-CPPFLAGS += -I..
-CPPFLAGS += -I../..
+ bpy.h
+ bpy_app.h
+ bpy_operator.h
+ bpy_operator_wrap.h
+ bpy_props.h
+ bpy_rna.h
+ bpy_rna_callback.h
+ bpy_util.h
+ ../BPY_extern.h
+)
-# also do dna
-CPPFLAGS += -I../../makesdna
-# path to blenlib
-CPPFLAGS += -I../../blenlib
-# path to imbuf
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
+# only to check if buildinfo is available
+if(WITH_BUILDINFO)
+ add_definitions(-DBUILD_DATE)
+endif()
+blender_add_lib(bf_python "${SRC}" "${INC}")
diff --git a/source/blender/python/intern/Makefile b/source/blender/python/intern/Makefile
deleted file mode 100644
index 6c0b7b4d14e..00000000000
--- a/source/blender/python/intern/Makefile
+++ /dev/null
@@ -1,67 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = python
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# OpenGL and Python
-CPPFLAGS += $(OGL_CPPFLAGS)
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-# PreProcessor stuff
-
-CPPFLAGS += -I$(NAN_GHOST)/include
-CPPFLAGS += $(NAN_SDLCFLAGS)
-
-# modules
-CPPFLAGS += -I../../editors/include
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../nodes
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../render/extern/include
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_MEMUTIL)/include
-
-# path to our own headerfiles
-CPPFLAGS += -I..
diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c
index 12a5221f76e..28870298e40 100644
--- a/source/blender/python/intern/bpy.c
+++ b/source/blender/python/intern/bpy.c
@@ -25,6 +25,7 @@
/* This file defines the '_bpy' module which is used by python's 'bpy' package.
* a script writer should never directly access this module */
+#define WITH_PYTHON /* for AUD_PyInit.h, possibly others */
#include "bpy_util.h"
#include "bpy_rna.h"
@@ -34,11 +35,17 @@
#include "BLI_path_util.h"
#include "BLI_bpath.h"
-
+#include "BLI_utildefines.h"
+
+
+#include "BKE_global.h" /* XXX, G.main only */
+
+#include "MEM_guardedalloc.h"
+
/* external util modules */
-#include "../generic/geometry.h"
+#include "../generic/mathutils.h"
#include "../generic/bgl.h"
-#include "../generic/blf_api.h"
+#include "../generic/blf_py_api.h"
#include "../generic/IDProp.h"
#include "AUD_PyInit.h"
@@ -51,7 +58,7 @@ static char bpy_script_paths_doc[] =
" :return: (system, user) strings will be empty when not found.\n"
" :rtype: tuple of strigs\n";
-PyObject *bpy_script_paths(PyObject *self)
+PyObject *bpy_script_paths(PyObject *UNUSED(self))
{
PyObject *ret= PyTuple_New(2);
char *path;
@@ -73,51 +80,87 @@ static char bpy_blend_paths_doc[] =
" :type absolute: boolean\n"
" :return: path list.\n"
" :rtype: list of strigs\n";
-static PyObject *bpy_blend_paths(PyObject * self, PyObject *args, PyObject *kw)
+static PyObject *bpy_blend_paths(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
- struct BPathIterator bpi;
- PyObject *list = PyList_New(0), *st; /* stupidly big string to be safe */
+ struct BPathIterator *bpi;
+ PyObject *list, *st; /* stupidly big string to be safe */
/* be sure there is low chance of the path being too short */
char filepath_expanded[1024];
- char *lib;
+ const char *lib;
int absolute = 0;
- static char *kwlist[] = {"absolute", NULL};
+ static const char *kwlist[] = {"absolute", NULL};
- if (!PyArg_ParseTupleAndKeywords(args, kw, "|i:blend_paths", kwlist, &absolute))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "|i:blend_paths", (char **)kwlist, &absolute))
return NULL;
- for(BLI_bpathIterator_init(&bpi, NULL); !BLI_bpathIterator_isDone(&bpi); BLI_bpathIterator_step(&bpi)) {
+ list= PyList_New(0);
+
+ for(BLI_bpathIterator_init(&bpi, G.main, NULL, 0); !BLI_bpathIterator_isDone(bpi); BLI_bpathIterator_step(bpi)) {
/* build the list */
if (absolute) {
- BLI_bpathIterator_getPathExpanded(&bpi, filepath_expanded);
+ BLI_bpathIterator_getPathExpanded(bpi, filepath_expanded);
}
else {
- lib = BLI_bpathIterator_getLib(&bpi);
- if (lib && (strcmp(lib, bpi.base_path))) { /* relative path to the library is NOT the same as our blendfile path, return an absolute path */
- BLI_bpathIterator_getPathExpanded(&bpi, filepath_expanded);
+ lib = BLI_bpathIterator_getLib(bpi);
+ if (lib && (strcmp(lib, BLI_bpathIterator_getBasePath(bpi)))) { /* relative path to the library is NOT the same as our blendfile path, return an absolute path */
+ BLI_bpathIterator_getPathExpanded(bpi, filepath_expanded);
}
else {
- BLI_bpathIterator_getPath(&bpi, filepath_expanded);
+ BLI_bpathIterator_getPath(bpi, filepath_expanded);
}
}
- st = PyUnicode_FromString(filepath_expanded);
+ st= PyUnicode_DecodeFSDefault(filepath_expanded);
PyList_Append(list, st);
Py_DECREF(st);
}
- BLI_bpathIterator_free(&bpi);
+ BLI_bpathIterator_free(bpi);
return list;
}
-static PyMethodDef meth_bpy_script_paths[] = {{ "script_paths", (PyCFunction)bpy_script_paths, METH_NOARGS, bpy_script_paths_doc}};
-static PyMethodDef meth_bpy_blend_paths[] = {{ "blend_paths", (PyCFunction)bpy_blend_paths, METH_VARARGS|METH_KEYWORDS, bpy_blend_paths_doc}};
-static void bpy_import_test(char *modname)
+// static char bpy_user_resource_doc[] = // now in bpy/utils.py
+static PyObject *bpy_user_resource(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
+{
+ char *type;
+ char *subdir= NULL;
+ int folder_id;
+ static const char *kwlist[] = {"type", "subdir", NULL};
+
+ char *path;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s|s:user_resource", (char **)kwlist, &type, &subdir))
+ return NULL;
+
+ /* stupid string compare */
+ if (!strcmp(type, "DATAFILES")) folder_id= BLENDER_USER_DATAFILES;
+ else if(!strcmp(type, "CONFIG")) folder_id= BLENDER_USER_CONFIG;
+ else if(!strcmp(type, "SCRIPTS")) folder_id= BLENDER_USER_SCRIPTS;
+ else if(!strcmp(type, "AUTOSAVE")) folder_id= BLENDER_USER_AUTOSAVE;
+ else {
+ PyErr_SetString(PyExc_ValueError, "invalid resource argument");
+ return NULL;
+ }
+
+ /* same logic as BLI_get_folder_create(), but best leave it up to the script author to create */
+ path= BLI_get_folder(folder_id, subdir);
+
+ if (!path)
+ path = BLI_get_user_folder_notest(folder_id, subdir);
+
+ return PyUnicode_FromString(path ? path : "");
+}
+
+static PyMethodDef meth_bpy_script_paths = {"script_paths", (PyCFunction)bpy_script_paths, METH_NOARGS, bpy_script_paths_doc};
+static PyMethodDef meth_bpy_blend_paths = {"blend_paths", (PyCFunction)bpy_blend_paths, METH_VARARGS|METH_KEYWORDS, bpy_blend_paths_doc};
+static PyMethodDef meth_bpy_user_resource = {"user_resource", (PyCFunction)bpy_user_resource, METH_VARARGS|METH_KEYWORDS, NULL};
+
+static void bpy_import_test(const char *modname)
{
- PyObject *mod= PyImport_ImportModuleLevel(modname, NULL, NULL, NULL, 0);
+ PyObject *mod= PyImport_ImportModuleLevel((char *)modname, NULL, NULL, NULL, 0);
if(mod) {
Py_DECREF(mod);
}
@@ -149,13 +192,7 @@ void BPy_init_modules( void )
printf("bpy: couldnt find 'scripts/modules', blender probably wont start.\n");
}
/* stand alone utility modules not related to blender directly */
- Geometry_Init();
- Mathutils_Init();
- Noise_Init();
- BGL_Init();
- BLF_Init();
- IDProp_Init_Types();
- AUD_initPython();
+ IDProp_Init_Types(); /* not actually a submodule, just types */
mod = PyModule_New("_bpy");
@@ -177,7 +214,7 @@ void BPy_init_modules( void )
PyModule_AddObject( mod, "app", BPY_app_struct() );
/* bpy context */
- RNA_pointer_create(NULL, &RNA_Context, BPy_GetContext(), &ctx_ptr);
+ RNA_pointer_create(NULL, &RNA_Context, (void *)BPy_GetContext(), &ctx_ptr);
bpy_context_module= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ctx_ptr);
/* odd that this is needed, 1 ref on creation and another for the module
* but without we get a crash on exit */
@@ -186,8 +223,13 @@ void BPy_init_modules( void )
PyModule_AddObject(mod, "context", (PyObject *)bpy_context_module);
/* utility func's that have nowhere else to go */
- PyModule_AddObject(mod, meth_bpy_script_paths->ml_name, (PyObject *)PyCFunction_New(meth_bpy_script_paths, NULL));
- PyModule_AddObject(mod, meth_bpy_blend_paths->ml_name, (PyObject *)PyCFunction_New(meth_bpy_blend_paths, NULL));
+ PyModule_AddObject(mod, meth_bpy_script_paths.ml_name, (PyObject *)PyCFunction_New(&meth_bpy_script_paths, NULL));
+ PyModule_AddObject(mod, meth_bpy_blend_paths.ml_name, (PyObject *)PyCFunction_New(&meth_bpy_blend_paths, NULL));
+ PyModule_AddObject(mod, meth_bpy_user_resource.ml_name, (PyObject *)PyCFunction_New(&meth_bpy_user_resource, NULL));
+
+ /* register funcs (bpy_rna.c) */
+ PyModule_AddObject(mod, meth_bpy_register_class.ml_name, (PyObject *)PyCFunction_New(&meth_bpy_register_class, NULL));
+ PyModule_AddObject(mod, meth_bpy_unregister_class.ml_name, (PyObject *)PyCFunction_New(&meth_bpy_unregister_class, NULL));
/* add our own modules dir, this is a python package */
bpy_import_test("bpy");
diff --git a/source/blender/python/intern/bpy_app.c b/source/blender/python/intern/bpy_app.c
index 78658a611a3..0f6fd3f6415 100644
--- a/source/blender/python/intern/bpy_app.c
+++ b/source/blender/python/intern/bpy_app.c
@@ -25,40 +25,51 @@
#include "bpy_app.h"
#include "BLI_path_util.h"
+#include "BLI_utildefines.h"
+
#include "BKE_blender.h"
#include "BKE_global.h"
#include "structseq.h"
+#include "../generic/py_capi_utils.h"
+
#ifdef BUILD_DATE
extern char build_date[];
extern char build_time[];
extern char build_rev[];
extern char build_platform[];
extern char build_type[];
+extern char build_cflags[];
+extern char build_cxxflags[];
+extern char build_linkflags[];
+extern char build_system[];
#endif
static PyTypeObject BlenderAppType;
static PyStructSequence_Field app_info_fields[] = {
- {"version", "The Blender version as a tuple of 3 numbers. eg. (2, 50, 11)"},
- {"version_string", "The Blender version formatted as a string"},
- {"binary_path", "The location of blenders executable, useful for utilities that spawn new instances"},
- {"debug", "Boolean, set when blender is running in debug mode (started with -d)"},
- {"background", "Boolean, True when blender is running without a user interface (started with -b)"},
+ {(char *)"version", (char *)"The Blender version as a tuple of 3 numbers. eg. (2, 50, 11)"},
+ {(char *)"version_string", (char *)"The Blender version formatted as a string"},
+ {(char *)"binary_path", (char *)"The location of blenders executable, useful for utilities that spawn new instances"},
+ {(char *)"background", (char *)"Boolean, True when blender is running without a user interface (started with -b)"},
/* buildinfo */
- {"build_date", "The date this blender instance was built"},
- {"build_time", "The time this blender instance was built"},
- {"build_revision", "The subversion revision this blender instance was built with"},
- {"build_platform", "The platform this blender instance was built for"},
- {"build_type", "The type of build (Release, Debug)"},
+ {(char *)"build_date", (char *)"The date this blender instance was built"},
+ {(char *)"build_time", (char *)"The time this blender instance was built"},
+ {(char *)"build_revision", (char *)"The subversion revision this blender instance was built with"},
+ {(char *)"build_platform", (char *)"The platform this blender instance was built for"},
+ {(char *)"build_type", (char *)"The type of build (Release, Debug)"},
+ {(char *)"build_cflags", (char *)"C compiler flags"},
+ {(char *)"build_cxxflags", (char *)"C++ compiler flags"},
+ {(char *)"build_linkflags", (char *)"Binary linking flags"},
+ {(char *)"build_system", (char *)"Build system used"},
{0}
};
static PyStructSequence_Desc app_info_desc = {
- "bpy.app", /* name */
- "This module contains application values that remain unchanged during runtime.", /* doc */
+ (char *)"bpy.app", /* name */
+ (char *)"This module contains application values that remain unchanged during runtime.", /* doc */
app_info_fields, /* fields */
(sizeof(app_info_fields)/sizeof(PyStructSequence_Field)) - 1
};
@@ -85,7 +96,6 @@ static PyObject *make_app_info(void)
SetObjItem(Py_BuildValue("(iii)", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION));
SetObjItem(PyUnicode_FromFormat("%d.%02d (sub %d)", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION));
SetStrItem(bprogname);
- SetObjItem(PyBool_FromLong(G.f & G_DEBUG));
SetObjItem(PyBool_FromLong(G.background));
/* build info */
@@ -95,12 +105,20 @@ static PyObject *make_app_info(void)
SetStrItem(build_rev);
SetStrItem(build_platform);
SetStrItem(build_type);
+ SetStrItem(build_cflags);
+ SetStrItem(build_cxxflags);
+ SetStrItem(build_linkflags);
+ SetStrItem(build_system);
#else
SetStrItem("Unknown");
SetStrItem("Unknown");
SetStrItem("Unknown");
SetStrItem("Unknown");
SetStrItem("Unknown");
+ SetStrItem("Unknown");
+ SetStrItem("Unknown");
+ SetStrItem("Unknown");
+ SetStrItem("Unknown");
#endif
#undef SetIntItem
@@ -114,10 +132,90 @@ static PyObject *make_app_info(void)
return app_info;
}
+/* a few getsets because it makes sense for them to be in bpy.app even though
+ * they are not static */
+static PyObject *bpy_app_debug_get(PyObject *UNUSED(self), void *UNUSED(closure))
+{
+ return PyBool_FromLong(G.f & G_DEBUG);
+}
+
+static int bpy_app_debug_set(PyObject *UNUSED(self), PyObject *value, void *UNUSED(closure))
+{
+ int param= PyObject_IsTrue(value);
+
+ if(param < 0) {
+ PyErr_SetString(PyExc_TypeError, "bpy.app.debug can only be True/False");
+ return -1;
+ }
+
+ if(param) G.f |= G_DEBUG;
+ else G.f &= ~G_DEBUG;
+
+ return 0;
+}
+
+static PyObject *bpy_app_debug_value_get(PyObject *UNUSED(self), void *UNUSED(closure))
+{
+ return PyLong_FromSsize_t(G.rt);
+}
+
+static int bpy_app_debug_value_set(PyObject *UNUSED(self), PyObject *value, void *UNUSED(closure))
+{
+ int param= PyLong_AsSsize_t(value);
+
+ if (param == -1 && PyErr_Occurred()) {
+ PyErr_SetString(PyExc_TypeError, "bpy.app.debug_value can only be set to a whole number");
+ return -1;
+ }
+
+ G.rt= param;
+
+ return 0;
+}
+
+static PyObject *bpy_app_tempdir_get(PyObject *UNUSED(self), void *UNUSED(closure))
+{
+ extern char btempdir[];
+ return PyC_UnicodeFromByte(btempdir);
+}
+
+static PyObject *bpy_app_driver_dict_get(PyObject *UNUSED(self), void *UNUSED(closure))
+{
+ if (bpy_pydriver_Dict == NULL)
+ if (bpy_pydriver_create_dict() != 0) {
+ PyErr_SetString(PyExc_RuntimeError, "bpy.app.driver_namespace failed to create dictionary");
+ return NULL;
+ }
+
+ Py_INCREF(bpy_pydriver_Dict);
+ return bpy_pydriver_Dict;
+}
+
+
+PyGetSetDef bpy_app_getsets[]= {
+ {(char *)"debug", bpy_app_debug_get, bpy_app_debug_set, (char *)"Boolean, set when blender is running in debug mode (started with -d)", NULL},
+ {(char *)"debug_value", bpy_app_debug_value_get, bpy_app_debug_value_set, (char *)"Int, number which can be set to non-zero values for testing purposes.", NULL},
+ {(char *)"tempdir", bpy_app_tempdir_get, NULL, (char *)"String, the temp directory used by blender (read-only)", NULL},
+ {(char *)"driver_namespace", bpy_app_driver_dict_get, NULL, (char *)"Dictionary for drivers namespace, editable in-place, reset on file load (read-only)", NULL},
+ {NULL, NULL, NULL, NULL, NULL}
+};
+
+static void py_struct_seq_getset_init(void)
+{
+ /* tricky dynamic members, not to py-spec! */
+ PyGetSetDef *getset;
+
+ for(getset= bpy_app_getsets; getset->name; getset++) {
+ PyDict_SetItemString(BlenderAppType.tp_dict, getset->name, PyDescr_NewGetSet(&BlenderAppType, getset));
+ }
+}
+/* end dynamic bpy.app */
+
+
PyObject *BPY_app_struct(void)
{
PyObject *ret;
-
+
PyStructSequence_InitType(&BlenderAppType, &app_info_desc);
ret= make_app_info();
@@ -125,6 +223,10 @@ PyObject *BPY_app_struct(void)
/* prevent user from creating new instances */
BlenderAppType.tp_init = NULL;
BlenderAppType.tp_new = NULL;
-
+
+ /* kindof a hack ontop of PyStructSequence */
+ py_struct_seq_getset_init();
+
return ret;
}
+
diff --git a/source/blender/python/intern/bpy_app.h b/source/blender/python/intern/bpy_app.h
index 1da5004ee85..02cadc66f48 100644
--- a/source/blender/python/intern/bpy_app.h
+++ b/source/blender/python/intern/bpy_app.h
@@ -28,4 +28,8 @@
PyObject *BPY_app_struct( void );
+/* bpy_driver.c */
+int bpy_pydriver_create_dict(void);
+extern PyObject *bpy_pydriver_Dict;
+
#endif
diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c
index e5719a84fdd..161b56d39aa 100644
--- a/source/blender/python/intern/bpy_driver.c
+++ b/source/blender/python/intern/bpy_driver.c
@@ -40,7 +40,7 @@ PyObject *bpy_pydriver_Dict = NULL;
/* For faster execution we keep a special dictionary for pydrivers, with
* the needed modules and aliases.
*/
-static int bpy_pydriver_create_dict(void)
+int bpy_pydriver_create_dict(void)
{
PyObject *d, *mod;
@@ -63,47 +63,21 @@ static int bpy_pydriver_create_dict(void)
}
/* add bpy to global namespace */
- mod= PyImport_ImportModuleLevel("bpy", NULL, NULL, NULL, 0);
+ mod= PyImport_ImportModuleLevel((char *)"bpy", NULL, NULL, NULL, 0);
if (mod) {
PyDict_SetItemString(bpy_pydriver_Dict, "bpy", mod);
Py_DECREF(mod);
}
-
-#if 0 // non existant yet
- mod = PyImport_ImportModule("Blender.Noise");
- if (mod) {
- PyDict_SetItemString(d, "noise", mod);
- PyDict_SetItemString(d, "n", mod);
- Py_DECREF(mod);
- } else {
- PyErr_Clear();
- }
-
- /* If there's a Blender text called pydrivers.py, import it.
- * Users can add their own functions to this module.
- */
- if (G.f & G_SCRIPT_AUTOEXEC) {
- mod = importText("pydrivers"); /* can also use PyImport_Import() */
- if (mod) {
- PyDict_SetItemString(d, "pydrivers", mod);
- PyDict_SetItemString(d, "p", mod);
- Py_DECREF(mod);
- } else {
- PyErr_Clear();
- }
- }
-#endif // non existant yet
-
return 0;
}
/* Update function, it gets rid of pydrivers global dictionary, forcing
- * BPY_eval_driver to recreate it. This function is used to force
+ * BPY_driver_exec to recreate it. This function is used to force
* reloading the Blender text module "pydrivers.py", if available, so
* updates in it reach pydriver evaluation.
*/
-void BPY_pydriver_update(void)
+void BPY_driver_reset(void)
{
PyGILState_STATE gilstate;
int use_gil= 1; // (PyThreadState_Get()==NULL);
@@ -124,22 +98,14 @@ void BPY_pydriver_update(void)
}
/* error return function for BPY_eval_pydriver */
-static float pydriver_error(ChannelDriver *driver)
+static void pydriver_error(ChannelDriver *driver)
{
- if (bpy_pydriver_Dict) { /* free the global dict used by pydrivers */
- PyDict_Clear(bpy_pydriver_Dict);
- Py_DECREF(bpy_pydriver_Dict);
- bpy_pydriver_Dict = NULL;
- }
-
driver->flag |= DRIVER_FLAG_INVALID; /* py expression failed */
fprintf(stderr, "\nError in Driver: The following Python expression failed:\n\t'%s'\n\n", driver->expression);
// BPy_errors_to_report(NULL); // TODO - reports
PyErr_Print();
PyErr_Clear();
-
- return 0.0f;
}
/* This evals py driver expressions, 'expr' is a Python expression that
@@ -149,7 +115,7 @@ static float pydriver_error(ChannelDriver *driver)
* bake operator which intern starts a thread which calls scene update which
* does a driver update. to avoid a deadlock check PyThreadState_Get() if PyGILState_Ensure() is needed.
*/
-float BPY_eval_driver (ChannelDriver *driver)
+float BPY_driver_exec(ChannelDriver *driver)
{
PyObject *driver_vars=NULL;
PyObject *retval= NULL;
@@ -238,15 +204,15 @@ float BPY_eval_driver (ChannelDriver *driver)
/* try to add to dictionary */
/* if (PyDict_SetItemString(driver_vars, dvar->name, driver_arg)) { */
- if (PyDict_SetItem(driver_vars, PyTuple_GET_ITEM(expr_vars, i++), driver_arg)) { /* use string interning for faster namespace creation */
+ if (PyDict_SetItem(driver_vars, PyTuple_GET_ITEM(expr_vars, i++), driver_arg) < 0) { /* use string interning for faster namespace creation */
/* this target failed - bad name */
if (targets_ok) {
/* first one - print some extra info for easier identification */
- fprintf(stderr, "\nBPY_eval_driver() - Error while evaluating PyDriver:\n");
+ fprintf(stderr, "\nBPY_driver_eval() - Error while evaluating PyDriver:\n");
targets_ok= 0;
}
- fprintf(stderr, "\tBPY_eval_driver() - couldn't add variable '%s' to namespace\n", dvar->name);
+ fprintf(stderr, "\tBPY_driver_eval() - couldn't add variable '%s' to namespace\n", dvar->name);
// BPy_errors_to_report(NULL); // TODO - reports
PyErr_Print();
PyErr_Clear();
@@ -259,7 +225,7 @@ float BPY_eval_driver (ChannelDriver *driver)
#else
/* evaluate the compiled expression */
if (expr_code)
- retval= PyEval_EvalCode((PyCodeObject *)expr_code, bpy_pydriver_Dict, driver_vars);
+ retval= PyEval_EvalCode((void *)expr_code, bpy_pydriver_Dict, driver_vars);
#endif
/* decref the driver vars first... */
@@ -286,7 +252,7 @@ float BPY_eval_driver (ChannelDriver *driver)
return (float)result;
}
else {
- fprintf(stderr, "\tBPY_eval_driver() - driver '%s' evaluates to '%f'\n", dvar->name, result);
+ fprintf(stderr, "\tBPY_driver_eval() - driver '%s' evaluates to '%f'\n", dvar->name, result);
return 0.0f;
}
}
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index 6aaac3cd0e8..5c4add0e547 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -23,13 +23,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
-
-
/* grr, python redefines */
#ifdef _POSIX_C_SOURCE
#undef _POSIX_C_SOURCE
#endif
+#include <Python.h>
+
+#include "MEM_guardedalloc.h"
#include "bpy.h"
#include "bpy_rna.h"
@@ -38,10 +39,11 @@
#include "DNA_space_types.h"
#include "DNA_text_types.h"
-#include "MEM_guardedalloc.h"
#include "BLI_path_util.h"
#include "BLI_math_base.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
#include "BKE_text.h"
@@ -60,8 +62,7 @@
static int py_call_level= 0;
BPy_StructRNA *bpy_context_module= NULL; /* for fast access */
-// only for tests
-#define TIME_PY_RUN
+// #define TIME_PY_RUN // simple python tests. prints on exit.
#ifdef TIME_PY_RUN
#include "PIL_time.h"
@@ -88,7 +89,7 @@ void bpy_context_set(bContext *C, PyGILState_STATE *gilstate)
fprintf(stderr, "ERROR: Python context called with a NULL Context. this should not happen!\n");
}
- BPY_update_modules(); /* can give really bad results if this isnt here */
+ BPY_modules_update(C); /* can give really bad results if this isnt here */
#ifdef TIME_PY_RUN
if(bpy_timer_count==0) {
@@ -104,7 +105,8 @@ void bpy_context_set(bContext *C, PyGILState_STATE *gilstate)
}
}
-void bpy_context_clear(bContext *C, PyGILState_STATE *gilstate)
+/* context should be used but not now because it causes some bugs */
+void bpy_context_clear(bContext *UNUSED(C), PyGILState_STATE *gilstate)
{
py_call_level--;
@@ -127,7 +129,7 @@ void bpy_context_clear(bContext *C, PyGILState_STATE *gilstate)
}
}
-void BPY_free_compiled_text( struct Text *text )
+void BPY_text_free_code(Text *text)
{
if( text->compiled ) {
Py_DECREF( ( PyObject * ) text->compiled );
@@ -135,7 +137,7 @@ void BPY_free_compiled_text( struct Text *text )
}
}
-void BPY_update_modules( void )
+void BPY_modules_update(bContext *C)
{
#if 0 // slow, this runs all the time poll, draw etc 100's of time a sec.
PyObject *mod= PyImport_ImportModuleLevel("bpy", NULL, NULL, NULL, 0);
@@ -145,11 +147,11 @@ void BPY_update_modules( void )
/* refreshes the main struct */
BPY_update_rna_module();
- bpy_context_module->ptr.data= (void *)BPy_GetContext();
+ bpy_context_module->ptr.data= (void *)C;
}
/* must be called before Py_Initialize */
-void BPY_start_python_path(void)
+void BPY_python_start_path(void)
{
char *py_path_bundle= BLI_get_folder(BLENDER_PYTHON, NULL);
@@ -190,13 +192,31 @@ void BPY_start_python_path(void)
-void BPY_set_context(bContext *C)
+void BPY_context_set(bContext *C)
{
BPy_SetContext(C);
}
-/* call BPY_set_context first */
-void BPY_start_python( int argc, char **argv )
+/* init-tab */
+extern PyObject *BPyInit_noise(void);
+extern PyObject *BPyInit_mathutils(void);
+// extern PyObject *BPyInit_mathutils_geometry(void); // BPyInit_mathutils calls, py doesnt work with thos :S
+extern PyObject *BPyInit_bgl(void);
+extern PyObject *BPyInit_blf(void);
+extern PyObject *AUD_initPython(void);
+
+static struct _inittab bpy_internal_modules[]= {
+ {(char *)"noise", BPyInit_noise},
+ {(char *)"mathutils", BPyInit_mathutils},
+// {(char *)"mathutils.geometry", BPyInit_mathutils_geometry},
+ {(char *)"bgl", BPyInit_bgl},
+ {(char *)"blf", BPyInit_blf},
+ {(char *)"aud", AUD_initPython},
+ {NULL, NULL}
+};
+
+/* call BPY_context_set first */
+void BPY_python_start( int argc, char **argv )
{
PyThreadState *py_tstate = NULL;
@@ -205,7 +225,15 @@ void BPY_start_python( int argc, char **argv )
utf8towchar(bprogname_wchar, bprogname);
Py_SetProgramName(bprogname_wchar);
- BPY_start_python_path(); /* allow to use our own included python */
+ /* builtin modules */
+ PyImport_ExtendInittab(bpy_internal_modules);
+
+ BPY_python_start_path(); /* allow to use our own included python */
+
+ /* Python 3.2 now looks for '2.56/python/include/python3.2d/pyconfig.h' to parse
+ * from the 'sysconfig' module which is used by 'site', so for now disable site.
+ * alternatively we could copy the file. */
+ Py_NoSiteFlag= 1;
Py_Initialize( );
@@ -213,25 +241,10 @@ void BPY_start_python( int argc, char **argv )
/* sigh, why do python guys not have a char** version anymore? :( */
{
int i;
-#if 0
PyObject *py_argv= PyList_New(argc);
for (i=0; i<argc; i++)
- PyList_SET_ITEM(py_argv, i, PyUnicode_FromString(argv[i]));
-
-#else // should fix bug #20021 - utf path name problems
- PyObject *py_argv= PyList_New(0);
- for (i=0; i<argc; i++) {
- PyObject *item= PyUnicode_Decode(argv[i], strlen(argv[i]), Py_FileSystemDefaultEncoding, NULL);
- if(item==NULL) { // should never happen
- PyErr_Print();
- PyErr_Clear();
- }
- else {
- PyList_Append(py_argv, item);
- Py_DECREF(item);
- }
- }
-#endif
+ PyList_SET_ITEM(py_argv, i, PyC_UnicodeFromByte(argv[i])); /* should fix bug #20021 - utf path name problems, by replacing PyUnicode_FromString */
+
PySys_SetObject("argv", py_argv);
Py_DECREF(py_argv);
}
@@ -245,11 +258,24 @@ void BPY_start_python( int argc, char **argv )
{ /* our own import and reload functions */
PyObject *item;
+ PyObject *mod;
//PyObject *m = PyImport_AddModule("__builtin__");
//PyObject *d = PyModule_GetDict(m);
PyObject *d = PyEval_GetBuiltins( );
- PyDict_SetItemString(d, "reload", item=PyCFunction_New(bpy_reload_meth, NULL)); Py_DECREF(item);
- PyDict_SetItemString(d, "__import__", item=PyCFunction_New(bpy_import_meth, NULL)); Py_DECREF(item);
+// PyDict_SetItemString(d, "reload", item=PyCFunction_New(&bpy_reload_meth, NULL)); Py_DECREF(item);
+ PyDict_SetItemString(d, "__import__", item=PyCFunction_New(&bpy_import_meth, NULL)); Py_DECREF(item);
+
+ /* move reload here
+ * XXX, use import hooks */
+ mod= PyImport_ImportModuleLevel((char *)"imp", NULL, NULL, NULL, 0);
+ if(mod) {
+ PyDict_SetItemString(PyModule_GetDict(mod), "reload", item=PyCFunction_New(&bpy_reload_meth, NULL)); Py_DECREF(item);
+ Py_DECREF(mod);
+ }
+ else {
+ BLI_assert(!"unable to load 'imp' module.");
+ }
+
}
pyrna_alloc_types();
@@ -258,7 +284,7 @@ void BPY_start_python( int argc, char **argv )
PyEval_ReleaseThread(py_tstate);
}
-void BPY_end_python( void )
+void BPY_python_end(void)
{
// fprintf(stderr, "Ending Python!\n");
@@ -292,22 +318,39 @@ void BPY_end_python( void )
}
-/* Can run a file or text block */
-int BPY_run_python_script( bContext *C, const char *fn, struct Text *text, struct ReportList *reports)
+/* super annoying, undo _PyModule_Clear(), bug [#23871] */
+#define PYMODULE_CLEAR_WORKAROUND
+
+#ifdef PYMODULE_CLEAR_WORKAROUND
+/* bad!, we should never do this, but currently only safe way I could find to keep namespace.
+ * from being cleared. - campbell */
+typedef struct {
+ PyObject_HEAD
+ PyObject *md_dict;
+ /* ommit other values, we only want the dict. */
+} PyModuleObject;
+#endif
+
+static int python_script_exec(bContext *C, const char *fn, struct Text *text, struct ReportList *reports)
{
- PyObject *py_dict, *py_result= NULL;
+ PyObject *main_mod= NULL;
+ PyObject *py_dict= NULL, *py_result= NULL;
PyGILState_STATE gilstate;
-
+
+ BLI_assert(fn || text);
+
if (fn==NULL && text==NULL) {
return 0;
}
bpy_context_set(C, &gilstate);
+ PyC_MainModule_Backup(&main_mod);
+
if (text) {
char fn_dummy[FILE_MAXDIR];
bpy_text_filename_get(fn_dummy, text);
-
+
if( !text->compiled ) { /* if it wasn't already compiled, do it now */
char *buf = txt_to_buf( text );
@@ -316,8 +359,8 @@ int BPY_run_python_script( bContext *C, const char *fn, struct Text *text, struc
MEM_freeN( buf );
- if( PyErr_Occurred( ) ) {
- BPY_free_compiled_text( text );
+ if(PyErr_Occurred()) {
+ BPY_text_free_code(text);
}
}
@@ -325,7 +368,7 @@ int BPY_run_python_script( bContext *C, const char *fn, struct Text *text, struc
py_dict = PyC_DefaultNameSpace(fn_dummy);
py_result = PyEval_EvalCode(text->compiled, py_dict, py_dict);
}
-
+
}
else {
FILE *fp= fopen(fn, "r");
@@ -334,9 +377,9 @@ int BPY_run_python_script( bContext *C, const char *fn, struct Text *text, struc
py_dict = PyC_DefaultNameSpace(fn);
#ifdef _WIN32
- /* Previously we used PyRun_File to run directly the code on a FILE
+ /* Previously we used PyRun_File to run directly the code on a FILE
* object, but as written in the Python/C API Ref Manual, chapter 2,
- * 'FILE structs for different C libraries can be different and
+ * 'FILE structs for different C libraries can be different and
* incompatible'.
* So now we load the script file data to a buffer */
{
@@ -360,100 +403,43 @@ int BPY_run_python_script( bContext *C, const char *fn, struct Text *text, struc
py_result= NULL;
}
}
-
+
if (!py_result) {
BPy_errors_to_report(reports);
} else {
Py_DECREF( py_result );
}
-
- PyDict_SetItemString(PyThreadState_GET()->interp->modules, "__main__", Py_None);
-
- bpy_context_clear(C, &gilstate);
- return py_result ? 1:0;
-}
-
-
-/* TODO - move into bpy_space.c ? */
-/* GUI interface routines */
-
-/* Copied from Draw.c */
-static void exit_pydraw( SpaceScript * sc, short err )
-{
- Script *script = NULL;
-
- if( !sc || !sc->script )
- return;
-
- script = sc->script;
+ if(py_dict) {
+#ifdef PYMODULE_CLEAR_WORKAROUND
+ PyModuleObject *mmod= (PyModuleObject *)PyDict_GetItemString(PyThreadState_GET()->interp->modules, "__main__");
+ PyObject *dict_back = mmod->md_dict;
+ /* freeing the module will clear the namespace,
+ * gives problems running classes defined in this namespace being used later. */
+ mmod->md_dict= NULL;
+ Py_DECREF(dict_back);
+#endif
- if( err ) {
- BPy_errors_to_report(NULL); // TODO, reports
- script->flags = 0; /* mark script struct for deletion */
- SCRIPT_SET_NULL(script);
- script->scriptname[0] = '\0';
- script->scriptarg[0] = '\0';
-// XXX 2.5 error_pyscript();
-// XXX 2.5 scrarea_queue_redraw( sc->area );
+#undef PYMODULE_CLEAR_WORKAROUND
}
-#if 0 // XXX 2.5
- BPy_Set_DrawButtonsList(sc->but_refs);
- BPy_Free_DrawButtonsList(); /*clear all temp button references*/
-#endif
+ PyC_MainModule_Restore(main_mod);
- sc->but_refs = NULL;
-
- Py_XDECREF( ( PyObject * ) script->py_draw );
- Py_XDECREF( ( PyObject * ) script->py_event );
- Py_XDECREF( ( PyObject * ) script->py_button );
+ bpy_context_clear(C, &gilstate);
- script->py_draw = script->py_event = script->py_button = NULL;
+ return (py_result != NULL);
}
-static int bpy_run_script_init(bContext *C, SpaceScript * sc)
+/* Can run a file or text block */
+int BPY_filepath_exec(bContext *C, const char *filepath, struct ReportList *reports)
{
- if (sc->script==NULL)
- return 0;
-
- if (sc->script->py_draw==NULL && sc->script->scriptname[0] != '\0')
- BPY_run_python_script(C, sc->script->scriptname, NULL, NULL);
-
- if (sc->script->py_draw==NULL)
- return 0;
-
- return 1;
+ return python_script_exec(C, filepath, NULL, reports);
}
-int BPY_run_script_space_draw(const struct bContext *C, SpaceScript * sc)
-{
- if (bpy_run_script_init( (bContext *)C, sc)) {
- PyGILState_STATE gilstate = PyGILState_Ensure();
- PyObject *result = PyObject_CallObject( sc->script->py_draw, NULL );
-
- if (result==NULL)
- exit_pydraw(sc, 1);
-
- PyGILState_Release(gilstate);
- }
- return 1;
-}
-// XXX - not used yet, listeners dont get a context
-int BPY_run_script_space_listener(bContext *C, SpaceScript * sc)
+int BPY_text_exec(bContext *C, struct Text *text, struct ReportList *reports)
{
- if (bpy_run_script_init(C, sc)) {
- PyGILState_STATE gilstate = PyGILState_Ensure();
-
- PyObject *result = PyObject_CallObject( sc->script->py_draw, NULL );
-
- if (result==NULL)
- exit_pydraw(sc, 1);
-
- PyGILState_Release(gilstate);
- }
- return 1;
+ return python_script_exec(C, NULL, text, reports);
}
void BPY_DECREF(void *pyob_ptr)
@@ -463,61 +449,12 @@ void BPY_DECREF(void *pyob_ptr)
PyGILState_Release(gilstate);
}
-#if 0
-/* called from the the scripts window, assume context is ok */
-int BPY_run_python_script_space(const char *modulename, const char *func)
-{
- PyObject *py_dict, *py_result= NULL;
- char pystring[512];
- PyGILState_STATE gilstate;
-
- /* for calling the module function */
- PyObject *py_func,
-
- gilstate = PyGILState_Ensure();
-
- py_dict = PyC_DefaultNameSpace("<dummy>");
-
- PyObject *module = PyImport_ImportModule(scpt->script.filename);
- if (module==NULL) {
- PyErr_SetFormat(PyExc_SystemError, "could not import '%s'", scpt->script.filename);
- }
- else {
- py_func = PyObject_GetAttrString(modulename, func);
- if (py_func==NULL) {
- PyErr_SetFormat(PyExc_SystemError, "module has no function '%s.%s'\n", scpt->script.filename, func);
- }
- else {
- Py_DECREF(py_func);
- if (!PyCallable_Check(py_func)) {
- PyErr_SetFormat(PyExc_SystemError, "module item is not callable '%s.%s'\n", scpt->script.filename, func);
- }
- else {
- py_result= PyObject_CallObject(py_func, NULL); // XXX will need args eventually
- }
- }
- }
-
- if (!py_result) {
- BPy_errors_to_report(NULL); // TODO - reports
- } else
- Py_DECREF( py_result );
-
- Py_XDECREF(module);
-
- PyDict_SetItemString(PyThreadState_GET()->interp->modules, "__main__", Py_None);
-
- PyGILState_Release(gilstate);
- return 1;
-}
-#endif
-
-
-int BPY_eval_button(bContext *C, const char *expr, double *value)
+int BPY_button_exec(bContext *C, const char *expr, double *value)
{
PyGILState_STATE gilstate;
PyObject *py_dict, *mod, *retval;
int error_ret = 0;
+ PyObject *main_mod= NULL;
if (!value || !expr) return -1;
@@ -527,7 +464,9 @@ int BPY_eval_button(bContext *C, const char *expr, double *value)
}
bpy_context_set(C, &gilstate);
-
+
+ PyC_MainModule_Backup(&main_mod);
+
py_dict= PyC_DefaultNameSpace("<blender button>");
mod = PyImport_ImportModule("math");
@@ -578,16 +517,17 @@ int BPY_eval_button(bContext *C, const char *expr, double *value)
BPy_errors_to_report(CTX_wm_reports(C));
}
- PyDict_SetItemString(PyThreadState_GET()->interp->modules, "__main__", Py_None);
+ PyC_MainModule_Backup(&main_mod);
bpy_context_clear(C, &gilstate);
return error_ret;
}
-int BPY_eval_string(bContext *C, const char *expr)
+int BPY_string_exec(bContext *C, const char *expr)
{
PyGILState_STATE gilstate;
+ PyObject *main_mod= NULL;
PyObject *py_dict, *retval;
int error_ret = 0;
@@ -599,6 +539,8 @@ int BPY_eval_string(bContext *C, const char *expr)
bpy_context_set(C, &gilstate);
+ PyC_MainModule_Backup(&main_mod);
+
py_dict= PyC_DefaultNameSpace("<blender string>");
retval = PyRun_String(expr, Py_eval_input, py_dict, py_dict);
@@ -612,15 +554,15 @@ int BPY_eval_string(bContext *C, const char *expr)
Py_DECREF(retval);
}
- PyDict_SetItemString(PyThreadState_GET()->interp->modules, "__main__", Py_None);
-
+ PyC_MainModule_Restore(main_mod);
+
bpy_context_clear(C, &gilstate);
return error_ret;
}
-void BPY_load_user_modules(bContext *C)
+void BPY_modules_load_user(bContext *C)
{
PyGILState_STATE gilstate;
Main *bmain= CTX_data_main(C);
@@ -653,7 +595,7 @@ void BPY_load_user_modules(bContext *C)
bpy_context_clear(C, &gilstate);
}
-int BPY_context_get(bContext *C, const char *member, bContextDataResult *result)
+int BPY_context_member_get(bContext *C, const char *member, bContextDataResult *result)
{
PyObject *pyctx= (PyObject *)CTX_py_dict_get(C);
PyObject *item= PyDict_GetItemString(pyctx, member);
diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c
index eeab1fce4b2..70aa46c1302 100644
--- a/source/blender/python/intern/bpy_operator.c
+++ b/source/blender/python/intern/bpy_operator.c
@@ -32,6 +32,8 @@
#include "bpy_rna.h" /* for setting arg props only - pyrna_py_to_prop() */
#include "bpy_util.h"
+#include "BLI_utildefines.h"
+
#include "RNA_enum_types.h"
#include "WM_api.h"
@@ -40,18 +42,26 @@
#include "MEM_guardedalloc.h"
#include "BKE_report.h"
-static PyObject *pyop_poll( PyObject * self, PyObject * args)
+static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args)
{
wmOperatorType *ot;
char *opname;
PyObject *context_dict= NULL; /* optional args */
PyObject *context_dict_back;
+ char *context_str= NULL;
PyObject *ret;
+ int context= WM_OP_EXEC_DEFAULT;
+
// XXX Todo, work out a better solution for passing on context, could make a tuple from self and pack the name and Context into it...
- bContext *C = BPy_GetContext();
+ bContext *C= (bContext *)BPy_GetContext();
- if (!PyArg_ParseTuple(args, "s|O:_bpy.ops.poll", &opname, &context_dict))
+ if(C==NULL) {
+ PyErr_SetString(PyExc_SystemError, "Context is None, cant poll any operators");
+ return NULL;
+ }
+
+ if (!PyArg_ParseTuple(args, "s|Os:_bpy.ops.poll", &opname, &context_dict, &context_str))
return NULL;
ot= WM_operatortype_find(opname, TRUE);
@@ -61,8 +71,22 @@ static PyObject *pyop_poll( PyObject * self, PyObject * args)
return NULL;
}
- if(!PyDict_Check(context_dict))
+ if(context_str) {
+ if(RNA_enum_value_from_id(operator_context_items, context_str, &context)==0) {
+ char *enum_str= BPy_enum_as_string(operator_context_items);
+ PyErr_Format(PyExc_TypeError, "Calling operator \"bpy.ops.%s.poll\" error, expected a string enum in (%.200s)", opname, enum_str);
+ MEM_freeN(enum_str);
+ return NULL;
+ }
+ }
+
+ if(context_dict==NULL || context_dict==Py_None) {
context_dict= NULL;
+ }
+ else if (!PyDict_Check(context_dict)) {
+ PyErr_Format(PyExc_TypeError, "Calling operator \"bpy.ops.%s.poll\" error, custom context expected a dict or None, got a %.200s", opname, Py_TYPE(context_dict)->tp_name);
+ return NULL;
+ }
context_dict_back= CTX_py_dict_get(C);
@@ -70,7 +94,7 @@ static PyObject *pyop_poll( PyObject * self, PyObject * args)
Py_XINCREF(context_dict); /* so we done loose it */
/* main purpose of thsi function */
- ret= WM_operator_poll((bContext*)C, ot) ? Py_True : Py_False;
+ ret= WM_operator_poll_context((bContext*)C, ot, context) ? Py_True : Py_False;
/* restore with original context dict, probably NULL but need this for nested operator calls */
Py_XDECREF(context_dict);
@@ -80,7 +104,7 @@ static PyObject *pyop_poll( PyObject * self, PyObject * args)
return ret;
}
-static PyObject *pyop_call( PyObject * self, PyObject * args)
+static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
{
wmOperatorType *ot;
int error_val = 0;
@@ -97,7 +121,12 @@ static PyObject *pyop_call( PyObject * self, PyObject * args)
int context= WM_OP_EXEC_DEFAULT;
// XXX Todo, work out a better solution for passing on context, could make a tuple from self and pack the name and Context into it...
- bContext *C = BPy_GetContext();
+ bContext *C = (bContext *)BPy_GetContext();
+
+ if(C==NULL) {
+ PyErr_SetString(PyExc_SystemError, "Context is None, cant poll any operators");
+ return NULL;
+ }
if (!PyArg_ParseTuple(args, "sO|O!s:_bpy.ops.call", &opname, &context_dict, &PyDict_Type, &kw, &context_str))
return NULL;
@@ -109,6 +138,11 @@ static PyObject *pyop_call( PyObject * self, PyObject * args)
return NULL;
}
+ if(!pyrna_write_check()) {
+ PyErr_Format(PyExc_SystemError, "Calling operator \"bpy.ops.%s\" error, can't modify blend data in this state (drawing/rendering)", opname);
+ return NULL;
+ }
+
if(context_str) {
if(RNA_enum_value_from_id(operator_context_items, context_str, &context)==0) {
char *enum_str= BPy_enum_as_string(operator_context_items);
@@ -118,20 +152,28 @@ static PyObject *pyop_call( PyObject * self, PyObject * args)
}
}
- if(!PyDict_Check(context_dict))
+ if(context_dict==NULL || context_dict==Py_None) {
context_dict= NULL;
+ }
+ else if (!PyDict_Check(context_dict)) {
+ PyErr_Format(PyExc_TypeError, "Calling operator \"bpy.ops.%s\" error, custom context expected a dict or None, got a %.200s", opname, Py_TYPE(context_dict)->tp_name);
+ return NULL;
+ }
context_dict_back= CTX_py_dict_get(C);
CTX_py_dict_set(C, (void *)context_dict);
Py_XINCREF(context_dict); /* so we done loose it */
- if(WM_operator_poll((bContext*)C, ot) == FALSE) {
- PyErr_Format( PyExc_SystemError, "Operator bpy.ops.%.200s.poll() failed, context is incorrect", opname);
+ if(WM_operator_poll_context((bContext*)C, ot, context) == FALSE) {
+ const char *msg= CTX_wm_operator_poll_msg_get(C);
+ PyErr_Format(PyExc_SystemError, "Operator bpy.ops.%.200s.poll() %.200s", opname, msg ? msg : "failed, context is incorrect");
+ CTX_wm_operator_poll_msg_set(C, NULL); /* better set to NULL else it could be used again */
error_val= -1;
}
else {
WM_operator_properties_create_ptr(&ptr, ot);
+ WM_operator_properties_sanitize(&ptr, 0);
if(kw && PyDict_Size(kw))
error_val= pyrna_pydict_to_props(&ptr, kw, 0, "Converting py args to operator properties: ");
@@ -145,7 +187,7 @@ static PyObject *pyop_call( PyObject * self, PyObject * args)
operator_ret= WM_operator_call_py(C, ot, context, &ptr, reports);
- if(BPy_reports_to_error(reports))
+ if(BPy_reports_to_error(reports, FALSE))
error_val = -1;
/* operator output is nice to have in the terminal/console too */
@@ -189,12 +231,18 @@ static PyObject *pyop_call( PyObject * self, PyObject * args)
return NULL;
}
+ /* when calling bpy.ops.wm.read_factory_settings() bpy.data's main pointer is freed by clear_globals(),
+ * further access will crash blender. setting context is not needed in this case, only calling because this
+ * function corrects bpy.data (internal Main pointer) */
+ BPY_modules_update(C);
+
+
/* return operator_ret as a bpy enum */
return pyrna_enum_bitfield_to_py(operator_return_items, operator_ret);
}
-static PyObject *pyop_as_string( PyObject * self, PyObject * args)
+static PyObject *pyop_as_string(PyObject *UNUSED(self), PyObject *args)
{
wmOperatorType *ot;
PointerRNA ptr;
@@ -207,15 +255,20 @@ static PyObject *pyop_as_string( PyObject * self, PyObject * args)
char *buf = NULL;
PyObject *pybuf;
- bContext *C = BPy_GetContext();
+ bContext *C = (bContext *)BPy_GetContext();
+ if(C==NULL) {
+ PyErr_SetString(PyExc_SystemError, "Context is None, cant get the string representation of this object.");
+ return NULL;
+ }
+
if (!PyArg_ParseTuple(args, "s|O!i:_bpy.ops.as_string", &opname, &PyDict_Type, &kw, &all_args))
return NULL;
ot= WM_operatortype_find(opname, TRUE);
if (ot == NULL) {
- PyErr_Format( PyExc_SystemError, "_bpy.ops.as_string: operator \"%s\"could not be found", opname);
+ PyErr_Format(PyExc_SystemError, "_bpy.ops.as_string: operator \"%.200s\"could not be found", opname);
return NULL;
}
@@ -246,7 +299,7 @@ static PyObject *pyop_as_string( PyObject * self, PyObject * args)
return pybuf;
}
-static PyObject *pyop_dir(PyObject *self)
+static PyObject *pyop_dir(PyObject *UNUSED(self))
{
PyObject *list = PyList_New(0), *name;
wmOperatorType *ot;
@@ -260,7 +313,7 @@ static PyObject *pyop_dir(PyObject *self)
return list;
}
-static PyObject *pyop_getrna(PyObject *self, PyObject *value)
+static PyObject *pyop_getrna(PyObject *UNUSED(self), PyObject *value)
{
wmOperatorType *ot;
PointerRNA ptr;
@@ -282,6 +335,7 @@ static PyObject *pyop_getrna(PyObject *self, PyObject *value)
/* XXX - should call WM_operator_properties_free */
WM_operator_properties_create_ptr(&ptr, ot);
+ WM_operator_properties_sanitize(&ptr, 0);
pyrna= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr);
@@ -311,14 +365,8 @@ static struct PyModuleDef bpy_ops_module = {
PyObject *BPY_operator_module(void)
{
PyObject *submodule;
-
- submodule= PyModule_Create(&bpy_ops_module);
- PyDict_SetItemString(PyImport_GetModuleDict(), bpy_ops_module.m_name, submodule);
- /* INCREF since its its assumed that all these functions return the
- * module with a new ref like PyDict_New, since they are passed to
- * PyModule_AddObject which steals a ref */
- Py_INCREF(submodule);
+ submodule= PyModule_Create(&bpy_ops_module);
return submodule;
}
diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c
index 6d16896fb16..12c67f9e03f 100644
--- a/source/blender/python/intern/bpy_operator_wrap.c
+++ b/source/blender/python/intern/bpy_operator_wrap.c
@@ -27,6 +27,8 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "BLI_utildefines.h"
+
#include "RNA_define.h"
#include "bpy_rna.h"
@@ -84,7 +86,7 @@ void macro_wrapper(wmOperatorType *ot, void *userdata)
operator_properties_init(ot);
}
-PyObject *PYOP_wrap_macro_define(PyObject *self, PyObject *args)
+PyObject *PYOP_wrap_macro_define(PyObject *UNUSED(self), PyObject *args)
{
wmOperatorType *ot;
wmOperatorTypeMacro *otmacro;
diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c
index 104027c0997..ada8736158c 100644
--- a/source/blender/python/intern/bpy_props.c
+++ b/source/blender/python/intern/bpy_props.c
@@ -26,7 +26,9 @@
#include "bpy_rna.h"
#include "bpy_util.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
+
+
#include "RNA_define.h" /* for defining our own rna */
#include "RNA_enum_types.h"
@@ -40,6 +42,12 @@ EnumPropertyItem property_flag_items[] = {
{PROP_ANIMATABLE, "ANIMATABLE", 0, "Animateable", ""},
{0, NULL, 0, NULL, NULL}};
+EnumPropertyItem property_flag_enum_items[] = {
+ {PROP_HIDDEN, "HIDDEN", 0, "Hidden", ""},
+ {PROP_ANIMATABLE, "ANIMATABLE", 0, "Animateable", ""},
+ {PROP_ENUM_FLAG, "ENUM_FLAG", 0, "Enum Flag", ""},
+ {0, NULL, 0, NULL, NULL}};
+
/* subtypes */
EnumPropertyItem property_subtype_string_items[] = {
{PROP_FILEPATH, "FILE_PATH", 0, "File Path", ""},
@@ -132,6 +140,27 @@ static PyObject *bpy_prop_deferred_return(PyObject *func, PyObject *kw)
return bpy_prop_deferred_return((void *)pymeth_##_func, kw); \
} \
+/* terse macros for error checks shared between all funcs cant use function
+ * calls because of static strins passed to pyrna_set_to_enum_bitfield */
+#define BPY_PROPDEF_CHECK(_func, _property_flag_items) \
+ if(id_len >= MAX_IDPROP_NAME) { \
+ PyErr_Format(PyExc_TypeError, #_func"(): '%.200s' too long, max length is %d", id, MAX_IDPROP_NAME-1); \
+ return NULL; \
+ } \
+ if(RNA_def_property_free_identifier(srna, id) == -1) { \
+ PyErr_Format(PyExc_TypeError, #_func"(): '%s' is defined as a non-dynamic type", id); \
+ return NULL; \
+ } \
+ if(pyopts && pyrna_set_to_enum_bitfield(_property_flag_items, pyopts, &opts, #_func"(options={...}):")) \
+ return NULL; \
+
+#define BPY_PROPDEF_SUBTYPE_CHECK(_func, _property_flag_items, _subtype) \
+ BPY_PROPDEF_CHECK(_func, _property_flag_items) \
+ if(pysubtype && RNA_enum_value_from_id(_subtype, pysubtype, &subtype)==0) { \
+ PyErr_Format(PyExc_TypeError, #_func"(subtype='%s'): invalid subtype", pysubtype); \
+ return NULL; \
+ } \
+
#if 0
static int bpy_struct_id_used(StructRNA *srna, char *identifier)
@@ -162,8 +191,9 @@ static PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw)
BPY_PROPDEF_HEAD(BoolProperty)
if(srna) {
- static char *kwlist[] = {"attr", "name", "description", "default", "options", "subtype", NULL};
- char *id=NULL, *name="", *description="";
+ static const char *kwlist[] = {"attr", "name", "description", "default", "options", "subtype", NULL};
+ const char *id=NULL, *name="", *description="";
+ int id_len;
int def=0;
PropertyRNA *prop;
PyObject *pyopts= NULL;
@@ -171,23 +201,11 @@ static PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw)
char *pysubtype= NULL;
int subtype= PROP_NONE;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssiO!s:BoolProperty", (char **)kwlist, &id, &name, &description, &def, &PySet_Type, &pyopts, &pysubtype))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#|ssiO!s:BoolProperty", (char **)kwlist, &id, &id_len, &name, &description, &def, &PySet_Type, &pyopts, &pysubtype))
return NULL;
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "BoolProperty(): '%s' is defined as a non-dynamic type.", id);
- return NULL;
- }
+ BPY_PROPDEF_SUBTYPE_CHECK(BoolProperty, property_flag_items, property_subtype_number_items)
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "BoolProperty(options={...}):"))
- return NULL;
-
- if(pysubtype && RNA_enum_value_from_id(property_subtype_number_items, pysubtype, &subtype)==0) {
- PyErr_Format(PyExc_TypeError, "BoolProperty(subtype='%s'): invalid subtype.", pysubtype);
- return NULL;
- }
-
- // prop= RNA_def_boolean(srna, id, def, name, description);
prop= RNA_def_property(srna, id, PROP_BOOLEAN, subtype);
RNA_def_property_boolean_default(prop, def);
RNA_def_property_ui_text(prop, name, description);
@@ -219,7 +237,8 @@ static PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject
if(srna) {
static const char *kwlist[] = {"attr", "name", "description", "default", "options", "subtype", "size", NULL};
- char *id=NULL, *name="", *description="";
+ const char *id=NULL, *name="", *description="";
+ int id_len;
int def[PYRNA_STACK_ARRAY]={0};
int size=3;
PropertyRNA *prop;
@@ -229,24 +248,13 @@ static PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject
char *pysubtype= NULL;
int subtype= PROP_NONE;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssOO!si:BoolVectorProperty", (char **)kwlist, &id, &name, &description, &pydef, &PySet_Type, &pyopts, &pysubtype, &size))
- return NULL;
-
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "BoolVectorProperty(): '%s' is defined as a non-dynamic type.", id);
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#|ssOO!si:BoolVectorProperty", (char **)kwlist, &id, &id_len, &name, &description, &pydef, &PySet_Type, &pyopts, &pysubtype, &size))
return NULL;
- }
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "BoolVectorProperty(options={...}):"))
- return NULL;
-
- if(pysubtype && RNA_enum_value_from_id(property_subtype_array_items, pysubtype, &subtype)==0) {
- PyErr_Format(PyExc_TypeError, "BoolVectorProperty(subtype='%s'): invalid subtype.", pysubtype);
- return NULL;
- }
+ BPY_PROPDEF_SUBTYPE_CHECK(BoolVectorProperty, property_flag_items, property_subtype_array_items)
if(size < 1 || size > PYRNA_STACK_ARRAY) {
- PyErr_Format(PyExc_TypeError, "BoolVectorProperty(size=%d): size must be between 0 and %d.", size, PYRNA_STACK_ARRAY);
+ PyErr_Format(PyExc_TypeError, "BoolVectorProperty(size=%d): size must be between 0 and " STRINGIFY(PYRNA_STACK_ARRAY), size);
return NULL;
}
@@ -286,7 +294,8 @@ static PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw)
if(srna) {
static const char *kwlist[] = {"attr", "name", "description", "default", "min", "max", "soft_min", "soft_max", "step", "options", "subtype", NULL};
- char *id=NULL, *name="", *description="";
+ const char *id=NULL, *name="", *description="";
+ int id_len;
int min=INT_MIN, max=INT_MAX, soft_min=INT_MIN, soft_max=INT_MAX, step=1, def=0;
PropertyRNA *prop;
PyObject *pyopts= NULL;
@@ -294,21 +303,10 @@ static PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw)
char *pysubtype= NULL;
int subtype= PROP_NONE;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssiiiiiiO!s:IntProperty", (char **)kwlist, &id, &name, &description, &def, &min, &max, &soft_min, &soft_max, &step, &PySet_Type, &pyopts, &pysubtype))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#|ssiiiiiiO!s:IntProperty", (char **)kwlist, &id, &id_len, &name, &description, &def, &min, &max, &soft_min, &soft_max, &step, &PySet_Type, &pyopts, &pysubtype))
return NULL;
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "IntProperty(): '%s' is defined as a non-dynamic type.", id);
- return NULL;
- }
-
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "IntProperty(options={...}):"))
- return NULL;
-
- if(pysubtype && RNA_enum_value_from_id(property_subtype_number_items, pysubtype, &subtype)==0) {
- PyErr_Format(PyExc_TypeError, "IntProperty(subtype='%s'): invalid subtype.", pysubtype);
- return NULL;
- }
+ BPY_PROPDEF_SUBTYPE_CHECK(IntProperty, property_flag_items, property_subtype_number_items)
prop= RNA_def_property(srna, id, PROP_INT, subtype);
RNA_def_property_int_default(prop, def);
@@ -342,7 +340,8 @@ static PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject
if(srna) {
static const char *kwlist[] = {"attr", "name", "description", "default", "min", "max", "soft_min", "soft_max", "step", "options", "subtype", "size", NULL};
- char *id=NULL, *name="", *description="";
+ const char *id=NULL, *name="", *description="";
+ int id_len;
int min=INT_MIN, max=INT_MAX, soft_min=INT_MIN, soft_max=INT_MAX, step=1, def[PYRNA_STACK_ARRAY]={0};
int size=3;
PropertyRNA *prop;
@@ -352,24 +351,13 @@ static PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject
char *pysubtype= NULL;
int subtype= PROP_NONE;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssOiiiiiO!si:IntVectorProperty", (char **)kwlist, &id, &name, &description, &pydef, &min, &max, &soft_min, &soft_max, &step, &PySet_Type, &pyopts, &pysubtype, &size))
- return NULL;
-
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "IntVectorProperty(): '%s' is defined as a non-dynamic type.", id);
- return NULL;
- }
-
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "IntVectorProperty(options={...}):"))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#|ssOiiiiiO!si:IntVectorProperty", (char **)kwlist, &id, &id_len, &name, &description, &pydef, &min, &max, &soft_min, &soft_max, &step, &PySet_Type, &pyopts, &pysubtype, &size))
return NULL;
- if(pysubtype && RNA_enum_value_from_id(property_subtype_array_items, pysubtype, &subtype)==0) {
- PyErr_Format(PyExc_TypeError, "IntVectorProperty(subtype='%s'): invalid subtype.", pysubtype);
- return NULL;
- }
+ BPY_PROPDEF_SUBTYPE_CHECK(IntVectorProperty, property_flag_items, property_subtype_array_items)
if(size < 1 || size > PYRNA_STACK_ARRAY) {
- PyErr_Format(PyExc_TypeError, "IntVectorProperty(size=%d): size must be between 0 and %d.", size, PYRNA_STACK_ARRAY);
+ PyErr_Format(PyExc_TypeError, "IntVectorProperty(size=%d): size must be between 0 and " STRINGIFY(PYRNA_STACK_ARRAY), size);
return NULL;
}
@@ -412,7 +400,8 @@ static PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw)
if(srna) {
static const char *kwlist[] = {"attr", "name", "description", "default", "min", "max", "soft_min", "soft_max", "step", "precision", "options", "subtype", "unit", NULL};
- char *id=NULL, *name="", *description="";
+ const char *id=NULL, *name="", *description="";
+ int id_len;
float min=-FLT_MAX, max=FLT_MAX, soft_min=-FLT_MAX, soft_max=FLT_MAX, step=3, def=0.0f;
int precision= 2;
PropertyRNA *prop;
@@ -423,24 +412,13 @@ static PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw)
char *pyunit= NULL;
int unit= PROP_UNIT_NONE;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssffffffiO!ss:FloatProperty", (char **)kwlist, &id, &name, &description, &def, &min, &max, &soft_min, &soft_max, &step, &precision, &PySet_Type, &pyopts, &pysubtype, &pyunit))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#|ssffffffiO!ss:FloatProperty", (char **)kwlist, &id, &id_len, &name, &description, &def, &min, &max, &soft_min, &soft_max, &step, &precision, &PySet_Type, &pyopts, &pysubtype, &pyunit))
return NULL;
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "FloatProperty(): '%s' is defined as a non-dynamic type.", id);
- return NULL;
- }
-
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "FloatProperty(options={...}):"))
- return NULL;
-
- if(pysubtype && RNA_enum_value_from_id(property_subtype_number_items, pysubtype, &subtype)==0) {
- PyErr_Format(PyExc_TypeError, "FloatProperty(subtype='%s'): invalid subtype.", pysubtype);
- return NULL;
- }
+ BPY_PROPDEF_SUBTYPE_CHECK(FloatProperty, property_flag_items, property_subtype_number_items)
if(pyunit && RNA_enum_value_from_id(property_unit_items, pyunit, &unit)==0) {
- PyErr_Format(PyExc_TypeError, "FloatProperty(unit='%s'): invalid unit.");
+ PyErr_Format(PyExc_TypeError, "FloatProperty(unit='%s'): invalid unit");
return NULL;
}
@@ -476,7 +454,8 @@ static PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObjec
if(srna) {
static const char *kwlist[] = {"attr", "name", "description", "default", "min", "max", "soft_min", "soft_max", "step", "precision", "options", "subtype", "size", NULL};
- char *id=NULL, *name="", *description="";
+ const char *id=NULL, *name="", *description="";
+ int id_len;
float min=-FLT_MAX, max=FLT_MAX, soft_min=-FLT_MAX, soft_max=FLT_MAX, step=3, def[PYRNA_STACK_ARRAY]={0.0f};
int precision= 2, size=3;
PropertyRNA *prop;
@@ -486,24 +465,13 @@ static PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObjec
char *pysubtype= NULL;
int subtype= PROP_NONE;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssOfffffiO!si:FloatVectorProperty", (char **)kwlist, &id, &name, &description, &pydef, &min, &max, &soft_min, &soft_max, &step, &precision, &PySet_Type, &pyopts, &pysubtype, &size))
- return NULL;
-
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "FloatVectorProperty(): '%s' is defined as a non-dynamic type.", id);
- return NULL;
- }
-
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "FloatVectorProperty(options={...}):"))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#|ssOfffffiO!si:FloatVectorProperty", (char **)kwlist, &id, &id_len, &name, &description, &pydef, &min, &max, &soft_min, &soft_max, &step, &precision, &PySet_Type, &pyopts, &pysubtype, &size))
return NULL;
- if(pysubtype && RNA_enum_value_from_id(property_subtype_array_items, pysubtype, &subtype)==0) {
- PyErr_Format(PyExc_TypeError, "FloatVectorProperty(subtype='%s'): invalid subtype.", pysubtype);
- return NULL;
- }
+ BPY_PROPDEF_SUBTYPE_CHECK(FloatVectorProperty, property_flag_items, property_subtype_array_items)
if(size < 1 || size > PYRNA_STACK_ARRAY) {
- PyErr_Format(PyExc_TypeError, "FloatVectorProperty(size=%d): size must be between 0 and %d.", size, PYRNA_STACK_ARRAY);
+ PyErr_Format(PyExc_TypeError, "FloatVectorProperty(size=%d): size must be between 0 and " STRINGIFY(PYRNA_STACK_ARRAY), size);
return NULL;
}
@@ -543,7 +511,8 @@ static PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw
if(srna) {
static const char *kwlist[] = {"attr", "name", "description", "default", "maxlen", "options", "subtype", NULL};
- char *id=NULL, *name="", *description="", *def="";
+ const char *id=NULL, *name="", *description="", *def="";
+ int id_len;
int maxlen=0;
PropertyRNA *prop;
PyObject *pyopts= NULL;
@@ -551,21 +520,10 @@ static PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw
char *pysubtype= NULL;
int subtype= PROP_NONE;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|sssiO!s:StringProperty", (char **)kwlist, &id, &name, &description, &def, &maxlen, &PySet_Type, &pyopts, &pysubtype))
- return NULL;
-
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "StringProperty(): '%s' is defined as a non-dynamic type.", id);
- return NULL;
- }
-
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "StringProperty(options={...}):"))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#|sssiO!s:StringProperty", (char **)kwlist, &id, &id_len, &name, &description, &def, &maxlen, &PySet_Type, &pyopts, &pysubtype))
return NULL;
- if(pysubtype && RNA_enum_value_from_id(property_subtype_string_items, pysubtype, &subtype)==0) {
- PyErr_Format(PyExc_TypeError, "StringProperty(subtype='%s'): invalid subtype.", pysubtype);
- return NULL;
- }
+ BPY_PROPDEF_SUBTYPE_CHECK(StringProperty, property_flag_items, property_subtype_string_items)
prop= RNA_def_property(srna, id, PROP_STRING, subtype);
if(maxlen != 0) RNA_def_property_string_maxlength(prop, maxlen + 1); /* +1 since it includes null terminator */
@@ -581,49 +539,94 @@ static PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw
Py_RETURN_NONE;
}
-static EnumPropertyItem *enum_items_from_py(PyObject *value, const char *def, int *defvalue)
+static EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, PyObject *def, int *defvalue, const short is_enum_flag)
{
EnumPropertyItem *items= NULL;
PyObject *item;
int seq_len, i, totitem= 0;
+ short def_used= 0;
+ const char *def_cmp= NULL;
- if(!PySequence_Check(value)) {
- PyErr_SetString(PyExc_TypeError, "expected a sequence of tuples for the enum items");
- return NULL;
+ seq_len= PySequence_Fast_GET_SIZE(seq_fast);
+
+ if(is_enum_flag) {
+ if(seq_len > RNA_ENUM_BITFLAG_SIZE) {
+ PyErr_SetString(PyExc_TypeError, "EnumProperty(...): maximum " STRINGIFY(RNA_ENUM_BITFLAG_SIZE) " members for a ENUM_FLAG type property");
+ return NULL;
+ }
+ if(def && !PySet_Check(def)) {
+ PyErr_Format(PyExc_TypeError, "EnumProperty(...): default option must be a 'set' type when ENUM_FLAG is enabled, not a '%.200s'", Py_TYPE(def)->tp_name);
+ return NULL;
+ }
}
+ else {
+ if(def) {
+ def_cmp= _PyUnicode_AsString(def);
+ if(def_cmp==NULL) {
+ PyErr_Format(PyExc_TypeError, "EnumProperty(...): default option must be a 'str' type when ENUM_FLAG is disabled, not a '%.200s'", Py_TYPE(def)->tp_name);
+ return NULL;
+ }
+ }
+ }
+
+ /* blank value */
+ *defvalue= 0;
- seq_len = PySequence_Length(value);
for(i=0; i<seq_len; i++) {
EnumPropertyItem tmp= {0, "", 0, "", ""};
- item= PySequence_GetItem(value, i);
- if(item==NULL || PyTuple_Check(item)==0) {
- PyErr_SetString(PyExc_TypeError, "expected a sequence of tuples for the enum items");
+ item= PySequence_Fast_GET_ITEM(seq_fast, i);
+ if(PyTuple_Check(item)==0) {
+ PyErr_SetString(PyExc_TypeError, "EnumProperty(...): expected a sequence of tuples for the enum items");
if(items) MEM_freeN(items);
- Py_XDECREF(item);
return NULL;
}
if(!PyArg_ParseTuple(item, "sss", &tmp.identifier, &tmp.name, &tmp.description)) {
- PyErr_SetString(PyExc_TypeError, "expected an identifier, name and description in the tuple");
- Py_DECREF(item);
+ PyErr_SetString(PyExc_TypeError, "EnumProperty(...): expected an identifier, name and description in the tuple");
return NULL;
}
- tmp.value= i;
- RNA_enum_item_add(&items, &totitem, &tmp);
+ if(is_enum_flag) {
+ tmp.value= 1<<i;
- if(def[0] && strcmp(def, tmp.identifier) == 0)
- *defvalue= tmp.value;
+ if(def && PySet_Contains(def, PyTuple_GET_ITEM(item, 0))) {
+ *defvalue |= tmp.value;
+ def_used++;
+ }
+ }
+ else {
+ tmp.value= i;
- Py_DECREF(item);
- }
+ if(def && def_used == 0 && strcmp(def_cmp, tmp.identifier)==0) {
+ *defvalue= tmp.value;
+ def_used++; /* only ever 1 */
+ }
+ }
- if(!def[0])
- *defvalue= 0;
+ RNA_enum_item_add(&items, &totitem, &tmp);
+ }
RNA_enum_item_end(&items, &totitem);
+ if(is_enum_flag) {
+ /* strict check that all set members were used */
+ if(def && def_used != PySet_GET_SIZE(def)) {
+ MEM_freeN(items);
+
+ PyErr_Format(PyExc_TypeError, "EnumProperty(..., default={...}): set has %d unused member(s)", PySet_GET_SIZE(def) - def_used);
+ return NULL;
+ }
+ }
+ else {
+ if(def && def_used == 0) {
+ MEM_freeN(items);
+
+ PyErr_Format(PyExc_TypeError, "EnumProperty(..., default=\'%s\'): not found in enum members", def);
+ return NULL;
+ }
+ }
+
return items;
}
@@ -632,9 +635,11 @@ static char BPy_EnumProperty_doc[] =
"\n"
" Returns a new enumerator property definition.\n"
"\n"
-" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n"
+" :arg default: The default value for this enum, A string when *ENUM_FLAG* is disabled otherwise a set which may only contain string identifiers used in *items*.\n"
+" :type default: string or set\n"
+" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE', 'ENUM_FLAG'].\n"
" :type options: set\n"
-" :arg items: The items that make up this enumerator.\n"
+" :arg items: sequence of enum items formatted: [(identifier, name, description), ...] where the identifier is used for python access and other values are used for the interface.\n"
" :type items: sequence of string triplets";
static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw)
{
@@ -644,30 +649,35 @@ static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw)
if(srna) {
static const char *kwlist[] = {"attr", "items", "name", "description", "default", "options", NULL};
- char *id=NULL, *name="", *description="", *def="";
+ const char *id=NULL, *name="", *description="";
+ PyObject *def= NULL;
+ int id_len;
int defvalue=0;
- PyObject *items= Py_None;
+ PyObject *items, *items_fast;
EnumPropertyItem *eitems;
PropertyRNA *prop;
PyObject *pyopts= NULL;
int opts=0;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|sssO!:EnumProperty", (char **)kwlist, &id, &items, &name, &description, &def, &PySet_Type, &pyopts))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#O|ssOO!:EnumProperty", (char **)kwlist, &id, &id_len, &items, &name, &description, &def, &PySet_Type, &pyopts))
return NULL;
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "EnumProperty(): '%s' is defined as a non-dynamic type.", id);
+ BPY_PROPDEF_CHECK(EnumProperty, property_flag_enum_items)
+
+ if(!(items_fast= PySequence_Fast(items, "EnumProperty(...): expected a sequence of tuples for the enum items"))) {
return NULL;
}
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "EnumProperty(options={...}):"))
- return NULL;
+ eitems= enum_items_from_py(items_fast, def, &defvalue, (opts & PROP_ENUM_FLAG)!=0);
+
+ Py_DECREF(items_fast);
- eitems= enum_items_from_py(items, def, &defvalue);
if(!eitems)
return NULL;
- prop= RNA_def_enum(srna, id, eitems, defvalue, name, description);
+ if(opts & PROP_ENUM_FLAG) prop= RNA_def_enum_flag(srna, id, eitems, defvalue, name, description);
+ else prop= RNA_def_enum(srna, id, eitems, defvalue, name, description);
+
if(pyopts) {
if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
if((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
@@ -682,13 +692,17 @@ static StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix
{
StructRNA *srna;
- srna= srna_from_self(value, "BoolProperty(...):");
+ srna= srna_from_self(value, "");
if(!srna) {
-
- PyObject *msg= PyC_ExceptionBuffer();
- char *msg_char= _PyUnicode_AsString(msg);
- PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from IDPropertyGroup, failed with: %s", error_prefix, msg_char);
- Py_DECREF(msg);
+ if(PyErr_Occurred()) {
+ PyObject *msg= PyC_ExceptionBuffer();
+ char *msg_char= _PyUnicode_AsString(msg);
+ PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from IDPropertyGroup, failed with: %s", error_prefix, msg_char);
+ Py_DECREF(msg);
+ }
+ else {
+ PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from IDPropertyGroup, failed with type '%s'", error_prefix, Py_TYPE(value)->tp_name);
+ }
return NULL;
}
@@ -717,23 +731,18 @@ static PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *k
if(srna) {
static const char *kwlist[] = {"attr", "type", "name", "description", "options", NULL};
- char *id=NULL, *name="", *description="";
+ const char *id=NULL, *name="", *description="";
+ int id_len;
PropertyRNA *prop;
StructRNA *ptype;
PyObject *type= Py_None;
PyObject *pyopts= NULL;
int opts=0;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|ssO!:PointerProperty", (char **)kwlist, &id, &type, &name, &description, &PySet_Type, &pyopts))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#O|ssO!:PointerProperty", (char **)kwlist, &id, &id_len, &type, &name, &description, &PySet_Type, &pyopts))
return NULL;
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "PointerProperty(): '%s' is defined as a non-dynamic type.", id);
- return NULL;
- }
-
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "PointerProperty(options={...}):"))
- return NULL;
+ BPY_PROPDEF_CHECK(PointerProperty, property_flag_items)
ptype= pointer_type_from_py(type, "PointerProperty(...):");
if(!ptype)
@@ -766,23 +775,18 @@ static PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject
if(srna) {
static const char *kwlist[] = {"attr", "type", "name", "description", "options", NULL};
- char *id=NULL, *name="", *description="";
+ const char *id=NULL, *name="", *description="";
+ int id_len;
PropertyRNA *prop;
StructRNA *ptype;
PyObject *type= Py_None;
PyObject *pyopts= NULL;
int opts=0;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|ssO!:CollectionProperty", (char **)kwlist, &id, &type, &name, &description, &PySet_Type, &pyopts))
- return NULL;
-
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "CollectionProperty(): '%s' is defined as a non-dynamic type.", id);
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#O|ssO!:CollectionProperty", (char **)kwlist, &id, &id_len, &type, &name, &description, &PySet_Type, &pyopts))
return NULL;
- }
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "CollectionProperty(options={...}):"))
- return NULL;
+ BPY_PROPDEF_CHECK(CollectionProperty, property_flag_items)
ptype= pointer_type_from_py(type, "CollectionProperty(...):");
if(!ptype)
@@ -827,7 +831,7 @@ static PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw
return NULL; /* self's type was compatible but error getting the srna */
}
else if(srna==NULL) {
- PyErr_SetString(PyExc_TypeError, "RemoveProperty(): struct rna not available for this type.");
+ PyErr_SetString(PyExc_TypeError, "RemoveProperty(): struct rna not available for this type");
return NULL;
}
else {
@@ -839,7 +843,7 @@ static PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw
return NULL;
if(RNA_def_property_free_identifier(srna, id) != 1) {
- PyErr_Format(PyExc_TypeError, "RemoveProperty(): '%s' not a defined dynamic property.", id);
+ PyErr_Format(PyExc_TypeError, "RemoveProperty(): '%s' not a defined dynamic property", id);
return NULL;
}
}
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c
index b0ae13640ba..c21fbaae9c0 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -21,21 +21,23 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+#include <float.h> /* FLT_MIN/MAX */
#include "bpy_rna.h"
#include "bpy_props.h"
#include "bpy_util.h"
#include "bpy_rna_callback.h"
-//#include "blendef.h"
+
#include "BLI_dynstr.h"
+#include "BLI_string.h"
#include "BLI_listbase.h"
-#include "float.h" /* FLT_MIN/MAX */
+#include "BLI_utildefines.h"
#include "RNA_enum_types.h"
#include "RNA_define.h" /* RNA_def_property_free_identifier */
#include "MEM_guardedalloc.h"
-#include "BKE_utildefines.h"
+
#include "BKE_idcode.h"
#include "BKE_context.h"
#include "BKE_global.h" /* evil G.* */
@@ -49,20 +51,63 @@
#include "DNA_anim_types.h"
#include "ED_keyframing.h"
+#include "../generic/IDProp.h" /* for IDprop lookups */
+#include "../generic/py_capi_utils.h"
+
+#define USE_PEDANTIC_WRITE
#define USE_MATHUTILS
#define USE_STRING_COERCE
+static PyObject *pyrna_prop_collection_values(BPy_PropertyRNA *self);
+
+#ifdef USE_PEDANTIC_WRITE
+static short rna_disallow_writes= FALSE;
+
+static int rna_id_write_error(PointerRNA *ptr, PyObject *key)
+{
+ ID *id= ptr->id.data;
+ if(id) {
+ const short idcode= GS(id->name);
+ if(!ELEM(idcode, ID_WM, ID_SCR)) { /* may need more added here */
+ const char *idtype= BKE_idcode_to_name(idcode);
+ const char *pyname;
+ if(key && PyUnicode_Check(key)) pyname= _PyUnicode_AsString(key);
+ else pyname= "<UNKNOWN>";
+
+ /* make a nice string error */
+ BLI_assert(idtype != NULL);
+ PyErr_Format(PyExc_RuntimeError, "Writing to ID classes in this context is not allowed: %.200s, %.200s datablock, error setting %.200s.%.200s", id->name+2, idtype, RNA_struct_identifier(ptr->type), pyname);
+
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+#endif // USE_PEDANTIC_WRITE
+
+
+#ifdef USE_PEDANTIC_WRITE
+int pyrna_write_check(void)
+{
+ return !rna_disallow_writes;
+}
+#else // USE_PEDANTIC_WRITE
+int pyrna_write_check(void)
+{
+ return TRUE;
+}
+#endif // USE_PEDANTIC_WRITE
+
+static Py_ssize_t pyrna_prop_collection_length(BPy_PropertyRNA *self);
+static Py_ssize_t pyrna_prop_array_length(BPy_PropertyArrayRNA *self);
+static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *value, const char *error_prefix);
+static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item);
+
#ifdef USE_MATHUTILS
#include "../generic/mathutils.h" /* so we can have mathutils callbacks */
-#include "../generic/IDProp.h" /* for IDprop lookups */
-#include "../generic/py_capi_utils.h"
-static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, void *data, PyObject *value, const char *error_prefix);
-static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, int start, int stop, int length);
-static Py_ssize_t pyrna_prop_array_length(BPy_PropertyArrayRNA *self);
-static Py_ssize_t pyrna_prop_collection_length(BPy_PropertyRNA *self);
+static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, Py_ssize_t start, Py_ssize_t stop, Py_ssize_t length);
static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_eul_order, short order_fallback);
-static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item);
/* bpyrna vector/euler/quat callbacks */
static int mathutils_rna_array_cb_index= -1; /* index for our callbacks */
@@ -84,16 +129,16 @@ static int mathutils_rna_vector_get(BaseMathObject *bmo, int subtype)
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
if(self->prop==NULL)
return 0;
-
+
RNA_property_float_get_array(&self->ptr, self->prop, bmo->data);
-
+
/* Euler order exception */
if(subtype==MATHUTILS_CB_SUBTYPE_EUL) {
EulerObject *eul= (EulerObject *)bmo;
PropertyRNA *prop_eul_order= NULL;
eul->order= pyrna_rotation_euler_order_get(&self->ptr, &prop_eul_order, eul->order);
}
-
+
return 1;
}
@@ -103,7 +148,13 @@ static int mathutils_rna_vector_set(BaseMathObject *bmo, int subtype)
float min, max;
if(self->prop==NULL)
return 0;
-
+
+#ifdef USE_PEDANTIC_WRITE
+ if(rna_disallow_writes && rna_id_write_error(&self->ptr, NULL)) {
+ return 0;
+ }
+#endif // USE_PEDANTIC_WRITE
+
if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
PyErr_Format(PyExc_AttributeError, "bpy_prop \"%.200s.%.200s\" is read-only", RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop));
return 0;
@@ -119,7 +170,9 @@ static int mathutils_rna_vector_set(BaseMathObject *bmo, int subtype)
}
RNA_property_float_set_array(&self->ptr, self->prop, bmo->data);
- RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+ if(RNA_property_update_check(self->prop)) {
+ RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+ }
/* Euler order exception */
if(subtype==MATHUTILS_CB_SUBTYPE_EUL) {
@@ -128,30 +181,38 @@ static int mathutils_rna_vector_set(BaseMathObject *bmo, int subtype)
short order= pyrna_rotation_euler_order_get(&self->ptr, &prop_eul_order, eul->order);
if(order != eul->order) {
RNA_property_enum_set(&self->ptr, prop_eul_order, eul->order);
- RNA_property_update(BPy_GetContext(), &self->ptr, prop_eul_order);
+ if(RNA_property_update_check(prop_eul_order)) {
+ RNA_property_update(BPy_GetContext(), &self->ptr, prop_eul_order);
+ }
}
}
return 1;
}
-static int mathutils_rna_vector_get_index(BaseMathObject *bmo, int subtype, int index)
+static int mathutils_rna_vector_get_index(BaseMathObject *bmo, int UNUSED(subtype), int index)
{
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
if(self->prop==NULL)
return 0;
-
+
bmo->data[index]= RNA_property_float_get_index(&self->ptr, self->prop, index);
return 1;
}
-static int mathutils_rna_vector_set_index(BaseMathObject *bmo, int subtype, int index)
+static int mathutils_rna_vector_set_index(BaseMathObject *bmo, int UNUSED(subtype), int index)
{
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
if(self->prop==NULL)
return 0;
-
+
+#ifdef USE_PEDANTIC_WRITE
+ if(rna_disallow_writes && rna_id_write_error(&self->ptr, NULL)) {
+ return 0;
+ }
+#endif // USE_PEDANTIC_WRITE
+
if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
PyErr_Format(PyExc_AttributeError, "bpy_prop \"%.200s.%.200s\" is read-only", RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop));
return 0;
@@ -159,7 +220,11 @@ static int mathutils_rna_vector_set_index(BaseMathObject *bmo, int subtype, int
RNA_property_float_clamp(&self->ptr, self->prop, &bmo->data[index]);
RNA_property_float_set_index(&self->ptr, self->prop, index, bmo->data[index]);
- RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+
+ if(RNA_property_update_check(self->prop)) {
+ RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+ }
+
return 1;
}
@@ -175,7 +240,7 @@ Mathutils_Callback mathutils_rna_array_cb = {
/* bpyrna matrix callbacks */
static int mathutils_rna_matrix_cb_index= -1; /* index for our callbacks */
-static int mathutils_rna_matrix_get(BaseMathObject *bmo, int subtype)
+static int mathutils_rna_matrix_get(BaseMathObject *bmo, int UNUSED(subtype))
{
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
@@ -186,21 +251,30 @@ static int mathutils_rna_matrix_get(BaseMathObject *bmo, int subtype)
return 1;
}
-static int mathutils_rna_matrix_set(BaseMathObject *bmo, int subtype)
+static int mathutils_rna_matrix_set(BaseMathObject *bmo, int UNUSED(subtype))
{
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
-
+
if(self->prop==NULL)
return 0;
-
+
+#ifdef USE_PEDANTIC_WRITE
+ if(rna_disallow_writes && rna_id_write_error(&self->ptr, NULL)) {
+ return 0;
+ }
+#endif // USE_PEDANTIC_WRITE
+
if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
PyErr_Format(PyExc_AttributeError, "bpy_prop \"%.200s.%.200s\" is read-only", RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop));
return 0;
}
-
+
/* can ignore clamping here */
RNA_property_float_set_array(&self->ptr, self->prop, bmo->data);
- RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+
+ if(RNA_property_update_check(self->prop)) {
+ RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+ }
return 1;
}
@@ -212,19 +286,23 @@ Mathutils_Callback mathutils_rna_matrix_cb = {
NULL
};
-/* same as RNA_enum_value_from_id but raises an exception */
-int pyrna_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int *value, const char *error_prefix)
+static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_eul_order, short order_fallback)
{
- if(RNA_enum_value_from_id(item, identifier, value) == 0) {
- char *enum_str= BPy_enum_as_string(item);
- PyErr_Format(PyExc_TypeError, "%s: '%.200s' not found in (%s)", error_prefix, identifier, enum_str);
- MEM_freeN(enum_str);
- return -1;
+ /* attempt to get order */
+ if(*prop_eul_order==NULL)
+ *prop_eul_order= RNA_struct_find_property(ptr, "rotation_mode");
+
+ if(*prop_eul_order) {
+ short order= RNA_property_enum_get(ptr, *prop_eul_order);
+ if (order >= ROT_MODE_XYZ && order <= ROT_MODE_ZYX) /* could be quat or axisangle */
+ return order;
}
- return 0;
+ return order_fallback;
}
+#endif // USE_MATHUTILS
+
#define PROP_ALL_VECTOR_SUBTYPES PROP_TRANSLATION: case PROP_DIRECTION: case PROP_VELOCITY: case PROP_ACCELERATION: case PROP_XYZ: case PROP_XYZ_LENGTH
PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
@@ -293,7 +371,7 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
case PROP_QUATERNION:
if(len==3) { /* euler */
if(is_thick) {
- /* attempt to get order, only needed for thixk types since wrapped with update via callbacks */
+ /* attempt to get order, only needed for thick types since wrapped with update via callbacks */
PropertyRNA *prop_eul_order= NULL;
short order= pyrna_rotation_euler_order_get(ptr, &prop_eul_order, ROT_MODE_XYZ);
@@ -345,27 +423,25 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
ret = pyrna_prop_CreatePyObject(ptr, prop); /* owned by the Mathutils PyObject */
}
}
-
-#endif
+#else // USE_MATHUTILS
+ (void)ptr;
+ (void)prop;
+#endif // USE_MATHUTILS
return ret;
}
-#endif
-
-static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_eul_order, short order_fallback)
+/* same as RNA_enum_value_from_id but raises an exception */
+int pyrna_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int *value, const char *error_prefix)
{
- /* attempt to get order */
- if(*prop_eul_order==NULL)
- *prop_eul_order= RNA_struct_find_property(ptr, "rotation_mode");
-
- if(*prop_eul_order) {
- short order= RNA_property_enum_get(ptr, *prop_eul_order);
- if (order >= ROT_MODE_XYZ && order <= ROT_MODE_ZYX) /* could be quat or axisangle */
- return order;
+ if(RNA_enum_value_from_id(item, identifier, value) == 0) {
+ const char *enum_str= BPy_enum_as_string(item);
+ PyErr_Format(PyExc_TypeError, "%s: '%.200s' not found in (%s)", error_prefix, identifier, enum_str);
+ MEM_freeN((void *)enum_str);
+ return -1;
}
- return order_fallback;
+ return 0;
}
static int pyrna_struct_compare( BPy_StructRNA * a, BPy_StructRNA * b )
@@ -440,13 +516,13 @@ static PyObject *pyrna_prop_richcmp(PyObject *a, PyObject *b, int op)
static PyObject *pyrna_struct_str( BPy_StructRNA *self )
{
PyObject *ret;
- char *name;
+ const char *name;
/* print name if available */
name= RNA_struct_name_get_alloc(&self->ptr, NULL, FALSE);
if(name) {
ret= PyUnicode_FromFormat( "<bpy_struct, %.200s(\"%.200s\")>", RNA_struct_identifier(self->ptr.type), name);
- MEM_freeN(name);
+ MEM_freeN((void *)name);
return ret;
}
@@ -458,22 +534,22 @@ static PyObject *pyrna_struct_repr(BPy_StructRNA *self)
ID *id= self->ptr.id.data;
if(id == NULL)
return pyrna_struct_str(self); /* fallback */
-
+
if(RNA_struct_is_ID(self->ptr.type)) {
return PyUnicode_FromFormat( "bpy.data.%s[\"%s\"]", BKE_idcode_to_name_plural(GS(id->name)), id->name+2);
}
else {
PyObject *ret;
- char *path;
+ const char *path;
path= RNA_path_from_ID_to_struct(&self->ptr);
if(path) {
ret= PyUnicode_FromFormat( "bpy.data.%s[\"%s\"].%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, path);
- MEM_freeN(path);
+ MEM_freeN((void *)path);
}
else { /* cant find, print something sane */
ret= PyUnicode_FromFormat( "bpy.data.%s[\"%s\"]...%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, RNA_struct_identifier(self->ptr.type));
}
-
+
return ret;
}
}
@@ -482,7 +558,7 @@ static PyObject *pyrna_prop_str( BPy_PropertyRNA *self )
{
PyObject *ret;
PointerRNA ptr;
- char *name;
+ const char *name;
const char *type_id= NULL;
char type_fmt[64]= "";
int type= RNA_property_type(self->prop);
@@ -515,7 +591,7 @@ static PyObject *pyrna_prop_str( BPy_PropertyRNA *self )
if(name) {
ret= PyUnicode_FromFormat( "<bpy_%.200s, %.200s.%.200s(\"%.200s\")>", type_fmt, RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop), name);
- MEM_freeN(name);
+ MEM_freeN((void *)name);
return ret;
}
}
@@ -527,20 +603,20 @@ static PyObject *pyrna_prop_repr(BPy_PropertyRNA *self)
{
ID *id= self->ptr.id.data;
PyObject *ret;
- char *path;
-
+ const char *path;
+
if(id == NULL)
return pyrna_prop_str(self); /* fallback */
-
+
path= RNA_path_from_ID_to_property(&self->ptr, self->prop);
if(path) {
ret= PyUnicode_FromFormat( "bpy.data.%s[\"%s\"].%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, path);
- MEM_freeN(path);
+ MEM_freeN((void *)path);
}
else { /* cant find, print something sane */
ret= PyUnicode_FromFormat( "bpy.data.%s[\"%s\"]...%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, RNA_property_identifier(self->prop));
}
-
+
return ret;
}
@@ -551,7 +627,7 @@ static long pyrna_struct_hash( BPy_StructRNA *self )
/* from python's meth_hash v3.1.2 */
static long pyrna_prop_hash(BPy_PropertyRNA *self)
-{
+{
long x,y;
if (self->ptr.data == NULL)
x = 0;
@@ -583,12 +659,12 @@ static void pyrna_struct_dealloc( BPy_StructRNA *self )
return;
}
-static char *pyrna_enum_as_string(PointerRNA *ptr, PropertyRNA *prop)
+static const char *pyrna_enum_as_string(PointerRNA *ptr, PropertyRNA *prop)
{
EnumPropertyItem *item;
- char *result;
+ const char *result;
int free= FALSE;
-
+
RNA_property_enum_items(BPy_GetContext(), ptr, prop, &item, NULL, &free);
if(item) {
result= BPy_enum_as_string(item);
@@ -596,28 +672,28 @@ static char *pyrna_enum_as_string(PointerRNA *ptr, PropertyRNA *prop)
else {
result= "";
}
-
+
if(free)
MEM_freeN(item);
-
+
return result;
}
static int pyrna_string_to_enum(PyObject *item, PointerRNA *ptr, PropertyRNA *prop, int *val, const char *error_prefix)
{
- char *param= _PyUnicode_AsString(item);
+ const char *param= _PyUnicode_AsString(item);
if (param==NULL) {
- char *enum_str= pyrna_enum_as_string(ptr, prop);
+ const char *enum_str= pyrna_enum_as_string(ptr, prop);
PyErr_Format(PyExc_TypeError, "%.200s expected a string enum type in (%.200s)", error_prefix, enum_str);
- MEM_freeN(enum_str);
+ MEM_freeN((void *)enum_str);
return 0;
} else {
if (!RNA_property_enum_value(BPy_GetContext(), ptr, prop, param, val)) {
- char *enum_str= pyrna_enum_as_string(ptr, prop);
+ const char *enum_str= pyrna_enum_as_string(ptr, prop);
PyErr_Format(PyExc_TypeError, "%.200s enum \"%.200s\" not found in (%.200s)", error_prefix, param, enum_str);
- MEM_freeN(enum_str);
+ MEM_freeN((void *)enum_str);
return 0;
}
}
@@ -638,7 +714,7 @@ int pyrna_set_to_enum_bitfield(EnumPropertyItem *items, PyObject *value, int *r_
*r_value= 0;
while (_PySet_NextEntry(value, &pos, &key, &hash)) {
- char *param= _PyUnicode_AsString(key);
+ const char *param= _PyUnicode_AsString(key);
if(param==NULL) {
PyErr_Format(PyExc_TypeError, "%.200s expected a string. found a %.200s", error_prefix, Py_TYPE(key)->tp_name);
@@ -669,7 +745,7 @@ static int pyrna_prop_to_enum_bitfield(PointerRNA *ptr, PropertyRNA *prop, PyObj
}
else {
if(PySet_GET_SIZE(value)) {
- PyErr_Format(PyExc_TypeError, "%.200s: empty enum \"%.200s\" could not have any values assigned.", error_prefix, RNA_property_identifier(prop));
+ PyErr_Format(PyExc_TypeError, "%.200s: empty enum \"%.200s\" could not have any values assigned", error_prefix, RNA_property_identifier(prop));
ret= -1;
}
else {
@@ -736,7 +812,7 @@ static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val)
ret= PyUnicode_FromString(item->identifier);
}
else {
- char *ptr_name= RNA_struct_name_get_alloc(ptr, NULL, FALSE);
+ const char *ptr_name= RNA_struct_name_get_alloc(ptr, NULL, FALSE);
/* prefer not fail silently incase of api errors, maybe disable it later */
printf("RNA Warning: Current value \"%d\" matches no enum in '%s', '%s', '%s'\n", val, RNA_struct_identifier(ptr->type), ptr_name, RNA_property_identifier(prop));
@@ -748,9 +824,9 @@ static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val)
#endif
if(ptr_name)
- MEM_freeN(ptr_name);
+ MEM_freeN((void *)ptr_name);
- ret = PyUnicode_FromString( "" );
+ ret = PyUnicode_FromString("");
}
if(free)
@@ -772,7 +848,7 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
if (RNA_property_array_check(ptr, prop)) {
return pyrna_py_from_array(ptr, prop);
}
-
+
/* see if we can coorce into a python type - PropertyType */
switch (type) {
case PROP_BOOLEAN:
@@ -787,7 +863,7 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
case PROP_STRING:
{
int subtype= RNA_property_subtype(prop);
- char *buf;
+ const char *buf;
buf = RNA_property_string_get_alloc(ptr, prop, NULL, -1);
#ifdef USE_STRING_COERCE
/* only file paths get special treatment, they may contain non utf-8 chars */
@@ -797,10 +873,10 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
else {
ret= PyUnicode_FromString(buf);
}
-#else
+#else // USE_STRING_COERCE
ret= PyUnicode_FromString(buf);
-#endif
- MEM_freeN(buf);
+#endif // USE_STRING_COERCE
+ MEM_freeN((void *)buf);
break;
}
case PROP_ENUM:
@@ -828,7 +904,7 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
ret = NULL;
break;
}
-
+
return ret;
}
@@ -849,7 +925,7 @@ int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const cha
if (strcmp(arg_name, "rna_type")==0) continue;
if (kw==NULL) {
- PyErr_Format( PyExc_TypeError, "%.200s: no keywords, expected \"%.200s\"", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
+ PyErr_Format(PyExc_TypeError, "%.200s: no keywords, expected \"%.200s\"", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
error_val= -1;
break;
}
@@ -858,12 +934,12 @@ int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const cha
if (item == NULL) {
if(all_args) {
- PyErr_Format( PyExc_TypeError, "%.200s: keyword \"%.200s\" missing", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
+ PyErr_Format(PyExc_TypeError, "%.200s: keyword \"%.200s\" missing", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
error_val = -1; /* pyrna_py_to_prop sets the error */
break;
}
} else {
- if (pyrna_py_to_prop(ptr, prop, NULL, NULL, item, error_prefix)) {
+ if (pyrna_py_to_prop(ptr, prop, NULL, item, error_prefix)) {
error_val= -1;
break;
}
@@ -882,7 +958,7 @@ int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const cha
arg_name= NULL;
}
- PyErr_Format( PyExc_TypeError, "%.200s: keyword \"%.200s\" unrecognized", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
+ PyErr_Format(PyExc_TypeError, "%.200s: keyword \"%.200s\" unrecognized", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
error_val = -1;
}
@@ -896,32 +972,32 @@ static PyObject *pyrna_func_to_py(BPy_DummyPointerRNA *pyrna, FunctionRNA *func)
static PyMethodDef func_meth = {"<generic rna function>", (PyCFunction)pyrna_func_call, METH_VARARGS|METH_KEYWORDS, "python rna function"};
PyObject *self;
PyObject *ret;
-
+
if(func==NULL) {
- PyErr_Format( PyExc_RuntimeError, "%.200s: type attempted to get NULL function", RNA_struct_identifier(pyrna->ptr.type));
+ PyErr_Format(PyExc_RuntimeError, "%.200s: type attempted to get NULL function", RNA_struct_identifier(pyrna->ptr.type));
return NULL;
}
self= PyTuple_New(2);
-
+
PyTuple_SET_ITEM(self, 0, (PyObject *)pyrna);
Py_INCREF(pyrna);
PyTuple_SET_ITEM(self, 1, PyCapsule_New((void *)func, NULL, NULL));
-
+
ret= PyCFunction_New(&func_meth, self);
Py_DECREF(self);
-
+
return ret;
}
-static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, void *data, PyObject *value, const char *error_prefix)
+static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *value, const char *error_prefix)
{
/* XXX hard limits should be checked here */
int type = RNA_property_type(prop);
-
+
if (RNA_property_array_check(ptr, prop)) {
@@ -934,13 +1010,13 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
if(!BaseMath_ReadCallback(mat))
return -1;
} else /* continue... */
-#endif
+#endif // USE_MATHUTILS
if (!PySequence_Check(value)) {
- PyErr_Format(PyExc_TypeError, "%.200s RNA array assignment to %.200s.%.200s expected a sequence instead of %.200s instance.", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
+ PyErr_Format(PyExc_TypeError, "%.200s RNA array assignment to %.200s.%.200s expected a sequence instead of %.200s instance", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
return -1;
}
/* done getting the length */
- ok= pyrna_py_to_array(ptr, prop, parms, data, value, error_prefix);
+ ok= pyrna_py_to_array(ptr, prop, data, value, error_prefix);
if (!ok) {
/* PyErr_Format(PyExc_AttributeError, "%.200s %s", error_prefix, error_str); */
@@ -949,7 +1025,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
}
else {
/* Normal Property (not an array) */
-
+
/* see if we can coorce into a python type - PropertyType */
switch (type) {
case PROP_BOOLEAN:
@@ -961,9 +1037,9 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
if(RNA_property_flag(prop) & PROP_OUTPUT)
param = PyObject_IsTrue( value );
else
- param = PyLong_AsSsize_t( value );
-
- if( param < 0 || param > 1) {
+ param = PyLong_AsLong( value );
+
+ if(param < 0) {
PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected True/False or 0/1", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop));
return -1;
} else {
@@ -974,14 +1050,20 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
}
case PROP_INT:
{
- int param = PyLong_AsSsize_t(value);
- if (param==-1 && PyErr_Occurred()) {
+ int overflow;
+ long param= PyLong_AsLongAndOverflow(value, &overflow);
+ if(overflow || (param > INT_MAX) || (param < INT_MIN)) {
+ PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s value not in 'int' range (" STRINGIFY(INT_MIN) ", " STRINGIFY(INT_MAX) ")", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop));
+ return -1;
+ }
+ else if (param==-1 && PyErr_Occurred()) {
PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected an int type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop));
return -1;
} else {
- RNA_property_int_clamp(ptr, prop, &param);
- if(data) *((int*)data)= param;
- else RNA_property_int_set(ptr, prop, param);
+ int param_i= (int)param;
+ RNA_property_int_clamp(ptr, prop, &param_i);
+ if(data) *((int*)data)= param_i;
+ else RNA_property_int_set(ptr, prop, param_i);
}
break;
}
@@ -1005,14 +1087,15 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
PyObject *value_coerce= NULL;
int subtype= RNA_property_subtype(prop);
if(ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME)) {
- param= PuC_UnicodeAsByte(value, &value_coerce);
+ /* TODO, get size */
+ param= PyC_UnicodeAsByte(value, &value_coerce);
}
else {
param= _PyUnicode_AsString(value);
}
-#else
- param= _PyUnicode_AsString(value);
-#endif
+#else // USE_STRING_COERCE
+ param= _PyUnicode_AsStringSize(value);
+#endif // USE_STRING_COERCE
if (param==NULL) {
PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a string type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop));
@@ -1024,7 +1107,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
}
#ifdef USE_STRING_COERCE
Py_XDECREF(value_coerce);
-#endif
+#endif // USE_STRING_COERCE
break;
}
case PROP_ENUM:
@@ -1047,21 +1130,21 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
}
}
else {
- char *enum_str= pyrna_enum_as_string(ptr, prop);
+ const char *enum_str= pyrna_enum_as_string(ptr, prop);
PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a string enum or a set of strings in (%.2000s)", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), enum_str);
- MEM_freeN(enum_str);
+ MEM_freeN((void *)enum_str);
return -1;
}
if(data) *((int*)data)= val;
else RNA_property_enum_set(ptr, prop, val);
-
+
break;
}
case PROP_POINTER:
{
PyObject *value_new= NULL;
-
+
StructRNA *ptype= RNA_property_pointer_type(ptr, prop);
int flag = RNA_property_flag(prop);
@@ -1069,10 +1152,10 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
* layout.prop(self, "filepath")
* ... which infact should be
* layout.prop(self.properties, "filepath")
- *
+ *
* we need to do this trick.
* if the prop is not an operator type and the pyobject is an operator, use its properties in place of its self.
- *
+ *
* this is so bad that its almost a good reason to do away with fake 'self.properties -> self' class mixing
* if this causes problems in the future it should be removed.
*/
@@ -1138,8 +1221,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
else {
/* data==NULL, assign to RNA */
if(value == Py_None) {
- PointerRNA valueptr;
- memset(&valueptr, 0, sizeof(valueptr));
+ PointerRNA valueptr= {{0}};
RNA_property_pointer_set(ptr, prop, valueptr);
}
else if(RNA_struct_is_a(param->ptr.type, ptype)) {
@@ -1152,7 +1234,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
Py_XDECREF(value_new); return -1;
}
}
-
+
if(raise_error) {
PointerRNA tmp;
RNA_pointer_create(NULL, ptype, NULL, &tmp);
@@ -1160,7 +1242,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
Py_XDECREF(value_new); return -1;
}
}
-
+
Py_XDECREF(value_new);
break;
@@ -1174,14 +1256,14 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
CollectionPointerLink *link;
lb= (data)? (ListBase*)data: NULL;
-
+
/* convert a sequence of dict's into a collection */
if(!PySequence_Check(value)) {
PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a sequence for an RNA collection, found a '%.200s' instead", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
return -1;
}
- seq_len = PySequence_Length(value);
+ seq_len = PySequence_Size(value);
for(i=0; i<seq_len; i++) {
item= PySequence_GetItem(value, i);
@@ -1207,7 +1289,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
if(pyrna_pydict_to_props(&itemptr, item, 1, "Converting a python list to an RNA collection")==-1) {
PyObject *msg= PyC_ExceptionBuffer();
- char *msg_char= _PyUnicode_AsString(msg);
+ const char *msg_char= _PyUnicode_AsString(msg);
PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s error converting a member of a collection from a dicts into an RNA collection, failed with: %s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), msg_char);
@@ -1217,7 +1299,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
}
Py_DECREF(item);
}
-
+
break;
}
default:
@@ -1228,7 +1310,9 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
}
/* Run rna property functions */
- RNA_property_update(BPy_GetContext(), ptr, prop);
+ if(RNA_property_update_check(prop)) {
+ RNA_property_update(BPy_GetContext(), ptr, prop);
+ }
return 0;
}
@@ -1241,12 +1325,10 @@ static PyObject * pyrna_prop_array_to_py_index(BPy_PropertyArrayRNA *self, int i
static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, PyObject *value)
{
int ret = 0;
- int totdim;
PointerRNA *ptr= &self->ptr;
PropertyRNA *prop= self->prop;
- int type = RNA_property_type(prop);
- totdim= RNA_property_array_dimension(ptr, prop, NULL);
+ const int totdim= RNA_property_array_dimension(ptr, prop, NULL);
if (totdim > 1) {
/* char error_str[512]; */
@@ -1257,11 +1339,11 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
}
else {
/* see if we can coorce into a python type - PropertyType */
- switch (type) {
+ switch (RNA_property_type(prop)) {
case PROP_BOOLEAN:
{
- int param = PyLong_AsSsize_t( value );
-
+ int param = PyLong_AsLong( value );
+
if( param < 0 || param > 1) {
PyErr_SetString(PyExc_TypeError, "expected True/False or 0/1");
ret = -1;
@@ -1272,7 +1354,7 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
}
case PROP_INT:
{
- int param = PyLong_AsSsize_t(value);
+ int param = PyLong_AsLong(value);
if (param==-1 && PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError, "expected an int type");
ret = -1;
@@ -1302,8 +1384,10 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
}
/* Run rna property functions */
- RNA_property_update(BPy_GetContext(), ptr, prop);
-
+ if(RNA_property_update_check(prop)) {
+ RNA_property_update(BPy_GetContext(), ptr, prop);
+ }
+
return ret;
}
@@ -1344,20 +1428,34 @@ static int pyrna_prop_collection_bool( BPy_PropertyRNA *self )
static PyObject *pyrna_prop_collection_subscript_int(BPy_PropertyRNA *self, Py_ssize_t keynum)
{
PointerRNA newptr;
- int len= RNA_property_collection_length(&self->ptr, self->prop);
+ Py_ssize_t keynum_abs= keynum;
- if(keynum < 0) keynum += len;
+ /* notice getting the length of the collection is avoided unless negative index is used
+ * or to detect internal error with a valid index.
+ * This is done for faster lookups. */
+ if(keynum < 0) {
+ keynum_abs += RNA_property_collection_length(&self->ptr, self->prop);
+
+ if(keynum_abs < 0) {
+ PyErr_Format(PyExc_IndexError, "bpy_prop_collection[%d]: out of range.", keynum);
+ return NULL;
+ }
+ }
- if(keynum >= 0 && keynum < len) {
- if(RNA_property_collection_lookup_int(&self->ptr, self->prop, keynum, &newptr)) {
- return pyrna_struct_CreatePyObject(&newptr);
+ if(RNA_property_collection_lookup_int(&self->ptr, self->prop, keynum_abs, &newptr)) {
+ return pyrna_struct_CreatePyObject(&newptr);
+ }
+ else {
+ const int len= RNA_property_collection_length(&self->ptr, self->prop);
+ if(keynum_abs >= len) {
+ PyErr_Format(PyExc_IndexError, "bpy_prop_collection[index]: index %d out of range, size %d", keynum, len);
}
- else { /* fail's if ptr.data == NULL, valid for mesh.materials */
- Py_RETURN_NONE;
+ else {
+ PyErr_Format(PyExc_RuntimeError, "bpy_prop_collection[index]: internal error, valid index %d given in %d sized collection but value not found", keynum_abs, len);
}
+
+ return NULL;
}
- PyErr_Format(PyExc_IndexError, "bpy_prop_collection[index]: index %d out of range, size %d", keynum, len);
- return NULL;
}
static PyObject *pyrna_prop_array_subscript_int(BPy_PropertyArrayRNA *self, int keynum)
@@ -1384,26 +1482,37 @@ static PyObject *pyrna_prop_collection_subscript_str(BPy_PropertyRNA *self, cons
}
/* static PyObject *pyrna_prop_array_subscript_str(BPy_PropertyRNA *self, char *keyname) */
-static PyObject *pyrna_prop_collection_subscript_slice(PointerRNA *ptr, PropertyRNA *prop, int start, int stop, int length)
+static PyObject *pyrna_prop_collection_subscript_slice(BPy_PropertyRNA *self, Py_ssize_t start, Py_ssize_t stop)
{
- PointerRNA newptr;
- PyObject *list = PyList_New(stop - start);
- int count;
+ int count= 0;
- start = MIN2(start,stop); /* values are clamped from */
+ PyObject *list= PyList_New(0);
+ PyObject *item;
- for(count = start; count < stop; count++) {
- if(RNA_property_collection_lookup_int(ptr, prop, count - start, &newptr)) {
- PyList_SET_ITEM(list, count - start, pyrna_struct_CreatePyObject(&newptr));
+ /* first loop up-until the start */
+ CollectionPropertyIterator rna_macro_iter;
+ for(RNA_property_collection_begin(&self->ptr, self->prop, &rna_macro_iter); rna_macro_iter.valid; RNA_property_collection_next(&rna_macro_iter)) {
+ /* PointerRNA itemptr= rna_macro_iter.ptr; */
+ if(count == start) {
+ break;
}
- else {
- Py_DECREF(list);
+ count++;
+ }
- PyErr_SetString(PyExc_RuntimeError, "error getting an rna struct from a collection");
- return NULL;
+ /* add items until stop */
+ for(; rna_macro_iter.valid; RNA_property_collection_next(&rna_macro_iter)) {
+ item= pyrna_struct_CreatePyObject(&rna_macro_iter.ptr);
+ PyList_Append(list, item);
+ Py_DECREF(item);
+
+ count++;
+ if(count == stop) {
+ break;
}
}
+ RNA_property_collection_end(&rna_macro_iter);
+
return list;
}
@@ -1411,17 +1520,17 @@ static PyObject *pyrna_prop_collection_subscript_slice(PointerRNA *ptr, Property
* note: could also use pyrna_prop_array_to_py_index(self, count) in a loop but its a lot slower
* since at the moment it reads (and even allocates) the entire array for each index.
*/
-static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, int start, int stop, int length)
+static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, Py_ssize_t start, Py_ssize_t stop, Py_ssize_t length)
{
int count, totdim;
- PyObject *list = PyList_New(stop - start);
+ PyObject *tuple= PyTuple_New(stop - start);
totdim = RNA_property_array_dimension(ptr, prop, NULL);
if (totdim > 1) {
for (count = start; count < stop; count++)
- PyList_SET_ITEM(list, count - start, pyrna_prop_array_to_py_index(self, count));
+ PyTuple_SET_ITEM(tuple, count - start, pyrna_prop_array_to_py_index(self, count));
}
else {
switch (RNA_property_type(prop)) {
@@ -1432,9 +1541,9 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
if(length > PYRNA_STACK_ARRAY) { values= PyMem_MALLOC(sizeof(float) * length); }
else { values= values_stack; }
RNA_property_float_get_array(ptr, prop, values);
-
+
for(count=start; count<stop; count++)
- PyList_SET_ITEM(list, count-start, PyFloat_FromDouble(values[count]));
+ PyTuple_SET_ITEM(tuple, count-start, PyFloat_FromDouble(values[count]));
if(values != values_stack) {
PyMem_FREE(values);
@@ -1450,7 +1559,7 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
RNA_property_boolean_get_array(ptr, prop, values);
for(count=start; count<stop; count++)
- PyList_SET_ITEM(list, count-start, PyBool_FromLong(values[count]));
+ PyTuple_SET_ITEM(tuple, count-start, PyBool_FromLong(values[count]));
if(values != values_stack) {
PyMem_FREE(values);
@@ -1466,7 +1575,7 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
RNA_property_int_get_array(ptr, prop, values);
for(count=start; count<stop; count++)
- PyList_SET_ITEM(list, count-start, PyLong_FromSsize_t(values[count]));
+ PyTuple_SET_ITEM(tuple, count-start, PyLong_FromSsize_t(values[count]));
if(values != values_stack) {
PyMem_FREE(values);
@@ -1474,13 +1583,14 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
break;
}
default:
- /* probably will never happen */
+ BLI_assert(!"Invalid array type");
+
PyErr_SetString(PyExc_TypeError, "not an array type");
- Py_DECREF(list);
- list= NULL;
+ Py_DECREF(tuple);
+ tuple= NULL;
}
}
- return list;
+ return tuple;
}
static PyObject *pyrna_prop_collection_subscript(BPy_PropertyRNA *self, PyObject *key)
@@ -1496,25 +1606,43 @@ static PyObject *pyrna_prop_collection_subscript(BPy_PropertyRNA *self, PyObject
return pyrna_prop_collection_subscript_int(self, i);
}
else if (PySlice_Check(key)) {
- int len= RNA_property_collection_length(&self->ptr, self->prop);
- Py_ssize_t start, stop, step, slicelength;
+ PySliceObject *key_slice= (PySliceObject *)key;
+ Py_ssize_t step= 1;
- if (PySlice_GetIndicesEx((PySliceObject*)key, len, &start, &stop, &step, &slicelength) < 0)
+ if(key_slice->step != Py_None && !_PyEval_SliceIndex(key, &step)) {
return NULL;
-
- if (slicelength <= 0) {
- return PyList_New(0);
}
- else if (step == 1) {
- return pyrna_prop_collection_subscript_slice(&self->ptr, self->prop, start, stop, len);
+ else if (step != 1) {
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_collection[slice]: slice steps not supported");
+ return NULL;
+ }
+ else if(key_slice->start == Py_None && key_slice->stop == Py_None) {
+ return pyrna_prop_collection_subscript_slice(self, 0, PY_SSIZE_T_MAX);
}
else {
- PyErr_SetString(PyExc_TypeError, "bpy_prop_collection[slice]: slice steps not supported with rna");
- return NULL;
+ Py_ssize_t start= 0, stop= PY_SSIZE_T_MAX;
+
+ /* avoid PySlice_GetIndicesEx because it needs to know the length ahead of time. */
+ if(key_slice->start != Py_None && !_PyEval_SliceIndex(key_slice->start, &start)) return NULL;
+ if(key_slice->stop != Py_None && !_PyEval_SliceIndex(key_slice->stop, &stop)) return NULL;
+
+ if(start < 0 || stop < 0) {
+ /* only get the length for negative values */
+ Py_ssize_t len= (Py_ssize_t)RNA_property_collection_length(&self->ptr, self->prop);
+ if(start < 0) start += len;
+ if(stop < 0) start += len;
+ }
+
+ if (stop - start <= 0) {
+ return PyList_New(0);
+ }
+ else {
+ return pyrna_prop_collection_subscript_slice(self, start, stop);
+ }
}
}
else {
- PyErr_Format(PyExc_TypeError, "bpy_prop_collection[key]: invalid key, must be a string or an int instead of %.200s instance.", Py_TYPE(key)->tp_name);
+ PyErr_Format(PyExc_TypeError, "bpy_prop_collection[key]: invalid key, must be a string or an int instead of %.200s instance", Py_TYPE(key)->tp_name);
return NULL;
}
}
@@ -1528,24 +1656,37 @@ static PyObject *pyrna_prop_array_subscript(BPy_PropertyArrayRNA *self, PyObject
Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
if (i == -1 && PyErr_Occurred())
return NULL;
- return pyrna_prop_array_subscript_int(self, PyLong_AsSsize_t(key));
+ return pyrna_prop_array_subscript_int(self, PyLong_AsLong(key));
}
else if (PySlice_Check(key)) {
- Py_ssize_t start, stop, step, slicelength;
- int len = pyrna_prop_array_length(self);
+ Py_ssize_t step= 1;
+ PySliceObject *key_slice= (PySliceObject *)key;
- if (PySlice_GetIndicesEx((PySliceObject*)key, len, &start, &stop, &step, &slicelength) < 0)
+ if(key_slice->step != Py_None && !_PyEval_SliceIndex(key, &step)) {
return NULL;
-
- if (slicelength <= 0) {
- return PyList_New(0);
}
- else if (step == 1) {
- return pyrna_prop_array_subscript_slice(self, &self->ptr, self->prop, start, stop, len);
+ else if (step != 1) {
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_array[slice]: slice steps not supported");
+ return NULL;
+ }
+ else if(key_slice->start == Py_None && key_slice->stop == Py_None) {
+ /* note, no significant advantage with optimizing [:] slice as with collections but include here for consistency with collection slice func */
+ Py_ssize_t len= (Py_ssize_t)pyrna_prop_array_length(self);
+ return pyrna_prop_array_subscript_slice(self, &self->ptr, self->prop, 0, len, len);
}
else {
- PyErr_SetString(PyExc_TypeError, "bpy_prop_array[slice]: slice steps not supported with rna");
- return NULL;
+ int len= pyrna_prop_array_length(self);
+ Py_ssize_t start, stop, slicelength;
+
+ if (PySlice_GetIndicesEx((void *)key, len, &start, &stop, &step, &slicelength) < 0)
+ return NULL;
+
+ if (slicelength <= 0) {
+ return PyTuple_New(0);
+ }
+ else {
+ return pyrna_prop_array_subscript_slice(self, &self->ptr, self->prop, start, stop, len);
+ }
}
}
else {
@@ -1563,7 +1704,7 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
int ret= 0;
if(value_orig == NULL) {
- PyErr_SetString(PyExc_TypeError, "bpy_prop_array[slice] = value: deleting with list types is not supported by bpy_struct.");
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_array[slice] = value: deleting with list types is not supported by bpy_struct");
return -1;
}
@@ -1573,7 +1714,7 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
if(PySequence_Fast_GET_SIZE(value) != stop-start) {
Py_DECREF(value);
- PyErr_SetString(PyExc_TypeError, "bpy_prop_array[slice] = value: resizing bpy_struct arrays isn't supported.");
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_array[slice] = value: resizing bpy_struct arrays isn't supported");
return -1;
}
@@ -1590,7 +1731,7 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
else { values= values_stack; }
if(start != 0 || stop != length) /* partial assignment? - need to get the array */
RNA_property_float_get_array(ptr, prop, values);
-
+
for(count=start; count<stop; count++) {
fval = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, count-start));
CLAMP(fval, min, max);
@@ -1610,9 +1751,9 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
if(start != 0 || stop != length) /* partial assignment? - need to get the array */
RNA_property_boolean_get_array(ptr, prop, values);
-
+
for(count=start; count<stop; count++)
- values[count] = PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, count-start));
+ values[count] = PyLong_AsLong(PySequence_Fast_GET_ITEM(value, count-start));
if(PyErr_Occurred()) ret= -1;
else RNA_property_boolean_set_array(ptr, prop, values);
@@ -1633,7 +1774,7 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
RNA_property_int_get_array(ptr, prop, values);
for(count=start; count<stop; count++) {
- ival = PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, count-start));
+ ival = PyLong_AsLong(PySequence_Fast_GET_ITEM(value, count-start));
CLAMP(ival, min, max);
values[count] = ival;
}
@@ -1648,11 +1789,11 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
}
Py_DECREF(value);
-
+
if(values_alloc) {
PyMem_FREE(values_alloc);
}
-
+
return ret;
}
@@ -1693,7 +1834,7 @@ static int pyrna_prop_array_ass_subscript( BPy_PropertyArrayRNA *self, PyObject
int len= RNA_property_array_length(&self->ptr, self->prop);
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)key, len, &start, &stop, &step, &slicelength) < 0) {
+ if (PySlice_GetIndicesEx((void *)key, len, &start, &stop, &step, &slicelength) < 0) {
ret= -1;
}
else if (slicelength <= 0) {
@@ -1713,7 +1854,9 @@ static int pyrna_prop_array_ass_subscript( BPy_PropertyArrayRNA *self, PyObject
}
if(ret != -1) {
- RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+ if(RNA_property_update_check(self->prop)) {
+ RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+ }
}
return ret;
@@ -1768,7 +1911,7 @@ static int pyrna_prop_collection_contains(BPy_PropertyRNA *self, PyObject *value
PointerRNA newptr; /* not used, just so RNA_property_collection_lookup_string runs */
/* key in dict style check */
- char *keyname = _PyUnicode_AsString(value);
+ const char *keyname = _PyUnicode_AsString(value);
if(keyname==NULL) {
PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.__contains__: expected a string");
@@ -1784,23 +1927,23 @@ static int pyrna_prop_collection_contains(BPy_PropertyRNA *self, PyObject *value
static int pyrna_struct_contains(BPy_StructRNA *self, PyObject *value)
{
IDProperty *group;
- char *name = _PyUnicode_AsString(value);
+ const char *name = _PyUnicode_AsString(value);
if (!name) {
- PyErr_SetString( PyExc_TypeError, "bpy_struct.__contains__: expected a string");
+ PyErr_SetString(PyExc_TypeError, "bpy_struct.__contains__: expected a string");
return -1;
}
if(RNA_struct_idprops_check(self->ptr.type)==0) {
- PyErr_SetString( PyExc_TypeError, "bpy_struct: this type doesnt support IDProperties");
+ PyErr_SetString(PyExc_TypeError, "bpy_struct: this type doesnt support IDProperties");
return -1;
}
group= RNA_struct_idprops(&self->ptr, 0);
-
+
if(!group)
return 0;
-
+
return IDP_GetPropertyFromGroup(group, name) ? 1:0;
}
@@ -1847,29 +1990,29 @@ static PyObject *pyrna_struct_subscript( BPy_StructRNA *self, PyObject *key )
{
/* mostly copied from BPy_IDGroup_Map_GetItem */
IDProperty *group, *idprop;
- char *name= _PyUnicode_AsString(key);
+ const char *name= _PyUnicode_AsString(key);
if(RNA_struct_idprops_check(self->ptr.type)==0) {
- PyErr_SetString( PyExc_TypeError, "this type doesn't support IDProperties");
+ PyErr_SetString(PyExc_TypeError, "this type doesn't support IDProperties");
return NULL;
}
if(name==NULL) {
- PyErr_SetString( PyExc_TypeError, "bpy_struct[key]: only strings are allowed as keys of ID properties");
+ PyErr_SetString(PyExc_TypeError, "bpy_struct[key]: only strings are allowed as keys of ID properties");
return NULL;
}
group= RNA_struct_idprops(&self->ptr, 0);
if(group==NULL) {
- PyErr_Format( PyExc_KeyError, "bpy_struct[key]: key \"%s\" not found", name);
+ PyErr_Format(PyExc_KeyError, "bpy_struct[key]: key \"%s\" not found", name);
return NULL;
}
idprop= IDP_GetPropertyFromGroup(group, name);
if(idprop==NULL) {
- PyErr_Format( PyExc_KeyError, "bpy_struct[key]: key \"%s\" not found", name);
+ PyErr_Format(PyExc_KeyError, "bpy_struct[key]: key \"%s\" not found", name);
return NULL;
}
@@ -1880,6 +2023,12 @@ static int pyrna_struct_ass_subscript( BPy_StructRNA *self, PyObject *key, PyObj
{
IDProperty *group= RNA_struct_idprops(&self->ptr, 1);
+#ifdef USE_PEDANTIC_WRITE
+ if(rna_disallow_writes && rna_id_write_error(&self->ptr, key)) {
+ return -1;
+ }
+#endif // USE_STRING_COERCE
+
if(group==NULL) {
PyErr_SetString(PyExc_TypeError, "bpy_struct[key] = val: id properties not supported for this type");
return -1;
@@ -1909,7 +2058,7 @@ static PyObject *pyrna_struct_keys(BPy_PropertyRNA *self)
IDProperty *group;
if(RNA_struct_idprops_check(self->ptr.type)==0) {
- PyErr_SetString( PyExc_TypeError, "bpy_struct.keys(): this type doesn't support IDProperties");
+ PyErr_SetString(PyExc_TypeError, "bpy_struct.keys(): this type doesn't support IDProperties");
return NULL;
}
@@ -1936,7 +2085,7 @@ static PyObject *pyrna_struct_items(BPy_PropertyRNA *self)
IDProperty *group;
if(RNA_struct_idprops_check(self->ptr.type)==0) {
- PyErr_SetString( PyExc_TypeError, "bpy_struct.items(): this type doesn't support IDProperties");
+ PyErr_SetString(PyExc_TypeError, "bpy_struct.items(): this type doesn't support IDProperties");
return NULL;
}
@@ -1963,7 +2112,7 @@ static PyObject *pyrna_struct_values(BPy_PropertyRNA *self)
IDProperty *group;
if(RNA_struct_idprops_check(self->ptr.type)==0) {
- PyErr_SetString( PyExc_TypeError, "bpy_struct.values(): this type doesn't support IDProperties");
+ PyErr_SetString(PyExc_TypeError, "bpy_struct.values(): this type doesn't support IDProperties");
return NULL;
}
@@ -1977,17 +2126,17 @@ static PyObject *pyrna_struct_values(BPy_PropertyRNA *self)
/* for keyframes and drivers */
static int pyrna_struct_anim_args_parse(PointerRNA *ptr, const char *error_prefix, const char *path,
- char **path_full, int *index)
+ const char **path_full, int *index)
{
const int is_idbase= RNA_struct_is_ID(ptr->type);
PropertyRNA *prop;
PointerRNA r_ptr;
-
+
if (ptr->data==NULL) {
PyErr_Format(PyExc_TypeError, "%.200s this struct has no data, can't be animated", error_prefix);
return -1;
}
-
+
/* full paths can only be given from ID base */
if(is_idbase) {
int r_index= -1;
@@ -2003,13 +2152,13 @@ static int pyrna_struct_anim_args_parse(PointerRNA *ptr, const char *error_prefi
return -1;
}
}
- else {
+ else {
prop = RNA_struct_find_property(ptr, path);
r_ptr= *ptr;
- }
+ }
if (prop==NULL) {
- PyErr_Format( PyExc_TypeError, "%.200s property \"%s\" not found", error_prefix, path);
+ PyErr_Format(PyExc_TypeError, "%.200s property \"%s\" not found", error_prefix, path);
return -1;
}
@@ -2030,19 +2179,19 @@ static int pyrna_struct_anim_args_parse(PointerRNA *ptr, const char *error_prefi
else {
int array_len= RNA_property_array_length(&r_ptr, prop);
if((*index) < -1 || (*index) >= array_len) {
- PyErr_Format( PyExc_TypeError, "%.200s index out of range \"%s\", given %d, array length is %d", error_prefix, path, *index, array_len);
+ PyErr_Format(PyExc_TypeError, "%.200s index out of range \"%s\", given %d, array length is %d", error_prefix, path, *index, array_len);
return -1;
}
}
-
+
if(is_idbase) {
*path_full= BLI_strdup(path);
}
else {
*path_full= RNA_path_from_ID_to_property(&r_ptr, prop);
-
+
if (*path_full==NULL) {
- PyErr_Format( PyExc_TypeError, "%.200s could not make path to \"%s\"", error_prefix, path);
+ PyErr_Format(PyExc_TypeError, "%.200s could not make path to \"%s\"", error_prefix, path);
return -1;
}
}
@@ -2052,18 +2201,18 @@ static int pyrna_struct_anim_args_parse(PointerRNA *ptr, const char *error_prefi
/* internal use for insert and delete */
static int pyrna_struct_keyframe_parse(PointerRNA *ptr, PyObject *args, PyObject *kw, const char *parse_str, const char *error_prefix,
- char **path_full, int *index, float *cfra, char **group_name) /* return values */
+ const char **path_full, int *index, float *cfra, const char **group_name) /* return values */
{
- static char *kwlist[] = {"data_path", "index", "frame", "group", NULL};
- char *path;
+ static const char *kwlist[] = {"data_path", "index", "frame", "group", NULL};
+ const char *path;
/* note, parse_str MUST start with 's|ifs' */
if (!PyArg_ParseTupleAndKeywords(args, kw, parse_str, (char **)kwlist, &path, index, cfra, group_name))
return -1;
- if(pyrna_struct_anim_args_parse(ptr, error_prefix, path, path_full, index) < 0)
+ if(pyrna_struct_anim_args_parse(ptr, error_prefix, path, path_full, index) < 0)
return -1;
-
+
if(*cfra==FLT_MAX)
*cfra= CTX_data_scene(BPy_GetContext())->r.cfra;
@@ -2077,7 +2226,7 @@ static char pyrna_struct_keyframe_insert_doc[] =
"\n"
" :arg data_path: path to the property to key, analogous to the fcurve's data path.\n"
" :type data_path: string\n"
-" :arg index: array index of the property to key. Defaults to -1 which will key all indicies or a single channel if the property is not an array.\n"
+" :arg index: array index of the property to key. Defaults to -1 which will key all indices or a single channel if the property is not an array.\n"
" :type index: int\n"
" :arg frame: The frame on which the keyframe is inserted, defaulting to the current frame.\n"
" :type frame: float\n"
@@ -2088,20 +2237,29 @@ static char pyrna_struct_keyframe_insert_doc[] =
static PyObject *pyrna_struct_keyframe_insert(BPy_StructRNA *self, PyObject *args, PyObject *kw)
{
- PyObject *result;
/* args, pyrna_struct_keyframe_parse handles these */
- char *path_full= NULL;
+ const char *path_full= NULL;
int index= -1;
float cfra= FLT_MAX;
- char *group_name= NULL;
+ const char *group_name= NULL;
- if(pyrna_struct_keyframe_parse(&self->ptr, args, kw, "s|ifs:bpy_struct.keyframe_insert()", "bpy_struct.keyframe_insert()", &path_full, &index, &cfra, &group_name) == -1)
+ if(pyrna_struct_keyframe_parse(&self->ptr, args, kw, "s|ifs:bpy_struct.keyframe_insert()", "bpy_struct.keyframe_insert()", &path_full, &index, &cfra, &group_name) == -1) {
return NULL;
+ }
+ else {
+ short result;
+ ReportList reports;
- result= PyBool_FromLong(insert_keyframe((ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0));
- MEM_freeN(path_full);
+ BKE_reports_init(&reports, RPT_STORE);
- return result;
+ result= insert_keyframe(&reports, (ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0);
+ MEM_freeN((void *)path_full);
+
+ if(BPy_reports_to_error(&reports, TRUE))
+ return NULL;
+
+ return PyBool_FromLong(result);
+ }
}
static char pyrna_struct_keyframe_delete_doc[] =
@@ -2111,7 +2269,7 @@ static char pyrna_struct_keyframe_delete_doc[] =
"\n"
" :arg data_path: path to the property to remove a key, analogous to the fcurve's data path.\n"
" :type data_path: string\n"
-" :arg index: array index of the property to remove a key. Defaults to -1 removing all indicies or a single channel if the property is not an array.\n"
+" :arg index: array index of the property to remove a key. Defaults to -1 removing all indices or a single channel if the property is not an array.\n"
" :type index: int\n"
" :arg frame: The frame on which the keyframe is deleted, defaulting to the current frame.\n"
" :type frame: float\n"
@@ -2122,20 +2280,30 @@ static char pyrna_struct_keyframe_delete_doc[] =
static PyObject *pyrna_struct_keyframe_delete(BPy_StructRNA *self, PyObject *args, PyObject *kw)
{
- PyObject *result;
/* args, pyrna_struct_keyframe_parse handles these */
- char *path_full= NULL;
+ const char *path_full= NULL;
int index= -1;
float cfra= FLT_MAX;
- char *group_name= NULL;
+ const char *group_name= NULL;
- if(pyrna_struct_keyframe_parse(&self->ptr, args, kw, "s|ifs:bpy_struct.keyframe_delete()", "bpy_struct.keyframe_insert()", &path_full, &index, &cfra, &group_name) == -1)
+ if(pyrna_struct_keyframe_parse(&self->ptr, args, kw, "s|ifs:bpy_struct.keyframe_delete()", "bpy_struct.keyframe_insert()", &path_full, &index, &cfra, &group_name) == -1) {
return NULL;
+ }
+ else {
+ short result;
+ ReportList reports;
- result= PyBool_FromLong(delete_keyframe((ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0));
- MEM_freeN(path_full);
+ BKE_reports_init(&reports, RPT_STORE);
+
+ result= delete_keyframe(&reports, (ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0);
+ MEM_freeN((void *)path_full);
+
+ if(BPy_reports_to_error(&reports, TRUE))
+ return NULL;
+
+ return PyBool_FromLong(result);
+ }
- return result;
}
static char pyrna_struct_driver_add_doc[] =
@@ -2145,55 +2313,68 @@ static char pyrna_struct_driver_add_doc[] =
"\n"
" :arg path: path to the property to drive, analogous to the fcurve's data path.\n"
" :type path: string\n"
-" :arg index: array index of the property drive. Defaults to -1 for all indicies or a single channel if the property is not an array.\n"
+" :arg index: array index of the property drive. Defaults to -1 for all indices or a single channel if the property is not an array.\n"
" :type index: int\n"
" :return: The driver(s) added.\n"
" :rtype: :class:`FCurve` or list if index is -1 with an array property.";
static PyObject *pyrna_struct_driver_add(BPy_StructRNA *self, PyObject *args)
{
- char *path, *path_full;
+ const char *path, *path_full;
int index= -1;
- PyObject *ret;
if (!PyArg_ParseTuple(args, "s|i:driver_add", &path, &index))
return NULL;
- if(pyrna_struct_anim_args_parse(&self->ptr, "bpy_struct.driver_add():", path, &path_full, &index) < 0)
+ if(pyrna_struct_anim_args_parse(&self->ptr, "bpy_struct.driver_add():", path, &path_full, &index) < 0) {
return NULL;
+ }
+ else {
+ PyObject *ret= NULL;
+ ReportList reports;
+ int result;
- if(ANIM_add_driver((ID *)self->ptr.id.data, path_full, index, 0, DRIVER_TYPE_PYTHON)) {
- ID *id= self->ptr.id.data;
- AnimData *adt= BKE_animdata_from_id(id);
- FCurve *fcu;
+ BKE_reports_init(&reports, RPT_STORE);
- PointerRNA tptr;
- PyObject *item;
+ result= ANIM_add_driver(&reports, (ID *)self->ptr.id.data, path_full, index, 0, DRIVER_TYPE_PYTHON);
+
+ if(BPy_reports_to_error(&reports, TRUE))
+ return NULL;
+
+ if(result) {
+ ID *id= self->ptr.id.data;
+ AnimData *adt= BKE_animdata_from_id(id);
+ FCurve *fcu;
- if(index == -1) { /* all, use a list */
- int i= 0;
- ret= PyList_New(0);
- while((fcu= list_find_fcurve(&adt->drivers, path_full, i++))) {
+ PointerRNA tptr;
+ PyObject *item;
+
+ if(index == -1) { /* all, use a list */
+ int i= 0;
+ ret= PyList_New(0);
+ while((fcu= list_find_fcurve(&adt->drivers, path_full, i++))) {
+ RNA_pointer_create(id, &RNA_FCurve, fcu, &tptr);
+ item= pyrna_struct_CreatePyObject(&tptr);
+ PyList_Append(ret, item);
+ Py_DECREF(item);
+ }
+ }
+ else {
+ fcu= list_find_fcurve(&adt->drivers, path_full, index);
RNA_pointer_create(id, &RNA_FCurve, fcu, &tptr);
- item= pyrna_struct_CreatePyObject(&tptr);
- PyList_Append(ret, item);
- Py_DECREF(item);
+ ret= pyrna_struct_CreatePyObject(&tptr);
}
}
else {
- fcu= list_find_fcurve(&adt->drivers, path_full, index);
- RNA_pointer_create(id, &RNA_FCurve, fcu, &tptr);
- ret= pyrna_struct_CreatePyObject(&tptr);
+ /* XXX, should be handled by reports, */
+ PyErr_SetString(PyExc_TypeError, "bpy_struct.driver_add(): failed because of an internal error");
+ return NULL;
}
- }
- else {
- PyErr_SetString(PyExc_TypeError, "bpy_struct.driver_add(): failed because of an internal error");
- return NULL;
- }
- MEM_freeN(path_full);
+ MEM_freeN((void *)path_full);
- return ret;
+ return ret;
+ }
}
@@ -2204,28 +2385,37 @@ static char pyrna_struct_driver_remove_doc[] =
"\n"
" :arg path: path to the property to drive, analogous to the fcurve's data path.\n"
" :type path: string\n"
-" :arg index: array index of the property drive. Defaults to -1 for all indicies or a single channel if the property is not an array.\n"
+" :arg index: array index of the property drive. Defaults to -1 for all indices or a single channel if the property is not an array.\n"
" :type index: int\n"
" :return: Success of driver removal.\n"
" :rtype: boolean";
static PyObject *pyrna_struct_driver_remove(BPy_StructRNA *self, PyObject *args)
{
- char *path, *path_full;
+ const char *path, *path_full;
int index= -1;
- PyObject *ret;
if (!PyArg_ParseTuple(args, "s|i:driver_remove", &path, &index))
return NULL;
- if(pyrna_struct_anim_args_parse(&self->ptr, "bpy_struct.driver_remove():", path, &path_full, &index) < 0)
+ if(pyrna_struct_anim_args_parse(&self->ptr, "bpy_struct.driver_remove():", path, &path_full, &index) < 0) {
return NULL;
+ }
+ else {
+ short result;
+ ReportList reports;
- ret= PyBool_FromLong(ANIM_remove_driver((ID *)self->ptr.id.data, path_full, index, 0));
+ BKE_reports_init(&reports, RPT_STORE);
- MEM_freeN(path_full);
+ result= ANIM_remove_driver(&reports, (ID *)self->ptr.id.data, path_full, index, 0);
- return ret;
+ MEM_freeN((void *)path_full);
+
+ if(BPy_reports_to_error(&reports, TRUE))
+ return NULL;
+
+ return PyBool_FromLong(result);
+ }
}
@@ -2240,7 +2430,7 @@ static char pyrna_struct_is_property_set_doc[] =
static PyObject *pyrna_struct_is_property_set(BPy_StructRNA *self, PyObject *args)
{
PropertyRNA *prop;
- char *name;
+ const char *name;
int ret;
if (!PyArg_ParseTuple(args, "s:is_property_set", &name))
@@ -2254,7 +2444,7 @@ static PyObject *pyrna_struct_is_property_set(BPy_StructRNA *self, PyObject *arg
/* double property lookup, could speed up */
/* return PyBool_FromLong(RNA_property_is_set(&self->ptr, name)); */
if(RNA_property_flag(prop) & PROP_IDPROPERTY) {
- IDProperty *group= RNA_struct_idprops(&self->ptr, 0);
+ IDProperty *group= RNA_struct_idprops(&self->ptr, 0);
if(group) {
ret= IDP_GetPropertyFromGroup(group, name) ? 1:0;
}
@@ -2265,7 +2455,7 @@ static PyObject *pyrna_struct_is_property_set(BPy_StructRNA *self, PyObject *arg
else {
ret= 1;
}
-
+
return PyBool_FromLong(ret);
}
@@ -2280,7 +2470,7 @@ static char pyrna_struct_is_property_hidden_doc[] =
static PyObject *pyrna_struct_is_property_hidden(BPy_StructRNA *self, PyObject *args)
{
PropertyRNA *prop;
- char *name;
+ const char *name;
if (!PyArg_ParseTuple(args, "s:is_property_hidden", &name))
return NULL;
@@ -2305,7 +2495,7 @@ static char pyrna_struct_path_resolve_doc[] =
static PyObject *pyrna_struct_path_resolve(BPy_StructRNA *self, PyObject *args)
{
- char *path;
+ const char *path;
PyObject *coerce= Py_True;
PointerRNA r_ptr;
PropertyRNA *r_prop;
@@ -2356,8 +2546,8 @@ static char pyrna_struct_path_from_id_doc[] =
static PyObject *pyrna_struct_path_from_id(BPy_StructRNA *self, PyObject *args)
{
- char *name= NULL;
- char *path;
+ const char *name= NULL;
+ const char *path;
PropertyRNA *prop;
PyObject *ret;
@@ -2384,7 +2574,7 @@ static PyObject *pyrna_struct_path_from_id(BPy_StructRNA *self, PyObject *args)
}
ret= PyUnicode_FromString(path);
- MEM_freeN(path);
+ MEM_freeN((void *)path);
return ret;
}
@@ -2399,7 +2589,7 @@ static char pyrna_prop_path_from_id_doc[] =
static PyObject *pyrna_prop_path_from_id(BPy_PropertyRNA *self)
{
- char *path;
+ const char *path;
PropertyRNA *prop = self->prop;
PyObject *ret;
@@ -2411,7 +2601,7 @@ static PyObject *pyrna_prop_path_from_id(BPy_PropertyRNA *self)
}
ret= PyUnicode_FromString(path);
- MEM_freeN(path);
+ MEM_freeN((void *)path);
return ret;
}
@@ -2424,7 +2614,7 @@ static char pyrna_struct_type_recast_doc[] =
" :return: a new instance of this object with the type initialized again.\n"
" :rtype: subclass of :class:`bpy_struct`";
-static PyObject *pyrna_struct_type_recast(BPy_StructRNA *self, PyObject *args)
+static PyObject *pyrna_struct_type_recast(BPy_StructRNA *self)
{
PointerRNA r_ptr;
RNA_pointer_recast(&self->ptr, &r_ptr);
@@ -2528,17 +2718,29 @@ static PyObject *pyrna_struct_dir(BPy_StructRNA *self)
BLI_freelistN(&lb);
}
+
+ {
+ /* set(), this is needed to remove-doubles because the deferred
+ * register-props will be in both the python __dict__ and accessed as RNA */
+
+ PyObject *set= PySet_New(ret);
+
+ Py_DECREF(ret);
+ ret= PySequence_List(set);
+ Py_DECREF(set);
+ }
+
return ret;
}
//---------------getattr--------------------------------------------
static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
{
- char *name = _PyUnicode_AsString(pyname);
+ const char *name = _PyUnicode_AsString(pyname);
PyObject *ret;
PropertyRNA *prop;
FunctionRNA *func;
-
+
if(name == NULL) {
PyErr_SetString(PyExc_AttributeError, "bpy_struct: __getattr__ must be a string");
ret = NULL;
@@ -2563,7 +2765,7 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
else if (self->ptr.type == &RNA_Context) {
bContext *C = self->ptr.data;
if(C==NULL) {
- PyErr_Format( PyExc_AttributeError, "bpy_struct: Context is 'NULL', can't get \"%.200s\" from context", name);
+ PyErr_Format(PyExc_AttributeError, "bpy_struct: Context is 'NULL', can't get \"%.200s\" from context", name);
ret= NULL;
}
else {
@@ -2588,9 +2790,9 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
{
CollectionPointerLink *link;
PyObject *linkptr;
-
+
ret = PyList_New(0);
-
+
for(link=newlb.first; link; link=link->next) {
linkptr= pyrna_struct_CreatePyObject(&link->ptr);
PyList_Append(ret, linkptr);
@@ -2600,6 +2802,8 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
break;
default:
/* should never happen */
+ BLI_assert(!"Invalid context type");
+
PyErr_Format(PyExc_AttributeError, "bpy_struct: Context type invalid %d, can't get \"%.200s\" from context", newtype, name);
ret= NULL;
}
@@ -2618,7 +2822,7 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
}
else {
#if 0
- PyErr_Format( PyExc_AttributeError, "bpy_struct: attribute \"%.200s\" not found", name);
+ PyErr_Format(PyExc_AttributeError, "bpy_struct: attribute \"%.200s\" not found", name);
ret = NULL;
#endif
/* Include this incase this instance is a subtype of a python class
@@ -2630,7 +2834,7 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
/* The error raised here will be displayed */
ret = PyObject_GenericGetAttr((PyObject *)self, pyname);
}
-
+
return ret;
}
@@ -2651,14 +2855,38 @@ static int pyrna_is_deferred_prop(PyObject *value)
return PyTuple_CheckExact(value) && PyTuple_GET_SIZE(value)==2 && PyCallable_Check(PyTuple_GET_ITEM(value, 0)) && PyDict_CheckExact(PyTuple_GET_ITEM(value, 1));
}
-static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *pyname)
+static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr)
{
- return PyType_Type.tp_getattro(cls, pyname);
+ PyObject *ret= PyType_Type.tp_getattro(cls, attr);
+
+ /* Allows:
+ * >>> bpy.types.Scene.foo = BoolProperty()
+ * >>> bpy.types.Scene.foo
+ * <bpy_struct, BooleanProperty("foo")>
+ * ...rather then returning the defered class register tuple as checked by pyrna_is_deferred_prop()
+ *
+ * Disable for now, this is faking internal behavior in a way thats too tricky to maintain well. */
+#if 0
+ if(ret == NULL) { // || pyrna_is_deferred_prop(ret)
+ StructRNA *srna= srna_from_self(cls, "StructRNA.__getattr__");
+ if(srna) {
+ PropertyRNA *prop= RNA_struct_type_find_property(srna, _PyUnicode_AsString(attr));
+ if(prop) {
+ PointerRNA tptr;
+ PyErr_Clear(); /* clear error from tp_getattro */
+ RNA_pointer_create(NULL, &RNA_Property, prop, &tptr);
+ ret= pyrna_struct_CreatePyObject(&tptr);
+ }
+ }
+ }
+#endif
+
+ return ret;
}
static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyObject *value)
{
- StructRNA *srna= srna_from_self(cls, "");
+ StructRNA *srna= srna_from_self(cls, "StructRNA.__setattr__");
if(srna == NULL) {
if(value && pyrna_is_deferred_prop(value)) {
@@ -2667,7 +2895,7 @@ static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyOb
}
/* srna_from_self may set an error */
- PyErr_Clear();
+ PyErr_Clear();
return PyType_Type.tp_setattro(cls, attr, value);
}
@@ -2675,42 +2903,53 @@ static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyOb
/* check if the value is a property */
if(pyrna_is_deferred_prop(value)) {
int ret= deferred_register_prop(srna, attr, value);
- if(ret < 0)
+ if(ret == -1) {
+ /* error set */
return ret;
- /* pass through, when the value isn't assigned it still works but gets confusing from script writers POV */
+ }
+
+ /* pass through and assign to the classes __dict__ as well
+ * when the value isn't assigned it still creates the RNA property
+ * but gets confusing from script writers POV if the assigned value cant be read back. */
}
else {
/* remove existing property if its set or we also end up with confusement */
- char *attr_str= _PyUnicode_AsString(attr);
+ const char *attr_str= _PyUnicode_AsString(attr);
RNA_def_property_free_identifier(srna, attr_str); /* ignore on failier */
}
}
else { /* __delattr__ */
/* first find if this is a registered property */
- char *attr_str= _PyUnicode_AsString(attr);
+ const char *attr_str= _PyUnicode_AsString(attr);
int ret= RNA_def_property_free_identifier(srna, attr_str);
if (ret == -1) {
- PyErr_Format(PyExc_TypeError, "struct_meta_idprop.detattr(): '%s' not a dynamic property.", attr_str);
+ PyErr_Format(PyExc_TypeError, "struct_meta_idprop.detattr(): '%s' not a dynamic property", attr_str);
return -1;
}
}
-
+
/* fallback to standard py, delattr/setattr */
return PyType_Type.tp_setattro(cls, attr, value);
}
-
+
static int pyrna_struct_setattro( BPy_StructRNA *self, PyObject *pyname, PyObject *value )
{
- char *name = _PyUnicode_AsString(pyname);
+ const char *name = _PyUnicode_AsString(pyname);
PropertyRNA *prop= NULL;
+#ifdef USE_PEDANTIC_WRITE
+ if(rna_disallow_writes && rna_id_write_error(&self->ptr, pyname)) {
+ return -1;
+ }
+#endif // USE_STRING_COERCE
+
if(name == NULL) {
PyErr_SetString(PyExc_AttributeError, "bpy_struct: __setattr__ must be a string");
return -1;
}
else if (name[0] != '_' && (prop= RNA_struct_find_property(&self->ptr, name))) {
if (!RNA_property_editable_flag(&self->ptr, prop)) {
- PyErr_Format( PyExc_AttributeError, "bpy_struct: attribute \"%.200s\" from \"%.200s\" is read-only", RNA_property_identifier(prop), RNA_struct_identifier(self->ptr.type) );
+ PyErr_Format(PyExc_AttributeError, "bpy_struct: attribute \"%.200s\" from \"%.200s\" is read-only", RNA_property_identifier(prop), RNA_struct_identifier(self->ptr.type) );
return -1;
}
}
@@ -2744,7 +2983,7 @@ static int pyrna_struct_setattro( BPy_StructRNA *self, PyObject *pyname, PyObjec
PyErr_SetString(PyExc_AttributeError, "bpy_struct: del not supported");
return -1;
}
- return pyrna_py_to_prop(&self->ptr, prop, NULL, NULL, value, "bpy_struct: item.attr = val:");
+ return pyrna_py_to_prop(&self->ptr, prop, NULL, value, "bpy_struct: item.attr = val:");
}
else {
return PyObject_GenericSetAttr((PyObject *)self, pyname, value);
@@ -2778,7 +3017,7 @@ static PyObject *pyrna_prop_array_getattro( BPy_PropertyRNA *self, PyObject *pyn
static PyObject *pyrna_prop_collection_getattro( BPy_PropertyRNA *self, PyObject *pyname )
{
- char *name = _PyUnicode_AsString(pyname);
+ const char *name = _PyUnicode_AsString(pyname);
if(name == NULL) {
PyErr_SetString(PyExc_AttributeError, "bpy_prop_collection: __getattr__ must be a string");
@@ -2813,10 +3052,16 @@ static PyObject *pyrna_prop_collection_getattro( BPy_PropertyRNA *self, PyObject
//--------------- setattr-------------------------------------------
static int pyrna_prop_collection_setattro( BPy_PropertyRNA *self, PyObject *pyname, PyObject *value )
{
- char *name = _PyUnicode_AsString(pyname);
+ const char *name = _PyUnicode_AsString(pyname);
PropertyRNA *prop;
PointerRNA r_ptr;
+#ifdef USE_PEDANTIC_WRITE
+ if(rna_disallow_writes && rna_id_write_error(&self->ptr, pyname)) {
+ return -1;
+ }
+#endif // USE_STRING_COERCE
+
if(name == NULL) {
PyErr_SetString(PyExc_AttributeError, "bpy_prop: __setattr__ must be a string");
return -1;
@@ -2828,11 +3073,11 @@ static int pyrna_prop_collection_setattro( BPy_PropertyRNA *self, PyObject *pyna
else if(RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr)) {
if ((prop = RNA_struct_find_property(&r_ptr, name))) {
/* pyrna_py_to_prop sets its own exceptions */
- return pyrna_py_to_prop(&r_ptr, prop, NULL, NULL, value, "BPy_PropertyRNA - Attribute (setattr):");
+ return pyrna_py_to_prop(&r_ptr, prop, NULL, value, "BPy_PropertyRNA - Attribute (setattr):");
}
}
- PyErr_Format( PyExc_AttributeError, "bpy_prop_collection: attribute \"%.200s\" not found", name);
+ PyErr_Format(PyExc_AttributeError, "bpy_prop_collection: attribute \"%.200s\" not found", name);
return -1;
}
@@ -2843,7 +3088,7 @@ static PyObject *pyrna_prop_collection_idprop_add(BPy_PropertyRNA *self)
RNA_property_collection_add(&self->ptr, self->prop, &r_ptr);
if(!r_ptr.data) {
- PyErr_SetString( PyExc_TypeError, "bpy_prop_collection.add(): not supported for this collection");
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.add(): not supported for this collection");
return NULL;
}
else {
@@ -2853,15 +3098,15 @@ static PyObject *pyrna_prop_collection_idprop_add(BPy_PropertyRNA *self)
static PyObject *pyrna_prop_collection_idprop_remove(BPy_PropertyRNA *self, PyObject *value)
{
- int key= PyLong_AsSsize_t(value);
+ int key= PyLong_AsLong(value);
if (key==-1 && PyErr_Occurred()) {
- PyErr_SetString( PyExc_TypeError, "bpy_prop_collection.remove(): expected one int argument");
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.remove(): expected one int argument");
return NULL;
}
if(!RNA_property_collection_remove(&self->ptr, self->prop, key)) {
- PyErr_SetString( PyExc_TypeError, "bpy_prop_collection.remove() not supported for this collection");
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.remove() not supported for this collection");
return NULL;
}
@@ -2873,12 +3118,12 @@ static PyObject *pyrna_prop_collection_idprop_move(BPy_PropertyRNA *self, PyObje
int key=0, pos=0;
if (!PyArg_ParseTuple(args, "ii", &key, &pos)) {
- PyErr_SetString( PyExc_TypeError, "bpy_prop_collection.move(): expected two ints as arguments");
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.move(): expected two ints as arguments");
return NULL;
}
if(!RNA_property_collection_move(&self->ptr, self->prop, key, pos)) {
- PyErr_SetString( PyExc_TypeError, "bpy_prop_collection.move() not supported for this collection");
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.move() not supported for this collection");
return NULL;
}
@@ -2902,17 +3147,17 @@ static PyObject *pyrna_struct_get_id_data(BPy_DummyPointerRNA *self)
/*****************************************************************************/
static PyGetSetDef pyrna_prop_getseters[] = {
- {"id_data", (getter)pyrna_struct_get_id_data, (setter)NULL, "The :class:`ID` object this datablock is from or None, (not available for all data types)", NULL},
+ {(char *)"id_data", (getter)pyrna_struct_get_id_data, (setter)NULL, (char *)"The :class:`ID` object this datablock is from or None, (not available for all data types)", NULL},
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
static PyGetSetDef pyrna_struct_getseters[] = {
- {"id_data", (getter)pyrna_struct_get_id_data, (setter)NULL, "The :class:`ID` object this datablock is from or None, (not available for all data types)", NULL},
+ {(char *)"id_data", (getter)pyrna_struct_get_id_data, (setter)NULL, (char *)"The :class:`ID` object this datablock is from or None, (not available for all data types)", NULL},
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
-static PyObject *pyrna_prop_keys(BPy_PropertyRNA *self)
+static PyObject *pyrna_prop_collection_keys(BPy_PropertyRNA *self)
{
PyObject *ret= PyList_New(0);
PyObject *item;
@@ -2933,11 +3178,11 @@ static PyObject *pyrna_prop_keys(BPy_PropertyRNA *self)
}
}
RNA_PROP_END;
-
+
return ret;
}
-static PyObject *pyrna_prop_items(BPy_PropertyRNA *self)
+static PyObject *pyrna_prop_collection_items(BPy_PropertyRNA *self)
{
PyObject *ret= PyList_New(0);
PyObject *item;
@@ -2966,23 +3211,14 @@ static PyObject *pyrna_prop_items(BPy_PropertyRNA *self)
}
}
RNA_PROP_END;
-
+
return ret;
}
-static PyObject *pyrna_prop_values(BPy_PropertyRNA *self)
+static PyObject *pyrna_prop_collection_values(BPy_PropertyRNA *self)
{
- PyObject *ret= PyList_New(0);
- PyObject *item;
-
- RNA_PROP_BEGIN(&self->ptr, itemptr, self->prop) {
- item = pyrna_struct_CreatePyObject(&itemptr);
- PyList_Append(ret, item);
- Py_DECREF(item);
- }
- RNA_PROP_END;
-
- return ret;
+ /* re-use slice*/
+ return pyrna_prop_collection_subscript_slice(self, 0, PY_SSIZE_T_MAX);
}
static char pyrna_struct_get_doc[] =
@@ -3001,7 +3237,7 @@ static PyObject *pyrna_struct_get(BPy_StructRNA *self, PyObject *args)
{
IDProperty *group, *idprop;
- char *key;
+ const char *key;
PyObject* def = Py_None;
if (!PyArg_ParseTuple(args, "s|O:get", &key, &def))
@@ -3009,7 +3245,7 @@ static PyObject *pyrna_struct_get(BPy_StructRNA *self, PyObject *args)
/* mostly copied from BPy_IDGroup_Map_GetItem */
if(RNA_struct_idprops_check(self->ptr.type)==0) {
- PyErr_SetString( PyExc_TypeError, "this type doesn't support IDProperties");
+ PyErr_SetString(PyExc_TypeError, "this type doesn't support IDProperties");
return NULL;
}
@@ -3039,23 +3275,23 @@ static PyObject *pyrna_struct_as_pointer(BPy_StructRNA *self)
return PyLong_FromVoidPtr(self->ptr.data);
}
-static PyObject *pyrna_prop_get(BPy_PropertyRNA *self, PyObject *args)
+static PyObject *pyrna_prop_collection_get(BPy_PropertyRNA *self, PyObject *args)
{
PointerRNA newptr;
-
- char *key;
+
+ const char *key;
PyObject* def = Py_None;
if (!PyArg_ParseTuple(args, "s|O:get", &key, &def))
return NULL;
-
+
if(RNA_property_collection_lookup_string(&self->ptr, self->prop, key, &newptr))
return pyrna_struct_CreatePyObject(&newptr);
return Py_INCREF(def), def;
}
-static void foreach_attr_type( BPy_PropertyRNA *self, char *attr,
+static void foreach_attr_type( BPy_PropertyRNA *self, const char *attr,
/* values to assign */
RawPropertyType *raw_type, int *attr_tot, int *attr_signed )
{
@@ -3075,12 +3311,12 @@ static void foreach_attr_type( BPy_PropertyRNA *self, char *attr,
RNA_PROP_END;
}
-/* pyrna_prop_foreach_get/set both use this */
+/* pyrna_prop_collection_foreach_get/set both use this */
static int foreach_parse_args(
BPy_PropertyRNA *self, PyObject *args,
/*values to assign */
- char **attr, PyObject **seq, int *tot, int *size, RawPropertyType *raw_type, int *attr_tot, int *attr_signed)
+ const char **attr, PyObject **seq, int *tot, int *size, RawPropertyType *raw_type, int *attr_tot, int *attr_signed)
{
#if 0
int array_tot;
@@ -3091,11 +3327,11 @@ static int foreach_parse_args(
*raw_type= PROP_RAW_UNSET;
if(!PyArg_ParseTuple(args, "sO", attr, seq) || (!PySequence_Check(*seq) && PyObject_CheckBuffer(*seq))) {
- PyErr_SetString( PyExc_TypeError, "foreach_get(attr, sequence) expects a string and a sequence" );
+ PyErr_SetString(PyExc_TypeError, "foreach_get(attr, sequence) expects a string and a sequence");
return -1;
}
- *tot= PySequence_Length(*seq); // TODO - buffer may not be a sequence! array.array() is tho.
+ *tot= PySequence_Size(*seq); // TODO - buffer may not be a sequence! array.array() is tho.
if(*tot>0) {
foreach_attr_type(self, *attr, raw_type, attr_tot, attr_signed);
@@ -3115,7 +3351,7 @@ static int foreach_parse_args(
/* rna_access.c - rna_raw_access(...) uses this same method */
if(target_tot != (*tot)) {
- PyErr_Format( PyExc_TypeError, "foreach_get(attr, sequence) sequence length mismatch given %d, needed %d", *tot, target_tot);
+ PyErr_Format(PyExc_TypeError, "foreach_get(attr, sequence) sequence length mismatch given %d, needed %d", *tot, target_tot);
return -1;
}
#endif
@@ -3124,7 +3360,7 @@ static int foreach_parse_args(
/* check 'attr_tot' otherwise we dont know if any values were set
* this isnt ideal because it means running on an empty list may fail silently when its not compatible. */
if (*size == 0 && *attr_tot != 0) {
- PyErr_SetString( PyExc_AttributeError, "attribute does not support foreach method" );
+ PyErr_SetString(PyExc_AttributeError, "attribute does not support foreach method");
return -1;
}
return 0;
@@ -3162,7 +3398,7 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
void *array= NULL;
/* get/set both take the same args currently */
- char *attr;
+ const char *attr;
PyObject *seq;
int tot, size, attr_tot, attr_signed;
RawPropertyType raw_type;
@@ -3200,13 +3436,13 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
item= PySequence_GetItem(seq, i);
switch(raw_type) {
case PROP_RAW_CHAR:
- ((char *)array)[i]= (char)PyLong_AsSsize_t(item);
+ ((char *)array)[i]= (char)PyLong_AsLong(item);
break;
case PROP_RAW_SHORT:
- ((short *)array)[i]= (short)PyLong_AsSsize_t(item);
+ ((short *)array)[i]= (short)PyLong_AsLong(item);
break;
case PROP_RAW_INT:
- ((int *)array)[i]= (int)PyLong_AsSsize_t(item);
+ ((int *)array)[i]= (int)PyLong_AsLong(item);
break;
case PROP_RAW_FLOAT:
((float *)array)[i]= (float)PyFloat_AsDouble(item);
@@ -3216,6 +3452,7 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
break;
case PROP_RAW_UNSET:
/* should never happen */
+ BLI_assert(!"Invalid array type - set");
break;
}
@@ -3270,6 +3507,7 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
break;
case PROP_RAW_UNSET:
/* should never happen */
+ BLI_assert(!"Invalid array type - get");
break;
}
@@ -3296,12 +3534,38 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
Py_RETURN_NONE;
}
-static PyObject *pyrna_prop_foreach_get(BPy_PropertyRNA *self, PyObject *args)
+static char pyrna_prop_collection_foreach_get_doc[] =
+".. method:: foreach_get(attr, seq)\n"
+"\n"
+" This is a function to give fast access to attribites within a collection.\n"
+"\n"
+" .. code-block:: python\n"
+"\n"
+" collection.foreach_get(someseq, attr)\n"
+"\n"
+" # Python equivelent\n"
+" for i in range(len(seq)): someseq[i] = getattr(collection, attr)\n"
+"\n"
+;
+static PyObject *pyrna_prop_collection_foreach_get(BPy_PropertyRNA *self, PyObject *args)
{
return foreach_getset(self, args, 0);
}
-static PyObject *pyrna_prop_foreach_set(BPy_PropertyRNA *self, PyObject *args)
+static char pyrna_prop_collection_foreach_set_doc[] =
+".. method:: foreach_set(attr, seq)\n"
+"\n"
+" This is a function to give fast access to attribites within a collection.\n"
+"\n"
+" .. code-block:: python\n"
+"\n"
+" collection.foreach_set(seq, attr)\n"
+"\n"
+" # Python equivelent\n"
+" for i in range(len(seq)): setattr(collection[i], attr, seq[i])\n"
+"\n"
+;
+static PyObject *pyrna_prop_collection_foreach_set(BPy_PropertyRNA *self, PyObject *args)
{
return foreach_getset(self, args, 1);
}
@@ -3315,7 +3579,7 @@ PyObject *pyrna_prop_array_iter(BPy_PropertyArrayRNA *self)
PyObject *iter= NULL;
int len= pyrna_prop_array_length(self);
ret = pyrna_prop_array_subscript_slice(self, &self->ptr, self->prop, 0, len, len);
-
+
/* we know this is a list so no need to PyIter_Check
* otherwise it could be NULL (unlikely) if conversion failed */
if(ret) {
@@ -3331,8 +3595,8 @@ PyObject *pyrna_prop_collection_iter(BPy_PropertyRNA *self)
/* Try get values from a collection */
PyObject *ret;
PyObject *iter= NULL;
- ret = pyrna_prop_values(self);
-
+ ret= pyrna_prop_collection_values(self);
+
/* we know this is a list so no need to PyIter_Check
* otherwise it could be NULL (unlikely) if conversion failed */
if(ret) {
@@ -3343,6 +3607,11 @@ PyObject *pyrna_prop_collection_iter(BPy_PropertyRNA *self)
return iter;
}
+static PyObject *pyrna_struct_is_registered(PyObject *cls)
+{
+ return PyBool_FromLong(PyDict_GetItemString((((PyTypeObject *)cls)->tp_dict), "bl_rna") != NULL);
+}
+
static struct PyMethodDef pyrna_struct_methods[] = {
/* only for PointerRNA's with ID'props */
@@ -3368,6 +3637,9 @@ static struct PyMethodDef pyrna_struct_methods[] = {
/* experemental */
{"callback_add", (PyCFunction)pyrna_callback_add, METH_VARARGS, NULL},
{"callback_remove", (PyCFunction)pyrna_callback_remove, METH_VARARGS, NULL},
+
+ /* class method */
+ {"is_registered", (PyCFunction) pyrna_struct_is_registered, METH_NOARGS | METH_CLASS, NULL},
{NULL, NULL, 0, NULL}
};
@@ -3382,14 +3654,14 @@ static struct PyMethodDef pyrna_prop_array_methods[] = {
};
static struct PyMethodDef pyrna_prop_collection_methods[] = {
- {"foreach_get", (PyCFunction)pyrna_prop_foreach_get, METH_VARARGS, NULL},
- {"foreach_set", (PyCFunction)pyrna_prop_foreach_set, METH_VARARGS, NULL},
+ {"foreach_get", (PyCFunction)pyrna_prop_collection_foreach_get, METH_VARARGS, pyrna_prop_collection_foreach_get_doc},
+ {"foreach_set", (PyCFunction)pyrna_prop_collection_foreach_set, METH_VARARGS, pyrna_prop_collection_foreach_set_doc},
- {"keys", (PyCFunction)pyrna_prop_keys, METH_NOARGS, NULL},
- {"items", (PyCFunction)pyrna_prop_items, METH_NOARGS,NULL},
- {"values", (PyCFunction)pyrna_prop_values, METH_NOARGS, NULL},
-
- {"get", (PyCFunction)pyrna_prop_get, METH_VARARGS, NULL},
+ {"keys", (PyCFunction)pyrna_prop_collection_keys, METH_NOARGS, NULL},
+ {"items", (PyCFunction)pyrna_prop_collection_items, METH_NOARGS,NULL},
+ {"values", (PyCFunction)pyrna_prop_collection_values, METH_NOARGS, NULL},
+
+ {"get", (PyCFunction)pyrna_prop_collection_get, METH_VARARGS, NULL},
{NULL, NULL, 0, NULL}
};
@@ -3402,10 +3674,10 @@ static struct PyMethodDef pyrna_prop_collection_idprop_methods[] = {
/* only needed for subtyping, so a new class gets a valid BPy_StructRNA
* todo - also accept useful args */
-static PyObject * pyrna_struct_new(PyTypeObject *type, PyObject *args, PyObject *kwds) {
+static PyObject * pyrna_struct_new(PyTypeObject *type, PyObject *args, PyObject *UNUSED(kwds)) {
BPy_StructRNA *base;
-
+
if (!PyArg_ParseTuple(args, "O!:bpy_struct.__new__", &pyrna_struct_Type, &base))
return NULL;
@@ -3418,20 +3690,20 @@ static PyObject * pyrna_struct_new(PyTypeObject *type, PyObject *args, PyObject
return (PyObject *)ret;
}
else {
- PyErr_Format(PyExc_TypeError, "bpy_struct.__new__(type): type '%.200s' is not a subtype of bpy_struct.", type->tp_name);
+ PyErr_Format(PyExc_TypeError, "bpy_struct.__new__(type): type '%.200s' is not a subtype of bpy_struct", type->tp_name);
return NULL;
}
}
/* only needed for subtyping, so a new class gets a valid BPy_StructRNA
* todo - also accept useful args */
-static PyObject * pyrna_prop_new(PyTypeObject *type, PyObject *args, PyObject *kwds) {
+static PyObject * pyrna_prop_new(PyTypeObject *type, PyObject *args, PyObject *UNUSED(kwds)) {
BPy_PropertyRNA *base;
-
+
if (!PyArg_ParseTuple(args, "O!:bpy_prop.__new__", &pyrna_prop_Type, &base))
return NULL;
-
+
if (type == Py_TYPE(base)) {
Py_INCREF(base);
return (PyObject *)base;
@@ -3442,20 +3714,19 @@ static PyObject * pyrna_prop_new(PyTypeObject *type, PyObject *args, PyObject *k
return (PyObject *)ret;
}
else {
- PyErr_Format(PyExc_TypeError, "bpy_prop.__new__(type): type '%.200s' is not a subtype of bpy_prop.", type->tp_name);
+ PyErr_Format(PyExc_TypeError, "bpy_prop.__new__(type): type '%.200s' is not a subtype of bpy_prop", type->tp_name);
return NULL;
}
}
-PyObject *pyrna_param_to_py(PointerRNA *ptr, ParameterList *parms, PropertyRNA *prop, void *data)
+PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *data)
{
PyObject *ret;
int type = RNA_property_type(prop);
int flag = RNA_property_flag(prop);
- int a;
if(RNA_property_array_check(ptr, prop)) {
- int len;
+ int a, len;
if (flag & PROP_DYNAMIC) {
ParameterDynAlloc *data_alloc= data;
@@ -3482,6 +3753,7 @@ PyObject *pyrna_param_to_py(PointerRNA *ptr, ParameterList *parms, PropertyRNA *
break;
case PROP_FLOAT:
switch(RNA_property_subtype(prop)) {
+#ifdef USE_MATHUTILS
case PROP_ALL_VECTOR_SUBTYPES:
ret= newVectorObject(data, len, Py_NEW, NULL);
break;
@@ -3495,6 +3767,7 @@ PyObject *pyrna_param_to_py(PointerRNA *ptr, ParameterList *parms, PropertyRNA *
break;
}
/* pass through */
+#endif
default:
ret = PyTuple_New(len);
for(a=0; a<len; a++)
@@ -3626,16 +3899,18 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
void *retdata_single= NULL;
/* Should never happen but it does in rare cases */
+ BLI_assert(self_ptr != NULL);
+
if(self_ptr==NULL) {
PyErr_SetString(PyExc_RuntimeError, "rna functions internal rna pointer is NULL, this is a bug. aborting");
return NULL;
}
-
+
if(self_func==NULL) {
PyErr_Format(PyExc_RuntimeError, "%.200s.<unknown>(): rna function internal function is NULL, this is a bug. aborting", RNA_struct_identifier(self_ptr->type));
return NULL;
}
-
+
/* include the ID pointer for pyrna_param_to_py() so we can include the
* ID pointer on return values, this only works when returned values have
* the same ID as the functions. */
@@ -3698,7 +3973,7 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
continue;
}
- err= pyrna_py_to_prop(&funcptr, parm, &parms, iter.data, item, "");
+ err= pyrna_py_to_prop(&funcptr, parm, iter.data, item, "");
if(err!=0) {
/* the error generated isnt that useful, so generate it again with a useful prefix
@@ -3711,12 +3986,12 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
else
snprintf(error_prefix, sizeof(error_prefix), "%s.%s(): error with argument %d, \"%s\" - ", RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func), i, parm_id);
- pyrna_py_to_prop(&funcptr, parm, &parms, iter.data, item, error_prefix);
+ pyrna_py_to_prop(&funcptr, parm, iter.data, item, error_prefix);
break;
}
}
-
+
RNA_parameter_list_end(&iter);
/* Check if we gave args that dont exist in the function
@@ -3731,7 +4006,7 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
DynStr *bad_args= BLI_dynstr_new();
DynStr *good_args= BLI_dynstr_new();
- char *arg_name, *bad_args_str, *good_args_str;
+ const char *arg_name, *bad_args_str, *good_args_str;
int found= FALSE, first= TRUE;
while (PyDict_Next(kw, &pos, &key, &value)) {
@@ -3784,8 +4059,8 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
BLI_dynstr_free(bad_args);
BLI_dynstr_free(good_args);
- MEM_freeN(bad_args_str);
- MEM_freeN(good_args_str);
+ MEM_freeN((void *)bad_args_str);
+ MEM_freeN((void *)good_args_str);
err= -1;
}
@@ -3799,8 +4074,7 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
BKE_reports_init(&reports, RPT_STORE);
RNA_function_call(C, &reports, self_ptr, self_func, &parms);
- err= (BPy_reports_to_error(&reports))? -1: 0;
- BKE_reports_clear(&reports);
+ err= (BPy_reports_to_error(&reports, TRUE))? -1: 0;
/* return value */
if(err==0) {
@@ -3816,13 +4090,13 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
flag= RNA_property_flag(parm);
if (flag & PROP_OUTPUT)
- PyTuple_SET_ITEM(ret, i++, pyrna_param_to_py(&funcptr, &parms, parm, iter.data));
+ PyTuple_SET_ITEM(ret, i++, pyrna_param_to_py(&funcptr, parm, iter.data));
}
RNA_parameter_list_end(&iter);
}
else
- ret= pyrna_param_to_py(&funcptr, &parms, pret_single, retdata_single);
+ ret= pyrna_param_to_py(&funcptr, pret_single, retdata_single);
/* possible there is an error in conversion */
if(ret==NULL)
@@ -4345,7 +4619,7 @@ static PyObject* pyrna_srna_ExternalType(StructRNA *srna)
PyObject *newclass;
if(bpy_types_dict==NULL) {
- PyObject *bpy_types= PyImport_ImportModuleLevel("bpy_types", NULL, NULL, NULL, 0);
+ PyObject *bpy_types= PyImport_ImportModuleLevel((char *)"bpy_types", NULL, NULL, NULL, 0);
if(bpy_types==NULL) {
PyErr_Print();
@@ -4430,7 +4704,7 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
}
/* always use O not N when calling, N causes refcount errors */
- newclass = PyObject_CallFunction(metaclass, "s(O){sss()}", idname, py_base, "__module__","bpy.types", "__slots__");
+ newclass = PyObject_CallFunction(metaclass, (char *)"s(O){sss()}", idname, py_base, "__module__","bpy.types", "__slots__");
/* newclass will now have 2 ref's, ???, probably 1 is internal since decrefing here segfaults */
@@ -4494,7 +4768,7 @@ PyObject *pyrna_struct_CreatePyObject( PointerRNA *ptr )
}
if( !pyrna ) {
- PyErr_SetString( PyExc_MemoryError, "couldn't create bpy_struct object" );
+ PyErr_SetString(PyExc_MemoryError, "couldn't create bpy_struct object");
return NULL;
}
@@ -4534,7 +4808,7 @@ PyObject *pyrna_prop_CreatePyObject( PointerRNA *ptr, PropertyRNA *prop )
}
if( !pyrna ) {
- PyErr_SetString( PyExc_MemoryError, "couldn't create BPy_rna object" );
+ PyErr_SetString(PyExc_MemoryError, "couldn't create BPy_rna object");
return NULL;
}
@@ -4614,16 +4888,12 @@ static PyObject *pyrna_basetype_getattro( BPy_BaseTypeRNA *self, PyObject *pynam
{
PointerRNA newptr;
PyObject *ret;
- char *name= _PyUnicode_AsString(pyname);
+ const char *name= _PyUnicode_AsString(pyname);
if(name == NULL) {
PyErr_SetString(PyExc_AttributeError, "bpy.types: __getattr__ must be a string");
ret = NULL;
}
- else if(strcmp(name, "register")==0) {
- /* this is called so often, make an exception and save a full lookup on all types */
- ret= PyObject_GenericGetAttr((PyObject *)self, pyname);
- }
else if (RNA_property_collection_lookup_string(&self->ptr, self->prop, name, &newptr)) {
ret= pyrna_struct_Subtype(&newptr);
if (ret==NULL) {
@@ -4643,29 +4913,31 @@ static PyObject *pyrna_basetype_getattro( BPy_BaseTypeRNA *self, PyObject *pynam
}
static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self);
-static PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class);
-static PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class);
+static PyObject *pyrna_register_class(PyObject *self, PyObject *py_class);
+static PyObject *pyrna_unregister_class(PyObject *self, PyObject *py_class);
static struct PyMethodDef pyrna_basetype_methods[] = {
{"__dir__", (PyCFunction)pyrna_basetype_dir, METH_NOARGS, ""},
- {"register", (PyCFunction)pyrna_basetype_register, METH_O, ""},
- {"unregister", (PyCFunction)pyrna_basetype_unregister, METH_O, ""},
{NULL, NULL, 0, NULL}
};
static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self)
{
- PyObject *list, *name;
+ PyObject *list;
+#if 0
+ PyObject *name;
PyMethodDef *meth;
-
- list= pyrna_prop_keys(self); /* like calling structs.keys(), avoids looping here */
+#endif
+
+ list= pyrna_prop_collection_keys(self); /* like calling structs.keys(), avoids looping here */
+#if 0 /* for now only contains __dir__ */
for(meth=pyrna_basetype_methods; meth->ml_name; meth++) {
name = PyUnicode_FromString(meth->ml_name);
PyList_Append(list, name);
Py_DECREF(name);
}
-
+#endif
return list;
}
@@ -4738,12 +5010,10 @@ StructRNA *pyrna_struct_as_srna(PyObject *self, int parent, const char *error_pr
/* Orphan functions, not sure where they should go */
/* get the srna for methods attached to types */
-/* */
+/*
+ * Caller needs to raise error.*/
StructRNA *srna_from_self(PyObject *self, const char *error_prefix)
{
- /* a bit sloppy but would cause a very confusing bug if
- * an error happened to be set here */
- PyErr_Clear();
if(self==NULL) {
return NULL;
@@ -4754,10 +5024,24 @@ StructRNA *srna_from_self(PyObject *self, const char *error_prefix)
else if (PyType_Check(self)==0) {
return NULL;
}
- /* These cases above not errors, they just mean the type was not compatible
- * After this any errors will be raised in the script */
+ else {
+ /* These cases above not errors, they just mean the type was not compatible
+ * After this any errors will be raised in the script */
- return pyrna_struct_as_srna(self, 0, error_prefix);
+ PyObject *error_type, *error_value, *error_traceback;
+ StructRNA *srna;
+
+ PyErr_Fetch(&error_type, &error_value, &error_traceback);
+ PyErr_Clear();
+
+ srna= pyrna_struct_as_srna(self, 0, error_prefix);
+
+ if(!PyErr_Occurred()) {
+ PyErr_Restore(error_type, error_value, error_traceback);
+ }
+
+ return srna;
+ }
}
static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item)
@@ -4817,17 +5101,17 @@ static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
PyObject *item, *key;
PyObject *order;
Py_ssize_t pos = 0;
- int ret;
+ int ret= 0;
- if( !PyDict_CheckExact(class_dict) &&
- (order= PyDict_GetItemString(class_dict, "order")) &&
- PyList_CheckExact(order)
- ) {
+ /* in both cases PyDict_CheckExact(class_dict) will be true even
+ * though Operators have a metaclass dict namespace */
+
+ if((order= PyDict_GetItemString(class_dict, "order")) && PyList_CheckExact(order)) {
for(pos= 0; pos<PyList_GET_SIZE(order); pos++) {
key= PyList_GET_ITEM(order, pos);
item= PyDict_GetItem(class_dict, key);
ret= deferred_register_prop(srna, key, item);
- if(ret==-1)
+ if(ret != 0)
break;
}
}
@@ -4835,12 +5119,12 @@ static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
while (PyDict_Next(class_dict, &pos, &key, &item)) {
ret= deferred_register_prop(srna, key, item);
- if(ret==-1)
+ if(ret != 0)
break;
}
}
- return 0;
+ return ret;
}
static int pyrna_deferred_register_class_recursive(StructRNA *srna, PyTypeObject *py_class)
@@ -4922,13 +5206,13 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
if (base_class) {
if (!PyObject_IsSubclass(py_class, base_class)) {
- PyErr_Format( PyExc_TypeError, "expected %.200s subclass of class \"%.200s\"", class_type, py_class_name);
+ PyErr_Format(PyExc_TypeError, "expected %.200s subclass of class \"%.200s\"", class_type, py_class_name);
return -1;
}
}
/* verify callback functions */
- lb= RNA_struct_defined_functions(srna);
+ lb= RNA_struct_type_functions(srna);
i= 0;
for(link=lb->first; link; link=link->next) {
func= (FunctionRNA*)link;
@@ -4944,7 +5228,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
if (item==NULL) {
if ((flag & FUNC_REGISTER_OPTIONAL)==0) {
- PyErr_Format( PyExc_AttributeError, "expected %.200s, %.200s class to have an \"%.200s\" attribute", class_type, py_class_name, RNA_function_identifier(func));
+ PyErr_Format(PyExc_AttributeError, "expected %.200s, %.200s class to have an \"%.200s\" attribute", class_type, py_class_name, RNA_function_identifier(func));
return -1;
}
@@ -4954,14 +5238,14 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
Py_DECREF(item); /* no need to keep a ref, the class owns it (technically we should keep a ref but...) */
if(flag & FUNC_NO_SELF) {
if (PyMethod_Check(item)==0) {
- PyErr_Format( PyExc_TypeError, "expected %.200s, %.200s class \"%.200s\" attribute to be a method, not a %.200s", class_type, py_class_name, RNA_function_identifier(func), Py_TYPE(item)->tp_name);
+ PyErr_Format(PyExc_TypeError, "expected %.200s, %.200s class \"%.200s\" attribute to be a method, not a %.200s", class_type, py_class_name, RNA_function_identifier(func), Py_TYPE(item)->tp_name);
return -1;
}
item= ((PyMethodObject *)item)->im_func;
}
else {
if (PyFunction_Check(item)==0) {
- PyErr_Format( PyExc_TypeError, "expected %.200s, %.200s class \"%.200s\" attribute to be a function, not a %.200s", class_type, py_class_name, RNA_function_identifier(func), Py_TYPE(item)->tp_name);
+ PyErr_Format(PyExc_TypeError, "expected %.200s, %.200s class \"%.200s\" attribute to be a function, not a %.200s", class_type, py_class_name, RNA_function_identifier(func), Py_TYPE(item)->tp_name);
return -1;
}
}
@@ -4970,7 +5254,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
if (func_arg_count >= 0) { /* -1 if we dont care*/
py_arg_count = PyObject_GetAttrString(PyFunction_GET_CODE(item), "co_argcount");
- arg_count = PyLong_AsSsize_t(py_arg_count);
+ arg_count = PyLong_AsLong(py_arg_count);
Py_DECREF(py_arg_count);
/* note, the number of args we check for and the number of args we give to
@@ -4979,7 +5263,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
func_arg_count++;
if (arg_count != func_arg_count) {
- PyErr_Format( PyExc_AttributeError, "expected %.200s, %.200s class \"%.200s\" function to have %d args, found %d", class_type, py_class_name, RNA_function_identifier(func), func_arg_count, arg_count);
+ PyErr_Format(PyExc_AttributeError, "expected %.200s, %.200s class \"%.200s\" function to have %d args, found %d", class_type, py_class_name, RNA_function_identifier(func), func_arg_count, arg_count);
return -1;
}
}
@@ -4987,7 +5271,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
}
/* verify properties */
- lb= RNA_struct_defined_properties(srna);
+ lb= RNA_struct_type_properties(srna);
for(link=lb->first; link; link=link->next) {
const char *identifier;
prop= (PropertyRNA*)link;
@@ -5006,7 +5290,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
if(strcmp(identifier, rna_attr) == 0) { \
item= PyObject_GetAttrString(py_class, py_attr); \
if(item && item != Py_None) { \
- if(pyrna_py_to_prop(dummyptr, prop, NULL, NULL, item, "validating class error:") != 0) { \
+ if(pyrna_py_to_prop(dummyptr, prop, NULL, item, "validating class error:") != 0) { \
Py_DECREF(item); \
return -1; \
} \
@@ -5021,7 +5305,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
#undef BPY_REPLACEMENT_STRING
if (item == NULL && (((flag & PROP_REGISTER_OPTIONAL) != PROP_REGISTER_OPTIONAL))) {
- PyErr_Format( PyExc_AttributeError, "expected %.200s, %.200s class to have an \"%.200s\" attribute", class_type, py_class_name, identifier);
+ PyErr_Format(PyExc_AttributeError, "expected %.200s, %.200s class to have an \"%.200s\" attribute", class_type, py_class_name, identifier);
return -1;
}
@@ -5030,7 +5314,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
else {
Py_DECREF(item); /* no need to keep a ref, the class owns it */
- if(pyrna_py_to_prop(dummyptr, prop, NULL, NULL, item, "validating class error:") != 0)
+ if(pyrna_py_to_prop(dummyptr, prop, NULL, item, "validating class error:") != 0)
return -1;
}
}
@@ -5038,10 +5322,8 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
return 0;
}
-extern void BPY_update_modules( void ); //XXX temp solution
-
/* TODO - multiple return values like with rna functions */
-static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *parms)
+static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, ParameterList *parms)
{
PyObject *args;
PyObject *ret= NULL, *py_srna= NULL, *py_class, *py_class_instance= NULL, *parmitem;
@@ -5057,8 +5339,12 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
PyGILState_STATE gilstate;
- bContext *C= BPy_GetContext(); // XXX - NEEDS FIXING, QUITE BAD.
-
+#ifdef USE_PEDANTIC_WRITE
+ const char *func_id= RNA_function_identifier(func);
+ /* testing, for correctness, not operator and not draw function */
+ const short is_readonly= strstr("draw", func_id) || /*strstr("render", func_id) ||*/ !RNA_struct_is_a(ptr->type, &RNA_Operator);
+#endif
+
py_class= RNA_struct_py_type_get(ptr->type);
/* rare case. can happen when registering subclasses */
@@ -5067,6 +5353,11 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
return -1;
}
+ /* XXX, this is needed because render engine calls without a context
+ * this should be supported at some point but at the moment its not! */
+ if(C==NULL)
+ C= BPy_GetContext();
+
bpy_context_set(C, &gilstate);
if (!is_static) {
@@ -5150,13 +5441,24 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
continue;
}
- parmitem= pyrna_param_to_py(&funcptr, parms, parm, iter.data);
+ parmitem= pyrna_param_to_py(&funcptr, parm, iter.data);
PyTuple_SET_ITEM(args, i, parmitem);
i++;
}
+#ifdef USE_PEDANTIC_WRITE
+ rna_disallow_writes= is_readonly ? TRUE:FALSE;
+#endif
+ /* *** Main Caller *** */
+
ret = PyObject_Call(item, args, NULL);
+ /* *** Done Calling *** */
+
+#ifdef USE_PEDANTIC_WRITE
+ rna_disallow_writes= FALSE;
+#endif
+
RNA_parameter_list_end(&iter);
Py_DECREF(item);
Py_DECREF(args);
@@ -5164,14 +5466,14 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
else {
PyErr_Print();
PyErr_Clear();
- PyErr_Format(PyExc_TypeError, "could not find function %.200s in %.200s to execute callback.", RNA_function_identifier(func), RNA_struct_identifier(ptr->type));
+ PyErr_Format(PyExc_TypeError, "could not find function %.200s in %.200s to execute callback", RNA_function_identifier(func), RNA_struct_identifier(ptr->type));
err= -1;
}
}
else {
/* the error may be alredy set if the class instance couldnt be created */
if(err != -1) {
- PyErr_Format(PyExc_RuntimeError, "could not create instance of %.200s to call callback function %.200s.", RNA_struct_identifier(ptr->type), RNA_function_identifier(func));
+ PyErr_Format(PyExc_RuntimeError, "could not create instance of %.200s to call callback function %.200s", RNA_struct_identifier(ptr->type), RNA_function_identifier(func));
err= -1;
}
}
@@ -5181,20 +5483,20 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
}
else {
if(ret_len==0 && ret != Py_None) {
- PyErr_Format(PyExc_RuntimeError, "expected class %.200s, function %.200s to return None, got a %.200s type instead.", RNA_struct_identifier(ptr->type), RNA_function_identifier(func), Py_TYPE(ret)->tp_name);
+ PyErr_Format(PyExc_RuntimeError, "expected class %.200s, function %.200s to return None, got a %.200s type instead", RNA_struct_identifier(ptr->type), RNA_function_identifier(func), Py_TYPE(ret)->tp_name);
err= -1;
}
else if(ret_len==1) {
- err= pyrna_py_to_prop(&funcptr, pret_single, parms, retdata_single, ret, "calling class function:");
+ err= pyrna_py_to_prop(&funcptr, pret_single, retdata_single, ret, "calling class function:");
}
else if (ret_len > 1) {
if(PyTuple_Check(ret)==0) {
- PyErr_Format(PyExc_RuntimeError, "expected class %.200s, function %.200s to return a tuple of size %d, got a %.200s type instead.", RNA_struct_identifier(ptr->type), RNA_function_identifier(func), ret_len, Py_TYPE(ret)->tp_name);
+ PyErr_Format(PyExc_RuntimeError, "expected class %.200s, function %.200s to return a tuple of size %d, got a %.200s type instead", RNA_struct_identifier(ptr->type), RNA_function_identifier(func), ret_len, Py_TYPE(ret)->tp_name);
err= -1;
}
else if (PyTuple_GET_SIZE(ret) != ret_len) {
- PyErr_Format(PyExc_RuntimeError, "class %.200s, function %.200s to returned %d items, expected %d.", RNA_struct_identifier(ptr->type), RNA_function_identifier(func), PyTuple_GET_SIZE(ret), ret_len);
+ PyErr_Format(PyExc_RuntimeError, "class %.200s, function %.200s to returned %d items, expected %d", RNA_struct_identifier(ptr->type), RNA_function_identifier(func), PyTuple_GET_SIZE(ret), ret_len);
err= -1;
}
else {
@@ -5208,7 +5510,7 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
/* only useful for single argument returns, we'll need another list loop for multiple */
if (flag & PROP_OUTPUT) {
- err= pyrna_py_to_prop(&funcptr, parm, parms, iter.data, PyTuple_GET_ITEM(ret, i++), "calling class function:");
+ err= pyrna_py_to_prop(&funcptr, parm, iter.data, PyTuple_GET_ITEM(ret, i++), "calling class function:");
if(err)
break;
}
@@ -5221,6 +5523,20 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
}
if(err != 0) {
+ ReportList *reports;
+ /* alert the user, else they wont know unless they see the console. */
+ if (!is_static && ptr->data && RNA_struct_is_a(ptr->type, &RNA_Operator)) {
+ wmOperator *op= ptr->data;
+ reports= op->reports;
+ }
+ else {
+ /* wont alert users but they can view in 'info' space */
+ reports= CTX_wm_reports(C);
+ }
+
+ BPy_errors_to_report(reports);
+
+ /* also print in the console for py */
PyErr_Print();
PyErr_Clear();
}
@@ -5245,12 +5561,13 @@ static void bpy_class_free(void *pyob_ptr)
if(PyErr_Occurred())
PyErr_Clear();
+#if 0 /* needs further investigation, too annoying so quiet for now */
if(G.f&G_DEBUG) {
if(self->ob_refcnt > 1) {
PyC_ObSpit("zombie class - ref should be 1", self);
}
}
-
+#endif
Py_DECREF((PyObject *)pyob_ptr);
PyGILState_Release(gilstate);
@@ -5321,8 +5638,16 @@ void pyrna_free_types(void)
* the decref. This is not so bad because the leak only happens when re-registering (hold F8)
* - Should still be fixed - Campbell
* */
-
-static PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
+static char pyrna_register_class_doc[] =
+".. method:: register_class(cls)\n"
+"\n"
+" Register a subclass of a blender type in (:class:`Panel`, :class:`Menu`, :class:`Header`, :class:`Operator`, :class:`KeyingSetInfo`, :class:`RenderEngine`).\n"
+"\n"
+" .. note:: :exc:`ValueError` exception is raised if the class is not a subclass of a registerable blender class.\n"
+"\n"
+;
+PyMethodDef meth_bpy_register_class = {"register_class", pyrna_register_class, METH_O, pyrna_register_class_doc};
+static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class)
{
bContext *C= NULL;
ReportList reports;
@@ -5332,19 +5657,19 @@ static PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
const char *identifier;
if(PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, "bl_rna")) {
- PyErr_SetString(PyExc_AttributeError, "bpy.types.register(...): already registered as a subclass.");
+ PyErr_SetString(PyExc_AttributeError, "register_class(...): already registered as a subclass");
return NULL;
}
/* warning: gets parent classes srna, only for the register function */
- srna= pyrna_struct_as_srna(py_class, 1, "bpy.types.register(...):");
+ srna= pyrna_struct_as_srna(py_class, 1, "register_class(...):");
if(srna==NULL)
return NULL;
/* fails in cases, cant use this check but would like to :| */
/*
if(RNA_struct_py_type_get(srna)) {
- PyErr_Format(PyExc_ValueError, "bpy.types.register(...): %.200s's parent class %.200s is alredy registered, this is not allowed.", ((PyTypeObject*)py_class)->tp_name, RNA_struct_identifier(srna));
+ PyErr_Format(PyExc_ValueError, "register_class(...): %.200s's parent class %.200s is alredy registered, this is not allowed", ((PyTypeObject*)py_class)->tp_name, RNA_struct_identifier(srna));
return NULL;
}
*/
@@ -5353,7 +5678,7 @@ static PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
reg= RNA_struct_register(srna);
if(!reg) {
- PyErr_Format(PyExc_ValueError, "bpy.types.register(...): expected a subclass of a registerable rna type (%.200s does not support registration).", RNA_struct_identifier(srna));
+ PyErr_Format(PyExc_ValueError, "register_class(...): expected a subclass of a registerable rna type (%.200s does not support registration)", RNA_struct_identifier(srna));
return NULL;
}
@@ -5367,13 +5692,13 @@ static PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
srna_new= reg(C, &reports, py_class, identifier, bpy_class_validate, bpy_class_call, bpy_class_free);
- if(!srna_new) {
- BPy_reports_to_error(&reports);
- BKE_reports_clear(&reports);
+ if(BPy_reports_to_error(&reports, TRUE))
return NULL;
- }
- BKE_reports_clear(&reports);
+ /* python errors validating are not converted into reports so the check above will fail.
+ * the cause for returning NULL will be printed as an error */
+ if(srna_new == NULL)
+ return NULL;
pyrna_subtype_set_rna(py_class, srna_new); /* takes a ref to py_class */
@@ -5396,30 +5721,35 @@ static PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
static int pyrna_srna_contains_pointer_prop_srna(StructRNA *srna_props, StructRNA *srna, const char **prop_identifier)
{
- PointerRNA tptr;
- PropertyRNA *iterprop;
- RNA_pointer_create(NULL, &RNA_Struct, srna_props, &tptr);
-
- iterprop= RNA_struct_find_property(&tptr, "properties");
+ PropertyRNA *prop;
+ LinkData *link;
- RNA_PROP_BEGIN(&tptr, itemptr, iterprop) {
- PropertyRNA *prop= itemptr.data;
- if(RNA_property_type(prop) == PROP_POINTER) {
- if (strcmp(RNA_property_identifier(prop), "rna_type") == 0) {
- /* pass */
- }
- else if(RNA_property_pointer_type(&tptr, prop) == srna) {
+ /* verify properties */
+ const ListBase *lb= RNA_struct_type_properties(srna);
+
+ for(link=lb->first; link; link=link->next) {
+ prop= (PropertyRNA*)link;
+ if(RNA_property_type(prop) == PROP_POINTER && !(RNA_property_flag(prop) & PROP_BUILTIN)) {
+ PointerRNA tptr;
+ RNA_pointer_create(NULL, &RNA_Struct, srna_props, &tptr);
+
+ if(RNA_property_pointer_type(&tptr, prop) == srna) {
*prop_identifier= RNA_property_identifier(prop);
return 1;
}
}
}
- RNA_PROP_END;
-
+
return 0;
}
-static PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class)
+static char pyrna_unregister_class_doc[] =
+".. method:: unregister_class(cls)\n"
+"\n"
+" Unload the python class from blender.\n"
+;
+PyMethodDef meth_bpy_unregister_class = {"unregister_class", pyrna_unregister_class, METH_O, pyrna_unregister_class_doc};
+static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_class)
{
bContext *C= NULL;
StructUnregisterFunc unreg;
@@ -5427,11 +5757,11 @@ static PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class)
/*if(PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, "bl_rna")==NULL) {
PWM_cursor_wait(0);
- PyErr_SetString(PyExc_ValueError, "bpy.types.unregister(): not a registered as a subclass.");
+ PyErr_SetString(PyExc_ValueError, "unregister_class(): not a registered as a subclass");
return NULL;
}*/
- srna= pyrna_struct_as_srna(py_class, 0, "bpy.types.unregister(...):");
+ srna= pyrna_struct_as_srna(py_class, 0, "unregister_class(...):");
if(srna==NULL)
return NULL;
@@ -5439,7 +5769,7 @@ static PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class)
unreg= RNA_struct_unregister(srna);
if(!unreg) {
- PyErr_SetString(PyExc_ValueError, "bpy.types.unregister(...): expected a Type subclassed from a registerable rna type (no unregister supported).");
+ PyErr_SetString(PyExc_ValueError, "unregister_class(...): expected a Type subclassed from a registerable rna type (no unregister supported)");
return NULL;
}
@@ -5466,7 +5796,7 @@ static PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class)
RNA_PROP_END;
if(prop_identifier) {
- PyErr_Format(PyExc_SystemError, "bpy.types.unregister(...): Cant unregister %s because %s.%s pointer property is using this.", RNA_struct_identifier(srna), RNA_struct_identifier(srna_iter), prop_identifier);
+ PyErr_Format(PyExc_SystemError, "unregister_class(...): Cant unregister %s because %s.%s pointer property is using this", RNA_struct_identifier(srna), RNA_struct_identifier(srna_iter), prop_identifier);
return NULL;
}
}
diff --git a/source/blender/python/intern/bpy_rna.h b/source/blender/python/intern/bpy_rna.h
index 7f750f94242..bbcc85581b2 100644
--- a/source/blender/python/intern/bpy_rna.h
+++ b/source/blender/python/intern/bpy_rna.h
@@ -99,7 +99,7 @@ void pyrna_alloc_types(void);
void pyrna_free_types(void);
/* primitive type conversion */
-int pyrna_py_to_array(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, char *param_data, PyObject *py, const char *error_prefix);
+int pyrna_py_to_array(PointerRNA *ptr, PropertyRNA *prop, char *param_data, PyObject *py, const char *error_prefix);
int pyrna_py_to_array_index(PointerRNA *ptr, PropertyRNA *prop, int arraydim, int arrayoffset, int index, PyObject *py, const char *error_prefix);
PyObject *pyrna_array_index(PointerRNA *ptr, PropertyRNA *prop, int index);
@@ -108,4 +108,12 @@ PyObject *pyrna_py_from_array_index(BPy_PropertyArrayRNA *self, PointerRNA *ptr,
PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop);
int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value);
+int pyrna_write_check(void);
+
+void BPY_modules_update(struct bContext *C); //XXX temp solution
+
+/* bpy.utils.(un)register_class */
+extern PyMethodDef meth_bpy_register_class;
+extern PyMethodDef meth_bpy_unregister_class;
+
#endif
diff --git a/source/blender/python/intern/bpy_array.c b/source/blender/python/intern/bpy_rna_array.c
index 6d971d8708e..f0f5bc44f6a 100644
--- a/source/blender/python/intern/bpy_array.c
+++ b/source/blender/python/intern/bpy_rna_array.c
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id: bpy_rna_array.c 34304 2011-01-13 21:44:18Z campbellbarton $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -56,15 +56,15 @@ static int validate_array_type(PyObject *seq, int dim, int totdim, int dimsize[]
/* not the last dimension */
if (dim + 1 < totdim) {
/* check that a sequence contains dimsize[dim] items */
-
- for (i= 0; i < PySequence_Length(seq); i++) {
+ const int seq_size= PySequence_Size(seq);
+ for (i= 0; i < seq_size; i++) {
PyObject *item;
int ok= 1;
item= PySequence_GetItem(seq, i);
if (!PySequence_Check(item)) {
/* BLI_snprintf(error_str, error_str_size, "expected a sequence of %s", item_type_str); */
- PyErr_Format(PyExc_TypeError, "%s expected a sequence of %s", error_prefix, item_type_str);
+ PyErr_Format(PyExc_TypeError, "%s expected a sequence of %s, not %s", error_prefix, item_type_str, Py_TYPE(item)->tp_name);
ok= 0;
}
/* arr[3][4][5]
@@ -72,7 +72,7 @@ static int validate_array_type(PyObject *seq, int dim, int totdim, int dimsize[]
dimsize[2]=5
dim=0 */
- else if (PySequence_Length(item) != dimsize[dim + 1]) {
+ else if (PySequence_Size(item) != dimsize[dim + 1]) {
/* BLI_snprintf(error_str, error_str_size, "sequences of dimension %d should contain %d items", (int)dim + 1, (int)dimsize[dim + 1]); */
PyErr_Format(PyExc_ValueError, "%s sequences of dimension %d should contain %d items", error_prefix, (int)dim + 1, (int)dimsize[dim + 1]);
ok= 0;
@@ -89,14 +89,15 @@ static int validate_array_type(PyObject *seq, int dim, int totdim, int dimsize[]
}
else {
/* check that items are of correct type */
- for (i= 0; i < PySequence_Length(seq); i++) {
+ const int seq_size= PySequence_Size(seq);
+ for (i= 0; i < seq_size; i++) {
PyObject *item= PySequence_GetItem(seq, i);
if (!check_item_type(item)) {
Py_DECREF(item);
/* BLI_snprintf(error_str, error_str_size, "sequence items should be of type %s", item_type_str); */
- PyErr_Format(PyExc_TypeError, "sequence items should be of type %s", item_type_str);
+ PyErr_Format(PyExc_TypeError, "expected sequence items of type %s, not %s", item_type_str, Py_TYPE(item)->tp_name);
return 0;
}
@@ -113,8 +114,9 @@ static int count_items(PyObject *seq)
int totitem= 0;
if (PySequence_Check(seq)) {
+ const int seq_size= PySequence_Size(seq);
int i;
- for (i= 0; i < PySequence_Length(seq); i++) {
+ for (i= 0; i < seq_size; i++) {
PyObject *item= PySequence_GetItem(seq, i);
totitem += count_items(item);
Py_DECREF(item);
@@ -183,7 +185,7 @@ static int validate_array_length(PyObject *rvalue, PointerRNA *ptr, PropertyRNA
if (tot != len) {
/* BLI_snprintf(error_str, error_str_size, "sequence must have length of %d", len); */
- PyErr_Format(PyExc_ValueError, "%s sequence must have %d items total", error_prefix, len);
+ PyErr_Format(PyExc_ValueError, "%s sequence must have %d items total, not %d", error_prefix, len, tot);
return 0;
}
}
@@ -206,44 +208,52 @@ static int validate_array(PyObject *rvalue, PointerRNA *ptr, PropertyRNA *prop,
return validate_array_length(rvalue, ptr, prop, lvalue_dim, totitem, error_prefix);
}
+static char *copy_value_single(PyObject *item, PointerRNA *ptr, PropertyRNA *prop, char *data, unsigned int item_size, int *index, ItemConvertFunc convert_item, RNA_SetIndexFunc rna_set_index)
+{
+ if (!data) {
+ char value[sizeof(int)];
+
+ convert_item(item, value);
+ rna_set_index(ptr, prop, *index, value);
+ *index = *index + 1;
+ }
+ else {
+ convert_item(item, data);
+ data += item_size;
+ }
+
+ return data;
+}
+
static char *copy_values(PyObject *seq, PointerRNA *ptr, PropertyRNA *prop, int dim, char *data, unsigned int item_size, int *index, ItemConvertFunc convert_item, RNA_SetIndexFunc rna_set_index)
{
unsigned int i;
int totdim= RNA_property_array_dimension(ptr, prop, NULL);
+ const int seq_size= PySequence_Size(seq);
- for (i= 0; i < PySequence_Length(seq); i++) {
+ for (i= 0; i < seq_size; i++) {
PyObject *item= PySequence_GetItem(seq, i);
if (dim + 1 < totdim) {
data= copy_values(item, ptr, prop, dim + 1, data, item_size, index, convert_item, rna_set_index);
}
else {
- if (!data) {
- char value[sizeof(int)];
-
- convert_item(item, value);
- rna_set_index(ptr, prop, *index, value);
- *index = *index + 1;
- }
- else {
- convert_item(item, data);
- data += item_size;
- }
+ data= copy_value_single(item, ptr, prop, data, item_size, index, convert_item, rna_set_index);
}
-
+
Py_DECREF(item);
}
return data;
}
-static int py_to_array(PyObject *py, PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, char *param_data, ItemTypeCheckFunc check_item_type, const char *item_type_str, int item_size, ItemConvertFunc convert_item, RNA_SetArrayFunc rna_set_array, const char *error_prefix)
+static int py_to_array(PyObject *py, PointerRNA *ptr, PropertyRNA *prop, char *param_data, ItemTypeCheckFunc check_item_type, const char *item_type_str, int item_size, ItemConvertFunc convert_item, RNA_SetArrayFunc rna_set_array, const char *error_prefix)
{
- int totdim, dim_size[MAX_ARRAY_DIMENSION];
+ /*int totdim, dim_size[MAX_ARRAY_DIMENSION];*/
int totitem;
char *data= NULL;
- totdim= RNA_property_array_dimension(ptr, prop, dim_size);
+ /*totdim= RNA_property_array_dimension(ptr, prop, dim_size);*/ /*UNUSED*/
if (!validate_array(py, ptr, prop, 0, check_item_type, item_type_str, &totitem, error_prefix)) {
return 0;
@@ -302,12 +312,22 @@ static int py_to_array_index(PyObject *py, PointerRNA *ptr, PropertyRNA *prop, i
index += arrayoffset;
- if (!validate_array(py, ptr, prop, lvalue_dim, check_item_type, item_type_str, &totitem, error_prefix))
- return 0;
-
- if (totitem)
- copy_values(py, ptr, prop, lvalue_dim, NULL, 0, &index, convert_item, rna_set_index);
+ if(lvalue_dim == totdim) { /* single item, assign directly */
+ if(!check_item_type(py)) {
+ PyErr_Format(PyExc_TypeError, "%s expected a %s type, not %s", error_prefix, item_type_str, Py_TYPE(py)->tp_name);
+ return 0;
+ }
+ copy_value_single(py, ptr, prop, NULL, 0, &index, convert_item, rna_set_index);
+ }
+ else {
+ if (!validate_array(py, ptr, prop, lvalue_dim, check_item_type, item_type_str, &totitem, error_prefix)) {
+ return 0;
+ }
+ if (totitem) {
+ copy_values(py, ptr, prop, lvalue_dim, NULL, 0, &index, convert_item, rna_set_index);
+ }
+ }
return 1;
}
@@ -329,7 +349,7 @@ static void py_to_bool(PyObject *py, char *data)
static int py_float_check(PyObject *py)
{
/* accept both floats and integers */
- return PyFloat_Check(py) || PyLong_Check(py);
+ return PyNumber_Check(py);
}
static int py_int_check(PyObject *py)
@@ -358,18 +378,18 @@ static void bool_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *
RNA_property_boolean_set_index(ptr, prop, index, *(int*)value);
}
-int pyrna_py_to_array(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, char *param_data, PyObject *py, const char *error_prefix)
+int pyrna_py_to_array(PointerRNA *ptr, PropertyRNA *prop, char *param_data, PyObject *py, const char *error_prefix)
{
int ret;
switch (RNA_property_type(prop)) {
case PROP_FLOAT:
- ret= py_to_array(py, ptr, prop, parms, param_data, py_float_check, "float", sizeof(float), py_to_float, (RNA_SetArrayFunc)RNA_property_float_set_array, error_prefix);
+ ret= py_to_array(py, ptr, prop, param_data, py_float_check, "float", sizeof(float), py_to_float, (RNA_SetArrayFunc)RNA_property_float_set_array, error_prefix);
break;
case PROP_INT:
- ret= py_to_array(py, ptr, prop, parms, param_data, py_int_check, "int", sizeof(int), py_to_int, (RNA_SetArrayFunc)RNA_property_int_set_array, error_prefix);
+ ret= py_to_array(py, ptr, prop, param_data, py_int_check, "int", sizeof(int), py_to_int, (RNA_SetArrayFunc)RNA_property_int_set_array, error_prefix);
break;
case PROP_BOOLEAN:
- ret= py_to_array(py, ptr, prop, parms, param_data, py_bool_check, "boolean", sizeof(int), py_to_bool, (RNA_SetArrayFunc)RNA_property_boolean_set_array, error_prefix);
+ ret= py_to_array(py, ptr, prop, param_data, py_bool_check, "boolean", sizeof(int), py_to_bool, (RNA_SetArrayFunc)RNA_property_boolean_set_array, error_prefix);
break;
default:
PyErr_SetString(PyExc_TypeError, "not an array type");
@@ -450,7 +470,7 @@ static PyObject *pyrna_py_from_array_internal(PointerRNA *ptr, PropertyRNA *prop
return NULL;
}
- PyTuple_SetItem(tuple, i, item);
+ PyTuple_SET_ITEM(tuple, i, item);
}
return tuple;
diff --git a/source/blender/python/intern/bpy_rna_callback.c b/source/blender/python/intern/bpy_rna_callback.c
index b2a7511f998..6d4cc035ece 100644
--- a/source/blender/python/intern/bpy_rna_callback.c
+++ b/source/blender/python/intern/bpy_rna_callback.c
@@ -26,7 +26,10 @@
#include "bpy_rna.h"
#include "bpy_util.h"
+#include "BLI_utildefines.h"
+
#include "DNA_screen_types.h"
+
#include "BKE_context.h"
#include "ED_space_api.h"
@@ -34,7 +37,7 @@
#define RNA_CAPSULE_ID "RNA_HANDLE"
#define RNA_CAPSULE_ID_INVALID "RNA_HANDLE_REMOVED"
-void cb_region_draw(const bContext *C, ARegion *ar, void *customdata)
+void cb_region_draw(const bContext *C, ARegion *UNUSED(ar), void *customdata)
{
PyObject *cb_func, *cb_args, *result;
PyGILState_STATE gilstate;
@@ -110,7 +113,7 @@ PyObject *pyrna_callback_remove(BPy_StructRNA *self, PyObject *args)
handle= PyCapsule_GetPointer(py_handle, RNA_CAPSULE_ID);
if(handle==NULL) {
- PyErr_SetString(PyExc_ValueError, "callback_remove(handle): NULL handle given, invalid or already removed.");
+ PyErr_SetString(PyExc_ValueError, "callback_remove(handle): NULL handle given, invalid or already removed");
return NULL;
}
diff --git a/source/blender/python/intern/bpy_util.c b/source/blender/python/intern/bpy_util.c
index 1a2d7b297b6..fb5b2a0d399 100644
--- a/source/blender/python/intern/bpy_util.c
+++ b/source/blender/python/intern/bpy_util.c
@@ -31,8 +31,8 @@
#include "../generic/py_capi_utils.h"
bContext* __py_context = NULL;
-bContext* BPy_GetContext(void) { return __py_context; };
-void BPy_SetContext(bContext *C) { __py_context= C; };
+bContext* BPy_GetContext(void) { return __py_context; }
+void BPy_SetContext(bContext *C) { __py_context= C; }
int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_class, BPY_class_attr_check* class_attrs, PyObject **py_class_attrs)
{
@@ -43,7 +43,7 @@ int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_c
if (base_class) {
if (!PyObject_IsSubclass(class, base_class)) {
PyObject *name= PyObject_GetAttrString(base_class, "__name__");
- PyErr_Format( PyExc_AttributeError, "expected %s subclass of class \"%s\"", class_type, name ? _PyUnicode_AsString(name):"<UNKNOWN>");
+ PyErr_Format(PyExc_AttributeError, "expected %s subclass of class \"%s\"", class_type, name ? _PyUnicode_AsString(name):"<UNKNOWN>");
Py_XDECREF(name);
return -1;
}
@@ -57,7 +57,7 @@ int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_c
if (item==NULL) {
if ((class_attrs->flag & BPY_CLASS_ATTR_OPTIONAL)==0) {
- PyErr_Format( PyExc_AttributeError, "expected %s class to have an \"%s\" attribute", class_type, class_attrs->name);
+ PyErr_Format(PyExc_AttributeError, "expected %s class to have an \"%s\" attribute", class_type, class_attrs->name);
return -1;
}
@@ -73,22 +73,22 @@ int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_c
switch(class_attrs->type) {
case 's':
if (PyUnicode_Check(item)==0) {
- PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" attribute to be a string", class_type, class_attrs->name);
+ PyErr_Format(PyExc_AttributeError, "expected %s class \"%s\" attribute to be a string", class_type, class_attrs->name);
return -1;
}
if(class_attrs->len != -1 && class_attrs->len < PyUnicode_GetSize(item)) {
- PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" attribute string to be shorter then %d", class_type, class_attrs->name, class_attrs->len);
+ PyErr_Format(PyExc_AttributeError, "expected %s class \"%s\" attribute string to be shorter then %d", class_type, class_attrs->name, class_attrs->len);
return -1;
}
break;
case 'l':
if (PyList_Check(item)==0) {
- PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" attribute to be a list", class_type, class_attrs->name);
+ PyErr_Format(PyExc_AttributeError, "expected %s class \"%s\" attribute to be a list", class_type, class_attrs->name);
return -1;
}
if(class_attrs->len != -1 && class_attrs->len < PyList_GET_SIZE(item)) {
- PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" attribute list to be shorter then %d", class_type, class_attrs->name, class_attrs->len);
+ PyErr_Format(PyExc_AttributeError, "expected %s class \"%s\" attribute list to be shorter then %d", class_type, class_attrs->name, class_attrs->len);
return -1;
}
break;
@@ -99,7 +99,7 @@ int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_c
fitem= item; /* py 3.x */
if (PyFunction_Check(fitem)==0) {
- PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" attribute to be a function", class_type, class_attrs->name);
+ PyErr_Format(PyExc_AttributeError, "expected %s class \"%s\" attribute to be a function", class_type, class_attrs->name);
return -1;
}
if (class_attrs->arg_count >= 0) { /* -1 if we dont care*/
@@ -108,7 +108,7 @@ int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_c
Py_DECREF(py_arg_count);
if (arg_count != class_attrs->arg_count) {
- PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" function to have %d args", class_type, class_attrs->name, class_attrs->arg_count);
+ PyErr_Format(PyExc_AttributeError, "expected %s class \"%s\" function to have %d args", class_type, class_attrs->name, class_attrs->arg_count);
return -1;
}
}
@@ -138,12 +138,16 @@ char *BPy_enum_as_string(EnumPropertyItem *item)
return cstring;
}
-int BPy_reports_to_error(ReportList *reports)
+short BPy_reports_to_error(ReportList *reports, const short clear)
{
char *report_str;
report_str= BKE_reports_string(reports, RPT_ERROR);
+ if(clear) {
+ BKE_reports_clear(reports);
+ }
+
if(report_str) {
PyErr_SetString(PyExc_SystemError, report_str);
MEM_freeN(report_str);
@@ -153,7 +157,7 @@ int BPy_reports_to_error(ReportList *reports)
}
-int BPy_errors_to_report(ReportList *reports)
+short BPy_errors_to_report(ReportList *reports)
{
PyObject *pystring;
PyObject *pystring_format= NULL; // workaround, see below
@@ -201,7 +205,7 @@ int BPy_errors_to_report(ReportList *reports)
}
/* array utility function */
-int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, char *error_prefix)
+int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, const char *error_prefix)
{
PyObject *value_fast;
int value_len;
@@ -215,7 +219,7 @@ int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, ch
if(value_len != length) {
Py_DECREF(value);
- PyErr_Format(PyExc_TypeError, "%s: invalid sequence length. expected %d, got %d.", error_prefix, length, value_len);
+ PyErr_Format(PyExc_TypeError, "%.200s: invalid sequence length. expected %d, got %d", error_prefix, length, value_len);
return -1;
}
@@ -240,14 +244,14 @@ int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, ch
}
else {
Py_DECREF(value_fast);
- PyErr_Format(PyExc_TypeError, "%s: internal error %s is invalid.", error_prefix, type->tp_name);
+ PyErr_Format(PyExc_TypeError, "%s: internal error %s is invalid", error_prefix, type->tp_name);
return -1;
}
Py_DECREF(value_fast);
if(PyErr_Occurred()) {
- PyErr_Format(PyExc_TypeError, "%s: one or more items could not be used as a %s.", error_prefix, type->tp_name);
+ PyErr_Format(PyExc_TypeError, "%s: one or more items could not be used as a %s", error_prefix, type->tp_name);
return -1;
}
diff --git a/source/blender/python/intern/bpy_util.h b/source/blender/python/intern/bpy_util.h
index ae215725087..c958082903e 100644
--- a/source/blender/python/intern/bpy_util.h
+++ b/source/blender/python/intern/bpy_util.h
@@ -57,8 +57,8 @@ char *BPy_enum_as_string(struct EnumPropertyItem *item);
#define BLANK_PYTHON_TYPE {PyVarObject_HEAD_INIT(NULL, 0) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
/* error reporting */
-int BPy_reports_to_error(struct ReportList *reports);
-int BPy_errors_to_report(struct ReportList *reports);
+short BPy_reports_to_error(struct ReportList *reports, const short clear);
+short BPy_errors_to_report(struct ReportList *reports);
/* TODO - find a better solution! */
struct bContext *BPy_GetContext(void);
diff --git a/source/blender/python/intern/stubs.c b/source/blender/python/intern/stubs.c
index d6dc5059342..c766e802dd0 100644
--- a/source/blender/python/intern/stubs.c
+++ b/source/blender/python/intern/stubs.c
@@ -27,11 +27,10 @@
*/
/* python, will come back */
-//void BPY_run_python_script() {}
-//void BPY_start_python() {}
-void BPY_call_importloader() {}
-//void BPY_free_compiled_text() {}
-void BPY_pyconstraint_eval() {}
-void BPY_pyconstraint_target() {}
-int BPY_is_pyconstraint() {return 0;}
-void BPY_pyconstraint_update() {}
+//void BPY_script_exec(void) {}
+//void BPY_python_start(void) {}
+//void BPY_text_free_code(void) {}
+void BPY_pyconstraint_exec(void) {}
+void BPY_pyconstraint_target(void) {}
+int BPY_is_pyconstraint(void) {return 0;}
+void BPY_pyconstraint_update(void) {}
diff --git a/source/blender/python/rna_dump.py b/source/blender/python/rna_dump.py
index 89240715584..df902886f30 100644
--- a/source/blender/python/rna_dump.py
+++ b/source/blender/python/rna_dump.py
@@ -18,6 +18,8 @@
#
# #**** END GPL LICENSE BLOCK #****
+# <pep8 compliant>
+
if 1:
# Print once every 1000
GEN_PATH = True
@@ -37,6 +39,7 @@ else:
seek_count = [0]
+
def seek(r, txt, recurs):
seek_count[0] += 1
@@ -71,52 +74,60 @@ def seek(r, txt, recurs):
print(txt + ' -> "' + str(r) + '"')
return
- try: keys = r.keys()
- except: keys = None
+ try:
+ keys = r.keys()
+ except:
+ keys = None
if keys != None:
if PRINT_DATA:
print(txt + '.keys() - ' + str(r.keys()))
- try: __members__ = dir(r)
- except: __members__ = []
+ try:
+ __members__ = dir(r)
+ except:
+ __members__ = []
for item in __members__:
- if item.startswith('__'):
+ if item.startswith("__"):
continue
- if GEN_PATH: newtxt = txt + '.' + item
+ if GEN_PATH:
+ newtxt = txt + '.' + item
- if item == 'rna_type' and VERBOSE_TYPE==False: # just avoid because it spits out loads of data
+ if item == 'rna_type' and VERBOSE_TYPE == False: # just avoid because it spits out loads of data
continue
- try: value = getattr(r, item)
- except: value = None
-
- seek( value, newtxt, recurs + 1)
+ value = getattr(r, item, None)
+ seek(value, newtxt, recurs + 1)
if keys:
for k in keys:
- if GEN_PATH: newtxt = txt + '["' + k + '"]'
- seek(r.__getitem__(k), newtxt, recurs+1)
+ if GEN_PATH:
+ newtxt = txt + '["' + k + '"]'
+ seek(r.__getitem__(k), newtxt, recurs + 1)
else:
- try: length = len( r )
- except: length = 0
-
- if VERBOSE==False and length >= 4:
- for i in (0, length-1):
- if i>0:
+ try:
+ length = len(r)
+ except:
+ length = 0
+
+ if VERBOSE == False and length >= 4:
+ for i in (0, length - 1):
+ if i > 0:
if PRINT_DATA:
- print((' '*len(txt)) + ' ... skipping '+str(length-2)+' items ...')
+ print((" " * len(txt)) + " ... skipping " + str(length - 2) + " items ...")
- if GEN_PATH: newtxt = txt + '[' + str(i) + ']'
- seek(r[i], newtxt, recurs+1)
+ if GEN_PATH:
+ newtxt = txt + '[' + str(i) + ']'
+ seek(r[i], newtxt, recurs + 1)
else:
for i in range(length):
- if GEN_PATH: newtxt = txt + '[' + str(i) + ']'
- seek(r[i], newtxt, recurs+1)
+ if GEN_PATH:
+ newtxt = txt + '[' + str(i) + ']'
+ seek(r[i], newtxt, recurs + 1)
seek(bpy.data, 'bpy.data', 0)
# seek(bpy.types, 'bpy.types', 0)
diff --git a/source/blender/quicktime/CMakeLists.txt b/source/blender/quicktime/CMakeLists.txt
index 8d993cbb7d6..7e7f61036c6 100644
--- a/source/blender/quicktime/CMakeLists.txt
+++ b/source/blender/quicktime/CMakeLists.txt
@@ -24,13 +24,25 @@
#
# ***** END GPL LICENSE BLOCK *****
-IF(USE_QTKIT)
- SET(SRC apple/qtkit_import.m apple/qtkit_export.m)
-ELSE(USE_QTKIT)
- SET(SRC apple/quicktime_import.c apple/quicktime_export.c)
-ENDIF(USE_QTKIT)
+if(USE_QTKIT)
+ set(SRC
+ apple/qtkit_import.m
+ apple/qtkit_export.m
-SET(INC
+ quicktime_export.h
+ quicktime_import.h
+ )
+else()
+ set(SRC
+ apple/quicktime_import.c
+ apple/quicktime_export.c
+
+ quicktime_export.h
+ quicktime_import.h
+ )
+endif()
+
+set(INC
.
../quicktime
../makesdna
@@ -49,6 +61,6 @@ SET(INC
${QUICKTIME_INC}
)
-ADD_DEFINITIONS(-DWITH_QUICKTIME)
+add_definitions(-DWITH_QUICKTIME)
-BLENDERLIB(bf_quicktime "${SRC}" "${INC}")
+blender_add_lib(bf_quicktime "${SRC}" "${INC}")
diff --git a/source/blender/quicktime/Makefile b/source/blender/quicktime/Makefile
deleted file mode 100644
index d0055780556..00000000000
--- a/source/blender/quicktime/Makefile
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/quicktime
-
-ifeq ($(OS), $(findstring $(OS), "windows, darwin"))
- DIRS = apple
-endif
-
-include nan_subdirs.mk
diff --git a/source/blender/quicktime/apple/Makefile b/source/blender/quicktime/apple/Makefile
deleted file mode 100644
index cdb00ab9ef2..00000000000
--- a/source/blender/quicktime/apple/Makefile
+++ /dev/null
@@ -1,63 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blenderqt
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-ifeq ($(OS), $(findstring $(OS), "darwin"))
- ifeq ($(USE_QTKIT),true)
- OCSRCS += $(wildcard *.m)
- endif
-endif
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL1_C_WARNINGS)
-
-CPPFLAGS += -DWITH_QUICKTIME
-
-ifeq ($(CPU),$(findstring $(CPU), "powerpc mips sparc"))
- CPPFLAGS += -DWORDS_BIGENDIAN
-else
- # alpha i386
- CPPFLAGS += -DWORDS_LITTLEENDIAN
-endif
-
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-# our own include
-CPPFLAGS += -I..
-
-# stuff needed by quicktime_[import|export].c
-CPPFLAGS += -I../../blenloader -I../../imbuf/intern -I../../imbuf
-CPPFLAGS += -I../../blenlib -I../../makesdna -I../../editors/include -I../../avi
-CPPFLAGS += -I../../blenkernel -I../../render/extern/include -I../../windowmanager -I../../makesrna
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-
diff --git a/source/blender/quicktime/apple/qtkit_export.m b/source/blender/quicktime/apple/qtkit_export.m
index 35f3629cb61..add280c6b64 100644
--- a/source/blender/quicktime/apple/qtkit_export.m
+++ b/source/blender/quicktime/apple/qtkit_export.m
@@ -41,6 +41,7 @@
#include "AUD_C-API.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_scene.h"
#include "BKE_report.h"
@@ -118,9 +119,10 @@ static QuicktimeCodecTypeDesc qtVideoCodecList[] = {
{kMPEG4VisualCodecType, 10, "MPEG4"},
{kH263CodecType, 11, "H.263"},
{kH264CodecType, 12, "H.264"},
+ {kAnimationCodecType, 13, "Animation"},
{0,0,NULL}};
-static int qtVideoCodecCount = 12;
+static int qtVideoCodecCount = 13;
int quicktime_get_num_videocodecs() {
return qtVideoCodecCount;
@@ -208,7 +210,7 @@ void makeqtstring (RenderData *rd, char *string) {
char txt[64];
strcpy(string, rd->pic);
- BLI_path_abs(string, G.sce);
+ BLI_path_abs(string, G.main->name);
BLI_make_existing_file(string);
@@ -222,7 +224,7 @@ void filepath_qt(char *string, RenderData *rd) {
if (string==NULL) return;
strcpy(string, rd->pic);
- BLI_path_abs(string, G.sce);
+ BLI_path_abs(string, G.main->name);
BLI_make_existing_file(string);
@@ -587,6 +589,7 @@ int append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int rect
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSBitmapImageRep *blBitmapFormatImage;
NSImage *frameImage;
+ OSStatus err = noErr;
unsigned char *from_Ptr,*to_Ptr;
int y,from_i,to_i;
@@ -628,8 +631,7 @@ int append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int rect
if (qtexport->audioFile) {
UInt32 audioPacketsConverted;
/* Append audio */
- while (((double)qtexport->audioTotalExportedFrames / (double) qtexport->audioInputFormat.mSampleRate)
- < ((double)(frame - rd->sfra)) / (((double)rd->frs_sec) / rd->frs_sec_base)) {
+ while (qtexport->audioTotalExportedFrames < qtexport->audioLastFrame) {
qtexport->audioBufferList.mNumberBuffers = 1;
qtexport->audioBufferList.mBuffers[0].mNumberChannels = qtexport->audioOutputFormat.mChannelsPerFrame;
@@ -637,7 +639,7 @@ int append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int rect
qtexport->audioBufferList.mBuffers[0].mData = qtexport->audioOutputBuffer;
audioPacketsConverted = AUDIOOUTPUTBUFFERSIZE / qtexport->audioCodecMaxOutputPacketSize;
- AudioConverterFillComplexBuffer(qtexport->audioConverter, AudioConverterInputCallback,
+ err = AudioConverterFillComplexBuffer(qtexport->audioConverter, AudioConverterInputCallback,
NULL, &audioPacketsConverted, &qtexport->audioBufferList, qtexport->audioOutputPktDesc);
if (audioPacketsConverted) {
AudioFileWritePackets(qtexport->audioFile, false, qtexport->audioBufferList.mBuffers[0].mDataByteSize,
@@ -656,6 +658,12 @@ int append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int rect
}
+ else {
+ //Error getting audio packets
+ BKE_reportf(reports, RPT_ERROR, "Unable to get further audio packets from frame %i, error = 0x%x",qtexport->audioTotalExportedFrames,err);
+ break;
+ }
+
}
}
[pool drain];
diff --git a/source/blender/quicktime/apple/qtkit_import.m b/source/blender/quicktime/apple/qtkit_import.m
index 41c4e0cc5a3..06cfb82e904 100644
--- a/source/blender/quicktime/apple/qtkit_import.m
+++ b/source/blender/quicktime/apple/qtkit_import.m
@@ -79,7 +79,7 @@ void quicktime_exit(void)
}
-int anim_is_quicktime (char *name)
+int anim_is_quicktime (const char *name)
{
NSAutoreleasePool *pool;
@@ -149,7 +149,7 @@ static ImBuf * nsImageToiBuf(NSImage *sourceImage, int width, int height)
NSEnumerator *enumerator;
NSImageRep *representation;
- ibuf = IMB_allocImBuf (width, height, 32, IB_rect, 0);
+ ibuf = IMB_allocImBuf (width, height, 32, IB_rect);
if (!ibuf) {
if(QTIME_DEBUG) printf("quicktime_import: could not allocate memory for the " \
"image.\n");
@@ -359,7 +359,7 @@ int startquicktime (struct anim *anim)
return -1;
}
- anim->qtime->ibuf = IMB_allocImBuf (anim->x, anim->y, 32, IB_rect, 0);
+ anim->qtime->ibuf = IMB_allocImBuf (anim->x, anim->y, 32, IB_rect);
qtTimeDuration = [[anim->qtime->media attributeForKey:QTMediaDurationAttribute] QTTimeValue];
anim->qtime->durationTime = qtTimeDuration.timeValue;
@@ -450,7 +450,7 @@ ImBuf *imb_quicktime_decode(unsigned char *mem, int size, int flags)
[bitmapImage setSize:bitmapSize];
/* allocate the image buffer */
- ibuf = IMB_allocImBuf(bitmapSize.width, bitmapSize.height, 32/*RGBA*/, 0, 0);
+ ibuf = IMB_allocImBuf(bitmapSize.width, bitmapSize.height, 32/*RGBA*/, 0);
if (!ibuf) {
fprintf(stderr,
"imb_cocoaLoadImage: could not allocate memory for the " \
diff --git a/source/blender/quicktime/apple/quicktime_export.c b/source/blender/quicktime/apple/quicktime_export.c
index c1291fc6949..40dc0df6b9b 100644
--- a/source/blender/quicktime/apple/quicktime_export.c
+++ b/source/blender/quicktime/apple/quicktime_export.c
@@ -40,6 +40,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_scene.h"
@@ -60,6 +61,9 @@
#include <Movies.h>
#include <QuickTimeComponents.h>
#include <TextUtils.h>
+#include <string.h>
+#include <memory.h>
+
#endif /* _WIN32 */
#ifdef __APPLE__
@@ -379,8 +383,8 @@ static void QT_StartAddVideoSamplesToMedia (const Rect *trackFrame, int rectx, i
SCTemporalSettings gTemporalSettings;
OSErr err = noErr;
- qtexport->ibuf = IMB_allocImBuf (rectx, recty, 32, IB_rect, 0);
- qtexport->ibuf2 = IMB_allocImBuf (rectx, recty, 32, IB_rect, 0);
+ qtexport->ibuf = IMB_allocImBuf (rectx, recty, 32, IB_rect);
+ qtexport->ibuf2 = IMB_allocImBuf (rectx, recty, 32, IB_rect);
err = NewGWorldFromPtr( &qtexport->theGWorld,
k32ARGBPixelFormat,
@@ -494,7 +498,7 @@ void filepath_qt(char *string, RenderData *rd) {
if (string==0) return;
strcpy(string, rd->pic);
- BLI_path_abs(string, G.sce);
+ BLI_path_abs(string, G.main->name);
BLI_make_existing_file(string);
@@ -620,7 +624,9 @@ void end_qt(void) {
//printf("Finished QuickTime movie.\n");
}
- ExitMoviesOnThread();
+#ifdef __APPLE__
+ ExitMoviesOnThread();
+#endif
if(qtexport) {
MEM_freeN(qtexport);
diff --git a/source/blender/quicktime/apple/quicktime_import.c b/source/blender/quicktime/apple/quicktime_import.c
index f9793f04b88..cec5a1735fc 100644
--- a/source/blender/quicktime/apple/quicktime_import.c
+++ b/source/blender/quicktime/apple/quicktime_import.c
@@ -48,6 +48,7 @@
#include <QTML.h>
#include <TextUtils.h>
#include <QuickTimeComponents.h>
+#include <QTLoadLibraryUtils.h>
#endif /* _WIN32 */
@@ -169,7 +170,7 @@ char *get_valid_qtname(char *name)
#endif /* _WIN32 */
-int anim_is_quicktime (char *name)
+int anim_is_quicktime (const char *name)
{
FSSpec theFSSpec;
char theFullPath[255];
@@ -335,7 +336,7 @@ ImBuf * qtime_fetchibuf (struct anim *anim, int position)
return (NULL);
}
- ibuf = IMB_allocImBuf (anim->x, anim->y, 32, IB_rect, 0);
+ ibuf = IMB_allocImBuf (anim->x, anim->y, 32, IB_rect);
rect = ibuf->rect;
SetMovieTimeValue(anim->qtime->movie, anim->qtime->frameIndex[position]);
@@ -496,7 +497,7 @@ int startquicktime (struct anim *anim)
return -1;
}
- anim->qtime->ibuf = IMB_allocImBuf (anim->x, anim->y, 32, IB_rect, 0);
+ anim->qtime->ibuf = IMB_allocImBuf (anim->x, anim->y, 32, IB_rect);
#ifdef _WIN32
err = NewGWorldFromPtr(&anim->qtime->offscreenGWorld,
@@ -610,7 +611,7 @@ ImBuf *imb_quicktime_decode(unsigned char *mem, int size, int flags)
ImageDescriptionHandle desc;
ComponentInstance dataHandler;
- PointerDataRef dataref = (PointerDataRef)NewHandle(sizeof(PointerDataRefRecord));
+ PointerDataRef dataref;
int x, y, depth;
int have_gw = FALSE;
@@ -633,11 +634,12 @@ ImBuf *imb_quicktime_decode(unsigned char *mem, int size, int flags)
unsigned char *from, *to;
#endif
- if (mem == NULL)
+ if (mem == NULL || !G.have_quicktime)
goto bail;
if(QTIME_DEBUG) printf("qt: attempt to load mem as image\n");
+ dataref= (PointerDataRef)NewHandle(sizeof(PointerDataRefRecord));
(**dataref).data = mem;
(**dataref).dataLength = size;
@@ -676,7 +678,7 @@ ImBuf *imb_quicktime_decode(unsigned char *mem, int size, int flags)
depth = (**desc).depth;
if (flags & IB_test) {
- ibuf = IMB_allocImBuf(x, y, depth, 0, 0);
+ ibuf = IMB_allocImBuf(x, y, depth, 0);
ibuf->ftype = QUICKTIME;
DisposeHandle((Handle)dataref);
if (gImporter != NULL) CloseComponent(gImporter);
@@ -684,8 +686,8 @@ ImBuf *imb_quicktime_decode(unsigned char *mem, int size, int flags)
}
#ifdef __APPLE__
- ibuf = IMB_allocImBuf (x, y, 32, IB_rect, 0);
- wbuf = IMB_allocImBuf (x, y, 32, IB_rect, 0);
+ ibuf = IMB_allocImBuf (x, y, 32, IB_rect);
+ wbuf = IMB_allocImBuf (x, y, 32, IB_rect);
err = NewGWorldFromPtr(&offGWorld,
k32ARGBPixelFormat,
@@ -693,7 +695,7 @@ ImBuf *imb_quicktime_decode(unsigned char *mem, int size, int flags)
(unsigned char *)wbuf->rect, x * 4);
#else
- ibuf = IMB_allocImBuf (x, y, 32, IB_rect, 0);
+ ibuf = IMB_allocImBuf (x, y, 32, IB_rect);
err = NewGWorldFromPtr(&offGWorld,
k32RGBAPixelFormat,
diff --git a/source/blender/quicktime/quicktime_export.h b/source/blender/quicktime/quicktime_export.h
index 1ca52b1bd10..ece19c2a521 100644
--- a/source/blender/quicktime/quicktime_export.h
+++ b/source/blender/quicktime/quicktime_export.h
@@ -59,14 +59,14 @@ void filepath_qt(char *string, struct RenderData *rd);
/*RNA helper functions */
void quicktime_verify_image_type(struct RenderData *rd); //used by RNA for defaults values init, if needed
/*Video codec type*/
-int quicktime_get_num_videocodecs();
+int quicktime_get_num_videocodecs(void);
QuicktimeCodecTypeDesc* quicktime_get_videocodecType_desc(int indexValue);
int quicktime_rnatmpvalue_from_videocodectype(int codecType);
int quicktime_videocodecType_from_rnatmpvalue(int rnatmpvalue);
#ifdef USE_QTKIT
/*Audio codec type*/
-int quicktime_get_num_audiocodecs();
+int quicktime_get_num_audiocodecs(void);
QuicktimeCodecTypeDesc* quicktime_get_audiocodecType_desc(int indexValue);
int quicktime_rnatmpvalue_from_audiocodectype(int codecType);
int quicktime_audiocodecType_from_rnatmpvalue(int rnatmpvalue);
diff --git a/source/blender/quicktime/quicktime_import.h b/source/blender/quicktime/quicktime_import.h
index 150aa07b1c2..bfc71b65127 100644
--- a/source/blender/quicktime/quicktime_import.h
+++ b/source/blender/quicktime/quicktime_import.h
@@ -62,7 +62,7 @@ char *get_valid_qtname(char *name);
// quicktime movie import functions
-int anim_is_quicktime (char *name);
+int anim_is_quicktime (const char *name);
int startquicktime (struct anim *anim);
void free_anim_quicktime (struct anim *anim);
ImBuf *qtime_fetchibuf (struct anim *anim, int position);
diff --git a/source/blender/readblenfile/BLO_readblenfile.h b/source/blender/readblenfile/BLO_readblenfile.h
index ca8a74abae4..14143db4bc5 100644
--- a/source/blender/readblenfile/BLO_readblenfile.h
+++ b/source/blender/readblenfile/BLO_readblenfile.h
@@ -73,7 +73,7 @@ blo_read_runtime(
struct ReportList *reports);
#define BLO_RESERVEDSIZE 12
-extern char *headerMagic;
+extern const char *headerMagic;
#ifdef __cplusplus
}
diff --git a/source/blender/readblenfile/CMakeLists.txt b/source/blender/readblenfile/CMakeLists.txt
index a6522ffa758..8d3633b4918 100644
--- a/source/blender/readblenfile/CMakeLists.txt
+++ b/source/blender/readblenfile/CMakeLists.txt
@@ -24,10 +24,20 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
+set(INC
+ .
+ ../blenloader
+ ../blenloader/intern
+ ../blenkernel
+ ../blenlib
+ ../makesdna
+ ../../kernel/gen_messaging
+)
+
+set(SRC
+ intern/BLO_readblenfile.c
-SET(INC
- . ../blenloader ../blenloader/intern ../blenkernel ../blenlib ../makesdna ../../kernel/gen_messaging
+ BLO_readblenfile.h
)
-BLENDERLIB(bf_readblenfile "${SRC}" "${INC}")
+blender_add_lib(bf_readblenfile "${SRC}" "${INC}")
diff --git a/source/blender/readblenfile/Makefile b/source/blender/readblenfile/Makefile
deleted file mode 100644
index f0a46d077a8..00000000000
--- a/source/blender/readblenfile/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/readblenfile
-DIRS = intern stub
-
-include nan_subdirs.mk
diff --git a/source/blender/readblenfile/SConscript b/source/blender/readblenfile/SConscript
index 57ee1866263..6d8749df1e2 100644
--- a/source/blender/readblenfile/SConscript
+++ b/source/blender/readblenfile/SConscript
@@ -5,4 +5,4 @@ sources = env.Glob('intern/*.c')
incs = '. ../blenloader ../blenloader/intern ../blenkernel ../blenlib ../makesdna ../../kernel/gen_messaging'
-env.BlenderLib ( 'bf_readblenfile', sources, Split(incs), [], libtype=['core','player'], priority = [0,195] )
+env.BlenderLib ( 'bf_readblenfile', sources, Split(incs), [], libtype=['core','player'], priority = [0,5] )
diff --git a/source/blender/readblenfile/intern/BLO_readblenfile.c b/source/blender/readblenfile/intern/BLO_readblenfile.c
index dfcdaf756f7..eddb82897d5 100644
--- a/source/blender/readblenfile/intern/BLO_readblenfile.c
+++ b/source/blender/readblenfile/intern/BLO_readblenfile.c
@@ -54,7 +54,7 @@
#include "BLI_blenlib.h"
/** Magic number for the file header */
-char *headerMagic = "BLENDFI";
+const char *headerMagic = "BLENDFI";
/**
* \brief Set the version number into the array.
diff --git a/source/blender/readblenfile/intern/Makefile b/source/blender/readblenfile/intern/Makefile
deleted file mode 100644
index dc59ca3b9ed..00000000000
--- a/source/blender/readblenfile/intern/Makefile
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = readblenfile
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_2_C_WARNINGS)
-
-# path to our own external headerfiles
-CPPFLAGS += -I..
-
-# external modules
-CPPFLAGS += -I../../../kernel/gen_messaging
-CPPFLAGS += -I../../readstreamglue
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
diff --git a/source/blender/readblenfile/stub/BLO_readblenfileSTUB.c b/source/blender/readblenfile/stub/BLO_readblenfileSTUB.c
index 33e9bfec446..c5b523b106f 100644
--- a/source/blender/readblenfile/stub/BLO_readblenfileSTUB.c
+++ b/source/blender/readblenfile/stub/BLO_readblenfileSTUB.c
@@ -41,7 +41,7 @@ int BLO_read_runtime( char *file);
BLO_readblenfilememory(
char *fromBuffer, int fromBufferSize)
{
-#ifndef NDEBUG
+#if defined(DEBUG)
fprintf(GEN_errorstream,
"Error BLO_readblenfilename is a stub\n");
#endif
@@ -52,7 +52,7 @@ BLO_readblenfilememory(
BLO_readblenfilename(
char *fileName)
{
-#ifndef NDEBUG
+#if defined(DEBUG)
fprintf(GEN_errorstream,
"Error BLO_readblenfilename is a stub\n");
#endif
@@ -63,7 +63,7 @@ BLO_readblenfilename(
BLO_readblenfilehandle(
int fileHandle)
{
-#ifndef NDEBUG
+#if defined(DEBUG)
fprintf(GEN_errorstream,
"Error BLO_readblenfilehandle is a stub\n");
#endif
@@ -74,7 +74,7 @@ BLO_readblenfilehandle(
BLO_is_a_runtime(
char *file)
{
-#ifndef NDEBUG
+#if defined(DEBUG)
fprintf(GEN_errorstream,
"Error BLO_is_a_runtime is a stub\n");
#endif
@@ -85,7 +85,7 @@ BLO_is_a_runtime(
BLO_read_runtime(
char *file)
{
-#ifndef NDEBUG
+#if defined(DEBUG)
fprintf(GEN_errorstream,
"Error BLO_read_runtime is a stub\n");
#endif
diff --git a/source/blender/readblenfile/stub/Makefile b/source/blender/readblenfile/stub/Makefile
deleted file mode 100644
index 94a55407418..00000000000
--- a/source/blender/readblenfile/stub/Makefile
+++ /dev/null
@@ -1,44 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = readblenfileSTUB
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_2_C_WARNINGS)
-CFLAGS += $(FIX_STUBS_WARNINGS)
-
-# path to our own external headerfiles
-CPPFLAGS += -I..
-
-# external modules
-CPPFLAGS += -I../../../kernel/gen_messaging
-
diff --git a/source/blender/readblenfile/test/Makefile b/source/blender/readblenfile/test/Makefile
deleted file mode 100644
index cc294ac60b3..00000000000
--- a/source/blender/readblenfile/test/Makefile
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = readblenfile
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-ALLTARGETS = $(OBJS) $(DIR)/$(DEBUG_DIR)test$(EXT)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_2_C_WARNINGS)
-
-# path to our own external headerfiles
-CPPFLAGS += -I..
-CPPFLAGS += -I../../readstreamglue
-
-$(DIR)/$(DEBUG_DIR)test$(EXT): $(OBJS) ../intern/BLO_readblenfile.c
- $(CC) $(LDFLAGS) -o $@ $(OBJS) $(OCGDIR)/blender/readblenfile/$(DEBUG_DIR)libreadblenfile.a
- $(DIR)/$(DEBUG_DIR)test$(EXT)
-
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt
index 8e0dbb457e8..4a3a73e7467 100644
--- a/source/blender/render/CMakeLists.txt
+++ b/source/blender/render/CMakeLists.txt
@@ -24,9 +24,10 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/source/*.c intern/raytrace/*.cpp)
+# remove warning until render branch merged.
+remove_strict_flags()
-SET(INC
+set(INC
intern/include
extern/include
../blenlib
@@ -35,30 +36,98 @@ SET(INC
../makesrna
../blenkernel
../imbuf
- ../include
../../kernel/gen_messaging
../../../intern/smoke/extern
../../../intern/guardedalloc
)
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ intern/raytrace/rayobject.cpp
+ intern/raytrace/rayobject_empty.cpp
+ intern/raytrace/rayobject_octree.cpp
+ intern/raytrace/rayobject_raycounter.cpp
+ intern/raytrace/rayobject_svbvh.cpp
+ intern/raytrace/rayobject_blibvh.cpp
+ intern/raytrace/rayobject_instance.cpp
+ intern/raytrace/rayobject_qbvh.cpp
+ intern/raytrace/rayobject_rtbuild.cpp
+ intern/raytrace/rayobject_vbvh.cpp
+ intern/source/convertblender.c
+ intern/source/envmap.c
+ intern/source/gammaCorrectionTables.c
+ intern/source/imagetexture.c
+ intern/source/initrender.c
+ intern/source/occlusion.c
+ intern/source/pipeline.c
+ intern/source/pixelblending.c
+ intern/source/pixelshading.c
+ intern/source/pointdensity.c
+ intern/source/rayshade.c
+ intern/source/rendercore.c
+ intern/source/render_texture.c
+ intern/source/renderdatabase.c
+ intern/source/shadbuf.c
+ intern/source/shadeinput.c
+ intern/source/shadeoutput.c
+ intern/source/sss.c
+ intern/source/strand.c
+ intern/source/sunsky.c
+ intern/source/volume_precache.c
+ intern/source/volumetric.c
+ intern/source/voxeldata.c
+ intern/source/zbuf.c
-IF(WITH_IMAGE_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_IMAGE_OPENEXR)
+ extern/include/RE_pipeline.h
+ extern/include/RE_render_ext.h
+ extern/include/RE_shader_ext.h
+ intern/include/envmap.h
+ intern/include/gammaCorrectionTables.h
+ intern/include/initrender.h
+ intern/include/occlusion.h
+ intern/include/pixelblending.h
+ intern/include/pixelshading.h
+ intern/include/pointdensity.h
+ intern/include/raycounter.h
+ intern/include/rayobject.h
+ intern/include/rayintersection.h
+ intern/include/raycounter.h
+ intern/include/render_types.h
+ intern/include/rendercore.h
+ intern/include/renderdatabase.h
+ intern/include/renderpipeline.h
+ intern/include/shadbuf.h
+ intern/include/shading.h
+ intern/include/sss.h
+ intern/include/strand.h
+ intern/include/sunsky.h
+ intern/include/texture.h
+ intern/include/volume_precache.h
+ intern/include/volumetric.h
+ intern/include/voxeldata.h
+ intern/include/zbuf.h
+ intern/raytrace/bvh.h
+ intern/raytrace/rayobject_hint.h
+ intern/raytrace/rayobject_internal.h
+ intern/raytrace/rayobject_rtbuild.h
+ intern/raytrace/reorganize.h
+ intern/raytrace/svbvh.h
+ intern/raytrace/vbvh.h
+)
+
+if(WITH_IMAGE_OPENEXR)
+ add_definitions(-DWITH_OPENEXR)
+endif()
-IF(WITH_QUICKTIME)
- LIST(APPEND INC ../quicktime ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+if(WITH_CODEC_QUICKTIME)
+ list(APPEND INC ../quicktime ${QUICKTIME_INC})
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-IF(APPLE)
- IF(CMAKE_OSX_ARCHITECTURES MATCHES "i386" OR CMAKE_OSX_ARCHITECTURES MATCHES "x86_64")
- SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -mfpmath=sse")
- SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -mfpmath=sse")
- ENDIF(CMAKE_OSX_ARCHITECTURES MATCHES "i386" OR CMAKE_OSX_ARCHITECTURES MATCHES "x86_64")
-ENDIF(APPLE)
+if(APPLE)
+ if(CMAKE_OSX_ARCHITECTURES MATCHES "i386" OR CMAKE_OSX_ARCHITECTURES MATCHES "x86_64")
+ set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -mfpmath=sse")
+ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -mfpmath=sse")
+ endif()
+endif()
-BLENDERLIB_NOLIST(bf_render "${SRC}" "${INC}")
+blender_add_lib_nolist(bf_render "${SRC}" "${INC}")
diff --git a/source/blender/render/Makefile b/source/blender/render/Makefile
deleted file mode 100644
index 7be54ac359f..00000000000
--- a/source/blender/render/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/render
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index b12e45ecd9c..fa71101cbe8 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -32,7 +32,6 @@
#include "DNA_listBase.h"
#include "DNA_vec_types.h"
-#include "BKE_utildefines.h"
#include "RNA_types.h"
struct bNodeTree;
@@ -145,7 +144,8 @@ typedef struct RenderStats {
int totface, totvert, totstrand, tothalo, totlamp, totpart;
short curfield, curblur, curpart, partsdone, convertdone;
double starttime, lastframetime;
- char *infostr, *statstr, scenename[32];
+ const char *infostr, *statstr;
+ char scenename[32];
} RenderStats;
@@ -159,6 +159,9 @@ struct Render *RE_GetRender(const char *name);
/* returns 1 while render is working (or renders called from within render) */
int RE_RenderInProgress(struct Render *re);
+/* assign default dummy callbacks */
+void RE_InitRenderCB(struct Render *re);
+
/* use free render as signal to do everything over (previews) */
void RE_FreeRender (struct Render *re);
/* only called on exit */
@@ -209,18 +212,18 @@ void RE_init_threadcount(Render *re);
void RE_TileProcessor(struct Render *re);
/* only RE_NewRender() needed, main Blender render calls */
-void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene, struct SceneRenderLayer *srl, unsigned int lay, int frame);
+void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene, struct SceneRenderLayer *srl, unsigned int lay, int frame, const short write_still);
void RE_BlenderAnim(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, int sfra, int efra, int tfra, struct ReportList *reports);
/* main preview render call */
void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene);
void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
-void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress);
+void RE_WriteRenderResult(RenderResult *rr, const char *filename, int compress);
struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty);
/* do a full sample buffer compo */
-void RE_MergeFullSample(struct Render *re, struct Scene *sce, struct bNodeTree *ntree);
+void RE_MergeFullSample(struct Render *re, struct Main *bmain, struct Scene *sce, struct bNodeTree *ntree);
/* ancient stars function... go away! */
void RE_make_stars(struct Render *re, struct Scene *scenev3d, void (*initfunc)(void),
@@ -233,7 +236,7 @@ void RE_display_draw_cb (struct Render *re, void *handle, void (*f)(void *handle
void RE_stats_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
void RE_progress_cb (struct Render *re, void *handle, void (*f)(void *handle, float));
void RE_test_break_cb (struct Render *re, void *handle, int (*f)(void *handle));
-void RE_error_cb (struct Render *re, void *handle, void (*f)(void *handle, char *str));
+void RE_error_cb (struct Render *re, void *handle, void (*f)(void *handle, const char *str));
/* should move to kernel once... still unsure on how/where */
float RE_filter_value(int type, float x);
@@ -284,18 +287,20 @@ typedef struct RenderEngine {
ListBase fullresult;
} RenderEngine;
-void RE_layer_load_from_file(RenderLayer *layer, struct ReportList *reports, char *filename);
-void RE_result_load_from_file(RenderResult *result, struct ReportList *reports, char *filename);
+void RE_layer_load_from_file(RenderLayer *layer, struct ReportList *reports, const char *filename, int x, int y);
+void RE_result_load_from_file(RenderResult *result, struct ReportList *reports, const char *filename);
struct RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h);
void RE_engine_update_result(RenderEngine *engine, struct RenderResult *result);
void RE_engine_end_result(RenderEngine *engine, struct RenderResult *result);
int RE_engine_test_break(RenderEngine *engine);
-void RE_engine_update_stats(RenderEngine *engine, char *stats, char *info);
+void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info);
void RE_engines_init(void);
void RE_engines_exit(void);
+int RE_is_rendering_allowed(struct Scene *scene, void *erh, void (*error)(void *handle, const char *str));
+
#endif /* RE_PIPELINE_H */
diff --git a/source/blender/render/extern/include/RE_raytrace.h b/source/blender/render/extern/include/RE_raytrace.h
deleted file mode 100644
index 215dd816a4e..00000000000
--- a/source/blender/render/extern/include/RE_raytrace.h
+++ /dev/null
@@ -1,214 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2007 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- * RE_raytrace.h: ray tracing api, can be used independently from the renderer.
- */
-
-#ifndef RE_RAYTRACE_H
-#define RE_RAYTRACE_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// #define RE_RAYCOUNTER /* enable counters per ray, usefull for measuring raytrace structures performance */
-
-#define RE_RAY_LCTS_MAX_SIZE 256
-#define RT_USE_LAST_HIT /* last shadow hit is reused before raycasting on whole tree */
-//#define RT_USE_HINT /* last hit object is reused before raycasting on whole tree */
-
-#ifdef RE_RAYCOUNTER
-
-typedef struct RayCounter RayCounter;
-struct RayCounter
-{
-
- struct
- {
- unsigned long long test, hit;
-
- } faces, bb, simd_bb, raycast, raytrace_hint, rayshadow_last_hit;
-};
-#endif
-
-/* Internals about raycasting structures can be found on intern/raytree.h */
-typedef struct RayObject RayObject;
-typedef struct Isect Isect;
-typedef struct RayHint RayHint;
-typedef struct RayTraceHint RayTraceHint;
-
-struct DerivedMesh;
-struct Mesh;
-struct VlakRen;
-struct ObjectInstanceRen;
-
-int RE_rayobject_raycast(RayObject *r, Isect *i);
-void RE_rayobject_add (RayObject *r, RayObject *);
-void RE_rayobject_done(RayObject *r);
-void RE_rayobject_free(RayObject *r);
-
-/* Extend min/max coords so that the rayobject is inside them */
-void RE_rayobject_merge_bb(RayObject *ob, float *min, float *max);
-
-/* initializes an hint for optiming raycast where it is know that a ray will pass by the given BB often the origin point */
-void RE_rayobject_hint_bb(RayObject *r, RayHint *hint, float *min, float *max);
-
-/* initializes an hint for optiming raycast where it is know that a ray will be contained inside the given cone*/
-/* void RE_rayobject_hint_cone(RayObject *r, RayHint *hint, float *); */
-
-/* RayObject constructors */
-RayObject* RE_rayobject_octree_create(int ocres, int size);
-RayObject* RE_rayobject_instance_create(RayObject *target, float transform[][4], void *ob, void *target_ob);
-RayObject* RE_rayobject_empty_create();
-
-RayObject* RE_rayobject_blibvh_create(int size); /* BLI_kdopbvh.c */
-RayObject* RE_rayobject_vbvh_create(int size); /* raytrace/rayobject_vbvh.c */
-RayObject* RE_rayobject_svbvh_create(int size); /* raytrace/rayobject_svbvh.c */
-RayObject* RE_rayobject_qbvh_create(int size); /* raytrace/rayobject_qbvh.c */
-
-
-/*
- * This ray object represents a triangle or a quad face.
- * All data needed to realize intersection is "localy" available.
- */
-typedef struct RayFace
-{
- float v1[4], v2[4], v3[4], v4[3];
- int quad;
- void *ob;
- void *face;
-
-} RayFace;
-
-#define RE_rayface_isQuad(a) ((a)->quad)
-
-RayObject* RE_rayface_from_vlak(RayFace *face, struct ObjectInstanceRen *obi, struct VlakRen *vlr);
-RayObject* RE_rayface_from_coords(RayFace *rayface, void *ob, void *face, float *co1, float *co2, float *co3, float *co4);
-
-
-/*
- * This ray object represents faces directly from a given VlakRen structure.
- * Thus allowing to save memory, but making code triangle intersection dependant on render structures
- */
-typedef struct VlakPrimitive
-{
- struct ObjectInstanceRen *ob;
- struct VlakRen *face;
-} VlakPrimitive;
-
-RayObject* RE_vlakprimitive_from_vlak(VlakPrimitive *face, struct ObjectInstanceRen *obi, struct VlakRen *vlr);
-
-
-
-/*
- * Raytrace hints
- */
-typedef struct LCTSHint LCTSHint;
-struct LCTSHint
-{
- int size;
- RayObject *stack[RE_RAY_LCTS_MAX_SIZE];
-};
-
-struct RayHint
-{
- union
- {
- LCTSHint lcts;
- } data;
-};
-
-
-/* Ray Intersection */
-struct Isect
-{
- float start[3];
- float vec[3];
- float labda;
-
- /* length of vec, configured by RE_rayobject_raycast */
- int bv_index[6];
- float idot_axis[3];
- float dist;
-
-/* float end[3]; - not used */
-
- float u, v;
-
- struct
- {
- void *ob;
- void *face;
- }
- hit, orig;
-
- RayObject *last_hit; /* last hit optimization */
-
-#ifdef RT_USE_HINT
- RayTraceHint *hint, *hit_hint;
-#endif
-
- short isect; /* which half of quad */
- short mode; /* RE_RAY_SHADOW, RE_RAY_MIRROR, RE_RAY_SHADOW_TRA */
- int lay; /* -1 default, set for layer lamps */
-
- int skip; /* RE_SKIP_CULLFACE */
-
- float col[4]; /* RGBA for shadow_tra */
-
- void *userdata;
-
- RayHint *hint;
-
-#ifdef RE_RAYCOUNTER
- RayCounter *raycounter;
-#endif
-};
-
-/* ray types */
-#define RE_RAY_SHADOW 0
-#define RE_RAY_MIRROR 1
-#define RE_RAY_SHADOW_TRA 2
-
-/* skip options */
-#define RE_SKIP_CULLFACE (1 << 0)
-
-/* if using this flag then *face should be a pointer to a VlakRen */
-#define RE_SKIP_VLR_NEIGHBOUR (1 << 1)
-#define RE_SKIP_VLR_RENDER_CHECK (1 << 2)
-#define RE_SKIP_VLR_NON_SOLID_MATERIAL (1 << 3)
-#define RE_SKIP_VLR_BAKE_CHECK (1 << 4)
-
-/* TODO use: FLT_MAX? */
-#define RE_RAYTRACE_MAXDIST 1e33
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /*__RE_RAYTRACE_H__*/
diff --git a/source/blender/render/extern/include/RE_shader_ext.h b/source/blender/render/extern/include/RE_shader_ext.h
index 6cab4a7ce03..2b451810e37 100644
--- a/source/blender/render/extern/include/RE_shader_ext.h
+++ b/source/blender/render/extern/include/RE_shader_ext.h
@@ -30,7 +30,6 @@
#ifndef RE_SHADER_EXT_H
#define RE_SHADER_EXT_H
-#include "RE_raytrace.h" /* For RE_RAYCOUNTER */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* this include is for shading and texture exports */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
@@ -52,7 +51,7 @@ typedef struct ShadeResult
float emit[3];
float diff[3]; /* no ramps, shadow, etc */
float spec[3];
- float shad[3];
+ float shad[4]; /* shad[3] is shadow intensity */
float ao[3];
float env[3];
float indirect[3];
@@ -189,7 +188,11 @@ typedef struct ShadeInput
/* node shaders... */
struct Tex;
struct MTex;
+/* this one uses nodes */
int multitex_ext(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres);
+/* nodes disabled */
+int multitex_ext_safe(struct Tex *tex, float *texvec, struct TexResult *texres);
+/* only for internal node usage */
int multitex_nodes(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres,
short thread, short which_output, struct ShadeInput *shi, struct MTex *mtex);
diff --git a/source/blender/render/intern/Makefile b/source/blender/render/intern/Makefile
deleted file mode 100644
index 4043902a40f..00000000000
--- a/source/blender/render/intern/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/render/intern
-DIRS = source raytrace
-
-include nan_subdirs.mk
diff --git a/source/blender/render/intern/include/raycounter.h b/source/blender/render/intern/include/raycounter.h
index 5377a1147af..1a9b91c17a8 100644
--- a/source/blender/render/intern/include/raycounter.h
+++ b/source/blender/render/intern/include/raycounter.h
@@ -26,16 +26,27 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#ifndef RE_RAYCOUNTER_H
#define RE_RAYCOUNTER_H
-#include "RE_raytrace.h"
+//#define RE_RAYCOUNTER /* enable counters per ray, usefull for measuring raytrace structures performance */
+#ifdef __cplusplus
+extern "C" {
+#endif
#ifdef RE_RAYCOUNTER
-/* #define RE_RC_INIT(isec, shi) (isec).count = re_rc_counter+(shi).thread */
-#define RE_RC_INIT(isec, shi) (isec).raycounter = &((shi).raycounter)
+/* ray counter functions */
+
+typedef struct RayCounter {
+ struct {
+ unsigned long long test, hit;
+ } faces, bb, simd_bb, raycast, raytrace_hint, rayshadow_last_hit;
+} RayCounter;
+
+#define RE_RC_INIT(isec, shi) (isec).raycounter = &((shi).shading.raycounter)
void RE_RC_INFO (RayCounter *rc);
void RE_RC_MERGE(RayCounter *rc, RayCounter *tmp);
#define RE_RC_COUNT(var) (var)++
@@ -44,12 +55,17 @@ extern RayCounter re_rc_counter[];
#else
-# define RE_RC_INIT(isec,shi)
-# define RE_RC_INFO(rc)
-# define RE_RC_MERGE(dest,src)
-# define RE_RC_COUNT(var)
+/* ray counter stubs */
+
+#define RE_RC_INIT(isec,shi)
+#define RE_RC_INFO(rc)
+#define RE_RC_MERGE(dest,src)
+#define RE_RC_COUNT(var)
#endif
+#ifdef __cplusplus
+}
+#endif
#endif
diff --git a/source/blender/render/intern/include/rayintersection.h b/source/blender/render/intern/include/rayintersection.h
new file mode 100644
index 00000000000..e0e31711fcb
--- /dev/null
+++ b/source/blender/render/intern/include/rayintersection.h
@@ -0,0 +1,124 @@
+/**
+ * $Id: rayintersection.h 34664 2011-02-06 00:49:58Z gsrb3d $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): André Pinto.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ * RE_raytrace.h: ray tracing api, can be used independently from the renderer.
+ */
+
+#ifndef __RENDER_RAYINTERSECTION_H__
+#define __RENDER_RAYINTERSECTION_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct RayObject;
+
+/* Ray Hints */
+
+#define RE_RAY_LCTS_MAX_SIZE 256
+#define RT_USE_LAST_HIT /* last shadow hit is reused before raycasting on whole tree */
+//#define RT_USE_HINT /* last hit object is reused before raycasting on whole tree */
+
+typedef struct LCTSHint {
+ int size;
+ struct RayObject *stack[RE_RAY_LCTS_MAX_SIZE];
+} LCTSHint;
+
+typedef struct RayHint {
+ union { LCTSHint lcts; } data;
+} RayHint;
+
+/* Ray Intersection */
+
+typedef struct Isect {
+ /* ray start, direction (normalized vector), and max distance. on hit,
+ the distance is modified to be the distance to the hit point. */
+ float start[3];
+ float dir[3];
+ float dist;
+
+ /* precomputed values to accelerate bounding box intersection */
+ int bv_index[6];
+ float idot_axis[3];
+
+ /* intersection options */
+ int mode; /* RE_RAY_SHADOW, RE_RAY_MIRROR, RE_RAY_SHADOW_TRA */
+ int lay; /* -1 default, set for layer lamps */
+ int skip; /* skip flags */
+ int check; /* check flags */
+ void *userdata; /* used by bake check */
+
+ /* hit information */
+ float u, v;
+ int isect; /* which half of quad */
+
+ struct {
+ void *ob;
+ void *face;
+ } hit, orig;
+
+ /* last hit optimization */
+ struct RayObject *last_hit;
+
+ /* hints */
+#ifdef RT_USE_HINT
+ RayTraceHint *hint, *hit_hint;
+#endif
+ RayHint *hint;
+
+ /* ray counter */
+#ifdef RE_RAYCOUNTER
+ RayCounter *raycounter;
+#endif
+} Isect;
+
+/* ray types */
+#define RE_RAY_SHADOW 0
+#define RE_RAY_MIRROR 1
+#define RE_RAY_SHADOW_TRA 2
+
+/* skip options */
+#define RE_SKIP_CULLFACE (1 << 0)
+/* if using this flag then *face should be a pointer to a VlakRen */
+#define RE_SKIP_VLR_NEIGHBOUR (1 << 1)
+
+/* check options */
+#define RE_CHECK_VLR_NONE 0
+#define RE_CHECK_VLR_RENDER 1
+#define RE_CHECK_VLR_NON_SOLID_MATERIAL 2
+#define RE_CHECK_VLR_BAKE 3
+
+/* arbitrary, but can't use e.g. FLT_MAX because of precision issues */
+#define RE_RAYTRACE_MAXDIST 1e15f
+#define RE_RAYTRACE_EPSILON 0.0f
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __RENDER_RAYINTERSECTION_H__ */
+
diff --git a/source/blender/render/intern/include/rayobject.h b/source/blender/render/intern/include/rayobject.h
index e16ec83fb61..61b7a23cf54 100644
--- a/source/blender/render/intern/include/rayobject.h
+++ b/source/blender/render/intern/include/rayobject.h
@@ -26,6 +26,7 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#ifndef RE_RAYOBJECT_H
#define RE_RAYOBJECT_H
@@ -33,176 +34,86 @@
extern "C" {
#endif
-#include "RE_raytrace.h"
-#include "render_types.h"
-#include <stdio.h>
-#include <float.h>
-
+struct Isect;
+struct ObjectInstanceRen;
+struct RayHint;
+struct VlakRen;
/* RayObject
-
- A ray object is everything where we can cast rays like:
- * a face/triangle
- * an octree
- * a bvh tree
- * an octree of bvh's
- * a bvh of bvh's
-
-
- All types of RayObjects can be created by implementing the
- callbacks of the RayObject.
-
- Due to high computing time evolved with casting on faces
- there is a special type of RayObject (named RayFace)
- which won't use callbacks like other generic nodes.
-
- In order to allow a mixture of RayFace+RayObjects,
- all RayObjects must be 4byte aligned, allowing us to use the
- 2 least significant bits (with the mask 0x03) to define the
- type of RayObject.
-
- This leads to 4 possible types of RayObject:
-
- addr&3 - type of object
- 0 Self (reserved for each structure)
- 1 RayFace (tri/quad primitive)
- 2 RayObject (generic with API callbacks)
- 3 VlakPrimitive
- (vlak primitive - to be used when we have a vlak describing the data
- eg.: on render code)
-
- 0 means it's reserved and has it own meaning inside each ray acceleration structure
- (this way each structure can use the allign offset to determine if a node represents a
- RayObject primitive, which can be used to save memory)
-
- You actually don't need to care about this if you are only using the API
- described on RE_raytrace.h
- */
-/* used to align a given ray object */
-#define RE_rayobject_align(o) ((RayObject*)(((intptr_t)o)&(~3)))
-
-/* used to unalign a given ray object */
-#define RE_rayobject_unalignRayFace(o) ((RayObject*)(((intptr_t)o)|1))
-#define RE_rayobject_unalignRayAPI(o) ((RayObject*)(((intptr_t)o)|2))
-#define RE_rayobject_unalignVlakPrimitive(o) ((RayObject*)(((intptr_t)o)|3))
-
-/* used to test the type of ray object */
-#define RE_rayobject_isAligned(o) ((((intptr_t)o)&3) == 0)
-#define RE_rayobject_isRayFace(o) ((((intptr_t)o)&3) == 1)
-#define RE_rayobject_isRayAPI(o) ((((intptr_t)o)&3) == 2)
-#define RE_rayobject_isVlakPrimitive(o) ((((intptr_t)o)&3) == 3)
-
-
-
-/*
- * This class is intended as a place holder for control, configuration of the rayobject like:
- * - stop building (TODO maybe when porting build to threads this could be implemented with some thread_cancel function)
- * - max number of threads and threads callback to use during build
- * ...
- */
-typedef int (*RE_rayobjectcontrol_test_break_callback)(void *data);
-typedef struct RayObjectControl RayObjectControl;
-struct RayObjectControl
-{
- void *data;
- RE_rayobjectcontrol_test_break_callback test_break;
-};
-
-/*
- * This rayobject represents a generic object. With it's own callbacks for raytrace operations.
- * It's suitable to implement things like LOD.
- */
-struct RayObject
-{
- struct RayObjectAPI *api;
-
- struct RayObjectControl control;
-};
+ Can be a face/triangle, bvh tree, object instance, etc. This is the
+ public API used by the renderer, see rayobject_internal.h for the
+ internal implementation details. */
+typedef struct RayObject RayObject;
+/* Intersection, see rayintersection.h */
+int RE_rayobject_raycast(RayObject *r, struct Isect *i);
-typedef int (*RE_rayobject_raycast_callback)(RayObject *, Isect *);
-typedef void (*RE_rayobject_add_callback)(RayObject *raytree, RayObject *rayobject);
-typedef void (*RE_rayobject_done_callback)(RayObject *);
-typedef void (*RE_rayobject_free_callback)(RayObject *);
-typedef void (*RE_rayobject_merge_bb_callback)(RayObject *, float *min, float *max);
-typedef float (*RE_rayobject_cost_callback)(RayObject *);
-typedef void (*RE_rayobject_hint_bb_callback)(RayObject *, RayHint *, float *, float *);
+/* Acceleration Structures */
-typedef struct RayObjectAPI
-{
- RE_rayobject_raycast_callback raycast;
- RE_rayobject_add_callback add;
- RE_rayobject_done_callback done;
- RE_rayobject_free_callback free;
- RE_rayobject_merge_bb_callback bb;
- RE_rayobject_cost_callback cost;
- RE_rayobject_hint_bb_callback hint_bb;
-
-} RayObjectAPI;
+RayObject* RE_rayobject_octree_create(int ocres, int size);
+RayObject* RE_rayobject_instance_create(RayObject *target, float transform[][4], void *ob, void *target_ob);
+RayObject* RE_rayobject_empty_create();
+RayObject* RE_rayobject_blibvh_create(int size); /* BLI_kdopbvh.c */
+RayObject* RE_rayobject_vbvh_create(int size); /* raytrace/rayobject_vbvh.c */
+RayObject* RE_rayobject_svbvh_create(int size); /* raytrace/rayobject_svbvh.c */
+RayObject* RE_rayobject_qbvh_create(int size); /* raytrace/rayobject_qbvh.c */
-/*
- * This function differs from RE_rayobject_raycast
- * RE_rayobject_intersect does NOT perform last-hit optimization
- * So this is probably a function to call inside raytrace structures
- */
-int RE_rayobject_intersect(RayObject *r, Isect *i);
+/* Building */
-/*
- * Returns distance ray must travel to hit the given bounding box
- * BB should be in format [2][3]
- */
-/* float RE_rayobject_bb_intersect(const Isect *i, const float *bb); */
-int RE_rayobject_bb_intersect_test(const Isect *i, const float *bb); /* same as bb_intersect but doens't calculates distance */
+void RE_rayobject_add(RayObject *r, RayObject *);
+void RE_rayobject_done(RayObject *r);
+void RE_rayobject_free(RayObject *r);
-/*
- * Returns the expected cost of raycast on this node, primitives have a cost of 1
- */
-float RE_rayobject_cost(RayObject *r);
+void RE_rayobject_set_control(RayObject *r, void *data, int (*test_break)(void *data));
+/* RayObject representing faces, all data is locally available instead
+ of referring to some external data structure, for possibly faster
+ intersection tests. */
-/*
- * Returns true if for some reason a heavy processing function should stop
- * (eg.: user asked to stop during a tree a build)
- */
-int RE_rayobjectcontrol_test_break(RayObjectControl *c);
+typedef struct RayFace {
+ float v1[4], v2[4], v3[4], v4[3];
+ int quad;
+ void *ob;
+ void *face;
+} RayFace;
+#define RE_rayface_isQuad(a) ((a)->quad)
-#define ISECT_EPSILON ((float)FLT_EPSILON)
+RayObject* RE_rayface_from_vlak(RayFace *face, struct ObjectInstanceRen *obi, struct VlakRen *vlr);
+/* RayObject representing faces directly from a given VlakRen structure. Thus
+ allowing to save memory, but making code triangle intersection dependant on
+ render structures. */
+typedef struct VlakPrimitive {
+ struct ObjectInstanceRen *ob;
+ struct VlakRen *face;
+} VlakPrimitive;
-#if !defined(_WIN32) && !defined(_WIN64)
+RayObject* RE_vlakprimitive_from_vlak(VlakPrimitive *face, struct ObjectInstanceRen *obi, struct VlakRen *vlr);
-#include <sys/time.h>
-#include <time.h>
+/* Bounding Box */
-#define BENCH(a,name) \
- { \
- double _t1, _t2; \
- struct timeval _tstart, _tend; \
- clock_t _clock_init = clock(); \
- gettimeofday ( &_tstart, NULL); \
- (a); \
- gettimeofday ( &_tend, NULL); \
- _t1 = ( double ) _tstart.tv_sec + ( double ) _tstart.tv_usec/ ( 1000*1000 ); \
- _t2 = ( double ) _tend.tv_sec + ( double ) _tend.tv_usec/ ( 1000*1000 ); \
- printf("BENCH:%s: %fs (real) %fs (cpu)\n", #name, _t2-_t1, (float)(clock()-_clock_init)/CLOCKS_PER_SEC);\
- }
-#else
+/* extend min/max coords so that the rayobject is inside them */
+void RE_rayobject_merge_bb(RayObject *ob, float *min, float *max);
-#define BENCH(a,name) (a)
+/* initializes an hint for optiming raycast where it is know that a ray will pass by the given BB often the origin point */
+void RE_rayobject_hint_bb(RayObject *r, struct RayHint *hint, float *min, float *max);
-#endif
+/* initializes an hint for optiming raycast where it is know that a ray will be contained inside the given cone*/
+/* void RE_rayobject_hint_cone(RayObject *r, struct RayHint *hint, float *); */
+/* Internals */
+#include "../raytrace/rayobject_internal.h"
#ifdef __cplusplus
}
#endif
-
#endif
+
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index b124102f50b..a599b1306fb 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -131,7 +131,8 @@ struct Render
ThreadRWMutex resultmutex;
/* window size, display rect, viewplane */
- int winx, winy;
+ int winx, winy; /* buffer width and height with percentage applied
+ * without border & crop. convert to long before multiplying together to avoid overflow. */
rcti disprect; /* part within winx winy */
rctf viewplane; /* mapped on winx winy */
float viewdx, viewdy; /* size of 1 pixel */
@@ -243,7 +244,7 @@ struct Render
int (*test_break)(void *handle);
void *tbh;
- void (*error)(void *handle, char *str);
+ void (*error)(void *handle, const char *str);
void *erh;
RenderStats i;
@@ -432,7 +433,9 @@ typedef struct StrandBuffer {
int overrideuv;
int flag, maxdepth;
float adaptcos, minwidth, widthfade;
-
+
+ float maxwidth; /* for cliptest of strands in blender unit */
+
float winmat[4][4];
int winx, winy;
} StrandBuffer;
@@ -604,6 +607,7 @@ typedef struct LampRen {
#define R_DIVIDE_24 32
/* vertex normals are tangent or view-corrected vector, for hair strands */
#define R_TANGENT 64
+#define R_TRACEBLE 128
/* strandbuffer->flag */
#define R_STRAND_BSPLINE 1
diff --git a/source/blender/render/intern/include/rendercore.h b/source/blender/render/intern/include/rendercore.h
index e9e30f64fdd..3b0929bbe27 100644
--- a/source/blender/render/intern/include/rendercore.h
+++ b/source/blender/render/intern/include/rendercore.h
@@ -48,6 +48,7 @@ struct RenderPart;
struct RenderLayer;
struct ObjectRen;
struct ListBase;
+struct RayObject;
/* ------------------------------------------------------------------------- */
@@ -95,7 +96,7 @@ int get_sample_layers(struct RenderPart *pa, struct RenderLayer *rl, struct Rend
extern void freeraytree(Render *re);
extern void makeraytree(Render *re);
-RayObject* makeraytree_object(Render *re, ObjectInstanceRen *obi);
+struct RayObject* makeraytree_object(Render *re, ObjectInstanceRen *obi);
extern void ray_shadow(ShadeInput *, LampRen *, float *);
extern void ray_trace(ShadeInput *, ShadeResult *);
diff --git a/source/blender/render/intern/include/renderdatabase.h b/source/blender/render/intern/include/renderdatabase.h
index 4c80616665d..8ef68d4a5c1 100644
--- a/source/blender/render/intern/include/renderdatabase.h
+++ b/source/blender/render/intern/include/renderdatabase.h
@@ -96,7 +96,7 @@ struct VertRen *RE_findOrAddVert(struct ObjectRen *obr, int nr);
struct StrandRen *RE_findOrAddStrand(struct ObjectRen *obr, int nr);
struct HaloRen *RE_findOrAddHalo(struct ObjectRen *obr, int nr);
struct HaloRen *RE_inithalo(struct Render *re, struct ObjectRen *obr, struct Material *ma, float *vec, float *vec1, float *orco, float hasize, float vectsize, int seed);
-struct HaloRen *RE_inithalo_particle(struct Render *re, struct ObjectRen *obr, struct DerivedMesh *dm, struct Material *ma, float *vec, float *vec1, float *orco, float *uvco, float hasize, float vectsize, int seed);
+struct HaloRen *RE_inithalo_particle(struct Render *re, struct ObjectRen *obr, struct DerivedMesh *dm, struct Material *ma, float *vec, float *vec1, float *orco, float *uvco, float hasize, float vectsize, int seed, float *pa_co);
struct StrandBuffer *RE_addStrandBuffer(struct ObjectRen *obr, int totvert);
struct ObjectRen *RE_addRenderObject(struct Render *re, struct Object *ob, struct Object *par, int index, int psysindex, int lay);
diff --git a/source/blender/render/intern/include/strand.h b/source/blender/render/intern/include/strand.h
index 66a5a7d1a0f..ffb2b8aa809 100644
--- a/source/blender/render/intern/include/strand.h
+++ b/source/blender/render/intern/include/strand.h
@@ -90,7 +90,7 @@ typedef struct StrandShadeCache StrandShadeCache;
void strand_eval_point(StrandSegment *sseg, StrandPoint *spoint);
void render_strand_segment(struct Render *re, float winmat[][4], struct StrandPart *spart, struct ZSpan *zspan, int totzspan, StrandSegment *sseg);
-void strand_minmax(struct StrandRen *strand, float *min, float *max);
+void strand_minmax(struct StrandRen *strand, float *min, float *max, float width);
struct StrandSurface *cache_strand_surface(struct Render *re, struct ObjectRen *obr, struct DerivedMesh *dm, float mat[][4], int timeoffset);
void free_strand_surface(struct Render *re);
diff --git a/source/blender/render/intern/include/texture.h b/source/blender/render/intern/include/texture.h
index fb941d1b7f3..8eb91f3299f 100644
--- a/source/blender/render/intern/include/texture.h
+++ b/source/blender/render/intern/include/texture.h
@@ -48,6 +48,7 @@ if(tex->saturation != 1.0f) { \
hsv_to_rgb(_hsv[0], _hsv[1], _hsv[2], &texres->tr, &texres->tg, &texres->tb); \
} \
+#define RGBTOBW(r,g,b) ( r*0.35 + g*0.45 + b*0.2 ) /* keep this in sync with gpu_shader_material.glsl:rgbtobw */
struct HaloRen;
struct ShadeInput;
diff --git a/source/blender/render/intern/include/volumetric.h b/source/blender/render/intern/include/volumetric.h
index 37b1bd7ca29..827aaf3672c 100644
--- a/source/blender/render/intern/include/volumetric.h
+++ b/source/blender/render/intern/include/volumetric.h
@@ -26,6 +26,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+struct Isect;
+struct ShadeInput;
+struct ShadeResult;
+
float vol_get_density(struct ShadeInput *shi, float *co);
void vol_get_scattering(ShadeInput *shi, float *scatter_col, float *co_);
diff --git a/source/blender/render/intern/raytrace/Makefile b/source/blender/render/intern/raytrace/Makefile
deleted file mode 100644
index 2da8038c610..00000000000
--- a/source/blender/render/intern/raytrace/Makefile
+++ /dev/null
@@ -1,69 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = render_raytrace
-DIR = $(OCGDIR)/blender/render
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# first /include is my own includes, second is the external interface.
-# The external modules follow after. There should be a nicer way to say this.
-CPPFLAGS += -I../include
-CPPFLAGS += -I../../extern/include
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../imbuf
-CPPFLAGS += -I../../../makesdna
-CPPFLAGS += -I../../../makesrna
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I../../../quicktime
-CPPFLAGS += -I../../../../kernel/gen_messaging
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-# not very neat: the rest of blender..
-CPPFLAGS += -I../../../editors/include
-CPPFLAGS += $(NAN_SDLCFLAGS)
-CPPFLAGS += -I../../../../../intern/smoke/extern
-
-ifeq ($(WITH_QUICKTIME), true)
- CPPFLAGS += -DWITH_QUICKTIME
-endif
-
-ifeq ($(WITH_FFMPEG),true)
- CPPFLAGS += -DWITH_FFMPEG
-endif
-
-ifeq ($(WITH_OPENEXR),true)
- CPPFLAGS += -DWITH_OPENEXR
-endif
-
-ifeq ($(WITH_BF_RAYOPTIMIZATION), true)
- CPPFLAGS += -D__SSE__
-endif
diff --git a/source/blender/render/intern/raytrace/bvh.h b/source/blender/render/intern/raytrace/bvh.h
index 133a3d4a005..dd23967297a 100644
--- a/source/blender/render/intern/raytrace/bvh.h
+++ b/source/blender/render/intern/raytrace/bvh.h
@@ -26,10 +26,16 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#include "rayobject.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_math.h"
+
#include "raycounter.h"
-#include "rayobject_rtbuild.h"
+#include "rayintersection.h"
+#include "rayobject.h"
#include "rayobject_hint.h"
+#include "rayobject_rtbuild.h"
#include <assert.h>
@@ -43,21 +49,49 @@
#ifdef __SSE__
inline int test_bb_group4(__m128 *bb_group, const Isect *isec)
{
-
const __m128 tmin0 = _mm_setzero_ps();
- const __m128 tmax0 = _mm_load1_ps(&isec->labda);
-
- const __m128 tmin1 = _mm_max_ps(tmin0, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[0]], _mm_load1_ps(&isec->start[0]) ), _mm_load1_ps(&isec->idot_axis[0])) );
- const __m128 tmax1 = _mm_min_ps(tmax0, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[1]], _mm_load1_ps(&isec->start[0]) ), _mm_load1_ps(&isec->idot_axis[0])) );
- const __m128 tmin2 = _mm_max_ps(tmin1, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[2]], _mm_load1_ps(&isec->start[1]) ), _mm_load1_ps(&isec->idot_axis[1])) );
- const __m128 tmax2 = _mm_min_ps(tmax1, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[3]], _mm_load1_ps(&isec->start[1]) ), _mm_load1_ps(&isec->idot_axis[1])) );
- const __m128 tmin3 = _mm_max_ps(tmin2, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[4]], _mm_load1_ps(&isec->start[2]) ), _mm_load1_ps(&isec->idot_axis[2])) );
- const __m128 tmax3 = _mm_min_ps(tmax2, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[5]], _mm_load1_ps(&isec->start[2]) ), _mm_load1_ps(&isec->idot_axis[2])) );
+ const __m128 tmax0 = _mm_set_ps1(isec->dist);
+
+ float start[3], idot_axis[3];
+ copy_v3_v3(start, isec->start);
+ copy_v3_v3(idot_axis, isec->idot_axis);
+
+ const __m128 tmin1 = _mm_max_ps(tmin0, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[0]], _mm_set_ps1(start[0]) ), _mm_set_ps1(idot_axis[0])) );
+ const __m128 tmax1 = _mm_min_ps(tmax0, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[1]], _mm_set_ps1(start[0]) ), _mm_set_ps1(idot_axis[0])) );
+ const __m128 tmin2 = _mm_max_ps(tmin1, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[2]], _mm_set_ps1(start[1]) ), _mm_set_ps1(idot_axis[1])) );
+ const __m128 tmax2 = _mm_min_ps(tmax1, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[3]], _mm_set_ps1(start[1]) ), _mm_set_ps1(idot_axis[1])) );
+ const __m128 tmin3 = _mm_max_ps(tmin2, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[4]], _mm_set_ps1(start[2]) ), _mm_set_ps1(idot_axis[2])) );
+ const __m128 tmax3 = _mm_min_ps(tmax2, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[5]], _mm_set_ps1(start[2]) ), _mm_set_ps1(idot_axis[2])) );
return _mm_movemask_ps(_mm_cmpge_ps(tmax3, tmin3));
}
#endif
+/*
+ * Determines the distance that the ray must travel to hit the bounding volume of the given node
+ * Based on Tactical Optimization of Ray/Box Intersection, by Graham Fyffe
+ * [http://tog.acm.org/resources/RTNews/html/rtnv21n1.html#art9]
+ */
+static int rayobject_bb_intersect_test(const Isect *isec, const float *_bb)
+{
+ const float *bb = _bb;
+
+ float t1x = (bb[isec->bv_index[0]] - isec->start[0]) * isec->idot_axis[0];
+ float t2x = (bb[isec->bv_index[1]] - isec->start[0]) * isec->idot_axis[0];
+ float t1y = (bb[isec->bv_index[2]] - isec->start[1]) * isec->idot_axis[1];
+ float t2y = (bb[isec->bv_index[3]] - isec->start[1]) * isec->idot_axis[1];
+ float t1z = (bb[isec->bv_index[4]] - isec->start[2]) * isec->idot_axis[2];
+ float t2z = (bb[isec->bv_index[5]] - isec->start[2]) * isec->idot_axis[2];
+
+ RE_RC_COUNT(isec->raycounter->bb.test);
+
+ if(t1x > t2y || t2x < t1y || t1x > t2z || t2x < t1z || t1y > t2z || t2y < t1z) return 0;
+ if(t2x < 0.0 || t2y < 0.0 || t2z < 0.0) return 0;
+ if(t1x > isec->dist || t1y > isec->dist || t1z > isec->dist) return 0;
+ RE_RC_COUNT(isec->raycounter->bb.hit);
+
+ return 1;
+}
/* bvh tree generics */
template<class Tree> static int bvh_intersect(Tree *obj, Isect *isec);
@@ -106,7 +140,7 @@ static float bvh_cost(Tree *obj)
/* bvh tree nodes generics */
template<class Node> static inline int bvh_node_hit_test(Node *node, Isect *isec)
{
- return RE_rayobject_bb_intersect_test(isec, (const float*)node->bb);
+ return rayobject_bb_intersect_test(isec, (const float*)node->bb);
}
@@ -131,7 +165,7 @@ static inline void bvh_node_merge_bb(Node *node, float *min, float *max)
*/
template<class Node> static inline void bvh_node_push_childs(Node *node, Isect *isec, Node **stack, int &stack_pos);
-template<class Node,int MAX_STACK_SIZE,bool TEST_ROOT>
+template<class Node,int MAX_STACK_SIZE,bool TEST_ROOT,bool SHADOW>
static int bvh_node_stack_raycast(Node *root, Isect *isec)
{
Node *stack[MAX_STACK_SIZE];
@@ -156,7 +190,7 @@ static int bvh_node_stack_raycast(Node *root, Isect *isec)
else
{
hit |= RE_rayobject_intersect( (RayObject*)node, isec);
- if(hit && isec->mode == RE_RAY_SHADOW) return hit;
+ if(SHADOW && hit) return hit;
}
}
return hit;
diff --git a/source/blender/render/intern/raytrace/rayobject.cpp b/source/blender/render/intern/raytrace/rayobject.cpp
index 84ec56e131a..dd4932f0bd9 100644
--- a/source/blender/render/intern/raytrace/rayobject.cpp
+++ b/source/blender/render/intern/raytrace/rayobject.cpp
@@ -26,127 +26,86 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#include <assert.h>
-#include "BKE_utildefines.h"
+#include "MEM_guardedalloc.h"
+
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "DNA_material_types.h"
-#include "RE_raytrace.h"
-#include "render_types.h"
+#include "rayintersection.h"
#include "rayobject.h"
#include "raycounter.h"
+#include "render_types.h"
-/*
- * Determines the distance that the ray must travel to hit the bounding volume of the given node
- * Based on Tactical Optimization of Ray/Box Intersection, by Graham Fyffe
- * [http://tog.acm.org/resources/RTNews/html/rtnv21n1.html#art9]
- */
-int RE_rayobject_bb_intersect_test(const Isect *isec, const float *_bb)
-{
- const float *bb = _bb;
-
- float t1x = (bb[isec->bv_index[0]] - isec->start[0]) * isec->idot_axis[0];
- float t2x = (bb[isec->bv_index[1]] - isec->start[0]) * isec->idot_axis[0];
- float t1y = (bb[isec->bv_index[2]] - isec->start[1]) * isec->idot_axis[1];
- float t2y = (bb[isec->bv_index[3]] - isec->start[1]) * isec->idot_axis[1];
- float t1z = (bb[isec->bv_index[4]] - isec->start[2]) * isec->idot_axis[2];
- float t2z = (bb[isec->bv_index[5]] - isec->start[2]) * isec->idot_axis[2];
-
- RE_RC_COUNT(isec->raycounter->bb.test);
-
- if(t1x > t2y || t2x < t1y || t1x > t2z || t2x < t1z || t1y > t2z || t2y < t1z) return 0;
- if(t2x < 0.0 || t2y < 0.0 || t2z < 0.0) return 0;
- if(t1x > isec->labda || t1y > isec->labda || t1z > isec->labda) return 0;
- RE_RC_COUNT(isec->raycounter->bb.hit);
-
- return 1;
-}
+/* RayFace
+ note we force always inline here, because compiler refuses to otherwise
+ because function is too long. Since this is code that is called billions
+ of times we really do want to inline. */
-/* only for self-intersecting test with current render face (where ray left) */
-static int intersection2(VlakRen *face, float r0, float r1, float r2, float rx1, float ry1, float rz1)
+MALWAYS_INLINE RayObject* rayface_from_coords(RayFace *rayface, void *ob, void *face, float *v1, float *v2, float *v3, float *v4)
{
- float co1[3], co2[3], co3[3], co4[3];
- float x0,x1,x2,t00,t01,t02,t10,t11,t12,t20,t21,t22;
- float m0, m1, m2, divdet, det, det1;
- float u1, v, u2;
+ rayface->ob = ob;
+ rayface->face = face;
- VECCOPY(co1, face->v1->co);
- VECCOPY(co2, face->v2->co);
- if(face->v4)
+ copy_v3_v3(rayface->v1, v1);
+ copy_v3_v3(rayface->v2, v2);
+ copy_v3_v3(rayface->v3, v3);
+
+ if(v4)
{
- VECCOPY(co3, face->v4->co);
- VECCOPY(co4, face->v3->co);
+ copy_v3_v3(rayface->v4, v4);
+ rayface->quad = 1;
}
else
{
- VECCOPY(co3, face->v3->co);
+ rayface->quad = 0;
}
- t00= co3[0]-co1[0];
- t01= co3[1]-co1[1];
- t02= co3[2]-co1[2];
- t10= co3[0]-co2[0];
- t11= co3[1]-co2[1];
- t12= co3[2]-co2[2];
-
- x0= t11*r2-t12*r1;
- x1= t12*r0-t10*r2;
- x2= t10*r1-t11*r0;
-
- divdet= t00*x0+t01*x1+t02*x2;
+ return RE_rayobject_unalignRayFace(rayface);
+}
- m0= rx1-co3[0];
- m1= ry1-co3[1];
- m2= rz1-co3[2];
- det1= m0*x0+m1*x1+m2*x2;
-
- if(divdet!=0.0f) {
- u1= det1/divdet;
+MALWAYS_INLINE void rayface_from_vlak(RayFace *rayface, ObjectInstanceRen *obi, VlakRen *vlr)
+{
+ rayface_from_coords(rayface, obi, vlr, vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4 ? vlr->v4->co : 0);
- if(u1<ISECT_EPSILON) {
- det= t00*(m1*r2-m2*r1);
- det+= t01*(m2*r0-m0*r2);
- det+= t02*(m0*r1-m1*r0);
- v= det/divdet;
+ if(obi->transform_primitives)
+ {
+ mul_m4_v3(obi->mat, rayface->v1);
+ mul_m4_v3(obi->mat, rayface->v2);
+ mul_m4_v3(obi->mat, rayface->v3);
- if(v<ISECT_EPSILON && (u1 + v) > -(1.0f+ISECT_EPSILON)) {
- return 1;
- }
- }
+ if(RE_rayface_isQuad(rayface))
+ mul_m4_v3(obi->mat, rayface->v4);
}
+}
- if(face->v4) {
+RayObject* RE_rayface_from_vlak(RayFace *rayface, ObjectInstanceRen *obi, VlakRen *vlr)
+{
+ return rayface_from_coords(rayface, obi, vlr, vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4 ? vlr->v4->co : 0);
+}
- t20= co3[0]-co4[0];
- t21= co3[1]-co4[1];
- t22= co3[2]-co4[2];
+/* VlakPrimitive */
- divdet= t20*x0+t21*x1+t22*x2;
- if(divdet!=0.0f) {
- u2= det1/divdet;
-
- if(u2<ISECT_EPSILON) {
- det= t20*(m1*r2-m2*r1);
- det+= t21*(m2*r0-m0*r2);
- det+= t22*(m0*r1-m1*r0);
- v= det/divdet;
-
- if(v<ISECT_EPSILON && (u2 + v) >= -(1.0f+ISECT_EPSILON)) {
- return 2;
- }
- }
- }
- }
- return 0;
+RayObject* RE_vlakprimitive_from_vlak(VlakPrimitive *face, struct ObjectInstanceRen *obi, struct VlakRen *vlr)
+{
+ face->ob = obi;
+ face->face = vlr;
+
+ return RE_rayobject_unalignVlakPrimitive(face);
}
-static inline int vlr_check_intersect(Isect *is, ObjectInstanceRen *obi, VlakRen *vlr)
+/* Checks for ignoring faces or materials */
+
+MALWAYS_INLINE int vlr_check_intersect(Isect *is, ObjectInstanceRen *obi, VlakRen *vlr)
{
/* for baking selected to active non-traceable materials might still
* be in the raytree */
- if(!(vlr->mat->mode & MA_TRACEBLE))
+ if(!(vlr->flag & R_TRACEBLE))
return 0;
/* I know... cpu cycle waste, might do smarter once */
@@ -156,7 +115,7 @@ static inline int vlr_check_intersect(Isect *is, ObjectInstanceRen *obi, VlakRen
return (is->lay & obi->lay);
}
-static inline int vlr_check_intersect_solid(Isect *is, ObjectInstanceRen* obi, VlakRen *vlr)
+MALWAYS_INLINE int vlr_check_intersect_solid(Isect *is, ObjectInstanceRen* obi, VlakRen *vlr)
{
/* solid material types only */
if (vlr->mat->material_type == MA_TYPE_SURFACE)
@@ -165,168 +124,223 @@ static inline int vlr_check_intersect_solid(Isect *is, ObjectInstanceRen* obi, V
return 0;
}
-static inline int vlr_check_bake(Isect *is, ObjectInstanceRen* obi, VlakRen *vlr)
+MALWAYS_INLINE int vlr_check_bake(Isect *is, ObjectInstanceRen* obi, VlakRen *vlr)
{
return (obi->obr->ob != is->userdata);
}
-static inline int rayface_check_cullface(RayFace *face, Isect *is)
-{
- float nor[3];
-
- /* don't intersect if the ray faces along the face normal */
- if(face->quad) normal_quad_v3( nor,face->v1, face->v2, face->v3, face->v4);
- else normal_tri_v3( nor,face->v1, face->v2, face->v3);
+/* Ray Triangle/Quad Intersection */
- return (INPR(nor, is->vec) < 0);
-}
-
-/* ray - triangle or quad intersection */
-/* this function shall only modify Isect if it detects an hit */
-static int intersect_rayface(RayObject *hit_obj, RayFace *face, Isect *is)
+MALWAYS_INLINE int isec_tri_quad(float start[3], float dir[3], RayFace *face, float uv[2], float *lambda)
{
- float co1[3],co2[3],co3[3],co4[3]={0};
- float x0,x1,x2,t00,t01,t02,t10,t11,t12,t20,t21,t22,r0,r1,r2;
- float m0, m1, m2, divdet, det1;
- float labda, u, v;
- short ok=0;
-
- if(is->orig.ob == face->ob && is->orig.face == face->face)
- return 0;
-
- /* check if we should intersect this face */
- if(is->skip & RE_SKIP_VLR_RENDER_CHECK)
- {
- if(vlr_check_intersect(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0)
- return 0;
- }
- else if(is->skip & RE_SKIP_VLR_NON_SOLID_MATERIAL)
- {
- if(vlr_check_intersect(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0)
- return 0;
- if(vlr_check_intersect_solid(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face) == 0)
- return 0;
- }
- else if(is->skip & RE_SKIP_VLR_BAKE_CHECK) {
- if(vlr_check_bake(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0)
- return 0;
- }
+ float co1[3], co2[3], co3[3], co4[3];
+ float t0[3], t1[3], x[3], r[3], m[3], u, v, divdet, det1, l;
+ int quad;
- if(is->skip & RE_SKIP_CULLFACE)
- {
- if(rayface_check_cullface(face, is) == 0)
- return 0;
- }
+ quad= RE_rayface_isQuad(face);
- RE_RC_COUNT(is->raycounter->faces.test);
+ copy_v3_v3(co1, face->v1);
+ copy_v3_v3(co2, face->v2);
+ copy_v3_v3(co3, face->v3);
- //Load coords
- VECCOPY(co1, face->v1);
- VECCOPY(co2, face->v2);
- if(RE_rayface_isQuad(face))
- {
- VECCOPY(co3, face->v4);
- VECCOPY(co4, face->v3);
- }
- else
- {
- VECCOPY(co3, face->v3);
- }
+ copy_v3_v3(r, dir);
- t00= co3[0]-co1[0];
- t01= co3[1]-co1[1];
- t02= co3[2]-co1[2];
- t10= co3[0]-co2[0];
- t11= co3[1]-co2[1];
- t12= co3[2]-co2[2];
-
- r0= is->vec[0];
- r1= is->vec[1];
- r2= is->vec[2];
-
- x0= t12*r1-t11*r2;
- x1= t10*r2-t12*r0;
- x2= t11*r0-t10*r1;
+ /* intersect triangle */
+ sub_v3_v3v3(t0, co3, co2);
+ sub_v3_v3v3(t1, co3, co1);
- divdet= t00*x0+t01*x1+t02*x2;
+ cross_v3_v3v3(x, r, t1);
+ divdet= dot_v3v3(t0, x);
- m0= is->start[0]-co3[0];
- m1= is->start[1]-co3[1];
- m2= is->start[2]-co3[2];
- det1= m0*x0+m1*x1+m2*x2;
+ sub_v3_v3v3(m, start, co3);
+ det1= dot_v3v3(m, x);
- if(divdet!=0.0f) {
-
+ if(divdet != 0.0f) {
divdet= 1.0f/divdet;
- u= det1*divdet;
- if(u<ISECT_EPSILON && u>-(1.0f+ISECT_EPSILON)) {
- float cros0, cros1, cros2;
-
- cros0= m1*t02-m2*t01;
- cros1= m2*t00-m0*t02;
- cros2= m0*t01-m1*t00;
- v= divdet*(cros0*r0 + cros1*r1 + cros2*r2);
+ v= det1*divdet;
- if(v<ISECT_EPSILON && (u + v) > -(1.0f+ISECT_EPSILON)) {
- labda= divdet*(cros0*t10 + cros1*t11 + cros2*t12);
+ if(v < RE_RAYTRACE_EPSILON && v > -(1.0f+RE_RAYTRACE_EPSILON)) {
+ float cros[3];
- if(labda>-ISECT_EPSILON && labda<is->labda) {
- ok= 1;
+ cross_v3_v3v3(cros, m, t0);
+ u= divdet*dot_v3v3(cros, r);
+
+ if(u < RE_RAYTRACE_EPSILON && (v + u) > -(1.0f+RE_RAYTRACE_EPSILON)) {
+ l= divdet*dot_v3v3(cros, t1);
+
+ /* check if intersection is within ray length */
+ if(l > -RE_RAYTRACE_EPSILON && l < *lambda) {
+ uv[0]= u;
+ uv[1]= v;
+ *lambda= l;
+ return 1;
}
}
}
}
- if(ok==0 && RE_rayface_isQuad(face)) {
-
- t20= co3[0]-co4[0];
- t21= co3[1]-co4[1];
- t22= co3[2]-co4[2];
+ /* intersect second triangle in quad */
+ if(quad) {
+ copy_v3_v3(co4, face->v4);
+ sub_v3_v3v3(t0, co3, co4);
+ divdet= dot_v3v3(t0, x);
- divdet= t20*x0+t21*x1+t22*x2;
- if(divdet!=0.0f) {
+ if(divdet != 0.0f) {
divdet= 1.0f/divdet;
- u = det1*divdet;
+ v = det1*divdet;
- if(u<ISECT_EPSILON && u>-(1.0f+ISECT_EPSILON)) {
- float cros0, cros1, cros2;
- cros0= m1*t22-m2*t21;
- cros1= m2*t20-m0*t22;
- cros2= m0*t21-m1*t20;
- v= divdet*(cros0*r0 + cros1*r1 + cros2*r2);
+ if(v < RE_RAYTRACE_EPSILON && v > -(1.0f+RE_RAYTRACE_EPSILON)) {
+ float cros[3];
+
+ cross_v3_v3v3(cros, m, t0);
+ u= divdet*dot_v3v3(cros, r);
- if(v<ISECT_EPSILON && (u + v) >-(1.0f+ISECT_EPSILON)) {
- labda= divdet*(cros0*t10 + cros1*t11 + cros2*t12);
+ if(u < RE_RAYTRACE_EPSILON && (v + u) > -(1.0f+RE_RAYTRACE_EPSILON)) {
+ l= divdet*dot_v3v3(cros, t1);
- if(labda>-ISECT_EPSILON && labda<is->labda) {
- ok= 2;
+ if(l >- RE_RAYTRACE_EPSILON && l < *lambda) {
+ uv[0]= u;
+ uv[1]= -(1.0f + v + u);
+ *lambda= l;
+ return 2;
}
}
}
}
}
+ return 0;
+}
+
+/* Simpler yes/no Ray Triangle/Quad Intersection */
+
+MALWAYS_INLINE int isec_tri_quad_neighbour(float start[3], float dir[3], RayFace *face)
+{
+ float co1[3], co2[3], co3[3], co4[3];
+ float t0[3], t1[3], x[3], r[3], m[3], u, v, divdet, det1;
+ int quad;
+
+ quad= RE_rayface_isQuad(face);
+
+ copy_v3_v3(co1, face->v1);
+ copy_v3_v3(co2, face->v2);
+ copy_v3_v3(co3, face->v3);
+
+ negate_v3_v3(r, dir); /* note, different than above function */
+
+ /* intersect triangle */
+ sub_v3_v3v3(t0, co3, co2);
+ sub_v3_v3v3(t1, co3, co1);
+
+ cross_v3_v3v3(x, r, t1);
+ divdet= dot_v3v3(t0, x);
+
+ sub_v3_v3v3(m, start, co3);
+ det1= dot_v3v3(m, x);
+
+ if(divdet != 0.0f) {
+ divdet= 1.0f/divdet;
+ v= det1*divdet;
+
+ if(v < RE_RAYTRACE_EPSILON && v > -(1.0f+RE_RAYTRACE_EPSILON)) {
+ float cros[3];
+
+ cross_v3_v3v3(cros, m, t0);
+ u= divdet*dot_v3v3(cros, r);
+
+ if(u < RE_RAYTRACE_EPSILON && (v + u) > -(1.0f+RE_RAYTRACE_EPSILON))
+ return 1;
+ }
+ }
+
+ /* intersect second triangle in quad */
+ if(quad) {
+ copy_v3_v3(co4, face->v4);
+ sub_v3_v3v3(t0, co3, co4);
+ divdet= dot_v3v3(t0, x);
+
+ if(divdet != 0.0f) {
+ divdet= 1.0f/divdet;
+ v = det1*divdet;
+
+ if(v < RE_RAYTRACE_EPSILON && v > -(1.0f+RE_RAYTRACE_EPSILON)) {
+ float cros[3];
+
+ cross_v3_v3v3(cros, m, t0);
+ u= divdet*dot_v3v3(cros, r);
+
+ if(u < RE_RAYTRACE_EPSILON && (v + u) > -(1.0f+RE_RAYTRACE_EPSILON))
+ return 2;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/* RayFace intersection with checks and neighbour verifaction included,
+ Isect is modified if the face is hit. */
+
+MALWAYS_INLINE int intersect_rayface(RayObject *hit_obj, RayFace *face, Isect *is)
+{
+ float dist, uv[2];
+ int ok= 0;
+
+ /* avoid self-intersection */
+ if(is->orig.ob == face->ob && is->orig.face == face->face)
+ return 0;
+
+ /* check if we should intersect this face */
+ if(is->check == RE_CHECK_VLR_RENDER)
+ {
+ if(vlr_check_intersect(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face) == 0)
+ return 0;
+ }
+ else if(is->check == RE_CHECK_VLR_NON_SOLID_MATERIAL)
+ {
+ if(vlr_check_intersect(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face) == 0)
+ return 0;
+ if(vlr_check_intersect_solid(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face) == 0)
+ return 0;
+ }
+ else if(is->check == RE_CHECK_VLR_BAKE) {
+ if(vlr_check_bake(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face) == 0)
+ return 0;
+ }
+
+ /* ray counter */
+ RE_RC_COUNT(is->raycounter->faces.test);
+
+ dist= is->dist;
+ ok= isec_tri_quad(is->start, is->dir, face, uv, &dist);
+
if(ok) {
- /* when a shadow ray leaves a face, it can be little outside the edges of it, causing
- intersection to be detected in its neighbour face */
+ /* when a shadow ray leaves a face, it can be little outside the edges
+ of it, causing intersection to be detected in its neighbour face */
if(is->skip & RE_SKIP_VLR_NEIGHBOUR)
{
- if(labda < 0.1f && is->orig.ob == face->ob)
+ if(dist < 0.1f && is->orig.ob == face->ob)
{
VlakRen * a = (VlakRen*)is->orig.face;
VlakRen * b = (VlakRen*)face->face;
- /* so there's a shared edge or vertex, let's intersect ray with face
- itself, if that's true we can safely return 1, otherwise we assume
- the intersection is invalid, 0 */
+ /* so there's a shared edge or vertex, let's intersect ray with
+ face itself, if that's true we can safely return 1, otherwise
+ we assume the intersection is invalid, 0 */
if(a->v1==b->v1 || a->v2==b->v1 || a->v3==b->v1 || a->v4==b->v1
|| a->v1==b->v2 || a->v2==b->v2 || a->v3==b->v2 || a->v4==b->v2
|| a->v1==b->v3 || a->v2==b->v3 || a->v3==b->v3 || a->v4==b->v3
- || (b->v4 && (a->v1==b->v4 || a->v2==b->v4 || a->v3==b->v4 || a->v4==b->v4)))
- if(!intersection2((VlakRen*)a, -r0, -r1, -r2, is->start[0], is->start[1], is->start[2]))
- {
- return 0;
+ || (b->v4 && (a->v1==b->v4 || a->v2==b->v4 || a->v3==b->v4 || a->v4==b->v4))) {
+ /* create RayFace from original face, transformed if necessary */
+ RayFace origface;
+ ObjectInstanceRen *ob= (ObjectInstanceRen*)is->orig.ob;
+ rayface_from_vlak(&origface, ob, (VlakRen*)is->orig.face);
+
+ if(!isec_tri_quad_neighbour(is->start, is->dir, &origface))
+ {
+ return 0;
+ }
}
}
}
@@ -334,8 +348,8 @@ static int intersect_rayface(RayObject *hit_obj, RayFace *face, Isect *is)
RE_RC_COUNT(is->raycounter->faces.hit);
is->isect= ok; // which half of the quad
- is->labda= labda;
- is->u= u; is->v= v;
+ is->dist= dist;
+ is->u= uv[0]; is->v= uv[1];
is->hit.ob = face->ob;
is->hit.face = face->face;
@@ -348,51 +362,18 @@ static int intersect_rayface(RayObject *hit_obj, RayFace *face, Isect *is)
return 0;
}
-RayObject* RE_rayface_from_vlak(RayFace *rayface, ObjectInstanceRen *obi, VlakRen *vlr)
-{
- return RE_rayface_from_coords(rayface, obi, vlr, vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4 ? vlr->v4->co : 0 );
-}
-
-RayObject* RE_rayface_from_coords(RayFace *rayface, void *ob, void *face, float *v1, float *v2, float *v3, float *v4)
-{
- rayface->ob = ob;
- rayface->face = face;
-
- VECCOPY(rayface->v1, v1);
- VECCOPY(rayface->v2, v2);
- VECCOPY(rayface->v3, v3);
- if(v4)
- {
- VECCOPY(rayface->v4, v4);
- rayface->quad = 1;
- }
- else
- {
- rayface->quad = 0;
- }
-
- return RE_rayobject_unalignRayFace(rayface);
-}
-
-RayObject* RE_vlakprimitive_from_vlak(VlakPrimitive *face, struct ObjectInstanceRen *obi, struct VlakRen *vlr)
-{
- face->ob = obi;
- face->face = vlr;
- return RE_rayobject_unalignVlakPrimitive(face);
-}
-
+/* Intersection */
int RE_rayobject_raycast(RayObject *r, Isect *isec)
{
int i;
+
RE_RC_COUNT(isec->raycounter->raycast.test);
- /* Setup vars used on raycast */
- isec->dist = len_v3(isec->vec);
-
+ /* setup vars used on raycast */
for(i=0; i<3; i++)
{
- isec->idot_axis[i] = 1.0f / isec->vec[i];
+ isec->idot_axis[i] = 1.0f / isec->dir[i];
isec->bv_index[2*i] = isec->idot_axis[i] < 0.0 ? 1 : 0;
isec->bv_index[2*i+1] = 1 - isec->bv_index[2*i];
@@ -402,7 +383,7 @@ int RE_rayobject_raycast(RayObject *r, Isect *isec)
}
#ifdef RT_USE_LAST_HIT
- /* Last hit heuristic */
+ /* last hit heuristic */
if(isec->mode==RE_RAY_SHADOW && isec->last_hit)
{
RE_RC_COUNT(isec->raycounter->rayshadow_last_hit.test);
@@ -429,6 +410,7 @@ int RE_rayobject_raycast(RayObject *r, Isect *isec)
#endif
return 1;
}
+
return 0;
}
@@ -443,98 +425,92 @@ int RE_rayobject_intersect(RayObject *r, Isect *i)
//TODO optimize (useless copy to RayFace to avoid duplicate code)
VlakPrimitive *face = (VlakPrimitive*) RE_rayobject_align(r);
RayFace nface;
- RE_rayface_from_vlak(&nface, face->ob, face->face);
-
- if(face->ob->transform_primitives)
- {
- mul_m4_v3(face->ob->mat, nface.v1);
- mul_m4_v3(face->ob->mat, nface.v2);
- mul_m4_v3(face->ob->mat, nface.v3);
- if(RE_rayface_isQuad(&nface))
- mul_m4_v3(face->ob->mat, nface.v4);
- }
+ rayface_from_vlak(&nface, face->ob, face->face);
return intersect_rayface(r, &nface, i);
}
else if(RE_rayobject_isRayAPI(r))
{
- r = RE_rayobject_align( r );
- return r->api->raycast( r, i );
+ r = RE_rayobject_align(r);
+ return r->api->raycast(r, i);
+ }
+ else {
+ assert(0);
+ return 0;
}
- else assert(0);
- return 0; /* wont reach this, quiet compilers */
}
+/* Building */
+
void RE_rayobject_add(RayObject *r, RayObject *o)
{
- r = RE_rayobject_align( r );
- return r->api->add( r, o );
+ r = RE_rayobject_align(r);
+ return r->api->add(r, o);
}
void RE_rayobject_done(RayObject *r)
{
- r = RE_rayobject_align( r );
- r->api->done( r );
+ r = RE_rayobject_align(r);
+ r->api->done(r);
}
void RE_rayobject_free(RayObject *r)
{
- r = RE_rayobject_align( r );
- r->api->free( r );
+ r = RE_rayobject_align(r);
+ r->api->free(r);
+}
+
+float RE_rayobject_cost(RayObject *r)
+{
+ if(RE_rayobject_isRayFace(r) || RE_rayobject_isVlakPrimitive(r))
+ {
+ return 1.0f;
+ }
+ else if(RE_rayobject_isRayAPI(r))
+ {
+ r = RE_rayobject_align(r);
+ return r->api->cost(r);
+ }
+ else {
+ assert(0);
+ return 1.0f;
+ }
}
+/* Bounding Boxes */
+
void RE_rayobject_merge_bb(RayObject *r, float *min, float *max)
{
if(RE_rayobject_isRayFace(r))
{
RayFace *face = (RayFace*) RE_rayobject_align(r);
- DO_MINMAX( face->v1, min, max );
- DO_MINMAX( face->v2, min, max );
- DO_MINMAX( face->v3, min, max );
- if(RE_rayface_isQuad(face)) DO_MINMAX( face->v4, min, max );
+ DO_MINMAX(face->v1, min, max);
+ DO_MINMAX(face->v2, min, max);
+ DO_MINMAX(face->v3, min, max);
+ if(RE_rayface_isQuad(face)) DO_MINMAX(face->v4, min, max);
}
else if(RE_rayobject_isVlakPrimitive(r))
{
VlakPrimitive *face = (VlakPrimitive*) RE_rayobject_align(r);
RayFace nface;
- RE_rayface_from_vlak(&nface, face->ob, face->face);
-
- if(face->ob->transform_primitives)
- {
- mul_m4_v3(face->ob->mat, nface.v1);
- mul_m4_v3(face->ob->mat, nface.v2);
- mul_m4_v3(face->ob->mat, nface.v3);
- if(RE_rayface_isQuad(&nface))
- mul_m4_v3(face->ob->mat, nface.v4);
- }
+ rayface_from_vlak(&nface, face->ob, face->face);
- DO_MINMAX( nface.v1, min, max );
- DO_MINMAX( nface.v2, min, max );
- DO_MINMAX( nface.v3, min, max );
- if(RE_rayface_isQuad(&nface)) DO_MINMAX( nface.v4, min, max );
+ DO_MINMAX(nface.v1, min, max);
+ DO_MINMAX(nface.v2, min, max);
+ DO_MINMAX(nface.v3, min, max);
+ if(RE_rayface_isQuad(&nface)) DO_MINMAX(nface.v4, min, max);
}
else if(RE_rayobject_isRayAPI(r))
{
- r = RE_rayobject_align( r );
- r->api->bb( r, min, max );
+ r = RE_rayobject_align(r);
+ r->api->bb(r, min, max);
}
- else assert(0);
+ else
+ assert(0);
}
-float RE_rayobject_cost(RayObject *r)
-{
- if(RE_rayobject_isRayFace(r) || RE_rayobject_isVlakPrimitive(r))
- {
- return 1.0;
- }
- else if(RE_rayobject_isRayAPI(r))
- {
- r = RE_rayobject_align( r );
- return r->api->cost( r );
- }
- else assert(0);
-}
+/* Hints */
void RE_rayobject_hint_bb(RayObject *r, RayHint *hint, float *min, float *max)
{
@@ -544,60 +520,30 @@ void RE_rayobject_hint_bb(RayObject *r, RayHint *hint, float *min, float *max)
}
else if(RE_rayobject_isRayAPI(r))
{
- r = RE_rayobject_align( r );
- return r->api->hint_bb( r, hint, min, max );
+ r = RE_rayobject_align(r);
+ return r->api->hint_bb(r, hint, min, max);
}
- else assert(0);
+ else
+ assert(0);
}
+/* RayObjectControl */
+
int RE_rayobjectcontrol_test_break(RayObjectControl *control)
{
if(control->test_break)
- return control->test_break( control->data );
+ return control->test_break(control->data);
return 0;
}
-
-/*
- * Empty raytree
- */
-static int RE_rayobject_empty_intersect(RayObject *o, Isect *is)
+void RE_rayobject_set_control(RayObject *r, void *data, RE_rayobjectcontrol_test_break_callback test_break)
{
- return 0;
-}
-
-static void RE_rayobject_empty_free(RayObject *o)
-{
-}
-
-static void RE_rayobject_empty_bb(RayObject *o, float *min, float *max)
-{
- return;
-}
-
-static float RE_rayobject_empty_cost(RayObject *o)
-{
- return 0.0;
+ if(RE_rayobject_isRayAPI(r))
+ {
+ r = RE_rayobject_align(r);
+ r->control.data = data;
+ r->control.test_break = test_break;
+ }
}
-static void RE_rayobject_empty_hint_bb(RayObject *o, RayHint *hint, float *min, float *max)
-{}
-
-static RayObjectAPI empty_api =
-{
- RE_rayobject_empty_intersect,
- NULL, //static void RE_rayobject_instance_add(RayObject *o, RayObject *ob);
- NULL, //static void RE_rayobject_instance_done(RayObject *o);
- RE_rayobject_empty_free,
- RE_rayobject_empty_bb,
- RE_rayobject_empty_cost,
- RE_rayobject_empty_hint_bb
-};
-
-static RayObject empty_raytree = { &empty_api, {0, 0} };
-
-RayObject *RE_rayobject_empty_create()
-{
- return RE_rayobject_unalignRayAPI( &empty_raytree );
-}
diff --git a/source/blender/render/intern/source/rayobject_blibvh.c b/source/blender/render/intern/raytrace/rayobject_blibvh.cpp
index d824719a2ac..61b7e16cbb8 100644
--- a/source/blender/render/intern/source/rayobject_blibvh.c
+++ b/source/blender/render/intern/raytrace/rayobject_blibvh.cpp
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id: rayobject_blibvh.cpp 34664 2011-02-06 00:49:58Z gsrb3d $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -29,11 +29,12 @@
#include <assert.h>
#include "MEM_guardedalloc.h"
-#include "BKE_utildefines.h"
+
#include "BLI_kdopbvh.h"
#include "BLI_math.h"
-#include "RE_raytrace.h"
-#include "render_types.h"
+#include "BLI_utildefines.h"
+
+#include "rayintersection.h"
#include "rayobject.h"
static int RE_rayobject_blibvh_intersect(RayObject *o, Isect *isec);
@@ -70,14 +71,12 @@ typedef struct BVHObject
RayObject **leafs, **next_leaf;
BVHTree *bvh;
float bb[2][3];
-
} BVHObject;
-
RayObject *RE_rayobject_blibvh_create(int size)
{
BVHObject *obj= (BVHObject*)MEM_callocN(sizeof(BVHObject), "BVHObject");
- assert( RE_rayobject_isAligned(obj) ); /* RayObject API assumes real data to be 4-byte aligned */
+ assert(RE_rayobject_isAligned(obj)); /* RayObject API assumes real data to be 4-byte aligned */
obj->rayobj.api = &bvh_api;
obj->bvh = BLI_bvhtree_new(size, 0.0, 4, 6);
@@ -106,7 +105,7 @@ static void bvh_callback(void *userdata, int index, const BVHTreeRay *ray, BVHTr
if(isec->mode == RE_RAY_SHADOW)
hit->dist = 0;
else
- hit->dist = isec->labda*isec->dist;
+ hit->dist = isec->dist;
}
}
@@ -119,11 +118,10 @@ static int RE_rayobject_blibvh_intersect(RayObject *o, Isect *isec)
data.isec = isec;
data.leafs = obj->leafs;
- VECCOPY(dir, isec->vec);
- normalize_v3(dir);
+ copy_v3_v3(dir, isec->dir);
hit.index = 0;
- hit.dist = isec->labda*isec->dist;
+ hit.dist = isec->dist;
return BLI_bvhtree_ray_cast(obj->bvh, isec->start, dir, 0.0, &hit, bvh_callback, (void*)&data);
}
@@ -138,7 +136,7 @@ static void RE_rayobject_blibvh_add(RayObject *o, RayObject *ob)
DO_MIN(min_max , obj->bb[0]);
DO_MAX(min_max+3, obj->bb[1]);
- BLI_bvhtree_insert(obj->bvh, obj->next_leaf - obj->leafs, min_max, 2 );
+ BLI_bvhtree_insert(obj->bvh, obj->next_leaf - obj->leafs, min_max, 2);
*(obj->next_leaf++) = ob;
}
@@ -164,6 +162,7 @@ static void RE_rayobject_blibvh_free(RayObject *o)
static void RE_rayobject_blibvh_bb(RayObject *o, float *min, float *max)
{
BVHObject *obj = (BVHObject*)o;
- DO_MIN( obj->bb[0], min );
- DO_MAX( obj->bb[1], max );
+ DO_MIN(obj->bb[0], min);
+ DO_MAX(obj->bb[1], max);
}
+
diff --git a/source/blender/render/intern/raytrace/rayobject_empty.cpp b/source/blender/render/intern/raytrace/rayobject_empty.cpp
new file mode 100644
index 00000000000..45ab23f0bdf
--- /dev/null
+++ b/source/blender/render/intern/raytrace/rayobject_empty.cpp
@@ -0,0 +1,75 @@
+/**
+ * $Id: rayobject_empty.cpp 34664 2011-02-06 00:49:58Z gsrb3d $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 1990-1998 NeoGeo BV.
+ * All rights reserved.
+ *
+ * Contributors: 2004/2005 Blender Foundation, full recode
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "rayobject.h"
+
+/*
+ * Empty raytree
+ */
+
+static int RE_rayobject_empty_intersect(RayObject *o, Isect *is)
+{
+ return 0;
+}
+
+static void RE_rayobject_empty_free(RayObject *o)
+{
+}
+
+static void RE_rayobject_empty_bb(RayObject *o, float *min, float *max)
+{
+ return;
+}
+
+static float RE_rayobject_empty_cost(RayObject *o)
+{
+ return 0.0;
+}
+
+static void RE_rayobject_empty_hint_bb(RayObject *o, RayHint *hint, float *min, float *max)
+{}
+
+static RayObjectAPI empty_api =
+{
+ RE_rayobject_empty_intersect,
+ NULL, //static void RE_rayobject_instance_add(RayObject *o, RayObject *ob);
+ NULL, //static void RE_rayobject_instance_done(RayObject *o);
+ RE_rayobject_empty_free,
+ RE_rayobject_empty_bb,
+ RE_rayobject_empty_cost,
+ RE_rayobject_empty_hint_bb
+};
+
+static RayObject empty_raytree = { &empty_api, {0, 0} };
+
+RayObject *RE_rayobject_empty_create()
+{
+ return RE_rayobject_unalignRayAPI( &empty_raytree );
+}
+
diff --git a/source/blender/render/intern/raytrace/rayobject_hint.h b/source/blender/render/intern/raytrace/rayobject_hint.h
index 1ea59d00bac..adb7d652276 100644
--- a/source/blender/render/intern/raytrace/rayobject_hint.h
+++ b/source/blender/render/intern/raytrace/rayobject_hint.h
@@ -26,6 +26,7 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#ifndef RE_RAYTRACE_RAYOBJECT_HINT_H
#define RE_RAYTRACE_RAYOBJECT_HINT_H
@@ -68,3 +69,4 @@ inline int hint_test_bb(HintFrustum &obj, float *Nmin, float *Nmax)
*/
#endif
+
diff --git a/source/blender/render/intern/source/rayobject_instance.c b/source/blender/render/intern/raytrace/rayobject_instance.cpp
index 25765c4763a..3ee8ff28442 100644
--- a/source/blender/render/intern/source/rayobject_instance.c
+++ b/source/blender/render/intern/raytrace/rayobject_instance.cpp
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id: rayobject_instance.cpp 34664 2011-02-06 00:49:58Z gsrb3d $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,12 +26,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#include <assert.h>
#include "MEM_guardedalloc.h"
-#include "BKE_utildefines.h"
+
#include "BLI_math.h"
-#include "RE_raytrace.h"
+#include "BLI_utildefines.h"
+
+#include "rayintersection.h"
#include "rayobject.h"
#define RE_COST_INSTANCE (1.0f)
@@ -87,42 +90,32 @@ RayObject *RE_rayobject_instance_create(RayObject *target, float transform[][4],
static int RE_rayobject_instance_intersect(RayObject *o, Isect *isec)
{
- //TODO
- // *there is probably a faster way to convert between coordinates
-
InstanceRayObject *obj = (InstanceRayObject*)o;
- int res;
- float start[3], vec[3], labda, dist;
- int changed = 0, i;
+ float start[3], dir[3], idot_axis[3], dist;
+ int changed = 0, i, res;
- //TODO - this is disabling self intersection on instances
+ // TODO - this is disabling self intersection on instances
if(isec->orig.ob == obj->ob && obj->ob)
{
changed = 1;
isec->orig.ob = obj->target_ob;
}
-
- VECCOPY( start, isec->start );
- VECCOPY( vec , isec->vec );
- labda = isec->labda;
- dist = isec->dist;
-
- //Transform to target coordinates system
- VECADD( isec->vec, isec->vec, isec->start );
+ // backup old values
+ copy_v3_v3(start, isec->start);
+ copy_v3_v3(dir, isec->dir);
+ copy_v3_v3(idot_axis, isec->idot_axis);
+ dist = isec->dist;
+ // transform to target coordinates system
mul_m4_v3(obj->global2target, isec->start);
- mul_m4_v3(obj->global2target, isec->vec );
-
- isec->dist = len_v3v3( isec->start, isec->vec );
- VECSUB( isec->vec, isec->vec, isec->start );
+ mul_mat3_m4_v3(obj->global2target, isec->dir);
+ isec->dist *= normalize_v3(isec->dir);
- isec->labda *= isec->dist / dist;
-
- //Update idot_axis and bv_index
+ // update idot_axis and bv_index
for(i=0; i<3; i++)
{
- isec->idot_axis[i] = 1.0f / isec->vec[i];
+ isec->idot_axis[i] = 1.0f / isec->dir[i];
isec->bv_index[2*i] = isec->idot_axis[i] < 0.0 ? 1 : 0;
isec->bv_index[2*i+1] = 1 - isec->bv_index[2*i];
@@ -131,17 +124,24 @@ static int RE_rayobject_instance_intersect(RayObject *o, Isect *isec)
isec->bv_index[2*i+1] = i+3*isec->bv_index[2*i+1];
}
- //Raycast
+ // raycast
res = RE_rayobject_intersect(obj->target, isec);
- //Restore coordinate space coords
+ // map dist into original coordinate space
if(res == 0)
{
- isec->labda = labda;
+ isec->dist = dist;
}
else
{
- isec->labda *= dist / isec->dist;
+ // note we don't just multiply dist, because of possible
+ // non-uniform scaling in the transform matrix
+ float vec[3];
+
+ mul_v3_v3fl(vec, isec->dir, isec->dist);
+ mul_mat3_m4_v3(obj->target2global, vec);
+
+ isec->dist = len_v3(vec);
isec->hit.ob = obj->ob;
#ifdef RT_USE_LAST_HIT
@@ -151,18 +151,18 @@ static int RE_rayobject_instance_intersect(RayObject *o, Isect *isec)
isec->last_hit = RE_rayobject_unalignRayAPI((RayObject*) obj);
#endif
}
- isec->dist = dist;
- VECCOPY( isec->start, start );
- VECCOPY( isec->vec, vec );
+
+ // restore values
+ copy_v3_v3(isec->start, start);
+ copy_v3_v3(isec->dir, dir);
+ copy_v3_v3(isec->idot_axis, idot_axis);
if(changed)
isec->orig.ob = obj->ob;
- //Update idot_axis and bv_index
+ // restore bv_index
for(i=0; i<3; i++)
{
- isec->idot_axis[i] = 1.0f / isec->vec[i];
-
isec->bv_index[2*i] = isec->idot_axis[i] < 0.0 ? 1 : 0;
isec->bv_index[2*i+1] = 1 - isec->bv_index[2*i];
@@ -205,3 +205,4 @@ static void RE_rayobject_instance_bb(RayObject *o, float *min, float *max)
DO_MINMAX(t, min, max);
}
}
+
diff --git a/source/blender/render/intern/raytrace/rayobject_internal.h b/source/blender/render/intern/raytrace/rayobject_internal.h
new file mode 100644
index 00000000000..6067be07c50
--- /dev/null
+++ b/source/blender/render/intern/raytrace/rayobject_internal.h
@@ -0,0 +1,128 @@
+
+#ifndef RE_RAYOBJECT_INTERNAL_H
+#define RE_RAYOBJECT_INTERNAL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RayObjectControl
+ *
+ * This class is intended as a place holder for control, configuration of the
+ * rayobject like:
+ * - stop building (TODO maybe when porting build to threads this could be
+ * implemented with some thread_cancel function)
+ * - max number of threads and threads callback to use during build
+ * ...
+ */
+
+typedef int (*RE_rayobjectcontrol_test_break_callback)(void *data);
+
+typedef struct RayObjectControl {
+ void *data;
+ RE_rayobjectcontrol_test_break_callback test_break;
+} RayObjectControl;
+
+/* Returns true if for some reason a heavy processing function should stop
+ * (eg.: user asked to stop during a tree a build)
+ */
+
+int RE_rayobjectcontrol_test_break(RayObjectControl *c);
+
+/* RayObject
+
+ A ray object is everything where we can cast rays like:
+ * a face/triangle
+ * an octree
+ * a bvh tree
+ * an octree of bvh's
+ * a bvh of bvh's
+
+
+ All types of RayObjects can be created by implementing the
+ callbacks of the RayObject.
+
+ Due to high computing time evolved with casting on faces
+ there is a special type of RayObject (named RayFace)
+ which won't use callbacks like other generic nodes.
+
+ In order to allow a mixture of RayFace+RayObjects,
+ all RayObjects must be 4byte aligned, allowing us to use the
+ 2 least significant bits (with the mask 0x03) to define the
+ type of RayObject.
+
+ This leads to 4 possible types of RayObject:
+
+ addr&3 - type of object
+ 0 Self (reserved for each structure)
+ 1 RayFace (tri/quad primitive)
+ 2 RayObject (generic with API callbacks)
+ 3 VlakPrimitive
+ (vlak primitive - to be used when we have a vlak describing the data
+ eg.: on render code)
+
+ 0 means it's reserved and has it own meaning inside each ray acceleration structure
+ (this way each structure can use the allign offset to determine if a node represents a
+ RayObject primitive, which can be used to save memory)
+ */
+
+/* used to test the type of ray object */
+#define RE_rayobject_isAligned(o) ((((intptr_t)o)&3) == 0)
+#define RE_rayobject_isRayFace(o) ((((intptr_t)o)&3) == 1)
+#define RE_rayobject_isRayAPI(o) ((((intptr_t)o)&3) == 2)
+#define RE_rayobject_isVlakPrimitive(o) ((((intptr_t)o)&3) == 3)
+
+/* used to align a given ray object */
+#define RE_rayobject_align(o) ((RayObject*)(((intptr_t)o)&(~3)))
+
+/* used to unalign a given ray object */
+#define RE_rayobject_unalignRayFace(o) ((RayObject*)(((intptr_t)o)|1))
+#define RE_rayobject_unalignRayAPI(o) ((RayObject*)(((intptr_t)o)|2))
+#define RE_rayobject_unalignVlakPrimitive(o) ((RayObject*)(((intptr_t)o)|3))
+
+/*
+ * This rayobject represents a generic object. With it's own callbacks for raytrace operations.
+ * It's suitable to implement things like LOD.
+ */
+
+struct RayObject {
+ struct RayObjectAPI *api;
+ struct RayObjectControl control;
+};
+
+typedef int (*RE_rayobject_raycast_callback)(RayObject *, struct Isect *);
+typedef void (*RE_rayobject_add_callback)(RayObject *raytree, RayObject *rayobject);
+typedef void (*RE_rayobject_done_callback)(RayObject *);
+typedef void (*RE_rayobject_free_callback)(RayObject *);
+typedef void (*RE_rayobject_merge_bb_callback)(RayObject *, float *min, float *max);
+typedef float (*RE_rayobject_cost_callback)(RayObject *);
+typedef void (*RE_rayobject_hint_bb_callback)(RayObject *, struct RayHint *, float *, float *);
+
+typedef struct RayObjectAPI {
+ RE_rayobject_raycast_callback raycast;
+ RE_rayobject_add_callback add;
+ RE_rayobject_done_callback done;
+ RE_rayobject_free_callback free;
+ RE_rayobject_merge_bb_callback bb;
+ RE_rayobject_cost_callback cost;
+ RE_rayobject_hint_bb_callback hint_bb;
+} RayObjectAPI;
+
+/*
+ * Returns the expected cost of raycast on this node, primitives have a cost of 1
+ */
+float RE_rayobject_cost(RayObject *r);
+
+/*
+ * This function differs from RE_rayobject_raycast
+ * RE_rayobject_intersect does NOT perform last-hit optimization
+ * So this is probably a function to call inside raytrace structures
+ */
+int RE_rayobject_intersect(RayObject *r, struct Isect *i);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/source/blender/render/intern/source/rayobject_octree.c b/source/blender/render/intern/raytrace/rayobject_octree.cpp
index 6d99d961e26..95721867b84 100644
--- a/source/blender/render/intern/source/rayobject_octree.c
+++ b/source/blender/render/intern/raytrace/rayobject_octree.cpp
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id: rayobject_octree.cpp 34664 2011-02-06 00:49:58Z gsrb3d $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -38,10 +38,10 @@
#include "DNA_material_types.h"
-#include "BKE_utildefines.h"
-
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+#include "rayintersection.h"
#include "rayobject.h"
/* ********** structs *************** */
@@ -125,8 +125,8 @@ static void calc_ocval_face(float *v1, float *v2, float *v3, float *v4, short x,
float min[3], max[3];
int ocmin, ocmax;
- VECCOPY(min, v1);
- VECCOPY(max, v1);
+ copy_v3_v3(min, v1);
+ copy_v3_v3(max, v1);
DO_MINMAX(v2, min, max);
DO_MINMAX(v3, min, max);
if(v4) {
@@ -191,7 +191,7 @@ static Branch *addbranch(Octree *oc, Branch *br, short ocb)
index= oc->branchcount>>12;
if(oc->adrbranch[index]==NULL)
- oc->adrbranch[index]= MEM_callocN(4096*sizeof(Branch), "new oc branch");
+ oc->adrbranch[index]= (Branch*)MEM_callocN(4096*sizeof(Branch), "new oc branch");
if(oc->branchcount>= BRANCH_ARRAY*4096) {
printf("error; octree branches full\n");
@@ -209,7 +209,7 @@ static Node *addnode(Octree *oc)
index= oc->nodecount>>12;
if(oc->adrnode[index]==NULL)
- oc->adrnode[index]= MEM_callocN(4096*sizeof(Node),"addnode");
+ oc->adrnode[index]= (Node*)MEM_callocN(4096*sizeof(Node),"addnode");
if(oc->nodecount> NODE_ARRAY*NODE_ARRAY) {
printf("error; octree nodes full\n");
@@ -464,7 +464,7 @@ static void RE_rayobject_octree_free(RayObject *tree)
RayObject *RE_rayobject_octree_create(int ocres, int size)
{
- Octree *oc= MEM_callocN(sizeof(Octree), "Octree");
+ Octree *oc= (Octree*)MEM_callocN(sizeof(Octree), "Octree");
assert( RE_rayobject_isAligned(oc) ); /* RayObject API assumes real data to be 4-byte aligned */
oc->rayobj.api = &octree_api;
@@ -504,11 +504,11 @@ static void octree_fill_rayface(Octree *oc, RayFace *face)
ocres2= oc->ocres*oc->ocres;
- VECCOPY(co1, face->v1);
- VECCOPY(co2, face->v2);
- VECCOPY(co3, face->v3);
+ copy_v3_v3(co1, face->v1);
+ copy_v3_v3(co2, face->v2);
+ copy_v3_v3(co3, face->v3);
if(face->v4)
- VECCOPY(co4, face->v4);
+ copy_v3_v3(co4, face->v4);
for(c=0;c<3;c++) {
rtf[0][c]= (co1[c]-oc->min[c])*ocfac[c] ;
@@ -620,13 +620,13 @@ static void RE_rayobject_octree_done(RayObject *tree)
RE_rayobject_merge_bb( RE_rayobject_unalignRayFace(oc->ro_nodes[c]), oc->min, oc->max);
/* Alloc memory */
- oc->adrbranch= MEM_callocN(sizeof(void *)*BRANCH_ARRAY, "octree branches");
- oc->adrnode= MEM_callocN(sizeof(void *)*NODE_ARRAY, "octree nodes");
+ oc->adrbranch= (Branch**)MEM_callocN(sizeof(void *)*BRANCH_ARRAY, "octree branches");
+ oc->adrnode= (Node**)MEM_callocN(sizeof(void *)*NODE_ARRAY, "octree nodes");
oc->adrbranch[0]=(Branch *)MEM_callocN(4096*sizeof(Branch), "makeoctree");
/* the lookup table, per face, for which nodes to fill in */
- oc->ocface= MEM_callocN( 3*ocres2 + 8, "ocface");
+ oc->ocface= (char*)MEM_callocN( 3*ocres2 + 8, "ocface");
memset(oc->ocface, 0, 3*ocres2);
for(c=0;c<3;c++) { /* octree enlarge, still needed? */
@@ -856,20 +856,20 @@ static int RE_rayobject_octree_intersect(RayObject *tree, Isect *is)
is->userdata= oc->userdata;
#endif
- VECCOPY( start, is->start );
- VECADDFAC( end, is->start, is->vec, is->labda );
- ldx= is->vec[0]*is->labda;
- olabda = is->labda;
+ copy_v3_v3( start, is->start );
+ madd_v3_v3v3fl( end, is->start, is->dir, is->dist );
+ ldx= is->dir[0]*is->dist;
+ olabda = is->dist;
u1= 0.0f;
u2= 1.0f;
/* clip with octree cube */
if(cliptest(-ldx, start[0]-oc->min[0], &u1,&u2)) {
if(cliptest(ldx, oc->max[0]-start[0], &u1,&u2)) {
- ldy= is->vec[1]*is->labda;
+ ldy= is->dir[1]*is->dist;
if(cliptest(-ldy, start[1]-oc->min[1], &u1,&u2)) {
if(cliptest(ldy, oc->max[1]-start[1], &u1,&u2)) {
- ldz = is->vec[2]*is->labda;
+ ldz = is->dir[2]*is->dist;
if(cliptest(-ldz, start[2]-oc->min[2], &u1,&u2)) {
if(cliptest(ldz, oc->max[2]-start[2], &u1,&u2)) {
c1=1;
@@ -990,18 +990,18 @@ static int RE_rayobject_octree_intersect(RayObject *tree, Isect *is)
if(no) {
/* calculate ray intersection with octree node */
- VECCOPY(vec1, vec2);
+ copy_v3_v3(vec1, vec2);
// dox,y,z is negative
vec2[0]= ox1-ddalabda*dox;
vec2[1]= oy1-ddalabda*doy;
vec2[2]= oz1-ddalabda*doz;
calc_ocval_ray(&ocval, (float)xo, (float)yo, (float)zo, vec1, vec2);
- //is->labda = (u1+ddalabda*(u2-u1))*olabda;
+ //is->dist = (u1+ddalabda*(u2-u1))*olabda;
if( testnode(oc, is, no, ocval) )
found = 1;
- if(is->labda < (u1+ddalabda*(u2-u1))*olabda)
+ if(is->dist < (u1+ddalabda*(u2-u1))*olabda)
return found;
}
diff --git a/source/blender/render/intern/raytrace/rayobject_qbvh.cpp b/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
index c510af540db..e8a118d3349 100644
--- a/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
@@ -26,7 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#include "MEM_guardedalloc.h"
+
+#include "BLI_utildefines.h"
+
#include "vbvh.h"
#include "svbvh.h"
#include "reorganize.h"
@@ -60,10 +64,10 @@ void bvh_done<QBVHTree>(QBVHTree *obj)
BLI_memarena_use_malloc(arena2);
BLI_memarena_use_align(arena2, 16);
- //Build and optimize the tree
- //TODO do this in 1 pass (half memory usage during building)
+ //Build and optimize the tree
+ //TODO do this in 1 pass (half memory usage during building)
VBVHNode *root = BuildBinaryVBVH<VBVHNode>(arena1, &obj->rayobj.control).transform(obj->builder);
-
+
if(RE_rayobjectcontrol_test_break(&obj->rayobj.control))
{
BLI_memarena_free(arena1);
@@ -71,28 +75,32 @@ void bvh_done<QBVHTree>(QBVHTree *obj)
return;
}
- pushup_simd<VBVHNode,4>(root);
+ pushup_simd<VBVHNode,4>(root);
+
obj->root = Reorganize_SVBVH<VBVHNode>(arena2).transform(root);
- //Cleanup
- BLI_memarena_free(arena1);
+ //Free data
+ BLI_memarena_free(arena1);
- rtbuild_free( obj->builder );
- obj->builder = NULL;
-
obj->node_arena = arena2;
- obj->cost = 1.0;
-}
+ obj->cost = 1.0;
+ rtbuild_free(obj->builder);
+ obj->builder = NULL;
+}
template<int StackSize>
int intersect(QBVHTree *obj, Isect* isec)
{
//TODO renable hint support
- if(RE_rayobject_isAligned(obj->root))
- return bvh_node_stack_raycast<SVBVHNode,StackSize,false>( obj->root, isec);
+ if(RE_rayobject_isAligned(obj->root)) {
+ if(isec->mode == RE_RAY_SHADOW)
+ return svbvh_node_stack_raycast<StackSize,true>(obj->root, isec);
+ else
+ return svbvh_node_stack_raycast<StackSize,false>(obj->root, isec);
+ }
else
- return RE_rayobject_intersect( (RayObject*) obj->root, isec );
+ return RE_rayobject_intersect((RayObject*)obj->root, isec);
}
template<class Tree>
@@ -132,13 +140,11 @@ RayObjectAPI* bvh_get_api(int maxstacksize)
return 0;
}
-
RayObject *RE_rayobject_qbvh_create(int size)
{
return bvh_create_tree<QBVHTree,DFS_STACK_SIZE>(size);
}
-
#else
RayObject *RE_rayobject_qbvh_create(int size)
diff --git a/source/blender/render/intern/source/rayobject_raycounter.c b/source/blender/render/intern/raytrace/rayobject_raycounter.cpp
index 16446bde501..21ee7e7b272 100644
--- a/source/blender/render/intern/source/rayobject_raycounter.c
+++ b/source/blender/render/intern/raytrace/rayobject_raycounter.cpp
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id: rayobject_raycounter.cpp 34664 2011-02-06 00:49:58Z gsrb3d $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,7 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#include "rayobject.h"
#include "raycounter.h"
diff --git a/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp b/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp
index 1c3cdd5919f..cdaaebc7f92 100644
--- a/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp
@@ -26,15 +26,18 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#include <assert.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#include "rayobject_rtbuild.h"
+
#include "MEM_guardedalloc.h"
+
#include "BLI_math.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
static bool selected_node(RTBuilder::Object *node)
{
@@ -91,13 +94,22 @@ void rtbuild_free(RTBuilder *b)
void rtbuild_add(RTBuilder *b, RayObject *o)
{
+ float bb[6];
+
assert( b->primitives.begin + b->primitives.maxsize != b->primitives.end );
+
+ INIT_MINMAX(bb, bb+3);
+ RE_rayobject_merge_bb(o, bb, bb+3);
+
+ /* skip objects with zero bounding box, they are of no use, and
+ will give problems in rtbuild_heuristic_object_split later */
+ if(len_squared_v3v3(bb, bb+3) == 0.0f)
+ return;
+ copy_v3_v3(b->primitives.end->bb, bb);
+ copy_v3_v3(b->primitives.end->bb+3, bb+3);
b->primitives.end->obj = o;
b->primitives.end->cost = RE_rayobject_cost(o);
-
- INIT_MINMAX(b->primitives.end->bb, b->primitives.end->bb+3);
- RE_rayobject_merge_bb(o, b->primitives.end->bb, b->primitives.end->bb+3);
for(int i=0; i<3; i++)
{
@@ -330,8 +342,8 @@ int rtbuild_heuristic_object_split(RTBuilder *b, int nchilds)
{
if(i == size-1)
{
- VECCOPY(sweep[i].bb, obj[i]->bb);
- VECCOPY(sweep[i].bb+3, obj[i]->bb+3);
+ copy_v3_v3(sweep[i].bb, obj[i]->bb);
+ copy_v3_v3(sweep[i].bb+3, obj[i]->bb+3);
sweep[i].cost = obj[i]->cost;
}
else
@@ -362,8 +374,12 @@ int rtbuild_heuristic_object_split(RTBuilder *b, int nchilds)
//Worst case heuristic (cost of each child is linear)
float hcost, left_side, right_side;
- left_side = bb_area(sweep_left.bb, sweep_left.bb+3)*(sweep_left.cost+logf((float)i));
- right_side= bb_area(sweep[i].bb, sweep[i].bb+3)*(sweep[i].cost+logf((float)size-i));
+ // not using log seems to have no impact on raytracing perf, but
+ // makes tree construction quicker, left out for now to test (brecht)
+ // left_side = bb_area(sweep_left.bb, sweep_left.bb+3)*(sweep_left.cost+logf((float)i));
+ // right_side= bb_area(sweep[i].bb, sweep[i].bb+3)*(sweep[i].cost+logf((float)size-i));
+ left_side = bb_area(sweep_left.bb, sweep_left.bb+3)*(sweep_left.cost);
+ right_side= bb_area(sweep[i].bb, sweep[i].bb+3)*(sweep[i].cost);
hcost = left_side+right_side;
assert(left_side >= 0);
diff --git a/source/blender/render/intern/raytrace/rayobject_svbvh.cpp b/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
index 647c5771e4f..c10da3ad8c0 100644
--- a/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
@@ -26,8 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
+
#include "vbvh.h"
#include "svbvh.h"
#include "reorganize.h"
@@ -75,7 +78,8 @@ void bvh_done<SVBVHTree>(SVBVHTree *obj)
//Build and optimize the tree
if(0)
{
- VBVHNode *root = BuildBinaryVBVH<VBVHNode>(arena1,&obj->rayobj.control).transform(obj->builder);
+ VBVHNode *root = BuildBinaryVBVH<VBVHNode>(arena1, &obj->rayobj.control).transform(obj->builder);
+
if(RE_rayobjectcontrol_test_break(&obj->rayobj.control))
{
BLI_memarena_free(arena1);
@@ -86,11 +90,11 @@ void bvh_done<SVBVHTree>(SVBVHTree *obj)
reorganize(root);
remove_useless(root, &root);
bvh_refit(root);
-
+
pushup(root);
pushdown(root);
pushup_simd<VBVHNode,4>(root);
-
+
obj->root = Reorganize_SVBVH<VBVHNode>(arena2).transform(root);
}
else
@@ -98,6 +102,7 @@ void bvh_done<SVBVHTree>(SVBVHTree *obj)
//Finds the optimal packing of this tree using a given cost model
//TODO this uses quite a lot of memory, find ways to reduce memory usage during building
OVBVHNode *root = BuildBinaryVBVH<OVBVHNode>(arena1,&obj->rayobj.control).transform(obj->builder);
+
if(RE_rayobjectcontrol_test_break(&obj->rayobj.control))
{
BLI_memarena_free(arena1);
@@ -108,15 +113,13 @@ void bvh_done<SVBVHTree>(SVBVHTree *obj)
VBVH_optimalPackSIMD<OVBVHNode,PackCost>(PackCost()).transform(root);
obj->root = Reorganize_SVBVH<OVBVHNode>(arena2).transform(root);
}
-
//Free data
BLI_memarena_free(arena1);
obj->node_arena = arena2;
obj->cost = 1.0;
-
-
+
rtbuild_free( obj->builder );
obj->builder = NULL;
}
@@ -125,8 +128,12 @@ template<int StackSize>
int intersect(SVBVHTree *obj, Isect* isec)
{
//TODO renable hint support
- if(RE_rayobject_isAligned(obj->root))
- return bvh_node_stack_raycast<SVBVHNode,StackSize,false>( obj->root, isec);
+ if(RE_rayobject_isAligned(obj->root)) {
+ if(isec->mode == RE_RAY_SHADOW)
+ return svbvh_node_stack_raycast<StackSize,true>(obj->root, isec);
+ else
+ return svbvh_node_stack_raycast<StackSize,false>(obj->root, isec);
+ }
else
return RE_rayobject_intersect( (RayObject*) obj->root, isec );
}
@@ -172,6 +179,7 @@ RayObject *RE_rayobject_svbvh_create(int size)
{
return bvh_create_tree<SVBVHTree,DFS_STACK_SIZE>(size);
}
+
#else
RayObject *RE_rayobject_svbvh_create(int size)
diff --git a/source/blender/render/intern/raytrace/rayobject_vbvh.cpp b/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
index de1e6d349be..df5842db2bf 100644
--- a/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
@@ -26,25 +26,29 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
int tot_pushup = 0;
int tot_pushdown = 0;
int tot_hints = 0;
-
#include <assert.h>
-#include "rayobject.h"
-#include "rayobject_rtbuild.h"
-#include "RE_raytrace.h"
-#include "BLI_memarena.h"
+
#include "MEM_guardedalloc.h"
+
#include "BKE_global.h"
-#include "BKE_utildefines.h"
+
#include "BLI_math.h"
+#include "BLI_memarena.h"
+#include "BLI_utildefines.h"
+
+#include "rayintersection.h"
+#include "rayobject.h"
+#include "rayobject_rtbuild.h"
#include "reorganize.h"
#include "bvh.h"
#include "vbvh.h"
-#include "svbvh.h"
+
#include <queue>
#include <algorithm>
@@ -126,8 +130,12 @@ template<int StackSize>
int intersect(VBVHTree *obj, Isect* isec)
{
//TODO renable hint support
- if(RE_rayobject_isAligned(obj->root))
- return bvh_node_stack_raycast<VBVHNode,StackSize,false>( obj->root, isec);
+ if(RE_rayobject_isAligned(obj->root)) {
+ if(isec->mode == RE_RAY_SHADOW)
+ return bvh_node_stack_raycast<VBVHNode,StackSize,false,true>( obj->root, isec);
+ else
+ return bvh_node_stack_raycast<VBVHNode,StackSize,false,false>( obj->root, isec);
+ }
else
return RE_rayobject_intersect( (RayObject*) obj->root, isec );
}
diff --git a/source/blender/render/intern/raytrace/reorganize.h b/source/blender/render/intern/raytrace/reorganize.h
index 1d923c92d6f..4e2dce32136 100644
--- a/source/blender/render/intern/raytrace/reorganize.h
+++ b/source/blender/render/intern/raytrace/reorganize.h
@@ -26,16 +26,18 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+#include <float.h>
+#include <math.h>
#include <stdio.h>
+
#include <algorithm>
-#include <math.h>
-#include <vector>
#include <queue>
+#include <vector>
#include "BKE_global.h"
#ifdef _WIN32
-#undef INFINITY
#define INFINITY FLT_MAX // in mingw math.h: (1.0F/0.0F). This generates compile error, though.
#endif
@@ -300,7 +302,7 @@ float bvh_refit(Node *node)
* with the purpose to reduce the expected cost (eg.: number of BB tests).
*/
#include <vector>
-#define MAX_CUT_SIZE 16
+#define MAX_CUT_SIZE 4 /* svbvh assumes max 4 children! */
#define MAX_OPTIMIZE_CHILDS MAX_CUT_SIZE
struct OVBVHNode
diff --git a/source/blender/render/intern/raytrace/svbvh.h b/source/blender/render/intern/raytrace/svbvh.h
index 055a71e3380..832058870dd 100644
--- a/source/blender/render/intern/raytrace/svbvh.h
+++ b/source/blender/render/intern/raytrace/svbvh.h
@@ -26,6 +26,7 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#ifdef __SSE__
#ifndef RE_RAYTRACE_SVBVH_H
@@ -39,49 +40,126 @@
struct SVBVHNode
{
+ float child_bb[24];
+ SVBVHNode *child[4];
int nchilds;
-
- //Array of bb, array of childs
- float *child_bb;
- SVBVHNode **child;
};
-template<>
-inline int bvh_node_hit_test<SVBVHNode>(SVBVHNode *node, Isect *isec)
+static int svbvh_bb_intersect_test_simd4(const Isect *isec, const __m128 *bb_group)
+{
+ const __m128 tmin0 = _mm_setzero_ps();
+ const __m128 tmax0 = _mm_set_ps1(isec->dist);
+
+ const __m128 start0 = _mm_set_ps1(isec->start[0]);
+ const __m128 start1 = _mm_set_ps1(isec->start[1]);
+ const __m128 start2 = _mm_set_ps1(isec->start[2]);
+ const __m128 sub0 = _mm_sub_ps(bb_group[isec->bv_index[0]], start0);
+ const __m128 sub1 = _mm_sub_ps(bb_group[isec->bv_index[1]], start0);
+ const __m128 sub2 = _mm_sub_ps(bb_group[isec->bv_index[2]], start1);
+ const __m128 sub3 = _mm_sub_ps(bb_group[isec->bv_index[3]], start1);
+ const __m128 sub4 = _mm_sub_ps(bb_group[isec->bv_index[4]], start2);
+ const __m128 sub5 = _mm_sub_ps(bb_group[isec->bv_index[5]], start2);
+ const __m128 idot_axis0 = _mm_set_ps1(isec->idot_axis[0]);
+ const __m128 idot_axis1 = _mm_set_ps1(isec->idot_axis[1]);
+ const __m128 idot_axis2 = _mm_set_ps1(isec->idot_axis[2]);
+ const __m128 mul0 = _mm_mul_ps(sub0, idot_axis0);
+ const __m128 mul1 = _mm_mul_ps(sub1, idot_axis0);
+ const __m128 mul2 = _mm_mul_ps(sub2, idot_axis1);
+ const __m128 mul3 = _mm_mul_ps(sub3, idot_axis1);
+ const __m128 mul4 = _mm_mul_ps(sub4, idot_axis2);
+ const __m128 mul5 = _mm_mul_ps(sub5, idot_axis2);
+ const __m128 tmin1 = _mm_max_ps(tmin0, mul0);
+ const __m128 tmax1 = _mm_min_ps(tmax0, mul1);
+ const __m128 tmin2 = _mm_max_ps(tmin1, mul2);
+ const __m128 tmax2 = _mm_min_ps(tmax1, mul3);
+ const __m128 tmin3 = _mm_max_ps(tmin2, mul4);
+ const __m128 tmax3 = _mm_min_ps(tmax2, mul5);
+
+ return _mm_movemask_ps(_mm_cmpge_ps(tmax3, tmin3));
+}
+
+static int svbvh_bb_intersect_test(const Isect *isec, const float *_bb)
{
+ const float *bb = _bb;
+
+ float t1x = (bb[isec->bv_index[0]] - isec->start[0]) * isec->idot_axis[0];
+ float t2x = (bb[isec->bv_index[1]] - isec->start[0]) * isec->idot_axis[0];
+ float t1y = (bb[isec->bv_index[2]] - isec->start[1]) * isec->idot_axis[1];
+ float t2y = (bb[isec->bv_index[3]] - isec->start[1]) * isec->idot_axis[1];
+ float t1z = (bb[isec->bv_index[4]] - isec->start[2]) * isec->idot_axis[2];
+ float t2z = (bb[isec->bv_index[5]] - isec->start[2]) * isec->idot_axis[2];
+
+ RE_RC_COUNT(isec->raycounter->bb.test);
+
+ if(t1x > t2y || t2x < t1y || t1x > t2z || t2x < t1z || t1y > t2z || t2y < t1z) return 0;
+ if(t2x < 0.0 || t2y < 0.0 || t2z < 0.0) return 0;
+ if(t1x > isec->dist || t1y > isec->dist || t1z > isec->dist) return 0;
+
+ RE_RC_COUNT(isec->raycounter->bb.hit);
+
return 1;
}
-template<>
-inline void bvh_node_push_childs<SVBVHNode>(SVBVHNode *node, Isect *isec, SVBVHNode **stack, int &stack_pos)
+static bool svbvh_node_is_leaf(const SVBVHNode *node)
{
- int i=0;
- while(i+4 <= node->nchilds)
- {
- int res = test_bb_group4( (__m128*) (node->child_bb+6*i), isec );
- RE_RC_COUNT(isec->raycounter->simd_bb.test);
-
- if(res & 1) { stack[stack_pos++] = node->child[i+0]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
- if(res & 2) { stack[stack_pos++] = node->child[i+1]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
- if(res & 4) { stack[stack_pos++] = node->child[i+2]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
- if(res & 8) { stack[stack_pos++] = node->child[i+3]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
-
- i += 4;
- }
- while(i < node->nchilds)
+ return !RE_rayobject_isAligned(node);
+}
+
+template<int MAX_STACK_SIZE, bool SHADOW>
+static int svbvh_node_stack_raycast(SVBVHNode *root, Isect *isec)
+{
+ SVBVHNode *stack[MAX_STACK_SIZE], *node;
+ int hit = 0, stack_pos = 0;
+
+ stack[stack_pos++] = root;
+
+ while(stack_pos)
{
- if(RE_rayobject_bb_intersect_test(isec, (const float*)node->child_bb+6*i))
- stack[stack_pos++] = node->child[i];
- i++;
+ node = stack[--stack_pos];
+
+ if(!svbvh_node_is_leaf(node))
+ {
+ int nchilds= node->nchilds;
+
+ if(nchilds == 4) {
+ float *child_bb= node->child_bb;
+ int res = svbvh_bb_intersect_test_simd4(isec, ((__m128*) (child_bb)));
+ SVBVHNode **child= node->child;
+
+ RE_RC_COUNT(isec->raycounter->simd_bb.test);
+
+ if(res & 1) { stack[stack_pos++] = child[0]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
+ if(res & 2) { stack[stack_pos++] = child[1]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
+ if(res & 4) { stack[stack_pos++] = child[2]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
+ if(res & 8) { stack[stack_pos++] = child[3]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
+ }
+ else {
+ float *child_bb= node->child_bb;
+ SVBVHNode **child= node->child;
+ int i;
+
+ for(i=0; i<nchilds; i++)
+ if(svbvh_bb_intersect_test(isec, (float*)child_bb+6*i))
+ stack[stack_pos++] = child[i];
+ }
+ }
+ else
+ {
+ hit |= RE_rayobject_intersect((RayObject*)node, isec);
+ if(SHADOW && hit) break;
+ }
}
+
+ return hit;
}
+
template<>
inline void bvh_node_merge_bb<SVBVHNode>(SVBVHNode *node, float *min, float *max)
{
if(is_leaf(node))
{
- RE_rayobject_merge_bb( (RayObject*)node, min, max);
+ RE_rayobject_merge_bb((RayObject*)node, min, max);
}
else
{
@@ -155,15 +233,13 @@ struct Reorganize_SVBVH
{
SVBVHNode *node = (SVBVHNode*)BLI_memarena_alloc(arena, sizeof(SVBVHNode));
node->nchilds = nchilds;
- node->child_bb = (float*)BLI_memarena_alloc(arena, sizeof(float)*6*nchilds);
- node->child= (SVBVHNode**)BLI_memarena_alloc(arena, sizeof(SVBVHNode*)*nchilds);
return node;
}
void copy_bb(float *bb, const float *old_bb)
{
- std::copy( old_bb, old_bb+6, bb );
+ std::copy(old_bb, old_bb+6, bb);
}
void prepare_for_simd(SVBVHNode *node)
@@ -173,7 +249,7 @@ struct Reorganize_SVBVH
{
float vec_tmp[4*6];
float *res = node->child_bb+6*i;
- std::copy( res, res+6*4, vec_tmp);
+ std::copy(res, res+6*4, vec_tmp);
for(int j=0; j<6; j++)
{
@@ -230,7 +306,7 @@ struct Reorganize_SVBVH
{
float bb[6];
INIT_MINMAX(bb, bb+3);
- RE_rayobject_merge_bb( (RayObject*)o_child, bb, bb+3);
+ RE_rayobject_merge_bb((RayObject*)o_child, bb, bb+3);
copy_bb(node->child_bb+i*6, bb);
break;
}
@@ -239,7 +315,7 @@ struct Reorganize_SVBVH
copy_bb(node->child_bb+i*6, o_child->bb);
}
}
- assert( i == 0 );
+ assert(i == 0);
prepare_for_simd(node);
@@ -250,3 +326,4 @@ struct Reorganize_SVBVH
#endif
#endif //__SSE__
+
diff --git a/source/blender/render/intern/raytrace/vbvh.h b/source/blender/render/intern/raytrace/vbvh.h
index 21c3c0b4c01..06188ede8c6 100644
--- a/source/blender/render/intern/raytrace/vbvh.h
+++ b/source/blender/render/intern/raytrace/vbvh.h
@@ -26,12 +26,13 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#include <assert.h>
+#include <assert.h>
#include <algorithm>
-#include "rayobject_rtbuild.h"
+
#include "BLI_memarena.h"
+#include "rayobject_rtbuild.h"
/*
* VBVHNode represents a BVHNode with support for a variable number of childrens
@@ -167,12 +168,11 @@ struct BuildBinaryVBVH
Node *node = create_node();
- INIT_MINMAX(node->bb, node->bb+3);
- rtbuild_merge_bb(builder, node->bb, node->bb+3);
-
Node **child = &node->child;
int nc = rtbuild_split(builder);
+ INIT_MINMAX(node->bb, node->bb+3);
+
assert(nc == 2);
for(int i=0; i<nc; i++)
{
@@ -180,6 +180,8 @@ struct BuildBinaryVBVH
rtbuild_get_child(builder, i, &tmp);
*child = _transform(&tmp);
+ DO_MIN((*child)->bb, node->bb);
+ DO_MAX((*child)->bb+3, node->bb+3);
child = &((*child)->sibling);
}
diff --git a/source/blender/render/intern/source/Makefile b/source/blender/render/intern/source/Makefile
deleted file mode 100644
index 5aaa66e7712..00000000000
--- a/source/blender/render/intern/source/Makefile
+++ /dev/null
@@ -1,65 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = render
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# first /include is my own includes, second is the external interface.
-# The external modules follow after. There should be a nicer way to say this.
-CPPFLAGS += -I../include
-CPPFLAGS += -I../../extern/include
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../imbuf
-CPPFLAGS += -I../../../makesdna
-CPPFLAGS += -I../../../makesrna
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I../../../quicktime
-CPPFLAGS += -I../../../../kernel/gen_messaging
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-# not very neat: the rest of blender..
-CPPFLAGS += -I../../../editors/include
-CPPFLAGS += $(NAN_SDLCFLAGS)
-CPPFLAGS += -I../../../../../intern/smoke/extern
-
-ifeq ($(WITH_QUICKTIME), true)
- CPPFLAGS += -DWITH_QUICKTIME
-endif
-
-ifeq ($(WITH_FFMPEG),true)
- CPPFLAGS += -DWITH_FFMPEG
-endif
-
-ifeq ($(WITH_OPENEXR),true)
- CPPFLAGS += -DWITH_OPENEXR
-endif
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 149890f830d..b5cfc123c15 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -31,12 +31,11 @@
#include <string.h>
#include <limits.h>
-
-
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_rand.h"
#include "BLI_memarena.h"
#include "BLI_ghash.h"
@@ -92,7 +91,7 @@
#include "BKE_scene.h"
#include "BKE_subsurf.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "BKE_world.h"
#include "PIL_time.h"
@@ -199,9 +198,10 @@ void RE_make_stars(Render *re, Scene *scenev3d, void (*initfunc)(void),
* x = -z | +z,
* y = -z | +z
*/
-
- if(scene->camera==NULL)
+
+ if(scene->camera==NULL || scene->camera->type != OB_CAMERA)
return;
+
camera = scene->camera->data;
clipend = camera->clipend;
@@ -321,7 +321,7 @@ u | | F1 | F2 |
/* ------------------------------------------------------------------------- */
-static void split_v_renderfaces(ObjectRen *obr, int startvlak, int startvert, int usize, int vsize, int uIndex, int cyclu, int cyclv)
+static void split_v_renderfaces(ObjectRen *obr, int startvlak, int startvert, int usize, int vsize, int uIndex, int UNUSED(cyclu), int cyclv)
{
int vLen = vsize-1+(!!cyclv);
int v;
@@ -923,7 +923,7 @@ static Material *give_render_material(Render *re, Object *ob, int nr)
if((ma->mode & MA_TRANSP) && (ma->mode & MA_ZTRANSP))
re->flag |= R_ZTRA;
- /* for light groups */
+ /* for light groups and SSS */
ma->flag |= MA_IS_USED;
if(ma->nodetree && ma->use_nodes)
@@ -1251,14 +1251,14 @@ static void static_particle_wire(ObjectRen *obr, Material *ma, float *vec, float
}
-static void particle_curve(Render *re, ObjectRen *obr, DerivedMesh *dm, Material *ma, ParticleStrandData *sd, float *loc, float *loc1, int seed)
+static void particle_curve(Render *re, ObjectRen *obr, DerivedMesh *dm, Material *ma, ParticleStrandData *sd, float *loc, float *loc1, int seed, float *pa_co)
{
HaloRen *har=0;
if(ma->material_type == MA_TYPE_WIRE)
static_particle_wire(obr, ma, loc, loc1, sd->first, sd->line);
else if(ma->material_type == MA_TYPE_HALO) {
- har= RE_inithalo_particle(re, obr, dm, ma, loc, loc1, sd->orco, sd->uvco, sd->size, 1.0, seed);
+ har= RE_inithalo_particle(re, obr, dm, ma, loc, loc1, sd->orco, sd->uvco, sd->size, 1.0, seed, pa_co);
if(har) har->lay= obr->ob->lay;
}
else
@@ -1386,7 +1386,7 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Particl
mtf->uv[3][1] = uvy;
}
}
-static void particle_normal_ren(short ren_as, ParticleSettings *part, Render *re, ObjectRen *obr, DerivedMesh *dm, Material *ma, ParticleStrandData *sd, ParticleBillboardData *bb, ParticleKey *state, int seed, float hasize)
+static void particle_normal_ren(short ren_as, ParticleSettings *part, Render *re, ObjectRen *obr, DerivedMesh *dm, Material *ma, ParticleStrandData *sd, ParticleBillboardData *bb, ParticleKey *state, int seed, float hasize, float *pa_co)
{
float loc[3], loc0[3], loc1[3], vel[3];
@@ -1411,7 +1411,7 @@ static void particle_normal_ren(short ren_as, ParticleSettings *part, Render *re
VECADDFAC(loc0, loc, vel, -part->draw_line[0]);
VECADDFAC(loc1, loc, vel, part->draw_line[1]);
- particle_curve(re, obr, dm, ma, sd, loc0, loc1, seed);
+ particle_curve(re, obr, dm, ma, sd, loc0, loc1, seed, pa_co);
break;
@@ -1428,7 +1428,7 @@ static void particle_normal_ren(short ren_as, ParticleSettings *part, Render *re
{
HaloRen *har=0;
- har = RE_inithalo_particle(re, obr, dm, ma, loc, NULL, sd->orco, sd->uvco, hasize, 0.0, seed);
+ har = RE_inithalo_particle(re, obr, dm, ma, loc, NULL, sd->orco, sd->uvco, hasize, 0.0, seed, pa_co);
if(har) har->lay= obr->ob->lay;
@@ -1485,19 +1485,20 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
ParticleKey state;
ParticleCacheKey *cache=0;
ParticleBillboardData bb;
- ParticleSimulationData sim = {re->scene, ob, psys, NULL};
+ ParticleSimulationData sim = {0};
ParticleStrandData sd;
StrandBuffer *strandbuf=0;
StrandVert *svert=0;
StrandBound *sbound= 0;
StrandRen *strand=0;
RNG *rng= 0;
- float loc[3],loc1[3],loc0[3],mat[4][4],nmat[3][3],co[3],nor[3],time;
+ float loc[3],loc1[3],loc0[3],mat[4][4],nmat[3][3],co[3],nor[3],duplimat[4][4];
float strandlen=0.0f, curlen=0.0f;
- float hasize, pa_size, r_tilt, r_length, cfra= BKE_curframe(re->scene);
+ float hasize, pa_size, r_tilt, r_length;
float pa_time, pa_birthtime, pa_dietime;
- float random, simplify[2];
- int i, a, k, max_k=0, totpart, dosimplify = 0, dosurfacecache = 0;
+ float random, simplify[2], pa_co[3];
+ const float cfra= BKE_curframe(re->scene);
+ int i, a, k, max_k=0, totpart, dosimplify = 0, dosurfacecache = 0, use_duplimat = 0;
int totchild=0;
int seed, path_nbr=0, orco1=0, num;
int totface, *origindex = 0;
@@ -1519,10 +1520,15 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
/* 2. start initialising things */
/* last possibility to bail out! */
- sim.psmd = psmd = psys_get_modifier(ob,psys);
+ psmd = psys_get_modifier(ob,psys);
if(!(psmd->modifier.mode & eModifierMode_Render))
return 0;
+ sim.scene= re->scene;
+ sim.ob= ob;
+ sim.psys= psys;
+ sim.psmd= psmd;
+
if(part->phystype==PART_PHYS_KEYED)
psys_count_keyed_targets(&sim);
@@ -1616,7 +1622,6 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
if(part->flag & PART_GLOB_TIME)
#endif // XXX old animation system
- cfra = BKE_curframe(re->scene);
///* 2.4 setup reactors */
// if(part->type == PART_REACTOR){
@@ -1633,6 +1638,12 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
copy_m3_m4(nmat, ob->imat);
transpose_m3(nmat);
+ if(psys->flag & PSYS_USE_IMAT) {
+ /* psys->imat is the original emitter's inverse matrix, ob->obmat is the duplicated object's matrix */
+ mul_m4_m4m4(duplimat, psys->imat, ob->obmat);
+ use_duplimat = 1;
+ }
+
/* 2.6 setup strand rendering */
if(part->ren_as == PART_DRAW_PATH && psys->pathcache){
path_nbr=(int)pow(2.0,(double) part->ren_step);
@@ -1712,20 +1723,6 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
pa_time=(cfra-pa->time)/pa->lifetime;
pa_birthtime = pa->time;
pa_dietime = pa->dietime;
-#if 0 // XXX old animation system
- if((part->flag&PART_ABS_TIME) == 0){
- if(ma->ipo) {
- /* correction for lifetime */
- calc_ipo(ma->ipo, 100.0f * pa_time);
- execute_ipo((ID *)ma, ma->ipo);
- }
- if(part->ipo){
- /* correction for lifetime */
- calc_ipo(part->ipo, 100.0f*pa_time);
- execute_ipo((ID *)part, part->ipo);
- }
- }
-#endif // XXX old animation system
hasize = ma->hasize;
@@ -1773,22 +1770,6 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
}
pa_time = psys_get_child_time(psys, cpa, cfra, &pa_birthtime, &pa_dietime);
-
-#if 0 // XXX old animation system
- if((part->flag & PART_ABS_TIME) == 0) {
- if(ma->ipo){
- /* correction for lifetime */
- calc_ipo(ma->ipo, 100.0f * pa_time);
- execute_ipo((ID *)ma, ma->ipo);
- }
- if(part->ipo) {
- /* correction for lifetime */
- calc_ipo(part->ipo, 100.0f * pa_time);
- execute_ipo((ID *)part, part->ipo);
- }
- }
-#endif // XXX old animation system
-
pa_size = psys_get_child_size(psys, cpa, cfra, &pa_time);
r_tilt = 2.0f*(PSYS_FRAND(a + 21) - 0.5f);
@@ -1836,6 +1817,11 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
}
}
+ /* TEXCO_PARTICLE */
+ pa_co[0] = pa_time;
+ pa_co[1] = 0.f;
+ pa_co[2] = 0.f;
+
/* surface normal shading setup */
if(ma->mode_l & MA_STR_SURFDIFF) {
mul_m3_v3(nmat, nor);
@@ -1899,6 +1885,8 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
if(path_nbr) {
/* render strands */
for(k=0; k<=path_nbr; k++){
+ float time;
+
if(k<=max_k){
VECCOPY(state.co,(cache+k)->co);
VECCOPY(state.vel,(cache+k)->vel);
@@ -1928,14 +1916,14 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
VECSUB(loc0,loc1,loc);
VECADD(loc0,loc1,loc0);
- particle_curve(re, obr, psmd->dm, ma, &sd, loc1, loc0, seed);
+ particle_curve(re, obr, psmd->dm, ma, &sd, loc1, loc0, seed, pa_co);
}
sd.first = 0;
sd.time = time;
if(k)
- particle_curve(re, obr, psmd->dm, ma, &sd, loc, loc1, seed);
+ particle_curve(re, obr, psmd->dm, ma, &sd, loc, loc1, seed, pa_co);
VECCOPY(loc1,loc);
}
@@ -1950,6 +1938,9 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
float ct = (part->draw & PART_ABS_PATH_TIME) ? cfra : pa_time;
float dt = length / (trail_count ? (float)trail_count : 1.0f);
+ /* make sure we have pointcache in memory before getting particle on path */
+ psys_make_temp_pointcache(ob, psys);
+
for(i=0; i < trail_count; i++, ct -= dt) {
if(part->draw & PART_ABS_PATH_TIME) {
if(ct < pa_birthtime || ct > pa_dietime)
@@ -1964,6 +1955,9 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
if(psys->parent)
mul_m4_v3(psys->parent->obmat, state.co);
+ if(use_duplimat)
+ mul_m4_v4(duplimat, state.co);
+
if(part->ren_as == PART_DRAW_BB) {
bb.random = random;
bb.size = pa_size;
@@ -1972,11 +1966,13 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
bb.num = a;
}
- particle_normal_ren(part->ren_as, part, re, obr, psmd->dm, ma, &sd, &bb, &state, seed, hasize);
+ pa_co[0] = (part->draw & PART_ABS_PATH_TIME) ? (ct-pa_birthtime)/(pa_dietime-pa_birthtime) : ct;
+ pa_co[1] = (float)i/(float)(trail_count-1);
+
+ particle_normal_ren(part->ren_as, part, re, obr, psmd->dm, ma, &sd, &bb, &state, seed, hasize, pa_co);
}
}
else {
- time=0.0f;
state.time=cfra;
if(psys_get_particle_state(&sim,a,&state,0)==0)
continue;
@@ -1984,6 +1980,9 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
if(psys->parent)
mul_m4_v3(psys->parent->obmat, state.co);
+ if(use_duplimat)
+ mul_m4_v4(duplimat, state.co);
+
if(part->ren_as == PART_DRAW_BB) {
bb.random = random;
bb.size = pa_size;
@@ -1992,7 +1991,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
bb.num = a;
}
- particle_normal_ren(part->ren_as, part, re, obr, psmd->dm, ma, &sd, &bb, &state, seed, hasize);
+ particle_normal_ren(part->ren_as, part, re, obr, psmd->dm, ma, &sd, &bb, &state, seed, hasize, pa_co);
}
}
@@ -2341,7 +2340,7 @@ static void init_render_mball(Render *re, ObjectRen *obr)
VertRen *ver;
VlakRen *vlr, *vlr1;
Material *ma;
- float *data, *nors, *orco, mat[4][4], imat[3][3], xn, yn, zn;
+ float *data, *nors, *orco=NULL, mat[4][4], imat[3][3], xn, yn, zn;
int a, need_orco, vlakindex, *index;
ListBase dispbase= {NULL, NULL};
@@ -2375,7 +2374,7 @@ static void init_render_mball(Render *re, ObjectRen *obr)
}
}
- for(a=0; a<dl->nr; a++, data+=3, nors+=3, orco+=3) {
+ for(a=0; a<dl->nr; a++, data+=3, nors+=3) {
ver= RE_findOrAddVert(obr, obr->totvert++);
VECCOPY(ver->co, data);
@@ -2393,7 +2392,10 @@ static void init_render_mball(Render *re, ObjectRen *obr)
normalize_v3(ver->n);
//if(ob->transflag & OB_NEG_SCALE) negate_v3(ver->n);
- if(need_orco) ver->orco= orco;
+ if(need_orco) {
+ ver->orco= orco;
+ orco+=3;
+ }
}
index= dl->index;
@@ -2605,18 +2607,14 @@ static void init_render_dm(DerivedMesh *dm, Render *re, ObjectRen *obr,
int a, a1, end, totvert, vertofs;
VertRen *ver;
VlakRen *vlr;
- Curve *cu= NULL;
MVert *mvert = NULL;
MFace *mface;
Material *ma;
+ /* Curve *cu= ELEM(ob->type, OB_FONT, OB_CURVE) ? ob->data : NULL; */
mvert= dm->getVertArray(dm);
totvert= dm->getNumVerts(dm);
- if ELEM(ob->type, OB_FONT, OB_CURVE) {
- cu= ob->data;
- }
-
for(a=0; a<totvert; a++, mvert++) {
ver= RE_findOrAddVert(obr, obr->totvert++);
VECCOPY(ver->co, mvert->co);
@@ -2713,7 +2711,7 @@ static void init_render_surf(Render *re, ObjectRen *obr, int timeoffset)
ListBase displist= {NULL, NULL};
DispList *dl;
Material **matar;
- float *orco=NULL, *orcobase=NULL, mat[4][4];
+ float *orco=NULL, mat[4][4];
int a, totmat, need_orco=0;
DerivedMesh *dm= NULL;
@@ -2751,7 +2749,7 @@ static void init_render_surf(Render *re, ObjectRen *obr, int timeoffset)
dm->release(dm);
} else {
if(need_orco) {
- orcobase= orco= get_object_orco(re, ob);
+ orco= get_object_orco(re, ob);
}
/* walk along displaylist and create rendervertices/-faces */
@@ -2777,10 +2775,10 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
DerivedMesh *dm = NULL;
ListBase disp={NULL, NULL};
Material **matar;
- float len, *data, *fp, *orco=NULL, *orcobase= NULL;
+ float *data, *fp, *orco=NULL;
float n[3], mat[4][4];
- int nr, startvert, startvlak, a, b;
- int frontside, need_orco=0, totmat;
+ int nr, startvert, a, b;
+ int need_orco=0, totmat;
cu= ob->data;
if(ob->type==OB_FONT && cu->str==NULL) return;
@@ -2816,7 +2814,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
dm->release(dm);
} else {
if(need_orco) {
- orcobase=orco= get_object_orco(re, ob);
+ orco= get_object_orco(re, ob);
}
while(dl) {
@@ -2838,15 +2836,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
ver= RE_findOrAddVert(obr, obr->totvert++);
VECCOPY(ver->co, data);
- /* flip normal if face is backfacing, also used in face loop below */
- if(ver->co[2] < 0.0) {
- VECCOPY(ver->n, n);
- ver->flag = 1;
- }
- else {
- ver->n[0]= -n[0]; ver->n[1]= -n[1]; ver->n[2]= -n[2];
- ver->flag = 0;
- }
+ negate_v3_v3(ver->n, n);
mul_m4_v3(mat, ver->co);
@@ -2857,7 +2847,6 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
}
if(timeoffset==0) {
- startvlak= obr->totvlak;
index= dl->index;
for(a=0; a<dl->parts; a++, index+=3) {
@@ -2867,12 +2856,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
vlr->v3= RE_findOrAddVert(obr, startvert+index[2]);
vlr->v4= NULL;
- if(vlr->v1->flag) {
- VECCOPY(vlr->n, n);
- }
- else {
- vlr->n[0]= -n[0]; vlr->n[1]= -n[1]; vlr->n[2]= -n[2];
- }
+ negate_v3_v3(vlr->n, n);
vlr->mat= matar[ dl->col ];
vlr->flag= 0;
@@ -2907,12 +2891,10 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
}
if(dl->bevelSplitFlag || timeoffset==0) {
- startvlak= obr->totvlak;
+ const int startvlak= obr->totvlak;
for(a=0; a<dl->parts; a++) {
- frontside= (a >= dl->nr/2);
-
if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0)
break;
@@ -2923,6 +2905,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
for(; b<dl->nr; b++) {
vlr= RE_findOrAddVlak(obr, obr->totvlak++);
+ /* important 1 offset in order is kept [#24913] */
vlr->v1= RE_findOrAddVert(obr, p2);
vlr->v2= RE_findOrAddVert(obr, p1);
vlr->v3= RE_findOrAddVert(obr, p3);
@@ -2932,16 +2915,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
vlr->flag= dl->rt;
- /* this is not really scientific: the vertices
- * 2, 3 en 4 seem to give better vertexnormals than 1 2 3:
- * front and backside treated different!!
- */
-
- if(frontside)
- normal_tri_v3( vlr->n,vlr->v2->co, vlr->v3->co, vlr->v4->co);
- else
- normal_tri_v3( vlr->n,vlr->v1->co, vlr->v2->co, vlr->v3->co);
-
+ normal_quad_v3(vlr->n, vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co);
vlr->mat= matar[ dl->col ];
p4= p3;
@@ -2968,16 +2942,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
}
for(a=startvert; a<obr->totvert; a++) {
ver= RE_findOrAddVert(obr, a);
- len= normalize_v3(ver->n);
- if(len==0.0) ver->flag= 1; /* flag abuse, its only used in zbuf now */
- else ver->flag= 0;
- }
- for(a= startvlak; a<obr->totvlak; a++) {
- vlr= RE_findOrAddVlak(obr, a);
- if(vlr->v1->flag) VECCOPY(vlr->v1->n, vlr->n);
- if(vlr->v2->flag) VECCOPY(vlr->v2->n, vlr->n);
- if(vlr->v3->flag) VECCOPY(vlr->v3->n, vlr->n);
- if(vlr->v4->flag) VECCOPY(vlr->v4->n, vlr->n);
+ normalize_v3(ver->n);
}
}
}
@@ -3302,7 +3267,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
/* test for 100% transparant */
ok= 1;
- if(ma->alpha==0.0 && ma->spectra==0.0) {
+ if(ma->alpha==0.0f && ma->spectra==0.0f && ma->filter==0.0f) {
ok= 0;
/* texture on transparency? */
for(a=0; a<MAX_MTEX; a++) {
@@ -3507,7 +3472,6 @@ static void initshadowbuf(Render *re, LampRen *lar, float mat[][4])
/* bias is percentage, made 2x larger because of correction for angle of incidence */
/* when a ray is closer to parallel of a face, bias value is increased during render */
shb->bias= (0.02*lar->bias)*0x7FFFFFFF;
- shb->bias= shb->bias;
/* halfway method (average of first and 2nd z) reduces bias issues */
if(ELEM(lar->buftype, LA_SHADBUF_HALFWAY, LA_SHADBUF_DEEP))
@@ -3748,6 +3712,10 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
/* pre-scale */
lar->sh_invcampos[2]*= lar->sh_zfac;
+ /* halfway shadow buffer doesn't work for volumetric effects */
+ if(lar->buftype == LA_SHADBUF_HALFWAY)
+ lar->buftype = LA_SHADBUF_REGULAR;
+
}
}
else if(la->type==LA_HEMI) {
@@ -3984,35 +3952,40 @@ static void set_phong_threshold(ObjectRen *obr)
/* per face check if all samples should be taken.
if raytrace or multisample, do always for raytraced material, or when material full_osa set */
-static void set_fullsample_flag(Render *re, ObjectRen *obr)
+static void set_fullsample_trace_flag(Render *re, ObjectRen *obr)
{
VlakRen *vlr;
- int a, trace, mode;
+ int a, trace, mode, osa;
- if(re->osa==0)
- return;
-
+ osa= re->osa;
trace= re->r.mode & R_RAYTRACE;
for(a=obr->totvlak-1; a>=0; a--) {
vlr= RE_findOrAddVlak(obr, a);
mode= vlr->mat->mode;
+
+ if(trace && (mode & MA_TRACEBLE))
+ vlr->flag |= R_TRACEBLE;
- if(mode & MA_FULL_OSA)
- vlr->flag |= R_FULL_OSA;
- else if(trace) {
- if(mode & MA_SHLESS);
- else if(vlr->mat->material_type == MA_TYPE_VOLUME);
- else if((mode & MA_RAYMIRROR) || ((mode & MA_TRANSP) && (mode & MA_RAYTRANSP)))
- /* for blurry reflect/refract, better to take more samples
- * inside the raytrace than as OSA samples */
- if ((vlr->mat->gloss_mir == 1.0) && (vlr->mat->gloss_tra == 1.0))
- vlr->flag |= R_FULL_OSA;
+ if(osa) {
+ if(mode & MA_FULL_OSA) {
+ vlr->flag |= R_FULL_OSA;
+ }
+ else if(trace) {
+ if(mode & MA_SHLESS);
+ else if(vlr->mat->material_type == MA_TYPE_VOLUME);
+ else if((mode & MA_RAYMIRROR) || ((mode & MA_TRANSP) && (mode & MA_RAYTRANSP))) {
+ /* for blurry reflect/refract, better to take more samples
+ * inside the raytrace than as OSA samples */
+ if ((vlr->mat->gloss_mir == 1.0) && (vlr->mat->gloss_tra == 1.0))
+ vlr->flag |= R_FULL_OSA;
+ }
+ }
}
}
}
-/* split quads for pradictable baking
+/* split quads for predictable baking
* dir 1 == (0,1,2) (0,2,3), 2 == (1,3,0) (1,2,3)
*/
static void split_quads(ObjectRen *obr, int dir)
@@ -4202,7 +4175,7 @@ static void finalize_render_object(Render *re, ObjectRen *obr, int timeoffset)
check_non_flat_quads(obr);
}
- set_fullsample_flag(re, obr);
+ set_fullsample_trace_flag(re, obr);
/* compute bounding boxes for clipping */
INIT_MINMAX(min, max);
@@ -4214,13 +4187,23 @@ static void finalize_render_object(Render *re, ObjectRen *obr, int timeoffset)
}
if(obr->strandbuf) {
+ float width;
+
+ /* compute average bounding box of strandpoint itself (width) */
+ if(obr->strandbuf->flag & R_STRAND_B_UNITS)
+ obr->strandbuf->maxwidth= MAX2(obr->strandbuf->ma->strand_sta, obr->strandbuf->ma->strand_end);
+ else
+ obr->strandbuf->maxwidth= 0.0f;
+
+ width= obr->strandbuf->maxwidth;
sbound= obr->strandbuf->bound;
for(b=0; b<obr->strandbuf->totbound; b++, sbound++) {
+
INIT_MINMAX(smin, smax);
for(a=sbound->start; a<sbound->end; a++) {
strand= RE_findOrAddStrand(obr, a);
- strand_minmax(strand, smin, smax);
+ strand_minmax(strand, smin, smax, width);
}
VECCOPY(sbound->boundbox[0], smin);
@@ -4374,7 +4357,7 @@ static void init_render_object_data(Render *re, ObjectRen *obr, int timeoffset)
int i;
if(obr->psysindex) {
- if((!obr->prev || obr->prev->ob != ob) && ob->type==OB_MESH) {
+ if((!obr->prev || obr->prev->ob != ob || (obr->prev->flag & R_INSTANCEABLE)==0) && ob->type==OB_MESH) {
/* the emitter mesh wasn't rendered so the modifier stack wasn't
* evaluated with render settings */
DerivedMesh *dm;
@@ -4466,8 +4449,11 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject *
}
if(obr->lay & vectorlay)
obr->flag |= R_NEED_VECTORS;
+ if(dob)
+ psys->flag |= PSYS_USE_IMAT;
init_render_object_data(re, obr, timeoffset);
psys_render_restore(ob, psys);
+ psys->flag &= ~PSYS_USE_IMAT;
/* only add instance for objects that have not been used for dupli */
if(!(ob->transflag & OB_RENDER_DUPLI)) {
@@ -4720,7 +4706,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
Object *ob;
Group *group;
ObjectInstanceRen *obi;
- Scene *sce;
+ Scene *sce_iter;
float mat[4][4];
int lay, vectorlay, redoimat= 0;
@@ -4729,7 +4715,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
* NULL is just for init */
set_dupli_tex_mat(NULL, NULL, NULL);
- for(SETLOOPER(re->scene, base)) {
+ for(SETLOOPER(re->scene, sce_iter, base)) {
ob= base->object;
/* imat objects has to be done here, since displace can have texture using Object map-input */
mul_m4_m4m4(mat, ob->obmat, re->viewmat);
@@ -4739,7 +4725,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
ob->transflag &= ~OB_RENDER_DUPLI;
}
- for(SETLOOPER(re->scene, base)) {
+ for(SETLOOPER(re->scene, sce_iter, base)) {
ob= base->object;
/* in the prev/next pass for making speed vectors, avoid creating
@@ -4799,6 +4785,8 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
int psysindex;
float mat[4][4];
+ obi=NULL;
+
/* instances instead of the actual object are added in two cases, either
* this is a duplivert/face/particle, or it is a non-animated object in
* a dupligroup that has already been created before */
@@ -4823,15 +4811,14 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
find_dupli_instances(re, obr);
}
}
- else
- /* can't instance, just create the object */
- init_render_object(re, obd, ob, dob, timeoffset, vectorlay);
/* same logic for particles, each particle system has it's own object, so
* need to go over them separately */
psysindex= 1;
for(psys=obd->particlesystem.first; psys; psys=psys->next) {
- if(dob->type != OB_DUPLIGROUP || (obr=find_dupligroup_dupli(re, ob, psysindex))) {
+ if(dob->type != OB_DUPLIGROUP || (obr=find_dupligroup_dupli(re, obd, psysindex))) {
+ if(obi == NULL)
+ mul_m4_m4m4(mat, dob->mat, re->viewmat);
obi= RE_addRenderInstance(re, NULL, obd, ob, dob->index, psysindex++, mat, obd->lay);
set_dupli_tex_mat(re, obi, dob);
@@ -4847,6 +4834,10 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
}
}
}
+
+ if(obi==NULL)
+ /* can't instance, just create the object */
+ init_render_object(re, obd, ob, dob, timeoffset, vectorlay);
if(dob->type != OB_DUPLIGROUP) {
obd->flag |= OB_DONE;
@@ -4877,7 +4868,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
/* imat objects has to be done again, since groups can mess it up */
if(redoimat) {
- for(SETLOOPER(re->scene, base)) {
+ for(SETLOOPER(re->scene, sce_iter, base)) {
ob= base->object;
mul_m4_m4m4(mat, ob->obmat, re->viewmat);
invert_m4_m4(ob->imat, mat);
@@ -4920,7 +4911,7 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l
lay &= 0xFF000000;
/* applies changes fully */
- if((re->r.scemode & R_PREVIEWBUTS)==0)
+ if((re->r.scemode & (R_NO_FRAME_UPDATE|R_PREVIEWBUTS))==0)
scene_update_for_newframe(re->main, re->scene, lay);
/* if no camera, viewmat should have been set! */
@@ -5182,7 +5173,7 @@ static void calculate_speedvector(float *vectors, int step, float winsq, float w
static float *calculate_strandsurface_speedvectors(Render *re, ObjectInstanceRen *obi, StrandSurface *mesh)
{
- float winsq= re->winx*re->winy, winroot= sqrt(winsq), (*winspeed)[4];
+ float winsq= (float)re->winx*(float)re->winy, winroot= sqrt(winsq), (*winspeed)[4]; /* int's can wrap on large images */
float ho[4], prevho[4], nextho[4], winmat[4][4], vec[2];
int a;
@@ -5221,7 +5212,7 @@ static void calculate_speedvectors(Render *re, ObjectInstanceRen *obi, float *ve
StrandSurface *mesh= NULL;
float *speed, (*winspeed)[4]=NULL, ho[4], winmat[4][4];
float *co1, *co2, *co3, *co4, w[4];
- float winsq= re->winx*re->winy, winroot= sqrt(winsq);
+ float winsq= (float)re->winx*(float)re->winy, winroot= sqrt(winsq); /* int's can wrap on large images */
int a, *face, *index;
if(obi->flag & R_TRANSFORMED)
@@ -5288,7 +5279,7 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float *
VertRen *ver= NULL;
float *speed, div, zco[2], avgvel[4] = {0.0, 0.0, 0.0, 0.0};
float zmulx= re->winx/2, zmuly= re->winy/2, len;
- float winsq= re->winx*re->winy, winroot= sqrt(winsq);
+ float winsq= (float)re->winx*(float)re->winy, winroot= sqrt(winsq); /* int's can wrap on large images */
int a, j;
float hoco[4], ho[4], fsvec[4], camco[4];
float mat[4][4], winmat[4][4];
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index 8977bc7f379..55f7433da96 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -34,6 +34,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h" /* for rectcpy */
@@ -48,7 +49,7 @@
#include "BKE_main.h"
#include "BKE_image.h" // BKE_write_ibuf
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
@@ -86,7 +87,7 @@ static void envmap_split_ima(EnvMap *env, ImBuf *ibuf)
if (env->type == ENV_CUBE) {
for(part=0; part<6; part++) {
- env->cube[part]= IMB_allocImBuf(dx, dx, 24, IB_rect|IB_rectfloat, 0);
+ env->cube[part]= IMB_allocImBuf(dx, dx, 24, IB_rect|IB_rectfloat);
}
IMB_float_from_rect(ibuf);
@@ -458,7 +459,7 @@ static void render_envmap(Render *re, EnvMap *env)
int y;
float *alpha;
- ibuf= IMB_allocImBuf(envre->rectx, envre->recty, 24, IB_rect|IB_rectfloat, 0);
+ ibuf= IMB_allocImBuf(envre->rectx, envre->recty, 24, IB_rect|IB_rectfloat);
memcpy(ibuf->rect_float, rl->rectf, ibuf->channels * ibuf->x * ibuf->y * sizeof(float));
if (re->scene->r.color_mgt_flag & R_COLOR_MANAGEMENT)
diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c
index f78031c9030..3a8270a757e 100644
--- a/source/blender/render/intern/source/imagetexture.c
+++ b/source/blender/render/intern/source/imagetexture.c
@@ -51,8 +51,9 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
+
-#include "BKE_utildefines.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_image.h"
@@ -157,8 +158,8 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, TexResult *texre
}
}
- x = (int)(fx*ibuf->x);
- y = (int)(fy*ibuf->y);
+ x = (int)floorf(fx*ibuf->x);
+ y = (int)floorf(fy*ibuf->y);
if(tex->extend == TEX_CLIPCUBE) {
if(x<0 || y<0 || x>=ibuf->x || y>=ibuf->y || texvec[2]<-1.0 || texvec[2]>1.0) {
@@ -500,7 +501,7 @@ static void boxsampleclip(struct ImBuf *ibuf, rctf *rf, TexResult *texres)
}
}
-static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float maxy, TexResult *texres, int imaprepeat, int imapextend, int intpol)
+static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float maxy, TexResult *texres, int imaprepeat, int imapextend)
{
/* Sample box, performs clip. minx etc are in range 0.0 - 1.0 .
* Enlarge with antialiased edges of pixels.
@@ -808,7 +809,7 @@ static void imp2radangle(float A, float B, float C, float F, float* a, float* b,
static void ewa_eval(TexResult* texr, ImBuf* ibuf, float fx, float fy, afdata_t* AFD)
{
// scaling dxt/dyt by full resolution can cause overflow because of huge A/B/C and esp. F values,
- // scaling by aspect ratio alone does the opposite, so try something inbetween instead...
+ // scaling by aspect ratio alone does the opposite, so try something in between instead...
const float ff2 = ibuf->x, ff = sqrtf(ff2), q = ibuf->y / ff;
const float Ux = AFD->dxt[0]*ff, Vx = AFD->dxt[1]*q, Uy = AFD->dyt[0]*ff, Vy = AFD->dyt[1]*q;
float A = Vx*Vx + Vy*Vy;
@@ -960,6 +961,30 @@ static void alpha_clip_aniso(ImBuf *ibuf, float minx, float miny, float maxx, fl
}
}
+static void image_mipmap_test(Tex *tex, ImBuf *ibuf)
+{
+ if (tex->imaflag & TEX_MIPMAP) {
+ if ((ibuf->flags & IB_fields) == 0) {
+
+ if (ibuf->mipmap[0] && (ibuf->userflags & IB_MIPMAP_INVALID)) {
+ BLI_lock_thread(LOCK_IMAGE);
+ if (ibuf->userflags & IB_MIPMAP_INVALID) {
+ IMB_remakemipmap(ibuf, tex->imaflag & TEX_GAUSS_MIP);
+ ibuf->userflags &= ~IB_MIPMAP_INVALID;
+ }
+ BLI_unlock_thread(LOCK_IMAGE);
+ }
+ if (ibuf->mipmap[0] == NULL) {
+ BLI_lock_thread(LOCK_IMAGE);
+ if (ibuf->mipmap[0] == NULL)
+ IMB_makemipmap(ibuf, tex->imaflag & TEX_GAUSS_MIP);
+ BLI_unlock_thread(LOCK_IMAGE);
+ }
+ }
+ }
+
+}
+
static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *dxt, float *dyt, TexResult *texres)
{
TexResult texr;
@@ -996,15 +1021,9 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec,
if ((ibuf == NULL) || ((ibuf->rect == NULL) && (ibuf->rect_float == NULL))) return retval;
- // mipmap test
- if (tex->imaflag & TEX_MIPMAP) {
- if (((ibuf->flags & IB_fields) == 0) && (ibuf->mipmap[0] == NULL)) {
- BLI_lock_thread(LOCK_IMAGE);
- if (ibuf->mipmap[0] == NULL) IMB_makemipmap(ibuf, tex->imaflag & TEX_GAUSS_MIP);
- BLI_unlock_thread(LOCK_IMAGE);
- }
- }
-
+ /* mipmap test */
+ image_mipmap_test(tex, ibuf);
+
if ((tex->imaflag & TEX_USEALPHA) && ((tex->imaflag & TEX_CALCALPHA) == 0)) texres->talpha = 1;
texr.talpha = texres->talpha;
@@ -1388,17 +1407,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
return retval;
/* mipmap test */
- if (tex->imaflag & TEX_MIPMAP) {
- if(ibuf->flags & IB_fields);
- else if(ibuf->mipmap[0]==NULL) {
- BLI_lock_thread(LOCK_IMAGE);
-
- if(ibuf->mipmap[0]==NULL)
- IMB_makemipmap(ibuf, tex->imaflag & TEX_GAUSS_MIP);
-
- BLI_unlock_thread(LOCK_IMAGE);
- }
- }
+ image_mipmap_test(tex, ibuf);
if(tex->imaflag & TEX_USEALPHA) {
if(tex->imaflag & TEX_CALCALPHA);
@@ -1606,11 +1615,11 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
//minx*= 1.35f;
//miny*= 1.35f;
- boxsample(curibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 0);
+ boxsample(curibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend);
val1= texres->tr+texres->tg+texres->tb;
- boxsample(curibuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend, 0);
+ boxsample(curibuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend);
val2= texr.tr + texr.tg + texr.tb;
- boxsample(curibuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend, 0);
+ boxsample(curibuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend);
val3= texr.tr + texr.tg + texr.tb;
/* don't switch x or y! */
@@ -1619,7 +1628,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
if(previbuf!=curibuf) { /* interpolate */
- boxsample(previbuf, fx-minx, fy-miny, fx+minx, fy+miny, &texr, imaprepeat, imapextend, 0);
+ boxsample(previbuf, fx-minx, fy-miny, fx+minx, fy+miny, &texr, imaprepeat, imapextend);
/* calc rgb */
dx= 2.0f*(pixsize-maxd)/pixsize;
@@ -1636,9 +1645,9 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
}
val1= dy*val1+ dx*(texr.tr + texr.tg + texr.tb);
- boxsample(previbuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend, 0);
+ boxsample(previbuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend);
val2= dy*val2+ dx*(texr.tr + texr.tg + texr.tb);
- boxsample(previbuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend, 0);
+ boxsample(previbuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend);
val3= dy*val3+ dx*(texr.tr + texr.tg + texr.tb);
texres->nor[0]= (val1-val2); /* vals have been interpolated above! */
@@ -1661,10 +1670,10 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
maxy= fy+miny;
miny= fy-miny;
- boxsample(curibuf, minx, miny, maxx, maxy, texres, imaprepeat, imapextend, 0);
+ boxsample(curibuf, minx, miny, maxx, maxy, texres, imaprepeat, imapextend);
if(previbuf!=curibuf) { /* interpolate */
- boxsample(previbuf, minx, miny, maxx, maxy, &texr, imaprepeat, imapextend, 0);
+ boxsample(previbuf, minx, miny, maxx, maxy, &texr, imaprepeat, imapextend);
fx= 2.0f*(pixsize-maxd)/pixsize;
@@ -1690,11 +1699,11 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
}
if(texres->nor && (tex->imaflag & TEX_NORMALMAP)==0) {
- boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 0);
+ boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend);
val1= texres->tr+texres->tg+texres->tb;
- boxsample(ibuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend, 0);
+ boxsample(ibuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend);
val2= texr.tr + texr.tg + texr.tb;
- boxsample(ibuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend, 0);
+ boxsample(ibuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend);
val3= texr.tr + texr.tg + texr.tb;
/* don't switch x or y! */
@@ -1702,7 +1711,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
texres->nor[1]= (val1-val3);
}
else
- boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 0);
+ boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend);
}
if(tex->imaflag & TEX_CALCALPHA) {
@@ -1749,7 +1758,7 @@ void image_sample(Image *ima, float fx, float fy, float dx, float dy, float *res
if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) )
ibuf->rect+= (ibuf->x*ibuf->y);
- boxsample(ibuf, fx, fy, fx+dx, fy+dy, &texres, 0, 1, 0);
+ boxsample(ibuf, fx, fy, fx+dx, fy+dy, &texres, 0, 1);
result[0]= texres.tr;
result[1]= texres.tg;
result[2]= texres.tb;
diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c
index 26c68d0a167..f54b7e2a43f 100644
--- a/source/blender/render/intern/source/initrender.c
+++ b/source/blender/render/intern/source/initrender.c
@@ -40,8 +40,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_jitter.h"
-
-
+#include "BLI_utildefines.h"
#include "DNA_camera_types.h"
#include "DNA_group_types.h"
@@ -50,7 +49,7 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-#include "BKE_utildefines.h"
+
#include "BKE_global.h"
#include "BKE_material.h"
#include "BKE_object.h"
diff --git a/source/blender/render/intern/source/occlusion.c b/source/blender/render/intern/source/occlusion.c
index fb69519236a..4d129312672 100644
--- a/source/blender/render/intern/source/occlusion.c
+++ b/source/blender/render/intern/source/occlusion.c
@@ -40,10 +40,11 @@
#include "BLI_blenlib.h"
#include "BLI_memarena.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "BKE_global.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
+
#include "RE_shader_ext.h"
@@ -304,7 +305,7 @@ static float sh_eval(float *sh, float *v)
/* ------------------------------ Building --------------------------------- */
-static void occ_face(const OccFace *face, float *co, float *normal, float *area)
+static void occ_face(const OccFace *face, float co[3], float normal[3], float *area)
{
ObjectInstanceRen *obi;
VlakRen *vlr;
@@ -421,21 +422,23 @@ static void occ_node_from_face(OccFace *face, OccNode *node)
sh_from_disc(n, node->area, node->sh);
}
-static void occ_build_dco(OcclusionTree *tree, OccNode *node, float *co, float *dco)
+static void occ_build_dco(OcclusionTree *tree, OccNode *node, const float co[3], float *dco)
{
- OccNode *child;
- float dist, d[3], nco[3];
int b;
-
for(b=0; b<TOTCHILD; b++) {
+ float dist, d[3], nco[3];
+
if(node->childflag & (1<<b)) {
- occ_face(tree->face+node->child[b].face, nco, 0, 0);
+ occ_face(tree->face+node->child[b].face, nco, NULL, NULL);
}
else if(node->child[b].node) {
- child= node->child[b].node;
+ OccNode *child= node->child[b].node;
occ_build_dco(tree, child, co, dco);
VECCOPY(nco, child->co);
}
+ else {
+ continue;
+ }
VECSUB(d, nco, co);
dist= INPR(d, d);
@@ -521,7 +524,7 @@ static void occ_build_recursive(OcclusionTree *tree, OccNode *node, int begin, i
ListBase threads;
OcclusionBuildThread othreads[BLENDER_MAX_THREADS];
OccNode *child, tmpnode;
- OccFace *face;
+ /* OccFace *face; */
int a, b, totthread=0, offset[TOTCHILD], count[TOTCHILD];
/* add a new node */
@@ -530,7 +533,7 @@ static void occ_build_recursive(OcclusionTree *tree, OccNode *node, int begin, i
/* leaf node with only children */
if(end - begin <= TOTCHILD) {
for(a=begin, b=0; a<end; a++, b++) {
- face= &tree->face[a];
+ /* face= &tree->face[a]; */
node->child[b].face= a;
node->childflag |= (1<<b);
}
@@ -547,7 +550,7 @@ static void occ_build_recursive(OcclusionTree *tree, OccNode *node, int begin, i
node->child[b].node= NULL;
}
else if(count[b] == 1) {
- face= &tree->face[offset[b]];
+ /* face= &tree->face[offset[b]]; */
node->child[b].face= offset[b];
node->childflag |= (1<<b);
}
@@ -1526,7 +1529,7 @@ static int sample_occ_cache(OcclusionTree *tree, float *co, float *n, int x, int
for(i=0; i<4; i++) {
VECSUB(d, samples[i]->co, co);
- dist2= INPR(d, d);
+ //dist2= INPR(d, d);
wz[i]= 1.0f; //(samples[i]->dist2/(1e-4f + dist2));
wn[i]= pow(INPR(samples[i]->n, n), 32.0f);
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 44c6a6f008f..e9dd3d36596 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -58,6 +58,7 @@
#include "BLI_blenlib.h"
#include "BLI_rand.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "PIL_time.h"
#include "IMB_imbuf.h"
@@ -120,24 +121,24 @@ Render R;
/* ********* alloc and free ******** */
+static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, ReportList *reports, const char *name_override);
static volatile int g_break= 0;
-static int thread_break(void *unused)
+static int thread_break(void *UNUSED(arg))
{
return g_break;
}
/* default callbacks, set in each new render */
-static void result_nothing(void *unused, RenderResult *rr) {}
-static void result_rcti_nothing(void *unused, RenderResult *rr, volatile struct rcti *rect) {}
-static void stats_nothing(void *unused, RenderStats *rs) {}
-static void float_nothing(void *unused, float val) {}
-static void print_error(void *unused, char *str) {printf("ERROR: %s\n", str);}
-static int default_break(void *unused) {return G.afbreek == 1;}
+static void result_nothing(void *UNUSED(arg), RenderResult *UNUSED(rr)) {}
+static void result_rcti_nothing(void *UNUSED(arg), RenderResult *UNUSED(rr), volatile struct rcti *UNUSED(rect)) {}
+static void stats_nothing(void *UNUSED(arg), RenderStats *UNUSED(rs)) {}
+static void float_nothing(void *UNUSED(arg), float UNUSED(val)) {}
+static void print_error(void *UNUSED(arg), const char *str) {printf("ERROR: %s\n", str);}
+static int default_break(void *UNUSED(arg)) {return G.afbreek == 1;}
-static void stats_background(void *unused, RenderStats *rs)
+static void stats_background(void *UNUSED(arg), RenderStats *rs)
{
- char str[400], *spos= str;
uintptr_t mem_in_use, mmap_in_use, peak_memory;
float megs_used_memory, mmap_used_memory, megs_peak_memory;
@@ -149,24 +150,24 @@ static void stats_background(void *unused, RenderStats *rs)
mmap_used_memory= (mmap_in_use)/(1024.0*1024.0);
megs_peak_memory = (peak_memory)/(1024.0*1024.0);
- spos+= sprintf(spos, "Fra:%d Mem:%.2fM (%.2fM, peak %.2fM) ", rs->cfra,
+ fprintf(stdout, "Fra:%d Mem:%.2fM (%.2fM, peak %.2fM) ", rs->cfra,
megs_used_memory, mmap_used_memory, megs_peak_memory);
-
+
if(rs->curfield)
- spos+= sprintf(spos, "Field %d ", rs->curfield);
+ fprintf(stdout, "Field %d ", rs->curfield);
if(rs->curblur)
- spos+= sprintf(spos, "Blur %d ", rs->curblur);
-
+ fprintf(stdout, "Blur %d ", rs->curblur);
+
if(rs->infostr) {
- spos+= sprintf(spos, "| %s", rs->infostr);
+ fprintf(stdout, "| %s", rs->infostr);
}
else {
if(rs->tothalo)
- spos+= sprintf(spos, "Sce: %s Ve:%d Fa:%d Ha:%d La:%d", rs->scenename, rs->totvert, rs->totface, rs->tothalo, rs->totlamp);
- else
- spos+= sprintf(spos, "Sce: %s Ve:%d Fa:%d La:%d", rs->scenename, rs->totvert, rs->totface, rs->totlamp);
+ fprintf(stdout, "Sce: %s Ve:%d Fa:%d Ha:%d La:%d", rs->scenename, rs->totvert, rs->totface, rs->tothalo, rs->totlamp);
+ else
+ fprintf(stdout, "Sce: %s Ve:%d Fa:%d La:%d", rs->scenename, rs->totvert, rs->totface, rs->totlamp);
}
- printf("%s\n", str);
+ fflush(stdout);
}
void RE_FreeRenderResult(RenderResult *res)
@@ -277,7 +278,7 @@ static void pop_render_result(Render *re)
/* NOTE: OpenEXR only supports 32 chars for layer+pass names
In blender we now use max 10 chars for pass, max 20 for layer */
-static char *get_pass_name(int passtype, int channel)
+static const char *get_pass_name(int passtype, int channel)
{
if(passtype == SCE_PASS_COMBINED) {
@@ -448,24 +449,29 @@ static int passtype_from_name(char *str)
return 0;
}
-static void render_unique_exr_name(Render *re, char *str, int sample)
+static void scene_unique_exr_name(Scene *scene, char *str, int sample)
{
char di[FILE_MAX], name[FILE_MAXFILE+MAX_ID_NAME+100], fi[FILE_MAXFILE];
- BLI_strncpy(di, G.sce, FILE_MAX);
+ BLI_strncpy(di, G.main->name, FILE_MAX);
BLI_splitdirstring(di, fi);
if(sample==0)
- sprintf(name, "%s_%s.exr", fi, re->scene->id.name+2);
+ sprintf(name, "%s_%s.exr", fi, scene->id.name+2);
else
- sprintf(name, "%s_%s%d.exr", fi, re->scene->id.name+2, sample);
+ sprintf(name, "%s_%s%d.exr", fi, scene->id.name+2, sample);
BLI_make_file_string("/", str, btempdir, name);
}
+static void render_unique_exr_name(Render *re, char *str, int sample)
+{
+ scene_unique_exr_name(re->scene, str, sample);
+}
+
static void render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channels, int passtype)
{
- char *typestr= get_pass_name(passtype, 0);
+ const char *typestr= get_pass_name(passtype, 0);
RenderPass *rpass= MEM_callocN(sizeof(RenderPass), typestr);
int rectsize= rr->rectx*rr->recty*channels;
@@ -802,7 +808,7 @@ static char *make_pass_name(RenderPass *rpass, int chan)
/* filename already made absolute */
/* called from within UI, saves both rendered result as a file-read result */
-void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress)
+void RE_WriteRenderResult(RenderResult *rr, const char *filename, int compress)
{
RenderLayer *rl;
RenderPass *rpass;
@@ -861,7 +867,7 @@ static void *ml_addlayer_cb(void *base, char *str)
BLI_strncpy(rl->name, str, EXR_LAY_MAXNAME);
return rl;
}
-static void ml_addpass_cb(void *base, void *lay, char *str, float *rect, int totchan, char *chan_id)
+static void ml_addpass_cb(void *UNUSED(base), void *lay, char *str, float *rect, int totchan, char *chan_id)
{
RenderLayer *rl= lay;
RenderPass *rpass= MEM_callocN(sizeof(RenderPass), "loaded pass");
@@ -919,7 +925,7 @@ static void renderresult_add_names(RenderResult *rr)
}
/* called for reading temp files, and for external engines */
-static int read_render_result_from_file(char *filename, RenderResult *rr)
+static int read_render_result_from_file(const char *filename, RenderResult *rr)
{
RenderLayer *rl;
RenderPass *rpass;
@@ -1158,6 +1164,18 @@ Render *RE_NewRender(const char *name)
BLI_rw_mutex_init(&re->resultmutex);
}
+ RE_InitRenderCB(re);
+
+ /* init some variables */
+ re->ycor= 1.0f;
+
+ return re;
+}
+
+/* called for new renders and when finishing rendering so
+ * we calways have valid callbacks on a render */
+void RE_InitRenderCB(Render *re)
+{
/* set default empty callbacks */
re->display_init= result_nothing;
re->display_clear= result_nothing;
@@ -1171,11 +1189,6 @@ Render *RE_NewRender(const char *name)
re->stats_draw= stats_nothing;
/* clear callback handles */
re->dih= re->dch= re->ddh= re->sdh= re->prh= re->tbh= re->erh= NULL;
-
- /* init some variables */
- re->ycor= 1.0f;
-
- return re;
}
/* only call this while you know it will remove the link too */
@@ -1235,6 +1248,9 @@ void RE_InitState(Render *re, Render *source, RenderData *rd, SceneRenderLayer *
return;
}
+ if((re->r.mode & (R_OSA))==0)
+ re->r.scemode &= ~R_FULL_SAMPLE;
+
#ifdef WITH_OPENEXR
if(re->r.scemode & R_FULL_SAMPLE)
re->r.scemode |= R_EXR_TILE_FILE; /* enable automatic */
@@ -1387,7 +1403,7 @@ void RE_test_break_cb(Render *re, void *handle, int (*f)(void *handle))
re->test_break= f;
re->tbh= handle;
}
-void RE_error_cb(Render *re, void *handle, void (*f)(void *handle, char *str))
+void RE_error_cb(Render *re, void *handle, void (*f)(void *handle, const char *str))
{
re->error= f;
re->erh= handle;
@@ -1398,7 +1414,7 @@ void RE_error_cb(Render *re, void *handle, void (*f)(void *handle, char *str))
/* object is considered fully prepared on correct time etc */
/* includes lights */
-void RE_AddObject(Render *re, Object *ob)
+void RE_AddObject(Render *UNUSED(re), Object *UNUSED(ob))
{
}
@@ -1478,14 +1494,15 @@ static void *do_part_thread(void *pa_v)
float panorama_pixel_rot(Render *re)
{
float psize, phi, xfac;
+ float borderfac= (float)(re->disprect.xmax - re->disprect.xmin) / (float)re->winx;
/* size of 1 pixel mapped to viewplane coords */
- psize= (re->viewplane.xmax-re->viewplane.xmin)/(float)re->winx;
+ psize= (re->viewplane.xmax-re->viewplane.xmin)/(float)(re->winx);
/* angle of a pixel */
phi= atan(psize/re->clipsta);
/* correction factor for viewplane shifting, first calculate how much the viewplane angle is */
- xfac= ((re->viewplane.xmax-re->viewplane.xmin))/(float)re->xparts;
+ xfac= borderfac*((re->viewplane.xmax-re->viewplane.xmin))/(float)re->xparts;
xfac= atan(0.5f*xfac/re->clipsta);
/* and how much the same viewplane angle is wrapped */
psize= 0.5f*phi*((float)re->partx);
@@ -1518,8 +1535,8 @@ static RenderPart *find_next_pano_slice(Render *re, int *minx, rctf *viewplane)
float phi= panorama_pixel_rot(re);
R.panodxp= (re->winx - (best->disprect.xmin + best->disprect.xmax) )/2;
- R.panodxv= ((viewplane->xmax-viewplane->xmin)*R.panodxp)/(float)R.winx;
-
+ R.panodxv= ((viewplane->xmax-viewplane->xmin)*R.panodxp)/(float)(re->winx);
+
/* shift viewplane */
R.viewplane.xmin = viewplane->xmin + R.panodxv;
R.viewplane.xmax = viewplane->xmax + R.panodxv;
@@ -1537,8 +1554,10 @@ static RenderPart *find_next_pano_slice(Render *re, int *minx, rctf *viewplane)
static RenderPart *find_next_part(Render *re, int minx)
{
RenderPart *pa, *best= NULL;
- int centx=re->winx/2, centy=re->winy/2, tot=1;
- int mindist, distx, disty;
+
+ /* long long int's needed because of overflow [#24414] */
+ long long int centx=re->winx/2, centy=re->winy/2, tot=1;
+ long long int mindist= (long long int)re->winx * (long long int)re->winy;
/* find center of rendered parts, image center counts for 1 too */
for(pa= re->parts.first; pa; pa= pa->next) {
@@ -1552,12 +1571,11 @@ static RenderPart *find_next_part(Render *re, int minx)
centy/=tot;
/* closest of the non-rendering parts */
- mindist= re->winx*re->winy;
for(pa= re->parts.first; pa; pa= pa->next) {
if(pa->ready==0 && pa->nr==0) {
- distx= centx - (pa->disprect.xmin+pa->disprect.xmax)/2;
- disty= centy - (pa->disprect.ymin+pa->disprect.ymax)/2;
- distx= (int)sqrt(distx*distx + disty*disty);
+ long long int distx= centx - (pa->disprect.xmin+pa->disprect.xmax)/2;
+ long long int disty= centy - (pa->disprect.ymin+pa->disprect.ymax)/2;
+ distx= (long long int)sqrt(distx*distx + disty*disty);
if(distx<mindist) {
if(re->r.mode & R_PANORAMA) {
if(pa->disprect.xmin==minx) {
@@ -1964,7 +1982,7 @@ static void do_render_fields_3d(Render *re)
/* first field, we have to call camera routine for correct aspect and subpixel offset */
RE_SetCamera(re, re->scene->camera);
- if(re->r.mode & R_MBLUR)
+ if(re->r.mode & R_MBLUR && (re->r.scemode & R_FULL_SAMPLE)==0)
do_render_blur_3d(re);
else
do_render_3d(re);
@@ -1984,7 +2002,7 @@ static void do_render_fields_3d(Render *re)
re->field_offs = 0.5f;
}
RE_SetCamera(re, re->scene->camera);
- if(re->r.mode & R_MBLUR)
+ if(re->r.mode & R_MBLUR && (re->r.scemode & R_FULL_SAMPLE)==0)
do_render_blur_3d(re);
else
do_render_3d(re);
@@ -2032,7 +2050,7 @@ static void load_backbuffer(Render *re)
char name[256];
strcpy(name, re->r.backbuf);
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, re->main->name);
BLI_path_frame(name, re->r.cfra, 0);
if(re->backbuf) {
@@ -2041,7 +2059,7 @@ static void load_backbuffer(Render *re)
BKE_image_signal(re->backbuf, NULL, IMA_SIGNAL_RELOAD);
}
- re->backbuf= BKE_add_image_file(name, re->r.cfra);
+ re->backbuf= BKE_add_image_file(name);
ibuf= BKE_image_get_ibuf(re->backbuf, NULL);
if(ibuf==NULL) {
// error() doesnt work with render window open
@@ -2074,7 +2092,7 @@ static void do_render_fields_blur_3d(Render *re)
if(re->r.mode & R_FIELDS)
do_render_fields_3d(re);
- else if(re->r.mode & R_MBLUR)
+ else if(re->r.mode & R_MBLUR && (re->r.scemode & R_FULL_SAMPLE)==0)
do_render_blur_3d(re);
else
do_render_3d(re);
@@ -2188,6 +2206,7 @@ static void ntree_render_scenes(Render *re)
{
bNode *node;
int cfra= re->scene->r.cfra;
+ int restore_scene= 0;
if(re->scene->nodetree==NULL) return;
@@ -2199,12 +2218,19 @@ static void ntree_render_scenes(Render *re)
if(node->type==CMP_NODE_R_LAYERS) {
if(node->id && node->id != (ID *)re->scene) {
if(node->id->flag & LIB_DOIT) {
- render_scene(re, (Scene *)node->id, cfra);
+ Scene *scene = (Scene*)node->id;
+
+ render_scene(re, scene, cfra);
+ restore_scene= (scene != re->scene);
node->id->flag &= ~LIB_DOIT;
}
}
}
}
+
+ /* restore scene if we rendered another last */
+ if(restore_scene)
+ set_scene_bg(re->main, re->scene);
}
/* helper call to detect if theres a composite with render-result node */
@@ -2226,7 +2252,7 @@ static int composite_needs_render(Scene *sce)
}
/* bad call... need to think over proper method still */
-static void render_composit_stats(void *unused, char *str)
+static void render_composit_stats(void *UNUSED(arg), char *str)
{
R.i.infostr= str;
R.stats_draw(R.sdh, &R.i);
@@ -2312,10 +2338,17 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
BLI_rw_mutex_unlock(&re->resultmutex);
}
-void RE_MergeFullSample(Render *re, Scene *sce, bNodeTree *ntree)
+/* called externally, via compositor */
+void RE_MergeFullSample(Render *re, Main *bmain, Scene *sce, bNodeTree *ntree)
{
Scene *scene;
bNode *node;
+
+ /* default start situation */
+ G.afbreek= 0;
+
+ re->main= bmain;
+ re->scene= sce;
/* first call RE_ReadRenderResult on every renderlayer scene. this creates Render structs */
@@ -2451,8 +2484,9 @@ static void do_render_seq(Render * re)
{
static int recurs_depth = 0;
struct ImBuf *ibuf;
- RenderResult *rr = re->result;
+ RenderResult *rr; /* don't assign re->result here as it might change during give_ibuf_seq */
int cfra = re->r.cfra;
+ SeqRenderData context;
re->i.cfra= cfra;
@@ -2463,9 +2497,15 @@ static void do_render_seq(Render * re)
recurs_depth++;
- ibuf= give_ibuf_seq(re->main, re->scene, rr->rectx, rr->recty, cfra, 0, 100.0);
+ context = seq_new_render_data(re->main, re->scene,
+ re->result->rectx, re->result->recty,
+ 100);
+
+ ibuf = give_ibuf_seq(context, cfra, 0);
recurs_depth--;
+
+ rr = re->result;
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
@@ -2507,6 +2547,12 @@ static void do_render_seq(Render * re)
/* if (R.rectz) freeN(R.rectz); */
/* R.rectz = BLI_dupallocN(ibuf->zbuf); */
/* } */
+
+ /* Same things as above, old rectf can hang around from previous render. */
+ if(rr->rectf) {
+ MEM_freeN(rr->rectf);
+ rr->rectf= NULL;
+ }
}
if (recurs_depth == 0) { /* with nested scenes, only free on toplevel... */
@@ -2528,6 +2574,9 @@ static void do_render_seq(Render * re)
}
BLI_rw_mutex_unlock(&re->resultmutex);
+
+ /* just in case this flag went missing at some point */
+ re->r.scemode |= R_DOSEQ;
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
@@ -2573,61 +2622,108 @@ static void do_render_all_options(Render *re)
}
}
-static int is_rendering_allowed(Render *re)
+static int check_valid_camera(Scene *scene)
+{
+ int check_comp= 1;
+
+ if (scene->camera == NULL)
+ scene->camera= scene_find_camera(scene);
+
+ if(scene->r.scemode&R_DOSEQ) {
+ if(scene->ed) {
+ Sequence *seq= scene->ed->seqbase.first;
+
+ check_comp= 0;
+
+ while(seq) {
+ if(seq->type == SEQ_SCENE) {
+ if(!seq->scene_camera) {
+ if(!seq->scene->camera && !scene_find_camera(seq->scene)) {
+ if(seq->scene == scene) {
+ /* for current scene camera could be unneeded due to compisite nodes */
+ check_comp= 1;
+ } else {
+ /* for other scenes camera is necessary */
+ return 0;
+ }
+ }
+ }
+ }
+
+ seq= seq->next;
+ }
+ }
+ }
+
+ if(check_comp) { /* no sequencer or sequencer depends on compositor */
+ if(scene->r.scemode&R_DOCOMP && scene->use_nodes) {
+ bNode *node= scene->nodetree->nodes.first;
+
+ while(node) {
+ if(node->type == CMP_NODE_R_LAYERS) {
+ Scene *sce= node->id ? (Scene*)node->id : scene;
+
+ if(!sce->camera && !scene_find_camera(sce)) {
+ /* all render layers nodes need camera */
+ return 0;
+ }
+ }
+
+ node= node->next;
+ }
+ } else return scene->camera != NULL;
+ }
+
+ return 1;
+}
+
+int RE_is_rendering_allowed(Scene *scene, void *erh, void (*error)(void *handle, const char *str))
{
SceneRenderLayer *srl;
/* forbidden combinations */
- if(re->r.mode & R_PANORAMA) {
- if(re->r.mode & R_BORDER) {
- re->error(re->erh, "No border supported for Panorama");
- return 0;
- }
- if(re->r.mode & R_ORTHO) {
- re->error(re->erh, "No Ortho render possible for Panorama");
+ if(scene->r.mode & R_PANORAMA) {
+ if(scene->r.mode & R_ORTHO) {
+ error(erh, "No Ortho render possible for Panorama");
return 0;
}
}
- if(re->r.mode & R_BORDER) {
- if(re->r.border.xmax <= re->r.border.xmin ||
- re->r.border.ymax <= re->r.border.ymin) {
- re->error(re->erh, "No border area selected.");
+ if(scene->r.mode & R_BORDER) {
+ if(scene->r.border.xmax <= scene->r.border.xmin ||
+ scene->r.border.ymax <= scene->r.border.ymin) {
+ error(erh, "No border area selected.");
return 0;
}
}
- if(re->r.scemode & (R_EXR_TILE_FILE|R_FULL_SAMPLE)) {
+ if(scene->r.scemode & (R_EXR_TILE_FILE|R_FULL_SAMPLE)) {
char str[FILE_MAX];
- render_unique_exr_name(re, str, 0);
+ scene_unique_exr_name(scene, str, 0);
if (BLI_is_writable(str)==0) {
- re->error(re->erh, "Can not save render buffers, check the temp default path");
+ error(erh, "Can not save render buffers, check the temp default path");
return 0;
}
- /* no osa + fullsample won't work... */
- if(re->osa==0)
- re->r.scemode &= ~R_FULL_SAMPLE;
-
/* no fullsample and edge */
- if((re->r.scemode & R_FULL_SAMPLE) && (re->r.mode & R_EDGE)) {
- re->error(re->erh, "Full Sample doesn't support Edge Enhance");
+ if((scene->r.scemode & R_FULL_SAMPLE) && (scene->r.mode & R_EDGE)) {
+ error(erh, "Full Sample doesn't support Edge Enhance");
return 0;
}
}
else
- re->r.scemode &= ~R_FULL_SAMPLE; /* clear to be sure */
+ scene->r.scemode &= ~R_FULL_SAMPLE; /* clear to be sure */
- if(re->r.scemode & R_DOCOMP) {
- if(re->scene->use_nodes) {
- bNodeTree *ntree= re->scene->nodetree;
+ if(scene->r.scemode & R_DOCOMP) {
+ if(scene->use_nodes) {
+ bNodeTree *ntree= scene->nodetree;
bNode *node;
if(ntree==NULL) {
- re->error(re->erh, "No Nodetree in Scene");
+ error(erh, "No Nodetree in Scene");
return 0;
}
@@ -2635,49 +2731,60 @@ static int is_rendering_allowed(Render *re)
if(node->type==CMP_NODE_COMPOSITE)
break;
-
if(node==NULL) {
- re->error(re->erh, "No Render Output Node in Scene");
+ error(erh, "No Render Output Node in Scene");
return 0;
}
+
+ if(scene->r.scemode & R_FULL_SAMPLE) {
+ if(composite_needs_render(scene)==0) {
+ error(erh, "Full Sample AA not supported without 3d rendering");
+ return 0;
+ }
+ }
}
}
/* check valid camera, without camera render is OK (compo, seq) */
- if(re->scene->camera==NULL)
- re->scene->camera= scene_find_camera(re->scene);
-
- if(!(re->r.scemode & (R_DOSEQ|R_DOCOMP))) {
- if(re->scene->camera==NULL) {
- re->error(re->erh, "No camera");
- return 0;
- }
+ if(!check_valid_camera(scene)) {
+ error(erh, "No camera");
+ return 0;
}
/* layer flag tests */
- if(re->r.scemode & R_SINGLE_LAYER) {
- srl= BLI_findlink(&re->scene->r.layers, re->r.actlay);
+ if(scene->r.scemode & R_SINGLE_LAYER) {
+ srl= BLI_findlink(&scene->r.layers, scene->r.actlay);
/* force layer to be enabled */
srl->layflag &= ~SCE_LAY_DISABLE;
}
- for(srl= re->scene->r.layers.first; srl; srl= srl->next)
+ for(srl= scene->r.layers.first; srl; srl= srl->next)
if(!(srl->layflag & SCE_LAY_DISABLE))
break;
if(srl==NULL) {
- re->error(re->erh, "All RenderLayers are disabled");
+ error(erh, "All RenderLayers are disabled");
return 0;
}
/* renderer */
- if(!ELEM(re->r.renderer, R_INTERN, R_YAFRAY)) {
- re->error(re->erh, "Unknown render engine set");
+ if(!ELEM(scene->r.renderer, R_INTERN, R_YAFRAY)) {
+ error(erh, "Unknown render engine set");
return 0;
}
+
return 1;
}
-static void update_physics_cache(Render *re, Scene *scene, int anim_init)
+static void validate_render_settings(Render *re)
+{
+ if(re->r.scemode & (R_EXR_TILE_FILE|R_FULL_SAMPLE)) {
+ /* no osa + fullsample won't work... */
+ if(re->r.osa==0)
+ re->r.scemode &= ~R_FULL_SAMPLE;
+ } else re->r.scemode &= ~R_FULL_SAMPLE; /* clear to be sure */
+}
+
+static void update_physics_cache(Render *re, Scene *scene, int UNUSED(anim_init))
{
PTCacheBaker baker;
@@ -2692,7 +2799,7 @@ static void update_physics_cache(Render *re, Scene *scene, int anim_init)
baker.break_data = re->tbh;
baker.progressbar = NULL;
- BKE_ptcache_make_cache(&baker);
+ BKE_ptcache_bake(&baker);
}
/* evaluating scene options for general Blender render */
static int render_initialize_from_main(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int anim, int anim_init)
@@ -2753,10 +2860,9 @@ static int render_initialize_from_main(Render *re, Main *bmain, Scene *scene, Sc
/* initstate makes new result, have to send changed tags around */
ntreeCompositTagRender(re->scene);
-
- if(!is_rendering_allowed(re))
- return 0;
-
+
+ validate_render_settings(re);
+
re->display_init(re->dih, re->result);
re->display_clear(re->dch, re->result);
@@ -2764,7 +2870,7 @@ static int render_initialize_from_main(Render *re, Main *bmain, Scene *scene, Sc
}
/* general Blender frame render call */
-void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int frame)
+void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int frame, const short write_still)
{
/* ugly global still... is to prevent preview events and signal subsurfs etc to make full resol */
G.rendering= 1;
@@ -2774,13 +2880,27 @@ void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *sr
if(render_initialize_from_main(re, bmain, scene, srl, lay, 0, 0)) {
MEM_reset_peak_memory();
do_render_all_options(re);
+
+ if(write_still && !G.afbreek) {
+ if(BKE_imtype_is_movie(scene->r.imtype)) {
+ /* operator checks this but incase its called from elsewhere */
+ printf("Error: cant write single images with a movie format!\n");
+ }
+ else {
+ char name[FILE_MAX];
+ BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, FALSE);
+
+ /* reports only used for Movie */
+ do_write_image_or_movie(re, scene, NULL, NULL, name);
+ }
+ }
}
-
+
/* UGLY WARNING */
G.rendering= 0;
}
-static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, ReportList *reports)
+static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, ReportList *reports, const char *name_override)
{
char name[FILE_MAX];
RenderResult rres;
@@ -2804,7 +2924,10 @@ static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, R
printf("Append frame %d", scene->r.cfra);
}
else {
- BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION);
+ if(name_override)
+ BLI_strncpy(name, name_override, sizeof(name));
+ else
+ BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, TRUE);
if(re->r.imtype==R_MULTILAYER) {
if(re->result) {
@@ -2813,7 +2936,7 @@ static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, R
}
}
else {
- ImBuf *ibuf= IMB_allocImBuf(rres.rectx, rres.recty, scene->r.planes, 0, 0);
+ ImBuf *ibuf= IMB_allocImBuf(rres.rectx, rres.recty, scene->r.planes, 0);
/* if not exists, BKE_write_ibuf makes one */
ibuf->rect= (unsigned int *)rres.rect32;
@@ -2894,7 +3017,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, unsigned int lay, int
do_render_all_options(re);
if(re->test_break(re->tbh) == 0) {
- if(!do_write_image_or_movie(re, scene, mh, reports))
+ if(!do_write_image_or_movie(re, scene, mh, reports, NULL))
G.afbreek= 1;
}
} else {
@@ -2931,7 +3054,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, unsigned int lay, int
/* Touch/NoOverwrite options are only valid for image's */
if(BKE_imtype_is_movie(scene->r.imtype) == 0) {
if(scene->r.mode & (R_NO_OVERWRITE | R_TOUCH))
- BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION);
+ BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, TRUE);
if(scene->r.mode & R_NO_OVERWRITE && BLI_exist(name)) {
printf("skipping existing frame \"%s\"\n", name);
@@ -2949,7 +3072,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, unsigned int lay, int
if(re->test_break(re->tbh) == 0) {
if(!G.afbreek)
- if(!do_write_image_or_movie(re, scene, mh, reports))
+ if(!do_write_image_or_movie(re, scene, mh, reports, NULL))
G.afbreek= 1;
}
else
@@ -3140,7 +3263,7 @@ int RE_engine_test_break(RenderEngine *engine)
return re->test_break(re->tbh);
}
-void RE_engine_update_stats(RenderEngine *engine, char *stats, char *info)
+void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info)
{
Render *re= engine->re;
@@ -3153,7 +3276,7 @@ void RE_engine_update_stats(RenderEngine *engine, char *stats, char *info)
/* loads in image into a result, size must match
* x/y offsets are only used on a partial copy when dimensions dont match */
-void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, char *filename)
+void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, const char *filename, int x, int y)
{
ImBuf *ibuf = IMB_loadiffname(filename, IB_rect);
@@ -3164,15 +3287,15 @@ void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, char *file
memcpy(layer->rectf, ibuf->rect_float, sizeof(float)*4*layer->rectx*layer->recty);
} else {
- if ((ibuf->x >= layer->rectx) && (ibuf->y >= layer->recty)) {
+ if ((ibuf->x - x >= layer->rectx) && (ibuf->y - y >= layer->recty)) {
ImBuf *ibuf_clip;
if(ibuf->rect_float==NULL)
IMB_float_from_rect(ibuf);
- ibuf_clip = IMB_allocImBuf(layer->rectx, layer->recty, 32, IB_rectfloat, 0);
+ ibuf_clip = IMB_allocImBuf(layer->rectx, layer->recty, 32, IB_rectfloat);
if(ibuf_clip) {
- IMB_rectcpy(ibuf_clip, ibuf, 0,0, 0,0, layer->rectx, layer->recty);
+ IMB_rectcpy(ibuf_clip, ibuf, 0,0, x,y, layer->rectx, layer->recty);
memcpy(layer->rectf, ibuf_clip->rect_float, sizeof(float)*4*layer->rectx*layer->recty);
IMB_freeImBuf(ibuf_clip);
@@ -3193,7 +3316,7 @@ void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, char *file
}
}
-void RE_result_load_from_file(RenderResult *result, ReportList *reports, char *filename)
+void RE_result_load_from_file(RenderResult *result, ReportList *reports, const char *filename)
{
if(!read_render_result_from_file(filename, result)) {
BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to load '%s'\n", filename);
diff --git a/source/blender/render/intern/source/pixelshading.c b/source/blender/render/intern/source/pixelshading.c
index 768fc4ecacb..74b59c881bb 100644
--- a/source/blender/render/intern/source/pixelshading.c
+++ b/source/blender/render/intern/source/pixelshading.c
@@ -27,14 +27,14 @@
#include <float.h>
#include <math.h>
#include <string.h>
+
#include "BLI_math.h"
+#include "BLI_utildefines.h"
/* External modules: */
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
-
-
#include "DNA_camera_types.h"
#include "DNA_group_types.h"
#include "DNA_material_types.h"
@@ -48,7 +48,7 @@
#include "BKE_global.h"
#include "BKE_material.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
/* own module */
#include "render_types.h"
diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c
index 1ca1ea10273..15279fea01d 100644
--- a/source/blender/render/intern/source/pointdensity.c
+++ b/source/blender/render/intern/source/pointdensity.c
@@ -32,6 +32,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_kdopbvh.h"
+#include "BLI_utildefines.h"
#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
@@ -94,7 +95,7 @@ static void pointdensity_cache_psys(Render *re, PointDensity *pd, Object *ob, Pa
{
DerivedMesh* dm;
ParticleKey state;
- ParticleSimulationData sim = {re->scene, ob, psys, NULL};
+ ParticleSimulationData sim= {0};
ParticleData *pa=NULL;
float cfra = BKE_curframe(re->scene);
int i, childexists;
@@ -103,10 +104,9 @@ static void pointdensity_cache_psys(Render *re, PointDensity *pd, Object *ob, Pa
float partco[3];
float obview[4][4];
-
/* init everything */
if (!psys || !ob || !pd) return;
-
+
mul_m4_m4m4(obview, re->viewinv, ob->obmat);
/* Just to create a valid rendering context for particles */
@@ -119,6 +119,10 @@ static void pointdensity_cache_psys(Render *re, PointDensity *pd, Object *ob, Pa
return;
}
+ sim.scene= re->scene;
+ sim.ob= ob;
+ sim.psys= psys;
+
/* in case ob->imat isn't up-to-date */
invert_m4_m4(ob->imat, ob->obmat);
@@ -253,7 +257,7 @@ static void cache_pointdensity(Render *re, Tex *tex)
}
}
-static void free_pointdensity(Render *re, Tex *tex)
+static void free_pointdensity(Render *UNUSED(re), Tex *tex)
{
PointDensity *pd = tex->pd;
diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c
index 724fd9a3110..00092b8b053 100644
--- a/source/blender/render/intern/source/rayshade.c
+++ b/source/blender/render/intern/source/rayshade.c
@@ -37,15 +37,16 @@
#include "DNA_material_types.h"
#include "DNA_lamp_types.h"
-#include "BKE_global.h"
-#include "BKE_node.h"
-#include "BKE_utildefines.h"
-
#include "BLI_blenlib.h"
#include "BLI_cpu.h"
#include "BLI_jitter.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_global.h"
+#include "BKE_node.h"
+
#include "PIL_time.h"
@@ -59,13 +60,13 @@
#include "texture.h"
#include "volumetric.h"
-#include "RE_raytrace.h"
+#include "rayintersection.h"
#include "rayobject.h"
#include "raycounter.h"
#define RAY_TRA 1
-#define RAY_TRAFLIP 2
+#define RAY_INSIDE 2
#define DEPTH_SHADOW_TRA 10
@@ -194,7 +195,7 @@ void freeraytree(Render *re)
static int is_raytraceable_vlr(Render *re, VlakRen *vlr)
{
/* note: volumetric must be tracable, wire must not */
- if((re->flag & R_BAKE_TRACE) || (vlr->mat->mode & MA_TRACEBLE) || (vlr->mat->material_type == MA_TYPE_VOLUME))
+ if((re->flag & R_BAKE_TRACE) || (vlr->flag & R_TRACEBLE) || (vlr->mat->material_type == MA_TYPE_VOLUME))
if(vlr->mat->material_type != MA_TYPE_WIRE)
return 1;
return 0;
@@ -208,12 +209,13 @@ static int is_raytraceable(Render *re, ObjectInstanceRen *obi)
if(re->excludeob && obr->ob == re->excludeob)
return 0;
- for(v=0;v<obr->totvlak;v++)
- {
+ for(v=0;v<obr->totvlak;v++) {
VlakRen *vlr = obr->vlaknodes[v>>8].vlak + (v&255);
+
if(is_raytraceable_vlr(re, vlr))
return 1;
}
+
return 0;
}
@@ -443,11 +445,7 @@ void makeraytree(Render *re)
if(re->r.raytrace_structure == R_RAYSTRUCTURE_OCTREE)
re->r.raytrace_options &= ~( R_RAYTRACE_USE_INSTANCES | R_RAYTRACE_USE_LOCAL_COORDS);
- if(G.f & G_DEBUG) {
- BENCH(makeraytree_single(re), tree_build);
- }
- else
- makeraytree_single(re);
+ makeraytree_single(re);
if(test_break(re))
{
@@ -468,7 +466,9 @@ void makeraytree(Render *re)
max[i] += 0.01f;
sub[i] = max[i]-min[i];
}
- re->maxdist = sqrt( sub[0]*sub[0] + sub[1]*sub[1] + sub[2]*sub[2] );
+
+ re->maxdist= sub[0]*sub[0] + sub[1]*sub[1] + sub[2]*sub[2];
+ if(re->maxdist > 0.0f) re->maxdist= sqrt(re->maxdist);
re->i.infostr= "Raytree finished";
re->stats_draw(re->sdh, &re->i);
@@ -479,21 +479,52 @@ void makeraytree(Render *re)
#endif
}
+/* if(shi->osatex) */
+static void shade_ray_set_derivative(ShadeInput *shi)
+{
+ float *v1= shi->v1->co;
+ float *v2= shi->v2->co;
+ float *v3= shi->v3->co;
+ float detsh, t00, t10, t01, t11, xn, yn, zn;
+ int axis1, axis2;
+
+ /* find most stable axis to project */
+ xn= fabs(shi->facenor[0]);
+ yn= fabs(shi->facenor[1]);
+ zn= fabs(shi->facenor[2]);
+
+ if(zn>=xn && zn>=yn) { axis1= 0; axis2= 1; }
+ else if(yn>=xn && yn>=zn) { axis1= 0; axis2= 2; }
+ else { axis1= 1; axis2= 2; }
+
+ /* compute u,v and derivatives */
+ t00= v3[axis1]-v1[axis1]; t01= v3[axis2]-v1[axis2];
+ t10= v3[axis1]-v2[axis1]; t11= v3[axis2]-v2[axis2];
+
+ detsh= 1.0f/(t00*t11-t10*t01);
+ t00*= detsh; t01*=detsh;
+ t10*=detsh; t11*=detsh;
+
+ shi->dx_u= shi->dxco[axis1]*t11- shi->dxco[axis2]*t10;
+ shi->dx_v= shi->dxco[axis2]*t00- shi->dxco[axis1]*t01;
+ shi->dy_u= shi->dyco[axis1]*t11- shi->dyco[axis2]*t10;
+ shi->dy_v= shi->dyco[axis2]*t00- shi->dyco[axis1]*t01;
+
+}
void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
{
ObjectInstanceRen *obi= (ObjectInstanceRen*)is->hit.ob;
VlakRen *vlr= (VlakRen*)is->hit.face;
- int osatex= 0;
/* set up view vector */
- VECCOPY(shi->view, is->vec);
+ VECCOPY(shi->view, is->dir);
/* render co */
- shi->co[0]= is->start[0]+is->labda*(shi->view[0]);
- shi->co[1]= is->start[1]+is->labda*(shi->view[1]);
- shi->co[2]= is->start[2]+is->labda*(shi->view[2]);
+ shi->co[0]= is->start[0]+is->dist*(shi->view[0]);
+ shi->co[1]= is->start[1]+is->dist*(shi->view[1]);
+ shi->co[2]= is->start[2]+is->dist*(shi->view[2]);
normalize_v3(shi->view);
@@ -503,32 +534,17 @@ void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
shi->mat= vlr->mat;
shade_input_init_material(shi);
- // Osa structs we leave unchanged now
- SWAP(int, osatex, shi->osatex);
-
- shi->dxco[0]= shi->dxco[1]= shi->dxco[2]= 0.0f;
- shi->dyco[0]= shi->dyco[1]= shi->dyco[2]= 0.0f;
-
- // but, set Osa stuff to zero where it can confuse texture code
- if(shi->mat->texco & (TEXCO_NORM|TEXCO_REFL) ) {
- shi->dxno[0]= shi->dxno[1]= shi->dxno[2]= 0.0f;
- shi->dyno[0]= shi->dyno[1]= shi->dyno[2]= 0.0f;
- }
-
- if(vlr->v4) {
- if(is->isect==2)
- shade_input_set_triangle_i(shi, obi, vlr, 2, 1, 3);
- else
- shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 3);
- }
- else {
+ if(is->isect==2)
+ shade_input_set_triangle_i(shi, obi, vlr, 0, 2, 3);
+ else
shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
- }
shi->u= is->u;
shi->v= is->v;
shi->dx_u= shi->dx_v= shi->dy_u= shi->dy_v= 0.0f;
+ if(shi->osatex)
+ shade_ray_set_derivative(shi);
shade_input_set_normals(shi);
shade_input_set_shade_texco(shi);
@@ -560,8 +576,6 @@ void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
/* raytrace likes to separate the spec color */
VECSUB(shr->diff, shr->combined, shr->spec);
}
-
- SWAP(int, osatex, shi->osatex); // XXXXX!!!!
}
@@ -695,25 +709,18 @@ static void ray_fadeout(Isect *is, ShadeInput *shi, float *col, float *blendcol,
/* the main recursive tracer itself
* note: 'col' must be initialized */
-static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, float *start, float *vec, float *col, ObjectInstanceRen *obi, VlakRen *vlr, int traflag)
+static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, float *start, float *dir, float *col, ObjectInstanceRen *obi, VlakRen *vlr, int traflag)
{
- ShadeInput shi;
- ShadeResult shr;
+ ShadeInput shi= {0};
Isect isec;
- float f, f1, fr, fg, fb;
- float ref[3];
float dist_mir = origshi->mat->dist_mir;
-
- /* Warning, This is not that nice, and possibly a bit slow for every ray,
- however some variables were not initialized properly in, unless using shade_input_initialize(...), we need to do a memset */
- memset(&shi, 0, sizeof(ShadeInput));
- /* end warning! - Campbell */
VECCOPY(isec.start, start);
- VECCOPY(isec.vec, vec );
- isec.labda = dist_mir > 0 ? dist_mir : RE_RAYTRACE_MAXDIST;
+ VECCOPY(isec.dir, dir );
+ isec.dist = dist_mir > 0 ? dist_mir : RE_RAYTRACE_MAXDIST;
isec.mode= RE_RAY_MIRROR;
- isec.skip = RE_SKIP_VLR_NEIGHBOUR | RE_SKIP_VLR_RENDER_CHECK;
+ isec.check = RE_CHECK_VLR_RENDER;
+ isec.skip = RE_SKIP_VLR_NEIGHBOUR;
isec.hint = 0;
isec.orig.ob = obi;
@@ -721,11 +728,16 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
RE_RC_INIT(isec, shi);
if(RE_rayobject_raycast(R.raytree, &isec)) {
+ ShadeResult shr= {{0}};
float d= 1.0f;
+
+ /* for as long we don't have proper dx/dy transform for rays we copy over original */
+ VECCOPY(shi.dxco, origshi->dxco);
+ VECCOPY(shi.dyco, origshi->dyco);
shi.mask= origshi->mask;
shi.osatex= origshi->osatex;
- shi.depth= 1; /* only used to indicate tracing */
+ shi.depth= origshi->depth + 1; /* only used to indicate tracing */
shi.thread= origshi->thread;
//shi.sample= 0; // memset above, so dont need this
shi.xs= origshi->xs;
@@ -737,16 +749,16 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
shi.light_override= origshi->light_override;
shi.mat_override= origshi->mat_override;
- memset(&shr, 0, sizeof(ShadeResult));
-
shade_ray(&isec, &shi, &shr);
- if (traflag & RAY_TRA)
+ /* ray has traveled inside the material, so shade by transmission */
+ if (traflag & RAY_INSIDE)
d= shade_by_transmission(&isec, &shi, &shr);
if(depth>0) {
+ float fr, fg, fb, f, f1;
if((shi.mat->mode_l & MA_TRANSP) && shr.alpha < 1.0f) {
- float nf, f, f1, refract[3], tracol[4];
+ float nf, f, refract[3], tracol[4];
tracol[0]= shi.r;
tracol[1]= shi.g;
@@ -754,21 +766,33 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
tracol[3]= col[3]; // we pass on and accumulate alpha
if((shi.mat->mode & MA_TRANSP) && (shi.mat->mode & MA_RAYTRANSP)) {
- /* odd depths: use normal facing viewer, otherwise flip */
- if(traflag & RAY_TRAFLIP) {
+ if(traflag & RAY_INSIDE) {
+ /* inside the material, so use inverse normal */
float norm[3];
norm[0]= - shi.vn[0];
norm[1]= - shi.vn[1];
norm[2]= - shi.vn[2];
- if (!refraction(refract, norm, shi.view, shi.ang))
+
+ if (refraction(refract, norm, shi.view, shi.ang)) {
+ /* ray comes out from the material into air */
+ traflag &= ~RAY_INSIDE;
+ }
+ else {
+ /* total internal reflection (ray stays inside the material) */
reflection(refract, norm, shi.view, shi.vn);
+ }
}
else {
- if (!refraction(refract, shi.vn, shi.view, shi.ang))
+ if (refraction(refract, shi.vn, shi.view, shi.ang)) {
+ /* ray goes in to the material from air */
+ traflag |= RAY_INSIDE;
+ }
+ else {
+ /* total external reflection (ray doesn't enter the material) */
reflection(refract, shi.vn, shi.view, shi.vn);
+ }
}
- traflag |= RAY_TRA;
- traceray(origshi, origshr, depth-1, shi.co, refract, tracol, shi.obi, shi.vlr, traflag ^ RAY_TRAFLIP);
+ traceray(origshi, origshr, depth-1, shi.co, refract, tracol, shi.obi, shi.vlr, traflag);
}
else
traceray(origshi, origshr, depth-1, shi.co, shi.view, tracol, shi.obi, shi.vlr, 0);
@@ -799,6 +823,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
if(f!=0.0f) {
float mircol[4];
+ float ref[3];
reflection(ref, shi.vn, shi.view, NULL);
traceray(origshi, origshr, depth-1, shi.co, ref, mircol, shi.obi, shi.vlr, 0);
@@ -830,7 +855,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
/* max ray distance set, but found an intersection, so fade this color
* out towards the sky/material color for a smooth transition */
- ray_fadeout_endcolor(blendcol, origshi, &shi, origshr, &isec, vec);
+ ray_fadeout_endcolor(blendcol, origshi, &shi, origshr, &isec, dir);
ray_fadeout(&isec, &shi, col, blendcol, dist_mir);
}
}
@@ -842,7 +867,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
}
else {
- ray_fadeout_endcolor(col, origshi, &shi, origshr, &isec, vec);
+ ray_fadeout_endcolor(col, origshi, &shi, origshr, &isec, dir);
}
RE_RC_MERGE(&origshi->raycounter, &shi.raycounter);
}
@@ -1265,6 +1290,7 @@ static void trace_refract(float *col, ShadeInput *shi, ShadeResult *shr)
{
QMCSampler *qsa=NULL;
int samp_type;
+ int traflag=0;
float samp3d[3], orthx[3], orthy[3];
float v_refract[3], v_refract_new[3];
@@ -1292,7 +1318,18 @@ static void trace_refract(float *col, ShadeInput *shi, ShadeResult *shr)
while (samples < max_samples) {
- refraction(v_refract, shi->vn, shi->view, shi->ang);
+ if(refraction(v_refract, shi->vn, shi->view, shi->ang)) {
+ traflag |= RAY_INSIDE;
+ } else {
+ /* total external reflection can happen for materials with IOR < 1.0 */
+ if((shi->vlr->flag & R_SMOOTH))
+ reflection(v_refract, shi->vn, shi->view, shi->facenor);
+ else
+ reflection(v_refract, shi->vn, shi->view, NULL);
+
+ /* can't blur total external reflection */
+ max_samples = 1;
+ }
if (max_samples > 1) {
/* get a quasi-random vector from a phong-weighted disc */
@@ -1314,7 +1351,7 @@ static void trace_refract(float *col, ShadeInput *shi, ShadeResult *shr)
sampcol[0]= sampcol[1]= sampcol[2]= sampcol[3]= 0.0f;
- traceray(shi, shr, shi->mat->ray_depth_tra, shi->co, v_refract_new, sampcol, shi->obi, shi->vlr, RAY_TRA|RAY_TRAFLIP);
+ traceray(shi, shr, shi->mat->ray_depth_tra, shi->co, v_refract_new, sampcol, shi->obi, shi->vlr, traflag);
col[0] += sampcol[0];
col[1] += sampcol[1];
@@ -1465,8 +1502,8 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
float diff[3];
int do_tra, do_mir;
- do_tra= ((shi->mat->mode & MA_TRANSP) && (shi->mat->mode & MA_RAYTRANSP) && shr->alpha!=1.0f);
- do_mir= ((shi->mat->mode & MA_RAYMIRROR) && shi->ray_mirror!=0.0f);
+ do_tra= ((shi->mat->mode & MA_TRANSP) && (shi->mat->mode & MA_RAYTRANSP) && shr->alpha!=1.0f && (shi->depth <= shi->mat->ray_depth_tra));
+ do_mir= ((shi->mat->mode & MA_RAYMIRROR) && shi->ray_mirror!=0.0f && (shi->depth <= shi->mat->ray_depth));
/* raytrace mirror amd refract like to separate the spec color */
if(shi->combinedflag & SCE_PASS_SPEC)
@@ -1497,7 +1534,7 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
if(!(shi->combinedflag & SCE_PASS_REFRACT))
VECSUB(diff, diff, shr->refr);
- shr->alpha= tracol[3];
+ shr->alpha= MIN2(1.0f, tracol[3]);
}
if(do_mir) {
@@ -1560,13 +1597,13 @@ static void addAlphaLight(float *shadfac, float *col, float alpha, float filter)
shadfac[3]= (1.0f-alpha)*shadfac[3];
}
-static void ray_trace_shadow_tra(Isect *is, ShadeInput *origshi, int depth, int traflag)
+static void ray_trace_shadow_tra(Isect *is, ShadeInput *origshi, int depth, int traflag, float col[4])
{
/* ray to lamp, find first face that intersects, check alpha properties,
if it has col[3]>0.0f continue. so exit when alpha is full */
ShadeInput shi;
ShadeResult shr;
- float initial_labda = is->labda;
+ float initial_dist = is->dist;
if(RE_rayobject_raycast(R.raytree, is)) {
float d= 1.0f;
@@ -1577,7 +1614,7 @@ static void ray_trace_shadow_tra(Isect *is, ShadeInput *origshi, int depth, int
memset(&shi, 0, sizeof(ShadeInput));
/* end warning! - Campbell */
- shi.depth= 1; /* only used to indicate tracing */
+ shi.depth= origshi->depth + 1; /* only used to indicate tracing */
shi.mask= origshi->mask;
shi.thread= origshi->thread;
shi.passflag= SCE_PASS_COMBINED;
@@ -1594,21 +1631,26 @@ static void ray_trace_shadow_tra(Isect *is, ShadeInput *origshi, int depth, int
d= shade_by_transmission(is, &shi, &shr);
/* mix colors based on shadfac (rgb + amount of light factor) */
- addAlphaLight(is->col, shr.diff, shr.alpha, d*shi.mat->filter);
+ addAlphaLight(col, shr.diff, shr.alpha, d*shi.mat->filter);
} else if (shi.mat->material_type == MA_TYPE_VOLUME) {
- QUATCOPY(is->col, shr.combined);
- is->col[3] = 1.f;
+ const float a = col[3];
+
+ col[0] = a*col[0] + shr.alpha*shr.combined[0];
+ col[1] = a*col[1] + shr.alpha*shr.combined[1];
+ col[2] = a*col[2] + shr.alpha*shr.combined[2];
+
+ col[3] = (1.0 - shr.alpha)*a;
}
- if(depth>0 && is->col[3]>0.0f) {
+ if(depth>0 && col[3]>0.0f) {
/* adapt isect struct */
VECCOPY(is->start, shi.co);
- is->labda = initial_labda-is->labda;
+ is->dist = initial_dist-is->dist;
is->orig.ob = shi.obi;
is->orig.face = shi.vlr;
- ray_trace_shadow_tra(is, origshi, depth-1, traflag | RAY_TRA);
+ ray_trace_shadow_tra(is, origshi, depth-1, traflag | RAY_TRA, col);
}
RE_RC_MERGE(&origshi->raycounter, &shi.raycounter);
@@ -1655,8 +1697,8 @@ int ray_trace_shadow_rad(ShadeInput *ship, ShadeResult *shr)
vec[2]-= vec[2];
}
- VECCOPY(isec.vec, vec );
- isec.labda = RE_RAYTRACE_MAXDIST;
+ VECCOPY(isec.dir, vec );
+ isec.dist = RE_RAYTRACE_MAXDIST;
if(RE_rayobject_raycast(R.raytree, &isec)) {
float fac;
@@ -1667,7 +1709,7 @@ int ray_trace_shadow_rad(ShadeInput *ship, ShadeResult *shr)
/* end warning! - Campbell */
shade_ray(&isec, &shi, &shr_t);
- fac= isec.labda*isec.labda;
+ fac= isec.dist*isec.dist;
fac= 1.0f;
accum[0]+= fac*(shr_t.diff[0]+shr_t.spec[0]);
accum[1]+= fac*(shr_t.diff[1]+shr_t.spec[1]);
@@ -1850,7 +1892,8 @@ static void ray_ao_qmc(ShadeInput *shi, float *ao, float *env)
RE_RC_INIT(isec, *shi);
isec.orig.ob = shi->obi;
isec.orig.face = shi->vlr;
- isec.skip = RE_SKIP_VLR_NEIGHBOUR|RE_SKIP_VLR_NON_SOLID_MATERIAL;
+ isec.check = RE_CHECK_VLR_NON_SOLID_MATERIAL;
+ isec.skip = RE_SKIP_VLR_NEIGHBOUR;
isec.hint = 0;
isec.hit.ob = 0;
@@ -1885,7 +1928,7 @@ static void ray_ao_qmc(ShadeInput *shi, float *ao, float *env)
else {
VECCOPY(nrm, shi->facenor);
}
-
+
ortho_basis_v3v3_v3( up, side,nrm);
/* sampling init */
@@ -1903,7 +1946,6 @@ static void ray_ao_qmc(ShadeInput *shi, float *ao, float *env)
QMC_initPixel(qsa, shi->thread);
-
while (samples < max_samples) {
/* sampling, returns quasi-random vector in unit hemisphere */
@@ -1915,15 +1957,15 @@ static void ray_ao_qmc(ShadeInput *shi, float *ao, float *env)
normalize_v3(dir);
- isec.vec[0] = -dir[0];
- isec.vec[1] = -dir[1];
- isec.vec[2] = -dir[2];
- isec.labda = maxdist;
+ isec.dir[0] = -dir[0];
+ isec.dir[1] = -dir[1];
+ isec.dir[2] = -dir[2];
+ isec.dist = maxdist;
prev = fac;
if(RE_rayobject_raycast(R.raytree, &isec)) {
- if (R.wrld.aomode & WO_AODIST) fac+= exp(-isec.labda*R.wrld.aodistfac);
+ if (R.wrld.aomode & WO_AODIST) fac+= exp(-isec.dist*R.wrld.aodistfac);
else fac+= 1.0f;
}
else if(envcolor!=WO_AOPLAIN) {
@@ -1989,7 +2031,8 @@ static void ray_ao_spheresamp(ShadeInput *shi, float *ao, float *env)
RE_RC_INIT(isec, *shi);
isec.orig.ob = shi->obi;
isec.orig.face = shi->vlr;
- isec.skip = RE_SKIP_VLR_NEIGHBOUR | RE_SKIP_VLR_RENDER_CHECK;
+ isec.check = RE_CHECK_VLR_RENDER;
+ isec.skip = RE_SKIP_VLR_NEIGHBOUR;
isec.hint = 0;
isec.hit.ob = 0;
@@ -2050,15 +2093,15 @@ static void ray_ao_spheresamp(ShadeInput *shi, float *ao, float *env)
actual++;
- /* always set start/vec/labda */
- isec.vec[0] = -vec[0];
- isec.vec[1] = -vec[1];
- isec.vec[2] = -vec[2];
- isec.labda = maxdist;
+ /* always set start/vec/dist */
+ isec.dir[0] = -vec[0];
+ isec.dir[1] = -vec[1];
+ isec.dir[2] = -vec[2];
+ isec.dist = maxdist;
/* do the trace */
if(RE_rayobject_raycast(R.raytree, &isec)) {
- if (R.wrld.aomode & WO_AODIST) sh+= exp(-isec.labda*R.wrld.aodistfac);
+ if (R.wrld.aomode & WO_AODIST) sh+= exp(-isec.dist*R.wrld.aodistfac);
else sh+= 1.0f;
}
else if(envcolor!=WO_AOPLAIN) {
@@ -2209,7 +2252,8 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *
RE_rayobject_hint_bb( R.raytree, &bb_hint, min, max);
isec->hint = &bb_hint;
- isec->skip = RE_SKIP_VLR_NEIGHBOUR | RE_SKIP_VLR_RENDER_CHECK;
+ isec->check = RE_CHECK_VLR_RENDER;
+ isec->skip = RE_SKIP_VLR_NEIGHBOUR;
VECCOPY(vec, lampco);
while (samples < max_samples) {
@@ -2272,26 +2316,25 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *
}
VECCOPY(isec->start, co);
- isec->vec[0] = end[0]-isec->start[0];
- isec->vec[1] = end[1]-isec->start[1];
- isec->vec[2] = end[2]-isec->start[2];
- isec->labda = 1.0f; // * normalize_v3(isec->vec);
+ isec->dir[0] = end[0]-isec->start[0];
+ isec->dir[1] = end[1]-isec->start[1];
+ isec->dir[2] = end[2]-isec->start[2];
+ isec->dist = normalize_v3(isec->dir);
/* trace the ray */
if(isec->mode==RE_RAY_SHADOW_TRA) {
- isec->col[0]= isec->col[1]= isec->col[2]= 1.0f;
- isec->col[3]= 1.0f;
+ float col[4] = {1.0f, 1.0f, 1.0f, 1.0f};
- ray_trace_shadow_tra(isec, shi, DEPTH_SHADOW_TRA, 0);
- shadfac[0] += isec->col[0];
- shadfac[1] += isec->col[1];
- shadfac[2] += isec->col[2];
- shadfac[3] += isec->col[3];
+ ray_trace_shadow_tra(isec, shi, DEPTH_SHADOW_TRA, 0, col);
+ shadfac[0] += col[0];
+ shadfac[1] += col[1];
+ shadfac[2] += col[2];
+ shadfac[3] += col[3];
/* for variance calc */
- colsq[0] += isec->col[0]*isec->col[0];
- colsq[1] += isec->col[1]*isec->col[1];
- colsq[2] += isec->col[2]*isec->col[2];
+ colsq[0] += col[0]*col[0];
+ colsq[1] += col[1]*col[1];
+ colsq[2] += col[2]*col[2];
}
else {
if( RE_rayobject_raycast(R.raytree, isec) ) fac+= 1.0f;
@@ -2374,22 +2417,22 @@ static void ray_shadow_jitter(ShadeInput *shi, LampRen *lar, float *lampco, floa
mul_m3_v3(lar->mat, vec);
/* set start and vec */
- isec->vec[0] = vec[0]+lampco[0]-isec->start[0];
- isec->vec[1] = vec[1]+lampco[1]-isec->start[1];
- isec->vec[2] = vec[2]+lampco[2]-isec->start[2];
- isec->labda = 1.0f;
- isec->skip = RE_SKIP_VLR_NEIGHBOUR | RE_SKIP_VLR_RENDER_CHECK;
+ isec->dir[0] = vec[0]+lampco[0]-isec->start[0];
+ isec->dir[1] = vec[1]+lampco[1]-isec->start[1];
+ isec->dir[2] = vec[2]+lampco[2]-isec->start[2];
+ isec->dist = 1.0f;
+ isec->check = RE_CHECK_VLR_RENDER;
+ isec->skip = RE_SKIP_VLR_NEIGHBOUR;
if(isec->mode==RE_RAY_SHADOW_TRA) {
/* isec.col is like shadfac, so defines amount of light (0.0 is full shadow) */
- isec->col[0]= isec->col[1]= isec->col[2]= 1.0f;
- isec->col[3]= 1.0f;
+ float col[4] = {1.0f, 1.0f, 1.0f, 1.0f};
- ray_trace_shadow_tra(isec, shi, DEPTH_SHADOW_TRA, 0);
- shadfac[0] += isec->col[0];
- shadfac[1] += isec->col[1];
- shadfac[2] += isec->col[2];
- shadfac[3] += isec->col[3];
+ ray_trace_shadow_tra(isec, shi, DEPTH_SHADOW_TRA, 0, col);
+ shadfac[0] += col[0];
+ shadfac[1] += col[1];
+ shadfac[2] += col[2];
+ shadfac[3] += col[3];
}
else if( RE_rayobject_raycast(R.raytree, isec) ) fac+= 1.0f;
@@ -2470,18 +2513,17 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac)
shadfac[3]= 1.0f; // 1.0=full light
- /* set up isec vec */
+ /* set up isec.dir */
VECCOPY(isec.start, shi->co);
- VECSUB(isec.vec, lampco, isec.start);
- isec.labda = 1.0f;
+ VECSUB(isec.dir, lampco, isec.start);
+ isec.dist = normalize_v3(isec.dir);
if(isec.mode==RE_RAY_SHADOW_TRA) {
/* isec.col is like shadfac, so defines amount of light (0.0 is full shadow) */
- isec.col[0]= isec.col[1]= isec.col[2]= 1.0f;
- isec.col[3]= 1.0f;
+ float col[4] = {1.0f, 1.0f, 1.0f, 1.0f};
- ray_trace_shadow_tra(&isec, shi, DEPTH_SHADOW_TRA, 0);
- QUATCOPY(shadfac, isec.col);
+ ray_trace_shadow_tra(&isec, shi, DEPTH_SHADOW_TRA, 0, col);
+ QUATCOPY(shadfac, col);
}
else if(RE_rayobject_raycast(R.raytree, &isec))
shadfac[3]= 0.0f;
@@ -2526,7 +2568,7 @@ static void ray_translucent(ShadeInput *shi, LampRen *lar, float *distfac, float
isec.orig.ob = shi->obi;
isec.orig.face = shi->vlr;
- /* set up isec vec */
+ /* set up isec.dir */
VECCOPY(isec.start, shi->co);
VECCOPY(isec.end, lampco);
@@ -2534,11 +2576,11 @@ static void ray_translucent(ShadeInput *shi, LampRen *lar, float *distfac, float
/* we got a face */
/* render co */
- co[0]= isec.start[0]+isec.labda*(isec.vec[0]);
- co[1]= isec.start[1]+isec.labda*(isec.vec[1]);
- co[2]= isec.start[2]+isec.labda*(isec.vec[2]);
+ co[0]= isec.start[0]+isec.dist*(isec.dir[0]);
+ co[1]= isec.start[1]+isec.dist*(isec.dir[1]);
+ co[2]= isec.start[2]+isec.dist*(isec.dir[2]);
- *distfac= len_v3(isec.vec);
+ *distfac= len_v3(isec.dir);
}
else
*distfac= 0.0f;
diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/render_texture.c
index be2c83a7edf..f1652cfc88b 100644
--- a/source/blender/render/intern/source/texture.c
+++ b/source/blender/render/intern/source/render_texture.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: render_texture.c 34699 2011-02-07 21:55:54Z lmg $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -30,11 +30,10 @@
#include <string.h>
#include <math.h>
-
-
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "DNA_texture_types.h"
#include "DNA_object_types.h"
@@ -52,7 +51,7 @@
#include "BKE_image.h"
#include "BKE_node.h"
#include "BKE_plugin_types.h"
-#include "BKE_utildefines.h"
+
#include "BKE_global.h"
#include "BKE_main.h"
@@ -731,7 +730,7 @@ static int texnoise(Tex *tex, TexResult *texres)
div*= 3.0;
}
- texres->tin= ((float)val)/div;;
+ texres->tin= ((float)val)/div;
BRICONT;
return TEX_INT;
@@ -771,7 +770,7 @@ static int plugintex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex
if (pit->version < 6) {
texres->tin = pit->result[0];
} else {
- texres->tin = result[0];
+ texres->tin = result[0]; /* XXX, assigning garbage value, fixme! */
}
if(rgbnor & TEX_NOR) {
@@ -1353,6 +1352,19 @@ int multitex_ext(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, Te
return multitex_nodes(tex, texvec, dxt, dyt, osatex, texres, 0, 0, NULL, NULL);
}
+/* extern-tex doesn't support nodes (ntreeBeginExec() can't be called when rendering is going on) */
+int multitex_ext_safe(Tex *tex, float *texvec, TexResult *texres)
+{
+ int use_nodes= tex->use_nodes, retval;
+
+ tex->use_nodes= 0;
+ retval= multitex_nodes(tex, texvec, NULL, NULL, 0, texres, 0, 0, NULL, NULL);
+ tex->use_nodes= use_nodes;
+
+ return retval;
+}
+
+
/* ------------------------------------------------------------------------- */
/* in = destination, tex = texture, out = previous color */
@@ -1449,7 +1461,6 @@ void texture_rgb_blend(float *in, float *tex, float *out, float fact, float facg
case MTEX_LIGHT:
fact*= facg;
- facm= 1.0-fact;
col= fact*tex[0];
if(col > out[0]) in[0]= col; else in[0]= out[0];
@@ -1552,7 +1563,6 @@ float texture_value_blend(float tex, float out, float fact, float facg, int blen
break;
case MTEX_SOFT_LIGHT:
- col= fact*tex;
scf=1.0 - (1.0 - tex) * (1.0 - out);
in= facm*out + fact * ((1.0 - out) * tex * out) + (out * scf);
break;
@@ -1657,8 +1667,445 @@ static void texco_mapping(ShadeInput* shi, Tex* tex, MTex* mtex, float* co, floa
}
}
+/* Bump code from 2.5 development cycle, has a number of bugs, but here for compatibility */
+
+typedef struct CompatibleBump {
+ float nu[3], nv[3], nn[3];
+ float dudnu, dudnv, dvdnu, dvdnv;
+ int nunvdone;
+} CompatibleBump;
+
+static void compatible_bump_init(CompatibleBump *compat_bump)
+{
+ memset(compat_bump, 0, sizeof(*compat_bump));
+
+ compat_bump->dudnu = 1.0f;
+ compat_bump->dvdnv = 1.0f;
+}
+
+static void compatible_bump_uv_derivs(CompatibleBump *compat_bump, ShadeInput *shi, MTex *mtex, int i)
+{
+ // uvmapping only, calculation of normal tangent u/v partial derivatives
+ // (should not be here, dudnu, dudnv, dvdnu & dvdnv should probably be part of ShadeInputUV struct,
+ // nu/nv in ShadeInput and this calculation should then move to shadeinput.c, shade_input_set_shade_texco() func.)
+ // NOTE: test for shi->obr->ob here, since vlr/obr/obi can be 'fake' when called from fastshade(), another reason to move it..
+ // NOTE: shi->v1 is NULL when called from displace_render_vert, assigning verts in this case is not trivial because the shi quad face side is not know.
+ if ((mtex->texflag & MTEX_COMPAT_BUMP) && shi->obr && shi->obr->ob && shi->v1) {
+ if(mtex->mapto & (MAP_NORM|MAP_WARP) && !((mtex->tex->type==TEX_IMAGE) && (mtex->tex->imaflag & TEX_NORMALMAP))) {
+ MTFace* tf = RE_vlakren_get_tface(shi->obr, shi->vlr, i, NULL, 0);
+ int j1 = shi->i1, j2 = shi->i2, j3 = shi->i3;
+
+ vlr_set_uv_indices(shi->vlr, &j1, &j2, &j3);
+
+ // compute ortho basis around normal
+ if(!compat_bump->nunvdone) {
+ // render normal is negated
+ compat_bump->nn[0] = -shi->vn[0];
+ compat_bump->nn[1] = -shi->vn[1];
+ compat_bump->nn[2] = -shi->vn[2];
+ ortho_basis_v3v3_v3(compat_bump->nu, compat_bump->nv, compat_bump->nn);
+ compat_bump->nunvdone= 1;
+ }
+
+ if (tf) {
+ float *uv1 = tf->uv[j1], *uv2 = tf->uv[j2], *uv3 = tf->uv[j3];
+ const float an[3] = {fabsf(compat_bump->nn[0]), fabsf(compat_bump->nn[1]), fabsf(compat_bump->nn[2])};
+ const int a1 = (an[0] > an[1] && an[0] > an[2]) ? 1 : 0;
+ const int a2 = (an[2] > an[0] && an[2] > an[1]) ? 1 : 2;
+ const float dp1_a1 = shi->v1->co[a1] - shi->v3->co[a1];
+ const float dp1_a2 = shi->v1->co[a2] - shi->v3->co[a2];
+ const float dp2_a1 = shi->v2->co[a1] - shi->v3->co[a1];
+ const float dp2_a2 = shi->v2->co[a2] - shi->v3->co[a2];
+ const float du1 = uv1[0] - uv3[0], du2 = uv2[0] - uv3[0];
+ const float dv1 = uv1[1] - uv3[1], dv2 = uv2[1] - uv3[1];
+ const float dpdu_a1 = dv2*dp1_a1 - dv1*dp2_a1;
+ const float dpdu_a2 = dv2*dp1_a2 - dv1*dp2_a2;
+ const float dpdv_a1 = du1*dp2_a1 - du2*dp1_a1;
+ const float dpdv_a2 = du1*dp2_a2 - du2*dp1_a2;
+ float d = dpdu_a1*dpdv_a2 - dpdv_a1*dpdu_a2;
+ float uvd = du1*dv2 - dv1*du2;
+
+ if (uvd == 0.f) uvd = 1e-5f;
+ if (d == 0.f) d = 1e-5f;
+ d = uvd / d;
+
+ compat_bump->dudnu = (dpdv_a2*compat_bump->nu[a1] - dpdv_a1*compat_bump->nu[a2])*d;
+ compat_bump->dvdnu = (dpdu_a1*compat_bump->nu[a2] - dpdu_a2*compat_bump->nu[a1])*d;
+ compat_bump->dudnv = (dpdv_a2*compat_bump->nv[a1] - dpdv_a1*compat_bump->nv[a2])*d;
+ compat_bump->dvdnv = (dpdu_a1*compat_bump->nv[a2] - dpdu_a2*compat_bump->nv[a1])*d;
+ }
+ }
+ }
+}
+
+static int compatible_bump_compute(CompatibleBump *compat_bump, ShadeInput *shi, MTex *mtex, Tex *tex, TexResult *texres, float Tnor, float *co, float *dx, float *dy, float *texvec, float *dxt, float *dyt)
+{
+ TexResult ttexr = {0, 0, 0, 0, 0, texres->talpha, NULL}; // temp TexResult
+ float tco[3], texv[3], cd, ud, vd, du, dv, idu, idv;
+ const int fromrgb = ((tex->type == TEX_IMAGE) || ((tex->flag & TEX_COLORBAND)!=0));
+ const float bf = 0.04f*Tnor*mtex->norfac;
+ int rgbnor;
+ // disable internal bump eval
+ float* nvec = texres->nor;
+ texres->nor = NULL;
+ // du & dv estimates, constant value defaults
+ du = dv = 0.01f;
+
+ // compute ortho basis around normal
+ if(!compat_bump->nunvdone) {
+ // render normal is negated
+ negate_v3_v3(compat_bump->nn, shi->vn);
+ ortho_basis_v3v3_v3(compat_bump->nu, compat_bump->nv, compat_bump->nn);
+ compat_bump->nunvdone= 1;
+ }
+
+ // two methods, either constant based on main image resolution,
+ // (which also works without osa, though of course not always good (or even very bad) results),
+ // or based on tex derivative max values (osa only). Not sure which is best...
+
+ if (!shi->osatex && (tex->type == TEX_IMAGE) && tex->ima) {
+ // in case we have no proper derivatives, fall back to
+ // computing du/dv it based on image size
+ ImBuf* ibuf = BKE_image_get_ibuf(tex->ima, &tex->iuser);
+ if (ibuf) {
+ du = 1.f/(float)ibuf->x;
+ dv = 1.f/(float)ibuf->y;
+ }
+ }
+ else if (shi->osatex) {
+ // we have derivatives, can compute proper du/dv
+ if (tex->type == TEX_IMAGE) { // 2d image, use u & v max. of dx/dy 2d vecs
+ const float adx[2] = {fabsf(dx[0]), fabsf(dx[1])};
+ const float ady[2] = {fabsf(dy[0]), fabsf(dy[1])};
+ du = MAX2(adx[0], ady[0]);
+ dv = MAX2(adx[1], ady[1]);
+ }
+ else { // 3d procedural, estimate from all dx/dy elems
+ const float adx[3] = {fabsf(dx[0]), fabsf(dx[1]), fabsf(dx[2])};
+ const float ady[3] = {fabsf(dy[0]), fabsf(dy[1]), fabsf(dy[2])};
+ du = MAX3(adx[0], adx[1], adx[2]);
+ dv = MAX3(ady[1], ady[1], ady[2]);
+ }
+ }
+
+ // center, main return value
+ texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt);
+ rgbnor = multitex_mtex(shi, mtex, texvec, dxt, dyt, texres);
+ cd = fromrgb ? (texres->tr + texres->tg + texres->tb)*0.33333333f : texres->tin;
+
+ if (mtex->texco == TEXCO_UV) {
+ // for the uv case, use the same value for both du/dv,
+ // since individually scaling the normal derivatives makes them useless...
+ du = MIN2(du, dv);
+ idu = (du < 1e-5f) ? bf : (bf/du);
+
+ // +u val
+ tco[0] = co[0] + compat_bump->dudnu*du;
+ tco[1] = co[1] + compat_bump->dvdnu*du;
+ tco[2] = 0.f;
+ texco_mapping(shi, tex, mtex, tco, dx, dy, texv, dxt, dyt);
+ multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr);
+ ud = idu*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
+
+ // +v val
+ tco[0] = co[0] + compat_bump->dudnv*du;
+ tco[1] = co[1] + compat_bump->dvdnv*du;
+ tco[2] = 0.f;
+ texco_mapping(shi, tex, mtex, tco, dx, dy, texv, dxt, dyt);
+ multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr);
+ vd = idu*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
+ }
+ else {
+ float tu[3], tv[3];
+
+ copy_v3_v3(tu, compat_bump->nu);
+ copy_v3_v3(tv, compat_bump->nv);
+
+ idu = (du < 1e-5f) ? bf : (bf/du);
+ idv = (dv < 1e-5f) ? bf : (bf/dv);
+
+ if ((mtex->texco == TEXCO_ORCO) && shi->obr && shi->obr->ob) {
+ mul_mat3_m4_v3(shi->obr->ob->imat, tu);
+ mul_mat3_m4_v3(shi->obr->ob->imat, tv);
+ normalize_v3(tu);
+ normalize_v3(tv);
+ }
+ else if (mtex->texco == TEXCO_GLOB) {
+ mul_mat3_m4_v3(R.viewinv, tu);
+ mul_mat3_m4_v3(R.viewinv, tv);
+ }
+ else if (mtex->texco == TEXCO_OBJECT && mtex->object) {
+ mul_mat3_m4_v3(mtex->object->imat, tu);
+ mul_mat3_m4_v3(mtex->object->imat, tv);
+ normalize_v3(tu);
+ normalize_v3(tv);
+ }
+
+ // +u val
+ tco[0] = co[0] + tu[0]*du;
+ tco[1] = co[1] + tu[1]*du;
+ tco[2] = co[2] + tu[2]*du;
+ texco_mapping(shi, tex, mtex, tco, dx, dy, texv, dxt, dyt);
+ multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr);
+ ud = idu*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
+
+ // +v val
+ tco[0] = co[0] + tv[0]*dv;
+ tco[1] = co[1] + tv[1]*dv;
+ tco[2] = co[2] + tv[2]*dv;
+ texco_mapping(shi, tex, mtex, tco, dx, dy, texv, dxt, dyt);
+ multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr);
+ vd = idv*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
+ }
+
+ // bumped normal
+ compat_bump->nu[0] += ud*compat_bump->nn[0];
+ compat_bump->nu[1] += ud*compat_bump->nn[1];
+ compat_bump->nu[2] += ud*compat_bump->nn[2];
+ compat_bump->nv[0] += vd*compat_bump->nn[0];
+ compat_bump->nv[1] += vd*compat_bump->nn[1];
+ compat_bump->nv[2] += vd*compat_bump->nn[2];
+ cross_v3_v3v3(nvec, compat_bump->nu, compat_bump->nv);
+
+ nvec[0] = -nvec[0];
+ nvec[1] = -nvec[1];
+ nvec[2] = -nvec[2];
+ texres->nor = nvec;
+
+ rgbnor |= TEX_NOR;
+ return rgbnor;
+}
+
+/* Improved bump code from later in 2.5 development cycle */
+
+typedef struct NTapBump {
+ int init_done;
+ int iPrevBumpSpace; // 0: uninitialized, 1: objectspace, 2: texturespace, 4: viewspace
+ // bumpmapping
+ float vNorg[3]; // backup copy of shi->vn
+ float vNacc[3]; // original surface normal minus the surface gradient of every bump map which is encountered
+ float vR1[3], vR2[3]; // cross products (sigma_y, original_normal), (original_normal, sigma_x)
+ float sgn_det; // sign of the determinant of the matrix {sigma_x, sigma_y, original_normal}
+ float fPrevMagnitude; // copy of previous magnitude, used for multiple bumps in different spaces
+} NTapBump;
+
+static void ntap_bump_init(NTapBump *ntap_bump)
+{
+ memset(ntap_bump, 0, sizeof(*ntap_bump));
+}
+
+static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, Tex *tex, TexResult *texres, float Tnor, float *co, float *dx, float *dy, float *texvec, float *dxt, float *dyt)
+{
+ TexResult ttexr = {0, 0, 0, 0, 0, texres->talpha, NULL}; // temp TexResult
+
+ const int fromrgb = ((tex->type == TEX_IMAGE) || ((tex->flag & TEX_COLORBAND)!=0));
+ float Hscale = Tnor*mtex->norfac;
+
+ // 2 channels for 2D texture and 3 for 3D textures.
+ const int nr_channels = (mtex->texco == TEXCO_UV)? 2 : 3;
+ int c, rgbnor, iBumpSpace;
+ float dHdx, dHdy;
+
+ // disable internal bump eval in sampler, save pointer
+ float *nvec = texres->nor;
+ texres->nor = NULL;
+
+ if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) {
+ if(tex->ima)
+ Hscale *= 13.0f; // appears to be a sensible default value
+ } else
+ Hscale *= 0.1f; // factor 0.1 proved to look like the previous bump code
+
+ if( !ntap_bump->init_done ) {
+ VECCOPY(ntap_bump->vNacc, shi->vn);
+ VECCOPY(ntap_bump->vNorg, shi->vn);
+ ntap_bump->fPrevMagnitude = 1.0f;
+ ntap_bump->iPrevBumpSpace = 0;
+
+ ntap_bump->init_done = 1;
+ }
+
+ if(!(mtex->texflag & MTEX_5TAP_BUMP)) {
+ // compute height derivatives with respect to output image pixel coordinates x and y
+ float STll[3], STlr[3], STul[3];
+ float Hll, Hlr, Hul;
+
+ texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt);
+
+ for(c=0; c<nr_channels; c++) {
+ // dx contains the derivatives (du/dx, dv/dx)
+ // dy contains the derivatives (du/dy, dv/dy)
+ STll[c] = texvec[c];
+ STlr[c] = texvec[c]+dxt[c];
+ STul[c] = texvec[c]+dyt[c];
+ }
+
+ // clear unused derivatives
+ for(c=nr_channels; c<3; c++) {
+ STll[c] = 0.0f;
+ STlr[c] = 0.0f;
+ STul[c] = 0.0f;
+ }
+
+ // use texres for the center sample, set rgbnor
+ rgbnor = multitex_mtex(shi, mtex, STll, dxt, dyt, texres);
+ Hll = (fromrgb)? RGBTOBW(texres->tr, texres->tg, texres->tb) : texres->tin;
+
+ // use ttexr for the other 2 taps
+ multitex_mtex(shi, mtex, STlr, dxt, dyt, &ttexr);
+ Hlr = (fromrgb)? RGBTOBW(ttexr.tr, ttexr.tg, ttexr.tb) : ttexr.tin;
+
+ multitex_mtex(shi, mtex, STul, dxt, dyt, &ttexr);
+ Hul = (fromrgb)? RGBTOBW(ttexr.tr, ttexr.tg, ttexr.tb) : ttexr.tin;
+
+ dHdx = Hscale*(Hlr - Hll);
+ dHdy = Hscale*(Hul - Hll);
+ }
+ else {
+ /* same as above, but doing 5 taps, increasing quality at cost of speed */
+ float STc[3], STl[3], STr[3], STd[3], STu[3];
+ float Hc, Hl, Hr, Hd, Hu;
+
+ texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt);
+
+ for(c=0; c<nr_channels; c++) {
+ STc[c] = texvec[c];
+ STl[c] = texvec[c] - 0.5f*dxt[c];
+ STr[c] = texvec[c] + 0.5f*dxt[c];
+ STd[c] = texvec[c] - 0.5f*dyt[c];
+ STu[c] = texvec[c] + 0.5f*dyt[c];
+ }
+
+ // clear unused derivatives
+ for(c=nr_channels; c<3; c++) {
+ STc[c] = 0.0f;
+ STl[c] = 0.0f;
+ STr[c] = 0.0f;
+ STd[c] = 0.0f;
+ STu[c] = 0.0f;
+ }
+
+ // use texres for the center sample, set rgbnor
+ rgbnor = multitex_mtex(shi, mtex, STc, dxt, dyt, texres);
+ Hc = (fromrgb)? RGBTOBW(texres->tr, texres->tg, texres->tb) : texres->tin;
+
+ // use ttexr for the other taps
+ multitex_mtex(shi, mtex, STl, dxt, dyt, &ttexr);
+ Hl = (fromrgb)? RGBTOBW(ttexr.tr, ttexr.tg, ttexr.tb) : ttexr.tin;
+ multitex_mtex(shi, mtex, STr, dxt, dyt, &ttexr);
+ Hr = (fromrgb)? RGBTOBW(ttexr.tr, ttexr.tg, ttexr.tb) : ttexr.tin;
+ multitex_mtex(shi, mtex, STd, dxt, dyt, &ttexr);
+ Hd = (fromrgb)? RGBTOBW(ttexr.tr, ttexr.tg, ttexr.tb) : ttexr.tin;
+ multitex_mtex(shi, mtex, STu, dxt, dyt, &ttexr);
+ Hu = (fromrgb)? RGBTOBW(ttexr.tr, ttexr.tg, ttexr.tb) : ttexr.tin;
+
+ dHdx = Hscale*(Hr - Hl);
+ dHdy = Hscale*(Hu - Hd);
+ }
+
+ // restore pointer
+ texres->nor = nvec;
+
+ /* replaced newbump with code based on listing 1 and 2 of
+ [Mik10] Mikkelsen M. S.: Bump Mapping Unparametrized Surfaces on the GPU.
+ -> http://jbit.net/~sparky/sfgrad_bump/mm_sfgrad_bump.pdf */
+
+ if( mtex->texflag & MTEX_BUMP_OBJECTSPACE )
+ iBumpSpace = 1;
+ else if( mtex->texflag & MTEX_BUMP_TEXTURESPACE )
+ iBumpSpace = 2;
+ else
+ iBumpSpace = 4; // ViewSpace
+
+ if( ntap_bump->iPrevBumpSpace != iBumpSpace ) {
+
+ // initialize normal perturbation vectors
+ int xyz;
+ float fDet, abs_fDet, fMagnitude;
+ // object2view and inverted matrix
+ float obj2view[3][3], view2obj[3][3], tmp[4][4];
+ // local copies of derivatives and normal
+ float dPdx[3], dPdy[3], vN[3];
+ VECCOPY(dPdx, shi->dxco);
+ VECCOPY(dPdy, shi->dyco);
+ VECCOPY(vN, ntap_bump->vNorg);
+
+ if( mtex->texflag & MTEX_BUMP_OBJECTSPACE ) {
+ // TODO: these calculations happen for every pixel!
+ // -> move to shi->obi
+ mul_m4_m4m4(tmp, shi->obr->ob->obmat, R.viewmat);
+ copy_m3_m4(obj2view, tmp); // use only upper left 3x3 matrix
+ invert_m3_m3(view2obj, obj2view);
+
+ // generate the surface derivatives in object space
+ mul_m3_v3(view2obj, dPdx);
+ mul_m3_v3( view2obj, dPdy );
+ // generate the unit normal in object space
+ mul_transposed_m3_v3( obj2view, vN );
+ normalize_v3(vN);
+ }
+
+ cross_v3_v3v3(ntap_bump->vR1, dPdy, vN);
+ cross_v3_v3v3(ntap_bump->vR2, vN, dPdx);
+ fDet = dot_v3v3(dPdx, ntap_bump->vR1);
+ ntap_bump->sgn_det = (fDet < 0)? -1.0f: 1.0f;
+ abs_fDet = ntap_bump->sgn_det * fDet;
+
+ if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) {
+ if(tex->ima) {
+ // crazy hack solution that gives results similar to normal mapping - part 1
+ normalize_v3(ntap_bump->vR1);
+ normalize_v3(ntap_bump->vR2);
+ abs_fDet = 1.0f;
+ }
+ }
+
+ fMagnitude = abs_fDet;
+ if( mtex->texflag & MTEX_BUMP_OBJECTSPACE ) {
+ // pre do transform of texres->nor by the inverse transposed of obj2view
+ mul_transposed_m3_v3( view2obj, vN );
+ mul_transposed_m3_v3( view2obj, ntap_bump->vR1 );
+ mul_transposed_m3_v3( view2obj, ntap_bump->vR2 );
+
+ fMagnitude *= len_v3(vN);
+ }
+
+ for(xyz=0; xyz<3; xyz++)
+ ntap_bump->vNacc[xyz] *= fMagnitude / ntap_bump->fPrevMagnitude;
+
+ ntap_bump->fPrevMagnitude = fMagnitude;
+ ntap_bump->iPrevBumpSpace = iBumpSpace;
+ }
+
+ if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) {
+ if(tex->ima) {
+ // crazy hack solution that gives results similar to normal mapping - part 2
+ float vec[2];
+
+ vec[0] = tex->ima->gen_x*dxt[0];
+ vec[1] = tex->ima->gen_y*dxt[1];
+ dHdx *= 1.0f/len_v2(vec);
+ vec[0] = tex->ima->gen_x*dyt[0];
+ vec[1] = tex->ima->gen_y*dyt[1];
+ dHdy *= 1.0f/len_v2(vec);
+ }
+ }
+
+ // subtract the surface gradient from vNacc
+ for(c=0; c<3; c++) {
+ float vSurfGrad_compi = ntap_bump->sgn_det * (dHdx * ntap_bump->vR1[c] + dHdy * ntap_bump->vR2[c]);
+ ntap_bump->vNacc[c] -= vSurfGrad_compi;
+ texres->nor[c] = ntap_bump->vNacc[c]; // copy
+ }
+
+ rgbnor |= TEX_NOR;
+ return rgbnor;
+}
+
void do_material_tex(ShadeInput *shi)
{
+ CompatibleBump compat_bump;
+ NTapBump ntap_bump;
MTex *mtex;
Tex *tex;
TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL};
@@ -1666,8 +2113,10 @@ void do_material_tex(ShadeInput *shi)
float fact, facm, factt, facmm, stencilTin=1.0;
float texvec[3], dxt[3], dyt[3], tempvec[3], norvec[3], warpvec[3]={0.0f, 0.0f, 0.0f}, Tnor=1.0;
int tex_nr, rgbnor= 0, warpdone=0;
- float nu[3] = {0,0,0}, nv[3] = {0,0,0}, nn[3] = {0,0,0}, dudnu = 1.f, dudnv = 0.f, dvdnu = 0.f, dvdnv = 1.f; // bump mapping
- int nunvdone= 0;
+ int use_compat_bump, use_ntap_bump;
+
+ compatible_bump_init(&compat_bump);
+ ntap_bump_init(&ntap_bump);
if (R.r.scemode & R_NO_TEX) return;
/* here: test flag if there's a tex (todo) */
@@ -1683,6 +2132,21 @@ void do_material_tex(ShadeInput *shi)
tex= mtex->tex;
if(tex==0) continue;
+ use_compat_bump= (mtex->texflag & MTEX_COMPAT_BUMP);
+ use_ntap_bump= (mtex->texflag & (MTEX_3TAP_BUMP|MTEX_5TAP_BUMP));
+
+ /* XXX texture node trees don't work for this yet */
+ if(tex->nodetree && tex->use_nodes) {
+ use_compat_bump = 0;
+ use_ntap_bump = 0;
+ }
+
+ /* case displacement mapping */
+ if(shi->osatex==0 && use_ntap_bump) {
+ use_ntap_bump = 0;
+ use_compat_bump = 1;
+ }
+
/* which coords */
if(mtex->texco==TEXCO_ORCO) {
if(mtex->texflag & MTEX_DUPLI_MAPTO) {
@@ -1756,57 +2220,7 @@ void do_material_tex(ShadeInput *shi)
dx= suv->dxuv;
dy= suv->dyuv;
- // uvmapping only, calculation of normal tangent u/v partial derivatives
- // (should not be here, dudnu, dudnv, dvdnu & dvdnv should probably be part of ShadeInputUV struct,
- // nu/nv in ShadeInput and this calculation should then move to shadeinput.c, shade_input_set_shade_texco() func.)
- // NOTE: test for shi->obr->ob here, since vlr/obr/obi can be 'fake' when called from fastshade(), another reason to move it..
- // NOTE: shi->v1 is NULL when called from displace_render_vert, assigning verts in this case is not trivial because the shi quad face side is not know.
- if ((mtex->texflag & MTEX_NEW_BUMP) && shi->obr && shi->obr->ob && shi->v1) {
- if(mtex->mapto & (MAP_NORM|MAP_WARP) && !((tex->type==TEX_IMAGE) && (tex->imaflag & TEX_NORMALMAP))) {
- MTFace* tf = RE_vlakren_get_tface(shi->obr, shi->vlr, i, NULL, 0);
- int j1 = shi->i1, j2 = shi->i2, j3 = shi->i3;
-
- vlr_set_uv_indices(shi->vlr, &j1, &j2, &j3);
-
- // compute ortho basis around normal
- if(!nunvdone) {
- // render normal is negated
- nn[0] = -shi->vn[0];
- nn[1] = -shi->vn[1];
- nn[2] = -shi->vn[2];
- ortho_basis_v3v3_v3( nu, nv,nn);
- nunvdone= 1;
- }
-
- if (tf) {
- float *uv1 = tf->uv[j1], *uv2 = tf->uv[j2], *uv3 = tf->uv[j3];
- const float an[3] = {fabsf(nn[0]), fabsf(nn[1]), fabsf(nn[2])};
- const int a1 = (an[0] > an[1] && an[0] > an[2]) ? 1 : 0;
- const int a2 = (an[2] > an[0] && an[2] > an[1]) ? 1 : 2;
- const float dp1_a1 = shi->v1->co[a1] - shi->v3->co[a1];
- const float dp1_a2 = shi->v1->co[a2] - shi->v3->co[a2];
- const float dp2_a1 = shi->v2->co[a1] - shi->v3->co[a1];
- const float dp2_a2 = shi->v2->co[a2] - shi->v3->co[a2];
- const float du1 = uv1[0] - uv3[0], du2 = uv2[0] - uv3[0];
- const float dv1 = uv1[1] - uv3[1], dv2 = uv2[1] - uv3[1];
- const float dpdu_a1 = dv2*dp1_a1 - dv1*dp2_a1;
- const float dpdu_a2 = dv2*dp1_a2 - dv1*dp2_a2;
- const float dpdv_a1 = du1*dp2_a1 - du2*dp1_a1;
- const float dpdv_a2 = du1*dp2_a2 - du2*dp1_a2;
- float d = dpdu_a1*dpdv_a2 - dpdv_a1*dpdu_a2;
- float uvd = du1*dv2 - dv1*du2;
-
- if (uvd == 0.f) uvd = 1e-5f;
- if (d == 0.f) d = 1e-5f;
- d = uvd / d;
-
- dudnu = (dpdv_a2*nu[a1] - dpdv_a1*nu[a2])*d;
- dvdnu = (dpdu_a1*nu[a2] - dpdu_a2*nu[a1])*d;
- dudnv = (dpdv_a2*nv[a1] - dpdv_a1*nv[a2])*d;
- dvdnv = (dpdu_a1*nv[a2] - dpdu_a2*nv[a1])*d;
- }
- }
- }
+ compatible_bump_uv_derivs(&compat_bump, shi, mtex, i);
}
}
else if(mtex->texco==TEXCO_WINDOW) {
@@ -1844,138 +2258,15 @@ void do_material_tex(ShadeInput *shi)
co= tempvec;
}
- if(mtex->texflag & MTEX_NEW_BUMP) {
- // compute ortho basis around normal
- if(!nunvdone) {
- // render normal is negated
- nn[0] = -shi->vn[0];
- nn[1] = -shi->vn[1];
- nn[2] = -shi->vn[2];
- ortho_basis_v3v3_v3( nu, nv,nn);
- nunvdone= 1;
- }
-
- if(texres.nor && !((tex->type==TEX_IMAGE) && (tex->imaflag & TEX_NORMALMAP))) {
- TexResult ttexr = {0, 0, 0, 0, 0, texres.talpha, NULL}; // temp TexResult
- float tco[3], texv[3], cd, ud, vd, du, dv, idu, idv;
- const int fromrgb = ((tex->type == TEX_IMAGE) || ((tex->flag & TEX_COLORBAND)!=0));
- const float bf = 0.04f*Tnor*stencilTin*mtex->norfac;
- // disable internal bump eval
- float* nvec = texres.nor;
- texres.nor = NULL;
- // du & dv estimates, constant value defaults
- du = dv = 0.01f;
-
- // two methods, either constant based on main image resolution,
- // (which also works without osa, though of course not always good (or even very bad) results),
- // or based on tex derivative max values (osa only). Not sure which is best...
-
- if (!shi->osatex && (tex->type == TEX_IMAGE) && tex->ima) {
- // in case we have no proper derivatives, fall back to
- // computing du/dv it based on image size
- ImBuf* ibuf = BKE_image_get_ibuf(tex->ima, &tex->iuser);
- if (ibuf) {
- du = 1.f/(float)ibuf->x;
- dv = 1.f/(float)ibuf->y;
- }
- }
- else if (shi->osatex) {
- // we have derivatives, can compute proper du/dv
- if (tex->type == TEX_IMAGE) { // 2d image, use u & v max. of dx/dy 2d vecs
- const float adx[2] = {fabsf(dx[0]), fabsf(dx[1])};
- const float ady[2] = {fabsf(dy[0]), fabsf(dy[1])};
- du = MAX2(adx[0], ady[0]);
- dv = MAX2(adx[1], ady[1]);
- }
- else { // 3d procedural, estimate from all dx/dy elems
- const float adx[3] = {fabsf(dx[0]), fabsf(dx[1]), fabsf(dx[2])};
- const float ady[3] = {fabsf(dy[0]), fabsf(dy[1]), fabsf(dy[2])};
- du = MAX3(adx[0], adx[1], adx[2]);
- dv = MAX3(ady[1], ady[1], ady[2]);
- }
- }
-
- // center, main return value
- texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt);
- rgbnor = multitex_mtex(shi, mtex, texvec, dxt, dyt, &texres);
- cd = fromrgb ? (texres.tr + texres.tg + texres.tb)*0.33333333f : texres.tin;
-
- if (mtex->texco == TEXCO_UV) {
- // for the uv case, use the same value for both du/dv,
- // since individually scaling the normal derivatives makes them useless...
- du = MIN2(du, dv);
- idu = (du < 1e-5f) ? bf : (bf/du);
-
- // +u val
- tco[0] = co[0] + dudnu*du;
- tco[1] = co[1] + dvdnu*du;
- tco[2] = 0.f;
- texco_mapping(shi, tex, mtex, tco, dx, dy, texv, dxt, dyt);
- multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr);
- ud = idu*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
-
- // +v val
- tco[0] = co[0] + dudnv*du;
- tco[1] = co[1] + dvdnv*du;
- tco[2] = 0.f;
- texco_mapping(shi, tex, mtex, tco, dx, dy, texv, dxt, dyt);
- multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr);
- vd = idu*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
- }
- else {
- float tu[3] = {nu[0], nu[1], nu[2]}, tv[3] = {nv[0], nv[1], nv[2]};
-
- idu = (du < 1e-5f) ? bf : (bf/du);
- idv = (dv < 1e-5f) ? bf : (bf/dv);
-
- if ((mtex->texco == TEXCO_ORCO) && shi->obr && shi->obr->ob) {
- mul_mat3_m4_v3(shi->obr->ob->imat, tu);
- mul_mat3_m4_v3(shi->obr->ob->imat, tv);
- normalize_v3(tu);
- normalize_v3(tv);
- }
- else if (mtex->texco == TEXCO_GLOB) {
- mul_mat3_m4_v3(R.viewinv, tu);
- mul_mat3_m4_v3(R.viewinv, tv);
- }
- else if (mtex->texco == TEXCO_OBJECT && mtex->object) {
- mul_mat3_m4_v3(mtex->object->imat, tu);
- mul_mat3_m4_v3(mtex->object->imat, tv);
- normalize_v3(tu);
- normalize_v3(tv);
- }
-
- // +u val
- tco[0] = co[0] + tu[0]*du;
- tco[1] = co[1] + tu[1]*du;
- tco[2] = co[2] + tu[2]*du;
- texco_mapping(shi, tex, mtex, tco, dx, dy, texv, dxt, dyt);
- multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr);
- ud = idu*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
-
- // +v val
- tco[0] = co[0] + tv[0]*dv;
- tco[1] = co[1] + tv[1]*dv;
- tco[2] = co[2] + tv[2]*dv;
- texco_mapping(shi, tex, mtex, tco, dx, dy, texv, dxt, dyt);
- multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr);
- vd = idv*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
- }
-
- // bumped normal
- nu[0] += ud*nn[0];
- nu[1] += ud*nn[1];
- nu[2] += ud*nn[2];
- nv[0] += vd*nn[0];
- nv[1] += vd*nn[1];
- nv[2] += vd*nn[2];
- cross_v3_v3v3(nvec, nu, nv);
-
- nvec[0] = -nvec[0];
- nvec[1] = -nvec[1];
- nvec[2] = -nvec[2];
- texres.nor = nvec;
- rgbnor |= TEX_NOR;
+ /* XXX texture node trees don't work for this yet */
+ if(texres.nor && !((tex->type==TEX_IMAGE) && (tex->imaflag & TEX_NORMALMAP))) {
+ if(use_compat_bump) {
+ rgbnor = compatible_bump_compute(&compat_bump, shi, mtex, tex,
+ &texres, Tnor*stencilTin, co, dx, dy, texvec, dxt, dyt);
+ }
+ else if(use_ntap_bump) {
+ rgbnor = ntap_bump_compute(&ntap_bump, shi, mtex, tex,
+ &texres, Tnor*stencilTin, co, dx, dy, texvec, dxt, dyt);
}
else {
texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt);
@@ -2169,7 +2460,8 @@ void do_material_tex(ShadeInput *shi)
}
}
else {
- if (mtex->texflag & MTEX_NEW_BUMP) {
+ /* XXX texture node trees don't work for this yet */
+ if (use_compat_bump || use_ntap_bump) {
shi->vn[0] = texres.nor[0];
shi->vn[1] = texres.nor[1];
shi->vn[2] = texres.nor[2];
@@ -2346,7 +2638,6 @@ void do_volume_tex(ShadeInput *shi, float *xyz, int mapto_flag, float *col, floa
/* which coords */
if(mtex->texco==TEXCO_OBJECT) {
Object *ob= mtex->object;
- ob= mtex->object;
if(ob) {
VECCOPY(co, xyz);
if(mtex->texflag & MTEX_OB_DUPLI_ORIG) {
@@ -2676,11 +2967,20 @@ void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, f
switch(mtex->texco) {
case TEXCO_ANGMAP:
/* only works with texture being "real" */
- /* use saacos(), fixes bug [#22398], float precission caused lo[2] to be slightly less then -1.0 */
- fact= (1.0/M_PI)*saacos(lo[2])/(sqrt(lo[0]*lo[0] + lo[1]*lo[1]));
- tempvec[0]= lo[0]*fact;
- tempvec[1]= lo[1]*fact;
- tempvec[2]= 0.0;
+ /* use saacos(), fixes bug [#22398], float precision caused lo[2] to be slightly less then -1.0 */
+ if(lo[0] || lo[1]) { /* check for zero case [#24807] */
+ fact= (1.0/M_PI)*saacos(lo[2])/(sqrt(lo[0]*lo[0] + lo[1]*lo[1]));
+ tempvec[0]= lo[0]*fact;
+ tempvec[1]= lo[1]*fact;
+ tempvec[2]= 0.0;
+ }
+ else {
+ /* this value has no angle, the vector is directly along the view.
+ * avoide divide by zero and use a dummy value. */
+ tempvec[0]= 1.0f;
+ tempvec[1]= 0.0;
+ tempvec[2]= 0.0;
+ }
co= tempvec;
break;
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index bd4af52cd91..fac2e39c89a 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -41,8 +41,9 @@
#include "BLI_jitter.h"
#include "BLI_rand.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
+
-#include "BKE_utildefines.h"
#include "DNA_image_types.h"
#include "DNA_lamp_types.h"
@@ -60,6 +61,8 @@
#include "IMB_imbuf.h"
/* local include */
+#include "rayintersection.h"
+#include "rayobject.h"
#include "renderpipeline.h"
#include "render_types.h"
#include "renderdatabase.h"
@@ -70,7 +73,6 @@
#include "shading.h"
#include "sss.h"
#include "zbuf.h"
-#include "RE_raytrace.h"
#include "PIL_time.h"
@@ -96,8 +98,9 @@ void calc_view_vector(float *view, float x, float y)
}
else {
- if(R.r.mode & R_PANORAMA)
+ if(R.r.mode & R_PANORAMA) {
x-= R.panodxp;
+ }
/* move x and y to real viewplane coords */
x= (x/(float)R.winx);
@@ -2079,24 +2082,10 @@ static void bake_mask_clear( ImBuf *ibuf, char *mask, char val )
static void bake_set_shade_input(ObjectInstanceRen *obi, VlakRen *vlr, ShadeInput *shi, int quad, int isect, int x, int y, float u, float v)
{
- if(isect) {
- /* raytrace intersection with different u,v than scanconvert */
- if(vlr->v4) {
- if(quad)
- shade_input_set_triangle_i(shi, obi, vlr, 2, 1, 3);
- else
- shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 3);
- }
- else
- shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
- }
- else {
- /* regular scanconvert */
- if(quad)
- shade_input_set_triangle_i(shi, obi, vlr, 0, 2, 3);
- else
- shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
- }
+ if(quad)
+ shade_input_set_triangle_i(shi, obi, vlr, 0, 2, 3);
+ else
+ shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
/* cache for shadow */
shi->samplenr= R.shadowsamplenr[shi->thread]++;
@@ -2285,19 +2274,19 @@ static int bake_intersect_tree(RayObject* raytree, Isect* isect, float *start, f
/* 'dir' is always normalized */
VECADDFAC(isect->start, start, dir, -R.r.bake_biasdist);
- isect->vec[0] = dir[0]*maxdist*sign;
- isect->vec[1] = dir[1]*maxdist*sign;
- isect->vec[2] = dir[2]*maxdist*sign;
+ isect->dir[0] = dir[0]*sign;
+ isect->dir[1] = dir[1]*sign;
+ isect->dir[2] = dir[2]*sign;
- isect->labda = maxdist;
+ isect->dist = maxdist;
hit = RE_rayobject_raycast(raytree, isect);
if(hit) {
- hitco[0] = isect->start[0] + isect->labda*isect->vec[0];
- hitco[1] = isect->start[1] + isect->labda*isect->vec[1];
- hitco[2] = isect->start[2] + isect->labda*isect->vec[2];
+ hitco[0] = isect->start[0] + isect->dist*isect->dir[0];
+ hitco[1] = isect->start[1] + isect->dist*isect->dir[1];
+ hitco[2] = isect->start[2] + isect->dist*isect->dir[2];
- *dist= len_v3v3(start, hitco);
+ *dist= isect->dist;
}
return hit;
@@ -2421,7 +2410,8 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v)
isec.orig.ob = obi;
isec.orig.face = vlr;
isec.userdata= bs->actob;
- isec.skip = RE_SKIP_VLR_NEIGHBOUR|RE_SKIP_VLR_BAKE_CHECK;
+ isec.check = RE_CHECK_VLR_BAKE;
+ isec.skip = RE_SKIP_VLR_NEIGHBOUR;
if(bake_intersect_tree(R.raytree, &isec, shi->co, shi->vn, sign, co, &dist)) {
if(!hit || len_v3v3(shi->co, co) < len_v3v3(shi->co, minco)) {
@@ -2574,7 +2564,7 @@ static void shade_tface(BakeShade *bs)
/* get pixel level vertex coordinates */
for(a=0; a<4; a++) {
/* Note, workaround for pixel aligned UVs which are common and can screw up our intersection tests
- * where a pixel gets inbetween 2 faces or the middle of a quad,
+ * where a pixel gets in between 2 faces or the middle of a quad,
* camera aligned quads also have this problem but they are less common.
* Add a small offset to the UVs, fixes bug #18685 - Campbell */
vec[a][0]= tface->uv[a][0]*(float)bs->rectx - (0.5f + 0.001);
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
index 91d58b7943e..c1a3b989c1f 100644
--- a/source/blender/render/intern/source/renderdatabase.c
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -58,10 +58,11 @@
#include <string.h>
#include "MEM_guardedalloc.h"
-#include "BKE_utildefines.h"
+
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_memarena.h"
@@ -75,8 +76,8 @@
#include "BKE_DerivedMesh.h"
#include "RE_render_ext.h" /* externtex */
-#include "RE_raytrace.h"
+#include "rayobject.h"
#include "renderpipeline.h"
#include "render_types.h"
#include "renderdatabase.h"
@@ -294,7 +295,7 @@ MTFace *RE_vlakren_get_tface(ObjectRen *obr, VlakRen *vlr, int n, char **name, i
if(verify) {
if(n>=node->totmtface) {
MTFace *mtface= node->mtface;
- int size= size= (n+1)*256;
+ int size= (n+1)*256;
node->mtface= MEM_callocN(size*sizeof(MTFace), "Vlak mtface");
@@ -1042,13 +1043,13 @@ HaloRen *RE_inithalo(Render *re, ObjectRen *obr, Material *ma, float *vec, f
}
HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Material *ma, float *vec, float *vec1,
- float *orco, float *uvco, float hasize, float vectsize, int seed)
+ float *orco, float *uvco, float hasize, float vectsize, int seed, float *pa_co)
{
HaloRen *har;
MTex *mtex;
float tin, tr, tg, tb, ta;
float xn, yn, zn, texvec[3], hoco[4], hoco1[4], in[3],tex[3],out[3];
- int i;
+ int i, hasrgb;
if(hasize==0.0) return NULL;
@@ -1147,11 +1148,17 @@ HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Mater
texvec[1]=2.0f*uvco[2*uv_index+1]-1.0f;
texvec[2]=0.0f;
}
+ else if(mtex->texco & TEXCO_PARTICLE) {
+ /* particle coordinates in range [0,1] */
+ texvec[0] = 2.f * pa_co[0] - 1.f;
+ texvec[1] = 2.f * pa_co[1] - 1.f;
+ texvec[2] = pa_co[2];
+ }
else if(orco) {
VECCOPY(texvec, orco);
}
- externtex(mtex, texvec, &tin, &tr, &tg, &tb, &ta, 0);
+ hasrgb = externtex(mtex, texvec, &tin, &tr, &tg, &tb, &ta, 0);
//yn= tin*mtex->colfac;
//zn= tin*mtex->alphafac;
@@ -1172,12 +1179,22 @@ HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Mater
har->g= in[1];
har->b= in[2];
}
+
+ /* alpha returned, so let's use it instead of intensity */
+ if(hasrgb)
+ tin = ta;
+
if(mtex->mapto & MAP_ALPHA)
har->alfa = texture_value_blend(mtex->def_var,har->alfa,tin,mtex->alphafac,mtex->blendtype);
if(mtex->mapto & MAP_HAR)
har->hard = 1.0+126.0*texture_value_blend(mtex->def_var,((float)har->hard)/127.0,tin,mtex->hardfac,mtex->blendtype);
if(mtex->mapto & MAP_RAYMIRR)
har->hasize = 100.0*texture_value_blend(mtex->def_var,har->hasize/100.0,tin,mtex->raymirrfac,mtex->blendtype);
+ if(mtex->mapto & MAP_TRANSLU) {
+ float add = texture_value_blend(mtex->def_var,(float)har->add/255.0,tin,mtex->translfac,mtex->blendtype);
+ CLAMP(add, 0.f, 1.f);
+ har->add = 255.0*add;
+ }
/* now what on earth is this good for?? */
//if(mtex->texco & 16) {
// har->alfa= tin;
@@ -1382,19 +1399,21 @@ int clip_render_object(float boundbox[][3], float *bounds, float winmat[][4])
fl= 0;
if(bounds) {
- if(vec[0] > bounds[1]*vec[3]) fl |= 1;
- if(vec[0]< bounds[0]*vec[3]) fl |= 2;
+ if(vec[0] < bounds[0]*vec[3]) fl |= 1;
+ else if(vec[0] > bounds[1]*vec[3]) fl |= 2;
+
if(vec[1] > bounds[3]*vec[3]) fl |= 4;
- if(vec[1]< bounds[2]*vec[3]) fl |= 8;
+ else if(vec[1]< bounds[2]*vec[3]) fl |= 8;
}
else {
if(vec[0] < -vec[3]) fl |= 1;
- if(vec[0] > vec[3]) fl |= 2;
- if(vec[1] < -vec[3]) fl |= 4;
- if(vec[1] > vec[3]) fl |= 8;
+ else if(vec[0] > vec[3]) fl |= 2;
+
+ if(vec[1] > vec[3]) fl |= 4;
+ else if(vec[1] < -vec[3]) fl |= 8;
}
if(vec[2] < -vec[3]) fl |= 16;
- if(vec[2] > vec[3]) fl |= 32;
+ else if(vec[2] > vec[3]) fl |= 32;
flag &= fl;
if(flag==0) return 0;
diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c
index 7101ce5daaf..8dd07fad022 100644
--- a/source/blender/render/intern/source/shadbuf.c
+++ b/source/blender/render/intern/source/shadbuf.c
@@ -35,13 +35,14 @@
#include "BKE_global.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
+
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_jitter.h"
#include "BLI_memarena.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "PIL_time.h"
@@ -300,8 +301,14 @@ static void compress_deepshadowbuf(Render *re, ShadBuf *shb, APixstr *apixbuf, A
DeepSample *ds[RE_MAX_OSA], *sampleds[RE_MAX_OSA], *dsb, *newbuf;
APixstr *ap, *apn;
APixstrand *aps, *apns;
- float visibility, totbuf= shb->totbuf;
- int a, b, c, tot, minz, found, size= shb->size, prevtot, newtot;
+ float visibility;
+
+ const int totbuf= shb->totbuf;
+ const float totbuf_f= (float)shb->totbuf;
+ const float totbuf_f_inv= 1.0f/totbuf_f;
+ const int size= shb->size;
+
+ int a, b, c, tot, minz, found, prevtot, newtot;
int sampletot[RE_MAX_OSA], totsample = 0, totsamplec = 0;
shsample= MEM_callocN( sizeof(ShadSampleBuf), "shad sample buf");
@@ -456,9 +463,9 @@ static void compress_deepshadowbuf(Render *re, ShadBuf *shb, APixstr *apixbuf, A
}
if(sampleds[c] == ds[c])
- visibility += 1.0f/totbuf;
+ visibility += totbuf_f_inv;
else
- visibility += (ds[c]-1)->v/totbuf;
+ visibility += (ds[c]-1)->v / totbuf_f;
}
dsb->v= visibility;
@@ -820,7 +827,7 @@ static void *do_shadow_thread(void *re_v)
}
static volatile int g_break= 0;
-static int thread_break(void *unused)
+static int thread_break(void *UNUSED(arg))
{
return g_break;
}
diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c
index 4754e0d15f1..88dc13d38d1 100644
--- a/source/blender/render/intern/source/shadeinput.c
+++ b/source/blender/render/intern/source/shadeinput.c
@@ -32,6 +32,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_curve_types.h"
#include "DNA_group_types.h"
@@ -40,7 +41,7 @@
#include "DNA_material_types.h"
#include "BKE_colortools.h"
-#include "BKE_utildefines.h"
+
#include "BKE_node.h"
/* local include */
@@ -141,7 +142,12 @@ void shade_material_loop(ShadeInput *shi, ShadeResult *shr)
if((shi->mat->mode & MA_TRANSP) && (shi->mat->mode & MA_RAYTRANSP))
if((shi->layflag & SCE_LAY_SKY) && (R.r.alphamode==R_ADDSKY))
shr->alpha= 1.0f;
- }
+ }
+
+ if(R.r.mode & R_RAYTRACE) {
+ if (R.render_volumes_inside.first)
+ shade_volume_inside(shi, shr);
+ }
}
@@ -163,11 +169,8 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr)
shade_input_init_material(shi);
if (shi->mat->material_type == MA_TYPE_VOLUME) {
- if(R.r.mode & R_RAYTRACE) {
- if (R.render_volumes_inside.first)
- shade_volume_inside(shi, shr);
- else
- shade_volume_outside(shi, shr);
+ if(R.r.mode & R_RAYTRACE) {
+ shade_volume_outside(shi, shr);
}
} else { /* MA_TYPE_SURFACE, MA_TYPE_WIRE */
shade_material_loop(shi, shr);
@@ -427,10 +430,10 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
mul_m4_v3(R.viewinv, shi->gl);
if(shi->osatex) {
- VECCOPY(shi->dxgl, shi->dxco);
- mul_m3_v3(R.imat, shi->dxco);
- VECCOPY(shi->dygl, shi->dyco);
- mul_m3_v3(R.imat, shi->dyco);
+ VECCOPY(shi->dxgl, shi->dxco);
+ mul_mat3_m4_v3(R.viewinv, shi->dxgl);
+ VECCOPY(shi->dygl, shi->dyco);
+ mul_mat3_m4_v3(R.viewinv, shi->dygl);
}
}
@@ -1009,13 +1012,10 @@ void shade_input_set_shade_texco(ShadeInput *shi)
VECCOPY(shi->gl, shi->co);
mul_m4_v3(R.viewinv, shi->gl);
if(shi->osatex) {
- VECCOPY(shi->dxgl, shi->dxco);
- // TXF: bug was here, but probably should be in convertblender.c, R.imat only valid if there is a world
- //mul_m3_v3(R.imat, shi->dxco);
- mul_mat3_m4_v3(R.viewinv, shi->dxco);
- VECCOPY(shi->dygl, shi->dyco);
- //mul_m3_v3(R.imat, shi->dyco);
- mul_mat3_m4_v3(R.viewinv, shi->dyco);
+ VECCOPY(shi->dxgl, shi->dxco);
+ mul_mat3_m4_v3(R.viewinv, shi->dxgl);
+ VECCOPY(shi->dygl, shi->dyco);
+ mul_mat3_m4_v3(R.viewinv, shi->dygl);
}
}
diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c
index 81de553b209..5b91f6ab08f 100644
--- a/source/blender/render/intern/source/shadeoutput.c
+++ b/source/blender/render/intern/source/shadeoutput.c
@@ -30,13 +30,13 @@
#include <math.h>
#include <string.h>
-
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_colortools.h"
#include "BKE_material.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "DNA_group_types.h"
#include "DNA_lamp_types.h"
@@ -154,8 +154,8 @@ float mistfactor(float zcor, float *co)
static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
{
double a, b, c, disc, nray[3], npos[3];
- float t0, t1 = 0.0f, t2= 0.0f, t3, haint;
- float p1[3], p2[3], ladist, maxz = 0.0f, maxy = 0.0f;
+ double t0, t1 = 0.0f, t2= 0.0f, t3;
+ float p1[3], p2[3], ladist, maxz = 0.0f, maxy = 0.0f, haint;
int snijp, doclip=1, use_yco=0;
int ok1=0, ok2=0;
@@ -202,7 +202,7 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
maxz*= lar->sh_zfac;
maxy= lar->imat[0][1]*p1[0]+lar->imat[1][1]*p1[1]+lar->imat[2][1]*p1[2];
- if( fabs(nray[2]) < DBL_EPSILON ) use_yco= 1;
+ if( fabs(nray[2]) < FLT_EPSILON ) use_yco= 1;
}
/* scale z to make sure volume is normalized */
@@ -1141,6 +1141,11 @@ float lamp_get_visibility(LampRen *lar, float *co, float *lv, float *dist)
visifac = lar->dist/(lar->dist + dist[0]);
break;
case LA_FALLOFF_INVSQUARE:
+ /* NOTE: This seems to be a hack since commit r12045 says this
+ * option is similar to old Quad, but with slight changes.
+ * Correct inv square would be (which would be old Quad):
+ * visifac = lar->distkw / (lar->distkw + dist[0]*dist[0]);
+ */
visifac = lar->dist / (lar->dist + dist[0]*dist[0]);
break;
case LA_FALLOFF_SLIDERS:
@@ -1391,6 +1396,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
}
i*= shadfac[3];
+ shr->shad[3] = shadfac[3]; /* store this for possible check in troublesome cases */
}
}
}
@@ -1409,10 +1415,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
}
if(i_noshad>0.0f) {
if(passflag & (SCE_PASS_DIFFUSE|SCE_PASS_SHADOW)) {
- if(ma->mode & MA_SHADOW_TRA)
- add_to_diffuse(shr->diff, shi, is, i_noshad*shadfac[0]*lacol[0], i_noshad*shadfac[1]*lacol[1], i_noshad*shadfac[2]*lacol[2]);
- else
- add_to_diffuse(shr->diff, shi, is, i_noshad*lacol[0], i_noshad*lacol[1], i_noshad*lacol[2]);
+ add_to_diffuse(shr->diff, shi, is, i_noshad*lacol[0], i_noshad*lacol[1], i_noshad*lacol[2]);
}
else
VECCOPY(shr->diff, shr->shad);
@@ -1643,12 +1646,14 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
if(R.wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)) {
if(((passflag & SCE_PASS_COMBINED) && (shi->combinedflag & (SCE_PASS_AO|SCE_PASS_ENVIRONMENT|SCE_PASS_INDIRECT)))
|| (passflag & (SCE_PASS_AO|SCE_PASS_ENVIRONMENT|SCE_PASS_INDIRECT))) {
- /* AO was calculated for scanline already */
- if(shi->depth || shi->volume_depth)
- ambient_occlusion(shi);
- VECCOPY(shr->ao, shi->ao);
- VECCOPY(shr->env, shi->env); // XXX multiply
- VECCOPY(shr->indirect, shi->indirect); // XXX multiply
+ if(R.r.mode & R_SHADOW) {
+ /* AO was calculated for scanline already */
+ if(shi->depth || shi->volume_depth)
+ ambient_occlusion(shi);
+ VECCOPY(shr->ao, shi->ao);
+ VECCOPY(shr->env, shi->env); // XXX multiply
+ VECCOPY(shr->indirect, shi->indirect); // XXX multiply
+ }
}
}
@@ -1725,10 +1730,17 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
VECCOPY(shr->combined, shr->diff);
/* calculate shadow pass, we use a multiplication mask */
- if(passflag & SCE_PASS_SHADOW) {
+ /* if diff = 0,0,0 it doesn't matter what the shadow pass is, so leave it as is */
+ if(passflag & SCE_PASS_SHADOW && !(shr->diff[0]==0.0f && shr->diff[1]==0.0f && shr->diff[2]==0.0f)) {
if(shr->diff[0]!=0.0f) shr->shad[0]= shr->shad[0]/shr->diff[0];
+ /* can't determine proper shadow from shad/diff (0/0), so use shadow intensity */
+ else if(shr->shad[0]==0.0f) shr->shad[0]= shr->shad[3];
+
if(shr->diff[1]!=0.0f) shr->shad[1]= shr->shad[1]/shr->diff[1];
+ else if(shr->shad[1]==0.0f) shr->shad[1]= shr->shad[3];
+
if(shr->diff[2]!=0.0f) shr->shad[2]= shr->shad[2]/shr->diff[2];
+ else if(shr->shad[2]==0.0f) shr->shad[2]= shr->shad[3];
}
/* exposure correction */
@@ -1757,18 +1769,20 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
/* from now stuff everything in shr->combined: ambient, AO, radio, ramps, exposure */
if(!(ma->sss_flag & MA_DIFF_SSS) || !sss_pass_done(&R, ma)) {
- /* add AO in combined? */
- if(R.wrld.mode & WO_AMB_OCC)
- if(shi->combinedflag & SCE_PASS_AO)
- ambient_occlusion_apply(shi, shr);
-
- if(R.wrld.mode & WO_ENV_LIGHT)
- if(shi->combinedflag & SCE_PASS_ENVIRONMENT)
- environment_lighting_apply(shi, shr);
-
- if(R.wrld.mode & WO_INDIRECT_LIGHT)
- if(shi->combinedflag & SCE_PASS_INDIRECT)
- indirect_lighting_apply(shi, shr);
+ if(R.r.mode & R_SHADOW) {
+ /* add AO in combined? */
+ if(R.wrld.mode & WO_AMB_OCC)
+ if(shi->combinedflag & SCE_PASS_AO)
+ ambient_occlusion_apply(shi, shr);
+
+ if(R.wrld.mode & WO_ENV_LIGHT)
+ if(shi->combinedflag & SCE_PASS_ENVIRONMENT)
+ environment_lighting_apply(shi, shr);
+
+ if(R.wrld.mode & WO_INDIRECT_LIGHT)
+ if(shi->combinedflag & SCE_PASS_INDIRECT)
+ indirect_lighting_apply(shi, shr);
+ }
shr->combined[0]+= shi->ambr;
shr->combined[1]+= shi->ambg;
diff --git a/source/blender/render/intern/source/sss.c b/source/blender/render/intern/source/sss.c
index e8c95a34ac4..44c89f8cbd5 100644
--- a/source/blender/render/intern/source/sss.c
+++ b/source/blender/render/intern/source/sss.c
@@ -49,18 +49,21 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_memarena.h"
+
#include "PIL_time.h"
#include "DNA_material_types.h"
#include "BKE_colortools.h"
+#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_node.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
+
/* this module */
#include "render_types.h"
@@ -466,7 +469,7 @@ static void compute_radiance(ScatterTree *tree, float *co, float *rad)
/* building */
-static void sum_leaf_radiance(ScatterTree *tree, ScatterNode *node)
+static void sum_leaf_radiance(ScatterTree *UNUSED(tree), ScatterNode *node)
{
ScatterPoint *p;
float rad, totrad= 0.0f, inv;
@@ -540,7 +543,7 @@ static void sum_leaf_radiance(ScatterTree *tree, ScatterNode *node)
}
}
-static void sum_branch_radiance(ScatterTree *tree, ScatterNode *node)
+static void sum_branch_radiance(ScatterTree *UNUSED(tree), ScatterNode *node)
{
ScatterNode *subnode;
float rad, totrad= 0.0f, inv;
@@ -995,6 +998,15 @@ void make_sss_tree(Render *re)
for(mat= re->main->mat.first; mat; mat= mat->id.next)
if(mat->id.us && (mat->flag & MA_IS_USED) && (mat->sss_flag & MA_DIFF_SSS))
sss_create_tree_mat(re, mat);
+
+ /* XXX preview exception */
+ /* localizing preview render data is not fun for node trees :( */
+ if(re->main!=G.main) {
+ for(mat= G.main->mat.first; mat; mat= mat->id.next)
+ if(mat->id.us && (mat->flag & MA_IS_USED) && (mat->sss_flag & MA_DIFF_SSS))
+ sss_create_tree_mat(re, mat);
+ }
+
}
void free_sss(Render *re)
diff --git a/source/blender/render/intern/source/strand.c b/source/blender/render/intern/source/strand.c
index 88d042e7b97..099bf76f40b 100644
--- a/source/blender/render/intern/source/strand.c
+++ b/source/blender/render/intern/source/strand.c
@@ -39,12 +39,13 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_memarena.h"
#include "BKE_DerivedMesh.h"
#include "BKE_key.h"
-#include "BKE_utildefines.h"
+
#include "render_types.h"
#include "initrender.h"
@@ -578,7 +579,8 @@ static void do_strand_fillac(void *handle, int x, int y, float u, float v, float
}
}
-static int strand_test_clip(float winmat[][4], ZSpan *zspan, float *bounds, float *co, float *zcomp)
+/* width is calculated in hoco space, to ensure strands are visible */
+static int strand_test_clip(float winmat[][4], ZSpan *zspan, float *bounds, float *co, float *zcomp, float widthx, float widthy)
{
float hoco[4];
int clipflag= 0;
@@ -588,10 +590,11 @@ static int strand_test_clip(float winmat[][4], ZSpan *zspan, float *bounds, floa
/* we compare z without perspective division for segment sorting */
*zcomp= hoco[2];
- if(hoco[0] > bounds[1]*hoco[3]) clipflag |= 1;
- else if(hoco[0]< bounds[0]*hoco[3]) clipflag |= 2;
- else if(hoco[1] > bounds[3]*hoco[3]) clipflag |= 4;
- else if(hoco[1]< bounds[2]*hoco[3]) clipflag |= 8;
+ if(hoco[0]+widthx < bounds[0]*hoco[3]) clipflag |= 1;
+ else if(hoco[0]-widthx > bounds[1]*hoco[3]) clipflag |= 2;
+
+ if(hoco[1]-widthy > bounds[3]*hoco[3]) clipflag |= 4;
+ else if(hoco[1]+widthy < bounds[2]*hoco[3]) clipflag |= 8;
clipflag |= testclip(hoco);
@@ -825,6 +828,9 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, APixstrand *apixbuf, ListBa
/* for all object instances */
for(obi=re->instancetable.first, i=0; obi; obi=obi->next, i++) {
+ Material *ma;
+ float widthx, widthy;
+
obr= obi->obr;
if(!obr->strandbuf || !(obr->strandbuf->lay & lay))
@@ -836,8 +842,19 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, APixstrand *apixbuf, ListBa
else
copy_m4_m4(obwinmat, winmat);
+ /* test if we should skip it */
+ ma = obr->strandbuf->ma;
+
+ if(shadow && !(ma->mode & MA_SHADBUF))
+ continue;
+ else if(!shadow && (ma->mode & MA_ONLYCAST))
+ continue;
+
if(clip_render_object(obi->obr->boundbox, bounds, winmat))
continue;
+
+ widthx= obr->strandbuf->maxwidth*obwinmat[0][0];
+ widthy= obr->strandbuf->maxwidth*obwinmat[1][1];
/* for each bounding box containing a number of strands */
sbound= obr->strandbuf->bound;
@@ -851,14 +868,14 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, APixstrand *apixbuf, ListBa
svert= strand->vert;
/* keep clipping and z depth for 4 control points */
- clip[1]= strand_test_clip(obwinmat, &zspan, bounds, svert->co, &z[1]);
- clip[2]= strand_test_clip(obwinmat, &zspan, bounds, (svert+1)->co, &z[2]);
+ clip[1]= strand_test_clip(obwinmat, &zspan, bounds, svert->co, &z[1], widthx, widthy);
+ clip[2]= strand_test_clip(obwinmat, &zspan, bounds, (svert+1)->co, &z[2], widthx, widthy);
clip[0]= clip[1]; z[0]= z[1];
for(b=0; b<strand->totvert-1; b++, svert++) {
/* compute 4th point clipping and z depth */
if(b < strand->totvert-2) {
- clip[3]= strand_test_clip(obwinmat, &zspan, bounds, (svert+2)->co, &z[3]);
+ clip[3]= strand_test_clip(obwinmat, &zspan, bounds, (svert+2)->co, &z[3], widthx, widthy);
}
else {
clip[3]= clip[2]; z[3]= z[2];
@@ -1015,12 +1032,22 @@ void free_strand_surface(Render *re)
BLI_freelistN(&re->strandsurface);
}
-void strand_minmax(StrandRen *strand, float *min, float *max)
+void strand_minmax(StrandRen *strand, float *min, float *max, float width)
{
StrandVert *svert;
+ float vec[3], width2= 2.0f*width;
int a;
- for(a=0, svert=strand->vert; a<strand->totvert; a++, svert++)
- DO_MINMAX(svert->co, min, max)
+ for(a=0, svert=strand->vert; a<strand->totvert; a++, svert++) {
+ VECCOPY(vec, svert->co);
+ DO_MINMAX(vec, min, max);
+
+ if(width!=0.0f) {
+ vec[0]+= width; vec[1]+= width; vec[2]+= width;
+ DO_MINMAX(vec, min, max);
+ vec[0]-= width2; vec[1]-= width2; vec[2]-= width2;
+ DO_MINMAX(vec, min, max);
+ }
+ }
}
diff --git a/source/blender/render/intern/source/volume_precache.c b/source/blender/render/intern/source/volume_precache.c
index d3e8f4058c5..609e647637f 100644
--- a/source/blender/render/intern/source/volume_precache.c
+++ b/source/blender/render/intern/source/volume_precache.c
@@ -37,14 +37,16 @@
#include "BLI_math.h"
#include "BLI_threads.h"
#include "BLI_voxel.h"
+#include "BLI_utildefines.h"
#include "PIL_time.h"
#include "RE_shader_ext.h"
-#include "RE_raytrace.h"
#include "DNA_material_types.h"
+#include "rayintersection.h"
+#include "rayobject.h"
#include "render_types.h"
#include "rendercore.h"
#include "renderdatabase.h"
@@ -73,11 +75,11 @@ int intersect_outside_volume(RayObject *tree, Isect *isect, float *offset, int l
if (RE_rayobject_raycast(tree, isect)) {
- isect->start[0] = isect->start[0] + isect->labda*isect->vec[0];
- isect->start[1] = isect->start[1] + isect->labda*isect->vec[1];
- isect->start[2] = isect->start[2] + isect->labda*isect->vec[2];
+ isect->start[0] = isect->start[0] + isect->dist*isect->dir[0];
+ isect->start[1] = isect->start[1] + isect->dist*isect->dir[1];
+ isect->start[2] = isect->start[2] + isect->dist*isect->dir[2];
- isect->labda = FLT_MAX;
+ isect->dist = FLT_MAX;
isect->skip = RE_SKIP_VLR_NEIGHBOUR;
isect->orig.face= isect->hit.face;
isect->orig.ob= isect->hit.ob;
@@ -89,25 +91,24 @@ int intersect_outside_volume(RayObject *tree, Isect *isect, float *offset, int l
}
/* Uses ray tracing to check if a point is inside or outside an ObjectInstanceRen */
-int point_inside_obi(RayObject *tree, ObjectInstanceRen *obi, float *co)
+int point_inside_obi(RayObject *tree, ObjectInstanceRen *UNUSED(obi), float *co)
{
- Isect isect;
- float vec[3] = {0.0f,0.0f,1.0f};
+ Isect isect= {{0}};
+ float dir[3] = {0.0f,0.0f,1.0f};
int final_depth=0, depth=0, limit=20;
/* set up the isect */
- memset(&isect, 0, sizeof(isect));
VECCOPY(isect.start, co);
- VECCOPY(isect.vec, vec);
+ VECCOPY(isect.dir, dir);
isect.mode= RE_RAY_MIRROR;
isect.last_hit= NULL;
isect.lay= -1;
- isect.labda = FLT_MAX;
+ isect.dist = FLT_MAX;
isect.orig.face= NULL;
isect.orig.ob = NULL;
- final_depth = intersect_outside_volume(tree, &isect, vec, limit, depth);
+ final_depth = intersect_outside_volume(tree, &isect, dir, limit, depth);
/* even number of intersections: point is outside
* odd number: point is inside */
@@ -486,7 +487,11 @@ static void *vol_precache_part(void *data)
float scatter_col[3] = {0.f, 0.f, 0.f};
float co[3], cco[3];
int x, y, z, i;
- const int res[3]= {pa->res[0], pa->res[1], pa->res[2]};
+ int res[3];
+
+ res[0]= pa->res[0];
+ res[1]= pa->res[1];
+ res[2]= pa->res[2];
for (z= pa->minz; z < pa->maxz; z++) {
co[2] = pa->bbmin[2] + (pa->voxel[2] * (z + 0.5f));
diff --git a/source/blender/render/intern/source/volumetric.c b/source/blender/render/intern/source/volumetric.c
index a58d96736d5..dc016a161b5 100644
--- a/source/blender/render/intern/source/volumetric.c
+++ b/source/blender/render/intern/source/volumetric.c
@@ -37,9 +37,9 @@
#include "BLI_math.h"
#include "BLI_rand.h"
#include "BLI_voxel.h"
+#include "BLI_utildefines.h"
#include "RE_shader_ext.h"
-#include "RE_raytrace.h"
#include "DNA_material_types.h"
#include "DNA_group_types.h"
@@ -50,6 +50,8 @@
#include "render_types.h"
#include "pixelshading.h"
+#include "rayintersection.h"
+#include "rayobject.h"
#include "shading.h"
#include "shadbuf.h"
#include "texture.h"
@@ -83,17 +85,18 @@ static float vol_get_shadow(ShadeInput *shi, LampRen *lar, float *co)
copy_v3_v3(is.start, co);
if(lar->type==LA_SUN || lar->type==LA_HEMI) {
- is.vec[0] = -lar->vec[0];
- is.vec[1] = -lar->vec[1];
- is.vec[2] = -lar->vec[2];
- is.labda = R.maxdist;
+ is.dir[0] = -lar->vec[0];
+ is.dir[1] = -lar->vec[1];
+ is.dir[2] = -lar->vec[2];
+ is.dist = R.maxdist;
} else {
- VECSUB( is.vec, lar->co, is.start );
- is.labda = len_v3( is.vec );
+ VECSUB( is.dir, lar->co, is.start );
+ is.dist = normalize_v3( is.dir );
}
is.mode = RE_RAY_MIRROR;
- is.skip = RE_SKIP_VLR_RENDER_CHECK | RE_SKIP_VLR_NON_SOLID_MATERIAL;
+ is.check = RE_CHECK_VLR_NON_SOLID_MATERIAL;
+ is.skip = 0;
if(lar->mode & (LA_LAYER|LA_LAYER_SHADOW))
is.lay= lar->lay;
@@ -115,20 +118,14 @@ static float vol_get_shadow(ShadeInput *shi, LampRen *lar, float *co)
static int vol_get_bounds(ShadeInput *shi, float *co, float *vec, float *hitco, Isect *isect, int intersect_type)
{
- /* XXX TODO - get raytrace max distance from object instance's bounding box */
- /* need to account for scaling only, but keep coords in camera space...
- * below code is WIP and doesn't work!
- sub_v3_v3v3(bb_dim, shi->obi->obr->boundbox[1], shi->obi->obr->boundbox[2]);
- mul_m3_v3(shi->obi->nmat, bb_dim);
- maxsize = len_v3(bb_dim);
- */
VECCOPY(isect->start, co);
- VECCOPY(isect->vec, vec );
- isect->labda = FLT_MAX;
+ VECCOPY(isect->dir, vec );
+ isect->dist = FLT_MAX;
isect->mode= RE_RAY_MIRROR;
isect->last_hit = NULL;
isect->lay= -1;
+ isect->check= RE_CHECK_VLR_NONE;
if (intersect_type == VOL_BOUNDS_DEPTH) {
isect->skip = RE_SKIP_VLR_NEIGHBOUR;
@@ -142,9 +139,9 @@ static int vol_get_bounds(ShadeInput *shi, float *co, float *vec, float *hitco,
if(RE_rayobject_raycast(R.raytree, isect))
{
- hitco[0] = isect->start[0] + isect->labda*isect->vec[0];
- hitco[1] = isect->start[1] + isect->labda*isect->vec[1];
- hitco[2] = isect->start[2] + isect->labda*isect->vec[2];
+ hitco[0] = isect->start[0] + isect->dist*isect->dir[0];
+ hitco[1] = isect->start[1] + isect->dist*isect->dir[1];
+ hitco[2] = isect->start[2] + isect->dist*isect->dir[2];
return 1;
} else {
return 0;
@@ -189,10 +186,11 @@ static void vol_trace_behind(ShadeInput *shi, VlakRen *vlr, float *co, float *co
Isect isect;
VECCOPY(isect.start, co);
- VECCOPY(isect.vec, shi->view);
- isect.labda = FLT_MAX;
+ VECCOPY(isect.dir, shi->view);
+ isect.dist = FLT_MAX;
isect.mode= RE_RAY_MIRROR;
+ isect.check = RE_CHECK_VLR_NONE;
isect.skip = RE_SKIP_VLR_NEIGHBOUR;
isect.orig.ob = (void*) shi->obi;
isect.orig.face = (void*)vlr;
@@ -337,7 +335,7 @@ void vol_get_emission(ShadeInput *shi, float *emission_col, float *co)
/* A combination of scattering and absorption -> known as sigma T.
- * This can possibly use a specific scattering colour,
+ * This can possibly use a specific scattering color,
* and absorption multiplier factor too, but these parameters are left out for simplicity.
* It's easy enough to get a good wide range of results with just these two parameters. */
void vol_get_sigma_t(ShadeInput *shi, float *sigma_t, float *co)
@@ -358,7 +356,7 @@ void vol_get_sigma_t(ShadeInput *shi, float *sigma_t, float *co)
/* phase function - determines in which directions the light
* is scattered in the volume relative to incoming direction
* and view direction */
-float vol_get_phasefunc(ShadeInput *shi, float g, float *w, float *wp)
+float vol_get_phasefunc(ShadeInput *UNUSED(shi), float g, float *w, float *wp)
{
const float normalize = 0.25f; // = 1.f/4.f = M_PI/(4.f*M_PI)
@@ -578,8 +576,8 @@ outgoing radiance from behind surface * beam transmittance/attenuation
/* For ease of use, I've also introduced a 'reflection' and 'reflection color' parameter, which isn't
* physically correct. This works as an RGB tint/gain on out-scattered light, but doesn't affect the light
* that is transmitted through the volume. While having wavelength dependent absorption/scattering is more correct,
- * it also makes it harder to control the overall look of the volume since colouring the outscattered light results
- * in the inverse colour being transmitted through the rest of the volume.
+ * it also makes it harder to control the overall look of the volume since coloring the outscattered light results
+ * in the inverse color being transmitted through the rest of the volume.
*/
static void volumeintegrate(struct ShadeInput *shi, float *col, float *co, float *endco)
{
@@ -741,9 +739,9 @@ void shade_volume_shadow(struct ShadeInput *shi, struct ShadeResult *shr, struct
{
float hitco[3];
float tr[3] = {1.0,1.0,1.0};
- Isect is;
+ Isect is= {{0}};
float *startco, *endco;
- float density=0.f;
+ int intersect_type = VOL_BOUNDS_DEPTH;
memset(shr, 0, sizeof(ShadeResult));
@@ -752,10 +750,12 @@ void shade_volume_shadow(struct ShadeInput *shi, struct ShadeResult *shr, struct
if (shi->flippednor) {
startco = last_is->start;
endco = shi->co;
+ intersect_type = VOL_BOUNDS_SS;
}
+
/* trace to find a backface, the other side bounds of the volume */
/* (ray intersect ignores front faces here) */
- else if (vol_get_bounds(shi, shi->co, shi->view, hitco, &is, VOL_BOUNDS_DEPTH)) {
+ else if (vol_get_bounds(shi, shi->co, shi->view, hitco, &is, intersect_type)) {
startco = shi->co;
endco = hitco;
}
@@ -764,12 +764,23 @@ void shade_volume_shadow(struct ShadeInput *shi, struct ShadeResult *shr, struct
shr->alpha = shr->combined[3] = 1.f;
return;
}
-
- density = vol_get_density(shi, startco);
+
vol_get_transmittance(shi, tr, startco, endco);
+
+
+ /* if we hit another face in the same volume bounds */
+ /* shift raytrace coordinates to the hit point, to avoid shading volume twice */
+ /* due to idiosyncracy in ray_trace_shadow_tra() */
+ if (is.hit.ob == shi->obi) {
+ copy_v3_v3(shi->co, hitco);
+ last_is->dist -= is.dist;
+ shi->vlr = (VlakRen *)is.hit.face;
+ }
+
copy_v3_v3(shr->combined, tr);
shr->combined[3] = 1.0f - luminance(tr);
+ shr->alpha = shr->combined[3];
}
@@ -786,6 +797,7 @@ void shade_volume_inside(ShadeInput *shi, ShadeResult *shr)
MatInside *m;
Material *mat_backup;
ObjectInstanceRen *obi_backup;
+ float prev_alpha = shr->alpha;
/* XXX: extend to multiple volumes perhaps later */
mat_backup = shi->mat;
@@ -796,11 +808,14 @@ void shade_volume_inside(ShadeInput *shi, ShadeResult *shr)
shi->obi = m->obi;
shi->obr = m->obi->obr;
- memset(shr, 0, sizeof(ShadeResult));
-
volume_trace(shi, shr, VOL_SHADE_INSIDE);
+
+ shr->alpha = shr->alpha + prev_alpha;
+ CLAMP(shr->alpha, 0.0, 1.0);
shi->mat = mat_backup;
shi->obi = obi_backup;
shi->obr = obi_backup->obr;
}
+
+
diff --git a/source/blender/render/intern/source/voxeldata.c b/source/blender/render/intern/source/voxeldata.c
index 076d6355585..2fba1091319 100644
--- a/source/blender/render/intern/source/voxeldata.c
+++ b/source/blender/render/intern/source/voxeldata.c
@@ -35,10 +35,12 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_voxel.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
+#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_modifier.h"
@@ -46,6 +48,7 @@
#include "smoke_API.h"
#include "DNA_texture_types.h"
+#include "DNA_object_force.h"
#include "DNA_object_types.h"
#include "DNA_modifier_types.h"
#include "DNA_smoke_types.h"
@@ -178,7 +181,7 @@ static int read_voxeldata_header(FILE *fp, struct VoxelData *vd)
return 1;
}
-static void init_frame_smoke(VoxelData *vd, Tex *tex)
+static void init_frame_smoke(VoxelData *vd, float cfra)
{
Object *ob;
ModifierData *md;
@@ -194,8 +197,9 @@ static void init_frame_smoke(VoxelData *vd, Tex *tex)
if(smd->domain && smd->domain->fluid) {
-
- if (vd->smoked_type == TEX_VD_SMOKEHEAT) {
+ if(cfra < smd->domain->point_cache[0]->startframe)
+ ; /* don't show smoke before simulation starts, this could be made an option in the future */
+ else if (vd->smoked_type == TEX_VD_SMOKEHEAT) {
int totRes;
float *heat;
int i;
@@ -238,13 +242,22 @@ static void init_frame_smoke(VoxelData *vd, Tex *tex)
}
else {
+ int totRes;
+ float *density;
+
if (smd->domain->flags & MOD_SMOKE_HIGHRES) {
smoke_turbulence_get_res(smd->domain->wt, vd->resol);
- vd->dataset = smoke_turbulence_get_density(smd->domain->wt);
+ density = smoke_turbulence_get_density(smd->domain->wt);
} else {
VECCOPY(vd->resol, smd->domain->res);
- vd->dataset = smoke_get_density(smd->domain->fluid);
+ density = smoke_get_density(smd->domain->fluid);
}
+
+ totRes = (vd->resol[0])*(vd->resol[1])*(vd->resol[2]);
+
+ /* always store copy, as smoke internal data can change */
+ vd->dataset = MEM_mapallocN(sizeof(float)*(totRes), "smoke data");
+ memcpy(vd->dataset, density, sizeof(float)*totRes);
} // end of fluid condition
}
}
@@ -253,13 +266,12 @@ static void init_frame_smoke(VoxelData *vd, Tex *tex)
return;
}
-static void cache_voxeldata(struct Render *re,Tex *tex)
+static void cache_voxeldata(struct Render *re, Tex *tex)
{
VoxelData *vd = tex->vd;
FILE *fp;
int curframe;
-
- if (!vd) return;
+ char path[sizeof(vd->source_path)];
/* only re-cache if dataset needs updating */
if ((vd->flag & TEX_VD_STILL) || (vd->cachedframe == re->r.cfra))
@@ -267,8 +279,7 @@ static void cache_voxeldata(struct Render *re,Tex *tex)
/* clear out old cache, ready for new */
if (vd->dataset) {
- if(vd->file_format != TEX_VD_SMOKE)
- MEM_freeN(vd->dataset);
+ MEM_freeN(vd->dataset);
vd->dataset = NULL;
}
@@ -277,16 +288,19 @@ static void cache_voxeldata(struct Render *re,Tex *tex)
else
curframe = re->r.cfra;
+ BLI_strncpy(path, vd->source_path, sizeof(path));
+
switch(vd->file_format) {
case TEX_VD_IMAGE_SEQUENCE:
load_frame_image_sequence(vd, tex);
return;
case TEX_VD_SMOKE:
- init_frame_smoke(vd, tex);
+ init_frame_smoke(vd, re->r.cfra);
return;
case TEX_VD_BLENDERVOXEL:
- if (!BLI_exists(vd->source_path)) return;
- fp = fopen(vd->source_path,"rb");
+ BLI_path_abs(path, G.main->name);
+ if (!BLI_exists(path)) return;
+ fp = fopen(path,"rb");
if (!fp) return;
if(read_voxeldata_header(fp, vd))
@@ -296,8 +310,9 @@ static void cache_voxeldata(struct Render *re,Tex *tex)
return;
case TEX_VD_RAW_8BIT:
- if (!BLI_exists(vd->source_path)) return;
- fp = fopen(vd->source_path,"rb");
+ BLI_path_abs(path, G.main->name);
+ if (!BLI_exists(path)) return;
+ fp = fopen(path,"rb");
if (!fp) return;
if (load_frame_raw8(vd, fp, curframe))
@@ -347,7 +362,7 @@ int voxeldatatex(struct Tex *tex, float *texvec, struct TexResult *texres)
add_v3_v3(co, offset);
/* co is now in the range 0.0, 1.0 */
- switch (tex->extend) {
+ switch (vd->extend) {
case TEX_CLIP:
{
if ((co[0] < 0.f || co[0] > 1.f) || (co[1] < 0.f || co[1] > 1.f) || (co[2] < 0.f || co[2] > 1.f)) {
diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c
index 4f872a238cd..a3d3a65cccc 100644
--- a/source/blender/render/intern/source/zbuf.c
+++ b/source/blender/render/intern/source/zbuf.c
@@ -41,7 +41,7 @@
#include "BLI_blenlib.h"
#include "BLI_jitter.h"
#include "BLI_threads.h"
-
+#include "BLI_utildefines.h"
#include "MEM_guardedalloc.h"
@@ -53,7 +53,7 @@
#include "BKE_global.h"
#include "BKE_material.h"
-#include "BKE_utildefines.h"
+
#include "RE_render_ext.h"
@@ -243,14 +243,14 @@ int testclip(float *v)
prevents issues with vertices lying exact on borders */
abs4= fabs(v[3]) + FLT_EPSILON;
- if(v[2]< -abs4) c=16; /* this used to be " if(v[2]<0) ", see clippz() */
- else if(v[2]> abs4) c+= 32;
+ if( v[0] < -abs4) c+=1;
+ else if( v[0] > abs4) c+=2;
- if( v[0]>abs4) c+=2;
- else if( v[0]< -abs4) c+=1;
+ if( v[1] > abs4) c+=4;
+ else if( v[1] < -abs4) c+=8;
- if( v[1]>abs4) c+=4;
- else if( v[1]< -abs4) c+=8;
+ if(v[2] < -abs4) c+=16; /* this used to be " if(v[2]<0) ", see clippz() */
+ else if(v[2]> abs4) c+= 32;
return c;
}
@@ -1782,10 +1782,10 @@ static int zbuf_part_project(ZbufProjectCache *cache, int index, float winmat[][
projectvert(co, winmat, ho);
wco= ho[3];
- if(ho[0] > bounds[1]*wco) clipflag |= 1;
- else if(ho[0]< bounds[0]*wco) clipflag |= 2;
+ if(ho[0] < bounds[0]*wco) clipflag |= 1;
+ else if(ho[0] > bounds[1]*wco) clipflag |= 2;
if(ho[1] > bounds[3]*wco) clipflag |= 4;
- else if(ho[1]< bounds[2]*wco) clipflag |= 8;
+ else if(ho[1] < bounds[2]*wco) clipflag |= 8;
QUATCOPY(cache[cindex].ho, ho);
cache[cindex].clip= clipflag;
@@ -1805,10 +1805,9 @@ void zbuf_render_project(float winmat[][4], float *co, float *ho)
void zbuf_make_winmat(Render *re, float winmat[][4])
{
- float panomat[4][4];
-
if(re->r.mode & R_PANORAMA) {
- unit_m4(panomat);
+ float panomat[4][4]= MAT4_UNITY;
+
panomat[0][0]= re->panoco;
panomat[0][2]= re->panosi;
panomat[2][0]= -re->panosi;
diff --git a/source/blender/verify/BLO_sign_verify_Header.h b/source/blender/verify/BLO_sign_verify_Header.h
deleted file mode 100644
index 9d73d9ba595..00000000000
--- a/source/blender/verify/BLO_sign_verify_Header.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- *
- */
-
-#ifndef BLO_SIGN_VERIFY_H
-#define BLO_SIGN_VERIFY_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef FREE_WINDOWS
-typedef int int32_t;
-#endif
-
-#include "BLO_sys_types.h"
-
-#define SIGNVERIFYHEADERSTRUCTSIZE sizeof(struct BLO_sign_verify_HeaderStruct)
-/* TODO use reasonable sizes
-Tests showed: pubKeyLen 64, cryptedKeyLen 64 bytes
-So we pick 2*64 bytes + tail for now : */
-
-#define MAXPUBKEYLEN 130
-#define MAXSIGNATURELEN 130
-
-struct BLO_sign_verify_HeaderStruct {
- uint8_t magic; /* poor mans header recognize check */
- uint32_t length; /* how much signed data is there */
- uint8_t pubKey[MAXPUBKEYLEN];
- uint32_t pubKeyLen; /* the actual pubKey length */
- uint8_t signature[MAXSIGNATURELEN];
- int32_t signatureLen; /* the actual signature length */
- uint32_t datacrc; /* data crc checksum */
- uint32_t headercrc; /* header minus crc itself checksum */
-};
-
-#define SIGNERHEADERSTRUCTSIZE sizeof(struct BLO_SignerHeaderStruct)
-#define MAXSIGNERLEN 100
-
-struct BLO_SignerHeaderStruct {
- uint8_t name[MAXSIGNERLEN]; /* the signers name (from the key) */
- uint8_t email[MAXSIGNERLEN]; /* the signers email (from the key) */
- uint8_t homeUrl[MAXSIGNERLEN]; /* the signers home page */
- uint8_t text[MAXSIGNERLEN]; /* optional additional user text */
- uint8_t pubKeyUrl1[MAXSIGNERLEN]; /* the signers pubKey store */
- uint8_t pubKeyUrl2[MAXSIGNERLEN]; /* the signers pubKey at NaN */
-};
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* BLO_SIGN_VERIFY_H */
-
diff --git a/source/blender/verify/BLO_verify.h b/source/blender/verify/BLO_verify.h
deleted file mode 100644
index 5f7241c1cd5..00000000000
--- a/source/blender/verify/BLO_verify.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#ifndef BLO_VERIFY_H
-#define BLO_VERIFY_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define VERIFY_DECLARE_HANDLE(name) typedef struct name##__ { int unused; } *name
-
-VERIFY_DECLARE_HANDLE(BLO_verifyStructHandle);
-
-/**
- * openssl verify initializer
- * @retval pointer to verify control structure
- */
- BLO_verifyStructHandle
-BLO_verify_begin(
- void *endControl);
-
-/**
- * openssl verify dataprocessor wrapper
- * @param BLO_verify Pointer to verify control structure
- * @param data Pointer to new data
- * @param dataIn New data amount
- * @retval streamGlueRead return value
- */
- int
-BLO_verify_process(
- BLO_verifyStructHandle BLO_verifyHandle,
- unsigned char *data,
- unsigned int dataIn);
-
-/**
- * openssl verify final call and cleanup
- * @param BLO_verify Pointer to verify control structure
- * @retval streamGlueRead return value
- */
- int
-BLO_verify_end(
- BLO_verifyStructHandle BLO_verifyHandle);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* BLO_VERIFY_H */
-
diff --git a/source/blender/verify/Makefile b/source/blender/verify/Makefile
deleted file mode 100644
index 4451d5baf22..00000000000
--- a/source/blender/verify/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/verify
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/verify/intern/BLO_verify.c b/source/blender/verify/intern/BLO_verify.c
deleted file mode 100644
index ccdc8a7e916..00000000000
--- a/source/blender/verify/intern/BLO_verify.c
+++ /dev/null
@@ -1,420 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- * openssl verify wrapper library
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "openssl/rsa.h"
-#include "openssl/ripemd.h"
-#include "openssl/objects.h"
-#include "zlib.h"
-
-#include "GEN_messaging.h"
-
-#include "BLO_readStreamGlue.h"
-#include "BLO_verify.h"
-#include "BLO_sign_verify_Header.h" /* used by verify and encrypt */
-
-#include "BLO_signer_info.h" /* external signer info struct */
-
-static struct BLO_SignerInfo g_SignerInfo = {"", "", ""};
-
-struct verifyStructType {
- struct readStreamGlueStruct *streamGlue;
- unsigned int streamDone;
- unsigned char headerbuffer[SIGNVERIFYHEADERSTRUCTSIZE];
- uint32_t datacrc;
- struct BLO_sign_verify_HeaderStruct *streamHeader;
- RIPEMD160_CTX ripemd160_ctx;
- struct BLO_SignerHeaderStruct *signerHeader;
- unsigned char signerHeaderBuffer[SIGNERHEADERSTRUCTSIZE];
- void *endControl;
-};
-
- BLO_verifyStructHandle
-BLO_verify_begin(
- void *endControl)
-{
- struct verifyStructType *control;
- control = malloc(sizeof(struct verifyStructType));
- if (!control) return NULL;
-
- control->streamGlue = NULL;
- control->streamDone = 0;
- memset(control->headerbuffer, 0, SIGNVERIFYHEADERSTRUCTSIZE);
- control->datacrc = 0;
-
- control->streamHeader = malloc(SIGNVERIFYHEADERSTRUCTSIZE);
- if (!control->streamHeader) {
- free(control);
- return NULL;
- }
- control->streamHeader->magic = 0;
- control->streamHeader->length = 0;
- strcpy(control->streamHeader->pubKey, "");
- control->streamHeader->pubKeyLen = 0;
- strcpy(control->streamHeader->signature, "");
- control->streamHeader->signatureLen = 0;
- control->streamHeader->datacrc = 0;
- control->streamHeader->headercrc = 0;
-
- RIPEMD160_Init(&(control->ripemd160_ctx));
-
- control->signerHeader = malloc(SIGNERHEADERSTRUCTSIZE);
- if (!control->signerHeader) {
- free(control->streamHeader);
- free(control);
- return NULL;
- }
- memset(control->signerHeader->name, 0, MAXSIGNERLEN);
- memset(control->signerHeader->email, 0, MAXSIGNERLEN);
- memset(control->signerHeader->homeUrl, 0, MAXSIGNERLEN);
- memset(control->signerHeader->text, 0, MAXSIGNERLEN);
- memset(control->signerHeader->pubKeyUrl1, 0, MAXSIGNERLEN);
- memset(control->signerHeader->pubKeyUrl2, 0, MAXSIGNERLEN);
-
- control->endControl = endControl;
- return((BLO_verifyStructHandle) control);
-}
-
- int
-BLO_verify_process(
- BLO_verifyStructHandle BLO_verifyHandle,
- unsigned char *data,
- unsigned int dataIn)
-{
- int err = 0;
- struct verifyStructType *BLO_verify =
- (struct verifyStructType *) BLO_verifyHandle;
-
- if (!BLO_verify) {
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETGENERR(BRS_NULL);
- return err;
- }
-
- /* First check if we have our header filled in yet */
- if (BLO_verify->streamHeader->length == 0) {
- unsigned int processed;
- if (dataIn == 0) return err; /* really need data to do anything */
- processed = ((dataIn + BLO_verify->streamDone) <=
- SIGNVERIFYHEADERSTRUCTSIZE)
- ? dataIn : SIGNVERIFYHEADERSTRUCTSIZE;
- memcpy(BLO_verify->headerbuffer + BLO_verify->streamDone,
- data, processed);
- BLO_verify->streamDone += processed;
- dataIn -= processed;
- data += processed;
- if (BLO_verify->streamDone == SIGNVERIFYHEADERSTRUCTSIZE) {
- /* we have the whole header, absorb it */
- struct BLO_sign_verify_HeaderStruct *header;
- uint32_t crc;
-
- header = (struct BLO_sign_verify_HeaderStruct *)
- BLO_verify->headerbuffer;
- crc = crc32(0L, (const Bytef *) header,
- SIGNVERIFYHEADERSTRUCTSIZE - 4);
-
- if (header->magic == 'A') {
-#ifndef NDEBUG
- fprintf(GEN_errorstream,
- "BLO_sign_verify_HeaderStruct Magic confirmed\n");
-#endif
- } else {
-#ifndef NDEBUG
- fprintf(GEN_errorstream,
- "ERROR BLO_sign_verify_HeaderStruct Magic NOT confirmed\n");
-#endif
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETGENERR(BRS_MAGIC);
- if (BLO_verify->streamGlue) free(BLO_verify->streamGlue);
- if (BLO_verify->streamHeader) free(BLO_verify->streamHeader);
- if (BLO_verify->signerHeader) free(BLO_verify->signerHeader);
- free(BLO_verify);
- return err;
- }
-
- if (crc == ntohl(header->headercrc)) {
-#ifndef NDEBUG
- fprintf(GEN_errorstream,"BLO_sign_verify_Header CRC correct\n");
-#endif
- } else {
-#ifndef NDEBUG
- fprintf(GEN_errorstream,"ERROR BLO_sign_verify_Header CRC NOT correct\n");
-#endif
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETGENERR(BRS_CRCHEADER);
- if (BLO_verify->streamGlue) free(BLO_verify->streamGlue);
- if (BLO_verify->streamHeader) free(BLO_verify->streamHeader);
- if (BLO_verify->signerHeader) free(BLO_verify->signerHeader);
- free(BLO_verify);
- return err;
- }
- BLO_verify->streamHeader->length = ntohl(header->length);
- BLO_verify->streamHeader->pubKeyLen = ntohl(header->pubKeyLen);
- memcpy(BLO_verify->streamHeader->pubKey, header->pubKey,
- BLO_verify->streamHeader->pubKeyLen);
- BLO_verify->streamHeader->signatureLen =
- ntohl(header->signatureLen);
- memcpy(BLO_verify->streamHeader->signature, header->signature,
- BLO_verify->streamHeader->signatureLen);
- BLO_verify->streamHeader->datacrc = ntohl(header->datacrc);
-
-#ifndef NDEBUG
- fprintf(GEN_errorstream,
- "BLO_verify_process gets %u bytes\n",
- (unsigned int) BLO_verify->streamHeader->length);
-#endif
-
- }
- }
-
- /* Is there really (still) new data available ? */
- if (dataIn > 0) {
- /* BLO_SignerHeaderStruct */
- if (BLO_verify->signerHeader->name[0] == 0) {
- /* we don't have our signerHeader complete yet */
- unsigned int processed;
- processed = ((dataIn + BLO_verify->streamDone -
- SIGNVERIFYHEADERSTRUCTSIZE) <= SIGNERHEADERSTRUCTSIZE)
- ? dataIn : SIGNERHEADERSTRUCTSIZE;
- memcpy(BLO_verify->signerHeaderBuffer +
- BLO_verify->streamDone - SIGNVERIFYHEADERSTRUCTSIZE,
- data, processed);
- BLO_verify->streamDone += processed;
- dataIn -= processed;
- data += processed;
- if (BLO_verify->streamDone == SIGNVERIFYHEADERSTRUCTSIZE +
- SIGNERHEADERSTRUCTSIZE) {
- /* we have the whole header, absorb it */
- struct BLO_SignerHeaderStruct *signerHeader;
- signerHeader = (struct BLO_SignerHeaderStruct *)
- BLO_verify->signerHeaderBuffer;
- strncpy(BLO_verify->signerHeader->name,
- signerHeader->name, MAXSIGNERLEN-1);
- strncpy(BLO_verify->signerHeader->email,
- signerHeader->email, MAXSIGNERLEN-1);
- strncpy(BLO_verify->signerHeader->homeUrl,
- signerHeader->homeUrl, MAXSIGNERLEN-1);
- strncpy(BLO_verify->signerHeader->text,
- signerHeader->text, MAXSIGNERLEN-1);
- strncpy(BLO_verify->signerHeader->pubKeyUrl1,
- signerHeader->pubKeyUrl1, MAXSIGNERLEN-1);
- strncpy(BLO_verify->signerHeader->pubKeyUrl2,
- signerHeader->pubKeyUrl2, MAXSIGNERLEN-1);
-
-#ifndef NDEBUG
- fprintf(GEN_errorstream,
- "name %s\nemail %s\nhomeUrl %s\ntext %s\n",
- BLO_verify->signerHeader->name,
- BLO_verify->signerHeader->email,
- BLO_verify->signerHeader->homeUrl,
- BLO_verify->signerHeader->text);
- fprintf(GEN_errorstream,
- "pubKeyUrl1 %s\npubKeyUrl2 %s\n",
- BLO_verify->signerHeader->pubKeyUrl1,
- BLO_verify->signerHeader->pubKeyUrl2);
-#endif
- /* also update the signature and crc checksum */
- RIPEMD160_Update(&(BLO_verify->ripemd160_ctx),
- BLO_verify->signerHeaderBuffer,
- SIGNERHEADERSTRUCTSIZE);
-
- /* update datacrc */
- BLO_verify->datacrc = crc32(
- BLO_verify->datacrc, (const Bytef *)
- BLO_verify->signerHeaderBuffer,
- SIGNERHEADERSTRUCTSIZE);
- }
- }
- }
-
- /* Is there really (still) new data available ? */
- if (dataIn > 0) {
- RIPEMD160_Update(&(BLO_verify->ripemd160_ctx), data, dataIn);
-
- /* update datacrc */
- BLO_verify->datacrc = crc32(
- BLO_verify->datacrc, (const Bytef *) data, dataIn);
-
- BLO_verify->streamDone += dataIn;
-
- /* give data to streamGlueRead, it will find out what to do next */
- err = readStreamGlue(
- BLO_verify->endControl,
- &(BLO_verify->streamGlue),
- (unsigned char *) data,
- dataIn);
- }
- return err;
-}
-
-/**
- * openssl verify final call and cleanup
- * @param BLO_verify Pointer to verify control structure
- * @retval streamGlueRead return value
- */
- int
-BLO_verify_end(
- BLO_verifyStructHandle BLO_verifyHandle)
-{
- int err = 0;
- unsigned char *digest;
- static unsigned char rsa_e[] = "\x01\x00\x01";
- RSA *rsa = NULL;
- int verifySuccess;
- struct verifyStructType *BLO_verify =
- (struct verifyStructType *) BLO_verifyHandle;
-
- if (!BLO_verify) {
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETGENERR(BRS_NULL);
- return err;
- }
-
- if (BLO_verify->streamDone == BLO_verify->streamHeader->length +
- SIGNVERIFYHEADERSTRUCTSIZE) {
-#ifndef NDEBUG
- fprintf(GEN_errorstream, "Signed data length is correct\n");
-#endif
- } else {
-#ifndef NDEBUG
- fprintf(GEN_errorstream, "Signed data length is NOT correct\n");
-#endif
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETGENERR(BRS_DATALEN);
- if (BLO_verify->streamGlue) free(BLO_verify->streamGlue);
- if (BLO_verify->streamHeader) free(BLO_verify->streamHeader);
- if (BLO_verify->signerHeader) free(BLO_verify->signerHeader);
- free(BLO_verify);
- return err;
- }
-
- if (BLO_verify->datacrc == BLO_verify->streamHeader->datacrc) {
-#ifndef NDEBUG
- fprintf(GEN_errorstream, "Signed data CRC is correct\n");
-#endif
- } else {
-#ifndef NDEBUG
- fprintf(GEN_errorstream, "Signed data CRC is NOT correct\n");
-#endif
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETGENERR(BRS_CRCDATA);
- if (BLO_verify->streamGlue) free(BLO_verify->streamGlue);
- if (BLO_verify->streamHeader) free(BLO_verify->streamHeader);
- if (BLO_verify->signerHeader) free(BLO_verify->signerHeader);
- free(BLO_verify);
- return err;
- }
-
- digest = malloc(RIPEMD160_DIGEST_LENGTH);
- if (!digest) {
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETGENERR(BRS_MALLOC);
- if (BLO_verify->streamGlue) free(BLO_verify->streamGlue);
- if (BLO_verify->streamHeader) free(BLO_verify->streamHeader);
- if (BLO_verify->signerHeader) free(BLO_verify->signerHeader);
- free(BLO_verify);
- return err;
- }
-
- RIPEMD160_Final(digest, &(BLO_verify->ripemd160_ctx));
-
- rsa = RSA_new();
- if (rsa == NULL) {
-#ifndef NDEBUG
- fprintf(GEN_errorstream, "Error in RSA_new\n");
-#endif
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETSPECERR(BRS_RSANEWERROR);
- free(digest);
- if (BLO_verify->streamGlue) free(BLO_verify->streamGlue);
- if (BLO_verify->streamHeader) free(BLO_verify->streamHeader);
- if (BLO_verify->signerHeader) free(BLO_verify->signerHeader);
- free(BLO_verify);
- return err;
- }
- /* static exponent */
- rsa->e = BN_bin2bn(rsa_e, sizeof(rsa_e)-1, rsa->e);
-
- /* public part into rsa->n */
- rsa->n = BN_bin2bn(BLO_verify->streamHeader->pubKey,
- BLO_verify->streamHeader->pubKeyLen,
- rsa->n);
- /*DEBUG RSA_print_fp(stdout, rsa, 0); */
-
- /* verify the signature */
- verifySuccess = RSA_verify(NID_ripemd160, digest, RIPEMD160_DIGEST_LENGTH,
- BLO_verify->streamHeader->signature,
- BLO_verify->streamHeader->signatureLen, rsa);
- if (verifySuccess == 1) {
-#ifndef NDEBUG
- fprintf(GEN_errorstream,
- "Signature verified\n");
-#endif
- } else {
-#ifndef NDEBUG
- fprintf(GEN_errorstream,
- "Signature INCORRECT\n");
-#endif
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETSPECERR(BRS_SIGFAILED);
- }
-
-/* copy signer information to external struct */
-
- strncpy(g_SignerInfo.name, BLO_verify->signerHeader->name, MAXSIGNERLEN-1);
- strncpy(g_SignerInfo.email, BLO_verify->signerHeader->email, MAXSIGNERLEN-1);
- strncpy(g_SignerInfo.homeUrl, BLO_verify->signerHeader->homeUrl, MAXSIGNERLEN-1);
-
- free(digest);
- free(BLO_verify->streamGlue);
- free(BLO_verify->streamHeader);
- free(BLO_verify->signerHeader);
- free(BLO_verify);
- RSA_free(rsa);
-
- return err;
-}
-
-struct BLO_SignerInfo *BLO_getSignerInfo(){
- return &g_SignerInfo;
-}
-
-int BLO_isValidSignerInfo(struct BLO_SignerInfo *info){
- return info->name[0] != 0;
-}
-
-void BLO_clrSignerInfo(struct BLO_SignerInfo *info)
-{
- info->name[0] = 0;
-}
-
diff --git a/source/blender/verify/intern/Makefile b/source/blender/verify/intern/Makefile
deleted file mode 100644
index 009fd1c6e28..00000000000
--- a/source/blender/verify/intern/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = verify
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_2_C_WARNINGS)
-
-# path to our own external headerfiles
-CPPFLAGS += -I..
-
-# external modules
-CPPFLAGS += -I../../../kernel/gen_messaging
-CPPFLAGS += -I../../readstreamglue
-
-CPPFLAGS += -I$(NAN_OPENSSL)/include
-
-ifeq ($(OS),$(findstring $(OS), "solaris windows"))
- CPPFLAGS += -I$(NAN_ZLIB)/include
-endif
-
diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt
index 1919bf8e571..2be62d5a8b2 100644
--- a/source/blender/windowmanager/CMakeLists.txt
+++ b/source/blender/windowmanager/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-SET(INC
+set(INC
.
../nodes
../gpu
@@ -35,7 +33,6 @@ SET(INC
../makesdna
../makesrna
../blenkernel
- ../include
../imbuf
../blenloader
../editors/include
@@ -50,42 +47,69 @@ SET(INC
${OPENGL_INCLUDE_DIR}
)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+set(SRC
+ intern/wm.c
+ intern/wm_apple.c
+ intern/wm_cursors.c
+ intern/wm_dragdrop.c
+ intern/wm_draw.c
+ intern/wm_event_system.c
+ intern/wm_files.c
+ intern/wm_gesture.c
+ intern/wm_init_exit.c
+ intern/wm_jobs.c
+ intern/wm_keymap.c
+ intern/wm_operators.c
+ intern/wm_subwindow.c
+ intern/wm_window.c
+
+ WM_api.h
+ WM_types.h
+ wm.h
+ wm_cursors.h
+ wm_draw.h
+ wm_event_system.h
+ wm_event_types.h
+ wm_files.h
+ wm_subwindow.h
+ wm_window.h
+)
+
+add_definitions(-DGLEW_STATIC)
-IF(WITH_INTERNATIONAL)
- ADD_DEFINITIONS(-DINTERNATIONAL)
-ENDIF(WITH_INTERNATIONAL)
+if(WITH_INTERNATIONAL)
+ add_definitions(-DINTERNATIONAL)
+endif()
-IF(WITH_OPENCOLLADA)
- ADD_DEFINITIONS(-DWITH_COLLADA)
-ENDIF(WITH_OPENCOLLADA)
+if(WITH_OPENCOLLADA)
+ add_definitions(-DWITH_COLLADA)
+endif()
-IF(WITH_QUICKTIME)
- LIST(APPEND INC ../quicktime ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+if(WITH_CODEC_QUICKTIME)
+ list(APPEND INC ../quicktime ${QUICKTIME_INC})
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-IF(WITH_FFMPEG)
- LIST(APPEND INC ${FFMPEG_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
-ENDIF(WITH_FFMPEG)
+if(WITH_CODEC_FFMPEG)
+ list(APPEND INC ${FFMPEG_INC})
+ add_definitions(-DWITH_FFMPEG)
+endif()
-IF(WITH_PYTHON)
- LIST(APPEND INC ../python ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_PYTHON)
+ list(APPEND INC ../python ${PYTHON_INCLUDE_DIRS})
+ add_definitions(-DWITH_PYTHON)
+endif()
-IF(WIN32)
- LIST(APPEND INC ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_GAMEENGINE)
+ add_definitions(-DWITH_GAMEENGINE)
+endif()
-IF(WITH_COCOA)
- LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/wm_apple.c")
-ENDIF(WITH_COCOA)
+if(WITH_COCOA)
+ list(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/wm_apple.c")
+endif()
-IF(WITH_BUILDINFO)
- ADD_DEFINITIONS(-DNAN_BUILDINFO)
-ENDIF(WITH_BUILDINFO)
+if(WITH_BUILDINFO)
+ add_definitions(-DNAN_BUILDINFO)
+endif()
-BLENDERLIB_NOLIST(bf_windowmanager "${SRC}" "${INC}")
+blender_add_lib_nolist(bf_windowmanager "${SRC}" "${INC}")
diff --git a/source/blender/windowmanager/Makefile b/source/blender/windowmanager/Makefile
deleted file mode 100644
index 1596921b5ee..00000000000
--- a/source/blender/windowmanager/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) Blender Foundation.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/windowmanager
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/windowmanager/SConscript b/source/blender/windowmanager/SConscript
index 51168d7a9d3..cbaf74ddc10 100644
--- a/source/blender/windowmanager/SConscript
+++ b/source/blender/windowmanager/SConscript
@@ -16,8 +16,8 @@ incs += ' #/intern/elbeem #/extern/glew/include'
defs = [ 'GLEW_STATIC' ]
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
+if env['WITH_BF_PYTHON']:
+ defs.append('WITH_PYTHON')
if env['WITH_BF_COLLADA']:
defs.append('WITH_COLLADA')
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 690d8ad0f75..c9d74cbb39d 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -31,6 +31,10 @@
/* dna-savable wmStructs here */
#include "DNA_windowmanager_types.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct bContext;
struct IDProperty;
struct wmEvent;
@@ -52,8 +56,8 @@ typedef struct wmJob wmJob;
/* general API */
void WM_setprefsize (int stax, int stay, int sizx, int sizy);
-void WM_setinitialstate_fullscreen();
-void WM_setinitialstate_normal();
+void WM_setinitialstate_fullscreen(void);
+void WM_setinitialstate_normal(void);
void WM_init (struct bContext *C, int argc, char **argv);
void WM_exit (struct bContext *C);
@@ -77,9 +81,10 @@ void WM_window_open_temp (struct bContext *C, struct rcti *position, int type);
/* files */
-int WM_read_homefile (struct bContext *C, struct wmOperator *op);
+int WM_read_homefile_exec(struct bContext *C, struct wmOperator *op);
+int WM_read_homefile (struct bContext *C, struct ReportList *reports, short from_memory);
int WM_write_homefile (struct bContext *C, struct wmOperator *op);
-void WM_read_file (struct bContext *C, char *name, struct ReportList *reports);
+void WM_read_file (struct bContext *C, const char *name, struct ReportList *reports);
int WM_write_file (struct bContext *C, const char *target, int fileflags, struct ReportList *reports, int copy);
void WM_read_autosavefile(struct bContext *C);
void WM_autosave_init (struct wmWindowManager *wm);
@@ -99,44 +104,44 @@ void WM_paint_cursor_end(struct wmWindowManager *wm, void *handle);
void WM_cursor_warp (struct wmWindow *win, int x, int y);
/* keyconfig and keymap */
-wmKeyConfig *WM_keyconfig_new (struct wmWindowManager *wm, char *idname);
-wmKeyConfig *WM_keyconfig_new_user(struct wmWindowManager *wm, char *idname);
+wmKeyConfig *WM_keyconfig_new (struct wmWindowManager *wm, const char *idname);
+wmKeyConfig *WM_keyconfig_new_user(struct wmWindowManager *wm, const char *idname);
void WM_keyconfig_remove (struct wmWindowManager *wm, struct wmKeyConfig *keyconf);
void WM_keyconfig_free (struct wmKeyConfig *keyconf);
-void WM_keyconfig_userdef(struct wmWindowManager *wm);
+void WM_keyconfig_userdef(void);
void WM_keymap_init (struct bContext *C);
void WM_keymap_free (struct wmKeyMap *keymap);
-wmKeyMapItem *WM_keymap_verify_item(struct wmKeyMap *keymap, char *idname, int type,
+wmKeyMapItem *WM_keymap_verify_item(struct wmKeyMap *keymap, const char *idname, int type,
int val, int modifier, int keymodifier);
-wmKeyMapItem *WM_keymap_add_item(struct wmKeyMap *keymap, char *idname, int type,
+wmKeyMapItem *WM_keymap_add_item(struct wmKeyMap *keymap, const char *idname, int type,
int val, int modifier, int keymodifier);
-wmKeyMapItem *WM_keymap_add_menu(struct wmKeyMap *keymap, char *idname, int type,
+wmKeyMapItem *WM_keymap_add_menu(struct wmKeyMap *keymap, const char *idname, int type,
int val, int modifier, int keymodifier);
-void WM_keymap_remove_item(struct wmKeyMap *keymap, struct wmKeyMapItem *kmi);
+void WM_keymap_remove_item(struct wmKeyMap *keymap, struct wmKeyMapItem *kmi);
char *WM_keymap_item_to_string(wmKeyMapItem *kmi, char *str, int len);
-wmKeyMap *WM_keymap_list_find(ListBase *lb, char *idname, int spaceid, int regionid);
-wmKeyMap *WM_keymap_find(struct wmKeyConfig *keyconf, char *idname, int spaceid, int regionid);
-wmKeyMap *WM_keymap_find_all(const struct bContext *C, char *idname, int spaceid, int regionid);
+wmKeyMap *WM_keymap_list_find(ListBase *lb, const char *idname, int spaceid, int regionid);
+wmKeyMap *WM_keymap_find(struct wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid);
+wmKeyMap *WM_keymap_find_all(const struct bContext *C, const char *idname, int spaceid, int regionid);
wmKeyMap *WM_keymap_active(struct wmWindowManager *wm, struct wmKeyMap *keymap);
-wmKeyMap *WM_keymap_guess_opname(const struct bContext *C, char *opname);
+wmKeyMap *WM_keymap_guess_opname(const struct bContext *C, const char *opname);
int WM_keymap_user_init(struct wmWindowManager *wm, struct wmKeyMap *keymap);
wmKeyMap *WM_keymap_copy_to_user(struct wmKeyMap *keymap);
void WM_keymap_restore_to_default(struct wmKeyMap *keymap);
-void WM_keymap_properties_reset(struct wmKeyMapItem *kmi);
+void WM_keymap_properties_reset(struct wmKeyMapItem *kmi, struct IDProperty *properties);
void WM_keymap_restore_item_to_default(struct bContext *C, struct wmKeyMap *keymap, struct wmKeyMapItem *kmi);
wmKeyMapItem *WM_keymap_item_find_id(struct wmKeyMap *keymap, int id);
int WM_keymap_item_compare(struct wmKeyMapItem *k1, struct wmKeyMapItem *k2);
int WM_userdef_event_map(int kmitype);
-wmKeyMap *WM_modalkeymap_add(struct wmKeyConfig *keyconf, char *idname, struct EnumPropertyItem *items);
-wmKeyMap *WM_modalkeymap_get(struct wmKeyConfig *keyconf, char *idname);
+wmKeyMap *WM_modalkeymap_add(struct wmKeyConfig *keyconf, const char *idname, struct EnumPropertyItem *items);
+wmKeyMap *WM_modalkeymap_get(struct wmKeyConfig *keyconf, const char *idname);
wmKeyMapItem *WM_modalkeymap_add_item(struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value);
-void WM_modalkeymap_assign(struct wmKeyMap *km, char *opname);
+void WM_modalkeymap_assign(struct wmKeyMap *km, const char *opname);
const char *WM_key_event_string(short type);
int WM_key_event_operator_id(const struct bContext *C, const char *opname, int opcontext, struct IDProperty *properties, int hotkey, struct wmKeyMap **keymap_r);
@@ -196,7 +201,7 @@ int WM_operator_props_dialog_popup (struct bContext *C, struct wmOperator *op,
int WM_operator_redo_popup (struct bContext *C, struct wmOperator *op);
int WM_operator_ui_popup (struct bContext *C, struct wmOperator *op, int width, int height);
-int WM_operator_confirm_message(struct bContext *C, struct wmOperator *op, char *message);
+int WM_operator_confirm_message(struct bContext *C, struct wmOperator *op, const char *message);
/* operator api */
void WM_operator_free (struct wmOperator *op);
@@ -209,18 +214,20 @@ void WM_operatortype_append_ptr (void (*opfunc)(struct wmOperatorType*, void *)
void WM_operatortype_append_macro_ptr (void (*opfunc)(struct wmOperatorType*, void *), void *userdata);
int WM_operatortype_remove(const char *idname);
-struct wmOperatorType *WM_operatortype_append_macro(char *idname, char *name, int flag);
+struct wmOperatorType *WM_operatortype_append_macro(const char *idname, const char *name, int flag);
struct wmOperatorTypeMacro *WM_operatortype_macro_define(struct wmOperatorType *ot, const char *idname);
int WM_operator_poll (struct bContext *C, struct wmOperatorType *ot);
+int WM_operator_poll_context(struct bContext *C, struct wmOperatorType *ot, int context);
int WM_operator_call (struct bContext *C, struct wmOperator *op);
int WM_operator_repeat (struct bContext *C, struct wmOperator *op);
-int WM_operator_name_call (struct bContext *C, const char *opstring, int context, struct PointerRNA *properties);
+int WM_operator_repeat_check(const struct bContext *C, struct wmOperator *op);
+int WM_operator_name_call (struct bContext *C, const char *opstring, int context, struct PointerRNA *properties);
int WM_operator_call_py(struct bContext *C, struct wmOperatorType *ot, int context, struct PointerRNA *properties, struct ReportList *reports);
void WM_operator_properties_alloc(struct PointerRNA **ptr, struct IDProperty **properties, const char *opstring); /* used for keymap and macro items */
-void WM_operator_properties_sanitize(struct PointerRNA *ptr, int val); /* make props context sensitive or not */
+void WM_operator_properties_sanitize(struct PointerRNA *ptr, const short no_context); /* make props context sensitive or not */
void WM_operator_properties_create(struct PointerRNA *ptr, const char *opstring);
void WM_operator_properties_create_ptr(struct PointerRNA *ptr, struct wmOperatorType *ot);
void WM_operator_properties_free(struct PointerRNA *ptr);
@@ -291,7 +298,7 @@ void WM_event_drag_image(struct wmDrag *, struct ImBuf *, float scale, int sx
struct wmDropBox *WM_dropbox_add(ListBase *lb, const char *idname, int (*poll)(struct bContext *, struct wmDrag *, struct wmEvent *event),
void (*copy)(struct wmDrag *, struct wmDropBox *));
-ListBase *WM_dropboxmap_find(char *idname, int spaceid, int regionid);
+ListBase *WM_dropboxmap_find(const char *idname, int spaceid, int regionid);
/* Set a subwindow active in pixelspace view, with optional scissor subset */
void wmSubWindowSet (struct wmWindow *win, int swinid);
@@ -310,8 +317,9 @@ int WM_framebuffer_to_index(unsigned int col);
#define WM_JOB_PRIORITY 1
#define WM_JOB_EXCL_RENDER 2
#define WM_JOB_PROGRESS 4
+#define WM_JOB_SUSPEND 8
-struct wmJob *WM_jobs_get(struct wmWindowManager *wm, struct wmWindow *win, void *owner, char *name, int flag);
+struct wmJob *WM_jobs_get(struct wmWindowManager *wm, struct wmWindow *win, void *owner, const char *name, int flag);
int WM_jobs_test(struct wmWindowManager *wm, void *owner);
float WM_jobs_progress(struct wmWindowManager *wm, void *owner);
@@ -327,7 +335,7 @@ void WM_jobs_callbacks(struct wmJob *,
void WM_jobs_start(struct wmWindowManager *wm, struct wmJob *);
void WM_jobs_stop(struct wmWindowManager *wm, void *owner, void *startjob);
-void WM_jobs_kill(struct wmWindowManager *wm, void *owner, void *startjob);
+void WM_jobs_kill(struct wmWindowManager *wm, void *owner, void (*)(void *, short int *, short int *, float *));
void WM_jobs_stop_all(struct wmWindowManager *wm);
/* clipboard */
@@ -338,5 +346,14 @@ void WM_clipboard_text_set(char *buf, int selection);
void WM_progress_set(struct wmWindow *win, float progress);
void WM_progress_clear(struct wmWindow *win);
+#ifdef WIN32
+ /* Windows System Console */
+void WM_toggle_console(struct bContext *C, short show);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
#endif /* WM_API_H */
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index 3f67888a4e9..8590534df30 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -28,6 +28,10 @@
#ifndef WM_TYPES_H
#define WM_TYPES_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct bContext;
struct wmEvent;
struct wmWindowManager;
@@ -51,6 +55,7 @@ struct ImBuf;
#define OPTYPE_BLOCKING 4 /* let blender grab all input from the WM (X11) */
#define OPTYPE_MACRO 8
#define OPTYPE_GRAB_POINTER 16 /* */
+#define OPTYPE_PRESET 32 /* show preset menu */
/* context to call operator in for WM_operator_name_call */
/* rna_ui.c contains EnumPropertyItem's of these, keep in sync */
@@ -167,6 +172,8 @@ typedef struct wmNotifier {
#define ND_ANIMPLAY (4<<16)
#define ND_GPENCIL (5<<16)
#define ND_EDITOR_CHANGED (6<<16) /*sent to new editors after switching to them*/
+#define ND_SCREENSET (7<<16)
+#define ND_SKETCH (8<<16)
/* NC_SCENE Scene */
#define ND_SCENEBROWSE (1<<16)
@@ -178,28 +185,31 @@ typedef struct wmNotifier {
#define ND_OB_ACTIVE (7<<16)
#define ND_OB_SELECT (8<<16)
#define ND_OB_VISIBLE (9<<16)
-#define ND_MODE (10<<16)
-#define ND_RENDER_RESULT (11<<16)
-#define ND_COMPO_RESULT (12<<16)
-#define ND_KEYINGSET (13<<16)
-#define ND_TOOLSETTINGS (14<<16)
-#define ND_LAYER (15<<16)
-#define ND_FRAME_RANGE (16<<16)
+#define ND_OB_RENDER (10<<16)
+#define ND_MODE (11<<16)
+#define ND_RENDER_RESULT (12<<16)
+#define ND_COMPO_RESULT (13<<16)
+#define ND_KEYINGSET (14<<16)
+#define ND_TOOLSETTINGS (15<<16)
+#define ND_LAYER (16<<16)
+#define ND_FRAME_RANGE (17<<16)
+#define ND_TRANSFORM_DONE (18<<16)
+#define ND_WORLD (92<<16)
#define ND_LAYER_CONTENT (101<<16)
/* NC_OBJECT Object */
-#define ND_TRANSFORM (17<<16)
-#define ND_OB_SHADING (18<<16)
-#define ND_POSE (19<<16)
-#define ND_BONE_ACTIVE (20<<16)
-#define ND_BONE_SELECT (21<<16)
-#define ND_DRAW (22<<16)
-#define ND_MODIFIER (23<<16)
-#define ND_KEYS (24<<16)
-#define ND_CONSTRAINT (25<<16)
-#define ND_PARTICLE (26<<16)
-#define ND_POINTCACHE (27<<16)
-#define ND_PARENT (28<<16)
+#define ND_TRANSFORM (18<<16)
+#define ND_OB_SHADING (19<<16)
+#define ND_POSE (20<<16)
+#define ND_BONE_ACTIVE (21<<16)
+#define ND_BONE_SELECT (22<<16)
+#define ND_DRAW (23<<16)
+#define ND_MODIFIER (24<<16)
+#define ND_KEYS (25<<16)
+#define ND_CONSTRAINT (26<<16)
+#define ND_PARTICLE (27<<16)
+#define ND_POINTCACHE (28<<16)
+#define ND_PARENT (29<<16)
/* NC_MATERIAL Material */
#define ND_SHADING (30<<16)
@@ -212,6 +222,7 @@ typedef struct wmNotifier {
/* NC_WORLD World */
#define ND_WORLD_DRAW (45<<16)
+#define ND_WORLD_STARS (46<<16)
/* NC_TEXT Text */
#define ND_CURSOR (50<<16)
@@ -234,23 +245,23 @@ typedef struct wmNotifier {
/* NC_SPACE */
#define ND_SPACE_CONSOLE (1<<16) /* general redraw */
-#define ND_SPACE_CONSOLE_REPORT (2<<16) /* update for reports, could specify type */
-#define ND_SPACE_INFO (2<<16)
-#define ND_SPACE_IMAGE (3<<16)
-#define ND_SPACE_FILE_PARAMS (4<<16)
-#define ND_SPACE_FILE_LIST (5<<16)
-#define ND_SPACE_NODE (6<<16)
-#define ND_SPACE_OUTLINER (7<<16)
-#define ND_SPACE_VIEW3D (8<<16)
-#define ND_SPACE_PROPERTIES (9<<16)
-#define ND_SPACE_TEXT (10<<16)
-#define ND_SPACE_TIME (11<<16)
-#define ND_SPACE_GRAPH (12<<16)
-#define ND_SPACE_DOPESHEET (13<<16)
-#define ND_SPACE_NLA (14<<16)
-#define ND_SPACE_SEQUENCER (15<<16)
-#define ND_SPACE_NODE_VIEW (16<<16)
-#define ND_SPACE_CHANGED (17<<16) /*sent to a new editor type after it's replaced an old one*/
+#define ND_SPACE_INFO_REPORT (2<<16) /* update for reports, could specify type */
+#define ND_SPACE_INFO (3<<16)
+#define ND_SPACE_IMAGE (4<<16)
+#define ND_SPACE_FILE_PARAMS (5<<16)
+#define ND_SPACE_FILE_LIST (6<<16)
+#define ND_SPACE_NODE (7<<16)
+#define ND_SPACE_OUTLINER (8<<16)
+#define ND_SPACE_VIEW3D (9<<16)
+#define ND_SPACE_PROPERTIES (10<<16)
+#define ND_SPACE_TEXT (11<<16)
+#define ND_SPACE_TIME (12<<16)
+#define ND_SPACE_GRAPH (13<<16)
+#define ND_SPACE_DOPESHEET (14<<16)
+#define ND_SPACE_NLA (15<<16)
+#define ND_SPACE_SEQUENCER (16<<16)
+#define ND_SPACE_NODE_VIEW (17<<16)
+#define ND_SPACE_CHANGED (18<<16) /*sent to a new editor type after it's replaced an old one*/
/* subtype, 256 entries too */
#define NOTE_SUBTYPE 0x0000FF00
@@ -378,9 +389,9 @@ typedef struct wmTimer {
typedef struct wmOperatorType {
struct wmOperatorType *next, *prev;
- char *name; /* text for ui, undo */
- char *idname; /* unique identifier */
- char *description; /* tooltips and python docs */
+ const char *name; /* text for ui, undo */
+ const char *idname; /* unique identifier */
+ const char *description; /* tooltips and python docs */
/* this callback executes the operator without any interactive input,
* parameters may be provided through operator properties. cannot use
@@ -452,9 +463,9 @@ enum {
typedef struct wmReport {
struct wmReport *next, *prev;
- int type;
const char *typestr;
char *message;
+ int type;
} wmReport;
/* *************** Drag and drop *************** */
@@ -472,14 +483,14 @@ typedef struct wmDrag {
int icon, type; /* type, see WM_DRAG defines above */
void *poin;
- char path[FILE_MAX];
+ char path[240]; /* FILE_MAX */
double value;
struct ImBuf *imb; /* if no icon but imbuf should be drawn around cursor */
float scale;
short sx, sy;
- char opname[FILE_MAX]; /* if set, draws operator name*/
+ char opname[240]; /* FILE_MAX */ /* if set, draws operator name*/
} wmDrag;
/* dropboxes are like keymaps, part of the screen/area/region definition */
@@ -495,7 +506,8 @@ typedef struct wmDropBox {
/* if poll survives, operator is called */
wmOperatorType *ot; /* not saved in file, so can be pointer */
-
+ short opcontext; /* default invoke */
+
struct IDProperty *properties; /* operator properties, assigned to ptr->data and can be written to a file */
struct PointerRNA *ptr; /* rna pointer to access properties */
@@ -509,5 +521,9 @@ typedef struct RecentFile {
} RecentFile;
+#ifdef __cplusplus
+}
+#endif
+
#endif /* WM_TYPES_H */
diff --git a/source/blender/windowmanager/intern/Makefile b/source/blender/windowmanager/intern/Makefile
deleted file mode 100644
index 60be5fed4b2..00000000000
--- a/source/blender/windowmanager/intern/Makefile
+++ /dev/null
@@ -1,98 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = windowmanager
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# OpenGL and Python
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += $(OGL_CPPFLAGS)
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-# PreProcessor stuff
-
-CPPFLAGS += -I$(NAN_GHOST)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-CPPFLAGS += $(NAN_SDLCFLAGS)
-
-# modules
-CPPFLAGS += -I../../editors/include
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../nodes
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-CPPFLAGS += -I../../../kernel/gen_system
-CPPFLAGS += -I../../blenfont
-
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_MEMUTIL)/include
-
-ifeq ($(INTERNATIONAL), true)
- CPPFLAGS += -DINTERNATIONAL
-endif
-
-ifeq ($(WITH_QUICKTIME),true)
- CPPFLAGS += -I../quicktime
- CPPFLAGS += -DWITH_QUICKTIME
-endif
-
-ifeq ($(WITH_OPENCOLLADA), true)
- CPPFLAGS += -DWITH_COLLADA
-endif
-
-ifeq ($(NAN_BUILDINFO), true)
- CPPFLAGS += -DNAN_BUILDINFO
-endif
-
-ifeq ($(OS),linux)
- ifeq ($(CPU),alpha)
- CPPFLAGS += -I$(NAN_MESA)/include
- endif
- ifeq ($(CPU),i386)
- CPPFLAGS += -I$(NAN_MESA)/include
- endif
- ifeq ($(CPU),powerpc)
- CPPFLAGS += -I/usr/src/MesaCVS/include
- endif
-endif
-
-# path to our own headerfiles
-CPPFLAGS += -I..
diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c
index 148932fa941..fa4ff7a7b9b 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -58,7 +58,7 @@
#include "ED_screen.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -69,7 +69,7 @@
void WM_operator_free(wmOperator *op)
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if(op->py_instance) {
/* do this first incase there are any __del__ functions or
* similar that use properties */
@@ -127,7 +127,7 @@ void wm_operator_register(bContext *C, wmOperator *op)
}
/* so the console is redrawn */
- WM_event_add_notifier(C, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL);
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_INFO_REPORT, NULL);
WM_event_add_notifier(C, NC_WM|ND_HISTORY, NULL);
}
@@ -205,7 +205,7 @@ void WM_keymap_init(bContext *C)
/* create default key config */
wm_window_keymap(wm->defaultconf);
ED_spacetypes_keymap(wm->defaultconf);
- WM_keyconfig_userdef(wm);
+ WM_keyconfig_userdef();
wm->initialized |= WM_INIT_KEYMAP;
}
@@ -232,12 +232,13 @@ void WM_check(bContext *C)
/* case: no open windows at all, for old file reads */
wm_window_add_ghostwindows(C, wm);
+ }
- /* case: fileread */
- if((wm->initialized & WM_INIT_WINDOW) == 0) {
- ED_screens_initialize(wm);
- wm->initialized |= WM_INIT_WINDOW;
- }
+ /* case: fileread */
+ /* note: this runs in bg mode to set the screen context cb */
+ if((wm->initialized & WM_INIT_WINDOW) == 0) {
+ ED_screens_initialize(wm);
+ wm->initialized |= WM_INIT_WINDOW;
}
}
@@ -274,7 +275,7 @@ void wm_add_default(bContext *C)
win= wm_window_new(C);
win->screen= screen;
screen->winid= win->winid;
- BLI_strncpy(win->screenname, screen->id.name+2, 21);
+ BLI_strncpy(win->screenname, screen->id.name+2, sizeof(win->screenname));
wm->winactive= win;
wm->file_saved= 1;
diff --git a/source/blender/windowmanager/intern/wm_cursors.c b/source/blender/windowmanager/intern/wm_cursors.c
index 1803a1cee91..f0a416e1c6e 100644
--- a/source/blender/windowmanager/intern/wm_cursors.c
+++ b/source/blender/windowmanager/intern/wm_cursors.c
@@ -116,6 +116,9 @@ void WM_cursor_set(wmWindow *win, int curs)
GHOST_SetCursorVisibility(win->ghostwin, 1);
+ if(curs == CURSOR_STD && win->modalcursor)
+ curs= win->modalcursor;
+
win->cursor= curs;
/* detect if we use system cursor or Blender cursor */
@@ -139,14 +142,15 @@ void WM_cursor_set(wmWindow *win, int curs)
void WM_cursor_modal(wmWindow *win, int val)
{
- if(win->lastcursor == 0) {
+ if(win->lastcursor == 0)
win->lastcursor = win->cursor;
- WM_cursor_set(win, val);
- }
+ win->modalcursor = val;
+ WM_cursor_set(win, val);
}
void WM_cursor_restore(wmWindow *win)
{
+ win->modalcursor = 0;
if(win->lastcursor)
WM_cursor_set(win, win->lastcursor);
win->lastcursor = 0;
@@ -155,14 +159,16 @@ void WM_cursor_restore(wmWindow *win)
/* to allow usage all over, we do entire WM */
void WM_cursor_wait(int val)
{
- wmWindowManager *wm= G.main->wm.first;
- wmWindow *win= wm->windows.first;
-
- for(; win; win= win->next) {
- if(val) {
- WM_cursor_modal(win, CURSOR_WAIT);
- } else {
- WM_cursor_restore(win);
+ if(!G.background) {
+ wmWindowManager *wm= G.main->wm.first;
+ wmWindow *win= wm?wm->windows.first:NULL;
+
+ for(; win; win= win->next) {
+ if(val) {
+ WM_cursor_modal(win, BC_WAITCURSOR);
+ } else {
+ WM_cursor_restore(win);
+ }
}
}
}
@@ -217,13 +223,12 @@ void WM_timecursor(wmWindow *win, int nr)
{0, 56, 68, 68, 120, 64, 68, 56}
};
unsigned char mask[16][2];
- unsigned char bitmap[16][2];
+ unsigned char bitmap[16][2]= {{0}};
int i, idx;
if(win->lastcursor == 0)
win->lastcursor= win->cursor;
- memset(&bitmap, 0x00, sizeof(bitmap));
memset(&mask, 0xFF, sizeof(mask));
/* print number bottom right justified */
diff --git a/source/blender/windowmanager/intern/wm_dragdrop.c b/source/blender/windowmanager/intern/wm_dragdrop.c
index 18b1e7239ed..a19499b3464 100644
--- a/source/blender/windowmanager/intern/wm_dragdrop.c
+++ b/source/blender/windowmanager/intern/wm_dragdrop.c
@@ -75,7 +75,8 @@ typedef struct wmDropBoxMap {
} wmDropBoxMap;
-ListBase *WM_dropboxmap_find(char *idname, int spaceid, int regionid)
+/* spaceid/regionid is zero for window drop maps */
+ListBase *WM_dropboxmap_find(const char *idname, int spaceid, int regionid)
{
wmDropBoxMap *dm;
@@ -103,6 +104,7 @@ wmDropBox *WM_dropbox_add(ListBase *lb, const char *idname, int (*poll)(bContext
drop->poll= poll;
drop->copy= copy;
drop->ot= WM_operatortype_find(idname, 0);
+ drop->opcontext= WM_OP_INVOKE_DEFAULT;
if(drop->ot==NULL) {
MEM_freeN(drop);
@@ -167,7 +169,7 @@ void WM_event_drag_image(wmDrag *drag, ImBuf *imb, float scale, int sx, int sy)
}
-static char *dropbox_active(bContext *C, ListBase *handlers, wmDrag *drag, wmEvent *event)
+static const char *dropbox_active(bContext *C, ListBase *handlers, wmDrag *drag, wmEvent *event)
{
wmEventHandler *handler= handlers->first;
for(; handler; handler= handler->next) {
@@ -183,12 +185,12 @@ static char *dropbox_active(bContext *C, ListBase *handlers, wmDrag *drag, wmEve
}
/* return active operator name when mouse is in box */
-static char *wm_dropbox_active(bContext *C, wmDrag *drag, wmEvent *event)
+static const char *wm_dropbox_active(bContext *C, wmDrag *drag, wmEvent *event)
{
wmWindow *win= CTX_wm_window(C);
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C);
- char *name;
+ const char *name;
name= dropbox_active(C, &win->handlers, drag, event);
if(name) return name;
@@ -218,7 +220,7 @@ static void wm_drop_operator_options(bContext *C, wmDrag *drag, wmEvent *event)
strcpy(drag->opname, "Paste name");
}
else {
- char *opname= wm_dropbox_active(C, drag, event);
+ const char *opname= wm_dropbox_active(C, drag, event);
if(opname) {
BLI_strncpy(drag->opname, opname, FILE_MAX);
@@ -256,7 +258,7 @@ static void wm_drop_operator_draw(char *name, int x, int y)
UI_DrawString(x+4, y+4, name);
}
-static char *wm_drag_name(wmDrag *drag)
+static const char *wm_drag_name(wmDrag *drag)
{
switch(drag->type) {
case WM_DRAG_ID:
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index 81417e8f8f1..6bdb45c3220 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -39,10 +39,11 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
+
#include "GHOST_C-api.h"
@@ -79,13 +80,13 @@ static void wm_paintcursor_draw(bContext *C, ARegion *ar)
if(screen->subwinactive == ar->swinid) {
for(pc= wm->paintcursors.first; pc; pc= pc->next) {
if(pc->poll == NULL || pc->poll(C)) {
- ARegion *ar= CTX_wm_region(C);
+ ARegion *ar_other= CTX_wm_region(C);
if (ELEM(win->grabcursor, GHOST_kGrabWrap, GHOST_kGrabHide)) {
int x = 0, y = 0;
wm_get_cursor_position(win, &x, &y);
- pc->draw(C, x - ar->winrct.xmin, y - ar->winrct.ymin, pc->customdata);
+ pc->draw(C, x - ar_other->winrct.xmin, y - ar_other->winrct.ymin, pc->customdata);
} else {
- pc->draw(C, win->eventstate->x - ar->winrct.xmin, win->eventstate->y - ar->winrct.ymin, pc->customdata);
+ pc->draw(C, win->eventstate->x - ar_other->winrct.xmin, win->eventstate->y - ar_other->winrct.ymin, pc->customdata);
}
}
}
@@ -127,7 +128,7 @@ static void wm_method_draw_full(bContext *C, wmWindow *win)
CTX_wm_region_set(C, ar);
ED_region_do_draw(C, ar);
wm_paintcursor_draw(C, ar);
- ED_area_overdraw_flush(C, sa, ar);
+ ED_area_overdraw_flush(sa, ar);
CTX_wm_region_set(C, NULL);
}
}
@@ -242,7 +243,7 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange)
CTX_wm_region_set(C, ar);
ED_region_do_draw(C, ar);
wm_paintcursor_draw(C, ar);
- ED_area_overdraw_flush(C, sa, ar);
+ ED_area_overdraw_flush(sa, ar);
CTX_wm_region_set(C, NULL);
if(exchange)
@@ -253,11 +254,10 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange)
CTX_wm_region_set(C, ar);
ED_region_do_draw(C, ar);
wm_paintcursor_draw(C, ar);
- ED_area_overdraw_flush(C, sa, ar);
+ ED_area_overdraw_flush(sa, ar);
CTX_wm_region_set(C, NULL);
ar->swap= WIN_BOTH_OK;
- printf("draws swap exchange %d\n", ar->swinid);
}
else if(ar->swap == WIN_BACK_OK)
ar->swap= WIN_FRONT_OK;
@@ -569,8 +569,6 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win)
wmSubWindowSet(win, screen->mainwin);
wm_triple_draw_textures(win, win->drawdata);
-
- triple= win->drawdata;
}
else {
win->drawdata= MEM_callocN(sizeof(wmDrawTriple), "wmDrawTriple");
@@ -592,7 +590,7 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win)
if(ar->swinid && ar->do_draw) {
CTX_wm_region_set(C, ar);
ED_region_do_draw(C, ar);
- ED_area_overdraw_flush(C, sa, ar);
+ ED_area_overdraw_flush(sa, ar);
CTX_wm_region_set(C, NULL);
copytex= 1;
}
@@ -621,7 +619,8 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win)
}
}
- if(screen->do_draw_gesture)
+ /* always draw, not only when screen tagged */
+ if(win->gesture.first)
wm_gesture_draw(win);
if(wm->paintcursors.first) {
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 45c56164a30..3c312a0c2b3 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -41,6 +41,7 @@
#include "GHOST_C-api.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_blender.h"
#include "BKE_context.h"
@@ -50,12 +51,13 @@
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
+
#include "BKE_sound.h"
#include "ED_fileselect.h"
#include "ED_info.h"
#include "ED_screen.h"
+#include "ED_view3d.h"
#include "ED_util.h"
#include "RNA_access.h"
@@ -72,6 +74,8 @@
#include "wm_event_types.h"
#include "wm_draw.h"
+static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, PointerRNA *properties, ReportList *reports, short context, short poll_only);
+
/* ************ event management ************** */
void wm_event_add(wmWindow *win, wmEvent *event_to_add)
@@ -241,15 +245,13 @@ void wm_event_do_notifiers(bContext *C)
if(!G.rendering) {
/* depsgraph gets called, might send more notifiers */
- ED_update_for_newframe(C, 1);
+ ED_update_for_newframe(CTX_data_main(C), win->screen->scene, win->screen, 1);
}
}
}
/* the notifiers are sent without context, to keep it clean */
while( (note=wm_notifier_next(wm)) ) {
- wmWindow *win;
-
for(win= wm->windows.first; win; win= win->next) {
/* filter out notifiers */
@@ -294,14 +296,25 @@ void wm_event_do_notifiers(bContext *C)
}
/* XXX make lock in future, or separated derivedmesh users in scene */
- if(!G.rendering)
+ if(!G.rendering) {
/* depsgraph & animation: update tagged datablocks */
+
+ /* copied to set's in scene_update_tagged_recursive() */
+ win->screen->scene->customdata_mask= ED_viewedit_datamask(win->screen);
+
scene_update_tagged(CTX_data_main(C), win->screen->scene);
+ }
}
CTX_wm_window_set(C, NULL);
}
+static int wm_event_always_pass(wmEvent *event)
+{
+ /* some events we always pass on, to ensure proper communication */
+ return ISTIMER(event->type) || (event->type == WINDEACTIVATE);
+}
+
/* ********************* ui handler ******************* */
static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, wmEvent *event, int always_pass)
@@ -309,8 +322,19 @@ static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, wmEvent *eve
ScrArea *area= CTX_wm_area(C);
ARegion *region= CTX_wm_region(C);
ARegion *menu= CTX_wm_menu(C);
+ static int do_wheel_ui= 1;
+ int is_wheel= ELEM(event->type, WHEELUPMOUSE, WHEELDOWNMOUSE);
int retval;
-
+
+ /* UI is quite agressive with swallowing events, like scrollwheel */
+ /* I realize this is not extremely nice code... when UI gets keymaps it can be maybe smarter */
+ if(do_wheel_ui==0) {
+ if(is_wheel)
+ return WM_HANDLER_CONTINUE;
+ else if(wm_event_always_pass(event)==0)
+ do_wheel_ui= 1;
+ }
+
/* we set context to where ui handler came from */
if(handler->ui_area) CTX_wm_area_set(C, handler->ui_area);
if(handler->ui_region) CTX_wm_region_set(C, handler->ui_region);
@@ -330,10 +354,14 @@ static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, wmEvent *eve
CTX_wm_region_set(C, NULL);
CTX_wm_menu_set(C, NULL);
}
-
+
if(retval == WM_UI_HANDLER_BREAK)
return WM_HANDLER_BREAK;
-
+
+ /* event not handled in UI, if wheel then we temporarily disable it */
+ if(is_wheel)
+ do_wheel_ui= 0;
+
return WM_HANDLER_CONTINUE;
}
@@ -364,9 +392,9 @@ int WM_operator_poll(bContext *C, wmOperatorType *ot)
wmOperatorTypeMacro *otmacro;
for(otmacro= ot->macro.first; otmacro; otmacro= otmacro->next) {
- wmOperatorType *ot= WM_operatortype_find(otmacro->idname, 0);
+ wmOperatorType *ot_macro= WM_operatortype_find(otmacro->idname, 0);
- if(0==WM_operator_poll(C, ot))
+ if(0==WM_operator_poll(C, ot_macro))
return 0;
}
@@ -379,49 +407,55 @@ int WM_operator_poll(bContext *C, wmOperatorType *ot)
return 1;
}
-static void wm_operator_print(wmOperator *op)
+/* sets up the new context and calls 'wm_operator_invoke()' with poll_only */
+int WM_operator_poll_context(bContext *C, wmOperatorType *ot, int context)
+{
+ return wm_operator_call_internal(C, ot, NULL, NULL, context, TRUE);
+}
+
+static void wm_operator_print(bContext *C, wmOperator *op)
{
- char *buf = WM_operator_pystring(NULL, op->type, op->ptr, 1);
+ /* context is needed for enum function */
+ char *buf = WM_operator_pystring(C, op->type, op->ptr, 1);
printf("%s\n", buf);
MEM_freeN(buf);
}
static void wm_operator_reports(bContext *C, wmOperator *op, int retval, int popup)
{
- wmWindowManager *wm = CTX_wm_manager(C);
- ReportList *reports = CTX_wm_reports(C);
- char *buf;
-
if(popup)
if(op->reports->list.first)
uiPupMenuReports(C, op->reports);
if(retval & OPERATOR_FINISHED) {
if(G.f & G_DEBUG)
- wm_operator_print(op); /* todo - this print may double up, might want to check more flags then the FINISHED */
+ wm_operator_print(C, op); /* todo - this print may double up, might want to check more flags then the FINISHED */
if (op->type->flag & OPTYPE_REGISTER) {
/* Report the python string representation of the operator */
- buf = WM_operator_pystring(C, op->type, op->ptr, 1);
+ char *buf = WM_operator_pystring(C, op->type, op->ptr, 1);
BKE_report(CTX_wm_reports(C), RPT_OPERATOR, buf);
MEM_freeN(buf);
}
}
if (op->reports->list.first) {
+
+ wmWindowManager *wm = CTX_wm_manager(C);
+ ReportList *wm_reports= CTX_wm_reports(C);
ReportTimerInfo *rti;
-
+
/* add reports to the global list, otherwise they are not seen */
- addlisttolist(&CTX_wm_reports(C)->list, &op->reports->list);
+ BLI_movelisttolist(&wm_reports->list, &op->reports->list);
/* After adding reports to the global list, reset the report timer. */
- WM_event_remove_timer(wm, NULL, reports->reporttimer);
+ WM_event_remove_timer(wm, NULL, wm_reports->reporttimer);
/* Records time since last report was added */
- reports->reporttimer= WM_event_add_timer(wm, CTX_wm_window(C), TIMER, 0.02);
+ wm_reports->reporttimer= WM_event_add_timer(wm, CTX_wm_window(C), TIMER, 0.05);
rti = MEM_callocN(sizeof(ReportTimerInfo), "ReportTimerInfo");
- reports->reporttimer->customdata = rti;
+ wm_reports->reporttimer->customdata = rti;
}
}
@@ -430,7 +464,7 @@ static void wm_operator_reports(bContext *C, wmOperator *op, int retval, int pop
*/
static int wm_operator_register_check(wmWindowManager *wm, wmOperatorType *ot)
{
- return (wm->op_undo_depth == 0) && (ot->flag & OPTYPE_REGISTER);
+ return wm && (wm->op_undo_depth == 0) && (ot->flag & OPTYPE_REGISTER);
}
static void wm_operator_finished(bContext *C, wmOperator *op, int repeat)
@@ -466,6 +500,8 @@ static int wm_operator_exec(bContext *C, wmOperator *op, int repeat)
wmWindowManager *wm= CTX_wm_manager(C);
int retval= OPERATOR_CANCELLED;
+ CTX_wm_operator_poll_msg_set(C, NULL);
+
if(op==NULL || op->type==NULL)
return retval;
@@ -505,6 +541,14 @@ int WM_operator_repeat(bContext *C, wmOperator *op)
{
return wm_operator_exec(C, op, 1);
}
+/* TRUE if WM_operator_repeat can run
+ * simple check for now but may become more involved.
+ * To be sure the operator can run call WM_operator_poll(C, op->type) also, since this call
+ * checks if WM_operator_repeat() can run at all, not that it WILL run at any time. */
+int WM_operator_repeat_check(const bContext *UNUSED(C), wmOperator *op)
+{
+ return op->type->exec != NULL;
+}
static wmOperator *wm_operator_create(wmWindowManager *wm, wmOperatorType *ot, PointerRNA *properties, ReportList *reports)
{
@@ -601,11 +645,15 @@ static void wm_region_mouse_co(bContext *C, wmEvent *event)
}
}
-int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerRNA *properties, ReportList *reports)
+int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerRNA *properties, ReportList *reports, short poll_only)
{
wmWindowManager *wm= CTX_wm_manager(C);
int retval= OPERATOR_PASS_THROUGH;
+ /* this is done because complicated setup is done to call this function that is better not duplicated */
+ if(poll_only)
+ return WM_operator_poll(C, ot);
+
if(WM_operator_poll(C, ot)) {
wmOperator *op= wm_operator_create(wm, ot, properties, reports); /* if reports==NULL, theyll be initialized */
@@ -662,12 +710,22 @@ int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerR
}
if(wrap) {
+ rcti *winrect= NULL;
ARegion *ar= CTX_wm_region(C);
- if(ar) {
- bounds[0]= ar->winrct.xmin;
- bounds[1]= ar->winrct.ymax;
- bounds[2]= ar->winrct.xmax;
- bounds[3]= ar->winrct.ymin;
+ ScrArea *sa= CTX_wm_area(C);
+
+ if(ar && ar->regiontype == RGN_TYPE_WINDOW && event && BLI_in_rcti(&ar->winrct, event->x, event->y)) {
+ winrect= &ar->winrct;
+ }
+ else if(sa) {
+ winrect= &sa->totrct;
+ }
+
+ if(winrect) {
+ bounds[0]= winrect->xmin;
+ bounds[1]= winrect->ymax;
+ bounds[2]= winrect->xmax;
+ bounds[3]= winrect->ymin;
}
}
@@ -691,13 +749,15 @@ int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerR
* this is for python to access since its done the operator lookup
*
* invokes operator in context */
-static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, int context, PointerRNA *properties, ReportList *reports)
+static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, PointerRNA *properties, ReportList *reports, short context, short poll_only)
{
wmWindow *window= CTX_wm_window(C);
wmEvent *event;
int retval;
+ CTX_wm_operator_poll_msg_set(C, NULL);
+
/* dummie test */
if(ot && C) {
switch(context) {
@@ -735,6 +795,7 @@ static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, int contex
case WM_OP_EXEC_REGION_CHANNELS:
case WM_OP_INVOKE_REGION_CHANNELS:
type = RGN_TYPE_CHANNELS;
+ break;
case WM_OP_EXEC_REGION_PREVIEW:
case WM_OP_INVOKE_REGION_PREVIEW:
@@ -754,7 +815,7 @@ static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, int contex
CTX_wm_region_set(C, ar1);
}
- retval= wm_operator_invoke(C, ot, event, properties, reports);
+ retval= wm_operator_invoke(C, ot, event, properties, reports, poll_only);
/* set region back */
CTX_wm_region_set(C, ar);
@@ -768,7 +829,7 @@ static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, int contex
ARegion *ar= CTX_wm_region(C);
CTX_wm_region_set(C, NULL);
- retval= wm_operator_invoke(C, ot, event, properties, reports);
+ retval= wm_operator_invoke(C, ot, event, properties, reports, poll_only);
CTX_wm_region_set(C, ar);
return retval;
@@ -782,7 +843,7 @@ static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, int contex
CTX_wm_region_set(C, NULL);
CTX_wm_area_set(C, NULL);
- retval= wm_operator_invoke(C, ot, event, properties, reports);
+ retval= wm_operator_invoke(C, ot, event, properties, reports, poll_only);
CTX_wm_region_set(C, ar);
CTX_wm_area_set(C, area);
@@ -790,7 +851,7 @@ static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, int contex
}
case WM_OP_EXEC_DEFAULT:
case WM_OP_INVOKE_DEFAULT:
- return wm_operator_invoke(C, ot, event, properties, reports);
+ return wm_operator_invoke(C, ot, event, properties, reports, poll_only);
}
}
@@ -803,7 +864,7 @@ int WM_operator_name_call(bContext *C, const char *opstring, int context, Pointe
{
wmOperatorType *ot= WM_operatortype_find(opstring, 0);
if(ot)
- return wm_operator_call_internal(C, ot, context, properties, NULL);
+ return wm_operator_call_internal(C, ot, properties, NULL, context, FALSE);
return 0;
}
@@ -815,7 +876,6 @@ int WM_operator_name_call(bContext *C, const char *opstring, int context, Pointe
*/
int WM_operator_call_py(bContext *C, wmOperatorType *ot, int context, PointerRNA *properties, ReportList *reports)
{
- wmWindowManager *wm= CTX_wm_manager(C);
int retval= OPERATOR_CANCELLED;
#if 0
@@ -835,11 +895,11 @@ int WM_operator_call_py(bContext *C, wmOperatorType *ot, int context, PointerRNA
printf("error \"%s\" operator has no exec function, python cannot call it\n", op->type->name);
#endif
- retval= wm_operator_call_internal(C, ot, context, properties, reports);
+ retval= wm_operator_call_internal(C, ot, properties, reports, context, FALSE);
/* keep the reports around if needed later */
if ( (retval & OPERATOR_RUNNING_MODAL) ||
- ((retval & OPERATOR_FINISHED) && wm_operator_register_check(wm, ot))
+ ((retval & OPERATOR_FINISHED) && wm_operator_register_check(CTX_wm_manager(C), ot))
) {
reports->flag |= RPT_FREE; /* let blender manage freeing */
}
@@ -1067,11 +1127,6 @@ static int wm_eventmatch(wmEvent *winevent, wmKeyMapItem *kmi)
return 1;
}
-static int wm_event_always_pass(wmEvent *event)
-{
- /* some events we always pass on, to ensure proper communication */
- return ISTIMER(event->type) || (event->type == WINDEACTIVATE);
-}
/* operator exists */
static void wm_event_modalkeymap(const bContext *C, wmOperator *op, wmEvent *event)
@@ -1164,7 +1219,7 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
wmOperatorType *ot= WM_operatortype_find(event->keymap_idname, 0);
if(ot)
- retval= wm_operator_invoke(C, ot, event, properties, NULL);
+ retval= wm_operator_invoke(C, ot, event, properties, NULL, FALSE);
}
/* Finished and pass through flag as handled */
@@ -1269,14 +1324,16 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa
retval= handler->op->type->exec(C, handler->op);
+ /* XXX check this carefully, CTX_wm_manager(C) == wm is a bit hackish */
if(handler->op->type->flag & OPTYPE_UNDO && CTX_wm_manager(C) == wm)
wm->op_undo_depth--;
if (retval & OPERATOR_FINISHED)
if(G.f & G_DEBUG)
- wm_operator_print(handler->op);
+ wm_operator_print(C, handler->op);
- if(wm->op_undo_depth == 0)
+ /* XXX check this carefully, CTX_wm_manager(C) == wm is a bit hackish */
+ if(CTX_wm_manager(C) == wm && wm->op_undo_depth == 0)
if(handler->op->type->flag & OPTYPE_UNDO)
ED_undo_push_op(C, handler->op);
@@ -1294,7 +1351,7 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa
/* XXX - copied from 'wm_operator_finished()' */
/* add reports to the global list, otherwise they are not seen */
- addlisttolist(&CTX_wm_reports(C)->list, &handler->op->reports->list);
+ BLI_movelisttolist(&CTX_wm_reports(C)->list, &handler->op->reports->list);
CTX_wm_window_set(C, win_prev);
}
@@ -1413,12 +1470,26 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
if(event->custom==EVT_DATA_LISTBASE) {
ListBase *lb= (ListBase *)event->customdata;
wmDrag *drag;
+
for(drag= lb->first; drag; drag= drag->next) {
if(drop->poll(C, drag, event)) {
+
drop->copy(drag, drop);
- wm_operator_invoke(C, drop->ot, event, drop->ptr, NULL);
+ /* free the drags before calling operator */
+ BLI_freelistN(event->customdata);
+ event->customdata= NULL;
+ event->custom= 0;
+
+ WM_operator_name_call(C, drop->ot->idname, drop->opcontext, drop->ptr);
action |= WM_HANDLER_BREAK;
+
+ /* XXX fileread case */
+ if(CTX_wm_window(C)==NULL)
+ return action;
+
+ /* escape from drag loop, got freed */
+ break;
}
}
}
@@ -1438,7 +1509,7 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
}
}
- /* fileread case */
+ /* XXX fileread case */
if(CTX_wm_window(C)==NULL)
return action;
}
@@ -1448,11 +1519,24 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
wmWindow *win = CTX_wm_window(C);
if (win && win->eventstate->prevtype == event->type && win->eventstate->prevval == KM_PRESS) {
- /* test for double click first */
- if ((PIL_check_seconds_timer() - win->eventstate->prevclicktime) * 1000 < U.dbl_click_time) {
+ /* test for double click first,
+ * note1: this can be problematic because single click operators can get the
+ * double click event but then with old mouse coords which is highly confusing,
+ * so check for mouse moves too.
+ * note2: the first click event will be handled but still used to create a
+ * double click event if clicking again quickly.
+ * If no double click events are found itwill fallback to a single click.
+ * So a double click event can result in 2 successive single click calls
+ * if its not handled by the keymap - campbell */
+ if ( (ABS(event->x - win->eventstate->prevclickx)) <= 2 &&
+ (ABS(event->y - win->eventstate->prevclicky)) <= 2 &&
+ ((PIL_check_seconds_timer() - win->eventstate->prevclicktime) * 1000 < U.dbl_click_time)
+ ) {
event->val = KM_DBL_CLICK;
- event->x = win->eventstate->prevclickx;
- event->y = win->eventstate->prevclicky;
+ /* removed this because in cases where we're this is used as a single click
+ * event, this will give old coords, since the distance is checked above, using new coords should be ok. */
+ // event->x = win->eventstate->prevclickx;
+ // event->y = win->eventstate->prevclicky;
action |= wm_handlers_do(C, event, handlers);
}
@@ -1619,7 +1703,7 @@ void wm_event_do_handlers(bContext *C)
int ncfra = sound_sync_scene(scene) * FPS + 0.5;
if(ncfra != scene->r.cfra) {
scene->r.cfra = ncfra;
- ED_update_for_newframe(C, 1);
+ ED_update_for_newframe(CTX_data_main(C), scene, win->screen, 1);
WM_event_add_notifier(C, NC_WINDOW, NULL);
}
}
@@ -1691,7 +1775,11 @@ void wm_event_do_handlers(bContext *C)
}
action |= wm_handlers_do(C, event, &ar->handlers);
-
+
+ /* fileread case (python), [#29489] */
+ if(CTX_wm_window(C)==NULL)
+ return;
+
doit |= (BLI_in_rcti(&ar->winrct, event->x, event->y));
if(action & WM_HANDLER_BREAK)
@@ -1770,11 +1858,11 @@ void wm_event_do_handlers(bContext *C)
/* only add mousemove when queue was read entirely */
if(win->addmousemove && win->eventstate) {
- wmEvent event= *(win->eventstate);
- event.type= MOUSEMOVE;
- event.prevx= event.x;
- event.prevy= event.y;
- wm_event_add(win, &event);
+ wmEvent tevent= *(win->eventstate);
+ tevent.type= MOUSEMOVE;
+ tevent.prevx= tevent.x;
+ tevent.prevy= tevent.y;
+ wm_event_add(win, &tevent);
win->addmousemove= 0;
}
@@ -1810,14 +1898,20 @@ void WM_event_fileselect_event(bContext *C, void *ophandle, int eventval)
void WM_event_add_fileselect(bContext *C, wmOperator *op)
{
- wmEventHandler *handler;
+ wmEventHandler *handler, *handlernext;
wmWindow *win= CTX_wm_window(C);
int full= 1; // XXX preset?
- /* only allow file selector open per window bug [#23553] */
- for(handler= win->modalhandlers.first; handler; handler=handler->next) {
- if(handler->type == WM_HANDLER_FILESELECT)
- return;
+ /* only allow 1 file selector open per window */
+ for(handler= win->modalhandlers.first; handler; handler=handlernext) {
+ handlernext= handler->next;
+
+ if(handler->type == WM_HANDLER_FILESELECT) {
+ if(handler->op)
+ WM_operator_free(handler->op);
+ BLI_remlink(&win->modalhandlers, handler);
+ wm_event_free_handler(handler);
+ }
}
handler = MEM_callocN(sizeof(wmEventHandler), "fileselect handler");
@@ -1890,7 +1984,7 @@ wmEventHandler *WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap *keymap
}
/* priorities not implemented yet, for time being just insert in begin of list */
-wmEventHandler *WM_event_add_keymap_handler_priority(ListBase *handlers, wmKeyMap *keymap, int priority)
+wmEventHandler *WM_event_add_keymap_handler_priority(ListBase *handlers, wmKeyMap *keymap, int UNUSED(priority))
{
wmEventHandler *handler;
@@ -2063,7 +2157,7 @@ static int convert_key(GHOST_TKey key)
case GHOST_kKeyRightShift: return RIGHTSHIFTKEY;
case GHOST_kKeyLeftControl: return LEFTCTRLKEY;
case GHOST_kKeyRightControl: return RIGHTCTRLKEY;
- case GHOST_kKeyCommand: return COMMANDKEY;
+ case GHOST_kKeyOS: return OSKEY;
case GHOST_kKeyLeftAlt: return LEFTALTKEY;
case GHOST_kKeyRightAlt: return RIGHTALTKEY;
@@ -2163,7 +2257,7 @@ static wmWindow *wm_event_cursor_other_windows(wmWindowManager *wm, wmWindow *wi
/* windows store own event queues, no bContext here */
/* time is in 1000s of seconds, from ghost */
-void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int time, void *customdata)
+void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int UNUSED(time), void *customdata)
{
wmWindow *owin;
wmEvent event, *evt= win->eventstate;
@@ -2196,7 +2290,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int t
event.type= MOUSEMOVE;
/* some painting operators want accurate mouse events, they can
- handle inbetween mouse move moves, others can happily ignore
+ handle in between mouse move moves, others can happily ignore
them for better performance */
if(lastevent && lastevent->type == MOUSEMOVE)
lastevent->type = INBETWEEN_MOUSEMOVE;
@@ -2320,7 +2414,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int t
if(event.val==KM_PRESS && (evt->ctrl || evt->shift || evt->oskey))
event.alt= evt->alt = 3; // define?
}
- else if (event.type==COMMANDKEY) {
+ else if (event.type==OSKEY) {
event.oskey= evt->oskey= (event.val==KM_PRESS);
if(event.val==KM_PRESS && (evt->ctrl || evt->alt || evt->shift))
event.oskey= evt->oskey = 3; // define?
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index f0b8577be47..644320b0566 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -49,6 +49,7 @@
#include "BLI_blenlib.h"
#include "BLI_linklist.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_ipo_types.h" // XXX old animation system
@@ -72,7 +73,7 @@
#include "BKE_report.h"
#include "BKE_sound.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "BLO_readfile.h"
#include "BLO_writefile.h"
@@ -91,12 +92,13 @@
#include "ED_util.h"
#include "GHOST_C-api.h"
+#include "GHOST_Path-api.h"
#include "UI_interface.h"
#include "GPU_draw.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -116,7 +118,7 @@ static void write_history(void);
*/
static void wm_window_match_init(bContext *C, ListBase *wmlist)
{
- wmWindowManager *wm= G.main->wm.first;
+ wmWindowManager *wm;
wmWindow *win, *active_win;
*wmlist= G.main->wm;
@@ -195,7 +197,7 @@ static void wm_window_match_do(bContext *C, ListBase *oldwmlist)
else
win->screen= ED_screen_duplicate(win, screen);
- BLI_strncpy(win->screenname, win->screen->id.name+2, 21);
+ BLI_strncpy(win->screenname, win->screen->id.name+2, sizeof(win->screenname));
win->screen->winid= win->winid;
}
}
@@ -250,8 +252,6 @@ static void wm_window_match_do(bContext *C, ListBase *oldwmlist)
/* in case UserDef was read, we re-initialize all, and do versioning */
static void wm_init_userdef(bContext *C)
{
- extern char btempdir[];
-
UI_init_userdef();
MEM_CacheLimiter_set_maximum(U.memcachelimit * 1024 * 1024);
sound_init(CTX_data_main(C));
@@ -259,24 +259,25 @@ static void wm_init_userdef(bContext *C)
/* set the python auto-execute setting from user prefs */
/* disabled by default, unless explicitly enabled in the command line */
if ((U.flag & USER_SCRIPT_AUTOEXEC_DISABLE) == 0) G.f |= G_SCRIPT_AUTOEXEC;
-
- if(U.tempdir[0]) strncpy(btempdir, U.tempdir, FILE_MAXDIR+FILE_MAXFILE);
+ if(U.tempdir[0]) BLI_where_is_temp(btempdir, 1);
}
-void WM_read_file(bContext *C, char *name, ReportList *reports)
+void WM_read_file(bContext *C, const char *name, ReportList *reports)
{
int retval;
/* so we can get the error message */
errno = 0;
+ WM_cursor_wait(1);
+
/* first try to append data from exotic file formats... */
/* it throws error box when file doesnt exist and returns -1 */
/* note; it should set some error message somewhere... (ton) */
retval= BKE_read_exotic(CTX_data_scene(C), name);
/* we didn't succeed, now try to read Blender file */
- if (retval== 0) {
+ if (retval == BKE_READ_EXOTIC_OK_BLEND) {
int G_f= G.f;
ListBase wmbase;
@@ -284,7 +285,7 @@ void WM_read_file(bContext *C, char *name, ReportList *reports)
/* also exit screens and editors */
wm_window_match_init(C, &wmbase);
- retval= BKE_read_file(C, name, NULL, reports);
+ retval= BKE_read_file(C, name, reports);
G.save_over = 1;
/* this flag is initialized by the operator but overwritten on read.
@@ -298,17 +299,14 @@ void WM_read_file(bContext *C, char *name, ReportList *reports)
// XXX mainwindow_set_filename_to_title(G.main->name);
- if(retval==2) wm_init_userdef(C); // in case a userdef is read from regular .blend
+ if(retval == BKE_READ_FILE_OK_USERPREFS) wm_init_userdef(C); // in case a userdef is read from regular .blend
- if (retval!=0) {
+ if (retval != BKE_READ_FILE_FAIL) {
G.relbase_valid = 1;
if(!G.background) /* assume automated tasks with background, dont write recent file list */
write_history();
}
-// XXX undo_editmode_clear();
- BKE_reset_undo();
- BKE_write_undo(C, "original"); /* save current state */
WM_event_add_notifier(C, NC_WM|ND_FILEREAD, NULL);
// refresh_interface_font();
@@ -316,35 +314,49 @@ void WM_read_file(bContext *C, char *name, ReportList *reports)
CTX_wm_window_set(C, CTX_wm_manager(C)->windows.first);
ED_editors_init(C);
- DAG_on_load_update(CTX_data_main(C));
+ DAG_on_load_update(CTX_data_main(C), TRUE);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* run any texts that were loaded in and flagged as modules */
- BPY_load_user_modules(C);
+ BPY_driver_reset();
+ BPY_modules_load_user(C);
#endif
CTX_wm_window_set(C, NULL); /* exits queues */
+
+ // XXX undo_editmode_clear();
+ BKE_reset_undo();
+ BKE_write_undo(C, "original"); /* save current state */
+
}
- else if(retval==1)
+ else if(retval == BKE_READ_EXOTIC_OK_OTHER)
BKE_write_undo(C, "Import file");
- else if(retval == -1) {
- if(reports)
- BKE_reportf(reports, RPT_ERROR, "Can't read file: \"%s\", %s.", name, errno ? strerror(errno) : "Incompatible file format");
+ else if(retval == BKE_READ_EXOTIC_FAIL_OPEN) {
+ BKE_reportf(reports, RPT_ERROR, "Can't read file: \"%s\", %s.", name, errno ? strerror(errno) : "Unable to open the file");
+ }
+ else if(retval == BKE_READ_EXOTIC_FAIL_FORMAT) {
+ BKE_reportf(reports, RPT_ERROR, "File format is not supported in file: \"%s\".", name);
}
+ else if(retval == BKE_READ_EXOTIC_FAIL_PATH) {
+ BKE_reportf(reports, RPT_ERROR, "File path invalid: \"%s\".", name);
+ }
+ else {
+ BKE_reportf(reports, RPT_ERROR, "Unknown error loading: \"%s\".", name);
+ BLI_assert(!"invalid 'retval'");
+ }
+
+ WM_cursor_wait(0);
+
}
/* called on startup, (context entirely filled with NULLs) */
/* or called for 'New File' */
/* op can be NULL */
-/* note: G.sce is used to store the last saved path so backup and restore after loading
- * G.main->name is similar to G.sce but when loading from memory set the name to startup.blend
- * ...this could be changed but seems better then setting to "" */
-int WM_read_homefile(bContext *C, wmOperator *op)
+int WM_read_homefile(bContext *C, ReportList *reports, short from_memory)
{
ListBase wmbase;
- char tstr[FILE_MAXDIR+FILE_MAXFILE], scestr[FILE_MAXDIR];
- int from_memory= op?RNA_boolean_get(op->ptr, "factory"):0;
- int success;
+ char tstr[FILE_MAXDIR+FILE_MAXFILE];
+ int success= 0;
free_ttfont(); /* still weird... what does it here? */
@@ -352,16 +364,13 @@ int WM_read_homefile(bContext *C, wmOperator *op)
if (!from_memory) {
char *cfgdir = BLI_get_folder(BLENDER_USER_CONFIG, NULL);
if (cfgdir) {
- BLI_make_file_string(G.sce, tstr, cfgdir, BLENDER_STARTUP_FILE);
+ BLI_make_file_string(G.main->name, tstr, cfgdir, BLENDER_STARTUP_FILE);
} else {
tstr[0] = '\0';
from_memory = 1;
- if (op) {
- BKE_report(op->reports, RPT_INFO, "Config directory with startup.blend file found.");
- }
+ BKE_report(reports, RPT_INFO, "Config directory with "STRINGIFY(BLENDER_STARTUP_FILE)" file not found.");
}
}
- strcpy(scestr, G.sce); /* temporary store */
/* prevent loading no UI */
G.fileflags &= ~G_FILE_NO_UI;
@@ -370,9 +379,15 @@ int WM_read_homefile(bContext *C, wmOperator *op)
wm_window_match_init(C, &wmbase);
if (!from_memory && BLI_exists(tstr)) {
- success = BKE_read_file(C, tstr, NULL, NULL);
- } else {
- success = BKE_read_file_from_memory(C, datatoc_startup_blend, datatoc_startup_blend_size, NULL, NULL);
+ success = (BKE_read_file(C, tstr, NULL) != BKE_READ_FILE_FAIL);
+
+ if(U.themes.first==NULL) {
+ printf("\nError: No valid "STRINGIFY(BLENDER_STARTUP_FILE)", fall back to built-in default.\n\n");
+ success = 0;
+ }
+ }
+ if(success==0) {
+ success = BKE_read_file_from_memory(C, datatoc_startup_blend, datatoc_startup_blend_size, NULL);
if (wmbase.first == NULL) wm_clear_default_size(C);
}
@@ -384,7 +399,6 @@ int WM_read_homefile(bContext *C, wmOperator *op)
wm_window_match_do(C, &wmbase);
WM_check(C); /* opens window(s), checks keymaps */
- strcpy(G.sce, scestr); /* restore */
G.main->name[0]= '\0';
wm_init_userdef(C);
@@ -404,21 +418,33 @@ int WM_read_homefile(bContext *C, wmOperator *op)
BKE_write_undo(C, "original"); /* save current state */
ED_editors_init(C);
- DAG_on_load_update(CTX_data_main(C));
+ DAG_on_load_update(CTX_data_main(C), TRUE);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if(CTX_py_init_get(C)) {
/* sync addons, these may have changed from the defaults */
- BPY_eval_string(C, "__import__('bpy').utils.addon_reset_all()");
+ BPY_string_exec(C, "__import__('bpy').utils.addon_reset_all()");
+
+ BPY_driver_reset();
+ BPY_modules_load_user(C);
}
#endif
-
+
WM_event_add_notifier(C, NC_WM|ND_FILEREAD, NULL);
- CTX_wm_window_set(C, NULL); /* exits queues */
- return OPERATOR_FINISHED;
+ /* in background mode the scene will stay NULL */
+ if(!G.background) {
+ CTX_wm_window_set(C, NULL); /* exits queues */
+ }
+
+ return TRUE;
}
+int WM_read_homefile_exec(bContext *C, wmOperator *op)
+{
+ int from_memory= strcmp(op->type->idname, "WM_OT_read_factory_settings") == 0;
+ return WM_read_homefile(C, op->reports, from_memory) ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
+}
void read_history(void)
{
@@ -441,9 +467,6 @@ void read_history(void)
for (l= lines, num= 0; l && (num<U.recent_files); l= l->next) {
line = l->link;
if (line[0] && BLI_exists(line)) {
- if (num==0)
- strcpy(G.sce, line); /* note: this seems highly dodgy since the file isnt actually read. please explain. - campbell */
-
recent = (RecentFile*)MEM_mallocN(sizeof(RecentFile),"RecentFile");
BLI_addtail(&(G.recent_files), recent);
recent->filepath = (char*)MEM_mallocN(sizeof(char)*(strlen(line)+1), "name of file");
@@ -462,21 +485,27 @@ static void write_history(void)
{
struct RecentFile *recent, *next_recent;
char name[FILE_MAXDIR+FILE_MAXFILE];
+ char *user_config_dir;
FILE *fp;
int i;
- BLI_make_file_string("/", name, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_HISTORY_FILE);
+ /* will be NULL in background mode */
+ user_config_dir = BLI_get_folder_create(BLENDER_USER_CONFIG, NULL);
+ if(!user_config_dir)
+ return;
+
+ BLI_make_file_string("/", name, user_config_dir, BLENDER_HISTORY_FILE);
recent = G.recent_files.first;
/* refresh recent-files.txt of recent opened files, when current file was changed */
- if(!(recent) || (strcmp(recent->filepath, G.sce)!=0)) {
+ if(!(recent) || (strcmp(recent->filepath, G.main->name)!=0)) {
fp= fopen(name, "w");
if (fp) {
/* add current file to the beginning of list */
recent = (RecentFile*)MEM_mallocN(sizeof(RecentFile),"RecentFile");
- recent->filepath = (char*)MEM_mallocN(sizeof(char)*(strlen(G.sce)+1), "name of file");
+ recent->filepath = (char*)MEM_mallocN(sizeof(char)*(strlen(G.main->name)+1), "name of file");
recent->filepath[0] = '\0';
- strcpy(recent->filepath, G.sce);
+ strcpy(recent->filepath, G.main->name);
BLI_addhead(&(G.recent_files), recent);
/* write current file to recent-files.txt */
fprintf(fp, "%s\n", recent->filepath);
@@ -485,7 +514,7 @@ static void write_history(void)
/* write rest of recent opened files to recent-files.txt */
while((i<U.recent_files) && (recent)){
/* this prevents to have duplicities in list */
- if (strcmp(recent->filepath, G.sce)!=0) {
+ if (strcmp(recent->filepath, G.main->name)!=0) {
fprintf(fp, "%s\n", recent->filepath);
recent = recent->next;
}
@@ -499,6 +528,9 @@ static void write_history(void)
}
fclose(fp);
}
+
+ /* also update most recent files on System */
+ GHOST_addToSystemRecentFiles(G.main->name);
}
}
@@ -527,7 +559,7 @@ static void do_history(char *name, ReportList *reports)
BKE_report(reports, RPT_ERROR, "Unable to make version backup");
}
-static ImBuf *blend_file_thumb(const char *path, Scene *scene, int **thumb_pt)
+static ImBuf *blend_file_thumb(Scene *scene, int **thumb_pt)
{
/* will be scaled down, but gives some nice oversampling */
ImBuf *ibuf;
@@ -573,7 +605,7 @@ static ImBuf *blend_file_thumb(const char *path, Scene *scene, int **thumb_pt)
int write_crash_blend(void)
{
char path[FILE_MAX];
- BLI_strncpy(path, G.sce, sizeof(path));
+ BLI_strncpy(path, G.main->name, sizeof(path));
BLI_replace_extension(path, sizeof(path), "_crash.blend");
if(BLO_write_file(G.main, path, G.fileflags, NULL, NULL)) {
printf("written: %s\n", path);
@@ -613,7 +645,7 @@ int WM_write_file(bContext *C, const char *target, int fileflags, ReportList *re
/* send the OnSave event */
for (li= G.main->library.first; li; li= li->id.next) {
if (strcmp(li->filepath, di) == 0) {
- BKE_reportf(reports, RPT_ERROR, "Can't overwrite used library '%f'", di);
+ BKE_reportf(reports, RPT_ERROR, "Can't overwrite used library '%.200s'", di);
return -1;
}
}
@@ -627,15 +659,17 @@ int WM_write_file(bContext *C, const char *target, int fileflags, ReportList *re
ED_object_exit_editmode(C, EM_DO_UNDO);
ED_sculpt_force_update(C);
+ /* don't forget not to return without! */
+ WM_cursor_wait(1);
+
/* blend file thumbnail */
- ibuf_thumb= blend_file_thumb(di, CTX_data_scene(C), &thumb);
+ ibuf_thumb= blend_file_thumb(CTX_data_scene(C), &thumb);
/* rename to .blend1, do this as last before write */
do_history(di, reports);
if (BLO_write_file(CTX_data_main(C), di, fileflags, reports, thumb)) {
if(!copy) {
- strcpy(G.sce, di);
G.relbase_valid = 1;
strcpy(G.main->name, di); /* is guaranteed current file */
@@ -661,10 +695,13 @@ int WM_write_file(bContext *C, const char *target, int fileflags, ReportList *re
else {
if(ibuf_thumb) IMB_freeImBuf(ibuf_thumb);
if(thumb) MEM_freeN(thumb);
+
+ WM_cursor_wait(0);
return -1;
}
-// XXX waitcursor(0);
+ WM_cursor_wait(0);
+
return 0;
}
@@ -677,19 +714,24 @@ int WM_write_homefile(bContext *C, wmOperator *op)
int fileflags;
/* check current window and close it if temp */
- if(win->screen->full == SCREENTEMP)
+ if(win->screen->temp)
wm_window_close(C, wm, win);
BLI_make_file_string("/", tstr, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_STARTUP_FILE);
- printf("trying to save homefile at %s \n", tstr);
+ printf("trying to save homefile at %s ", tstr);
/* force save as regular blend file */
fileflags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_AUTOPLAY | G_FILE_LOCK | G_FILE_SIGN);
- BLO_write_file(CTX_data_main(C), tstr, fileflags, op->reports, NULL);
+ if(BLO_write_file(CTX_data_main(C), tstr, fileflags, op->reports, NULL) == 0) {
+ printf("fail\n");
+ return OPERATOR_CANCELLED;
+ }
+ printf("ok\n");
+
G.save_over= 0;
-
+
return OPERATOR_FINISHED;
}
@@ -731,7 +773,7 @@ void WM_autosave_init(wmWindowManager *wm)
wm->autosavetimer= WM_event_add_timer(wm, NULL, TIMERAUTOSAVE, U.savetime*60.0);
}
-void wm_autosave_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt)
+void wm_autosave_timer(const bContext *C, wmWindowManager *wm, wmTimer *UNUSED(wt))
{
wmWindow *win;
wmEventHandler *handler;
diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c
index e87d2d79c39..0398f44a8c9 100644
--- a/source/blender/windowmanager/intern/wm_gesture.c
+++ b/source/blender/windowmanager/intern/wm_gesture.c
@@ -37,9 +37,10 @@
#include "BLI_editVert.h" /* lasso tessellation */
#include "BLI_math.h"
#include "BLI_scanfill.h" /* lasso tessellation */
+#include "BLI_utildefines.h"
#include "BKE_context.h"
-#include "BKE_utildefines.h"
+
#include "WM_api.h"
#include "WM_types.h"
@@ -121,7 +122,7 @@ void WM_gestures_remove(bContext *C)
/* tweak and line gestures */
#define TWEAK_THRESHOLD 10
-int wm_gesture_evaluate(bContext *C, wmGesture *gesture)
+int wm_gesture_evaluate(wmGesture *gesture)
{
if(gesture->type==WM_GESTURE_TWEAK) {
rcti *rect= gesture->customdata;
@@ -159,7 +160,7 @@ int wm_gesture_evaluate(bContext *C, wmGesture *gesture)
/* ******************* gesture draw ******************* */
-static void wm_gesture_draw_rect(wmWindow *win, wmGesture *gt)
+static void wm_gesture_draw_rect(wmGesture *gt)
{
rcti *rect= (rcti *)gt->customdata;
@@ -183,7 +184,7 @@ static void wm_gesture_draw_rect(wmWindow *win, wmGesture *gt)
glDisable(GL_LINE_STIPPLE);
}
-static void wm_gesture_draw_line(wmWindow *win, wmGesture *gt)
+static void wm_gesture_draw_line(wmGesture *gt)
{
rcti *rect= (rcti *)gt->customdata;
@@ -199,7 +200,7 @@ static void wm_gesture_draw_line(wmWindow *win, wmGesture *gt)
}
-static void wm_gesture_draw_circle(wmWindow *win, wmGesture *gt)
+static void wm_gesture_draw_circle(wmGesture *gt)
{
rcti *rect= (rcti *)gt->customdata;
@@ -232,8 +233,12 @@ static void draw_filled_lasso(wmGesture *gt)
int i;
for (i=0; i<gt->points; i++, lasso+=2) {
- float co[3] = {(float)lasso[0], (float)lasso[1], 0.f};
-
+ float co[3];
+
+ co[0]= (float)lasso[0];
+ co[1]= (float)lasso[1];
+ co[2]= 0.0f;
+
v = BLI_addfillvert(co);
if (lastv)
e = BLI_addfilledge(lastv, v);
@@ -244,7 +249,7 @@ static void draw_filled_lasso(wmGesture *gt)
/* highly unlikely this will fail, but could crash if (gt->points == 0) */
if(firstv) {
BLI_addfilledge(firstv, v);
- BLI_edgefill(0, 0);
+ BLI_edgefill(0);
glEnable(GL_BLEND);
glColor4f(1.0, 1.0, 1.0, 0.05);
@@ -261,7 +266,7 @@ static void draw_filled_lasso(wmGesture *gt)
}
}
-static void wm_gesture_draw_lasso(wmWindow *win, wmGesture *gt)
+static void wm_gesture_draw_lasso(wmGesture *gt)
{
short *lasso= (short *)gt->customdata;
int i;
@@ -272,7 +277,6 @@ static void wm_gesture_draw_lasso(wmWindow *win, wmGesture *gt)
glColor3ub(96, 96, 96);
glLineStipple(1, 0xAAAA);
glBegin(GL_LINE_STRIP);
- lasso= (short *)gt->customdata;
for(i=0; i<gt->points; i++, lasso+=2)
glVertex2sv(lasso);
if(gt->type==WM_GESTURE_LASSO)
@@ -320,23 +324,23 @@ void wm_gesture_draw(wmWindow *win)
wmSubWindowSet(win, gt->swinid);
if(gt->type==WM_GESTURE_RECT)
- wm_gesture_draw_rect(win, gt);
- else if(gt->type==WM_GESTURE_TWEAK)
- wm_gesture_draw_line(win, gt);
+ wm_gesture_draw_rect(gt);
+// else if(gt->type==WM_GESTURE_TWEAK)
+// wm_gesture_draw_line(gt);
else if(gt->type==WM_GESTURE_CIRCLE)
- wm_gesture_draw_circle(win, gt);
+ wm_gesture_draw_circle(gt);
else if(gt->type==WM_GESTURE_CROSS_RECT) {
if(gt->mode==1)
- wm_gesture_draw_rect(win, gt);
+ wm_gesture_draw_rect(gt);
else
wm_gesture_draw_cross(win, gt);
}
else if(gt->type==WM_GESTURE_LINES)
- wm_gesture_draw_lasso(win, gt);
+ wm_gesture_draw_lasso(gt);
else if(gt->type==WM_GESTURE_LASSO)
- wm_gesture_draw_lasso(win, gt);
+ wm_gesture_draw_lasso(gt);
else if(gt->type==WM_GESTURE_STRAIGHTLINE)
- wm_gesture_draw_line(win, gt);
+ wm_gesture_draw_line(gt);
}
}
@@ -351,5 +355,3 @@ void wm_gesture_tag_redraw(bContext *C)
wm_tag_redraw_overlay(win, ar);
}
-
-
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 4d4e399a1c7..0d1dfd5fbba 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -52,7 +52,7 @@
#include "BKE_main.h"
#include "BKE_mball.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
+
#include "BKE_packedFile.h"
#include "BKE_sequencer.h" /* free seq clipboard */
#include "BKE_material.h" /* clear_matcopybuf */
@@ -61,11 +61,14 @@
#include "RE_pipeline.h" /* RE_ free stuff */
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
+#ifdef WITH_GAMEENGINE
#include "SYS_System.h"
+#endif
+#include "GHOST_Path-api.h"
#include "RNA_define.h"
@@ -116,6 +119,8 @@ void WM_init(bContext *C, int argc, char **argv)
wm_ghost_init(C); /* note: it assigns C to ghost! */
wm_init_cursor_data();
}
+ GHOST_CreateSystemPaths();
+
wm_operatortype_init();
set_free_windowmanager_cb(wm_close_and_free); /* library.c */
@@ -127,24 +132,29 @@ void WM_init(bContext *C, int argc, char **argv)
ED_file_init(); /* for fsmenu */
ED_init_node_butfuncs();
- BLF_init(11, U.dpi);
+ BLF_init(11, U.dpi); /* Please update source/gamengine/GamePlayer/GPG_ghost.cpp if you change this */
BLF_lang_init();
/* get the default database, plus a wm */
- WM_read_homefile(C, NULL);
+ WM_read_homefile(C, NULL, G.factory_startup);
/* note: there is a bug where python needs initializing before loading the
- * .B25.blend because it may contain PyDrivers. It also needs to be after
+ * startup.blend because it may contain PyDrivers. It also needs to be after
* initializing space types and other internal data.
*
* However cant redo this at the moment. Solution is to load python
* before WM_read_homefile() or make py-drivers check if python is running.
* Will try fix when the crash can be repeated. - campbell. */
-#ifndef DISABLE_PYTHON
- BPY_set_context(C); /* necessary evil */
- BPY_start_python(argc, argv);
- BPY_load_user_modules(C);
+#ifdef WITH_PYTHON
+ BPY_context_set(C); /* necessary evil */
+ BPY_python_start(argc, argv);
+
+ BPY_driver_reset();
+ BPY_modules_load_user(C);
+#else
+ (void)argc; /* unused */
+ (void)argv; /* unused */
#endif
wm_init_reports(C); /* reports cant be initialized before the wm */
@@ -167,10 +177,13 @@ void WM_init(bContext *C, int argc, char **argv)
read_history();
- if(G.sce[0] == 0)
- BLI_make_file_string("/", G.sce, BLI_getDefaultDocumentFolder(), "untitled.blend");
+ /* allow a path of "", this is what happens when making a new file */
+ /*
+ if(G.main->name[0] == 0)
+ BLI_make_file_string("/", G.main->name, BLI_getDefaultDocumentFolder(), "untitled.blend");
+ */
- BLI_strncpy(G.lib, G.sce, FILE_MAX);
+ BLI_strncpy(G.lib, G.main->name, FILE_MAX);
}
@@ -212,7 +225,7 @@ int WM_init_game(bContext *C)
wmWindow* win;
ScrArea *sa;
- ARegion *ar;
+ ARegion *ar= NULL;
Scene *scene= CTX_data_scene(C);
@@ -268,12 +281,16 @@ int WM_init_game(bContext *C)
if(scene->gm.fullscreen) {
WM_operator_name_call(C, "WM_OT_window_fullscreen_toggle", WM_OP_EXEC_DEFAULT, NULL);
wm_get_screensize(&ar->winrct.xmax, &ar->winrct.ymax);
+ ar->winx = ar->winrct.xmax + 1;
+ ar->winy = ar->winrct.ymax + 1;
}
else
{
GHOST_RectangleHandle rect = GHOST_GetClientBounds(win->ghostwin);
ar->winrct.ymax = GHOST_GetHeightRectangle(rect);
ar->winrct.xmax = GHOST_GetWidthRectangle(rect);
+ ar->winx = ar->winrct.xmax + 1;
+ ar->winy = ar->winrct.ymax + 1;
GHOST_DisposeRectangle(rect);
}
@@ -318,10 +335,10 @@ extern wchar_t *copybuf;
extern wchar_t *copybufinfo;
// XXX copy/paste buffer stuff...
-extern void free_anim_copybuf();
-extern void free_anim_drivers_copybuf();
-extern void free_fmodifiers_copybuf();
-extern void free_posebuf();
+extern void free_anim_copybuf(void);
+extern void free_anim_drivers_copybuf(void);
+extern void free_fmodifiers_copybuf(void);
+extern void free_posebuf(void);
/* called in creator.c even... tsk, split this! */
void WM_exit(bContext *C)
@@ -393,7 +410,7 @@ void WM_exit(bContext *C)
// free_txt_data();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* XXX - old note */
/* before free_blender so py's gc happens while library still exists */
/* needed at least for a rare sigsegv that can happen in pydrivers */
@@ -401,7 +418,7 @@ void WM_exit(bContext *C)
/* Update for blender 2.5, move after free_blender because blender now holds references to PyObject's
* so decref'ing them after python ends causes bad problems every time
* the pyDriver bug can be fixed if it happens again we can deal with it then */
- BPY_end_python();
+ BPY_python_end();
#endif
if (!G.background) {
@@ -424,13 +441,16 @@ void WM_exit(bContext *C)
UI_exit();
BKE_userdef_free();
- RNA_exit(); /* should be after BPY_end_python so struct python slots are cleared */
+ RNA_exit(); /* should be after BPY_python_end so struct python slots are cleared */
wm_ghost_exit();
CTX_free(C);
-
+#ifdef WITH_GAMEENGINE
SYS_DeleteSystem(SYS_GetSystem());
+#endif
+
+ GHOST_DisposeSystemPaths();
if(MEM_get_memory_blocks_in_use()!=0) {
printf("Error Totblock: %d\n", MEM_get_memory_blocks_in_use());
diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c
index 3ebfac4928c..591ed5c33b5 100644
--- a/source/blender/windowmanager/intern/wm_jobs.c
+++ b/source/blender/windowmanager/intern/wm_jobs.c
@@ -129,7 +129,7 @@ struct wmJob {
* 1st priority: job with same owner and name
* 2nd priority: job with same owner
*/
-static wmJob *wm_job_find(wmWindowManager *wm, void *owner, char *name)
+static wmJob *wm_job_find(wmWindowManager *wm, void *owner, const char *name)
{
wmJob *steve, *found=NULL;
@@ -148,7 +148,7 @@ static wmJob *wm_job_find(wmWindowManager *wm, void *owner, char *name)
/* returns current or adds new job, but doesnt run it */
/* every owner only gets a single job, adding a new one will stop running stop and
when stopped it starts the new one */
-wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner, char *name, int flag)
+wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner, const char *name, int flag)
{
wmJob *steve= wm_job_find(wm, owner, name);
@@ -247,20 +247,40 @@ static void wm_jobs_test_suspend_stop(wmWindowManager *wm, wmJob *test)
wmJob *steve;
int suspend= 0;
- for(steve= wm->jobs.first; steve; steve= steve->next) {
- if(steve==test || !steve->running) continue;
- if(steve->startjob!=test->startjob && !(test->flag & WM_JOB_EXCL_RENDER)) continue;
- if((test->flag & WM_JOB_EXCL_RENDER) && !(steve->flag & WM_JOB_EXCL_RENDER)) continue;
-
+ /* job added with suspend flag, we wait 1 timer step before activating it */
+ if(test->flag & WM_JOB_SUSPEND) {
suspend= 1;
-
- /* if this job has higher priority, stop others */
- if(test->flag & WM_JOB_PRIORITY)
- steve->stop= 1;
+ test->flag &= ~WM_JOB_SUSPEND;
}
+ else {
+ /* check other jobs */
+ for(steve= wm->jobs.first; steve; steve= steve->next) {
+ /* obvious case, no test needed */
+ if(steve==test || !steve->running) continue;
+
+ /* if new job is not render, then check for same startjob */
+ if(0==(test->flag & WM_JOB_EXCL_RENDER))
+ if(steve->startjob!=test->startjob)
+ continue;
+
+ /* if new job is render, any render job should be stopped */
+ if(test->flag & WM_JOB_EXCL_RENDER)
+ if(0==(steve->flag & WM_JOB_EXCL_RENDER))
+ continue;
+ suspend= 1;
+
+ /* if this job has higher priority, stop others */
+ if(test->flag & WM_JOB_PRIORITY) {
+ steve->stop= 1;
+ // printf("job stopped: %s\n", steve->name);
+ }
+ }
+ }
+
/* possible suspend ourselfs, waiting for other jobs, or de-suspend */
test->suspended= suspend;
+ // if(suspend) printf("job suspended: %s\n", test->name);
}
/* if job running, the same owner gave it a new job */
@@ -270,8 +290,10 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *steve)
if(steve->running) {
/* signal job to end and restart */
steve->stop= 1;
+ // printf("job started a running job, ending... %s\n", steve->name);
}
else {
+
if(steve->customdata && steve->startjob) {
wm_jobs_test_suspend_stop(wm, steve);
@@ -291,10 +313,10 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *steve)
steve->ready= 0;
steve->progress= 0.0;
+ // printf("job started: %s\n", steve->name);
+
BLI_init_threads(&steve->threads, do_job_thread, 1);
BLI_insert_thread(&steve->threads, steve);
-
- // printf("job started\n");
}
/* restarted job has timer already */
@@ -351,7 +373,7 @@ void WM_jobs_stop(wmWindowManager *wm, void *owner, void *startjob)
}
/* actually terminate thread and job timer */
-void WM_jobs_kill(wmWindowManager *wm, void *owner, void *startjob)
+void WM_jobs_kill(wmWindowManager *wm, void *owner, void (*startjob)(void *, short int *, short int *, float *))
{
wmJob *steve;
@@ -418,8 +440,8 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt)
steve->run_customdata= NULL;
steve->run_free= NULL;
- // if(steve->stop) printf("job stopped\n");
- // else printf("job finished\n");
+ // if(steve->stop) printf("job ready but stopped %s\n", steve->name);
+ // else printf("job finished %s\n", steve->name);
steve->running= 0;
BLI_end_threads(&steve->threads);
@@ -431,6 +453,7 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt)
/* new job added for steve? */
if(steve->customdata) {
+ // printf("job restarted with new data %s\n", steve->name);
WM_jobs_start(wm, steve);
}
else {
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index f1873b14232..7d67245d077 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -37,6 +37,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_blender.h"
#include "BKE_context.h"
@@ -44,7 +45,7 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
+
#include "RNA_access.h"
#include "RNA_enum_types.h"
@@ -63,18 +64,19 @@ static void keymap_properties_set(wmKeyMapItem *kmi)
WM_operator_properties_sanitize(kmi->ptr, 1);
}
-void WM_keymap_properties_reset(wmKeyMapItem *kmi)
+/* properties can be NULL, otherwise the arg passed is used and ownership is given to the kmi */
+void WM_keymap_properties_reset(wmKeyMapItem *kmi, struct IDProperty *properties)
{
WM_operator_properties_free(kmi->ptr);
MEM_freeN(kmi->ptr);
kmi->ptr = NULL;
- kmi->properties = NULL;
+ kmi->properties = properties;
keymap_properties_set(kmi);
}
-wmKeyConfig *WM_keyconfig_new(wmWindowManager *wm, char *idname)
+wmKeyConfig *WM_keyconfig_new(wmWindowManager *wm, const char *idname)
{
wmKeyConfig *keyconf;
@@ -85,7 +87,7 @@ wmKeyConfig *WM_keyconfig_new(wmWindowManager *wm, char *idname)
return keyconf;
}
-wmKeyConfig *WM_keyconfig_new_user(wmWindowManager *wm, char *idname)
+wmKeyConfig *WM_keyconfig_new_user(wmWindowManager *wm, const char *idname)
{
wmKeyConfig *keyconf = WM_keyconfig_new(wm, idname);
@@ -118,7 +120,7 @@ void WM_keyconfig_free(wmKeyConfig *keyconf)
MEM_freeN(keyconf);
}
-void WM_keyconfig_userdef(wmWindowManager *wm)
+void WM_keyconfig_userdef(void)
{
wmKeyMap *km;
wmKeyMapItem *kmi;
@@ -195,8 +197,18 @@ static void keymap_event_set(wmKeyMapItem *kmi, short type, short val, int modif
}
}
+static void keymap_item_set_id(wmKeyMap *keymap, wmKeyMapItem *kmi)
+{
+ keymap->kmi_id++;
+ if ((keymap->flag & KEYMAP_USER) == 0) {
+ kmi->id = keymap->kmi_id;
+ } else {
+ kmi->id = -keymap->kmi_id; // User defined keymap entries have negative ids
+ }
+}
+
/* if item was added, then bail out */
-wmKeyMapItem *WM_keymap_verify_item(wmKeyMap *keymap, char *idname, int type, int val, int modifier, int keymodifier)
+wmKeyMapItem *WM_keymap_verify_item(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
{
wmKeyMapItem *kmi;
@@ -209,10 +221,7 @@ wmKeyMapItem *WM_keymap_verify_item(wmKeyMap *keymap, char *idname, int type, in
BLI_addtail(&keymap->items, kmi);
BLI_strncpy(kmi->idname, idname, OP_MAX_TYPENAME);
- if ((keymap->flag & KEYMAP_USER) == 0) {
- keymap->kmi_id++;
- kmi->id = keymap->kmi_id;
- }
+ keymap_item_set_id(keymap, kmi);
keymap_event_set(kmi, type, val, modifier, keymodifier);
keymap_properties_set(kmi);
@@ -221,7 +230,7 @@ wmKeyMapItem *WM_keymap_verify_item(wmKeyMap *keymap, char *idname, int type, in
}
/* always add item */
-wmKeyMapItem *WM_keymap_add_item(wmKeyMap *keymap, char *idname, int type, int val, int modifier, int keymodifier)
+wmKeyMapItem *WM_keymap_add_item(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
{
wmKeyMapItem *kmi= MEM_callocN(sizeof(wmKeyMapItem), "keymap entry");
@@ -231,16 +240,13 @@ wmKeyMapItem *WM_keymap_add_item(wmKeyMap *keymap, char *idname, int type, int v
keymap_event_set(kmi, type, val, modifier, keymodifier);
keymap_properties_set(kmi);
- if ((keymap->flag & KEYMAP_USER) == 0) {
- keymap->kmi_id++;
- kmi->id = keymap->kmi_id;
- }
+ keymap_item_set_id(keymap, kmi);
return kmi;
}
/* menu wrapper for WM_keymap_add_item */
-wmKeyMapItem *WM_keymap_add_menu(wmKeyMap *keymap, char *idname, int type, int val, int modifier, int keymodifier)
+wmKeyMapItem *WM_keymap_add_menu(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
{
wmKeyMapItem *kmi= WM_keymap_add_item(keymap, "WM_OT_call_menu", type, val, modifier, keymodifier);
RNA_string_set(kmi->ptr, "name", idname);
@@ -264,7 +270,7 @@ void WM_keymap_remove_item(wmKeyMap *keymap, wmKeyMapItem *kmi)
space/region ids are same as DNA_space_types.h */
/* gets free'd in wm.c */
-wmKeyMap *WM_keymap_list_find(ListBase *lb, char *idname, int spaceid, int regionid)
+wmKeyMap *WM_keymap_list_find(ListBase *lb, const char *idname, int spaceid, int regionid)
{
wmKeyMap *km;
@@ -276,7 +282,7 @@ wmKeyMap *WM_keymap_list_find(ListBase *lb, char *idname, int spaceid, int regio
return NULL;
}
-wmKeyMap *WM_keymap_find(wmKeyConfig *keyconf, char *idname, int spaceid, int regionid)
+wmKeyMap *WM_keymap_find(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
{
wmKeyMap *km= WM_keymap_list_find(&keyconf->keymaps, idname, spaceid, regionid);
@@ -291,7 +297,7 @@ wmKeyMap *WM_keymap_find(wmKeyConfig *keyconf, char *idname, int spaceid, int re
return km;
}
-wmKeyMap *WM_keymap_find_all(const bContext *C, char *idname, int spaceid, int regionid)
+wmKeyMap *WM_keymap_find_all(const bContext *C, const char *idname, int spaceid, int regionid)
{
wmWindowManager *wm = CTX_wm_manager(C);
wmKeyConfig *keyconf;
@@ -322,7 +328,7 @@ wmKeyMap *WM_keymap_find_all(const bContext *C, char *idname, int spaceid, int r
/* modal maps get linked to a running operator, and filter the keys before sending to modal() callback */
-wmKeyMap *WM_modalkeymap_add(wmKeyConfig *keyconf, char *idname, EnumPropertyItem *items)
+wmKeyMap *WM_modalkeymap_add(wmKeyConfig *keyconf, const char *idname, EnumPropertyItem *items)
{
wmKeyMap *km= WM_keymap_find(keyconf, idname, 0, 0);
km->flag |= KEYMAP_MODAL;
@@ -331,7 +337,7 @@ wmKeyMap *WM_modalkeymap_add(wmKeyConfig *keyconf, char *idname, EnumPropertyIte
return km;
}
-wmKeyMap *WM_modalkeymap_get(wmKeyConfig *keyconf, char *idname)
+wmKeyMap *WM_modalkeymap_get(wmKeyConfig *keyconf, const char *idname)
{
wmKeyMap *km;
@@ -353,15 +359,12 @@ wmKeyMapItem *WM_modalkeymap_add_item(wmKeyMap *km, int type, int val, int modif
keymap_event_set(kmi, type, val, modifier, keymodifier);
- if ((km->flag & KEYMAP_USER) == 0) {
- km->kmi_id++;
- kmi->id = km->kmi_id;
- }
+ keymap_item_set_id(km, kmi);
return kmi;
}
-void WM_modalkeymap_assign(wmKeyMap *km, char *opname)
+void WM_modalkeymap_assign(wmKeyMap *km, const char *opname)
{
wmOperatorType *ot= WM_operatortype_find(opname, 0);
@@ -419,7 +422,7 @@ char *WM_keymap_item_to_string(wmKeyMapItem *kmi, char *str, int len)
return str;
}
-static wmKeyMapItem *wm_keymap_item_find_handlers(const bContext *C, ListBase *handlers, const char *opname, int opcontext, IDProperty *properties, int compare_props, int hotkey, wmKeyMap **keymap_r)
+static wmKeyMapItem *wm_keymap_item_find_handlers(const bContext *C, ListBase *handlers, const char *opname, int UNUSED(opcontext), IDProperty *properties, int compare_props, int hotkey, wmKeyMap **keymap_r)
{
wmWindowManager *wm= CTX_wm_manager(C);
wmEventHandler *handler;
@@ -650,6 +653,10 @@ wmKeyMap *WM_keymap_copy_to_user(wmKeyMap *keymap)
usermap= WM_keymap_list_find(&U.keymaps, keymap->idname, keymap->spaceid, keymap->regionid);
+ /* XXX this function is only used by RMB setting hotkeys, and it clears maps on 2nd try this way */
+ if(keymap==usermap)
+ return keymap;
+
if(!usermap) {
/* not saved yet, duplicate existing */
usermap= MEM_dupallocN(keymap);
@@ -706,7 +713,7 @@ void WM_keymap_restore_item_to_default(bContext *C, wmKeyMap *keymap, wmKeyMapIt
if(strcmp(orig->idname, kmi->idname) != 0) {
BLI_strncpy(kmi->idname, orig->idname, sizeof(kmi->idname));
- WM_keymap_properties_reset(kmi);
+ WM_keymap_properties_reset(kmi, NULL);
}
if (orig->properties) {
@@ -756,7 +763,7 @@ wmKeyMapItem *WM_keymap_item_find_id(wmKeyMap *keymap, int id)
/* Guess an appropriate keymap from the operator name */
/* Needs to be kept up to date with Keymap and Operator naming */
-wmKeyMap *WM_keymap_guess_opname(const bContext *C, char *opname)
+wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname)
{
wmKeyMap *km=NULL;
SpaceLink *sl = CTX_wm_space_data(C);
@@ -887,6 +894,10 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, char *opname)
else if (strstr(opname, "CONSOLE_OT")) {
km = WM_keymap_find_all(C, "Console", sl->spacetype, 0);
}
+ /* Console */
+ else if (strstr(opname, "INFO_OT")) {
+ km = WM_keymap_find_all(C, "Info", sl->spacetype, 0);
+ }
/* Transform */
else if (strstr(opname, "TRANSFORM_OT")) {
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index b84b7eab55f..36e770db91a 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -31,7 +31,16 @@
#include <ctype.h>
#include <stdio.h>
#include <stddef.h>
+#include <assert.h>
+#ifdef WIN32
+#include "BLI_winstuff.h"
+#include <windows.h>
+
+#include <io.h>
+#endif
+
+#include "MEM_guardedalloc.h"
#include "DNA_ID.h"
#include "DNA_object_types.h"
@@ -40,8 +49,6 @@
#include "DNA_userdef_types.h"
#include "DNA_windowmanager_types.h"
-#include "MEM_guardedalloc.h"
-
#include "BLF_api.h"
#include "PIL_time.h"
@@ -49,6 +56,7 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h" /*for WM_operator_pystring */
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLO_readfile.h"
@@ -62,7 +70,7 @@
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_screen.h" /* BKE_ST_MAXNAME */
-#include "BKE_utildefines.h"
+
#include "BKE_idcode.h"
#include "BIF_gl.h"
@@ -222,6 +230,8 @@ int wm_macro_invoke_internal(bContext *C, wmOperator *op, wmEvent *event, wmOper
else if(opm->type->exec)
retval= opm->type->exec(C, opm);
+ BLI_movelisttolist(&op->reports->list, &opm->reports->list);
+
if (retval & OPERATOR_FINISHED) {
MacroData *md = op->customdata;
md->retval = OPERATOR_FINISHED; /* keep in mind that at least one operator finished */
@@ -310,7 +320,7 @@ static int wm_macro_cancel(bContext *C, wmOperator *op)
}
/* Names have to be static for now */
-wmOperatorType *WM_operatortype_append_macro(char *idname, char *name, int flag)
+wmOperatorType *WM_operatortype_append_macro(const char *idname, const char *name, int flag)
{
wmOperatorType *ot;
@@ -578,12 +588,12 @@ void WM_operator_properties_alloc(PointerRNA **ptr, IDProperty **properties, con
}
-void WM_operator_properties_sanitize(PointerRNA *ptr, int val)
+void WM_operator_properties_sanitize(PointerRNA *ptr, const short no_context)
{
RNA_STRUCT_BEGIN(ptr, prop) {
switch(RNA_property_type(prop)) {
case PROP_ENUM:
- if (val)
+ if (no_context)
RNA_def_property_flag(prop, PROP_ENUM_NO_CONTEXT);
else
RNA_def_property_clear_flag(prop, PROP_ENUM_NO_CONTEXT);
@@ -595,7 +605,7 @@ void WM_operator_properties_sanitize(PointerRNA *ptr, int val)
/* recurse into operator properties */
if (RNA_struct_is_a(ptype, &RNA_OperatorProperties)) {
PointerRNA opptr = RNA_property_pointer_get(ptr, prop);
- WM_operator_properties_sanitize(&opptr, val);
+ WM_operator_properties_sanitize(&opptr, no_context);
}
break;
}
@@ -613,13 +623,14 @@ void WM_operator_properties_free(PointerRNA *ptr)
if(properties) {
IDP_FreeProperty(properties);
MEM_freeN(properties);
+ ptr->data= NULL; /* just incase */
}
}
/* ************ default op callbacks, exported *********** */
/* invoke callback, uses enum property named "type" */
-int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
+int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
PropertyRNA *prop= op->type->prop;
uiPopupMenu *pup;
@@ -635,7 +646,7 @@ int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
return op->type->exec(C, op);
}
else {
- pup= uiPupMenuBegin(C, op->type->name, 0);
+ pup= uiPupMenuBegin(C, op->type->name, ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemsFullEnumO(layout, op->type->idname, (char*)RNA_property_identifier(prop), op->ptr->data, WM_OP_EXEC_REGION_WIN, 0);
uiPupMenuEnd(C, pup);
@@ -646,7 +657,7 @@ int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* generic enum search invoke popup */
-static void operator_enum_search_cb(const struct bContext *C, void *arg_ot, char *str, uiSearchItems *items)
+static void operator_enum_search_cb(const struct bContext *C, void *arg_ot, const char *str, uiSearchItems *items)
{
wmOperatorType *ot = (wmOperatorType *)arg_ot;
PropertyRNA *prop= ot->prop;
@@ -661,10 +672,10 @@ static void operator_enum_search_cb(const struct bContext *C, void *arg_ot, char
PointerRNA ptr;
EnumPropertyItem *item, *item_array;
- int free;
+ int do_free;
RNA_pointer_create(NULL, ot->srna, NULL, &ptr);
- RNA_property_enum_items((bContext *)C, &ptr, prop, &item_array, NULL, &free);
+ RNA_property_enum_items((bContext *)C, &ptr, prop, &item_array, NULL, &do_free);
for(item= item_array; item->identifier; item++) {
/* note: need to give the intex rather then the dientifier because the enum can be freed */
@@ -673,7 +684,7 @@ static void operator_enum_search_cb(const struct bContext *C, void *arg_ot, char
break;
}
- if(free)
+ if(do_free)
MEM_freeN(item_array);
}
}
@@ -724,14 +735,14 @@ static uiBlock *wm_enum_search_menu(bContext *C, ARegion *ar, void *arg_op)
}
-int WM_enum_search_invoke(bContext *C, wmOperator *op, wmEvent *event)
+int WM_enum_search_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
uiPupBlock(C, wm_enum_search_menu, op);
return OPERATOR_CANCELLED;
}
/* Can't be used as an invoke directly, needs message arg (can be NULL) */
-int WM_operator_confirm_message(bContext *C, wmOperator *op, char *message)
+int WM_operator_confirm_message(bContext *C, wmOperator *op, const char *message)
{
uiPopupMenu *pup;
uiLayout *layout;
@@ -744,20 +755,20 @@ int WM_operator_confirm_message(bContext *C, wmOperator *op, char *message)
pup= uiPupMenuBegin(C, "OK?", ICON_QUESTION);
layout= uiPupMenuLayout(pup);
- uiItemFullO(layout, op->type->idname, message, 0, properties, WM_OP_EXEC_REGION_WIN, 0);
+ uiItemFullO(layout, op->type->idname, message, ICON_NULL, properties, WM_OP_EXEC_REGION_WIN, 0);
uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
-int WM_operator_confirm(bContext *C, wmOperator *op, wmEvent *event)
+int WM_operator_confirm(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
return WM_operator_confirm_message(C, op, NULL);
}
/* op->invoke, opens fileselect if path property not set, otherwise executes */
-int WM_operator_filesel(bContext *C, wmOperator *op, wmEvent *event)
+int WM_operator_filesel(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (RNA_property_is_set(op->ptr, "filepath")) {
return WM_operator_call(C, op);
@@ -861,55 +872,30 @@ int WM_operator_winactive(bContext *C)
return 1;
}
-/* op->invoke */
-static void redo_cb(bContext *C, void *arg_op, int event)
-{
- wmOperator *lastop= arg_op;
-
- if(lastop) {
- ED_undo_pop_op(C, lastop);
- WM_operator_repeat(C, lastop);
- }
-}
-
static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op)
{
- wmWindowManager *wm= CTX_wm_manager(C);
wmOperator *op= arg_op;
- PointerRNA ptr;
uiBlock *block;
uiLayout *layout;
uiStyle *style= U.uistyles.first;
- int columns= 2, width= 300;
+ int width= 300;
block= uiBeginBlock(C, ar, "redo_popup", UI_EMBOSS);
uiBlockClearFlag(block, UI_BLOCK_LOOP);
uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1|UI_BLOCK_MOVEMOUSE_QUIT);
- uiBlockSetHandleFunc(block, redo_cb, arg_op);
- if(!op->properties) {
- IDPropertyTemplate val = {0};
- op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties");
- }
+ /* if register is not enabled, the operator gets freed on OPERATOR_FINISHED
+ * ui_apply_but_funcs_after calls ED_undo_operator_repeate_cb and crashes */
+ assert(op->type->flag & OPTYPE_REGISTER);
- // XXX - hack, only for editing docs
- if(strcmp(op->type->idname, "WM_OT_doc_edit")==0) {
- columns= 1;
- width= 500;
- }
-
- RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
+ uiBlockSetHandleFunc(block, ED_undo_operator_repeat_cb_evt, arg_op);
layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, width, 20, style);
- uiItemL(layout, op->type->name, 0);
- if(op->type->ui) {
- op->layout= layout;
- op->type->ui((bContext*)C, op);
- op->layout= NULL;
- }
- else
- uiDefAutoButsRNA(C, layout, &ptr, columns);
+ if(ED_undo_valid(C, op->type->name)==0)
+ uiLayoutSetEnabled(layout, 0);
+
+ uiLayoutOperatorButs(C, layout, op, NULL, 'H', UI_LAYOUT_OP_SHOW_TITLE);
uiPopupBoundsBlock(block, 4.0f, 0, 0);
uiEndBlock(C, block);
@@ -928,7 +914,7 @@ static void dialog_exec_cb(bContext *C, void *arg1, void *arg2)
uiPupBlockClose(C, block);
}
-void dialog_check_cb(bContext *C, void *op_ptr, void *dummy2)
+void dialog_check_cb(bContext *C, void *op_ptr, void *UNUSED(arg))
{
wmOperator *op= op_ptr;
if(op->type->check) {
@@ -942,45 +928,31 @@ void dialog_check_cb(bContext *C, void *op_ptr, void *dummy2)
static uiBlock *wm_block_create_dialog(bContext *C, ARegion *ar, void *userData)
{
struct { wmOperator *op; int width; int height; } * data = userData;
- wmWindowManager *wm= CTX_wm_manager(C);
wmOperator *op= data->op;
- PointerRNA ptr;
uiBlock *block;
uiLayout *layout;
uiBut *btn;
uiStyle *style= U.uistyles.first;
- int columns= 2;
block = uiBeginBlock(C, ar, "operator dialog", UI_EMBOSS);
uiBlockClearFlag(block, UI_BLOCK_LOOP);
uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1|UI_BLOCK_MOVEMOUSE_QUIT);
- if (!op->properties) {
- IDPropertyTemplate val = {0};
- op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties");
- }
-
- RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, data->width, data->height, style);
- uiItemL(layout, op->type->name, 0);
uiBlockSetFunc(block, dialog_check_cb, op, NULL);
- if (op->type->ui) {
- op->layout= layout;
- op->type->ui((bContext*)C, op);
- op->layout= NULL;
- }
- else
- uiDefAutoButsRNA(C, layout, &ptr, columns);
+ uiLayoutOperatorButs(C, layout, op, NULL, 'H', UI_LAYOUT_OP_SHOW_TITLE);
+ /* clear so the OK button is left alone */
uiBlockSetFunc(block, NULL, NULL, NULL);
/* Create OK button, the callback of which will execute op */
btn= uiDefBut(block, BUT, 0, "OK", 0, 0, 0, 20, NULL, 0, 0, 0, 0, "");
uiButSetFunc(btn, dialog_exec_cb, op, block);
- uiPopupBoundsBlock(block, 4.0f, 0, 0);
+ /* center around the mouse */
+ uiPopupBoundsBlock(block, 4.0f, data->width/-2, data->height/2);
uiEndBlock(C, block);
return block;
@@ -989,9 +961,7 @@ static uiBlock *wm_block_create_dialog(bContext *C, ARegion *ar, void *userData)
static uiBlock *wm_operator_create_ui(bContext *C, ARegion *ar, void *userData)
{
struct { wmOperator *op; int width; int height; } * data = userData;
- wmWindowManager *wm= CTX_wm_manager(C);
wmOperator *op= data->op;
- PointerRNA ptr;
uiBlock *block;
uiLayout *layout;
uiStyle *style= U.uistyles.first;
@@ -1000,19 +970,10 @@ static uiBlock *wm_operator_create_ui(bContext *C, ARegion *ar, void *userData)
uiBlockClearFlag(block, UI_BLOCK_LOOP);
uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1|UI_BLOCK_MOVEMOUSE_QUIT);
- if(!op->properties) {
- IDPropertyTemplate val = {0};
- op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties");
- }
-
- RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, data->width, data->height, style);
- if(op->type->ui) {
- op->layout= layout;
- op->type->ui((bContext*)C, op);
- op->layout= NULL;
- }
+ /* since ui is defined the auto-layout args are not used */
+ uiLayoutOperatorButs(C, layout, op, NULL, 'V', 0);
uiPopupBoundsBlock(block, 4.0f, 0, 0);
uiEndBlock(C, block);
@@ -1020,20 +981,21 @@ static uiBlock *wm_operator_create_ui(bContext *C, ARegion *ar, void *userData)
return block;
}
-int WM_operator_props_popup(bContext *C, wmOperator *op, wmEvent *event)
+/* operator menu needs undo, for redo callback */
+int WM_operator_props_popup(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
- int retval= OPERATOR_CANCELLED;
- if(op->type->exec) {
- retval= op->type->exec(C, op);
-
- /* ED_undo_push_op(C, op), called by wm_operator_finished now. */
+ if((op->type->flag & OPTYPE_REGISTER)==0) {
+ BKE_reportf(op->reports, RPT_ERROR, "Operator '%s' does not have register enabled, incorrect invoke function.", op->type->idname);
+ return OPERATOR_CANCELLED;
}
+
+ ED_undo_push_op(C, op);
+ wm_operator_register(C, op);
- if(retval != OPERATOR_CANCELLED)
- uiPupBlock(C, wm_block_create_redo, op);
+ uiPupBlock(C, wm_block_create_redo, op);
- return retval;
+ return OPERATOR_RUNNING_MODAL;
}
int WM_operator_props_dialog_popup(bContext *C, wmOperator *op, int width, int height)
@@ -1062,6 +1024,11 @@ int WM_operator_ui_popup(bContext *C, wmOperator *op, int width, int height)
int WM_operator_redo_popup(bContext *C, wmOperator *op)
{
+ if((op->type->flag & OPTYPE_REGISTER)==0) {
+ BKE_reportf(op->reports, RPT_ERROR, "Operator '%s' does not have register enabled, incorrect invoke function.", op->type->idname);
+ return OPERATOR_CANCELLED;
+ }
+
uiPupBlock(C, wm_block_create_redo, op);
return OPERATOR_CANCELLED;
@@ -1069,52 +1036,19 @@ int WM_operator_redo_popup(bContext *C, wmOperator *op)
/* ***************** Debug menu ************************* */
-static uiBlock *wm_block_create_menu(bContext *C, ARegion *ar, void *arg_op)
-{
- wmOperator *op= arg_op;
- uiBlock *block;
- uiLayout *layout;
- uiStyle *style= U.uistyles.first;
-
- block= uiBeginBlock(C, ar, "_popup", UI_EMBOSS);
- uiBlockClearFlag(block, UI_BLOCK_LOOP);
- uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1|UI_BLOCK_MOVEMOUSE_QUIT);
-
- layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 300, 20, style);
- uiItemL(layout, op->type->name, 0);
-
- if(op->type->ui) {
- op->layout= layout;
- op->type->ui(C, op);
- op->layout= NULL;
- }
- else
- uiDefAutoButsRNA(C, layout, op->ptr, 2);
-
- uiPopupBoundsBlock(block, 4.0f, 0, 0);
- uiEndBlock(C, block);
-
- return block;
-}
-
static int wm_debug_menu_exec(bContext *C, wmOperator *op)
{
- G.rt= RNA_int_get(op->ptr, "debugval");
+ G.rt= RNA_int_get(op->ptr, "debug_value");
ED_screen_refresh(CTX_wm_manager(C), CTX_wm_window(C));
WM_event_add_notifier(C, NC_WINDOW, NULL);
-
+
return OPERATOR_FINISHED;
}
-static int wm_debug_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_debug_menu_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
-
- RNA_int_set(op->ptr, "debugval", G.rt);
-
- /* pass on operator, so return modal */
- uiPupBlockOperator(C, wm_block_create_menu, op, WM_OP_EXEC_DEFAULT);
-
- return OPERATOR_RUNNING_MODAL;
+ RNA_int_set(op->ptr, "debug_value", G.rt);
+ return WM_operator_props_dialog_popup(C, op, 180, 20);
}
static void WM_OT_debug_menu(wmOperatorType *ot)
@@ -1127,13 +1061,13 @@ static void WM_OT_debug_menu(wmOperatorType *ot)
ot->exec= wm_debug_menu_exec;
ot->poll= WM_operator_winactive;
- RNA_def_int(ot->srna, "debugval", 0, -10000, 10000, "Debug Value", "", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "debug_value", 0, -10000, 10000, "Debug Value", "", INT_MIN, INT_MAX);
}
/* ***************** Splash Screen ************************* */
-static void wm_block_splash_close(bContext *C, void *arg_block, void *arg_unused)
+static void wm_block_splash_close(bContext *C, void *arg_block, void *UNUSED(arg))
{
uiPupBlockClose(C, arg_block);
}
@@ -1142,7 +1076,7 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unuse
/* XXX: hack to refresh splash screen with updated prest menu name,
* since popup blocks don't get regenerated like panels do */
-void wm_block_splash_refreshmenu (bContext *C, void *arg_block, void *unused)
+void wm_block_splash_refreshmenu (bContext *UNUSED(C), void *UNUSED(arg_block), void *UNUSED(arg))
{
/* ugh, causes crashes in other buttons, disabling for now until
* a better fix
@@ -1151,7 +1085,7 @@ void wm_block_splash_refreshmenu (bContext *C, void *arg_block, void *unused)
*/
}
-static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unused)
+static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(arg))
{
uiBlock *block;
uiBut *but;
@@ -1159,7 +1093,6 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unuse
uiStyle *style= U.uistyles.first;
struct RecentFile *recent;
int i;
- Menu menu= {0};
MenuType *mt= WM_menutype_find("USERPREF_MT_splash", TRUE);
char url[64];
@@ -1199,9 +1132,13 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unuse
uiBlockSetEmboss(block, UI_EMBOSS);
/* show the splash menu (containing interaction presets), using python */
if (mt) {
+ Menu menu= {0};
menu.layout= layout;
menu.type= mt;
mt->draw(C, &menu);
+
+// wmWindowManager *wm= CTX_wm_manager(C);
+// uiItemM(layout, C, "USERPREF_MT_keyconfigs", U.keyconfigstr, ICON_NULL);
}
uiBlockSetEmboss(block, UI_EMBOSSP);
@@ -1209,24 +1146,24 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unuse
split = uiLayoutSplit(layout, 0, 0);
col = uiLayoutColumn(split, 0);
- uiItemL(col, "Links", 0);
+ uiItemL(col, "Links", ICON_NULL);
uiItemStringO(col, "Donations", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/blenderorg/blender-foundation/donation-payment/");
- uiItemStringO(col, "Release Log", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/release-logs/blender-250/");
+ uiItemStringO(col, "Release Log", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/release-logs/blender-256-beta/");
uiItemStringO(col, "Manual", ICON_URL, "WM_OT_url_open", "url", "http://wiki.blender.org/index.php/Doc:Manual");
uiItemStringO(col, "Blender Website", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/");
uiItemStringO(col, "User Community", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/community/user-community/"); //
BLI_snprintf(url, sizeof(url), "http://www.blender.org/documentation/blender_python_api_%d_%d_%d", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION);
uiItemStringO(col, "Python API Reference", ICON_URL, "WM_OT_url_open", "url", url);
- uiItemL(col, "", 0);
+ uiItemL(col, "", ICON_NULL);
col = uiLayoutColumn(split, 0);
- uiItemL(col, "Recent", 0);
+ uiItemL(col, "Recent", ICON_NULL);
for(recent = G.recent_files.first, i=0; (i<5) && (recent); recent = recent->next, i++) {
uiItemStringO(col, BLI_path_basename(recent->filepath), ICON_FILE_BLEND, "WM_OT_open_mainfile", "filepath", recent->filepath);
}
uiItemS(col);
uiItemO(col, NULL, ICON_RECOVER_LAST, "WM_OT_recover_last_session");
- uiItemL(col, "", 0);
+ uiItemL(col, "", ICON_NULL);
uiCenteredBoundsBlock(block, 0.0f);
uiEndBlock(C, block);
@@ -1234,7 +1171,7 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unuse
return block;
}
-static int wm_splash_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_splash_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
uiPupBlock(C, wm_block_create_splash, NULL);
@@ -1253,7 +1190,7 @@ static void WM_OT_splash(wmOperatorType *ot)
/* ***************** Search menu ************************* */
-static void operator_call_cb(struct bContext *C, void *arg1, void *arg2)
+static void operator_call_cb(struct bContext *C, void *UNUSED(arg1), void *arg2)
{
wmOperatorType *ot= arg2;
@@ -1261,7 +1198,7 @@ static void operator_call_cb(struct bContext *C, void *arg1, void *arg2)
WM_operator_name_call(C, ot->idname, WM_OP_INVOKE_DEFAULT, NULL);
}
-static void operator_search_cb(const struct bContext *C, void *arg, char *str, uiSearchItems *items)
+static void operator_search_cb(const struct bContext *C, void *UNUSED(arg), const char *str, uiSearchItems *items)
{
wmOperatorType *ot = WM_operatortype_first();
@@ -1288,7 +1225,7 @@ static void operator_search_cb(const struct bContext *C, void *arg, char *str, u
}
}
-static uiBlock *wm_block_search_menu(bContext *C, ARegion *ar, void *arg_op)
+static uiBlock *wm_block_search_menu(bContext *C, ARegion *ar, void *UNUSED(arg_op))
{
static char search[256]= "";
wmEvent event;
@@ -1318,15 +1255,13 @@ static uiBlock *wm_block_search_menu(bContext *C, ARegion *ar, void *arg_op)
return block;
}
-static int wm_search_menu_exec(bContext *C, wmOperator *op)
+static int wm_search_menu_exec(bContext *UNUSED(C), wmOperator *UNUSED(op))
{
-
return OPERATOR_FINISHED;
}
-static int wm_search_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_search_menu_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
-
uiPupBlock(C, wm_block_search_menu, op);
return OPERATOR_CANCELLED;
@@ -1392,7 +1327,7 @@ static void WM_OT_window_duplicate(wmOperatorType *ot)
ot->idname= "WM_OT_window_duplicate";
ot->description="Duplicate the current Blender window";
- ot->exec= wm_window_duplicate_op;
+ ot->exec= wm_window_duplicate_exec;
ot->poll= wm_operator_winactive_normal;
}
@@ -1414,10 +1349,19 @@ static void WM_OT_read_homefile(wmOperatorType *ot)
ot->description="Open the default file (doesn't save the current file)";
ot->invoke= WM_operator_confirm;
- ot->exec= WM_read_homefile;
- ot->poll= WM_operator_winactive;
+ ot->exec= WM_read_homefile_exec;
+ /* ommit poll to run in background mode */
+}
+
+static void WM_OT_read_factory_settings(wmOperatorType *ot)
+{
+ ot->name= "Load Factory Settings";
+ ot->idname= "WM_OT_read_factory_settings";
+ ot->description="Load default file and user preferences";
- RNA_def_boolean(ot->srna, "factory", 0, "Factory Settings", "");
+ ot->invoke= WM_operator_confirm;
+ ot->exec= WM_read_homefile_exec;
+ /* ommit poll to run in background mode */
}
/* *************** open file **************** */
@@ -1434,9 +1378,17 @@ static void open_set_use_scripts(wmOperator *op)
RNA_boolean_set(op->ptr, "use_scripts", !(U.flag & USER_SCRIPT_AUTOEXEC_DISABLE));
}
-static int wm_open_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_open_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
- RNA_string_set(op->ptr, "filepath", G.sce);
+ const char *openname= G.main->name;
+
+ /* if possible, get the name of the most recently used .blend file */
+ if (G.recent_files.first) {
+ struct RecentFile *recent = G.recent_files.first;
+ openname = recent->filepath;
+ }
+
+ RNA_string_set(op->ptr, "filepath", openname);
open_set_load_ui(op);
open_set_use_scripts(op);
@@ -1490,7 +1442,7 @@ static void WM_OT_open_mainfile(wmOperatorType *ot)
/* **************** link/append *************** */
-static int wm_link_append_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_link_append_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if(!RNA_property_is_set(op->ptr, "relative_path"))
RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
@@ -1715,7 +1667,7 @@ static int wm_recover_auto_save_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int wm_recover_auto_save_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_recover_auto_save_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
char filename[FILE_MAX];
@@ -1763,13 +1715,20 @@ static void save_set_compress(wmOperator *op)
}
}
-static int wm_save_as_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_save_as_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
char name[FILE_MAX];
save_set_compress(op);
- BLI_strncpy(name, G.sce, FILE_MAX);
+ /* if not saved before, get the name of the most recently used .blend file */
+ if(G.main->name[0]==0 && G.recent_files.first) {
+ struct RecentFile *recent = G.recent_files.first;
+ BLI_strncpy(name, recent->filepath, FILE_MAX);
+ }
+ else
+ BLI_strncpy(name, G.main->name, FILE_MAX);
+
untitled(name);
RNA_string_set(op->ptr, "filepath", name);
@@ -1790,7 +1749,7 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op)
if(RNA_property_is_set(op->ptr, "filepath"))
RNA_string_get(op->ptr, "filepath", path);
else {
- BLI_strncpy(path, G.sce, FILE_MAX);
+ BLI_strncpy(path, G.main->name, FILE_MAX);
untitled(path);
}
@@ -1814,7 +1773,7 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op)
}
/* function used for WM_OT_save_mainfile too */
-static int blend_save_check(bContext *C, wmOperator *op)
+static int blend_save_check(bContext *UNUSED(C), wmOperator *op)
{
char filepath[FILE_MAX];
RNA_string_get(op->ptr, "filepath", filepath);
@@ -1834,8 +1793,8 @@ static void WM_OT_save_as_mainfile(wmOperatorType *ot)
ot->invoke= wm_save_as_mainfile_invoke;
ot->exec= wm_save_as_mainfile_exec;
ot->check= blend_save_check;
- ot->poll= WM_operator_winactive;
-
+ /* ommit window poll so this can work in background mode */
+
WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE, FILE_BLENDER, FILE_SAVE, WM_FILESEL_FILEPATH);
RNA_def_boolean(ot->srna, "compress", 0, "Compress", "Write compressed .blend file");
RNA_def_boolean(ot->srna, "relative_remap", 1, "Remap Relative", "Remap relative paths when saving in a different directory");
@@ -1844,7 +1803,7 @@ static void WM_OT_save_as_mainfile(wmOperatorType *ot)
/* *************** save file directly ******** */
-static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
char name[FILE_MAX];
int check_existing=1;
@@ -1854,9 +1813,17 @@ static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_CANCELLED;
save_set_compress(op);
-
- BLI_strncpy(name, G.sce, FILE_MAX);
+
+ /* if not saved before, get the name of the most recently used .blend file */
+ if(G.main->name[0]==0 && G.recent_files.first) {
+ struct RecentFile *recent = G.recent_files.first;
+ BLI_strncpy(name, recent->filepath, FILE_MAX);
+ }
+ else
+ BLI_strncpy(name, G.main->name, FILE_MAX);
+
untitled(name);
+
RNA_string_set(op->ptr, "filepath", name);
if (RNA_struct_find_property(op->ptr, "check_existing"))
@@ -1897,11 +1864,11 @@ static void WM_OT_save_mainfile(wmOperatorType *ot)
#include "../../collada/collada.h"
-static int wm_collada_export_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_collada_export_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if(!RNA_property_is_set(op->ptr, "filepath")) {
- char *filepath[FILE_MAX];
- BLI_strncpy(filepath, G.sce, sizeof(filepath));
+ char filepath[FILE_MAX];
+ BLI_strncpy(filepath, G.main->name, sizeof(filepath));
BLI_replace_extension(filepath, sizeof(filepath), ".dae");
RNA_string_set(op->ptr, "filepath", filepath);
}
@@ -1979,7 +1946,7 @@ static void WM_OT_window_fullscreen_toggle(wmOperatorType *ot)
ot->idname= "WM_OT_window_fullscreen_toggle";
ot->description="Toggle the current window fullscreen";
- ot->exec= wm_window_fullscreen_toggle_op;
+ ot->exec= wm_window_fullscreen_toggle_exec;
ot->poll= WM_operator_winactive;
}
@@ -1992,10 +1959,10 @@ static int wm_exit_blender_op(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static void WM_OT_exit_blender(wmOperatorType *ot)
+static void WM_OT_quit_blender(wmOperatorType *ot)
{
- ot->name= "Exit Blender";
- ot->idname= "WM_OT_exit_blender";
+ ot->name= "Quit Blender";
+ ot->idname= "WM_OT_quit_blender";
ot->description= "Quit Blender";
ot->invoke= WM_operator_confirm;
@@ -2003,6 +1970,43 @@ static void WM_OT_exit_blender(wmOperatorType *ot)
ot->poll= WM_operator_winactive;
}
+/* *********************** */
+#if defined(WIN32)
+static int console= 1;
+void WM_toggle_console(bContext *UNUSED(C), short show)
+{
+ if(show) {
+ ShowWindow(GetConsoleWindow(),SW_SHOW);
+ console= 1;
+ }
+ else {
+ ShowWindow(GetConsoleWindow(),SW_HIDE);
+ console= 0;
+ }
+}
+
+static int wm_toggle_console_op(bContext *C, wmOperator *UNUSED(op))
+{
+ if(console) {
+ WM_toggle_console(C, 0);
+ }
+ else {
+ WM_toggle_console(C, 1);
+ }
+ return OPERATOR_FINISHED;
+}
+
+static void WM_OT_toggle_console(wmOperatorType *ot)
+{
+ ot->name= "Toggle System Console";
+ ot->idname= "WM_OT_toggle_console";
+ ot->description= "Toggle System Console";
+
+ ot->exec= wm_toggle_console_op;
+ ot->poll= WM_operator_winactive;
+}
+#endif
+
/* ************ default paint cursors, draw always around cursor *********** */
/*
- returns handler to free
@@ -2295,19 +2299,19 @@ static void tweak_gesture_modal(bContext *C, wmEvent *event)
rect->xmax= event->x - sx;
rect->ymax= event->y - sy;
- if((val= wm_gesture_evaluate(C, gesture))) {
- wmEvent event;
+ if((val= wm_gesture_evaluate(gesture))) {
+ wmEvent tevent;
- event= *(window->eventstate);
+ tevent= *(window->eventstate);
if(gesture->event_type==LEFTMOUSE)
- event.type= EVT_TWEAK_L;
+ tevent.type= EVT_TWEAK_L;
else if(gesture->event_type==RIGHTMOUSE)
- event.type= EVT_TWEAK_R;
+ tevent.type= EVT_TWEAK_R;
else
- event.type= EVT_TWEAK_M;
- event.val= val;
+ tevent.type= EVT_TWEAK_M;
+ tevent.val= val;
/* mouse coords! */
- wm_event_add(window, &event);
+ wm_event_add(window, &tevent);
WM_gesture_end(C, gesture); /* frees gesture itself, and unregisters from window */
}
@@ -2388,7 +2392,7 @@ int WM_gesture_lines_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
-static void gesture_lasso_apply(bContext *C, wmOperator *op, int event_type)
+static void gesture_lasso_apply(bContext *C, wmOperator *op)
{
wmGesture *gesture= op->customdata;
PointerRNA itemptr;
@@ -2435,11 +2439,21 @@ int WM_gesture_lasso_modal(bContext *C, wmOperator *op, wmEvent *event)
}
{
+ short x, y;
short *lasso= gesture->customdata;
- lasso += 2 * gesture->points;
- lasso[0] = event->x - sx;
- lasso[1] = event->y - sy;
- gesture->points++;
+
+ lasso += (2 * gesture->points - 2);
+ x = (event->x - sx - lasso[0]);
+ y = (event->y - sy - lasso[1]);
+
+ /* make a simple distance check to get a smoother lasso
+ add only when at least 2 pixels between this and previous location */
+ if((x*x+y*y) > 4) {
+ lasso += 2;
+ lasso[0] = event->x - sx;
+ lasso[1] = event->y - sy;
+ gesture->points++;
+ }
}
break;
@@ -2447,7 +2461,7 @@ int WM_gesture_lasso_modal(bContext *C, wmOperator *op, wmEvent *event)
case MIDDLEMOUSE:
case RIGHTMOUSE:
if(event->val==KM_RELEASE) { /* key release */
- gesture_lasso_apply(C, op, event->type);
+ gesture_lasso_apply(C, op);
return OPERATOR_FINISHED;
}
break;
@@ -2687,8 +2701,6 @@ static void wm_radial_control_paint(bContext *C, int x, int y, void *customdata)
glutil_draw_lined_arc(0.0, M_PI*2.0, r1, 40);
glutil_draw_lined_arc(0.0, M_PI*2.0, r2, 40);
glDisable(GL_BLEND);
-
- glPopMatrix();
}
int WM_radial_control_modal(bContext *C, wmOperator *op, wmEvent *event)
@@ -2779,7 +2791,10 @@ int WM_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event)
int mode = RNA_int_get(op->ptr, "mode");
float initial_value = RNA_float_get(op->ptr, "initial_value");
//float initial_size = RNA_float_get(op->ptr, "initial_size");
- int mouse[2] = {event->x, event->y};
+ int mouse[2];
+
+ mouse[0]= event->x;
+ mouse[1]= event->y;
//if (initial_size == 0)
// initial_size = WM_RADIAL_CONTROL_DISPLAY_SIZE;
@@ -2840,11 +2855,11 @@ void WM_radial_control_string(wmOperator *op, char str[], int maxlen)
float v = RNA_float_get(op->ptr, "new_value");
if(mode == WM_RADIALCONTROL_SIZE)
- sprintf(str, "Size: %d", (int)v);
+ BLI_snprintf(str, maxlen, "Size: %d", (int)v);
else if(mode == WM_RADIALCONTROL_STRENGTH)
- sprintf(str, "Strength: %d", (int)v);
+ BLI_snprintf(str, maxlen, "Strength: %d", (int)v);
else if(mode == WM_RADIALCONTROL_ANGLE)
- sprintf(str, "Angle: %d", (int)(v * 180.0f/M_PI));
+ BLI_snprintf(str, maxlen, "Angle: %d", (int)(v * 180.0f/M_PI));
}
/** Important: this doesn't define an actual operator, it
@@ -2915,7 +2930,8 @@ static int redraw_timer_exec(bContext *C, wmOperator *op)
for(a=0; a<iter; a++) {
if (type==0) {
- ED_region_do_draw(C, ar);
+ if(ar)
+ ED_region_do_draw(C, ar);
}
else if (type==1) {
wmWindow *win= CTX_wm_window(C);
@@ -3011,7 +3027,7 @@ static void WM_OT_redraw_timer(wmOperatorType *ot)
/* ************************** memory statistics for testing ***************** */
-static int memory_statistics_exec(bContext *C, wmOperator *op)
+static int memory_statistics_exec(bContext *UNUSED(C), wmOperator *UNUSED(op))
{
MEM_printmemlist_stats();
return OPERATOR_FINISHED;
@@ -3038,7 +3054,7 @@ void wm_operatortype_free(void)
wm_operatortype_free_macro(ot);
if(ot->ext.srna) /* python operator, allocs own string */
- MEM_freeN(ot->idname);
+ MEM_freeN((void *)ot->idname);
}
BLI_freelistN(&global_ops);
@@ -3049,9 +3065,10 @@ void wm_operatortype_init(void)
{
WM_operatortype_append(WM_OT_window_duplicate);
WM_operatortype_append(WM_OT_read_homefile);
+ WM_operatortype_append(WM_OT_read_factory_settings);
WM_operatortype_append(WM_OT_save_homefile);
WM_operatortype_append(WM_OT_window_fullscreen_toggle);
- WM_operatortype_append(WM_OT_exit_blender);
+ WM_operatortype_append(WM_OT_quit_blender);
WM_operatortype_append(WM_OT_open_mainfile);
WM_operatortype_append(WM_OT_link_append);
WM_operatortype_append(WM_OT_recover_last_session);
@@ -3064,6 +3081,9 @@ void wm_operatortype_init(void)
WM_operatortype_append(WM_OT_splash);
WM_operatortype_append(WM_OT_search_menu);
WM_operatortype_append(WM_OT_call_menu);
+#if defined(WIN32)
+ WM_operatortype_append(WM_OT_toggle_console);
+#endif
#ifdef WITH_COLLADA
/* XXX: move these */
@@ -3190,7 +3210,7 @@ static void gesture_border_modal_keymap(wmKeyConfig *keyconf)
WM_modalkeymap_assign(keymap, "ACTION_OT_select_border");
WM_modalkeymap_assign(keymap, "ANIM_OT_channels_select_border");
WM_modalkeymap_assign(keymap, "ANIM_OT_previewrange_set");
- WM_modalkeymap_assign(keymap, "CONSOLE_OT_select_border");
+ WM_modalkeymap_assign(keymap, "INFO_OT_select_border");
WM_modalkeymap_assign(keymap, "FILE_OT_select_border");
WM_modalkeymap_assign(keymap, "GRAPH_OT_select_border");
WM_modalkeymap_assign(keymap, "MARKER_OT_select_border");
@@ -3253,7 +3273,7 @@ void wm_window_keymap(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "WM_OT_open_mainfile", OKEY, KM_PRESS, KM_OSKEY, 0);
WM_keymap_add_item(keymap, "WM_OT_save_mainfile", SKEY, KM_PRESS, KM_OSKEY, 0);
WM_keymap_add_item(keymap, "WM_OT_save_as_mainfile", SKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "WM_OT_exit_blender", QKEY, KM_PRESS, KM_OSKEY, 0);
+ WM_keymap_add_item(keymap, "WM_OT_quit_blender", QKEY, KM_PRESS, KM_OSKEY, 0);
#endif
WM_keymap_add_item(keymap, "WM_OT_read_homefile", NKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "WM_OT_save_homefile", UKEY, KM_PRESS, KM_CTRL, 0);
@@ -3273,7 +3293,7 @@ void wm_window_keymap(wmKeyConfig *keyconf)
RNA_boolean_set(kmi->ptr, "copy", 1);
WM_keymap_verify_item(keymap, "WM_OT_window_fullscreen_toggle", F11KEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "WM_OT_exit_blender", QKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "WM_OT_quit_blender", QKEY, KM_PRESS, KM_CTRL, 0);
/* debug/testing */
WM_keymap_verify_item(keymap, "WM_OT_redraw_timer", TKEY, KM_PRESS, KM_ALT|KM_CTRL, 0);
@@ -3334,14 +3354,12 @@ void wm_window_keymap(wmKeyConfig *keyconf)
}
/* Generic itemf's for operators that take library args */
-static EnumPropertyItem *rna_id_itemf(bContext *C, PointerRNA *ptr, int *free, ID *id, int local)
+static EnumPropertyItem *rna_id_itemf(bContext *UNUSED(C), PointerRNA *UNUSED(ptr), int *do_free, ID *id, int local)
{
- EnumPropertyItem *item= NULL, item_tmp;
+ EnumPropertyItem item_tmp= {0}, *item= NULL;
int totitem= 0;
int i= 0;
- memset(&item_tmp, 0, sizeof(item_tmp));
-
for( ; id; id= id->next) {
if(local==FALSE || id->lib==NULL) {
item_tmp.identifier= item_tmp.name= id->name+2;
@@ -3351,44 +3369,44 @@ static EnumPropertyItem *rna_id_itemf(bContext *C, PointerRNA *ptr, int *free, I
}
RNA_enum_item_end(&item, &totitem);
- *free= 1;
+ *do_free= 1;
return item;
}
/* can add more as needed */
-EnumPropertyItem *RNA_action_itemf(bContext *C, PointerRNA *ptr, int *free)
+EnumPropertyItem *RNA_action_itemf(bContext *C, PointerRNA *ptr, int *do_free)
{
- return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->action.first : NULL, FALSE);
+ return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->action.first : NULL, FALSE);
}
-EnumPropertyItem *RNA_action_local_itemf(bContext *C, PointerRNA *ptr, int *free)
+EnumPropertyItem *RNA_action_local_itemf(bContext *C, PointerRNA *ptr, int *do_free)
{
- return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->action.first : NULL, TRUE);
+ return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->action.first : NULL, TRUE);
}
-EnumPropertyItem *RNA_group_itemf(bContext *C, PointerRNA *ptr, int *free)
+EnumPropertyItem *RNA_group_itemf(bContext *C, PointerRNA *ptr, int *do_free)
{
- return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->group.first : NULL, FALSE);
+ return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->group.first : NULL, FALSE);
}
-EnumPropertyItem *RNA_group_local_itemf(bContext *C, PointerRNA *ptr, int *free)
+EnumPropertyItem *RNA_group_local_itemf(bContext *C, PointerRNA *ptr, int *do_free)
{
- return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->group.first : NULL, TRUE);
+ return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->group.first : NULL, TRUE);
}
-EnumPropertyItem *RNA_image_itemf(bContext *C, PointerRNA *ptr, int *free)
+EnumPropertyItem *RNA_image_itemf(bContext *C, PointerRNA *ptr, int *do_free)
{
- return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->image.first : NULL, FALSE);
+ return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->image.first : NULL, FALSE);
}
-EnumPropertyItem *RNA_image_local_itemf(bContext *C, PointerRNA *ptr, int *free)
+EnumPropertyItem *RNA_image_local_itemf(bContext *C, PointerRNA *ptr, int *do_free)
{
- return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->image.first : NULL, TRUE);
+ return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->image.first : NULL, TRUE);
}
-EnumPropertyItem *RNA_scene_itemf(bContext *C, PointerRNA *ptr, int *free)
+EnumPropertyItem *RNA_scene_itemf(bContext *C, PointerRNA *ptr, int *do_free)
{
- return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->scene.first : NULL, FALSE);
+ return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->scene.first : NULL, FALSE);
}
-EnumPropertyItem *RNA_scene_local_itemf(bContext *C, PointerRNA *ptr, int *free)
+EnumPropertyItem *RNA_scene_local_itemf(bContext *C, PointerRNA *ptr, int *do_free)
{
- return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->scene.first : NULL, TRUE);
+ return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->scene.first : NULL, TRUE);
}
diff --git a/source/blender/windowmanager/intern/wm_subwindow.c b/source/blender/windowmanager/intern/wm_subwindow.c
index 207b6cebfe6..c08df0ccd75 100644
--- a/source/blender/windowmanager/intern/wm_subwindow.c
+++ b/source/blender/windowmanager/intern/wm_subwindow.c
@@ -39,6 +39,8 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
#include "BKE_global.h"
@@ -73,7 +75,7 @@ typedef struct wmSubWindow {
/* ******************* open, free, set, get data ******************** */
/* not subwindow itself */
-static void wm_subwindow_free(wmSubWindow *swin)
+static void wm_subwindow_free(wmSubWindow *UNUSED(swin))
{
/* future fancy stuff */
}
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 4baad110232..db427ea68d1 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -41,11 +41,14 @@
#include "GHOST_C-api.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_blender.h"
#include "BKE_context.h"
+#include "BKE_library.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
+#include "BKE_main.h"
+
#include "BIF_gl.h"
@@ -58,16 +61,19 @@
#include "wm_event_system.h"
#include "ED_screen.h"
+#include "ED_fileselect.h"
#include "PIL_time.h"
#include "GPU_draw.h"
+#include "GPU_extensions.h"
/* the global to talk to ghost */
GHOST_SystemHandle g_system= NULL;
/* set by commandline */
static int prefsizx= 0, prefsizy= 0, prefstax= 0, prefstay= 0, initialstate= GHOST_kWindowStateNormal;
+static unsigned short useprefsize= 0;
/* ******** win open & close ************ */
@@ -144,10 +150,9 @@ void wm_window_free(bContext *C, wmWindowManager *wm, wmWindow *win)
CTX_wm_window_set(C, NULL);
}
- if(wm->windrawable==win)
- wm->windrawable= NULL;
- if(wm->winactive==win)
- wm->winactive= NULL;
+ /* always set drawable and active to NULL, prevents non-drawable state of main windows (bugs #22967 and #25071, possibly #22477 too) */
+ wm->windrawable= NULL;
+ wm->winactive= NULL;
/* end running jobs, a job end also removes its timer */
for(wt= wm->timers.first; wt; wt= wtnext) {
@@ -213,7 +218,7 @@ wmWindow *wm_window_copy(bContext *C, wmWindow *winorig)
/* duplicate assigns to window */
win->screen= ED_screen_duplicate(win, winorig->screen);
- BLI_strncpy(win->screenname, win->screen->id.name+2, 21);
+ BLI_strncpy(win->screenname, win->screen->id.name+2, sizeof(win->screenname));
win->screen->winid= win->winid;
win->screen->do_refresh= 1;
@@ -234,13 +239,20 @@ void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win)
CTX_wm_window_set(C, win); /* needed by handlers */
WM_event_remove_handlers(C, &win->handlers);
WM_event_remove_handlers(C, &win->modalhandlers);
- ED_screen_exit(C, win, win->screen); /* will free the current screen if it is a temp layout */
+ ED_screen_exit(C, win, win->screen);
+
+ /* if temp screen, delete it */
+ if(win->screen->temp) {
+ Main *bmain= CTX_data_main(C);
+ free_libblock(&bmain->screen, win->screen);
+ }
+
wm_window_free(C, wm, win);
/* check remaining windows */
if(wm->windows.first) {
for(win= wm->windows.first; win; win= win->next)
- if(win->screen->full!=SCREENTEMP)
+ if(win->screen->temp == 0)
break;
/* in this case we close all */
if(win==NULL)
@@ -253,23 +265,21 @@ void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win)
void wm_window_title(wmWindowManager *wm, wmWindow *win)
{
/* handle the 'temp' window */
- if(win->screen && win->screen->full==SCREENTEMP) {
+ if(win->screen && win->screen->temp) {
GHOST_SetTitle(win->ghostwin, "Blender");
}
else {
/* this is set to 1 if you don't have startup.blend open */
- if(G.save_over) {
- char *str= MEM_mallocN(strlen(G.sce) + 16, "title");
+ if(G.save_over && G.main->name[0]) {
+ char str[sizeof(G.main->name) + 12];
if(wm->file_saved)
- sprintf(str, "Blender [%s]", G.sce);
+ sprintf(str, "Blender [%s]", G.main->name);
else
- sprintf(str, "Blender* [%s]", G.sce);
+ sprintf(str, "Blender* [%s]", G.main->name);
GHOST_SetTitle(win->ghostwin, str);
-
- MEM_freeN(str);
}
else
GHOST_SetTitle(win->ghostwin, "Blender");
@@ -289,7 +299,7 @@ void wm_window_title(wmWindowManager *wm, wmWindow *win)
}
/* belongs to below */
-static void wm_window_add_ghostwindow(bContext *C, wmWindowManager *wm, char *title, wmWindow *win)
+static void wm_window_add_ghostwindow(bContext *C, const char *title, wmWindow *win)
{
GHOST_WindowHandle ghostwin;
int scr_w, scr_h, posy;
@@ -307,7 +317,7 @@ static void wm_window_add_ghostwindow(bContext *C, wmWindowManager *wm, char *ti
#if defined(__APPLE__) && !defined(GHOST_COCOA)
{
extern int macPrefState; /* creator.c */
- inital_state += macPrefState;
+ initial_state += macPrefState;
}
#endif
/* Disable AA for now, as GL_SELECT (used for border, lasso, ... select)
@@ -320,6 +330,8 @@ static void wm_window_add_ghostwindow(bContext *C, wmWindowManager *wm, char *ti
0 /* no AA */);
if (ghostwin) {
+ /* needed so we can detect the graphics card below */
+ GPU_extensions_init();
/* set the state*/
GHOST_SetWindowState(ghostwin, initial_state);
@@ -332,7 +344,11 @@ static void wm_window_add_ghostwindow(bContext *C, wmWindowManager *wm, char *ti
/* until screens get drawn, make it nice grey */
glClearColor(.55, .55, .55, 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
+ /* Crash on OSS ATI: bugs.launchpad.net/ubuntu/+source/mesa/+bug/656100 */
+ if(!GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_UNIX, GPU_DRIVER_OPENSOURCE)) {
+ glClear(GL_COLOR_BUFFER_BIT);
+ }
+
wm_window_swap_buffers(win);
//GHOST_SetWindowState(ghostwin, GHOST_kWindowStateModified);
@@ -352,7 +368,10 @@ void wm_window_add_ghostwindows(bContext* C, wmWindowManager *wm)
wmKeyMap *keymap;
wmWindow *win;
- /* no commandline prefsize? then we set this */
+ /* no commandline prefsize? then we set this.
+ * Note that these values will be used only
+ * when there is no startup.blend yet.
+ */
if (!prefsizx) {
wm_get_screensize(&prefsizx, &prefsizy);
@@ -372,18 +391,19 @@ void wm_window_add_ghostwindows(bContext* C, wmWindowManager *wm)
for(win= wm->windows.first; win; win= win->next) {
if(win->ghostwin==NULL) {
- if(win->sizex==0) {
+ if(win->sizex==0 || useprefsize) {
win->posx= prefstax;
win->posy= prefstay;
win->sizex= prefsizx;
win->sizey= prefsizy;
win->windowstate= initialstate;
+ useprefsize= 0;
}
- wm_window_add_ghostwindow(C, wm, "Blender", win);
+ wm_window_add_ghostwindow(C, "Blender", win);
}
/* happens after fileread */
if(win->eventstate==NULL)
- win->eventstate= MEM_callocN(sizeof(wmEvent), "window event state");
+ win->eventstate= MEM_callocN(sizeof(wmEvent), "window event state");
/* add keymap handlers (1 handler for all keys in map!) */
keymap= WM_keymap_find(wm->defaultconf, "Window", 0, 0);
@@ -395,6 +415,11 @@ void wm_window_add_ghostwindows(bContext* C, wmWindowManager *wm)
keymap= WM_keymap_find(wm->defaultconf, "Screen Editing", 0, 0);
WM_event_add_keymap_handler(&win->modalhandlers, keymap);
+ /* add drop boxes */
+ {
+ ListBase *lb= WM_dropboxmap_find("Window", 0, 0);
+ WM_event_add_dropbox_handler(&win->handlers, lb);
+ }
wm_window_title(wm, win);
}
}
@@ -419,7 +444,7 @@ wmWindow *WM_window_open(bContext *C, rcti *rect)
return win;
}
-/* uses screen->full tag to define what to do, currently it limits
+/* uses screen->temp tag to define what to do, currently it limits
to only one "temp" window for render out, preferences, filewindow, etc */
/* type is #define in WM_api.h */
@@ -433,7 +458,7 @@ void WM_window_open_temp(bContext *C, rcti *position, int type)
/* test if we have a temp screen already */
for(win= CTX_wm_manager(C)->windows.first; win; win= win->next)
- if(win->screen->full == SCREENTEMP)
+ if(win->screen->temp)
break;
/* add new window? */
@@ -455,7 +480,7 @@ void WM_window_open_temp(bContext *C, rcti *position, int type)
/* add new screen? */
if(win->screen==NULL)
win->screen= ED_screen_add(win, CTX_data_scene(C), "temp");
- win->screen->full = SCREENTEMP;
+ win->screen->temp = 1;
/* make window active, and validate/resize */
CTX_wm_window_set(C, win);
@@ -488,7 +513,7 @@ void WM_window_open_temp(bContext *C, rcti *position, int type)
/* ****************** Operators ****************** */
/* operator callback */
-int wm_window_duplicate_op(bContext *C, wmOperator *op)
+int wm_window_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
{
wm_window_copy(C, CTX_wm_window(C));
WM_check(C);
@@ -500,7 +525,7 @@ int wm_window_duplicate_op(bContext *C, wmOperator *op)
/* fullscreen operator callback */
-int wm_window_fullscreen_toggle_op(bContext *C, wmOperator *op)
+int wm_window_fullscreen_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
wmWindow *window= CTX_wm_window(C);
GHOST_TWindowState state = GHOST_GetWindowState(window->ghostwin);
@@ -516,22 +541,37 @@ int wm_window_fullscreen_toggle_op(bContext *C, wmOperator *op)
/* ************ events *************** */
-static int query_qual(char qual)
+typedef enum
+{
+ SHIFT = 's',
+ CONTROL = 'c',
+ ALT = 'a',
+ OS = 'C'
+} modifierKeyType;
+
+/* check if specified modifier key type is pressed */
+static int query_qual(modifierKeyType qual)
{
GHOST_TModifierKeyMask left, right;
int val= 0;
- if (qual=='s') {
- left= GHOST_kModifierKeyLeftShift;
- right= GHOST_kModifierKeyRightShift;
- } else if (qual=='c') {
- left= GHOST_kModifierKeyLeftControl;
- right= GHOST_kModifierKeyRightControl;
- } else if (qual=='C') {
- left= right= GHOST_kModifierKeyCommand;
- } else {
- left= GHOST_kModifierKeyLeftAlt;
- right= GHOST_kModifierKeyRightAlt;
+ switch(qual) {
+ case SHIFT:
+ left= GHOST_kModifierKeyLeftShift;
+ right= GHOST_kModifierKeyRightShift;
+ break;
+ case CONTROL:
+ left= GHOST_kModifierKeyLeftControl;
+ right= GHOST_kModifierKeyRightControl;
+ break;
+ case OS:
+ left= right= GHOST_kModifierKeyOS;
+ break;
+ case ALT:
+ default:
+ left= GHOST_kModifierKeyLeftAlt;
+ right= GHOST_kModifierKeyRightAlt;
+ break;
}
GHOST_GetModifierKeyState(g_system, left, &val);
@@ -600,20 +640,20 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private)
/* bad ghost support for modifier keys... so on activate we set the modifiers again */
kdata.ascii= 0;
- if (win->eventstate->shift && !query_qual('s')) {
+ if (win->eventstate->shift && !query_qual(SHIFT)) {
kdata.key= GHOST_kKeyLeftShift;
wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, time, &kdata);
}
- if (win->eventstate->ctrl && !query_qual('c')) {
+ if (win->eventstate->ctrl && !query_qual(CONTROL)) {
kdata.key= GHOST_kKeyLeftControl;
wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, time, &kdata);
}
- if (win->eventstate->alt && !query_qual('a')) {
+ if (win->eventstate->alt && !query_qual(ALT)) {
kdata.key= GHOST_kKeyLeftAlt;
wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, time, &kdata);
}
- if (win->eventstate->oskey && !query_qual('C')) {
- kdata.key= GHOST_kKeyCommand;
+ if (win->eventstate->oskey && !query_qual(OS)) {
+ kdata.key= GHOST_kKeyOS;
wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, time, &kdata);
}
/* keymodifier zero, it hangs on hotkeys that open windows otherwise */
@@ -787,15 +827,17 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private)
/* printf("Drop detected\n"); */
/* add drag data to wm for paths: */
- /* need icon type, some dropboxes check for that... see filesel code for this */
if(ddd->dataType == GHOST_kDragnDropTypeFilenames) {
GHOST_TStringArray *stra= ddd->data;
- int a;
+ int a, icon;
for(a=0; a<stra->count; a++) {
printf("drop file %s\n", stra->strings[a]);
- WM_event_start_drag(C, 0, WM_DRAG_PATH, stra->strings[a], 0.0);
+ /* try to get icon type from extension */
+ icon= ED_file_extension_icon((char *)stra->strings[a]);
+
+ WM_event_start_drag(C, icon, WM_DRAG_PATH, stra->strings[a], 0.0);
/* void poin should point to string, it makes a copy */
break; // only one drop element supported now
}
@@ -875,7 +917,7 @@ void wm_window_process_events(const bContext *C)
PIL_sleep_ms(5);
}
-void wm_window_process_events_nosleep(const bContext *C)
+void wm_window_process_events_nosleep(void)
{
if(GHOST_ProcessEvents(g_system, 0))
GHOST_DispatchEvents(g_system);
@@ -923,7 +965,7 @@ void wm_ghost_exit(void)
/* **************** timer ********************** */
/* to (de)activate running timers temporary */
-void WM_event_timer_sleep(wmWindowManager *wm, wmWindow *win, wmTimer *timer, int dosleep)
+void WM_event_timer_sleep(wmWindowManager *wm, wmWindow *UNUSED(win), wmTimer *timer, int dosleep)
{
wmTimer *wt;
@@ -951,7 +993,7 @@ wmTimer *WM_event_add_timer(wmWindowManager *wm, wmWindow *win, int event_type,
return wt;
}
-void WM_event_remove_timer(wmWindowManager *wm, wmWindow *win, wmTimer *timer)
+void WM_event_remove_timer(wmWindowManager *wm, wmWindow *UNUSED(win), wmTimer *timer)
{
wmTimer *wt;
@@ -974,6 +1016,9 @@ char *WM_clipboard_text_get(int selection)
{
char *p, *p2, *buf, *newbuf;
+ if(G.background)
+ return NULL;
+
buf= (char*)GHOST_getClipboard(selection);
if(!buf)
return NULL;
@@ -994,33 +1039,35 @@ char *WM_clipboard_text_get(int selection)
void WM_clipboard_text_set(char *buf, int selection)
{
+ if(!G.background) {
#ifdef _WIN32
- /* do conversion from \n to \r\n on Windows */
- char *p, *p2, *newbuf;
- int newlen= 0;
-
- for(p= buf; *p; p++) {
- if(*p == '\n')
- newlen += 2;
- else
- newlen++;
- }
+ /* do conversion from \n to \r\n on Windows */
+ char *p, *p2, *newbuf;
+ int newlen= 0;
+
+ for(p= buf; *p; p++) {
+ if(*p == '\n')
+ newlen += 2;
+ else
+ newlen++;
+ }
+
+ newbuf= MEM_callocN(newlen+1, "WM_clipboard_text_set");
- newbuf= MEM_callocN(newlen+1, "WM_clipboard_text_set");
-
- for(p= buf, p2= newbuf; *p; p++, p2++) {
- if(*p == '\n') {
- *(p2++)= '\r'; *p2= '\n';
+ for(p= buf, p2= newbuf; *p; p++, p2++) {
+ if(*p == '\n') {
+ *(p2++)= '\r'; *p2= '\n';
+ }
+ else *p2= *p;
}
- else *p2= *p;
- }
- *p2= '\0';
-
- GHOST_putClipboard((GHOST_TInt8*)newbuf, selection);
- MEM_freeN(newbuf);
+ *p2= '\0';
+
+ GHOST_putClipboard((GHOST_TInt8*)newbuf, selection);
+ MEM_freeN(newbuf);
#else
- GHOST_putClipboard((GHOST_TInt8*)buf, selection);
+ GHOST_putClipboard((GHOST_TInt8*)buf, selection);
#endif
+ }
}
/* ******************* progress bar **************** */
@@ -1109,6 +1156,7 @@ void WM_setprefsize(int stax, int stay, int sizx, int sizy)
prefstay= stay;
prefsizx= sizx;
prefsizy= sizy;
+ useprefsize= 1;
}
/* for borderless and border windows set from command-line */
diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h
index 7228a6dcd93..e1ca1793c04 100644
--- a/source/blender/windowmanager/wm.h
+++ b/source/blender/windowmanager/wm.h
@@ -61,7 +61,7 @@ void wm_tweakevent_test(bContext *C, wmEvent *event, int action);
/* wm_gesture.c */
#define WM_LASSO_MIN_POINTS 1024
void wm_gesture_draw(struct wmWindow *win);
-int wm_gesture_evaluate(bContext *C, wmGesture *gesture);
+int wm_gesture_evaluate(wmGesture *gesture);
void wm_gesture_tag_redraw(bContext *C);
/* wm_jobs.c */
diff --git a/source/blender/windowmanager/wm_cursors.h b/source/blender/windowmanager/wm_cursors.h
index 178a5f55ba4..c42e7413f1a 100644
--- a/source/blender/windowmanager/wm_cursors.h
+++ b/source/blender/windowmanager/wm_cursors.h
@@ -47,7 +47,7 @@ enum {
CURSOR_STD,
CURSOR_NONE,
CURSOR_PENCIL,
- CURSOR_COPY,
+ CURSOR_COPY
};
diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h
index 8fd650fb184..4888f9aced3 100644
--- a/source/blender/windowmanager/wm_event_system.h
+++ b/source/blender/windowmanager/wm_event_system.h
@@ -84,7 +84,6 @@ enum {
/* wm_event_system.c */
-void wm_event_add (wmWindow *win, wmEvent *event_to_add);
void wm_event_free_all (wmWindow *win);
void wm_event_free (wmEvent *event);
void wm_event_free_handler (wmEventHandler *handler);
diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h
index e4b56080b03..5d7eb625f78 100644
--- a/source/blender/windowmanager/wm_event_types.h
+++ b/source/blender/windowmanager/wm_event_types.h
@@ -46,31 +46,31 @@
#define EVT_TABLET_STYLUS 1
#define EVT_TABLET_ERASER 2
-#define MOUSEX 0x004
-#define MOUSEY 0x005
+#define MOUSEX 4
+#define MOUSEY 5
/* MOUSE : 0x00x */
-#define LEFTMOUSE 0x001
-#define MIDDLEMOUSE 0x002
-#define RIGHTMOUSE 0x003
-#define MOUSEMOVE 0x004
+#define LEFTMOUSE 1
+#define MIDDLEMOUSE 2
+#define RIGHTMOUSE 3
+#define MOUSEMOVE 4
/* only use if you want user option switch possible */
-#define ACTIONMOUSE 0x005
-#define SELECTMOUSE 0x006
+#define ACTIONMOUSE 5
+#define SELECTMOUSE 6
/* Extra mouse buttons */
-#define BUTTON4MOUSE 0x007
-#define BUTTON5MOUSE 0x008
+#define BUTTON4MOUSE 7
+#define BUTTON5MOUSE 8
/* Extra trackpad gestures */
-#define MOUSEPAN 0x00e
-#define MOUSEZOOM 0x00f
-#define MOUSEROTATE 0x010
+#define MOUSEPAN 14
+#define MOUSEZOOM 15
+#define MOUSEROTATE 16
/* defaults from ghost */
-#define WHEELUPMOUSE 0x00a
-#define WHEELDOWNMOUSE 0x00b
+#define WHEELUPMOUSE 10
+#define WHEELDOWNMOUSE 11
/* mapped with userdef */
-#define WHEELINMOUSE 0x00c
-#define WHEELOUTMOUSE 0x00d
-#define INBETWEEN_MOUSEMOVE 0x011
+#define WHEELINMOUSE 12
+#define WHEELOUTMOUSE 13
+#define INBETWEEN_MOUSEMOVE 17
/* SYSTEM : 0x01xx */
@@ -204,7 +204,7 @@
#define ENDKEY 170
#define UNKNOWNKEY 171
-#define COMMANDKEY 172
+#define OSKEY 172
#define GRLESSKEY 173
/* for event checks */
@@ -215,7 +215,7 @@
#define ISKEYBOARD(event) (event >=' ' && event <=320)
/* test whether the event is a modifier key */
-#define ISKEYMODIFIER(event) ((event >= LEFTCTRLKEY && event <= LEFTSHIFTKEY) || event == COMMANDKEY)
+#define ISKEYMODIFIER(event) ((event >= LEFTCTRLKEY && event <= LEFTSHIFTKEY) || event == OSKEY)
/* test whether the event is a mouse button */
#define ISMOUSE(event) (event >= LEFTMOUSE && event <= MOUSEROTATE)
@@ -227,22 +227,22 @@
#define ISTWEAK(event) (event >= EVT_TWEAK_L && event <= EVT_GESTURE)
/* test whether event type is acceptable as hotkey, excluding modifiers */
-#define ISHOTKEY(event) ((ISKEYBOARD(event) || ISMOUSE(event)) && !(event>=LEFTCTRLKEY && event<=LEFTSHIFTKEY) && !(event>=UNKNOWNKEY && event<=GRLESSKEY))
+#define ISHOTKEY(event) ((ISKEYBOARD(event) || ISMOUSE(event)) && event!=ESCKEY && !(event>=LEFTCTRLKEY && event<=LEFTSHIFTKEY) && !(event>=UNKNOWNKEY && event<=GRLESSKEY))
-/* **************** BLENDER GESTURE EVENTS ********************* */
+/* **************** BLENDER GESTURE EVENTS (0x5000) **************** */
-#define EVT_ACTIONZONE_AREA 0x5000
-#define EVT_ACTIONZONE_REGION 0x5001
+#define EVT_ACTIONZONE_AREA 20480
+#define EVT_ACTIONZONE_REGION 20481
/* tweak events, for L M R mousebuttons */
-#define EVT_TWEAK_L 0x5002
-#define EVT_TWEAK_M 0x5003
-#define EVT_TWEAK_R 0x5004
+#define EVT_TWEAK_L 20482
+#define EVT_TWEAK_M 20483
+#define EVT_TWEAK_R 20484
/* tweak events for action or select mousebutton */
-#define EVT_TWEAK_A 0x5005
-#define EVT_TWEAK_S 0x5006
+#define EVT_TWEAK_A 20485
+#define EVT_TWEAK_S 20486
-#define EVT_GESTURE 0x5010
+#define EVT_GESTURE 20496
/* value of tweaks and line gestures, note, KM_ANY (-1) works for this case too */
#define EVT_GESTURE_N 1
diff --git a/source/blender/windowmanager/wm_window.h b/source/blender/windowmanager/wm_window.h
index 5a425df01e1..9c82f276acf 100644
--- a/source/blender/windowmanager/wm_window.h
+++ b/source/blender/windowmanager/wm_window.h
@@ -45,7 +45,7 @@ void wm_window_close (bContext *C, wmWindowManager *wm, wmWindow *win);
void wm_window_title (wmWindowManager *wm, wmWindow *win);
void wm_window_add_ghostwindows (bContext *C, wmWindowManager *wm);
void wm_window_process_events (const bContext *C);
-void wm_window_process_events_nosleep(const bContext *C);
+void wm_window_process_events_nosleep(void);
void wm_window_make_drawable(bContext *C, wmWindow *win);
@@ -55,7 +55,6 @@ void wm_window_set_size (wmWindow *win, int width, int height);
void wm_window_get_size (wmWindow *win, int *width_r, int *height_r);
void wm_window_get_size_ghost (wmWindow *win, int *width_r, int *height_r);
void wm_window_get_position (wmWindow *win, int *posx_r, int *posy_r);
-void wm_window_set_title (wmWindow *win, char *title);
void wm_window_swap_buffers (wmWindow *win);
void wm_get_cursor_position (wmWindow *win, int *x, int *y);
@@ -65,8 +64,8 @@ wmWindow *wm_window_copy (bContext *C, wmWindow *winorig);
void wm_window_testbreak (void);
/* *************** window operators ************** */
-int wm_window_duplicate_op (bContext *C, struct wmOperator *op);
-int wm_window_fullscreen_toggle_op(bContext *C, struct wmOperator *op);
+int wm_window_duplicate_exec(bContext *C, struct wmOperator *op);
+int wm_window_fullscreen_toggle_exec(bContext *C, struct wmOperator *op);
#endif /* WM_WINDOW_H */
diff --git a/source/blenderplayer/CMakeLists.txt b/source/blenderplayer/CMakeLists.txt
index a61152d37ba..5950753164b 100644
--- a/source/blenderplayer/CMakeLists.txt
+++ b/source/blenderplayer/CMakeLists.txt
@@ -1,3 +1,4 @@
+# -*- mode: cmake; indent-tabs-mode: t; -*-
# $Id$
# ***** BEGIN GPL LICENSE BLOCK *****
#
@@ -24,126 +25,137 @@
#
# ***** END GPL LICENSE BLOCK *****
-MESSAGE(STATUS "Configuring blenderplayer")
+# message(STATUS "Configuring blenderplayer")
-SETUP_LIBDIRS()
+setup_libdirs()
-IF(WITH_QUICKTIME)
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+if(WITH_CODEC_QUICKTIME)
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
- ADD_DEFINITIONS(-DWITH_BINRELOC)
- INCLUDE_DIRECTORIES(${BINRELOC_INC})
-ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+if(CMAKE_SYSTEM_NAME MATCHES "Linux")
+ add_definitions(-DWITH_BINRELOC)
+ blender_include_dirs(${BINRELOC_INC})
+endif()
-ADD_CUSTOM_COMMAND(
+add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dna.c
COMMAND ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/makesdna ${CMAKE_CURRENT_BINARY_DIR}/dna.c ${CMAKE_SOURCE_DIR}/source/blender/makesdna/
DEPENDS ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/makesdna
)
-IF(WIN32)
- ADD_EXECUTABLE(blenderplayer ${EXETYPE} ${CMAKE_CURRENT_BINARY_DIR}/dna.c ../icons/winblender.rc)
-ELSE(WIN32)
- ADD_EXECUTABLE(blenderplayer ${CMAKE_CURRENT_BINARY_DIR}/dna.c)
-ENDIF(WIN32)
+if(WIN32 AND NOT UNIX)
+ add_executable(blenderplayer ${EXETYPE} ${CMAKE_CURRENT_BINARY_DIR}/dna.c ../icons/winblender.rc)
+else()
+ add_executable(blenderplayer ${CMAKE_CURRENT_BINARY_DIR}/dna.c)
+endif()
-ADD_DEPENDENCIES(blenderplayer makesdna)
+add_dependencies(blenderplayer makesdna)
-FILE(READ ${CMAKE_BINARY_DIR}/cmake_blender_libs.txt BLENDER_LINK_LIBS)
+get_property(BLENDER_LINK_LIBS GLOBAL PROPERTY BLENDER_LINK_LIBS)
-SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} gp_common gp_ghost blenkernel_blc)
+list(APPEND BLENDER_LINK_LIBS
+ ge_player_common
+ ge_player_ghost
+ blenkernel_blc
+)
-IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
- SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} extern_binreloc)
-ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+if(CMAKE_SYSTEM_NAME MATCHES "Linux")
+ list(APPEND BLENDER_LINK_LIBS extern_binreloc)
+endif()
-IF(UNIX)
+if(UNIX)
# Sort libraries
- SET(BLENDER_SORTED_LIBS
- gp_ghost
- gp_common
+ set(BLENDER_SORTED_LIBS
+ ge_player_ghost
+ ge_player_common
bf_intern_string
- bf_intern_ghost
+ bf_intern_ghost
bf_rna
bf_blenkernel
bf_blenloader
bf_blenpluginapi
- bf_blroutines
- bf_converter
- bf_ketsji
- bf_bullet
- bf_common
- bf_dummy
- bf_logic
- bf_rasterizer
- bf_oglrasterizer
- bf_expressions
- bf_scenegraph
- bf_ikplugin
- bf_intern_itasc
- bf_intern_ik
- bf_intern_smoke
+ ge_blen_routines
+ bf_editor_datafiles
+ ge_converter
+ ge_logic_ketsji
+ ge_phys_bullet
+ ge_phys_dummy
+ ge_phys_common
+ ge_logic
+ ge_rasterizer
+ ge_oglrasterizer
+ ge_logic_expressions
+ ge_scenegraph
+ bf_ikplugin
+ bf_intern_itasc
+ bf_intern_ik
+ bf_intern_smoke
bf_modifiers
bf_intern_moto
- bf_kernel
+ bf_gen_system
bf_nodes
bf_gpu
bf_imbuf
bf_avi
- kx_network
- bf_ngnetwork
- bf_loopbacknetwork
+ ge_logic_network
+ ge_logic_ngnetwork
+ ge_logic_loopbacknetwork
extern_bullet
bf_intern_guardedalloc
bf_intern_memutil
bf_python
bf_python_ext
bf_blenlib
- bf_cineon
- bf_openexr
+ bf_imbuf_cineon
+ bf_imbuf_openexr
extern_openjpeg
- bf_dds
+ bf_imbuf_dds
bf_readblenfile
bf_dna
- bf_videotex
+ ge_videotex
bf_blenfont
bf_intern_audaspace
blenkernel_blc
extern_binreloc
extern_glew
extern_minilzo
+ bf_intern_ghost # duplicate for linking
+ bf_blenkernel # duplicate for linking
)
- IF(WITH_QUICKTIME)
- SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} bf_quicktime)
- ENDIF(WITH_QUICKTIME)
-
- IF(WITH_CXX_GUARDEDALLOC)
- SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} bf_intern_guardedalloc_cpp)
- ENDIF(WITH_CXX_GUARDEDALLOC)
-
- FOREACH(SORTLIB ${BLENDER_SORTED_LIBS})
- SET(REMLIB ${SORTLIB})
- FOREACH(SEARCHLIB ${BLENDER_LINK_LIBS})
- IF(${SEARCHLIB} STREQUAL ${SORTLIB})
- SET(REMLIB "")
- ENDIF(${SEARCHLIB} STREQUAL ${SORTLIB})
- ENDFOREACH(SEARCHLIB)
- IF(REMLIB)
- MESSAGE(STATUS "Removing library ${REMLIB} from blenderplayer linking because: not configured")
- LIST(REMOVE_ITEM BLENDER_SORTED_LIBS ${REMLIB})
- ENDIF(REMLIB)
- ENDFOREACH(SORTLIB)
-
- TARGET_LINK_LIBRARIES(blenderplayer ${BLENDER_SORTED_LIBS})
-ELSE(UNIX)
- TARGET_LINK_LIBRARIES(blenderplayer ${BLENDER_LINK_LIBS})
-ENDIF(UNIX)
-
-IF(WITH_PLAYER)
- ADD_SUBDIRECTORY(bad_level_call_stubs)
-ENDIF(WITH_PLAYER)
-
-SETUP_LIBLINKS(blenderplayer)
+ if(WITH_CODEC_QUICKTIME)
+ list(APPEND BLENDER_SORTED_LIBS bf_quicktime)
+ endif()
+
+ if(WITH_CXX_GUARDEDALLOC)
+ list(APPEND BLENDER_SORTED_LIBS bf_intern_guardedalloc_cpp)
+ endif()
+
+ foreach(SORTLIB ${BLENDER_SORTED_LIBS})
+ set(REMLIB ${SORTLIB})
+ foreach(SEARCHLIB ${BLENDER_LINK_LIBS})
+ if(${SEARCHLIB} STREQUAL ${SORTLIB})
+ set(REMLIB "")
+ endif()
+ endforeach()
+ if(REMLIB)
+ # message(STATUS "Removing library ${REMLIB} from blenderplayer linking because: not configured")
+ list(APPEND REM_MSG ${REMLIB})
+ list(REMOVE_ITEM BLENDER_SORTED_LIBS ${REMLIB})
+ endif()
+ endforeach()
+ if(REM_MSG)
+ list(SORT REM_MSG)
+ message(STATUS "Player Skipping: (${REM_MSG})")
+ endif()
+ target_link_libraries(blenderplayer ${BLENDER_SORTED_LIBS})
+else()
+ target_link_libraries(blenderplayer ${BLENDER_LINK_LIBS})
+endif()
+
+if(WITH_PLAYER)
+ add_subdirectory(bad_level_call_stubs)
+endif()
+
+setup_liblinks(blenderplayer)
diff --git a/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt b/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt
index dbcf4d96942..55f354a57a8 100644
--- a/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt
+++ b/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt
@@ -24,27 +24,35 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC stubs.c)
+# this warning on generated files gets annoying
+remove_strict_flags()
-IF(WITH_BUILDINFO)
- ADD_DEFINITIONS(-DBUILD_DATE)
- FILE(GLOB SRC ${SRC} ../../creator/buildinfo.c)
-ENDIF(WITH_BUILDINFO)
-
-SET(INC
+set(INC
.
..
../../../intern/guardedalloc
../../../source/blender/makesdna
../../../source/blender/makesrna
+ ../../../source/blender/blenkernel
+)
+
+set(SRC
+ stubs.c
)
-IF(WITH_GAMEENGINE)
- ADD_DEFINITIONS(-DGAMEBLENDER)
-ENDIF(WITH_GAMEENGINE)
+if(WITH_BUILDINFO)
+ add_definitions(-DBUILD_DATE)
+ list(APPEND SRC
+ ../../creator/buildinfo.c
+ )
+endif()
+
+if(WITH_GAMEENGINE)
+ add_definitions(-DWITH_GAMEENGINE)
+endif()
-IF(WITH_INTERNATIONAL)
- ADD_DEFINITIONS(-DWITH_FREETYPE2)
-ENDIF(WITH_INTERNATIONAL)
+if(WITH_INTERNATIONAL)
+ add_definitions(-DWITH_FREETYPE2)
+endif()
-BLENDERLIB_NOLIST(blenkernel_blc "${SRC}" "${INC}")
+blender_add_lib_nolist(blenkernel_blc "${SRC}" "${INC}")
diff --git a/source/blenderplayer/bad_level_call_stubs/Makefile b/source/blenderplayer/bad_level_call_stubs/Makefile
deleted file mode 100644
index 49efd08c710..00000000000
--- a/source/blenderplayer/bad_level_call_stubs/Makefile
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blenkernel_blc
-DIR = $(OCGDIR)/blenderplayer/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_2_C_WARNINGS)
-CFLAGS += $(FIX_STUBS_WARNINGS)
-
-CPPFLAGS += $(OGL_CPPFLAGS)
-CPPFLAGS += -I../../source/blender/makesdna
-CPPFLAGS += -I../../source/blender/makesrna
-
-# path to our own external headerfiles
-CPPFLAGS += -I..
-
diff --git a/source/blenderplayer/bad_level_call_stubs/SConscript b/source/blenderplayer/bad_level_call_stubs/SConscript
index 5d71f83719f..0217f1aeacc 100644
--- a/source/blenderplayer/bad_level_call_stubs/SConscript
+++ b/source/blenderplayer/bad_level_call_stubs/SConscript
@@ -12,6 +12,6 @@ if env['WITH_BF_INTERNATIONAL']:
defs += 'WITH_FREETYPE2'
if env['WITH_BF_GAMEENGINE']:
- defs += ' GAMEBLENDER=1'
+ defs += ' WITH_GAMEENGINE'
env.BlenderLib ('blenkernel_blc', sources = Split(sources), includes=Split(incs), defines=Split(defs), libtype=['player'],priority=[220] )
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index b341f798478..c831c2a477e 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -28,7 +28,7 @@
* BKE_bad_level_calls function stubs
*/
-#if GAMEBLENDER == 1
+#ifdef WITH_GAMEENGINE
#include <stdlib.h>
#include "DNA_listBase.h"
#include "RNA_types.h"
@@ -42,6 +42,7 @@ struct CSG_FaceIteratorDescriptor;
struct CSG_VertexIteratorDescriptor;
struct ColorBand;
struct CurveMapping;
+struct Curve;
struct EditBone;
struct EditFace;
struct EditMesh;
@@ -88,6 +89,7 @@ struct wmKeyMap;
struct wmOperator;
struct wmWindowManager;
struct View3D;
+struct ToolSettings;
/*new render funcs */
@@ -105,6 +107,7 @@ void ibuf_sample(struct ImBuf *ibuf, float fx, float fy, float dx, float dy, flo
/* texture.c */
int multitex_thread(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres, short thread, short which_output) {return 0;}
int multitex_ext(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres){return 0;}
+int multitex_ext_safe(struct Tex *tex, float *texvec, struct TexResult *texres){return 0;}
int multitex_nodes(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres, short thread, short which_output, struct ShadeInput *shi, struct MTex *mtex) {return 0;}
/* nodes */
@@ -114,8 +117,6 @@ struct Render *RE_GetRender(const char *name){return (struct Render *) NULL;}
/* blenkernel */
char btempdir[] = "";
void RE_FreeRenderResult(struct RenderResult *res){}
-char datatoc_bmonofont_ttf[] = "";
-int datatoc_bmonofont_ttf_size = 0;
struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty){return (struct RenderResult *) NULL;}
void RE_GetResultImage(struct Render *re, struct RenderResult *rr){}
int RE_RenderInProgress(struct Render *re){return 0;}
@@ -139,6 +140,7 @@ void WM_menutype_free(void){}
void WM_menutype_freelink(struct MenuType* mt){}
int WM_menutype_add(struct MenuType *mt) {return 0;}
int WM_operator_props_dialog_popup (struct bContext *C, struct wmOperator *op, int width, int height){return 0;}
+int WM_operator_confirm(struct bContext *C, struct wmOperator *op, struct wmEvent *event){return 0;}
struct MenuType *WM_menutype_find(const char *idname, int quiet){return (struct MenuType *) NULL;}
void WM_operator_stack_clear(struct bContext *C) {}
@@ -162,6 +164,7 @@ void ED_node_composit_default(struct Scene *sce){}
void *ED_region_draw_cb_activate(struct ARegionType *art, void(*draw)(const struct bContext *, struct ARegion *, void *), void *custumdata, int type){return 0;} /* XXX this one looks weird */
void *ED_region_draw_cb_customdata(void *handle){return 0;} /* XXX This one looks wrong also */
void ED_region_draw_cb_exit(struct ARegionType *art, void *handle){}
+void ED_area_headerprint(struct ScrArea *sa, char *str){}
struct EditBone *ED_armature_bone_get_mirrored(struct ListBase *edbo, struct EditBone *ebo){return (struct EditBone *) NULL;}
struct EditBone *ED_armature_edit_bone_add(struct bArmature *arm, char *name){return (struct EditBone*) NULL;}
@@ -172,6 +175,7 @@ int ED_pose_channel_in_IK_chain(struct Object *ob, struct bPoseChannel *pchan){r
int ED_space_image_show_uvedit(struct SpaceImage *sima, struct Object *obedit){return 0;}
int ED_space_image_show_render(struct SpaceImage *sima){return 0;}
int ED_space_image_show_paint(struct SpaceImage *sima){return 0;}
+void ED_space_image_paint_update(struct wmWindowManager *wm, struct ToolSettings *settings){}
void ED_space_image_set(struct bContext *C, struct SpaceImage *sima, struct Scene *scene, struct Object *obedit, struct Image *ima){}
struct ImBuf *ED_space_image_buffer(struct SpaceImage *sima){return (struct ImBuf *) NULL;}
void ED_screen_set_scene(struct bContext *C, struct Scene *scene){}
@@ -204,7 +208,7 @@ struct KeyingSetInfo *ANIM_keyingset_info_find_named (const char name[]){return
struct KeyingSet *ANIM_scene_get_active_keyingset (struct Scene *scene){return (struct KeyingSet *) NULL;}
int ANIM_scene_get_keyingset_index(struct Scene *scene, struct KeyingSet *ks){return 0;}
struct ListBase builtin_keyingsets;
-void ANIM_keyingset_info_register (const struct bContext *C, struct KeyingSetInfo *ksi){}
+void ANIM_keyingset_info_register (struct KeyingSetInfo *ksi){}
void ANIM_keyingset_info_unregister (const struct bContext *C, struct KeyingSetInfo *ksi){}
short ANIM_add_driver(struct ID *id, const char rna_path[], int array_index, short flag, int type){return 0;}
short ANIM_remove_driver (struct ID *id, const char rna_path[], int array_index, short flag){return 0;}
@@ -214,11 +218,12 @@ char *ED_info_stats_string(struct Scene *scene){return (char *) NULL;}
void ED_area_tag_redraw(struct ScrArea *sa){}
void ED_area_tag_refresh(struct ScrArea *sa){}
void ED_area_newspace(struct bContext *C, struct ScrArea *sa, int type){}
+void ED_region_tag_redraw(struct ARegion *ar){}
void WM_event_add_fileselect(struct bContext *C, struct wmOperator *op){}
void WM_cursor_wait (int val) {}
void ED_node_texture_default(struct Tex *tx){}
void ED_node_changed_update(struct bContext *C, struct bNode *node){}
-void ED_node_generic_update(struct Main *bmain, struct Scene *scene, struct bNodeTree *ntree, struct bNode *node){}
+void ED_node_generic_update(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node){}
void ED_view3d_scene_layers_update(struct Main *bmain, struct Scene *scene){}
int ED_view3d_scene_layer_set(int lay, const int *values){return 0;}
void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar){}
@@ -253,11 +258,16 @@ void ED_mesh_edges_add(struct Mesh *mesh, struct ReportList *reports, int count)
void ED_mesh_faces_add(struct Mesh *mesh, struct ReportList *reports, int count){}
void ED_mesh_material_link(struct Mesh *mesh, struct Material *ma){}
int ED_mesh_color_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me){return 0;}
-int ED_mesh_uv_texture_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me){return 0;}
+int ED_mesh_uv_texture_add(struct bContext *C, struct Mesh *me){return 0;}
void ED_object_constraint_dependency_update(struct Scene *scene, struct Object *ob){}
void ED_object_constraint_update(struct Object *ob){}
struct bDeformGroup *ED_vgroup_add_name(struct Object *ob, char *name){return (struct bDeformGroup *) NULL;}
void ED_vgroup_vert_add(struct Object *ob, struct bDeformGroup *dg, int vertnum, float weight, int assignmode){}
+void ED_vgroup_vert_remove(struct Object *ob, struct bDeformGroup *dg, int vertnum){}
+void ED_vgroup_vert_weight(struct Object *ob, struct bDeformGroup *dg, int vertnum){}
+void ED_vgroup_delete(struct Object *ob, struct bDeformGroup *defgroup){}
+void ED_vgroup_object_is_edit_mode(struct Object *ob){}
+
void ED_sequencer_update_view(struct bContext *C, int view){}
float ED_rollBoneToVector(struct EditBone *bone, float new_up_axis[3]){return 0.0f;}
void ED_space_image_size(struct SpaceImage *sima, int *width, int *height){}
@@ -286,6 +296,8 @@ struct uiLayout *uiLayoutColumn(struct uiLayout *layout, int align){return (stru
struct uiLayout *uiLayoutColumnFlow(struct uiLayout *layout, int number, int align){return (struct uiLayout *) NULL;}
struct uiLayout *uiLayoutBox(struct uiLayout *layout){return (struct uiLayout *) NULL;}
struct uiLayout *uiLayoutSplit(struct uiLayout *layout, float percentage, int align){return (struct uiLayout *) NULL;}
+int uiLayoutGetRedAlert(struct uiLayout *layout){return 0;}
+void uiLayoutSetRedAlert(struct uiLayout *layout, int redalert){}
void uiItemsEnumR(struct uiLayout *layout, struct PointerRNA *ptr, char *propname){}
void uiItemMenuEnumR(struct uiLayout *layout, struct PointerRNA *ptr, char *propname, char *name, int icon){}
void uiItemEnumR_string(struct uiLayout *layout, struct PointerRNA *ptr, char *propname, char *value, char *name, int icon){}
@@ -312,7 +324,7 @@ void uiTemplateHeader(struct uiLayout *layout, struct bContext *C, int menus){}
void uiTemplateID(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, char *newop, char *unlinkop){}
struct uiLayout *uiTemplateModifier(struct uiLayout *layout, struct PointerRNA *ptr){return (struct uiLayout *) NULL;}
struct uiLayout *uiTemplateConstraint(struct uiLayout *layout, struct PointerRNA *ptr){return (struct uiLayout *) NULL;}
-void uiTemplatePreview(struct uiLayout *layout, struct ID *id, struct ID *parent, struct MTex *slot){}
+void uiTemplatePreview(struct uiLayout *layout, struct ID *id, int show_buttons, struct ID *parent, struct MTex *slot){}
void uiTemplateIDPreview(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop, int rows, int cols){}
void uiTemplateCurveMapping(struct uiLayout *layout, struct CurveMapping *cumap, int type, int compact){}
void uiTemplateColorRamp(struct uiLayout *layout, struct ColorBand *coba, int expand){}
@@ -354,10 +366,12 @@ struct wmOperatorTypeMacro *WM_operatortype_macro_define(struct wmOperatorType *
int WM_operator_call_py(struct bContext *C, struct wmOperatorType *ot, int context, struct PointerRNA *properties, struct ReportList *reports){return 0;}
int WM_operatortype_remove(const char *idname){return 0;}
int WM_operator_poll(struct bContext *C, struct wmOperatorType *ot){return 0;}
+int WM_operator_poll_context(struct bContext *C, struct wmOperatorType *ot, int context){return 0;}
int WM_operator_props_popup(struct bContext *C, struct wmOperator *op, struct wmEvent *event){return 0;}
void WM_operator_properties_free(struct PointerRNA *ptr){}
void WM_operator_properties_create(struct PointerRNA *ptr, const char *opstring){}
void WM_operator_properties_create_ptr(struct PointerRNA *ptr, struct wmOperatorType *ot){}
+void WM_operator_properties_sanitize(struct PointerRNA *ptr, const short no_context){};
void WM_operatortype_append_ptr(void (*opfunc)(struct wmOperatorType*, void*), void *userdata){}
void WM_operatortype_append_macro_ptr(void (*opfunc)(struct wmOperatorType*, void*), void *userdata){}
void WM_operator_bl_idname(char *to, const char *from){}
@@ -370,10 +384,12 @@ struct wmKeyMapItem *WM_modalkeymap_add_item(struct wmKeyMap *km, int type, int
struct wmKeyMap *WM_modalkeymap_add(struct wmKeyConfig *keyconf, char *idname, EnumPropertyItem *items){return (struct wmKeyMap *) NULL;}
/* intern/decimation */
+#if 1
int LOD_FreeDecimationData(struct LOD_Decimation_Info *info){return 0;}
int LOD_CollapseEdge(struct LOD_Decimation_Info *info){return 0;}
int LOD_PreprocessMesh(struct LOD_Decimation_Info *info){return 0;}
int LOD_LoadMesh(struct LOD_Decimation_Info *info){return 0;}
+#endif
/* smoke */
void LzmaCompress(void) { return; }
@@ -415,10 +431,12 @@ float sculpt_get_brush_unprojected_radius(struct Brush *brush){return 0.0f;}
void sculpt_set_brush_unprojected_radius(struct Brush *brush, float unprojected_radius){}
float sculpt_get_brush_alpha(struct Brush *brush){return 0.0f;}
void sculpt_set_brush_alpha(struct Brush *brush, float alpha){}
+void ED_sculpt_modifiers_changed(struct Object *ob){};
char blender_path[] = "";
/* CSG */
+#if 1
struct CSG_BooleanOperation * CSG_NewBooleanFunction( void ){return (struct CSG_BooleanOperation *) NULL;}
void CSG_FreeBooleanOperation(struct CSG_BooleanOperation *operation){return;}
void CSG_FreeFaceDescriptor(struct CSG_FaceIteratorDescriptor * f_descriptor){return;}
@@ -439,4 +457,5 @@ int CSG_PerformBooleanOperation(
CSG_VertexIteratorDescriptor obBVertices)
{ return 0;}
-#endif // GAMEBLENDER == 1
+#endif
+#endif // WITH_GAMEENGINE
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index 8b5e1a26f41..23c7246d565 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -1,3 +1,4 @@
+# -*- mode: cmake; indent-tabs-mode: t; -*-
# $Id$
# ***** BEGIN GPL LICENSE BLOCK *****
#
@@ -25,11 +26,11 @@
# ***** END GPL LICENSE BLOCK *****
# So BUILDINFO and BLENDERPATH strings are automatically quoted
-CMAKE_POLICY(SET CMP0005 NEW)
+cmake_policy(SET CMP0005 NEW)
-SETUP_LIBDIRS()
+setup_libdirs()
-INCLUDE_DIRECTORIES(
+blender_include_dirs(
../../intern/guardedalloc
../blender/blenlib
../blender/blenkernel
@@ -40,121 +41,136 @@ INCLUDE_DIRECTORIES(
../blender/makesdna
../blender/gpu
../blender/windowmanager
- ../kernel/gen_messaging
- ../kernel/gen_system
)
-IF(WIN32)
- INCLUDE_DIRECTORIES(${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_CODEC_QUICKTIME)
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-IF(WITH_QUICKTIME)
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+if(WITH_IMAGE_OPENEXR)
+ add_definitions(-DWITH_OPENEXR)
+endif()
-IF(WITH_IMAGE_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_IMAGE_OPENEXR)
+if(WITH_IMAGE_TIFF)
+ add_definitions(-DWITH_TIFF)
+endif()
-IF(WITH_IMAGE_TIFF)
- ADD_DEFINITIONS(-DWITH_TIFF)
-ENDIF(WITH_IMAGE_TIFF)
+if(WITH_IMAGE_DDS)
+ add_definitions(-DWITH_DDS)
+endif()
-IF(WITH_IMAGE_DDS)
- ADD_DEFINITIONS(-DWITH_DDS)
-ENDIF(WITH_IMAGE_DDS)
+if(WITH_IMAGE_CINEON)
+ add_definitions(-DWITH_CINEON)
+endif()
-IF(WITH_IMAGE_CINEON)
- ADD_DEFINITIONS(-DWITH_CINEON)
-ENDIF(WITH_IMAGE_CINEON)
+if(WITH_IMAGE_HDR)
+ add_definitions(-DWITH_HDR)
+endif()
-IF(WITH_IMAGE_HDR)
- ADD_DEFINITIONS(-DWITH_HDR)
-ENDIF(WITH_IMAGE_HDR)
+if(WITH_PYTHON)
+ blender_include_dirs(../blender/python)
+ add_definitions(-DWITH_PYTHON)
+endif()
-IF(WITH_PYTHON)
- INCLUDE_DIRECTORIES(../blender/python)
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_GAMEENGINE)
+ blender_include_dirs(
+ ../kernel/gen_messaging
+ ../kernel/gen_system
+ )
+
+ add_definitions(-DWITH_GAMEENGINE)
+endif()
-IF(NOT WITH_SDL)
- ADD_DEFINITIONS(-DDISABLE_SDL)
-ENDIF(NOT WITH_SDL)
+if(NOT WITH_SDL)
+ add_definitions(-DDISABLE_SDL)
+endif()
-IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
- ADD_DEFINITIONS(-DWITH_BINRELOC)
- INCLUDE_DIRECTORIES(${BINRELOC_INC})
-ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+if(CMAKE_SYSTEM_NAME MATCHES "Linux")
+ add_definitions(-DWITH_BINRELOC)
+ blender_include_dirs(${BINRELOC_INC})
+endif()
# Setup the exe sources and buildinfo
-SET(EXESRC creator.c)
+set(SRC
+ creator.c
+)
-IF(WIN32)
- LIST(APPEND EXESRC ../icons/winblender.rc)
-ENDIF(WIN32)
+if(WIN32 AND NOT UNIX)
+ list(APPEND SRC
+ ../icons/winblender.rc
+ )
+endif()
-IF(WITH_BUILDINFO)
- ADD_DEFINITIONS(
+if(WITH_BUILDINFO)
+ string(REPLACE " " "\ " BUILDINFO_CFLAGS "${CMAKE_C_FLAGS}")
+ string(REPLACE " " "\ " BUILDINFO_CXXFLAGS "${CMAKE_CXX_FLAGS}")
+ string(REPLACE " " "\ " BUILDINFO_LINKFLAGS "${PLATFORM_LINKFLAGS}")
+ add_definitions(
-DBUILD_DATE="${BUILD_DATE}"
-DBUILD_TIME="${BUILD_TIME}"
-DBUILD_REV="${BUILD_REV}"
-DBUILD_PLATFORM="${CMAKE_SYSTEM_NAME}"
-DBUILD_TYPE="${CMAKE_BUILD_TYPE}"
+ -DBUILD_CFLAGS="${BUILDINFO_CFLAGS}"
+ -DBUILD_CXXFLAGS="${BUILDINFO_CXXFLAGS}"
+ -DBUILD_LINKFLAGS="${BUILDINFO_LINKFLAGS}"
+ -DBUILD_SYSTEM="CMake"
)
- LIST(APPEND EXESRC buildinfo.c)
-ENDIF(WITH_BUILDINFO)
+ list(APPEND SRC
+ buildinfo.c
+ )
+endif()
-MESSAGE(STATUS "Configuring blender")
+# message(STATUS "Configuring blender")
-ADD_EXECUTABLE(blender ${EXETYPE} ${EXESRC})
+add_executable(blender ${EXETYPE} ${SRC})
# Post build steps for bundling/packaging.
-SET(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR})
+set(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR})
-IF(WITH_INSTALL)
+if(WITH_INSTALL)
- IF(UNIX)
- ADD_CUSTOM_COMMAND(TARGET blender
+ if(UNIX)
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
#COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/plugins ${TARGETDIR}/
#COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/text/* ${TARGETDIR}/
)
- ENDIF(UNIX)
+ endif()
- IF(UNIX AND NOT APPLE)
+ if(UNIX AND NOT APPLE)
# Local installation, "make install" can be done after this optionally
- ADD_CUSTOM_COMMAND(
+ add_custom_command(
TARGET blender POST_BUILD MAIN_DEPENDENCY blender
COMMAND rm -Rf ${TARGETDIR}/${BLENDER_VERSION}
COMMAND mkdir ${TARGETDIR}/${BLENDER_VERSION}/
COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.bfont.ttf ${TARGETDIR}/${BLENDER_VERSION}/
)
- IF(WITH_INTERNATIONAL)
- ADD_CUSTOM_COMMAND(
+ if(WITH_INTERNATIONAL)
+ add_custom_command(
TARGET blender POST_BUILD MAIN_DEPENDENCY blender
COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.Blanguages ${TARGETDIR}/${BLENDER_VERSION}/
COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale ${TARGETDIR}/${BLENDER_VERSION}/
)
- ENDIF(WITH_INTERNATIONAL)
+ endif()
- IF(WITH_PYTHON)
- ADD_CUSTOM_COMMAND(
+ if(WITH_PYTHON)
+ add_custom_command(
TARGET blender POST_BUILD MAIN_DEPENDENCY blender
COMMENT "copying blender scripts..."
COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/${BLENDER_VERSION}/
COMMAND find ${TARGETDIR} -name "*.py?" -prune -exec rm -rf {} "\;"
)
- IF(WITH_PYTHON_INSTALL)
+ if(WITH_PYTHON_INSTALL)
# Copy the systems python into the install directory
# Scons copy in tools/Blender.py
- ADD_CUSTOM_COMMAND(
+ add_custom_command(
TARGET blender POST_BUILD MAIN_DEPENDENCY blender
COMMENT "copying a subset of the systems python..."
@@ -176,10 +192,10 @@ IF(WITH_INSTALL)
COMMAND find ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION} -name "*.py?" -exec rm -rf {} "\;"
COMMAND find ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION} -name "*.so"-exec strip -s {} "\;"
)
- ENDIF(WITH_PYTHON_INSTALL)
- ENDIF(WITH_PYTHON)
+ endif()
+ endif()
- ADD_CUSTOM_COMMAND(
+ add_custom_command(
TARGET blender POST_BUILD MAIN_DEPENDENCY blender
COMMAND find ${TARGETDIR} -name .svn -prune -exec rm -rf {} "\;"
)
@@ -187,195 +203,157 @@ IF(WITH_INSTALL)
# Above we bundle a portable distribution in ./bin
# This is an optional "make install" which installs blender on the system.
- INSTALL(
+ install(
PROGRAMS ${TARGETDIR}/blender
DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
)
- IF(WITH_GAMEENGINE AND WITH_PLAYER)
- INSTALL(
+ if(WITH_GAMEENGINE AND WITH_PLAYER)
+ install(
PROGRAMS ${TARGETDIR}/blenderplayer
DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
)
- ENDIF(WITH_GAMEENGINE AND WITH_PLAYER)
+ endif()
- INSTALL(
+ install(
FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/blender.desktop
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications
)
- INSTALL(
+ install(
FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/scalable/blender.svg
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps
)
- INSTALL(
+ install(
PROGRAMS ${CMAKE_SOURCE_DIR}/release/bin/blender-thumbnailer.py
DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
)
- INSTALL(
- FILES ${CMAKE_SOURCE_DIR}/doc/blender.1
+ install(
+ FILES ${CMAKE_SOURCE_DIR}/doc/manpage/blender.1
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/man/man1
)
- INSTALL(
+ install(
DIRECTORY ${CMAKE_SOURCE_DIR}/release/text/
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/doc/blender
PATTERN ".svn" EXCLUDE
)
- INSTALL(
+ install(
DIRECTORY ${CMAKE_SOURCE_DIR}/release/scripts/
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/blender/${BLENDER_VERSION}/scripts
PATTERN ".svn" EXCLUDE
PATTERN "*.pyc" EXCLUDE
+ PATTERN "__pycache__" EXCLUDE
)
- INSTALL(
+ install(
DIRECTORY ${CMAKE_SOURCE_DIR}/release/datafiles/brushicons/
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/blender/${BLENDER_VERSION}/datafiles/brushicons
PATTERN ".svn" EXCLUDE
)
- IF(WITH_INTERNATIONAL)
- INSTALL(
+ if(WITH_INTERNATIONAL)
+ install(
DIRECTORY ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale/
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/blender/${BLENDER_VERSION}/datafiles/locale
PATTERN ".svn" EXCLUDE
)
- ENDIF(WITH_INTERNATIONAL)
+ endif()
# end "make install"
- ENDIF(UNIX AND NOT APPLE)
-
- IF(APPLE)
- SET(SOURCEDIR ${CMAKE_SOURCE_DIR}/source/darwin/blender.app)
- SET(SOURCEINFO ${SOURCEDIR}/Contents/Info.plist)
- SET(TARGETINFO ${TARGETDIR}/blender.app/Contents/Info.plist)
-
- ADD_CUSTOM_COMMAND(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND cp -Rf ${SOURCEINFO} ${TARGETDIR}/blender.app/Contents/
- COMMAND cp -Rf ${SOURCEDIR}/Contents/PkgInfo ${TARGETDIR}/blender.app/Contents/
- COMMAND cp -Rf ${SOURCEDIR}/Contents/Resources ${TARGETDIR}/blender.app/Contents/
- COMMAND cat ${SOURCEINFO} | sed s/VERSION/`cat ${CMAKE_SOURCE_DIR}/release/VERSION`/ | sed s/DATE/`date +'%Y-%b-%d'`/ > ${TARGETINFO}
- COMMAND rm -Rf ${TARGETDIR}/blender.app/Contents/MacOS/datafiles
- COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/datafiles/
- COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.bfont.ttf ${TARGETDIR}/blender.app/Contents/MacOS/datafiles/
- )
-
- IF(WITH_INTERNATIONAL)
- ADD_CUSTOM_COMMAND(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.Blanguages ${TARGETDIR}/blender.app/Contents/MacOS/datafiles/
- COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/MacOS/datafiles/
- )
- ENDIF(WITH_INTERNATIONAL)
-
- IF(WITH_PYTHON)
- SET(PYTHON_ZIP "python_${CMAKE_OSX_ARCHITECTURES}.zip")
- ADD_CUSTOM_COMMAND(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/blender.app/Contents/MacOS/
- COMMAND rm -Rf ${TARGETDIR}/blender.app/Contents/MacOS/python/
- COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/python/
- COMMAND unzip -q ${LIBDIR}/release/${PYTHON_ZIP} -d ${TARGETDIR}/blender.app/Contents/MacOS/python/
- COMMAND find ${TARGETDIR}/blender.app -name "*.py?" -prune -exec rm -rf {} "\;"
- )
- ENDIF(WITH_PYTHON)
-
- ADD_CUSTOM_COMMAND(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND find ${TARGETDIR}/blender.app -name .DS_Store -prune -exec rm -rf {} "\;"
- COMMAND find ${TARGETDIR}/blender.app -name .svn -prune -exec rm -rf {} "\;"
- COMMAND find ${TARGETDIR}/blender.app -name __MACOSX -prune -exec rm -rf {} "\;"
- )
- ENDIF(APPLE)
-
- IF(WIN32)
- ADD_CUSTOM_COMMAND(TARGET blender
+ elseif(WIN32)
+ # notice 'xcopy /Y /H' on .bfont.ttf, this is needed when building over samba
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\"
COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\\scripts\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\\scripts\"
COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\\config\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\\config\"
COMMAND if not exist \"${TARGETDIR}\\plugins\" mkdir \"${TARGETDIR}\\plugins\"
- COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\.bfont.ttf\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\\"
+ COMMAND xcopy /Y /H \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\.bfont.ttf\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\\"
COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\scripts\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\scripts\\\"
COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\plugins\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\plugins\\\"
COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\text\\*.*\" \"${TARGETDIR}\\\"
)
- IF(CMAKE_CL_64)
+ if(CMAKE_CL_64)
# gettext and png are statically linked on win64
- ADD_CUSTOM_COMMAND(TARGET blender
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\zlib\\lib\\zlib.dll\" \"${TARGETDIR}\\\"
- # COMMAND copy /Y \"${LIBDIR}\\samplerate\\lib\\libsamplerate-0.dll\" \"${TARGETDIR}\\\"
)
- ELSE(CMAKE_CL_64)
- ADD_CUSTOM_COMMAND(TARGET blender
+ else()
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\gettext\\lib\\gnu_gettext.dll\" \"${TARGETDIR}\\\"
COMMAND copy /Y \"${LIBDIR}\\png\\lib\\libpng.dll\" \"${TARGETDIR}\\\"
COMMAND copy /Y \"${LIBDIR}\\zlib\\lib\\zlib.dll\" \"${TARGETDIR}\\\"
- # COMMAND copy /Y \"${LIBDIR}\\samplerate\\lib\\libsamplerate-0.dll\" \"${TARGETDIR}\\\"
)
- ENDIF(CMAKE_CL_64)
+ endif()
- IF(MSVC)
- ADD_CUSTOM_COMMAND(TARGET blender
+ if(MSVC)
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\pthreads\\lib\\pthreadVC2.dll\" \"${TARGETDIR}\\\"
)
- ELSE(MSVC)
- ADD_CUSTOM_COMMAND(TARGET blender
+ else()
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\pthreads\\lib\\pthreadGC2.dll\" \"${TARGETDIR}\\\"
)
- ENDIF(MSVC)
+ endif()
- IF(WITH_PYTHON)
- IF(NOT CMAKE_BUILD_TYPE) # hack: with multi-configuration generator this is "", so for now copy both python31.dll/zip and python31_d.dll/zip
- ADD_CUSTOM_COMMAND(TARGET blender
+ if(WITH_PYTHON)
+ # note, as far as python is concerned 'RelWithDebInfo' is not debug since its without debug flags.
+ if(NOT CMAKE_BUILD_TYPE) # hack: with multi-configuration generator this is "", so for now copy both python31.dll/zip and python31_d.dll/zip
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${LIBDIR}\\python\\lib\\python31_d.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\release\\python31_d.zip\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\release\\python31.zip\" \"${TARGETDIR}\\\"
+ COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\"
+ COMMAND if \"$(ConfigurationName)\" == \"\" copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"\" xcopy /E /Y \"${LIBDIR}\\release\\python31\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"Debug\" copy /Y \"${LIBDIR}\\python\\lib\\python31_d.dll\" \"${TARGETDIR}\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"Debug\" xcopy /E /Y \"${LIBDIR}\\release\\python31_d\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"RelWithDebInfo\" copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"RelWithDebInfo\" xcopy /E /Y \"${LIBDIR}\\release\\python31\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"Release\" copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"Release\" xcopy /E /Y \"${LIBDIR}\\release\\python31\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"MinSizeRel\" copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"MinSizeRel\" xcopy /E /Y \"${LIBDIR}\\release\\python31\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
)
- ELSE(NOT CMAKE_BUILD_TYPE)
- IF(CMAKE_BUILD_TYPE STREQUAL Debug OR CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo)
- ADD_CUSTOM_COMMAND(TARGET blender
+ else()
+ if(CMAKE_BUILD_TYPE STREQUAL Debug)
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\python\\lib\\python31_d.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\release\\python31_d.zip\" \"${TARGETDIR}\\\"
+ COMMAND xcopy /E /Y \"${LIBDIR}\\release\\python31_d\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
)
- ELSE(CMAKE_BUILD_TYPE STREQUAL Debug OR CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo)
- ADD_CUSTOM_COMMAND(TARGET blender
+ else()
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\release\\python31.zip\" \"${TARGETDIR}\\\"
+ COMMAND xcopy /E /Y \"${LIBDIR}\\release\\python31\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
)
- ENDIF(CMAKE_BUILD_TYPE STREQUAL Debug OR CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo)
- ENDIF(NOT CMAKE_BUILD_TYPE)
- ENDIF(WITH_PYTHON)
+ endif()
+ endif()
+ endif()
- IF(WITH_INTERNATIONAL)
- IF(CMAKE_CL_64)
+ if(WITH_INTERNATIONAL)
+ if(CMAKE_CL_64)
# iconv is statically linked on win64
- ADD_CUSTOM_COMMAND(TARGET blender
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\"
COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\\"
COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\\\"
)
- ELSE(CMAKE_CL_64)
- ADD_CUSTOM_COMMAND(TARGET blender
+ else()
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\iconv\\lib\\iconv.dll\" \"${TARGETDIR}\\\"
@@ -383,82 +361,117 @@ IF(WITH_INSTALL)
COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\\"
COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\\\"
)
- ENDIF(CMAKE_CL_64)
- ENDIF(WITH_INTERNATIONAL)
+ endif()
+ endif()
- IF(WITH_FFMPEG)
- ADD_CUSTOM_COMMAND(TARGET blender
+ if(WITH_CODEC_FFMPEG)
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avcodec-52.dll\" \"${TARGETDIR}\\\"
COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avformat-52.dll\" \"${TARGETDIR}\\\"
COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avdevice-52.dll\" \"${TARGETDIR}\\\"
COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avutil-50.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\libfaac-0.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\libfaad-2.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\libmp3lame-0.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\libx264-67.dll\" \"${TARGETDIR}\\\"
COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\swscale-0.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\xvidcore.dll\" \"${TARGETDIR}\\\"
)
- ENDIF(WITH_FFMPEG)
+ endif()
- IF(WITH_SNDFILE)
- ADD_CUSTOM_COMMAND(TARGET blender
+ if(WITH_CODEC_SNDFILE)
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\sndfile\\lib\\libsndfile-1.dll\" \"${TARGETDIR}\\\"
)
- ENDIF(WITH_SNDFILE)
+ endif()
- IF(WITH_JACK)
- ADD_CUSTOM_COMMAND(TARGET blender
+ if(WITH_JACK)
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\jack\\lib\\libjack.dll\" \"${TARGETDIR}\\\"
)
- ENDIF(WITH_JACK)
+ endif()
- IF(WITH_OPENAL)
- ADD_CUSTOM_COMMAND(TARGET blender
+ if(WITH_OPENAL)
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\openal\\lib\\OpenAL32.dll\" \"${TARGETDIR}\\\"
COMMAND copy /Y \"${LIBDIR}\\openal\\lib\\wrap_oal.dll\" \"${TARGETDIR}\\\"
)
- ENDIF(WITH_OPENAL)
+ endif()
- IF(WITH_SDL)
- IF(NOT CMAKE_CL_64)
- ADD_CUSTOM_COMMAND(TARGET blender
+ if(WITH_SDL)
+ if(NOT CMAKE_CL_64)
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\sdl\\lib\\SDL.dll\" \"${TARGETDIR}\\\"
)
- ENDIF(NOT CMAKE_CL_64)
- ENDIF(WITH_SDL)
+ endif()
+ endif()
- ENDIF(WIN32)
-ENDIF(WITH_INSTALL)
+ elseif(APPLE)
+ set(SOURCEDIR ${CMAKE_SOURCE_DIR}/source/darwin/blender.app)
+ set(SOURCEINFO ${SOURCEDIR}/Contents/Info.plist)
+ set(TARGETINFO ${TARGETDIR}/blender.app/Contents/Info.plist)
-ADD_DEPENDENCIES(blender makesdna)
+ add_custom_command(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMAND cp -Rf ${SOURCEINFO} ${TARGETDIR}/blender.app/Contents/
+ COMMAND cp -Rf ${SOURCEDIR}/Contents/PkgInfo ${TARGETDIR}/blender.app/Contents/
+ COMMAND cp -Rf ${SOURCEDIR}/Contents/Resources ${TARGETDIR}/blender.app/Contents/
+ COMMAND cat ${SOURCEINFO} | sed s/VERSION/`cat ${CMAKE_SOURCE_DIR}/release/VERSION`/ | sed s/DATE/`date +'%Y-%b-%d'`/ > ${TARGETINFO}
+ COMMAND rm -Rf ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}
+ COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}
+ COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/datafiles/
+ COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.bfont.ttf ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/datafiles/
+ )
+
+ if(WITH_INTERNATIONAL)
+ add_custom_command(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.Blanguages ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/datafiles/
+ COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/datafiles/
+ )
+ endif()
+
+ if(WITH_PYTHON)
+ set(PYTHON_ZIP "python_${CMAKE_OSX_ARCHITECTURES}.zip")
+ add_custom_command(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/
+ COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/python/
+ COMMAND unzip -q ${LIBDIR}/release/${PYTHON_ZIP} -d ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/python/
+ COMMAND find ${TARGETDIR}/blender.app -name "*.py?" -prune -exec rm -rf {} "\;"
+ )
+ endif()
+
+ add_custom_command(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMAND find ${TARGETDIR}/blender.app -name .DS_Store -prune -exec rm -rf {} "\;"
+ COMMAND find ${TARGETDIR}/blender.app -name .svn -prune -exec rm -rf {} "\;"
+ COMMAND find ${TARGETDIR}/blender.app -name __MACOSX -prune -exec rm -rf {} "\;"
+ )
+ endif()
-FILE(READ ${CMAKE_BINARY_DIR}/cmake_blender_libs.txt BLENDER_LINK_LIBS)
+endif()
-SET(BLENDER_LINK_LIBS bf_nodes ${BLENDER_LINK_LIBS} bf_windowmanager bf_render)
+add_dependencies(blender makesdna)
-IF(WITH_FLUID)
- LIST(APPEND BLENDER_LINK_LIBS bf_intern_elbeem)
-ENDIF(WITH_FLUID)
+get_property(BLENDER_LINK_LIBS GLOBAL PROPERTY BLENDER_LINK_LIBS)
-IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
- LIST(APPEND BLENDER_LINK_LIBS extern_binreloc)
-ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+set(BLENDER_LINK_LIBS bf_nodes ${BLENDER_LINK_LIBS} bf_windowmanager bf_render)
-#IF(UNIX)
+if(WITH_MOD_FLUID)
+ list(APPEND BLENDER_LINK_LIBS bf_intern_elbeem)
+endif()
+
+
+#if(UNIX)
# Sort libraries
- SET(BLENDER_SORTED_LIBS
+ set(BLENDER_SORTED_LIBS
bf_windowmanager
bf_editor_space_api
@@ -499,7 +512,6 @@ ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
bf_editor_animation
bf_editor_datafiles
- bf_intern_bsp
bf_render
bf_intern_opennl
bf_python
@@ -516,89 +528,88 @@ ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
bf_blenpluginapi
bf_imbuf
bf_avi
- bf_cineon
- bf_openexr
- bf_dds
+ bf_imbuf_cineon
+ bf_imbuf_openexr
+ bf_imbuf_dds
bf_readblenfile
bf_collada
bf_intern_bsp
bf_intern_bop
- bf_kernel
+ bf_gen_system
bf_intern_decimate
bf_intern_elbeem
bf_intern_ik
bf_intern_memutil
bf_intern_guardedalloc
bf_intern_ctr
- bf_intern_moto
- bf_windowmanager
- bf_blroutines
- bf_converter
- bf_dummy
- bf_bullet
+ ge_blen_routines
+ ge_converter
+ ge_phys_dummy
+ ge_phys_bullet
bf_intern_smoke
extern_minilzo
extern_lzma
- bf_common
- bf_ketsji
- bf_logic
- bf_rasterizer
- bf_oglrasterizer
- bf_expressions
- bf_scenegraph
- bf_intern_moto
- bf_blroutines
- kx_network
- bf_kernel
- bf_ngnetwork
+ ge_logic_ketsji
+ ge_phys_common
+ ge_logic
+ ge_rasterizer
+ ge_oglrasterizer
+ ge_logic_expressions
+ ge_scenegraph
+ ge_logic_network
+ bf_gen_system
+ bf_python # duplicate for BPY_driver_exec
+ ge_logic_ngnetwork
extern_bullet
- bf_loopbacknetwork
- bf_intern_itasc
- bf_common
+ ge_logic_loopbacknetwork
bf_intern_moto
- bf_python
- bf_python_ext
- extern_binreloc
extern_glew
extern_openjpeg
- extern_recastnavigation
- bf_videotex
+ extern_redcode
+ ge_videotex
bf_rna
bf_dna
bf_blenfont
bf_intern_audaspace
- bf_intern_decimate
-
+ extern_recastnavigation
)
- IF(WITH_CXX_GUARDEDALLOC)
- LIST(APPEND BLENDER_SORTED_LIBS bf_intern_guardedalloc_cpp)
- ENDIF(WITH_CXX_GUARDEDALLOC)
-
- IF(WITH_IK_ITASC)
- LIST(APPEND BLENDER_SORTED_LIBS bf_intern_itasc)
- ENDIF(WITH_IK_ITASC)
-
- IF(WITH_QUICKTIME)
- LIST(APPEND BLENDER_SORTED_LIBS bf_quicktime)
- ENDIF(WITH_QUICKTIME)
-
-
- FOREACH(SORTLIB ${BLENDER_SORTED_LIBS})
- SET(REMLIB ${SORTLIB})
- FOREACH(SEARCHLIB ${BLENDER_LINK_LIBS})
- IF(${SEARCHLIB} STREQUAL ${SORTLIB})
- SET(REMLIB "")
- ENDIF(${SEARCHLIB} STREQUAL ${SORTLIB})
- ENDFOREACH(SEARCHLIB)
- IF(REMLIB)
- MESSAGE(STATUS "Removing library ${REMLIB} from blender linking because: not configured")
- LIST(REMOVE_ITEM BLENDER_SORTED_LIBS ${REMLIB})
- ENDIF(REMLIB)
- ENDFOREACH(SORTLIB)
- TARGET_LINK_LIBRARIES(blender ${BLENDER_SORTED_LIBS})
-#ELSE(UNIX)
-# TARGET_LINK_LIBRARIES(blender ${BLENDER_LINK_LIBS})
-#ENDIF(UNIX)
-
-SETUP_LIBLINKS(blender)
+ if(CMAKE_SYSTEM_NAME MATCHES "Linux")
+ list(APPEND BLENDER_SORTED_LIBS extern_binreloc)
+ endif()
+
+ if(WITH_CXX_GUARDEDALLOC)
+ list(APPEND BLENDER_SORTED_LIBS bf_intern_guardedalloc_cpp)
+ endif()
+
+ if(WITH_IK_ITASC)
+ list(APPEND BLENDER_SORTED_LIBS bf_intern_itasc)
+ endif()
+
+ if(WITH_CODEC_QUICKTIME)
+ list(APPEND BLENDER_SORTED_LIBS bf_quicktime)
+ endif()
+
+ foreach(SORTLIB ${BLENDER_SORTED_LIBS})
+ set(REMLIB ${SORTLIB})
+ foreach(SEARCHLIB ${BLENDER_LINK_LIBS})
+ if(${SEARCHLIB} STREQUAL ${SORTLIB})
+ set(REMLIB "")
+ endif()
+ endforeach()
+ if(REMLIB)
+ # message(STATUS "Removing library ${REMLIB} from blender linking because: not configured")
+ list(APPEND REM_MSG ${REMLIB})
+ list(REMOVE_ITEM BLENDER_SORTED_LIBS ${REMLIB})
+ endif()
+ endforeach()
+ if(REM_MSG)
+ list(SORT REM_MSG)
+ message(STATUS "Blender Skipping: (${REM_MSG})")
+ endif()
+ target_link_libraries(blender ${BLENDER_SORTED_LIBS})
+#else()
+# target_link_libraries(blender ${BLENDER_LINK_LIBS})
+#endif()
+
+setup_liblinks(blender)
diff --git a/source/creator/Makefile b/source/creator/Makefile
deleted file mode 100644
index 08f732ad486..00000000000
--- a/source/creator/Makefile
+++ /dev/null
@@ -1,84 +0,0 @@
-# -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*-
-# vim: tabstop=8
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): GSR
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-
-LIBNAME = creator
-DIR = $(OCGDIR)/creator
-
-# this HAS to go
-CSRCS = creator.c
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I../blender/render/extern/include
-
-# two needed for the kernel
-CPPFLAGS += -I../blender/imbuf
-CPPFLAGS += -I../blender/makesdna
-CPPFLAGS += -I../blender/makesrna
-CPPFLAGS += -I../blender/blenlib
-CPPFLAGS += -I../blender/editors/include
-CPPFLAGS += -I../blender/renderconverter
-CPPFLAGS += -I../blender/blenkernel
-CPPFLAGS += -I../blender/python
-CPPFLAGS += -I../blender/blenloader
-CPPFLAGS += -I../blender/gpu
-CPPFLAGS += -I../blender/windowmanager
-CPPFLAGS += -I../kernel/gen_system
-CPPFLAGS += -I../kernel/gen_messaging
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_GLEW)/include
-
-ifeq ($(WITH_QUICKTIME), true)
- CPPFLAGS += -I$(NAN_QUICKTIME)/include -DWITH_QUICKTIME
-endif
-ifeq ($(WITH_OPENJPEG), true)
- CPPFLAGS += -DWITH_OPENJPEG
-endif
-
-ifeq ($(WITH_BINRELOC), true)
- CPPFLAGS += -I$(NANBLENDERHOME)/extern/binreloc/include -DWITH_BINRELOC
-endif
-
-ifeq ($(WITH_TIFF), true)
- CPPFLAGS += -DWITH_TIFF
-endif
-
-ifeq ($(WITH_CINEON), true)
- CPPFLAGS += -DWITH_CINEON
-endif
-
-ifeq ($(WITH_HDR), true)
- CPPFLAGS += -DWITH_HDR
-endif
-
-CPPFLAGS += -I$(OPENGL_HEADERS)
diff --git a/source/creator/SConscript b/source/creator/SConscript
index 6ee9aea29a5..8577872c48a 100644
--- a/source/creator/SConscript
+++ b/source/creator/SConscript
@@ -31,10 +31,9 @@ if not env['WITH_BF_SDL']:
if env['WITH_BF_PYTHON']:
incs += ' ../blender/python'
+ defs.append('WITH_PYTHON')
if env['BF_DEBUG']:
defs.append('_DEBUG')
-else:
- defs.append('DISABLE_PYTHON')
if env['BF_BUILDINFO']:
defs.append('BUILD_DATE')
diff --git a/source/creator/buildinfo.c b/source/creator/buildinfo.c
index d745d826bd6..c3b9ea56c45 100644
--- a/source/creator/buildinfo.c
+++ b/source/creator/buildinfo.c
@@ -27,13 +27,28 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#define STRINGIFY(x) XSTRINGIFY(x)
-#define XSTRINGIFY(x) #x
-
#ifdef BUILD_DATE
+
+/* copied from BLI_utildefines.h */
+#define STRINGIFY_ARG(x) #x
+#define STRINGIFY(x) STRINGIFY_ARG(x)
+
char build_date[]= STRINGIFY(BUILD_DATE);
char build_time[]= STRINGIFY(BUILD_TIME);
char build_rev[]= STRINGIFY(BUILD_REV);
char build_platform[]= STRINGIFY(BUILD_PLATFORM);
char build_type[]= STRINGIFY(BUILD_TYPE);
+
+#ifdef BUILD_CFLAGS
+char build_cflags[]= STRINGIFY(BUILD_CFLAGS);
+char build_cxxflags[]= STRINGIFY(BUILD_CXXFLAGS);
+char build_linkflags[]= STRINGIFY(BUILD_LINKFLAGS);
+char build_system[]= STRINGIFY(BUILD_SYSTEM);
+#else
+char build_cflags[]= "unmaintained buildsystem alert!";
+char build_cxxflags[]= "unmaintained buildsystem alert!";
+char build_linkflags[]= "unmaintained buildsystem alert!";
+char build_system[]= "unmaintained buildsystem alert!";
#endif
+
+#endif // BUILD_DATE
diff --git a/source/creator/creator.c b/source/creator/creator.c
index 4066d16186b..730563dfc63 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -57,8 +57,8 @@
#include "BLI_args.h"
#include "BLI_threads.h"
-
-#include "GEN_messaging.h"
+#include "BLI_scanfill.h" // for BLI_setErrorCallBack, TODO, move elsewhere
+#include "BLI_utildefines.h"
#include "DNA_ID.h"
#include "DNA_scene_types.h"
@@ -68,6 +68,7 @@
#include "BKE_utildefines.h"
#include "BKE_blender.h"
#include "BKE_context.h"
+#include "BKE_depsgraph.h" // for DAG_on_load_update
#include "BKE_font.h"
#include "BKE_global.h"
#include "BKE_main.h"
@@ -80,7 +81,7 @@
#include "IMB_imbuf.h" // for IMB_init
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -97,7 +98,12 @@
#include "GPU_extensions.h"
/* for passing information between creator and gameengine */
+#ifdef WITH_GAMEENGINE
+#include "GEN_messaging.h"
#include "SYS_System.h"
+#else /* dummy */
+#define SYS_SystemHandle int
+#endif
#include <signal.h>
@@ -118,6 +124,10 @@ extern char build_time[];
extern char build_rev[];
extern char build_platform[];
extern char build_type[];
+extern char build_cflags[];
+extern char build_cxxflags[];
+extern char build_linkflags[];
+extern char build_system[];
#endif
/* Local Function prototypes */
@@ -138,7 +148,7 @@ static void setCallbacks(void);
/* set breakpoints here when running in debug mode, useful to catch floating point errors */
#if defined(__sgi) || defined(__linux__) || defined(_WIN32) || OSX_SSE_FPE
-static void fpe_handler(int sig)
+static void fpe_handler(int UNUSED(sig))
{
// printf("SIGFPE trapped\n");
}
@@ -175,7 +185,7 @@ static void strip_quotes(char *str)
}
#endif
-static int print_version(int argc, char **argv, void *data)
+static int print_version(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data))
{
printf (BLEND_VERSION_STRING_FMT);
#ifdef BUILD_DATE
@@ -184,13 +194,17 @@ static int print_version(int argc, char **argv, void *data)
printf ("\tbuild revision: %s\n", build_rev);
printf ("\tbuild platform: %s\n", build_platform);
printf ("\tbuild type: %s\n", build_type);
+ printf ("\tbuild c flags: %s\n", build_cflags);
+ printf ("\tbuild c++ flags: %s\n", build_cxxflags);
+ printf ("\tbuild link flags: %s\n", build_linkflags);
+ printf ("\tbuild system: %s\n", build_system);
#endif
exit(0);
return 0;
}
-static int print_help(int argc, char **argv, void *data)
+static int print_help(int UNUSED(argc), char **UNUSED(argv), void *data)
{
bArgs *ba = (bArgs*)data;
@@ -232,9 +246,15 @@ static int print_help(int argc, char **argv, void *data)
printf ("Misc Options:\n");
BLI_argsPrintArgDoc(ba, "--debug");
BLI_argsPrintArgDoc(ba, "--debug-fpe");
-
printf("\n");
-
+ BLI_argsPrintArgDoc(ba, "--factory-startup");
+ printf("\n");
+ BLI_argsPrintArgDoc(ba, "--env-system-config");
+ BLI_argsPrintArgDoc(ba, "--env-system-datafiles");
+ BLI_argsPrintArgDoc(ba, "--env-system-scripts");
+ BLI_argsPrintArgDoc(ba, "--env-system-plugins");
+ BLI_argsPrintArgDoc(ba, "--env-system-python");
+ printf("\n");
BLI_argsPrintArgDoc(ba, "-nojoystick");
BLI_argsPrintArgDoc(ba, "-noglsl");
BLI_argsPrintArgDoc(ba, "-noaudio");
@@ -253,6 +273,7 @@ static int print_help(int argc, char **argv, void *data)
BLI_argsPrintArgDoc(ba, "--python");
BLI_argsPrintArgDoc(ba, "--python-console");
+ BLI_argsPrintArgDoc(ba, "--addons");
#ifdef WIN32
BLI_argsPrintArgDoc(ba, "-R");
@@ -317,30 +338,30 @@ double PIL_check_seconds_timer(void);
}
}*/
-static int end_arguments(int argc, char **argv, void *data)
+static int end_arguments(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data))
{
return -1;
}
-static int enable_python(int argc, char **argv, void *data)
+static int enable_python(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data))
{
G.f |= G_SCRIPT_AUTOEXEC;
return 0;
}
-static int disable_python(int argc, char **argv, void *data)
+static int disable_python(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data))
{
G.f &= ~G_SCRIPT_AUTOEXEC;
return 0;
}
-static int background_mode(int argc, char **argv, void *data)
+static int background_mode(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data))
{
G.background = 1;
return 0;
}
-static int debug_mode(int argc, char **argv, void *data)
+static int debug_mode(int UNUSED(argc), char **UNUSED(argv), void *data)
{
G.f |= G_DEBUG; /* std output printf's */
printf(BLEND_VERSION_STRING_FMT);
@@ -354,7 +375,7 @@ static int debug_mode(int argc, char **argv, void *data)
return 0;
}
-static int set_fpe(int argc, char **argv, void *data)
+static int set_fpe(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data))
{
#if defined(__sgi) || defined(__linux__) || defined(_WIN32) || OSX_SSE_FPE
/* zealous but makes float issues a heck of a lot easier to find!
@@ -379,7 +400,35 @@ static int set_fpe(int argc, char **argv, void *data)
return 0;
}
-static int playback_mode(int argc, char **argv, void *data)
+static int set_factory_startup(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data))
+{
+ G.factory_startup= 1;
+ return 0;
+}
+
+static int set_env(int argc, char **argv, void *UNUSED(data))
+{
+ /* "--env-system-scripts" --> "BLENDER_SYSTEM_SCRIPTS" */
+
+ char env[64]= "BLENDER";
+ char *ch_dst= env + 7; /* skip BLENDER */
+ char *ch_src= argv[0] + 5; /* skip --env */
+
+ if (argc < 2) {
+ printf("%s requires one argument\n", argv[0]);
+ exit(1);
+ }
+
+ for(; *ch_src; ch_src++, ch_dst++) {
+ *ch_dst= (*ch_src == '-') ? '_' : (*ch_src)-32; /* toupper() */
+ }
+
+ *ch_dst= '\0';
+ BLI_setenv(env, argv[1]);
+ return 1;
+}
+
+static int playback_mode(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data))
{
/* not if -b was given first */
if (G.background == 0) {
@@ -391,7 +440,7 @@ static int playback_mode(int argc, char **argv, void *data)
return -2;
}
-static int prefsize(int argc, char **argv, void *data)
+static int prefsize(int argc, char **argv, void *UNUSED(data))
{
int stax, stay, sizx, sizy;
@@ -410,30 +459,35 @@ static int prefsize(int argc, char **argv, void *data)
return 4;
}
-static int with_borders(int argc, char **argv, void *data)
+static int with_borders(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data))
{
WM_setinitialstate_normal();
return 0;
}
-static int without_borders(int argc, char **argv, void *data)
+static int without_borders(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data))
{
WM_setinitialstate_fullscreen();
return 0;
}
-static int register_extension(int argc, char **argv, void *data)
+static int register_extension(int UNUSED(argc), char **UNUSED(argv), void *data)
{
#ifdef WIN32
char *path = BLI_argsArgv(data)[0];
RegisterBlendExtension(path);
+#else
+ (void)data; /* unused */
#endif
return 0;
}
-static int no_joystick(int argc, char **argv, void *data)
+static int no_joystick(int UNUSED(argc), char **UNUSED(argv), void *data)
{
+#ifndef WITH_GAMEENGINE
+ (void)data;
+#else
SYS_SystemHandle *syshandle = data;
/**
@@ -442,23 +496,24 @@ static int no_joystick(int argc, char **argv, void *data)
*/
SYS_WriteCommandLineInt(*syshandle, "nojoystick",1);
if (G.f & G_DEBUG) printf("disabling nojoystick\n");
+#endif
return 0;
}
-static int no_glsl(int argc, char **argv, void *data)
+static int no_glsl(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data))
{
GPU_extensions_disable();
return 0;
}
-static int no_audio(int argc, char **argv, void *data)
+static int no_audio(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data))
{
sound_force_device(0);
return 0;
}
-static int set_audio(int argc, char **argv, void *data)
+static int set_audio(int argc, char **argv, void *UNUSED(data))
{
if (argc < 1) {
printf("-setaudio require one argument\n");
@@ -583,7 +638,7 @@ static int set_image_type(int argc, char **argv, void *data)
}
}
-static int set_threads(int argc, char **argv, void *data)
+static int set_threads(int argc, char **argv, void *UNUSED(data))
{
if (argc >= 1) {
if(G.background) {
@@ -623,8 +678,13 @@ static int set_extension(int argc, char **argv, void *data)
static int set_ge_parameters(int argc, char **argv, void *data)
{
- SYS_SystemHandle syshandle = *(SYS_SystemHandle*)data;
int a = 0;
+#ifdef WITH_GAMEENGINE
+ SYS_SystemHandle syshandle = *(SYS_SystemHandle*)data;
+#else
+ (void)data;
+#endif
+
/**
gameengine parameters are automaticly put into system
-g [paramname = value]
@@ -645,7 +705,9 @@ example:
{
a++;
/* assignment */
+#ifdef WITH_GAMEENGINE
SYS_WriteCommandLineString(syshandle,paramname,argv[a]);
+#endif
} else
{
printf("error: argument assignment (%s) without value.\n",paramname);
@@ -654,8 +716,9 @@ example:
/* name arg eaten */
} else {
+#ifdef WITH_GAMEENGINE
SYS_WriteCommandLineInt(syshandle,argv[a],1);
-
+#endif
/* doMipMap */
if (!strcmp(argv[a],"nomipmap"))
{
@@ -714,7 +777,7 @@ static int render_frame(int argc, char **argv, void *data)
}
}
-static int render_animation(int argc, char **argv, void *data)
+static int render_animation(int UNUSED(argc), char **UNUSED(argv), void *data)
{
bContext *C = data;
if (CTX_data_scene(C)) {
@@ -803,7 +866,7 @@ static int set_skip_frame(int argc, char **argv, void *data)
}
/* macro for ugly context setup/reset */
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#define BPY_CTX_SETUP(_cmd) \
{ \
wmWindowManager *wm= CTX_wm_manager(C); \
@@ -821,11 +884,11 @@ static int set_skip_frame(int argc, char **argv, void *data)
CTX_data_scene_set(C, prevscene); \
} \
-#endif /* DISABLE_PYTHON */
+#endif /* WITH_PYTHON */
static int run_python(int argc, char **argv, void *data)
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
bContext *C = data;
/* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */
@@ -835,7 +898,7 @@ static int run_python(int argc, char **argv, void *data)
BLI_strncpy(filename, argv[1], sizeof(filename));
BLI_path_cwd(filename);
- BPY_CTX_SETUP( BPY_run_python_script(C, filename, NULL, NULL) )
+ BPY_CTX_SETUP(BPY_filepath_exec(C, filename, NULL))
return 1;
} else {
@@ -843,27 +906,50 @@ static int run_python(int argc, char **argv, void *data)
return 0;
}
#else
+ (void)argc; (void)argv; (void)data; /* unused */
printf("This blender was built without python support\n");
return 0;
-#endif /* DISABLE_PYTHON */
+#endif /* WITH_PYTHON */
}
-static int run_python_console(int argc, char **argv, void *data)
+static int run_python_console(int UNUSED(argc), char **argv, void *data)
{
-#ifndef DISABLE_PYTHON
- bContext *C = data;
- const char *expr= "__import__('code').interact()";
+#ifdef WITH_PYTHON
+ bContext *C = data;
- BPY_CTX_SETUP( BPY_eval_string(C, expr) )
+ BPY_CTX_SETUP(BPY_string_exec(C, "__import__('code').interact()"))
return 0;
#else
+ (void)argv; (void)data; /* unused */
printf("This blender was built without python support\n");
return 0;
-#endif /* DISABLE_PYTHON */
+#endif /* WITH_PYTHON */
+}
+
+static int set_addons(int argc, char **argv, void *data)
+{
+ /* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */
+ if (argc > 1) {
+#ifdef WITH_PYTHON
+ char *str= malloc(strlen(argv[1]) + 100);
+ bContext *C= data;
+ sprintf(str, "[__import__('bpy').utils.addon_enable(i) for i in '%s'.split(',')]", argv[1]);
+ BPY_CTX_SETUP(BPY_string_exec(C, str));
+ free(str);
+#else
+ (void)argv; (void)data; /* unused */
+#endif /* WITH_PYTHON */
+ return 1;
+ }
+ else {
+ printf("\nError: you must specify a comma separated list after '--addons'.\n");
+ return 0;
+ }
}
-static int load_file(int argc, char **argv, void *data)
+
+static int load_file(int UNUSED(argc), char **argv, void *data)
{
bContext *C = data;
@@ -873,22 +959,35 @@ static int load_file(int argc, char **argv, void *data)
BLI_path_cwd(filename);
if (G.background) {
- int retval = BKE_read_file(C, filename, NULL, NULL);
+ int retval = BKE_read_file(C, filename, NULL);
/*we successfully loaded a blend file, get sure that
pointcache works */
- if (retval!=0) {
+ if (retval != BKE_READ_FILE_FAIL) {
wmWindowManager *wm= CTX_wm_manager(C);
+
+ /* special case, 2.4x files */
+ if(wm==NULL && CTX_data_main(C)->wm.first==NULL) {
+ extern void wm_add_default(bContext *C);
+
+ /* wm_add_default() needs the screen to be set. */
+ CTX_wm_screen_set(C, CTX_data_main(C)->screen.first);
+ wm_add_default(C);
+ }
+
CTX_wm_manager_set(C, NULL); /* remove wm to force check */
WM_check(C);
G.relbase_valid = 1;
if (CTX_wm_manager(C) == NULL) CTX_wm_manager_set(C, wm); /* reset wm */
+
+ DAG_on_load_update(CTX_data_main(C), TRUE);
}
/* WM_read_file() runs normally but since we're in background mode do here */
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* run any texts that were loaded in and flagged as modules */
- BPY_load_user_modules(C);
+ BPY_driver_reset();
+ BPY_modules_load_user(C);
#endif
/* happens for the UI on file reading too (huh? (ton))*/
@@ -897,7 +996,10 @@ static int load_file(int argc, char **argv, void *data)
} else {
/* we are not running in background mode here, but start blender in UI mode with
a file - this should do everything a 'load file' does */
- WM_read_file(C, filename, NULL);
+ ReportList reports;
+ BKE_reports_init(&reports, RPT_PRINT);
+ WM_read_file(C, filename, &reports);
+ BKE_reports_clear(&reports);
}
G.file_loaded = 1;
@@ -935,9 +1037,9 @@ void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
static char game_doc[] = "Game Engine specific options"
"\n\t-g fixedtime\t\tRun on 50 hertz without dropping frames"
- "\n\t-g vertexarrays\tUse Vertex Arrays for rendering (usually faster)"
+ "\n\t-g vertexarrays\t\tUse Vertex Arrays for rendering (usually faster)"
"\n\t-g nomipmap\t\tNo Texture Mipmapping"
- "\n\t-g linearmipmap\tLinear Texture Mipmapping instead of Nearest (default)";
+ "\n\t-g linearmipmap\t\tLinear Texture Mipmapping instead of Nearest (default)";
static char debug_doc[] = "\n\tTurn debugging on\n"
"\n\t* Prints every operator call and their arguments"
@@ -964,12 +1066,21 @@ void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
BLI_argsAdd(ba, 1, "-a", NULL, playback_doc, playback_mode, NULL);
BLI_argsAdd(ba, 1, "-d", "--debug", debug_doc, debug_mode, ba);
- BLI_argsAdd(ba, 1, NULL, "--debug-fpe", "\n\tEnable floating point exceptions", set_fpe, NULL);
+ BLI_argsAdd(ba, 1, NULL, "--debug-fpe", "\n\tEnable floating point exceptions", set_fpe, NULL);
+
+ BLI_argsAdd(ba, 1, NULL, "--factory-startup", "\n\tSkip reading the "STRINGIFY(BLENDER_STARTUP_FILE)" in the users home directory", set_factory_startup, NULL);
+
+ /* TODO, add user env vars? */
+ BLI_argsAdd(ba, 1, NULL, "--env-system-config", "\n\tSet the "STRINGIFY_ARG(BLENDER_SYSTEM_CONFIG)" environment variable", set_env, NULL);
+ BLI_argsAdd(ba, 1, NULL, "--env-system-datafiles", "\n\tSet the "STRINGIFY_ARG(BLENDER_SYSTEM_DATAFILES)" environment variable", set_env, NULL);
+ BLI_argsAdd(ba, 1, NULL, "--env-system-scripts", "\n\tSet the "STRINGIFY_ARG(BLENDER_SYSTEM_SCRIPTS)" environment variable", set_env, NULL);
+ BLI_argsAdd(ba, 1, NULL, "--env-system-plugins", "\n\tSet the "STRINGIFY_ARG(BLENDER_SYSTEM_PLUGINS)" environment variable", set_env, NULL);
+ BLI_argsAdd(ba, 1, NULL, "--env-system-python", "\n\tSet the "STRINGIFY_ARG(BLENDER_SYSTEM_PYTHON)" environment variable", set_env, NULL);
/* second pass: custom window stuff */
BLI_argsAdd(ba, 2, "-p", "--window-geometry", "<sx> <sy> <w> <h>\n\tOpen with lower left corner at <sx>, <sy> and width and height as <w>, <h>", prefsize, NULL);
BLI_argsAdd(ba, 2, "-w", "--window-border", "\n\tForce opening with borders (default)", with_borders, NULL);
- BLI_argsAdd(ba, 2, "-W", "--window-borderless", "\n\tForce opening with without borders", without_borders, NULL);
+ BLI_argsAdd(ba, 2, "-W", "--window-borderless", "\n\tForce opening without borders", without_borders, NULL);
BLI_argsAdd(ba, 2, "-R", NULL, "\n\tRegister .blend extension (windows only)", register_extension, ba);
/* third pass: disabling things and forcing settings */
@@ -988,12 +1099,13 @@ void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
BLI_argsAdd(ba, 4, "-j", "--frame-jump", "<frames>\n\tSet number of frames to step forward after each rendered frame", set_skip_frame, C);
BLI_argsAdd(ba, 4, "-P", "--python", "<filename>\n\tRun the given Python script (filename or Blender Text)", run_python, C);
BLI_argsAdd(ba, 4, NULL, "--python-console", "\n\tRun blender with an interactive console", run_python_console, C);
+ BLI_argsAdd(ba, 4, NULL, "--addons", "\n\tComma separated list of addons (no spaces)", set_addons, C);
BLI_argsAdd(ba, 4, "-o", "--render-output", output_doc, set_output, C);
BLI_argsAdd(ba, 4, "-E", "--engine", "<engine>\n\tSpecify the render engine\n\tuse -E help to list available engines", set_engine, C);
BLI_argsAdd(ba, 4, "-F", "--render-format", format_doc, set_image_type, C);
- BLI_argsAdd(ba, 4, "-t", "--threads", "<threads>\n\tUse amount of <threads> for rendering in background\n\t[1-" QUOTE(BLENDER_MAX_THREADS) "], 0 for systems processor count.", set_threads, NULL);
+ BLI_argsAdd(ba, 4, "-t", "--threads", "<threads>\n\tUse amount of <threads> for rendering in background\n\t[1-" STRINGIFY(BLENDER_MAX_THREADS) "], 0 for systems processor count.", set_threads, NULL);
BLI_argsAdd(ba, 4, "-x", "--use-extension", "<bool>\n\tSet option to add the file extension to the end of the file", set_extension, C);
}
@@ -1035,11 +1147,15 @@ int main(int argc, char **argv)
BLI_where_am_i(bprogname, argv[0]);
#ifdef BUILD_DATE
- strip_quotes(build_date);
- strip_quotes(build_time);
- strip_quotes(build_rev);
- strip_quotes(build_platform);
- strip_quotes(build_type);
+ strip_quotes(build_date);
+ strip_quotes(build_time);
+ strip_quotes(build_rev);
+ strip_quotes(build_platform);
+ strip_quotes(build_type);
+ strip_quotes(build_cflags);
+ strip_quotes(build_cxxflags);
+ strip_quotes(build_linkflags);
+ strip_quotes(build_system);
#endif
BLI_threadapi_init();
@@ -1058,8 +1174,12 @@ int main(int argc, char **argv)
IMB_init();
+#ifdef WITH_GAMEENGINE
syshandle = SYS_GetSystem();
GEN_init_messaging_system();
+#else
+ syshandle= 0;
+#endif
/* first test for background */
ba = BLI_argsInit(argc, argv); /* skip binary path */
@@ -1089,19 +1209,12 @@ int main(int argc, char **argv)
BLI_argsParse(ba, 3, NULL, NULL);
WM_init(C, argc, argv);
-
+
/* this is properly initialized with user defs, but this is default */
BLI_where_is_temp( btempdir, 1 ); /* call after loading the startup.blend so we can read U.tempdir */
#ifndef DISABLE_SDL
BLI_setenv("SDL_VIDEODRIVER", "dummy");
-/* I think this is not necessary anymore (04-24-2010 neXyon)
-#ifdef __linux__
- // On linux the default SDL driver dma often would not play
- // use alsa if none is set
- setenv("SDL_AUDIODRIVER", "alsa", 0);
-#endif
-*/
#endif
}
else {
@@ -1111,18 +1224,19 @@ int main(int argc, char **argv)
BLI_where_is_temp( btempdir, 0 ); /* call after loading the startup.blend so we can read U.tempdir */
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/**
* NOTE: the U.pythondir string is NULL until WM_init() is executed,
* so we provide the BPY_ function below to append the user defined
* pythondir to Python's sys.path at this point. Simply putting
- * WM_init() before BPY_start_python() crashes Blender at startup.
+ * WM_init() before BPY_python_start() crashes Blender at startup.
* Update: now this function also inits the bpymenus, which also depend
* on U.pythondir.
*/
// TODO - U.pythondir
-
+#else
+ printf("\n* WARNING * - Blender compiled without Python!\nthis is not intended for typical usage\n\n");
#endif
CTX_py_init_set(C, 1);
diff --git a/source/darwin/Makefile b/source/darwin/Makefile
deleted file mode 100644
index 5c68f43f606..00000000000
--- a/source/darwin/Makefile
+++ /dev/null
@@ -1,61 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-
-include nan_definitions.mk
-
-DIR = $(OCGDIR)/$(DEBUG_DIR)
-
-PYARCHIVE = python_$(MACOSX_ARCHITECTURE).zip
-
-all::
- @# set up directory structure for the OSX aplication bundle
- @echo "---> creating directory structure for $(APPLICATION)"
- @rm -rf $(DIR)/bin/$(APPLICATION).app
- @cp -R $(APPLICATION).app $(DIR)/bin
- @cat $(APPLICATION).app/Contents/Info.plist | sed s/VERSION/`cat ../../release/VERSION`/ | sed s/DATE/`date +'%Y-%b-%d'`/ > $(DIR)/bin/$(APPLICATION).app/Contents/Info.plist
- @echo "---> copying binary"
- @cp $(DIR)/bin/$(APPLICATION) $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/
- @echo "---> adding excutable attributes"
- @chmod +x $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/$(APPLICATION)
-ifeq ($(APPLICATION), blender)
- @echo "---> copying message files"
- @cp -R $(NANBLENDERHOME)/release/bin/.blender/locale $(DIR)/bin/$(APPLICATION).app/Contents/Resources
- @echo "---> copying .Blanguages"
- @cp $(NANBLENDERHOME)/release/bin/.blender/.Blanguages $(DIR)/bin/$(APPLICATION).app/Contents/Resources
- @echo "---> copying .blender/ scripts"
- @cp -R $(NANBLENDERHOME)/release/bin/.blender $(DIR)/bin/$(APPLICATION).app/Contents/MacOS
- @cp -R $(NANBLENDERHOME)/release/scripts $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/.blender/
- @echo "---> copying python modules"
- @mkdir $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/.blender/python
- @unzip -q $(LCGDIR)/release/$(PYARCHIVE) -d $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/.blender/python/
-endif
- @echo "---> removing SVN directories and Mac hidden files from distribution"
- @find $(DIR)/bin/$(APPLICATION).app -name CVS -prune -exec rm -rf {} \;
- @find $(DIR)/bin/$(APPLICATION).app -name .DS_Store -exec rm -f {} \;
- @find $(DIR)/bin/$(APPLICATION).app -name .svn -prune -exec rm -rf {} \;
diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
index 5a0522a9aa6..f6e29fe0dbb 100644
--- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
+++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
@@ -77,7 +77,7 @@ extern "C" {
#include "BKE_global.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
+
//XXX #include "BIF_screen.h"
//XXX #include "BIF_scrarea.h"
@@ -141,10 +141,10 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
BlendFileData *bfd= NULL;
BLI_strncpy(pathname, blenderdata->name, sizeof(pathname));
- BLI_strncpy(oldsce, G.sce, sizeof(oldsce));
-#ifndef DISABLE_PYTHON
+ BLI_strncpy(oldsce, G.main->name, sizeof(oldsce));
+#ifdef WITH_PYTHON
resetGamePythonPath(); // need this so running a second time wont use an old blendfiles path
- setGamePythonPath(G.sce);
+ setGamePythonPath(G.main->name);
// Acquire Python's GIL (global interpreter lock)
// so we can safely run Python code and API calls
@@ -172,15 +172,22 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
bool frameRate = (SYS_GetCommandLineInt(syshandle, "show_framerate", 0) != 0);
bool animation_record = (SYS_GetCommandLineInt(syshandle, "animation_record", 0) != 0);
bool displaylists = (SYS_GetCommandLineInt(syshandle, "displaylists", 0) != 0);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
bool nodepwarnings = (SYS_GetCommandLineInt(syshandle, "ignore_deprecation_warnings", 0) != 0);
#endif
bool novertexarrays = (SYS_GetCommandLineInt(syshandle, "novertexarrays", 0) != 0);
+ bool mouse_state = startscene->gm.flag & GAME_SHOW_MOUSE;
+
if(animation_record) usefixed= true; /* override since you's always want fixed time for sim recording */
// create the canvas, rasterizer and rendertools
RAS_ICanvas* canvas = new KX_BlenderCanvas(win, area_rect, ar);
- canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
+
+ // default mouse state set on render panel
+ if (mouse_state)
+ canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
+ else
+ canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
RAS_IRenderTools* rendertools = new KX_BlenderRenderTools();
RAS_IRasterizer* rasterizer = NULL;
@@ -221,7 +228,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
ketsjiengine->SetUseFixedTime(usefixed);
ketsjiengine->SetTimingDisplay(frameRate, profile, properties);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
CValue::SetDeprecationWarnings(nodepwarnings);
#endif
@@ -235,21 +242,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
}
// some blender stuff
- MT_CmMatrix4x4 projmat;
- MT_CmMatrix4x4 viewmat;
float camzoom;
- int i;
-
- for (i = 0; i < 16; i++)
- {
- float *viewmat_linear= (float*) rv3d->viewmat;
- viewmat.setElem(i, viewmat_linear[i]);
- }
- for (i = 0; i < 16; i++)
- {
- float *projmat_linear= (float*) rv3d->winmat;
- projmat.setElem(i, projmat_linear[i]);
- }
if(rv3d->persp==RV3D_CAMOB) {
if(startscene->gm.framing.type == SCE_GAMEFRAMING_BARS) { /* Letterbox */
@@ -265,7 +258,6 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
camzoom = 2.0;
}
-
ketsjiengine->SetDrawType(v3d->drawtype);
ketsjiengine->SetCameraZoom(camzoom);
@@ -309,10 +301,10 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
startscenename = bfd->curscene->id.name + 2;
if(blenderdata) {
- BLI_strncpy(G.sce, blenderdata->name, sizeof(G.sce));
+ BLI_strncpy(G.main->name, blenderdata->name, sizeof(G.main->name));
BLI_strncpy(pathname, blenderdata->name, sizeof(pathname));
-#ifndef DISABLE_PYTHON
- setGamePythonPath(G.sce);
+#ifdef WITH_PYTHON
+ setGamePythonPath(G.main->name);
#endif
}
}
@@ -347,8 +339,8 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
{
ketsjiengine->EnableCameraOverride(startscenename);
ketsjiengine->SetCameraOverrideUseOrtho((rv3d->persp == RV3D_ORTHO));
- ketsjiengine->SetCameraOverrideProjectionMatrix(projmat);
- ketsjiengine->SetCameraOverrideViewMatrix(viewmat);
+ ketsjiengine->SetCameraOverrideProjectionMatrix(MT_CmMatrix4x4(rv3d->winmat));
+ ketsjiengine->SetCameraOverrideViewMatrix(MT_CmMatrix4x4(rv3d->viewmat));
ketsjiengine->SetCameraOverrideClipping(v3d->near, v3d->far);
ketsjiengine->SetCameraOverrideLens(v3d->lens);
}
@@ -382,11 +374,11 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
scene,
canvas);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// some python things
PyObject *gameLogic, *gameLogic_keys;
setupGamePython(ketsjiengine, startscene, blenderdata, pyGlobalDict, &gameLogic, &gameLogic_keys, 0, NULL);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
//initialize Dome Settings
if(scene->gm.stereoflag == STEREO_DOME)
@@ -425,14 +417,14 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
ketsjiengine->SetAnimFrameRate(FPS);
// the mainloop
- printf("\nBlender Game Engine Started\n\n");
+ printf("\nBlender Game Engine Started\n");
while (!exitrequested)
{
// first check if we want to exit
exitrequested = ketsjiengine->GetExitCode();
// kick the engine
- bool render = ketsjiengine->NextFrame(); // XXX 2.5 Bug, This is never true! FIXME- Campbell
+ bool render = ketsjiengine->NextFrame();
if (render)
{
@@ -440,7 +432,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
ketsjiengine->Render();
}
- wm_window_process_events_nosleep(C);
+ wm_window_process_events_nosleep();
// test for the ESC key
//XXX while (qtest())
@@ -471,13 +463,16 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
wm_event_free(event);
}
+ if(win != CTX_wm_window(C)) {
+ exitrequested= KX_EXIT_REQUEST_OUTSIDE; /* window closed while bge runs */
+ }
}
- printf("\nBlender Game Engine Finished\n\n");
+ printf("Blender Game Engine Finished\n");
exitstring = ketsjiengine->GetExitString();
// when exiting the mainloop
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// Clears the dictionary by hand:
// This prevents, extra references to global variables
// inside the GameLogic dictionary when the python interpreter is finalized.
@@ -499,7 +494,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
gameLogic_keys_new = NULL;
#endif
ketsjiengine->StopEngine();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
exitGamePythonScripting();
#endif
networkdevice->Disconnect();
@@ -510,7 +505,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
sceneconverter = NULL;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
Py_DECREF(gameLogic_keys);
gameLogic_keys = NULL;
#endif
@@ -521,8 +516,11 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
startscene->camera= tmp_camera;
}
- // set the cursor back to normal
- canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
+ if(exitrequested != KX_EXIT_REQUEST_OUTSIDE)
+ {
+ // set the cursor back to normal
+ canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
+ }
// clean up some stuff
if (ketsjiengine)
@@ -573,9 +571,9 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
if (bfd) BLO_blendfiledata_free(bfd);
- BLI_strncpy(G.sce, oldsce, sizeof(G.sce));
+ BLI_strncpy(G.main->name, oldsce, sizeof(G.main->name));
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
Py_DECREF(pyGlobalDict);
// Release Python's GIL
diff --git a/source/gameengine/BlenderRoutines/CMakeLists.txt b/source/gameengine/BlenderRoutines/CMakeLists.txt
index 853cba543a4..81db7da5cee 100644
--- a/source/gameengine/BlenderRoutines/CMakeLists.txt
+++ b/source/gameengine/BlenderRoutines/CMakeLists.txt
@@ -1,7 +1,5 @@
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../source/kernel/gen_system
../../../intern/string
@@ -10,7 +8,6 @@ SET(INC
../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
../../../source/gameengine/Converter
../../../source/blender/imbuf
- ../../../intern/ghost/include
../../../intern/moto/include
../../../source/gameengine/Ketsji
../../../source/blender/blenlib
@@ -18,8 +15,7 @@ SET(INC
../../../source/blender/blenfont
../../../source/blender/editors/include
../../../source/blender/windowmanager
- ../../../source/blender
- ../../../source/blender/include
+ ../../../source/blender
../../../source/blender/makesdna
../../../source/blender/makesrna
../../../source/gameengine/Rasterizer
@@ -30,23 +26,35 @@ SET(INC
../../../source/gameengine/Physics/common
../../../source/gameengine/Physics/Bullet
../../../source/gameengine/Network/LoopBackNetwork
- ../../../source/blender/misc
../../../source/blender/blenloader
../../../source/blender/gpu
../../../extern/bullet2/src
../../../extern/glew/include
)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+set(SRC
+ BL_KetsjiEmbedStart.cpp
+ KX_BlenderCanvas.cpp
+ KX_BlenderGL.cpp
+ KX_BlenderInputDevice.cpp
+ KX_BlenderKeyboardDevice.cpp
+ KX_BlenderMouseDevice.cpp
+ KX_BlenderRenderTools.cpp
+ KX_BlenderSystem.cpp
+
+ KX_BlenderCanvas.h
+ KX_BlenderGL.h
+ KX_BlenderInputDevice.h
+ KX_BlenderKeyboardDevice.h
+ KX_BlenderMouseDevice.h
+ KX_BlenderRenderTools.h
+ KX_BlenderSystem.h
+)
-IF(WITH_FFMPEG)
- ADD_DEFINITIONS(-DWITH_FFMPEG)
-ENDIF(WITH_FFMPEG)
+add_definitions(-DGLEW_STATIC)
-IF(WITH_PYTHON)
- LIST(APPEND INC ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_CODEC_FFMPEG)
+ add_definitions(-DWITH_FFMPEG)
+endif()
-BLENDERLIB(bf_blroutines "${SRC}" "${INC}")
+blender_add_lib(ge_blen_routines "${SRC}" "${INC}")
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
index b04e951028d..f1e30ed4227 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
@@ -203,5 +203,11 @@ void KX_BlenderCanvas::SetMousePosition(int x,int y)
void KX_BlenderCanvas::MakeScreenShot(const char* filename)
{
-// BL_MakeScreenShot(m_ar, filename);
+ ScrArea area_dummy= {0};
+ area_dummy.totrct.xmin = m_frame_rect.GetLeft();
+ area_dummy.totrct.xmax = m_frame_rect.GetRight();
+ area_dummy.totrct.ymin = m_frame_rect.GetBottom();
+ area_dummy.totrct.ymax = m_frame_rect.GetTop();
+
+ BL_MakeScreenShot(&area_dummy, filename);
}
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
index 55a687c0baa..6b1ed71f465 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
@@ -28,14 +28,6 @@
#include "KX_BlenderGL.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-#include "BLF_api.h"
-#ifdef __cplusplus
-}
-#endif
-
/*
* This little block needed for linking to Blender...
*/
@@ -49,6 +41,8 @@ extern "C" {
#include "GL/glew.h"
+#include "MEM_guardedalloc.h"
+
#include "BL_Material.h" // MAXTEX
/* Data types encoding the game world: */
@@ -65,27 +59,24 @@ extern "C" {
#include "DNA_windowmanager_types.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_bmfont.h"
#include "BKE_image.h"
+#include "BLI_path_util.h"
+
extern "C" {
+#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
#include "WM_api.h"
#include "WM_types.h"
#include "wm_event_system.h"
#include "wm_cursors.h"
#include "wm_window.h"
+#include "BLF_api.h"
}
/* end of blender block */
-
-/* was in drawmesh.c */
-void spack(unsigned int ucol)
-{
- char *cp= (char *)&ucol;
-
- glColor3ub(cp[3], cp[2], cp[1]);
-}
-
void BL_warp_pointer(wmWindow *win, int x,int y)
{
WM_cursor_warp(win, x, y);
@@ -132,10 +123,36 @@ void DisableForText()
}
}
+/* Print 3D text */
+void BL_print_game_line(int fontid, const char* text, int size, int dpi, float* color, double* mat, float aspect)
+{
+ /* gl prepping */
+ DisableForText();
+
+ /* the actual drawing */
+ glColor4fv(color);
+
+ /* multiply the text matrix by the object matrix */
+ BLF_enable(fontid, BLF_MATRIX|BLF_ASPECT);
+ BLF_matrix(fontid, mat);
+
+ /* aspect is the inverse scale that allows you to increase */
+ /* your resolution without sizing the final text size */
+ /* the bigger the size, the smaller the aspect */
+ BLF_aspect(fontid, aspect, aspect, aspect);
+
+ BLF_size(fontid, size, dpi);
+ BLF_position(fontid, 0, 0, 0);
+ BLF_draw(fontid, (char *)text, strlen(text));
+
+ BLF_disable(fontid, BLF_MATRIX|BLF_ASPECT);
+}
+
void BL_print_gamedebug_line(const char* text, int xco, int yco, int width, int height)
{
/* gl prepping */
DisableForText();
+ glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
@@ -149,7 +166,7 @@ void BL_print_gamedebug_line(const char* text, int xco, int yco, int width, int
/* the actual drawing */
glColor3ub(255, 255, 255);
- BLF_draw_default(xco, height-yco, 0.0f, (char *)text);
+ BLF_draw_default(xco, height-yco, 0.0f, (char *)text, 65535); /* XXX, use real len */
glMatrixMode(GL_PROJECTION);
glPopMatrix();
@@ -164,6 +181,7 @@ void BL_print_gamedebug_line_padded(const char* text, int xco, int yco, int widt
* behind quite as neatly as we'd have wanted to. I don't know
* what cause it, though :/ .*/
DisableForText();
+ glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
@@ -177,9 +195,9 @@ void BL_print_gamedebug_line_padded(const char* text, int xco, int yco, int widt
/* draw in black first*/
glColor3ub(0, 0, 0);
- BLF_draw_default(xco+2, height-yco-2, 0.0f, (char *)text);
+ BLF_draw_default(xco+2, height-yco-2, 0.0f, text, 65535); /* XXX, use real len */
glColor3ub(255, 255, 255);
- BLF_draw_default(xco, height-yco, 0.0f, (char *)text);
+ BLF_draw_default(xco, height-yco, 0.0f, text, 65535); /* XXX, use real len */
glMatrixMode(GL_PROJECTION);
glPopMatrix();
@@ -206,18 +224,53 @@ void BL_NormalMouse(wmWindow *win)
}
#define MAX_FILE_LENGTH 512
+/* get shot from frontbuffer sort of a copy from screendump.c */
+static unsigned int *screenshot(ScrArea *curarea, int *dumpsx, int *dumpsy)
+{
+ int x=0, y=0;
+ unsigned int *dumprect= NULL;
+
+ x= curarea->totrct.xmin;
+ y= curarea->totrct.ymin;
+ *dumpsx= curarea->totrct.xmax-x;
+ *dumpsy= curarea->totrct.ymax-y;
+
+ if (*dumpsx && *dumpsy) {
+
+ dumprect= (unsigned int *)MEM_mallocN(sizeof(int) * (*dumpsx) * (*dumpsy), "dumprect");
+ glReadBuffer(GL_FRONT);
+ glReadPixels(x, y, *dumpsx, *dumpsy, GL_RGBA, GL_UNSIGNED_BYTE, dumprect);
+ glFinish();
+ glReadBuffer(GL_BACK);
+ }
-void BL_MakeScreenShot(struct ARegion *ar, const char* filename)
+ return dumprect;
+}
+
+/* based on screendump.c::screenshot_exec */
+void BL_MakeScreenShot(ScrArea *curarea, const char* filename)
{
- char copyfilename[MAX_FILE_LENGTH];
- strcpy(copyfilename,filename);
+ char path[MAX_FILE_LENGTH];
+ strcpy(path,filename);
- // filename read - only
+ unsigned int *dumprect;
+ int dumpsx, dumpsy;
- /* XXX will need to change at some point */
- //XXX BIF_screendump(0);
-
- // write+read filename
- //XXX write_screendump((char*) copyfilename);
+ dumprect= screenshot(curarea, &dumpsx, &dumpsy);
+ if(dumprect) {
+ ImBuf *ibuf;
+ BLI_path_abs(path, G.main->name);
+ /* BKE_add_image_extension() checks for if extension was already set */
+ BKE_add_image_extension(path, R_PNG); /* scene->r.imtype */
+ ibuf= IMB_allocImBuf(dumpsx, dumpsy, 24, 0);
+ ibuf->rect= dumprect;
+ ibuf->ftype= PNG;
+
+ IMB_saveiff(ibuf, path, IB_rect);
+
+ ibuf->rect= NULL;
+ IMB_freeImBuf(ibuf);
+ MEM_freeN(dumprect);
+ }
}
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.h b/source/gameengine/BlenderRoutines/KX_BlenderGL.h
index 84d174cec68..6d481470517 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderGL.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.h
@@ -41,12 +41,13 @@ void BL_SwapBuffers(struct wmWindow *win);
void BL_warp_pointer(struct wmWindow *win,int x,int y);
-void BL_MakeScreenShot(struct ARegion *ar, const char* filename);
+void BL_MakeScreenShot(struct ScrArea *curarea, const char* filename);
void BL_HideMouse(struct wmWindow *win);
void BL_NormalMouse(struct wmWindow *win);
void BL_WaitMouse(struct wmWindow *win);
+void BL_print_game_line(int fontid, const char* text, int size, int dpi, float* color, double* mat, float aspect);
void BL_print_gamedebug_line(const char* text, int xco, int yco, int width, int height);
void BL_print_gamedebug_line_padded(const char* text, int xco, int yco, int width, int height);
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
index 3d736557535..bbc2389b875 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
@@ -275,7 +275,16 @@ void KX_BlenderRenderTools::applyTransform(RAS_IRasterizer* rasty,double* oglmat
}
}
}
-
+void KX_BlenderRenderTools::RenderText3D(int fontid,
+ const char* text,
+ int size,
+ int dpi,
+ float* color,
+ double* mat,
+ float aspect)
+{
+ BL_print_game_line(fontid, text, size, dpi, color, mat, aspect);
+}
void KX_BlenderRenderTools::RenderText2D(RAS_TEXT_RENDER_MODE mode,
const char* text,
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
index 517e0713352..7d4728f5ef0 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
@@ -69,7 +69,15 @@ public:
void DisableOpenGLLights();
void ProcessLighting(RAS_IRasterizer *rasty, bool uselights, const MT_Transform& viewmat);
- void RenderText2D(RAS_TEXT_RENDER_MODE mode,
+ void RenderText3D(int fontid,
+ const char* text,
+ int size,
+ int dpi,
+ float* color,
+ double* mat,
+ float aspect);
+
+ void RenderText2D(RAS_TEXT_RENDER_MODE mode,
const char* text,
int xco,
int yco,
diff --git a/source/gameengine/BlenderRoutines/Makefile b/source/gameengine/BlenderRoutines/Makefile
deleted file mode 100644
index 3d0f5344c74..00000000000
--- a/source/gameengine/BlenderRoutines/Makefile
+++ /dev/null
@@ -1,78 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = bloutines
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-# because of kernel dependency on makesdna
-CPPFLAGS += -I../../blender/makesdna
-CPPFLAGS += -I../../blender/editors/include
-# because of kernel dependency on imbuf
-CPPFLAGS += -I../../blender/windowmanager
-CPPFLAGS += -I../../blender/imbuf
-CPPFLAGS += -I../../blender/blenlib
-CPPFLAGS += -I../../blender/blenkernel
-CPPFLAGS += -I../../blender/render/extern/include
-CPPFLAGS += -I../../blender/blenloader
-CPPFLAGS += -I../../blender/blenfont
-CPPFLAGS += -I../../blender/gpu
-CPPFLAGS += -I../../blender/makesrna
-CPPFLAGS += -I../Converter
-CPPFLAGS += -I../Expressions
-CPPFLAGS += -I../GameLogic
-CPPFLAGS += -I../Ketsji
-CPPFLAGS += -I../Rasterizer
-CPPFLAGS += -I../Rasterizer/RAS_OpenGLRasterizer
-CPPFLAGS += -I../SceneGraph
-CPPFLAGS += -I../../kernel/gen_system
-CPPFLAGS += -I../Network
-CPPFLAGS += -I../Network/LoopBackNetwork
-CPPFLAGS += -I../Physics/common
-CPPFLAGS += -I.
-
-ifeq ($(OS),windows)
- CPPFLAGS += -I../../blender
-endif
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-ifeq ($(WITH_FFMPEG), true)
- CPPFLAGS += -DWITH_FFMPEG
-endif
diff --git a/source/gameengine/BlenderRoutines/SConscript b/source/gameengine/BlenderRoutines/SConscript
index f53fc509c6d..ff70ad3bf7b 100644
--- a/source/gameengine/BlenderRoutines/SConscript
+++ b/source/gameengine/BlenderRoutines/SConscript
@@ -27,10 +27,12 @@ if env['WITH_BF_FFMPEG']:
if env['WITH_BF_PYTHON']:
incs += ' ' + env['BF_PYTHON_INC']
-else:
- defs.append('DISABLE_PYTHON')
+ defs.append('WITH_PYTHON')
+
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
incs += ' ' + env['BF_BULLET_INC']
incs += ' ' + env['BF_OPENGL_INC']
-env.BlenderLib ( 'bf_bloutines', sources, Split(incs), defs, libtype=['core','player'], priority=[300,35] , cxx_compileflags=env['BGE_CXXFLAGS'])
+env.BlenderLib ( 'ge_blen_routines', sources, Split(incs), defs, libtype=['core','player'], priority=[300,35] , cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/CMakeLists.txt b/source/gameengine/CMakeLists.txt
index 7b58a2a6875..5dece449120 100644
--- a/source/gameengine/CMakeLists.txt
+++ b/source/gameengine/CMakeLists.txt
@@ -1,3 +1,4 @@
+# -*- mode: cmake; indent-tabs-mode: t; -*-
# $Id$
# ***** BEGIN GPL LICENSE BLOCK *****
#
@@ -24,25 +25,34 @@
#
# ***** END GPL LICENSE BLOCK *****
-ADD_SUBDIRECTORY(BlenderRoutines)
-ADD_SUBDIRECTORY(Converter)
-ADD_SUBDIRECTORY(Expressions)
-ADD_SUBDIRECTORY(GameLogic)
-ADD_SUBDIRECTORY(Ketsji)
-ADD_SUBDIRECTORY(Ketsji/KXNetwork)
-ADD_SUBDIRECTORY(Network)
-ADD_SUBDIRECTORY(Network/LoopBackNetwork)
-ADD_SUBDIRECTORY(Physics/common)
-ADD_SUBDIRECTORY(Physics/Dummy)
-ADD_SUBDIRECTORY(Rasterizer)
-ADD_SUBDIRECTORY(Rasterizer/RAS_OpenGLRasterizer)
-ADD_SUBDIRECTORY(SceneGraph)
-ADD_SUBDIRECTORY(Physics/Bullet)
+# there are too many inter-includes so best define here
+if(WITH_PYTHON)
+ blender_include_dirs("${PYTHON_INCLUDE_DIRS}")
+ add_definitions(-DWITH_PYTHON)
+endif()
-IF(WITH_PYTHON)
- ADD_SUBDIRECTORY(VideoTexture)
-ENDIF(WITH_PYTHON)
+add_subdirectory(BlenderRoutines)
+add_subdirectory(Converter)
+add_subdirectory(Expressions)
+add_subdirectory(GameLogic)
+add_subdirectory(Ketsji)
+add_subdirectory(Ketsji/KXNetwork)
+add_subdirectory(Network)
+add_subdirectory(Network/LoopBackNetwork)
+add_subdirectory(Physics/common)
+add_subdirectory(Physics/Dummy)
+add_subdirectory(Rasterizer)
+add_subdirectory(Rasterizer/RAS_OpenGLRasterizer)
+add_subdirectory(SceneGraph)
-IF(WITH_PLAYER)
- ADD_SUBDIRECTORY(GamePlayer)
-ENDIF(WITH_PLAYER)
+if(WITH_BULLET)
+ add_subdirectory(Physics/Bullet)
+endif()
+
+if(WITH_PYTHON)
+ add_subdirectory(VideoTexture)
+endif()
+
+if(WITH_PLAYER)
+ add_subdirectory(GamePlayer)
+endif()
diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp
index b8d4c4e0f04..ac35007129a 100644
--- a/source/gameengine/Converter/BL_ActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ActionActuator.cpp
@@ -39,16 +39,17 @@
#include "BL_SkinDeformer.h"
#include "KX_GameObject.h"
#include "STR_HashedString.h"
+#include "MEM_guardedalloc.h"
#include "DNA_nla_types.h"
-#include "BKE_action.h"
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
#include "DNA_scene_types.h"
-#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "MT_Matrix4x4.h"
-#include "BKE_utildefines.h"
+
+#include "BKE_action.h"
#include "FloatValue.h"
#include "PyObjectPlus.h"
#include "KX_PyMath.h"
@@ -428,7 +429,7 @@ bool BL_ActionActuator::Update(double curtime, bool frame)
return keepgoing;
};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -674,4 +675,4 @@ PyObject* BL_ActionActuator::pyattr_get_channel_names(void *self_v, const KX_PYA
return ret;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Converter/BL_ActionActuator.h b/source/gameengine/Converter/BL_ActionActuator.h
index 10ce1fad27a..9682c0e45f7 100644
--- a/source/gameengine/Converter/BL_ActionActuator.h
+++ b/source/gameengine/Converter/BL_ActionActuator.h
@@ -84,7 +84,7 @@ public:
bAction* GetAction() { return m_action; }
void SetAction(bAction* act) { m_action= act; }
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
KX_PYMETHOD_O(BL_ActionActuator,GetChannel);
KX_PYMETHOD_DOC(BL_ActionActuator,setChannel);
@@ -131,7 +131,7 @@ public:
return 1;
}
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
protected:
diff --git a/source/gameengine/Converter/BL_ArmatureActuator.cpp b/source/gameengine/Converter/BL_ArmatureActuator.cpp
index 82b8307a2bc..db36f7e7c38 100644
--- a/source/gameengine/Converter/BL_ArmatureActuator.cpp
+++ b/source/gameengine/Converter/BL_ArmatureActuator.cpp
@@ -175,7 +175,7 @@ bool BL_ArmatureActuator::Update(double curtime, bool frame)
return result;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python Integration Hooks */
@@ -257,5 +257,5 @@ PyObject* BL_ArmatureActuator::pyattr_get_constraint(void *self, const struct KX
return constraint->GetProxy();
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Converter/BL_ArmatureActuator.h b/source/gameengine/Converter/BL_ArmatureActuator.h
index 72e2e96ea73..b3f9ee2f1f2 100644
--- a/source/gameengine/Converter/BL_ArmatureActuator.h
+++ b/source/gameengine/Converter/BL_ArmatureActuator.h
@@ -66,14 +66,14 @@ public:
virtual bool Update(double curtime, bool frame);
virtual void ReParent(SCA_IObject* parent);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* These are used to get and set m_target */
static PyObject* pyattr_get_constraint(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
private:
// identify the constraint that this actuator controls
diff --git a/source/gameengine/Converter/BL_ArmatureChannel.cpp b/source/gameengine/Converter/BL_ArmatureChannel.cpp
index 8f5ec230486..5fa791a233a 100644
--- a/source/gameengine/Converter/BL_ArmatureChannel.cpp
+++ b/source/gameengine/Converter/BL_ArmatureChannel.cpp
@@ -33,7 +33,7 @@
#include "BLI_math.h"
#include "BLI_string.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyTypeObject BL_ArmatureChannel::Type = {
PyVarObject_HEAD_INIT(NULL, 0)
@@ -72,7 +72,7 @@ PyObject *BL_ArmatureChannel::NewProxy(bool py_owns)
return NewProxyPlus_Ext(this, &Type, m_posechannel, py_owns);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
BL_ArmatureChannel::BL_ArmatureChannel(
BL_ArmatureObject *armature,
@@ -85,7 +85,7 @@ BL_ArmatureChannel::~BL_ArmatureChannel()
{
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// PYTHON
@@ -121,7 +121,7 @@ PyAttributeDef BL_ArmatureChannel::AttributesPtr[] = {
KX_PYATTRIBUTE_FLOAT_VECTOR_RW("scale",-FLT_MAX,FLT_MAX,bPoseChannel,size,3),
KX_PYATTRIBUTE_FLOAT_VECTOR_RW("rotation_quaternion",-1.0f,1.0f,bPoseChannel,quat,4),
KX_PYATTRIBUTE_FLOAT_VECTOR_RW("rotation_euler",-10.f,10.f,bPoseChannel,eul,3),
- KX_PYATTRIBUTE_SHORT_RW("rotation_mode",0,ROT_MODE_MAX-1,false,bPoseChannel,rotmode),
+ KX_PYATTRIBUTE_SHORT_RW("rotation_mode",ROT_MODE_MIN,ROT_MODE_MAX,false,bPoseChannel,rotmode),
KX_PYATTRIBUTE_FLOAT_MATRIX_RO("channel_matrix",bPoseChannel,chan_mat,4),
KX_PYATTRIBUTE_FLOAT_MATRIX_RO("pose_matrix",bPoseChannel,pose_mat,4),
KX_PYATTRIBUTE_FLOAT_VECTOR_RO("pose_head",bPoseChannel,pose_head,3),
@@ -461,4 +461,4 @@ PyObject *BL_ArmatureBone::py_bone_get_children(void *self, const struct KX_PYAT
return childrenlist;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Converter/BL_ArmatureChannel.h b/source/gameengine/Converter/BL_ArmatureChannel.h
index 79f0cc80348..e1c18215c53 100644
--- a/source/gameengine/Converter/BL_ArmatureChannel.h
+++ b/source/gameengine/Converter/BL_ArmatureChannel.h
@@ -57,7 +57,7 @@ public:
struct bPoseChannel *posechannel);
virtual ~BL_ArmatureChannel();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// Python access
virtual PyObject* py_repr(void);
@@ -65,7 +65,7 @@ public:
static int py_attr_setattr(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* py_attr_get_joint_rotation(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static int py_attr_set_joint_rotation(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
/* this is a factory class to access bBone data field in the GE.
@@ -82,7 +82,7 @@ private:
public:
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static PyObject *py_bone_repr(PyObject *self);
static PyObject *py_bone_get_parent(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static PyObject *py_bone_get_children(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/Converter/BL_ArmatureConstraint.cpp b/source/gameengine/Converter/BL_ArmatureConstraint.cpp
index 0b7ab043d16..fa7f8a1bea1 100644
--- a/source/gameengine/Converter/BL_ArmatureConstraint.cpp
+++ b/source/gameengine/Converter/BL_ArmatureConstraint.cpp
@@ -33,7 +33,7 @@
#include "BLI_math.h"
#include "BLI_string.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyTypeObject BL_ArmatureConstraint::Type = {
PyVarObject_HEAD_INIT(NULL, 0)
@@ -62,7 +62,7 @@ PyObject* BL_ArmatureConstraint::py_repr(void)
return PyUnicode_FromString(m_name);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
BL_ArmatureConstraint::BL_ArmatureConstraint(
BL_ArmatureObject *armature,
@@ -237,7 +237,7 @@ void BL_ArmatureConstraint::SetSubtarget(KX_GameObject* subtarget)
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// PYTHON
@@ -447,4 +447,4 @@ int BL_ArmatureConstraint::py_attr_setattr(void *self_v, const struct KX_PYATTRI
return PY_SET_ATTR_FAIL;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Converter/BL_ArmatureConstraint.h b/source/gameengine/Converter/BL_ArmatureConstraint.h
index a9f612b6c0c..92da8327edb 100644
--- a/source/gameengine/Converter/BL_ArmatureConstraint.h
+++ b/source/gameengine/Converter/BL_ArmatureConstraint.h
@@ -104,14 +104,14 @@ public:
void SetTarget(KX_GameObject* target);
void SetSubtarget(KX_GameObject* subtarget);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// Python access
virtual PyObject* py_repr(void);
static PyObject* py_attr_getattr(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static int py_attr_setattr(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
#endif //__BL_ARMATURECONSTRAINT
diff --git a/source/gameengine/Converter/BL_ArmatureObject.cpp b/source/gameengine/Converter/BL_ArmatureObject.cpp
index 97d6b6efd27..be42b80f916 100644
--- a/source/gameengine/Converter/BL_ArmatureObject.cpp
+++ b/source/gameengine/Converter/BL_ArmatureObject.cpp
@@ -32,12 +32,13 @@
#include "KX_BlenderSceneConverter.h"
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
-#include "BLI_ghash.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
#include "BIK_api.h"
#include "BKE_action.h"
#include "BKE_armature.h"
-#include "BKE_utildefines.h"
+
#include "BKE_constraint.h"
#include "GEN_Map.h"
#include "GEN_HashedPtr.h"
@@ -594,7 +595,7 @@ float BL_ArmatureObject::GetBoneLength(Bone* bone) const
return (float)(MT_Point3(bone->head) - MT_Point3(bone->tail)).length();
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// PYTHON
@@ -661,4 +662,4 @@ KX_PYMETHODDEF_DOC_NOARGS(BL_ArmatureObject, update,
Py_RETURN_NONE;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Converter/BL_ArmatureObject.h b/source/gameengine/Converter/BL_ArmatureObject.h
index 646e9d45365..525c265d607 100644
--- a/source/gameengine/Converter/BL_ArmatureObject.h
+++ b/source/gameengine/Converter/BL_ArmatureObject.h
@@ -108,14 +108,14 @@ public:
virtual int GetGameObjectType() { return OBJ_ARMATURE; }
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// PYTHON
static PyObject* pyattr_get_constraints(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_channels(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
KX_PYMETHOD_DOC_NOARGS(BL_ArmatureObject, update);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
protected:
/* list element: BL_ArmatureConstraint. Use SG_DListHead to have automatic list replication */
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index 926452d61d6..969d8f8c8dd 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -64,6 +64,7 @@
#include "KX_Light.h"
#include "KX_Camera.h"
#include "KX_EmptyObject.h"
+#include "KX_FontObject.h"
#include "MT_Point3.h"
#include "MT_Transform.h"
#include "MT_MinMax.h"
@@ -90,7 +91,7 @@
#include "BL_MeshDeformer.h"
#include "KX_SoftBodyDeformer.h"
//#include "BL_ArmatureController.h"
-
+#include "BLI_utildefines.h"
#include "BlenderWorldInfo.h"
#include "KX_KetsjiEngine.h"
@@ -125,7 +126,7 @@
#include "DNA_object_force.h"
#include "MEM_guardedalloc.h"
-#include "BKE_utildefines.h"
+
#include "BKE_key.h"
#include "BKE_mesh.h"
#include "MT_Point3.h"
@@ -229,10 +230,10 @@ static unsigned int KX_Mcol2uint_new(MCol col)
static void SetDefaultFaceType(Scene* scene)
{
default_face_mode = TF_DYNAMIC;
- Scene *sce;
+ Scene *sce_iter;
Base *base;
- for(SETLOOPER(scene,base))
+ for(SETLOOPER(scene, sce_iter, base))
{
if (base->object->type == OB_LAMP)
{
@@ -1269,10 +1270,13 @@ static void my_get_local_bounds(Object *ob, DerivedMesh *dm, float *center, floa
break;
case OB_CURVE:
case OB_SURF:
- case OB_FONT:
center[0]= center[1]= center[2]= 0.0;
size[0] = size[1]=size[2]=0.0;
break;
+ case OB_FONT:
+ center[0]= center[1]= center[2]= 0.0;
+ size[0] = size[1]=size[2]=1.0;
+ break;
case OB_MBALL:
bb= ob->bb;
break;
@@ -1524,7 +1528,7 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
KX_BoxBounds bb;
DerivedMesh* dm = NULL;
if (gameobj->GetDeformer())
- dm = gameobj->GetDeformer()->GetFinalMesh();
+ dm = gameobj->GetDeformer()->GetPhysicsMesh();
my_get_local_bounds(blenderobject,dm,objprop.m_boundobject.box.m_center,bb.m_extends);
if (blenderobject->gameflag & OB_BOUNDS)
{
@@ -1617,6 +1621,10 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
}
delete shapeprops;
delete smmaterial;
+ if (dm) {
+ dm->needsFree = 1;
+ dm->release(dm);
+ }
}
@@ -1724,14 +1732,14 @@ static KX_GameObject *gameobject_from_blenderobject(
// needed for python scripting
kxscene->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
-
+
if (ob->gameflag & OB_NAVMESH)
{
gameobj = new KX_NavMeshObject(kxscene,KX_Scene::m_callbacks);
gameobj->AddMesh(meshobj);
break;
}
-
+
gameobj = new BL_DeformableGameObject(ob,kxscene,KX_Scene::m_callbacks);
// set transformation
@@ -1750,8 +1758,9 @@ static KX_GameObject *gameobject_from_blenderobject(
bool bHasDvert = mesh->dvert != NULL && ob->defbase.first;
bool bHasArmature = (BL_ModifierDeformer::HasArmatureDeformer(ob) && ob->parent && ob->parent->type == OB_ARMATURE && bHasDvert);
bool bHasModifier = BL_ModifierDeformer::HasCompatibleDeformer(ob);
+#ifdef USE_BULLET
bool bHasSoftBody = (!ob->parent && (ob->gameflag & OB_SOFT_BODY));
-
+#endif
if (bHasModifier) {
BL_ModifierDeformer *dcont = new BL_ModifierDeformer((BL_DeformableGameObject *)gameobj,
kxscene->GetBlenderScene(), ob, meshobj);
@@ -1776,9 +1785,11 @@ static KX_GameObject *gameobject_from_blenderobject(
BL_MeshDeformer *dcont = new BL_MeshDeformer((BL_DeformableGameObject*)gameobj,
ob, meshobj);
((BL_DeformableGameObject*)gameobj)->SetDeformer(dcont);
+#ifdef USE_BULLET
} else if (bHasSoftBody) {
KX_SoftBodyDeformer *dcont = new KX_SoftBodyDeformer(meshobj, (BL_DeformableGameObject*)gameobj);
((BL_DeformableGameObject*)gameobj)->SetDeformer(dcont);
+#endif
}
MT_Point3 min = MT_Point3(center) - MT_Vector3(extents);
@@ -1808,6 +1819,18 @@ static KX_GameObject *gameobject_from_blenderobject(
// set transformation
break;
}
+
+ case OB_FONT:
+ {
+ /* font objects have no bounding box */
+ gameobj = new KX_FontObject(kxscene,KX_Scene::m_callbacks, rendertools, ob);
+
+ /* add to the list only the visible fonts */
+ if((ob->lay & kxscene->GetBlenderScene()->lay) != 0)
+ kxscene->AddFont(static_cast<KX_FontObject*>(gameobj));
+ break;
+ }
+
}
if (gameobj)
{
@@ -1922,7 +1945,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
Scene *blenderscene = kxscene->GetBlenderScene();
// for SETLOOPER
- Scene *sce;
+ Scene *sce_iter;
Base *base;
// Get the frame settings of the canvas.
@@ -2003,7 +2026,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
// Beware of name conflict in linked data, it will not crash but will create confusion
// in Python scripting and in certain actuators (replace mesh). Linked scene *should* have
// no conflicting name for Object, Object data and Action.
- for (SETLOOPER(blenderscene, base))
+ for (SETLOOPER(blenderscene, sce_iter, base))
{
Object* blenderobject = base->object;
allblobj.insert(blenderobject);
@@ -2648,7 +2671,6 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
converter->RegisterWorldInfo(worldinfo);
kxscene->SetWorldInfo(worldinfo);
-
//create object representations for obstacle simulation
KX_ObstacleSimulation* obssimulation = kxscene->GetObstacleSimulation();
if (obssimulation)
@@ -2729,7 +2751,6 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
logicbrick_conversionlist->Release();
-
// Calculate the scene btree -
// too slow - commented out.
//kxscene->SetNodeTree(tf.MakeTree());
diff --git a/source/gameengine/Converter/BL_DeformableGameObject.h b/source/gameengine/Converter/BL_DeformableGameObject.h
index 076bfaeb458..12f641eee96 100644
--- a/source/gameengine/Converter/BL_DeformableGameObject.h
+++ b/source/gameengine/Converter/BL_DeformableGameObject.h
@@ -37,6 +37,7 @@
#include "DNA_mesh_types.h"
#include "KX_GameObject.h"
#include "BL_MeshDeformer.h"
+#include "KX_SoftBodyDeformer.h"
#include <vector>
class BL_ShapeActionActuator;
@@ -79,7 +80,20 @@ public:
bool GetShape(vector<float> &shape);
Key* GetKey()
{
- return (m_pDeformer) ? ((BL_MeshDeformer*)m_pDeformer)->GetMesh()->key : NULL;
+ if(m_pDeformer) {
+ BL_MeshDeformer *deformer= dynamic_cast<BL_MeshDeformer *>(m_pDeformer); // incase its not a MeshDeformer
+ if(deformer) {
+ return deformer->GetMesh()->key;
+ }
+
+#if 0 // TODO. shape keys for softbody, currently they dont store a mesh.
+ KX_SoftBodyDeformer *deformer_soft= dynamic_cast<KX_SoftBodyDeformer *>(m_pDeformer);
+ if(deformer) {
+ return deformer->GetMesh()->key;
+ }
+#endif
+ }
+ return NULL;
}
virtual void SetDeformer(class RAS_Deformer* deformer);
diff --git a/source/gameengine/Converter/BL_ModifierDeformer.cpp b/source/gameengine/Converter/BL_ModifierDeformer.cpp
index f1f30938577..205892f5c77 100644
--- a/source/gameengine/Converter/BL_ModifierDeformer.cpp
+++ b/source/gameengine/Converter/BL_ModifierDeformer.cpp
@@ -49,6 +49,7 @@
#include "DNA_curve_types.h"
#include "DNA_modifier_types.h"
#include "DNA_scene_types.h"
+#include "BLI_utildefines.h"
#include "BKE_armature.h"
#include "BKE_action.h"
#include "BKE_key.h"
@@ -61,7 +62,7 @@ extern "C"{
#include "BKE_lattice.h"
#include "BKE_modifier.h"
}
- #include "BKE_utildefines.h"
+
#include "BLI_blenlib.h"
#include "BLI_math.h"
@@ -127,14 +128,37 @@ bool BL_ModifierDeformer::HasArmatureDeformer(Object *ob)
if (!ob->modifiers.first)
return false;
- ModifierData* md;
- for (md = (ModifierData*)ob->modifiers.first; md; md = (ModifierData*)md->next) {
- if (md->type == eModifierType_Armature )
- return true;
- }
+ ModifierData* md = (ModifierData*)ob->modifiers.first;
+ if(md->type == eModifierType_Armature )
+ return true;
+
return false;
}
+// return a deformed mesh that supports mapping (with a valid CD_ORIGINDEX layer)
+struct DerivedMesh* BL_ModifierDeformer::GetPhysicsMesh()
+{
+ // we need to compute the deformed mesh taking into account the current
+ // shape and skin deformers, we cannot just call mesh_create_derived_physics()
+ // because that would use the m_transvers already deformed previously by BL_ModifierDeformer::Update(),
+ // so restart from scratch by forcing a full update the shape/skin deformers
+ // (will do nothing if there is no such deformer)
+ BL_ShapeDeformer::ForceUpdate();
+ BL_ShapeDeformer::Update();
+ // now apply the modifiers but without those that don't support mapping
+ Object* blendobj = m_gameobj->GetBlendObject();
+ /* hack: the modifiers require that the mesh is attached to the object
+ It may not be the case here because of replace mesh actuator */
+ Mesh *oldmesh = (Mesh*)blendobj->data;
+ blendobj->data = m_bmesh;
+ DerivedMesh *dm = mesh_create_derived_physics(m_scene, blendobj, m_transverts, CD_MASK_MESH);
+ /* restore object data */
+ blendobj->data = oldmesh;
+ /* m_transverts is correct here (takes into account deform only modifiers) */
+ /* the derived mesh returned by this function must be released by the caller !!! */
+ return dm;
+}
+
bool BL_ModifierDeformer::Update(void)
{
bool bShapeUpdate = BL_ShapeDeformer::Update();
diff --git a/source/gameengine/Converter/BL_ModifierDeformer.h b/source/gameengine/Converter/BL_ModifierDeformer.h
index 49998f36ccb..caf1741ecaf 100644
--- a/source/gameengine/Converter/BL_ModifierDeformer.h
+++ b/source/gameengine/Converter/BL_ModifierDeformer.h
@@ -95,7 +95,8 @@ public:
{
return m_dm;
}
-
+ // The derived mesh returned by this function must be released!
+ virtual struct DerivedMesh* GetPhysicsMesh();
protected:
double m_lastModifierUpdate;
diff --git a/source/gameengine/Converter/BL_ShapeActionActuator.cpp b/source/gameengine/Converter/BL_ShapeActionActuator.cpp
index 08d3e54a7c5..4f6e07206dd 100644
--- a/source/gameengine/Converter/BL_ShapeActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ShapeActionActuator.cpp
@@ -48,7 +48,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "MT_Matrix4x4.h"
-#include "BKE_utildefines.h"
+
#include "FloatValue.h"
#include "PyObjectPlus.h"
@@ -408,7 +408,7 @@ bool BL_ShapeActionActuator::Update(double curtime, bool frame)
return keepgoing;
};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -491,4 +491,4 @@ int BL_ShapeActionActuator::pyattr_set_action(void *self_v, const KX_PYATTRIBUTE
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Converter/BL_ShapeActionActuator.h b/source/gameengine/Converter/BL_ShapeActionActuator.h
index 64cd21e5544..e6457e2c686 100644
--- a/source/gameengine/Converter/BL_ShapeActionActuator.h
+++ b/source/gameengine/Converter/BL_ShapeActionActuator.h
@@ -82,7 +82,7 @@ public:
bAction* GetAction() { return m_action; }
void SetAction(bAction* act) { m_action= act; }
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static PyObject* pyattr_get_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
@@ -125,7 +125,7 @@ public:
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
protected:
diff --git a/source/gameengine/Converter/BL_ShapeDeformer.cpp b/source/gameengine/Converter/BL_ShapeDeformer.cpp
index 2fc78646d92..a5fd797852f 100644
--- a/source/gameengine/Converter/BL_ShapeDeformer.cpp
+++ b/source/gameengine/Converter/BL_ShapeDeformer.cpp
@@ -55,7 +55,7 @@
extern "C"{
#include "BKE_lattice.h"
}
- #include "BKE_utildefines.h"
+
#include "BLI_blenlib.h"
#include "BLI_math.h"
@@ -154,7 +154,7 @@ bool BL_ShapeDeformer::Update(void)
/* store verts locally */
VerifyStorage();
- do_rel_key(0, m_bmesh->totvert, m_bmesh->totvert, (char *)(float *)m_transverts, m_bmesh->key, NULL, 0);
+ do_rel_key(0, m_bmesh->totvert, m_bmesh->totvert, (char *)(float *)m_transverts, m_bmesh->key, NULL, 0); /* last arg is ignored */
m_bDynamic = true;
}
diff --git a/source/gameengine/Converter/BL_SkinDeformer.cpp b/source/gameengine/Converter/BL_SkinDeformer.cpp
index 748df4c2e41..3bac525d765 100644
--- a/source/gameengine/Converter/BL_SkinDeformer.cpp
+++ b/source/gameengine/Converter/BL_SkinDeformer.cpp
@@ -42,6 +42,7 @@
#include "DNA_action_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "BLI_utildefines.h"
#include "BKE_armature.h"
#include "BKE_action.h"
#include "MT_Point3.h"
@@ -49,7 +50,7 @@
extern "C"{
#include "BKE_lattice.h"
}
- #include "BKE_utildefines.h"
+
#include "BLI_blenlib.h"
#include "BLI_math.h"
diff --git a/source/gameengine/Converter/BlenderWorldInfo.cpp b/source/gameengine/Converter/BlenderWorldInfo.cpp
index f0d6083a8fa..60cb4a751bb 100644
--- a/source/gameengine/Converter/BlenderWorldInfo.cpp
+++ b/source/gameengine/Converter/BlenderWorldInfo.cpp
@@ -188,6 +188,12 @@ float BlenderWorldInfo::getMistColorBlue()
return m_mistcolor[2];
}
+void BlenderWorldInfo::setBackColor(float r, float g, float b)
+{
+ m_backgroundcolor[0] = r;
+ m_backgroundcolor[1] = g;
+ m_backgroundcolor[2] = b;
+}
void
BlenderWorldInfo::setMistStart(
diff --git a/source/gameengine/Converter/BlenderWorldInfo.h b/source/gameengine/Converter/BlenderWorldInfo.h
index a430e18223e..29145344d18 100644
--- a/source/gameengine/Converter/BlenderWorldInfo.h
+++ b/source/gameengine/Converter/BlenderWorldInfo.h
@@ -64,6 +64,12 @@ public:
float getMistColorGreen();
float getMistColorBlue();
+ void
+ setBackColor(
+ float r,
+ float g,
+ float b
+ );
void
setMistStart(
float d
diff --git a/source/gameengine/Converter/CMakeLists.txt b/source/gameengine/Converter/CMakeLists.txt
index 65483eff9b4..e38d4e53613 100644
--- a/source/gameengine/Converter/CMakeLists.txt
+++ b/source/gameengine/Converter/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../source/kernel/gen_system
../../../intern/string
@@ -43,7 +41,6 @@ SET(INC
../../../source/blender/blenkernel
../../../source/blender/windowmanager
../../../source/blender
- ../../../source/blender/include
../../../source/blender/makesdna
../../../source/blender/makesrna
../../../source/gameengine/Rasterizer
@@ -56,7 +53,6 @@ SET(INC
../../../source/gameengine/Physics/Bullet
../../../source/gameengine/Physics/Dummy
../../../source/gameengine/Network/LoopBackNetwork
- ../../../source/blender/misc
../../../source/blender/blenloader
../../../source/blender/gpu
../../../source/blender/ikplugin
@@ -64,10 +60,54 @@ SET(INC
../../../extern/recastnavigation/Detour/Include
)
-IF(WITH_PYTHON)
- LIST(APPEND INC ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+set(SRC
+ BL_ActionActuator.cpp
+ BL_ArmatureActuator.cpp
+ BL_ArmatureChannel.cpp
+ BL_ArmatureConstraint.cpp
+ BL_ArmatureObject.cpp
+ BL_BlenderDataConversion.cpp
+ BL_DeformableGameObject.cpp
+ BL_MeshDeformer.cpp
+ BL_ModifierDeformer.cpp
+ BL_ShapeActionActuator.cpp
+ BL_ShapeDeformer.cpp
+ BL_SkinDeformer.cpp
+ BlenderWorldInfo.cpp
+ KX_BlenderScalarInterpolator.cpp
+ KX_BlenderSceneConverter.cpp
+ KX_ConvertActuators.cpp
+ KX_ConvertControllers.cpp
+ KX_ConvertProperties.cpp
+ KX_ConvertSensors.cpp
+ KX_IpoConvert.cpp
+ KX_SoftBodyDeformer.cpp
+
+ BL_ActionActuator.h
+ BL_ArmatureActuator.h
+ BL_ArmatureChannel.h
+ BL_ArmatureConstraint.h
+ BL_ArmatureObject.h
+ BL_BlenderDataConversion.h
+ BL_DeformableGameObject.h
+ BL_MeshDeformer.h
+ BL_ModifierDeformer.h
+ BL_ShapeActionActuator.h
+ BL_ShapeDeformer.h
+ BL_SkinDeformer.h
+ BlenderWorldInfo.h
+ KX_BlenderScalarInterpolator.h
+ KX_BlenderSceneConverter.h
+ KX_ConvertActuators.h
+ KX_ConvertControllers.h
+ KX_ConvertProperties.h
+ KX_ConvertSensors.h
+ KX_IpoConvert.h
+ KX_SoftBodyDeformer.h
+)
+
+if(WITH_BULLET)
+ add_definitions(-DUSE_BULLET)
+endif()
-BLENDERLIB(bf_converter "${SRC}" "${INC}")
+blender_add_lib(ge_converter "${SRC}" "${INC}")
diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
index f50fb6838e3..723b849f4c7 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
@@ -40,6 +40,7 @@
#include "KX_KetsjiEngine.h"
#include "KX_IPhysicsController.h"
#include "BL_Material.h"
+#include "BL_ActionActuator.h"
#include "KX_BlenderMaterial.h"
#include "KX_PolygonMaterial.h"
@@ -622,12 +623,6 @@ void KX_BlenderSceneConverter::RegisterWorldInfo(
m_worldinfos.push_back(pair<KX_Scene*,KX_WorldInfo*>(m_currentScene,worldinfo));
}
-//quick hack
-extern "C"
-{
- void mat3_to_compatible_eul( float *eul, float *oldrot,float mat[][3]);
-}
-
void KX_BlenderSceneConverter::ResetPhysicsObjectsAnimationIpo(bool clearIpo)
{
@@ -782,8 +777,8 @@ void KX_BlenderSceneConverter::WritePhysicsObjectToAnimationIpo(int frameNumber)
mat3_to_compatible_eul(blenderObject->rot, blenderObject->rot, tmat);
- insert_keyframe(&blenderObject->id, NULL, NULL, "location", -1, frameNumber, INSERTKEY_FAST);
- insert_keyframe(&blenderObject->id, NULL, NULL, "rotation_euler", -1, frameNumber, INSERTKEY_FAST);
+ insert_keyframe(NULL, &blenderObject->id, NULL, NULL, "location", -1, frameNumber, INSERTKEY_FAST);
+ insert_keyframe(NULL, &blenderObject->id, NULL, NULL, "rotation_euler", -1, frameNumber, INSERTKEY_FAST);
#if 0
const MT_Point3& position = gameObj->NodeGetWorldPosition();
@@ -911,7 +906,7 @@ void KX_BlenderSceneConverter::TestHandlesPhysicsObjectToAnimationIpo()
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject *KX_BlenderSceneConverter::GetPyNamespace()
{
return m_ketsjiEngine->GetPyNamespace();
@@ -960,7 +955,7 @@ bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const cha
static char err_local[255];
/* only scene and mesh supported right now */
- if(idcode!=ID_SCE && idcode!=ID_ME) {
+ if(idcode!=ID_SCE && idcode!=ID_ME &&idcode!=ID_AC) {
snprintf(err_local, sizeof(err_local), "invalid ID type given \"%s\"\n", group);
return false;
}
@@ -1018,6 +1013,16 @@ bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const cha
kx_scene->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
}
}
+ else if(idcode==ID_AC) {
+ /* Convert all actions */
+ ID *action;
+ KX_Scene *kx_scene= m_currentScene;
+
+ for(action= (ID *)main_newlib->action.first; action; action= (ID *)action->next) {
+ printf("ActionName: %s\n", action->name);
+ kx_scene->GetLogicManager()->RegisterActionName(action->name+2, action);
+ }
+ }
else if(idcode==ID_SCE) {
/* Merge all new linked in scene into the existing one */
ID *scene;
@@ -1092,6 +1097,23 @@ bool KX_BlenderSceneConverter::FreeBlendFile(struct Main *maggie)
}
}
}
+
+ /* Now unregister actions */
+ {
+ GEN_Map<STR_HashedString,void*> &mapStringToActions = scene->GetLogicManager()->GetActionMap();
+
+ for(int i=0; i<mapStringToActions.size(); i++)
+ {
+ ID *action= (ID*) *mapStringToActions.at(i);
+
+ if(IS_TAGGED(action))
+ {
+ STR_HashedString an = action->name+2;
+ mapStringToActions.remove(an);
+ i--;
+ }
+ }
+ }
//scene->FreeTagged(); /* removed tagged objects and meshes*/
CListValue *obj_lists[] = {scene->GetObjectList(), scene->GetInactiveList(), NULL};
@@ -1128,6 +1150,17 @@ bool KX_BlenderSceneConverter::FreeBlendFile(struct Main *maggie)
break;
}
}
+
+ /* make sure action actuators are not referencing tagged actions */
+ for (int act_idx=0; act_idx<gameobj->GetActuators().size(); act_idx++)
+ {
+ if (gameobj->GetActuators()[act_idx]->IsType(SCA_IActuator::KX_ACT_ACTION))
+ {
+ BL_ActionActuator *act = (BL_ActionActuator*)gameobj->GetActuators()[act_idx];
+ if(IS_TAGGED(act->GetAction()))
+ act->SetAction(NULL);
+ }
+ }
}
}
}
diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.h b/source/gameengine/Converter/KX_BlenderSceneConverter.h
index 20f3f863563..8692a75ecb6 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.h
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.h
@@ -174,7 +174,7 @@ public:
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject *GetPyNamespace();
#endif
diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp
index d765c89c5aa..ee9f7d6ab39 100644
--- a/source/gameengine/Converter/KX_ConvertActuators.cpp
+++ b/source/gameengine/Converter/KX_ConvertActuators.cpp
@@ -32,8 +32,6 @@
#pragma warning (disable : 4786)
#endif //WIN32
-#define BLENDER_HACK_DTIME 0.02
-
#include "MEM_guardedalloc.h"
#include "KX_BlenderSceneConverter.h"
@@ -153,13 +151,6 @@ void BL_ConvertActuators(char* maggiename,
KX_BLENDERTRUNC(obact->angularvelocity[2]));
short damping = obact->damping;
- drotvec /= BLENDER_HACK_DTIME;
- //drotvec /= BLENDER_HACK_DTIME;
- drotvec *= MT_2_PI/360.0;
- //dlocvec /= BLENDER_HACK_DTIME;
- //linvelvec /= BLENDER_HACK_DTIME;
- //angvelvec /= BLENDER_HACK_DTIME;
-
/* Blender uses a bit vector internally for the local-flags. In */
/* KX, we have four bools. The compiler should be smart enough */
/* to do the right thing. We need to explicitly convert here! */
@@ -1063,9 +1054,9 @@ void BL_ConvertActuators(char* maggiename,
bool normalup = (stAct->flag & ACT_STEERING_NORMALUP) !=0;
KX_SteeringActuator *tmpstact
= new KX_SteeringActuator(gameobj, mode, targetob, navmeshob,stAct->dist,
- stAct->velocity, stAct->acceleration, stAct->turnspeed,
- selfTerminated, stAct->updateTime,
- scene->GetObstacleSimulation(), facingMode, normalup, enableVisualization);
+ stAct->velocity, stAct->acceleration, stAct->turnspeed,
+ selfTerminated, stAct->updateTime,
+ scene->GetObstacleSimulation(), facingMode, normalup, enableVisualization);
baseact = tmpstact;
break;
}
diff --git a/source/gameengine/Converter/KX_ConvertControllers.cpp b/source/gameengine/Converter/KX_ConvertControllers.cpp
index a6b62ecb7b0..7f329ca0684 100644
--- a/source/gameengine/Converter/KX_ConvertControllers.cpp
+++ b/source/gameengine/Converter/KX_ConvertControllers.cpp
@@ -153,7 +153,7 @@ void BL_ConvertControllers(
bPythonCont* pycont = (bPythonCont*) bcontr->data;
SCA_PythonController* pyctrl = new SCA_PythonController(gameobj, pycont->mode);
gamecontroller = pyctrl;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
pyctrl->SetNamespace(converter->GetPyNamespace());
@@ -183,7 +183,7 @@ void BL_ConvertControllers(
}
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
break;
}
@@ -210,11 +210,11 @@ void BL_ConvertControllers(
converter->RegisterGameController(gamecontroller, bcontr);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if (bcontr->type==CONT_PYTHON) {
SCA_PythonController *pyctrl= static_cast<SCA_PythonController*>(gamecontroller);
/* not strictly needed but gives syntax errors early on and
- * gives more pradictable performance for larger scripts */
+ * gives more predictable performance for larger scripts */
if(pyctrl->m_mode==SCA_PythonController::SCA_PYEXEC_SCRIPT)
pyctrl->Compile();
else {
@@ -225,7 +225,7 @@ void BL_ConvertControllers(
// pyctrl->Import();
}
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
//done with gamecontroller
gamecontroller->Release();
diff --git a/source/gameengine/Converter/KX_ConvertProperties.cpp b/source/gameengine/Converter/KX_ConvertProperties.cpp
index 44c0ad38909..6c850008e5e 100644
--- a/source/gameengine/Converter/KX_ConvertProperties.cpp
+++ b/source/gameengine/Converter/KX_ConvertProperties.cpp
@@ -126,7 +126,7 @@ void BL_ConvertProperties(Object* object,KX_GameObject* gameobj,SCA_TimeEventMan
propval->Release();
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* Warn if we double up on attributes, this isnt quite right since it wont find inherited attributes however there arnt many */
for(PyAttributeDef *attrdef = KX_GameObject::Attributes; attrdef->m_name; attrdef++) {
if(strcmp(prop->name, attrdef->m_name)==0) {
@@ -141,7 +141,7 @@ void BL_ConvertProperties(Object* object,KX_GameObject* gameobj,SCA_TimeEventMan
}
}
/* end warning check */
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
prop = prop->next;
}
diff --git a/source/gameengine/Converter/Makefile b/source/gameengine/Converter/Makefile
deleted file mode 100644
index 142841b2b36..00000000000
--- a/source/gameengine/Converter/Makefile
+++ /dev/null
@@ -1,67 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blconverter
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_BULLET2)/include
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-
-CPPFLAGS += -I../../blender
-# these two needed because of blenkernel
-CPPFLAGS += -I../../blender/windowmanager
-CPPFLAGS += -I../../blender/imbuf
-CPPFLAGS += -I../../blender/makesdna
-CPPFLAGS += -I../../blender/makesrna
-CPPFLAGS += -I../../blender/editors/include
-CPPFLAGS += -I../../blender/blenlib
-CPPFLAGS += -I../../blender/blenkernel
-CPPFLAGS += -I../../blender/blenloader
-CPPFLAGS += -I../../blender/render/extern/include
-CPPFLAGS += -I../../blender/gpu
-CPPFLAGS += -I../../blender/ikplugin
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../Expressions -I../Rasterizer -I../GameLogic
-CPPFLAGS += -I../Ketsji -I../BlenderRoutines -I../SceneGraph
-CPPFLAGS += -I../../kernel/gen_system
-CPPFLAGS += -I../Rasterizer/RAS_OpenGLRasterizer
-CPPFLAGS += -I../Network -I../Ketsji/KXNetwork
-CPPFLAGS += -I../Physics/common -I../Physics/Dummy
-CPPFLAGS += -I../Physics/BlOde
-CPPFLAGS += -I../Physics/Bullet
-CPPFLAGS += -I.
diff --git a/source/gameengine/Converter/SConscript b/source/gameengine/Converter/SConscript
index 36657367621..56c455bbbdd 100644
--- a/source/gameengine/Converter/SConscript
+++ b/source/gameengine/Converter/SConscript
@@ -30,7 +30,12 @@ if env['BF_DEBUG']:
if env['WITH_BF_PYTHON']:
incs += ' ' + env['BF_PYTHON_INC']
-else:
- defs.append('DISABLE_PYTHON')
+ defs.append('WITH_PYTHON')
-env.BlenderLib ( 'bf_converter', sources, Split(incs), defs, libtype=['core','player'], priority=[305,40], cxx_compileflags=env['BGE_CXXFLAGS'])
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+
+if env['WITH_BF_BULLET']:
+ defs.append('USE_BULLET')
+
+env.BlenderLib ( 'ge_converter', sources, Split(incs), defs, libtype=['core','player'], priority=[305,40], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/Expressions/BoolValue.cpp b/source/gameengine/Expressions/BoolValue.cpp
index e6bb454a1b5..5510554bd22 100644
--- a/source/gameengine/Expressions/BoolValue.cpp
+++ b/source/gameengine/Expressions/BoolValue.cpp
@@ -201,9 +201,9 @@ CValue* CBoolValue::GetReplica()
return replica;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* CBoolValue::ConvertValueToPython()
{
return PyBool_FromLong(m_bool != 0);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Expressions/BoolValue.h b/source/gameengine/Expressions/BoolValue.h
index dac70e3c0b7..8110b9719bf 100644
--- a/source/gameengine/Expressions/BoolValue.h
+++ b/source/gameengine/Expressions/BoolValue.h
@@ -45,7 +45,7 @@ public:
void Configure(CValue* menuvalue);
virtual CValue* GetReplica();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
virtual PyObject* ConvertValueToPython();
#endif
diff --git a/source/gameengine/Expressions/CMakeLists.txt b/source/gameengine/Expressions/CMakeLists.txt
index 126192d2188..c593c690614 100644
--- a/source/gameengine/Expressions/CMakeLists.txt
+++ b/source/gameengine/Expressions/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../source/kernel/gen_system
../../../intern/string
@@ -36,10 +34,48 @@ SET(INC
../../../source/blender/blenloader
)
-IF(WITH_PYTHON)
- LIST(APPEND INC ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+set(SRC
+ BoolValue.cpp
+ ConstExpr.cpp
+ EXP_C-Api.cpp
+ EmptyValue.cpp
+ ErrorValue.cpp
+ Expression.cpp
+ FloatValue.cpp
+ IdentifierExpr.cpp
+ IfExpr.cpp
+ InputParser.cpp
+ IntValue.cpp
+ KX_HashedPtr.cpp
+ ListValue.cpp
+ Operator1Expr.cpp
+ Operator2Expr.cpp
+ PyObjectPlus.cpp
+ StringValue.cpp
+ Value.cpp
+ VectorValue.cpp
+
+ BoolValue.h
+ ConstExpr.h
+ EXP_C-Api.h
+ EmptyValue.h
+ ErrorValue.h
+ Expression.h
+ FloatValue.h
+ IdentifierExpr.h
+ IfExpr.h
+ InputParser.h
+ IntValue.h
+ KX_HashedPtr.h
+ KX_Python.h
+ ListValue.h
+ Operator1Expr.h
+ Operator2Expr.h
+ PyObjectPlus.h
+ StringValue.h
+ Value.h
+ VectorValue.h
+ VoidValue.h
+)
-BLENDERLIB(bf_expressions "${SRC}" "${INC}")
+blender_add_lib(ge_logic_expressions "${SRC}" "${INC}")
diff --git a/source/gameengine/Expressions/FloatValue.cpp b/source/gameengine/Expressions/FloatValue.cpp
index 82c86ac68b2..e00121354f8 100644
--- a/source/gameengine/Expressions/FloatValue.cpp
+++ b/source/gameengine/Expressions/FloatValue.cpp
@@ -310,9 +310,9 @@ CValue* CFloatValue::GetReplica()
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* CFloatValue::ConvertValueToPython()
{
return PyFloat_FromDouble(m_float);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Expressions/FloatValue.h b/source/gameengine/Expressions/FloatValue.h
index 49d4efa9f74..83b9ff1db5e 100644
--- a/source/gameengine/Expressions/FloatValue.h
+++ b/source/gameengine/Expressions/FloatValue.h
@@ -36,7 +36,7 @@ public:
virtual CValue* GetReplica();
virtual CValue* Calc(VALUE_OPERATOR op, CValue *val);
virtual CValue* CalcFinal(VALUE_DATA_TYPE dtype, VALUE_OPERATOR op, CValue *val);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
virtual PyObject* ConvertValueToPython();
#endif
diff --git a/source/gameengine/Expressions/IntValue.cpp b/source/gameengine/Expressions/IntValue.cpp
index 83e57200db0..5ba57e756c0 100644
--- a/source/gameengine/Expressions/IntValue.cpp
+++ b/source/gameengine/Expressions/IntValue.cpp
@@ -322,7 +322,7 @@ void CIntValue::SetValue(CValue* newval)
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* CIntValue::ConvertValueToPython()
{
if((m_int > INT_MIN) && (m_int < INT_MAX))
@@ -330,4 +330,4 @@ PyObject* CIntValue::ConvertValueToPython()
else
return PyLong_FromLongLong(m_int);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Expressions/IntValue.h b/source/gameengine/Expressions/IntValue.h
index 63efea56d14..e484c436177 100644
--- a/source/gameengine/Expressions/IntValue.h
+++ b/source/gameengine/Expressions/IntValue.h
@@ -48,7 +48,7 @@ public:
void AddConfigurationData(CValue* menuvalue);
virtual CValue* GetReplica();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
virtual PyObject* ConvertValueToPython();
#endif
diff --git a/source/gameengine/Expressions/KX_Python.h b/source/gameengine/Expressions/KX_Python.h
index 7901d5226f7..234b70770f6 100644
--- a/source/gameengine/Expressions/KX_Python.h
+++ b/source/gameengine/Expressions/KX_Python.h
@@ -40,7 +40,7 @@
#undef _POSIX_C_SOURCE
#endif
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "Python.h"
#define USE_MATHUTILS // Blender 2.5x api will use mathutils, for a while we might want to test without it
@@ -66,5 +66,15 @@
#endif
#endif
+#ifdef __APPLE__
+#undef isalnum
+#undef isalpha
+#undef islower
+#undef isspace
+#undef isupper
+#undef tolower
+#undef toupper
+#endif
+
#endif // KX_PYTHON_H
diff --git a/source/gameengine/Expressions/ListValue.cpp b/source/gameengine/Expressions/ListValue.cpp
index 4d9d82efb98..258aada6565 100644
--- a/source/gameengine/Expressions/ListValue.cpp
+++ b/source/gameengine/Expressions/ListValue.cpp
@@ -268,7 +268,7 @@ bool CListValue::IsModified()
return bmod;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -674,4 +674,4 @@ PyObject* CListValue::Pyfrom_id(PyObject* value)
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Expressions/ListValue.h b/source/gameengine/Expressions/ListValue.h
index 8f3b9dcda0b..ff675dd0e68 100644
--- a/source/gameengine/Expressions/ListValue.h
+++ b/source/gameengine/Expressions/ListValue.h
@@ -60,7 +60,7 @@ public:
bool CheckEqual(CValue* first,CValue* second);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
virtual PyObject* py_repr(void) {
PyObject *py_proxy= this->GetProxy();
PyObject *py_list= PySequence_List(py_proxy);
diff --git a/source/gameengine/Expressions/Makefile b/source/gameengine/Expressions/Makefile
deleted file mode 100644
index 892a8c2b246..00000000000
--- a/source/gameengine/Expressions/Makefile
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = expression
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I../../blender/makesdna
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I../../kernel/gen_system
-CPPFLAGS += -I../../gameengine/SceneGraph
-
diff --git a/source/gameengine/Expressions/PyObjectPlus.cpp b/source/gameengine/Expressions/PyObjectPlus.cpp
index 32bf4ba95c4..9195bd64f3f 100644
--- a/source/gameengine/Expressions/PyObjectPlus.cpp
+++ b/source/gameengine/Expressions/PyObjectPlus.cpp
@@ -49,7 +49,7 @@
PyObjectPlus::~PyObjectPlus()
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if(m_proxy) {
BGE_PROXY_REF(m_proxy)= NULL;
Py_DECREF(m_proxy); /* Remove own reference, python may still have 1 */
@@ -60,14 +60,14 @@ PyObjectPlus::~PyObjectPlus()
PyObjectPlus::PyObjectPlus() : SG_QList() // constructor
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
m_proxy= NULL;
#endif
};
void PyObjectPlus::ProcessReplica()
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* Clear the proxy, will be created again if needed with GetProxy()
* otherwise the PyObject will point to the wrong reference */
m_proxy= NULL;
@@ -84,7 +84,7 @@ void PyObjectPlus::ProcessReplica()
*/
void PyObjectPlus::InvalidateProxy() // check typename of each parent
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if(m_proxy) {
BGE_PROXY_REF(m_proxy)=NULL;
Py_DECREF(m_proxy);
@@ -94,7 +94,7 @@ void PyObjectPlus::InvalidateProxy() // check typename of each parent
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/*------------------------------
* PyObjectPlus Type -- Every class, even the abstract one should have a Type
@@ -1224,4 +1224,4 @@ void PyObjectPlus::SetDeprecationWarningFirst(WarnLink* wlink) {m_base_wlink_f
void PyObjectPlus::SetDeprecationWarningLinkLast(WarnLink* wlink) {m_base_wlink_last= wlink;}
void PyObjectPlus::NullDeprecationWarning() {m_base_wlink_first= m_base_wlink_last= NULL;}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Expressions/PyObjectPlus.h b/source/gameengine/Expressions/PyObjectPlus.h
index 625549a272e..d69be6af5e5 100644
--- a/source/gameengine/Expressions/PyObjectPlus.h
+++ b/source/gameengine/Expressions/PyObjectPlus.h
@@ -43,7 +43,7 @@
* Python defines
------------------------------*/
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#ifdef USE_MATHUTILS
extern "C" {
#include "../../blender/python/generic/mathutils.h" /* so we can have mathutils callbacks */
@@ -459,8 +459,9 @@ typedef struct KX_PYATTRIBUTE_DEF {
------------------------------*/
typedef PyTypeObject * PyParentObject; // Define the PyParent Object
-#else // DISABLE_PYTHON
+#else // WITH_PYTHON
+#ifdef WITH_CXX_GUARDEDALLOC
#define Py_Header \
public: \
void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:PyObjectPlus"); } \
@@ -471,6 +472,16 @@ typedef PyTypeObject * PyParentObject; // Define the PyParent Object
void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:PyObjectPlusPtr"); } \
void operator delete( void *mem ) { MEM_freeN(mem); } \
+#else // WITH_CXX_GUARDEDALLOC
+
+#define Py_Header \
+ public: \
+
+#define Py_HeaderPtr \
+ public: \
+
+#endif // WITH_CXX_GUARDEDALLOC
+
#endif
@@ -494,7 +505,7 @@ public:
virtual ~PyObjectPlus(); // destructor
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject *m_proxy; /* actually a PyObjectPlus_Proxy */
/* These static functions are referenced by ALL PyObjectPlus_Proxy types
@@ -550,7 +561,7 @@ public:
static bool m_ignore_deprecation_warnings;
};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject *py_getattr_dict(PyObject *pydict, PyObject *tp_dict);
#endif
diff --git a/source/gameengine/Expressions/SConscript b/source/gameengine/Expressions/SConscript
index 007d6373c77..b1e34aa358b 100644
--- a/source/gameengine/Expressions/SConscript
+++ b/source/gameengine/Expressions/SConscript
@@ -9,7 +9,9 @@ defs = []
if env['WITH_BF_PYTHON']:
incs += ' ' + env['BF_PYTHON_INC']
-else:
- defs.append('DISABLE_PYTHON')
+ defs.append('WITH_PYTHON')
-env.BlenderLib ( 'bf_expressions', sources, Split(incs), defs, libtype=['core','player'], priority = [360,80], cxx_compileflags=env['BGE_CXXFLAGS'])
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+
+env.BlenderLib ( 'ge_logic_expressions', sources, Split(incs), defs, libtype=['core','player'], priority = [360,80], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/Expressions/StringValue.h b/source/gameengine/Expressions/StringValue.h
index d28e435e2a7..ef8228141a2 100644
--- a/source/gameengine/Expressions/StringValue.h
+++ b/source/gameengine/Expressions/StringValue.h
@@ -39,11 +39,11 @@ public:
virtual CValue* CalcFinal(VALUE_DATA_TYPE dtype, VALUE_OPERATOR op, CValue *val);
virtual void SetValue(CValue* newval) { m_strString = newval->GetText(); SetModified(true); };
virtual CValue* GetReplica();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
virtual PyObject* ConvertValueToPython() {
return PyUnicode_FromString(m_strString.Ptr());
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
private:
// data member
diff --git a/source/gameengine/Expressions/Value.cpp b/source/gameengine/Expressions/Value.cpp
index 1f4f961268b..262f543f834 100644
--- a/source/gameengine/Expressions/Value.cpp
+++ b/source/gameengine/Expressions/Value.cpp
@@ -29,7 +29,7 @@
double CValue::m_sZeroVec[3] = {0.0,0.0,0.0};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyTypeObject CValue::Type = {
PyVarObject_HEAD_INIT(NULL, 0)
@@ -60,7 +60,7 @@ PyTypeObject CValue::Type = {
PyMethodDef CValue::Methods[] = {
{NULL,NULL} //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/*#define CVALUE_DEBUG*/
@@ -520,7 +520,7 @@ CValue* CValue::FindIdentifier(const STR_String& identifiername)
return result;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyAttributeDef CValue::Attributes[] = {
KX_PYATTRIBUTE_RO_FUNCTION("name", CValue, pyattr_get_name),
@@ -611,7 +611,7 @@ PyObject* CValue::ConvertKeysToPython( void )
return pylist;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
///////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/gameengine/Expressions/Value.h b/source/gameengine/Expressions/Value.h
index 009d95ee4d2..b4bb34b0331 100644
--- a/source/gameengine/Expressions/Value.h
+++ b/source/gameengine/Expressions/Value.h
@@ -75,8 +75,6 @@
#endif //WIN32
#endif
-#define EDITOR_LEVEL_VERSION 0x06
-
enum VALUE_OPERATOR {
VALUE_MOD_OPERATOR, // %
@@ -198,7 +196,7 @@ public:
#include "PyObjectPlus.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "object.h"
#endif
class CValue : public PyObjectPlus
@@ -221,7 +219,7 @@ public:
// Construction / Destruction
CValue();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
//static PyObject* PyMake(PyObject*,PyObject*);
virtual PyObject *py_repr(void)
{
@@ -237,7 +235,7 @@ public:
static PyObject * pyattr_get_name(void * self, const KX_PYATTRIBUTE_DEF * attrdef);
virtual PyObject* ConvertKeysToPython( void );
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/GameLogic/CMakeLists.txt b/source/gameengine/GameLogic/CMakeLists.txt
index 84d915847e9..793b8e7eed8 100644
--- a/source/gameengine/GameLogic/CMakeLists.txt
+++ b/source/gameengine/GameLogic/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp Joystick/*.cpp)
-
-SET(INC
+set(INC
.
../../../source/kernel/gen_system
../../../intern/string
@@ -36,16 +34,99 @@ SET(INC
../../../source/gameengine/Rasterizer
)
-IF(WITH_SDL)
- SET(INC ${INC} ${SDL_INCLUDE_DIR})
-ELSE(WITH_SDL)
- ADD_DEFINITIONS(-DDISABLE_SDL)
-ENDIF(WITH_SDL)
+set(SRC
+ Joystick/SCA_Joystick.cpp
+ Joystick/SCA_JoystickEvents.cpp
+ SCA_2DFilterActuator.cpp
+ SCA_ANDController.cpp
+ SCA_ActuatorEventManager.cpp
+ SCA_ActuatorSensor.cpp
+ SCA_AlwaysEventManager.cpp
+ SCA_AlwaysSensor.cpp
+ SCA_BasicEventManager.cpp
+ SCA_DelaySensor.cpp
+ SCA_EventManager.cpp
+ SCA_ExpressionController.cpp
+ SCA_IActuator.cpp
+ SCA_IController.cpp
+ SCA_IInputDevice.cpp
+ SCA_ILogicBrick.cpp
+ SCA_IObject.cpp
+ SCA_IScene.cpp
+ SCA_ISensor.cpp
+ SCA_JoystickManager.cpp
+ SCA_JoystickSensor.cpp
+ SCA_KeyboardManager.cpp
+ SCA_KeyboardSensor.cpp
+ SCA_LogicManager.cpp
+ SCA_MouseManager.cpp
+ SCA_MouseSensor.cpp
+ SCA_NANDController.cpp
+ SCA_NORController.cpp
+ SCA_ORController.cpp
+ SCA_PropertyActuator.cpp
+ SCA_PropertyEventManager.cpp
+ SCA_PropertySensor.cpp
+ SCA_PythonController.cpp
+ SCA_PythonKeyboard.cpp
+ SCA_PythonMouse.cpp
+ SCA_RandomActuator.cpp
+ SCA_RandomEventManager.cpp
+ SCA_RandomNumberGenerator.cpp
+ SCA_RandomSensor.cpp
+ SCA_TimeEventManager.cpp
+ SCA_XNORController.cpp
+ SCA_XORController.cpp
+
+ Joystick/SCA_Joystick.h
+ Joystick/SCA_JoystickDefines.h
+ Joystick/SCA_JoystickPrivate.h
+ SCA_2DFilterActuator.h
+ SCA_ANDController.h
+ SCA_ActuatorEventManager.h
+ SCA_ActuatorSensor.h
+ SCA_AlwaysEventManager.h
+ SCA_AlwaysSensor.h
+ SCA_BasicEventManager.h
+ SCA_DelaySensor.h
+ SCA_EventManager.h
+ SCA_ExpressionController.h
+ SCA_IActuator.h
+ SCA_IController.h
+ SCA_IInputDevice.h
+ SCA_ILogicBrick.h
+ SCA_IObject.h
+ SCA_IScene.h
+ SCA_ISensor.h
+ SCA_JoystickManager.h
+ SCA_JoystickSensor.h
+ SCA_KeyboardManager.h
+ SCA_KeyboardSensor.h
+ SCA_LogicManager.h
+ SCA_MouseManager.h
+ SCA_MouseSensor.h
+ SCA_NANDController.h
+ SCA_NORController.h
+ SCA_ORController.h
+ SCA_PropertyActuator.h
+ SCA_PropertyEventManager.h
+ SCA_PropertySensor.h
+ SCA_PythonController.h
+ SCA_PythonKeyboard.h
+ SCA_PythonMouse.h
+ SCA_RandomActuator.h
+ SCA_RandomEventManager.h
+ SCA_RandomNumberGenerator.h
+ SCA_RandomSensor.h
+ SCA_TimeEventManager.h
+ SCA_XNORController.h
+ SCA_XORController.h
+)
-IF(WITH_PYTHON)
- LIST(APPEND INC ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_SDL)
+ set(INC ${INC} ${SDL_INCLUDE_DIR})
+else()
+ add_definitions(-DDISABLE_SDL)
+endif()
-BLENDERLIB(bf_logic "${SRC}" "${INC}")
+blender_add_lib(ge_logic "${SRC}" "${INC}")
diff --git a/source/gameengine/GameLogic/Joystick/Makefile b/source/gameengine/GameLogic/Joystick/Makefile
deleted file mode 100644
index 5ab297824dd..00000000000
--- a/source/gameengine/GameLogic/Joystick/Makefile
+++ /dev/null
@@ -1,44 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = Joystick
-DIR = $(OCGDIR)/gameengine/logic/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I../Expressions
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += $(NAN_SDLCFLAGS)
-CPPFLAGS += -I../../SceneGraph
-CPPFLAGS += -I../../../kernel/gen_system
diff --git a/source/gameengine/GameLogic/Makefile b/source/gameengine/GameLogic/Makefile
deleted file mode 100644
index 9c8bd73cdc0..00000000000
--- a/source/gameengine/GameLogic/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = logic
-SOURCEDIR = source/gameengine/gameengine/GameLogic
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-DIRS = Joystick
-
-include nan_subdirs.mk
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I../Expressions
-CPPFLAGS += -I../SceneGraph
-CPPFLAGS += -I../Rasterizer
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I../../blender/makesdna
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += $(NAN_SDLCFLAGS)
-
-CPPFLAGS += -I../../kernel/gen_system
diff --git a/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp b/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
index f6d24af0e67..6fe996992c8 100644
--- a/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
+++ b/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
@@ -23,6 +23,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
+
#include "SCA_IActuator.h"
#include "SCA_2DFilterActuator.h"
@@ -96,7 +98,7 @@ void SCA_2DFilterActuator::SetShaderText(const char *text)
m_shaderText = text;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/GameLogic/SCA_ANDController.cpp b/source/gameengine/GameLogic/SCA_ANDController.cpp
index 53c9be5215e..7e2c5bdb350 100644
--- a/source/gameengine/GameLogic/SCA_ANDController.cpp
+++ b/source/gameengine/GameLogic/SCA_ANDController.cpp
@@ -87,7 +87,7 @@ CValue* SCA_ANDController::GetReplica()
return replica;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -123,5 +123,5 @@ PyMethodDef SCA_ANDController::Methods[] = {
PyAttributeDef SCA_ANDController::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp b/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp
index c77e58d2f3b..a93ac2207e1 100644
--- a/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp
@@ -29,6 +29,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
+
#include <iostream>
#include "SCA_ActuatorSensor.h"
#include "SCA_EventManager.h"
@@ -110,7 +112,7 @@ void SCA_ActuatorSensor::Update()
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -160,6 +162,6 @@ int SCA_ActuatorSensor::CheckActuator(void *self, const PyAttributeDef*)
return 1;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_ActuatorSensor.h b/source/gameengine/GameLogic/SCA_ActuatorSensor.h
index 323746889bf..eb52d365079 100644
--- a/source/gameengine/GameLogic/SCA_ActuatorSensor.h
+++ b/source/gameengine/GameLogic/SCA_ActuatorSensor.h
@@ -56,7 +56,7 @@ public:
virtual void ReParent(SCA_IObject* parent);
void Update();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -64,7 +64,7 @@ public:
static int CheckActuator(void *self, const PyAttributeDef*);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
#endif
diff --git a/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp b/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp
index e364225af3d..88f5855b223 100644
--- a/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp
@@ -94,7 +94,7 @@ bool SCA_AlwaysSensor::Evaluate()
return result;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/GameLogic/SCA_DelaySensor.cpp b/source/gameengine/GameLogic/SCA_DelaySensor.cpp
index 6cad801e429..e23135eb14f 100644
--- a/source/gameengine/GameLogic/SCA_DelaySensor.cpp
+++ b/source/gameengine/GameLogic/SCA_DelaySensor.cpp
@@ -35,6 +35,8 @@
#pragma warning( disable : 4786 )
#endif
+#include <stddef.h>
+
#include "SCA_DelaySensor.h"
#include "SCA_LogicManager.h"
#include "SCA_EventManager.h"
@@ -120,7 +122,7 @@ bool SCA_DelaySensor::Evaluate()
return trigger;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -160,6 +162,6 @@ PyAttributeDef SCA_DelaySensor::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_IController.cpp b/source/gameengine/GameLogic/SCA_IController.cpp
index c291ff091aa..6134b229266 100644
--- a/source/gameengine/GameLogic/SCA_IController.cpp
+++ b/source/gameengine/GameLogic/SCA_IController.cpp
@@ -26,6 +26,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
+
#include "SCA_IController.h"
#include "SCA_LogicManager.h"
#include "SCA_IActuator.h"
@@ -194,7 +196,7 @@ void SCA_IController::ApplyState(unsigned int state)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* Python api */
@@ -247,4 +249,4 @@ PyObject* SCA_IController::pyattr_get_actuators(void *self_v, const KX_PYATTRIBU
{
return KX_PythonSeq_CreatePyObject((static_cast<SCA_IController*>(self_v))->m_proxy, KX_PYGENSEQ_CONT_TYPE_ACTUATORS);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/GameLogic/SCA_IController.h b/source/gameengine/GameLogic/SCA_IController.h
index e23a0d7dc92..2d19770be4a 100644
--- a/source/gameengine/GameLogic/SCA_IController.h
+++ b/source/gameengine/GameLogic/SCA_IController.h
@@ -99,11 +99,11 @@ public:
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static PyObject* pyattr_get_state(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_sensors(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_actuators(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
#endif
diff --git a/source/gameengine/GameLogic/SCA_IInputDevice.h b/source/gameengine/GameLogic/SCA_IInputDevice.h
index a13efee1316..0dbfe424e2c 100644
--- a/source/gameengine/GameLogic/SCA_IInputDevice.h
+++ b/source/gameengine/GameLogic/SCA_IInputDevice.h
@@ -47,7 +47,6 @@ public:
KX_JUSTACTIVATED,
KX_ACTIVE,
KX_JUSTRELEASED,
- KX_MAX_INPUTSTATUS
};
SCA_InputEvent(SCA_EnumInputs status=KX_NO_INPUTSTATUS,int eventval=0)
diff --git a/source/gameengine/GameLogic/SCA_ILogicBrick.cpp b/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
index f2e1a8dd151..6fa83994bd6 100644
--- a/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
+++ b/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
@@ -26,6 +26,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
+
#include "SCA_ILogicBrick.h"
#include "PyObjectPlus.h"
@@ -169,7 +171,7 @@ CValue* SCA_ILogicBrick::GetEvent()
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* python stuff */
@@ -253,4 +255,4 @@ PyObject* SCA_ILogicBrick::BoolToPyArg(bool boolarg)
return PyLong_FromSsize_t(boolarg? KX_TRUE: KX_FALSE);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/GameLogic/SCA_ILogicBrick.h b/source/gameengine/GameLogic/SCA_ILogicBrick.h
index 3225c245550..a444210e8d9 100644
--- a/source/gameengine/GameLogic/SCA_ILogicBrick.h
+++ b/source/gameengine/GameLogic/SCA_ILogicBrick.h
@@ -133,7 +133,7 @@ public:
virtual void Replace_IScene(SCA_IScene *val) {};
virtual void Replace_NetworkScene(NG_NetworkScene *val) {};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// python methods
static PyObject* pyattr_get_owner(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
@@ -157,7 +157,7 @@ protected:
/** Convert a a c++ value to KX_TRUE, KX_FALSE in Python. */
PyObject* BoolToPyArg(bool);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/GameLogic/SCA_IObject.cpp b/source/gameengine/GameLogic/SCA_IObject.cpp
index 7c0a5b2db15..ff71d1bf96b 100644
--- a/source/gameengine/GameLogic/SCA_IObject.cpp
+++ b/source/gameengine/GameLogic/SCA_IObject.cpp
@@ -303,7 +303,7 @@ void SCA_IObject::SetState(unsigned int state)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -342,4 +342,4 @@ PyAttributeDef SCA_IObject::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/GameLogic/SCA_IObject.h b/source/gameengine/GameLogic/SCA_IObject.h
index 0178da5f343..591be6fe53b 100644
--- a/source/gameengine/GameLogic/SCA_IObject.h
+++ b/source/gameengine/GameLogic/SCA_IObject.h
@@ -41,7 +41,7 @@ class SCA_ISensor;
class SCA_IController;
class SCA_IActuator;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
template<class T> T PyVecTo(PyObject*);
#endif
diff --git a/source/gameengine/GameLogic/SCA_ISensor.cpp b/source/gameengine/GameLogic/SCA_ISensor.cpp
index fada69848b2..bb86b3735bc 100644
--- a/source/gameengine/GameLogic/SCA_ISensor.cpp
+++ b/source/gameengine/GameLogic/SCA_ISensor.cpp
@@ -29,6 +29,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
+
#include "SCA_ISensor.h"
#include "SCA_EventManager.h"
#include "SCA_LogicManager.h"
@@ -300,7 +302,7 @@ void SCA_ISensor::Activate(class SCA_LogicManager* logicmgr)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ----------------------------------------------- */
/* Python Functions */
@@ -427,6 +429,6 @@ int SCA_ISensor::pyattr_check_tap(void *self_v, const KX_PYATTRIBUTE_DEF *attrde
self->m_level = false;
return 0;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_ISensor.h b/source/gameengine/GameLogic/SCA_ISensor.h
index 2d3a3ef08a0..f31dd83343b 100644
--- a/source/gameengine/GameLogic/SCA_ISensor.h
+++ b/source/gameengine/GameLogic/SCA_ISensor.h
@@ -190,7 +190,7 @@ public:
bool IsNoLink() const
{ return !m_links; }
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* Python functions: */
KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,reset);
@@ -210,7 +210,7 @@ public:
KX_SENSOR_JUST_DEACTIVATED
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
#endif //__SCA_ISENSOR
diff --git a/source/gameengine/GameLogic/SCA_JoystickSensor.cpp b/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
index 29a6a73b865..cace4198ed8 100644
--- a/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
@@ -241,7 +241,7 @@ bool SCA_JoystickSensor::isValid(SCA_JoystickSensor::KX_JOYSENSORMODE m)
return res;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -296,7 +296,7 @@ PyAttributeDef SCA_JoystickSensor::Attributes[] = {
/* get button active list -------------------------------------------------- */
const char SCA_JoystickSensor::GetButtonActiveList_doc[] =
"getButtonActiveList\n"
-"\tReturns a list containing the indicies of the button currently pressed.\n";
+"\tReturns a list containing the indices of the button currently pressed.\n";
PyObject* SCA_JoystickSensor::PyGetButtonActiveList( ) {
SCA_Joystick *joy = ((SCA_JoystickManager *)m_eventmgr)->GetJoystickDevice(m_joyindex);
PyObject *ls = PyList_New(0);
diff --git a/source/gameengine/GameLogic/SCA_JoystickSensor.h b/source/gameengine/GameLogic/SCA_JoystickSensor.h
index 90fb16de747..39f826dfe02 100644
--- a/source/gameengine/GameLogic/SCA_JoystickSensor.h
+++ b/source/gameengine/GameLogic/SCA_JoystickSensor.h
@@ -117,7 +117,7 @@ public:
return m_joyindex;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -157,7 +157,7 @@ public:
return 0;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp b/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
index c49d65226dc..7368869bc2d 100644
--- a/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
@@ -27,6 +27,9 @@
* ***** END GPL LICENSE BLOCK *****
* Sensor for keyboard input
*/
+
+#include <stddef.h>
+
#include "SCA_KeyboardSensor.h"
#include "SCA_KeyboardManager.h"
#include "SCA_LogicManager.h"
@@ -156,6 +159,9 @@ bool SCA_KeyboardSensor::Evaluate()
case SCA_InputEvent::KX_ACTIVE:
active = true;
break;
+ case SCA_InputEvent::KX_NO_INPUTSTATUS:
+ /* do nothing */
+ break;
}
}
@@ -221,6 +227,9 @@ bool SCA_KeyboardSensor::Evaluate()
break;
case SCA_InputEvent::KX_JUSTACTIVATED:
qual_change = true;
+ case SCA_InputEvent::KX_ACTIVE:
+ /* do nothing */
+ break;
}
}
if (m_qual2 > 0 && qual==true) {
@@ -236,6 +245,9 @@ bool SCA_KeyboardSensor::Evaluate()
break;
case SCA_InputEvent::KX_JUSTACTIVATED:
qual_change = true;
+ case SCA_InputEvent::KX_ACTIVE:
+ /* do nothing */
+ break;
}
}
/* done reading qualifiers */
@@ -399,7 +411,7 @@ void SCA_KeyboardSensor::LogKeystrokes(void)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python Functions */
@@ -492,7 +504,7 @@ PyObject* SCA_KeyboardSensor::pyattr_get_events(void *self_v, const KX_PYATTRIBU
return resultlist;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* Accessed from python */
diff --git a/source/gameengine/GameLogic/SCA_KeyboardSensor.h b/source/gameengine/GameLogic/SCA_KeyboardSensor.h
index 5ca329b0846..0a3b25ac361 100644
--- a/source/gameengine/GameLogic/SCA_KeyboardSensor.h
+++ b/source/gameengine/GameLogic/SCA_KeyboardSensor.h
@@ -103,7 +103,7 @@ public:
virtual bool IsPositiveTrigger();
bool TriggerOnAllKeys();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
diff --git a/source/gameengine/GameLogic/SCA_LogicManager.cpp b/source/gameengine/GameLogic/SCA_LogicManager.cpp
index d003c5618f1..ab06fe7f9ef 100644
--- a/source/gameengine/GameLogic/SCA_LogicManager.cpp
+++ b/source/gameengine/GameLogic/SCA_LogicManager.cpp
@@ -307,7 +307,7 @@ void SCA_LogicManager::AddTriggeredController(SCA_IController* controller, SCA_I
{
controller->Activate(m_triggeredControllerSet);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// so that the controller knows which sensor has activited it
// only needed for python controller
diff --git a/source/gameengine/GameLogic/SCA_LogicManager.h b/source/gameengine/GameLogic/SCA_LogicManager.h
index 9ddb62df361..f92b27f641a 100644
--- a/source/gameengine/GameLogic/SCA_LogicManager.h
+++ b/source/gameengine/GameLogic/SCA_LogicManager.h
@@ -127,6 +127,7 @@ public:
void RegisterMeshName(const STR_String& meshname,void* mesh);
void UnregisterMeshName(const STR_String& meshname,void* mesh);
GEN_Map<STR_HashedString,void*>& GetMeshMap() { return m_mapStringToMeshes; };
+ GEN_Map<STR_HashedString,void*>& GetActionMap() { return m_mapStringToActions; };
void RegisterActionName(const STR_String& actname,void* action);
diff --git a/source/gameengine/GameLogic/SCA_MouseSensor.cpp b/source/gameengine/GameLogic/SCA_MouseSensor.cpp
index 9f4b25986b0..257a67ad947 100644
--- a/source/gameengine/GameLogic/SCA_MouseSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_MouseSensor.cpp
@@ -30,6 +30,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
+
#include "SCA_MouseSensor.h"
#include "SCA_EventManager.h"
#include "SCA_MouseManager.h"
@@ -232,7 +234,7 @@ bool SCA_MouseSensor::isValid(SCA_MouseSensor::KX_MOUSESENSORMODE m)
return ((m > KX_MOUSESENSORMODE_NODEF) && (m < KX_MOUSESENSORMODE_MAX));
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -305,6 +307,6 @@ PyAttributeDef SCA_MouseSensor::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_MouseSensor.h b/source/gameengine/GameLogic/SCA_MouseSensor.h
index f52b57a3e11..dc0e9a11d39 100644
--- a/source/gameengine/GameLogic/SCA_MouseSensor.h
+++ b/source/gameengine/GameLogic/SCA_MouseSensor.h
@@ -104,7 +104,7 @@ class SCA_MouseSensor : public SCA_ISensor
static void UpdateHotkey(void *self);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
diff --git a/source/gameengine/GameLogic/SCA_NANDController.cpp b/source/gameengine/GameLogic/SCA_NANDController.cpp
index c09a53d8ac7..bcb2c84a083 100644
--- a/source/gameengine/GameLogic/SCA_NANDController.cpp
+++ b/source/gameengine/GameLogic/SCA_NANDController.cpp
@@ -87,7 +87,7 @@ CValue* SCA_NANDController::GetReplica()
return replica;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/GameLogic/SCA_NORController.cpp b/source/gameengine/GameLogic/SCA_NORController.cpp
index 8ebd79efcfa..5711fb5751b 100644
--- a/source/gameengine/GameLogic/SCA_NORController.cpp
+++ b/source/gameengine/GameLogic/SCA_NORController.cpp
@@ -87,7 +87,7 @@ CValue* SCA_NORController::GetReplica()
return replica;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -124,6 +124,6 @@ PyAttributeDef SCA_NORController::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_ORController.cpp b/source/gameengine/GameLogic/SCA_ORController.cpp
index a638147e211..72c368d632f 100644
--- a/source/gameengine/GameLogic/SCA_ORController.cpp
+++ b/source/gameengine/GameLogic/SCA_ORController.cpp
@@ -83,7 +83,7 @@ void SCA_ORController::Trigger(SCA_LogicManager* logicmgr)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -120,6 +120,6 @@ PyAttributeDef SCA_ORController::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_PropertyActuator.cpp b/source/gameengine/GameLogic/SCA_PropertyActuator.cpp
index c1b49d32712..bc6604bebd8 100644
--- a/source/gameengine/GameLogic/SCA_PropertyActuator.cpp
+++ b/source/gameengine/GameLogic/SCA_PropertyActuator.cpp
@@ -29,6 +29,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
+
#include "SCA_PropertyActuator.h"
#include "InputParser.h"
#include "Operator2Expr.h"
@@ -217,7 +219,7 @@ void SCA_PropertyActuator::Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/GameLogic/SCA_PropertySensor.cpp b/source/gameengine/GameLogic/SCA_PropertySensor.cpp
index be86b976a70..55cd2713c35 100644
--- a/source/gameengine/GameLogic/SCA_PropertySensor.cpp
+++ b/source/gameengine/GameLogic/SCA_PropertySensor.cpp
@@ -29,6 +29,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
+
#include <iostream>
#include "SCA_PropertySensor.h"
#include "Operator2Expr.h"
@@ -304,7 +306,7 @@ CValue* SCA_PropertySensor::FindIdentifier(const STR_String& identifiername)
return GetParent()->FindIdentifier(identifiername);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -378,6 +380,6 @@ PyAttributeDef SCA_PropertySensor::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_PropertySensor.h b/source/gameengine/GameLogic/SCA_PropertySensor.h
index 9a5c4762558..5a29c526fc0 100644
--- a/source/gameengine/GameLogic/SCA_PropertySensor.h
+++ b/source/gameengine/GameLogic/SCA_PropertySensor.h
@@ -84,7 +84,7 @@ public:
virtual bool IsPositiveTrigger();
virtual CValue* FindIdentifier(const STR_String& identifiername);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
diff --git a/source/gameengine/GameLogic/SCA_PythonController.cpp b/source/gameengine/GameLogic/SCA_PythonController.cpp
index 1f05846abe4..bf481b8e799 100644
--- a/source/gameengine/GameLogic/SCA_PythonController.cpp
+++ b/source/gameengine/GameLogic/SCA_PythonController.cpp
@@ -29,16 +29,18 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
+
#include "SCA_PythonController.h"
#include "SCA_LogicManager.h"
#include "SCA_ISensor.h"
#include "SCA_IActuator.h"
#include "PyObjectPlus.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "compile.h"
#include "eval.h"
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
#include <algorithm>
@@ -49,7 +51,7 @@ SCA_PythonController* SCA_PythonController::m_sCurrentController = NULL;
SCA_PythonController::SCA_PythonController(SCA_IObject* gameobj, int mode)
: SCA_IController(gameobj),
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
m_bytecode(NULL),
m_function(NULL),
#endif
@@ -57,7 +59,7 @@ SCA_PythonController::SCA_PythonController(SCA_IObject* gameobj, int mode)
m_bModified(true),
m_debug(false),
m_mode(mode)
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
, m_pythondictionary(NULL)
#endif
@@ -84,7 +86,7 @@ int SCA_PythonController::Release()
SCA_PythonController::~SCA_PythonController()
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
//printf("released python byte script\n");
Py_XDECREF(m_bytecode);
@@ -104,7 +106,7 @@ CValue* SCA_PythonController::GetReplica()
{
SCA_PythonController* replica = new SCA_PythonController(*this);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* why is this needed at all??? - m_bytecode is NULL'd below so this doesnt make sense
* but removing it crashes blender (with YoFrankie). so leave in for now - Campbell */
Py_XINCREF(replica->m_bytecode);
@@ -146,7 +148,7 @@ void SCA_PythonController::SetScriptName(const STR_String& name)
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
void SCA_PythonController::SetNamespace(PyObject* pythondictionary)
{
if (m_pythondictionary)
@@ -171,7 +173,7 @@ int SCA_PythonController::IsTriggered(class SCA_ISensor* sensor)
return 0;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* warning, self is not the SCA_PythonController, its a PyObjectPlus_Proxy */
PyObject* SCA_PythonController::sPyGetCurrentController(PyObject *self)
@@ -214,7 +216,7 @@ SCA_IActuator* SCA_PythonController::LinkedActuatorFromPy(PyObject *value)
PyErr_Format(PyExc_ValueError, "'%s' not in this python controllers actuator list", _PyUnicode_AsString(value_str));
Py_DECREF(value_str);
- return false;
+ return NULL;
}
const char* SCA_PythonController::sPyGetCurrentController__doc__ = "getCurrentController()";
@@ -408,7 +410,13 @@ void SCA_PythonController::Trigger(SCA_LogicManager* logicmgr)
*/
excdict= PyDict_Copy(m_pythondictionary);
- resultobj = PyEval_EvalCode((PyCodeObject*)m_bytecode, excdict, excdict);
+
+#if PY_VERSION_HEX >= 0x03020000
+ resultobj = PyEval_EvalCode((PyObject *)m_bytecode, excdict, excdict);
+#else
+ resultobj = PyEval_EvalCode((PyCodeObject *)m_bytecode, excdict, excdict);
+#endif
+
/* PyRun_SimpleString(m_scriptText.Ptr()); */
break;
}
@@ -527,13 +535,13 @@ int SCA_PythonController::pyattr_set_script(void *self_v, const KX_PYATTRIBUTE_D
return PY_SET_ATTR_SUCCESS;
}
-#else // DISABLE_PYTHON
+#else // WITH_PYTHON
void SCA_PythonController::Trigger(SCA_LogicManager* logicmgr)
{
/* intentionally blank */
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_PythonController.h b/source/gameengine/GameLogic/SCA_PythonController.h
index bd78014038c..602b5e27e47 100644
--- a/source/gameengine/GameLogic/SCA_PythonController.h
+++ b/source/gameengine/GameLogic/SCA_PythonController.h
@@ -42,7 +42,7 @@ class SCA_IObject;
class SCA_PythonController : public SCA_IController
{
Py_Header;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
struct _object * m_bytecode; /* SCA_PYEXEC_SCRIPT only */
PyObject* m_function; /* SCA_PYEXEC_MODULE only */
#endif
@@ -55,7 +55,7 @@ class SCA_PythonController : public SCA_IController
protected:
STR_String m_scriptText;
STR_String m_scriptName;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* m_pythondictionary; /* for SCA_PYEXEC_SCRIPT only */
PyObject* m_pythonfunction; /* for SCA_PYEXEC_MODULE only */
#endif
@@ -83,7 +83,7 @@ class SCA_PythonController : public SCA_IController
void SetScriptText(const STR_String& text);
void SetScriptName(const STR_String& name);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
void SetNamespace(PyObject* pythondictionary);
#endif
void SetDebug(bool debug) { m_debug = debug; }
@@ -94,7 +94,7 @@ class SCA_PythonController : public SCA_IController
bool Import();
void ErrorPrint(const char *error_msg);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static const char* sPyGetCurrentController__doc__;
static PyObject* sPyGetCurrentController(PyObject* self);
static const char* sPyAddActiveActuator__doc__;
diff --git a/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp b/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp
index 3d5d3568335..213446935b6 100644
--- a/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp
+++ b/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp
@@ -33,20 +33,20 @@ SCA_PythonKeyboard::SCA_PythonKeyboard(SCA_IInputDevice* keyboard)
: PyObjectPlus(),
m_keyboard(keyboard)
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
m_event_dict = PyDict_New();
#endif
}
SCA_PythonKeyboard::~SCA_PythonKeyboard()
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyDict_Clear(m_event_dict);
Py_DECREF(m_event_dict);
#endif
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/GameLogic/SCA_PythonKeyboard.h b/source/gameengine/GameLogic/SCA_PythonKeyboard.h
index 260835155e6..6a89ba7de76 100644
--- a/source/gameengine/GameLogic/SCA_PythonKeyboard.h
+++ b/source/gameengine/GameLogic/SCA_PythonKeyboard.h
@@ -32,14 +32,14 @@ class SCA_PythonKeyboard : public PyObjectPlus
Py_Header;
private:
class SCA_IInputDevice *m_keyboard;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* m_event_dict;
#endif
public:
SCA_PythonKeyboard(class SCA_IInputDevice* keyboard);
virtual ~SCA_PythonKeyboard();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static PyObject* pyattr_get_events(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
#endif
};
diff --git a/source/gameengine/GameLogic/SCA_PythonMouse.cpp b/source/gameengine/GameLogic/SCA_PythonMouse.cpp
index 936ee2ff5c4..7267eb74594 100644
--- a/source/gameengine/GameLogic/SCA_PythonMouse.cpp
+++ b/source/gameengine/GameLogic/SCA_PythonMouse.cpp
@@ -35,20 +35,20 @@ SCA_PythonMouse::SCA_PythonMouse(SCA_IInputDevice* mouse, RAS_ICanvas* canvas)
m_mouse(mouse),
m_canvas(canvas)
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
m_event_dict = PyDict_New();
#endif
}
SCA_PythonMouse::~SCA_PythonMouse()
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyDict_Clear(m_event_dict);
Py_DECREF(m_event_dict);
#endif
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/GameLogic/SCA_PythonMouse.h b/source/gameengine/GameLogic/SCA_PythonMouse.h
index 9e1085e6bec..15a7e19c602 100644
--- a/source/gameengine/GameLogic/SCA_PythonMouse.h
+++ b/source/gameengine/GameLogic/SCA_PythonMouse.h
@@ -33,7 +33,7 @@ class SCA_PythonMouse : public PyObjectPlus
private:
class SCA_IInputDevice *m_mouse;
class RAS_ICanvas *m_canvas;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* m_event_dict;
#endif
public:
@@ -42,7 +42,7 @@ public:
void Show(bool visible);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
KX_PYMETHOD_DOC(SCA_PythonMouse, show);
static PyObject* pyattr_get_events(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/GameLogic/SCA_RandomActuator.cpp b/source/gameengine/GameLogic/SCA_RandomActuator.cpp
index 4b90ca7dadf..76bcf52c295 100644
--- a/source/gameengine/GameLogic/SCA_RandomActuator.cpp
+++ b/source/gameengine/GameLogic/SCA_RandomActuator.cpp
@@ -29,6 +29,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
+
#include "BoolValue.h"
#include "IntValue.h"
#include "FloatValue.h"
@@ -305,7 +307,7 @@ void SCA_RandomActuator::enforceConstraints() {
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/GameLogic/SCA_RandomActuator.h b/source/gameengine/GameLogic/SCA_RandomActuator.h
index 41d19f5b4c4..1fd2180f32c 100644
--- a/source/gameengine/GameLogic/SCA_RandomActuator.h
+++ b/source/gameengine/GameLogic/SCA_RandomActuator.h
@@ -92,7 +92,7 @@ class SCA_RandomActuator : public SCA_IActuator
virtual CValue* GetReplica();
virtual void ProcessReplica();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -112,7 +112,7 @@ class SCA_RandomActuator : public SCA_IActuator
KX_PYMETHOD_DOC_VARARGS(SCA_RandomActuator, setFloatNormal);
KX_PYMETHOD_DOC_VARARGS(SCA_RandomActuator, setFloatNegativeExponential);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
}; /* end of class KX_EditObjectActuator : public SCA_PropertyActuator */
diff --git a/source/gameengine/GameLogic/SCA_RandomSensor.cpp b/source/gameengine/GameLogic/SCA_RandomSensor.cpp
index a7d18ff40d4..8b18641c165 100644
--- a/source/gameengine/GameLogic/SCA_RandomSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_RandomSensor.cpp
@@ -29,6 +29,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
+
#include "SCA_RandomSensor.h"
#include "SCA_EventManager.h"
#include "SCA_RandomEventManager.h"
@@ -120,7 +122,7 @@ bool SCA_RandomSensor::Evaluate()
return evaluateResult;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -176,6 +178,6 @@ int SCA_RandomSensor::pyattr_set_seed(void *self_v, const KX_PYATTRIBUTE_DEF *at
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_RandomSensor.h b/source/gameengine/GameLogic/SCA_RandomSensor.h
index 3be17943d84..af5a767c1c1 100644
--- a/source/gameengine/GameLogic/SCA_RandomSensor.h
+++ b/source/gameengine/GameLogic/SCA_RandomSensor.h
@@ -56,7 +56,7 @@ public:
virtual bool IsPositiveTrigger();
virtual void Init();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
diff --git a/source/gameengine/GameLogic/SCA_XNORController.cpp b/source/gameengine/GameLogic/SCA_XNORController.cpp
index 9f54e41d110..f1f76c83718 100644
--- a/source/gameengine/GameLogic/SCA_XNORController.cpp
+++ b/source/gameengine/GameLogic/SCA_XNORController.cpp
@@ -91,7 +91,7 @@ CValue* SCA_XNORController::GetReplica()
return replica;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -128,6 +128,6 @@ PyAttributeDef SCA_XNORController::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_XORController.cpp b/source/gameengine/GameLogic/SCA_XORController.cpp
index a58f30a3bed..ee63b72e455 100644
--- a/source/gameengine/GameLogic/SCA_XORController.cpp
+++ b/source/gameengine/GameLogic/SCA_XORController.cpp
@@ -91,7 +91,7 @@ CValue* SCA_XORController::GetReplica()
return replica;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -127,6 +127,6 @@ PyMethodDef SCA_XORController::Methods[] = {
PyAttributeDef SCA_XORController::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SConscript b/source/gameengine/GameLogic/SConscript
index 507bb7f0bdd..a8d3ee65f4c 100644
--- a/source/gameengine/GameLogic/SConscript
+++ b/source/gameengine/GameLogic/SConscript
@@ -16,11 +16,14 @@ else:
if env['WITH_BF_PYTHON']:
incs += ' ' + env['BF_PYTHON_INC']
-else:
- defs.append('DISABLE_PYTHON')
+ defs.append('WITH_PYTHON')
if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
if env['BF_DEBUG']:
defs.append('_DEBUG')
-env.BlenderLib ( 'bf_logic', sources, Split(incs), defs, libtype=['core','player'], priority=[330,65], cxx_compileflags=env['BGE_CXXFLAGS'])
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+ incs += ' #/intern/guardedalloc'
+
+env.BlenderLib ( 'ge_logic', sources, Split(incs), defs, libtype=['core','player'], priority=[330,65], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/GamePlayer/CMakeLists.txt b/source/gameengine/GamePlayer/CMakeLists.txt
index f0ce3afbe10..ab89b18a09b 100644
--- a/source/gameengine/GamePlayer/CMakeLists.txt
+++ b/source/gameengine/GamePlayer/CMakeLists.txt
@@ -24,9 +24,9 @@
#
# ***** END GPL LICENSE BLOCK *****
-ADD_SUBDIRECTORY(common)
-ADD_SUBDIRECTORY(ghost)
+add_subdirectory(common)
+add_subdirectory(ghost)
-IF(WITH_WEBPLUGIN)
- ADD_SUBDIRECTORY(xembed)
-ENDIF(WITH_WEBPLUGIN)
+if(WITH_WEBPLUGIN)
+ add_subdirectory(xembed)
+endif()
diff --git a/source/gameengine/GamePlayer/Makefile b/source/gameengine/GamePlayer/Makefile
deleted file mode 100644
index 30a13f26503..00000000000
--- a/source/gameengine/GamePlayer/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-include nan_definitions.mk
-
-SOURCEDIR = source/gameengine/GamePlayer
-DIR = $(OCGDIR)/gameengine/GamePlayer
-DIRS = common ghost
-
-ifeq ($(WITH_BF_WEBPLUGIN),true)
-ifeq ($(OS),$(findstring $(OS), "freebsd irix windows"))
- ifneq ($(FREE_WINDOWS),true)
- DIRS += netscape
- endif
-endif
-
-ifeq ($(OS),$(findstring $(OS), "linux"))
- ifeq ($(CPU),i386)
- DIRS += netscape
- endif
-endif
-
-ifeq ($(OS),$(findstring $(OS), "solaris"))
- ifeq ($(CPU),sparc)
- DIRS += netscape
- endif
-endif
-endif
-
-include nan_subdirs.mk
diff --git a/source/gameengine/GamePlayer/common/CMakeLists.txt b/source/gameengine/GamePlayer/common/CMakeLists.txt
index 08a4aa50a00..0bd8a0dd9a3 100644
--- a/source/gameengine/GamePlayer/common/CMakeLists.txt
+++ b/source/gameengine/GamePlayer/common/CMakeLists.txt
@@ -24,20 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-SET(SRC
- bmfont.cpp
- GPC_Canvas.cpp
- GPC_Engine.cpp
- GPC_KeyboardDevice.cpp
- GPC_MouseDevice.cpp
- GPC_RawImage.cpp
- GPC_RawLoadDotBlendArray.cpp
- GPC_RawLogoArrays.cpp
- GPC_RenderTools.cpp
- GPC_System.cpp
-)
-
-SET(INC
+set(INC
.
../../../../intern/string
../../../../intern/ghost
@@ -50,9 +37,9 @@ SET(INC
../../../../source/blender/imbuf
../../../../source/gameengine/Ketsji
../../../../source/blender/blenlib
+ ../../../../source/blender/blenfont
../../../../source/blender/blenkernel
../../../../source/blender
- ../../../../source/blender/include
../../../../source/blender/makesdna
../../../../source/gameengine/Rasterizer
../../../../source/gameengine/GameLogic
@@ -62,15 +49,37 @@ SET(INC
../../../../source/gameengine/Physics/common
../../../../source/gameengine/Network/LoopBackNetwork
../../../../source/gameengine/GamePlayer/ghost
- ../../../../source/blender/misc
../../../../source/blender/blenloader
../../../../source/blender/gpu
../../../../extern/glew/include
- ${PYTHON_INC}
- ${PNG_INC}
- ${ZLIB_INC}
+ ${PYTHON_INCLUDE_DIRS}
+ ${PNG_INCLUDE_DIR}
+ ${ZLIB_INCLUDE_DIRS}
+)
+
+set(SRC
+ bmfont.cpp
+ GPC_Canvas.cpp
+ GPC_Engine.cpp
+ GPC_KeyboardDevice.cpp
+ GPC_MouseDevice.cpp
+ GPC_RawImage.cpp
+ GPC_RawLoadDotBlendArray.cpp
+ GPC_RawLogoArrays.cpp
+ GPC_RenderTools.cpp
+ GPC_System.cpp
+
+ GPC_Canvas.h
+ GPC_Engine.h
+ GPC_KeyboardDevice.h
+ GPC_MouseDevice.h
+ GPC_RawImage.h
+ GPC_RawLoadDotBlendArray.h
+ GPC_RawLogoArrays.h
+ GPC_RenderTools.h
+ GPC_System.h
)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+add_definitions(-DGLEW_STATIC)
-BLENDERLIB_NOLIST(gp_common "${SRC}" "${INC}")
+blender_add_lib_nolist(ge_player_common "${SRC}" "${INC}")
diff --git a/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp b/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
index e02b5fedaf0..b5b6851bc52 100644
--- a/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
@@ -53,6 +53,10 @@
#include "GPC_RenderTools.h"
+extern "C" {
+#include "BLF_api.h"
+}
+
unsigned int GPC_RenderTools::m_numgllights;
@@ -276,6 +280,35 @@ void GPC_RenderTools::applyTransform(RAS_IRasterizer* rasty,double* oglmatrix,in
}
}
+void GPC_RenderTools::RenderText3D( int fontid,
+ const char* text,
+ int size,
+ int dpi,
+ float* color,
+ double* mat,
+ float aspect)
+{
+ /* the actual drawing */
+ glColor3fv(color);
+
+ /* multiply the text matrix by the object matrix */
+ BLF_enable(fontid, BLF_MATRIX|BLF_ASPECT);
+ BLF_matrix(fontid, mat);
+
+ /* aspect is the inverse scale that allows you to increase */
+ /* your resolution without sizing the final text size */
+ /* the bigger the size, the smaller the aspect */
+ BLF_aspect(fontid, aspect, aspect, aspect);
+
+ BLF_size(fontid, size, dpi);
+ BLF_position(fontid, 0, 0, 0);
+ BLF_draw(fontid, (char *)text, strlen(text));
+
+ BLF_disable(fontid, BLF_MATRIX|BLF_ASPECT);
+ glEnable(GL_DEPTH_TEST);
+}
+
+
void GPC_RenderTools::RenderText2D(RAS_TEXT_RENDER_MODE mode,
const char* text,
@@ -284,8 +317,9 @@ void GPC_RenderTools::RenderText2D(RAS_TEXT_RENDER_MODE mode,
int width,
int height)
{
+ /*
STR_String tmpstr(text);
- char* s = tmpstr.Ptr();
+ char* s = tmpstr.Ptr(); */
// Save and change OpenGL settings
int texture2D;
@@ -313,13 +347,11 @@ void GPC_RenderTools::RenderText2D(RAS_TEXT_RENDER_MODE mode,
if (mode == RAS_IRenderTools::RAS_TEXT_PADDED)
{
glColor3ub(0, 0, 0);
- glRasterPos2s(xco+1, height-yco-1);
- // XXX BMF_DrawString(m_font, s);
+ BLF_draw_default(xco+1, height-yco-1, 0.f, text, strlen(text));
}
glColor3ub(255, 255, 255);
- glRasterPos2s(xco, height-yco);
- // XXX BMF_DrawString(m_font, s);
+ BLF_draw_default(xco, height-yco, 0.f, text, strlen(text));
// Restore view settings
glMatrixMode(GL_PROJECTION);
diff --git a/source/gameengine/GamePlayer/common/GPC_RenderTools.h b/source/gameengine/GamePlayer/common/GPC_RenderTools.h
index 378c6d8580f..714d686439d 100644
--- a/source/gameengine/GamePlayer/common/GPC_RenderTools.h
+++ b/source/gameengine/GamePlayer/common/GPC_RenderTools.h
@@ -68,6 +68,13 @@ public:
void DisableOpenGLLights();
void ProcessLighting(RAS_IRasterizer *rasty, bool uselights, const MT_Transform& viewmat);
+ void RenderText3D(int fontid,
+ const char* text,
+ int size,
+ int dpi,
+ float* color,
+ double* mat,
+ float aspect);
/* @attention mode is ignored here */
void RenderText2D(RAS_TEXT_RENDER_MODE mode,
const char* text,
diff --git a/source/gameengine/GamePlayer/common/Makefile b/source/gameengine/GamePlayer/common/Makefile
deleted file mode 100644
index e28cacb826a..00000000000
--- a/source/gameengine/GamePlayer/common/Makefile
+++ /dev/null
@@ -1,84 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = common
-DIR = $(OCGDIR)/gameengine/GamePlayer/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I../../../blender/blenkernel
-CPPFLAGS += -I../../../blender/blenloader
-CPPFLAGS += -I../../../blender/blenlib
-CPPFLAGS += -I../../../blender/imbuf
-CPPFLAGS += -I../../../blender/makesdna
-CPPFLAGS += -I../../../blender/gpu
-CPPFLAGS += -I../../../kernel/gen_system
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_PNG)/include
-CPPFLAGS += -I$(NAN_ZLIB)/include
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-
-CPPFLAGS += -I../../../gameengine/Converter
-CPPFLAGS += -I../../../gameengine/Expressions
-CPPFLAGS += -I../../../gameengine/GameLogic
-CPPFLAGS += -I../../../gameengine/Converter
-CPPFLAGS += -I../../../gameengine/BlenderRoutines
-CPPFLAGS += -I../../../gameengine/Ketsji
-CPPFLAGS += -I../../../gameengine/Ketsji/KXNetwork
-CPPFLAGS += -I../../../gameengine/Network
-CPPFLAGS += -I../../../gameengine/Network/LoopBackNetwork
-CPPFLAGS += -I../../../gameengine/Rasterizer
-CPPFLAGS += -I../../../gameengine/SceneGraph
-CPPFLAGS += -I../../../gameengine/Rasterizer/RAS_OpenGLRasterizer
-CPPFLAGS += -I../../../gameengine/Physics/common
-
-###############################
-
-SOURCEDIR = source/gameengine/GamePlayer/common
-DIRS =
-ifeq ($(OS),windows)
-# Still
- DIRS = windows
-else
- ifneq ($(OS),darwin)
- DIRS = unix
- endif
-endif
-
-include nan_subdirs.mk
diff --git a/source/gameengine/GamePlayer/common/SConscript b/source/gameengine/GamePlayer/common/SConscript
index 7a16e950b36..f7a423f4588 100644
--- a/source/gameengine/GamePlayer/common/SConscript
+++ b/source/gameengine/GamePlayer/common/SConscript
@@ -26,6 +26,7 @@ incs = ['.',
'#source/blender/imbuf',
'#source/gameengine/Ketsji',
'#source/blender/blenlib',
+ '#source/blender/blenfont',
'#source/blender/blenkernel',
'#source/blender',
'#source/blender/include',
@@ -44,28 +45,13 @@ incs = ['.',
'#source/blender/gpu',
'#extern/glew/include']
-#This is all plugin stuff!
-#if sys.platform=='win32':
-# source_files += ['windows/GPW_Canvas.cpp',
-# 'windows/GPW_Engine.cpp',
-# 'windows/GPW_KeyboardDevice.cpp',
-# 'windows/GPW_System.cpp']
-# gp_common_env.Append ( CPPPATH = ['windows'])
-#elif sys.platform=='linux2' or sys.platform=='linux-i386':
-# source_files += ['unix/GPU_Canvas.cpp',
-# 'unix/GPU_Engine.cpp',
-# 'unix/GPU_KeyboardDevice.cpp',
-# 'unix/GPU_System.cpp']
-# gp_common_env.Append ( CPPPATH = ['unix'])
-
defs = [ 'GLEW_STATIC' ]
if env['WITH_BF_PYTHON']:
incs += Split(env['BF_PYTHON_INC'])
-else:
- defs.append('DISABLE_PYTHON')
+ defs.append('WITH_PYTHON')
incs += Split(env['BF_PNG_INC'])
incs += Split(env['BF_ZLIB_INC'])
-env.BlenderLib (libname='gp_common', sources=source_files, includes=incs, defines = defs, libtype=['player'], priority=[5], cxx_compileflags=env['BGE_CXXFLAGS'])
+env.BlenderLib (libname='ge_player_common', sources=source_files, includes=incs, defines = defs, libtype=['player'], priority=[5], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp b/source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp
deleted file mode 100644
index 3eb7147bd98..00000000000
--- a/source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp
+++ /dev/null
@@ -1,299 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <assert.h>
-#include <unistd.h>
-#include "GPU_Engine.h"
-#include "GPC_MouseDevice.h"
-#include "GPU_Canvas.h"
-#include "GPU_KeyboardDevice.h"
-#include "GPU_System.h"
-
-#include "BLI_blenlib.h"
-#include "BLO_readfile.h"
-
-#include "SND_DeviceManager.h"
-
-#include "NG_NetworkScene.h"
-#include "NG_LoopBackNetworkDeviceInterface.h"
-#include "SND_DeviceManager.h"
-#include "KX_BlenderSceneConverter.h"
-#include "KX_KetsjiEngine.h"
-
-#include "GPC_RenderTools.h"
-#include "GPC_RawImage.h"
-
-void Redraw(GPU_Engine *engine); // -the- redraw function
-
-// callback functions
-/*
-void RedrawCallback(Widget, XtPointer closure, XEvent *, Boolean *continue_to_dispatch);
-
-void KeyDownCallback(Widget w, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch);
-void KeyUpCallback(Widget w, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch);
-
-void ButtonPressReleaseCallback(Widget w, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch);
-void PointerMotionCallback(Widget w, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch);
-
-void TimeOutCallback(XtPointer closure, XtIntervalId *id);
-*/
-
-GPU_Engine::GPU_Engine(char *customLoadingAnimationURL,
- int foregroundColor, int backgroundColor, int frameRate) :
- GPC_Engine(customLoadingAnimationURL, foregroundColor, backgroundColor,
- frameRate), m_timerTimeOutMsecs(10)
-{
-}
-
-
-GPU_Engine::~GPU_Engine()
-{
-}
-
-/*
-bool GPU_Engine::Initialize(Display *display, Window window, int width, int height)
-{
- SND_DeviceManager::Subscribe();
- m_audiodevice = SND_DeviceManager::Instance();
-
- m_keyboarddev = new GPU_KeyboardDevice();
- m_mousedev = new GPC_MouseDevice();
-
- // constructor only initializes data
- // m_canvas = new GPU_Canvas(display, window, width, height);
- //m_canvas->Init(); // create the actual visual and rendering context
- //cout << "GPU_Canvas created and initialized, m_canvas " << m_canvas << endl;
- //AddEventHandlers(); // done here (in GPU_Engine) since the event handlers need access to 'this', ie the engine
-
- // put the Blender logo in the topleft corner
- if(m_BlenderLogo != 0)
- // adding a banner automatically enables them
- m_BlenderLogoId = m_canvas->AddBanner(m_BlenderLogo->Width(), m_BlenderLogo->Height(),
- m_BlenderLogo->Width(), m_BlenderLogo->Height(),
- m_BlenderLogo->Data(), GPC_Canvas::alignTopLeft);
-
- // put the Blender3D logo in the bottom right corner
- if(m_Blender3DLogo != 0)
- // adding a banner automatically enables them
- m_Blender3DLogoId = m_canvas->AddBanner(m_Blender3DLogo->Width(), m_Blender3DLogo->Height(),
- m_Blender3DLogo->Width(), m_Blender3DLogo->Height(),
- m_Blender3DLogo->Data(), GPC_Canvas::alignTopLeft);
-
-#if 0
- // put the NaN logo in the bottom right corner
- if(m_NaNLogo != 0)
- // adding a banner automatically enables them
- m_NaNLogoId = m_canvas->AddBanner(m_NaNLogo->Width(), m_NaNLogo->Height(),
- m_NaNLogo->Width(), m_NaNLogo->Height(),
- m_NaNLogo->Data(), GPC_Canvas::alignBottomRight);
-#endif
- // enable the display of all banners
- m_canvas->SetBannerDisplayEnabled(true);
-
- m_rendertools = new GPC_RenderTools();
-
- m_networkdev = new NG_LoopBackNetworkDeviceInterface();
- assert(m_networkdev);
-
- // creation of system needs 'current rendering context', this is taken care
- // of by the GPU_Canvas::Init()
- m_system = new GPU_System();
-
- m_system->SetKeyboardDevice((GPU_KeyboardDevice *)m_keyboarddev);
- m_system->SetMouseDevice(m_mousedev);
- m_system->SetNetworkDevice(m_networkdev);
-
- m_initialized = true;
-
- return m_initialized;
-}
-*/
-
-/*
-void GPU_Engine::HandleNewWindow(Window window)
-{
- // everything only if it's really a new window
- if(window != ((GPU_Canvas *)m_canvas)->GetWindow())
- {
- cout << "GPU_Engine::HandleNewWindow(), new window so calling SetNewWindowMakeNewWidgetAndMakeCurrent()" << endl;
- // We don't have to remove the event handlers ourselves, they are destroyed by X11
-
- // make canvas aware of new window, and make it current
- ((GPU_Canvas *)m_canvas)->SetNewWindowMakeNewWidgetAndMakeCurrent(window);
-
- // and add event handlers to new widget
- AddEventHandlers();
- cout << "GPU_Engine::HandleNewWindow(), event handlers added" << endl;
- }
-}
-*/
-/*
-void GPU_Engine::AddEventHandlers(void)
-{
- Widget widget = ((GPU_Canvas *)m_canvas)->GetWidget();
-
- // redraw
- // MUST be the *Raw* event handler, the normal one doesn't work!
- XtAddRawEventHandler(widget, ExposureMask, FALSE, RedrawCallback, this);
-#if 0
- // key down
- XtAddRawEventHandler(widget, KeyPressMask, FALSE, KeyDownCallback, this);
- // key up
- XtAddRawEventHandler(widget, KeyReleaseMask, FALSE, KeyUpCallback, this);
-
- // mouse button press
- XtAddRawEventHandler(widget, ButtonPressMask, FALSE, ButtonPressReleaseCallback, this);
- // mouse button release
- XtAddRawEventHandler(widget, ButtonReleaseMask, FALSE, ButtonPressReleaseCallback, this);
- // mouse motion
- XtAddRawEventHandler(widget, PointerMotionMask, FALSE, PointerMotionCallback, this);
-#endif
-#if 0
- // time out, not a real timer. New time out will be set in callback
- m_timerId = XtAppAddTimeOut(XtWidgetToApplicationContext(widget),
- m_timerTimeOutMsecs, TimeOutCallback, this);
-#endif
-}
-*/
-
-void Redraw(GPU_Engine *engine)
-{
-/* if(engine->Running())
- {
- if(engine->Loading())
- {
- engine->UpdateLoadingAnimation();
- }
-
- engine->m_system->DoMainLoopCallback();
- }*/
-}
-
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++
- * Callback functions
- +++++++++++++++++++++++++++++++++++++++++++++++++*/
-void RedrawCallback(Widget, XtPointer closure, XEvent *, Boolean *continue_to_dispatch)
-{
- GPU_Engine *engine = (GPU_Engine *)closure;
-
- Redraw(engine);
-
- *continue_to_dispatch = True;
-}
-
-
-void KeyDownCallback(Widget, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch)
-{
-/* GPU_Engine *engine = (GPU_Engine *)closure;
- XKeyEvent *keyEvent = (XKeyEvent *)event;
-
- if(engine->Running())
- engine->m_system->AddKey(int(keyEvent->keycode), 1);
-
- *continue_to_dispatch = True;*/
-}
-
-
-void KeyUpCallback(Widget, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch)
-{
-/* GPU_Engine *engine = (GPU_Engine *)closure;
- XKeyEvent *keyEvent = (XKeyEvent *)event;
-
- if(engine->Running())
- engine->m_system->AddKey(int(keyEvent->keycode), 0);
-
- *continue_to_dispatch = True;*/
-}
-
-
-void ButtonPressReleaseCallback(Widget, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch)
-{
- GPU_Engine *engine = (GPU_Engine *)closure;
- XButtonEvent *buttonEvent = (XButtonEvent *)event;
- bool isDown;
- GPC_MouseDevice::TButtonId button;
-
- if(engine->Running())
- {
- // determine type of event, press or release
- isDown = false;
- if(buttonEvent->type == ButtonPress)
- isDown = true;
- // determine which button exactly generated this event
- switch(buttonEvent->button)
- {
- case 1:
- button = GPC_MouseDevice::buttonLeft;
- break;
- case 2:
- button = GPC_MouseDevice::buttonMiddle;
- break;
- case 3:
- button = GPC_MouseDevice::buttonRight;
- break;
- }
- engine->m_mousedev->ConvertButtonEvent(button,
- isDown, buttonEvent->x, buttonEvent->y);
- }
-
- *continue_to_dispatch = True;
-}
-
-
-void PointerMotionCallback(Widget w, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch)
-{
- GPU_Engine *engine = (GPU_Engine *)closure;
- XButtonEvent *buttonEvent = (XButtonEvent *)event;
-
- if(engine->Running())
- {
- engine->m_mousedev->ConvertMoveEvent(buttonEvent->x, buttonEvent->y);
- }
-
- *continue_to_dispatch = True;
-}
-
-/*
-void TimeOutCallback(XtPointer closure, XtIntervalId *id)
-{
- GPU_Engine *engine = (GPU_Engine *)closure;
-
- Redraw(engine);
- // add a new time out since there is no real timer for X (not a simple one like under windows)
- // TODO Have to get faster timer !
-
- if(engine->Running())
- engine->m_timerId = XtAppAddTimeOut(XtWidgetToApplicationContext(
- ((GPU_Canvas *)engine->m_canvas)->GetWidget()),
- engine->m_timerTimeOutMsecs, TimeOutCallback,
- closure);
-}
-
-*/
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_Engine.h b/source/gameengine/GamePlayer/common/unix/GPU_Engine.h
deleted file mode 100644
index 12fb70c84ef..00000000000
--- a/source/gameengine/GamePlayer/common/unix/GPU_Engine.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#ifndef __GPU_ENGINE_H
-#define __GPU_ENGINE_H
-
-#include <X11/Xlib.h>
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-
-#define Object DNA_Object // tricky stuff !!! but without it, it doesn't compile...
-
-#include "GPC_Engine.h"
-
-
-class GPU_Engine : public GPC_Engine
-{
-public:
- XtIntervalId m_timerId;
- unsigned long m_timerTimeOutMsecs;
-
-public:
- GPU_Engine(char *customLoadingAnimation,
- int foregroundColor, int backgroundColor, int frameRate);
- virtual ~GPU_Engine();
- bool Initialize(Display *display, Window window, int width, int height);
-
- void HandleNewWindow(Window window);
-
-private:
- void AddEventHandlers();
-};
-
-#endif // __GPU_ENGINE_H
-
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.cpp b/source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.cpp
deleted file mode 100644
index 5444cf22ac9..00000000000
--- a/source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-#include "GPU_KeyboardDevice.h"
-
-void GPU_KeyboardDevice::register_X_key_down_event(KeySym k)
-{
- ConvertEvent(k, 1);
-}
-
-void GPU_KeyboardDevice::register_X_key_up_event(KeySym k)
-{
- ConvertEvent(k, 0);
-}
-
-
-#define map_x_key_to_kx_key(x,y) m_reverseKeyTranslateTable[x] = y;
-
-GPU_KeyboardDevice::GPU_KeyboardDevice(void)
-{
- unsigned int i = 0;
-
- // Needed?
- m_reverseKeyTranslateTable.clear();
-
- for (i = XK_A; i< XK_Z; i++) {
- m_reverseKeyTranslateTable[i]
- = (SCA_IInputDevice::KX_EnumInputs)
- (((unsigned int)SCA_IInputDevice::KX_AKEY) + i - XK_A);
- }
-
- // Shifted versions: should not occur: KX doesn't distinguish
- for (i = XK_a; i< XK_z; i++) {
- m_reverseKeyTranslateTable[i]
- = (SCA_IInputDevice::KX_EnumInputs)
- (((int)SCA_IInputDevice::KX_AKEY) + i - XK_a);
- }
-
- for (i = XK_0; i< XK_9; i++) {
- m_reverseKeyTranslateTable[i]
- = (SCA_IInputDevice::KX_EnumInputs)
- (((int)SCA_IInputDevice::KX_ZEROKEY) + i - XK_0);
- }
-
- for (i = XK_F1; i< XK_F19; i++) {
- m_reverseKeyTranslateTable[i]
- = (SCA_IInputDevice::KX_EnumInputs)
- (((int)SCA_IInputDevice::KX_F1KEY) + i - XK_F1);
- }
-
- // the remainder:
- map_x_key_to_kx_key(XK_BackSpace, SCA_IInputDevice::KX_BACKSPACEKEY);
- map_x_key_to_kx_key(XK_Tab, SCA_IInputDevice::KX_TABKEY);
- map_x_key_to_kx_key(XK_Return, SCA_IInputDevice::KX_RETKEY);
- map_x_key_to_kx_key(XK_Escape, SCA_IInputDevice::KX_ESCKEY);
- map_x_key_to_kx_key(XK_space, SCA_IInputDevice::KX_SPACEKEY);
-
- map_x_key_to_kx_key(XK_Shift_L, SCA_IInputDevice::KX_LEFTSHIFTKEY);
- map_x_key_to_kx_key(XK_Shift_R, SCA_IInputDevice::KX_RIGHTSHIFTKEY);
- map_x_key_to_kx_key(XK_Control_L, SCA_IInputDevice::KX_LEFTCTRLKEY);
- map_x_key_to_kx_key(XK_Control_R, SCA_IInputDevice::KX_RIGHTCTRLKEY);
- map_x_key_to_kx_key(XK_Alt_L, SCA_IInputDevice::KX_LEFTALTKEY);
- map_x_key_to_kx_key(XK_Alt_R, SCA_IInputDevice::KX_RIGHTALTKEY);
-
- map_x_key_to_kx_key(XK_Insert, SCA_IInputDevice::KX_INSERTKEY);
- map_x_key_to_kx_key(XK_Delete, SCA_IInputDevice::KX_DELKEY);
- map_x_key_to_kx_key(XK_Home, SCA_IInputDevice::KX_HOMEKEY);
- map_x_key_to_kx_key(XK_End, SCA_IInputDevice::KX_ENDKEY);
- map_x_key_to_kx_key(XK_Page_Up, SCA_IInputDevice::KX_PAGEUPKEY);
- map_x_key_to_kx_key(XK_Page_Down, SCA_IInputDevice::KX_PAGEDOWNKEY);
-
- map_x_key_to_kx_key(XK_Left, SCA_IInputDevice::KX_LEFTARROWKEY);
- map_x_key_to_kx_key(XK_Right, SCA_IInputDevice::KX_RIGHTARROWKEY);
- map_x_key_to_kx_key(XK_Up, SCA_IInputDevice::KX_UPARROWKEY);
- map_x_key_to_kx_key(XK_Down, SCA_IInputDevice::KX_DOWNARROWKEY);
-
- map_x_key_to_kx_key(XK_KP_0, SCA_IInputDevice::KX_PAD0);
- map_x_key_to_kx_key(XK_KP_1, SCA_IInputDevice::KX_PAD1);
- map_x_key_to_kx_key(XK_KP_2, SCA_IInputDevice::KX_PAD2);
- map_x_key_to_kx_key(XK_KP_3, SCA_IInputDevice::KX_PAD3);
- map_x_key_to_kx_key(XK_KP_4, SCA_IInputDevice::KX_PAD4);
- map_x_key_to_kx_key(XK_KP_5, SCA_IInputDevice::KX_PAD5);
- map_x_key_to_kx_key(XK_KP_6, SCA_IInputDevice::KX_PAD6);
- map_x_key_to_kx_key(XK_KP_7, SCA_IInputDevice::KX_PAD7);
- map_x_key_to_kx_key(XK_KP_8, SCA_IInputDevice::KX_PAD8);
- map_x_key_to_kx_key(XK_KP_9, SCA_IInputDevice::KX_PAD9);
- map_x_key_to_kx_key(XK_KP_Decimal, SCA_IInputDevice::KX_PADPERIOD);
-
- map_x_key_to_kx_key(XK_KP_Insert, SCA_IInputDevice::KX_INSERTKEY);
- map_x_key_to_kx_key(XK_KP_End, SCA_IInputDevice::KX_ENDKEY);
- map_x_key_to_kx_key(XK_KP_Down, SCA_IInputDevice::KX_DOWNARROWKEY);
- map_x_key_to_kx_key(XK_KP_Page_Down,SCA_IInputDevice::KX_PAGEDOWNKEY);
- map_x_key_to_kx_key(XK_KP_Left, SCA_IInputDevice::KX_LEFTARROWKEY);
- map_x_key_to_kx_key(XK_KP_Right, SCA_IInputDevice::KX_RIGHTARROWKEY);
- map_x_key_to_kx_key(XK_KP_Home, SCA_IInputDevice::KX_HOMEKEY);
- map_x_key_to_kx_key(XK_KP_Up, SCA_IInputDevice::KX_UPARROWKEY);
- map_x_key_to_kx_key(XK_KP_Page_Up, SCA_IInputDevice::KX_PAGEUPKEY);
- map_x_key_to_kx_key(XK_KP_Delete, SCA_IInputDevice::KX_DELKEY);
-
- map_x_key_to_kx_key(XK_KP_Enter, SCA_IInputDevice::KX_PADENTER);
- map_x_key_to_kx_key(XK_KP_Add, SCA_IInputDevice::KX_PADPLUSKEY);
- map_x_key_to_kx_key(XK_KP_Subtract, SCA_IInputDevice::KX_PADMINUS);
- map_x_key_to_kx_key(XK_KP_Multiply, SCA_IInputDevice::KX_PADASTERKEY);
- map_x_key_to_kx_key(XK_KP_Divide, SCA_IInputDevice::KX_PADSLASHKEY);
-
- map_x_key_to_kx_key(XK_Caps_Lock, SCA_IInputDevice::KX_CAPSLOCKKEY);
-
-}
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.h b/source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.h
deleted file mode 100644
index e4ff20c7159..00000000000
--- a/source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#ifndef __GPU_KEYBOARDDEVICE_H
-#define __GPU_KEYBOARDDEVICE_H
-
-#include <X11/keysym.h>
-#include <X11/X.h> // Brilliant name, eh? Stupid !@#!$!@#@@% This is
- // actually needed so as not to get name clashes between Object from
- // blender and Object from X11... The proper include would be
- // Intrinsic.h . Yes, we are a bunch of sado-masochists. Let's hurt
- // ourselves!
-
-#include "GPC_KeyboardDevice.h"
-
-class GPU_KeyboardDevice : public GPC_KeyboardDevice
-{
-public:
-
- void register_X_key_down_event(KeySym k);
- void register_X_key_up_event(KeySym k);
-
- GPU_KeyboardDevice(void);
- virtual ~GPU_KeyboardDevice()
- {
- /* intentionally empty */
- }
-
- private:
- SCA_IInputDevice::KX_EnumInputs
- convert_x_keycode_to_kx_keycode(unsigned int key);
-};
-
-#endif // _GPU_KEYBOARDDEVICE_H
-
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_PolygonMaterial.h b/source/gameengine/GamePlayer/common/unix/GPU_PolygonMaterial.h
deleted file mode 100644
index 66c8f830ad8..00000000000
--- a/source/gameengine/GamePlayer/common/unix/GPU_PolygonMaterial.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#ifndef __GPU_POLYGONMATERIAL_H
-#define __GPU_POLYGONMATERIAL_H
-
-#include "BP_PolygonMaterial.h"
-
-class GPU_PolygonMaterial : public BP_PolygonMaterial
-{
-public:
- GPUPolygonMaterial(const STR_String& texname, bool ba,const STR_String& matname,
- int tile, int tileXrep, int tileYrep, int mode, int transparant,
- int lightlayer,,void* tpage) :
- BP_PolygonMaterial(texname, ba,matname, tile, tileXrep, tileYrep,
- mode, transparant, lightlayer),
- m_tface(tpage)
- {
- }
-
- virtual ~GPU_PolygonMaterial()
- {
- }
-};
-
-#endif // __GPU_POLYGONMATERIAL_H
-
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_System.cpp b/source/gameengine/GamePlayer/common/unix/GPU_System.cpp
deleted file mode 100644
index 8085ecb4380..00000000000
--- a/source/gameengine/GamePlayer/common/unix/GPU_System.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <sys/time.h>
-#include "GPU_System.h"
-
-static struct timeval startTime;
-static int startTimeDone = 0;
-
-
-double GPU_System::GetTimeInSeconds()
-{
- if(!startTimeDone)
- {
- gettimeofday(&startTime, NULL);
- startTimeDone = 1;
- }
-
- struct timeval now;
- gettimeofday(&now, NULL);
- // next '1000' are used for precision
- long ticks = (now.tv_sec - startTime.tv_sec) * 1000 + (now.tv_usec - startTime.tv_usec) / 1000;
- double secs = (double)ticks / 1000.0;
- return secs;
-}
diff --git a/source/gameengine/GamePlayer/common/unix/Makefile b/source/gameengine/GamePlayer/common/unix/Makefile
deleted file mode 100644
index db29a087b28..00000000000
--- a/source/gameengine/GamePlayer/common/unix/Makefile
+++ /dev/null
@@ -1,70 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = unix
-DIR = $(OCGDIR)/gameengine/GamePlayer/common/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_STRING)/include
-
-CPPFLAGS += -I..
-CPPFLAGS += -I../../netscape/src/ketsji
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-
-# Game Engine
-CPPFLAGS += -I../../../../gameengine/Converter
-CPPFLAGS += -I../../../../gameengine/Expressions
-CPPFLAGS += -I../../../../gameengine/GameLogic
-CPPFLAGS += -I../../../../gameengine/Ketsji
-CPPFLAGS += -I../../../../gameengine/Ketsji/KXNetwork
-CPPFLAGS += -I../../../../gameengine/Network
-CPPFLAGS += -I../../../../gameengine/Network/LoopBackNetwork
-CPPFLAGS += -I../../../../gameengine/Rasterizer
-CPPFLAGS += -I../../../../gameengine/Rasterizer/RAS_OpenGLRasterizer
-CPPFLAGS += -I../../../../gameengine/SceneGraph
-
-CPPFLAGS += -I$(NAN_MOTO)/include
-
-# Blender stuff
-CPPFLAGS += -I../../../../blender/blenkernel
-CPPFLAGS += -I../../../../blender/blenlib
-CPPFLAGS += -I../../../../blender/blenloader
-CPPFLAGS += -I../../../../blender/imbuf
-CPPFLAGS += -I../../../../blender/makesdna
-CPPFLAGS += -I../../../../kernel/gen_system
-
-CPPFLAGS += -I../../kernel/gen_system
-
diff --git a/source/gameengine/GamePlayer/common/windows/GPW_Canvas.cpp b/source/gameengine/GamePlayer/common/windows/GPW_Canvas.cpp
deleted file mode 100644
index 44437820bd2..00000000000
--- a/source/gameengine/GamePlayer/common/windows/GPW_Canvas.cpp
+++ /dev/null
@@ -1,171 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include "GPW_Canvas.h"
-
-GPW_Canvas::GPW_Canvas(HWND hWnd, HDC hDC, int width, int height)
- : GPC_Canvas(width, height), m_hWnd(hWnd), m_hRC(0), m_hDC(hDC)
-{
-}
-
-
-GPW_Canvas::~GPW_Canvas()
-{
- if (m_hRC) {
- ::wglDeleteContext(m_hRC);
- }
- //if (m_hDC) {
- // ::ReleaseDC(m_hWnd, m_hDC);
- //}
-}
-
-
-void GPW_Canvas::Init()
-{
-
-// log_entry("GPW_Canvas::Init");
-
- /*
- * Color and depth bit values are not to be trusted.
- * For instance, on TNT2:
- * When the screen color depth is set to 16 bit, we get 5 color bits
- * and 16 depth bits.
- * When the screen color depth is set to 32 bit, we get 8 color bits
- * and 24 depth bits.
- * Just to be safe, we request high quality settings.
- */
- PIXELFORMATDESCRIPTOR pfd =
- {
- sizeof(PIXELFORMATDESCRIPTOR), // iSize
- 1, // iVersion
- PFD_DRAW_TO_WINDOW |
- PFD_SUPPORT_OPENGL |
-// PFD_STEREO |
- PFD_DOUBLEBUFFER, // dwFlags
- PFD_TYPE_RGBA, // iPixelType
- 32, // cColorBits
- 0, 0, // cRedBits, cRedShift (ignored)
- 0, 0, // cGreenBits, cGreenShift (ignored)
- 0, 0, // cBlueBits, cBlueShift (ignored)
- 0, 0, // cAlphaBits, cAlphaShift (ignored)
- 0, 0, 0, 0, 0, // cAccum_X_Bits
- 32, // cDepthBits
- 0, // cStencilBits
- 0, // cAuxBuffers
- PFD_MAIN_PLANE, // iLayerType
- 0, // bReserved
- 0, // dwLayerMask
- 0, // dwVisibleMask
- 0 // dwDamageMask
- };
- PIXELFORMATDESCRIPTOR match;
-
- // Look what we get back for this pixel format
- int pixelFormat = ::ChoosePixelFormat(m_hDC, &pfd);
- if (!pixelFormat) {
- DWORD error = ::GetLastError();
- }
- ::DescribePixelFormat(m_hDC, pixelFormat, sizeof(match), &match);
-
- // Activate the pixel format for this context
- ::SetPixelFormat(m_hDC, ::ChoosePixelFormat(m_hDC, &match), &match);
-
- // Create the OpenGL context and make it current
- m_hRC = ::wglCreateContext(m_hDC);
- ::wglMakeCurrent(m_hDC, m_hRC);
-
-}
-
-void GPW_Canvas::SetMousePosition(int x, int y)
-{
- POINT point = { x, y };
- if (m_hWnd)
- {
- ::ClientToScreen(m_hWnd, &point);
- ::SetCursorPos(point.x, point.y);
- }
-}
-
-
-void GPW_Canvas::SetMouseState(RAS_MouseState mousestate)
-{
- LPCSTR id;
- switch (mousestate)
- {
- case MOUSE_INVISIBLE:
- HideCursor();
- break;
- case MOUSE_WAIT:
- ::SetCursor(::LoadCursor(0, IDC_WAIT));
- ShowCursor();
- break;
- case MOUSE_NORMAL:
- ::SetCursor(::LoadCursor(0, IDC_ARROW));
- ShowCursor();
- break;
- }
-}
-
-
-bool GPW_Canvas::BeginDraw(void)
-{
- ::wglMakeCurrent(m_hDC, m_hRC);
- // check errors, anyone?
- return true;
-}
-
-
-void GPW_Canvas::EndDraw(void)
-{
- ::wglMakeCurrent(NULL, NULL);
-}
-
-void GPW_Canvas::SwapBuffers(void)
-{
- if (m_hDC) {
- ::SwapBuffers(m_hDC);
- }
-}
-
-
-void GPW_Canvas::HideCursor(void)
-{
- int count = ::ShowCursor(FALSE);
- while (count >= 0)
- {
- count = ::ShowCursor(FALSE);
- }
-}
-
-
-void GPW_Canvas::ShowCursor(void)
-{
- ::ShowCursor(TRUE);
-}
-
diff --git a/source/gameengine/GamePlayer/common/windows/GPW_Canvas.h b/source/gameengine/GamePlayer/common/windows/GPW_Canvas.h
deleted file mode 100644
index f43be233ee2..00000000000
--- a/source/gameengine/GamePlayer/common/windows/GPW_Canvas.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#ifndef _GPW_CANVAS_H_
-#define _GPW_CANVAS_H_
-
-#ifdef WIN32
-#pragma warning (disable:4786) // suppress stl-MSVC debug info warning
-#endif
-
-#include <iostream>
-#include <windows.h>
-//#include <gl/gl.h>
-
-#include "GPC_Canvas.h"
-
-
-class GPW_Canvas : public GPC_Canvas
-{
-protected:
- /** The window handle. */
- HWND m_hWnd;
- /** Rendering context. */
- HGLRC m_hRC;
- /** Device Context. */
- HDC m_hDC;
-
-public:
- /**
- * Constructor.
- */
- GPW_Canvas(HWND hWnd, HDC hDC, int width, int height);
-
- /**
- * Destructor.
- */
- virtual ~GPW_Canvas(void);
-
- virtual void Init(void);
-
- /**
- * Moves the cursor to a new location.
- * @param x The x-coordinate of the new location.
- * @param x The y-coordinate of the new location.
- */
- virtual void SetMousePosition(int x, int y);
-
- /**
- * Sets the cursor shape and/or visibility.
- * @param mousestate The new state ofthe cursor.
- */
- virtual void SetMouseState(RAS_MouseState mousestate);
-
- bool BeginDraw(void);
- void EndDraw(void);
-
- virtual void SwapBuffers(void);
-
- virtual HDC GetHDC(void)
- {
- return m_hDC;
- }
-
- virtual void SetHDC(HDC hDC)
- {
- if (hDC != m_hDC) {
- m_hDC = hDC;
- }
- }
-
- virtual HGLRC GetHGLRC(void)
- {
- return m_hRC;
- }
-
-protected:
- /**
- * Hides the mouse cursor.
- */
- void HideCursor(void);
-
- /**
- * Shows the mouse cursor.
- */
- void ShowCursor(void);
-};
-
-#endif // _GPW_CANVAS_H_
-
diff --git a/source/gameengine/GamePlayer/common/windows/GPW_Engine.cpp b/source/gameengine/GamePlayer/common/windows/GPW_Engine.cpp
deleted file mode 100644
index f5e9f2e767c..00000000000
--- a/source/gameengine/GamePlayer/common/windows/GPW_Engine.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#pragma warning (disable : 4786)
-
-#include <assert.h>
-
-#include "GPC_MouseDevice.h"
-#include "GPC_RenderTools.h"
-#include "GPC_RawImage.h"
-
-#include "GPW_Canvas.h"
-#include "GPW_Engine.h"
-#include "GPW_KeyboardDevice.h"
-#include "GPW_System.h"
-
-
-#include "NG_NetworkScene.h"
-#include "NG_LoopBackNetworkDeviceInterface.h"
-
-GPW_Engine::GPW_Engine(char *customLoadingAnimationURL,
- int foregroundColor, int backgroundColor, int frameRate) :
- GPC_Engine(customLoadingAnimationURL, foregroundColor, backgroundColor,
- frameRate)
-{
-}
-
-
-GPW_Engine::~GPW_Engine()
-{
-}
-
-
-bool GPW_Engine::Initialize(HDC hdc, int width, int height)
-{
- m_keyboarddev = new GPW_KeyboardDevice();
- m_mousedev = new GPC_MouseDevice();
-
- // constructor only initializes data
- m_canvas = new GPW_Canvas(0, hdc, width, height);
- m_canvas->Init(); // create the actual visual and rendering context
-
- // put the Blender logo in the topleft corner
- if(m_BlenderLogo != 0)
- // adding a banner automatically enables them
- m_BlenderLogoId = m_canvas->AddBanner(m_BlenderLogo->Width(), m_BlenderLogo->Height(),
- m_BlenderLogo->Width(), m_BlenderLogo->Height(),
- m_BlenderLogo->Data(), GPC_Canvas::alignTopLeft);
-
- // put the Blender3D logo in the bottom right corner
- if(m_Blender3DLogo != 0)
- // adding a banner automatically enables them
- m_Blender3DLogoId = m_canvas->AddBanner(m_Blender3DLogo->Width(), m_Blender3DLogo->Height(),
- m_Blender3DLogo->Width(), m_Blender3DLogo->Height(),
- m_Blender3DLogo->Data(), GPC_Canvas::alignBottomRight);
-#if 0
- // put the NaN logo in the bottom right corner
- if(m_NaNLogo != 0)
- // adding a banner automatically enables them
- m_NaNLogoId = m_canvas->AddBanner(m_NaNLogo->Width(), m_NaNLogo->Height(),
- m_NaNLogo->Width(), m_NaNLogo->Height(),
- m_NaNLogo->Data(), GPC_Canvas::alignBottomRight);
-#endif
- // enable the display of all banners
- m_canvas->SetBannerDisplayEnabled(true);
-
- // stuff that must be done after creation of a rendering context
- //m_canvas->InitPostRenderingContext();
-
- m_rendertools = new GPC_RenderTools();
-
- m_networkdev = new NG_LoopBackNetworkDeviceInterface();
- assert(m_networkdev);
-
- // creation of system needs 'current rendering context', this is taken care
- // of by the GPW_Canvas
- m_system = new GPW_System();
-
-// m_system->SetKeyboardDevice((GPW_KeyboardDevice *)m_keyboarddev);
-// m_system->SetMouseDevice(m_mousedev);
-// m_system->SetNetworkDevice(m_networkdev);
-
- m_initialized = true;
-
- return m_initialized;
-}
diff --git a/source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.cpp b/source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.cpp
deleted file mode 100644
index 7e8a50915c8..00000000000
--- a/source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.cpp
+++ /dev/null
@@ -1,283 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include "GPW_KeyboardDevice.h"
-
-// Key code values not found in winuser.h
-#ifndef VK_MINUS
-#define VK_MINUS 0xBD
-#endif // VK_MINUS
-#ifndef VK_SEMICOLON
-#define VK_SEMICOLON 0xBA
-#endif // VK_SEMICOLON
-#ifndef VK_PERIOD
-#define VK_PERIOD 0xBE
-#endif // VK_PERIOD
-#ifndef VK_COMMA
-#define VK_COMMA 0xBC
-#endif // VK_COMMA
-#ifndef VK_QUOTE
-#define VK_QUOTE 0xDE
-#endif // VK_QUOTE
-#ifndef VK_BACK_QUOTE
-#define VK_BACK_QUOTE 0xC0
-#endif // VK_BACK_QUOTE
-#ifndef VK_SLASH
-#define VK_SLASH 0xBF
-#endif // VK_SLASH
-#ifndef VK_BACK_SLASH
-#define VK_BACK_SLASH 0xDC
-#endif // VK_BACK_SLASH
-#ifndef VK_EQUALS
-#define VK_EQUALS 0xBB
-#endif // VK_EQUALS
-#ifndef VK_OPEN_BRACKET
-#define VK_OPEN_BRACKET 0xDB
-#endif // VK_OPEN_BRACKET
-#ifndef VK_CLOSE_BRACKET
-#define VK_CLOSE_BRACKET 0xDD
-#endif // VK_CLOSE_BRACKET
-
-
-
-GPW_KeyboardDevice::GPW_KeyboardDevice(void)
-{
- m_separateLeftRight = false;
- m_separateLeftRightInitialized = false;
-
- m_reverseKeyTranslateTable['A' ] = KX_AKEY ;
- m_reverseKeyTranslateTable['B' ] = KX_BKEY ;
- m_reverseKeyTranslateTable['C' ] = KX_CKEY ;
- m_reverseKeyTranslateTable['D' ] = KX_DKEY ;
- m_reverseKeyTranslateTable['E' ] = KX_EKEY ;
- m_reverseKeyTranslateTable['F' ] = KX_FKEY ;
- m_reverseKeyTranslateTable['G' ] = KX_GKEY ;
- m_reverseKeyTranslateTable['H' ] = KX_HKEY ;
- m_reverseKeyTranslateTable['I' ] = KX_IKEY ;
- m_reverseKeyTranslateTable['J' ] = KX_JKEY ;
- m_reverseKeyTranslateTable['K' ] = KX_KKEY ;
- m_reverseKeyTranslateTable['L' ] = KX_LKEY ;
- m_reverseKeyTranslateTable['M' ] = KX_MKEY ;
- m_reverseKeyTranslateTable['N' ] = KX_NKEY ;
- m_reverseKeyTranslateTable['O' ] = KX_OKEY ;
- m_reverseKeyTranslateTable['P' ] = KX_PKEY ;
- m_reverseKeyTranslateTable['Q' ] = KX_QKEY ;
- m_reverseKeyTranslateTable['R' ] = KX_RKEY ;
- m_reverseKeyTranslateTable['S' ] = KX_SKEY ;
- m_reverseKeyTranslateTable['T' ] = KX_TKEY ;
- m_reverseKeyTranslateTable['U' ] = KX_UKEY ;
- m_reverseKeyTranslateTable['V' ] = KX_VKEY ;
- m_reverseKeyTranslateTable['W' ] = KX_WKEY ;
- m_reverseKeyTranslateTable['X' ] = KX_XKEY ;
- m_reverseKeyTranslateTable['Y' ] = KX_YKEY ;
- m_reverseKeyTranslateTable['Z' ] = KX_ZKEY ;
-
- m_reverseKeyTranslateTable['0' ] = KX_ZEROKEY ;
- m_reverseKeyTranslateTable['1' ] = KX_ONEKEY ;
- m_reverseKeyTranslateTable['2' ] = KX_TWOKEY ;
- m_reverseKeyTranslateTable['3' ] = KX_THREEKEY ;
- m_reverseKeyTranslateTable['4' ] = KX_FOURKEY ;
- m_reverseKeyTranslateTable['5' ] = KX_FIVEKEY ;
- m_reverseKeyTranslateTable['6' ] = KX_SIXKEY ;
- m_reverseKeyTranslateTable['7' ] = KX_SEVENKEY ;
- m_reverseKeyTranslateTable['8' ] = KX_EIGHTKEY ;
- m_reverseKeyTranslateTable['9' ] = KX_NINEKEY ;
-
- // Middle keyboard area keys
- m_reverseKeyTranslateTable[VK_PAUSE ] = KX_PAUSEKEY ;
- m_reverseKeyTranslateTable[VK_INSERT ] = KX_INSERTKEY ;
- m_reverseKeyTranslateTable[VK_DELETE ] = KX_DELKEY ;
- m_reverseKeyTranslateTable[VK_HOME ] = KX_HOMEKEY ;
- m_reverseKeyTranslateTable[VK_END ] = KX_ENDKEY ;
- m_reverseKeyTranslateTable[VK_PRIOR ] = KX_PAGEUPKEY ;
- m_reverseKeyTranslateTable[VK_NEXT ] = KX_PAGEDOWNKEY ;
-
- // Arrow keys
- m_reverseKeyTranslateTable[VK_UP ] = KX_UPARROWKEY ;
- m_reverseKeyTranslateTable[VK_DOWN ] = KX_DOWNARROWKEY ;
- m_reverseKeyTranslateTable[VK_LEFT ] = KX_LEFTARROWKEY ;
- m_reverseKeyTranslateTable[VK_RIGHT ] = KX_RIGHTARROWKEY ;
-
- // Function keys
- m_reverseKeyTranslateTable[VK_F1 ] = KX_F1KEY ;
- m_reverseKeyTranslateTable[VK_F2 ] = KX_F2KEY ;
- m_reverseKeyTranslateTable[VK_F3 ] = KX_F3KEY ;
- m_reverseKeyTranslateTable[VK_F4 ] = KX_F4KEY ;
- m_reverseKeyTranslateTable[VK_F5 ] = KX_F5KEY ;
- m_reverseKeyTranslateTable[VK_F6 ] = KX_F6KEY ;
- m_reverseKeyTranslateTable[VK_F7 ] = KX_F7KEY ;
- m_reverseKeyTranslateTable[VK_F8 ] = KX_F8KEY ;
- m_reverseKeyTranslateTable[VK_F9 ] = KX_F9KEY ;
- m_reverseKeyTranslateTable[VK_F10 ] = KX_F10KEY ;
- m_reverseKeyTranslateTable[VK_F11 ] = KX_F11KEY ;
- m_reverseKeyTranslateTable[VK_F12 ] = KX_F12KEY ;
- m_reverseKeyTranslateTable[VK_F13 ] = KX_F13KEY ;
- m_reverseKeyTranslateTable[VK_F14 ] = KX_F14KEY ;
- m_reverseKeyTranslateTable[VK_F15 ] = KX_F15KEY ;
- m_reverseKeyTranslateTable[VK_F16 ] = KX_F16KEY ;
- m_reverseKeyTranslateTable[VK_F17 ] = KX_F17KEY ;
- m_reverseKeyTranslateTable[VK_F18 ] = KX_F18KEY ;
- m_reverseKeyTranslateTable[VK_F19 ] = KX_F19KEY ;
-
- // Numpad keys
- m_reverseKeyTranslateTable[VK_NUMPAD0 ] = KX_PAD0 ;
- m_reverseKeyTranslateTable[VK_NUMPAD1 ] = KX_PAD1 ;
- m_reverseKeyTranslateTable[VK_NUMPAD2 ] = KX_PAD2 ;
- m_reverseKeyTranslateTable[VK_NUMPAD3 ] = KX_PAD3 ;
- m_reverseKeyTranslateTable[VK_NUMPAD4 ] = KX_PAD4 ;
- m_reverseKeyTranslateTable[VK_NUMPAD5 ] = KX_PAD5 ;
- m_reverseKeyTranslateTable[VK_NUMPAD6 ] = KX_PAD6 ;
- m_reverseKeyTranslateTable[VK_NUMPAD7 ] = KX_PAD7 ;
- m_reverseKeyTranslateTable[VK_NUMPAD8 ] = KX_PAD8 ;
- m_reverseKeyTranslateTable[VK_NUMPAD9 ] = KX_PAD9 ;
- m_reverseKeyTranslateTable[VK_MULTIPLY ] = KX_PADASTERKEY ;
- m_reverseKeyTranslateTable[VK_ADD ] = KX_PADPLUSKEY ;
- m_reverseKeyTranslateTable[VK_DECIMAL ] = KX_PADPERIOD ;
- m_reverseKeyTranslateTable[VK_SUBTRACT ] = KX_PADMINUS ;
- m_reverseKeyTranslateTable[VK_DIVIDE ] = KX_PADSLASHKEY ;
- m_reverseKeyTranslateTable[VK_SEPARATOR ] = KX_PADENTER ;
-
- // Other keys
- m_reverseKeyTranslateTable[VK_CAPITAL ] = KX_CAPSLOCKKEY ;
- m_reverseKeyTranslateTable[VK_ESCAPE ] = KX_ESCKEY ;
- m_reverseKeyTranslateTable[VK_TAB ] = KX_TABKEY ;
- //m_reverseKeyTranslateTable[VK_RETURN ] = KX_RETKEY ;
- m_reverseKeyTranslateTable[VK_SPACE ] = KX_SPACEKEY ;
- m_reverseKeyTranslateTable[VK_RETURN ] = KX_LINEFEEDKEY ;
- m_reverseKeyTranslateTable[VK_BACK ] = KX_BACKSPACEKEY ;
- m_reverseKeyTranslateTable[VK_SEMICOLON ] = KX_SEMICOLONKEY ;
- m_reverseKeyTranslateTable[VK_PERIOD ] = KX_PERIODKEY ;
- m_reverseKeyTranslateTable[VK_COMMA ] = KX_COMMAKEY ;
- m_reverseKeyTranslateTable[VK_QUOTE ] = KX_QUOTEKEY ;
- m_reverseKeyTranslateTable[VK_BACK_QUOTE ] = KX_ACCENTGRAVEKEY ;
- m_reverseKeyTranslateTable[VK_MINUS ] = KX_MINUSKEY ;
- m_reverseKeyTranslateTable[VK_SLASH ] = KX_SLASHKEY ;
- m_reverseKeyTranslateTable[VK_BACK_SLASH ] = KX_BACKSLASHKEY ;
- m_reverseKeyTranslateTable[VK_EQUALS ] = KX_EQUALKEY ;
- m_reverseKeyTranslateTable[VK_OPEN_BRACKET ] = KX_LEFTBRACKETKEY ;
- m_reverseKeyTranslateTable[VK_CLOSE_BRACKET ] = KX_RIGHTBRACKETKEY ;
-
- /*
- * Need to handle Ctrl, Alt and Shift keys differently.
- * Win32 messages do not discriminate left and right keys.
- */
- m_reverseKeyTranslateTable[VK_LCONTROL ] = KX_LEFTCTRLKEY ;
- m_reverseKeyTranslateTable[VK_RCONTROL ] = KX_RIGHTCTRLKEY ;
- m_reverseKeyTranslateTable[VK_LMENU ] = KX_LEFTALTKEY ;
- m_reverseKeyTranslateTable[VK_RMENU ] = KX_RIGHTALTKEY ;
- m_reverseKeyTranslateTable[VK_RSHIFT ] = KX_RIGHTSHIFTKEY ;
- m_reverseKeyTranslateTable[VK_LSHIFT ] = KX_LEFTSHIFTKEY ;
-}
-
-
-GPW_KeyboardDevice::~GPW_KeyboardDevice(void)
-{
-}
-
-
-void GPW_KeyboardDevice::ConvertWinEvent(WPARAM wParam, bool isDown)
-{
- if ((wParam == VK_SHIFT) || (wParam == VK_MENU) || (wParam == VK_CONTROL)) {
- ConvertModifierKey(wParam, isDown);
- }
- else {
- ConvertEvent(wParam, isDown);
- }
-}
-
-
-void GPW_KeyboardDevice::ConvertModifierKey(WPARAM wParam, bool isDown)
-{
- /*
- GetKeyState and GetAsyncKeyState only work with Win95, Win98, NT4,
- Terminal Server and Windows 2000.
- But on WinME it always returns zero. These two functions are simply
- skipped by Millenium Edition!
-
- Official explanation from Microsoft:
- Intentionally disabled.
- It didn't work all that well on some newer hardware, and worked less
- well with the passage of time, so it was fully disabled in ME.
- */
- if (!m_separateLeftRightInitialized && isDown) {
- CheckForSeperateLeftRight(wParam);
- }
- if (m_separateLeftRight) {
- bool down = HIBYTE(::GetKeyState(VK_LSHIFT)) != 0;
- ConvertEvent(VK_LSHIFT, down);
- down = HIBYTE(::GetKeyState(VK_RSHIFT)) != 0;
- ConvertEvent(VK_RSHIFT, down);
- down = HIBYTE(::GetKeyState(VK_LMENU)) != 0;
- ConvertEvent(VK_LMENU, down);
- down = HIBYTE(::GetKeyState(VK_RMENU)) != 0;
- ConvertEvent(VK_RMENU, down);
- down = HIBYTE(::GetKeyState(VK_LCONTROL)) != 0;
- ConvertEvent(VK_LCONTROL, down);
- down = HIBYTE(::GetKeyState(VK_RCONTROL)) != 0;
- ConvertEvent(VK_RCONTROL, down);
- }
- else {
- bool down = HIBYTE(::GetKeyState(VK_SHIFT)) != 0;
- ConvertEvent(VK_LSHIFT, down);
- ConvertEvent(VK_RSHIFT, down);
- down = HIBYTE(::GetKeyState(VK_MENU)) != 0;
- ConvertEvent(VK_LMENU, down);
- ConvertEvent(VK_RMENU, down);
- down = HIBYTE(::GetKeyState(VK_CONTROL)) != 0;
- ConvertEvent(VK_LCONTROL, down);
- ConvertEvent(VK_RCONTROL, down);
- }
-}
-
-
-void GPW_KeyboardDevice::CheckForSeperateLeftRight(WPARAM wParam)
-{
- // Check whether this system supports separate left and right keys
- switch (wParam) {
- case VK_SHIFT:
- m_separateLeftRight =
- (HIBYTE(::GetKeyState(VK_LSHIFT)) != 0) ||
- (HIBYTE(::GetKeyState(VK_RSHIFT)) != 0) ?
- true : false;
- break;
- case VK_CONTROL:
- m_separateLeftRight =
- (HIBYTE(::GetKeyState(VK_LCONTROL)) != 0) ||
- (HIBYTE(::GetKeyState(VK_RCONTROL)) != 0) ?
- true : false;
- break;
- case VK_MENU:
- m_separateLeftRight =
- (HIBYTE(::GetKeyState(VK_LMENU)) != 0) ||
- (HIBYTE(::GetKeyState(VK_RMENU)) != 0) ?
- true : false;
- break;
- }
- m_separateLeftRightInitialized = true;
-}
diff --git a/source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.h b/source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.h
deleted file mode 100644
index e47ce32c44c..00000000000
--- a/source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#ifndef _GPW_KEYBOARDDEVICE_H_
-#define _GPW_KEYBOARDDEVICE_H_
-
-#pragma warning (disable : 4786)
-
-#include <windows.h>
-#include "GPC_KeyboardDevice.h"
-
-/**
- * Win32 implementation of GPC_KeyboardDevice.
- * The contructor fills the keyboard code translation map.
- * Base class GPC_KeyboardDevice does the rest.
- * @see SCA_IInputDevice
- */
-class GPW_KeyboardDevice : public GPC_KeyboardDevice
-{
-public:
- GPW_KeyboardDevice(void);
-
- virtual ~GPW_KeyboardDevice(void);
-
- void ConvertWinEvent(WPARAM wParam, bool isDown);
-
-protected:
-
- void ConvertModifierKey(WPARAM wParam, bool isDown);
-
- void CheckForSeperateLeftRight(WPARAM wParam);
-
- /** Stores the capability of this system to distinguish left and right modifier keys. */
- bool m_separateLeftRight;
- /** Stores the initialization state of the member m_leftRightDistinguishable. */
- bool m_separateLeftRightInitialized;
-};
-
-#endif //_GPW_KEYBOARDDEVICE_H_
-
diff --git a/source/gameengine/GamePlayer/common/windows/GPW_System.cpp b/source/gameengine/GamePlayer/common/windows/GPW_System.cpp
deleted file mode 100644
index 4f4a48a52f1..00000000000
--- a/source/gameengine/GamePlayer/common/windows/GPW_System.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- * Timing routine taken and modified from KX_BlenderSystem.cpp
- */
-
-#include <windows.h>
-#include "GPW_System.h"
-
-GPW_System::GPW_System(void)
-{
- m_freq = 0;
- m_lastCount = 0;
- m_lastRest = 0;
- m_lastTime = 0;
-}
-
-
-double GPW_System::GetTimeInSeconds()
-{
-#if 0
- double secs = ::GetTickCount();
- secs /= 1000.;
- return secs;
-#else
-
- // 03/20/1999 Thomas Hieber: completely redone to get true Millisecond
- // accuracy instead of very rough ticks. This routine will also provide
- // correct wrap around at the end of "long"
-
- // m_freq was set to -1, if the current Hardware does not support
- // high resolution timers. We will use GetTickCount instead then.
- if (m_freq < 0) {
- return ::GetTickCount();
- }
-
- // m_freq is 0, the first time this function is being called.
- if (m_freq == 0) {
- // Try to determine the frequency of the high resulution timer
- if (!::QueryPerformanceFrequency((LARGE_INTEGER*)&m_freq)) {
- // There is no such timer....
- m_freq = -1;
- return 0;
- }
- }
-
- // Retrieve current count
- __int64 count = 0;
- ::QueryPerformanceCounter((LARGE_INTEGER*)&count);
-
- // Calculate the time passed since last call, and add the rest of
- // those tics that didn't make it into the last reported time.
- __int64 delta = 1000*(count-m_lastCount) + m_lastRest;
-
- m_lastTime += (long)(delta/m_freq); // Save the new value
- m_lastRest = delta%m_freq; // Save those ticks not being counted
- m_lastCount = count; // Save last count
-
- // Return a high quality measurement of time
- return m_lastTime/1000.0;
-#endif
-}
-
-
diff --git a/source/gameengine/GamePlayer/common/windows/Makefile b/source/gameengine/GamePlayer/common/windows/Makefile
deleted file mode 100644
index 200f84dd3e6..00000000000
--- a/source/gameengine/GamePlayer/common/windows/Makefile
+++ /dev/null
@@ -1,62 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-# ATTENTION: this Makefile is only used for win builds!
-
-LIBNAME = windows
-DIR = $(OCGDIR)/gameengine/GamePlayer/common/$(LIBNAME)
-
-include nan_compile.mk
-
-CPPFLAGS += -I..
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-CPPFLAGS += -I$(SRCHOME)/gameengine/GameLogic
-CPPFLAGS += -I$(SRCHOME)/gameengine/Rasterizer
-CPPFLAGS += -I$(SRCHOME)/gameengine/Ketsji
-CPPFLAGS += -I$(SRCHOME)/gameengine/Network
-CPPFLAGS += -I$(SRCHOME)/gameengine/Network/LoopBackNetwork
-
-CPPFLAGS += -I$(SRCHOME)/gameengine/Physics/Sumo/Fuzzics/include
-CPPFLAGS += -I$(SRCHOME)/gameengine/Physics/Sumo/include
-
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_GLEW)/include
-
-# Blender stuff
-CPPFLAGS += -I$(SRCHOME)/blender/blenkernel
-CPPFLAGS += -I$(SRCHOME)/blender/blenlib
-CPPFLAGS += -I$(SRCHOME)/blender/blenloader
-CPPFLAGS += -I$(SRCHOME)/blender/imbuf
-CPPFLAGS += -I$(SRCHOME)/blender/makesdna
-CPPFLAGS += -I$(SRCHOME)/kernel/gen_system
-
-CPPFLAGS += -I../../kernel/gen_system
-
diff --git a/source/gameengine/GamePlayer/ghost/CMakeLists.txt b/source/gameengine/GamePlayer/ghost/CMakeLists.txt
index 8164878762c..dc137861745 100644
--- a/source/gameengine/GamePlayer/ghost/CMakeLists.txt
+++ b/source/gameengine/GamePlayer/ghost/CMakeLists.txt
@@ -24,15 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-SET(SRC
- GPG_Application.cpp
- GPG_Canvas.cpp
- GPG_ghost.cpp
- GPG_KeyboardDevice.cpp
- GPG_System.cpp
-)
-
-SET(INC
+set(INC
.
../../../../intern/string
../../../../intern/ghost
@@ -44,11 +36,11 @@ SET(INC
../../../../source/gameengine/Converter
../../../../source/blender/imbuf
../../../../source/gameengine/Ketsji
+ ../../../../source/blender/blenfont
../../../../source/blender/blenlib
../../../../source/blender/blenkernel
../../../../source/blender/readblenfile
../../../../source/blender
- ../../../../source/blender/include
../../../../source/blender/makesdna
../../../../source/blender/makesrna
../../../../source/gameengine/Rasterizer
@@ -59,17 +51,29 @@ SET(INC
../../../../source/gameengine/Physics/common
../../../../source/gameengine/Network/LoopBackNetwork
../../../../source/gameengine/GamePlayer/common
- ../../../../source/blender/misc
../../../../source/blender/blenloader
../../../../source/blender/gpu
../../../../extern/glew/include
- ${PYTHON_INC}
+ ${PYTHON_INCLUDE_DIRS}
+)
+
+set(SRC
+ GPG_Application.cpp
+ GPG_Canvas.cpp
+ GPG_ghost.cpp
+ GPG_KeyboardDevice.cpp
+ GPG_System.cpp
+
+ GPG_Application.h
+ GPG_Canvas.h
+ GPG_KeyboardDevice.h
+ GPG_System.h
)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+add_definitions(-DGLEW_STATIC)
-IF(WITH_FFMPEG)
- ADD_DEFINITIONS(-DWITH_FFMPEG)
-ENDIF(WITH_FFMPEG)
+if(WITH_CODEC_FFMPEG)
+ add_definitions(-DWITH_FFMPEG)
+endif()
-BLENDERLIB_NOLIST(gp_ghost "${SRC}" "${INC}")
+blender_add_lib_nolist(ge_player_ghost "${SRC}" "${INC}")
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
index d1b8fb12336..060f2f6c3c4 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
@@ -546,7 +546,10 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
if (!m_canvas)
return false;
- m_canvas->Init();
+ m_canvas->Init();
+ if (gm->flag & GAME_SHOW_MOUSE)
+ m_canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
+
m_rendertools = new GPC_RenderTools();
if (!m_rendertools)
goto initFailed;
@@ -603,8 +606,11 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
m_ketsjiengine->SetNetworkDevice(m_networkdevice);
m_ketsjiengine->SetTimingDisplay(frameRate, false, false);
-
+#ifdef WITH_PYTHON
CValue::SetDeprecationWarnings(nodepwarnings);
+#else
+ (void)nodepwarnings;
+#endif
m_ketsjiengine->SetUseFixedTime(fixed_framerate);
m_ketsjiengine->SetTimingDisplay(frameRate, profile, properties);
@@ -677,20 +683,21 @@ bool GPG_Application::startEngine(void)
m_startScene,
m_canvas);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// some python things
PyObject *gameLogic, *gameLogic_keys;
setupGamePython(m_ketsjiengine, startscene, m_maggie, NULL, &gameLogic, &gameLogic_keys, m_argc, m_argv);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
//initialize Dome Settings
if(m_startScene->gm.stereoflag == STEREO_DOME)
m_ketsjiengine->InitDome(m_startScene->gm.dome.res, m_startScene->gm.dome.mode, m_startScene->gm.dome.angle, m_startScene->gm.dome.resbuf, m_startScene->gm.dome.tilt, m_startScene->gm.dome.warptext);
+#ifdef WITH_PYTHON
// Set the GameLogic.globalDict from marshal'd data, so we can
// load new blend files and keep data in GameLogic.globalDict
loadGamePythonConfig(m_pyGlobalDictString, m_pyGlobalDictString_Length);
-
+#endif
m_sceneconverter->ConvertScene(
startscene,
m_rendertools,
@@ -723,6 +730,7 @@ bool GPG_Application::startEngine(void)
void GPG_Application::stopEngine()
{
+#ifdef WITH_PYTHON
// GameLogic.globalDict gets converted into a buffer, and sorted in
// m_pyGlobalDictString so we can restore after python has stopped
// and started between .blend file loads.
@@ -735,6 +743,8 @@ void GPG_Application::stopEngine()
// when exiting the mainloop
exitGamePythonScripting();
+#endif
+
m_ketsjiengine->StopEngine();
m_networkdevice->Disconnect();
@@ -795,7 +805,6 @@ void GPG_Application::exitEngine()
m_canvas = 0;
}
- IMB_exit();
GPU_extensions_exit();
m_exitRequested = 0;
diff --git a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
index 9c0b5a24aeb..a3dc9a588c9 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
@@ -72,6 +72,11 @@ extern "C"
extern char bprogname[]; /* holds a copy of argv[0], from creator.c */
extern char btempdir[]; /* use this to store a valid temp directory */
+// For BLF
+#include "BLF_api.h"
+extern int datatoc_bfont_ttf_size;
+extern char datatoc_bfont_ttf[];
+
#ifdef __cplusplus
}
#endif // __cplusplus
@@ -95,9 +100,9 @@ extern char btempdir[]; /* use this to store a valid temp directory */
#ifdef WIN32
#include <windows.h>
-#ifdef NDEBUG
+#if !defined(DEBUG)
#include <wincon.h>
-#endif // NDEBUG
+#endif // !defined(DEBUG)
#endif // WIN32
const int kMinWindowWidth = 100;
@@ -389,9 +394,14 @@ int main(int argc, char** argv)
GEN_init_messaging_system();
IMB_init();
+
+ // Setup builtin font for BLF (mostly copied from creator.c, wm_init_exit.c and interface_style.c)
+ BLF_init(11, U.dpi);
+ BLF_lang_init();
+ BLF_load_mem("default", (unsigned char*)datatoc_bfont_ttf, datatoc_bfont_ttf_size);
// Parse command line options
-#ifndef NDEBUG
+#if defined(DEBUG)
printf("argv[0] = '%s'\n", argv[0]);
#endif
@@ -438,7 +448,7 @@ int main(int argc, char** argv)
;)
{
-#ifndef NDEBUG
+#if defined(DEBUG)
printf("argv[%d] = '%s' , %i\n", i, argv[i],argc);
#endif
if (argv[i][0] == '-')
@@ -469,7 +479,7 @@ int main(int argc, char** argv)
SYS_WriteCommandLineInt(syshandle, paramname, atoi(argv[i]));
SYS_WriteCommandLineFloat(syshandle, paramname, atof(argv[i]));
SYS_WriteCommandLineString(syshandle, paramname, argv[i]);
-#ifndef NDEBUG
+#if defined(DEBUG)
printf("%s = '%s'\n", paramname, argv[i]);
#endif
i++;
@@ -542,9 +552,9 @@ int main(int argc, char** argv)
printf("error: too few options for parent window argument.\n");
}
-#ifndef NDEBUG
+#if defined(DEBUG)
printf("XWindows ID = %d\n", parentWindow);
-#endif //NDEBUG
+#endif // defined(DEBUG)
#endif // _WIN32
case 'c':
@@ -745,12 +755,12 @@ int main(int argc, char** argv)
else
{
#ifdef WIN32
-#ifdef NDEBUG
+#if !defined(DEBUG)
if (closeConsole)
{
//::FreeConsole(); // Close a console window
}
-#endif // NDEBUG
+#endif // !defined(DEBUG)
#endif // WIN32
Main *maggie = bfd->main;
Scene *scene = bfd->curscene;
@@ -821,9 +831,10 @@ int main(int argc, char** argv)
app.SetGameEngineData(maggie, scene, argc, argv); /* this argc cant be argc_py_clamped, since python uses it */
BLI_strncpy(pathname, maggie->name, sizeof(pathname));
- BLI_strncpy(G.sce, maggie->name, sizeof(G.sce));
- setGamePythonPath(G.sce);
-
+ BLI_strncpy(G.main->name, maggie->name, sizeof(G.main->name));
+#ifdef WITH_PYTHON
+ setGamePythonPath(G.main->name);
+#endif
if (firstTimeRunning)
{
firstTimeRunning = false;
@@ -932,8 +943,14 @@ int main(int argc, char** argv)
}
}
+ // Cleanup
+ RNA_exit();
+ BLF_exit();
+ IMB_exit();
free_nodesystem();
+ SYS_DeleteSystem(syshandle);
+
return error ? -1 : 0;
}
diff --git a/source/gameengine/GamePlayer/ghost/Makefile b/source/gameengine/GamePlayer/ghost/Makefile
deleted file mode 100644
index b2fcd2ac1ff..00000000000
--- a/source/gameengine/GamePlayer/ghost/Makefile
+++ /dev/null
@@ -1,86 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makefile for GHOST game player
-
-LIBNAME = ghost
-DIR = $(OCGDIR)/gameengine/GamePlayer/ghost
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-# OpenGL header files
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-CPPFLAGS += -I../../GamePlayer/common
-
-# Game Engine includes
-CPPFLAGS += -I../../Converter
-CPPFLAGS += -I../../Expressions
-CPPFLAGS += -I../../GameLogic
-CPPFLAGS += -I../../Ketsji
-CPPFLAGS += -I../../Ketsji/KXNetwork
-CPPFLAGS += -I../../Network
-CPPFLAGS += -I../../Network/LoopBackNetwork
-CPPFLAGS += -I../../Rasterizer
-CPPFLAGS += -I../../Rasterizer/RAS_OpenGLRasterizer
-CPPFLAGS += -I../../SceneGraph
-
-# Sumo
-CPPFLAGS += -I$(SRCHOME)/gameengine/Physics/Sumo/include
-CPPFLAGS += -I$(SRCHOME)/gameengine/Physics/Sumo/Fuzzics/include
-
-CPPFLAGS += -I$(NAN_MOTO)/include
-
-# Blender includes
-CPPFLAGS += -I../../../blender/blenkernel
-CPPFLAGS += -I../../../blender/blenlib
-CPPFLAGS += -I../../../blender/blenloader
-CPPFLAGS += -I../../../blender/imbuf
-CPPFLAGS += -I../../../blender/makesdna
-CPPFLAGS += -I../../../blender/makesrna
-CPPFLAGS += -I../../../blender/readblenfile
-CPPFLAGS += -I../../../blender/gpu
-
-CPPFLAGS += -I../../../gameengine/BlenderRoutines
-
-# kernel? GEN? stuff
-CPPFLAGS += -I../../../kernel/gen_system
-CPPFLAGS += -I../../../kernel/gen_messaging
-
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_GHOST)/include
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-ifeq ($(WITH_FFMPEG), true)
- CPPFLAGS += -DWITH_FFMPEG
-endif
diff --git a/source/gameengine/GamePlayer/ghost/SConscript b/source/gameengine/GamePlayer/ghost/SConscript
index 41520a06c66..7c8f1c6f4f0 100644
--- a/source/gameengine/GamePlayer/ghost/SConscript
+++ b/source/gameengine/GamePlayer/ghost/SConscript
@@ -19,6 +19,7 @@ incs = ['.',
'#source/gameengine/Converter',
'#source/blender/imbuf',
'#source/gameengine/Ketsji',
+ '#source/blender/blenfont',
'#source/blender/blenlib',
'#source/blender/blenkernel',
'#source/blender/readblenfile',
@@ -44,10 +45,9 @@ defs = [ 'GLEW_STATIC' ]
if env['WITH_BF_PYTHON']:
incs += Split(env['BF_PYTHON_INC'])
-else:
- defs.append('DISABLE_PYTHON')
+ defs.append('WITH_PYTHON')
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
-env.BlenderLib (libname='gp_ghost', sources=source_files, includes = incs, defines = defs, libtype=['player'],priority=[0], cxx_compileflags=env['BGE_CXXFLAGS'])
+env.BlenderLib (libname='ge_player_ghost', sources=source_files, includes = incs, defines = defs, libtype=['player'],priority=[0], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/Ketsji/BL_Shader.cpp b/source/gameengine/Ketsji/BL_Shader.cpp
index 8edefe7ac2d..b00c1b7efb7 100644
--- a/source/gameengine/Ketsji/BL_Shader.cpp
+++ b/source/gameengine/Ketsji/BL_Shader.cpp
@@ -728,7 +728,7 @@ void BL_Shader::SetUniform(int uniform, const int* val, int len)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyMethodDef BL_Shader::Methods[] =
{
@@ -1411,6 +1411,6 @@ KX_PYMETHODDEF_DOC( BL_Shader, setUniformDef, "setUniformDef(name, enum)" )
return NULL;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
// eof
diff --git a/source/gameengine/Ketsji/BL_Shader.h b/source/gameengine/Ketsji/BL_Shader.h
index 5108acea0ff..77c642ecc7b 100644
--- a/source/gameengine/Ketsji/BL_Shader.h
+++ b/source/gameengine/Ketsji/BL_Shader.h
@@ -222,7 +222,7 @@ public:
void SetUniform(int uniform, const int val);
// Python interface
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
virtual PyObject* py_repr(void) { return PyUnicode_FromFormat("BL_Shader\n\tvertex shader:%s\n\n\tfragment shader%s\n\n", vertProg, fragProg); }
// -----------------------------------
diff --git a/source/gameengine/Ketsji/BL_Texture.cpp b/source/gameengine/Ketsji/BL_Texture.cpp
index 5d40ba7d75c..e708775b184 100644
--- a/source/gameengine/Ketsji/BL_Texture.cpp
+++ b/source/gameengine/Ketsji/BL_Texture.cpp
@@ -634,7 +634,7 @@ void my_envmap_split_ima(EnvMap *env, ImBuf *ibuf)
}
else {
for(part=0; part<6; part++) {
- env->cube[part]= IMB_allocImBuf(dx, dx, 24, IB_rect, 0);
+ env->cube[part]= IMB_allocImBuf(dx, dx, 24, IB_rect);
}
IMB_rectcpy(env->cube[0], ibuf,
0, 0, 0, 0, dx, dx);
diff --git a/source/gameengine/Ketsji/CMakeLists.txt b/source/gameengine/Ketsji/CMakeLists.txt
index 18ee86cea13..12b4ae171bd 100644
--- a/source/gameengine/Ketsji/CMakeLists.txt
+++ b/source/gameengine/Ketsji/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../source/kernel/gen_system
../../../intern/string
@@ -34,15 +32,14 @@ SET(INC
../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
../../../source/gameengine/Converter
../../../source/blender/imbuf
- ../../../intern/ghost/include
../../../intern/moto/include
../../../source/gameengine/Ketsji
../../../source/blender/blenlib
+ ../../../source/blender/blenfont
../../../source/blender/blenkernel
../../../source/blender/python
../../../source/blender/python/generic
../../../source/blender
- ../../../source/blender/include
../../../source/blender/makesdna
../../../source/gameengine/Rasterizer
../../../source/gameengine/GameLogic
@@ -51,35 +48,186 @@ SET(INC
../../../source/gameengine/Network
../../../source/gameengine/SceneGraph
../../../source/gameengine/Physics/common
- ../../../source/gameengine/Physics/Bullet
../../../source/gameengine/Network/LoopBackNetwork
../../../intern/audaspace/intern
- ../../../source/blender/misc
../../../source/blender/blenloader
../../../source/blender/gpu
- ../../../extern/bullet2/src
../../../extern/glew/include
../../../extern/recastnavigation/Recast/Include
../../../extern/recastnavigation/Detour/Include
../../../source/blender/editors/include
)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+set(SRC
+ BL_BlenderShader.cpp
+ BL_Material.cpp
+ BL_Shader.cpp
+ BL_Texture.cpp
+ KX_ArmatureSensor.cpp
+ KX_BlenderMaterial.cpp
+ KX_BulletPhysicsController.cpp
+ KX_Camera.cpp
+ KX_CameraActuator.cpp
+ KX_CameraIpoSGController.cpp
+ KX_ConstraintActuator.cpp
+ KX_ConstraintWrapper.cpp
+ KX_ConvertPhysicsObjects.cpp
+ KX_Dome.cpp
+ KX_EmptyObject.cpp
+ KX_FontObject.cpp
+ KX_GameActuator.cpp
+ KX_GameObject.cpp
+ KX_IPO_SGController.cpp
+ KX_IPhysicsController.cpp
+ KX_IpoActuator.cpp
+ KX_KetsjiEngine.cpp
+ KX_Light.cpp
+ KX_LightIpoSGController.cpp
+ KX_MaterialIpoController.cpp
+ KX_MeshProxy.cpp
+ KX_MotionState.cpp
+ KX_MouseFocusSensor.cpp
+ KX_NavMeshObject.cpp
+ KX_NearSensor.cpp
+ KX_ObColorIpoSGController.cpp
+ KX_ObjectActuator.cpp
+ KX_ObstacleSimulation.cpp
+ KX_OrientationInterpolator.cpp
+ KX_ParentActuator.cpp
+ KX_PhysicsObjectWrapper.cpp
+ KX_PolyProxy.cpp
+ KX_PolygonMaterial.cpp
+ KX_PositionInterpolator.cpp
+ KX_PyConstraintBinding.cpp
+ KX_PyMath.cpp
+ KX_PythonInit.cpp
+ KX_PythonInitTypes.cpp
+ KX_PythonSeq.cpp
+ KX_RadarSensor.cpp
+ KX_RayCast.cpp
+ KX_RayEventManager.cpp
+ KX_RaySensor.cpp
+ KX_SCA_AddObjectActuator.cpp
+ KX_SCA_DynamicActuator.cpp
+ KX_SCA_EndObjectActuator.cpp
+ KX_SCA_ReplaceMeshActuator.cpp
+ KX_SG_BoneParentNodeRelationship.cpp
+ KX_SG_NodeRelationships.cpp
+ KX_ScalarInterpolator.cpp
+ KX_ScalingInterpolator.cpp
+ KX_Scene.cpp
+ KX_SceneActuator.cpp
+ KX_SoundActuator.cpp
+ KX_StateActuator.cpp
+ KX_SteeringActuator.cpp
+ KX_TimeCategoryLogger.cpp
+ KX_TimeLogger.cpp
+ KX_TouchEventManager.cpp
+ KX_TouchSensor.cpp
+ KX_TrackToActuator.cpp
+ KX_VehicleWrapper.cpp
+ KX_VertexProxy.cpp
+ KX_VisibilityActuator.cpp
+ KX_WorldInfo.cpp
+ KX_WorldIpoController.cpp
+
+ KX_ArmatureSensor.h
+ KX_BlenderMaterial.h
+ KX_BulletPhysicsController.h
+ KX_Camera.h
+ KX_CameraActuator.h
+ KX_CameraIpoSGController.h
+ KX_ClientObjectInfo.h
+ KX_ConstraintActuator.h
+ KX_ConstraintWrapper.h
+ KX_ConvertPhysicsObject.h
+ KX_Dome.h
+ KX_EmptyObject.h
+ KX_FontObject.h
+ KX_GameActuator.h
+ KX_GameObject.h
+ KX_IInterpolator.h
+ KX_IPOTransform.h
+ KX_IPO_SGController.h
+ KX_IPhysicsController.h
+ KX_IScalarInterpolator.h
+ KX_ISceneConverter.h
+ KX_ISystem.h
+ KX_IpoActuator.h
+ KX_KetsjiEngine.h
+ KX_Light.h
+ KX_LightIpoSGController.h
+ KX_MaterialIpoController.h
+ KX_MeshProxy.h
+ KX_MotionState.h
+ KX_MouseFocusSensor.h
+ KX_NavMeshObject.h
+ KX_NearSensor.h
+ KX_ObColorIpoSGController.h
+ KX_ObjectActuator.h
+ KX_ObstacleSimulation.h
+ KX_OrientationInterpolator.h
+ KX_ParentActuator.h
+ KX_PhysicsEngineEnums.h
+ KX_PhysicsObjectWrapper.h
+ KX_PhysicsPropertiesobsolete.h
+ KX_PolyProxy.h
+ KX_PolygonMaterial.h
+ KX_PositionInterpolator.h
+ KX_PyConstraintBinding.h
+ KX_PyMath.h
+ KX_PythonInit.h
+ KX_PythonInitTypes.h
+ KX_PythonSeq.h
+ KX_RadarSensor.h
+ KX_RayCast.h
+ KX_RayEventManager.h
+ KX_RaySensor.h
+ KX_SCA_AddObjectActuator.h
+ KX_SCA_DynamicActuator.h
+ KX_SCA_EndObjectActuator.h
+ KX_SCA_ReplaceMeshActuator.h
+ KX_SG_BoneParentNodeRelationship.h
+ KX_SG_NodeRelationships.h
+ KX_ScalarInterpolator.h
+ KX_ScalingInterpolator.h
+ KX_Scene.h
+ KX_SceneActuator.h
+ KX_SoundActuator.h
+ KX_StateActuator.h
+ KX_SteeringActuator.h
+ KX_TimeCategoryLogger.h
+ KX_TimeLogger.h
+ KX_TouchEventManager.h
+ KX_TouchSensor.h
+ KX_TrackToActuator.h
+ KX_VehicleWrapper.h
+ KX_VertexProxy.h
+ KX_VisibilityActuator.h
+ KX_WorldInfo.h
+ KX_WorldIpoController.h
+ BL_BlenderShader.h
+ BL_Material.h
+ BL_Shader.h
+ BL_Texture.h
+)
+
+add_definitions(-DGLEW_STATIC)
-IF(WITH_SDL)
- SET(INC ${INC} ${SDL_INCLUDE_DIR})
-ELSE(WITH_SDL)
- ADD_DEFINITIONS(-DDISABLE_SDL)
-ENDIF(WITH_SDL)
+if(WITH_SDL)
+ set(INC ${INC} ${SDL_INCLUDE_DIR})
+else()
+ add_definitions(-DDISABLE_SDL)
+endif()
-IF(WITH_PYTHON)
- LIST(APPEND INC ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_CODEC_FFMPEG)
+ add_definitions(-DWITH_FFMPEG)
+endif()
-IF(WITH_FFMPEG)
- ADD_DEFINITIONS(-DWITH_FFMPEG)
-ENDIF(WITH_FFMPEG)
+if(WITH_BULLET)
+ add_definitions(-DUSE_BULLET)
+ list(APPEND INC ../../../extern/bullet2/src)
+ list(APPEND INC ../../../source/gameengine/Physics/Bullet )
+endif()
-BLENDERLIB(bf_ketsji "${SRC}" "${INC}")
+blender_add_lib(ge_logic_ketsji "${SRC}" "${INC}")
diff --git a/source/gameengine/Ketsji/KXNetwork/CMakeLists.txt b/source/gameengine/Ketsji/KXNetwork/CMakeLists.txt
index 106d1a84a92..5f251c832ee 100644
--- a/source/gameengine/Ketsji/KXNetwork/CMakeLists.txt
+++ b/source/gameengine/Ketsji/KXNetwork/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../../source/kernel/gen_system
../../../../intern/string
@@ -38,10 +36,18 @@ SET(INC
../../../../source/gameengine/Network
)
-IF(WITH_PYTHON)
- LIST(APPEND INC ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+set(SRC
+ KX_NetworkEventManager.cpp
+ KX_NetworkMessageActuator.cpp
+ KX_NetworkMessageSensor.cpp
+ KX_NetworkObjectActuator.cpp
+ KX_NetworkObjectSensor.cpp
+
+ KX_NetworkEventManager.h
+ KX_NetworkMessageActuator.h
+ KX_NetworkMessageSensor.h
+ KX_NetworkObjectActuator.h
+ KX_NetworkObjectSensor.h
+)
-BLENDERLIB(kx_network "${SRC}" "${INC}")
+blender_add_lib(ge_logic_network "${SRC}" "${INC}")
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp
index e047a9aa273..3ac95d7eaf8 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp
@@ -28,6 +28,8 @@
* Ketsji Logic Extenstion: Network Message Actuator generic implementation
*/
+#include <stddef.h>
+
#include "NG_NetworkScene.h"
#include "KX_NetworkMessageActuator.h"
@@ -91,7 +93,7 @@ CValue* KX_NetworkMessageActuator::GetReplica()
return replica;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* -------------------------------------------------------------------- */
/* Python interface --------------------------------------------------- */
@@ -132,4 +134,4 @@ PyAttributeDef KX_NetworkMessageActuator::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
index 56ccac9a93e..5d05534b258 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
@@ -28,6 +28,8 @@
* Ketsji Logic Extenstion: Network Message Sensor generic implementation
*/
+#include <stddef.h>
+
#include "KX_NetworkMessageSensor.h"
#include "KX_NetworkEventManager.h"
#include "NG_NetworkMessage.h"
@@ -154,7 +156,7 @@ bool KX_NetworkMessageSensor::IsPositiveTrigger()
return m_IsUp;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -215,4 +217,4 @@ PyObject* KX_NetworkMessageSensor::pyattr_get_subjects(void *self_v, const KX_PY
}
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h
index 1efd25dd65f..8f5a11426a7 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h
@@ -71,7 +71,7 @@ public:
m_NetworkScene= val;
};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------- */
/* Python interface -------------------------------------------- */
@@ -81,7 +81,7 @@ public:
static PyObject* pyattr_get_bodies(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_subjects(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/Ketsji/KXNetwork/Makefile b/source/gameengine/Ketsji/KXNetwork/Makefile
deleted file mode 100644
index aebbd7921cb..00000000000
--- a/source/gameengine/Ketsji/KXNetwork/Makefile
+++ /dev/null
@@ -1,48 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = KXNetwork
-DIR = $(OCGDIR)/gameengine/ketsji/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I../../Expressions
-CPPFLAGS += -I../../GameLogic
-CPPFLAGS += -I../../SceneGraph
-CPPFLAGS += -I../../Network
-CPPFLAGS += -I../../../kernel/gen_system
-CPPFLAGS += -I..
-
diff --git a/source/gameengine/Ketsji/KXNetwork/SConscript b/source/gameengine/Ketsji/KXNetwork/SConscript
index e7f98ff5850..78cdc8df9af 100644
--- a/source/gameengine/Ketsji/KXNetwork/SConscript
+++ b/source/gameengine/Ketsji/KXNetwork/SConscript
@@ -11,7 +11,6 @@ defs = []
if env['WITH_BF_PYTHON']:
incs += ' ' + env['BF_PYTHON_INC']
-else:
- defs.append('DISABLE_PYTHON')
+ defs.append('WITH_PYTHON')
env.BlenderLib ( 'bf_network', Split(sources), Split(incs), defines=defs,libtype=['core','player'], priority=[400,125], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/Ketsji/KX_ArmatureSensor.cpp b/source/gameengine/Ketsji/KX_ArmatureSensor.cpp
index a47a1972beb..732c0b910df 100644
--- a/source/gameengine/Ketsji/KX_ArmatureSensor.cpp
+++ b/source/gameengine/Ketsji/KX_ArmatureSensor.cpp
@@ -149,7 +149,7 @@ bool KX_ArmatureSensor::Evaluate()
return (reset) ? true : false;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -201,4 +201,4 @@ PyObject* KX_ArmatureSensor::pyattr_get_constraint(void *self, const struct KX_P
Py_RETURN_NONE;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_ArmatureSensor.h b/source/gameengine/Ketsji/KX_ArmatureSensor.h
index 636309f5bdf..b007899c4ff 100644
--- a/source/gameengine/Ketsji/KX_ArmatureSensor.h
+++ b/source/gameengine/Ketsji/KX_ArmatureSensor.h
@@ -66,14 +66,14 @@ public:
// identify the constraint that this actuator controls
void FindConstraint();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
static PyObject* pyattr_get_constraint(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
private:
struct bConstraint* m_constraint;
diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
index d88997e2128..a4dc68b92e5 100644
--- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
+++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
@@ -783,7 +783,7 @@ void KX_BlenderMaterial::SetBlenderGLSLShader(int layer)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyMethodDef KX_BlenderMaterial::Methods[] =
{
@@ -967,4 +967,4 @@ KX_PYMETHODDEF_DOC( KX_BlenderMaterial, setBlending , "setBlending( bge.logic.sr
return NULL;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.h b/source/gameengine/Ketsji/KX_BlenderMaterial.h
index 239e334f68a..745045ff784 100644
--- a/source/gameengine/Ketsji/KX_BlenderMaterial.h
+++ b/source/gameengine/Ketsji/KX_BlenderMaterial.h
@@ -98,7 +98,7 @@ public:
}
};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// --------------------------------
virtual PyObject* py_repr(void) { return PyUnicode_FromString(mMaterial->matname.ReadPtr()); }
@@ -113,7 +113,7 @@ public:
KX_PYMETHOD_DOC( KX_BlenderMaterial, setTexture );
KX_PYMETHOD_DOC( KX_BlenderMaterial, setBlending );
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
// --------------------------------
// pre calculate to avoid pops/lag at startup
diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
index 1b2ceae6560..c2fb21bf31a 100644
--- a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
+++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
@@ -521,4 +521,4 @@ bool KX_BulletPhysicsController::Update(double time)
// return false;
}
-#endif //#ifdef USE_BULLET
+#endif // USE_BULLET
diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.h b/source/gameengine/Ketsji/KX_BulletPhysicsController.h
index 48a3c98ff81..a3e8fafec1d 100644
--- a/source/gameengine/Ketsji/KX_BulletPhysicsController.h
+++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.h
@@ -3,7 +3,9 @@
#include "KX_IPhysicsController.h"
+#ifdef USE_BULLET
#include "CcdPhysicsController.h"
+#endif
class KX_BulletPhysicsController : public KX_IPhysicsController ,public CcdPhysicsController
{
@@ -18,9 +20,10 @@ private:
btCollisionShape* m_bulletChildShape;
public:
+#ifdef USE_BULLET
KX_BulletPhysicsController (const CcdConstructionInfo& ci, bool dyna, bool sensor, bool compound);
virtual ~KX_BulletPhysicsController ();
-
+#endif
///////////////////////////////////
// KX_IPhysicsController interface
////////////////////////////////////
diff --git a/source/gameengine/Ketsji/KX_Camera.cpp b/source/gameengine/Ketsji/KX_Camera.cpp
index 2402baf92ac..1711ba7f64f 100644
--- a/source/gameengine/Ketsji/KX_Camera.cpp
+++ b/source/gameengine/Ketsji/KX_Camera.cpp
@@ -474,7 +474,7 @@ int KX_Camera::GetViewportTop() const
return m_camdata.m_viewporttop;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
//----------------------------------------------------------------------------
//Python
@@ -706,6 +706,7 @@ int KX_Camera::pyattr_set_perspective(void *self_v, const KX_PYATTRIBUTE_DEF *at
}
self->m_camdata.m_perspective= param;
+ self->InvalidateProjectionMatrix();
return PY_SET_ATTR_SUCCESS;
}
diff --git a/source/gameengine/Ketsji/KX_Camera.h b/source/gameengine/Ketsji/KX_Camera.h
index ad2460d34ef..130dfd4067d 100644
--- a/source/gameengine/Ketsji/KX_Camera.h
+++ b/source/gameengine/Ketsji/KX_Camera.h
@@ -41,7 +41,7 @@
#include "IntValue.h"
#include "RAS_CameraData.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* utility conversion function */
bool ConvertPythonToCamera(PyObject * value, KX_Camera **object, bool py_none_ok, const char *error_prefix);
#endif
@@ -269,7 +269,7 @@ public:
virtual int GetGameObjectType() { return OBJ_CAMERA; }
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
KX_PYMETHOD_DOC_VARARGS(KX_Camera, sphereInsideFrustum);
KX_PYMETHOD_DOC_O(KX_Camera, boxInsideFrustum);
KX_PYMETHOD_DOC_O(KX_Camera, pointInsideFrustum);
diff --git a/source/gameengine/Ketsji/KX_CameraActuator.cpp b/source/gameengine/Ketsji/KX_CameraActuator.cpp
index bc67ecbe1a5..18d3e046577 100644
--- a/source/gameengine/Ketsji/KX_CameraActuator.cpp
+++ b/source/gameengine/Ketsji/KX_CameraActuator.cpp
@@ -346,7 +346,7 @@ CValue *KX_CameraActuator::findObject(char *obName)
return NULL;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -414,6 +414,6 @@ int KX_CameraActuator::pyattr_set_object(void *self_v, const KX_PYATTRIBUTE_DEF
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/Ketsji/KX_CameraActuator.h b/source/gameengine/Ketsji/KX_CameraActuator.h
index 2bc0ee18593..0a0a47f1ce2 100644
--- a/source/gameengine/Ketsji/KX_CameraActuator.h
+++ b/source/gameengine/Ketsji/KX_CameraActuator.h
@@ -114,7 +114,7 @@ private :
/** Methods inherited from SCA_ILogicBrick */
virtual void Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -124,7 +124,7 @@ private :
static PyObject* pyattr_get_object(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_object(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/Ketsji/KX_ConstraintActuator.cpp b/source/gameengine/Ketsji/KX_ConstraintActuator.cpp
index 9380f4b5d2f..15a4a4680bb 100644
--- a/source/gameengine/Ketsji/KX_ConstraintActuator.cpp
+++ b/source/gameengine/Ketsji/KX_ConstraintActuator.cpp
@@ -557,7 +557,7 @@ bool KX_ConstraintActuator::IsValidMode(KX_ConstraintActuator::KX_CONSTRAINTTYPE
return res;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp b/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
index b1baa5fe9e1..2882ca5a371 100644
--- a/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
+++ b/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
@@ -45,7 +45,7 @@ KX_ConstraintWrapper::~KX_ConstraintWrapper()
{
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* KX_ConstraintWrapper::PyGetConstraintId()
{
@@ -120,4 +120,4 @@ PyObject* KX_ConstraintWrapper::pyattr_get_constraintId(void *self_v, const KX_P
return self->PyGetConstraintId();
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_ConstraintWrapper.h b/source/gameengine/Ketsji/KX_ConstraintWrapper.h
index db9543c23ae..58c204d5da0 100644
--- a/source/gameengine/Ketsji/KX_ConstraintWrapper.h
+++ b/source/gameengine/Ketsji/KX_ConstraintWrapper.h
@@ -40,7 +40,7 @@ public:
virtual ~KX_ConstraintWrapper ();
int getConstraintId() { return m_constraintId;};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
KX_PYMETHOD_NOARGS(KX_ConstraintWrapper,GetConstraintId);
KX_PYMETHOD(KX_ConstraintWrapper,SetParam);
KX_PYMETHOD(KX_ConstraintWrapper,GetParam);
diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h b/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
index ca20aa6b618..2bb3534bde7 100644
--- a/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
+++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
@@ -29,19 +29,6 @@
#ifndef KX_CONVERTPHYSICSOBJECTS
#define KX_CONVERTPHYSICSOBJECTS
-/* These are defined by the build system... */
-//but the build system is broken, because it doesn't allow for 2 or more defines at once.
-//Please leave Sumo _AND_ Bullet enabled
-#define USE_BULLET
-
-//on visual studio 7/8, always enable BULLET for now
-//you can have multiple physics engines running anyway, and
-//the scons build system doesn't really support this at the moment.
-//if you got troubles, just comment out USE_BULLET
-#if 1300 <= _MSC_VER
-#define USE_BULLET
-#endif
-
class RAS_MeshObject;
class KX_Scene;
struct DerivedMesh;
diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
index 061220ce0c1..e238d7babec 100644
--- a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
+++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
@@ -38,7 +38,6 @@
#include "RAS_MeshObject.h"
#include "KX_Scene.h"
#include "SYS_System.h"
-#include "BulletSoftBody/btSoftBody.h"
#include "PHY_Pro.h" //todo cleanup
#include "KX_ClientObjectInfo.h"
@@ -56,6 +55,7 @@ extern "C"{
}
#ifdef USE_BULLET
+#include "BulletSoftBody/btSoftBody.h"
#include "CcdPhysicsEnvironment.h"
#include "CcdPhysicsController.h"
@@ -218,6 +218,9 @@ void KX_ConvertBulletObject( class KX_GameObject* gameobj,
break;
}
+ case KX_BOUND_DYN_MESH:
+ /* do nothing */
+ break;
}
@@ -561,4 +564,4 @@ bool KX_ReInstanceBulletShapeFromMesh(KX_GameObject *gameobj, KX_GameObject *fro
spc->ReplaceControllerShape(bm);
return true;
}
-#endif
+#endif // USE_BULLET
diff --git a/source/gameengine/Ketsji/KX_Dome.cpp b/source/gameengine/Ketsji/KX_Dome.cpp
index 44d7827db6a..36fc02ab833 100644
--- a/source/gameengine/Ketsji/KX_Dome.cpp
+++ b/source/gameengine/Ketsji/KX_Dome.cpp
@@ -18,13 +18,13 @@ http://www.gnu.org/copyleft/lesser.txt.
Contributor(s): Dalai Felinto
This code is originally inspired on some of the ideas and codes from Paul Bourke.
-Developed as part of a Research and Development project for SAT - La Soci�t� des arts technologiques.
+Developed as part of a Research and Development project for SAT - La Société des arts technologiques.
-----------------------------------------------------------------------------
*/
#include "KX_Dome.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include <structmember.h>
#endif
@@ -556,26 +556,25 @@ void KX_Dome::CreateMeshDome180(void)
- transform it onto an equidistant spherical projection techniques to transform the sphere onto a dome image
*/
int i,j;
- float sqrt_2 = sqrt(2.0);
float uv_ratio = (float)(m_buffersize-1) / m_imagesize;
m_radangle = m_angle * M_PI/180.0;//calculates the radians angle, used for flattening
- //creating faces for the env mapcube 180� Dome
+ //creating faces for the env mapcube 180deg Dome
// Top Face - just a triangle
- cubetop[0].verts[0][0] = -sqrt_2 / 2.0;
+ cubetop[0].verts[0][0] = -M_SQRT2 / 2.0;
cubetop[0].verts[0][1] = 0.0;
cubetop[0].verts[0][2] = 0.5;
cubetop[0].u[0] = 0.0;
cubetop[0].v[0] = uv_ratio;
cubetop[0].verts[1][0] = 0.0;
- cubetop[0].verts[1][1] = sqrt_2 / 2.0;
+ cubetop[0].verts[1][1] = M_SQRT2 / 2.0;
cubetop[0].verts[1][2] = 0.5;
cubetop[0].u[1] = 0.0;
cubetop[0].v[1] = 0.0;
- cubetop[0].verts[2][0] = sqrt_2 / 2.0;
+ cubetop[0].verts[2][0] = M_SQRT2 / 2.0;
cubetop[0].verts[2][1] = 0.0;
cubetop[0].verts[2][2] = 0.5;
cubetop[0].u[2] = uv_ratio;
@@ -584,20 +583,20 @@ void KX_Dome::CreateMeshDome180(void)
nfacestop = 1;
/* Bottom face - just a triangle */
- cubebottom[0].verts[0][0] = -sqrt_2 / 2.0;
+ cubebottom[0].verts[0][0] = -M_SQRT2 / 2.0;
cubebottom[0].verts[0][1] = 0.0;
cubebottom[0].verts[0][2] = -0.5;
cubebottom[0].u[0] = uv_ratio;
cubebottom[0].v[0] = 0.0;
- cubebottom[0].verts[1][0] = sqrt_2 / 2.0;
+ cubebottom[0].verts[1][0] = M_SQRT2 / 2.0;
cubebottom[0].verts[1][1] = 0;
cubebottom[0].verts[1][2] = -0.5;
cubebottom[0].u[1] = 0.0;
cubebottom[0].v[1] = uv_ratio;
cubebottom[0].verts[2][0] = 0.0;
- cubebottom[0].verts[2][1] = sqrt_2 / 2.0;
+ cubebottom[0].verts[2][1] = M_SQRT2 / 2.0;
cubebottom[0].verts[2][2] = -0.5;
cubebottom[0].u[2] = 0.0;
cubebottom[0].v[2] = 0.0;
@@ -606,39 +605,39 @@ void KX_Dome::CreateMeshDome180(void)
/* Left face - two triangles */
- cubeleft[0].verts[0][0] = -sqrt_2 / 2.0;
+ cubeleft[0].verts[0][0] = -M_SQRT2 / 2.0;
cubeleft[0].verts[0][1] = .0;
cubeleft[0].verts[0][2] = -0.5;
cubeleft[0].u[0] = 0.0;
cubeleft[0].v[0] = 0.0;
cubeleft[0].verts[1][0] = 0.0;
- cubeleft[0].verts[1][1] = sqrt_2 / 2.0;
+ cubeleft[0].verts[1][1] = M_SQRT2 / 2.0;
cubeleft[0].verts[1][2] = -0.5;
cubeleft[0].u[1] = uv_ratio;
cubeleft[0].v[1] = 0.0;
- cubeleft[0].verts[2][0] = -sqrt_2 / 2.0;
+ cubeleft[0].verts[2][0] = -M_SQRT2 / 2.0;
cubeleft[0].verts[2][1] = 0.0;
cubeleft[0].verts[2][2] = 0.5;
cubeleft[0].u[2] = 0.0;
cubeleft[0].v[2] = uv_ratio;
//second triangle
- cubeleft[1].verts[0][0] = -sqrt_2 / 2.0;
+ cubeleft[1].verts[0][0] = -M_SQRT2 / 2.0;
cubeleft[1].verts[0][1] = 0.0;
cubeleft[1].verts[0][2] = 0.5;
cubeleft[1].u[0] = 0.0;
cubeleft[1].v[0] = uv_ratio;
cubeleft[1].verts[1][0] = 0.0;
- cubeleft[1].verts[1][1] = sqrt_2 / 2.0;
+ cubeleft[1].verts[1][1] = M_SQRT2 / 2.0;
cubeleft[1].verts[1][2] = -0.5;
cubeleft[1].u[1] = uv_ratio;
cubeleft[1].v[1] = 0.0;
cubeleft[1].verts[2][0] = 0.0;
- cubeleft[1].verts[2][1] = sqrt_2 / 2.0;
+ cubeleft[1].verts[2][1] = M_SQRT2 / 2.0;
cubeleft[1].verts[2][2] = 0.5;
cubeleft[1].u[2] = uv_ratio;
cubeleft[1].v[2] = uv_ratio;
@@ -647,18 +646,18 @@ void KX_Dome::CreateMeshDome180(void)
/* Right face - two triangles */
cuberight[0].verts[0][0] = 0.0;
- cuberight[0].verts[0][1] = sqrt_2 / 2.0;
+ cuberight[0].verts[0][1] = M_SQRT2 / 2.0;
cuberight[0].verts[0][2] = -0.5;
cuberight[0].u[0] = 0.0;
cuberight[0].v[0] = 0.0;
- cuberight[0].verts[1][0] = sqrt_2 / 2.0;
+ cuberight[0].verts[1][0] = M_SQRT2 / 2.0;
cuberight[0].verts[1][1] = 0.0;
cuberight[0].verts[1][2] = -0.5;
cuberight[0].u[1] = uv_ratio;
cuberight[0].v[1] = 0.0;
- cuberight[0].verts[2][0] = sqrt_2 / 2.0;
+ cuberight[0].verts[2][0] = M_SQRT2 / 2.0;
cuberight[0].verts[2][1] = 0.0;
cuberight[0].verts[2][2] = 0.5;
cuberight[0].u[2] = uv_ratio;
@@ -666,19 +665,19 @@ void KX_Dome::CreateMeshDome180(void)
//second triangle
cuberight[1].verts[0][0] = 0.0;
- cuberight[1].verts[0][1] = sqrt_2 / 2.0;
+ cuberight[1].verts[0][1] = M_SQRT2 / 2.0;
cuberight[1].verts[0][2] = -0.5;
cuberight[1].u[0] = 0.0;
cuberight[1].v[0] = 0.0;
- cuberight[1].verts[1][0] = sqrt_2 / 2.0;
+ cuberight[1].verts[1][0] = M_SQRT2 / 2.0;
cuberight[1].verts[1][1] = 0.0;
cuberight[1].verts[1][2] = 0.5;
cuberight[1].u[1] = uv_ratio;
cuberight[1].v[1] = uv_ratio;
cuberight[1].verts[2][0] = 0.0;
- cuberight[1].verts[2][1] = sqrt_2 / 2.0;
+ cuberight[1].verts[2][1] = M_SQRT2 / 2.0;
cuberight[1].verts[2][2] = 0.5;
cuberight[1].u[2] = 0.0;
cuberight[1].v[2] = uv_ratio;
@@ -746,7 +745,7 @@ void KX_Dome::CreateMeshDome250(void)
m_radangle = m_angle * M_PI/180.0;//calculates the radians angle, used for flattening
/*
verts_height is the exactly needed height of the cube faces (not always 1.0).
-When we want some horizontal information (e.g. for horizontal 220� domes) we don't need to create and tesselate the whole cube.
+When we want some horizontal information (e.g. for horizontal 220deg domes) we don't need to create and tesselate the whole cube.
Therefore the lateral cube faces could be small, and the tesselate mesh would be completely used.
(if we always worked with verts_height = 1.0, we would be discarding a lot of the calculated and tesselated geometry).
@@ -758,12 +757,12 @@ Therefore we have the length in radians of the dome/sphere over the horizon.
Once we take the tangent of that angle, you have the verts coordinate corresponding to the verts on the side faces.
Then we need to multiply it by sqrt(2.0) to get the coordinate of the verts on the diagonal of the original cube.
*/
- verts_height = tan((rad_ang/2) - (MT_PI/2))*sqrt(2.0);
+ verts_height = tan((rad_ang/2) - (MT_PI/2))*M_SQRT2;
uv_height = uv_ratio * ((verts_height/2) + 0.5);
uv_base = uv_ratio * (1.0 - ((verts_height/2) + 0.5));
- //creating faces for the env mapcube 180� Dome
+ //creating faces for the env mapcube 180deg Dome
// Front Face - 2 triangles
cubefront[0].verts[0][0] =-1.0;
cubefront[0].verts[0][1] = 1.0;
@@ -1021,42 +1020,41 @@ void KX_Dome::CreateMeshPanorama(void)
*/
int i,j;
- float sqrt_2 = sqrt(2.0);
float uv_ratio = (float)(m_buffersize-1) / m_imagesize;
/* Top face - two triangles */
- cubetop[0].verts[0][0] = -sqrt_2;
+ cubetop[0].verts[0][0] = -M_SQRT2;
cubetop[0].verts[0][1] = 0.0;
cubetop[0].verts[0][2] = 1.0;
cubetop[0].u[0] = 0.0;
cubetop[0].v[0] = uv_ratio;
cubetop[0].verts[1][0] = 0.0;
- cubetop[0].verts[1][1] = sqrt_2;
+ cubetop[0].verts[1][1] = M_SQRT2;
cubetop[0].verts[1][2] = 1.0;
cubetop[0].u[1] = 0.0;
cubetop[0].v[1] = 0.0;
//second triangle
- cubetop[0].verts[2][0] = sqrt_2;
+ cubetop[0].verts[2][0] = M_SQRT2;
cubetop[0].verts[2][1] = 0.0;
cubetop[0].verts[2][2] = 1.0;
cubetop[0].u[2] = uv_ratio;
cubetop[0].v[2] = 0.0;
- cubetop[1].verts[0][0] = sqrt_2;
+ cubetop[1].verts[0][0] = M_SQRT2;
cubetop[1].verts[0][1] = 0.0;
cubetop[1].verts[0][2] = 1.0;
cubetop[1].u[0] = uv_ratio;
cubetop[1].v[0] = 0.0;
cubetop[1].verts[1][0] = 0.0;
- cubetop[1].verts[1][1] = -sqrt_2;
+ cubetop[1].verts[1][1] = -M_SQRT2;
cubetop[1].verts[1][2] = 1.0;
cubetop[1].u[1] = uv_ratio;
cubetop[1].v[1] = uv_ratio;
- cubetop[1].verts[2][0] = -sqrt_2;
+ cubetop[1].verts[2][0] = -M_SQRT2;
cubetop[1].verts[2][1] = 0.0;
cubetop[1].verts[2][2] = 1.0;
cubetop[1].u[2] = 0.0;
@@ -1065,79 +1063,79 @@ void KX_Dome::CreateMeshPanorama(void)
nfacestop = 2;
/* Bottom face - two triangles */
- cubebottom[0].verts[0][0] = -sqrt_2;
+ cubebottom[0].verts[0][0] = -M_SQRT2;
cubebottom[0].verts[0][1] = 0.0;
cubebottom[0].verts[0][2] = -1.0;
cubebottom[0].u[0] = uv_ratio;
cubebottom[0].v[0] = 0.0;
- cubebottom[0].verts[1][0] = sqrt_2;
+ cubebottom[0].verts[1][0] = M_SQRT2;
cubebottom[0].verts[1][1] = 0.0;
cubebottom[0].verts[1][2] = -1.0;
cubebottom[0].u[1] = 0.0;
cubebottom[0].v[1] = uv_ratio;
cubebottom[0].verts[2][0] = 0.0;
- cubebottom[0].verts[2][1] = sqrt_2;
+ cubebottom[0].verts[2][1] = M_SQRT2;
cubebottom[0].verts[2][2] = -1.0;
cubebottom[0].u[2] = 0.0;
cubebottom[0].v[2] = 0.0;
//second triangle
- cubebottom[1].verts[0][0] = sqrt_2;
+ cubebottom[1].verts[0][0] = M_SQRT2;
cubebottom[1].verts[0][1] = 0.0;
cubebottom[1].verts[0][2] = -1.0;
cubebottom[1].u[0] = 0.0;
cubebottom[1].v[0] = uv_ratio;
- cubebottom[1].verts[1][0] = -sqrt_2;
+ cubebottom[1].verts[1][0] = -M_SQRT2;
cubebottom[1].verts[1][1] = 0.0;
cubebottom[1].verts[1][2] = -1.0;
cubebottom[1].u[1] = uv_ratio;
cubebottom[1].v[1] = 0.0;
cubebottom[1].verts[2][0] = 0.0;
- cubebottom[1].verts[2][1] = -sqrt_2;
+ cubebottom[1].verts[2][1] = -M_SQRT2;
cubebottom[1].verts[2][2] = -1.0;
cubebottom[1].u[2] = uv_ratio;
cubebottom[1].v[2] = uv_ratio;
nfacesbottom = 2;
- /* Left Back (135�) face - two triangles */
+ /* Left Back (135deg) face - two triangles */
cubeleftback[0].verts[0][0] = 0;
- cubeleftback[0].verts[0][1] = -sqrt_2;
+ cubeleftback[0].verts[0][1] = -M_SQRT2;
cubeleftback[0].verts[0][2] = -1.0;
cubeleftback[0].u[0] = 0;
cubeleftback[0].v[0] = 0;
- cubeleftback[0].verts[1][0] = -sqrt_2;
+ cubeleftback[0].verts[1][0] = -M_SQRT2;
cubeleftback[0].verts[1][1] = 0;
cubeleftback[0].verts[1][2] = -1.0;
cubeleftback[0].u[1] = uv_ratio;
cubeleftback[0].v[1] = 0;
cubeleftback[0].verts[2][0] = 0;
- cubeleftback[0].verts[2][1] = -sqrt_2;
+ cubeleftback[0].verts[2][1] = -M_SQRT2;
cubeleftback[0].verts[2][2] = 1.0;
cubeleftback[0].u[2] = 0;
cubeleftback[0].v[2] = uv_ratio;
//second triangle
cubeleftback[1].verts[0][0] = 0;
- cubeleftback[1].verts[0][1] = -sqrt_2;
+ cubeleftback[1].verts[0][1] = -M_SQRT2;
cubeleftback[1].verts[0][2] = 1.0;
cubeleftback[1].u[0] = 0;
cubeleftback[1].v[0] = uv_ratio;
- cubeleftback[1].verts[1][0] = -sqrt_2;
+ cubeleftback[1].verts[1][0] = -M_SQRT2;
cubeleftback[1].verts[1][1] = 0;
cubeleftback[1].verts[1][2] = -1.0;
cubeleftback[1].u[1] = uv_ratio;
cubeleftback[1].v[1] = 0;
- cubeleftback[1].verts[2][0] = -sqrt_2;
+ cubeleftback[1].verts[2][0] = -M_SQRT2;
cubeleftback[1].verts[2][1] = 0;
cubeleftback[1].verts[2][2] = 1.0;
cubeleftback[1].u[2] = uv_ratio;
@@ -1147,39 +1145,39 @@ void KX_Dome::CreateMeshPanorama(void)
/* Left face - two triangles */
- cubeleft[0].verts[0][0] = -sqrt_2;
+ cubeleft[0].verts[0][0] = -M_SQRT2;
cubeleft[0].verts[0][1] = 0;
cubeleft[0].verts[0][2] = -1.0;
cubeleft[0].u[0] = 0;
cubeleft[0].v[0] = 0;
cubeleft[0].verts[1][0] = 0;
- cubeleft[0].verts[1][1] = sqrt_2;
+ cubeleft[0].verts[1][1] = M_SQRT2;
cubeleft[0].verts[1][2] = -1.0;
cubeleft[0].u[1] = uv_ratio;
cubeleft[0].v[1] = 0;
- cubeleft[0].verts[2][0] = -sqrt_2;
+ cubeleft[0].verts[2][0] = -M_SQRT2;
cubeleft[0].verts[2][1] = 0;
cubeleft[0].verts[2][2] = 1.0;
cubeleft[0].u[2] = 0;
cubeleft[0].v[2] = uv_ratio;
//second triangle
- cubeleft[1].verts[0][0] = -sqrt_2;
+ cubeleft[1].verts[0][0] = -M_SQRT2;
cubeleft[1].verts[0][1] = 0;
cubeleft[1].verts[0][2] = 1.0;
cubeleft[1].u[0] = 0;
cubeleft[1].v[0] = uv_ratio;
cubeleft[1].verts[1][0] = 0;
- cubeleft[1].verts[1][1] = sqrt_2;
+ cubeleft[1].verts[1][1] = M_SQRT2;
cubeleft[1].verts[1][2] = -1.0;
cubeleft[1].u[1] = uv_ratio;
cubeleft[1].v[1] = 0;
cubeleft[1].verts[2][0] = 0;
- cubeleft[1].verts[2][1] = sqrt_2;
+ cubeleft[1].verts[2][1] = M_SQRT2;
cubeleft[1].verts[2][2] = 1.0;
cubeleft[1].u[2] = uv_ratio;
cubeleft[1].v[2] = uv_ratio;
@@ -1188,18 +1186,18 @@ void KX_Dome::CreateMeshPanorama(void)
/* Right face - two triangles */
cuberight[0].verts[0][0] = 0;
- cuberight[0].verts[0][1] = sqrt_2;
+ cuberight[0].verts[0][1] = M_SQRT2;
cuberight[0].verts[0][2] = -1.0;
cuberight[0].u[0] = 0;
cuberight[0].v[0] = 0;
- cuberight[0].verts[1][0] = sqrt_2;
+ cuberight[0].verts[1][0] = M_SQRT2;
cuberight[0].verts[1][1] = 0;
cuberight[0].verts[1][2] = -1.0;
cuberight[0].u[1] = uv_ratio;
cuberight[0].v[1] = 0;
- cuberight[0].verts[2][0] = sqrt_2;
+ cuberight[0].verts[2][0] = M_SQRT2;
cuberight[0].verts[2][1] = 0;
cuberight[0].verts[2][2] = 1.0;
cuberight[0].u[2] = uv_ratio;
@@ -1207,58 +1205,58 @@ void KX_Dome::CreateMeshPanorama(void)
//second triangle
cuberight[1].verts[0][0] = 0;
- cuberight[1].verts[0][1] = sqrt_2;
+ cuberight[1].verts[0][1] = M_SQRT2;
cuberight[1].verts[0][2] = -1.0;
cuberight[1].u[0] = 0;
cuberight[1].v[0] = 0;
- cuberight[1].verts[1][0] = sqrt_2;
+ cuberight[1].verts[1][0] = M_SQRT2;
cuberight[1].verts[1][1] = 0;
cuberight[1].verts[1][2] = 1.0;
cuberight[1].u[1] = uv_ratio;
cuberight[1].v[1] = uv_ratio;
cuberight[1].verts[2][0] = 0;
- cuberight[1].verts[2][1] = sqrt_2;
+ cuberight[1].verts[2][1] = M_SQRT2;
cuberight[1].verts[2][2] = 1.0;
cuberight[1].u[2] = 0;
cuberight[1].v[2] = uv_ratio;
nfacesright = 2;
- /* Right Back (-135�) face - two triangles */
- cuberightback[0].verts[0][0] = sqrt_2;
+ /* Right Back (-135deg) face - two triangles */
+ cuberightback[0].verts[0][0] = M_SQRT2;
cuberightback[0].verts[0][1] = 0;
cuberightback[0].verts[0][2] = -1.0;
cuberightback[0].u[0] = 0;
cuberightback[0].v[0] = 0;
cuberightback[0].verts[1][0] = 0;
- cuberightback[0].verts[1][1] = -sqrt_2;
+ cuberightback[0].verts[1][1] = -M_SQRT2;
cuberightback[0].verts[1][2] = -1.0;
cuberightback[0].u[1] = uv_ratio;
cuberightback[0].v[1] = 0;
cuberightback[0].verts[2][0] = 0;
- cuberightback[0].verts[2][1] = -sqrt_2;
+ cuberightback[0].verts[2][1] = -M_SQRT2;
cuberightback[0].verts[2][2] = 1.0;
cuberightback[0].u[2] = uv_ratio;
cuberightback[0].v[2] = uv_ratio;
//second triangle
- cuberightback[1].verts[0][0] = sqrt_2;
+ cuberightback[1].verts[0][0] = M_SQRT2;
cuberightback[1].verts[0][1] = 0;
cuberightback[1].verts[0][2] = -1.0;
cuberightback[1].u[0] = 0;
cuberightback[1].v[0] = 0;
cuberightback[1].verts[1][0] = 0;
- cuberightback[1].verts[1][1] = -sqrt_2;
+ cuberightback[1].verts[1][1] = -M_SQRT2;
cuberightback[1].verts[1][2] = 1.0;
cuberightback[1].u[1] = uv_ratio;
cuberightback[1].v[1] = uv_ratio;
- cuberightback[1].verts[2][0] = sqrt_2;
+ cuberightback[1].verts[2][0] = M_SQRT2;
cuberightback[1].verts[2][1] = 0;
cuberightback[1].verts[2][2] = 1.0;
cuberightback[1].u[2] = 0;
@@ -1355,7 +1353,7 @@ void KX_Dome::FlattenDome(MT_Vector3 verts[3])
void KX_Dome::FlattenPanorama(MT_Vector3 verts[3])
{
-// it creates a full spherical panoramic (360�)
+// it creates a full spherical panoramic (360deg)
int i;
double phi;
bool edge=false;
@@ -1448,7 +1446,7 @@ void KX_Dome::SplitFace(vector <DomeFace>& face, int *nfaces)
void KX_Dome::CalculateFrustum(KX_Camera * cam)
{
/*
- // manually creating a 90� Field of View Frustum
+ // manually creating a 90deg Field of View Frustum
the original formula:
top = tan(fov*3.14159/360.0) * near [for fov in degrees]
@@ -1469,7 +1467,7 @@ void KX_Dome::CalculateFrustum(KX_Camera * cam)
m_frustrum.camfar = cam->GetCameraFar();
// float top = tan(90.0*MT_PI/360.0) * m_frustrum.camnear;
- float top = m_frustrum.camnear; // for deg = 90�, tan = 1
+ float top = m_frustrum.camnear; // for deg = 90deg, tan = 1
m_frustrum.x1 = -top;
m_frustrum.x2 = top;
@@ -1484,9 +1482,9 @@ void KX_Dome::CalculateFrustum(KX_Camera * cam)
void KX_Dome::CalculateCameraOrientation()
{
/*
-Uses 4 cameras for angles up to 180�
-Uses 5 cameras for angles up to 250�
-Uses 6 cameras for angles up to 360�
+Uses 4 cameras for angles up to 180deg
+Uses 5 cameras for angles up to 250deg
+Uses 6 cameras for angles up to 360deg
*/
int i;
float deg45 = MT_PI / 4;
@@ -1497,22 +1495,22 @@ Uses 6 cameras for angles up to 360�
|| m_mode == DOME_TRUNCATED_FRONT
|| m_mode == DOME_TRUNCATED_REAR)){
- m_locRot[0] = MT_Matrix3x3( // 90� - Top
+ m_locRot[0] = MT_Matrix3x3( // 90deg - Top
c, -s, 0.0,
0.0,0.0, -1.0,
s, c, 0.0);
- m_locRot[1] = MT_Matrix3x3( // 90� - Bottom
+ m_locRot[1] = MT_Matrix3x3( // 90deg - Bottom
-s, c, 0.0,
0.0,0.0, 1.0,
s, c, 0.0);
- m_locRot[2] = MT_Matrix3x3( // 45� - Left
+ m_locRot[2] = MT_Matrix3x3( // 45deg - Left
c, 0.0, s,
0, 1.0, 0.0,
-s, 0.0, c);
- m_locRot[3] = MT_Matrix3x3( // 45� - Right
+ m_locRot[3] = MT_Matrix3x3( // 45deg - Right
c, 0.0, -s,
0.0, 1.0, 0.0,
s, 0.0, c);
@@ -1521,32 +1519,32 @@ Uses 6 cameras for angles up to 360�
|| m_mode == DOME_TRUNCATED_FRONT
|| m_mode == DOME_TRUNCATED_REAR))){
- m_locRot[0] = MT_Matrix3x3( // 90� - Top
+ m_locRot[0] = MT_Matrix3x3( // 90deg - Top
1.0, 0.0, 0.0,
0.0, 0.0,-1.0,
0.0, 1.0, 0.0);
- m_locRot[1] = MT_Matrix3x3( // 90� - Bottom
+ m_locRot[1] = MT_Matrix3x3( // 90deg - Bottom
1.0, 0.0, 0.0,
0.0, 0.0, 1.0,
0.0,-1.0, 0.0);
- m_locRot[2] = MT_Matrix3x3( // -90� - Left
+ m_locRot[2] = MT_Matrix3x3( // -90deg - Left
0.0, 0.0, 1.0,
0.0, 1.0, 0.0,
-1.0, 0.0, 0.0);
- m_locRot[3] = MT_Matrix3x3( // 90� - Right
+ m_locRot[3] = MT_Matrix3x3( // 90deg - Right
0.0, 0.0,-1.0,
0.0, 1.0, 0.0,
1.0, 0.0, 0.0);
- m_locRot[4] = MT_Matrix3x3( // 0� - Front
+ m_locRot[4] = MT_Matrix3x3( // 0deg - Front
1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0);
- m_locRot[5] = MT_Matrix3x3( // 180� - Back - USED for ENVMAP only
+ m_locRot[5] = MT_Matrix3x3( // 180deg - Back - USED for ENVMAP only
-1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0,-1.0);
@@ -1563,22 +1561,22 @@ Uses 6 cameras for angles up to 360�
0.0 ,0.0, 1.0,
s, -c, 0.0);
- m_locRot[2] = MT_Matrix3x3( // 45� - Left
+ m_locRot[2] = MT_Matrix3x3( // 45deg - Left
-s, 0.0, c,
0, 1.0, 0.0,
-c, 0.0, -s);
- m_locRot[3] = MT_Matrix3x3( // 45� - Right
+ m_locRot[3] = MT_Matrix3x3( // 45deg - Right
c, 0.0, s,
0, 1.0, 0.0,
-s, 0.0, c);
- m_locRot[4] = MT_Matrix3x3( // 135� - LeftBack
+ m_locRot[4] = MT_Matrix3x3( // 135deg - LeftBack
-s, 0.0, -c,
0.0, 1.0, 0.0,
c, 0.0, -s);
- m_locRot[5] = MT_Matrix3x3( // 135� - RightBack
+ m_locRot[5] = MT_Matrix3x3( // 135deg - RightBack
c, 0.0, -s,
0.0, 1.0, 0.0,
s, 0.0, c);
@@ -1737,7 +1735,7 @@ void KX_Dome::DrawEnvMap(void)
glVertex3f(-onebythree,-2 * onebythree, 3.0f);
glEnd();
- // domefacesId[2] => -90� (left)
+ // domefacesId[2] => -90deg (left)
glBindTexture(GL_TEXTURE_2D, domefacesId[2]);
glBegin(GL_QUADS);
glTexCoord2f(uv_ratio,uv_ratio);
@@ -1750,7 +1748,7 @@ void KX_Dome::DrawEnvMap(void)
glVertex3f(-onebythree, 0.0f, 3.0f);
glEnd();
- // domefacesId[3] => 90� (right)
+ // domefacesId[3] => 90deg (right)
glBindTexture(GL_TEXTURE_2D, domefacesId[3]);
glBegin(GL_QUADS);
glTexCoord2f(uv_ratio,uv_ratio);
@@ -1763,7 +1761,7 @@ void KX_Dome::DrawEnvMap(void)
glVertex3f(1.0f, 0.0f, 3.0f);
glEnd();
- // domefacesId[4] => 0� (front)
+ // domefacesId[4] => 0deg (front)
glBindTexture(GL_TEXTURE_2D, domefacesId[4]);
glBegin(GL_QUADS);
glTexCoord2f(uv_ratio,uv_ratio);
@@ -1776,7 +1774,7 @@ void KX_Dome::DrawEnvMap(void)
glVertex3f(1.0f, -2 * onebythree, 3.0f);
glEnd();
- // domefacesId[5] => 180� (back)
+ // domefacesId[5] => 180deg (back)
glBindTexture(GL_TEXTURE_2D, domefacesId[5]);
glBegin(GL_QUADS);
glTexCoord2f(uv_ratio,uv_ratio);
@@ -1953,19 +1951,19 @@ void KX_Dome::DrawPanorama(void)
glBindTexture(GL_TEXTURE_2D, domefacesId[1]);
GLDrawTriangles(cubebottom, nfacesbottom);
- // domefacesId[1] => -45� (left)
+ // domefacesId[1] => -45deg (left)
glBindTexture(GL_TEXTURE_2D, domefacesId[2]);
GLDrawTriangles(cubeleft, nfacesleft);
- // domefacesId[2] => 45� (right)
+ // domefacesId[2] => 45deg (right)
glBindTexture(GL_TEXTURE_2D, domefacesId[3]);
GLDrawTriangles(cuberight, nfacesright);
- // domefacesId[0] => -135� (leftback)
+ // domefacesId[0] => -135deg (leftback)
glBindTexture(GL_TEXTURE_2D, domefacesId[4]);
GLDrawTriangles(cubeleftback, nfacesleftback);
- // domefacesId[3] => 135� (rightback)
+ // domefacesId[3] => 135deg (rightback)
glBindTexture(GL_TEXTURE_2D, domefacesId[5]);
GLDrawTriangles(cuberightback, nfacesrightback);
}
diff --git a/source/gameengine/Ketsji/KX_FontObject.cpp b/source/gameengine/Ketsji/KX_FontObject.cpp
new file mode 100644
index 00000000000..7056b0bee53
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_FontObject.cpp
@@ -0,0 +1,157 @@
+/**
+ * $Id: KX_FontObject.cpp 34077 2011-01-04 21:27:44Z dfelinto $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#include "KX_FontObject.h"
+#include "DNA_curve_types.h"
+#include "KX_Scene.h"
+#include "KX_PythonInit.h"
+#include "BLI_math.h"
+
+extern "C" {
+#include "BLF_api.h"
+}
+
+#define BGE_FONT_RES 100
+
+KX_FontObject::KX_FontObject( void* sgReplicationInfo,
+ SG_Callbacks callbacks,
+ RAS_IRenderTools* rendertools,
+ Object *ob):
+ KX_GameObject(sgReplicationInfo, callbacks),
+ m_object(ob),
+ m_dpi(72),
+ m_resolution(1.f),
+ m_rendertools(rendertools)
+{
+ Curve *text = static_cast<Curve *> (ob->data);
+ m_text = text->str;
+ m_fsize = text->fsize;
+
+ /* FO_BUILTIN_NAME != "default" */
+ /* I hope at some point Blender (2.5x) can have a single font */
+ /* with unicode support for ui and OB_FONT */
+ /* once we have packed working we can load the FO_BUILTIN_NAME font */
+ const char* filepath = text->vfont->name;
+ if (strcmp(FO_BUILTIN_NAME, filepath) == 0)
+ filepath = "default";
+
+ /* XXX - if it's packed it will not work. waiting for bdiego (Diego) fix for that. */
+ m_fontid = BLF_load(filepath);
+ if (m_fontid == -1)
+ m_fontid = BLF_load("default");
+
+ /* initialize the color with the object color and store it in the KX_Object class
+ This is a workaround waiting for the fix:
+ [#25487] BGE: Object Color only works when it has a keyed frame */
+ copy_v4_v4(m_color, (const float*) ob->col);
+ this->SetObjectColor((const MT_Vector4&) m_color);
+}
+
+KX_FontObject::~KX_FontObject()
+{
+ //remove font from the scene list
+ //it's handled in KX_Scene::NewRemoveObject
+}
+
+CValue* KX_FontObject::GetReplica() {
+ KX_FontObject* replica = new KX_FontObject(*this);
+ replica->ProcessReplica();
+ return replica;
+}
+
+void KX_FontObject::ProcessReplica()
+{
+ KX_GameObject::ProcessReplica();
+ KX_GetActiveScene()->AddFont(this);
+}
+
+void KX_FontObject::DrawText()
+{
+ /* only draws the text if visible */
+ if(this->GetVisible() == 0) return;
+
+ /* update the animated color */
+ this->GetObjectColor().getValue(m_color);
+
+ /* XXX 2DO - handle multiple lines */
+ /* HARDCODED MULTIPLICATION FACTOR - this will affect the render resolution directly */
+ float RES = BGE_FONT_RES * m_resolution;
+
+ float size = m_fsize * m_object->size[0] * RES;
+ float aspect = 1.f / (m_object->size[0] * RES);
+
+ m_rendertools->RenderText3D(m_fontid, m_text, int(size), m_dpi, m_color, this->GetOpenGLMatrix(), aspect);
+}
+
+#ifdef WITH_PYTHON
+
+/* ------------------------------------------------------------------------- */
+/* Python Integration Hooks */
+/* ------------------------------------------------------------------------- */
+
+PyTypeObject KX_FontObject::Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "KX_FontObject",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,
+ &KX_GameObject::Sequence,
+ &KX_GameObject::Mapping,
+ 0,0,0,
+ NULL,
+ NULL,
+ 0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &KX_GameObject::Type,
+ 0,0,0,0,0,0,
+ py_base_new
+};
+
+PyMethodDef KX_FontObject::Methods[] = {
+ {NULL,NULL} //Sentinel
+};
+
+PyAttributeDef KX_FontObject::Attributes[] = {
+ KX_PYATTRIBUTE_STRING_RW("text", 0, 280, false, KX_FontObject, m_text), //arbitrary limit. 280 = 140 unicode chars in unicode
+ KX_PYATTRIBUTE_FLOAT_RW("size", 0.0001f, 10000.0f, KX_FontObject, m_fsize),
+ KX_PYATTRIBUTE_FLOAT_RW("resolution", 0.0001f, 10000.0f, KX_FontObject, m_resolution),
+ /* KX_PYATTRIBUTE_INT_RW("dpi", 0, 10000, false, KX_FontObject, m_dpi), */// no real need for expose this I think
+ { NULL } //Sentinel
+};
+
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_FontObject.h b/source/gameengine/Ketsji/KX_FontObject.h
new file mode 100644
index 00000000000..99f3f2b713d
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_FontObject.h
@@ -0,0 +1,80 @@
+/**
+ * $Id: KX_FontObject.h 34077 2011-01-04 21:27:44Z dfelinto $
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#ifndef __KX_FONTOBJECT
+#define __KX_FONTOBJECT
+#include "KX_GameObject.h"
+#include "DNA_vfont_types.h"
+#include "RAS_IRenderTools.h"
+
+class KX_FontObject : public KX_GameObject
+{
+public:
+ Py_Header;
+ KX_FontObject( void* sgReplicationInfo,
+ SG_Callbacks callbacks,
+ RAS_IRenderTools* rendertools,
+ Object *ob);
+
+ virtual ~KX_FontObject();
+
+ void DrawText();
+
+ /**
+ * Inherited from CValue -- return a new copy of this
+ * instance allocated on the heap. Ownership of the new
+ * object belongs with the caller.
+ */
+ virtual CValue* GetReplica();
+ virtual void ProcessReplica();
+
+protected:
+ STR_String m_text;
+ Object* m_object;
+ int m_fontid;
+ int m_dpi;
+ float m_fsize;
+ float m_resolution;
+ float m_color[4];
+
+ class RAS_IRenderTools* m_rendertools; //needed for drawing routine
+
+/*
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_FontObject"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
+*/
+
+#ifdef WITH_PYTHON
+#endif
+
+};
+
+#endif //__KX_FONTOBJECT
diff --git a/source/gameengine/Ketsji/KX_GameActuator.cpp b/source/gameengine/Ketsji/KX_GameActuator.cpp
index 208c526398a..4929187c3ee 100644
--- a/source/gameengine/Ketsji/KX_GameActuator.cpp
+++ b/source/gameengine/Ketsji/KX_GameActuator.cpp
@@ -29,6 +29,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
+
#include "SCA_IActuator.h"
#include "KX_GameActuator.h"
//#include <iostream>
@@ -124,7 +126,7 @@ bool KX_GameActuator::Update()
}
case KX_GAME_SAVECFG:
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if (m_ketsjiengine)
{
char mashal_path[512];
@@ -152,11 +154,11 @@ bool KX_GameActuator::Update()
delete [] marshal_buffer;
}
break;
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
}
case KX_GAME_LOADCFG:
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if (m_ketsjiengine)
{
char mashal_path[512];
@@ -191,7 +193,7 @@ bool KX_GameActuator::Update()
}
}
break;
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
}
default:
; /* do nothing? this is an internal error !!! */
@@ -201,7 +203,7 @@ bool KX_GameActuator::Update()
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -241,4 +243,4 @@ PyAttributeDef KX_GameActuator::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp
index e955c344f0a..8cab7c17d8a 100644
--- a/source/gameengine/Ketsji/KX_GameObject.cpp
+++ b/source/gameengine/Ketsji/KX_GameObject.cpp
@@ -47,6 +47,7 @@ typedef unsigned long uint_ptr;
#include "KX_GameObject.h"
#include "KX_Camera.h" // only for their ::Type
#include "KX_Light.h" // only for their ::Type
+#include "KX_FontObject.h" // only for their ::Type
#include "RAS_MeshObject.h"
#include "KX_MeshProxy.h"
#include "KX_PolyProxy.h"
@@ -102,9 +103,9 @@ KX_GameObject::KX_GameObject(
m_pGraphicController(NULL),
m_xray(false),
m_pHitObject(NULL),
- m_pObstacleSimulation(NULL),
- m_isDeformable(false)
-#ifndef DISABLE_PYTHON
+ m_isDeformable(false),
+ m_pObstacleSimulation(NULL)
+#ifdef WITH_PYTHON
, m_attr_dict(NULL)
#endif
{
@@ -156,12 +157,12 @@ KX_GameObject::~KX_GameObject()
m_pObstacleSimulation->DestroyObstacleForObj(this);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if (m_attr_dict) {
PyDict_Clear(m_attr_dict); /* incase of circular refs or other weired cases */
Py_DECREF(m_attr_dict);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
}
KX_GameObject* KX_GameObject::GetClientObject(KX_ClientObjectInfo* info)
@@ -364,7 +365,7 @@ void KX_GameObject::ProcessReplica()
obssimulation->AddObstacleForObj(this);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if(m_attr_dict)
m_attr_dict= PyDict_Copy(m_attr_dict);
#endif
@@ -1038,7 +1039,7 @@ void KX_GameObject::NodeSetGlobalOrientation(const MT_Matrix3x3& rot)
if (GetSGNode()->GetSGParent())
GetSGNode()->SetLocalOrientation(GetSGNode()->GetSGParent()->GetWorldOrientation().inverse()*rot);
else
- GetSGNode()->SetLocalOrientation(rot);
+ NodeSetLocalOrientation(rot);
}
void KX_GameObject::NodeSetLocalScale(const MT_Vector3& scale)
@@ -1282,7 +1283,9 @@ static int mathutils_kxgameob_vector_get(BaseMathObject *bmo, int subtype)
KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(bmo->cb_user);
if(self==NULL)
return 0;
-
+
+#define PHYS_ERR(attr) PyErr_SetString(PyExc_AttributeError, "KX_GameObject." attr ", is missing a physics controller")
+
switch(subtype) {
case MATHUTILS_VEC_CB_POS_LOCAL:
self->NodeGetLocalPosition().getValue(bmo->data);
@@ -1297,31 +1300,33 @@ static int mathutils_kxgameob_vector_get(BaseMathObject *bmo, int subtype)
self->NodeGetWorldScaling().getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_INERTIA_LOCAL:
- if(!self->GetPhysicsController()) return 0;
+ if(!self->GetPhysicsController()) return PHYS_ERR("localInertia"), 0;
self->GetPhysicsController()->GetLocalInertia().getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_OBJECT_COLOR:
self->GetObjectColor().getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_LINVEL_LOCAL:
- if(!self->GetPhysicsController()) return 0;
+ if(!self->GetPhysicsController()) return PHYS_ERR("localLinearVelocity"), 0;
self->GetLinearVelocity(true).getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_LINVEL_GLOBAL:
- if(!self->GetPhysicsController()) return 0;
+ if(!self->GetPhysicsController()) return PHYS_ERR("worldLinearVelocity"), 0;
self->GetLinearVelocity(false).getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_ANGVEL_LOCAL:
- if(!self->GetPhysicsController()) return 0;
+ if(!self->GetPhysicsController()) return PHYS_ERR("localLinearVelocity"), 0;
self->GetAngularVelocity(true).getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_ANGVEL_GLOBAL:
- if(!self->GetPhysicsController()) return 0;
+ if(!self->GetPhysicsController()) return PHYS_ERR("worldLinearVelocity"), 0;
self->GetAngularVelocity(false).getValue(bmo->data);
break;
}
+#undef PHYS_ERR
+
return 1;
}
@@ -1464,7 +1469,7 @@ void KX_GameObject_Mathutils_Callback_Init(void)
#endif // USE_MATHUTILS
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------- python stuff ---------------------------------------------------*/
PyMethodDef KX_GameObject::Methods[] = {
{"applyForce", (PyCFunction) KX_GameObject::sPyApplyForce, METH_VARARGS},
@@ -1512,6 +1517,7 @@ PyMethodDef KX_GameObject::Methods[] = {
PyAttributeDef KX_GameObject::Attributes[] = {
KX_PYATTRIBUTE_RO_FUNCTION("name", KX_GameObject, pyattr_get_name),
KX_PYATTRIBUTE_RO_FUNCTION("parent", KX_GameObject, pyattr_get_parent),
+ KX_PYATTRIBUTE_RO_FUNCTION("life", KX_GameObject, pyattr_get_life),
KX_PYATTRIBUTE_RW_FUNCTION("mass", KX_GameObject, pyattr_get_mass, pyattr_set_mass),
KX_PYATTRIBUTE_RW_FUNCTION("linVelocityMin", KX_GameObject, pyattr_get_lin_vel_min, pyattr_set_lin_vel_min),
KX_PYATTRIBUTE_RW_FUNCTION("linVelocityMax", KX_GameObject, pyattr_get_lin_vel_max, pyattr_set_lin_vel_max),
@@ -1590,11 +1596,11 @@ PyObject* KX_GameObject::PyReinstancePhysicsMesh(PyObject* args)
) {
return NULL;
}
-
+#ifdef USE_BULLET
/* gameobj and mesh can be NULL */
if(KX_ReInstanceBulletShapeFromMesh(this, gameobj, mesh))
Py_RETURN_TRUE;
-
+#endif
Py_RETURN_FALSE;
}
@@ -1803,6 +1809,19 @@ PyObject* KX_GameObject::pyattr_get_parent(void *self_v, const KX_PYATTRIBUTE_DE
Py_RETURN_NONE;
}
+PyObject* KX_GameObject::pyattr_get_life(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
+
+ CValue *life = self->GetProperty("::timebomb");
+ if (life)
+ // this convert the timebomb seconds to frames, hard coded 50.0 (assuming 50fps)
+ // value hardcoded in KX_Scene::AddReplicaObject()
+ return PyFloat_FromDouble(life->GetNumber() * 50.0);
+ else
+ Py_RETURN_NONE;
+}
+
PyObject* KX_GameObject::pyattr_get_mass(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
@@ -3032,7 +3051,8 @@ bool ConvertPythonToGameObject(PyObject * value, KX_GameObject **object, bool py
if ( PyObject_TypeCheck(value, &KX_GameObject::Type) ||
PyObject_TypeCheck(value, &KX_LightObject::Type) ||
- PyObject_TypeCheck(value, &KX_Camera::Type) )
+ PyObject_TypeCheck(value, &KX_Camera::Type) ||
+ PyObject_TypeCheck(value, &KX_FontObject::Type))
{
*object = static_cast<KX_GameObject*>BGE_PROXY_REF(value);
@@ -3055,4 +3075,4 @@ bool ConvertPythonToGameObject(PyObject * value, KX_GameObject **object, bool py
return false;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h
index 5d7f3948a61..4ca979786ae 100644
--- a/source/gameengine/Ketsji/KX_GameObject.h
+++ b/source/gameengine/Ketsji/KX_GameObject.h
@@ -36,6 +36,7 @@
#pragma warning (disable : 4355)
#endif
+#include <stddef.h>
#include "ListValue.h"
#include "SCA_IObject.h"
@@ -61,7 +62,7 @@ class PHY_IPhysicsEnvironment;
struct Object;
class KX_ObstacleSimulation;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* utility conversion function */
bool ConvertPythonToGameObject(PyObject * value, KX_GameObject **object, bool py_none_ok, const char *error_prefix);
#endif
@@ -110,7 +111,7 @@ protected:
MT_CmMatrix4x4 m_OpenGL_4x4Matrix;
KX_ObstacleSimulation* m_pObstacleSimulation;
-
+
public:
bool m_isDeformable;
@@ -119,7 +120,7 @@ public:
*/
static KX_GameObject* GetClientObject(KX_ClientObjectInfo* info);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// Python attributes that wont convert into CValue
//
// there are 2 places attributes can be stored, in the CValue,
@@ -798,20 +799,18 @@ public:
{
m_pObstacleSimulation = obstacleSimulation;
}
-
+
void UnregisterObstacle()
{
m_pObstacleSimulation = NULL;
}
-
-
+
KX_ClientObjectInfo* getClientInfo() { return m_pClient_info; }
CListValue* GetChildren();
CListValue* GetChildrenRecursive();
-
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/**
* @section Python interface functions.
*/
@@ -871,6 +870,7 @@ public:
static PyObject* pyattr_get_name(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_parent(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_life(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_mass(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_mass(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_lin_vel_min(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/Ketsji/KX_IpoActuator.cpp b/source/gameengine/Ketsji/KX_IpoActuator.cpp
index eca40cafb0e..d6ff1ee822e 100644
--- a/source/gameengine/Ketsji/KX_IpoActuator.cpp
+++ b/source/gameengine/Ketsji/KX_IpoActuator.cpp
@@ -81,7 +81,7 @@ KX_IpoActuator::KX_IpoActuator(SCA_IObject* gameobj,
m_ipo_local(ipo_local),
m_type(acttype)
{
- m_starttime = -2.0*fabs(m_endframe - m_startframe) - 1.0;
+ this->ResetStartTime();
m_bIpoPlaying = false;
}
@@ -176,7 +176,7 @@ bool KX_IpoActuator::Update(double curtime, bool frame)
bool result=true;
if (!bNegativeEvent)
{
- if (m_starttime < -2.0f*start_smaller_then_end*(m_endframe - m_startframe))
+ if (m_starttime < -2.0f*fabs(m_endframe - m_startframe))
{
// start for all Ipo, initial start for LOOP_STOP
m_starttime = curtime;
@@ -371,13 +371,18 @@ bool KX_IpoActuator::Update(double curtime, bool frame)
if (!result)
{
if (m_type != KX_ACT_IPO_LOOPSTOP)
- m_starttime = -2.0*start_smaller_then_end*(m_endframe - m_startframe) - 1.0;
+ this->ResetStartTime();
m_bIpoPlaying = false;
}
return result;
}
+void KX_IpoActuator::ResetStartTime()
+{
+ this->m_starttime = -2.0*fabs(this->m_endframe - this->m_startframe) - 1.0;
+}
+
int KX_IpoActuator::string2mode(char* modename) {
IpoActType res = KX_ACT_IPO_NODEF;
@@ -400,7 +405,7 @@ int KX_IpoActuator::string2mode(char* modename) {
return res;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -435,8 +440,8 @@ PyMethodDef KX_IpoActuator::Methods[] = {
};
PyAttributeDef KX_IpoActuator::Attributes[] = {
- KX_PYATTRIBUTE_FLOAT_RW("frameStart", 0, 300000, KX_IpoActuator, m_startframe),
- KX_PYATTRIBUTE_FLOAT_RW("frameEnd", 0, 300000, KX_IpoActuator, m_endframe),
+ KX_PYATTRIBUTE_RW_FUNCTION("frameStart", KX_IpoActuator, pyattr_get_frame_start, pyattr_set_frame_start),
+ KX_PYATTRIBUTE_RW_FUNCTION("frameEnd", KX_IpoActuator, pyattr_get_frame_end, pyattr_set_frame_end),
KX_PYATTRIBUTE_STRING_RW("propName", 0, 64, false, KX_IpoActuator, m_propname),
KX_PYATTRIBUTE_STRING_RW("framePropName", 0, 64, false, KX_IpoActuator, m_framepropname),
KX_PYATTRIBUTE_INT_RW("mode", KX_ACT_IPO_NODEF+1, KX_ACT_IPO_MAX-1, true, KX_IpoActuator, m_type),
@@ -448,6 +453,48 @@ PyAttributeDef KX_IpoActuator::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+PyObject* KX_IpoActuator::pyattr_get_frame_start(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_IpoActuator* self= static_cast<KX_IpoActuator*>(self_v);
+ return PyFloat_FromDouble(self->m_startframe);
+}
+
+int KX_IpoActuator::pyattr_set_frame_start(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_IpoActuator* self= static_cast<KX_IpoActuator*>(self_v);
+ float param = PyFloat_AsDouble(value);
+
+ if (PyErr_Occurred()) {
+ PyErr_SetString(PyExc_AttributeError, "frameStart = float: KX_IpoActuator, expected a float value");
+ return PY_SET_ATTR_FAIL;
+ }
+
+ self->m_startframe = param;
+ self->ResetStartTime();
+ return PY_SET_ATTR_SUCCESS;
+}
+
+PyObject* KX_IpoActuator::pyattr_get_frame_end(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_IpoActuator* self= static_cast<KX_IpoActuator*>(self_v);
+ return PyFloat_FromDouble(self->m_endframe);
+}
+
+int KX_IpoActuator::pyattr_set_frame_end(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_IpoActuator* self= static_cast<KX_IpoActuator*>(self_v);
+ float param = PyFloat_AsDouble(value);
+
+ if (PyErr_Occurred()) {
+ PyErr_SetString(PyExc_AttributeError, "frameEnd = float: KX_IpoActuator, expected a float value");
+ return PY_SET_ATTR_FAIL;
+ }
+
+ self->m_endframe = param;
+ self->ResetStartTime();
+ return PY_SET_ATTR_SUCCESS;
+}
+
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/Ketsji/KX_IpoActuator.h b/source/gameengine/Ketsji/KX_IpoActuator.h
index cefd00c4ae3..61e7f0451d1 100644
--- a/source/gameengine/Ketsji/KX_IpoActuator.h
+++ b/source/gameengine/Ketsji/KX_IpoActuator.h
@@ -86,6 +86,9 @@ protected:
bool m_bIpoPlaying;
+ /** Reset/Update the start time*/
+ void ResetStartTime();
+
public:
enum IpoActType
{
@@ -100,6 +103,12 @@ public:
KX_ACT_IPO_MAX
};
+#ifdef WITH_PYTHON
+ static PyObject* pyattr_get_frame_start(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static int pyattr_set_frame_start(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static PyObject* pyattr_get_frame_end(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static int pyattr_set_frame_end(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+#endif
static const char *S_KX_ACT_IPO_PLAY_STRING;
static const char *S_KX_ACT_IPO_PINGPONG_STRING;
static const char *S_KX_ACT_IPO_FLIPPER_STRING;
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
index 1e8e896cff6..0eec3bd8731 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
@@ -55,6 +55,7 @@
#include "KX_Scene.h"
#include "MT_CmMatrix4x4.h"
#include "KX_Camera.h"
+#include "KX_FontObject.h"
#include "KX_Dome.h"
#include "KX_Light.h"
#include "KX_PythonInit.h"
@@ -114,7 +115,7 @@ KX_KetsjiEngine::KX_KetsjiEngine(KX_ISystem* system)
m_rendertools(NULL),
m_sceneconverter(NULL),
m_networkdevice(NULL),
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
m_pythondictionary(NULL),
#endif
m_keyboarddevice(NULL),
@@ -235,7 +236,7 @@ void KX_KetsjiEngine::SetRasterizer(RAS_IRasterizer* rasterizer)
m_rasterizer = rasterizer;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/*
* At the moment the bge.logic module is imported into 'pythondictionary' after this function is called.
* if this function ever changes to assign a copy, make sure the game logic module is imported into this dictionary before hand.
@@ -341,7 +342,7 @@ void KX_KetsjiEngine::RenderDome()
m_rendertools->MotionBlur(m_rasterizer);
scene->Render2DFilters(m_canvas);
// no RunDrawingCallBacks
- // no FlushDebugShapes
+ // no FlushDebugLines
}
m_dome->BindImages(i);
}
@@ -372,7 +373,7 @@ void KX_KetsjiEngine::RenderDome()
}
m_dome->Draw();
// Draw Callback for the last scene
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
scene->RunDrawingCallbacks(scene->GetPostDrawCB());
#endif
EndFrame();
@@ -614,7 +615,7 @@ else
m_logger->StartLog(tc_physics, m_kxsystem->GetTimeInSeconds(), true);
SG_SetActiveStage(SG_STAGE_PHYSICS1);
// set Python hooks for each scene
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PHY_SetActiveEnvironment(scene->GetPhysicsEnvironment());
#endif
KX_SetActiveScene(scene);
@@ -718,7 +719,7 @@ else
m_suspendeddelta = scene->getSuspendedDelta();
// set Python hooks for each scene
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PHY_SetActiveEnvironment(scene->GetPhysicsEnvironment());
#endif
KX_SetActiveScene(scene);
@@ -948,6 +949,14 @@ int KX_KetsjiEngine::GetExitCode()
if (m_scenes.begin()==m_scenes.end())
m_exitcode = KX_EXIT_REQUEST_NO_SCENES_LEFT;
}
+
+ // check if the window has been closed.
+ if(!m_exitcode)
+ {
+ //if(!m_canvas->Check()) {
+ // m_exitcode = KX_EXIT_REQUEST_OUTSIDE;
+ //}
+ }
return m_exitcode;
}
@@ -1289,16 +1298,32 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
m_logger->StartLog(tc_rasterizer, m_kxsystem->GetTimeInSeconds(), true);
SG_SetActiveStage(SG_STAGE_RENDER);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// Run any pre-drawing python callbacks
scene->RunDrawingCallbacks(scene->GetPreDrawCB());
#endif
scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
+
+ //render all the font objects for this scene
+ RenderFonts(scene);
if (scene->GetPhysicsEnvironment())
scene->GetPhysicsEnvironment()->debugDrawWorld();
}
+
+void KX_KetsjiEngine::RenderFonts(KX_Scene* scene)
+{
+ list<class KX_FontObject*>* fonts = scene->GetFonts();
+
+ list<KX_FontObject*>::iterator it = fonts->begin();
+ while(it != fonts->end())
+ {
+ (*it)->DrawText();
+ ++it;
+ }
+}
+
/*
To run once per scene
*/
@@ -1306,7 +1331,7 @@ void KX_KetsjiEngine::PostRenderScene(KX_Scene* scene)
{
m_rendertools->MotionBlur(m_rasterizer);
scene->Render2DFilters(m_canvas);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
scene->RunDrawingCallbacks(scene->GetPostDrawCB());
#endif
m_rasterizer->FlushDebugShapes();
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.h b/source/gameengine/Ketsji/KX_KetsjiEngine.h
index f52ec8192cc..8b07a998c33 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.h
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.h
@@ -70,7 +70,7 @@ private:
class RAS_IRenderTools* m_rendertools;
class KX_ISceneConverter* m_sceneconverter;
class NG_NetworkDeviceInterface* m_networkdevice;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* borrowed from sys.modules["__main__"], dont manage ref's */
PyObject* m_pythondictionary;
#endif
@@ -191,6 +191,7 @@ private:
void RenderShadowBuffers(KX_Scene *scene);
void SetBackGround(KX_WorldInfo* worldinfo);
void DoSound(KX_Scene* scene);
+ void RenderFonts(KX_Scene* scene);
public:
KX_KetsjiEngine(class KX_ISystem* system);
@@ -204,7 +205,7 @@ public:
void SetCanvas(RAS_ICanvas* canvas);
void SetRenderTools(RAS_IRenderTools* rendertools);
void SetRasterizer(RAS_IRasterizer* rasterizer);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
void SetPyNamespace(PyObject* pythondictionary);
PyObject* GetPyNamespace(){return m_pythondictionary;};
#endif
diff --git a/source/gameengine/Ketsji/KX_Light.cpp b/source/gameengine/Ketsji/KX_Light.cpp
index e282d7ac375..3e03a33e82f 100644
--- a/source/gameengine/Ketsji/KX_Light.cpp
+++ b/source/gameengine/Ketsji/KX_Light.cpp
@@ -180,7 +180,7 @@ GPULamp *KX_LightObject::GetGPULamp()
if(m_glsl)
return GPU_lamp_from_blender(m_blenderscene, GetBlenderObject(), GetBlenderGroupObject());
else
- return false;
+ return NULL;
}
void KX_LightObject::Update()
@@ -259,7 +259,7 @@ void KX_LightObject::UnbindShadowBuffer(RAS_IRasterizer *ras)
GPU_lamp_shadow_buffer_unbind(lamp);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python Integration Hooks */
/* ------------------------------------------------------------------------- */
@@ -301,7 +301,6 @@ PyAttributeDef KX_LightObject::Attributes[] = {
KX_PYATTRIBUTE_FLOAT_RW("energy", 0, 10, KX_LightObject, m_lightobj.m_energy),
KX_PYATTRIBUTE_FLOAT_RW("distance", 0.01, 5000, KX_LightObject, m_lightobj.m_distance),
KX_PYATTRIBUTE_RW_FUNCTION("color", KX_LightObject, pyattr_get_color, pyattr_set_color),
- KX_PYATTRIBUTE_RW_FUNCTION("colour", KX_LightObject, pyattr_get_color, pyattr_set_color),
KX_PYATTRIBUTE_FLOAT_RW("lin_attenuation", 0, 1, KX_LightObject, m_lightobj.m_att1),
KX_PYATTRIBUTE_FLOAT_RW("quad_attenuation", 0, 1, KX_LightObject, m_lightobj.m_att2),
KX_PYATTRIBUTE_FLOAT_RW("spotsize", 1, 180, KX_LightObject, m_lightobj.m_spotsize),
@@ -385,4 +384,4 @@ int KX_LightObject::pyattr_set_type(void* self_v, const KX_PYATTRIBUTE_DEF *attr
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_Light.h b/source/gameengine/Ketsji/KX_Light.h
index 334aed1995d..f7b40d24293 100644
--- a/source/gameengine/Ketsji/KX_Light.h
+++ b/source/gameengine/Ketsji/KX_Light.h
@@ -69,7 +69,7 @@ public:
virtual int GetGameObjectType() { return OBJ_LIGHT; }
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* attributes */
static PyObject* pyattr_get_color(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_color(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject* value);
diff --git a/source/gameengine/Ketsji/KX_MeshProxy.cpp b/source/gameengine/Ketsji/KX_MeshProxy.cpp
index a5ff7ebcbc1..6fa7e023139 100644
--- a/source/gameengine/Ketsji/KX_MeshProxy.cpp
+++ b/source/gameengine/Ketsji/KX_MeshProxy.cpp
@@ -26,7 +26,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "KX_MeshProxy.h"
#include "RAS_IPolygonMaterial.h"
@@ -181,7 +181,7 @@ PyObject* KX_MeshProxy::PyGetVertex(PyObject* args, PyObject* kwds)
RAS_TexVert* vertex = m_meshobj->GetVertex(matindex,vertexindex);
if(vertex==NULL) {
- PyErr_SetString(PyExc_ValueError, "mesh.getVertex(mat_idx, vert_idx): KX_MeshProxy, could not get a vertex at the given indicies");
+ PyErr_SetString(PyExc_ValueError, "mesh.getVertex(mat_idx, vert_idx): KX_MeshProxy, could not get a vertex at the given indices");
return NULL;
}
@@ -308,4 +308,4 @@ bool ConvertPythonToMesh(PyObject * value, RAS_MeshObject **object, bool py_none
return false;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_MeshProxy.h b/source/gameengine/Ketsji/KX_MeshProxy.h
index 7b627040b4c..29231498163 100644
--- a/source/gameengine/Ketsji/KX_MeshProxy.h
+++ b/source/gameengine/Ketsji/KX_MeshProxy.h
@@ -29,7 +29,7 @@
#ifndef __KX_MESHPROXY
#define __KX_MESHPROXY
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "SCA_IObject.h"
@@ -74,7 +74,7 @@ public:
static PyObject * pyattr_get_numPolygons(void * self, const KX_PYATTRIBUTE_DEF * attrdef);
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
#endif //__KX_MESHPROXY
diff --git a/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp b/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
index 19114c86c98..637210525f8 100644
--- a/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
+++ b/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
@@ -347,7 +347,7 @@ const MT_Vector2& KX_MouseFocusSensor::HitUV() const
return m_hitUV;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -442,7 +442,7 @@ PyObject* KX_MouseFocusSensor::pyattr_get_hit_uv(void *self_v, const KX_PYATTRIB
return PyObjectFrom(self->HitUV());
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/Ketsji/KX_MouseFocusSensor.h b/source/gameengine/Ketsji/KX_MouseFocusSensor.h
index c969aa3ec74..3ea0f932314 100644
--- a/source/gameengine/Ketsji/KX_MouseFocusSensor.h
+++ b/source/gameengine/Ketsji/KX_MouseFocusSensor.h
@@ -94,7 +94,7 @@ class KX_MouseFocusSensor : public SCA_MouseSensor
const MT_Vector3& HitNormal() const;
const MT_Vector2& HitUV() const;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -109,7 +109,7 @@ class KX_MouseFocusSensor : public SCA_MouseSensor
static PyObject* pyattr_get_hit_normal(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_hit_uv(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* --------------------------------------------------------------------- */
SCA_IObject* m_hitObject;
diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.h b/source/gameengine/Ketsji/KX_NavMeshObject.h
index a0b91804db1..78e9488ad1c 100644
--- a/source/gameengine/Ketsji/KX_NavMeshObject.h
+++ b/source/gameengine/Ketsji/KX_NavMeshObject.h
@@ -26,8 +26,8 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef __KX_PATHFINDER
-#define __KX_PATHFINDER
+#ifndef __KX_NAVMESHOBJECT
+#define __KX_NAVMESHOBJECT
#include "DetourStatNavMesh.h"
#include "KX_GameObject.h"
#include "PyObjectPlus.h"
@@ -79,5 +79,5 @@ public:
#endif
};
-#endif //__KX_PATHFINDER
+#endif //__KX_NAVMESHOBJECT
diff --git a/source/gameengine/Ketsji/KX_NearSensor.cpp b/source/gameengine/Ketsji/KX_NearSensor.cpp
index 36c1b0f5bd1..c9af5d8d2a5 100644
--- a/source/gameengine/Ketsji/KX_NearSensor.cpp
+++ b/source/gameengine/Ketsji/KX_NearSensor.cpp
@@ -242,7 +242,7 @@ bool KX_NearSensor::NewHandleCollision(void* obj1,void* obj2,const PHY_CollData
return false; // was DT_CONTINUE; but this was defined in Sumo as false
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python Functions */
@@ -285,4 +285,4 @@ PyAttributeDef KX_NearSensor::Attributes[] = {
{NULL} //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_NearSensor.h b/source/gameengine/Ketsji/KX_NearSensor.h
index 10dba22c4e9..67f235ceae2 100644
--- a/source/gameengine/Ketsji/KX_NearSensor.h
+++ b/source/gameengine/Ketsji/KX_NearSensor.h
@@ -78,7 +78,7 @@ public:
virtual bool BroadPhaseSensorFilterCollision(void*obj1,void*obj2) { return false; };
virtual sensortype GetSensorType() { return ST_NEAR; }
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -99,7 +99,7 @@ public:
return 0;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/Ketsji/KX_ObjectActuator.cpp b/source/gameengine/Ketsji/KX_ObjectActuator.cpp
index 0d0cac3c084..9f1df329005 100644
--- a/source/gameengine/Ketsji/KX_ObjectActuator.cpp
+++ b/source/gameengine/Ketsji/KX_ObjectActuator.cpp
@@ -313,7 +313,7 @@ bool KX_ObjectActuator::isValid(KX_ObjectActuator::KX_OBJECT_ACT_VEC_TYPE type)
return res;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -636,6 +636,6 @@ int KX_ObjectActuator::pyattr_set_reference(void *self, const struct KX_PYATTRIB
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/Ketsji/KX_ObjectActuator.h b/source/gameengine/Ketsji/KX_ObjectActuator.h
index b12cf77d3e1..9dab1e39cba 100644
--- a/source/gameengine/Ketsji/KX_ObjectActuator.h
+++ b/source/gameengine/Ketsji/KX_ObjectActuator.h
@@ -157,7 +157,7 @@ public:
}
virtual bool Update();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -217,7 +217,7 @@ public:
return 0;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/Ketsji/KX_ParentActuator.cpp b/source/gameengine/Ketsji/KX_ParentActuator.cpp
index 62740585831..b41d48f5cf3 100644
--- a/source/gameengine/Ketsji/KX_ParentActuator.cpp
+++ b/source/gameengine/Ketsji/KX_ParentActuator.cpp
@@ -130,7 +130,7 @@ bool KX_ParentActuator::Update()
return false;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -199,6 +199,6 @@ int KX_ParentActuator::pyattr_set_object(void *self, const struct KX_PYATTRIBUTE
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/Ketsji/KX_ParentActuator.h b/source/gameengine/Ketsji/KX_ParentActuator.h
index 884b1829ae3..28745c6d0f5 100644
--- a/source/gameengine/Ketsji/KX_ParentActuator.h
+++ b/source/gameengine/Ketsji/KX_ParentActuator.h
@@ -77,7 +77,7 @@ class KX_ParentActuator : public SCA_IActuator
virtual void Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map);
virtual bool UnlinkObject(SCA_IObject* clientobj);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -87,7 +87,7 @@ class KX_ParentActuator : public SCA_IActuator
static PyObject* pyattr_get_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
}; /* end of class KX_ParentActuator : public SCA_PropertyActuator */
diff --git a/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp b/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp
index 15fc3e5c471..471774866ac 100644
--- a/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp
+++ b/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp
@@ -46,7 +46,7 @@ KX_PhysicsObjectWrapper::~KX_PhysicsObjectWrapper()
{
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* KX_PhysicsObjectWrapper::PySetPosition(PyObject* args)
{
diff --git a/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h b/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h
index 01980c0f644..ca7e99350c4 100644
--- a/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h
+++ b/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h
@@ -39,14 +39,14 @@ public:
KX_PhysicsObjectWrapper(class PHY_IPhysicsController* ctrl,class PHY_IPhysicsEnvironment* physenv);
virtual ~KX_PhysicsObjectWrapper();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
KX_PYMETHOD_VARARGS(KX_PhysicsObjectWrapper,SetPosition);
KX_PYMETHOD_VARARGS(KX_PhysicsObjectWrapper,SetLinearVelocity);
KX_PYMETHOD_VARARGS(KX_PhysicsObjectWrapper,SetAngularVelocity);
KX_PYMETHOD_VARARGS(KX_PhysicsObjectWrapper,SetActive);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
private:
class PHY_IPhysicsController* m_ctrl;
diff --git a/source/gameengine/Ketsji/KX_PolyProxy.cpp b/source/gameengine/Ketsji/KX_PolyProxy.cpp
index 9395e57e68b..9843d93c506 100644
--- a/source/gameengine/Ketsji/KX_PolyProxy.cpp
+++ b/source/gameengine/Ketsji/KX_PolyProxy.cpp
@@ -26,7 +26,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "KX_PolyProxy.h"
#include "KX_MeshProxy.h"
@@ -267,4 +267,4 @@ KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getMaterial,
}
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_PolyProxy.h b/source/gameengine/Ketsji/KX_PolyProxy.h
index 3e669630e30..179fb67f85f 100644
--- a/source/gameengine/Ketsji/KX_PolyProxy.h
+++ b/source/gameengine/Ketsji/KX_PolyProxy.h
@@ -29,7 +29,7 @@
#ifndef __KX_POLYROXY
#define __KX_POLYPROXY
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "SCA_IObject.h"
@@ -77,7 +77,7 @@ public:
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
#endif //__KX_POLYPROXY
diff --git a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
index 63204b16e8b..39f017625dd 100644
--- a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
+++ b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
@@ -25,6 +25,9 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+#include <stddef.h>
+
#include "KX_PolygonMaterial.h"
#include "BKE_mesh.h"
@@ -47,6 +50,8 @@
#include "KX_PyMath.h"
+#define KX_POLYGONMATERIAL_CAPSULE_ID "KX_POLYGONMATERIAL_PTR"
+
KX_PolygonMaterial::KX_PolygonMaterial()
: PyObjectPlus(),
RAS_IPolyMaterial(),
@@ -54,7 +59,7 @@ KX_PolygonMaterial::KX_PolygonMaterial()
m_tface(NULL),
m_mcol(NULL),
m_material(NULL),
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
m_pymaterial(NULL),
#endif
m_pass(0)
@@ -90,7 +95,7 @@ void KX_PolygonMaterial::Initialize(
m_tface = tface;
m_mcol = mcol;
m_material = ma;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
m_pymaterial = 0;
#endif
m_pass = 0;
@@ -98,23 +103,28 @@ void KX_PolygonMaterial::Initialize(
KX_PolygonMaterial::~KX_PolygonMaterial()
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if (m_pymaterial)
{
Py_DECREF(m_pymaterial);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
+}
+
+Image *KX_PolygonMaterial::GetBlenderImage() const
+{
+ return (m_tface) ? m_tface->tpage : NULL;
}
bool KX_PolygonMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const
{
bool dopass = false;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if (m_pymaterial)
{
- PyObject *pyRasty = PyCObject_FromVoidPtr((void*)rasty, NULL); /* new reference */
- PyObject *pyCachingInfo = PyCObject_FromVoidPtr((void*) &cachingInfo, NULL); /* new reference */
+ PyObject *pyRasty = PyCapsule_New((void*)rasty, KX_POLYGONMATERIAL_CAPSULE_ID, NULL); /* new reference */
+ PyObject *pyCachingInfo = PyCapsule_New((void*) &cachingInfo, KX_POLYGONMATERIAL_CAPSULE_ID, NULL); /* new reference */
PyObject *ret = PyObject_CallMethod(m_pymaterial, (char *)"activate", (char *)"(NNO)", pyRasty, pyCachingInfo, (PyObject*) this->m_proxy);
if (ret)
{
@@ -130,7 +140,7 @@ bool KX_PolygonMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingI
}
}
else
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
{
switch (m_pass++)
{
@@ -201,7 +211,7 @@ void KX_PolygonMaterial::GetMaterialRGBAColor(unsigned char *rgba) const
RAS_IPolyMaterial::GetMaterialRGBAColor(rgba);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
//----------------------------------------------------------------------------
//Python
@@ -284,10 +294,10 @@ KX_PYMETHODDEF_DOC(KX_PolygonMaterial, setCustomMaterial, "setCustomMaterial(mat
KX_PYMETHODDEF_DOC(KX_PolygonMaterial, updateTexture, "updateTexture(tface, rasty)")
{
PyObject *pyrasty, *pytface;
- if (PyArg_ParseTuple(args, "O!O!:updateTexture", &PyCObject_Type, &pytface, &PyCObject_Type, &pyrasty))
+ if (PyArg_ParseTuple(args, "O!O!:updateTexture", &PyCapsule_Type, &pytface, &PyCapsule_Type, &pyrasty))
{
- MTFace *tface = (MTFace*) PyCObject_AsVoidPtr(pytface);
- RAS_IRasterizer *rasty = (RAS_IRasterizer*) PyCObject_AsVoidPtr(pyrasty);
+ MTFace *tface = (MTFace*) PyCapsule_GetPointer(pytface, KX_POLYGONMATERIAL_CAPSULE_ID);
+ RAS_IRasterizer *rasty = (RAS_IRasterizer*) PyCapsule_GetPointer(pyrasty, KX_POLYGONMATERIAL_CAPSULE_ID);
Image *ima = (Image*)tface->tpage;
GPU_update_image_time(ima, rasty->GetTime());
@@ -300,9 +310,9 @@ KX_PYMETHODDEF_DOC(KX_PolygonMaterial, updateTexture, "updateTexture(tface, rast
KX_PYMETHODDEF_DOC(KX_PolygonMaterial, setTexture, "setTexture(tface)")
{
PyObject *pytface;
- if (PyArg_ParseTuple(args, "O!:setTexture", &PyCObject_Type, &pytface))
+ if (PyArg_ParseTuple(args, "O!:setTexture", &PyCapsule_Type, &pytface))
{
- MTFace *tface = (MTFace*) PyCObject_AsVoidPtr(pytface);
+ MTFace *tface = (MTFace*) PyCapsule_GetPointer(pytface, KX_POLYGONMATERIAL_CAPSULE_ID);
GPU_set_tpage(tface, 1);
Py_RETURN_NONE;
}
@@ -313,10 +323,10 @@ KX_PYMETHODDEF_DOC(KX_PolygonMaterial, setTexture, "setTexture(tface)")
KX_PYMETHODDEF_DOC(KX_PolygonMaterial, activate, "activate(rasty, cachingInfo)")
{
PyObject *pyrasty, *pyCachingInfo;
- if (PyArg_ParseTuple(args, "O!O!:activate", &PyCObject_Type, &pyrasty, &PyCObject_Type, &pyCachingInfo))
+ if (PyArg_ParseTuple(args, "O!O!:activate", &PyCapsule_Type, &pyrasty, &PyCapsule_Type, &pyCachingInfo))
{
- RAS_IRasterizer *rasty = static_cast<RAS_IRasterizer*>(PyCObject_AsVoidPtr(pyrasty));
- TCachingInfo *cachingInfo = static_cast<TCachingInfo*>(PyCObject_AsVoidPtr(pyCachingInfo));
+ RAS_IRasterizer *rasty = static_cast<RAS_IRasterizer*>(PyCapsule_GetPointer(pyrasty, KX_POLYGONMATERIAL_CAPSULE_ID));
+ TCachingInfo *cachingInfo = static_cast<TCachingInfo*>(PyCapsule_GetPointer(pyCachingInfo, KX_POLYGONMATERIAL_CAPSULE_ID));
if (rasty && cachingInfo)
{
DefaultActivate(rasty, *cachingInfo);
@@ -343,7 +353,7 @@ PyObject* KX_PolygonMaterial::pyattr_get_material(void *self_v, const KX_PYATTRI
PyObject* KX_PolygonMaterial::pyattr_get_tface(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
KX_PolygonMaterial* self= static_cast<KX_PolygonMaterial*>(self_v);
- return PyCObject_FromVoidPtr(self->m_tface, NULL);
+ return PyCapsule_New(self->m_tface, KX_POLYGONMATERIAL_CAPSULE_ID, NULL);
}
PyObject* KX_PolygonMaterial::pyattr_get_gl_texture(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
@@ -393,4 +403,4 @@ int KX_PolygonMaterial::pyattr_set_specular(void *self_v, const KX_PYATTRIBUTE_D
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_PolygonMaterial.h b/source/gameengine/Ketsji/KX_PolygonMaterial.h
index 03b4bf11a18..d71a34989a0 100644
--- a/source/gameengine/Ketsji/KX_PolygonMaterial.h
+++ b/source/gameengine/Ketsji/KX_PolygonMaterial.h
@@ -42,6 +42,7 @@
struct MTFace;
struct Material;
struct MTex;
+struct Image;
/**
* Material class.
@@ -58,7 +59,7 @@ private:
unsigned int* m_mcol;
Material* m_material;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* m_pymaterial;
#endif
@@ -107,6 +108,8 @@ public:
return m_material;
}
+ Image *GetBlenderImage() const;
+
/**
* Returns the Blender texture face structure that is used for this material.
* @return The material's texture face.
@@ -122,7 +125,7 @@ public:
}
virtual void GetMaterialRGBAColor(unsigned char *rgba) const;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
KX_PYMETHOD_DOC(KX_PolygonMaterial, updateTexture);
KX_PYMETHOD_DOC(KX_PolygonMaterial, setTexture);
KX_PYMETHOD_DOC(KX_PolygonMaterial, activate);
diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
index bbf8152bd68..d2cb9aef985 100644
--- a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
+++ b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
@@ -37,7 +37,7 @@
#include "PyObjectPlus.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// nasty glob variable to connect scripting language
// if there is a better way (without global), please do so!
@@ -659,5 +659,5 @@ PHY_IPhysicsEnvironment* PHY_GetActiveEnvironment()
return g_CurrentActivePhysicsEnvironment;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.h b/source/gameengine/Ketsji/KX_PyConstraintBinding.h
index a1b3c3d6da3..6da60794eb0 100644
--- a/source/gameengine/Ketsji/KX_PyConstraintBinding.h
+++ b/source/gameengine/Ketsji/KX_PyConstraintBinding.h
@@ -29,7 +29,7 @@
#ifndef PHY_PYTHON_CONSTRAINTBINDING
#define PHY_PYTHON_CONSTRAINTBINDING
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include <Python.h>
@@ -37,7 +37,7 @@ PyObject* initPythonConstraintBinding();
void PHY_RemovePythonConstraintBinding();
void PHY_SetActiveEnvironment(class PHY_IPhysicsEnvironment* env);
PHY_IPhysicsEnvironment* PHY_GetActiveEnvironment();
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
#endif //PHY_PYTHON_CONSTRAINTBINDING
diff --git a/source/gameengine/Ketsji/KX_PyMath.cpp b/source/gameengine/Ketsji/KX_PyMath.cpp
index 12f88331d15..45957ca1911 100644
--- a/source/gameengine/Ketsji/KX_PyMath.cpp
+++ b/source/gameengine/Ketsji/KX_PyMath.cpp
@@ -32,7 +32,7 @@
#pragma warning (disable : 4786)
#endif //WIN32
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "MT_Vector3.h"
#include "MT_Vector4.h"
@@ -190,4 +190,4 @@ PyObject* PyObjectFrom(const MT_Tuple2 &vec)
#endif
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_PyMath.h b/source/gameengine/Ketsji/KX_PyMath.h
index 9c9688f79cd..282e9a8f1f6 100644
--- a/source/gameengine/Ketsji/KX_PyMath.h
+++ b/source/gameengine/Ketsji/KX_PyMath.h
@@ -42,7 +42,7 @@
#include "KX_Python.h"
#include "PyObjectPlus.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#ifdef USE_MATHUTILS
extern "C" {
#include "../../blender/python/generic/mathutils.h" /* so we can have mathutils callbacks */
@@ -110,7 +110,9 @@ bool PyVecTo(PyObject* pyval, T& vec)
if(VectorObject_Check(pyval)) {
VectorObject *pyvec= (VectorObject *)pyval;
- BaseMath_ReadCallback(pyvec);
+ if(!BaseMath_ReadCallback(pyvec)) {
+ return false; /* exception raised */
+ }
if (pyvec->size != Size(vec)) {
PyErr_Format(PyExc_AttributeError, "error setting vector, %d args, should be %d", pyvec->size, Size(vec));
return false;
@@ -120,7 +122,9 @@ bool PyVecTo(PyObject* pyval, T& vec)
}
else if(QuaternionObject_Check(pyval)) {
QuaternionObject *pyquat= (QuaternionObject *)pyval;
- BaseMath_ReadCallback(pyquat);
+ if(!BaseMath_ReadCallback(pyquat)) {
+ return false; /* exception raised */
+ }
if (4 != Size(vec)) {
PyErr_Format(PyExc_AttributeError, "error setting vector, %d args, should be %d", 4, Size(vec));
return false;
@@ -131,7 +135,9 @@ bool PyVecTo(PyObject* pyval, T& vec)
}
else if(EulerObject_Check(pyval)) {
EulerObject *pyeul= (EulerObject *)pyval;
- BaseMath_ReadCallback(pyeul);
+ if(!BaseMath_ReadCallback(pyeul)) {
+ return false; /* exception raised */
+ }
if (3 != Size(vec)) {
PyErr_Format(PyExc_AttributeError, "error setting vector, %d args, should be %d", 3, Size(vec));
return false;
@@ -239,4 +245,4 @@ PyObject* PyObjectFrom(const MT_Tuple4 &pos);
#endif
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp
index 38a9229814d..a9202378ea5 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -34,20 +34,28 @@
#pragma warning (disable : 4786)
#endif //WIN32
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
+
+#ifdef _POSIX_C_SOURCE
+#undef _POSIX_C_SOURCE
+#endif
+
+#ifdef _XOPEN_SOURCE
+#undef _XOPEN_SOURCE
+#endif
+
+#include <Python.h>
extern "C" {
#include "bpy_internal_import.h" /* from the blender python api, but we want to import text too! */
#include "py_capi_utils.h"
#include "mathutils.h" // Blender.Mathutils module copied here so the blenderlayer can use.
- #include "geometry.h" // Blender.Geometry module copied here so the blenderlayer can use.
#include "bgl.h"
- #include "blf_api.h"
+ #include "blf_py_api.h"
#include "marshal.h" /* python header for loading/saving dicts */
}
-#define WITH_PYTHON
#include "AUD_PyInit.h"
#endif
@@ -132,18 +140,21 @@ extern "C" {
// 'local' copy of canvas ptr, for window height/width python scripts
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static RAS_ICanvas* gp_Canvas = NULL;
static char gp_GamePythonPath[FILE_MAXDIR + FILE_MAXFILE] = "";
static char gp_GamePythonPathOrig[FILE_MAXDIR + FILE_MAXFILE] = ""; // not super happy about this, but we need to remember the first loaded file for the global/dict load save
-#endif // DISABLE_PYTHON
+static SCA_PythonKeyboard* gp_PythonKeyboard = NULL;
+static SCA_PythonMouse* gp_PythonMouse = NULL;
+#endif // WITH_PYTHON
static KX_Scene* gp_KetsjiScene = NULL;
static KX_KetsjiEngine* gp_KetsjiEngine = NULL;
static RAS_IRasterizer* gp_Rasterizer = NULL;
+
void KX_SetActiveScene(class KX_Scene* scene)
{
gp_KetsjiScene = scene;
@@ -167,13 +178,13 @@ void KX_RasterizerDrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,cons
}
void KX_RasterizerDrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color,
- const MT_Vector3& normal, int nsector)
+ const MT_Vector3& normal, int nsector)
{
if (gp_Rasterizer)
gp_Rasterizer->DrawDebugCircle(center, radius, color, normal, nsector);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static PyObject *gp_OrigPythonSysPath= NULL;
static PyObject *gp_OrigPythonSysModules= NULL;
@@ -230,7 +241,7 @@ static PyObject* gPyExpandPath(PyObject*, PyObject* args)
BLI_strncpy(expanded, filename, FILE_MAXDIR + FILE_MAXFILE);
BLI_path_abs(expanded, gp_GamePythonPath);
- return PyUnicode_FromString(expanded);
+ return PyUnicode_DecodeFSDefault(expanded);
}
static char gPyStartGame_doc[] =
@@ -496,7 +507,7 @@ static PyObject* gPyGetBlendFileList(PyObject*, PyObject* args)
while ((dirp = readdir(dp)) != NULL) {
if (BLI_testextensie(dirp->d_name, ".blend")) {
- value = PyUnicode_FromString(dirp->d_name);
+ value= PyUnicode_DecodeFSDefault(dirp->d_name);
PyList_Append(list, value);
Py_DECREF(value);
}
@@ -921,6 +932,11 @@ static PyObject* gPySetBackgroundColor(PyObject*, PyObject* value)
{
gp_Rasterizer->SetBackColor(vec[0], vec[1], vec[2], vec[3]);
}
+
+ KX_WorldInfo *wi = gp_KetsjiScene->GetWorldInfo();
+ if (wi->hasWorld())
+ wi->setBackColor(vec[0], vec[1], vec[2]);
+
Py_RETURN_NONE;
}
@@ -1305,11 +1321,13 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
PyDict_SetItemString(d, "globalDict", item=PyDict_New()); Py_DECREF(item);
// Add keyboard and mouse attributes to this module
- SCA_PythonKeyboard* pykeyb = new SCA_PythonKeyboard(gp_KetsjiEngine->GetKeyboardDevice());
- PyDict_SetItemString(d, "keyboard", pykeyb->NewProxy(true));
+ MT_assert(!gp_PythonKeyboard);
+ gp_PythonKeyboard = new SCA_PythonKeyboard(gp_KetsjiEngine->GetKeyboardDevice());
+ PyDict_SetItemString(d, "keyboard", gp_PythonKeyboard->NewProxy(true));
- SCA_PythonMouse* pymouse = new SCA_PythonMouse(gp_KetsjiEngine->GetMouseDevice(), gp_Canvas);
- PyDict_SetItemString(d, "mouse", pymouse->NewProxy(true));
+ MT_assert(!gp_PythonMouse);
+ gp_PythonMouse = new SCA_PythonMouse(gp_KetsjiEngine->GetMouseDevice(), gp_Canvas);
+ PyDict_SetItemString(d, "mouse", gp_PythonMouse->NewProxy(true));
ErrorObject = PyUnicode_FromString("GameLogic.error");
PyDict_SetItemString(d, "error", ErrorObject);
@@ -1605,7 +1623,6 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
KX_MACRO_addTypesToDict(d, RM_WALLS, KX_NavMeshObject::RM_WALLS);
KX_MACRO_addTypesToDict(d, RM_POLYS, KX_NavMeshObject::RM_POLYS);
KX_MACRO_addTypesToDict(d, RM_TRIS, KX_NavMeshObject::RM_TRIS);
-
// Check for errors
if (PyErr_Occurred())
@@ -1780,8 +1797,8 @@ static void setSandbox(TPythonSecurityLevel level)
*/
default:
/* Allow importing internal text, from bpy_internal_import.py */
- PyDict_SetItemString(d, "reload", item=PyCFunction_New(bpy_reload_meth, NULL)); Py_DECREF(item);
- PyDict_SetItemString(d, "__import__", item=PyCFunction_New(bpy_import_meth, NULL)); Py_DECREF(item);
+ PyDict_SetItemString(d, "reload", item=PyCFunction_New(&bpy_reload_meth, NULL)); Py_DECREF(item);
+ PyDict_SetItemString(d, "__import__", item=PyCFunction_New(&bpy_import_meth, NULL)); Py_DECREF(item);
break;
}
}
@@ -1833,7 +1850,7 @@ static void initPySysObjects__append(PyObject *sys_path, char *filename)
BLI_split_dirfile(filename, expanded, NULL); /* get the dir part of filename only */
BLI_path_abs(expanded, gp_GamePythonPath); /* filename from lib->filename is (always?) absolute, so this may not be needed but it wont hurt */
BLI_cleanup_file(gp_GamePythonPath, expanded); /* Dont use BLI_cleanup_dir because it adds a slash - BREAKS WIN32 ONLY */
- item= PyUnicode_FromString(expanded);
+ item= PyUnicode_DecodeFSDefault(expanded);
// printf("SysPath - '%s', '%s', '%s'\n", expanded, filename, gp_GamePythonPath);
@@ -1924,7 +1941,7 @@ PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecur
PyObject *py_argv= PyList_New(argc);
for (i=0; i<argc; i++)
- PyList_SET_ITEM(py_argv, i, PyUnicode_FromString(argv[i]));
+ PyList_SET_ITEM(py_argv, i, PyC_UnicodeFromByte(argv[i]));
PySys_SetObject("argv", py_argv);
Py_DECREF(py_argv);
@@ -1946,6 +1963,13 @@ PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecur
void exitGamePlayerPythonScripting()
{
+ /* Clean up the Python mouse and keyboard */
+ delete gp_PythonKeyboard;
+ gp_PythonKeyboard = NULL;
+
+ delete gp_PythonMouse;
+ gp_PythonMouse = NULL;
+
/* since python restarts we cant let the python backup of the sys.path hang around in a global pointer */
restorePySysObjects(); /* get back the original sys.path and clear the backup */
@@ -1982,6 +2006,13 @@ PyObject* initGamePythonScripting(const STR_String& progname, TPythonSecurityLev
void exitGamePythonScripting()
{
+ /* Clean up the Python mouse and keyboard */
+ delete gp_PythonKeyboard;
+ gp_PythonKeyboard = NULL;
+
+ delete gp_PythonMouse;
+ gp_PythonMouse = NULL;
+
restorePySysObjects(); /* get back the original sys.path and clear the backup */
bpy_import_main_set(NULL);
PyObjectPlus::ClearDeprecationWarning();
@@ -2234,6 +2265,7 @@ PyObject* initGameKeys()
KX_MACRO_addTypesToDict(d, ESCKEY, SCA_IInputDevice::KX_ESCKEY);
KX_MACRO_addTypesToDict(d, TABKEY, SCA_IInputDevice::KX_TABKEY);
KX_MACRO_addTypesToDict(d, RETKEY, SCA_IInputDevice::KX_RETKEY);
+ KX_MACRO_addTypesToDict(d, ENTERKEY, SCA_IInputDevice::KX_RETKEY);
KX_MACRO_addTypesToDict(d, SPACEKEY, SCA_IInputDevice::KX_SPACEKEY);
KX_MACRO_addTypesToDict(d, LINEFEEDKEY, SCA_IInputDevice::KX_LINEFEEDKEY);
KX_MACRO_addTypesToDict(d, BACKSPACEKEY, SCA_IInputDevice::KX_BACKSPACEKEY);
@@ -2324,22 +2356,22 @@ PyObject* initGameKeys()
PyObject* initMathutils()
{
- return Mathutils_Init();
+ return BPyInit_mathutils();
}
PyObject* initGeometry()
{
- return Geometry_Init();
+ return BPyInit_mathutils_geometry();
}
PyObject* initBGL()
{
- return BGL_Init();
+ return BPyInit_bgl();
}
PyObject* initBLF()
{
- return BLF_Init();
+ return BPyInit_blf();
}
// utility function for loading and saving the globalDict
@@ -2443,4 +2475,4 @@ void resetGamePythonPath()
gp_GamePythonPathOrig[0] = '\0';
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_PythonInit.h b/source/gameengine/Ketsji/KX_PythonInit.h
index d46776eb9da..bc092e712b0 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.h
+++ b/source/gameengine/Ketsji/KX_PythonInit.h
@@ -39,7 +39,7 @@ typedef enum {
extern bool gUseVisibilityTemp;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* initGameLogic(class KX_KetsjiEngine *engine, class KX_Scene* ketsjiscene);
PyObject* initGameKeys();
PyObject* initRasterizer(class RAS_IRasterizer* rasty,class RAS_ICanvas* canvas);
@@ -72,7 +72,8 @@ class KX_KetsjiEngine* KX_GetActiveEngine();
void KX_RasterizerDrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color);
void KX_RasterizerDrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color,
- const MT_Vector3& normal, int nsector);
+ const MT_Vector3& normal, int nsector);
+
#endif //__KX_PYTHON_INIT
diff --git a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
index 81c79afde2e..f1ce861ad5a 100644
--- a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
@@ -32,7 +32,7 @@
#ifndef _adr_py_init_types_h_ // only process once,
#define _adr_py_init_types_h_ // even if multiply included
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* Only for Class::Parents */
#include "BL_BlenderShader.h"
@@ -47,6 +47,7 @@
#include "KX_ConstraintWrapper.h"
#include "KX_GameActuator.h"
#include "KX_Light.h"
+#include "KX_FontObject.h"
#include "KX_MeshProxy.h"
#include "KX_MouseFocusSensor.h"
#include "KX_NetworkMessageActuator.h"
@@ -195,6 +196,7 @@ void initPyTypes(void)
PyType_Ready_Attr(dict, KX_GameObject, init_getset);
PyType_Ready_Attr(dict, KX_IpoActuator, init_getset);
PyType_Ready_Attr(dict, KX_LightObject, init_getset);
+ PyType_Ready_Attr(dict, KX_FontObject, init_getset);
PyType_Ready_Attr(dict, KX_MeshProxy, init_getset);
PyType_Ready_Attr(dict, KX_MouseFocusSensor, init_getset);
PyType_Ready_Attr(dict, KX_NearSensor, init_getset);
@@ -260,6 +262,6 @@ void initPyTypes(void)
#endif
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
#endif
diff --git a/source/gameengine/Ketsji/KX_PythonInitTypes.h b/source/gameengine/Ketsji/KX_PythonInitTypes.h
index c16fafedf93..1053f320e5e 100644
--- a/source/gameengine/Ketsji/KX_PythonInitTypes.h
+++ b/source/gameengine/Ketsji/KX_PythonInitTypes.h
@@ -30,7 +30,7 @@
#ifndef _adr_py_init_types_h_ // only process once,
#define _adr_py_init_types_h_ // even if multiply included
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
void initPyTypes(void);
#endif
diff --git a/source/gameengine/Ketsji/KX_PythonSeq.cpp b/source/gameengine/Ketsji/KX_PythonSeq.cpp
index 5c87fe2e757..bed3f33ab77 100644
--- a/source/gameengine/Ketsji/KX_PythonSeq.cpp
+++ b/source/gameengine/Ketsji/KX_PythonSeq.cpp
@@ -28,7 +28,7 @@
* Readonly sequence wrapper for lookups on logic bricks
*/
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "KX_PythonSeq.h"
#include "KX_GameObject.h"
@@ -512,4 +512,4 @@ PyTypeObject KX_PythonSeq_Type = {
NULL
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_PythonSeq.h b/source/gameengine/Ketsji/KX_PythonSeq.h
index ca8f667852a..7ca36cc19f4 100644
--- a/source/gameengine/Ketsji/KX_PythonSeq.h
+++ b/source/gameengine/Ketsji/KX_PythonSeq.h
@@ -31,7 +31,7 @@
#ifndef _adr_py_seq_h_ // only process once,
#define _adr_py_seq_h_ // even if multiply included
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "PyObjectPlus.h"
@@ -61,6 +61,6 @@ typedef struct {
PyObject *KX_PythonSeq_CreatePyObject(PyObject *base, short type);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
#endif // _adr_py_seq_h_
diff --git a/source/gameengine/Ketsji/KX_RadarSensor.cpp b/source/gameengine/Ketsji/KX_RadarSensor.cpp
index 041559158dd..7cbdd3bba66 100644
--- a/source/gameengine/Ketsji/KX_RadarSensor.cpp
+++ b/source/gameengine/Ketsji/KX_RadarSensor.cpp
@@ -31,6 +31,7 @@
#include "KX_PyMath.h"
#include "PHY_IPhysicsController.h"
#include "PHY_IMotionState.h"
+#include "DNA_sensor_types.h"
/**
* RadarSensor constructor. Creates a near-sensor derived class, with a cone collision shape.
@@ -95,42 +96,42 @@ void KX_RadarSensor::SynchronizeTransform()
// depends on the radar 'axis'
switch (m_axis)
{
- case 0: // +X Axis
+ case SENS_RADAR_X_AXIS: // +X Axis
{
MT_Quaternion rotquatje(MT_Vector3(0,0,1),MT_radians(90));
trans.rotate(rotquatje);
trans.translate(MT_Vector3 (0, -m_coneheight/2.0 ,0));
break;
};
- case 1: // +Y Axis
+ case SENS_RADAR_Y_AXIS: // +Y Axis
{
MT_Quaternion rotquatje(MT_Vector3(1,0,0),MT_radians(-180));
trans.rotate(rotquatje);
trans.translate(MT_Vector3 (0, -m_coneheight/2.0 ,0));
break;
};
- case 2: // +Z Axis
+ case SENS_RADAR_Z_AXIS: // +Z Axis
{
MT_Quaternion rotquatje(MT_Vector3(1,0,0),MT_radians(-90));
trans.rotate(rotquatje);
trans.translate(MT_Vector3 (0, -m_coneheight/2.0 ,0));
break;
};
- case 3: // -X Axis
+ case SENS_RADAR_NEG_X_AXIS: // -X Axis
{
MT_Quaternion rotquatje(MT_Vector3(0,0,1),MT_radians(-90));
trans.rotate(rotquatje);
trans.translate(MT_Vector3 (0, -m_coneheight/2.0 ,0));
break;
};
- case 4: // -Y Axis
+ case SENS_RADAR_NEG_Y_AXIS: // -Y Axis
{
//MT_Quaternion rotquatje(MT_Vector3(1,0,0),MT_radians(-180));
//trans.rotate(rotquatje);
trans.translate(MT_Vector3 (0, -m_coneheight/2.0 ,0));
break;
};
- case 5: // -Z Axis
+ case SENS_RADAR_NEG_Z_AXIS: // -Z Axis
{
MT_Quaternion rotquatje(MT_Vector3(1,0,0),MT_radians(90));
trans.rotate(rotquatje);
@@ -172,7 +173,7 @@ void KX_RadarSensor::SynchronizeTransform()
/* Python Functions */
/* ------------------------------------------------------------------------- */
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python Integration Hooks */
@@ -212,4 +213,4 @@ PyAttributeDef KX_RadarSensor::Attributes[] = {
{NULL} //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_RaySensor.cpp b/source/gameengine/Ketsji/KX_RaySensor.cpp
index e745d1f0334..2434c031a6a 100644
--- a/source/gameengine/Ketsji/KX_RaySensor.cpp
+++ b/source/gameengine/Ketsji/KX_RaySensor.cpp
@@ -42,6 +42,7 @@
#include "PHY_IPhysicsEnvironment.h"
#include "KX_IPhysicsController.h"
#include "PHY_IPhysicsController.h"
+#include "DNA_sensor_types.h"
#include <stdio.h>
@@ -198,42 +199,42 @@ bool KX_RaySensor::Evaluate()
m_reset = false;
switch (m_axis)
{
- case 1: // X
+ case SENS_RAY_X_AXIS: // X
{
todir[0] = invmat[0][0];
todir[1] = invmat[0][1];
todir[2] = invmat[0][2];
break;
}
- case 0: // Y
+ case SENS_RAY_Y_AXIS: // Y
{
todir[0] = invmat[1][0];
todir[1] = invmat[1][1];
todir[2] = invmat[1][2];
break;
}
- case 2: // Z
+ case SENS_RAY_Z_AXIS: // Z
{
todir[0] = invmat[2][0];
todir[1] = invmat[2][1];
todir[2] = invmat[2][2];
break;
}
- case 3: // -X
+ case SENS_RAY_NEG_X_AXIS: // -X
{
todir[0] = -invmat[0][0];
todir[1] = -invmat[0][1];
todir[2] = -invmat[0][2];
break;
}
- case 4: // -Y
+ case SENS_RAY_NEG_Y_AXIS: // -Y
{
todir[0] = -invmat[1][0];
todir[1] = -invmat[1][1];
todir[2] = -invmat[1][2];
break;
}
- case 5: // -Z
+ case SENS_RAY_NEG_Z_AXIS: // -Z
{
todir[0] = -invmat[2][0];
todir[1] = -invmat[2][1];
@@ -309,7 +310,7 @@ bool KX_RaySensor::Evaluate()
return result;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -365,4 +366,4 @@ PyObject* KX_RaySensor::pyattr_get_hitobject(void *self_v, const KX_PYATTRIBUTE_
Py_RETURN_NONE;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_RaySensor.h b/source/gameengine/Ketsji/KX_RaySensor.h
index 34f7d8a7b1d..ac0b5eba26b 100644
--- a/source/gameengine/Ketsji/KX_RaySensor.h
+++ b/source/gameengine/Ketsji/KX_RaySensor.h
@@ -90,12 +90,12 @@ public:
KX_RAY_AXIS_NEG_Z
};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* Attributes */
static PyObject* pyattr_get_hitobject(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
index eee6146f6ed..34b49045337 100644
--- a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
@@ -159,7 +159,7 @@ void KX_SCA_AddObjectActuator::Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -246,7 +246,7 @@ PyObject* KX_SCA_AddObjectActuator::PyInstantAddObject()
Py_RETURN_NONE;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
void KX_SCA_AddObjectActuator::InstantAddObject()
{
diff --git a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
index c2068d157ee..16612f9a743 100644
--- a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
+++ b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
@@ -122,7 +122,7 @@ public:
void InstantAddObject();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
KX_PYMETHOD_DOC_NOARGS(KX_SCA_AddObjectActuator,InstantAddObject);
@@ -130,7 +130,7 @@ public:
static int pyattr_set_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_objectLastCreated(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
}; /* end of class KX_SCA_AddObjectActuator : public KX_EditObjectActuator */
diff --git a/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp b/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
index bc59c63dc69..6e36bde59ec 100644
--- a/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
@@ -37,7 +37,7 @@
#include "KX_SCA_DynamicActuator.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -77,7 +77,7 @@ PyAttributeDef KX_SCA_DynamicActuator::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Native functions */
diff --git a/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp b/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp
index c9ead726905..f50dc9fc46a 100644
--- a/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp
@@ -80,7 +80,7 @@ CValue* KX_SCA_EndObjectActuator::GetReplica()
return replica;
};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions : integration hooks */
@@ -116,6 +116,6 @@ PyAttributeDef KX_SCA_EndObjectActuator::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
index 20c3168d7ba..aff4f4080fd 100644
--- a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
@@ -35,12 +35,14 @@
// Please look here for revision history.
+#include <stddef.h>
+
#include "KX_SCA_ReplaceMeshActuator.h"
#include "KX_MeshProxy.h"
#include "PyObjectPlus.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -110,7 +112,7 @@ KX_PYMETHODDEF_DOC(KX_SCA_ReplaceMeshActuator, instantReplaceMesh,
Py_RETURN_NONE;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Native functions */
diff --git a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h
index 4a6ae9f8fce..573ec76782c 100644
--- a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h
+++ b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h
@@ -74,7 +74,7 @@ class KX_SCA_ReplaceMeshActuator : public SCA_IActuator
void InstantReplaceMesh();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -90,7 +90,7 @@ class KX_SCA_ReplaceMeshActuator : public SCA_IActuator
KX_PYMETHOD_DOC(KX_SCA_ReplaceMeshActuator,instantReplaceMesh);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp
index f755e87fee0..0a74f8ad66f 100644
--- a/source/gameengine/Ketsji/KX_Scene.cpp
+++ b/source/gameengine/Ketsji/KX_Scene.cpp
@@ -82,18 +82,17 @@
#include "BL_ModifierDeformer.h"
#include "BL_ShapeDeformer.h"
#include "BL_DeformableGameObject.h"
-#include "KX_SoftBodyDeformer.h"
-
#include "KX_ObstacleSimulation.h"
-// to get USE_BULLET!
-#include "KX_ConvertPhysicsObject.h"
#ifdef USE_BULLET
+#include "KX_SoftBodyDeformer.h"
+#include "KX_ConvertPhysicsObject.h"
#include "CcdPhysicsEnvironment.h"
#include "CcdPhysicsController.h"
#endif
#include "KX_Light.h"
+
#include <stdio.h>
void* KX_SceneReplicationFunc(SG_IObject* node,void* gameobj,void* scene)
@@ -209,6 +208,7 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice,
m_rootnode = NULL;
m_bucketmanager=new RAS_BucketManager();
+
bool showObstacleSimulation = scene->gm.flag & GAME_SHOW_OBSTACLE_SIMULATION;
switch (scene->gm.obstacleSimulation)
{
@@ -222,8 +222,7 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice,
m_obstacleSimulation = NULL;
}
-
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
m_attr_dict = PyDict_New(); /* new ref */
m_draw_call_pre = NULL;
m_draw_call_post = NULL;
@@ -280,7 +279,7 @@ KX_Scene::~KX_Scene()
delete m_bucketmanager;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyDict_Clear(m_attr_dict);
Py_DECREF(m_attr_dict);
@@ -341,7 +340,10 @@ list<class KX_Camera*>* KX_Scene::GetCameras()
return &m_cameras;
}
-
+list<class KX_FontObject*>* KX_Scene::GetFonts()
+{
+ return &m_fonts;
+}
void KX_Scene::SetFramingType(RAS_FrameSettings & frame_settings)
{
@@ -830,6 +832,8 @@ SCA_IObject* KX_Scene::AddReplicaObject(class CValue* originalobject,
// add a timebomb to this object
// for now, convert between so called frames and realtime
m_tempObjectList->Add(replica->AddRef());
+ // this convert the life from frames to sort-of seconds, hard coded 0.02 that assumes we have 50 frames per second
+ // if you change this value, make sure you change it in KX_GameObject::pyattr_get_life property too
CValue *fval = new CFloatValue(lifespan*0.02);
replica->SetProperty("::timebomb",fval);
fval->Release();
@@ -1030,6 +1034,9 @@ int KX_Scene::NewRemoveObject(class CValue* gameobj)
// in case this is a camera
m_cameras.remove((KX_Camera*)newobj);
+ // in case this is a font
+ m_fonts.remove((KX_FontObject*)newobj);
+
/* currently does nothing, keep incase we need to Unregister something */
#if 0
if (m_sceneConverter)
@@ -1089,8 +1096,9 @@ void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj, bool use_gfx, bool u
blendobj->parent && // original object had armature (not sure this test is needed)
blendobj->parent->type == OB_ARMATURE &&
blendmesh->dvert!=NULL; // mesh has vertex group
+#ifdef USE_BULLET
bool bHasSoftBody = (!parentobj && (blendobj->gameflag & OB_SOFT_BODY));
-
+#endif
bool releaseParent = true;
@@ -1179,11 +1187,13 @@ void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj, bool use_gfx, bool u
);
newobj->SetDeformer(meshdeformer);
}
+#ifdef USE_BULLET
else if (bHasSoftBody)
{
KX_SoftBodyDeformer *softdeformer = new KX_SoftBodyDeformer(mesh, newobj);
newobj->SetDeformer(softdeformer);
}
+#endif
// release parent reference if its not being used
if( releaseParent && parentobj)
@@ -1193,12 +1203,35 @@ void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj, bool use_gfx, bool u
gameobj->AddMeshUser();
}
-
+
+#ifdef USE_BULLET
if(use_phys) { /* update the new assigned mesh with the physics mesh */
KX_ReInstanceBulletShapeFromMesh(gameobj, NULL, use_gfx?NULL:mesh);
}
+#endif
+}
+
+/* Font Object routines */
+void KX_Scene::AddFont(KX_FontObject* font)
+{
+ if (!FindFont(font))
+ m_fonts.push_back(font);
}
+KX_FontObject* KX_Scene::FindFont(KX_FontObject* font)
+{
+ list<KX_FontObject*>::iterator it = m_fonts.begin();
+
+ while ( (it != m_fonts.end())
+ && ((*it) != font) ) {
+ ++it;
+ }
+
+ return ((it == m_fonts.end()) ? NULL : (*it));
+}
+
+
+/* Camera Object routines */
KX_Camera* KX_Scene::FindCamera(KX_Camera* cam)
{
list<KX_Camera*>::iterator it = m_cameras.begin();
@@ -1476,7 +1509,6 @@ void KX_Scene::LogicBeginFrame(double curtime)
// all object is the tempObjectList should have a clock
}
}
-
m_logicmgr->BeginFrame(curtime, 1.0/KX_KetsjiEngine::GetTicRate());
}
@@ -1650,7 +1682,9 @@ double KX_Scene::getSuspendedDelta()
return m_suspendeddelta;
}
+#ifdef USE_BULLET
#include "KX_BulletPhysicsController.h"
+#endif
static void MergeScene_LogicBrick(SCA_ILogicBrick* brick, KX_Scene *to)
{
@@ -1665,16 +1699,19 @@ static void MergeScene_LogicBrick(SCA_ILogicBrick* brick, KX_Scene *to)
}
/* near sensors have physics controllers */
+#ifdef USE_BULLET
KX_TouchSensor *touch_sensor = dynamic_cast<class KX_TouchSensor *>(brick);
if(touch_sensor) {
touch_sensor->GetPhysicsController()->SetPhysicsEnvironment(to->GetPhysicsEnvironment());
}
+#endif
}
+#ifdef USE_BULLET
#include "CcdGraphicController.h" // XXX ctrl->SetPhysicsEnvironment(to->GetPhysicsEnvironment());
#include "CcdPhysicsEnvironment.h" // XXX ctrl->SetPhysicsEnvironment(to->GetPhysicsEnvironment());
#include "KX_BulletPhysicsController.h"
-
+#endif
static void MergeScene_GameObject(KX_GameObject* gameobj, KX_Scene *to, KX_Scene *from)
{
@@ -1733,8 +1770,13 @@ static void MergeScene_GameObject(KX_GameObject* gameobj, KX_Scene *to, KX_Scene
if(sg) {
if(sg->GetSGClientInfo() == from) {
sg->SetSGClientInfo(to);
- }
+ /* Make sure to grab the children too since they might not be tied to a game object */
+ NodeList children = sg->GetSGChildren();
+ for (int i=0; i<children.size(); i++)
+ children[i]->SetSGClientInfo(to);
+ }
+#ifdef USE_BULLET
SGControllerList::iterator contit;
SGControllerList& controllers = sg->GetSGControllerList();
for (contit = controllers.begin();contit!=controllers.end();++contit)
@@ -1743,6 +1785,7 @@ static void MergeScene_GameObject(KX_GameObject* gameobj, KX_Scene *to, KX_Scene
if (phys_ctrl)
phys_ctrl->SetPhysicsEnvironment(to->GetPhysicsEnvironment());
}
+#endif // USE_BULLET
}
/* If the object is a light, update it's scene */
if (gameobj->GetGameObjectType() == SCA_IObject::OBJ_LIGHT)
@@ -1758,6 +1801,7 @@ static void MergeScene_GameObject(KX_GameObject* gameobj, KX_Scene *to, KX_Scene
bool KX_Scene::MergeScene(KX_Scene *other)
{
+#ifdef USE_BULLET
CcdPhysicsEnvironment *env= dynamic_cast<CcdPhysicsEnvironment *>(this->GetPhysicsEnvironment());
CcdPhysicsEnvironment *env_other= dynamic_cast<CcdPhysicsEnvironment *>(other->GetPhysicsEnvironment());
@@ -1767,6 +1811,7 @@ bool KX_Scene::MergeScene(KX_Scene *other)
printf("\tsource %d, terget %d\n", (int)(env!=NULL), (int)(env_other!=NULL));
return false;
}
+#endif // USE_BULLET
if(GetSceneConverter() != other->GetSceneConverter()) {
printf("KX_Scene::MergeScene: converters differ, aborting\n");
@@ -1809,9 +1854,11 @@ bool KX_Scene::MergeScene(KX_Scene *other)
GetLightList()->MergeList(other->GetLightList());
other->GetLightList()->ReleaseAndRemoveAll();
+#ifdef USE_BULLET
if(env) /* bullet scene? - dummy scenes dont need touching */
env->MergeEnvironment(env_other);
-
+#endif
+
/* merge logic */
{
SCA_LogicManager *logicmgr= GetLogicManager();
@@ -1845,7 +1892,7 @@ void KX_Scene::Render2DFilters(RAS_ICanvas* canvas)
m_filtermanager.RenderFilters(canvas);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
void KX_Scene::RunDrawingCallbacks(PyObject* cb_list)
{
@@ -1911,10 +1958,10 @@ PyMethodDef KX_Scene::Methods[] = {
KX_PYMETHODTABLE(KX_Scene, suspend),
KX_PYMETHODTABLE(KX_Scene, resume),
KX_PYMETHODTABLE(KX_Scene, drawObstacleSimulation),
+
/* dict style access */
KX_PYMETHODTABLE(KX_Scene, get),
-
{NULL,NULL} //Sentinel
};
@@ -2267,4 +2314,4 @@ KX_PYMETHODDEF_DOC(KX_Scene, get, "")
return def;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h
index ca286b87e63..474aac41675 100644
--- a/source/gameengine/Ketsji/KX_Scene.h
+++ b/source/gameengine/Ketsji/KX_Scene.h
@@ -100,7 +100,7 @@ class KX_Scene : public PyObjectPlus, public SCA_IScene
{
Py_Header;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* m_attr_dict;
PyObject* m_draw_call_pre;
PyObject* m_draw_call_post;
@@ -137,6 +137,13 @@ protected:
* The set of cameras for this scene
*/
list<class KX_Camera*> m_cameras;
+
+ /**
+ * The set of fonts for this scene
+ */
+ list<class KX_FontObject*> m_fonts;
+
+
/**
* Various SCA managers used by the scene
*/
@@ -365,6 +372,27 @@ public:
GetTimeEventManager(
);
+ /** Font Routines */
+
+ list<class KX_FontObject*>*
+ GetFonts(
+ );
+
+ /** Find a font in the scene by pointer. */
+ KX_FontObject*
+ FindFont(
+ KX_FontObject*
+ );
+
+ /** Add a camera to this scene. */
+ void
+ AddFont(
+ KX_FontObject*
+ );
+
+
+ /** Camera Routines */
+
list<class KX_Camera*>*
GetCameras(
);
@@ -550,7 +578,7 @@ public:
KX_ObstacleSimulation* GetObstacleSimulation() {return m_obstacleSimulation;};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
@@ -564,6 +592,7 @@ public:
KX_PYMETHOD_DOC(KX_Scene, get);
KX_PYMETHOD_DOC(KX_Scene, drawObstacleSimulation);
+
/* attributes */
static PyObject* pyattr_get_name(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_objects(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
@@ -621,7 +650,6 @@ public:
//void PrintStats(int verbose_level) {
// m_bucketmanager->PrintStats(verbose_level)
//}
-
};
typedef std::vector<KX_Scene*> KX_SceneList;
diff --git a/source/gameengine/Ketsji/KX_SceneActuator.cpp b/source/gameengine/Ketsji/KX_SceneActuator.cpp
index 8f6000ebc3d..f991b843c99 100644
--- a/source/gameengine/Ketsji/KX_SceneActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SceneActuator.cpp
@@ -210,7 +210,7 @@ KX_Scene* KX_SceneActuator::FindScene(char * sceneName)
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -283,6 +283,6 @@ int KX_SceneActuator::pyattr_set_camera(void *self, const struct KX_PYATTRIBUTE_
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/Ketsji/KX_SceneActuator.h b/source/gameengine/Ketsji/KX_SceneActuator.h
index 360488f9f74..b49357b21ca 100644
--- a/source/gameengine/Ketsji/KX_SceneActuator.h
+++ b/source/gameengine/Ketsji/KX_SceneActuator.h
@@ -89,7 +89,7 @@ class KX_SceneActuator : public SCA_IActuator
virtual bool Update();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
virtual void Replace_IScene(SCA_IScene *val)
{
@@ -103,7 +103,7 @@ class KX_SceneActuator : public SCA_IActuator
static PyObject* pyattr_get_camera(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_camera(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
}; /* end of class KXSceneActuator */
diff --git a/source/gameengine/Ketsji/KX_SoundActuator.cpp b/source/gameengine/Ketsji/KX_SoundActuator.cpp
index 9ebb36578c4..d5f8aa74880 100644
--- a/source/gameengine/Ketsji/KX_SoundActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SoundActuator.cpp
@@ -233,7 +233,7 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -496,4 +496,4 @@ int KX_SoundActuator::pyattr_set_pitch(void *self, const struct KX_PYATTRIBUTE_D
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_SoundActuator.h b/source/gameengine/Ketsji/KX_SoundActuator.h
index c175a184a15..7c1108ea8fb 100644
--- a/source/gameengine/Ketsji/KX_SoundActuator.h
+++ b/source/gameengine/Ketsji/KX_SoundActuator.h
@@ -93,7 +93,7 @@ public:
CValue* GetReplica();
void ProcessReplica();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* -------------------------------------------------------------------- */
/* Python interface --------------------------------------------------- */
@@ -115,7 +115,7 @@ public:
static PyObject* pyattr_get_pitch(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_type(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/Ketsji/KX_StateActuator.cpp b/source/gameengine/Ketsji/KX_StateActuator.cpp
index 33f21f49810..ff4c3985a04 100644
--- a/source/gameengine/Ketsji/KX_StateActuator.cpp
+++ b/source/gameengine/Ketsji/KX_StateActuator.cpp
@@ -124,7 +124,7 @@ void KX_StateActuator::Activate(SG_DList& head)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -165,4 +165,4 @@ PyAttributeDef KX_StateActuator::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_TouchEventManager.cpp b/source/gameengine/Ketsji/KX_TouchEventManager.cpp
index eb55d0272f6..95928ac5889 100644
--- a/source/gameengine/Ketsji/KX_TouchEventManager.cpp
+++ b/source/gameengine/Ketsji/KX_TouchEventManager.cpp
@@ -109,6 +109,13 @@ bool KX_TouchEventManager::newBroadphaseResponse(void *client_data,
}
}
return false;
+
+ // quiet the compiler
+ case KX_ClientObjectInfo::STATIC:
+ case KX_ClientObjectInfo::ACTOR:
+ case KX_ClientObjectInfo::RESERVED1:
+ /* do nothing*/
+ break;
}
return true;
}
diff --git a/source/gameengine/Ketsji/KX_TouchSensor.cpp b/source/gameengine/Ketsji/KX_TouchSensor.cpp
index 9b44f487682..b590624e6c7 100644
--- a/source/gameengine/Ketsji/KX_TouchSensor.cpp
+++ b/source/gameengine/Ketsji/KX_TouchSensor.cpp
@@ -283,7 +283,7 @@ bool KX_TouchSensor::NewHandleCollision(void*object1,void*object2,const PHY_Coll
return false; // was DT_CONTINUE but this was defined in sumo as false.
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/Ketsji/KX_TouchSensor.h b/source/gameengine/Ketsji/KX_TouchSensor.h
index c9448897936..80e5a0f938e 100644
--- a/source/gameengine/Ketsji/KX_TouchSensor.h
+++ b/source/gameengine/Ketsji/KX_TouchSensor.h
@@ -118,7 +118,7 @@ public:
// todo: put some info for collision maybe
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
diff --git a/source/gameengine/Ketsji/KX_TrackToActuator.cpp b/source/gameengine/Ketsji/KX_TrackToActuator.cpp
index ae8d2f6459b..cae183ac4a2 100644
--- a/source/gameengine/Ketsji/KX_TrackToActuator.cpp
+++ b/source/gameengine/Ketsji/KX_TrackToActuator.cpp
@@ -417,7 +417,7 @@ bool KX_TrackToActuator::Update(double curtime, bool frame)
return result;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -486,6 +486,6 @@ int KX_TrackToActuator::pyattr_set_object(void *self, const struct KX_PYATTRIBUT
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/Ketsji/KX_TrackToActuator.h b/source/gameengine/Ketsji/KX_TrackToActuator.h
index 2b44994f103..33b2ecb1aa5 100644
--- a/source/gameengine/Ketsji/KX_TrackToActuator.h
+++ b/source/gameengine/Ketsji/KX_TrackToActuator.h
@@ -69,7 +69,7 @@ class KX_TrackToActuator : public SCA_IActuator
virtual void Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map);
virtual bool Update(double curtime, bool frame);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* Python part */
@@ -77,7 +77,7 @@ class KX_TrackToActuator : public SCA_IActuator
static PyObject* pyattr_get_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
}; /* end of class KX_TrackToActuator : public KX_EditObjectActuator */
diff --git a/source/gameengine/Ketsji/KX_VehicleWrapper.cpp b/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
index 4ee80c64570..17368357cc4 100644
--- a/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
+++ b/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
@@ -29,7 +29,7 @@ KX_VehicleWrapper::~KX_VehicleWrapper()
m_motionStates.clear();
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* KX_VehicleWrapper::PyAddWheel(PyObject* args)
{
@@ -319,4 +319,4 @@ PyAttributeDef KX_VehicleWrapper::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_VehicleWrapper.h b/source/gameengine/Ketsji/KX_VehicleWrapper.h
index 2ca06da18fc..4cde50b0932 100644
--- a/source/gameengine/Ketsji/KX_VehicleWrapper.h
+++ b/source/gameengine/Ketsji/KX_VehicleWrapper.h
@@ -20,7 +20,7 @@ public:
virtual ~KX_VehicleWrapper ();
int getConstraintId();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
KX_PYMETHOD_VARARGS(KX_VehicleWrapper,AddWheel);
KX_PYMETHOD_VARARGS(KX_VehicleWrapper,GetNumWheels);
@@ -47,7 +47,7 @@ public:
KX_PYMETHOD_VARARGS(KX_VehicleWrapper,SetSuspensionCompression);
KX_PYMETHOD_VARARGS(KX_VehicleWrapper,SetRollInfluence);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
private:
PHY_IVehicle* m_vehicle;
diff --git a/source/gameengine/Ketsji/KX_VertexProxy.cpp b/source/gameengine/Ketsji/KX_VertexProxy.cpp
index 09630ad2851..f66d11394fd 100644
--- a/source/gameengine/Ketsji/KX_VertexProxy.cpp
+++ b/source/gameengine/Ketsji/KX_VertexProxy.cpp
@@ -26,7 +26,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "KX_VertexProxy.h"
#include "KX_MeshProxy.h"
@@ -553,4 +553,4 @@ PyObject* KX_VertexProxy::PySetUV2(PyObject* args)
Py_RETURN_NONE;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_VertexProxy.h b/source/gameengine/Ketsji/KX_VertexProxy.h
index b39d3ecb7d4..a5f2e5a08e0 100644
--- a/source/gameengine/Ketsji/KX_VertexProxy.h
+++ b/source/gameengine/Ketsji/KX_VertexProxy.h
@@ -29,7 +29,7 @@
#ifndef __KX_VERTEXPROXY
#define __KX_VERTEXPROXY
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "SCA_IObject.h"
@@ -102,7 +102,7 @@ public:
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
#endif //__KX_VERTEXPROXY
diff --git a/source/gameengine/Ketsji/KX_VisibilityActuator.cpp b/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
index e2f2badf051..464dbd14721 100644
--- a/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
+++ b/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
@@ -79,7 +79,7 @@ KX_VisibilityActuator::Update()
return false;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -121,4 +121,4 @@ PyAttributeDef KX_VisibilityActuator::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_WorldInfo.h b/source/gameengine/Ketsji/KX_WorldInfo.h
index 3b3d52f91f7..fb730c5502f 100644
--- a/source/gameengine/Ketsji/KX_WorldInfo.h
+++ b/source/gameengine/Ketsji/KX_WorldInfo.h
@@ -58,6 +58,7 @@ public:
virtual float getAmbientColorGreen()=0;
virtual float getAmbientColorBlue()=0;
+ virtual void setBackColor(float,float,float)=0;
virtual void setMistStart(float)=0;
virtual void setMistDistance(float)=0;
virtual void setMistColorRed(float)=0;
diff --git a/source/gameengine/Ketsji/Makefile b/source/gameengine/Ketsji/Makefile
deleted file mode 100644
index 79c8626d295..00000000000
--- a/source/gameengine/Ketsji/Makefile
+++ /dev/null
@@ -1,78 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = ketsji
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += $(NAN_SDLCFLAGS)
-CPPFLAGS += $(OGL_CPPFLAGS)
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I../../blender/python
-CPPFLAGS += -I../../blender/python/generic
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_BULLET2)/include
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-
-CPPFLAGS += -I../Rasterizer/RAS_OpenGLRasterizer
-CPPFLAGS += -I../Rasterizer -I../GameLogic -I../SceneGraph
-CPPFLAGS += -I../BlenderRoutines -I../Expressions
-CPPFLAGS += -I../../kernel/gen_system
-CPPFLAGS += -I../Network -IKXNetwork
-CPPFLAGS += -I../Physics/common
-CPPFLAGS += -I../Physics/Dummy
-CPPFLAGS += -I../Physics/Bullet
-CPPFLAGS += -I.
-CPPFLAGS += -I../Converter
-CPPFLAGS += -I../../blender/blenkernel
-CPPFLAGS += -I../../blender/blenlib
-CPPFLAGS += -I../../blender/blenloader
-CPPFLAGS += -I../../blender/makesdna
-CPPFLAGS += -I../../blender/imbuf
-CPPFLAGS += -I../../blender/gpu
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-ifeq ($(WITH_FFMPEG), true)
- CPPFLAGS += -DWITH_FFMPEG
-endif
-
-###########################
-
-SOURCEDIR = source/gameengine/Ketsji
-DIRS = KXNetwork
-
-include nan_subdirs.mk
-
diff --git a/source/gameengine/Ketsji/SConscript b/source/gameengine/Ketsji/SConscript
index 37193d7cc77..f14bff76148 100644
--- a/source/gameengine/Ketsji/SConscript
+++ b/source/gameengine/Ketsji/SConscript
@@ -12,11 +12,11 @@ incs += ' #source/kernel/gen_system #intern/string #intern/guardedalloc'
incs += ' #source/gameengine/Rasterizer/RAS_OpenGLRasterizer'
incs += ' #intern/audaspace/intern #source/gameengine/Converter'
incs += ' #source/gameengine/BlenderRoutines #source/blender/imbuf #intern/moto/include'
-incs += ' #source/gameengine/Ketsji #source/gameengine/Ketsji/KXNetwork #source/blender/blenlib'
+incs += ' #source/gameengine/Ketsji #source/gameengine/Ketsji/KXNetwork #source/blender/blenlib #source/blender/blenfont'
incs += ' #source/blender/blenkernel #source/blender #source/blender/editors/include'
incs += ' #source/blender/makesdna #source/blender/python #source/gameengine/Rasterizer'
incs += ' #source/gameengine/GameLogic #source/gameengine/Expressions #source/gameengine/Network'
-incs += ' #source/gameengine/SceneGraph #source/gameengine/Physics/common #source/gameengine/Physics/Bullet'
+incs += ' #source/gameengine/SceneGraph #source/gameengine/Physics/common'
incs += ' #source/gameengine/Physics/Dummy'
incs += ' #source/blender/misc #source/blender/blenloader #extern/glew/include #source/blender/gpu'
incs += ' #extern/recastnavigation/Recast/Include #extern/recastnavigation/Detour/Include'
@@ -32,8 +32,7 @@ else:
if env['WITH_BF_PYTHON']:
incs += ' ' + env['BF_PYTHON_INC']
-else:
- defs.append('DISABLE_PYTHON')
+ defs.append('WITH_PYTHON')
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
@@ -42,4 +41,11 @@ if env['OURPLATFORM'] in ('win32-vc', 'win64-vc', 'win32-mingw'):
if env['BF_DEBUG']:
defs.append('_DEBUG') # for Python
-env.BlenderLib ( 'bf_ketsji', sources, Split(incs), defs, libtype=['core','player'], priority=[320,45], cxx_compileflags=env['BGE_CXXFLAGS'])
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+
+if env['WITH_BF_BULLET']:
+ defs.append('USE_BULLET')
+ incs += ' #source/gameengine/Physics/Bullet'
+
+env.BlenderLib ( 'ge_logic_ketsji', sources, Split(incs), defs, libtype=['core','player'], priority=[320,45], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/Makefile b/source/gameengine/Makefile
deleted file mode 100644
index 0fdac2acce2..00000000000
--- a/source/gameengine/Makefile
+++ /dev/null
@@ -1,44 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-include nan_definitions.mk
-
-SOURCEDIR = source/gameengine
-DIR = $(OCGDIR)/gameengine
-DIRS = BlenderRoutines
-DIRS += Converter
-DIRS += Expressions GameLogic Ketsji Rasterizer SceneGraph
-DIRS += Network Physics VideoTexture
-
-ifeq ($(WITH_BF_BLENDERGAMEENGINE),true)
-# DIRS += GamePlayer
-endif
-
-include nan_subdirs.mk
diff --git a/source/gameengine/Network/CMakeLists.txt b/source/gameengine/Network/CMakeLists.txt
index 795e63b47c3..6a2b5fe841e 100644
--- a/source/gameengine/Network/CMakeLists.txt
+++ b/source/gameengine/Network/CMakeLists.txt
@@ -24,13 +24,22 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../source/kernel/gen_system
../../../intern/string
../../../intern/moto/include
)
-BLENDERLIB(bf_ngnetwork "${SRC}" "${INC}")
+set(SRC
+ NG_NetworkMessage.cpp
+ NG_NetworkObject.cpp
+ NG_NetworkScene.cpp
+
+ NG_NetworkDeviceInterface.h
+ NG_NetworkMessage.h
+ NG_NetworkObject.h
+ NG_NetworkScene.h
+)
+
+blender_add_lib(ge_logic_ngnetwork "${SRC}" "${INC}")
diff --git a/source/gameengine/Network/LoopBackNetwork/CMakeLists.txt b/source/gameengine/Network/LoopBackNetwork/CMakeLists.txt
index e7c34f5a2a0..4cf43a1fc93 100644
--- a/source/gameengine/Network/LoopBackNetwork/CMakeLists.txt
+++ b/source/gameengine/Network/LoopBackNetwork/CMakeLists.txt
@@ -24,13 +24,17 @@
#
# ***** END GPL LICENSE BLOCK *****
-SET(SRC NG_LoopBackNetworkDeviceInterface.cpp)
-
-SET(INC
+set(INC
.
../../../../source/kernel/gen_system
../../../../intern/string
../../../../source/gameengine/Network
)
-BLENDERLIB(bf_loopbacknetwork "${SRC}" "${INC}")
+set(SRC
+ NG_LoopBackNetworkDeviceInterface.cpp
+
+ NG_LoopBackNetworkDeviceInterface.h
+)
+
+blender_add_lib(ge_logic_loopbacknetwork "${SRC}" "${INC}")
diff --git a/source/gameengine/Network/LoopBackNetwork/Makefile b/source/gameengine/Network/LoopBackNetwork/Makefile
deleted file mode 100644
index 236c28b0f23..00000000000
--- a/source/gameengine/Network/LoopBackNetwork/Makefile
+++ /dev/null
@@ -1,41 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = LoopBackNetwork
-DIR = $(OCGDIR)/gameengine/Network/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I..
-CPPFLAGS += -I../../../kernel/gen_system
-
diff --git a/source/gameengine/Network/LoopBackNetwork/SConscript b/source/gameengine/Network/LoopBackNetwork/SConscript
index dd23e1327eb..af76065cc94 100644
--- a/source/gameengine/Network/LoopBackNetwork/SConscript
+++ b/source/gameengine/Network/LoopBackNetwork/SConscript
@@ -5,4 +5,4 @@ sources = 'NG_LoopBackNetworkDeviceInterface.cpp'
incs = '. #source/kernel/gen_system #intern/string #source/gameengine/Network'
-env.BlenderLib ( 'bf_loopbacknetwork', Split(sources), Split(incs), defines=[],libtype=['core','player'], priority=[400,135] )
+env.BlenderLib ( 'ge_logic_loopbacknetwork', Split(sources), Split(incs), defines=[],libtype=['core','player'], priority=[400,135] )
diff --git a/source/gameengine/Network/Makefile b/source/gameengine/Network/Makefile
deleted file mode 100644
index 99a047c8b95..00000000000
--- a/source/gameengine/Network/Makefile
+++ /dev/null
@@ -1,48 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = Network
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I../GameLogic
-CPPFLAGS += -I../../kernel/gen_system
-
-##############
-
-DIRS = LoopBackNetwork
-SOURCEDIR = source/gameengine/Network
-
-include nan_subdirs.mk
diff --git a/source/gameengine/Network/SConscript b/source/gameengine/Network/SConscript
index 3883dc71c9c..1b63592d0a4 100644
--- a/source/gameengine/Network/SConscript
+++ b/source/gameengine/Network/SConscript
@@ -5,4 +5,10 @@ sources = env.Glob('*.cpp') #'NG_NetworkMessage.cpp NG_NetworkObject.cpp NG_Netw
incs = '. #source/kernel/gen_system #intern/string #intern/moto/include'
-env.BlenderLib ( 'bf_ngnetwork', sources, Split(incs), [], libtype=['core','player'], priority=[400,130] )
+defs = []
+
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+ incs += ' #intern/guardedalloc'
+
+env.BlenderLib ( 'ge_logic_ngnetwork', sources, Split(incs), defs, libtype=['core','player'], priority=[400,130] )
diff --git a/source/gameengine/Network/TerraplayNetwork/Makefile b/source/gameengine/Network/TerraplayNetwork/Makefile
deleted file mode 100644
index d5a4c86740b..00000000000
--- a/source/gameengine/Network/TerraplayNetwork/Makefile
+++ /dev/null
@@ -1,42 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = TerraPlayNetwork
-DIR = $(OCGDIR)/gameengine/Network/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(LCGDIR)/terraplay/include
-CPPFLAGS += -I../../../kernel/gen_system
-CPPFLAGS += -I..
-
diff --git a/source/gameengine/Physics/Bullet/CMakeLists.txt b/source/gameengine/Physics/Bullet/CMakeLists.txt
index 95888967b78..c677685de49 100644
--- a/source/gameengine/Physics/Bullet/CMakeLists.txt
+++ b/source/gameengine/Physics/Bullet/CMakeLists.txt
@@ -24,9 +24,10 @@
#
# ***** END GPL LICENSE BLOCK *****
-SET(SRC CcdPhysicsEnvironment.cpp CcdPhysicsController.cpp CcdGraphicController.cpp)
+# since this includes bullet we get errors from the headers too
+remove_strict_flags()
-SET(INC
+set(INC
.
../common
../../../../extern/bullet2/src
@@ -43,7 +44,21 @@ SET(INC
../../../../source/blender/makesdna
../../../../source/blender/blenlib
../../../../source/blender/blenkernel
- ${PYTHON_INC}
+ ${PYTHON_INCLUDE_DIRS}
)
-BLENDERLIB(bf_bullet "${SRC}" "${INC}")
+set(SRC
+ CcdPhysicsEnvironment.cpp
+ CcdPhysicsController.cpp
+ CcdGraphicController.cpp
+
+ CcdGraphicController.h
+ CcdPhysicsController.h
+ CcdPhysicsEnvironment.h
+)
+
+if(WITH_BULLET)
+ add_definitions(-DUSE_BULLET)
+endif()
+
+blender_add_lib(ge_phys_bullet "${SRC}" "${INC}")
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
index 421a9fc64b8..8d3c1565d3a 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
@@ -13,6 +13,10 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+#ifndef WIN32
+#include <stdint.h>
+#endif
+
#include "CcdPhysicsController.h"
#include "btBulletDynamicsCommon.h"
#include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h"
@@ -1690,12 +1694,16 @@ bool CcdShapeConstructionInfo::UpdateMesh(class KX_GameObject* gameobj, class RA
return false;
RAS_Deformer *deformer= gameobj ? gameobj->GetDeformer():NULL;
+ DerivedMesh* dm = NULL;
+
+ if (deformer)
+ dm = deformer->GetPhysicsMesh();
/* get the mesh from the object if not defined */
if(meshobj==NULL) {
/* modifier mesh */
- if(deformer && deformer->GetFinalMesh())
+ if(dm)
meshobj= deformer->GetRasMesh();
/* game object first mesh */
@@ -1706,14 +1714,12 @@ bool CcdShapeConstructionInfo::UpdateMesh(class KX_GameObject* gameobj, class RA
}
}
- if(deformer && deformer->GetFinalMesh() && deformer->GetRasMesh() == meshobj)
+ if(dm && deformer->GetRasMesh() == meshobj)
{ /*
* Derived Mesh Update
*
* */
- DerivedMesh* dm= gameobj->GetDeformer()->GetFinalMesh();
-
MVert *mvert = dm->getVertArray(dm);
MFace *mface = dm->getFaceArray(dm);
numpolys = dm->getNumFaces(dm);
@@ -1973,6 +1979,10 @@ bool CcdShapeConstructionInfo::UpdateMesh(class KX_GameObject* gameobj, class RA
m_meshObject= meshobj;
+ if (dm) {
+ dm->needsFree = 1;
+ dm->release(dm);
+ }
return true;
}
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
index 477a2c35d4f..eb525af7dc7 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
@@ -287,6 +287,7 @@ void CcdPhysicsEnvironment::setDebugDrawer(btIDebugDraw* debugDrawer)
m_debugDrawer = debugDrawer;
}
+#if 0
static void DrawAabb(btIDebugDraw* debugDrawer,const btVector3& from,const btVector3& to,const btVector3& color)
{
btVector3 halfExtents = (to-from)* 0.5f;
@@ -314,10 +315,8 @@ static void DrawAabb(btIDebugDraw* debugDrawer,const btVector3& from,const btVec
if (i<3)
edgecoord[i]*=-1.f;
}
-
-
}
-
+#endif
diff --git a/source/gameengine/Physics/Bullet/Makefile b/source/gameengine/Physics/Bullet/Makefile
deleted file mode 100644
index 0514565534d..00000000000
--- a/source/gameengine/Physics/Bullet/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blbullet
-DIR = $(OCGDIR)/gameengine/blphys/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_BULLET2)/include
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I../../../kernel/gen_system
-CPPFLAGS += -I../../Physics/common
-CPPFLAGS += -I../../Physics/Dummy
-CPPFLAGS += -I../../Rasterizer
-CPPFLAGS += -I../../Ketsji
-CPPFLAGS += -I../../Expressions
-CPPFLAGS += -I../../GameLogic
-CPPFLAGS += -I../../SceneGraph
-CPPFLAGS += -I../../../../source/blender/makesdna
-CPPFLAGS += -I../../../../source/blender/blenkernel
-CPPFLAGS += -I../../../../source/blender/blenlib
-
diff --git a/source/gameengine/Physics/Bullet/SConscript b/source/gameengine/Physics/Bullet/SConscript
index f58085ab354..f8f0f8afaea 100644
--- a/source/gameengine/Physics/Bullet/SConscript
+++ b/source/gameengine/Physics/Bullet/SConscript
@@ -24,7 +24,12 @@ defs = []
if env['WITH_BF_PYTHON']:
incs += ' ' + env['BF_PYTHON_INC']
-else:
- defs.append('DISABLE_PYTHON')
+ defs.append('WITH_PYTHON')
-env.BlenderLib ( 'bf_bullet', Split(sources), Split(incs), defs, libtype=['core','player'], priority=[350,50], cxx_compileflags=env['BGE_CXXFLAGS'])
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+
+if env['WITH_BF_BULLET']:
+ defs.append('USE_BULLET')
+
+env.BlenderLib ( 'ge_phys_bullet', Split(sources), Split(incs), defs, libtype=['core','player'], priority=[350,50], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/Physics/Dummy/CMakeLists.txt b/source/gameengine/Physics/Dummy/CMakeLists.txt
index 18330392cd7..fd7f37897eb 100644
--- a/source/gameengine/Physics/Dummy/CMakeLists.txt
+++ b/source/gameengine/Physics/Dummy/CMakeLists.txt
@@ -24,11 +24,15 @@
#
# ***** END GPL LICENSE BLOCK *****
-SET(SRC DummyPhysicsEnvironment.cpp)
-
-SET(INC
+set(INC
.
../common
)
-BLENDERLIB(bf_dummy "${SRC}" "${INC}")
+set(SRC
+ DummyPhysicsEnvironment.cpp
+
+ DummyPhysicsEnvironment.h
+)
+
+blender_add_lib(ge_phys_dummy "${SRC}" "${INC}")
diff --git a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp
index 524cffc2732..86223a0ea60 100644
--- a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp
@@ -26,6 +26,9 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+#include <stddef.h>
+
#include "DummyPhysicsEnvironment.h"
#include "PHY_IMotionState.h"
diff --git a/source/gameengine/Physics/Dummy/Makefile b/source/gameengine/Physics/Dummy/Makefile
deleted file mode 100644
index 9a600a0365f..00000000000
--- a/source/gameengine/Physics/Dummy/Makefile
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = dummy
-DIR = $(OCGDIR)/gameengine/blphys/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../Physics/common
-CPPFLAGS += -I../../Physics/Dummy
diff --git a/source/gameengine/Physics/Dummy/SConscript b/source/gameengine/Physics/Dummy/SConscript
index dc76e8046a0..13d1a893823 100644
--- a/source/gameengine/Physics/Dummy/SConscript
+++ b/source/gameengine/Physics/Dummy/SConscript
@@ -5,4 +5,10 @@ sources = 'DummyPhysicsEnvironment.cpp'
incs = '. ../common'
-env.BlenderLib ( 'bf_dummy', Split(sources), Split(incs), [], libtype=['core','player'], priority=[350,60] )
+defs = []
+
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+ incs += ' #intern/guardedalloc'
+
+env.BlenderLib ( 'ge_phys_dummy', Split(sources), Split(incs), defs, libtype=['core','player'], priority=[350,60] )
diff --git a/source/gameengine/Physics/Makefile b/source/gameengine/Physics/Makefile
deleted file mode 100644
index f5f914c2ac2..00000000000
--- a/source/gameengine/Physics/Makefile
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-include nan_definitions.mk
-
-SOURCEDIR = source/gameengine/Physics
-DIR = $(OCGDIR)/gameengine/blphys
-DIRS = common Dummy Bullet
-
-include nan_subdirs.mk
diff --git a/source/gameengine/Physics/common/CMakeLists.txt b/source/gameengine/Physics/common/CMakeLists.txt
index 0f8f59f3b78..50aa9083089 100644
--- a/source/gameengine/Physics/common/CMakeLists.txt
+++ b/source/gameengine/Physics/common/CMakeLists.txt
@@ -24,12 +24,27 @@
#
# ***** END GPL LICENSE BLOCK *****
-SET(SRC PHY_IMotionState.cpp PHY_IController.cpp PHY_IPhysicsController.cpp PHY_IGraphicController.cpp PHY_IPhysicsEnvironment.cpp PHY_IVehicle.cpp)
-
-SET(INC
+set(INC
.
../Dummy
- ../../../intern/moto/include
)
-BLENDERLIB(bf_common "${SRC}" "${INC}")
+set(SRC
+ PHY_IMotionState.cpp
+ PHY_IController.cpp
+ PHY_IPhysicsController.cpp
+ PHY_IGraphicController.cpp
+ PHY_IPhysicsEnvironment.cpp
+ PHY_IVehicle.cpp
+
+ PHY_DynamicTypes.h
+ PHY_IController.h
+ PHY_IGraphicController.h
+ PHY_IMotionState.h
+ PHY_IPhysicsController.h
+ PHY_IPhysicsEnvironment.h
+ PHY_IVehicle.h
+ PHY_Pro.h
+)
+
+blender_add_lib(ge_phys_common "${SRC}" "${INC}")
diff --git a/source/gameengine/Physics/common/Makefile b/source/gameengine/Physics/common/Makefile
deleted file mode 100644
index 369699e1b90..00000000000
--- a/source/gameengine/Physics/common/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = common
-DIR = $(OCGDIR)/gameengine/blphys/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I../../blender
-# these two needed because of blenkernel
-CPPFLAGS += -I../../blender/makesdna
-CPPFLAGS += -I../../blender/include
-CPPFLAGS += -I../../blender/blenlib
-CPPFLAGS += -I../../blender/blenkernel
-CPPFLAGS += -I../../blender/render/extern/include
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../Expressions -I../Rasterizer -I../GameLogic
-CPPFLAGS += -I../Ketsji -I../BlenderRoutines -I../SceneGraph
-CPPFLAGS += -I../../kernel/gen_system
-CPPFLAGS += -I../Rasterizer/RAS_OpenGLRasterizer
-CPPFLAGS += -I../Network -I../Ketsji/KXNetwork
-CPPFLAGS += -I../Physics
-CPPFLAGS += -I../Physics/Dummy
diff --git a/source/gameengine/Physics/common/SConscript b/source/gameengine/Physics/common/SConscript
index 719c028ee8f..abff3e33121 100644
--- a/source/gameengine/Physics/common/SConscript
+++ b/source/gameengine/Physics/common/SConscript
@@ -5,4 +5,10 @@ sources = 'PHY_IMotionState.cpp PHY_IController.cpp PHY_IPhysicsController.cpp P
incs = '. ../Dummy #intern/moto/include'
-env.BlenderLib ( 'bf_physics_common', Split(sources), Split(incs), [], libtype=['core','player'], priority=[360,55], cxx_compileflags=env['BGE_CXXFLAGS'])
+defs = []
+
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+ incs += ' #intern/guardedalloc'
+
+env.BlenderLib ( 'ge_phys_common', Split(sources), Split(incs), defs, libtype=['core','player'], priority=[360,55], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/PyDoc/bge.events.rst b/source/gameengine/PyDoc/bge.events.rst
deleted file mode 100644
index f642291fe97..00000000000
--- a/source/gameengine/PyDoc/bge.events.rst
+++ /dev/null
@@ -1,229 +0,0 @@
-
-Game Engine bge.events module
-=============================
-
-*****
-Intro
-*****
-
-This module holds key constants for the SCA_KeyboardSensor.
-
-.. module:: bge.events
-
-.. code-block:: python
-
- # Set a connected keyboard sensor to accept F1
- import bge
-
- co = bge.logic.getCurrentController()
- # 'Keyboard' is a keyboard sensor
- sensor = co.sensors["Keyboard"]
- sensor.key = bge.keys.F1KEY
-
-.. code-block:: python
-
- # Do the all keys thing
- import bge
-
- co = bge.logic.getCurrentController()
- # 'Keyboard' is a keyboard sensor
- sensor = co.sensors["Keyboard"]
-
- for key,status in sensor.events:
- # key[0] == bge.keys.keycode, key[1] = status
- if status == bge.logic.KX_INPUT_JUST_ACTIVATED:
- if key == bge.keys.WKEY:
- # Activate Forward!
- if key == bge.keys.SKEY:
- # Activate Backward!
- if key == bge.keys.AKEY:
- # Activate Left!
- if key == bge.keys.DKEY:
- # Activate Right!
-
-*********
-Functions
-*********
-
-.. function:: EventToString(event)
-
- Return the string name of a key event. Will raise a ValueError error if its invalid.
-
- :arg event: key event from bge.keys or the keyboard sensor.
- :type event: int
- :rtype: string
-
-.. function:: EventToCharacter(event, shift)
-
- Return the string name of a key event. Returns an empty string if the event cant be represented as a character.
-
- :type event: int
- :arg event: key event from :mod:`bge.keys` or the keyboard sensor.
- :type shift: bool
- :arg shift: set to true if shift is held.
- :rtype: string
-
-****************
-Keys (Constants)
-****************
-
-.. _mouse-keys:
-
-==========
-Mouse Keys
-==========
-
-.. data:: LEFTMOUSE
-.. data:: MIDDLEMOUSE
-.. data:: RIGHTMOUSE
-.. data:: WHEELUPMOUSE
-.. data:: WHEELDOWNMOUSE
-.. data:: MOUSEX
-.. data:: MOUSEY
-
-.. _keyboard-keys:
-
-=============
-Keyboard Keys
-=============
-
--------------
-Alphabet keys
--------------
-
-.. data:: AKEY
-.. data:: BKEY
-.. data:: CKEY
-.. data:: DKEY
-.. data:: EKEY
-.. data:: FKEY
-.. data:: GKEY
-.. data:: HKEY
-.. data:: IKEY
-.. data:: JKEY
-.. data:: KKEY
-.. data:: LKEY
-.. data:: MKEY
-.. data:: NKEY
-.. data:: OKEY
-.. data:: PKEY
-.. data:: QKEY
-.. data:: RKEY
-.. data:: SKEY
-.. data:: TKEY
-.. data:: UKEY
-.. data:: VKEY
-.. data:: WKEY
-.. data:: XKEY
-.. data:: YKEY
-.. data:: ZKEY
-
------------
-Number keys
------------
-
-.. data:: ZEROKEY
-.. data:: ONEKEY
-.. data:: TWOKEY
-.. data:: THREEKEY
-.. data:: FOURKEY
-.. data:: FIVEKEY
-.. data:: SIXKEY
-.. data:: SEVENKEY
-.. data:: EIGHTKEY
-.. data:: NINEKEY
-
---------------
-Modifiers Keys
---------------
-
-.. data:: CAPSLOCKKEY
-.. data:: LEFTCTRLKEY
-.. data:: LEFTALTKEY
-.. data:: RIGHTALTKEY
-.. data:: RIGHTCTRLKEY
-.. data:: RIGHTSHIFTKEY
-.. data:: LEFTSHIFTKEY
-
-----------
-Arrow Keys
-----------
-
-.. data:: LEFTARROWKEY
-.. data:: DOWNARROWKEY
-.. data:: RIGHTARROWKEY
-.. data:: UPARROWKEY
-
---------------
-Numberpad Keys
---------------
-
-.. data:: PAD0
-.. data:: PAD1
-.. data:: PAD2
-.. data:: PAD3
-.. data:: PAD4
-.. data:: PAD5
-.. data:: PAD6
-.. data:: PAD7
-.. data:: PAD8
-.. data:: PAD9
-.. data:: PADPERIOD
-.. data:: PADSLASHKEY
-.. data:: PADASTERKEY
-.. data:: PADMINUS
-.. data:: PADENTER
-.. data:: PADPLUSKEY
-
--------------
-Function Keys
--------------
-
-.. data:: F1KEY
-.. data:: F2KEY
-.. data:: F3KEY
-.. data:: F4KEY
-.. data:: F5KEY
-.. data:: F6KEY
-.. data:: F7KEY
-.. data:: F8KEY
-.. data:: F9KEY
-.. data:: F10KEY
-.. data:: F11KEY
-.. data:: F12KEY
-.. data:: F13KEY
-.. data:: F14KEY
-.. data:: F15KEY
-.. data:: F16KEY
-.. data:: F17KEY
-.. data:: F18KEY
-.. data:: F19KEY
-
-----------
-Other Keys
-----------
-
-.. data:: ACCENTGRAVEKEY
-.. data:: BACKSLASHKEY
-.. data:: BACKSPACEKEY
-.. data:: COMMAKEY
-.. data:: DELKEY
-.. data:: ENDKEY
-.. data:: EQUALKEY
-.. data:: ESCKEY
-.. data:: HOMEKEY
-.. data:: INSERTKEY
-.. data:: LEFTBRACKETKEY
-.. data:: LINEFEEDKEY
-.. data:: MINUSKEY
-.. data:: PAGEDOWNKEY
-.. data:: PAGEUPKEY
-.. data:: PAUSEKEY
-.. data:: PERIODKEY
-.. data:: QUOTEKEY
-.. data:: RIGHTBRACKETKEY
-.. data:: RETKEY
-.. data:: SEMICOLONKEY
-.. data:: SLASHKEY
-.. data:: SPACEKEY
-.. data:: TABKEY
diff --git a/source/gameengine/PyDoc/bge.logic.rst b/source/gameengine/PyDoc/bge.logic.rst
deleted file mode 100644
index a7eb5635d0f..00000000000
--- a/source/gameengine/PyDoc/bge.logic.rst
+++ /dev/null
@@ -1,932 +0,0 @@
-
-Game Engine bge.logic Module
-============================
-*****
-Intro
-*****
-
-Module to access logic functions, imported automatically into the python controllers namespace.
-
-.. module:: bge.logic
-
-.. code-block:: python
-
- # To get the controller thats running this python script:
- cont = bge.logic.getCurrentController() # bge.logic is automatically imported
-
- # To get the game object this controller is on:
- obj = cont.owner
-
-:class:`~bge.types.KX_GameObject` and :class:`~bge.types.KX_Camera` or :class:`bge.types.~KX_LightObject` methods are available depending on the type of object
-
-.. code-block:: python
-
- # To get a sensor linked to this controller.
- # "sensorname" is the name of the sensor as defined in the Blender interface.
- # +---------------------+ +--------+
- # | Sensor "sensorname" +--+ Python +
- # +---------------------+ +--------+
- sens = cont.sensors["sensorname"]
-
- # To get a sequence of all sensors:
- sensors = co.sensors
-
-See the sensor's reference for available methods:
-
-.. hlist::
- :columns: 3
-
- * :class:`~bge.types.KX_MouseFocusSensor`
- * :class:`~bge.types.KX_NearSensor`
- * :class:`~bge.types.KX_NetworkMessageSensor`
- * :class:`~bge.types.KX_RadarSensor`
- * :class:`~bge.types.KX_RaySensor`
- * :class:`~bge.types.KX_TouchSensor`
- * :class:`~bge.types.SCA_DelaySensor`
- * :class:`~bge.types.SCA_JoystickSensor`
- * :class:`~bge.types.SCA_KeyboardSensor`
- * :class:`~bge.types.SCA_MouseSensor`
- * :class:`~bge.types.SCA_PropertySensor`
- * :class:`~bge.types.SCA_RandomSensor`
-
-You can also access actuators linked to the controller
-
-.. code-block:: python
-
- # To get an actuator attached to the controller:
- # +--------+ +-------------------------+
- # + Python +--+ Actuator "actuatorname" |
- # +--------+ +-------------------------+
- actuator = co.actuators["actuatorname"]
-
- # Activate an actuator
- controller.activate(actuator)
-
-See the actuator's reference for available methods
-
-.. hlist::
- :columns: 3
-
- * :class:`~bge.types.BL_ActionActuator`
- * :class:`~bge.types.BL_ShapeActionActuator`
- * :class:`~bge.types.KX_CameraActuator`
- * :class:`~bge.types.KX_ConstraintActuator`
- * :class:`~bge.types.KX_GameActuator`
- * :class:`~bge.types.KX_IpoActuator`
- * :class:`~bge.types.KX_NetworkMessageActuator`
- * :class:`~bge.types.KX_ObjectActuator`
- * :class:`~bge.types.KX_ParentActuator`
- * :class:`~bge.types.KX_SCA_AddObjectActuator`
- * :class:`~bge.types.KX_SCA_DynamicActuator`
- * :class:`~bge.types.KX_SCA_EndObjectActuator`
- * :class:`~bge.types.KX_SCA_ReplaceMeshActuator`
- * :class:`~bge.types.KX_SceneActuator`
- * :class:`~bge.types.KX_SoundActuator`
- * :class:`~bge.types.KX_StateActuator`
- * :class:`~bge.types.KX_TrackToActuator`
- * :class:`~bge.types.KX_VisibilityActuator`
- * :class:`~bge.types.SCA_2DFilterActuator`
- * :class:`~bge.types.SCA_PropertyActuator`
- * :class:`~bge.types.SCA_RandomActuator`
-
-Most logic brick's methods are accessors for the properties available in the logic buttons.
-Consult the logic bricks documentation for more information on how each logic brick works.
-
-There are also methods to access the current :class:`bge.types.KX_Scene`
-
-.. code-block:: python
-
- # Get the current scene
- scene = bge.logic.getCurrentScene()
-
- # Get the current camera
- cam = scene.active_camera
-
-Matricies as used by the game engine are **row major**
-``matrix[row][col] = float``
-
-:class:`bge.types.KX_Camera` has some examples using matricies.
-
-*********
-Variables
-*********
-
-.. data:: globalDict
-
- A dictionary that is saved between loading blend files so you can use it to store inventory and other variables you want to store between scenes and blend files.
- It can also be written to a file and loaded later on with the game load/save actuators.
-
- .. note:: only python built in types such as int/string/bool/float/tuples/lists can be saved, GameObjects, Actuators etc will not work as expected.
-
-.. data:: keyboard
-
- The current keyboard wrapped in an :class:`~bge.types.SCA_PythonKeyboard` object.
-
-.. data:: mouse
-
- The current mouse wrapped in an :class:`~bge.types.SCA_PythonMouse` object.
-
-*****************
-General functions
-*****************
-
-.. function:: getCurrentController()
-
- Gets the Python controller associated with this Python script.
-
- :rtype: :class:`bge.types.SCA_PythonController`
-
-.. function:: getCurrentScene()
-
- Gets the current Scene.
-
- :rtype: :class:`bge.types.KX_Scene`
-
-.. function:: getSceneList()
-
- Gets a list of the current scenes loaded in the game engine.
-
- :rtype: list of :class:`bge.types.KX_Scene`
-
- .. note:: Scenes in your blend file that have not been converted wont be in this list. This list will only contain scenes such as overlays scenes.
-
-.. function:: loadGlobalDict()
-
- Loads bge.logic.globalDict from a file.
-
-.. function:: saveGlobalDict()
-
- Saves bge.logic.globalDict to a file.
-
-.. function:: startGame(blend)
-
- Loads the blend file.
-
- :arg blend: The name of the blend file
- :type blend: string
-
-.. function:: endGame()
-
- Ends the current game.
-
-.. function:: restartGame()
-
- Restarts the current game by reloading the .blend file (the last saved version, not what is currently running).
-
-.. function:: LibLoad(blend, type, data)
-
- Converts the all of the datablocks of the given type from the given blend.
-
- :arg blend: The path to the blend file (or the name to use for the library if data is supplied)
- :type blend: string
- :arg type: The datablock type (currently only "Scene" and "Mesh" are supported)
- :type type: string
- :arg data: Binary data from a blend file (optional)
- :type data: bytes
-
-.. function:: LibNew(name, type, data)
-
- Uses existing datablock data and loads in as a new library.
-
- :arg name: A unique library name used for removal later
- :type name: string
- :arg type: The datablock type (currently only "Mesh" is supported)
- :type type: string
- :arg data: A list of names of the datablocks to load
- :type data: list of strings
-
-.. function:: LibFree(name)
-
- Frees a library, removing all objects and meshes from the currently active scenes.
-
- :arg name: The name of the library to free (the name used in LibNew)
- :type name: string
-
-.. function:: addScene(name, overlay=1)
-
- Loads a scene into the game engine.
-
- :arg name: The name of the scene
- :type name: string
- :arg overlay: Overlay or underlay (optional)
- :type overlay: integer
-
-.. function:: sendMessage(subject, body="", to="", message_from="")
-
- Sends a message to sensors in any active scene.
-
- :arg subject: The subject of the message
- :type subject: string
- :arg body: The body of the message (optional)
- :type body: string
- :arg to: The name of the object to send the message to (optional)
- :type to: string
- :arg message_from: The name of the object that the message is coming from (optional)
- :type message_from: string
-
-.. function:: setGravity(gravity)
-
- Sets the world gravity.
-
- :type gravity: list [fx, fy, fz]
-
-.. function:: getSpectrum()
-
- Returns a 512 point list from the sound card.
- This only works if the fmod sound driver is being used.
-
- :rtype: list [float], len(getSpectrum()) == 512
-
-.. function:: stopDSP()
-
- Stops the sound driver using DSP effects.
-
- Only the fmod sound driver supports this.
- DSP can be computationally expensive.
-
-.. function:: getMaxLogicFrame()
-
- Gets the maximum number of logic frames per render frame.
-
- :return: The maximum number of logic frames per render frame
- :rtype: integer
-
-.. function:: setMaxLogicFrame(maxlogic)
-
- Sets the maximum number of logic frames that are executed per render frame.
- This does not affect the physic system that still runs at full frame rate.
-
- :arg maxlogic: The new maximum number of logic frames per render frame. Valid values: 1..5
- :type maxlogic: integer
-
-.. function:: getMaxPhysicsFrame()
-
- Gets the maximum number of physics frames per render frame.
-
- :return: The maximum number of physics frames per render frame
- :rtype: integer
-
-.. function:: setMaxPhysicsFrame(maxphysics)
-
- Sets the maximum number of physics timestep that are executed per render frame.
- Higher value allows physics to keep up with realtime even if graphics slows down the game.
- Physics timestep is fixed and equal to 1/tickrate (see setLogicTicRate)
- maxphysics/ticrate is the maximum delay of the renderer that physics can compensate.
-
- :arg maxphysics: The new maximum number of physics timestep per render frame. Valid values: 1..5.
- :type maxphysics: integer
-
-.. function:: getLogicTicRate()
-
- Gets the logic update frequency.
-
- :return: The logic frequency in Hz
- :rtype: float
-
-.. function:: setLogicTicRate(ticrate)
-
- Sets the logic update frequency.
-
- The logic update frequency is the number of times logic bricks are executed every second.
- The default is 60 Hz.
-
- :arg ticrate: The new logic update frequency (in Hz).
- :type ticrate: float
-
-.. function:: getPhysicsTicRate()
-
- Gets the physics update frequency
-
- :return: The physics update frequency in Hz
- :rtype: float
-
- .. warning: Not implimented yet
-
-.. function:: setPhysicsTicRate(ticrate)
-
- Sets the physics update frequency
-
- The physics update frequency is the number of times the physics system is executed every second.
- The default is 60 Hz.
-
- :arg ticrate: The new update frequency (in Hz).
- :type ticrate: float
-
- .. warning: Not implimented yet
-
-*****************
-Utility functions
-*****************
-
-.. function:: expandPath(path)
-
- Converts a blender internal path into a proper file system path.
-
- Use / as directory separator in path
- You can use '//' at the start of the string to define a relative path;
- Blender replaces that string by the directory of the startup .blend or runtime file
- to make a full path name (doesn't change during the game, even if you load other .blend).
- The function also converts the directory separator to the local file system format.
-
- :arg path: The path string to be converted/expanded.
- :type path: string
- :return: The converted string
- :rtype: string
-
-.. function:: getAverageFrameRate()
-
- Gets the estimated average framerate
-
- :return: The estimed average framerate in frames per second
- :rtype: float
-
-.. function:: getBlendFileList(path = "//")
-
- Returns a list of blend files in the same directory as the open blend file, or from using the option argument.
-
- :arg path: Optional directory argument, will be expanded (like expandPath) into the full path.
- :type path: string
- :return: A list of filenames, with no directory prefix
- :rtype: list
-
-.. function:: getRandomFloat()
-
- Returns a random floating point value in the range [0 - 1)
-
-.. function:: PrintGLInfo()
-
- Prints GL Extension Info into the console
-
-*********
-Constants
-*********
-
-.. data:: KX_TRUE
-
- True value used by some modules.
-
-.. data:: KX_FALSE
-
- False value used by some modules.
-
-=======
-Sensors
-=======
-
-.. _sensor-status:
-
--------------
-Sensor Status
--------------
-
-.. data:: KX_SENSOR_INACTIVE
-.. data:: KX_SENSOR_JUST_ACTIVATED
-.. data:: KX_SENSOR_ACTIVE
-.. data:: KX_SENSOR_JUST_DEACTIVATED
-
-.. _logic-property-sensor:
-
----------------
-Property Sensor
----------------
-
-.. data:: KX_PROPSENSOR_EQUAL
-
- Activate when the property is equal to the sensor value.
-
- :value: 1
-
-.. data:: KX_PROPSENSOR_NOTEQUAL
-
- Activate when the property is not equal to the sensor value.
-
- :value: 2
-
-.. data:: KX_PROPSENSOR_INTERVAL
-
- Activate when the property is between the specified limits.
-
- :value: 3
-
-.. data:: KX_PROPSENSOR_CHANGED
-
- Activate when the property changes
-
- :value: 4
-
-.. data:: KX_PROPSENSOR_EXPRESSION
-
- Activate when the expression matches
-
- :value: 5
-
-------------
-Radar Sensor
-------------
-
-See :class:`bge.types.KX_RadarSensor`
-
-.. data:: KX_RADAR_AXIS_POS_X
-.. data:: KX_RADAR_AXIS_POS_Y
-.. data:: KX_RADAR_AXIS_POS_Z
-.. data:: KX_RADAR_AXIS_NEG_X
-.. data:: KX_RADAR_AXIS_NEG_Y
-.. data:: KX_RADAR_AXIS_NEG_Z
-
-----------
-Ray Sensor
-----------
-
-See :class:`bge.types.KX_RaySensor`
-
-.. data:: KX_RAY_AXIS_POS_X
-.. data:: KX_RAY_AXIS_POS_Y
-.. data:: KX_RAY_AXIS_POS_Z
-.. data:: KX_RAY_AXIS_NEG_X
-.. data:: KX_RAY_AXIS_NEG_Y
-.. data:: KX_RAY_AXIS_NEG_Z
-
-
-=========
-Actuators
-=========
-
-.. _action-actuator:
-
----------------
-Action Actuator
----------------
-
-See :class:`bge.types.BL_ActionActuator`
-
-.. data:: KX_ACTIONACT_PLAY
-.. data:: KX_ACTIONACT_FLIPPER
-.. data:: KX_ACTIONACT_LOOPSTOP
-.. data:: KX_ACTIONACT_LOOPEND
-.. data:: KX_ACTIONACT_PROPERTY
-
--------------------
-Constraint Actuator
--------------------
-
-.. _constraint-actuator-option:
-
-See :class:`bge.types.KX_ConstraintActuator.option`
-
-* Applicable to Distance constraint:
-
- .. data:: KX_ACT_CONSTRAINT_NORMAL
-
- Activate alignment to surface
-
- .. data:: KX_ACT_CONSTRAINT_DISTANCE
-
- Activate distance control
-
- .. data:: KX_ACT_CONSTRAINT_LOCAL
-
- Direction of the ray is along the local axis
-
-* Applicable to Force field constraint:
-
- .. data:: KX_ACT_CONSTRAINT_DOROTFH
-
- Force field act on rotation as well
-
-* Applicable to both:
-
- .. data:: KX_ACT_CONSTRAINT_MATERIAL
-
- Detect material rather than property
-
- .. data:: KX_ACT_CONSTRAINT_PERMANENT
-
- No deactivation if ray does not hit target
-
-.. _constraint-actuator-limit:
-
-See :class:`bge.types.KX_ConstraintActuator.limit`
-
-.. data:: KX_CONSTRAINTACT_LOCX
-
- Limit X coord.
-
-.. data:: KX_CONSTRAINTACT_LOCY
-
- Limit Y coord
-
-.. data:: KX_CONSTRAINTACT_LOCZ
-
- Limit Z coord
-
-.. data:: KX_CONSTRAINTACT_ROTX
-
- Limit X rotation
-
-.. data:: KX_CONSTRAINTACT_ROTY
-
- Limit Y rotation
-
-.. data:: KX_CONSTRAINTACT_ROTZ
-
- Limit Z rotation
-
-.. data:: KX_CONSTRAINTACT_DIRNX
-
- Set distance along negative X axis
-
-.. data:: KX_CONSTRAINTACT_DIRNY
-
- Set distance along negative Y axis
-
-.. data:: KX_CONSTRAINTACT_DIRNZ
-
- Set distance along negative Z axis
-
-.. data:: KX_CONSTRAINTACT_DIRPX
-
- Set distance along positive X axis
-
-.. data:: KX_CONSTRAINTACT_DIRPY
-
- Set distance along positive Y axis
-
-.. data:: KX_CONSTRAINTACT_DIRPZ
-
- Set distance along positive Z axis
-
-.. data:: KX_CONSTRAINTACT_ORIX
-
- Set orientation of X axis
-
-.. data:: KX_CONSTRAINTACT_ORIY
-
- Set orientation of Y axis
-
-.. data:: KX_CONSTRAINTACT_ORIZ
-
- Set orientation of Z axis
-
-.. data:: KX_ACT_CONSTRAINT_FHNX
-
- Set force field along negative X axis
-
-.. data:: KX_ACT_CONSTRAINT_FHNY
-
- Set force field along negative Y axis
-
-.. data:: KX_ACT_CONSTRAINT_FHNZ
-
- Set force field along negative Z axis
-
-.. data:: KX_ACT_CONSTRAINT_FHPX
-
- Set force field along positive X axis
-
-.. data:: KX_ACT_CONSTRAINT_FHPY
-
- Set force field along positive Y axis
-
-.. data:: KX_ACT_CONSTRAINT_FHPZ
-
- Set force field along positive Z axis
-
-----------------
-Dynamic Actuator
-----------------
-
-See :class:`bge.types.KX_SCA_DynamicActuator`
-
-.. data:: KX_DYN_RESTORE_DYNAMICS
-.. data:: KX_DYN_DISABLE_DYNAMICS
-.. data:: KX_DYN_ENABLE_RIGID_BODY
-.. data:: KX_DYN_DISABLE_RIGID_BODY
-.. data:: KX_DYN_SET_MASS
-
-.. _game-actuator:
-
--------------
-Game Actuator
--------------
-
-See :class:`bge.types.KX_GameActuator`
-
-.. data:: KX_GAME_LOAD
-.. data:: KX_GAME_START
-.. data:: KX_GAME_RESTART
-.. data:: KX_GAME_QUIT
-.. data:: KX_GAME_SAVECFG
-.. data:: KX_GAME_LOADCFG
-
-.. _ipo-actuator:
-
-------------
-IPO Actuator
-------------
-
-See :class:`bge.types.KX_IpoActuator`
-
-.. data:: KX_IPOACT_PLAY
-.. data:: KX_IPOACT_PINGPONG
-.. data:: KX_IPOACT_FLIPPER
-.. data:: KX_IPOACT_LOOPSTOP
-.. data:: KX_IPOACT_LOOPEND
-.. data:: KX_IPOACT_FROM_PROP
-
----------------
-Parent Actuator
----------------
-
-.. data:: KX_PARENT_REMOVE
-.. data:: KX_PARENT_SET
-
-.. _logic-random-distributions:
-
---------------------
-Random Distributions
---------------------
-
-See :class:`bge.types.SCA_RandomActuator`
-
-.. data:: KX_RANDOMACT_BOOL_CONST
-.. data:: KX_RANDOMACT_BOOL_UNIFORM
-.. data:: KX_RANDOMACT_BOOL_BERNOUILLI
-.. data:: KX_RANDOMACT_INT_CONST
-.. data:: KX_RANDOMACT_INT_UNIFORM
-.. data:: KX_RANDOMACT_INT_POISSON
-.. data:: KX_RANDOMACT_FLOAT_CONST
-.. data:: KX_RANDOMACT_FLOAT_UNIFORM
-.. data:: KX_RANDOMACT_FLOAT_NORMAL
-.. data:: KX_RANDOMACT_FLOAT_NEGATIVE_EXPONENTIAL
-
---------------
-Scene Actuator
---------------
-
-See :class:`bge.types.KX_SceneActuator`
-
-.. data:: KX_SCENE_RESTART
-.. data:: KX_SCENE_SET_SCENE
-.. data:: KX_SCENE_SET_CAMERA
-.. data:: KX_SCENE_ADD_FRONT_SCENE
-.. data:: KX_SCENE_ADD_BACK_SCENE
-.. data:: KX_SCENE_REMOVE_SCENE
-.. data:: KX_SCENE_SUSPEND
-.. data:: KX_SCENE_RESUME
-
-.. _shape-action-actuator:
-
----------------------
-Shape Action Actuator
----------------------
-
-See :class:`bge.types.BL_ActionActuator`
-
-.. data:: KX_ACTIONACT_PLAY
-.. data:: KX_ACTIONACT_FLIPPER
-.. data:: KX_ACTIONACT_LOOPSTOP
-.. data:: KX_ACTIONACT_LOOPEND
-.. data:: KX_ACTIONACT_PROPERTY
-
-.. _logic-sound-actuator:
-
---------------
-Sound Actuator
---------------
-
-See :class:`bge.types.KX_SoundActuator`
-
-.. data:: KX_SOUNDACT_PLAYSTOP
-
- :value: 1
-
-.. data:: KX_SOUNDACT_PLAYEND
-
- :value: 2
-
-.. data:: KX_SOUNDACT_LOOPSTOP
-
- :value: 3
-
-.. data:: KX_SOUNDACT_LOOPEND
-
- :value: 4
-
-.. data:: KX_SOUNDACT_LOOPBIDIRECTIONAL
-
- :value: 5
-
-.. data:: KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP
-
- :value: 6
-
-
-=======
-Various
-=======
-
-.. _input-status:
-
-------------
-Input Status
-------------
-
-See :class:`bge.types.SCA_PythonKeyboard`, :class:`bge.types.SCA_PythonMouse`, :class:`bge.types.SCA_MouseSensor`, :class:`bge.types.SCA_KeyboardSensor`
-
-.. data:: KX_INPUT_NONE
-.. data:: KX_INPUT_JUST_ACTIVATED
-.. data:: KX_INPUT_ACTIVE
-.. data:: KX_INPUT_JUST_RELEASED
-
--------------
-Mouse Buttons
--------------
-
-See :class:`bge.types.SCA_MouseSensor`
-
-.. data:: KX_MOUSE_BUT_LEFT
-.. data:: KX_MOUSE_BUT_MIDDLE
-.. data:: KX_MOUSE_BUT_RIGHT
-
-------
-States
-------
-
-See :class:`bge.types.KX_StateActuator`
-
-.. data:: KX_STATE1
-.. data:: KX_STATE2
-.. data:: KX_STATE3
-.. data:: KX_STATE4
-.. data:: KX_STATE5
-.. data:: KX_STATE6
-.. data:: KX_STATE7
-.. data:: KX_STATE8
-.. data:: KX_STATE9
-.. data:: KX_STATE10
-.. data:: KX_STATE11
-.. data:: KX_STATE12
-.. data:: KX_STATE13
-.. data:: KX_STATE14
-.. data:: KX_STATE15
-.. data:: KX_STATE16
-.. data:: KX_STATE17
-.. data:: KX_STATE18
-.. data:: KX_STATE19
-.. data:: KX_STATE20
-.. data:: KX_STATE21
-.. data:: KX_STATE22
-.. data:: KX_STATE23
-.. data:: KX_STATE24
-.. data:: KX_STATE25
-.. data:: KX_STATE26
-.. data:: KX_STATE27
-.. data:: KX_STATE28
-.. data:: KX_STATE29
-.. data:: KX_STATE30
-
-.. _state-actuator-operation:
-
-See :class:`bge.types.KX_StateActuator.operation`
-
-.. data:: KX_STATE_OP_CLR
-
- Substract bits to state mask
-
- :value: 0
-
-.. data:: KX_STATE_OP_CPY
-
- Copy state mask
-
- :value: 1
-
-.. data:: KX_STATE_OP_NEG
-
- Invert bits to state mask
-
- :value: 2
-
-.. data:: KX_STATE_OP_SET
-
- Add bits to state mask
-
- :value: 3
-
-.. _Two-D-FilterActuator-mode:
-
----------
-2D Filter
----------
-
-.. data:: RAS_2DFILTER_BLUR
-
- :value: 2
-
-.. data:: RAS_2DFILTER_CUSTOMFILTER
-
- Customer filter, the code code is set via shaderText property.
-
- :value: 12
-
-.. data:: RAS_2DFILTER_DILATION
-
- :value: 4
-
-.. data:: RAS_2DFILTER_DISABLED
-
- Disable the filter that is currently active
-
- :value: -1
-
-.. data:: RAS_2DFILTER_ENABLED
-
- Enable the filter that was previously disabled
-
- :value: -2
-
-.. data:: RAS_2DFILTER_EROSION
-
- :value: 5
-
-.. data:: RAS_2DFILTER_GRAYSCALE
-
- :value: 9
-
-.. data:: RAS_2DFILTER_INVERT
-
- :value: 11
-
-.. data:: RAS_2DFILTER_LAPLACIAN
-
- :value: 6
-
-.. data:: RAS_2DFILTER_MOTIONBLUR
-
- Create and enable preset filters
-
- :value: 1
-
-.. data:: RAS_2DFILTER_NOFILTER
-
- Disable and destroy the filter that is currently active
-
- :value: 0
-
-.. data:: RAS_2DFILTER_PREWITT
-
- :value: 8
-
-.. data:: RAS_2DFILTER_SEPIA
-
- :value: 10
-
-.. data:: RAS_2DFILTER_SHARPEN
-
- :value: 3
-
-.. data:: RAS_2DFILTER_SOBEL
-
- :value: 7
-
-------
-Shader
-------
-
-.. data:: VIEWMATRIX
-.. data:: VIEWMATRIX_INVERSE
-.. data:: VIEWMATRIX_INVERSETRANSPOSE
-.. data:: VIEWMATRIX_TRANSPOSE
-.. data:: MODELMATRIX
-.. data:: MODELMATRIX_INVERSE
-.. data:: MODELMATRIX_INVERSETRANSPOSE
-.. data:: MODELMATRIX_TRANSPOSE
-.. data:: MODELVIEWMATRIX
-.. data:: MODELVIEWMATRIX_INVERSE
-.. data:: MODELVIEWMATRIX_INVERSETRANSPOSE
-.. data:: MODELVIEWMATRIX_TRANSPOSE
-.. data:: CAM_POS
-
- Current camera position
-
-.. data:: CONSTANT_TIMER
-
- User a timer for the uniform value.
-
-.. data:: SHD_TANGENT
-
-----------------
-Blender Material
-----------------
-
-.. data:: BL_DST_ALPHA
-.. data:: BL_DST_COLOR
-.. data:: BL_ONE
-.. data:: BL_ONE_MINUS_DST_ALPHA
-.. data:: BL_ONE_MINUS_DST_COLOR
-.. data:: BL_ONE_MINUS_SRC_ALPHA
-.. data:: BL_ONE_MINUS_SRC_COLOR
-.. data:: BL_SRC_ALPHA
-.. data:: BL_SRC_ALPHA_SATURATE
-.. data:: BL_SRC_COLOR
-.. data:: BL_ZERO
diff --git a/source/gameengine/PyDoc/bge.render.rst b/source/gameengine/PyDoc/bge.render.rst
deleted file mode 100644
index 9f17455601b..00000000000
--- a/source/gameengine/PyDoc/bge.render.rst
+++ /dev/null
@@ -1,242 +0,0 @@
-
-Game Engine bge.render Module
-=============================
-
-*****
-Intro
-*****
-
-.. module:: bge.render
-
-.. code-block:: python
-
- # Example Uses an L{SCA_MouseSensor}, and two L{KX_ObjectActuator}s to implement MouseLook::
- # To use a mouse movement sensor "Mouse" and a
- # motion actuator to mouse look:
- import bge.render
- import bge.logic
-
- # SCALE sets the speed of motion
- SCALE=[1, 0.5]
-
- co = bge.logic.getCurrentController()
- obj = co.getOwner()
- mouse = co.getSensor("Mouse")
- lmotion = co.getActuator("LMove")
- wmotion = co.getActuator("WMove")
-
- # Transform the mouse coordinates to see how far the mouse has moved.
- def mousePos():
- x = (bge.render.getWindowWidth()/2 - mouse.getXPosition())*SCALE[0]
- y = (bge.render.getWindowHeight()/2 - mouse.getYPosition())*SCALE[1]
- return (x, y)
-
- pos = mousePos()
-
- # Set the amount of motion: X is applied in world coordinates...
- lmotion.setTorque(0.0, 0.0, pos[0], False)
- # ...Y is applied in local coordinates
- wmotion.setTorque(-pos[1], 0.0, 0.0, True)
-
- # Activate both actuators
- bge.logic.addActiveActuator(lmotion, True)
- bge.logic.addActiveActuator(wmotion, True)
-
- # Centre the mouse
- bge.render.setMousePosition(bge.render.getWindowWidth()/2, bge.render.getWindowHeight()/2)
-
-*********
-Constants
-*********
-
-.. data:: KX_TEXFACE_MATERIAL
-
- Materials as defined by the texture face settings.
-
-.. data:: KX_BLENDER_MULTITEX_MATERIAL
-
- Materials approximating blender materials with multitexturing.
-
-.. data:: KX_BLENDER_GLSL_MATERIAL
-
- Materials approximating blender materials with GLSL.
-
-*********
-Functions
-*********
-
-.. function:: getWindowWidth()
-
- Gets the width of the window (in pixels)
-
- :rtype: integer
-
-.. function:: getWindowHeight()
-
- Gets the height of the window (in pixels)
-
- :rtype: integer
-
-.. function:: makeScreenshot(filename)
-
- Writes a screenshot to the given filename.
-
- If filename starts with // the image will be saved relative to the current directory.
- If the filename contains # it will be replaced with the frame number.
-
- The standalone player saves .png files. It does not support colour space conversion
- or gamma correction.
-
- When run from Blender, makeScreenshot supports Iris, IrisZ, TGA, Raw TGA, PNG, HamX, and Jpeg.
- Gamma, Colourspace conversion and Jpeg compression are taken from the Render settings panels.
-
- :type filename: string
-
-
-.. function:: enableVisibility(visible)
-
- Doesn't really do anything...
-
-
-.. function:: showMouse(visible)
-
- Enables or disables the operating system mouse cursor.
-
- :type visible: boolean
-
-
-.. function:: setMousePosition(x, y)
-
- Sets the mouse cursor position.
-
- :type x: integer
- :type y: integer
-
-
-.. function:: setBackgroundColor(rgba)
-
- Sets the window background colour.
-
- :type rgba: list [r, g, b, a]
-
-
-.. function:: setMistColor(rgb)
-
- Sets the mist colour.
-
- :type rgb: list [r, g, b]
-
-
-.. function:: setAmbientColor(rgb)
-
- Sets the color of ambient light.
-
- :type rgb: list [r, g, b]
-
-
-.. function:: setMistStart(start)
-
- Sets the mist start value. Objects further away than start will have mist applied to them.
-
- :type start: float
-
-
-.. function:: setMistEnd(end)
-
- Sets the mist end value. Objects further away from this will be coloured solid with
- the colour set by setMistColor().
-
- :type end: float
-
-
-.. function:: disableMist()
-
- Disables mist.
-
- .. note:: Set any of the mist properties to enable mist.
-
-
-.. function:: setEyeSeparation(eyesep)
-
- Sets the eye separation for stereo mode. Usually Focal Length/30 provides a confortable value.
-
- :arg eyesep: The distance between the left and right eye.
- :type eyesep: float
-
-
-.. function:: getEyeSeparation()
-
- Gets the current eye separation for stereo mode.
-
- :rtype: float
-
-
-.. function:: setFocalLength(focallength)
-
- Sets the focal length for stereo mode. It uses the current camera focal length as initial value.
-
- :arg focallength: The focal length.
- :type focallength: float
-
-.. function:: getFocalLength()
-
- Gets the current focal length for stereo mode.
-
- :rtype: float
-
-.. function:: setMaterialMode(mode)
-
- Set the material mode to use for OpenGL rendering.
-
- :type mode: KX_TEXFACE_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_GLSL_MATERIAL
-
- .. note:: Changes will only affect newly created scenes.
-
-
-.. function:: getMaterialMode(mode)
-
- Get the material mode to use for OpenGL rendering.
-
- :rtype: KX_TEXFACE_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_GLSL_MATERIAL
-
-
-.. function:: setGLSLMaterialSetting(setting, enable)
-
- Enables or disables a GLSL material setting.
-
- :type setting: string (lights, shaders, shadows, ramps, nodes, extra_textures)
- :type enable: boolean
-
-
-.. function:: getGLSLMaterialSetting(setting, enable)
-
- Get the state of a GLSL material setting.
-
- :type setting: string (lights, shaders, shadows, ramps, nodes, extra_textures)
- :rtype: boolean
-
-
-.. function:: drawLine(fromVec,toVec,color)
-
- Draw a line in the 3D scene.
-
- :arg fromVec: the origin of the line
- :type fromVec: list [x, y, z]
- :arg toVec: the end of the line
- :type toVec: list [x, y, z]
- :arg color: the color of the line
- :type color: list [r, g, b]
-
-
-.. function:: enableMotionBlur(factor)
-
- Enable the motion blur effect.
-
- :arg factor: the ammount of motion blur to display.
- :type factor: float [0.0 - 1.0]
-
-
-.. function:: disableMotionBlur()
-
- Disable the motion blur effect.
-
diff --git a/source/gameengine/PyDoc/bge.types.rst b/source/gameengine/PyDoc/bge.types.rst
deleted file mode 100644
index 96ba8d278f1..00000000000
--- a/source/gameengine/PyDoc/bge.types.rst
+++ /dev/null
@@ -1,5202 +0,0 @@
-
-Game Engine bge.types Module
-=============================
-
-.. module:: bge.types
-
-.. class:: PyObjectPlus
-
- PyObjectPlus base class of most other types in the Game Engine.
-
- .. attribute:: invalid
-
- Test if the object has been freed by the game engine and is no longer valid.
-
- Normally this is not a problem but when storing game engine data in the GameLogic module,
- KX_Scenes or other KX_GameObjects its possible to hold a reference to invalid data.
- Calling an attribute or method on an invalid object will raise a SystemError.
-
- The invalid attribute allows testing for this case without exception handling.
-
- :type: boolean
-
- .. method:: isA(game_type)
-
- Check if this is a type or a subtype game_type.
-
- :arg game_type: the name of the type or the type its self from the :mod:`bge.types` module.
- :type game_type: string or type
- :return: True if this object is a type or a subtype of game_type.
- :rtype: boolean
-
-.. class:: CValue(PyObjectPlus)
-
- This class is a basis for other classes.
-
- .. attribute:: name
-
- The name of this CValue derived object (read-only).
-
- :type: string
-
-.. class:: CPropValue(CValue)
-
- This class has no python functions
-
-.. class:: SCA_ILogicBrick(CValue)
-
- Base class for all logic bricks.
-
- .. attribute:: executePriority
-
- This determines the order controllers are evaluated, and actuators are activated (lower priority is executed first).
-
- :type: executePriority: int
-
- .. attribute:: owner
-
- The game object this logic brick is attached to (read-only).
-
- :type: :class:`KX_GameObject` or None in exceptional cases.
-
- .. attribute:: name
-
- The name of this logic brick (read-only).
-
- :type: string
-
-.. class:: SCA_PythonKeyboard(PyObjectPlus)
-
- The current keyboard.
-
- .. attribute:: events
-
- A dictionary containing the status of each keyboard event or key. (read-only).
-
- :type: dictionary {:ref:`keycode<keyboard-keys>`::ref:`status<input-status>`, ...}
-
-.. class:: SCA_PythonMouse(PyObjectPlus)
-
- The current mouse.
-
- .. attribute:: events
-
- a dictionary containing the status of each mouse event. (read-only).
-
- :type: dictionary {:ref:`keycode<mouse-keys>`::ref:`status<input-status>`, ...}
-
- .. attribute:: position
-
- The normalized x and y position of the mouse cursor.
-
- :type: list [x, y]
-
- .. attribute:: visible
-
- The visibility of the mouse cursor.
-
- :type: boolean
-
-.. class:: SCA_IObject(CValue)
-
- This class has no python functions
-
-.. class:: SCA_ISensor(SCA_ILogicBrick)
-
- Base class for all sensor logic bricks.
-
- .. attribute:: usePosPulseMode
-
- Flag to turn positive pulse mode on and off.
-
- :type: boolean
-
- .. attribute:: useNegPulseMode
-
- Flag to turn negative pulse mode on and off.
-
- :type: boolean
-
- .. attribute:: frequency
-
- The frequency for pulse mode sensors.
-
- :type: integer
-
- .. attribute:: level
-
- level Option whether to detect level or edge transition when entering a state.
- It makes a difference only in case of logic state transition (state actuator).
- A level detector will immediately generate a pulse, negative or positive
- depending on the sensor condition, as soon as the state is activated.
- A edge detector will wait for a state change before generating a pulse.
- note: mutually exclusive with :data:`tap`, enabling will disable :data:`tap`.
-
- :type: boolean
-
- .. attribute:: tap
-
- When enabled only sensors that are just activated will send a positive event,
- after this they will be detected as negative by the controllers.
- This will make a key thats held act as if its only tapped for an instant.
- note: mutually exclusive with :data:`level`, enabling will disable :data:`level`.
-
- :type: boolean
-
- .. attribute:: invert
-
- Flag to set if this sensor activates on positive or negative events.
-
- :type: boolean
-
- .. attribute:: triggered
-
- True if this sensor brick is in a positive state. (read-only).
-
- :type: boolean
-
- .. attribute:: positive
-
- True if this sensor brick is in a positive state. (read-only).
-
- :type: boolean
-
- .. attribute:: status
-
- The status of the sensor (read-only): can be one of :ref:`these constants<sensor-status>`.
-
- :type: int
-
- .. note::
-
- This convenient attribute combines the values of triggered and positive attributes.
-
- .. method:: reset()
-
- Reset sensor internal state, effect depends on the type of sensor and settings.
-
- The sensor is put in its initial state as if it was just activated.
-
-.. class:: SCA_IController(SCA_ILogicBrick)
-
- Base class for all controller logic bricks.
-
- .. attribute:: state
-
- The controllers state bitmask. This can be used with the GameObject's state to test if the controller is active.
-
- :type: int bitmask
-
- .. attribute:: sensors
-
- A list of sensors linked to this controller.
-
- :type: sequence supporting index/string lookups and iteration.
-
- .. note::
-
- The sensors are not necessarily owned by the same object.
-
- .. note::
-
- When objects are instanced in dupligroups links may be lost from objects outside the dupligroup.
-
- .. attribute:: actuators
-
- A list of actuators linked to this controller.
-
- :type: sequence supporting index/string lookups and iteration.
-
- .. note::
-
- The sensors are not necessarily owned by the same object.
-
- .. note::
-
- When objects are instanced in dupligroups links may be lost from objects outside the dupligroup.
-
- .. attribute:: useHighPriority
-
- When set the controller executes always before all other controllers that dont have this set.
-
- :type: boolen
-
- .. note::
-
- Order of execution between high priority controllers is not guaranteed.
-
-.. class:: SCA_IActuator(SCA_ILogicBrick)
-
- Base class for all actuator logic bricks.
-
-.. class:: BL_ActionActuator(SCA_IActuator)
-
- Action Actuators apply an action to an actor.
-
- .. attribute:: action
-
- The name of the action to set as the current action.
-
- :type: string
-
- .. attribute:: channelNames
-
- A list of channel names that may be used with :data:`setChannel` and :data:`getChannel`.
-
- :type: list of strings
-
- .. attribute:: frameStart
-
- Specifies the starting frame of the animation.
-
- :type: float
-
- .. attribute:: frameEnd
-
- Specifies the ending frame of the animation.
-
- :type: float
-
- .. attribute:: blendIn
-
- Specifies the number of frames of animation to generate when making transitions between actions.
-
- :type: float
-
- .. attribute:: priority
-
- Sets the priority of this actuator. Actuators will lower priority numbers will override actuators with higher numbers.
-
- :type: integer
-
- .. attribute:: frame
-
- Sets the current frame for the animation.
-
- :type: float
-
- .. attribute:: propName
-
- Sets the property to be used in FromProp playback mode.
-
- :type: string
-
- .. attribute:: blendTime
-
- Sets the internal frame timer. This property must be in the range from 0.0 to blendIn.
-
- :type: float
-
- .. attribute:: mode
-
- The operation mode of the actuator. Can be one of :ref:`these constants<action-actuator>`.
-
- :type: integer
-
- .. attribute:: useContinue
-
- The actions continue option, True or False. When True, the action will always play from where last left off, otherwise negative events to this actuator will reset it to its start frame.
-
- :type: boolean
-
- .. attribute:: framePropName
-
- The name of the property that is set to the current frame number.
-
- :type: string
-
- .. method:: setChannel(channel, matrix)
-
- Alternative to the 2 arguments, 4 arguments (channel, matrix, loc, size, quat) are also supported.
-
- :arg channel: A string specifying the name of the bone channel, error raised if not in :data:`channelNames`.
- :type channel: string
- :arg matrix: A 4x4 matrix specifying the overriding transformation as an offset from the bone's rest position.
- :arg matrix: list [[float]]
-
- .. note::
-
- These values are relative to the bones rest position, currently the api has no way to get this info (which is annoying), but can be worked around by using bones with a rest pose that has no translation.
-
- .. method:: getChannel(channel)
-
- :arg channel: A string specifying the name of the bone channel. error raised if not in :data:`channelNames`.
- :type channel: string
- :return: (loc, size, quat)
- :rtype: tuple
-
-.. class:: BL_Shader(PyObjectPlus)
-
- BL_Shader GLSL shaders.
-
- TODO - Description
-
- .. method:: setUniformfv(name, fList)
-
- Set a uniform with a list of float values
-
- :arg name: the uniform name
- :type name: string
- :arg fList: a list (2, 3 or 4 elements) of float values
- :type fList: list[float]
-
- .. method:: delSource()
-
- Clear the shader. Use this method before the source is changed with :data:`setSource`.
-
- .. method:: getFragmentProg()
-
- Returns the fragment program.
-
- :return: The fragment program.
- :rtype: string
-
- .. method:: getVertexProg()
-
- Get the vertex program.
-
- :return: The vertex program.
- :rtype: string
-
- .. method:: isValid()
-
- Check if the shader is valid.
-
- :return: True if the shader is valid
- :rtype: boolean
-
- .. method:: setAttrib(enum)
-
- Set attribute location. (The parameter is ignored a.t.m. and the value of "tangent" is always used.)
-
- :arg enum: attribute location value
- :type enum: integer
-
- .. method:: setNumberOfPasses( max_pass )
-
- Set the maximum number of passes. Not used a.t.m.
-
- :arg max_pass: the maximum number of passes
- :type max_pass: integer
-
- .. method:: setSampler(name, index)
-
- Set uniform texture sample index.
-
- :arg name: Uniform name
- :type name: string
- :arg index: Texture sample index.
- :type index: integer
-
- .. method:: setSource(vertexProgram, fragmentProgram)
-
- Set the vertex and fragment programs
-
- :arg vertexProgram: Vertex program
- :type vertexProgram: string
- :arg fragmentProgram: Fragment program
- :type fragmentProgram: string
-
- .. method:: setUniform1f(name, fx)
-
- Set a uniform with 1 float value.
-
- :arg name: the uniform name
- :type name: string
- :arg fx: Uniform value
- :type fx: float
-
- .. method:: setUniform1i(name, ix)
-
- Set a uniform with an integer value.
-
- :arg name: the uniform name
- :type name: string
- :arg ix: the uniform value
- :type ix: integer
-
- .. method:: setUniform2f(name, fx, fy)
-
- Set a uniform with 2 float values
-
- :arg name: the uniform name
- :type name: string
- :arg fx: first float value
- :type fx: float
-
- :arg fy: second float value
- :type fy: float
-
- .. method:: setUniform2i(name, ix, iy)
-
- Set a uniform with 2 integer values
-
- :arg name: the uniform name
- :type name: string
- :arg ix: first integer value
- :type ix: integer
- :arg iy: second integer value
- :type iy: integer
-
- .. method:: setUniform3f(name, fx, fy, fz)
-
- Set a uniform with 3 float values.
-
- :arg name: the uniform name
- :type name: string
- :arg fx: first float value
- :type fx: float
- :arg fy: second float value
- :type fy: float
- :arg fz: third float value
- :type fz: float
-
- .. method:: setUniform3i(name, ix, iy, iz)
-
- Set a uniform with 3 integer values
-
- :arg name: the uniform name
- :type name: string
- :arg ix: first integer value
- :type ix: integer
- :arg iy: second integer value
- :type iy: integer
- :arg iz: third integer value
- :type iz: integer
-
- .. method:: setUniform4f(name, fx, fy, fz, fw)
-
- Set a uniform with 4 float values.
-
- :arg name: the uniform name
- :type name: string
- :arg fx: first float value
- :type fx: float
- :arg fy: second float value
- :type fy: float
- :arg fz: third float value
- :type fz: float
- :arg fw: fourth float value
- :type fw: float
-
- .. method:: setUniform4i(name, ix, iy, iz, iw)
-
- Set a uniform with 4 integer values
-
- :arg name: the uniform name
- :type name: string
- :arg ix: first integer value
- :type ix: integer
- :arg iy: second integer value
- :type iy: integer
- :arg iz: third integer value
- :type iz: integer
- :arg iw: fourth integer value
- :type iw: integer
-
- .. method:: setUniformDef(name, type)
-
- Define a new uniform
-
- :arg name: the uniform name
- :type name: string
- :arg type: uniform type
- :type type: UNI_NONE, UNI_INT, UNI_FLOAT, UNI_INT2, UNI_FLOAT2, UNI_INT3, UNI_FLOAT3, UNI_INT4, UNI_FLOAT4, UNI_MAT3, UNI_MAT4, UNI_MAX
-
- .. method:: setUniformMatrix3(name, mat, transpose)
-
- Set a uniform with a 3x3 matrix value
-
- :arg name: the uniform name
- :type name: string
- :arg mat: A 3x3 matrix [[f, f, f], [f, f, f], [f, f, f]]
- :type mat: 3x3 matrix
- :arg transpose: set to True to transpose the matrix
- :type transpose: boolean
-
- .. method:: setUniformMatrix4(name, mat, transpose)
-
- Set a uniform with a 4x4 matrix value
-
- :arg name: the uniform name
- :type name: string
- :arg mat: A 4x4 matrix [[f, f, f, f], [f, f, f, f], [f, f, f, f], [f, f, f, f]]
- :type mat: 4x4 matrix
- :arg transpose: set to True to transpose the matrix
- :type transpose: boolean
-
- .. method:: setUniformiv(name, iList)
-
- Set a uniform with a list of integer values
-
- :arg name: the uniform name
- :type name: string
- :arg iList: a list (2, 3 or 4 elements) of integer values
- :type iList: list[integer]
-
- .. method:: validate()
-
- Validate the shader object.
-
-.. class:: BL_ShapeActionActuator(SCA_IActuator)
-
- ShapeAction Actuators apply an shape action to an mesh object.
-
- .. attribute:: action
-
- The name of the action to set as the current shape action.
-
- :type: string
-
- .. attribute:: frameStart
-
- Specifies the starting frame of the shape animation.
-
- :type: float
-
- .. attribute:: frameEnd
-
- Specifies the ending frame of the shape animation.
-
- :type: float
-
- .. attribute:: blendIn
-
- Specifies the number of frames of animation to generate when making transitions between actions.
-
- :type: float
-
- .. attribute:: priority
-
- Sets the priority of this actuator. Actuators will lower priority numbers will override actuators with higher numbers.
-
- :type: integer
-
- .. attribute:: frame
-
- Sets the current frame for the animation.
-
- :type: float
-
- .. attribute:: propName
-
- Sets the property to be used in FromProp playback mode.
-
- :type: string
-
- .. attribute:: blendTime
-
- Sets the internal frame timer. This property must be in the range from 0.0 to blendin.
-
- :type: float
-
- .. attribute:: mode
-
- The operation mode of the actuator. Can be one of :ref:`these constants<shape-action-actuator>`.
-
- :type: integer
-
- .. attribute:: framePropName
-
- The name of the property that is set to the current frame number.
-
- :type: string
-
-.. class:: CListValue(CPropValue)
-
- This is a list like object used in the game engine internally that behaves similar to a python list in most ways.
-
- As well as the normal index lookup (``val= clist[i]``), CListValue supports string lookups (``val= scene.objects["Cube"]``)
-
- Other operations such as ``len(clist)``, ``list(clist)``, ``clist[0:10]`` are also supported.
-
- .. method:: append(val)
-
- Add an item to the list (like pythons append)
-
- .. warning::
-
- Appending values to the list can cause crashes when the list is used internally by the game engine.
-
- .. method:: count(val)
-
- Count the number of instances of a value in the list.
-
- :return: number of instances
- :rtype: integer
-
- .. method:: index(val)
-
- Return the index of a value in the list.
-
- :return: The index of the value in the list.
- :rtype: integer
-
- .. method:: reverse()
-
- Reverse the order of the list.
-
- .. method:: get(key, default=None)
-
- Return the value matching key, or the default value if its not found.
-
- :return: The key value or a default.
-
- .. method:: from_id(id)
-
- This is a funtion especially for the game engine to return a value with a spesific id.
-
- Since object names are not always unique, the id of an object can be used to get an object from the CValueList.
-
- Example:
-
- .. code-block:: python
-
- myObID=id(gameObject)
- ob= scene.objects.from_id(myObID)
-
- Where ``myObID`` is an int or long from the id function.
-
- This has the advantage that you can store the id in places you could not store a gameObject.
-
- .. warning::
-
- The id is derived from a memory location and will be different each time the game engine starts.
-
-.. class:: KX_BlenderMaterial(PyObjectPlus)
-
- KX_BlenderMaterial
-
- .. method:: getShader()
-
- Returns the material's shader.
-
- :return: the material's shader
- :rtype: :class:`BL_Shader`
-
- .. method:: setBlending(src, dest)
-
- Set the pixel color arithmetic functions.
-
- :arg src: Specifies how the red, green, blue, and alpha source blending factors are computed.
- :type src: Value in...
-
- * GL_ZERO,
- * GL_ONE,
- * GL_SRC_COLOR,
- * GL_ONE_MINUS_SRC_COLOR,
- * GL_DST_COLOR,
- * GL_ONE_MINUS_DST_COLOR,
- * GL_SRC_ALPHA,
- * GL_ONE_MINUS_SRC_ALPHA,
- * GL_DST_ALPHA,
- * GL_ONE_MINUS_DST_ALPHA,
- * GL_SRC_ALPHA_SATURATE
-
- :arg dest: Specifies how the red, green, blue, and alpha destination blending factors are computed.
- :type dest: Value in...
-
- * GL_ZERO
- * GL_ONE
- * GL_SRC_COLOR
- * GL_ONE_MINUS_SRC_COLOR
- * GL_DST_COLOR
- * GL_ONE_MINUS_DST_COLOR
- * GL_SRC_ALPHA
- * GL_ONE_MINUS_SRC_ALPHA
- * GL_DST_ALPHA
- * GL_ONE_MINUS_DST_ALPHA
- * GL_SRC_ALPHA_SATURATE
-
- .. method:: getMaterialIndex()
-
- Returns the material's index.
-
- :return: the material's index
- :rtype: integer
-
-.. class:: KX_CameraActuator(SCA_IActuator)
-
- Applies changes to a camera.
-
- .. attribute:: min
-
- minimum distance to the target object maintained by the actuator.
-
- :type: float
-
- .. attribute:: max
-
- maximum distance to stay from the target object.
-
- :type: float
-
- .. attribute:: height
-
- height to stay above the target object.
-
- :type: float
-
- .. attribute:: useXY
-
- axis this actuator is tracking, True=X, False=Y.
-
- :type: boolean
-
- .. attribute:: object
-
- the object this actuator tracks.
-
- :type: :class:`KX_GameObject` or None
-
-.. class:: KX_ConstraintActuator(SCA_IActuator)
-
- A constraint actuator limits the position, rotation, distance or orientation of an object.
-
- .. attribute:: damp
-
- Time constant of the constraint expressed in frame (not use by Force field constraint).
-
- :type: integer
-
- .. attribute:: rotDamp
-
- Time constant for the rotation expressed in frame (only for the distance constraint), 0 = use damp for rotation as well.
-
- :type: integer
-
- .. attribute:: direction
-
- The reference direction in world coordinate for the orientation constraint.
-
- :type: 3-tuple of float: (x, y, z)
-
- .. attribute:: option
-
- Binary combination of :ref:`these constants <constraint-actuator-option>`
-
- :type: integer
-
- .. attribute:: time
-
- activation time of the actuator. The actuator disables itself after this many frame. If set to 0, the actuator is not limited in time.
-
- :type: integer
-
- .. attribute:: propName
-
- the name of the property or material for the ray detection of the distance constraint.
-
- :type: string
-
- .. attribute:: min
-
- The lower bound of the constraint. For the rotation and orientation constraint, it represents radiant.
-
- :type: float
-
- .. attribute:: distance
-
- the target distance of the distance constraint.
-
- :type: float
-
- .. attribute:: max
-
- the upper bound of the constraint. For rotation and orientation constraints, it represents radiant.
-
- :type: float
-
- .. attribute:: rayLength
-
- the length of the ray of the distance constraint.
-
- :type: float
-
- .. attribute:: limit
-
- type of constraint. Use one of the :ref:`these constants <constraint-actuator-limit>`
-
- :type: integer.
-
-
-.. class:: KX_ConstraintWrapper(PyObjectPlus)
-
- KX_ConstraintWrapper
-
- .. method:: getConstraintId(val)
-
- Returns the contraint's ID
-
- :return: the constraint's ID
- :rtype: integer
-
-.. class:: KX_GameActuator(SCA_IActuator)
-
- The game actuator loads a new .blend file, restarts the current .blend file or quits the game.
-
- .. attribute:: fileName
-
- the new .blend file to load.
-
- :type: string
-
- .. attribute:: mode
-
- The mode of this actuator. Can be on of :ref:`these constants <game-actuator>`
-
- :type: Int
-
-.. class:: KX_GameObject(SCA_IObject)
-
- All game objects are derived from this class.
-
- Properties assigned to game objects are accessible as attributes of this class.
-
- .. note::
-
- Calling ANY method or attribute on an object that has been removed from a scene will raise a SystemError, if an object may have been removed since last accessing it use the :data:`invalid` attribute to check.
-
- .. attribute:: name
-
- The object's name. (read-only).
-
- :type: string
-
- .. attribute:: mass
-
- The object's mass
-
- :type: float
-
- .. note::
-
- The object must have a physics controller for the mass to be applied, otherwise the mass value will be returned as 0.0.
-
- .. attribute:: linVelocityMin
-
- Enforces the object keeps moving at a minimum velocity.
-
- :type: float
-
- .. note::
-
- Applies to dynamic and rigid body objects only.
-
- .. note::
-
- A value of 0.0 disables this option.
-
- .. note::
-
- While objects are stationary the minimum velocity will not be applied.
-
- .. attribute:: linVelocityMax
-
- Clamp the maximum linear velocity to prevent objects moving beyond a set speed.
-
- :type: float
-
- .. note::
-
- Applies to dynamic and rigid body objects only.
-
- .. note::
-
- A value of 0.0 disables this option (rather then setting it stationary).
-
- .. attribute:: localInertia
-
- the object's inertia vector in local coordinates. Read only.
-
- :type: list [ix, iy, iz]
-
- .. attribute:: parent
-
- The object's parent object. (read-only).
-
- :type: :class:`KX_GameObject` or None
-
- .. attribute:: visible
-
- visibility flag.
-
- :type: boolean
-
- .. note::
-
- Game logic will still run for invisible objects.
-
- .. attribute:: color
-
- The object color of the object.
-
- :type: list [r, g, b, a]
-
- .. attribute:: occlusion
-
- occlusion capability flag.
-
- :type: boolean
-
- .. attribute:: position
-
- The object's position.
-
- .. deprecated:: use :data:`localPosition` and :data:`worldPosition`.
-
- :type: list [x, y, z] On write: local position, on read: world position
-
- .. attribute:: orientation
-
- The object's orientation. 3x3 Matrix. You can also write a Quaternion or Euler vector.
-
- .. deprecated:: use :data:`localOrientation` and :data:`worldOrientation`.
-
- :type: 3x3 Matrix [[float]] On write: local orientation, on read: world orientation
-
- .. attribute:: scaling
-
- The object's scaling factor. list [sx, sy, sz]
-
- .. deprecated:: use :data:`localScale` and :data:`worldScale`.
-
- :type: list [sx, sy, sz] On write: local scaling, on read: world scaling
-
- .. attribute:: localOrientation
-
- The object's local orientation. 3x3 Matrix. You can also write a Quaternion or Euler vector.
-
- :type: 3x3 Matrix [[float]]
-
- .. attribute:: worldOrientation
-
- The object's world orientation.
-
- :type: 3x3 Matrix [[float]]
-
- .. attribute:: localScale
-
- The object's local scaling factor.
-
- :type: list [sx, sy, sz]
-
- .. attribute:: worldScale
-
- The object's world scaling factor. Read-only.
-
- :type: list [sx, sy, sz]
-
- .. attribute:: localPosition
-
- The object's local position.
-
- :type: list [x, y, z]
-
- .. attribute:: worldPosition
-
- The object's world position.
-
- :type: list [x, y, z]
-
- .. attribute:: timeOffset
-
- adjust the slowparent delay at runtime.
-
- :type: float
-
- .. attribute:: state
-
- the game object's state bitmask, using the first 30 bits, one bit must always be set.
-
- :type: int
-
- .. attribute:: meshes
-
- a list meshes for this object.
-
- :type: list of :class:`KX_MeshProxy`
-
- .. note::
-
- Most objects use only 1 mesh.
-
- .. note::
-
- Changes to this list will not update the KX_GameObject.
-
- .. attribute:: sensors
-
- a sequence of :class:`SCA_ISensor` objects with string/index lookups and iterator support.
-
- :type: list
-
- .. note::
-
- This attribute is experemental and may be removed (but probably wont be).
-
- .. note::
-
- Changes to this list will not update the KX_GameObject.
-
- .. attribute:: controllers
-
- a sequence of :class:`SCA_IController` objects with string/index lookups and iterator support.
-
- :type: list of :class:`SCA_ISensor`
-
- .. note::
-
- This attribute is experemental and may be removed (but probably wont be).
-
- .. note::
-
- Changes to this list will not update the KX_GameObject.
-
- .. attribute:: actuators
-
- a list of :class:`SCA_IActuator` with string/index lookups and iterator support.
-
- :type: list
-
- .. note::
-
- This attribute is experemental and may be removed (but probably wont be).
-
- .. note::
-
- Changes to this list will not update the KX_GameObject.
-
- .. attribute:: attrDict
-
- get the objects internal python attribute dictionary for direct (faster) access.
-
- :type: dict
-
- .. attribute:: children
-
- direct children of this object, (read-only).
-
- :type: :class:`CListValue` of :class:`KX_GameObject`'s
-
- .. attribute:: childrenRecursive
-
- all children of this object including childrens children, (read-only).
-
- :type: :class:`CListValue` of :class:`KX_GameObject`'s
-
- .. method:: endObject()
-
- Delete this object, can be used in place of the EndObject Actuator.
-
- The actual removal of the object from the scene is delayed.
-
- .. method:: replaceMesh(mesh, useDisplayMesh=True, usePhysicsMesh=False)
-
- Replace the mesh of this object with a new mesh. This works the same was as the actuator.
-
- :arg mesh: mesh to replace or the meshes name.
- :type mesh: :class:`MeshProxy` or string
- :arg useDisplayMesh: when enabled the display mesh will be replaced (optional argument).
- :type useDisplayMesh: boolean
- :arg usePhysicsMesh: when enabled the physics mesh will be replaced (optional argument).
- :type usePhysicsMesh: boolean
-
- .. method:: setVisible(visible, recursive)
-
- Sets the game object's visible flag.
-
- :arg visible: the visible state to set.
- :type visible: boolean
- :arg recursive: optional argument to set all childrens visibility flag too.
- :type recursive: boolean
-
- .. method:: setOcclusion(occlusion, recursive)
-
- Sets the game object's occlusion capability.
-
- :arg occlusion: the state to set the occlusion to.
- :type occlusion: boolean
- :arg recursive: optional argument to set all childrens occlusion flag too.
- :type recursive: boolean
-
- .. method:: alignAxisToVect(vect, axis=2, factor=1.0)
-
- Aligns any of the game object's axis along the given vector.
-
-
- :arg vect: a vector to align the axis.
- :type vect: 3D vector
- :arg axis: The axis you want to align
-
- * 0: X axis
- * 1: Y axis
- * 2: Z axis
-
- :type axis: integer
- :arg factor: Only rotate a feaction of the distance to the target vector (0.0 - 1.0)
- :type factor: float
-
- .. method:: getAxisVect(vect)
-
- Returns the axis vector rotates by the objects worldspace orientation.
- This is the equivalent of multiplying the vector by the orientation matrix.
-
- :arg vect: a vector to align the axis.
- :type vect: 3D Vector
- :return: The vector in relation to the objects rotation.
- :rtype: 3d vector.
-
- .. method:: applyMovement(movement, local=False)
-
- Sets the game object's movement.
-
- :arg movement: movement vector.
- :type movement: 3D Vector
- :arg local:
- * False: you get the "global" movement ie: relative to world orientation.
- * True: you get the "local" movement ie: relative to object orientation.
- :arg local: boolean
-
- .. method:: applyRotation(rotation, local=False)
-
- Sets the game object's rotation.
-
- :arg rotation: rotation vector.
- :type rotation: 3D Vector
- :arg local:
- * False: you get the "global" rotation ie: relative to world orientation.
- * True: you get the "local" rotation ie: relative to object orientation.
- :arg local: boolean
-
- .. method:: applyForce(force, local=False)
-
- Sets the game object's force.
-
- This requires a dynamic object.
-
- :arg force: force vector.
- :type force: 3D Vector
- :arg local:
- * False: you get the "global" force ie: relative to world orientation.
- * True: you get the "local" force ie: relative to object orientation.
- :type local: boolean
-
- .. method:: applyTorque(torque, local=False)
-
- Sets the game object's torque.
-
- This requires a dynamic object.
-
- :arg torque: torque vector.
- :type torque: 3D Vector
- :arg local:
- * False: you get the "global" torque ie: relative to world orientation.
- * True: you get the "local" torque ie: relative to object orientation.
- :type local: boolean
-
- .. method:: getLinearVelocity(local=False)
-
- Gets the game object's linear velocity.
-
- This method returns the game object's velocity through it's centre of mass, ie no angular velocity component.
-
- :arg local:
- * False: you get the "global" velocity ie: relative to world orientation.
- * True: you get the "local" velocity ie: relative to object orientation.
- :type local: boolean
- :return: the object's linear velocity.
- :rtype: list [vx, vy, vz]
-
- .. method:: setLinearVelocity(velocity, local=False)
-
- Sets the game object's linear velocity.
-
- This method sets game object's velocity through it's centre of mass,
- ie no angular velocity component.
-
- This requires a dynamic object.
-
- :arg velocity: linear velocity vector.
- :type velocity: 3D Vector
- :arg local:
- * False: you get the "global" velocity ie: relative to world orientation.
- * True: you get the "local" velocity ie: relative to object orientation.
- :type local: boolean
-
- .. method:: getAngularVelocity(local=False)
-
- Gets the game object's angular velocity.
-
- :arg local:
- * False: you get the "global" velocity ie: relative to world orientation.
- * True: you get the "local" velocity ie: relative to object orientation.
- :type local: boolean
- :return: the object's angular velocity.
- :rtype: list [vx, vy, vz]
-
- .. method:: setAngularVelocity(velocity, local=False)
-
- Sets the game object's angular velocity.
-
- This requires a dynamic object.
-
- :arg velocity: angular velocity vector.
- :type velocity: boolean
- :arg local:
- * False: you get the "global" velocity ie: relative to world orientation.
- * True: you get the "local" velocity ie: relative to object orientation.
-
- .. method:: getVelocity(point=(0, 0, 0))
-
- Gets the game object's velocity at the specified point.
-
- Gets the game object's velocity at the specified point, including angular
- components.
-
- :arg point: optional point to return the velocity for, in local coordinates.
- :type point: 3D Vector
- :return: the velocity at the specified point.
- :rtype: list [vx, vy, vz]
-
- .. method:: getReactionForce()
-
- Gets the game object's reaction force.
-
- The reaction force is the force applied to this object over the last simulation timestep.
- This also includes impulses, eg from collisions.
-
- :return: the reaction force of this object.
- :rtype: list [fx, fy, fz]
-
- .. note::
-
- This is not implimented at the moment.
-
- .. method:: applyImpulse(point, impulse)
-
- Applies an impulse to the game object.
-
- This will apply the specified impulse to the game object at the specified point.
- If point != position, applyImpulse will also change the object's angular momentum.
- Otherwise, only linear momentum will change.
-
- :arg point: the point to apply the impulse to (in world coordinates)
- :type point: the point to apply the impulse to (in world coordinates)
-
- .. method:: suspendDynamics()
-
- Suspends physics for this object.
-
- .. method:: restoreDynamics()
-
- Resumes physics for this object.
-
- .. note::
-
- The objects linear velocity will be applied from when the dynamics were suspended.
-
- .. method:: enableRigidBody()
-
- Enables rigid body physics for this object.
-
- Rigid body physics allows the object to roll on collisions.
-
- .. note::
-
- This is not working with bullet physics yet.
-
- .. method:: disableRigidBody()
-
- Disables rigid body physics for this object.
-
- .. note::
-
- This is not working with bullet physics yet. The angular is removed but rigid body physics can still rotate it later.
-
- .. method:: setParent(parent, compound=True, ghost=True)
-
- Sets this object's parent.
- Control the shape status with the optional compound and ghost parameters:
-
- In that case you can control if it should be ghost or not:
-
- :arg parent: new parent object.
- :type parent: :class:`KX_GameObject`
- :arg compound: whether the shape should be added to the parent compound shape.
-
- * True: the object shape should be added to the parent compound shape.
- * False: the object should keep its individual shape.
-
- :type compound: boolean
- :arg ghost: whether the object should be ghost while parented.
-
- * True: if the object should be made ghost while parented.
- * False: if the object should be solid while parented.
-
- :type ghost: boolean
-
- .. note::
-
- If the object type is sensor, it stays ghost regardless of ghost parameter
-
- .. method:: removeParent()
-
- Removes this objects parent.
-
- .. method:: getPhysicsId()
-
- Returns the user data object associated with this game object's physics controller.
-
- .. method:: getPropertyNames()
-
- Gets a list of all property names.
-
- :return: All property names for this object.
- :rtype: list
-
- .. method:: getDistanceTo(other)
-
- :arg other: a point or another :class:`KX_GameObject` to measure the distance to.
- :type other: :class:`KX_GameObject` or list [x, y, z]
- :return: distance to another object or point.
- :rtype: float
-
- .. method:: getVectTo(other)
-
- Returns the vector and the distance to another object or point.
- The vector is normalized unless the distance is 0, in which a zero length vector is returned.
-
- :arg other: a point or another :class:`KX_GameObject` to get the vector and distance to.
- :type other: :class:`KX_GameObject` or list [x, y, z]
- :return: (distance, globalVector(3), localVector(3))
- :rtype: 3-tuple (float, 3-tuple (x, y, z), 3-tuple (x, y, z))
-
- .. method:: rayCastTo(other, dist, prop)
-
- Look towards another point/object and find first object hit within dist that matches prop.
-
- The ray is always casted from the center of the object, ignoring the object itself.
- The ray is casted towards the center of another object or an explicit [x, y, z] point.
- Use rayCast() if you need to retrieve the hit point
-
- :arg other: [x, y, z] or object towards which the ray is casted
- :type other: :class:`KX_GameObject` or 3-tuple
- :arg dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to other
- :type dist: float
- :arg prop: property name that object must have; can be omitted => detect any object
- :type prop: string
- :return: the first object hit or None if no object or object does not match prop
- :rtype: :class:`KX_GameObject`
-
- .. method:: rayCast(objto, objfrom, dist, prop, face, xray, poly)
-
- Look from a point/object to another point/object and find first object hit within dist that matches prop.
- if poly is 0, returns a 3-tuple with object reference, hit point and hit normal or (None, None, None) if no hit.
- if poly is 1, returns a 4-tuple with in addition a :class:`KX_PolyProxy` as 4th element.
- if poly is 2, returns a 5-tuple with in addition a 2D vector with the UV mapping of the hit point as 5th element.
-
- .. code-block:: python
-
- # shoot along the axis gun-gunAim (gunAim should be collision-free)
- obj, point, normal = gun.rayCast(gunAim, None, 50)
- if obj:
- # do something
- pass
-
- The face paremeter determines the orientation of the normal.
-
- * 0 => hit normal is always oriented towards the ray origin (as if you casted the ray from outside)
- * 1 => hit normal is the real face normal (only for mesh object, otherwise face has no effect)
-
- The ray has X-Ray capability if xray parameter is 1, otherwise the first object hit (other than self object) stops the ray.
- The prop and xray parameters interact as follow.
-
- * prop off, xray off: return closest hit or no hit if there is no object on the full extend of the ray.
- * prop off, xray on : idem.
- * prop on, xray off: return closest hit if it matches prop, no hit otherwise.
- * prop on, xray on : return closest hit matching prop or no hit if there is no object matching prop on the full extend of the ray.
-
- The :class:`KX_PolyProxy` 4th element of the return tuple when poly=1 allows to retrieve information on the polygon hit by the ray.
- If there is no hit or the hit object is not a static mesh, None is returned as 4th element.
-
- The ray ignores collision-free objects and faces that dont have the collision flag enabled, you can however use ghost objects.
-
- :arg objto: [x, y, z] or object to which the ray is casted
- :type objto: :class:`KX_GameObject` or 3-tuple
- :arg objfrom: [x, y, z] or object from which the ray is casted; None or omitted => use self object center
- :type objfrom: :class:`KX_GameObject` or 3-tuple or None
- :arg dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to to
- :type dist: float
- :arg prop: property name that object must have; can be omitted or "" => detect any object
- :type prop: string
- :arg face: normal option: 1=>return face normal; 0 or omitted => normal is oriented towards origin
- :type face: integer
- :arg xray: X-ray option: 1=>skip objects that don't match prop; 0 or omitted => stop on first object
- :type xray: integer
- :arg poly: polygon option: 0, 1 or 2 to return a 3-, 4- or 5-tuple with information on the face hit.
-
- * 0 or omitted: return value is a 3-tuple (object, hitpoint, hitnormal) or (None, None, None) if no hit
- * 1: return value is a 4-tuple and the 4th element is a :class:`KX_PolyProxy` or None if no hit or the object doesn't use a mesh collision shape.
- * 2: return value is a 5-tuple and the 5th element is a 2-tuple (u, v) with the UV mapping of the hit point or None if no hit, or the object doesn't use a mesh collision shape, or doesn't have a UV mapping.
-
- :type poly: integer
- :return: (object, hitpoint, hitnormal) or (object, hitpoint, hitnormal, polygon) or (object, hitpoint, hitnormal, polygon, hituv).
-
- * object, hitpoint and hitnormal are None if no hit.
- * polygon is valid only if the object is valid and is a static object, a dynamic object using mesh collision shape or a soft body object, otherwise it is None
- * hituv is valid only if polygon is valid and the object has a UV mapping, otherwise it is None
-
- :rtype:
-
- * 3-tuple (:class:`KX_GameObject`, 3-tuple (x, y, z), 3-tuple (nx, ny, nz))
- * or 4-tuple (:class:`KX_GameObject`, 3-tuple (x, y, z), 3-tuple (nx, ny, nz), :class:`PolyProxy`)
- * or 5-tuple (:class:`KX_GameObject`, 3-tuple (x, y, z), 3-tuple (nx, ny, nz), :class:`PolyProxy`, 2-tuple (u, v))
-
- .. note::
-
- The ray ignores the object on which the method is called. It is casted from/to object center or explicit [x, y, z] points.
-
- .. method:: setCollisionMargin(margin)
-
- Set the objects collision margin.
-
- :arg margin: the collision margin distance in blender units.
- :type margin: float
-
- .. note::
-
- If this object has no physics controller (a physics ID of zero), this function will raise RuntimeError.
-
- .. method:: sendMessage(subject, body="", to="")
-
- Sends a message.
-
- :arg subject: The subject of the message
- :type subject: string
- :arg body: The body of the message (optional)
- :type body: string
- :arg to: The name of the object to send the message to (optional)
- :type to: string
-
- .. method:: reinstancePhysicsMesh(gameObject, meshObject)
-
- Updates the physics system with the changed mesh.
-
- If no arguments are given the physics mesh will be re-created from the first mesh assigned to the game object.
-
- :arg gameObject: optional argument, set the physics shape from this gameObjets mesh.
- :type gameObject: string, :class:`KX_GameObject` or None
- :arg meshObject: optional argument, set the physics shape from this mesh.
- :type meshObject: string, :class:`MeshProxy` or None
-
- :return: True if reinstance succeeded, False if it failed.
- :rtype: boolean
-
- .. note::
-
- If this object has instances the other instances will be updated too.
-
- .. note::
-
- The gameObject argument has an advantage that it can convert from a mesh with modifiers applied (such as subsurf).
-
- .. warning::
-
- Only triangle mesh type objects are supported currently (not convex hull)
-
- .. warning::
-
- If the object is a part of a combound object it will fail (parent or child)
-
- .. warning::
-
- Rebuilding the physics mesh can be slow, running many times per second will give a performance hit.
-
- .. method:: get(key, default=None)
-
- Return the value matching key, or the default value if its not found.
- :return: The key value or a default.
-
-.. class:: KX_IpoActuator(SCA_IActuator)
-
- IPO actuator activates an animation.
-
- .. attribute:: frameStart
-
- Start frame.
-
- :type: float
-
- .. attribute:: frameEnd
-
- End frame.
-
- :type: float
-
- .. attribute:: propName
-
- Use this property to define the Ipo position.
-
- :type: string
-
- .. attribute:: framePropName
-
- Assign this property this action current frame number.
-
- :type: string
-
- .. attribute:: mode
-
- Play mode for the ipo. Can be on of :ref:`these constants <ipo-actuator>`
-
- :type: integer
-
- .. attribute:: useIpoAsForce
-
- Apply Ipo as a global or local force depending on the local option (dynamic objects only).
-
- :type: boolean
-
- .. attribute:: useIpoAdd
-
- Ipo is added to the current loc/rot/scale in global or local coordinate according to Local flag.
-
- :type: boolean
-
- .. attribute:: useIpoLocal
-
- Let the ipo acts in local coordinates, used in Force and Add mode.
-
- :type: boolean
-
- .. attribute:: useChildren
-
- Update IPO on all children Objects as well.
-
- :type: boolean
-
-.. class:: KX_LightObject(KX_GameObject)
-
- A Light object.
-
- .. code-block:: python
-
- # Turn on a red alert light.
- import bge
-
- co = bge.logic.getCurrentController()
- light = co.owner
-
- light.energy = 1.0
- light.colour = [1.0, 0.0, 0.0]
-
- .. data:: SPOT
-
- A spot light source. See attribute :data:`type`
-
- .. data:: SUN
-
- A point light source with no attenuation. See attribute :data:`type`
-
- .. data:: NORMAL
-
- A point light source. See attribute :data:`type`
-
- .. attribute:: type
-
- The type of light - must be SPOT, SUN or NORMAL
-
- .. attribute:: layer
-
- The layer mask that this light affects object on.
-
- :type: bitfield
-
- .. attribute:: energy
-
- The brightness of this light.
-
- :type: float
-
- .. attribute:: distance
-
- The maximum distance this light can illuminate. (SPOT and NORMAL lights only).
-
- :type: float
-
- .. attribute:: colour
-
- The colour of this light. Black = [0.0, 0.0, 0.0], White = [1.0, 1.0, 1.0].
-
- :type: list [r, g, b]
-
- .. attribute:: color
-
- Synonym for colour.
-
- .. attribute:: lin_attenuation
-
- The linear component of this light's attenuation. (SPOT and NORMAL lights only).
-
- :type: float
-
- .. attribute:: quad_attenuation
-
- The quadratic component of this light's attenuation (SPOT and NORMAL lights only).
-
- :type: float
-
- .. attribute:: spotsize
-
- The cone angle of the spot light, in degrees (SPOT lights only).
-
- :type: float in [0 - 180].
-
- .. attribute:: spotblend
-
- Specifies the intensity distribution of the spot light (SPOT lights only).
-
- :type: float in [0 - 1]
-
- .. note::
-
- Higher values result in a more focused light source.
-
-.. class:: KX_MeshProxy(SCA_IObject)
-
- A mesh object.
-
- You can only change the vertex properties of a mesh object, not the mesh topology.
-
- To use mesh objects effectively, you should know a bit about how the game engine handles them.
-
- #. Mesh Objects are converted from Blender at scene load.
- #. The Converter groups polygons by Material. This means they can be sent to the renderer efficiently. A material holds:
-
- #. The texture.
- #. The Blender material.
- #. The Tile properties
- #. The face properties - (From the "Texture Face" panel)
- #. Transparency & z sorting
- #. Light layer
- #. Polygon shape (triangle/quad)
- #. Game Object
-
- #. Verticies will be split by face if necessary. Verticies can only be shared between faces if:
-
- #. They are at the same position
- #. UV coordinates are the same
- #. Their normals are the same (both polygons are "Set Smooth")
- #. They are the same colour, for example: a cube has 24 verticies: 6 faces with 4 verticies per face.
-
- The correct method of iterating over every :class:`KX_VertexProxy` in a game object
-
- .. code-block:: python
-
- import GameLogic
-
- co = GameLogic.getCurrentController()
- obj = co.owner
-
- m_i = 0
- mesh = obj.getMesh(m_i) # There can be more than one mesh...
- while mesh != None:
- for mat in range(mesh.getNumMaterials()):
- for v_index in range(mesh.getVertexArrayLength(mat)):
- vertex = mesh.getVertex(mat, v_index)
- # Do something with vertex here...
- # ... eg: colour the vertex red.
- vertex.colour = [1.0, 0.0, 0.0, 1.0]
- m_i += 1
- mesh = obj.getMesh(m_i)
-
- .. attribute:: materials
-
- :type: list of :class:`KX_BlenderMaterial` or :class:`KX_PolygonMaterial` types
-
- .. attribute:: numPolygons
-
- :type: integer
-
- .. attribute:: numMaterials
-
- :type: integer
-
- .. method:: getNumMaterials()
-
- :return: number of materials associated with this object
- :rtype: integer
-
- .. method:: getMaterialName(matid)
-
- Gets the name of the specified material.
-
- :arg matid: the specified material.
- :type matid: integer
- :return: the attached material name.
- :rtype: string
-
- .. method:: getTextureName(matid)
-
- Gets the name of the specified material's texture.
-
- :arg matid: the specified material
- :type matid: integer
- :return: the attached material's texture name.
- :rtype: string
-
- .. method:: getVertexArrayLength(matid)
-
- Gets the length of the vertex array associated with the specified material.
-
- There is one vertex array for each material.
-
- :arg matid: the specified material
- :type matid: integer
- :return: the number of verticies in the vertex array.
- :rtype: integer
-
- .. method:: getVertex(matid, index)
-
- Gets the specified vertex from the mesh object.
-
- :arg matid: the specified material
- :type matid: integer
- :arg index: the index into the vertex array.
- :type index: integer
- :return: a vertex object.
- :rtype: :class:`KX_VertexProxy`
-
- .. method:: getNumPolygons()
-
- :return: The number of polygon in the mesh.
- :rtype: integer
-
- .. method:: getPolygon(index)
-
- Gets the specified polygon from the mesh.
-
- :arg index: polygon number
- :type index: integer
- :return: a polygon object.
- :rtype: :class:`PolyProxy`
-
-.. class:: SCA_MouseSensor(SCA_ISensor)
-
- Mouse Sensor logic brick.
-
- .. attribute:: position
-
- current [x, y] coordinates of the mouse, in frame coordinates (pixels).
-
- :type: [integer, interger]
-
- .. attribute:: mode
-
- sensor mode.
-
- :type: integer
-
- * KX_MOUSESENSORMODE_LEFTBUTTON(1)
- * KX_MOUSESENSORMODE_MIDDLEBUTTON(2)
- * KX_MOUSESENSORMODE_RIGHTBUTTON(3)
- * KX_MOUSESENSORMODE_WHEELUP(4)
- * KX_MOUSESENSORMODE_WHEELDOWN(5)
- * KX_MOUSESENSORMODE_MOVEMENT(6)
-
- .. method:: getButtonStatus(button)
-
- Get the mouse button status.
-
- :arg button: The code that represents the key you want to get the state of, use one of :ref:`these constants<mouse-keys>`
- :type button: int
- :return: The state of the given key, can be one of :ref:`these constants<input-status>`
- :rtype: int
-
-.. class:: KX_MouseFocusSensor(SCA_MouseSensor)
-
- The mouse focus sensor detects when the mouse is over the current game object.
-
- The mouse focus sensor works by transforming the mouse coordinates from 2d device
- space to 3d space then raycasting away from the camera.
-
- .. attribute:: raySource
-
- The worldspace source of the ray (the view position).
-
- :type: list (vector of 3 floats)
-
- .. attribute:: rayTarget
-
- The worldspace target of the ray.
-
- :type: list (vector of 3 floats)
-
- .. attribute:: rayDirection
-
- The :data:`rayTarget` - :class:`raySource` normalized.
-
- :type: list (normalized vector of 3 floats)
-
- .. attribute:: hitObject
-
- the last object the mouse was over.
-
- :type: :class:`KX_GameObject` or None
-
- .. attribute:: hitPosition
-
- The worldspace position of the ray intersecton.
-
- :type: list (vector of 3 floats)
-
- .. attribute:: hitNormal
-
- the worldspace normal from the face at point of intersection.
-
- :type: list (normalized vector of 3 floats)
-
- .. attribute:: hitUV
-
- the UV coordinates at the point of intersection.
-
- :type: list (vector of 2 floats)
-
- If the object has no UV mapping, it returns [0, 0].
-
- The UV coordinates are not normalized, they can be < 0 or > 1 depending on the UV mapping.
-
- .. attribute:: usePulseFocus
-
- When enabled, moving the mouse over a different object generates a pulse. (only used when the 'Mouse Over Any' sensor option is set).
-
- :type: boolean
-
-.. class:: KX_TouchSensor(SCA_ISensor)
-
- Touch sensor detects collisions between objects.
-
- .. attribute:: propName
-
- The property or material to collide with.
-
- :type: string
-
- .. attribute:: useMaterial
-
- Determines if the sensor is looking for a property or material. KX_True = Find material; KX_False = Find property.
-
- :type: boolean
-
- .. attribute:: usePulseCollision
-
- When enabled, changes to the set of colliding objects generate a pulse.
-
- :type: boolean
-
- .. attribute:: hitObject
-
- The last collided object. (read-only).
-
- :type: :class:`KX_GameObject` or None
-
- .. attribute:: hitObjectList
-
- A list of colliding objects. (read-only).
-
- :type: :class:`CListValue` of :class:`KX_GameObject`
-
-.. class:: KX_NearSensor(KX_TouchSensor)
-
- A near sensor is a specialised form of touch sensor.
-
- .. attribute:: distance
-
- The near sensor activates when an object is within this distance.
-
- :type: float
-
- .. attribute:: resetDistance
-
- The near sensor deactivates when the object exceeds this distance.
-
- :type: float
-
-.. class:: KX_NetworkMessageActuator(SCA_IActuator)
-
- Message Actuator
-
- .. attribute:: propName
-
- Messages will only be sent to objects with the given property name.
-
- :type: string
-
- .. attribute:: subject
-
- The subject field of the message.
-
- :type: string
-
- .. attribute:: body
-
- The body of the message.
-
- :type: string
-
- .. attribute:: usePropBody
-
- Send a property instead of a regular body message.
-
- :type: boolean
-
-.. class:: KX_NetworkMessageSensor(SCA_ISensor)
-
- The Message Sensor logic brick.
-
- Currently only loopback (local) networks are supported.
-
- .. attribute:: subject
-
- The subject the sensor is looking for.
-
- :type: string
-
- .. attribute:: frameMessageCount
-
- The number of messages received since the last frame. (read-only).
-
- :type: integer
-
- .. attribute:: subjects
-
- The list of message subjects received. (read-only).
-
- :type: list of strings
-
- .. attribute:: bodies
-
- The list of message bodies received. (read-only).
-
- :type: list of strings
-
-.. class:: KX_ObjectActuator(SCA_IActuator)
-
- The object actuator ("Motion Actuator") applies force, torque, displacement, angular displacement,
- velocity, or angular velocity to an object.
- Servo control allows to regulate force to achieve a certain speed target.
-
- .. attribute:: force
-
- The force applied by the actuator.
-
- :type: list [x, y, z]
-
- .. attribute:: useLocalForce
-
- A flag specifying if the force is local.
-
- :type: boolean
-
- .. attribute:: torque
-
- The torque applied by the actuator.
-
- :type: list [x, y, z]
-
- .. attribute:: useLocalTorque
-
- A flag specifying if the torque is local.
-
- :type: boolean
-
- .. attribute:: dLoc
-
- The displacement vector applied by the actuator.
-
- :type: list [x, y, z]
-
- .. attribute:: useLocalDLoc
-
- A flag specifying if the dLoc is local.
-
- :type: boolean
-
- .. attribute:: dRot
-
- The angular displacement vector applied by the actuator
-
- :type: list [x, y, z]
-
- .. note::
-
- Since the displacement is applied every frame, you must adjust the displacement based on the frame rate, or you game experience will depend on the player's computer speed.
-
- .. attribute:: useLocalDRot
-
- A flag specifying if the dRot is local.
-
- :type: boolean
-
- .. attribute:: linV
-
- The linear velocity applied by the actuator.
-
- :type: list [x, y, z]
-
- .. attribute:: useLocalLinV
-
- A flag specifying if the linear velocity is local.
-
- :type: boolean
-
- .. note::
-
- This is the target speed for servo controllers.
-
- .. attribute:: angV
-
- The angular velocity applied by the actuator.
-
- :type: list [x, y, z]
-
- .. attribute:: useLocalAngV
-
- A flag specifying if the angular velocity is local.
-
- :type: boolean
-
- .. attribute:: damping
-
- The damping parameter of the servo controller.
-
- :type: short
-
- .. attribute:: forceLimitX
-
- The min/max force limit along the X axis and activates or deactivates the limits in the servo controller.
-
- :type: list [min(float), max(float), bool]
-
- .. attribute:: forceLimitY
-
- The min/max force limit along the Y axis and activates or deactivates the limits in the servo controller.
-
- :type: list [min(float), max(float), bool]
-
- .. attribute:: forceLimitZ
-
- The min/max force limit along the Z axis and activates or deactivates the limits in the servo controller.
-
- :type: list [min(float), max(float), bool]
-
- .. attribute:: pid
-
- The PID coefficients of the servo controller.
-
- :type: list of floats [proportional, integral, derivate]
-
- .. attribute:: reference
-
- The object that is used as reference to compute the velocity for the servo controller.
-
- :type: :class:`KX_GameObject` or None
-
-.. class:: KX_ParentActuator(SCA_IActuator)
-
- The parent actuator can set or remove an objects parent object.
-
- .. attribute:: object
-
- the object this actuator sets the parent too.
-
- :type: :class:`KX_GameObject` or None
-
- .. attribute:: mode
-
- The mode of this actuator.
-
- :type: integer from 0 to 1.
-
- .. attribute:: compound
-
- Whether the object shape should be added to the parent compound shape when parenting.
-
- Effective only if the parent is already a compound shape.
-
- :type: boolean
-
- .. attribute:: ghost
-
- Whether the object should be made ghost when parenting
- Effective only if the shape is not added to the parent compound shape.
-
- :type: boolean
-
-.. class:: KX_PhysicsObjectWrapper(PyObjectPlus)
-
- KX_PhysicsObjectWrapper
-
- .. method:: setActive(active)
-
- Set the object to be active.
-
- :arg active: set to True to be active
- :type active: boolean
-
- .. method:: setAngularVelocity(x, y, z, local)
-
- Set the angular velocity of the object.
-
- :arg x: angular velocity for the x-axis
- :type x: float
-
- :arg y: angular velocity for the y-axis
- :type y: float
-
- :arg z: angular velocity for the z-axis
- :type z: float
-
- :arg local: set to True for local axis
- :type local: boolean
-
- .. method:: setLinearVelocity(x, y, z, local)
-
- Set the linear velocity of the object.
-
- :arg x: linear velocity for the x-axis
- :type x: float
-
- :arg y: linear velocity for the y-axis
- :type y: float
-
- :arg z: linear velocity for the z-axis
- :type z: float
-
- :arg local: set to True for local axis
- :type local: boolean
-
-.. class:: KX_PolyProxy(SCA_IObject)
-
- A polygon holds the index of the vertex forming the poylgon.
-
- Note:
- The polygon attributes are read-only, you need to retrieve the vertex proxy if you want
- to change the vertex settings.
-
- .. attribute:: matname
-
- The name of polygon material, empty if no material.
-
- :type: string
-
- .. attribute:: material
-
- The material of the polygon.
-
- :type: :class:`KX_PolygonMaterial` or :class:`KX_BlenderMaterial`
-
- .. attribute:: texture
-
- The texture name of the polygon.
-
- :type: string
-
- .. attribute:: matid
-
- The material index of the polygon, use this to retrieve vertex proxy from mesh proxy.
-
- :type: integer
-
- .. attribute:: v1
-
- vertex index of the first vertex of the polygon, use this to retrieve vertex proxy from mesh proxy.
-
- :type: integer
-
- .. attribute:: v2
-
- vertex index of the second vertex of the polygon, use this to retrieve vertex proxy from mesh proxy.
-
- :type: integer
-
- .. attribute:: v3
-
- vertex index of the third vertex of the polygon, use this to retrieve vertex proxy from mesh proxy.
-
- :type: integer
-
- .. attribute:: v4
-
- Vertex index of the fourth vertex of the polygon, 0 if polygon has only 3 vertex
- Use this to retrieve vertex proxy from mesh proxy.
-
- :type: integer
-
- .. attribute:: visible
-
- visible state of the polygon: 1=visible, 0=invisible.
-
- :type: integer
-
- .. attribute:: collide
-
- collide state of the polygon: 1=receives collision, 0=collision free.
-
- :type: integer
-
- .. method:: getMaterialName()
-
- Returns the polygon material name with MA prefix
-
- :return: material name
- :rtype: string
-
- .. method:: getMaterial()
-
- :return: The polygon material
- :rtype: :class:`KX_PolygonMaterial` or :class:`KX_BlenderMaterial`
-
- .. method:: getTextureName()
-
- :return: The texture name
- :rtype: string
-
- .. method:: getMaterialIndex()
-
- Returns the material bucket index of the polygon.
- This index and the ones returned by getVertexIndex() are needed to retrieve the vertex proxy from :class:`MeshProxy`.
-
- :return: the material index in the mesh
- :rtype: integer
-
- .. method:: getNumVertex()
-
- Returns the number of vertex of the polygon.
-
- :return: number of vertex, 3 or 4.
- :rtype: integer
-
- .. method:: isVisible()
-
- Returns whether the polygon is visible or not
-
- :return: 0=invisible, 1=visible
- :rtype: boolean
-
- .. method:: isCollider()
-
- Returns whether the polygon is receives collision or not
-
- :return: 0=collision free, 1=receives collision
- :rtype: integer
-
- .. method:: getVertexIndex(vertex)
-
- Returns the mesh vertex index of a polygon vertex
- This index and the one returned by getMaterialIndex() are needed to retrieve the vertex proxy from :class:`MeshProxy`.
-
- :arg vertex: index of the vertex in the polygon: 0->3
- :arg vertex: integer
- :return: mesh vertex index
- :rtype: integer
-
- .. method:: getMesh()
-
- Returns a mesh proxy
-
- :return: mesh proxy
- :rtype: :class:`MeshProxy`
-
-.. class:: KX_PolygonMaterial(PyObjectPlus)
-
- This is the interface to materials in the game engine.
-
- Materials define the render state to be applied to mesh objects.
-
- .. warning::
-
- Some of the methods/variables are CObjects. If you mix these up, you will crash blender.
-
- This example requires `PyOpenGL <http://pyopengl.sourceforge.net>`_ and `GLEWPy <http://glewpy.sourceforge.net>`_
-
- .. code-block:: python
-
- import GameLogic
- import OpenGL
- from OpenGL.GL import *
- from OpenGL.GLU import *
- import glew
- from glew import *
-
- glewInit()
-
- vertex_shader = """
-
- void main(void)
- {
- gl_Position = ftransform();
- }
- """
-
- fragment_shader ="""
-
- void main(void)
- {
- gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
- }
- """
-
- class MyMaterial:
- def __init__(self):
- self.pass_no = 0
- # Create a shader
- self.m_program = glCreateProgramObjectARB()
- # Compile the vertex shader
- self.shader(GL_VERTEX_SHADER_ARB, (vertex_shader))
- # Compile the fragment shader
- self.shader(GL_FRAGMENT_SHADER_ARB, (fragment_shader))
- # Link the shaders together
- self.link()
-
- def PrintInfoLog(self, tag, object):
- """
- PrintInfoLog prints the GLSL compiler log
- """
- print "Tag: def PrintGLError(self, tag = ""):
-
- def PrintGLError(self, tag = ""):
- """
- Prints the current GL error status
- """
- if len(tag):
- print tag
- err = glGetError()
- if err != GL_NO_ERROR:
- print "GL Error: %s\\n"%(gluErrorString(err))
-
- def shader(self, type, shaders):
- """
- shader compiles a GLSL shader and attaches it to the current
- program.
-
- type should be either GL_VERTEX_SHADER_ARB or GL_FRAGMENT_SHADER_ARB
- shaders should be a sequence of shader source to compile.
- """
- # Create a shader object
- shader_object = glCreateShaderObjectARB(type)
-
- # Add the source code
- glShaderSourceARB(shader_object, len(shaders), shaders)
-
- # Compile the shader
- glCompileShaderARB(shader_object)
-
- # Print the compiler log
- self.PrintInfoLog("vertex shader", shader_object)
-
- # Check if compiled, and attach if it did
- compiled = glGetObjectParameterivARB(shader_object, GL_OBJECT_COMPILE_STATUS_ARB)
- if compiled:
- glAttachObjectARB(self.m_program, shader_object)
-
- # Delete the object (glAttachObjectARB makes a copy)
- glDeleteObjectARB(shader_object)
-
- # print the gl error log
- self.PrintGLError()
-
- def link(self):
- """
- Links the shaders together.
- """
- # clear error indicator
- glGetError()
-
- glLinkProgramARB(self.m_program)
-
- self.PrintInfoLog("link", self.m_program)
-
- linked = glGetObjectParameterivARB(self.m_program, GL_OBJECT_LINK_STATUS_ARB)
- if not linked:
- print "Shader failed to link"
- return
-
- glValidateProgramARB(self.m_program)
- valid = glGetObjectParameterivARB(self.m_program, GL_OBJECT_VALIDATE_STATUS_ARB)
- if not valid:
- print "Shader failed to validate"
- return
-
- def activate(self, rasty, cachingInfo, mat):
- self.pass_no+=1
- if (self.pass_no == 1):
- glDisable(GL_COLOR_MATERIAL)
- glUseProgramObjectARB(self.m_program)
- return True
-
- glEnable(GL_COLOR_MATERIAL)
- glUseProgramObjectARB(0)
- self.pass_no = 0
- return False
-
- obj = GameLogic.getCurrentController().owner
-
- mesh = obj.meshes[0]
-
- for mat in mesh.materials:
- mat.setCustomMaterial(MyMaterial())
- print mat.texture
-
- .. attribute:: texture
-
- Texture name.
-
- :type: string (read-only)
-
- .. attribute:: gl_texture
-
- OpenGL texture handle (eg for glBindTexture(GL_TEXTURE_2D, gl_texture).
-
- :type: integer (read-only)
-
- .. attribute:: material
-
- Material name.
-
- :type: string (read-only)
-
- .. attribute:: tface
-
- Texture face properties.
-
- :type: CObject (read-only)
-
- .. attribute:: tile
-
- Texture is tiling.
-
- :type: boolean
-
- .. attribute:: tilexrep
-
- Number of tile repetitions in x direction.
-
- :type: integer
-
- .. attribute:: tileyrep
-
- Number of tile repetitions in y direction.
-
- :type: integer
-
- .. attribute:: drawingmode
-
- Drawing mode for the material.
- - 2 (drawingmode & 4) Textured
- - 4 (drawingmode & 16) Light
- - 14 (drawingmode & 16384) 3d Polygon Text.
-
- :type: bitfield
-
- .. attribute:: transparent
-
- This material is transparent. All meshes with this
- material will be rendered after non transparent meshes from back
- to front.
-
- :type: boolean
-
- .. attribute:: zsort
-
- Transparent polygons in meshes with this material will be sorted back to
- front before rendering.
- Non-Transparent polygons will be sorted front to back before rendering.
-
- :type: boolean
-
- .. attribute:: lightlayer
-
- Light layers this material affects.
-
- :type: bitfield.
-
- .. attribute:: triangle
-
- Mesh data with this material is triangles. It's probably not safe to change this.
-
- :type: boolean
-
- .. attribute:: diffuse
-
- The diffuse colour of the material. black = [0.0, 0.0, 0.0] white = [1.0, 1.0, 1.0].
-
- :type: list [r, g, b]
-
- .. attribute:: specular
-
- The specular colour of the material. black = [0.0, 0.0, 0.0] white = [1.0, 1.0, 1.0].
-
- :type: list [r, g, b]
-
- .. attribute:: shininess
-
- The shininess (specular exponent) of the material. 0.0 <= shininess <= 128.0.
-
- :type: float
-
- .. attribute:: specularity
-
- The amount of specular of the material. 0.0 <= specularity <= 1.0.
-
- :type: float
-
- .. method:: updateTexture(tface, rasty)
-
- Updates a realtime animation.
-
- :arg tface: Texture face (eg mat.tface)
- :type tface: CObject
- :arg rasty: Rasterizer
- :type rasty: CObject
-
- .. method:: setTexture(tface)
-
- Sets texture render state.
-
- :arg tface: Texture face
- :type tface: CObject
-
- .. code-block:: python
-
- mat.setTexture(mat.tface)
-
- .. method:: activate(rasty, cachingInfo)
-
- Sets material parameters for this object for rendering.
-
- Material Parameters set:
-
- #. Texture
- #. Backface culling
- #. Line drawing
- #. Specular Colour
- #. Shininess
- #. Diffuse Colour
- #. Polygon Offset.
-
- :arg rasty: Rasterizer instance.
- :type rasty: CObject
- :arg cachingInfo: Material cache instance.
- :type cachingInfo: CObject
-
- .. method:: setCustomMaterial(material)
-
- Sets the material state setup object.
-
- Using this method, you can extend or completely replace the gameengine material
- to do your own advanced multipass effects.
-
- Use this method to register your material class. Instead of the normal material,
- your class's activate method will be called just before rendering the mesh.
- This should setup the texture, material, and any other state you would like.
- It should return True to render the mesh, or False if you are finished. You should
- clean up any state Blender does not set before returning False.
-
- Activate Method Definition:
-
- .. code-block:: python
-
- def activate(self, rasty, cachingInfo, material):
-
- :arg material: The material object.
- :type material: instance
-
- .. code-block:: python
-
- class PyMaterial:
- def __init__(self):
- self.pass_no = -1
-
- def activate(self, rasty, cachingInfo, material):
- # Activate the material here.
- #
- # The activate method will be called until it returns False.
- # Every time the activate method returns True the mesh will
- # be rendered.
- #
- # rasty is a CObject for passing to material.updateTexture()
- # and material.activate()
- # cachingInfo is a CObject for passing to material.activate()
- # material is the KX_PolygonMaterial instance this material
- # was added to
-
- # default material properties:
- self.pass_no += 1
- if self.pass_no == 0:
- material.activate(rasty, cachingInfo)
- # Return True to do this pass
- return True
-
- # clean up and return False to finish.
- self.pass_no = -1
- return False
-
- # Create a new Python Material and pass it to the renderer.
- mat.setCustomMaterial(PyMaterial())
-
-.. class:: KX_RadarSensor(KX_NearSensor)
-
- Radar sensor is a near sensor with a conical sensor object.
-
- .. attribute:: coneOrigin
-
- The origin of the cone with which to test. The origin is in the middle of the cone. (read-only).
-
- :type: list of floats [x, y, z]
-
- .. attribute:: coneTarget
-
- The center of the bottom face of the cone with which to test. (read-only).
-
- :type: list of floats [x, y, z]
-
- .. attribute:: distance
-
- The height of the cone with which to test.
-
- :type: float
-
- .. attribute:: angle
-
- The angle of the cone (in degrees) with which to test.
-
- :type: float from 0 to 360
-
- .. attribute:: axis
-
- The axis on which the radar cone is cast.
-
- :type: integer from 0 to 5
-
- KX_RADAR_AXIS_POS_X, KX_RADAR_AXIS_POS_Y, KX_RADAR_AXIS_POS_Z,
- KX_RADAR_AXIS_NEG_X, KX_RADAR_AXIS_NEG_Y, KX_RADAR_AXIS_NEG_Z
-
- .. method:: getConeHeight()
-
- :return: The height of the cone with which to test.
- :rtype: float
-
-.. class:: KX_RaySensor(SCA_ISensor)
-
- A ray sensor detects the first object in a given direction.
-
- .. attribute:: propName
-
- The property the ray is looking for.
-
- :type: string
-
- .. attribute:: range
-
- The distance of the ray.
-
- :type: float
-
- .. attribute:: useMaterial
-
- Whether or not to look for a material (false = property).
-
- :type: boolean
-
- .. attribute:: useXRay
-
- Whether or not to use XRay.
-
- :type: boolean
-
- .. attribute:: hitObject
-
- The game object that was hit by the ray. (read-only).
-
- :type: :class:`KX_GameObject`
-
- .. attribute:: hitPosition
-
- The position (in worldcoordinates) where the object was hit by the ray. (read-only).
-
- :type: list [x, y, z]
-
- .. attribute:: hitNormal
-
- The normal (in worldcoordinates) of the object at the location where the object was hit by the ray. (read-only).
-
- :type: list [x, y, z]
-
- .. attribute:: rayDirection
-
- The direction from the ray (in worldcoordinates). (read-only).
-
- :type: list [x, y, z]
-
- .. attribute:: axis
-
- The axis the ray is pointing on.
-
- :type: integer from 0 to 5
-
- * KX_RAY_AXIS_POS_X
- * KX_RAY_AXIS_POS_Y
- * KX_RAY_AXIS_POS_Z
- * KX_RAY_AXIS_NEG_X
- * KX_RAY_AXIS_NEG_Y
- * KX_RAY_AXIS_NEG_Z
-
-.. class:: KX_SCA_AddObjectActuator(SCA_IActuator)
-
- Edit Object Actuator (in Add Object Mode)
-
- .. warning::
-
- An Add Object actuator will be ignored if at game start, the linked object doesn't exist (or is empty) or the linked object is in an active layer.
-
- .. code-block:: none
-
- Error: GameObject 'Name' has a AddObjectActuator 'ActuatorName' without object (in 'nonactive' layer)
-
- .. attribute:: object
-
- the object this actuator adds.
-
- :type: :class:`KX_GameObject` or None
-
- .. attribute:: objectLastCreated
-
- the last added object from this actuator (read-only).
-
- :type: :class:`KX_GameObject` or None
-
- .. attribute:: time
-
- the lifetime of added objects, in frames. Set to 0 to disable automatic deletion.
-
- :type: integer
-
- .. attribute:: linearVelocity
-
- the initial linear velocity of added objects.
-
- :type: list [vx, vy, vz]
-
- .. attribute:: angularVelocity
-
- the initial angular velocity of added objects.
-
- :type: list [vx, vy, vz]
-
- .. method:: instantAddObject()
-
- :return: The last object created by this actuator. The object can then be accessed from :data:`objectLastCreated`.
- :rtype: None
-
-.. class:: KX_SCA_DynamicActuator(SCA_IActuator)
-
- Dynamic Actuator.
-
- .. attribute:: mode
-
- :type: integer
-
- the type of operation of the actuator, 0-4
-
- * KX_DYN_RESTORE_DYNAMICS(0)
- * KX_DYN_DISABLE_DYNAMICS(1)
- * KX_DYN_ENABLE_RIGID_BODY(2)
- * KX_DYN_DISABLE_RIGID_BODY(3)
- * KX_DYN_SET_MASS(4)
-
- .. attribute:: mass
-
- the mass value for the KX_DYN_SET_MASS operation.
-
- :type: float
-
-.. class:: KX_SCA_EndObjectActuator(SCA_IActuator)
-
- Edit Object Actuator (in End Object mode)
-
- This actuator has no python methods.
-
-.. class:: KX_SCA_ReplaceMeshActuator(SCA_IActuator)
-
- Edit Object actuator, in Replace Mesh mode.
-
- .. warning::
-
- Replace mesh actuators will be ignored if at game start, the named mesh doesn't exist.
-
- This will generate a warning in the console
-
- .. code-block:: none
-
- Error: GameObject 'Name' ReplaceMeshActuator 'ActuatorName' without object
-
- .. code-block:: python
-
- # Level-of-detail
- # Switch a game object's mesh based on its depth in the camera view.
- # +----------+ +-----------+ +-------------------------------------+
- # | Always +-----+ Python +-----+ Edit Object (Replace Mesh) LOD.Mesh |
- # +----------+ +-----------+ +-------------------------------------+
- import GameLogic
-
- # List detail meshes here
- # Mesh (name, near, far)
- # Meshes overlap so that they don't 'pop' when on the edge of the distance.
- meshes = ((".Hi", 0.0, -20.0),
- (".Med", -15.0, -50.0),
- (".Lo", -40.0, -100.0)
- )
-
- co = GameLogic.getCurrentController()
- obj = co.owner
- act = co.actuators["LOD." + obj.name]
- cam = GameLogic.getCurrentScene().active_camera
-
- def Depth(pos, plane):
- return pos[0]*plane[0] + pos[1]*plane[1] + pos[2]*plane[2] + plane[3]
-
- # Depth is negative and decreasing further from the camera
- depth = Depth(obj.position, cam.world_to_camera[2])
-
- newmesh = None
- curmesh = None
- # Find the lowest detail mesh for depth
- for mesh in meshes:
- if depth < mesh[1] and depth > mesh[2]:
- newmesh = mesh
- if "ME" + obj.name + mesh[0] == act.getMesh():
- curmesh = mesh
-
- if newmesh != None and "ME" + obj.name + newmesh[0] != act.getMesh():
- # The mesh is a different mesh - switch it.
- # Check the current mesh is not a better fit.
- if curmesh == None or curmesh[1] < depth or curmesh[2] > depth:
- act.mesh = obj.getName() + newmesh[0]
- GameLogic.addActiveActuator(act, True)
-
- .. attribute:: mesh
-
- :class:`MeshProxy` or the name of the mesh that will replace the current one.
-
- Set to None to disable actuator.
-
- :type: :class:`MeshProxy` or None if no mesh is set
-
- .. attribute:: useDisplayMesh
-
- when true the displayed mesh is replaced.
-
- :type: boolean
-
- .. attribute:: usePhysicsMesh
-
- when true the physics mesh is replaced.
-
- :type: boolean
-
- .. method:: instantReplaceMesh()
-
- Immediately replace mesh without delay.
-
-.. class:: KX_Scene(PyObjectPlus)
-
- An active scene that gives access to objects, cameras, lights and scene attributes.
-
- The activity culling stuff is supposed to disable logic bricks when their owner gets too far
- from the active camera. It was taken from some code lurking at the back of KX_Scene - who knows
- what it does!
-
- .. code-block:: python
-
- import GameLogic
-
- # get the scene
- scene = GameLogic.getCurrentScene()
-
- # print all the objects in the scene
- for obj in scene.objects:
- print obj.name
-
- # get an object named 'Cube'
- obj = scene.objects["Cube"]
-
- # get the first object in the scene.
- obj = scene.objects[0]
-
- .. code-block:: python
-
- # Get the depth of an object in the camera view.
- import GameLogic
-
- obj = GameLogic.getCurrentController().owner
- cam = GameLogic.getCurrentScene().active_camera
-
- # Depth is negative and decreasing further from the camera
- depth = obj.position[0]*cam.world_to_camera[2][0] + obj.position[1]*cam.world_to_camera[2][1] + obj.position[2]*cam.world_to_camera[2][2] + cam.world_to_camera[2][3]
-
- @bug: All attributes are read only at the moment.
-
- .. attribute:: name
-
- The scene's name, (read-only).
-
- :type: string
-
- .. attribute:: objects
-
- A list of objects in the scene, (read-only).
-
- :type: :class:`CListValue` of :class:`KX_GameObject`
-
- .. attribute:: objectsInactive
-
- A list of objects on background layers (used for the addObject actuator), (read-only).
-
- :type: :class:`CListValue` of :class:`KX_GameObject`
-
- .. attribute:: lights
-
- A list of lights in the scene, (read-only).
-
- :type: :class:`CListValue` of :class:`KX_LightObject`
-
- .. attribute:: cameras
-
- A list of cameras in the scene, (read-only).
-
- :type: :class:`CListValue` of :class:`KX_Camera`
-
- .. attribute:: active_camera
-
- The current active camera.
-
- :type: :class:`KX_Camera`
-
- .. note::
-
- This can be set directly from python to avoid using the :class:`KX_SceneActuator`.
-
- .. attribute:: suspended
-
- True if the scene is suspended, (read-only).
-
- :type: boolean
-
- .. attribute:: activity_culling
-
- True if the scene is activity culling.
-
- :type: boolean
-
- .. attribute:: activity_culling_radius
-
- The distance outside which to do activity culling. Measured in manhattan distance.
-
- :type: float
-
- .. attribute:: dbvt_culling
-
- True when Dynamic Bounding box Volume Tree is set (read-only).
-
- :type: boolean
-
- .. attribute:: pre_draw
-
- A list of callables to be run before the render step.
-
- :type: list
-
- .. attribute:: post_draw
-
- A list of callables to be run after the render step.
-
- :type: list
-
- .. method:: addObject(object, other, time=0)
-
- Adds an object to the scene like the Add Object Actuator would.
-
- :arg object: The object to add
- :type object: :class:`KX_GameObject` or string
- :arg other: The object's center to use when adding the object
- :type other: :class:`KX_GameObject` or string
- :arg time: The lifetime of the added object, in frames. A time of 0 means the object will last forever.
- :type time: integer
- :return: The newly added object.
- :rtype: :class:`KX_GameObject`
-
- .. method:: end()
-
- Removes the scene from the game.
-
- .. method:: restart()
-
- Restarts the scene.
-
- .. method:: replace(scene)
-
- Replaces this scene with another one.
-
- :arg scene: The name of the scene to replace this scene with.
- :type scene: string
-
- .. method:: suspend()
-
- Suspends this scene.
-
- .. method:: resume()
-
- Resume this scene.
-
- .. method:: get(key, default=None)
-
- Return the value matching key, or the default value if its not found.
- :return: The key value or a default.
-
-.. class:: KX_SceneActuator(SCA_IActuator)
-
- Scene Actuator logic brick.
-
- .. warning::
-
- Scene actuators that use a scene name will be ignored if at game start, the named scene doesn't exist or is empty
-
- This will generate a warning in the console:
-
- .. code-block:: none
-
- Error: GameObject 'Name' has a SceneActuator 'ActuatorName' (SetScene) without scene
-
- .. attribute:: scene
-
- the name of the scene to change to/overlay/underlay/remove/suspend/resume.
-
- :type: string
-
- .. attribute:: camera
-
- the camera to change to.
-
- :type: :class:`KX_Camera` on read, string or :class:`KX_Camera` on write
-
- .. note::
-
- When setting the attribute, you can use either a :class:`KX_Camera` or the name of the camera.
-
- .. attribute:: useRestart
-
- Set flag to True to restart the sene.
-
- :type: boolean
-
- .. attribute:: mode
-
- The mode of the actuator.
-
- :type: integer from 0 to 5.
-
-.. class:: KX_SoundActuator(SCA_IActuator)
-
- Sound Actuator.
-
- The :data:`startSound`, :data:`pauseSound` and :data:`stopSound` do not requirethe actuator to be activated - they act instantly provided that the actuator has been activated once at least.
-
- .. attribute:: fileName
-
- The filename of the sound this actuator plays.
-
- :type: string
-
- .. attribute:: volume
-
- The volume (gain) of the sound.
-
- :type: float
-
- .. attribute:: pitch
-
- The pitch of the sound.
-
- :type: float
-
- .. attribute:: rollOffFactor
-
- The roll off factor. Rolloff defines the rate of attenuation as the sound gets further away.
-
- :type: float
-
- .. attribute:: looping
-
- The loop mode of the actuator.
-
- :type: integer
-
- .. attribute:: position
-
- The position of the sound as a list: [x, y, z].
-
- :type: float array
-
- .. attribute:: velocity
-
- The velocity of the emitter as a list: [x, y, z]. The relative velocity to the observer determines the pitch. List of 3 floats: [x, y, z].
-
- :type: float array
-
- .. attribute:: orientation
-
- The orientation of the sound. When setting the orientation you can also use quaternion [float, float, float, float] or euler angles [float, float, float].
-
- :type: 3x3 matrix [[float]]
-
- .. attribute:: mode
-
- The operation mode of the actuator. Can be one of :ref:`these constants<logic-sound-actuator>`
-
- :type: integer
-
-.. class:: KX_StateActuator(SCA_IActuator)
-
- State actuator changes the state mask of parent object.
-
- .. attribute:: operation
-
- Type of bit operation to be applied on object state mask.
-
- You can use one of :ref:`these constants <state-actuator-operation>`
-
- :type: integer
-
- .. attribute:: mask
-
- Value that defines the bits that will be modified by the operation.
-
- The bits that are 1 in the mask will be updated in the object state.
-
- The bits that are 0 are will be left unmodified expect for the Copy operation which copies the mask to the object state.
-
- :type: integer
-
-.. class:: KX_TrackToActuator(SCA_IActuator)
-
- Edit Object actuator in Track To mode.
-
- .. warning::
-
- Track To Actuators will be ignored if at game start, the object to track to is invalid.
-
- This will generate a warning in the console:
-
- .. code-block:: none
-
- GameObject 'Name' no object in EditObjectActuator 'ActuatorName'
-
- .. attribute:: object
-
- the object this actuator tracks.
-
- :type: :class:`KX_GameObject` or None
-
- .. attribute:: time
-
- the time in frames with which to delay the tracking motion.
-
- :type: integer
-
- .. attribute:: use3D
-
- the tracking motion to use 3D.
-
- :type: boolean
-
-.. class:: KX_VehicleWrapper(PyObjectPlus)
-
- KX_VehicleWrapper
-
- TODO - description
-
- .. method:: addWheel(wheel, attachPos, attachDir, axleDir, suspensionRestLength, wheelRadius, hasSteering)
-
- Add a wheel to the vehicle
-
- :arg wheel: The object to use as a wheel.
- :type wheel: :class:`KX_GameObject` or a KX_GameObject name
- :arg attachPos: The position that this wheel will attach to.
- :type attachPos: vector of 3 floats
- :arg attachDir: The direction this wheel points.
- :type attachDir: vector of 3 floats
- :arg axleDir: The direction of this wheels axle.
- :type axleDir: vector of 3 floats
- :arg suspensionRestLength: TODO - Description
- :type suspensionRestLength: float
- :arg wheelRadius: The size of the wheel.
- :type wheelRadius: float
-
- .. method:: applyBraking(force, wheelIndex)
-
- Apply a braking force to the specified wheel
-
- :arg force: the brake force
- :type force: float
-
- :arg wheelIndex: index of the wheel where the force needs to be applied
- :type wheelIndex: integer
-
- .. method:: applyEngineForce(force, wheelIndex)
-
- Apply an engine force to the specified wheel
-
- :arg force: the engine force
- :type force: float
-
- :arg wheelIndex: index of the wheel where the force needs to be applied
- :type wheelIndex: integer
-
- .. method:: getConstraintId()
-
- Get the constraint ID
-
- :return: the constraint id
- :rtype: integer
-
- .. method:: getConstraintType()
-
- Returns the constraint type.
-
- :return: constraint type
- :rtype: integer
-
- .. method:: getNumWheels()
-
- Returns the number of wheels.
-
- :return: the number of wheels for this vehicle
- :rtype: integer
-
- .. method:: getWheelOrientationQuaternion(wheelIndex)
-
- Returns the wheel orientation as a quaternion.
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
-
- :return: TODO Description
- :rtype: TODO - type should be quat as per method name but from the code it looks like a matrix
-
- .. method:: getWheelPosition(wheelIndex)
-
- Returns the position of the specified wheel
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
- :return: position vector
- :rtype: list[x, y, z]
-
- .. method:: getWheelRotation(wheelIndex)
-
- Returns the rotation of the specified wheel
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
-
- :return: the wheel rotation
- :rtype: float
-
- .. method:: setRollInfluence(rollInfluece, wheelIndex)
-
- Set the specified wheel's roll influence.
- The higher the roll influence the more the vehicle will tend to roll over in corners.
-
- :arg rollInfluece: the wheel roll influence
- :type rollInfluece: float
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
-
- .. method:: setSteeringValue(steering, wheelIndex)
-
- Set the specified wheel's steering
-
- :arg steering: the wheel steering
- :type steering: float
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
-
- .. method:: setSuspensionCompression(compression, wheelIndex)
-
- Set the specified wheel's compression
-
- :arg compression: the wheel compression
- :type compression: float
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
-
- .. method:: setSuspensionDamping(damping, wheelIndex)
-
- Set the specified wheel's damping
-
- :arg damping: the wheel damping
- :type damping: float
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
-
- .. method:: setSuspensionStiffness(stiffness, wheelIndex)
-
- Set the specified wheel's stiffness
-
- :arg stiffness: the wheel stiffness
- :type stiffness: float
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
-
- .. method:: setTyreFriction(friction, wheelIndex)
-
- Set the specified wheel's tyre friction
-
- :arg friction: the tyre friction
- :type friction: float
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
-
-.. class:: KX_VertexProxy(SCA_IObject)
-
- A vertex holds position, UV, colour and normal information.
-
- Note:
- The physics simulation is NOT currently updated - physics will not respond
- to changes in the vertex position.
-
- .. attribute:: XYZ
-
- The position of the vertex.
-
- :type: list [x, y, z]
-
- .. attribute:: UV
-
- The texture coordinates of the vertex.
-
- :type: list [u, v]
-
- .. attribute:: normal
-
- The normal of the vertex.
-
- :type: list [nx, ny, nz]
-
- .. attribute:: colour
-
- The colour of the vertex.
-
- :type: list [r, g, b, a]
-
- Black = [0.0, 0.0, 0.0, 1.0], White = [1.0, 1.0, 1.0, 1.0]
-
- .. attribute:: color
-
- Synonym for colour.
-
- .. attribute:: x
-
- The x coordinate of the vertex.
-
- :type: float
-
- .. attribute:: y
-
- The y coordinate of the vertex.
-
- :type: float
-
- .. attribute:: z
-
- The z coordinate of the vertex.
-
- :type: float
-
- .. attribute:: u
-
- The u texture coordinate of the vertex.
-
- :type: float
-
- .. attribute:: v
-
- The v texture coordinate of the vertex.
-
- :type: float
-
- .. attribute:: u2
-
- The second u texture coordinate of the vertex.
-
- :type: float
-
- .. attribute:: v2
-
- The second v texture coordinate of the vertex.
-
- :type: float
-
- .. attribute:: r
-
- The red component of the vertex colour. 0.0 <= r <= 1.0.
-
- :type: float
-
- .. attribute:: g
-
- The green component of the vertex colour. 0.0 <= g <= 1.0.
-
- :type: float
-
- .. attribute:: b
-
- The blue component of the vertex colour. 0.0 <= b <= 1.0.
-
- :type: float
-
- .. attribute:: a
-
- The alpha component of the vertex colour. 0.0 <= a <= 1.0.
-
- :type: float
-
- .. method:: getXYZ()
-
- Gets the position of this vertex.
-
- :return: this vertexes position in local coordinates.
- :rtype: list [x, y, z]
-
- .. method:: setXYZ(pos)
-
- Sets the position of this vertex.
-
- :type: list [x, y, z]
-
- :arg pos: the new position for this vertex in local coordinates.
-
- .. method:: getUV()
-
- Gets the UV (texture) coordinates of this vertex.
-
- :return: this vertexes UV (texture) coordinates.
- :rtype: list [u, v]
-
- .. method:: setUV(uv)
-
- Sets the UV (texture) coordinates of this vertex.
-
- :type: list [u, v]
-
- .. method:: getUV2()
-
- Gets the 2nd UV (texture) coordinates of this vertex.
-
- :return: this vertexes UV (texture) coordinates.
- :rtype: list [u, v]
-
- .. method:: setUV2(uv, unit)
-
- Sets the 2nd UV (texture) coordinates of this vertex.
-
- :type: list [u, v]
-
- :arg unit: optional argument, FLAT==1, SECOND_UV==2, defaults to SECOND_UV
- :arg unit: integer
-
- .. method:: getRGBA()
-
- Gets the colour of this vertex.
-
- The colour is represented as four bytes packed into an integer value. The colour is
- packed as RGBA.
-
- Since Python offers no way to get each byte without shifting, you must use the struct module to
- access colour in an machine independent way.
-
- Because of this, it is suggested you use the r, g, b and a attributes or the colour attribute instead.
-
- .. code-block:: python
-
- import struct;
- col = struct.unpack('4B', struct.pack('I', v.getRGBA()))
- # col = (r, g, b, a)
- # black = ( 0, 0, 0, 255)
- # white = (255, 255, 255, 255)
-
- :return: packed colour. 4 byte integer with one byte per colour channel in RGBA format.
- :rtype: integer
-
- .. method:: setRGBA(col)
-
- Sets the colour of this vertex.
-
- See getRGBA() for the format of col, and its relevant problems. Use the r, g, b and a attributes
- or the colour attribute instead.
-
- setRGBA() also accepts a four component list as argument col. The list represents the colour as [r, g, b, a]
- with black = [0.0, 0.0, 0.0, 1.0] and white = [1.0, 1.0, 1.0, 1.0]
-
- .. code-block:: python
-
- v.setRGBA(0xff0000ff) # Red
- v.setRGBA(0xff00ff00) # Green on little endian, transparent purple on big endian
- v.setRGBA([1.0, 0.0, 0.0, 1.0]) # Red
- v.setRGBA([0.0, 1.0, 0.0, 1.0]) # Green on all platforms.
-
- :arg col: the new colour of this vertex in packed RGBA format.
- :type col: integer or list [r, g, b, a]
-
- .. method:: getNormal()
-
- Gets the normal vector of this vertex.
-
- :return: normalised normal vector.
- :rtype: list [nx, ny, nz]
-
- .. method:: setNormal(normal)
-
- Sets the normal vector of this vertex.
-
- :type: sequence of floats [r, g, b]
-
- :arg normal: the new normal of this vertex.
-
-.. class:: KX_VisibilityActuator(SCA_IActuator)
-
- Visibility Actuator.
-
- .. attribute:: visibility
-
- whether the actuator makes its parent object visible or invisible.
-
- :type: boolean
-
- .. attribute:: useOcclusion
-
- whether the actuator makes its parent object an occluder or not.
-
- :type: boolean
-
- .. attribute:: useRecursion
-
- whether the visibility/occlusion should be propagated to all children of the object.
-
- :type: boolean
-
-.. class:: SCA_2DFilterActuator(SCA_IActuator)
-
- Create, enable and disable 2D filters
-
- The following properties don't have an immediate effect.
- You must active the actuator to get the result.
- The actuator is not persistent: it automatically stops itself after setting up the filter
- but the filter remains active. To stop a filter you must activate the actuator with 'type'
- set to :data:`~bge.logic.RAS_2DFILTER_DISABLED` or :data:`~bge.logic.RAS_2DFILTER_NOFILTER`.
-
- .. attribute:: shaderText
-
- shader source code for custom shader.
-
- :type: string
-
- .. attribute:: disableMotionBlur
-
- action on motion blur: 0=enable, 1=disable.
-
- :type: integer
-
- .. attribute:: mode
-
- Type of 2D filter, use one of :ref:`these constants <Two-D-FilterActuator-mode>`
-
- :type: integer
-
- .. attribute:: passNumber
-
- order number of filter in the stack of 2D filters. Filters are executed in increasing order of passNb.
-
- Only be one filter can be defined per passNb.
-
- :type: integer (0-100)
-
- .. attribute:: value
-
- argument for motion blur filter.
-
- :type: float (0.0-100.0)
-
-.. class:: SCA_ANDController(SCA_IController)
-
- An AND controller activates only when all linked sensors are activated.
-
- There are no special python methods for this controller.
-
-.. class:: SCA_ActuatorSensor(SCA_ISensor)
-
- Actuator sensor detect change in actuator state of the parent object.
- It generates a positive pulse if the corresponding actuator is activated
- and a negative pulse if the actuator is deactivated.
-
- .. attribute:: actuator
-
- the name of the actuator that the sensor is monitoring.
-
- :type: string
-
-.. class:: SCA_AlwaysSensor(SCA_ISensor)
-
- This sensor is always activated.
-
-.. class:: SCA_DelaySensor(SCA_ISensor)
-
- The Delay sensor generates positive and negative triggers at precise time,
- expressed in number of frames. The delay parameter defines the length of the initial OFF period. A positive trigger is generated at the end of this period.
-
- The duration parameter defines the length of the ON period following the OFF period.
- There is a negative trigger at the end of the ON period. If duration is 0, the sensor stays ON and there is no negative trigger.
-
- The sensor runs the OFF-ON cycle once unless the repeat option is set: the OFF-ON cycle repeats indefinately (or the OFF cycle if duration is 0).
-
- Use :class:`SCA_ISensor.reset` at any time to restart sensor.
-
- .. attribute:: delay
-
- length of the initial OFF period as number of frame, 0 for immediate trigger.
-
- :type: integer.
-
- .. attribute:: duration
-
- length of the ON period in number of frame after the initial OFF period.
-
- If duration is greater than 0, a negative trigger is sent at the end of the ON pulse.
-
- :type: integer
-
- .. attribute:: repeat
-
- 1 if the OFF-ON cycle should be repeated indefinately, 0 if it should run once.
-
- :type: integer
-
-.. class:: SCA_JoystickSensor(SCA_ISensor)
-
- This sensor detects player joystick events.
-
- .. attribute:: axisValues
-
- The state of the joysticks axis as a list of values :data:`numAxis` long. (read-only).
-
- :type: list of ints.
-
- Each spesifying the value of an axis between -32767 and 32767 depending on how far the axis is pushed, 0 for nothing.
- The first 2 values are used by most joysticks and gamepads for directional control. 3rd and 4th values are only on some joysticks and can be used for arbitary controls.
-
- * left:[-32767, 0, ...]
- * right:[32767, 0, ...]
- * up:[0, -32767, ...]
- * down:[0, 32767, ...]
-
- .. attribute:: axisSingle
-
- like :data:`axisValues` but returns a single axis value that is set by the sensor. (read-only).
-
- :type: integer
-
- .. note::
-
- Only use this for "Single Axis" type sensors otherwise it will raise an error.
-
- .. attribute:: hatValues
-
- The state of the joysticks hats as a list of values :data:`numHats` long. (read-only).
-
- :type: list of ints
-
- Each spesifying the direction of the hat from 1 to 12, 0 when inactive.
-
- Hat directions are as follows...
-
- * 0:None
- * 1:Up
- * 2:Right
- * 4:Down
- * 8:Left
- * 3:Up - Right
- * 6:Down - Right
- * 12:Down - Left
- * 9:Up - Left
-
- .. attribute:: hatSingle
-
- Like :data:`hatValues` but returns a single hat direction value that is set by the sensor. (read-only).
-
- :type: integer
-
- .. attribute:: numAxis
-
- The number of axes for the joystick at this index. (read-only).
-
- :type: integer
-
- .. attribute:: numButtons
-
- The number of buttons for the joystick at this index. (read-only).
-
- :type: integer
-
- .. attribute:: numHats
-
- The number of hats for the joystick at this index. (read-only).
-
- :type: integer
-
- .. attribute:: connected
-
- True if a joystick is connected at this joysticks index. (read-only).
-
- :type: boolean
-
- .. attribute:: index
-
- The joystick index to use (from 0 to 7). The first joystick is always 0.
-
- :type: integer
-
- .. attribute:: threshold
-
- Axis threshold. Joystick axis motion below this threshold wont trigger an event. Use values between (0 and 32767), lower values are more sensitive.
-
- :type: integer
-
- .. attribute:: button
-
- The button index the sensor reacts to (first button = 0). When the "All Events" toggle is set, this option has no effect.
-
- :type: integer
-
- .. attribute:: axis
-
- The axis this sensor reacts to, as a list of two values [axisIndex, axisDirection]
-
- * axisIndex: the axis index to use when detecting axis movement, 1=primary directional control, 2=secondary directional control.
- * axisDirection: 0=right, 1=up, 2=left, 3=down.
-
- :type: [integer, integer]
-
- .. attribute:: hat
-
- The hat the sensor reacts to, as a list of two values: [hatIndex, hatDirection]
-
- * hatIndex: the hat index to use when detecting hat movement, 1=primary hat, 2=secondary hat (4 max).
- * hatDirection: 1-12.
-
- :type: [integer, integer]
-
- .. method:: getButtonActiveList()
-
- :return: A list containing the indicies of the currently pressed buttons.
- :rtype: list
-
- .. method:: getButtonStatus(buttonIndex)
-
- :arg buttonIndex: the button index, 0=first button
- :type buttonIndex: integer
- :return: The current pressed state of the specified button.
- :rtype: boolean
-
-.. class:: SCA_KeyboardSensor(SCA_ISensor)
-
- A keyboard sensor detects player key presses.
-
- See module :mod:`bge.keys` for keycode values.
-
- .. attribute:: key
-
- The key code this sensor is looking for.
-
- :type: keycode from :mod:`bge.keys` module
-
- .. attribute:: hold1
-
- The key code for the first modifier this sensor is looking for.
-
- :type: keycode from :mod:`bge.keys` module
-
- .. attribute:: hold2
-
- The key code for the second modifier this sensor is looking for.
-
- :type: keycode from :mod:`bge.keys` module
-
- .. attribute:: toggleProperty
-
- The name of the property that indicates whether or not to log keystrokes as a string.
-
- :type: string
-
- .. attribute:: targetProperty
-
- The name of the property that receives keystrokes in case in case a string is logged.
-
- :type: string
-
- .. attribute:: useAllKeys
-
- Flag to determine whether or not to accept all keys.
-
- :type: boolean
-
- .. attribute:: events
-
- a list of pressed keys that have either been pressed, or just released, or are active this frame. (read-only).
-
- :type: list [[:ref:`keycode<keyboard-keys>`, :ref:`status<input-status>`], ...]
-
- .. method:: getKeyStatus(keycode)
-
- Get the status of a key.
-
- :arg keycode: The code that represents the key you want to get the state of, use one of :ref:`these constants<keyboard-keys>`
- :type keycode: integer
- :return: The state of the given key, can be one of :ref:`these constants<input-status>`
- :rtype: int
-
-.. class:: SCA_NANDController(SCA_IController)
-
- An NAND controller activates when all linked sensors are not active.
-
- There are no special python methods for this controller.
-
-.. class:: SCA_NORController(SCA_IController)
-
- An NOR controller activates only when all linked sensors are de-activated.
-
- There are no special python methods for this controller.
-
-.. class:: SCA_ORController(SCA_IController)
-
- An OR controller activates when any connected sensor activates.
-
- There are no special python methods for this controller.
-
-.. class:: SCA_PropertyActuator(SCA_IActuator)
-
- Property Actuator
-
- .. attribute:: propName
-
- the property on which to operate.
-
- :type: string
-
- .. attribute:: value
-
- the value with which the actuator operates.
-
- :type: string
-
- .. attribute:: mode
-
- TODO - add constants to game logic dict!.
-
- :type: integer
-
-.. class:: SCA_PropertySensor(SCA_ISensor)
-
- Activates when the game object property matches.
-
- .. attribute:: mode
-
- Type of check on the property. Can be one of :ref:`these constants <logic-property-sensor>`
-
- :type: integer.
-
- .. attribute:: propName
-
- the property the sensor operates.
-
- :type: string
-
- .. attribute:: value
-
- the value with which the sensor compares to the value of the property.
-
- :type: string
-
- .. attribute:: min
-
- the minimum value of the range used to evaluate the property when in interval mode.
-
- :type: string
-
- .. attribute:: max
-
- the maximum value of the range used to evaluate the property when in interval mode.
-
- :type: string
-
-.. class:: SCA_PythonController(SCA_IController)
-
- A Python controller uses a Python script to activate it's actuators,
- based on it's sensors.
-
- .. attribute:: script
-
- The value of this variable depends on the execution methid.
-
- * When 'Script' execution mode is set this value contains the entire python script as a single string (not the script name as you might expect) which can be modified to run different scripts.
- * When 'Module' execution mode is set this value will contain a single line string - module name and function "module.func" or "package.modile.func" where the module names are python textblocks or external scripts.
-
- :type: string
-
- .. note::
-
- Once this is set the script name given for warnings will remain unchanged.
-
- .. attribute:: mode
-
- the execution mode for this controller (read-only).
-
- * Script: 0, Execite the :data:`script` as a python code.
- * Module: 1, Execite the :data:`script` as a module and function.
-
- :type: integer
-
- .. method:: activate(actuator)
-
- Activates an actuator attached to this controller.
-
- :arg actuator: The actuator to operate on.
- :type actuator: actuator or the actuator name as a string
-
- .. method:: deactivate(actuator)
-
- Deactivates an actuator attached to this controller.
-
- :arg actuator: The actuator to operate on.
- :type actuator: actuator or the actuator name as a string
-
-.. class:: SCA_RandomActuator(SCA_IActuator)
-
- Random Actuator
-
- .. attribute:: seed
-
- Seed of the random number generator.
-
- :type: integer.
-
- Equal seeds produce equal series. If the seed is 0, the generator will produce the same value on every call.
-
- .. attribute:: para1
-
- the first parameter of the active distribution.
-
- :type: float, read-only.
-
- Refer to the documentation of the generator types for the meaning of this value.
-
- .. attribute:: para2
-
- the second parameter of the active distribution.
-
- :type: float, read-only
-
- Refer to the documentation of the generator types for the meaning of this value.
-
- .. attribute:: distribution
-
- Distribution type. (read-only). Can be one of :ref:`these constants <logic-random-distributions>`
-
- :type: integer
-
- .. attribute:: propName
-
- the name of the property to set with the random value.
-
- :type: string
-
- If the generator and property types do not match, the assignment is ignored.
-
- .. method:: setBoolConst(value)
-
- Sets this generator to produce a constant boolean value.
-
- :arg value: The value to return.
- :type value: boolean
-
- .. method:: setBoolUniform()
-
- Sets this generator to produce a uniform boolean distribution.
-
- The generator will generate True or False with 50% chance.
-
- .. method:: setBoolBernouilli(value)
-
- Sets this generator to produce a Bernouilli distribution.
-
- :arg value: Specifies the proportion of False values to produce.
-
- * 0.0: Always generate True
- * 1.0: Always generate False
- :type value: float
-
- .. method:: setIntConst(value)
-
- Sets this generator to always produce the given value.
-
- :arg value: the value this generator produces.
- :type value: integer
-
- .. method:: setIntUniform(lower_bound, upper_bound)
-
- Sets this generator to produce a random value between the given lower and
- upper bounds (inclusive).
-
- :type lower_bound: integer
- :type upper_bound: integer
-
- .. method:: setIntPoisson(value)
-
- Generate a Poisson-distributed number.
-
- This performs a series of Bernouilli tests with parameter value.
- It returns the number of tries needed to achieve succes.
-
- :type value: float
-
- .. method:: setFloatConst(value)
-
- Always generate the given value.
-
- :type value: float
-
- .. method:: setFloatUniform(lower_bound, upper_bound)
-
- Generates a random float between lower_bound and upper_bound with a
- uniform distribution.
-
- :type lower_bound: float
- :type upper_bound: float
-
- .. method:: setFloatNormal(mean, standard_deviation)
-
- Generates a random float from the given normal distribution.
-
- :arg mean: The mean (average) value of the generated numbers
- :type mean: float
- :arg standard_deviation: The standard deviation of the generated numbers.
- :type standard_deviation: float
-
- .. method:: setFloatNegativeExponential(half_life)
-
- Generate negative-exponentially distributed numbers.
-
- The half-life 'time' is characterized by half_life.
-
- :type half_life: float
-
-.. class:: SCA_RandomSensor(SCA_ISensor)
-
- This sensor activates randomly.
-
- .. attribute:: lastDraw
-
- The seed of the random number generator.
-
- :type: integer
-
- .. attribute:: seed
-
- The seed of the random number generator.
-
- :type: integer
-
- .. method:: setSeed(seed)
-
- Sets the seed of the random number generator.
-
- If the seed is 0, the generator will produce the same value on every call.
-
- :type seed: integer
-
- .. method:: getSeed()
-
- :return: The initial seed of the generator. Equal seeds produce equal random series.
- :rtype: integer
-
- .. method:: getLastDraw()
-
- :return: The last random number generated.
- :rtype: integer
-
-.. class:: SCA_XNORController(SCA_IController)
-
- An XNOR controller activates when all linked sensors are the same (activated or inative).
-
- There are no special python methods for this controller.
-
-.. class:: SCA_XORController(SCA_IController)
-
- An XOR controller activates when there is the input is mixed, but not when all are on or off.
-
- There are no special python methods for this controller.
-
-.. class:: KX_Camera(KX_GameObject)
-
- A Camera object.
-
- .. data:: INSIDE
-
- See :data:`sphereInsideFrustum` and :data:`boxInsideFrustum`
-
- .. data:: INTERSECT
-
- See :data:`sphereInsideFrustum` and :data:`boxInsideFrustum`
-
- .. data:: OUTSIDE
-
- See :data:`sphereInsideFrustum` and :data:`boxInsideFrustum`
-
- .. attribute:: lens
-
- The camera's lens value.
-
- :type: float
-
- .. attribute:: ortho_scale
-
- The camera's view scale when in orthographic mode.
-
- :type: float
-
- .. attribute:: near
-
- The camera's near clip distance.
-
- :type: float
-
- .. attribute:: far
-
- The camera's far clip distance.
-
- :type: float
-
- .. attribute:: perspective
-
- True if this camera has a perspective transform, False for an orthographic projection.
-
- :type: boolean
-
- .. attribute:: frustum_culling
-
- True if this camera is frustum culling.
-
- :type: boolean
-
- .. attribute:: projection_matrix
-
- This camera's 4x4 projection matrix.
-
- :type: 4x4 Matrix [[float]]
-
- .. attribute:: modelview_matrix
-
- This camera's 4x4 model view matrix. (read-only).
-
- :type: 4x4 Matrix [[float]]
-
- .. note::
-
- This matrix is regenerated every frame from the camera's position and orientation.
-
- .. attribute:: camera_to_world
-
- This camera's camera to world transform. (read-only).
-
- :type: 4x4 Matrix [[float]]
-
- .. note::
-
- This matrix is regenerated every frame from the camera's position and orientation.
-
- .. attribute:: world_to_camera
-
- This camera's world to camera transform. (read-only).
-
- :type: 4x4 Matrix [[float]]
-
- .. note::
-
- Regenerated every frame from the camera's position and orientation.
-
- .. note::
-
- This is camera_to_world inverted.
-
- .. attribute:: useViewport
-
- True when the camera is used as a viewport, set True to enable a viewport for this camera.
-
- :type: boolean
-
- .. method:: sphereInsideFrustum(centre, radius)
-
- Tests the given sphere against the view frustum.
-
- :arg centre: The centre of the sphere (in world coordinates.)
- :type centre: list [x, y, z]
- :arg radius: the radius of the sphere
- :type radius: float
- :return: :data:`~bge.types.KX_Camera.INSIDE`, :data:`~bge.types.KX_Camera.OUTSIDE` or :data:`~bge.types.KX_Camera.INTERSECT`
- :rtype: integer
-
- .. note::
-
- When the camera is first initialized the result will be invalid because the projection matrix has not been set.
-
- .. code-block:: python
-
- import GameLogic
- co = GameLogic.getCurrentController()
- cam = co.owner
-
- # A sphere of radius 4.0 located at [x, y, z] = [1.0, 1.0, 1.0]
- if (cam.sphereInsideFrustum([1.0, 1.0, 1.0], 4) != cam.OUTSIDE):
- # Sphere is inside frustum !
- # Do something useful !
- else:
- # Sphere is outside frustum
-
- .. method:: boxInsideFrustum(box)
-
- Tests the given box against the view frustum.
-
- :arg box: Eight (8) corner points of the box (in world coordinates.)
- :type box: list of lists
- :return: :data:`~bge.types.KX_Camera.INSIDE`, :data:`~bge.types.KX_Camera.OUTSIDE` or :data:`~bge.types.KX_Camera.INTERSECT`
-
- .. note::
-
- When the camera is first initialized the result will be invalid because the projection matrix has not been set.
-
- .. code-block:: python
-
- import GameLogic
- co = GameLogic.getCurrentController()
- cam = co.owner
-
- # Box to test...
- box = []
- box.append([-1.0, -1.0, -1.0])
- box.append([-1.0, -1.0, 1.0])
- box.append([-1.0, 1.0, -1.0])
- box.append([-1.0, 1.0, 1.0])
- box.append([ 1.0, -1.0, -1.0])
- box.append([ 1.0, -1.0, 1.0])
- box.append([ 1.0, 1.0, -1.0])
- box.append([ 1.0, 1.0, 1.0])
-
- if (cam.boxInsideFrustum(box) != cam.OUTSIDE):
- # Box is inside/intersects frustum !
- # Do something useful !
- else:
- # Box is outside the frustum !
-
- .. method:: pointInsideFrustum(point)
-
- Tests the given point against the view frustum.
-
- :arg point: The point to test (in world coordinates.)
- :type point: 3D Vector
- :return: True if the given point is inside this camera's viewing frustum.
- :rtype: boolean
-
- .. note::
-
- When the camera is first initialized the result will be invalid because the projection matrix has not been set.
-
- .. code-block:: python
-
- import GameLogic
- co = GameLogic.getCurrentController()
- cam = co.owner
-
- # Test point [0.0, 0.0, 0.0]
- if (cam.pointInsideFrustum([0.0, 0.0, 0.0])):
- # Point is inside frustum !
- # Do something useful !
- else:
- # Box is outside the frustum !
-
- .. method:: getCameraToWorld()
-
- Returns the camera-to-world transform.
-
- :return: the camera-to-world transform matrix.
- :rtype: matrix (4x4 list)
-
- .. method:: getWorldToCamera()
-
- Returns the world-to-camera transform.
-
- This returns the inverse matrix of getCameraToWorld().
-
- :return: the world-to-camera transform matrix.
- :rtype: matrix (4x4 list)
-
- .. method:: setOnTop()
-
- Set this cameras viewport ontop of all other viewport.
-
- .. method:: setViewport(left, bottom, right, top)
-
- Sets the region of this viewport on the screen in pixels.
-
- Use :data:`bge.render.getWindowHeight` and :data:`bge.render.getWindowWidth` to calculate values relative to the entire display.
-
- :arg left: left pixel coordinate of this viewport
- :type left: integer
- :arg bottom: bottom pixel coordinate of this viewport
- :type bottom: integer
- :arg right: right pixel coordinate of this viewport
- :type right: integer
- :arg top: top pixel coordinate of this viewport
- :type top: integer
-
- .. method:: getScreenPosition(object)
-
- Gets the position of an object projected on screen space.
-
- .. code-block:: python
-
- # For an object in the middle of the screen, coord = [0.5, 0.5]
- coord = camera.getScreenPosition(object)
-
- :arg object: object name or list [x, y, z]
- :type object: :class:`KX_GameObject` or 3D Vector
- :return: the object's position in screen coordinates.
- :rtype: list [x, y]
-
- .. method:: getScreenVect(x, y)
-
- Gets the vector from the camera position in the screen coordinate direction.
-
- :arg x: X Axis
- :type x: float
- :arg y: Y Axis
- :type y: float
- :rtype: 3D Vector
- :return: The vector from screen coordinate.
-
- .. code-block:: python
-
- # Gets the vector of the camera front direction:
- m_vect = camera.getScreenVect(0.5, 0.5)
-
- .. method:: getScreenRay(x, y, dist=inf, property=None)
-
- Look towards a screen coordinate (x, y) and find first object hit within dist that matches prop.
- The ray is similar to KX_GameObject->rayCastTo.
-
- :arg x: X Axis
- :type x: float
- :arg y: Y Axis
- :type y: float
- :arg dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to other
- :type dist: float
- :arg property: property name that object must have; can be omitted => detect any object
- :type property: string
- :rtype: :class:`KX_GameObject`
- :return: the first object hit or None if no object or object does not match prop
-
- .. code-block:: python
-
- # Gets an object with a property "wall" in front of the camera within a distance of 100:
- target = camera.getScreenRay(0.5, 0.5, 100, "wall")
-
-.. class:: BL_ArmatureObject(KX_GameObject)
-
- An armature object.
-
- .. attribute:: constraints
-
- The list of armature constraint defined on this armature.
- Elements of the list can be accessed by index or string.
- The key format for string access is '<bone_name>:<constraint_name>'.
-
- :type: list of :class:`BL_ArmatureConstraint`
-
- .. attribute:: channels
-
- The list of armature channels.
- Elements of the list can be accessed by index or name the bone.
-
- :type: list of :class:`BL_ArmatureChannel`
-
- .. method:: update()
-
- Ensures that the armature will be updated on next graphic frame.
-
- This action is unecessary if a KX_ArmatureActuator with mode run is active
- or if an action is playing. Use this function in other cases. It must be called
- on each frame to ensure that the armature is updated continously.
-
-.. class:: BL_ArmatureActuator(SCA_IActuator)
-
- Armature Actuators change constraint condition on armatures.
-
- .. _armatureactuator-constants-type:
-
- Constants related to :data:`~bge.types.BL_ArmatureActuator.type`
-
- .. data:: KX_ACT_ARMATURE_RUN
-
- Just make sure the armature will be updated on the next graphic frame. This is the only persistent mode of the actuator: it executes automatically once per frame until stopped by a controller
-
- :value: 0
-
- .. data:: KX_ACT_ARMATURE_ENABLE
-
- Enable the constraint.
-
- :value: 1
-
- .. data:: KX_ACT_ARMATURE_DISABLE
-
- Disable the constraint (runtime constraint values are not updated).
-
- :value: 2
-
- .. data:: KX_ACT_ARMATURE_SETTARGET
-
- Change target and subtarget of constraint.
-
- :value: 3
-
- .. data:: KX_ACT_ARMATURE_SETWEIGHT
-
- Change weight of (only for IK constraint).
-
- :value: 4
-
- .. attribute:: type
-
- The type of action that the actuator executes when it is active.
-
- Can be one of :ref:`these constants <armatureactuator-constants-type>`
-
- :type: integer
-
- .. attribute:: constraint
-
- The constraint object this actuator is controlling.
-
- :type: :class:`BL_ArmatureConstraint`
-
- .. attribute:: target
-
- The object that this actuator will set as primary target to the constraint it controls.
-
- :type: :class:`KX_GameObject`
-
- .. attribute:: subtarget
-
- The object that this actuator will set as secondary target to the constraint it controls.
-
- :type: :class:`KX_GameObject`.
-
- .. note::
-
- Currently, the only secondary target is the pole target for IK constraint.
-
- .. attribute:: weight
-
- The weight this actuator will set on the constraint it controls.
-
- :type: float.
-
- .. note::
-
- Currently only the IK constraint has a weight. It must be a value between 0 and 1.
-
- .. note::
-
- A weight of 0 disables a constraint while still updating constraint runtime values (see :class:`BL_ArmatureConstraint`)
-
-.. class:: KX_ArmatureSensor(SCA_ISensor)
-
- Armature sensor detect conditions on armatures.
-
- .. _armaturesensor-type:
-
- Constants related to :data:`type`
-
- .. data:: KX_ARMSENSOR_STATE_CHANGED
-
- Detect that the constraint is changing state (active/inactive)
-
- :value: 0
-
- .. data:: KX_ARMSENSOR_LIN_ERROR_BELOW
-
- Detect that the constraint linear error is above a threshold
-
- :value: 1
-
- .. data:: KX_ARMSENSOR_LIN_ERROR_ABOVE
-
- Detect that the constraint linear error is below a threshold
-
- :value: 2
-
- .. data:: KX_ARMSENSOR_ROT_ERROR_BELOW
-
- Detect that the constraint rotation error is above a threshold
-
- :value: 3
-
- .. data:: KX_ARMSENSOR_ROT_ERROR_ABOVE
-
- Detect that the constraint rotation error is below a threshold
-
- :value: 4
-
- .. attribute:: type
-
- The type of measurement that the sensor make when it is active.
-
- Can be one of :ref:`these constants <armaturesensor-type>`
-
- :type: integer.
-
- .. attribute:: constraint
-
- The constraint object this sensor is watching.
-
- :type: :class:`BL_ArmatureConstraint`
-
- .. attribute:: value
-
- The threshold used in the comparison with the constraint error
- The linear error is only updated on CopyPose/Distance IK constraint with iTaSC solver
- The rotation error is only updated on CopyPose+rotation IK constraint with iTaSC solver
- The linear error on CopyPose is always >= 0: it is the norm of the distance between the target and the bone
- The rotation error on CopyPose is always >= 0: it is the norm of the equivalent rotation vector between the bone and the target orientations
- The linear error on Distance can be positive if the distance between the bone and the target is greater than the desired distance, and negative if the distance is smaller.
-
- :type: float
-
-.. class:: BL_ArmatureConstraint(PyObjectPlus)
-
- Proxy to Armature Constraint. Allows to change constraint on the fly.
- Obtained through :class:`BL_ArmatureObject`.constraints.
-
- .. note::
-
- Not all armature constraints are supported in the GE.
-
- .. _armatureconstraint-constants-type:
-
- Constants related to :data:`type`
-
- .. data:: CONSTRAINT_TYPE_TRACKTO
- .. data:: CONSTRAINT_TYPE_KINEMATIC
- .. data:: CONSTRAINT_TYPE_ROTLIKE
- .. data:: CONSTRAINT_TYPE_LOCLIKE
- .. data:: CONSTRAINT_TYPE_MINMAX
- .. data:: CONSTRAINT_TYPE_SIZELIKE
- .. data:: CONSTRAINT_TYPE_LOCKTRACK
- .. data:: CONSTRAINT_TYPE_STRETCHTO
- .. data:: CONSTRAINT_TYPE_CLAMPTO
- .. data:: CONSTRAINT_TYPE_TRANSFORM
- .. data:: CONSTRAINT_TYPE_DISTLIMIT
-
- .. _armatureconstraint-constants-ik-type:
-
- Constants related to :data:`ik_type`
-
- .. data:: CONSTRAINT_IK_COPYPOSE
-
- constraint is trying to match the position and eventually the rotation of the target.
-
- :value: 0
-
- .. data:: CONSTRAINT_IK_DISTANCE
-
- Constraint is maintaining a certain distance to target subject to ik_mode
-
- :value: 1
-
- .. _armatureconstraint-constants-ik-flag:
-
- Constants related to :data:`ik_flag`
-
- .. data:: CONSTRAINT_IK_FLAG_TIP
-
- Set when the constraint operates on the head of the bone and not the tail
-
- :value: 1
-
- .. data:: CONSTRAINT_IK_FLAG_ROT
-
- Set when the constraint tries to match the orientation of the target
-
- :value: 2
-
- .. data:: CONSTRAINT_IK_FLAG_STRETCH
-
- Set when the armature is allowed to stretch (only the bones with stretch factor > 0.0)
-
- :value: 16
-
- .. data:: CONSTRAINT_IK_FLAG_POS
-
- Set when the constraint tries to match the position of the target.
-
- :value: 32
-
- .. _armatureconstraint-constants-ik-mode:
-
- Constants related to :data:`ik_mode`
-
- .. data:: CONSTRAINT_IK_MODE_INSIDE
-
- The constraint tries to keep the bone within ik_dist of target
-
- :value: 0
-
- .. data:: CONSTRAINT_IK_MODE_OUTSIDE
-
- The constraint tries to keep the bone outside ik_dist of the target
-
- :value: 1
-
- .. data:: CONSTRAINT_IK_MODE_ONSURFACE
-
- The constraint tries to keep the bone exactly at ik_dist of the target.
-
- :value: 2
-
- .. attribute:: type
-
- Type of constraint, (read-only).
-
- Use one of :ref:`these constants<armatureconstraint-constants-type>`.
-
- :type: integer, one of CONSTRAINT_TYPE_* constants
-
- .. attribute:: name
-
- Name of constraint constructed as <bone_name>:<constraint_name>. constraints list.
-
- :type: string
-
- This name is also the key subscript on :class:`BL_ArmatureObject`.
-
- .. attribute:: enforce
-
- fraction of constraint effect that is enforced. Between 0 and 1.
-
- :type: float
-
- .. attribute:: headtail
-
- Position of target between head and tail of the target bone: 0=head, 1=tail.
-
- :type: float.
-
- .. note::
-
- Only used if the target is a bone (i.e target object is an armature.
-
- .. attribute:: lin_error
-
- runtime linear error (in Blender units) on constraint at the current frame.
-
- This is a runtime value updated on each frame by the IK solver. Only available on IK constraint and iTaSC solver.
-
- :type: float
-
- .. attribute:: rot_error
-
- Runtime rotation error (in radiant) on constraint at the current frame.
-
- :type: float.
-
- This is a runtime value updated on each frame by the IK solver. Only available on IK constraint and iTaSC solver.
-
- It is only set if the constraint has a rotation part, for example, a CopyPose+Rotation IK constraint.
-
- .. attribute:: target
-
- Primary target object for the constraint. The position of this object in the GE will be used as target for the constraint.
-
- :type: :class:`KX_GameObject`.
-
- .. attribute:: subtarget
-
- Secondary target object for the constraint. The position of this object in the GE will be used as secondary target for the constraint.
-
- :type: :class:`KX_GameObject`.
-
- Currently this is only used for pole target on IK constraint.
-
- .. attribute:: active
-
- True if the constraint is active.
-
- :type: boolean
-
- .. note::
-
- An inactive constraint does not update lin_error and rot_error.
-
- .. attribute:: ik_weight
-
- Weight of the IK constraint between 0 and 1.
-
- Only defined for IK constraint.
-
- :type: float
-
- .. attribute:: ik_type
-
- Type of IK constraint, (read-only).
-
- Use one of :ref:`these constants<armatureconstraint-constants-ik-type>`.
-
- :type: integer.
-
- .. attribute:: ik_flag
-
- Combination of IK constraint option flags, read-only.
-
- Use one of :ref:`these constants<armatureconstraint-constants-ik-flag>`.
-
- :type: integer
-
- .. attribute:: ik_dist
-
- Distance the constraint is trying to maintain with target, only used when ik_type=CONSTRAINT_IK_DISTANCE.
-
- :type: float
-
- .. attribute:: ik_mode
-
- Use one of :ref:`these constants<armatureconstraint-constants-ik-mode>`.
-
- Additional mode for IK constraint. Currently only used for Distance constraint:
-
- :type: integer
-
-.. class:: BL_ArmatureChannel(PyObjectPlus)
-
- Proxy to armature pose channel. Allows to read and set armature pose.
- The attributes are identical to RNA attributes, but mostly in read-only mode.
-
- See :data:`rotation_mode`
-
- .. data:: PCHAN_ROT_QUAT
- .. data:: PCHAN_ROT_XYZ
- .. data:: PCHAN_ROT_XZY
- .. data:: PCHAN_ROT_YXZ
- .. data:: PCHAN_ROT_YZX
- .. data:: PCHAN_ROT_ZXY
- .. data:: PCHAN_ROT_ZYX
-
- .. attribute:: name
-
- channel name (=bone name), read-only.
-
- :type: string
-
- .. attribute:: bone
-
- return the bone object corresponding to this pose channel, read-only.
-
- :type: :class:`BL_ArmatureBone`
-
- .. attribute:: parent
-
- return the parent channel object, None if root channel, read-only.
-
- :type: :class:`BL_ArmatureChannel`
-
- .. attribute:: has_ik
-
- true if the bone is part of an active IK chain, read-only.
- This flag is not set when an IK constraint is defined but not enabled (miss target information for example).
-
- :type: boolean
-
- .. attribute:: ik_dof_x
-
- true if the bone is free to rotation in the X axis, read-only.
-
- :type: boolean
-
- .. attribute:: ik_dof_y
-
- true if the bone is free to rotation in the Y axis, read-only.
-
- :type: boolean
-
- .. attribute:: ik_dof_z
-
- true if the bone is free to rotation in the Z axis, read-only.
-
- :type: boolean
-
- .. attribute:: ik_limit_x
-
- true if a limit is imposed on X rotation, read-only.
-
- :type: boolean
-
- .. attribute:: ik_limit_y
-
- true if a limit is imposed on Y rotation, read-only.
-
- :type: boolean
-
- .. attribute:: ik_limit_z
-
- true if a limit is imposed on Z rotation, read-only.
-
- :type: boolean
-
- .. attribute:: ik_rot_control
-
- true if channel rotation should applied as IK constraint, read-only.
-
- :type: boolean
-
- .. attribute:: ik_lin_control
-
- true if channel size should applied as IK constraint, read-only.
-
- :type: boolean
-
- .. attribute:: location
-
- displacement of the bone head in armature local space, read-write.
-
- :type: vector [X, Y, Z].
-
- .. note::
-
- You can only move a bone if it is unconnected to its parent. An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation.
-
- .. note::
-
- Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`).
-
- .. attribute:: scale
-
- scale of the bone relative to its parent, read-write.
-
- :type: vector [sizeX, sizeY, sizeZ].
-
- .. note::
-
- An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation.
-
- .. note::
-
- Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`)
-
- .. attribute:: rotation_quaternion
-
- rotation of the bone relative to its parent expressed as a quaternion, read-write.
-
- :type: vector [qr, qi, qj, qk].
-
- .. note::
-
- This field is only used if rotation_mode is 0. An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation.
-
- .. note::
-
- Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`)
-
- .. attribute:: rotation_euler
-
- rotation of the bone relative to its parent expressed as a set of euler angles, read-write.
-
- :type: vector [X, Y, Z].
-
- .. note::
-
- This field is only used if rotation_mode is > 0. You must always pass the angles in [X, Y, Z] order; the order of applying the angles to the bone depends on rotation_mode. An action playing on the armature may change this field. An IK chain does not update this value, see joint_rotation.
-
- .. note::
-
- Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`)
-
- .. attribute:: rotation_mode
-
- Method of updating the bone rotation, read-write.
-
- :type: integer
-
- Use the following constants (euler mode are named as in Blender UI but the actual axis order is reversed).
-
- * PCHAN_ROT_QUAT(0) : use quaternioin in rotation attribute to update bone rotation
- * PCHAN_ROT_XYZ(1) : use euler_rotation and apply angles on bone's Z, Y, X axis successively
- * PCHAN_ROT_XZY(2) : use euler_rotation and apply angles on bone's Y, Z, X axis successively
- * PCHAN_ROT_YXZ(3) : use euler_rotation and apply angles on bone's Z, X, Y axis successively
- * PCHAN_ROT_YZX(4) : use euler_rotation and apply angles on bone's X, Z, Y axis successively
- * PCHAN_ROT_ZXY(5) : use euler_rotation and apply angles on bone's Y, X, Z axis successively
- * PCHAN_ROT_ZYX(6) : use euler_rotation and apply angles on bone's X, Y, Z axis successively
-
- .. attribute:: channel_matrix
-
- pose matrix in bone space (deformation of the bone due to action, constraint, etc), Read-only.
- This field is updated after the graphic render, it represents the current pose.
-
- :type: matrix [4][4]
-
- .. attribute:: pose_matrix
-
- pose matrix in armature space, read-only,
- This field is updated after the graphic render, it represents the current pose.
-
- :type: matrix [4][4]
-
- .. attribute:: pose_head
-
- position of bone head in armature space, read-only.
-
- :type: vector [x, y, z]
-
- .. attribute:: pose_tail
-
- position of bone tail in armature space, read-only.
-
- :type: vector [x, y, z]
-
- .. attribute:: ik_min_x
-
- minimum value of X rotation in degree (<= 0) when X rotation is limited (see ik_limit_x), read-only.
-
- :type: float
-
- .. attribute:: ik_max_x
-
- maximum value of X rotation in degree (>= 0) when X rotation is limited (see ik_limit_x), read-only.
-
- :type: float
-
- .. attribute:: ik_min_y
-
- minimum value of Y rotation in degree (<= 0) when Y rotation is limited (see ik_limit_y), read-only.
-
- :type: float
-
- .. attribute:: ik_max_y
-
- maximum value of Y rotation in degree (>= 0) when Y rotation is limited (see ik_limit_y), read-only.
-
- :type: float
-
- .. attribute:: ik_min_z
-
- minimum value of Z rotation in degree (<= 0) when Z rotation is limited (see ik_limit_z), read-only.
-
- :type: float
-
- .. attribute:: ik_max_z
-
- maximum value of Z rotation in degree (>= 0) when Z rotation is limited (see ik_limit_z), read-only.
-
- :type: float
-
- .. attribute:: ik_stiffness_x
-
- bone rotation stiffness in X axis, read-only.
-
- :type: float between 0 and 1
-
- .. attribute:: ik_stiffness_y
-
- bone rotation stiffness in Y axis, read-only.
-
- :type: float between 0 and 1
-
- .. attribute:: ik_stiffness_z
-
- bone rotation stiffness in Z axis, read-only.
-
- :type: float between 0 and 1
-
- .. attribute:: ik_stretch
-
- ratio of scale change that is allowed, 0=bone can't change size, read-only.
-
- :type: float
-
- .. attribute:: ik_rot_weight
-
- weight of rotation constraint when ik_rot_control is set, read-write.
-
- :type: float between 0 and 1
-
- .. attribute:: ik_lin_weight
-
- weight of size constraint when ik_lin_control is set, read-write.
-
- :type: float between 0 and 1
-
- .. attribute:: joint_rotation
-
- Control bone rotation in term of joint angle (for robotic applications), read-write.
-
- When writing to this attribute, you pass a [x, y, z] vector and an appropriate set of euler angles or quaternion is calculated according to the rotation_mode.
-
- When you read this attribute, the current pose matrix is converted into a [x, y, z] vector representing the joint angles.
-
- The value and the meaning of the x, y, z depends on the ik_dof_x/ik_dof_y/ik_dof_z attributes:
-
- * 1DoF joint X, Y or Z: the corresponding x, y, or z value is used an a joint angle in radiant
- * 2DoF joint X+Y or Z+Y: treated as 2 successive 1DoF joints: first X or Z, then Y. The x or z value is used as a joint angle in radiant along the X or Z axis, followed by a rotation along the new Y axis of y radiants.
- * 2DoF joint X+Z: treated as a 2DoF joint with rotation axis on the X/Z plane. The x and z values are used as the coordinates of the rotation vector in the X/Z plane.
- * 3DoF joint X+Y+Z: treated as a revolute joint. The [x, y, z] vector represents the equivalent rotation vector to bring the joint from the rest pose to the new pose.
-
- :type: vector [x, y, z]
-
- .. note::
-
- The bone must be part of an IK chain if you want to set the ik_dof_x/ik_dof_y/ik_dof_z attributes via the UI, but this will interfere with this attribute since the IK solver will overwrite the pose. You can stay in control of the armature if you create an IK constraint but do not finalize it (e.g. don't set a target) the IK solver will not run but the IK panel will show up on the UI for each bone in the chain.
-
- .. note::
-
- [0, 0, 0] always corresponds to the rest pose.
-
- .. note::
-
- You must request the armature pose to update and wait for the next graphic frame to see the effect of setting this attribute (see :data:`BL_ArmatureObject.update`).
-
- .. note::
-
- You can read the result of the calculation in rotation or euler_rotation attributes after setting this attribute.
-
-.. class:: BL_ArmatureBone(PyObjectPlus)
-
- Proxy to Blender bone structure. All fields are read-only and comply to RNA names.
- All space attribute correspond to the rest pose.
-
- .. attribute:: name
-
- bone name.
-
- :type: string
-
- .. attribute:: connected
-
- true when the bone head is struck to the parent's tail.
-
- :type: boolean
-
- .. attribute:: hinge
-
- true when bone doesn't inherit rotation or scale from parent bone.
-
- :type: boolean
-
- .. attribute:: inherit_scale
-
- true when bone inherits scaling from parent bone.
-
- :type: boolean
-
- .. attribute:: bbone_segments
-
- number of B-bone segments.
-
- :type: integer
-
- .. attribute:: roll
-
- bone rotation around head-tail axis.
-
- :type: float
-
- .. attribute:: head
-
- location of head end of the bone in parent bone space.
-
- :type: vector [x, y, z]
-
- .. attribute:: tail
-
- location of head end of the bone in parent bone space.
-
- :type: vector [x, y, z]
-
- .. attribute:: length
-
- bone length.
-
- :type: float
-
- .. attribute:: arm_head
-
- location of head end of the bone in armature space.
-
- :type: vector [x, y, z]
-
- .. attribute:: arm_tail
-
- location of tail end of the bone in armature space.
-
- :type: vector [x, y, z]
-
- .. attribute:: arm_mat
-
- matrix of the bone head in armature space.
-
- :type: matrix [4][4]
-
- .. note::
-
- This matrix has no scale part.
-
- .. attribute:: bone_mat
-
- rotation matrix of the bone in parent bone space.
-
- :type: matrix [3][3]
-
- .. attribute:: parent
-
- parent bone, or None for root bone.
-
- :type: :class:`BL_ArmatureBone`
-
- .. attribute:: children
-
- list of bone's children.
-
- :type: list of :class:`BL_ArmatureBone`
diff --git a/source/gameengine/Rasterizer/CMakeLists.txt b/source/gameengine/Rasterizer/CMakeLists.txt
index d718bf3e507..d899fc38162 100644
--- a/source/gameengine/Rasterizer/CMakeLists.txt
+++ b/source/gameengine/Rasterizer/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../source/kernel/gen_system
../../../source/blender/makesdna
@@ -37,9 +35,50 @@ SET(INC
../../../extern/glew/include
../../../intern/guardedalloc
../Expressions
- ${PYTHON_INC}
+ ${PYTHON_INCLUDE_DIRS}
+)
+
+set(SRC
+ RAS_2DFilterManager.cpp
+ RAS_BucketManager.cpp
+ RAS_FramingManager.cpp
+ RAS_IPolygonMaterial.cpp
+ RAS_IRenderTools.cpp
+ RAS_MaterialBucket.cpp
+ RAS_MeshObject.cpp
+ RAS_Polygon.cpp
+ RAS_TexVert.cpp
+ RAS_texmatrix.cpp
+
+ RAS_2DFilterManager.h
+ RAS_BucketManager.h
+ RAS_CameraData.h
+ RAS_Deformer.h
+ RAS_FramingManager.h
+ RAS_ICanvas.h
+ RAS_IPolygonMaterial.h
+ RAS_IRasterizer.h
+ RAS_IRenderTools.h
+ RAS_LightObject.h
+ RAS_MaterialBucket.h
+ RAS_MeshObject.h
+ RAS_ObjectColor.h
+ RAS_Polygon.h
+ RAS_Rect.h
+ RAS_TexMatrix.h
+ RAS_TexVert.h
+ RAS_OpenGLFilters/RAS_Blur2DFilter.h
+ RAS_OpenGLFilters/RAS_Dilation2DFilter.h
+ RAS_OpenGLFilters/RAS_Erosion2DFilter.h
+ RAS_OpenGLFilters/RAS_GrayScale2DFilter.h
+ RAS_OpenGLFilters/RAS_Invert2DFilter.h
+ RAS_OpenGLFilters/RAS_Laplacian2DFilter.h
+ RAS_OpenGLFilters/RAS_Prewitt2DFilter.h
+ RAS_OpenGLFilters/RAS_Sepia2DFilter.h
+ RAS_OpenGLFilters/RAS_Sharpen2DFilter.h
+ RAS_OpenGLFilters/RAS_Sobel2DFilter.h
)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+add_definitions(-DGLEW_STATIC)
-BLENDERLIB(bf_rasterizer "${SRC}" "${INC}")
+blender_add_lib(ge_rasterizer "${SRC}" "${INC}")
diff --git a/source/gameengine/Rasterizer/Makefile b/source/gameengine/Rasterizer/Makefile
deleted file mode 100644
index d800a02b181..00000000000
--- a/source/gameengine/Rasterizer/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = rasterizer
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../kernel/gen_system
-CPPFLAGS += -I../../blender/makesdna
-CPPFLAGS += -I../SceneGraph
-CPPFLAGS += -I../BlenderRoutines
-CPPFLAGS += -I../Expressions
-CPPFLAGS += -I../Ketsji
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-###############
-
-SOURCEDIR = source/gameengine/Rasterizer
-DIRS = RAS_OpenGLRasterizer
-
-include nan_subdirs.mk
diff --git a/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp b/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp
index 4527850a8e9..93d82702e90 100644
--- a/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp
+++ b/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp
@@ -431,6 +431,8 @@ void RAS_2DFilterManager::RenderFilters(RAS_ICanvas* canvas)
glViewport(0,0, texturewidth, textureheight);
glDisable(GL_DEPTH_TEST);
+ // if the last rendered face had alpha add it would messes with the color of the plane we apply 2DFilter to
+ glDisable(GL_BLEND);
glPushMatrix(); //GL_MODELVIEW
glLoadIdentity(); // GL_MODELVIEW
glMatrixMode(GL_TEXTURE);
@@ -510,11 +512,11 @@ void RAS_2DFilterManager::EnableFilter(vector<STR_String>& propNames, void* game
return;
}
- if(mode>=RAS_2DFILTER_MOTIONBLUR && mode<=RAS_2DFILTER_INVERT)
- {
- if(m_filters[pass])
- glDeleteObjectARB(m_filters[pass]);
- m_filters[pass] = CreateShaderProgram(mode);
- m_enabled[pass] = 1;
- }
+ // We've checked all other cases, which means we must be dealing with a builtin filter
+ if(m_filters[pass])
+ glDeleteObjectARB(m_filters[pass]);
+ m_filters[pass] = CreateShaderProgram(mode);
+ m_gameObjects[pass] = NULL;
+ AnalyseShader(pass, propNames);
+ m_enabled[pass] = 1;
}
diff --git a/source/gameengine/Rasterizer/RAS_Deformer.h b/source/gameengine/Rasterizer/RAS_Deformer.h
index f61ac7ea18a..37543092e68 100644
--- a/source/gameengine/Rasterizer/RAS_Deformer.h
+++ b/source/gameengine/Rasterizer/RAS_Deformer.h
@@ -76,6 +76,10 @@ public:
{
return NULL;
}
+ virtual struct DerivedMesh* GetPhysicsMesh()
+ {
+ return NULL;
+ }
virtual class RAS_MeshObject* GetRasMesh()
{
/* m_pMesh does not seem to be being used?? */
diff --git a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
index 0c81d7d8274..00f1f5f2848 100644
--- a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
+++ b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
@@ -208,6 +208,11 @@ Material *RAS_IPolyMaterial::GetBlenderMaterial() const
return NULL;
}
+Image *RAS_IPolyMaterial::GetBlenderImage() const
+{
+ return NULL;
+}
+
Scene* RAS_IPolyMaterial::GetBlenderScene() const
{
return NULL;
diff --git a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
index e7bd78c2309..59554e31c36 100644
--- a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
+++ b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
@@ -45,6 +45,7 @@
class RAS_IRasterizer;
struct MTFace;
struct Material;
+struct Image;
struct Scene;
class SCA_IScene;
@@ -160,6 +161,7 @@ public:
int GetMaterialIndex() const;
virtual Material* GetBlenderMaterial() const;
+ virtual Image* GetBlenderImage() const;
virtual Scene* GetBlenderScene() const;
virtual void ReleaseMaterial();
virtual void GetMaterialRGBAColor(unsigned char *rgba) const;
diff --git a/source/gameengine/Rasterizer/RAS_IRasterizer.h b/source/gameengine/Rasterizer/RAS_IRasterizer.h
index 32ba28bc395..4d23054c449 100644
--- a/source/gameengine/Rasterizer/RAS_IRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_IRasterizer.h
@@ -387,7 +387,7 @@ public:
virtual void DrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color)=0;
virtual void DrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color,
- const MT_Vector3& normal, int nsector)=0;
+ const MT_Vector3& normal, int nsector)=0;
virtual void FlushDebugShapes()=0;
diff --git a/source/gameengine/Rasterizer/RAS_IRenderTools.h b/source/gameengine/Rasterizer/RAS_IRenderTools.h
index 50de4980e1d..dab28de27f4 100644
--- a/source/gameengine/Rasterizer/RAS_IRenderTools.h
+++ b/source/gameengine/Rasterizer/RAS_IRenderTools.h
@@ -99,6 +99,28 @@ public:
)=0;
/**
+ * Renders 3D text string using BFL.
+ * @param fontid The id of the font.
+ * @param text The string to render.
+ * @param size The size of the text.
+ * @param dpi The resolution of the text.
+ * @param color The color of the object.
+ * @param mat The Matrix of the text object.
+ * @param aspect A scaling factor to compensate for the size.
+ */
+ virtual
+ void
+ RenderText3D(int fontid,
+ const char* text,
+ int size,
+ int dpi,
+ float* color,
+ double* mat,
+ float aspect
+ ) = 0;
+
+
+ /**
* Renders 2D text string.
* @param mode The type of text
* @param text The string to render.
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
index cc48952dc20..d47f19eda90 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
../../../../source/kernel/gen_system
../../../../intern/string
../../../../intern/moto/include
@@ -41,6 +39,18 @@ SET(INC
../../../../source/blender/blenloader
)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+set(SRC
+ RAS_GLExtensionManager.cpp
+ RAS_ListRasterizer.cpp
+ RAS_OpenGLRasterizer.cpp
+ RAS_VAOpenGLRasterizer.cpp
+
+ RAS_GLExtensionManager.h
+ RAS_ListRasterizer.h
+ RAS_OpenGLRasterizer.h
+ RAS_VAOpenGLRasterizer.h
+)
+
+add_definitions(-DGLEW_STATIC)
-BLENDERLIB(bf_oglrasterizer "${SRC}" "${INC}")
+blender_add_lib(ge_oglrasterizer "${SRC}" "${INC}")
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile
deleted file mode 100644
index 357bdf9d99b..00000000000
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounce make to subdirectories.
-#
-
-LIBNAME = OpenGLrasterizer
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I../../../kernel/gen_system
-CPPFLAGS += -I../../../blender/gpu
-CPPFLAGS += -I../../../blender/makesdna
-CPPFLAGS += -I../../../blender/blenlib
-CPPFLAGS += -I../../../blender/blenkernel
-CPPFLAGS += -I../../BlenderRoutines
-CPPFLAGS += -I../../Ketsji
-CPPFLAGS += -I../../SceneGraph
-CPPFLAGS += -I..
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
index 12a255b4e4e..d793a2faf7b 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
@@ -13,7 +13,7 @@
#include "RAS_TexVert.h"
#include "MT_assert.h"
-//#ifndef NDEBUG
+//#if defined(DEBUG)
//#ifdef WIN32
//#define spit(x) std::cout << x << std::endl;
//#endif //WIN32
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
index bedddb748fe..b567d8d8e2c 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
@@ -382,7 +382,7 @@ void RAS_OpenGLRasterizer::FlushDebugShapes()
continue;
glBegin(GL_LINE_LOOP);
glColor4f(m_debugShapes[i].m_color[0],m_debugShapes[i].m_color[1],m_debugShapes[i].m_color[2],1.f);
-
+
static const MT_Vector3 worldUp(0.,0.,1.);
MT_Vector3 norm = m_debugShapes[i].m_param;
MT_Matrix3x3 tr;
@@ -396,8 +396,8 @@ void RAS_OpenGLRasterizer::FlushDebugShapes()
xaxis = MT_cross(norm, worldUp);
yaxis = MT_cross(xaxis, norm);
tr.setValue(xaxis.x(), xaxis.y(), xaxis.z(),
- yaxis.x(), yaxis.y(), yaxis.z(),
- norm.x(), norm.y(), norm.z());
+ yaxis.x(), yaxis.y(), yaxis.z(),
+ norm.x(), norm.y(), norm.z());
}
MT_Scalar rad = m_debugShapes[i].m_param2.x();
int n = (int) m_debugShapes[i].m_param2.y();
@@ -413,40 +413,14 @@ void RAS_OpenGLRasterizer::FlushDebugShapes()
glEnd();
}
-
if(light) glEnable(GL_LIGHTING);
if(tex) glEnable(GL_TEXTURE_2D);
m_debugShapes.clear();
}
-void RAS_OpenGLRasterizer::DrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color)
-{
- OglDebugShape line;
- line.m_type = OglDebugShape::LINE;
- line.m_pos= from;
- line.m_param = to;
- line.m_color = color;
- m_debugShapes.push_back(line);
-}
-
-void RAS_OpenGLRasterizer::DrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color,
- const MT_Vector3& normal, int nsector)
-{
- OglDebugShape line;
- line.m_type = OglDebugShape::CIRCLE;
- line.m_pos= center;
- line.m_param = normal;
- line.m_color = color;
- line.m_param2.x() = radius;
- line.m_param2.y() = (float) nsector;
- m_debugShapes.push_back(line);
-}
-
void RAS_OpenGLRasterizer::EndFrame()
{
-
-
FlushDebugShapes();
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
@@ -799,6 +773,7 @@ static RAS_MeshSlot *current_ms;
static RAS_MeshObject *current_mesh;
static int current_blmat_nr;
static GPUVertexAttribs current_gpu_attribs;
+static Image *current_image;
static int CheckMaterialDM(int matnr, void *attribs)
{
// only draw the current material
@@ -809,6 +784,8 @@ static int CheckMaterialDM(int matnr, void *attribs)
memcpy(gattribs, &current_gpu_attribs, sizeof(GPUVertexAttribs));
return 1;
}
+
+/*
static int CheckTexfaceDM(void *mcol, int index)
{
@@ -836,6 +813,34 @@ static int CheckTexfaceDM(void *mcol, int index)
}
return 0;
}
+*/
+
+static int CheckTexDM(MTFace *tface, MCol *mcol, int matnr)
+{
+
+ // index is the original face index, retrieve the polygon
+ if (matnr == current_blmat_nr &&
+ (tface == NULL || tface->tpage == current_image)) {
+ // must handle color.
+ if (current_wireframe)
+ return 2;
+ if (current_ms->m_bObjectColor) {
+ MT_Vector4& rgba = current_ms->m_RGBAcolor;
+ glColor4d(rgba[0], rgba[1], rgba[2], rgba[3]);
+ // don't use mcol
+ return 2;
+ }
+ if (!mcol) {
+ // we have to set the color from the material
+ unsigned char rgba[4];
+ current_polymat->GetMaterialRGBAColor(rgba);
+ glColor4ubv((const GLubyte *)rgba);
+ return 2;
+ }
+ return 1;
+ }
+ return 0;
+}
void RAS_OpenGLRasterizer::IndexPrimitivesInternal(RAS_MeshSlot& ms, bool multi)
{
@@ -851,7 +856,14 @@ void RAS_OpenGLRasterizer::IndexPrimitivesInternal(RAS_MeshSlot& ms, bool multi)
current_ms = &ms;
current_mesh = ms.m_mesh;
current_wireframe = wireframe;
- MCol *mcol = (MCol*)ms.m_pDerivedMesh->getFaceDataArray(ms.m_pDerivedMesh, CD_MCOL);
+ // MCol *mcol = (MCol*)ms.m_pDerivedMesh->getFaceDataArray(ms.m_pDerivedMesh, CD_MCOL); /* UNUSED */
+
+ // handle two-side
+ if (current_polymat->GetDrawingMode() & RAS_IRasterizer::KX_TWOSIDE)
+ this->SetCullFace(false);
+ else
+ this->SetCullFace(true);
+
if (current_polymat->GetFlag() & RAS_BLENDERGLSL) {
// GetMaterialIndex return the original mface material index,
// increment by 1 to match what derived mesh is doing
@@ -868,7 +880,10 @@ void RAS_OpenGLRasterizer::IndexPrimitivesInternal(RAS_MeshSlot& ms, bool multi)
ms.m_pDerivedMesh->drawFacesGLSL(ms.m_pDerivedMesh, CheckMaterialDM);
GPU_set_material_blend_mode(current_blend_mode);
} else {
- ms.m_pDerivedMesh->drawMappedFacesTex(ms.m_pDerivedMesh, CheckTexfaceDM, mcol);
+ //ms.m_pDerivedMesh->drawMappedFacesTex(ms.m_pDerivedMesh, CheckTexfaceDM, mcol);
+ current_blmat_nr = current_polymat->GetMaterialIndex();
+ current_image = current_polymat->GetBlenderImage();
+ ms.m_pDerivedMesh->drawFacesTex(ms.m_pDerivedMesh, CheckTexDM);
}
return;
}
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
index e531264eaec..21f86d12cb4 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
@@ -255,10 +255,29 @@ public:
virtual void SetPolygonOffset(float mult, float add);
virtual void FlushDebugShapes();
- virtual void DrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color);
- virtual void DrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color,
- const MT_Vector3& normal, int nsector);
+ virtual void DrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color)
+ {
+ OglDebugShape line;
+ line.m_type = OglDebugShape::LINE;
+ line.m_pos= from;
+ line.m_param = to;
+ line.m_color = color;
+ m_debugShapes.push_back(line);
+ }
+
+ virtual void DrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color,
+ const MT_Vector3& normal, int nsector)
+ {
+ OglDebugShape line;
+ line.m_type = OglDebugShape::CIRCLE;
+ line.m_pos= center;
+ line.m_param = normal;
+ line.m_color = color;
+ line.m_param2.x() = radius;
+ line.m_param2.y() = (float) nsector;
+ m_debugShapes.push_back(line);
+ }
std::vector <OglDebugShape> m_debugShapes;
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript
index 68e6789c05e..890d1efb850 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript
@@ -10,4 +10,11 @@ incs += ' #source/blender/gpu #extern/glew/include ' + env['BF_OPENGL_INC']
incs += ' #source/blender/gameengine/Ketsji #source/gameengine/SceneGraph #source/blender/makesdna #source/blender/blenkernel'
incs += ' #intern/guardedalloc #source/blender/blenlib'
-env.BlenderLib ( 'bf_oglrasterizer', Split(sources), Split(incs), defines = defs, libtype=['core','player'], priority=[350,75], cxx_compileflags=env['BGE_CXXFLAGS'])
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+
+if env['WITH_BF_PYTHON']:
+ incs += ' ' + env['BF_PYTHON_INC']
+ defs.append('WITH_PYTHON')
+
+env.BlenderLib ( 'ge_oglrasterizer', Split(sources), Split(incs), defines = defs, libtype=['core','player'], priority=[350,75], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/Rasterizer/SConscript b/source/gameengine/Rasterizer/SConscript
index a78a0289d98..bff2a7e2084 100644
--- a/source/gameengine/Rasterizer/SConscript
+++ b/source/gameengine/Rasterizer/SConscript
@@ -10,7 +10,9 @@ defs = [ 'GLEW_STATIC' ]
if env['WITH_BF_PYTHON']:
incs += ' ' + env['BF_PYTHON_INC']
-else:
- defs.append('DISABLE_PYTHON')
+ defs.append('WITH_PYTHON')
-env.BlenderLib ( 'bf_rasterizer', sources, Split(incs), defs, libtype=['core','player'], priority=[350,70], cxx_compileflags=env['BGE_CXXFLAGS'])
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+
+env.BlenderLib ( 'ge_rasterizer', sources, Split(incs), defs, libtype=['core','player'], priority=[350,70], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/SConscript b/source/gameengine/SConscript
index e7c9328688f..aebbf4d9fcf 100644
--- a/source/gameengine/SConscript
+++ b/source/gameengine/SConscript
@@ -14,7 +14,6 @@ SConscript(['BlenderRoutines/SConscript',
'Rasterizer/SConscript',
'Rasterizer/RAS_OpenGLRasterizer/SConscript',
'SceneGraph/SConscript',
- 'Physics/Bullet/SConscript'
])
if env['WITH_BF_PYTHON']:
@@ -22,3 +21,6 @@ if env['WITH_BF_PYTHON']:
if env['WITH_BF_PLAYER']:
SConscript(['GamePlayer/SConscript'])
+
+if env['WITH_BF_BULLET']:
+ SConscript(['Physics/Bullet/SConscript'])
diff --git a/source/gameengine/SceneGraph/CMakeLists.txt b/source/gameengine/SceneGraph/CMakeLists.txt
index a73130531c0..a054252ea0b 100644
--- a/source/gameengine/SceneGraph/CMakeLists.txt
+++ b/source/gameengine/SceneGraph/CMakeLists.txt
@@ -24,11 +24,28 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../intern/moto/include
)
-BLENDERLIB(bf_scenegraph "${SRC}" "${INC}")
+set(SRC
+ SG_BBox.cpp
+ SG_Controller.cpp
+ SG_IObject.cpp
+ SG_Node.cpp
+ SG_Spatial.cpp
+ SG_Tree.cpp
+
+ SG_BBox.h
+ SG_Controller.h
+ SG_DList.h
+ SG_IObject.h
+ SG_Node.h
+ SG_ParentRelation.h
+ SG_QList.h
+ SG_Spatial.h
+ SG_Tree.h
+)
+
+blender_add_lib(ge_scenegraph "${SRC}" "${INC}")
diff --git a/source/gameengine/SceneGraph/Makefile b/source/gameengine/SceneGraph/Makefile
deleted file mode 100644
index 8a797ae5a0e..00000000000
--- a/source/gameengine/SceneGraph/Makefile
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = scenegraph
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_MOTO)/include
diff --git a/source/gameengine/SceneGraph/SConscript b/source/gameengine/SceneGraph/SConscript
index 2a33cd67b5e..9270169199e 100644
--- a/source/gameengine/SceneGraph/SConscript
+++ b/source/gameengine/SceneGraph/SConscript
@@ -6,4 +6,14 @@ sources = env.Glob('*.cpp')
incs = '. #intern/moto/include'
-env.BlenderLib ( 'bf_scenegraph', sources, Split(incs), [], libtype=['core','player'], priority=[325,85], cxx_compileflags=env['BGE_CXXFLAGS'])
+defs = []
+
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+ incs += ' #intern/guardedalloc'
+
+if env['WITH_BF_PYTHON']:
+ incs += ' ' + env['BF_PYTHON_INC']
+ defs.append('WITH_PYTHON')
+
+env.BlenderLib ( 'ge_scenegraph', sources, Split(incs), defs, libtype=['core','player'], priority=[325,85], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/VideoTexture/CMakeLists.txt b/source/gameengine/VideoTexture/CMakeLists.txt
index 34a32328e29..acab8de8d38 100644
--- a/source/gameengine/VideoTexture/CMakeLists.txt
+++ b/source/gameengine/VideoTexture/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../source/gameengine/Ketsji
../../../source/gameengine/Expressions
@@ -35,7 +33,6 @@ SET(INC
../../../source/gameengine/Rasterizer
../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
../../../source/gameengine/BlenderRoutines
- ../../../source/blender/include
../../../source/blender/blenlib
../../../source/blender/blenkernel
../../../source/blender/makesdna
@@ -51,16 +48,47 @@ SET(INC
../../../extern/glew/include
)
-IF(WITH_FFMPEG)
- SET(INC ${INC} ${FFMPEG_INC} ${PTHREADS_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
- ADD_DEFINITIONS(-D__STDC_CONSTANT_MACROS)
-ENDIF(WITH_FFMPEG)
+set(SRC
+ Exception.cpp
+ FilterBase.cpp
+ FilterBlueScreen.cpp
+ FilterColor.cpp
+ FilterNormal.cpp
+ FilterSource.cpp
+ ImageBase.cpp
+ ImageBuff.cpp
+ ImageMix.cpp
+ ImageRender.cpp
+ ImageViewport.cpp
+ PyTypeList.cpp
+ Texture.cpp
+ VideoBase.cpp
+ VideoFFmpeg.cpp
+ blendVideoTex.cpp
+
+ BlendType.h
+ Common.h
+ Exception.h
+ FilterBase.h
+ FilterBlueScreen.h
+ FilterColor.h
+ FilterNormal.h
+ FilterSource.h
+ ImageBase.h
+ ImageBuff.h
+ ImageMix.h
+ ImageRender.h
+ ImageViewport.h
+ PyTypeList.h
+ Texture.h
+ VideoBase.h
+ VideoFFmpeg.h
+)
-IF(WITH_PYTHON)
- LIST(APPEND INC ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_CODEC_FFMPEG)
+ set(INC ${INC} ${FFMPEG_INC} ${PTHREADS_INC})
+ add_definitions(-DWITH_FFMPEG)
+ add_definitions(-D__STDC_CONSTANT_MACROS)
+endif()
-BLENDERLIB(bf_videotex "${SRC}" "${INC}")
+blender_add_lib(ge_videotex "${SRC}" "${INC}")
diff --git a/source/gameengine/VideoTexture/FilterBlueScreen.cpp b/source/gameengine/VideoTexture/FilterBlueScreen.cpp
index 2a624b2ccaa..73b104d4585 100644
--- a/source/gameengine/VideoTexture/FilterBlueScreen.cpp
+++ b/source/gameengine/VideoTexture/FilterBlueScreen.cpp
@@ -80,7 +80,7 @@ static PyObject * getColor (PyFilter * self, void * closure)
static int setColor (PyFilter * self, PyObject * value, void * closure)
{
// check validity of parameter
- if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 3
+ if (value == NULL || !PySequence_Check(value) || PySequence_Size(value) != 3
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 0))
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 1))
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 2)))
@@ -107,7 +107,7 @@ static PyObject * getLimits (PyFilter * self, void * closure)
static int setLimits (PyFilter * self, PyObject * value, void * closure)
{
// check validity of parameter
- if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 2
+ if (value == NULL || !PySequence_Check(value) || PySequence_Size(value) != 2
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 0))
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 1)))
{
diff --git a/source/gameengine/VideoTexture/FilterBlueScreen.h b/source/gameengine/VideoTexture/FilterBlueScreen.h
index 820e4a44501..78728d291d8 100644
--- a/source/gameengine/VideoTexture/FilterBlueScreen.h
+++ b/source/gameengine/VideoTexture/FilterBlueScreen.h
@@ -75,7 +75,7 @@ protected:
VT_A(val) = 0;
// condition for fully opaque color
else if (m_squareLimits[1] <= dist)
- // return normal colour
+ // return normal color
VT_A(val) = 0xFF;
// otherwise calc alpha
else
diff --git a/source/gameengine/VideoTexture/FilterColor.cpp b/source/gameengine/VideoTexture/FilterColor.cpp
index e5d479747c4..7bbbc86e35f 100644
--- a/source/gameengine/VideoTexture/FilterColor.cpp
+++ b/source/gameengine/VideoTexture/FilterColor.cpp
@@ -129,14 +129,14 @@ static int setMatrix (PyFilter * self, PyObject * value, void * closure)
ColorMatrix mat;
// check validity of parameter
bool valid = value != NULL && PySequence_Check(value)
- && PySequence_Length(value) == 4;
+ && PySequence_Size(value) == 4;
// check rows
for (int r = 0; valid && r < 4; ++r)
{
// get row object
PyObject * row = PySequence_Fast_GET_ITEM(value, r);
// check sequence
- valid = PySequence_Check(row) && PySequence_Length(row) == 5;
+ valid = PySequence_Check(row) && PySequence_Size(row) == 5;
// check items
for (int c = 0; valid && c < 5; ++c)
{
@@ -262,14 +262,14 @@ static int setLevels (PyFilter * self, PyObject * value, void * closure)
ColorLevel lev;
// check validity of parameter
bool valid = value != NULL && PySequence_Check(value)
- && PySequence_Length(value) == 4;
+ && PySequence_Size(value) == 4;
// check rows
for (int r = 0; valid && r < 4; ++r)
{
// get row object
PyObject * row = PySequence_Fast_GET_ITEM(value, r);
// check sequence
- valid = PySequence_Check(row) && PySequence_Length(row) == 2;
+ valid = PySequence_Check(row) && PySequence_Size(row) == 2;
// check items
for (int c = 0; valid && c < 2; ++c)
{
diff --git a/source/gameengine/VideoTexture/ImageBase.cpp b/source/gameengine/VideoTexture/ImageBase.cpp
index 88a20fadcf7..bbeebfb590f 100644
--- a/source/gameengine/VideoTexture/ImageBase.cpp
+++ b/source/gameengine/VideoTexture/ImageBase.cpp
@@ -56,7 +56,8 @@ m_staticSources(staticSrc), m_pyfilter(NULL)
ImageBase::~ImageBase (void)
{
// release image
- delete [] m_image;
+ if (m_image)
+ delete [] m_image;
}
@@ -198,7 +199,8 @@ void ImageBase::init (short width, short height)
// set new buffer size
m_imgSize = newSize;
// release previous and create new buffer
- delete [] m_image;
+ if (m_image)
+ delete [] m_image;
m_image = new unsigned int[m_imgSize];
}
// new image size
diff --git a/source/gameengine/VideoTexture/ImageBuff.cpp b/source/gameengine/VideoTexture/ImageBuff.cpp
index 926468c662e..b8a67ccfc40 100644
--- a/source/gameengine/VideoTexture/ImageBuff.cpp
+++ b/source/gameengine/VideoTexture/ImageBuff.cpp
@@ -147,10 +147,10 @@ void ImageBuff::plot (unsigned char * img, short width, short height, short x, s
if (!m_imbuf) {
// allocate most basic imbuf, we will assign the rect buffer on the fly
- m_imbuf = IMB_allocImBuf(m_size[0], m_size[1], 0, 0, 0);
+ m_imbuf = IMB_allocImBuf(m_size[0], m_size[1], 0, 0);
}
- tmpbuf = IMB_allocImBuf(width, height, 0, 0, 0);
+ tmpbuf = IMB_allocImBuf(width, height, 0, 0);
// assign temporarily our buffer to the ImBuf buffer, we use the same format
tmpbuf->rect = (unsigned int*)img;
@@ -169,11 +169,11 @@ void ImageBuff::plot (ImageBuff* img, short x, short y, short mode)
if (!m_imbuf) {
// allocate most basic imbuf, we will assign the rect buffer on the fly
- m_imbuf = IMB_allocImBuf(m_size[0], m_size[1], 0, 0, 0);
+ m_imbuf = IMB_allocImBuf(m_size[0], m_size[1], 0, 0);
}
if (!img->m_imbuf) {
// allocate most basic imbuf, we will assign the rect buffer on the fly
- img->m_imbuf = IMB_allocImBuf(img->m_size[0], img->m_size[1], 0, 0, 0);
+ img->m_imbuf = IMB_allocImBuf(img->m_size[0], img->m_size[1], 0, 0);
}
// assign temporarily our buffer to the ImBuf buffer, we use the same format
img->m_imbuf->rect = img->m_image;
diff --git a/source/gameengine/VideoTexture/ImageRender.cpp b/source/gameengine/VideoTexture/ImageRender.cpp
index 7580563a74f..2325329d55b 100644
--- a/source/gameengine/VideoTexture/ImageRender.cpp
+++ b/source/gameengine/VideoTexture/ImageRender.cpp
@@ -64,7 +64,7 @@ ImageRender::ImageRender (KX_Scene * scene, KX_Camera * camera) :
m_mirror(NULL),
m_clip(100.f)
{
- // initialize background colour
+ // initialize background color
setBackground(0, 0, 255, 255);
// retrieve rendering objects
m_engine = KX_GetActiveEngine();
@@ -181,7 +181,9 @@ void ImageRender::Render()
frustrum.camnear = -mirrorOffset[2];
frustrum.camfar = -mirrorOffset[2]+m_clip;
}
+ // Store settings to be restored later
const RAS_IRasterizer::StereoMode stereomode = m_rasterizer->GetStereoMode();
+ RAS_Rect area = m_canvas->GetWindowArea();
// The screen area that ImageViewport will copy is also the rendering zone
m_canvas->SetViewPort(m_position[0], m_position[1], m_position[0]+m_capSize[0]-1, m_position[1]+m_capSize[1]-1);
@@ -258,6 +260,9 @@ void ImageRender::Render()
m_scene->CalculateVisibleMeshes(m_rasterizer,m_camera);
m_scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
+
+ // restore the canvas area now that the render is completed
+ m_canvas->GetWindowArea() = area;
}
@@ -331,7 +336,7 @@ PyObject * getBackground (PyImage * self, void * closure)
static int setBackground (PyImage * self, PyObject * value, void * closure)
{
// check validity of parameter
- if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 4
+ if (value == NULL || !PySequence_Check(value) || PySequence_Size(value) != 4
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 0))
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 1))
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 2))
diff --git a/source/gameengine/VideoTexture/ImageRender.h b/source/gameengine/VideoTexture/ImageRender.h
index d49544ce42a..7861a2df79a 100644
--- a/source/gameengine/VideoTexture/ImageRender.h
+++ b/source/gameengine/VideoTexture/ImageRender.h
@@ -85,7 +85,7 @@ protected:
/// engine
KX_KetsjiEngine* m_engine;
- /// background colour
+ /// background color
float m_background[4];
diff --git a/source/gameengine/VideoTexture/ImageViewport.cpp b/source/gameengine/VideoTexture/ImageViewport.cpp
index 5a4e8af1b0c..50f5244138a 100644
--- a/source/gameengine/VideoTexture/ImageViewport.cpp
+++ b/source/gameengine/VideoTexture/ImageViewport.cpp
@@ -225,7 +225,7 @@ static PyObject * ImageViewport_getPosition (PyImage * self, void * closure)
static int ImageViewport_setPosition (PyImage * self, PyObject * value, void * closure)
{
// check validity of parameter
- if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 2
+ if (value == NULL || !PySequence_Check(value) || PySequence_Size(value) != 2
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 0))
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 1)))
{
@@ -253,7 +253,7 @@ PyObject * ImageViewport_getCaptureSize (PyImage * self, void * closure)
int ImageViewport_setCaptureSize (PyImage * self, PyObject * value, void * closure)
{
// check validity of parameter
- if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 2
+ if (value == NULL || !PySequence_Check(value) || PySequence_Size(value) != 2
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 0))
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 1)))
{
diff --git a/source/gameengine/VideoTexture/Makefile b/source/gameengine/VideoTexture/Makefile
deleted file mode 100644
index af3417eef02..00000000000
--- a/source/gameengine/VideoTexture/Makefile
+++ /dev/null
@@ -1,68 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = videotex
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-SOURCEDIR = source/gameengine/VideoTexture
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += $(OGL_CPPFLAGS)
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I../../blender/python
-CPPFLAGS += -I../../blender/python/generic
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I../Rasterizer/RAS_OpenGLRasterizer
-CPPFLAGS += -I../Rasterizer -I../GameLogic -I../SceneGraph
-CPPFLAGS += -I../BlenderRoutines -I../Expressions -I../Ketsji
-CPPFLAGS += -I../../kernel/gen_system
-CPPFLAGS += -I.
-CPPFLAGS += -I../../blender/blenkernel
-CPPFLAGS += -I../../blender/blenlib
-CPPFLAGS += -I../../blender/editors/include
-CPPFLAGS += -I../../blender/makesdna
-CPPFLAGS += -I../../blender/imbuf
-CPPFLAGS += -I../../blender/gpu
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-ifeq ($(WITH_FFMPEG),true)
- CPPFLAGS += -DWITH_FFMPEG
- CPPFLAGS += $(NAN_FFMPEGCFLAGS)
- ifdef NAN_PTHREADS
- CPPFLAGS += -I$(NAN_PTHREADS)/include
- endif
-endif
-
-
diff --git a/source/gameengine/VideoTexture/PyTypeList.cpp b/source/gameengine/VideoTexture/PyTypeList.cpp
index 2d571675dbd..c374348da26 100644
--- a/source/gameengine/VideoTexture/PyTypeList.cpp
+++ b/source/gameengine/VideoTexture/PyTypeList.cpp
@@ -28,6 +28,14 @@ http://www.gnu.org/copyleft/lesser.txt.
#include <PyObjectPlus.h>
+/// destructor
+PyTypeList::~PyTypeList()
+{
+ // if list exists
+ if (m_list.get() != NULL)
+ for (PyTypeListType::iterator it = m_list->begin(); it != m_list->end(); ++it)
+ delete *it;
+}
/// check, if type is in list
bool PyTypeList::in (PyTypeObject * type)
diff --git a/source/gameengine/VideoTexture/PyTypeList.h b/source/gameengine/VideoTexture/PyTypeList.h
index 4daf88bfa19..8ca1e976de7 100644
--- a/source/gameengine/VideoTexture/PyTypeList.h
+++ b/source/gameengine/VideoTexture/PyTypeList.h
@@ -41,6 +41,9 @@ typedef std::vector<PyTypeListItem*> PyTypeListType;
class PyTypeList
{
public:
+ /// destructor
+ ~PyTypeList();
+
/// check, if type is in list
bool in (PyTypeObject * type);
diff --git a/source/gameengine/VideoTexture/SConscript b/source/gameengine/VideoTexture/SConscript
index 21a5f8ce3fe..2cd143d2deb 100644
--- a/source/gameengine/VideoTexture/SConscript
+++ b/source/gameengine/VideoTexture/SConscript
@@ -21,11 +21,10 @@ if env['OURPLATFORM'] in ('win32-vc', 'win64-vc','win32-mingw'):
if env['WITH_BF_PYTHON']:
incs += ' ' + env['BF_PYTHON_INC']
-else:
- defs.append('DISABLE_PYTHON')
+ defs.append('WITH_PYTHON')
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
incs += ' ' + env['BF_FFMPEG_INC'] + ' ' + env['BF_PTHREADS_INC']
-env.BlenderLib ( 'bf_videotex', sources, Split(incs), defs, libtype=['core','player'], priority=[340,205], cxx_compileflags=env['BGE_CXXFLAGS'])
+env.BlenderLib ( 'ge_videotex', sources, Split(incs), defs, libtype=['core','player'], priority=[340,205], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/VideoTexture/VideoBase.cpp b/source/gameengine/VideoTexture/VideoBase.cpp
index 5de7a9e80a9..bd620309926 100644
--- a/source/gameengine/VideoTexture/VideoBase.cpp
+++ b/source/gameengine/VideoTexture/VideoBase.cpp
@@ -82,6 +82,8 @@ void VideoBase::process (BYTE * sample)
// finish
break;
}
+ case None:
+ break; /* assert? */
}
}
}
@@ -145,7 +147,7 @@ PyObject * Video_getRange (PyImage * self, void * closure)
int Video_setRange (PyImage * self, PyObject * value, void * closure)
{
// check validity of parameter
- if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 2
+ if (value == NULL || !PySequence_Check(value) || PySequence_Size(value) != 2
|| !PyFloat_Check(PySequence_Fast_GET_ITEM(value, 0))
|| !PyFloat_Check(PySequence_Fast_GET_ITEM(value, 1)))
{
diff --git a/source/icons/Makefile b/source/icons/Makefile
deleted file mode 100644
index 5832a098592..00000000000
--- a/source/icons/Makefile
+++ /dev/null
@@ -1,36 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-DIR = $(OCGDIR)/blender/icons
-
-include nan_compile.mk
-
-clean::
- @$(RM) $(DIR)/*.res $(DIR)/debug/*.res
diff --git a/source/kernel/CMakeLists.txt b/source/kernel/CMakeLists.txt
index 66d14014587..bcf967cff12 100644
--- a/source/kernel/CMakeLists.txt
+++ b/source/kernel/CMakeLists.txt
@@ -24,7 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-SET(INC
+set(INC
gen_messaging
gen_system
../../intern/string
@@ -32,12 +32,17 @@ SET(INC
../../source/blender/blenloader
)
-FILE(GLOB SRC
+set(SRC
gen_messaging/intern/messaging.c
gen_system/GEN_HashedPtr.cpp
- gen_system/GEN_Matrix4x4.cpp
gen_system/SYS_SingletonSystem.cpp
gen_system/SYS_System.cpp
+
+ gen_messaging/GEN_messaging.h
+ gen_system/GEN_HashedPtr.h
+ gen_system/GEN_Map.h
+ gen_system/SYS_SingletonSystem.h
+ gen_system/SYS_System.h
)
-BLENDERLIB(bf_kernel "${SRC}" "${INC}")
+blender_add_lib(bf_gen_system "${SRC}" "${INC}")
diff --git a/source/kernel/Makefile b/source/kernel/Makefile
deleted file mode 100644
index aa0b3dd3bf1..00000000000
--- a/source/kernel/Makefile
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Make module object directory and bounce make to subdirectories.
-
-include nan_definitions.mk
-
-DIR = $(OCGDIR)/kernel
-SOURCEDIR = source/kernel
-DIRS = gen_system gen_messaging
-
-include nan_subdirs.mk
diff --git a/source/kernel/SConscript b/source/kernel/SConscript
index 3110f46cfad..8dd0fd36e8a 100644
--- a/source/kernel/SConscript
+++ b/source/kernel/SConscript
@@ -2,9 +2,9 @@
Import ('env')
sources = 'gen_messaging/intern/messaging.c gen_system/GEN_HashedPtr.cpp'
-sources += ' gen_system/GEN_Matrix4x4.cpp gen_system/SYS_SingletonSystem.cpp'
+sources += ' gen_system/SYS_SingletonSystem.cpp'
sources += ' gen_system/SYS_System.cpp'
incs = 'gen_messaging gen_system #/intern/string #/intern/moto/include #/source/blender/blenloader '
-env.BlenderLib ( 'bf_kernel', Split(sources), Split(incs), [], libtype = ['core','player'], priority = [400,100] )
+env.BlenderLib ( 'bf_gen_system', Split(sources), Split(incs), [], libtype = ['core','player'], priority = [400,100] )
diff --git a/source/kernel/gen_messaging/Makefile b/source/kernel/gen_messaging/Makefile
deleted file mode 100644
index a1d203bcf18..00000000000
--- a/source/kernel/gen_messaging/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/kernel/gen_messaging
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/kernel/gen_messaging/intern/Makefile b/source/kernel/gen_messaging/intern/Makefile
deleted file mode 100644
index 7b6b2169540..00000000000
--- a/source/kernel/gen_messaging/intern/Makefile
+++ /dev/null
@@ -1,40 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = gen_messaging
-DIR = $(OCGDIR)/kernel/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# path to our own external headerfiles
-CPPFLAGS += -I..
-
diff --git a/source/kernel/gen_system/GEN_DataCache.h b/source/kernel/gen_system/GEN_DataCache.h
deleted file mode 100644
index 96ceafc232d..00000000000
--- a/source/kernel/gen_system/GEN_DataCache.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-#ifndef __GEN_DATACACHE_H
-#define __GEN_DATACACHE_H
-
-#include "STR_HashedString.h"
-#include "GEN_Map.h"
-
-template <class T>
-class GEN_DataCache
-{
- GEN_Map<STR_HashedString,T*> m_dataCache;
- virtual T* LoadData(const STR_String& name)=0;
- virtual void FreeCacheObjects()=0;
-
-public:
- GEN_DataCache() {};
- virtual ~GEN_DataCache() {};
-
- T* GetData(const STR_String& paramname)
- {
- T* result=NULL;
-
- T** resultptr = m_dataCache[paramname];
- if (resultptr)
- {
- result = *resultptr;
- }
-
- else
- {
- result = LoadData(paramname);
- if (result)
- {
- m_dataCache.insert(paramname,result);
- }
- }
-
- return result;
- }
-
- virtual void ClearCache()
- {
- FreeCacheObjects();
- m_dataCache.clear();
- }
-};
-
-#endif //__GEN_DATACACHE_H
-
diff --git a/source/kernel/gen_system/GEN_Matrix4x4.cpp b/source/kernel/gen_system/GEN_Matrix4x4.cpp
deleted file mode 100644
index 72926ce9c39..00000000000
--- a/source/kernel/gen_system/GEN_Matrix4x4.cpp
+++ /dev/null
@@ -1,202 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include "GEN_Matrix4x4.h"
-
-GEN_Matrix4x4::GEN_Matrix4x4()
-{
- Identity();
-}
-
-
-
-GEN_Matrix4x4::GEN_Matrix4x4(const float value[4][4])
-{
- for (int i=0;i<4;i++)
- {
- for (int j=0;j<4;j++)
- m_V[i][j] = value[i][j];
- }
-}
-
-
-
-GEN_Matrix4x4::GEN_Matrix4x4(const double value[16])
-{
- for (int i=0;i<16;i++)
- m_Vflat[i] = value[i];
-}
-
-
-
-GEN_Matrix4x4::GEN_Matrix4x4(const GEN_Matrix4x4& other)
-{
- SetMatrix(other);
-}
-
-
-
-GEN_Matrix4x4::GEN_Matrix4x4(const MT_Point3& orig,
- const MT_Vector3& dir,
- const MT_Vector3 up)
-{
- MT_Vector3 z = -(dir.normalized());
- MT_Vector3 x = (up.cross(z)).normalized();
- MT_Vector3 y = (z.cross(x));
-
- m_V[0][0] = x.x();
- m_V[0][1] = y.x();
- m_V[0][2] = z.x();
- m_V[0][3] = 0.0f;
-
- m_V[1][0] = x.y();
- m_V[1][1] = y.y();
- m_V[1][2] = z.y();
- m_V[1][3] = 0.0f;
-
- m_V[2][0] = x.z();
- m_V[2][1] = y.z();
- m_V[2][2] = z.z();
- m_V[2][3] = 0.0f;
-
- m_V[3][0] = orig.x();//0.0f;
- m_V[3][1] = orig.y();//0.0f;
- m_V[3][2] = orig.z();//0.0f;
- m_V[3][3] = 1.0f;
-
- //Translate(-orig);
-}
-
-
-
-MT_Vector3 GEN_Matrix4x4::GetRight() const
-{
- return MT_Vector3(m_V[0][0], m_V[0][1], m_V[0][2]);
-}
-
-
-
-MT_Vector3 GEN_Matrix4x4::GetUp() const
-{
- return MT_Vector3(m_V[1][0], m_V[1][1], m_V[1][2]);
-}
-
-
-
-MT_Vector3 GEN_Matrix4x4::GetDir() const
-{
- return MT_Vector3(m_V[2][0], m_V[2][1], m_V[2][2]);
-}
-
-
-
-MT_Point3 GEN_Matrix4x4::GetPos() const
-{
- return MT_Point3(m_V[3][0], m_V[3][1], m_V[3][2]);
-}
-
-
-
-void GEN_Matrix4x4::Identity()
-{
- for (int i=0; i<4; i++)
- {
- for (int j=0; j<4; j++)
- m_V[i][j] = (i==j?1.0f:0.0f);
- }
-}
-
-
-
-void GEN_Matrix4x4::SetMatrix(const GEN_Matrix4x4& other)
-{
- for (int i=0; i<16; i++)
- m_Vflat[i] = other.m_Vflat[i];
-}
-
-
-
-double* GEN_Matrix4x4::getPointer()
-{
- return &m_V[0][0];
-}
-
-
-
-const double* GEN_Matrix4x4::getPointer() const
-{
- return &m_V[0][0];
-}
-
-
-
-void GEN_Matrix4x4::setElem(int pos,double newvalue)
-{
- m_Vflat[pos] = newvalue;
-}
-
-
-
-
-
-GEN_Matrix4x4 GEN_Matrix4x4::Perspective(MT_Scalar inLeft,
-MT_Scalar inRight,
-MT_Scalar inBottom,
-MT_Scalar inTop,
-MT_Scalar inNear,
-MT_Scalar inFar)
-{
-
- GEN_Matrix4x4 mat;
-
- // Column 0
- mat(0, 0) = -(2.0*inNear) / (inRight-inLeft);
- mat(1, 0) = 0;
- mat(2, 0) = 0;
- mat(3, 0) = 0;
-
- // Column 1
- mat(0, 1) = 0;
- mat(1, 1) = (2.0*inNear) / (inTop-inBottom);
- mat(2, 1) = 0;
- mat(3, 1) = 0;
-
- // Column 2
- mat(0, 2) = (inRight+inLeft) / (inRight-inLeft);
- mat(1, 2) = (inTop+inBottom) / (inTop-inBottom);
- mat(2, 2) = -(inFar+inNear) / (inFar-inNear);
- mat(3, 2) = -1;
-
- // Column 3
- mat(0, 3) = 0;
- mat(1, 3) = 0;
- mat(2, 3) = -(2.0*inFar*inNear) / (inFar-inNear);
- mat(3, 3) = 0;
-
- return mat;
-}
diff --git a/source/kernel/gen_system/GEN_Matrix4x4.h b/source/kernel/gen_system/GEN_Matrix4x4.h
deleted file mode 100644
index dede10fd459..00000000000
--- a/source/kernel/gen_system/GEN_Matrix4x4.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-#ifndef GEN_MATRIX4X4
-#define GEN_MATRIX4X4
-
-#include "MT_Point3.h"
-
-class GEN_Matrix4x4
-{
-public:
- // creators.
- GEN_Matrix4x4();
- GEN_Matrix4x4(const float value[4][4]);
- GEN_Matrix4x4(const double value[16]);
- GEN_Matrix4x4(const GEN_Matrix4x4 & other);
- GEN_Matrix4x4(const MT_Point3& orig,
- const MT_Vector3& dir,
- const MT_Vector3 up);
-
- void Identity();
- void SetMatrix(const GEN_Matrix4x4 & other);
- double* getPointer();
- const double* getPointer() const;
- void setElem(int pos,double newvalue);
-
-
- MT_Vector3 GetRight() const;
- MT_Vector3 GetUp() const;
- MT_Vector3 GetDir() const;
- MT_Point3 GetPos() const;
- void SetPos(const MT_Vector3 & v);
-
- double& operator () (int row,int col) { return m_V[col][row]; }
-
- static GEN_Matrix4x4 Perspective(MT_Scalar inLeft,
- MT_Scalar inRight,
- MT_Scalar inBottom,
- MT_Scalar inTop,
- MT_Scalar inNear,
- MT_Scalar inFar);
-protected:
- union
- {
- double m_V[4][4];
- double m_Vflat[16];
- };
-};
-
-#endif //GEN_MATRIX4X4
-
diff --git a/source/kernel/gen_system/GEN_SmartPtr.h b/source/kernel/gen_system/GEN_SmartPtr.h
deleted file mode 100644
index e1c378d6867..00000000000
--- a/source/kernel/gen_system/GEN_SmartPtr.h
+++ /dev/null
@@ -1,233 +0,0 @@
-#ifndef NAN_INCLUDED_GEN_SmartPtr_h
-#define NAN_INCLUDED_GEN_SmartPtr_h
-
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- *
- * @author Laurence
- */
-
-#include <stdlib.h> // for NULL !
-
-/**
- * @section GEN_SmartPtr
- * This class defines a smart pointer similar to that defined in
- * the Standard Template Library but without the painful get()
- * semantics to access the internal c style pointer.
- *
- * It is often useful to explicitely decalre ownership of memory
- * allocated on the heap within class or function scope. This
- * class helps you to encapsulate this ownership within a value
- * type. When an instance of this class goes out of scope it
- * makes sure that any memory associated with it's internal pointer
- * is deleted. It can help to inform users of an aggregate class
- * that it owns instances of it's members and these instances
- * should not be shared. This is not reliably enforcable in C++
- * but this class attempts to make the 1-1 relationship clear.
- *
- * @section Example usage
- *
- * class foo {
- * ...constructors accessors etc.
- * int x[1000];
- * }
- *
- * class bar {
- * public :
- * static
- * bar *
- * New(
- * ) {
- * GEN_SmartPtr<foo> afoo = new foo();
- * GEN_SmartPtr<bar> that = new bar();
- *
- * if (foo == NULL || that == NULL) return NULL;
- *
- * that->m_foo = afoo.Release();
- * return that.Release();
- * }
- *
- * ~bar() {
- * // smart ptr takes care of deletion
- * }
- * private :
- * GEN_SmartPtr<foo> m_foo;
- * }
- *
- * You my also safely construct vectors of GEN_SmartPtrs and
- * have the vector own stuff you put into it.
- *
- * e.g.
- * {
- * std::vector<GEN_SmartPtr<foo> > foo_vector;
- * foo_vector.push_back( new foo());
- * foo_vector.push_back( new foo());
- *
- * foo_vector[0]->bla();
- * } // foo_vector out of scope => heap memory freed for both foos
- *
- * @warning this class should only be used for objects created
- * on the heap via the new function. It will not behave correctly
- * if you pass ptrs to objects created with new[] nor with
- * objects declared on the stack. Doing this is likely to crash
- * the program or lead to memory leaks.
- */
-
-template
- < class T >
-class GEN_SmartPtr {
-
-public :
-
- /**
- * Construction from reference - this class
- * always assumes ownership from the rhs.
- */
-
- GEN_SmartPtr(
- const GEN_SmartPtr &rhs
- ){
- m_val = rhs.Release();
- }
-
- /**
- * Construction from ptr - this class always
- * assumes that it now owns the memory associated with the
- * ptr.
- */
-
- GEN_SmartPtr(
- T* val
- ) :
- m_val (val)
- {
- }
-
- /**
- * Defalut constructor
- */
-
- GEN_SmartPtr(
- ) :
- m_val (NULL)
- {
- }
-
- /**
- * Type conversion from this class to the type
- * of a pointer to the template parameter.
- * This means you can pass an instance of this class
- * to a function expecting a ptr of type T.
- */
-
- operator T * () const {
- return m_val;
- }
-
- /**
- * Return a reference to the internal ptr class.
- * Use with care when you now that the internal ptr
- * is not NULL!
- */
-
- T &
- Ref(
- ) const {
- return *m_val;
- }
-
- /**
- * Assignment operator - ownership is transfered from rhs to lhs.
- * There is an intenional side-effect of function of transferring
- * ownership from the const parameter rhs. This is to insure
- * the 1-1 relationship.
- * The object associated with this instance is deleted if it
- * is not the same as that contained in the rhs.
- */
-
- GEN_SmartPtr & operator=(
- const GEN_SmartPtr &rhs
- ) {
- if (this->m_val != rhs.m_val) {
- delete this->m_val;
- }
-
- this->m_val = rhs.Release();
- return *this;
- }
-
- /**
- * Overload the operator -> so that it's possible to access
- * all the normal methods of the internal ptr.
- */
-
- T * operator->() const {
- return m_val;
- }
-
- /**
- * Caller takes ownership of the object - the object will not
- * be deleted when the ptr goes out of scope.
- */
-
- T *
- Release(
- ) const {
- T* temp = m_val;
- (const_cast<GEN_SmartPtr *>(this))->m_val = NULL;
- return temp;
- }
-
- /**
- * Force destruction of the internal object.
- */
-
- void
- Delete(
- ) {
- delete (m_val);
- m_val = NULL;
- }
-
- /**
- * Destructor - deletes object if it exists
- */
-
- ~GEN_SmartPtr(
- ) {
- delete (m_val);
- }
-
-private :
-
- /// The ptr owned by this class.
- T * m_val;
-};
-
-#endif
-
diff --git a/source/kernel/gen_system/Makefile b/source/kernel/gen_system/Makefile
deleted file mode 100644
index 45f491cbeb4..00000000000
--- a/source/kernel/gen_system/Makefile
+++ /dev/null
@@ -1,41 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = gen_system
-DIR = $(OCGDIR)/kernel/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_2_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I../../../source/blender/blenloader
-
diff --git a/source/kernel/gen_system/SYS_SingletonSystem.cpp b/source/kernel/gen_system/SYS_SingletonSystem.cpp
index 0b5cfe7273a..52bd3d87470 100644
--- a/source/kernel/gen_system/SYS_SingletonSystem.cpp
+++ b/source/kernel/gen_system/SYS_SingletonSystem.cpp
@@ -29,7 +29,7 @@
* Used by SYS_System
*/
#include "SYS_SingletonSystem.h"
-#include "GEN_DataCache.h"
+// #include "GEN_DataCache.h"
SYS_SingletonSystem* SYS_SingletonSystem::_instance = 0;
diff --git a/source/kernel/gen_system/SYS_SingletonSystem.h b/source/kernel/gen_system/SYS_SingletonSystem.h
index 889838454e7..874f3fa9793 100644
--- a/source/kernel/gen_system/SYS_SingletonSystem.h
+++ b/source/kernel/gen_system/SYS_SingletonSystem.h
@@ -33,7 +33,6 @@
#include "GEN_Map.h"
#include "STR_HashedString.h"
-#include "GEN_DataCache.h"
class SYS_SingletonSystem
{